ZGlmZiAtLWdpdCBhLzEwMDBtcDEvUkVBRE1FLnR4dCBiLzEwMDBtcDEvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzk4ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMyBAQAorVGhlIE9wZW4gSlBBIHBvZGxpbmcgb2YgdGhlIEFwYWNoZSBpbmN1YmF0b3IKKworCmRpZmYgLS1naXQgYS8xMDAwbXAxL2JvYXJkLzIwMDctMDYudHh0IGIvMTAwMG1wMS9ib2FyZC8yMDA3LTA2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM3MDJmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9ib2FyZC8yMDA3LTA2LnR4dApAQCAtMCwwICsxLDI1IEBACisyMDA3LTA2IFN0YXR1cyBSZXBvcnQgZm9yIHRoZSBBcGFjaGUgT3BlbkpQQSBQcm9qZWN0CisKK0hpZ2hsaWdodHMKKworSW4gaXRzIGZpcnN0IG1vbnRoIGZvbGxvd2luZyBncmFkdWF0aW9uIGZyb20gdGhlIGluY3ViYXRvciwKK09wZW5KUEEgaGFzIGJlZ3VuIHdvcmsgb24gaXRzIGZpcnN0IG9mZmljaWFsIHJlbGVhc2UsIDEuMC4wLgorCitDb21tdW5pdHkKKworRW1haWwgdHJhZmZpYyBvbiB0aGUgbGlzdHMgY29udGludWVzIHRvIGdyb3cgYXMgbW9yZSBwZW9wbGUKK2Rpc2NvdmVyIHRoYXQgdGhlIEphdmEgRUUgNSBzcGVjaWZpY2F0aW9uIHJlYWxseSBkb2VzIGFsbG93CitwbHVnZ2FibGUgcGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb25zLgorCitHb3Zlcm5hbmNlCisKK1RoZSBUTFAgbWlncmF0aW9uIG9mIHRoZSBzdm4gcmVwb3NpdG9yeSwgbWFpbCBsaXN0cywgdW5peCAKK2FsaWFzZXMsIGFuZCBvcGVuanBhIHdlYiBzaXRlIGhhdmUgYmVlbiBjb21wbGV0ZWQuIFRoZSAKK2luY3ViYXRvciB3ZWIgc2l0ZSBoYXMgYmVlbiB1cGRhdGVkIHRvIGluZGljYXRlIHRoYXQgb3BlbmpwYQoraXMgbm8gbG9uZ2VyIGluIGluY3ViYXRpb24uCisKK1JlbGVhc2UgbmFtaW5nIHBvbGljeSBpcyBiZWluZyBkaXNjdXNzZWQgYW5kIHJlc29sdXRpb24gaXMgCitleHBlY3RlZCBwcmlvciB0byB0aGUgZmlyc3QgcmVsZWFzZSBhcyBhIFRMUC4KKworTWljaGFlbCBEaWNrIHdhcyBhZGRlZCB0byB0aGUgT3BlbkpQQSBQTUMuCisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1hbGwvcG9tLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1hbGwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U2ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWFsbC9wb20ueG1sCkBAIC0wLDAgKzEsMTU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMAorICAgICAgICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGFydGlmYWN0SWQ+b3BlbmpwYTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPk9wZW5KUEEgQWdncmVnYXRlIEphcjwvbmFtZT4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHNjbS5kaXI+c3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL29wZW5qcGEvdHJ1bmsvb3BlbmpwYS1hbGw8L3NjbS5kaXI+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPHNjbT4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vJHtzY20uZGlyfTwvY29ubmVjdGlvbj4KKyAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovLyR7c2NtLmRpcn08L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgICAgIDx1cmw+aHR0cHM6Ly8ke3NjbS5kaXJ9PC91cmw+CisgICAgPC9zY20+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgICAgIE1hbnVhbGx5IGJ1aWxkIGFuIGFnZ3JlZ2F0ZSBqYXIgb2YgYWxsIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICBvcGVuanBhLSogamFycyB1c2luZyBhbnQuIFdlIGNhbm5vdCB1c2UgdGhlIGFzc2VtYmx5CisgICAgICAgICAgICAgICAgICAgIHBsdWdpbiwgc2luY2UgaXQgZG9lc24ndCBwcm92aWRlIHN1cHBvcnQgZm9yIGFwcGVuZGluZworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBzYW1lLW5hbWVkIGZpbGVzIHRvIGVhY2ggb3RoZXIgKHdoaWNoIGlzCisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciBjb3JyZWN0bHkgYWdncmVnYXRpbmcgc2VydmljZXMgZmlsZXMpLgorICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YnVpbGQtc2luZ2xlLWphcjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVuamFyIG92ZXJ3cml0ZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS8uLiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi90YXJnZXQvb3BlbmpwYS0qLmphciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiovdGFyZ2V0L29wZW5qcGEtZXhhbXBsZXMtKi5qYXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bmphcj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIG1hbnVhbGx5IGNvbmNhdGluYXRlIHRoZSBzZXJ2aWNlcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBzbyB0aGV5IGFyZSBhZ2dyZWdhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFjcm9kZWYgbmFtZT0iYWdncmVnYXRlLWZpbGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZpY2VuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5CdWlsZGluZyBzZXJ2aWNlOiBAe3NlcnZpY2VuYW1lfTwvZWNobz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL01FVEEtSU5GL3NlcnZpY2VzL0B7c2VydmljZW5hbWV9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ly4uIiBpbmNsdWRlcz0iKi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvQHtzZXJ2aWNlbmFtZX0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmNhdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYWNyb2RlZj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWdncmVnYXRlLWZpbGUgc2VydmljZW5hbWU9Im9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWdncmVnYXRlLWZpbGUgc2VydmljZW5hbWU9ImphdmF4LnBlcnNpc3RlbmNlLnNwaS5QZXJzaXN0ZW5jZVByb3ZpZGVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZ2dyZWdhdGUtZmlsZSBzZXJ2aWNlbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25QYXJzZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgY3JlYXRlIGVuaGFuY2VyIHByZS1tYWluIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIGNvcGllZCBmcm9tIG9wZW5qcGEta2VybmVsLTUvcG9tLnhtbAorICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFByZW1haW4tQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRW5oYW5jZXJBZ2VudDwvUHJlbWFpbi1DbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEta2VybmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWtlcm5lbC01PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWpkYmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtamRiYy01PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBlcnNpc3RlbmNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEteG1sc3RvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3BvbS54bWwgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIwNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3BvbS54bWwKQEAgLTAsMCArMSwxMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtZXhhbXBsZXM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5PcGVuSlBBIFBlcnNpc3RlbmNlIEV4YW1wbGVzPC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj5PcGVuSlBBIFBlcnNpc3RlbmNlIEV4YW1wbGVzPC9kZXNjcmlwdGlvbj4KKyAgICA8dXJsPmh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9wcm9qZWN0cy9vcGVuanBhPC91cmw+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZGVyYnk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXJieTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEwLjIuMi4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kYmNwPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kYmNwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gc2tpcCByZXZlcnNlbWFwcGluZyBzaW5jZSBpdCBkZXBlbmRzIG9uCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQueG1sIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3JldmVyc2VtYXBwaW5nL01haW4uamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwhLS0gIyMjCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9ImNwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi50ZXN0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorCQkJCQkJCQk8dGFza2RlZiBuYW1lPSJvcGVuanBhYyIgY2xhc3NuYW1lPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5hbnQuUENFbmhhbmNlclRhc2siPgorCQkJCQkJCQkJPGNsYXNzcGF0aCByZWZpZD0iY3AiLz4KKwkJCQkJCQkJPC90YXNrZGVmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZW5oYW5jZS5wYXRoLnJlZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2xhc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorCQkJCQkJCQk8b3BlbmpwYWM+CisJCQkJCQkJCQk8Y2xhc3NwYXRoIHJlZmlkPSJjcCIvPgorCQkJCQkJCQkJPGZpbGVzZXQgcmVmaWQ9ImVuaGFuY2UucGF0aC5yZWYiLz4KKwkJCQkJCQkJPC9vcGVuanBhYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgLS0+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTNmYjAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8cGVyc2lzdGVuY2UgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgdmVyc2lvbj0iMS4wIj4KKworICAgIDwhLS0KKyAgICAgICAgV2UgbmVlZCB0byBlbnVtZXJhdGUgZWFjaCBwZXJzaXN0ZW50IGNsYXNzIGZpcnN0IGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKKyAgICAgICAgU2VlOiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS03OAorICAgIC0tPgorICAgIDxwZXJzaXN0ZW5jZS11bml0IG5hbWU9Im5vbmUiIHRyYW5zYWN0aW9uLXR5cGU9IlJFU09VUkNFX0xPQ0FMIj4KKyAgICAgICAgPG1hcHBpbmctZmlsZT5yZXZlcnNlbWFwcGluZy9vcm0ueG1sPC9tYXBwaW5nLWZpbGU+CisgICAgICAgIDxjbGFzcz5oZWxsb2pwYS5NZXNzYWdlPC9jbGFzcz4KKyAgICAgICAgPGNsYXNzPnJlbGF0aW9ucy5EZWl0eTwvY2xhc3M+CisgICAgPC9wZXJzaXN0ZW5jZS11bml0PgorCisgICAgPCEtLQorICAgICAgICBBIHBlcnNpc3RlbmNlIHVuaXQgaXMgYSBzZXQgb2YgbGlzdGVkIHBlcnNpc3RlbnQgZW50aXRpZXMgYXMgd2VsbAorICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBvZiBhbiBFbnRpdHlNYW5hZ2VyRmFjdG9yeS4gV2UgY29uZmlndXJlIGVhY2gKKyAgICAgICAgZXhhbXBsZSBpbiBhIHNlcGFyYXRlIHBlcnNpc3RlbmNlLXVuaXQuCisgICAgLS0+CisgICAgPHBlcnNpc3RlbmNlLXVuaXQgbmFtZT0iaGVsbG9qcGEiIHRyYW5zYWN0aW9uLXR5cGU9IlJFU09VUkNFX0xPQ0FMIj4KKyAgICAgICAgPCEtLQorICAgICAgICAgICAgVGhlIGRlZmF1bHQgcHJvdmlkZXIgY2FuIGJlIE9wZW5KUEEsIG9yIHNvbWUgb3RoZXIgcHJvZHVjdC4KKyAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBpZiBPcGVuSlBBIGlzIHRoZSBvbmx5IEpQQSBwcm92aWRlcgorICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgY2xhc3Nsb2FkaW5nIGVudmlyb25tZW50LCBidXQgY2FuIGJlIHNwZWNpZmllZAorICAgICAgICAgICAgaW4gY2FzZXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIEpQQSBpbXBsZW1lbnRhdGlvbnMgYXZhaWxhYmxlLgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8cHJvdmlkZXI+CisgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQcm92aWRlckltcGwKKyAgICAgICAgPC9wcm92aWRlcj4KKyAgICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBXZSBtdXN0IGVudW1lcmF0ZSBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCAtLT4KKyAgICAgICAgPGNsYXNzPmhlbGxvanBhLk1lc3NhZ2U8L2NsYXNzPgorCisgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIFdlIGNhbiBjb25maWd1cmUgdGhlIGRlZmF1bHQgT3BlbkpQQSBwcm9wZXJ0aWVzIGhlcmUuIFRoZXkKKyAgICAgICAgICAgICAgICBoYXBwZW4gdG8gYmUgY29tbWVudGVkIG91dCBoZXJlIHNpbmNlIHRoZSBwcm92aWRlZCBleGFtcGxlcworICAgICAgICAgICAgICAgIGFsbCBzcGVjaWZ5IHRoZSB2YWx1ZXMgdmlhIFN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgLS0+CisKKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb25VUkwiIAorICAgICAgICAgICAgICAgIHZhbHVlPSJqZGJjOmRlcmJ5Om9wZW5qcGEtZGF0YWJhc2U7Y3JlYXRlPXRydWUiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lIiAKKyAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiIAorICAgICAgICAgICAgICAgIHZhbHVlPSJ1c2VyIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQiIAorICAgICAgICAgICAgICAgIHZhbHVlPSJzZWNyZXQiLz4KKyAgICAgICAgICAgIC0tPgorICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9wZXJzaXN0ZW5jZS11bml0PgorCisgICAgPCEtLSBwZXJzaXN0ZW5jZSB1bml0IGZvciB0aGUgInJlbGF0aW9ucyIgZXhhbXBsZSAtLT4KKyAgICA8cGVyc2lzdGVuY2UtdW5pdCBuYW1lPSJyZWxhdGlvbnMiIHRyYW5zYWN0aW9uLXR5cGU9IlJFU09VUkNFX0xPQ0FMIj4KKyAgICAgICAgPGNsYXNzPnJlbGF0aW9ucy5EZWl0eTwvY2xhc3M+CisgICAgPC9wZXJzaXN0ZW5jZS11bml0PgorCisgICAgPCEtLSBwZXJzaXN0ZW5jZSB1bml0IGZvciB0aGUgInJldmVyc2VtYXBwaW5nIiBleGFtcGxlIC0tPgorICAgIDxwZXJzaXN0ZW5jZS11bml0IG5hbWU9InJldmVyc2VtYXBwaW5nIiB0cmFuc2FjdGlvbi10eXBlPSJSRVNPVVJDRV9MT0NBTCI+CisgICAgICAgIDxtYXBwaW5nLWZpbGU+cmV2ZXJzZW1hcHBpbmcvb3JtLnhtbDwvbWFwcGluZy1maWxlPgorICAgIDwvcGVyc2lzdGVuY2UtdW5pdD4KKzwvcGVyc2lzdGVuY2U+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9idWlsZC54bWwgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkNzQ4ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2J1aWxkLnhtbApAQCAtMCwwICsxLDEyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJ1c2FnZXdhcm5pbmciPgorCisgICAgPHByb3BlcnR5IG5hbWU9InBhcmVudCIgdmFsdWU9IiR7YmFzZWRpcn0vLi4iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icm9vdCIgdmFsdWU9IiR7cGFyZW50fS8uLiIvPgorCisgICAgPCEtLSBkYXRhYmFzZSBjb25uZWN0aW9uIHByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImRiZHJpdmVyIiB2YWx1ZT0ib3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRidXJsIgorICAgICAgICB2YWx1ZT0iamRiYzpkZXJieToke2Jhc2VkaXJ9LyR7ZXhhbXBsZX0tZGF0YWJhc2U7Y3JlYXRlPXRydWUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGJ1c2VyIiB2YWx1ZT0iIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRicGFzcyIgdmFsdWU9IiIvPgorCisKKyAgICA8dGFyZ2V0IG5hbWU9InVzYWdld2FybmluZyI+CisgICAgICAgIDxmYWlsPgorUGxlYXNlIHRyYXZlcnNlIHRvIGEgc3ViLWRpcmVjdG9yeSBhbmQgcnVuICJhbnQiIGZyb20gdGhlcmUuCisgICAgICAgIDwvZmFpbD4KKyAgICA8L3RhcmdldD4KKworICAgIDxwYXRoIGlkPSJjbGFzc3BhdGgiCisgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY2xhc3NwYXRoIHRvIHVzZSBmb3IgY29tcGlsaW5nIGFuZCBydW5uaW5nIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7cGFyZW50fSIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdH0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgIDwvcGF0aD4KKworICAgIDxwYXRoIGlkPSJqYXZhYWdlbnQiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdH0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3BlbmpwYS0qLmphciIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9wYXRoPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iamF2YWFnZW50IiByZWZpZD0iamF2YWFnZW50Ii8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJwcmUtY2xlYW4iCisgICAgICAgIGRlc2NyaXB0aW9uPSJDbGVhbiB1cCBjb21waWxlZCBmaWxlcyBhbmQgZ2VuZXJhdGVkIGRhdGFiYXNlIGZpbGVzIj4KKyAgICAgICAgPGRlbGV0ZSBpbmNsdWRlZW1wdHlkaXJzPSJ5ZXMiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmNsYXNzIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5sb2ciLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2V4YW1wbGV9LWRhdGFiYXNlLyoqLyoiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2V4YW1wbGV9LWRhdGFiYXNlIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvZGVsZXRlPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSB0aGlzIHRhcmdldCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3ViLWJ1aWxkIC0tPgorICAgIDx0YXJnZXQgbmFtZT0icHJlLWNsZWFuIiBkZXNjcmlwdGlvbj0iUHJlLWNsZWFuIHBoYXNlIj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0icHJlLWNvbXBpbGUiCisgICAgICAgIGRlc2NyaXB0aW9uPSJDb21waWxlIHRoZSBleGFtcGxlIGphdmEgZmlsZXMiPgorICAgICAgICA8amF2YWMgc3JjZGlyPSIke3BhcmVudH0iIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIgorICAgICAgICAgICAgZGVidWc9InllcyIgaW5jbHVkZXM9IiR7ZXhhbXBsZX0vKiouamF2YSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSB0aGlzIHRhcmdldCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3ViLWJ1aWxkIC0tPgorICAgIDx0YXJnZXQgbmFtZT0icHJlLWNvbXBpbGUiIGRlc2NyaXB0aW9uPSJQcmUtY29tcGlsYXRpb24gcGhhc2UiPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImNvbXBpbGUiCisgICAgICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGV4YW1wbGUgTWFpbiBwcm9ncmFtIj4KKworICAgICAgICA8amF2YSBjbGFzc25hbWU9IiR7ZXhhbXBsZX0uTWFpbiIgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIGZvcms9InllcyIKKyAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ5ZXMiPgorICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgdGhlIG9wZW5qcGEgamFyIGFzIHRoZSBqYXZhYWdlbnQgYXJndW1lbnQgaXMKKyAgICAgICAgICAgICAgICBuZWNlc3NhcnkgaW4gb3JkZXIgZm9yIGF1dG9tYXRpYyBjbGFzcy1lbmhhbmNlbWVudCB0byB3b3JrLgorICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItamF2YWFnZW50OiR7amF2YWFnZW50fSIvPgorCisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgU3BlY2lmeSB0aGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gdXNlIHdoZW4gY29uZmlndXJpbmcKKyAgICAgICAgICAgICAgICBPcGVuSlBBLiBOb3RlIHRoYXQgdGhlc2Ugd2lsbCBvbmx5IGJlIHVzZWQgYmVjdWFzZSBpbiB0aGUKKyAgICAgICAgICAgICAgICBleGFtcGxlcywgdGhlIGNhbGwgdG8gIlBlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlzIHBhc3NlZCAiU3lzdGVtLmdldFByb3BlcnRpZXMoKSIuCisgICAgICAgICAgICAtLT4KKworICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc3RhbmQtYWxvbmUgRGVyYnkgZGF0YWJhc2UgKHByb3ZpZGVkKS4KKyAgICAgICAgICAgICAgICBUaGlzIGNhbiBlYXNpbHkgYmUgY2hhbmdlcyB0byB1c2UgeW91ciBvd24gZGF0YWJhc2UncyBkcml2ZXIsCisgICAgICAgICAgICAgICAgcHJvdmlkZWQgeW91IGVuc3VyZSBpdCBpcyBhY2Nlc3NpYmxlIGluIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Im9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUiCisgICAgICAgICAgICAgICAgdmFsdWU9IiR7ZGJkcml2ZXJ9Ii8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJvcGVuanBhLkNvbm5lY3Rpb25VUkwiIHZhbHVlPSIke2RidXJsfSIvPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiIHZhbHVlPSIke2RidXNlcn0iLz4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Im9wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkIiB2YWx1ZT0iJHtkYnBhc3N9Ii8+CisKKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICBUZWxsIE9wZW5KUEEgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgdGFibGVzIGluIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIGZvciBlbnRpdGllcy4gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4KKyAgICAgICAgICAgICAgICBydW5uaW5nIGFnYWluc3QgYSBwcm9kdWN0aW9uIGRhdGFiYXNlLCBzaW5jZSB5b3UgcHJvYmFibHkKKyAgICAgICAgICAgICAgICBkb24ndCB3YW50IHRvIGJlIGFsdGVyaW5nIHRoZSBzY2hlbWEgYXQgcnVudGltZS4KKyAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0ib3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3MiCisgICAgICAgICAgICAgICAgdmFsdWU9ImJ1aWxkU2NoZW1hIi8+CisKKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICBPdXRwdXQgYWxsIHRoZSBTUUwgZm9yIGVkdWNhdGlvbmFsIHB1cnBvc2VzLCBidXQgc2V0IHRoZQorICAgICAgICAgICAgICAgIGdlbmVyYWwgbG9nZ2luZyBsZXZlbCB0byBvbmx5IHNob3cgd2FybmluZ3MuCisgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Im9wZW5qcGEuTG9nIgorICAgICAgICAgICAgICAgIHZhbHVlPSJEZWZhdWx0TGV2ZWw9V0FSTixTUUw9VFJBQ0UiLz4KKyAgICAgICAgPC9qYXZhPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9oZWxsb2pwYS9NYWluLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9oZWxsb2pwYS9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzZjY4NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2hlbGxvanBhL01haW4uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIGhlbGxvanBhOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKKworCisvKiogCisgKiBBIHZlcnkgc2ltcGxlLCBzdGFuZC1hbG9uZSBwcm9ncmFtIHRoYXQgc3RvcmVzIGEgbmV3IGVudGl0eSBpbiB0aGUKKyAqIGRhdGFiYXNlIGFuZCB0aGVuIHBlcmZvcm1zIGEgcXVlcnkgdG8gcmV0cmlldmUgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEVudGl0eU1hbmFnZXJGYWN0b3J5IHVzaW5nIHRoZSBTeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgICAgLy8gVGhlICJoZWxsb2pwYSIgbmFtZSB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIGJhc2VkIG9uIHRoZQorICAgICAgICAvLyBjb3JyZXNwb25kaW5nIG5hbWUgaW4gdGhlIE1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCBmaWxlCisgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkgPSBQZXJzaXN0ZW5jZS4KKyAgICAgICAgICAgIGNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KCJoZWxsb2pwYSIsIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHlNYW5hZ2VyIGZyb20gdGhlIEVudGl0eU1hbmFnZXJGYWN0b3J5LiBUaGUKKyAgICAgICAgLy8gRW50aXR5TWFuYWdlciBpcyB0aGUgbWFpbiBvYmplY3QgaW4gdGhlIHBlcnNpc3RlbmNlIEFQSSwgYW5kIGlzCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlLCBkZWxldGUsIGFuZCBxdWVyeSBvYmplY3RzLCBhcyB3ZWxsIGFzIGFjY2VzcworICAgICAgICAvLyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gQmVnaW4gYSBuZXcgbG9jYWwgdHJhbnNhY3Rpb24gc28gdGhhdCB3ZSBjYW4gcGVyc2lzdCBhIG5ldyBlbnRpdHkKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgcGVyc2lzdCBhIG5ldyBNZXNzYWdlIGVudGl0eQorICAgICAgICBlbS5wZXJzaXN0KG5ldyBNZXNzYWdlKCJIZWxsbyBQZXJzaXN0ZW5jZSEiKSk7CisKKyAgICAgICAgLy8gQ29tbWl0IHRoZSB0cmFuc2FjdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgZW50aXR5IHRvCisgICAgICAgIC8vIGJlIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKworICAgICAgICAvLyBJdCBpcyBhbHdheXMgZ29vZCBwcmFjdGljZSB0byBjbG9zZSB0aGUgRW50aXR5TWFuYWdlciBzbyB0aGF0CisgICAgICAgIC8vIHJlc291cmNlcyBhcmUgY29uc2VydmVkLgorICAgICAgICBlbS5jbG9zZSgpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGZyZXNoLCBuZXcgRW50aXR5TWFuYWdlcgorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtMiA9IGZhY3RvcnkuY3JlYXRlRW50aXR5TWFuYWdlcigpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSBzaW1wbGUgcXVlcnkgZm9yIGFsbCB0aGUgTWVzc2FnZSBlbnRpdGllcworICAgICAgICBRdWVyeSBxID0gZW0yLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgbSBmcm9tIE1lc3NhZ2UgbSIpOworCisgICAgICAgIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZW50aXRpZXMgYW5kIHByaW50IG91dCBlYWNoIG9mIHRoZWlyCisgICAgICAgIC8vIG1lc3NhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBkYXRlIG9uIHdoaWNoIGl0IHdhcyBjcmVhdGVkIAorICAgICAgICBmb3IgKE1lc3NhZ2UgbSA6IChMaXN0PE1lc3NhZ2U+KXEuZ2V0UmVzdWx0TGlzdCgpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICArICIgKGNyZWF0ZWQgb246ICIgKyBtLmdldENyZWF0ZWQoKSArICIpIik7IAorICAgICAgICB9CisKKyAgICAgICAgLy8gQWdhaW4sIGl0IGlzIGFsd2F5cyBnb29kIHRvIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcworICAgICAgICBlbTIuY2xvc2UoKTsKKyAgICAgICAgZmFjdG9yeS5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2hlbGxvanBhL01lc3NhZ2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2hlbGxvanBhL01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGEwODRkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvaGVsbG9qcGEvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2UgaGVsbG9qcGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworCisKKy8qKiAKKyAqIEEgdmVyeSBzaW1wbGUgcGVyc2lzdGVudCBlbnRpdHkgdGhhdCBob2xkcyBhICJtZXNzYWdlIiwgaGFzIGEKKyAqICJjcmVhdGVkIiBmaWVsZCB0aGF0IGlzIGluaXRpYWxpemVkIHRvIHRoZSB0aW1lIGF0IHdoaWNoIHRoZQorICogb2JqZWN0IHdhcyBjcmVhdGVkLCBhbmQgYW4gaWQgZmllbGQgdGhhdCBpcyBpbml0aWFsaXplZCB0byB0aGUKKyAqIGN1cnJlbnQgdGltZS4KKyAqLworQEVudGl0eQorcHVibGljIGNsYXNzIE1lc3NhZ2UgeworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgRGF0ZSBjcmVhdGVkID0gbmV3IERhdGUoKTsKKworICAgIHB1YmxpYyBNZXNzYWdlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlKFN0cmluZyBtc2cpIHsKKyAgICAgICAgbWVzc2FnZSA9IG1zZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIHZhbCkgeworICAgICAgICBpZCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1zZykgeworICAgICAgICBtZXNzYWdlID0gbXNnOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlZChEYXRlIGRhdGUpIHsKKyAgICAgICAgY3JlYXRlZCA9IGRhdGU7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0Q3JlYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvaGVsbG9qcGEvYnVpbGQueG1sIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvaGVsbG9qcGEvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2Y2NGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9oZWxsb2pwYS9idWlsZC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8cHJvamVjdCBuYW1lPSJoZWxsb2pwYSIgZGVmYXVsdD0icnVuIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXhhbXBsZSIgdmFsdWU9ImhlbGxvanBhIi8+CisgICAgPGltcG9ydCBmaWxlPSIuLi9idWlsZC54bWwiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JlbGF0aW9ucy9EZWl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmVsYXRpb25zL0RlaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExOGU0NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JlbGF0aW9ucy9EZWl0eS5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIHJlbGF0aW9uczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnVtVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcmllczsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7CisKKworLyoqIAorICogQW4gZW50aXR5IHRoYXQgY29udGFpbnMgcmVsYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZmFtaWx5IHRyZWUgcmVsYXRpb25zLgorICogVGhpcyBlbnRpdHkgZGVtb25zdHJhdGVzIHRoZSBmb2xsb3dpbmcgSlBBIGZlYXR1cmVzOgorICoKKyAqIDEuIEVudW0gZmllbGRzIChnZW5kZXIpCisgKiAyLiBAT25lVG9PbmUgcmVsYXRpb25zCisgKiAzLiBAT25lVG9NYW55IHJlbGF0aW9ucworICogNC4gTmFtZWQgcXVlcmllcworICovCitARW50aXR5CitATmFtZWRRdWVyaWVzKHsKKworICAgIC8vIGEgc2libGluZyBzaGFyZXMgYSBtb3RoZXIgYW5kIGEgZmF0aGVyCisgICAgQE5hbWVkUXVlcnkobmFtZT0ic2libGluZ3MiLCBxdWVyeT0ic2VsZWN0IGRpc3RpbmN0IHNpYmxpbmcxICIKKyAgICAgICAgKyAiZnJvbSBEZWl0eSBzaWJsaW5nMSwgRGVpdHkgc2libGluZzIgd2hlcmUgIgorICAgICAgICArICJzaWJsaW5nMS5mYXRoZXIgPSBzaWJsaW5nMi5mYXRoZXIgIgorICAgICAgICArICJhbmQgc2libGluZzEubW90aGVyID0gc2libGluZzIubW90aGVyICIKKyAgICAgICAgKyAiYW5kIHNpYmxpbmcyID0gPzEgYW5kIHNpYmxpbmcxIDw+ID8xIiksCisKKyAgICAvLyBhIGhhbGYtc2lsaW5nIHNoYXJlcyBhIG1vdGhlciBvciBhIGZhdGhlciwgYnV0IG5vdCBib3RoCisgICAgQE5hbWVkUXVlcnkobmFtZT0iaGFsZi1zaWJsaW5ncyIsIHF1ZXJ5PSJzZWxlY3QgZGlzdGluY3Qgc2libGluZzEgIgorICAgICAgICArICJmcm9tIERlaXR5IHNpYmxpbmcxLCBEZWl0eSBzaWJsaW5nMiB3aGVyZSAiCisgICAgICAgICsgIigoc2libGluZzEuZmF0aGVyID0gc2libGluZzIuZmF0aGVyICIKKyAgICAgICAgKyAiYW5kIHNpYmxpbmcxLm1vdGhlciA8PiBzaWJsaW5nMi5tb3RoZXIpICIKKyAgICAgICAgKyAib3IgKHNpYmxpbmcxLmZhdGhlciA8PiBzaWJsaW5nMi5mYXRoZXIgIgorICAgICAgICArICJhbmQgc2libGluZzEubW90aGVyID0gc2libGluZzIubW90aGVyKSkgIgorICAgICAgICArICJhbmQgc2libGluZzIgPSA/MSBhbmQgc2libGluZzEgPD4gPzEiKSwKKworICAgIC8vIGEgY291c2luIHNoYXJlcyBhIGdyYW5kcGFyZW50LCBidXQgaXMgbm90IGEgc2libGluZworICAgIEBOYW1lZFF1ZXJ5KG5hbWU9ImNvdXNpbnMiLCBxdWVyeT0ic2VsZWN0IGRpc3RpbmN0IGNvdXNpbjEgIgorICAgICAgICArICJmcm9tIERlaXR5IGNvdXNpbjEsIERlaXR5IGNvdXNpbjIgd2hlcmUgIgorICAgICAgICArICIoIgorICAgICAgICAgICAgKyAiY291c2luMS5mYXRoZXIuZmF0aGVyID0gY291c2luMi5mYXRoZXIuZmF0aGVyICIKKyAgICAgICAgICAgICsgIm9yIGNvdXNpbjEuZmF0aGVyLm1vdGhlciA9IGNvdXNpbjIuZmF0aGVyLm1vdGhlciAiCisgICAgICAgICAgICArICJvciBjb3VzaW4xLm1vdGhlci5mYXRoZXIgPSBjb3VzaW4yLm1vdGhlci5mYXRoZXIgIgorICAgICAgICAgICAgKyAib3IgY291c2luMS5tb3RoZXIubW90aGVyID0gY291c2luMi5tb3RoZXIubW90aGVyKSAiCisgICAgICAgICsgImFuZCAoY291c2luMS5mYXRoZXIgPD4gY291c2luMi5mYXRoZXIpICIKKyAgICAgICAgKyAiYW5kIChjb3VzaW4xLm1vdGhlciA8PiBjb3VzaW4yLm1vdGhlcikgIgorICAgICAgICArICJhbmQgY291c2luMiA9ID8xIGFuZCBjb3VzaW4xIDw+ID8xIikKKyAgICB9KQorcHVibGljIGNsYXNzIERlaXR5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAvLyB0aGUgSWQgaXMgdGhlIG5hbWUsIHdoaWNoIGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhLCBidXQgd2UgYXJlCisgICAgLy8gY29uZmlkZW50IHRoYXQgZGlldHkgbmFtZXMgd2lsbCBiZSB1bmlxdWUKKyAgICBASWQKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQEJhc2ljIEBFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKKyAgICBwcml2YXRlIEdlbmRlciBnZW5kZXI7CisKKyAgICBAT25lVG9PbmUoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpCisgICAgcHJpdmF0ZSBEZWl0eSBtb3RoZXI7CisKKyAgICBAT25lVG9PbmUoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpCisgICAgcHJpdmF0ZSBEZWl0eSBmYXRoZXI7CisKKyAgICBAT25lVG9NYW55KGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMKQorICAgIHByaXZhdGUgU2V0PERlaXR5PiBjaGlsZHJlbjsKKworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBHZW5kZXIgeyBNQUxFLCBGRU1BTEUgfQorCisKKyAgICBwdWJsaWMgRGVpdHkoU3RyaW5nIG5hbWUsIEdlbmRlciBnZW5kZXIpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5nZW5kZXIgPSBnZW5kZXI7CisgICAgfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEJ1c2luZXNzIG1ldGhvZHMgZm9sbG93CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKiAKKyAgICAgKiBTaGUncyBoYXZpbmcgYSBiYWJ5Li4uIAorICAgICAqICAKKyAgICAgKiBAcGFyYW0gIGNoaWxkTmFtZSAgdGhlIGJhYnkgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjaGlsZAorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBlcnNvbiBpcyBub3QgYSB3b21hbiwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgcGVyc29uIGlzIHVubWFycmllZCAoaWxsZWdpdGltYXRlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gYXJlIG5vdCB5ZXQgc3VwcG9ydGVkKQorICAgICAqLworICAgIHB1YmxpYyBEZWl0eSBnaXZlQmlydGgoU3RyaW5nIGNoaWxkTmFtZSwgRGVpdHkgY2hpbGRGYXRoZXIsIEdlbmRlciBnZW5kZXIpIHsKKyAgICAgICAgaWYgKHRoaXMuZ2VuZGVyICE9IEdlbmRlci5GRU1BTEUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmx5IHdvbWVuIGNhbiBoYXZlIGNoaWxkcmVuISIpOworCisgICAgICAgIGlmIChjaGlsZE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNoaWxkIG5hbWUhIik7CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBjaGlsZAorICAgICAgICBEZWl0eSBjaGlsZCA9IG5ldyBEZWl0eShjaGlsZE5hbWUsIGdlbmRlcik7CisKKyAgICAgICAgLy8gc2V0IHRoZSBwYXJlbnRzIGluIHRoZSBjaGlsZHJlbi4uLgorICAgICAgICBjaGlsZC5tb3RoZXIgPSB0aGlzOworCisgICAgICAgIC8vIGFkZCB0aGUgY2hpbGQgdG8gdGhpcyBtZW1iZXIncyBjaGlsZHJlbgorICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEhhc2hTZXQ8RGVpdHk+KCk7CisgICAgICAgIGNoaWxkcmVuLmFkZChjaGlsZCk7CisKKyAgICAgICAgaWYgKGNoaWxkRmF0aGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoaWxkLmZhdGhlciA9IGNoaWxkRmF0aGVyOworICAgICAgICAgICAgaWYgKGNoaWxkRmF0aGVyLmNoaWxkcmVuID09IG51bGwpCisgICAgICAgICAgICAgICAgY2hpbGRGYXRoZXIuY2hpbGRyZW4gPSBuZXcgSGFzaFNldDxEZWl0eT4oKTsKKyAgICAgICAgICAgIGNoaWxkRmF0aGVyLmNoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvbGxvdworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0R2VuZGVyKEdlbmRlciBnZW5kZXIpIHsKKyAgICAgICAgdGhpcy5nZW5kZXIgPSBnZW5kZXI7CisgICAgfQorCisgICAgcHVibGljIEdlbmRlciBnZXRHZW5kZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdlbmRlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE1vdGhlcihEZWl0eSBtb3RoZXIpIHsKKyAgICAgICAgdGhpcy5tb3RoZXIgPSBtb3RoZXI7CisgICAgfQorCisgICAgcHVibGljIERlaXR5IGdldE1vdGhlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW90aGVyOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0RmF0aGVyKERlaXR5IGZhdGhlcikgeworICAgICAgICB0aGlzLmZhdGhlciA9IGZhdGhlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVpdHkgZ2V0RmF0aGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mYXRoZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihTZXQ8RGVpdHk+IGNoaWxkcmVuKSB7CisgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PERlaXR5PiBnZXRDaGlsZHJlbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW47CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JlbGF0aW9ucy9NYWluLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZWxhdGlvbnMvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGY4MWMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZWxhdGlvbnMvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIHJlbGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CisKKy8vIGltcG9ydCB0aGUgZW51bXMgZm9yIE1BTEUgYW5kIEZFTUFMRQoraW1wb3J0IHN0YXRpYyByZWxhdGlvbnMuRGVpdHkuR2VuZGVyLio7CisKKworLyoqIAorICogQSB2ZXJ5IHNpbXBsZSwgc3RhbmQtYWxvbmUgcHJvZ3JhbSB0aGF0IHN0b3JlcyBhIG5ldyBlbnRpdHkgaW4gdGhlCisgKiBkYXRhYmFzZSBhbmQgdGhlbiBwZXJmb3JtcyBhIHF1ZXJ5IHRvIHJldHJpZXZlIGl0LgorICovCitwdWJsaWMgY2xhc3MgTWFpbiB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSB1c2luZyB0aGUgU3lzdGVtIHByb3BlcnRpZXMuCisgICAgICAgIC8vIFRoZSAicmVsYXRpb25zIiBuYW1lIHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgYmFzZWQgb24gdGhlCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgbmFtZSBpbiB0aGUgTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIGZpbGUKKyAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnkgZmFjdG9yeSA9IFBlcnNpc3RlbmNlLgorICAgICAgICAgICAgY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkoInJlbGF0aW9ucyIsIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHlNYW5hZ2VyIGZyb20gdGhlIEVudGl0eU1hbmFnZXJGYWN0b3J5LiBUaGUKKyAgICAgICAgLy8gRW50aXR5TWFuYWdlciBpcyB0aGUgbWFpbiBvYmplY3QgaW4gdGhlIHBlcnNpc3RlbmNlIEFQSSwgYW5kIGlzCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlLCBkZWxldGUsIGFuZCBxdWVyeSBvYmplY3RzLCBhcyB3ZWxsIGFzIGFjY2VzcworICAgICAgICAvLyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgaW5pdEZhbWlseVRyZWUoZW0pOworCisgICAgICAgIHJ1blF1ZXJpZXMoZW0pOworCisgICAgICAgIC8vIEl0IGlzIGFsd2F5cyBnb29kIHRvIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcworICAgICAgICBlbS5jbG9zZSgpOworICAgICAgICBmYWN0b3J5LmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENyZWF0ZXMgYSBwYXJ0aWFsIGZhbWlseSB0cmVlIG9mIHRoZSBHcmVlayBkaWV0aWVzLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gIGVtICB0aGUgRW50aXR5TWFuYWdlciB0byB1c2UgaW4gdGhlIHBlcnNpc3RlbmNlIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEZhbWlseVRyZWUoRW50aXR5TWFuYWdlciBlbSkgeworCisgICAgICAgIC8vIEZpcnN0IGRlbGV0ZSBhbGwgdGhlIG1lbWJlcnMgZnJvbSB0aGUgZGF0YWJhc2UgdGhlIGNsZWFuIHVwCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0uY3JlYXRlUXVlcnkoImRlbGV0ZSBmcm9tIERlaXR5IikuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworCisgICAgICAgIC8vIEdlbmVyYXRpb24gMQorICAgICAgICBEZWl0eSB1cmFudXMgPSBuZXcgRGVpdHkoIlVyYW51cyIsIE1BTEUpOworICAgICAgICBEZWl0eSBnYWVhID0gbmV3IERlaXR5KCJHYWVhIiwgRkVNQUxFKTsKKworICAgICAgICAvLyBHZW5lcmF0aW9uIDIKKyAgICAgICAgRGVpdHkgY3JvbnVzID0gZ2FlYS5naXZlQmlydGgoIkNyb251cyIsIHVyYW51cywgTUFMRSk7CisgICAgICAgIERlaXR5IHJoZWEgPSBnYWVhLmdpdmVCaXJ0aCgiUmhlYSIsIHVyYW51cywgRkVNQUxFKTsKKyAgICAgICAgRGVpdHkgY29ldXMgPSBnYWVhLmdpdmVCaXJ0aCgiQ29ldXMiLCB1cmFudXMsIE1BTEUpOworICAgICAgICBEZWl0eSBwaG9lYmUgID0gZ2FlYS5naXZlQmlydGgoIlBob2ViZSIsIHVyYW51cywgRkVNQUxFKTsKKyAgICAgICAgRGVpdHkgb2NlYW51cyA9IGdhZWEuZ2l2ZUJpcnRoKCJPY2VhbnVzIiwgdXJhbnVzLCBNQUxFKTsKKyAgICAgICAgRGVpdHkgdGV0aHlzID0gZ2FlYS5naXZlQmlydGgoIlRldGh5cyIsIHVyYW51cywgRkVNQUxFKTsKKworICAgICAgICAvLyBHZW5lcmF0aW9uIDMKKyAgICAgICAgRGVpdHkgbGV0byA9IHBob2ViZS5naXZlQmlydGgoIkxldG8iLCBjb2V1cywgRkVNQUxFKTsKKworICAgICAgICBEZWl0eSBoZXN0aWEgPSByaGVhLmdpdmVCaXJ0aCgiSGVzdGlhIiwgY3JvbnVzLCBGRU1BTEUpOworICAgICAgICBEZWl0eSBwbHV0byA9IHJoZWEuZ2l2ZUJpcnRoKCJQbHV0byIsIGNyb251cywgTUFMRSk7CisgICAgICAgIERlaXR5IHBvc2VpZG9uID0gcmhlYS5naXZlQmlydGgoIlBvc2VpZG9uIiwgY3JvbnVzLCBNQUxFKTsKKyAgICAgICAgRGVpdHkgemV1cyA9IHJoZWEuZ2l2ZUJpcnRoKCJaZXVzIiwgY3JvbnVzLCBNQUxFKTsKKyAgICAgICAgRGVpdHkgaGVyYSA9IHJoZWEuZ2l2ZUJpcnRoKCJIZXJhIiwgY3JvbnVzLCBGRU1BTEUpOworICAgICAgICBEZWl0eSBkZW1ldGVyID0gcmhlYS5naXZlQmlydGgoIkRlbWV0ZXIiLCBjcm9udXMsIEZFTUFMRSk7CisKKyAgICAgICAgLy8gR2VuZXJhdGlvbiA0CisgICAgICAgIERlaXR5IGlhcGV0dXMgPSB0ZXRoeXMuZ2l2ZUJpcnRoKCJJYXBldHVzIiwgY29ldXMsIE1BTEUpOworICAgICAgICBEZWl0eSBjbHltZW5lID0gbmV3IERlaXR5KCJDbHltZW5lIiwgRkVNQUxFKTsKKworICAgICAgICBEZWl0eSBhcG9sbG8gPSBsZXRvLmdpdmVCaXJ0aCgiQXBvbGxvIiwgemV1cywgTUFMRSk7CisgICAgICAgIERlaXR5IGFydGVtaXMgPSBsZXRvLmdpdmVCaXJ0aCgiQXJ0ZW1pcyIsIHpldXMsIE1BTEUpOworCisgICAgICAgIERlaXR5IHBlcnNlcGhvbmUgPSBkZW1ldGVyLmdpdmVCaXJ0aCgiUGVyc2VwaG9uZSIsIHpldXMsIE1BTEUpOworCisgICAgICAgIERlaXR5IGFyZXMgPSBoZXJhLmdpdmVCaXJ0aCgiQXJlcyIsIHpldXMsIE1BTEUpOworICAgICAgICBEZWl0eSBoZWJlID0gaGVyYS5naXZlQmlydGgoIkhlYmUiLCB6ZXVzLCBGRU1BTEUpOworICAgICAgICBEZWl0eSBoZXBoYWVzdHVzID0gaGVyYS5naXZlQmlydGgoIkhlcGhhZXN0dXMiLCB6ZXVzLCBNQUxFKTsKKworICAgICAgICBEZWl0eSBwcm9tZXRoZXVzID0gY2x5bWVuZS5naXZlQmlydGgoIlByb21ldGhldXMiLCBpYXBldHVzLCBNQUxFKTsKKyAgICAgICAgRGVpdHkgYXRsYXMgPSBjbHltZW5lLmdpdmVCaXJ0aCgiQXRsYXMiLCBpYXBldHVzLCBNQUxFKTsKKyAgICAgICAgRGVpdHkgZXBpbWV0aGV1cyA9IGNseW1lbmUuZ2l2ZUJpcnRoKCJFcGltZXRoZXVzIiwgaWFwZXR1cywgRkVNQUxFKTsKKworICAgICAgICBEZWl0eSBkaW9uZSA9IG5ldyBEZWl0eSgiRGlvbmUiLCBGRU1BTEUpOworICAgICAgICBkaW9uZS5naXZlQmlydGgoIkFwaHJvZGl0ZSIsIHpldXMsIEZFTUFMRSk7CisKKyAgICAgICAgLy8gQmVnaW4gYSBuZXcgbG9jYWwgdHJhbnNhY3Rpb24gc28gdGhhdCB3ZSBjYW4gcGVyc2lzdCBhIG5ldyBlbnRpdHkKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworCisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZXhwbGljaXRseSBwZXJzaXN0IGEgc2luZ2xlIHJvb3Qgb2YgdGhlCisgICAgICAgIC8vIG9iamVjdCBncmFwaCAodGhlIGZhbWlseSB0cmVlLCBpbiB0aGlzIGNhc2UpLCBzaW5jZSB3ZSBoYXZlIHRoZQorICAgICAgICAvLyAiY2FzY2FkZSIgYW5ub3RhdGlvbiBvbiBhbGwgdGhlIHJlbGF0aW9ucworICAgICAgICBlbS5wZXJzaXN0KHpldXMpOworCisgICAgICAgIC8vIENvbW1pdCB0aGUgdHJhbnNhY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGVudGl0eSB0bworICAgICAgICAvLyBiZSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJ1biBzb21lIHNhbXBsZSBxdWVyaWVzIGFnYWluc3QgdGhlIGZhbWlseSB0cmVlIG1vZGVsLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gIGVtICB0aGUgRW50aXR5TWFuYWdlciB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuUXVlcmllcyhFbnRpdHlNYW5hZ2VyIGVtKSB7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIHF1ZXJ5IHRvIGZpbmQgYWxsIGluc3RhbmNlcy4uIik7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhIHNpbXBsZSBxdWVyeSBmb3IgYWxsIHRoZSBEZWl0eSBlbnRpdGllcworICAgICAgICBRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCB4IGZyb20gRGVpdHkgeCIpOworCisgICAgICAgIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZW50aXRpZXMgYW5kIHByaW50IG91dCBlYWNoIG9mIHRoZWlyCisgICAgICAgIC8vIG1lc3NhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBkYXRlIG9uIHdoaWNoIGl0IHdhcyBjcmVhdGVkIAorICAgICAgICBmb3IgKERlaXR5IG0gOiAoTGlzdDxEZWl0eT4pcS5nZXRSZXN1bHRMaXN0KCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCB4IGZyb20gRGVpdHkgeCAiCisgICAgICAgICAgICArICJ3aGVyZSB4LmZhdGhlci5uYW1lID0gJ1pldXMnIik7CisKKyAgICAgICAgZm9yIChEZWl0eSBtIDogKExpc3Q8RGVpdHk+KXEuZ2V0UmVzdWx0TGlzdCgpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoaWxkIG9mIFpldXM6ICIgKyBtLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBxID0gZW0uY3JlYXRlTmFtZWRRdWVyeSgic2libGluZ3MiKS4KKyAgICAgICAgICAgIHNldFBhcmFtZXRlcigxLCBlbS5nZXRSZWZlcmVuY2UoRGVpdHkuY2xhc3MsICJSaGVhIikpOworCisgICAgICAgIGZvciAoRGVpdHkgbSA6IChMaXN0PERlaXR5PillbS5jcmVhdGVOYW1lZFF1ZXJ5KCJzaWJsaW5ncyIpLgorICAgICAgICAgICAgc2V0UGFyYW1ldGVyKDEsIGVtLmdldFJlZmVyZW5jZShEZWl0eS5jbGFzcywgIlJoZWEiKSkuCisgICAgICAgICAgICBnZXRSZXN1bHRMaXN0KCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2libGluZ3Mgb2YgUmhlYTogIiArIG0uZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRGVpdHkgbSA6IChMaXN0PERlaXR5PillbS5jcmVhdGVOYW1lZFF1ZXJ5KCJoYWxmLXNpYmxpbmdzIikuCisgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoMSwgZW0uZ2V0UmVmZXJlbmNlKERlaXR5LmNsYXNzLCAiQXBvbGxvIikpLgorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhhbGYtc2libGluZ3Mgb2YgQXBvbGxvOiAiICsgbS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChEZWl0eSBtIDogKExpc3Q8RGVpdHk+KWVtLmNyZWF0ZU5hbWVkUXVlcnkoImNvdXNpbnMiKS4KKyAgICAgICAgICAgIHNldFBhcmFtZXRlcigxLCBlbS5nZXRSZWZlcmVuY2UoRGVpdHkuY2xhc3MsICJMZXRvIikpLgorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdXNpbnMgb2YgTGV0bzogIiArIG0uZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JlbGF0aW9ucy9idWlsZC54bWwgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZWxhdGlvbnMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjU0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZWxhdGlvbnMvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgbmFtZT0icmVsYXRpb25zIiBkZWZhdWx0PSJydW4iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJleGFtcGxlIiB2YWx1ZT0icmVsYXRpb25zIi8+CisgICAgPGltcG9ydCBmaWxlPSIuLi9idWlsZC54bWwiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL01haW4uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjlmNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIHJldmVyc2VtYXBwaW5nOworCitpbXBvcnQgamF2YS50ZXh0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKKworCisvKiogCisgKiBBIHNpbXBsZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgcmV2ZXJzZS1tYXBwZWQgY2xhc3NlcyBmcm9tIHRoZSBhaXJsaW5lcworICogc2NoZW1hIHRvIHByaW50IG91dCBhIGxpc3Qgb2Ygc2NoZWR1bGVzIGZsaWdodGVzIGFuZCB0aGUgCisgKiBwcm9qZWN0ZWQgcHJvZml0cyBmcm9tIHRoZW0uCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluIHsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoU3RyaW5nIG1zZykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSB1c2luZyB0aGUgU3lzdGVtIHByb3BlcnRpZXMuCisgICAgICAgIC8vIFRoZSAicmV2ZXJzZW1hcHBpbmciIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBiYXNlZCBvbiB0aGUKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBuYW1lIGluIHRoZSBNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwgZmlsZQorICAgICAgICBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5ID0gUGVyc2lzdGVuY2UuCisgICAgICAgICAgICBjcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeSgicmV2ZXJzZW1hcHBpbmciLAorICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHlNYW5hZ2VyIGZyb20gdGhlIEVudGl0eU1hbmFnZXJGYWN0b3J5LiBUaGUKKyAgICAgICAgLy8gRW50aXR5TWFuYWdlciBpcyB0aGUgbWFpbiBvYmplY3QgaW4gdGhlIHBlcnNpc3RlbmNlIEFQSSwgYW5kIGlzCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlLCBkZWxldGUsIGFuZCBxdWVyeSBvYmplY3RzLCBhcyB3ZWxsIGFzIGFjY2VzcworICAgICAgICAvLyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgTGlzdDxBdmFpbGFiaWxpdHk+IHNjaGVkdWxlID0gKExpc3Q8QXZhaWxhYmlsaXR5PikKKyAgICAgICAgICAgIGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgYXZhaWwgZnJvbSBBdmFpbGFiaWxpdHkgYXZhaWwgIgorICAgICAgICAgICAgKyAiam9pbiBmZXRjaCBhdmFpbC5mbGlnaHQgIgorICAgICAgICAgICAgKyAib3JkZXIgYnkgYXZhaWwuZmxpZ2h0RGF0ZSBhc2MsIGF2YWlsLmZsaWdodC5kZXBhcnR1cmVUaW1lIGFzYyIpLgorICAgICAgICAgICAgICAgIGdldFJlc3VsdExpc3QoKTsKKyAgICAgICBmb3IgKEF2YWlsYWJpbGl0eSBhdmFpbCA6IHNjaGVkdWxlKSB7CisgICAgICAgICAgIEZsaWdodCBmbGlnaHQgPSBhdmFpbC5nZXRGbGlnaHQoKTsKKworICAgICAgICAgICAvLyBub3RlIHRoYXQgQXZhaWxhYmlsaXR5LmdldEZsaWdodERhdGUgaXMganVzdCBhIERBVEUgd2l0aCBubworICAgICAgICAgICAvLyB0aW1lIGNvbXBvbmVudCwgYW5kIEZsaWdodC5nZXREZXBhcnR1cmVUaW1lKCkgaXMganVzdCBhIFRJTUUKKyAgICAgICAgICAgLy8gd2l0aCBubyBkYXRlIGNvbXBvbmVudAorICAgICAgICAgICBwcmludChuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU1NIGRkLCB5eXl5IikuCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdChhdmFpbC5nZXRGbGlnaHREYXRlKCkpCisgICAgICAgICAgICAgICArICIgZmxpZ2h0ICIKKyAgICAgICAgICAgICAgICsgZmxpZ2h0LmdldEZsaWdodElkKCkgKyAiIGRlcGFydHMgIgorICAgICAgICAgICAgICAgKyBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiaGg6bW0gYWEiKS4KKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0KGZsaWdodC5nZXREZXBhcnR1cmVUaW1lKCkpCisgICAgICAgICAgICAgICArICIgZnJvbSAiICsgZmxpZ2h0LmdldE9yaWdBaXJwb3J0KCkKKyAgICAgICAgICAgICAgICsgIiB0byAiICsgZmxpZ2h0LmdldERlc3RBaXJwb3J0KCkpOworCisgICAgICAgICAgICAvLyBsb29rIHVwIHRoZSBBaXJsaW5lIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgZmxpZ2h0IElECisgICAgICAgICAgICBBaXJsaW5lIGFpcmxpbmUgPSBlbS5nZXRSZWZlcmVuY2UoQWlybGluZS5jbGFzcywKKyAgICAgICAgICAgICAgICBmbGlnaHQuZ2V0RmxpZ2h0SWQoKS5zdWJzdHJpbmcoMCwgMikpOworICAgICAgICAgICAgZG91YmxlIHJhdGVQZXJNaWxlID0gYWlybGluZS5nZXRCYXNpY1JhdGUoKTsKKyAgICAgICAgICAgIGRvdWJsZSByYXRlID0gZmxpZ2h0LmdldE1pbGVzKCkgKiByYXRlUGVyTWlsZTsKKworICAgICAgICAgICAgaW50IGVjb25UYWtlbiA9IGF2YWlsLmdldEVjb25vbXlTZWF0c1Rha2VuKCk7CisgICAgICAgICAgICBpbnQgYnVzaW5lc3NUYWtlbiA9IGF2YWlsLmdldEJ1c2luZXNzU2VhdHNUYWtlbigpOworICAgICAgICAgICAgaW50IGZpcnN0Y2xhc3NUYWtlbiA9IGF2YWlsLmdldEZpcnN0Y2xhc3NTZWF0c1Rha2VuKCk7CisKKyAgICAgICAgICAgIGRvdWJsZSBpbmNvbWUgPSAoZWNvblRha2VuICogcmF0ZSkKKyAgICAgICAgICAgICAgICArIChidXNpbmVzc1Rha2VuICogcmF0ZSkKKyAgICAgICAgICAgICAgICArIChidXNpbmVzc1Rha2VuICogcmF0ZSAqIGFpcmxpbmUuZ2V0QnVzaW5lc3NMZXZlbEZhY3RvcigpKQorICAgICAgICAgICAgICAgICsgKGZpcnN0Y2xhc3NUYWtlbiAqIHJhdGUpCisgICAgICAgICAgICAgICAgKyAoZmlyc3RjbGFzc1Rha2VuICogcmF0ZSAqIGFpcmxpbmUuZ2V0Rmlyc3RjbGFzc0xldmVsRmFjdG9yKCkpOworCisgICAgICAgICAgICBpbnQgc2VhdHNUYWtlbiA9IGVjb25UYWtlbiArIGJ1c2luZXNzVGFrZW4gKyBmaXJzdGNsYXNzVGFrZW47CisgICAgICAgICAgICBpbnQgdG90YWxTZWF0cyA9IGFpcmxpbmUuZ2V0RWNvbm9teVNlYXRzKCkKKyAgICAgICAgICAgICAgICAgICAgKyBhaXJsaW5lLmdldEJ1c2luZXNzU2VhdHMoKQorICAgICAgICAgICAgICAgICAgICArIGFpcmxpbmUuZ2V0Rmlyc3RjbGFzc1NlYXRzKCk7CisgICAgICAgICAgICBkb3VibGUgcGVyY2VudEZ1bGwgPSAoZG91YmxlKSBzZWF0c1Rha2VuIC8gKGRvdWJsZSkgdG90YWxTZWF0czsKKworICAgICAgICAgICAgcHJpbnQoIiAgaW5jb21lIGZyb20gZmxpZ2h0OiAiCisgICAgICAgICAgICAgICAgKyBOdW1iZXJGb3JtYXQuZ2V0Q3VycmVuY3lJbnN0YW5jZSgpLmZvcm1hdChpbmNvbWUpCisgICAgICAgICAgICAgICAgKyAiIHdpdGggIiArIHNlYXRzVGFrZW4gKyAiIHNlYXRzIHRha2VuICgiCisgICAgICAgICAgICAgICAgKyBOdW1iZXJGb3JtYXQuZ2V0UGVyY2VudEluc3RhbmNlKCkuZm9ybWF0KHBlcmNlbnRGdWxsKQorICAgICAgICAgICAgICAgICsgIiBmdWxsKSIpOworCisgICAgICAgICAgICBkb3VibGUgZ2FsbG9uc1Blck1pbGUgPSAyLjBkOyAvLyBhcHByb3ggZm9yIGEgc21hbGwgcGxhbmUKKyAgICAgICAgICAgIGRvdWJsZSB0b3RhbEdhbGxvbnMgPSBnYWxsb25zUGVyTWlsZSAqIGZsaWdodC5nZXRNaWxlcygpOworICAgICAgICAgICAgZG91YmxlIGNvc3RQZXJHYWxsb24gPSAwLjUwZDsgLy8gYXBwcm94IDIwMDYgcHJpY2VzCisgICAgICAgICAgICBkb3VibGUgdG90YWxGdWVsQ29zdCA9IHRvdGFsR2FsbG9ucyAqIGNvc3RQZXJHYWxsb247CisgICAgICAgICAgICBwcmludCgiICBmdWVsIGNvc3Qgb2YgZmxpZ2h0IG92ZXIgIgorICAgICAgICAgICAgICAgICsgTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKCkuZm9ybWF0KGZsaWdodC5nZXRNaWxlcygpKQorICAgICAgICAgICAgICAgICsgIiBtaWxlczogIgorICAgICAgICAgICAgICAgICsgTnVtYmVyRm9ybWF0LmdldEN1cnJlbmN5SW5zdGFuY2UoKS5mb3JtYXQodG90YWxGdWVsQ29zdCkpOworCisgICAgICAgICAgICBkb3VibGUgdG90YWxDb3N0ID0gdG90YWxGdWVsQ29zdDsKKworICAgICAgICAgICAgcHJpbnQoIiAgdG90YWwgcHJvZml0OiAiICsgTnVtYmVyRm9ybWF0LmdldEN1cnJlbmN5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICBmb3JtYXQoaW5jb21lIC0gdG90YWxDb3N0KSk7CisgICAgICAgfSAKKworICAgICAgICAvLyBBZ2FpbiwgaXQgaXMgYWx3YXlzIGdvb2QgdG8gY2xlYW4gdXAgYWZ0ZXIgb3Vyc2VsdmVzCisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZmFjdG9yeS5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL2J1aWxkLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjlmMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvYnVpbGQueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgbmFtZT0iaGVsbG9qcGEiIGRlZmF1bHQ9InJ1biI+CisgICAgPHByb3BlcnR5IG5hbWU9ImV4YW1wbGUiIHZhbHVlPSJyZXZlcnNlbWFwcGluZyIvPgorICAgIDxpbXBvcnQgZmlsZT0iLi4vYnVpbGQueG1sIi8+CisKKyAgICA8IS0tIHdoZW4gd2UgY2xlYW4sIGFsc28gcmVtb3ZlIGFsbCBvZiB0aGUgYXV0by1nZW5lcmF0ZWQgZmlsZXMgLS0+CisgICAgPHRhcmdldCBuYW1lPSJwcmUtY2xlYW4iIGRlc2NyaXB0aW9uPSJQcmUtY2xlYW4gcGhhc2UiPgorICAgICAgICA8ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcm0ueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamF2YSIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamF2YX4iLz4KKyAgICAgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iQXV0by1nZW5lcmF0ZWQgYnk6Ii8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvZGVsZXRlPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLQorICAgICAgICBCZWZvcmUgd2UgY29tcGlsZSBhbmQgcnVuLCB3ZSBmaXJzdCBpbml0aWFsaXplIGEKKyAgICAgICAgZGF0YWJhc2UgYW5kIHJ1biB0aGUgcmV2ZXJzZSBtYXBwaW5nIHRvb2wgb24gaXQKKyAgICAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InByZS1jb21waWxlIiBkZXBlbmRzPSJpbml0aWFsaXplLWRiLHJldmVyc2UtbWFwLXNjaGVtYSIKKyAgICAgICAgZGVzY3JpcHRpb249IlByZS1jb21waWxhdGlvbiBwaGFzZSI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXRpYWxpemUtZGIiIHVubGVzcz0iaW5pdGlhbGl6ZS1kYi1za2lwIgorICAgICAgICBkZXNjcmlwdGlvbj0iRHJvcCB0aGVuIHJlLWNyZWF0ZSB0aGUgZGF0YWJhc2UiPgorICAgICAgICA8IS0tIGZpcnN0IG1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgaXMgZW1wdHkgLS0+CisgICAgICAgIDxzcWwgc3JjPSJzY2hlbWEvZHJvcGRiLnNxbCIKKyAgICAgICAgICAgIGRyaXZlcj0iJHtkYmRyaXZlcn0iIHVybD0iJHtkYnVybH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZGJ1c2VyfSIgcGFzc3dvcmQ9IiR7ZGJwYXNzfSIKKyAgICAgICAgICAgIG9uZXJyb3I9ImNvbnRpbnVlIiBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorCisgICAgICAgIDwhLS0gYnVpbGQgdGhlIGRhdGFiYXNlIC0tPgorICAgICAgICA8c3FsCisgICAgICAgICAgICBkcml2ZXI9IiR7ZGJkcml2ZXJ9IiB1cmw9IiR7ZGJ1cmx9IgorICAgICAgICAgICAgdXNlcmlkPSIke2RidXNlcn0iIHBhc3N3b3JkPSIke2RicGFzc30iIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDx0cmFuc2FjdGlvbiBzcmM9InNjaGVtYS9Ub3Vyc0RCX3NjaGVtYS5zcWwiLz4KKyAgICAgICAgICAgIDx0cmFuc2FjdGlvbiBzcmM9InNjaGVtYS9sb2FkQ09VTlRSSUVTLnNxbCIvPgorICAgICAgICAgICAgPHRyYW5zYWN0aW9uIHNyYz0ic2NoZW1hL2xvYWRDSVRJRVMuc3FsIi8+CisgICAgICAgICAgICA8dHJhbnNhY3Rpb24gc3JjPSJzY2hlbWEvbG9hZEFJUkxJTkVTLnNxbCIvPgorICAgICAgICAgICAgPHRyYW5zYWN0aW9uIHNyYz0ic2NoZW1hL2xvYWRGTElHSFRTMS5zcWwiLz4KKyAgICAgICAgICAgIDx0cmFuc2FjdGlvbiBzcmM9InNjaGVtYS9sb2FkRkxJR0hUUzIuc3FsIi8+CisgICAgICAgICAgICA8dHJhbnNhY3Rpb24gc3JjPSJzY2hlbWEvbG9hZEZMSUdIVEFWQUlMQUJJTElUWTEuc3FsIi8+CisgICAgICAgICAgICA8dHJhbnNhY3Rpb24gc3JjPSJzY2hlbWEvbG9hZEZMSUdIVEFWQUlMQUJJTElUWTIuc3FsIi8+CisgICAgICAgIDwvc3FsPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZXZlcnNlLW1hcC1zY2hlbWEiIGRlcGVuZHM9ImluaXRpYWxpemUtZGIiCisgICAgICAgIHVubGVzcz0icmV2ZXJzZS1tYXAtc2NoZW1hLXNraXAiCisgICAgICAgIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBqYXZhIGZpbGVzIGZyb20gdGhlIGRhdGFiYXNlIHNjaGVtYSI+CisgICAgICAgIDwhLS0gbm93IHJ1biB0aGUgdG9vbCB0byBnZW5lcmF0ZSBqYXZhIGZpbGVzIGZyb20gdGhlIGRiIHNjaGVtYSAtLT4KKyAgICAgICAgPHRhc2tkZWYgbmFtZT0icmV2ZXJzZW1hcHBpbmd0b29sIiBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIKKyAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuYW50LlJldmVyc2VNYXBwaW5nVG9vbFRhc2siLz4KKyAgICAgICAgPHJldmVyc2VtYXBwaW5ndG9vbCBwYWNrYWdlPSJyZXZlcnNlbWFwcGluZyIgZGlyZWN0b3J5PSIke2Jhc2VkaXJ9IgorICAgICAgICAgICAgaW5uZXJJZGVudGl0eUNsYXNzZXM9InRydWUiCisgICAgICAgICAgICBjdXN0b21pemVyUHJvcGVydGllcz0iJHtiYXNlZGlyfS9yZXZlcnNlLWN1c3RvbWl6ZXIucHJvcGVydGllcyI+CisgICAgICAgICAgICA8Y29uZmlnIGNvbm5lY3Rpb25kcml2ZXJuYW1lPSIke2RiZHJpdmVyfSIgY29ubmVjdGlvbnVybD0iJHtkYnVybH0iCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbnVzZXJuYW1lPSIke2RidXNlcn0iIGNvbm5lY3Rpb25wYXNzd29yZD0iJHtkYnBhc3N9Ii8+CisgICAgICAgICAgICA8Y29kZWZvcm1hdCB0YWJTcGFjZXM9IjQiIHNwYWNlQmVmb3JlUGFyZW49ImZhbHNlIgorICAgICAgICAgICAgICAgIGJyYWNlT25TYW1lTGluZT0idHJ1ZSIvPgorICAgICAgICA8L3JldmVyc2VtYXBwaW5ndG9vbD4KKworICAgICAgICA8IS0tCisgICAgICAgICAgICB0aGUgcmV2ZXJzZSBtYXBwaW5nIHRvb2wgYWx3YXlzIG91dHB1dHMgdGhlIG9ybS54bWwgZmlsZSB0bworICAgICAgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5OyBtb3ZlIGl0IHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBpbiBjYXNlCisgICAgICAgICAgICB3ZSBhcmUgZXhlY3V0aW5nIHRoaXMgYnVpbGQgZmlsZSBmcm9tIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4KKyAgICAgICAgLS0+CisgICAgICAgIDxtb3ZlIGZpbGU9IiR7dXNlci5kaXJ9L29ybS54bWwiCisgICAgICAgICAgICB0b2ZpbGU9IiR7YmFzZWRpcn0vb3JtLnhtbCIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9yZXZlcnNlLWN1c3RvbWl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3JldmVyc2UtY3VzdG9taXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmYyNDcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9yZXZlcnNlLWN1c3RvbWl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDM4IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBGaXggZ2VuZXJhdGVkIG5hbWVzIHRvIGJlIG1vcmUgImphdmEtbGlrZSIKKworcmV2ZXJzZW1hcHBpbmcuQWlybGluZXMucmVuYW1lOiByZXZlcnNlbWFwcGluZy5BaXJsaW5lCityZXZlcnNlbWFwcGluZy5BaXJsaW5lLmFpcmxpbmUucmVuYW1lOiBhaXJsaW5lQ29kZQorcmV2ZXJzZW1hcHBpbmcuQWlybGluZS5haXJsaW5lRnVsbC5yZW5hbWU6IGZ1bGxOYW1lCisKK3JldmVyc2VtYXBwaW5nLkNpdGllcy5yZW5hbWU6IHJldmVyc2VtYXBwaW5nLkNpdHkKKworcmV2ZXJzZW1hcHBpbmcuQ291bnRyaWVzLnJlbmFtZTogcmV2ZXJzZW1hcHBpbmcuQ291bnRyeQorCityZXZlcnNlbWFwcGluZy5GbGlnaHRhdmFpbGFiaWxpdHkucmVuYW1lOiByZXZlcnNlbWFwcGluZy5BdmFpbGFiaWxpdHkKK3JldmVyc2VtYXBwaW5nLkF2YWlsYWJpbGl0eS5pZGVudGl0eTogQXZhaWxhYmlsaXR5JElECisKK3JldmVyc2VtYXBwaW5nLkZsaWdodHMucmVuYW1lOiByZXZlcnNlbWFwcGluZy5GbGlnaHQKK3JldmVyc2VtYXBwaW5nLkZsaWdodC5pZGVudGl0eTogRmxpZ2h0JElECityZXZlcnNlbWFwcGluZy5GbGlnaHQuZGVwYXJ0VGltZS5yZW5hbWU6IGRlcGFydHVyZVRpbWUKK3JldmVyc2VtYXBwaW5nLkZsaWdodC5hcnJpdmVUaW1lLnJlbmFtZTogYXJyaXZhbFRpbWUKK3JldmVyc2VtYXBwaW5nLkZsaWdodC5hdmFpbGFiaWxpdHlzLnJlbmFtZTogYXZhaWxhYmlsaXRpZXMKKworcmV2ZXJzZW1hcHBpbmcuQ291bnRyeS5jaXR5cy5yZW5hbWU6IGNpdGllcworCisKKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL1RvdXJzREJfc2NoZW1hLnNxbCBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9Ub3Vyc0RCX3NjaGVtYS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzYzg0ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9Ub3Vyc0RCX3NjaGVtYS5zcWwKQEAgLTAsMCArMSwxNzQgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCistLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCistLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy0tIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy0tIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitDUkVBVEUgVEFCTEUgQUlSTElORVMKKyAgICgKKyAgICAgIEFJUkxJTkUgQ0hBUigyKSBOT1QgTlVMTCAsCisgICAgICBBSVJMSU5FX0ZVTEwgVkFSQ0hBUigyNCksCisgICAgICBCQVNJQ19SQVRFIERPVUJMRSBQUkVDSVNJT04sCisgICAgICBESVNUQU5DRV9ESVNDT1VOVCBET1VCTEUgUFJFQ0lTSU9OLAorICAgICAgQlVTSU5FU1NfTEVWRUxfRkFDVE9SIERPVUJMRSBQUkVDSVNJT04sCisgICAgICBGSVJTVENMQVNTX0xFVkVMX0ZBQ1RPUiBET1VCTEUgUFJFQ0lTSU9OLAorICAgICAgRUNPTk9NWV9TRUFUUyBJTlRFR0VSLAorICAgICAgQlVTSU5FU1NfU0VBVFMgSU5URUdFUiwKKyAgICAgIEZJUlNUQ0xBU1NfU0VBVFMgSU5URUdFUgorICAgKTsKKworCitBTFRFUiBUQUJMRSBBSVJMSU5FUworICAgQUREIENPTlNUUkFJTlQgQUlSTElORVNfUEsgUHJpbWFyeSBLZXkgKAorICAgICAgQUlSTElORSk7CisKKworLS0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworQ1JFQVRFIFRBQkxFIENPVU5UUklFUworICAgKAorICAgICAgQ09VTlRSWSBWQVJDSEFSKDI2KSBOT1QgTlVMTCwKKyAgICAgIENPVU5UUllfSVNPX0NPREUgQ0hBUigyKSBOT1QgTlVMTCAsCisgICAgICBSRUdJT04gVkFSQ0hBUigyNikKKyAgICk7CisgCisKK0FMVEVSIFRBQkxFIENPVU5UUklFUworICAgQUREIENPTlNUUkFJTlQgQ09VTlRSSUVTX1BLIFByaW1hcnkgS2V5ICgKKyAgICAgIENPVU5UUllfSVNPX0NPREUpOworCitBTFRFUiBUQUJMRSBDT1VOVFJJRVMKKyAgIEFERCBDT05TVFJBSU5UIENPVU5UUklFU19VTlFfTk0gVW5pcXVlICgKKyAgICAgIENPVU5UUlkpOworCisKK0FMVEVSIFRBQkxFIENPVU5UUklFUworICAgQUREIENPTlNUUkFJTlQgQ09VTlRSSUVTX1VDCisgICBDSEVDSyAoY291bnRyeV9JU09fY29kZSA9IHVwcGVyKGNvdW50cnlfSVNPX2NvZGUpICk7CisKKworLS0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworQ1JFQVRFIFRBQkxFIENJVElFUworICAgKAorICAgICAgQ0lUWV9JRCBJTlRFR0VSIE5PVCBOVUxMICwKKyAgICAgIENJVFlfTkFNRSBWQVJDSEFSKDI0KSBOT1QgTlVMTCwKKwlDT1VOVFJZIFZBUkNIQVIoMjYpIE5PVCBOVUxMLAorCUFJUlBPUlQgVkFSQ0hBUigzKSwKKwlMQU5HVUFHRSAgVkFSQ0hBUigxNiksCisgICAgICBDT1VOVFJZX0lTT19DT0RFIENIQVIoMikgCisgICApOworCisKK0FMVEVSIFRBQkxFIENJVElFUworICAgQUREIENPTlNUUkFJTlQgQ0lUSUVTX1BLIFByaW1hcnkgS2V5ICgKKyAgICAgIENJVFlfSUQpOworCitBTFRFUiBUQUJMRSBDSVRJRVMKKyAgIEFERCBDT05TVFJBSU5UIENPVU5UUklFU19GSyBGb3JlaWduIEtleSAoCisgICAgICBDT1VOVFJZX0lTT19DT0RFKQorICAgUkVGRVJFTkNFUyBDT1VOVFJJRVMgKAorICAgICAgQ09VTlRSWV9JU09fQ09ERSk7CisKKworLS0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworQ1JFQVRFIFRBQkxFIEZMSUdIVFMKKyAgICgKKyAgICAgIEZMSUdIVF9JRCBDSEFSKDYpIE5PVCBOVUxMICwKKyAgICAgIFNFR01FTlRfTlVNQkVSIElOVEVHRVIgTk9UIE5VTEwgLAorICAgICAgT1JJR19BSVJQT1JUIENIQVIoMyksCisgICAgICBERVBBUlRfVElNRSBUSU1FLAorICAgICAgREVTVF9BSVJQT1JUIENIQVIoMyksCisgICAgICBBUlJJVkVfVElNRSBUSU1FLAorICAgICAgTUVBTCBDSEFSKDEpLAorICAgICAgRkxZSU5HX1RJTUUgRE9VQkxFIFBSRUNJU0lPTiwKKyAgICAgIE1JTEVTIElOVEVHRVIsCisgICAgICBBSVJDUkFGVCBWQVJDSEFSKDYpCisgICApOworCitDUkVBVEUgSU5ERVggREVTVElOREVYIE9OIEZMSUdIVFMgKAorICAgICAgREVTVF9BSVJQT1JUKSA7CisgIAorQ1JFQVRFIElOREVYIE9SSUdJTkRFWCBPTiBGTElHSFRTICgKKyAgICAgIE9SSUdfQUlSUE9SVCkgOworIAorQUxURVIgVEFCTEUgRkxJR0hUUworICAgQUREIENPTlNUUkFJTlQgRkxJR0hUU19QSyBQcmltYXJ5IEtleSAoCisgICAgICBGTElHSFRfSUQsCisgICAgICBTRUdNRU5UX05VTUJFUik7CisKK0FMVEVSIFRBQkxFIEZMSUdIVFMKKyAgIEFERCBDT05TVFJBSU5UIE1FQUxfQ09OU1RSQUlOVAorICAgQ0hFQ0sgKG1lYWwgSU4gKCdCJywgJ0wnLCAnRCcsICdTJykpOworCisKKy0tIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKK0NSRUFURSBUQUJMRSBGTElHSFRBVkFJTEFCSUxJVFkKKyAgICgKKyAgICAgIEZMSUdIVF9JRCBDSEFSKDYpIE5PVCBOVUxMICwKKyAgICAgIFNFR01FTlRfTlVNQkVSIElOVEVHRVIgTk9UIE5VTEwgLAorICAgICAgRkxJR0hUX0RBVEUgREFURSBOT1QgTlVMTCAsCisgICAgICBFQ09OT01ZX1NFQVRTX1RBS0VOIElOVEVHRVIgREVGQVVMVCAwLAorICAgICAgQlVTSU5FU1NfU0VBVFNfVEFLRU4gSU5URUdFUiBERUZBVUxUIDAsCisgICAgICBGSVJTVENMQVNTX1NFQVRTX1RBS0VOIElOVEVHRVIgREVGQVVMVCAwCisgICApOworCisKK0FMVEVSIFRBQkxFIEZMSUdIVEFWQUlMQUJJTElUWQorICAgQUREIENPTlNUUkFJTlQgRkxJR0hUQVZBSUxfUEsgUHJpbWFyeSBLZXkgKAorICAgICAgRkxJR0hUX0lELAorICAgICAgU0VHTUVOVF9OVU1CRVIsCisgICAgICBGTElHSFRfREFURSk7CisKK0FMVEVSIFRBQkxFIEZMSUdIVEFWQUlMQUJJTElUWQorICAgQUREIENPTlNUUkFJTlQgRkxJR0hUU19GSzIgRm9yZWlnbiBLZXkgKAorICAgICAgRkxJR0hUX0lELAorICAgICAgU0VHTUVOVF9OVU1CRVIpCisgICBSRUZFUkVOQ0VTIEZMSUdIVFMgKAorICAgICAgRkxJR0hUX0lELAorICAgICAgU0VHTUVOVF9OVU1CRVIpOworCisKKy0tIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKK0NSRUFURSBUQUJMRSBNQVBTCisgICAoCisgICAgICBNQVBfSUQgSU5URUdFUiBOT1QgTlVMTCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIChTVEFSVCBXSVRIIDEsIElOQ1JFTUVOVCBCWSAxKSwKKyAgICAgIE1BUF9OQU1FIFZBUkNIQVIoMjQpIE5PVCBOVUxMLAorICAgICAgUkVHSU9OIFZBUkNIQVIoMjYpLAorICAgICAgQVJFQSBERUNJTUFMKDgsNCkgTk9UIE5VTEwsCisgICAgICBQSE9UT19GT1JNQVQgVkFSQ0hBUigyNikgTk9UIE5VTEwsCisgICAgICBQSUNUVVJFIEJMT0IoMTAyNDAwKSwKKyAgICAgIFVOSVFVRSAoTUFQX0lELCBNQVBfTkFNRSkKKyAgICk7CisKKworLS0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworQ1JFQVRFIFRBQkxFIEZMSUdIVFNfSElTVE9SWQorICAgKAorICAgICAgRkxJR0hUX0lEIENIQVIoNiksCisgICAgICBTRUdNRU5UX05VTUJFUiBJTlRFR0VSLAorICAgICAgT1JJR19BSVJQT1JUIENIQVIoMyksCisgICAgICBERVBBUlRfVElNRSBUSU1FLAorICAgICAgREVTVF9BSVJQT1JUIENIQVIoMyksCisgICAgICBBUlJJVkVfVElNRSBUSU1FLAorICAgICAgTUVBTCBDSEFSKDEpLAorICAgICAgRkxZSU5HX1RJTUUgRE9VQkxFIFBSRUNJU0lPTiwKKyAgICAgIE1JTEVTIElOVEVHRVIsCisgICAgICBBSVJDUkFGVCBWQVJDSEFSKDYpLCAKKyAgICAgIFNUQVRVUyBWQVJDSEFSICgyMCkKKyAgICk7CisKKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2Ryb3BkYi5zcWwgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvZHJvcGRiLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ1Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2Ryb3BkYi5zcWwKQEAgLTAsMCArMSwyMSBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCistLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy0tIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKy0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCistLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLS0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCistLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCistLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0RST1AgVEFCTEUgRkxJR0hUU19ISVNUT1JZOworRFJPUCBUQUJMRSBGTElHSFRBVkFJTEFCSUxJVFk7CitEUk9QIFRBQkxFIEZMSUdIVFM7CitEUk9QIFRBQkxFIE1BUFM7CitEUk9QIFRBQkxFIEFJUkxJTkVTOworRFJPUCBUQUJMRSBDSVRJRVM7CitEUk9QIFRBQkxFIENPVU5UUklFUzsKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkQUlSTElORVMuc3FsIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRBSVJMSU5FUy5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxYmY0MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkQUlSTElORVMuc3FsCkBAIC0wLDAgKzEsMTcgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCistLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCistLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy0tIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy0tIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnNlcnQgaW50byBBSVJMSU5FUyB2YWx1ZXMgKCdBQScsJ0FtYXpvbmlhbiBBaXJ3YXlzJywwLjE4LDAuMDMsMC41LDEuNSwyMCwxMCw1KSA7CitpbnNlcnQgaW50byBBSVJMSU5FUyB2YWx1ZXMgKCdVUycsJ1VuaW9uIFN0YW5kYXJkIEFpcmxpbmVzJywwLjE5LDAuMDUsMC40LDEuNiwyMCwxMCw1KTsKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkQ0lUSUVTLnNxbCBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkQ0lUSUVTLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDMwNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRDSVRJRVMuc3FsCkBAIC0wLDAgKzEsMTAyIEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy0tIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLS0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy0tICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCistLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCistLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCistLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMSwnQW1zdGVyZGFtJywnTmV0aGVybGFuZHMnLCdBTVMnLCdEdXRjaCcsJ05MJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgyLCdBdGhlbnMnLCdHcmVlY2UnLCdBVEgnLCdHcmVlaycsJ0dSJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgzLCdBdWNrbGFuZCcsJ05ldyBaZWFsYW5kJywnQUtMJywnRW5nbGlzaCcsJ05aJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg0LCdCZWlydXQnLCdMZWJhbm9uJywnQkVZJywnQXJhYmljJywnTEInKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDUsJ0JvZ290YScsJ0NvbG9tYmlhJywnQk9HJywnU3BhbmlzaCcsJ0NPJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg2LCdCb21iYXknLCdJbmRpYScsJ0JPTScsJ0hpbmRpJywnSU4nKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDcsJ0J1ZGFwZXN0JywnSHVuZ2FyeScsJ0JVRCcsJ0h1bmdhcmlhbicsJ0hVJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg4LCdCdWVub3MgQWlyZXMnLCdBcmdlbnRpbmEnLCdCVUUnLCdTcGFuaXNoJywnQVInKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDksJ0NhaXJvJywnRWd5cHQnLCdDQUknLCdBcmFiaWMnLCdFRycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMTAsJ0NhbGN1dHRhJywnSW5kaWEnLCdDQ1UnLCdCZW5nYWxpJywnSU4nKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDExLCdDYXBlIFRvd24nLCdTb3V0aCBBZnJpY2EnLCdDUFQnLCdFbmdsaXNoJywnWkEnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDEyLCdDYXJhY2FzJywnVmVuZXp1ZWxhJywnQ0NTJywnU3BhbmlzaCcsJ1ZFJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgxMywnQ2FzYWJsYW5jYScsJ01vcm9jY28nLCdDQVMnLCdBcmFiaWMnLCdNQScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMTQsJ0NvcGVuaGFnZW4nLCdEZW5tYXJrJywnQ1BIJywnRGFuaXNoJywnREsnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDE1LCdEdWJsaW4nLCdJcmVsYW5kJywnRFVCJywnRW5nbGlzaCcsJ0lFJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgxNiwnR2VuZXZhJywnU3dpdHplcmxhbmQnLCdHVkEnLCdGcmVuY2gnLCdDSCcpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMTcsJ0hvbmcgS29uZycsJ0NoaW5hJywnSEtHJywnQ2hpbmVzZScsJ0NOJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgxOCwnSXN0YW5idWwnLCdUdXJrZXknLCdJU1QnLCdUdXJraXNoJywnVFInKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDE5LCdKYWthcnRhJywnSW5kb25lc2lhJywnSktUJywnSW5kb25lc2lhbicsJ0lEJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgyMCwnS2FidWwnLCdBZmdoYW5pc3RhbicsJ0tCTCcsJ1Bhc2h0bycsJ0FGJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgyMSwnS2FyYWNoaScsJ1Bha2lzdGFuJywnS0hJJywnUHVuamFiaScsJ1BLJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgyMiwnTGFnb3MnLCdOaWdlcmlhJywnTE9TJywnRW5nbGlzaCcsJ05HJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgyMywnTGltYScsJ1BlcnUnLCdMSU0nLCdTcGFuaXNoJywnUEUnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDI0LCdMaXNib24nLCdQb3J0dWdhbCcsJ0xJUycsJ1BvcnR1Z3Vlc2UnLCdQVCcpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMjUsJ0xvbmRvbicsJ1VuaXRlZCBLaW5nZG9tJywnTEhSJywnRW5nbGlzaCcsJ0dCJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgyNiwnTWFkcmlkJywnU3BhaW4nLCdNQUQnLCdTcGFuaXNoJywnRVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDI3LCdNYW5pbGEnLCdQaGlsaXBwaW5lcycsJ01OTCcsJ1RhZ2Fsb2cnLCdQSCcpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMjgsJ01lbGJvdXJuZScsJ0F1c3RyYWxpYScsJ01FTCcsJ0VuZ2xpc2gnLCdBVScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMjksJ01leGljbyBDaXR5JywnTWV4aWNvJywnTUVYJywnU3BhbmlzaCcsJ01YJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgzMCwnTW9udHJlYWwnLCdDYW5hZGEnLCdZVUwnLCdGcmVuY2gnLCdDQScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMzEsJ01vc2NvdycsJ1J1c3NpYScsJ1NWTycsJ1J1c3NpYW4nLCdSVScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMzIsJ05haXJvYmknLCdLZW55YScsJ05CTycsJ0VuZ2xpc2gnLCdLRScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMzMsJ09zYWthJywnSmFwYW4nLCdPU0EnLCdKYXBhbmVzZScsJ0pQJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgzNCwnT3NsbycsJ05vcndheScsJ09TTCcsJ05vcndlZ2lhbicsJ05PJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgzNSwnUGFyaXMnLCdGcmFuY2UnLCdDREcnLCdGcmVuY2gnLCdGUicpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMzYsJ1ByYWd1ZScsJ0N6ZWNoIFJlcHVibGljJywnUFJHJywnQ3plY2gnLCdDWicpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMzcsJ1JleWtqYXZpaycsJ0ljZWxhbmQnLCdSRVknLCdJY2VsYW5kaWMnLCdJUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoMzgsJ1JpbyBkZSBKYW5laXJvJywnQnJhemlsJywnR0lHJywnUG9ydHVndWVzZScsJ0JSJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICgzOSwnUm9tZScsJ0l0YWx5JywnRkNPJywnSXRhbGlhbicsJ0lUJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg0MCwnU2FudGlhZ28nLCdDaGlsZScsJ1NDTCcsJ1NwYW5pc2gnLCdDTCcpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNDEsJ1NhbyBQYXVsbycsJ0JyYXppbCcsJ0dSVScsJ1BvcnR1Z3Vlc2UnLCdCUicpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNDIsJ1Nlb3VsJywnS29yZWEsIFJlcHVibGljIG9mJywnU0VMJywnS29yZWFuJywnS1InKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDQzLCdTaGFuZ2hhaScsJ0NoaW5hJywnU0hBJywnQ2hpbmVzZScsJ0NOJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg0NCwnU2luZ2Fwb3JlJywnU2luZ2Fwb3JlJywnU0lOJywnTWFsYXknLCdTRycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNDUsJ1N0b2NraG9sbScsJ1N3ZWRlbicsJ0FSTicsJ1N3ZWRpc2gnLCdTRScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNDYsJ1N5ZG5leScsJ0F1c3RyYWxpYScsJ1NZRCcsJ0VuZ2xpc2gnLCdBVScpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNDcsJ1NhbiBKb3NlJywnVW5pdGVkIFN0YXRlcycsJ1NKQycsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNDgsJ1RlaHJhbicsJ0lyYW4nLCdUSFInLCdGYXJzaScsJ0lSJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg0OSwnVG9reW8nLCdKYXBhbicsJ05SVCcsJ0phcGFuZXNlJywnSlAnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDUwLCdUb3JvbnRvJywnQ2FuYWRhJywnWVlaJywnRW5nbGlzaCcsJ0NBJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg1MSwnV2Fyc2F3JywnUG9sYW5kJywnV0FXJywnUG9saXNoJywnUEwnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDUyLCdBbGJhbnknLCdVbml0ZWQgU3RhdGVzJywnQUxCJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg1MywnQWxidXF1ZXJxdWUnLCdVbml0ZWQgU3RhdGVzJywnQUJRJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg1NCwnQXRsYW50YScsJ1VuaXRlZCBTdGF0ZXMnLCdBVEwnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDU1LCdCb2lzZScsJ1VuaXRlZCBTdGF0ZXMnLCdCT0knLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDU2LCdCb3N0b24nLCdVbml0ZWQgU3RhdGVzJywnQk9TJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg1NywnQ2hhcmxlc3RvbicsJ1VuaXRlZCBTdGF0ZXMnLCdDSFMnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDU4LCdDaGljYWdvJywnVW5pdGVkIFN0YXRlcycsJ01EVycsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNTksJ0NsZXZlbGFuZCcsJ1VuaXRlZCBTdGF0ZXMnLCdDTEUnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDYwLCdEYWxsYXMnLCdVbml0ZWQgU3RhdGVzJywnREZXJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg2MSwnRGVudmVyJywnVW5pdGVkIFN0YXRlcycsJ0RFTicsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNjIsJ0RlcyBNb2luZXMnLCdVbml0ZWQgU3RhdGVzJywnRFNNJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg2MywnRmFpcmJhbmtzJywnVW5pdGVkIFN0YXRlcycsJ0ZBSScsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNjQsJ0hlbGVuYScsJ1VuaXRlZCBTdGF0ZXMnLCdITE4nLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDY1LCdIb25vbHVsdScsJ1VuaXRlZCBTdGF0ZXMnLCdITkwnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDY2LCdIb3VzdG9uJywnVW5pdGVkIFN0YXRlcycsJ0hPVScsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNjcsJ0p1bmVhdScsJ1VuaXRlZCBTdGF0ZXMnLCdKTlUnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDY4LCdLYW5zYXMgQ2l0eScsJ1VuaXRlZCBTdGF0ZXMnLCdNQ0knLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDY5LCdMb3MgQW5nZWxlcycsJ1VuaXRlZCBTdGF0ZXMnLCdMQVgnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDcwLCdNZW1waGlzJywnVW5pdGVkIFN0YXRlcycsJ01FTScsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNzEsJ01pYW1pJywnVW5pdGVkIFN0YXRlcycsJ01JQScsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoNzIsJ01pbHdhdWtlZScsJ1VuaXRlZCBTdGF0ZXMnLCdNS0UnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDczLCdNaW5uZWFwb2xpcycsJ1VuaXRlZCBTdGF0ZXMnLCdNU1AnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDc0LCdOYXNodmlsbGUnLCdVbml0ZWQgU3RhdGVzJywnQk5BJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg3NSwnTmV3IE9ybGVhbnMnLCdVbml0ZWQgU3RhdGVzJywnTVNZJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg3NiwnTmV3IFlvcmsnLCdVbml0ZWQgU3RhdGVzJywnSkZLJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg3NywnT2tsYWhvbWEgQ2l0eScsJ1VuaXRlZCBTdGF0ZXMnLCdPS0MnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDc4LCdQaGlsYWRlbHBoaWEnLCdVbml0ZWQgU3RhdGVzJywnUEhMJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg3OSwnUGhvZW5peCcsJ1VuaXRlZCBTdGF0ZXMnLCdQSFgnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDgwLCdTYWludCBMb3VpcycsJ1VuaXRlZCBTdGF0ZXMnLCdTVEwnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDgxLCdTYWx0IExha2UgQ2l0eScsJ1VuaXRlZCBTdGF0ZXMnLCdTTEMnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDgyLCdTYW4gQW50b25pbycsJ1VuaXRlZCBTdGF0ZXMnLCdTQVQnLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDgzLCdTYW4gRGllZ28nLCdVbml0ZWQgU3RhdGVzJywnU0FOJywnRW5nbGlzaCcsJ1VTJyk7CitpbnNlcnQgaW50byBDSVRJRVMgVkFMVUVTICg4NCwnU2FuIEZyYW5jaXNjbycsJ1VuaXRlZCBTdGF0ZXMnLCdTRk8nLCdFbmdsaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDg1LCdTYW4gSnVhbicsJ1VuaXRlZCBTdGF0ZXMnLCdTSlUnLCdTcGFuaXNoJywnVVMnKTsKK2luc2VydCBpbnRvIENJVElFUyBWQUxVRVMgKDg2LCdTZWF0dGxlJywnVW5pdGVkIFN0YXRlcycsJ1NFQScsJ0VuZ2xpc2gnLCdVUycpOworaW5zZXJ0IGludG8gQ0lUSUVTIFZBTFVFUyAoODcsJ1dhc2hpbmd0b24sIERDJywnVW5pdGVkIFN0YXRlcycsJ0lBRCcsJ0VuZ2xpc2gnLCdVUycpOwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRDT1VOVFJJRVMuc3FsIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRDT1VOVFJJRVMuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODQwNmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvbG9hZENPVU5UUklFUy5zcWwKQEAgLTAsMCArMSwxMjkgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorLS0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCistLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCistLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorLS0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy0tIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy0tIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCistLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy0tIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy0tIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICggJ0FmZ2hhbmlzdGFuJywnQUYnLCdBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICggJ0FsYmFuaWEnLCdBTCcsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0FsZ2VyaWEnLCdEWicsJ05vcnRoIEFmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0FtZXJpY2FuIFNhbW9hJywnQVMnLCdQYWNpZmljIElzbGFuZHMnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdBbmdvbGEnLCdBTycsJ0FmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0FyZ2VudGluYScsJ0FSJywnU291dGggQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0FybWVuaWEnLCdBTScsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0F1c3RyYWxpYScsJ0FVJywnQXVzdHJhbGlhIGFuZCBOZXcgWmVhbGFuZCcpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0F1c3RyaWEnLCdBVCcsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0F6ZXJiYWlqYW4nLCdBWicsJ0NlbnRyYWwgQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0JhaGFtYXMnLCdCUycsJ0NhcmliYmVhbicpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0JhbmdsYWRlc2gnLCdCRCcsJ0FzaWEnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdCYXJiYWRvcycsJ0JCJywnQ2FyaWJiZWFuJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnQmVsZ2l1bScsJ0JFJywnRXVyb3BlJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnQmVsaXplJywnQlonLCdDZW50cmFsIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdCZXJtdWRhJywnQk0nLCdDYXJpYmJlYW4nKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdCb2xpdmlhJywnQk8nLCdTb3V0aCBBbWVyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnQm90c3dhbmEnLCdCVycsJ0FmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0JyYXppbCcsJ0JSJywnU291dGggQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0J1bGdhcmlhJywnQkcnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdDYW1ib2RpYScsJ0tIJywnQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0NhbWVyb29uJywnQ00nLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdDYW5hZGEnLCdDQScsJ05vcnRoIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdDYXBlIFZlcmRlJywnQ1YnLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdDaGlsZScsJ0NMJywnU291dGggQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0NoaW5hJywnQ04nLCdBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnQ29sb21iaWEnLCdDTycsJ1NvdXRoIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdDb25nbycsJ0NHJywnQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnQ29zdGEgUmljYScsJ0NSJywnQ2VudHJhbCBBbWVyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnQ290ZSBkJydJdm9pcmUnLCdDSScsJ0FmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0N1YmEnLCdDVScsJ0NhcmliYmVhbicpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0N6ZWNoIFJlcHVibGljJywnQ1onLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdEZW5tYXJrJywnREsnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdEb21pbmljYWwgUmVwdWJsaWMnLCdETycsJ0NhcmliYmVhbicpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0VjdWFkb3InLCdFQycsJ1NvdXRoIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdFZ3lwdCcsJ0VHJywnTm9ydGggQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnRWwgU2FsdmFkb3InLCdTVicsJ0NlbnRyYWwgQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0V0aGlvcGlhJywnRVQnLCdOb3J0aCBBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdGYWxrbGFuZCBJc2xhbmRzJywnRksnLCdTb3V0aCBBbWVyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnRmlqaScsJ0ZKJywnUGFjaWZpYyBJc2xhbmRzJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnRmlubGFuZCcsJ0ZJJywnRXVyb3BlJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnRnJhbmNlJywnRlInLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdHZW9yZ2lhJywnR0UnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdHZXJtYW55JywnREUnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdHaGFuYScsJ0dIJywnQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnR3JlZWNlJywnR1InLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdHdWFkZWxvdXBlJywnR1AnLCdDYXJpYmJlYW4nKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdHdWF0ZW1hbGEnLCdHVCcsJ0NlbnRyYWwgQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0hvbmR1cmFzJywnSE4nLCdDZW50cmFsIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdIdW5nYXJ5JywnSFUnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdJY2VsYW5kJywnSVMnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdJbmRpYScsJ0lOJywnQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0luZG9uZXNpYScsJ0lEJywnQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0lyYW4nLCdJUicsJ01pZGRsZSBFYXN0Jyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnSXJhcScsJ0lRJywnTWlkZGxlIEVhc3QnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdJcmVsYW5kJywnSUUnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdJc3JhZWwnLCdJTCcsJ01pZGRsZSBFYXN0Jyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnSXRhbHknLCdJVCcsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0phbWFpY2EnLCdKTScsJ0NhcmliYmVhbicpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0phcGFuJywnSlAnLCdBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnSm9yZGFuJywnSk8nLCdNaWRkbGUgRWFzdCcpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0tlbnlhJywnS0UnLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdLb3JlYSwgUmVwdWJsaWMgb2YnLCdLUicsJ0FzaWEnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdMZWJhbm9uJywnTEInLCdNaWRkbGUgRWFzdCcpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ0xpdGh1YW5pYScsJ0xUJywnRXVyb3BlJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnTWFkYWdhc2NhcicsJ01HJywnQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnTWFsYXlzaWEnLCdNWScsJ0FzaWEnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdNYWxpJywnTUwnLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdNZXhpY28nLCdNWCcsJ05vcnRoIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdNb3JvY2NvJywnTUEnLCdOb3J0aCBBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdNb3phbWJpcXVlJywnTVonLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdOZXBhbCcsJ05QJywnQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ05ldGhlcmxhbmRzJywnTkwnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdOZXcgWmVhbGFuZCcsJ05aJywnQXVzdHJhbGlhIGFuZCBOZXcgWmVhbGFuZCcpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ05pY2FyYWd1YScsJ05JJywnQ2VudHJhbCBBbWVyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnTmlnZXJpYScsJ05HJywnQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnTm9yd2F5JywnTk8nLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdQYWtpc3RhbicsJ1BLJywnQ2VudHJhbCBBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnUGFyYWd1YXknLCdQWScsJ1NvdXRoIEFtZXJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdQZXJ1JywnUEUnLCdTb3V0aCBBbWVyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnUGhpbGlwcGluZXMnLCdQSCcsJ0FzaWEnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdQb2xhbmQnLCdQTCcsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1BvcnR1Z2FsJywnUFQnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdSdXNzaWEnLCdSVScsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1NhbW9hJywnV1MnLCdQYWNpZmljIElzbGFuZHMnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdTZW5lZ2FsJywnU04nLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdTaWVycmEgTGVvbmUnLCdTTCcsJ0FmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1NpbmdhcG9yZScsJ1NHJywnQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1Nsb3Zha2lhJywnU0snLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdTb3V0aCBBZnJpY2EnLCdaQScsJ0FmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1NwYWluJywnRVMnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdTcmkgTGFua2EnLCdMSycsJ0FzaWEnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdTdWRhbicsJ1NEJywnQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnU3dlZGVuJywnU0UnLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdTd2l0emVybGFuZCcsJ0NIJywnRXVyb3BlJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnU3lyaWFuIEFyYWIgUmVwdWJsaWMnLCdTWScsJ01pZGRsZSBFYXN0Jyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVGFqaWtpc3RhbicsJ1RKJywnQ2VudHJhbCBBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVGFuemFuaWEnLCdUWicsJ0FmcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1RoYWlsYW5kJywnVEgnLCdBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVHJpbmlkYWQgYW5kIFRvYmFnbycsJ1RUJywnQ2FyaWJiZWFuJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVHVuaXNpYScsJ1ROJywnTm9ydGggQWZyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVHVya2V5JywnVFInLCdNaWRkbGUgRWFzdCcpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1VrcmFpbmUnLCdVQScsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1VuaXRlZCBLaW5nZG9tJywnR0InLCdFdXJvcGUnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdVbml0ZWQgU3RhdGVzJywnVVMnLCdOb3J0aCBBbWVyaWNhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVXJ1Z3VheScsJ1VZJywnU291dGggQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1V6YmVraXN0YW4nLCdVWicsJ0NlbnRyYWwgQXNpYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1ZlbmV6dWVsYScsJ1ZFJywnU291dGggQW1lcmljYScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1ZpZXQgTmFtJywnVk4nLCdBc2lhJyk7CitpbnNlcnQgaW50byBDT1VOVFJJRVMgdmFsdWVzICgnVmlyZ2luIElzbGFuZHMgKEJyaXRpc2gpJywnVkcnLCdDYXJpYmJlYW4nKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdWaXJnaW4gSXNsYW5kcyAoVS5TLiknLCdWSScsJ0NhcmliYmVhbicpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1l1Z29zbGF2aWEnLCdZVScsJ0V1cm9wZScpOworaW5zZXJ0IGludG8gQ09VTlRSSUVTIHZhbHVlcyAoJ1phaXJlJywnWlInLCdBZnJpY2EnKTsKK2luc2VydCBpbnRvIENPVU5UUklFUyB2YWx1ZXMgKCdaaW1iYWJ3ZScsJ1pXJywnQWZyaWNhJyk7CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvbG9hZEZMSUdIVEFWQUlMQUJJTElUWTEuc3FsIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRGTElHSFRBVkFJTEFCSUxJVFkxLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMxMzRkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRGTElHSFRBVkFJTEFCSUxJVFkxLnNxbApAQCAtMCwwICsxLDMxMCBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCistLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy0tIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKy0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCistLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLS0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLS0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy0tIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLS0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMTYnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTE2JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTExNicsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMTYnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTE2JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMTYnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTE2JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTExNicsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTE2JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTExNicsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMTYnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTE2JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTExNicsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMTYnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTIyJywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyMicsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjInLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTIyJywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyMicsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTIyJywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyMicsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjInLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyMicsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjInLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTIyJywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyMicsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjInLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTIyJywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNCcsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjQnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI0JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNCcsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjQnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNCcsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjQnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI0JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjQnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI0JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNCcsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjQnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI0JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNCcsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjYnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI2JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNicsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjYnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI2JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjYnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI2JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNicsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI2JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNicsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjYnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI2JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyNicsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjYnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI4JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyOCcsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjgnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI4JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyOCcsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI4JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyOCcsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjgnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyOCcsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjgnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI4JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEyOCcsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMjgnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTI4JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEzNCcsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMzQnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTM0JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEzNCcsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMzQnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEzNCcsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMzQnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTM0JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMzQnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTM0JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEzNCcsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExMzQnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTM0JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTEzNCcsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDAnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQwJywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0MCcsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDAnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQwJywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDAnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQwJywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0MCcsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQwJywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0MCcsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDAnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQwJywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0MCcsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDAnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQ4JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0OCcsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDgnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQ4JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0OCcsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQ4JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0OCcsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDgnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0OCcsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDgnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQ4JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE0OCcsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNDgnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTQ4JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1MCcsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTAnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTUwJywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1MCcsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTAnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1MCcsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTAnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTUwJywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTAnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTUwJywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1MCcsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTAnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTUwJywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1MCcsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTgnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTU4JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1OCcsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTgnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTU4JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTgnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTU4JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1OCcsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTU4JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1OCcsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTgnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTU4JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE1OCcsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNTgnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTY4JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE2OCcsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNjgnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTY4JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE2OCcsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTY4JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE2OCcsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNjgnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE2OCcsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNjgnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTY4JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE2OCcsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNjgnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTY4JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3MicsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzInLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTcyJywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3MicsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzInLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3MicsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzInLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTcyJywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzInLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTcyJywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3MicsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzInLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTcyJywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3MicsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzYnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc2JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3NicsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzYnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc2JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzYnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc2JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3NicsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc2JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3NicsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzYnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc2JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3NicsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzYnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc4JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3OCcsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzgnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc4JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3OCcsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc4JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3OCcsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzgnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3OCcsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzgnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc4JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE3OCcsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExNzgnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTc4JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MScsMiwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODEnLDIsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgxJywyLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MScsMiwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODEnLDIsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MScsMiwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODEnLDIsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgxJywyLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODEnLDIsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgxJywyLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MScsMiwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODEnLDIsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgxJywyLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MScsMiwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODInLDIsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgyJywyLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MicsMiwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODInLDIsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgyJywyLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODInLDIsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgyJywyLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MicsMiwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgyJywyLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MicsMiwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODInLDIsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTgyJywyLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4MicsMiwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODInLDIsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTg4JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4OCcsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODgnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTg4JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4OCcsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTg4JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4OCcsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODgnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4OCcsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODgnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTg4JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE4OCcsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExODgnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTg4JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NScsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTUnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk1JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NScsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTUnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NScsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTUnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk1JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTUnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk1JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NScsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTUnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk1JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NScsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTcnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk3JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NycsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTcnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk3JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTcnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk3JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NycsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk3JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NycsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTcnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMTk3JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTE5NycsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTExOTcnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjAzJywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwMycsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDMnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjAzJywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwMycsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjAzJywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwMycsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDMnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwMycsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDMnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjAzJywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwMycsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDMnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjAzJywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwNycsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDcnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjA3JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwNycsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDcnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwNycsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDcnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjA3JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDcnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjA3JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwNycsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMDcnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjA3JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIwNycsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKKyAKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkRkxJR0hUQVZBSUxBQklMSVRZMi5zcWwgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvbG9hZEZMSUdIVEFWQUlMQUJJTElUWTIuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiM2VhZTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvbG9hZEZMSUdIVEFWQUlMQUJJTElUWTIuc3FsCkBAIC0wLDAgKzEsMjM5IEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy0tIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLS0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy0tICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCistLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCistLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCistLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxMScsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTEnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjExJywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxMScsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTEnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxMScsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTEnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjExJywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTEnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjExJywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxMScsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTEnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjExJywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxMScsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTcnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE3JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxNycsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTcnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE3JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTcnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE3JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxNycsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE3JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxNycsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTcnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE3JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxNycsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTcnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE5JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxOScsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTknLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE5JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxOScsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE5JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxOScsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTknLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxOScsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTknLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE5JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxOScsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMTknLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjE5JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyNCcsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjQnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI0JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyNCcsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjQnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyNCcsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjQnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI0JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjQnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI0JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyNCcsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjQnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI0JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyNCcsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjknLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI5JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyOScsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjknLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI5JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjknLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI5JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyOScsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI5JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyOScsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjknLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjI5JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyOScsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjknLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjMxJywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzMScsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzEnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjMxJywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzMScsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjMxJywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzMScsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzEnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzMScsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzEnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjMxJywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzMScsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzEnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjMxJywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzOScsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzknLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjM5JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzOScsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzknLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzOScsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzknLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjM5JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzknLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjM5JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzOScsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMzknLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjM5JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIzOScsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDEnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQxJywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MScsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDEnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQxJywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDEnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQxJywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MScsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQxJywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MScsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDEnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQxJywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MScsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDEnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQzJywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MycsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDMnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQzJywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MycsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQzJywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MycsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDMnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MycsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDMnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQzJywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0MycsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDMnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQzJywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0NycsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDcnLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQ3JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0NycsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDcnLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0NycsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDcnLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQ3JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDcnLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQ3JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0NycsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDcnLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQ3JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI0NycsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTInLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjUyJywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1MicsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTInLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjUyJywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTInLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjUyJywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1MicsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjUyJywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1MicsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTInLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjUyJywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1MicsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTInLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU4JywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OCcsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTgnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU4JywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OCcsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU4JywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OCcsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTgnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OCcsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTgnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU4JywxLCcyMDA0LTA1LTE3JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OCcsMSwnMjAwNC0wNS0xOCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTgnLDEsJzIwMDQtMDUtMjknLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU4JywxLCcyMDA0LTA1LTMwJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OScsMSwnMjAwNC0wMy0zMScsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTknLDEsJzIwMDQtMDQtMTEnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU5JywxLCcyMDA0LTA0LTEyJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OScsMSwnMjAwNC0wNC0xNScsNSw1LDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTknLDEsJzIwMDQtMDQtMjAnLDEwLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OScsMSwnMjAwNC0wNC0yMycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTknLDEsJzIwMDQtMDQtMjQnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU5JywxLCcyMDA0LTA1LTAzJywxMSwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTknLDEsJzIwMDQtMDUtMDUnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU5JywxLCcyMDA0LTA1LTA2JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OScsMSwnMjAwNC0wNS0xNycsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNTknLDEsJzIwMDQtMDUtMTgnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjU5JywxLCcyMDA0LTA1LTI5JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI1OScsMSwnMjAwNC0wNS0zMCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNjUnLDEsJzIwMDQtMDMtMzEnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjY1JywxLCcyMDA0LTA0LTExJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI2NScsMSwnMjAwNC0wNC0xMicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNjUnLDEsJzIwMDQtMDQtMTUnLDUsNSwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjY1JywxLCcyMDA0LTA0LTIwJywxMCwwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNjUnLDEsJzIwMDQtMDQtMjMnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjY1JywxLCcyMDA0LTA0LTI0JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI2NScsMSwnMjAwNC0wNS0wMycsMTEsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjY1JywxLCcyMDA0LTA1LTA1JywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI2NScsMSwnMjAwNC0wNS0wNicsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNjUnLDEsJzIwMDQtMDUtMTcnLDEsMSwxKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjY1JywxLCcyMDA0LTA1LTE4JywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI2NScsMSwnMjAwNC0wNS0yOScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNjUnLDEsJzIwMDQtMDUtMzAnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjcxJywxLCcyMDA0LTAzLTMxJywyLDIsMik7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI3MScsMSwnMjAwNC0wNC0xMScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNzEnLDEsJzIwMDQtMDQtMTInLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjcxJywxLCcyMDA0LTA0LTE1Jyw1LDUsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI3MScsMSwnMjAwNC0wNC0yMCcsMTAsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjcxJywxLCcyMDA0LTA0LTIzJywxLDEsMSk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI3MScsMSwnMjAwNC0wNC0yNCcsMiwyLDIpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNzEnLDEsJzIwMDQtMDUtMDMnLDExLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI3MScsMSwnMjAwNC0wNS0wNScsMSwxLDEpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNzEnLDEsJzIwMDQtMDUtMDYnLDIsMiwyKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjkwJywxLCcyMDA0LTA0LTA1JywzLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTI4NScsMSwnMjAwNC0wNC0xMScsMywwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyMjMnLDIsJzIwMDQtMDQtMTEnLDMsMCwwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnVVMxNTUyJywxLCcyMDA0LTA0LTE5JywzLDAsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIyMScsMSwnMjAwNC0wNC0xOScsMywwLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdVUzE1MTgnLDEsJzIwMDQtMDQtMTInLDAsMCwzKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnVVMxNTE4JywyLCcyMDA0LTA0LTEyJywwLDAsMyk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ1VTMTQ5OScsMSwnMjAwNC0wNC0yNScsMCwwLDMpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdVUzE0MDQnLDEsJzIwMDQtMDQtMzAnLDAsMywwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnVVMxNTE5JywyLCcyMDA0LTA0LTMwJywwLDMsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ1VTMTU2MCcsMSwnMjAwNC0wNC0yNScsMCwzLDApOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdVUzEyNzYnLDIsJzIwMDQtMDUtMDUnLDAsMywwKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnVVMxNDM5JywxLCcyMDA0LTA1LTE1JywwLDMsMCk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ0FBMTIxOScsMSwnMjAwNC0wNC0wMicsMCwwLDMpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdBQTEyNDgnLDEsJzIwMDQtMDQtMDInLDAsMCwzKTsgCitpbnNlcnQgaW50byBGTElHSFRBVkFJTEFCSUxJVFkgdmFsdWVzICgnQUExMjQ1JywxLCcyMDA0LTA0LTEwJywwLDAsMyk7IAoraW5zZXJ0IGludG8gRkxJR0hUQVZBSUxBQklMSVRZIHZhbHVlcyAoJ1VTMTQzNScsMSwnMjAwNC0wNC0xOCcsMCwwLDMpOyAKK2luc2VydCBpbnRvIEZMSUdIVEFWQUlMQUJJTElUWSB2YWx1ZXMgKCdVUzEzNTcnLDIsJzIwMDQtMDQtMTgnLDAsMCwzKTsgCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvbG9hZEZMSUdIVFMxLnNxbCBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkRkxJR0hUUzEuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTJmMWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YS9yZXZlcnNlbWFwcGluZy9zY2hlbWEvbG9hZEZMSUdIVFMxLnNxbApAQCAtMCwwICsxLDI3NCBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCistLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy0tIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKy0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCistLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLS0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLS0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy0tIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLS0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTExJywxLCdBQlEnLCcwOTowMDowMCcsJ0xBWCcsJzA5OjE5OjAwJywnUycsMS4zMjgsNjY0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMTInLDEsJ0xBWCcsJzA5OjAwOjAwJywnQUJRJywnMTE6MTk6MDAnLCdTJywxLjMyOCw2NjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTExMycsMSwnQUJRJywnMDk6MDA6MDAnLCdQSFgnLCcwOTozOTowMCcsJ1MnLDAuNjU4LDMyOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTE0JywxLCdQSFgnLCcwOTowMDowMCcsJ0FCUScsJzA5OjM5OjAwJywnUycsMC42NTgsMzI5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMTUnLDEsJ0FCUScsJzA5OjAwOjAwJywnT0tDJywnMTE6MDI6MDAnLCdCJywxLjAzNCw1MTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTExNicsMSwnT0tDJywnMDk6MDA6MDAnLCdBQlEnLCcwOTowMjowMCcsJ0InLDEuMDM0LDUxNywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTE3JywxLCdBS0wnLCcwOTowMDowMCcsJ0hOTCcsJzE4OjQ4OjAwJywnTCcsOC44MDQsNDQwMiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTE4JywxLCdITkwnLCcxMzozMDowMCcsJ0FLTCcsJzIxOjE4OjAwJywnRCcsOC44MDQsNDQwMiwnREMxMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTE5JywxLCdBS0wnLCcwOTowMDowMCcsJ05SVCcsJzE1OjU5OjAwJywnTCcsMTAuOTk2LDU0OTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTEyMCcsMSwnTlJUJywnMDk6MDA6MDAnLCdBS0wnLCcyMzo1OTowMCcsJ0wnLDEwLjk5Niw1NDk4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMjEnLDEsJ0FLTCcsJzA5OjAwOjAwJywnU1lEJywnMDk6NDA6MDAnLCdCJywyLjY4MiwxMzQxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMjInLDEsJ1NZRCcsJzA5OjAwOjAwJywnQUtMJywnMTM6NDA6MDAnLCdMJywyLjY4MiwxMzQxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMjMnLDEsJ0FMQicsJzA5OjAwOjAwJywnSkZLJywnMDk6MTY6MDAnLCdTJywwLjI3LDEzNSwnREMxMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTI0JywxLCdKRksnLCcwOTowMDowMCcsJ0FMQicsJzA5OjE2OjAwJywnUycsMC4yNywxMzUsJ0RDMTAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTEyNScsMSwnQUxCJywnMDc6MDA6MDAnLCdCT1MnLCcwNzoxNjowMCcsJ1MnLDAuMjc4LDEzOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTI2JywxLCdCT1MnLCcxNDowMDowMCcsJ0FMQicsJzE0OjE2OjAwJywnUycsMC4yNzgsMTM5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMjcnLDEsJ0FMQicsJzA5OjAwOjAwJywnSUFEJywnMDk6MzI6MDAnLCdTJywwLjU0OCwyNzQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTEyOCcsMSwnSUFEJywnMDk6MDA6MDAnLCdBTEInLCcwOTozMjowMCcsJ1MnLDAuNTQ4LDI3NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTE3JywxLCdBTVMnLCcwOTowMDowMCcsJ0pGSycsJzEwOjE3OjAwJywnQicsNy4yOTYsMzY0OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTE2JywyLCdKRksnLCcyMDo1OTowMCcsJ0FNUycsJzEwOjE2OjAwJywnTCcsNy4yOTYsMzY0OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTMxJywxLCdBTVMnLCcwOTowMDowMCcsJ0FUSCcsJzEyOjQxOjAwJywnTCcsMi42ODgsMTM0NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTMyJywxLCdBVEgnLCcwOTowMDowMCcsJ0FNUycsJzEwOjQxOjAwJywnQicsMi42ODgsMTM0NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTMzJywxLCdBTVMnLCcwOTowMDowMCcsJ0NERycsJzA5OjMxOjAwJywnUycsMC41MzIsMjY2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMzQnLDEsJ0NERycsJzA5OjAwOjAwJywnQU1TJywnMDk6MzE6MDAnLCdTJywwLjUzMiwyNjYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTEzNScsMSwnQVJOJywnMDk6MDA6MDAnLCdCT1MnLCcxMTowNzowMCcsJ0wnLDguMTI2LDQwNjMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTEzNicsMSwnQk9TJywnMjI6MDA6MDAnLCdBUk4nLCcxMjowNzowMCcsJ0wnLDguMTI2LDQwNjMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTEzNycsMSwnQVJOJywnMDk6MDA6MDAnLCdTVk8nLCcxMjo1MTowMCcsJ0InLDEuODU4LDkyOSwnQTMyMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTM4JywyLCdTVk8nLCcxNjowMDowMCcsJ0FSTicsJzE1OjUxOjAwJywnUycsMS44NTgsOTI5LCdBMzIwJyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMzknLDEsJ0FSTicsJzA5OjAwOjAwJywnQ1BIJywnMDk6NTk6MDAnLCdTJywwLjk4OCw0OTQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE0MCcsMSwnQ1BIJywnMDk6MDA6MDAnLCdBUk4nLCcwOTo1OTowMCcsJ1MnLDAuOTg4LDQ5NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTQxJywxLCdBVEgnLCcwOTowMDowMCcsJ0xIUicsJzA5OjU4OjAwJywnQicsMi45NzQsMTQ4NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTQyJywxLCdMSFInLCcwOTowMDowMCcsJ0FUSCcsJzEzOjU4OjAwJywnTCcsMi45NzQsMTQ4NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTQzJywxLCdBVEgnLCcwOTowMDowMCcsJ0NBSScsJzEwOjIzOjAwJywnQicsMS4zOTQsNjk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNDQnLDEsJ0NBSScsJzA5OjAwOjAwJywnQVRIJywnMTA6MjM6MDAnLCdCJywxLjM5NCw2OTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE0NScsMSwnQVRIJywnMDk6MDA6MDAnLCdDREcnLCcxMDozNjowMCcsJ0InLDIuNjA4LDEzMDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE0NicsMSwnQ0RHJywnMDk6MDA6MDAnLCdBVEgnLCcxMjozNjowMCcsJ0wnLDIuNjA4LDEzMDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE0NycsMSwnQVRMJywnMDk6MDA6MDAnLCdMQVgnLCcwOTo1MjowMCcsJ0InLDMuODcsMTkzNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTQ4JywxLCdMQVgnLCcwOTowMDowMCcsJ0FUTCcsJzE1OjUyOjAwJywnTCcsMy44NywxOTM1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNDknLDEsJ0FUTCcsJzA5OjAwOjAwJywnREZXJywnMDk6MjY6MDAnLCdCJywxLjQ0Miw3MjEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE1MCcsMSwnREZXJywnMDk6MDA6MDAnLCdBVEwnLCcxMToyNjowMCcsJ0InLDEuNDQyLDcyMSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTUxJywxLCdBVEwnLCcwOTowMDowMCcsJ1NFQScsJzEwOjIxOjAwJywnQicsNC4zNiwyMTgwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNTInLDEsJ1NFQScsJzEyOjAwOjAwJywnQVRMJywnMTk6MjE6MDAnLCdMJyw0LjM2LDIxODAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE1MycsMSwnQkVZJywnMDk6MDA6MDAnLCdDQUknLCcwOTo0MzowMCcsJ1MnLDAuNzI2LDM2MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTU0JywxLCdDQUknLCcxMTowMDowMCcsJ0JFWScsJzExOjQzOjAwJywnUycsMC43MjYsMzYzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNzAnLDEsJ0JFWScsJzA5OjAwOjAwJywnTUFEJywnMTI6MjI6MDAnLCdMJyw0LjM3NiwyMTg4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNjknLDIsJ01BRCcsJzEyOjI1OjAwJywnQkVZJywnMTc6NDc6MDAnLCdMJyw0LjM3NiwyMTg4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNTcnLDEsJ0JFWScsJzA5OjAwOjAwJywnQk9NJywnMTc6MzE6MDAnLCdMJyw1LjAyNiwyNTEzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNTgnLDEsJ0JPTScsJzA5OjAwOjAwJywnQkVZJywnMTA6MzE6MDAnLCdMJyw1LjAyNiwyNTEzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNTknLDEsJ0JOQScsJzA5OjAwOjAwJywnTUlBJywnMTE6Mzc6MDAnLCdCJywxLjYzLDgxNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTYwJywxLCdNSUEnLCcwOTowMDowMCcsJ0JOQScsJzA5OjM3OjAwJywnQicsMS42Myw4MTUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE2MScsMSwnQk5BJywnMDk6MDA6MDAnLCdKRksnLCcxMTozMTowMCcsJ0wnLDEuNTE4LDc1OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTYyJywxLCdKRksnLCcwOTowMDowMCcsJ0JOQScsJzA5OjMxOjAwJywnTCcsMS41MTgsNzU5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNjMnLDEsJ0JOQScsJzA5OjAwOjAwJywnQ0hTJywnMTA6NTQ6MDAnLCdCJywwLjkxLDQ1NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTY0JywxLCdHSUcnLCcwOTowMDowMCcsJ0JOQScsJzE1OjU3OjAwJywnTCcsOS45NjQsNDk4MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTkxJywxLCdCT0cnLCcwOTowMDowMCcsJ01JQScsJzEyOjAyOjAwJywnTCcsMy4wNCwxNTIwLCdEQzEwJyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExOTAnLDIsJ01JQScsJzEyOjEzOjAwJywnQk9HJywnMTU6MTU6MDAnLCdMJywzLjA0LDE1MjAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE2NycsMSwnQk9HJywnMDk6MDA6MDAnLCdMSU0nLCcxMToyMDowMCcsJ0InLDIuMzM4LDExNjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE2OCcsMSwnTElNJywnMDg6MDA6MDAnLCdCT0cnLCcxMDoyMDowMCcsJ0InLDIuMzM4LDExNjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE2OScsMSwnQk9HJywnMDk6MDA6MDAnLCdHSUcnLCcxNjozODowMCcsJ0wnLDUuNjQ4LDI4MjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE3MCcsMSwnR0lHJywnMDk6MDA6MDAnLCdCT0cnLCcxMjozODowMCcsJ0wnLDUuNjQ4LDI4MjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE3MScsMSwnQk9JJywnMDk6MDA6MDAnLCdTRUEnLCcwODo0ODowMCcsJ1MnLDAuODA4LDQwNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTcyJywxLCdTRUEnLCcwOTowMDowMCcsJ0JPSScsJzEwOjQ4OjAwJywnUycsMC44MDgsNDA0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNzMnLDEsJ0JPSScsJzA5OjAwOjAwJywnRFNNJywnMTI6MTg6MDAnLCdMJywyLjMxLDExNTUsJ0EzMjAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE3NCcsMSwnRFNNJywnMDk6MDA6MDAnLCdCT0knLCcxMDoxODowMCcsJ0InLDIuMzEsMTE1NSwnQTMyMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTc1JywxLCdCT0knLCcwOTowMDowMCcsJ0hMTicsJzA5OjM0OjAwJywnUycsMC41OCwyOTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE3NicsMSwnSExOJywnMDk6MDA6MDAnLCdCT0knLCcwOTozNDowMCcsJ1MnLDAuNTgsMjkwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNzcnLDEsJ0JPTScsJzA5OjAwOjAwJywnQ0NVJywnMTE6MDM6MDAnLCdCJywyLjA2NiwxMDMzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNzgnLDEsJ0NDVScsJzA5OjAwOjAwJywnQk9NJywnMTE6MDM6MDAnLCdCJywyLjA2NiwxMDMzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExNzknLDEsJ0JPTScsJzA5OjAwOjAwJywnS0hJJywnMDk6MzY6MDAnLCdCJywxLjEwMiw1NTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE4MCcsMSwnS0hJJywnMDk6MDA6MDAnLCdCT00nLCcxMDozNjowMCcsJ0InLDEuMTAyLDU1MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTgxJywxLCdCT00nLCcwOTowMDowMCcsJ0hLRycsJzE2OjUxOjAwJywnTCcsNS4zNTQsMjY3NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTgyJywyLCdIS0cnLCcxMToxNTowMCcsJ0JPTScsJzE0OjA2OjAwJywnTCcsNS4zNTQsMjY3NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTgzJywxLCdCT1MnLCcwOTowMDowMCcsJ1NGTycsJzExOjIzOjAwJywnTCcsNS4zOSwyNjk1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExODQnLDEsJ1NGTycsJzA5OjAwOjAwJywnQk9TJywnMTc6MjM6MDAnLCdMJyw1LjM5LDI2OTUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE4NScsMSwnQk9TJywnMDk6MDA6MDAnLCdNSUEnLCcxMTozMTowMCcsJ0InLDIuNTE4LDEyNTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE4NicsMiwnTUlBJywnMTA6NDA6MDAnLCdCT1MnLCcxMzoxMTowMCcsJ0wnLDIuNTE4LDEyNTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE4NycsMSwnQk9TJywnMDk6MDA6MDAnLCdJQUQnLCcwOToyOTowMCcsJ1MnLDAuNDksMjQ1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExODgnLDEsJ0lBRCcsJzA5OjAwOjAwJywnQk9TJywnMDk6Mjk6MDAnLCdTJywwLjQ5LDI0NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTg5JywxLCdCVUQnLCcwOTowMDowMCcsJ0dWQScsJzEwOjEzOjAwJywnQicsMS4yMzIsNjE2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExOTAnLDEsJ0dWQScsJzA5OjAwOjAwJywnQlVEJywnMTA6MTM6MDAnLCdCJywxLjIzMiw2MTYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE5MScsMSwnQlVEJywnMDk6MDA6MDAnLCdTVk8nLCcxMjo1NjowMCcsJ0wnLDEuOTQ2LDk3MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTkyJywxLCdTVk8nLCcwOTowMDowMCcsJ0JVRCcsJzA4OjU2OjAwJywnQicsMS45NDYsOTczLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExOTMnLDEsJ0JVRCcsJzA5OjAwOjAwJywnRkNPJywnMTA6MDA6MDAnLCdCJywxLjAwOCw1MDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE5NCcsMSwnRkNPJywnMDk6MDA6MDAnLCdCVUQnLCcxMDowMDowMCcsJ0InLDEuMDA4LDUwNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTk1JywxLCdDQUknLCcwOTowMDowMCcsJ0NBUycsJzExOjMzOjAwJywnQicsNC41NjIsMjI4MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTk2JywxLCdNSUEnLCcwOTowMDowMCcsJ0NBSScsJzA0OjU5OjAwJywnRCcsMTIuOTg0LDY0OTIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE5NycsMSwnQ0FJJywnMDk6MDA6MDAnLCdJU1QnLCcxMDozMjowMCcsJ0InLDEuNTM4LDc2OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTk4JywxLCdJU1QnLCcwOTowMDowMCcsJ0NBSScsJzEwOjMyOjAwJywnQicsMS41MzgsNzY5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExOTknLDEsJ0NBSScsJzA5OjAwOjAwJywnS0JMJywnMTY6Mjc6MDAnLCdMJyw0LjQ1NCwyMjI3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMDAnLDEsJ0dJRycsJzA5OjAwOjAwJywnQ0FJJywnMDI6MTg6MDAnLCdEJywxMi4zMDgsNjE1NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjAxJywxLCdDQVMnLCcwOTowMDowMCcsJ0tISScsJzIyOjU0OjAwJywnTCcsOC45LDQ0NTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIwMicsMSwnS0hJJywnMDk6MDA6MDAnLCdDQVMnLCcxMjo1NDowMCcsJ0wnLDguOSw0NDUwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMDMnLDEsJ0NBUycsJzA5OjAwOjAwJywnTE9TJywnMTQ6MDA6MDAnLCdMJyw0LjAwNiwyMDAzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMDQnLDEsJ0xPUycsJzA5OjAwOjAwJywnQ0FTJywnMTI6MDA6MDAnLCdMJyw0LjAwNiwyMDAzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMDUnLDEsJ0NBUycsJzA5OjAwOjAwJywnTUFEJywnMTE6MDI6MDAnLCdCJywxLjAzNiw1MTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIwNicsMSwnTUFEJywnMDk6MDA6MDAnLCdDQVMnLCcwOTowMjowMCcsJ0InLDEuMDM2LDUxOCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjA3JywxLCdDQ1MnLCcwOTowMDowMCcsJ1NDTCcsJzE2OjA1OjAwJywnTCcsNi4wOTgsMzA0OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjA4JywxLCdTQ0wnLCcwOTowMDowMCcsJ0NDUycsJzE0OjA1OjAwJywnTCcsNi4wOTgsMzA0OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjA5JywxLCdDQ1MnLCcwOTowMDowMCcsJ01FWCcsJzExOjI4OjAwJywnTCcsNC40NywyMjM1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMTAnLDEsJ01FWCcsJzA5OjAwOjAwJywnQ0NTJywnMTU6Mjg6MDAnLCdMJyw0LjQ3LDIyMzUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxMScsMSwnQ0NTJywnMDk6MDA6MDAnLCdCVUUnLCcxNzoyMDowMCcsJ0wnLDYuMzM2LDMxNjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxMicsMSwnQlVFJywnMDk6MDA6MDAnLCdDQ1MnLCcxMzoyMDowMCcsJ0wnLDYuMzM2LDMxNjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxMycsMSwnQ0NVJywnMDk6MDA6MDAnLCdIS0cnLCcxNDo0NzowMCcsJ0wnLDMuMjk0LDE2NDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxNCcsMiwnSEtHJywnMTA6MzA6MDAnLCdDQ1UnLCcxMToxNzowMCcsJ0wnLDMuMjk0LDE2NDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxNScsMSwnQ0NVJywnMDk6MDA6MDAnLCdOUlQnLCcxODo1MzowMCcsJ0wnLDYuMzk2LDMxOTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxNicsMSwnTlJUJywnMDk6MDA6MDAnLCdDQ1UnLCcxMTo1MzowMCcsJ0wnLDYuMzk2LDMxOTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIxNycsMSwnQ0NVJywnMDk6MDA6MDAnLCdTSU4nLCcxNTowNjowMCcsJ0wnLDMuNiwxODAwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMTgnLDEsJ1NJTicsJzA5OjAwOjAwJywnQ0NVJywnMTA6MDY6MDAnLCdMJywzLjYsMTgwMCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjE5JywxLCdDREcnLCcwOTowMDowMCcsJ0xIUicsJzA4OjI1OjAwJywnUycsMC40MjIsMjExLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMjAnLDEsJ0xIUicsJzA5OjAwOjAwJywnQ0RHJywnMTA6MjU6MDAnLCdTJywwLjQyMiwyMTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyMScsMSwnQ0RHJywnMTg6MDA6MDAnLCdKRksnLCcxOToxNTowMCcsJ0QnLDcuMjU4LDM2MjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyMicsMSwnSkZLJywnMDk6MDA6MDAnLCdDREcnLCcyMjoxNTowMCcsJ0wnLDcuMjU4LDM2MjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyMycsMiwnQ0RHJywnMTM6NDA6MDAnLCdTVk8nLCcxODo0NTowMCcsJ0wnLDMuMDksMTU0NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjI0JywxLCdTVk8nLCcwOTowMDowMCcsJ0NERycsJzEwOjA1OjAwJywnQicsMy4wOSwxNTQ1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMjUnLDEsJ0NIUycsJzA5OjAwOjAwJywnQVRMJywnMDk6MzE6MDAnLCdTJywwLjUzMiwyNjYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyNicsMSwnQVRMJywnMDk6MDA6MDAnLCdDSFMnLCcwOTozMTowMCcsJ1MnLDAuNTMyLDI2NiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjI3JywxLCdDSFMnLCcxMTowMDowMCcsJ01DSScsJzExOjUxOjAwJywnUycsMS44NTYsOTI4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMjgnLDEsJ01DSScsJzA5OjAwOjAwJywnQ0hTJywnMTE6NTE6MDAnLCdMJywxLjg1Niw5MjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyOScsMSwnQ0hTJywnMDk6MDA6MDAnLCdNU1knLCcwOToxNTowMCcsJ0wnLDEuMjU2LDYyOCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjMwJywxLCdNU1knLCcwOTowMDowMCcsJ0NIUycsJzExOjE1OjAwJywnTCcsMS4yNTYsNjI4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMzEnLDEsJ0NMRScsJzA5OjAwOjAwJywnTEFYJywnMTA6MDU6MDAnLCdMJyw0LjA5MiwyMDQ2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMzInLDEsJ0xBWCcsJzA5OjAwOjAwJywnQ0xFJywnMTY6MDU6MDAnLCdMJyw0LjA5MiwyMDQ2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMzMnLDEsJ0NMRScsJzA5OjAwOjAwJywnREZXJywnMTA6MDM6MDAnLCdMJywyLjA1MiwxMDI2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMzQnLDEsJ0RGVycsJzA5OjAwOjAwJywnQ0xFJywnMTI6MDM6MDAnLCdMJywyLjA1MiwxMDI2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMzUnLDEsJ0NMRScsJzA5OjAwOjAwJywnTURXJywnMDg6Mzc6MDAnLCdTJywwLjYxOCwzMDksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIzNicsMSwnTURXJywnMDk6MDA6MDAnLCdDTEUnLCcxMDozNzowMCcsJ1MnLDAuNjE4LDMwOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjM3JywxLCdDUEgnLCcwOTowMDowMCcsJ0ZDTycsJzEwOjU0OjAwJywnTCcsMS45MDQsOTUyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMzgnLDEsJ0ZDTycsJzA5OjAwOjAwJywnQ1BIJywnMTA6NTQ6MDAnLCdMJywxLjkwNCw5NTIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIzOScsMSwnQ1BIJywnMDk6MDA6MDAnLCdSRVknLCcxMDozNzowMCcsJ0wnLDIuNjIyLDEzMTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI0MCcsMSwnUkVZJywnMDk6MDA6MDAnLCdDUEgnLCcxMjozNzowMCcsJ0wnLDIuNjIyLDEzMTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI0MScsMSwnQ1BIJywnMDk6MDA6MDAnLCdDREcnLCcxMDoxNjowMCcsJ0wnLDEuMjc2LDYzOCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjQyJywxLCdDREcnLCcwOTowMDowMCcsJ0NQSCcsJzEwOjE2OjAwJywnTCcsMS4yNzYsNjM4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNDMnLDEsJ0NQVCcsJzA5OjAwOjAwJywnTE9TJywnMTM6NTU6MDAnLCdMJyw1LjkyLDI5NjAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI0NCcsMSwnTE9TJywnMDk6MDA6MDAnLCdDUFQnLCcxNTo1NTowMCcsJ0wnLDUuOTIsMjk2MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjQ1JywxLCdDUFQnLCcwOTowMDowMCcsJ05CTycsJzE1OjA2OjAwJywnTCcsNS4xMDIsMjU1MSwnREMxMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjQ2JywxLCdOQk8nLCcwOTowMDowMCcsJ0NQVCcsJzEzOjA2OjAwJywnTCcsNS4xMDIsMjU1MSwnREMxMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjQ3JywxLCdDUFQnLCcwOTowMDowMCcsJ0xIUicsJzE5OjAxOjAwJywnTCcsMTIuMDI2LDYwMTMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI0OCcsMSwnTEhSJywnMDk6MDA6MDAnLCdDUFQnLCcyMzowMTowMCcsJ0wnLDEyLjAyNiw2MDEzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNDknLDIsJ0RFTicsJzEwOjMwOjAwJywnU0VBJywnMTE6MzI6MDAnLCdMJywyLjA0LDEwMjAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1MCcsMSwnU0VBJywnMDk6MDA6MDAnLCdERU4nLCcxMjowMjowMCcsJ0wnLDIuMDQsMTAyMCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjUxJywyLCdERU4nLCcxMDowMzowMCcsJ0JPSScsJzExOjE5OjAwJywnTCcsMS4yNzYsNjM4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNTInLDEsJ0JPSScsJzA5OjAwOjAwJywnREVOJywnMTA6MTY6MDAnLCdMJywxLjI3Niw2MzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1MycsMSwnREVOJywnMDk6MDA6MDAnLCdKRksnLCcxNDoxNTowMCcsJ0wnLDMuMjU4LDE2MjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1NCcsMSwnSkZLJywnMDk6MDA6MDAnLCdERU4nLCcxMDoxNTowMCcsJ0wnLDMuMjU4LDE2MjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1NScsMSwnREZXJywnMDk6MDA6MDAnLCdTQVQnLCcwOTozMDowMCcsJ1MnLDAuNTA2LDI1MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjU2JywxLCdTQVQnLCcwOTowMDowMCcsJ0RGVycsJzA5OjMwOjAwJywnUycsMC41MDYsMjUzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNTcnLDEsJ0RGVycsJzA5OjAwOjAwJywnQVRMJywnMTE6MjY6MDAnLCdMJywxLjQ0Miw3MjEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1OCcsMiwnQVRMJywnMTE6MDU6MDAnLCdERlcnLCcxMTozMTowMCcsJ0wnLDEuNDQyLDcyMSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjU5JywxLCdERlcnLCcwOTowMDowMCcsJ01JQScsJzEyOjEzOjAwJywnTCcsMi4yMTgsMTEwOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjYwJywxLCdNSUEnLCcwOTowMDowMCcsJ0RGVycsJzEwOjEzOjAwJywnTCcsMi4yMTgsMTEwOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjYxJywxLCdEU00nLCcwOTowMDowMCcsJ01EVycsJzA5OjM2OjAwJywnUycsMC42MTIsMzA2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNjInLDEsJ01EVycsJzA5OjAwOjAwJywnRFNNJywnMDk6MzY6MDAnLCdTJywwLjYxMiwzMDYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI2MycsMSwnRFNNJywnMDk6MDA6MDAnLCdTTEMnLCcwOTo1MzowMCcsJ0wnLDEuOSw5NTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI2NCcsMSwnU0xDJywnMDk6MDA6MDAnLCdEU00nLCcxMTo1MzowMCcsJ0wnLDEuOSw5NTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI2NScsMSwnRFNNJywnMDk6MDA6MDAnLCdPS0MnLCcwOTo1NjowMCcsJ0wnLDAuOTQsNDcwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNjYnLDEsJ09LQycsJzA5OjAwOjAwJywnRFNNJywnMDk6NTY6MDAnLCdMJywwLjk0LDQ3MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjY3JywxLCdEVUInLCcwOTowMDowMCcsJ0xIUicsJzA5OjM0OjAwJywnUycsMC41NzQsMjg3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNjgnLDEsJ0xIUicsJzA5OjAwOjAwJywnRFVCJywnMDk6MzQ6MDAnLCdTJywwLjU3NCwyODcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI2OScsMSwnRFVCJywnMDk6MDA6MDAnLCdNQUQnLCcxMTo0ODowMCcsJ0wnLDEuODA0LDkwMiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjcwJywyLCdNQUQnLCcxMzoxMDowMCcsJ0RVQicsJzEzOjU4OjAwJywnTCcsMS44MDQsOTAyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNzEnLDEsJ0RVQicsJzA5OjAwOjAwJywnQ0RHJywnMTA6NTc6MDAnLCdMJywwLjk2Niw0ODMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI3MicsMSwnQ0RHJywnMDk6MDA6MDAnLCdEVUInLCcwODo1NzowMCcsJ0wnLDAuOTY2LDQ4MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjczJywxLCdCVUUnLCcwOTowMDowMCcsJ1NDTCcsJzA5OjI0OjAwJywnTCcsMS40MDgsNzA0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNzQnLDEsJ1NDTCcsJzA5OjAwOjAwJywnQlVFJywnMTE6MjQ6MDAnLCdMJywxLjQwOCw3MDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI3NScsMSwnQlVFJywnMDk6MDA6MDAnLCdHUlUnLCcxMDowNTowMCcsJ0wnLDIuMDksMTA0NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjc2JywxLCdHUlUnLCcwOTowMDowMCcsJ0JVRScsJzEyOjA1OjAwJywnTCcsMi4wOSwxMDQ1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDknLDEsJ0JVRScsJzIzOjAwOjAwJywnTUlBJywnMDQ6NDk6MDAnLCdMJyw4LjgyNiw0NDEzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDgnLDIsJ01JQScsJzE4OjMwOjAwJywnQlVFJywnMDY6MTk6MDAnLCdMJyw4LjgyNiw0NDEzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNzknLDEsJ0ZBSScsJzA5OjAwOjAwJywnSk5VJywnMTA6MTU6MDAnLCdMJywxLjI1NCw2MjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI4MCcsMSwnSk5VJywnMDk6MDA6MDAnLCdGQUknLCcxMDoxNTowMCcsJ0wnLDEuMjU0LDYyNywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjgxJywxLCdGQUknLCcwOTowMDowMCcsJ1NFQScsJzEzOjAyOjAwJywnTCcsMy4wMzgsMTUxOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjgyJywxLCdTRUEnLCcwOTowMDowMCcsJ0ZBSScsJzExOjAyOjAwJywnTCcsMy4wMzgsMTUxOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDQzJywxLCdGQUknLCcwOTowMDowMCcsJ05SVCcsJzEwOjAxOjAwJywnTCcsNy4wMjYsMzUxMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDQ0JywyLCdOUlQnLCcxNDowNTowMCcsJ0ZBSScsJzAzOjA2OjAwJywnTCcsNy4wMjYsMzUxMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjg1JywxLCdGQ08nLCcwOTowMDowMCcsJ0NERycsJzEwOjIyOjAwJywnTCcsMS4zNzYsNjg4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyODYnLDEsJ0NERycsJzA5OjAwOjAwJywnRkNPJywnMTA6MjI6MDAnLCdMJywxLjM3Niw2ODgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI4NycsMSwnRkNPJywnMDk6MDA6MDAnLCdDQUknLCcxMjozOTowMCcsJ0wnLDIuNjU0LDEzMjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI4OCcsMSwnQ0FJJywnMDk6MDA6MDAnLCdGQ08nLCcxMDozOTowMCcsJ0wnLDIuNjU0LDEzMjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI4OScsMSwnRkNPJywnMTM6MDA6MDAnLCdKRksnLCcxNTozNDowMCcsJ0wnLDguNTcsNDI4NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjkwJywxLCdKRksnLCcyMzowMDowMCcsJ0ZDTycsJzEzOjM0OjAwJywnTCcsOC41Nyw0Mjg1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyOTEnLDEsJ0dJRycsJzEzOjAwOjAwJywnTUlBJywnMTk6MjI6MDAnLCdMJyw4LjM3LDQxODUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI5MicsMSwnTUlBJywnMTM6MDA6MDAnLCdHSUcnLCcyMzoyMjowMCcsJ0wnLDguMzcsNDE4NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjkzJywxLCdHSUcnLCcwOTowMDowMCcsJ0xJTScsJzExOjQxOjAwJywnTCcsNC42OTQsMjM0NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjk0JywxLCdMSU0nLCcxNTowMDowMCcsJ0dJRycsJzIxOjQxOjAwJywnTCcsNC42OTQsMjM0NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjk1JywxLCdHSUcnLCcwOTowMDowMCcsJ0JVRScsJzEyOjI2OjAwJywnTCcsMi40NCwxMjIwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyOTYnLDEsJ0JVRScsJzA5OjAwOjAwJywnR0lHJywnMTA6MjY6MDAnLCdMJywyLjQ0LDEyMjAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI0OScsMSwnR1JVJywnMDk6MDA6MDAnLCdDQ1MnLCcxMzoyNjowMCcsJ0wnLDUuNDQ4LDI3MjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI1MCcsMSwnQ0NTJywnMDk6MDA6MDAnLCdHUlUnLCcxNToyNjowMCcsJ0wnLDUuNDQ4LDI3MjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI1MScsMSwnR1JVJywnMDk6MDA6MDAnLCdKRksnLCcxNjozMzowMCcsJ0wnLDkuNTU2LDQ3NzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI1MicsMSwnSkZLJywnMDk6MDA6MDAnLCdHUlUnLCcyMDozMzowMCcsJ0wnLDkuNTU2LDQ3NzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI1MycsMSwnR1JVJywnMDk6MDA6MDAnLCdMQVgnLCcxNjoxOTowMCcsJ0wnLDEyLjMyMiw2MTYxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNTQnLDEsJ0xBWCcsJzA5OjAwOjAwJywnR1JVJywnMDI6MTk6MDAnLCdMJywxMi4zMjIsNjE2MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMDUzJywxLCdHUlUnLCcwOTowMDowMCcsJ0xJTScsJzExOjE3OjAwJywnTCcsNC4yOTgsMjE0OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMDU0JywxLCdMSU0nLCcxNDowMDowMCcsJ0dSVScsJzIwOjE3OjAwJywnTCcsNC4yOTgsMjE0OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjU1JywxLCdHVkEnLCcwOTowMDowMCcsJ0NQSCcsJzEwOjI1OjAwJywnTCcsMS40MjIsNzExLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNTYnLDEsJ0NQSCcsJzA5OjAwOjAwJywnR1ZBJywnMTA6MjU6MDAnLCdMJywxLjQyMiw3MTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI1NycsMSwnR1ZBJywnMDk6MDA6MDAnLCdMSVMnLCcwOTo1MjowMCcsJ0wnLDEuODY4LDkzNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjU4JywxLCdMSVMnLCcwOTowMDowMCcsJ0dWQScsJzExOjUyOjAwJywnTCcsMS44NjgsOTM0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNTknLDEsJ0dWQScsJzA5OjAwOjAwJywnT1NMJywnMTA6NTY6MDAnLCdMJywxLjkzNCw5NjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI2MCcsMSwnT1NMJywnMDk6MDA6MDAnLCdHVkEnLCcxMDo1NjowMCcsJ0wnLDEuOTM0LDk2NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMTgxJywyLCdIS0cnLCcxNzoxNTowMCcsJ1NIQScsJzE4OjQ1OjAwJywnTCcsMS41MTQsNzU3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExODInLDEsJ1NIQScsJzA5OjAwOjAwJywnSEtHJywnMTA6MzA6MDAnLCdMJywxLjUxNCw3NTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI2NicsMiwnSEtHJywnMTE6MTU6MDAnLCdTSU4nLCcxNDoyNzowMCcsJ0wnLDMuMjE0LDE2MDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI2NCcsMSwnU0lOJywnMDk6MDA6MDAnLCdIS0cnLCcxMjoxMjowMCcsJ0wnLDMuMjE0LDE2MDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI2NCcsMiwnSEtHJywnMTM6MDA6MDAnLCdTRUwnLCcxNjozNjowMCcsJ0wnLDIuNjEyLDEzMDYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI2NicsMSwnU0VMJywnMDk6MDA6MDAnLCdIS0cnLCcxMDozNjowMCcsJ0wnLDIuNjEyLDEzMDYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI2NycsMSwnSExOJywnMDk6MDA6MDAnLCdTRUEnLCcwODo1ODowMCcsJ0wnLDAuOTc4LDQ4OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjY4JywxLCdTRUEnLCcwOTowMDowMCcsJ0hMTicsJzEwOjU4OjAwJywnTCcsMC45NzgsNDg5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNjknLDEsJ0hMTicsJzA5OjAwOjAwJywnQk9JJywnMDk6MzQ6MDAnLCdTJywwLjU4LDI5MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjcwJywxLCdCT0knLCcwOTowMDowMCcsJ0hMTicsJzA5OjM0OjAwJywnUycsMC41OCwyOTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI3MScsMSwnSExOJywnMDk6MDA6MDAnLCdERU4nLCcxMDoxMTowMCcsJ0wnLDEuMTg0LDU5MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjcyJywxLCdERU4nLCcwOTowMDowMCcsJ0hMTicsJzEwOjExOjAwJywnTCcsMS4xODQsNTkyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNzYnLDIsJ0hOTCcsJzEyOjMwOjAwJywnTlJUJywnMTU6MTI6MDAnLCdMJyw3LjcwOCwzODU0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNzQnLDEsJ05SVCcsJzA5OjAwOjAwJywnSE5MJywnMjE6NDI6MDAnLCdMJyw3LjcwOCwzODU0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNzQnLDIsJ0hOTCcsJzIyOjMwOjAwJywnU0ZPJywnMDU6MTc6MDAnLCdMJyw0Ljc5NCwyMzk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNzYnLDEsJ1NGTycsJzA5OjAwOjAwJywnSE5MJywnMTE6NDc6MDAnLCdMJyw0Ljc5NCwyMzk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNzcnLDEsJ0hOTCcsJzEzOjAwOjAwJywnU1lEJywnMjA6MDk6MDAnLCdMJywxMC4xNiw1MDgwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyNzgnLDEsJ1NZRCcsJzA5OjAwOjAwJywnSE5MJywnMjI6MDk6MDAnLCdMJywxMC4xNiw1MDgwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNTEnLDEsJ0hPVScsJzA5OjAwOjAwJywnREVOJywnMDk6NDU6MDAnLCdMJywxLjc1Niw4NzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1MicsMiwnREVOJywnMTA6NTU6MDAnLCdIT1UnLCcxMzo0MDowMCcsJ0wnLDEuNzU2LDg3OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjgxJywxLCdIT1UnLCcwOTowMDowMCcsJ1NBVCcsJzA5OjIyOjAwJywnUycsMC4zNzgsMTg5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyODInLDEsJ1NBVCcsJzA5OjAwOjAwJywnSE9VJywnMDk6MjI6MDAnLCdTJywwLjM3OCwxODksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI4MycsMSwnSE9VJywnMDk6MDA6MDAnLCdJQUQnLCcxMjo1NjowMCcsJ0wnLDIuOTM2LDE0NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI4NCcsMSwnSUFEJywnMDk6MDA6MDAnLCdIT1UnLCcxMDo1NjowMCcsJ0wnLDIuOTM2LDE0NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI4NScsMSwnSUFEJywnMDk6MDA6MDAnLCdCT1MnLCcwOToyOTowMCcsJ1MnLDAuNDksMjQ1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyODYnLDEsJ0JPUycsJzA5OjAwOjAwJywnSUFEJywnMDk6Mjk6MDAnLCdTJywwLjQ5LDI0NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjg3JywxLCdJQUQnLCcwOTowMDowMCcsJ01TUCcsJzA5OjQ5OjAwJywnTCcsMS44Myw5MTUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI4OCcsMSwnTVNQJywnMDk6MDA6MDAnLCdJQUQnLCcxMTo0OTowMCcsJ0wnLDEuODMsOTE1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyODknLDEsJ0lBRCcsJzA5OjAwOjAwJywnTUlBJywnMTE6MDI6MDAnLCdMJywyLjA0OCwxMDI0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyOTAnLDEsJ01JQScsJzA5OjAwOjAwJywnSUFEJywnMTE6MDI6MDAnLCdMJywyLjA0OCwxMDI0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyOTEnLDEsJ0lTVCcsJzA5OjAwOjAwJywnVEhSJywnMTM6MDI6MDAnLCdMJywyLjUzOCwxMjY5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyOTInLDEsJ1RIUicsJzA5OjAwOjAwJywnSVNUJywnMTA6MDI6MDAnLCdMJywyLjUzOCwxMjY5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEyOTMnLDEsJ0lTVCcsJzA5OjAwOjAwJywnRkNPJywnMDk6NDI6MDAnLCdMJywxLjcxLDg1NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjk0JywxLCdGQ08nLCcwOTowMDowMCcsJ0lTVCcsJzExOjQyOjAwJywnTCcsMS43MSw4NTUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTI5NScsMSwnSVNUJywnMDk6MDA6MDAnLCdBVEgnLCcwOTo0MTowMCcsJ1MnLDAuNjk4LDM0OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMjk2JywxLCdBVEgnLCcwOTowMDowMCcsJ0lTVCcsJzA5OjQxOjAwJywnUycsMC42OTgsMzQ5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzODEnLDIsJ0pGSycsJzEyOjAwOjAwJywnQ0RHJywnMDE6MTU6MDAnLCdMJyw3LjI1OCwzNjI5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzODInLDEsJ0NERycsJzA5OjAwOjAwJywnSkZLJywnMTA6MTU6MDAnLCdMJyw3LjI1OCwzNjI5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNDknLDIsJ0pGSycsJzEzOjQ5OjAwJywnTEFYJywnMTU6NDI6MDAnLCdMJyw0Ljg5NiwyNDQ4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDAnLDEsJ0xBWCcsJzA5OjAwOjAwJywnSkZLJywnMTY6NTM6MDAnLCdMJyw0Ljg5NiwyNDQ4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDEnLDEsJ0pGSycsJzA5OjAwOjAwJywnR1JVJywnMjA6MzM6MDAnLCdMJyw5LjU1Niw0Nzc4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDInLDEsJ0dSVScsJzA5OjAwOjAwJywnSkZLJywnMTY6MzM6MDAnLCdMJyw5LjU1Niw0Nzc4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDMnLDEsJ0pLVCcsJzA5OjAwOjAwJywnSEtHJywnMTQ6MDM6MDAnLCdMJyw0LjA1NCwyMDI3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDQnLDEsJ0hLRycsJzA5OjAwOjAwJywnSktUJywnMTI6MDM6MDAnLCdMJyw0LjA1NCwyMDI3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDgnLDIsJ0pLVCcsJzEzOjM1OjAwJywnU1lEJywnMDA6MjU6MDAnLCdMJyw2Ljg0NCwzNDIyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDcnLDEsJ1NZRCcsJzA5OjAwOjAwJywnSktUJywnMTE6NTA6MDAnLCdMJyw2Ljg0NCwzNDIyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDcnLDIsJ0pLVCcsJzEyOjE1OjAwJywnVFBFJywnMTc6NTk6MDAnLCdMJyw0Ljc0OCwyMzc0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDgnLDEsJ1RQRScsJzA5OjAwOjAwJywnSktUJywnMTI6NDQ6MDAnLCdMJyw0Ljc0OCwyMzc0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMDknLDEsJ0pOVScsJzA5OjAwOjAwJywnU0VBJywnMTE6NDY6MDAnLCdMJywxLjc4Miw4OTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMxMCcsMSwnU0VBJywnMDk6MDA6MDAnLCdKTlUnLCcwOTo0NjowMCcsJ0wnLDEuNzgyLDg5MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzExJywxLCdKTlUnLCcwOTowMDowMCcsJ1NGTycsJzEzOjAyOjAwJywnTCcsMy4wMzQsMTUxNywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzEyJywxLCdTRk8nLCcwOTowMDowMCcsJ0pOVScsJzExOjAyOjAwJywnTCcsMy4wMzQsMTUxNywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzEzJywxLCdKTlUnLCcwOTowMDowMCcsJ0hOTCcsJzEzOjM3OjAwJywnTCcsNS42MjYsMjgxMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzE0JywxLCdITkwnLCcwOTowMDowMCcsJ0pOVScsJzE1OjM3OjAwJywnTCcsNS42MjYsMjgxMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzE1JywxLCdLQkwnLCcwOTowMDowMCcsJ0tISScsJzEwOjIxOjAwJywnTCcsMS4zNTgsNjc5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMTYnLDEsJ0tISScsJzA5OjAwOjAwJywnS0JMJywnMTA6MjE6MDAnLCdMJywxLjM1OCw2NzksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMxNycsMSwnS0JMJywnMDk6MDA6MDAnLCdJU1QnLCcxMDoyNjowMCcsJ0wnLDQuNDQ4LDIyMjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMxOCcsMSwnSVNUJywnMDk6MDA6MDAnLCdLQkwnLCcxNjoyNjowMCcsJ0wnLDQuNDQ4LDIyMjQsJ0I3NDcnKTsgCisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkRkxJR0hUUzIuc3FsIGIvMTAwMG1wMS9vcGVuanBhLWV4YW1wbGVzL3NyYy9tYWluL2phdmEvcmV2ZXJzZW1hcHBpbmcvc2NoZW1hL2xvYWRGTElHSFRTMi5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkYzQwMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL3JldmVyc2VtYXBwaW5nL3NjaGVtYS9sb2FkRkxJR0hUUzIuc3FsCkBAIC0wLDAgKzEsMjk5IEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy0tIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorLS0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLS0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy0tICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCistLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCistLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLS0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCistLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCistLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMzcnLDIsJ0tCTCcsJzEzOjMwOjAwJywnU1ZPJywnMTU6NDE6MDAnLCdTJyw0LjE5MiwyMDk2LCdBMzIwJyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExMzgnLDEsJ1NWTycsJzA5OjAwOjAwJywnS0JMJywnMTU6MTE6MDAnLCdMJyw0LjE5MiwyMDk2LCdBMzIwJyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMjEnLDEsJ0tISScsJzA5OjAwOjAwJywnSVNUJywnMTA6NTQ6MDAnLCdMJyw0LjksMjQ1MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzIyJywxLCdJU1QnLCcwOTowMDowMCcsJ0tISScsJzE2OjU0OjAwJywnTCcsNC45LDI0NTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMyMycsMSwnS0hJJywnMDk6MDA6MDAnLCdJU1QnLCcxMDo1NDowMCcsJ0wnLDQuOSwyNDUwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMjQnLDEsJ0lTVCcsJzA5OjAwOjAwJywnS0hJJywnMTY6NTQ6MDAnLCdMJyw0LjksMjQ1MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzI1JywxLCdLSEknLCcwOTowMDowMCcsJ1RIUicsJzA5OjUzOjAwJywnTCcsMi4zODQsMTE5MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzI2JywxLCdUSFInLCcwOTowMDowMCcsJ0tISScsJzEyOjUzOjAwJywnTCcsMi4zODQsMTE5MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzI3JywxLCdMQVgnLCcwOTowMDowMCcsJ0hOTCcsJzEyOjA3OjAwJywnTCcsNS4xMjQsMjU2MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzI4JywxLCdITkwnLCcwOTowMDowMCcsJ0xBWCcsJzE2OjA3OjAwJywnTCcsNS4xMjQsMjU2MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzI5JywxLCdMQVgnLCcwOTowMDowMCcsJ0dSVScsJzAyOjE5OjAwJywnTCcsMTIuMzIyLDYxNjEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMzMCcsMSwnR1JVJywnMDk6MDA6MDAnLCdMQVgnLCcxNjoxOTowMCcsJ0wnLDEyLjMyMiw2MTYxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMzEnLDEsJ0xBWCcsJzA5OjAwOjAwJywnTlJUJywnMTI6NTc6MDAnLCdMJywxMC45NTYsNTQ3OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzMyJywxLCdOUlQnLCcwOTowMDowMCcsJ0xBWCcsJzAyOjU3OjAwJywnTCcsMTAuOTU2LDU0NzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMzMycsMSwnTEhSJywnMDk6MDA6MDAnLCdXQVcnLCcxMTo0NzowMCcsJ0wnLDEuNzk4LDg5OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzM0JywxLCdXQVcnLCcwOTowMDowMCcsJ0xIUicsJzA5OjQ3OjAwJywnTCcsMS43OTgsODk5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMzUnLDEsJ0xIUicsJzA5OjAwOjAwJywnWVlaJywnMTE6MDY6MDAnLCdMJyw3LjEwNiwzNTUzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMzYnLDEsJ1lZWicsJzA5OjAwOjAwJywnTEhSJywnMjE6MDY6MDAnLCdMJyw3LjEwNiwzNTUzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMzcnLDEsJ0xIUicsJzA5OjAwOjAwJywnTkJPJywnMjA6Mjg6MDAnLCdMJyw4LjQ4LDQyNDAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMzOCcsMSwnTkJPJywnMDk6MDA6MDAnLCdMSFInLCcxNDoyODowMCcsJ0wnLDguNDgsNDI0MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTAxJywyLCdMSU0nLCcxMTowMDowMCcsJ01JQScsJzE2OjE1OjAwJywnTCcsNS4yNSw2MjUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0MCcsMSwnTUlBJywnMDk6MDA6MDAnLCdMSU0nLCcxNDoxNTowMCcsJ0wnLDUuMjUsMjYyNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzM4JywyLCdMSU0nLCcyMDowMDowMCcsJ01JQScsJzAxOjE1OjAwJywnTCcsNS4yNSwyNjI1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzMzknLDEsJ01JQScsJzE4OjAwOjAwJywnTElNJywnMjM6MTU6MDAnLCdMJyw1LjI1LDI2MjUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0NCcsMiwnTElNJywnMTI6MDA6MDAnLCdCVUUnLCcxODo1MzowMCcsJ0wnLDMuODk2LDE5NDgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0MicsMSwnQlVFJywnMDk6MDA6MDAnLCdMSU0nLCcwOTo1MzowMCcsJ0wnLDMuODk2LDE5NDgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0MicsMiwnTElNJywnMTA6MzA6MDAnLCdCT0cnLCcxMjo1MDowMCcsJ0wnLDIuMzM4LDExNjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0NCcsMSwnQk9HJywnMDk6MDA6MDAnLCdMSU0nLCcxMToyMDowMCcsJ0wnLDIuMzM4LDExNjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0NScsMSwnTElTJywnMDk6MDA6MDAnLCdDREcnLCcxMTo0ODowMCcsJ0wnLDEuODA2LDkwMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzQ2JywxLCdDREcnLCcwOTowMDowMCcsJ0xJUycsJzA5OjQ4OjAwJywnTCcsMS44MDYsOTAzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNDcnLDEsJ0xJUycsJzA5OjAwOjAwJywnQ0FTJywnMDk6NDM6MDAnLCdTJywwLjczLDM2NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzQ4JywxLCdDQVMnLCcwOTowMDowMCcsJ0xJUycsJzA5OjQzOjAwJywnUycsMC43MywzNjUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM0OScsMSwnTElTJywnMDk6MDA6MDAnLCdKRksnLCcxMDo0NDowMCcsJ0wnLDYuNzQ0LDMzNzIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTMwMCcsMiwnSkZLJywnMTc6NDU6MDAnLCdMSVMnLCcwNToyOTowMCcsJ0wnLDYuNzQ0LDMzNzIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyMycsMSwnTE9TJywnMDk6MDA6MDAnLCdDREcnLCcxNDo1MjowMCcsJ0wnLDUuODY4LDI5MzQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTIyNCcsMiwnQ0RHJywnMTE6MDA6MDAnLCdMT1MnLCcxNjo1MjowMCcsJ0wnLDUuODY4LDI5MzQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM1MycsMSwnTE9TJywnMDk6MDA6MDAnLCdNQUQnLCcxMzo0NjowMCcsJ0wnLDQuNzc2LDIzODgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM1NCcsMSwnTUFEJywnMDk6MDA6MDAnLCdMT1MnLCcxMzo0NjowMCcsJ0wnLDQuNzc2LDIzODgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM1NScsMSwnTE9TJywnMDk6MDA6MDAnLCdBVEgnLCcxNTowMzowMCcsJ0wnLDUuMDU0LDI1MjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM1NicsMSwnQVRIJywnMDk6MDA6MDAnLCdMT1MnLCcxMzowMzowMCcsJ0wnLDUuMDU0LDI1MjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM1NycsMiwnTUFEJywnMTE6NDU6MDAnLCdDREcnLCcxMzowMzowMCcsJ0wnLDEuMzEsNjU1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNTgnLDEsJ0NERycsJzA5OjAwOjAwJywnTUFEJywnMTA6MTg6MDAnLCdMJywxLjMxLDY1NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzU4JywyLCdNQUQnLCcxMTowNTowMCcsJ0NBUycsJzExOjA3OjAwJywnTCcsMS4wMzYsNTE4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNTcnLDEsJ0NBUycsJzA5OjAwOjAwJywnTUFEJywnMTE6MDI6MDAnLCdMJywxLjAzNiw1MTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM2MScsMSwnTUFEJywnMDk6MDA6MDAnLCdKRksnLCcxMDoxMDowMCcsJ0wnLDcuMTc4LDM1ODksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM2MicsMSwnSkZLJywnMDk6MDA6MDAnLCdNQUQnLCcyMjoxMDowMCcsJ0wnLDcuMTc4LDM1ODksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM2MycsMSwnTUNJJywnMDk6MDA6MDAnLCdMQVgnLCcwOTo0MjowMCcsJ0wnLDIuNzEsMTM1NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzY0JywxLCdMQVgnLCcwOTowMDowMCcsJ01DSScsJzEzOjQyOjAwJywnTCcsMi43MSwxMzU1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNjUnLDEsJ01DSScsJzA5OjAwOjAwJywnREZXJywnMDk6NTQ6MDAnLCdMJywwLjkwOCw0NTQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM2NicsMSwnREZXJywnMDk6MDA6MDAnLCdNQ0knLCcwOTo1NDowMCcsJ0wnLDAuOTA4LDQ1NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzY3JywxLCdNQ0knLCcwOTowMDowMCcsJ0pGSycsJzEyOjExOjAwJywnTCcsMi4xOSwxMDk1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNjgnLDEsJ0pGSycsJzA5OjAwOjAwJywnTUNJJywnMTA6MTE6MDAnLCdMJywyLjE5LDEwOTUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM3OScsMiwnTURXJywnMTA6MDM6MDAnLCdMQVgnLCcxMTozMTowMCcsJ0wnLDMuNDgyLDE3NDEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM4MCcsMSwnTEFYJywnMDk6MDA6MDAnLCdNRFcnLCcxNDoyODowMCcsJ0wnLDMuNDgyLDE3NDEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ3MycsMiwnTURXJywnMTM6MzA6MDAnLCdKRksnLCcxNTo1NTowMCcsJ0wnLDEuNDI4LDcxNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDc0JywxLCdKRksnLCcxMTowMDowMCcsJ01EVycsJzExOjI1OjAwJywnTCcsMS40MjgsNzE0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzODMnLDEsJ01EVycsJzEyOjE1OjAwJywnQVRMJywnMTQ6MjU6MDAnLCdMJywxLjE3NCw1ODcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM4NCcsMSwnQVRMJywnMTE6MzA6MDAnLCdNRFcnLCcxMTo0MDowMCcsJ0wnLDEuMTc0LDU4NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzg1JywxLCdNRUwnLCcwOTowMDowMCcsJ1NZRCcsJzA5OjUyOjAwJywnTCcsMC44ODIsNDQxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzODYnLDEsJ1NZRCcsJzA5OjAwOjAwJywnTUVMJywnMDk6NTI6MDAnLCdMJywwLjg4Miw0NDEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM4NycsMSwnTUVMJywnMDk6MDA6MDAnLCdTSU4nLCcxMzozMjowMCcsJ0wnLDcuNTM2LDM3NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM4OCcsMiwnU0lOJywnMTQ6MTU6MDAnLCdNRUwnLCcwMDo0NzowMCcsJ0wnLDcuNTM2LDM3NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM4OScsMSwnTUVMJywnMDk6MDA6MDAnLCdITkwnLCcyMzowMjowMCcsJ0wnLDExLjA0NCw1NTIyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzOTAnLDEsJ0hOTCcsJzEyOjQ1OjAwJywnTUVMJywnMjA6NDc6MDAnLCdMJywxMS4wNDQsNTUyMiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzkxJywxLCdNRU0nLCcwOTowMDowMCcsJ01JQScsJzExOjQ0OjAwJywnTCcsMS43NDIsODcxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzOTInLDEsJ01JQScsJzA5OjAwOjAwJywnTUVNJywnMDk6NDQ6MDAnLCdMJywxLjc0Miw4NzEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM5MycsMSwnTUVNJywnMDk6MDA6MDAnLCdKRksnLCcxMTo1NDowMCcsJ0wnLDEuOTA4LDk1NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzk0JywxLCdKRksnLCcwOTowMDowMCcsJ01FTScsJzA5OjU0OjAwJywnTCcsMS45MDgsOTU0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzOTUnLDEsJ01FTScsJzA5OjAwOjAwJywnTEFYJywnMTA6MTI6MDAnLCdMJywzLjIwMiwxNjAxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzOTYnLDEsJ0xBWCcsJzA5OjAwOjAwJywnTUVNJywnMTQ6MTI6MDAnLCdMJywzLjIwMiwxNjAxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzOTcnLDEsJ01FWCcsJzA5OjAwOjAwJywnU0ZPJywnMTA6NDY6MDAnLCdMJywzLjc4LDE4OTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM5OCcsMSwnU0ZPJywnMDk6MDA6MDAnLCdNRVgnLCcxNDo0NjowMCcsJ0wnLDMuNzgsMTg5MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzk5JywxLCdNRVgnLCcxNTowMDowMCcsJ0xBWCcsJzE2OjA2OjAwJywnUycsMy4xLDE1NTAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQwMCcsMSwnTEFYJywnMDk6MDA6MDAnLCdNRVgnLCcxNDowNjowMCcsJ0wnLDMuMSwxNTUwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MDEnLDEsJ01FWCcsJzA5OjAwOjAwJywnQk9HJywnMTM6NTc6MDAnLCdMJywzLjk1LDE5NzUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQwMicsMSwnQk9HJywnMDk6MDA6MDAnLCdNRVgnLCcxMTo1NzowMCcsJ0wnLDMuOTUsMTk3NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDAzJywxLCdNSUEnLCcxODowMDowMCcsJ0dSVScsJzA0OjEwOjAwJywnTCcsOC4xNzIsNDA4NiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDA0JywxLCdHUlUnLCcyMzowMDowMCcsJ01JQScsJzA1OjEwOjAwJywnTCcsOC4xNzIsNDA4NiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDA1JywxLCdNSUEnLCcxNzozMDowMCcsJ0xBWCcsJzE5OjEwOjAwJywnRCcsNC42NywyMzM1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MDYnLDEsJ0xBWCcsJzA4OjAwOjAwJywnTUlBJywnMTU6NDA6MDAnLCdMJyw0LjY3LDIzMzUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQwNycsMSwnTUlBJywnMDk6MDA6MDAnLCdKRksnLCcxMToxMTowMCcsJ0wnLDIuMTg0LDEwOTIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQwOCcsMSwnSkZLJywnMDk6MDA6MDAnLCdNSUEnLCcxMToxMTowMCcsJ0wnLDIuMTg0LDEwOTIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQwOScsMSwnTUtFJywnMDk6MDA6MDAnLCdKRksnLCcxMToyNzowMCcsJ0wnLDEuNDY2LDczMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDEwJywxLCdKRksnLCcwOTowMDowMCcsJ01LRScsJzA5OjI3OjAwJywnTCcsMS40NjYsNzMzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MTEnLDEsJ01LRScsJzA5OjAwOjAwJywnTURXJywnMDk6MDk6MDAnLCdTJywwLjE2Niw4MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDEyJywxLCdNRFcnLCcwOTowMDowMCcsJ01LRScsJzA5OjA5OjAwJywnUycsMC4xNjYsODMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQxMycsMSwnTUtFJywnMDk6MDA6MDAnLCdKRksnLCcxMToyNzowMCcsJ0wnLDEuNDY2LDczMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDE0JywxLCdKRksnLCcwOTowMDowMCcsJ01LRScsJzA5OjI3OjAwJywnTCcsMS40NjYsNzMzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MTUnLDEsJ01OTCcsJzA5OjAwOjAwJywnU1lEJywnMTk6NDc6MDAnLCdMJyw3Ljc5NCwzODk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MTYnLDEsJ1NZRCcsJzA5OjAwOjAwJywnTU5MJywnMTM6NDc6MDAnLCdMJyw3Ljc5NCwzODk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MTcnLDEsJ01OTCcsJzA5OjAwOjAwJywnVFBFJywnMTA6MjY6MDAnLCdMJywxLjQ0OCw3MjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQxOCcsMSwnVFBFJywnMDk6MDA6MDAnLCdNTkwnLCcxMDoyNjowMCcsJ0wnLDEuNDQ4LDcyNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDE5JywxLCdNTkwnLCcwOTowMDowMCcsJ1NJTicsJzExOjU4OjAwJywnTCcsMi45NzgsMTQ4OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDIwJywyLCdTSU4nLCcxMTo1MzowMCcsJ01OTCcsJzE0OjUxOjAwJywnTCcsMi45NzgsMTQ4OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExNDE5JywxLCdNTkwnLCcxMjowMDowMCcsJ0hLRycsJzEzOjIzOjAwJywnTCcsMS4zODgsNjk0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTE0MjAnLDIsJ0hLRycsJzE3OjUzOjAwJywnTU5MJywnMTk6MTY6MDAnLCdEJywxLjM4OCw2OTQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTQyMScsMSwnTU5MJywnMDc6MDA6MDAnLCdITkwnLCcyMzozNjowMCcsJ0InLDEwLjYwNCw1MzAyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MjInLDIsJ0hOTCcsJzE0OjA1OjAwJywnTU5MJywnMTg6NDE6MDAnLCdMJywxMC42MDQsNTMwMiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjQ5JywxLCdNU1AnLCcwOTowMDowMCcsJ0RFTicsJzA5OjUyOjAwJywnTCcsMS44ODIsOTQxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNTAnLDIsJ0RFTicsJzEyOjM3OjAwJywnTVNQJywnMTU6Mjk6MDAnLCdMJywxLjg4Miw5NDEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQyMycsMSwnTVNQJywnMDk6MDA6MDAnLCdNRFcnLCcwOToyNTowMCcsJ1MnLDAuNDMsMjE1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MjQnLDEsJ01EVycsJzA5OjAwOjAwJywnTVNQJywnMDk6MjU6MDAnLCdTJywwLjQzLDIxNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExNDIzJywxLCdNRFcnLCcwODowMDowMCcsJ01JQScsJzExOjIyOjAwJywnTCcsMi4zNzYsMTE4OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExNDI0JywxLCdNSUEnLCcxNzowMDowMCcsJ01EVycsJzE4OjIyOjAwJywnTCcsMi4zNzYsMTE4OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDI3JywxLCdNU1knLCcwOTowMDowMCcsJ1NGTycsJzEwOjUwOjAwJywnTCcsMy44NDYsMTkyMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDI4JywxLCdTRk8nLCcwOTowMDowMCcsJ01TWScsJzE0OjUwOjAwJywnTCcsMy44NDYsMTkyMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDI5JywxLCdNU1knLCcwOTowMDowMCcsJ0FUTCcsJzEwOjUwOjAwJywnTCcsMC44NDgsNDI0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0MzAnLDEsJ0FUTCcsJzA5OjAwOjAwJywnTVNZJywnMDg6NTA6MDAnLCdMJywwLjg0OCw0MjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzMScsMSwnTVNZJywnMDk6MDA6MDAnLCdKRksnLCcxMjoyMDowMCcsJ0wnLDIuMzM2LDExNjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzMicsMSwnSkZLJywnMDk6MDA6MDAnLCdNU1knLCcxMDoyMDowMCcsJ0wnLDIuMzM2LDExNjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzMycsMSwnTkJPJywnMDk6MDA6MDAnLCdGQ08nLCcxMzo0MjowMCcsJ0wnLDYuNzAyLDMzNTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzNCcsMSwnRkNPJywnMDk6MDA6MDAnLCdOQk8nLCcxNzo0MjowMCcsJ0wnLDYuNzAyLDMzNTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzNScsMSwnTkJPJywnMDY6MDA6MDAnLCdNQUQnLCcxMTo0MTowMCcsJ0wnLDcuNjk0LDM4NDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzNicsMSwnTUFEJywnMTM6MTA6MDAnLCdOQk8nLCcyMjo1MTowMCcsJ0wnLDcuNjk0LDM4NDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzNycsMSwnTkJPJywnMDk6MDA6MDAnLCdDQVMnLCcxMzozMTowMCcsJ0wnLDcuNTE4LDM3NTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzOCcsMSwnQ0FTJywnMDk6MDA6MDAnLCdOQk8nLCcxOTozMTowMCcsJ0wnLDcuNTE4LDM3NTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQzOScsMSwnTlJUJywnMDk6MDA6MDAnLCdTWUQnLCcyMDo0NDowMCcsJ0wnLDkuNzM2LDQ4NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ0MCcsMSwnU1lEJywnMDk6MDA6MDAnLCdOUlQnLCcxNjo0NDowMCcsJ0wnLDkuNzM2LDQ4NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ0MScsMSwnTlJUJywnMDk6MDA6MDAnLCdMQVgnLCcwMjo1NzowMCcsJ0wnLDEwLjk1Niw1NDc4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NDInLDEsJ0xBWCcsJzA5OjAwOjAwJywnTlJUJywnMTI6NTc6MDAnLCdMJywxMC45NTYsNTQ3OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDQzJywyLCdOUlQnLCcxNDo0NTowMCcsJ0hLRycsJzE3OjIwOjAwJywnTCcsMy41OTYsMTc5OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDQ0JywxLCdIS0cnLCcwOTowMDowMCcsJ05SVCcsJzEzOjM1OjAwJywnTCcsMy41OTYsMTc5OCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDQ1JywxLCdPS0MnLCcwOTowMDowMCcsJ1NMQycsJzA5OjQzOjAwJywnTCcsMS43MjIsODYxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NDYnLDEsJ1NMQycsJzA5OjAwOjAwJywnT0tDJywnMTE6NDM6MDAnLCdMJywxLjcyMiw4NjEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ0NycsMSwnT0tDJywnMDk6MDA6MDAnLCdKRksnLCcxMjozODowMCcsJ0wnLDIuNjQ4LDEzMjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ0OCcsMSwnSkZLJywnMDk6MDA6MDAnLCdPS0MnLCcxMDozODowMCcsJ0wnLDIuNjQ4LDEzMjQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ0OScsMSwnT0tDJywnMDk6MDA6MDAnLCdMQVgnLCcwOToyMTowMCcsJ0wnLDIuMzYsMTE4MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDUwJywxLCdMQVgnLCcwOTowMDowMCcsJ09LQycsJzEzOjIxOjAwJywnTCcsMi4zNiwxMTgwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NTEnLDEsJ09TQScsJzA5OjAwOjAwJywnTlJUJywnMDk6MzA6MDAnLCdTJywwLjUwMiwyNTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ1MicsMSwnTlJUJywnMDk6MDA6MDAnLCdPU0EnLCcwOTozMDowMCcsJ1MnLDAuNTAyLDI1MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDUzJywxLCdPU0EnLCcwOTowMDowMCcsJ1RQRScsJzEwOjA4OjAwJywnTCcsMi4xMzgsMTA2OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDU0JywxLCdUUEUnLCcwOTowMDowMCcsJ09TQScsJzEyOjA4OjAwJywnTCcsMi4xMzgsMTA2OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDU1JywxLCdPU0EnLCcwOTowMDowMCcsJ1NWTycsJzEyOjA3OjAwJywnTCcsOS4xMyw0NTY1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NTYnLDEsJ1NWTycsJzA5OjAwOjAwJywnT1NBJywnMDA6MDc6MDAnLCdMJyw5LjEzLDQ1NjUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ1NycsMSwnT1NMJywnMDk6MDA6MDAnLCdQUkcnLCcxMDoyMzowMCcsJ0wnLDEuMzksNjk1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NTgnLDEsJ1BSRycsJzExOjAwOjAwJywnT1NMJywnMTI6MjM6MDAnLCdMJywxLjM5LDY5NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDU5JywxLCdPU0wnLCcwOTowMDowMCcsJ0FSTicsJzEwOjM0OjAwJywnTCcsMS41NzQsNzg3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NjAnLDEsJ0FSTicsJzA5OjAwOjAwJywnT1NMJywnMTA6MzQ6MDAnLCdMJywxLjU3NCw3ODcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ2MScsMSwnT1NMJywnMDk6MDA6MDAnLCdXQVcnLCcxMDoxOTowMCcsJ0wnLDEuMzE4LDY1OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDYyJywxLCdXQVcnLCcwOTowMDowMCcsJ09TTCcsJzEwOjE5OjAwJywnTCcsMS4zMTgsNjU5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTE0NjInLDEsJ09TTCcsJzA3OjE1OjAwJywnQ0RHJywnMDg6NTU6MDAnLCdCJywxLjY2OCw4MzQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTQ2MycsMSwnQ0RHJywnMTE6MDA6MDAnLCdPU0wnLCcxMjo0MDowMCcsJ0wnLDEuNjY4LDgzNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDYzJywxLCdQSEwnLCcwOTowMDowMCcsJ0lBRCcsJzA5OjIxOjAwJywnUycsMC4zNjQsMTgyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NjQnLDEsJ0lBRCcsJzA5OjAwOjAwJywnUEhMJywnMDk6MjE6MDAnLCdTJywwLjM2NCwxODIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ2NScsMSwnUEhMJywnMDk6MDA6MDAnLCdNSUEnLCcxMTowMjowMCcsJ0wnLDIuMDQ0LDEwMjIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ2NicsMSwnTUlBJywnMDk6MDA6MDAnLCdQSEwnLCcxMTowMjowMCcsJ0wnLDIuMDQ0LDEwMjIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTI1OCcsMSwnUEhMJywnMDk6MDA6MDAnLCdBVEwnLCcxMDoxOTowMCcsJ0wnLDEuMzMsNjY1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyNTcnLDIsJ0FUTCcsJzEyOjEwOjAwJywnUEhMJywnMTM6Mjk6MDAnLCdMJywxLjMzLDY2NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDY5JywxLCdQSFgnLCcwOTowMDowMCcsJ0xBWCcsJzA4OjQyOjAwJywnUycsMC43MTQsMzU3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NzAnLDEsJ0xBWCcsJzA5OjAwOjAwJywnUEhYJywnMTA6NDI6MDAnLCdTJywwLjcxNCwzNTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ3MScsMSwnUEhYJywnMDk6MDA6MDAnLCdTRUEnLCcxMDoxMzowMCcsJ0wnLDIuMjMsMTExNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDcyJywxLCdTRUEnLCcwOTowMDowMCcsJ1BIWCcsJzEyOjEzOjAwJywnTCcsMi4yMywxMTE1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NzMnLDEsJ1BIWCcsJzA5OjAwOjAwJywnTURXJywnMTI6NTM6MDAnLCdMJywyLjg5OCwxNDQ5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NzQnLDIsJ01EVycsJzA5OjU1OjAwJywnUEhYJywnMTE6NDg6MDAnLCdMJywyLjg5OCwxNDQ5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NzUnLDEsJ1BSRycsJzA5OjAwOjAwJywnQ0RHJywnMTA6MDY6MDAnLCdMJywxLjEwMiw1NTEsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ3NicsMSwnQ0RHJywnMDk6MDA6MDAnLCdQUkcnLCcxMDowNjowMCcsJ0wnLDEuMTAyLDU1MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDc3JywxLCdQUkcnLCcwOTowMDowMCcsJ0ZDTycsJzEwOjA4OjAwJywnTCcsMS4xNDYsNTczLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0NzgnLDEsJ0ZDTycsJzA5OjAwOjAwJywnUFJHJywnMTA6MDg6MDAnLCdMJywxLjE0Niw1NzMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ3OScsMSwnUFJHJywnMDk6MDA6MDAnLCdSRVknLCcxMToxNjowMCcsJ0InLDMuMjgyLDE2NDEsJ0EzMjAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4MCcsMSwnUkVZJywnMDk6MDA6MDAnLCdQUkcnLCcxMzoxNjowMCcsJ0wnLDMuMjgyLDE2NDEsJ0EzMjAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4MScsMSwnUkVZJywnMDk6MDA6MDAnLCdTVk8nLCcxNjowNjowMCcsJ0wnLDQuMTEyLDIwNTYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4MicsMiwnU1ZPJywnMTM6MTU6MDAnLCdSRVknLCcxNDoyMTowMCcsJ0wnLDQuMTEyLDIwNTYsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4MycsMSwnUkVZJywnMDk6MDA6MDAnLCdDREcnLCcxMjo0NjowMCcsJ0wnLDIuNzc2LDEzODgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4NCcsMSwnQ0RHJywnMDk6MDA6MDAnLCdSRVknLCcxMDo0NjowMCcsJ0wnLDIuNzc2LDEzODgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4NScsMSwnUkVZJywnMDk6MDA6MDAnLCdEVUInLCcxMDo1MTowMCcsJ0wnLDEuODYyLDkzMSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDg2JywxLCdEVUInLCcwOTowMDowMCcsJ1JFWScsJzEwOjUxOjAwJywnTCcsMS44NjIsOTMxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0ODcnLDEsJ1NBTicsJzA5OjAwOjAwJywnU0ZPJywnMDk6NTU6MDAnLCdMJywwLjkxOCw0NTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ4OCcsMSwnU0ZPJywnMDk6MDA6MDAnLCdTQU4nLCcwOTo1NTowMCcsJ0wnLDAuOTE4LDQ1OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDg5JywxLCdTQU4nLCcwOTowMDowMCcsJ0RGVycsJzEzOjIxOjAwJywnTCcsMi4zNiwxMTgwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0OTAnLDEsJ0RGVycsJzA5OjAwOjAwJywnU0FOJywnMDk6MjE6MDAnLCdMJywyLjM2LDExODAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ5MScsMSwnU0FOJywnMDk6MDA6MDAnLCdNRVgnLCcxMzo1MzowMCcsJ0wnLDIuODg4LDE0NDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ5MicsMSwnTUVYJywnMDk6MDA6MDAnLCdTQU4nLCcwOTo1MzowMCcsJ0wnLDIuODg4LDE0NDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQ5MycsMSwnU0FUJywnMDk6MDA6MDAnLCdBVEwnLCcxMTo0NTowMCcsJ0wnLDEuNzY2LDg4MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDk0JywxLCdBVEwnLCcwOTowMDowMCcsJ1NBVCcsJzA5OjQ1OjAwJywnTCcsMS43NjYsODgzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0OTUnLDEsJ1NBVCcsJzA5OjAwOjAwJywnTEFYJywnMDk6MjQ6MDAnLCdMJywyLjQwNCwxMjAyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0OTYnLDEsJ0xBWCcsJzA5OjAwOjAwJywnU0FUJywnMTM6MjQ6MDAnLCdMJywyLjQwNCwxMjAyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0OTcnLDEsJ1NBVCcsJzA5OjAwOjAwJywnTUlBJywnMTI6MTc6MDAnLCdMJywyLjI5MiwxMTQ2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0OTgnLDEsJ01JQScsJzA5OjAwOjAwJywnU0FUJywnMTA6MTc6MDAnLCdMJywyLjI5MiwxMTQ2LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE0OTknLDEsJ1NDTCcsJzA5OjAwOjAwJywnR1JVJywnMTI6MTM6MDAnLCdMJywzLjIxOCwxNjA5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDAnLDEsJ0dSVScsJzA5OjAwOjAwJywnU0NMJywnMTI6MTM6MDAnLCdMJywzLjIxOCwxNjA5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDEnLDEsJ1NDTCcsJzA5OjAwOjAwJywnTElNJywnMTA6MDQ6MDAnLCdMJywzLjA2OCwxNTM0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNDAnLDIsJ0xJTScsJzE1OjAwOjAwJywnU0NMJywnMjA6MDQ6MDAnLCdMJywzLjA2OCwxNTM0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDMnLDEsJ1NDTCcsJzA5OjAwOjAwJywnQlVFJywnMTE6MjQ6MDAnLCdMJywxLjQwOCw3MDQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUwNCcsMSwnQlVFJywnMDk6MDA6MDAnLCdTQ0wnLCcwOToyNDowMCcsJ0wnLDEuNDA4LDcwNCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTA1JywxLCdTRUEnLCcwOTowMDowMCcsJ1NGTycsJzEwOjIxOjAwJywnTCcsMS4zNTYsNjc4LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTE1MDUnLDEsJ1NGTycsJzA5OjAwOjAwJywnU0VBJywnMTA6MjE6MDAnLCdMJywxLjM1Niw2NzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUwNicsMSwnU0VBJywnMDk6MDA6MDAnLCdKRksnLCcxNjo0ODowMCcsJ0wnLDQuODEsMjQwNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTA3JywxLCdKRksnLCcwOTowMDowMCcsJ1NFQScsJzEwOjQ4OjAwJywnTCcsNC44MSwyNDA1LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDgnLDEsJ1NFQScsJzA5OjAwOjAwJywnTUlBJywnMTc6Mjc6MDAnLCdMJyw1LjQ2MiwyNzMxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MDknLDIsJ01JQScsJzE1OjE1OjAwJywnU0VBJywnMTc6NDI6MDAnLCdMJyw1LjQ2MiwyNzMxLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MTAnLDEsJ1NFTCcsJzA5OjAwOjAwJywnTlJUJywnMTA6MjY6MDAnLCdMJywxLjQzOCw3MTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUxMScsMSwnTlJUJywnMDk6MDA6MDAnLCdTRUwnLCcxMDoyNjowMCcsJ0wnLDEuNDM4LDcxOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzg4JywxLCdTRUwnLCcwOTowMDowMCcsJ1NJTicsJzEzOjQ5OjAwJywnTCcsNS44MTgsMjkwOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxMzg3JywyLCdTSU4nLCcxNDowNTowMCcsJ1NFTCcsJzIwOjU0OjAwJywnTCcsNS44MTgsMjkwOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTE0JywxLCdTRUwnLCcwOTowMDowMCcsJ1NIQScsJzA5OjA1OjAwJywnTCcsMS4wOTgsNTQ5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MTUnLDEsJ1NIQScsJzA5OjAwOjAwJywnU0VMJywnMTE6MDU6MDAnLCdMJywxLjA5OCw1NDksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUxNicsMSwnU0ZPJywnMTI6MDA6MDAnLCdKRksnLCcyMDowODowMCcsJ0wnLDUuMTM2LDI1NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUxNycsMiwnSkZLJywnMTE6MDU6MDAnLCdTRk8nLCcxMzoxMzowMCcsJ0wnLDUuMTM2LDI1NjgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUxOCcsMSwnU0ZPJywnMDk6MDA6MDAnLCdNSUEnLCcxNzoxMDowMCcsJ0wnLDUuMTgsMjU5MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTE4JywyLCdNSUEnLCcxODowNTowMCcsJ1NDTCcsJzA0OjIyOjAwJywnTCcsOC4yODgsNDE0NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTE5JywxLCdTQ0wnLCcwOTowMDowMCcsJ01JQScsJzE1OjE3OjAwJywnRCcsOC4yODgsNDE0NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTE5JywyLCdNSUEnLCcxNjoxMDowMCcsJ1NGTycsJzE4OjIwOjAwJywnRCcsNS4xOCwyNTkwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MjknLDEsJ1NGTycsJzA5OjAwOjAwJywnSE5MJywnMTE6NDc6MDAnLCdMJyw0Ljc5NCwyMzk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MjEnLDEsJ0hOTCcsJzA5OjAwOjAwJywnU0ZPJywnMTU6NDc6MDAnLCdMJyw0Ljc5NCwyMzk3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MjInLDEsJ1NIQScsJzA5OjAwOjAwJywnU0lOJywnMTM6NDM6MDAnLCdMJyw0LjcyLDIzNjAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUyMycsMSwnU0lOJywnMDk6MDA6MDAnLCdTSEEnLCcxMzo0MzowMCcsJ0wnLDQuNzIsMjM2MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTI0JywxLCdTSEEnLCcwOTowMDowMCcsJ0hLRycsJzEwOjMwOjAwJywnTCcsMS41MTQsNzU3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MjUnLDEsJ0hLRycsJzA5OjAwOjAwJywnU0hBJywnMTA6MzA6MDAnLCdMJywxLjUxNCw3NTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUyNicsMSwnU0hBJywnMDk6MDA6MDAnLCdTVk8nLCcxMjoyOTowMCcsJ0wnLDguNDg2LDQyNDMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUyNycsMSwnU1ZPJywnMDk6MDA6MDAnLCdTSEEnLCcyMjoyOTowMCcsJ0wnLDguNDg2LDQyNDMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTUyOCcsMSwnU0lOJywnMDk6MDA6MDAnLCdTWUQnLCcxOTo1MDowMCcsJ0wnLDcuODM0LDM5MTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTUyOScsMSwnU1lEJywnMDk6MDA6MDAnLCdTSU4nLCcxMzo1MDowMCcsJ0wnLDcuODM0LDM5MTcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTQxOScsMiwnU0lOJywnMTI6MzU6MDAnLCdKS1QnLCcxMjo0MTowMCcsJ0wnLDEuMTA4LDU1NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDIwJywxLCdKS1QnLCcwOTowMDowMCcsJ1NJTicsJzExOjA2OjAwJywnTCcsMS4xMDgsNTU0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTE1MzInLDEsJ1NJTicsJzA5OjAwOjAwJywnSEtHJywnMTI6MTI6MDAnLCdMJywzLjIxNCwxNjA3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTE1MzMnLDEsJ0hLRycsJzA5OjAwOjAwJywnU0lOJywnMTI6MTI6MDAnLCdMJywzLjIxNCwxNjA3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTExODYnLDEsJ1NKVScsJzA5OjAwOjAwJywnTUlBJywnMTA6MDQ6MDAnLCdMJywyLjA3LDEwMzUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTE4NScsMiwnTUlBJywnMTI6MjA6MDAnLCdTSlUnLCcxNToyNDowMCcsJ0wnLDIuMDcsMTAzNSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTM2JywxLCdTSlUnLCcwOTowMDowMCcsJ0NDUycsJzEwOjA2OjAwJywnTCcsMS4xMDYsNTUzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1MzcnLDEsJ0NDUycsJzA5OjAwOjAwJywnU0pVJywnMTA6MDY6MDAnLCdMJywxLjEwNiw1NTMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTUzOCcsMSwnU0pVJywnMDk6MDA6MDAnLCdNRUwnLCcyMDoxNzowMCcsJ0wnLDIwLjI4OCwxMDE0NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTM5JywxLCdNRUwnLCcwOTowMDowMCcsJ1NKVScsJzE0OjE3OjAwJywnTCcsMjAuMjg4LDEwMTQ0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NDAnLDEsJ1NMQycsJzA5OjAwOjAwJywnREVOJywnMDk6NDQ6MDAnLCdTJywwLjc0LDM3MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTQxJywxLCdERU4nLCcwOTowMDowMCcsJ1NMQycsJzA5OjQ0OjAwJywnUycsMC43NCwzNzAsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU0MicsMSwnU0xDJywnMDk6MDA6MDAnLCdTRk8nLCcwOToxMTowMCcsJ0wnLDEuMTk4LDU5OSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTQzJywxLCdTRk8nLCcwOTowMDowMCcsJ1NMQycsJzExOjExOjAwJywnTCcsMS4xOTgsNTk5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NDQnLDEsJ1NMQycsJzA5OjAwOjAwJywnTURXJywnMTI6MzA6MDAnLCdMJywyLjUxLDEyNTUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU0NScsMSwnTURXJywnMDk6MDA6MDAnLCdTTEMnLCcxMDozMDowMCcsJ0wnLDIuNTEsMTI1NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTQ2JywxLCdTVEwnLCcwOTowMDowMCcsJ01EVycsJzA5OjMxOjAwJywnUycsMC41MTgsMjU5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NDcnLDEsJ01EVycsJzA5OjAwOjAwJywnU1RMJywnMDk6MzE6MDAnLCdTJywwLjUxOCwyNTksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU0OCcsMSwnU1RMJywnMDk6MDA6MDAnLCdKRksnLCcxMTo0NDowMCcsJ0wnLDEuNzQ2LDg3MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTQ5JywxLCdKRksnLCcwOTowMDowMCcsJ1NUTCcsJzA5OjQ0OjAwJywnTCcsMS43NDYsODczLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NTAnLDEsJ1NUTCcsJzA5OjAwOjAwJywnTEFYJywnMTA6MTA6MDAnLCdMJywzLjE3NCwxNTg3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NTEnLDEsJ0xBWCcsJzA5OjAwOjAwJywnU1RMJywnMTQ6MTA6MDAnLCdMJywzLjE3NCwxNTg3LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NTInLDEsJ1NWTycsJzE0OjAwOjAwJywnQ0RHJywnMTU6MDU6MDAnLCdMJywzLjA5LDE1NDUsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU1MycsMSwnQ0RHJywnMTQ6MDA6MDAnLCdTVk8nLCcxOTowNTowMCcsJ0wnLDMuMDksMTU0NSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTU0JywxLCdTVk8nLCcwOTowMDowMCcsJ05SVCcsJzAwOjE4OjAwJywnTCcsOS4zMDgsNDY1NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTU1JywxLCdOUlQnLCcwOTowMDowMCcsJ1NWTycsJzEyOjE4OjAwJywnTCcsOS4zMDgsNDY1NCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDgxJywyLCdTVk8nLCcxMzo0NTowMCcsJ0JPTScsJzIyOjMwOjAwJywnTCcsNi4yNjYsMzEzMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNDgyJywxLCdCT00nLCcwOTowMDowMCcsJ1NWTycsJzEyOjQ1OjAwJywnTCcsNi4yNjYsMzEzMywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTU4JywxLCdTWUQnLCcwOTowMDowMCcsJ0FLTCcsJzEzOjQwOjAwJywnTCcsMi42ODIsMTM0MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTU5JywxLCdBS0wnLCcwOTowMDowMCcsJ1NZRCcsJzA5OjQwOjAwJywnTCcsMi42ODIsMTM0MSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTYwJywxLCdTWUQnLCcxNTowMDowMCcsJ0hOTCcsJzA0OjA5OjAwJywnTCcsMTAuMTYsNTA4MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTYxJywxLCdITkwnLCcxMzowMDowMCcsJ1NZRCcsJzIwOjA5OjAwJywnTCcsMTAuMTYsNTA4MCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTYyJywxLCdTWUQnLCcwOTowMDowMCcsJ0hLRycsJzE1OjA5OjAwJywnTCcsOS4xNjYsNDU4MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTYzJywxLCdIS0cnLCcwOTowMDowMCcsJ1NZRCcsJzIxOjA5OjAwJywnTCcsOS4xNjYsNDU4MywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTY0JywxLCdUSFInLCcwOTowMDowMCcsJ0tCTCcsJzEyOjMwOjAwJywnTCcsMi4wMTQsMTAwNywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTY1JywxLCdLQkwnLCcwOTowMDowMCcsJ1RIUicsJzA5OjMwOjAwJywnTCcsMi4wMTQsMTAwNywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTY2JywxLCdUSFInLCcwOTowMDowMCcsJ0tISScsJzEyOjUzOjAwJywnTCcsMi4zODQsMTE5MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTY3JywxLCdLSEknLCcwOTowMDowMCcsJ1RIUicsJzA5OjUzOjAwJywnTCcsMi4zODQsMTE5MiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTY4JywxLCdUSFInLCcwOTowMDowMCcsJ0NBSScsJzA5OjU3OjAwJywnTCcsMi40NjQsMTIzMiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTY5JywxLCdDQUknLCcwOTowMDowMCcsJ1RIUicsJzEyOjU3OjAwJywnTCcsMi40NjQsMTIzMiwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExMjE0JywxLCdUUEUnLCcwOTowMDowMCcsJ0hLRycsJzEwOjAwOjAwJywnTCcsMS4wMDYsNTAzLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTEyMTMnLDIsJ0hLRycsJzE1OjMzOjAwJywnVFBFJywnMTY6MzM6MDAnLCdMJywxLjAwNiw1MDMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU3MicsMSwnVFBFJywnMDk6MDA6MDAnLCdTWUQnLCcyMTowMjowMCcsJ0wnLDkuMDM2LDQ1MTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU3MycsMSwnU1lEJywnMDk6MDA6MDAnLCdUUEUnLCcxNTowMjowMCcsJ0wnLDkuMDM2LDQ1MTgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU3NCcsMSwnVFBFJywnMDk6MDA6MDAnLCdPU0EnLCcxMjowODowMCcsJ0wnLDIuMTM4LDEwNjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU3NScsMSwnT1NBJywnMDk6MDA6MDAnLCdUUEUnLCcxMDowODowMCcsJ0wnLDIuMTM4LDEwNjksJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU3NicsMSwnV0FXJywnMDk6MDA6MDAnLCdQUkcnLCcwOTozODowMCcsJ1MnLDAuNjQsMzIwLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NzcnLDEsJ1BSRycsJzA5OjAwOjAwJywnV0FXJywnMDk6Mzg6MDAnLCdTJywwLjY0LDMyMCwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTc4JywxLCdXQVcnLCcwOTowMDowMCcsJ1NWTycsJzEyOjI1OjAwJywnTCcsMS40MjgsNzE0LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1NzknLDEsJ1NWTycsJzA5OjAwOjAwJywnV0FXJywnMDg6MjU6MDAnLCdMJywxLjQyOCw3MTQsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU4MCcsMSwnV0FXJywnMDk6MDA6MDAnLCdBUk4nLCcwOToyODowMCcsJ1MnLDAuNDc4LDIzOSwnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTgxJywxLCdBUk4nLCcwOTowMDowMCcsJ1dBVycsJzA5OjI4OjAwJywnUycsMC40NzgsMjM5LCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzEzNzknLDEsJ1lVTCcsJzA5OjAwOjAwJywnTURXJywnMDk6Mjk6MDAnLCdMJywxLjQ5NCw3NDcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTM4MCcsMiwnTURXJywnMTM6MDM6MDAnLCdZVUwnLCcxNTozMjowMCcsJ0wnLDEuNDk0LDc0NywnQjc0NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNTg0JywxLCdZVUwnLCcwOTowMDowMCcsJ0pGSycsJzA5OjM5OjAwJywnUycsMC42NjQsMzMyLCdCNzQ3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE1ODUnLDEsJ0pGSycsJzA5OjAwOjAwJywnWVVMJywnMDk6Mzk6MDAnLCdTJywwLjY2NCwzMzIsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU4NicsMSwnWVVMJywnMDk6MDA6MDAnLCdTRk8nLCcxMTowNDowMCcsJ0wnLDUuMDc2LDI1MzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU4NycsMSwnU0ZPJywnMDk6MDA6MDAnLCdZVUwnLCcxNzowNDowMCcsJ0wnLDUuMDc2LDI1MzgsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU4OCcsMSwnWVlaJywnMDk6MDA6MDAnLCdTRUEnLCcxMDowODowMCcsJ0wnLDQuMTM0LDIwNjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU4OScsMSwnU0VBJywnMDk6MDA6MDAnLCdZWVonLCcxNjowODowMCcsJ0wnLDQuMTM0LDIwNjcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU5MCcsMSwnWVlaJywnMDk6MDA6MDAnLCdNSUEnLCcxMToyODowMCcsJ0wnLDIuNDc0LDEyMzcsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU5MScsMiwnTUlBJywnMTI6NDU6MDAnLCdZWVonLCcxNToxMzowMCcsJ0wnLDIuNDc0LDEyMzcsJ0RDMTAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU5MicsMSwnWVlaJywnMDk6MDA6MDAnLCdMSFInLCcyMTowNjowMCcsJ0wnLDcuMTA2LDM1NTMsJ0RDMTAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTU5MycsMSwnTEhSJywnMDk6MDA6MDAnLCdZWVonLCcxMTowNjowMCcsJ0wnLDcuMTA2LDM1NTMsJ0I3NDcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTYwMCcsMSwnU0ZPJywnMDc6MDA6MDAnLCdMQVgnLCcwNzo0MTowMCcsJ1MnLDAuNjk0LDM0NywnQjc2NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnQUExNjAxJywxLCdMQVgnLCcwNzowMDowMCcsJ1NGTycsJzA3OjQxOjAwJywnUycsMC42OTQsMzQ3LCdCNzY3Jyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdBQTE2MDInLDEsJ1NGTycsJzE0OjAwOjAwJywnTEFYJywnMTQ6NDE6MDAnLCdTJywwLjY5NCwzNDcsJ0I3NjcnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ0FBMTYwMycsMSwnTEFYJywnMTQ6MDA6MDAnLCdTRk8nLCcxNDo0MTowMCcsJ1MnLDAuNjIyLDM0NywnQjc2NycpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNjAwJywxLCdZWVonLCcwOTowMDowMCcsJ1lVTCcsJzA5OjM3OjAwJywnUycsMC42OTQsMzExLCdEQzEwJyk7IAoraW5zZXJ0IGludG8gRkxJR0hUUyB2YWx1ZXMgKCdVUzE2MDAnLDIsJ1lVTCcsJzEwOjAwOjAwJywnU0NMJywnMTg6NTU6MDAnLCdMJywxMC45MjYsNTQ2MywnREMxMCcpOyAKK2luc2VydCBpbnRvIEZMSUdIVFMgdmFsdWVzICgnVVMxNjAxJywxLCdTQ0wnLCcwNTowMDowMCcsJ1lVTCcsJzE3OjU1OjAwJywnTCcsMTAuOTI2LDU0NjMsJ0RDMTAnKTsgCitpbnNlcnQgaW50byBGTElHSFRTIHZhbHVlcyAoJ1VTMTYwMScsMiwnWVVMJywnMTk6MDA6MDAnLCdZWVonLCcxOTozNzowMCcsJ0wnLDAuNjIyLDMxMSwnREMxMCcpOyAKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1pbnRlZ3JhdGlvbi9leGFtcGxlcy9wb20ueG1sIGIvMTAwMG1wMS9vcGVuanBhLWludGVncmF0aW9uL2V4YW1wbGVzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1ZTEyNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1pbnRlZ3JhdGlvbi9leGFtcGxlcy9wb20ueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorCis8IS0tCisgICAgVGhpcyBpbnRlZ3JhdGlvbiBidWlsZCB0ZXN0cyB0aGUgZXhhbXBsZXMgdGhhdCBhcmUgYnVuZGxlZCB3aXRoCisgICAgdGhlIE9wZW5KUEEgZGlzdHJpYnV0aW9uLgorCisgICAgVGhlIGV4YW1wbGVzIHdpbGwgb25seSBiZSBydW4gaWYgeW91IGhhdmUgdGhlICdleGFtcGxlcy1wcm9maWxlJyBlbmFibGVkOgorCisgICAgICAgIG12biBpbnRlZ3JhdGlvbi10ZXN0IC1QZXhhbXBsZXMtcHJvZmlsZQorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAKKyAgICAgICAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+T3BlbkpQQSBFeGFtcGxlcyBJbnRlZ3JhdGlvbiBUZXN0czwvbmFtZT4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtaW50ZWdyYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgIDxpZD5leGFtcGxlcy1wcm9maWxlPC9pZD4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnJ1bi1leGFtcGxlczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+aW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPlJ1bm5pbmcgT3BlbkpQQSBFeGFtcGxlczwvZWNobz4KKworCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXhhbXBsZXMuYmFzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQvZXhhbXBsZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7ZXhhbXBsZXMuYmFzZX0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bnppcCBvdmVyd3JpdGU9ImZhbHNlIiBkZXN0PSIke2V4YW1wbGVzLmJhc2V9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vb3BlbmpwYS1wcm9qZWN0L3RhcmdldC9hc3NlbWJseSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3BlbmpwYS0qJHt2ZXJzaW9ufS1iaW5hcnkuemlwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3VuemlwPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8c3ViYW50IGluaGVyaXRBbGw9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZXhhbXBsZXMuYmFzZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIqL2V4YW1wbGVzLyovYnVpbGQueG1sIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N1YmFudD4KKworICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtaW50ZWdyYXRpb24vcG9tLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1pbnRlZ3JhdGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNTEyZGUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtaW50ZWdyYXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMAorICAgICAgICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1pbnRlZ3JhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPk9wZW5KUEEgSW50ZWdyYXRpb24gVGVzdHM8L25hbWU+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT50Y2s8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtaW50ZWdyYXRpb24vdGNrL3BvbS54bWwgYi8xMDAwbXAxL29wZW5qcGEtaW50ZWdyYXRpb24vdGNrL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjODhiZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1pbnRlZ3JhdGlvbi90Y2svcG9tLnhtbApAQCAtMCwwICsxLDMxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+CisKKzwhLS0KKyAgICBUaGlzIGJ1aWxkIGZpbGUgaXMgdXNlZCB0byBydW4gdGhlIEpQQSBUQ0suIEl0IGFzc3VtZXMgdGhhdCB5b3UgaGF2ZQorICAgIHRoZSBUQ0sgemlwIGZpbGUgbG9jYXRlZCBhdDoKKworICAgICAgICAke3VzZXIuaG9tZX0vLm0yL3ByaXZhdGVyZXBvcy9qcGEtMV8wYi10Y2suemlwCisKKyAgICBJZiB5b3UgaGF2ZSB0aGF0IGZpbGUgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24sIGl0IGNhbiBiZSBzcGVjaWZpZWQgd2l0aAorICAgIHRoZSAidGNrLnppcCIgc3lzdGVtIHByb3BlcnR5LgorCisgICAgVGhlIFRDSyB3aWxsIG9ubHkgYmUgcnVuIGlmIHlvdSBoYXZlIHRoZSAidGNrLXByb2ZpbGUiIGVuYWJsZWQuCisKKyAgICBUbyBydW4gYSBzcGVjaWZpYyBwYWNrYWdlIG9mIHRlc3RzLCB1c2UgdGhlICJqcGF0Y2sucGtnLmRpciIgc3lzdGVtCisgICAgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgdGVzdHMgeW91IHdhbnQgdG8gcnVuLgorICAgIEUuZy46CisKKyAgICAgICAgbXZuIGludGVncmF0aW9uLXRlc3QgLVB0Y2stcHJvZmlsZSAtRGpwYXRjay5wa2cuZGlyPWNvbS9zdW4vdHMvdGVzdHMvZWpiMzAvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvbWFwcGVkc2MvZGVzY3JpcHRvcnMKKworICAgIFRoZSBUQ0sgcnVubmluZyBwcm9jZXNzIHdpbGwgZG8gdGhlIGZvbGxvd2luZzoKKworICAgIDEuIEZpbmUgdGhlIFRDSyB6aXAgZmlsZSBhbmQgZXh0cmFjdCBpdAorICAgIDIuIENyZWF0ZSBhbiBvcGVuanBhLXByb3ZpZXIucHJvcGVydGllcyBmaWxlIHdpdGggdGhlIE9wZW5KUEEgY29uZmlnCisgICAgMy4gTW9kaWZ5IHRoZSBUQ0sncyBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSAodHMuanRlKSB0byB1c2UgT3BlbkpQQQorICAgIDQuIFJ1biB0aGUgZGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gc2NyaXB0CisgICAgNS4gUnVuIHRoZSBUQ0sgc2NyaXB0CisgICAgNi4gUGFyc2UgdGhlIFRDSyByZXN1bHQgbG9nIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGZhaWwgdGhlIGJ1aWxkIG9yIG5vdAorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAKKyAgICAgICAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPnRjazwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPk9wZW5KUEEgSlBBIFRDSyBJbnRlZ3JhdGlvbiBUZXN0czwvbmFtZT4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtaW50ZWdyYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgIDxpZD50Y2stcHJvZmlsZTwvaWQ+CisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5ydW4tdGNrPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+UnVubmluZyBTdW4gSlBBIFRDSzwvZWNobz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRjay56aXAiIHZhbHVlPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke3NldHRpbmdzLmxvY2FsUmVwb3NpdG9yeX0vLi4vcHJpdmF0ZXJlcG9zL2pwYS0xXzBiLXRjay56aXAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0Y2suYXZhaWxhYmxlIiBmaWxlPSIke3Rjay56aXB9Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmFpbCB1bmxlc3M9InRjay5hdmFpbGFibGUiPlRoZSBUQ0sgZmlsZSAke3Rjay56aXB9IGRvZXMgbm90IGV4aXN0LiBUaGlzIGZpbGUgbXVzdCBiZSBkb3dubG9hZGVkIHNlcGFyYXRlbHkgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBydW4gdGhlIEpQQSBUQ0s8L2ZhaWw+CisKKworICAgICAgICAgICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGNrLmF2YWlsYWJsZSIgZmlsZT0iJHt0Y2suemlwfSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZhaWwgdW5sZXNzPSJ0Y2suYXZhaWxhYmxlIj5UaGUgVENLIGZpbGUgc3BlY2lmaWMgaW4gdGhlICJ0Y2suemlwIiBzeXN0ZW0gcHJvcGVydHkgKCR7dGNrLnppcH0pIGRvZXMgbm90IGV4aXN0LiBUaGlzIGZpbGUgbXVzdCBiZSBkb3dubG9hZGVkIHNlcGFyYXRlbHkgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBydW4gdGhlIEpQQSBUQ0s8L2ZhaWw+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0Y2suYmFzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQvdGNrIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGNrLmRpciIgdmFsdWU9IiR7dGNrLmJhc2V9L2pwYXRjayIvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0Y2suZGlyfSIvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8dW56aXAgb3ZlcndyaXRlPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9IiR7dGNrLnppcH0iIGRlc3Q9IiR7dGNrLmJhc2V9Ii8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJjcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIi8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHVzZSBvZmZpY2lhbCBKUEEgQVBJIGluc3RlYWQgb2YgR00ncyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGNrLmRpcn0vbGliIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovZ2Vyb25pbW8tanBhKiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9ImNwLnByb3BlcnR5IiByZWZpZD0iY3AiLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRiLmRyaXZlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGIudXJsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqZGJjOmRlcmJ5OmRlcmJ5LWRhdGFiYXNlO2NyZWF0ZT10cnVlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGIudXNlcm5hbWUiIHZhbHVlPSJub3VzZXJuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGIucGFzc3dvcmQiIHZhbHVlPSJub3Bhc3N3b3JkIi8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGF0Y2sucGtnLmRpciIgdmFsdWU9ImNvbSIvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ianBhdGNrLndvcmsuZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rjay5kaXJ9Ly4uL3dvcmsiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0Y2subG9nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rjay5iYXNlfS9vcGVuanBhLXRjay5sb2ciLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wZW5qcGEucHJvcGVydGllcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0Y2suZGlyfS9vcGVuanBhLXByb3ZpZXIucHJvcGVydGllcyIvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgT3BlbkpQQSBwcm9wZXJ0aWVzIGZvciB0aGUgVENLIHJ1biAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvIGFwcGVuZD0iZmFsc2UiIGZpbGU9IiR7b3BlbmpwYS5wcm9wZXJ0aWVzfSI+CitqYXZheC5wZXJzaXN0ZW5jZS5wcm92aWRlcjogb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUHJvdmlkZXJJbXBsCitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiAke2RiLmRyaXZlcn0KK29wZW5qcGEuQ29ubmVjdGlvblVSTDogJHtkYi51cmx9CitvcGVuanBhLkNvbm5lY3Rpb25Vc2VyTmFtZTogJHtkYi51c2VybmFtZX0KK29wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkOiAke2RiLnBhc3N3b3JkfQorb3BlbmpwYS5GZXRjaEJhdGNoU2l6ZTogLTEKK29wZW5qcGEuQ29tcGF0aWJpbGl0eTogU3RyaWN0SWRlbnRpdHlWYWx1ZXM9dHJ1ZQorb3BlbmpwYS5TZXF1ZW5jZTogdGltZQorb3BlbmpwYS5Mb2c6IERlZmF1bHRMZXZlbD1XQVJOCitvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5OiBTdG9yZUNoYXJzQXNOdW1iZXJzPWZhbHNlCitvcGVuanBhLmpkYmMuU2NoZW1hRmFjdG9yeTogbmF0aXZlKEZvcmVpZ25LZXlzPXRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXBwZW5kIE9wZW5KUEEtc3BlY2lmaWMgY29uZmlndXJhdGlvbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGF0Y2suY29uZmlnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rjay5kaXJ9L2Jpbi90cy5qdGUiLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gYXBwZW5kPSJmYWxzZSIgZmlsZT0iJHtqcGF0Y2suY29uZmlnfS50bXAiPgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE9wZW5KUEEgc3BlY2lmaWMgcHJvcGVydGllcyBmb2xsb3cKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworanBhLmhvbWU9JHt0Y2suZGlyfQord29yay5kaXI9JHtqcGF0Y2sud29yay5kaXJ9CityZXBvcnQuZGlyPSR7dGNrLmRpcn0vLi4vcmVwb3J0cworanBhLmNsYXNzZXM9JHtjcC5wcm9wZXJ0eX0KK2RhdGFiYXNlLmNsYXNzZXM9JHtqcGEuY2xhc3Nlc30KKyMgTmVlZCB0byBzcGVjaWZ5IGphdmEuKiBjbGFzc2VzLCBib3RoIGluIFdpbmRvd3MvVU5JWCBsb2NhdGlvbnMgYXMgd2VsbCBhcyBNYWMuCisjIFRoaXMgaW5jbHVkZXMgYSBmZXcgZGlmZmVyZW50IHBvc3NpYmxlIGxvY2F0aW9uczsgb25seSBvbmUgb2YgdGhlbSBuZWVkcyB0byAKKyMgYWN0dWFsbHkgd29yayBmb3IgYSBnaXZlbiBlbnZpcm9ubWVudC4KK3NpZ1Rlc3RDbGFzc3BhdGg9JHtKQVZBX0hPTUV9L2xpYi9ydC5qYXIke3BhdGguc2VwYXJhdG9yfSR7SkFWQV9IT01FfS9qcmUvbGliL3J0LmphciR7cGF0aC5zZXBhcmF0b3J9JHtKQVZBX0hPTUV9Ly4uL0NsYXNzZXMvY2xhc3Nlcy5qYXIke3BhdGguc2VwYXJhdG9yfSQke2pwYS5jbGFzc2VzfQorcGVyc2lzdGVuY2UudW5pdC5wcm9wZXJ0aWVzLmZpbGUuZnVsbC5wYXRoPSR7b3BlbmpwYS5wcm9wZXJ0aWVzfQorZGF0YWJhc2UudXNlcj0ke2RiLnVzZXJuYW1lfQorZGF0YWJhc2UucGFzc3dkPSR7ZGIucGFzc3dvcmR9CitkYXRhYmFzZS51cmw9JHtkYi51cmx9CitkYXRhYmFzZS5kcml2ZXI9JHtkYi5kcml2ZXJ9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZWNobz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb252ZXJ0IGJhY2tzbGFzaGVzIGFuZCBrbm93biBwYXRocyB3aXRoIHNwYWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdldCBhcm91bmQgYSBwcm9ibGVtIHdpdGggdGhlIFRDSyB0ZXN0cnVubmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHdpbmRvd3MgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBzdW1tYXJ5PSJ5ZXMiIGZpbGU9IiR7anBhdGNrLmNvbmZpZ30udG1wIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZmlsdGVyZmlsZT0id2luZG93cy1yZXBsYWNlZmlsdGVyLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25jYXQgYXBwZW5kPSJ0cnVlIiBkZXN0ZmlsZT0iJHtqcGF0Y2suY29uZmlnfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZmlsZT0iJHtqcGF0Y2suY29uZmlnfS50bXAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uY2F0PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0iYWdlbnQucGF0aCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9vcGVuanBhLWFsbC90YXJnZXQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoY29udmVydCBkaXJzZXA9Ii8iIHByb3BlcnR5PSJhZ2VudCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWQ9ImFnZW50LnBhdGgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkFHRU5UOiAke2FnZW50fTwvZWNobz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgdGhlIGV4aXN0aW5nIGphdmFhZ2VudCBhcmd1bWVudCAod2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzIFRvcGxpbmsncyBlbmhhbmNlcikgd2l0aCBvdXIgb3duLiBBbHNvLCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBNZXRhRGF0YUZhY3RvcnkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciB0byBhbGxvdyB0ZXN0cyB0aGF0IGRvbid0IGhhdmUgYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBjbGFzc2VzIHRvIHdvcmsgKGxpa2UgdGhlIFNpZ25hdHVyZVRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlIGZpbGU9IiR7anBhdGNrLmNvbmZpZ30iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSItamF2YWFnZW50OiR7anBhLmhvbWV9L2xpYi90b3BsaW5rLWVzc2VudGlhbHMtYWdlbnQuamFyIiB2YWx1ZT0iLWphdmFhZ2VudDoke2FnZW50fSAtRG9wZW5qcGEuTWV0YURhdGFGYWN0b3J5PWpwYShEZWZhdWx0QWNjZXNzVHlwZT1QUk9QRVJUWSkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVwbGFjZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBtYWtlIGEgbWFjcm8gZm9yIHRoZSBUQ0sgaGFybmVzcyBsYXVuY2hlciAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYWNyb2RlZiBuYW1lPSJ0c2FudCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWlsZGZpbGUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9IiR7dGNrLmRpcn0vc3JjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0PSIke3Rjay5sb2d9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD0iNzIwMDAwMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItZW1hY3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1idWlsZGZpbGUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9IkB7YnVpbGRmaWxlfSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLWxpc3RlbmVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJjb20uc3VuLmFudC5UU0J1aWxkTGlzdGVuZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1sb2dnZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9ImNvbS5zdW4uYW50LlRTTG9nZ2VyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJAe3RhcmdldH0iLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudiBrZXk9IlRTX0hPTUUiIHZhbHVlPSIuLiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0idHMuaG9tZSIgdmFsdWU9Ii4uIi8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJBTlRfSE9NRSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0Y2suZGlyfS90b29scy9hbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImFudC5ob21lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rjay5kaXJ9L3Rvb2xzL2FudCIvPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJwa2cuZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2pwYXRjay5wa2cuZGlyfSIvPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJjcCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0Y2suZGlyfS90b29scy9hbnQvbGliIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFjcm9kZWY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkxvZ2dpbmcgSlBBIFRDSyBvdXRwdXQgdG8gJHt0Y2subG9nfTwvZWNobz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmaXJzdCBpbml0aWFsaXplIHRoZSBkYXRhYmFzZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0c2FudCBidWlsZGZpbGU9IiR7dGNrLmRpcn0vYmluL2luaXRkYi54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSJpbml0LmRhdGFiYXNlIi8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbm93IHJ1biB0aGUgVENLIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRzYW50IGJ1aWxkZmlsZT0iJHt0Y2suZGlyfS9iaW4vYnVpbGQueG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD0icnVuY2xpZW50Ii8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVENLJ3MgSmF2YSBwcm9jZXNzIGRvZXNuJ3QgYWN0dWFsbHkgZmFpbCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgZmFpbCwgc28gd2UgbmVlZCB0byBwYXJzZSB0aGUgcmVzdWx0cyBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaXQgcGFzc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9hZGZpbGUgcHJvcGVydHk9ImpwYXRjay5yZXN1bHRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2ZpbGU9IiR7anBhdGNrLndvcmsuZGlyfS9qdERhdGEvbG9nLnR4dCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBhdGNrLmZhaWxlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHtqcGF0Y2sucmVzdWx0c30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cmluZz0iQ29tcGxldGVkIHRlc3QgcnVuOiBub3Qgb2siLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZhaWwgaWY9ImpwYXRjay5mYWlsZWQiPlNvbWUgdGVzdHMgZmFpbGVkPC9mYWlsPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5KUEEgVENLIFBhc3NlZCAxMDAlITwvZWNobz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRjay5yZXN1bHRzLmFyY2hpdmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7dGNrLmJhc2V9L29wZW5qcGEtdGNrLXJlc3VsdHMuemlwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSIke3Rjay5yZXN1bHRzLmFyY2hpdmV9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7anBhdGNrLndvcmsuZGlyfSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+UmVzdWx0cyBhcmNoaXZlIGF0OiAke3Rjay5yZXN1bHRzLmFyY2hpdmV9PC9lY2hvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxyZXBvc2l0b3JpZXM+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IE1hdmVuIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vbWF2ZW4tcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQvbm9uYXYvcmVwb3NpdG9yeTwvdXJsPgorICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KKyAgICAgICAgPC9yZXBvc2l0b3J5PgorICAgIDwvcmVwb3NpdG9yaWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPCEtLSB1c2UgdGhlIGF1dGhvcml0YXRpdmUgamF2YXgucGVyc2lzdGVuY2UgQVBJIGZvciB0ZXN0aW5nIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wYjwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEta2VybmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmRlcmJ5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVyYnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xMC4yLjEuNjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtaW50ZWdyYXRpb24vdGNrL3dpbmRvd3MtcmVwbGFjZWZpbHRlci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWludGVncmF0aW9uL3Rjay93aW5kb3dzLXJlcGxhY2VmaWx0ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTIyYTdiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWludGVncmF0aW9uL3Rjay93aW5kb3dzLXJlcGxhY2VmaWx0ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK1xcOiAvCitEb2N1bWVudHNcIGFuZFwgU2V0dGluZ3M6IERvY3VtZX4xCitQcm9ncmFtXCBGaWxlczogUHJvZ3JhfjEKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjLTUvcG9tLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjLTUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTg4MDk1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMtNS9wb20ueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtamRiYy01PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+T3BlbkpQQSBKREJDIDEuNTwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+T3BlbkpQQSBKREJDIDEuNTwvZGVzY3JpcHRpb24+CisgICAgPHVybD5odHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvcHJvamVjdHMvb3BlbmpwYTwvdXJsPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1qZGJjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjLTUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQzNTYXZlcG9pbnRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy01L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkMzU2F2ZXBvaW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy01L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkMzU2F2ZXBvaW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU2F2ZXBvaW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBTYXZlcG9pbnRNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgSkRCQyAzIHNhdmVwb2ludHMKKyAqIHRvIHN0b3JlIHN0YXRlLiBUaGlzIHBsdWdpbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIHRyaWdnZXJpbmcKKyAqIGEgZmx1c2ggb24gdGhlIHtAbGluayBCcm9rZXJ9LgorICogCisgKiA8Yj5Ob3RlIHRoYXQgdGhpcyBwbHVnaW4gcmVxdWlyZXMgYSBkYXRhYmFzZSBhbmQgSkRCQyBkcml2ZXIgd2hpY2gKKyAqIHN1cHBvcnRzIEpEQkMgMyBzYXZlcG9pbnRzPC9iPgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAc2luY2UgMC4zLjQKKyAqLworcHVibGljIGNsYXNzIEpEQkMzU2F2ZXBvaW50TWFuYWdlcgorICAgIGV4dGVuZHMgQWJzdHJhY3RKREJDU2F2ZXBvaW50TWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChKREJDM1NhdmVwb2ludE1hbmFnZXIuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIHZvaWQgcm9sbGJhY2tEYXRhU3RvcmUoQ29ubmVjdGlvblNhdmVwb2ludCBzYXZlcG9pbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IHNhdmVwb2ludC5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnJvbGxiYWNrKChTYXZlcG9pbnQpIHNhdmVwb2ludC5nZXREYXRhU3RvcmVTYXZlcG9pbnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzcWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJlcnJvci1yb2xsYmFjayIsCisgICAgICAgICAgICAgICAgc2F2ZXBvaW50LmdldE5hbWUoKSksIHNxZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXREYXRhU3RvcmUoQ29ubmVjdGlvblNhdmVwb2ludCBzYXZlcG9pbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IHNhdmVwb2ludC5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBzYXZlcG9pbnQuc2V0RGF0YVN0b3JlU2F2ZXBvaW50KGNvbm4uc2V0U2F2ZXBvaW50CisgICAgICAgICAgICAgICAgKHNhdmVwb2ludC5nZXROYW1lKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNxZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImVycm9yLXNhdmUiLAorICAgICAgICAgICAgICAgIHNhdmVwb2ludC5nZXROYW1lKCkpLCBzcWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMtNS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0VudW1WYWx1ZUhhbmRsZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjLTUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9FbnVtVmFsdWVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyY2Y2MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjLTUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9FbnVtVmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBWYWx1ZSBoYW5kbGVyIGZvciBKREsxLjUgZW51bSBmaWVsZCB0eXBlcy4KKyAqCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtVmFsdWVIYW5kbGVyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlSGFuZGxlciB7CisKKyAgICBwcml2YXRlIEVudW1bXSBfdmFscyA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9vcmRpbmFsID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHN0b3JlIHRoZSBlbnVtIHZhbHVlIGFzIGl0cyBvcmRpbmFsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFN0b3JlT3JkaW5hbCgpIHsKKyAgICAgICAgcmV0dXJuIF9vcmRpbmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc3RvcmUgdGhlIGVudW0gdmFsdWUgYXMgaXRzIG9yZGluYWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVPcmRpbmFsKGJvb2xlYW4gb3JkaW5hbCkgeworICAgICAgICBfb3JkaW5hbCA9IG9yZGluYWw7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIG1hcChWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBDb2x1bW5JTyBpbywKKyAgICAgICAgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICAvLyBhbGwgZW51bSBjbGFzc2VzIGhhdmUgYSBzdGF0aWMgbWV0aG9kIGNhbGxlZCAndmFsdWVzKCknCisgICAgICAgIC8vIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIGVudW0gdmFsdWVzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IHZtLmdldFR5cGUoKS5nZXRNZXRob2QoInZhbHVlcyIsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIF92YWxzID0gKEVudW1bXSkgbS5pbnZva2UobnVsbCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbigpLnNldENhdXNlKGUpOworICAgICAgICB9CisKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgY29sLnNldE5hbWUobmFtZSk7CisgICAgICAgIGlmIChfb3JkaW5hbCkKKyAgICAgICAgICAgIGNvbC5zZXRKYXZhVHlwZShKYXZhVHlwZXMuU0hPUlQpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBsb25nZXN0IGVudW0gdmFsdWUgbmFtZTsgdXNlIDIwIGFzIG1pbiBsZW5ndGggdG8KKyAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGZ1dHVyZSBsb25nIG5hbWVzCisgICAgICAgICAgICBpbnQgbGVuID0gMjA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF92YWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGxlbiA9IE1hdGgubWF4KF92YWxzW2ldLm5hbWUoKS5sZW5ndGgoKSwgbGVuKTsKKworICAgICAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5TVFJJTkcpOworICAgICAgICAgICAgY29sLnNldFNpemUobGVuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENvbHVtbltdeyBjb2wgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25hYmxlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChfb3JkaW5hbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcigoKEVudW0pIHZhbCkub3JkaW5hbCgpKTsKKyAgICAgICAgcmV0dXJuICgoRW51bSkgdmFsKS5uYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b09iamVjdFZhbHVlKFZhbHVlTWFwcGluZyB2bSwgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKF9vcmRpbmFsKQorICAgICAgICAgICAgcmV0dXJuIF92YWxzWygoTnVtYmVyKSB2YWwpLmludFZhbHVlKCldOworICAgICAgICByZXR1cm4gRW51bS52YWx1ZU9mKHZtLmdldFR5cGUoKSwgKFN0cmluZykgdmFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9wb20ueG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFlYjRmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvcG9tLnhtbApAQCAtMCwwICsxLDgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWpkYmM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5PcGVuSlBBIEpEQkM8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPk9wZW5KUEEgSkRCQzwvZGVzY3JpcHRpb24+CisgICAgPHVybD5odHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvcHJvamVjdHMvb3BlbmpwYTwvdXJsPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+amF2YTE0LXZhbGlkYXRlPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPjxwcm9wZXJ0eT48bmFtZT5qYXZhMTQuamFyPC9uYW1lPjwvcHJvcGVydHk+PC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym9vdGNsYXNzcGF0aD4ke2phdmExNC5qYXJ9PC9ib290Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWtlcm5lbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+aHNxbGRiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHNxbGRiPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS44LjAuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjQ8L3RhcmdldD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9NYXBwaW5nVG9vbFRhc2suamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L01hcHBpbmdUb29sVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjExMWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9NYXBwaW5nVG9vbFRhc2suamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmFudC5BYnN0cmFjdFRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5GaWxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk11bHRpTG9hZGVyQ2xhc3NSZXNvbHZlcjsKKworLyoqCisgKiBFeGVjdXRlcyB0aGUge0BsaW5rIE1hcHBpbmdUb29sfSBvbiB0aGUgc3BlY2lmaWVkIGZpbGVzLgorICogVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPjxjb2RlPmFjdGlvbjwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPm1ldGE8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5zY2hlbWFBY3Rpb248L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5kcm9wVGFibGVzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+aWdub3JlRXJyb3JzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+cmVhZFNjaGVtYTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnByaW1hcnlLZXlzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+Zm9yZWlnbktleXM8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5pbmRleGVzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+ZmlsZTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnNjaGVtYUZpbGU8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5zcWxGaWxlPC9jb2RlPjwvbGk+CisgKiA8L3VsPiBPZiB0aGVzZSBhcmd1bWVudHMsIG9ubHkgPGNvZGU+YWN0aW9uPC9jb2RlPiBpcyByZXF1aXJlZC4KKyAqLworcHVibGljIGNsYXNzIE1hcHBpbmdUb29sVGFzaworICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE1hcHBpbmdUb29sVGFzay5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgTWFwcGluZ1Rvb2wuRmxhZ3MgZmxhZ3MgPSBuZXcgTWFwcGluZ1Rvb2wuRmxhZ3MoKTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGUgPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2NoZW1hRmlsZSA9IG51bGw7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzcWxGaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW51bWVyYXRlZCBNYXBwaW5nVG9vbCBhY3Rpb24gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oQWN0aW9uIGFjdCkgeworICAgICAgICBmbGFncy5hY3Rpb24gPSBhY3QuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVudW1lcmF0ZWQgU2NoZW1hVG9vbCBhY3Rpb24gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFBY3Rpb24oU2NoZW1hQWN0aW9uIGFjdCkgeworICAgICAgICBmbGFncy5zY2hlbWFBY3Rpb24gPSBhY3QuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgTWFwcGluZ1Rvb2wgc2hvdWxkIHJlYWQgdGhlIGZ1bGwgc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRTY2hlbWEoYm9vbGVhbiByZWFkU2NoZW1hKSB7CisgICAgICAgIGZsYWdzLnJlYWRTY2hlbWEgPSByZWFkU2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHdlIHdhbnQgdGhlIE1hcHBpbmdUb29sIHRvIGlnbm9yZSBTUUwgZXJyb3JzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUVycm9ycyhib29sZWFuIGlnbm9yZUVycm9ycykgeworICAgICAgICBmbGFncy5pZ25vcmVFcnJvcnMgPSBpZ25vcmVFcnJvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIE1hcHBpbmdUb29sIHNob3VsZCBkcm9wIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wVGFibGVzKGJvb2xlYW4gZHJvcFRhYmxlcykgeworICAgICAgICBmbGFncy5kcm9wVGFibGVzID0gZHJvcFRhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBkcm9wIE9wZW5KUEEgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wZW5KUEFUYWJsZXMoYm9vbGVhbiBvcGVuanBhVGFibGVzKSB7CisgICAgICAgIGZsYWdzLm9wZW5qcGFUYWJsZXMgPSBvcGVuanBhVGFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBNYXBwaW5nVG9vbCBzaG91bGQgZHJvcCBzZXF1ZW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcFNlcXVlbmNlcyhib29sZWFuIGRyb3BTZXF1ZW5jZXMpIHsKKyAgICAgICAgZmxhZ3MuZHJvcFNlcXVlbmNlcyA9IGRyb3BTZXF1ZW5jZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIE1hcHBpbmdUb29sIHNob3VsZCBtYW5pcHVsYXRlIHNlcXVlbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZXMoYm9vbGVhbiBzZXF1ZW5jZXMpIHsKKyAgICAgICAgZmxhZ3Muc2VxdWVuY2VzID0gc2VxdWVuY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGdlbmVyYXRlIHByaW1hcnkga2V5IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXlzKGJvb2xlYW4gcGtzKSB7CisgICAgICAgIGZsYWdzLnByaW1hcnlLZXlzID0gcGtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGdlbmVyYXRlIGZvcmVpZ24ga2V5IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXlzKGJvb2xlYW4gZmtzKSB7CisgICAgICAgIGZsYWdzLmZvcmVpZ25LZXlzID0gZmtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGdlbmVyYXRlIGluZGV4IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4ZXMoYm9vbGVhbiBpZHhzKSB7CisgICAgICAgIGZsYWdzLmluZGV4ZXMgPSBpZHhzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGZpbGUgd2Ugd2FudCB0aGUgTWFwcGluZ1Rvb2wgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGZpbGUgZm9yIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGxhbm5lZCBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hRmlsZShTdHJpbmcgc2NoZW1hRmlsZSkgeworICAgICAgICB0aGlzLnNjaGVtYUZpbGUgPSBzY2hlbWFGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGZpbGUgd2Ugd2FudCB0aGUgTWFwcGluZ1Rvb2wgdG8gd3JpdGUgYSBTUUwgc2NyaXB0IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNRTEZpbGUoU3RyaW5nIHNxbEZpbGUpIHsKKyAgICAgICAgdGhpcy5zcWxGaWxlID0gc3FsRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGFjdGlvbiBhcHBsaWVzIHRvIG1ldGFkYXRhIGFzIHdlbGwgYXMgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0YShib29sZWFuIG1ldGEpIHsKKyAgICAgICAgZmxhZ3MubWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25JbXBsIG5ld0NvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSkRCQ0NvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9uKFN0cmluZ1tdIGZpbGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKE1hcHBpbmdUb29sLkFDVElPTl9JTVBPUlQuZXF1YWxzKGZsYWdzLmFjdGlvbikpCisgICAgICAgICAgICBhc3NlcnRGaWxlcyhmaWxlcyk7CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGZsYWdzLm1ldGEgJiYgTWFwcGluZ1Rvb2wuQUNUSU9OX0FERC5lcXVhbHMoZmxhZ3MuYWN0aW9uKSkKKyAgICAgICAgICAgIGZsYWdzLm1ldGFEYXRhRmlsZSA9IEZpbGVzLmdldEZpbGUoZmlsZSwgbG9hZGVyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MubWFwcGluZ1dyaXRlciA9IEZpbGVzLmdldFdyaXRlcihmaWxlLCBsb2FkZXIpOworICAgICAgICBmbGFncy5zY2hlbWFXcml0ZXIgPSBGaWxlcy5nZXRXcml0ZXIoc2NoZW1hRmlsZSwgbG9hZGVyKTsKKyAgICAgICAgZmxhZ3Muc3FsV3JpdGVyID0gRmlsZXMuZ2V0V3JpdGVyKHNxbEZpbGUsIGxvYWRlcik7CisKKyAgICAgICAgTXVsdGlMb2FkZXJDbGFzc1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IE11bHRpTG9hZGVyQ2xhc3NSZXNvbHZlcigpOworICAgICAgICByZXNvbHZlci5hZGRDbGFzc0xvYWRlcihsb2FkZXIpOworICAgICAgICByZXNvbHZlci5hZGRDbGFzc0xvYWRlcihNYXBwaW5nVG9vbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBjb25mLnNldENsYXNzUmVzb2x2ZXIocmVzb2x2ZXIpOworCisgICAgICAgIGlmICghTWFwcGluZ1Rvb2wucnVuKGNvbmYsIGZpbGVzLCBmbGFncywgbG9hZGVyKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWNvbmYiLCAiTWFwcGluZ1Rvb2xUYXNrIikKKyAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGlvbgorICAgICAgICBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFwcGluZ1Rvb2wuQUNUSU9OUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZW1hQWN0aW9uCisgICAgICAgIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSBuZXcgU3RyaW5nW1NjaGVtYVRvb2wuQUNUSU9OUy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoU2NoZW1hVG9vbC5BQ1RJT05TLCAwLCBhY3Rpb25zLCAwLAorICAgICAgICAgICAgICAgIFNjaGVtYVRvb2wuQUNUSU9OUy5sZW5ndGgpOworICAgICAgICAgICAgYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdID0gIm5vbmUiOworICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L1JldmVyc2VNYXBwaW5nVG9vbFRhc2suamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L1JldmVyc2VNYXBwaW5nVG9vbFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E1YWUxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9hbnQvUmV2ZXJzZU1hcHBpbmdUb29sVGFzay5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5Qcm9wZXJ0aWVzUmV2ZXJzZUN1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5SZXZlcnNlQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlJldmVyc2VNYXBwaW5nVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmFudC5BYnN0cmFjdFRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ29kZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiBFeGVjdXRlcyB0aGUge0BsaW5rIFJldmVyc2VNYXBwaW5nVG9vbH0gb24gdGhlIHNwZWNpZmllZCBYTUwgZmlsZXMuCisgKiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CisgKiA8dWw+CisgKiA8bGk+PGNvZGU+cGFja2FnZTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPmRpcmVjdG9yeTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnVzZVNjaGVtYU5hbWU8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT51c2VGb3JlaWduS2V5TmFtZTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPm51bGxhYmxlQXNPYmplY3Q8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5ibG9iQXNPYmplY3Q8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT50eXBlTWFwPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+cHJpbWFyeUtleU9uSm9pbjwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnVzZURhdGFzdG9yZUlkZW50aXR5PC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+dXNlQnVpbHRpbklkZW50aXR5Q2xhc3M8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5kZXRhY2hhYmxlPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+aW52ZXJzZVJlbGF0aW9uczwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPmRpc2NyaW1pbmF0b3JTdHJhdGVneTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnZlcnNpb25TdHJhdGVneTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPmlubmVySWRlbnRpdHlDbGFzc2VzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+aWRlbnRpdHlDbGFzc1N1ZmZpeDwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPm1ldGFkYXRhPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+Y3VzdG9taXplckNsYXNzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+Y3VzdG9taXplclByb3BlcnRpZXM8L2NvZGU+PC9saT4KKyAqIDwvdWw+IFRoZSB0YXNrIGFsc28gYWNjZXB0cyBhbiBlbWJlZGRlZCA8Y29kZT5jb2RlRm9ybWF0PC9jb2RlPiBlbGVtZW50IHdpdGgKKyAqIGF0dHJpYnV0ZXMgZm9yIHRoZSBiZWFuIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBDb2RlRm9ybWF0fS4KKyAqLworcHVibGljIGNsYXNzIFJldmVyc2VNYXBwaW5nVG9vbFRhc2sKKyAgICBleHRlbmRzIEFic3RyYWN0VGFzayB7CisKKyAgICBwcm90ZWN0ZWQgUmV2ZXJzZU1hcHBpbmdUb29sLkZsYWdzIGZsYWdzID0gbmV3IFJldmVyc2VNYXBwaW5nVG9vbC5GbGFncygpOworICAgIHByb3RlY3RlZCBTdHJpbmcgZGlyTmFtZSA9IG51bGw7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlTWFwID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcyA9CisgICAgICAgIFByb3BlcnRpZXNSZXZlcnNlQ3VzdG9taXplci5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBSZXZlcnNlTWFwcGluZ1Rvb2xUYXNrKCkgeworICAgICAgICBmbGFncy5tZXRhRGF0YUxldmVsID0gInBhY2thZ2UiOworICAgICAgICBmbGFncy5mb3JtYXQgPSBuZXcgQ29kZUZvcm1hdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgcGtnKSB7CisgICAgICAgIGZsYWdzLnBhY2thZ2VOYW1lID0gcGtnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyTmFtZSkgeworICAgICAgICB0aGlzLmRpck5hbWUgPSBkaXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIHVzZSB0aGUgc2NoZW1hIG5hbWUgd2hlbiBuYW1pbmcgdGhlIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlU2NoZW1hTmFtZShib29sZWFuIHVzZVNjaGVtYU5hbWUpIHsKKyAgICAgICAgZmxhZ3MudXNlU2NoZW1hTmFtZSA9IHVzZVNjaGVtYU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gdXNlIGZvcmVpZ24ga2V5IG5hbWVzIHRvIG5hbWUgcmVsYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUZvcmVpZ25LZXlOYW1lKGJvb2xlYW4gdXNlRm9yZWlnbktleU5hbWUpIHsKKyAgICAgICAgZmxhZ3MudXNlRm9yZWlnbktleU5hbWUgPSB1c2VGb3JlaWduS2V5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byByZXByZXNlbnQgbnVsbGFibGUgY29sdW1ucyBhcyBwcmltaXRpdmUgd3JhcHBlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVsbGFibGVBc09iamVjdChib29sZWFuIG51bGxhYmxlQXNPYmplY3QpIHsKKyAgICAgICAgZmxhZ3MubnVsbGFibGVBc09iamVjdCA9IG51bGxhYmxlQXNPYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gcmVwcmVzZW50IGJsb2IgY29sdW1ucyBhcyBKYXZhIG9iamVjdHMgcmF0aGVyIHRoYW4KKyAgICAgKiBieXRlW10gZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsb2JBc09iamVjdChib29sZWFuIGJsb2JBc09iamVjdCkgeworICAgICAgICBmbGFncy5ibG9iQXNPYmplY3QgPSBibG9iQXNPYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTUUwgdHlwZSBtYXAgb3ZlcnJpZGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVNYXAoU3RyaW5nIHR5cGVNYXApIHsKKyAgICAgICAgdGhpcy50eXBlTWFwID0gdHlwZU1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBhbGxvdyBwcmltYXJ5IGtleXMgb24gam9pbiB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleU9uSm9pbihib29sZWFuIHByaW1hcnlLZXlPbkpvaW4pIHsKKyAgICAgICAgZmxhZ3MucHJpbWFyeUtleU9uSm9pbiA9IHByaW1hcnlLZXlPbkpvaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gdXNlIGRhdGFzdG9yZSBpZGVudGl0eSBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZURhdGFTdG9yZUlkZW50aXR5KGJvb2xlYW4gdXNlRGF0YVN0b3JlSWRlbnRpdHkpIHsKKyAgICAgICAgZmxhZ3MudXNlRGF0YVN0b3JlSWRlbnRpdHkgPSB1c2VEYXRhU3RvcmVJZGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byB1c2Ugc2luZ2xlIGZpZWxkIGlkZW50aXR5IHdoZXJlIHBvc3NpYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUJ1aWx0aW5JZGVudGl0eUNsYXNzKGJvb2xlYW4gdXNlQnVpbHRpbklkZW50aXR5Q2xhc3MpIHsKKyAgICAgICAgZmxhZ3MudXNlQnVpbHRpbklkZW50aXR5Q2xhc3MgPSB1c2VCdWlsdGluSWRlbnRpdHlDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBnZW5lcmF0ZSBpbnZlcnNlIDEtbWFueS8xLTEgcmVsYXRpb25zIGZvciBhbGwgbWFueS0xLzEtMQorICAgICAqIHJlbGF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnZlcnNlUmVsYXRpb25zKGJvb2xlYW4gaW52ZXJzZVJlbGF0aW9ucykgeworICAgICAgICBmbGFncy5pbnZlcnNlUmVsYXRpb25zID0gaW52ZXJzZVJlbGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBtYWtlIGdlbmVyYXRlZCBjbGFzc2VzIGRldGFjaGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGV0YWNoYWJsZShib29sZWFuIGRldGFjaGFibGUpIHsKKyAgICAgICAgZmxhZ3MuZGV0YWNoYWJsZSA9IGRldGFjaGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5IGZvciBiYXNlIGNsYXNzIG1hcHBpbmdzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JTdHJhdGVneShTdHJpbmcgZGlzY1N0cmF0KSB7CisgICAgICAgIGZsYWdzLmRpc2NyaW1pbmF0b3JTdHJhdGVneSA9IGRpc2NTdHJhdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZlcnNpb24gc3RyYXRlZ3kgZm9yIGJhc2UgY2xhc3MgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvblN0cmF0ZWd5KFN0cmluZyB2ZXJzaW9uU3RyYXQpIHsKKyAgICAgICAgZmxhZ3MudmVyc2lvblN0cmF0ZWd5ID0gdmVyc2lvblN0cmF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIGdlbmVyYXRlIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzZXMgYXMgaW5uZXIgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbm5lcklkZW50aXR5Q2xhc3Nlcyhib29sZWFuIGlubmVyQXBwSWQpIHsKKyAgICAgICAgZmxhZ3MuaW5uZXJJZGVudGl0eUNsYXNzZXMgPSBpbm5lckFwcElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdWZmaXggdG8gdXNlIHRvIGNyZWF0ZSB0aGUgaWRlbnRpdHkgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcywgb3IKKyAgICAgKiBmb3IgaW5uZXIgY2xhc3NlcywgdGhlIG5hbWUgb2YgdGhlIGlubmVyIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkZW50aXR5Q2xhc3NTdWZmaXgoU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICBmbGFncy5pZGVudGl0eUNsYXNzU3VmZml4ID0gc3VmZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGV2ZWwgb2YgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YShMZXZlbCBsZXZlbCkgeworICAgICAgICBmbGFncy5tZXRhRGF0YUxldmVsID0gbGV2ZWwuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b21pemVyIGNsYXNzIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcykgeworICAgICAgICB0aGlzLmN1c3RvbWl6ZXJDbGFzcyA9IGN1c3RvbWl6ZXJDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBwcm9wZXJ0aWVzIGZpbGUgdG8gcGFzcyB0byB0aGUgY3VzdG9taXplciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVyUHJvcGVydGllcyhTdHJpbmcgY3VzdG9taXplclByb3BlcnRpZXMpIHsKKyAgICAgICAgdGhpcy5jdXN0b21pemVyUHJvcGVydGllcyA9IGN1c3RvbWl6ZXJQcm9wZXJ0aWVzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29kZUZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzLmZvcm1hdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkltcGwgbmV3Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKREJDQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT24oU3RyaW5nW10gZmlsZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoZGlyTmFtZSkpCisgICAgICAgICAgICBmbGFncy5kaXJlY3RvcnkgPSBGaWxlcy5nZXRGaWxlKGRpck5hbWUsIGxvYWRlcik7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eSh0eXBlTWFwKSkKKyAgICAgICAgICAgIGZsYWdzLnR5cGVNYXAgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXModHlwZU1hcCk7CisKKyAgICAgICAgLy8gbG9hZCBjdXN0b21pemVyIHByb3BlcnRpZXMKKyAgICAgICAgUHJvcGVydGllcyBjdXN0b21Qcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIEZpbGUgcHJvcHNGaWxlID0gRmlsZXMuZ2V0RmlsZShjdXN0b21pemVyUHJvcGVydGllcywgbG9hZGVyKTsKKyAgICAgICAgaWYgKHByb3BzRmlsZSAhPSBudWxsICYmIHByb3BzRmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgIGN1c3RvbVByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wc0ZpbGUpKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIGNvbmZpZ3VyZSBjdXN0b21pemVyCisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uIGNvbmYgPSAoSkRCQ0NvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZmxhZ3MuY3VzdG9taXplciA9IChSZXZlcnNlQ3VzdG9taXplcikgQ29uZmlndXJhdGlvbnMuCisgICAgICAgICAgICBuZXdJbnN0YW5jZShjdXN0b21pemVyQ2xhc3MsIGNvbmYsIG51bGwsCisgICAgICAgICAgICAgICAgUmV2ZXJzZUN1c3RvbWl6ZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIGlmIChmbGFncy5jdXN0b21pemVyICE9IG51bGwpCisgICAgICAgICAgICBmbGFncy5jdXN0b21pemVyLnNldENvbmZpZ3VyYXRpb24oY3VzdG9tUHJvcHMpOworCisgICAgICAgIFJldmVyc2VNYXBwaW5nVG9vbC5ydW4oY29uZiwgZmlsZXMsIGZsYWdzLCBsb2FkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGV2ZWwKKyAgICAgICAgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgImNsYXNzIiwKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9TY2hlbWFUb29sVGFzay5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9hbnQvU2NoZW1hVG9vbFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTA4NzdmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9hbnQvU2NoZW1hVG9vbFRhc2suamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5hbnQuQWJzdHJhY3RUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBFeGVjdXRlcyB0aGUge0BsaW5rIFNjaGVtYVRvb2x9IG9uIHRoZSBzcGVjaWZpZWQgWE1MIHNjaGVtYSBkZWZpbml0aW9uCisgKiBmaWxlcy4gVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPjxjb2RlPmFjdGlvbjwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPmlnbm9yZUVycm9yczwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPmRyb3BUYWJsZXM8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5kcm9wU2VxdWVuY2VzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+b3BlbmpwYVRhYmxlczwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnByaW1hcnlLZXlzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+Zm9yZWlnbktleXM8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5pbmRleGVzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+c2VxdWVuY2VzPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+cmVjb3JkPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+ZmlsZTwvY29kZT48L2xpPgorICogPC91bD4gT2YgdGhlc2UgYXJndW1lbnRzLCBvbmx5IDxjb2RlPmFjdGlvbjwvY29kZT4gaXMgcmVxdWlyZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWFUb29sVGFzaworICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFNjaGVtYVRvb2xUYXNrLmNsYXNzKTsKKworICAgIHByb3RlY3RlZCBTY2hlbWFUb29sLkZsYWdzIGZsYWdzID0gbmV3IFNjaGVtYVRvb2wuRmxhZ3MoKTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlbnVtZXJhdGVkIFNjaGVtYVRvb2wgYWN0aW9uIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKEFjdGlvbiBhY3QpIHsKKyAgICAgICAgZmxhZ3MuYWN0aW9uID0gYWN0LmdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgd2Ugd2FudCB0aGUgU2NoZW1hVG9vbCB0byBpZ25vcmUgU1FMIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiBpZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgZmxhZ3MuaWdub3JlRXJyb3JzID0gaWdub3JlRXJyb3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGRyb3Agb3IgcmVmbGVjdCBvbiBPcGVuSlBBIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVuSlBBVGFibGVzKGJvb2xlYW4gb3BlbmpwYVRhYmxlcykgeworICAgICAgICBmbGFncy5vcGVuanBhVGFibGVzID0gb3BlbmpwYVRhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgU2NoZW1hVG9vbCBzaG91bGQgZHJvcCBzZXF1ZW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcFNlcXVlbmNlcyhib29sZWFuIGRyb3BTZXF1ZW5jZXMpIHsKKyAgICAgICAgZmxhZ3MuZHJvcFNlcXVlbmNlcyA9IGRyb3BTZXF1ZW5jZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIFNjaGVtYVRvb2wgc2hvdWxkIG1hbmlwdWxhdGUgc2VxdWVuY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcXVlbmNlcyhib29sZWFuIHNlcXVlbmNlcykgeworICAgICAgICBmbGFncy5zZXF1ZW5jZXMgPSBzZXF1ZW5jZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gZ2VuZXJhdGUgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleXMoYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgZmxhZ3MucHJpbWFyeUtleXMgPSBwa3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gZ2VuZXJhdGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleXMoYm9vbGVhbiBma3MpIHsKKyAgICAgICAgZmxhZ3MuZm9yZWlnbktleXMgPSBma3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gZ2VuZXJhdGUgaW5kZXggaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXhlcyhib29sZWFuIGlkeHMpIHsKKyAgICAgICAgZmxhZ3MuaW5kZXhlcyA9IGlkeHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIFNjaGVtYVRvb2wgc2hvdWxkIHJlY29yZCB0byB0aGUgc2NoZW1hIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjb3JkKGJvb2xlYW4gcmVjb3JkKSB7CisgICAgICAgIGZsYWdzLnJlY29yZCA9IHJlY29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlIHdlIHdhbnQgdGhlIFNjaGVtYVRvb2wgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wbCBuZXdDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IEpEQkNDb25maWd1cmF0aW9uSW1wbCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPbihTdHJpbmdbXSBmaWxlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEZpbGVzKGZpbGVzKTsKKworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOworICAgICAgICBmbGFncy53cml0ZXIgPSBGaWxlcy5nZXRXcml0ZXIoZmlsZSwgbG9hZGVyKTsKKyAgICAgICAgaWYgKCFTY2hlbWFUb29sLnJ1bigoSkRCQ0NvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKSwgZmlsZXMsCisgICAgICAgICAgICBmbGFncywgbG9hZGVyKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWNvbmYiLCAiU2NoZW1hVG9vbFRhc2siKQorICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aW9uCisgICAgICAgIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBTY2hlbWFUb29sLkFDVElPTlM7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNmMWJhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9hbnQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBLUpEQkMgQW50IFRhc2tzPC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBBbnQgdGFza3MgZm9yIEpEQkMgT3BlbkpQQSB0b29scy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9GZXRjaE1vZGVWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0ZldGNoTW9kZVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhYmYxZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9GZXRjaE1vZGVWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5FYWdlckZldGNoTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkludFZhbHVlOworCisvKioKKyAqIFZhbHVlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgZmV0Y2ggbW9kZXMuIFRoaXMgdHlwZSBpcworICogZGVmaW5lZCBzZXBhcmF0ZWx5IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYm90aCBpbiB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KKyAqIGFuZCBpbiBjbGFzcyBtZXRhZGF0YSB3aXRoIHRoZSBzYW1lIGVuY2Fwc3VsYXRlZCBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBGZXRjaE1vZGVWYWx1ZQorICAgIGV4dGVuZHMgSW50VmFsdWUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFHRVJfTk9ORSA9ICJub25lIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUdFUl9KT0lOID0gImpvaW4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBR0VSX1BBUkFMTEVMID0gInBhcmFsbGVsIjsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEFMSUFTRVMgPSBuZXcgU3RyaW5nW117CisgICAgICAgIEVBR0VSX1BBUkFMTEVMLCBTdHJpbmcudmFsdWVPZihFYWdlckZldGNoTW9kZXMuRUFHRVJfUEFSQUxMRUwpLAorICAgICAgICBFQUdFUl9KT0lOLCBTdHJpbmcudmFsdWVPZihFYWdlckZldGNoTW9kZXMuRUFHRVJfSk9JTiksCisgICAgICAgIEVBR0VSX05PTkUsIFN0cmluZy52YWx1ZU9mKEVhZ2VyRmV0Y2hNb2Rlcy5FQUdFUl9OT05FKSwKKyAgICAgICAgLy8gZGVwcmVjYXRlZAorICAgICAgICAibXVsdGlwbGUiLCBTdHJpbmcudmFsdWVPZihFYWdlckZldGNoTW9kZXMuRUFHRVJfUEFSQUxMRUwpLAorICAgICAgICAic2luZ2xlIiwgU3RyaW5nLnZhbHVlT2YoRWFnZXJGZXRjaE1vZGVzLkVBR0VSX0pPSU4pLAorICAgIH07CisKKyAgICBwdWJsaWMgRmV0Y2hNb2RlVmFsdWUoU3RyaW5nIHByb3ApIHsKKyAgICAgICAgc3VwZXIocHJvcCk7CisgICAgICAgIHNldEFsaWFzZXMoQUxJQVNFUyk7CisgICAgICAgIHNldEFsaWFzTGlzdENvbXByZWhlbnNpdmUodHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNkYjMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw2MDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZjsKKworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkVhZ2VyRmV0Y2hNb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuTFJTU2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLlVwZGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nRGVmYXVsdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRHJpdmVyRGF0YVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5Db25uZWN0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5KREJDRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkpEQkNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3Rvcnk7CisKKy8qKgorICogQ29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHByb3BlcnRpZXMgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZQorICogcnVudGltZSBhbmQgY29ubmVjdCB0byBhIEpEQkMgRGF0YVNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgaW50ZXJmYWNlIEpEQkNDb25maWd1cmF0aW9uCisgICAgZXh0ZW5kcyBPcGVuSlBBQ29uZmlndXJhdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBsb2dnZXIgZm9yIFNRTCBleGVjdXRpb24gbWVzc2FnZXM6CisgICAgICogPGNvZGU+b3BlbmpwYS5qZGJjLlNRTDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1NRTCA9ICJvcGVuanBhLmpkYmMuU1FMIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGxvZ2dlciBmb3IgSkRCQy1yZWxhdGVkIG1lc3NhZ2VzOgorICAgICAqIDxjb2RlPm9wZW5qcGEuamRiYy5KREJDPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfSkRCQyA9ICJvcGVuanBhLmpkYmMuSkRCQyI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBsb2dnZXIgZm9yIHNjaGVtYS1yZWxhdGVkIG1lc3NhZ2VzOgorICAgICAqIDxjb2RlPm9wZW5qcGEuamRiYy5TY2hlbWE8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19TQ0hFTUEgPSAib3BlbmpwYS5qZGJjLlNjaGVtYSI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHNjaGVtYSBmb3IgdW5xdWFsaWZpZWQgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHNjaGVtYSBmb3IgdW5xdWFsaWZpZWQgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKTsKKworICAgIC8qKgorICAgICAqIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZGlmaWFibGUgc2NoZW1hcyBmb3IgcGVyc2lzdGVudCBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFzKCk7CisKKyAgICAvKioKKyAgICAgKiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2RpZmlhYmxlIHNjaGVtYXMgZm9yIHBlcnNpc3RlbnQgaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYXMoU3RyaW5nIHNjaGVtYXMpOworCisgICAgLyoqCisgICAgICogTW9kaWZpY2FibGUgc2NoZW1hIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNjaGVtYXNMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmlhYmxlIHNjaGVtYSBjb21wb25lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYXMoU3RyaW5nW10gc2NoZW1hcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsIHRvIHVzZSBhdCB0aGUgZGF0YWJhc2UgbGV2ZWwuCisgICAgICogUG9zc2libGUgdmFsdWVzIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPmRlZmF1bHQ8L2NvZGU+OiBUaGUgSkRCQyBkcml2ZXIncyBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbC48L2xpPgorICAgICAqIDxsaT48Y29kZT5ub25lPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuQ29ubmVjdGlvbiNUUkFOU0FDVElPTl9OT05FfSBsZXZlbC48L2xpPgorICAgICAqIDxsaT48Y29kZT5yZWFkLWNvbW1pdHRlZDwvY29kZT46IFRoZSBzdGFuZGFyZCBKREJDCisgICAgICoge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb24jVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUR9IGxldmVsLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnJlYWQtdW5jb21taXR0ZWQ8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5Db25uZWN0aW9uI1RSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9IGxldmVsLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnJlcGVhdGFibGUtcmVhZDwvY29kZT46IFRoZSBzdGFuZGFyZCBKREJDCisgICAgICoge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb24jVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEfSBsZXZlbC48L2xpPgorICAgICAqIDxsaT48Y29kZT5zZXJpYWxpemFibGU8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5Db25uZWN0aW9uI1RSQU5TQUNUSU9OX1NFUklBTElaQUJMRX0gbGV2ZWwuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgdG8gdXNlIGF0IHRoZSBkYXRhYmFzZSBsZXZlbC4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+ZGVmYXVsdDwvY29kZT46IFRoZSBKREJDIGRyaXZlcidzIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsLjwvbGk+CisgICAgICogPGxpPjxjb2RlPm5vbmU8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5Db25uZWN0aW9uI1RSQU5TQUNUSU9OX05PTkV9IGxldmVsLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnJlYWQtY29tbWl0dGVkPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuQ29ubmVjdGlvbiNUUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRH0gbGV2ZWwuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cmVhZC11bmNvbW1pdHRlZDwvY29kZT46IFRoZSBzdGFuZGFyZCBKREJDCisgICAgICoge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb24jVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRH0gbGV2ZWwuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cmVwZWF0YWJsZS1yZWFkPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuQ29ubmVjdGlvbiNUUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUR9IGxldmVsLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnNlcmlhbGl6YWJsZTwvY29kZT46IFRoZSBzdGFuZGFyZCBKREJDCisgICAgICoge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb24jVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFfSBsZXZlbC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oU3RyaW5nIGxldmVsKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvcGVyIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCBjb25zdGFudCBmcm9tCisgICAgICoge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb259LCBvciAtMSBmb3IgdGhlIGRlZmF1bHQgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbkNvbnN0YW50KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3BlciB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgY29uc3RhbnQgZnJvbQorICAgICAqIHtAbGluayBqYXZhLnNxbC5Db25uZWN0aW9ufSwgb3IgLTEgZm9yIHRoZSBkZWZhdWx0IGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKGludCBsZXZlbCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSkRCQyByZXN1bHQgc2V0IHR5cGUuIERlZmF1bHRzIHRvIDxjb2RlPmZvcndhcmQtb25seTwvY29kZT4uCisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5mb3J3YXJkLW9ubHk8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQjVFlQRV9GT1JXQVJEX09OTFl9IHR5cGUuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+c2Nyb2xsLXNlbnNpdGl2ZTwvY29kZT46IFRoZSBzdGFuZGFyZCBKREJDCisgICAgICoge0BsaW5rIGphdmEuc3FsLlJlc3VsdFNldCNUWVBFX1NDUk9MTF9TRU5TSVRJVkV9IHR5cGUuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+c2Nyb2xsLWluc2Vuc2l0aXZlPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuUmVzdWx0U2V0I1RZUEVfU0NST0xMX0lOU0VOU0lUSVZFfSB0eXBlLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0IHNldCBjb25zdGFudCBmb3IgdGhlIHJlc3VsdCBzZXQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldFR5cGVDb25zdGFudCgpOworCisgICAgLyoqCisgICAgICogVGhlIEpEQkMgcmVzdWx0IHNldCB0eXBlLiBEZWZhdWx0cyB0byA8Y29kZT5mb3J3YXJkLW9ubHk8L2NvZGU+LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+Zm9yd2FyZC1vbmx5PC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuUmVzdWx0U2V0I1RZUEVfRk9SV0FSRF9PTkxZfSB0eXBlLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnNjcm9sbC1zZW5zaXRpdmU8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQjVFlQRV9TQ1JPTExfU0VOU0lUSVZFfSB0eXBlLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnNjcm9sbC1pbnNlbnNpdGl2ZTwvY29kZT46IFRoZSBzdGFuZGFyZCBKREJDCisgICAgICoge0BsaW5rIGphdmEuc3FsLlJlc3VsdFNldCNUWVBFX1NDUk9MTF9JTlNFTlNJVElWRX0gdHlwZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0VHlwZShTdHJpbmcgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc3VsdCBzZXQgY29uc3RhbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRUeXBlKGludCB0eXBlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBKREJDIGZldGNoIGRpcmVjdGlvbi4gRGVmYXVsdHMgdG8gPGNvZGU+Zm9yd2FyZDwvY29kZT4uCisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5mb3J3YXJkPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuUmVzdWx0U2V0I0ZFVENIX0ZPUldBUkR9IGRpcmVjdGlvbi48L2xpPgorICAgICAqIDxsaT48Y29kZT5yZXZlcnNlPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuUmVzdWx0U2V0I0ZFVENIX1JFVkVSU0V9IGRpcmVjdGlvbi48L2xpPgorICAgICAqIDxsaT48Y29kZT51bmtub3duPC9jb2RlPjogVGhlIHN0YW5kYXJkIEpEQkMKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuUmVzdWx0U2V0I0ZFVENIX1VOS05PV059IGRpcmVjdGlvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGZXRjaERpcmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXN1bHQgc2V0IGNvbnN0YW50IGZvciB0aGUgZmV0Y2ggZGlyZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hEaXJlY3Rpb25Db25zdGFudCgpOworCisgICAgLyoqCisgICAgICogVGhlIEpEQkMgZmV0Y2ggZGlyZWN0aW9uLiBEZWZhdWx0cyB0byA8Y29kZT5mb3J3YXJkPC9jb2RlPi4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPmZvcndhcmQ8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQjRkVUQ0hfRk9SV0FSRH0gZGlyZWN0aW9uLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnJldmVyc2U8L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQjRkVUQ0hfUkVWRVJTRX0gZGlyZWN0aW9uLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnVua25vd248L2NvZGU+OiBUaGUgc3RhbmRhcmQgSkRCQworICAgICAqIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQjRkVUQ0hfVU5LTk9XTn0gZGlyZWN0aW9uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzdWx0IHNldCBmZXRjaCBkaXJlY3Rpb24gY29uc3RhbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGRpcmVjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgZWFnZXIgZmV0Y2ggbW9kZSB0byB1c2UuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+cGFyYWxsZWw8L2NvZGU+IHVubGVzcyB0aGUgcXVlcnkgaXMgYnktb2lkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+bm9uZTwvY29kZT46IFdoZW4gcXVlcnlpbmcgZm9yIGFuIG9iamVjdCwgZG8gbm90IHRyeSB0bworICAgICAqIHNlbGVjdCBmb3IgcmVsYXRlZCBvYmplY3RzIGF0IHRoZSBzYW1lIHRpbWUuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+am9pbjwvY29kZT46IFdoZW4gcXVlcnlpbmcgZm9yIG9iamVjdHMsIGFsc28gc2VsZWN0IGZvcgorICAgICAqIDEtMSByZWxhdGlvbnMgaW4gdGhlIGNvbmZpZ3VyZWQgZmV0Y2ggZ3JvdXBzIHVzaW5nIGpvaW5zLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnBhcmFsbGVsPC9jb2RlPjogV2hlbiBxdWVyeWluZyBmb3Igb2JqZWN0cywgYWxzbyBzZWxlY3QgZm9yCisgICAgICogYm90aCAxLTEgcmVsYXRpb25zIHVzaW5nIGpvaW5zIGFuZCB0by1tYW55IHJlbGF0aW9ucyB1c2luZyBiYXRjaGVkCisgICAgICogc2VsZWN0cy48L2xpPgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWFnZXJGZXRjaE1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBlYWdlciBmZXRjaCBtb2RlIHRvIHVzZS4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5wYXJhbGxlbDwvY29kZT4gdW5sZXNzIHRoZSBxdWVyeSBpcyBieS1vaWQuIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5ub25lPC9jb2RlPjogV2hlbiBxdWVyeWluZyBmb3IgYW4gb2JqZWN0LCBkbyBub3QgdHJ5IHRvCisgICAgICogc2VsZWN0IGZvciByZWxhdGVkIG9iamVjdHMgYXQgdGhlIHNhbWUgdGltZS48L2xpPgorICAgICAqIDxsaT48Y29kZT5qb2luPC9jb2RlPjogV2hlbiBxdWVyeWluZyBmb3Igb2JqZWN0cywgYWxzbyBzZWxlY3QgZm9yCisgICAgICogMS0xIHJlbGF0aW9ucyBpbiB0aGUgY29uZmlndXJlZCBmZXRjaCBncm91cHMgdXNpbmcgam9pbnMuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cGFyYWxsZWw8L2NvZGU+OiBXaGVuIHF1ZXJ5aW5nIGZvciBvYmplY3RzLCBhbHNvIHNlbGVjdCBmb3IKKyAgICAgKiBib3RoIDEtMSByZWxhdGlvbnMgdXNpbmcgam9pbnMgYW5kIHRvLW1hbnkgcmVsYXRpb25zIHVzaW5nIGJhdGNoZWQKKyAgICAgKiBzZWxlY3RzLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFYWdlckZldGNoTW9kZShTdHJpbmcgbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVhZ2VyIGZldGNoIG1vZGUgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3ltYm9saWMgY29uc3RhbnRzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIEVhZ2VyRmV0Y2hNb2RlcyNFQUdFUl9OT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayBFYWdlckZldGNoTW9kZXMjRUFHRVJfSk9JTn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgRWFnZXJGZXRjaE1vZGVzI0VBR0VSX1BBUkFMTEVMfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RWFnZXJGZXRjaE1vZGVDb25zdGFudCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlYWdlciBmZXRjaCBtb2RlIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN5bWJvbGljIGNvbnN0YW50czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBFYWdlckZldGNoTW9kZXMjRUFHRVJfTk9ORX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgRWFnZXJGZXRjaE1vZGVzI0VBR0VSX0pPSU59PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEVhZ2VyRmV0Y2hNb2RlcyNFQUdFUl9QQVJBTExFTH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFYWdlckZldGNoTW9kZShpbnQgZWFnZXJGZXRjaE1vZGUpOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHN1YmNsYXNzIGZldGNoIG1vZGUgdG8gdXNlLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPmpvaW48L2NvZGU+IHVubGVzcyB0aGUgcXVlcnkgaXMgYnktb2lkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+bm9uZTwvY29kZT46IE9ubHkgc2VsZWN0IGJhc2UgY2xhc3MgZGF0YS48L2xpPgorICAgICAqIDxsaT48Y29kZT5qb2luPC9jb2RlPjogU2VsZWN0IGJvdGggYmFzZSBjbGFzcyBhbmQgYWxsIHBvc3NpYmxlIHN1YmNsYXNzCisgICAgICogZGF0YSB1c2luZyBqb2lucy48L2xpPgorICAgICAqIDxsaT48Y29kZT5wYXJhbGxlbDwvY29kZT46IFNlbGVjdCBmb3IgZWFjaCBwb3NzaWJsZSBzdWJjbGFzcworICAgICAqIHNlcGFyYXRlbHkuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdWJjbGFzc0ZldGNoTW9kZSgpOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHN1YmNsYXNzIGZldGNoIG1vZGUgdG8gdXNlLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPmpvaW48L2NvZGU+IHVubGVzcyB0aGUgcXVlcnkgaXMgYnktb2lkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+bm9uZTwvY29kZT46IE9ubHkgc2VsZWN0IGJhc2UgY2xhc3MgZGF0YS48L2xpPgorICAgICAqIDxsaT48Y29kZT5qb2luPC9jb2RlPjogU2VsZWN0IGJvdGggYmFzZSBjbGFzcyBhbmQgYWxsIHBvc3NpYmxlIHN1YmNsYXNzCisgICAgICogZGF0YSB1c2luZyBqb2lucy48L2xpPgorICAgICAqIDxsaT48Y29kZT5wYXJhbGxlbDwvY29kZT46IFNlbGVjdCBmb3IgZWFjaCBwb3NzaWJsZSBzdWJjbGFzcworICAgICAqIHNlcGFyYXRlbHkuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3ViY2xhc3NGZXRjaE1vZGUoU3RyaW5nIG1vZGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdWJjbGFzcyBmZXRjaCBtb2RlIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN5bWJvbGljCisgICAgICogY29uc3RhbnRzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIEVhZ2VyRmV0Y2hNb2RlcyNFQUdFUl9OT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayBFYWdlckZldGNoTW9kZXMjRUFHRVJfSk9JTn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgRWFnZXJGZXRjaE1vZGVzI0VBR0VSX1BBUkFMTEVMfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGVDb25zdGFudCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJjbGFzcyBmZXRjaCBtb2RlIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN5bWJvbGljIGNvbnN0YW50czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBFYWdlckZldGNoTW9kZXMjRUFHRVJfTk9ORX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgRWFnZXJGZXRjaE1vZGVzI0VBR0VSX0pPSU59PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEVhZ2VyRmV0Y2hNb2RlcyNFQUdFUl9QQVJBTExFTH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJjbGFzc0ZldGNoTW9kZShpbnQgc3ViY2xhc3NGZXRjaE1vZGUpOworCisgICAgLyoqCisgICAgICogSG93IHRvIG9idGFpbiB0aGUgc2l6ZSBvZiBsYXJnZSByZXN1bHQgc2V0cy4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT51bmtub3duPC9jb2RlPi4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPnVua25vd248L2NvZGU+OiBEbyBub3QgYXR0ZW1wdCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YKKyAgICAgKiBsYXJnZSByZXN1bHQgc2V0czsgcmV0dXJuIHtAbGluayBJbnRlZ2VyI01BWF9WQUxVRX0uPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+bGFzdDwvY29kZT46IEZvciByZXN1bHQgc2V0cyB0aGF0IHN1cHBvcnQgcmFuZG9tIGFjY2VzcywKKyAgICAgKiBjYWxjdWxhdGUgdGhlIHNpemUgdXNpbmcge0BsaW5rIGphdmEuc3FsLlJlc3VsdFNldCNsYXN0fS48L2xpPgorICAgICAqIDxsaT48Y29kZT5xdWVyeTwvY29kZT46IFVzZSBhIHNlcGFyYXRlIENPVU5UIHF1ZXJ5IHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSByZXN1bHRzLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExSU1NpemUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIExSU1NpemVzfSBjb25zdGFudCBmb3IgdGhlIGxhcmdlIHJlc3VsdCBzZXQgc2l6ZQorICAgICAqIHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMUlNTaXplQ29uc3RhbnQoKTsKKworICAgIC8qKgorICAgICAqIEhvdyB0byBvYnRhaW4gdGhlIHNpemUgb2YgbGFyZ2UgcmVzdWx0IHNldHMuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+dW5rbm93bjwvY29kZT4uCisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT51bmtub3duPC9jb2RlPjogRG8gbm90IGF0dGVtcHQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mCisgICAgICogbGFyZ2UgcmVzdWx0IHNldHM7IHJldHVybiB7QGxpbmsgSW50ZWdlciNNQVhfVkFMVUV9LjwvbGk+CisgICAgICogPGxpPjxjb2RlPmxhc3Q8L2NvZGU+OiBGb3IgcmVzdWx0IHNldHMgdGhhdCBzdXBwb3J0IHJhbmRvbSBhY2Nlc3MsCisgICAgICogY2FsY3VsYXRlIHRoZSBzaXplIHVzaW5nIHtAbGluayBqYXZhLnNxbC5SZXN1bHRTZXQjbGFzdH0uPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cXVlcnk8L2NvZGU+OiBVc2UgYSBzZXBhcmF0ZSBDT1VOVCBxdWVyeSB0byBjYWxjdWxhdGUgdGhlCisgICAgICogc2l6ZSBvZiB0aGUgcmVzdWx0cy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TFJTU2l6ZShTdHJpbmcgbHJzU2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24gbGFyZ2UgcmVzdWx0IHNldCBzaXplIGNvbnN0YW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExSU1NpemUoaW50IHNpemUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBPcGVuSlBBIHNob3VsZCB0cnkgdG8gYXV0b21hdGljYWxseSByZWZyZXNoIE8vUiBtYXBwaW5nCisgICAgICogaW5mb3JtYXRpb24gYW5kIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTeW5jaHJvbml6ZU1hcHBpbmdzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIE9wZW5KUEEgc2hvdWxkIHRyeSB0byBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggTy9SIG1hcHBpbmcKKyAgICAgKiBpbmZvcm1hdGlvbiBhbmQgdGhlIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZU1hcHBpbmdzKFN0cmluZyBzeW5jaHJvbml6ZU1hcHBpbmdzKTsKKworICAgIC8qKgorICAgICAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHtAbGluayBKREJDTGlzdGVuZXJ9IHBsdWdpbnMgZm9yCisgICAgICogbGlzdGVuaW5nIHRvIHtAbGluayBKREJDRXZlbnR9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEpEQkNMaXN0ZW5lcnMoKTsKKworICAgIC8qKgorICAgICAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHtAbGluayBKREJDTGlzdGVuZXJ9IHBsdWdpbnMgZm9yCisgICAgICogbGlzdGVuaW5nIHRvIHtAbGluayBKREJDRXZlbnR9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKREJDTGlzdGVuZXJzKFN0cmluZyBqZGJjTGlzdGVuZXJzKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgSkRCQ0xpc3RlbmVyfXMgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBKREJDTGlzdGVuZXJbXSBnZXRKREJDTGlzdGVuZXJJbnN0YW5jZXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgSkRCQ0xpc3RlbmVyfXMgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpEQkNMaXN0ZW5lcnMoSkRCQ0xpc3RlbmVyW10gamRiY0xpc3RlbmVycyk7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB7QGxpbmsgQ29ubmVjdGlvbkRlY29yYXRvcn0gZm9yIGFkZGluZworICAgICAqIGZ1bmN0aW9uYWxpdHkgdG8gSkRCQyBjb25uZWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25EZWNvcmF0b3JzKCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB7QGxpbmsgQ29ubmVjdGlvbkRlY29yYXRvcn0gZm9yCisgICAgICogYWRkaW5nIGZ1bmN0aW9uYWxpdHkgdG8gSkRCQyBjb25uZWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRGVjb3JhdG9ycyhTdHJpbmcgZGVjb3JhdG9ycyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIENvbm5lY3Rpb25EZWNvcmF0b3J9cyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3JbXSBnZXRDb25uZWN0aW9uRGVjb3JhdG9ySW5zdGFuY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIENvbm5lY3Rpb25EZWNvcmF0b3J9cyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkRlY29yYXRvcnMoQ29ubmVjdGlvbkRlY29yYXRvcltdIGRlY29yYXRvcnMpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBEQkRpY3Rpb25hcnl9IHRvIHVzZSB0byBkZWZpbmUgdGhlIFJEQk1TIFNRTCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERCRGljdGlvbmFyeSgpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBEQkRpY3Rpb25hcnl9IHRvIHVzZSB0byBkZWZpbmUgdGhlIFJEQk1TIFNRTCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREQkRpY3Rpb25hcnkoU3RyaW5nIGRiZGljdGlvbmFyeSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIERCRGljdGlvbmFyeX0gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBEQkRpY3Rpb25hcnkgZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgREJEaWN0aW9uYXJ5fSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0REJEaWN0aW9uYXJ5KERCRGljdGlvbmFyeSBkYmRpY3Rpb25hcnkpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBVcGRhdGVNYW5hZ2VyfSB0byB1c2UgZm9yIG1hbmFnaW5nIFNRTCB1cGRhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlTWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBVcGRhdGVNYW5hZ2VyfSB0byB1c2UgZm9yIG1hbmFnaW5nIFNRTCB1cGRhdGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZU1hbmFnZXIoU3RyaW5nIHVwZGF0ZU1hbmFnZXIpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBVcGRhdGVNYW5hZ2VyfSBmb3IgcnVudGltZSBkYXRhIHN0b3JlIGludGVyYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBVcGRhdGVNYW5hZ2VyIGdldFVwZGF0ZU1hbmFnZXJJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBVcGRhdGVNYW5hZ2VyfSBmb3IgcnVudGltZSBkYXRhIHN0b3JlIGludGVyYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZU1hbmFnZXIoVXBkYXRlTWFuYWdlciB1cGRhdGVNYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgRHJpdmVyRGF0YVNvdXJjZX0gdG8gdXNlIGZvciBjcmVhdGluZyBhIHtAbGluayBEYXRhU291cmNlfQorICAgICAqIGZyb20gYSBKREJDIHtAbGluayBEcml2ZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyRGF0YVNvdXJjZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBEcml2ZXJEYXRhU291cmNlfSB0byB1c2UgZm9yIGNyZWF0aW5nIGEge0BsaW5rIERhdGFTb3VyY2V9CisgICAgICogZnJvbSBhIEpEQkMge0BsaW5rIERyaXZlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJpdmVyRGF0YVNvdXJjZShTdHJpbmcgZHJpdmVyRGF0YVNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBEcml2ZXJEYXRhU291cmNlfSB0byB1c2UKKyAgICAgKiBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgRGF0YVNvdXJjZX0gZnJvbSBhIEpEQkMge0BsaW5rIERyaXZlcn0uCisgICAgICovCisgICAgcHVibGljIERyaXZlckRhdGFTb3VyY2UgbmV3RHJpdmVyRGF0YVNvdXJjZUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHN0cmluZyBmb3IgdGhlIHtAbGluayBTY2hlbWFGYWN0b3J5fSB0byB1c2UgdG8gcHJvdmlkZQorICAgICAqIHNjaGVtYSBpbmZvcm1hdGlvbiBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBzdHJpbmcgZm9yIHRoZSB7QGxpbmsgU2NoZW1hRmFjdG9yeX0gdG8gdXNlIHRvIHByb3ZpZGUKKyAgICAgKiBzY2hlbWEgaW5mb3JtYXRpb24gZHVyaW5nIHN5c3RlbSBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFGYWN0b3J5KFN0cmluZyBzY2hlbWFGYWN0b3J5KTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU2NoZW1hRmFjdG9yeX0gdG8gdXNlIGZvciBzY2hlbWEgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFNjaGVtYUZhY3RvcnkgZ2V0U2NoZW1hRmFjdG9yeUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFNjaGVtYUZhY3Rvcnl9IHRvIHVzZSBmb3Igc2NoZW1hIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUZhY3RvcnkoU2NoZW1hRmFjdG9yeSBzY2hlbWFGYWN0b3J5KTsKKworICAgIC8qKgorICAgICAqIFRoZSBTUUwgZmFjdG9yeSB0byB1c2UgZm9yIFNRTCBjb25zdHJ1Y3RzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U1FMRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogVGhlIFNRTCBmYWN0b3J5IHRvIHVzZSBmb3IgU1FMIGNvbnN0cnVjdHMuCisgICAgICovCisgICAgcHVibGljIFNRTEZhY3RvcnkgZ2V0U1FMRmFjdG9yeUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU1FMIGZhY3RvcnkgdG8gdXNlIGZvciBTUUwgY29uc3RydWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTUUxGYWN0b3J5KFN0cmluZyBzcWxGYWN0b3J5KTsKKworICAgIC8qKgorICAgICAqIFRoZSBTUUwgZmFjdG9yeSB0byB1c2UgZm9yIFNRTCBjb25zdHJ1Y3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNRTEZhY3RvcnkoU1FMRmFjdG9yeSBzcWxGYWN0b3J5KTsKKworICAgIC8qKgorICAgICAqIEEgcGx1Z2luIHN0cmluZyBkZXNjcmliaW5nIHRoZSB7QGxpbmsgTWV0YURhdGFGYWN0b3J5fSB0byB1c2UgZm9yCisgICAgICogbG9hZGluZyBhbmQgc3RvcmluZyBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogQSBwbHVnaW4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IHRvIHVzZSBmb3IKKyAgICAgKiBsb2FkaW5nIGFuZCBzdG9yaW5nIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRmFjdG9yeShTdHJpbmcgbWFwcGluZ0ZhY3RvcnkpOworCisgICAgLyoqCisgICAgICogQSBwbHVnaW4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHtAbGluayBNYXBwaW5nRGVmYXVsdHN9IHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjQuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0RlZmF1bHRzKCk7CisKKyAgICAvKioKKyAgICAgKiBBIHBsdWdpbiBzdHJpbmcgZGVzY3JpYmluZyB0aGUge0BsaW5rIE1hcHBpbmdEZWZhdWx0c30gdG8gdXNlLgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGluZ0RlZmF1bHRzKFN0cmluZyBtYXApOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBNYXBwaW5nRGVmYXVsdHN9IHRvIHVzZSB3aXRoIGEgcmVwb3NpdG9yeS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjQuMAorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nRGVmYXVsdHMgZ2V0TWFwcGluZ0RlZmF1bHRzSW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgTWFwcGluZ0RlZmF1bHRzfSB0byB1c2Ugd2l0aCBhIHJlcG9zaXRvcnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC40LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRGVmYXVsdHMoTWFwcGluZ0RlZmF1bHRzIG1hcCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hcHBpbmcgcmVwb3NpdG9yeS4gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhc3QgZnJvbQorICAgICAqIHRoZSBpbnRlcm5hbCBtZXRhZGF0YSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nUmVwb3NpdG9yeSBnZXRNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgZW1wdHkgbWFwcGluZyByZXBvc2l0b3J5IG9mIHRoZSBjb25maWd1cmVkIHR5cGUuICAKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FzdCBmcm9tIG1ldGFkYXRhIHJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHVibGljIE1hcHBpbmdSZXBvc2l0b3J5IG5ld01hcHBpbmdSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJpbWFyeSBkYXRhIHNvdXJjZSB0byB1c2UuIFRoZSBkYXRhIHNvdXJjZSB3aWxsCisgICAgICogYXV0b21hdGljYWxseSB1c2UgdGhlIGdpdmVuIGNvbnRleHQncyB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIG9uIGNhbGxzCisgICAgICogdG8ge0BsaW5rIERhdGFTb3VyY2UjZ2V0Q29ubmVjdGlvbn0uIElmIHRoZSBnaXZlbiBjb250ZXh0IGlzIG51bGwsIHRoZQorICAgICAqIGRhdGEgc291cmNlIHdpbGwgdXNlIHRoZSBjb25maWd1cmF0aW9uJ3MgZGVmYXVsdCBjb25uZWN0aW9uIHVzZXIgbmFtZQorICAgICAqIGFuZCBwYXNzd29yZC4gSWYgdGhvc2UgdG9vIGFyZSBudWxsIGFuZCB0aGUgZmlyc3QgY29udGV4dCBoYXMgYmVlbgorICAgICAqIG9idGFpbmVkIGFscmVhZHksIHRoZW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoYXQgY29udGV4dAorICAgICAqIHdpbGwgYmUgdXNlZCwgYXMgd2Uga25vdyB0aGV5IHJlcHJlc2VudCBhIHZhbGlkIGNvbWJpbmF0aW9uLiBUaGlzCisgICAgICogbWV0aG9kIGF2b2lkcyBjYXN0aW5nIHRoZSByZXN1bHQgb2YKKyAgICAgKiB7QGxpbmsgT3BlbkpQQUNvbmZpZ3VyYXRpb24jZ2V0Q29ubmVjdGlvbkZhY3Rvcnl9LCBhbmQgYXZvaWRzIGhhdmluZyB0bworICAgICAqIHBhc3MgaW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gb2J0YWluIGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoU3RvcmVDb250ZXh0IGN0eCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5vbi1lbmxpc3RlZCBkYXRhIHNvdXJjZSB0byB1c2UuIElmIHRoZXJlIGlzIGEgdmFsaWQKKyAgICAgKiBub24teGEgY29ubmVjdGlvbiBmYWN0b3J5IGNvbmZpZ3VyZWQsIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZC4gSXRzCisgICAgICogZGVmYXVsdCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIG9uIGNhbGxzIHRvCisgICAgICoge0BsaW5rIERhdGFTb3VyY2UjZ2V0Q29ubmVjdGlvbn0gd2lsbCBiZSB0aGUgc3BlY2lmaWNlZCBjb25uZWN0aW9uIDIKKyAgICAgKiB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLiBJZiB0aG9zZSBhcmUgbnVsbCBhbmQgdGhlIGdpdmVuIGNvbnRleHQgaXMKKyAgICAgKiBub24tbnVsbCwgaXRzIHVzZXIgbmFtZSBwYXNzd29yZCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gSWYgdGhlIGNvbnRleHQKKyAgICAgKiBpcyBudWxsIHRvbywgdGhlbiB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB1c2VkIHRvIHJldHJpZXZlIHRoZSBmaXJzdAorICAgICAqIGNvbnRleHQgd2lsbCBiZSB1c2VkLiBJZiB0aGVyZSBpcyBubyBzZWNvbmQgY29ubmVjdGlvbiBmYWN0b3J5IHRoZQorICAgICAqIHByaW1hcnkgY29ubmVjdGlvbiBmYWN0b3J5IGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXREYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIERhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZTIoU3RvcmVDb250ZXh0IGN0eCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiNWFmYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDg4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkVhZ2VyRmV0Y2hNb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0Jyb2tlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkxSU1NpemVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5QZXNzaW1pc3RpY0xvY2tNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5VcGRhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ0RlZmF1bHRzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkRhdGFTb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Ecml2ZXJEYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5JbnRWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuT2JqZWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlBsdWdpblZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlN0cmluZ0xpc3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuU3RyaW5nVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkNvbm5lY3Rpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlY29yYXRpbmdEYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5KREJDTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5OworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBKREJDQ29uZmlndXJhdGlvbn0gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgSkRCQ0NvbmZpZ3VyYXRpb25JbXBsCisgICAgZXh0ZW5kcyBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwKKyAgICBpbXBsZW1lbnRzIEpEQkNDb25maWd1cmF0aW9uIHsKKworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBzY2hlbWE7CisgICAgcHVibGljIFN0cmluZ0xpc3RWYWx1ZSBzY2hlbWFzOworICAgIHB1YmxpYyBJbnRWYWx1ZSB0cmFuc2FjdGlvbklzb2xhdGlvbjsKKyAgICBwdWJsaWMgSW50VmFsdWUgcmVzdWx0U2V0VHlwZTsKKyAgICBwdWJsaWMgSW50VmFsdWUgZmV0Y2hEaXJlY3Rpb247CisgICAgcHVibGljIEZldGNoTW9kZVZhbHVlIGVhZ2VyRmV0Y2hNb2RlOworICAgIHB1YmxpYyBGZXRjaE1vZGVWYWx1ZSBzdWJjbGFzc0ZldGNoTW9kZTsKKyAgICBwdWJsaWMgSW50VmFsdWUgbHJzU2l6ZTsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgc3luY2hyb25pemVNYXBwaW5nczsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgamRiY0xpc3RlbmVyUGx1Z2luczsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgY29ubmVjdGlvbkRlY29yYXRvclBsdWdpbnM7CisgICAgcHVibGljIFBsdWdpblZhbHVlIGRiZGljdGlvbmFyeVBsdWdpbjsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgdXBkYXRlTWFuYWdlclBsdWdpbjsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgc2NoZW1hRmFjdG9yeVBsdWdpbjsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgc3FsRmFjdG9yeVBsdWdpbjsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgbWFwcGluZ0RlZmF1bHRzUGx1Z2luOworICAgIHB1YmxpYyBQbHVnaW5WYWx1ZSBkcml2ZXJEYXRhU291cmNlUGx1Z2luOworICAgIHB1YmxpYyBNYXBwaW5nRmFjdG9yeVZhbHVlIG1hcHBpbmdGYWN0b3J5UGx1Z2luOworCisgICAgLy8gdXNlZCBpbnRlcm5hbGx5CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3RVc2VyID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdFBhc3MgPSBudWxsOworICAgIHByaXZhdGUgRGVjb3JhdGluZ0RhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7CisgICAgcHJpdmF0ZSBEZWNvcmF0aW5nRGF0YVNvdXJjZSBkYXRhU291cmNlMiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBBdHRlbXB0cyB0byBsb2FkIGRlZmF1bHQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0NvbmZpZ3VyYXRpb25JbXBsKCkgeworICAgICAgICB0aGlzKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRHbG9iYWxzIHdoZXRoZXIgdG8gYXR0ZW1wdCB0byBsb2FkIHRoZSBnbG9iYWwgcHJvcGVydGllcworICAgICAqLworICAgIHB1YmxpYyBKREJDQ29uZmlndXJhdGlvbkltcGwoYm9vbGVhbiBsb2FkR2xvYmFscykgeworICAgICAgICB0aGlzKHRydWUsIGxvYWRHbG9iYWxzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXJpdmF0aW9ucyB3aGV0aGVyIHRvIGFwcGx5IHByb2R1Y3QgZGVyaXZhdGlvbnMKKyAgICAgKiBAcGFyYW0gbG9hZEdsb2JhbHMgd2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgdGhlIGdsb2JhbCBwcm9wZXJ0aWVzCisgICAgICovCisgICAgcHVibGljIEpEQkNDb25maWd1cmF0aW9uSW1wbChib29sZWFuIGRlcml2YXRpb25zLCBib29sZWFuIGxvYWRHbG9iYWxzKSB7CisgICAgICAgIHN1cGVyKGZhbHNlLCBmYWxzZSk7CisgICAgICAgIFN0cmluZ1tdIGFsaWFzZXM7CisKKyAgICAgICAgc2NoZW1hID0gYWRkU3RyaW5nKCJqZGJjLlNjaGVtYSIpOworICAgICAgICBzY2hlbWFzID0gYWRkU3RyaW5nTGlzdCgiamRiYy5TY2hlbWFzIik7CisKKyAgICAgICAgdHJhbnNhY3Rpb25Jc29sYXRpb24gPSBhZGRJbnQoImpkYmMuVHJhbnNhY3Rpb25Jc29sYXRpb24iKTsKKyAgICAgICAgYWxpYXNlcyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJkZWZhdWx0IiwgU3RyaW5nLnZhbHVlT2YoLTEpLAorICAgICAgICAgICAgIm5vbmUiLCBTdHJpbmcudmFsdWVPZihDb25uZWN0aW9uLlRSQU5TQUNUSU9OX05PTkUpLAorICAgICAgICAgICAgInJlYWQtY29tbWl0dGVkIiwgU3RyaW5nLnZhbHVlT2YKKyAgICAgICAgICAgIChDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEKSwKKyAgICAgICAgICAgICJyZWFkLXVuY29tbWl0dGVkIiwgU3RyaW5nLnZhbHVlT2YKKyAgICAgICAgICAgIChDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQpLAorICAgICAgICAgICAgInJlcGVhdGFibGUtcmVhZCIsIFN0cmluZy52YWx1ZU9mCisgICAgICAgICAgICAoQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUQpLAorICAgICAgICAgICAgInNlcmlhbGl6YWJsZSIsIFN0cmluZy52YWx1ZU9mKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFKQorICAgICAgICB9OworICAgICAgICB0cmFuc2FjdGlvbklzb2xhdGlvbi5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICB0cmFuc2FjdGlvbklzb2xhdGlvbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICB0cmFuc2FjdGlvbklzb2xhdGlvbi5zZXQoLTEpOworICAgICAgICB0cmFuc2FjdGlvbklzb2xhdGlvbi5zZXRBbGlhc0xpc3RDb21wcmVoZW5zaXZlKHRydWUpOworCisgICAgICAgIHJlc3VsdFNldFR5cGUgPSBhZGRJbnQoImpkYmMuUmVzdWx0U2V0VHlwZSIpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgImZvcndhcmQtb25seSIsIFN0cmluZy52YWx1ZU9mKFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWSksCisgICAgICAgICAgICAic2Nyb2xsLXNlbnNpdGl2ZSIsIFN0cmluZy52YWx1ZU9mCisgICAgICAgICAgICAoUmVzdWx0U2V0LlRZUEVfU0NST0xMX1NFTlNJVElWRSksCisgICAgICAgICAgICAic2Nyb2xsLWluc2Vuc2l0aXZlIiwgU3RyaW5nLnZhbHVlT2YKKyAgICAgICAgICAgIChSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUpLAorICAgICAgICB9OworICAgICAgICByZXN1bHRTZXRUeXBlLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIHJlc3VsdFNldFR5cGUuc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgcmVzdWx0U2V0VHlwZS5zZXQoUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZKTsKKyAgICAgICAgcmVzdWx0U2V0VHlwZS5zZXRBbGlhc0xpc3RDb21wcmVoZW5zaXZlKHRydWUpOworCisgICAgICAgIGZldGNoRGlyZWN0aW9uID0gYWRkSW50KCJqZGJjLkZldGNoRGlyZWN0aW9uIik7CisgICAgICAgIGFsaWFzZXMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiZm9yd2FyZCIsIFN0cmluZy52YWx1ZU9mKFJlc3VsdFNldC5GRVRDSF9GT1JXQVJEKSwKKyAgICAgICAgICAgICJyZXZlcnNlIiwgU3RyaW5nLnZhbHVlT2YoUmVzdWx0U2V0LkZFVENIX1JFVkVSU0UpLAorICAgICAgICAgICAgInVua25vd24iLCBTdHJpbmcudmFsdWVPZihSZXN1bHRTZXQuRkVUQ0hfVU5LTk9XTiksCisgICAgICAgIH07CisgICAgICAgIGZldGNoRGlyZWN0aW9uLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIGZldGNoRGlyZWN0aW9uLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIGZldGNoRGlyZWN0aW9uLnNldChSZXN1bHRTZXQuRkVUQ0hfRk9SV0FSRCk7CisgICAgICAgIGZldGNoRGlyZWN0aW9uLnNldEFsaWFzTGlzdENvbXByZWhlbnNpdmUodHJ1ZSk7CisKKyAgICAgICAgZWFnZXJGZXRjaE1vZGUgPSBuZXcgRmV0Y2hNb2RlVmFsdWUoImpkYmMuRWFnZXJGZXRjaE1vZGUiKTsKKyAgICAgICAgZWFnZXJGZXRjaE1vZGUuc2V0RGVmYXVsdChGZXRjaE1vZGVWYWx1ZS5FQUdFUl9QQVJBTExFTCk7CisgICAgICAgIGVhZ2VyRmV0Y2hNb2RlLnNldChFYWdlckZldGNoTW9kZXMuRUFHRVJfUEFSQUxMRUwpOworICAgICAgICBhZGRWYWx1ZShlYWdlckZldGNoTW9kZSk7CisKKyAgICAgICAgc3ViY2xhc3NGZXRjaE1vZGUgPSBuZXcgRmV0Y2hNb2RlVmFsdWUoImpkYmMuU3ViY2xhc3NGZXRjaE1vZGUiKTsKKyAgICAgICAgc3ViY2xhc3NGZXRjaE1vZGUuc2V0RGVmYXVsdChGZXRjaE1vZGVWYWx1ZS5FQUdFUl9KT0lOKTsKKyAgICAgICAgc3ViY2xhc3NGZXRjaE1vZGUuc2V0KEVhZ2VyRmV0Y2hNb2Rlcy5FQUdFUl9KT0lOKTsKKyAgICAgICAgYWRkVmFsdWUoc3ViY2xhc3NGZXRjaE1vZGUpOworCisgICAgICAgIGxyc1NpemUgPSBhZGRJbnQoImpkYmMuTFJTU2l6ZSIpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgInF1ZXJ5IiwgU3RyaW5nLnZhbHVlT2YoTFJTU2l6ZXMuU0laRV9RVUVSWSksCisgICAgICAgICAgICAidW5rbm93biIsIFN0cmluZy52YWx1ZU9mKExSU1NpemVzLlNJWkVfVU5LTk9XTiksCisgICAgICAgICAgICAibGFzdCIsIFN0cmluZy52YWx1ZU9mKExSU1NpemVzLlNJWkVfTEFTVCksCisgICAgICAgIH07CisgICAgICAgIGxyc1NpemUuc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgbHJzU2l6ZS5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBscnNTaXplLnNldChMUlNTaXplcy5TSVpFX1FVRVJZKTsKKyAgICAgICAgbHJzU2l6ZS5zZXRBbGlhc0xpc3RDb21wcmVoZW5zaXZlKHRydWUpOworCisgICAgICAgIHN5bmNocm9uaXplTWFwcGluZ3MgPSBhZGRTdHJpbmcoImpkYmMuU3luY2hyb25pemVNYXBwaW5ncyIpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeyAiZmFsc2UiLCBudWxsIH07CisgICAgICAgIHN5bmNocm9uaXplTWFwcGluZ3Muc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgc3luY2hyb25pemVNYXBwaW5ncy5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworCisgICAgICAgIGpkYmNMaXN0ZW5lclBsdWdpbnMgPSBhZGRQbHVnaW5MaXN0KCJqZGJjLkpEQkNMaXN0ZW5lcnMiKTsKKyAgICAgICAgamRiY0xpc3RlbmVyUGx1Z2lucy5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXRKREJDTGlzdGVuZXJJbnN0YW5jZXMiKTsKKworICAgICAgICBjb25uZWN0aW9uRGVjb3JhdG9yUGx1Z2lucyA9IGFkZFBsdWdpbkxpc3QKKyAgICAgICAgICAgICgiamRiYy5Db25uZWN0aW9uRGVjb3JhdG9ycyIpOworICAgICAgICBjb25uZWN0aW9uRGVjb3JhdG9yUGx1Z2lucy5zZXRJbnN0YW50aWF0aW5nR2V0dGVyCisgICAgICAgICAgICAoImdldENvbm5lY3Rpb25EZWNvcmF0b3JJbnN0YW5jZXMiKTsKKworICAgICAgICBkYmRpY3Rpb25hcnlQbHVnaW4gPSBhZGRQbHVnaW4oImpkYmMuREJEaWN0aW9uYXJ5IiwgdHJ1ZSk7CisgICAgICAgIGFsaWFzZXMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiYWNjZXNzIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5BY2Nlc3NEaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICJkYjIiLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCMkRpY3Rpb25hcnkiLAorICAgICAgICAgICAgImRlcmJ5IiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EZXJieURpY3Rpb25hcnkiLAorICAgICAgICAgICAgImVtcHJlc3MiLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkVtcHJlc3NEaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICJmb3hwcm8iLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkZveFByb0RpY3Rpb25hcnkiLAorICAgICAgICAgICAgImhzcWwiLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkhTUUxEaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICJpbmZvcm1peCIsICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSW5mb3JtaXhEaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICJqZGF0YXN0b3JlIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5KRGF0YVN0b3JlRGljdGlvbmFyeSIsCisgICAgICAgICAgICAibXlzcWwiLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLk15U1FMRGljdGlvbmFyeSIsCisgICAgICAgICAgICAib3JhY2xlIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5PcmFjbGVEaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICJwb2ludGJhc2UiLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlBvaW50YmFzZURpY3Rpb25hcnkiLAorICAgICAgICAgICAgInBvc3RncmVzIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Qb3N0Z3Jlc0RpY3Rpb25hcnkiLAorICAgICAgICAgICAgInNxbHNlcnZlciIsICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMU2VydmVyRGljdGlvbmFyeSIsCisgICAgICAgICAgICAic3liYXNlIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TeWJhc2VEaWN0aW9uYXJ5IiwKKyAgICAgICAgfTsKKyAgICAgICAgZGJkaWN0aW9uYXJ5UGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIGRiZGljdGlvbmFyeVBsdWdpbi5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXREQkRpY3Rpb25hcnlJbnN0YW5jZSIpOworCisgICAgICAgIHVwZGF0ZU1hbmFnZXJQbHVnaW4gPSBhZGRQbHVnaW4oImpkYmMuVXBkYXRlTWFuYWdlciIsIHRydWUpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgImRlZmF1bHQiLAorICAgICAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5Db25zdHJhaW50VXBkYXRlTWFuYWdlciIsCisgICAgICAgICAgICAib3BlcmF0aW9uLW9yZGVyIiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuT3BlcmF0aW9uT3JkZXJVcGRhdGVNYW5hZ2VyIiwKKyAgICAgICAgICAgICJjb25zdHJhaW50IiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuQ29uc3RyYWludFVwZGF0ZU1hbmFnZXIiLAorICAgICAgICB9OworICAgICAgICB1cGRhdGVNYW5hZ2VyUGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIHVwZGF0ZU1hbmFnZXJQbHVnaW4uc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgdXBkYXRlTWFuYWdlclBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisgICAgICAgIHVwZGF0ZU1hbmFnZXJQbHVnaW4uc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0VXBkYXRlTWFuYWdlckluc3RhbmNlIik7CisKKyAgICAgICAgZHJpdmVyRGF0YVNvdXJjZVBsdWdpbiA9IGFkZFBsdWdpbigiamRiYy5Ecml2ZXJEYXRhU291cmNlIiwgZmFsc2UpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgInNpbXBsZSIsICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2ltcGxlRHJpdmVyRGF0YVNvdXJjZSIsCisgICAgICAgIH07CisgICAgICAgIGRyaXZlckRhdGFTb3VyY2VQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgZHJpdmVyRGF0YVNvdXJjZVBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBkcml2ZXJEYXRhU291cmNlUGx1Z2luLnNldFN0cmluZyhhbGlhc2VzWzBdKTsKKworICAgICAgICBzY2hlbWFGYWN0b3J5UGx1Z2luID0gYWRkUGx1Z2luKCJqZGJjLlNjaGVtYUZhY3RvcnkiLCB0cnVlKTsKKyAgICAgICAgYWxpYXNlcyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJkeW5hbWljIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5EeW5hbWljU2NoZW1hRmFjdG9yeSIsCisgICAgICAgICAgICAibmF0aXZlIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5MYXp5U2NoZW1hRmFjdG9yeSIsCisgICAgICAgICAgICAiZmlsZSIsICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRmlsZVNjaGVtYUZhY3RvcnkiLAorICAgICAgICAgICAgInRhYmxlIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZVNjaGVtYUZhY3RvcnkiLAorICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCBhbGlhcworICAgICAgICAgICAgImRiIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZVNjaGVtYUZhY3RvcnkiLAorICAgICAgICB9OworICAgICAgICBzY2hlbWFGYWN0b3J5UGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIHNjaGVtYUZhY3RvcnlQbHVnaW4uc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgc2NoZW1hRmFjdG9yeVBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisgICAgICAgIHNjaGVtYUZhY3RvcnlQbHVnaW4uc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0U2NoZW1hRmFjdG9yeUluc3RhbmNlIik7CisKKyAgICAgICAgc3FsRmFjdG9yeVBsdWdpbiA9IGFkZFBsdWdpbigiamRiYy5TUUxGYWN0b3J5IiwgdHJ1ZSk7CisgICAgICAgIGFsaWFzZXMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiZGVmYXVsdCIsICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRmFjdG9yeUltcGwiLAorICAgICAgICB9OworICAgICAgICBzcWxGYWN0b3J5UGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIHNxbEZhY3RvcnlQbHVnaW4uc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgc3FsRmFjdG9yeVBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisgICAgICAgIHNxbEZhY3RvcnlQbHVnaW4uc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0U1FMRmFjdG9yeUluc3RhbmNlIik7CisKKyAgICAgICAgbWFwcGluZ0ZhY3RvcnlQbHVnaW4gPSBuZXcgTWFwcGluZ0ZhY3RvcnlWYWx1ZSgiamRiYy5NYXBwaW5nRmFjdG9yeSIpOworICAgICAgICBhZGRWYWx1ZShtYXBwaW5nRmFjdG9yeVBsdWdpbik7CisKKyAgICAgICAgbWFwcGluZ0RlZmF1bHRzUGx1Z2luID0gYWRkUGx1Z2luKCJqZGJjLk1hcHBpbmdEZWZhdWx0cyIsIHRydWUpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgImRlZmF1bHQiLCAib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nRGVmYXVsdHNJbXBsIiwKKyAgICAgICAgfTsKKyAgICAgICAgbWFwcGluZ0RlZmF1bHRzUGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIG1hcHBpbmdEZWZhdWx0c1BsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBtYXBwaW5nRGVmYXVsdHNQbHVnaW4uc2V0U3RyaW5nKGFsaWFzZXNbMF0pOworICAgICAgICBtYXBwaW5nRGVmYXVsdHNQbHVnaW4uc2V0SW5zdGFudGlhdGluZ0dldHRlcgorICAgICAgICAgICAgKCJnZXRNYXBwaW5nRGVmYXVsdHNJbnN0YW5jZSIpOworCisgICAgICAgIC8vIHNldCB1cCBicm9rZXIgZmFjdG9yeSBkZWZhdWx0cworICAgICAgICBicm9rZXJGYWN0b3J5UGx1Z2luLnNldEFsaWFzKCJqZGJjIiwgSkRCQ0Jyb2tlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnJva2VyRmFjdG9yeVBsdWdpbi5zZXREZWZhdWx0KCJqZGJjIik7CisgICAgICAgIGJyb2tlckZhY3RvcnlQbHVnaW4uc2V0U3RyaW5nKCJqZGJjIik7CisKKyAgICAgICAgLy8gc2V0IG5ldyBkZWZhdWx0IGZvciBtYXBwaW5nIHJlcG9zCisgICAgICAgIG1ldGFSZXBvc2l0b3J5UGx1Z2luLnNldEFsaWFzKCJkZWZhdWx0IiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdSZXBvc2l0b3J5Iik7CisgICAgICAgIG1ldGFSZXBvc2l0b3J5UGx1Z2luLnNldERlZmF1bHQoImRlZmF1bHQiKTsKKyAgICAgICAgbWV0YVJlcG9zaXRvcnlQbHVnaW4uc2V0U3RyaW5nKCJkZWZhdWx0Iik7CisKKyAgICAgICAgLy8gc2V0IG5ldyBkZWZhdWx0IGZvciBsb2NrIG1hbmFnZXIKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0QWxpYXMoInBlc3NpbWlzdGljIiwKKyAgICAgICAgICAgIFBlc3NpbWlzdGljTG9ja01hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0RGVmYXVsdCgicGVzc2ltaXN0aWMiKTsKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0U3RyaW5nKCJwZXNzaW1pc3RpYyIpOworCisgICAgICAgIC8vIG5hdGl2ZSBzYXZlcG9pbnQgbWFuYWdlciBvcHRpb25zCisgICAgICAgIHNhdmVwb2ludE1hbmFnZXJQbHVnaW4uc2V0QWxpYXMoImpkYmMiLAorICAgICAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDM1NhdmVwb2ludE1hbmFnZXIiKTsKKworICAgICAgICAvLyBzZXQgbmV3IGFsaWFzZXMgYW5kIGRlZmF1bHRzIGZvciBzZXF1ZW5jZQorICAgICAgICBzZXFQbHVnaW4uc2V0QWxpYXNlcyhKREJDU2VxVmFsdWUuQUxJQVNFUyk7CisgICAgICAgIHNlcVBsdWdpbi5zZXREZWZhdWx0KEpEQkNTZXFWYWx1ZS5BTElBU0VTWzBdKTsKKyAgICAgICAgc2VxUGx1Z2luLnNldFN0cmluZyhKREJDU2VxVmFsdWUuQUxJQVNFU1swXSk7CisKKyAgICAgICAgLy8gdGhpcyBzdGF0aWMgaW5pdGlhbGl6ZXIgaXMgdG8gZ2V0IHBhc3QgYSB3ZWlyZAorICAgICAgICAvLyBDbGFzc0NpcmN1bGFyaXR5RXJyb3IgdGhhdCBoYXBwZW5zIG9ubHkgdW5kZXIgSUJNJ3MKKyAgICAgICAgLy8gSkRLIDEuMy4xIG9uIExpbnV4IGZyb20gd2l0aGluIHRoZSBKUnVuIENsYXNzTG9hZGVyOworICAgICAgICAvLyB3aGlsZSBleGFjdCBjYXVzZXMgYXJlIHVua25vd24sIGl0IGlzIGFsbW9zdCBjZXJ0YWlubHkKKyAgICAgICAgLy8gYSBidWcgaW4gSlJ1biwgYW5kIHdlIGNhbiBnZXQgYXJvdW5kIGl0IGJ5IGZvcmNpbmcKKyAgICAgICAgLy8gSW5zdHJ1Y3Rpb24uY2xhc3MgdG8gYmUgbG9hZGVkIGFuZCBpbml0aWFsaXplZAorICAgICAgICAvLyBiZWZvcmUgVHlwZWRJbnN0cnVjdGlvbi5jbGFzcworICAgICAgICB0cnkgeyBzZXJwLmJ5dGVjb2RlLmxvd2xldmVsLkVudHJ5LmNsYXNzLmdldE5hbWUoKTsgfSAKKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7fQorICAgICAgICB0cnkgeyBzZXJwLmJ5dGVjb2RlLkluc3RydWN0aW9uLmNsYXNzLmdldE5hbWUoKTsgfSAKKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7fQorCisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMoKS5hZGQoT1BUSU9OX1FVRVJZX1NRTCk7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMoKS5hZGQoT1BUSU9OX0pEQkNfQ09OTkVDVElPTik7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMoKS5yZW1vdmUoT1BUSU9OX1ZBTFVFX0lOQ1JFTUVOVCk7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMoKS5yZW1vdmUoT1BUSU9OX05VTExfQ09OVEFJTkVSKTsKKworICAgICAgICBpZiAoZGVyaXZhdGlvbnMpCisgICAgICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMuYmVmb3JlQ29uZmlndXJhdGlvbkxvYWQodGhpcyk7CisgICAgICAgIGlmIChsb2FkR2xvYmFscykKKyAgICAgICAgICAgIGxvYWRHbG9iYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBKREJDQ29uZmlndXJhdGlvbkltcGwoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICB0aGlzKHRydWUsIGZhbHNlKTsKKyAgICAgICAgaWYgKGNvbmYgIT0gbnVsbCkKKyAgICAgICAgICAgIGZyb21Qcm9wZXJ0aWVzKGNvbmYudG9Qcm9wZXJ0aWVzKGZhbHNlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5zY2hlbWEuc2V0U3RyaW5nKHNjaGVtYSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisgICAgICAgIHJldHVybiBzY2hlbWEuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hcyhTdHJpbmcgc2NoZW1hcykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLnNjaGVtYXMuc2V0U3RyaW5nKHNjaGVtYXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hcygpIHsKKyAgICAgICAgcmV0dXJuIHNjaGVtYXMuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hcyhTdHJpbmdbXSBzY2hlbWFzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuc2NoZW1hcy5zZXQoc2NoZW1hcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNjaGVtYXNMaXN0KCkgeworICAgICAgICByZXR1cm4gc2NoZW1hcy5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbklzb2xhdGlvbihTdHJpbmcgdHJhbnNhY3Rpb25Jc29sYXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy50cmFuc2FjdGlvbklzb2xhdGlvbi5zZXRTdHJpbmcodHJhbnNhY3Rpb25Jc29sYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbklzb2xhdGlvbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbklzb2xhdGlvbihpbnQgdHJhbnNhY3Rpb25Jc29sYXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy50cmFuc2FjdGlvbklzb2xhdGlvbi5zZXQodHJhbnNhY3Rpb25Jc29sYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb25Db25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uSXNvbGF0aW9uLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdFNldFR5cGUoU3RyaW5nIHJlc3VsdFNldFR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5yZXN1bHRTZXRUeXBlLnNldFN0cmluZyhyZXN1bHRTZXRUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldFR5cGUoKSB7CisgICAgICAgIHJldHVybiByZXN1bHRTZXRUeXBlLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdFNldFR5cGUoaW50IHJlc3VsdFNldFR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5yZXN1bHRTZXRUeXBlLnNldChyZXN1bHRTZXRUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldFR5cGVDb25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdFNldFR5cGUuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oU3RyaW5nIGZldGNoRGlyZWN0aW9uKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuZmV0Y2hEaXJlY3Rpb24uc2V0U3RyaW5nKGZldGNoRGlyZWN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZldGNoRGlyZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gZmV0Y2hEaXJlY3Rpb24uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGZldGNoRGlyZWN0aW9uKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuZmV0Y2hEaXJlY3Rpb24uc2V0KGZldGNoRGlyZWN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoRGlyZWN0aW9uQ29uc3RhbnQoKSB7CisgICAgICAgIHJldHVybiBmZXRjaERpcmVjdGlvbi5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFYWdlckZldGNoTW9kZShTdHJpbmcgZWFnZXJGZXRjaE1vZGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5lYWdlckZldGNoTW9kZS5zZXRTdHJpbmcoZWFnZXJGZXRjaE1vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWFnZXJGZXRjaE1vZGUoKSB7CisgICAgICAgIHJldHVybiBlYWdlckZldGNoTW9kZS5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFYWdlckZldGNoTW9kZShpbnQgZWFnZXJGZXRjaE1vZGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5lYWdlckZldGNoTW9kZS5zZXQoZWFnZXJGZXRjaE1vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RWFnZXJGZXRjaE1vZGVDb25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIGVhZ2VyRmV0Y2hNb2RlLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YmNsYXNzRmV0Y2hNb2RlKFN0cmluZyBzdWJjbGFzc0ZldGNoTW9kZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLnN1YmNsYXNzRmV0Y2hNb2RlLnNldFN0cmluZyhzdWJjbGFzc0ZldGNoTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdWJjbGFzc0ZldGNoTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1YmNsYXNzRmV0Y2hNb2RlLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YmNsYXNzRmV0Y2hNb2RlKGludCBzdWJjbGFzc0ZldGNoTW9kZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLnN1YmNsYXNzRmV0Y2hNb2RlLnNldChzdWJjbGFzc0ZldGNoTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdWJjbGFzc0ZldGNoTW9kZUNvbnN0YW50KCkgeworICAgICAgICByZXR1cm4gc3ViY2xhc3NGZXRjaE1vZGUuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TFJTU2l6ZShTdHJpbmcgbHJzU2l6ZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmxyc1NpemUuc2V0U3RyaW5nKGxyc1NpemUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TFJTU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGxyc1NpemUuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TFJTU2l6ZShpbnQgbHJzU2l6ZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmxyc1NpemUuc2V0KGxyc1NpemUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TFJTU2l6ZUNvbnN0YW50KCkgeworICAgICAgICByZXR1cm4gbHJzU2l6ZS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZU1hcHBpbmdzKFN0cmluZyBzeW5jaHJvbml6ZU1hcHBpbmdzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuc3luY2hyb25pemVNYXBwaW5ncy5zZXQoc3luY2hyb25pemVNYXBwaW5ncyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTeW5jaHJvbml6ZU1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gc3luY2hyb25pemVNYXBwaW5ncy5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKREJDTGlzdGVuZXJzKFN0cmluZyBqZGJjTGlzdGVuZXJzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGpkYmNMaXN0ZW5lclBsdWdpbnMuc2V0U3RyaW5nKGpkYmNMaXN0ZW5lcnMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SkRCQ0xpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIGpkYmNMaXN0ZW5lclBsdWdpbnMuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SkRCQ0xpc3RlbmVycyhKREJDTGlzdGVuZXJbXSBsaXN0ZW5lcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgamRiY0xpc3RlbmVyUGx1Z2lucy5zZXQobGlzdGVuZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0xpc3RlbmVyW10gZ2V0SkRCQ0xpc3RlbmVySW5zdGFuY2VzKCkgeworICAgICAgICBpZiAoamRiY0xpc3RlbmVyUGx1Z2lucy5nZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgamRiY0xpc3RlbmVyUGx1Z2lucy5pbnN0YW50aWF0ZShKREJDTGlzdGVuZXIuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKEpEQkNMaXN0ZW5lcltdKSBqZGJjTGlzdGVuZXJQbHVnaW5zLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25EZWNvcmF0b3JzKFN0cmluZyBjb25uZWN0aW9uRGVjb3JhdG9ycykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBjb25uZWN0aW9uRGVjb3JhdG9yUGx1Z2lucy5zZXRTdHJpbmcoY29ubmVjdGlvbkRlY29yYXRvcnMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkRlY29yYXRvcnMoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uRGVjb3JhdG9yUGx1Z2lucy5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRGVjb3JhdG9ycyhDb25uZWN0aW9uRGVjb3JhdG9yW10gZGVjb3JhdG9ycykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBjb25uZWN0aW9uRGVjb3JhdG9yUGx1Z2lucy5zZXQoZGVjb3JhdG9ycyk7CisgICAgfQorCisgICAgcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3JbXSBnZXRDb25uZWN0aW9uRGVjb3JhdG9ySW5zdGFuY2VzKCkgeworICAgICAgICBpZiAoY29ubmVjdGlvbkRlY29yYXRvclBsdWdpbnMuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgY29ubmVjdGlvbkRlY29yYXRvclBsdWdpbnMuaW5zdGFudGlhdGUKKyAgICAgICAgICAgICAgICAoQ29ubmVjdGlvbkRlY29yYXRvci5jbGFzcywgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChDb25uZWN0aW9uRGVjb3JhdG9yW10pIGNvbm5lY3Rpb25EZWNvcmF0b3JQbHVnaW5zLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERCRGljdGlvbmFyeShTdHJpbmcgZGJkaWN0aW9uYXJ5KSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGRiZGljdGlvbmFyeVBsdWdpbi5zZXRTdHJpbmcoZGJkaWN0aW9uYXJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERCRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcmV0dXJuIGRiZGljdGlvbmFyeVBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREQkRpY3Rpb25hcnkoREJEaWN0aW9uYXJ5IGRiZGljdGlvbmFyeSkgeworICAgICAgICAvLyB3ZSBjYW4ndCBhbGxvdyB0aGUgZGljdGlvbmFyeSB0byBiZSBzZXQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gZmFjdG9yeSwgZHVlIHRvIGluaXRpYWxpemF0aW9uIGlzc3VlcworICAgICAgICBpZiAoY29ubmVjdGlvbkZhY3RvcnkuZ2V0KCkgIT0gbnVsbAorICAgICAgICAgICAgfHwgY29ubmVjdGlvbkZhY3RvcnkyLmdldCgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgZGJkaWN0aW9uYXJ5UGx1Z2luLnNldChkYmRpY3Rpb25hcnkpOworICAgIH0KKworICAgIHB1YmxpYyBEQkRpY3Rpb25hcnkgZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKSB7CisgICAgICAgIC8vIGxvY2sgb24gY29ubmVjdGlvbiBmYWN0b3J5IG5hbWUsIHNpbmNlIGdldHRpbmcgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gZmFjdG9yeSBhbmQgZ2V0dGluZyB0aGUgZGljdGlvbmFyeSBoYXZlIHRvIHVzZSB0aGUgc2FtZSBsb2NrcyB0bworICAgICAgICAvLyBwcmV2ZW50IGRlYWRsb2NrIHNpbmNlIHRoZXkgY2FsbCBlYWNoIG90aGVyCisgICAgICAgIERCRGljdGlvbmFyeSBkYmRpY3Rpb25hcnkgPSAoREJEaWN0aW9uYXJ5KSBkYmRpY3Rpb25hcnlQbHVnaW4uZ2V0KCk7CisgICAgICAgIGlmIChkYmRpY3Rpb25hcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGNsc05hbWUgPSBkYmRpY3Rpb25hcnlQbHVnaW4uZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgcHJvcHMgPSBkYmRpY3Rpb25hcnlQbHVnaW4uZ2V0UHJvcGVydGllcygpOworICAgICAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGNsc05hbWUpKSB7CisgICAgICAgICAgICAgICAgZGJkaWN0aW9uYXJ5ID0gREJEaWN0aW9uYXJ5RmFjdG9yeS5uZXdEQkRpY3Rpb25hcnkKKyAgICAgICAgICAgICAgICAgICAgKHRoaXMsIGNsc05hbWUsIHByb3BzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRpY3Rpb25hcnkgY2xhc3MgaXNuJ3Qgc2V0LCB0cnkgdG8gZ3Vlc3MgZnJvbQorICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gVVJMIGFuZCBkcml2ZXIgbmFtZQorICAgICAgICAgICAgICAgIGRiZGljdGlvbmFyeSA9IERCRGljdGlvbmFyeUZhY3RvcnkuY2FsY3VsYXRlREJEaWN0aW9uYXJ5CisgICAgICAgICAgICAgICAgICAgICh0aGlzLCBnZXRDb25uZWN0aW9uVVJMKCksIGdldENvbm5lY3Rpb25Ecml2ZXJOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyk7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXJsIGFuZCBkcml2ZXIgbmFtZSBhcmVuJ3QgZW5vdWdoLCBjb25uZWN0IHRvCisgICAgICAgICAgICAgICAgLy8gdGhlIERCIGFuZCB1c2UgdGhlIGNvbm5lY3Rpb24gbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBpZiAoZGJkaWN0aW9uYXJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nIGxvZyA9IGdldExvZyhMT0dfSkRCQyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIgbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSkRCQ0NvbmZpZ3VyYXRpb25JbXBsLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGxvYy5nZXQoImNvbm5lY3RpbmctZm9yLWRpY3Rpb25hcnkiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGJhc2UgY29ubmVjdGlvbiBmYWN0b3J5IHJhdGhlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmVkIGRhdGEgc291cmNlIGIvYyB0aGUgZGF0YSBzb3VyY2UgcmVsaWVzCisgICAgICAgICAgICAgICAgICAgIC8vIG9uIHBhc3NpbmcgdGhlIGNvbm5lY3Rpb24gdGhyb3VnaCB0aGUgZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0aW5nIGluIGluZmluaXRlIGxvb3BzCisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2UgZHMgPSBjcmVhdGVDb25uZWN0aW9uRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBkYmRpY3Rpb25hcnkgPSBEQkRpY3Rpb25hcnlGYWN0b3J5Lm5ld0RCRGljdGlvbmFyeQorICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMsIGdldERhdGFTb3VyY2UobnVsbCwgZHMpLCBwcm9wcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGJkaWN0aW9uYXJ5UGx1Z2luLnNldChkYmRpY3Rpb25hcnksIHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYmRpY3Rpb25hcnk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXBkYXRlTWFuYWdlcihTdHJpbmcgdXBkYXRlTWFuYWdlcikgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB1cGRhdGVNYW5hZ2VyUGx1Z2luLnNldFN0cmluZyh1cGRhdGVNYW5hZ2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVNYW5hZ2VyUGx1Z2luLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZU1hbmFnZXIoVXBkYXRlTWFuYWdlciB1cGRhdGVNYW5hZ2VyKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHVwZGF0ZU1hbmFnZXJQbHVnaW4uc2V0KHVwZGF0ZU1hbmFnZXIpOworICAgIH0KKworICAgIHB1YmxpYyBVcGRhdGVNYW5hZ2VyIGdldFVwZGF0ZU1hbmFnZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgaWYgKHVwZGF0ZU1hbmFnZXJQbHVnaW4uZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXJQbHVnaW4uaW5zdGFudGlhdGUoVXBkYXRlTWFuYWdlci5jbGFzcywgdGhpcyk7CisgICAgICAgIHJldHVybiAoVXBkYXRlTWFuYWdlcikgdXBkYXRlTWFuYWdlclBsdWdpbi5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJEYXRhU291cmNlKFN0cmluZyBkcml2ZXJEYXRhU291cmNlKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGRyaXZlckRhdGFTb3VyY2VQbHVnaW4uc2V0U3RyaW5nKGRyaXZlckRhdGFTb3VyY2UpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyRGF0YVNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIGRyaXZlckRhdGFTb3VyY2VQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIERyaXZlckRhdGFTb3VyY2UgbmV3RHJpdmVyRGF0YVNvdXJjZUluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gKERyaXZlckRhdGFTb3VyY2UpIGRyaXZlckRhdGFTb3VyY2VQbHVnaW4uCisgICAgICAgICAgICBpbnN0YW50aWF0ZShEcml2ZXJEYXRhU291cmNlLmNsYXNzLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFGYWN0b3J5KFN0cmluZyBzY2hlbWFGYWN0b3J5KSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHNjaGVtYUZhY3RvcnlQbHVnaW4uc2V0U3RyaW5nKHNjaGVtYUZhY3RvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHNjaGVtYUZhY3RvcnlQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hRmFjdG9yeShTY2hlbWFGYWN0b3J5IHNjaGVtYUZhY3RvcnkpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgc2NoZW1hRmFjdG9yeVBsdWdpbi5zZXQoc2NoZW1hRmFjdG9yeSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUZhY3RvcnkgZ2V0U2NoZW1hRmFjdG9yeUluc3RhbmNlKCkgeworICAgICAgICBpZiAoc2NoZW1hRmFjdG9yeVBsdWdpbi5nZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgc2NoZW1hRmFjdG9yeVBsdWdpbi5pbnN0YW50aWF0ZShTY2hlbWFGYWN0b3J5LmNsYXNzLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChTY2hlbWFGYWN0b3J5KSBzY2hlbWFGYWN0b3J5UGx1Z2luLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNRTEZhY3RvcnkoU3RyaW5nIHNxbEZhY3RvcnkpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgc3FsRmFjdG9yeVBsdWdpbi5zZXRTdHJpbmcoc3FsRmFjdG9yeSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTUUxGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc3FsRmFjdG9yeVBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTUUxGYWN0b3J5KFNRTEZhY3Rvcnkgc3FsRmFjdG9yeSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBzcWxGYWN0b3J5UGx1Z2luLnNldChzcWxGYWN0b3J5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMRmFjdG9yeSBnZXRTUUxGYWN0b3J5SW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChzcWxGYWN0b3J5UGx1Z2luLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBzcWxGYWN0b3J5UGx1Z2luLmluc3RhbnRpYXRlKFNRTEZhY3RvcnkuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKFNRTEZhY3RvcnkpIHNxbEZhY3RvcnlQbHVnaW4uZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBpbmdGYWN0b3J5UGx1Z2luLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBpbmdGYWN0b3J5KFN0cmluZyBtYXBwaW5nKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIG1hcHBpbmdGYWN0b3J5UGx1Z2luLnNldFN0cmluZyhtYXBwaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YURhdGFGYWN0b3J5IG5ld01ldGFEYXRhRmFjdG9yeUluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbWFwcGluZ0ZhY3RvcnlQbHVnaW4uaW5zdGFudGlhdGVNZXRhRGF0YUZhY3RvcnkodGhpcywKKyAgICAgICAgICAgIG1ldGFGYWN0b3J5UGx1Z2luLCBnZXRNYXBwaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBpbmdEZWZhdWx0cyhTdHJpbmcgbWFwcGluZykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLm1hcHBpbmdEZWZhdWx0c1BsdWdpbi5zZXRTdHJpbmcobWFwcGluZyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRGVmYXVsdHMoKSB7CisgICAgICAgIHJldHVybiBtYXBwaW5nRGVmYXVsdHNQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGluZ0RlZmF1bHRzKE1hcHBpbmdEZWZhdWx0cyBtYXBwaW5nKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIG1hcHBpbmdEZWZhdWx0c1BsdWdpbi5zZXQobWFwcGluZyk7CisgICAgfQorCisgICAgcHVibGljIE1hcHBpbmdEZWZhdWx0cyBnZXRNYXBwaW5nRGVmYXVsdHNJbnN0YW5jZSgpIHsKKyAgICAgICAgaWYgKG1hcHBpbmdEZWZhdWx0c1BsdWdpbi5nZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgbWFwcGluZ0RlZmF1bHRzUGx1Z2luLmluc3RhbnRpYXRlKE1hcHBpbmdEZWZhdWx0cy5jbGFzcywgdGhpcyk7CisgICAgICAgIHJldHVybiAoTWFwcGluZ0RlZmF1bHRzKSBtYXBwaW5nRGVmYXVsdHNQbHVnaW4uZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIE1hcHBpbmdSZXBvc2l0b3J5IGdldE1hcHBpbmdSZXBvc2l0b3J5SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiAoTWFwcGluZ1JlcG9zaXRvcnkpIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIE1hcHBpbmdSZXBvc2l0b3J5IG5ld01hcHBpbmdSZXBvc2l0b3J5SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiAoTWFwcGluZ1JlcG9zaXRvcnkpIG5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIEJyb2tlckltcGwgbmV3QnJva2VySW5zdGFuY2UoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKSB7CisgICAgICAgIEJyb2tlckltcGwgYnJva2VyID0gc3VwZXIubmV3QnJva2VySW5zdGFuY2UodXNlciwgcGFzcyk7CisKKyAgICAgICAgLy8gcmVjb3JkIGZpcnN0IG5vbi1udWxsIGJyb2tlciB1c2VyIGFuZCBwYXNzIGluIGNhc2Ugbm8gZ2xvYmFsIHNldHRpbmdzCisgICAgICAgIGlmIChicm9rZXIgIT0gbnVsbCAmJiB1c2VyICE9IG51bGwgJiYgZmlyc3RVc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpcnN0VXNlciA9IHVzZXI7CisgICAgICAgICAgICBmaXJzdFBhc3MgPSBwYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBicm9rZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRDb25uZWN0aW9uRmFjdG9yeSgpIHsKKyAgICAgICAgLy8gb3ZlcnJpZGUgdG8gY29uZmlndXJlIGRhdGEgc291cmNlCisgICAgICAgIGlmIChkYXRhU291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIERlY29yYXRpbmdEYXRhU291cmNlIGRzID0gY3JlYXRlQ29ubmVjdGlvbkZhY3RvcnkoKTsKKyAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeS5pbnN0YWxsREJEaWN0aW9uYXJ5CisgICAgICAgICAgICAgICAgKGdldERCRGljdGlvbmFyeUluc3RhbmNlKCksIGRzLCB0aGlzLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnkoT2JqZWN0IGZhY3RvcnkpIHsKKyAgICAgICAgLy8gdGhlcmUncyBhIGxvdCBvZiBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBpbnZvbHZlZCBmb3IKKyAgICAgICAgLy8gY29ubmVjdGlvbiBmYWN0b3JpZXMsIHNvIGlnbm9yZSByZXNldHMKKyAgICAgICAgaWYgKGZhY3RvcnkgPT0gY29ubmVjdGlvbkZhY3RvcnkuZ2V0KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgdG8gY29uZmlndXJlIGRhdGEgc291cmNlCisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gZW5zdXJlIGl0IGlzIGRlY29yYXRlZCBiZWZvcmUgd2Ugc2V0IHRoZSBkaWN0CisgICAgICAgICAgICBEZWNvcmF0aW5nRGF0YVNvdXJjZSBkcyA9CisgICAgICAgICAgICAgICAgc2V0dXBDb25uZWN0aW9uRmFjdG9yeSgoRGF0YVNvdXJjZSkgZmFjdG9yeSwgZmFsc2UpOworICAgICAgICAgICAgZGF0YVNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5Lmluc3RhbGxEQkRpY3Rpb25hcnkKKyAgICAgICAgICAgICAgICAoZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKSwgZHMsIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjb25uZWN0aW9uRmFjdG9yeS5zZXQobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBEYXRhU291cmNlIGlzIGRlY29yYXRlZCBhbmQgc2V0IGluIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIERlY29yYXRpbmdEYXRhU291cmNlIHNldHVwQ29ubmVjdGlvbkZhY3RvcnkoRGF0YVNvdXJjZSBkcywKKyAgICAgICAgYm9vbGVhbiBmYWN0b3J5MikgeworICAgICAgICBpZiAoZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIERlY29yYXRpbmdEYXRhU291cmNlIGRkczsKKyAgICAgICAgaWYgKGRzIGluc3RhbmNlb2YgRGVjb3JhdGluZ0RhdGFTb3VyY2UpCisgICAgICAgICAgICBkZHMgPSAoRGVjb3JhdGluZ0RhdGFTb3VyY2UpIGRzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZHMgPSBEYXRhU291cmNlRmFjdG9yeS5kZWNvcmF0ZURhdGFTb3VyY2UoZHMsIHRoaXMsIGZhY3RvcnkyKTsKKworICAgICAgICBpZiAoIWZhY3RvcnkyICYmIGNvbm5lY3Rpb25GYWN0b3J5LmdldCgpICE9IGRzKQorICAgICAgICAgICAgY29ubmVjdGlvbkZhY3Rvcnkuc2V0KGRkcywgdHJ1ZSk7CisgICAgICAgIGVsc2UgaWYgKGZhY3RvcnkyICYmIGNvbm5lY3Rpb25GYWN0b3J5Mi5nZXQoKSAhPSBkcykKKyAgICAgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5Mi5zZXQoZGRzLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gZGRzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29ubmVjdGlvbkZhY3RvcnkyKCkgeworICAgICAgICAvLyBvdmVycmlkZSB0byBjb25maWd1cmUgZGF0YSBzb3VyY2UKKyAgICAgICAgaWYgKGRhdGFTb3VyY2UyID09IG51bGwpIHsKKyAgICAgICAgICAgIERhdGFTb3VyY2UgZHMgPSAoRGF0YVNvdXJjZSkgY29ubmVjdGlvbkZhY3RvcnkyLmdldCgpOworICAgICAgICAgICAgaWYgKGRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgZHJpdmVyIG5hbWUgaXMgYWx3YXlzIHJlcXVpcmVkLCBzbyBpZiBub3Qgc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgIC8vIHRoZW4gbm8gY29ubmVjdGlvbiBmYWN0b3J5IDIKKyAgICAgICAgICAgICAgICBTdHJpbmcgZHJpdmVyID0gZ2V0Q29ubmVjdGlvbjJEcml2ZXJOYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGRyaXZlcikpCisgICAgICAgICAgICAgICAgICAgIGRzID0gRGF0YVNvdXJjZUZhY3RvcnkubmV3RGF0YVNvdXJjZSh0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRGVjb3JhdGluZ0RhdGFTb3VyY2UgZGRzID0KKyAgICAgICAgICAgICAgICAgICAgc2V0dXBDb25uZWN0aW9uRmFjdG9yeShkcywgdHJ1ZSk7IC8vIGJlZm9yZSBkaWN0CisgICAgICAgICAgICAgICAgZGF0YVNvdXJjZTIgPSBEYXRhU291cmNlRmFjdG9yeS5pbnN0YWxsREJEaWN0aW9uYXJ5CisgICAgICAgICAgICAgICAgICAgIChnZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLCBkZHMsIHRoaXMsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhU291cmNlMjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeTIoT2JqZWN0IGZhY3RvcnkpIHsKKyAgICAgICAgaWYgKGZhY3RvcnkgPT0gY29ubmVjdGlvbkZhY3RvcnkyLmdldCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIG92ZXJyaWRlIHRvIGNvbmZpZ3VyZSBkYXRhIHNvdXJjZQorICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGVuc3VyZSBpdCBpcyBkZWNvcmF0ZWQgYmVmb3JlIHdlIHNldCB0aGUgZGljdAorICAgICAgICAgICAgRGVjb3JhdGluZ0RhdGFTb3VyY2UgZHMgPSBzZXR1cENvbm5lY3Rpb25GYWN0b3J5KChEYXRhU291cmNlKQorICAgICAgICAgICAgICAgIGZhY3RvcnksIHRydWUpOworICAgICAgICAgICAgZGF0YVNvdXJjZTIgPSBEYXRhU291cmNlRmFjdG9yeS5pbnN0YWxsREJEaWN0aW9uYXJ5CisgICAgICAgICAgICAgICAgKGdldERCRGljdGlvbmFyeUluc3RhbmNlKCksIGRzLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjb25uZWN0aW9uRmFjdG9yeTIuc2V0KG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgY29ubmVjdGlvbiBmYWN0b3J5IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIERlY29yYXRpbmdEYXRhU291cmNlIGNyZWF0ZUNvbm5lY3Rpb25GYWN0b3J5KCkgeworICAgICAgICBEYXRhU291cmNlIGRzID0gKERhdGFTb3VyY2UpIGNvbm5lY3Rpb25GYWN0b3J5LmdldCgpOworICAgICAgICBpZiAoZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBzZXR1cENvbm5lY3Rpb25GYWN0b3J5KGRzLCBmYWxzZSk7CisKKyAgICAgICAgZHMgPSAoRGF0YVNvdXJjZSkgc3VwZXIuZ2V0Q29ubmVjdGlvbkZhY3RvcnkoKTsgLy8gSk5ESSBsb29rdXAKKyAgICAgICAgaWYgKGRzID09IG51bGwpCisgICAgICAgICAgICBkcyA9IERhdGFTb3VyY2VGYWN0b3J5Lm5ld0RhdGFTb3VyY2UodGhpcywgZmFsc2UpOworCisgICAgICAgIHJldHVybiBzZXR1cENvbm5lY3Rpb25GYWN0b3J5KGRzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZShTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIHJldHVybiBnZXREYXRhU291cmNlKGN0eCwgKERhdGFTb3VyY2UpIGdldENvbm5lY3Rpb25GYWN0b3J5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UyKFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29ubmVjdGlvbiBmYWN0b3J5IDIsIHVzZSB0aGUgcHJpbWFyeSBmYWN0b3J5CisgICAgICAgIERhdGFTb3VyY2UgZHMgPSAoRGF0YVNvdXJjZSkgZ2V0Q29ubmVjdGlvbkZhY3RvcnkyKCk7CisgICAgICAgIGlmIChkcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGdldERhdGFTb3VyY2UoY3R4KTsKKworICAgICAgICAvLyBwcmVmZXIgdGhlIGdsb2JhbCBjb25uZWN0aW9uIDIgYXV0aCBpbmZvIGlmIGdpdmVuCisgICAgICAgIFN0cmluZyB1c2VyID0gZ2V0Q29ubmVjdGlvbjJVc2VyTmFtZSgpOworICAgICAgICBTdHJpbmcgcGFzcyA9IGdldENvbm5lY3Rpb24yUGFzc3dvcmQoKTsKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCAmJiBwYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vIGdsb2JhbCBhdXRoIGluZm87IHVzZSB0aGUgY29udGV4dCBpZiBnaXZlbiwgb3IgdGhlIGZpcnN0CisgICAgICAgICAgICAvLyBjb250ZXh0IGlmIG5vdAorICAgICAgICAgICAgaWYgKGN0eCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXNlciA9IGZpcnN0VXNlcjsKKyAgICAgICAgICAgICAgICBwYXNzID0gZmlyc3RQYXNzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2VyID0gY3R4LmdldENvbm5lY3Rpb25Vc2VyTmFtZSgpOworICAgICAgICAgICAgICAgIHBhc3MgPSBjdHguZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERhdGFTb3VyY2VGYWN0b3J5LmRlZmF1bHRzRGF0YVNvdXJjZShkcywgdXNlciwgcGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB2ZXJzaW9uIGFsbG93cyB1cyB0byBwYXNzIGluIHdoaWNoIGRhdGEgc291cmNlIHRvIHdyYXAgaW50ZXJuYWxseTsKKyAgICAgKiB1c2VmdWwgZHVyaW5nIGluaXRpYWxpemF0aW9uIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBmYWN0b3J5IGlzCisgICAgICogY29tcGxldGVseSBjb25maWd1cmVkLgorICAgICAqLworICAgIHByaXZhdGUgRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKFN0b3JlQ29udGV4dCBjdHgsIERhdGFTb3VyY2UgZHMpIHsKKyAgICAgICAgU3RyaW5nIHVzZXIsIHBhc3M7CisgICAgICAgIGlmIChjdHggPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgbm8gY29udGV4dCwgZGVmYXVsdCB0byB0aGUgZ2xvYmFsIGF1dGggaW5mbywgb3IgdGhlIGF1dGggaW5mbworICAgICAgICAgICAgLy8gb2YgdGhlIGZpcnN0IGNvbnRleHQgaWYgbm9uZQorICAgICAgICAgICAgdXNlciA9IGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpOworICAgICAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB1c2VyID0gZmlyc3RVc2VyOworICAgICAgICAgICAgcGFzcyA9IGdldENvbm5lY3Rpb25QYXNzd29yZCgpOworICAgICAgICAgICAgaWYgKHBhc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXNzID0gZmlyc3RQYXNzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdXNlIHRoZSBjb250ZXh0J3MgYXV0aCBpbmZvCisgICAgICAgICAgICB1c2VyID0gY3R4LmdldENvbm5lY3Rpb25Vc2VyTmFtZSgpOworICAgICAgICAgICAgcGFzcyA9IGN0eC5nZXRDb25uZWN0aW9uUGFzc3dvcmQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRGF0YVNvdXJjZUZhY3RvcnkuZGVmYXVsdHNEYXRhU291cmNlKGRzLCB1c2VyLCBwYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcmVlIHRoZSBkYXRhIHNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlQ2xvc2UoKSB7CisgICAgICAgIGlmIChkYXRhU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldERCRGljdGlvbmFyeUluc3RhbmNlKCkuY2xvc2VEYXRhU291cmNlKGRhdGFTb3VyY2UpOworICAgICAgICAgICAgY29ubmVjdGlvbkZhY3Rvcnkuc2V0KG51bGwsIHRydWUpOyAvLyBzbyBzdXBlciBkb2Vzbid0IGNsb3NlIGl0CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGFTb3VyY2UyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldERCRGljdGlvbmFyeUluc3RhbmNlKCkuY2xvc2VEYXRhU291cmNlKGRhdGFTb3VyY2UpOworICAgICAgICAgICAgY29ubmVjdGlvbkZhY3RvcnkyLnNldChudWxsLCB0cnVlKTsgLy8gc28gc3VwZXIgZG9lc24ndCBjbG9zZSBpdAorICAgICAgICB9CisgICAgICAgIHN1cGVyLnByZUNsb3NlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnZhbGlkUHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7CisgICAgICAgIGlmIChzdXBlci5pc0ludmFsaWRQcm9wZXJ0eShwcm9wTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBoYW5kbGUgb3BlbmpwYS5qZGJjLlNvbWVNaXNzcGVsbGVkUHJvcGVydHksIGJ1dCBub3QKKyAgICAgICAgLy8gb3BlbmpwYS5zb21lb3RoZXJpbXBsZW1lbnRhdGlvbi5Tb21lUHJvcGVydHkKKyAgICAgICAgU3RyaW5nW10gcHJlZml4ZXMgPSBQcm9kdWN0RGVyaXZhdGlvbnMuZ2V0Q29uZmlndXJhdGlvblByZWZpeGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAocHJvcE5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWZpeGVzW2ldICsgIi5qZGJjIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNQcm9kdWN0RGVyaXZhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNQcm9kdWN0RGVyaXZhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjVlMTYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ1Byb2R1Y3REZXJpdmF0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLkJyb2tlckZhY3RvcnlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBUHJvZHVjdERlcml2YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNCcm9rZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5BYnN0cmFjdFByb2R1Y3REZXJpdmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uUHJvdmlkZXI7CisKKy8qKgorICogU2V0cyBKREJDIGFzIGRlZmF1bHQgc3RvcmUuCisgKi8KK3B1YmxpYyBjbGFzcyBKREJDUHJvZHVjdERlcml2YXRpb24gZXh0ZW5kcyBBYnN0cmFjdFByb2R1Y3REZXJpdmF0aW9uCisgICAgaW1wbGVtZW50cyBPcGVuSlBBUHJvZHVjdERlcml2YXRpb24geworCisgICAgcHVibGljIHZvaWQgcHV0QnJva2VyRmFjdG9yeUFsaWFzZXMoTWFwIG0pIHsKKyAgICAgICAgbS5wdXQoImpkYmMiLCBKREJDQnJva2VyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfU1RPUkU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlQ29uZmlndXJhdGlvbkNvbnN0cnVjdChDb25maWd1cmF0aW9uUHJvdmlkZXIgY3ApIHsKKyAgICAgICAgLy8gZGVmYXVsdCB0byBKREJDIHdoZW4gbm8gYnJva2VyIGZhY3Rvcnkgc2V0CisgICAgICAgIGlmIChCcm9rZXJGYWN0b3J5VmFsdWUuZ2V0KGNwKSA9PSBudWxsKSB7CisgICAgICAgICAgICBCcm9rZXJGYWN0b3J5VmFsdWUuc2V0KGNwLCAiamRiYyIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDU2VxVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDU2VxVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFmMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNTZXFWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLlNlcVZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5DbGFzc1RhYmxlSkRCQ1NlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuTmF0aXZlSkRCQ1NlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuVGFibGVKREJDU2VxOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5WYWx1ZVRhYmxlSkRCQ1NlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlNlcXVlbmNlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlRpbWVTZWVkZWRTZXE7CisKKy8qKgorICogQWRkcyBhZGRpdGlvbmFsIGFsaWFzZXMgdG8gYmFzZSB7QGxpbmsgU2VxVmFsdWV9LiBUaGlzIHN1YmNsYXNzIGlzCisgKiBub3QgYWRkZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGJlY2F1c2UgaXQgaXMgbm90IHZpc2libGUgdG8gaXQuCisgKiBUaGVyZWZvcmUsIHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGFsdGVyIHNlcXVlbmNlIGluc3RhbnRpYXRpb24KKyAqIGJlaGF2aW9yLiBUaGUgYWxpYXNlcyBkZWZpbmVkIGJ5IHRoaXMgc3ViY2xhc3MgYXJlIGFkZGVkIHRvIHRoZQorICogY29uZmlndXJhdGlvbiwgaG93ZXZlciwgYW5kIHRoaXMgc3ViY2xhc3MgbWF5IGFsc28gYmUgaW5zdGFudGlhdGVkIGJ5CisgKiBvdGhlciBjb21wb25lbnRzIGZvciBjcmVhdGlvbiBvZiBzZXF1ZW5jZXMgd2l0aG91dCBtYW51YWwgYWxpYXMgc2V0dGluZy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgSkRCQ1NlcVZhbHVlCisgICAgZXh0ZW5kcyBTZXFWYWx1ZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUxJQVNFUyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgU2VxdWVuY2VNYXBwaW5nLklNUExfVEFCTEUsIFRhYmxlSkRCQ1NlcS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIFNlcXVlbmNlTWFwcGluZy5JTVBMX1ZBTFVFX1RBQkxFLCBWYWx1ZVRhYmxlSkRCQ1NlcS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIFNlcXVlbmNlTWFwcGluZy5JTVBMX0NMQVNTX1RBQkxFLCBDbGFzc1RhYmxlSkRCQ1NlcS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIFNlcXVlbmNlTWFwcGluZy5JTVBMX05BVElWRSwgTmF0aXZlSkRCQ1NlcS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIFNlcXVlbmNlTWFwcGluZy5JTVBMX1RJTUUsIFRpbWVTZWVkZWRTZXEuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAvLyBkZXByZWNhdGVkIGFsaWFzZXMKKyAgICAgICAgImRiIiwgVGFibGVKREJDU2VxLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgImRiLWNsYXNzIiwgQ2xhc3NUYWJsZUpEQkNTZXEuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAic2p2bSIsIFRpbWVTZWVkZWRTZXEuY2xhc3MuZ2V0TmFtZSgpLAorICAgIH07CisKKyAgICBwdWJsaWMgSkRCQ1NlcVZhbHVlKFN0cmluZyBwcm9wKSB7CisgICAgICAgIHN1cGVyKHByb3ApOworICAgICAgICBzZXRBbGlhc2VzKEFMSUFTRVMpOworICAgICAgICBzZXREZWZhdWx0KEFMSUFTRVNbMF0pOworICAgICAgICBzZXRDbGFzc05hbWUoQUxJQVNFU1sxXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL01hcHBpbmdGYWN0b3J5VmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9NYXBwaW5nRmFjdG9yeVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzMjllMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9NYXBwaW5nRmFjdG9yeVZhbHVlLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWV0YURhdGFQbHVzTWFwcGluZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5QbHVnaW5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3Rvcnk7CisKKy8qKgorICogSGFuZGxlcyB0aGUgY29tcGxleCBsb2dpYyBvZiBjcmVhdGluZyBhIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IGZvcgorICogY29tYmluZWQgbWV0YWRhdGEgYW5kIG1hcHBpbmcuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE1hcHBpbmdGYWN0b3J5VmFsdWUKKyAgICBleHRlbmRzIFBsdWdpblZhbHVlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE1hcHBpbmdGYWN0b3J5VmFsdWUuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBfbWV0YUZhY3RvcnlEZWZhdWx0cyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBfbWFwcGVkTWV0YUZhY3RvcnlEZWZhdWx0cyA9IG51bGw7CisKKyAgICBwdWJsaWMgTWFwcGluZ0ZhY3RvcnlWYWx1ZShTdHJpbmcgcHJvcCkgeworICAgICAgICBzdXBlcihwcm9wLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzZXR0aW5nIGZvciBhIGdpdmVuIDxjb2RlPk1ldGFEYXRhRmFjdG9yeTwvY29kZT4gYWxpYXMgc2V0dGluZy4KKyAgICAgKiBJZiBhIDxjb2RlPk1hcHBpbmdGYWN0b3J5PC9jb2RlPiB2YWx1ZSBpcyBub3Qgc3VwcGxpZWQsIHdlIGNoZWNrIHRoZXNlCisgICAgICogZGVmYXVsdHMgYWdhaW5zdCB0aGUgPGNvZGU+TWV0YURhdGFGYWN0b3J5PC9jb2RlPiBzZXR0aW5nLiBJZiB0aGUKKyAgICAgKiA8Y29kZT5NZXRhRGF0YUZhY3Rvcnk8L2NvZGU+IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0LCB3ZSBhc3N1bWUgaXQKKyAgICAgKiBoYW5kbGVzIGJvdGggbWV0YWRhdGEgYW5kIG1hcHBpbmcgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUZhY3RvcnlEZWZhdWx0KFN0cmluZyBtZXRhQWxpYXMsCisgICAgICAgIFN0cmluZyBtYXBwaW5nQWxpYXMpIHsKKyAgICAgICAgX21ldGFGYWN0b3J5RGVmYXVsdHMgPSBzZXRBbGlhcyhtZXRhQWxpYXMsIG1hcHBpbmdBbGlhcywKKyAgICAgICAgICAgIF9tZXRhRmFjdG9yeURlZmF1bHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgPGNvZGU+TWFwcGluZzwvY29kZT4gcHJvcGVydHkgaXMgc2V0LCB3ZSBjaGVjayB0aGVzZSBkZWZhdWx0cworICAgICAqIGJlZm9yZSBjaGVja2luZyBtZXRhZGF0YSBmYWN0b3J5IGRlZmF1bHRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE1ldGFEYXRhRmFjdG9yeURlZmF1bHQoU3RyaW5nIG1ldGFBbGlhcywKKyAgICAgICAgU3RyaW5nIG1hcHBpbmdBbGlhcykgeworICAgICAgICBfbWFwcGVkTWV0YUZhY3RvcnlEZWZhdWx0cyA9IHNldEFsaWFzKG1ldGFBbGlhcywgbWFwcGluZ0FsaWFzLAorICAgICAgICAgICAgX21hcHBlZE1ldGFGYWN0b3J5RGVmYXVsdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGFudGlhdGUgYSB7QGxpbmsgTWV0YURhdGFGYWN0b3J5fSByZXNwb25zaWJsZSBmb3IgYm90aCBtZXRhZGF0YSBhbmQKKyAgICAgKiBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YUZhY3RvcnkgaW5zdGFudGlhdGVNZXRhRGF0YUZhY3RvcnkoQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBQbHVnaW5WYWx1ZSBtZXRhUGx1Z2luLCBTdHJpbmcgbWFwcGluZykgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVNZXRhRGF0YUZhY3RvcnkoY29uZiwgbWV0YVBsdWdpbiwgbWFwcGluZywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50YW50aWF0ZSBhIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IHJlc3BvbnNpYmxlIGZvciBib3RoIG1ldGFkYXRhIGFuZAorICAgICAqIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIE1ldGFEYXRhRmFjdG9yeSBpbnN0YW50aWF0ZU1ldGFEYXRhRmFjdG9yeShDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIFBsdWdpblZhbHVlIG1ldGFQbHVnaW4sIFN0cmluZyBtYXBwaW5nLCBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIFN0cmluZyBjbHNOYW1lID0gZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgIFN0cmluZyBwcm9wcyA9IGdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgU3RyaW5nIG1ldGFDbHNOYW1lID0gbWV0YVBsdWdpbi5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgU3RyaW5nIG1ldGFQcm9wcyA9IG1ldGFQbHVnaW4uZ2V0UHJvcGVydGllcygpOworCisgICAgICAgIC8vIGlmIG5vIG1hcHBpbmcgZmFjdG9yeSBzZXQsIGNoZWNrIGZvciBkZWZhdWx0IGZvciB0aGlzIGZhY3RvcnkKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY2xzTmFtZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkZWY7CisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkobWFwcGluZykpIHsKKyAgICAgICAgICAgICAgICBkZWYgPSB1bmFsaWFzKG1ldGFQbHVnaW4uYWxpYXMobWV0YUNsc05hbWUpLAorICAgICAgICAgICAgICAgICAgICBfbWFwcGVkTWV0YUZhY3RvcnlEZWZhdWx0cywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjbHNOYW1lID0gdW5hbGlhcyhkZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY2xzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkZWYgPSB1bmFsaWFzKG1ldGFQbHVnaW4uYWxpYXMobWV0YUNsc05hbWUpLAorICAgICAgICAgICAgICAgICAgICBfbWV0YUZhY3RvcnlEZWZhdWx0cywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjbHNOYW1lID0gdW5hbGlhcyhkZWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbWFwcGluZyBmYWN0b3J5IGFuZCBtZXRhZGF0YSBmYWN0b3J5IHRoZSBzYW1lLCBjb21iaW5lCisgICAgICAgIC8vIGludG8gbWV0YWRhdGEgZmFjdG9yeQorICAgICAgICBpZiAoY2xzTmFtZSAhPSBudWxsICYmIGNsc05hbWUuZXF1YWxzKG1ldGFDbHNOYW1lKSkgeworICAgICAgICAgICAgaWYgKHByb3BzICE9IG51bGwgJiYgbWV0YVByb3BzID09IG51bGwpCisgICAgICAgICAgICAgICAgbWV0YVByb3BzID0gcHJvcHM7CisgICAgICAgICAgICBlbHNlIGlmIChwcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1ldGFQcm9wcyArPSAiLCIgKyBwcm9wczsKKyAgICAgICAgICAgIGNsc05hbWUgPSBudWxsOworICAgICAgICAgICAgcHJvcHMgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5zdGFudGlhdGUgZmFjdG9yaWVzCisgICAgICAgIE1ldGFEYXRhRmFjdG9yeSBtYXAgPSAoTWV0YURhdGFGYWN0b3J5KSBuZXdJbnN0YW5jZShjbHNOYW1lLAorICAgICAgICAgICAgTWV0YURhdGFGYWN0b3J5LmNsYXNzLCBjb25mLCBmYXRhbCk7CisgICAgICAgIE1ldGFEYXRhRmFjdG9yeSBtZXRhOworICAgICAgICBpZiAobWFwICE9IG51bGwKKyAgICAgICAgICAgICYmIG1hcC5nZXRDbGFzcygpLmdldE5hbWUoKS5pbmRleE9mKCJEZXByZWNhdGVkIikgIT0gLTEpIHsKKyAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgbWFwcGluZyBmYWN0b3JpZXMgdGFrZSBvdmVyIG1ldGFkYXRhIHRvbywgc28gd2UgaGF2ZQorICAgICAgICAgICAgLy8gdG8gc3BlY2lhbC1jYXNlIHRoZW0gdG8gdHJlYXQgdGhlbSBsaWtlIG1ldGFkYXRhIGZhY3Rvcnkgb25seQorICAgICAgICAgICAgbWV0YSA9IG1hcDsKKyAgICAgICAgICAgIG1hcCA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRhID0gKE1ldGFEYXRhRmFjdG9yeSkgbWV0YVBsdWdpbi5uZXdJbnN0YW5jZQorICAgICAgICAgICAgICAgIChtZXRhQ2xzTmFtZSwgTWV0YURhdGFGYWN0b3J5LmNsYXNzLCBjb25mLCBmYXRhbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25maWd1cmUgZmFjdG9yaWVzLiAgaWYgb25seSBtZXRhIGZhY3RvcnksIGFsbG93IHVzZXIgdG8gc3BlY2lmeQorICAgICAgICAvLyBpdHMgbWFwcGluZyBwcm9wZXJ0aWVzIGluIHRoZSBtYXBwaW5nIGZhY3Rvcnkgc2V0dGluZworICAgICAgICBpZiAobWFwID09IG51bGwgJiYgcHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1ldGFQcm9wcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIG1ldGFQcm9wcyA9IHByb3BzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGFQcm9wcyArPSAiLCAiICsgcHJvcHM7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2UobWFwLCBjb25mLCBwcm9wcywKKyAgICAgICAgICAgIChmYXRhbCkgPyBnZXRQcm9wZXJ0eSgpIDogbnVsbCk7CisgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKG1ldGEsIGNvbmYsIG1ldGFQcm9wcywKKyAgICAgICAgICAgIChmYXRhbCkgPyBtZXRhUGx1Z2luLmdldFByb3BlcnR5KCkgOiBudWxsKTsKKworICAgICAgICBMb2cgbG9nID0gY29uZi5nZXRMb2coSkRCQ0NvbmZpZ3VyYXRpb24uTE9HX01FVEFEQVRBKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoIm1ldGEtZmFjdG9yeSIsIG1ldGEpKTsKKyAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoIm1hcC1mYWN0b3J5IiwgbWFwKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBubyBtYXBwaW5nIHNldHRpbmcsIHJldHVybiBtZXRhIGZhY3RvcnkgYWxvbmUsIGFzc3VtaW5nIGl0IGhhbmRsZXMKKyAgICAgICAgLy8gYm90aCBtZXRhZGF0YSBhbmQgbWFwcGluZworICAgICAgICBNZXRhRGF0YUZhY3RvcnkgcmV0ID0gKG1hcCA9PSBudWxsKSA/IG1ldGEKKyAgICAgICAgICAgIDogbmV3IE1ldGFEYXRhUGx1c01hcHBpbmdGYWN0b3J5KG1ldGEsIG1hcCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL01hcHBpbmdSZXBvc2l0b3J5VmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9NYXBwaW5nUmVwb3NpdG9yeVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyY2FhMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9NYXBwaW5nUmVwb3NpdG9yeVZhbHVlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlBsdWdpblZhbHVlOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEhhbmRsZXMgdGhlIGNvbXBsZXggbG9naWMgb2YgY3JlYXRpbmcgYSB7QGxpbmsgTWFwcGluZ1JlcG9zaXRvcnl9IGZvcgorICogYSBnaXZlbiBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBwaW5nUmVwb3NpdG9yeVZhbHVlCisgICAgZXh0ZW5kcyBQbHVnaW5WYWx1ZSB7CisKKyAgICBwdWJsaWMgTWFwcGluZ1JlcG9zaXRvcnlWYWx1ZShTdHJpbmcgcHJvcCkgeworICAgICAgICBzdXBlcihwcm9wLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbHNOYW1lLCBDbGFzcyB0eXBlLAorICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgLy8gc2luY2UgdGhlIE1hcHBpbmdSZXBvc2l0b3J5IHRha2VzIGEgSkRCQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3RvciwKKyAgICAgICAgLy8gd2UgbmVlZCB0byBtYW51YWxseSBwZXJmb3JtIHRoZSBpbnN0YW50aWF0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbHMgPSBTdHJpbmdzLnRvQ2xhc3MoY2xzTmFtZSwgdHlwZS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117IEpEQkNDb25maWd1cmF0aW9uLmNsYXNzIH0pLgorICAgICAgICAgICAgICAgIG5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXsgY29uZiB9KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93KFJ1bnRpbWVFeGNlcHRpb24pIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nCisgICAgICAgICAgICByZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoY2xzTmFtZSwgdHlwZSwgY29uZiwgZmF0YWwpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXdJbnN0YW5jZShjbHNOYW1lLCB0eXBlLCBjb25mLCBmYXRhbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg2OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQS1KREJDIENvbmZpZ3VyYXRpb248L3N0cm9uZz48L3A+CisKKzxwPgorICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyBKREJDIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlcy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0Fic3RyYWN0SkRCQ1NhdmVwb2ludE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0Fic3RyYWN0SkRCQ1NhdmVwb2ludE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDAxMDYwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvQWJzdHJhY3RKREJDU2F2ZXBvaW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTYXZlcG9pbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5SZXN0b3JlU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TYXZlcG9pbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CisKKy8qKgorICogQWJzdHJhY3Qge0BsaW5rIFNhdmVwb2ludE1hbmFnZXJ9IGltcGxlbWVudGF0aW9uIHRoYXQKKyAqIGRlbGVnYXRlcyB0byB0aGUgc3ViY2xhc3MgZm9yIHNhdmVwb2ludCBvcGVyYXRpb25zIG9uIHRoZSBhY3RpdmUKKyAqIHtAbGluayBDb25uZWN0aW9ufS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMgYSBmbHVzaCBhbmQgcmVsaWVzCisgKiBvbiB0aGUgZHJpdmVyL2RiIHRvIHJlc3RvcmUgYmFjayB0byB0aGUgZmx1c2hlZCBzdGF0ZS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQHNpbmNlIDAuMy40CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpEQkNTYXZlcG9pbnRNYW5hZ2VyCisgICAgaW1wbGVtZW50cyBTYXZlcG9pbnRNYW5hZ2VyLCBDb25maWd1cmFibGUgeworCisgICAgcHJpdmF0ZSBib29sZWFuIF9yZXN0b3JlID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgX3Jlc3RvcmUgPSAoKE9wZW5KUEFDb25maWd1cmF0aW9uKSBjb25mKS5nZXRSZXN0b3JlU3RhdGVDb25zdGFudCgpCisgICAgICAgICAgICAhPSBSZXN0b3JlU3RhdGUuUkVTVE9SRV9OT05FOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdG8gcmV0YWluIGluLW1lbW9yeSBjb3BpZXMgb2YgZmllbGQgdmFsdWVzIGZvciByZXN0b3JlCisgICAgICogb24gcm9sbGJhY2suIERlZmF1bHRzIHRvIHtAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNnZXRSZXN0b3JlU3RhdGUpLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlc3RvcmVGaWVsZFN0YXRlKCkgeworICAgICAgICByZXR1cm4gX3Jlc3RvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gcmV0YWluIGluLW1lbW9yeSBjb3BpZXMgb2YgZmllbGQgdmFsdWVzIGZvciByZXN0b3JlCisgICAgICogb24gcm9sbGJhY2suIERlZmF1bHRzIHRvIHtAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNnZXRSZXN0b3JlU3RhdGV9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3RvcmVGaWVsZFN0YXRlKGJvb2xlYW4gcmVzdG9yZSkgeworICAgICAgICBfcmVzdG9yZSA9IHJlc3RvcmU7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFTYXZlcG9pbnQgbmV3U2F2ZXBvaW50KFN0cmluZyBuYW1lLCBCcm9rZXIgYnJva2VyKSB7CisgICAgICAgIC8vIGZsdXNoIGFmdGVyIGNyZWF0aW5nIHNhdmVwb2ludCBiL2MgZmx1c2ggbWF5IGFkZC9jaGFuZ2Ugc3RhdGVzCisgICAgICAgIE9wZW5KUEFTYXZlcG9pbnQgc2F2ZSA9IG5ldyBDb25uZWN0aW9uU2F2ZXBvaW50KGJyb2tlciwgbmFtZSwgX3Jlc3RvcmUpOworICAgICAgICBicm9rZXIuZmx1c2goKTsKKyAgICAgICAgcmV0dXJuIHNhdmU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNJbmNyZW1lbnRhbEZsdXNoKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSb2xsYmFjayB0aGUgZGF0YXN0b3JlIHNhdmVwb2ludC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByb2xsYmFja0RhdGFTdG9yZShDb25uZWN0aW9uU2F2ZXBvaW50IHNhdmVwb2ludCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRhdGFzdG9yZSBzYXZlcG9pbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0RGF0YVN0b3JlKENvbm5lY3Rpb25TYXZlcG9pbnQgc2F2ZXBvaW50KTsKKworICAgIC8qKgorICAgICAqIEEgc2F2ZXBvaW50IHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbmFsCisgICAgICogY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgQ29ubmVjdGlvblNhdmVwb2ludCBleHRlbmRzIE9wZW5KUEFTYXZlcG9pbnQgeworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IF9zYXZlcG9pbnQ7CisKKyAgICAgICAgcHVibGljIENvbm5lY3Rpb25TYXZlcG9pbnQoQnJva2VyIGJyb2tlciwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY29weSkgeworICAgICAgICAgICAgc3VwZXIoYnJva2VyLCBuYW1lLCBjb3B5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHN0b3JlZCBzYXZlcG9pbnQgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFTdG9yZVNhdmVwb2ludCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfc2F2ZXBvaW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc2F2ZXBvaW50IG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0YVN0b3JlU2F2ZXBvaW50KE9iamVjdCBzYXZlcG9pbnQpIHsKKyAgICAgICAgICAgIF9zYXZlcG9pbnQgPSBzYXZlcG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHtAbGluayBDb25uZWN0aW9ufSBmb3IgdGhpcyBzYXZlcG9pbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICgoSkRCQ1N0b3JlTWFuYWdlcikgZ2V0QnJva2VyKCkuZ2V0U3RvcmVNYW5hZ2VyKCkuCisgICAgICAgICAgICAgICAgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSkuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gcm9sbGJhY2soQ29sbGVjdGlvbiBwcmV2aW91cykgeworICAgICAgICAgICAgQWJzdHJhY3RKREJDU2F2ZXBvaW50TWFuYWdlci50aGlzLnJvbGxiYWNrRGF0YVN0b3JlKHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJvbGxiYWNrKHByZXZpb3VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29sbGVjdGlvbiBzdGF0ZXMpIHsKKyAgICAgICAgICAgIEFic3RyYWN0SkRCQ1NhdmVwb2ludE1hbmFnZXIudGhpcy5zZXREYXRhU3RvcmUodGhpcyk7CisgICAgICAgICAgICBzdXBlci5zYXZlKHN0YXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9BYnN0cmFjdEpEQkNTZXEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0Fic3RyYWN0SkRCQ1NlcS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDdjMmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9BYnN0cmFjdEpEQkNTZXEuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CisKKy8qKgorICogQWJzdHJhY3Qgc2VxdWVuY2UgaW1wbGVtZW50YXRpb24uIEhhbmRsZXMgb2J0YWluaW5nIHRoZSBwcm9wZXIKKyAqIGNvbm5lY3Rpb24gdG8gdXNlZCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBpcyB0cmFuc2FjdGlvbmFsIGFuZAorICogd2hldGhlciBhIHNlY29uZCBkYXRhc291cmNlIGlzIGNvbmZpZ3VyZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SkRCQ1NlcQorICAgIGltcGxlbWVudHMgSkRCQ1NlcSB7CisKKyAgICBwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0RFRkFVTFQ7CisgICAgcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBUcmFuc2FjdGlvbiBfb3V0ZXJUcmFuc2FjdGlvbjsKKworICAgIC8qKgorICAgICAqIFJlY29yZHMgdGhlIHNlcXVlbmNlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV4dChTdG9yZUNvbnRleHQgY3R4LCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlID0gZ2V0U3RvcmUoY3R4KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0SW50ZXJuYWwoc3RvcmUsIChDbGFzc01hcHBpbmcpIG1ldGEpOworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY3VycmVudChTdG9yZUNvbnRleHQgY3R4LCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlID0gZ2V0U3RvcmUoY3R4KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW50ZXJuYWwoc3RvcmUsIChDbGFzc01hcHBpbmcpIG1ldGEpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbGxvY2F0ZShpbnQgYWRkaXRpb25hbCwgU3RvcmVDb250ZXh0IGN0eCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSA9IGdldFN0b3JlKGN0eCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY2F0ZUludGVybmFsKGFkZGl0aW9uYWwsIHN0b3JlLCAoQ2xhc3NNYXBwaW5nKSBtZXRhKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2NoZW1hKENsYXNzTWFwcGluZyBtYXBwaW5nLCBTY2hlbWFHcm91cCBncm91cCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vLW9wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmV4dCBzZXF1ZW5jZSBvYmplY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBuZXh0SW50ZXJuYWwoSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBKREJDQ29uZmlndXJhdGlvbn0gZm9yIHRoaXMgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEpEQkNDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzZXF1ZW5jZSBvYmplY3QuIEJ5IGRlZmF1bHQgcmV0dXJucyB0aGUgbGFzdAorICAgICAqIHNlcXVlbmNlIHZhbHVlIHVzZWQsIG9yIG51bGwgaWYgbm8gc2VxdWVuY2UgdmFsdWVzIGhhdmUgYmVlbiByZXF1ZXN0ZWQKKyAgICAgKiB5ZXQuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgbm90IHRocmVhZHNhZmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50SW50ZXJuYWwoSkRCQ1N0b3JlIHN0b3JlLCBDbGFzc01hcHBpbmcgbWFwcGluZykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFkZGl0aW9uYWwgc2VxdWVuY2UgdmFsdWVzLiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhbGxvY2F0ZUludGVybmFsKGludCBhZGRpdGlvbmFsLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHRoZSBzdG9yZSBmcm9tIHRoZSBnaXZlbiBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgSkRCQ1N0b3JlIGdldFN0b3JlKFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgcmV0dXJuIChKREJDU3RvcmUpIGN0eC5nZXRTdG9yZU1hbmFnZXIoKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiB0byB1c2UgYmFzZWQgb24gdGhlIHR5cGUgb2Ygc2VxdWVuY2UuIFRoaXMKKyAgICAgKiBjb25uZWN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbG9zZWQ7IGRvIG5vdCBjbG9zZSBpdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0eXBlID09IFRZUEVfVFJBTlNBQ1RJT05BTCB8fCB0eXBlID09IFRZUEVfQ09OVElHVU9VUykKKyAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgIGVsc2UgaWYgKHN1c3BlbmRJbkpUQSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlciB0bSA9IGdldENvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWFuYWdlZFJ1bnRpbWVJbnN0YW5jZSgpLmdldFRyYW5zYWN0aW9uTWFuYWdlcigpOworICAgICAgICAgICAgICAgIF9vdXRlclRyYW5zYWN0aW9uID0gdG0uc3VzcGVuZCgpOworICAgICAgICAgICAgICAgIHRtLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IHN0b3JlLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2UgZHMgPSBjb25mLmdldERhdGFTb3VyY2UyKHN0b3JlLmdldENvbnRleHQoKSk7CisgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoY29ubi5nZXRBdXRvQ29tbWl0KCkpCisgICAgICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBjb25uOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgIGlmIChjb25uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9UUkFOU0FDVElPTkFMIHx8IHR5cGUgPT0gVFlQRV9DT05USUdVT1VTKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nOyB0aGlzIHNlcSBpcyBwYXJ0IG9mIHRoZSBidXNpbmVzcyB0cmFuc2FjdGlvbgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHN1c3BlbmRJbkpUQSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlciB0bSA9IGdldENvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWFuYWdlZFJ1bnRpbWVJbnN0YW5jZSgpLmdldFRyYW5zYWN0aW9uTWFuYWdlcigpOworICAgICAgICAgICAgICAgIHRtLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIHRyeSB7IGNvbm4uY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorCisgICAgICAgICAgICAgICAgaWYgKF9vdXRlclRyYW5zYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRtLnJlc3VtZShfb3V0ZXJUcmFuc2FjdGlvbik7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfb3V0ZXJUcmFuc2FjdGlvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgY29ubi5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZWN0IHdoZXRoZXIgb3Igbm90IE9wZW5KUEEgc2hvdWxkIHN1c3BlbmQgdGhlIHRyYW5zYWN0aW9uIGluIAorICAgICAqIGEgbWFuYWdlZCBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXNwZW5kSW5KVEEoKSB7CisgICAgICAgIHJldHVybiBnZXRDb25maWd1cmF0aW9uKCkuaXNDb25uZWN0aW9uRmFjdG9yeU1vZGVNYW5hZ2VkKCkgJiYgCisgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29ubmVjdGlvbkZhY3RvcnkyKCkgPT0gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9BYnN0cmFjdFVwZGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0Fic3RyYWN0VXBkYXRlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmQ1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9BYnN0cmFjdFVwZGF0ZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5EaXNjcmltaW5hdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcHRpbWlzdGljRXhjZXB0aW9uOworCisvKioKKyAqIEJhc2UgdXBkYXRlIG1hbmFnZXIgd2l0aCBjb21tb24gZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVcGRhdGVNYW5hZ2VyCisgICAgaW1wbGVtZW50cyBVcGRhdGVNYW5hZ2VyLCBDb25maWd1cmFibGUgeworCisgICAgcHJvdGVjdGVkIEpEQkNDb25maWd1cmF0aW9uIGNvbmYgPSBudWxsOworICAgIHByb3RlY3RlZCBEQkRpY3Rpb25hcnkgZGljdCA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICB0aGlzLmNvbmYgPSAoSkRCQ0NvbmZpZ3VyYXRpb24pIGNvbmY7CisgICAgICAgIGRpY3QgPSB0aGlzLmNvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBmbHVzaChDb2xsZWN0aW9uIHN0YXRlcywgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IHN0b3JlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50TWFuYWdlciBwc01nciA9IG5ld1ByZXBhcmVkU3RhdGVtZW50TWFuYWdlcihzdG9yZSwKKyAgICAgICAgICAgICAgICBjb25uKTsKKyAgICAgICAgICAgIHJldHVybiBmbHVzaChzdGF0ZXMsIHN0b3JlLCBwc01ncik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBjb25uLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBmbHVzaChDb2xsZWN0aW9uIHN0YXRlcywgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXIgcHNNZ3IpIHsKKyAgICAgICAgLy8gcnVuIHRocm91Z2ggYWxsIHRoZSBzdGF0ZXMgYW5kIHVwZGF0ZSB0aGVtIGFzIG5lY2Vzc2FyeQorICAgICAgICBSb3dNYW5hZ2VyIHJvd01nciA9IG5ld1Jvd01hbmFnZXIoKTsKKyAgICAgICAgQ29sbGVjdGlvbiBjdXN0b21zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgQ29sbGVjdGlvbiBleGNlcHMgPSBudWxsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHN0YXRlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIGV4Y2VwcyA9IHBvcHVsYXRlUm93TWFuYWdlcigoT3BlbkpQQVN0YXRlTWFuYWdlcikgaXRyLm5leHQoKSwKKyAgICAgICAgICAgICAgICByb3dNZ3IsIHN0b3JlLCBleGNlcHMsIGN1c3RvbXMpOworCisgICAgICAgIC8vIGZsdXNoIHJvd3MKKyAgICAgICAgZXhjZXBzID0gZmx1c2gocm93TWdyLCBwc01nciwgZXhjZXBzKTsKKworICAgICAgICAvLyBub3cgZG8gYW55IGN1c3RvbSBtYXBwaW5ncworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGN1c3RvbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChDdXN0b21NYXBwaW5nKSBpdHIubmV4dCgpKS5leGVjdXRlKHN0b3JlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZEV4Y2VwdGlvbihleGNlcHMsIFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIGRpY3QpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGRFeGNlcHRpb24oZXhjZXBzLCBrZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gYWxsIGV4Y2VwdGlvbnMKKyAgICAgICAgQ29sbGVjdGlvbiBwc0V4Y2VwcyA9IHBzTWdyLmdldEV4Y2VwdGlvbnMoKTsKKyAgICAgICAgaWYgKGV4Y2VwcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBzRXhjZXBzOworICAgICAgICBpZiAocHNFeGNlcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBleGNlcHM7CisgICAgICAgIGV4Y2Vwcy5hZGRBbGwocHNFeGNlcHMpOworICAgICAgICByZXR1cm4gZXhjZXBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyB7QGxpbmsgUm93TWFuYWdlcn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJvd01hbmFnZXIgbmV3Um93TWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHtAbGluayBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXIgbmV3UHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VyKAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIENvbm5lY3Rpb24gY29ubik7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBhbGwgcm93cyBvZiB0aGUgZ2l2ZW4gcm93IG1hbmFnZXIuIEFkZCBleGNlcHRpb25zIHRvCisgICAgICogPGNvZGU+ZXhjZXBzPC9jb2RlPiAod2hpY2ggbWF5IHN0YXJ0IGFzIG51bGwpIHVzaW5nCisgICAgICoge0BsaW5rICNhZGRFeGNlcHRpb259LiBSZXR1cm4gPGNvZGU+ZXhjZXBzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbiBmbHVzaChSb3dNYW5hZ2VyIHJvd01nciwKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VyIHBzTWdyLCBDb2xsZWN0aW9uIGV4Y2Vwcyk7CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB0aGUgcm93IG1hbmFnZXIgd2l0aCByb3dzIHRvIGJlIGZsdXNoZWQgZm9yIHRoZSBnaXZlbiBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNlcHMgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZCB3aGVuIGZsdXNoaW5nIHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgKiB0aGlzIGxpc3QgYW5kIHJldHVybmVkOyB0aGUgbGlzdCBtYXkgYmUgbnVsbCBpbml0aWFsbHkKKyAgICAgKiBAcGFyYW0gY3VzdG9tcyBidWZmZXIgY3VzdG9tIG1hcHBpbmdzCisgICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9ucyBsaXN0CisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIHBvcHVsYXRlUm93TWFuYWdlcihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBSb3dNYW5hZ2VyIHJvd01nciwgSkRCQ1N0b3JlIHN0b3JlLCBDb2xsZWN0aW9uIGV4Y2VwcywKKyAgICAgICAgQ29sbGVjdGlvbiBjdXN0b21zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCaXRTZXQgZGlydHk7CisgICAgICAgICAgICBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuUE5FVyAmJiAhc20uaXNGbHVzaGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbnNlcnQoc20sIChDbGFzc01hcHBpbmcpIHNtLmdldE1ldGFEYXRhKCksIHJvd01nciwgc3RvcmUsCisgICAgICAgICAgICAgICAgICAgIGN1c3RvbXMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5QTkVXRkxVU0hFRERFTEVURUQKKyAgICAgICAgICAgICAgICB8fCBzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5QREVMRVRFRCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZShzbSwgKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKSwgcm93TWdyLCBzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChkaXJ0eSA9IEltcGxIZWxwZXIuZ2V0VXBkYXRlRmllbGRzKHNtKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZShzbSwgZGlydHksIChDbGFzc01hcHBpbmcpIHNtLmdldE1ldGFEYXRhKCksIHJvd01nciwKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUsIGN1c3RvbXMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzbS5pc1ZlcnNpb25VcGRhdGVSZXF1aXJlZCgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlSW5kaWNhdG9ycyhzbSwgKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKSwgcm93TWdyLAorICAgICAgICAgICAgICAgICAgICBzdG9yZSwgY3VzdG9tcywgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzVmVyc2lvbkNoZWNrUmVxdWlyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICghKChDbGFzc01hcHBpbmcpIHNtLmdldE1ldGFEYXRhKCkpLmdldFZlcnNpb24oKS4KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKHNtLCBzdG9yZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGRFeGNlcHRpb24oZXhjZXBzLCBuZXcgT3B0aW1pc3RpY0V4Y2VwdGlvbihzbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hbmFnZWRJbnN0YW5jZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgZXhjZXBzID0gYWRkRXhjZXB0aW9uKGV4Y2VwcywgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgZGljdCkpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICBleGNlcHMgPSBhZGRFeGNlcHRpb24oZXhjZXBzLCBrZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4Y2VwczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGV4Y2VwdGlvbiB0byB0aGUgZ2l2ZW4gbGlzdCwgd2hpY2ggbWF5IHN0YXJ0IG91dCBhcyBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZEV4Y2VwdGlvbihDb2xsZWN0aW9uIGV4Y2VwcywgRXhjZXB0aW9uIGVycikgeworICAgICAgICBpZiAoZXhjZXBzID09IG51bGwpCisgICAgICAgICAgICBleGNlcHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBleGNlcHMuYWRkKGVycik7CisgICAgICAgIHJldHVybiBleGNlcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlIG1ldGhvZCB0byBpbnNlcnQgdGhlIGdpdmVuIGluc3RhbmNlLCBiYXNlIGNsYXNzIGZpcnN0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIFJvd01hbmFnZXIgcm93TWdyLCBKREJDU3RvcmUgc3RvcmUsIENvbGxlY3Rpb24gY3VzdG9tcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIEJvb2xlYW4gY3VzdG9tID0gbWFwcGluZy5pc0N1c3RvbUluc2VydChzbSwgc3RvcmUpOworICAgICAgICBpZiAoIUJvb2xlYW4uRkFMU0UuZXF1YWxzKGN1c3RvbSkpCisgICAgICAgICAgICBtYXBwaW5nLmN1c3RvbUluc2VydChzbSwgc3RvcmUpOworICAgICAgICBpZiAoY3VzdG9tLmVxdWFscyhCb29sZWFuLlRSVUUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBtYXBwaW5nLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3VwICE9IG51bGwpCisgICAgICAgICAgICBpbnNlcnQoc20sIHN1cCwgcm93TWdyLCBzdG9yZSwgY3VzdG9tcyk7CisKKyAgICAgICAgbWFwcGluZy5pbnNlcnQoc20sIHN0b3JlLCByb3dNZ3IpOworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBtYXBwaW5nLmdldERlZmluZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIEJpdFNldCBkaXJ0eSA9IHNtLmdldERpcnR5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGlydHkuZ2V0KGZpZWxkc1tpXS5nZXRJbmRleCgpKQorICAgICAgICAgICAgICAgICYmICFidWZmZXJDdXN0b21JbnNlcnQoZmllbGRzW2ldLCBzbSwgc3RvcmUsIGN1c3RvbXMpKQorICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5pbnNlcnQoc20sIHN0b3JlLCByb3dNZ3IpOworICAgICAgICB9CisgICAgICAgIGlmIChzdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgVmVyc2lvbiB2ZXJzID0gbWFwcGluZy5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlckN1c3RvbUluc2VydCh2ZXJzLCBzbSwgc3RvcmUsIGN1c3RvbXMpKQorICAgICAgICAgICAgICAgIHZlcnMuaW5zZXJ0KHNtLCBzdG9yZSwgcm93TWdyKTsKKyAgICAgICAgICAgIERpc2NyaW1pbmF0b3IgZHNjID0gbWFwcGluZy5nZXREaXNjcmltaW5hdG9yKCk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlckN1c3RvbUluc2VydChkc2MsIHNtLCBzdG9yZSwgY3VzdG9tcykpCisgICAgICAgICAgICAgICAgZHNjLmluc2VydChzbSwgc3RvcmUsIHJvd01ncik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZ2l2ZW4gbWFwcGluZyB1c2VzIGEgY3VzdG9tIGluc2VydCwgcGxhY2VzIGEKKyAgICAgKiB7QGxpbmsgQ3VzdG9tTWFwcGluZ30gc3RydWN0IGZvciBpdCBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBhbmQKKyAgICAgKiByZXR1cm5zIHRydWUsIGVsc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYnVmZmVyQ3VzdG9tSW5zZXJ0KFN0cmF0ZWd5IHN0cmF0LCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIENvbGxlY3Rpb24gY3VzdG9tcykgeworICAgICAgICBCb29sZWFuIGN1c3RvbSA9IHN0cmF0LmlzQ3VzdG9tSW5zZXJ0KHNtLCBzdG9yZSk7CisgICAgICAgIGlmICghQm9vbGVhbi5GQUxTRS5lcXVhbHMoY3VzdG9tKSkKKyAgICAgICAgICAgIGN1c3RvbXMuYWRkKG5ldyBDdXN0b21NYXBwaW5nKEN1c3RvbU1hcHBpbmcuSU5TRVJULCBzbSwgc3RyYXQpKTsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoY3VzdG9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmUgbWV0aG9kIHRvIGRlbGV0ZSB0aGUgZ2l2ZW4gaW5zdGFuY2UsIGJhc2UgY2xhc3MgbGFzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENsYXNzTWFwcGluZyBtYXBwaW5nLAorICAgICAgICBSb3dNYW5hZ2VyIHJvd01nciwgSkRCQ1N0b3JlIHN0b3JlLCBDb2xsZWN0aW9uIGN1c3RvbXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBCb29sZWFuIGN1c3RvbSA9IG1hcHBpbmcuaXNDdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICAgICAgaWYgKCFCb29sZWFuLkZBTFNFLmVxdWFscyhjdXN0b20pKQorICAgICAgICAgICAgbWFwcGluZy5jdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoY3VzdG9tKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBtYXBwaW5nLmdldERlZmluZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFidWZmZXJDdXN0b21EZWxldGUoZmllbGRzW2ldLCBzbSwgc3RvcmUsIGN1c3RvbXMpKQorICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5kZWxldGUoc20sIHN0b3JlLCByb3dNZ3IpOworCisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBtYXBwaW5nLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIFZlcnNpb24gdmVycyA9IG1hcHBpbmcuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgaWYgKCFidWZmZXJDdXN0b21EZWxldGUodmVycywgc20sIHN0b3JlLCBjdXN0b21zKSkKKyAgICAgICAgICAgICAgICB2ZXJzLmRlbGV0ZShzbSwgc3RvcmUsIHJvd01ncik7CisgICAgICAgICAgICBEaXNjcmltaW5hdG9yIGRzYyA9IG1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvcigpOworICAgICAgICAgICAgaWYgKCFidWZmZXJDdXN0b21EZWxldGUoZHNjLCBzbSwgc3RvcmUsIGN1c3RvbXMpKQorICAgICAgICAgICAgICAgIGRzYy5kZWxldGUoc20sIHN0b3JlLCByb3dNZ3IpOworICAgICAgICB9CisgICAgICAgIG1hcHBpbmcuZGVsZXRlKHNtLCBzdG9yZSwgcm93TWdyKTsKKworICAgICAgICBpZiAoc3VwICE9IG51bGwpCisgICAgICAgICAgICBkZWxldGUoc20sIHN1cCwgcm93TWdyLCBzdG9yZSwgY3VzdG9tcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjYnVmZmVyQ3VzdG9tSW5zZXJ0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGJ1ZmZlckN1c3RvbURlbGV0ZShTdHJhdGVneSBzdHJhdCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBDb2xsZWN0aW9uIGN1c3RvbXMpIHsKKyAgICAgICAgQm9vbGVhbiBjdXN0b20gPSBzdHJhdC5pc0N1c3RvbURlbGV0ZShzbSwgc3RvcmUpOworICAgICAgICBpZiAoIUJvb2xlYW4uRkFMU0UuZXF1YWxzKGN1c3RvbSkpCisgICAgICAgICAgICBjdXN0b21zLmFkZChuZXcgQ3VzdG9tTWFwcGluZyhDdXN0b21NYXBwaW5nLkRFTEVURSwgc20sIHN0cmF0KSk7CisgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKGN1c3RvbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlIG1ldGhvZCB0byB1cGRhdGUgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGRpcnR5LAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZywgUm93TWFuYWdlciByb3dNZ3IsIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgQ29sbGVjdGlvbiBjdXN0b21zKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQm9vbGVhbiBjdXN0b20gPSBtYXBwaW5nLmlzQ3VzdG9tVXBkYXRlKHNtLCBzdG9yZSk7CisgICAgICAgIGlmICghQm9vbGVhbi5GQUxTRS5lcXVhbHMoY3VzdG9tKSkKKyAgICAgICAgICAgIG1hcHBpbmcuY3VzdG9tVXBkYXRlKHNtLCBzdG9yZSk7CisgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGN1c3RvbSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gdXBkYXRlIGFsbCBmaWVsZHMgYmVmb3JlIGFsbCBtYXBwaW5ncyBzbyB0aGF0IHRoZSBtYXBwaW5ncyBjYW4KKyAgICAgICAgLy8gZGV0ZWN0IHdoZXRoZXIgYW55IGZpZWxkcyBpbiB0aGVpciByb3dzIGhhdmUgYmVlbiBtb2RpZmllZAorICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBtYXBwaW5nLmdldERlZmluZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGlydHkuZ2V0KGZpZWxkc1tpXS5nZXRJbmRleCgpKQorICAgICAgICAgICAgICAgICYmICFidWZmZXJDdXN0b21VcGRhdGUoZmllbGRzW2ldLCBzbSwgc3RvcmUsIGN1c3RvbXMpKQorICAgICAgICAgICAgICAgIGZpZWxkc1tpXS51cGRhdGUoc20sIHN0b3JlLCByb3dNZ3IpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHN1cCA9IG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGlmIChzdXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHVwZGF0ZUluZGljYXRvcnMoc20sIG1hcHBpbmcsIHJvd01nciwgc3RvcmUsIGN1c3RvbXMsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdXBkYXRlKHNtLCBkaXJ0eSwgc3VwLCByb3dNZ3IsIHN0b3JlLCBjdXN0b21zKTsKKyAgICAgICAgbWFwcGluZy51cGRhdGUoc20sIHN0b3JlLCByb3dNZ3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB2ZXJzaW9uIGFuZCBkaXNjcmltaW5hdG9yIGluZGljYXRvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUluZGljYXRvcnMoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIFJvd01hbmFnZXIgcm93TWdyLCBKREJDU3RvcmUgc3RvcmUsIENvbGxlY3Rpb24gY3VzdG9tcywKKyAgICAgICAgYm9vbGVhbiB2ZXJzaW9uVXBkYXRlT25seSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlIChtYXBwaW5nLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpICE9IG51bGwpCisgICAgICAgICAgICBtYXBwaW5nID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKworICAgICAgICBWZXJzaW9uIHZlcnMgPSBtYXBwaW5nLmdldFZlcnNpb24oKTsKKyAgICAgICAgaWYgKCFidWZmZXJDdXN0b21VcGRhdGUodmVycywgc20sIHN0b3JlLCBjdXN0b21zKSkKKyAgICAgICAgICAgIHZlcnMudXBkYXRlKHNtLCBzdG9yZSwgcm93TWdyKTsKKworICAgICAgICBpZiAodmVyc2lvblVwZGF0ZU9ubHkpIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBvbmx5IHVwZGF0aW5nIHRoZSB2ZXJzaW9uIGNvbHVtbiwgd2UgbmVlZCB0byBhZGQKKyAgICAgICAgICAgIC8vIGluIHRoZSBwcmltYXJ5IGtleSBzZWxlY3QKKyAgICAgICAgICAgIG1hcHBpbmcudXBkYXRlKHNtLCBzdG9yZSwgcm93TWdyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIGRpc2NyaW1pbmF0b3IgdG9vCisgICAgICAgICAgICBEaXNjcmltaW5hdG9yIGRzYyA9IG1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvcigpOworICAgICAgICAgICAgaWYgKCFidWZmZXJDdXN0b21VcGRhdGUoZHNjLCBzbSwgc3RvcmUsIGN1c3RvbXMpKQorICAgICAgICAgICAgICAgIGRzYy51cGRhdGUoc20sIHN0b3JlLCByb3dNZ3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjYnVmZmVyQ3VzdG9tSW5zZXJ0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGJ1ZmZlckN1c3RvbVVwZGF0ZShTdHJhdGVneSBzdHJhdCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBDb2xsZWN0aW9uIGN1c3RvbXMpIHsKKyAgICAgICAgQm9vbGVhbiBjdXN0b20gPSBzdHJhdC5pc0N1c3RvbVVwZGF0ZShzbSwgc3RvcmUpOworICAgICAgICBpZiAoIUJvb2xlYW4uRkFMU0UuZXF1YWxzKGN1c3RvbSkpCisgICAgICAgICAgICBjdXN0b21zLmFkZChuZXcgQ3VzdG9tTWFwcGluZyhDdXN0b21NYXBwaW5nLlVQREFURSwgc20sIHN0cmF0KSk7CisgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKGN1c3RvbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgY3VzdG9taXplZCBtYXBwaW5nIHVwZGF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tTWFwcGluZyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUID0gMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFID0gMzsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBfYWN0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgX3NtOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmF0ZWd5IF9zdHJhdDsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tTWFwcGluZyhpbnQgYWN0aW9uLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBTdHJhdGVneSBzdHJhdCkgeworICAgICAgICAgICAgX2FjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgIF9zbSA9IHNtOworICAgICAgICAgICAgX3N0cmF0ID0gc3RyYXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEpEQkNTdG9yZSBzdG9yZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzd2l0Y2ggKF9hY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgIF9zdHJhdC5jdXN0b21JbnNlcnQoX3NtLCBzdG9yZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICBfc3RyYXQuY3VzdG9tVXBkYXRlKF9zbSwgc3RvcmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgX3N0cmF0LmN1c3RvbURlbGV0ZShfc20sIHN0b3JlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0NsYXNzVGFibGVKREJDU2VxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9DbGFzc1RhYmxlSkRCQ1NlcS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3N2U5MzcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9DbGFzc1RhYmxlSkRCQ1NlcS5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNsYXNzQXJnUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIG9mIHRoZSB7QGxpbmsgVGFibGVKREJDU2VxfSB0aGF0IG1haW50YWlucyBhCisgKiBzZXBhcmF0ZSBzZXF1ZW5jZSBjb3VudCBwZXItY2xhc3MuIFRhYmxlIG5hbWUgZGVmYXVsdHMgdG8KKyAqIDxjb2RlPk9QRU5KUEFfU0VRVUVOQ0VTX1RBQkxFPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NUYWJsZUpEQkNTZXEgCisgICAgZXh0ZW5kcyBUYWJsZUpEQkNTZXEgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQ2xhc3NUYWJsZUpEQkNTZXEuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX3N0YXRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lnbm9yZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfYWxpYXNlcyA9IGZhbHNlOworCisgICAgcHVibGljIENsYXNzVGFibGVKREJDU2VxKCkgeworICAgICAgICBzZXRUYWJsZSgiT1BFTkpQQV9TRVFVRU5DRVNfVEFCTEUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHVubWFwcGVkIGNsYXNzZXMgc2hvdWxkIGJlIGlnbm9yZWQgYXMgcG9zc2libGUgcHJpbWFyeQorICAgICAqIGtleSB2YWx1ZXMgaW4gdGhlIHRhYmxlLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVVbm1hcHBlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZ25vcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB1bm1hcHBlZCBjbGFzc2VzIHNob3VsZCBiZSBpZ25vcmVkIGFzIHBvc3NpYmxlIHByaW1hcnkKKyAgICAgKiBrZXkgdmFsdWVzIGluIHRoZSB0YWJsZS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlVW5tYXBwZWQoYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgX2lnbm9yZSA9IGlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRJZ25vcmVVbm1hcHBlZH0uIFJldGFpbmVkIGZvcgorICAgICAqIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciBhdXRvLWNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlVmlydHVhbChib29sZWFuIGlnbm9yZSkgeworICAgICAgICBzZXRJZ25vcmVVbm1hcHBlZChpZ25vcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIHR5cGUgYWxpc2VzIGZvciBwcmltYXJ5IGtleSB2YWx1ZXMgaW4gcGxhY2Ugb2YgY2xhc3MKKyAgICAgKiBuYW1lcy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQWxpYXNlcygpIHsKKyAgICAgICAgcmV0dXJuIF9hbGlhc2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIHR5cGUgYWxpc2VzIGZvciBwcmltYXJ5IGtleSB2YWx1ZXMgaW4gcGxhY2Ugb2YgY2xhc3MKKyAgICAgKiBuYW1lcy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlQWxpYXNlcyhib29sZWFuIGFsaWFzZXMpIHsKKyAgICAgICAgX2FsaWFzZXMgPSBhbGlhc2VzOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU3RhdHVzIGdldFN0YXR1cyhDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkobWFwcGluZywgZmFsc2UpOworICAgICAgICBTdGF0dXMgc3RhdCA9IChTdGF0dXMpIF9zdGF0cy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKHN0YXQgPT0gbnVsbCkgeworICAgICAgICAgICAgc3RhdCA9IG5ldyBTdGF0dXMoKTsKKyAgICAgICAgICAgIF9zdGF0cy5wdXQoa2V5LCBzdGF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29sdW1uIGFkZFByaW1hcnlLZXlDb2x1bW4oVGFibGUgdGFibGUpIHsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICAgICAgQ29sdW1uIHBrQ29sdW1uID0gdGFibGUuYWRkQ29sdW1uKGRpY3QuZ2V0VmFsaWRDb2x1bW5OYW1lKAorICAgICAgICAgICAgZ2V0UHJpbWFyeUtleUNvbHVtbigpLCB0YWJsZSkpOworICAgICAgICBwa0NvbHVtbi5zZXRUeXBlKGRpY3QuZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5WQVJDSEFSKSk7CisgICAgICAgIHBrQ29sdW1uLnNldEphdmFUeXBlKEphdmFUeXBlcy5TVFJJTkcpOworICAgICAgICBwa0NvbHVtbi5zZXRTaXplKGRpY3QuY2hhcmFjdGVyQ29sdW1uU2l6ZSk7CisgICAgICAgIHJldHVybiBwa0NvbHVtbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFByaW1hcnlLZXkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0S2V5KG1hcHBpbmcsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEtleShDbGFzc01hcHBpbmcgbWFwcGluZywgYm9vbGVhbiBkYikgeworICAgICAgICBpZiAoX2lnbm9yZSkgeworICAgICAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpICE9IG51bGwpCisgICAgICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmcuZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2V0UENTdXBlcmNsYXNzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtYXBwaW5nID0gbWFwcGluZy5nZXRQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9hbGlhc2VzKQorICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmcuZ2V0VHlwZUFsaWFzKCk7CisgICAgICAgIHJldHVybiBtYXBwaW5nLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vCisgICAgLy8gTWFpbgorICAgIC8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkNsYXNzVGFibGVKREJDU2VxIFtvcHRpb25dKgorICAgICAqIC1hY3Rpb24vLWEgJmx0O2FkZCB8IGRyb3AgfCBnZXQgfCBzZXQmZ3Q7CisgICAgICogW2NsYXNzIG5hbWUgfCAuamF2YSBmaWxlIHwgLmNsYXNzIGZpbGUgfCAuamRvIGZpbGVdIFt2YWx1ZV0KKyAgICAgKiAgV2hlcmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSByZWNvZ25pemVkLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+LXByb3BlcnRpZXMvLXAgJmx0O3Byb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZSZndDs8L2k+OiBUaGUKKyAgICAgKiBwYXRoIG9yIHJlc291cmNlIG5hbWUgb2YgYSBPcGVuSlBBIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nCisgICAgICogaW5mb3JtYXRpb24gc3VjaCBhcyBjb25uZWN0aW9uIGRhdGEgYXMKKyAgICAgKiBvdXRsaW5lZCBpbiB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259LiBPcHRpb25hbC48L2xpPgorICAgICAqIDxsaT48aT4tJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDtwcm9wZXJ0eSB2YWx1ZSZndDs8L2k+OiBBbGwgYmVhbgorICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIE9wZW5KUEEge0BsaW5rIEpEQkNDb25maWd1cmF0aW9ufSBjYW4gYmUgc2V0IGJ5CisgICAgICogdXNpbmcgdGhlaXIJbmFtZXMgYW5kIHN1cHBseWluZyBhIHZhbHVlLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiAgVGhlIHZhcmlvdXMgYWN0aW9ucyBhcmUgYXMgZm9sbG93cy4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPmFkZDwvaT46IENyZWF0ZSB0aGUgc2VxdWVuY2UgdGFibGUuPC9saT4KKyAgICAgKiA8bGk+PGk+ZHJvcDwvaT46IERyb3AgdGhlIHNlcXVlbmNlIHRhYmxlLjwvbGk+CisgICAgICogPGxpPjxpPmdldDwvaT46IFByaW50IHRoZSBjdXJyZW50IHNlcXVlbmNlIHZhbHVlIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBjbGFzcy48L2xpPgorICAgICAqIDxsaT48aT5zZXQ8L2k+OiBTZXQgdGhlIHNlcXVlbmNlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY2xhc3MuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBhcmdzID0gb3B0cy5zZXRGcm9tQ21kTGluZShhcmdzKTsKKyAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBKREJDQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghcnVuKGNvbmYsIGFyZ3MsIG9wdHMpKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihfbG9jLmdldCgiY2xzdGFibGUtc2VxLXVzYWdlIikpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29uZi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0b29sLiBSZXR1cm5zIGZhbHNlIGlmIGludmFsaWQgb3B0aW9ucyB3ZXJlIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgT3B0aW9ucyBvcHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9wdHMuY29udGFpbnNLZXkoImhlbHAiKSB8fCBvcHRzLmNvbnRhaW5zS2V5KCItaGVscCIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJhY3Rpb24iLCAiYSIsIG51bGwpOworICAgICAgICBDb25maWd1cmF0aW9ucy5wb3B1bGF0ZUNvbmZpZ3VyYXRpb24oY29uZiwgb3B0cyk7CisgICAgICAgIHJldHVybiBydW4oY29uZiwgYXJncywgYWN0aW9uLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRvb2wuIFJldHVybiBmYWxzZSBpZiBhbiBpbnZhbGlkIG9wdGlvbiB3YXMgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihKREJDQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBTdHJpbmcgYWN0aW9uLCBNYXBwaW5nUmVwb3NpdG9yeSByZXBvcywgQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NUYWJsZUpEQkNTZXEgc2VxID0gbmV3IENsYXNzVGFibGVKREJDU2VxKCk7CisgICAgICAgIFN0cmluZyBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoY29uZi5nZXRTZXF1ZW5jZSgpKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2Uoc2VxLCBjb25mLCBwcm9wcyk7CisKKyAgICAgICAgaWYgKEFDVElPTl9EUk9QLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBzZXEuZHJvcFRhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX0FERC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgc2VxLnJlZnJlc2hUYWJsZSgpOworICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9HRVQuZXF1YWxzKGFjdGlvbikgfHwgQUNUSU9OX1NFVC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgbG9hZGVyID0gY29uZi5nZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS5nZXRDbGFzc0xvYWRlcigKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUYWJsZUpEQkNTZXEuY2xhc3MsIG51bGwpOworCisgICAgICAgICAgICBDbGFzc0FyZ1BhcnNlciBjYXAgPSBjb25mLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAuZ2V0TWV0YURhdGFGYWN0b3J5KCkubmV3Q2xhc3NBcmdQYXJzZXIoKTsKKyAgICAgICAgICAgIGNhcC5zZXRDbGFzc0xvYWRlcihsb2FkZXIpOworICAgICAgICAgICAgQ2xhc3MgY2xzID0gY2FwLnBhcnNlVHlwZXMoYXJnc1swXSlbMF07CisKKyAgICAgICAgICAgIGlmIChyZXBvcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlcG9zID0gY29uZi5nZXRNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZyA9IHJlcG9zLmdldE1hcHBpbmcoY2xzLCBudWxsLCB0cnVlKTsKKworICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gY29uZi5nZXREYXRhU291cmNlMihudWxsKS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgY3VyID0gc2VxLmdldFNlcXVlbmNlKG1hcHBpbmcsIGNvbm4pOworICAgICAgICAgICAgICAgIGlmIChBQ1RJT05fR0VULmVxdWFscyhhY3Rpb24pKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWFwcGluZyArICI6ICIgKyBjdXIpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb25nIHNldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IExvbmcucGFyc2VMb25nKGFyZ3NbMV0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSBjdXIgKyBzZXEuZ2V0QWxsb2NhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldCA8IGN1cikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgc3RhdCA9IHNlcS5nZXRTdGF0dXMobWFwcGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXEuc2V0U2VxdWVuY2UobnVsbCwgc3RhdCwgKGludCkgKHNldCAtIGN1ciksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSBzdGF0LnNlcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obWFwcGluZyArICI6ICIgKyBzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9Db25uZWN0aW9uSW5mby5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvQ29ubmVjdGlvbkluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJjZTMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvQ29ubmVjdGlvbkluZm8uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworCisvKioKKyAqIFN0cnVjdCB0byBob2xkIGRhdGEgYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkluZm8geworCisgICAgcHVibGljIFJlc3VsdCByZXN1bHQgPSBudWxsOworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gbnVsbDsKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSBudWxsOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvQ29uc3RyYWludFVwZGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0NvbnN0cmFpbnRVcGRhdGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzODVhOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0NvbnN0cmFpbnRVcGRhdGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MTkgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7DQorDQoraW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247DQoraW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlByaW1hcnlSb3c7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dJbXBsOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93TWFuYWdlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXJJbXBsOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmdyYXBoLkRlcHRoRmlyc3RBbmFseXNpczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5ncmFwaC5FZGdlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmdyYXBoLkdyYXBoOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsNCisNCisvKioNCisgKiA8cD5TdGFuZGFyZCB1cGRhdGUgbWFuYWdlciwgY2FwYWJsZSBvZiBmb3JlaWduIGtleSBjb25zdHJhaW50IGV2YWx1YXRpb24uPC9wPg0KKyAqDQorICogQHNpbmNlIDEuMC4wDQorICovDQorcHVibGljIGNsYXNzIENvbnN0cmFpbnRVcGRhdGVNYW5hZ2VyDQorICAgIGV4dGVuZHMgQWJzdHJhY3RVcGRhdGVNYW5hZ2VyIHsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQ0KKyAgICAgICAgKENvbnN0cmFpbnRVcGRhdGVNYW5hZ2VyLmNsYXNzKTsNCisNCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJEaXJ0eSgpIHsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VyIG5ld1ByZXBhcmVkU3RhdGVtZW50TWFuYWdlcg0KKyAgICAgICAgKEpEQkNTdG9yZSBzdG9yZSwgQ29ubmVjdGlvbiBjb25uKSB7DQorICAgICAgICByZXR1cm4gbmV3IFByZXBhcmVkU3RhdGVtZW50TWFuYWdlckltcGwoc3RvcmUsIGNvbm4pOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBSb3dNYW5hZ2VyIG5ld1Jvd01hbmFnZXIoKSB7DQorICAgICAgICByZXR1cm4gbmV3IFJvd01hbmFnZXJJbXBsKGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBmbHVzaChSb3dNYW5hZ2VyIHJvd01nciwNCisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50TWFuYWdlciBwc01nciwgQ29sbGVjdGlvbiBleGNlcHMpIHsNCisgICAgICAgIFJvd01hbmFnZXJJbXBsIHJtaW1wbCA9IChSb3dNYW5hZ2VySW1wbCkgcm93TWdyOw0KKw0KKyAgICAgICAgLy8gZmlyc3QgdGFrZSBjYXJlIG9mIGFsbCBzZWNvbmRhcnkgdGFibGUgZGVsZXRlcyBhbmQgJ2FsbCByb3cnIGRlbGV0ZXMNCisgICAgICAgIC8vICh3aGljaCBhcmUgcHJvYmFibHkgc2Vjb25kYXJ5IHRhYmxlIGRlbGV0ZXMpLCBzaW5jZSBubyBmb3JlaWduDQorICAgICAgICAvLyBrZXlzIGV2ZXIgcmVseSBvbiBzZWNvbmRhcnkgdGFibGUgcGtzDQorICAgICAgICBmbHVzaChybWltcGwuZ2V0QWxsUm93RGVsZXRlcygpLCBwc01ncik7DQorICAgICAgICBmbHVzaChybWltcGwuZ2V0U2Vjb25kYXJ5RGVsZXRlcygpLCBwc01ncik7DQorDQorICAgICAgICAvLyBub3cgZG8gYW55ICdhbGwgcm93JyB1cGRhdGVzDQorICAgICAgICBmbHVzaChybWltcGwuZ2V0QWxsUm93VXBkYXRlcygpLCBwc01ncik7DQorDQorICAgICAgICAvLyBhbmFseXplIGZvcmVpZ24ga2V5cw0KKyAgICAgICAgQ29sbGVjdGlvbiBpbnNlcnRzID0gcm1pbXBsLmdldEluc2VydHMoKTsNCisgICAgICAgIENvbGxlY3Rpb24gdXBkYXRlcyA9IHJtaW1wbC5nZXRVcGRhdGVzKCk7DQorICAgICAgICBDb2xsZWN0aW9uIGRlbGV0ZXMgPSBybWltcGwuZ2V0RGVsZXRlcygpOw0KKyAgICAgICAgR3JhcGhbXSBncmFwaHMgPSBuZXcgR3JhcGhbMl07ICAgIC8vIGluc2VydCBncmFwaCwgZGVsZXRlIGdyYXBoDQorICAgICAgICBhbmFseXplRm9yZWlnbktleXMoaW5zZXJ0cywgdXBkYXRlcywgZGVsZXRlcywgcm1pbXBsLCBncmFwaHMpOw0KKw0KKyAgICAgICAgLy8gZmx1c2ggaW5zZXJ0IGdyYXBoLCBpZiBhbnkNCisgICAgICAgIGJvb2xlYW4gYXV0b0Fzc2lnbiA9IHJtaW1wbC5oYXNBdXRvQXNzaWduQ29uc3RyYWludHMoKTsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZmx1c2hHcmFwaChncmFwaHNbMF0sIHBzTWdyLCBhdXRvQXNzaWduKTsNCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgew0KKyAgICAgICAgICAgIGV4Y2VwcyA9IGFkZEV4Y2VwdGlvbihleGNlcHMsIFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIGRpY3QpKTsNCisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsNCisgICAgICAgICAgICBleGNlcHMgPSBhZGRFeGNlcHRpb24oZXhjZXBzLCBrZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBmbHVzaCB0aGUgcmVzdCBvZiB0aGUgaW5zZXJ0cyBhbmQgdXBkYXRlczsgaW5zZXJ0cyBiZWZvcmUgdXBkYXRlcw0KKyAgICAgICAgLy8gYmVjYXVzZSBzb21lIHVwZGF0ZSBma3MgbWlnaHQgcmVmZXJlbmNlIHBrcyB0aGF0IGhhdmUgdG8gYmUgaW5zZXJ0ZWQNCisgICAgICAgIGZsdXNoKGluc2VydHMsIHBzTWdyKTsNCisgICAgICAgIGZsdXNoKHVwZGF0ZXMsIHBzTWdyKTsNCisNCisgICAgICAgIC8vIGZsdXNoIHRoZSBkZWxldGUgZ3JhcGgsIGlmIGFueQ0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBmbHVzaEdyYXBoKGdyYXBoc1sxXSwgcHNNZ3IsIGF1dG9Bc3NpZ24pOw0KKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7DQorICAgICAgICAgICAgZXhjZXBzID0gYWRkRXhjZXB0aW9uKGV4Y2VwcywgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgZGljdCkpOw0KKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgew0KKyAgICAgICAgICAgIGV4Y2VwcyA9IGFkZEV4Y2VwdGlvbihleGNlcHMsIGtlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIHB1dCB0aGUgcmVtYWluZGVyIG9mIHRoZSBkZWxldGVzIGFmdGVyIHVwZGF0ZXMgYmVjYXVzZSBzb21lIHVwZGF0ZXMNCisgICAgICAgIC8vIG1heSBiZSBudWxsaW5nIGZrcyB0byByb3dzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWQNCisgICAgICAgIGZsdXNoKGRlbGV0ZXMsIHBzTWdyKTsNCisNCisgICAgICAgIC8vIHRha2UgY2FyZSBvZiBhbGwgc2Vjb25kYXJ5IHRhYmxlIGluc2VydHMgYW5kIHVwZGF0ZXMgbGFzdCwgc2luY2UNCisgICAgICAgIC8vIHRoZXkgbWF5IHJlbHkgb24gcHJldmlvdXMgaW5zZXJ0cyBvciB1cGRhdGVzLCBidXQgbm90aGluZyByZWxpZXMNCisgICAgICAgIC8vIG9uIHRoZW0NCisgICAgICAgIGZsdXNoKHJtaW1wbC5nZXRTZWNvbmRhcnlVcGRhdGVzKCksIHBzTWdyKTsNCisNCisgICAgICAgIC8vIGZsdXNoIGFueSBsZWZ0IG92ZXIgcHJlcGFyZWQgc3RhdGVtZW50cw0KKyAgICAgICAgcHNNZ3IuZmx1c2goKTsNCisgICAgICAgIHJldHVybiBleGNlcHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFuYWx5emUgZm9yZWlnbiBrZXkgZGVwZW5kZW5jaWVzIG9uIHRoZSBnaXZlbiByb3dzDQorICAgICAqIGFuZCBjcmVhdGUgYW4gaW5zZXJ0IGFuZCBhIGRlbGV0ZSBncmFwaCB0byBleGVjdXRlLiAgVGhlIGluc2VydA0KKyAgICAgKiBncmFwaCB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIGFsbCBvdGhlciByb3dzLCBhbmQgdGhlIGRlbGV0ZSBncmFwaCB3aWxsDQorICAgICAqIGJlIGZsdXNoZWQgYWZ0ZXIgdGhlbS4NCisgICAgICovDQorICAgIHByaXZhdGUgdm9pZCBhbmFseXplRm9yZWlnbktleXMoQ29sbGVjdGlvbiBpbnNlcnRzLCBDb2xsZWN0aW9uIHVwZGF0ZXMsDQorICAgICAgICBDb2xsZWN0aW9uIGRlbGV0ZXMsIFJvd01hbmFnZXJJbXBsIHJvd01nciwgR3JhcGhbXSBncmFwaHMpIHsNCisgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgZGVsZXRlcywgd2UgaGF2ZSB0byBtYXAgdGhlIGluc2VydCBvYmplY3RzIG9uIHRoZWlyDQorICAgICAgICAvLyBvaWRzIHNvIHdlJ2xsIGJlIGFibGUgdG8gZGV0ZWN0IGRlbGV0ZS10aGVuLWluc2VydC1zYW1lLXBrIGNhc2VzDQorICAgICAgICBNYXAgaW5zZXJ0TWFwID0gbnVsbDsNCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc207DQorICAgICAgICBpZiAoIWRlbGV0ZXMuaXNFbXB0eSgpICYmICFpbnNlcnRzLmlzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGluc2VydE1hcCA9IG5ldyBIYXNoTWFwKChpbnQpIChpbnNlcnRzLnNpemUoKSAqIDEuMzMgKyAxKSk7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBpbnNlcnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIHNtID0gKChSb3cpIGl0ci5uZXh0KCkpLmdldFByaW1hcnlLZXkoKTsNCisgICAgICAgICAgICAgICAgaWYgKHNtICE9IG51bGwgJiYgc20uZ2V0T2JqZWN0SWQoKSAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0TWFwLnB1dChzbS5nZXRPYmplY3RJZCgpLCBzbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gZmlyc3QgY29uc3RydWN0IHRoZSBncmFwaCBmb3IgZGVsZXRlczsgdGhpcyBtYXkgZXhwYW5kIHRvIGluY2x1ZGUNCisgICAgICAgIC8vIGluc2VydHMgYW5kIHVwZGF0ZXMgYXMgd2VsbCBpZiB0aGVyZSBhcmUgYW55IGluc2VydHMgdGhhdCByZWx5IG9uDQorICAgICAgICAvLyBkZWxldGVzIChkZWxldGUtdGhlbi1pbnNlcnQtc2FtZS1wayBjYXNlcykNCisgICAgICAgIFByaW1hcnlSb3cgcm93Ow0KKyAgICAgICAgUm93IHJvdzI7DQorICAgICAgICBGb3JlaWduS2V5W10gZmtzOw0KKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBma1ZhbDsNCisgICAgICAgIGJvb2xlYW4gaWdub3JlVXBkYXRlcyA9IHRydWU7DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGRlbGV0ZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICByb3cgPSAoUHJpbWFyeVJvdykgaXRyLm5leHQoKTsNCisgICAgICAgICAgICBpZiAoIXJvdy5pc1ZhbGlkKCkpDQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgIHJvdzIgPSBnZXRJbnNlcnRSb3coaW5zZXJ0TWFwLCByb3dNZ3IsIHJvdyk7DQorICAgICAgICAgICAgaWYgKHJvdzIgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBpZ25vcmVVcGRhdGVzID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIGdyYXBoc1sxXSA9IGFkZEVkZ2UoZ3JhcGhzWzFdLCByb3csIChQcmltYXJ5Um93KSByb3cyLCBudWxsKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gbm93IGNoZWNrIHRoaXMgcm93J3MgZmtzIGFnYWluc3Qgb3RoZXIgZGVsZXRlcw0KKyAgICAgICAgICAgIGZrcyA9IHJvdy5nZXRUYWJsZSgpLmdldEZvcmVpZ25LZXlzKCk7DQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBma3MubGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAgICAgLy8gd2hlbiBkZWxldGluZyByZWYgZmtzIHRoZXknbGwganVzdCBzZXQgYSB3aGVyZSB2YWx1ZSwgc28NCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgYm90aCBmb3IgZmsgdXBkYXRlcyAocmVsYXRpb24gZmtzKSBhbmQgd2hlcmVzIChyZWYgZmtzKQ0KKyAgICAgICAgICAgICAgICBma1ZhbCA9IHJvdy5nZXRGb3JlaWduS2V5U2V0KGZrc1tqXSk7DQorICAgICAgICAgICAgICAgIGlmIChma1ZhbCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgZmtWYWwgPSByb3cuZ2V0Rm9yZWlnbktleVdoZXJlKGZrc1tqXSk7DQorICAgICAgICAgICAgICAgIGlmIChma1ZhbCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgICAgICAgIHJvdzIgPSByb3dNZ3IuZ2V0Um93KGZrc1tqXS5nZXRQcmltYXJ5S2V5VGFibGUoKSwNCisgICAgICAgICAgICAgICAgICAgIFJvdy5BQ1RJT05fREVMRVRFLCBma1ZhbCwgZmFsc2UpOw0KKyAgICAgICAgICAgICAgICBpZiAocm93MiAhPSBudWxsICYmIHJvdzIuaXNWYWxpZCgpICYmIHJvdzIgIT0gcm93KQ0KKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhzWzFdID0gYWRkRWRnZShncmFwaHNbMV0sIHJvdywgKFByaW1hcnlSb3cpIHJvdzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgZmtzW2pdKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoaWdub3JlVXBkYXRlcykNCisgICAgICAgICAgICBncmFwaHNbMF0gPSBhbmFseXplQWdhaW5zdEluc2VydHMoaW5zZXJ0cywgcm93TWdyLCBncmFwaHNbMF0pOw0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgLy8gcHV0IGluc2VydHMgKmFuZCB1cGRhdGVzKiBpbiB0aGUgZGVsZXRlIGdyYXBoOyB0aGV5IGFsbCByZWx5DQorICAgICAgICAgICAgLy8gb24gZWFjaCBvdGhlcg0KKyAgICAgICAgICAgIGdyYXBoc1sxXSA9IGFuYWx5emVBZ2FpbnN0SW5zZXJ0cyh1cGRhdGVzLCByb3dNZ3IsIGdyYXBoc1sxXSk7DQorICAgICAgICAgICAgZ3JhcGhzWzFdID0gYW5hbHl6ZUFnYWluc3RJbnNlcnRzKGluc2VydHMsIHJvd01nciwgZ3JhcGhzWzFdKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIGluc2VydCBmb3IgZm9yIHRoZSBzYW1lIHRhYmxlIGFuZCBwcmltYXJ5DQorICAgICAqIGtleSB2YWx1ZXMgYXMgdGhlIGdpdmVuIGRlbGV0ZSByb3cuDQorICAgICAqLw0KKyAgICBwcml2YXRlIFJvdyBnZXRJbnNlcnRSb3coTWFwIGluc2VydE1hcCwgUm93TWFuYWdlckltcGwgcm93TWdyLCBSb3cgcm93KSB7DQorICAgICAgICBpZiAoaW5zZXJ0TWFwID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorDQorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gcm93LmdldFByaW1hcnlLZXkoKTsNCisgICAgICAgIGlmIChzbSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKw0KKyAgICAgICAgLy8gbG9vayBmb3IgYSBuZXcgb2JqZWN0IHdob3NlIGluc2VydCBpZCBpcyB0aGUgc2FtZSBhcyB0aGlzIGRlbGV0ZSBvbmUNCisgICAgICAgIE9iamVjdCBvaWQgPSBzbS5nZXRPYmplY3RJZCgpOw0KKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBuc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgaW5zZXJ0TWFwLmdldChvaWQpOw0KKyAgICAgICAgaWYgKG5zbSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKw0KKyAgICAgICAgLy8gZm91bmQgbmV3IG9iamVjdDsgZ2V0IGl0cyByb3cNCisgICAgICAgIHJvdyA9IHJvd01nci5nZXRSb3cocm93LmdldFRhYmxlKCksIFJvdy5BQ1RJT05fSU5TRVJULCBuc20sIGZhbHNlKTsNCisgICAgICAgIHJldHVybiAocm93ID09IG51bGwgfHwgcm93LmlzVmFsaWQoKSkgPyByb3cgOiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBbmFseXplIHRoZSBnaXZlbiByb3dzIGFnYWluc3QgdGhlIGluc2VydHMsIHBsYWNpbmcgZGVwZW5kZW5jaWVzDQorICAgICAqIGluIHRoZSBnaXZlbiBncmFwaC4NCisgICAgICovDQorICAgIHByaXZhdGUgR3JhcGggYW5hbHl6ZUFnYWluc3RJbnNlcnRzKENvbGxlY3Rpb24gcm93cywgUm93TWFuYWdlckltcGwgcm93TWdyLA0KKyAgICAgICAgR3JhcGggZ3JhcGgpIHsNCisgICAgICAgIFByaW1hcnlSb3cgcm93Ow0KKyAgICAgICAgUm93IHJvdzI7DQorICAgICAgICBGb3JlaWduS2V5W10gZmtzOw0KKyAgICAgICAgQ29sdW1uW10gY29sczsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcm93cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIHJvdyA9IChQcmltYXJ5Um93KSBpdHIubmV4dCgpOw0KKyAgICAgICAgICAgIGlmICghcm93LmlzVmFsaWQoKSkNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgICAgLy8gY2hlY2sgdGhpcyByb3cncyBma3MgYWdhaW5zdCBpbnNlcnRzOyBhIGxvZ2ljYWwgZmsgdG8gYW4gYXV0by1pbmMNCisgICAgICAgICAgICAvLyBjb2x1bW4gaXMgdHJlYXRlZCBqdXN0IGFzIGFjdHVhbCBkYXRhYmFzZSBmayBiZWNhdXNlIHRoZSByZXN1bHQNCisgICAgICAgICAgICAvLyBpcyB0aGUgc2FtZTogdGhlIHBrIHJvdyBoYXMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBmayByb3cNCisgICAgICAgICAgICBma3MgPSByb3cuZ2V0VGFibGUoKS5nZXRGb3JlaWduS2V5cygpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmtzLmxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICAgIGlmIChyb3cuZ2V0Rm9yZWlnbktleVNldChma3Nbal0pID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgcm93IGlzIGRlcGVuZGVudCBvbiBhbm90aGVyLiAgaWYgaXQncyBvbmx5DQorICAgICAgICAgICAgICAgIC8vIGRlcGVuZW50IG9uIGl0c2VsZiwgc2VlIGlmIHRoZSBmayBpcyBsb2dpY2FsIG9yIGRlZmVycmVkLCBpbg0KKyAgICAgICAgICAgICAgICAvLyB3aGljaCBjYXNlIGl0IG11c3QgYmUgYW4gYXV0by1pbmMgYmVjYXVzZSBvdGhlcndpc2Ugd2UNCisgICAgICAgICAgICAgICAgLy8gd291bGRuJ3QgaGF2ZSByZWNvcmRlZCBpdA0KKyAgICAgICAgICAgICAgICByb3cyID0gcm93TWdyLmdldFJvdyhma3Nbal0uZ2V0UHJpbWFyeUtleVRhYmxlKCksDQorICAgICAgICAgICAgICAgICAgICBSb3cuQUNUSU9OX0lOU0VSVCwgcm93LmdldEZvcmVpZ25LZXlTZXQoZmtzW2pdKSwgZmFsc2UpOw0KKyAgICAgICAgICAgICAgICBpZiAocm93MiAhPSBudWxsICYmIHJvdzIuaXNWYWxpZCgpICYmIChyb3cyICE9IHJvdw0KKyAgICAgICAgICAgICAgICAgICAgfHwgZmtzW2pdLmlzRGVmZXJyZWQoKSB8fCBma3Nbal0uaXNMb2dpY2FsKCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgZ3JhcGggPSBhZGRFZGdlKGdyYXBoLCAoUHJpbWFyeVJvdykgcm93Miwgcm93LCBma3Nbal0pOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBzZWUgaWYgdGhlcmUgYXJlIGFueSByZWxhdGlvbiBpZCBjb2x1bW5zIGRlcGVuZGVudCBvbg0KKyAgICAgICAgICAgIC8vIGF1dG8taW5jIG9iamVjdHMNCisgICAgICAgICAgICBjb2xzID0gcm93LmdldFRhYmxlKCkuZ2V0UmVsYXRpb25JZENvbHVtbnMoKTsNCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHMubGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IHJvdy5nZXRSZWxhdGlvbklkU2V0KGNvbHNbal0pOw0KKyAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgICAgICByb3cyID0gcm93TWdyLmdldFJvdyhnZXRCYXNlVGFibGUoc20pLCBSb3cuQUNUSU9OX0lOU0VSVCwNCisgICAgICAgICAgICAgICAgICAgIHNtLCBmYWxzZSk7DQorICAgICAgICAgICAgICAgIGlmIChyb3cyICE9IG51bGwgJiYgcm93Mi5pc1ZhbGlkKCkpDQorICAgICAgICAgICAgICAgICAgICBncmFwaCA9IGFkZEVkZ2UoZ3JhcGgsIChQcmltYXJ5Um93KSByb3cyLCByb3csIGNvbHNbal0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBncmFwaDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSBiYXNlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBUYWJsZSBnZXRCYXNlVGFibGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgew0KKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChDbGFzc01hcHBpbmcpIHNtLmdldE1ldGFEYXRhKCk7DQorICAgICAgICB3aGlsZSAoY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpICE9IG51bGwpDQorICAgICAgICAgICAgY2xzID0gY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOw0KKyAgICAgICAgcmV0dXJuIGNscy5nZXRUYWJsZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBnaXZlbiByb3dzIGluIHRoZSBnaXZlbiBmb3JlaWduIGtleSBncmFwaC4NCisgICAgICovDQorICAgIHByaXZhdGUgR3JhcGggYWRkRWRnZShHcmFwaCBncmFwaCwgUHJpbWFyeVJvdyByb3cxLCBQcmltYXJ5Um93IHJvdzIsDQorICAgICAgICBPYmplY3QgZmspIHsNCisgICAgICAgIC8vIGRlbGF5IGNyZWF0aW9uIG9mIHRoZSBncmFwaA0KKyAgICAgICAgaWYgKGdyYXBoID09IG51bGwpDQorICAgICAgICAgICAgZ3JhcGggPSBuZXcgR3JhcGgoKTsNCisNCisgICAgICAgIHJvdzEuc2V0RGVwZW5kZW50KHRydWUpOw0KKyAgICAgICAgcm93Mi5zZXREZXBlbmRlbnQodHJ1ZSk7DQorICAgICAgICBncmFwaC5hZGROb2RlKHJvdzEpOw0KKyAgICAgICAgZ3JhcGguYWRkTm9kZShyb3cyKTsNCisNCisgICAgICAgIC8vIGFkZCBhbiBlZGdlIGZyb20gcm93MSB0byByb3cyLCBhbmQgc2V0IHRoZSBmayBjYXVzaW5nIHRoZQ0KKyAgICAgICAgLy8gZGVwZW5kZW5jeSBhcyB0aGUgdXNlciBvYmplY3Qgc28gd2UgY2FuIHJldHJpZXZlIGl0IHdoZW4gcmVzb2x2aW5nDQorICAgICAgICAvLyBjaXJjdWxhciBjb25zdHJhaW50cw0KKyAgICAgICAgRWRnZSBlZGdlID0gbmV3IEVkZ2Uocm93MSwgcm93MiwgdHJ1ZSk7DQorICAgICAgICBlZGdlLnNldFVzZXJPYmplY3QoZmspOw0KKyAgICAgICAgZ3JhcGguYWRkRWRnZShlZGdlKTsNCisNCisgICAgICAgIHJldHVybiBncmFwaDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRmx1c2ggdGhlIGdpdmVuIGdyYXBoIG9mIHJvd3MgaW4gdGhlIHByb3BlciBvcmRlci4NCisgICAgICogQHBhcmFtIGdyYXBoIFRoZSBncmFwaCBvZiBzdGF0ZW1lbnRzIHRvIGJlIHdhbGtlZA0KKyAgICAgKiBAcGFyYW0gcHNNZ3IgVGhlIHByZXBhcmVkIHN0YXRlbWVudCBtYW5hZ2VyIHRvIHVzZSB0byBpc3N1ZSB0aGUNCisgICAgICogc3RhdGVtZW50cw0KKyAgICAgKiBAcGFyYW0gYXV0b0Fzc2lnbiBXaGV0aGVyIGFueSBvZiB0aGUgcm93cyBpbiB0aGUgZ3JhcGggaGF2ZSBhbnkNCisgICAgICogYXV0by1hc3NpZ24gY29uc3RyYWludHMNCisgICAgICovDQorICAgIHByb3RlY3RlZCB2b2lkIGZsdXNoR3JhcGgoR3JhcGggZ3JhcGgsIFByZXBhcmVkU3RhdGVtZW50TWFuYWdlciBwc01nciwNCisgICAgICAgIGJvb2xlYW4gYXV0b0Fzc2lnbikNCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKGdyYXBoID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgRGVwdGhGaXJzdEFuYWx5c2lzIGRmYSA9IG5ld0RlcHRoRmlyc3RBbmFseXNpcyhncmFwaCwgYXV0b0Fzc2lnbik7DQorICAgICAgICBDb2xsZWN0aW9uIG5vZGVzID0gZGZhLmdldFNvcnRlZE5vZGVzKCk7DQorICAgICAgICBDb2xsZWN0aW9uIGJhY2tzID0gZGZhLmdldEVkZ2VzKEVkZ2UuVFlQRV9CQUNLKTsNCisNCisgICAgICAgIC8vIGhhbmRsZSBjaXJjdWxhciBjb25zdHJhaW50czoNCisgICAgICAgIC8vIC0gaWYgZGVsZXRlZCByb3cgQSBoYXMgYSBjaXJpY3VsYXIgZmsgdG8gZGVsZXRlZCByb3cgQiwgdGhlbiB1c2UgYW4NCisgICAgICAgIC8vICAgdXBkYXRlIHN0YXRlbWVudCB0byBudWxsIEEncyBmayB0byBCDQorICAgICAgICAvLyAtIGlmIGluc2VydGVkIHJvdyBBIGhhcyBhIGNpcmN1bGFyIGZrIHRvIHVwZGF0ZWQvaW5zZXJ0ZWQgcm93IEIsDQorICAgICAgICAvLyAgIHRoZW4gbnVsbCB0aGUgZmsgaW4gdGhlIEIgcm93IG9iamVjdCwgYW5kIGFmdGVyIGZsdXNoaW5nLCB1c2UNCisgICAgICAgIC8vICAgYW4gdXBkYXRlIHRvIHNldCB0aGUgZmsgdG8gYmFjayB0byBBDQorICAgICAgICBDb2xsZWN0aW9uIGluc2VydFVwZGF0ZXMgPSBudWxsOw0KKyAgICAgICAgQ29sbGVjdGlvbiBkZWxldGVVcGRhdGVzID0gbnVsbDsNCisgICAgICAgIFByaW1hcnlSb3cgcm93Ow0KKyAgICAgICAgUm93SW1wbCB1cGRhdGU7DQorICAgICAgICBFZGdlIGVkZ2U7DQorICAgICAgICBGb3JlaWduS2V5IGZrOw0KKyAgICAgICAgQ29sdW1uIGNvbDsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYmFja3MuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBlZGdlID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICAgICAgaWYgKGVkZ2UuZ2V0VXNlck9iamVjdCgpID09IG51bGwpDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihfbG9jLmdldCgiZGVsLWlucy1jeWNsZSIpKTsNCisNCisgICAgICAgICAgICAvLyB1c2UgYSBwcmltYXJ5IHJvdyB1cGRhdGUgdG8gcHJldmVudCBzZXR0aW5nIHBrIGFuZCBmayB2YWx1ZXMNCisgICAgICAgICAgICAvLyB1bnRpbCBhZnRlciBmbHVzaCwgdG8gZ2V0IGxhdGVzdCBhdXRvLWluY3JlbWVudCB2YWx1ZXMNCisgICAgICAgICAgICByb3cgPSAoUHJpbWFyeVJvdykgZWRnZS5nZXRUbygpOw0KKyAgICAgICAgICAgIGlmIChyb3cuZ2V0QWN0aW9uKCkgPT0gUm93LkFDVElPTl9ERUxFVEUpIHsNCisgICAgICAgICAgICAgICAgLy8gY29weSB3aGVyZSBjb25kaXRpb25zIGludG8gbmV3IHVwZGF0ZSB0aGF0IG51bGxzIHRoZSBmaw0KKyAgICAgICAgICAgICAgICByb3cgPSAoUHJpbWFyeVJvdykgZWRnZS5nZXRGcm9tKCk7DQorICAgICAgICAgICAgICAgIHVwZGF0ZSA9IG5ldyBQcmltYXJ5Um93KHJvdy5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX1VQREFURSxudWxsKTsNCisgICAgICAgICAgICAgICAgcm93LmNvcHlJbnRvKHVwZGF0ZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChlZGdlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIEZvcmVpZ25LZXkpIHsNCisgICAgICAgICAgICAgICAgICAgIGZrID0gKEZvcmVpZ25LZXkpIGVkZ2UuZ2V0VXNlck9iamVjdCgpOw0KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnNldEZvcmVpZ25LZXkoZmssIHJvdy5nZXRGb3JlaWduS2V5SU8oZmspLCBudWxsKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlDQorICAgICAgICAgICAgICAgICAgICB1cGRhdGUuc2V0TnVsbCgoQ29sdW1uKSBlZGdlLmdldFVzZXJPYmplY3QoKSk7DQorDQorICAgICAgICAgICAgICAgIGlmIChkZWxldGVVcGRhdGVzID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICBkZWxldGVVcGRhdGVzID0gbmV3IExpbmtlZExpc3QoKTsNCisgICAgICAgICAgICAgICAgZGVsZXRlVXBkYXRlcy5hZGQodXBkYXRlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAvLyBjb3B5IHdoZXJlIGNvbmRpdGlvbnMgaW50byBuZXcgdXBkYXRlIHRoYXQgc2V0cyB0aGUgZmsNCisgICAgICAgICAgICAgICAgdXBkYXRlID0gbmV3IFByaW1hcnlSb3cocm93LmdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFLG51bGwpOw0KKyAgICAgICAgICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAocm93LmdldFByaW1hcnlLZXkoKSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihfbG9jLmdldCgicmVmLWN5Y2xlIikpOw0KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlLndoZXJlUHJpbWFyeUtleShyb3cuZ2V0UHJpbWFyeUtleSgpKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlDQorICAgICAgICAgICAgICAgICAgICByb3cuY29weUludG8odXBkYXRlLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgaWYgKGVkZ2UuZ2V0VXNlck9iamVjdCgpIGluc3RhbmNlb2YgRm9yZWlnbktleSkgew0KKyAgICAgICAgICAgICAgICAgICAgZmsgPSAoRm9yZWlnbktleSkgZWRnZS5nZXRVc2VyT2JqZWN0KCk7DQorICAgICAgICAgICAgICAgICAgICB1cGRhdGUuc2V0Rm9yZWlnbktleShmaywgcm93LmdldEZvcmVpZ25LZXlJTyhmayksDQorICAgICAgICAgICAgICAgICAgICAgICAgcm93LmdldEZvcmVpZ25LZXlTZXQoZmspKTsNCisgICAgICAgICAgICAgICAgICAgIHJvdy5jbGVhckZvcmVpZ25LZXkoZmspOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY29sID0gKENvbHVtbikgZWRnZS5nZXRVc2VyT2JqZWN0KCk7DQorICAgICAgICAgICAgICAgICAgICB1cGRhdGUuc2V0UmVsYXRpb25JZChjb2wsIHJvdy5nZXRSZWxhdGlvbklkU2V0KGNvbCksDQorICAgICAgICAgICAgICAgICAgICAgICAgcm93LmdldFJlbGF0aW9uSWRDYWxsYmFjayhjb2wpKTsNCisgICAgICAgICAgICAgICAgICAgIHJvdy5jbGVhclJlbGF0aW9uSWQoY29sKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0VXBkYXRlcyA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VXBkYXRlcyA9IG5ldyBMaW5rZWRMaXN0KCk7DQorICAgICAgICAgICAgICAgIGluc2VydFVwZGF0ZXMuYWRkKHVwZGF0ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gZmx1c2ggZGVsZXRlIHVwZGF0ZXMgdG8gbnVsbCBma3MsIHRoZW4gYWxsIHJvd3MgaW4gb3JkZXIsIHRoZW4NCisgICAgICAgIC8vIHRoZSBpbnNlcnQgdXBkYXRlcyB0byBzZXQgY2lyY3VsYXIgZmsgdmFsdWVzDQorICAgICAgICBpZiAoZGVsZXRlVXBkYXRlcyAhPSBudWxsKQ0KKyAgICAgICAgICAgIGZsdXNoKGRlbGV0ZVVwZGF0ZXMsIHBzTWdyKTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspDQorICAgICAgICAgICAgcHNNZ3IuZmx1c2goKFJvd0ltcGwpIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgaWYgKGluc2VydFVwZGF0ZXMgIT0gbnVsbCkNCisgICAgICAgICAgICBmbHVzaChpbnNlcnRVcGRhdGVzLCBwc01ncik7DQorCX0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgRGVwdGhGaXJzdEFuYWx5c2lzfSBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIGdyYXBoDQorICAgICAqIGFuZCBhdXRvLWFzc2lnbiBzZXR0aW5ncy4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBEZXB0aEZpcnN0QW5hbHlzaXMgbmV3RGVwdGhGaXJzdEFuYWx5c2lzKEdyYXBoIGdyYXBoLA0KKyAgICAgICAgYm9vbGVhbiBhdXRvQXNzaWduKSB7DQorICAgICAgICByZXR1cm4gbmV3IERlcHRoRmlyc3RBbmFseXNpcyhncmFwaCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZsdXNoIHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIHNlY29uZGFyeSByb3dzLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgZmx1c2goQ29sbGVjdGlvbiByb3dzLCBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXIgcHNNZ3IpIHsNCisgICAgICAgIGlmIChyb3dzLnNpemUoKSA9PSAwKQ0KKyAgICAgICAgICAgIHJldHVybjsNCisNCisgICAgICAgIFJvd0ltcGwgcm93Ow0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSByb3dzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgew0KKyAgICAgICAgICAgIHJvdyA9IChSb3dJbXBsKSBpdHIubmV4dCgpOw0KKyAgICAgICAgICAgIGlmIChyb3cuaXNWYWxpZCgpICYmICFyb3cuaXNEZXBlbmRlbnQoKSkNCisgICAgICAgICAgICAgICAgcHNNZ3IuZmx1c2gocm93KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9EZWxlZ2F0aW5nSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRGVsZWdhdGluZ0pEQkNGZXRjaENvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY1YmFhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRGVsZWdhdGluZ0pEQkNGZXRjaENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5EZWxlZ2F0aW5nRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3I7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogd2hlbiBhZGRpbmcgYSBwdWJsaWMgQVBJIG1ldGhvZCwgYmUgc3VyZSB0byBhZGQgaXQgdG8gCisvLyBKRE8gYW5kIEpQQSBmYWNhZGVzIQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRGVsZWdhdGluZyBmZXRjaCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGFsc28gcGVyZm9ybSBleGNlcHRpb24KKyAqIHRyYW5zYXRpb24gZm9yIHVzZSBpbiBmYWNhZGVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdKREJDRmV0Y2hDb25maWd1cmF0aW9uCisgICAgZXh0ZW5kcyBEZWxlZ2F0aW5nRmV0Y2hDb25maWd1cmF0aW9uCisgICAgaW1wbGVtZW50cyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdKREJDRmV0Y2hDb25maWd1cmF0aW9uKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZGVsZWdhdGUpIHsKKyAgICAgICAgc3VwZXIoZGVsZWdhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUgYW5kIGV4Y2VwdGlvbiB0cmFuc2xhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nSkRCQ0ZldGNoQ29uZmlndXJhdGlvbihKREJDRmV0Y2hDb25maWd1cmF0aW9uIGRlbGVnYXRlLAorICAgICAgICBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciB0cmFucykgeworICAgICAgICBzdXBlcihkZWxlZ2F0ZSwgdHJhbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSkRCQyBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBnZXRKREJDRGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiAoSkRCQ0ZldGNoQ29uZmlndXJhdGlvbikgZ2V0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVhZ2VyRmV0Y2hNb2RlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLmdldEVhZ2VyRmV0Y2hNb2RlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBzZXRFYWdlckZldGNoTW9kZShpbnQgbW9kZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SkRCQ0RlbGVnYXRlKCkuc2V0RWFnZXJGZXRjaE1vZGUobW9kZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SkRCQ0RlbGVnYXRlKCkuZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGUoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLmdldFN1YmNsYXNzRmV0Y2hNb2RlKGNscyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBzZXRTdWJjbGFzc0ZldGNoTW9kZShpbnQgbW9kZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SkRCQ0RlbGVnYXRlKCkuc2V0U3ViY2xhc3NGZXRjaE1vZGUobW9kZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0VHlwZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRKREJDRGVsZWdhdGUoKS5nZXRSZXN1bHRTZXRUeXBlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBzZXRSZXN1bHRTZXRUeXBlKGludCB0eXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRKREJDRGVsZWdhdGUoKS5zZXRSZXN1bHRTZXRUeXBlKHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoRGlyZWN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLmdldEZldGNoRGlyZWN0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBzZXRGZXRjaERpcmVjdGlvbihpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRKREJDRGVsZWdhdGUoKS5zZXRGZXRjaERpcmVjdGlvbihkaXJlY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExSU1NpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SkRCQ0RlbGVnYXRlKCkuZ2V0TFJTU2l6ZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0TFJTU2l6ZShpbnQgbHJzU2l6ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SkRCQ0RlbGVnYXRlKCkuc2V0TFJTU2l6ZShscnNTaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRKb2luU3ludGF4KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLmdldEpvaW5TeW50YXgoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldEpvaW5TeW50YXgoaW50IHN5bnRheCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SkRCQ0RlbGVnYXRlKCkuc2V0Sm9pblN5bnRheChzeW50YXgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGdldEpvaW5zKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLmdldEpvaW5zKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNKb2luKFN0cmluZyBmaWVsZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLmhhc0pvaW4oZmllbGQpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gYWRkSm9pbihTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEpEQkNEZWxlZ2F0ZSgpLmFkZEpvaW4oZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBhZGRKb2lucyhDb2xsZWN0aW9uIGZpZWxkcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SkRCQ0RlbGVnYXRlKCkuYWRkSm9pbnMoZmllbGRzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gcmVtb3ZlSm9pbihTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEpEQkNEZWxlZ2F0ZSgpLnJlbW92ZUpvaW4oZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiByZW1vdmVKb2lucyhDb2xsZWN0aW9uIGZpZWxkcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SkRCQ0RlbGVnYXRlKCkucmVtb3ZlSm9pbnMoZmllbGRzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gY2xlYXJKb2lucygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEpEQkNEZWxlZ2F0ZSgpLmNsZWFySm9pbnMoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJc29sYXRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SkRCQ0RlbGVnYXRlKCkuZ2V0SXNvbGF0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBzZXRJc29sYXRpb24oaW50IGxldmVsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRKREJDRGVsZWdhdGUoKS5zZXRJc29sYXRpb24obGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiB0cmF2ZXJzZUpEQkMoRmllbGRNZXRhRGF0YSBmbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEpEQkNEZWxlZ2F0ZSgpLnRyYXZlcnNlSkRCQyhmbSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FYWdlckZldGNoTW9kZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0VhZ2VyRmV0Y2hNb2Rlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzBkZDgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FYWdlckZldGNoTW9kZXMuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworLyoqCisgKiBFYWdlciBmZXRjaCBtb2RlIGNvbnN0YW50cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVhZ2VyRmV0Y2hNb2RlcyB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIG5vdCB0byB0cnkgdG8gbG9hZCBzdWJjbGFzcyBkYXRhIGFuZCByZWxhdGVkCisgICAgICogb2JqZWN0cyB3aGVuIHF1ZXJ5aW5nIGZvciBhbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUFHRVJfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRvIGxvYWQgcmVsYXRpb25zIGFuZCBzdWJjbGFzcyBkYXRhIGlmIHBvc3NpYmxlCisgICAgICogd2l0aG91dCBzZXBhcmF0ZSBxdWVyaWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBR0VSX0pPSU4gPSAxOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0byBsb2FkIHJlbGF0aW9ucyBhbmQgc3ViY2xhc3MgZGF0YSBpZiBwb3NzaWJsZQorICAgICAqIHVzaW5nIGVpdGhlciBqb2lucyBvciBwYXJhbGxlbCBxdWVyaWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBR0VSX1BBUkFMTEVMID0gMjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0dlbmVyaWNSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvR2VuZXJpY1Jlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3MjI1ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0dlbmVyaWNSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVW5zdXBwb3J0ZWRFeGNlcHRpb247CisKKy8qKgorICogT2JqZWN0IHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHdyYXBwZWQgYXJvdW5kIGEgZ2VuZXJpYyB7QGxpbmsgUmVzdWx0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1Jlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgaW1wbGVtZW50cyBSZXN1bHRPYmplY3RQcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWFwcGluZyBfbWFwcGluZzsKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNTdG9yZSBfc3RvcmU7CisgICAgcHJpdmF0ZSBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIF9mZXRjaDsKKyAgICBwcml2YXRlIGZpbmFsIFJlc3VsdCBfcmVzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGNDbGFzcyB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgcmVzdWx0IG9iamVjdHMKKyAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHN0b3JlIG1hbmFnZXIgdG8gZGVsZWdhdGUgbG9hZGluZyB0bworICAgICAqIEBwYXJhbSBmZXRjaCB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbiwgb3IgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSByZXMgdGhlIHJlc3VsdCBjb250YWluaW5nIHRoZSBkYXRhCisgICAgICovCisgICAgcHVibGljIEdlbmVyaWNSZXN1bHRPYmplY3RQcm92aWRlcihDbGFzcyBwY0NsYXNzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMpIHsKKyAgICAgICAgdGhpcyhzdG9yZS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TWFwcGluZ1JlcG9zaXRvcnlJbnN0YW5jZSgpLmdldE1hcHBpbmcKKyAgICAgICAgICAgIChwY0NsYXNzLCBzdG9yZS5nZXRDb250ZXh0KCkuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSksCisgICAgICAgICAgICBzdG9yZSwgZmV0Y2gsIHJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgbWFwcGluZyBmb3IgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHJlc3VsdCBvYmplY3RzCisgICAgICogQHBhcmFtIHN0b3JlIHRoZSBzdG9yZSBtYW5hZ2VyIHRvIGRlbGVnYXRlIGxvYWRpbmcgdG8KKyAgICAgKiBAcGFyYW0gZmV0Y2ggdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24sIG9yIG51bGwgZm9yIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gcmVzIHRoZSByZXN1bHQgY29udGFpbmluZyB0aGUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBHZW5lcmljUmVzdWx0T2JqZWN0UHJvdmlkZXIoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykgeworICAgICAgICBfbWFwcGluZyA9IG1hcHBpbmc7CisgICAgICAgIF9zdG9yZSA9IHN0b3JlOworICAgICAgICBpZiAoZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIF9mZXRjaCA9IHN0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZmV0Y2ggPSBmZXRjaDsKKyAgICAgICAgX3JlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2VzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLnN1cHBvcnRzUmFuZG9tQWNjZXNzKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgeworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0T2JqZWN0KCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJhdGhlciB0aGFuIHVzZSB0aGUgc3RhbmRhcmQgcmVzdWx0LmxvYWQoKSwgd2UgZ28gZGlyZWN0IHRvCisgICAgICAgIC8vIHRoZSBzdG9yZSBtYW5hZ2VyIHNvIHdlIGNhbiB0ZWxsIGl0IG5vdCB0byBsb2FkIGFueXRoaW5nIGFkZGl0aW9uYWwKKyAgICAgICAgcmV0dXJuICgoSkRCQ1N0b3JlTWFuYWdlcikgX3N0b3JlKS5sb2FkKF9tYXBwaW5nLCBfZmV0Y2gsCisgICAgICAgICAgICBTdG9yZUNvbnRleHQuRVhDTFVERV9BTEwsIF9yZXMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5leHQoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXMubmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFic29sdXRlKGludCBwb3MpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlcy5hYnNvbHV0ZShwb3MpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX2ZldGNoLmdldExSU1NpemUoKSA9PSBMUlNTaXplcy5TSVpFX1VOS05PV04KKyAgICAgICAgICAgIHx8ICFzdXBwb3J0c1JhbmRvbUFjY2VzcygpKQorICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICByZXR1cm4gX3Jlcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBfcmVzLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNRTEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoKFNRTEV4Y2VwdGlvbikgZSwKKyAgICAgICAgICAgICAgICBfc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSW5zdGFuY2VSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSW5zdGFuY2VSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmIzZTMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9JbnN0YW5jZVJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdEV4ZWN1dG9yOworCisvKioKKyAqIE9iamVjdCBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiB3cmFwcGVkIGFyb3VuZCBhIHtAbGluayBTZWxlY3R9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW5jZVJlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgZXh0ZW5kcyBTZWxlY3RSZXN1bHRPYmplY3RQcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWFwcGluZyBfbWFwcGluZzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbCB0aGUgc2VsZWN0IHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgbWFwcGluZyBmb3IgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHJlc3VsdCBvYmplY3RzCisgICAgICogQHBhcmFtIHN0b3JlIHRoZSBzdG9yZSB0byBkZWxlZ2F0ZSBsb2FkaW5nIHRvCisgICAgICogQHBhcmFtIGZldGNoIHRoZSBmZXRjaCBjb25maWd1cmF0aW9uLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIEluc3RhbmNlUmVzdWx0T2JqZWN0UHJvdmlkZXIoU2VsZWN0RXhlY3V0b3Igc2VsLAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZywgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHN1cGVyKHNlbCwgc3RvcmUsIGZldGNoKTsKKyAgICAgICAgX21hcHBpbmcgPSBtYXBwaW5nOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0T2JqZWN0KCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3VsdCByZXMgPSBnZXRSZXN1bHQoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSByZXMuZ2V0QmFzZU1hcHBpbmcoKTsKKyAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIG1hcHBpbmcgPSBfbWFwcGluZzsKKyAgICAgICAgcmV0dXJuIHJlcy5sb2FkKG1hcHBpbmcsIGdldFN0b3JlKCksIGdldEZldGNoQ29uZmlndXJhdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9KREJDQnJva2VyRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ0Jyb2tlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGUyNmJkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ0Jyb2tlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkFic3RyYWN0QnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJvb3RzdHJhcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEJyb2tlckZhY3RvcnkgdHlwZSBmb3IgdXNlIHdpdGggdGhlIEpEQkMgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGNsYXNzIEpEQkNCcm9rZXJGYWN0b3J5CisgICAgZXh0ZW5kcyBBYnN0cmFjdEJyb2tlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoSkRCQ0Jyb2tlckZhY3RvcnkuY2xhc3MpOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9zeW5jaHJvbml6ZWRNYXBwaW5ncyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIGZhY3RvcnkgZnJvbSBwcm9wZXJ0aWVzLiBJbnZva2VkIGZyb20KKyAgICAgKiB7QGxpbmsgQm9vdHN0cmFwI25ld0Jyb2tlckZhY3Rvcnl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSkRCQ0Jyb2tlckZhY3RvcnkgbmV3SW5zdGFuY2UoQ29uZmlndXJhdGlvblByb3ZpZGVyIGNwKSB7CisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uSW1wbCBjb25mID0gbmV3IEpEQkNDb25maWd1cmF0aW9uSW1wbCgpOworICAgICAgICBjcC5zZXRJbnRvKGNvbmYpOworICAgICAgICByZXR1cm4gbmV3IEpEQkNCcm9rZXJGYWN0b3J5KGNvbmYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIGZvciBvYnRhaW5pbmcgYSBwb3NzaWJseS1wb29sZWQgZmFjdG9yeSBmcm9tIHByb3BlcnRpZXMuCisgICAgICogSW52b2tlZCBmcm9tIHtAbGluayBCb290c3RyYXAjZ2V0QnJva2VyRmFjdG9yeX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBKREJDQnJva2VyRmFjdG9yeSBnZXRJbnN0YW5jZShDb25maWd1cmF0aW9uUHJvdmlkZXIgY3ApIHsKKyAgICAgICAgSkRCQ0Jyb2tlckZhY3RvcnkgZmFjdG9yeSA9IChKREJDQnJva2VyRmFjdG9yeSkgZ2V0UG9vbGVkRmFjdG9yeQorICAgICAgICAgICAgKGNwLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKKworICAgICAgICBmYWN0b3J5ID0gbmV3SW5zdGFuY2UoY3ApOworICAgICAgICBmYWN0b3J5LnBvb2woKTsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIGZhY3RvcnkgZnJvbSBhIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSkRCQ0Jyb2tlckZhY3RvcnkgZ2V0SW5zdGFuY2UKKyAgICAgICAgKEpEQkNDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgSkRCQ0Jyb2tlckZhY3RvcnkgZmFjdG9yeSA9IChKREJDQnJva2VyRmFjdG9yeSkgZ2V0UG9vbGVkRmFjdG9yeQorICAgICAgICAgICAgKGNvbmYudG9Qcm9wZXJ0aWVzKGZhbHNlKSk7CisgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKKworICAgICAgICBmYWN0b3J5ID0gbmV3IEpEQkNCcm9rZXJGYWN0b3J5KGNvbmYpOworICAgICAgICBmYWN0b3J5LnBvb2woKTsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIG9wdGlvbiBzZXR0aW5nczsgaG93ZXZlciwgdGhlCisgICAgICogZmFjdG9yeSBjb25zdHJ1Y3Rpb24gbWV0aG9kcyBhcmUgcmVjb21tZW5kZWQuCisgICAgICovCisgICAgcHVibGljIEpEQkNCcm9rZXJGYWN0b3J5KEpEQkNDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgc3VwZXIoY29uZik7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgLy8gYWRkIHBsYXRmb3JtIHByb3BlcnR5CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBzdXBlci5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIFN0cmluZyBkYiA9ICJVbmtub3duIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpEQkNDb25maWd1cmF0aW9uIGNvbmYgPSAoSkRCQ0NvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGRiID0gY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLnBsYXRmb3JtOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIH0KKyAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoIlBsYXRmb3JtIiwKKyAgICAgICAgICAgICJPcGVuSlBBIEpEQkMgRWRpdGlvbjogIiArIGRiICsgIiBEYXRhYmFzZSIpOworCisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RvcmVNYW5hZ2VyIG5ld1N0b3JlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKREJDU3RvcmVNYW5hZ2VyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJyb2tlckltcGwgbmV3QnJva2VySW1wbChTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3MpIHsKKyAgICAgICAgQnJva2VySW1wbCBicm9rZXIgPSBzdXBlci5uZXdCcm9rZXJJbXBsKHVzZXIsIHBhc3MpOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIG1hcHBpbmdzOyB3ZSB3YWl0IHVudGlsIG5vdyB0byBkbyB0aGlzIHNvIHRoYXQKKyAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGZpcnN0IGJyb2tlciB1c2VyL3Bhc3MgZm9yIGNvbm5lY3Rpb24gaWYgbm8KKyAgICAgICAgICAgIC8vIGdsb2JhbCBsb2dpbiBpcyBnaXZlbgorICAgICAgICAgICAgaWYgKCFfc3luY2hyb25pemVkTWFwcGluZ3MpIHsKKyAgICAgICAgICAgICAgICBfc3luY2hyb25pemVkTWFwcGluZ3MgPSB0cnVlOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplTWFwcGluZ3MoYnJva2VyLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnJva2VyOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSB0aGUgbWFwcGluZ3Mgb2YgdGhlIGNsYXNzZXMgbGlzdGVkIGluIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZU1hcHBpbmdzKENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gKEpEQkNDb25maWd1cmF0aW9uKSBnZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBjb25mLmdldFN5bmNocm9uaXplTWFwcGluZ3MoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoYWN0aW9uKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDb2xsZWN0aW9uIGNsYXNzZXMgPSBjb25mLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICBsb2FkUGVyc2lzdGVudFR5cGVzKGZhbHNlLCBsb2FkZXIpOworICAgICAgICBpZiAoY2xhc3Nlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhhY3Rpb24pOworICAgICAgICBhY3Rpb24gPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUoYWN0aW9uKTsKKyAgICAgICAgTWFwcGluZ1Rvb2wgdG9vbCA9IG5ldyBNYXBwaW5nVG9vbChjb25mLCBhY3Rpb24sIGZhbHNlKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2UodG9vbCwgY29uZiwgcHJvcHMsCisgICAgICAgICAgICAiU3luY2hyb25pemVNYXBwaW5ncyIpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHNjaGVtYQorICAgICAgICBDbGFzcyBjbHM7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY2xhc3Nlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY2xzID0gKENsYXNzKSBpdHIubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0b29sLnJ1bihjbHMpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtc3luY2gtbWFwcGluZ3MiLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIEFycmF5cy5hc0xpc3QoTWFwcGluZ1Rvb2wuQUNUSU9OUykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b29sLnJlY29yZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNGZXRjaENvbmZpZ3VyYXRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNGZXRjaENvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc1ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pblN5bnRheGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CisKKy8qKgorICogSkRCQyBleHRlbnNpb25zIHRvIE9wZW5KUEEncyB7QGxpbmsgRmV0Y2hDb25maWd1cmF0aW9ufS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbgorICAgIGV4dGVuZHMgRmV0Y2hDb25maWd1cmF0aW9uLCBFYWdlckZldGNoTW9kZXMsIExSU1NpemVzLCBKb2luU3ludGF4ZXMgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlYWdlciBmZXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUKKyAgICAgKiA8Y29kZT5vcGVuanBhLmpkYmMuRWFnZXJGZXRjaE1vZGU8L2NvZGU+IHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFYWdlckZldGNoTW9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlYWdlciBmZXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUKKyAgICAgKiA8Y29kZT5vcGVuanBhLmpkYmMuRWFnZXJGZXRjaE1vZGU8L2NvZGU+IHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0RWFnZXJGZXRjaE1vZGUoaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdWJjbGFzcyBmZXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUKKyAgICAgKiA8Y29kZT5vcGVuanBhLmpkYmMuU3ViY2xhc3NGZXRjaE1vZGU8L2NvZGU+IHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdWJjbGFzc0ZldGNoTW9kZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlZmZlY3RpdmUgc3ViY2xhc3MgZmV0Y2ggbW9kZSBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdWJjbGFzc0ZldGNoTW9kZShDbGFzc01hcHBpbmcgY2xzKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3ViY2xhc3MgZmV0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlCisgICAgICogPGNvZGU+b3BlbmpwYS5qZGJjLlN1YmNsYXNzRmV0Y2hNb2RlPC9jb2RlPiBzZXR0aW5nLgorICAgICAqLworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldFN1YmNsYXNzRmV0Y2hNb2RlKGludCBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFRoZSByZXN1bHQgc2V0IHR5cGUgdG8gdXNlIGFzIGEgY29uc3RhbnQgZnJvbSB7QGxpbmsgUmVzdWx0U2V0fS4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgPGNvZGU+b3BlbmpwYS5qZGJjLlJlc3VsdFNldFR5cGU8L2NvZGU+IHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzdWx0IHNldCB0eXBlIHRvIHVzZSBhcyBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFJlc3VsdFNldH0uCisgICAgICogRGVmYXVsdHMgdG8gdGhlIDxjb2RlPm9wZW5qcGEuamRiYy5SZXN1bHRTZXRUeXBlPC9jb2RlPiBzZXR0aW5nLgorICAgICAqLworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldFJlc3VsdFNldFR5cGUoaW50IHR5cGUpOworCisgICAgLyoqCisgICAgICogVGhlIGZldGNoIGRpcmVjdGlvbiB0byB1c2UgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBSZXN1bHRTZXR9LgorICAgICAqIERlZmF1bHRzIHRvIHRoZSA8Y29kZT5vcGVuanBhLmpkYmMuRmV0Y2hEaXJlY3Rpb248L2NvZGU+IHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIGZldGNoIGRpcmVjdGlvbiB0byB1c2UgYXMgYSBjb25zdGFudCBmcm9tIHtAbGluayBSZXN1bHRTZXR9LgorICAgICAqIERlZmF1bHRzIHRvIHRoZSA8Y29kZT5vcGVuanBhLmpkYmMuRmV0Y2hEaXJlY3Rpb248L2NvZGU+IHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGRpcmVjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFyZ2UgcmVzdWx0IHNldCBzaXplIG1vZGUgdG8gdXNlLgorICAgICAqIERlZmF1bHRzIHRvIHRoZSA8Y29kZT5vcGVuanBhLmpkYmMuTFJTU2l6ZTwvY29kZT4gc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExSU1NpemUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXJnZSByZXN1bHQgc2V0IHNpemUgbW9kZSB0byB1c2UuCisgICAgICogRGVmYXVsdHMgdG8gdGhlIDxjb2RlPm9wZW5qcGEuamRiYy5MUlNTaXplPC9jb2RlPiBzZXR0aW5nLgorICAgICAqLworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldExSU1NpemUoaW50IGxyc1NpemUpOworCisgICAgLyoqCisgICAgICogVGhlIGpvaW4gc3ludGF4IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpvaW5TeW50YXgoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBqb2luIHN5bnRheCB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0Sm9pblN5bnRheChpbnQgc3ludGF4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBqb2lucyB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlCisgICAgICogd2hlbiBsb2FkaW5nIG9iamVjdHMuIERlZmF1bHRzIHRvIHRoZSBlbXB0eSBzZXQuICBUaGlzIHNldCBpcyBub3QKKyAgICAgKiB0aHJlYWQgc2FmZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjQuMC4wCisgICAgICovCisgICAgcHVibGljIFNldCBnZXRKb2lucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBqb2luIGhhcyBiZWVuIGFkZGVkLgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4wLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNKb2luKFN0cmluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIDxjb2RlPmZpZWxkPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lcyB0bworICAgICAqIGVhZ2VybHkgam9pbiB3aGVuIGxvYWRpbmcgb2JqZWN0cy4gRWFjaCBjbGFzcyBjYW4gaGF2ZSBhdCBtb3N0CisgICAgICogb25lIHRvLW1hbnkgZWFnZXJseSBqb2luZWQgZmllbGRzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4wLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBhZGRKb2luKFN0cmluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIDxjb2RlPmZpZWxkczwvY29kZT4gdG8gdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMgdG8KKyAgICAgKiBlYWdlcmx5IGpvaW4gd2hlbiBsb2FkaW5nIG9iamVjdHMuIEVhY2ggY2xhc3MgY2FuIGhhdmUgYXQgbW9zdAorICAgICAqIG9uZSB0by1tYW55IGVhZ2VybHkgam9pbmVkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjQuMC4wCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gYWRkSm9pbnMoQ29sbGVjdGlvbiBmaWVsZHMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyA8Y29kZT5maWVsZDwvY29kZT4gdG8gdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMgdG8KKyAgICAgKiBlYWdlcmx5IGpvaW4gd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC40LjAuMAorICAgICAqLworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUpvaW4oU3RyaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgPGNvZGU+ZmllbGRzPC9jb2RlPiBmcm9tIHRoZSBzZXQgb2YgZnVsbHktcXVhbGlmaWVkCisgICAgICogZmllbGQgbmFtZXMgdG8gZWFnZXJseSBqb2luIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4wLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiByZW1vdmVKb2lucyhDb2xsZWN0aW9uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIHNldCBvZiBmaWVsZCBuYW1lcyB0byBqb2luIHdoZW4gbG9hZGluZyBkYXRhLgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4wLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBjbGVhckpvaW5zKCk7CisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgaXNvbGF0aW9uIGxldmVsIGZvciBxdWVyaWVzIGlzc3VlZCB0byB0aGUgZGF0YWJhc2UuIFRoaXMgb3ZlcnJpZGVzCisgICAgICogdGhlIHBlcnNpc3RlbmNlLXVuaXQtd2lkZSA8Y29kZT5vcGVuanBhLmpkYmMuVHJhbnNhY3Rpb25Jc29sYXRpb248L2NvZGU+CisgICAgICogdmFsdWUuPC9wPgorICAgICAqCisgICAgICogPHA+TXVzdCBiZSBvbmUgb2Yge0BsaW5rIENvbm5lY3Rpb24jVFJBTlNBQ1RJT05fTk9ORX0sCisgICAgICoge0BsaW5rIENvbm5lY3Rpb24jVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRH0sCisgICAgICoge0BsaW5rIENvbm5lY3Rpb24jVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUR9LAorICAgICAqIHtAbGluayBDb25uZWN0aW9uI1RSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRH0sCisgICAgICoge0BsaW5rIENvbm5lY3Rpb24jVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFfSwKKyAgICAgKiBvciAtMSBmb3IgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBsZXZlbCBzcGVjaWZpZWQgYnkgdGhlIGNvbnRleHQgaW4KKyAgICAgKiB3aGljaCB0aGlzIGZldGNoIGNvbmZpZ3VyYXRpb24gaXMgYmVpbmcgdXNlZC48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMC45LjcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElzb2xhdGlvbigpOworCisgICAgLyoqCisgICAgICogPHA+VGhlIGlzb2xhdGlvbiBsZXZlbCBmb3IgcXVlcmllcyBpc3N1ZWQgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIG92ZXJyaWRlcworICAgICAqIHRoZSBwZXJzaXN0ZW5jZS11bml0LXdpZGUgPGNvZGU+b3BlbmpwYS5qZGJjLlRyYW5zYWN0aW9uSXNvbGF0aW9uPC9jb2RlPgorICAgICAqIHZhbHVlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPk11c3QgYmUgb25lIG9mIHtAbGluayBDb25uZWN0aW9uI1RSQU5TQUNUSU9OX05PTkV9LAorICAgICAqIHtAbGluayBDb25uZWN0aW9uI1RSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUR9LAorICAgICAqIHtAbGluayBDb25uZWN0aW9uI1RSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEfSwKKyAgICAgKiB7QGxpbmsgQ29ubmVjdGlvbiNUUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUR9LAorICAgICAqIHtAbGluayBDb25uZWN0aW9uI1RSQU5TQUNUSU9OX1NFUklBTElaQUJMRX0sCisgICAgICogb3IgLTEgZm9yIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gbGV2ZWwgc3BlY2lmaWVkIGJ5IHRoZSBjb250ZXh0IGluCisgICAgICogd2hpY2ggdGhpcyBmZXRjaCBjb25maWd1cmF0aW9uIGlzIGJlaW5nIHVzZWQuPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0SXNvbGF0aW9uKGludCBsZXZlbCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FzdCB0cmF2ZXJzYWwgdG8gc3RvcmUtc3BlY2lmaWMgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiB0cmF2ZXJzZUpEQkMoRmllbGRNZXRhRGF0YSBmbSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9KREJDRmV0Y2hDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ0ZldGNoQ29uZmlndXJhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWIzZjFiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ0ZldGNoQ29uZmlndXJhdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmV0Y2hDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5FYWdlclJlc3VsdExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuU2ltcGxlUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5Tb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5XaW5kb3dSZXN1bHRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEpEQkMgZXh0ZW5zaW9ucyB0byBPcGVuSlBBJ3Mge0BsaW5rIEZldGNoQ29uZmlndXJhdGlvbn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEpEQkNGZXRjaENvbmZpZ3VyYXRpb25JbXBsCisgICAgZXh0ZW5kcyBGZXRjaENvbmZpZ3VyYXRpb25JbXBsCisgICAgaW1wbGVtZW50cyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEpEQkNGZXRjaENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYWJsZSBKREJDIHN0YXRlIHNoYXJlZCB0aHJvdWdob3V0IGEgdHJhdmVyc2FsIGNoYWluLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpEQkNDb25maWd1cmF0aW9uU3RhdGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBwdWJsaWMgaW50IGVhZ2VyTW9kZSA9IDA7CisgICAgICAgIHB1YmxpYyBpbnQgc3ViY2xhc3NNb2RlID0gMDsKKyAgICAgICAgcHVibGljIGludCB0eXBlID0gMDsKKyAgICAgICAgcHVibGljIGludCBkaXJlY3Rpb24gPSAwOworICAgICAgICBwdWJsaWMgaW50IHNpemUgPSAwOworICAgICAgICBwdWJsaWMgaW50IHN5bnRheCA9IDA7CisgICAgICAgIHB1YmxpYyBTZXQgam9pbnMgPSBudWxsOworICAgICAgICBwdWJsaWMgaW50IGlzb2xhdGlvbkxldmVsID0gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBKREJDQ29uZmlndXJhdGlvblN0YXRlIF9zdGF0ZTsKKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uSW1wbCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpEQkNGZXRjaENvbmZpZ3VyYXRpb25JbXBsKENvbmZpZ3VyYXRpb25TdGF0ZSBzdGF0ZSwgCisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uU3RhdGUganN0YXRlKSB7CisgICAgICAgIHN1cGVyKHN0YXRlKTsKKyAgICAgICAgX3N0YXRlID0gKGpzdGF0ZSA9PSBudWxsKSA/IG5ldyBKREJDQ29uZmlndXJhdGlvblN0YXRlKCkgOiBqc3RhdGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZldGNoQ29uZmlndXJhdGlvbkltcGwgbmV3SW5zdGFuY2UoQ29uZmlndXJhdGlvblN0YXRlIHN0YXRlKSB7CisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uU3RhdGUganN0YXRlID0gKHN0YXRlID09IG51bGwpID8gbnVsbCA6IF9zdGF0ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBKREJDRmV0Y2hDb25maWd1cmF0aW9uSW1wbChzdGF0ZSwganN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjdHgpOworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gZ2V0SkRCQ0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKGNvbmYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzZXRFYWdlckZldGNoTW9kZShjb25mLmdldEVhZ2VyRmV0Y2hNb2RlQ29uc3RhbnQoKSk7CisgICAgICAgIHNldFN1YmNsYXNzRmV0Y2hNb2RlKGNvbmYuZ2V0U3ViY2xhc3NGZXRjaE1vZGVDb25zdGFudCgpKTsKKyAgICAgICAgc2V0UmVzdWx0U2V0VHlwZShjb25mLmdldFJlc3VsdFNldFR5cGVDb25zdGFudCgpKTsKKyAgICAgICAgc2V0RmV0Y2hEaXJlY3Rpb24oY29uZi5nZXRGZXRjaERpcmVjdGlvbkNvbnN0YW50KCkpOworICAgICAgICBzZXRMUlNTaXplKGNvbmYuZ2V0TFJTU2l6ZUNvbnN0YW50KCkpOworICAgICAgICBzZXRKb2luU3ludGF4KGNvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKS5qb2luU3ludGF4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5KEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBzdXBlci5jb3B5KGZldGNoKTsKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBqZiA9IChKREJDRmV0Y2hDb25maWd1cmF0aW9uKSBmZXRjaDsKKyAgICAgICAgc2V0RWFnZXJGZXRjaE1vZGUoamYuZ2V0RWFnZXJGZXRjaE1vZGUoKSk7CisgICAgICAgIHNldFN1YmNsYXNzRmV0Y2hNb2RlKGpmLmdldFN1YmNsYXNzRmV0Y2hNb2RlKCkpOworICAgICAgICBzZXRSZXN1bHRTZXRUeXBlKGpmLmdldFJlc3VsdFNldFR5cGUoKSk7CisgICAgICAgIHNldEZldGNoRGlyZWN0aW9uKGpmLmdldEZldGNoRGlyZWN0aW9uKCkpOworICAgICAgICBzZXRMUlNTaXplKGpmLmdldExSU1NpemUoKSk7CisgICAgICAgIHNldEpvaW5TeW50YXgoamYuZ2V0Sm9pblN5bnRheCgpKTsKKyAgICAgICAgYWRkSm9pbnMoamYuZ2V0Sm9pbnMoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRFYWdlckZldGNoTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5lYWdlck1vZGU7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0RWFnZXJGZXRjaE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gREVGQVVMVCkgeworICAgICAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IGdldEpEQkNDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoY29uZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1vZGUgPSBjb25mLmdldEVhZ2VyRmV0Y2hNb2RlQ29uc3RhbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZSAhPSBERUZBVUxUKQorICAgICAgICAgICAgX3N0YXRlLmVhZ2VyTW9kZSA9IG1vZGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUuc3ViY2xhc3NNb2RlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGUoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX3N0YXRlLnN1YmNsYXNzTW9kZTsKKyAgICAgICAgaW50IG1vZGUgPSBjbHMuZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gREVGQVVMVCkKKyAgICAgICAgICAgIHJldHVybiBfc3RhdGUuc3ViY2xhc3NNb2RlOworICAgICAgICByZXR1cm4gTWF0aC5taW4obW9kZSwgX3N0YXRlLnN1YmNsYXNzTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0U3ViY2xhc3NGZXRjaE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gREVGQVVMVCkgeworICAgICAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IGdldEpEQkNDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoY29uZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1vZGUgPSBjb25mLmdldFN1YmNsYXNzRmV0Y2hNb2RlQ29uc3RhbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZSAhPSBERUZBVUxUKQorICAgICAgICAgICAgX3N0YXRlLnN1YmNsYXNzTW9kZSA9IG1vZGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS50eXBlOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldFJlc3VsdFNldFR5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gREVGQVVMVCkgeworICAgICAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IGdldEpEQkNDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoY29uZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS50eXBlID0gY29uZi5nZXRSZXN1bHRTZXRUeXBlQ29uc3RhbnQoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfc3RhdGUudHlwZSA9IHR5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hEaXJlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUuZGlyZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldEZldGNoRGlyZWN0aW9uKGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBERUZBVUxUKSB7CisgICAgICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gZ2V0SkRCQ0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChjb25mICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3N0YXRlLmRpcmVjdGlvbiA9IGNvbmYuZ2V0RmV0Y2hEaXJlY3Rpb25Db25zdGFudCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIF9zdGF0ZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TFJTU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5zaXplOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHNldExSU1NpemUoaW50IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gREVGQVVMVCkgeworICAgICAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IGdldEpEQkNDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoY29uZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5zaXplID0gY29uZi5nZXRMUlNTaXplQ29uc3RhbnQoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfc3RhdGUuc2l6ZSA9IHNpemU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Sm9pblN5bnRheCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5zeW50YXg7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0Sm9pblN5bnRheChpbnQgc3ludGF4KSB7CisgICAgICAgIGlmIChzeW50YXggPT0gREVGQVVMVCkgeworICAgICAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IGdldEpEQkNDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoY29uZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5zeW50YXggPSBjb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCkuam9pblN5bnRheDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfc3RhdGUuc3ludGF4ID0gc3ludGF4OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0TGlzdCBuZXdSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCkgeworICAgICAgICAvLyBpZiBidWlsdCBhcm91bmQgYSBsaXN0LCBqdXN0IHVzZSBhIHNpbXBsZSB3cmFwcGVyCisgICAgICAgIGlmIChyb3AgaW5zdGFuY2VvZiBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVJlc3VsdExpc3Qocm9wKTsKKworICAgICAgICAvLyBpZiBidWlsdCBhcm91bmQgYSBwYWdpbmcgbGlzdCwgdXNlIGEgd2luZG93IHByb3ZpZGVyIHdpdGggdGhlCisgICAgICAgIC8vIHNhbWUgd2luZG93IHNpemUKKyAgICAgICAgaWYgKHJvcCBpbnN0YW5jZW9mIFBhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dSZXN1bHRMaXN0KHJvcCwgKChQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlcikKKyAgICAgICAgICAgICAgICByb3ApLmdldFBhZ2VTaXplKCkpOworCisgICAgICAgIC8vIGlmIGZldGNoIHNpemUgPCAwIGp1c3QgcmVhZCBpbiBhbGwgcmVzdWx0cyBpbW1lZGlhdGVseQorICAgICAgICBpZiAoZ2V0RmV0Y2hCYXRjaFNpemUoKSA8IDApCisgICAgICAgICAgICByZXR1cm4gbmV3IEVhZ2VyUmVzdWx0TGlzdChyb3ApOworCisgICAgICAgIC8vIGlmIGZvd2FyZCBvbmx5IG9yIGZvcndhcmQgZGlyZWN0aW9uIHVzZSBhIGZvcndhcmQgd2luZG93CisgICAgICAgIGlmIChfc3RhdGUudHlwZSA9PSBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFkKKyAgICAgICAgICAgIHx8IF9zdGF0ZS5kaXJlY3Rpb24gPT0gUmVzdWx0U2V0LkZFVENIX0ZPUldBUkQKKyAgICAgICAgICAgIHx8ICFyb3Auc3VwcG9ydHNSYW5kb21BY2Nlc3MoKSkgeworICAgICAgICAgICAgaWYgKGdldEZldGNoQmF0Y2hTaXplKCkgPiAwICYmIGdldEZldGNoQmF0Y2hTaXplKCkgPD0gNTApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dSZXN1bHRMaXN0KHJvcCwgZ2V0RmV0Y2hCYXRjaFNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbmRvd1Jlc3VsdExpc3Qocm9wLCA1MCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBza2lwcGluZyBhcm91bmQgdXNlIGEgY2FjaGluZyByYW5kb20gYWNjZXNzIGxpc3QKKyAgICAgICAgaWYgKF9zdGF0ZS5kaXJlY3Rpb24gPT0gUmVzdWx0U2V0LkZFVENIX1VOS05PV04pCisgICAgICAgICAgICByZXR1cm4gbmV3IFNvZnRSYW5kb21BY2Nlc3NSZXN1bHRMaXN0KHJvcCk7CisKKyAgICAgICAgLy8gc2Nyb2xsaW5nIHJldmVyc2UuLi4ganVzdCB1c2Ugbm9uLWNhY2hpbmcgc2ltcGxlIHJlc3VsdCBsaXN0CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVzdWx0TGlzdChyb3ApOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0Sm9pbnMoKSB7CisgICAgICAgIHJldHVybiAoX3N0YXRlLmpvaW5zID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogX3N0YXRlLmpvaW5zOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0pvaW4oU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUuam9pbnMgIT0gbnVsbCAmJiBfc3RhdGUuam9pbnMuY29udGFpbnMoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGFkZEpvaW4oU3RyaW5nIGpvaW4pIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoam9pbikpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC1qb2luIikpOworICAgICAgICAKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZS5qb2lucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5qb2lucyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBfc3RhdGUuam9pbnMuYWRkKGpvaW4pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gYWRkSm9pbnMoQ29sbGVjdGlvbiBqb2lucykgeworICAgICAgICBpZiAoam9pbnMgPT0gbnVsbCB8fCBqb2lucy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBqb2lucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIGFkZEpvaW4oKFN0cmluZykgaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUpvaW4oU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUuam9pbnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUuam9pbnMucmVtb3ZlKGZpZWxkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUpvaW5zKENvbGxlY3Rpb24gam9pbnMpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZS5qb2lucyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5qb2lucy5yZW1vdmVBbGwoam9pbnMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gY2xlYXJKb2lucygpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZS5qb2lucyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5qb2lucy5jbGVhcigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJc29sYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUuaXNvbGF0aW9uTGV2ZWw7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gc2V0SXNvbGF0aW9uKGludCBsZXZlbCkgeworICAgICAgICBpZiAobGV2ZWwgIT0gLTEgJiYgbGV2ZWwgIT0gREVGQVVMVAorICAgICAgICAgICAgJiYgbGV2ZWwgIT0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9OT05FCisgICAgICAgICAgICAmJiBsZXZlbCAhPSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQKKyAgICAgICAgICAgICYmIGxldmVsICE9IENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQKKyAgICAgICAgICAgICYmIGxldmVsICE9IENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFECisgICAgICAgICAgICAmJiBsZXZlbCAhPSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1NFUklBTElaQUJMRSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgX2xvYy5nZXQoImJhZC1sZXZlbCIsIG5ldyBJbnRlZ2VyKGxldmVsKSkuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICBpZiAobGV2ZWwgPT0gREVGQVVMVCkKKyAgICAgICAgICAgIF9zdGF0ZS5pc29sYXRpb25MZXZlbCA9IC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfc3RhdGUuaXNvbGF0aW9uTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gdHJhdmVyc2VKREJDKEZpZWxkTWV0YURhdGEgZm0pIHsKKyAgICAgICAgcmV0dXJuIChKREJDRmV0Y2hDb25maWd1cmF0aW9uKSB0cmF2ZXJzZShmbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzIEpEQkMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gTWF5IHJldHVybiBudWxsIGlmIG5vdCBhCisgICAgICogSkRCQyBiYWNrLWVuZCAocG9zc2libGUgdG8gZ2V0IGEgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBvbiBub24tSkRCQworICAgICAqIGJhY2sgZW5kIGluIHJlbW90ZSBjbGllbnQpLgorICAgICAqLworICAgIHByaXZhdGUgSkRCQ0NvbmZpZ3VyYXRpb24gZ2V0SkRCQ0NvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIFN0b3JlQ29udGV4dCBjdHggPSBnZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjdHggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mID0gY3R4LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKCEoY29uZiBpbnN0YW5jZW9mIEpEQkNDb25maWd1cmF0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKEpEQkNDb25maWd1cmF0aW9uKSBjb25mOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNMb2NrTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ0xvY2tNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2ZmJmOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNMb2NrTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkxvY2tNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBFeHRlbnNpb24gb2YgdGhlIHtAbGluayBMb2NrTWFuYWdlcn0gaW50ZXJmYWNlIHdpdGggbWV0aG9kcyBmb3IKKyAqIGRhdGFzdG9yZSBsb2NraW5nIGR1cmluZyB0aGUgc2VsZWN0IGFuZCBsb2FkIHByb2Nlc3MuIEltcGxlbWVudG9ycyBvZgorICogdGhpcyBpbnRlcmZhY2UgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBpbiB0aGUKKyAqIHtAbGluayBMb2NrTWFuYWdlciNsb2NrfSBhbmQge0BsaW5rIExvY2tNYW5hZ2VyI2xvY2tBbGx9IG1ldGhvZHMsIHRoZQorICogZ2l2ZW4gPGNvZGU+Y29ubjwvY29kZT4gcGFyYW1ldGVyLCBpZiBhbnksIHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YKKyAqIHtAbGluayBDb25uZWN0aW9uSW5mb30uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBKREJDTG9ja01hbmFnZXIKKyAgICBleHRlbmRzIExvY2tNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRvIGlzc3VlIHRoZSBnaXZlbiBzZWxlY3QgRk9SIFVQREFURSwgZGVwZW5kaW5nIG9uCisgICAgICogdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgZGljdGlvbmFyeSBhbmQgdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0Rm9yVXBkYXRlKFNlbGVjdCBzZWwsIGludCBsb2NrTGV2ZWwpOworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIGluc3RhbmNlIHdhcyBsb2FkZWQgdmlhIGEgcmVzdWx0IHNldAorICAgICAqIHByb2R1Y2VkIGJ5IGEgRk9SIFVQREFURSBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZGVkRm9yVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ1NlcS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ1NlcS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWUyMTYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9KREJDU2VxLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXE7CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gb2YgdGhlIHRoZSB7QGxpbmsgU2VxfSBpbnRlcmZhY2UgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbgorICogb24gdGhlIHNjaGVtYSBuZWVkZWQgYnkgdGhpcyBzZXF1ZW5jZS4gT25seSBzZXF1ZW5jZXMgdGhhdCByZXF1aXJlIHNwZWNpYWwKKyAqIHRhYmxlcyB0aGF0IG11c3QgYmUgY3JlYXRlZCBieSBPcGVuSlBBIHRvb2xzIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMKKyAqIGludGVyZmFjZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpEQkNTZXEKKyAgICBleHRlbmRzIFNlcSB7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW55IHRhYmxlcywgZXRjIG5lZWRlZCBieSB0aGlzIGZhY3RvcnkgZm9yIHRoZSBnaXZlbiBtYXBwaW5nCisgICAgICogdG8gdGhlIGdpdmVuIHNjaGVtYSBncm91cCwgaWYgdGhleSBkbyBub3QgZXhpc3QgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIFNjaGVtYUdyb3VwIGdyb3VwKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNTdG9yZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ1N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2YjU0ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNTdG9yZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JZDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBKREJDIHN0b3JlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGludGVyZmFjZSBKREJDU3RvcmUgeworCisgICAgLyoqCisgICAgICogQ3VycmVudCBwZXJzaXN0ZW5jZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJ1bnRpbWUuCisgICAgICovCisgICAgcHVibGljIEpEQkNDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGljdGlvbmFyeSBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIERCRGljdGlvbmFyeSBnZXREQkRpY3Rpb25hcnkoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIGZhY3RvcnkgZm9yIHRoaXMgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMRmFjdG9yeSBnZXRTUUxGYWN0b3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbG9jayBtYW5hZ2VyIGluIHVzZSBpcyBhIHtAbGluayBKREJDTG9ja01hbmFnZXJ9LCByZXR1cm4gaXQuCisgICAgICovCisgICAgcHVibGljIEpEQkNMb2NrTWFuYWdlciBnZXRMb2NrTWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU1FMIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqIFRoZSA8Y29kZT5jbG9zZTwvY29kZT4gbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIG9uIHRoZSBjb25uZWN0aW9uCisgICAgICogdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGl0IGlzIHVzaW5nLiBXaGVuIGFwcHJvcHJpYXRlLCB0aGUgY2xvc2UKKyAgICAgKiBtZXRob2QgaXMgaW1wbGVtZW50ZWQgYXMgYSBuby1vcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdCBmZXRjaCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGdldEZldGNoQ29uZmlndXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGRhdGFzdG9yZSBpZGVudGl0eSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaWQgdmFsdWUgYW5kCisgICAgICogbWFwcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWQgbmV3RGF0YVN0b3JlSWQobG9uZyBpZCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGJvb2xlYW4gc3Vicyk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2lkLiBDb252ZW5pZW5jZSBtZXRob2Qgb24gdG9wIG9mCisgICAgICogdGhlIHN0b3JlJ3MgcGVyc2lzdGVuY2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2bSB0aGUgbWFwcGluZyBob2xkaW5nIHRoaXMgb2lkLCBvciBudWxsIGlmIG5vdCBhcHBsaWNhYmxlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBmaW5kKE9iamVjdCBvaWQsIFZhbHVlTWFwcGluZyB2bSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBzdXJlIGFsbCBzdWJjbGFzc2VzIG9mIHRoZSBnaXZlbiB0eXBlIGFyZSBsb2FkZWQgaW4gdGhlIEpWTS4KKyAgICAgKiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRTdWJjbGFzc2VzKENsYXNzTWFwcGluZyBtYXBwaW5nKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNTdG9yZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0pEQkNTdG9yZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY3YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ1N0b3JlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTM4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuT3JwaGFuZWRLZXlBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRpc2NyaW1pbmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pblN5bnRheGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxFeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5VbmlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkxvY2tNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlBDU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUxhbmd1YWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlNlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlbGVnYXRpbmdDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5EZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlbGVnYXRpbmdTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlU3RyYXRlZ2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5BcHBsaWNhdGlvbklkczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBTdG9yZU1hbmFnZXIgcGx1Z2luIHRoYXQgdXNlcyBKREJDIHRvIHN0b3JlIHBlcnNpc3RlbnQgZGF0YSBpbiBhCisgKiByZWxhdGlvbmFsIGRhdGEgc3RvcmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEpEQkNTdG9yZU1hbmFnZXIgCisgICAgaW1wbGVtZW50cyBTdG9yZU1hbmFnZXIsIEpEQkNTdG9yZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChKREJDU3RvcmVNYW5hZ2VyLmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RvcmVDb250ZXh0IF9jdHggPSBudWxsOworICAgIHByaXZhdGUgSkRCQ0NvbmZpZ3VyYXRpb24gX2NvbmYgPSBudWxsOworICAgIHByaXZhdGUgREJEaWN0aW9uYXJ5IF9kaWN0ID0gbnVsbDsKKyAgICBwcml2YXRlIFNRTEZhY3RvcnkgX3NxbCA9IG51bGw7CisgICAgcHJpdmF0ZSBKREJDTG9ja01hbmFnZXIgX2xtID0gbnVsbDsKKyAgICBwcml2YXRlIERhdGFTb3VyY2UgX2RzID0gbnVsbDsKKyAgICBwcml2YXRlIFJlZkNvdW50Q29ubmVjdGlvbiBfY29ubiA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9hY3RpdmUgPSBmYWxzZTsKKworICAgIC8vIHRyYWNrIHRoZSBwZW5kaW5nIHN0YXRlbWVudHMgc28gd2UgY2FuIGNhbmNlbCB0aGVtCisgICAgcHJpdmF0ZSBTZXQgX3N0bW50cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldCgpKTsKKworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9jdHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIF9jdHggPSBjdHg7CisgICAgICAgIF9jb25mID0gKEpEQkNDb25maWd1cmF0aW9uKSBjdHguZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBfZGljdCA9IF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIF9zcWwgPSBfY29uZi5nZXRTUUxGYWN0b3J5SW5zdGFuY2UoKTsKKworICAgICAgICBMb2NrTWFuYWdlciBsbSA9IGN0eC5nZXRMb2NrTWFuYWdlcigpOworICAgICAgICBpZiAobG0gaW5zdGFuY2VvZiBKREJDTG9ja01hbmFnZXIpCisgICAgICAgICAgICBfbG0gPSAoSkRCQ0xvY2tNYW5hZ2VyKSBsbTsKKworICAgICAgICBpZiAoIWN0eC5pc01hbmFnZWQoKSAmJiBfY29uZi5pc0Nvbm5lY3Rpb25GYWN0b3J5TW9kZU1hbmFnZWQoKSkKKyAgICAgICAgICAgIF9kcyA9IF9jb25mLmdldERhdGFTb3VyY2UyKGN0eCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kcyA9IF9jb25mLmdldERhdGFTb3VyY2UoY3R4KTsKKworICAgICAgICBpZiAoX2NvbmYuZ2V0VXBkYXRlTWFuYWdlckluc3RhbmNlKCkub3JkZXJEaXJ0eSgpKQorICAgICAgICAgICAgY3R4LnNldE9yZGVyRGlydHlPYmplY3RzKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBKREJDQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2NvbmY7CisgICAgfQorCisgICAgcHVibGljIERCRGljdGlvbmFyeSBnZXREQkRpY3Rpb25hcnkoKSB7CisgICAgICAgIHJldHVybiBfZGljdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMRmFjdG9yeSBnZXRTUUxGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gX3NxbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0xvY2tNYW5hZ2VyIGdldExvY2tNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gX2xtOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGdldEZldGNoQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIChKREJDRmV0Y2hDb25maWd1cmF0aW9uKSBfY3R4LmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luT3B0aW1pc3RpYygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByb2xsYmFja09wdGltaXN0aWMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVnaW4oKSB7CisgICAgICAgIF9hY3RpdmUgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCghX2N0eC5pc01hbmFnZWQoKSB8fCAhX2NvbmYuaXNDb25uZWN0aW9uRmFjdG9yeU1vZGVNYW5hZ2VkKCkpCisgICAgICAgICAgICAgICAgJiYgX2Nvbm4uZ2V0QXV0b0NvbW1pdCgpKQorICAgICAgICAgICAgICAgIF9jb25uLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIF9hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX2N0eC5pc01hbmFnZWQoKSB8fCAhX2NvbmYuaXNDb25uZWN0aW9uRmFjdG9yeU1vZGVNYW5hZ2VkKCkpCisgICAgICAgICAgICAgICAgX2Nvbm4uY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlMikgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgX2RpY3QpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB7CisgICAgICAgIC8vIGFscmVhZHkgcm9sbGVkIGJhY2sgb3Vyc2VsdmVzPworICAgICAgICBpZiAoIV9hY3RpdmUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfY29ubiAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKCFfY3R4LmlzTWFuYWdlZCgpIHx8ICFfY29uZgorICAgICAgICAgICAgICAgICAgICAuaXNDb25uZWN0aW9uRmFjdG9yeU1vZGVNYW5hZ2VkKCkpKQorICAgICAgICAgICAgICAgIF9jb25uLnJvbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgX2RpY3QpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmV0YWluQ29ubmVjdGlvbigpIHsKKyAgICAgICAgY29ubmVjdChmYWxzZSk7CisgICAgICAgIF9jb25uLnNldFJldGFpbih0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29ubmVjdGlvbigpIHsKKyAgICAgICAgaWYgKF9jb25uICE9IG51bGwpCisgICAgICAgICAgICBfY29ubi5zZXRSZXRhaW4oZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2xpZW50Q29ubmVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRDb25uZWN0aW9uKGdldENvbm5lY3Rpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgY29ubmVjdCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIF9jb25uOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cyhPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyBhZGQgd2hlcmUgY29uZGl0aW9ucyBvbiBiYXNlIGNsYXNzIHRvIGF2b2lkIGpvaW5zIGlmIHN1YmNsYXNzCisgICAgICAgIC8vIGRvZXNuJ3QgdXNlIG9pZCBhcyBpZGVudGlmaWVyCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgcmV0dXJuIGV4aXN0cyhtYXBwaW5nLCBzbS5nZXRPYmplY3RJZCgpLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhpc3RzKENsYXNzTWFwcGluZyBtYXBwaW5nLCBPYmplY3Qgb2lkLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyBhZGQgd2hlcmUgY29uZGl0aW9ucyBvbiBiYXNlIGNsYXNzIHRvIGF2b2lkIGpvaW5zIGlmIHN1YmNsYXNzCisgICAgICAgIC8vIGRvZXNuJ3QgdXNlIG9pZCBhcyBpZGVudGlmaWVyCisgICAgICAgIFNlbGVjdCBzZWwgPSBfc3FsLm5ld1NlbGVjdCgpOworICAgICAgICB3aGlsZSAobWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisKKyAgICAgICAgc2VsLndoZXJlUHJpbWFyeUtleShvaWQsIG1hcHBpbmcsIHRoaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRDb3VudCh0aGlzKSAhPSAwOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN5bmNWZXJzaW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtYXBwaW5nLmdldFZlcnNpb24oKS5jaGVja1ZlcnNpb24oc20sIHRoaXMsIHRydWUpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzdGF0ZSwgT2JqZWN0IHYxLCBPYmplY3QgdjIpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSAoQ2xhc3NNYXBwaW5nKSBzdGF0ZS5nZXRNZXRhRGF0YSgpOworICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRWZXJzaW9uKCkuY29tcGFyZVZlcnNpb24odjEsIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFBDU3RhdGUgc3RhdGUsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgQ29ubmVjdGlvbkluZm8gaW5mbyA9IChDb25uZWN0aW9uSW5mbykgY29udGV4dDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsaXplU3RhdGUoc20sIHN0YXRlLCAoSkRCQ0ZldGNoQ29uZmlndXJhdGlvbilmZXRjaCwgCisgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oY25mZSk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgX2RpY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhIG5ld2x5LWxvYWRlZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZVN0YXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFBDU3RhdGUgc3RhdGUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIENvbm5lY3Rpb25JbmZvIGluZm8pCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3Qgb2lkID0gc20uZ2V0T2JqZWN0SWQoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSAoQ2xhc3NNYXBwaW5nKSBzbS5nZXRNZXRhRGF0YSgpOworICAgICAgICBSZXN1bHQgcmVzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcyA9IGluZm8ucmVzdWx0OworICAgICAgICAgICAgICAgIGluZm8uc20gPSBzbTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5tYXBwaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGluZm8ubWFwcGluZyA9IG1hcHBpbmc7CisgICAgICAgICAgICAgICAgbWFwcGluZyA9IGluZm8ubWFwcGluZzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2lkIGluc3RhbmNlb2YgT3BlbkpQQUlkCisgICAgICAgICAgICAgICAgJiYgISgoT3BlbkpQQUlkKSBvaWQpLmhhc1N1YmNsYXNzZXMoKSkgeworICAgICAgICAgICAgICAgIEJvb2xlYW4gY3VzdG9tID0gY3VzdG9tTG9hZChzbSwgbWFwcGluZywgc3RhdGUsIGZldGNoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VzdG9tICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b20uYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0SW5pdGlhbGl6ZVN0YXRlUmVzdWx0KHNtLCBtYXBwaW5nLCBmZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0LlNVQlNfRVhBQ1QpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gbnVsbCAmJiAhc2VsZWN0UHJpbWFyeUtleShzbSwgbWFwcGluZywgZmV0Y2gpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmICFyZXMubmV4dCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENsYXNzTWFwcGluZ1tdIG1hcHBpbmdzID0gbWFwcGluZy4KKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5kZXBlbmRlbnRBc3NpZ25hYmxlTWFwcGluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFwcGluZ3MubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmdzWzBdOworICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGN1c3RvbSA9IGN1c3RvbUxvYWQoc20sIG1hcHBpbmcsIHN0YXRlLCBmZXRjaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXN0b20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b20uYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGdldEluaXRpYWxpemVTdGF0ZVJlc3VsdChzbSwgbWFwcGluZywgZmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QuU1VCU19BTllfSk9JTkFCTEUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IG51bGwgJiYgIXNlbGVjdFByaW1hcnlLZXkoc20sIG1hcHBpbmcsIGZldGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gZ2V0SW5pdGlhbGl6ZVN0YXRlVW5pb25SZXN1bHQoc20sIG1hcHBpbmcsIG1hcHBpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLm5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBvYmplY3QgdGhpcyBpczsgdGhlIHN0YXRlIG1hbmFnZXIKKyAgICAgICAgICAgIC8vIG9ubHkgZ3VhcmFudGVlcyB0byBwcm92aWRlIGEgYmFzZSBjbGFzcworICAgICAgICAgICAgQ2xhc3MgdHlwZTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0eXBlID0gbWFwcGluZy5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzLmdldEJhc2VNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IHJlcy5nZXRCYXNlTWFwcGluZygpOworICAgICAgICAgICAgICAgIHJlcy5zdGFydERhdGFSZXF1ZXN0KG1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvcigpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gbWFwcGluZy5nZXREaXNjcmltaW5hdG9yKCkuZ2V0Q2xhc3ModGhpcywgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzLmVuZERhdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzdGF0ZSBtYW5hZ2VyOyB0aGlzIG1heSBjaGFuZ2UgdGhlIG1hcHBpbmcKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgb2JqZWN0IGlkIGluc3RhbmNlIGlmIHRoZSB0eXBlIGFzIGRldGVybWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIGluZGljYXRvciBpcyBhIHN1YmNsYXNzIG9mIGV4cGVjdGVkIHR5cGUKKyAgICAgICAgICAgIHNtLmluaXRpYWxpemUodHlwZSwgc3RhdGUpOworCisgICAgICAgICAgICAvLyBsb2FkIHRoZSBzZWxlY3RlZCBtYXBwaW5ncyBpbnRvIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyCisgICAgICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyByZS1nZXQgdGhlIG1hcHBpbmcgaW4gY2FzZSB0aGUgaW5zdGFuY2Ugd2FzIGEgc3ViY2xhc3MKKyAgICAgICAgICAgICAgICBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICBsb2FkKG1hcHBpbmcsIHNtLCBmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLmdldFZlcnNpb24oKS5hZnRlckxvYWQoc20sIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgKGluZm8gPT0gbnVsbCB8fCByZXMgIT0gaW5mby5yZXN1bHQpKQorICAgICAgICAgICAgICAgIHJlcy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgdGhlIG1hcHBpbmcgdG8gY3VzdG9tIGxvYWQgZGF0YS4gUmV0dXJuIG51bGwgaWYgdGhlIG1hcHBpbmcKKyAgICAgKiBkb2VzIG5vdCB1c2UgY3VzdG9tIGxvYWRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBCb29sZWFuIGN1c3RvbUxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIFBDU3RhdGUgc3RhdGUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIG1hcHBpbmcgdGFrZXMgY2FyZSBvZiBpbml0aWFsaXphdGlvbgorICAgICAgICBpZiAoIW1hcHBpbmcuY3VzdG9tTG9hZChzbSwgdGhpcywgc3RhdGUsIGZldGNoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFwcGluZy5nZXRWZXJzaW9uKCkuYWZ0ZXJMb2FkKHNtLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UgYW5kIHJldHVybiB0aGUgcmVzdWx0LiBSZXR1cm4KKyAgICAgKiBudWxsIGlmIHRoZXJlIGlzIG5vIGRhdGEgaW4gdGhlIGN1cnJlbnQgZmV0Y2ggZ3JvdXBzIHRvIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc3VsdCBnZXRJbml0aWFsaXplU3RhdGVSZXN1bHQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBzdWJzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU2VsZWN0IHNlbCA9IF9zcWwubmV3U2VsZWN0KCk7CisgICAgICAgIGlmICghc2VsZWN0KHNlbCwgbWFwcGluZywgc3Vicywgc20sIG51bGwsIGZldGNoLAorICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9KT0lOLCB0cnVlLCBmYWxzZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgc2VsLndoZXJlUHJpbWFyeUtleShzbS5nZXRPYmplY3RJZCgpLCBtYXBwaW5nLCB0aGlzKTsKKyAgICAgICAgc2VsLnNldEV4cGVjdGVkUmVzdWx0Q291bnQoMSwgZmFsc2UpOworICAgICAgICByZXR1cm4gc2VsLmV4ZWN1dGUodGhpcywgZmV0Y2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhIHVuaW9uIG9mIHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UgZnJvbSBwb3NzaWJsZSBjb25jcmV0ZQorICAgICAqIG1hcHBpbmdzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc3VsdCBnZXRJbml0aWFsaXplU3RhdGVVbmlvblJlc3VsdChmaW5hbCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZywgZmluYWwgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3MsCisgICAgICAgIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKREJDU3RvcmVNYW5hZ2VyIHN0b3JlID0gdGhpczsKKyAgICAgICAgZmluYWwgaW50IGVhZ2VyID0gTWF0aC5taW4oZmV0Y2guZ2V0RWFnZXJGZXRjaE1vZGUoKSwKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTik7CisKKyAgICAgICAgVW5pb24gdW5pb24gPSBfc3FsLm5ld1VuaW9uKG1hcHBpbmdzLmxlbmd0aCk7CisgICAgICAgIHVuaW9uLnNldEV4cGVjdGVkUmVzdWx0Q291bnQoMSwgZmFsc2UpOworICAgICAgICBpZiAoZmV0Y2guZ2V0U3ViY2xhc3NGZXRjaE1vZGUobWFwcGluZykgIT0gZmV0Y2guRUFHRVJfSk9JTikKKyAgICAgICAgICAgIHVuaW9uLmFib3J0VW5pb24oKTsKKyAgICAgICAgdW5pb24uc2VsZWN0KG5ldyBVbmlvbi5TZWxlY3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaSkgeworICAgICAgICAgICAgICAgIHNlbC5zZWxlY3QobWFwcGluZ3NbaV0sIFNlbGVjdC5TVUJTX0FOWV9KT0lOQUJMRSwgc3RvcmUsIGZldGNoLAorICAgICAgICAgICAgICAgICAgICBlYWdlcik7CisgICAgICAgICAgICAgICAgc2VsLndoZXJlUHJpbWFyeUtleShzbS5nZXRPYmplY3RJZCgpLCBtYXBwaW5nc1tpXSwgc3RvcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHVuaW9uLmV4ZWN1dGUodGhpcywgZmV0Y2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBwcmltYXJ5IGtleSBkYXRhIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gaW5zdGFuY2UgZXhpc3RzLCBsb2NraW5nCisgICAgICogaWYgbmVlZGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RQcmltYXJ5S2V5KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2VsZWN0IHBrcyBmcm9tIGJhc2UgY2xhc3MgcmVjb3JkIHRvIGVuc3VyZSBpdCBleGlzdHMgYW5kIGxvY2sKKyAgICAgICAgLy8gaXQgaWYgbmVlZGVkCisgICAgICAgIENsYXNzTWFwcGluZyBiYXNlID0gbWFwcGluZzsKKyAgICAgICAgd2hpbGUgKGJhc2UuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworCisgICAgICAgIFNlbGVjdCBzZWwgPSBfc3FsLm5ld1NlbGVjdCgpOworICAgICAgICBzZWwuc2VsZWN0KGJhc2UuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSk7CisgICAgICAgIHNlbC53aGVyZVByaW1hcnlLZXkoc20uZ2V0T2JqZWN0SWQoKSwgYmFzZSwgdGhpcyk7CisgICAgICAgIFJlc3VsdCBleGlzdHMgPSBzZWwuZXhlY3V0ZSh0aGlzLCBmZXRjaCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWV4aXN0cy5uZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAvLyByZWNvcmQgbG9ja2VkPworICAgICAgICAgICAgaWYgKF9hY3RpdmUgJiYgX2xtICE9IG51bGwgJiYgZXhpc3RzLmlzTG9ja2luZygpKQorICAgICAgICAgICAgICAgIF9sbS5sb2FkZWRGb3JVcGRhdGUoc20pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGlzdHMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGpmZXRjaCA9IChKREJDRmV0Y2hDb25maWd1cmF0aW9uKSBmZXRjaDsKKworICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uLCBvciByZXVzZSBjdXJyZW50IG9uZQorICAgICAgICBDb25uZWN0aW9uSW5mbyBpbmZvID0gKENvbm5lY3Rpb25JbmZvKSBjb250ZXh0OworICAgICAgICBSZXN1bHQgcmVzID0gbnVsbDsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgaW5pdGlhbGl6ZSgpIGZhaWxzIHRvIGxvYWQgcmVxdWlyZWQgZmllbGRzLCB0aGVuIHRoaXMgbWV0aG9kCisgICAgICAgICAgICAvLyBpcyBjYWxsZWQ7IG1ha2Ugc3VyZSBub3QgdG8gdHJ5IHRvIHVzZSB0aGUgZ2l2ZW4gcmVzdWx0IGlmIGl0J3MKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIG9uZSB3ZSBqdXN0IGZhaWxlZCB0byBjb21wbGV0ZWx5IGluaXRpYWxpemUoKSB3aXRoCisgICAgICAgICAgICBpZiAoaW5mby5zbSAhPSBzbSkKKyAgICAgICAgICAgICAgICByZXMgPSBpbmZvLnJlc3VsdDsKKyAgICAgICAgICAgIGluZm8uc20gPSBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHJlc3VsdCwgbG9hZCBhbGwgd2UgY2FuIGZyb20gaXQKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvYWQobWFwcGluZywgc20sIGpmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgICAgICByZW1vdmVMb2FkZWRGaWVsZHMoc20sIGZpZWxkcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBpbnN0YW5jZSBpcyBob2xsb3cgYW5kIHRoZXJlJ3MgYSBjdXN0b21pemVkCisgICAgICAgICAgICAvLyBnZXQgYnkgaWQgbWV0aG9kLCB1c2UgaXQKKyAgICAgICAgICAgIGlmIChzbS5nZXRMb2FkZWQoKS5sZW5ndGgoKSA9PSAwIAorICAgICAgICAgICAgICAgICYmIG1hcHBpbmcuY3VzdG9tTG9hZChzbSwgdGhpcywgbnVsbCwgamZldGNoKSkKKyAgICAgICAgICAgICAgICByZW1vdmVMb2FkZWRGaWVsZHMoc20sIGZpZWxkcyk7CisKKyAgICAgICAgICAgIC8vIyMjIHNlbGVjdCBpcyBraW5kIG9mIGEgYmlnIG9iamVjdCwgYW5kIGluIHNvbWUgY2FzZXMgd2UgZG9uJ3QKKyAgICAgICAgICAgIC8vIyMjIHVzZSBpdC4uLiB3b3VsZCBpdCBiZSB3b3J0aCBpdCB0byBoYXZlIGEgc21hbGwgc2hlbGwgc2VsZWN0CisgICAgICAgICAgICAvLyMjIyBvYmplY3QgdGhhdCBvbmx5IGNyZWF0ZXMgYSByZWFsIHNlbGVjdCB3aGVuIGFjdHVhbGx5IHVzZWQ/CisKKyAgICAgICAgICAgIFNlbGVjdCBzZWwgPSBfc3FsLm5ld1NlbGVjdCgpOworICAgICAgICAgICAgaWYgKHNlbGVjdChzZWwsIG1hcHBpbmcsIFNlbGVjdC5TVUJTX0VYQUNULCBzbSwgZmllbGRzLCBqZmV0Y2gsCisgICAgICAgICAgICAgICAgRWFnZXJGZXRjaE1vZGVzLkVBR0VSX0pPSU4sIHRydWUsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHNlbC53aGVyZVByaW1hcnlLZXkoc20uZ2V0T2JqZWN0SWQoKSwgbWFwcGluZywgdGhpcyk7CisgICAgICAgICAgICAgICAgcmVzID0gc2VsLmV4ZWN1dGUodGhpcywgamZldGNoLCBsb2NrTGV2ZWwpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZChtYXBwaW5nLCBzbSwgamZldGNoLCByZXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm93IGFsbG93IHRoZSBmaWVsZHMgdG8gbG9hZCB0aGVtc2VsdmVzIGluZGl2aWR1YWxseSB0b28KKyAgICAgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZtcyA9IG1hcHBpbmcuZ2V0RmllbGRNYXBwaW5ncygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkcy5nZXQoaSkgJiYgIXNtLmdldExvYWRlZCgpLmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgZm1zW2ldLmxvYWQoc20sIHRoaXMsIGpmZXRjaC50cmF2ZXJzZUpEQkMoZm1zW2ldKSk7CisgICAgICAgICAgICBtYXBwaW5nLmdldFZlcnNpb24oKS5hZnRlckxvYWQoc20sIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGNuZmUpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3QgZm9ybWVkIGJ5IHJlbW92aW5nIGFsbCBsb2FkZWQgZmllbGRzIGZyb20gdGhlIGdpdmVuIG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTG9hZGVkRmllbGRzKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEJpdFNldCBmaWVsZHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgaWYgKGZpZWxkcy5nZXQoaSkgJiYgc20uZ2V0TG9hZGVkKCkuZ2V0KGkpKQorICAgICAgICAgICAgICAgIGZpZWxkcy5jbGVhcihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBsb2FkQWxsKENvbGxlY3Rpb24gc21zLCBQQ1N0YXRlIHN0YXRlLCBpbnQgbG9hZCwKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICByZXR1cm4gSW1wbEhlbHBlci5sb2FkQWxsKHNtcywgdGhpcywgc3RhdGUsIGxvYWQsIGZldGNoLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVTdGF0ZUNoYW5nZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBQQ1N0YXRlIGZyb21TdGF0ZSwKKyAgICAgICAgUENTdGF0ZSB0b1N0YXRlKSB7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZmx1c2goQ29sbGVjdGlvbiBzbXMpIHsKKyAgICAgICAgcmV0dXJuIF9jb25mLmdldFVwZGF0ZU1hbmFnZXJJbnN0YW5jZSgpLmZsdXNoKHNtcywgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsQWxsKCkgeworICAgICAgICAvLyBub3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgbG9jayB0aGUgY29udGV4dCwgc2luY2UKKyAgICAgICAgLy8gd2Ugd2FudCB0byBhbGxvdyBhIGRpZmZlcmVudCB0aHJlYWQgdG8gYmUgYWJsZSB0byBjYW5jZWwgdGhlCisgICAgICAgIC8vIG91dHN0YW5kaW5nIHN0YXRlbWVudCBvbiBhIGRpZmZlcmVudCBjb250ZXh0CisKKyAgICAgICAgQ29sbGVjdGlvbiBzdG1udHM7CisgICAgICAgIHN5bmNocm9uaXplZCAoX3N0bW50cykgeworICAgICAgICAgICAgaWYgKF9zdG1udHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHN0bW50cyA9IG5ldyBBcnJheUxpc3QoX3N0bW50cyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzdG1udHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgKChTdGF0ZW1lbnQpIGl0ci5uZXh0KCkpLmNhbmNlbCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgX2RpY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduT2JqZWN0SWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgYm9vbGVhbiBwcmVGbHVzaCkgeworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBzbS5nZXRNZXRhRGF0YSgpOworICAgICAgICBpZiAobWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OKQorICAgICAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uSWRzLmFzc2lnbihzbSwgdGhpcywgcHJlRmx1c2gpOworCisgICAgICAgIC8vIGRhdGFzdG9yZSBpZGVudGl0eQorICAgICAgICBPYmplY3QgdmFsID0gSW1wbEhlbHBlci5nZW5lcmF0ZUlkZW50aXR5VmFsdWUoX2N0eCwgbWV0YSwKKyAgICAgICAgICAgIEphdmFUeXBlcy5MT05HKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsICYmIG1ldGEuZ2V0SWRlbnRpdHlTdHJhdGVneSgpICE9IFZhbHVlU3RyYXRlZ2llcy5OQVRJVkUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHZhbCA9IGdldERhdGFTdG9yZUlkU2VxdWVuY2UobWV0YSkubmV4dChfY3R4LCBtZXRhKTsKKyAgICAgICAgc20uc2V0T2JqZWN0SWQobmV3RGF0YVN0b3JlSWQodmFsLCBtZXRhKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFzc2lnbkZpZWxkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBwcmVGbHVzaCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBPYmplY3QgdmFsID0gSW1wbEhlbHBlci5nZW5lcmF0ZUZpZWxkVmFsdWUoX2N0eCwgZm1kKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzbS5zdG9yZShmaWVsZCwgdmFsKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldE1hbmFnZWRUeXBlKE9iamVjdCBvaWQpIHsKKyAgICAgICAgaWYgKG9pZCBpbnN0YW5jZW9mIElkKQorICAgICAgICAgICAgcmV0dXJuICgoSWQpIG9pZCkuZ2V0VHlwZSgpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGF0YVN0b3JlSWRUeXBlKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gSWQuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjb3B5RGF0YVN0b3JlSWQoT2JqZWN0IG9pZCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIElkIGlkID0gKElkKSBvaWQ7CisgICAgICAgIHJldHVybiBuZXcgSWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksIGlkLmdldElkKCksIGlkLmhhc1N1YmNsYXNzZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdEYXRhU3RvcmVJZChPYmplY3QgdmFsLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIElkLm5ld0luc3RhbmNlKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBJZCBuZXdEYXRhU3RvcmVJZChsb25nIGlkLCBDbGFzc01hcHBpbmcgbWFwcGluZywgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHJldHVybiBuZXcgSWQobWFwcGluZy5nZXREZXNjcmliZWRUeXBlKCksIGlkLCBzdWJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgZXhlY3V0ZUV4dGVudChDbGFzc01ldGFEYXRhIG1ldGEsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3ViY2xhc3NlcywgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgbWV0YTsKKyAgICAgICAgZmluYWwgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3M7CisgICAgICAgIGlmIChzdWJjbGFzc2VzKQorICAgICAgICAgICAgbWFwcGluZ3MgPSBtYXBwaW5nLmdldEluZGVwZW5kZW50QXNzaWduYWJsZU1hcHBpbmdzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hcHBpbmdzID0gbmV3IENsYXNzTWFwcGluZ1tdIHsgbWFwcGluZyB9OworCisgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyW10gcm9wcyA9IG51bGw7CisgICAgICAgIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gamZldGNoID0gKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24pIGZldGNoOworICAgICAgICBpZiAoamZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKG1hcHBpbmcpICE9IGpmZXRjaC5FQUdFUl9KT0lOKQorICAgICAgICAgICAgcm9wcyA9IG5ldyBSZXN1bHRPYmplY3RQcm92aWRlclttYXBwaW5ncy5sZW5ndGhdOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjaGVjayBmb3IgY3VzdG9tIGxvYWRzCisgICAgICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlciByb3A7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcm9wID0gbWFwcGluZ3NbaV0uY3VzdG9tTG9hZCh0aGlzLCBzdWJjbGFzc2VzLCBqZmV0Y2gsIDAsCisgICAgICAgICAgICAgICAgICAgIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICBpZiAocm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvcHMgPSBuZXcgUmVzdWx0T2JqZWN0UHJvdmlkZXJbbWFwcGluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgcm9wc1tpXSA9IHJvcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHNlbGVjdGluZyBpbmRlcGVuZGVudCBtYXBwaW5ncyBzZXBhcmF0ZWx5IG9yIGhhdmUKKyAgICAgICAgICAgIC8vIGN1c3RvbSBsb2FkcywgZG8gaW5kaXZpZHVhbCBzZWxlY3RzIGZvciBlYWNoIGNsYXNzCisgICAgICAgICAgICByb3AgPSBudWxsOworICAgICAgICAgICAgaWYgKHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvcHNbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBzZWwgPSBfc3FsLm5ld1NlbGVjdCgpOworICAgICAgICAgICAgICAgICAgICBzZWwuc2V0TFJTKHRydWUpOworICAgICAgICAgICAgICAgICAgICBCaXRTZXQgcGFnZWQgPSBzZWxlY3RFeHRlbnQoc2VsLCBtYXBwaW5nc1tpXSwgamZldGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3Nlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcm9wc1tpXSA9IG5ldyBJbnN0YW5jZVJlc3VsdE9iamVjdFByb3ZpZGVyKHNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nc1tpXSwgdGhpcywgamZldGNoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcm9wc1tpXSA9IG5ldyBQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlcihzZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3NbaV0sIHRoaXMsIGpmZXRjaCwgcGFnZWQsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJvcHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3BzWzBdOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIocm9wcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBlcmZvcm0gYSB1bmlvbiBvbiBhbGwgaW5kZXBlbmRlbnQgY2xhc3NlcworICAgICAgICAgICAgVW5pb24gdW5pb24gPSBfc3FsLm5ld1VuaW9uKG1hcHBpbmdzLmxlbmd0aCk7CisgICAgICAgICAgICB1bmlvbi5zZXRMUlModHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBCaXRTZXRbXSBwYWdlZCA9IG5ldyBCaXRTZXRbbWFwcGluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgIHVuaW9uLnNlbGVjdChuZXcgVW5pb24uU2VsZWN0b3IoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpZHgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZWRbaWR4XSA9IHNlbGVjdEV4dGVudChzZWwsIG1hcHBpbmdzW2lkeF0sIGpmZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyB1c2luZyBwYWdpbmcgcm9wIGlmIGFueSB1bmlvbiBlbGVtZW50IGhhcyBwYWdlZCBmaWVsZHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGFnZWRbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlcih1bmlvbiwgbWFwcGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBKREJDU3RvcmVNYW5hZ2VyLnRoaXMsIGpmZXRjaCwgcGFnZWQsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VSZXN1bHRPYmplY3RQcm92aWRlcih1bmlvbiwgbWFwcGluZ3NbMF0sIHRoaXMsCisgICAgICAgICAgICAgICAgamZldGNoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBfZGljdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIG1hcHBpbmcgZm9yIHVzZSBpbiBhbiBleHRlbnQsIHJldHVybmluZyBwYWdlZCBmaWVsZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBCaXRTZXQgc2VsZWN0RXh0ZW50KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBib29sZWFuIHN1YmNsYXNzZXMpIHsKKyAgICAgICAgaW50IHN1YnMgPSAoc3ViY2xhc3NlcykgPyBTZWxlY3QuU1VCU19KT0lOQUJMRSA6IFNlbGVjdC5TVUJTX05PTkU7CisgICAgICAgIC8vIGRlY2lkZSBiZXR3ZWVuIHBhZ2luZyBhbmQgc3RhbmRhcmQgaXRlcmF0aW9uCisgICAgICAgIEJpdFNldCBwYWdlZCA9IFBhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyLmdldFBhZ2VkRmllbGRzKHNlbCwgbWFwcGluZywKKyAgICAgICAgICAgIHRoaXMsIGZldGNoLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX1BBUkFMTEVMLAorICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICBpZiAocGFnZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlbC5zZWxlY3RJZGVudGlmaWVyKG1hcHBpbmcsIHN1YnMsIHRoaXMsIGZldGNoLAorICAgICAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfUEFSQUxMRUwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWwuc2VsZWN0SWRlbnRpZmllcihtYXBwaW5nLCBzdWJzLCB0aGlzLCBmZXRjaCwKKyAgICAgICAgICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX0pPSU4pOworICAgICAgICByZXR1cm4gcGFnZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0b3JlUXVlcnkgbmV3UXVlcnkoU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgICAgIEV4cHJlc3Npb25QYXJzZXIgZXAgPSBRdWVyeUxhbmd1YWdlcy5wYXJzZXJGb3JMYW5ndWFnZShsYW5ndWFnZSk7CisgICAgICAgIGlmIChlcCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBKREJDU3RvcmVRdWVyeSh0aGlzLCBlcCk7CisgICAgICAgIGlmIChRdWVyeUxhbmd1YWdlcy5MQU5HX1NRTC5lcXVhbHMobGFuZ3VhZ2UpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxTdG9yZVF1ZXJ5KHRoaXMpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIG5ld0ZldGNoQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKREJDRmV0Y2hDb25maWd1cmF0aW9uSW1wbCgpOworICAgIH0KKworICAgIHB1YmxpYyBTZXEgZ2V0RGF0YVN0b3JlSWRTZXF1ZW5jZShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEuZ2V0SWRlbnRpdHlTdHJhdGVneSgpID09IFZhbHVlU3RyYXRlZ2llcy5OQVRJVkUKKyAgICAgICAgICAgIHx8IG1ldGEuZ2V0SWRlbnRpdHlTdHJhdGVneSgpID09IFZhbHVlU3RyYXRlZ2llcy5OT05FKQorICAgICAgICAgICAgcmV0dXJuIF9jb25mLmdldFNlcXVlbmNlSW5zdGFuY2UoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFNlcSBnZXRWYWx1ZVNlcXVlbmNlKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoX2Nvbm4gIT0gbnVsbCkKKyAgICAgICAgICAgIF9jb25uLmZyZWUoKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vCisgICAgLy8gVXRpbGl0aWVzCisgICAgLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgZGIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3QoYm9vbGVhbiByZWYpIHsKKyAgICAgICAgX2N0eC5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjb25uZWN0IGlmIHRoZSBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBudWxsLCBvciBpZgorICAgICAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIG91dCBmcm9tIHVuZGVyIHVzCisgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY29ubiA9IGNvbm5lY3RJbnRlcm5hbCgpOworICAgICAgICAgICAgaWYgKHJlZikKKyAgICAgICAgICAgICAgICBfY29ubi5yZWYoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBfZGljdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfY3R4LnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UuIFRoaXMgbWV0aG9kIGlzIHNlcGFyYXRlZCBvdXQgc28gdGhhdCBpdAorICAgICAqIGNhbiBiZSBvdmVycmlkZGVuLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWZDb3VudENvbm5lY3Rpb24gY29ubmVjdEludGVybmFsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgUmVmQ291bnRDb25uZWN0aW9uKF9kcy5nZXRDb25uZWN0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBvaWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBmaW5kKE9iamVjdCBvaWQsIFZhbHVlTWFwcGluZyB2bSwgCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIE9iamVjdCBwYyA9IF9jdHguZmluZChvaWQsIGZldGNoLCBudWxsLCBudWxsLCAwKTsKKyAgICAgICAgaWYgKHBjID09IG51bGwgJiYgdm0gIT0gbnVsbCkgeworICAgICAgICAgICAgT3JwaGFuZWRLZXlBY3Rpb24gYWN0aW9uID0gX2NvbmYuZ2V0T3JwaGFuZWRLZXlBY3Rpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgcGMgPSBhY3Rpb24ub3JwaGFuKG9pZCwgbnVsbCwgdm0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93IG9mIHRoZSBnaXZlbiByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb2FkKENsYXNzTWFwcGluZyBtYXBwaW5nLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBCaXRTZXQgZXhjbHVkZSwgUmVzdWx0IHJlc3VsdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbWFwcGluZy5pc01hcHBlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidmlydHVhbC1tYXBwaW5nIiwgCisgICAgICAgICAgICAgICAgbWFwcGluZykpOworCisgICAgICAgIC8vIGdldCB0aGUgb2JqZWN0IGlkIGZvciB0aGUgcm93OyBiYXNlIGNsYXNzIHNlbGVjdHMgcGsgY29sdW1ucworICAgICAgICBDbGFzc01hcHBpbmcgYmFzZSA9IG1hcHBpbmc7CisgICAgICAgIHdoaWxlIChiYXNlLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpICE9IG51bGwpCisgICAgICAgICAgICBiYXNlID0gYmFzZS5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgT2JqZWN0IG9pZCA9IGJhc2UuZ2V0T2JqZWN0SWQodGhpcywgcmVzdWx0LCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ29ubmVjdGlvbkluZm8gaW5mbyA9IG5ldyBDb25uZWN0aW9uSW5mbygpOworICAgICAgICBpbmZvLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgaW5mby5tYXBwaW5nID0gbWFwcGluZzsKKyAgICAgICAgcmV0dXJuIF9jdHguZmluZChvaWQsIGZldGNoLCBleGNsdWRlLCBpbmZvLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyIHdpdGggZGF0YSBmcm9tIHRoZSByZXN1bHQgc2V0LiBPbmx5CisgICAgICogbWFwcGluZ3Mgb3JpZ2luYWxseSBzZWxlY3RlZCB3aWxsIGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZChDbGFzc01hcHBpbmcgbWFwcGluZywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIEZpZWxkTWFwcGluZyBlYWdlclRvTWFueSA9IGxvYWQobWFwcGluZywgc20sIGZldGNoLCByZXMsIG51bGwpOworICAgICAgICBpZiAoZWFnZXJUb01hbnkgIT0gbnVsbCkKKyAgICAgICAgICAgIGVhZ2VyVG9NYW55LmxvYWRFYWdlckpvaW4oc20sIHRoaXMsIGZldGNoLnRyYXZlcnNlSkRCQyhlYWdlclRvTWFueSksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgaWYgKF9hY3RpdmUgJiYgX2xtICE9IG51bGwgJiYgcmVzLmlzTG9ja2luZygpKQorICAgICAgICAgICAgX2xtLmxvYWRlZEZvclVwZGF0ZShzbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBtYXBwaW5nLiBSZXR1cm4gYW55IHRvLW1hbnkgZWFnZXIgZmllbGQKKyAgICAgKiB3aXRob3V0IGxvYWRpbmcgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWVsZE1hcHBpbmcgbG9hZChDbGFzc01hcHBpbmcgbWFwcGluZywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcywgRmllbGRNYXBwaW5nIGVhZ2VyVG9NYW55KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1hcHBpbmcuY3VzdG9tTG9hZChzbSwgdGhpcywgZmV0Y2gsIHJlcykpCisgICAgICAgICAgICByZXR1cm4gZWFnZXJUb01hbnk7CisKKyAgICAgICAgLy8gbG9hZCBzdXBlcmNsYXNzIGRhdGE7IGJhc2UgY2xhc3MgbG9hZHMgdmVyc2lvbgorICAgICAgICBDbGFzc01hcHBpbmcgcGFyZW50ID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgZWFnZXJUb01hbnkgPSBsb2FkKHBhcmVudCwgc20sIGZldGNoLCByZXMsIGVhZ2VyVG9NYW55KTsKKyAgICAgICAgZWxzZSBpZiAoc20uZ2V0VmVyc2lvbigpID09IG51bGwpCisgICAgICAgICAgICBtYXBwaW5nLmdldFZlcnNpb24oKS5sb2FkKHNtLCB0aGlzLCByZXMpOworCisgICAgICAgIC8vIGxvYWQgdW5sb2FkZWQgZmllbGRzCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZtcyA9IG1hcHBpbmcuZ2V0RGVmaW5lZEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgT2JqZWN0IGVyZXMsIHByb2Nlc3NlZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmbXNbaV0uaXNQcmltYXJ5S2V5KCkgfHwgc20uZ2V0TG9hZGVkKCkuZ2V0KGZtc1tpXS5nZXRJbmRleCgpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGVhZ2VyIHJlc3VsdCwgYW5kIGlmIG5vdCBwcmVzZW50IGRvIHN0YW5kYXJkIGxvYWQKKyAgICAgICAgICAgIGVyZXMgPSByZXMuZ2V0RWFnZXIoZm1zW2ldKTsKKyAgICAgICAgICAgIHJlcy5zdGFydERhdGFSZXF1ZXN0KGZtc1tpXSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgaWYgKGVyZXMgPT0gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlYWdlclRvTWFueSA9PSBudWxsICYmIGZtc1tpXS5pc0VhZ2VyU2VsZWN0VG9NYW55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBlYWdlclRvTWFueSA9IGZtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm1zW2ldLmxvYWRFYWdlckpvaW4oc20sIHRoaXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgCWZldGNoLnRyYXZlcnNlSkRCQyhmbXNbaV0pLCByZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCA9IGZtc1tpXS5sb2FkRWFnZXJQYXJhbGxlbChzbSwgdGhpcywgCisgICAgICAgICAgICAgICAgICAgIAlmZXRjaC50cmF2ZXJzZUpEQkMoZm1zW2ldKSwgZXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWQgIT0gZXJlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXRFYWdlcihmbXNbaV0sIHByb2Nlc3NlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZtc1tpXS5sb2FkKHNtLCB0aGlzLCBmZXRjaC50cmF2ZXJzZUpEQkMoZm1zW2ldKSwgcmVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVzLmVuZERhdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVhZ2VyVG9NYW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBpbXBsZW1lbnRhdGlvbiB1c2Ugb25seS4KKyAgICAgKiBSZXR1cm4gYSBzZWxlY3QgZm9yIHRoZSBwcm9wZXIgbWFwcGluZ3MuIFJldHVybiBudWxsIGlmIG5vIHNlbGVjdCBpcworICAgICAqIG5lZWRlZC4gVGhlIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBiZSBjb21wbGVtZW50YXJ5IHRvIHRoZSBsb2FkIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsIHNlbGVjdCB0byBidWlsZCBvbgorICAgICAqIEBwYXJhbSBtYXBwaW5nIHRoZSBtYXBwaW5nIGZvciB0aGUgYmFzZSB0eXBlIHRvIHNlbGVjdCBmb3IKKyAgICAgKiBAcGFyYW0gc3VicyB3aGV0aGVyIHRoZSBzZWxlY3QgbWlnaHQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIHRoZQorICAgICAqIGdpdmVuIG1hcHBpbmcKKyAgICAgKiBAcGFyYW0gc20gc3RhdGUgbWFuYWdlciBpZiBhbiBpbnN0YW5jZSBpcyBiZWluZyBsb2FkZWQgb3IKKyAgICAgKiBpbml0aWFsaXplZCwgZWxzZSBudWxsCisgICAgICogQHBhcmFtIGZpZWxkcyBpZiBhIHN0YXRlIG1hbmFnZXIgaXMgYmVpbmcgbG9hZGVkLCB0aGUgc2V0IG9mCisgICAgICogZmllbGRzIHRoYXQgbXVzdCBiZSBsb2FkZWQgaW4gb3JkZXIsIGVsc2UgbnVsbAorICAgICAqIEBwYXJhbSBmZXRjaCB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbjsgdXNlZCBpZiBubyBzcGVjaWZpYyBmaWVsZHMKKyAgICAgKiBtdXN0IGJlIGxvYWRlZCwgYW5kIHVzZWQgd2hlbiBzZWxlY3RpbmcgcmVsYXRpb25zCisgICAgICogQHBhcmFtIGVhZ2VyIGVhZ2VyIGZldGNoIG1vZGUgdG8gdXNlCisgICAgICogQHBhcmFtIGlkZW50IHdoZXRoZXIgdG8gc2VsZWN0IHByaW1hcnkga2V5IGNvbHVtbnMgYXMgZGlzdGluY3QKKyAgICAgKiBpZGVudGlmaWVycworICAgICAqIEBwYXJhbSBvdXRlciB3aGV0aGVyIHdlJ3JlIG91dGVyLWpvaW5pbmcgdG8gdGhpcyB0eXBlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZWxlY3QgaXMgcmVxdWlyZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgbWFwcGluZywgaW50IHN1YnMsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEJpdFNldCBmaWVsZHMsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGludCBlYWdlciwgYm9vbGVhbiBpZGVudCwgYm9vbGVhbiBvdXRlcikgeworICAgICAgICAvLyBhZGQgY2xhc3MgY29uZGl0aW9ucyBzbyB0aGF0IHRoZXkncmUgY2xvbmVkIGZvciBhbnkgYmF0Y2hlZCBzZWxlY3RzCisgICAgICAgIGJvb2xlYW4gam9pbmVkU3VwZXJzID0gZmFsc2U7CisgICAgICAgIGlmICgoc20gPT0gbnVsbCB8fCBzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5UUkFOU0lFTlQpCisgICAgICAgICAgICAmJiAoc3VicyA9PSBTZWxlY3QuU1VCU19KT0lOQUJMRSB8fCBzdWJzID09IFNlbGVjdC5TVUJTX05PTkUpKSB7CisgICAgICAgICAgICBsb2FkU3ViY2xhc3NlcyhtYXBwaW5nKTsgCisgICAgICAgICAgICBKb2lucyBqb2lucyA9IChvdXRlcikgPyBzZWwubmV3T3V0ZXJKb2lucygpIDogbnVsbDsKKyAgICAgICAgICAgIGpvaW5lZFN1cGVycyA9IG1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvcigpLmFkZENsYXNzQ29uZGl0aW9ucyhzZWwsCisgICAgICAgICAgICAgICAgc3VicyA9PSBTZWxlY3QuU1VCU19KT0lOQUJMRSwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGFsbCBvdXIgZWFnZXIgc2VsZWN0cyBzbyB0aGF0IHRob3NlIGZpZWxkcyBhcmUgcmVzZXJ2ZWQKKyAgICAgICAgLy8gYW5kIGNhbm5vdCBiZSByZXVzZWQgZHVyaW5nIHRoZSBhY3R1YWwgZWFnZXIgc2VsZWN0IHByb2Nlc3MsCisgICAgICAgIC8vIHByZXZlbnRpbmcgaW5maW5pdGUgcmVjdXJzaW9uCisgICAgICAgIGVhZ2VyID0gTWF0aC5taW4oZWFnZXIsIGZldGNoLmdldEVhZ2VyRmV0Y2hNb2RlKCkpOworICAgICAgICBGaWVsZE1hcHBpbmcgZWFnZXJUb01hbnkgPSBjcmVhdGVFYWdlclNlbGVjdHMoc2VsLCBtYXBwaW5nLCBzbSwgZmllbGRzLAorICAgICAgICAgICAgZmV0Y2gsIGVhZ2VyKTsKKworICAgICAgICAvLyBzZWxlY3QgYWxsIGJhc2UgY2xhc3MgbWFwcGluZ3M7IGRvIHRoaXMgYWZ0ZXIgYmF0Y2hpbmcgc28gdGhhdAorICAgICAgICAvLyB0aGUgam9pbnMgbmVlZGVkIGJ5IHRoZXNlIHNlbGVjdHMgZG9uJ3QgZ2V0IGluIHRoZSBXSEVSRSBjbGF1c2UKKyAgICAgICAgLy8gb2YgdGhlIGJhdGNoZWQgc2VsZWN0cworICAgICAgICBpbnQgc2VsZCA9IHNlbGVjdEJhc2VNYXBwaW5ncyhzZWwsIG1hcHBpbmcsIG1hcHBpbmcsIHNtLCBmaWVsZHMsCisgICAgICAgICAgICBmZXRjaCwgZWFnZXIsIGVhZ2VyVG9NYW55LCBpZGVudCwgam9pbmVkU3VwZXJzKTsKKworICAgICAgICAvLyBzZWxlY3QgZWFnZXIgdG8tbWFueSByZWxhdGlvbnMgbGFzdCBiZWNhdXNlIGR1cmluZyBsb2FkIHRoZXkKKyAgICAgICAgLy8gYWR2YW5jZSB0aGUgcmVzdWx0IHNldCBhbmQgY291bGQgZXhoYXVzdCBpdCwgc28gbm8gb3RoZXIgbWFwcGluZ3MKKyAgICAgICAgLy8gY2FuIGxvYWQgYWZ0ZXJ3b3JkcworICAgICAgICBpZiAoZWFnZXJUb01hbnkgIT0gbnVsbCkKKyAgICAgICAgICAgIGVhZ2VyVG9NYW55LnNlbGVjdEVhZ2VySm9pbihzZWwsIHNtLCB0aGlzLCAKKyAgICAgICAgICAgICAgICBmZXRjaC50cmF2ZXJzZUpEQkMoZWFnZXJUb01hbnkpLCBlYWdlcik7CisKKyAgICAgICAgLy8gb3B0aW9uYWxseSBzZWxlY3Qgc3ViY2xhc3MgbWFwcGluZ3MKKyAgICAgICAgaWYgKHN1YnMgPT0gU2VsZWN0LlNVQlNfSk9JTkFCTEUgfHwgc3VicyA9PSBTZWxlY3QuU1VCU19BTllfSk9JTkFCTEUpCisgICAgICAgICAgICBzZWxlY3RTdWJjbGFzc01hcHBpbmdzKHNlbCwgbWFwcGluZywgc20sIGZldGNoKTsKKyAgICAgICAgaWYgKHNtICE9IG51bGwpCisgICAgICAgICAgICBzZWwuc2V0RGlzdGluY3QoZmFsc2UpOworICAgICAgICByZXR1cm4gc2VsZCA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFyayB0aGUgZmllbGRzIG9mIHRoaXMgbWFwcGluZyBhcyByZXNlcnZlZCBzbyB0aGF0IGVhZ2VyIGZldGNoZXMgY2FuJ3QKKyAgICAgKiBnZXQgaW50byBpbmZpbml0ZSByZWN1cnNpdmUgc2l0dWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpZWxkTWFwcGluZyBjcmVhdGVFYWdlclNlbGVjdHMoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEJpdFNldCBmaWVsZHMsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGludCBlYWdlcikgeworICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsIHx8IGVhZ2VyID09IEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZpZWxkTWFwcGluZyBlYWdlclRvTWFueSA9IGNyZWF0ZUVhZ2VyU2VsZWN0cyhzZWwsIAorICAgICAgICAgICAgbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSwgc20sIGZpZWxkcywgZmV0Y2gsIGVhZ2VyKTsKKworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmbXMgPSBtYXBwaW5nLmdldERlZmluZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gaW5FYWdlckpvaW4gPSBzZWwuaGFzRWFnZXJKb2luKGZhbHNlKTsKKyAgICAgICAgaW50IHNlbHM7CisgICAgICAgIGludCBqdHlwZTsKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtb2RlID0gZm1zW2ldLmdldEVhZ2VyRmV0Y2hNb2RlKCk7CisgICAgICAgICAgICBpZiAobW9kZSA9PSBmZXRjaC5FQUdFUl9OT05FKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFyZXF1aXJlc1NlbGVjdChmbXNbaV0sIHNtLCBmaWVsZHMsIGZldGNoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gdHJ5IHRvIHNlbGVjdCB3aXRoIGpvaW4gZmlyc3QKKyAgICAgICAgICAgIGp0eXBlID0gKGZtc1tpXS5nZXROdWxsVmFsdWUoKSA9PSBmbXNbaV0uTlVMTF9FWENFUFRJT04pIAorICAgICAgICAgICAgICAgID8gc2VsLkVBR0VSX0lOTkVSIDogc2VsLkVBR0VSX09VVEVSOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gZmV0Y2guRUFHRVJfUEFSQUxMRUwgJiYgIWZtc1tpXS5pc0VhZ2VyU2VsZWN0VG9NYW55KCkKKyAgICAgICAgICAgICAgICAmJiBmbXNbaV0uc3VwcG9ydHNTZWxlY3Qoc2VsLCBqdHlwZSwgc20sIHRoaXMsIGZldGNoKSA+IDAKKyAgICAgICAgICAgICAgICAmJiBzZWwuZWFnZXJDbG9uZShmbXNbaV0sIGp0eXBlLCBmYWxzZSwgMSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYm9vbGVhbiBoYXNKb2luID0gZmV0Y2guaGFzSm9pbihmbXNbaV0uZ2V0RnVsbE5hbWUoZmFsc2UpKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGRlY2xhcmVzIGEgcHJlZmVycmVkIHNlbGVjdCBtb2RlIG9mIGpvaW4gb3IgZG9lcyBub3QKKyAgICAgICAgICAgIC8vIGhhdmUgYSBwcmVmZXJyZWQgbW9kZSBhbmQgd2UncmUgZG9pbmcgYSBieS1pZCBsb29rdXAsIHRyeQorICAgICAgICAgICAgLy8gdG8gdXNlIGEgdG8tbWFueSBqb2luIGFsc28uICBjdXJyZW50bHkgd2UgbGltaXQgZWFnZXIKKyAgICAgICAgICAgIC8vIG91dGVyIGpvaW5zIHRvIG5vbi1MUlMsIG5vbi1yYW5nZWQgc2VsZWN0cyB0aGF0IGRvbid0IGFscmVhZHkKKyAgICAgICAgICAgIC8vIGhhdmUgYW4gZWFnZXIgdG8tbWFueSBqb2luCisgICAgICAgICAgICBpZiAoKGhhc0pvaW4gfHwgbW9kZSA9PSBmZXRjaC5FQUdFUl9KT0lOIAorICAgICAgICAgICAgICAgIHx8IChtb2RlID09IGZldGNoLkRFRkFVTFQgJiYgc20gIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgJiYgZm1zW2ldLmlzRWFnZXJTZWxlY3RUb01hbnkoKQorICAgICAgICAgICAgICAgICYmICFpbkVhZ2VySm9pbgorICAgICAgICAgICAgICAgICYmICFzZWwuaGFzRWFnZXJKb2luKHRydWUpCisgICAgICAgICAgICAgICAgJiYgKCFzZWwuZ2V0QXV0b0Rpc3RpbmN0KCkgfHwgKCFzZWwuaXNMUlMoKQorICAgICAgICAgICAgICAgICYmIHNlbC5nZXRTdGFydEluZGV4KCkgPT0gMCAKKyAgICAgICAgICAgICAgICAmJiBzZWwuZ2V0RW5kSW5kZXgoKSA9PSBMb25nLk1BWF9WQUxVRSkpCisgICAgICAgICAgICAgICAgJiYgZm1zW2ldLnN1cHBvcnRzU2VsZWN0KHNlbCwganR5cGUsIHNtLCB0aGlzLCBmZXRjaCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlbC5lYWdlckNsb25lKGZtc1tpXSwganR5cGUsIHRydWUsIDEpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVhZ2VyVG9NYW55ID0gZm1zW2ldOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZpbmFsbHksIHRyeSBwYXJhbGxlbAorICAgICAgICAgICAgaWYgKGVhZ2VyID09IGZldGNoLkVBR0VSX1BBUkFMTEVMCisgICAgICAgICAgICAgICAgJiYgKHNlbHMgPSBmbXNbaV0uc3VwcG9ydHNTZWxlY3Qoc2VsLCBzZWwuRUFHRVJfUEFSQUxMRUwsIHNtLAorICAgICAgICAgICAgICAgIHRoaXMsIGZldGNoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBzZWwuZWFnZXJDbG9uZShmbXNbaV0sIFNlbGVjdC5FQUdFUl9QQVJBTExFTCwgCisgICAgICAgICAgICAgICAgICAgIGZtc1tpXS5pc0VhZ2VyU2VsZWN0VG9NYW55KCksIHNlbHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlYWdlclRvTWFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIGZpZWxkIG5lZWRzIHRvIGJlIHNlbGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVxdWlyZXNTZWxlY3QoRmllbGRNYXBwaW5nIGZtLAorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmaWVsZHMuZ2V0KGZtLmdldEluZGV4KCkpOworICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiBzbS5nZXRQQ1N0YXRlKCkgIT0gUENTdGF0ZS5UUkFOU0lFTlQKKyAgICAgICAgICAgICYmIHNtLmdldExvYWRlZCgpLmdldChmbS5nZXRJbmRleCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZldGNoLnJlcXVpcmVzRmV0Y2goZm0pID09IEZldGNoQ29uZmlndXJhdGlvbi5GRVRDSF9MT0FEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgZmllbGQgbWFwcGluZ3Mgb2YgdGhlIGdpdmVuIGNsYXNzIGFuZCBhbGwgaXRzIHN1cGVyY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWwgdGhlIHNlbGVjdCB0byB1c2UKKyAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgbW9zdC1kZXJpdmVkIHR5cGUgdG8gc2VsZWN0IGZvcgorICAgICAqIEBwYXJhbSBvcmlnIHRoZSBvcmlnaW5hbCBtYXBwaW5nIHR5cGUgc2VsZWN0ZWQKKyAgICAgKiBAcGFyYW0gc20gdGhlIGluc3RhbmNlIGJlaW5nIHNlbGVjdGVkIGZvciwgb3IgbnVsbCBpZiBub25lCisgICAgICogQHBhcmFtIGZpZWxkcyB0aGUgZmllbGRzIHRvIGxvYWQKKyAgICAgKiBAcGFyYW0gZmV0Y2ggZmV0Y2ggY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIGxvYWRpbmcgcmVsYXRpb25zCisgICAgICogQHBhcmFtIGVhZ2VyIHRoZSBlYWdlciBmZXRjaCBtb2RlIHRvIHVzZQorICAgICAqIEBwYXJhbSBqb2luZWQgd2hldGhlciB0aGUgY2xhc3MgaGFzIGFscmVhZHkgYmVlbiBqb2luZWQgZG93biB0bworICAgICAqIGl0cyBiYXNlIGNsYXNzCisgICAgICogQHJldHVybiAmZ3Q7IDAgaWYgdGhlIHNlbGVjdCBpcyByZXF1aXJlZCwgMCBpZiBkYXRhIHdhcworICAgICAqIHNlbGVjdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQsIGFuZCAmbHQ7IDAgaWYgbm90aGluZyB3YXMgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzZWxlY3RCYXNlTWFwcGluZ3MoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIENsYXNzTWFwcGluZyBvcmlnLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXIsIEZpZWxkTWFwcGluZyBlYWdlclRvTWFueSwKKyAgICAgICAgYm9vbGVhbiBpZGVudCwgYm9vbGVhbiBqb2luZWQpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHBhcmVudCA9IG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCAmJiAhbWFwcGluZy5pc01hcHBlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidmlydHVhbC1tYXBwaW5nIiwgbWFwcGluZy4KKyAgICAgICAgICAgICAgICBnZXREZXNjcmliZWRUeXBlKCkpKTsKKworICAgICAgICBpbnQgc2VsZCA9IC0xOworICAgICAgICBpbnQgcHNlbGQgPSAtMTsKKworICAgICAgICAvLyBiYXNlIGNsYXNzIHNlbGVjdHMgcGtzLCBldGMKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBpZiBubyBpbnN0YW5jZSwgc2VsZWN0IHBrcworICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWRlbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbC5zZWxlY3RJZGVudGlmaWVyKG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzZWwuc2VsZWN0KG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSk7CisgICAgICAgICAgICAgICAgc2VsZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG5vIGluc3RhbmNlIG9yIG5vdCBpbml0aWFsaXplZCBhbmQgbm90IGV4YWN0IG9pZCwgc2VsZWN0IHR5cGUKKyAgICAgICAgICAgIGlmICgoc20gPT0gbnVsbCB8fCAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuVFJBTlNJRU5UIAorICAgICAgICAgICAgICAgICYmICghKHNtLmdldE9iamVjdElkKCkgaW5zdGFuY2VvZiBPcGVuSlBBSWQpIAorICAgICAgICAgICAgICAgIHx8ICgoT3BlbkpQQUlkKSBzbS5nZXRPYmplY3RJZCgpKS5oYXNTdWJjbGFzc2VzKCkpKSkKKyAgICAgICAgICAgICAgICAmJiBtYXBwaW5nLmdldERpc2NyaW1pbmF0b3IoKS5zZWxlY3Qoc2VsLCBvcmlnKSkKKyAgICAgICAgICAgICAgICBzZWxkID0gMTsKKworICAgICAgICAgICAgLy8gaWYgbm8gaW5zdGFuY2Ugb3Igbm8gdmVyc2lvbiwgc2VsZWN0IHZlcnNpb24KKyAgICAgICAgICAgIGlmICgoc20gPT0gbnVsbCB8fCBzbS5nZXRWZXJzaW9uKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAmJiBtYXBwaW5nLmdldFZlcnNpb24oKS5zZWxlY3Qoc2VsLCBvcmlnKSkKKyAgICAgICAgICAgICAgICBzZWxkID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gcGFyZW50CisgICAgICAgICAgICBwc2VsZCA9IHNlbGVjdEJhc2VNYXBwaW5ncyhzZWwsIHBhcmVudCwgb3JpZywgc20sIGZpZWxkcywKKyAgICAgICAgICAgICAgICBmZXRjaCwgZWFnZXIsIGVhZ2VyVG9NYW55LCBpZGVudCwgam9pbmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbGVjdCB0aGUgbWFwcGluZ3MgaW4gdGhlIGdpdmVuIGZpZWxkcyBzZXQsIG9yIGJhc2VkIG9uIGZldGNoCisgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaWYgbm8gZmllbGRzIGdpdmVuCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZtcyA9IG1hcHBpbmcuZ2V0RGVmaW5lZEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgU2VsZWN0RXhlY3V0b3IgZXNlbDsKKyAgICAgICAgaW50IGZzZWxkOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gc2tpcCBlYWdlciB0by1tYW55IHNlbGVjdDsgd2UgZG8gdGhhdCBzZXBhcmF0ZWx5IGluIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIG1ldGhvZAorICAgICAgICAgICAgaWYgKGZtc1tpXSA9PSBlYWdlclRvTWFueSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGVhZ2VyIHNlbGVjdAorICAgICAgICAgICAgZXNlbCA9IHNlbC5nZXRFYWdlcihmbXNbaV0pOworICAgICAgICAgICAgaWYgKGVzZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChlc2VsID09IHNlbCkKKyAgICAgICAgICAgICAgICAgICAgZm1zW2ldLnNlbGVjdEVhZ2VySm9pbihzZWwsIHNtLCB0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgCWZldGNoLnRyYXZlcnNlSkRCQyhmbXNbaV0pLCBlYWdlcik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmbXNbaV0uc2VsZWN0RWFnZXJQYXJhbGxlbChlc2VsLCBzbSwgdGhpcywgCisgICAgICAgICAgICAgICAgICAgIAlmZXRjaC50cmF2ZXJzZUpEQkMoZm1zW2ldKSwgZWFnZXIpOworICAgICAgICAgICAgICAgIHNlbGQgPSBNYXRoLm1heCgwLCBzZWxkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZXNTZWxlY3QoZm1zW2ldLCBzbSwgZmllbGRzLCBmZXRjaCkpIHsKKyAgICAgICAgICAgICAgICBmc2VsZCA9IGZtc1tpXS5zZWxlY3Qoc2VsLCBzbSwgdGhpcywgCisgICAgICAgICAgICAgICAgCWZldGNoLnRyYXZlcnNlSkRCQyhmbXNbaV0pLCBlYWdlcik7CisgICAgICAgICAgICAgICAgc2VsZCA9IE1hdGgubWF4KGZzZWxkLCBzZWxkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0U2VsZWN0KGZtc1tpXSwgc2VsLCBzbSwgZmV0Y2gpKSB7CisgICAgICAgICAgICAgICAgZnNlbGQgPSBmbXNbaV0uc2VsZWN0KHNlbCwgc20sIHRoaXMsIAorICAgICAgICAgICAgICAgIAlmZXRjaC50cmF2ZXJzZUpEQkMoZm1zW2ldKSwgZmV0Y2guRUFHRVJfTk9ORSk7CisKKyAgICAgICAgICAgICAgICAvLyBkb24ndCB1cGdyYWRlIHNlbGQgdG8gPiAwIGJhc2VkIG9uIHRoZXNlIGZpZWxkcywgc2luY2UKKyAgICAgICAgICAgICAgICAvLyB0aGV5J3JlIG5vdCBpbiB0aGUgY2FsY3VsYXRlZCBmaWVsZCBzZXQKKyAgICAgICAgICAgICAgICBpZiAoZnNlbGQgPj0gMCAmJiBzZWxkIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBqb2luIHRvIHBhcmVudCB0YWJsZSBpZiB0aGUgcGFyZW50IC8gYW55IGFuY2VzdG9ycyBoYXZlIHNlbGVjdGVkCisgICAgICAgIC8vIGFueXRoaW5nCisgICAgICAgIGlmICgham9pbmVkICYmIHBzZWxkID49IDAgJiYgcGFyZW50LmdldFRhYmxlKCkgIT0gbWFwcGluZy5nZXRUYWJsZSgpKQorICAgICAgICAgICAgc2VsLndoZXJlKG1hcHBpbmcuam9pblN1cGVyY2xhc3Moc2VsLm5ld0pvaW5zKCksIGZhbHNlKSk7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBoaWdoZXN0IHZhbHVlCisgICAgICAgIHJldHVybiBNYXRoLm1heChwc2VsZCwgc2VsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBzZWxlY3RpbmcgZmllbGRlcywgYSBzcGVjaWFsIGNhc2UgaXMgbWFkZSBmb3IgbWFwcGluZ3MgdGhhdCB1c2UKKyAgICAgKiAyLXBhcnQgc2VsZWN0cyB0aGF0IGFyZW4ndCBleHBsaWNpdGx5ICpub3QqIGluIHRoZSBkZmcgc28gdGhhdCB0aGV5CisgICAgICogY2FuIGdldCB0aGVpciBwcmltYXJ5IHRhYmxlIGRhdGEuIFRoaXMgbWV0aG9kIHRlc3RzIGZvciB0aGF0IHNwZWNpYWwKKyAgICAgKiBjYXNlIGFzIGFuIG9wdGltaXphdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3B0U2VsZWN0KEZpZWxkTWFwcGluZyBmbSwgU2VsZWN0IHNlbCwKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICByZXR1cm4gIWZtLmlzSW5EZWZhdWx0RmV0Y2hHcm91cCgpIAorICAgICAgICAgICAgJiYgIWZtLmlzRGVmYXVsdEZldGNoR3JvdXBFeHBsaWNpdCgpCisgICAgICAgICAgICAmJiAoc20gPT0gbnVsbCB8fCBzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5UUkFOU0lFTlQgCisgICAgICAgICAgICB8fCAhc20uZ2V0TG9hZGVkKCkuZ2V0KGZtLmdldEluZGV4KCkpKQorICAgICAgICAgICAgJiYgZm0uc3VwcG9ydHNTZWxlY3Qoc2VsLCBzZWwuVFlQRV9UV09fUEFSVCwgc20sIHRoaXMsIGZldGNoKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IGZpZWxkIG1hcHBpbmdzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGZldGNoIGNvbmZpZ3VyYXRpb24gZm9yCisgICAgICogc3ViY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWwgdGhlIHNlbGVjdCB0byB1c2UKKyAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgdHlwZSB3aG9zZSBzdWJjbGFzc2VzIHRvIHNlbGVjdAorICAgICAqIEBwYXJhbSBzbSB0aGUgaW5zdGFuY2UgYmVpbmcgc2VsZWN0ZWQgZm9yLCBvciBudWxsIGlmIG5vbmUKKyAgICAgKiBAcGFyYW0gZmV0Y2ggdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VsZWN0U3ViY2xhc3NNYXBwaW5ncyhTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBsb2FkU3ViY2xhc3NlcyhtYXBwaW5nKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gc3ViTWFwcGluZ3MgPSBtYXBwaW5nLmdldEpvaW5hYmxlUENTdWJjbGFzc01hcHBpbmdzKCk7CisgICAgICAgIGlmIChzdWJNYXBwaW5ncy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBzZWxlY3QgYWxsIHN1YmNsYXNzIG1hcHBpbmdzIHRoYXQgbWF0Y2ggdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gYW5kIHdob3NlIHRhYmxlIGlzIGluIHRoZSBsaXN0IG9mIHRob3NlIHNlbGVjdGVkIHNvIGZhcjsgdGhpcworICAgICAgICAvLyB3YXkgd2Ugc2VsZWN0IHRoZSBtYXggcG9zc2libGUgd2l0aG91dCBzZWxlY3RpbmcgYW55IHRhYmxlcyB0aGF0CisgICAgICAgIC8vIGFyZW4ndCBwcmVzZW50IGluIGFsbCBwb3NzaWJsZSBxdWVyeSBtYXRjaGVzOyBhIHNwZWNpYWwgY2FzZQorICAgICAgICAvLyBpcyBtYWRlIGZvciBtYXBwaW5ncyB0aGF0IHVzZSAyLXBhcnQgc2VsZWN0cyB0aGF0IGFyZW4ndAorICAgICAgICAvLyBleHBsaWNpdGx5ICpub3QqIGluIHRoZSBkZWZhdWx0IHNvIHRoYXQgdGhleSBjYW4gZ2V0IHRoZWlyCisgICAgICAgIC8vIHByaW1hcnkgdGFibGUgZGF0YQorICAgICAgICBGaWVsZE1hcHBpbmdbXSBmbXM7CisgICAgICAgIGJvb2xlYW4gam9pbmVkOworICAgICAgICBib29sZWFuIGNhbkpvaW4gPSBfZGljdC5qb2luU3ludGF4ICE9IEpvaW5TeW50YXhlcy5TWU5UQVhfVFJBRElUSU9OQUwKKyAgICAgICAgICAgICYmIGZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKG1hcHBpbmcpICE9IGZldGNoLkVBR0VSX05PTkU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViTWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3ViTWFwcGluZ3NbaV0uc3VwcG9ydHNFYWdlclNlbGVjdChzZWwsIHNtLCB0aGlzLCBtYXBwaW5nLAorICAgICAgICAgICAgICAgIGZldGNoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBzbyB0aGF0IGlmIHdlIGNhbid0IGpvaW4sIHdlIHByZXRlbmQgd2UgYWxyZWFkeSBoYXZlCisgICAgICAgICAgICBqb2luZWQgPSAhY2FuSm9pbjsKKyAgICAgICAgICAgIGZtcyA9IHN1Yk1hcHBpbmdzW2ldLmdldERlZmluZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZtcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpbiBvbmUgb2YgY29uZmlndXJlZCBmZXRjaCBncm91cHMKKyAgICAgICAgICAgIAlpZiAoZmV0Y2gucmVxdWlyZXNGZXRjaChmbXNbal0pICE9IEZldGNoQ29uZmlndXJhdGlvbi5GRVRDSF9MT0FECisgICAgICAgICAgICAgICAgICAgICYmICgoIWZtc1tqXS5pc0luRGVmYXVsdEZldGNoR3JvdXAoKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgZm1zW2pdLmlzRGVmYXVsdEZldGNoR3JvdXBFeHBsaWNpdCgpKQorICAgICAgICAgICAgICAgICAgICB8fCBmbXNbal0uc3VwcG9ydHNTZWxlY3Qoc2VsLCBzZWwuVFlQRV9UV09fUEFSVCwgc20sIHRoaXMsIAorICAgICAgICAgICAgICAgICAgICBmZXRjaCkgPD0gMCkpIAorICAgICAgICAgICAgCQljb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiBqb2luIHRvIHRoZSBzdWJjbGFzcywgZG8gc287IG11Y2ggYmV0dGVyIGNoYW5jZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZpZWxkIHdpbGwgYmUgYWJsZSB0byBzZWxlY3QgaXRzZWxmIHdpdGhvdXQgam9pbnMKKyAgICAgICAgICAgICAgICBpZiAoIWpvaW5lZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGpvaW5lZCB3aGV0aGVyIG9yIG5vdCB3ZSBqb2luLCBzbyB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgY29uZGl0aW9ucyBhZ2FpbiBmb3IgdGhpcyBzdWJjbGFzcworICAgICAgICAgICAgICAgICAgICBqb2luZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzZWwud2hlcmUoam9pblN1YmNsYXNzKHNlbCwgbWFwcGluZywgc3ViTWFwcGluZ3NbaV0sIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBjYW4gc2VsZWN0IHdpdGggdGFibGVzIGFscmVhZHkgc2VsZWN0ZWQsIGRvIGl0CisgICAgICAgICAgICAgICAgaWYgKGZtc1tqXS5zdXBwb3J0c1NlbGVjdChzZWwsIHNlbC5UWVBFX0pPSU5MRVNTLCBzbSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2gpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZm1zW2pdLnNlbGVjdChzZWwsIG51bGwsIHRoaXMsIGZldGNoLnRyYXZlcnNlSkRCQyhmbXNbal0pLAorICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2guRUFHRVJfTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGpvaW4gZnJvbSBjbGFzcyB0byBpdHMgc3ViY2xhc3MuIFJlY3Vyc2l2ZSB0byBhbGxvdworICAgICAqIGZvciBtdWx0aXBsZSBob3BzLCBzdGFydGluZyBmcm9tIHRoZSBiYXNlIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEpvaW5zIGpvaW5TdWJjbGFzcyhTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgYmFzZSwKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHN1YiwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgaWYgKHN1YiA9PSBiYXNlIHx8IHN1Yi5nZXRUYWJsZSgpID09IGJhc2UuZ2V0VGFibGUoKQorICAgICAgICAgICAgfHwgc2VsLmlzU2VsZWN0ZWQoc3ViLmdldFRhYmxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gcmVjdXJzZSBmaXJzdCBzbyB3ZSBnbyBsZWFzdC0+bW9zdCBkZXJpdmVkCisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBzdWIuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGpvaW5zID0gam9pblN1YmNsYXNzKHNlbCwgYmFzZSwgc3VwLCBqb2lucyk7CisgICAgICAgIGlmIChqb2lucyA9PSBudWxsKQorICAgICAgICAgICAgam9pbnMgPSBzZWwubmV3Sm9pbnMoKTsKKyAgICAgICAgcmV0dXJuIHN1Yi5qb2luU3VwZXJjbGFzcyhqb2lucywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgc3VyZSBhbGwgc3ViY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBhcmUgbG9hZGVkIGluIHRoZSBKVk0uCisgICAgICogVGhpcyBpcyB1c3VhbGx5IGRvbmUgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkU3ViY2xhc3NlcyhDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICBEaXNjcmltaW5hdG9yIGRzYyA9IG1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvcigpOworICAgICAgICBpZiAoZHNjLmdldFN1YmNsYXNzZXNMb2FkZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBpZiB0aGUgc3ViY2xhc3MgbGlzdCBpcyBzZXQsIG5vIG5lZWQgdG8gbG9hZCBzdWJzCisgICAgICAgIGlmIChtYXBwaW5nLmdldFJlcG9zaXRvcnkoKS5nZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGZhbHNlLAorICAgICAgICAgICAgX2N0eC5nZXRDbGFzc0xvYWRlcigpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBkc2Muc2V0U3ViY2xhc3Nlc0xvYWRlZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkc2MubG9hZFN1YmNsYXNzZXModGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGNuZmUpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIHN0YXRlbWVudCBhIGNhbmRpZGF0ZSBmb3IgY2FuY2VsbGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVFeGVjdXRlU3RhdGVtZW50KFN0YXRlbWVudCBzdG1udCkgeworICAgICAgICBfc3RtbnRzLmFkZChzdG1udCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzdGF0ZW1lbnQgZnJvbSB0aGUgY2FuY2VsbGFibGUgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZnRlckV4ZWN1dGVTdGF0ZW1lbnQoU3RhdGVtZW50IHN0bW50KSB7CisgICAgICAgIF9zdG1udHMucmVtb3ZlKHN0bW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9uIHJldHVybmVkIHRvIGNsaWVudCBjb2RlLiBNYWtlcyBzdXJlIGl0cyB3cmFwcGVkIGNvbm5lY3Rpb24KKyAgICAgKiByZWYgY291bnQgaXMgZGVjcmVtZW50ZWQgb24gZmluYWxpemUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIERlbGVnYXRpbmdDb25uZWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2Nsb3NlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBDbGllbnRDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubikgeworICAgICAgICAgICAgc3VwZXIoY29ubik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX2Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghX2Nsb3NlZCkKKyAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdGlvbiB3cmFwcGVyIHRoYXQga2VlcHMgYW4gaW50ZXJuYWwgcmVmIGNvdW50IHNvIHRoYXQgaXQga25vd3MKKyAgICAgKiB3aGVuIHRvIHJlYWxseSBjbG9zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgUmVmQ291bnRDb25uZWN0aW9uIGV4dGVuZHMgRGVsZWdhdGluZ0Nvbm5lY3Rpb24geworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfcmV0YWluID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgaW50IF9yZWZzID0gMDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9mcmVlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBSZWZDb3VudENvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgICAgICBzdXBlcihjb25uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFJldGFpbigpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmV0YWluOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmV0YWluKGJvb2xlYW4gcmV0YWluKSB7CisgICAgICAgICAgICBpZiAoX3JldGFpbiAmJiAhcmV0YWluICYmIF9yZWZzIDw9IDApCisgICAgICAgICAgICAgICAgZnJlZSgpOworICAgICAgICAgICAgX3JldGFpbiA9IHJldGFpbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZigpIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGhhdmUgdG8gbG9jazsgY2FsbGVkIGZyb20gY29ubmVjdCgpLCB3aGljaCBpcyBsb2NrZWQKKyAgICAgICAgICAgIF9yZWZzKys7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgLy8gbG9jayBhdCBicm9rZXIgbGV2ZWwgdG8gYXZvaWQgZGVhZGxvY2tzCisgICAgICAgICAgICBfY3R4LmxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3JlZnMtLTsKKyAgICAgICAgICAgICAgICBpZiAoX3JlZnMgPD0gMCAmJiAhX3JldGFpbikKKyAgICAgICAgICAgICAgICAgICAgZnJlZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfY3R4LnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZnJlZSgpIHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvIG5vdCBjbG9zZSB0aGUgdW5kZXJseWluZyBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lczsgdGhpcyBjb3VsZCBoYXBwZW4gaWYgc29tZW9uZSAoZS5nLiwgYW4KKyAgICAgICAgICAgIC8vIEV4dGVudCkgaG9sZHMgYSBSZWZDb25uZWN0aW9uLCBhbmQgdGhlbiBjbG9zZXMgaXQgKGUuZy4sIGluCisgICAgICAgICAgICAvLyB0aGUgZmluYWxpemVyKSBhZnRlciB0aGUgU3RvcmVNYW5hZ2VyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgICAgICAgICAgaWYgKF9mcmVlZCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2V0RGVsZWdhdGUoKS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZnJlZWQgPSB0cnVlOworICAgICAgICAgICAgX2Nvbm4gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsU3RhdGVtZW50KHN1cGVyLmNyZWF0ZVN0YXRlbWVudChmYWxzZSksCisgICAgICAgICAgICAgICAgUmVmQ291bnRDb25uZWN0aW9uLnRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoaW50IHJzVHlwZSwgaW50IHJzQ29uY3VyLAorICAgICAgICAgICAgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsU3RhdGVtZW50KHN1cGVyLmNyZWF0ZVN0YXRlbWVudChyc1R5cGUsIHJzQ29uY3VyLAorICAgICAgICAgICAgICAgIGZhbHNlKSwgUmVmQ291bnRDb25uZWN0aW9uLnRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhbmNlbFByZXBhcmVkU3RhdGVtZW50KHN1cGVyLnByZXBhcmVTdGF0ZW1lbnQoc3FsLAorICAgICAgICAgICAgICAgIGZhbHNlKSwgUmVmQ291bnRDb25uZWN0aW9uLnRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgaW50IHJzVHlwZSwKKyAgICAgICAgICAgIGludCByc0NvbmN1ciwgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsUHJlcGFyZWRTdGF0ZW1lbnQoc3VwZXIucHJlcGFyZVN0YXRlbWVudChzcWwsCisgICAgICAgICAgICAgICAgcnNUeXBlLCByc0NvbmN1ciwgZmFsc2UpLCBSZWZDb3VudENvbm5lY3Rpb24udGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZW1lbnQgdHlwZSB0aGF0IGFkZHMgYW5kIHJlbW92ZXMgaXRzZWxmIGZyb20gdGhlIHNldCBvZiBhY3RpdmUKKyAgICAgKiBzdGF0ZW1lbnRzIHNvIHRoYXQgaXQgY2FuIGJlIGNhbmNlbGVkLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQ2FuY2VsU3RhdGVtZW50IGV4dGVuZHMgRGVsZWdhdGluZ1N0YXRlbWVudCB7CisKKyAgICAgICAgcHVibGljIENhbmNlbFN0YXRlbWVudChTdGF0ZW1lbnQgc3RtbnQsIENvbm5lY3Rpb24gY29ubikgeworICAgICAgICAgICAgc3VwZXIoc3RtbnQsIGNvbm4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgYmVmb3JlRXhlY3V0ZVN0YXRlbWVudCh0aGlzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVVcGRhdGUoc3FsKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgYWZ0ZXJFeGVjdXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBiZWZvcmVFeGVjdXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZVF1ZXJ5KHNxbCwgd3JhcCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGFmdGVyRXhlY3V0ZVN0YXRlbWVudCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXRlbWVudCB0eXBlIHRoYXQgYWRkcyBhbmQgcmVtb3ZlcyBpdHNlbGYgZnJvbSB0aGUgc2V0IG9mIGFjdGl2ZQorICAgICAqIHN0YXRlbWVudHMgc28gdGhhdCBpdCBjYW4gYmUgY2FuY2VsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBDYW5jZWxQcmVwYXJlZFN0YXRlbWVudCBleHRlbmRzIERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudCB7CisKKyAgICAgICAgcHVibGljIENhbmNlbFByZXBhcmVkU3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCAKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubikgeworICAgICAgICAgICAgc3VwZXIoc3RtbnQsIGNvbm4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBiZWZvcmVFeGVjdXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBhZnRlckV4ZWN1dGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeShib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgYmVmb3JlRXhlY3V0ZVN0YXRlbWVudCh0aGlzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVRdWVyeSh3cmFwKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgYWZ0ZXJFeGVjdXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludFtdIGV4ZWN1dGVCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgYmVmb3JlRXhlY3V0ZVN0YXRlbWVudCh0aGlzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVCYXRjaCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBhZnRlckV4ZWN1dGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9KREJDU3RvcmVRdWVyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ1N0b3JlUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU0NGJmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvSkRCQ1N0b3JlUXVlcnkuamF2YQpAQCAtMCwwICsxLDY0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxpZmVjeWNsZUV2ZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5FeHBDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkdldENvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5KREJDRXhwcmVzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHMuSkRCQ1N0cmluZ0NvbnRhaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkpEQkNXaWxkY2FyZE1hdGNoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLlF1ZXJ5RXhwcmVzc2lvbnNTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5TUUxFbWJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5TUUxFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLlNRTFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlZlcnRpY2FsQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5FeHByZXNzaW9uU3RvcmVRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9yZGVyaW5nTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUhpbnRzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlF1ZXJ5RXhwcmVzc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIEpEQkMgcXVlcnkgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEpEQkNTdG9yZVF1ZXJ5IAorICAgIGV4dGVuZHMgRXhwcmVzc2lvblN0b3JlUXVlcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFibGUgSU5WQUxJRCA9IG5ldyBUYWJsZSgpOworCisgICAgLy8gYWRkIGFsbCBzdGFuZGFyZCBmaWx0ZXIgYW5kIGFnZ3JlZ2F0ZSBsaXN0ZW5lcnMgdG8gdGhlc2UgbWFwcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBfbGlzdGVuZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIGRlcHJlY2F0ZWQgZXh0ZW5zaW9ucworICAgICAgICBfbGlzdGVuZXJzLnB1dChKREJDU3RyaW5nQ29udGFpbnMuVEFHLCBuZXcgSkRCQ1N0cmluZ0NvbnRhaW5zKCkpOworICAgICAgICBfbGlzdGVuZXJzLnB1dChKREJDV2lsZGNhcmRNYXRjaC5UQUcsIG5ldyBKREJDV2lsZGNhcmRNYXRjaCgpKTsKKyAgICAgICAgX2xpc3RlbmVycy5wdXQoU1FMRXhwcmVzc2lvbi5UQUcsIG5ldyBTUUxFeHByZXNzaW9uKCkpOworICAgICAgICBfbGlzdGVuZXJzLnB1dChTUUxWYWx1ZS5UQUcsIG5ldyBTUUxWYWx1ZSgpKTsKKworICAgICAgICAvLyBqZGJjLXNwZWNpZmljIGV4dGVuc2lvbnMKKyAgICAgICAgX2xpc3RlbmVycy5wdXQoR2V0Q29sdW1uLlRBRywgbmV3IEdldENvbHVtbigpKTsKKyAgICAgICAgX2xpc3RlbmVycy5wdXQoU1FMRW1iZWQuVEFHLCBuZXcgU1FMRW1iZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB0cmFuc2llbnQgSkRCQ1N0b3JlIF9zdG9yZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgc3RvcmUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ1N0b3JlUXVlcnkoSkRCQ1N0b3JlIHN0b3JlLCBFeHByZXNzaW9uUGFyc2VyIHBhcnNlcikgeworICAgICAgICBzdXBlcihwYXJzZXIpOworICAgICAgICBfc3RvcmUgPSBzdG9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBKREJDU3RvcmUgZ2V0U3RvcmUoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmU7CisgICAgfQorCisgICAgcHVibGljIEZpbHRlckxpc3RlbmVyIGdldEZpbHRlckxpc3RlbmVyKFN0cmluZyB0YWcpIHsKKyAgICAgICAgcmV0dXJuIChGaWx0ZXJMaXN0ZW5lcikgX2xpc3RlbmVycy5nZXQodGFnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0NvbXBpbGF0aW9uS2V5KCkgeworICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoID0gKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24pIGN0eAorICAgICAgICAgICAgLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGZldGNoLmdldEpvaW5TeW50YXgoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEYXRhU3RvcmVFeGVjdXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhW10gZ2V0SW5kZXBlbmRlbnRFeHByZXNzaW9uQ2FuZGlkYXRlcygKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIHN1YmNsYXNzZXMpIHsKKyAgICAgICAgaWYgKCFzdWJjbGFzc2VzKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc01hcHBpbmdbXSB7IChDbGFzc01hcHBpbmcpIG1ldGEgfTsKKyAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nKSBtZXRhKS5nZXRJbmRlcGVuZGVudEFzc2lnbmFibGVNYXBwaW5ncygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uRmFjdG9yeSBnZXRFeHByZXNzaW9uRmFjdG9yeShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKREJDRXhwcmVzc2lvbkZhY3RvcnkoKENsYXNzTWFwcGluZykgbWV0YSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVRdWVyeShFeGVjdXRvciBleCwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBiYXNlLCBDbGFzc01ldGFEYXRhW10gbWV0YXMsIGJvb2xlYW4gc3ViY2xhc3NlcywKKyAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnlbXSBmYWN0cywgUXVlcnlFeHByZXNzaW9uc1tdIGV4cHMsIE9iamVjdFtdIHBhcmFtcywKKyAgICAgICAgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgaWYgKG1ldGFzLmxlbmd0aCA+IDEgJiYgZXhwc1swXS5pc0FnZ3JlZ2F0ZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oTG9jYWxpemVyLmZvclBhY2thZ2UoSkRCQ1N0b3JlUXVlcnkuY2xhc3MpLgorICAgICAgICAgICAgICAgIGdldCgibXVsdC1tYXBwaW5nLWFnZ3JlZ2F0ZSIsIEFycmF5cy5hc0xpc3QobWV0YXMpKSk7CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3MgPSAoQ2xhc3NNYXBwaW5nW10pIG1ldGFzOworICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoID0gKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24pIAorICAgICAgICAgICAgY3R4LmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoZXhwc1swXS5mZXRjaFBhdGhzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZldGNoLmFkZEZpZWxkcyhBcnJheXMuYXNMaXN0KGV4cHNbMF0uZmV0Y2hQYXRocykpOworICAgICAgICAgICAgZmV0Y2guYWRkSm9pbnMoQXJyYXlzLmFzTGlzdChleHBzWzBdLmZldGNoUGF0aHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBlYWdlciA9IGNhbGN1bGF0ZUVhZ2VyTW9kZShleHBzWzBdLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKKyAgICAgICAgaW50IHN1YmNsYXNzTW9kZSA9IGZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKChDbGFzc01hcHBpbmcpIGJhc2UpOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IF9zdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IChtYXBwaW5ncy5sZW5ndGggPT0gMSAmJiBkaWN0LnN1cHBvcnRzU2VsZWN0U3RhcnRJbmRleCkgCisgICAgICAgICAgICA/IHJhbmdlLnN0YXJ0IDogMEw7CisgICAgICAgIGxvbmcgZW5kID0gKGRpY3Quc3VwcG9ydHNTZWxlY3RFbmRJbmRleCkgPyByYW5nZS5lbmQgOiBMb25nLk1BWF9WQUxVRTsKKworICAgICAgICBRdWVyeUV4cHJlc3Npb25zU3RhdGVbXSBzdGF0ZXMgPSBuZXcgUXVlcnlFeHByZXNzaW9uc1N0YXRlW2V4cHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBzdGF0ZXNbaV0gPSBuZXcgUXVlcnlFeHByZXNzaW9uc1N0YXRlKCk7CisgICAgICAgIEV4cENvbnRleHQgY3R4ID0gbmV3IEV4cENvbnRleHQoX3N0b3JlLCBwYXJhbXMsIGZldGNoKTsKKworICAgICAgICAvLyBhZGQgc2VsZWN0cyB3aXRoIHBvcHVsYXRlIFdIRVJFIGNvbmRpdGlvbnMgdG8gbGlzdAorICAgICAgICBMaXN0IHNlbHMgPSBuZXcgQXJyYXlMaXN0KG1hcHBpbmdzLmxlbmd0aCk7CisgICAgICAgIExpc3Qgc2VsTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0KG1hcHBpbmdzLmxlbmd0aCk7CisgICAgICAgIEJpdFNldCBzdWJjbGFzc0JpdHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIEJpdFNldCBuZXh0Qml0cyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgYm9vbGVhbiB1bmlvbmFibGUgPSBjcmVhdGVXaGVyZVNlbGVjdHMoc2VscywgbWFwcGluZ3MsIHNlbE1hcHBpbmdzLAorICAgICAgICAgICAgc3ViY2xhc3Nlcywgc3ViY2xhc3NCaXRzLCBuZXh0Qml0cywgZmFjdHMsIGV4cHMsIHN0YXRlcywgY3R4LAorICAgICAgICAgICAgc3ViY2xhc3NNb2RlKQorICAgICAgICAgICAgJiYgc3ViY2xhc3NNb2RlID09IEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTgorICAgICAgICAgICAgJiYgc3RhcnQgPT0gMAorICAgICAgICAgICAgJiYgZW5kID09IExvbmcuTUFYX1ZBTFVFOworCisgICAgICAgIC8vIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIGxycyBzZXR0aW5ncyBpZiB3ZSBjYW4ndCB1c2UgdGhlIHJhbmdlCisgICAgICAgIGlmIChzZWxzLnNpemUoKSA+IDEpCisgICAgICAgICAgICBzdGFydCA9IDBMOworICAgICAgICBib29sZWFuIGxycyA9IHJhbmdlLmxycyB8fCAoZmV0Y2guZ2V0RmV0Y2hCYXRjaFNpemUoKSA+PSAwIAorICAgICAgICAgICAgJiYgKHN0YXJ0ICE9IHJhbmdlLnN0YXJ0IHx8IGVuZCAhPSByYW5nZS5lbmQpKTsKKworICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlcltdIHJvcHMgPSBudWxsOworICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlciByb3AgPSBudWxsOworICAgICAgICBpZiAodW5pb25hYmxlKSB7CisgICAgICAgICAgICBVbmlvbiB1bmlvbiA9IF9zdG9yZS5nZXRTUUxGYWN0b3J5KCkubmV3VW5pb24oCisgICAgICAgICAgICAgICAgKFNlbGVjdFtdKSBzZWxzLnRvQXJyYXkobmV3IFNlbGVjdFtzZWxzLnNpemUoKV0pKTsKKyAgICAgICAgICAgIEJpdFNldFtdIHBhZ2VkID0gcG9wdWxhdGVVbmlvbih1bmlvbiwgbWFwcGluZ3MsIHN1YmNsYXNzZXMsIGZhY3RzLAorICAgICAgICAgICAgICAgIGV4cHMsIHN0YXRlcywgY3R4LCBscnMsIGVhZ2VyLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIHVuaW9uLnNldExSUyhscnMpOworICAgICAgICAgICAgcm9wID0gZXhlY3V0ZVVuaW9uKHVuaW9uLCBtYXBwaW5ncywgZXhwcywgc3RhdGVzLCBjdHgsIHBhZ2VkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzZWxzLnNpemUoKSA+IDEpCisgICAgICAgICAgICAgICAgcm9wcyA9IG5ldyBSZXN1bHRPYmplY3RQcm92aWRlcltzZWxzLnNpemUoKV07CisKKyAgICAgICAgICAgIFNlbGVjdCBzZWw7CisgICAgICAgICAgICBCaXRTZXQgcGFnZWQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IHNlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzZWwgPSAoU2VsZWN0KSBzZWxzLmdldChpKTsKKyAgICAgICAgICAgICAgICBwYWdlZCA9IHBvcHVsYXRlU2VsZWN0KHNlbCwgKENsYXNzTWFwcGluZykgc2VsTWFwcGluZ3MuZ2V0KGkpLAorICAgICAgICAgICAgICAgICAgICBzdWJjbGFzc0JpdHMuZ2V0KGkpLCAoSkRCQ0V4cHJlc3Npb25GYWN0b3J5KSBmYWN0c1tpZHhdLAorICAgICAgICAgICAgICAgICAgICBleHBzW2lkeF0sIHN0YXRlc1tpZHhdLCBjdHgsIGxycywgZWFnZXIsIHN0YXJ0LCBlbmQpOworCisgICAgICAgICAgICAgICAgcm9wID0gZXhlY3V0ZVNlbGVjdChzZWwsIChDbGFzc01hcHBpbmcpIHNlbE1hcHBpbmdzLmdldChpKSwKKyAgICAgICAgICAgICAgICAgICAgZXhwc1tpZHhdLCBzdGF0ZXNbaWR4XSwgY3R4LCBwYWdlZCwgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcm9wc1tpXSA9IHJvcDsKKworICAgICAgICAgICAgICAgIGlmIChuZXh0Qml0cy5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgIGlkeCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGV4cHNbMF0uYXNjZW5kaW5nLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJvcCA9IG5ldyBNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlcihyb3BzKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJvcCA9IG5ldyBPcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyKHJvcHMsCisgICAgICAgICAgICAgICAgICAgIGV4cHNbMF0uYXNjZW5kaW5nLCBleCwgdGhpcywgcGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5lZWQgdG8gZmFrZSByZXN1bHQgcmFuZ2U/CisgICAgICAgIGlmICgocm9wcyAhPSBudWxsICYmIHJhbmdlLmVuZCAhPSBMb25nLk1BWF9WQUxVRSkgCisgICAgICAgICAgICB8fCBzdGFydCAhPSByYW5nZS5zdGFydCB8fCBlbmQgIT0gcmFuZ2UuZW5kKQorICAgICAgICAgICAgcm9wID0gbmV3IFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIocm9wLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKKyAgICAgICAgcmV0dXJuIHJvcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgZGF0YSBmb3IgdGhlIGdpdmVuIHVuaW9uLCByZXR1cm5pbmcgcGFnZWQgZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgQml0U2V0W10gcG9wdWxhdGVVbmlvbihVbmlvbiB1bmlvbiwgZmluYWwgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3ViY2xhc3NlcywgZmluYWwgRXhwcmVzc2lvbkZhY3RvcnlbXSBmYWN0cywKKyAgICAgICAgZmluYWwgUXVlcnlFeHByZXNzaW9uc1tdIGV4cHMsIGZpbmFsIFF1ZXJ5RXhwcmVzc2lvbnNTdGF0ZVtdIHN0YXRlcywKKyAgICAgICAgZmluYWwgRXhwQ29udGV4dCBjdHgsIGZpbmFsIGJvb2xlYW4gbHJzLCBmaW5hbCBpbnQgZWFnZXIsCisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQsIGZpbmFsIGxvbmcgZW5kKSB7CisgICAgICAgIGZpbmFsIEJpdFNldFtdIHBhZ2VkID0gKGV4cHNbMF0ucHJvamVjdGlvbnMubGVuZ3RoID4gMCkgPyBudWxsCisgICAgICAgICAgICA6IG5ldyBCaXRTZXRbbWFwcGluZ3MubGVuZ3RoXTsKKyAgICAgICAgdW5pb24uc2VsZWN0KG5ldyBVbmlvbi5TZWxlY3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgQml0U2V0IGJpdHMgPSBwb3B1bGF0ZVNlbGVjdChzZWwsIG1hcHBpbmdzW2lkeF0sIHN1YmNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgIChKREJDRXhwcmVzc2lvbkZhY3RvcnkpIGZhY3RzW2lkeF0sIGV4cHNbaWR4XSwgc3RhdGVzW2lkeF0sCisgICAgICAgICAgICAgICAgICAgIGN0eCwgIGxycywgZWFnZXIsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgICAgIGlmIChwYWdlZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwYWdlZFtpZHhdID0gYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwYWdlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgZGF0YSBmb3IgdGhlIGdpdmVuIHNlbGVjdCwgcmV0dXJuaW5nIHBhZ2VkIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJpdFNldCBwb3B1bGF0ZVNlbGVjdChTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgYm9vbGVhbiBzdWJjbGFzc2VzLCBKREJDRXhwcmVzc2lvbkZhY3RvcnkgZmFjdCwgUXVlcnlFeHByZXNzaW9ucyBleHBzLAorICAgICAgICBRdWVyeUV4cHJlc3Npb25zU3RhdGUgc3RhdGUsIEV4cENvbnRleHQgY3R4LCBib29sZWFuIGxycywgaW50IGVhZ2VyLAorICAgICAgICBsb25nIHN0YXJ0LCBsb25nIGVuZCkgeworICAgICAgICBzZWwuc2V0TFJTKGxycyk7CisgICAgICAgIHNlbC5zZXRSYW5nZShzdGFydCwgZW5kKTsKKworICAgICAgICBCaXRTZXQgcGFnZWQgPSBudWxsOworICAgICAgICBpZiAoZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcGFnZWQgPSBQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlci5nZXRQYWdlZEZpZWxkcyhzZWwsIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgX3N0b3JlLCBjdHguZmV0Y2gsIGVhZ2VyLCBlbmQgLSBzdGFydCk7CisgICAgICAgICAgICBpZiAocGFnZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlYWdlciA9IEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTjsKKyAgICAgICAgfQorCisgICAgICAgIGZhY3QuZ2V0U2VsZWN0Q29uc3RydWN0b3IoKS5zZWxlY3Qoc2VsLCBjdHgsIG1hcHBpbmcsIHN1YmNsYXNzZXMsIGV4cHMsCisgICAgICAgICAgICBzdGF0ZSwgZWFnZXIpOworICAgICAgICByZXR1cm4gcGFnZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgZ2l2ZW4gdW5pb24uCisgICAgICovCisgICAgcHJpdmF0ZSBSZXN1bHRPYmplY3RQcm92aWRlciBleGVjdXRlVW5pb24oVW5pb24gdW5pb24sCisgICAgICAgIENsYXNzTWFwcGluZ1tdIG1hcHBpbmdzLCBRdWVyeUV4cHJlc3Npb25zW10gZXhwcywgCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNTdGF0ZVtdIHN0YXRlcywgRXhwQ29udGV4dCBjdHgsIEJpdFNldFtdIHBhZ2VkKSB7CisgICAgICAgIGlmIChleHBzWzBdLnByb2plY3Rpb25zLmxlbmd0aCA+IDApCisgICAgICAgICAgICByZXR1cm4gbmV3IFByb2plY3Rpb25SZXN1bHRPYmplY3RQcm92aWRlcih1bmlvbiwgZXhwcywgc3RhdGVzLCBjdHgpOworCisgICAgICAgIGlmIChwYWdlZCAhPSBudWxsKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocGFnZWRbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlcih1bmlvbiwgbWFwcGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBfc3RvcmUsIGN0eC5mZXRjaCwgcGFnZWQsIExvbmcuTUFYX1ZBTFVFKTsKKworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlUmVzdWx0T2JqZWN0UHJvdmlkZXIodW5pb24sIG1hcHBpbmdzWzBdLCBfc3RvcmUsCisgICAgICAgICAgICBjdHguZmV0Y2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIGdpdmVuIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVTZWxlY3QoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgUXVlcnlFeHByZXNzaW9uc1N0YXRlIHN0YXRlLCBFeHBDb250ZXh0IGN0eCwgCisgICAgICAgIEJpdFNldCBwYWdlZCwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgaWYgKGV4cHMucHJvamVjdGlvbnMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgUHJvamVjdGlvblJlc3VsdE9iamVjdFByb3ZpZGVyKHNlbCwgZXhwcywgc3RhdGUsIGN0eCk7CisgICAgICAgIGlmIChwYWdlZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlcihzZWwsIG1hcHBpbmcsIF9zdG9yZSwgCisgICAgICAgICAgICAgICAgY3R4LmZldGNoLCBwYWdlZCwgZW5kIC0gc3RhcnQpOworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlUmVzdWx0T2JqZWN0UHJvdmlkZXIoc2VsLCBtYXBwaW5nLCBfc3RvcmUsIAorICAgICAgICAgICAgY3R4LmZldGNoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgc2VsZWN0cyB3aXRoIFdIRVJFIGNvbmRpdGlvbnMgbmVlZGVkIHRvIGV4ZWN1dGUgdGhlIHF1ZXJ5CisgICAgICogZm9yIHRoZSBnaXZlbiBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlV2hlcmVTZWxlY3RzKExpc3Qgc2VscywgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3MsCisgICAgICAgIExpc3Qgc2VsTWFwcGluZ3MsIGJvb2xlYW4gc3ViY2xhc3NlcywgQml0U2V0IHN1YmNsYXNzQml0cywKKyAgICAgICAgQml0U2V0IG5leHRCaXRzLCBFeHByZXNzaW9uRmFjdG9yeVtdIGZhY3RzLCBRdWVyeUV4cHJlc3Npb25zW10gZXhwcywKKyAgICAgICAgUXVlcnlFeHByZXNzaW9uc1N0YXRlW10gc3RhdGVzLCBFeHBDb250ZXh0IGN0eCwgaW50IHN1YmNsYXNzTW9kZSkgeworICAgICAgICBOdW1iZXIgb3B0SGludCA9IChOdW1iZXIpIGN0eC5mZXRjaC5nZXRIaW50CisgICAgICAgICAgICAoUXVlcnlIaW50cy5ISU5UX1JFU1VMVF9DT1VOVCk7CisgICAgICAgIENsYXNzTWFwcGluZ1tdIHZlcnRzOworICAgICAgICBib29sZWFuIHVuaW9uYWJsZSA9IHRydWU7CisgICAgICAgIFNlbGVjdCBzZWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGRldGVybWluZSB2ZXJ0aWNhbCBtYXBwaW5ncyB0byBzZWxlY3Qgc2VwYXJhdGVseQorICAgICAgICAgICAgdmVydHMgPSBnZXRWZXJ0aWNhbE1hcHBpbmdzKG1hcHBpbmdzW2ldLCBzdWJjbGFzc2VzLCBleHBzW2ldLAorICAgICAgICAgICAgICAgIHN1YmNsYXNzTW9kZSk7CisgICAgICAgICAgICBpZiAodmVydHMubGVuZ3RoID09IDEgJiYgc3ViY2xhc3NlcykKKyAgICAgICAgICAgICAgICBzdWJjbGFzc0JpdHMuc2V0KHNlbHMuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGNyaXRlcmlhIHNlbGVjdCBhbmQgY2xvbmUgZm9yIGVhY2ggdmVydCBtYXBwaW5nCisgICAgICAgICAgICBzZWwgPSAoKEpEQkNFeHByZXNzaW9uRmFjdG9yeSkgZmFjdHNbaV0pLmdldFNlbGVjdENvbnN0cnVjdG9yKCkuCisgICAgICAgICAgICAgICAgZXZhbHVhdGUoY3R4LCBudWxsLCBudWxsLCBleHBzW2ldLCBzdGF0ZXNbaV0pOworICAgICAgICAgICAgaWYgKG9wdEhpbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgIHNlbC5zZXRFeHBlY3RlZFJlc3VsdENvdW50KG9wdEhpbnQuaW50VmFsdWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmN0eC5pc1VuaXF1ZSgpKQorICAgICAgICAgICAgICAgIHNlbC5zZXRFeHBlY3RlZFJlc3VsdENvdW50KDEsIGZhbHNlKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmVydHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzZWxNYXBwaW5ncy5hZGQodmVydHNbal0pOworICAgICAgICAgICAgICAgIGlmIChqID09IHZlcnRzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEJpdHMuc2V0KHNlbHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vscy5hZGQoc2VsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2Vscy5hZGQoc2VsLmZ1bGxDbG9uZSgxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHVuaW9uaW5nIGlmIGEgZ2l2ZW4gaW5kZXBlbmRlbnQgbWFwcGluZyByZXF1aXJlcworICAgICAgICAgICAgLy8gbXVsdGlwbGUgc2VsZWN0cywgb3IgaWYgd2UncmUgdXNpbmcgRlJPTSBzZWxlY3RzCisgICAgICAgICAgICBpZiAodmVydHMubGVuZ3RoID4gMSB8fCBzZWwuZ2V0RnJvbVNlbGVjdCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdW5pb25hYmxlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVuaW9uYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHRoZSB2ZXJ0aWNhbCBtYXBwaW5ncyB0byBzZWxlY3Qgc2VwYXJhdGVseS4gRGVwZW5kcyBvbgorICAgICAqIHN1YmNsYXNzIGZldGNoIG1vZGUgYW5kIHRoZSB0eXBlIG9mIHF1ZXJ5LgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NNYXBwaW5nW10gZ2V0VmVydGljYWxNYXBwaW5ncyhDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgYm9vbGVhbiBzdWJjbGFzc2VzLCBRdWVyeUV4cHJlc3Npb25zIGV4cHMsIGludCBzdWJjbGFzc01vZGUpIHsKKyAgICAgICAgaWYgKCFzdWJjbGFzc2VzIHx8IGV4cHMucHJvamVjdGlvbnMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NNYXBwaW5nW10geyBtYXBwaW5nIH07CisKKyAgICAgICAgaWYgKHN1YmNsYXNzTW9kZSAhPSBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX1BBUkFMTEVMCisgICAgICAgICAgICB8fCAhaGFzVmVydGljYWxTdWJjbGFzc2VzKG1hcHBpbmcpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc01hcHBpbmdbXSB7IG1hcHBpbmcgfTsKKworICAgICAgICBMaXN0IHN1YnMgPSBuZXcgQXJyYXlMaXN0KDQpOworICAgICAgICBhZGRTdWJjbGFzc2VzKG1hcHBpbmcsIHN1YnMpOworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZ1tdKSBzdWJzLnRvQXJyYXkobmV3IENsYXNzTWFwcGluZ1tzdWJzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZSBoZWxwZXIgdG8gYWRkIG1hcHBpbmdzIGZvciBzdWJjbGFzc2VzIHRvIHRoZSBnaXZlbiBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTdWJjbGFzc2VzKENsYXNzTWFwcGluZyBtYXBwaW5nLCBDb2xsZWN0aW9uIHN1YnMpIHsKKyAgICAgICAgLy8gcG9zc2libGUgZnV0dXJlIG9wdGltaXphdGlvbnM6CisgICAgICAgIC8vIC0gaWYgbm8gZmllbGRzIGluIG1ldGEgb3IgaXRzIHN1YmNsYXNzZXMgKGFuZCBub3QgaW4gYW4KKyAgICAgICAgLy8gICBhbHJlYWR5LXNlbGVjdGVkIHRhYmxlKSBhcmUgaW4gdGhlIGN1cnJlbnQgZmV0Y2gKKyAgICAgICAgLy8gICBjb25maWd1cmF0aW9uLCBzdG9wIGNyZWF0aW5nIG5ldyBleGVjdXRvcnMKKyAgICAgICAgLy8gLSBhbGxvdyBhbiBleGVjdXRvciB0byBzZWxlY3QgYSByYW5nZSBvZiBzdWJjbGFzc2VzLCByYXRoZXIKKyAgICAgICAgLy8gICB0aGFuIGp1c3QgYWxsIHN1YmNsYXNzZXMgLyBubyBzdWJjbGFzc2VzOyB0aGlzIHdvdWxkCisgICAgICAgIC8vICAgYWxsb3cgdXMgdG8gZG8ganVzdCBvbmUgcXVlcnkgcGVyIGFjdHVhbCB2ZXJ0aWNhbGx5LW1hcHBlZAorICAgICAgICAvLyAgIHN1YmNsYXNzLCByYXRoZXIgdGhhbiBvbmUgcGVyIG1hcHBlZCBzdWJjbGFzcywgYXMgaXMgaGFwcGVuaW5nIG5vdworCisgICAgICAgIHN1YnMuYWRkKG1hcHBpbmcpOworICAgICAgICBpZiAoIWhhc1ZlcnRpY2FsU3ViY2xhc3NlcyhtYXBwaW5nKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyByZWN1cnNlIG9uIGltbWVkaWF0ZSBzdWJjbGFzc2VzCisgICAgICAgIENsYXNzTWFwcGluZ1tdIHN1Yk1hcHBpbmdzID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3ViY2xhc3NNYXBwaW5ncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1Yk1hcHBpbmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHN1Yk1hcHBpbmdzW2ldLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpID09IG1hcHBpbmcpCisgICAgICAgICAgICAgICAgYWRkU3ViY2xhc3NlcyhzdWJNYXBwaW5nc1tpXSwgc3Vicyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGNsYXNzIGhhcyBhbnkgdmVydGljYWwgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1ZlcnRpY2FsU3ViY2xhc3NlcyhDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICBDbGFzc01hcHBpbmdbXSBzdWJzID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3ViY2xhc3NNYXBwaW5ncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoc3Vic1tpXS5nZXRTdHJhdGVneSgpIGluc3RhbmNlb2YgVmVydGljYWxDbGFzc1N0cmF0ZWd5KQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVhZ2VyIG1vZGUgZGVwZW5kcyBvbiB0aGUgdW5pcXVlIHNldHRpbmcgYW5kIHJhbmdlLiBJZiB0aGUgcmFuZ2UKKyAgICAgKiBwcm9kdWNlcyAwIHJlc3VsdHMsIHVzZSBlYWdlciBzZXR0aW5nIG9mIG5vbmUuIElmIGl0IHByb2R1Y2VzIDEgcmVzdWx0CisgICAgICogb3IgdGhlIHF1ZXJ5IGlzIHVuaXF1ZSwgdXNlIGFuIGVhZ2VyIHNldHRpbmcgb2Ygc2luZ2xlLiBPdGhlcndpc2UgdXNlCisgICAgICogYW4gZWFnZXIgbW9kZSBvZiBtdWx0aXBsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjYWxjdWxhdGVFYWdlck1vZGUoUXVlcnlFeHByZXNzaW9ucyBleHBzLCBsb25nIHN0YXJ0LAorICAgICAgICBsb25nIGVuZCkgeworICAgICAgICBpZiAoZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGggPiAwIHx8IHN0YXJ0ID49IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBFYWdlckZldGNoTW9kZXMuRUFHRVJfTk9ORTsKKyAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID09IDEgfHwgY3R4LmlzVW5pcXVlKCkpCisgICAgICAgICAgICByZXR1cm4gRWFnZXJGZXRjaE1vZGVzLkVBR0VSX0pPSU47CisgICAgICAgIHJldHVybiBFYWdlckZldGNoTW9kZXMuRUFHRVJfUEFSQUxMRUw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciBleGVjdXRlRGVsZXRlKEV4ZWN1dG9yIGV4LCBDbGFzc01ldGFEYXRhIGJhc2UsCisgICAgICAgIENsYXNzTWV0YURhdGFbXSBtZXRhcywgYm9vbGVhbiBzdWJjbGFzc2VzLCBFeHByZXNzaW9uRmFjdG9yeVtdIGZhY3RzLAorICAgICAgICBRdWVyeUV4cHJlc3Npb25zW10gZXhwcywgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBleGVjdXRlQnVsa09wZXJhdGlvbihleCwgYmFzZSwgbWV0YXMsIHN1YmNsYXNzZXMsIGZhY3RzLCBleHBzLAorICAgICAgICAgICAgcGFyYW1zLCBudWxsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGV4ZWN1dGVVcGRhdGUoRXhlY3V0b3IgZXgsIENsYXNzTWV0YURhdGEgYmFzZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBib29sZWFuIHN1YmNsYXNzZXMsIEV4cHJlc3Npb25GYWN0b3J5W10gZmFjdHMsCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNbXSBleHBzLCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVCdWxrT3BlcmF0aW9uKGV4LCBiYXNlLCBtZXRhcywgc3ViY2xhc3NlcywgZmFjdHMsIGV4cHMsCisgICAgICAgICAgICBwYXJhbXMsIGV4cHNbMF0udXBkYXRlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBOdW1iZXIgZXhlY3V0ZUJ1bGtPcGVyYXRpb24oRXhlY3V0b3IgZXgsIENsYXNzTWV0YURhdGEgYmFzZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBib29sZWFuIHN1YmNsYXNzZXMsIEV4cHJlc3Npb25GYWN0b3J5W10gZmFjdHMsCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNbXSBleHBzLCBPYmplY3RbXSBwYXJhbXMsIE1hcCB1cGRhdGVzKSB7CisgICAgICAgIC8vIHdlIGNhbm5vdCBleGVjdXRlIGEgYnVsayBkZWxldGUgc3RhdGVtZW50IHdoZW4gaGF2ZSBtYXBwaW5ncyBpbgorICAgICAgICAvLyBtdWx0aXBsZSB0YWJsZXMsIHNvIGluZGljYXRlIHdlIHdhbnQgdG8gdXNlIGluLW1lbW9yeSB3aXRoIG51bGwKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3MgPSAoQ2xhc3NNYXBwaW5nW10pIG1ldGFzOworICAgICAgICBib29sZWFuIGlzVXBkYXRlID0gdXBkYXRlcyAhPSBudWxsICYmIHVwZGF0ZXMuc2l6ZSgpID4gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFpc1NpbmdsZVRhYmxlTWFwcGluZyhtYXBwaW5nc1tpXSwgc3ViY2xhc3NlcykgJiYgIWlzVXBkYXRlKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAoIWlzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGFueSBkZWxldGUgY2FsbGJhY2tzLCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBpbi1tZW1vcnkgc28gdGhlIGNhbGxiYWNrcyBhcmUgaW52b2tlZAorICAgICAgICAgICAgICAgIExpZmVjeWNsZUV2ZW50TWFuYWdlciBtZ3IgPSBjdHguZ2V0U3RvcmVDb250ZXh0KCkuZ2V0QnJva2VyKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldExpZmVjeWNsZUV2ZW50TWFuYWdlcigpOworICAgICAgICAgICAgICAgIGlmIChtZ3IuaGFzRGVsZXRlTGlzdGVuZXJzKG51bGwsIG1hcHBpbmdzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoID0gKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24pIAorICAgICAgICAgICAgY3R4LmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBFeHBDb250ZXh0IGN0eCA9IG5ldyBFeHBDb250ZXh0KF9zdG9yZSwgcGFyYW1zLCBmZXRjaCk7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX3N0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBRdWVyeUV4cHJlc3Npb25zU3RhdGVbXSBzdGF0ZSA9IG5ldyBRdWVyeUV4cHJlc3Npb25zU3RhdGVbZXhwcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc3RhdGVbaV0gPSBuZXcgUXVlcnlFeHByZXNzaW9uc1N0YXRlKCk7CisKKyAgICAgICAgU1FMQnVmZmVyW10gc3FsID0gbmV3IFNRTEJ1ZmZlclttYXBwaW5ncy5sZW5ndGhdOworICAgICAgICBKREJDRXhwcmVzc2lvbkZhY3RvcnkgamRiY0ZhY3Rvcnk7CisgICAgICAgIFNlbGVjdCBzZWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGpkYmNGYWN0b3J5ID0gKEpEQkNFeHByZXNzaW9uRmFjdG9yeSkgZmFjdHNbaV07CisgICAgICAgICAgICBzZWwgPSBqZGJjRmFjdG9yeS5nZXRTZWxlY3RDb25zdHJ1Y3RvcigpLmV2YWx1YXRlKGN0eCwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICBleHBzW2ldLCBzdGF0ZVtpXSk7CisgICAgICAgICAgICBqZGJjRmFjdG9yeS5nZXRTZWxlY3RDb25zdHJ1Y3RvcigpLnNlbGVjdChzZWwsIGN0eCwgbWFwcGluZ3NbaV0sIAorICAgICAgICAgICAgICAgIHN1YmNsYXNzZXMsIGV4cHNbaV0sIHN0YXRlW2ldLCAKKyAgICAgICAgICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX05PTkUpOworCisgICAgICAgICAgICAvLyBzcGVjaWZpY2F0aW9uIG9mIHRoZSAidWRwYXRlcyIgbWFwIGluZGljYXRlcyB0aGF0IHRoaXMgaXMKKyAgICAgICAgICAgIC8vIGFuIHVwZGF0ZSBxdWVyeTsgb3RoZXJ3aXNlLCB0aGlzIGlzIGEgZGVsZXRlIHN0YXRlbWVudAorICAgICAgICAgICAgLy8gVGhlIGJ1bGsgb3BlcmF0aW9uIHdpbGwgcmV0dXJuIG51bGwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgIC8vIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3QgYnVsayBkZWxldGUgb3BlcmF0aW9uOyBpbgorICAgICAgICAgICAgLy8gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHBlcmZvcm0gdGhlIHF1ZXJ5IGluLW1lbW9yeSBhbmQKKyAgICAgICAgICAgIC8vIG1hbnVhbGx5IGRlbGV0ZSB0aGUgaW5zdGFuY2VzCisgICAgICAgICAgICBpZiAodXBkYXRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHNxbFtpXSA9IGRpY3QudG9EZWxldGUobWFwcGluZ3NbaV0sIHNlbCwgcGFyYW1zKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcWxbaV0gPSBkaWN0LnRvVXBkYXRlKG1hcHBpbmdzW2ldLCBzZWwsIF9zdG9yZSwgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVzKTsKKworICAgICAgICAgICAgaWYgKHNxbFtpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3RpdmUgc3RvcmUgY29ubmVjdGlvbgorICAgICAgICBfc3RvcmUuZ2V0Q29udGV4dCgpLmJlZ2luU3RvcmUoKTsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBfc3RvcmUuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBsb25nIGNvdW50ID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcWwubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdG1udCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RtbnQgPSBzcWxbaV0ucHJlcGFyZVN0YXRlbWVudChjb25uKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc3RtbnQuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgc3RtbnQuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBjdHgsIF9zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBjb25uLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGNvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBnaXZlbiBtYXBwaW5nIG9jY3VwaWVzIG9ubHkgb25lIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpbmdsZVRhYmxlTWFwcGluZyhDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgYm9vbGVhbiBzdWJjbGFzc2VzKSB7CisgICAgICAgIENsYXNzTWFwcGluZyByb290ID0gbWFwcGluZzsKKyAgICAgICAgd2hpbGUgKHJvb3QuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJvb3QgPSByb290LmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoaGFzVmVydGljYWxTdWJjbGFzc2VzKHJvb3QpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIHdlIGNhbm5vdCBleGVjdXRlIGEgYnVsayBkZWxldGUgaWYgYW55IG9mIHRoZQorICAgICAgICAvLyBmaWVsZCBtYXBwaW5ncyBmb3IgdGhlIGNhbmRpZGF0ZXMgaGF2ZSBjb2x1bW5zCisgICAgICAgIC8vIGluIGFueSBvdGhlciB0YWJsZSwgc2luY2UgYnVsayBkZWxldGluZyBqdXN0IGZyb20gdGhlCisgICAgICAgIC8vIGNsYXNzIHdpbGwgbGVhdmUgZGFuZ2xpbmcgcmVsYXRpb25zOyB3ZSBtaWdodCBiZSBhYmxlCisgICAgICAgIC8vIHRvIGlzc3VlIGJ1bGsgZGVsZXRlcyBzZXBhcmF0ZWx5IGZvciB0aGUgam9pbnMgKHBvc3NpYmx5CisgICAgICAgIC8vIHVzaW5nIGEgdGVtcG9yYXJ5IHRhYmxlIHRvIHNlbGVjdCB0aGUgcHJpbWFyeSBrZXlzIGZvcgorICAgICAgICAvLyBhbGwgdGhlIHJlbGF0ZWQgdGFibGVzIGFuZCB0aGVuIGlzc2luZyBhIGRlbGV0ZSBhZ2FpbnN0IHRob3NlCisgICAgICAgIC8vIGtleXMpLCBidXQgdGhhdCBsb2dpYyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkCisgICAgICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGUobWFwcGluZy5nZXRGaWVsZE1hcHBpbmdzKCksIG51bGwpOworICAgICAgICBpZiAodGFibGUgPT0gSU5WQUxJRCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoc3ViY2xhc3NlcykgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGluY2x1ZGluZyBzdWJjbGFzc2VzLCB3ZSBhbHNvIG5lZWQgdG8gZ2F0aGVyCisgICAgICAgICAgICAvLyBhbGwgdGhlIG1hcHBpbmdzIGZvciBhbGwga25vd24gc3ViY2xhc3NlcworICAgICAgICAgICAgQ2xhc3NNYXBwaW5nW10gc3VicyA9IG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1YmNsYXNzTWFwcGluZ3MoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBzdWJzICE9IG51bGwgJiYgaSA8IHN1YnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWJsZSA9IGdldFRhYmxlKHN1YnNbaV0uZ2V0RGVmaW5lZEZpZWxkTWFwcGluZ3MoKSwgdGFibGUpOworICAgICAgICAgICAgICAgIGlmICh0YWJsZSA9PSBJTlZBTElEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzaW5nbGUgdGFibGUgZm9yIHRoZSBnaXZlbiBmaWVsZHMsIG9yIElOVkFMSUQgaWYgdGhleQorICAgICAqIHVzZSBtdWx0aXBsZSB0YWJsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBUYWJsZSBnZXRUYWJsZShGaWVsZE1hcHBpbmdbXSBmaWVsZHMsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJsZSA9IGdldFRhYmxlKGZpZWxkc1tpXSwgdGFibGUpOworICAgICAgICAgICAgaWYgKHRhYmxlID09IElOVkFMSUQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBmaWVsZCBpZiB0aGUgZ2l2ZW4gdGFibGUgaGFzbid0IGJlZW4gc2V0CisgICAgICogeWV0LCBvciBpZiB0aGUgdGFibGVzIG1hdGNoLiBJZiB0aGUgZmllbGQgdXNlcyBhIGRpZmZlcmVudCB0YWJsZSwKKyAgICAgKiByZXR1cm5zIElOVkFMSUQuIEFsc28gcmV0dXJucyBJTlZBTElEIGlmIGZpZWxkIGlzIGRlcGVuZGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRhYmxlIGdldFRhYmxlKEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgaWYgKGZtLmdldENhc2NhZGVEZWxldGUoKSAhPSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEOworCisgICAgICAgIENvbHVtbltdIGNvbHVtbnMgPSBmbS5nZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBjb2x1bW5zICE9IG51bGwgJiYgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0YWJsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRhYmxlID0gY29sdW1uc1tpXS5nZXRUYWJsZSgpOworICAgICAgICAgICAgZWxzZSBpZiAodGFibGUgIT0gY29sdW1uc1tpXS5nZXRUYWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGV4ZWN1dGVVcGRhdGUoQ2xhc3NNZXRhRGF0YSBiYXNlLCBDbGFzc01ldGFEYXRhW10gbWV0YXMsCisgICAgICAgIGJvb2xlYW4gc3ViY2xhc3NlcywgRXhwcmVzc2lvbkZhY3RvcnlbXSBmYWN0cywKKyAgICAgICAgUXVlcnlFeHByZXNzaW9uc1tdIHBhcnNlZCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKENsYXNzTWV0YURhdGEgYmFzZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBib29sZWFuIHN1YmNsYXNzZXMsIEV4cHJlc3Npb25GYWN0b3J5W10gZmFjdHMsCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNbXSBleHBzLCBPYmplY3RbXSBwYXJhbXMsIFJhbmdlIHJhbmdlKSB7CisgICAgICAgIENsYXNzTWFwcGluZ1tdIG1hcHBpbmdzID0gKENsYXNzTWFwcGluZ1tdKSBtZXRhczsKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCA9IChKREJDRmV0Y2hDb25maWd1cmF0aW9uKSBjdHguCisgICAgICAgICAgICBnZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKGV4cHNbMF0uZmV0Y2hQYXRocyAhPSBudWxsKSB7CisgICAgICAgICAgICBmZXRjaC5hZGRGaWVsZHMoQXJyYXlzLmFzTGlzdChleHBzWzBdLmZldGNoUGF0aHMpKTsKKyAgICAgICAgICAgIGZldGNoLmFkZEpvaW5zKEFycmF5cy5hc0xpc3QoZXhwc1swXS5mZXRjaFBhdGhzKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZWFnZXIgPSBjYWxjdWxhdGVFYWdlck1vZGUoZXhwc1swXSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7CisgICAgICAgIGVhZ2VyID0gTWF0aC5taW4oZWFnZXIsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTik7CisgICAgICAgIGludCBzdWJjbGFzc01vZGUgPSBmZXRjaC5nZXRTdWJjbGFzc0ZldGNoTW9kZSgoQ2xhc3NNYXBwaW5nKSBiYXNlKTsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBfc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCk7CisgICAgICAgIGxvbmcgc3RhcnQgPSAobWFwcGluZ3MubGVuZ3RoID09IDEgJiYgZGljdC5zdXBwb3J0c1NlbGVjdFN0YXJ0SW5kZXgpIAorICAgICAgICAgICAgPyByYW5nZS5zdGFydCA6IDBMOworICAgICAgICBsb25nIGVuZCA9IChkaWN0LnN1cHBvcnRzU2VsZWN0RW5kSW5kZXgpID8gcmFuZ2UuZW5kIDogTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgUXVlcnlFeHByZXNzaW9uc1N0YXRlW10gc3RhdGVzID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbnNTdGF0ZVtleHBzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc3RhdGVzW2ldID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbnNTdGF0ZSgpOworICAgICAgICBFeHBDb250ZXh0IGN0eCA9IG5ldyBFeHBDb250ZXh0KF9zdG9yZSwgcGFyYW1zLCBmZXRjaCk7CisKKyAgICAgICAgLy8gYWRkIHNlbGVjdHMgd2l0aCBwb3B1bGF0ZSBXSEVSRSBjb25kaXRpb25zIHRvIGxpc3QKKyAgICAgICAgTGlzdCBzZWxzID0gbmV3IEFycmF5TGlzdChtYXBwaW5ncy5sZW5ndGgpOworICAgICAgICBMaXN0IHNlbE1hcHBpbmdzID0gbmV3IEFycmF5TGlzdChtYXBwaW5ncy5sZW5ndGgpOworICAgICAgICBCaXRTZXQgc3ViY2xhc3NCaXRzID0gbmV3IEJpdFNldCgpOworICAgICAgICBCaXRTZXQgbmV4dEJpdHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIGJvb2xlYW4gdW5pb25hYmxlID0gY3JlYXRlV2hlcmVTZWxlY3RzKHNlbHMsIG1hcHBpbmdzLCBzZWxNYXBwaW5ncywKKyAgICAgICAgICAgIHN1YmNsYXNzZXMsIHN1YmNsYXNzQml0cywgbmV4dEJpdHMsIGZhY3RzLCBleHBzLCBzdGF0ZXMsIGN0eCwgCisgICAgICAgICAgICBzdWJjbGFzc01vZGUpICYmIHN1YmNsYXNzTW9kZSA9PSBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX0pPSU47CisgICAgICAgIGlmIChzZWxzLnNpemUoKSA+IDEpCisgICAgICAgICAgICBzdGFydCA9IDBMOworCisgICAgICAgIGlmICh1bmlvbmFibGUpIHsKKyAgICAgICAgICAgIFVuaW9uIHVuaW9uID0gX3N0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdVbmlvbigKKyAgICAgICAgICAgICAgICAoU2VsZWN0W10pIHNlbHMudG9BcnJheShuZXcgU2VsZWN0W3NlbHMuc2l6ZSgpXSkpOworICAgICAgICAgICAgcG9wdWxhdGVVbmlvbih1bmlvbiwgbWFwcGluZ3MsIHN1YmNsYXNzZXMsIGZhY3RzLCBleHBzLCBzdGF0ZXMsIGN0eCwKKyAgICAgICAgICAgICAgICBmYWxzZSwgZWFnZXIsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgaWYgKHVuaW9uLmlzVW5pb24oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt1bmlvbi50b1NlbGVjdChmYWxzZSwgZmV0Y2gpLmdldFNRTCh0cnVlKX07CisgICAgICAgICAgICBzZWxzID0gQXJyYXlzLmFzTGlzdCh1bmlvbi5nZXRTZWxlY3RzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2VsZWN0IHNlbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgc2Vscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNlbCA9IChTZWxlY3QpIHNlbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIHBvcHVsYXRlU2VsZWN0KHNlbCwgKENsYXNzTWFwcGluZykgc2VsTWFwcGluZ3MuZ2V0KGkpLAorICAgICAgICAgICAgICAgICAgICBzdWJjbGFzc0JpdHMuZ2V0KGkpLCAoSkRCQ0V4cHJlc3Npb25GYWN0b3J5KSBmYWN0c1tpZHhdLAorICAgICAgICAgICAgICAgICAgICBleHBzW2lkeF0sIHN0YXRlc1tpZHhdLCBjdHgsIGZhbHNlLCBlYWdlciwgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKG5leHRCaXRzLmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBzcWwgPSBuZXcgU3RyaW5nW3NlbHMuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3FsW2ldID0gKChTZWxlY3QpIHNlbHMuZ2V0KGkpKS50b1NlbGVjdChmYWxzZSwgZmV0Y2gpLmdldFNRTCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9MUlNTaXplcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvTFJTU2l6ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkxNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvTFJTU2l6ZXMuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKKworLyoqCisgKiBXYXlzIG9mIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIGxhcmdlIHJlc3VsdCBzZXRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTFJTU2l6ZXMgeworCisgICAgLyoqCisgICAgICogTW9kZSBmb3IgcmV0dXJuaW5nIHtAbGluayBJbnRlZ2VyI01BWF9WQUxVRX0gZm9yIHRoZSBzaXplIG9mCisgICAgICogbGFyZ2UgcmVzdWx0IHNldHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9VTktOT1dOID0gMDsKKworICAgIC8qKgorICAgICAqIE1vZGUgZm9yIHVzaW5nIHtAbGluayBSZXN1bHRTZXQjbGFzdH0gdG8gY2FsY3VhbHRlIHRoZSBzaXplIG9mCisgICAgICogbGFyZ2UgcmVzdWx0IHNldHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9MQVNUID0gMTsKKworICAgIC8qKgorICAgICAqIE1vZGUgZm9yIHVzaW5nIGEgcXVlcnkgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGxhcmdlIHJlc3VsdCBzZXRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfUVVFUlkgPSAyOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvTWFwcGVkUXVlcnlSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvTWFwcGVkUXVlcnlSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTI4NjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9NYXBwZWRRdWVyeVJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5BcnJheTsKK2ltcG9ydCBqYXZhLnNxbC5CbG9iOworaW1wb3J0IGphdmEuc3FsLkNsb2I7CitpbXBvcnQgamF2YS5zcWwuUmVmOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUXVlcnlSZXN1bHRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkFic3RyYWN0UmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxFeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworCisvKioKKyAqIFByb3ZpZGVzIHRoZSBkYXRhIGZyb20gcXVlcnkgcmVzdWx0IG1hcHBlZCBieSBhIHtAbGluayBRdWVyeVJlc3VsdE1hcHBpbmd9LgorICoKKyAqIEBhdXRob3IgUGluYWtpIFBvZGRhcgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTWFwcGVkUXVlcnlSZXN1bHRPYmplY3RQcm92aWRlcgorICAgIGltcGxlbWVudHMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBRdWVyeVJlc3VsdE1hcHBpbmcgX21hcDsKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNTdG9yZSBfc3RvcmU7CisgICAgcHJpdmF0ZSBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIF9mZXRjaDsKKyAgICBwcml2YXRlIGZpbmFsIE1hcHBpbmdSZXN1bHQgX21yZXM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXMgdGhlIHJlc3VsdCBkYXRhCisgICAgICovCisgICAgcHVibGljIE1hcHBlZFF1ZXJ5UmVzdWx0T2JqZWN0UHJvdmlkZXIoUXVlcnlSZXN1bHRNYXBwaW5nIG1hcCwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKSB7CisgICAgICAgIF9tYXAgPSBtYXA7CisgICAgICAgIF9zdG9yZSA9IHN0b3JlOworICAgICAgICBfZmV0Y2ggPSAoZmV0Y2ggPT0gbnVsbCkgPyBzdG9yZS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKSA6IGZldGNoOworICAgICAgICBfbXJlcyA9IG5ldyBNYXBwaW5nUmVzdWx0KHJlcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX21yZXMuc3VwcG9ydHNSYW5kb21BY2Nlc3MoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRPYmplY3QoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUXVlcnlSZXN1bHRNYXBwaW5nLlBDUmVzdWx0W10gcGNzID0gX21hcC5nZXRQQ1Jlc3VsdHMoKTsKKyAgICAgICAgT2JqZWN0W10gY29scyA9IF9tYXAuZ2V0Q29sdW1uUmVzdWx0cygpOworCisgICAgICAgIC8vIHNpbmdsZSBvYmplY3QgY2FzZXMKKyAgICAgICAgaWYgKHBjcy5sZW5ndGggPT0gMCAmJiBjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIF9tcmVzLmdldE9iamVjdChjb2xzWzBdLCBKYXZhU1FMVHlwZXMuSkRCQ19ERUZBVUxULCBudWxsKTsKKyAgICAgICAgaWYgKHBjcy5sZW5ndGggPT0gMSAmJiBjb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9tcmVzLmxvYWQocGNzWzBdLCBfc3RvcmUsIF9mZXRjaCk7CisKKyAgICAgICAgLy8gbXVsdGlwbGUgb2JqZWN0cworICAgICAgICBPYmplY3RbXSByZXQgPSBuZXcgT2JqZWN0W3Bjcy5sZW5ndGggKyBjb2xzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGNzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmV0W2ldID0gX21yZXMubG9hZChwY3NbaV0sIF9zdG9yZSwgX2ZldGNoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmV0W3Bjcy5sZW5ndGggKyBpXSA9IF9tcmVzLmdldE9iamVjdChjb2xzW2ldLAorICAgICAgICAgICAgICAgIEphdmFTUUxUeXBlcy5KREJDX0RFRkFVTFQsIG51bGwpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5leHQoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9tcmVzLm5leHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhYnNvbHV0ZShpbnQgcG9zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9tcmVzLmFic29sdXRlKHBvcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZmV0Y2guZ2V0TFJTU2l6ZSgpID09IExSU1NpemVzLlNJWkVfVU5LTk9XTgorICAgICAgICAgICAgfHwgIXN1cHBvcnRzUmFuZG9tQWNjZXNzKCkpCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIHJldHVybiBfbXJlcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBfbXJlcy5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNoZWNrZWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTUUxFeGNlcHRpb24pCisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKChTUUxFeGNlcHRpb24pIGUsCisgICAgICAgICAgICAgICAgX3N0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3VsdCB0eXBlIHRoYXQgbWFwcyByZXF1ZXN0cyB1c2luZyBhIGdpdmVuCisgICAgICoge0BsaW5rIFF1ZXJ5UmVzdWx0TWFwcGluZy5QQ1Jlc3VsdH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFwcGluZ1Jlc3VsdAorICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3VsdCBfcmVzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0YWNrIF9yZXF1ZXN0cyA9IG5ldyBTdGFjaygpOworICAgICAgICBwcml2YXRlIFF1ZXJ5UmVzdWx0TWFwcGluZy5QQ1Jlc3VsdCBfcGMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdXBwbHkgZGVsZWdhdGUgb24gY29uc3RydWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1hcHBpbmdSZXN1bHQoUmVzdWx0IHJlcykgeworICAgICAgICAgICAgX3JlcyA9IHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiBTaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZgorICAgICAgICAgKiB7QGxpbmsgUmVzdWx0I2xvYWR9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBsb2FkKFF1ZXJ5UmVzdWx0TWFwcGluZy5QQ1Jlc3VsdCBwYywgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3BjID0gcGM7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2FkKHBjLmdldENhbmRpZGF0ZVR5cGVNYXBwaW5nKCksIHN0b3JlLCBmZXRjaCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9wYyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGxvYWQoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBsb2FkKG1hcHBpbmcsIHN0b3JlLCBmZXRjaCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGxvYWQoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoX3BjID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWQobWFwcGluZywgc3RvcmUsIGZldGNoLCBqb2lucyk7CisKKyAgICAgICAgICAgIC8vIHdlIGdvIGRpcmVjdCB0byB0aGUgc3RvcmUgbWFuYWdlciBzbyB3ZSBjYW4gdGVsbCBpdCBub3QgdG8gbG9hZAorICAgICAgICAgICAgLy8gYW55dGhpbmcgYWRkaXRpb25hbAorICAgICAgICAgICAgcmV0dXJuICgoSkRCQ1N0b3JlTWFuYWdlcikgc3RvcmUpLmxvYWQobWFwcGluZywgZmV0Y2gsCisgICAgICAgICAgICAgICAgX3BjLmdldEV4Y2x1ZGVzKF9yZXF1ZXN0cyksIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRFYWdlcihGaWVsZE1hcHBpbmcga2V5KSB7CisgICAgICAgICAgICBPYmplY3QgcmV0ID0gX3Jlcy5nZXRFYWdlcihrZXkpOworICAgICAgICAgICAgaWYgKF9wYyA9PSBudWxsIHx8IHJldCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICByZXR1cm4gKF9wYy5oYXNFYWdlcihfcmVxdWVzdHMsIGtleSkpID8gdGhpcyA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwdXRFYWdlcihGaWVsZE1hcHBpbmcga2V5LCBPYmplY3QgcmVzKSB7CisgICAgICAgICAgICBfcmVzLnB1dEVhZ2VyKGtleSwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgX3Jlcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIG5ld0pvaW5zKCkgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMubmV3Sm9pbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzKCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIF9yZXMuc3VwcG9ydHNSYW5kb21BY2Nlc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0QmFzZU1hcHBpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRCYXNlTWFwcGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIF9yZXMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnREYXRhUmVxdWVzdChPYmplY3QgbWFwcGluZykgeworICAgICAgICAgICAgX3JlcXVlc3RzLnB1c2gobWFwcGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbmREYXRhUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF9yZXF1ZXN0cy5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHdhc051bGwoKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy53YXNOdWxsKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zbGF0ZShPYmplY3Qgb2JqLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgcmV0dXJuIChfcGMgPT0gbnVsbCkgPyBvYmogOiBfcGMubWFwKF9yZXF1ZXN0cywgb2JqLCBqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhYnNvbHV0ZUludGVybmFsKGludCByb3cpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmFic29sdXRlKHJvdyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZXh0SW50ZXJuYWwoKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0ludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5jb250YWlucyh0cmFuc2xhdGUob2JqLCBqb2lucykpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEFycmF5IGdldEFycmF5SW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0QXJyYXkoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRBcnJheShvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldEFzY2lpU3RyZWFtSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0QXNjaWlTdHJlYW0oKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRBc2NpaVN0cmVhbShvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbEludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEJpZ0RlY2ltYWwoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRCaWdEZWNpbWFsKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgTnVtYmVyIGdldE51bWJlckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldE51bWJlcigoQ29sdW1uKSBvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldE51bWJlcihvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEJpZ0ludGVnZXIoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRCaWdJbnRlZ2VyKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0QmluYXJ5U3RyZWFtSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0QmluYXJ5U3RyZWFtKChDb2x1bW4pIG9iaiwgam9pbnMpOworICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0QmluYXJ5U3RyZWFtKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQmxvYiBnZXRCbG9iSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0QmxvYigoQ29sdW1uKSBvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEJsb2Iob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldEJvb2xlYW5JbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRCb29sZWFuKChDb2x1bW4pIG9iaiwgam9pbnMpOworICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0Qm9vbGVhbihvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGUgZ2V0Qnl0ZUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEJ5dGUoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRCeXRlKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEJ5dGVzSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0Qnl0ZXMoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRCeXRlcyhvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIENhbGVuZGFyIGdldENhbGVuZGFySW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0Q2FsZW5kYXIoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRDYWxlbmRhcihvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGNoYXIgZ2V0Q2hhckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldENoYXIoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRDaGFyKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUmVhZGVyIGdldENoYXJhY3RlclN0cmVhbUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldENoYXJhY3RlclN0cmVhbSgoQ29sdW1uKSBvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldENoYXJhY3RlclN0cmVhbShvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIENsb2IgZ2V0Q2xvYkludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldENsb2IoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRDbG9iKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRGF0ZSBnZXREYXRlSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0RGF0ZSgoQ29sdW1uKSBvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldERhdGUob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBqYXZhLnNxbC5EYXRlIGdldERhdGVJbnRlcm5hbChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwsCisgICAgICAgICAgICBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXREYXRlKChDb2x1bW4pIG9iaiwgY2FsLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXREYXRlKG9iaiwgY2FsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBkb3VibGUgZ2V0RG91YmxlSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0RG91YmxlKChDb2x1bW4pIG9iaiwgam9pbnMpOworICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0RG91YmxlKG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgZmxvYXQgZ2V0RmxvYXRJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRGbG9hdCgoQ29sdW1uKSBvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEZsb2F0KG9iaik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50IGdldEludEludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEludCgoQ29sdW1uKSBvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldEludChvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIExvY2FsZSBnZXRMb2NhbGVJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRMb2NhbGUoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRMb2NhbGUob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBsb25nIGdldExvbmdJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRMb25nKChDb2x1bW4pIG9iaiwgam9pbnMpOworICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0TG9uZyhvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RJbnRlcm5hbChPYmplY3Qgb2JqLCBpbnQgbWV0YVR5cGVDb2RlLAorICAgICAgICAgICAgT2JqZWN0IGFyZywgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0T2JqZWN0KChDb2x1bW4pIG9iaiwgYXJnLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRPYmplY3Qob2JqLCBtZXRhVHlwZUNvZGUsIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNRTE9iamVjdEludGVybmFsKE9iamVjdCBvYmosIE1hcCBtYXAsIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldFNRTE9iamVjdCgoQ29sdW1uKSBvYmosIG1hcCwgam9pbnMpOworICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0U1FMT2JqZWN0KG9iaiwgbWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBSZWYgZ2V0UmVmSW50ZXJuYWwoT2JqZWN0IG9iaiwgTWFwIG1hcCwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0UmVmKChDb2x1bW4pIG9iaiwgbWFwLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRSZWYob2JqLCBtYXApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHNob3J0IGdldFNob3J0SW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0U2hvcnQoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRTaG9ydChvYmopOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRTdHJpbmcoKENvbHVtbikgb2JqLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRTdHJpbmcob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBUaW1lIGdldFRpbWVJbnRlcm5hbChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwsIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgICAgIHJldHVybiBfcmVzLmdldFRpbWUoKENvbHVtbikgb2JqLCBjYWwsIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldFRpbWUob2JqLCBjYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXBJbnRlcm5hbChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwsCisgICAgICAgICAgICBKb2lucyBqb2lucykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbHVtbikKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jlcy5nZXRUaW1lc3RhbXAoKENvbHVtbikgb2JqLCBjYWwsIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmdldFRpbWVzdGFtcChvYmosIGNhbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9OYXRpdmVKREJDU2VxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9OYXRpdmVKREJDU2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmYzgzMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL05hdGl2ZUpEQkNTZXEuamF2YQpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOT1RFOiBEbyBub3QgY2hhbmdlIHByb3BlcnR5IG5hbWVzOyBzZWUgU2VxdWVuY2VNZXRhRGF0YQorLy8gYW5kIFNlcXVlbmNlTWFwcGluZyBmb3Igc3RhbmRhcmQgcHJvcGVydHkgbmFtZXMuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiB7QGxpbmsgSkRCQ1NlcX0gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgZGF0YWJhc2Ugc2VxdWVuY2VzCisgKiB0byBnZW5lcmF0ZSBudW1iZXJzLgorICoKKyAqIEBzZWUgSkRCQ1NlcQorICogQHNlZSBBYnN0cmFjdEpEQkNTZXEKKyAqLworcHVibGljIGNsYXNzIE5hdGl2ZUpEQkNTZXEKKyAgICBleHRlbmRzIEFic3RyYWN0SkRCQ1NlcQorICAgIGltcGxlbWVudHMgQ29uZmlndXJhYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9EUk9QID0gImRyb3AiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BREQgPSAiYWRkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUID0gImdldCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKE5hdGl2ZUpEQkNTZXEuY2xhc3MpOworCisgICAgcHJpdmF0ZSBKREJDQ29uZmlndXJhdGlvbiBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NlcU5hbWUgPSAiT1BFTkpQQV9TRVFVRU5DRSI7CisgICAgcHJpdmF0ZSBpbnQgX2luY3JlbWVudCA9IDE7CisgICAgcHJpdmF0ZSBpbnQgX2luaXRpYWwgPSAxOworICAgIHByaXZhdGUgaW50IF9hbGxvY2F0ZSA9IDA7CisgICAgcHJpdmF0ZSBTZXF1ZW5jZSBfc2VxID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfc2VsZWN0ID0gbnVsbDsKKworICAgIC8vIGZvciBkZXByZWNhdGVkIGF1dG8tY29uZmlndXJhdGlvbiBzdXBwb3J0CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Zvcm1hdCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhYmxlTmFtZSA9ICJEVUFMIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3N1YlRhYmxlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VxdWVuY2UgbmFtZS4gRGVmYXVsdHMgdG8gPGNvZGU+T1BFTkpQQV9TRVFVRU5DRTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zZXFOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXF1ZW5jZSBuYW1lLiBEZWZhdWx0cyB0byA8Y29kZT5PUEVOSlBBX1NFUVVFTkNFPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZShTdHJpbmcgc2VxTmFtZSkgeworICAgICAgICBfc2VxTmFtZSA9IHNlcU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0U2VxdWVuY2V9LiBSZXRhaW5lZCBmb3IKKyAgICAgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcXVlbmNlTmFtZShTdHJpbmcgc2VxTmFtZSkgeworICAgICAgICBzZXRTZXF1ZW5jZShzZXFOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFNlcXVlbmNlI2dldEluaXRpYWxWYWx1ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5pdGlhbFZhbHVlKCkgeworICAgICAgICByZXR1cm4gX2luaXRpYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBTZXF1ZW5jZSNzZXRJbml0aWFsVmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoaW50IGluaXRpYWwpIHsKKyAgICAgICAgX2luaXRpYWwgPSBpbml0aWFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgU2VxdWVuY2UjZ2V0QWxsb2NhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFsbG9jYXRlKCkgeworICAgICAgICByZXR1cm4gX2FsbG9jYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgU2VxdWVuY2Ujc2V0QWxsb2NhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvY2F0ZShpbnQgYWxsb2NhdGUpIHsKKyAgICAgICAgX2FsbG9jYXRlID0gYWxsb2NhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBTZXF1ZW5jZSNnZXRJbmNyZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluY3JlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9pbmNyZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBTZXF1ZW5jZSNzZXRJbmNyZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnQoaW50IGluY3JlbWVudCkgeworICAgICAgICBfaW5jcmVtZW50ID0gaW5jcmVtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFJldGFpbmVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShTdHJpbmcgdGFibGUpIHsKKyAgICAgICAgX3RhYmxlTmFtZSA9IHRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFJldGFpbmVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChTdHJpbmcgZm9ybWF0KSB7CisgICAgICAgIF9mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIF9zdWJUYWJsZSA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkU2NoZW1hKENsYXNzTWFwcGluZyBtYXBwaW5nLCBTY2hlbWFHcm91cCBncm91cCkgeworICAgICAgICAvLyBzZXF1ZW5jZSBhbHJlYWR5IGV4aXN0cz8KKyAgICAgICAgaWYgKGdyb3VwLmlzS25vd25TZXF1ZW5jZShfc2VxTmFtZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUgPSBTdHJpbmdzLmdldFBhY2thZ2VOYW1lKF9zZXFOYW1lKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHNjaGVtYU5hbWUgPSBTY2hlbWFzLmdldE5ld1RhYmxlU2NoZW1hKF9jb25mKTsKKworICAgICAgICAvLyBjcmVhdGUgdGFibGUgaW4gdGhpcyBncm91cAorICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ3JvdXAuZ2V0U2NoZW1hKHNjaGVtYU5hbWUpOworICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICBzY2hlbWEgPSBncm91cC5hZGRTY2hlbWEoc2NoZW1hTmFtZSk7CisgICAgICAgIHNjaGVtYS5pbXBvcnRTZXF1ZW5jZShfc2VxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9jb25mOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgYnVpbGRTZXF1ZW5jZSgpOworCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKF9mb3JtYXQgPT0gbnVsbCkgeworICAgICAgICAgICAgX2Zvcm1hdCA9IGRpY3QubmV4dFNlcXVlbmNlUXVlcnk7CisgICAgICAgICAgICBpZiAoX2Zvcm1hdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tc2VxLXNxbCIsIF9zZXFOYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF90YWJsZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIF90YWJsZU5hbWUgPSAiRFVBTCI7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBkaWN0LmdldEZ1bGxOYW1lKF9zZXEpOworICAgICAgICBPYmplY3RbXSBzdWJzID0gKF9zdWJUYWJsZSkgPyBuZXcgT2JqZWN0W117IG5hbWUsIF90YWJsZU5hbWUgfQorICAgICAgICAgICAgOiBuZXcgT2JqZWN0W117IG5hbWUgfTsKKyAgICAgICAgX3NlbGVjdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KF9mb3JtYXQsIHN1YnMpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG5leHRJbnRlcm5hbChKREJDU3RvcmUgc3RvcmUsIENsYXNzTWFwcGluZyBtYXBwaW5nKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gZ2V0Q29ubmVjdGlvbihzdG9yZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGdldFNlcXVlbmNlKGNvbm4pKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlQ29ubmVjdGlvbihjb25uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHNlcXVlbmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVpbGRTZXF1ZW5jZSgpIHsKKyAgICAgICAgU3RyaW5nIHNlcU5hbWUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShfc2VxTmFtZSk7CisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lID0gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShfc2VxTmFtZSk7CisgICAgICAgIGlmIChzY2hlbWFOYW1lLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICBzY2hlbWFOYW1lID0gU2NoZW1hcy5nZXROZXdUYWJsZVNjaGVtYShfY29uZik7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcXVlbmNlIGluIG9uZSBvZiB0aGUgZGVzaWduYXRlZCBzY2hlbWFzCisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gbmV3IFNjaGVtYUdyb3VwKCk7CisgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBncm91cC5hZGRTY2hlbWEoc2NoZW1hTmFtZSk7CisKKyAgICAgICAgX3NlcSA9IHNjaGVtYS5hZGRTZXF1ZW5jZShzZXFOYW1lKTsKKyAgICAgICAgX3NlcS5zZXRJbml0aWFsVmFsdWUoX2luaXRpYWwpOworICAgICAgICBfc2VxLnNldEluY3JlbWVudChfaW5jcmVtZW50KTsKKyAgICAgICAgX3NlcS5zZXRBbGxvY2F0ZShfYWxsb2NhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHNlcXVlbmNlIGluIHRoZSBEQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoU2VxdWVuY2UoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nIGxvZyA9IF9jb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfUlVOVElNRSk7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoIm1ha2UtbmF0aXZlLXNlcSIpKTsKKworICAgICAgICAvLyBjcmVhdGUgdGhlIHNlcXVlbmNlCisgICAgICAgIFNjaGVtYVRvb2wgdG9vbCA9IG5ldyBTY2hlbWFUb29sKF9jb25mKTsKKyAgICAgICAgdG9vbC5zZXRJZ25vcmVFcnJvcnModHJ1ZSk7CisgICAgICAgIHRvb2wuY3JlYXRlU2VxdWVuY2UoX3NlcSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJvcHMgdGhlIHNlcXVlbmNlIGluIHRoZSBEQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcm9wU2VxdWVuY2UoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nIGxvZyA9IF9jb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfUlVOVElNRSk7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoImRyb3AtbmF0aXZlLXNlcSIpKTsKKworICAgICAgICAvLyBkcm9wIHRoZSB0YWJsZQorICAgICAgICBTY2hlbWFUb29sIHRvb2wgPSBuZXcgU2NoZW1hVG9vbChfY29uZik7CisgICAgICAgIHRvb2wuc2V0SWdub3JlRXJyb3JzKHRydWUpOworICAgICAgICB0b29sLmRyb3BTZXF1ZW5jZShfc2VxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5leHQgc2VxdWVuY2UgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGdldFNlcXVlbmNlKENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0bW50ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KF9zZWxlY3QpOworICAgICAgICAgICAgcnMgPSBzdG1udC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgIGlmIChycy5uZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJzLmdldExvbmcoMSk7CisKKyAgICAgICAgICAgIC8vIG5vIHJvdyAhPworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImludmFsaWQtc2VxLXNxbCIsIF9zZWxlY3QpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIG91ciByZXNvdXJjZXMKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHJzLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLworICAgIC8vIE1haW4KKyAgICAvLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFVzYWdlOiBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5OYXRpdmVKREJDU2VxdWVuY2UgW29wdGlvbl0qCisgICAgICogLWFjdGlvbi8tYSAmbHQ7YWRkIHwgZHJvcCB8IGdldCZndDsKKyAgICAgKiAgV2hlcmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSByZWNvZ25pemVkLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+LXByb3BlcnRpZXMvLXAgJmx0O3Byb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZSZndDs8L2k+OiBUaGUKKyAgICAgKiBwYXRoIG9yIHJlc291cmNlIG5hbWUgb2YgYSBPcGVuSlBBIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nCisgICAgICogaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgbGljZW5zZSBrZXkJYW5kIGNvbm5lY3Rpb24gZGF0YSBhcworICAgICAqIG91dGxpbmVkIGluIHtAbGluayBKREJDQ29uZmlndXJhdGlvbn0uIE9wdGlvbmFsLjwvbGk+CisgICAgICogPGxpPjxpPi0mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvaT46IEFsbCBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgT3BlbkpQQSB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259IGNhbiBiZSBzZXQgYnkKKyAgICAgKiB1c2luZyB0aGVpcgluYW1lcyBhbmQgc3VwcGx5aW5nIGEgdmFsdWUuIEZvciBleGFtcGxlOgorICAgICAqIDxjb2RlPi1saWNlbnNlS2V5IGFkc2xmamE4M3IzbGthZGY8L2NvZGU+PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqICBUaGUgdmFyaW91cyBhY3Rpb25zIGFyZSBhcyBmb2xsb3dzLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+YWRkPC9pPjogQ3JlYXRlIHRoZSBzZXF1ZW5jZS48L2xpPgorICAgICAqIDxsaT48aT5kcm9wPC9pPjogRHJvcCB0aGUgc2VxdWVuY2UuPC9saT4KKyAgICAgKiA8bGk+PGk+Z2V0PC9pPjogUHJpbnQgdGhlIG5leHQgc2VxdWVuY2UgdmFsdWUuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBhcmdzID0gb3B0cy5zZXRGcm9tQ21kTGluZShhcmdzKTsKKyAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBKREJDQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghcnVuKGNvbmYsIGFyZ3MsIG9wdHMpKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihfbG9jLmdldCgibmF0aXZlLXNlcS11c2FnZSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbmYuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJucyBmYWxzZSBpZiBpbnZhbGlkIG9wdGlvbnMgd2VyZSBnaXZlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIE9wdGlvbnMgb3B0cykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcHRzLmNvbnRhaW5zS2V5KCJoZWxwIikgfHwgb3B0cy5jb250YWluc0tleSgiLWhlbHAiKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgiYWN0aW9uIiwgImEiLCBudWxsKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbnMucG9wdWxhdGVDb25maWd1cmF0aW9uKGNvbmYsIG9wdHMpOworICAgICAgICByZXR1cm4gcnVuKGNvbmYsIGFyZ3MsIGFjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0b29sLiBSZXR1cm4gZmFsc2UgaWYgYW4gaW52YWxpZCBvcHRpb24gd2FzIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgU3RyaW5nIGFjdGlvbikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIE5hdGl2ZUpEQkNTZXEgc2VxID0gbmV3IE5hdGl2ZUpEQkNTZXEoKTsKKyAgICAgICAgU3RyaW5nIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhjb25mLmdldFNlcXVlbmNlKCkpOworICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShzZXEsIGNvbmYsIHByb3BzKTsKKworICAgICAgICBpZiAoQUNUSU9OX0RST1AuZXF1YWxzKGFjdGlvbikpCisgICAgICAgICAgICBzZXEuZHJvcFNlcXVlbmNlKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9BREQuZXF1YWxzKGFjdGlvbikpCisgICAgICAgICAgICBzZXEucmVmcmVzaFNlcXVlbmNlKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9HRVQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IGNvbmYuZ2V0RGF0YVNvdXJjZTIobnVsbCkuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIGN1ciA9IHNlcS5nZXRTZXF1ZW5jZShjb25uKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3VyKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgY29ubi5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9PcGVyYXRpb25PcmRlclVwZGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL09wZXJhdGlvbk9yZGVyVXBkYXRlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTlkNjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9PcGVyYXRpb25PcmRlclVwZGF0ZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5QcmltYXJ5Um93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd0ltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxFeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBVcGRhdGUgbWFuYWdlciB0aGF0IHdyaXRlcyBTUUwgaW4gb2JqZWN0LWxldmVsIG9wZXJhdGlvbiBvcmRlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgT3BlcmF0aW9uT3JkZXJVcGRhdGVNYW5hZ2VyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFVwZGF0ZU1hbmFnZXIgeworCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJvd01hbmFnZXIgbmV3Um93TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSb3dNYW5hZ2VySW1wbCh0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VyIG5ld1ByZXBhcmVkU3RhdGVtZW50TWFuYWdlcgorICAgICAgICAoSkRCQ1N0b3JlIHN0b3JlLCBDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXJJbXBsKHN0b3JlLCBjb25uKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBmbHVzaChSb3dNYW5hZ2VyIHJvd01nciwKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VyIHBzTWdyLCBDb2xsZWN0aW9uIGV4Y2VwcykgeworICAgICAgICBSb3dNYW5hZ2VySW1wbCBybWltcGwgPSAoUm93TWFuYWdlckltcGwpIHJvd01ncjsKKworICAgICAgICAvLyBmaXJzdCB0YWtlIGNhcmUgb2YgYWxsIHNlY29uZGFyeSB0YWJsZSBkZWxldGVzIGFuZCAnYWxsIHJvdycgZGVsZXRlcworICAgICAgICAvLyAod2hpY2ggYXJlIHByb2JhYmx5IHNlY29uZGFyeSB0YWJsZSBkZWxldGVzKSwgc2luY2Ugbm8gZm9yZWlnbgorICAgICAgICAvLyBrZXlzIGV2ZXIgcmVseSBvbiBzZWNvbmRhcnkgdGFibGUgcGtzCisgICAgICAgIGZsdXNoKHJtaW1wbC5nZXRBbGxSb3dEZWxldGVzKCksIHBzTWdyKTsKKyAgICAgICAgZmx1c2gocm1pbXBsLmdldFNlY29uZGFyeURlbGV0ZXMoKSwgcHNNZ3IpOworCisgICAgICAgIC8vIG5vdyBkbyBhbnkgJ2FsbCByb3cnIHVwZGF0ZXMsIHdoaWNoIHR5cGljYWxseSBudWxsIGtleXMKKyAgICAgICAgZmx1c2gocm1pbXBsLmdldEFsbFJvd1VwZGF0ZXMoKSwgcHNNZ3IpOworCisgICAgICAgIC8vIGdhdGhlciBhbnkgdXBkYXRlcyB3ZSBuZWVkIHRvIGF2b2lkIGZrIGNvbnN0cmFpbnRzIG9uIGRlbGV0ZXMKKyAgICAgICAgQ29sbGVjdGlvbiBjb25zdHJhaW50VXBkYXRlcyA9IG51bGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcm1pbXBsLmdldERlbGV0ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25zdHJhaW50VXBkYXRlcyA9IGFuYWx5emVEZWxldGVDb25zdHJhaW50cyhybWltcGwsCisgICAgICAgICAgICAgICAgICAgIChQcmltYXJ5Um93KSBpdHIubmV4dCgpLCBjb25zdHJhaW50VXBkYXRlcyk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGRFeGNlcHRpb24oZXhjZXBzLCBTUUxFeGNlcHRpb25zLmdldFN0b3JlCisgICAgICAgICAgICAgICAgICAgIChzZSwgZGljdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25zdHJhaW50VXBkYXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmbHVzaChjb25zdHJhaW50VXBkYXRlcywgcHNNZ3IpOworICAgICAgICAgICAgY29uc3RyYWludFVwZGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZsdXNoIHByaW1hcnkgcm93cyBpbiBvcmRlcgorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHJtaW1wbC5nZXRPcmRlcmVkKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uc3RyYWludFVwZGF0ZXMgPSBmbHVzaFByaW1hcnlSb3cocm1pbXBsLCAoUHJpbWFyeVJvdykKKyAgICAgICAgICAgICAgICAgICAgaXRyLm5leHQoKSwgcHNNZ3IsIGNvbnN0cmFpbnRVcGRhdGVzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZEV4Y2VwdGlvbihleGNlcHMsIFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUKKyAgICAgICAgICAgICAgICAgICAgKHNlLCBkaWN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnN0cmFpbnRVcGRhdGVzICE9IG51bGwpCisgICAgICAgICAgICBmbHVzaChjb25zdHJhaW50VXBkYXRlcywgcHNNZ3IpOworCisgICAgICAgIC8vIHRha2UgY2FyZSBvZiBhbGwgc2Vjb25kYXJ5IHRhYmxlIGluc2VydHMgYW5kIHVwZGF0ZXMgbGFzdCwgc2luY2UKKyAgICAgICAgLy8gdGhleSBtYXkgcmVseSBvbiBwcmV2aW91cyBpbnNlcnRzIG9yIHVwZGF0ZXMsIGJ1dCBub3RoaW5nIHJlbGllcworICAgICAgICAvLyBvbiB0aGVtCisgICAgICAgIGZsdXNoKHJtaW1wbC5nZXRTZWNvbmRhcnlVcGRhdGVzKCksIHBzTWdyKTsKKworICAgICAgICAvLyBmbHVzaCBhbnkgbGVmdCBvdmVyIHByZXBhcmVkIHN0YXRlbWVudHMKKyAgICAgICAgcHNNZ3IuZmx1c2goKTsKKyAgICAgICAgcmV0dXJuIGV4Y2VwczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmFseXplIHRoZSBkZWxldGUgY29uc3RyYWludHMgb24gdGhlIGdpdmVuIHJvdywgZ2F0aGVyaW5nIG5lY2Vzc2FyeQorICAgICAqIHVwZGF0ZXMgdG8gbnVsbCBma3MgYmVmb3JlIGRlbGV0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBhbmFseXplRGVsZXRlQ29uc3RyYWludHMoUm93TWFuYWdlckltcGwgcm93TWdyLAorICAgICAgICBQcmltYXJ5Um93IHJvdywgQ29sbGVjdGlvbiB1cGRhdGVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFyb3cuaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZXM7CisKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IHJvdy5nZXRUYWJsZSgpLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc207CisgICAgICAgIFByaW1hcnlSb3cgcmVsOworICAgICAgICBSb3dJbXBsIHVwZGF0ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBma3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIHdoZW4gZGVsZXRpbmcgcmVmIGZrcyB3ZSBzZXQgdGhlIHdoZXJlIHZhbHVlIGluc3RlYWQKKyAgICAgICAgICAgIHNtID0gcm93LmdldEZvcmVpZ25LZXlTZXQoZmtzW2ldKTsKKyAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHNtID0gcm93LmdldEZvcmVpZ25LZXlXaGVyZShma3NbaV0pOworICAgICAgICAgICAgaWYgKHNtID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIG9ubHkgbmVlZCBhbiB1cGRhdGUgaWYgd2UgaGF2ZSBhbiBmayB0byBhIHJvdyB0aGF0J3MgYmVpbmcKKyAgICAgICAgICAgIC8vIGRlbGV0ZWQgYmVmb3JlIHdlIGFyZQorICAgICAgICAgICAgcmVsID0gKFByaW1hcnlSb3cpIHJvd01nci5nZXRSb3coZmtzW2ldLmdldFByaW1hcnlLZXlUYWJsZSgpLAorICAgICAgICAgICAgICAgIFJvdy5BQ1RJT05fREVMRVRFLCBzbSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHJlbCA9PSBudWxsIHx8ICFyZWwuaXNWYWxpZCgpCisgICAgICAgICAgICAgICAgfHwgcmVsLmdldEluZGV4KCkgPj0gcm93LmdldEluZGV4KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiB1cGRhdGUgdG8gbnVsbCB0aGUgb2ZmZW5kaW5nIGZrIGJlZm9yZSBkZWxldGluZy4gIHVzZQorICAgICAgICAgICAgLy8gYSBwcmltYXJ5IHJvdyB0byBiZSBzdXJlIHRvIGNvcHkgZGVsYXllZC1mbHVzaCBwa3MvZmtzCisgICAgICAgICAgICB1cGRhdGUgPSBuZXcgUHJpbWFyeVJvdyhyb3cuZ2V0VGFibGUoKSwgUm93LkFDVElPTl9VUERBVEUsIG51bGwpOworICAgICAgICAgICAgcm93LmNvcHlJbnRvKHVwZGF0ZSwgdHJ1ZSk7CisgICAgICAgICAgICB1cGRhdGUuc2V0Rm9yZWlnbktleShma3NbaV0sIHJvdy5nZXRGb3JlaWduS2V5SU8oZmtzW2ldKSwgbnVsbCk7CisgICAgICAgICAgICBpZiAodXBkYXRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB1cGRhdGVzLmFkZCh1cGRhdGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cGRhdGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBnaXZlbiByb3csIGNyZWF0aW5nIGRlZmVycmVkIHVwZGF0ZXMgZm9yIGRlcGVuZGVuY2llcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbGxlY3Rpb24gZmx1c2hQcmltYXJ5Um93KFJvd01hbmFnZXJJbXBsIHJvd01nciwgUHJpbWFyeVJvdyByb3csCisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50TWFuYWdlciBwc01nciwgQ29sbGVjdGlvbiB1cGRhdGVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFyb3cuaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZXM7CisKKyAgICAgICAgLy8gYWxyZWFkeSBhbmFseXplZCBkZWxldGVzCisgICAgICAgIGlmIChyb3cuZ2V0QWN0aW9uKCkgPT0gUm93LkFDVElPTl9ERUxFVEUpIHsKKyAgICAgICAgICAgIHBzTWdyLmZsdXNoKHJvdyk7CisgICAgICAgICAgICByZXR1cm4gdXBkYXRlczsKKyAgICAgICAgfQorCisgICAgICAgIEZvcmVpZ25LZXlbXSBma3MgPSByb3cuZ2V0VGFibGUoKS5nZXRGb3JlaWduS2V5cygpOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtOworICAgICAgICBQcmltYXJ5Um93IHJlbDsKKyAgICAgICAgUHJpbWFyeVJvdyB1cGRhdGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzbSA9IHJvdy5nZXRGb3JlaWduS2V5U2V0KGZrc1tpXSk7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gb25seSBuZWVkIGFuIHVwZGF0ZSBpZiB3ZSBoYXZlIGFuIGZrIHRvIGEgcm93IHRoYXQncyBiZWluZworICAgICAgICAgICAgLy8gaW5zZXJ0ZWQgYWZ0ZXIgd2UgYXJlOyBpZiByb3cgaXMgZGVwZW5kZW50IG9uIGl0c2VsZiBhbmQgbm8KKyAgICAgICAgICAgIC8vIGZrLCBtdXN0IGJlIGFuIGF1dG8taW5jIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkbid0IGhhdmUKKyAgICAgICAgICAgIC8vIHJlY29yZGVkIGl0CisgICAgICAgICAgICByZWwgPSAoUHJpbWFyeVJvdykgcm93TWdyLmdldFJvdyhma3NbaV0uZ2V0UHJpbWFyeUtleVRhYmxlKCksCisgICAgICAgICAgICAgICAgUm93LkFDVElPTl9JTlNFUlQsIHNtLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAocmVsID09IG51bGwgfHwgIXJlbC5pc1ZhbGlkKCkKKyAgICAgICAgICAgICAgICB8fCByZWwuZ2V0SW5kZXgoKSA8IHJvdy5nZXRJbmRleCgpCisgICAgICAgICAgICAgICAgfHwgKHJlbCA9PSByb3cgJiYgIWZrc1tpXS5pc0RlZmVycmVkKCkgJiYgIWZrc1tpXS5pc0xvZ2ljYWwoKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGRvbid0IGluc2VydCBvciB1cGRhdGUgd2l0aCB0aGUgZ2l2ZW4gZms7IGNyZWF0ZSBhIGRlZmVycmVkCisgICAgICAgICAgICAvLyB1cGRhdGUgZm9yIGFmdGVyIHRoZSByZWwgcm93IGhhcyBiZWVuIGluc2VydGVkOyB1c2UgYSBwcmltYXJ5IHJvdworICAgICAgICAgICAgLy8gdG8gcHJldmVudCBzZXR0aW5nIHZhbHVlcyB1bnRpbCBhZnRlciBmbHVzaCB0byBnZXQgYXV0by1pbmMKKyAgICAgICAgICAgIHVwZGF0ZSA9IG5ldyBQcmltYXJ5Um93KHJvdy5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX1VQREFURSwgbnVsbCk7CisgICAgICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgICAgIHVwZGF0ZS53aGVyZVByaW1hcnlLZXkocm93LmdldFByaW1hcnlLZXkoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcm93LmNvcHlJbnRvKHVwZGF0ZSwgdHJ1ZSk7CisgICAgICAgICAgICB1cGRhdGUuc2V0Rm9yZWlnbktleShma3NbaV0sIHJvdy5nZXRGb3JlaWduS2V5SU8oZmtzW2ldKSwgc20pOworICAgICAgICAgICAgcm93LmNsZWFyRm9yZWlnbktleShma3NbaV0pOworCisgICAgICAgICAgICBpZiAodXBkYXRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB1cGRhdGVzLmFkZCh1cGRhdGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJvdy5pc1ZhbGlkKCkpIC8vIGlmIHVwZGF0ZSwgbWF5YmUgbm8gbG9uZ2VyIG5lZWRlZAorICAgICAgICAgICAgcHNNZ3IuZmx1c2gocm93KTsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Ygc2Vjb25kYXJ5IHJvd3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmx1c2goQ29sbGVjdGlvbiByb3dzLCBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXIgcHNNZ3IpIHsKKyAgICAgICAgaWYgKHJvd3MuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFJvd0ltcGwgcm93OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHJvd3MuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHJvdyA9IChSb3dJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKHJvdy5pc1ZhbGlkKCkpCisgICAgICAgICAgICAgICAgcHNNZ3IuZmx1c2gocm93KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1BhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9QYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDViMDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9QYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworCisvKioKKyAqIE9iamVjdCBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGZldGNoZXMgb25lIHBhZ2Ugb2YgcmVzdWx0cyBhdCBhCisgKiBhIHRpbWUgYXMgaXQgc2Nyb2xscy4gSWYgdGhlIHtAbGluayAjZ2V0UGFnZWRGaWVsZHN9IG1ldGhvZCByZXR1cm5zIGEKKyAqIG5vbi1udWxsIGJpdCBzZXQsIHRoaXMgdGhpcyBwcm92aWRlciBpcyBhIGdvb2QgZml0IGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uCisgKiBUaGUgbWV0aG9kIHRlc3RzIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIDx1bD4KKyAqIDxsaT5UaGUgZWFnZXIgZmV0Y2ggbW9kZSBpcyA8Y29kZT5wYXJhbGxlbDwvY29kZT4uPC9saT4KKyAqIDxsaT5UaGUgc2VsZWN0J3MgcmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbGFyZ2UgcmVzdWx0IHNldC48L2xpPgorICogPGxpPlRoZSBtYXBwaW5nIGJlaW5nIHNlbGVjdGVkIGhhcyBmaWVsZHMgdGhhdCB1c2UgcGFyYWxsZWwgc2VsZWN0cworICogdW5kZXIgdGhlIGN1cnJlbnQgZmV0Y2ggY29uZmlndXJhdGlvbi48L2xpPgorICogPC91bD4KKyAqICBUbyB1c2UgdGhpcyBwcm92aWRlciwgc2VsZWN0IHRoZSBjYW5kaWRhdGUgbWFwcGluZyB3aXRoIGVhZ2VyIGZldGNoCisgKiBtb2RlIHNldCB0byA8Y29kZT5qb2luPC9jb2RlPi4gVGhpcyBwcm92aWRlciB3aWxsIHRha2UgY2FyZSBvZiBwZXJmb3JtaW5nCisgKiA8Y29kZT5wYXJhbGxlbDwvY29kZT4gbW9kZSBiYXRjaCBzZWxlY3RzIGZvciBlYWNoIHBhZ2UgaXQgcmVhZHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFBhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgZXh0ZW5kcyBTZWxlY3RSZXN1bHRPYmplY3RQcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWFwcGluZ1tdIF9tYXBwaW5nczsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9wYWdlOworICAgIHByaXZhdGUgZmluYWwgaW50W10gX2lkeHM7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRTZXRbXSBfcGFnZWQ7CisgICAgcHJpdmF0ZSBpbnQgX3BvcyA9IC0xOyAvLyBsb2dpY2FsIHBvcworICAgIHByaXZhdGUgaW50IF9wYWdlUG9zID0gLTE7IC8vIHBvcyBvZiBwYWdlIHN0YXJ0CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBiaXQgc2V0IHJlcHJlc2VudGluZyBiYXRjaCBzZWxlY3QgZmllbGRzIHRoYXQgd2lsbCBiZSBwYWdlZCwKKyAgICAgKiBvciBudWxsIGlmIG5vIGZpZWxkcyBuZWVkIHBhZ2luZywgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhpcyBwcm92aWRlcgorICAgICAqIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI1BhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgZ2V0UGFnZWRGaWVsZHMoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSwKKyAgICAgICAgbG9uZyBzaXplKSB7CisgICAgICAgIC8vIGlmIHdlIGhhdmUgYSByYW5nZSB0aGVuIHdlIGFsd2F5cyB1c2UgcGFnaW5nIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgICAgLy8gZWFnZXIgc2VsZWN0IGZpZWxkczsgb3RoZXJ3aXNlIGl0IGRlcGVuZHMgb24gbHJzIGFuZCBmZXRjaCBzZXR0aW5ncworICAgICAgICBpZiAoc2l6ZSA9PSBMb25nLk1BWF9WQUxVRSB8fCAhc2VsLmdldEF1dG9EaXN0aW5jdCgpKSB7CisgICAgICAgICAgICAvLyBub3QgbHJzPworICAgICAgICAgICAgaWYgKCFzZWwuaXNMUlMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIC8vIG5vdCBjb25maWd1cmVkIGZvciBsYXp5IGxvYWRpbmc/CisgICAgICAgICAgICBpZiAoZmV0Y2guZ2V0RmV0Y2hCYXRjaFNpemUoKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3QgY29uZmlndXJlZCBmb3IgZWFnZXIgc2VsZWN0cz8KKyAgICAgICAgZWFnZXJNb2RlID0gTWF0aC5taW4oZWFnZXJNb2RlLCBmZXRjaC5nZXRFYWdlckZldGNoTW9kZSgpKTsKKyAgICAgICAgaWYgKGVhZ2VyTW9kZSAhPSBmZXRjaC5FQUdFUl9QQVJBTExFTCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGFyZSB0aGVyZSBhbnkgbWFwcGluZ3MgdGhhdCByZXF1aXJlIGJhdGNoZWQgc2VsZWN0cz8KKyAgICAgICAgRmllbGRNYXBwaW5nW10gZm1zID0gbWFwcGluZy5nZXREZWZpbmVkRmllbGRNYXBwaW5ncygpOworICAgICAgICBCaXRTZXQgcGFnZWQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZldGNoLnJlcXVpcmVzRmV0Y2goZm1zW2ldKSAhPSBGZXRjaENvbmZpZ3VyYXRpb24uRkVUQ0hfTE9BRCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGZtc1tpXS5zdXBwb3J0c1NlbGVjdChzZWwsIHNlbC5FQUdFUl9QQVJBTExFTCwgbnVsbCwgc3RvcmUsCisgICAgICAgICAgICAgICAgZmV0Y2gpID4gMCAmJiAoZm1zW2ldLmlzRWFnZXJTZWxlY3RUb01hbnkoKSB8fCBmbXNbaV0uCisgICAgICAgICAgICAgICAgc3VwcG9ydHNTZWxlY3Qoc2VsLCBzZWwuRUFHRVJfT1VURVIsIG51bGwsIHN0b3JlLCBmZXRjaCkgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2VkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHBhZ2VkID0gbmV3IEJpdFNldCgpOworICAgICAgICAgICAgICAgIHBhZ2VkLnNldChmbXNbaV0uZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhZ2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbCB0aGUgc2VsZWN0IHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgbWFwcGluZyBvZiB0aGUgcmVzdWx0IG9iamVjdHMKKyAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHN0b3JlIG1hbmFnZXIgdG8gZGVsZWdhdGUgbG9hZGluZyB0bworICAgICAqIEBwYXJhbSBmZXRjaCB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbiwgb3IgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSBwYWdlZCB0aGUgYml0IHNldCByZXR1cm5lZCBmcm9tIHtAbGluayAjZ2V0UGFnZWRGaWVsZHN9CisgICAgICogQHBhcmFtIHNpemUgdGhlIGtub3duIG1heGltdW0gc2l6ZSBvZiB0aGUgcmVzdWx0LCBvcgorICAgICAqIHtAbGluayBMb25nI01BWF9WQUxVRX0gZm9yIG5vIGtub3duIGxpbWl0CisgICAgICovCisgICAgcHVibGljIFBhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyKFNlbGVjdEV4ZWN1dG9yIHNlbCwKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgQml0U2V0IHBhZ2VkLCBsb25nIHNpemUpIHsKKyAgICAgICAgdGhpcyhzZWwsIG5ldyBDbGFzc01hcHBpbmdbXXsgbWFwcGluZyB9LCBzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICBuZXcgQml0U2V0W117IHBhZ2VkIH0sIHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbCB0aGUgc2VsZWN0IHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gbWFwcGluZ3MgdGhlIG1hcHBpbmdzIGZvciB0aGUgaW5kZXBlbmRlbnQgY2xhc3NlcyBvZiB0aGUKKyAgICAgKiByZXN1bHQgb2JqZWN0cworICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgc3RvcmUgbWFuYWdlciB0byBkZWxlZ2F0ZSBsb2FkaW5nIHRvCisgICAgICogQHBhcmFtIGZldGNoIHRoZSBmZXRjaCBjb25maWd1cmF0aW9uLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIHBhZ2VkIHRoZSBiaXQgc2V0cyByZXR1cm5lZCBmcm9tIHtAbGluayAjZ2V0UGFnZWRGaWVsZHN9CisgICAgICogZm9yIGVhY2ggc2VsZWN0IGluIHRoZSBwb3NzaWJsZSB1bmlvbgorICAgICAqIEBwYXJhbSBzaXplIHRoZSBrbm93biBtYXhpbXVtIHNpemUgb2YgdGhlIHJlc3VsdCwgb3IKKyAgICAgKiB7QGxpbmsgTG9uZyNNQVhfVkFMVUV9IGZvciBubyBrbm93biBsaW1pdAorICAgICAqLworICAgIHB1YmxpYyBQYWdpbmdSZXN1bHRPYmplY3RQcm92aWRlcihTZWxlY3RFeGVjdXRvciBzZWwsCisgICAgICAgIENsYXNzTWFwcGluZ1tdIG1hcHBpbmdzLCBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIEJpdFNldFtdIHBhZ2VkLCBsb25nIHNpemUpIHsKKyAgICAgICAgc3VwZXIoc2VsLCBzdG9yZSwgZmV0Y2gpOworICAgICAgICBfbWFwcGluZ3MgPSBtYXBwaW5nczsKKyAgICAgICAgX3BhZ2VkID0gcGFnZWQ7CisKKyAgICAgICAgLy8gZG9uJ3QgbGV0IHN5c3RlbSBjb25zdHJ1Y3QgdGhpcyB0eXBlIG9mIHJvcCBmb3Igc3R1cGlkIHNpemVzCisgICAgICAgIGlmIChzaXplIDw9IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oInNpemU9IiArIHNpemUpOworCisgICAgICAgIC8vIHRyeSB0byBmaW5kIGEgZ29vZCBwYWdlIHNpemUuICBpZiB0aGUga25vd24gc2l6ZSA8IGJhdGNoIHNpemUsIHVzZQorICAgICAgICAvLyBpdC4gIGlmIHRoZSBiYXRjaCBzaXplIGlzIHNldCwgdGhlbiB1c2UgdGhhdDsgaWYgaXQncyBzb3J0YSBjbG9zZQorICAgICAgICAvLyB0byB0aGUgc2l6ZSwgdGhlbiB1c2UgdGhlIHNpemUgLyAyIHRvIGdldCB0d28gZnVsbCBwYWdlcyByYXRoZXIKKyAgICAgICAgLy8gdGhhbiBhIHBvc3NpYmxlIGJpZyBvbmUgYW5kIHNtYWxsIG9uZQorICAgICAgICBpbnQgYmF0Y2ggPSBnZXRGZXRjaENvbmZpZ3VyYXRpb24oKS5nZXRGZXRjaEJhdGNoU2l6ZSgpOworICAgICAgICBpbnQgcGFnZVNpemU7CisgICAgICAgIGlmIChiYXRjaCA8IDApCisgICAgICAgICAgICBwYWdlU2l6ZSA9IChpbnQpIHNpemU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGJhdGNoID09IDApCisgICAgICAgICAgICAgICAgYmF0Y2ggPSA1MDsgLy8gcmVhc29uYWJsZSBkZWZhdWx0CisgICAgICAgICAgICBpZiAoc2l6ZSA8PSBiYXRjaCkKKyAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IChpbnQpIHNpemU7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplIDw9IGJhdGNoICogMikgeworICAgICAgICAgICAgICAgIGlmIChzaXplICUgMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IChpbnQpIChzaXplIC8gMik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IChpbnQpIChzaXplIC8gMiArIDEpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcGFnZVNpemUgPSBiYXRjaDsKKyAgICAgICAgfQorCisgICAgICAgIF9wYWdlID0gbmV3IE9iamVjdFtwYWdlU2l6ZV07CisgICAgICAgIGlmIChfcGFnZWQubGVuZ3RoID4gMSkKKyAgICAgICAgICAgIF9pZHhzID0gbmV3IGludFtwYWdlU2l6ZV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9pZHhzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhZ2Ugc2l6ZSBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYWdlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYWdlLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLm9wZW4oKTsKKyAgICAgICAgX3BvcyA9IC0xOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5leHQoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3BvcysrOworICAgICAgICBpZiAoaW5QYWdlKCkpCisgICAgICAgICAgICByZXR1cm4gX3BhZ2VbX3BvcyAtIF9wYWdlUG9zXSAhPSBudWxsOworICAgICAgICBpZiAoIXN1cGVyLm5leHQoKSkgeworICAgICAgICAgICAgc2V0U2l6ZShfcG9zKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhYnNvbHV0ZShpbnQgcG9zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3BvcyA9IHBvczsKKyAgICAgICAgaWYgKGluUGFnZSgpKQorICAgICAgICAgICAgcmV0dXJuIF9wYWdlW19wb3MgLSBfcGFnZVBvc10gIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmFic29sdXRlKHBvcyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRPYmplY3QoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpblBhZ2UoKSkKKyAgICAgICAgICAgIGZpbGxQYWdlKCk7CisgICAgICAgIHJldHVybiBfcGFnZVtfcG9zIC0gX3BhZ2VQb3NdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBvdXIgY3VycmVudCBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlIGNhY2hlZCBwYWdlIG9mIHJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluUGFnZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYWdlUG9zICE9IC0xICYmIF9wb3MgPj0gX3BhZ2VQb3MKKyAgICAgICAgICAgICYmIF9wb3MgPCBfcGFnZVBvcyArIF9wYWdlLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIG5ldyBwYWdlIGF0IHRoZSBwcmVzZW50IHBvc2l0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaWxsUGFnZSgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBjbGVhciBwYWdlCisgICAgICAgIEFycmF5cy5maWxsKF9wYWdlLCBudWxsKTsKKworICAgICAgICAvLyBjYWNoZSByZXN1bHQgb2JqZWN0cworICAgICAgICBKREJDU3RvcmVNYW5hZ2VyIHN0b3JlTWdyID0gKEpEQkNTdG9yZU1hbmFnZXIpIGdldFN0b3JlKCk7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nOworICAgICAgICBSZXN1bHQgcmVzOworICAgICAgICBpbnQgaWR4OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9wYWdlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXMgPSBnZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIGlkeCA9IHJlcy5pbmRleE9mKCk7CisgICAgICAgICAgICBpZiAoX2lkeHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaWR4c1tpXSA9IGlkeDsKKyAgICAgICAgICAgIG1hcHBpbmcgPSByZXMuZ2V0QmFzZU1hcHBpbmcoKTsKKyAgICAgICAgICAgIGlmIChtYXBwaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgbWFwcGluZyA9IF9tYXBwaW5nc1tpZHhdOworCisgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB1c2UgdGhlIHN0YW5kYXJkIHJlc3VsdC5sb2FkKCksIHdlIGdvIGRpcmVjdCB0bworICAgICAgICAgICAgLy8gdGhlIHN0b3JlIG1hbmFnZXIgc28gd2UgY2FuIHBhc3MgaW4gb3VyIGVhZ2VyLWZldGNoZWQgZmllbGRzIGFzCisgICAgICAgICAgICAvLyBmaWVsZHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBpbml0aWFsIGxvYWQgb2YgdGhlIG9iamVjdHMKKyAgICAgICAgICAgIF9wYWdlW2ldID0gc3RvcmVNZ3IubG9hZChtYXBwaW5nLCBnZXRGZXRjaENvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICBfcGFnZWRbaWR4XSwgcmVzKTsKKyAgICAgICAgICAgIGlmIChpICE9IF9wYWdlLmxlbmd0aCAtIDEgJiYgIWdldFJlc3VsdCgpLm5leHQoKSkgeworICAgICAgICAgICAgICAgIHNldFNpemUoX3BvcyArIGkgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvYWQgZGF0YSBmb3IgZWFnZXIgZmllbGRzCisgICAgICAgIF9wYWdlUG9zID0gX3BvczsKKyAgICAgICAgaWYgKF9wYWdlWzBdICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfcGFnZS5sZW5ndGggPiAxICYmIF9wYWdlWzFdID09IG51bGwpCisgICAgICAgICAgICAgICAgbG9hZEVhZ2VyRmllbGRzKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXhlY3V0ZUVhZ2VyU2VsZWN0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBpbiBhIHBhZ2UsIGxvYWQgZmllbGRzIGFzIG5vcm1hbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZEVhZ2VyRmllbGRzKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpZHggPSAoX2lkeHMgPT0gbnVsbCkgPyAwIDogX2lkeHNbMF07CisgICAgICAgIGlmIChfcGFnZWRbaWR4XSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSBzdG9yZS5nZXRDb250ZXh0KCkuZ2V0U3RhdGVNYW5hZ2VyKF9wYWdlWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IF9wYWdlZFtpZHhdLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfcGFnZWRbaWR4XS5nZXQoaSkpIHsKKyAgICAgICAgICAgICAgICBfbWFwcGluZ3NbaWR4XS5nZXRGaWVsZE1hcHBpbmcoaSkubG9hZChzbSwgc3RvcmUsCisgICAgICAgICAgICAgICAgICAgIGdldEZldGNoQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgZWFnZXIgYmF0Y2ggc2VsZWN0cyBmb3IgY3VycmVudCBwYWdlIG9mIHJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVFYWdlclNlbGVjdHMoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9pZHhzID09IG51bGwpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVFYWdlclNlbGVjdHMoX21hcHBpbmdzWzBdLCBfcGFnZWRbMF0sIDAsIF9wYWdlLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBpbnQgaWR4ID0gX2lkeHNbMF07CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBmb3IgKDsgcG9zIDwgX3BhZ2UubGVuZ3RoICYmIF9wYWdlW3Bvc10gIT0gbnVsbDsgcG9zKyspIHsKKyAgICAgICAgICAgIGlmIChpZHggIT0gX2lkeHNbcG9zXSkgeworICAgICAgICAgICAgICAgIGlmIChfcGFnZWRbaWR4XSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlRWFnZXJTZWxlY3RzKF9tYXBwaW5nc1tpZHhdLCBfcGFnZWRbaWR4XSwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIGlkeCA9IF9pZHhzW3Bvc107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0IDwgcG9zICYmIF9wYWdlZFtpZHhdICE9IG51bGwpIC8vIGNsZWFudXAgcmVtYWluZGVyCisgICAgICAgICAgICBleGVjdXRlRWFnZXJTZWxlY3RzKF9tYXBwaW5nc1tpZHhdLCBfcGFnZWRbaWR4XSwgc3RhcnQsIHBvcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBlYWdlciBiYXRjaCBzZWxlY3RzIGZvciB0aGUgZ2l2ZW4gbWFwcGluZyBhbmQgaXRzIHN1cGVyY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUVhZ2VyU2VsZWN0cyhDbGFzc01hcHBpbmcgbWFwcGluZywgQml0U2V0IHBhZ2VkLAorICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBiYXNlIGNhc2UKKyAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyByZWN1cnNlIG9uIHN1cGVyY2xhc3MKKyAgICAgICAgZXhlY3V0ZUVhZ2VyU2VsZWN0cyhtYXBwaW5nLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpLCBwYWdlZCwKKyAgICAgICAgICAgIHN0YXJ0LCBlbmQpOworCisgICAgICAgIC8vIGZpZ3VyZSBvdXQgaG93IG1hbnkgYmF0Y2ggc2VsZWN0cyB0byBkbyBvbiB0aGlzIG1hcHBpbmcKKyAgICAgICAgRmllbGRNYXBwaW5nW10gZm1zID0gbWFwcGluZy5nZXREZWZpbmVkRmllbGRNYXBwaW5ncygpOworICAgICAgICBpbnQgc2VscyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHBhZ2VkLmdldChmbXNbaV0uZ2V0SW5kZXgoKSkpCisgICAgICAgICAgICAgICAgc2VscysrOworICAgICAgICBpZiAoc2VscyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGNyZWF0ZSB3aGVyZSBjb25kaXRpb24gbGltaXRpbmcgaW5zdGFuY2VzIHRvIHRoaXMgcGFnZQorICAgICAgICBKREJDU3RvcmUgc3RvcmUgPSBnZXRTdG9yZSgpOworICAgICAgICBTZWxlY3Qgc2VsID0gc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1NlbGVjdCgpOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IHN0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihkaWN0KTsKKyAgICAgICAgQ29sdW1uW10gcGtzID0gbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBpZiAocGtzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgY3JlYXRlSW5Db250YWlucyhzZWwsIGRpY3QsIGJ1ZiwgbWFwcGluZywgcGtzLCBzdGFydCwgZW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3JDb250YWlucyhzZWwsIGJ1ZiwgbWFwcGluZywgcGtzLCBzdGFydCwgZW5kKTsKKyAgICAgICAgc2VsLndoZXJlKGJ1Zik7CisKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCA9IHN0b3JlLmdldENvbnRleHQoKTsKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCA9IGdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICAvLyBkbyBlYWNoIGJhdGNoIHNlbGVjdAorICAgICAgICBPYmplY3QgcmVzOworICAgICAgICBpbnQgZXNlbHMgPSAwOworICAgICAgICBTZWxlY3RFeGVjdXRvciBlc2VsOworICAgICAgICBpbnQgdW5pb25zOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFwYWdlZC5nZXQoZm1zW2ldLmdldEluZGV4KCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB1bmlvbnMgPSBmbXNbaV0uc3VwcG9ydHNTZWxlY3Qoc2VsLCBTZWxlY3QuRUFHRVJfUEFSQUxMRUwsIG51bGwsCisgICAgICAgICAgICAgICAgc3RvcmUsIGZldGNoKTsKKyAgICAgICAgICAgIGlmICh1bmlvbnMgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBjbG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHNlbGVjdAorICAgICAgICAgICAgZXNlbHMrKzsKKyAgICAgICAgICAgIGlmIChlc2VscyA8IHNlbHMgfHwgdW5pb25zID4gMSkKKyAgICAgICAgICAgICAgICBlc2VsID0gc2VsLndoZXJlQ2xvbmUodW5pb25zKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlc2VsID0gc2VsOworCisgICAgICAgICAgICAvLyBnZXQgcmVzdWx0CisgICAgICAgICAgICBmbXNbaV0uc2VsZWN0RWFnZXJQYXJhbGxlbChlc2VsLCBudWxsLCBzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9QQVJBTExFTCk7CisgICAgICAgICAgICByZXMgPSBlc2VsLmV4ZWN1dGUoc3RvcmUsIGZldGNoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gYW5kIGxvYWQgcmVzdWx0IGludG8gcGFnZWQgaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0OyBqIDwgZW5kICYmIF9wYWdlW2pdICE9IG51bGw7IGorKykKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gZm1zW2ldLmxvYWRFYWdlclBhcmFsbGVsKGN0eC5nZXRTdGF0ZU1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcGFnZVtqXSksIHN0b3JlLCBmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIENsb3NlYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsgKChDbG9zZWFibGUpIHJlcykuY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQmFzZWQgb24gdGhlIERCRGljdGlvbmFyeSwgY3JlYXRlIHRoZSBuZWVkZWQgSU4gY2xhdXNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSW5Db250YWlucyhTZWxlY3Qgc2VsLCBEQkRpY3Rpb25hcnkgZGljdCwgU1FMQnVmZmVyIGJ1ZiwgCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nLCBDb2x1bW5bXSBwa3MsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICBpbnQgaW5DbGF1c2VMaW1pdCA9IGRpY3QuaW5DbGF1c2VMaW1pdDsKKyAgICAgICAgaWYgKGluQ2xhdXNlTGltaXQgPD0gMCB8fCBlbmQgLSBzdGFydCA8PSBpbkNsYXVzZUxpbWl0KQorICAgICAgICAgICAgaW5Db250YWlucyhzZWwsIGJ1ZiwgbWFwcGluZywgcGtzLCBzdGFydCwgZW5kKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIoIik7CisgICAgICAgICAgICBmb3IgKGludCBsb3cgPSBzdGFydCwgaGlnaDsgbG93IDwgZW5kOyBsb3cgPSBoaWdoKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvdyA+IHN0YXJ0KQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgT1IgIik7CisgICAgICAgICAgICAgICAgaGlnaCA9IE1hdGgubWluKGxvdyArIGluQ2xhdXNlTGltaXQsIGVuZCk7CisgICAgICAgICAgICAgICAgaW5Db250YWlucyhzZWwsIGJ1ZiwgbWFwcGluZywgcGtzLCBsb3csIGhpZ2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBJTiBjbGF1c2UgbGltaXRpbmcgdGhlIHJlc3VsdHMgdG8gdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5Db250YWlucyhTZWxlY3Qgc2VsLCBTUUxCdWZmZXIgYnVmLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgQ29sdW1uW10gcGtzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgYnVmLmFwcGVuZChzZWwuZ2V0Q29sdW1uQWxpYXMocGtzWzBdKSkuYXBwZW5kKCIgSU4gKCIpOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQgJiYgX3BhZ2VbaV0gIT0gbnVsbDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IHN0YXJ0KQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBidWYuYXBwZW5kVmFsdWUobWFwcGluZy50b0RhdGFTdG9yZVZhbHVlKF9wYWdlW2ldLCBwa3MsCisgICAgICAgICAgICAgICAgZ2V0U3RvcmUoKSksIHBrc1swXSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBPUiBjb25kaXRpb25zIGxpbWl0aW5nIHRoZSByZXN1bHRzIHRvIHRoZSBjdXJlbnQgcGFnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb3JDb250YWlucyhTZWxlY3Qgc2VsLCBTUUxCdWZmZXIgYnVmLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgQ29sdW1uW10gcGtzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgU3RyaW5nW10gYWxpYXNlcyA9IG5ldyBTdHJpbmdbcGtzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGtzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYWxpYXNlc1tpXSA9IHNlbC5nZXRDb2x1bW5BbGlhcyhwa3NbaV0pOworCisgICAgICAgIE9iamVjdFtdIHZhbHM7CisgICAgICAgIGJ1Zi5hcHBlbmQoIigiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kICYmIF9wYWdlW2ldICE9IG51bGw7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiBzdGFydCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgT1IgIik7CisKKyAgICAgICAgICAgIHZhbHMgPSAoT2JqZWN0W10pIG1hcHBpbmcudG9EYXRhU3RvcmVWYWx1ZShfcGFnZVtpXSwgcGtzLAorICAgICAgICAgICAgICAgIGdldFN0b3JlKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWxzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGogPiAwKQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgQU5EICIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYWxpYXNlc1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHNbal0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIElTICIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiID0gIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZFZhbHVlKHZhbHNbal0sIHBrc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1Blc3NpbWlzdGljTG9ja01hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1Blc3NpbWlzdGljTG9ja01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDhjZmJkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvUGVzc2ltaXN0aWNMb2NrTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlZlcnNpb25Mb2NrTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkxvY2tFeGNlcHRpb247CisKKy8qKgorICogTG9jayBtYW5hZ2VyIHRoYXQgdXNlcyBleGNsdXNpdmUgZGF0YWJhc2UgbG9ja3MuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGNsYXNzIFBlc3NpbWlzdGljTG9ja01hbmFnZXIKKyAgICBleHRlbmRzIFZlcnNpb25Mb2NrTWFuYWdlcgorICAgIGltcGxlbWVudHMgSkRCQ0xvY2tNYW5hZ2VyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0tfREFUQVNUT1JFX09OTFkgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUGVzc2ltaXN0aWNMb2NrTWFuYWdlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIEpEQkNTdG9yZSBfc3RvcmU7CisKKyAgICBwdWJsaWMgUGVzc2ltaXN0aWNMb2NrTWFuYWdlcigpIHsKKyAgICAgICAgc2V0VmVyc2lvbkNoZWNrT25SZWFkTG9jayhmYWxzZSk7CisgICAgICAgIHNldFZlcnNpb25VcGRhdGVPbldyaXRlTG9jayhmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyLnNldENvbnRleHQoY3R4KTsKKyAgICAgICAgX3N0b3JlID0gKEpEQkNTdG9yZSkgY3R4LmdldFN0b3JlTWFuYWdlcigpLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0Rm9yVXBkYXRlKFNlbGVjdCBzZWwsIGludCBsb2NrTGV2ZWwpIHsKKyAgICAgICAgaWYgKGxvY2tMZXZlbCA9PSBMT0NLX05PTkUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBfc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCk7CisgICAgICAgIGlmIChkaWN0LnNpbXVsYXRlTG9ja2luZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGRpY3Quc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUsCisgICAgICAgICAgICAiU3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUiKTsKKworICAgICAgICBpZiAoIXNlbC5zdXBwb3J0c0xvY2tpbmcoKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoImNhbnQtbG9jay1vbi1sb2FkIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsLnRvU2VsZWN0KGZhbHNlLCBudWxsKS5nZXRTUUwoKSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZW5zdXJlU3RvcmVNYW5hZ2VyVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZGVkRm9yVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgLy8gd2Ugc2V0IGEgbG93IGxvY2sgbGV2ZWwgdG8gaW5kaWNhdGUgdGhhdCB3ZSBkb24ndCBuZWVkIGRhdGFzdG9yZQorICAgICAgICAvLyBsb2NraW5nLCBidXQgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhIHJlYWQgb3Igd3JpdGUgbG9jaworICAgICAgICAvLyBhY2NvcmRpbmcgdG8gb3VyIHN1cGVyY2xhc3MKKyAgICAgICAgaWYgKGdldExvY2tMZXZlbChzbSkgPT0gTE9DS19OT05FKQorICAgICAgICAgICAgc2V0TG9ja0xldmVsKHNtLCBMT0NLX0RBVEFTVE9SRV9PTkxZKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2NrSW50ZXJuYWwoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IGxldmVsLCBpbnQgdGltZW91dCwKKyAgICAgICAgT2JqZWN0IHNkYXRhKSB7CisgICAgICAgIC8vIHdlIGNhbiBza2lwIGFueSBhbHJlYWR5LWxvY2tlZCBpbnN0YW5jZSByZWdhcmRsZXNzIG9mIGxldmVsIGJlY2F1c2UKKyAgICAgICAgLy8gd2UgdHJlYXQgYWxsIGxvY2tzIHRoZSBzYW1lICh0aG91Z2ggc3VwZXIgZG9lc24ndCkKKyAgICAgICAgaWYgKGdldExvY2tMZXZlbChzbSkgPT0gTE9DS19OT05FKSB7CisgICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gbG9jayBpZiBub3QgbG9hZGVkIGZyb20gbG9ja2luZyByZXN1bHQKKyAgICAgICAgICAgIENvbm5lY3Rpb25JbmZvIGluZm8gPSAoQ29ubmVjdGlvbkluZm8pIHNkYXRhOworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLnJlc3VsdCA9PSBudWxsIHx8ICFpbmZvLnJlc3VsdC5pc0xvY2tpbmcoKSkKKyAgICAgICAgICAgICAgICBsb2NrUm93KHNtLCB0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5sb2NrSW50ZXJuYWwoc20sIGxldmVsLCB0aW1lb3V0LCBzZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9jayB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHJvdyBieSBpc3N1aW5nIGEgIlNFTEVDVCAuLi4gRk9SIFVQREFURSIKKyAgICAgKiBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvY2tSb3coT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IHRpbWVvdXQpIHsKKyAgICAgICAgLy8gYXNzZXJ0IHRoYXQgdGhlIGRpY3Rpb25hcnkgc3VwcG9ydHMgdGhlICJTRUxFQ1QgLi4uIEZPUiBVUERBVEUiCisgICAgICAgIC8vIGNvbnN0cnVjdDsgaWYgbm90LCBhbmQgd2UgdGhlIGFzc2VydGlvbiBkb2VzIG5vdCB0aHJvdyBhbgorICAgICAgICAvLyBleGNlcHRpb24sIHRoZW4ganVzdCByZXR1cm4gd2l0aG91dCBsb2NraW5nCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX3N0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBpZiAoZGljdC5zaW11bGF0ZUxvY2tpbmcpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChkaWN0LnN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlLAorICAgICAgICAgICAgIlN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlIik7CisKKyAgICAgICAgT2JqZWN0IGlkID0gc20uZ2V0T2JqZWN0SWQoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSAoQ2xhc3NNYXBwaW5nKSBzbS5nZXRNZXRhRGF0YSgpOworICAgICAgICB3aGlsZSAobWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisKKyAgICAgICAgLy8gc2VsZWN0IG9ubHkgdGhlIFBLIGNvbHVtbnMsIHNpbmNlIHdlIGp1c3Qgd2FudCB0byBsb2NrCisgICAgICAgIFNlbGVjdCBzZWxlY3QgPSBfc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1NlbGVjdCgpOworICAgICAgICBzZWxlY3Quc2VsZWN0KG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSk7CisgICAgICAgIHNlbGVjdC53aGVyZVByaW1hcnlLZXkoaWQsIG1hcHBpbmcsIF9zdG9yZSk7CisgICAgICAgIFNRTEJ1ZmZlciBzcWwgPSBzZWxlY3QudG9TZWxlY3QodHJ1ZSwgX3N0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpKTsKKworICAgICAgICBlbnN1cmVTdG9yZU1hbmFnZXJUcmFuc2FjdGlvbigpOworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBfc3RvcmUuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG1udCA9IHNxbC5wcmVwYXJlU3RhdGVtZW50KGNvbm4pOworICAgICAgICAgICAgaWYgKHRpbWVvdXQgPj0gMCAmJiBkaWN0LnN1cHBvcnRzUXVlcnlUaW1lb3V0KSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPCAxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAxMDAwOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJtaWxsaXMtcXVlcnktdGltZW91dCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RtbnQuc2V0UXVlcnlUaW1lb3V0KHRpbWVvdXQgLyAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJzID0gc3RtbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICBpZiAoIXJzLm5leHQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja0V4Y2VwdGlvbihzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgZGljdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RtbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeyBzdG1udC5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHt9CisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeyBycy5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHt9CisgICAgICAgICAgICB0cnkgeyBjb25uLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZm9yY2UgdGhhdCB3ZSBoYXZlIGFuIGFjdHVhbCB0cmFuc2FjdGlvbiBpbiBwcm9ncmVzcyBzbyB0aGF0IHdlIGNhbgorICAgICAqIHN0YXJ0IGxvY2tpbmcuIFRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYWxyZWFkeSBiZSBiZWd1biB3aGVuIHVzaW5nIGEKKyAgICAgKiBkYXRhc3RvcmUgdHJhbnNhY3Rpb247IHRoaXMgd2lsbCBqdXN0IGJlIHVzZWQgaWYgd2UgYXJlIGxvY2tpbmcgaW4KKyAgICAgKiBvcHRpbWlzdGljIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVN0b3JlTWFuYWdlclRyYW5zYWN0aW9uKCkgeworICAgICAgICBpZiAoIV9zdG9yZS5nZXRDb250ZXh0KCkuaXNTdG9yZUFjdGl2ZSgpKSB7CisgICAgICAgICAgICBfc3RvcmUuZ2V0Q29udGV4dCgpLmJlZ2luU3RvcmUoKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJzdGFydC10cmFucy1mb3ItbG9jayIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1ByZXBhcmVkU3RhdGVtZW50TWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1M2Q4MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1ByZXBhcmVkU3RhdGVtZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93SW1wbDsKKworLyoqCisgKiBNYW5hZ2VzIHByZXBhcmVkIHN0YXRlbWVudCBleGVjdXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXIgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleGNlcHRpb25zIGVuY291bnRlcmVkIGR1cmluZyBhbGwgZmx1c2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFeGNlcHRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgZ2l2ZW4gcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKFJvd0ltcGwgcm93KTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IHJvdyBoYXMgYmVlbgorICAgICAqIGZsdXNoZWQsIHRvIGZsdXNoIGFueSByZW1haW5pbmcgc3RhdGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VySW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzMyYTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9QcmVwYXJlZFN0YXRlbWVudE1hbmFnZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93SW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wdGltaXN0aWNFeGNlcHRpb247CisKKy8qKgorICogQmFzaWMgcHJlcGFyZWQgc3RhdGVtZW50IG1hbmFnZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VySW1wbCAKKyAgICBpbXBsZW1lbnRzIFByZXBhcmVkU3RhdGVtZW50TWFuYWdlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplcgorICAgICAgICAuZm9yUGFja2FnZShQcmVwYXJlZFN0YXRlbWVudE1hbmFnZXJJbXBsLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgSkRCQ1N0b3JlIF9zdG9yZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb24gX2Nvbm47CisgICAgcHJpdmF0ZSBmaW5hbCBEQkRpY3Rpb25hcnkgX2RpY3Q7CisKKyAgICAvLyB0cmFjayBleGNlcHRpb25zCisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIF9leGNlcHRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlcGFyZWRTdGF0ZW1lbnRNYW5hZ2VySW1wbChKREJDU3RvcmUgc3RvcmUsIENvbm5lY3Rpb24gY29ubikgeworICAgICAgICBfc3RvcmUgPSBzdG9yZTsKKyAgICAgICAgX2RpY3QgPSBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgX2Nvbm4gPSBjb25uOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBfZXhjZXB0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaChSb3dJbXBsIHJvdykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmx1c2hJbnRlcm5hbChyb3cpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIF9leGNlcHRpb25zLmFkZChTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBfZGljdCkpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICBfZXhjZXB0aW9ucy5hZGQoa2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGdpdmVuIHJvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmx1c2hJbnRlcm5hbChSb3dJbXBsIHJvdykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNhbid0IGJhdGNoIHJvd3Mgd2l0aCBhdXRvLWluYyBjb2x1bW5zCisgICAgICAgIENvbHVtbltdIGF1dG9Bc3NpZ24gPSBudWxsOworICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgYXV0b0Fzc2lnbiA9IHJvdy5nZXRUYWJsZSgpLmdldEF1dG9Bc3NpZ25lZENvbHVtbnMoKTsKKworICAgICAgICAvLyBwcmVwYXJlIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgc3FsID0gcm93LmdldFNRTChfZGljdCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChzcWwpOworCisgICAgICAgIC8vIHNldHVwIHBhcmFtZXRlcnMgYW5kIGV4ZWN1dGUgc3RhdGVtZW50CisgICAgICAgIHJvdy5mbHVzaChzdG1udCwgX2RpY3QsIF9zdG9yZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzdG1udC5leGVjdXRlVXBkYXRlKCk7CisgICAgICAgICAgICBpZiAoY291bnQgIT0gMSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBmYWlsZWQgPSByb3cuZ2V0RmFpbGVkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfZXhjZXB0aW9ucy5hZGQobmV3IE9wdGltaXN0aWNFeGNlcHRpb24oZmFpbGVkKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKF9sb2MuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZS1mYWlsZWQtbm8tZmFpbGVkLW9iaiIsIFN0cmluZy52YWx1ZU9mKGNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxbCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCByb3cuZ2V0RmFpbGVkT2JqZWN0KCksIF9kaWN0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBhdXRvIGFzc2lnbiB2YWx1ZXMKKyAgICAgICAgaWYgKGF1dG9Bc3NpZ24gIT0gbnVsbCAmJiBhdXRvQXNzaWduLmxlbmd0aCA+IDAKKyAgICAgICAgICAgICYmIHJvdy5nZXRQcmltYXJ5S2V5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IHJvdy5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZyA9IChDbGFzc01hcHBpbmcpIHNtLmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICBPYmplY3QgdmFsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRvQXNzaWduLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsID0gX2RpY3QuZ2V0R2VuZXJhdGVkS2V5KGF1dG9Bc3NpZ25baV0sIF9jb25uKTsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLmFzc2VydEpvaW5hYmxlKGF1dG9Bc3NpZ25baV0pLnNldEF1dG9Bc3NpZ25lZFZhbHVlKHNtLAorICAgICAgICAgICAgICAgICAgICBfc3RvcmUsIGF1dG9Bc3NpZ25baV0sIHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9Qcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1Byb2plY3Rpb25SZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGVlN2UKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9Qcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkV4cENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHMuUXVlcnlFeHByZXNzaW9uc1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLlZhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3RFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuUXVlcnlFeHByZXNzaW9uczsKKworLyoqCisgKiBPYmplY3QgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gd3JhcHBlZCBhcm91bmQgYSBwcm9qZWN0aW9uIHNlbGVjdC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIKKyAgICBleHRlbmRzIFNlbGVjdFJlc3VsdE9iamVjdFByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgUXVlcnlFeHByZXNzaW9uc1tdIF9leHBzOworICAgIHByaXZhdGUgZmluYWwgUXVlcnlFeHByZXNzaW9uc1N0YXRlW10gX3N0YXRlOworICAgIHByaXZhdGUgZmluYWwgRXhwQ29udGV4dCBfY3R4OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsIHRoZSBzZWxlY3QgdG8gZXhlY3V0ZQorICAgICAqIEBwYXJhbSBleHBzIHRoZSBxdWVyeSBleHByZXNzaW9ucworICAgICAqIEBwYXJhbSBzdGF0ZXMgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gc3RhdGVzCisgICAgICogQHBhcmFtIGN0eCB0aGUgcXVlcnkgZXhlY3V0aW9uIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvamVjdGlvblJlc3VsdE9iamVjdFByb3ZpZGVyKFNlbGVjdEV4ZWN1dG9yIHNlbCwgCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgUXVlcnlFeHByZXNzaW9uc1N0YXRlIHN0YXRlLCBFeHBDb250ZXh0IGN0eCkgeworICAgICAgICB0aGlzKHNlbCwgbmV3IFF1ZXJ5RXhwcmVzc2lvbnNbXXsgZXhwcyB9LCAKKyAgICAgICAgICAgIG5ldyBRdWVyeUV4cHJlc3Npb25zU3RhdGVbXXsgc3RhdGUgfSwgY3R4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWwgdGhlIHNlbGVjdCB0byBleGVjdXRlCisgICAgICogQHBhcmFtIGV4cHMgdGhlIHF1ZXJ5IGV4cHJlc3Npb25zCisgICAgICogQHBhcmFtIHN0YXRlcyB0aGUgcXVlcnkgZXhwcmVzc2lvbiBzdGF0ZXMKKyAgICAgKiBAcGFyYW0gY3R4IHRoZSBxdWVyeSBleGVjdXRpb24gY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIoU2VsZWN0RXhlY3V0b3Igc2VsLCAKKyAgICAgICAgUXVlcnlFeHByZXNzaW9uc1tdIGV4cHMsIFF1ZXJ5RXhwcmVzc2lvbnNTdGF0ZVtdIHN0YXRlLCBFeHBDb250ZXh0IGN0eCl7CisgICAgICAgIHN1cGVyKHNlbCwgY3R4LnN0b3JlLCBjdHguZmV0Y2gpOworICAgICAgICBfZXhwcyA9IGV4cHM7CisgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworICAgICAgICBfY3R4ID0gY3R4OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0T2JqZWN0KCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3VsdCByZXMgPSBnZXRSZXN1bHQoKTsKKyAgICAgICAgaW50IGlkeCA9IHJlcy5pbmRleE9mKCk7CisgICAgICAgIE9iamVjdFtdIGFyciA9IG5ldyBPYmplY3RbX2V4cHNbaWR4XS5wcm9qZWN0aW9ucy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leHBzW2lkeF0ucHJvamVjdGlvbnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhcnJbaV0gPSAoKFZhbCkgX2V4cHNbaWR4XS5wcm9qZWN0aW9uc1tpXSkubG9hZChfY3R4LCAKKyAgICAgICAgICAgICAgICBfc3RhdGVbaWR4XS5wcm9qZWN0aW9uc1tpXSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9TUUxQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1NRTFByb2plY3Rpb25SZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNGM2MDUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9TUUxQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdFNldFJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlJlc3VsdFBhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBQcm92aWRlcyBhbGwgY29sdW1uIGRhdGEgaW4gYSB7QGxpbmsgUmVzdWx0U2V0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBTUUxQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIKKyAgICBpbXBsZW1lbnRzIFJlc3VsdE9iamVjdFByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgSkRCQ1N0b3JlIF9zdG9yZTsKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gX2ZldGNoOworICAgIHByaXZhdGUgZmluYWwgUmVzdWx0U2V0UmVzdWx0IF9yZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRQYWNrZXIgX3BhY2tlcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBfY29sczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcyB0aGUgcmVzdWx0IGRhdGEKKyAgICAgKiBAcGFyYW0gY2xzIHRoZSByZXN1bHQgY2xhc3M7IG1heSBiZSBudWxsIGZvciB0aGUgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyBTUUxQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIoSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHRTZXRSZXN1bHQgcmVzLCBDbGFzcyBjbHMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RvcmUgPSBzdG9yZTsKKyAgICAgICAgX2ZldGNoID0gZmV0Y2g7CisKKyAgICAgICAgUmVzdWx0U2V0TWV0YURhdGEgbWV0YSA9IHJlcy5nZXRSZXN1bHRTZXQoKS5nZXRNZXRhRGF0YSgpOworICAgICAgICBfcmVzID0gcmVzOworICAgICAgICBfY29scyA9IG1ldGEuZ2V0Q29sdW1uQ291bnQoKTsKKworICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFsaWFzZXMgPSBuZXcgU3RyaW5nW19jb2xzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHM7IGkrKykKKyAgICAgICAgICAgICAgICBhbGlhc2VzW2ldID0gbWV0YS5nZXRDb2x1bW5MYWJlbChpICsgMSk7CisgICAgICAgICAgICBfcGFja2VyID0gbmV3IFJlc3VsdFBhY2tlcihudWxsLCBhbGlhc2VzLCBjbHMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIF9wYWNrZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuc3VwcG9ydHNSYW5kb21BY2Nlc3MoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRPYmplY3QoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9jb2xzID09IDEpIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWwgPSBfcmVzLmdldE9iamVjdChOdW1iZXJzLnZhbHVlT2YoMSksCisgICAgICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkpEQkNfREVGQVVMVCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gKF9wYWNrZXIgPT0gbnVsbCkgPyB2YWwgOiBfcGFja2VyLnBhY2sodmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIHZhbHMgPSBuZXcgT2JqZWN0W19jb2xzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdmFsc1tpXSA9IF9yZXMuZ2V0T2JqZWN0KE51bWJlcnMudmFsdWVPZihpICsgMSksCisgICAgICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkpEQkNfREVGQVVMVCwgbnVsbCk7CisgICAgICAgIHJldHVybiAoX3BhY2tlciA9PSBudWxsKSA/IHZhbHMgOiBfcGFja2VyLnBhY2sodmFscyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbmV4dCgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlcy5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzLmFic29sdXRlKHBvcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZmV0Y2guZ2V0TFJTU2l6ZSgpID09IExSU1NpemVzLlNJWkVfVU5LTk9XTgorICAgICAgICAgICAgfHwgIXN1cHBvcnRzUmFuZG9tQWNjZXNzKCkpCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIHJldHVybiBfcmVzLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIF9yZXMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVDaGVja2VkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU1FMRXhjZXB0aW9uKQorICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZSgoU1FMRXhjZXB0aW9uKSBlLAorICAgICAgICAgICAgICAgIF9zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9TUUxTdG9yZVF1ZXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9TUUxTdG9yZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNTgwNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1NRTFN0b3JlUXVlcnkuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyZWFtVG9rZW5pemVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlF1ZXJ5UmVzdWx0TWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHRTZXRSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkFic3RyYWN0U3RvcmVRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5Q29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBBIFNRTCBxdWVyeS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU1FMU3RvcmVRdWVyeQorICAgIGV4dGVuZHMgQWJzdHJhY3RTdG9yZVF1ZXJ5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFNRTFN0b3JlUXVlcnkuY2xhc3MpOworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgZmluYWwgSkRCQ1N0b3JlIF9zdG9yZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHF1ZXJ5IG1hbmFnZWQgYnkgdGhlIGdpdmVuIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFNRTFN0b3JlUXVlcnkoSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIF9zdG9yZSA9IHN0b3JlOworICAgIH0KKworICAgIHB1YmxpYyBKREJDU3RvcmUgZ2V0U3RvcmUoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gc3Vic3RpdHV0ZSAnP251bScgZm9yIHBhcmFtZXRlcnMgaW4gdGhlIGdpdmVuIFNRTAorICAgICAqIHN0YXRlbWVudCwgYW5kIHJlLW9yZGVyIHRoZSA8Y29kZT5wYXJhbXM8L2NvZGU+IGFycmF5IHRvIG1hdGNoCisgICAgICogdGhlIG9yZGVyIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3Vic3RpdHV0ZVBhcmFtcyhTdHJpbmcgc3FsLCBMaXN0IHBhcmFtcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaWYgdGhlcmUncyBubyAiPzEiIHBvc2l0aW9uYWwgcGFyYW1ldGVyLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8gcGVyZm9ybSB0aGUgcGFyc2luZyBwcm9jZXNzCisgICAgICAgIGlmIChzcWwuaW5kZXhPZigiPzEiKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzcWw7CisKKyAgICAgICAgTGlzdCBwYXJhbU9yZGVyID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBTdHJlYW1Ub2tlbml6ZXIgdG9rID0gbmV3IFN0cmVhbVRva2VuaXplcihuZXcgU3RyaW5nUmVhZGVyKHNxbCkpOworICAgICAgICB0b2sucmVzZXRTeW50YXgoKTsKKyAgICAgICAgdG9rLnF1b3RlQ2hhcignXCcnKTsKKyAgICAgICAgdG9rLndvcmRDaGFycygnMCcsICc5Jyk7CisgICAgICAgIHRvay53b3JkQ2hhcnMoJz8nLCAnPycpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHNxbC5sZW5ndGgoKSk7CisgICAgICAgIGZvciAoaW50IHR0eXBlOyAodHR5cGUgPSB0b2submV4dFRva2VuKCkpICE9IFN0cmVhbVRva2VuaXplci5UVF9FT0Y7KSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gYSB0b2tlbiBpcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyIGlmIGl0IHN0YXJ0cyB3aXRoCisgICAgICAgICAgICAgICAgICAgIC8vIGEgIj8iIGFuZCB0aGUgcmVzdCBvZiB0aGUgdG9rZW4gYXJlIGFsbCBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgIGlmICh0b2suc3ZhbC5zdGFydHNXaXRoKCI/IikgJiYgdG9rLnN2YWwubGVuZ3RoKCkgPiAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICB0b2suc3ZhbC5zdWJzdHJpbmcoMSkuaW5kZXhPZigiPyIpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCI/Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU9yZGVyLmFkZChJbnRlZ2VyLnZhbHVlT2YodG9rLnN2YWwuc3Vic3RyaW5nKDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh0b2suc3ZhbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UnXCcnOgorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdcJycpOworICAgICAgICAgICAgICAgICAgICBpZiAodG9rLnN2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh0b2suc3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdcJycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpIHR0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBnbyB0aHJvdWdoIHRoZSBwYXJhbU9yZGVyIGxpc3QgYW5kIHJlLW9yZGVyIHRoZSBwYXJhbXMgYXJyYXkKKyAgICAgICAgTGlzdCB0cmFuc2xhdGVkID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJhbU9yZGVyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gKChOdW1iZXIpIGkubmV4dCgpKS5pbnRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSBwYXJhbXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJzcWxxdWVyeS1taXNzaW5nLXBhcmFtcyIsCisgICAgICAgICAgICAgICAgICAgIHNxbCwgU3RyaW5nLnZhbHVlT2YoaW5kZXgpLCBwYXJhbXMpKTsKKyAgICAgICAgICAgIHRyYW5zbGF0ZWQuYWRkKHBhcmFtcy5nZXQoaW5kZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyYW5zZmVyIHRoZSB0cmFuc2xhdGVkIGxpc3QgaW50byB0aGUgb3JpZ2luYWwgcGFyYW1zIGxpc3QKKyAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgIHBhcmFtcy5hZGRBbGwodHJhbnNsYXRlZCk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1BhcmFtZXRlckRlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGF0YVN0b3JlRXhlY3V0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhlY3V0b3IgbmV3RGF0YVN0b3JlRXhlY3V0b3IoQ2xhc3NNZXRhRGF0YSBtZXRhLAorICAgICAgICBib29sZWFuIHN1YmNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTUUxFeGVjdXRvcih0aGlzLCBtZXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0NhbmRpZGF0ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1BhcmFtZXRlckRlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBmaWx0ZXIgYXMgYSBTUUwgcXVlcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU1FMRXhlY3V0b3IKKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEV4ZWN1dG9yIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzTWV0YURhdGEgX21ldGE7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfc2VsZWN0OworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2NhbGw7ICAgLy8gbmF0aXZlIGNhbGwgc3RvcmVkIHByb2NlZHVyZQorICAgICAgICBwcml2YXRlIGZpbmFsIFF1ZXJ5UmVzdWx0TWFwcGluZyBfcmVzdWx0TWFwcGluZzsKKworICAgICAgICBwdWJsaWMgU1FMRXhlY3V0b3IoU1FMU3RvcmVRdWVyeSBxLCBDbGFzc01ldGFEYXRhIGNhbmRpZGF0ZSkgeworICAgICAgICAgICAgUXVlcnlDb250ZXh0IGN0eCA9IHEuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdE1hcHBpbmcgPSBjdHguZ2V0UmVzdWx0TWFwcGluZ05hbWUoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRNYXBwaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgX3Jlc3VsdE1hcHBpbmcgPSBudWxsOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyID0gY3R4LmdldFN0b3JlQ29udGV4dCgpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSBxLmdldFN0b3JlKCkuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgICAgICAgICBnZXRNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgX3Jlc3VsdE1hcHBpbmcgPSByZXBvcy5nZXRRdWVyeVJlc3VsdE1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgKGN0eC5nZXRSZXN1bHRNYXBwaW5nU2NvcGUoKSwgcmVzdWx0TWFwcGluZywgZW52TG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbWV0YSA9IGNhbmRpZGF0ZTsKKworICAgICAgICAgICAgU3RyaW5nIHNxbCA9IFN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY3R4LmdldFF1ZXJ5U3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKHNxbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1zcWwiKSk7CisgICAgICAgICAgICBfc2VsZWN0ID0gc3FsLmxlbmd0aCgpID4gNgorICAgICAgICAgICAgICAgICYmIHNxbC5zdWJzdHJpbmcoMCwgNikuZXF1YWxzSWdub3JlQ2FzZSgic2VsZWN0Iik7CisgICAgICAgICAgICBfY2FsbCA9IHNxbC5sZW5ndGgoKSA+IDQKKyAgICAgICAgICAgICAgICAmJiBzcWwuc3Vic3RyaW5nKDAsIDQpLmVxdWFsc0lnbm9yZUNhc2UoImNhbGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICByZXR1cm4gX3NlbGVjdCA/IE9QX1NFTEVDVCA6IAorICAgICAgICAgICAgICAgIChxLmdldENvbnRleHQoKS5nZXRDYW5kaWRhdGVUeXBlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcS5nZXRDb250ZXh0KCkuZ2V0UmVzdWx0VHlwZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHEuZ2V0Q29udGV4dCgpLmdldFJlc3VsdE1hcHBpbmdOYW1lKCkgIT0gbnVsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHEuZ2V0Q29udGV4dCgpLmdldFJlc3VsdE1hcHBpbmdTY29wZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICA/IE9QX1NFTEVDVCA6IE9QX1VQREFURTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOdW1iZXIgZXhlY3V0ZVVwZGF0ZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAgICAgSkRCQ1N0b3JlIHN0b3JlID0gKChTUUxTdG9yZVF1ZXJ5KSBxKS5nZXRTdG9yZSgpOworICAgICAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgICAgIFN0cmluZyBzcWwgPSBxLmdldENvbnRleHQoKS5nZXRRdWVyeVN0cmluZygpOworCisgICAgICAgICAgICBMaXN0IHBhcmFtTGlzdDsKKyAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtTGlzdCA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzcWwgPSBzdWJzdGl0dXRlUGFyYW1zKHNxbCwgcGFyYW1MaXN0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwYXJhbUxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCisgICAgICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihkaWN0KS5hcHBlbmQoc3FsKTsKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IHN0b3JlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSAoSkRCQ0ZldGNoQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICBxLmdldENvbnRleHQoKS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG1udCA9IGJ1Zi5wcmVwYXJlQ2FsbChjb25uKTsKKworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyYW1MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAgICAgZGljdC5zZXRVbmtub3duKHN0bW50LCArK2luZGV4LCBpLm5leHQoKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoX2NhbGwgJiYgc3RtbnQuZXhlY3V0ZSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gc3RtbnQuZ2V0VXBkYXRlQ291bnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBpbnNlcnQsIHVwZGF0ZSwgZGVsZXRlCisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gc3RtbnQuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGNvdW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0cnkgeyBzdG1udC5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UyKSB7fQorICAgICAgICAgICAgICAgIHRyeSB7IGNvbm4uY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlMikge30KKyAgICAgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBkaWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXN1bHRPYmplY3RQcm92aWRlciBleGVjdXRlUXVlcnkoU3RvcmVRdWVyeSBxLAorICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1zLCBSYW5nZSByYW5nZSkgeworICAgICAgICAgICAgSkRCQ1N0b3JlIHN0b3JlID0gKChTUUxTdG9yZVF1ZXJ5KSBxKS5nZXRTdG9yZSgpOworICAgICAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgICAgIFN0cmluZyBzcWwgPSBxLmdldENvbnRleHQoKS5nZXRRdWVyeVN0cmluZygpOworCisgICAgICAgICAgICBMaXN0IHBhcmFtTGlzdDsKKyAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtTGlzdCA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzcWwgPSBzdWJzdGl0dXRlUGFyYW1zKHNxbCwgcGFyYW1MaXN0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwYXJhbUxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCisgICAgICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihkaWN0KS5hcHBlbmQoc3FsKTsKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IHN0b3JlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSAoSkRCQ0ZldGNoQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICBxLmdldENvbnRleHQoKS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICAgICAgUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wOworICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHJpZ2h0IG1ldGhvZCBkZXBlbmRpbmcgb24gc2VsIHZzLiBwcm9jLCBscnMgc2V0dGluZworICAgICAgICAgICAgICAgIGlmIChfc2VsZWN0ICYmICFyYW5nZS5scnMpCisgICAgICAgICAgICAgICAgICAgIHN0bW50ID0gYnVmLnByZXBhcmVTdGF0ZW1lbnQoY29ubik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3NlbGVjdCkKKyAgICAgICAgICAgICAgICAgICAgc3RtbnQgPSBidWYucHJlcGFyZVN0YXRlbWVudChjb25uLCBmZXRjaCwgLTEsIC0xKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghcmFuZ2UubHJzKQorICAgICAgICAgICAgICAgICAgICBzdG1udCA9IGJ1Zi5wcmVwYXJlQ2FsbChjb25uKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0bW50ID0gYnVmLnByZXBhcmVDYWxsKGNvbm4sIGZldGNoLCAtMSwgLTEpOworCisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJhbUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICAgICBkaWN0LnNldFVua25vd24oc3RtbnQsICsraW5kZXgsIGkubmV4dCgpLCBudWxsKTsKKworICAgICAgICAgICAgICAgIFJlc3VsdFNldFJlc3VsdCByZXMgPSBuZXcgUmVzdWx0U2V0UmVzdWx0KGNvbm4sIHN0bW50LAorICAgICAgICAgICAgICAgICAgICBzdG1udC5leGVjdXRlUXVlcnkoKSwgc3RvcmUpOworICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0TWFwcGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByb3AgPSBuZXcgTWFwcGVkUXVlcnlSZXN1bHRPYmplY3RQcm92aWRlcihfcmVzdWx0TWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLCBmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChxLmdldENvbnRleHQoKS5nZXRDYW5kaWRhdGVUeXBlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcm9wID0gbmV3IEdlbmVyaWNSZXN1bHRPYmplY3RQcm92aWRlcigoQ2xhc3NNYXBwaW5nKSBfbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLCBmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJvcCA9IG5ldyBTUUxQcm9qZWN0aW9uUmVzdWx0T2JqZWN0UHJvdmlkZXIoc3RvcmUsIGZldGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBxLmdldENvbnRleHQoKS5nZXRSZXN1bHRUeXBlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0bW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZTIpIHt9CisgICAgICAgICAgICAgICAgdHJ5IHsgY29ubi5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UyKSB7fQorICAgICAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIGRpY3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgIT0gMCB8fCByYW5nZS5lbmQgIT0gTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgcm9wID0gbmV3IFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIocm9wLCByYW5nZS5zdGFydCxyYW5nZS5lbmQpOworICAgICAgICAgICAgcmV0dXJuIHJvcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117IHEuZ2V0Q29udGV4dCgpLmdldFF1ZXJ5U3RyaW5nKCkgfTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2luZyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBxLmdldENvbnRleHQoKS5nZXRDYW5kaWRhdGVUeXBlKCkgPT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1NlbGVjdFJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9TZWxlY3RSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTk0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9TZWxlY3RSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0RXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CisKKy8qKgorICogQWJzdHJhY3QgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gd3JhcHBlZCBhcm91bmQgYSB7QGxpbmsgU2VsZWN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0UmVzdWx0T2JqZWN0UHJvdmlkZXIKKyAgICBpbXBsZW1lbnRzIFJlc3VsdE9iamVjdFByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0RXhlY3V0b3IgX3NlbDsKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNTdG9yZSBfc3RvcmU7CisgICAgcHJpdmF0ZSBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIF9mZXRjaDsKKyAgICBwcml2YXRlIFJlc3VsdCBfcmVzID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc2l6ZSA9IC0xOworICAgIHByaXZhdGUgQm9vbGVhbiBfcmEgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsIHRoZSBzZWxlY3QgdG8gZXhlY3V0ZQorICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgc3RvcmUgdG8gZGVsZWdhdGUgbG9hZGluZyB0bworICAgICAqIEBwYXJhbSBmZXRjaCB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbiwgb3IgbnVsbCBmb3IgdGhlIGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0UmVzdWx0T2JqZWN0UHJvdmlkZXIoU2VsZWN0RXhlY3V0b3Igc2VsLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgX3NlbCA9IHNlbDsKKyAgICAgICAgX3N0b3JlID0gc3RvcmU7CisgICAgICAgIF9mZXRjaCA9IGZldGNoOworICAgIH0KKworICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciBnZXRTZWxlY3QoKSB7CisgICAgICAgIHJldHVybiBfc2VsOworICAgIH0KKworICAgIHB1YmxpYyBKREJDU3RvcmUgZ2V0U3RvcmUoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmU7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2ZldGNoOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHQgZ2V0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gX3JlczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2VzcygpIHsKKyAgICAgICAgaWYgKF9yYSA9PSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIHJhOworICAgICAgICAgICAgaWYgKF9yZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJhID0gX3Jlcy5zdXBwb3J0c1JhbmRvbUFjY2VzcygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBfc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJhID0gX3NlbC5zdXBwb3J0c1JhbmRvbUFjY2VzcyhfZmV0Y2guZ2V0UmVhZExvY2tMZXZlbCgpID4gMCk7CisgICAgICAgICAgICBfcmEgPSAocmEpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3JhLmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9wZW4oKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JlcyA9IF9zZWwuZXhlY3V0ZShfc3RvcmUsIF9mZXRjaCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbmV4dCgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlcy5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzLmFic29sdXRlKHBvcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgLy8gaWYgcmVzIGlzIG51bGwsIGRvbid0IGNhY2hlIHNpemUKKyAgICAgICAgICAgIGlmIChfcmVzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworCisgICAgICAgICAgICBzd2l0Y2ggKF9mZXRjaC5nZXRMUlNTaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIExSU1NpemVzLlNJWkVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgX3NpemUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMUlNTaXplcy5TSVpFX0xBU1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c1JhbmRvbUFjY2VzcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgX3NpemUgPSBfcmVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX3NpemUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gcXVlcnkKKyAgICAgICAgICAgICAgICAgICAgX3NpemUgPSBfc2VsLmdldENvdW50KF9zdG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHN1YmNsYXNzZXMgdGhhdCBrbm93IHRoZSBzaXplIHRvIHNldCBpdDsgb3RoZXJ3aXNlIHdlIGNhbGN1bGF0ZQorICAgICAqIGl0IGludGVybmFsbHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpZiAoX3NpemUgPT0gLTEpCisgICAgICAgICAgICBfc2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgb3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoX3JlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBfcmVzLmNsb3NlKCk7CisgICAgICAgICAgICBfcmVzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNoZWNrZWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTUUxFeGNlcHRpb24pCisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKChTUUxFeGNlcHRpb24pIGUsCisgICAgICAgICAgICAgICAgX3N0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1RhYmxlSkRCQ1NlcS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvVGFibGVKREJDU2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3MzVhZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1RhYmxlSkRCQ1NlcS5qYXZhCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuUHJpbWFyeUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxFeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnZhbGlkU3RhdGVFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogRG8gbm90IGNoYW5nZSBwcm9wZXJ0eSBuYW1lczsgc2VlIFNlcXVlbmNlTWV0YURhdGEKKy8vIGFuZCBTZXF1ZW5jZU1hcHBpbmcgZm9yIHN0YW5kYXJkIHByb3BlcnR5IG5hbWVzLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICoge0BsaW5rIEpEQkNTZXF9IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBhIGRhdGFiYXNlIHRhYmxlCisgKiBmb3Igc2VxdWVuY2UgbnVtYmVyIGdlbmVyYXRpb24uIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgc2luZ2xlCisgKiByb3cgZm9yIGEgZ2xvYmFsIHNlcXVlbmNlIG51bWJlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGFibGVKREJDU2VxCisgICAgZXh0ZW5kcyBBYnN0cmFjdEpEQkNTZXEKKyAgICBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRFJPUCA9ICJkcm9wIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQUREID0gImFkZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVCA9ICJnZXQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVQgPSAic2V0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFRhYmxlSkRCQ1NlcS5jbGFzcyk7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBKREJDQ29uZmlndXJhdGlvbiBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTG9nIF9sb2cgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9hbGxvYyA9IDUwOworICAgIHByaXZhdGUgZmluYWwgU3RhdHVzIF9zdGF0ID0gbmV3IFN0YXR1cygpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhYmxlID0gIk9QRU5KUEFfU0VRVUVOQ0VfVEFCTEUiOworICAgIHByaXZhdGUgU3RyaW5nIF9zZXFDb2x1bW5OYW1lID0gIlNFUVVFTkNFX1ZBTFVFIjsKKyAgICBwcml2YXRlIFN0cmluZyBfcGtDb2x1bW5OYW1lID0gIklEIjsKKworICAgIHByaXZhdGUgQ29sdW1uIF9zZXFDb2x1bW4gPSBudWxsOworICAgIHByaXZhdGUgQ29sdW1uIF9wa0NvbHVtbiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VxdWVuY2UgdGFibGUgbmFtZS4gRGVmYXVsdHMgdG8gPGNvZGU+T1BFTkpQQV9TRVFVRU5DRV9UQUJMRTwvY29kZT4uCisgICAgICogQnkgZGVmYXVsdCwgdGhlIHRhYmxlIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBmaXJzdCBzY2hlbWEgbGlzdGVkIGluIHlvdXIKKyAgICAgKiA8Y29kZT5vcGVuanBhLmpkYmMuU2NoZW1hczwvY29kZT4gcHJvcGVydHksIG9yIGluIHRoZSBkZWZhdWx0IHNjaGVtYSBpZgorICAgICAqIHRoZSBwcm9wZXJ0eSBpcyBub3QgZ2l2ZW4uIElmIHlvdSBzcGVjaWZ5IGEgdGFibGUgbmFtZSBpbiB0aGUgZm9ybQorICAgICAqIDxjb2RlPiZsdDtzY2hlbWEmZ3Q7LiZsdDt0YWJsZSZndDs8L2NvZGU+LCB0aGVuIHRoZSBnaXZlbiBzY2hlbWEKKyAgICAgKiB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIF90YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VxdWVuY2UgdGFibGUgbmFtZS4gRGVmYXVsdHMgdG8gPGNvZGU+T1BFTkpQQV9TRVFVRU5DRV9UQUJMRTwvY29kZT4uCisgICAgICogQnkgZGVmYXVsdCwgdGhlIHRhYmxlIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBmaXJzdCBzY2hlbWEgbGlzdGVkIGluIHlvdXIKKyAgICAgKiA8Y29kZT5vcGVuanBhLmpkYmMuU2NoZW1hczwvY29kZT4gcHJvcGVydHksIG9yIGluIHRoZSBkZWZhdWx0IHNjaGVtYSBpZgorICAgICAqIHRoZSBwcm9wZXJ0eSBpcyBub3QgZ2l2ZW4uIElmIHlvdSBzcGVjaWZ5IGEgdGFibGUgbmFtZSBpbiB0aGUgZm9ybQorICAgICAqIDxjb2RlPiZsdDtzY2hlbWEmZ3Q7LiZsdDt0YWJsZSZndDs8L2NvZGU+LCB0aGVuIHRoZSBnaXZlbiBzY2hlbWEKKyAgICAgKiB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX3RhYmxlID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUYWJsZX0uIFJldGFpbmVkIGZvcgorICAgICAqIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5CXdpdGggYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRUYWJsZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIHNlcXVlbmNlIHZhbHVlLiBEZWZhdWx0cworICAgICAqIHRvIDxjb2RlPlNFUVVFTkNFX1ZBTFVFPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlQ29sdW1uKCkgeworICAgICAgICByZXR1cm4gX3NlcUNvbHVtbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBzZXF1ZW5jZSB2YWx1ZS4gRGVmYXVsdHMKKyAgICAgKiB0byA8Y29kZT5TRVFVRU5DRV9WQUxVRTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VxdWVuY2VDb2x1bW4oU3RyaW5nIHNlcXVlbmNlQ29sdW1uKSB7CisgICAgICAgIF9zZXFDb2x1bW5OYW1lID0gc2VxdWVuY2VDb2x1bW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHRhYmxlJ3MgcHJpbWFyeSBrZXkgY29sdW1uLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPklEPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7CisgICAgICAgIHJldHVybiBfcGtDb2x1bW5OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5IGNvbHVtbi4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5JRDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleUNvbHVtbihTdHJpbmcgcHJpbWFyeUtleUNvbHVtbikgeworICAgICAgICBfcGtDb2x1bW5OYW1lID0gcHJpbWFyeUtleUNvbHVtbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgdG8gYWxsb2NhdGUgZm9yIGVhY2ggdXBkYXRlIG9mIHRoZQorICAgICAqIHNlcXVlbmNlIHRhYmxlLiBTZXF1ZW5jZSBudW1iZXJzIHdpbGwgYmUgZ3JhYmJlZCBpbiBibG9ja3Mgb2YgdGhpcworICAgICAqIHZhbHVlIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0aGF0IG11c3QgYmUgcGVyZm9ybWVkIG9uCisgICAgICogdGhlIHNlcXVlbmNlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWxsb2NhdGUoKSB7CisgICAgICAgIHJldHVybiBfYWxsb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIHRvIGFsbG9jYXRlIGZvciBlYWNoIHVwZGF0ZSBvZiB0aGUKKyAgICAgKiBzZXF1ZW5jZSB0YWJsZS4gU2VxdWVuY2UgbnVtYmVycyB3aWxsIGJlIGdyYWJiZWQgaW4gYmxvY2tzIG9mIHRoaXMKKyAgICAgKiB2YWx1ZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCBtdXN0IGJlIHBlcmZvcm1lZCBvbgorICAgICAqIHRoZSBzZXF1ZW5jZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvY2F0ZShpbnQgYWxsb2MpIHsKKyAgICAgICAgX2FsbG9jID0gYWxsb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0QWxsb2NhdGV9LiBSZXRhaW5lZCBmb3IgYmFja3dhcmRzCisgICAgICogY29tcGF0aWJpbGl0eSBvZiBhdXRvLWNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jcmVtZW50KGludCBpbmMpIHsKKyAgICAgICAgc2V0QWxsb2NhdGUoaW5jKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9jb25mOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gKEpEQkNDb25maWd1cmF0aW9uKSBjb25mOworICAgICAgICBfbG9nID0gX2NvbmYuZ2V0TG9nKEpEQkNDb25maWd1cmF0aW9uLkxPR19SVU5USU1FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgYnVpbGRUYWJsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIFNjaGVtYUdyb3VwIGdyb3VwKSB7CisgICAgICAgIC8vIHRhYmxlIGFscmVhZHkgZXhpc3RzPworICAgICAgICBpZiAoZ3JvdXAuaXNLbm93blRhYmxlKF90YWJsZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUgPSBTdHJpbmdzLmdldFBhY2thZ2VOYW1lKF90YWJsZSk7CisgICAgICAgIGlmIChzY2hlbWFOYW1lLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICBzY2hlbWFOYW1lID0gU2NoZW1hcy5nZXROZXdUYWJsZVNjaGVtYShfY29uZik7CisKKyAgICAgICAgLy8gY3JlYXRlIHRhYmxlIGluIHRoaXMgZ3JvdXAKKyAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGdyb3VwLmdldFNjaGVtYShzY2hlbWFOYW1lKTsKKyAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQorICAgICAgICAgICAgc2NoZW1hID0gZ3JvdXAuYWRkU2NoZW1hKHNjaGVtYU5hbWUpOworICAgICAgICBzY2hlbWEuaW1wb3J0VGFibGUoX3BrQ29sdW1uLmdldFRhYmxlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgbmV4dEludGVybmFsKEpEQkNTdG9yZSBzdG9yZSwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBpZiBuZWVkZWQsIGdyYWIgdGhlIG5leHQgaGFuZGZ1bCBvZiBpZHMKKyAgICAgICAgU3RhdHVzIHN0YXQgPSBnZXRTdGF0dXMobWFwcGluZyk7CisgICAgICAgIGlmIChzdGF0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtc2VxLXR5cGUiLAorICAgICAgICAgICAgICAgIGdldENsYXNzKCksIG1hcHBpbmcpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0KSB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHNlcSBpcyBhdCBsZWFzdCAxLCBzaW5jZSBhdXRvYXNzaWduZWQgaWRzIG9mIDAgY2FuCisgICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgd2l0aCB1bmluaXRpYWxpemVkIHZhbHVlcworICAgICAgICAgICAgICAgIHN0YXQuc2VxID0gTWF0aC5tYXgoc3RhdC5zZXEsIDEpOworICAgICAgICAgICAgICAgIGlmIChzdGF0LnNlcSA8IHN0YXQubWF4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKHN0YXQuc2VxKyspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxsb2NhdGVTZXF1ZW5jZShzdG9yZSwgbWFwcGluZywgc3RhdCwgX2FsbG9jLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3VycmVudEludGVybmFsKEpEQkNTdG9yZSBzdG9yZSwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBnZXRDb25uZWN0aW9uKHN0b3JlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBjdXIgPSBnZXRTZXF1ZW5jZShtYXBwaW5nLCBjb25uKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyICE9IC0xKQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gTnVtYmVycy52YWx1ZU9mKGN1cik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlQ29ubmVjdGlvbihjb25uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuY3VycmVudEludGVybmFsKHN0b3JlLCBtYXBwaW5nKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhbGxvY2F0ZUludGVybmFsKGludCBjb3VudCwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXR1cyBzdGF0ID0gZ2V0U3RhdHVzKG1hcHBpbmcpOworICAgICAgICBpZiAoc3RhdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgYXZhaWxhYmxlOworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0KSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gKGludCkgKHN0YXQubWF4IC0gc3RhdC5zZXEpOworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPj0gY291bnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsbG9jYXRlU2VxdWVuY2Uoc3RvcmUsIG1hcHBpbmcsIHN0YXQsIGNvdW50IC0gYXZhaWxhYmxlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyBvYmplY3QgZm9yIHRoZSBnaXZlbiBjbGFzcywgb3IgbnVsbAorICAgICAqIGlmIGNhbm5vdCBoYW5kbGUgdGhlIGdpdmVuIGNsYXNzLiBUaGUgbWFwcGluZyBtYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RhdHVzIGdldFN0YXR1cyhDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICByZXR1cm4gX3N0YXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gdG8gdGhlIGdpdmVuIHRhYmxlIGFuZCByZXR1cm4gaXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbHVtbiBhZGRQcmltYXJ5S2V5Q29sdW1uKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICAgICAgQ29sdW1uIHBrQ29sdW1uID0gdGFibGUuYWRkQ29sdW1uKGRpY3QuZ2V0VmFsaWRDb2x1bW5OYW1lCisgICAgICAgICAgICAoZ2V0UHJpbWFyeUtleUNvbHVtbigpLCB0YWJsZSkpOworICAgICAgICBwa0NvbHVtbi5zZXRUeXBlKGRpY3QuZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5USU5ZSU5UKSk7CisgICAgICAgIHBrQ29sdW1uLnNldEphdmFUeXBlKEphdmFUeXBlcy5JTlQpOworICAgICAgICByZXR1cm4gcGtDb2x1bW47CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmltYXJ5IGtleSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UHJpbWFyeUtleShDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIG9iamVjdC1sZXZlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkVGFibGUoKSB7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShfdGFibGUpOworICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSA9IFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoX3RhYmxlKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHNjaGVtYU5hbWUgPSBTY2hlbWFzLmdldE5ld1RhYmxlU2NoZW1hKF9jb25mKTsKKworICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IG5ldyBTY2hlbWFHcm91cCgpOworICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ3JvdXAuYWRkU2NoZW1hKHNjaGVtYU5hbWUpOworCisgICAgICAgIFRhYmxlIHRhYmxlID0gc2NoZW1hLmFkZFRhYmxlKHRhYmxlTmFtZSk7CisgICAgICAgIF9wa0NvbHVtbiA9IGFkZFByaW1hcnlLZXlDb2x1bW4odGFibGUpOworICAgICAgICBQcmltYXJ5S2V5IHBrID0gdGFibGUuYWRkUHJpbWFyeUtleSgpOworICAgICAgICBway5hZGRDb2x1bW4oX3BrQ29sdW1uKTsKKworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIF9zZXFDb2x1bW4gPSB0YWJsZS5hZGRDb2x1bW4oZGljdC5nZXRWYWxpZENvbHVtbk5hbWUKKyAgICAgICAgICAgIChfc2VxQ29sdW1uTmFtZSwgdGFibGUpKTsKKyAgICAgICAgX3NlcUNvbHVtbi5zZXRUeXBlKGRpY3QuZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5CSUdJTlQpKTsKKyAgICAgICAgX3NlcUNvbHVtbi5zZXRKYXZhVHlwZShKYXZhVHlwZXMuTE9ORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgbWF4IGF2YWlsYWJsZSBzZXF1ZW5jZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWxsb2NhdGVTZXF1ZW5jZShKREJDU3RvcmUgc3RvcmUsIENsYXNzTWFwcGluZyBtYXBwaW5nLAorICAgICAgICBTdGF0dXMgc3RhdCwgaW50IGFsbG9jLCBib29sZWFuIHVwZGF0ZVN0YXRTZXEpIAorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gZ2V0Q29ubmVjdGlvbihzdG9yZSk7CisgICAgICAgIHRyeSB7IAorICAgICAgICAgICAgaWYgKHNldFNlcXVlbmNlKG1hcHBpbmcsIHN0YXQsIGFsbG9jLCB1cGRhdGVTdGF0U2VxLCBjb25uKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShfbG9jLmdldCgiYmFkLXNlcS11cCIsIF90YWJsZSksCisgICAgICAgICAgICAgICAgc2UsIF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VDb25uZWN0aW9uKGNvbm4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCB3ZSBtaWdodCBnZXQgZXJyb3JzIHdoZW4gaW5zZXJ0aW5nIGlmCisgICAgICAgICAgICAvLyBhbm90aGVyIHRocmVhZC9wcm9jZXNzIGlzIGluc2VydGluZyBzYW1lIHBrIGF0IHNhbWUgdGltZQorICAgICAgICAgICAgU1FMRXhjZXB0aW9uIGVyciA9IG51bGw7IAorICAgICAgICAgICAgLy8gIyMjIHdoeSBkb2VzIHRoaXMgbm90IGNhbGwgZ2V0Q29ubmVjdGlvbigpIC8gY2xvc2VDb25uZWN0aW9uKCk/CisgICAgICAgICAgICBjb25uID0gX2NvbmYuZ2V0RGF0YVNvdXJjZTIoc3RvcmUuZ2V0Q29udGV4dCgpKS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluc2VydFNlcXVlbmNlKG1hcHBpbmcsIGNvbm4pOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgZXJyID0gc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7IGNvbm4uY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3cgd2Ugc2hvdWxkIGJlIGFibGUgdG8gdXBkYXRlLi4uCisgICAgICAgICAgICBjb25uID0gZ2V0Q29ubmVjdGlvbihzdG9yZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghc2V0U2VxdWVuY2UobWFwcGluZywgc3RhdCwgYWxsb2MsIHVwZGF0ZVN0YXRTZXEsIGNvbm4pKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAoZXJyICE9IG51bGwpID8gZXJyIDogbmV3IFNRTEV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAgICAgKCJuby1zZXEtcm93IiwgbWFwcGluZywgX3RhYmxlKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZUNvbm5lY3Rpb24oY29ubik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZTIpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoX2xvYy5nZXQoImJhZC1zZXEtdXAiLCBfdGFibGUpLAorICAgICAgICAgICAgICAgIHNlMiwgX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKSk7CisgICAgICAgIH0gCisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyB0aGUgaW5pdGlhbCBzZXF1ZW5jZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBkYXRhYmFzZSwgaWYgYW55LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnNlcnRTZXF1ZW5jZShDbGFzc01hcHBpbmcgbWFwcGluZywgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImluc2VydC1zZXEiKSk7CisKKyAgICAgICAgT2JqZWN0IHBrID0gZ2V0UHJpbWFyeUtleShtYXBwaW5nKTsKKyAgICAgICAgaWYgKHBrID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtc2VxLXR5cGUiLAorICAgICAgICAgICAgICAgIGdldENsYXNzKCksIG1hcHBpbmcpKTsKKworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIFNRTEJ1ZmZlciBpbnNlcnQgPSBuZXcgU1FMQnVmZmVyKGRpY3QpLmFwcGVuZCgiSU5TRVJUIElOVE8gIikuCisgICAgICAgICAgICBhcHBlbmQoX3BrQ29sdW1uLmdldFRhYmxlKCkpLmFwcGVuZCgiICgiKS4KKyAgICAgICAgICAgIGFwcGVuZChfcGtDb2x1bW4pLmFwcGVuZCgiLCAiKS5hcHBlbmQoX3NlcUNvbHVtbikuCisgICAgICAgICAgICBhcHBlbmQoIikgVkFMVUVTICgiKS4KKyAgICAgICAgICAgIGFwcGVuZFZhbHVlKHBrLCBfcGtDb2x1bW4pLmFwcGVuZCgiLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZFZhbHVlKE51bWJlcnMudmFsdWVPZigxKSwgX3NlcUNvbHVtbikuYXBwZW5kKCIpIik7CisKKyAgICAgICAgYm9vbGVhbiB3YXNBdXRvID0gY29ubi5nZXRBdXRvQ29tbWl0KCk7CisgICAgICAgIGlmICghd2FzQXV0byAmJiAhc3VzcGVuZEluSlRBKCkpCisgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQodHJ1ZSk7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RtbnQgPSBpbnNlcnQucHJlcGFyZVN0YXRlbWVudChjb25uKTsKKyAgICAgICAgICAgIHN0bW50LmV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgIGlmICghd2FzQXV0byAmJiAhc3VzcGVuZEluSlRBKCkpCisgICAgICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzZXF1ZW5jZSB2YWx1ZSwgb3IgLTEgaWYgdW5hdHRhaW5hYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGdldFNlcXVlbmNlKENsYXNzTWFwcGluZyBtYXBwaW5nLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiZ2V0LXNlcSIpKTsKKworICAgICAgICBPYmplY3QgcGsgPSBnZXRQcmltYXJ5S2V5KG1hcHBpbmcpOworICAgICAgICBpZiAocGsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIFNRTEJ1ZmZlciBzZWwgPSBuZXcgU1FMQnVmZmVyKGRpY3QpLmFwcGVuZChfc2VxQ29sdW1uKTsKKyAgICAgICAgU1FMQnVmZmVyIHdoZXJlID0gbmV3IFNRTEJ1ZmZlcihkaWN0KS5hcHBlbmQoX3BrQ29sdW1uKS5hcHBlbmQoIiA9ICIpLgorICAgICAgICAgICAgYXBwZW5kVmFsdWUocGssIF9wa0NvbHVtbik7CisgICAgICAgIFNRTEJ1ZmZlciB0YWJsZXMgPSBuZXcgU1FMQnVmZmVyKGRpY3QpLmFwcGVuZChfc2VxQ29sdW1uLmdldFRhYmxlKCkpOworCisgICAgICAgIFNRTEJ1ZmZlciBzZWxlY3QgPSBkaWN0LnRvU2VsZWN0KHNlbCwgbnVsbCwgdGFibGVzLCB3aGVyZSwgbnVsbCwKKyAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlLCBkaWN0LnN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlLCAwLCBMb25nLk1BWF9WQUxVRSk7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBzZWxlY3QucHJlcGFyZVN0YXRlbWVudChjb25uKTsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJzID0gc3RtbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICBpZiAoIXJzLm5leHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gZGljdC5nZXRMb25nKHJzLCAxKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHJzLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWJzIHRoZSBuZXh0IGhhbmRmdWwgb2Ygc2VxdWVuY2UgbnVtYmVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugd2FzIHVwZGF0ZWQsIGZhbHNlIGlmIG5vIHNlcXVlbmNlCisgICAgICogcm93IGV4aXN0ZWQgZm9yIHRoaXMgbWFwcGluZworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNldFNlcXVlbmNlKENsYXNzTWFwcGluZyBtYXBwaW5nLCBTdGF0dXMgc3RhdCwgaW50IGluYywKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVTdGF0U2VxLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgidXBkYXRlLXNlcSIpKTsKKworICAgICAgICBPYmplY3QgcGsgPSBnZXRQcmltYXJ5S2V5KG1hcHBpbmcpOworICAgICAgICBpZiAocGsgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1zZXEtdHlwZSIsCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwgbWFwcGluZykpOworCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICAgICAgU1FMQnVmZmVyIHdoZXJlID0gbmV3IFNRTEJ1ZmZlcihkaWN0KS5hcHBlbmQoX3BrQ29sdW1uKS5hcHBlbmQoIiA9ICIpLgorICAgICAgICAgICAgYXBwZW5kVmFsdWUocGssIF9wa0NvbHVtbik7CisKKyAgICAgICAgLy8gbG9vcCB1bnRpbCB3ZSBoYXZlIGEgc3VjY2Vzc2Z1bCBhdG9taWMgc2VsZWN0L3VwZGF0ZSBzZXF1ZW5jZQorICAgICAgICBsb25nIGN1ciA9IDA7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50OworICAgICAgICBSZXN1bHRTZXQgcnM7CisgICAgICAgIFNRTEJ1ZmZlciB1cGQ7CisgICAgICAgIGZvciAoaW50IHVwZGF0ZXMgPSAwOyB1cGRhdGVzID09IDA7KSB7CisgICAgICAgICAgICBzdG1udCA9IG51bGw7CisgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN1ciA9IGdldFNlcXVlbmNlKG1hcHBpbmcsIGNvbm4pOworICAgICAgICAgICAgICAgIGlmIChjdXIgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICB1cGQgPSBuZXcgU1FMQnVmZmVyKGRpY3QpOworICAgICAgICAgICAgICAgIHVwZC5hcHBlbmQoIlVQREFURSAiKS5hcHBlbmQoX3NlcUNvbHVtbi5nZXRUYWJsZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIgU0VUICIpLmFwcGVuZChfc2VxQ29sdW1uKS5hcHBlbmQoIiA9ICIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRWYWx1ZShOdW1iZXJzLnZhbHVlT2YoY3VyICsgaW5jKSwgX3NlcUNvbHVtbikuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiIFdIRVJFICIpLmFwcGVuZCh3aGVyZSkuYXBwZW5kKCIgQU5EICIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoX3NlcUNvbHVtbikuYXBwZW5kKCIgPSAiKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kVmFsdWUoTnVtYmVycy52YWx1ZU9mKGN1ciksIF9zZXFDb2x1bW4pOworCisgICAgICAgICAgICAgICAgc3RtbnQgPSB1cGQucHJlcGFyZVN0YXRlbWVudChjb25uKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVzID0gc3RtbnQuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgICAgIHRyeSB7IHJzLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgICAgICBpZiAoc3RtbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsgc3RtbnQuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0dXAgbmV3IHNlcXVlbmNlIHJhbmdlCisgICAgICAgIHN5bmNocm9uaXplZCAoc3RhdCkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRTZXEgJiYgc3RhdC5zZXEgPCBjdXIpCisgICAgICAgICAgICAgICAgc3RhdC5zZXEgPSBjdXI7CisgICAgICAgICAgICBpZiAoc3RhdC5tYXggPCBjdXIgKyBpbmMpCisgICAgICAgICAgICAgICAgc3RhdC5tYXggPSBjdXIgKyBpbmM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgc2VxdWVuY2UgdGFibGUgaW4gdGhlIERCLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hUYWJsZSgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoIm1ha2Utc2VxLXRhYmxlIikpOworCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgdGFibGUKKyAgICAgICAgU2NoZW1hVG9vbCB0b29sID0gbmV3IFNjaGVtYVRvb2woX2NvbmYpOworICAgICAgICB0b29sLnNldElnbm9yZUVycm9ycyh0cnVlKTsKKyAgICAgICAgdG9vbC5jcmVhdGVUYWJsZShfcGtDb2x1bW4uZ2V0VGFibGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJvcHMgdGhlIHNlcXVlbmNlIHRhYmxlIGluIHRoZSBEQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcm9wVGFibGUoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9sb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy5pbmZvKF9sb2MuZ2V0KCJkcm9wLXNlcS10YWJsZSIpKTsKKworICAgICAgICAvLyBkcm9wIHRoZSB0YWJsZQorICAgICAgICBTY2hlbWFUb29sIHRvb2wgPSBuZXcgU2NoZW1hVG9vbChfY29uZik7CisgICAgICAgIHRvb2wuc2V0SWdub3JlRXJyb3JzKHRydWUpOworICAgICAgICB0b29sLmRyb3BUYWJsZShfcGtDb2x1bW4uZ2V0VGFibGUoKSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vCisgICAgLy8gTWFpbgorICAgIC8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlSkRCQ1NlcXVlbmNlIFtvcHRpb25dKgorICAgICAqIC1hY3Rpb24vLWEgJmx0O2FkZCB8IGRyb3AgfCBnZXQgfCBzZXQmZ3Q7IFt2YWx1ZV0KKyAgICAgKiAgV2hlcmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSByZWNvZ25pemVkLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+LXByb3BlcnRpZXMvLXAgJmx0O3Byb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZSZndDs8L2k+OiBUaGUKKyAgICAgKiBwYXRoIG9yIHJlc291cmNlIG5hbWUgb2YgYSBPcGVuSlBBIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nCisgICAgICogaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgbGljZW5zZSBrZXkJYW5kIGNvbm5lY3Rpb24gZGF0YSBhcworICAgICAqIG91dGxpbmVkIGluIHtAbGluayBKREJDQ29uZmlndXJhdGlvbn0uIE9wdGlvbmFsLjwvbGk+CisgICAgICogPGxpPjxpPi0mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvaT46IEFsbCBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgT3BlbkpQQSB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259IGNhbiBiZSBzZXQgYnkKKyAgICAgKiB1c2luZyB0aGVpcgluYW1lcyBhbmQgc3VwcGx5aW5nIGEgdmFsdWUuIEZvciBleGFtcGxlOgorICAgICAqIDxjb2RlPi1saWNlbnNlS2V5IGFkc2xmamE4M3IzbGthZGY8L2NvZGU+PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqICBUaGUgdmFyaW91cyBhY3Rpb25zIGFyZSBhcyBmb2xsb3dzLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+YWRkPC9pPjogQ3JlYXRlIHRoZSBzZXF1ZW5jZSB0YWJsZS48L2xpPgorICAgICAqIDxsaT48aT5kcm9wPC9pPjogRHJvcCB0aGUgc2VxdWVuY2UgdGFibGUuPC9saT4KKyAgICAgKiA8bGk+PGk+Z2V0PC9pPjogUHJpbnQgdGhlIGN1cnJlbnQgc2VxdWVuY2UgdmFsdWUuPC9saT4KKyAgICAgKiA8bGk+PGk+c2V0PC9pPjogU2V0IHRoZSBzZXF1ZW5jZSB2YWx1ZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9wdGlvbnMgb3B0cyA9IG5ldyBPcHRpb25zKCk7CisgICAgICAgIGFyZ3MgPSBvcHRzLnNldEZyb21DbWRMaW5lKGFyZ3MpOworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEpEQkNDb25maWd1cmF0aW9uSW1wbCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFydW4oY29uZiwgYXJncywgb3B0cykpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKF9sb2MuZ2V0KCJzZXEtdXNhZ2UiKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjb25mLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRvb2wuIFJldHVybnMgZmFsc2UgaWYgaW52YWxpZCBvcHRpb25zIHdlcmUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihKREJDQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBPcHRpb25zIG9wdHMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAob3B0cy5jb250YWluc0tleSgiaGVscCIpIHx8IG9wdHMuY29udGFpbnNLZXkoIi1oZWxwIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG9wdHMucmVtb3ZlUHJvcGVydHkoImFjdGlvbiIsICJhIiwgbnVsbCk7CisgICAgICAgIENvbmZpZ3VyYXRpb25zLnBvcHVsYXRlQ29uZmlndXJhdGlvbihjb25mLCBvcHRzKTsKKyAgICAgICAgcmV0dXJuIHJ1bihjb25mLCBhcmdzLCBhY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJuIGZhbHNlIGlmIGFuIGludmFsaWQgb3B0aW9uIHdhcyBnaXZlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIFN0cmluZyBhY3Rpb24pCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxIHx8IChhcmdzLmxlbmd0aCAhPSAwCisgICAgICAgICAgICAmJiAhQUNUSU9OX1NFVC5lcXVhbHMoYWN0aW9uKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgVGFibGVKREJDU2VxIHNlcSA9IG5ldyBUYWJsZUpEQkNTZXEoKTsKKyAgICAgICAgU3RyaW5nIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhjb25mLmdldFNlcXVlbmNlKCkpOworICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShzZXEsIGNvbmYsIHByb3BzKTsKKworICAgICAgICBpZiAoQUNUSU9OX0RST1AuZXF1YWxzKGFjdGlvbikpCisgICAgICAgICAgICBzZXEuZHJvcFRhYmxlKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9BREQuZXF1YWxzKGFjdGlvbikpCisgICAgICAgICAgICBzZXEucmVmcmVzaFRhYmxlKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9HRVQuZXF1YWxzKGFjdGlvbikgfHwgQUNUSU9OX1NFVC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gY29uZi5nZXREYXRhU291cmNlMihudWxsKS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgY3VyID0gc2VxLmdldFNlcXVlbmNlKG51bGwsIGNvbm4pOworICAgICAgICAgICAgICAgIGlmIChBQ1RJT05fR0VULmVxdWFscyhhY3Rpb24pKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3VyKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzZXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSBMb25nLnBhcnNlTG9uZyhhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gY3VyICsgc2VxLmdldEFsbG9jYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXQgPCBjdXIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSBjdXI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHN0YXQgPSBzZXEuZ2V0U3RhdHVzKG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VxLnNldFNlcXVlbmNlKG51bGwsIHN0YXQsIChpbnQpIChzZXQgLSBjdXIpLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4pOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gc3RhdC5zZXE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7IGNvbm4uY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIHN0cnVjdCB0byBob2xkIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFN0YXR1cworICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgcHVibGljIGxvbmcgc2VxID0gMUw7CisgICAgICAgIHB1YmxpYyBsb25nIG1heCA9IDBMOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1VwZGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1VwZGF0ZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM3MjczCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvVXBkYXRlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBjdXN0b21pemUgdGhlIHdheSB0aGF0IHVwZGF0ZXMgYXJlIG1hZGUgdG8KKyAqIGRhdGFiYXNlIHJlY29yZHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBVcGRhdGVNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHN0b3JlIGNvbnRleHQgc2hvdWxkIG1haW50YWluIHRoZSBvcmRlciBpbiB3aGljaCBpbnN0YW5jZXMKKyAgICAgKiBhcmUgZGlydGllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvcmRlckRpcnR5KCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgZ2l2ZW4gaW5zdGFuY2VzIHRvIHRoZSBkYXRhIHN0b3JlLgorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlciNmbHVzaAorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGZsdXNoKENvbGxlY3Rpb24gc3RhdGVzLCBKREJDU3RvcmUgc3RvcmUpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvVmFsdWVUYWJsZUpEQkNTZXEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1ZhbHVlVGFibGVKREJDU2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4NjhjMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1ZhbHVlVGFibGVKREJDU2VxLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogRG8gbm90IGNoYW5nZSBwcm9wZXJ0eSBuYW1lczsgc2VlIFNlcXVlbmNlTWV0YURhdGEKKy8vIGFuZCBTZXF1ZW5jZU1hcHBpbmcgZm9yIHN0YW5kYXJkIHByb3BlcnR5IG5hbWVzLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gb2YgdGhlIHtAbGluayBUYWJsZUpEQkNTZXF9IHRoYXQgbWFpbnRhaW5zIG11bHRpcGxlCisgKiBzZXF1ZW5jZSBjb3VudHMuIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIG9uZSByb3cgd2l0aAorICogYSBrbm93biBzdHJpbmcgcHJpbWFyeSBrZXkgdmFsdWUsIG1vcmUgb3IgbGVzcy4gVGhlIHRhYmxlIG5hbWUgZGVmYXVsdHMKKyAqIHRvIDxjb2RlPk9QRU5KUEFfU0VRVUVOQ0VTX1RBQkxFPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVmFsdWVUYWJsZUpEQkNTZXEKKyAgICBleHRlbmRzIFRhYmxlSkRCQ1NlcSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19WQUxVRSA9ICJQcmltYXJ5S2V5VmFsdWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoVmFsdWVUYWJsZUpEQkNTZXEuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlID0gIkRFRkFVTFQiOworCisgICAgcHVibGljIFZhbHVlVGFibGVKREJDU2VxKCkgeworICAgICAgICBzZXRUYWJsZSgiT1BFTkpQQV9TRVFVRU5DRVNfVEFCTEUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJpbWFyeSBrZXkgdmFsdWUgZm9yIHRoaXMgcm93LiBEZWZhdWx0cyB0byA8Y29kZT5ERUZBVUxUPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJpbWFyeSBrZXkgdmFsdWUgZm9yIHRoaXMgcm93LiBEZWZhdWx0cyB0byA8Y29kZT5ERUZBVUxUPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIF92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2x1bW4gYWRkUHJpbWFyeUtleUNvbHVtbihUYWJsZSB0YWJsZSkgeworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBDb2x1bW4gcGtDb2x1bW4gPSB0YWJsZS5hZGRDb2x1bW4oZGljdC5nZXRWYWxpZENvbHVtbk5hbWUKKyAgICAgICAgICAgIChnZXRQcmltYXJ5S2V5Q29sdW1uKCksIHRhYmxlKSk7CisgICAgICAgIHBrQ29sdW1uLnNldFR5cGUoZGljdC5nZXRQcmVmZXJyZWRUeXBlKFR5cGVzLlZBUkNIQVIpKTsKKyAgICAgICAgcGtDb2x1bW4uc2V0SmF2YVR5cGUoSmF2YVR5cGVzLlNUUklORyk7CisgICAgICAgIHBrQ29sdW1uLnNldFNpemUoZGljdC5jaGFyYWN0ZXJDb2x1bW5TaXplKTsKKyAgICAgICAgcmV0dXJuIHBrQ29sdW1uOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UHJpbWFyeUtleShDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICByZXR1cm4gX3ZhbHVlOworICAgIH0KKworICAgIC8vLy8vLy8vLworICAgIC8vIE1haW4KKyAgICAvLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFVzYWdlOiBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5WYWx1ZVRhYmxlSkRCQ1NlcSBbb3B0aW9uXSoKKyAgICAgKiAtYWN0aW9uLy1hICZsdDthZGQgfCBkcm9wIHwgZ2V0IHwgc2V0Jmd0OyBbcHJpbWFyeSBrZXkgdmFsdWVdIFt2YWx1ZV0KKyAgICAgKiAgV2hlcmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSByZWNvZ25pemVkLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+LXByb3BlcnRpZXMvLXAgJmx0O3Byb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZSZndDs8L2k+OiBUaGUKKyAgICAgKiBwYXRoIG9yIHJlc291cmNlIG5hbWUgb2YgYSBPcGVuSlBBIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nCisgICAgICogaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgbGljZW5zZSBrZXkJYW5kIGNvbm5lY3Rpb24gZGF0YSBhcworICAgICAqIG91dGxpbmVkIGluIHtAbGluayBKREJDQ29uZmlndXJhdGlvbn0uIE9wdGlvbmFsLjwvbGk+CisgICAgICogPGxpPjxpPi0mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvaT46IEFsbCBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgT3BlbkpQQSB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259IGNhbiBiZSBzZXQgYnkKKyAgICAgKiB1c2luZyB0aGVpcgluYW1lcyBhbmQgc3VwcGx5aW5nIGEgdmFsdWUuIEZvciBleGFtcGxlOgorICAgICAqIDxjb2RlPi1saWNlbnNlS2V5IGFkc2xmamE4M3IzbGthZGY8L2NvZGU+PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqICBUaGUgdmFyaW91cyBhY3Rpb25zIGFyZSBhcyBmb2xsb3dzLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGk+YWRkPC9pPjogQ3JlYXRlIHRoZSBzZXF1ZW5jZSB0YWJsZS48L2xpPgorICAgICAqIDxsaT48aT5kcm9wPC9pPjogRHJvcCB0aGUgc2VxdWVuY2UgdGFibGUuPC9saT4KKyAgICAgKiA8bGk+PGk+Z2V0PC9pPjogUHJpbnQgdGhlIGN1cnJlbnQgc2VxdWVuY2UgdmFsdWUgZm9yIHRoZSBnaXZlbgorICAgICAqIHByaW1hcnkga2V5IHZhbHVlLjwvbGk+CisgICAgICogPGxpPjxpPnNldDwvaT46IFNldCB0aGUgc2VxdWVuY2UgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcmltYXJ5IGtleQorICAgICAqIHZhbHVlLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgYXJncyA9IG9wdHMuc2V0RnJvbUNtZExpbmUoYXJncyk7CisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgSkRCQ0NvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXJ1bihjb25mLCBhcmdzLCBvcHRzKSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oX2xvYy5nZXQoImNsc3RhYmxlLXNlcS11c2FnZSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbmYuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJucyBmYWxzZSBpZiBpbnZhbGlkIG9wdGlvbnMgd2VyZSBnaXZlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIE9wdGlvbnMgb3B0cykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcHRzLmNvbnRhaW5zS2V5KCJoZWxwIikgfHwgb3B0cy5jb250YWluc0tleSgiLWhlbHAiKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgiYWN0aW9uIiwgImEiLCBudWxsKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbnMucG9wdWxhdGVDb25maWd1cmF0aW9uKGNvbmYsIG9wdHMpOworICAgICAgICByZXR1cm4gcnVuKGNvbmYsIGFyZ3MsIGFjdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0b29sLiBSZXR1cm4gZmFsc2UgaWYgYW4gaW52YWxpZCBvcHRpb24gd2FzIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgU3RyaW5nIGFjdGlvbiwgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MsIENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZhbHVlVGFibGVKREJDU2VxIHNlcSA9IG5ldyBWYWx1ZVRhYmxlSkRCQ1NlcSgpOworICAgICAgICBTdHJpbmcgcHJvcHMgPSBDb25maWd1cmF0aW9ucy5nZXRQcm9wZXJ0aWVzKGNvbmYuZ2V0U2VxdWVuY2UoKSk7CisgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKHNlcSwgY29uZiwgcHJvcHMpOworCisgICAgICAgIGlmIChBQ1RJT05fRFJPUC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgc2VxLmRyb3BUYWJsZSgpOworICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9BREQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHNlcS5yZWZyZXNoVGFibGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fR0VULmVxdWFscyhhY3Rpb24pIHx8IEFDVElPTl9TRVQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgc2VxLnNldFByaW1hcnlLZXlWYWx1ZShhcmdzWzBdKTsKKworICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gY29uZi5nZXREYXRhU291cmNlMihudWxsKS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgY3VyID0gc2VxLmdldFNlcXVlbmNlKG51bGwsIGNvbm4pOworICAgICAgICAgICAgICAgIGlmIChBQ1RJT05fR0VULmVxdWFscyhhY3Rpb24pKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VxLmdldFByaW1hcnlLZXlWYWx1ZSgpICsgIjogIiArIGN1cik7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgc2V0OworICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gTG9uZy5wYXJzZUxvbmcoYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IGN1ciArIHNlcS5nZXRBbGxvY2F0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2V0IDwgY3VyKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gY3VyOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzdGF0ID0gc2VxLmdldFN0YXR1cyhudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5zZXRTZXF1ZW5jZShudWxsLCBzdGF0LCAoaW50KSAoc2V0IC0gY3VyKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IHN0YXQuc2VxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzZXEuZ2V0UHJpbWFyeUtleVZhbHVlKCkgKyAiOiAiICsgc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQWJzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0Ficy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OGM4NzUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0Ficy5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKKworLyoqCisgKiBBYnNvbHV0ZSB2YWx1ZS4KKyAqLworY2xhc3MgQWJzCisgICAgZXh0ZW5kcyBVbmFyeU9wIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZSB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBBYnMoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgQ2xhc3Mgd3JhcCA9IEZpbHRlcnMud3JhcChjKTsKKyAgICAgICAgaWYgKHdyYXAgPT0gSW50ZWdlci5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBGbG9hdC5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBEb3VibGUuY2xhc3MKKyAgICAgICAgICAgIHx8IHdyYXAgPT0gTG9uZy5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgICAgICB8fCB3cmFwID09IEJpZ0ludGVnZXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gRmlsdGVycy51bndyYXAoYyk7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuICJBQlMiOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BYnN0cmFjdFZhbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BYnN0cmFjdFZhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNmMyMDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0Fic3RyYWN0VmFsLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogQWJzdHJhY3QgdmFsdWUgZm9yIGVhc3kgZXh0ZW5zaW9uLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsCisgICAgaW1wbGVtZW50cyBWYWwgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICIxID0gMSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiMSA8PiAxIjsKKworICAgIHB1YmxpYyBib29sZWFuIGlzVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIHNxbC5hcHBlbmQoRkFMU0UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTm90RW1wdHkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCl7CisgICAgICAgIHNxbC5hcHBlbmQoVFJVRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBzcWwsIDApOworICAgICAgICBzcWwuYXBwZW5kKCIgSVMgIikuYXBwZW5kVmFsdWUobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBzcWwsIDApOworICAgICAgICBzcWwuYXBwZW5kKCIgSVMgTk9UICIpLmFwcGVuZFZhbHVlKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgICAgICBzcWwuYXBwZW5kKCIxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0FnZ3JlZ2F0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BZ2dyZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJhM2VmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BZ2dyZWdhdGUuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBBZ2dyZWdhdGUgbGlzdGVuZXIgdGhhdCBldmFsdWF0ZXMgdG8gYSB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBBZ2dyZWdhdGUKKyAgICBleHRlbmRzIEFic3RyYWN0VmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgSkRCQ0FnZ3JlZ2F0ZUxpc3RlbmVyIF9saXN0ZW5lcjsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfYXJnOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NNYXBwaW5nIF9jYW5kaWRhdGU7CisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIF9tZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzIF9jYXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBBZ2dyZWdhdGUoSkRCQ0FnZ3JlZ2F0ZUxpc3RlbmVyIGxpc3RlbmVyLCBWYWwgYXJnLAorICAgICAgICBDbGFzc01hcHBpbmcgY2FuZGlkYXRlKSB7CisgICAgICAgIF9saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBfYXJnID0gYXJnOworICAgICAgICBfY2FuZGlkYXRlID0gY2FuZGlkYXRlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX21ldGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfY2FzdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9jYXN0OworICAgICAgICByZXR1cm4gX2xpc3RlbmVyLmdldFR5cGUoZ2V0QXJnVHlwZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzc1tdIGdldEFyZ1R5cGVzKCkgeworICAgICAgICBpZiAoX2FyZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChfYXJnIGluc3RhbmNlb2YgQXJncykKKyAgICAgICAgICAgIHJldHVybiAoKEFyZ3MpIF9hcmcpLmdldFR5cGVzKCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXXsgX2FyZy5nZXRUeXBlKCkgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfY2FzdCA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICBpZiAoX2FyZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEV4cFN0YXRlLk5VTEw7CisKKyAgICAgICAgLy8gbm90ZSB0aGF0IHdlIHRlbGwgdGFyZ2V0cyBhbmQgYXJncyB0byBleHRlbnNpb25zIHRoYXQgYXJlIHNxbAorICAgICAgICAvLyBwYXRocyB0byBnbyBhaGVhZCBhbmQgam9pbiB0byB0aGVpciByZWxhdGVkIG9iamVjdCAoaWYgYW55KSwKKyAgICAgICAgLy8gYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCwgdW5saWtlIG1vc3Qgb3BlcmF0aW9ucywgaWYgYSByZWxhdGlvbgorICAgICAgICAvLyBmaWVsZCBsaWtlIGEgMS0xIGlzIGdpdmVuIGFzIHRoZSB0YXJnZXQgb2YgYW4gZXh0ZW5zaW9uLCB0aGVuCisgICAgICAgIC8vIHRoZSBleHRlbnNpb24gcHJvYmFibHkgYWN0cyBvbiBzb21lIGZpZWxkIG9yIGNvbHVtbiBpbiB0aGUKKyAgICAgICAgLy8gcmVsYXRlZCBvYmplY3QsIG5vdCB0aGUgMS0xIGZpZWxkIGl0c2VsZgorICAgICAgICByZXR1cm4gX2FyZy5pbml0aWFsaXplKHNlbCwgY3R4LCBKT0lOX1JFTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgICAgICBzZWwuc2V0QWdncmVnYXRlKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgaWYgKF9hcmcgIT0gbnVsbCkKKyAgICAgICAgICAgIF9hcmcuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgc3RhdGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNlbC5ncm91cEJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlckJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHNlbC5vcmRlckJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpLCBhc2MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNRTEJ1ZmZlciBuZXdTUUxCdWZmZXIoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZpbHRlcnMuY29udmVydChyZXMuZ2V0T2JqZWN0KHRoaXMsIEphdmFTUUxUeXBlcy5KREJDX0RFRkFVTFQsIAorICAgICAgICAgICAgbnVsbCksIGdldFR5cGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIGlmIChfYXJnICE9IG51bGwpCisgICAgICAgICAgICBfYXJnLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBfbGlzdGVuZXIuYXBwZW5kVG8oc3FsLCBnZXRBcmdzKHNlbCwgY3R4LCBzdGF0ZSksIF9jYW5kaWRhdGUsIAorICAgICAgICAgICAgY3R4LnN0b3JlKTsKKyAgICAgICAgc2VsLmFwcGVuZChzcWwsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbHRlclZhbHVlW10gZ2V0QXJncyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgaWYgKF9hcmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoX2FyZyBpbnN0YW5jZW9mIEFyZ3MpCisgICAgICAgICAgICByZXR1cm4gKChBcmdzKSBfYXJnKS5uZXdGaWx0ZXJWYWx1ZXMoc2VsLCBjdHgsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJWYWx1ZVtdeworICAgICAgICAgICAgbmV3IEZpbHRlclZhbHVlSW1wbChzZWwsIGN0eCwgc3RhdGUsIF9hcmcpCisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBpZiAoX2FyZyAhPSBudWxsKQorICAgICAgICAgICAgX2FyZy5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQWxsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0FsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDY1OTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0FsbC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKKy8qKgorICogQWxsLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIEFsbAorICAgIGV4dGVuZHMgVW5hcnlPcCB7CisKKyAgICBwdWJsaWMgQWxsKFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gIkFMTCI7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0FuZEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQW5kRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzEzNDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0FuZEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogQ29tYmluZXMgdHdvIGV4cHJlc3Npb25zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEFuZEV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4cCBfZXhwMTsKKyAgICBwcml2YXRlIGZpbmFsIEV4cCBfZXhwMjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdGhlIGV4cHJlc3Npb25zIHRvIGNvbWJpbmUuCisgICAgICovCisgICAgcHVibGljIEFuZEV4cHJlc3Npb24oRXhwIGV4cDEsIEV4cCBleHAyKSB7CisgICAgICAgIF9leHAxID0gZXhwMTsKKyAgICAgICAgX2V4cDIgPSBleHAyOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgRXhwU3RhdGUgczEgPSBfZXhwMS5pbml0aWFsaXplKHNlbCwgY3R4LCBjb250YWlucyk7CisgICAgICAgIEV4cFN0YXRlIHMyID0gX2V4cDIuaW5pdGlhbGl6ZShzZWwsIGN0eCwgY29udGFpbnMpOworICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wRXhwU3RhdGUoc2VsLmFuZChzMS5qb2lucywgczIuam9pbnMpLCBzMSwgczIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYpIHsKKyAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBic3RhdGUgPSAoQmluYXJ5T3BFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIGJvb2xlYW4gcGFyZW4xID0gX2V4cDEgaW5zdGFuY2VvZiBPckV4cHJlc3Npb247CisgICAgICAgIGJvb2xlYW4gcGFyZW4yID0gX2V4cDIgaW5zdGFuY2VvZiBPckV4cHJlc3Npb247CisgICAgICAgIGlmIChwYXJlbjEpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIoIik7CisgICAgICAgIF9leHAxLmFwcGVuZFRvKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBidWYpOworICAgICAgICBpZiAocGFyZW4xKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICBidWYuYXBwZW5kKCIgQU5EICIpOworICAgICAgICBpZiAocGFyZW4yKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIpOworICAgICAgICBfZXhwMi5hcHBlbmRUbyhzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgYnVmKTsKKyAgICAgICAgaWYgKHBhcmVuMikKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgc2VsLmFwcGVuZChidWYsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfZXhwMS5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBwa3MpOworICAgICAgICBfZXhwMi5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBwa3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX2V4cDEuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF9leHAyLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BbnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQW55LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjMWVmMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQW55LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworLyoqCisgKiBBbnkuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgQW55CisgICAgZXh0ZW5kcyBVbmFyeU9wIHsKKworICAgIHB1YmxpYyBBbnkoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiAiQU5ZIjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQXJncy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BcmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZDlhZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQXJncy5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5Bcmd1bWVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIEEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYSBtdWx0aS1hcmd1bWVudCBmdW5jdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQXJncworICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwKKyAgICBpbXBsZW1lbnRzIEFyZ3VtZW50cyB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbFtdIF9hcmdzOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyBiZWluZyBjb21iaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJncyhWYWwgdmFsMSwgVmFsIHZhbDIpIHsKKyAgICAgICAgaW50IGxlbjEgPSAodmFsMSBpbnN0YW5jZW9mIEFyZ3MpID8gKChBcmdzKSB2YWwxKS5fYXJncy5sZW5ndGggOiAxOworICAgICAgICBpbnQgbGVuMiA9ICh2YWwyIGluc3RhbmNlb2YgQXJncykgPyAoKEFyZ3MpIHZhbDIpLl9hcmdzLmxlbmd0aCA6IDE7CisKKyAgICAgICAgX2FyZ3MgPSBuZXcgVmFsW2xlbjEgKyBsZW4yXTsKKyAgICAgICAgaWYgKHZhbDEgaW5zdGFuY2VvZiBBcmdzKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgoKEFyZ3MpIHZhbDEpLl9hcmdzLCAwLCBfYXJncywgMCwgbGVuMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9hcmdzWzBdID0gdmFsMTsKKyAgICAgICAgaWYgKHZhbDIgaW5zdGFuY2VvZiBBcmdzKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgoKEFyZ3MpIHZhbDIpLl9hcmdzLCAwLCBfYXJncywgbGVuMSwgbGVuMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9hcmdzW2xlbjFdID0gdmFsMjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmaWx0ZXIgdmFsdWUgZm9yIGVhY2ggYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIEZpbHRlclZhbHVlW10gbmV3RmlsdGVyVmFsdWVzKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCAKKyAgICAgICAgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgQXJnc0V4cFN0YXRlIGFzdGF0ZSA9IChBcmdzRXhwU3RhdGUpIHN0YXRlOyAKKyAgICAgICAgRmlsdGVyVmFsdWVbXSBmaWx0cyA9IG5ldyBGaWx0ZXJWYWx1ZVtfYXJncy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZmlsdHNbaV0gPSBuZXcgRmlsdGVyVmFsdWVJbXBsKHNlbCwgY3R4LCBhc3RhdGUuc3RhdGVzW2ldLCAKKyAgICAgICAgICAgICAgICBfYXJnc1tpXSk7IAorICAgICAgICByZXR1cm4gZmlsdHM7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlW10gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gX2FyZ3M7CisgICAgfQorCisgICAgcHVibGljIFZhbFtdIGdldFZhbHMoKSB7CisgICAgICAgIHJldHVybiBfYXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0W10uY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIENsYXNzW10gZ2V0VHlwZXMoKSB7CisgICAgICAgIENsYXNzW10gYyA9IG5ldyBDbGFzc1tfYXJncy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY1tpXSA9IF9hcmdzW2ldLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIEV4cFN0YXRlW10gc3RhdGVzID0gbmV3IEV4cFN0YXRlW19hcmdzLmxlbmd0aF07CisgICAgICAgIEpvaW5zIGpvaW5zID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3RhdGVzW2ldID0gX2FyZ3NbaV0uaW5pdGlhbGl6ZShzZWwsIGN0eCwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGpvaW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgam9pbnMgPSBzdGF0ZXNbaV0uam9pbnM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgam9pbnMgPSBzZWwuYW5kKGpvaW5zLCBzdGF0ZXNbaV0uam9pbnMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQXJnc0V4cFN0YXRlKGpvaW5zLCBzdGF0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cHJlc3Npb24gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJnc0V4cFN0YXRlCisgICAgICAgIGV4dGVuZHMgRXhwU3RhdGUgeworICAgICAgICAKKyAgICAgICAgcHVibGljIEV4cFN0YXRlW10gc3RhdGVzOworCisgICAgICAgIHB1YmxpYyBBcmdzRXhwU3RhdGUoSm9pbnMgam9pbnMsIEV4cFN0YXRlW10gc3RhdGVzKSB7CisgICAgICAgICAgICBzdXBlcihqb2lucyk7CisgICAgICAgICAgICB0aGlzLnN0YXRlcyA9IHN0YXRlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgQXJnc0V4cFN0YXRlIGFzdGF0ZSA9IChBcmdzRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX2FyZ3NbaV0uc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgYXN0YXRlLnN0YXRlc1tpXSwgcGtzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9yZGVyQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgICAgICBBcmdzRXhwU3RhdGUgYXN0YXRlID0gKEFyZ3NFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2FyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBfYXJnc1tpXS5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYXN0YXRlLnN0YXRlc1tpXSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzRW1wdHkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTm90RW1wdHkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCl7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kU2l6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXJncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIF9hcmdzW2ldLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9BdmcuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQXZnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExNjNkMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQXZnLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworLyoqCisgKiBBdmVyYWdlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEF2ZworICAgIGV4dGVuZHMgVW5hcnlPcCB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgdmFsdWUgdG8gb3BlcmF0ZSBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXZnKFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gIkFWRyI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBZ2dyZWdhdGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9CaW5hcnlPcEV4cFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0JpbmFyeU9wRXhwU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTk0MDliCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9CaW5hcnlPcEV4cFN0YXRlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKKworLyoqCisgKiBFeHByZXNzaW9uIHRyZWUgc3RhdGUgZm9yIGEgYmluYXJ5IG9wZXJhdG9yLgorICogCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBCaW5hcnlPcEV4cFN0YXRlIAorICAgIGV4dGVuZHMgRXhwU3RhdGUgeworCisgICAgLyoqCisgICAgICogU3RhdGUgZm9yIGZpcnN0IGV4cHJlc3Npb24vdmFsdWUuCisgICAgICovCisgICAgcHVibGljIEV4cFN0YXRlIHN0YXRlMTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGZvciBzZWNvbmQgZXhwcmVzc2lvbi92YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwU3RhdGUgc3RhdGUyOworCisgICAgcHVibGljIEJpbmFyeU9wRXhwU3RhdGUoKSB7CisgICAgfQorCisgICAgcHVibGljIEJpbmFyeU9wRXhwU3RhdGUoSm9pbnMgam9pbnMsIEV4cFN0YXRlIHN0YXRlMSwgRXhwU3RhdGUgc3RhdGUyKSB7CisgICAgICAgIHN1cGVyKGpvaW5zKTsKKyAgICAgICAgdGhpcy5zdGF0ZTEgPSBzdGF0ZTE7CisgICAgICAgIHRoaXMuc3RhdGUyID0gc3RhdGUyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlQW5kRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9CaW5kVmFyaWFibGVBbmRFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzMWEyMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlQW5kRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKKworLyoqCisgKiBDb21iaW5lcyBhIGJpbmQgdmFyaWFibGUgZXhwcmVzc2lvbiB3aXRoIGFub3RoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQmluZFZhcmlhYmxlQW5kRXhwcmVzc2lvbgorICAgIGltcGxlbWVudHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgQmluZFZhcmlhYmxlRXhwcmVzc2lvbiBfYmluZDsKKyAgICBwcml2YXRlIGZpbmFsIEV4cCBfZXhwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB0aGUgdHdvIGNvbWJpbmVkIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBCaW5kVmFyaWFibGVBbmRFeHByZXNzaW9uKEJpbmRWYXJpYWJsZUV4cHJlc3Npb24gYmluZCwgRXhwIGV4cCkgeworICAgICAgICBfYmluZCA9IGJpbmQ7CisgICAgICAgIF9leHAgPSBleHA7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIE1hcCBjb250YWlucykgeworICAgICAgICBFeHBTdGF0ZSBzMSA9IF9iaW5kLmluaXRpYWxpemUoc2VsLCBjdHgsIGNvbnRhaW5zKTsKKyAgICAgICAgRXhwU3RhdGUgczIgPSBfZXhwLmluaXRpYWxpemUoc2VsLCBjdHgsIGNvbnRhaW5zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcEV4cFN0YXRlKHNlbC5hbmQoczEuam9pbnMsIHMyLmpvaW5zKSwgczEsIHMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgICAgIGJvb2xlYW4gb3IgPSBfZXhwIGluc3RhbmNlb2YgT3JFeHByZXNzaW9uOworICAgICAgICBpZiAob3IpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIoIik7CisgICAgICAgIF9leHAuYXBwZW5kVG8oc2VsLCBjdHgsICgoQmluYXJ5T3BFeHBTdGF0ZSkgc3RhdGUpLnN0YXRlMiwgYnVmKTsKKyAgICAgICAgaWYgKG9yKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgX2V4cC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCAoKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlKS5zdGF0ZTIsIHBrcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfYmluZC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX2V4cC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9CaW5kVmFyaWFibGVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxZDg4MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKKworLyoqCisgKiBCaW5kcyBhIHZhcmlhYmxlIHRvIGEgdmFsdWUuIFR5cGljYWxseSwgdGhlIHtAbGluayAjaW5pdGlhbGl6ZX0gYW5kCisgKiB7QGxpbmsgI2dldEpvaW5zfSBtZXRob2RzIG9mIHRoaXMgZXhwcmVzc2lvbiBhcmUgbm90IGNhbGxlZC4gVGhleSBhcmUKKyAqIG9ubHkgY2FsbGVkIGlmIHRoZSB2YXJpYWJsZSBiZWluZyBib3VuZCBpcyBvdGhlcndpc2UgdW51c2VkIGluIHRoZSBmaWx0ZXIsCisgKiBpbiB3aGljaCBjYXNlIHdlIG11c3QgYXQgbGVhc3QgbWFrZSB0aGUgam9pbnMgdG8gdGhlIHZhcmlhYmxlIGJlY2F1c2UgdGhlCisgKiBhY3Qgb2YgYmluZGluZyBhIHZhcmlhYmxlIHNob3VsZCBhdCBsZWFzdCBndWFyYW50ZWUgdGhhdCBhbiBpbnN0YW5jZQorICogcmVwcmVzdGluZyB0aGUgdmFyaWFibGUgY291bGQgZXhpc3QgKGkuZS4gdGhlIGJpbmRpbmcgY29sbGVjdGlvbiBpcyBub3QKKyAqIGVtcHR5KS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBCaW5kVmFyaWFibGVFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBFbXB0eUV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBWYXJpYWJsZSBfdmFyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIEJpbmRWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGUgdmFyLCBQQ1BhdGggdmFsLCBib29sZWFuIGtleSkgeworICAgICAgICBpZiAoa2V5KQorICAgICAgICAgICAgdmFsLmdldEtleSgpOworICAgICAgICB2YXIuc2V0UENQYXRoKHZhbCk7CisgICAgICAgIF92YXIgPSB2YXI7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlIGdldFZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gX3ZhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIHJldHVybiBfdmFyLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiMSA9IDEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFyLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db21wYXJlRXF1YWxFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbXBhcmVFcXVhbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg5MzcxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db21wYXJlRXF1YWxFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIENvbXBhcmVzIHR3byB2YWx1ZXMgZm9yIGVxdWFsaXR5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2Fic3RyYWN0IGNsYXNzIENvbXBhcmVFcXVhbEV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChDb21wYXJlRXF1YWxFeHByZXNzaW9uLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwxOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgdG8gY29tcGFyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGFyZUVxdWFsRXhwcmVzc2lvbihWYWwgdmFsMSwgVmFsIHZhbDIpIHsKKyAgICAgICAgX3ZhbDEgPSB2YWwxOworICAgICAgICBfdmFsMiA9IHZhbDI7CisgICAgfQorCisgICAgcHVibGljIFZhbCBnZXRWYWx1ZTEoKSB7CisgICAgICAgIHJldHVybiBfdmFsMTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsIGdldFZhbHVlMigpIHsKKyAgICAgICAgcmV0dXJuIF92YWwyOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgYm9vbGVhbiBkaXJlY3QgPSBpc0RpcmVjdENvbXBhcmlzb24oKTsKKyAgICAgICAgaW50IGZsYWdzMSA9IDA7CisgICAgICAgIGludCBmbGFnczIgPSAwOworICAgICAgICBFeHBTdGF0ZSBzMSA9IG51bGw7CisgICAgICAgIEV4cFN0YXRlIHMyID0gbnVsbDsKKyAgICAgICAgaWYgKF92YWwxIGluc3RhbmNlb2YgQ29uc3QpIHsKKyAgICAgICAgICAgIHMxID0gX3ZhbDEuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgICAgICBpZiAoZGlyZWN0ICYmICgoQ29uc3QpIF92YWwxKS5nZXRWYWx1ZShjdHgsIHMxKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZsYWdzMiA9IFZhbC5OVUxMX0NNUDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX3ZhbDIgaW5zdGFuY2VvZiBDb25zdCkgeworICAgICAgICAgICAgczIgPSBfdmFsMi5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgICAgIGlmIChkaXJlY3QgJiYgKChDb25zdCkgX3ZhbDIpLmdldFZhbHVlKGN0eCwgczIpID09IG51bGwpCisgICAgICAgICAgICAgICAgZmxhZ3MxID0gVmFsLk5VTExfQ01QOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoczEgPT0gbnVsbCkKKyAgICAgICAgICAgIHMxID0gX3ZhbDEuaW5pdGlhbGl6ZShzZWwsIGN0eCwgZmxhZ3MxKTsKKyAgICAgICAgaWYgKHMyID09IG51bGwpCisgICAgICAgICAgICBzMiA9IF92YWwyLmluaXRpYWxpemUoc2VsLCBjdHgsIGZsYWdzMik7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BFeHBTdGF0ZShzZWwuYW5kKHMxLmpvaW5zLCBzMi5qb2lucyksIHMxLCBzMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwyLCBic3RhdGUuc3RhdGUyKTsKKyAgICAgICAgX3ZhbDIuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIF92YWwxLCBic3RhdGUuc3RhdGUxKTsKKyAgICAgICAgaWYgKCFGaWx0ZXJzLmNhbkNvbnZlcnQoX3ZhbDEuZ2V0VHlwZSgpLCBfdmFsMi5nZXRUeXBlKCksIGZhbHNlKQorICAgICAgICAgICAgJiYgIUZpbHRlcnMuY2FuQ29udmVydChfdmFsMi5nZXRUeXBlKCksIF92YWwxLmdldFR5cGUoKSwgZmFsc2UpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtY29udmVydCIsIF92YWwxLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICBfdmFsMi5nZXRUeXBlKCkpKTsKKworICAgICAgICBib29sZWFuIHZhbDFOdWxsID0gX3ZhbDEgaW5zdGFuY2VvZiBDb25zdAorICAgICAgICAgICAgJiYgKChDb25zdCkgX3ZhbDEpLmlzU1FMVmFsdWVOdWxsKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxKTsKKyAgICAgICAgYm9vbGVhbiB2YWwyTnVsbCA9IF92YWwyIGluc3RhbmNlb2YgQ29uc3QKKyAgICAgICAgICAgICYmICgoQ29uc3QpIF92YWwyKS5pc1NRTFZhbHVlTnVsbChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMik7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBic3RhdGUsIGJ1ZiwgdmFsMU51bGwsIHZhbDJOdWxsKTsKKyAgICAgICAgc2VsLmFwcGVuZChidWYsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsMS5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCB0cnVlKTsKKyAgICAgICAgX3ZhbDIuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBTUUwgZm9yIHRoZSBjb21wYXJpc29uLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCAKKyAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBzdGF0ZSwgU1FMQnVmZmVyIGJ1ZiwgYm9vbGVhbiB2YWwxTnVsbCwgCisgICAgICAgIGJvb2xlYW4gdmFsMk51bGwpOworCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYsIHdoZW4gdGhleSBjb21wYXJlIHRvIGFub3RoZXIsCisgICAgICogdmFsdWUsIHRoZSBjb21wYXJpc29uIGlzIGluZGlyZWN0LiBGb3IgZXhhbXBsZSwgZmllbGQuY29udGFpbnMgKHgpCisgICAgICogc2hvdWxkIGNvbXBhcmUgZWxlbWVudCB2YWx1ZXMgdG8gbnVsbCwgbm90IHRoZSBmaWVsZCBpdHNlbGYuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJlY3RDb21wYXJpc29uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwxLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdmFsMi5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29tcGFyZUV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29tcGFyZUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFiZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db21wYXJlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIENvbXBhcmVzIHR3byB2YWx1ZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQ29tcGFyZUV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTID0gIjwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVIgPSAiPiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19FUVVBTCA9ICI8PSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9FUVVBTCA9ICI+PSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChDb21wYXJlRXhwcmVzc2lvbi5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsMTsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsMjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfb3A7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyBhbmQgb3BlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIENvbXBhcmVFeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMiwgU3RyaW5nIG9wKSB7CisgICAgICAgIF92YWwxID0gdmFsMTsKKyAgICAgICAgX3ZhbDIgPSB2YWwyOworICAgICAgICBfb3AgPSBvcDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIEV4cFN0YXRlIHMxID0gX3ZhbDEuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIEV4cFN0YXRlIHMyID0gX3ZhbDIuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BFeHBTdGF0ZShzZWwuYW5kKHMxLmpvaW5zLCBzMi5qb2lucyksIHMxLCBzMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwyLCBic3RhdGUuc3RhdGUyKTsKKyAgICAgICAgX3ZhbDIuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIF92YWwxLCBic3RhdGUuc3RhdGUxKTsKKyAgICAgICAgaWYgKCFGaWx0ZXJzLmNhbkNvbnZlcnQoX3ZhbDEuZ2V0VHlwZSgpLCBfdmFsMi5nZXRUeXBlKCksIGZhbHNlKQorICAgICAgICAgICAgJiYgIUZpbHRlcnMuY2FuQ29udmVydChfdmFsMi5nZXRUeXBlKCksIF92YWwxLmdldFR5cGUoKSwgZmFsc2UpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtY29udmVydCIsIF92YWwxLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICBfdmFsMi5nZXRUeXBlKCkpKTsKKworICAgICAgICBjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkuY29tcGFyaXNvbihidWYsIF9vcCwKKyAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwxKSwKKyAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIF92YWwyKSk7CisgICAgICAgIHNlbC5hcHBlbmQoYnVmLCBzdGF0ZS5qb2lucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgdHJ1ZSk7CisgICAgICAgIF92YWwyLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbDEuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF92YWwyLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db25jYXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29uY2F0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4ZGI0ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29uY2F0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBDb25jYXRlbmF0ZSBvbmUgc3RyaW5nIHdpdGggYW5vdGhlci4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitjbGFzcyBDb25jYXQKKyAgICBleHRlbmRzIEFic3RyYWN0VmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwxOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwyOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgc3RyaW5ncyB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBDb25jYXQoVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIF92YWwxID0gdmFsMTsKKyAgICAgICAgX3ZhbDIgPSB2YWwyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX21ldGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgRXhwU3RhdGUgczEgPSBfdmFsMS5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgRXhwU3RhdGUgczIgPSBfdmFsMi5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcEV4cFN0YXRlKHNlbC5hbmQoczEuam9pbnMsIHMyLmpvaW5zKSwgczEsIHMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgc2VsLnNlbGVjdChuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgdHJ1ZSk7CisgICAgICAgIF92YWwyLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNlbC5ncm91cEJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlckJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHNlbC5vcmRlckJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpLCBhc2MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNRTEJ1ZmZlciBuZXdTUUxCdWZmZXIoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKSAKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmNvbnZlcnQocmVzLmdldE9iamVjdCh0aGlzLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkpEQkNfREVGQVVMVCwgbnVsbCksIGdldFR5cGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsMS5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgbnVsbCwgbnVsbCk7CisgICAgICAgIF92YWwyLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsMS5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgbnVsbCwgbnVsbCk7CisgICAgICAgIF92YWwyLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBudWxsLCBudWxsKTsKKworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgU3RyaW5nIGZ1bmMgPSBkaWN0LmNvbmNhdGVuYXRlRnVuY3Rpb247CisgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChmdW5jICE9IG51bGwsICJDb25jYXRlbmF0ZUZ1bmN0aW9uIik7CisgICAgICAgIGludCBwYXJ0MWlkeCA9IGZ1bmMuaW5kZXhPZigiezB9Iik7CisgICAgICAgIGludCBwYXJ0MmlkeCA9IGZ1bmMuaW5kZXhPZigiezF9Iik7CisgICAgICAgIFN0cmluZyBwYXJ0MSA9IGZ1bmMuc3Vic3RyaW5nKDAsIE1hdGgubWluKHBhcnQxaWR4LCBwYXJ0MmlkeCkpOworICAgICAgICBTdHJpbmcgcGFydDIgPSBmdW5jLnN1YnN0cmluZyhNYXRoLm1pbihwYXJ0MWlkeCwgcGFydDJpZHgpICsgMywKKyAgICAgICAgICAgIE1hdGgubWF4KHBhcnQxaWR4LCBwYXJ0MmlkeCkpOworICAgICAgICBTdHJpbmcgcGFydDMgPSBmdW5jLnN1YnN0cmluZyhNYXRoLm1heChwYXJ0MWlkeCwgcGFydDJpZHgpICsgMyk7CisKKyAgICAgICAgc3FsLmFwcGVuZChwYXJ0MSk7CisgICAgICAgIF92YWwxLmFwcGVuZFRvKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBzcWwsIDApOworICAgICAgICBzcWwuYXBwZW5kKHBhcnQyKTsKKyAgICAgICAgX3ZhbDIuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIHNxbCwgMCk7CisgICAgICAgIHNxbC5hcHBlbmQocGFydDMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbDEuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF92YWwyLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbnN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbnN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExOTE4ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29uc3QuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBBIGxpdGVyYWwgb3IgcGFyYW1ldGVyIGluIHRoZSBmaWx0ZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworYWJzdHJhY3QgY2xhc3MgQ29uc3QKKyAgICBleHRlbmRzIEFic3RyYWN0VmFsCisgICAgaW1wbGVtZW50cyBDb25zdGFudCB7CisKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRTUUxWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKGN0eCwgc3RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgY29uc3RhbnQncyBTUUwgdmFsdWUgaXMgZXF1aXZhbGVudCB0byBOVUxMLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU1FMVmFsdWVOdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBPYmplY3QgdmFsID0gZ2V0U1FMVmFsdWUoc2VsLCBjdHgsIHN0YXRlKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIE9iamVjdFtdKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBhbGwtbnVsbCBhcnJheSBpcyBjb25zaWRlcmVkIG51bGwKKyAgICAgICAgT2JqZWN0W10gYXJyID0gKE9iamVjdFtdKSB2YWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGFycltpXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnN0YW50LiAgTWF5IGJlIG1vcmUgcm9idXN0IHRoYW4gdGhlCisgICAgICogcGFyYW1ldGVycy1vbmx5IGZvcm0uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKGN0eC5wYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25zdEV4cFN0YXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZXhwcmVzc2lvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbnN0RXhwU3RhdGUKKyAgICAgICAgZXh0ZW5kcyBFeHBTdGF0ZSB7CisKKyAgICAgICAgcHVibGljIENvbHVtbltdIGNvbHMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29sdW1uIGdldENvbHVtbihpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoY29scyAhPSBudWxsICYmIGNvbHMubGVuZ3RoID4gaW5kZXgpID8gY29sc1tpbmRleF0gOiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFBDUGF0aCkKKyAgICAgICAgICAgICgoQ29uc3RFeHBTdGF0ZSkgc3RhdGUpLmNvbHMgPSAoKFBDUGF0aCkgb3RoZXIpLgorICAgICAgICAgICAgICAgIGdldENvbHVtbnMob3RoZXJTdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgU1FMQnVmZmVyIG5ld1NRTEJ1ZmZlcihTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IG5ldyBTUUxCdWZmZXIoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIDApOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzZWwuZ3JvdXBCeShuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3JkZXJCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIGFzYykgeworICAgICAgICBzZWwub3JkZXJCeShuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgYXNjLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShjdHgsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIE9iamVjdCBvYmogPSBnZXRWYWx1ZShjdHgsIHN0YXRlKTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24gJiYgKChDb2xsZWN0aW9uKSBvYmopLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoVFJVRSk7CisgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCkgb2JqKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBzcWwuYXBwZW5kKFRSVUUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kKEZBTFNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdEVtcHR5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpeworICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VmFsdWUoY3R4LCBzdGF0ZSk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbikgb2JqKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBzcWwuYXBwZW5kKEZBTFNFKTsKKyAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWFwICYmICgoTWFwKSBvYmopLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoRkFMU0UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kKFRSVUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VmFsdWUoY3R4LCBzdGF0ZSk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQorICAgICAgICAgICAgc3FsLmFwcGVuZFZhbHVlKCgoQ29sbGVjdGlvbikgb2JqKS5zaXplKCkpOworICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNYXApCisgICAgICAgICAgICBzcWwuYXBwZW5kVmFsdWUoKChNYXApIG9iaikuc2l6ZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTnVsbChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIGlmIChpc1NRTFZhbHVlTnVsbChzZWwsIGN0eCwgc3RhdGUpKQorICAgICAgICAgICAgc3FsLmFwcGVuZChUUlVFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3FsLmFwcGVuZChGQUxTRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgaWYgKCFpc1NRTFZhbHVlTnVsbChzZWwsIGN0eCwgc3RhdGUpKQorICAgICAgICAgICAgc3FsLmFwcGVuZChUUlVFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3FsLmFwcGVuZChGQUxTRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db25zdEdldE9iamVjdElkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbnN0R2V0T2JqZWN0SWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDUyNTYyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db25zdEdldE9iamVjdElkLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworCisvKioKKyAqIE9idGFpbmluZyB0aGUgb2JqZWN0IGlkIG9mIGEgY29uc3RhbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQ29uc3RHZXRPYmplY3RJZAorICAgIGV4dGVuZHMgQ29uc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25zdCBfY29uc3RhbnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbnN0YW50IHRvIHRyYXZlcnNlLgorICAgICAqLworICAgIHB1YmxpYyBDb25zdEdldE9iamVjdElkKENvbnN0IGNvbnN0YW50KSB7CisgICAgICAgIF9jb25zdGFudCA9IGNvbnN0YW50OworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IG8gPSBfY29uc3RhbnQuZ2V0VmFsdWUocGFyYW1zKTsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlQ2FwYWJsZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuICgoUGVyc2lzdGVuY2VDYXBhYmxlKSBvKS5wY0ZldGNoT2JqZWN0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICByZXR1cm4gY3R4LnN0b3JlLmdldENvbnRleHQoKS5nZXRPYmplY3RJZChfY29uc3RhbnQuZ2V0VmFsdWUoY3R4LCAKKyAgICAgICAgICAgICgoQ29uc3RHZXRPYmplY3RJZEV4cFN0YXRlKSBzdGF0ZSkuY29uc3RhbnRTdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25zdEdldE9iamVjdElkRXhwU3RhdGUoX2NvbnN0YW50LmluaXRpYWxpemUoc2VsLCBjdHgsIDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFNRTFZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICByZXR1cm4gKChDb25zdEdldE9iamVjdElkRXhwU3RhdGUpIHN0YXRlKS5zcWxWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICAgICAgc3VwZXIuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBvdGhlciwgb3RoZXJTdGF0ZSk7CisgICAgICAgIENvbnN0R2V0T2JqZWN0SWRFeHBTdGF0ZSBjc3RhdGUgPSAoQ29uc3RHZXRPYmplY3RJZEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX2NvbnN0YW50LmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBjc3RhdGUuY29uc3RhbnRTdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIE9iamVjdCBvaWQgPSBjdHguc3RvcmUuZ2V0Q29udGV4dCgpLmdldE9iamVjdElkKF9jb25zdGFudC5nZXRWYWx1ZShjdHgsIAorICAgICAgICAgICAgY3N0YXRlLmNvbnN0YW50U3RhdGUpKTsKKyAgICAgICAgaWYgKG90aGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNzdGF0ZS5zcWxWYWx1ZSA9IG90aGVyLnRvRGF0YVN0b3JlVmFsdWUoc2VsLCBjdHgsIG90aGVyU3RhdGUsIG9pZCk7CisgICAgICAgICAgICBjc3RhdGUub3RoZXJMZW5ndGggPSBvdGhlci5sZW5ndGgoc2VsLCBjdHgsIG90aGVyU3RhdGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNzdGF0ZS5zcWxWYWx1ZSA9IG9pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgQ29uc3RHZXRPYmplY3RJZEV4cFN0YXRlIGNzdGF0ZSA9IChDb25zdEdldE9iamVjdElkRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAoY3N0YXRlLm90aGVyTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmRWYWx1ZSgoKE9iamVjdFtdKSBjc3RhdGUuc3FsVmFsdWUpW2luZGV4XSwgCisgICAgICAgICAgICAgICAgY3N0YXRlLmdldENvbHVtbihpbmRleCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kVmFsdWUoY3N0YXRlLnNxbFZhbHVlLCBjc3RhdGUuZ2V0Q29sdW1uKGluZGV4KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwcmVzc2lvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25zdEdldE9iamVjdElkRXhwU3RhdGUgCisgICAgICAgIGV4dGVuZHMgQ29uc3RFeHBTdGF0ZSB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEV4cFN0YXRlIGNvbnN0YW50U3RhdGU7CisgICAgICAgIHB1YmxpYyBPYmplY3Qgc3FsVmFsdWUgPSBudWxsOworICAgICAgICBwdWJsaWMgaW50IG90aGVyTGVuZ3RoID0gMDsKKworICAgICAgICBwdWJsaWMgQ29uc3RHZXRPYmplY3RJZEV4cFN0YXRlKEV4cFN0YXRlIGNvbnN0YW50U3RhdGUpIHsKKyAgICAgICAgICAgIHRoaXMuY29uc3RhbnRTdGF0ZSA9IGNvbnN0YW50U3RhdGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbnN0SW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29uc3RJbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmE5ODAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbnN0SW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIENvbnN0SW5zdGFuY2VvZkV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnN0IF9jb25zdDsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzIF9jbHM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHRoZSBjb25zdGFudCB0byB0ZXN0IGFuZCB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENvbnN0SW5zdGFuY2VvZkV4cHJlc3Npb24oQ29uc3QgdmFsLCBDbGFzcyBjbHMpIHsKKyAgICAgICAgX2NvbnN0ID0gdmFsOworICAgICAgICBfY2xzID0gRmlsdGVycy53cmFwKGNscyk7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIE1hcCBjb250YWlucykgeworICAgICAgICByZXR1cm4gX2NvbnN0LmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYpIHsKKyAgICAgICAgX2NvbnN0LmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGlmIChfY2xzLmlzSW5zdGFuY2UoX2NvbnN0LmdldFZhbHVlKGN0eCwgc3RhdGUpKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjEgPSAxIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjEgPD4gMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgX2NvbnN0LnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIHN0YXRlLCBwa3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX2NvbnN0LmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db25zdFBhdGguamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29uc3RQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmYjk3MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29uc3RQYXRoLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworCisvKioKKyAqIEEgZmllbGQgdHJhdmVyc2FsIHN0YXJ0aW5nIHdpdGggYSBjb25zdGFudCBmaWx0ZXIgcGFyYW1ldGVyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIENvbnN0UGF0aAorICAgIGV4dGVuZHMgQ29uc3QKKyAgICBpbXBsZW1lbnRzIEpEQkNQYXRoIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29uc3QgX2NvbnN0YW50OworICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBfYWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbnN0YW50IHRvIHRyYXZlcnNlLgorICAgICAqLworICAgIHB1YmxpYyBDb25zdFBhdGgoQ29uc3QgY29uc3RhbnQpIHsKKyAgICAgICAgX2NvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfYWN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IGdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICByZXR1cm4gbWV0YS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbGFzdCA9IF9hY3Rpb25zLmdldExhc3QoKTsKKyAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIGxhc3Q7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gKEZpZWxkTWV0YURhdGEpIGxhc3Q7CisgICAgICAgIHJldHVybiBmbWQuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX2FjdGlvbnMuYWRkKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldChGaWVsZE1ldGFEYXRhIGZpZWxkLCBib29sZWFuIG51bGxUcmF2ZXJzYWwpIHsKKyAgICAgICAgX2FjdGlvbnMuYWRkKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRLZXkoKSB7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgbGFzdCgpIHsKKyAgICAgICAgTGlzdEl0ZXJhdG9yIGl0ciA9IF9hY3Rpb25zLmxpc3RJdGVyYXRvcihfYWN0aW9ucy5zaXplKCkpOworICAgICAgICBPYmplY3QgcHJldjsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNQcmV2aW91cygpKSB7CisgICAgICAgICAgICBwcmV2ID0gaXRyLnByZXZpb3VzKCk7CisgICAgICAgICAgICBpZiAocHJldiBpbnN0YW5jZW9mIEZpZWxkTWV0YURhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIChGaWVsZE1ldGFEYXRhKSBwcmV2OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAoKENvbnN0UGF0aEV4cFN0YXRlKSBzdGF0ZSkudmFsdWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTUUxWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuICgoQ29uc3RQYXRoRXhwU3RhdGUpIHN0YXRlKS5zcWxWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3RQYXRoRXhwU3RhdGUoX2NvbnN0YW50LmluaXRpYWxpemUoc2VsLCBjdHgsIDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICAgICAgc3VwZXIuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBvdGhlciwgb3RoZXJTdGF0ZSk7CisgICAgICAgIENvbnN0UGF0aEV4cFN0YXRlIGNzdGF0ZSA9IChDb25zdFBhdGhFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIF9jb25zdGFudC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgY3N0YXRlLmNvbnN0YW50U3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICBjc3RhdGUudmFsdWUgPSBfY29uc3RhbnQuZ2V0VmFsdWUoY3R4LCBjc3RhdGUuY29uc3RhbnRTdGF0ZSk7CisgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gY29waWVkIGZyb20gb3JnLmFwYWNoZS5vcGVuanBhLnF1ZXJ5LkluTWVtb3J5UGF0aAorICAgICAgICBPYmplY3QgYWN0aW9uOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtOworICAgICAgICBCcm9rZXIgdG1wQnJva2VyID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfYWN0aW9ucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgLy8gZmFpbCBvbiBudWxsIHZhbHVlCisgICAgICAgICAgICBpZiAoY3N0YXRlLnZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhY3Rpb24gPSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3N0YXRlLnZhbHVlID0gRmlsdGVycy5jb252ZXJ0KGNzdGF0ZS52YWx1ZSwgKENsYXNzKWFjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2FuIGFjY2VzcyB0aGUgaW5zdGFuY2U7IGV2ZW4gbm9uLXBjIHZhbHMgbWlnaHQKKyAgICAgICAgICAgIC8vIGJlIHByb3h5YWJsZQorICAgICAgICAgICAgc20gPSBudWxsOworICAgICAgICAgICAgdG1wQnJva2VyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjc3RhdGUudmFsdWUgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICAgICAgc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgKChQZXJzaXN0ZW5jZUNhcGFibGUpIGNzdGF0ZS52YWx1ZSkuCisgICAgICAgICAgICAgICAgICAgIHBjR2V0U3RhdGVNYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRtcEJyb2tlciA9IGN0eC5zdG9yZS5nZXRDb250ZXh0KCkuZ2V0QnJva2VyKCk7CisgICAgICAgICAgICAgICAgdG1wQnJva2VyLnRyYW5zYWN0aW9uYWwoY3N0YXRlLnZhbHVlLCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgc20gPSB0bXBCcm9rZXIuZ2V0U3RhdGVNYW5hZ2VyKGNzdGF0ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzcGVjaWZpZWQgZmllbGQgdmFsdWUgYW5kIHN3aXRjaCBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICBjc3RhdGUudmFsdWUgPSBzbS5mZXRjaEZpZWxkKCgoRmllbGRNZXRhRGF0YSkgYWN0aW9uKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5kZXgoKSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIHNldFRyYW5zYWN0aW9uYWwgZG9lcyBub3QgY2xlYXIgdGhlIHN0YXRlLCB3aGljaCBpcworICAgICAgICAgICAgICAgIC8vIGltcG9ydGFudCBzaW5jZSB0bXBWYWwgbWlnaHQgYmUgYWxzbyBtYW5hZ2VkIGJ5CisgICAgICAgICAgICAgICAgLy8gYW5vdGhlciBicm9rZXIgaWYgaXQncyBhIHByb3hpZWQgbm9uLXBjIGluc3RhbmNlCisgICAgICAgICAgICAgICAgaWYgKHRtcEJyb2tlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0bXBCcm9rZXIubm9udHJhbnNhY3Rpb25hbChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFpbGVkKQorICAgICAgICAgICAgY3N0YXRlLnZhbHVlID0gbnVsbDsKKworICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgY3N0YXRlLnNxbFZhbHVlID0gb3RoZXIudG9EYXRhU3RvcmVWYWx1ZShzZWwsIGN0eCwgb3RoZXJTdGF0ZSwgCisgICAgICAgICAgICAgICAgY3N0YXRlLnZhbHVlKTsKKyAgICAgICAgICAgIGNzdGF0ZS5vdGhlckxlbmd0aCA9IG90aGVyLmxlbmd0aChzZWwsIGN0eCwgb3RoZXJTdGF0ZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY3N0YXRlLnNxbFZhbHVlID0gY3N0YXRlLnZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBDb25zdFBhdGhFeHBTdGF0ZSBjc3RhdGUgPSAoQ29uc3RQYXRoRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAoY3N0YXRlLm90aGVyTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmRWYWx1ZSgoKE9iamVjdFtdKSBjc3RhdGUuc3FsVmFsdWUpW2luZGV4XSwgCisgICAgICAgICAgICAgICAgY3N0YXRlLmdldENvbHVtbihpbmRleCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kVmFsdWUoY3N0YXRlLnNxbFZhbHVlLCBjc3RhdGUuZ2V0Q29sdW1uKGluZGV4KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfY29uc3RhbnQuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnN0UGF0aEV4cFN0YXRlIAorICAgICAgICBleHRlbmRzIENvbnN0RXhwU3RhdGUgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBFeHBTdGF0ZSBjb25zdGFudFN0YXRlOworICAgICAgICBwdWJsaWMgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgcHVibGljIE9iamVjdCBzcWxWYWx1ZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBpbnQgb3RoZXJMZW5ndGggPSAwOworCisgICAgICAgIHB1YmxpYyBDb25zdFBhdGhFeHBTdGF0ZShFeHBTdGF0ZSBjb25zdGFudFN0YXRlKSB7CisgICAgICAgICAgICB0aGlzLmNvbnN0YW50U3RhdGUgPSBjb25zdGFudFN0YXRlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db250YWluc0V4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29udGFpbnNFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4MmYxOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ29udGFpbnNFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgb25lIHZhbHVlIGNvbnRhaW5zIGFub3RoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQ29udGFpbnNFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBFcXVhbEV4cHJlc3Npb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgdG8gdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbnNFeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBzdXBlcih2YWwxLCB2YWwyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIFZhbCB2YWwxID0gZ2V0VmFsdWUxKCk7CisgICAgICAgIGlmIChjb250YWlucyAhPSBudWxsICYmIHZhbDEgaW5zdGFuY2VvZiBQQ1BhdGgpIHsKKyAgICAgICAgICAgIFBDUGF0aCBzcWwgPSAoUENQYXRoKSB2YWwxOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBzcWwuZ2V0UGF0aCgpOworCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvdW50IGZvciB0aGlzIHBhdGgKKyAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgY29udGFpbnMuZ2V0KHBhdGgpOworICAgICAgICAgICAgaWYgKGNvdW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgY291bnQgPSBOdW1iZXJzLnZhbHVlT2YoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY291bnQgPSBOdW1iZXJzLnZhbHVlT2YoY291bnQuaW50VmFsdWUoKSArIDEpOworICAgICAgICAgICAgY29udGFpbnMucHV0KHBhdGgsIGNvdW50KTsKKworICAgICAgICAgICAgc3FsLnNldENvbnRhaW5zSWQoY291bnQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmluaXRpYWxpemUoc2VsLCBjdHgsIGNvbnRhaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcmVjdENvbXBhcmlzb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvbnRhaW5zS2V5RXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db250YWluc0tleUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY3MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db250YWluc0tleUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBhIG1hcCB2YWx1ZSBjb250YWlucyBhIGtleS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBDb250YWluc0tleUV4cHJlc3Npb24KKyAgICBleHRlbmRzIENvbnRhaW5zRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyB0byB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluc0tleUV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgVmFsIHZhbDEgPSBnZXRWYWx1ZTEoKTsKKyAgICAgICAgaWYgKHZhbDEgaW5zdGFuY2VvZiBQQ1BhdGgpCisgICAgICAgICAgICAoKFBDUGF0aCkgdmFsMSkuZ2V0S2V5KCk7CisgICAgICAgIHJldHVybiBzdXBlci5pbml0aWFsaXplKHNlbCwgY3R4LCBjb250YWlucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db3VudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Db3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyODZiYzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0NvdW50LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CisKKy8qKgorICogQ291bnQgbm9uLW51bGwgdmFsdWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIENvdW50CisgICAgZXh0ZW5kcyBVbmFyeU9wIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZSB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBDb3VudChWYWwgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICAvLyBqb2luIGludG8gcmVsYXRlZCBvYmplY3QgaWYgcHJlc2VudAorICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZVZhbHVlKHNlbCwgY3R4LCBKT0lOX1JFTCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGdldFR5cGUoQ2xhc3MgYykgeworICAgICAgICByZXR1cm4gbG9uZy5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gIkNPVU5UIjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0N1cnJlbnREYXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0N1cnJlbnREYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzYzhhMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvQ3VycmVudERhdGUuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CisKKy8qKgorICogQSBsaXRlcmFsIGN1cnJlbnQgREFURS9USU1FL1RJTUVTVEFNUCB2YWx1ZSBpbiBhIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitjbGFzcyBDdXJyZW50RGF0ZQorICAgIGV4dGVuZHMgQ29uc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX3R5cGU7CisKKyAgICBwdWJsaWMgQ3VycmVudERhdGUoaW50IHR5cGUpIHsKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gRGF0ZS5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBzd2l0Y2ggKF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpLmN1cnJlbnREYXRlRnVuY3Rpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuVElNRToKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKS5jdXJyZW50VGltZUZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLlRJTUVTVEFNUDoKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKS4KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWVzdGFtcEZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0Rpc3RpbmN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0Rpc3RpbmN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNWMwOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRGlzdGluY3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKKworLyoqCisgKiBEaXN0aW5jdCB0aGUgc3BlY2lmaWVkIHBhdGguCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgRGlzdGluY3QKKyAgICBleHRlbmRzIFVuYXJ5T3AgeworCisgICAgcHVibGljIERpc3RpbmN0KFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIC8vIGpvaW4gaW50byByZWxhdGVkIG9iamVjdCBpZiBwcmVzZW50CisgICAgICAgIHJldHVybiBpbml0aWFsaXplVmFsdWUoc2VsLCBjdHgsIEpPSU5fUkVMKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gIkRJU1RJTkNUIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0VtcHR5RXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9FbXB0eUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDVjZjZlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9FbXB0eUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogQW4gZW1wdHkgZXhwcmVzc2lvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFbXB0eUV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIHJldHVybiBFeHBTdGF0ZS5OVUxMOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9FbmRzV2l0aEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRW5kc1dpdGhFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZjFlZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRW5kc1dpdGhFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworCisvKioKKyAqIFRlc3QgaWYgb25lIHN0cmluZyBlbmRzIHdpdGggYW5vdGhlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFbmRzV2l0aEV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsMTsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsMjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBFbmRzV2l0aEV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIF92YWwxID0gdmFsMTsKKyAgICAgICAgX3ZhbDIgPSB2YWwyOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgRXhwU3RhdGUgczEgPSBfdmFsMS5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgRXhwU3RhdGUgczIgPSBfdmFsMi5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcEV4cFN0YXRlKHNlbC5hbmQoczEuam9pbnMsIHMyLmpvaW5zKSwgczEsIHMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsMS5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgX3ZhbDIsIGJzdGF0ZS5zdGF0ZTIpOworICAgICAgICBfdmFsMi5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgX3ZhbDEsIGJzdGF0ZS5zdGF0ZTEpOworCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBTdHJpbmcgZnVuYyA9IGRpY3Quc3RyaW5nTGVuZ3RoRnVuY3Rpb247CisgICAgICAgIFN0cmluZyBwcmUgPSBudWxsOworICAgICAgICBTdHJpbmcgcG9zdCA9IG51bGw7CisgICAgICAgIGlmIChmdW5jICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBmdW5jLmluZGV4T2YoInswfSIpOworICAgICAgICAgICAgcHJlID0gZnVuYy5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgICAgIHBvc3QgPSBmdW5jLnN1YnN0cmluZyhpZHggKyAzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfdmFsMSBpbnN0YW5jZW9mIENvbnN0ICYmICgoQ29uc3QpIF92YWwxKS5nZXRWYWx1ZShjdHgsIAorICAgICAgICAgICAgYnN0YXRlLnN0YXRlMSkgPT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjEgPD4gMSIpOworICAgICAgICBlbHNlIGlmIChfdmFsMiBpbnN0YW5jZW9mIENvbnN0KSB7CisgICAgICAgICAgICBPYmplY3QgbyA9ICgoQ29uc3QpIF92YWwyKS5nZXRWYWx1ZShjdHgsIGJzdGF0ZS5zdGF0ZTIpOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIxIDw+IDEiKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIENvbHVtbiBjb2wgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChfdmFsMSBpbnN0YW5jZW9mIFBDUGF0aCkgeworICAgICAgICAgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gKChQQ1BhdGgpIF92YWwxKS5nZXRDb2x1bW5zKGJzdGF0ZS5zdGF0ZTEpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGNvbHNbMF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX3ZhbDEuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIExJS0UgIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZFZhbHVlKCIlIiArIG8udG9TdHJpbmcoKSwgY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGNhbid0IHVzZSBMSUtFLCB3ZSBoYXZlIHRvIHRha2UgdGhlIHN1YnN0cmluZyBvZiB0aGUKKyAgICAgICAgICAgIC8vIGZpcnN0IHZhbHVlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBzZWNvbmQKKyAgICAgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChwcmUgIT0gbnVsbCwgIlN0cmluZ0xlbmd0aEZ1bmN0aW9uIik7CisgICAgICAgICAgICBkaWN0LnN1YnN0cmluZyhidWYsIAorICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwxKSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nTGVuZ3RoRGlmZmVyZW5jZUZpbHRlclZhbHVlKHNlbCwgY3R4LCBic3RhdGUsIHByZSwgCisgICAgICAgICAgICAgICAgICAgIHBvc3QpLCBudWxsKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgX3ZhbDIuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBzZWwuYXBwZW5kKGJ1Ziwgc3RhdGUuam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBic3RhdGUgPSAoQmluYXJ5T3BFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIF92YWwxLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIHRydWUpOworICAgICAgICBfdmFsMi5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwxLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdmFsMi5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0byB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBTdHJpbmdMZW5ndGhEaWZmZXJlbmNlRmlsdGVyVmFsdWUKKyAgICAgICAgaW1wbGVtZW50cyBGaWx0ZXJWYWx1ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3QgX3NlbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHBDb250ZXh0IF9jdHg7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmluYXJ5T3BFeHBTdGF0ZSBfc3RhdGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wcmU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wb3N0OworCisgICAgICAgIHB1YmxpYyBTdHJpbmdMZW5ndGhEaWZmZXJlbmNlRmlsdGVyVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIAorICAgICAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBzdGF0ZSwgU3RyaW5nIHByZSwgU3RyaW5nIHBvc3QpIHsKKyAgICAgICAgICAgIF9zZWwgPSBzZWw7CisgICAgICAgICAgICBfY3R4ID0gY3R4OworICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CisgICAgICAgICAgICBfcHJlID0gcHJlOworICAgICAgICAgICAgX3Bvc3QgPSBwb3N0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNRTEJ1ZmZlciBidWYpIHsKKyAgICAgICAgICAgIGFwcGVuZFRvKGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTUUxCdWZmZXIgYnVmLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX3ByZSk7CisgICAgICAgICAgICBfdmFsMS5hcHBlbmRUbyhfc2VsLCBfY3R4LCBfc3RhdGUuc3RhdGUxLCBidWYsIGluZGV4KTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX3Bvc3QpLmFwcGVuZCgiIC0gIikuYXBwZW5kKF9wcmUpOworICAgICAgICAgICAgX3ZhbDIuYXBwZW5kVG8oX3NlbCwgX2N0eCwgX3N0YXRlLnN0YXRlMiwgYnVmLCBpbmRleCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKF9wb3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoQ29sdW1uIGNvbCkgeworICAgICAgICAgICAgcmV0dXJuIF9zZWwuZ2V0Q29sdW1uQWxpYXMoY29sLCBfc3RhdGUuam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhTdHJpbmcgY29sLCBUYWJsZSB0YWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIF9zZWwuZ2V0Q29sdW1uQWxpYXMoY29sLCB0YWJsZSwgX3N0YXRlLmpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdGFudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldEZpZWxkTWFwcGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9FcXVhbEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRXF1YWxFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkYjk0NAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRXF1YWxFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKKworLyoqCisgKiBDb21wYXJlcyB0d28gdmFsdWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEVxdWFsRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29tcGFyZUVxdWFsRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBFcXVhbEV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYsIGJvb2xlYW4gdmFsMU51bGwsIGJvb2xlYW4gdmFsMk51bGwpIHsKKyAgICAgICAgaWYgKHZhbDFOdWxsICYmIHZhbDJOdWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiMSA9IDEiKTsKKyAgICAgICAgZWxzZSBpZiAodmFsMU51bGwgfHwgdmFsMk51bGwpIHsKKyAgICAgICAgICAgIFZhbCB2YWwgPSAodmFsMU51bGwpID8gZ2V0VmFsdWUyKCkgOiBnZXRWYWx1ZTEoKTsKKyAgICAgICAgICAgIEV4cFN0YXRlIHN0YXRlID0gKHZhbDFOdWxsKSA/IGJzdGF0ZS5zdGF0ZTIgOiBic3RhdGUuc3RhdGUxOworICAgICAgICAgICAgaWYgKCFpc0RpcmVjdENvbXBhcmlzb24oKSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSB2YWwubGVuZ3RoKHNlbCwgY3R4LCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgQU5EICIpOworICAgICAgICAgICAgICAgICAgICB2YWwuYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIGkpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgSVMgIikuYXBwZW5kVmFsdWUobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdmFsLmFwcGVuZElzTnVsbChzZWwsIGN0eCwgc3RhdGUsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWYWwgdmFsMSA9IGdldFZhbHVlMSgpOworICAgICAgICAgICAgVmFsIHZhbDIgPSBnZXRWYWx1ZTIoKTsKKyAgICAgICAgICAgIGlmICh2YWwxLmxlbmd0aChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSkgPT0gMSAKKyAgICAgICAgICAgICAgICAmJiB2YWwyLmxlbmd0aChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMikgPT0gMSkgeworICAgICAgICAgICAgICAgIGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKS5jb21wYXJpc29uKGJ1ZiwgIj0iLAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyVmFsdWVJbXBsKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCB2YWwxKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlclZhbHVlSW1wbChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgdmFsMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gamF2YS5sYW5nLk1hdGgubWF4KHZhbDEubGVuZ3RoKHNlbCwgY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgYnN0YXRlLnN0YXRlMSksIHZhbDIubGVuZ3RoKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgQU5EICIpOworCisgICAgICAgICAgICAgICAgICAgIHZhbDEuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIGJ1ZiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgICAgICAgICB2YWwyLmFwcGVuZFRvKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBidWYsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRXhwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDFmYjcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4cC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uOworCisvKioKKyAqIEFuIEV4cHJlc3Npb24gcmVwcmVzZW50cyBhIHF1ZXJ5IHJlYWR5IGZvciBleGVjdXRpb24uIEdlbmVyYWxseSwgaXQgaXMKKyAqIGEgc2V0IG9mIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHF1ZXJ5IHRvIGJlIHRydWUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworaW50ZXJmYWNlIEV4cAorICAgIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBleHByZXNzaW9uLiBUaGlzIG1ldGhvZCBzaG91bGQgcmVjdXJzaXZlbHkKKyAgICAgKiBpbml0aWFsaXplIGFueSBzdWItZXhwcmVzc2lvbnMgb3IgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5zIG1hcCBvZiByZWxhdGlvbiBwYXRocyB0byB0aGUgbnVtYmVyIG9mIHRpbWVzCisgICAgICogdGhlIHBhdGhzIGFwcGVhciBpbiBhIGNvbnRhaW5zKCkgZXhwcmVzc2lvbjsKKyAgICAgKiB1c2VkIHRvIGVuc3VyZSBwYXRocyB1c2VkIGZvciBjb250YWlucygpIHdpdGhpbgorICAgICAqIHRoZSBzYW1lIEFORCBleHByZXNzaW9uIHVzZWQgZGlmZmVyZW50IGFsaWFzZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgU1FMIGZvciB0aGlzIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIGJ1ZmZlci4gVGhlIFNRTAorICAgICAqIHNob3VsZCBvcHRpb25hbGx5IGluY2x1ZGUgYW55IGpvaW5zIHRoaXMgZXhwcmVzc2lvbiBuZWVkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCBqdXN0IHRoZSBjb2x1bW5zIGZvciB0aGlzIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcyk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4cENvbnRleHQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRXhwQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OWUxNzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4cENvbnRleHQuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKKworLyoqCisgKiBFeHByZXNzaW9uIHRyZWUgY29udGV4dC4KKyAqIAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEV4cENvbnRleHQgeworCisgICAgLyoqCisgICAgICogU3RvcmUuCisgICAgICovCisgICAgcHVibGljIEpEQkNTdG9yZSBzdG9yZTsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlcnMgdG8gcXVlcnkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIHBhcmFtczsKKworICAgIC8qKgorICAgICAqIEZldGNoIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2g7IAorCisgICAgcHVibGljIEV4cENvbnRleHQoKSB7CisgICAgfQorCisgICAgcHVibGljIEV4cENvbnRleHQoSkRCQ1N0b3JlIHN0b3JlLCBPYmplY3RbXSBwYXJhbXMsIAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKKyAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisgICAgICAgIHRoaXMuZmV0Y2ggPSBmZXRjaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4cFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4cFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwYTk5ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRXhwU3RhdGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworCisvKioKKyAqIEV4cHJlc3Npb24gdHJlZSBzdGF0ZS4KKyAqIAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEV4cFN0YXRlIHsKKworICAgIC8qKgorICAgICAqIFN0YXRlIHdpdGggbm8gam9pbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHBTdGF0ZSBOVUxMID0gbmV3IEV4cFN0YXRlKCk7CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbnM7CisKKyAgICBwdWJsaWMgRXhwU3RhdGUoKSB7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlKEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHRoaXMuam9pbnMgPSBqb2luczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0V4dGVuc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9FeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjgzYmUzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9FeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBGaWx0ZXIgbGlzdGVuZXIgdGhhdCBldmFsdWF0ZXMgdG8gYSB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFeHRlbnNpb24KKyAgICBleHRlbmRzIEFic3RyYWN0VmFsCisgICAgaW1wbGVtZW50cyBWYWwsIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNGaWx0ZXJMaXN0ZW5lciBfbGlzdGVuZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3RhcmdldDsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfYXJnOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NNYXBwaW5nIF9jYW5kaWRhdGU7CisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIF9tZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzIF9jYXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbnNpb24oSkRCQ0ZpbHRlckxpc3RlbmVyIGxpc3RlbmVyLCBWYWwgdGFyZ2V0LAorICAgICAgICBWYWwgYXJnLCBDbGFzc01hcHBpbmcgY2FuZGlkYXRlKSB7CisgICAgICAgIF9saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBfdGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBfYXJnID0gYXJnOworICAgICAgICBfY2FuZGlkYXRlID0gY2FuZGlkYXRlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX21ldGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBZ2dyZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgaWYgKF9jYXN0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2Nhc3Q7CisgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gKF90YXJnZXQgPT0gbnVsbCkgPyBudWxsIDogX3RhcmdldC5nZXRUeXBlKCk7CisgICAgICAgIHJldHVybiBfbGlzdGVuZXIuZ2V0VHlwZSh0YXJnZXRDbGFzcywgZ2V0QXJnVHlwZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzc1tdIGdldEFyZ1R5cGVzKCkgeworICAgICAgICBpZiAoX2FyZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChfYXJnIGluc3RhbmNlb2YgQXJncykKKyAgICAgICAgICAgIHJldHVybiAoKEFyZ3MpIF9hcmcpLmdldFR5cGVzKCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXXsgX2FyZy5nZXRUeXBlKCkgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfY2FzdCA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICAvLyBub3RlIHRoYXQgd2UgdGVsbCB0YXJnZXRzIGFuZCBhcmdzIHRvIGV4dGVuc2lvbnMgdGhhdCBhcmUgc3FsCisgICAgICAgIC8vIHBhdGhzIHRvIGdvIGFoZWFkIGFuZCBqb2luIHRvIHRoZWlyIHJlbGF0ZWQgb2JqZWN0IChpZiBhbnkpLAorICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0LCB1bmxpa2UgbW9zdCBvcGVyYXRpb25zLCBpZiBhIHJlbGF0aW9uCisgICAgICAgIC8vIGZpZWxkIGxpa2UgYSAxLTEgaXMgZ2l2ZW4gYXMgdGhlIHRhcmdldCBvZiBhbiBleHRlbnNpb24sIHRoZW4KKyAgICAgICAgLy8gdGhlIGV4dGVuc2lvbiBwcm9iYWJseSBhY3RzIG9uIHNvbWUgZmllbGQgb3IgY29sdW1uIGluIHRoZQorICAgICAgICAvLyByZWxhdGVkIG9iamVjdCwgbm90IHRoZSAxLTEgZmllbGQgaXRzZWxmCisgICAgICAgIEV4cFN0YXRlIHRhcmdldFN0YXRlID0gbnVsbDsKKyAgICAgICAgRXhwU3RhdGUgYXJnU3RhdGUgPSBudWxsOworICAgICAgICBpZiAoX3RhcmdldCAhPSBudWxsKQorICAgICAgICAgICAgdGFyZ2V0U3RhdGUgPSBfdGFyZ2V0LmluaXRpYWxpemUoc2VsLCBjdHgsIEpPSU5fUkVMKTsKKyAgICAgICAgaWYgKF9hcmcgIT0gbnVsbCkKKyAgICAgICAgICAgIGFyZ1N0YXRlID0gX2FyZy5pbml0aWFsaXplKHNlbCwgY3R4LCBKT0lOX1JFTCk7CisgICAgICAgIEpvaW5zIGoxID0gKHRhcmdldFN0YXRlID09IG51bGwpID8gbnVsbCA6IHRhcmdldFN0YXRlLmpvaW5zOworICAgICAgICBKb2lucyBqMiA9IChhcmdTdGF0ZSA9PSBudWxsKSA/IG51bGwgOiBhcmdTdGF0ZS5qb2luczsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25FeHBTdGF0ZShzZWwuYW5kKGoxLCBqMiksIHRhcmdldFN0YXRlLCAKKyAgICAgICAgICAgIGFyZ1N0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuc2lvbkV4cFN0YXRlCisgICAgICAgIGV4dGVuZHMgRXhwU3RhdGUgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBFeHBTdGF0ZSB0YXJnZXRTdGF0ZTsKKyAgICAgICAgcHVibGljIGZpbmFsIEV4cFN0YXRlIGFyZ1N0YXRlOworCisgICAgICAgIHB1YmxpYyBFeHRlbnNpb25FeHBTdGF0ZShKb2lucyBqb2lucywgRXhwU3RhdGUgdGFyZ2V0U3RhdGUsCisgICAgICAgICAgICBFeHBTdGF0ZSBhcmdTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoam9pbnMpOworICAgICAgICAgICAgdGhpcy50YXJnZXRTdGF0ZSA9IHRhcmdldFN0YXRlOworICAgICAgICAgICAgdGhpcy5hcmdTdGF0ZSA9IGFyZ1N0YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgRXh0ZW5zaW9uRXhwU3RhdGUgZXN0YXRlID0gKEV4dGVuc2lvbkV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKF90YXJnZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIF90YXJnZXQuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgZXN0YXRlLnRhcmdldFN0YXRlLCB0cnVlKTsKKyAgICAgICAgaWYgKF9hcmcgIT0gbnVsbCkKKyAgICAgICAgICAgIF9hcmcuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgZXN0YXRlLmFyZ1N0YXRlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzZWwuZ3JvdXBCeShuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3JkZXJCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIGFzYykgeworICAgICAgICBzZWwub3JkZXJCeShuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgYXNjLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTUUxCdWZmZXIgbmV3U1FMQnVmZmVyKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBjYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgc3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICBhcHBlbmRUbyhzZWwsIGN0eCwgc3RhdGUsIGJ1ZiwgMCk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgUmVzdWx0IHJlcykgCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRmlsdGVycy5jb252ZXJ0KHJlcy5nZXRPYmplY3QodGhpcywKKyAgICAgICAgICAgIEphdmFTUUxUeXBlcy5KREJDX0RFRkFVTFQsIG51bGwpLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgICAgICBFeHRlbnNpb25FeHBTdGF0ZSBlc3RhdGUgPSAoRXh0ZW5zaW9uRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAoX3RhcmdldCAhPSBudWxsKQorICAgICAgICAgICAgX3RhcmdldC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgZXN0YXRlLnRhcmdldFN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKF9hcmcgIT0gbnVsbCkKKyAgICAgICAgICAgIF9hcmcuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGVzdGF0ZS5hcmdTdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBFeHRlbnNpb25FeHBTdGF0ZSBlc3RhdGUgPSAoRXh0ZW5zaW9uRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBGaWx0ZXJWYWx1ZSB0YXJnZXQgPSAoX3RhcmdldCA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogbmV3IEZpbHRlclZhbHVlSW1wbChzZWwsIGN0eCwgZXN0YXRlLnRhcmdldFN0YXRlLCBfdGFyZ2V0KTsKKyAgICAgICAgX2xpc3RlbmVyLmFwcGVuZFRvKHNxbCwgdGFyZ2V0LCBnZXRBcmdzKHNlbCwgY3R4LCBlc3RhdGUuYXJnU3RhdGUpLAorICAgICAgICAgICAgX2NhbmRpZGF0ZSwgY3R4LnN0b3JlKTsKKyAgICAgICAgc2VsLmFwcGVuZChzcWwsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbHRlclZhbHVlW10gZ2V0QXJncyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgaWYgKF9hcmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoX2FyZyBpbnN0YW5jZW9mIEFyZ3MpCisgICAgICAgICAgICByZXR1cm4gKChBcmdzKSBfYXJnKS5uZXdGaWx0ZXJWYWx1ZXMoc2VsLCBjdHgsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJWYWx1ZVtdIHsKKyAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIHN0YXRlLCBfYXJnKQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcigoRXhwKSB0aGlzKTsKKyAgICAgICAgaWYgKF90YXJnZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIF90YXJnZXQuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIGlmIChfYXJnICE9IG51bGwpCisgICAgICAgICAgICBfYXJnLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQoKEV4cCkgdGhpcyk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEV4cCBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgcmV0dXJuIGluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBzcWwsIDApOworICAgICAgICBzZWwuYXBwZW5kKHNxbCwgc3RhdGUuam9pbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRmlsdGVyVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRmlsdGVyVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNhZDZiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9GaWx0ZXJWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKKworLyoqCisgKiBUaGUgc2ltcGxpZmllZCBwdWJsaWMgdmlldyBvZiBhbnkgbm9uLW9wZXJhdG9yIGluIGEgcXVlcnkgZmlsdGVyLAorICogaW5jbHVkaW5nIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQgb2JqZWN0IGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEZpbHRlclZhbHVlIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBTUUwgZWxlbWVudHMgaW4gdGhpcyB2YWx1ZS4gVXN1YWxseSAxLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCk7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGZpcnN0IFNRTCBlbGVtZW50IGZvciB0aGlzIHZhbHVlIHRvIHRoZSBnaXZlbiBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1Zik7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPnRoIFNRTCBlbGVtZW50IGZvciB0aGlzIHZhbHVlIHRvIHRoZQorICAgICAqIGdpdmVuIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTUUxCdWZmZXIgYnVmLCBpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGlhcyB0byB1c2UgZm9yIHRoZSBnaXZlbiBjb2x1bW4gKHRoaXMgaW5jbHVkZXMgdGhlIHRhYmxlCisgICAgICogYWxpYXMgcHJlZml4LCBpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoQ29sdW1uIGNvbCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIHRvIHVzZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiAodGhpcyBpbmNsdWRlcyB0aGUgdGFibGUKKyAgICAgKiBhbGlhcyBwcmVmaXgsIGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhTdHJpbmcgY29sLCBUYWJsZSB0YWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gdGhlIGdpdmVuIHZhbHVlIGludG8gaXRzIGRhdGFzdG9yZSBlcXVpdmFsZW50LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgdmFsdWUgcmVwcmVzZW50cyBhIGxpdGVyYWwgb3IgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnQoKTsKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgaXMgYSBjb25zdGFudCwgcmV0dXJuIGl0cyB2YWx1ZSwgZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGlzIGEgY29uc3RhbnQsIHJldHVybnMgaXRzIHZhbHVlIGFzIGl0IHdvdWxkIGJlIHJlcHJlc2VudGVkCisgICAgICogaW4gdGhlIGRhdGFiYXNlIGluIHRoaXMgY29udGV4dCwgZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNRTFZhbHVlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIHJlcHJlc2VudHMgYSBwZXJzaXN0ZW50IGZpZWxkIHRyYXZlcnNhbCwKKyAgICAgKiBzdWNoIGFzICd0aGlzJywgJ2FkZHJlc3Muc3RyZWV0Jywgb3IgJ3Byb2plY3RWYXJpYWJsZS50aXRsZScuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGlzIGEgcGF0aCB0byBhIHBlcnNpc3RlbnQgb2JqZWN0LCByZXR1cm4gaXRzIGNsYXNzIG1hcHBpbmcsCisgICAgICogZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBpcyBhIHBhdGggdG8gYSBwZXJzaXN0ZW50IGZpZWxkLCByZXR1cm4gaXRzIG1hcHBpbmcsIGVsc2UKKyAgICAgKiByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldEZpZWxkTWFwcGluZygpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9GaWx0ZXJWYWx1ZUltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRmlsdGVyVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZDIyNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvRmlsdGVyVmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEZpbHRlclZhbHVlfSB0aGF0IHdyYXBzIGEge0BsaW5rIFZhbH0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgRmlsdGVyVmFsdWVJbXBsCisgICAgaW1wbGVtZW50cyBGaWx0ZXJWYWx1ZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdCBfc2VsOworICAgIHByaXZhdGUgZmluYWwgRXhwQ29udGV4dCBfY3R4OworICAgIHByaXZhdGUgZmluYWwgRXhwU3RhdGUgX3N0YXRlOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICBwdWJsaWMgRmlsdGVyVmFsdWVJbXBsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCB2YWwpIHsKKyAgICAgICAgX3NlbCA9IHNlbDsKKyAgICAgICAgX2N0eCA9IGN0eDsKKyAgICAgICAgX3N0YXRlID0gc3RhdGU7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwubGVuZ3RoKF9zZWwsIF9jdHgsIF9zdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBhcHBlbmRUbyhidWYsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNRTEJ1ZmZlciBidWYsIGludCBpbmRleCkgeworICAgICAgICBfdmFsLmFwcGVuZFRvKF9zZWwsIF9jdHgsIF9zdGF0ZSwgYnVmLCBpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBfc2VsLmdldENvbHVtbkFsaWFzKGNvbCwgX3N0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKFN0cmluZyBjb2wsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBfc2VsLmdldENvbHVtbkFsaWFzKGNvbCwgdGFibGUsIF9zdGF0ZS5qb2lucyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwpIHsKKyAgICAgICAgcmV0dXJuIF92YWwudG9EYXRhU3RvcmVWYWx1ZShfc2VsLCBfY3R4LCBfc3RhdGUsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwgaW5zdGFuY2VvZiBDb25zdDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gKGlzQ29uc3RhbnQoKSkgPyAoKENvbnN0KSBfdmFsKS5nZXRWYWx1ZShfY3R4LnBhcmFtcykgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMVmFsdWUoKSB7CisgICAgICAgIHJldHVybiAoaXNDb25zdGFudCgpKSA/ICgoQ29uc3QpIF92YWwpLmdldFNRTFZhbHVlKF9zZWwsIF9jdHgsIF9zdGF0ZSkgCisgICAgICAgICAgICA6IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXRoKCkgeworICAgICAgICByZXR1cm4gX3ZhbCBpbnN0YW5jZW9mIFBDUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIChpc1BhdGgoKSkgPyAoKFBDUGF0aCkgX3ZhbCkuZ2V0Q2xhc3NNYXBwaW5nKF9zdGF0ZSkgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gKGlzUGF0aCgpKSA/ICgoUENQYXRoKSBfdmFsKS5nZXRGaWVsZE1hcHBpbmcoX3N0YXRlKSA6IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9HZXRDb2x1bW4uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvR2V0Q29sdW1uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkMjY3MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvR2V0Q29sdW1uLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogUmV0dXJucyB0aGUgU1FMIGFsaWFzIG9mIHRoZSBuYW1lZCBjb2x1bW4gZm9yIHVzZSBpbiBhIHF1ZXJ5LiBOb3RlIHRoYXQKKyAqIHRvIHJldHJpZXZlIGNvbHVtbnMgaW4gdGhlIHRhYmxlIG9mIHRoZSBjYW5kaWRhdGUgb2JqZWN0LCB5b3UgbXVzdAorICogZXhwbGljaXRseSBxdWFsaWZ5IHRoZSBleHRlbnNpb24gd2l0aCA8Y29kZT50aGlzPC9jb2RlPiwgYXMgZGVtb25zdHJhdGVkCisgKiBpbiB0aGUgc2Vjb25kIGV4YW1wbGUgYmVsb3cuCisgKiAgRXhhbXBsZXM6PGJyIC8+CisgKiA8Y29kZT4gImNvbXBhbnkuYWRkcmVzcy5leHQ6Z2V0Q29sdW1uIChcIklEXCIpID09IDUiPGJyIC8+CisgKiAidGhpcy5leHQ6Z2V0Q29sdW1uIChcIkNMU1wiKSA9PSBcIm9yZy5hcGFjaGUub3BlbmpwYS5leGFtcGxlLlBlcnNvblwiIgorICogPC9jb2RlPgorICoKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEdldENvbHVtbgorICAgIGltcGxlbWVudHMgSkRCQ0ZpbHRlckxpc3RlbmVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJnZXRDb2x1bW4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoR2V0Q29sdW1uLmNsYXNzKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gVEFHOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4cGVjdHNBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4cGVjdHNUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoT2JqZWN0IHRhcmdldCwgQ2xhc3MgdGFyZ2V0Q2xhc3MsIE9iamVjdFtdIGFyZ3MsCisgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcywgT2JqZWN0IGNhbmRpZGF0ZSwgU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWluLW1lbSIsIFRBRykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHRhcmdldCwKKyAgICAgICAgRmlsdGVyVmFsdWVbXSBhcmdzLCBDbGFzc01hcHBpbmcgdHlwZSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIGlmICghYXJnc1swXS5pc0NvbnN0YW50KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiY29uc3Qtb25seSIsIFRBRykpOworICAgICAgICBpZiAoIXRhcmdldC5pc1BhdGgoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYXRoLW9ubHkiLCBUQUcpKTsKKworICAgICAgICAvLyBhbGlhcyB0aGUgY29sdW1uIHVzaW5nIHRoZSB0YXJnZXQncyBjb250ZXh0LCBzbyB0aGF0IHRoZQorICAgICAgICAvLyBjb3JyZWN0IHJlbGF0aW9uIHBhdGggdG8gdGhlIHRhcmdldCBpcyB1c2VkCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gdGFyZ2V0LmdldENsYXNzTWFwcGluZygpOworICAgICAgICBTdHJpbmcgY29sTmFtZSA9IGFyZ3NbMF0uZ2V0VmFsdWUoKS50b1N0cmluZygpOworICAgICAgICBidWYuYXBwZW5kKHRhcmdldC5nZXRDb2x1bW5BbGlhcyhjb2xOYW1lLCBtYXBwaW5nLmdldFRhYmxlKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShDbGFzcyB0YXJnZXRDbGFzcywgQ2xhc3NbXSBhcmdDbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9HZXRNYXBWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9HZXRNYXBWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODUwNjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0dldE1hcFZhbHVlLmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5Db250YWluZXJGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkxSU01hcEZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuUmVsYXRpb25TdHJhdGVnaWVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBtYXAncyBrZXkuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgR2V0TWFwVmFsdWUKKyAgICBleHRlbmRzIEFic3RyYWN0VmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF9tYXA7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX2tleTsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX2Nhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIG1hcCBhbmQga2V5IHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIEdldE1hcFZhbHVlKFZhbCBtYXAsIFZhbCBrZXkpIHsKKyAgICAgICAgX21hcCA9IG1hcDsKKyAgICAgICAgX2tleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICBpZiAoX2Nhc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfY2FzdDsKKyAgICAgICAgcmV0dXJuIF9tYXAuZ2V0VHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIF9jYXN0ID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIEV4cFN0YXRlIG1hcFN0YXRlID0gX21hcC5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgRXhwU3RhdGUga2V5U3RhdGUgPSBfa2V5LmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICByZXR1cm4gbmV3IEdldE1hcFZhbHVlRXhwU3RhdGUoc2VsLmFuZChtYXBTdGF0ZS5qb2lucywga2V5U3RhdGUuam9pbnMpLAorICAgICAgICAgICAgbWFwU3RhdGUsIGtleVN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdldE1hcFZhbHVlRXhwU3RhdGUKKyAgICAgICAgZXh0ZW5kcyBFeHBTdGF0ZSB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEV4cFN0YXRlIG1hcFN0YXRlOworICAgICAgICBwdWJsaWMgZmluYWwgRXhwU3RhdGUga2V5U3RhdGU7CisKKyAgICAgICAgcHVibGljIEdldE1hcFZhbHVlRXhwU3RhdGUoSm9pbnMgam9pbnMsIEV4cFN0YXRlIG1hcFN0YXRlLCAKKyAgICAgICAgICAgIEV4cFN0YXRlIGtleVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihqb2lucyk7CisgICAgICAgICAgICB0aGlzLm1hcFN0YXRlID0gbWFwU3RhdGU7CisgICAgICAgICAgICB0aGlzLmtleVN0YXRlID0ga2V5U3RhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgT2JqZWN0IHZhbCkgeworICAgICAgICBHZXRNYXBWYWx1ZUV4cFN0YXRlIGdzdGF0ZSA9IChHZXRNYXBWYWx1ZUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgcmV0dXJuIF9tYXAudG9EYXRhU3RvcmVWYWx1ZShzZWwsIGN0eCwgZ3N0YXRlLm1hcFN0YXRlLCB2YWwpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBHZXRNYXBWYWx1ZUV4cFN0YXRlIGdzdGF0ZSA9IChHZXRNYXBWYWx1ZUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX21hcC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBnc3RhdGUubWFwU3RhdGUsIHRydWUpOworICAgICAgICBfa2V5LnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGdzdGF0ZS5rZXlTdGF0ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc2VsLmdyb3VwQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9yZGVyQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgc2VsLm9yZGVyQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIGFzYywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgU1FMQnVmZmVyIG5ld1NRTEJ1ZmZlcihTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IG5ldyBTUUxCdWZmZXIoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIDApOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRmlsdGVycy5jb252ZXJ0KHJlcy5nZXRPYmplY3QodGhpcywKKyAgICAgICAgICAgIEphdmFTUUxUeXBlcy5KREJDX0RFRkFVTFQsIG51bGwpLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgICAgICBHZXRNYXBWYWx1ZUV4cFN0YXRlIGdzdGF0ZSA9IChHZXRNYXBWYWx1ZUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX21hcC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgZ3N0YXRlLm1hcFN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgX2tleS5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgZ3N0YXRlLmtleVN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgICAgIGlmICghKF9tYXAgaW5zdGFuY2VvZiBQQ1BhdGgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIGlmICghKF9rZXkgaW5zdGFuY2VvZiBDb25zdCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKworICAgICAgICBHZXRNYXBWYWx1ZUV4cFN0YXRlIGdzdGF0ZSA9IChHZXRNYXBWYWx1ZUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgUENQYXRoIG1hcCA9IChQQ1BhdGgpIF9tYXA7CisgICAgICAgIE9iamVjdCBrZXkgPSAoKENvbnN0KSBfa2V5KS5nZXRWYWx1ZShjdHgsIGdzdGF0ZS5rZXlTdGF0ZSk7CisgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IG1hcC5nZXRGaWVsZE1hcHBpbmcoZ3N0YXRlLm1hcFN0YXRlKTsKKyAgICAgICAgaWYgKCEoZmllbGQuZ2V0U3RyYXRlZ3koKSBpbnN0YW5jZW9mIExSU01hcEZpZWxkU3RyYXRlZ3kpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisKKyAgICAgICAgTFJTTWFwRmllbGRTdHJhdGVneSBzdHJhdCA9IChMUlNNYXBGaWVsZFN0cmF0ZWd5KSBmaWVsZC5nZXRTdHJhdGVneSgpOworICAgICAgICBDbGFzc01hcHBpbmdbXSBjbHNzID0gc3RyYXQuZ2V0SW5kZXBlbmRlbnRWYWx1ZU1hcHBpbmdzKHRydWUpOworICAgICAgICBpZiAoY2xzcyAhPSBudWxsICYmIGNsc3MubGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHRocm93IFJlbGF0aW9uU3RyYXRlZ2llcy51bmpvaW5hYmxlKGZpZWxkKTsKKworICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gKGNsc3MubGVuZ3RoID09IDApID8gbnVsbCA6IGNsc3NbMF07CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBzdHJhdC5nZXRKb2luRm9yZWlnbktleShjbHMpOworCisgICAgICAgIC8vIG1hbnVhbGx5IGNyZWF0ZSBhIHN1YnNlbGVjdCBmb3IgdGhlIE1hcCdzIHZhbHVlCisgICAgICAgIHNxbC5hcHBlbmQoIihTRUxFQ1QgIik7CisgICAgICAgIENvbHVtbltdIHZhbHVlcyA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKHZhbHVlc1tpXS5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBzcWwuYXBwZW5kKCIgRlJPTSAiKS5hcHBlbmQodmFsdWVzWzBdLmdldFRhYmxlKCkuZ2V0RnVsbE5hbWUoKSkuCisgICAgICAgICAgICBhcHBlbmQoIiBXSEVSRSAiKTsKKworICAgICAgICAvLyBhZGQgaW4gdGhlIGpvaW5zCisgICAgICAgIENvbnRhaW5lckZpZWxkU3RyYXRlZ3kuYXBwZW5kVW5hbGlhc2VkSm9pbihzcWwsIHNlbCwgbnVsbCwgCisgICAgICAgICAgICBjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCksIGZpZWxkLCBmayk7CisgICAgICAgIHNxbC5hcHBlbmQoIiBBTkQgIik7CisKKyAgICAgICAga2V5ID0gc3RyYXQudG9LZXlEYXRhU3RvcmVWYWx1ZShrZXksIGN0eC5zdG9yZSk7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBzdHJhdC5nZXRLZXlDb2x1bW5zKGNscyk7CisgICAgICAgIE9iamVjdFtdIHZhbHMgPSAoY29scy5sZW5ndGggPT0gMSkgPyBudWxsIDogKE9iamVjdFtdKSBrZXk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbHNbaV0uZ2V0RnVsbE5hbWUoKSk7CisgICAgICAgICAgICBpZiAodmFscyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGtleSA9PSBudWxsKSA/ICIgSVMgIiA6ICIgPSAiKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kVmFsdWUoa2V5LCBjb2xzW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCh2YWxzW2ldID09IG51bGwpID8gIiBJUyAiIDogIiA9ICIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRWYWx1ZSh2YWxzW2ldLCBjb2xzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBzcWwuYXBwZW5kKCIpIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9HZXRPYmplY3RJZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9HZXRPYmplY3RJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMGJmZWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0dldE9iamVjdElkLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXBwbGljYXRpb25JZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUlkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogU2VsZWN0IHRoZSBvaWQgdmFsdWUgb2YgYW4gb2JqZWN0OyB0eXBpY2FsbHkgdXNlZCBpbiBwcm9qZWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBHZXRPYmplY3RJZAorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoR2V0T2JqZWN0SWQuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBQQ1BhdGggX3BhdGg7CisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIF9tZXRhID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZSB3aG9zZSBvaWQgdG8gZXh0cmFjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2V0T2JqZWN0SWQoUENQYXRoIHBhdGgpIHsKKyAgICAgICAgX3BhdGggPSBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2lkIGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIF9wYXRoLmdldENsYXNzTWFwcGluZyhzdGF0ZSkuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIEV4cFN0YXRlIHN0YXRlID0gX3BhdGguaW5pdGlhbGl6ZShzZWwsIGN0eCwgSk9JTl9SRUwpOworCisgICAgICAgIC8vIGl0J3MgZGlmZmljdWx0IHRvIGdldCBjYWxscyBvbiBub24tcGMgZmllbGRzIHRvIGFsd2F5cyByZXR1cm4gbnVsbAorICAgICAgICAvLyB3aXRob3V0IHNjcmV3aW5nIHVwIHRoZSBTUUwsIHRvIGp1c3QgZG9uJ3QgbGV0IHVzZXJzIGNhbGwgaXQgb24KKyAgICAgICAgLy8gbm9uLXBjIGZpZWxkcyBhdCBhbGwKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IF9wYXRoLmdldENsYXNzTWFwcGluZyhzdGF0ZSk7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCB8fCBjbHMuZ2V0RW1iZWRkaW5nTWFwcGluZygpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWdldG9iamVjdGlkIiwKKyAgICAgICAgICAgICAgICBfcGF0aC5nZXRGaWVsZE1hcHBpbmcoc3RhdGUpKSk7CisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgT2JqZWN0IHZhbCkgeworICAgICAgICAvLyBpZiBkYXRhc3RvcmUgaWRlbnRpdHksIHRyeSB0byBjb252ZXJ0IHRvIGEgbG9uZyB2YWx1ZQorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZyA9IF9wYXRoLmdldENsYXNzTWFwcGluZyhzdGF0ZSk7CisgICAgICAgIGlmIChtYXBwaW5nLmdldElkZW50aXR5VHlwZSgpID09IG1hcHBpbmcuSURfREFUQVNUT1JFKSB7CisgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgSWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigoKElkKSB2YWwpLmdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIEZpbHRlcnMuY29udmVydCh2YWwsIGxvbmcuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdW5rbm93biBpZGVudGl0eSwgY2FuJ3QgZG8gbXVjaAorICAgICAgICBpZiAobWFwcGluZy5nZXRJZGVudGl0eVR5cGUoKSA9PSBtYXBwaW5nLklEX1VOS05PV04pCisgICAgICAgICAgICByZXR1cm4gKHZhbCBpbnN0YW5jZW9mIE9wZW5KUEFJZCkgPworICAgICAgICAgICAgICAgICgoT3BlbkpQQUlkKSB2YWwpLmdldElkT2JqZWN0KCkgOiB2YWw7CisKKyAgICAgICAgLy8gYXBwbGljYXRpb24gaWRlbnRpdHk7IGNvbnZlcnQgdG8gcGsgdmFsdWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzCisgICAgICAgIC8vIHRoZSBtYXBwaW5nJ3MgcHJpbWFyeSBrZXkgY29sdW1ucyB3aWxsIGJlIHJldHVybmVkCisgICAgICAgIE9iamVjdFtdIHBrcyA9IEFwcGxpY2F0aW9uSWRzLnRvUEtWYWx1ZXModmFsLCBtYXBwaW5nKTsKKyAgICAgICAgaWYgKHBrcy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBwa3NbMF07CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwa3M7CisgICAgICAgIHdoaWxlICghbWFwcGluZy5pc1ByaW1hcnlLZXlPYmplY3RJZChmYWxzZSkpCisgICAgICAgICAgICBtYXBwaW5nID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBPYmplY3RbXSB2YWxzID0gbmV3IE9iamVjdFtjb2xzLmxlbmd0aF07CisgICAgICAgIEpvaW5hYmxlIGpvaW47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgam9pbiA9IG1hcHBpbmcuYXNzZXJ0Sm9pbmFibGUoY29sc1tpXSk7CisgICAgICAgICAgICB2YWxzW2ldID0gcGtzW21hcHBpbmcuZ2V0RmllbGQoam9pbi5nZXRGaWVsZEluZGV4KCkpLgorICAgICAgICAgICAgICAgIGdldFByaW1hcnlLZXlJbmRleCgpXTsKKyAgICAgICAgICAgIHZhbHNbaV0gPSBqb2luLmdldEpvaW5WYWx1ZSh2YWxzW2ldLCBjb2xzW2ldLCBjdHguc3RvcmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWxzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBzZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBzdGF0ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBfcGF0aC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBzdGF0ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgX3BhdGguZ3JvdXBCeShzZWwsIGN0eCwgc3RhdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9yZGVyQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgX3BhdGgub3JkZXJCeShzZWwsIGN0eCwgc3RhdGUsIGFzYyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcGF0aC5sb2FkKGN0eCwgc3RhdGUsIHJlcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIF9wYXRoLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiBfcGF0aC5sZW5ndGgoc2VsLCBjdHgsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgX3BhdGguYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBzcWwsIGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF9wYXRoLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0hhc0NvbnRhaW5zRXhwcmVzc2lvblZpc2l0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSGFzQ29udGFpbnNFeHByZXNzaW9uVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzdjNDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0hhc0NvbnRhaW5zRXhwcmVzc2lvblZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFic3RyYWN0RXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb247CisKKy8qKgorICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB2aXNpdGVkIGV4cHJlc3Npb25zIGluY2x1ZGUgYSAiY29udGFpbnMiIGV4cHJlc3Npb24uCisgKiAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEhhc0NvbnRhaW5zRXhwcmVzc2lvblZpc2l0b3IgCisgICAgZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25WaXNpdG9yIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfZm91bmQgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250YWlucyhFeHByZXNzaW9uIGV4cCkgeworICAgICAgICBpZiAoZXhwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIEhhc0NvbnRhaW5zRXhwcmVzc2lvblZpc2l0b3IgdiA9IG5ldyBIYXNDb250YWluc0V4cHJlc3Npb25WaXNpdG9yKCk7CisgICAgICAgIGV4cC5hY2NlcHRWaXNpdCh2KTsKKyAgICAgICAgcmV0dXJuIHYuX2ZvdW5kOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVudGVyKEV4cHJlc3Npb24gZXhwKSB7CisgICAgICAgIGlmICghX2ZvdW5kKQorICAgICAgICAgICAgX2ZvdW5kID0gZXhwIGluc3RhbmNlb2YgQ29udGFpbnNFeHByZXNzaW9uIAorICAgICAgICAgICAgICAgIHx8IGV4cCBpbnN0YW5jZW9mIEJpbmRWYXJpYWJsZUFuZEV4cHJlc3Npb247CisgICAgfQorfSAKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5FeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0luRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWEzMWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0luRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyBJTiBhIGNvbGxlY3Rpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSW5FeHByZXNzaW9uCisgICAgaW1wbGVtZW50cyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKyAgICBwcml2YXRlIGZpbmFsIENvbnN0IF9jb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdGhlIHZhbHVlIHRvIHRlc3QgYW5kIHRoZSBjb25zdGFudCB0byBvYnRhaW4KKyAgICAgKiB0aGUgcGFyYW1ldGVycyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBJbkV4cHJlc3Npb24oVmFsIHZhbCwgQ29uc3QgY29uc3RhbnQpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX2NvbnN0ID0gY29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uc3QgZ2V0Q29uc3RhbnQoKSB7CisgICAgICAgIHJldHVybiBfY29uc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbmVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBWYWwgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBfdmFsOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgRXhwU3RhdGUgdmFsdWVTdGF0ZSA9IF92YWwuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIEV4cFN0YXRlIGNvbnN0YW50U3RhdGUgPSBfY29uc3QuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIHJldHVybiBuZXcgSW5FeHBTdGF0ZSh2YWx1ZVN0YXRlLmpvaW5zLCBjb25zdGFudFN0YXRlLCB2YWx1ZVN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluRXhwU3RhdGUKKyAgICAgICAgZXh0ZW5kcyBFeHBTdGF0ZSB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEV4cFN0YXRlIGNvbnN0YW50U3RhdGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBFeHBTdGF0ZSB2YWx1ZVN0YXRlOworCisgICAgICAgIHB1YmxpYyBJbkV4cFN0YXRlKEpvaW5zIGpvaW5zLCBFeHBTdGF0ZSBjb25zdGFudFN0YXRlLCAKKyAgICAgICAgICAgIEV4cFN0YXRlIHZhbHVlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGpvaW5zKTsKKyAgICAgICAgICAgIHRoaXMuY29uc3RhbnRTdGF0ZSA9IGNvbnN0YW50U3RhdGU7CisgICAgICAgICAgICB0aGlzLnZhbHVlU3RhdGUgPSB2YWx1ZVN0YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBJbkV4cFN0YXRlIGlzdGF0ZSA9IChJbkV4cFN0YXRlKSBzdGF0ZTsgCisgICAgICAgIF9jb25zdC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgaXN0YXRlLmNvbnN0YW50U3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICBfdmFsLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBpc3RhdGUudmFsdWVTdGF0ZSwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgTGlzdCBsaXN0ID0gbnVsbDsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gZ2V0Q29sbGVjdGlvbihjdHgsIGlzdGF0ZS5jb25zdGFudFN0YXRlKTsKKyAgICAgICAgaWYgKGNvbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoY29sbC5zaXplKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgIGxpc3QuYWRkKF92YWwudG9EYXRhU3RvcmVWYWx1ZShzZWwsIGN0eCwgaXN0YXRlLnZhbHVlU3RhdGUsIAorICAgICAgICAgICAgICAgICAgICBpdHIubmV4dCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gbnVsbDsKKyAgICAgICAgaWYgKF92YWwgaW5zdGFuY2VvZiBQQ1BhdGgpCisgICAgICAgICAgICBjb2xzID0gKChQQ1BhdGgpIF92YWwpLmdldENvbHVtbnMoaXN0YXRlLnZhbHVlU3RhdGUpOworICAgICAgICBlbHNlIGlmIChfdmFsIGluc3RhbmNlb2YgR2V0T2JqZWN0SWQpCisgICAgICAgICAgICBjb2xzID0gKChHZXRPYmplY3RJZCkgX3ZhbCkuZ2V0Q29sdW1ucyhpc3RhdGUudmFsdWVTdGF0ZSk7CisKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjEgPD4gMSIpOworICAgICAgICBlbHNlIGlmIChfdmFsLmxlbmd0aChzZWwsIGN0eCwgaXN0YXRlLnZhbHVlU3RhdGUpID09IDEpCisgICAgICAgICAgICBjcmVhdGVJbkNvbnRhaW5zKHNlbCwgY3R4LCBpc3RhdGUudmFsdWVTdGF0ZSwgYnVmLCBsaXN0LCBjb2xzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3JDb250YWlucyhzZWwsIGN0eCwgaXN0YXRlLnZhbHVlU3RhdGUsIGJ1ZiwgbGlzdCwgY29scyk7CisgICAgICAgIHNlbC5hcHBlbmQoYnVmLCBzdGF0ZS5qb2lucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZWQgb24gdGhlIGluQ2xhdXNlTGltaXQgb2YgdGhlIERCRGljdGlvbmFyeSwgY3JlYXRlIHRoZSBuZWVkZWQgSU4gCisgICAgICogY2xhdXNlcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVJbkNvbnRhaW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYsIExpc3QgbGlzdCwgQ29sdW1uW10gY29scykgeworCisgICAgICAgIGludCBpbkNsYXVzZUxpbWl0ID0gY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpLmluQ2xhdXNlTGltaXQ7CisgICAgICAgIGlmIChpbkNsYXVzZUxpbWl0IDw9IDAgfHwgbGlzdC5zaXplKCkgPD0gaW5DbGF1c2VMaW1pdCkKKyAgICAgICAgICAgIGluQ29udGFpbnMoc2VsLCBjdHgsIHN0YXRlLCBidWYsIGxpc3QsIGNvbHMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIigiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGxvdyA9IDAsIGhpZ2g7IGxvdyA8IGxpc3Quc2l6ZSgpOyBsb3cgPSBoaWdoKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvdyA+IDApCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBPUiAiKTsKKyAgICAgICAgICAgICAgICBoaWdoID0gamF2YS5sYW5nLk1hdGgubWluKGxvdyArIGluQ2xhdXNlTGltaXQsIGxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpbkNvbnRhaW5zKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCBsaXN0LnN1Ykxpc3QobG93LCBoaWdoKSwgY29scyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gSU4gY2xhdXNlIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbkNvbnRhaW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYsIENvbGxlY3Rpb24gY29sbCwgQ29sdW1uW10gY29scykgeworICAgICAgICBfdmFsLmFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCAwKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIElOICgiKTsKKworICAgICAgICBDb2x1bW4gY29sID0gKGNvbHMgIT0gbnVsbCAmJiBjb2xzLmxlbmd0aCA9PSAxKSA/IGNvbHNbMF0gOiBudWxsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbGwuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmRWYWx1ZShpdHIubmV4dCgpLCBjb2wpOworICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHZhbHVlIHRvIHRlc3QgaXMgYSBjb21wb3VuZCBrZXksIHdlIGNhbid0IHVzZSBJTiwKKyAgICAgKiBzbyBjcmVhdGUgYSBjbGF1c2UgbGlrZSAnKGEgPSBiIEFORCBjID0gZCkgT1IgKGUgPSBmIEFORCBnID0gaCkgLi4uJworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvckNvbnRhaW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYsIENvbGxlY3Rpb24gY29sbCwgQ29sdW1uW10gY29scykgeworICAgICAgICBpZiAoY29sbC5zaXplKCkgPiAxKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIpOworCisgICAgICAgIE9iamVjdFtdIHZhbHM7CisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY29sbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgdmFscyA9IChPYmplY3RbXSkgaXRyLm5leHQoKTsKKworICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29sID0gKGNvbHMgIT0gbnVsbCAmJiBjb2xzLmxlbmd0aCA9PSB2YWxzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgPyBjb2xzW2ldIDogbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisKKyAgICAgICAgICAgICAgICBfdmFsLmFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsc1tpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgSVMgIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgPSAiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kVmFsdWUodmFsc1tpXSwgY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKworICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIE9SICIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2xsLnNpemUoKSA+IDEpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBJbkV4cFN0YXRlIGlzdGF0ZSA9IChJbkV4cFN0YXRlKSBzdGF0ZTsgCisgICAgICAgIF9jb25zdC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBpc3RhdGUuY29uc3RhbnRTdGF0ZSwgdHJ1ZSk7CisgICAgICAgIF92YWwuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgaXN0YXRlLnZhbHVlU3RhdGUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sbGVjdGlvbiB0byB0ZXN0IGZvciBjb250YWlubWVudCB3aXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIE9iamVjdCB2YWwgPSBfY29uc3QuZ2V0VmFsdWUoY3R4LCBzdGF0ZSk7CisKKyAgICAgICAgLy8gd3JhcCBub24tQ29sbGVjdGlvbiBwYXJhbWV0ZXJzIGluIGEgQ29sbGVjdGlvbnMgc28gdGhlIHF1ZXJ5CisgICAgICAgIC8vIGxhbnVhZ2UgY2FuIHBlcm1pdCB2YXJhcmdzICJpbiIgY2xhdXNlcworICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSkKKyAgICAgICAgICAgIHZhbCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbih2YWwpOworCisgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbikgdmFsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX2NvbnN0LmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9JbktleUV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5LZXlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiYjRkYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5LZXlFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIElOIGEgbWFwIGtleSBzZXQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSW5LZXlFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBJbkV4cHJlc3Npb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB0aGUgdmFsdWUgdG8gdGVzdCBhbmQgdGhlIGNvbnN0YW50IHRvIG9idGFpbgorICAgICAqIHRoZSBwYXJhbWV0ZXJzIGZyb20uCisgICAgICovCisgICAgcHVibGljIEluS2V5RXhwcmVzc2lvbihWYWwgdmFsLCBDb25zdCBjb25zdGFudCkgeworICAgICAgICBzdXBlcih2YWwsIGNvbnN0YW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbGxlY3Rpb24gdG8gdGVzdCBmb3IgY29udGFpbm1lbnQgd2l0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBNYXAgbWFwID0gKE1hcCkgZ2V0Q29uc3RhbnQoKS5nZXRWYWx1ZShjdHgsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIChtYXAgPT0gbnVsbCkgPyBudWxsIDogbWFwLmtleVNldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5TdWJRRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9JblN1YlFFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViY2VhNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5TdWJRRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIElOIGEgc3VicXVlcnkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSW5TdWJRRXhwcmVzc2lvbgorICAgIGltcGxlbWVudHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisgICAgcHJpdmF0ZSBmaW5hbCBTdWJRIF9zdWI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHRoZSB2YWx1ZSB0byB0ZXN0IGFuZCB0aGUgc3VicXVlcnkuCisgICAgICovCisgICAgcHVibGljIEluU3ViUUV4cHJlc3Npb24oVmFsIHZhbCwgU3ViUSBzdWIpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX3N1YiA9IHN1YjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIEV4cFN0YXRlIHN1YnFTdGF0ZSA9IF9zdWIuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIEV4cFN0YXRlIHZhbHVlU3RhdGUgPSBfdmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICByZXR1cm4gbmV3IEluU3ViUUV4cFN0YXRlKHZhbHVlU3RhdGUuam9pbnMsIHN1YnFTdGF0ZSwgdmFsdWVTdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwcmVzc2lvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJblN1YlFFeHBTdGF0ZQorICAgICAgICBleHRlbmRzIEV4cFN0YXRlIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgRXhwU3RhdGUgc3VicVN0YXRlOworICAgICAgICBwdWJsaWMgZmluYWwgRXhwU3RhdGUgdmFsdWVTdGF0ZTsKKworICAgICAgICBwdWJsaWMgSW5TdWJRRXhwU3RhdGUoSm9pbnMgam9pbnMsIEV4cFN0YXRlIHN1YnFTdGF0ZSwgCisgICAgICAgICAgICBFeHBTdGF0ZSB2YWx1ZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihqb2lucyk7CisgICAgICAgICAgICB0aGlzLnN1YnFTdGF0ZSA9IHN1YnFTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWVTdGF0ZSA9IHZhbHVlU3RhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgICAgIEluU3ViUUV4cFN0YXRlIGlzdGF0ZSA9IChJblN1YlFFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIF9zdWIuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGlzdGF0ZS5zdWJxU3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICBfdmFsLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBpc3RhdGUudmFsdWVTdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIF92YWwuYXBwZW5kVG8oc2VsLCBjdHgsIGlzdGF0ZS52YWx1ZVN0YXRlLCBidWYsIDApOworICAgICAgICBidWYuYXBwZW5kKCIgSU4gIik7CisgICAgICAgIF9zdWIuYXBwZW5kVG8oc2VsLCBjdHgsIGlzdGF0ZS52YWx1ZVN0YXRlLCBidWYsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgSW5TdWJRRXhwU3RhdGUgaXN0YXRlID0gKEluU3ViUUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3N1Yi5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBpc3RhdGUuc3VicVN0YXRlLCBwa3MpOworICAgICAgICBfdmFsLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGlzdGF0ZS52YWx1ZVN0YXRlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF9zdWIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0luVmFsdWVFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0luVmFsdWVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzN2U3OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5WYWx1ZUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgSU4gYSBtYXAgdmFsdWUgY29sbGVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBJblZhbHVlRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgSW5FeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdGhlIHZhbHVlIHRvIHRlc3QgYW5kIHRoZSBjb25zdGFudCB0byBvYnRhaW4KKyAgICAgKiB0aGUgcGFyYW1ldGVycyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBJblZhbHVlRXhwcmVzc2lvbihWYWwgdmFsLCBDb25zdCBjb25zdGFudCkgeworICAgICAgICBzdXBlcih2YWwsIGNvbnN0YW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbGxlY3Rpb24gdG8gdGVzdCBmb3IgY29udGFpbm1lbnQgd2l0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBNYXAgbWFwID0gKE1hcCkgZ2V0Q29uc3RhbnQoKS5nZXRWYWx1ZShjdHgsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIChtYXAgPT0gbnVsbCkgPyBudWxsIDogbWFwLnZhbHVlcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5kZXhPZi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9JbmRleE9mLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5ZjM1MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSW5kZXhPZi5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIEZpbmQgdGhlIGluZGV4IG9mIG9uZSBzdHJpbmcgd2l0aGluIGFub3RoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSW5kZXhPZgorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDE7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDI7CisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIF9tZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzIF9jYXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSBzdHJpbmdzIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIEluZGV4T2YoVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIF92YWwxID0gdmFsMTsKKyAgICAgICAgX3ZhbDIgPSB2YWwyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX21ldGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgaWYgKF9jYXN0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2Nhc3Q7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX2Nhc3QgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgRXhwU3RhdGUgczEgPSBfdmFsMS5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgRXhwU3RhdGUgczIgPSBfdmFsMi5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcEV4cFN0YXRlKHNlbC5hbmQoczEuam9pbnMsIHMyLmpvaW5zKSwgczEsIHMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgc2VsLnNlbGVjdChuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgdHJ1ZSk7CisgICAgICAgIF92YWwyLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNlbC5ncm91cEJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlckJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHNlbC5vcmRlckJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpLCBhc2MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNRTEJ1ZmZlciBuZXdTUUxCdWZmZXIoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKSAKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmNvbnZlcnQocmVzLmdldE9iamVjdCh0aGlzLCBKYXZhU1FMVHlwZXMuSkRCQ19ERUZBVUxULCAKKyAgICAgICAgICAgIG51bGwpLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIG51bGwsIG51bGwpOworICAgICAgICBfdmFsMi5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgRmlsdGVyVmFsdWUgc3RyID0gbmV3IEZpbHRlclZhbHVlSW1wbChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgX3ZhbDEpOworICAgICAgICBGaWx0ZXJWYWx1ZSBzZWFyY2g7CisgICAgICAgIEZpbHRlclZhbHVlIHN0YXJ0ID0gbnVsbDsKKyAgICAgICAgaWYgKF92YWwyIGluc3RhbmNlb2YgQXJncykgeworICAgICAgICAgICAgRmlsdGVyVmFsdWVbXSBmaWx0cyA9ICgoQXJncykgX3ZhbDIpLm5ld0ZpbHRlclZhbHVlcyhzZWwsIGN0eCwgCisgICAgICAgICAgICAgICAgYnN0YXRlLnN0YXRlMik7CisgICAgICAgICAgICBzZWFyY2ggPSBmaWx0c1swXTsKKyAgICAgICAgICAgIHN0YXJ0ID0gZmlsdHNbMV07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc2VhcmNoID0gbmV3IEZpbHRlclZhbHVlSW1wbChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgX3ZhbDIpOworCisgICAgICAgIGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKS5pbmRleE9mKHNxbCwgc3RyLCBzZWFyY2gsIHN0YXJ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwxLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdmFsMi5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDQ2MTYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0luc3RhbmNlb2ZFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5EaXNjcmltaW5hdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEluc3RhbmNlb2ZFeHByZXNzaW9uCisgICAgaW1wbGVtZW50cyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQQ1BhdGggX3BhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBfY2xzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBwYXRoIGFuZCBjbGFzcyB0byB0ZXN0IGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VvZkV4cHJlc3Npb24oUENQYXRoIHBhdGgsIENsYXNzIGNscykgeworICAgICAgICBfcGF0aCA9IHBhdGg7CisgICAgICAgIF9jbHMgPSBjbHM7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIE1hcCBjb250YWlucykgeworICAgICAgICAvLyBub3RlIHRoYXQgd2UgdGVsbCB0aGUgcGF0aCB0byBnbyBhaGVhZCBhbmQgam9pbiB0byBpdHMgcmVsYXRlZAorICAgICAgICAvLyBvYmplY3QgKGlmIGFueSkgaW4gb3JkZXIgdG8gYWNjZXNzIGl0cyBjbGFzcyBpbmRpY2F0b3IKKyAgICAgICAgRXhwU3RhdGUgcGF0aFN0YXRlID0gX3BhdGguaW5pdGlhbGl6ZShzZWwsIGN0eCwgVmFsLkpPSU5fUkVMKTsKKworICAgICAgICAvLyBkb2VzIHRoaXMgcGF0aCByZXByZXNlbnQgYSByZWxhdGlvbj8gIGlmIG5vdCwgd2hhdCBjbGFzcworICAgICAgICAvLyBpcyB0aGUgZmllbGQ/CisgICAgICAgIENsYXNzTWFwcGluZyByZWxNYXBwaW5nID0gX3BhdGguZ2V0Q2xhc3NNYXBwaW5nKHBhdGhTdGF0ZSk7CisgICAgICAgIENsYXNzIHJlbCA9IG51bGw7CisgICAgICAgIGlmIChyZWxNYXBwaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IF9wYXRoLmdldEZpZWxkTWFwcGluZyhwYXRoU3RhdGUpOworICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICBpZiAoX3BhdGguaXNLZXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9IGZpZWxkLmdldEtleSgpLmdldERlY2xhcmVkVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIHJlbCA9IGZpZWxkLmdldEVsZW1lbnQoKS5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVsID0gZmllbGQuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmVsID0gcmVsTWFwcGluZy5nZXREZXNjcmliZWRUeXBlKCk7CisKKyAgICAgICAgLy8gaWYgdGhlIHBhdGggcmVwcmVzZW50cyBhIHJlbGF0aW9uLCBnZXQgaXRzIGNsYXNzIGluZGljYXRvciBhbmQKKyAgICAgICAgLy8gbWFrZSBzdXJlIGl0J3Mgam9pbmVkIGRvd24gdG8gaXRzIGJhc2UgdHlwZQorICAgICAgICBEaXNjcmltaW5hdG9yIGRpc2NyaW0gPSAocmVsTWFwcGluZyA9PSBudWxsIAorICAgICAgICAgICAgfHwgIXJlbE1hcHBpbmcuZ2V0RGVzY3JpYmVkVHlwZSgpLmlzQXNzaWduYWJsZUZyb20oX2NscykpIAorICAgICAgICAgICAgPyBudWxsIDogcmVsTWFwcGluZy5nZXREaXNjcmltaW5hdG9yKCk7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gbnVsbDsKKyAgICAgICAgSm9pbnMgam9pbnMgPSBwYXRoU3RhdGUuam9pbnM7CisgICAgICAgIGlmIChkaXNjcmltICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNhY2hlIG1hcHBpbmcgZm9yIGNhc3QKKyAgICAgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gY3R4LnN0b3JlLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgICAgICBnZXRNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBtYXBwaW5nID0gcmVwb3MuZ2V0TWFwcGluZyhfY2xzLCBjdHguc3RvcmUuZ2V0Q29udGV4dCgpLgorICAgICAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKCksIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gaWYgbm90IGxvb2tpbmcgZm9yIGEgUEMsIGRvbid0IGJvdGhlciB3aXRoIGluZGljYXRvcgorICAgICAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCB8fCAhZGlzY3JpbS5oYXNDbGFzc0NvbmRpdGlvbnMobWFwcGluZywgdHJ1ZSkpCisgICAgICAgICAgICAgICAgZGlzY3JpbSA9IG51bGw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmcgb3duZXIgPSBkaXNjcmltLmdldENsYXNzTWFwcGluZygpOworICAgICAgICAgICAgICAgIENsYXNzTWFwcGluZyBmcm9tLCB0bzsKKyAgICAgICAgICAgICAgICBpZiAocmVsTWFwcGluZy5nZXREZXNjcmliZWRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbQorICAgICAgICAgICAgICAgICAgICAob3duZXIuZ2V0RGVzY3JpYmVkVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3duZXI7CisgICAgICAgICAgICAgICAgICAgIHRvID0gcmVsTWFwcGluZzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcmVsTWFwcGluZzsKKyAgICAgICAgICAgICAgICAgICAgdG8gPSBvd25lcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKDsgZnJvbSAhPSBudWxsICYmIGZyb20gIT0gdG87CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpKQorICAgICAgICAgICAgICAgICAgICBqb2lucyA9IGZyb20uam9pblN1cGVyY2xhc3Moam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlb2ZFeHBTdGF0ZShqb2lucywgcGF0aFN0YXRlLCBtYXBwaW5nLCBkaXNjcmltLCByZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cHJlc3Npb24gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5zdGFuY2VvZkV4cFN0YXRlCisgICAgICAgIGV4dGVuZHMgRXhwU3RhdGUgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBFeHBTdGF0ZSBwYXRoU3RhdGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBDbGFzc01hcHBpbmcgbWFwcGluZzsKKyAgICAgICAgcHVibGljIGZpbmFsIERpc2NyaW1pbmF0b3IgZGlzY3JpbTsKKyAgICAgICAgcHVibGljIGZpbmFsIENsYXNzIHJlbDsKKworICAgICAgICBwdWJsaWMgSW5zdGFuY2VvZkV4cFN0YXRlKEpvaW5zIGpvaW5zLCBFeHBTdGF0ZSBwYXRoU3RhdGUsIAorICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIERpc2NyaW1pbmF0b3IgZGlzY3JpbSwgQ2xhc3MgcmVsKSB7CisgICAgICAgICAgICBzdXBlcihqb2lucyk7CisgICAgICAgICAgICB0aGlzLnBhdGhTdGF0ZSA9IHBhdGhTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMubWFwcGluZyA9IG1hcHBpbmc7CisgICAgICAgICAgICB0aGlzLmRpc2NyaW0gPSBkaXNjcmltOworICAgICAgICAgICAgdGhpcy5yZWwgPSByZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIC8vIGlmIG5vIGNsYXNzIGluZGljYXRvciBvciBhIGZpbmFsIGNsYXNzLCBqdXN0IGFwcGVuZCB0cnVlIG9yIGZhbHNlCisgICAgICAgIC8vIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjYXN0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIHR5cGUKKyAgICAgICAgSW5zdGFuY2VvZkV4cFN0YXRlIGlzdGF0ZSA9IChJbnN0YW5jZW9mRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAoaXN0YXRlLmRpc2NyaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9jbHMuaXNBc3NpZ25hYmxlRnJvbShpc3RhdGUucmVsKSkKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIxID0gMSIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIjEgPD4gMSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3R4LnN0b3JlLmxvYWRTdWJjbGFzc2VzKGlzdGF0ZS5kaXNjcmltLmdldENsYXNzTWFwcGluZygpKTsKKyAgICAgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBpc3RhdGUuZGlzY3JpbS5nZXRDbGFzc0NvbmRpdGlvbnMoc2VsLAorICAgICAgICAgICAgICAgIGlzdGF0ZS5qb2lucywgaXN0YXRlLm1hcHBpbmcsIHRydWUpOworICAgICAgICAgICAgc3FsLmFwcGVuZChidWYpOworICAgICAgICB9CisgICAgICAgIHNlbC5hcHBlbmQoc3FsLCBpc3RhdGUuam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgSW5zdGFuY2VvZkV4cFN0YXRlIGlzdGF0ZSA9IChJbnN0YW5jZW9mRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAoaXN0YXRlLmRpc2NyaW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHNlbC5zZWxlY3QoaXN0YXRlLmRpc2NyaW0uZ2V0Q29sdW1ucygpLCBpc3RhdGUuam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3BhdGguYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSXNFbXB0eUV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSXNFbXB0eUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjAxYzBjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Jc0VtcHR5RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBlbXB0eS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBJc0VtcHR5RXhwcmVzc2lvbgorICAgIGltcGxlbWVudHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlIHRvIHRlc3QuCisgICAgICovCisgICAgcHVibGljIElzRW1wdHlFeHByZXNzaW9uKFZhbCB2YWwpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIHJldHVybiBfdmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIFZhbC5OVUxMX0NNUCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBfdmFsLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIF92YWwuYXBwZW5kSXNFbXB0eShzZWwsIGN0eCwgc3RhdGUsIGJ1Zik7CisgICAgICAgIHNlbC5hcHBlbmQoYnVmLCBzdGF0ZS5qb2lucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBfdmFsLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIHN0YXRlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0lzTm90RW1wdHlFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0lzTm90RW1wdHlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjN2JhMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSXNOb3RFbXB0eUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgbm90IGVtcHR5LgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIElzTm90RW1wdHlFeHByZXNzaW9uCisgICAgaW1wbGVtZW50cyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdmFsdWUgdG8gdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXNOb3RFbXB0eUV4cHJlc3Npb24oVmFsIHZhbCkgeworICAgICAgICBfdmFsID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuaW5pdGlhbGl6ZShzZWwsIGN0eCwgVmFsLk5VTExfQ01QKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgICAgIF92YWwuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgX3ZhbC5hcHBlbmRJc05vdEVtcHR5KHNlbCwgY3R4LCBzdGF0ZSwgYnVmKTsKKyAgICAgICAgc2VsLmFwcGVuZChidWYsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIF92YWwuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgc3RhdGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ0FnZ3JlZ2F0ZUxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNBZ2dyZWdhdGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNmQ4MzYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNBZ2dyZWdhdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFnZ3JlZ2F0ZUxpc3RlbmVyOworCisvKioKKyAqIEpEQkMgZXh0ZW5zaW9uIHRvIHRoZSB7QGxpbmsgQWdncmVnYXRlTGlzdGVuZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSkRCQ0FnZ3JlZ2F0ZUxpc3RlbmVyCisgICAgZXh0ZW5kcyBBZ2dyZWdhdGVMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIFNRTCBmb3IgdGhpcyBhZ2dyZWdhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBTUUwgYnVmZmVyIHRvIGFwcGVuZCB0bworICAgICAqIEBwYXJhbSBhcmdzIHRoZSB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBnaXZlbiBpbiB0aGUgZmlsdGVyLCBvcgorICAgICAqIG51bGwgaWYgdGhpcyBsaXN0ZW5lciBkb2Vzbid0IGV4cGVjdCBhcmd1bWVudHMKKyAgICAgKiBAcGFyYW0gbWFwcGluZyB0aGUgY2xhc3MgbWFwcGluZyBmb3IgdGhlIHF1ZXJ5J3MgY2FuZGlkYXRlIGNsYXNzCisgICAgICogQHBhcmFtIHN0b3JlIHRoZSBzdG9yZSB0aGF0IG93bnMgdGhlIHF1ZXJ5CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWVbXSBhcmdzLAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZywgSkRCQ1N0b3JlIHN0b3JlKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ0V4cHJlc3Npb25GYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNFeHByZXNzaW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzJlZDcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNFeHByZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuQWdncmVnYXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFyZ3VtZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkZpbHRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5MaXRlcmFsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlN1YnF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBFeHByZXNzaW9uIGZhY3RvcnkgaW1wbGVtZW50YXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHF1ZXJpZXMKKyAqIHZpYSBTUUwuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEpEQkNFeHByZXNzaW9uRmFjdG9yeQorICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmFsIE5VTEwgPSBuZXcgTnVsbCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbCBDVVJSRU5UX0RBVEUgPSBuZXcgQ3VycmVudERhdGUoSmF2YVNRTFR5cGVzLkRBVEUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbCBDVVJSRU5UX1RJTUUgPSBuZXcgQ3VycmVudERhdGUoSmF2YVNRTFR5cGVzLlRJTUUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbCBDVVJSRU5UX1RJTUVTVEFNUCA9CisgICAgICAgIG5ldyBDdXJyZW50RGF0ZShKYXZhU1FMVHlwZXMuVElNRVNUQU1QKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEpEQkNFeHByZXNzaW9uRmFjdG9yeS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWFwcGluZyBfdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdENvbnN0cnVjdG9yIF9jb25zID0gbmV3IFNlbGVjdENvbnN0cnVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHRoZSB0eXBlIHdlJ3JlIHF1ZXJ5aW5nIGFnYWluc3QuCisgICAgICovCisgICAgcHVibGljIEpEQkNFeHByZXNzaW9uRmFjdG9yeShDbGFzc01hcHBpbmcgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRvIGNyZWF0ZSBTUUwgc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RDb25zdHJ1Y3RvciBnZXRTZWxlY3RDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgcmV0dXJuIF9jb25zOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVtcHR5RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24oVmFsdWUgdikgeworICAgICAgICByZXR1cm4gZXF1YWwodiwgbmV3TGl0ZXJhbChCb29sZWFuLlRSVUUsIExpdGVyYWwuVFlQRV9CT09MRUFOKSk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZXF1YWwoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIC8vIGlmIHdlJ3JlIGNvbXBhcmluZyBhbiB1bmFjY2Vzc2VkIGJvdW5kIHZhcmlhYmxlLCBsaWtlIGluOgorICAgICAgICAvLyBjb2xsLmNvbnRhaW5zICh2YXIpICYmIHZhciA9PSB4LCB0aGVuIHRyYW5zbGF0ZSBpbnRvOgorICAgICAgICAvLyBjb2xsLmNvbnRhaW5zICh4KQorICAgICAgICBpZiAodjEgaW5zdGFuY2VvZiBQQ1BhdGggJiYgKChQQ1BhdGgpIHYxKS5pc1VuYWNjZXNzZWRWYXJpYWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHYxLCB2Mik7CisgICAgICAgIGlmICh2MiBpbnN0YW5jZW9mIFBDUGF0aCAmJiAoKFBDUGF0aCkgdjIpLmlzVW5hY2Nlc3NlZFZhcmlhYmxlKCkpCisgICAgICAgICAgICByZXR1cm4gY29udGFpbnModjIsIHYxKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFcXVhbEV4cHJlc3Npb24oKFZhbCkgdjEsIChWYWwpIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBub3RFcXVhbChWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb3RFcXVhbEV4cHJlc3Npb24oKFZhbCkgdjEsIChWYWwpIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBsZXNzVGhhbihWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJlRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIsCisgICAgICAgICAgICBDb21wYXJlRXhwcmVzc2lvbi5MRVNTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBncmVhdGVyVGhhbihWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJlRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIsCisgICAgICAgICAgICBDb21wYXJlRXhwcmVzc2lvbi5HUkVBVEVSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBsZXNzVGhhbkVxdWFsKFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IENvbXBhcmVFeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2MiwKKyAgICAgICAgICAgIENvbXBhcmVFeHByZXNzaW9uLkxFU1NfRVFVQUwpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdyZWF0ZXJUaGFuRXF1YWwoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcGFyZUV4cHJlc3Npb24oKFZhbCkgdjEsIChWYWwpIHYyLAorICAgICAgICAgICAgQ29tcGFyZUV4cHJlc3Npb24uR1JFQVRFUl9FUVVBTCk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gaXNFbXB0eShWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJc0VtcHR5RXhwcmVzc2lvbigoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGlzTm90RW1wdHkoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgSXNOb3RFbXB0eUV4cHJlc3Npb24oKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBjb250YWlucyhWYWx1ZSBtYXAsIFZhbHVlIGFyZykgeworICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgQ29uc3QpCisgICAgICAgICAgICByZXR1cm4gbmV3IEluRXhwcmVzc2lvbigoVmFsKSBhcmcsIChDb25zdCkgbWFwKTsKKyAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIFN1YlEpCisgICAgICAgICAgICByZXR1cm4gbmV3IEluU3ViUUV4cHJlc3Npb24oKFZhbCkgYXJnLCAoU3ViUSkgbWFwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb250YWluc0V4cHJlc3Npb24oKFZhbCkgbWFwLCAoVmFsKSBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGNvbnRhaW5zS2V5KFZhbHVlIG1hcCwgVmFsdWUgYXJnKSB7CisgICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBDb25zdCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5LZXlFeHByZXNzaW9uKChWYWwpIGFyZywgKENvbnN0KSBtYXApOworICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5zS2V5RXhwcmVzc2lvbigoVmFsKSBtYXAsIChWYWwpIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gY29udGFpbnNWYWx1ZShWYWx1ZSBtYXAsIFZhbHVlIGFyZykgeworICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgQ29uc3QpCisgICAgICAgICAgICByZXR1cm4gbmV3IEluVmFsdWVFeHByZXNzaW9uKChWYWwpIGFyZywgKENvbnN0KSBtYXApOworICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5zRXhwcmVzc2lvbigoVmFsKSBtYXAsIChWYWwpIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gaXNJbnN0YW5jZShWYWx1ZSB2YWwsIENsYXNzIGMpIHsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIENvbnN0KQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdEluc3RhbmNlb2ZFeHByZXNzaW9uKChDb25zdCkgdmFsLCBjKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZW9mRXhwcmVzc2lvbigoUENQYXRoKSB2YWwsIGMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGFuZChFeHByZXNzaW9uIGV4cDEsIEV4cHJlc3Npb24gZXhwMikgeworICAgICAgICBpZiAoZXhwMSBpbnN0YW5jZW9mIEJpbmRWYXJpYWJsZUV4cHJlc3Npb24pCisgICAgICAgICAgICByZXR1cm4gbmV3IEJpbmRWYXJpYWJsZUFuZEV4cHJlc3Npb24oKEJpbmRWYXJpYWJsZUV4cHJlc3Npb24pIGV4cDEsCisgICAgICAgICAgICAgICAgKEV4cCkgZXhwMik7CisgICAgICAgIGlmIChleHAyIGluc3RhbmNlb2YgQmluZFZhcmlhYmxlRXhwcmVzc2lvbikKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmluZFZhcmlhYmxlQW5kRXhwcmVzc2lvbigoQmluZFZhcmlhYmxlRXhwcmVzc2lvbikgZXhwMiwKKyAgICAgICAgICAgICAgICAoRXhwKSBleHAxKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBbmRFeHByZXNzaW9uKChFeHApIGV4cDEsIChFeHApIGV4cDIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIG9yKEV4cHJlc3Npb24gZXhwMSwgRXhwcmVzc2lvbiBleHAyKSB7CisgICAgICAgIHJldHVybiBuZXcgT3JFeHByZXNzaW9uKChFeHApIGV4cDEsIChFeHApIGV4cDIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIG5vdChFeHByZXNzaW9uIGV4cCkgeworICAgICAgICBpZiAoSGFzQ29udGFpbnNFeHByZXNzaW9uVmlzaXRvci5oYXNDb250YWlucyhleHApKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBOb3RDb250YWluc0V4cHJlc3Npb24oKEV4cCkgZXhwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBOb3RFeHByZXNzaW9uKChFeHApIGV4cCk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gYmluZFZhcmlhYmxlKFZhbHVlIHZhciwgVmFsdWUgdmFsKSB7CisgICAgICAgIC8vIGhhbmRsZSB0aGUgc3RyYW5nZSBjYXNlIG9mIHVzaW5nIGEgY29uc3RhbnQgcGF0aCB0byBiaW5kIGEKKyAgICAgICAgLy8gdmFyaWFibGU7IGluIHRoZXNlIGNhc2VzIHRoZSB2YXJpYWJsZSBhY3RzIGxpa2UgYW4gdW5ib3VuZAorICAgICAgICAvLyB2YXJpYWJsZSB0aGF0IHdlIGxpbWl0IGJ5IHVzaW5nIGFuIElOIGNsYXVzZSBvbiB0aGUgY29uc3RhbnQKKyAgICAgICAgLy8gdmFsdWUgY29sbGVjdGlvbgorICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQ29uc3QpIHsKKyAgICAgICAgICAgIFBDUGF0aCBwYXRoID0gbmV3IFBDUGF0aChfdHlwZSwgKFZhcmlhYmxlKSB2YXIpOworICAgICAgICAgICAgcGF0aC5zZXRNZXRhRGF0YSh2YXIuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEluRXhwcmVzc2lvbihwYXRoLCAoQ29uc3QpIHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCaW5kVmFyaWFibGVFeHByZXNzaW9uKChWYXJpYWJsZSkgdmFyLCAoUENQYXRoKSB2YWwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBiaW5kS2V5VmFyaWFibGUoVmFsdWUgdmFyLCBWYWx1ZSB2YWwpIHsKKyAgICAgICAgLy8gaGFuZGxlIHRoZSBzdHJhbmdlIGNhc2Ugb2YgdXNpbmcgYSBjb25zdGFudCBwYXRoIHRvIGJpbmQgYQorICAgICAgICAvLyB2YXJpYWJsZTsgaW4gdGhlc2UgY2FzZXMgdGhlIHZhcmlhYmxlIGFjdHMgbGlrZSBhbiB1bmJvdW5kCisgICAgICAgIC8vIHZhcmlhYmxlIHRoYXQgd2UgbGltaXQgYnkgdXNpbmcgYW4gSU4gY2xhdXNlIG9uIHRoZSBjb25zdGFudAorICAgICAgICAvLyB2YWx1ZSBjb2xsZWN0aW9uCisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBDb25zdCkgeworICAgICAgICAgICAgUENQYXRoIHBhdGggPSBuZXcgUENQYXRoKF90eXBlLCAoVmFyaWFibGUpIHZhcik7CisgICAgICAgICAgICBwYXRoLnNldE1ldGFEYXRhKHZhci5nZXRNZXRhRGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5LZXlFeHByZXNzaW9uKHBhdGgsIChDb25zdCkgdmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEJpbmRWYXJpYWJsZUV4cHJlc3Npb24oKFZhcmlhYmxlKSB2YXIsIChQQ1BhdGgpIHZhbCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gYmluZFZhbHVlVmFyaWFibGUoVmFsdWUgdmFyLCBWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRWYXJpYWJsZSh2YXIsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gc3RhcnRzV2l0aChWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGFydHNXaXRoRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVuZHNXaXRoKFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IEVuZHNXaXRoRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIG5vdE1hdGNoZXMoVmFsdWUgdjEsIFZhbHVlIHYyLAorICAgICAgICBTdHJpbmcgc2luZ2xlLCBTdHJpbmcgbXVsdGksIFN0cmluZyBlc2MpIHsKKyAgICAgICAgcmV0dXJuIG5vdChtYXRjaGVzKHYxLCB2Miwgc2luZ2xlLCBtdWx0aSwgZXNjKSk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gbWF0Y2hlcyhWYWx1ZSB2MSwgVmFsdWUgdjIsCisgICAgICAgIFN0cmluZyBzaW5nbGUsIFN0cmluZyBtdWx0aSwgU3RyaW5nIGVzYykgeworICAgICAgICBpZiAoISh2MiBpbnN0YW5jZW9mIENvbnN0KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb25zdC1vbmx5IiwgIm1hdGNoZXMiKSk7CisgICAgICAgIHJldHVybiBuZXcgTWF0Y2hlc0V4cHJlc3Npb24oKFZhbCkgdjEsIChDb25zdCkgdjIsIHNpbmdsZSwgbXVsdGksCisgICAgICAgICAgICBlc2MgIT0gbnVsbCA/IGVzYyA6IF90eXBlLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuCisgICAgICAgICAgICAgICAgZ2V0REJEaWN0aW9uYXJ5KCkuc2VhcmNoU3RyaW5nRXNjYXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3VicXVlcnkgbmV3U3VicXVlcnkoQ2xhc3NNZXRhRGF0YSBjYW5kaWRhdGUsIGJvb2xlYW4gc3VicywKKyAgICAgICAgU3RyaW5nIGFsaWFzKSB7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX3R5cGUuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGRpY3Quc3VwcG9ydHNTdWJzZWxlY3QsICJTdXBwb3J0c1N1YnNlbGVjdCIpOworICAgICAgICByZXR1cm4gbmV3IFN1YlEoKENsYXNzTWFwcGluZykgY2FuZGlkYXRlLCBzdWJzLCBhbGlhcyk7CisgICAgfQorCisgICAgcHVibGljIFBhdGggbmV3UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQQ1BhdGgoX3R5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBQYXRoIG5ld1BhdGgoVmFsdWUgdmFsKSB7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBDb25zdCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RQYXRoKChDb25zdCkgdmFsKTsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN1YlEpCisgICAgICAgICAgICByZXR1cm4gbmV3IFBDUGF0aCgoU3ViUSkgdmFsKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQQ1BhdGgoX3R5cGUsIChWYXJpYWJsZSkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGl0ZXJhbCBuZXdMaXRlcmFsKE9iamVjdCB2YWwsIGludCBwdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IExpdCh2YWwsIHB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZ2V0VGhpcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQQ1BhdGgoX3R5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBnZXROdWxsKCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZ2V0Q3VycmVudERhdGUoKSB7CisgICAgICAgIHJldHVybiBDVVJSRU5UX0RBVEU7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGdldEN1cnJlbnRUaW1lKCkgeworICAgICAgICByZXR1cm4gQ1VSUkVOVF9USU1FOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBnZXRDdXJyZW50VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gQ1VSUkVOVF9USU1FU1RBTVA7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlciBuZXdQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJhbShuYW1lLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbmV3RXh0ZW5zaW9uKEZpbHRlckxpc3RlbmVyIGxpc3RlbmVyLCBWYWx1ZSB0YXJnZXQsCisgICAgICAgIFZhbHVlIGFyZykgeworICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbigoSkRCQ0ZpbHRlckxpc3RlbmVyKSBsaXN0ZW5lciwKKyAgICAgICAgICAgIChWYWwpIHRhcmdldCwgKFZhbCkgYXJnLCBfdHlwZSk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIG5ld0FnZ3JlZ2F0ZShBZ2dyZWdhdGVMaXN0ZW5lciBsaXN0ZW5lciwgVmFsdWUgYXJnKSB7CisgICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlKChKREJDQWdncmVnYXRlTGlzdGVuZXIpIGxpc3RlbmVyLAorICAgICAgICAgICAgKFZhbCkgYXJnLCBfdHlwZSk7CisgICAgfQorCisgICAgcHVibGljIEFyZ3VtZW50cyBuZXdBcmd1bWVudExpc3QoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJncygoVmFsKSB2MSwgKFZhbCkgdjIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBuZXdVbmJvdW5kVmFyaWFibGUoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZShuYW1lLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbmV3Qm91bmRWYXJpYWJsZShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3VW5ib3VuZFZhcmlhYmxlKG5hbWUsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBjYXN0KFZhbHVlIHZhbCwgQ2xhc3MgY2xzKSB7CisgICAgICAgIHZhbC5zZXRJbXBsaWNpdFR5cGUoY2xzKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgYWRkKFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IE1hdGgoKFZhbCkgdjEsIChWYWwpIHYyLCBNYXRoLkFERCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHN1YnRyYWN0KFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IE1hdGgoKFZhbCkgdjEsIChWYWwpIHYyLCBNYXRoLlNVQlRSQUNUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbXVsdGlwbHkoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgTWF0aCgoVmFsKSB2MSwgKFZhbCkgdjIsIE1hdGguTVVMVElQTFkpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBkaXZpZGUoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgTWF0aCgoVmFsKSB2MSwgKFZhbCkgdjIsIE1hdGguRElWSURFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbW9kKFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IE1hdGgoKFZhbCkgdjEsIChWYWwpIHYyLCBNYXRoLk1PRCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGFicyhWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnMoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgaW5kZXhPZihWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmRleE9mKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGNvbmNhdChWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25jYXQoKFZhbCkgdjEsIChWYWwpIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgc3RyaW5nTGVuZ3RoKFZhbHVlIHN0cikgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0xlbmd0aCgoVmFsKSBzdHIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSB0cmltKFZhbHVlIHN0ciwgVmFsdWUgdHJpbUNoYXIsIEJvb2xlYW4gd2hlcmUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmltKChWYWwpIHN0ciwgKFZhbCkgdHJpbUNoYXIsIHdoZXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgc3FydChWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTcXJ0KChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHN1YnN0cmluZyhWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJzdHJpbmcoKFZhbCkgdjEsIChWYWwpIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgdG9VcHBlckNhc2UoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9VcHBlckNhc2UoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgdG9Mb3dlckNhc2UoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9Mb3dlckNhc2UoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgYXZnKFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IEF2ZygoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBjb3VudChWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb3VudCgoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBkaXN0aW5jdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXN0aW5jdCgoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBtYXgoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgTWF4KChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIG1pbihWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNaW4oKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgc3VtKFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IFN1bSgoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBhbnkoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgQW55KChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGFsbChWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbGwoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgc2l6ZShWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaXplKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGdldE9iamVjdElkKFZhbHVlIHZhbCkgeworICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQ29uc3QpCisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnN0R2V0T2JqZWN0SWQoKENvbnN0KSB2YWwpOworICAgICAgICByZXR1cm4gbmV3IEdldE9iamVjdElkKChQQ1BhdGgpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGdldE1hcFZhbHVlKFZhbHVlIG1hcCwgVmFsdWUgYXJnKSB7CisgICAgICAgIHJldHVybiBuZXcgR2V0TWFwVmFsdWUoKFZhbCkgbWFwLCAoVmFsKSBhcmcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ0ZpbHRlckxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNGaWx0ZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjFlOWYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNGaWx0ZXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkZpbHRlckxpc3RlbmVyOworCisvKioKKyAqIEpEQkMgZXh0ZW5zaW9uIHRvIHRoZSB7QGxpbmsgRmlsdGVyTGlzdGVuZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSkRCQ0ZpbHRlckxpc3RlbmVyCisgICAgZXh0ZW5kcyBGaWx0ZXJMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIFNRTCBmb3IgdGhpcyBleHByZXNzaW9uIG9yIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiB0aGUgU1FMIGJ1ZmZlciB0byBhcHBlbmQgdG8KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgdG8gYWN0IG9uLCBvciBudWxsIGlmIHRoZSBsaXN0ZW5lcgorICAgICAqIGRvZXNuJ3QgZXhwZWN0IGEgdGFyZ2V0CisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHZhbHVlcyBvZiB0aGUgYXJndW1lbnRzIGdpdmVuIGluIHRoZSBmaWx0ZXIsIG9yCisgICAgICogbnVsbCBpZiB0aGlzIGxpc3RlbmVyIGRvZXNuJ3QgZXhwZWN0IGFyZ3VtZW50cworICAgICAqIEBwYXJhbSBtYXBwaW5nIHRoZSBjbGFzcyBtYXBwaW5nIGZvciB0aGUgcXVlcnkncyBjYW5kaWRhdGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIHN0b3JlIHRoYXQgb3ducyB0aGUgcXVlcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTUUxCdWZmZXIgYnVmLCBGaWx0ZXJWYWx1ZSB0YXJnZXQsIEZpbHRlclZhbHVlW10gYXJncywKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNQYXRoLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYWVmMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ1BhdGguamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlBhdGg7CisKKy8qKgorICogQSBwYXRoIHJlcHJlc2VudHMgYSB0cmF2ZXJzYWwgaW50byBmaWVsZHMgb2YgYSBjYW5kaWRhdGUgb2JqZWN0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2ludGVyZmFjZSBKREJDUGF0aAorICAgIGV4dGVuZHMgUGF0aCwgVmFsIHsKKworICAgIHB1YmxpYyB2b2lkIGdldEtleSgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9KREJDU3RyaW5nQ29udGFpbnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ1N0cmluZ0NvbnRhaW5zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5MGYwYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ1N0cmluZ0NvbnRhaW5zLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuU3RyaW5nQ29udGFpbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIGlmIHRoZSB0YXJnZXQgY29udGFpbnMgdGhlIGdpdmVuIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgbXVzdCBiZQorICogYSBjb25zdGFudC4KKyAqICBFeGFtcGxlczo8YnIgLz4KKyAqIDxjb2RlPiJhZGRyZXNzLnN0cmVldC5leHQ6c3RyaW5nQ29udGFpbnMgKFwibWFpblwiKSI8L2NvZGU+CisgKgorICogQG5vamF2YWRvYworICogQGRlcHJlY2F0ZWQgVXNlIDxjb2RlPm1hdGNoZXMoKTwvY29kZT4gaW5zdGVhZC4KKyAqLworcHVibGljIGNsYXNzIEpEQkNTdHJpbmdDb250YWlucworICAgIGV4dGVuZHMgU3RyaW5nQ29udGFpbnMKKyAgICBpbXBsZW1lbnRzIEpEQkNGaWx0ZXJMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChKREJDU3RyaW5nQ29udGFpbnMuY2xhc3MpOworCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgdGFyZ2V0LCBGaWx0ZXJWYWx1ZVtdIGFyZ3MsCisgICAgICAgIENsYXNzTWFwcGluZyB0eXBlLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgaWYgKCFhcmdzWzBdLmlzQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb25zdC1vbmx5IiwgVEFHKSk7CisKKyAgICAgICAgT2JqZWN0IHZhbCA9IGFyZ3NbMF0uZ2V0VmFsdWUoKTsKKyAgICAgICAgdGFyZ2V0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBJUyAiKS5hcHBlbmRWYWx1ZShudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIExJS0UgIikuYXBwZW5kVmFsdWUoIiUiICsgdmFsICsgIiUiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNXaWxkY2FyZE1hdGNoLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNXaWxkY2FyZE1hdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjYWExNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ1dpbGRjYXJkTWF0Y2guamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5XaWxkY2FyZE1hdGNoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0cyBpZiB0aGUgdGFyZ2V0IG1hdGNoZXMgdGhlIHdpbGRjYXJkIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlCisgKiBhcmd1bWVudC4gVGhlIHdpbGRjYXJkICc/JyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbnkgc2luZ2xlIGNoYXJhY3RlciwKKyAqIHdoaWxlICcqJyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbnkgc2VyaWVzIG9mIDAgb3IgbW9yZSBjaGFyYWN0ZXJzLgorICogIEV4YW1wbGVzOjxiciAvPgorICogPGNvZGU+ImFkZHJlc3Muc3RyZWV0LmV4dDp3aWxkY2FyZE1hdGNoIChcIj9haW4qcmVldFwiKSI8L2NvZGU+CisgKgorICogQG5vamF2YWRvYworICogQGRlcHJlY2F0ZWQgVXNlIDxjb2RlPm1hdGNoZXMoKTwvY29kZT4gaW5zdGVhZC4KKyAqLworcHVibGljIGNsYXNzIEpEQkNXaWxkY2FyZE1hdGNoCisgICAgZXh0ZW5kcyBXaWxkY2FyZE1hdGNoCisgICAgaW1wbGVtZW50cyBKREJDRmlsdGVyTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoSkRCQ1dpbGRjYXJkTWF0Y2guY2xhc3MpOworCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIHNxbCwgRmlsdGVyVmFsdWUgdGFyZ2V0LCBGaWx0ZXJWYWx1ZVtdIGFyZ3MsCisgICAgICAgIENsYXNzTWFwcGluZyB0eXBlLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgaWYgKCFhcmdzWzBdLmlzQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb25zdC1vbmx5IiwgVEFHKSk7CisKKyAgICAgICAgT2JqZWN0IHZhbCA9IGFyZ3NbMF0uZ2V0VmFsdWUoKTsKKyAgICAgICAgdGFyZ2V0LmFwcGVuZFRvKHNxbCk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBJUyAiKS5hcHBlbmRWYWx1ZShudWxsKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSBEQiB3aWxkY2FyZCBzdHJpbmcgYnkgcmVwbGFjaW5nICcqJyB3aXRoICclJyBhbmQKKyAgICAgICAgICAgIC8vICc/JyB3aXRoICdfJworICAgICAgICAgICAgU3RyaW5nIHdpbGQgPSB2YWwudG9TdHJpbmcoKS5yZXBsYWNlKCcqJywgJyUnKS5yZXBsYWNlKCc/JywgJ18nKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBMSUtFICIpLmFwcGVuZFZhbHVlKHdpbGQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9MaXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkZTY0MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTGl0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5MaXRlcmFsOworCisvKioKKyAqIEEgbGl0ZXJhbCB2YWx1ZSBpbiBhIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBMaXQKKyAgICBleHRlbmRzIENvbnN0CisgICAgaW1wbGVtZW50cyBMaXRlcmFsIHsKKworICAgIHByaXZhdGUgT2JqZWN0IF92YWw7CisgICAgcHJpdmF0ZSBpbnQgX3B0eXBlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBsaXRlcmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBMaXQoT2JqZWN0IHZhbCwgaW50IHB0eXBlKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgICAgIF9wdHlwZSA9IHB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKF92YWwgPT0gbnVsbCkgPyBPYmplY3QuY2xhc3MgOiBfdmFsLmdldENsYXNzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX3ZhbCA9IEZpbHRlcnMuY29udmVydChfdmFsLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcnNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeyAKKyAgICAgICAgcmV0dXJuIF92YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbCkgeworICAgICAgICBfdmFsID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaXRFeHBTdGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cHJlc3Npb24gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGl0RXhwU3RhdGUKKyAgICAgICAgZXh0ZW5kcyBDb25zdEV4cFN0YXRlIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IHNxbFZhbHVlOworICAgICAgICBwdWJsaWMgaW50IG90aGVyTGVuZ3RoOyAKKyAgICB9IAorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIHN1cGVyLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgb3RoZXIsIG90aGVyU3RhdGUpOworICAgICAgICBMaXRFeHBTdGF0ZSBsc3RhdGUgPSAoTGl0RXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbHN0YXRlLnNxbFZhbHVlID0gb3RoZXIudG9EYXRhU3RvcmVWYWx1ZShzZWwsIGN0eCwgb3RoZXJTdGF0ZSxfdmFsKTsKKyAgICAgICAgICAgIGxzdGF0ZS5vdGhlckxlbmd0aCA9IG90aGVyLmxlbmd0aChzZWwsIGN0eCwgb3RoZXJTdGF0ZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbHN0YXRlLnNxbFZhbHVlID0gX3ZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgTGl0RXhwU3RhdGUgbHN0YXRlID0gKExpdEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKGxzdGF0ZS5vdGhlckxlbmd0aCA+IDEpCisgICAgICAgICAgICBzcWwuYXBwZW5kVmFsdWUoKChPYmplY3RbXSkgbHN0YXRlLnNxbFZhbHVlKVtpbmRleF0sIAorICAgICAgICAgICAgICAgIGxzdGF0ZS5nZXRDb2x1bW4oaW5kZXgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3FsLmFwcGVuZFZhbHVlKGxzdGF0ZS5zcWxWYWx1ZSwgbHN0YXRlLmdldENvbHVtbihpbmRleCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTWF0Y2hlc0V4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTWF0Y2hlc0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdjYzYwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9NYXRjaGVzRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBUZXN0IGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWdleHAuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTWF0Y2hlc0V4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworICAgIHByaXZhdGUgZmluYWwgQ29uc3QgX2NvbnN0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9zaW5nbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX211bHRpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9lc2NhcGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWF0Y2hlc0V4cHJlc3Npb24oVmFsIHZhbCwgQ29uc3QgY29uLAorICAgICAgICBTdHJpbmcgc2luZ2xlLCBTdHJpbmcgbXVsdGksIFN0cmluZyBlc2NhcGUpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX2NvbnN0ID0gY29uOworICAgICAgICBfc2luZ2xlID0gc2luZ2xlOworICAgICAgICBfbXVsdGkgPSBtdWx0aTsKKyAgICAgICAgX2VzY2FwZSA9IGVzY2FwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIEV4cFN0YXRlIHMxID0gX3ZhbC5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgRXhwU3RhdGUgczIgPSBfY29uc3QuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BFeHBTdGF0ZShzZWwuYW5kKHMxLmpvaW5zLCBzMi5qb2lucyksIHMxLCBzMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgX2NvbnN0LCBic3RhdGUuc3RhdGUyKTsKKyAgICAgICAgX2NvbnN0LmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBfdmFsLCBic3RhdGUuc3RhdGUxKTsKKworICAgICAgICBDb2x1bW4gY29sID0gbnVsbDsKKyAgICAgICAgaWYgKF92YWwgaW5zdGFuY2VvZiBQQ1BhdGgpIHsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSAoKFBDUGF0aCkgX3ZhbCkuZ2V0Q29sdW1ucyhic3RhdGUuc3RhdGUxKTsKKyAgICAgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIGNvbCA9IGNvbHNbMF07CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbyA9IF9jb25zdC5nZXRWYWx1ZShjdHgsIGJzdGF0ZS5zdGF0ZTIpOworICAgICAgICBpZiAobyA9PSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiMSA8PiAxIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gbG9vayBmb3IgaWdub3JlIGNhc2UgZmxhZyBhbmQgc3RyaXAgaXQgb3V0IGlmIHByZXNlbnQKKyAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlQ2FzZSA9IGZhbHNlOworICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG8udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiKD9pKSIpOworICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlnbm9yZUNhc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChpZHggKyA0IDwgc3RyLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGlkeCkgKyBzdHIuc3Vic3RyaW5nKGlkeCArIDQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBpZHgpOworICAgICAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhcHBlbmQgdGFyZ2V0CisgICAgICAgICAgICBpZiAoaWdub3JlQ2FzZSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJMT1dFUigiKTsKKyAgICAgICAgICAgIF92YWwuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIGJ1ZiwgMCk7CisgICAgICAgICAgICBpZiAoaWdub3JlQ2FzZSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIERCIHdpbGRjYXJkIHN0cmluZyBieSByZXBsYWNpbmcgdGhlCisgICAgICAgICAgICAvLyBtdWx0aSB0b2tlbiAoZS5nLiwgJy4qJykgYW5kIHRoZSBzaW5nbGUgdG9rZW4gKGUuZy4sICIuIikKKyAgICAgICAgICAgIC8vIHdpdGggJyUnIGFuZCAnLicgd2l0aCAnXycKKyAgICAgICAgICAgIHN0ciA9IHJlcGxhY2VFc2NhcGUoc3RyLCBfbXVsdGksICIlIiwgX2VzY2FwZSk7CisgICAgICAgICAgICBzdHIgPSByZXBsYWNlRXNjYXBlKHN0ciwgX3NpbmdsZSwgIl8iLCBfZXNjYXBlKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBMSUtFICIpLmFwcGVuZFZhbHVlKHN0ciwgY29sKTsKKworICAgICAgICAgICAgLy8gZXNjYXBlIG91dCBjaGFyYWN0ZXJzIGJ5IHVzaW5nIHRoZSBkYXRhYmFzZSdzIGVzY2FwZSBzZXF1ZW5jZQorICAgICAgICAgICAgaWYgKF9lc2NhcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgRVNDQVBFICciKS5hcHBlbmQoX2VzY2FwZSkuYXBwZW5kKCInIik7CisgICAgICAgIH0KKyAgICAgICAgc2VsLmFwcGVuZChidWYsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogUGVyZm9ybSBhIHN0cmluZyByZXBsYWNlbWVudCB3aXRoIHNpbXBsaXN0aWMgZXNjYXBlIGhhbmRpbmcuIAorICAgICAqICAKKyAgICAgKiBAcGFyYW0gIHN0ciAgICAgIHRoZSBzb3VyY2Ugc3RyaW5nCisgICAgICogQHBhcmFtICBmcm9tICAgICB0aGUgc3RyaW5nIHRvIGZpbmQKKyAgICAgKiBAcGFyYW0gIHRvICAgICAgIHRoZSBzdHJpbmcgdG8gcmVwbGFjZQorICAgICAqIEBwYXJhbSAgZXNjYXBlICAgdGhlIHN0cmluZyB0byB1c2UgdG8gZXNjYXBlIHJlcGxhY2VtZW50CisgICAgICogQHJldHVybiAgICAgICAgICB0aGUgcmVwbGFjZWQgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VFc2NhcGUoU3RyaW5nIHN0ciwgU3RyaW5nIGZyb20sIFN0cmluZyB0bywKKyAgICAgICAgU3RyaW5nIGVzY2FwZSkgeworICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IFN0cmluZ3Muc3BsaXQoc3RyLCBmcm9tLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcmV2aW91cyBwYXJ0IGVuZGVkIHdpdGggYW4gZXNjYXBlIGNoYXJhY3RlciwgdGhlbgorICAgICAgICAgICAgICAgIC8vIGVzY2FwZSB0aGUgY2hhcmFjdGVyIGFuZCByZW1vdmUgdGhlIHByZXZpb3VzIGVzY2FwZTsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgZG91YmxlLWVzY2FwaW5nIG9yIG90aGVyIG1vcmUKKyAgICAgICAgICAgICAgICAvLyBzb3BoaXN0aWNhdGVkIGZlYXR1cmVzCisgICAgICAgICAgICAgICAgaWYgKCFmcm9tLmVxdWFscyh0bykgJiYgcGFydHNbaSAtIDFdLmVuZHNXaXRoKGVzY2FwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwYnVmLnNldExlbmd0aChyZXBidWYubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwYnVmLmFwcGVuZChmcm9tKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVwYnVmLmFwcGVuZCh0byk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBidWYuYXBwZW5kKHBhcnRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCB0cnVlKTsKKyAgICAgICAgX2NvbnN0LnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX2NvbnN0LmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9NYXRoLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL01hdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZiYTVhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9NYXRoLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CisKKy8qKgorICogVmFsdWUgcHJvZHVjZWQgYnkgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTWF0aAorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gIisiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlRSQUNUID0gIi0iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUExZID0gIioiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJVklERSA9ICIvIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0QgPSAiTU9EIjsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwxOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9vcDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX2Nhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlcyB0byBvcGVyYXRlIG9uLCBhbmQgdGhlIG9wZXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNYXRoKFZhbCB2YWwxLCBWYWwgdmFsMiwgU3RyaW5nIG9wKSB7CisgICAgICAgIF92YWwxID0gdmFsMTsKKyAgICAgICAgX3ZhbDIgPSB2YWwyOworICAgICAgICBfb3AgPSBvcDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfY2FzdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9jYXN0OworICAgICAgICBDbGFzcyBjMSA9IF92YWwxLmdldFR5cGUoKTsKKyAgICAgICAgQ2xhc3MgYzIgPSBfdmFsMi5nZXRUeXBlKCk7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLnByb21vdGUoYzEsIGMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfY2FzdCA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICBFeHBTdGF0ZSBzMSA9IF92YWwxLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICBFeHBTdGF0ZSBzMiA9IF92YWwyLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wRXhwU3RhdGUoc2VsLmFuZChzMS5qb2lucywgczIuam9pbnMpLCBzMSwgczIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBzZWwuc2VsZWN0KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsMS5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCB0cnVlKTsKKyAgICAgICAgX3ZhbDIuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc2VsLmdyb3VwQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9yZGVyQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgc2VsLm9yZGVyQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIGFzYywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgU1FMQnVmZmVyIG5ld1NRTEJ1ZmZlcihTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IG5ldyBTUUxCdWZmZXIoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIDApOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRmlsdGVycy5jb252ZXJ0KHJlcy5nZXRPYmplY3QodGhpcywgSmF2YVNRTFR5cGVzLkpEQkNfREVGQVVMVCwgCisgICAgICAgICAgICBudWxsKSwgZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBic3RhdGUgPSAoQmluYXJ5T3BFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIF92YWwxLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBfdmFsMiwgYnN0YXRlLnN0YXRlMik7CisgICAgICAgIF92YWwyLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBfdmFsMSwgYnN0YXRlLnN0YXRlMSk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpLm1hdGhGdW5jdGlvbihzcWwsIF9vcCwKKyAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwxKSwKKyAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIF92YWwyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsMS5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX3ZhbDIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTWF4LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL01heC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzZlMmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL01heC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKKy8qKgorICogTWF4aW11bS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBNYXgKKyAgICBleHRlbmRzIFVuYXJ5T3AgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIE1heChWYWwgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuICJNQVgiOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWdncmVnYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTWluLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL01pbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTE3MWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL01pbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKKy8qKgorICogTWluaW11bS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBNaW4KKyAgICBleHRlbmRzIFVuYXJ5T3AgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIE1pbihWYWwgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuICJNSU4iOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWdncmVnYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTm90Q29udGFpbnNFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL05vdENvbnRhaW5zRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTIxMDMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL05vdENvbnRhaW5zRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworCisvKioKKyAqIE5lZ2F0ZXMgYSBjb250YWlucyBleHByZXNzaW9uIHVzaW5nIGEgc3Vic2VsZWN0IHRvIG1ha2Ugc3VyZSBubworICogZWxlbWVudHMgbWVldCB0aGUgY3JpdGVyaWEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTm90Q29udGFpbnNFeHByZXNzaW9uCisgICAgaW1wbGVtZW50cyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBFeHAgX2V4cDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdGhlIGV4cHJlc3Npb24gdG8gbmVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBOb3RDb250YWluc0V4cHJlc3Npb24oRXhwIGV4cCkgeworICAgICAgICBfZXhwID0gZXhwOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb3RDb250YWluc0V4cFN0YXRlKGNvbnRhaW5zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vdENvbnRhaW5zRXhwU3RhdGUKKyAgICAgICAgZXh0ZW5kcyBFeHBTdGF0ZSB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZmluYWwgTWFwIGNvbnRhaW5zOworCisgICAgICAgIHB1YmxpYyBOb3RDb250YWluc0V4cFN0YXRlKE1hcCBjb250YWlucykgeworICAgICAgICAgICAgdGhpcy5jb250YWlucyA9IGNvbnRhaW5zOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGRpY3Quc3VwcG9ydHNTdWJzZWxlY3QsICJTdXBwb3J0c1N1YnNlbGVjdCIpOworCisgICAgICAgIFNlbGVjdCBzdWIgPSBjdHguc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1NlbGVjdCgpOworICAgICAgICBzdWIuc2V0UGFyZW50KHNlbCwgbnVsbCk7CisgICAgICAgIEV4cFN0YXRlIGVzdGF0ZSA9IF9leHAuaW5pdGlhbGl6ZShzdWIsIGN0eCwgKChOb3RDb250YWluc0V4cFN0YXRlKSAKKyAgICAgICAgICAgIHN0YXRlKS5jb250YWlucyk7CisgICAgICAgIHN1Yi53aGVyZShzdWIuYW5kKG51bGwsIGVzdGF0ZS5qb2lucykpOworCisgICAgICAgIFNRTEJ1ZmZlciB3aGVyZSA9IG5ldyBTUUxCdWZmZXIoZGljdCkuYXBwZW5kKCIoIik7CisgICAgICAgIF9leHAuYXBwZW5kVG8oc3ViLCBjdHgsIGVzdGF0ZSwgd2hlcmUpOworICAgICAgICBpZiAod2hlcmUuZ2V0U1FMKCkubGVuZ3RoKCkgPiAxKQorICAgICAgICAgICAgc3ViLndoZXJlKHdoZXJlLmFwcGVuZCgiKSIpKTsKKworICAgICAgICBidWYuYXBwZW5kKCIwID0gIik7CisgICAgICAgIGJ1Zi5hcHBlbmRDb3VudChzdWIsIGN0eC5mZXRjaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgICAgICBFeHBTdGF0ZSBlc3RhdGUgPSBfZXhwLmluaXRpYWxpemUoc2VsLCBjdHgsICgoTm90Q29udGFpbnNFeHBTdGF0ZSkgCisgICAgICAgICAgICBzdGF0ZSkuY29udGFpbnMpOworICAgICAgICBfZXhwLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGVzdGF0ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfZXhwLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Ob3RFcXVhbEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTm90RXF1YWxFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjYzg5ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTm90RXF1YWxFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKKworLyoqCisgKiBDb21wYXJlcyB0d28gdmFsdWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIE5vdEVxdWFsRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29tcGFyZUVxdWFsRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBOb3RFcXVhbEV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYsIGJvb2xlYW4gdmFsMU51bGwsIGJvb2xlYW4gdmFsMk51bGwpIHsKKyAgICAgICAgaWYgKHZhbDFOdWxsICYmIHZhbDJOdWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiMSA8PiAxIik7CisgICAgICAgIGVsc2UgaWYgKHZhbDFOdWxsIHx8IHZhbDJOdWxsKSB7CisgICAgICAgICAgICBWYWwgdmFsID0gKHZhbDFOdWxsKSA/IGdldFZhbHVlMigpIDogZ2V0VmFsdWUxKCk7CisgICAgICAgICAgICBFeHBTdGF0ZSBzdGF0ZSA9ICh2YWwxTnVsbCkgPyBic3RhdGUuc3RhdGUyIDogYnN0YXRlLnN0YXRlMTsKKyAgICAgICAgICAgIGlmICghaXNEaXJlY3RDb21wYXJpc29uKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gdmFsLmxlbmd0aChzZWwsIGN0eCwgc3RhdGUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIElTIE5PVCAiKS5hcHBlbmRWYWx1ZShudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB2YWwuYXBwZW5kSXNOb3ROdWxsKHNlbCwgY3R4LCBzdGF0ZSwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZhbCB2YWwxID0gZ2V0VmFsdWUxKCk7CisgICAgICAgICAgICBWYWwgdmFsMiA9IGdldFZhbHVlMigpOworICAgICAgICAgICAgaWYgKHZhbDEubGVuZ3RoKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxKSA9PSAxIAorICAgICAgICAgICAgICAgICYmIHZhbDIubGVuZ3RoKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpLmNvbXBhcmlzb24oYnVmLCAiPD4iLAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyVmFsdWVJbXBsKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCB2YWwxKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlclZhbHVlSW1wbChzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgdmFsMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gamF2YS5sYW5nLk1hdGgubWF4KHZhbDEubGVuZ3RoKHNlbCwgY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgYnN0YXRlLnN0YXRlMSksIHZhbDIubGVuZ3RoKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyKSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIE9SICIpOworICAgICAgICAgICAgICAgICAgICB2YWwxLmFwcGVuZFRvKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBidWYsIGkpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgPD4gIik7CisgICAgICAgICAgICAgICAgICAgIHZhbDIuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIGJ1ZiwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTm90RXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Ob3RFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzZDBiOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvTm90RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogTmVnYXRlcyBhbiBleHByZXNzaW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIE5vdEV4cHJlc3Npb24KKyAgICBpbXBsZW1lbnRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4cCBfZXhwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB0aGUgZXhwcmVzc2lvbiB0byBuZWdhdGUuCisgICAgICovCisgICAgcHVibGljIE5vdEV4cHJlc3Npb24oRXhwIGV4cCkgeworICAgICAgICBfZXhwID0gZXhwOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBNYXAgY29udGFpbnMpIHsgCisgICAgICAgIEV4cFN0YXRlIHN0YXRlID0gX2V4cC5pbml0aWFsaXplKHNlbCwgY3R4LCBjb250YWlucyk7CisgICAgICAgIHJldHVybiBuZXcgTm90RXhwU3RhdGUoc2VsLm9yKHN0YXRlLmpvaW5zLCBudWxsKSwgc3RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cHJlc3Npb24gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm90RXhwU3RhdGUgCisgICAgICAgIGV4dGVuZHMgRXhwU3RhdGUgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBFeHBTdGF0ZSBzdGF0ZTsKKworICAgICAgICBwdWJsaWMgTm90RXhwU3RhdGUoSm9pbnMgam9pbnMsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihqb2lucyk7CisgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIk5PVCAoIik7CisgICAgICAgIF9leHAuYXBwZW5kVG8oc2VsLCBjdHgsICgoTm90RXhwU3RhdGUpIHN0YXRlKS5zdGF0ZSwgYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgX2V4cC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCAoKE5vdEV4cFN0YXRlKSBzdGF0ZSkuc3RhdGUsIHBrcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfZXhwLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9OdWxsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL051bGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNlMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9OdWxsLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKKworLyoqCisgKiBBIGxpdGVyYWwgbnVsbCB2YWx1ZSBpbiBhIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBOdWxsCisgICAgZXh0ZW5kcyBDb25zdCB7CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBzcWwuYXBwZW5kVmFsdWUobnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9PckV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvT3JFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiZDRhZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvT3JFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CisKKy8qKgorICogQ29tYmluZXMgdHdvIGV4cHJlc3Npb25zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIE9yRXhwcmVzc2lvbgorICAgIGltcGxlbWVudHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgRXhwIF9leHAxOworICAgIHByaXZhdGUgZmluYWwgRXhwIF9leHAyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB0aGUgZXhwcmVzc2lvbnMgdG8gY29tYmluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3JFeHByZXNzaW9uKEV4cCBleHAxLCBFeHAgZXhwMikgeworICAgICAgICBfZXhwMSA9IGV4cDE7CisgICAgICAgIF9leHAyID0gZXhwMjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIC8vIHdoZW4gT1InaW5nIGV4cHJlc3Npb25zIGVhY2ggZXhwcmVzc2lvbiBnZXRzIGl0cyBvd24gY29weSBvZiB0aGUKKyAgICAgICAgLy8gY29udGFpbnMgY291bnRzLCBjYXVzZSBpdCdzIE9LIGZvciBlYWNoIHRvIHVzZSB0aGUgc2FtZSBhbGlhc2VzCisgICAgICAgIE1hcCBjb250YWluczIgPSBudWxsOworICAgICAgICBpZiAoY29udGFpbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbnRhaW5zMiA9IG5ldyBIYXNoTWFwKGNvbnRhaW5zKTsKKworICAgICAgICBFeHBTdGF0ZSBzMSA9IF9leHAxLmluaXRpYWxpemUoc2VsLCBjdHgsIGNvbnRhaW5zKTsKKyAgICAgICAgRXhwU3RhdGUgczIgPSBfZXhwMi5pbml0aWFsaXplKHNlbCwgY3R4LCBjb250YWluczIpOworICAgICAgICBFeHBTdGF0ZSByZXQgPSBuZXcgQmluYXJ5T3BFeHBTdGF0ZShzZWwub3IoczEuam9pbnMsIHMyLmpvaW5zKSwgczEsIHMyKTsKKyAgICAgICAgaWYgKGNvbnRhaW5zID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8vIGNvbWJpbmUgdGhlIGNvbnRhaW5zIGNvdW50cyBmcm9tIHRoZSBjb3B5IGludG8gdGhlIG1haW4gbWFwCisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgSW50ZWdlciB2YWwxLCB2YWwyOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbnRhaW5zMi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICB2YWwyID0gKEludGVnZXIpIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICB2YWwxID0gKEludGVnZXIpIGNvbnRhaW5zLmdldChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAodmFsMSA9PSBudWxsIHx8IHZhbDIuaW50VmFsdWUoKSA+IHZhbDEuaW50VmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250YWlucy5wdXQoZW50cnkuZ2V0S2V5KCksIHZhbDIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgYm9vbGVhbiBwYXJlbiA9IGJzdGF0ZS5qb2lucyAhPSBudWxsICYmICFic3RhdGUuam9pbnMuaXNFbXB0eSgpOworICAgICAgICBpZiAocGFyZW4pCisgICAgICAgICAgICBidWYuYXBwZW5kKCIoIik7CisKKyAgICAgICAgX2V4cDEuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBPUiAiKTsKKyAgICAgICAgX2V4cDIuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIGJ1Zik7CisKKyAgICAgICAgaWYgKHBhcmVuKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICBzZWwuYXBwZW5kKGJ1ZiwgYnN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfZXhwMS5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBwa3MpOworICAgICAgICBfZXhwMi5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBwa3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX2V4cDEuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF9leHAyLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9QQ1BhdGguamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvUENQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4MDk1MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvUENQYXRoLmphdmEKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogQSBwYXRoIHJlcHJlc2VudHMgYSB0cmF2ZXJzYWwgaW50byBmaWVsZHMgb2YgYSBjYW5kaWRhdGUgb2JqZWN0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFBDUGF0aAorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwKKyAgICBpbXBsZW1lbnRzIEpEQkNQYXRoIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQk9VTkRfVkFSID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VORF9WQVIgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTkFDQ0VTU0VEX1ZBUiA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKFBDUGF0aC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWFwcGluZyBfY2FuZGlkYXRlOworICAgIHByaXZhdGUgQ2xhc3NNYXBwaW5nIF9jbGFzcyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IF9hY3Rpb25zID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2tleSA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF90eXBlID0gUEFUSDsKKyAgICBwcml2YXRlIFN0cmluZyBfdmFyTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBDbGFzcyBfY2FzdCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9jaWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHBhdGggc3RhcnRpbmcgd2l0aCB0aGUgJ3RoaXMnIHB0ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUENQYXRoKENsYXNzTWFwcGluZyB0eXBlKSB7CisgICAgICAgIF9jYW5kaWRhdGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHBhdGggc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIFBDUGF0aChDbGFzc01hcHBpbmcgY2FuZGlkYXRlLCBWYXJpYWJsZSB2YXIpIHsKKyAgICAgICAgX2NhbmRpZGF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgX2FjdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgICAgIFBDUGF0aCBvdGhlciA9IHZhci5nZXRQQ1BhdGgoKTsKKyAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKTsKKyAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIF90eXBlID0gVU5CT1VORF9WQVI7CisgICAgICAgICAgICBhY3Rpb24ub3AgPSBBY3Rpb24uVU5CT1VORF9WQVI7CisgICAgICAgICAgICBhY3Rpb24uZGF0YSA9IHZhcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGJvdW5kIHZhcmlhYmxlOyBjb3B5IHBhdGgKKyAgICAgICAgICAgIF90eXBlID0gVU5BQ0NFU1NFRF9WQVI7CisgICAgICAgICAgICBfYWN0aW9ucy5hZGRBbGwob3RoZXIuX2FjdGlvbnMpOworICAgICAgICAgICAgX2tleSA9IG90aGVyLl9rZXk7CisKKyAgICAgICAgICAgIGFjdGlvbi5vcCA9IEFjdGlvbi5WQVI7CisgICAgICAgICAgICBhY3Rpb24uZGF0YSA9IHZhci5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgX2FjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgIF9jYXN0ID0gdmFyLmdldFR5cGUoKTsgLy8gaW5pdGlhbCB0eXBlIGlzIHZhciB0eXBlCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcGF0aCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBzdWJxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUENQYXRoKFN1YlEgc3ViKSB7CisgICAgICAgIF9jYW5kaWRhdGUgPSBzdWIuZ2V0Q2FuZGlkYXRlKCk7CisgICAgICAgIF9hY3Rpb25zID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpOworICAgICAgICBhY3Rpb24ub3AgPSBBY3Rpb24uU1VCUVVFUlk7CisgICAgICAgIGFjdGlvbi5kYXRhID0gc3ViLmdldENhbmRpZGF0ZUFsaWFzKCk7CisgICAgICAgIF9hY3Rpb25zLmFkZChhY3Rpb24pOworICAgICAgICBfY2FzdCA9IHN1Yi5nZXRUeXBlKCk7IC8vIGluaXRpYWwgdHlwZSBpcyBzdWJxdWVyeSB0eXBlCisgICAgICAgIF92YXJOYW1lID0gc3ViLmdldENhbmRpZGF0ZUFsaWFzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIGFzIGEgYmluZGluZyBvZiB0aGUgZ2l2ZW4gdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVmFyaWFibGVBY3Rpb24oVmFyaWFibGUgdmFyKSB7CisgICAgICAgIF92YXJOYW1lID0gdmFyLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgYm91bmQgdmFyaWFibGUgdGhhdCBoYXMgbm90IGJlZW4gYWNjZXNzZWQKKyAgICAgKiBhZnRlciBiaW5kaW5nLiBVc2VmdWwgZm9yIGZpbHRlcnMgbGlrZQorICAgICAqICJjb2xsLmNvbnRhaW5zICh2YXIpICZhbXA7JmFtcDsgdmFyID09IG51bGwiLCB3aGljaCBzaG91bGQgcmVhbGx5CisgICAgICoganVzdCBhY3QgbGlrZSAiY29sbC5jb250YWlucyAobnVsbCkiLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5hY2Nlc3NlZFZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gX3R5cGUgPT0gVU5BQ0NFU1NFRF9WQVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHBhdGggaW52b2x2aW5nIGEgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBfdHlwZSAhPSBQQVRIOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgcGF0aCBpcyBwYXJ0IG9mIGEgY29udGFpbnMgY2xhdXNlLCB0aGVuIGFsaWFzIGl0IHRvIHRoZQorICAgICAqIHByb3BlciBjb250YWlucyBpZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvbnRhaW5zSWQoU3RyaW5nIGlkKSB7CisgICAgICAgIGlmIChfY2lkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHRyZWF0IGl0IGp1c3QgbGlrZSBhIHVuaXF1ZSB2YXJpYWJsZQorICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpOworICAgICAgICBhY3Rpb24ub3AgPSBBY3Rpb24uVkFSOworICAgICAgICBhY3Rpb24uZGF0YSA9IGlkOworICAgICAgICBpZiAoX2FjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9hY3Rpb25zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgX2FjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgIF9jaWQgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX2NsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfY2xhc3MgPSAoQ2xhc3NNYXBwaW5nKSBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzS2V5KCkgeworICAgICAgICByZXR1cm4gX2tleTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIGlmIChfYWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChfdmFyTmFtZSA9PSBudWxsKSA/ICIiIDogX3Zhck5hbWUgKyAiLiI7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEFjdGlvbiBhY3Rpb247CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2FjdGlvbnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFjdGlvbiA9IChBY3Rpb24pIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uLm9wID09IEFjdGlvbi5WQVIgfHwgYWN0aW9uLm9wID09IEFjdGlvbi5TVUJRVUVSWSkKKyAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChhY3Rpb24uZGF0YSk7CisgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24ub3AgPT0gQWN0aW9uLlVOQk9VTkRfVkFSKQorICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCgoVmFyaWFibGUpIGFjdGlvbi5kYXRhKS5nZXROYW1lKCkpOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgoKEZpZWxkTWFwcGluZykgYWN0aW9uLmRhdGEpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBwYXRoLmFwcGVuZCgnLicpOworICAgICAgICB9CisgICAgICAgIGlmIChfdmFyTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcGF0aC5hcHBlbmQoX3Zhck5hbWUpLmFwcGVuZCgnLicpOworICAgICAgICByZXR1cm4gcGF0aC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIFBhdGhFeHBTdGF0ZSBwc3RhdGUgPSAoUGF0aEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKHBzdGF0ZS5maWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9jbGFzczsKKyAgICAgICAgaWYgKF9rZXkpIHsKKyAgICAgICAgICAgIGlmIChwc3RhdGUuZmllbGQuZ2V0S2V5KCkuZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBzdGF0ZS5maWVsZC5nZXRLZXlNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQuZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgcmV0dXJuIHBzdGF0ZS5maWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQuZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMpCisgICAgICAgICAgICByZXR1cm4gcHN0YXRlLmZpZWxkLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAoKFBhdGhFeHBTdGF0ZSkgc3RhdGUpLmZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIFBhdGhFeHBTdGF0ZSBwc3RhdGUgPSAoUGF0aEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKHBzdGF0ZS5jb2xzID09IG51bGwpCisgICAgICAgICAgICBwc3RhdGUuY29scyA9IGNhbGN1bGF0ZUNvbHVtbnMocHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIHBzdGF0ZS5jb2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW5zIHVzZWQgYnkgdGhpcyBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgQ29sdW1uW10gY2FsY3VsYXRlQ29sdW1ucyhQYXRoRXhwU3RhdGUgcHN0YXRlKSB7CisgICAgICAgIGlmIChfa2V5KSB7CisgICAgICAgICAgICBpZiAoIXBzdGF0ZS5qb2luZWRSZWwgCisgICAgICAgICAgICAgICAgJiYgcHN0YXRlLmZpZWxkLmdldEtleSgpLmdldFZhbHVlTWFwcGVkQnkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGpvaW5SZWxhdGlvbihwc3RhdGUsIF9rZXksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBlbHNlIGlmIChwc3RhdGUuam9pbmVkUmVsIAorICAgICAgICAgICAgICAgICYmIHBzdGF0ZS5maWVsZC5nZXRLZXkoKS5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5QQykKKyAgICAgICAgICAgICAgICByZXR1cm4gcHN0YXRlLmZpZWxkLmdldEtleU1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpLgorICAgICAgICAgICAgICAgICAgICBnZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICAgICAgcmV0dXJuIHBzdGF0ZS5maWVsZC5nZXRLZXlNYXBwaW5nKCkuZ2V0Q29sdW1ucygpOworICAgICAgICB9CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChwc3RhdGUuZmllbGQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcHBpbmcgZWxlbSA9IHBzdGF0ZS5maWVsZC5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAocHN0YXRlLmpvaW5lZFJlbCAmJiBlbGVtLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRDb2x1bW5zKCkubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBzdGF0ZS5maWVsZC5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgICAgIGlmIChwc3RhdGUuam9pbmVkUmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBzdGF0ZS5maWVsZC5nZXRUeXBlTWFwcGluZygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwc3RhdGUuZmllbGQuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwc3RhdGUuZmllbGQuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoX2NsYXNzID09IG51bGwpID8gU2NoZW1hcy5FTVBUWV9DT0xVTU5TCisgICAgICAgICAgICA6IF9jbGFzcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmFyaWFibGUoKSB7CisgICAgICAgIGlmIChfYWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgX2FjdGlvbnMuZ2V0TGFzdCgpOworICAgICAgICByZXR1cm4gYWN0aW9uLm9wID09IEFjdGlvbi5VTkJPVU5EX1ZBUiB8fCBhY3Rpb24ub3AgPT0gQWN0aW9uLlZBUjsgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0KEZpZWxkTWV0YURhdGEgZmllbGQsIGJvb2xlYW4gbnVsbFRyYXZlcnNhbCkgeworICAgICAgICBpZiAoX2FjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9hY3Rpb25zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKTsKKyAgICAgICAgYWN0aW9uLm9wID0gKG51bGxUcmF2ZXJzYWwpID8gQWN0aW9uLkdFVF9PVVRFUiA6IEFjdGlvbi5HRVQ7CisgICAgICAgIGFjdGlvbi5kYXRhID0gZmllbGQ7CisgICAgICAgIF9hY3Rpb25zLmFkZChhY3Rpb24pOworICAgICAgICBpZiAoX3R5cGUgPT0gVU5BQ0NFU1NFRF9WQVIpCisgICAgICAgICAgICBfdHlwZSA9IEJPVU5EX1ZBUjsKKyAgICAgICAgX2Nhc3QgPSBudWxsOworICAgICAgICBfa2V5ID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGdldEtleSgpIHsKKyAgICAgICAgaWYgKF9jaWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gY2hhbmdlIHRoZSBsYXN0IGFjdGlvbiB0byBhIGdldCBrZXkKKyAgICAgICAgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIF9hY3Rpb25zLmdldExhc3QoKTsKKyAgICAgICAgYWN0aW9uLm9wID0gQWN0aW9uLkdFVF9LRVk7CisgICAgICAgIF9jYXN0ID0gbnVsbDsKKyAgICAgICAgX2tleSA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgbGFzdCgpIHsKKyAgICAgICAgQWN0aW9uIGFjdCA9IGxhc3RGaWVsZEFjdGlvbigpOworICAgICAgICByZXR1cm4gKGFjdCA9PSBudWxsKSA/IG51bGwgOiAoRmllbGRNZXRhRGF0YSkgYWN0LmRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IGFjdGlvbiB0aGF0IGdldHMgYSBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFjdGlvbiBsYXN0RmllbGRBY3Rpb24oKSB7CisgICAgICAgIGlmIChfYWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgTGlzdEl0ZXJhdG9yIGl0ciA9IF9hY3Rpb25zLmxpc3RJdGVyYXRvcihfYWN0aW9ucy5zaXplKCkpOworICAgICAgICBBY3Rpb24gcHJldjsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNQcmV2aW91cygpKSB7CisgICAgICAgICAgICBwcmV2ID0gKEFjdGlvbikgaXRyLnByZXZpb3VzKCk7CisgICAgICAgICAgICBpZiAocHJldi5vcCA9PSBBY3Rpb24uR0VUIHx8IHByZXYub3AgPT0gQWN0aW9uLkdFVF9PVVRFUgorICAgICAgICAgICAgICAgIHx8IHByZXYub3AgPT0gQWN0aW9uLkdFVF9LRVkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfY2FzdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9jYXN0OworICAgICAgICBBY3Rpb24gYWN0ID0gbGFzdEZpZWxkQWN0aW9uKCk7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZmxkID0gKGFjdCA9PSBudWxsKSA/IG51bGwgOiAoRmllbGRNZXRhRGF0YSkgYWN0LmRhdGE7CisgICAgICAgIGJvb2xlYW4ga2V5ID0gYWN0ICE9IG51bGwgJiYgYWN0Lm9wID09IEFjdGlvbi5HRVRfS0VZOworICAgICAgICBpZiAoZmxkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZmxkLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBpZiAoZmxkLmdldERlY2xhcmVkVHlwZSgpID09IGJ5dGVbXS5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmxkLmdldERlY2xhcmVkVHlwZSgpID09IEJ5dGVbXS5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmxkLmdldERlY2xhcmVkVHlwZSgpID09IGNoYXJbXS5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmxkLmdldERlY2xhcmVkVHlwZSgpID09IENoYXJhY3RlcltdLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZC5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZC5nZXRLZXkoKS5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZC5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX2NsYXNzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2NsYXNzLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfY2FzdCA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICBQYXRoRXhwU3RhdGUgcHN0YXRlID0gbmV3IFBhdGhFeHBTdGF0ZShzZWwubmV3Sm9pbnMoKSk7CisgICAgICAgIGJvb2xlYW4ga2V5ID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZm9yY2VPdXRlciA9IGZhbHNlOworICAgICAgICBDbGFzc01hcHBpbmcgcmVsID0gX2NhbmRpZGF0ZTsKKworICAgICAgICAvLyBpdGVyYXRlIHRvIHRoZSBmaW5hbCBmaWVsZAorICAgICAgICBDbGFzc01hcHBpbmcgb3duZXI7CisgICAgICAgIENsYXNzTWFwcGluZyBmcm9tLCB0bzsKKyAgICAgICAgQWN0aW9uIGFjdGlvbjsKKyAgICAgICAgVmFyaWFibGUgdmFyOworICAgICAgICBJdGVyYXRvciBpdHIgPSAoX2FjdGlvbnMgPT0gbnVsbCkgPyBudWxsIDogX2FjdGlvbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkOworICAgICAgICB3aGlsZSAoaXRyICE9IG51bGwgJiYgaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgYWN0aW9uID0gKEFjdGlvbikgaXRyLm5leHQoKTsKKworICAgICAgICAgICAgLy8gdHJlYXQgc3VicXVlcmllcyBsaWtlIHZhcmlhYmxlcyBmb3IgYWxpYXMgZ2VuZXJhdGlvbiBwdXJwb3NlcworICAgICAgICAgICAgaWYgKGFjdGlvbi5vcCA9PSBBY3Rpb24uVkFSKQorICAgICAgICAgICAgICAgIHBzdGF0ZS5qb2lucyA9IHBzdGF0ZS5qb2lucy5zZXRWYXJpYWJsZSgoU3RyaW5nKSBhY3Rpb24uZGF0YSk7CisgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24ub3AgPT0gQWN0aW9uLlNVQlFVRVJZKQorICAgICAgICAgICAgICAgIHBzdGF0ZS5qb2lucyA9IHBzdGF0ZS5qb2lucy5zZXRTdWJzZWxlY3QoKFN0cmluZykgYWN0aW9uLmRhdGEpOworICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uLm9wID09IEFjdGlvbi5VTkJPVU5EX1ZBUikgeworICAgICAgICAgICAgICAgIC8vIHVuYm91bmQgdmFycyBhcmUgY3Jvc3Mtam9pbmVkIHRvIHRoZSBjYW5kaWRhdGUgdGFibGUKKyAgICAgICAgICAgICAgICB2YXIgPSAoVmFyaWFibGUpIGFjdGlvbi5kYXRhOworICAgICAgICAgICAgICAgIHJlbCA9IChDbGFzc01hcHBpbmcpIHZhci5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIHBzdGF0ZS5qb2lucyA9IHBzdGF0ZS5qb2lucy5zZXRWYXJpYWJsZSh2YXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwc3RhdGUuam9pbnMgPSBwc3RhdGUuam9pbnMuY3Jvc3NKb2luKF9jYW5kaWRhdGUuZ2V0VGFibGUoKSwgCisgICAgICAgICAgICAgICAgICAgIHJlbC5nZXRUYWJsZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbW92ZSBwYXN0IHRoZSBwcmV2aW91cyBmaWVsZCwgaWYgYW55CisgICAgICAgICAgICAgICAgZmllbGQgPSAoRmllbGRNYXBwaW5nKSBhY3Rpb24uZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAocHN0YXRlLmZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgc2Vjb25kLXRvLWxhc3QgZmllbGQgYW5kIHRoZSBsYXN0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWxhdGVkIGZpZWxkIHRoaXMgZmllbGQgam9pbnMgdG8sIG5vIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhdmVyc2U6IGp1c3QgdXNlIHRoaXMgZmllbGQncyBmayBjb2x1bW5zCisgICAgICAgICAgICAgICAgICAgIGlmICghaXRyLmhhc05leHQoKSAmJiAoZmxhZ3MgJiBKT0lOX1JFTCkgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNKb2luZWRGaWVsZChwc3RhdGUuZmllbGQsIGtleSwgZmllbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc3RhdGUuY21wZmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlbCA9IHRyYXZlcnNlRmllbGQocHN0YXRlLCBrZXksIGZvcmNlT3V0ZXIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtYXJrIGlmIHRoZSBuZXh0IHRyYXZlcnNhbCBzaG91bGQgZ28gdGhyb3VnaAorICAgICAgICAgICAgICAgIC8vIHRoZSBrZXkgcmF0aGVyIHRoYW4gdmFsdWUKKyAgICAgICAgICAgICAgICBrZXkgPSBhY3Rpb24ub3AgPT0gQWN0aW9uLkdFVF9LRVk7CisgICAgICAgICAgICAgICAgZm9yY2VPdXRlciB8PSBhY3Rpb24ub3AgPT0gQWN0aW9uLkdFVF9PVVRFUjsKKworICAgICAgICAgICAgICAgIC8vIGdldCBtYXBwaW5nIGZvciB0aGUgY3VycmVudCBmaWVsZAorICAgICAgICAgICAgICAgIHBzdGF0ZS5maWVsZCA9IGZpZWxkOworICAgICAgICAgICAgICAgIG93bmVyID0gcHN0YXRlLmZpZWxkLmdldERlZmluaW5nTWFwcGluZygpOworICAgICAgICAgICAgICAgIGlmIChwc3RhdGUuZmllbGQuZ2V0TWFuYWdlbWVudCgpIAorICAgICAgICAgICAgICAgICAgICAhPSBGaWVsZE1hcHBpbmcuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJub24tcGVycy1maWVsZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgcHN0YXRlLmZpZWxkKSk7CisKKyAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtb3N0LWRlcml2ZWQgdHlwZSBiZXR3ZWVuIHRoZSBkZWNsYXJlZCByZWxhdGlvbgorICAgICAgICAgICAgICAgIC8vIHR5cGUgYW5kIHRoZSBmaWVsZCdzIG93bmVyLCBhbmQgam9pbiBmcm9tIHRoYXQgdHlwZSB0bworICAgICAgICAgICAgICAgIC8vIHRoZSBsZXNzZXIgZGVyaXZlZCB0eXBlCisgICAgICAgICAgICAgICAgaWYgKHJlbCAhPSBvd25lciAmJiByZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmdldERlc2NyaWJlZFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAob3duZXIuZ2V0RGVzY3JpYmVkVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG93bmVyOworICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSByZWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gcmVsOworICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSBvd25lcjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBmcm9tICE9IG51bGwgJiYgZnJvbSAhPSB0bzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHN0YXRlLmpvaW5zID0gZnJvbS5qb2luU3VwZXJjbGFzcyhwc3RhdGUuam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF92YXJOYW1lICE9IG51bGwpCisgICAgICAgICAgICBwc3RhdGUuam9pbnMgPSBwc3RhdGUuam9pbnMuc2V0VmFyaWFibGUoX3Zhck5hbWUpOworCisgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBjb21wYXJpbmcgdG8gbnVsbCBvciBkb2luZyBhbiBpc0VtcHR5LCB0aGVuCisgICAgICAgIC8vIGpvaW4gaW50byB0aGUgZGF0YSBvbiB0aGUgZmluYWwgZmllbGQ7IG9idmlvdXNseSB3ZSBjYW4ndCBkbyB0aGVzZQorICAgICAgICAvLyBqb2lucyB3aGVuIGNvbXBhcmluZyB0byBudWxsIGIvYyB0aGUgd2hvbGUgcHVycG9zZSBpcyB0byBzZWUKKyAgICAgICAgLy8gd2hldGhlciB0aGUgam9pbnMgZXZlbiBleGlzdAorICAgICAgICBpZiAoKGZsYWdzICYgTlVMTF9DTVApID09IDApCisgICAgICAgICAgICB0cmF2ZXJzZUZpZWxkKHBzdGF0ZSwga2V5LCBmb3JjZU91dGVyLCB0cnVlKTsKKyAgICAgICAgcHN0YXRlLmpvaW5lZFJlbCA9IGZhbHNlOworICAgICAgICBpZiAoKGZsYWdzICYgSk9JTl9SRUwpICE9IDApCisgICAgICAgICAgICBqb2luUmVsYXRpb24ocHN0YXRlLCBrZXksIGZvcmNlT3V0ZXIgfHwgKGZsYWdzICYgRk9SQ0VfT1VURVIpICE9IDAsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICByZXR1cm4gcHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBzb3VyY2UgZmllbGQgam9pbnMgdG8gdGhlIGdpdmVuIHRhcmdldCBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSm9pbmVkRmllbGQoRmllbGRNYXBwaW5nIHNyYywgYm9vbGVhbiBrZXksIAorICAgICAgICBGaWVsZE1hcHBpbmcgdGFyZ2V0KSB7CisgICAgICAgIFZhbHVlTWFwcGluZyB2bTsKKyAgICAgICAgc3dpdGNoIChzcmMuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIHZtID0gc3JjLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgdm0gPSAoa2V5KSA/IHNyYy5nZXRLZXlNYXBwaW5nKCkgOiBzcmMuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdm0gPSBzcmM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZtLmdldEpvaW5EaXJlY3Rpb24oKSAhPSBWYWx1ZU1hcHBpbmcuSk9JTl9GT1JXQVJEKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBGb3JlaWduS2V5IGZrID0gdm0uZ2V0Rm9yZWlnbktleSgpOworICAgICAgICBpZiAoZmsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgCisgICAgICAgIAorICAgICAgICAvLyBmb3JlaWduIGtleSBtdXN0IGpvaW4gdG8gdGFyZ2V0IGNvbHVtbnMKKyAgICAgICAgQ29sdW1uW10gcmVscyA9IGZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uW10gcGtzID0gdGFyZ2V0LmdldENvbHVtbnMoKTsgCisgICAgICAgIGlmIChyZWxzLmxlbmd0aCAhPSBwa3MubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoZmsuZ2V0UHJpbWFyeUtleUNvbHVtbihyZWxzW2ldKSAhPSBwa3NbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhdGhFeHBTdGF0ZQorICAgICAgICBleHRlbmRzIEV4cFN0YXRlIHsKKworICAgICAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGZpZWxkID0gbnVsbDsKKyAgICAgICAgcHVibGljIEZpZWxkTWFwcGluZyBjbXBmaWVsZCA9IG51bGw7CisgICAgICAgIHB1YmxpYyBDb2x1bW5bXSBjb2xzID0gbnVsbDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gam9pbmVkUmVsID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFBhdGhFeHBTdGF0ZShKb2lucyBqb2lucykgeworICAgICAgICAgICAgc3VwZXIoam9pbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgaW50byB0aGUgcHJldmlvdXMgZmllbGQgb2YgYSByZWxhdGlvbiBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGxhc3Qgd2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBwYXRoCisgICAgICogQHJldHVybiB0aGUgbWFwcGluZyBvZiB0aGUgcmVsYXRlZCB0eXBlLCBvciBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc01hcHBpbmcgdHJhdmVyc2VGaWVsZChQYXRoRXhwU3RhdGUgcHN0YXRlLCBib29sZWFuIGtleSwgCisgICAgICAgIGJvb2xlYW4gZm9yY2VPdXRlciwgYm9vbGVhbiBsYXN0KSB7CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHRyYXZlcnNlIGludG8gZmllbGQgdmFsdWUKKyAgICAgICAgaWYgKGtleSkKKyAgICAgICAgICAgIHBzdGF0ZS5qb2lucyA9IHBzdGF0ZS5maWVsZC5qb2luS2V5KHBzdGF0ZS5qb2lucywgZm9yY2VPdXRlcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBzdGF0ZS5qb2lucyA9IHBzdGF0ZS5maWVsZC5qb2luKHBzdGF0ZS5qb2lucywgZm9yY2VPdXRlcik7CisKKyAgICAgICAgLy8gaWYgdGhpcyBpc24ndCB0aGUgbGFzdCBmaWVsZCwgdHJhdmVyc2UgaW50byB0aGUgcmVsYXRpb24KKyAgICAgICAgaWYgKCFsYXN0KQorICAgICAgICAgICAgam9pblJlbGF0aW9uKHBzdGF0ZSwga2V5LCBmb3JjZU91dGVyLCB0cnVlKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIG1hcGluZyBvZiB0aGUgcmVsYXRlZCB0eXBlLCBpZiBhbnkKKyAgICAgICAgaWYgKGtleSkKKyAgICAgICAgICAgIHJldHVybiBwc3RhdGUuZmllbGQuZ2V0S2V5TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQuZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgcmV0dXJuIHBzdGF0ZS5maWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiBwc3RhdGUuZmllbGQuZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKb2luIGludG8gdGhlIHJlbGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBjdXJyZW50IGZpZWxkLCBpZiBhbnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGpvaW5SZWxhdGlvbihQYXRoRXhwU3RhdGUgcHN0YXRlLCBib29sZWFuIGtleSwgCisgICAgICAgIGJvb2xlYW4gZm9yY2VPdXRlciwgYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICBpZiAocHN0YXRlLmZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChrZXkpCisgICAgICAgICAgICBwc3RhdGUuam9pbnMgPSBwc3RhdGUuZmllbGQuam9pbktleVJlbGF0aW9uKHBzdGF0ZS5qb2lucywgCisgICAgICAgICAgICAgICAgZm9yY2VPdXRlciwgdHJhdmVyc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc3RhdGUuam9pbnMgPSBwc3RhdGUuZmllbGQuam9pblJlbGF0aW9uKHBzdGF0ZS5qb2lucywgZm9yY2VPdXRlciwKKyAgICAgICAgICAgICAgICB0cmF2ZXJzZSk7CisgICAgICAgIHBzdGF0ZS5qb2luZWRSZWwgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgIFBhdGhFeHBTdGF0ZSBwc3RhdGUgPSAoUGF0aEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkID0gKHBzdGF0ZS5jbXBmaWVsZCAhPSBudWxsKSA/IHBzdGF0ZS5jbXBmaWVsZCAKKyAgICAgICAgICAgIDogcHN0YXRlLmZpZWxkOworICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9rZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLnRvS2V5RGF0YVN0b3JlVmFsdWUodmFsLCBjdHguc3RvcmUpOworICAgICAgICAgICAgaWYgKGZpZWxkLmdldEVsZW1lbnQoKS5nZXREZWNsYXJlZFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLk9CSkVDVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQudG9EYXRhU3RvcmVWYWx1ZSh2YWwsIGN0eC5zdG9yZSk7CisKKyAgICAgICAgICAgIHZhbCA9IGZpZWxkLmdldEV4dGVybmFsVmFsdWUodmFsLCBjdHguc3RvcmUuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZC50b0RhdGFTdG9yZVZhbHVlKHZhbCwgY3R4LnN0b3JlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NsYXNzLnRvRGF0YVN0b3JlVmFsdWUodmFsLCBfY2xhc3MuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwKKyAgICAgICAgICAgIGN0eC5zdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIHN0YXRlLCBwa3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSBnZXRDbGFzc01hcHBpbmcoc3RhdGUpOworICAgICAgICBQYXRoRXhwU3RhdGUgcHN0YXRlID0gKFBhdGhFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIGlmIChtYXBwaW5nID09IG51bGwgfHwgIXBzdGF0ZS5qb2luZWRSZWwpCisgICAgICAgICAgICBzZWwuc2VsZWN0KGdldENvbHVtbnMoc3RhdGUpLCBwc3RhdGUuam9pbnMpOworICAgICAgICBlbHNlIGlmIChwa3MpCisgICAgICAgICAgICBzZWwuc2VsZWN0KG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwgcHN0YXRlLmpvaW5zKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIG1hcHBpbmc7IGFsbG93IGFueSBzdWJzIGJlY2F1c2Ugd2Uga25vdyB0aGlzIG11c3QKKyAgICAgICAgICAgIC8vIGJlIGVpdGhlciBhIHJlbGF0aW9uLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYWxyZWFkeSBiZQorICAgICAgICAgICAgLy8gY29uc3RyYWluZWQgYnkgdGhlIGpvaW5zLCBvciAndGhpcycsIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICAgICAgICAvLyBKREJDRXhwcmVzc2lvbkZhY3RvcnkgdGFrZXMgY2FyZSBvZiBhZGRpbmcgY2xhc3MgY29uZGl0aW9ucyBmb3IKKyAgICAgICAgICAgIC8vIHRoZSBjYW5kaWRhdGUgY2xhc3Mgb24gdGhlIHNlbGVjdAorICAgICAgICAgICAgaW50IHN1YnMgPSAoX3R5cGUgPT0gVU5CT1VORF9WQVIpID8gU2VsZWN0LlNVQlNfSk9JTkFCTEUKKyAgICAgICAgICAgICAgICA6IFNlbGVjdC5TVUJTX0FOWV9KT0lOQUJMRTsKKyAgICAgICAgICAgIHNlbC5zZWxlY3QobWFwcGluZywgc3VicywgY3R4LnN0b3JlLCBjdHguZmV0Y2gsCisgICAgICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9OT05FLCBzZWwub3V0ZXIocHN0YXRlLmpvaW5zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZyA9IGdldENsYXNzTWFwcGluZyhzdGF0ZSk7CisgICAgICAgIFBhdGhFeHBTdGF0ZSBwc3RhdGUgPSAoUGF0aEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCB8fCAhcHN0YXRlLmpvaW5lZFJlbCkKKyAgICAgICAgICAgIHNlbC5ncm91cEJ5KGdldENvbHVtbnMoc3RhdGUpLCBzZWwub3V0ZXIocHN0YXRlLmpvaW5zKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHN1YnMgPSAoX3R5cGUgPT0gVU5CT1VORF9WQVIpID8gU2VsZWN0LlNVQlNfSk9JTkFCTEUKKyAgICAgICAgICAgICAgICA6IFNlbGVjdC5TVUJTX0FOWV9KT0lOQUJMRTsKKyAgICAgICAgICAgIHNlbC5ncm91cEJ5KG1hcHBpbmcsIHN1YnMsIGN0eC5zdG9yZSwgY3R4LmZldGNoLCAKKyAgICAgICAgICAgICAgICBzZWwub3V0ZXIocHN0YXRlLmpvaW5zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlckJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHNlbC5vcmRlckJ5KGdldENvbHVtbnMoc3RhdGUpLCBhc2MsIHNlbC5vdXRlcihzdGF0ZS5qb2lucyksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxvYWQoY3R4LCBzdGF0ZSwgcmVzLCBmYWxzZSk7CisgICAgfQorCisgICAgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzLCBib29sZWFuIHBrcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gZ2V0Q2xhc3NNYXBwaW5nKHN0YXRlKTsKKyAgICAgICAgUGF0aEV4cFN0YXRlIHBzdGF0ZSA9IChQYXRoRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAobWFwcGluZyAhPSBudWxsICYmIChwc3RhdGUuZmllbGQgPT0gbnVsbCAKKyAgICAgICAgICAgIHx8ICFwc3RhdGUuZmllbGQuaXNFbWJlZGRlZCgpKSkgeworICAgICAgICAgICAgaWYgKHBrcykKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRPYmplY3RJZChjdHguc3RvcmUsIHJlcywgbnVsbCwgdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgIHBzdGF0ZS5qb2lucyk7CisgICAgICAgICAgICByZXR1cm4gcmVzLmxvYWQobWFwcGluZywgY3R4LnN0b3JlLCBjdHguZmV0Y2gsIHBzdGF0ZS5qb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgcmV0OworICAgICAgICBpZiAoX2tleSkKKyAgICAgICAgICAgIHJldCA9IHBzdGF0ZS5maWVsZC5sb2FkS2V5UHJvamVjdGlvbihjdHguc3RvcmUsIGN0eC5mZXRjaCwgcmVzLCAKKyAgICAgICAgICAgICAgICBwc3RhdGUuam9pbnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgPSBwc3RhdGUuZmllbGQubG9hZFByb2plY3Rpb24oY3R4LnN0b3JlLCBjdHguZmV0Y2gsIHJlcywgCisgICAgICAgICAgICAgICAgcHN0YXRlLmpvaW5zKTsKKyAgICAgICAgaWYgKF9jYXN0ICE9IG51bGwpCisgICAgICAgICAgICByZXQgPSBGaWx0ZXJzLmNvbnZlcnQocmV0LCBfY2FzdCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIC8vIHdlIGRvbid0IGNyZWF0ZSB0aGUgU1FMIGIvYyBpdCBmb3JjZXMgdGhlIFNlbGVjdCB0byBjYWNoZSBhbGlhc2VzCisgICAgICAgIC8vIGZvciB0aGUgdGFibGVzIHdlIHVzZSwgYW5kIHRoZXNlIGFsaWFzZXMgbWlnaHQgbm90IGV2ZXIgYmUgdXNlZCBpZgorICAgICAgICAvLyB3ZSBldmVudHVhbGx5IGNhbGwgYXBwZW5kSXNFbXB0eSBvciBhcHBlbmRJc051bGwgcmF0aGVyIHRoYW4gYXBwZW5kVG8KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbHVtbnMoc3RhdGUpLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGdldENvbHVtbnMoc3RhdGUpW2luZGV4XTsKKworICAgICAgICAvLyBpZiBzZWxlY3QgaXMgbnVsbCwgaXQgbWVhbnMgd2UgYXJlIG5vdCBhbGlhc2luZyBjb2x1bW5zCisgICAgICAgIC8vIChlLmcuLCBkdXJpbmcgYSBidWxrIHVwZGF0ZSkKKyAgICAgICAgaWYgKHNlbCA9PSBudWxsKQorICAgICAgICAgICAgc3FsLmFwcGVuZChjb2wuZ2V0TmFtZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3FsLmFwcGVuZChzZWwuZ2V0Q29sdW1uQWxpYXMoY29sLCBzdGF0ZS5qb2lucykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzRW1wdHkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgICAgICBQYXRoRXhwU3RhdGUgcHN0YXRlID0gKFBhdGhFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoRkFMU0UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc3RhdGUuZmllbGQuYXBwZW5kSXNFbXB0eShzcWwsIHNlbCwgcHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdEVtcHR5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgUGF0aEV4cFN0YXRlIHBzdGF0ZSA9IChQYXRoRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAocHN0YXRlLmZpZWxkID09IG51bGwpCisgICAgICAgICAgICBzcWwuYXBwZW5kKEZBTFNFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHN0YXRlLmZpZWxkLmFwcGVuZElzTm90RW1wdHkoc3FsLCBzZWwsIHBzdGF0ZS5qb2lucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kU2l6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIFBhdGhFeHBTdGF0ZSBwc3RhdGUgPSAoUGF0aEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKHBzdGF0ZS5maWVsZCA9PSBudWxsKQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiMSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc3RhdGUuZmllbGQuYXBwZW5kU2l6ZShzcWwsIHNlbCwgcHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgICAgICBQYXRoRXhwU3RhdGUgcHN0YXRlID0gKFBhdGhFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIGlmIChwc3RhdGUuZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoRkFMU0UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc3RhdGUuZmllbGQuYXBwZW5kSXNOdWxsKHNxbCwgc2VsLCBwc3RhdGUuam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTm90TnVsbChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIFBhdGhFeHBTdGF0ZSBwc3RhdGUgPSAoUGF0aEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKHBzdGF0ZS5maWVsZCA9PSBudWxsKQorICAgICAgICAgICAgc3FsLmFwcGVuZChUUlVFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHN0YXRlLmZpZWxkLmFwcGVuZElzTm90TnVsbChzcWwsIHNlbCwgcHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpZiAoX2FjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfY2FuZGlkYXRlLmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiBfY2FuZGlkYXRlLmhhc2hDb2RlKCkgXiBfYWN0aW9ucy5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQQ1BhdGgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBQQ1BhdGggcGF0aCA9IChQQ1BhdGgpIG90aGVyOworICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuZXF1YWxzKF9jYW5kaWRhdGUsIHBhdGguX2NhbmRpZGF0ZSkKKyAgICAgICAgICAgICYmIE9iamVjdFV0aWxzLmVxdWFscyhfYWN0aW9ucywgcGF0aC5fYWN0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIHJlcHJlc2VudGluZyBhbiBhY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWN0aW9uIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVQgPSAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfT1VURVIgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfS0VZID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSID0gMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCUVVFUlkgPSA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5EX1ZBUiA9IDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU1QgPSA2OworCisgICAgICAgIHB1YmxpYyBpbnQgb3AgPSAtMTsKKyAgICAgICAgcHVibGljIE9iamVjdCBkYXRhID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG9wICsgInwiICsgZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgICAgIHJldHVybiBvcCBeIGRhdGEuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgQWN0aW9uIGEgPSAoQWN0aW9uKSBvdGhlcjsKKyAgICAgICAgICAgIHJldHVybiBvcCA9PSBhLm9wCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0VXRpbHMuZXF1YWxzKGRhdGEsIGEuZGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1BhcmFtLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1BhcmFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiMGVlYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvUGFyYW0uamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXI7CisKKy8qKgorICogQSBwYXJhbWV0ZXIgaW4gYSBmaWx0ZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgUGFyYW0KKyAgICBleHRlbmRzIENvbnN0CisgICAgaW1wbGVtZW50cyBQYXJhbWV0ZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX25hbWU7CisgICAgcHJpdmF0ZSBDbGFzcyBfdHlwZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2lkeCA9IC0xOworICAgIHByaXZhdGUgYm9vbGVhbiBfY29udGFpbmVyID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHBhcmFtZXRlciBuYW1lIGFuZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSkgeworICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgIHNldEltcGxpY2l0VHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgICAgIF9jb250YWluZXIgPSAoZ2V0TWV0YURhdGEoKSA9PSBudWxsIHx8ICFJbXBsSGVscGVyLmlzTWFuYWdlZFR5cGUodHlwZSkpCisgICAgICAgICAgICAmJiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpCisgICAgICAgICAgICB8fCBNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGlkeCkgeworICAgICAgICBfaWR4ID0gaWR4OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmNvbnZlcnQocGFyYW1zW19pZHhdLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAoKFBhcmFtRXhwU3RhdGUpIHN0YXRlKS5zcWxWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyYW1FeHBTdGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cHJlc3Npb24gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyYW1FeHBTdGF0ZQorICAgICAgICBleHRlbmRzIENvbnN0RXhwU3RhdGUgeworCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc3FsVmFsdWUgPSBudWxsOworICAgICAgICBwdWJsaWMgaW50IG90aGVyTGVuZ3RoID0gMTsgCisgICAgfSAKKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgICAgICBzdXBlci5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgc3RhdGUsIG90aGVyLCBvdGhlclN0YXRlKTsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGdldFZhbHVlKGN0eC5wYXJhbXMpOworICAgICAgICBQYXJhbUV4cFN0YXRlIHBzdGF0ZSA9IChQYXJhbUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgaWYgKG90aGVyICE9IG51bGwgJiYgIV9jb250YWluZXIpIHsKKyAgICAgICAgICAgIHBzdGF0ZS5zcWxWYWx1ZSA9IG90aGVyLnRvRGF0YVN0b3JlVmFsdWUoc2VsLCBjdHgsIG90aGVyU3RhdGUsIHZhbCk7CisgICAgICAgICAgICBwc3RhdGUub3RoZXJMZW5ndGggPSBvdGhlci5sZW5ndGgoc2VsLCBjdHgsIG90aGVyU3RhdGUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlQ2FwYWJsZSkgeworICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSBjdHguc3RvcmUuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgICAgIGdldE1hcHBpbmdSZXBvc2l0b3J5SW5zdGFuY2UoKS5nZXRNYXBwaW5nKHZhbC5nZXRDbGFzcygpLCAKKyAgICAgICAgICAgICAgICBjdHguc3RvcmUuZ2V0Q29udGV4dCgpLmdldENsYXNzTG9hZGVyKCksIHRydWUpOworICAgICAgICAgICAgcHN0YXRlLnNxbFZhbHVlID0gbWFwcGluZy50b0RhdGFTdG9yZVZhbHVlKHZhbCwgCisgICAgICAgICAgICAgICAgbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLCBjdHguc3RvcmUpOworICAgICAgICAgICAgcHN0YXRlLm90aGVyTGVuZ3RoID0gbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwc3RhdGUuc3FsVmFsdWUgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgICAgIFBhcmFtRXhwU3RhdGUgcHN0YXRlID0gKFBhcmFtRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBpZiAocHN0YXRlLm90aGVyTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmRWYWx1ZSgoKE9iamVjdFtdKSBwc3RhdGUuc3FsVmFsdWUpW2luZGV4XSwgCisgICAgICAgICAgICAgICAgcHN0YXRlLmdldENvbHVtbihpbmRleCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kVmFsdWUocHN0YXRlLnNxbFZhbHVlLCBwc3RhdGUuZ2V0Q29sdW1uKGluZGV4KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9RdWVyeUV4cHJlc3Npb25zU3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvUXVlcnlFeHByZXNzaW9uc1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwMWIxYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvUXVlcnlFeHByZXNzaW9uc1N0YXRlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworLyoqCisgKiBTdHJ1Y3QgdG8gaG9sZCB0aGUgc3RhdGUgb2YgYSBxdWVyeSBleHByZXNzaW9ucyBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUXVlcnlFeHByZXNzaW9uc1N0YXRlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRXhwU3RhdGVbXSBFTVBUWV9TVEFURVMgPSBuZXcgRXhwU3RhdGVbMF07CisKKyAgICBwdWJsaWMgRXhwU3RhdGVbXSBwcm9qZWN0aW9ucyA9IEVNUFRZX1NUQVRFUzsKKyAgICBwdWJsaWMgRXhwU3RhdGUgZmlsdGVyID0gbnVsbDsKKyAgICBwdWJsaWMgRXhwU3RhdGVbXSBncm91cGluZyA9IEVNUFRZX1NUQVRFUzsKKyAgICBwdWJsaWMgRXhwU3RhdGUgaGF2aW5nID0gbnVsbDsKKyAgICBwdWJsaWMgRXhwU3RhdGVbXSBvcmRlcmluZyA9IEVNUFRZX1NUQVRFUzsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU1FMRW1iZWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU1FMRW1iZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODVkYThmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TUUxFbWJlZC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIFNpbXBsZSBsaXN0ZW5lciB3aGljaCBlbWJlZHMgaXRzIFNRTCBhcmd1bWVudCBpbnRvIHRoZSBxdWVyeS4gTGlzdGVucworICogb24gPGNvZGU+c3FsPC9jb2RlPi4KKyAqICBFeGFtcGxlOjxiciAvPgorICogPGNvZGU+InByaWNlICZsdDsgc3FsKFwiKFNFTEVDVCBBVkcgKFBSSUNFKSBGUk9NIFBST0RVQ1RfVEFCTEUpXCIpIjwvY29kZT4KKyAqCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxFbWJlZAorICAgIGltcGxlbWVudHMgSkRCQ0ZpbHRlckxpc3RlbmVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBRyA9ICJzcWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZShTUUxFbWJlZC5jbGFzcyk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuIFRBRzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBlY3RzQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBlY3RzVGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgdGFyZ2V0LCBDbGFzcyB0YXJnZXRDbGFzcywgT2JqZWN0W10gYXJncywKKyAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzLCBPYmplY3QgY2FuZGlkYXRlLCBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgibm8taW4tbWVtIiwgVEFHKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgdGFyZ2V0LCBGaWx0ZXJWYWx1ZVtdIGFyZ3MsCisgICAgICAgIENsYXNzTWFwcGluZyB0eXBlLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgaWYgKCFhcmdzWzBdLmlzQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb25zdC1vbmx5IiwgVEFHKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoYXJnc1swXS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKENsYXNzIHRhcmdldENsYXNzLCBDbGFzc1tdIGFyZ0NsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1NRTEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU1FMRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmU4MjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1NRTEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCisvKioKKyAqIFNpbXBsZSBsaXN0ZW5lciB3aGljaCBlbWJlZHMgdGhlIGFyZ3VtZW50IGFzIGFuIGV4cHJlc3Npb24gaW50byB0aGUKKyAqIHdoZXJlIGNsYXVzZSBnZW5lcmF0ZWQgYnkgdGhlIHF1ZXJ5LiBMaXN0ZW5zIG9uICJleHQ6c3FsRXhwIi4KKyAqICBFeGFtcGxlOjxiciAvPgorICogPGNvZGU+CisgKiAicHJpY2UgJmx0OyAxMCB8fCBleHQ6c3FsRXhwIChcIihTRUxFQ1QgQVZHIChQUklDRSkgRlJPTSBQUk9EVUNUX1RBQkxFKQorICogJmd0OyAxMDBcIikiCisgKiA8L2NvZGU+CisgKgorICogQG5vamF2YWRvYworICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTUUxFbWJlZH0gZGlyZWN0bHkKKyAqLworcHVibGljIGNsYXNzIFNRTEV4cHJlc3Npb24KKyAgICBleHRlbmRzIFNRTEVtYmVkIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJzcWxFeHAiOworCisgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBUQUc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TUUxWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TUUxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1NRTFZhbHVlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworLyoqCisgKiBTaW1wbGUgbGlzdGVuZXIgd2hpY2ggZW1iZWRzIHRoZSBhcmd1bWVudCBhcyBhIHZhbHVlIGludG8gdGhlIHdoZXJlCisgKiBjbGF1c2UgZ2VuZXJhdGVkIGJ5IHRoZSBxdWVyeS4gTGlzdGVucyBvbiAiZXh0OnNxbFZhbCIuCisgKiAgRXhhbXBsZTo8YnIgLz4KKyAqIDxjb2RlPiAicHJpY2UgJmx0OyBleHQ6c3FsVmFsIChcIihTRUxFQ1QgQVZHIChQUklDRSkgRlJPTSBQUk9EVUNUX1RBQkxFKVwiKSIKKyAqIDwvY29kZT4KKyAqCisgKiBAbm9qYXZhZG9jCisgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNRTEVtYmVkfSBkaXJlY3RseQorICovCitwdWJsaWMgY2xhc3MgU1FMVmFsdWUKKyAgICBleHRlbmRzIFNRTEVtYmVkIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJzcWxWYWwiOworCisgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBUQUc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TZWxlY3RDb25zdHJ1Y3Rvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TZWxlY3RDb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2IzMGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1NlbGVjdENvbnN0cnVjdG9yLmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BYnN0cmFjdEV4cHJlc3Npb25WaXNpdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5Db25zdGFudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuUXVlcnlFeHByZXNzaW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuVmFsdWU7CisKKy8qKgorICogVHVybnMgcGFyc2VkIHF1ZXJpZXMgaW50byBzZWxlY3RzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTZWxlY3RDb25zdHJ1Y3RvciB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gX2V4dGVudCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgd2Uga25vdyB0aGUgc2VsZWN0IHRvIGhhdmUgb24gY3JpdGVyaWE7IHRvIGJlIGFuIGV4dGVudC4KKyAgICAgKiBOb3RlIHRoYXQgZXZlbiBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB7QGxpbmsgI2V2YWx1YXRlfSBtYXkgc3RpbGwKKyAgICAgKiByZXR1cm4gbnVsbCBpZiB3ZSBoYXZlbid0IGNhY2hlZCB3aGV0aGVyIHRoZSBxdWVyeSBpcyBhbiBleHRlbnQgeWV0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW50KCkgeworICAgICAgICByZXR1cm4gX2V4dGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiwgcmV0dXJuaW5nIGEgbmV3IHNlbGVjdCBhbmQgZmlsbGluZyBpbiBhbnkKKyAgICAgKiBhc3NvY2lhdGVkIGV4cHJlc3Npb24gc3RhdGUuIFVzZSB7QGxpbmsgI3NlbGVjdH0gdG8gdGhlbiBzZWxlY3QgdGhlIGRhdGEuCisgICAgICogCisgICAgICogQHBhcmFtIGN0eCBmaWxsIHdpdGggZXhlY3V0aW9uIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gc3RhdGUgd2lsbCBiZSBmaWxsZWQgd2l0aCBleHByZXNzaW9uIHN0YXRlCisgICAgICovCisgICAgcHVibGljIFNlbGVjdCBldmFsdWF0ZShFeHBDb250ZXh0IGN0eCwgU2VsZWN0IHBhcmVudCwgU3RyaW5nIGFsaWFzLCAKKyAgICAgICAgUXVlcnlFeHByZXNzaW9ucyBleHBzLCBRdWVyeUV4cHJlc3Npb25zU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBrbm93IHRoYXQgdGhpcyBxdWVyeSBpcyBlcXVpdmFsZW50IHRvIGFuIGV4dGVudD8KKyAgICAgICAgU2VsZWN0IHNlbDsKKyAgICAgICAgaWYgKF9leHRlbnQpIHsKKyAgICAgICAgICAgIHNlbCA9IGN0eC5zdG9yZS5nZXRTUUxGYWN0b3J5KCkubmV3U2VsZWN0KCk7CisgICAgICAgICAgICBzZWwuc2V0QXV0b0Rpc3RpbmN0KChleHBzLmRpc3RpbmN0ICYgZXhwcy5ESVNUSU5DVF9BVVRPKSAhPSAwKTsKKyAgICAgICAgICAgIHJldHVybiBzZWw7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBuZXcgc2VsZWN0IGFuZCBpbml0aWFsaXplIGl0IHdpdGggdGhlIGpvaW5zIG5lZWRlZCBmb3IKKyAgICAgICAgLy8gdGhlIGNyaXRlcmlhIG9mIHRoaXMgcXVlcnkKKyAgICAgICAgc2VsID0gbmV3U2VsZWN0KGN0eCwgcGFyZW50LCBhbGlhcywgZXhwcywgc3RhdGUpOworCisgICAgICAgIC8vIGNyZWF0ZSB3aGVyZSBjbGF1c2U7IGlmIHRoZXJlIGFyZSBubyB3aGVyZSBjb25kaXRpb25zIGFuZAorICAgICAgICAvLyBubyBvcmRlcmluZyBvciBwcm9qZWN0aW9ucywgd2UgcmV0dXJuIG51bGwgdG8gc2lnbmlmeSB0aGF0IHRoaXMKKyAgICAgICAgLy8gcXVlcnkgc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhbiBleHRlbnQKKyAgICAgICAgU2VsZWN0IGlubmVyID0gc2VsLmdldEZyb21TZWxlY3QoKTsKKyAgICAgICAgU1FMQnVmZmVyIHdoZXJlID0gYnVpbGRXaGVyZSgoaW5uZXIgIT0gbnVsbCkgPyBpbm5lciA6IHNlbCwgY3R4LCAKKyAgICAgICAgICAgIHN0YXRlLmZpbHRlciwgZXhwcy5maWx0ZXIpOworICAgICAgICBpZiAod2hlcmUgPT0gbnVsbCAmJiBleHBzLnByb2plY3Rpb25zLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAmJiBleHBzLm9yZGVyaW5nLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAmJiAoc2VsLmdldEpvaW5zKCkgPT0gbnVsbCB8fCBzZWwuZ2V0Sm9pbnMoKS5pc0VtcHR5KCkpKSB7CisgICAgICAgICAgICBfZXh0ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlbC5zZXRBdXRvRGlzdGluY3QoKGV4cHMuZGlzdGluY3QgJiBleHBzLkRJU1RJTkNUX0FVVE8pICE9IDApOworICAgICAgICAgICAgcmV0dXJuIHNlbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBzZXQgc3FsIGNyaXRlcmlhOyBpdCBnb2VzIG9uIHRoZSBpbm5lciBzZWxlY3QgaWYgcHJlc2VudAorICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGlubmVyLndoZXJlKHdoZXJlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsLndoZXJlKHdoZXJlKTsKKworICAgICAgICAvLyBhcHBseSBncm91cGluZyBhbmQgaGF2aW5nLiAgdGhpcyBkb2VzIG5vdCBzZWxlY3QgdGhlIGdyb3VwaW5nCisgICAgICAgIC8vIGNvbHVtbnMsIGp1c3QgYnVpbGRzIHRoZSBHUk9VUCBCWSBjbGF1c2VzLiAgd2UgZG9uJ3QgYnVpbGQgdGhlCisgICAgICAgIC8vIE9SREVSIEJZIGNsYXVzZXMgeWV0IGJlY2F1c2UgaWYgd2UgZGVjaWRlIHRvIGFkZCB0aGlzIHNlbGVjdAorICAgICAgICAvLyB0byBhIHVuaW9uLCB0aGUgT1JERVIgQlkgdmFsdWVzIGdldCBhbGlhc2VkIGRpZmZlcmVudGx5CisgICAgICAgIGlmIChleHBzLmhhdmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBFeHAgaGF2aW5nRXhwID0gKEV4cCkgZXhwcy5oYXZpbmc7CisgICAgICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICAgICAgaGF2aW5nRXhwLmFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZS5oYXZpbmcsIGJ1Zik7CisgICAgICAgICAgICBzZWwuaGF2aW5nKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLmdyb3VwaW5nLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgKChWYWwpIGV4cHMuZ3JvdXBpbmdbaV0pLmdyb3VwQnkoc2VsLCBjdHgsIHN0YXRlLmdyb3VwaW5nW2ldKTsKKyAgICAgICAgcmV0dXJuIHNlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgc2VsZWN0IHdpdGggZXhwcmVzc2lvbnMgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZWxlY3QgbmV3U2VsZWN0KEV4cENvbnRleHQgY3R4LCBTZWxlY3QgcGFyZW50LAorICAgICAgICBTdHJpbmcgYWxpYXMsIFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgUXVlcnlFeHByZXNzaW9uc1N0YXRlIHN0YXRlKSB7CisgICAgICAgIFNlbGVjdCBzZWwgPSBjdHguc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1NlbGVjdCgpOworICAgICAgICBzZWwuc2V0QXV0b0Rpc3RpbmN0KChleHBzLmRpc3RpbmN0ICYgZXhwcy5ESVNUSU5DVF9BVVRPKSAhPSAwKTsKKyAgICAgICAgc2VsLnNldEpvaW5TeW50YXgoY3R4LmZldGNoLmdldEpvaW5TeW50YXgoKSk7CisgICAgICAgIHNlbC5zZXRQYXJlbnQocGFyZW50LCBhbGlhcyk7CisgICAgICAgIGluaXRpYWxpemUoc2VsLCBjdHgsIGV4cHMsIHN0YXRlKTsKKworICAgICAgICBpZiAoIXNlbC5nZXRBdXRvRGlzdGluY3QoKSkgeworICAgICAgICAgICAgaWYgKChleHBzLmRpc3RpbmN0ICYgZXhwcy5ESVNUSU5DVF9UUlVFKSAhPSAwKQorICAgICAgICAgICAgICAgIHNlbC5zZXREaXN0aW5jdCh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChleHBzLmRpc3RpbmN0ICYgZXhwcy5ESVNUSU5DVF9GQUxTRSkgIT0gMCkKKyAgICAgICAgICAgICAgICBzZWwuc2V0RGlzdGluY3QoZmFsc2UpOworICAgICAgICB9IGVsc2UgaWYgKGV4cHMucHJvamVjdGlvbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgaWYgKCFzZWwuaXNEaXN0aW5jdCgpICYmIChleHBzLmRpc3RpbmN0ICYgZXhwcy5ESVNUSU5DVF9UUlVFKSAhPSAwKXsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2VsZWN0IGlzIG5vdCBkaXN0aW5jdCBidXQgdGhlIHF1ZXJ5IGlzLCBmb3JjZQorICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3QgdG8gYmUgZGlzdGluY3QKKyAgICAgICAgICAgICAgICBzZWwuc2V0RGlzdGluY3QodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbC5pc0Rpc3RpbmN0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyB3aGVuIGFnZ3JlZ2F0aW5nIGRhdGEgb3IgbWFraW5nIGEgbm9uLWRpc3RpbmN0IHByb2plY3Rpb24KKyAgICAgICAgICAgICAgICAvLyBmcm9tIGEgZGlzdGluY3Qgc2VsZWN0LCB3ZSBoYXZlIHRvIHNlbGVjdCBmcm9tIGEgdG1wCisgICAgICAgICAgICAgICAgLy8gdGFibGUgZm9ybWVkIGJ5IGEgZGlzdGluY3Qgc3Vic2VsZWN0IGluIHRoZSBmcm9tIGNsYXVzZTsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN1YnNlbGVjdCBzZWxlY3RzIHRoZSBwa3Mgb2YgdGhlIGNhbmRpZGF0ZSAodG8KKyAgICAgICAgICAgICAgICAvLyBnZXQgdW5pcXVlIGNhbmRpZGF0ZSB2YWx1ZXMpIGFuZCBuZWVkZWQgZmllbGQgdmFsdWVzIGFuZAorICAgICAgICAgICAgICAgIC8vIGFwcGxpZXMgdGhlIHdoZXJlIGNvbmRpdGlvbnM7IHRoZSBvdXRlciBzZWxlY3QgYXBwbGllcworICAgICAgICAgICAgICAgIC8vIG9yZGVyaW5nLCBncm91cGluZywgZXRjCisgICAgICAgICAgICAgICAgYm9vbGVhbiBhZ2cgPSBleHBzLmlzQWdncmVnYXRlKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjYW5kaWRhdGUgPSBQcm9qZWN0aW9uRXhwcmVzc2lvblZpc2l0b3IuCisgICAgICAgICAgICAgICAgICAgIGhhc0NhbmRpZGF0ZVByb2plY3Rpb25zKGV4cHMucHJvamVjdGlvbnMpOworICAgICAgICAgICAgICAgIGlmIChhZ2cgfHwgKGNhbmRpZGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKGV4cHMuZGlzdGluY3QgJiBleHBzLkRJU1RJTkNUX1RSVUUpID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICAgICAgICAgICAgICBkaWN0LmFzc2VydFN1cHBvcnQoZGljdC5zdXBwb3J0c1N1YnNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdXBwb3J0c1N1YnNlbGVjdCIpOworCisgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBpbm5lciA9IHNlbDsKKyAgICAgICAgICAgICAgICAgICAgc2VsID0gY3R4LnN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdTZWxlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsLnNldFBhcmVudChwYXJlbnQsIGFsaWFzKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsLnNldERpc3RpbmN0KGFnZworICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGV4cHMuZGlzdGluY3QgJiBleHBzLkRJU1RJTkNUX1RSVUUpICE9IDApOworICAgICAgICAgICAgICAgICAgICBzZWwuc2V0RnJvbVNlbGVjdChpbm5lcik7CisKKyAgICAgICAgICAgICAgICAvLyBhdXRvLWRpc3RpbmN0aW5nIGhhcHBlbnMgdG8gZ2V0IHVuaXF1ZSBjYW5kaWRhdGUgaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgLy8gYmFjazsgZG9uJ3QgYXV0by1kaXN0aW5jdCBpZiB0aGUgdXNlciBpc24ndCBzZWxlY3RpbmcgCisgICAgICAgICAgICAgICAgLy8gY2FuZGlkYXRlIGRhdGEKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjYW5kaWRhdGUgCisgICAgICAgICAgICAgICAgICAgICYmIChleHBzLmRpc3RpbmN0ICYgZXhwcy5ESVNUSU5DVF9UUlVFKSA9PSAwKSAKKyAgICAgICAgICAgICAgICAgICAgc2VsLnNldERpc3RpbmN0KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYWxsIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBRdWVyeUV4cHJlc3Npb25zIGV4cHMsIAorICAgICAgICBRdWVyeUV4cHJlc3Npb25zU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgTWFwIGNvbnRhaW5zID0gbnVsbDsKKyAgICAgICAgaWYgKEhhc0NvbnRhaW5zRXhwcmVzc2lvblZpc2l0b3IuaGFzQ29udGFpbnMoZXhwcy5maWx0ZXIpCisgICAgICAgICAgICB8fCBIYXNDb250YWluc0V4cHJlc3Npb25WaXNpdG9yLmhhc0NvbnRhaW5zKGV4cHMuaGF2aW5nKSkKKyAgICAgICAgICAgIGNvbnRhaW5zID0gbmV3IEhhc2hNYXAoNyk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBmaWx0ZXIgYW5kIGhhdmluZyBleHByZXNzaW9ucworICAgICAgICBFeHAgZmlsdGVyRXhwID0gKEV4cCkgZXhwcy5maWx0ZXI7CisgICAgICAgIHN0YXRlLmZpbHRlciA9IGZpbHRlckV4cC5pbml0aWFsaXplKHNlbCwgY3R4LCBjb250YWlucyk7CisgICAgICAgIEV4cCBoYXZpbmdFeHAgPSAoRXhwKSBleHBzLmhhdmluZzsKKyAgICAgICAgaWYgKGhhdmluZ0V4cCAhPSBudWxsKQorICAgICAgICAgICAgc3RhdGUuaGF2aW5nID0gaGF2aW5nRXhwLmluaXRpYWxpemUoc2VsLCBjdHgsIGNvbnRhaW5zKTsKKworICAgICAgICAvLyBnZXQgdGhlIHRvcC1sZXZlbCBqb2lucyBhbmQgbnVsbCB0aGUgZXhwcmVzc2lvbidzIGpvaW5zCisgICAgICAgIC8vIGF0IHRoZSBzYW1lIHRpbWUgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIHdoZXJlL2hhdmluZyBTUUwKKyAgICAgICAgSm9pbnMgZmlsdGVySm9pbnMgPSBzdGF0ZS5maWx0ZXIuam9pbnM7CisgICAgICAgIEpvaW5zIGhhdmluZ0pvaW5zID0gKHN0YXRlLmhhdmluZyA9PSBudWxsKSA/IG51bGwgOiBzdGF0ZS5oYXZpbmcuam9pbnM7CisgICAgICAgIEpvaW5zIGpvaW5zID0gc2VsLmFuZChmaWx0ZXJKb2lucywgaGF2aW5nSm9pbnMpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgcmVzdWx0IHZhbHVlcworICAgICAgICBpZiAoZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBzdGF0ZS5wcm9qZWN0aW9ucyA9IG5ldyBFeHBTdGF0ZVtleHBzLnByb2plY3Rpb25zLmxlbmd0aF07CisgICAgICAgICAgICBWYWwgcmVzdWx0VmFsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLnByb2plY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0VmFsID0gKFZhbCkgZXhwcy5wcm9qZWN0aW9uc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIGpvaW4gdGhyb3VnaCB0byByZWxhdGVkIHR5cGUgZm9yIHBjIG9iamVjdCAKKyAgICAgICAgICAgICAgICAvLyBwcm9qZWN0aW9uczsgdGhpcyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSBhbGwgb3VyIGpvaW5zIGNhY2hlZAorICAgICAgICAgICAgICAgIHN0YXRlLnByb2plY3Rpb25zW2ldID0gcmVzdWx0VmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIAorICAgICAgICAgICAgICAgICAgICBWYWwuSk9JTl9SRUwgfCBWYWwuRk9SQ0VfT1VURVIpOworICAgICAgICAgICAgICAgIGpvaW5zID0gc2VsLmFuZChqb2lucywgc3RhdGUucHJvamVjdGlvbnNbaV0uam9pbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBncm91cGluZworICAgICAgICBpZiAoZXhwcy5ncm91cGluZy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBzdGF0ZS5ncm91cGluZyA9IG5ldyBFeHBTdGF0ZVtleHBzLmdyb3VwaW5nLmxlbmd0aF07CisgICAgICAgICAgICBWYWwgZ3JvdXBWYWw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cHMuZ3JvdXBpbmcubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBncm91cFZhbCA9IChWYWwpIGV4cHMuZ3JvdXBpbmdbaV07CisgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBqb2luIHRocm91Z2ggdG8gcmVsYXRlZCB0eXBlIGZvciBwYyBvYmplY3QgZ3JvdXBpbmdzOworICAgICAgICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhdmUgYWxsIG91ciBqb2lucyBjYWNoZWQKKyAgICAgICAgICAgICAgICBzdGF0ZS5ncm91cGluZ1tpXSA9IGdyb3VwVmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIFZhbC5KT0lOX1JFTCk7CisgICAgICAgICAgICAgICAgam9pbnMgPSBzZWwuYW5kKGpvaW5zLCBzdGF0ZS5ncm91cGluZ1tpXS5qb2lucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsaXplIG9yZGVyaW5nCisgICAgICAgIGlmIChleHBzLm9yZGVyaW5nLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHN0YXRlLm9yZGVyaW5nID0gbmV3IEV4cFN0YXRlW2V4cHMub3JkZXJpbmcubGVuZ3RoXTsKKyAgICAgICAgICAgIFZhbCBvcmRlclZhbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwcy5vcmRlcmluZy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG9yZGVyVmFsID0gKFZhbCkgZXhwcy5vcmRlcmluZ1tpXTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5vcmRlcmluZ1tpXSA9IG9yZGVyVmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICAgICAgICAgIGpvaW5zID0gc2VsLmFuZChqb2lucywgc3RhdGUub3JkZXJpbmdbaV0uam9pbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNlbC53aGVyZShqb2lucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSB3aGVyZSBzcWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTUUxCdWZmZXIgYnVpbGRXaGVyZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBFeHByZXNzaW9uIGZpbHRlcikgeworICAgICAgICAvLyBjcmVhdGUgd2hlcmUgYnVmZmVyCisgICAgICAgIFNRTEJ1ZmZlciB3aGVyZSA9IG5ldyBTUUxCdWZmZXIoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgd2hlcmUuYXBwZW5kKCIoIik7CisgICAgICAgIEV4cCBmaWx0ZXJFeHAgPSAoRXhwKSBmaWx0ZXI7CisgICAgICAgIGZpbHRlckV4cC5hcHBlbmRUbyhzZWwsIGN0eCwgc3RhdGUsIHdoZXJlKTsKKworICAgICAgICBpZiAod2hlcmUuc3FsRXF1YWxzKCIoIikgfHwgd2hlcmUuc3FsRXF1YWxzKCIoMSA9IDEiKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gd2hlcmUuYXBwZW5kKCIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBkYXRhIGZvciB0aGlzIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgIGJvb2xlYW4gc3ViY2xhc3NlcywgUXVlcnlFeHByZXNzaW9ucyBleHBzLCBRdWVyeUV4cHJlc3Npb25zU3RhdGUgc3RhdGUsCisgICAgICAgIGludCBlYWdlcikgeworICAgICAgICBTZWxlY3QgaW5uZXIgPSBzZWwuZ2V0RnJvbVNlbGVjdCgpOworICAgICAgICBWYWwgdmFsOworICAgICAgICBKb2lucyBqb2lucyA9IG51bGw7CisgICAgICAgIGlmIChzZWwuZ2V0U3Vic2VsZWN0UGF0aCgpICE9IG51bGwpCisgICAgICAgICAgICBqb2lucyA9IHNlbC5uZXdKb2lucygpLnNldFN1YnNlbGVjdChzZWwuZ2V0U3Vic2VsZWN0UGF0aCgpKTsKKworICAgICAgICAvLyBidWlsZCBvcmRlcmluZyBjbGF1c2VzIGJlZm9yZSBzZWxlY3Qgc28gdGhhdCBhbnkgZWFnZXIgam9pbgorICAgICAgICAvLyBvcmRlcmluZyBnZXRzIGFwcGxpZWQgYWZ0ZXIgcXVlcnkgb3JkZXJpbmcKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLm9yZGVyaW5nLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgKChWYWwpIGV4cHMub3JkZXJpbmdbaV0pLm9yZGVyQnkoc2VsLCBjdHgsIHN0YXRlLm9yZGVyaW5nW2ldLAorICAgICAgICAgICAgICAgIGV4cHMuYXNjZW5kaW5nW2ldKTsKKworICAgICAgICAvLyBpZiBubyByZXN1bHQgc3RyaW5nIHNldCwgc2VsZWN0IG1hdGNoaW5nIG9iamVjdHMgbGlrZSBub3JtYWwKKyAgICAgICAgaWYgKGV4cHMucHJvamVjdGlvbnMubGVuZ3RoID09IDAgJiYgc2VsLmdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzdWJzID0gKHN1YmNsYXNzZXMpID8gU2VsZWN0LlNVQlNfSk9JTkFCTEUgOiBTZWxlY3QuU1VCU19OT05FOworICAgICAgICAgICAgc2VsLnNlbGVjdElkZW50aWZpZXIobWFwcGluZywgc3VicywgY3R4LnN0b3JlLCBjdHguZmV0Y2gsIGVhZ2VyKTsKKyAgICAgICAgfSBlbHNlIGlmIChleHBzLnByb2plY3Rpb25zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyBzdWJzZWxlY3QgZm9yIG9iamVjdHM7IHdlIHJlYWxseSBqdXN0IG5lZWQgdGhlIHByaW1hcnkga2V5IHZhbHVlcworICAgICAgICAgICAgc2VsLnNlbGVjdChtYXBwaW5nLmdldFByaW1hcnlLZXlDb2x1bW5zKCksIGpvaW5zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gaW5uZXIgc2VsZWN0LCB3ZSBuZWVkIHRvIHNlbGVjdCB0aGUgY2FuZGlkYXRlCisgICAgICAgICAgICAvLyBjbGFzcycgcGsgY29sdW1ucyB0byBndWFyYW50ZWUgdW5pcXVlIGluc3RhbmNlcworICAgICAgICAgICAgaWYgKGlubmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgaW5uZXIuc2VsZWN0KG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwgam9pbnMpOworCisgICAgICAgICAgICAvLyBzZWxlY3QgZWFjaCByZXN1bHQgdmFsdWU7IG5vIG5lZWQgdG8gcGFzcyBvbiB0aGUgZWFnZXIgbW9kZSBzaW5jZQorICAgICAgICAgICAgLy8gdW5kZXIgcHJvamVjdGlvbnMgd2UgYWx3YXlzIHVzZSBFQUdFUl9OT05FCisgICAgICAgICAgICBib29sZWFuIHBrcyA9IHNlbC5nZXRQYXJlbnQoKSAhPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLnByb2plY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsID0gKFZhbCkgZXhwcy5wcm9qZWN0aW9uc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdmFsLnNlbGVjdENvbHVtbnMoaW5uZXIsIGN0eCwgc3RhdGUucHJvamVjdGlvbnNbaV0sIHBrcyk7CisgICAgICAgICAgICAgICAgdmFsLnNlbGVjdChzZWwsIGN0eCwgc3RhdGUucHJvamVjdGlvbnNbaV0sIHBrcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBoYXZpbmcgY29sdW1ucyBhcmUgc2VsZWN0ZWQgc2luY2UgaXQgaXMgcmVxdWlyZWQgYnkgCisgICAgICAgICAgICAvLyBzb21lIERCcy4gIHB1dCB0aGVtIGxhc3Qgc28gdGhleSBkb24ndCBhZmZlY3QgcmVzdWx0IHByb2Nlc3NpbmcKKyAgICAgICAgICAgIGlmIChleHBzLmhhdmluZyAhPSBudWxsICYmIGlubmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgKChFeHApIGV4cHMuaGF2aW5nKS5zZWxlY3RDb2x1bW5zKGlubmVyLCBjdHgsIHN0YXRlLmhhdmluZywgCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VsZWN0IG9yZGVyaW5nIGNvbHVtbnMsIHNpbmNlIGl0IGlzIHJlcXVpcmVkIGJ5IHNvbWUgREJzLiAgcHV0IHRoZW0KKyAgICAgICAgLy8gbGFzdCBzbyB0aGV5IGRvbid0IGFmZmVjdCByZXN1bHQgcHJvY2Vzc2luZworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cHMub3JkZXJpbmcubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHZhbCA9IChWYWwpIGV4cHMub3JkZXJpbmdbaV07CisgICAgICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWwuc2VsZWN0Q29sdW1ucyhpbm5lciwgY3R4LCBzdGF0ZS5vcmRlcmluZ1tpXSwgdHJ1ZSk7CisgICAgICAgICAgICB2YWwuc2VsZWN0KHNlbCwgY3R4LCBzdGF0ZS5vcmRlcmluZ1tpXSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgY29uZGl0aW9ucyBsaW1pdGluZyB0aGUgcHJvamVjdGlvbnMgdG8gdGhlIHByb3BlciBjbGFzc2VzOyBpZgorICAgICAgICAvLyB0aGlzIGlzbid0IGEgcHJvamVjdGlvbiB0aGVuIHRoZXkgd2lsbCBhbHJlYWR5IGJlIGFkZGVkCisgICAgICAgIGlmIChleHBzLnByb2plY3Rpb25zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGN0eC5zdG9yZS5sb2FkU3ViY2xhc3NlcyhtYXBwaW5nKTsKKyAgICAgICAgICAgIG1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvcigpLmFkZENsYXNzQ29uZGl0aW9ucygoaW5uZXIgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgPyBpbm5lciA6IHNlbCwgc3ViY2xhc3Nlcywgam9pbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBjaGVjayB3aGV0aGVyIGEgcXVlcnkncyByZXN1bHQgcHJvamVjdGlvbnMgYXJlIG9uIHRoZSBjYW5kaWRhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvamVjdGlvbkV4cHJlc3Npb25WaXNpdG9yCisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9jYW5kaWRhdGUgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2xldmVsID0gMDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ2FuZGlkYXRlUHJvamVjdGlvbnMoVmFsdWVbXSBwcm9qcykgeworICAgICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb25WaXNpdG9yIHYgPSBuZXcgUHJvamVjdGlvbkV4cHJlc3Npb25WaXNpdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2pzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHJvanNbaV0uYWNjZXB0VmlzaXQodik7CisgICAgICAgICAgICAgICAgaWYgKHYuX2NhbmRpZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcihWYWx1ZSB2YWwpIHsKKyAgICAgICAgICAgIGlmICghX2NhbmRpZGF0ZSkgeworICAgICAgICAgICAgICAgIF9jYW5kaWRhdGUgPSAoX2xldmVsID09IDAgJiYgdmFsIGluc3RhbmNlb2YgQ29uc3RhbnQpCisgICAgICAgICAgICAgICAgICAgIHx8ICh2YWwgaW5zdGFuY2VvZiBQQ1BhdGggCisgICAgICAgICAgICAgICAgICAgICYmICEoKFBDUGF0aCkgdmFsKS5pc1ZhcmlhYmxlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9sZXZlbCsrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXhpdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgICAgIF9sZXZlbC0tOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TaXplLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1NpemUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRiNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TaXplLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaXplLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIFNpemUKKyAgICBleHRlbmRzIFVuYXJ5T3AgeworCisgICAgcHVibGljIFNpemUoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBFeHBTdGF0ZSBpbml0aWFsaXplKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUgd2l0aCBhIG51bGwgdGVzdAorICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZVZhbHVlKHNlbCwgY3R4LCBOVUxMX0NNUCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgICAgIGdldFZhbHVlKCkuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgZ2V0VmFsdWUoKS5hcHBlbmRTaXplKHNlbCwgY3R4LCBzdGF0ZSwgc3FsKTsKKyAgICAgICAgc2VsLmFwcGVuZChzcWwsIHN0YXRlLmpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBsb25nLmNsYXNzOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIC8vIHNpbmNlIHdlIG92ZXJyaWRlIGFwcGVuZFRvKCksIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TcXJ0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1NxcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmRiNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TcXJ0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworLyoqCisgKiBTcXVhcmUgcm9vdC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBTcXJ0CisgICAgZXh0ZW5kcyBVbmFyeU9wIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZSB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBTcXJ0KFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBkb3VibGUuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuICJTUVJUIjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3RhcnRzV2l0aEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3RhcnRzV2l0aEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVmYTYxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TdGFydHNXaXRoRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBUZXN0IGlmIG9uZSBzdHJpbmcgc3RhcnRzIHdpdGggYW5vdGhlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBTdGFydHNXaXRoRXhwcmVzc2lvbgorICAgIGltcGxlbWVudHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwxOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIFN0YXJ0c1dpdGhFeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBfdmFsMSA9IHZhbDE7CisgICAgICAgIF92YWwyID0gdmFsMjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgTWFwIGNvbnRhaW5zKSB7CisgICAgICAgIEV4cFN0YXRlIHMxID0gX3ZhbDEuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIEV4cFN0YXRlIHMyID0gX3ZhbDIuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BFeHBTdGF0ZShzZWwuYW5kKHMxLmpvaW5zLCBzMi5qb2lucyksIHMxLCBzMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBCaW5hcnlPcEV4cFN0YXRlIGJzdGF0ZSA9IChCaW5hcnlPcEV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgX3ZhbDEuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwyLCBic3RhdGUuc3RhdGUyKTsKKyAgICAgICAgX3ZhbDIuY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIF92YWwxLCBic3RhdGUuc3RhdGUxKTsKKworICAgICAgICBpZiAoX3ZhbDEgaW5zdGFuY2VvZiBDb25zdCAKKyAgICAgICAgICAgICYmICgoQ29uc3QpIF92YWwxKS5nZXRWYWx1ZShjdHgsIGJzdGF0ZS5zdGF0ZTEpID09IG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIxIDw+IDEiKTsKKyAgICAgICAgZWxzZSBpZiAoX3ZhbDIgaW5zdGFuY2VvZiBDb25zdCkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSAoKENvbnN0KSBfdmFsMikuZ2V0VmFsdWUoY3R4LCBic3RhdGUuc3RhdGUyKTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiMSA8PiAxIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2x1bW4gY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoX3ZhbDEgaW5zdGFuY2VvZiBQQ1BhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sdW1uW10gY29scyA9ICgoUENQYXRoKSBfdmFsMSkuZ2V0Q29sdW1ucyhic3RhdGUuc3RhdGUxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjb2xzWzBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF92YWwxLmFwcGVuZFRvKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBidWYsIDApOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBMSUtFICIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmRWYWx1ZShvLnRvU3RyaW5nKCkgKyAiJSIsIGNvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgcHJlID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBwb3N0ID0gbnVsbDsKKyAgICAgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICAgICAgU3RyaW5nIGZ1bmMgPSBkaWN0LnN0cmluZ0xlbmd0aEZ1bmN0aW9uOworICAgICAgICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBmdW5jLmluZGV4T2YoInswfSIpOworICAgICAgICAgICAgICAgIHByZSA9IGZ1bmMuc3Vic3RyaW5nKDAsIGlkeCk7CisgICAgICAgICAgICAgICAgcG9zdCA9IGZ1bmMuc3Vic3RyaW5nKGlkeCArIDMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCB1c2UgTElLRSwgd2UgaGF2ZSB0byB0YWtlIHRoZSBzdWJzdHJpbmcgb2YgdGhlCisgICAgICAgICAgICAvLyBmaXJzdCB2YWx1ZSBhbmQgY29tcGFyZSBpdCB0byB0aGUgc2Vjb25kCisgICAgICAgICAgICBkaWN0LmFzc2VydFN1cHBvcnQocHJlICE9IG51bGwsICJTdHJpbmdMZW5ndGhGdW5jdGlvbiIpOworICAgICAgICAgICAgZGljdC5zdWJzdHJpbmcoYnVmLAorICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIF92YWwxKSwKKyAgICAgICAgICAgICAgICBuZXcgWmVyb0ZpbHRlclZhbHVlKHNlbCwgc3RhdGUpLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdMZW5ndGhGaWx0ZXJWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMiwgcHJlLHBvc3QpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgX3ZhbDIuYXBwZW5kVG8oc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBzZWwuYXBwZW5kKGJ1Ziwgc3RhdGUuam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBic3RhdGUgPSAoQmluYXJ5T3BFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIF92YWwxLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIHRydWUpOworICAgICAgICBfdmFsMi5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwxLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdmFsMi5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFplcm9GaWx0ZXJWYWx1ZQorICAgICAgICBpbXBsZW1lbnRzIEZpbHRlclZhbHVlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdCBfc2VsOworICAgICAgICBwcml2YXRlIGZpbmFsIEV4cFN0YXRlIF9zdGF0ZTsKKworICAgICAgICBwdWJsaWMgWmVyb0ZpbHRlclZhbHVlKFNlbGVjdCBzZWwsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBfc2VsID0gc2VsOworICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICAgICAgYXBwZW5kVG8oYnVmLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNRTEJ1ZmZlciBidWYsIGludCBpbmRleCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZFZhbHVlKDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhDb2x1bW4gY29sKSB7CisgICAgICAgICAgICByZXR1cm4gX3NlbC5nZXRDb2x1bW5BbGlhcyhjb2wsIF9zdGF0ZS5qb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKFN0cmluZyBjb2wsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gX3NlbC5nZXRDb2x1bW5BbGlhcyhjb2wsIHRhYmxlLCBfc3RhdGUuam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0YW50KCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgdG8gdGhlIGxlbmd0aCBvZiBhIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgU3RyaW5nTGVuZ3RoRmlsdGVyVmFsdWUKKyAgICAgICAgaW1wbGVtZW50cyBGaWx0ZXJWYWx1ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3QgX3NlbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHBDb250ZXh0IF9jdHg7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwU3RhdGUgX3N0YXRlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcHJlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcG9zdDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nTGVuZ3RoRmlsdGVyVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIAorICAgICAgICAgICAgRXhwU3RhdGUgc3RhdGUsIFN0cmluZyBwcmUsIFN0cmluZyBwb3N0KXsKKyAgICAgICAgICAgIF9zZWwgPSBzZWw7CisgICAgICAgICAgICBfY3R4ID0gY3R4OworICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CisgICAgICAgICAgICBfcHJlID0gcHJlOworICAgICAgICAgICAgX3Bvc3QgPSBwb3N0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNRTEJ1ZmZlciBidWYpIHsKKyAgICAgICAgICAgIGFwcGVuZFRvKGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTUUxCdWZmZXIgYnVmLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX3ByZSk7CisgICAgICAgICAgICBfdmFsMi5hcHBlbmRUbyhfc2VsLCBfY3R4LCBfc3RhdGUsIGJ1ZiwgaW5kZXgpOworICAgICAgICAgICAgYnVmLmFwcGVuZChfcG9zdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKENvbHVtbiBjb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VsLmdldENvbHVtbkFsaWFzKGNvbCwgX3N0YXRlLmpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoU3RyaW5nIGNvbCwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VsLmdldENvbHVtbkFsaWFzKGNvbCwgdGFibGUsIF9zdGF0ZS5qb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgcmV0dXJuIF92YWwyLnRvRGF0YVN0b3JlVmFsdWUoX3NlbCwgX2N0eCwgX3N0YXRlLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdGFudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldEZpZWxkTWFwcGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TdHJpbmdGdW5jdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TdHJpbmdGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmMyNTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1N0cmluZ0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25WaXNpdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CisKKy8qKgorICogQSBKREJDIHN0cmluZyBmdW5jdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCithYnN0cmFjdCBjbGFzcyBTdHJpbmdGdW5jdGlvbgorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHN0cmluZyB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdGdW5jdGlvbihWYWwgdmFsKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIFZhbCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gX3ZhbC5pbml0aWFsaXplKHNlbCwgY3R4LCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgX3ZhbC5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBzdGF0ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc2VsLmdyb3VwQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9yZGVyQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgc2VsLm9yZGVyQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIGFzYywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgU1FMQnVmZmVyIG5ld1NRTEJ1ZmZlcihTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgY2FsY3VsYXRlVmFsdWUoc2VsLCBjdHgsIHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IG5ldyBTUUxCdWZmZXIoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIDApOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRmlsdGVycy5jb252ZXJ0KHJlcy5nZXRPYmplY3QodGhpcywKKyAgICAgICAgICAgIEphdmFTUUxUeXBlcy5KREJDX0RFRkFVTFQsIG51bGwpLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZVZhbHVlKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFZhbCBvdGhlciwgRXhwU3RhdGUgb3RoZXJTdGF0ZSkgeworICAgICAgICBfdmFsLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TdHJpbmdMZW5ndGguamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3RyaW5nTGVuZ3RoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1MTU3OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3RyaW5nTGVuZ3RoLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIFN0cmluZ0xlbmd0aAorICAgIGV4dGVuZHMgU3RyaW5nRnVuY3Rpb24geworCisgICAgcHJpdmF0ZSBDbGFzcyBfY2FzdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgc3RyaW5nIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ0xlbmd0aChWYWwgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfY2FzdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9jYXN0OworICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIF9jYXN0ID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCk7CisgICAgICAgIFN0cmluZyBmdW5jID0gZGljdC5zdHJpbmdMZW5ndGhGdW5jdGlvbjsKKyAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGZ1bmMgIT0gbnVsbCwgIlN0cmluZ0xlbmd0aEZ1bmN0aW9uIik7CisKKyAgICAgICAgaW50IGlkeCA9IGZ1bmMuaW5kZXhPZigiezB9Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZnVuYy5zdWJzdHJpbmcoMCwgaWR4KSk7CisgICAgICAgIGdldFZhbHVlKCkuYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIGluZGV4KTsKKyAgICAgICAgYnVmLmFwcGVuZChmdW5jLnN1YnN0cmluZyhpZHggKyAzKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1N1YlEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3ViUS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGIxNTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1N1YlEuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlF1ZXJ5RXhwcmVzc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlN1YnF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CisKKy8qKgorICogQSBzdWJxdWVyeS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBTdWJRCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbAorICAgIGltcGxlbWVudHMgU3VicXVlcnkgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01hcHBpbmcgX2NhbmRpZGF0ZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX3N1YnM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2FsaWFzOworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0Q29uc3RydWN0b3IgX2NvbnMgPSBuZXcgU2VsZWN0Q29uc3RydWN0b3IoKTsKKworICAgIHByaXZhdGUgQ2xhc3MgX3R5cGUgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBRdWVyeUV4cHJlc3Npb25zIF9leHBzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY2FuZGlkYXRlLCB3aGV0aGVyIHN1YmNsYXNzZXMgYXJlIGluY2x1ZGVkIGluCisgICAgICogdGhlIHF1ZXJ5LCBhbmQgdGhlIHF1ZXJ5IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyBTdWJRKENsYXNzTWFwcGluZyBjYW5kaWRhdGUsIGJvb2xlYW4gc3VicywgU3RyaW5nIGFsaWFzKSB7CisgICAgICAgIF9jYW5kaWRhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgIF9zdWJzID0gc3ViczsKKyAgICAgICAgX2FsaWFzID0gYWxpYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdWJxdWVyeSBjYW5kaWRhdGUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldENhbmRpZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYW5kaWRhdGU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfZXhwcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX2V4cHMucHJvamVjdGlvbnMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jYW5kaWRhdGUuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgaWYgKF9leHBzLnByb2plY3Rpb25zLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBfZXhwcy5wcm9qZWN0aW9uc1swXS5nZXRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF90eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIGlmIChfZXhwcyAhPSBudWxsICYmIF9leHBzLnByb2plY3Rpb25zLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgX2V4cHMucHJvamVjdGlvbnNbMF0uc2V0SW1wbGljaXRUeXBlKHR5cGUpOworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FuZGlkYXRlQWxpYXMoKSB7CisgICAgICAgIHJldHVybiBfYWxpYXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlFeHByZXNzaW9ucyhRdWVyeUV4cHJlc3Npb25zIHF1ZXJ5KSB7CisgICAgICAgIF9leHBzID0gcXVlcnk7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICBpZiAoX2V4cHMucHJvamVjdGlvbnMubGVuZ3RoID09IDEpCisgICAgICAgICAgICByZXR1cm4gKChWYWwpIF9leHBzLnByb2plY3Rpb25zWzBdKS5pbml0aWFsaXplKHNlbCwgY3R4LCBmbGFncyk7CisgICAgICAgIHJldHVybiBFeHBTdGF0ZS5OVUxMOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgIGlmIChfZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfY2FuZGlkYXRlLnRvRGF0YVN0b3JlVmFsdWUodmFsLAorICAgICAgICAgICAgICAgIF9jYW5kaWRhdGUuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwgY3R4LnN0b3JlKTsKKyAgICAgICAgaWYgKF9leHBzLnByb2plY3Rpb25zLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuICgoVmFsKSBfZXhwcy5wcm9qZWN0aW9uc1swXSkudG9EYXRhU3RvcmVWYWx1ZShzZWwsIGN0eCwgCisgICAgICAgICAgICAgICAgc3RhdGUsIHZhbCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIHN0YXRlLCBwa3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgc2VsLnNlbGVjdChuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc2VsLmdyb3VwQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9yZGVyQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgc2VsLm9yZGVyQnkobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIGFzYywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgU1FMQnVmZmVyIG5ld1NRTEJ1ZmZlcihTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IG5ldyBTUUxCdWZmZXIoY3R4LnN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIDApOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIFJlc3VsdCByZXMpIAorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZpbHRlcnMuY29udmVydChyZXMuZ2V0T2JqZWN0KHRoaXMsCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuSkRCQ19ERUZBVUxULCBudWxsKSwgZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgc3FsLCBpbmRleCwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCBpbnQgaW5kZXgsIGJvb2xlYW4gc2l6ZSkgeworICAgICAgICBRdWVyeUV4cHJlc3Npb25zU3RhdGUgc3Vic3RhdGUgPSBuZXcgUXVlcnlFeHByZXNzaW9uc1N0YXRlKCk7CisgICAgICAgIFNlbGVjdCBzdWIgPSBfY29ucy5ldmFsdWF0ZShjdHgsIHNlbCwgX2FsaWFzLCBfZXhwcywgc3Vic3RhdGUpOworICAgICAgICBfY29ucy5zZWxlY3Qoc3ViLCBjdHgsIF9jYW5kaWRhdGUsIF9zdWJzLCBfZXhwcywgc3Vic3RhdGUsIAorICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9OT05FKTsKKworICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmRDb3VudChzdWIsIGN0eC5mZXRjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoc3ViLCBjdHguZmV0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzRW1wdHkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgICAgICBzcWwuYXBwZW5kKCJOT1QgRVhJU1RTICIpOworICAgICAgICBhcHBlbmRUbyhzZWwsIGN0eCwgc3RhdGUsIHNxbCwgMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3RFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIHNxbC5hcHBlbmQoIkVYSVNUUyAiKTsKKyAgICAgICAgYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBzcWwsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCkgeworICAgICAgICBhcHBlbmRUbyhzZWwsIGN0eCwgc3RhdGUsIHNxbCwgMCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leHBzLnByb2plY3Rpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX2V4cHMucHJvamVjdGlvbnNbaV0uYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIGlmIChfZXhwcy5maWx0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF9leHBzLmZpbHRlci5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXhwcy5ncm91cGluZy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIF9leHBzLmdyb3VwaW5nW2ldLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBpZiAoX2V4cHMuaGF2aW5nICE9IG51bGwpCisgICAgICAgICAgICBfZXhwcy5oYXZpbmcuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2V4cHMub3JkZXJpbmcubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBfZXhwcy5vcmRlcmluZ1tpXS5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3Vic3RyaW5nLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1N1YnN0cmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTJkMTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1N1YnN0cmluZy5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFRha2UgYSBzdWJzdHJpbmcgb2YgYSBzdHJpbmcuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU3Vic3RyaW5nCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsMTsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsMjsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHN0cmluZ3MgdG8gb3BlcmF0ZSBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Vic3RyaW5nKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBfdmFsMSA9IHZhbDE7CisgICAgICAgIF92YWwyID0gdmFsMjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIEV4cFN0YXRlIHMxID0gX3ZhbDEuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIEV4cFN0YXRlIHMyID0gX3ZhbDIuaW5pdGlhbGl6ZShzZWwsIGN0eCwgMCk7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BFeHBTdGF0ZShzZWwuYW5kKHMxLmpvaW5zLCBzMi5qb2lucyksIHMxLCBzMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgQmluYXJ5T3BFeHBTdGF0ZSBic3RhdGUgPSAoQmluYXJ5T3BFeHBTdGF0ZSkgc3RhdGU7CisgICAgICAgIF92YWwxLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTEsIHRydWUpOworICAgICAgICBfdmFsMi5zZWxlY3RDb2x1bW5zKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzZWwuZ3JvdXBCeShuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3JkZXJCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIGFzYykgeworICAgICAgICBzZWwub3JkZXJCeShuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgYXNjLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTUUxCdWZmZXIgbmV3U1FMQnVmZmVyKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICBjYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgc3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICBhcHBlbmRUbyhzZWwsIGN0eCwgc3RhdGUsIGJ1ZiwgMCk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkKEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmNvbnZlcnQocmVzLmdldE9iamVjdCh0aGlzLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkpEQkNfREVGQVVMVCwgbnVsbCksIGdldFR5cGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgVmFsIG90aGVyLCBFeHBTdGF0ZSBvdGhlclN0YXRlKSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsMS5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgYnN0YXRlLnN0YXRlMSwgbnVsbCwgbnVsbCk7CisgICAgICAgIF92YWwyLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUyLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgICAgIEJpbmFyeU9wRXhwU3RhdGUgYnN0YXRlID0gKEJpbmFyeU9wRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBGaWx0ZXJWYWx1ZSBzdHIgPSBuZXcgRmlsdGVyVmFsdWVJbXBsKHNlbCwgY3R4LCBic3RhdGUuc3RhdGUxLCBfdmFsMSk7CisgICAgICAgIEZpbHRlclZhbHVlIHN0YXJ0OworICAgICAgICBGaWx0ZXJWYWx1ZSBlbmQgPSBudWxsOworICAgICAgICBpZiAoX3ZhbDIgaW5zdGFuY2VvZiBBcmdzKSB7CisgICAgICAgICAgICBGaWx0ZXJWYWx1ZVtdIGZpbHRzID0gKChBcmdzKSBfdmFsMikubmV3RmlsdGVyVmFsdWVzKHNlbCwgY3R4LCAKKyAgICAgICAgICAgICAgICBic3RhdGUuc3RhdGUyKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gZmlsdHNbMF07CisgICAgICAgICAgICBlbmQgPSBmaWx0c1sxXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzdGFydCA9IG5ldyBGaWx0ZXJWYWx1ZUltcGwoc2VsLCBjdHgsIGJzdGF0ZS5zdGF0ZTIsIF92YWwyKTsKKworICAgICAgICBjdHguc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkuc3Vic3RyaW5nKHNxbCwgc3RyLCBzdGFydCwgZW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwxLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdmFsMi5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9TdW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3VtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwZjljNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvU3VtLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKKworLyoqCisgKiBTdW0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU3VtCisgICAgZXh0ZW5kcyBVbmFyeU9wIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZSB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBTdW0oVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgQ2xhc3Mgd3JhcCA9IEZpbHRlcnMud3JhcChjKTsKKyAgICAgICAgaWYgKHdyYXAgPT0gSW50ZWdlci5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBTaG9ydC5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBCeXRlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGxvbmcuY2xhc3M7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiAiU1VNIjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Ub0xvd2VyQ2FzZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Ub0xvd2VyQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0N2QwMzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1RvTG93ZXJDYXNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworCisvKioKKyAqIExvd2VyLWNhc2VzIGEgc3RyaW5nLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFRvTG93ZXJDYXNlCisgICAgZXh0ZW5kcyBTdHJpbmdGdW5jdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgc3RyaW5nIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIFRvTG93ZXJDYXNlKFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmLCBpbnQgaW5kZXgpIHsKKworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgU3RyaW5nIGZ1bmMgPSBkaWN0LnRvTG93ZXJDYXNlRnVuY3Rpb247CisgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChmdW5jICE9IG51bGwsICJUb0xvd2VyQ2FzZUZ1bmN0aW9uIik7CisKKyAgICAgICAgaW50IGlkeCA9IGZ1bmMuaW5kZXhPZigiezB9Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZnVuYy5zdWJzdHJpbmcoMCwgaWR4KSk7CisgICAgICAgIGdldFZhbHVlKCkuYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIGluZGV4KTsKKyAgICAgICAgYnVmLmFwcGVuZChmdW5jLnN1YnN0cmluZyhpZHggKyAzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Ub1VwcGVyQ2FzZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9Ub1VwcGVyQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTU2MTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1RvVXBwZXJDYXNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworCisvKioKKyAqIFVwcGVyLWNhc2VzIGEgc3RyaW5nLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFRvVXBwZXJDYXNlCisgICAgZXh0ZW5kcyBTdHJpbmdGdW5jdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgc3RyaW5nIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIFRvVXBwZXJDYXNlKFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmLCBpbnQgaW5kZXgpIHsKKworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgU3RyaW5nIGZ1bmMgPSBkaWN0LnRvVXBwZXJDYXNlRnVuY3Rpb247CisgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChmdW5jICE9IG51bGwsICJUb1VwcGVyQ2FzZUZ1bmN0aW9uIik7CisKKyAgICAgICAgaW50IGlkeCA9IGZ1bmMuaW5kZXhPZigiezB9Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZnVuYy5zdWJzdHJpbmcoMCwgaWR4KSk7CisgICAgICAgIGdldFZhbHVlKCkuYXBwZW5kVG8oc2VsLCBjdHgsIHN0YXRlLCBidWYsIGluZGV4KTsKKyAgICAgICAgYnVmLmFwcGVuZChmdW5jLnN1YnN0cmluZyhpZHggKyAzKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1RyaW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvVHJpbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTczNjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1RyaW0uamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHN0cmluZy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitjbGFzcyBUcmltCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworICAgIHByaXZhdGUgZmluYWwgVmFsIF90cmltQ2hhcjsKKyAgICBwcml2YXRlIGZpbmFsIEJvb2xlYW4gX3doZXJlOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgc3RyaW5nIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIFRyaW0oVmFsIHZhbCwgVmFsIHRyaW1DaGFyLCBCb29sZWFuIHdoZXJlKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgICAgIF90cmltQ2hhciA9IHRyaW1DaGFyOworICAgICAgICBfd2hlcmUgPSB3aGVyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwU3RhdGUgaW5pdGlhbGl6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIEV4cFN0YXRlIHZhbHVlU3RhdGUgPSAgX3ZhbC5pbml0aWFsaXplKHNlbCwgY3R4LCAwKTsKKyAgICAgICAgRXhwU3RhdGUgY2hhclN0YXRlID0gX3RyaW1DaGFyLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICByZXR1cm4gbmV3IFRyaW1FeHBTdGF0ZShzZWwuYW5kKHZhbHVlU3RhdGUuam9pbnMsIGNoYXJTdGF0ZS5qb2lucyksIAorICAgICAgICAgICAgdmFsdWVTdGF0ZSwgY2hhclN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHByZXNzaW9uIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRyaW1FeHBTdGF0ZQorICAgICAgICBleHRlbmRzIEV4cFN0YXRlIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgRXhwU3RhdGUgdmFsdWVTdGF0ZTsKKyAgICAgICAgcHVibGljIGZpbmFsIEV4cFN0YXRlIGNoYXJTdGF0ZTsKKworICAgICAgICBwdWJsaWMgVHJpbUV4cFN0YXRlKEpvaW5zIGpvaW5zLCBFeHBTdGF0ZSB2YWx1ZVN0YXRlLCAKKyAgICAgICAgICAgIEV4cFN0YXRlIGNoYXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoam9pbnMpOworICAgICAgICAgICAgdGhpcy52YWx1ZVN0YXRlID0gdmFsdWVTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuY2hhclN0YXRlID0gY2hhclN0YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIHNlbC5zZWxlY3QobmV3U1FMQnVmZmVyKHNlbCwgY3R4LCBzdGF0ZSksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdENvbHVtbnMoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgVHJpbUV4cFN0YXRlIHRzdGF0ZSA9IChUcmltRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIHRzdGF0ZS52YWx1ZVN0YXRlLCB0cnVlKTsKKyAgICAgICAgX3RyaW1DaGFyLnNlbGVjdENvbHVtbnMoc2VsLCBjdHgsIHRzdGF0ZS5jaGFyU3RhdGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNlbC5ncm91cEJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlckJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHNlbC5vcmRlckJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpLCBhc2MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNRTEJ1ZmZlciBuZXdTUUxCdWZmZXIoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZpbHRlcnMuY29udmVydChyZXMuZ2V0T2JqZWN0KHRoaXMsCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuSkRCQ19ERUZBVUxULCBudWxsKSwgZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICAgICAgVHJpbUV4cFN0YXRlIHRzdGF0ZSA9IChUcmltRXhwU3RhdGUpIHN0YXRlOworICAgICAgICBfdmFsLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCB0c3RhdGUudmFsdWVTdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIF90cmltQ2hhci5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgdHN0YXRlLmNoYXJTdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwsIGludCBpbmRleCkgeworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgU3RyaW5nIGZ1bmM7CisgICAgICAgIGlmIChfd2hlcmUgPT0gbnVsbCkgeworICAgICAgICAgICAgZnVuYyA9IGRpY3QudHJpbUJvdGhGdW5jdGlvbjsKKyAgICAgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChmdW5jICE9IG51bGwsICJUcmltQm90aEZ1bmN0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoX3doZXJlLmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICBmdW5jID0gZGljdC50cmltTGVhZGluZ0Z1bmN0aW9uOworICAgICAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGZ1bmMgIT0gbnVsbCwgIlRyaW1MZWFkaW5nRnVuY3Rpb24iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZ1bmMgPSBkaWN0LnRyaW1UcmFpbGluZ0Z1bmN0aW9uOworICAgICAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGZ1bmMgIT0gbnVsbCwgIlRyaW1UcmFpbGluZ0Z1bmN0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZnJvbVBhcnQgPSBmdW5jLmluZGV4T2YoInswfSIpOworICAgICAgICBpbnQgY2hhclBhcnQgPSBmdW5jLmluZGV4T2YoInsxfSIpOworICAgICAgICBpZiAoY2hhclBhcnQgPT0gLTEpCisgICAgICAgICAgICBjaGFyUGFydCA9IGZ1bmMubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZyBwYXJ0MSA9IGZ1bmMuc3Vic3RyaW5nKDAsIE1hdGgubWluKGZyb21QYXJ0LCBjaGFyUGFydCkpOworICAgICAgICBTdHJpbmcgcGFydDIgPSBmdW5jLnN1YnN0cmluZyhNYXRoLm1pbihmcm9tUGFydCwgY2hhclBhcnQpICsgMywKKyAgICAgICAgICAgIE1hdGgubWF4KGZyb21QYXJ0LCBjaGFyUGFydCkpOworICAgICAgICBTdHJpbmcgcGFydDMgPSBudWxsOworICAgICAgICBpZiAoY2hhclBhcnQgIT0gZnVuYy5sZW5ndGgoKSkKKyAgICAgICAgICAgIHBhcnQzID0gZnVuYy5zdWJzdHJpbmcoTWF0aC5tYXgoZnJvbVBhcnQsIGNoYXJQYXJ0KSArIDMpOworCisgICAgICAgIFRyaW1FeHBTdGF0ZSB0c3RhdGUgPSAoVHJpbUV4cFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgc3FsLmFwcGVuZChwYXJ0MSk7CisgICAgICAgIGlmIChmcm9tUGFydCA8IGNoYXJQYXJ0KQorICAgICAgICAgICAgX3ZhbC5hcHBlbmRUbyhzZWwsIGN0eCwgdHN0YXRlLnZhbHVlU3RhdGUsIHNxbCwgMCk7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICBfdHJpbUNoYXIuYXBwZW5kVG8oc2VsLCBjdHgsIHRzdGF0ZS5jaGFyU3RhdGUsIHNxbCwgMCk7CisgICAgICAgIHNxbC5hcHBlbmQocGFydDIpOworCisgICAgICAgIGlmIChjaGFyUGFydCAhPSBmdW5jLmxlbmd0aCgpKSB7CisgICAgICAgICAgICBpZiAoZnJvbVBhcnQgPiBjaGFyUGFydCkKKyAgICAgICAgICAgICAgICBfdmFsLmFwcGVuZFRvKHNlbCwgY3R4LCB0c3RhdGUudmFsdWVTdGF0ZSwgc3FsLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfdHJpbUNoYXIuYXBwZW5kVG8oc2VsLCBjdHgsIHRzdGF0ZS5jaGFyU3RhdGUsIHNxbCwgMCk7CisgICAgICAgICAgICBzcWwuYXBwZW5kKHBhcnQzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSB0cmltIHN0YXRlbWVudCBkaWQgbm90IHNwZWNpZnkgdGhlIHRva2VuIGZvcgorICAgICAgICAgICAgLy8gd2hlcmUgdG8gc3BlY2lmeSB0aGUgdHJpbSBjaGFyIChkZW5vdGVkIGJ5ICJ7MX0iKSwKKyAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIHRoZSBhYmlsaXR5IHRvIHRyaW0gb2ZmIG5vbi13aGl0ZXNwYWNlCisgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzOyB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiB3ZSBhdHRlbXB0IHRvIGRvIHNvCisgICAgICAgICAgICBpZiAoIShfdHJpbUNoYXIgaW5zdGFuY2VvZiBDb25zdCkgfHwgU3RyaW5nLnZhbHVlT2YoKChDb25zdCkgCisgICAgICAgICAgICAgICAgX3RyaW1DaGFyKS5nZXRWYWx1ZShjdHgsdHN0YXRlLmNoYXJTdGF0ZSkpLnRyaW0oKS5sZW5ndGgoKSAhPSAwKQorICAgICAgICAgICAgICAgIGRpY3QuYXNzZXJ0U3VwcG9ydChmYWxzZSwgIlRyaW1Ob25XaGl0ZXNwYWNlQ2hhcmFjdGVycyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdHJpbUNoYXIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvVW5hcnlPcC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9VbmFyeU9wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExNzVlMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvVW5hcnlPcC5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFZhbHVlIHByb2R1Y2VkIGJ5IGEgdW5hcnkgb3BlcmF0aW9uIG9uIGEgdmFsdWUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworYWJzdHJhY3QgY2xhc3MgVW5hcnlPcAorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX2Nhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlIHRvIG9wZXJhdGUgb24uCisgICAgICovCisgICAgcHVibGljIFVuYXJ5T3AoVmFsIHZhbCkgeworICAgICAgICBfdmFsID0gdmFsOworICAgIH0KKworICAgIHByb3RlY3RlZCBWYWwgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBfdmFsOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX21ldGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgaWYgKF9jYXN0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2Nhc3Q7CisgICAgICAgIHJldHVybiBnZXRUeXBlKF92YWwuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfY2FzdCA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZVZhbHVlKHNlbCwgY3R4LCBmbGFncyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cFN0YXRlIGluaXRpYWxpemVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBfdmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgc2VsLnNlbGVjdChuZXdTUUxCdWZmZXIoc2VsLCBjdHgsIHN0YXRlKSwgdGhpcyk7CisgICAgICAgIGlmIChpc0FnZ3JlZ2F0ZSgpKQorICAgICAgICAgICAgc2VsLnNldEFnZ3JlZ2F0ZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RDb2x1bW5zKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgICAgIF92YWwuc2VsZWN0Q29sdW1ucyhzZWwsIGN0eCwgc3RhdGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNlbC5ncm91cEJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlckJ5KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHNlbC5vcmRlckJ5KG5ld1NRTEJ1ZmZlcihzZWwsIGN0eCwgc3RhdGUpLCBhc2MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNRTEJ1ZmZlciBuZXdTUUxCdWZmZXIoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKGN0eC5zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIGFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWQoRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZpbHRlcnMuY29udmVydChyZXMuZ2V0T2JqZWN0KHRoaXMsCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuSkRCQ19ERUZBVUxULCBudWxsKSwgZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICAgICAgX3ZhbC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgc3RhdGUsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgbGVuZ3RoKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgc3FsLmFwcGVuZChnZXRPcGVyYXRvcigpKTsKKyAgICAgICAgc3FsLmFwcGVuZCgiKCIpOworICAgICAgICBfdmFsLmFwcGVuZFRvKHNlbCwgY3R4LCBzdGF0ZSwgc3FsLCAwKTsKKyAgICAgICAgc3FsLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlLiBSZXR1cm5zCisgICAgICogdGhlIGFyZ3VtZW50IHR5cGUgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG9wZXJhdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0T3BlcmF0b3IoKTsKKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9WYWwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvVmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4NGVhOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvVmFsLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuVmFsdWU7CisKKy8qKgorICogQSBWYWx1ZSByZXByZXNlbnRzIGFueSBub24tb3BlcmF0b3IgaW4gYSBxdWVyeSBmaWx0ZXIsIGluY2x1ZGluZworICogY29uc3RhbnRzLCB2YXJpYWJsZXMsIGFuZCBvYmplY3QgZmllbGRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsCisgICAgZXh0ZW5kcyBWYWx1ZSB7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXphdGlvbiBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIHZhbHVlIHdpbGwgYmUgY29tcGFyZWQgdG8gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IE5VTExfQ01QID0gMiA8PCAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6YXRpb24gZmxhZyBpbmRpY2F0aW5nIHRvIGpvaW4gaW50byBhbnkgcmVsYXRpb24gcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IEpPSU5fUkVMID0gMiA8PCAxOyAKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemF0aW9uIGZsYWcgaW5kaWNhdGluZyB0byBmb3JjZSBhbiBvdXRlciBqb2luIGludG8gYW55IHJlbGF0aW9uIAorICAgICAqIHBhdGguCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBGT1JDRV9PVVRFUiA9IDIgPDwgMjsgCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSB2YWx1ZS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJlY3Vyc2l2ZWx5IGluaXRpYWxpemUgYW55CisgICAgICogc3ViLXZhbHVlcy4gCisgICAgICovCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRhdGFzdG9yZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGluIHRoZSBjb250ZXh0IG9mIHRoaXMKKyAgICAgKiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgT2JqZWN0IHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGRhdGEgZm9yIHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgYm9vbGVhbiBwa3MpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IGp1c3QgdGhlIGNvbHVtbnMgZm9yIHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcyk7CisKKyAgICAvKioKKyAgICAgKiBHcm91cCBieSB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKTsKKworICAgIC8qKgorICAgICAqIE9yZGVyIGJ5IHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3JkZXJCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIGFzYyk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBkYXRhIGZvciB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9hZChFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgYW5kIGNhY2hlIHRoZSBTUUwgZm9yIHRoaXMgdmFsdWUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqIGJlZm9yZSA8Y29kZT5sZW5ndGg8L2NvZGU+IG9yIGFueSA8Y29kZT5hcHBlbmQ8L2NvZGU+IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIHZhbHVlIGJlaW5nIGNvbXBhcmVkIHRvLCBvciBudWxsIGlmIG5vdCBhIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgU1FMIGVsZW1lbnRzIGluIHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBsZW5ndGgoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+dGggU1FMIGVsZW1lbnQgdG8gdGhlIGdpdmVuIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsLCAKKyAgICAgICAgaW50IGluZGV4KTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgU1FMIHRlc3Rpbmcgd2hldGhlciB0aGlzIHZhbHVlIGlzIGVtcHR5IHRvIHRoZSBnaXZlbiBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgU1FMIHRlc3Rpbmcgd2hldGhlciB0aGlzIHZhbHVlIGlzIG5vdCBlbXB0eSB0bworICAgICAqIHRoZSBnaXZlbiBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3RFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgU1FMIGNoZWNraW5nIHRoZSBzaXplIG9mIHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kU2l6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgc3FsKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgU1FMIHRlc3Rpbmcgd2hldGhlciB0aGlzIHZhbHVlIGlzIG51bGwgdG8gdGhlIGdpdmVuIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCk7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIFNRTCB0ZXN0aW5nIHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBub3QgbnVsbCB0byB0aGUgZ2l2ZW4KKyAgICAgKiBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBzcWwpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9WYXJpYWJsZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9WYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWRhNDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL1ZhcmlhYmxlLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBBIHZhcmlhYmxlIGluIGEgZmlsdGVyLiBUeXBpY2FsbHksIHRoZSB7QGxpbmsgI2luaXRpYWxpemV9IGFuZAorICoge0BsaW5rICNnZXRKb2luc30gbWV0aG9kcyBvZiB0aGlzIHZhbHVlIGFyZSBub3QgY2FsbGVkLiBUaGV5IGFyZQorICogb25seSBjYWxsZWQgaWYgdGhlIHZhcmlhYmxlIGlzIGJvdW5kIGJ1dCBvdGhlcndpc2UgdW51c2VkIGluIHRoZSBmaWx0ZXIsCisgKiBpbiB3aGljaCBjYXNlIHdlIG11c3QgYXQgbGVhc3QgbWFrZSB0aGUgam9pbnMgdG8gdGhlIHZhcmlhYmxlIGJlY2F1c2UgdGhlCisgKiBhY3Qgb2YgYmluZGluZyBhIHZhcmlhYmxlIHNob3VsZCBhdCBsZWFzdCBndWFyYW50ZWUgdGhhdCBhbiBpbnN0YW5jZQorICogcmVwcmVzdGluZyB0aGUgdmFyaWFibGUgY291bGQgZXhpc3QgKGkuZS4gdGhlIGJpbmRpbmcgY29sbGVjdGlvbiBpcyBub3QKKyAqIGVtcHR5KS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBWYXJpYWJsZQorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX25hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBfdHlwZTsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGE7CisgICAgcHJpdmF0ZSBQQ1BhdGggX3BhdGggPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX2Nhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YXJpYWJsZSBuYW1lIGFuZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBWYXJpYWJsZShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSkgeworICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhcmlhYmxlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGJvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmQoKSB7CisgICAgICAgIHJldHVybiBfcGF0aCAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0aGlzIHZhcmlhYmxlIGlzIGFsaWFzZWQgdG8uCisgICAgICovCisgICAgcHVibGljIFBDUGF0aCBnZXRQQ1BhdGgoKSB7CisgICAgICAgIHJldHVybiBfcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggdGhpcyB2YXJpYWJsZSBpcyBhbGlhc2VkIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBDUGF0aChQQ1BhdGggcGF0aCkgeworICAgICAgICBfcGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICBpZiAoX2Nhc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfY2FzdDsKKyAgICAgICAgcmV0dXJuIF90eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIF9jYXN0ID0gdHlwZTsKKyAgICAgICAgaWYgKF9wYXRoICE9IG51bGwpCisgICAgICAgICAgICBfcGF0aC5zZXRJbXBsaWNpdFR5cGUodHlwZSk7CisgICAgfQorCisgICAgcHVibGljIEV4cFN0YXRlIGluaXRpYWxpemUoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIGludCBmbGFncykgeworICAgICAgICBpZiAoX3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgX3BhdGguYWRkVmFyaWFibGVBY3Rpb24odGhpcyk7CisgICAgICAgICAgICByZXR1cm4gX3BhdGguaW5pdGlhbGl6ZShzZWwsIGN0eCwgZmxhZ3MgfCBKT0lOX1JFTCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEV4cFN0YXRlLk5VTEw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIGJvb2xlYW4gcGtzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0Q29sdW1ucyhTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIHBrcykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3JkZXJCeShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBib29sZWFuIGFzYykgeworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVWYWx1ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBWYWwgb3RoZXIsIEV4cFN0YXRlIG90aGVyU3RhdGUpIHsKKyAgICAgICAgaWYgKF9wYXRoICE9IG51bGwpCisgICAgICAgICAgICBfcGF0aC5jYWxjdWxhdGVWYWx1ZShzZWwsIGN0eCwgc3RhdGUsIG90aGVyLCBvdGhlclN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxlbmd0aChTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIHNxbCwgaW50IGluZGV4KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3RFbXB0eShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kU2l6ZShTZWxlY3Qgc2VsLCBFeHBDb250ZXh0IGN0eCwgRXhwU3RhdGUgc3RhdGUsIAorICAgICAgICBTUUxCdWZmZXIgYnVmKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOdWxsKFNlbGVjdCBzZWwsIEV4cENvbnRleHQgY3R4LCBFeHBTdGF0ZSBzdGF0ZSwgCisgICAgICAgIFNRTEJ1ZmZlciBidWYpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU2VsZWN0IHNlbCwgRXhwQ29udGV4dCBjdHgsIEV4cFN0YXRlIHN0YXRlLCAKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgaWYgKF9wYXRoICE9IG51bGwpCisgICAgICAgICAgICBfcGF0aC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzNjg0ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBLUpEQkMgRXhwcmVzc2lvbiBUcmVlPC9zdHJvbmc+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTU3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxodG1sPgorPGJvZHk+Cis8cD48c3Ryb25nPk9wZW5KUEEtSkRCQyBSdW50aW1lIEtlcm5lbDwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgUnVudGltZSBzZXJ2aWNlcyBmb3IgdGhlIEpEQkMgT3BlbkpQQSBpbXBsZW1lbnRhdGlvbi4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9DbGFzc01hcHBpbmcuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9DbGFzc01hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZhYjljCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0NsYXNzTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsOTYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZUNsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXBwbGljYXRpb25JZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUlkOworCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIG9mIG1ldGFkYXRhIGZvciByZWxhdGlvbmFsIGRhdGFiYXNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NNYXBwaW5nCisgICAgZXh0ZW5kcyBDbGFzc01ldGFEYXRhCisgICAgaW1wbGVtZW50cyBDbGFzc1N0cmF0ZWd5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NNYXBwaW5nW10gRU1QVFlfTUFQUElOR1MgPSBuZXcgQ2xhc3NNYXBwaW5nWzBdOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQ2xhc3NNYXBwaW5nLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NNYXBwaW5nSW5mbyBfaW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIERpc2NyaW1pbmF0b3IgX2Rpc2NyaW07CisgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIF92ZXJzaW9uOworICAgIHByaXZhdGUgQ2xhc3NTdHJhdGVneSBfc3RyYXRlZ3kgPSBudWxsOworCisgICAgcHJpdmF0ZSBUYWJsZSBfdGFibGUgPSBudWxsOworICAgIHByaXZhdGUgQ29sdW1uSU8gX2lvID0gbnVsbDsKKyAgICBwcml2YXRlIENvbHVtbltdIF9jb2xzID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgIHByaXZhdGUgRm9yZWlnbktleSBfZmsgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9zdWJjbGFzc01vZGUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIHByaXZhdGUgQ2xhc3NNYXBwaW5nW10gX2pvaW5TdWJNYXBzID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzTWFwcGluZ1tdIF9hc3NpZ25NYXBzID0gbnVsbDsKKworICAgIC8vIG1hcHMgY29sdW1ucyB0byBqb2luYWJsZXMKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfam9pbmFibGVzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBkZXNjcmliZWQgdHlwZSBhbmQgb3duaW5nIHJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTWFwcGluZyhDbGFzcyB0eXBlLCBNYXBwaW5nUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBzdXBlcih0eXBlLCByZXBvcyk7CisgICAgICAgIF9kaXNjcmltID0gcmVwb3MubmV3RGlzY3JpbWluYXRvcih0aGlzKTsKKyAgICAgICAgX3ZlcnNpb24gPSByZXBvcy5uZXdWZXJzaW9uKHRoaXMpOworICAgICAgICBfaW5mbyA9IHJlcG9zLm5ld01hcHBpbmdJbmZvKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtYmVkZGVkIGNvbnN0cnVjdG9yLiBTdXBwbHkgZW1iZWRkaW5nIHZhbHVlIGFuZCBvd25pbmcgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NNYXBwaW5nKFZhbHVlTWV0YURhdGEgdm1kKSB7CisgICAgICAgIHN1cGVyKHZtZCk7CisgICAgICAgIF9kaXNjcmltID0gZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5uZXdEaXNjcmltaW5hdG9yKHRoaXMpOworICAgICAgICBfdmVyc2lvbiA9IGdldE1hcHBpbmdSZXBvc2l0b3J5KCkubmV3VmVyc2lvbih0aGlzKTsKKyAgICAgICAgX2luZm8gPSBnZXRNYXBwaW5nUmVwb3NpdG9yeSgpLm5ld01hcHBpbmdJbmZvKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyBkaXNjcmltaW5hdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7CisgICAgICAgIHJldHVybiBfZGlzY3JpbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmVyc2lvbiBpbmRpY2F0b3IuCisgICAgICovCisgICAgcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIF92ZXJzaW9uOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vCisgICAgLy8gUnVudGltZQorICAgIC8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9pZCB2YWx1ZSBzdG9yZWQgaW4gdGhlIHJlc3VsdC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsCisgICAgICogcmVjdXJzZSB1bnRpbCBpdCBmaW5kcyBhbiBhbmNlc3RvciBjbGFzcyB3aG8gdXNlcyBvaWQgdmFsdWVzIGZvciBpdHMKKyAgICAgKiBwcmltYXJ5IGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmayBpZiBub24tbnVsbCwgdXNlIHRoZSBsb2NhbCBjb2x1bW5zIG9mIHRoZSBnaXZlbiBmb3JlaWduCisgICAgICoga2V5IGluIHBsYWNlIG9mIHRoaXMgY2xhc3MnIHByaW1hcnkga2V5IGNvbHVtbnMKKyAgICAgKiBAc2VlICNpc1ByaW1hcnlLZXlPYmplY3RJZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SWQoSkRCQ1N0b3JlIHN0b3JlLCBSZXN1bHQgcmVzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBib29sZWFuIHN1YnMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVtYmVkID0gZ2V0RW1iZWRkaW5nTWFwcGluZygpOworICAgICAgICBpZiAoZW1iZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBlbWJlZC5nZXRGaWVsZE1hcHBpbmcoKS5nZXREZWZpbmluZ01hcHBpbmcoKS4KKyAgICAgICAgICAgICAgICBnZXRPYmplY3RJZChzdG9yZSwgcmVzLCBmaywgc3Vicywgam9pbnMpOworCisgICAgICAgIHJldHVybiBnZXRPYmplY3RJZCh0aGlzLCBzdG9yZSwgcmVzLCBmaywgc3Vicywgam9pbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZSBoZWxwZXIgZm9yIHB1YmxpYyA8Y29kZT5nZXRPYmplY3RJZDwvY29kZT4gbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldE9iamVjdElkKENsYXNzTWFwcGluZyBjbHMsIEpEQkNTdG9yZSBzdG9yZSwgUmVzdWx0IHJlcywKKyAgICAgICAgRm9yZWlnbktleSBmaywgYm9vbGVhbiBzdWJzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNQcmltYXJ5S2V5T2JqZWN0SWQodHJ1ZSkpCisgICAgICAgICAgICByZXR1cm4gZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpLmdldE9iamVjdElkKGNscywgc3RvcmUsIHJlcywgZmssCisgICAgICAgICAgICAgICAgc3Vicywgam9pbnMpOworICAgICAgICBpZiAoZ2V0SWRlbnRpdHlUeXBlKCkgPT0gSURfVU5LTk9XTikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgIENvbHVtbltdIHBrcyA9IGdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgIGlmIChnZXRJZGVudGl0eVR5cGUoKSA9PSBJRF9EQVRBU1RPUkUpIHsKKyAgICAgICAgICAgIENvbHVtbiBjb2wgPSAoZmsgPT0gbnVsbCkgPyBwa3NbMF0gOiBmay5nZXRDb2x1bW4ocGtzWzBdKTsKKyAgICAgICAgICAgIGxvbmcgaWQgPSByZXMuZ2V0TG9uZyhjb2wsIGpvaW5zKTsKKyAgICAgICAgICAgIHJldHVybiAoaWQgPT0gMCAmJiByZXMud2FzTnVsbCgpKSA/IG51bGwKKyAgICAgICAgICAgICAgICA6IHN0b3JlLm5ld0RhdGFTdG9yZUlkKGlkLCBjbHMsIHN1YnMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwbGljYXRpb24gaWRlbnRpdHkKKyAgICAgICAgT2JqZWN0W10gdmFscyA9IG5ldyBPYmplY3RbZ2V0UHJpbWFyeUtleUZpZWxkcygpLmxlbmd0aF07CisgICAgICAgIEZpZWxkTWFwcGluZyBmbTsKKyAgICAgICAgSm9pbmFibGUgam9pbjsKKyAgICAgICAgaW50IHBrSWR4OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IGFsbCBwayBjb2x1bW4gam9pbiBtYXBwaW5ncyB1c2UgcHJpbWFyeSBrZXkgZmllbGRzLAorICAgICAgICAgICAgLy8gY2F1c2UgdGhpcyBtYXBwaW5nIHVzZXMgdGhlIG9pZCBhcyBpdHMgcHJpbWFyeSBrZXkgKHdlIHJlY3Vyc2VkCisgICAgICAgICAgICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QgdG8gZW5zdXJlIHRoaXMpCisgICAgICAgICAgICBqb2luID0gYXNzZXJ0Sm9pbmFibGUocGtzW2ldKTsKKyAgICAgICAgICAgIGZtID0gZ2V0RmllbGRNYXBwaW5nKGpvaW4uZ2V0RmllbGRJbmRleCgpKTsKKyAgICAgICAgICAgIHBrSWR4ID0gZm0uZ2V0UHJpbWFyeUtleUluZGV4KCk7CisKKyAgICAgICAgICAgIC8vIGNvdWxkIGhhdmUgYWxyZWFkeSBzZXQgdmFsdWUgd2l0aCBwcmV2aW91cyBtdWx0aS1jb2x1bW4gam9pbmFibGUKKyAgICAgICAgICAgIGlmICh2YWxzW3BrSWR4XSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzLnN0YXJ0RGF0YVJlcXVlc3QoZm0pOworICAgICAgICAgICAgICAgIHZhbHNbcGtJZHhdID0gam9pbi5nZXRQcmltYXJ5S2V5VmFsdWUocmVzLCBqb2luLmdldENvbHVtbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgZmssIHN0b3JlLCBqb2lucyk7CisgICAgICAgICAgICAgICAgcmVzLmVuZERhdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHNbcGtJZHhdID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9iamVjdCBvaWQgPSBBcHBsaWNhdGlvbklkcy5mcm9tUEtWYWx1ZXModmFscywgY2xzKTsKKyAgICAgICAgaWYgKCFzdWJzICYmIG9pZCBpbnN0YW5jZW9mIE9wZW5KUEFJZCkKKyAgICAgICAgICAgICgoT3BlbkpQQUlkKSBvaWQpLnNldE1hbmFnZWRJbnN0YW5jZVR5cGUoY2xzLmdldERlc2NyaWJlZFR5cGUoKSk7CisgICAgICAgIHJldHVybiBvaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiBjb2x1bW4gdmFsdWUocykgZm9yIHRoZSBnaXZlbiBvYmplY3QuIFRoZSBnaXZlbgorICAgICAqIGNvbHVtbnMgd2lsbCBiZSBwcmltYXJ5IGtleSBjb2x1bW5zIG9mIHRoaXMgbWFwcGluZywgYnV0IG1heSBiZSBpbgorICAgICAqIGFueSBvcmRlci4gSWYgdGhlcmUgaXMgb25seSBvbmUgY29sdW1uLCByZXR1cm4gaXRzIHZhbHVlLiBJZiB0aGVyZQorICAgICAqIGFyZSBtdWx0aXBsZSBjb2x1bW5zLCByZXR1cm4gYW4gb2JqZWN0IGFycmF5IG9mIHRoZWlyIHZhbHVlcywgaW4gdGhlCisgICAgICogc2FtZSBvcmRlciB0aGUgY29sdW1ucyBhcmUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCBvYmosIENvbHVtbltdIGNvbHMsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBPYmplY3QgcmV0ID0gKGNvbHMubGVuZ3RoID09IDEpID8gbnVsbCA6IG5ldyBPYmplY3RbY29scy5sZW5ndGhdOworCisgICAgICAgIC8vIGluIHRoZSBwYXN0IHdlJ3ZlIGJlZW4gbGVuaWVudCBhYm91dCBiZWluZyBhYmxlIHRvIHRyYW5zbGF0ZSBvYmplY3RzCisgICAgICAgIC8vIGZyb20gb3RoZXIgcGVyc2lzdGVuY2UgY29udGV4dHMsIHNvIHRyeSB0byBnZXQgc20gZGlyZWN0bHkgZnJvbQorICAgICAgICAvLyBpbnN0YW5jZSBiZWZvcmUgYXNraW5nIG91ciBjb250ZXh0CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc207CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICBzbSA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSAoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgb2JqKS4KKyAgICAgICAgICAgICAgICBwY0dldFN0YXRlTWFuYWdlcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbSA9IHN0b3JlLmdldENvbnRleHQoKS5nZXRTdGF0ZU1hbmFnZXIob2JqKTsKKyAgICAgICAgaWYgKHNtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmFsID0gYXNzZXJ0Sm9pbmFibGUoY29sc1tpXSkuZ2V0Sm9pblZhbHVlKHNtLCBjb2xzW2ldLCBzdG9yZSk7CisgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICByZXQgPSB2YWw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKChPYmplY3RbXSkgcmV0KVtpXSA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgam9pbmFibGUgZm9yIHRoZSBnaXZlbiBjb2x1bW4sIG9yIHRocm93IGFuIGV4Y2VwdGlvbiBpZgorICAgICAqIG5vbmUgaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBKb2luYWJsZSBhc3NlcnRKb2luYWJsZShDb2x1bW4gY29sKSB7CisgICAgICAgIEpvaW5hYmxlIGpvaW4gPSBnZXRKb2luYWJsZShjb2wpOworICAgICAgICBpZiAoam9pbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1qb2luYWJsZSIsCisgICAgICAgICAgICAgICAgY29sLmdldEZ1bGxOYW1lKCkpKTsKKyAgICAgICAgcmV0dXJuIGpvaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgSm9pbmFibGV9IGZvciB0aGUgZ2l2ZW4gY29sdW1uLiBBbnkgY29sdW1uIHRoYXQKKyAgICAgKiBhbm90aGVyIG1hcHBpbmcgam9pbnMgdG8gbXVzdCBiZSBjb250cm9sbGVkIGJ5IGEgam9pbmFibGUuCisgICAgICovCisgICAgcHVibGljIEpvaW5hYmxlIGdldEpvaW5hYmxlKENvbHVtbiBjb2wpIHsKKyAgICAgICAgSm9pbmFibGUgam9pbjsKKyAgICAgICAgaWYgKGdldEVtYmVkZGluZ01ldGFEYXRhKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgam9pbiA9IGdldEVtYmVkZGluZ01hcHBpbmcoKS5nZXRGaWVsZE1hcHBpbmcoKS4KKyAgICAgICAgICAgICAgICBnZXREZWZpbmluZ01hcHBpbmcoKS5nZXRKb2luYWJsZShjb2wpOworICAgICAgICAgICAgaWYgKGpvaW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gam9pbjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGlmIChzdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgam9pbiA9IHN1cC5nZXRKb2luYWJsZShjb2wpOworICAgICAgICAgICAgaWYgKGpvaW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gam9pbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEpvaW5hYmxlKSBfam9pbmFibGVzLmdldChjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gY29sdW1uLXRvLWpvaW5hYmxlIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbmFibGUoQ29sdW1uIGNvbCwgSm9pbmFibGUgam9pbmFibGUpIHsKKyAgICAgICAgLy8gZG9uJ3QgbGV0IG5vbi1wayBvdmVycmlkZSBwaworICAgICAgICBKb2luYWJsZSBqb2luID0gKEpvaW5hYmxlKSBfam9pbmFibGVzLmdldChjb2wpOworICAgICAgICBpZiAoam9pbiA9PSBudWxsIHx8IChqb2luLmdldEZpZWxkSW5kZXgoKSAhPSAtMQorICAgICAgICAgICAgJiYgZ2V0RmllbGQoam9pbi5nZXRGaWVsZEluZGV4KCkpLmdldFByaW1hcnlLZXlJbmRleCgpID09IC0xKSkKKyAgICAgICAgICAgIF9qb2luYWJsZXMucHV0KGNvbCwgam9pbmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBmb3JlaWduIGtleSB0byB0aGlzIG1hcHBpbmcKKyAgICAgKiBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYW4gb2JqZWN0IGlkIGZvciB0aGlzIHR5cGUuIFRoaXMgaXMgYQorICAgICAqIHJlbGF0aXZlbHkgZXhwZW5zaXZlIG9wZXJhdGlvbjsgaXRzIHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rIEJvb2xlYW4jVFJVRX0gaWYgdGhlIGZvcmVpZ24ga2V5IGNvbnRhaW5zIGFsbCBvaWQKKyAgICAgKiBjb2x1bW5zLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjb250YWlucyBvbmx5IHNvbWUgY29sdW1ucywKKyAgICAgKiBvciB7QGxpbmsgQm9vbGVhbiNGQUxTRX0gaWYgaXQgY29udGFpbnMgbm9uLW9pZCBjb2x1bW5zCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gaXNGb3JlaWduS2V5T2JqZWN0SWQoRm9yZWlnbktleSBmaykgeworICAgICAgICAvLyBpZiB0aGlzIG1hcHBpbmcncyBwcmltYXJ5IGtleSBjYW4ndCBjb25zdHJ1Y3QgYW4gb2lkLCB0aGVuIG5vIHdheQorICAgICAgICAvLyBmb3JlaWduIGtleSBjYW4KKyAgICAgICAgaWYgKGdldElkZW50aXR5VHlwZSgpID09IElEX1VOS05PV04gfHwgIWlzUHJpbWFyeUtleU9iamVjdElkKGZhbHNlKSkKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworCisgICAgICAgIC8vIHdpdGggZGF0YXN0b3JlIGlkZW50aXR5LCBpdCdzIGFsbCBvciBub3RoaW5nCisgICAgICAgIENvbHVtbltdIGNvbHMgPSBmay5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBpZiAoZ2V0SWRlbnRpdHlUeXBlKCkgPT0gSURfREFUQVNUT1JFKSB7CisgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggIT0gMSB8fCBjb2xzWzBdICE9IGdldFByaW1hcnlLZXlDb2x1bW5zKClbMF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGpvaW4gbWFwcGluZyBmb3IgZWFjaCBwayBjb2x1bW4gdG8gc2VlIGlmIGl0IGxpbmtzIHVwIHRvCisgICAgICAgIC8vIGEgcHJpbWFyeSBrZXkgZmllbGQKKyAgICAgICAgSm9pbmFibGUgam9pbjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBqb2luID0gYXNzZXJ0Sm9pbmFibGUoY29sc1tpXSk7CisgICAgICAgICAgICBpZiAoam9pbi5nZXRGaWVsZEluZGV4KCkgIT0gLTEKKyAgICAgICAgICAgICAgICAmJiBnZXRGaWVsZChqb2luLmdldEZpZWxkSW5kZXgoKSkuZ2V0UHJpbWFyeUtleUluZGV4KCkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBhbGwgcHJpbWFyeSBrZXkgbGlua3MsIHNlZSB3aGV0aGVyIHdlIGpvaW4gdG8gYWxsIHBrcworICAgICAgICBpZiAoaXNQcmltYXJ5S2V5T2JqZWN0SWQodHJ1ZSkKKyAgICAgICAgICAgICYmIGNvbHMubGVuZ3RoID09IGdldFByaW1hcnlLZXlDb2x1bW5zKCkubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8vLy8vLworICAgIC8vIE9STQorICAgIC8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJhdyBtYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZ0luZm8gZ2V0TWFwcGluZ0luZm8oKSB7CisgICAgICAgIHJldHVybiBfaW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyYXRlZ3kgdXNlZCB0byBtYXAgdGhpcyBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1N0cmF0ZWd5IGdldFN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gX3N0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJhdGVneSB1c2VkIHRvIG1hcCB0aGlzIG1hcHBpbmcuIFRoZSA8Y29kZT5hZGFwdDwvY29kZT4KKyAgICAgKiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGFkYXB0IHdoZW4gbWFwcGluZyB0aGUgc3RyYXRlZ3k7CisgICAgICogdXNlIG51bGwgaWYgdGhlIHN0cmF0ZWd5IHNob3VsZCBub3QgYmUgbWFwcGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KENsYXNzU3RyYXRlZ3kgc3RyYXRlZ3ksIEJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgLy8gc2V0IHN0cmF0ZWd5IGZpcnN0IHNvIHdlIGNhbiBhY2Nlc3MgaXQgZHVyaW5nIG1hcHBpbmcKKyAgICAgICAgQ2xhc3NTdHJhdGVneSBvcmlnID0gX3N0cmF0ZWd5OworICAgICAgICBfc3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RyYXRlZ3kuc2V0Q2xhc3NNYXBwaW5nKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChhZGFwdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJhdGVneS5tYXAoYWRhcHQuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgX3N0cmF0ZWd5ID0gb3JpZzsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7CisgICAgICAgIHJldHVybiBfdGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIF90YWJsZSA9IHRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW5zIHRoaXMgbWFwcGluZyB1c2VzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIG9iamVjdC4KKyAgICAgKiBUaGVzZSB3aWxsIHR5cGljYWxseSBiZSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBvciB0aGUgY29sdW1ucyB0aGlzCisgICAgICogY2xhc3MgdXNlcyB0byBsaW5rIHRvIGl0cyBzdXBlcmNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRQcmltYXJ5S2V5Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKF9jb2xzLmxlbmd0aCA9PSAwICYmIGdldElkZW50aXR5VHlwZSgpID09IElEX0FQUExJQ0FUSU9OCisgICAgICAgICAgICAmJiBpc01hcHBlZCgpKSB7CisgICAgICAgICAgICBGaWVsZE1hcHBpbmdbXSBwa3MgPSBnZXRQcmltYXJ5S2V5RmllbGRNYXBwaW5ncygpOworICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2xzID0gbmV3IEFycmF5TGlzdChwa3MubGVuZ3RoKTsKKyAgICAgICAgICAgIENvbHVtbltdIGZpZWxkQ29sczsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmllbGRDb2xzID0gcGtzW2ldLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkQ29scy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgY29scy5hZGQoZmllbGRDb2xzW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9jb2xzID0gKENvbHVtbltdKSBjb2xzLnRvQXJyYXkobmV3IENvbHVtbltjb2xzLnNpemUoKV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY29sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sdW1ucyB0aGlzIG1hcHBpbmcgdXNlcyB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBvYmplY3QuCisgICAgICogVGhlc2Ugd2lsbCB0eXBpY2FsbHkgYmUgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb3IgdGhlIGNvbHVtbnMgdGhpcworICAgICAqIGNsYXNzIHVzZXMgdG8gbGluayB0byBpdHMgc3VwZXJjbGFzcyB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5Q29sdW1ucyhDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIGlmIChjb2xzID09IG51bGwpCisgICAgICAgICAgICBjb2xzID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgICAgICBfY29scyA9IGNvbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGluZm9ybWF0aW9uIG9uIHRoZSBrZXkgY29sdW1ucyAvIGpvaW4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5JTyBnZXRDb2x1bW5JTygpIHsKKyAgICAgICAgcmV0dXJuIChfaW8gPT0gbnVsbCkgPyBDb2x1bW5JTy5VTlJFU1RSSUNURUQgOiBfaW87CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGluZm9ybWF0aW9uIG9uIHRoZSBrZXkgY29sdW1ucyAvIGpvaW4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbklPKENvbHVtbklPIGlvKSB7CisgICAgICAgIF9pbyA9IGlvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmVpZ24ga2V5IGxpbmtpbmcgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgdG8gdGhlIHN1cGVyY2xhc3MgdGFibGUsCisgICAgICogb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KCkgeworICAgICAgICByZXR1cm4gX2ZrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmVpZ24ga2V5IGxpbmtpbmcgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgdG8gdGhlIHN1cGVyY2xhc3MgdGFibGUsCisgICAgICogb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5Gb3JlaWduS2V5KEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgX2ZrID0gZms7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmU2NoZW1hQ29tcG9uZW50cygpIHsKKyAgICAgICAgaWYgKGdldEVtYmVkZGluZ01ldGFEYXRhKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF90YWJsZSAhPSBudWxsICYmIF90YWJsZS5nZXRQcmltYXJ5S2V5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfdGFibGUuZ2V0UHJpbWFyeUtleSgpLnJlZigpOworICAgICAgICAgICAgaWYgKF9mayAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9may5yZWYoKTsKKyAgICAgICAgICAgIENvbHVtbltdIHBrcyA9IGdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBrcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBwa3NbaV0ucmVmKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBnZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0ucmVmU2NoZW1hQ29tcG9uZW50cygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgbWFwcGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyTWFwcGluZygpIHsKKyAgICAgICAgX3N0cmF0ZWd5ID0gbnVsbDsKKyAgICAgICAgX2NvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgICAgIF9mayA9IG51bGw7CisgICAgICAgIF90YWJsZSA9IG51bGw7CisgICAgICAgIF9pbmZvLmNsZWFyKCk7CisgICAgICAgIHNldFJlc29sdmUoTU9ERV9NQVBQSU5HIHwgTU9ERV9NQVBQSU5HX0lOSVQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUge0BsaW5rIE1hcHBpbmdJbmZvfSB3aXRoIG91ciBjdXJyZW50IG1hcHBpbmcgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luY01hcHBpbmdJbmZvKCkgeworICAgICAgICBpZiAoZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSA9PSBudWxsKQorICAgICAgICAgICAgX2luZm8uc3luY1dpdGgodGhpcyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX2luZm8uY2xlYXIoKTsKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5zeW5jTWFwcGluZ0luZm8oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBNZXRhRGF0YSBpbnRlcmZhY2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXNjcmliZWRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgc3VwZXIuc2V0RGVzY3JpYmVkVHlwZSh0eXBlKTsKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgY2FsbGVkIGZyb20gc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvciwgc28gX2luZm8gbm90IHlldAorICAgICAgICAvLyBpbml0aWFsaXplZAorICAgICAgICBpZiAoX2luZm8gIT0gbnVsbCkKKyAgICAgICAgICAgIF9pbmZvLnNldENsYXNzTmFtZSh0eXBlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN1YmNsYXNzIGZldGNoIG1vZGUsIGFzIG9uZSBvZiB0aGUgZWFnZXIgY29uc3RhbnRzIGluCisgICAgICoge0BsaW5rIEpEQkNGZXRjaENvbmZpZ3VyYXRpb259LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKSB7CisgICAgICAgIGlmIChfc3ViY2xhc3NNb2RlID09IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAoZ2V0UENTdXBlcmNsYXNzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3ViY2xhc3NNb2RlID0gZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpLgorICAgICAgICAgICAgICAgICAgICBnZXRTdWJjbGFzc0ZldGNoTW9kZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9zdWJjbGFzc01vZGUgPSBGZXRjaENvbmZpZ3VyYXRpb24uREVGQVVMVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3N1YmNsYXNzTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3ViY2xhc3MgZmV0Y2ggbW9kZSwgYXMgb25lIG9mIHRoZSBlYWdlciBjb25zdGFudHMgaW4KKyAgICAgKiB7QGxpbmsgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3ViY2xhc3NGZXRjaE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgX3N1YmNsYXNzTW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0UmVwb3NpdG9yeX0uCisgICAgICovCisgICAgcHVibGljIE1hcHBpbmdSZXBvc2l0b3J5IGdldE1hcHBpbmdSZXBvc2l0b3J5KCkgeworICAgICAgICByZXR1cm4gKE1hcHBpbmdSZXBvc2l0b3J5KSBnZXRSZXBvc2l0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0RW1iZWRkaW5nTWV0YURhdGF9CisgICAgICovCisgICAgcHVibGljIFZhbHVlTWFwcGluZyBnZXRFbWJlZGRpbmdNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gKFZhbHVlTWFwcGluZykgZ2V0RW1iZWRkaW5nTWV0YURhdGEoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjbGFzcyBkb2VzIG5vdCB1c2UgdGhlICJub25lIiBzdHJhdGVneSAoaW5jbHVkaW5nCisgICAgICogaWYgaXQgaGFzIGEgbnVsbCBzdHJhdGVneSwgYW5kIHRoZXJlZm9yZSBpcyBwcm9iYWJseSBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAqIGJlaW5nIG1hcHBlZCkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7CisgICAgICAgIGlmICghc3VwZXIuaXNNYXBwZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9zdHJhdGVneSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9zdHJhdGVneSAhPSBOb25lQ2xhc3NTdHJhdGVneS5nZXRJbnN0YW5jZSgpOworICAgICAgICByZXR1cm4gIU5vbmVDbGFzc1N0cmF0ZWd5LkFMSUFTLmVxdWFscyhfaW5mby5nZXRTdHJhdGVneSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgQ2xhc3NNZXRhRGF0YSNnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YX0uCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZykgZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgQ2xhc3NNZXRhRGF0YSNnZXRNYXBwZWRQQ1N1cGVyY2xhc3NNZXRhRGF0YX0uCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRNYXBwZWRQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZykgZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5lYXJlc3QgbWFwcGVkIHN1cGVyY2xhc3MgdGhhdCBjYW4gam9pbiB0byB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgeworICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3VwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKF9mayAhPSBudWxsIHx8IF90YWJsZSA9PSBudWxsIHx8IF90YWJsZS5lcXVhbHMoc3VwLmdldFRhYmxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIHN1cDsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0UENTdWJjbGFzc01ldGFEYXRhc30uCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldFBDU3ViY2xhc3NNYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzc01hcHBpbmdbXSkgZ2V0UENTdWJjbGFzc01ldGFEYXRhcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBDbGFzc01ldGFEYXRhI2dldE1hcHBlZFBDU3ViY2xhc3NNZXRhRGF0YXN9LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmdbXSBnZXRNYXBwZWRQQ1N1YmNsYXNzTWFwcGluZ3MoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NNYXBwaW5nW10pIGdldE1hcHBlZFBDU3ViY2xhc3NNZXRhRGF0YXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbWFwcGVkIHN1YmNsYXNzZXMgdGhhdCBhcmUgcmVhY2hhYmxlIHZpYSBqb2lucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0Sm9pbmFibGVQQ1N1YmNsYXNzTWFwcGluZ3MoKSB7CisgICAgICAgIENsYXNzTWFwcGluZ1tdIHN1YnMgPSBnZXRNYXBwZWRQQ1N1YmNsYXNzTWFwcGluZ3MoKTsgLy8gY2hlY2tzIGZvciBuZXcKKyAgICAgICAgaWYgKF9qb2luU3ViTWFwcyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc3Vicy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBfam9pblN1Yk1hcHMgPSBzdWJzOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTGlzdCBqb2luYWJsZSA9IG5ldyBBcnJheUxpc3Qoc3Vicy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3ViSm9pbmFibGUoc3Vic1tpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBqb2luYWJsZS5hZGQoc3Vic1tpXSk7CisgICAgICAgICAgICAgICAgX2pvaW5TdWJNYXBzID0gKENsYXNzTWFwcGluZ1tdKSBqb2luYWJsZS50b0FycmF5CisgICAgICAgICAgICAgICAgICAgIChuZXcgQ2xhc3NNYXBwaW5nW2pvaW5hYmxlLnNpemUoKV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBfam9pblN1Yk1hcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgd2UgY2FuIHJlYWNoIHRoZSBnaXZlbiBzdWJjbGFzcyB2aWEgam9pbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3ViSm9pbmFibGUoQ2xhc3NNYXBwaW5nIHN1YikgeworICAgICAgICBpZiAoc3ViID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChzdWIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gaXNTdWJKb2luYWJsZShzdWIuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QtZGVyaXZlZCBsaXN0IG9mIG5vbi1pbnRlci1qb2luYWJsZSBtYXBwZWQgdHlwZXMKKyAgICAgKiBhc3NpZ25hYmxlIHRvIHRoaXMgdHlwZS4gTWF5IHJldHVybiB0aGlzIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50QXNzaWduYWJsZU1hcHBpbmdzKCkgeworICAgICAgICBDbGFzc01hcHBpbmdbXSBzdWJzID0gZ2V0TWFwcGVkUENTdWJjbGFzc01hcHBpbmdzKCk7IC8vIGNoZWNrcyBmb3IgbmV3CisgICAgICAgIGlmIChfYXNzaWduTWFwcyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgdW5tYXBwZWQgc3VicworICAgICAgICAgICAgaWYgKHN1YnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNNYXBwZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2Fzc2lnbk1hcHMgPSBuZXcgQ2xhc3NNYXBwaW5nW117IHRoaXMgfTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9hc3NpZ25NYXBzID0gc3ViczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSAoc3Vicy5sZW5ndGggKiAxLjMzICsgMik7CisgICAgICAgICAgICAgICAgU2V0IGluZGVwZW5kZW50ID0gbmV3IExpbmtlZEhhc2hTZXQoc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzTWFwcGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGluZGVwZW5kZW50LmFkZCh0aGlzKTsKKyAgICAgICAgICAgICAgICBpbmRlcGVuZGVudC5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdWJzKSk7CisKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIG1hcHBpbmdzIHRoYXQgaGF2ZSBhIHN1cGVyY2xhc3MgbWFwcGluZyBpbiB0aGUgc2V0CisgICAgICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcCwgc3VwOworICAgICAgICAgICAgICAgIExpc3QgY2xlYXIgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaW5kZXBlbmRlbnQuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwID0gKENsYXNzTWFwcGluZykgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3VwID0gbWFwLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgaW5kZXBlbmRlbnQuY29udGFpbnMoc3VwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXIgPSBuZXcgQXJyYXlMaXN0KGluZGVwZW5kZW50LnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXIuYWRkKG1hcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGluZGVwZW5kZW50LnJlbW92ZUFsbChjbGVhcik7CisKKyAgICAgICAgICAgICAgICBfYXNzaWduTWFwcyA9IChDbGFzc01hcHBpbmdbXSkgaW5kZXBlbmRlbnQudG9BcnJheQorICAgICAgICAgICAgICAgICAgICAobmV3IENsYXNzTWFwcGluZ1tpbmRlcGVuZGVudC5zaXplKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2Fzc2lnbk1hcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tIHtAbGluayBDbGFzc01ldGFEYXRhI2dldEZpZWxkc30uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZ1tdIGdldEZpZWxkTWFwcGluZ3MoKSB7CisgICAgICAgIHJldHVybiAoRmllbGRNYXBwaW5nW10pIGdldEZpZWxkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBDbGFzc01ldGFEYXRhI2dldERlY2xhcmVkRmllbGRzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nW10gZ2V0RGVjbGFyZWRGaWVsZE1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZ1tdKSBnZXREZWNsYXJlZEZpZWxkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBDbGFzc01ldGFEYXRhI2dldFByaW1hcnlLZXlGaWVsZHN9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmdbXSBnZXRQcmltYXJ5S2V5RmllbGRNYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZE1hcHBpbmdbXSkgZ2V0UHJpbWFyeUtleUZpZWxkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBDbGFzc01ldGFEYXRhI2dldFZlcnNpb25GaWVsZH0uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXRWZXJzaW9uRmllbGRNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZykgZ2V0VmVyc2lvbkZpZWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0RGVmYXVsdEZldGNoR3JvdXBGaWVsZHN9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmdbXSBnZXREZWZhdWx0RmV0Y2hHcm91cEZpZWxkTWFwcGluZ3MoKSB7CisgICAgICAgIHJldHVybiAoRmllbGRNYXBwaW5nW10pIGdldERlZmF1bHRGZXRjaEdyb3VwRmllbGRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0RGVmaW5lZEZpZWxkc30uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZ1tdIGdldERlZmluZWRGaWVsZE1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZ1tdKSBnZXREZWZpbmVkRmllbGRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0RmllbGRzSW5MaXN0aW5nT3JkZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmdbXSBnZXRGaWVsZE1hcHBpbmdzSW5MaXN0aW5nT3JkZXIoKSB7CisgICAgICAgIHJldHVybiAoRmllbGRNYXBwaW5nW10pIGdldEZpZWxkc0luTGlzdGluZ09yZGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0RGVmaW5lZEZpZWxkc0luTGlzdGluZ09yZGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nW10gZ2V0RGVmaW5lZEZpZWxkTWFwcGluZ3NJbkxpc3RpbmdPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZE1hcHBpbmdbXSkgZ2V0RGVmaW5lZEZpZWxkc0luTGlzdGluZ09yZGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tIHtAbGluayBDbGFzc01ldGFEYXRhI2dldEZpZWxkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldEZpZWxkTWFwcGluZyhpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZE1hcHBpbmcpIGdldEZpZWxkKGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgQ2xhc3NNZXRhRGF0YSNnZXREZWNsYXJlZEZpZWxkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldERlY2xhcmVkRmllbGRNYXBwaW5nKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZykgZ2V0RGVjbGFyZWRGaWVsZChpbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tIHtAbGluayBDbGFzc01ldGFEYXRhI2dldEZpZWxkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldEZpZWxkTWFwcGluZyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZykgZ2V0RmllbGQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZ2V0RGVjbGFyZWRGaWVsZH0uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXREZWNsYXJlZEZpZWxkTWFwcGluZyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZykgZ2V0RGVjbGFyZWRGaWVsZChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgQ2xhc3NNZXRhRGF0YSNnZXREZWNsYXJlZFVubWFuYWdlZEZpZWxkc30uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZ1tdIGdldERlY2xhcmVkVW5tYW5hZ2VkRmllbGRNYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZE1hcHBpbmdbXSkgZ2V0RGVjbGFyZWRVbm1hbmFnZWRGaWVsZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgQ2xhc3NNZXRhRGF0YSNhZGREZWNsYXJlZEZpZWxkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGFkZERlY2xhcmVkRmllbGRNYXBwaW5nKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiAoRmllbGRNYXBwaW5nKSBhZGREZWNsYXJlZEZpZWxkKG5hbWUsIHR5cGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlc29sdmVNYXBwaW5nKGJvb2xlYW4gcnVudGltZSkgeworICAgICAgICBzdXBlci5yZXNvbHZlTWFwcGluZyhydW50aW1lKTsKKworICAgICAgICAvLyBtYXAgY2xhc3Mgc3RyYXRlZ3k7IGl0IG1heSBhbHJlYWR5IGJlIG1hcHBlZCBieSB0aGUgcmVwb3NpdG9yeSBiZWZvcmUKKyAgICAgICAgLy8gdGhlIHJlc29sdmUgcHJvY2VzcyBiZWdpbnMKKyAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSBnZXRNYXBwaW5nUmVwb3NpdG9yeSgpOworICAgICAgICBpZiAoX3N0cmF0ZWd5ID09IG51bGwpCisgICAgICAgICAgICByZXBvcy5nZXRTdHJhdGVneUluc3RhbGxlcigpLmluc3RhbGxTdHJhdGVneSh0aGlzKTsKKyAgICAgICAgTG9nIGxvZyA9IGdldFJlcG9zaXRvcnkoKS5nZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzdHJhdGVneSIsIHRoaXMsIF9zdHJhdGVneS5nZXRBbGlhcygpKSk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHVubWFwcGVkIHN1cGVyY2xhc3MgZmllbGRzIGFyZSBkZWZpbmVkIGlmIHdlJ3JlIG1hcHBlZDsKKyAgICAgICAgLy8gYWxzbyBtYXkgaGF2ZSBiZWVuIGRvbmUgYnkgcmVwb3NpdG9yeSBhbHJlYWR5CisgICAgICAgIGRlZmluZVN1cGVyY2xhc3NGaWVsZHMoZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgPT0gbnVsbCk7CisKKyAgICAgICAgLy8gcmVzb2x2ZSBldmVyeXRoaW5nIHRoYXQgZG9lc24ndCByZWx5IG9uIGFueSByZWxhdGlvbnMgdG8gYXZvaWQKKyAgICAgICAgLy8gcmVjdXJzaW9uLCB0aGVuIHJlc29sdmUgYWxsIGZpZWxkcworICAgICAgICByZXNvbHZlTm9uUmVsYXRpb25NYXBwaW5ncygpOworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmbXMgPSBnZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGZtc1tpXS5nZXREZWZpbmluZ01ldGFEYXRhKCkgPT0gdGhpcykKKyAgICAgICAgICAgICAgICBmbXNbaV0ucmVzb2x2ZShNT0RFX01BUFBJTkcpOworICAgICAgICBmbXMgPSBnZXREZWNsYXJlZFVubWFuYWdlZEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBmbXNbaV0ucmVzb2x2ZShNT0RFX01BUFBJTkcpOworCisgICAgICAgIC8vIG1hcmsgbWFwcGVkIGNvbHVtbnMKKyAgICAgICAgaWYgKF9jb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbHVtbklPIGlvID0gZ2V0Q29sdW1uSU8oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW8uaXNJbnNlcnRhYmxlKGksIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgX2NvbHNbaV0uc2V0RmxhZyhDb2x1bW4uRkxBR19ESVJFQ1RfSU5TRVJULCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW8uaXNVcGRhdGFibGUoaSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICBfY29sc1tpXS5zZXRGbGFnKENvbHVtbi5GTEFHX0RJUkVDVF9VUERBVEUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG9uY2UgY29sdW1ucyBhcmUgcmVzb2x2ZWQsIHJlc29sdmUgdW5pcXVlIGNvbnN0cmFpbnRzIGFzIHRoZXkgbmVlZAorICAgICAgICAvLyB0aGUgY29sdW1ucyBiZSByZXNvbHZlZCAKKyAgICAgICAgX2luZm8uZ2V0VW5pcXVlcyh0aGlzLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBub24tcmVsYXRpb24gZmllbGQgbWFwcGluZ3Mgc28gdGhhdCB3aGVuIHdlIGRvIHJlbGF0aW9uCisgICAgICogbWFwcGluZ3MgdGhleSBjYW4gcmVseSBvbiB0aGVtIGZvciBqb2lucy4KKyAgICAgKi8KKyAgICB2b2lkIHJlc29sdmVOb25SZWxhdGlvbk1hcHBpbmdzKCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgcHJpbWFyeSBrZXkgZmllbGRzIGFyZSByZXNvbHZlZCBmaXJzdCBiZWNhdXNlIG90aGVyCisgICAgICAgIC8vIGZpZWxkcyBtaWdodCByZWx5IG9uIHRoZW0KKyAgICAgICAgRmllbGRNYXBwaW5nW10gZm1zID0gZ2V0UHJpbWFyeUtleUZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBmbXNbaV0ucmVzb2x2ZShNT0RFX01BUFBJTkcpOworCisgICAgICAgIC8vIHJlc29sdmUgZGVmaW5lZCBmaWVsZHMgdGhhdCBhcmUgc2FmZTsgdGhhdCBkb24ndCByZWx5IG9uIG90aGVyIHR5cGVzCisgICAgICAgIC8vIGFsc28gYmVpbmcgcmVzb2x2ZWQuICBkb24ndCB1c2UgZ2V0RGVmaW5lZEZpZWxkcyBiL2MgaXQgcmVsaWVzIG9uCisgICAgICAgIC8vIHdoZXRoZXIgZmllbGRzIGFyZSBtYXBwZWQsIHdoaWNoIGlzbid0IGtub3duIHlldAorICAgICAgICBmbXMgPSBnZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGZtc1tpXS5nZXREZWZpbmluZ01ldGFEYXRhKCkgPT0gdGhpcworICAgICAgICAgICAgICAgICYmICFmbXNbaV0uaXNUeXBlUEMoKSAmJiAhZm1zW2ldLmdldEtleSgpLmlzVHlwZVBDKCkKKyAgICAgICAgICAgICAgICAmJiAhZm1zW2ldLmdldEVsZW1lbnQoKS5pc1R5cGVQQygpKQorICAgICAgICAgICAgICAgIGZtc1tpXS5yZXNvbHZlKE1PREVfTUFQUElORyk7CisKKyAgICAgICAgX2Rpc2NyaW0ucmVzb2x2ZShNT0RFX01BUFBJTkcpOworICAgICAgICBfdmVyc2lvbi5yZXNvbHZlKE1PREVfTUFQUElORyk7ICAgICAgICAKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGluZygpIHsKKyAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZU1hcHBpbmcoKTsKKworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBnZXREZWZpbmVkRmllbGRNYXBwaW5ncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGZpZWxkc1tpXS5yZXNvbHZlKE1PREVfTUFQUElOR19JTklUKTsKKyAgICAgICAgX2Rpc2NyaW0ucmVzb2x2ZShNT0RFX01BUFBJTkdfSU5JVCk7CisgICAgICAgIF92ZXJzaW9uLnJlc29sdmUoTU9ERV9NQVBQSU5HX0lOSVQpOworICAgICAgICBfc3RyYXRlZ3kuaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyRGVmaW5lZEZpZWxkQ2FjaGUoKSB7CisgICAgICAgIC8vIGp1c3QgbWFrZSB0aGlzIG1ldGhvZCBhdmFpbGFibGUgdG8gb3RoZXIgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UKKyAgICAgICAgc3VwZXIuY2xlYXJEZWZpbmVkRmllbGRDYWNoZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyU3ViY2xhc3NDYWNoZSgpIHsKKyAgICAgICAgc3VwZXIuY2xlYXJTdWJjbGFzc0NhY2hlKCk7CisgICAgICAgIF9qb2luU3ViTWFwcyA9IG51bGw7CisgICAgICAgIF9hc3NpZ25NYXBzID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5KENsYXNzTWV0YURhdGEgY2xzKSB7CisgICAgICAgIHN1cGVyLmNvcHkoY2xzKTsKKyAgICAgICAgaWYgKF9zdWJjbGFzc01vZGUgPT0gSW50ZWdlci5NQVhfVkFMVUUpCisgICAgICAgICAgICBfc3ViY2xhc3NNb2RlID0gKChDbGFzc01hcHBpbmcpIGNscykuZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZURhdGFTdG9yZUV4dGVuc2lvblByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHJldHVybiAiamRiYy0iLmVxdWFscyhwcmVmaXgpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2xhc3NTdHJhdGVneSBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5nZXRBbGlhcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkubWFwKGFkYXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5pbnNlcnQoc20sIHN0b3JlLCBybSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkudXBkYXRlKHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmRlbGV0ZShzbSwgc3RvcmUsIHJtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21JbnNlcnQoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbVVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbURlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21JbnNlcnQoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21EZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc01hcHBpbmcoQ2xhc3NNYXBwaW5nIG93bmVyKSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuc2V0Q2xhc3NNYXBwaW5nKG93bmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXlPYmplY3RJZChib29sZWFuIGhhc0FsbCkgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5pc1ByaW1hcnlLZXlPYmplY3RJZChoYXNBbGwpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luU3VwZXJjbGFzcyhKb2lucyBqb2lucywgYm9vbGVhbiB0b1RoaXMpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuam9pblN1cGVyY2xhc3Moam9pbnMsIHRvVGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFYWdlclNlbGVjdChTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIENsYXNzTWFwcGluZyBiYXNlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLnN1cHBvcnRzRWFnZXJTZWxlY3Qoc2VsLCBzbSwgc3RvcmUsIGJhc2UsCisgICAgICAgICAgICBmZXRjaCk7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdE9iamVjdFByb3ZpZGVyIGN1c3RvbUxvYWQoSkRCQ1N0b3JlIHN0b3JlLCBib29sZWFuIHN1YmNsYXNzZXMsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGxvbmcgc3RhcnRJZHgsIGxvbmcgZW5kSWR4KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuY3VzdG9tTG9hZChzdG9yZSwgc3ViY2xhc3NlcywgZmV0Y2gsCisgICAgICAgICAgICBzdGFydElkeCwgZW5kSWR4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjdXN0b21Mb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgUENTdGF0ZSBzdGF0ZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmN1c3RvbUxvYWQoc20sIHN0b3JlLCBzdGF0ZSwgZmV0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGN1c3RvbUxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzdWx0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuY3VzdG9tTG9hZChzbSwgc3RvcmUsIGZldGNoLCByZXN1bHQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIENsYXNzU3RyYXRlZ3kgYXNzZXJ0U3RyYXRlZ3koKSB7CisgICAgICAgIGlmIChfc3RyYXRlZ3kgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gX3N0cmF0ZWd5OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9DbGFzc01hcHBpbmdJbmZvLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvQ2xhc3NNYXBwaW5nSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZWMyNGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvQ2xhc3NNYXBwaW5nSW5mby5qYXZhCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5GdWxsQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5Tb3VyY2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuQ29tbWVudGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFwcGluZyBmcm9tIGEgY2xhc3MgdG8gdGhlIHNjaGVtYSwgaW4gcmF3IGZvcm0uCisgKiBUaGUgY29sdW1ucyBhbmQgdGFibGVzIHVzZWQgaW4gbWFwcGluZyBpbmZvIHdpbGwgbm90IGJlIHBhcnQgb2YgdGhlCisgKiB7QGxpbmsgU2NoZW1hR3JvdXB9IHVzZWQgYXQgcnVudGltZS4gUmF0aGVyLCB0aGV5IHdpbGwgYmUgc3RydWN0cworICogd2l0aCB0aGUgcmVsZXZhbnQgcGllY2VzIG9mIGluZm9ybWF0aW9uIGZpbGxlZCBpbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NNYXBwaW5nSW5mbworICAgIGV4dGVuZHMgTWFwcGluZ0luZm8KKyAgICBpbXBsZW1lbnRzIFNvdXJjZVRyYWNrZXIsIENvbW1lbnRhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKENsYXNzTWFwcGluZ0luZm8uY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX2NsYXNzTmFtZSA9IE9iamVjdC5jbGFzcy5nZXROYW1lKCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhYmxlTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtYU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfam9pbmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBNYXAgX3NlY29uZHMgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9zdWJTdHJhdCA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIF9maWxlID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc3JjVHlwZSA9IFNSQ19PVEhFUjsKKyAgICBwcml2YXRlIFN0cmluZ1tdIF9jb21tZW50cyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF91bmlxdWVzID0gbnVsbDsvL1VuaXF1ZQorCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaWJlZCBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gX2NsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpYmVkIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIF9jbGFzc05hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IGZvciBzdWJjbGFzc2VzIGluIHRoaXMgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGllcmFyY2h5U3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBfc3ViU3RyYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgc3RyYXRlZ3kgZm9yIHN1YmNsYXNzZXMgaW4gdGhpcyBoaWVyYXJjaHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGllcmFyY2h5U3RyYXRlZ3koU3RyaW5nIHN0cmF0ZWd5KSB7CisgICAgICAgIF9zdWJTdHJhdCA9IHN0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBnaXZlbiB0YWJsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2l2ZW4gdGFibGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIHRhYmxlKSB7CisgICAgICAgIF90YWJsZU5hbWUgPSB0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBzY2hlbWEgbmFtZSBmb3IgdW5xdWFsaWZpZWQgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zY2hlbWFOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHNjaGVtYSBuYW1lIGZvciB1bnF1YWxpZmllZCB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hTmFtZShTdHJpbmcgc2NoZW1hKSB7CisgICAgICAgIF9zY2hlbWFOYW1lID0gc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlcmUgaXMgYSBqb2luIHRvIHRoZSBzdXBlcmNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSm9pbmVkU3ViY2xhc3MoKSB7CisgICAgICAgIHJldHVybiBfam9pbmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlcmUgaXMgYSBqb2luIHRvIHRoZSBzdXBlcmNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5lZFN1YmNsYXNzKGJvb2xlYW4gam9pbmVkKSB7CisgICAgICAgIF9qb2luZWQgPSBqb2luZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzcy1sZXZlbCBqb2luZWQgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWNvbmRhcnlUYWJsZU5hbWVzKCkgeworICAgICAgICBpZiAoX3NlY29uZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBfc2Vjb25kcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbXXsgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgYWxsb3cgZmllbGRzIHRvIHJlZmVyZW5jZSBjbGFzcy1sZXZlbCBqb2lucyB1c2luZyBqdXN0IHRoZSB0YWJsZQorICAgICAqIG5hbWUsIHdoZXJlYXMgdGhlIGNsYXNzIGpvaW4gbWlnaHQgaGF2ZSBzY2hlbWEsIGV0YyBpbmZvcm1hdGlvbi4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiB0YWJsZSBhcyBsaXN0ZWQgaW4gYQorICAgICAqIGNsYXNzLWxldmVsIGpvaW4sIG9yIHRoZSBnaXZlbiBuYW1lIGlmIG5vIGpvaW4gZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKFN0cmluZyB0YWJsZU5hbWUpIHsKKyAgICAgICAgLy8gaWYgbm8gc2Vjb25kYXJ5IHRhYmxlIGpvaW5zLCBiYWQgdGFibGUgbmFtZSwgZXhhY3QgbWF0Y2gsCisgICAgICAgIC8vIG9yIGFuIGFscmVhZHktcXVhbGlmaWVkIHRhYmxlIG5hbWUsIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgaWYgKF9zZWNvbmRzID09IG51bGwgfHwgdGFibGVOYW1lID09IG51bGwKKyAgICAgICAgICAgIHx8IF9zZWNvbmRzLmNvbnRhaW5zS2V5KHRhYmxlTmFtZSkKKyAgICAgICAgICAgIHx8IHRhYmxlTmFtZS5pbmRleE9mKCcuJykgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gdGFibGVOYW1lOworCisgICAgICAgIC8vIGRlY2lkZSB3aGljaCBjbGFzcy1sZXZlbCBqb2luIHRhYmxlIGlzIGJlc3QgbWF0Y2gKKyAgICAgICAgU3RyaW5nIGJlc3QgPSB0YWJsZU5hbWU7CisgICAgICAgIGludCBwdHMgPSAwOworICAgICAgICBTdHJpbmcgZnVsbEpvaW47CisgICAgICAgIFN0cmluZyBqb2luOworICAgICAgICBpbnQgaWR4OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9zZWNvbmRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAvLyBhd2FyZCBhIGNhc2VsZXNzIG1hdGNoIHdpdGhvdXQgc2NoZW1hIDIgcG9pbnRzCisgICAgICAgICAgICBmdWxsSm9pbiA9IChTdHJpbmcpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZHggPSBmdWxsSm9pbi5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSAmJiBwdHMgPCAyICYmIGZ1bGxKb2luLmVxdWFsc0lnbm9yZUNhc2UodGFibGVOYW1lKSkgeworICAgICAgICAgICAgICAgIGJlc3QgPSBmdWxsSm9pbjsKKyAgICAgICAgICAgICAgICBwdHMgPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPT0gLTEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJldHVybiBhbiBleGFjdCBtYXRjaCB3aXRoIHNjaGVtYQorICAgICAgICAgICAgam9pbiA9IGZ1bGxKb2luLnN1YnN0cmluZyhpZHggKyAxKTsKKyAgICAgICAgICAgIGlmIChqb2luLmVxdWFscyh0YWJsZU5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmdWxsSm9pbjsKKworICAgICAgICAgICAgLy8gY2FzZWxlc3MgbWF0Y2ggd2l0aCBzY2hlbWEgd29ydGggMSBwb2ludAorICAgICAgICAgICAgaWYgKHB0cyA8IDEgJiYgam9pbi5lcXVhbHNJZ25vcmVDYXNlKHRhYmxlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBiZXN0ID0gZnVsbEpvaW47CisgICAgICAgICAgICAgICAgcHRzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW55IGNvbHVtbnMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIGNsYXNzIGxldmVsIGpvaW4sIG9yIGVtcHR5CisgICAgICogbGlzdCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFNlY29uZGFyeVRhYmxlSm9pbkNvbHVtbnMoU3RyaW5nIHRhYmxlTmFtZSkgeworICAgICAgICBpZiAoX3NlY29uZHMgPT0gbnVsbCB8fCB0YWJsZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCisgICAgICAgIC8vIGdldCB0aGUgY29sdW1ucyBmb3IgdGhlIGpvaW4gd2l0aCB0aGUgYmVzdCBtYXRjaCBmb3IgdGFibGUgbmFtZQorICAgICAgICBMaXN0IGNvbHMgPSAoTGlzdCkgX3NlY29uZHMuZ2V0KGdldFNlY29uZGFyeVRhYmxlTmFtZSh0YWJsZU5hbWUpKTsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCBnaXZlbiB0YWJsZSBoYXMgZXh0cmEgaW5mbyB0aGUgam9pbiB0YWJsZQorICAgICAgICAgICAgLy8gZG9lc24ndCBoYXZlOyBzdHJpcCBpdAorICAgICAgICAgICAgaW50IGlkeCA9IHRhYmxlTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlTmFtZS5zdWJzdHJpbmcoaWR4ICsgMSk7CisgICAgICAgICAgICAgICAgY29scyA9IChMaXN0KSBfc2Vjb25kcy5nZXQoZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKHRhYmxlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoY29scyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBjb2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY2xhcmUgdGhlIGdpdmVuIGNsYXNzLWxldmVsIGpvaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vjb25kYXJ5VGFibGVKb2luQ29sdW1ucyhTdHJpbmcgdGFibGVOYW1lLCBMaXN0IGNvbHMpIHsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICBpZiAoX3NlY29uZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zZWNvbmRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgX3NlY29uZHMucHV0KHRhYmxlTmFtZSwgY29scyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBUYWJsZSBnZXRUYWJsZShmaW5hbCBDbGFzc01hcHBpbmcgY2xzLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVUYWJsZShjbHMsIG5ldyBUYWJsZURlZmF1bHRzKCkgeworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXQoU2NoZW1hIHNjaGVtYSkgeworICAgICAgICAgICAgICAgIC8vIGRlbGF5IHRoaXMgc28gdGhhdCB3ZSBkb24ndCBkbyBzY2hlbWEgcmVmbGVjdGlvbiBmb3IgdW5pcXVlCisgICAgICAgICAgICAgICAgLy8gdGFibGUgbmFtZSB1bmxlc3MgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgICAgICBnZXRUYWJsZU5hbWUoY2xzLCBzY2hlbWEpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBfc2NoZW1hTmFtZSwgX3RhYmxlTmFtZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGF0YXN0b3JlIGlkZW50aXR5IGNvbHVtbnMgZm9yIHRoZSBnaXZlbiBjbGFzcywgYmFzZWQgb24gdGhlCisgICAgICogZ2l2ZW4gdGVtcGxhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXREYXRhU3RvcmVJZENvbHVtbnMoQ2xhc3NNYXBwaW5nIGNscywgQ29sdW1uW10gdG1wbGF0ZXMsCisgICAgICAgIFRhYmxlIHRhYmxlLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGNscy5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgcG9wdWxhdGVEYXRhU3RvcmVJZENvbHVtbnMoY2xzLCB0YWJsZSwgdG1wbGF0ZXMpOworICAgICAgICByZXR1cm4gY3JlYXRlQ29sdW1ucyhjbHMsICJkYXRhc3RvcmVpZCIsIHRtcGxhdGVzLCB0YWJsZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgam9pbiBmcm9tIHRoaXMgY2xhc3MgdG8gaXRzIHN1cGVyY2xhc3MuIFRoZSB0YWJsZSBmb3IKKyAgICAgKiB0aGlzIGNsYXNzIG11c3QgYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldFN1cGVyY2xhc3NKb2luKGZpbmFsIENsYXNzTWFwcGluZyBjbHMsIFRhYmxlIHRhYmxlLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGlmIChzdXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZvcmVpZ25LZXlEZWZhdWx0cyBkZWYgPSBuZXcgRm9yZWlnbktleURlZmF1bHRzKCkgeworICAgICAgICAgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0KFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBib29sZWFuIGludmVyc2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEpvaW5Gb3JlaWduS2V5KGNscywgbG9jYWwsIGZvcmVpZ24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwgQ29sdW1uIGNvbCwKKyAgICAgICAgICAgICAgICBPYmplY3QgdGFyZ2V0LCBib29sZWFuIGludmVyc2UsIGludCBwb3MsIGludCBjb2xzKSB7CisgICAgICAgICAgICAgICAgY2xzLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlSm9pbkNvbHVtbihjbHMsIGxvY2FsLCBmb3JlaWduLCBjb2wsIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgY29scyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBjcmVhdGVGb3JlaWduS2V5KGNscywgInN1cGVyY2xhc3MiLCBnZXRDb2x1bW5zKCksIGRlZiwgdGFibGUsCisgICAgICAgICAgICBjbHMsIHN1cCwgZmFsc2UsIGFkYXB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBtYXBwaW5nIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgICAqIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNXaXRoKENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgY2xlYXIoZmFsc2UpOworCisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBjbHMuZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoY2xzLmdldFRhYmxlKCkgIT0gbnVsbCAmJiAoc3VwID09IG51bGwKKyAgICAgICAgICAgIHx8IHN1cC5nZXRUYWJsZSgpICE9IGNscy5nZXRUYWJsZSgpKSkKKyAgICAgICAgICAgIF90YWJsZU5hbWUgPSBjbHMuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXREQkRpY3Rpb25hcnkoKS4KKyAgICAgICAgICAgICAgICBnZXRGdWxsTmFtZShjbHMuZ2V0VGFibGUoKSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gc2V0IGlvIGJlZm9yZSBzeW5jaW5nIGNvbHMKKyAgICAgICAgc2V0Q29sdW1uSU8oY2xzLmdldENvbHVtbklPKCkpOworICAgICAgICBpZiAoY2xzLmdldEpvaW5Gb3JlaWduS2V5KCkgIT0gbnVsbCAmJiBzdXAgIT0gbnVsbAorICAgICAgICAgICAgJiYgc3VwLmdldFRhYmxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHN5bmNGb3JlaWduS2V5KGNscywgY2xzLmdldEpvaW5Gb3JlaWduS2V5KCksIGNscy5nZXRUYWJsZSgpLAorICAgICAgICAgICAgICAgIHN1cC5nZXRUYWJsZSgpKTsKKyAgICAgICAgZWxzZSBpZiAoY2xzLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9EQVRBU1RPUkUpCisgICAgICAgICAgICBzeW5jQ29sdW1ucyhjbHMsIGNscy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLCBmYWxzZSk7CisKKyAgICAgICAgLy8gcmVjb3JkIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlmIGNsYXNzIGRvZXMgbm90IHVzZSBkZWZhdWx0IHN0cmF0ZWd5CisgICAgICAgIC8vIGZvciBiYXNlIGNsYXNzZXMsIGFuZCBmb3IgYWxsIHN1YmNsYXNzZXMgc28gd2UgY2FuIGJlIHN1cmUgc3Vic2VxdWVudAorICAgICAgICAvLyBtYXBwaW5nIHJ1bnMgZG9uJ3QgdGhpbmsgc3ViY2xhc3MgaXMgdW5tYXBwZWQKKyAgICAgICAgU3RyaW5nIHN0cmF0ID0gKGNscy5nZXRTdHJhdGVneSgpID09IG51bGwpID8gbnVsbAorICAgICAgICAgICAgOiBjbHMuZ2V0U3RyYXRlZ3koKS5nZXRBbGlhcygpOworICAgICAgICBpZiAoc3RyYXQgIT0gbnVsbCAmJiAoY2xzLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwKKyAgICAgICAgICAgIHx8ICFGdWxsQ2xhc3NTdHJhdGVneS5BTElBUy5lcXVhbHMoc3RyYXQpKSkKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5KHN0cmF0KTsgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1NjaGVtYUNvbXBvbmVudHMoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5oYXNTY2hlbWFDb21wb25lbnRzKCkgfHwgX3RhYmxlTmFtZSAhPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyKGJvb2xlYW4gY2FuRmxhZ3MpIHsKKyAgICAgICAgc3VwZXIuY2xlYXIoY2FuRmxhZ3MpOworICAgICAgICBfdGFibGVOYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5KE1hcHBpbmdJbmZvIGluZm8pIHsKKyAgICAgICAgc3VwZXIuY29weShpbmZvKTsKKyAgICAgICAgaWYgKCEoaW5mbyBpbnN0YW5jZW9mIENsYXNzTWFwcGluZ0luZm8pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENsYXNzTWFwcGluZ0luZm8gY2luZm8gPSAoQ2xhc3NNYXBwaW5nSW5mbykgaW5mbzsKKyAgICAgICAgaWYgKF90YWJsZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIF90YWJsZU5hbWUgPSBjaW5mby5nZXRUYWJsZU5hbWUoKTsKKyAgICAgICAgaWYgKF9zdWJTdHJhdCA9PSBudWxsKQorICAgICAgICAgICAgX3N1YlN0cmF0ID0gY2luZm8uZ2V0SGllcmFyY2h5U3RyYXRlZ3koKTsKKyAgICAgICAgaWYgKGNpbmZvLl9zZWNvbmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfc2Vjb25kcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zZWNvbmRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIE9iamVjdCBrZXk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNpbmZvLl9zZWNvbmRzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBrZXkgPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmICghX3NlY29uZHMuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgX3NlY29uZHMucHV0KGtleSwgY2luZm8uX3NlY29uZHMuZ2V0KGtleSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaW5mby5fdW5pcXVlcyAhPSBudWxsKSAKKyAgICAgICAgICAgX3VuaXF1ZXMgPSBuZXcgQXJyYXlMaXN0KGNpbmZvLl91bmlxdWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVbmlxdWUoVW5pcXVlIHVuaXF1ZSkgeworICAgICAgICBpZiAodW5pcXVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChfdW5pcXVlcyA9PSBudWxsKQorICAgICAgICAgICAgX3VuaXF1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIF91bmlxdWVzLmFkZCh1bmlxdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVW5pcXVlW10gZ2V0VW5pcXVlcygpIHsKKyAgICAgICAgcmV0dXJuIChfdW5pcXVlcyA9PSBudWxsKSA/IG5ldyBVbmlxdWVbMF0gOgorICAgICAgICAgICAgKFVuaXF1ZVtdKV91bmlxdWVzLnRvQXJyYXkobmV3IFVuaXF1ZVtfdW5pcXVlcy5zaXplKCldKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFVuaXF1ZVtdIGdldFVuaXF1ZXMoQ2xhc3NNYXBwaW5nIGNtLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChfdW5pcXVlcyA9PSBudWxsIHx8IF91bmlxdWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgVW5pcXVlWzBdOworICAgICAgICAKKyAgICAgICAgSXRlcmF0b3IgdW5pcXVlQ29uc3RyYWludHMgPSBfdW5pcXVlcy5pdGVyYXRvcigpOworICAgICAgICBUYWJsZSB0YWJsZSA9IGNtLmdldFRhYmxlKCk7CisgICAgICAgIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBVbmlxdWUgdGVtcGxhdGUgPSAoVW5pcXVlKXVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKTsKKyAgICAgICAgICAgIENvbHVtbltdIHRlbXBsYXRlQ29sdW1ucyA9IHRlbXBsYXRlLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgIENvbHVtbltdIHVuaXF1ZUNvbHVtbnMgPSBuZXcgQ29sdW1uW3RlbXBsYXRlQ29sdW1ucy5sZW5ndGhdOworICAgICAgICAgICAgYm9vbGVhbiBtaXNzaW5nQ29sdW1uID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1bmlxdWVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbk5hbWUgPSB0ZW1wbGF0ZUNvbHVtbnNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIENvbHVtbiB1bmlxdWVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oY29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgbWlzc2luZ0NvbHVtbiA9ICh1bmlxdWVDb2x1bW4gPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdDb2x1bW4pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm1pc3NpbmctdW5pcXVlLWNvbHVtbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgY20sIHRhYmxlLCBjb2x1bW5OYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVuaXF1ZUNvbHVtbnNbaV0gPSB1bmlxdWVDb2x1bW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVbmlxdWUgdW5pcXVlID0gc3VwZXIuY3JlYXRlVW5pcXVlKGNtLCAidW5pcXVlIiwgdGVtcGxhdGUsIAorICAgICAgICAgICAgICAgIHVuaXF1ZUNvbHVtbnMsIGFkYXB0KTsKKyAgICAgICAgICAgIGlmICh1bmlxdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHVuaXF1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChVbmlxdWVbXSlyZXN1bHQudG9BcnJheShuZXcgVW5pcXVlW3Jlc3VsdC5zaXplKCldKTsKKyAgICB9ICAgCisgICAgCisgICAgcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWxlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShGaWxlIGZpbGUsIGludCBzcmNUeXBlKSB7CisgICAgICAgIF9maWxlID0gZmlsZTsKKyAgICAgICAgX3NyY1R5cGUgPSBzcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gX2NsYXNzTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiAoX2NvbW1lbnRzID09IG51bGwpID8gRU1QVFlfQ09NTUVOVFMgOiBfY29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudHMoU3RyaW5nW10gY29tbWVudHMpIHsKKyAgICAgICAgX2NvbW1lbnRzID0gY29tbWVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0NsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9DbGFzc1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjNjA0YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9DbGFzc1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5QQ1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdE9iamVjdFByb3ZpZGVyOworCisvKioKKyAqIE1hcHBpbmcgZnJvbSBhIGNsYXNzIHRvIGEgcmVsYXRpb25hbCBzY2hlbWEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIENsYXNzU3RyYXRlZ3kKKyAgICBleHRlbmRzIFN0cmF0ZWd5IHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgbWFwcGluZyB1c2luZyB0aGlzIHN0cmF0ZWd5LiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJlZm9yZQorICAgICAqIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc01hcHBpbmcoQ2xhc3NNYXBwaW5nIG93bmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSB0aGlzIGNsYXNzJyBwcmltYXJ5IGtleSBjb2x1bW5zIGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICogYmFzZSBjbGFzcycgcHJpbWFyeSBrZXkgY29sdW1ucyB1c2VkIHRvIGNvbnN0cnVjdCBvaWQgdmFsdWVzLiBCYXNlCisgICAgICogY2xhc3NlcyBhbHdheXMgcmV0dXJuIHRydWUuIENsYXNzZXMgdGhhdCBqb2luIHRvIHRoZSBiYXNlIGNsYXNzIHRhYmxlLAorICAgICAqIHRob3VnaCwgbWF5IG5vdCBhbHdheXMgam9pbiB1c2luZyB0aGUgc2FtZSBjb2x1bW5zIHRoZSBiYXNlIGNsYXNzCisgICAgICogdXNlcyBmb3Igb2lkIHZhbHVlcywgb3IgbWF5IG5vdCB1c2UgYWxsIHRoZSBjb2x1bW5zLiBXaGVuIHBlcmZvcm1pbmcgYQorICAgICAqIHNlbGVjdCwgd2Ugd2lsbCBqb2luIGRvd24gdG8gdGhlIG1vc3QtZGVyaXZlZCBjbGFzcyB0aGF0IGlzIGlkZW50aWZpZWQKKyAgICAgKiBieSBvaWQgdmFsdWVzLiBXZSBjYW5ub3QgdXNlIG5vbi1wcmltYXJ5IGtleSBmaWVsZCB2YWx1ZXMgZm9yIGpvaW5pbmcKKyAgICAgKiBkdXJpbmcgc2VsZWN0cywgYmVjYXVzZSB0aGUgZmllbGQgdmFsdWVzIHRvIGpvaW4gb24gbWlnaHQgYmUgdGhlIG9uZXMKKyAgICAgKiB3ZSdyZSB0cnlpbmcgdG8gc2VsZWN0ISBTaW1pbGFybHksIHdlIGNhbiBvbmx5IHJlY29uc3RydWN0IG9pZCB2YWx1ZXMKKyAgICAgKiBmb3Igc2VsZWN0ZWQgb2JqZWN0cyB1c2luZyBjbGFzc2VzIHdob3NlIHByaW1hcnkga2V5cyBzdG9yZSBvaWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGhhc0FsbCBpZiB0cnVlLCB0aGVyZSBtdXN0IGJlIGEgcHJpbWFyeSBrZXkgY29sdW1uIGZvciBldmVyeQorICAgICAqIGJhc2UgY2xhc3MgcHJpbWFyeSBrZXkgY29sdW1uOyBpZiBmYWxzZSB0aGUgcHJpbWFyeSBrZXkKKyAgICAgKiBtdXN0IG9ubHkgbWF0Y2ggYSBzdWJzZXQgb2YgdGhlIGJhc2UgY2xhc3MgcHJpbWFyeSBrZXkgY29sdW1ucworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeUtleU9iamVjdElkKGJvb2xlYW4gaGFzQWxsKTsKKworICAgIC8qKgorICAgICAqIEpvaW4gdGhlIG1hcHBpbmcgYW5kIGl0cyBzdXBlcmNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHRvVGhpcyBpZiBmYWxzZSwgaW5uZXIgam9pbiB0byB0aGUgc3VwZXJjbGFzcyB0YWJsZTsgaWYKKyAgICAgKiB0cnVlLCBvdXRlciBqb2luIGZyb20gdGhlIHN1cGVyY2xhc3MgdGFibGUgdG8gdGhpcyB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBqb2luU3VwZXJjbGFzcyhKb2lucyBqb2lucywgYm9vbGVhbiB0b1RoaXMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBzdHJhdGVneSBjYW4gcGVyZm9ybSB0aGUgZ2l2ZW4gc2VsZWN0IGZyb20KKyAgICAgKiB0aGUgZ2l2ZW4gPGNvZGU+YmFzZTwvY29kZT4gbWFwcGluZy4KKyAgICAgKiBUaGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciBtYXkgYmUgbnVsbCBpZiBzZWxlY3RpbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRWFnZXJTZWxlY3QoU2VsZWN0IHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBDbGFzc01hcHBpbmcgYmFzZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIG9idGFpbmluZyBhIHJlc3VsdCBjb250YWluaW5nIGFsbAorICAgICAqIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLiBSZXR1cm4gbnVsbCBmb3Igc3RhbmRhcmQgbG9hZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgY3VzdG9tTG9hZChKREJDU3RvcmUgc3RvcmUsIGJvb2xlYW4gc3ViY2xhc3NlcywKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgbG9uZyBzdGFydElkeCwgbG9uZyBlbmRJZHgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gbG9hZCB0aGUgc3RhdGUgb2YgYSBnaXZlbiBvYmplY3QsIHdpdGhvdXQKKyAgICAgKiBhIHByZXZpb3VzIHtAbGluayBSZXN1bHR9LiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBoYW5kbGVzIHRoZQorICAgICAqIGxvYWQuIElmIHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc3RvcmUsIHNpbXBseSB0YWtlIG5vCisgICAgICogYWN0aW9uIG9uIGl0IChidXQgc3RpbGwgcmV0dXJuIHRydWUpLiBSZXR1cm4gZmFsc2UgdG8gdXNlIGRlZmF1bHQKKyAgICAgKiBsb2FkaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIGlmIG5vbi1udWxsLCB0aGVuIHlvdSBtdXN0IGluaXRpYWxpemUgdGhlIHN0YXRlCisgICAgICogYW5kIHBlcnNpc3RlbnQgb2JqZWN0IG9mIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyCisgICAgICogKGFmdGVyIGRldGVybWluaW5nIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICAgICAqIGZyb20gdGhlIGRhdGFiYXNlLCBpZiB0aGVyZSBhcmUgcG9zc2libGUgcGVyc2lzdGVudAorICAgICAqIHN1YmNsYXNzZXMpOyBpbml0aWFsaXphdGlvbiBsb29rcyBsaWtlIHRoaXM6IDxjb2RlPgorICAgICAqIHNtLmluaXRpYWxpemUgKHBjQ2xhc3MsIHN0YXRlKTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjdXN0b21Mb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgUENTdGF0ZSBzdGF0ZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgbG9hZGluZyBmcm9tIGEge0BsaW5rIFJlc3VsdH0KKyAgICAgKiBpbnRvIGFuIGluc3RhbmNlLiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcHBpbmcgaGFuZGxlcyB0aGUKKyAgICAgKiBsb2FkOyBmYWxzZSBpZiBub3JtYWwgbG9hZGluZyBzaG91bGQgcHJvY2VkZSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGN1c3RvbUxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzdWx0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0RlbGVnYXRpbmdKb2luYWJsZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0RlbGVnYXRpbmdKb2luYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWZlODcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRGVsZWdhdGluZ0pvaW5hYmxlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBEZWxlZ2F0ZXMgdG8gYW5vdGhlciB7QGxpbmsgSm9pbmFibGV9IGFmdGVyIGRvaW5nIGNvbHVtbgorICogdHJhbnNsYXRpb24uIFVzZWZ1bCBmb3Igam9pbnMgdGhhdCBhcmUgbm90IG1hbmFnZWQgYnkgYW55IGZpZWxkcyBvbgorICogdGhlIGpvaW5lZC1mcm9tIHNpZGUuIEZvciBleGFtcGxlLCBhIHZlcnRpY2FsIGNsYXNzIG1hcHBpbmcgbWFuYWdlcworICogZm9yZWlnbiBrZXkgY29sdW1ucyBsaW5raW5nIHRvIHRoZSBzdXBlcmNsYXNzIHRhYmxlLiBJdCBuZWVkcyB0byB1c2UKKyAqIHRoZSBqb2luYWJsZXMgb2YgdGhlIHN1cGVyY2xhc3MgdG8gYWN0dWFsbHkgZXh0cmFjdCB0aGUgY29sdW1uIHZhbHVlcworICogZnJvbSBmaWVsZCB2YWx1ZXMgYW5kIHNvIGZvcnRoLCBidXQgaW4gb3JkZXIgZm9yIG90aGVyIG1hcHBpbmdzIHRvIGpvaW4KKyAqIHRvIGl0cyBmb3JlaWduIGtleSBjb2x1bW5zIGl0IG5lZWRzIGpvaW5hYmxlcyBvZiBpdHMgb3duLiBTbyBpdCBjcmVhdGVzCisgKiBkZWxlZ2F0aW5nIGpvaW5hYmxlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0pvaW5hYmxlCisgICAgaW1wbGVtZW50cyBKb2luYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChEZWxlZ2F0aW5nSm9pbmFibGUuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBKb2luYWJsZSBfam9pbjsKKyAgICBwcml2YXRlIGZpbmFsIEZvcmVpZ25LZXkgX2ZrOworICAgIHByaXZhdGUgZmluYWwgQ29sdW1uW10gX2NvbHM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqb2luIHRoZSBtYXBwaW5nIHRvIGRlbGVnYXRlIHRvCisgICAgICogQHBhcmFtIGZrIHRoZSBmb3JlaWduIGtleSB0byB1c2UgdG8gdHJhbnNsYXRlIGFueSBnaXZlbiBjb2x1bW5zCisgICAgICogdG8gdGhlIGdpdmVuIGRlbGVnYXRlJ3MgY29sdW1ucworICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nSm9pbmFibGUoSm9pbmFibGUgam9pbiwgRm9yZWlnbktleSBmaykgeworICAgICAgICBfam9pbiA9IGpvaW47CisgICAgICAgIF9mayA9IGZrOworCisgICAgICAgIENvbHVtbltdIHBrcyA9IGpvaW4uZ2V0Q29sdW1ucygpOworICAgICAgICBfY29scyA9IG5ldyBDb2x1bW5bcGtzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBfY29sc1tpXSA9IGZrLmdldENvbHVtbihwa3NbaV0pOworICAgICAgICAgICAgaWYgKF9jb2xzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbmNvbXBsZXRlLWpvaW4iLAorICAgICAgICAgICAgICAgICAgICBwa3NbaV0uZ2V0RnVsbE5hbWUoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gam9pbiB0aGUgbWFwcGluZyB0byBkZWxlZ2F0ZSB0bworICAgICAqIEBwYXJhbSBjb2xzIHRyYW5zbGF0ZWQgY29sdW1ucworICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nSm9pbmFibGUoSm9pbmFibGUgam9pbiwgQ29sdW1uW10gY29scykgeworICAgICAgICBfam9pbiA9IGpvaW47CisgICAgICAgIF9mayA9IG51bGw7CisgICAgICAgIF9jb2xzID0gY29sczsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoICE9IGpvaW4uZ2V0Q29sdW1ucygpLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXJlbWFwIiwKKyAgICAgICAgICAgICAgICBqb2luLmdldENvbHVtbnMoKVswXS5nZXRGdWxsTmFtZSgpKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGaWVsZEluZGV4KCkgeworICAgICAgICByZXR1cm4gX2pvaW4uZ2V0RmllbGRJbmRleCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJpbWFyeUtleVZhbHVlKFJlc3VsdCByZXMsIENvbHVtbltdIGNvbHMsIEZvcmVpZ25LZXkgZmssIAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9qb2luLmdldFByaW1hcnlLZXlWYWx1ZShyZXMsIGNvbHMsIGZrLCBzdG9yZSwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKCkgeworICAgICAgICByZXR1cm4gX2NvbHM7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRKb2luVmFsdWUoT2JqZWN0IHZhbCwgQ29sdW1uIGNvbCwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBfam9pbi5nZXRKb2luVmFsdWUodmFsLCB0cmFuc2xhdGUoY29sKSwgc3RvcmUpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Sm9pblZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENvbHVtbiBjb2wsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gX2pvaW4uZ2V0Sm9pblZhbHVlKHNtLCB0cmFuc2xhdGUoY29sKSwgc3RvcmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9Bc3NpZ25lZFZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgQ29sdW1uIGNvbCwgT2JqZWN0IGF1dG9nZW4pIHsKKyAgICAgICAgX2pvaW4uc2V0QXV0b0Fzc2lnbmVkVmFsdWUoc20sIHN0b3JlLCB0cmFuc2xhdGUoY29sKSwgYXV0b2dlbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2x1bW4gdHJhbnNsYXRlKENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKF9mayAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9may5nZXRQcmltYXJ5S2V5Q29sdW1uKGNvbCk7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IF9qb2luLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbCA9PSBjb2xzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBfY29sc1tpXTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0Rpc2NyaW1pbmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9EaXNjcmltaW5hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmNDYxMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9EaXNjcmltaW5hdG9yLmphdmEKQEAgLTAsMCArMSw0MTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworCisvKioKKyAqIEhhbmRsZXMgZGV0ZXJtaW5pbmcgdGhlIG9iamVjdCBjbGFzcyBvZiBkYXRhYmFzZSByZWNvcmRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yCisgICAgaW1wbGVtZW50cyBEaXNjcmltaW5hdG9yU3RyYXRlZ3ksIE1ldGFEYXRhQ29udGV4dCwgTWV0YURhdGFNb2RlcyB7CisKKyAgICAvKioKKyAgICAgKiBOdWxsIGRpc2NyaW1pbmF0b3IgdmFsdWUgbWFya2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5VTEwgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChEaXNjcmltaW5hdG9yLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NNYXBwaW5nIF9tYXBwaW5nOworICAgIHByaXZhdGUgZmluYWwgRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvIF9pbmZvOworICAgIHByaXZhdGUgRGlzY3JpbWluYXRvclN0cmF0ZWd5IF9zdHJhdGVneSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX3Jlc01vZGUgPSBNT0RFX05PTkU7CisKKyAgICBwcml2YXRlIENvbHVtbltdIF9jb2xzID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgIHByaXZhdGUgQ29sdW1uSU8gX2lvID0gbnVsbDsKKyAgICBwcml2YXRlIEluZGV4IF9pZHggPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3Vic0xvYWRlZCA9IGZhbHNlOworICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IG93bmluZyBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBEaXNjcmltaW5hdG9yKENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIF9tYXBwaW5nID0gbWFwcGluZzsKKyAgICAgICAgX2luZm8gPSBnZXRNYXBwaW5nUmVwb3NpdG9yeSgpLm5ld01hcHBpbmdJbmZvKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIF9tYXBwaW5nLmdldFJlcG9zaXRvcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwcGluZ1JlcG9zaXRvcnkgZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiBfbWFwcGluZy5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3duaW5nIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBfbWFwcGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyYXRlZ3kgdXNlZCBmb3IgY2xhc3MgZGlzY3JpbWluYXRpb24uCisgICAgICovCisgICAgcHVibGljIERpc2NyaW1pbmF0b3JTdHJhdGVneSBnZXRTdHJhdGVneSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdHJhdGVneTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyYXRlZ3kgdXNlZCBmb3IgY2xhc3MgZGlzY3JpbWluYXRpb24uIFRoZSA8Y29kZT5hZGFwdDwvY29kZT4KKyAgICAgKiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGFkYXB0IHdoZW4gbWFwcGluZyB0aGUgc3RyYXRlZ3k7CisgICAgICogdXNlIG51bGwgaWYgdGhlIHN0cmF0ZWd5IHNob3VsZCBub3QgYmUgbWFwcGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KERpc2NyaW1pbmF0b3JTdHJhdGVneSBzdHJhdGVneSwgQm9vbGVhbiBhZGFwdCkgeworICAgICAgICAvLyBzZXQgc3RyYXRlZ3kgZmlyc3Qgc28gd2UgY2FuIGFjY2VzcyBpdCBkdXJpbmcgbWFwcGluZworICAgICAgICBEaXNjcmltaW5hdG9yU3RyYXRlZ3kgb3JpZyA9IF9zdHJhdGVneTsKKyAgICAgICAgX3N0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgICAgIGlmIChzdHJhdGVneSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmF0ZWd5LnNldERpc2NyaW1pbmF0b3IodGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKGFkYXB0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5Lm1hcChhZGFwdC5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgc3RyYXRlZ3kKKyAgICAgICAgICAgICAgICBfc3RyYXRlZ3kgPSBvcmlnOworICAgICAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzY3JpbWluYXRvciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgX3ZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmF3IG1hcHBpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvIGdldE1hcHBpbmdJbmZvKCkgeworICAgICAgICByZXR1cm4gX2luZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyB1c2VkIGJ5IHRoaXMgRGlzY3JpbWluYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgcmV0dXJuIF9jb2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgdXNlZCBieSB0aGlzIERpc2NyaW1pbmF0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1ucyhDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIGlmIChjb2xzID09IG51bGwpCisgICAgICAgICAgICBjb2xzID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgICAgICBfY29scyA9IGNvbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGluZm9ybWF0aW9uIG9uIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbklPIGdldENvbHVtbklPKCkgeworICAgICAgICByZXR1cm4gKF9pbyA9PSBudWxsKSA/IENvbHVtbklPLlVOUkVTVFJJQ1RFRCA6IF9pbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJL08gaW5mb3JtYXRpb24gb24gdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5JTyhDb2x1bW5JTyBpbykgeworICAgICAgICBfaW8gPSBpbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRleCBvbiB0aGUgRGlzY3JpbWluYXRvciBjb2x1bW5zLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIEluZGV4IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gX2lkeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRleCBvbiB0aGUgRGlzY3JpbWluYXRvciBjb2x1bW5zLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoSW5kZXggaWR4KSB7CisgICAgICAgIF9pZHggPSBpZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdXNlZCBzY2hlbWEgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZTY2hlbWFDb21wb25lbnRzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX2NvbHNbaV0ucmVmKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgbWFwcGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyTWFwcGluZygpIHsKKyAgICAgICAgX3N0cmF0ZWd5ID0gbnVsbDsKKyAgICAgICAgX2NvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgICAgIF9pZHggPSBudWxsOworICAgICAgICBfdmFsdWUgPSBudWxsOworICAgICAgICBfaW5mby5jbGVhcigpOworICAgICAgICBzZXRSZXNvbHZlKE1PREVfTUFQUElORyB8IE1PREVfTUFQUElOR19JTklULCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHtAbGluayBNYXBwaW5nSW5mb30gd2l0aCBvdXIgY3VycmVudCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNNYXBwaW5nSW5mbygpIHsKKyAgICAgICAgX2luZm8uc3luY1dpdGgodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlKGludCBtb2RlKSB7CisgICAgICAgIF9yZXNNb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAobW9kZSA9PSBNT0RFX05PTkUpCisgICAgICAgICAgICBfcmVzTW9kZSA9IG1vZGU7CisgICAgICAgIGVsc2UgaWYgKG9uKQorICAgICAgICAgICAgX3Jlc01vZGUgfD0gbW9kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3Jlc01vZGUgJj0gfm1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc29sdmUoaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKChfcmVzTW9kZSAmIG1vZGUpID09IG1vZGUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaW50IGN1ciA9IF9yZXNNb2RlOworICAgICAgICBfcmVzTW9kZSB8PSBtb2RlOworICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01BUFBJTkcpICE9IDAgJiYgKGN1ciAmIE1PREVfTUFQUElORykgPT0gMCkKKyAgICAgICAgICAgIHJlc29sdmVNYXBwaW5nKCk7CisgICAgICAgIGlmICgobW9kZSAmIE1PREVfTUFQUElOR19JTklUKSAhPSAwICYmIChjdXIgJiBNT0RFX01BUFBJTkdfSU5JVCkgPT0gMCkKKyAgICAgICAgICAgIF9zdHJhdGVneS5pbml0aWFsaXplKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR1cCBtYXBwaW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlTWFwcGluZygpIHsKKyAgICAgICAgLy8gbWFwIHN0cmF0ZWd5CisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKTsKKyAgICAgICAgaWYgKF9zdHJhdGVneSA9PSBudWxsKQorICAgICAgICAgICAgcmVwb3MuZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pbnN0YWxsU3RyYXRlZ3kodGhpcyk7CisgICAgICAgIExvZyBsb2cgPSByZXBvcy5nZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzdHJhdGVneSIsIHRoaXMsIF9zdHJhdGVneS5nZXRBbGlhcygpKSk7CisKKyAgICAgICAgLy8gbWFyayBjb2x1bW5zIGFzIG1hcHBlZAorICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICBDb2x1bW5JTyBpbyA9IGdldENvbHVtbklPKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGlvLmlzSW5zZXJ0YWJsZShpLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRGbGFnKENvbHVtbi5GTEFHX0RJUkVDVF9JTlNFUlQsIHRydWUpOworICAgICAgICAgICAgaWYgKGlvLmlzVXBkYXRhYmxlKGksIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldEZsYWcoQ29sdW1uLkZMQUdfRElSRUNUX1VQREFURSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgRGlzY3JpbWluYXRvciBoYXMgbG9hZGVkIHN1YmNsYXNzZXMgeWV0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFN1YmNsYXNzZXNMb2FkZWQoKSB7CisgICAgICAgIGlmICghX3N1YnNMb2FkZWQpIHsKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBfbWFwcGluZy5nZXRQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgc3VwLmdldERpc2NyaW1pbmF0b3IoKS5nZXRTdWJjbGFzc2VzTG9hZGVkKCkpCisgICAgICAgICAgICAgICAgX3N1YnNMb2FkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfc3Vic0xvYWRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgRGlzY3JpbWluYXRvciBoYXMgbG9hZGVkIHN1YmNsYXNzZXMgeWV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1YmNsYXNzZXNMb2FkZWQoYm9vbGVhbiBsb2FkZWQpIHsKKyAgICAgICAgX3N1YnNMb2FkZWQgPSBsb2FkZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIFdIRVJFIGNvbmRpdGlvbnMgdG8gdGhlIGdpdmVuIHNlbGVjdCBsaW1pdGluZyB0aGUgcmV0dXJuZWQgcmVzdWx0cworICAgICAqIHRvIG91ciBtYXBwaW5nIHR5cGUsIHBvc3NpYmx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZENsYXNzQ29uZGl0aW9ucyhTZWxlY3Qgc2VsLCBib29sZWFuIHN1YnMsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGlmIChfbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSA9PSBudWxsCisgICAgICAgICAgICAmJiBfbWFwcGluZy5nZXRKb2luYWJsZVBDU3ViY2xhc3NNYXBwaW5ncygpLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWhhc0NsYXNzQ29uZGl0aW9ucyhfbWFwcGluZywgc3VicykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gam9pbiBkb3duIHRvIGJhc2UgY2xhc3Mgd2hlcmUgY29uZGl0aW9ucyB3aWxsIGJlIGFkZGVkCisgICAgICAgIENsYXNzTWFwcGluZyBmcm9tID0gX21hcHBpbmc7CisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBfbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgZm9yICg7IHN1cCAhPSBudWxsOyBmcm9tID0gc3VwLCBzdXAgPSBmcm9tCisgICAgICAgICAgICAuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChmcm9tLmdldFRhYmxlKCkgIT0gc3VwLmdldFRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoam9pbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgam9pbnMgPSBzZWwubmV3Sm9pbnMoKTsKKyAgICAgICAgICAgICAgICBqb2lucyA9IGZyb20uam9pblN1cGVyY2xhc3Moam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNlbC53aGVyZShnZXRDbGFzc0NvbmRpdGlvbnMoc2VsLCBqb2lucywgX21hcHBpbmcsIHN1YnMpLCBqb2lucyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEaXNjcmltaW5hdG9yU3RyYXRlZ3kgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5nZXRBbGlhcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkubWFwKGFkYXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5pbnNlcnQoc20sIHN0b3JlLCBybSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkudXBkYXRlKHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmRlbGV0ZShzbSwgc3RvcmUsIHJtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21JbnNlcnQoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbVVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbURlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21JbnNlcnQoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21EZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yKERpc2NyaW1pbmF0b3Igb3duZXIpIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5zZXREaXNjcmltaW5hdG9yKG93bmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuc2VsZWN0KHNlbCwgbWFwcGluZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFN1YmNsYXNzZXMoSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5sb2FkU3ViY2xhc3NlcyhzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldENsYXNzKEpEQkNTdG9yZSBzdG9yZSwgQ2xhc3NNYXBwaW5nIGJhc2UsIFJlc3VsdCByZXN1bHQpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5nZXRDbGFzcyhzdG9yZSwgYmFzZSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc0NvbmRpdGlvbnMoQ2xhc3NNYXBwaW5nIGJhc2UsIGJvb2xlYW4gc3VicykgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5oYXNDbGFzc0NvbmRpdGlvbnMoYmFzZSwgc3Vicyk7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciBnZXRDbGFzc0NvbmRpdGlvbnMoU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMsIAorICAgICAgICBDbGFzc01hcHBpbmcgYmFzZSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmdldENsYXNzQ29uZGl0aW9ucyhzZWwsIGpvaW5zLCBiYXNlLCBzdWJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERpc2NyaW1pbmF0b3JTdHJhdGVneSBhc3NlcnRTdHJhdGVneSgpIHsKKyAgICAgICAgaWYgKF9zdHJhdGVneSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiBfc3RyYXRlZ3k7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIF9tYXBwaW5nICsgIjxkaXNjcmltaW5hdG9yPiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0Rpc2NyaW1pbmF0b3JNYXBwaW5nSW5mby5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0Rpc2NyaW1pbmF0b3JNYXBwaW5nSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzNlYTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5TdXBlcmNsYXNzRGlzY3JpbWluYXRvclN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlZhbHVlTWFwRGlzY3JpbWluYXRvclN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFwcGluZyBmcm9tIGEgZGlzY3JpbWluYXRvciB0byB0aGUgc2NoZW1hLCBpbgorICogcmF3IGZvcm0uIFRoZSBjb2x1bW5zIGFuZCB0YWJsZXMgdXNlZCBpbiBtYXBwaW5nIGluZm8gd2lsbCBub3QgYmUgcGFydCBvZgorICogdGhlIHtAbGluayBTY2hlbWFHcm91cH0gdXNlZCBhdCBydW50aW1lLiBSYXRoZXIsIHRoZXkgd2lsbCBiZSBzdHJ1Y3RzCisgKiB3aXRoIHRoZSByZWxldmFudCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gZmlsbGVkIGluLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yTWFwcGluZ0luZm8KKyAgICBleHRlbmRzIE1hcHBpbmdJbmZvIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKERpc2NyaW1pbmF0b3JNYXBwaW5nSW5mby5jbGFzcyk7CisKKyAgICBwcml2YXRlIFN0cmluZyBfdmFsdWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmF3IGRpc2NyaW1pbmF0b3IgdmFsdWUgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBfdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmF3IGRpc2NyaW1pbmF0b3IgdmFsdWUgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgYXMgYW4gb2JqZWN0IG9mIHRoZSByaWdodCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRGlzY3JpbWluYXRvciBkaXNjcmltLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChkaXNjcmltLmdldFZhbHVlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkaXNjcmltLmdldFZhbHVlKCk7CisgICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkaXNjcmltLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgZ2V0RGlzY3JpbWluYXRvclZhbHVlKGRpc2NyaW0sIGFkYXB0KTsKKworICAgICAgICBpZiAoX3ZhbHVlLmxlbmd0aCgpID4gMCAmJiAoX3ZhbHVlLmNoYXJBdCgwKSA9PSAnLScgCisgICAgICAgICAgICB8fCBDaGFyYWN0ZXIuaXNEaWdpdChfdmFsdWUuY2hhckF0KDApKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKF92YWx1ZS5pbmRleE9mKCcuJykgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihfdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKF92YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZGlzY3JpbS12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIGRpc2NyaW0uZ2V0Q2xhc3NNYXBwaW5nKCksIF92YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgibnVsbCIuZXF1YWxzSWdub3JlQ2FzZShfdmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIERpc2NyaW1pbmF0b3IuTlVMTDsKKworICAgICAgICAvLyBzdHJpcCBxdW90ZXMKKyAgICAgICAgaWYgKF92YWx1ZS5sZW5ndGgoKSA+IDAgJiYgX3ZhbHVlLmNoYXJBdCgwKSA9PSAnXCcnKQorICAgICAgICAgICAgcmV0dXJuIF92YWx1ZS5zdWJzdHJpbmcoMSwgX3ZhbHVlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIHJldHVybiBfdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW5zIHNldCBmb3IgdGhpcyBkaXNjcmltaW5hdG9yLCBiYXNlZCBvbiB0aGUgZ2l2ZW4KKyAgICAgKiB0ZW1wbGF0ZXMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoRGlzY3JpbWluYXRvciBkaXNjcmltLCBDb2x1bW5bXSB0bXBsYXRlcywKKyAgICAgICAgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IGRpc2NyaW0uZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0VGFibGUoKTsKKyAgICAgICAgZGlzY3JpbS5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLnBvcHVsYXRlQ29sdW1ucworICAgICAgICAgICAgKGRpc2NyaW0sIHRhYmxlLCB0bXBsYXRlcyk7CisgICAgICAgIHJldHVybiBjcmVhdGVDb2x1bW5zKGRpc2NyaW0sIG51bGwsIHRtcGxhdGVzLCB0YWJsZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggdG8gc2V0IG9uIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbnMsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoRGlzY3JpbWluYXRvciBkaXNjcmltLCBDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIEluZGV4IGlkeCA9IG51bGw7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA+IDApCisgICAgICAgICAgICBpZHggPSBkaXNjcmltLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgZ2V0SW5kZXgoZGlzY3JpbSwgY29sc1swXS5nZXRUYWJsZSgpLCBjb2xzKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KGRpc2NyaW0sIG51bGwsIGlkeCwgY29scywgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplIGludGVybmFsIGluZm9ybWF0aW9uIHdpdGggdGhlIG1hcHBpbmcgZGF0YSBmb3IgdGhlIGdpdmVuCisgICAgICogZGlzY3JpbWluYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jV2l0aChEaXNjcmltaW5hdG9yIGRpc2MpIHsKKyAgICAgICAgY2xlYXIoZmFsc2UpOworCisgICAgICAgIC8vIHNldCBpbyBiZWZvcmUgc3luY2luZyBjb2xzCisgICAgICAgIHNldENvbHVtbklPKGRpc2MuZ2V0Q29sdW1uSU8oKSk7CisgICAgICAgIHN5bmNDb2x1bW5zKGRpc2MsIGRpc2MuZ2V0Q29sdW1ucygpLCBkaXNjLmdldFZhbHVlKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgIShkaXNjLmdldFZhbHVlKClpbnN0YW5jZW9mIFN0cmluZykpOworICAgICAgICBzeW5jSW5kZXgoZGlzYywgZGlzYy5nZXRJbmRleCgpKTsKKyAgICAgICAgaWYgKGRpc2MuZ2V0VmFsdWUoKSA9PSBEaXNjcmltaW5hdG9yLk5VTEwpCisgICAgICAgICAgICBfdmFsdWUgPSAibnVsbCI7CisgICAgICAgIGVsc2UgaWYgKGRpc2MuZ2V0VmFsdWUoKSAhPSBudWxsKQorICAgICAgICAgICAgX3ZhbHVlID0gZGlzYy5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgaWYgKGRpc2MuZ2V0U3RyYXRlZ3koKSA9PSBudWxsCisgICAgICAgICAgICB8fCBkaXNjLmdldFN0cmF0ZWd5KClpbnN0YW5jZW9mIFN1cGVyY2xhc3NEaXNjcmltaW5hdG9yU3RyYXRlZ3kpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gZXhwbGljaXQgZGlzY3JpbWluYXRvciBzdHJhdGVneSBpZjoKKyAgICAgICAgLy8gLSB1bm1hcHBlZCBjbGFzcyBhbmQgZGlzY3JpbWluYXRvciBpcyBtYXBwZWQKKyAgICAgICAgLy8gLSBmaW5hbCBiYXNlIGNsYXNzIGFuZCBkaXNjcmltaW5hdG9yIGlzIG1hcHBlZAorICAgICAgICAvLyAtIHRhYmxlLXBlci1jbGFzcyBzdWJjbGFzcyBhbmQgZGlzY3JpbWluYXRvciBpcyBtYXBwZWQKKyAgICAgICAgLy8gLSBtYXBwZWQgc3ViY2xhc3MgYW5kIGRvZXNuJ3QgcmVseSBvbiBzdXBlcmNsYXNzIGRpc2NyaW1pbmF0b3IKKyAgICAgICAgLy8gLSBtYXBwZWQgYmFzZSBjbGFzcyBhbmQgZG9lc24ndCB1c2UgdmFsdWUtbWFwIHN0cmF0ZWd5IHdpdGggdmFsdWUKKyAgICAgICAgLy8gICBhbmQgaXNuJ3QgYSBmaW5hbCBjbGFzcyB0aGF0IHVzZXMgdGhlIGZpbmFsIHN0cmF0ZWd5CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBkaXNjLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBTdHJpbmcgc3RyYXQgPSBkaXNjLmdldFN0cmF0ZWd5KCkuZ2V0QWxpYXMoKTsKKyAgICAgICAgYm9vbGVhbiBzeW5jID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCFjbHMuaXNNYXBwZWQoKQorICAgICAgICAgICAgfHwgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBNb2RpZmllci5pc0ZpbmFsKGNscy5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgfHwgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSA9PSBudWxsCisgICAgICAgICAgICAmJiBjbHMuZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpICE9IG51bGwpKQorICAgICAgICAgICAgc3luYyA9ICFOb25lRGlzY3JpbWluYXRvclN0cmF0ZWd5LkFMSUFTLmVxdWFscyhzdHJhdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN5bmMgPSBjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IF92YWx1ZSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgIVZhbHVlTWFwRGlzY3JpbWluYXRvclN0cmF0ZWd5LkFMSUFTLmVxdWFscyhzdHJhdCk7CisKKyAgICAgICAgaWYgKHN5bmMpCisgICAgICAgICAgICBzZXRTdHJhdGVneShzdHJhdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXIoYm9vbGVhbiBjYW5GbGFncykgeworICAgICAgICBzdXBlci5jbGVhcihjYW5GbGFncyk7CisgICAgICAgIF92YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weShNYXBwaW5nSW5mbyBpbmZvKSB7CisgICAgICAgIHN1cGVyLmNvcHkoaW5mbyk7CisgICAgICAgIGlmICghKGluZm8gaW5zdGFuY2VvZiBEaXNjcmltaW5hdG9yTWFwcGluZ0luZm8pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIF92YWx1ZSA9ICgoRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvKSBpbmZvKS5nZXRWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9EaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9EaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgwOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0Rpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworCisvKioKKyAqIEhhbmRsZXMgZGV0ZXJtaW5pbmcgdGhlIG9iamVjdCBjbGFzcyBvZiBkYXRhYmFzZSByZWNvcmRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclN0cmF0ZWd5CisgICAgZXh0ZW5kcyBTdHJhdGVneSB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIERpc2NyaW1pbmF0b3IgdGhhdCB1c2VzIHRoaXMgc3RyYXRlZ3kuIFRoaXMgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3IoRGlzY3JpbWluYXRvciBvd25lcik7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGRhdGEgZm9yIHRoaXMgRGlzY3JpbWluYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIHRoZSBrbm93biBiYXNlIGNsYXNzIGJlaW5nIHNlbGVjdGVkOyB0aGlzIG1heQorICAgICAqIG5vdCBiZSB0aGUgYmFzZSBjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgICAgICogQHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBzZWxlY3RlZDsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKTsKKworICAgIC8qKgorICAgICAqIExvYWQgYWxsIHN1YmNsYXNzZXMgb2YgdGhlIG93bmluZyBjbGFzcyBtYXBwaW5nIGludG8gdGhlIEpWTS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkU3ViY2xhc3NlcyhKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgY3VycmVudCByZXN1bHQgcm93LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRDbGFzcyhKREJDU3RvcmUgc3RvcmUsIENsYXNzTWFwcGluZyBiYXNlLCBSZXN1bHQgcmVzdWx0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV2hldGhlciBhbnkgY2xhc3MgY29uZGl0aW9ucyBhcmUgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2xhc3NDb25kaXRpb25zCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NDb25kaXRpb25zKENsYXNzTWFwcGluZyBiYXNlLCBib29sZWFuIHN1YnMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIFNRTCB0byBsaW1pdCB0aGUgY2xhc3NlcyBzZWxlY3RlZCBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIHRoZQorICAgICAqIGdpdmVuIGJhc2UgY2xhc3MsIGFuZCBvcHRpb25hbGx5IGl0cyBzdWJjbGFzc2VzLiBUaGUgc2VsZWN0IGFuZCBqb2lucyAKKyAgICAgKiBpbnN0YW5jZXMgYXJlIHN1cHBsaWVkIGluIG9yZGVyIHRvIGdldCBjb2x1bW4gYWxpYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGdldENsYXNzQ29uZGl0aW9ucyhTZWxlY3Qgc2VsLCBKb2lucyBqb2lucywgCisgICAgICAgIENsYXNzTWFwcGluZyBiYXNlLCBib29sZWFuIHN1YnMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0VtYmVkZGFibGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9FbWJlZGRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiNmNlMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9FbWJlZGRhYmxlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGZpZWxkIHN0cmF0ZWdpZXMgdGhhdCBjYW4gbWFuYWdlZCBmaWVsZHMgb2YKKyAqIGVtYmVkZGVkLWVsZW1lbnQsIGVtYmVkZGVkLWtleSwgYW5kIGVtYmVkZGVkLXZhbHVlIG9iamVjdHMuIEZpZWxkcyBvZgorICogZGlyZWN0bHkgZW1iZWRkZWQgb2JqZWN0cyBkbyBub3QgaGF2ZSB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVU5TVVBQT1JURUQgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbnMgdXNlZCBieSB0aGlzIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY29sdW1uIEkvTyBpbmZvcm1hdGlvbiBmb3IgdGhpcyBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5JTyBnZXRDb2x1bW5JTygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcmd1bWVudHMgbmVlZGVkIHRvIGV4dHJhY3QgZGF0YXN0b3JlIHZhbHVlcyB2aWEKKyAgICAgKiB7QGxpbmsgUmVzdWx0I2dldE9iamVjdH0gZm9yIGVhY2ggY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRSZXN1bHRBcmd1bWVudHMoKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIEphdmEgdmFsdWUgdG8gaXRzIGRhdGFzdG9yZSBlcXVpdmFsZW50LiBJZiB0aGlzCisgICAgICogbWFwcGluZyBvY2N1cGllcyBtdWx0aXBsZSBjb2x1bW5zLCByZXR1cm4gYW4gb2JqZWN0IGFycmF5IHdpdGggb25lCisgICAgICogZWxlbWVudCBwZXIgY29sdW1uLiBGb3IgcmVsYXRpb24gaWQgY29sdW1ucywgcmV0dXJuIHRoZSBzdGF0ZSBtYW5hZ2VyCisgICAgICogdGhlIGNvbHVtbiBkZXBlbmRzIG9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9FbWJlZGRlZERhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBkYXRhc3RvcmUgdmFsdWUgdG8gaXRzIEphdmEgZXF1aXZhbGVudC4KKyAgICAgKiBJZiB7QGxpbmsgI2dldENvbHVtbnN9IHJldHVybnMgbXVsdGlwbGUgY29sdW1ucywgdGhlIGdpdmVuIGRhdGFzdG9yZQorICAgICAqIHZhbHVlIHdpbGwgYmUgYW4gb2JqZWN0IGFycmF5IG9mIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aC4gVGhpcyBtZXRob2QKKyAgICAgKiBtdXN0IG9ubHkgYmUgc3VwcG9ydGVkIGJ5IG1hcHBpbmdzIG9mIGVtYmVkZGVkIGlkIG9iamVjdHMuIEluIG90aGVyCisgICAgICogY2FzZXMge0BsaW5rICNsb2FkRW1iZWRkZWR9IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiBSZXR1cm4KKyAgICAgKiB7QGxpbmsgI1VOU1VQUE9SVEVEfSBpZiB0aGlzIG1hcHBpbmcgY2Fubm90IHN1cHBvcnQgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB0b0VtYmVkZGVkT2JqZWN0VmFsdWUoT2JqZWN0IHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoaXMgc3RyYXRlZ3kncyBmaWVsZCBieSB0cmFuc2Zvcm1pbmcgdGhlIGdpdmVuIGRhdGFzdG9yZSB2YWx1ZS4KKyAgICAgKiBJZiB7QGxpbmsgI2dldENvbHVtbnN9IHJldHVybnMgbXVsdGlwbGUgY29sdW1ucywgdGhlIGdpdmVuIGRhdGFzdG9yZQorICAgICAqIHZhbHVlIHdpbGwgYmUgYW4gb2JqZWN0IGFycmF5IG9mIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aC4gVGhlIHZhbHVlCisgICAgICogZG9lcyBub3QgaGF2ZSB0byBiZSBsb2FkZWQgaW1tZWRpYXRlbHk7IGl0IG1heSBiZSBzdG9yZWQgYXMgaW1wbCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRFbWJlZGRlZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRmllbGRNYXBwaW5nLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRmllbGRNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5NzY1NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9GaWVsZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDEwMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZUZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3RFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gb2YgbWV0YWRhdGEgZm9yIHJlbGF0aW9uYWwgZGF0YWJhc2VzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZE1hcHBpbmcKKyAgICBleHRlbmRzIEZpZWxkTWV0YURhdGEKKyAgICBpbXBsZW1lbnRzIFZhbHVlTWFwcGluZywgRmllbGRTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChGaWVsZE1hcHBpbmcuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZU1hcHBpbmcgX3ZhbDsKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlTWFwcGluZyBfa2V5OworICAgIHByaXZhdGUgZmluYWwgVmFsdWVNYXBwaW5nIF9lbGVtOworICAgIHByaXZhdGUgZmluYWwgRmllbGRNYXBwaW5nSW5mbyBfaW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNDb2x1bW5PcmRlciBfb3JkZXJDb2wgPSBuZXcgSkRCQ0NvbHVtbk9yZGVyKCk7CisgICAgcHJpdmF0ZSBGaWVsZFN0cmF0ZWd5IF9zdHJhdGVneSA9IG51bGw7CisKKyAgICBwcml2YXRlIEZvcmVpZ25LZXkgX2ZrID0gbnVsbDsKKyAgICBwcml2YXRlIENvbHVtbklPIF9pbyA9IG51bGw7CisgICAgcHJpdmF0ZSBVbmlxdWUgX3VucSA9IG51bGw7CisgICAgcHJpdmF0ZSBJbmRleCBfaWR4ID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX291dGVyID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgX2ZldGNoTW9kZSA9IEludGVnZXIuTUFYX1ZBTFVFOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZyhTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSwgQ2xhc3NNYXBwaW5nIG93bmVyKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHR5cGUsIG93bmVyKTsKKyAgICAgICAgX2luZm8gPSBvd25lci5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLm5ld01hcHBpbmdJbmZvKHRoaXMpOworICAgICAgICBfdmFsID0gKFZhbHVlTWFwcGluZykgZ2V0VmFsdWUoKTsKKyAgICAgICAgX2tleSA9IChWYWx1ZU1hcHBpbmcpIGdldEtleSgpOworICAgICAgICBfZWxlbSA9IChWYWx1ZU1hcHBpbmcpIGdldEVsZW1lbnQoKTsKKworICAgICAgICBzZXRVc2VzSW50ZXJtZWRpYXRlKGZhbHNlKTsKKyAgICAgICAgc2V0VXNlc0ltcGxEYXRhKEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8vLy8vLy8KKyAgICAvLyBPUk0KKyAgICAvLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSYXcgbWFwcGluZyBkYXRhIGFib3V0IGZpZWxkJ3Mgam9pbiB0byBwYXJlbnQgdGFibGUsIGFzIHdlbGwgYXMKKyAgICAgKiBtaXNjZWxsYW5lb3VzIHNwZWNpYWxpemVkIGNvbHVtbnMgbGlrZSBvcmRlciBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZ0luZm8gZ2V0TWFwcGluZ0luZm8oKSB7CisgICAgICAgIHJldHVybiBfaW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyYXRlZ3kgdXNlZCB0byBtYXAgdGhpcyBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZFN0cmF0ZWd5IGdldFN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gX3N0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJhdGVneSB1c2VkIHRvIG1hcCB0aGlzIG1hcHBpbmcuIFRoZSA8Y29kZT5hZGFwdDwvY29kZT4KKyAgICAgKiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGFkYXB0IHdoZW4gbWFwcGluZyB0aGUgc3RyYXRlZ3k7CisgICAgICogdXNlIG51bGwgaWYgdGhlIHN0cmF0ZWd5IHNob3VsZCBub3QgYmUgbWFwcGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEZpZWxkU3RyYXRlZ3kgc3RyYXRlZ3ksIEJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgLy8gc2V0IHN0cmF0ZWd5IGZpcnN0IHNvIHdlIGNhbiBhY2Nlc3MgaXQgZHVyaW5nIG1hcHBpbmcKKyAgICAgICAgRmllbGRTdHJhdGVneSBvcmlnID0gX3N0cmF0ZWd5OworICAgICAgICBfc3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RyYXRlZ3kuc2V0RmllbGRNYXBwaW5nKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChhZGFwdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJhdGVneS5tYXAoYWRhcHQuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgX3N0cmF0ZWd5ID0gb3JpZzsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgc2V0IHRvIHVubWFwcGVkLCBjbGVhciBkZWZpbmVkIGZpZWxkIGNhY2hlIGluIHBhcmVudAorICAgICAgICAgICAgaWYgKCFpc01hcHBlZCgpKQorICAgICAgICAgICAgICAgIGdldERlZmluaW5nTWFwcGluZygpLmNsZWFyRGVmaW5lZEZpZWxkQ2FjaGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7CisgICAgICAgIGlmIChfZmsgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfZmsuZ2V0VGFibGUoKTsKKyAgICAgICAgaWYgKF92YWwuZ2V0Rm9yZWlnbktleSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX3ZhbC5nZXRGb3JlaWduS2V5KCkuZ2V0VGFibGUoKTsKKyAgICAgICAgcmV0dXJuIGdldERlZmluaW5nTWFwcGluZygpLmdldFRhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGluZm9ybWF0aW9uIG9uIHRoZSBqb2luIGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbklPIGdldEpvaW5Db2x1bW5JTygpIHsKKyAgICAgICAgcmV0dXJuIChfaW8gPT0gbnVsbCkgPyBDb2x1bW5JTy5VTlJFU1RSSUNURUQgOiBfaW87CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGluZm9ybWF0aW9uIG9uIHRoZSBqb2luIGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbkNvbHVtbklPKENvbHVtbklPIGlvKSB7CisgICAgICAgIF9pbyA9IGlvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmVpZ24ga2V5IGxpbmtpbmcgdGhlIGZpZWxkIHRhYmxlIHRvIHRoZSBjbGFzcycgcHJpbWFyeSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIF9mazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JlaWduIGtleSBsaW5raW5nIHRoZSBmaWVsZCB0YWJsZSB0byB0aGUgY2xhc3MnIHByaW1hcnkgdGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbkZvcmVpZ25LZXkoRm9yZWlnbktleSBmaykgeworICAgICAgICBfZmsgPSBmazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmlxdWUgY29uc3RyYWludCBvbiBqb2luIGZvcmVpZ24ga2V5IGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSBnZXRKb2luVW5pcXVlKCkgeworICAgICAgICByZXR1cm4gX3VucTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmlxdWUgY29uc3RyYWludCBvbiBqb2luIGZvcmVpZ24ga2V5IGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pblVuaXF1ZShVbmlxdWUgdW5xKSB7CisgICAgICAgIF91bnEgPSB1bnE7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kZXggb24gam9pbiBmb3JlaWduIGtleSBjb2x1bW5zLgorICAgICAqLworICAgIHB1YmxpYyBJbmRleCBnZXRKb2luSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfaWR4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGV4IG9uIGpvaW4gZm9yZWlnbiBrZXkgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKb2luSW5kZXgoSW5kZXggaWR4KSB7CisgICAgICAgIF9pZHggPSBpZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB1c2UgYW4gb3V0ZXIgam9pbiBmcm9tIHRoZSBjbGFzcycgcHJpbWFyeSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0pvaW5PdXRlcigpIHsKKyAgICAgICAgcmV0dXJuIF9vdXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBhbiBvdXRlciBqb2luIGZyb20gdGhlIGNsYXNzJyBwcmltYXJ5IHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5PdXRlcihib29sZWFuIG91dGVyKSB7CisgICAgICAgIF9vdXRlciA9IG91dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpZWxkIG9yZGVyIGNvbHVtbiwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW4gZ2V0T3JkZXJDb2x1bW4oKSB7CisgICAgICAgIHJldHVybiBfb3JkZXJDb2wuZ2V0Q29sdW1uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmllbGQgb3JkZXIgY29sdW1uLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJDb2x1bW4oQ29sdW1uIG9yZGVyKSB7CisgICAgICAgIF9vcmRlckNvbC5zZXRDb2x1bW4ob3JkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEkvTyBpbmZvcm1hdGlvbiBmb3Igb3JkZXIgY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5JTyBnZXRPcmRlckNvbHVtbklPKCkgeworICAgICAgICByZXR1cm4gX29yZGVyQ29sLmdldENvbHVtbklPKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGluZm9ybWF0aW9uIGZvciBvcmRlciBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJDb2x1bW5JTyhDb2x1bW5JTyBpbykgeworICAgICAgICBfb3JkZXJDb2wuc2V0Q29sdW1uSU8oaW8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVzZWQgc2NoZW1hIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmU2NoZW1hQ29tcG9uZW50cygpIHsKKyAgICAgICAgaWYgKF9mayAhPSBudWxsKSB7CisgICAgICAgICAgICBfZmsucmVmKCk7CisgICAgICAgICAgICBfZmsucmVmQ29sdW1ucygpOworICAgICAgICB9CisgICAgICAgIGlmIChfb3JkZXJDb2wuZ2V0Q29sdW1uKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9vcmRlckNvbC5nZXRDb2x1bW4oKS5yZWYoKTsKKyAgICAgICAgX3ZhbC5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgICAgIF9rZXkucmVmU2NoZW1hQ29tcG9uZW50cygpOworICAgICAgICBfZWxlbS5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgbWFwcGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyTWFwcGluZygpIHsKKyAgICAgICAgX3N0cmF0ZWd5ID0gbnVsbDsKKyAgICAgICAgX2ZrID0gbnVsbDsKKyAgICAgICAgX3VucSA9IG51bGw7CisgICAgICAgIF9pZHggPSBudWxsOworICAgICAgICBfb3V0ZXIgPSBmYWxzZTsKKyAgICAgICAgX29yZGVyQ29sLnNldENvbHVtbihudWxsKTsKKyAgICAgICAgX3ZhbC5jbGVhck1hcHBpbmcoKTsKKyAgICAgICAgX2tleS5jbGVhck1hcHBpbmcoKTsKKyAgICAgICAgX2VsZW0uY2xlYXJNYXBwaW5nKCk7CisgICAgICAgIF9pbmZvLmNsZWFyKCk7CisgICAgICAgIHNldFJlc29sdmUoTU9ERV9NQVBQSU5HLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHtAbGluayBNYXBwaW5nSW5mb30gd2l0aCBvdXIgY3VycmVudCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNNYXBwaW5nSW5mbygpIHsKKyAgICAgICAgaWYgKGlzVmVyc2lvbigpKSB7CisgICAgICAgICAgICAvLyB3ZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlIHZlcnNpb24gd2lsbCBzZXR1cCBvdXIgbWFwcGluZworICAgICAgICAgICAgLy8gaW5mbyBjb3JyZWN0bHkgd2hlbiBpdCBpcyBzeW5jZWQKKyAgICAgICAgfSBlbHNlIGlmIChnZXRNYXBwZWRCeU1hcHBpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBfaW5mby5jbGVhcigpOworICAgICAgICAgICAgX3ZhbC5nZXRWYWx1ZUluZm8oKS5jbGVhcigpOworICAgICAgICAgICAgX2tleS5nZXRWYWx1ZUluZm8oKS5jbGVhcigpOworICAgICAgICAgICAgX2VsZW0uZ2V0VmFsdWVJbmZvKCkuY2xlYXIoKTsKKworICAgICAgICAgICAgRmllbGRNYXBwaW5nIG1hcHBlZCA9IGdldE1hcHBlZEJ5TWFwcGluZygpOworICAgICAgICAgICAgX2luZm8uc3luY1N0cmF0ZWd5KHRoaXMpOworICAgICAgICAgICAgaWYgKF9vcmRlckNvbC5nZXRDb2x1bW4oKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgbWFwcGVkLmdldE9yZGVyQ29sdW1uKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaW5mby5zeW5jT3JkZXJDb2x1bW4odGhpcyk7CisgICAgICAgICAgICBfdmFsLmdldFZhbHVlSW5mbygpLnNldFVzZUNsYXNzQ3JpdGVyaWEKKyAgICAgICAgICAgICAgICAoX3ZhbC5nZXRVc2VDbGFzc0NyaXRlcmlhKCkpOworICAgICAgICAgICAgX2tleS5nZXRWYWx1ZUluZm8oKS5zZXRVc2VDbGFzc0NyaXRlcmlhCisgICAgICAgICAgICAgICAgKF9rZXkuZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpKTsKKyAgICAgICAgICAgIF9lbGVtLmdldFZhbHVlSW5mbygpLnNldFVzZUNsYXNzQ3JpdGVyaWEKKyAgICAgICAgICAgICAgICAoX2VsZW0uZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9pbmZvLnN5bmNXaXRoKHRoaXMpOworICAgICAgICAgICAgX3ZhbC5zeW5jTWFwcGluZ0luZm8oKTsKKyAgICAgICAgICAgIF9rZXkuc3luY01hcHBpbmdJbmZvKCk7CisgICAgICAgICAgICBfZWxlbS5zeW5jTWFwcGluZ0luZm8oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjbGFzcyBkb2VzIG5vdCB1c2UgdGhlICJub25lIiBzdHJhdGVneSAoaW5jbHVkaW5nCisgICAgICogaWYgaXQgaGFzIGEgbnVsbCBzdHJhdGVneSwgYW5kIHRoZXJlZm9yZSBpcyBwcm9iYWJseSBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAqIGJlaW5nIG1hcHBlZCkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7CisgICAgICAgIHJldHVybiBfc3RyYXRlZ3kgIT0gTm9uZUZpZWxkU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gTWV0YURhdGEgaW50ZXJmYWNlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVGhlIGVhZ2VyIGZldGNoIG1vZGUsIGFzIG9uZSBvZiB0aGUgZWFnZXIgY29uc3RhbnRzIGluCisgICAgICoge0BsaW5rIEpEQkNGZXRjaENvbmZpZ3VyYXRpb259LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RWFnZXJGZXRjaE1vZGUoKSB7CisgICAgICAgIGlmIChfZmV0Y2hNb2RlID09IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgX2ZldGNoTW9kZSA9IEZldGNoQ29uZmlndXJhdGlvbi5ERUZBVUxUOworICAgICAgICByZXR1cm4gX2ZldGNoTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZWFnZXIgZmV0Y2ggbW9kZSwgYXMgb25lIG9mIHRoZSBlYWdlciBjb25zdGFudHMgaW4KKyAgICAgKiB7QGxpbmsgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWFnZXJGZXRjaE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgX2ZldGNoTW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIEZpZWxkTWV0YURhdGEjZ2V0UmVwb3NpdG9yeX0KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGluZ1JlcG9zaXRvcnkgZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiAoTWFwcGluZ1JlcG9zaXRvcnkpIGdldFJlcG9zaXRvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgRmllbGRNZXRhRGF0YSNnZXREZWZpbmluZ01ldGFEYXRhfQorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0RGVmaW5pbmdNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZykgZ2V0RGVmaW5pbmdNZXRhRGF0YSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBGaWVsZE1ldGFEYXRhI2dldERlY2xhcmluZ01ldGFEYXRhfQorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0RGVjbGFyaW5nTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzc01hcHBpbmcpIGdldERlY2xhcmluZ01ldGFEYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tIHtAbGluayBGaWVsZE1ldGFEYXRhI2dldEtleX0KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVNYXBwaW5nIGdldEtleU1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBfa2V5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbSB7QGxpbmsgRmllbGRNZXRhRGF0YSNnZXRFbGVtZW50fQorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZU1hcHBpbmcgZ2V0RWxlbWVudE1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBfZWxlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20ge0BsaW5rIEZpZWxkTWV0YURhdGEjZ2V0VmFsdWV9CisgICAgICovCisgICAgcHVibGljIFZhbHVlTWFwcGluZyBnZXRWYWx1ZU1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiAoVmFsdWVNYXBwaW5nKSBnZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBGaWVsZE1ldGFEYXRhI2dldE1hcHBlZEJ5TWV0YURhdGF9CisgICAgICovCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXRNYXBwZWRCeU1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiAoRmllbGRNYXBwaW5nKSBnZXRNYXBwZWRCeU1ldGFEYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBlcmZvcm0gY2FzdCBmcm9tCisgICAgICoge0BsaW5rIEZpZWxkTWV0YURhdGEjZ2V0SW52ZXJzZU1ldGFEYXRhc30KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nW10gZ2V0SW52ZXJzZU1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gKEZpZWxkTWFwcGluZ1tdKSBnZXRJbnZlcnNlTWV0YURhdGFzKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVzb2x2ZShpbnQgbW9kZSkgeworICAgICAgICBpbnQgY3VyID0gZ2V0UmVzb2x2ZSgpOworICAgICAgICBpZiAoc3VwZXIucmVzb2x2ZShtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01BUFBJTkcpICE9IDAgJiYgKGN1ciAmIE1PREVfTUFQUElORykgPT0gMCkKKyAgICAgICAgICAgIHJlc29sdmVNYXBwaW5nKCk7CisgICAgICAgIGlmICgobW9kZSAmIE1PREVfTUFQUElOR19JTklUKSAhPSAwICYmIChjdXIgJiBNT0RFX01BUFBJTkdfSU5JVCkgPT0gMCkKKyAgICAgICAgICAgIGluaXRpYWxpemVNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlTWFwcGluZygpIHsKKyAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSBnZXRNYXBwaW5nUmVwb3NpdG9yeSgpOworICAgICAgICBpZiAocmVwb3MuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuZGVmYXVsdE1pc3NpbmdJbmZvKCkpIHsKKyAgICAgICAgICAgIC8vIGNvcHkgZW1iZWRkZWQgdGVtcGxhdGUgbWFwcGluZyBpbmZvCisgICAgICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gZ2V0RGVmaW5pbmdNYXBwaW5nKCk7CisgICAgICAgICAgICBpZiAoY2xzLmdldEVtYmVkZGluZ01hcHBpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIG9yaWcgPSByZXBvcy5nZXRNYXBwaW5nKGNscy5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIGNscy5nZXRFbnZDbGFzc0xvYWRlcigpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBGaWVsZE1hcHBpbmcgdG1wbGF0ZSA9IG9yaWcuZ2V0RmllbGRNYXBwaW5nKGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcGxhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29weU1hcHBpbmdJbmZvKHRtcGxhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY29weSBzdXBlcmNsYXNzIGZpZWxkIGluZm8KKyAgICAgICAgICAgIGVsc2UgaWYgKGNscy5pc01hcHBlZCgpICYmIGNscy5nZXRQQ1N1cGVyY2xhc3MoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY2xzLmdldERlc2NyaWJlZFR5cGUoKSAhPSBnZXREZWNsYXJpbmdUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBGaWVsZE1hcHBpbmcgc3VwID0gY2xzLmdldFBDU3VwZXJjbGFzc01hcHBpbmcoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRNYXBwaW5nKGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb3B5TWFwcGluZ0luZm8oc3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChfc3RyYXRlZ3kgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGlzVmVyc2lvbigpKQorICAgICAgICAgICAgICAgIF9zdHJhdGVneSA9IE5vbmVGaWVsZFN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVwb3MuZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pbnN0YWxsU3RyYXRlZ3kodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgTG9nIGxvZyA9IGdldFJlcG9zaXRvcnkoKS5nZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJmaWVsZC1zdHJhdGVneSIsIGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBfc3RyYXRlZ3kuZ2V0QWxpYXMoKSkpOworCisgICAgICAgIC8vIG1hcmsgbWFwcGVkIGNvbHVtbnMKKyAgICAgICAgaWYgKF9vcmRlckNvbC5nZXRDb2x1bW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZ2V0T3JkZXJDb2x1bW5JTygpLmlzSW5zZXJ0YWJsZSgwLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgX29yZGVyQ29sLmdldENvbHVtbigpLnNldEZsYWcoQ29sdW1uLkZMQUdfRElSRUNUX0lOU0VSVCwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoZ2V0T3JkZXJDb2x1bW5JTygpLmlzVXBkYXRhYmxlKDAsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBfb3JkZXJDb2wuZ2V0Q29sdW1uKCkuc2V0RmxhZyhDb2x1bW4uRkxBR19ESVJFQ1RfVVBEQVRFLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX2ZrICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBfZmsuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgQ29sdW1uSU8gaW8gPSBnZXRKb2luQ29sdW1uSU8oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpby5pc0luc2VydGFibGUoaSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICBjb2xzW2ldLnNldEZsYWcoQ29sdW1uLkZMQUdfRktfSU5TRVJULCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW8uaXNVcGRhdGFibGUoaSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICBjb2xzW2ldLnNldEZsYWcoQ29sdW1uLkZMQUdfRktfVVBEQVRFLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF92YWwucmVzb2x2ZShNT0RFX01BUFBJTkcpOworICAgICAgICBfa2V5LnJlc29sdmUoTU9ERV9NQVBQSU5HKTsKKyAgICAgICAgX2VsZW0ucmVzb2x2ZShNT0RFX01BUFBJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgbWFwcGluZyBpbmZvIGZyb20gdGhlIGdpdmVuIGluc3RhbmNlIHRvIHRoaXMgb25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlNYXBwaW5nSW5mbyhGaWVsZE1hcHBpbmcgZm0pIHsKKyAgICAgICAgc2V0TWFwcGVkQnkoZm0uZ2V0TWFwcGVkQnkoKSk7CisgICAgICAgIF9pbmZvLmNvcHkoZm0uZ2V0TWFwcGluZ0luZm8oKSk7CisgICAgICAgIF92YWwuY29weU1hcHBpbmdJbmZvKGZtLmdldFZhbHVlTWFwcGluZygpKTsKKyAgICAgICAgX2tleS5jb3B5TWFwcGluZ0luZm8oZm0uZ2V0S2V5TWFwcGluZygpKTsKKyAgICAgICAgX2VsZW0uY29weU1hcHBpbmdJbmZvKGZtLmdldEVsZW1lbnRNYXBwaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgbWFwcGluZyBmb3IgcnVudGltZSB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNYXBwaW5nKCkgeworICAgICAgICBfdmFsLnJlc29sdmUoTU9ERV9NQVBQSU5HX0lOSVQpOworICAgICAgICBfa2V5LnJlc29sdmUoTU9ERV9NQVBQSU5HX0lOSVQpOworICAgICAgICBfdmFsLnJlc29sdmUoTU9ERV9NQVBQSU5HX0lOSVQpOworICAgICAgICBfc3RyYXRlZ3kuaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHkoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgc3VwZXIuY29weShmbWQpOworICAgICAgICBpZiAoX2ZldGNoTW9kZSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIF9mZXRjaE1vZGUgPSAoKEZpZWxkTWFwcGluZykgZm1kKS5nZXRFYWdlckZldGNoTW9kZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRGF0YVN0b3JlRXh0ZW5zaW9uUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuICJqZGJjLSIuZXF1YWxzKHByZWZpeCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBGaWVsZFN0cmF0ZWd5IGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmdldEFsaWFzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFwKGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5tYXAoYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCB0aGlzIGZpZWxkIHRvIGl0cyB0YWJsZSwgb3B0aW9uYWxseSByZXF1aXJpbmcgdGhhdCBpdCBiZQorICAgICAqIGluIGFub3RoZXIgdGFibGUuIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgYnkgbWFwcGluZyBzdHJhdGVnaWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcEpvaW4oYm9vbGVhbiBhZGFwdCwgYm9vbGVhbiBqb2luUmVxdWlyZWQpIHsKKyAgICAgICAgVGFibGUgdGFibGUgPSBfaW5mby5nZXRUYWJsZSh0aGlzLCBqb2luUmVxdWlyZWQsIGFkYXB0KTsKKyAgICAgICAgRm9yZWlnbktleSBqb2luID0gbnVsbDsKKyAgICAgICAgaWYgKHRhYmxlICE9IG51bGwpCisgICAgICAgICAgICBqb2luID0gX2luZm8uZ2V0Sm9pbih0aGlzLCB0YWJsZSwgYWRhcHQpOworICAgICAgICBpZiAoam9pbiA9PSBudWxsICYmIGpvaW5SZXF1aXJlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiam9pbi1yZXF1aXJlZCIsIHRoaXMpKTsKKworICAgICAgICBpZiAoam9pbiA9PSBudWxsKSB7CisgICAgICAgICAgICBfaW5mby5hc3NlcnROb0pvaW4odGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBfaW5mby5hc3NlcnROb0ZvcmVpZ25LZXkodGhpcywgIWFkYXB0KTsKKyAgICAgICAgICAgIF9pbmZvLmFzc2VydE5vVW5pcXVlKHRoaXMsICFhZGFwdCk7CisgICAgICAgICAgICBfaW5mby5hc3NlcnROb0luZGV4KHRoaXMsICFhZGFwdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfZmsgPSBqb2luOworICAgICAgICAgICAgX2lvID0gX2luZm8uZ2V0Q29sdW1uSU8oKTsKKyAgICAgICAgICAgIF9vdXRlciA9IF9pbmZvLmlzSm9pbk91dGVyKCk7CisgICAgICAgICAgICBfdW5xID0gX2luZm8uZ2V0Sm9pblVuaXF1ZSh0aGlzLCBmYWxzZSwgYWRhcHQpOworICAgICAgICAgICAgX2lkeCA9IF9pbmZvLmdldEpvaW5JbmRleCh0aGlzLCBhZGFwdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoZSBwcmltYXJ5IGtleSBvbiB0aGUgc2Vjb25kYXJ5IHRhYmxlIGZvciB0aGlzIGZpZWxkLCBpZiB0aGUKKyAgICAgKiB1c2VyJ3MgZGVmYXVsdHMgY3JlYXRlIG9uZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgorICAgICAqIHRoaXMgZmllbGQgaXMgbWFwcGVkIHNvIHRoYXQgaXQncyB0YWJsZSBoYXMgaXRzIGNvbHVtbnMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcFByaW1hcnlLZXkoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoYWRhcHQgJiYgX2ZrICE9IG51bGwgJiYgX2ZrLmdldFRhYmxlKCkuZ2V0UHJpbWFyeUtleSgpID09IG51bGwpCisgICAgICAgICAgICBnZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgIGluc3RhbGxQcmltYXJ5S2V5KHRoaXMsIF9may5nZXRUYWJsZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5pbnNlcnQoc20sIHN0b3JlLCBybSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkudXBkYXRlKHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmRlbGV0ZShzbSwgc3RvcmUsIHJtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIHJvdyBmb3IgdGhpcyBvYmplY3QgaWYgdGhlIHJlZmVyZW5jZSBmb3JlaWduIGtleSBleGlzdHMuCisgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIHVzZSBieSBtYXBwaW5nIHN0cmF0ZWdpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsZXRlUm93KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZmsgIT0gbnVsbCkgeworICAgICAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyhnZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0RFTEVURSwgc20sIHRydWUpOworICAgICAgICAgICAgcm93LndoZXJlRm9yZWlnbktleShfZmssIHNtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm93IHRvIHVzZSBmb3IgdGhpcyBmaWVsZC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgb25seSBmb3IKKyAgICAgKiBzaW5nbGUtdmFsdWUgZmllbGRzIHRoYXQgbWlnaHQgcmVzaWRlIGluIGEgdGFibGUgdGhhdCBpcyBqb2luZWQgdG8KKyAgICAgKiB0aGUgcHJpbWFyeSB0YWJsZSB0aHJvdWdoIHRoZSBqb2luIGZvcmVpZ24ga2V5LiBJdCBpcyBub3QKKyAgICAgKiBtZWFudCBmb3IgbXVsdGktdmFsdWVkIGZpZWxkcyBsaWtlIGNvbGxlY3Rpb25zIGFuZCBtYXBzLiBUaGUgbWV0aG9kCisgICAgICogY2hlY2tzIHdoZXRoZXIgd2UncmUgdXNpbmcgYW4gb3V0ZXIgam9pbiBhbmQgaWYgc28gaXQgZGVsZXRlcyB0aGUKKyAgICAgKiBmaWVsZCdzIHByZXZpb3VzIHZhbHVlLCB0aGVuIGlmIHRoZSBmaWVsZCBpcyBub24tbnVsbCByZXR1cm5zIGFuIGluc2VydAorICAgICAqIHJvdyBmb3IgdGhlIG5ldyB2YWx1ZS4gVGhlIGpvaW4gZm9yZWlnbiBrZXkgd2lsbCBhbHJlYWR5IGJlIHNldCBvbgorICAgICAqIHRoZSByZXR1cm5lZCByb3c7IG1hcHBpbmcgc3RyYXRlZ2llcyBqdXN0IG5lZWQgdG8gc2V0IHRoZWlyIG93biB2YWx1ZXMuCisgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIHVzZSBieSBtYXBwaW5nIHN0cmF0ZWdpZXMuCisgICAgICovCisgICAgcHVibGljIFJvdyBnZXRSb3coT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtLAorICAgICAgICBpbnQgYWN0aW9uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gbmV3T3V0ZXJSb3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKF9mayAhPSBudWxsICYmIF9vdXRlciAmJiBhY3Rpb24gIT0gUm93LkFDVElPTl9ERUxFVEUpIHsKKyAgICAgICAgICAgIC8vIGlmIHVwZGF0aW5nIHdpdGggb3V0ZXIgam9pbiwgZGVsZXRlIG9sZCB2YWx1ZSBmaXJzdCwgdGhlbiBpbnNlcnQ7CisgICAgICAgICAgICAvLyB3ZSBjYW4ndCBqdXN0IHVwZGF0ZSBiL2MgdGhlIHJvdyBtaWdodCBub3QgZXhpc3QKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gUm93LkFDVElPTl9VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAvLyBtYXliZSBzb21lIG90aGVyIGZpZWxkIGFscmVhZHkgaXMgdXBkYXRpbmc/CisgICAgICAgICAgICAgICAgcm93ID0gcm0uZ2V0Um93KGdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFLCBzbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBSb3cgZGVsID0gcm0uZ2V0Um93KGdldFRhYmxlKCksIFJvdy5BQ1RJT05fREVMRVRFLCBzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICBkZWwud2hlcmVGb3JlaWduS2V5KF9maywgc20pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJvdyA9IHJtLmdldFJvdyhnZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0lOU0VSVCwgc20sIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gb25seSB1cGRhdGUvaW5zZXJ0IGlmIHRoZSByb3cgZXhpc3RzIGFscmVhZHkgb3IgdGhlIHZhbHVlIGlzCisgICAgICAgICAgICAvLyBub3QgbnVsbC9kZWZhdWx0CisgICAgICAgICAgICBpZiAocm93ID09IG51bGwgJiYgIWlzTnVsbFZhbHVlKHNtKSkgeworICAgICAgICAgICAgICAgIHJvdyA9IHJtLmdldFJvdyhnZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0lOU0VSVCwgc20sIHRydWUpOworICAgICAgICAgICAgICAgIG5ld091dGVyUm93ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByb3cgPSBybS5nZXRSb3coZ2V0VGFibGUoKSwgYWN0aW9uLCBzbSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gc2V0dXAgZmsKKyAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIF9mayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgICAgIHJvdy5zZXRGb3JlaWduS2V5KF9maywgX2lvLCBzbSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcm93LndoZXJlRm9yZWlnbktleShfZmssIHNtKTsKKworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIG5ldyBvdXRlciBqb2luZWQgcm93LCBtYXJrIGl0IGludmFsaWQgdW50aWwKKyAgICAgICAgICAgIC8vIHNvbWUgbWFwcGluZyBhY3R1YWxseSBzZXRzIGluZm9ybWF0aW9uIG9uIGl0CisgICAgICAgICAgICBpZiAobmV3T3V0ZXJSb3cpCisgICAgICAgICAgICAgICAgcm93LnNldFZhbGlkKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcm93OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmllbGQgaXMgbnVsbC9kZWZhdWx0IGluIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNOdWxsVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBzd2l0Y2ggKGdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICAgICAgcmV0dXJuICFzbS5mZXRjaEJvb2xlYW4oZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBzbS5mZXRjaEJ5dGUoZ2V0SW5kZXgoKSkgPT0gMDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtLmZldGNoQ2hhcihnZXRJbmRleCgpKSA9PSAwOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBzbS5mZXRjaERvdWJsZShnZXRJbmRleCgpKSA9PSAwOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtLmZldGNoRmxvYXQoZ2V0SW5kZXgoKSkgPT0gMDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc20uZmV0Y2hJbnQoZ2V0SW5kZXgoKSkgPT0gMDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtLmZldGNoTG9uZyhnZXRJbmRleCgpKSA9PSAwOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtLmZldGNoU2hvcnQoZ2V0SW5kZXgoKSkgPT0gMDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc20uZmV0Y2hTdHJpbmcoZ2V0SW5kZXgoKSkgPT0gbnVsbDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtLmZldGNoT2JqZWN0KGdldEluZGV4KCkpID09IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21JbnNlcnQoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbVVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbURlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNDdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21JbnNlcnQoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21EZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5jdXN0b21EZWxldGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZE1hcHBpbmcoRmllbGRNYXBwaW5nIG93bmVyKSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuc2V0RmllbGRNYXBwaW5nKG93bmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN1cHBvcnRzU2VsZWN0KFNlbGVjdCBzZWwsIGludCB0eXBlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuc3VwcG9ydHNTZWxlY3Qoc2VsLCB0eXBlLCBzbSwgc3RvcmUsIGZldGNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RFYWdlclBhcmFsbGVsKFNlbGVjdEV4ZWN1dG9yIHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuc2VsZWN0RWFnZXJQYXJhbGxlbChzZWwsIHNtLCBzdG9yZSwgZmV0Y2gsIGVhZ2VyTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0RWFnZXJKb2luKFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSkgeworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLnNlbGVjdEVhZ2VySm9pbihzZWwsIHNtLCBzdG9yZSwgZmV0Y2gsIGVhZ2VyTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFYWdlclNlbGVjdFRvTWFueSgpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNFYWdlclNlbGVjdFRvTWFueSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2VsZWN0KFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSkgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5zZWxlY3Qoc2VsLCBzbSwgc3RvcmUsIGZldGNoLCBlYWdlck1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbnkgam9pbnMgbmVlZGVkIHRvIGdldCBmcm9tIHRoZSBwcmltYXJ5IHRhYmxlIHRvIHRoaXMgdGFibGUuCisgICAgICovCisgICAgcHVibGljIEpvaW5zIGpvaW4oU2VsZWN0IHNlbCkgeworICAgICAgICBpZiAoX2ZrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBKb2lucyBqb2lucyA9IHNlbC5uZXdKb2lucygpOworICAgICAgICBpZiAoX291dGVyKQorICAgICAgICAgICAgcmV0dXJuIGpvaW5zLm91dGVySm9pbihfZmssIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGpvaW5zLmpvaW4oX2ZrLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgPGNvZGU+d2hlcmVQcmltYXJ5S2V5PC9jb2RlPiBvciA8Y29kZT53aGVyZUZvcmVpZ25LZXk8L2NvZGU+CisgICAgICogY29uZGl0aW9uIHRvIHRoZSBnaXZlbiBzZWxlY3QsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgYSBqb2luCisgICAgICogZm9yZWlnbiBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVQcmltYXJ5S2V5KFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBpZiAoX2ZrICE9IG51bGwpCisgICAgICAgICAgICBzZWwud2hlcmVGb3JlaWduS2V5KF9maywgc20uZ2V0T2JqZWN0SWQoKSwgZ2V0RGVmaW5pbmdNYXBwaW5nKCksCisgICAgICAgICAgICAgICAgc3RvcmUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWwud2hlcmVQcmltYXJ5S2V5KHNtLmdldE9iamVjdElkKCksIGdldERlZmluaW5nTWFwcGluZygpLAorICAgICAgICAgICAgICAgIHN0b3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgb3JkZXJpbmcgdG8gdGhlIGdpdmVuIHNlbGVjdCBmb3IgYWxsIG5vbi1yZWxhdGlvbiBvcmRlciB2YWx1ZXMsCisgICAgICogaW5jbHVkaW5nIHRoZSBzeW50aGV0aWMgb3JkZXIgY29sdW1uLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbSB0aGUgcmVsYXRlZCB0eXBlIHdlJ3JlIGZldGNoaW5nLCBvciBudWxsCisgICAgICogQHBhcmFtIGpvaW5zIHRoZSBqb2lucyB0byB0aGlzIGZpZWxkJ3MgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvcmRlckxvY2FsKFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBlbGVtLCBKb2lucyBqb2lucykgeworICAgICAgICBfb3JkZXJDb2wub3JkZXIoc2VsLCBlbGVtLCBqb2lucyk7CisgICAgICAgIEpEQkNPcmRlcltdIG9yZGVycyA9IChKREJDT3JkZXJbXSkgZ2V0T3JkZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFvcmRlcnNbaV0uaXNJblJlbGF0aW9uKCkpCisgICAgICAgICAgICAgICAgb3JkZXJzW2ldLm9yZGVyKHNlbCwgZWxlbSwgam9pbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBvcmRlcmluZyB0byB0aGUgZ2l2ZW4gc2VsZWN0IGZvciBhbGwgcmVsYXRpb24tYmFzZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW0gdGhlIHJlbGF0ZWQgdHlwZSB3ZSdyZSBmZXRjaGluZworICAgICAqIEBwYXJhbSBqb2lucyB0aGUgam9pbnMgYWNyb3NzIHRoZSByZWxhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9yZGVyUmVsYXRpb24oU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGVsZW0sIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIEpEQkNPcmRlcltdIG9yZGVycyA9IChKREJDT3JkZXJbXSkgZ2V0T3JkZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKG9yZGVyc1tpXS5pc0luUmVsYXRpb24oKSkKKyAgICAgICAgICAgICAgICBvcmRlcnNbaV0ub3JkZXIoc2VsLCBlbGVtLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkRWFnZXJQYXJhbGxlbChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5sb2FkRWFnZXJQYXJhbGxlbChzbSwgc3RvcmUsIGZldGNoLCByZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRFYWdlckpvaW4oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5sb2FkRWFnZXJKb2luKHNtLCBzdG9yZSwgZmV0Y2gsIHJlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmxvYWQoc20sIHN0b3JlLCBmZXRjaCwgcmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkubG9hZChzbSwgc3RvcmUsIGZldGNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoT2JqZWN0IHZhbCwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLnRvRGF0YVN0b3JlVmFsdWUodmFsLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0tleURhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS50b0tleURhdGFTdG9yZVZhbHVlKHZhbCwgc3RvcmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzRW1wdHkoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5hcHBlbmRJc0VtcHR5KHNxbCwgc2VsLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3RFbXB0eShTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLCBKb2lucyBqb2lucykgeworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLmFwcGVuZElzTm90RW1wdHkoc3FsLCBzZWwsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5hcHBlbmRJc051bGwoc3FsLCBzZWwsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5hcHBlbmRJc05vdE51bGwoc3FsLCBzZWwsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRTaXplKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuYXBwZW5kU2l6ZShzcWwsIHNlbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuam9pbihqb2lucywgZm9yY2VPdXRlcik7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5LZXkoSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlcikgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5qb2luS2V5KGpvaW5zLCBmb3JjZU91dGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pblJlbGF0aW9uKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIsCisgICAgICAgIGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuam9pblJlbGF0aW9uKGpvaW5zLCBmb3JjZU91dGVyLCB0cmF2ZXJzZSk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5LZXlSZWxhdGlvbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyLAorICAgICAgICBib29sZWFuIHRyYXZlcnNlKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmpvaW5LZXlSZWxhdGlvbihqb2lucywgZm9yY2VPdXRlciwgdHJhdmVyc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpvaW5zIGZyb20gdGhlIG93bmluZyBjbGFzcycgdGFibGUgdG8gdGhlIHRhYmxlIHdoZXJlIHRoaXMgZmllbGQgbGllcworICAgICAqIHVzaW5nIHRoZSBqb2luIGZvcmVpZ24ga2V5LiBVdGlsaXR5IG1ldGhvZCBmb3IgdXNlIGJ5IG1hcHBpbmcgc3RyYXRlZ2llcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICBpZiAoX2ZrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gam9pbnM7CisgICAgICAgIGlmIChfb3V0ZXIgfHwgZm9yY2VPdXRlcikKKyAgICAgICAgICAgIHJldHVybiBqb2lucy5vdXRlckpvaW4oX2ZrLCB0cnVlLCB0b01hbnkpOworICAgICAgICByZXR1cm4gam9pbnMuam9pbihfZmssIHRydWUsIHRvTWFueSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkUHJvamVjdGlvbihKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkubG9hZFByb2plY3Rpb24oc3RvcmUsIGZldGNoLCByZXMsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRLZXlQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKQorICAgICAgICAgICAgLmxvYWRLZXlQcm9qZWN0aW9uKHN0b3JlLCBmZXRjaCwgcmVzLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuaXNWZXJzaW9uYWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSwKKyAgICAgICAgT2JqZWN0IHByZXZWYWx1ZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkud2hlcmUoc20sIHN0b3JlLCBybSwgcHJldlZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpZWxkU3RyYXRlZ3kgYXNzZXJ0U3RyYXRlZ3koKSB7CisgICAgICAgIGlmIChfc3RyYXRlZ3kgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gX3N0cmF0ZWd5OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBWYWx1ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgVmFsdWVNYXBwaW5nSW5mbyBnZXRWYWx1ZUluZm8oKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldFZhbHVlSW5mbygpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZUhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuZ2V0SGFuZGxlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoVmFsdWVIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgX3ZhbC5zZXRIYW5kbGVyKGhhbmRsZXIpOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRUeXBlTWFwcGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0RGVjbGFyZWRUeXBlTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuZ2V0RGVjbGFyZWRUeXBlTWFwcGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0RW1iZWRkZWRNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRFbWJlZGRlZE1hcHBpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldFZhbHVlTWFwcGVkQnlNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRWYWx1ZU1hcHBlZEJ5TWFwcGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1ucyhDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIF92YWwuc2V0Q29sdW1ucyhjb2xzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uSU8gZ2V0Q29sdW1uSU8oKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldENvbHVtbklPKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSU8oQ29sdW1uSU8gaW8pIHsKKyAgICAgICAgX3ZhbC5zZXRDb2x1bW5JTyhpbyk7CisgICAgfQorCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuZ2V0Rm9yZWlnbktleSgpOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoQ2xhc3NNYXBwaW5nIHRhcmdldCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRGb3JlaWduS2V5KHRhcmdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIF92YWwuc2V0Rm9yZWlnbktleShmayk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRKb2luRGlyZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRKb2luRGlyZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbkRpcmVjdGlvbihpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIF92YWwuc2V0Sm9pbkRpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoUm93IHJvdywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF92YWwuc2V0Rm9yZWlnbktleShyb3csIHNtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZUZvcmVpZ25LZXkoUm93IHJvdywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF92YWwud2hlcmVGb3JlaWduS2V5KHJvdywgc20pOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmdbXSBnZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN1YmNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldFNlbGVjdFN1YmNsYXNzZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5pcXVlIGdldFZhbHVlVW5pcXVlKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRWYWx1ZVVuaXF1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlVW5pcXVlKFVuaXF1ZSB1bnEpIHsKKyAgICAgICAgX3ZhbC5zZXRWYWx1ZVVuaXF1ZSh1bnEpOworICAgIH0KKworICAgIHB1YmxpYyBJbmRleCBnZXRWYWx1ZUluZGV4KCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRWYWx1ZUluZGV4KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVJbmRleChJbmRleCBpZHgpIHsKKyAgICAgICAgX3ZhbC5zZXRWYWx1ZUluZGV4KGlkeCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZUNsYXNzQ3JpdGVyaWEoYm9vbGVhbiBjcml0ZXJpYSkgeworICAgICAgICBfdmFsLnNldFVzZUNsYXNzQ3JpdGVyaWEoY3JpdGVyaWEpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9seW1vcnBoaWMoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldFBvbHltb3JwaGljKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9seW1vcnBoaWMoaW50IHBvbHkpIHsKKyAgICAgICAgX3ZhbC5zZXRQb2x5bW9ycGhpYyhwb2x5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXBDb25zdHJhaW50cyhTdHJpbmcgbmFtZSwgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBfdmFsLm1hcENvbnN0cmFpbnRzKG5hbWUsIGFkYXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5TWFwcGluZ0luZm8oVmFsdWVNYXBwaW5nIHZtKSB7CisgICAgICAgIF92YWwuY29weU1hcHBpbmdJbmZvKHZtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRmllbGRNYXBwaW5nSW5mby5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0ZpZWxkTWFwcGluZ0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNkNjViCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0ZpZWxkTWFwcGluZ0luZm8uamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbC5Db21tZW50YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hcHBpbmcgZnJvbSBhIGZpZWxkIHRvIHRoZSBzY2hlbWEsIGluIHJhdyBmb3JtLgorICogVGhlIGNvbHVtbnMgYW5kIHRhYmxlcyB1c2VkIGluIG1hcHBpbmcgaW5mbyB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZQorICoge0BsaW5rIFNjaGVtYUdyb3VwfSB1c2VkIGF0IHJ1bnRpbWUuIFJhdGhlciwgdGhleSB3aWxsIGJlIHN0cnVjdHMKKyAqIHdpdGggdGhlIHJlbGV2YW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBmaWxsZWQgaW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIEZpZWxkTWFwcGluZ0luZm8KKyAgICBleHRlbmRzIE1hcHBpbmdJbmZvCisgICAgaW1wbGVtZW50cyBDb21tZW50YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChGaWVsZE1hcHBpbmdJbmZvLmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RyaW5nIF90YWJsZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfb3V0ZXIgPSBmYWxzZTsKKyAgICBwcml2YXRlIENvbHVtbiBfb3JkZXJDb2wgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2FuT3JkZXJDb2wgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nW10gX2NvbW1lbnRzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB1c2VyLXN1cHBsaWVkIG5hbWUgb2YgdGhlIHRhYmxlIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlci1zdXBwbGllZCBuYW1lIG9mIHRoZSB0YWJsZSBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIHRhYmxlTmFtZSkgeworICAgICAgICBfdGFibGVOYW1lID0gdGFibGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGZpZWxkJ3MgdGFibGUgaXMgam9pbmVkIHRvIHRoZSBjbGFzcyB0YWJsZSB0aHJvdWdoIGFuCisgICAgICogb3V0ZXIgam9pbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0pvaW5PdXRlcigpIHsKKyAgICAgICAgcmV0dXJuIF9vdXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBmaWVsZCdzIHRhYmxlIGlzIGpvaW5lZCB0byB0aGUgY2xhc3MgdGFibGUgdGhyb3VnaCBhbgorICAgICAqIG91dGVyIGpvaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbk91dGVyKGJvb2xlYW4gb3V0ZXIpIHsKKyAgICAgICAgX291dGVyID0gb3V0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmF3IHN5bnRoZXRpYyBvcmRlcmluZyBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIENvbHVtbiBnZXRPcmRlckNvbHVtbigpIHsKKyAgICAgICAgcmV0dXJuIF9vcmRlckNvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSYXcgc3ludGhldGljIG9yZGVyaW5nIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbihDb2x1bW4gb3JkZXIpIHsKKyAgICAgICAgX29yZGVyQ29sID0gb3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB3ZSBjYW4gaGF2ZSBhbiBvcmRlcmluZyBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuT3JkZXJDb2x1bW4oKSB7CisgICAgICAgIHJldHVybiBfY2FuT3JkZXJDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB3ZSBjYW4gaGF2ZSBhbiBvcmRlcmluZyBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuT3JkZXJDb2x1bW4oYm9vbGVhbiBjYW5PcmRlcikgeworICAgICAgICBfY2FuT3JkZXJDb2wgPSBjYW5PcmRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gZmllbGQsIG9yIG51bGwgaWYgbm8gdGFibGUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIFRhYmxlIGdldFRhYmxlKGZpbmFsIEZpZWxkTWFwcGluZyBmaWVsZCwgYm9vbGVhbiBjcmVhdGUsCisgICAgICAgIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKF90YWJsZU5hbWUgPT0gbnVsbCAmJiAhY3JlYXRlKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVGFibGUgdGFibGUgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKS5nZXRUYWJsZSgpOworICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSA9ICh0YWJsZSA9PSBudWxsKSA/IG51bGwgCisgICAgICAgICAgICA6IHRhYmxlLmdldFNjaGVtYSgpLmdldE5hbWUoKTsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlIG5vIGpvaW4gY29sdW1ucyBkZWZpbmVkLCB0aGVyZSBtYXkgYmUgY2xhc3MtbGV2ZWwgam9pbgorICAgICAgICAvLyBpbmZvcm1hdGlvbiB3aXRoIGEgbW9yZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBmb3Igb3VyIHRhYmxlCisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBfdGFibGVOYW1lOworICAgICAgICBpZiAodGFibGVOYW1lICE9IG51bGwgJiYgZ2V0Q29sdW1ucygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRhYmxlTmFtZSA9IGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpLmdldE1hcHBpbmdJbmZvKCkuCisgICAgICAgICAgICAgICAgZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKHRhYmxlTmFtZSk7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRhYmxlKGZpZWxkLCBuZXcgVGFibGVEZWZhdWx0cygpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgICAgICAgICAvLyBkZWxheSB0aGlzIHNvIHRoYXQgd2UgZG9uJ3QgZG8gc2NoZW1hIHJlZmxlY3Rpb24gZm9yIHVuaXF1ZQorICAgICAgICAgICAgICAgIC8vIHRhYmxlIG5hbWUgdW5sZXNzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgICAgICBnZXRUYWJsZU5hbWUoZmllbGQsIHNjaGVtYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgam9pbiBmcm9tIHRoZSBmaWVsZCB0YWJsZSB0byB0aGUgb3duaW5nIGNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW4oZmluYWwgRmllbGRNYXBwaW5nIGZpZWxkLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICAvLyBpZiB3ZSBoYXZlIG5vIGpvaW4gY29sdW1ucyBkZWZpbmVkLCBjaGVjayBjbGFzcy1sZXZlbCBqb2luCisgICAgICAgIExpc3QgY29scyA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKGNvbHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29scyA9IGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpLmdldE1hcHBpbmdJbmZvKCkuCisgICAgICAgICAgICAgICAgZ2V0U2Vjb25kYXJ5VGFibGVKb2luQ29sdW1ucyhfdGFibGVOYW1lKTsKKworICAgICAgICBGb3JlaWduS2V5RGVmYXVsdHMgZGVmID0gbmV3IEZvcmVpZ25LZXlEZWZhdWx0cygpIHsKKyAgICAgICAgICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldChUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwgYm9vbGVhbiBpbnZlcnNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEpvaW5Gb3JlaWduS2V5KGZpZWxkLCBsb2NhbCwgZm9yZWlnbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlKFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBDb2x1bW4gY29sLAorICAgICAgICAgICAgICAgIE9iamVjdCB0YXJnZXQsIGJvb2xlYW4gaW52ZXJzZSwgaW50IHBvcywgaW50IGNvbHMpIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUpvaW5Db2x1bW4oZmllbGQsIGxvY2FsLCBmb3JlaWduLCBjb2wsIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgY29scyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUZvcmVpZ25LZXkoZmllbGQsICJqb2luIiwgY29scywgZGVmLCB0YWJsZSwgY2xzLCBjbHMsCisgICAgICAgICAgICBmYWxzZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuaXF1ZSBjb25zdHJhaW50IG9uIHRoZSBmaWVsZCBqb2luLgorICAgICAqLworICAgIHB1YmxpYyBVbmlxdWUgZ2V0Sm9pblVuaXF1ZShGaWVsZE1hcHBpbmcgZmllbGQsIGJvb2xlYW4gZGVmLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBmaWVsZC5nZXRKb2luRm9yZWlnbktleSgpOworICAgICAgICBpZiAoZmsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFVuaXF1ZSB1bnEgPSBudWxsOworICAgICAgICBpZiAoZmsuZ2V0Q29sdW1ucygpLmxlbmd0aCA+IDApCisgICAgICAgICAgICB1bnEgPSBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgIGdldEpvaW5VbmlxdWUoZmllbGQsIGZrLmdldFRhYmxlKCksIGZrLmdldENvbHVtbnMoKSk7CisgICAgICAgIHJldHVybiBjcmVhdGVVbmlxdWUoZmllbGQsICJqb2luIiwgdW5xLCBmay5nZXRDb2x1bW5zKCksIGFkYXB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRleCBvbiB0aGUgZmllbGQgam9pbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0Sm9pbkluZGV4KEZpZWxkTWFwcGluZyBmaWVsZCwgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBGb3JlaWduS2V5IGZrID0gZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKTsKKyAgICAgICAgaWYgKGZrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBJbmRleCBpZHggPSBudWxsOworICAgICAgICBpZiAoZmsuZ2V0Q29sdW1ucygpLmxlbmd0aCA+IDApCisgICAgICAgICAgICBpZHggPSBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgIGdldEpvaW5JbmRleChmaWVsZCwgZmsuZ2V0VGFibGUoKSwgZmsuZ2V0Q29sdW1ucygpKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KGZpZWxkLCAiam9pbiIsIGlkeCwgZmsuZ2V0Q29sdW1ucygpLCBhZGFwdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvcmRlcmluZyBjb2x1bW4gZm9yIHRoaXMgZmllbGQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uIGdldE9yZGVyQ29sdW1uKEZpZWxkTWFwcGluZyBmaWVsZCwgVGFibGUgdGFibGUsCisgICAgICAgIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKF9vcmRlckNvbCAhPSBudWxsICYmIGZpZWxkLmdldE9yZGVyRGVjbGFyYXRpb24oKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJvcmRlci1jb25mbGljdCIsIGZpZWxkKSk7CisKKyAgICAgICAgLy8gcmVzZXQgSU8KKyAgICAgICAgc2V0Q29sdW1uSU8obnVsbCk7CisKKyAgICAgICAgLy8gaGFzIHVzZXIgaGFzIGV4cGxpY2l0bHkgdHVybmVkIG9yZGVyaW5nIG9mZj8KKyAgICAgICAgaWYgKCFfY2FuT3JkZXJDb2wgfHwgZmllbGQuZ2V0T3JkZXJEZWNsYXJhdGlvbigpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBpZiBubyBkZWZhdWx0cyByZXR1cm4gbnVsbAorICAgICAgICBNYXBwaW5nRGVmYXVsdHMgZGVmID0gZmllbGQuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS4KKyAgICAgICAgICAgIGdldE1hcHBpbmdEZWZhdWx0cygpOworICAgICAgICBpZiAoX29yZGVyQ29sID09IG51bGwgJiYgKCFhZGFwdCAmJiAhZGVmLmRlZmF1bHRNaXNzaW5nSW5mbygpKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENvbHVtbiB0bXBsYXRlID0gbmV3IENvbHVtbigpOworICAgICAgICB0bXBsYXRlLnNldE5hbWUoIm9yZHIiKTsKKyAgICAgICAgdG1wbGF0ZS5zZXRKYXZhVHlwZShKYXZhVHlwZXMuSU5UKTsKKyAgICAgICAgaWYgKCFkZWYucG9wdWxhdGVPcmRlckNvbHVtbnMoZmllbGQsIHRhYmxlLCBuZXcgQ29sdW1uW117IHRtcGxhdGUgfSkKKyAgICAgICAgICAgICYmIF9vcmRlckNvbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKF9vcmRlckNvbCAhPSBudWxsICYmIChfb3JkZXJDb2wuZ2V0RmxhZyhDb2x1bW4uRkxBR19VTklOU0VSVEFCTEUpCisgICAgICAgICAgICB8fCBfb3JkZXJDb2wuZ2V0RmxhZyhDb2x1bW4uRkxBR19VTlVQREFUQUJMRSkpKSB7CisgICAgICAgICAgICBDb2x1bW5JTyBpbyA9IG5ldyBDb2x1bW5JTygpOworICAgICAgICAgICAgaW8uc2V0SW5zZXJ0YWJsZSgwLCAhX29yZGVyQ29sLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFKSk7CisgICAgICAgICAgICBpby5zZXRVcGRhdGFibGUoMCwgIV9vcmRlckNvbC5nZXRGbGFnKENvbHVtbi5GTEFHX1VOVVBEQVRBQkxFKSk7CisgICAgICAgICAgICBzZXRDb2x1bW5JTyhpbyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWVyZ2VDb2x1bW4oZmllbGQsICJvcmRlciIsIHRtcGxhdGUsIHRydWUsIF9vcmRlckNvbCwgdGFibGUsCisgICAgICAgICAgICBhZGFwdCwgZGVmLmRlZmF1bHRNaXNzaW5nSW5mbygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBtYXBwaW5nIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgICAqIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNXaXRoKEZpZWxkTWFwcGluZyBmaWVsZCkgeworICAgICAgICBjbGVhcihmYWxzZSk7CisKKyAgICAgICAgaWYgKGZpZWxkLmdldEpvaW5Gb3JlaWduS2V5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIF90YWJsZU5hbWUgPSBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldERCRGljdGlvbmFyeSgpLgorICAgICAgICAgICAgICAgIGdldEZ1bGxOYW1lKGZpZWxkLmdldFRhYmxlKCksIHRydWUpOworCisgICAgICAgIENsYXNzTWFwcGluZyBkZWYgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKTsKKyAgICAgICAgc2V0Q29sdW1uSU8oZmllbGQuZ2V0Sm9pbkNvbHVtbklPKCkpOworICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSAhPSBudWxsICYmIGRlZi5nZXRUYWJsZSgpICE9IG51bGwpCisgICAgICAgICAgICBzeW5jRm9yZWlnbktleShmaWVsZCwgZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwKKyAgICAgICAgICAgICAgICBmaWVsZC5nZXRUYWJsZSgpLCBkZWYuZ2V0VGFibGUoKSk7CisgICAgICAgIF9vdXRlciA9IGZpZWxkLmlzSm9pbk91dGVyKCk7CisKKyAgICAgICAgc3luY0luZGV4KGZpZWxkLCBmaWVsZC5nZXRKb2luSW5kZXgoKSk7CisgICAgICAgIHN5bmNVbmlxdWUoZmllbGQsIGZpZWxkLmdldEpvaW5VbmlxdWUoKSk7CisgICAgICAgIHN5bmNPcmRlckNvbHVtbihmaWVsZCk7CisgICAgICAgIHN5bmNTdHJhdGVneShmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3luY2hyb25pemUgaW50ZXJuYWwgbWFwcGluZyBzdHJhdGVneSBpbmZvcm1hdGlvbiB3aXRoIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jU3RyYXRlZ3koRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIHNldFN0cmF0ZWd5KG51bGwpOworICAgICAgICBpZiAoZmllbGQuZ2V0SGFuZGxlcigpICE9IG51bGwgfHwgZmllbGQuZ2V0U3RyYXRlZ3koKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGV4cGxpY2l0IHN0cmF0ZWd5IGlmIHRoZSBzdHJhdGVneSBpc24ndCB0aGUgZXhwZWN0ZWQgZGVmYXVsdAorICAgICAgICBTdHJhdGVneSBzdHJhdCA9IGZpZWxkLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZGVmYXVsdFN0cmF0ZWd5CisgICAgICAgICAgICAoZmllbGQsIGZhbHNlKTsKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwgfHwgIXN0cmF0LmdldEFsaWFzKCkuZXF1YWxzKGZpZWxkLmdldEFsaWFzKCkpKQorICAgICAgICAgICAgc2V0U3RyYXRlZ3koZmllbGQuZ2V0QWxpYXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3luY2hyb25pemUgaW50ZXJuYWwgb3JkZXIgY29sdW1uIGluZm9ybWF0aW9uIHdpdGggdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNPcmRlckNvbHVtbihGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldE9yZGVyQ29sdW1uKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9vcmRlckNvbCA9IHN5bmNDb2x1bW4oZmllbGQsIGZpZWxkLmdldE9yZGVyQ29sdW1uKCksIDEsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZpZWxkLmdldFRhYmxlKCksIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX29yZGVyQ29sID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTY2hlbWFDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzU2NoZW1hQ29tcG9uZW50cygpIHx8IF90YWJsZU5hbWUgIT0gbnVsbAorICAgICAgICAgICAgfHwgX29yZGVyQ29sICE9IG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXIoYm9vbGVhbiBjYW5GbGFncykgeworICAgICAgICBzdXBlci5jbGVhcihjYW5GbGFncyk7CisgICAgICAgIF90YWJsZU5hbWUgPSBudWxsOworICAgICAgICBfb3JkZXJDb2wgPSBudWxsOworICAgICAgICBpZiAoY2FuRmxhZ3MpCisgICAgICAgICAgICBfY2FuT3JkZXJDb2wgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHkoTWFwcGluZ0luZm8gaW5mbykgeworICAgICAgICBzdXBlci5jb3B5KGluZm8pOworICAgICAgICBpZiAoIShpbmZvIGluc3RhbmNlb2YgRmllbGRNYXBwaW5nSW5mbykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRmllbGRNYXBwaW5nSW5mbyBmaW5mbyA9IChGaWVsZE1hcHBpbmdJbmZvKSBpbmZvOworICAgICAgICBpZiAoX3RhYmxlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgX3RhYmxlTmFtZSA9IGZpbmZvLmdldFRhYmxlTmFtZSgpOworICAgICAgICBpZiAoIV9vdXRlcikKKyAgICAgICAgICAgIF9vdXRlciA9IGZpbmZvLmlzSm9pbk91dGVyKCk7CisgICAgICAgIGlmIChfY2FuT3JkZXJDb2wgJiYgX29yZGVyQ29sID09IG51bGwpCisgICAgICAgICAgICBfY2FuT3JkZXJDb2wgPSBmaW5mby5jYW5PcmRlckNvbHVtbigpOworICAgICAgICBpZiAoX2Nhbk9yZGVyQ29sICYmIGZpbmZvLmdldE9yZGVyQ29sdW1uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9vcmRlckNvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9vcmRlckNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgICAgIF9vcmRlckNvbC5jb3B5KGZpbmZvLmdldE9yZGVyQ29sdW1uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gKF9jb21tZW50cyA9PSBudWxsKSA/IEVNUFRZX0NPTU1FTlRTIDogX2NvbW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRzKFN0cmluZ1tdIGNvbW1lbnRzKSB7CisgICAgICAgIF9jb21tZW50cyA9IGNvbW1lbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9GaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2E5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0RXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworCisvKioKKyAqIE1hcHMgYSBwZXJzaXN0ZW50IGZpZWxkIHRvIHRoZSByZWxhdGlvbmFsIHNjaGVtYS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmllbGRTdHJhdGVneQorICAgIGV4dGVuZHMgU3RyYXRlZ3kgeworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyBtYXBwaW5nIHVzaW5nIHRoaXMgc3RyYXRlZ3kuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICogdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkTWFwcGluZyhGaWVsZE1hcHBpbmcgb3duZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGNhbiBwZXJmb3JtIHRoZSBnaXZlbiBzZWxlY3QgdHlwZS4KKyAgICAgKiBSZXR1cm4gMCBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhbgorICAgICAqIGVhZ2VyIHBhcmFsbGVsIHR5cGUsIHJldHVybiB0aGUgbnVtYmVyIG9mIFVOSU9OZWQgc2VsZWN0cyBuZWNlc3NhcnkKKyAgICAgKiB0byBmZXRjaCB0aGUgZGF0YS4gT3RoZXJ3aXNlLCByZXR1cm4gYW55IHBvc2l0aXZlIG51bWJlciBpZiB0aGUgdHlwZQorICAgICAqIGlzIHN1cHBvcnRlZC4gVGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIgbWF5IGJlIG51bGwgaWYgc2VsZWN0aW5nCisgICAgICogbXVsdGlwbGUgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBTZWxlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN1cHBvcnRzU2VsZWN0KFNlbGVjdCBzZWwsIGludCB0eXBlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpOworCisgICAgLyoqCisgICAgICogRmlsbCBpbiBwYXJhbGxlbCBlYWdlciBzZWxlY3QgZm9yIHJlbGF0ZWQgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBzZWUgI3NlbGVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVhZ2VyUGFyYWxsZWwoU2VsZWN0RXhlY3V0b3Igc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpOworCisgICAgLyoqCisgICAgICogRmlsbCBpbiBqb2luZWQgc2VsZWN0IHRvIHJlbGF0ZWQgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBzZWUgI3NlbGVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVhZ2VySm9pbihTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZWFnZXIgam9pbnMgb3Igc2VsZWN0cyB1c2VkIGJ5IHRoaXMgZmllbGQgYXJlIHRvLW1hbnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFYWdlclNlbGVjdFRvTWFueSgpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSB2aXJ0dWFsIHJvdyBjb2x1bW5zIG9mIHRoaXMgbWFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWwgdGhlIHNlbGVjdCB0byBhZGQgdG8KKyAgICAgKiBAcGFyYW0gc20gdGhlIGluc3RhbmNlIGJlaW5nIGxvYWRlZCwgb3IgbnVsbCBpZiBub3QKKyAgICAgKiBpbml0aWFsaXplZCB5ZXQgb3Igc2VsZWN0aW5nIGZvciBtdWx0aXBsZSBpbnN0YW5jZXMKKyAgICAgKiBAcGFyYW0gc3RvcmUgdGhlIGN1cnJlbnQgc3RvcmUgbWFuYWdlcgorICAgICAqIEBwYXJhbSBmZXRjaCBmZXRjaCBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIGVhZ2VyTW9kZSB0aGUgZWFnZXIgZmV0Y2ggbW9kZSB0byB1c2U7IHRoaXMgbWF5IGJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZSB0aGFuIHRoZSBtb2RlIG9mIHRoZSBmZXRjaCBjb25maWd1cmF0aW9uCisgICAgICogQHJldHVybiAmZ3Q7IDAgaWYgdGhpcyBtYXBwaW5nIHJlcXVpcmVzIHRoZSBzZWxlY3RlZCBkYXRhCisgICAgICogKGlmIGFueSksIDAgaWYgaXQgc2VsZWN0ZWQgZGF0YSBidXQgZG9lcyBub3QKKyAgICAgKiByZXF1aXJlIGl0LCBvciAmbHQ7IDAgaWYgbm8gZGF0YSB3YXMgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdChTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpOworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgYmF0Y2hlZCBlYWdlciByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzIG9yaWdpbmFsbHkgdGhlIHtAbGluayBSZXN1bHR9IHRvIGxvYWQgZnJvbSwgYnV0IHRoaXMKKyAgICAgKiBtZXRob2QgbWF5IHJldHVybiBhIHByb2Nlc3NlZCByZXN1bHQgZm9ybSB0aGF0IHdpbGwgYmUKKyAgICAgKiBwYXNzZWQgdG8gc3Vic2VxdWVudCBjYWxscworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9hZEVhZ2VyUGFyYWxsZWwoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgam9pbmVkIGVhZ2VyIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkRWFnZXJKb2luKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIExvYWQgdmlydHVhbCByb3cgZGF0YTsgdGhlIGdpdmVuIHJlc3VsdCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb250YWluCisgICAgICogZGF0YSBmb3IgdGhpcyBmaWVsZCwgc28gdGhlIGZpZWxkIG1hcHBpbmcgc2hvdWxkIG1ha2Ugc3VyZSB0aGUKKyAgICAgKiByZXN1bHQgY29udGFpbnMgaXRzIG5lZWRlZCBjb2x1bW4gZGF0YSBiZWZvcmUgbG9hZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIExvYWQgc2Vjb25kYXJ5IGRhdGEgdXNpbmcgYSBjb25uZWN0aW9uIGZyb20gdGhlIHN0b3JlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvLy8vLy8vLy8vLworICAgIC8vIFF1ZXJpZXMKKyAgICAvLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBnaXZlbiBleHRlcm5hbCBmaWVsZCB2YWx1ZSB0byBpdHMgZGF0YXN0b3JlIGVxdWl2YWxlbnQuCisgICAgICogSWYgdGhlIG1hcHBpbmcgb2NjdXBpZXMgbXVsdGlwbGUgY29sdW1ucyBpbiB0aGUgZGF0YXN0b3JlLCByZXR1cm4gYW4KKyAgICAgKiBvYmplY3QgYXJyYXksIGVsc2UgcmV0dXJuIGEgc2luZ2xlIG9iamVjdC4gU2ltcGx5IHJldHVybnMgdGhlIGdpdmVuCisgICAgICogb2JqZWN0IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIGdpdmVuIGtleSB2YWx1ZSB0byBpdHMgZGF0YXN0b3JlIGVxdWl2YWxlbnQuIElmIHRoZQorICAgICAqIG1hcHBpbmcgb2NjdXBpZXMgbXVsdGlwbGUgY29sdW1ucyBpbiB0aGUgZGF0YXN0b3JlLCByZXR1cm4gYW4gb2JqZWN0CisgICAgICogYXJyYXksIGVsc2UgcmV0dXJuIGEgc2luZ2xlIG9iamVjdC4gU2ltcGx5IHJldHVybnMgdGhlIGdpdmVuIG9iamVjdCBieQorICAgICAqIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB0b0tleURhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSk7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSB3aGVyZSBjbGF1c2UgdG8gdGhlIGdpdmVuIHN0YXRlbWVudCBjaGVja2luZyBpZiB0aGlzIHZhbHVlCisgICAgICogaXMgZW1wdHkuIEFwcGVuZHMgaW1wb3NzaWJsZS10by1zYXRpc2Z5IFNRTCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzRW1wdHkoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgd2hlcmUgY2xhdXNlIHRvIHRoZSBnaXZlbiBzdGF0ZW1lbnQgY2hlY2tpbmcgaWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG5vdCBlbXB0eS4gQXBwZW5kcyBhbHdheXMtc2F0aXNmaWVkIFNRTCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTm90RW1wdHkoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgd2hlcmUgY2xhdXNlIHRvIHRoZSBnaXZlbiBzdGF0ZW1lbnQgY2hlY2tpbmcgaWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOdWxsKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHdoZXJlIGNsYXVzZSB0byB0aGUgZ2l2ZW4gc3RhdGVtZW50IGNoZWNraW5nIGlmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgd2hlcmUgY2xhdXNlIHRvIHRoZSBnaXZlbiBzdGF0ZW1lbnQgY2hlY2tpbmcgdGhlIHNpemUKKyAgICAgKiBvZiB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kU2l6ZShTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBKb2luIHRoaXMgdmFsdWUgdG8gdGhlIGNsYXNzIHRhYmxlLiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyKTsKKworICAgIC8qKgorICAgICAqIEpvaW4gdGhlIGtleSB2YWx1ZSB0byB0aGUgY2xhc3MgdGFibGUuIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBqb2luS2V5KEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGlzIHZhbHVlJ3MgdGFibGUgdG8gdGhlIHRhYmxlIGZvciB0aGUgcmVsYXRlZCBmaXJzdCBjbGFzcyBvYmplY3QKKyAgICAgKiB0eXBlLCBpZiBhbnkuIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYXZlcnNlIGlmIHRydWUsIHRocm93IHByb3BlciBleGNlcHRpb24gaWYgaXQgaXMgbm90CisgICAgICogcG9zc2libGUgZm9yIHRoaXMgbWFwcGluZyB0byB0cmF2ZXJzZSBpbnRvIHRoZSByZWxhdGVkIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pblJlbGF0aW9uKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIsCisgICAgICAgIGJvb2xlYW4gdHJhdmVyc2UpOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGlzIHZhbHVlJ3MgdGFibGUgdG8gdGhlIHRhYmxlIGZvciB0aGUgcmVsYXRlZCBmaXJzdCBjbGFzcyBvYmplY3QKKyAgICAgKiBrZXkgdHlwZSwgaWYgYW55LiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmF2ZXJzZSBpZiB0cnVlLCB0aHJvdyBwcm9wZXIgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdAorICAgICAqIHBvc3NpYmxlIGZvciB0aGlzIG1hcHBpbmcgdG8gdHJhdmVyc2UgaW50byB0aGUgcmVsYXRlZCB0eXBlCisgICAgICovCisgICAgcHVibGljIEpvaW5zIGpvaW5LZXlSZWxhdGlvbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyLAorICAgICAgICBib29sZWFuIHRyYXZlcnNlKTsKKworICAgIC8qKgorICAgICAqIExvYWQgdGhpcyBmaWVsZCB2YWx1ZSB1c2luZyB0aGUgZ2l2ZW4gcmVzdWx0LiBUaGUgcmVzdWx0CisgICAgICogd2lsbCBjb250YWluIHRoZSBjb2x1bW5zIGZyb20ge0BsaW5rIFZhbHVlTWFwcGluZyNnZXRDb2x1bW5zfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoaXMgZmllbGQncyBrZXkgdmFsdWUgdXNpbmcgdGhlIGdpdmVuIHJlc3VsdC4gVGhlIHJlc3VsdCB3aWxsCisgICAgICogY29udGFpbiB0aGUgY29sdW1ucyBmcm9tIHtAbGluayBWYWx1ZU1hcHBpbmcjZ2V0Q29sdW1uc30uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb2FkS2V5UHJvamVjdGlvbihKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBWZXJzaW9uaW5nCisgICAgLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmllbGQgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiBhIHN0YXRlIGltYWdlIGZvcgorICAgICAqIG9wdGltaXN0aWMgbG9ja2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25hYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBXSEVSRSBjb25kaXRpb24gdG8gdGhlIHJvdyBmb3IgdGhpcyBmaWVsZCBzdWNoIHRoYXQgdGhlIGZpZWxkJ3MKKyAgICAgKiBjdXJyZW50IERCIHZhbHVlIG11c3QgZXF1YWwgdGhlIGdpdmVuIHByZXZpb3VzIHZhbHVlLiBPbmx5IHZlcnNpb25hYmxlCisgICAgICogbWFwcGluZ3MgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgbWVhbmluZ2Z1bGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSwKKyAgICAgICAgT2JqZWN0IHByZXZWYWx1ZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9KREJDQ29sdW1uT3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9KREJDQ29sdW1uT3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjI0Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0pEQkNDb2x1bW5PcmRlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CisKKy8qKgorICogT3JkZXIgYnkgYSBzeW50aGV0aWMgb3JkZXIgY29sdW1uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEpEQkNDb2x1bW5PcmRlcgorICAgIGltcGxlbWVudHMgSkRCQ09yZGVyIHsKKworICAgIHByaXZhdGUgQ29sdW1uIF9jb2wgPSBudWxsOworICAgIHByaXZhdGUgQ29sdW1uSU8gX2lvID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBzeW50aGV0aWMgY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW4gZ2V0Q29sdW1uKCkgeworICAgICAgICByZXR1cm4gX2NvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3ludGhldGljIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW4oQ29sdW1uIGNvbCkgeworICAgICAgICBfY29sID0gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEkvTyByZXN0cmljdGlvbnMgZm9yIHRoZSBzeW50aGV0aWMgY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5JTyBnZXRDb2x1bW5JTygpIHsKKyAgICAgICAgcmV0dXJuIChfaW8gPT0gbnVsbCkgPyBDb2x1bW5JTy5VTlJFU1RSSUNURUQgOiBfaW87CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIHJlc3RyaWN0aW9ucyBmb3IgdGhlIHN5bnRoZXRpYyBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSU8oQ29sdW1uSU8gaW8pIHsKKyAgICAgICAgX2lvID0gaW87CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKF9jb2wgPT0gbnVsbCkgPyAiIiA6IF9jb2wuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXNjZW5kaW5nKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luUmVsYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlcihTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgZWxlbSwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgaWYgKF9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgIHNlbC5vcmRlckJ5KF9jb2wsIHRydWUsIGpvaW5zLCB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSkRCQ09yZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSkRCQ09yZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5ZmNiZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9KREJDT3JkZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5PcmRlcjsKKworLyoqCisgKiBPcmRlciBpbiB0aGUgZGF0YXN0b3JlIHVzaW5nIEpEQkMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworaW50ZXJmYWNlIEpEQkNPcmRlcgorICAgIGV4dGVuZHMgT3JkZXIgeworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdmFsdWUgaXMgYSBtZW1iZXIgb2YgdGhlIGZpZWxkJ3MgcmVsYXRlZCB0eXBlLCByYXRoZXIgdGhhbgorICAgICAqIGNvbHVtbnMgb2YgdGhlIGZpZWxkIGl0c2VsZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luUmVsYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIE9yZGVyIGJ5IHRoaXMgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbSBpZiB0aGlzIHZhbHVlIGhhcyBpbmRlcGVuZGVudCBtYXBwaW5ncywgdGhlIG1hcHBpbmcKKyAgICAgKiB3ZSdyZSBzZWxlY3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvcmRlcihTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgZWxlbSwgSm9pbnMgam9pbnMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0pEQkNSZWxhdGVkRmllbGRPcmRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0pEQkNSZWxhdGVkRmllbGRPcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2NkZTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSkRCQ1JlbGF0ZWRGaWVsZE9yZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIFVzZSB0aGUgZGF0YWJhc2UgdG8gb3JkZXIgYnkgYSBmaWVsZCBpbiB0aGUgcmVsYXRlZCB0eXBlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEpEQkNSZWxhdGVkRmllbGRPcmRlcgorICAgIGltcGxlbWVudHMgSkRCQ09yZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEpEQkNSZWxhdGVkRmllbGRPcmRlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpZWxkTWFwcGluZyBfZm07CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9hc2M7CisKKyAgICBwdWJsaWMgSkRCQ1JlbGF0ZWRGaWVsZE9yZGVyKEZpZWxkTWFwcGluZyBvd25lciwgRmllbGRNYXBwaW5nIHJlbCwKKyAgICAgICAgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgaWYgKCFyZWwuaXNJbkRlZmF1bHRGZXRjaEdyb3VwKCkgJiYgIXJlbC5pc1ByaW1hcnlLZXkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm9uZGZnLWZpZWxkLW9yZGVyYWJsZSIsCisgICAgICAgICAgICAgICAgb3duZXIsIHJlbC5nZXROYW1lKCkpKTsKKworICAgICAgICBfZm0gPSByZWw7CisgICAgICAgIF9hc2MgPSBhc2M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX2ZtLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FzY2VuZGluZygpIHsKKyAgICAgICAgcmV0dXJuIF9hc2M7CisgICAgfQorCisgICAgcHVibGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblJlbGF0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcmRlcihTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgZWxlbSwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZtID0gZWxlbS5nZXRGaWVsZE1hcHBpbmcoX2ZtLmdldEluZGV4KCkpOworICAgICAgICBzZWwub3JkZXJCeShmbS5nZXRDb2x1bW5zKCksIF9hc2MsIGpvaW5zLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0pEQkNWYWx1ZU9yZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSkRCQ1ZhbHVlT3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNhOTAxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0pEQkNWYWx1ZU9yZGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5PcmRlcjsKKworLyoqCisgKiBPcmRlciBieSB2YWx1ZSBjb2x1bW5zLCB3aGljaCBhcmUgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgaW4gdGhlIGNhc2UKKyAqIG9mIGEgcmVsYXRpb24gZmllbGQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSkRCQ1ZhbHVlT3JkZXIKKyAgICBpbXBsZW1lbnRzIEpEQkNPcmRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpZWxkTWFwcGluZyBfZm07CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9hc2M7CisKKyAgICBwdWJsaWMgSkRCQ1ZhbHVlT3JkZXIoRmllbGRNYXBwaW5nIGZtLCBib29sZWFuIGFzYykgeworICAgICAgICBfZm0gPSBmbTsKKyAgICAgICAgX2FzYyA9IGFzYzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBPcmRlci5FTEVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXNjZW5kaW5nKCkgeworICAgICAgICByZXR1cm4gX2FzYzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luUmVsYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfZm0uZ2V0RWxlbWVudCgpLmdldFR5cGVNZXRhRGF0YSgpICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3JkZXIoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGVsZW0sIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGlmIChlbGVtICE9IG51bGwpCisgICAgICAgICAgICBzZWwub3JkZXJCeShlbGVtLmdldFByaW1hcnlLZXlDb2x1bW5zKCksIF9hc2MsIGpvaW5zLCBmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbC5vcmRlckJ5KF9mbS5nZXRFbGVtZW50TWFwcGluZygpLmdldENvbHVtbnMoKSwgX2FzYywKKyAgICAgICAgICAgICAgICBqb2lucywgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9KYXZhU1FMVHlwZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9KYXZhU1FMVHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Y5MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL0phdmFTUUxUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBKYXZhIFNRTCB0eXBlIGNvbnN0YW50cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgSmF2YVNRTFR5cGVzCisgICAgZXh0ZW5kcyBKYXZhVHlwZXMgeworCisgICAgLy8gY29uc3RhbnRzIGZvciB0aGUgc3FsIHR5cGVzIHRoYXQgYXJlbid0IGRpcmVjdGx5IHN1cHBvcnRlZCBieQorICAgIC8vIE9wZW5KUEE7IG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBjb25mbGljdCB3aXRoIG91ciBzdGFuZGFyZCBtZXRhZGF0YSB0eXBlcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9BUlJBWSA9IDEwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfU1RSRUFNID0gMTAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5BUllfU1RSRUFNID0gMTAwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9CID0gMTAwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFUyA9IDEwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9TVFJFQU0gPSAxMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT0IgPSAxMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9EQVRFID0gMTAwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfT0JKRUNUID0gMTAwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUYgPSAxMDA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUUgPSAxMDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVTVEFNUCA9IDEwMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkRCQ19ERUZBVUxUID0gMTAxMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGUgWkVST19CWVRFID0gbmV3IEJ5dGUoKGJ5dGUpIDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJhY3RlciBaRVJPX0NIQVIgPSBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEb3VibGUgWkVST19ET1VCTEUgPSBuZXcgRG91YmxlKDBkKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGbG9hdCBaRVJPX0ZMT0FUID0gbmV3IEZsb2F0KDBmKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaG9ydCBaRVJPX1NIT1JUID0gbmV3IFNob3J0KChzaG9ydCkgMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBaRVJPX0JJR0RFQ0lNQUwgPSBuZXcgQmlnRGVjaW1hbCgwZCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlIE5PTlpFUk9fQllURSA9IG5ldyBCeXRlKChieXRlKSAxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyYWN0ZXIgTk9OWkVST19DSEFSID0gbmV3IENoYXJhY3RlcigoY2hhcikgJ2EnKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEb3VibGUgTk9OWkVST19ET1VCTEUgPSBuZXcgRG91YmxlKDFkKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGbG9hdCBOT05aRVJPX0ZMT0FUID0gbmV3IEZsb2F0KDFmKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaG9ydCBOT05aRVJPX1NIT1JUID0gbmV3IFNob3J0KChzaG9ydCkgMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOT05aRVJPX0JJR0lOVEVHRVIgPSBuZXcgQmlnSW50ZWdlcigiMSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgTk9OWkVST19CSUdERUNJTUFMID0gbmV3IEJpZ0RlY2ltYWwoMWQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXIgZGF0ZSB0eXBlY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXREYXRlVHlwZUNvZGUoQ2xhc3MgZHR5cGUpIHsKKyAgICAgICAgaWYgKGR0eXBlID09IGphdmEudXRpbC5EYXRlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIERBVEU7CisgICAgICAgIGlmIChkdHlwZSA9PSBqYXZhLnNxbC5EYXRlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIFNRTF9EQVRFOworICAgICAgICBpZiAoZHR5cGUgPT0gVGltZXN0YW1wLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIFRJTUVTVEFNUDsKKyAgICAgICAgaWYgKGR0eXBlID09IFRpbWUuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gVElNRTsKKyAgICAgICAgcmV0dXJuIE9CSkVDVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW1wdHkgdmFsdWUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gdHlwZSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEVtcHR5VmFsdWUoaW50IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBaRVJPX0JZVEU7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIFpFUk9fQ0hBUjsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIFpFUk9fRE9VQkxFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIFpFUk9fRkxPQVQ7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoMCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigwTCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gWkVST19TSE9SVDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFpFUk9fQklHREVDSU1BTDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBub24tZW1wdHkgdmFsdWUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gdHlwZSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5vbkVtcHR5VmFsdWUoaW50IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ4IjsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBOT05aRVJPX0JZVEU7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTlpFUk9fQ0hBUjsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTlpFUk9fRE9VQkxFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTlpFUk9fRkxPQVQ7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoMSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigxTCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9OWkVST19TSE9SVDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTlpFUk9fQklHSU5URUdFUjsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTlpFUk9fQklHREVDSU1BTDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSm9pbmFibGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9Kb2luYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTQyYjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSm9pbmFibGUuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworCisvKioKKyAqIFJlcHJlc2VudHMgYSB2YWx1ZSB0aGF0IGNhbiBiZSBqb2luZWQgdG8uIEFueSBjb2x1bW4gdGhhdCBhIHVzZXIKKyAqIGpvaW5zIHRvIG11c3QgYmUgIm93bmVkIiBieSBhbiBlbnRpdHkgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLgorICogVGhlIHN5c3RlbSBtYXBzIGNvbHVtbnMgdG8gam9pbmFibGVzIHRvIGJlIGFibGUgdG8gZGVjb21wb3NlIG9pZHMgYW5kCisgKiBmaWVsZCB2YWx1ZXMgaW50byBpbmRpdmlkdWFsIGpvaW4gdmFsdWVzIG9uIGEgcGVyLWNvbHVtbiBiYXNpcy4gVGhpcworICogYWxsb3dzIHVzIHRvIHN1cHBvcnQgam9pbnMgdG8gb25seSBzb21lIG9mIHRoZSBjb2x1bW5zIG9mIGEgbWFwcGluZywgYW5kCisgKiB0byBiZSBsb29zZSB3aXRoIHRoZSBvcmRlcmluZyBvZiBmb3JlaWduIGtleSBjb2x1bW5zIHJlbGF0aXZlIHRvIHRoZQorICogb3JkZXJpbmcgb2YgdGhlIGpvaW5lZC10byBjb2x1bW5zLiBIYXZpbmcgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgZm9yCisgKiBqb2luYWJsZXMgYWxzbyBhbGxvd3MgdXMgdG8gcGVyZm9ybSB0cmlja3Mgc3VjaCBhcyBhIHZlcnRpY2FsbHktbWFwcGVkCisgKiBhcHBsaWNhdGlvbiBpZGVudGl0eSBzdWJjbGFzcyB0cmFuc3BhcmVudGx5IHRyYW5zZm9ybWluZyBjb2x1bW5zIG9mIGl0cworICogZm9yZWlnbiBrZXkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcHJpbWFyeSBrZXkgZmllbGRzIGluIHRoZSBiYXNlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9pbmFibGUgCisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWVsZCBpbmRleCBvZiB0aGlzIGpvaW5hYmxlLCBvciAtMSBpZiBub3QgYSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZpZWxkSW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoaXMgam9pbmFibGUgZnJvbSB0aGUgZ2l2ZW4gcmVzdWx0LCB1c2luZyB0aGUKKyAgICAgKiBnaXZlbiBjb2x1bW5zLiBJZiB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgaXMgbm9uLW51bGwsIHVzZSB0aGUgZm9yZWlnbgorICAgICAqIGtleSdzIGNvbHVtbnMgYnkgdHJhbnNsYXRpbmcgdGhlIGdpdmVuIGNvbHVtbnMgdGhyb3VnaAorICAgICAqIHtAbGluayBGb3JlaWduS2V5I2dldENvbHVtbn0uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcmltYXJ5S2V5VmFsdWUoUmVzdWx0IHJlcywgQ29sdW1uW10gY29scywgRm9yZWlnbktleSBmaywKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW5zIG1hbmFnZWQgYnkgdGhpcyBqb2luYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBqb2luIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgZm9yIHRoaXMgam9pbmFibGUKKyAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gb2YgdGhpcyBqb2luYWJsZSB3aG9zZSB2YWx1ZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEpvaW5WYWx1ZShPYmplY3QgdmFsLCBDb2x1bW4gY29sLCBKREJDU3RvcmUgc3RvcmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBqb2luIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc20gdGhlIGluc3RhbmNlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSB2YWx1ZQorICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB3aG9zZSB2YWx1ZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEpvaW5WYWx1ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBDb2x1bW4gY29sLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpOworCisgICAgLyoqCisgICAgICogVXNlIHRoZSBnaXZlbiBhdXRvLWFzc2lnbmVkIHZhbHVlIHRvIHNldCB0aGlzIGpvaW4gdmFsdWUncyBmaWVsZAorICAgICAqIG9uIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQXNzaWduZWRWYWx1ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIENvbHVtbiBjb2wsIE9iamVjdCBhdXRvZ2VuKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nRGVmYXVsdHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nRGVmYXVsdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTE5ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdEZWZhdWx0cy5qYXZhCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworCisvKioKKyAqIEdlbmVyYXRlcyBkZWZhdWx0IG5hbWVzIGZvciB0YWJsZXMsIGNvbHVtbnMsIGluZGV4ZXMsIGNvbnN0cmFpbnRzLCBldGMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBNYXBwaW5nRGVmYXVsdHMgeworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmaWxsIGluIG1pc3NpbmcgbWFwcGluZyBpbmZvcm1hdGlvbiBhdCBydW50aW1lIHdpdGggdGhlCisgICAgICogZGVmYXVsdCB2YWx1ZXMgc3VwcGxpZWQgYnkgdGhpcyBwbHVnaW4uIEEgdmFsdWUgb2YgZmFsc2UgbWVhbnMgdGhhdAorICAgICAqIGFsbCBtYXBwaW5nIGluZm9ybWF0aW9uIG11c3QgYmUgcHJlc2VudCBhdCBydW50aW1lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRlZmF1bHRNaXNzaW5nSW5mbygpOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgZm9yIHdoZXRoZXIgcmVsYXRpb25zIHVzZSB0aGUgcmVsYXRlZCBvYmplY3QncworICAgICAqIGV4cGVjdGVkIGNsYXNzIGFzIHBhcnQgb2YgdGhlIGpvaW4gY3JpdGVyaWEuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdXNlQ2xhc3NDcml0ZXJpYSgpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBtYXBwaW5nIHN0cmF0ZWd5IHdoZW4gdGhlcmUgaXMgbm8gZXhwbGljaXQgc3RyYXRlZ3kKKyAgICAgKiBhbmQgbm8gaGllcmFyY2h5IHN0cmF0ZWd5IGdpdmVuLgorICAgICAqCisgICAgICogQHBhcmFtIGNscyB0aGUgY2xhc3M7IHdpbGwgbm90IGJlIG1hcHBlZCwgYnV0IHN1cGVyY2xhc3MgYW5kIHJhdworICAgICAqIHtAbGluayBNYXBwaW5nSW5mb30gd2lsbCBiZSBhdmFpbGFibGUKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB3ZSBjYW4gYWRhcHQgdGhlIG1hcHBpbmcgb3Igc2NoZW1hCisgICAgICogQHJldHVybiB0aGUgc3RyYXRlZ3kgYWxpYXMgb3IgYSBzdHJhdGVneSBpbnN0YW5jZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RyYXRlZ3koQ2xhc3NNYXBwaW5nIGNscywgYm9vbGVhbiBhZGFwdCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZlcnNpb24gbWFwcGluZyBzdHJhdGVneSB3aGVuIHRoZXJlIGlzIG5vIGV4cGxpY2l0IHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnMgdGhlIHZlcnNpb247IHdpbGwgbm90IGJlIG1hcHBlZCwgYnV0IHJhdworICAgICAqIHtAbGluayBNYXBwaW5nSW5mb30gd2lsbCBiZSBhdmFpbGFibGUKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB3ZSBjYW4gYWRhcHQgdGhlIG1hcHBpbmcgb3Igc2NoZW1hCisgICAgICogQHJldHVybiB0aGUgc3RyYXRlZ3kgYWxpYXMgb3IgYSBzdHJhdGVneSBpbnN0YW5jZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RyYXRlZ3koVmVyc2lvbiB2ZXJzLCBib29sZWFuIGFkYXB0KTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZGlzY3JpbWluYXRvciBtYXBwaW5nIHN0cmF0ZWd5IHdoZW4gdGhlcmUgaXMgbm8gZXhwbGljaXQKKyAgICAgKiBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXNjIHRoZSBkaXNjcmltaW5hdG9yOyB3aWxsIG5vdCBiZSBtYXBwZWQsIGJ1dCByYXcKKyAgICAgKiB7QGxpbmsgTWFwcGluZ0luZm99IHdpbGwgYmUgYXZhaWxhYmxlCisgICAgICogQHBhcmFtIGFkYXB0IHdoZXRoZXIgd2UgY2FuIGFkYXB0IHRoZSBtYXBwaW5nIG9yIHNjaGVtYQorICAgICAqIEByZXR1cm4gdGhlIHN0cmF0ZWd5IGFsaWFzIG9yIGEgc3RyYXRlZ3kgaW5zdGFuY2UsIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFN0cmF0ZWd5KERpc2NyaW1pbmF0b3IgZGlzYywgYm9vbGVhbiBhZGFwdCk7CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gaGFuZGxlciBvciBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIGZpZWxkLCBvciBudWxsIGlmIG5vbmUKKyAgICAgKiBoYXMgYmVlbiByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZtIHRoZSB2YWx1ZSBtYXBwaW5nOyB3aWxsIG5vdCBiZSBtYXBwZWQsIGJ1dCByYXcKKyAgICAgKiB7QGxpbmsgTWFwcGluZ0luZm99IHdpbGwgYmUgYXZhaWxhYmxlCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHZhbHVlIHR5cGUKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB3ZSBjYW4gYWRhcHQgdGhlIG1hcHBpbmcgb3Igc2NoZW1hCisgICAgICogQHJldHVybiB0aGUgaGFuZGxlci9zdHJhdGVneSBhbGlhcyBvciBpbnN0YW5jZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RyYXRlZ3koVmFsdWVNYXBwaW5nIHZtLCBDbGFzcyB0eXBlLCBib29sZWFuIGFkYXB0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBkaXNjcmltaW5hdG9yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXREaXNjcmltaW5hdG9yVmFsdWUoRGlzY3JpbWluYXRvciBkaXNjLCBib29sZWFuIGFkYXB0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lIGZvciB0aGUgZ2l2ZW4gY2xhc3MuIFRoaXMgbWV0aG9kIGlzCisgICAgICogb25seSBjYWxsZWQgZm9yIGNsYXNzZXMgbWFwcGVkIHRvIHRoZWlyIG93biB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZShDbGFzc01hcHBpbmcgY2xzLCBTY2hlbWEgZGVmYXVsdFNjaGVtYSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2Vjb25kYXJ5IHRhYmxlIG5hbWUgZm9yIHRoZSBnaXZlbiBmaWVsZC4gVGhpcworICAgICAqIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBmb3IgZmllbGRzIHdob3NlIHN0cmF0ZWd5IHJlcXVpcmVzIGEgc2Vjb25kYXJ5CisgICAgICogdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoRmllbGRNYXBwaW5nIGZtLCBTY2hlbWEgZGVmYXVsdFNjaGVtYSk7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIGluIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhc3RvcmUgaWRlbnRpdHkgY29sdW1ucy4KKyAgICAgKiBUaGUgY29sdW1ucycgbmFtZSBhbmQgSmF2YSB0eXBlIHdpbGwgYWxyZWFkeSBiZSBwb3B1bGF0ZWQgd2l0aCBnZW5lcmljCisgICAgICogZGVmYXVsdHMgdGhhdCBtYXkgYmUgcmVwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVEYXRhU3RvcmVJZENvbHVtbnMoQ2xhc3NNYXBwaW5nIGNscywgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpOworCisgICAgLyoqCisgICAgICogRmlsbCBpbiBkZWZhdWx0IGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gdmVyc2lvbiBjb2x1bW5zLgorICAgICAqIFRoZSBjb2x1bW5zJyBuYW1lIGFuZCBKYXZhIHR5cGUgd2lsbCBhbHJlYWR5IGJlIHBvcHVsYXRlZCB3aXRoIGdlbmVyaWMKKyAgICAgKiBkZWZhdWx0cyB0aGF0IG1heSBiZSByZXBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbHVtbnMoVmVyc2lvbiB2ZXJzLCBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIGluIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCisgICAgICogVGhlIGNvbHVtbnMnIG5hbWUgYW5kIEphdmEgdHlwZSB3aWxsIGFscmVhZHkgYmUgcG9wdWxhdGVkIHdpdGggZ2VuZXJpYworICAgICAqIGRlZmF1bHRzIHRoYXQgbWF5IGJlIHJlcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29sdW1ucyhEaXNjcmltaW5hdG9yIGRpc2MsIFRhYmxlIHRhYmxlLAorICAgICAgICBDb2x1bW5bXSBjb2xzKTsKKworICAgIC8qKgorICAgICAqIEZpbGwgaW4gZGVmYXVsdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGNvbHVtbiB1c2VkIHRvIGpvaW4gYSBjbGFzcworICAgICAqIHRvIGl0cyBzdXBlcmNsYXNzIHRhYmxlLiBUaGUgY29sdW1uIHdpbGwgYmUgYSBjbG9uZSBvZiB0aGUgdGFyZ2V0CisgICAgICogY29sdW1uLCBvciBoYXZlIGl0cyBuYW1lIGFuZCBKYXZhIHR5cGUgc2V0IGluIHRoZSBjYXNlIG9mIGEgY29uc3RhbnQKKyAgICAgKiB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgb2YgdGhpcyBjb2x1bW4gaW4gdGhlIGpvaW47IG1heSBiZQorICAgICAqIGFub3RoZXIgY29sdW1uIG9yIGEgY29uc3RhbnQgdmFsdWUKKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBpbmRleCBvZiB0aGlzIGNvbHVtbiBpbiB0aGUgbG9naWNhbCBmb3JlaWduIGtleQorICAgICAqIEBwYXJhbSBjb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbG9naWNhbCBmb3JlaWduIGtleQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlSm9pbkNvbHVtbihDbGFzc01hcHBpbmcgY20sIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBpbnQgcG9zLCBpbnQgY29scyk7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIGluIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBjb2x1bW4gdXNlZCB0byBqb2luIGEgZmllbGQKKyAgICAgKiB0byBpdHMgZGVmaW5pbmcgY2xhc3MnIHRhYmxlLiBUaGUgY29sdW1uIHdpbGwgYmUgYSBjbG9uZSBvZiB0aGUgdGFyZ2V0CisgICAgICogY29sdW1uLCBvciBoYXZlIGl0cyBuYW1lIGFuZCBKYXZhIHR5cGUgc2V0IGluIHRoZSBjYXNlIG9mIGEgY29uc3RhbnQKKyAgICAgKiB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgb2YgdGhpcyBjb2x1bW4gaW4gdGhlIGpvaW47IG1heSBiZQorICAgICAqIGFub3RoZXIgY29sdW1uIG9yIGEgY29uc3RhbnQgdmFsdWUKKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBpbmRleCBvZiB0aGlzIGNvbHVtbiBpbiB0aGUgbG9naWNhbCBmb3JlaWduIGtleQorICAgICAqIEBwYXJhbSBjb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbG9naWNhbCBmb3JlaWduIGtleQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlSm9pbkNvbHVtbihGaWVsZE1hcHBpbmcgZm0sIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBpbnQgcG9zLCBpbnQgY29scyk7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIGluIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBjb2x1bW4gdXNlZCB0byBqb2luIGEgdmFsdWUKKyAgICAgKiB0byBpdHMgcmVsYXRlZCB0eXBlLiBUaGUgY29sdW1uIHdpbGwgYmUgYSBjbG9uZSBvZiB0aGUgdGFyZ2V0CisgICAgICogY29sdW1uLCBvciBoYXZlIGl0cyBuYW1lIGFuZCBKYXZhIHR5cGUgc2V0IGluIHRoZSBjYXNlIG9mIGEgY29uc3RhbnQKKyAgICAgKiB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBiYXNlIG5hbWUgZm9yIHZhbHVlLCBhcyBkZWNpZGVkIGJ5IG1hcHBpbmcKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgb2YgdGhpcyBjb2x1bW4gaW4gdGhlIGpvaW47IG1heSBiZQorICAgICAqIGFub3RoZXIgY29sdW1uIG9yIGEgY29uc3RhbnQgdmFsdWUKKyAgICAgKiBAcGFyYW0gaW52ZXJzZSB3aGV0aGVyIHRoaXMgaXMgYW4gaW52ZXJzZSBmb3JlaWduIGtleQorICAgICAqIEBwYXJhbSBwb3MgdGhlIGluZGV4IG9mIHRoaXMgY29sdW1uIGluIHRoZSBsb2dpY2FsIGZvcmVpZ24ga2V5CisgICAgICogQHBhcmFtIGNvbHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBsb2dpY2FsIGZvcmVpZ24ga2V5CisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVGb3JlaWduS2V5Q29sdW1uKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsCisgICAgICAgIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBib29sZWFuIGludmVyc2UsCisgICAgICAgIGludCBwb3MsIGludCBjb2xzKTsKKworICAgIC8qKgorICAgICAqIEZpbGwgaW4gZGVmYXVsdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHZhbHVlIGNvbHVtbnMuCisgICAgICogVGhlIGNvbHVtbnMnIG5hbWUgYW5kIEphdmEgdHlwZSB3aWxsIGFscmVhZHkgYmUgcG9wdWxhdGVkIHdpdGggZ2VuZXJpYworICAgICAqIGRlZmF1bHRzIHRoYXQgbWF5IGJlIHJlcGxhY2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYmFzZSBuYW1lIGZvciB2YWx1ZSwgYXMgZGVjaWRlZCBieSBtYXBwaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVDb2x1bW5zKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlLAorICAgICAgICBDb2x1bW5bXSBjb2xzKTsKKworICAgIC8qKgorICAgICAqIEZpbGwgaW4gZGVmYXVsdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIG9yZGVyIGNvbHVtbnMuCisgICAgICogVGhlIGNvbHVtbnMnIG5hbWUgYW5kIEphdmEgdHlwZSB3aWxsIGFscmVhZHkgYmUgcG9wdWxhdGVkIHdpdGggZ2VuZXJpYworICAgICAqIGRlZmF1bHRzIHRoYXQgbWF5IGJlIHJlcGxhY2VkLgorICAgICAqCisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgZ2l2ZW4gZmllbGQgc2hvdWxkIG5vdCBoYXZlIG9yZGVyIGNvbHVtbnMKKyAgICAgKiBieSBkZWZhdWx0OyBmaWxsIGluIGRlZmF1bHQgaW5mb3JtYXRpb24gZXZlbiB3aGVuIHJldHVybmluZworICAgICAqIGZhbHNlIGluIGNhc2UgdGhlIHVzZXIgZm9yY2VzIG9yZGVyaW5nCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcG9wdWxhdGVPcmRlckNvbHVtbnMoRmllbGRNYXBwaW5nIGZtLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIGluIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBudWxsIGluZGljYXRvciBjb2x1bW5zLgorICAgICAqIFRoZSBjb2x1bW5zJyBuYW1lIGFuZCBKYXZhIHR5cGUgd2lsbCBhbHJlYWR5IGJlIHBvcHVsYXRlZCB3aXRoIGdlbmVyaWMKKyAgICAgKiBkZWZhdWx0cyB0aGF0IG1heSBiZSByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGJhc2UgbmFtZSBmb3IgdmFsdWUsIGFzIGRlY2lkZWQgYnkgbWFwcGluZworICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGdpdmVuIHZhbHVlIHNob3VsZCBub3QgaGF2ZSBudWxsIGluZGljYXRvcgorICAgICAqIGNvbHVtbnMgYnkgZGVmYXVsdDsgZmlsbCBpbiBkZWZhdWx0IGluZm9ybWF0aW9uIGV2ZW4KKyAgICAgKiB3aGVuIHJldHVybmluZyBmYWxzZSBpbiBjYXNlIHRoZSB1c2VyIGZvcmNlcyBhbiBpbmRpY2F0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZU51bGxJbmRpY2F0b3JDb2x1bW5zKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsCisgICAgICAgIFRhYmxlIHRhYmxlLCBDb2x1bW5bXSBjb2xzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGRlZmF1bHQgZm9yZWlnbiBrZXkgZm9yIHRoZSBqb2luIGZyb20gdGhpcyBjbGFzcycgdGFibGUgdG8gaXRzCisgICAgICogc3VwZXJjbGFzcycgdGFibGUsIG9yIG51bGwgZm9yIGEgbG9naWNhbCBmb3JlaWduIGtleSBvbmx5LiBEbyBub3QKKyAgICAgKiBhZGQgY29sdW1ucyB0byB0aGUga2V5IG9yIGFkZCB0aGUga2V5IHRvIHRoZSB0YWJsZTsgb25seSBmaWxsIGluCisgICAgICogaXRzIGluZm9ybWF0aW9uIHN1Y2ggYXMgbmFtZSwgZGVsZXRlIGFjdGlvbiwgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KENsYXNzTWFwcGluZyBjbHMsIFRhYmxlIGxvY2FsLAorICAgICAgICBUYWJsZSBmb3JlaWduKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGRlZmF1bHQgZm9yZWlnbiBrZXkgZm9yIHRoZSBqb2luIGZyb20gdGhpcyBmaWVsZCdzIHRhYmxlIHRvIGl0cworICAgICAqIGRlZmluaW5nIGNsYXNzJyB0YWJsZSwgb3IgbnVsbCBmb3IgYSBsb2dpY2FsIGZvcmVpZ24ga2V5IG9ubHkuIERvIG5vdAorICAgICAqIGFkZCBjb2x1bW5zIHRvIHRoZSBrZXkgb3IgYWRkIHRoZSBrZXkgdG8gdGhlIHRhYmxlOyBvbmx5IGZpbGwgaW4KKyAgICAgKiBpdHMgaW5mb3JtYXRpb24gc3VjaCBhcyBuYW1lLCBkZWxldGUgYWN0aW9uLCBldGMuCisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pbkZvcmVpZ25LZXkoRmllbGRNYXBwaW5nIGZtLCBUYWJsZSBsb2NhbCwKKyAgICAgICAgVGFibGUgZm9yZWlnbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZWZhdWx0IGZvcmVpZ24ga2V5IGZvciB0aGUgam9pbiBmcm9tIHRoaXMgdmFsdWUgdG8gaXRzCisgICAgICogcmVsYXRlZCB0eXBlLCBvciBudWxsIGZvciBhIGxvZ2ljYWwgZm9yZWlnbiBrZXkgb25seS4gRG8gbm90CisgICAgICogYWRkIGNvbHVtbnMgdG8gdGhlIGtleSBvciBhZGQgdGhlIGtleSB0byB0aGUgdGFibGU7IG9ubHkgZmlsbCBpbgorICAgICAqIGl0cyBpbmZvcm1hdGlvbiBzdWNoIGFzIG5hbWUsIGRlbGV0ZSBhY3Rpb24sIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGJhc2UgbmFtZSBmb3IgdmFsdWUsIGFzIGRlY2lkZWQgYnkgbWFwcGluZworICAgICAqIEBwYXJhbSBpbnZlcnNlIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnZlcnNlIGtleQorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgVGFibGUgbG9jYWwsCisgICAgICAgIFRhYmxlIGZvcmVpZ24sIGJvb2xlYW4gaW52ZXJzZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZWZhdWx0IGluZGV4IGZvciB0aGUgam9pbiwgb3IgbnVsbCBpZiB0aGUKKyAgICAgKiBqb2luIGNvbHVtbnMgc2hvdWxkIG5vdCBiZSBpbmRleGVkIGJ5IGRlZmF1bHQuIERvIG5vdAorICAgICAqIGFkZCBjb2x1bW5zIHRvIHRoZSBpbmRleCBvciBhZGQgdGhlIGluZGV4IHRvIHRoZSB0YWJsZTsgb25seSBmaWxsIGluCisgICAgICogaXRzIGluZm9ybWF0aW9uIHN1Y2ggYXMgbmFtZSwgdW5pcXVlbmVzcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBJbmRleCBnZXRKb2luSW5kZXgoRmllbGRNYXBwaW5nIGZtLCBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZWZhdWx0IGluZGV4IGZvciB0aGUgdmFsdWUsIG9yIG51bGwgaWYgdGhlIHZhbHVlIGNvbHVtbnMKKyAgICAgKiBzaG91bGQgbm90IGJlIGluZGV4ZWQgYnkgZGVmYXVsdC4gRG8gbm90IGFkZCBjb2x1bW5zIHRvIHRoZSBpbmRleCBvcgorICAgICAqIGFkZCB0aGUgaW5kZXggdG8gdGhlIHRhYmxlOyBvbmx5IGZpbGwgaW4gaXRzIGluZm9ybWF0aW9uIHN1Y2ggYXMgbmFtZSwKKyAgICAgKiB1bmlxdWVuZXNzLCBldGMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBiYXNlIG5hbWUgZm9yIHZhbHVlLCBhcyBkZWNpZGVkIGJ5IG1hcHBpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgZGVmYXVsdCBpbmRleCBmb3IgdGhlIHZlcnNpb24sIG9yIG51bGwgaWYgdGhlCisgICAgICogdmVyc2lvbiBjb2x1bW5zIHNob3VsZCBub3QgYmUgaW5kZXhlZCBieSBkZWZhdWx0LiBEbyBub3QKKyAgICAgKiBhZGQgY29sdW1ucyB0byB0aGUgaW5kZXggb3IgYWRkIHRoZSBpbmRleCB0byB0aGUgdGFibGU7IG9ubHkgZmlsbCBpbgorICAgICAqIGl0cyBpbmZvcm1hdGlvbiBzdWNoIGFzIG5hbWUsIHVuaXF1ZW5lc3MsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoVmVyc2lvbiB2ZXJzLCBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZWZhdWx0IGluZGV4IGZvciB0aGUgZGlzY3JpbWluYXRvciwgb3IgbnVsbCBpZiB0aGUKKyAgICAgKiBkaXNjcmltaW5hdG9yIGNvbHVtbnMgc2hvdWxkIG5vdCBiZSBpbmRleGVkIGJ5IGRlZmF1bHQuIERvIG5vdAorICAgICAqIGFkZCBjb2x1bW5zIHRvIHRoZSBpbmRleCBvciBhZGQgdGhlIGluZGV4IHRvIHRoZSB0YWJsZTsgb25seSBmaWxsIGluCisgICAgICogaXRzIGluZm9ybWF0aW9uIHN1Y2ggYXMgbmFtZSwgdW5pcXVlbmVzcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBJbmRleCBnZXRJbmRleChEaXNjcmltaW5hdG9yIGRpc2MsIFRhYmxlIHRhYmxlLCBDb2x1bW5bXSBjb2xzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGRlZmF1bHQgY29uc3RyYWludCBmb3IgdGhlIGpvaW4sIG9yIG51bGwgaWYgdGhlIGpvaW4gY29sdW1ucworICAgICAqIHNob3VsZCBub3QgYmUgY29uc3RyYWluZWQgYnkgZGVmYXVsdC4gRG8gbm90IGFkZCBjb2x1bW5zIHRvIHRoZQorICAgICAqIGNvbnN0cmFpbnQgb3IgYWRkIHRoZSBjb25zdHJhaW50IHRvIHRoZSB0YWJsZTsgb25seSBmaWxsIGluIGl0cworICAgICAqIGluZm9ybWF0aW9uIHN1Y2ggYXMgbmFtZSwgZGVmZXJyYWJpbGl0eSwgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBVbmlxdWUgZ2V0Sm9pblVuaXF1ZShGaWVsZE1hcHBpbmcgZm0sIFRhYmxlIHRhYmxlLCBDb2x1bW5bXSBjb2xzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGRlZmF1bHQgY29uc3RyYWludCBmb3IgdGhlIHZhbHVlLCBvciBudWxsIGlmIHRoZSB2YWx1ZSBjb2x1bW5zCisgICAgICogc2hvdWxkIG5vdCBiZSBjb25zdHJhaW5lZCBieSBkZWZhdWx0LiBEbyBub3QgYWRkIGNvbHVtbnMgdG8gdGhlCisgICAgICogY29uc3RyYWludCBvciBhZGQgdGhlIGNvbnN0cmFpbnQgdG8gdGhlIHRhYmxlOyBvbmx5IGZpbGwgaW4gaXRzCisgICAgICogaW5mb3JtYXRpb24gc3VjaCBhcyBuYW1lLCBkZWZlcnJhYmlsaXR5LCBldGMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBiYXNlIG5hbWUgZm9yIHZhbHVlLCBhcyBkZWNpZGVkIGJ5IG1hcHBpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pcXVlIGdldFVuaXF1ZShWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgdGFibGUgb2YgdGhlIGdpdmVuIGNsYXNzLAorICAgICAqIG9yIG51bGwgZm9yIGRhdGFiYXNlIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5TmFtZShDbGFzc01hcHBpbmcgY20sIFRhYmxlIHRhYmxlKTsKKworICAgIC8qKgorICAgICAqIElmIGRlc2lyZWQsIGluc3RhbGwgYSBwcmltYXJ5IGtleSBvbiB0aGUgZ2l2ZW4gc2Vjb25kYXJ5IHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxQcmltYXJ5S2V5KEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdEZWZhdWx0c0ltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nRGVmYXVsdHNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyOWEwYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nRGVmYXVsdHNJbXBsLmphdmEKQEAgLTAsMCArMSw3MDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlVudHlwZWRQQ1ZhbHVlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkphdmFWZXJzaW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTWFwcGluZ0RlZmF1bHRzfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTWFwcGluZ0RlZmF1bHRzSW1wbAorICAgIGltcGxlbWVudHMgTWFwcGluZ0RlZmF1bHRzLCBDb25maWd1cmFibGUgeworCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBEQkRpY3Rpb25hcnkgZGljdCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Jhc2VDbGFzc1N0cmF0ZWd5ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfc3ViY2xhc3NTdHJhdGVneSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3ZlcnNpb25TdHJhdGVneSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Rpc2NTdHJhdGVneSA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX2ZpZWxkTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2RlZk1pc3NpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2NsYXNzQ3JpdGVyaWEgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBfam9pbkZLQWN0aW9uID0gRm9yZWlnbktleS5BQ1RJT05fTk9ORTsKKyAgICBwcml2YXRlIGludCBfZmtBY3Rpb24gPSBGb3JlaWduS2V5LkFDVElPTl9OT05FOworICAgIHByaXZhdGUgYm9vbGVhbiBfZGVmZXIgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2luZGV4RksgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaW5kZXhEaXNjID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2luZGV4VmVycyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfb3JkZXJMaXN0cyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9hZGROdWxsSW5kID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9vcmRpbmFsRW51bSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3RyaW5naWZ5VW5tYXBwZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBfZHNJZE5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF92ZXJzTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Rpc2NOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfb3JkZXJOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfbnVsbEluZE5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBiYXNlIGNsYXNzIHN0cmF0ZWd5IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUNsYXNzU3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBfYmFzZUNsYXNzU3RyYXRlZ3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBiYXNlIGNsYXNzIHN0cmF0ZWd5IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VDbGFzc1N0cmF0ZWd5KFN0cmluZyBiYXNlQ2xhc3NTdHJhdGVneSkgeworICAgICAgICBfYmFzZUNsYXNzU3RyYXRlZ3kgPSBiYXNlQ2xhc3NTdHJhdGVneTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHN1YmNsYXNzIHN0cmF0ZWd5IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViY2xhc3NTdHJhdGVneSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdWJjbGFzc1N0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgc3ViY2xhc3Mgc3RyYXRlZ3kgYWxpYXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3ViY2xhc3NTdHJhdGVneShTdHJpbmcgc3ViY2xhc3NTdHJhdGVneSkgeworICAgICAgICBfc3ViY2xhc3NTdHJhdGVneSA9IHN1YmNsYXNzU3RyYXRlZ3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2ZXJzaW9uIHN0cmF0ZWd5IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gX3ZlcnNpb25TdHJhdGVneTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZlcnNpb24gc3RyYXRlZ3kgYWxpYXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvblN0cmF0ZWd5KFN0cmluZyB2ZXJzaW9uU3RyYXRlZ3kpIHsKKyAgICAgICAgX3ZlcnNpb25TdHJhdGVneSA9IHZlcnNpb25TdHJhdGVneTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kgYWxpYXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNjcmltaW5hdG9yU3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBfZGlzY1N0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZGlzY3JpbWluYXRvciBzdHJhdGVneSBhbGlhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yU3RyYXRlZ3koU3RyaW5nIGRpc2NTdHJhdGVneSkgeworICAgICAgICBfZGlzY1N0cmF0ZWd5ID0gZGlzY1N0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IHN0cmluZyBtYXBwaW5nIGZpZWxkIHR5cGUgbmFtZXMgdG8gdmFsdWUgaGFuZGxlciBvciBmaWVsZAorICAgICAqIG1hcHBpbmcgY2xhc3MgbmFtZXMuIEZvciBhdXRvLWNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRTdHJhdGVnaWVzKFN0cmluZyBmaWVsZE1hcFN0cmluZykgeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzKGZpZWxkTWFwU3RyaW5nKTsKKyAgICAgICAgaWYgKHByb3BzICE9IG51bGwpCisgICAgICAgICAgICBfZmllbGRNYXAucHV0QWxsKHByb3BzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGlvbiBvZiBhIGZpZWxkIHZhbHVlIHR5cGUgbmFtZSB3aXRoIHRoZSBoYW5kbGVyIG9yIHN0cmF0ZWd5CisgICAgICogY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFN0cmF0ZWd5KFN0cmluZyB2YWx1ZVR5cGUsIFN0cmluZyBoYW5kbGVyVHlwZSkgeworICAgICAgICBpZiAoaGFuZGxlclR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIF9maWVsZE1hcC5yZW1vdmUodmFsdWVUeXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2ZpZWxkTWFwLnB1dCh2YWx1ZVR5cGUsIGhhbmRsZXJUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGlvbiBvZiBhIGZpZWxkIHZhbHVlIHR5cGUgbmFtZSB3aXRoIHRoZSBoYW5kbGVyIG9yIHN0cmF0ZWd5CisgICAgICogY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkU3RyYXRlZ3koU3RyaW5nIHZhbHVlVHlwZSkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgX2ZpZWxkTWFwLmdldCh2YWx1ZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc3RvcmUgZW51bXMgYXMgdGhlIG9yZGluYWwgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGVudW0gbmFtZS4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTdG9yZUVudW1PcmRpbmFsKCkgeworICAgICAgICByZXR1cm4gX29yZGluYWxFbnVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc3RvcmUgZW51bXMgYXMgdGhlIG9yZGluYWwgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGVudW0gbmFtZS4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZUVudW1PcmRpbmFsKGJvb2xlYW4gb3JkaW5hbCkgeworICAgICAgICBfb3JkaW5hbEVudW0gPSBvcmRpbmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc3RvcmUgYSByZWxhdGlvbiB0byBhbiB1bm1hcHBlZCBjbGFzcyBieSBzdHJpbmdpZnlpbmcgdGhlCisgICAgICogb2lkIG9mIHRoZSByZWxhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW4gc3RvcmluZyBwcmltYXJ5IGtleSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3RvcmVVbm1hcHBlZE9iamVjdElkU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gX3N0cmluZ2lmeVVubWFwcGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc3RvcmUgYSByZWxhdGlvbiB0byBhbiB1bm1hcHBlZCBjbGFzcyBieSBzdHJpbmdpZnlpbmcgdGhlCisgICAgICogb2lkIG9mIHRoZSByZWxhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW4gc3RvcmluZyBwcmltYXJ5IGtleSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVVbm1hcHBlZE9iamVjdElkU3RyaW5nKGJvb2xlYW4gc3RyaW5naWZ5KSB7CisgICAgICAgIF9zdHJpbmdpZnlVbm1hcHBlZCA9IHN0cmluZ2lmeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZvcmVpZ24ga2V5IGFjdGlvbiBmb3Igam9pbiBrZXlzLiBEZWZhdWx0cyB0byBsb2dpY2FsIGtleXMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKb2luRm9yZWlnbktleURlbGV0ZUFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9qb2luRktBY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBmb3JlaWduIGtleSBhY3Rpb24gZm9yIGpvaW4ga2V5cy4gRGVmYXVsdHMgdG8gbG9naWNhbCBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5Gb3JlaWduS2V5RGVsZXRlQWN0aW9uKGludCBqb2luRktBY3Rpb24pIHsKKyAgICAgICAgX2pvaW5GS0FjdGlvbiA9IGpvaW5GS0FjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZvcmVpZ24ga2V5IGFjdGlvbiBuYW1lIGZvciBqb2luIGtleXMuIFVzZWQgaW4gYXV0bworICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbkZvcmVpZ25LZXlEZWxldGVBY3Rpb24oU3RyaW5nIGpvaW5GS0FjdGlvbikgeworICAgICAgICBfam9pbkZLQWN0aW9uID0gRm9yZWlnbktleS5nZXRBY3Rpb24oam9pbkZLQWN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZvcmVpZ24ga2V5IGFjdGlvbiBmb3IgcmVsYXRpb24ga2V5cy4gRGVmYXVsdHMgdG8gbG9naWNhbCBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Rm9yZWlnbktleURlbGV0ZUFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9ma0FjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZvcmVpZ24ga2V5IGFjdGlvbiBmb3IgcmVsYXRpb24ga2V5cy4gRGVmYXVsdHMgdG8gbG9naWNhbCBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXlEZWxldGVBY3Rpb24oaW50IGZrQWN0aW9uKSB7CisgICAgICAgIF9ma0FjdGlvbiA9IGZrQWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZm9yZWlnbiBrZXkgYWN0aW9uIG5hbWUgZm9yIHJlbGF0aW9uIGtleXMuIFVzZWQgaW4gYXV0bworICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleURlbGV0ZUFjdGlvbihTdHJpbmcgZmtBY3Rpb24pIHsKKyAgICAgICAgX2ZrQWN0aW9uID0gRm9yZWlnbktleS5nZXRBY3Rpb24oZmtBY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW5kZXggbG9naWNhbCBmb3JlaWduIGtleXMgYnkgZGVmYXVsdC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmRleExvZ2ljYWxGb3JlaWduS2V5cygpIHsKKyAgICAgICAgcmV0dXJuIF9pbmRleEZLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW5kZXggbG9naWNhbCBmb3JlaWduIGtleXMgYnkgZGVmYXVsdC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleExvZ2ljYWxGb3JlaWduS2V5cyhib29sZWFuIGluZGV4RkspIHsKKyAgICAgICAgX2luZGV4RksgPSBpbmRleEZLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW5kZXggZGlzY3JpbWluYXRvciBjb2x1bW5zIGJ5IGRlZmF1bHQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5kZXhEaXNjcmltaW5hdG9yKCkgeworICAgICAgICByZXR1cm4gX2luZGV4RGlzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGluZGV4IGRpc2NyaW1pbmF0b3IgY29sdW1ucyBieSBkZWZhdWx0LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4RGlzY3JpbWluYXRvcihib29sZWFuIGluZGV4RGlzYykgeworICAgICAgICBfaW5kZXhEaXNjID0gaW5kZXhEaXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW5kZXggdmVyc2lvbiBjb2x1bW5zIGJ5IGRlZmF1bHQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5kZXhWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gX2luZGV4VmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGluZGV4IHZlcnNpb24gY29sdW1ucyBieSBkZWZhdWx0LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VmVyc2lvbihib29sZWFuIGluZGV4VmVycykgeworICAgICAgICBfaW5kZXhWZXJzID0gaW5kZXhWZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gb3JkZXIgbGlzdHMgYW5kIGFycmF5cyB1c2luZyBhIGRlZGljYXRlZCBvcmRlcmluZyBjb2x1bW4KKyAgICAgKiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9yZGVyTGlzdHMoKSB7CisgICAgICAgIHJldHVybiBfb3JkZXJMaXN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIG9yZGVyIGxpc3RzIGFuZCBhcnJheXMgdXNpbmcgYSBkZWRpY2F0ZWQgb3JkZXJpbmcgY29sdW1uCisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckxpc3RzKGJvb2xlYW4gb3JkZXJMaXN0cykgeworICAgICAgICBfb3JkZXJMaXN0cyA9IG9yZGVyTGlzdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhZGQgYSBzeW50aGV0aWMgbnVsbCBpbmRpY2F0b3IgY29sdW1uIHRvIGVtYmVkZGVkIG1hcHBpbmdzCisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBZGROdWxsSW5kaWNhdG9yKCkgeworICAgICAgICByZXR1cm4gX2FkZE51bGxJbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhZGQgYSBzeW50aGV0aWMgbnVsbCBpbmRpY2F0b3IgY29sdW1uIHRvIGVtYmVkZGVkIG1hcHBpbmdzCisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGROdWxsSW5kaWNhdG9yKGJvb2xlYW4gYWRkTnVsbEluZCkgeworICAgICAgICBfYWRkTnVsbEluZCA9IGFkZE51bGxJbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBkZWZlciBjb25zdHJhaW50cyBieSBkZWZhdWx0LiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZlckNvbnN0cmFpbnRzKCkgeworICAgICAgICByZXR1cm4gX2RlZmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZGVmZXIgY29uc3RyYWludHMgYnkgZGVmYXVsdC4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmZXJDb25zdHJhaW50cyhib29sZWFuIGRlZmVyKSB7CisgICAgICAgIF9kZWZlciA9IGRlZmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgYmFzZSBuYW1lIGZvciBkYXRhc3RvcmUgaWRlbnRpdHkgY29sdW1ucywgb3IgbnVsbCB0byB0aGUKKyAgICAgKiBtYXBwaW5nJ3MgYnVpbHQtaW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFTdG9yZUlkQ29sdW1uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9kc0lkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGJhc2UgbmFtZSBmb3IgZGF0YXN0b3JlIGlkZW50aXR5IGNvbHVtbnMsIG9yIG51bGwgdG8gdGhlCisgICAgICogbWFwcGluZydzIGJ1aWx0LWluIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVN0b3JlSWRDb2x1bW5OYW1lKFN0cmluZyBkc0lkTmFtZSkgeworICAgICAgICBfZHNJZE5hbWUgPSBkc0lkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGJhc2UgbmFtZSBmb3IgdmVyc2lvbiBpZGVudGl0eSBjb2x1bW5zLCBvciBudWxsIHRvIHRoZSBtYXBwaW5nJ3MKKyAgICAgKiBidWlsdC1pbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkNvbHVtbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBfdmVyc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBiYXNlIG5hbWUgZm9yIHZlcnNpb24gaWRlbnRpdHkgY29sdW1ucywgb3IgbnVsbCB0byB0aGUgbWFwcGluZydzCisgICAgICogYnVpbHQtaW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uQ29sdW1uTmFtZShTdHJpbmcgdmVyc05hbWUpIHsKKyAgICAgICAgX3ZlcnNOYW1lID0gdmVyc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBiYXNlIG5hbWUgZm9yIGRpc2NyaW1pbmF0b3IgY29sdW1ucywgb3IgbnVsbCB0byB0aGUgbWFwcGluZydzCisgICAgICogYnVpbHQtaW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lKCkgeworICAgICAgICByZXR1cm4gX2Rpc2NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgYmFzZSBuYW1lIGZvciBkaXNjcmltaW5hdG9yIGNvbHVtbnMsIG9yIG51bGwgdG8gdGhlIG1hcHBpbmcncworICAgICAqIGJ1aWx0LWluIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvckNvbHVtbk5hbWUoU3RyaW5nIGRpc2NOYW1lKSB7CisgICAgICAgIF9kaXNjTmFtZSA9IGRpc2NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgYmFzZSBuYW1lIGZvciBvcmRlciBjb2x1bW5zLCBvciBudWxsIHRvIHRoZSBtYXBwaW5nJ3MKKyAgICAgKiBidWlsdC1pbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJDb2x1bW5OYW1lKCkgeworICAgICAgICByZXR1cm4gX29yZGVyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGJhc2UgbmFtZSBmb3Igb3JkZXIgY29sdW1ucywgb3IgbnVsbCB0byB0aGUgbWFwcGluZydzCisgICAgICogYnVpbHQtaW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbk5hbWUoU3RyaW5nIG9yZGVyTmFtZSkgeworICAgICAgICBfb3JkZXJOYW1lID0gb3JkZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgYmFzZSBuYW1lIGZvciBudWxsIGluZGljYXRvciBjb2x1bW5zLCBvciBudWxsIHRvIHRoZSBtYXBwaW5nJ3MKKyAgICAgKiBidWlsdC1pbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TnVsbEluZGljYXRvckNvbHVtbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBfbnVsbEluZE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBiYXNlIG5hbWUgZm9yIG51bGwgaW5kaWNhdG9yIGNvbHVtbnMsIG9yIG51bGwgdG8gdGhlIG1hcHBpbmcncworICAgICAqIGJ1aWx0LWluIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVsbEluZGljYXRvckNvbHVtbk5hbWUoU3RyaW5nIG51bGxJbmROYW1lKSB7CisgICAgICAgIF9udWxsSW5kTmFtZSA9IG51bGxJbmROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlZmF1bHRNaXNzaW5nSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIF9kZWZNaXNzaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRNaXNzaW5nSW5mbyhib29sZWFuIGRlZk1pc3NpbmcpIHsKKyAgICAgICAgX2RlZk1pc3NpbmcgPSBkZWZNaXNzaW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHVzZUNsYXNzQ3JpdGVyaWEoKSB7CisgICAgICAgIHJldHVybiBfY2xhc3NDcml0ZXJpYTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VDbGFzc0NyaXRlcmlhKGJvb2xlYW4gY2xhc3NDcml0ZXJpYSkgeworICAgICAgICBfY2xhc3NDcml0ZXJpYSA9IGNsYXNzQ3JpdGVyaWE7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTdHJhdGVneShDbGFzc01hcHBpbmcgY2xzLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChhZGFwdCB8fCBkZWZhdWx0TWlzc2luZ0luZm8oKSkKKyAgICAgICAgICAgIHJldHVybiAoY2xzLmdldE1hcHBlZFBDU3VwZXJjbGFzc01hcHBpbmcoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gX2Jhc2VDbGFzc1N0cmF0ZWd5IDogX3N1YmNsYXNzU3RyYXRlZ3k7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RyYXRlZ3koVmVyc2lvbiB2ZXJzLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSB2ZXJzLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoKGFkYXB0IHx8IGRlZmF1bHRNaXNzaW5nSW5mbygpKQorICAgICAgICAgICAgJiYgY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpID09IG51bGwKKyAgICAgICAgICAgICYmIGNscy5nZXRWZXJzaW9uRmllbGQoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF92ZXJzaW9uU3RyYXRlZ3k7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RyYXRlZ3koRGlzY3JpbWluYXRvciBkaXNjLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBkaXNjLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoKGFkYXB0IHx8IGRlZmF1bHRNaXNzaW5nSW5mbygpKQorICAgICAgICAgICAgJiYgY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpID09IG51bGwKKyAgICAgICAgICAgICYmIGRpc2MuZ2V0TWFwcGluZ0luZm8oKS5nZXRWYWx1ZSgpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2Rpc2NTdHJhdGVneTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTdHJhdGVneShWYWx1ZU1hcHBpbmcgdm0sIENsYXNzIHR5cGUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgT2JqZWN0IHJldCA9IF9maWVsZE1hcC5nZXQodHlwZS5nZXROYW1lKCkpOworICAgICAgICBpZiAocmV0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoX3N0cmluZ2lmeVVubWFwcGVkICYmIHZtLmdldFR5cGVNYXBwaW5nKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgIXZtLmdldFR5cGVNYXBwaW5nKCkuaXNNYXBwZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBVbnR5cGVkUENWYWx1ZUhhbmRsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKF9vcmRpbmFsRW51bSAmJiAhdm0uaXNTZXJpYWxpemVkKCkKKyAgICAgICAgICAgICYmIEphdmFWZXJzaW9ucy5pc0VudW1lcmF0aW9uKHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5FbnVtVmFsdWVIYW5kbGVyIgorICAgICAgICAgICAgICAgICsgIihTdG9yZU9yZGluYWw9dHJ1ZSkiOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldERpc2NyaW1pbmF0b3JWYWx1ZShEaXNjcmltaW5hdG9yIGRpc2MsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKCFhZGFwdCAmJiAhZGVmYXVsdE1pc3NpbmdJbmZvKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBXQVJOSU5HOiBDSEFOR0lORyBUSElTIFdJTEwgSU5WQUxJREFURSBFWElTVElORyBEQVRBIElGIERFRkFVTFRJTkcKKyAgICAgICAgLy8gTUlTU0lORyBNQVBQSU5HIElORk8KKyAgICAgICAgcmV0dXJuIFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXREZXNjcmliZWRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKENsYXNzTWFwcGluZyBjbHMsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShjbHMuZ2V0RGVzY3JpYmVkVHlwZSgpKS4KKyAgICAgICAgICAgIHJlcGxhY2UoJyQnLCAnXycpOworICAgICAgICBpZiAoIV9kZWZNaXNzaW5nKQorICAgICAgICAgICAgbmFtZSA9IGRpY3QuZ2V0VmFsaWRUYWJsZU5hbWUobmFtZSwgc2NoZW1hKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoRmllbGRNYXBwaW5nIGZtLCBTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZm0uZ2V0TmFtZSgpOworICAgICAgICBUYWJsZSB0YWJsZSA9IGZtLmdldERlZmluaW5nTWFwcGluZygpLmdldFRhYmxlKCk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gdGFibGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKHRhYmxlTmFtZS5sZW5ndGgoKSA+IDUpCisgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lLnN1YnN0cmluZygwLCA1KTsKKyAgICAgICAgICAgIG5hbWUgPSB0YWJsZU5hbWUgKyAiXyIgKyBuYW1lOworICAgICAgICB9CisgICAgICAgIGlmICghX2RlZk1pc3NpbmcpCisgICAgICAgICAgICBuYW1lID0gZGljdC5nZXRWYWxpZFRhYmxlTmFtZShuYW1lLCBzY2hlbWEpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZURhdGFTdG9yZUlkQ29sdW1ucyhDbGFzc01hcHBpbmcgY2xzLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfZHNJZE5hbWUgIT0gbnVsbCAmJiBjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0TmFtZShfZHNJZE5hbWUpOworICAgICAgICAgICAgZWxzZSBpZiAoX2RzSWROYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXROYW1lKF9kc0lkTmFtZSArIGkpOworICAgICAgICAgICAgY29ycmVjdE5hbWUodGFibGUsIGNvbHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ycmVjdCB0aGUgZ2l2ZW4gY29sdW1uJ3MgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3JyZWN0TmFtZShUYWJsZSB0YWJsZSwgQ29sdW1uIGNvbCkgeworICAgICAgICBpZiAoIV9kZWZNaXNzaW5nKQorICAgICAgICAgICAgY29sLnNldE5hbWUoZGljdC5nZXRWYWxpZENvbHVtbk5hbWUoY29sLmdldE5hbWUoKSwgdGFibGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbHVtbnMoVmVyc2lvbiB2ZXJzLCBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfdmVyc05hbWUgIT0gbnVsbCAmJiBjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0TmFtZShfdmVyc05hbWUpOworICAgICAgICAgICAgZWxzZSBpZiAoX3ZlcnNOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb2xzW2ldLnNldE5hbWUoX3ZlcnNOYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0TmFtZShfdmVyc05hbWUgKyAiXyIgKyBpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX3ZlcnNOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXROYW1lKF92ZXJzTmFtZSArIGkpOworICAgICAgICAgICAgY29ycmVjdE5hbWUodGFibGUsIGNvbHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVDb2x1bW5zKERpc2NyaW1pbmF0b3IgZGlzYywgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX2Rpc2NOYW1lICE9IG51bGwgJiYgY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldE5hbWUoX2Rpc2NOYW1lKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF9kaXNjTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0TmFtZShfZGlzY05hbWUgKyBpKTsKKyAgICAgICAgICAgIGNvcnJlY3ROYW1lKHRhYmxlLCBjb2xzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlSm9pbkNvbHVtbihDbGFzc01hcHBpbmcgY20sIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBpbnQgcG9zLCBpbnQgY29scykgeworICAgICAgICBjb3JyZWN0TmFtZShsb2NhbCwgY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUpvaW5Db2x1bW4oRmllbGRNYXBwaW5nIGZtLCBUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwKKyAgICAgICAgQ29sdW1uIGNvbCwgT2JqZWN0IHRhcmdldCwgaW50IHBvcywgaW50IGNvbHMpIHsKKyAgICAgICAgY29ycmVjdE5hbWUobG9jYWwsIGNvbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVGb3JlaWduS2V5Q29sdW1uKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsCisgICAgICAgIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBib29sZWFuIGludmVyc2UsCisgICAgICAgIGludCBwb3MsIGludCBjb2xzKSB7CisgICAgICAgIGlmIChjb2xzID09IDEpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgY29sLnNldE5hbWUobmFtZSArICJfIiArICgoQ29sdW1uKSB0YXJnZXQpLmdldE5hbWUoKSk7CisgICAgICAgIGNvcnJlY3ROYW1lKGxvY2FsLCBjb2wpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29sdW1ucyhWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb3JyZWN0TmFtZSh0YWJsZSwgY29sc1tpXSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wdWxhdGVPcmRlckNvbHVtbnMoRmllbGRNYXBwaW5nIGZtLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfb3JkZXJOYW1lICE9IG51bGwgJiYgY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldE5hbWUoX29yZGVyTmFtZSk7CisgICAgICAgICAgICBlbHNlIGlmIChfb3JkZXJOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXROYW1lKF9vcmRlck5hbWUgKyBpKTsKKyAgICAgICAgICAgIGNvcnJlY3ROYW1lKHRhYmxlLCBjb2xzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX29yZGVyTGlzdHMgJiYgKEphdmFUeXBlcy5BUlJBWSA9PSBmbS5nZXRUeXBlQ29kZSgpCisgICAgICAgICAgICB8fCBMaXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZm0uZ2V0VHlwZSgpKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wdWxhdGVOdWxsSW5kaWNhdG9yQ29sdW1ucyhWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLAorICAgICAgICBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfbnVsbEluZE5hbWUgIT0gbnVsbCAmJiBjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0TmFtZShfbnVsbEluZE5hbWUpOworICAgICAgICAgICAgZWxzZSBpZiAoX251bGxJbmROYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXROYW1lKF9udWxsSW5kTmFtZSArIGkpOworICAgICAgICAgICAgY29ycmVjdE5hbWUodGFibGUsIGNvbHNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfYWRkTnVsbEluZDsKKyAgICB9CisKKyAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleShDbGFzc01hcHBpbmcgY2xzLCBUYWJsZSBsb2NhbCwKKyAgICAgICAgVGFibGUgZm9yZWlnbikgeworICAgICAgICBpZiAoX2pvaW5GS0FjdGlvbiA9PSBGb3JlaWduS2V5LkFDVElPTl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBuZXcgRm9yZWlnbktleSgpOworICAgICAgICBmay5zZXREZWxldGVBY3Rpb24oX2pvaW5GS0FjdGlvbik7CisgICAgICAgIGZrLnNldERlZmVycmVkKF9kZWZlcik7CisgICAgICAgIHJldHVybiBmazsKKyAgICB9CisKKyAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleShGaWVsZE1hcHBpbmcgZm0sIFRhYmxlIGxvY2FsLAorICAgICAgICBUYWJsZSBmb3JlaWduKSB7CisgICAgICAgIGlmIChfam9pbkZLQWN0aW9uID09IEZvcmVpZ25LZXkuQUNUSU9OX05PTkUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgRm9yZWlnbktleSBmayA9IG5ldyBGb3JlaWduS2V5KCk7CisgICAgICAgIGZrLnNldERlbGV0ZUFjdGlvbihfam9pbkZLQWN0aW9uKTsKKyAgICAgICAgZmsuc2V0RGVmZXJyZWQoX2RlZmVyKTsKKyAgICAgICAgcmV0dXJuIGZrOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgVGFibGUgbG9jYWwsCisgICAgICAgIFRhYmxlIGZvcmVpZ24sIGJvb2xlYW4gaW52ZXJzZSkgeworICAgICAgICBpZiAoX2ZrQWN0aW9uID09IEZvcmVpZ25LZXkuQUNUSU9OX05PTkUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgRm9yZWlnbktleSBmayA9IG5ldyBGb3JlaWduS2V5KCk7CisgICAgICAgIGZrLnNldERlbGV0ZUFjdGlvbihfZmtBY3Rpb24pOworICAgICAgICBmay5zZXREZWZlcnJlZChfZGVmZXIpOworICAgICAgICByZXR1cm4gZms7CisgICAgfQorCisgICAgcHVibGljIEluZGV4IGdldEpvaW5JbmRleChGaWVsZE1hcHBpbmcgZm0sIFRhYmxlIHRhYmxlLCBDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIGlmICghX2luZGV4RksgfHwgZm0uZ2V0Sm9pbkZvcmVpZ25LZXkoKSA9PSBudWxsCisgICAgICAgICAgICB8fCAhZm0uZ2V0Sm9pbkZvcmVpZ25LZXkoKS5pc0xvZ2ljYWwoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoYXJlQWxsUHJpbWFyeUtleUNvbHVtbnMoY29scykpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBJbmRleCBpZHggPSBuZXcgSW5kZXgoKTsKKyAgICAgICAgaWR4LnNldE5hbWUoZ2V0SW5kZXhOYW1lKG51bGwsIHRhYmxlLCBjb2xzKSk7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgYWxsIHRoZSBnaXZlbiBjb2x1bW5zIGFyZSBwcmltYXJ5IGtleSBjb2x1bW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFyZUFsbFByaW1hcnlLZXlDb2x1bW5zKENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFjb2xzW2ldLmlzUHJpbWFyeUtleSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYW4gaW5kZXggbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGV4TmFtZShTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgLy8gYWx3YXlzIHVzZSBkaWN0IGZvciBpbmRleCBuYW1lcyBiZWNhdXNlIG5vIHNwZWMgbWFuZGF0ZXMgdGhlbQorICAgICAgICAvLyBiYXNlZCBvbiBkZWZhdWx0cworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgbmFtZSA9IGNvbHNbMF0uZ2V0TmFtZSgpOworICAgICAgICByZXR1cm4gZGljdC5nZXRWYWxpZEluZGV4TmFtZShuYW1lLCB0YWJsZSk7CisgICAgfQorCisgICAgcHVibGljIEluZGV4IGdldEluZGV4KFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlLAorICAgICAgICBDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIGlmICghX2luZGV4RksgfHwgdm0uZ2V0Rm9yZWlnbktleSgpID09IG51bGwKKyAgICAgICAgICAgIHx8ICF2bS5nZXRGb3JlaWduS2V5KCkuaXNMb2dpY2FsKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGFyZUFsbFByaW1hcnlLZXlDb2x1bW5zKGNvbHMpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgSW5kZXggaWR4ID0gbmV3IEluZGV4KCk7CisgICAgICAgIGlkeC5zZXROYW1lKGdldEluZGV4TmFtZShuYW1lLCB0YWJsZSwgY29scykpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKworICAgIHB1YmxpYyBJbmRleCBnZXRJbmRleChWZXJzaW9uIHZlcnMsIFRhYmxlIHRhYmxlLCBDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIGlmICghX2luZGV4VmVycykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBJbmRleCBpZHggPSBuZXcgSW5kZXgoKTsKKyAgICAgICAgaWR4LnNldE5hbWUoZ2V0SW5kZXhOYW1lKF92ZXJzTmFtZSwgdGFibGUsIGNvbHMpKTsKKyAgICAgICAgcmV0dXJuIGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoRGlzY3JpbWluYXRvciBkaXNjLCBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scykgeworICAgICAgICBpZiAoIV9pbmRleERpc2MpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgSW5kZXggaWR4ID0gbmV3IEluZGV4KCk7CisgICAgICAgIGlkeC5zZXROYW1lKGdldEluZGV4TmFtZShfZGlzY05hbWUsIHRhYmxlLCBjb2xzKSk7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgfQorCisgICAgcHVibGljIFVuaXF1ZSBnZXRKb2luVW5pcXVlKEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFVuaXF1ZSBnZXRVbmlxdWUoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5TmFtZShDbGFzc01hcHBpbmcgY20sIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxQcmltYXJ5S2V5KEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUpIHsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uZmlndXJhYmxlIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgZGljdCA9ICgoSkRCQ0NvbmZpZ3VyYXRpb24pIGNvbmYpLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRDb25maWd1cmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdJbmZvLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTWFwcGluZ0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ2OGZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdJbmZvLmphdmEKQEAgLTAsMCArMSwxNzcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogQmFzZSBjbGFzcyBzdG9yaW5nIHJhdyBtYXBwaW5nIGluZm9ybWF0aW9uOyBkZWZpbmVzIHV0aWxpdHkgbWV0aG9kcyBmb3IKKyAqIGNvbnZlcnRpbmcgcmF3IG1hcHBpbmcgaW5mb3JtYXRpb24gdG8gZnVsbCBtYXBwaW5nIHRvIHRoZSBzY2hlbWEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1hcHBpbmdJbmZvCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTl9OT05FID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKT0lOX0ZPUldBUkQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpPSU5fSU5WRVJTRSA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTCA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE1hcHBpbmdJbmZvLmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RyaW5nIF9zdHJhdGVneSA9IG51bGw7CisgICAgcHJpdmF0ZSBMaXN0IF9jb2xzID0gbnVsbDsKKyAgICBwcml2YXRlIEluZGV4IF9pZHggPSBudWxsOworICAgIHByaXZhdGUgVW5pcXVlIF91bnEgPSBudWxsOworICAgIHByaXZhdGUgRm9yZWlnbktleSBfZmsgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2FuSWR4ID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2NhblVucSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9jYW5GSyA9IHRydWU7CisgICAgcHJpdmF0ZSBpbnQgX2pvaW4gPSBKT0lOX05PTkU7CisgICAgcHJpdmF0ZSBDb2x1bW5JTyBfaW8gPSBudWxsOworCisgICAgLyoqCisgICAgICogTWFwcGluZyBzdHJhdGVneSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBfc3RyYXRlZ3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwcGluZyBzdHJhdGVneSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KFN0cmluZyBzdHJhdGVneSkgeworICAgICAgICBfc3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSYXcgY29sdW1uIGRhdGEuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgcmV0dXJuIChfY29scyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBfY29sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSYXcgY29sdW1uIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1ucyhMaXN0IGNvbHMpIHsKKyAgICAgICAgX2NvbHMgPSBjb2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJhdyBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfaWR4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJhdyBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleChJbmRleCBpZHgpIHsKKyAgICAgICAgX2lkeCA9IGlkeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBjYW4gbWFyayBjb2x1bW5zIGFzIGV4cGxpY2l0bHkgbm9uLWluZGV4YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5JbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9jYW5JZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHVzZXIgY2FuIG1hcmsgY29sdW1ucyBhcyBleHBsaWNpdGx5IG5vbi1pbmRleGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuSW5kZXgoYm9vbGVhbiBpbmRleGFibGUpIHsKKyAgICAgICAgX2NhbklkeCA9IGluZGV4YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSYXcgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIF9mazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSYXcgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIF9mayA9IGZrOworICAgICAgICBpZiAoZmsgIT0gbnVsbCAmJiBfam9pbiA9PSBKT0lOX05PTkUpCisgICAgICAgICAgICBfam9pbiA9IEpPSU5fRk9SV0FSRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBjYW4gbWFyayBjb2x1bW5zIGFzIGV4cGxpY2l0bHkgbm90IGhhdmluZyBhIGZvcmVpZ24ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbkZvcmVpZ25LZXkoKSB7CisgICAgICAgIHJldHVybiBfY2FuRks7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHVzZXIgY2FuIG1hcmsgY29sdW1ucyBhcyBleHBsaWNpdGx5IG5vdCBoYXZpbmcgYSBmb3JlaWduIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5Gb3JlaWduS2V5KGJvb2xlYW4gZmthYmxlKSB7CisgICAgICAgIF9jYW5GSyA9IGZrYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSYXcgdW5pcXVlIGNvbnN0cmFpbnQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSBnZXRVbmlxdWUoKSB7CisgICAgICAgIHJldHVybiBfdW5xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJhdyB1bmlxdWUgY29uc3RyYWludCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWUoVW5pcXVlIHVucSkgeworICAgICAgICBfdW5xID0gdW5xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB1c2VyIGNhbiBtYXJrIGNvbHVtbnMgYXMgZXhwbGljaXRseSBub3QgaGF2aW5nIGEgdW5pcXVlIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuVW5pcXVlKCkgeworICAgICAgICByZXR1cm4gX2NhblVucTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBjYW4gbWFyayBjb2x1bW5zIGFzIGV4cGxpY2l0bHkgbm90IGhhdmluZyBhIHVuaXF1ZSBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhblVuaXF1ZShib29sZWFuIHVuaXF1YWJsZSkgeworICAgICAgICBfY2FuVW5xID0gdW5pcXVhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEkvTyBmb3IgdGhlIGNvbHVtbnMgY3JlYXRlZCBieSB0aGUgbGFzdCBjYWxsIHRvIHtAbGluayAjY3JlYXRlQ29sdW1uc30sCisgICAgICogb3IgZm9yIHRoZSBmb3JlaWduIGtleSBjcmVhdGVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgI2NyZWF0ZUZvcmVpZ25LZXl9LiBUaGlzIGlzIGFsc28gZXhwZWN0ZWQgdG8gYmUgc2V0IGNvcnJlY3RseQorICAgICAqIHByaW9yIHRvIGNhbGxzIHRvIHtAbGluayAjc3luY0NvbHVtbnN9IGFuZCB7QGxpbmsgI3N5bmNGb3JlaWduS2V5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uSU8gZ2V0Q29sdW1uSU8oKSB7CisgICAgICAgIHJldHVybiBfaW87CisgICAgfQorCisgICAgLyoqCisgICAgICogSS9PIGZvciB0aGUgY29sdW1ucyBjcmVhdGVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8ge0BsaW5rICNjcmVhdGVDb2x1bW5zfSwKKyAgICAgKiBvciBmb3IgdGhlIGZvcmVpZ24ga2V5IGNyZWF0ZWQgYnkgdGhlIGxhc3QgY2FsbCB0bworICAgICAqIHtAbGluayAjY3JlYXRlRm9yZWlnbktleX0uIFRoaXMgaXMgYWxzbyBleHBlY3RlZCB0byBiZSBzZXQgY29ycmVjdGx5CisgICAgICogcHJpb3IgdG8gY2FsbHMgdG8ge0BsaW5rICNzeW5jQ29sdW1uc30gYW5kIHtAbGluayAjc3luY0ZvcmVpZ25LZXl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbklPKENvbHVtbklPIGlvKSB7CisgICAgICAgIF9pbyA9IGlvOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBvZiB0aGUgam9pbiB0aGF0IHRoZSBjb2x1bW5zIG9mIHRoaXMgbWFwcGluZyBpbmZvIGZvcm0uIFRoaXMKKyAgICAgKiBpcyB1c3VhbGx5IGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHtAbGluayAjY3JlYXRlRm9yZWlnbktleX0uIFRoaXMgZmxhZworICAgICAqIGlzIGFsc28gZXhwZWN0ZWQgdG8gYmUgc2V0IGNvcnJlY3RseSBwcmlvciB0byBjYWxscyB0bworICAgICAqIHtAbGluayAjc3luY0ZvcmVpZ25LZXl9IGlmIHRoZSBqb2luIGlzIGludmVyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Sm9pbkRpcmVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9qb2luOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBvZiB0aGUgam9pbiB0aGF0IHRoZSBjb2x1bW5zIG9mIHRoaXMgbWFwcGluZyBpbmZvIGZvcm0uIFRoaXMKKyAgICAgKiBpcyB1c3VhbGx5IGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHtAbGluayAjY3JlYXRlRm9yZWlnbktleX0uIFRoaXMgZmxhZworICAgICAqIGlzIGFsc28gZXhwZWN0ZWQgdG8gYmUgc2V0IGNvcnJlY3RseSBwcmlvciB0byBjYWxscyB0bworICAgICAqIHtAbGluayAjc3luY0ZvcmVpZ25LZXl9IGlmIHRoZSBqb2luIGlzIGludmVyc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5EaXJlY3Rpb24oaW50IGpvaW4pIHsKKyAgICAgICAgX2pvaW4gPSBqb2luOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFsbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBjbGVhcih0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbkZsYWdzIHdoZXRoZXIgdG8gY2xlYXIgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB3ZQorICAgICAqIGNhbiBwbGFjZSBpbmRleGVkLCBmb3JlaWduIGtleXMsIGV0YyBvbiB0aGlzIG1hcHBpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhcihib29sZWFuIGNhbkZsYWdzKSB7CisgICAgICAgIF9zdHJhdGVneSA9IG51bGw7CisgICAgICAgIF9jb2xzID0gbnVsbDsKKyAgICAgICAgX2lvID0gbnVsbDsKKyAgICAgICAgX2lkeCA9IG51bGw7CisgICAgICAgIF91bnEgPSBudWxsOworICAgICAgICBfZmsgPSBudWxsOworICAgICAgICBfam9pbiA9IEpPSU5fTk9ORTsKKyAgICAgICAgaWYgKGNhbkZsYWdzKSB7CisgICAgICAgICAgICBfY2FuSWR4ID0gdHJ1ZTsKKyAgICAgICAgICAgIF9jYW5GSyA9IHRydWU7CisgICAgICAgICAgICBfY2FuVW5xID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgbWlzc2luZyBpbmZvIGZyb20gdGhlIGluc3RhbmNlIHRvIHRoaXMgb25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHkoTWFwcGluZ0luZm8gaW5mbykgeworICAgICAgICBpZiAoX3N0cmF0ZWd5ID09IG51bGwpCisgICAgICAgICAgICBfc3RyYXRlZ3kgPSBpbmZvLmdldFN0cmF0ZWd5KCk7CisgICAgICAgIGlmIChfY2FuSWR4ICYmIF9pZHggPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGluZm8uZ2V0SW5kZXgoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9pZHggPSBpbmZvLmdldEluZGV4KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2NhbklkeCA9IGluZm8uY2FuSW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX2NhblVucSAmJiBfdW5xID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpbmZvLmdldFVuaXF1ZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3VucSA9IGluZm8uZ2V0VW5pcXVlKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2NhblVucSA9IGluZm8uY2FuVW5pcXVlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9jYW5GSyAmJiBfZmsgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGluZm8uZ2V0Rm9yZWlnbktleSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2ZrID0gaW5mby5nZXRGb3JlaWduS2V5KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2NhbkZLID0gaW5mby5jYW5Gb3JlaWduS2V5KCk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0IGNvbHMgPSBnZXRDb2x1bW5zKCk7CisgICAgICAgIExpc3QgaWNvbHMgPSBpbmZvLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKCFpY29scy5pc0VtcHR5KCkgJiYgKGNvbHMuaXNFbXB0eSgpCisgICAgICAgICAgICB8fCBjb2xzLnNpemUoKSA9PSBpY29scy5zaXplKCkpKSB7CisgICAgICAgICAgICBpZiAoY29scy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29scyA9IG5ldyBBcnJheUxpc3QoaWNvbHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWNvbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY29scy5zaXplKCkgPT0gaSkKKyAgICAgICAgICAgICAgICAgICAgY29scy5hZGQobmV3IENvbHVtbigpKTsKKyAgICAgICAgICAgICAgICAoKENvbHVtbikgY29scy5nZXQoaSkpLmNvcHkoKENvbHVtbikgaWNvbHMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldENvbHVtbnMoY29scyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluZm8gaGFzIGNvbHVtbnMsIGZvcmVpZ24ga2V5IGluZm9ybWF0aW9uLCBpbmRleAorICAgICAqIGluZm9ybWF0aW9uLCBldGMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU2NoZW1hQ29tcG9uZW50cygpIHsKKyAgICAgICAgcmV0dXJuIChfY29scyAhPSBudWxsICYmICFfY29scy5pc0VtcHR5KCkpCisgICAgICAgICAgICB8fCBfaWR4ICE9IG51bGwKKyAgICAgICAgICAgIHx8IF91bnEgIT0gbnVsbAorICAgICAgICAgICAgfHwgX2ZrICE9IG51bGwKKyAgICAgICAgICAgIHx8ICFfY2FuSWR4CisgICAgICAgICAgICB8fCAhX2NhbkZLCisgICAgICAgICAgICB8fCAhX2NhblVucTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgdXNlciBkaWQgbm90IHN1cHBseSBhbnkgY29sdW1ucywgaW5kZXgsIHVuaXF1ZQorICAgICAqIGNvbnN0cmFpbnQsIG9yIGZvcmVpZ24ga2V5IGZvciB0aGlzIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzKE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGRpZSkgeworICAgICAgICBpZiAoX2NvbHMgPT0gbnVsbCB8fCBfY29scy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydE5vSW5kZXgoY29udGV4dCwgZGllKTsKKyAgICAgICAgICAgIGFzc2VydE5vVW5pcXVlKGNvbnRleHQsIGRpZSk7CisgICAgICAgICAgICBhc3NlcnROb0ZvcmVpZ25LZXkoY29udGV4dCwgZGllKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2UgbXNnID0gX2xvYy5nZXQoInVuZXhwZWN0ZWQtY29scyIsIGNvbnRleHQpOworICAgICAgICBpZiAoZGllKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpLmdldExvZygpLndhcm4obXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGlzIGluZm8gaGFzIHRoZSBnaXZlbiBzdHJhdGVneSBvciBubyBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRTdHJhdGVneShNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgT2JqZWN0IGNvbnRleHRTdHJhdCwKKyAgICAgICAgT2JqZWN0IGV4cGVjdGVkLCBib29sZWFuIGRpZSkgeworICAgICAgICBpZiAoY29udGV4dFN0cmF0ID09IGV4cGVjdGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZyBzdHJhdDsKKyAgICAgICAgaWYgKGNvbnRleHRTdHJhdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX3N0cmF0ZWd5ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKF9zdHJhdGVneS5lcXVhbHMoZXhwZWN0ZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIFN0cmF0ZWd5CisgICAgICAgICAgICAgICAgJiYgX3N0cmF0ZWd5LmVxdWFscygoKFN0cmF0ZWd5KSBleHBlY3RlZCkuZ2V0QWxpYXMoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgc3RyYXQgPSBfc3RyYXRlZ3k7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFN0cmF0IGluc3RhbmNlb2YgU3RyYXRlZ3kpCisgICAgICAgICAgICBzdHJhdCA9ICgoU3RyYXRlZ3kpIGNvbnRleHRTdHJhdCkuZ2V0QWxpYXMoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyYXQgPSBjb250ZXh0U3RyYXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBfbG9jLmdldCgidW5leHBlY3RlZC1zdHJhdGVneSIsIGNvbnRleHQsIGV4cGVjdGVkLAorICAgICAgICAgICAgc3RyYXQpOworICAgICAgICBpZiAoZGllKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpLmdldExvZygpLndhcm4obXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgdXNlciBkaWQgbm90IHRyeSB0byBwbGFjZSBhbiBpbmRleCBvbiB0aGlzIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm9JbmRleChNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBkaWUpIHsKKyAgICAgICAgaWYgKF9pZHggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBNZXNzYWdlIG1zZyA9IF9sb2MuZ2V0KCJ1bmV4cGVjdGVkLWluZGV4IiwgY29udGV4dCk7CisgICAgICAgIGlmIChkaWUpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24obXNnKTsKKyAgICAgICAgY29udGV4dC5nZXRSZXBvc2l0b3J5KCkuZ2V0TG9nKCkud2Fybihtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSB1c2VyIGRpZCBub3QgdHJ5IHRvIHBsYWNlIGEgdW5pcXVlIGNvbnN0cmFpbnQgb24gdGhpcworICAgICAqIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm9VbmlxdWUoTWV0YURhdGFDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZGllKSB7CisgICAgICAgIGlmIChfdW5xID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBfbG9jLmdldCgidW5leHBlY3RlZC11bmlxdWUiLCBjb250ZXh0KTsKKyAgICAgICAgaWYgKGRpZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihtc2cpOworICAgICAgICBjb250ZXh0LmdldFJlcG9zaXRvcnkoKS5nZXRMb2coKS53YXJuKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIHVzZXIgZGlkIG5vdCB0cnkgdG8gcGxhY2UgYSBmb3JlaWduIGtleSBvbiB0aGlzIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm9Gb3JlaWduS2V5KE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGRpZSkgeworICAgICAgICBpZiAoX2ZrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBfbG9jLmdldCgidW5leHBlY3RlZC1mayIsIGNvbnRleHQpOworICAgICAgICBpZiAoZGllKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpLmdldExvZygpLndhcm4obXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgdXNlciBkaWQgbm90IHRyeSB0byBqb2luLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vSm9pbihNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBkaWUpIHsKKyAgICAgICAgYm9vbGVhbiBqb2luID0gZmFsc2U7CisgICAgICAgIGlmIChfY29scyAhPSBudWxsKSB7CisgICAgICAgICAgICBDb2x1bW4gY29sOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFqb2luICYmIGkgPCBfY29scy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbCA9IChDb2x1bW4pIF9jb2xzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sLmdldFRhcmdldCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGpvaW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgham9pbikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBNZXNzYWdlIG1zZyA9IF9sb2MuZ2V0KCJ1bmV4cGVjdGVkLWpvaW4iLCBjb250ZXh0KTsKKyAgICAgICAgaWYgKGRpZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihtc2cpOworICAgICAgICBjb250ZXh0LmdldFJlcG9zaXRvcnkoKS5nZXRMb2coKS53YXJuKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBvciBnZW5lcmF0ZSBhIHRhYmxlIGZvciBhIG1hcHBpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgbWFwcGluZyB0aGF0IHVzZXMgdGhlIHRhYmxlCisgICAgICogQHBhcmFtIGRlZiBkZWZhdWx0IHRhYmxlIG5hbWUgcHJvdmlkZXIKKyAgICAgKiBAcGFyYW0gc2NoZW1hTmFtZSBkZWZhdWx0IHNjaGVtYSBpZiBrbm93biwgb3IgbnVsbAorICAgICAqIEBwYXJhbSBnaXZlbiBnaXZlbiB0YWJsZSBuYW1lCisgICAgICogQHBhcmFtIGFkYXB0IHdoZXRoZXIgd2UgY2FuIGFsdGVyIHRoZSBzY2hlbWEgb3IgbWFwcGluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoTWV0YURhdGFDb250ZXh0IGNvbnRleHQsIFRhYmxlRGVmYXVsdHMgZGVmLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIGdpdmVuLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gKE1hcHBpbmdSZXBvc2l0b3J5KSBjb250ZXh0LmdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgaWYgKGdpdmVuID09IG51bGwgJiYgKGRlZiA9PSBudWxsIHx8ICghYWRhcHQKKyAgICAgICAgICAgICYmICFyZXBvcy5nZXRNYXBwaW5nRGVmYXVsdHMoKS5kZWZhdWx0TWlzc2luZ0luZm8oKSkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby10YWJsZSIsIGNvbnRleHQpKTsKKworICAgICAgICBpZiAoc2NoZW1hTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgc2NoZW1hTmFtZSA9IFNjaGVtYXMuZ2V0TmV3VGFibGVTY2hlbWEoKEpEQkNDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgICAgIHJlcG9zLmdldENvbmZpZ3VyYXRpb24oKSk7CisKKyAgICAgICAgLy8gaWYgbm8gZ2l2ZW4gYW5kIGFkYXB0aW5nIG9yIGRlZmF1bHRpbmcgbWlzc2luZyBpbmZvLCB1c2UgdGVtcGxhdGUKKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSByZXBvcy5nZXRTY2hlbWFHcm91cCgpOworICAgICAgICBTY2hlbWEgc2NoZW1hID0gbnVsbDsKKyAgICAgICAgaWYgKGdpdmVuID09IG51bGwpIHsKKyAgICAgICAgICAgIHNjaGVtYSA9IGdyb3VwLmdldFNjaGVtYShzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzY2hlbWEgPSBncm91cC5hZGRTY2hlbWEoc2NoZW1hTmFtZSk7CisgICAgICAgICAgICBnaXZlbiA9IGRlZi5nZXQoc2NoZW1hKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBmdWxsTmFtZTsKKyAgICAgICAgaW50IGRvdElkeCA9IGdpdmVuLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChkb3RJZHggPT0gLTEpCisgICAgICAgICAgICBmdWxsTmFtZSA9IChzY2hlbWFOYW1lID09IG51bGwpID8gZ2l2ZW4gOiBzY2hlbWFOYW1lICsgIi4iICsgZ2l2ZW47CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnVsbE5hbWUgPSBnaXZlbjsKKyAgICAgICAgICAgIHNjaGVtYSA9IG51bGw7CisgICAgICAgICAgICBzY2hlbWFOYW1lID0gZ2l2ZW4uc3Vic3RyaW5nKDAsIGRvdElkeCk7CisgICAgICAgICAgICBnaXZlbiA9IGdpdmVuLnN1YnN0cmluZyhkb3RJZHggKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvb2sgZm9yIG5hbWVkIHRhYmxlIHVzaW5nIGZ1bGwgbmFtZSBhbmQgZmluZFRhYmxlLCB3aGljaCBhbGxvd3MKKyAgICAgICAgLy8gdGhlIGR5bmFtaWMgc2NoZW1hIGZhY3RvcnkgdG8gY3JlYXRlIHRoZSB0YWJsZSBpZiBuZWVkZWQKKyAgICAgICAgVGFibGUgdGFibGUgPSBncm91cC5maW5kVGFibGUoZnVsbE5hbWUpOworICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0YWJsZTsKKyAgICAgICAgaWYgKCFhZGFwdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXRhYmxlIiwgZ2l2ZW4sIGNvbnRleHQpKTsKKworICAgICAgICAvLyBuYW1lZCB0YWJsZSBkb2Vzbid0IGV4aXN0OyBjcmVhdGUgaXQKKyAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKSB7CisgICAgICAgICAgICBzY2hlbWEgPSBncm91cC5nZXRTY2hlbWEoc2NoZW1hTmFtZSk7CisgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICAgICAgc2NoZW1hID0gZ3JvdXAuYWRkU2NoZW1hKHNjaGVtYU5hbWUpOworICAgICAgICB9CisgICAgICAgIHRhYmxlID0gc2NoZW1hLmdldFRhYmxlKGdpdmVuKTsKKyAgICAgICAgaWYgKHRhYmxlID09IG51bGwpCisgICAgICAgICAgICB0YWJsZSA9IHNjaGVtYS5hZGRUYWJsZShnaXZlbik7CisgICAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZS9jcmVhdGUgY29sdW1ucyBvbiB0aGUgZ2l2ZW4gdGFibGUgYnkgbWVyZ2luZyB0aGUgZ2l2ZW4KKyAgICAgKiB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiB3aXRoIGFueSB1c2VyLXByb3ZpZGVkIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIG1hcHBpbmcgd2UncmUgcmV0cmlldmluZyBjb2x1bW5zIGZvcgorICAgICAqIEBwYXJhbSBwcmVmaXggbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Uga2V5IHByZWZpeAorICAgICAqIEBwYXJhbSB0bXBsYXRlcyB0ZW1wbGF0ZSBjb2x1bW5zCisgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSBmb3IgdGhlIGNvbHVtbnMKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB3ZSBjYW4gbW9kaWZ5IHRoZSBleGlzdGluZyBtYXBwaW5nIG9yIHNjaGVtYQorICAgICAqLworICAgIHByb3RlY3RlZCBDb2x1bW5bXSBjcmVhdGVDb2x1bW5zKE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcHJlZml4LAorICAgICAgICBDb2x1bW5bXSB0bXBsYXRlcywgVGFibGUgdGFibGUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgYXNzZXJ0VGFibGUoY29udGV4dCwgdGFibGUpOworICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCisgICAgICAgICAgICBwcmVmaXggPSAiZ2VuZXJpYyI7CisKKyAgICAgICAgLy8gdGhlIHVzZXIgaGFzIHRvIGdpdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBleHBlY3RlZCBjb2x1bW5zIGZvciB0aGlzCisgICAgICAgIC8vIG1hcHBpbmcsIG9yIG5vbmUgYXQgYWxsIGlmIHdlJ3JlIGFkYXB0aW5nLiAgY2FuJ3QganVzdCBnaXZlbiBvbmUgb2YKKyAgICAgICAgLy8gbiBjb2x1bW5zIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBvZiB0aGUgbiBjb2x1bW5zIHRoZSBpbmZvCisgICAgICAgIC8vIGFwcGxpZXMgdG8KKyAgICAgICAgTGlzdCBnaXZlbiA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgYm9vbGVhbiBmaWxsID0gKChNYXBwaW5nUmVwb3NpdG9yeSkgY29udGV4dC5nZXRSZXBvc2l0b3J5KCkpLgorICAgICAgICAgICAgZ2V0TWFwcGluZ0RlZmF1bHRzKCkuZGVmYXVsdE1pc3NpbmdJbmZvKCk7CisgICAgICAgIGlmICgoIWdpdmVuLmlzRW1wdHkoKSB8fCAoIWFkYXB0ICYmICFmaWxsKSkKKyAgICAgICAgICAgICYmIGdpdmVuLnNpemUoKSAhPSB0bXBsYXRlcy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4ICsgIi1udW0tY29scyIsCisgICAgICAgICAgICAgICAgY29udGV4dCwgU3RyaW5nLnZhbHVlT2YodG1wbGF0ZXMubGVuZ3RoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihnaXZlbi5zaXplKCkpKSk7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IG5ldyBDb2x1bW5bdG1wbGF0ZXMubGVuZ3RoXTsKKyAgICAgICAgX2lvID0gbnVsbDsKKyAgICAgICAgQ29sdW1uIGNvbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBsYXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29sID0gKGdpdmVuLmlzRW1wdHkoKSkgPyBudWxsIDogKENvbHVtbikgZ2l2ZW4uZ2V0KGkpOworICAgICAgICAgICAgY29sc1tpXSA9IG1lcmdlQ29sdW1uKGNvbnRleHQsIHByZWZpeCwgdG1wbGF0ZXNbaV0sIHRydWUsIGNvbCwKKyAgICAgICAgICAgICAgICB0YWJsZSwgYWRhcHQsIGZpbGwpOworICAgICAgICAgICAgc2V0SU9Gcm9tQ29sdW1uRmxhZ3MoY29sLCBpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3BlciBpbnRlcm5hbCBjb2x1bW4gSS9PIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY29sdW1uJ3MgZmxhZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldElPRnJvbUNvbHVtbkZsYWdzKENvbHVtbiBjb2wsIGludCBpKSB7CisgICAgICAgIGlmIChjb2wgPT0gbnVsbCB8fCAoIWNvbC5nZXRGbGFnKENvbHVtbi5GTEFHX1VOSU5TRVJUQUJMRSkKKyAgICAgICAgICAgICYmICFjb2wuZ2V0RmxhZyhDb2x1bW4uRkxBR19VTlVQREFUQUJMRSkpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChfaW8gPT0gbnVsbCkKKyAgICAgICAgICAgIF9pbyA9IG5ldyBDb2x1bW5JTygpOworICAgICAgICBfaW8uc2V0SW5zZXJ0YWJsZShpLCAhY29sLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFKSk7CisgICAgICAgIF9pby5zZXRVcGRhdGFibGUoaSwgIWNvbC5nZXRGbGFnKENvbHVtbi5GTEFHX1VOVVBEQVRBQkxFKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHRhYmxlIGlzIG5vbi1udWxsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VGFibGUoTWV0YURhdGFDb250ZXh0IGNvbnRleHQsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIGlmICh0YWJsZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bm1hcHBlZCIsIGNvbnRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgZ2l2ZW4gY29sdW1ucyBpZiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBtYXBwaW5nIHdlJ3JlIHJldHJpZXZpbmcgY29sdW1ucyBmb3IKKyAgICAgKiBAcGFyYW0gcHJlZml4IGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGtleSBwcmVmaXgKKyAgICAgKiBAcGFyYW0gdG1wbGF0ZSB0ZW1wbGF0ZSBmb3IgZXhwZWN0ZWQgY29sdW1uIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtIGNvbXBhdCB3aGV0aGVyIHRoZSBleGlzdGluZyBjb2x1bW4gdHlwZSBtdXN0IGJlIGNvbXBhdGlibGUKKyAgICAgKiB3aXRoIHRoZSB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBjb2x1bW4KKyAgICAgKiBAcGFyYW0gZ2l2ZW4gdGhlIGdpdmVuIGNvbHVtbiBpbmZvcm1hdGlvbiBmcm9tIG1hcHBpbmcgaW5mbworICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgZm9yIHRoZSBjb2x1bW5zCisgICAgICogQHBhcmFtIGFkYXB0IHdoZXRoZXIgd2UgY2FuIG1vZGlmeSB0aGUgZXhpc3RpbmcgbWFwcGluZyBvciBzY2hlbWEKKyAgICAgKiBAcGFyYW0gZmlsbCB3aGV0aGVyIHRvIGRlZmF1bHQgbWlzc2luZyBjb2x1bW4gaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIENvbHVtbiBtZXJnZUNvbHVtbihNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgQ29sdW1uIHRtcGxhdGUsIGJvb2xlYW4gY29tcGF0LCBDb2x1bW4gZ2l2ZW4sIFRhYmxlIHRhYmxlLAorICAgICAgICBib29sZWFuIGFkYXB0LCBib29sZWFuIGZpbGwpIHsKKyAgICAgICAgYXNzZXJ0VGFibGUoY29udGV4dCwgdGFibGUpOworCisgICAgICAgIC8vIGlmIG5vdCBhZGFwdGluZyBtdXN0IHByb3ZpZGUgY29sdW1uIG5hbWUgYXQgYSBtaW5pbXVtCisgICAgICAgIFN0cmluZyBjb2xOYW1lID0gKGdpdmVuID09IG51bGwpID8gbnVsbCA6IGdpdmVuLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKGNvbE5hbWUgPT0gbnVsbCAmJiAhYWRhcHQgJiYgIWZpbGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4ICsgIi1uby1jb2wtbmFtZSIsCisgICAgICAgICAgICAgICAgY29udGV4dCkpOworCisgICAgICAgIC8vIGRldGVybWluZSB0aGUgY29sdW1uIG5hbWUgYmFzZWQgb24gZ2l2ZW4gaW5mbywgb3IgdGVtcGxhdGUgaWYgbm9uZTsKKyAgICAgICAgLy8gYWxzbyBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgdXNlciBnYXZlIGEgY29sdW1uIG5hbWUsIGhlIGRpZG4ndCB0cnkKKyAgICAgICAgLy8gdG8gcHV0IHRoZSBjb2x1bW4gaW4gYW4gdW5leHBlY3RlZCB0YWJsZQorICAgICAgICBpZiAoY29sTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgY29sTmFtZSA9IHRtcGxhdGUuZ2V0TmFtZSgpOworICAgICAgICBpbnQgZG90SWR4ID0gY29sTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAoZG90SWR4ID09IDApCisgICAgICAgICAgICBjb2xOYW1lID0gY29sTmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIGVsc2UgaWYgKGRvdElkeCAhPSAtMSkgeworICAgICAgICAgICAgZmluZFRhYmxlKGNvbnRleHQsIGNvbE5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCksIHRhYmxlLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgY29sTmFtZSA9IGNvbE5hbWUuc3Vic3RyaW5nKGRvdElkeCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluZCBleGlzdGluZyBjb2x1bW4KKyAgICAgICAgQ29sdW1uIGNvbCA9IHRhYmxlLmdldENvbHVtbihjb2xOYW1lKTsKKyAgICAgICAgaWYgKGNvbCA9PSBudWxsICYmICFhZGFwdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldChwcmVmaXggKyAiLWJhZC1jb2wtbmFtZSIsCisgICAgICAgICAgICAgICAgY29udGV4dCwgY29sTmFtZSwgdGFibGUpKTsKKworICAgICAgICBNYXBwaW5nUmVwb3NpdG9yeSByZXBvcyA9IChNYXBwaW5nUmVwb3NpdG9yeSkgY29udGV4dC5nZXRSZXBvc2l0b3J5KCk7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gcmVwb3MuZ2V0REJEaWN0aW9uYXJ5KCk7CisKKyAgICAgICAgLy8gdXNlIGluZm9ybWF0aW9uIGZyb20gdGVtcGxhdGUgY29sdW1uIGJ5IGRlZmF1bHQsIGFsbG93aW5nIGFueQorICAgICAgICAvLyB1c2VyLWdpdmVuIHNwZWNpZmljcyB0byBvdmVycmlkZSBpdAorICAgICAgICBpbnQgdHlwZSA9IHRtcGxhdGUuZ2V0VHlwZSgpOworICAgICAgICBpbnQgc2l6ZSA9IHRtcGxhdGUuZ2V0U2l6ZSgpOworICAgICAgICBpZiAodHlwZSA9PSBUeXBlcy5PVEhFUikKKyAgICAgICAgICAgIHR5cGUgPSBkaWN0LmdldEpEQkNUeXBlKHRtcGxhdGUuZ2V0SmF2YVR5cGUoKSwgc2l6ZSA9PSAtMSk7CisgICAgICAgIGJvb2xlYW4gdHR5cGUgPSB0cnVlOworICAgICAgICBpbnQgb3R5cGUgPSB0eXBlOworICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0bXBsYXRlLmdldFR5cGVOYW1lKCk7CisgICAgICAgIEJvb2xlYW4gbm90TnVsbCA9IG51bGw7CisgICAgICAgIGlmICh0bXBsYXRlLmlzTm90TnVsbEV4cGxpY2l0KCkpCisgICAgICAgICAgICBub3ROdWxsID0gKHRtcGxhdGUuaXNOb3ROdWxsKCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgaW50IGRlY2ltYWxzID0gdG1wbGF0ZS5nZXREZWNpbWFsRGlnaXRzKCk7CisgICAgICAgIFN0cmluZyBkZWZTdHIgPSB0bXBsYXRlLmdldERlZmF1bHRTdHJpbmcoKTsKKyAgICAgICAgYm9vbGVhbiBhdXRvQXNzaWduID0gdG1wbGF0ZS5pc0F1dG9Bc3NpZ25lZCgpOworICAgICAgICBib29sZWFuIHJlbGF0aW9uSWQgPSB0bXBsYXRlLmlzUmVsYXRpb25JZCgpOworICAgICAgICBTdHJpbmcgdGFyZ2V0RmllbGQgPSB0bXBsYXRlLmdldFRhcmdldEZpZWxkKCk7CisgICAgICAgIGlmIChnaXZlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB1c2UgZ2l2ZW4gdHlwZSBpZiBwcm92aWRlZCwgYnV0IHdhcm4gaWYgaXQgaXNuJ3QgY29tcGF0aWJsZSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgY29sdW1uIHR5cGUKKyAgICAgICAgICAgIGlmIChnaXZlbi5nZXRUeXBlKCkgIT0gVHlwZXMuT1RIRVIpIHsKKyAgICAgICAgICAgICAgICB0dHlwZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChjb21wYXQgJiYgIWdpdmVuLmlzQ29tcGF0aWJsZSh0eXBlLCB0eXBlTmFtZSwgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgIGRlY2ltYWxzKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cgbG9nID0gcmVwb3MuZ2V0TG9nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQocHJlZml4ICsgIi1pbmNvbXBhdC1jb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGNvbE5hbWUsIFNjaGVtYXMuZ2V0SkRCQ05hbWUodHlwZSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3R5cGUgPSBnaXZlbi5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgdHlwZSA9IGRpY3QuZ2V0UHJlZmVycmVkVHlwZShvdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlTmFtZSA9IGdpdmVuLmdldFR5cGVOYW1lKCk7CisgICAgICAgICAgICBzaXplID0gZ2l2ZW4uZ2V0U2l6ZSgpOworICAgICAgICAgICAgZGVjaW1hbHMgPSBnaXZlbi5nZXREZWNpbWFsRGlnaXRzKCk7CisKKyAgICAgICAgICAgIC8vIGxlYXZlIHRoaXMgaW5mbyBhcyB0aGUgdGVtcGxhdGUgZGVmYXVsdHMgdW5sZXNzIHRoZSB1c2VyCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHR1cm5zIGl0IG9uIGluIHRoZSBnaXZlbiBjb2x1bW4KKyAgICAgICAgICAgIGlmIChnaXZlbi5pc05vdE51bGxFeHBsaWNpdCgpKQorICAgICAgICAgICAgICAgIG5vdE51bGwgPSAoZ2l2ZW4uaXNOb3ROdWxsKCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgIGlmIChnaXZlbi5nZXREZWZhdWx0U3RyaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZWZTdHIgPSBnaXZlbi5nZXREZWZhdWx0U3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoZ2l2ZW4uaXNBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgICAgICBhdXRvQXNzaWduID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChnaXZlbi5pc1JlbGF0aW9uSWQoKSkKKyAgICAgICAgICAgICAgICByZWxhdGlvbklkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlZmF1bHQgY2hhciBjb2x1bW4gc2l6ZSBpZiBvcmlnaW5hbCB0eXBlIGlzIGNoYXIgKHRlc3Qgb3JpZ2luYWwKKyAgICAgICAgLy8gdHlwZSByYXRoZXIgdGhhbiBmaW5hbCB0eXBlIGJlY2F1c2Ugb3JpZyBtaWdodCBiZSBjbG9iLCB0cmFuc2xhdGVkCisgICAgICAgIC8vIHRvIGFuIHVuc2l6ZWQgdmFyY2hhciwgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHNvbWUgZGJzKQorICAgICAgICBpZiAoc2l6ZSA9PSAwICYmIChvdHlwZSA9PSBUeXBlcy5WQVJDSEFSIHx8IG90eXBlID09IFR5cGVzLkNIQVIpKQorICAgICAgICAgICAgc2l6ZSA9IGRpY3QuY2hhcmFjdGVyQ29sdW1uU2l6ZTsKKworICAgICAgICAvLyBjcmVhdGUgY29sdW1uLCBvciBtYWtlIHN1cmUgZXhpc3RpbmcgY29sdW1uIG1hdGNoZXMgZXhwZWN0ZWQgdHlwZQorICAgICAgICBpZiAoY29sID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbCA9IHRhYmxlLmFkZENvbHVtbihjb2xOYW1lKTsKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlKHR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKChjb21wYXQgfHwgIXR0eXBlKSAmJiAhY29sLmlzQ29tcGF0aWJsZSh0eXBlLCB0eXBlTmFtZSwgCisgICAgICAgICAgICBzaXplLCBkZWNpbWFscykpIHsKKyAgICAgICAgICAgIC8vIGlmIGV4aXN0aW5nIGNvbHVtbiBpc24ndCBjb21wYXRpYmxlIHdpdGggZGVzaXJlZCB0eXBlLCBkaWUgaWYKKyAgICAgICAgICAgIC8vIGNhbid0IGFkYXB0LCBlbHNlIHdhcm4gYW5kIGNoYW5nZSB0aGUgZXhpc3RpbmcgY29sdW1uIHR5cGUKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gX2xvYy5nZXQocHJlZml4ICsgIi1iYWQtY29sIiwgY29udGV4dCwKKyAgICAgICAgICAgICAgICBTY2hlbWFzLmdldEpEQkNOYW1lKHR5cGUpLCBjb2wuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICBpZiAoIWFkYXB0KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgTG9nIGxvZyA9IHJlcG9zLmdldExvZygpOworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4obXNnKTsKKworICAgICAgICAgICAgY29sLnNldFR5cGUodHlwZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2l2ZW4gIT0gbnVsbCAmJiBnaXZlbi5nZXRUeXBlKCkgIT0gVHlwZXMuT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIGFzIGxvbmcgYXMgdHlwZXMgYXJlIGNvbXBhdGlibGUsIHNldCBjb2x1bW4gdG8gZXhwZWN0ZWQgdHlwZQorICAgICAgICAgICAgY29sLnNldFR5cGUodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbHdheXMgc2V0IHRoZSBqYXZhIHR5cGUgYW5kIGF1dG9hc3NpZ24gdG8gZXhwZWN0ZWQgdmFsdWVzLCBldmVuIG9uCisgICAgICAgIC8vIGFuIGV4aXN0aW5nIGNvbHVtbiwgc2luY2Ugd2UgZG9uJ3QgZ2V0IHRoaXMgZnJvbSB0aGUgREIKKyAgICAgICAgaWYgKGNvbXBhdCkKKyAgICAgICAgICAgIGNvbC5zZXRKYXZhVHlwZSh0bXBsYXRlLmdldEphdmFUeXBlKCkpOworICAgICAgICBlbHNlIGlmIChjb2wuZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZXMuT0JKRUNUKSB7CisgICAgICAgICAgICBpZiAoZ2l2ZW4gIT0gbnVsbCAmJiBnaXZlbi5nZXRKYXZhVHlwZSgpICE9IEphdmFUeXBlcy5PQkpFQ1QpCisgICAgICAgICAgICAgICAgY29sLnNldEphdmFUeXBlKGdpdmVuLmdldEphdmFUeXBlKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbC5zZXRKYXZhVHlwZShKYXZhVHlwZXMuZ2V0VHlwZUNvZGUKKyAgICAgICAgICAgICAgICAgICAgKFNjaGVtYXMuZ2V0SmF2YVR5cGUoY29sLmdldFR5cGUoKSwgY29sLmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5nZXREZWNpbWFsRGlnaXRzKCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgY29sLnNldEF1dG9Bc3NpZ25lZChhdXRvQXNzaWduKTsKKyAgICAgICAgY29sLnNldFJlbGF0aW9uSWQocmVsYXRpb25JZCk7CisgICAgICAgIGNvbC5zZXRUYXJnZXRGaWVsZCh0YXJnZXRGaWVsZCk7CisKKyAgICAgICAgLy8gd2UgbmVlZCB0aGlzIGZvciBydW50aW1lLCBhbmQgdGhlIGR5bmFtaWMgc2NoZW1hIGZhY3RvcnkgbWlnaHQKKyAgICAgICAgLy8gbm90IGtub3cgaXQsIHNvIHNldCBpdCBldmVuIGlmIG5vdCBhZGFwdGluZworICAgICAgICBpZiAoZGVmU3RyICE9IG51bGwpCisgICAgICAgICAgICBjb2wuc2V0RGVmYXVsdFN0cmluZyhkZWZTdHIpOworICAgICAgICBpZiAobm90TnVsbCAhPSBudWxsKQorICAgICAgICAgICAgY29sLnNldE5vdE51bGwobm90TnVsbC5ib29sZWFuVmFsdWUoKSk7CisKKyAgICAgICAgLy8gYWRkIG90aGVyIGRldGFpbHMgaWYgYWRhcHRpbmcKKyAgICAgICAgaWYgKGFkYXB0KSB7CisgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb2wuc2V0VHlwZU5hbWUodHlwZU5hbWUpOworICAgICAgICAgICAgaWYgKHNpemUgIT0gMCkKKyAgICAgICAgICAgICAgICBjb2wuc2V0U2l6ZShzaXplKTsKKyAgICAgICAgICAgIGlmIChkZWNpbWFscyAhPSAwKQorICAgICAgICAgICAgICAgIGNvbC5zZXREZWNpbWFsRGlnaXRzKGRlY2ltYWxzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHRhYmxlIG5hbWVkIGJ5IGEgY29sdW1uIG9yIHRhcmdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgZm9yIGVycm9yIG1lc3NhZ2VzLCBldGMuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRhYmxlIG5hbWUsIHBvc3NpYmx5IGluY2x1ZGluZyBzY2hlbWEKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHRhYmxlOyBtYXkgYmUgbnVsbAorICAgICAqIEBwYXJhbSBpbnZlcnNlIHRoZSBwb3NzaWJsZSBpbnZlcnNlIHRhYmxlOyBtYXkgYmUgbnVsbAorICAgICAqIEBwYXJhbSByZWwgaWYgd2UncmUgZmluZGluZyB0aGUgdGFyZ2V0IHRhYmxlIG9mIGEgam9pbiwgdGhlCisgICAgICogam9pbmVkLXRvIHR5cGU7IGFsbG93cyB1cyB0byBhbHNvIGxvb2sgaW4gaXRzIHN1cGVyY2xhc3MgdGFibGVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGUgZmluZFRhYmxlKE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwKKyAgICAgICAgVGFibGUgZXhwZWN0ZWQsIFRhYmxlIGludmVyc2UsIENsYXNzTWFwcGluZyByZWwpIHsKKyAgICAgICAgLy8gaXMgdGhpcyB0aGUgZXhwZWN0ZWQgdGFibGU/CisgICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIHJlbCAhPSBudWxsKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSByZWwuZ2V0VGFibGUoKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgaXNUYWJsZU5hbWUobmFtZSwgZXhwZWN0ZWQpKQorICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkOworCisgICAgICAgIC8vIGNoZWNrIGZvciBpbnZlcnNlCisgICAgICAgIGlmIChpbnZlcnNlICE9IG51bGwgJiYgaXNUYWJsZU5hbWUobmFtZSwgaW52ZXJzZSkpCisgICAgICAgICAgICByZXR1cm4gaW52ZXJzZTsKKworICAgICAgICAvLyBzdXBlcmNsYXNzIHRhYmxlPworICAgICAgICBpZiAocmVsICE9IG51bGwpCisgICAgICAgICAgICByZWwgPSByZWwuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIHdoaWxlIChyZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGlzVGFibGVOYW1lKG5hbWUsIHJlbC5nZXRUYWJsZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVsLmdldFRhYmxlKCk7CisgICAgICAgICAgICByZWwgPSByZWwuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub25lIG9mIHRoZSBwb3NzaWJsZSB0YWJsZXMKKyAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb2wtd3JvbmctdGFibGUiLCBjb250ZXh0LAorICAgICAgICAgICAgZXhwZWN0ZWQsIG5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFibGVOYW1lKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRhYmxlLmdldE5hbWUoKSkKKyAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSh0YWJsZS5nZXRGdWxsTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZS9jcmVhdGUgYW4gaW5kZXggb24gdGhlIGdpdmVuIGNvbHVtbnMgYnkgbWVyZ2luZyB0aGUgZ2l2ZW4KKyAgICAgKiB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiB3aXRoIGFueSB1c2VyLXByb3ZpZGVkIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIG1hcHBpbmcgd2UncmUgcmV0cmlldmluZyBhbiBpbmRleCBmb3IKKyAgICAgKiBAcGFyYW0gcHJlZml4IGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGtleSBwcmVmaXgKKyAgICAgKiBAcGFyYW0gdG1wbGF0ZSB0ZW1wbGF0ZSBmb3IgZXhwZWN0ZWQgaW5kZXggaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gY29scyB0aGUgaW5kZXhlZCBjb2x1bW5zCisgICAgICogQHBhcmFtIGFkYXB0IHdoZXRoZXIgd2UgY2FuIG1vZGlmeSB0aGUgZXhpc3RpbmcgbWFwcGluZyBvciBzY2hlbWEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5kZXggY3JlYXRlSW5kZXgoTWV0YURhdGFDb250ZXh0IGNvbnRleHQsIFN0cmluZyBwcmVmaXgsCisgICAgICAgIEluZGV4IHRtcGxhdGUsIENvbHVtbltdIGNvbHMsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQorICAgICAgICAgICAgcHJlZml4ID0gImdlbmVyaWMiOworCisgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBhbiBpbmRleCBpZiB0aGVyZSBhcmUgbm8gY29scworICAgICAgICBpZiAoY29scyA9PSBudWxsIHx8IGNvbHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGlmIChfaWR4ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICArICItbm8taW5kZXgtY29scyIsIGNvbnRleHQpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9vayBmb3IgYW4gZXhpc3RpbmcgaW5kZXggb24gdGhlc2UgY29sdW1ucworICAgICAgICBUYWJsZSB0YWJsZSA9IGNvbHNbMF0uZ2V0VGFibGUoKTsKKyAgICAgICAgSW5kZXhbXSBpZHhzID0gdGFibGUuZ2V0SW5kZXhlcygpOworICAgICAgICBJbmRleCBleGlzdCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWR4cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGlkeHNbaV0uY29sdW1uc01hdGNoKGNvbHMpKSB7CisgICAgICAgICAgICAgICAgZXhpc3QgPSBpZHhzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIGluZGV4PworICAgICAgICBpZiAoIV9jYW5JZHgpIHsKKyAgICAgICAgICAgIGlmIChleGlzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKCFhZGFwdCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4ICsgIi1pbmRleC1leGlzdHMiLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSk7CisgICAgICAgICAgICB0YWJsZS5yZW1vdmVJbmRleChleGlzdCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgaW5kZXgsIG1lcmdlIGdpdmVuIGluZm8gaW50byBpdAorICAgICAgICBpZiAoZXhpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9pZHggIT0gbnVsbCAmJiBfaWR4LmlzVW5pcXVlKCkgJiYgIWV4aXN0LmlzVW5pcXVlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFkYXB0KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICArICItaW5kZXgtbm90LXVuaXF1ZSIsIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBleGlzdC5zZXRVbmlxdWUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXhpc3Q7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBubyBkZWZhdWx0cyByZXR1cm4gbnVsbAorICAgICAgICBNYXBwaW5nUmVwb3NpdG9yeSByZXBvcyA9IChNYXBwaW5nUmVwb3NpdG9yeSkgY29udGV4dC5nZXRSZXBvc2l0b3J5KCk7CisgICAgICAgIGJvb2xlYW4gZmlsbCA9IHJlcG9zLmdldE1hcHBpbmdEZWZhdWx0cygpLmRlZmF1bHRNaXNzaW5nSW5mbygpOworICAgICAgICBpZiAoX2lkeCA9PSBudWxsICYmICh0bXBsYXRlID09IG51bGwgfHwgKCFhZGFwdCAmJiAhZmlsbCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBib29sZWFuIHVucTsKKyAgICAgICAgaWYgKF9pZHggIT0gbnVsbCkgeworICAgICAgICAgICAgbmFtZSA9IF9pZHguZ2V0TmFtZSgpOworICAgICAgICAgICAgdW5xID0gX2lkeC5pc1VuaXF1ZSgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHVucSA9IHRtcGxhdGUuaXNVbmlxdWUoKTsKKworICAgICAgICAvLyBpZiBubyBuYW1lIHByb3ZpZGVkIGJ5IHVzZXIgaW5mbywgbWFrZSBvbmUKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRtcGxhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuYW1lID0gdG1wbGF0ZS5nZXROYW1lKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gY29sc1swXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IHJlcG9zLmdldERCRGljdGlvbmFyeSgpLmdldFZhbGlkSW5kZXhOYW1lKG5hbWUsIHRhYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEluZGV4IGlkeCA9IHRhYmxlLmFkZEluZGV4KG5hbWUpOworICAgICAgICBpZHguc2V0VW5pcXVlKHVucSk7CisgICAgICAgIGlkeC5zZXRDb2x1bW5zKGNvbHMpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlL2NyZWF0ZSBhIHVuaXF1ZSBjb25zdHJhaW50IG9uIHRoZSBnaXZlbiBjb2x1bW5zIGJ5IG1lcmdpbmcgdGhlCisgICAgICogZ2l2ZW4gdGVtcGxhdGUgaW5mb3JtYXRpb24gd2l0aCBhbnkgdXNlci1wcm92aWRlZCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBtYXBwaW5nIHdlJ3JlIHJldHJpZXZpbmcgYSBjb25zdHJhaW50IGZvcgorICAgICAqIEBwYXJhbSBwcmVmaXggbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Uga2V5IHByZWZpeAorICAgICAqIEBwYXJhbSB0bXBsYXRlIHRlbXBsYXRlIGZvciBleHBlY3RlZCB1bmlxdWUgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gY29scyB0aGUgY29uc3RyYWludCBjb2x1bW5zCisgICAgICogQHBhcmFtIGFkYXB0IHdoZXRoZXIgd2UgY2FuIG1vZGlmeSB0aGUgZXhpc3RpbmcgbWFwcGluZyBvciBzY2hlbWEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVW5pcXVlIGNyZWF0ZVVuaXF1ZShNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgVW5pcXVlIHRtcGxhdGUsIENvbHVtbltdIGNvbHMsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQorICAgICAgICAgICAgcHJlZml4ID0gImdlbmVyaWMiOworCisgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBhIGNvbnN0cmFpbnQgaWYgdGhlcmUgYXJlIG5vIGNvbHMKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCB8fCBjb2xzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX3VucSAhPSBudWxsIHx8IHRtcGxhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4CisgICAgICAgICAgICAgICAgICAgICsgIi1uby11bmlxdWUtY29scyIsIGNvbnRleHQpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9vayBmb3IgYW4gZXhpc3RpbmcgY29uc3RyYWludCBvbiB0aGVzZSBjb2x1bW5zCisgICAgICAgIFRhYmxlIHRhYmxlID0gY29sc1swXS5nZXRUYWJsZSgpOworICAgICAgICBVbmlxdWVbXSB1bnFzID0gdGFibGUuZ2V0VW5pcXVlcygpOworICAgICAgICBVbmlxdWUgZXhpc3QgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVucXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1bnFzW2ldLmNvbHVtbnNNYXRjaChjb2xzKSkgeworICAgICAgICAgICAgICAgIGV4aXN0ID0gdW5xc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyB1bmlxdWU/CisgICAgICAgIGlmICghX2NhblVucSkgeworICAgICAgICAgICAgaWYgKGV4aXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoIWFkYXB0KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldChwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLXVuaXF1ZS1leGlzdHMiLCBjb250ZXh0KSk7CisgICAgICAgICAgICB0YWJsZS5yZW1vdmVVbmlxdWUoZXhpc3QpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBubyBkZWZhdWx0czsgcmV0dXJuIGV4aXN0aW5nIGNvbnN0cmFpbnQgKGlmIGFueSkKKyAgICAgICAgaWYgKHRtcGxhdGUgPT0gbnVsbCAmJiBfdW5xID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZXhpc3Q7CisKKyAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSAoTWFwcGluZ1JlcG9zaXRvcnkpIGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBpZiAoZXhpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF91bnEgIT0gbnVsbCAmJiBfdW5xLmlzRGVmZXJyZWQoKSAmJiAhZXhpc3QuaXNEZWZlcnJlZCgpKSB7CisgICAgICAgICAgICAgICAgTG9nIGxvZyA9IHJlcG9zLmdldExvZygpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldChwcmVmaXggKyAiLWRlZmVyLXVuaXF1ZSIsIGNvbnRleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBleGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpY3QgY2FuJ3QgaGFuZGxlIHVuaXF1ZSBjb25zdHJhaW50cz8KKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSByZXBvcy5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgaWYgKF91bnEgIT0gbnVsbCAmJiAhZGljdC5zdXBwb3J0c1VuaXF1ZUNvbnN0cmFpbnRzKSB7CisgICAgICAgICAgICBMb2cgbG9nID0gcmVwb3MuZ2V0TG9nKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldChwcmVmaXggKyAiLXVuaXF1ZS1zdXBwb3J0IiwgY29udGV4dCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZpbGwgPSByZXBvcy5nZXRNYXBwaW5nRGVmYXVsdHMoKS5kZWZhdWx0TWlzc2luZ0luZm8oKTsKKyAgICAgICAgaWYgKCFhZGFwdCAmJiAhZmlsbCAmJiBfdW5xID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgYm9vbGVhbiBkZWZlcnJlZDsKKyAgICAgICAgaWYgKF91bnEgIT0gbnVsbCkgeworICAgICAgICAgICAgbmFtZSA9IF91bnEuZ2V0TmFtZSgpOworICAgICAgICAgICAgZGVmZXJyZWQgPSBfdW5xLmlzRGVmZXJyZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWUgPSB0bXBsYXRlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGRlZmVycmVkID0gdG1wbGF0ZS5pc0RlZmVycmVkKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVmZXJyZWQgJiYgIWRpY3Quc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzKSB7CisgICAgICAgICAgICBMb2cgbG9nID0gcmVwb3MuZ2V0TG9nKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldChwcmVmaXggKyAiLWNyZWF0ZS1kZWZlci11bmlxdWUiLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBkaWN0LnBsYXRmb3JtKSk7CisgICAgICAgICAgICBkZWZlcnJlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgVW5pcXVlIHVucSA9IHRhYmxlLmFkZFVuaXF1ZShuYW1lKTsKKyAgICAgICAgdW5xLnNldERlZmVycmVkKGRlZmVycmVkKTsKKyAgICAgICAgdW5xLnNldENvbHVtbnMoY29scyk7CisgICAgICAgIHJldHVybiB1bnE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUvY3JlYXRlIGEgZm9yZWlnbiBrZXkgKHBvc3NpYmx5IGxvZ2ljYWwpIG9uIHRoZSBnaXZlbiBjb2x1bW5zCisgICAgICogYnkgbWVyZ2luZyB0aGUgZ2l2ZW4gdGVtcGxhdGUgaW5mb3JtYXRpb24gd2l0aCBhbnkgdXNlci1wcm92aWRlZAorICAgICAqIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIG1hcHBpbmcgd2UncmUgcmV0cmlldmluZyBhIGtleSBmb3IKKyAgICAgKiBAcGFyYW0gcHJlZml4IGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGtleSBwcmVmaXgKKyAgICAgKiBAcGFyYW0gZ2l2ZW4gdGhlIGNvbHVtbnMgZ2l2ZW4gYnkgdGhlIHVzZXIKKyAgICAgKiBAcGFyYW0gZGVmIGRlZmF1bHRzIHByb3ZpZGVyCisgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSBmb3IgdGhlIGtleQorICAgICAqIEBwYXJhbSBjbHMgdHlwZSB3ZSdyZSBqb2luaW5nIGZyb20KKyAgICAgKiBAcGFyYW0gcmVsIHRhcmdldCB0eXBlIHdlJ3JlIGpvaW5pbmcgdG8KKyAgICAgKiBAcGFyYW0gaW52ZXJzYWJsZSB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSBjYW4gYmUgaW52ZXJzZWQKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB3ZSBjYW4gbW9kaWZ5IHRoZSBleGlzdGluZyBtYXBwaW5nIG9yIHNjaGVtYQorICAgICAqLworICAgIHByb3RlY3RlZCBGb3JlaWduS2V5IGNyZWF0ZUZvcmVpZ25LZXkoTWV0YURhdGFDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFN0cmluZyBwcmVmaXgsIExpc3QgZ2l2ZW4sIEZvcmVpZ25LZXlEZWZhdWx0cyBkZWYsIFRhYmxlIHRhYmxlLAorICAgICAgICBDbGFzc01hcHBpbmcgY2xzLCBDbGFzc01hcHBpbmcgcmVsLCBib29sZWFuIGludmVyc2FibGUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgYXNzZXJ0VGFibGUoY29udGV4dCwgdGFibGUpOworICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCisgICAgICAgICAgICBwcmVmaXggPSAiZ2VuZXJpYyI7CisKKyAgICAgICAgLy8gY29sbGVjdCB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucyBhbmQgdGhlaXIgdGFyZ2V0cworICAgICAgICBPYmplY3RbXVtdIGpvaW5zID0gY3JlYXRlSm9pbnMoY29udGV4dCwgcHJlZml4LCB0YWJsZSwgY2xzLCByZWwsCisgICAgICAgICAgICBnaXZlbiwgZGVmLCBpbnZlcnNhYmxlLCBhZGFwdCk7CisgICAgICAgIF9qb2luID0gSk9JTl9GT1JXQVJEOworCisgICAgICAgIC8vIGVzdGFibGlzaCBsb2NhbCB0YWJsZSB1c2luZyBhbnkgam9pbiBiZXR3ZWVuIHR3byBjb2x1bW5zOyBpZiB3ZSBvbmx5CisgICAgICAgIC8vIGZpbmQgY29uc3RhbnQgam9pbnMsIHRoZW4ga2VlcCBkZWZhdWx0IGxvY2FsIHRhYmxlIChkaXJlY3Rpb25sZXNzKQorICAgICAgICBUYWJsZSBsb2NhbCA9IHRhYmxlOworICAgICAgICBUYWJsZSBmb3JlaWduID0gcmVsLmdldFRhYmxlKCk7CisgICAgICAgIFRhYmxlIHRtcDsKKyAgICAgICAgYm9vbGVhbiBjb25zdGFudCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGxvY2FsU2V0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChqb2luc1tpXVsxXWluc3RhbmNlb2YgQ29sdW1uKSB7CisgICAgICAgICAgICAgICAgdG1wID0gKChDb2x1bW4pIGpvaW5zW2ldWzBdKS5nZXRUYWJsZSgpOworICAgICAgICAgICAgICAgIGlmICghbG9jYWxTZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRtcCAhPSBsb2NhbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLW11bHQtZmstdGFibGVzIiwgY29udGV4dCwgbG9jYWwsIHRtcCkpOworICAgICAgICAgICAgICAgIGZvcmVpZ24gPSAoKENvbHVtbikgam9pbnNbaV1bMV0pLmdldFRhYmxlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoam9pbnNbaV1bMl0gPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgICAgICAgICBfam9pbiA9IEpPSU5fSU5WRVJTRTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IGEgY29uc3RhbnQgam9pbiwgbG9vayBmb3IgZXhpc3RpbmcgZm9yZWlnbiBrZXkKKyAgICAgICAgLy8gb24gbG9jYWwgY29sdW1ucworICAgICAgICBGb3JlaWduS2V5IGV4aXN0ID0gbnVsbDsKKyAgICAgICAgaWYgKCFjb25zdGFudCAmJiBsb2NhbC5nZXRGb3JlaWduS2V5cygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBuZXcgQ29sdW1uW2pvaW5zLmxlbmd0aF07CisgICAgICAgICAgICBDb2x1bW5bXSBwa3MgPSBuZXcgQ29sdW1uW2pvaW5zLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpvaW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29sc1tpXSA9IChDb2x1bW4pIGpvaW5zW2ldWzBdOworICAgICAgICAgICAgICAgIHBrc1tpXSA9IChDb2x1bW4pIGpvaW5zW2ldWzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGb3JlaWduS2V5W10gZmtzID0gbG9jYWwuZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZrc1tpXS5nZXRDb25zdGFudENvbHVtbnMoKS5sZW5ndGggPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiBma3NbaV0uZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAgICAgICYmIGZrc1tpXS5jb2x1bW5zTWF0Y2goY29scywgcGtzKSkgeworICAgICAgICAgICAgICAgICAgICBleGlzdCA9IGZrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSAoTWFwcGluZ1JlcG9zaXRvcnkpIGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IHJlcG9zLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBpZiAoZXhpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbWFrZSBleGlzdGluZyBrZXkgbG9naWNhbD8KKyAgICAgICAgICAgIGlmICghX2NhbkZLKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0LmdldERlbGV0ZUFjdGlvbigpICE9IGV4aXN0LkFDVElPTl9OT05FICYmICFhZGFwdCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLWZrLWV4aXN0cyIsIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBleGlzdC5zZXREZWxldGVBY3Rpb24oZXhpc3QuQUNUSU9OX05PTkUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2ZrICE9IG51bGwgJiYgX2ZrLmlzRGVmZXJyZWQoKSAmJiAhZXhpc3QuaXNEZWZlcnJlZCgpKSB7CisgICAgICAgICAgICAgICAgTG9nIGxvZyA9IHJlcG9zLmdldExvZygpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldChwcmVmaXggKyAiLWRlZmVyLWZrIiwgY29udGV4dCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhbGxvdyB1c2VyLWdpdmVuIGluZm8gdG8gb3ZlcnJpZGUgZXhpc3Rpbmcga2V5IGlmIHdlJ3JlIGFkYXB0aW5nOworICAgICAgICAgICAgLy8gdGVtcGxhdGUgaW5mbyBjYW5ub3Qgb3ZlcnJpZGUgZXhpc3Rpbmcga2V5CisgICAgICAgICAgICBpZiAoYWRhcHQgJiYgX2ZrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZrLmdldFVwZGF0ZUFjdGlvbigpICE9IEZvcmVpZ25LZXkuQUNUSU9OX05PTkUpCisgICAgICAgICAgICAgICAgICAgIGV4aXN0LnNldFVwZGF0ZUFjdGlvbihfZmsuZ2V0VXBkYXRlQWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGlmIChfZmsuZ2V0RGVsZXRlQWN0aW9uKCkgIT0gRm9yZWlnbktleS5BQ1RJT05fTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgZXhpc3Quc2V0RGVsZXRlQWN0aW9uKF9may5nZXREZWxldGVBY3Rpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRJT0Zyb21Kb2lucyhleGlzdCwgam9pbnMpOworICAgICAgICAgICAgcmV0dXJuIGV4aXN0OworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBpbnQgZGVsQWN0aW9uID0gRm9yZWlnbktleS5BQ1RJT05fTk9ORTsKKyAgICAgICAgaW50IHVwQWN0aW9uID0gRm9yZWlnbktleS5BQ1RJT05fTk9ORTsKKyAgICAgICAgYm9vbGVhbiBkZWZlcnJlZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGZpbGwgPSByZXBvcy5nZXRNYXBwaW5nRGVmYXVsdHMoKS5kZWZhdWx0TWlzc2luZ0luZm8oKTsKKyAgICAgICAgRm9yZWlnbktleSB0bXBsYXRlID0gKGRlZiA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogZGVmLmdldChsb2NhbCwgZm9yZWlnbiwgX2pvaW4gPT0gSk9JTl9JTlZFUlNFKTsKKyAgICAgICAgaWYgKF9mayAhPSBudWxsICYmICh0bXBsYXRlID09IG51bGwgfHwgKCFhZGFwdCAmJiAhZmlsbCkpKSB7CisgICAgICAgICAgICAvLyBpZiBub3QgYWRhcHRpbmcgb3Igbm8gdGVtcGxhdGUgaW5mbyB1c2UgZ2l2ZW4gZGF0YQorICAgICAgICAgICAgbmFtZSA9IF9may5nZXROYW1lKCk7CisgICAgICAgICAgICBkZWxBY3Rpb24gPSBfZmsuZ2V0RGVsZXRlQWN0aW9uKCk7CisgICAgICAgICAgICB1cEFjdGlvbiA9IF9may5nZXRVcGRhdGVBY3Rpb24oKTsKKyAgICAgICAgICAgIGRlZmVycmVkID0gX2ZrLmlzRGVmZXJyZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChfY2FuRksgJiYgKGFkYXB0IHx8IGZpbGwpKSB7CisgICAgICAgICAgICBpZiAoX2ZrID09IG51bGwgJiYgdG1wbGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gdXNlciBnaXZlbiBpbmZvOyB1c2UgdGVtcGxhdGUgZGF0YQorICAgICAgICAgICAgICAgIG5hbWUgPSB0bXBsYXRlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBkZWxBY3Rpb24gPSB0bXBsYXRlLmdldERlbGV0ZUFjdGlvbigpOworICAgICAgICAgICAgICAgIHVwQWN0aW9uID0gdG1wbGF0ZS5nZXRVcGRhdGVBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRtcGxhdGUuaXNEZWZlcnJlZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChfZmsgIT0gbnVsbCAmJiB0bXBsYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBtZXJnZSB1c2VyIGFuZCB0ZW1wbGF0ZSBkYXRhLCBhbHdheXMgbGV0dGluZyB1c2VyIGluZm8gd2luCisgICAgICAgICAgICAgICAgbmFtZSA9IF9may5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiB0bXBsYXRlLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gdG1wbGF0ZS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgZGVsQWN0aW9uID0gX2ZrLmdldERlbGV0ZUFjdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChkZWxBY3Rpb24gPT0gRm9yZWlnbktleS5BQ1RJT05fTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgZGVsQWN0aW9uID0gdG1wbGF0ZS5nZXREZWxldGVBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB1cEFjdGlvbiA9IF9may5nZXRVcGRhdGVBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAodXBBY3Rpb24gPT0gRm9yZWlnbktleS5BQ1RJT05fTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgdXBBY3Rpb24gPSB0bXBsYXRlLmdldFVwZGF0ZUFjdGlvbigpOworICAgICAgICAgICAgICAgIGRlZmVycmVkID0gX2ZrLmlzRGVmZXJyZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGljdC5zdXBwb3J0c0RlbGV0ZUFjdGlvbihkZWxBY3Rpb24pCisgICAgICAgICAgICB8fCAhZGljdC5zdXBwb3J0c1VwZGF0ZUFjdGlvbih1cEFjdGlvbikpIHsKKyAgICAgICAgICAgIExvZyBsb2cgPSByZXBvcy5nZXRMb2coKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KHByZWZpeCArICItdW5zdXBwb3J0ZWQtZmstYWN0aW9uIiwgY29udGV4dCkpOworICAgICAgICAgICAgZGVsQWN0aW9uID0gRm9yZWlnbktleS5BQ1RJT05fTk9ORTsKKyAgICAgICAgICAgIHVwQWN0aW9uID0gRm9yZWlnbktleS5BQ1RJT05fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmZXJyZWQgJiYgIWRpY3Quc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzKSB7CisgICAgICAgICAgICBMb2cgbG9nID0gcmVwb3MuZ2V0TG9nKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldChwcmVmaXggKyAiLWNyZWF0ZS1kZWZlci1mayIsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGRpY3QucGxhdGZvcm0pKTsKKyAgICAgICAgICAgIGRlZmVycmVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgZm9yZWlnbiBrZXkgd2l0aCBtZXJnZWQgaW5mbworICAgICAgICBGb3JlaWduS2V5IGZrID0gbG9jYWwuYWRkRm9yZWlnbktleShuYW1lKTsKKyAgICAgICAgZmsuc2V0RGVsZXRlQWN0aW9uKGRlbEFjdGlvbik7CisgICAgICAgIGZrLnNldFVwZGF0ZUFjdGlvbih1cEFjdGlvbik7CisgICAgICAgIGZrLnNldERlZmVycmVkKGRlZmVycmVkKTsKKworICAgICAgICAvLyBhZGQgam9pbnMgdG8ga2V5CisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbCA9IChDb2x1bW4pIGpvaW5zW2ldWzBdOworICAgICAgICAgICAgaWYgKGpvaW5zW2ldWzFdaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgZmsuam9pbihjb2wsIChDb2x1bW4pIGpvaW5zW2ldWzFdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChqb2luc1tpXVsyXSA9PSBCb29sZWFuLlRSVUUpICE9IChfam9pbiA9PSBKT0lOX0lOVkVSU0UpKQorICAgICAgICAgICAgICAgIGZrLmpvaW5Db25zdGFudChqb2luc1tpXVsxXSwgY29sKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmay5qb2luQ29uc3RhbnQoY29sLCBqb2luc1tpXVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SU9Gcm9tSm9pbnMoZmssIGpvaW5zKTsKKyAgICAgICAgcmV0dXJuIGZrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgam9pbiBpbmZvcm1hdGlvbiB0byBwb3B1bGF0ZSBvdXIgaW50ZXJuYWwgY29sdW1uIEkvTyBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRJT0Zyb21Kb2lucyhGb3JlaWduS2V5IGZrLCBPYmplY3RbXVtdIGpvaW5zKSB7CisgICAgICAgIExpc3QgY29scyA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgX2lvID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGludCBjb25zdElkeCA9IDA7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGNvbnN0IGNvbHVtbnMgYXJlIGluZGV4ZWQgYWZ0ZXIgc3RkIGpvaW4gY29sdW1ucyBpbiBmayBJTworICAgICAgICAgICAgaWYgKGpvaW5zW2ldWzFdaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAgICAgaWR4ID0gaSAtIGNvbnN0SWR4OworICAgICAgICAgICAgZWxzZSBpZiAoKGpvaW5zW2ldWzJdID09IEJvb2xlYW4uVFJVRSkgPT0gKF9qb2luID09IEpPSU5fSU5WRVJTRSkpCisgICAgICAgICAgICAgICAgaWR4ID0gZmsuZ2V0Q29sdW1ucygpLmxlbmd0aCArIGNvbnN0SWR4Kys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzZXRJT0Zyb21Db2x1bW5GbGFncygoQ29sdW1uKSBjb2xzLmdldChpKSwgaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBvciByZXRyaWV2ZSB0aGUgZm9yZWlnbiBrZXkgam9pbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgbWFwcGluZyB3ZSdyZSByZXRyaWV2aW5nIGEga2V5IGZvcgorICAgICAqIEBwYXJhbSBwcmVmaXggbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Uga2V5IHByZWZpeAorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgZm9yIHRoZSBrZXkKKyAgICAgKiBAcGFyYW0gY2xzIHR5cGUgd2UncmUgam9pbmluZyBmcm9tLCBpZiBhcHBsaWNhYmxlCisgICAgICogQHBhcmFtIHJlbCB0YXJnZXQgdHlwZSB3ZSdyZSBqb2luaW5nIHRvCisgICAgICogQHBhcmFtIGdpdmVuIHRoZSBjb2x1bW5zIGdpdmVuIGJ5IHRoZSB1c2VyCisgICAgICogQHBhcmFtIGRlZiBmb3JlaWduIGtleSBkZWZhdWx0cyBwcm92aWRlcgorICAgICAqIEBwYXJhbSBpbnZlcnNhYmxlIHdoZXRoZXIgdGhlIGZvcmVpZ24ga2V5IGNhbiBiZSBpbnZlcnNlZAorICAgICAqIEBwYXJhbSBhZGFwdCB3aGV0aGVyIHdlIGNhbiBtb2RpZnkgdGhlIGV4aXN0aW5nIG1hcHBpbmcgb3Igc2NoZW1hCisgICAgICogQHJldHVybiBhcnJheSBvZiB0dXBsZXMgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlCisgICAgICogbG9jYWwgY29sdW1uIChvciBpbiB0aGUgY2FzZSBvZiBhIGNvbnN0YW50IGpvaW4gdGhlCisgICAgICogc29sZSBjb2x1bW4pLCB0aGUgc2Vjb25kIGlzIHRoZSB0YXJnZXQgY29sdW1uIChvcgorICAgICAqIGNvbnN0YW50KSwgYW5kIHRoZSB0aGlyZCBpcyB7QGxpbmsgQm9vbGVhbiNUUlVFfSBpZgorICAgICAqIHRoaXMgaXMgYW4gaW52ZXJzZSBqb2luCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3RbXVtdIGNyZWF0ZUpvaW5zKE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LAorICAgICAgICBTdHJpbmcgcHJlZml4LCBUYWJsZSB0YWJsZSwgQ2xhc3NNYXBwaW5nIGNscywgQ2xhc3NNYXBwaW5nIHJlbCwKKyAgICAgICAgTGlzdCBnaXZlbiwgRm9yZWlnbktleURlZmF1bHRzIGRlZiwgYm9vbGVhbiBpbnZlcnNhYmxlLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gKE1hcHBpbmdSZXBvc2l0b3J5KSBjb250ZXh0LmdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgYm9vbGVhbiBmaWxsID0gcmVwb3MuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuZGVmYXVsdE1pc3NpbmdJbmZvKCk7CisgICAgICAgIE9iamVjdFtdW10gam9pbnM7CisKKyAgICAgICAgLy8gaWYgbm8gY29sdW1ucyBnaXZlbiwganVzdCBjcmVhdGUgbWlycm9ycyBvZiB0YXJnZXQgY29sdW1ucworICAgICAgICBpZiAoZ2l2ZW4uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoIWFkYXB0ICYmICFmaWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldChwcmVmaXggKyAiLW5vLWZrLWNvbHMiLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSk7CisKKyAgICAgICAgICAgIENvbHVtbltdIHRhcmdldHMgPSByZWwuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgICAgIGpvaW5zID0gbmV3IE9iamVjdFt0YXJnZXRzLmxlbmd0aF1bM107CisgICAgICAgICAgICBDb2x1bW4gdG1wbGF0ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRtcGxhdGUgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgICAgICAgICAgdG1wbGF0ZS5zZXROYW1lKHRhcmdldHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB0bXBsYXRlLnNldEphdmFUeXBlKHRhcmdldHNbaV0uZ2V0SmF2YVR5cGUoKSk7CisgICAgICAgICAgICAgICAgdG1wbGF0ZS5zZXRUeXBlKHRhcmdldHNbaV0uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB0bXBsYXRlLnNldFR5cGVOYW1lKHRhcmdldHNbaV0uZ2V0VHlwZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgdG1wbGF0ZS5zZXRTaXplKHRhcmdldHNbaV0uZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB0bXBsYXRlLnNldERlY2ltYWxEaWdpdHModGFyZ2V0c1tpXS5nZXREZWNpbWFsRGlnaXRzKCkpOworCisgICAgICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBkZWYucG9wdWxhdGUodGFibGUsIHJlbC5nZXRUYWJsZSgpLCB0bXBsYXRlLCB0YXJnZXRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGksIHRhcmdldHMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBqb2luc1tpXVswXSA9IG1lcmdlQ29sdW1uKGNvbnRleHQsIHByZWZpeCwgdG1wbGF0ZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgdGFibGUsIGFkYXB0LCBmaWxsKTsKKyAgICAgICAgICAgICAgICBqb2luc1tpXVsxXSA9IHRhcmdldHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gam9pbnM7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgZ2l2ZW4gY29sdW1ucyB0byBjcmVhdGUgam9pbi4gIHdlIGRvbid0IHRyeSB0byB1c2UgYW55IG9mIHRoZQorICAgICAgICAvLyB0ZW1wbGF0ZSBjb2x1bW5zLCBldmVuIGlmIHRoZSB1c2VyIGRvZXNuJ3QgZ2l2ZSBhIGNvbHVtbiBsaW5raW5nIHRvCisgICAgICAgIC8vIGV2ZXJ5IHByaW1hcnkga2V5IG9mIHRoZSB0YXJnZXQgdHlwZSAtLSB1c2VycyBhcmUgYWxsb3dlZCB0byBjcmVhdGUKKyAgICAgICAgLy8gcGFydGlhbCBqb2lucy4gIHRoaXMgbWVhbnMsIHRob3VnaCwgdGhhdCBpZiBhIHVzZXIgd2FudHMgdG8gc3BlY2lmeQorICAgICAgICAvLyBpbmZvIGZvciBvbmUgam9pbiBjb2x1bW4sIGhlIGhhcyB0byBhdCBsZWFzdCBjcmVhdGUgZWxlbWVudHMgZm9yCisgICAgICAgIC8vIGFsbCBvZiB0aGVtCisKKyAgICAgICAgam9pbnMgPSBuZXcgT2JqZWN0W2dpdmVuLnNpemUoKV1bM107CisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbCA9IChDb2x1bW4pIGdpdmVuLmdldChpKTsKKyAgICAgICAgICAgIG1lcmdlSm9pbkNvbHVtbihjb250ZXh0LCBwcmVmaXgsIGNvbCwgam9pbnMsIGksIHRhYmxlLCBjbHMsIHJlbCwKKyAgICAgICAgICAgICAgICBkZWYsIGludmVyc2FibGUgJiYgIWNvbC5nZXRGbGFnKENvbHVtbi5GTEFHX1BLX0pPSU4pLCBhZGFwdCwKKyAgICAgICAgICAgICAgICBmaWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam9pbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG9yIHJldHJpZXZlIGEgZm9yZWlnbiBrZXkgY29sdW1uIGZvciBhIGpvaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgbWFwcGluZyB3ZSdyZSByZXRyaWV2aW5nIGEga2V5IGZvcgorICAgICAqIEBwYXJhbSBwcmVmaXggbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Uga2V5IHByZWZpeAorICAgICAqIEBwYXJhbSBnaXZlbiB0aGUgZ2l2ZW4gbG9jYWwgZm9yZWlnbiBrZXkgY29sdW1uCisgICAgICogQHBhcmFtIGpvaW5zIGFycmF5IG9mIGpvaW5zCisgICAgICogQHBhcmFtIGlkeCBpbmRleCBvZiB0aGUgam9pbiBhcnJheSB0byBwb3B1bGF0ZQorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgZm9yIHRoZSBrZXkKKyAgICAgKiBAcGFyYW0gY2xzIHRoZSB0eXBlIHdlJ3JlIGpvaW5pbmcgZnJvbQorICAgICAqIEBwYXJhbSByZWwgdGFyZ2V0IHR5cGUgd2UncmUgam9pbmluZyB0bworICAgICAqIEBwYXJhbSBkZWYgZm9yZWlnbiBrZXkgZGVmYXVsdHMgcHJvdmlkZXI7CisgICAgICogdXNlIG51bGwgdG8gbWlycm9yIHRhcmdldCBjb2x1bW4gbmFtZXMKKyAgICAgKiBAcGFyYW0gaW52ZXJzYWJsZSB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSBjYW4gYmUgaW52ZXJzZWQKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB3ZSBjYW4gbW9kaWZ5IHRoZSBleGlzdGluZyBtYXBwaW5nIG9yIHNjaGVtYQorICAgICAqIEBwYXJhbSBmaWxsIHdoZXRoZXIgdG8gZGVmYXVsdCBtaXNzaW5nIGNvbHVtbiBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtZXJnZUpvaW5Db2x1bW4oTWV0YURhdGFDb250ZXh0IGNvbnRleHQsIFN0cmluZyBwcmVmaXgsCisgICAgICAgIENvbHVtbiBnaXZlbiwgT2JqZWN0W11bXSBqb2lucywgaW50IGlkeCwgVGFibGUgdGFibGUsIENsYXNzTWFwcGluZyBjbHMsCisgICAgICAgIENsYXNzTWFwcGluZyByZWwsIEZvcmVpZ25LZXlEZWZhdWx0cyBkZWYsIGJvb2xlYW4gaW52ZXJzYWJsZSwKKyAgICAgICAgYm9vbGVhbiBhZGFwdCwgYm9vbGVhbiBmaWxsKSB7CisgICAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lIGlmIHRoaXMgaXMgYSBwayBqb2luCisgICAgICAgIFN0cmluZyBuYW1lID0gZ2l2ZW4uZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsICYmIGdpdmVuICE9IG51bGwKKyAgICAgICAgICAgICYmIGdpdmVuLmdldEZsYWcoQ29sdW1uLkZMQUdfUEtfSk9JTikgJiYgY2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbHVtbltdIHBrcyA9IGNscy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICAgICAgaWYgKHBrcy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICBuYW1lID0gcGtzWzBdLmdldE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGNhbid0IGFkYXB0LCB0aGVuIHRoZSB1c2VyIG11c3QgYXQgbGVhc3QgZ2l2ZSBhIGNvbHVtbiBuYW1lCisgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgIWFkYXB0ICYmICFmaWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeCArICItbm8tZmtjb2wtbmFtZSIsCisgICAgICAgICAgICAgICAgY29udGV4dCkpOworCisgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29sdW1uIGlzbid0IGluIHRoZSBleHBlY3RlZCB0YWJsZTsgaXQgbWlnaHQKKyAgICAgICAgLy8gYmUgYW4gaW52ZXJzZSBqb2luIG9yIGEgam9pbiB0byBhIGJhc2UgY2xhc3Mgb2YgdGhlIHRhcmdldCB0eXBlCisgICAgICAgIFRhYmxlIGxvY2FsID0gdGFibGU7CisgICAgICAgIFRhYmxlIGZvcmVpZ24gPSByZWwuZ2V0VGFibGUoKTsKKyAgICAgICAgYm9vbGVhbiBmdWxsTmFtZSA9IGZhbHNlOworICAgICAgICBib29sZWFuIGludmVyc2UgPSBmYWxzZTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGRvdElkeCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChkb3RJZHggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAvLyBhbGxvdyB1c2Ugb2YgJy4nIHdpdGhvdXQgcHJlZml4IHRvIG1lYW4gInVzZSBleHBlY3RlZAorICAgICAgICAgICAgICAgIC8vIGZvcmVpZ24gdGFibGUiCisgICAgICAgICAgICAgICAgaWYgKGRvdElkeCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IGZvcmVpZ247CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IGZpbmRUYWJsZShjb250ZXh0LCBuYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwsIGZvcmVpZ24sIG51bGwpOworICAgICAgICAgICAgICAgIGZ1bGxOYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoZG90SWR4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBpZiBpbnZlcnNlIGpvaW4sIHRoZW4gc3dhcCBsb2NhbCBhbmQgZm9yZWlnbiB0YWJsZXMKKyAgICAgICAgICAgICAgICBpZiAobG9jYWwgIT0gdGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWlnbiA9IHRhYmxlOworICAgICAgICAgICAgICAgICAgICBpbnZlcnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBmb3JjZUludmVyc2UgPSAhZnVsbE5hbWUgJiYgX2pvaW4gPT0gSk9JTl9JTlZFUlNFOworICAgICAgICBpZiAoZm9yY2VJbnZlcnNlKSB7CisgICAgICAgICAgICBsb2NhbCA9IGZvcmVpZ247CisgICAgICAgICAgICBmb3JlaWduID0gdGFibGU7CisgICAgICAgICAgICBpbnZlcnNlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVybWluZSB0YXJnZXQKKyAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBnaXZlbi5nZXRUYXJnZXQoKTsKKyAgICAgICAgT2JqZWN0IHRhcmdldCA9IG51bGw7CisgICAgICAgIFRhYmxlIHR0YWJsZSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gY29uc3RhbnQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmdWxsVGFyZ2V0ID0gZmFsc2U7CisgICAgICAgIGlmICh0YXJnZXROYW1lID09IG51bGwgJiYgZ2l2ZW4uZ2V0VGFyZ2V0RmllbGQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc01hcHBpbmcgdGNscyA9IChpbnZlcnNlKSA/IGNscyA6IHJlbDsKKyAgICAgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSBnaXZlbi5nZXRUYXJnZXRGaWVsZCgpOworICAgICAgICAgICAgaW50IGRvdElkeCA9IGZpZWxkTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgZnVsbFRhcmdldCA9IGRvdElkeCAhPSAtMTsKKworICAgICAgICAgICAgaWYgKGRvdElkeCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gYWxsb3cgdXNlIG9mICcuJyB3aXRob3V0IHByZWZpeCB0byBtZWFuICJ1c2UgZXhwZWN0ZWQgbG9jYWwKKyAgICAgICAgICAgICAgICAvLyBjbHMiOyBidXQgaWYgd2UgYWxyZWFkeSBpbnZlcnNlZCBubyBuZWVkIHRvIHN3aXRjaCBhZ2FpbgorICAgICAgICAgICAgICAgIGlmICghaW52ZXJzZSkKKyAgICAgICAgICAgICAgICAgICAgdGNscyA9IGNsczsKKyAgICAgICAgICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZE5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkb3RJZHggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBjbGFzcyArIGZpZWxkIG5hbWUKKyAgICAgICAgICAgICAgICB0Y2xzID0gZmluZENsYXNzTWFwcGluZyhjb250ZXh0LCBmaWVsZE5hbWUuc3Vic3RyaW5nCisgICAgICAgICAgICAgICAgICAgICgwLCBkb3RJZHgpLCBjbHMsIHJlbCk7CisgICAgICAgICAgICAgICAgZmllbGROYW1lID0gZmllbGROYW1lLnN1YnN0cmluZyhkb3RJZHggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0Y2xzID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICArICItYmFkLWZrdGFyZ2V0Y2xzIiwgY29udGV4dCwgZmllbGROYW1lLCBuYW1lKSk7CisKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IHRjbHMuZ2V0RmllbGRNYXBwaW5nKGZpZWxkTmFtZSk7CisgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4CisgICAgICAgICAgICAgICAgICAgICsgIi1iYWQtZmt0YXJnZXRmaWVsZCIsIG5ldyBPYmplY3RbXXsgY29udGV4dCwgZmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCB0Y2xzIH0pKTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRDb2x1bW5zKCkubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICArICItZmt0YXJnZXRmaWVsZC1jb2xzIiwgY29udGV4dCwgZmllbGROYW1lLCBuYW1lKSk7CisgICAgICAgICAgICB0dGFibGUgPSAoZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSAhPSBudWxsKSA/IGZpZWxkLmdldFRhYmxlKCkKKyAgICAgICAgICAgICAgICA6IGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpLmdldFRhYmxlKCk7CisgICAgICAgICAgICB0YXJnZXROYW1lID0gZmllbGQuZ2V0Q29sdW1ucygpWzBdLmdldE5hbWUoKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXROYW1lLmNoYXJBdCgwKSA9PSAnXCcnKSB7CisgICAgICAgICAgICAgICAgY29uc3RhbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldE5hbWUuc3Vic3RyaW5nKDEsIHRhcmdldE5hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0TmFtZS5jaGFyQXQoMCkgPT0gJy0nCisgICAgICAgICAgICAgICAgfHwgdGFyZ2V0TmFtZS5jaGFyQXQoMCkgPT0gJy4nCisgICAgICAgICAgICAgICAgfHwgQ2hhcmFjdGVyLmlzRGlnaXQodGFyZ2V0TmFtZS5jaGFyQXQoMCkpKSB7CisgICAgICAgICAgICAgICAgY29uc3RhbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lLmluZGV4T2YoJy4nKSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBJbnRlZ2VyKHRhcmdldE5hbWUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgRG91YmxlKHRhcmdldE5hbWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLWJhZC1ma2NvbnN0IiwgY29udGV4dCwgdGFyZ2V0TmFtZSwgbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0TmFtZSkpCisgICAgICAgICAgICAgICAgY29uc3RhbnQgPSB0cnVlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGRvdElkeCA9IHRhcmdldE5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgICAgICBmdWxsVGFyZ2V0ID0gZG90SWR4ICE9IC0xOworICAgICAgICAgICAgICAgIGlmIChkb3RJZHggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyB1c2Ugb2YgJy4nIHdpdGhvdXQgcHJlZml4IHRvIG1lYW4gInVzZSBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCB0YWJsZSIsIGJ1dCBpZ25vcmUgaWYgd2UncmUgYWxyZWFkeSBpbnZlcnNlZAorICAgICAgICAgICAgICAgICAgICBpZiAoIWludmVyc2UpCisgICAgICAgICAgICAgICAgICAgICAgICB0dGFibGUgPSBsb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IHRhcmdldE5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG90SWR4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHR0YWJsZSA9IGZpbmRUYWJsZShjb250ZXh0LCB0YXJnZXROYW1lLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgICAgICAgICAgZG90SWR4KSwgZm9yZWlnbiwgbG9jYWwsIChpbnZlcnNlKSA/IGNscyA6IHJlbCk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUgPSB0YXJnZXROYW1lLnN1YnN0cmluZyhkb3RJZHggKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgZXhwbGljaXQgdGFyZ2V0IHRhYmxlIGlmIGF2YWlsYWJsZQorICAgICAgICBpZiAodHRhYmxlID09IGxvY2FsICYmIGxvY2FsICE9IGZvcmVpZ24pIHsKKyAgICAgICAgICAgIC8vIHN3YXAsIHVubGVzcyB1c2VyIGdhdmUgaW5jb21wYXRpYmxlIHRhYmxlIGluIGNvbHVtbiBuYW1lCisgICAgICAgICAgICBpZiAoZnVsbE5hbWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICArICItYmFkLWZrdGFyZ2V0LWludmVyc2UiLCBuZXcgT2JqZWN0W117IGNvbnRleHQsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZvcmVpZ24sIHR0YWJsZSB9KSk7CisgICAgICAgICAgICBsb2NhbCA9IGZvcmVpZ247CisgICAgICAgICAgICBmb3JlaWduID0gdHRhYmxlOworICAgICAgICB9IGVsc2UgaWYgKHR0YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB0dGFibGUgbWlnaHQgYmUgYSB0YWJsZSBvZiBhIGJhc2UgY2xhc3Mgb2YgdGhlIHRhcmdldAorICAgICAgICAgICAgZm9yZWlnbiA9IHR0YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBpbnZlcnNlZDsgaWYgdGhpcyBpcyBhIHNhbWUtdGFibGUgam9pbiwgdGhlbgorICAgICAgICAvLyBjb25zaWRlciBpdCBhbiBpbXBsaWNpdCBpbnZlcnNlIGlmIHRoZSB1c2VyIGluY2x1ZGVzIHRoZSB0YWJsZSBuYW1lCisgICAgICAgIC8vIGluIHRoZSBjb2x1bW4gbmFtZSwgYnV0IG5vdCBpbiB0aGUgY29sdW1uIHRhcmdldCwgb3IgaWYgdGhlIHVzZXIKKyAgICAgICAgLy8gZ2l2ZXMgbm8gY29sdW1uIG5hbWUgYnV0IGEgZnVsbCB0YXJnZXQgbmFtZQorICAgICAgICBpbnZlcnNlID0gaW52ZXJzZSB8fCBsb2NhbCAhPSB0YWJsZSB8fCAobG9jYWwgPT0gZm9yZWlnbgorICAgICAgICAgICAgJiYgKChmdWxsTmFtZSAmJiAhZnVsbFRhcmdldCkgfHwgKG5hbWUgPT0gbnVsbCAmJiBmdWxsVGFyZ2V0KSkpOworICAgICAgICBpZiAoIWludmVyc2FibGUgJiYgIWNvbnN0YW50ICYmIGludmVyc2UpIHsKKyAgICAgICAgICAgIGlmIChsb2NhbCA9PSBmb3JlaWduKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldChwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLWJhZC1may1zZWxmLWludmVyc2UiLCBjb250ZXh0LCBsb2NhbCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeCArICItYmFkLWZrLWludmVyc2UiLAorICAgICAgICAgICAgICAgIGNvbnRleHQsIGxvY2FsLCB0YWJsZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgY29uc3RhbnQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4CisgICAgICAgICAgICAgICAgKyAiLW5vLWZrY29sLW5hbWUtYWRhcHQiLCBjb250ZXh0KSk7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiB0YXJnZXROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGlmIG5vIG5hbWUgb3IgdGFyZ2V0IGlzIHByb3ZpZGVkIGFuZCB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgbGlrZWx5CisgICAgICAgICAgICAvLyBqb2luIHBvc3NpYmlsaXR5LCB0b28gYW1iaWd1b3VzCisgICAgICAgICAgICBQcmltYXJ5S2V5IHBrID0gZm9yZWlnbi5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgICAgICBpZiAoam9pbnMubGVuZ3RoICE9IDEgfHwgcGsgPT0gbnVsbCB8fCBway5nZXRDb2x1bW5zKCkubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeAorICAgICAgICAgICAgICAgICAgICArICItbm8tZmtjb2wtbmFtZS1hZGFwdCIsIGNvbnRleHQpKTsKKworICAgICAgICAgICAgLy8gYXNzdW1lIHRhcmdldCBpcyBwayBjb2x1bW4KKyAgICAgICAgICAgIHRhcmdldE5hbWUgPSBway5nZXRDb2x1bW5zKClbMF0uZ2V0TmFtZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUgIT0gbnVsbCAmJiB0YXJnZXROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGlmIG9uZSBwcmltYXJ5IGtleSBjb2x1bW4gdXNlIGl0IGZvciB0YXJnZXQ7IGlmIG11bHRpcGxlIGpvaW5zCisgICAgICAgICAgICAvLyBsb29rIGZvciBhIGZvcmVpZ24gY29sdW1uIHdpdGggc2FtZSBuYW1lIGFzIGxvY2FsIGNvbHVtbgorICAgICAgICAgICAgUHJpbWFyeUtleSBwayA9IGZvcmVpZ24uZ2V0UHJpbWFyeUtleSgpOworICAgICAgICAgICAgaWYgKGpvaW5zLmxlbmd0aCA9PSAxICYmIHBrICE9IG51bGwgJiYgcGsuZ2V0Q29sdW1ucygpLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHRhcmdldE5hbWUgPSBway5nZXRDb2x1bW5zKClbMF0uZ2V0TmFtZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoZm9yZWlnbi5nZXRDb2x1bW4obmFtZSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0YXJnZXROYW1lID0gbmFtZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQocHJlZml4CisgICAgICAgICAgICAgICAgICAgICsgIi1uby1ma2NvbC10YXJnZXQtYWRhcHQiLCBjb250ZXh0LCBuYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5kIHRoZSB0YXJnZXQgY29sdW1uLCBhbmQgY3JlYXRlIHRlbXBsYXRlIGZvciBsb2NhbCBjb2x1bW4gYmFzZWQKKyAgICAgICAgLy8gb24gaXQKKyAgICAgICAgQ29sdW1uIHRtcGxhdGUgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIHRtcGxhdGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFjb25zdGFudCkgeworICAgICAgICAgICAgQ29sdW1uIHRjb2wgPSBmb3JlaWduLmdldENvbHVtbih0YXJnZXROYW1lKTsKKyAgICAgICAgICAgIGlmICh0Y29sID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KHByZWZpeCArICItYmFkLWZrdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBjb250ZXh0LCB0YXJnZXROYW1lLCBuYW1lLCBmb3JlaWduIH0pKTsKKworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0bXBsYXRlLnNldE5hbWUodGNvbC5nZXROYW1lKCkpOworICAgICAgICAgICAgdG1wbGF0ZS5zZXRKYXZhVHlwZSh0Y29sLmdldEphdmFUeXBlKCkpOworICAgICAgICAgICAgdG1wbGF0ZS5zZXRUeXBlKHRjb2wuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIHRtcGxhdGUuc2V0VHlwZU5hbWUodGNvbC5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgIHRtcGxhdGUuc2V0U2l6ZSh0Y29sLmdldFNpemUoKSk7CisgICAgICAgICAgICB0bXBsYXRlLnNldERlY2ltYWxEaWdpdHModGNvbC5nZXREZWNpbWFsRGlnaXRzKCkpOworICAgICAgICAgICAgdGFyZ2V0ID0gdGNvbDsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICB0bXBsYXRlLnNldEphdmFUeXBlKEphdmFUeXBlcy5TVFJJTkcpOworICAgICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJbnRlZ2VyKQorICAgICAgICAgICAgdG1wbGF0ZS5zZXRKYXZhVHlwZShKYXZhVHlwZXMuSU5UKTsKKyAgICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRG91YmxlKQorICAgICAgICAgICAgdG1wbGF0ZS5zZXRKYXZhVHlwZShKYXZhVHlwZXMuRE9VQkxFKTsKKworICAgICAgICAvLyBwb3B1bGF0ZSB0ZW1wbGF0ZSwgYnV0IGxldCB1c2VyLWdpdmVuIG5hbWUgb3ZlcnJpZGUgZGVmYXVsdCBuYW1lCisgICAgICAgIGlmIChkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIGRlZi5wb3B1bGF0ZShsb2NhbCwgZm9yZWlnbiwgdG1wbGF0ZSwgdGFyZ2V0LCBpbnZlcnNlLCBpZHgsCisgICAgICAgICAgICAgICAgam9pbnMubGVuZ3RoKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRtcGxhdGUuc2V0TmFtZShuYW1lKTsKKworICAgICAgICAvLyBjcmVhdGUgb3IgbWVyZ2UgbG9jYWwgY29sdW1uCisgICAgICAgIENvbHVtbiBjb2wgPSBtZXJnZUNvbHVtbihjb250ZXh0LCBwcmVmaXgsIHRtcGxhdGUsIHRydWUsIGdpdmVuLCBsb2NhbCwKKyAgICAgICAgICAgIGFkYXB0LCBmaWxsKTsKKworICAgICAgICBqb2luc1tpZHhdWzBdID0gY29sOworICAgICAgICBqb2luc1tpZHhdWzFdID0gdGFyZ2V0OworICAgICAgICBpZiAoaW52ZXJzZSkKKyAgICAgICAgICAgIGpvaW5zW2lkeF1bMl0gPSBCb29sZWFuLlRSVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgdGFyZ2V0IGNsYXNzIG1hcHBpbmcgZ2l2ZW4gdGhlIHVzZXIncyBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgZm9yIGVycm9yIG1lc3NhZ2VzCisgICAgICogQHBhcmFtIGNsc05hbWUgY2xhc3MgbmFtZSBnaXZlbiBieSB1c2VyCisgICAgICogQHBhcmFtIGNscyBvcmlnaW5hbCBzb3VyY2UgbWFwcGluZworICAgICAqIEBwYXJhbSByZWwgb3JpZ2luYWwgdGFyZ2V0IG1hcHBpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01hcHBpbmcgZmluZENsYXNzTWFwcGluZyhNZXRhRGF0YUNvbnRleHQgY29udGV4dCwKKyAgICAgICAgU3RyaW5nIGNsc05hbWUsIENsYXNzTWFwcGluZyBjbHMsIENsYXNzTWFwcGluZyByZWwpIHsKKyAgICAgICAgaWYgKGlzQ2xhc3NNYXBwaW5nTmFtZShjbHNOYW1lLCBjbHMpKQorICAgICAgICAgICAgcmV0dXJuIGNsczsKKyAgICAgICAgaWYgKGlzQ2xhc3NNYXBwaW5nTmFtZShjbHNOYW1lLCByZWwpKQorICAgICAgICAgICAgcmV0dXJuIHJlbDsKKyAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJ0YXJnZXQtd3JvbmctY2xzIiwgbmV3IE9iamVjdFtdCisgICAgICAgICAgICB7IGNvbnRleHQsIGNsc05hbWUsIGNscywgcmVsIH0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBtYXBwaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc01hcHBpbmdOYW1lKFN0cmluZyBuYW1lLCBDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGNscy5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoU3RyaW5ncy5nZXRDbGFzc05hbWUoY2xzLmdldERlc2NyaWJlZFR5cGUoKSkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBpc0NsYXNzTWFwcGluZ05hbWUobmFtZSwgY2xzLmdldFBDU3VwZXJjbGFzc01hcHBpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBpbnRlcm5hbCBjb2x1bW4gaW5mb3JtYXRpb24gdG8gbWF0Y2ggdGhlIGdpdmVuIG1hcHBlZCBjb2x1bW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGZvcmNlSkRCQ1R5cGUgd2hldGhlciB0byBmb3JjZSB0aGUgamRiYy10eXBlIG9mIHRoZSBjb2x1bW5zCisgICAgICogdG8gYmUgc2V0LCBldmVuIHdoZW4gaXQgbWF0Y2hlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGNvbHVtbnMnIGphdmEgdHlwZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN5bmNDb2x1bW5zKE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBDb2x1bW5bXSBjb2xzLAorICAgICAgICBib29sZWFuIGZvcmNlSkRCQ1R5cGUpIHsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCB8fCBjb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgX2NvbHMgPSBudWxsOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9jb2xzID0gbmV3IEFycmF5TGlzdChjb2xzLmxlbmd0aCk7CisgICAgICAgICAgICBDb2x1bW4gY29sOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29sID0gc3luY0NvbHVtbihjb250ZXh0LCBjb2xzW2ldLCBjb2xzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VKREJDVHlwZSwgY29sc1tpXS5nZXRUYWJsZSgpLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc2V0Q29sdW1uRmxhZ3NGcm9tSU8oY29sLCBpKTsKKyAgICAgICAgICAgICAgICBfY29scy5hZGQoY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBJL08gZmxhZ3Mgb24gdGhlIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q29sdW1uRmxhZ3NGcm9tSU8oQ29sdW1uIGNvbCwgaW50IGkpIHsKKyAgICAgICAgaWYgKF9pbyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19VTlVQREFUQUJMRSwgIV9pby5pc1VwZGF0YWJsZShpLCBmYWxzZSkpOworICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19VTklOU0VSVEFCTEUsICFfaW8uaXNJbnNlcnRhYmxlKGksIGZhbHNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBpbnRlcm5hbCBpbmRleCBpbmZvcm1hdGlvbiB0byBtYXRjaCBnaXZlbiBtYXBwZWQgaW5kZXguCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3luY0luZGV4KE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBJbmRleCBpZHgpIHsKKyAgICAgICAgaWYgKGlkeCA9PSBudWxsKSB7CisgICAgICAgICAgICBfaWR4ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIF9jYW5JZHggPSB0cnVlOworICAgICAgICBfaWR4ID0gbmV3IEluZGV4KCk7CisgICAgICAgIF9pZHguc2V0TmFtZShpZHguZ2V0TmFtZSgpKTsKKyAgICAgICAgX2lkeC5zZXRVbmlxdWUoaWR4LmlzVW5pcXVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaW50ZXJuYWwgY29uc3RyYWludCBpbmZvcm1hdGlvbiB0byBtYXRjaCBnaXZlbiBtYXBwZWQgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzeW5jVW5pcXVlKE1ldGFEYXRhQ29udGV4dCBjb250ZXh0LCBVbmlxdWUgdW5xKSB7CisgICAgICAgIGlmICh1bnEgPT0gbnVsbCkgeworICAgICAgICAgICAgX3VucSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBfY2FuVW5xID0gdHJ1ZTsKKyAgICAgICAgX3VucSA9IG5ldyBVbmlxdWUoKTsKKyAgICAgICAgX3VucS5zZXROYW1lKHVucS5nZXROYW1lKCkpOworICAgICAgICBfdW5xLnNldERlZmVycmVkKHVucS5pc0RlZmVycmVkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaW50ZXJuYWwgY29uc3RyYWludCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIHRvIG1hdGNoIGdpdmVuIG1hcHBlZAorICAgICAqIGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWwgZGVmYXVsdCBsb2NhbCB0YWJsZQorICAgICAqIEBwYXJhbSB0YXJnZXQgZGVmYXVsdCB0YXJnZXQgdGFibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzeW5jRm9yZWlnbktleShNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgRm9yZWlnbktleSBmaywKKyAgICAgICAgVGFibGUgbG9jYWwsIFRhYmxlIHRhcmdldCkgeworICAgICAgICBpZiAoZmsgPT0gbnVsbCkgeworICAgICAgICAgICAgX2ZrID0gbnVsbDsKKyAgICAgICAgICAgIF9jb2xzID0gbnVsbDsKKyAgICAgICAgICAgIF9qb2luID0gSk9JTl9OT05FOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChfam9pbiA9PSBKT0lOX05PTkUpCisgICAgICAgICAgICBfam9pbiA9IEpPSU5fRk9SV0FSRDsKKworICAgICAgICBpZiAoZmsuaXNMb2dpY2FsKCkpCisgICAgICAgICAgICBfZmsgPSBudWxsOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9jYW5GSyA9IHRydWU7CisgICAgICAgICAgICBfZmsgPSBuZXcgRm9yZWlnbktleSgpOworICAgICAgICAgICAgX2ZrLnNldE5hbWUoZmsuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIF9may5zZXREZWxldGVBY3Rpb24oZmsuZ2V0RGVsZXRlQWN0aW9uKCkpOworICAgICAgICAgICAgX2ZrLnNldFVwZGF0ZUFjdGlvbihmay5nZXRVcGRhdGVBY3Rpb24oKSk7CisgICAgICAgICAgICBfZmsuc2V0RGVmZXJyZWQoZmsuaXNEZWZlcnJlZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbHVtbltdIGNvbHMgPSBmay5nZXRDb2x1bW5zKCk7CisgICAgICAgIENvbHVtbltdIHBrQ29scyA9IGZrLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgIENvbHVtbltdIGNjb2xzID0gZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgIE9iamVjdFtdIGNzID0gZmsuZ2V0Q29uc3RhbnRzKCk7CisgICAgICAgIENvbHVtbltdIGNwa0NvbHMgPSBmay5nZXRDb25zdGFudFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgIE9iamVjdFtdIGNwa3MgPSBmay5nZXRQcmltYXJ5S2V5Q29uc3RhbnRzKCk7CisKKyAgICAgICAgaW50IHNpemUgPSBjb2xzLmxlbmd0aCArIGNjb2xzLmxlbmd0aCArIGNwa0NvbHMubGVuZ3RoOworICAgICAgICBfY29scyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29sID0gc3luY0NvbHVtbihjb250ZXh0LCBjb2xzW2ldLCBzaXplLCBmYWxzZSwgbG9jYWwsCisgICAgICAgICAgICAgICAgdGFyZ2V0LCBwa0NvbHNbaV0sIF9qb2luID09IEpPSU5fSU5WRVJTRSk7CisgICAgICAgICAgICBzZXRDb2x1bW5GbGFnc0Zyb21JTyhjb2wsIGkpOworICAgICAgICAgICAgX2NvbHMuYWRkKGNvbCk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGNvbnN0YW50OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdGFudCA9IChjc1tpXSA9PSBudWxsKSA/IE5VTEwgOiBjc1tpXTsKKyAgICAgICAgICAgIGNvbCA9IHN5bmNDb2x1bW4oY29udGV4dCwgY2NvbHNbaV0sIHNpemUsIGZhbHNlLCBsb2NhbCwKKyAgICAgICAgICAgICAgICB0YXJnZXQsIGNvbnN0YW50LCBfam9pbiA9PSBKT0lOX0lOVkVSU0UpOworICAgICAgICAgICAgc2V0Q29sdW1uRmxhZ3NGcm9tSU8oY29sLCBjb2xzLmxlbmd0aCArIGkpOworICAgICAgICAgICAgX2NvbHMuYWRkKGNvbCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcGtDb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdGFudCA9IChjcGtzW2ldID09IG51bGwpID8gTlVMTCA6IGNwa3NbaV07CisgICAgICAgICAgICBfY29scy5hZGQoc3luY0NvbHVtbihjb250ZXh0LCBjcGtDb2xzW2ldLCBzaXplLCBmYWxzZSwgdGFyZ2V0LAorICAgICAgICAgICAgICAgIGxvY2FsLCBjb25zdGFudCwgX2pvaW4gIT0gSk9JTl9JTlZFUlNFKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBnaXZlbiBjb2x1bW4gd2l0aCB0aGUgcmF3IG1hcHBpbmcgaW5mb3JtYXRpb24KKyAgICAgKiBzZXQgY29ycmVjdGx5LCBhbmQgd2l0aG91dCBzZXR0aW5ncyB0aGF0IG1hdGNoIGRlZmF1bHRzLgorICAgICAqCisgICAgICogQHBhcmFtIG51bSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHRoaXMgbWFwcGluZworICAgICAqIEBwYXJhbSBmb3JjZUpEQkNUeXBlIHdoZXRoZXIgdGhlIGpkYmMtdHlwZSBvZiB0aGUgY3JlYXRlZCBjb2x1bW4KKyAgICAgKiBzaG91bGQgYmUgc2V0LCBldmVuIGlmIGl0IG1hdGNoZXMgdGhlIGRlZmF1bHQKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGNvbHVtbidzIGphdmEgdHlwZQorICAgICAqIEBwYXJhbSBjb2xUYWJsZSBleHBlY3RlZCB0YWJsZSBmb3IgdGhlIGNvbHVtbgorICAgICAqIEBwYXJhbSB0YXJnZXRUYWJsZSBleHBlY3RlZCB0YXJnZXQgdGFibGUgZm9yIGpvaW4gY29sdW1uCisgICAgICogQHBhcmFtIHRhcmdldCB0YXJnZXQgY29sdW1uIG9yIG9iamVjdCBmb3Igam9pbiBjb2x1bW47IGZvciBhCisgICAgICogY29uc3RhbnQgbnVsbCB0YXJnZXQsIHVzZSB7QGxpbmsgI05VTEx9CisgICAgICogQHBhcmFtIGludmVyc2Ugd2hldGhlciBqb2luIGNvbHVtbiBpcyBmb3IgaW52ZXJzZSBqb2luCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBDb2x1bW4gc3luY0NvbHVtbihNZXRhRGF0YUNvbnRleHQgY29udGV4dCwgQ29sdW1uIGNvbCwKKyAgICAgICAgaW50IG51bSwgYm9vbGVhbiBmb3JjZUpEQkNUeXBlLCBUYWJsZSBjb2xUYWJsZSwgVGFibGUgdGFyZ2V0VGFibGUsCisgICAgICAgIE9iamVjdCB0YXJnZXQsIGJvb2xlYW4gaW52ZXJzZSkgeworICAgICAgICAvLyB1c2UgZnVsbCBuYW1lIGZvciBjb2xzIHRoYXQgYXJlbid0IGluIHRoZSBleHBlY3RlZCB0YWJsZSwgb3IgdGhhdAorICAgICAgICAvLyBhcmUgaW52ZXJzZSBqb2lucworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9ICgoTWFwcGluZ1JlcG9zaXRvcnkpIGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpKS4KKyAgICAgICAgICAgIGdldERCRGljdGlvbmFyeSgpOworICAgICAgICBDb2x1bW4gY29weSA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgaWYgKGNvbC5nZXRUYWJsZSgpICE9IGNvbFRhYmxlIHx8IGludmVyc2UpCisgICAgICAgICAgICBjb3B5LnNldE5hbWUoZGljdC5nZXRGdWxsTmFtZShjb2wuZ2V0VGFibGUoKSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICArICIuIiArIGNvbC5nZXROYW1lKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3B5LnNldE5hbWUoY29sLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gc2V0IHRhcmdldCBpZiBub3QgZGVmYXVsdAorICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb3B5LnNldFRhcmdldCgibnVsbCIpOworICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29sdW1uKSB7CisgICAgICAgICAgICAgICAgQ29sdW1uIHRjb2wgPSAoQ29sdW1uKSB0YXJnZXQ7CisgICAgICAgICAgICAgICAgaWYgKCghaW52ZXJzZSAmJiB0Y29sLmdldFRhYmxlKCkgIT0gdGFyZ2V0VGFibGUpCisgICAgICAgICAgICAgICAgICAgIHx8IChpbnZlcnNlICYmIHRjb2wuZ2V0VGFibGUoKSAhPSBjb2xUYWJsZSkpCisgICAgICAgICAgICAgICAgICAgIGNvcHkuc2V0VGFyZ2V0KGRpY3QuZ2V0RnVsbE5hbWUodGNvbC5nZXRUYWJsZSgpLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiIgKyB0Y29sLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWRlZmF1bHRUYXJnZXQoY29sLCB0Y29sLCBudW0pKQorICAgICAgICAgICAgICAgICAgICBjb3B5LnNldFRhcmdldCh0Y29sLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgICAgICAgICBjb3B5LnNldFRhcmdldCh0YXJnZXQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29weS5zZXRUYXJnZXQoIiciICsgdGFyZ2V0ICsgIiciKTsKKyAgICAgICAgfSBlbHNlIGlmIChudW0gPiAxKQorICAgICAgICAgICAgY29weS5zZXRUYXJnZXRGaWVsZChjb2wuZ2V0VGFyZ2V0RmllbGQoKSk7CisKKyAgICAgICAgaWYgKGNvbC5nZXRTaXplKCkgIT0gMCAmJiBjb2wuZ2V0U2l6ZSgpICE9IGRpY3QuY2hhcmFjdGVyQ29sdW1uU2l6ZQorICAgICAgICAgICAgJiYgKGNvbC5nZXRTaXplKCkgIT0gLTEgfHwgIWNvbC5pc0xvYigpKSkKKyAgICAgICAgICAgIGNvcHkuc2V0U2l6ZShjb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgaWYgKGNvbC5nZXREZWNpbWFsRGlnaXRzKCkgIT0gMCkKKyAgICAgICAgICAgIGNvcHkuc2V0RGVjaW1hbERpZ2l0cyhjb2wuZ2V0RGVjaW1hbERpZ2l0cygpKTsKKyAgICAgICAgaWYgKGNvbC5nZXREZWZhdWx0U3RyaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvcHkuc2V0RGVmYXVsdFN0cmluZyhjb2wuZ2V0RGVmYXVsdFN0cmluZygpKTsKKyAgICAgICAgaWYgKGNvbC5pc05vdE51bGwoKSAmJiAhY29sLmlzUHJpbWFyeUtleSgpCisgICAgICAgICAgICAmJiAoIWlzUHJpbWl0aXZlKGNvbC5nZXRKYXZhVHlwZSgpKSB8fCBpc0ZvcmVpZ25LZXkoY29sKSkpCisgICAgICAgICAgICBjb3B5LnNldE5vdE51bGwodHJ1ZSk7CisKKyAgICAgICAgLy8gc2V0IHR5cGUgbmFtZSBpZiBub3QgZGVmYXVsdAorICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBjb2wuZ2V0VHlwZU5hbWUoKTsKKyAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwgfHwgY29weS5nZXRTaXplKCkgIT0gMAorICAgICAgICAgICAgfHwgY29weS5nZXREZWNpbWFsRGlnaXRzKCkgIT0gMCkgeworICAgICAgICAgICAgLy8gaXMgdGhpcyB0aGUgZGljdCBkZWZhdWx0IHR5cGU/IGhhdmUgdG8gZW5zdXJlIGpkYmMtdHlwZSBzZXQKKyAgICAgICAgICAgIC8vIHByaW9yIHRvIGZpbmRpbmcgZGljdCBkZWZhdWx0CisgICAgICAgICAgICBjb3B5LnNldFR5cGUoY29sLmdldFR5cGUoKSk7CisgICAgICAgICAgICBTdHJpbmcgZGVmTmFtZSA9IGRpY3QuZ2V0VHlwZU5hbWUoY29weSk7CisgICAgICAgICAgICBjb3B5LnNldFR5cGUoVHlwZXMuT1RIRVIpOworCisgICAgICAgICAgICAvLyBjb3B5IHNob3VsZCBub3QgaGF2ZSBzaXplIGluZm8gc2V0IGlmIGl0IGlzbid0IHVzZWQgaW4gdHlwZSBuYW1lCisgICAgICAgICAgICBib29sZWFuIGRlZlNpemVkID0gZGVmTmFtZS5pbmRleE9mKCcoJykgIT0gLTE7CisgICAgICAgICAgICBpZiAoIWRlZlNpemVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkuZ2V0U2l6ZSgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgY29weS5zZXRTaXplKDApOworICAgICAgICAgICAgICAgIGNvcHkuc2V0RGVjaW1hbERpZ2l0cygwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gc3RyaXAgc2l6ZSBmb3IgY29tcGFyaXNvbgorICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZS5pbmRleE9mKCcoJykgPT0gLTEgJiYgZGVmU2l6ZWQpCisgICAgICAgICAgICAgICAgICAgIGRlZk5hbWUgPSBkZWZOYW1lLnN1YnN0cmluZygwLCBkZWZOYW1lLmluZGV4T2YoJygnKSk7CisgICAgICAgICAgICAgICAgaWYgKCF0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGRlZk5hbWUpKQorICAgICAgICAgICAgICAgICAgICBjb3B5LnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBqZGJjLXR5cGUgaWYgbm90IGRlZmF1bHQgb3IgaWYgZm9yY2VkCisgICAgICAgIGlmIChmb3JjZUpEQkNUeXBlCisgICAgICAgICAgICB8fCAodGFyZ2V0ICE9IG51bGwgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBDb2x1bW4pCisgICAgICAgICAgICAmJiBjb2wuZ2V0VHlwZSgpICE9IFR5cGVzLlZBUkNIQVIpCisgICAgICAgICAgICB8fCBkaWN0LmdldEpEQkNUeXBlKGNvbC5nZXRKYXZhVHlwZSgpLCBmYWxzZSkgIT0gY29sLmdldFR5cGUoKSkKKyAgICAgICAgICAgIGNvcHkuc2V0VHlwZShjb2wuZ2V0VHlwZSgpKTsKKworICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBiZWxvbmdzIHRvIGEgZm9yZWlnbiBrZXkuCisgICAgICovIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGb3JlaWduS2V5KENvbHVtbiBjb2wpIAorICAgIHsgICAgICAgCisgICAgICAgIGlmIChjb2wuZ2V0VGFibGUoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBGb3JlaWduS2V5W10gZmtzID0gY29sLmdldFRhYmxlKCkuZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBma3MubGVuZ3RoOyBpKyspIAorICAgICAgICAgICAgaWYgKGZrc1tpXS5jb250YWluc0NvbHVtbihjb2wpIAorICAgICAgICAgICAgICAgIHx8IGZrc1tpXS5jb250YWluc0NvbnN0YW50Q29sdW1uKGNvbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBjb2RlIHJlcHJlc2VudHMgYSBwcmltaXRpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZShpbnQgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGFyZ2V0IGNvbHVtbiBtYXRjaGVzIHRoZSBkZWZhdWx0LgorICAgICAqIElmIHRoZXJlIGlzIG9ubHkgb25lIGNvbHVtbiBpbnZvbHZlZCBpbiB0aGUgam9pbiBhbmQgaXQgbGlua3MgdG8gdGhlCisgICAgICogc2luZ2xlIHRhcmdldCB0YWJsZSBwayBjb2x1bW4sIG9yIGlmIHRoZSBjb2x1bW4gbmFtZSBpcyB0aGUgc2FtZSBhcworICAgICAqIHRoZSB0YXJnZXQgY29sdW1uIG5hbWUsIHRoZW4gdGhlIHRhcmdldCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRUYXJnZXQoQ29sdW1uIGNvbCwgQ29sdW1uIHRhcmdldENvbCwKKyAgICAgICAgaW50IG51bSkgeworICAgICAgICBpZiAoY29sLmdldE5hbWUoKS5lcXVhbHModGFyZ2V0Q29sLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG51bSA+IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IHRhcmdldENvbC5nZXRUYWJsZSgpLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgaWYgKHBrID09IG51bGwgfHwgcGsuZ2V0Q29sdW1ucygpLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGFyZ2V0Q29sID09IHBrLmdldENvbHVtbnMoKVswXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwbGllcyBkZWZhdWx0IHRhYmxlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFRhYmxlRGVmYXVsdHMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdGFibGUgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KFNjaGVtYSBzY2hlbWEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBsaWVzIGRlZmF1bHQgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRm9yZWlnbktleURlZmF1bHRzIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgZGVmYXVsdCBmb3JlaWduIGtleSBmb3IgdGhlIGdpdmVuIHRhYmxlcywgb3IgbnVsbCB0bworICAgICAgICAgKiBjcmVhdGUgYSBsb2dpY2FsIGZvcmVpZ24ga2V5IG9ubHkuIERvIG5vdCBmaWxsIGluIHRoZSBjb2x1bW5zIG9mCisgICAgICAgICAqIHRoZSBmb3JlaWduIGtleSwgb25seSBhdHRyaWJ1dGVzIGxpa2UgaXRzIG5hbWUsIGRlbGV0ZSBhY3Rpb24sIGV0Yy4KKyAgICAgICAgICogRG8gbm90IGFkZCB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlIHRhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0KFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBib29sZWFuIGludmVyc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgY29sdW1uIHdpdGggZGVmYXVsdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBjb2x1bW4gb3IgY29uc3RhbnQgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIHBvcyB0aGUgaW5kZXggb2YgdGhpcyBjb2x1bW4gaW4gdGhlIGZvcmVpZ24ga2V5CisgICAgICAgICAqIEBwYXJhbSBjb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZm9yZWlnbiBrZXkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlKFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBDb2x1bW4gY29sLAorICAgICAgICAgICAgT2JqZWN0IHRhcmdldCwgYm9vbGVhbiBpbnZlcnNlLCBpbnQgcG9zLCBpbnQgY29scyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdSZXBvc2l0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTWFwcGluZ1JlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjNhODFmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5CbG9iVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkJ5dGVBcnJheVZhbHVlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5DaGFyQXJyYXlTdHJlYW1WYWx1ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuQ2hhckFycmF5VmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkNsYXNzTmFtZURpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5DbG9iVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkVtYmVkRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5FbWJlZGRlZENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuRmxhdENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuRnVsbENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuSGFuZGxlckZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuSW1tdXRhYmxlVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk1heEVtYmVkZGVkQmxvYkZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTWF4RW1iZWRkZWRCeXRlQXJyYXlGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk1heEVtYmVkZGVkQ2hhckFycmF5RmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5NYXhFbWJlZGRlZENsb2JGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk5vbmVDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk5vbmVEaXNjcmltaW5hdG9yU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZUZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZVZlcnNpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5OdW1iZXJWZXJzaW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuT2JqZWN0SWRDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk9iamVjdElkVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlByaW1pdGl2ZUZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuUmVsYXRpb25Db2xsZWN0aW9uSW52ZXJzZUtleUZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuUmVsYXRpb25Db2xsZWN0aW9uVGFibGVGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlJlbGF0aW9uRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5SZWxhdGlvbk1hcEludmVyc2VLZXlGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlJlbGF0aW9uTWFwVGFibGVGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlN0YXRlQ29tcGFyaXNvblZlcnNpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5TdHJpbmdGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlN1YmNsYXNzSm9pbkRpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5TdXBlcmNsYXNzRGlzY3JpbWluYXRvclN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlN1cGVyY2xhc3NWZXJzaW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuVGltZXN0YW1wVmVyc2lvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlVudHlwZWRQQ1ZhbHVlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5WYWx1ZU1hcERpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5WZXJ0aWNhbENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pblN5bnRheGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuU2VxdWVuY2VNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIFJlcG9zaXRvcnkgb2Ygb2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTWFwcGluZ1JlcG9zaXRvcnkKKyAgICBleHRlbmRzIE1ldGFEYXRhUmVwb3NpdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChNYXBwaW5nUmVwb3NpdG9yeS5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9oYW5kbGVycyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyByZWdpc3RlciBkZWZhdWx0IHZhbHVlIGhhbmRsZXJzCisgICAgICAgIF9oYW5kbGVycy5wdXQoImphdmEubGFuZy5FbnVtIiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5FbnVtVmFsdWVIYW5kbGVyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgREJEaWN0aW9uYXJ5IF9kaWN0ID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBNYXBwaW5nRGVmYXVsdHMgX2RlZmF1bHRzID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIE1hcCBfcmVzdWx0cyA9IG5ldyBIYXNoTWFwKCk7IC8vIG9iamVjdC0+cXVlcnlyZXN1bHRtYXBwaW5nCisgICAgcHJpdmF0ZSBTY2hlbWFHcm91cCBfc2NoZW1hID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmF0ZWd5SW5zdGFsbGVyIF9pbnN0YWxsZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENvbmZpZ3VyZSB2aWEgCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGV9LgorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nUmVwb3NpdG9yeSgpIHsKKyAgICAgICAgc2V0VmFsaWRhdGUoVkFMSURBVEVfTUFQUElORywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVudCBhY2Nlc3MgdG8gZGljdGlvbmFyeSBmb3IgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIERCRGljdGlvbmFyeSBnZXREQkRpY3Rpb25hcnkoKSB7CisgICAgICAgIHJldHVybiBfZGljdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIGRlZmF1bHRzLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nRGVmYXVsdHMgZ2V0TWFwcGluZ0RlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gX2RlZmF1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcHBpbmcgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRGVmYXVsdHMoTWFwcGluZ0RlZmF1bHRzIGRlZmF1bHRzKSB7CisgICAgICAgIF9kZWZhdWx0cyA9IGRlZmF1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTY2hlbWFHcm91cCBnZXRTY2hlbWFHcm91cCgpIHsKKyAgICAgICAgaWYgKF9zY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zY2hlbWEgPSAoKEpEQkNDb25maWd1cmF0aW9uKSBnZXRDb25maWd1cmF0aW9uKCkpLgorICAgICAgICAgICAgICAgIGdldFNjaGVtYUZhY3RvcnlJbnN0YW5jZSgpLnJlYWRTY2hlbWEoKTsKKyAgICAgICAgcmV0dXJuIF9zY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2NoZW1hR3JvdXAoU2NoZW1hR3JvdXAgc2NoZW1hKSB7CisgICAgICAgIF9zY2hlbWEgPSBzY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFsbHMgbWFwcGluZyBzdHJhdGVnaWVzIG9uIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJhdGVneUluc3RhbGxlciBnZXRTdHJhdGVneUluc3RhbGxlcigpIHsKKyAgICAgICAgaWYgKF9pbnN0YWxsZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIF9pbnN0YWxsZXIgPSBuZXcgUnVudGltZVN0cmF0ZWd5SW5zdGFsbGVyKHRoaXMpOworICAgICAgICByZXR1cm4gX2luc3RhbGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxscyBtYXBwaW5nIHN0cmF0ZWdpZXMgb24gY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3RyYXRlZ3lJbnN0YWxsZXIoU3RyYXRlZ3lJbnN0YWxsZXIgaW5zdGFsbGVyKSB7CisgICAgICAgIF9pbnN0YWxsZXIgPSBpbnN0YWxsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBxdWVyeSByZXN1bHQgbWFwcGluZyBmb3IgdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBRdWVyeVJlc3VsdE1hcHBpbmcgZ2V0UXVlcnlSZXN1bHRNYXBwaW5nKENsYXNzIGNscywKKyAgICAgICAgU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGVudkxvYWRlciwgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgUXVlcnlSZXN1bHRNYXBwaW5nIHJlcyA9IGdldFF1ZXJ5UmVzdWx0TWFwcGluZ0ludGVybmFsKGNscywgbmFtZSwKKyAgICAgICAgICAgIGVudkxvYWRlcik7CisgICAgICAgIGlmIChyZXMgPT0gbnVsbCAmJiBtdXN0RXhpc3QpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXF1ZXJ5LXJlcyIsIGNscywgbmFtZSkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybmVkIHRoZSBxdWVyeSByZXN1bHQgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgUXVlcnlSZXN1bHRNYXBwaW5nIGdldFF1ZXJ5UmVzdWx0TWFwcGluZ0ludGVybmFsKENsYXNzIGNscywKKyAgICAgICAgU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY2hlY2sgY2FjaGUKKyAgICAgICAgT2JqZWN0IGtleSA9IGdldFF1ZXJ5UmVzdWx0S2V5KGNscywgbmFtZSk7CisgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZyByZXMgPSAoUXVlcnlSZXN1bHRNYXBwaW5nKSBfcmVzdWx0cy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAvLyBnZXQgbWV0YWRhdGEgZm9yIGNsYXNzLCB3aGljaCB3aWxsIGZpbmQgcmVzdWx0cyBpbiBtZXRhZGF0YSBmaWxlCisgICAgICAgIGlmIChjbHMgIT0gbnVsbCAmJiBnZXRNZXRhRGF0YShjbHMsIGVudkxvYWRlciwgZmFsc2UpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcyA9IChRdWVyeVJlc3VsdE1hcHBpbmcpIF9yZXN1bHRzLmdldChrZXkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChnZXRTb3VyY2VNb2RlKCkgJiBNT0RFX1FVRVJZKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgY2xzID0gZ2V0TWV0YURhdGFGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc3VsdFNldE1hcHBpbmdTY29wZShuYW1lLCBlbnZMb2FkZXIpOworICAgICAgICAvLyBub3QgaW4gY2FjaGU7IGxvYWQKKyAgICAgICAgZ2V0TWV0YURhdGFGYWN0b3J5KCkubG9hZChjbHMsIE1PREVfTUVUQSB8IE1PREVfTUFQUElORywgZW52TG9hZGVyKTsKKyAgICAgICAgcmV0dXJuIChRdWVyeVJlc3VsdE1hcHBpbmcpIF9yZXN1bHRzLmdldChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgY2FjaGVkIHF1ZXJ5IHJlc3VsdCBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFF1ZXJ5UmVzdWx0TWFwcGluZ1tdIGdldFF1ZXJ5UmVzdWx0TWFwcGluZ3MoKSB7CisgICAgICAgIENvbGxlY3Rpb24gdmFsdWVzID0gX3Jlc3VsdHMudmFsdWVzKCk7CisgICAgICAgIHJldHVybiAoUXVlcnlSZXN1bHRNYXBwaW5nW10pIHZhbHVlcy50b0FycmF5CisgICAgICAgICAgICAobmV3IFF1ZXJ5UmVzdWx0TWFwcGluZ1t2YWx1ZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgcXVlcnkgcmVzdWx0IG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZgorICAgICAqIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBRdWVyeVJlc3VsdE1hcHBpbmcgZ2V0Q2FjaGVkUXVlcnlSZXN1bHRNYXBwaW5nCisgICAgICAgIChDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoUXVlcnlSZXN1bHRNYXBwaW5nKSBfcmVzdWx0cy5nZXQoZ2V0UXVlcnlSZXN1bHRLZXkoY2xzLCBuYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcXVlcnkgcmVzdWx0IG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBRdWVyeVJlc3VsdE1hcHBpbmcgYWRkUXVlcnlSZXN1bHRNYXBwaW5nKENsYXNzIGNscywKKyAgICAgICAgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgUXVlcnlSZXN1bHRNYXBwaW5nIHJlcyA9IG5ldyBRdWVyeVJlc3VsdE1hcHBpbmcobmFtZSwgdGhpcyk7CisgICAgICAgIHJlcy5zZXREZWZpbmluZ1R5cGUoY2xzKTsKKyAgICAgICAgX3Jlc3VsdHMucHV0KGdldFF1ZXJ5UmVzdWx0S2V5KHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcXVlcnkgcmVzdWx0IG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZVF1ZXJ5UmVzdWx0TWFwcGluZworICAgICAgICAoUXVlcnlSZXN1bHRNYXBwaW5nIHJlcykgeworICAgICAgICByZXR1cm4gX3Jlc3VsdHMucmVtb3ZlKGdldFF1ZXJ5UmVzdWx0S2V5KHJlcykpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcXVlcnkgcmVzdWx0IG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZVF1ZXJ5UmVzdWx0TWFwcGluZyhDbGFzcyBjbHMsCisgICAgICAgIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfcmVzdWx0cy5yZW1vdmUoZ2V0UXVlcnlSZXN1bHRLZXkoY2xzLCBuYW1lKSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB1bmlxdWUga2V5IGZvciB0aGUgZ2l2ZW4gbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0UXVlcnlSZXN1bHRLZXkoUXVlcnlSZXN1bHRNYXBwaW5nIHJlcykgeworICAgICAgICBpZiAocmVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGdldFF1ZXJ5UmVzdWx0S2V5KHJlcy5nZXREZWZpbmluZ1R5cGUoKSwgcmVzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIGdpdmVuIGNsYXNzIC8gbmFtZS4gVGhlIGNsYXNzIGFyZ3VtZW50CisgICAgICogY2FuIGJlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFF1ZXJ5UmVzdWx0S2V5KENsYXNzIGNscywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldFF1ZXJ5S2V5KGNscywgbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRNYXBwaW5nKENsYXNzIGNscywgQ2xhc3NMb2FkZXIgZW52TG9hZGVyLAorICAgICAgICBib29sZWFuIG11c3RFeGlzdCkgeworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZykgc3VwZXIuZ2V0TWV0YURhdGEoY2xzLCBlbnZMb2FkZXIsIG11c3RFeGlzdCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldE1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZ1tdKSBzdXBlci5nZXRNZXRhRGF0YXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldE1hcHBpbmcoT2JqZWN0IG9pZCwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyLAorICAgICAgICBib29sZWFuIG11c3RFeGlzdCkgeworICAgICAgICByZXR1cm4gKENsYXNzTWFwcGluZykgc3VwZXIuZ2V0TWV0YURhdGEob2lkLCBlbnZMb2FkZXIsIG11c3RFeGlzdCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldEltcGxlbWVudG9yTWFwcGluZ3MoQ2xhc3MgY2xzLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIsIGJvb2xlYW4gbXVzdEV4aXN0KSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NNYXBwaW5nW10pIHN1cGVyLmdldEltcGxlbWVudG9yTWV0YURhdGFzKGNscywgZW52TG9hZGVyLAorICAgICAgICAgICAgbXVzdEV4aXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHN1cGVyLmNsZWFyKCk7CisgICAgICAgIF9zY2hlbWEgPSBudWxsOworICAgICAgICBfcmVzdWx0cy5jbGVhcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVNYXBwaW5nKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICAvLyBtYWtlIHN1cmUgc3VwZXJjbGFzcyByZXNvbHZlZCBmaXJzdDsgcmVzb2x2aW5nIHN1cGVyY2xhc3MgbWF5IGhhdmUKKyAgICAgICAgLy8gcmVzb2x2ZWQgdGhpcyBtYXBwaW5nCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgbWV0YTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHN1cCA9IG1hcHBpbmcuZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgKG1hcHBpbmcuZ2V0UmVzb2x2ZSgpICYgTU9ERV9NQVBQSU5HKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGRlZmluZSBzdXBlcmNsYXNzIGZpZWxkcyBhZnRlciBtYXBwaW5nIGNsYXNzLCBzbyB3ZSBjYW4gdGVsbCB3aGV0aGVyCisgICAgICAgIC8vIHRoZSBjbGFzcyBpcyBtYXBwZWQgYW5kIG5lZWRzIHRvIHJlZGVmaW5lIGFic3RyYWN0IHN1cGVyY2xhc3MgZmllbGRzCisgICAgICAgIGdldFN0cmF0ZWd5SW5zdGFsbGVyKCkuaW5zdGFsbFN0cmF0ZWd5KG1hcHBpbmcpOworICAgICAgICBtYXBwaW5nLmRlZmluZVN1cGVyY2xhc3NGaWVsZHMobWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKQorICAgICAgICAgICAgPT0gbnVsbCk7CisKKyAgICAgICAgLy8gcmVzb2x2ZSBldmVyeXRoaW5nIHRoYXQgZG9lc24ndCBpbnZvbHZlIHJlbGF0aW9ucyB0byBhbGxvdyByZWxhdGlvbgorICAgICAgICAvLyBtYXBwaW5ncyB0byB1c2UgdGhlIG90aGVycyBhcyBqb2luYWJsZXMKKyAgICAgICAgbWFwcGluZy5yZXNvbHZlTm9uUmVsYXRpb25NYXBwaW5ncygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIG5ld0NsYXNzTWV0YURhdGEoQ2xhc3MgdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzTWFwcGluZyh0eXBlLCB0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3NNZXRhRGF0YVtdIG5ld0NsYXNzTWV0YURhdGFBcnJheShpbnQgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NNYXBwaW5nW2xlbmd0aF07CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpZWxkTWV0YURhdGEgbmV3RmllbGRNZXRhRGF0YShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBvd25lcikgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkTWFwcGluZyhuYW1lLCB0eXBlLCAoQ2xhc3NNYXBwaW5nKSBvd25lcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpZWxkTWV0YURhdGFbXSBuZXdGaWVsZE1ldGFEYXRhQXJyYXkoaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkTWFwcGluZ1tsZW5ndGhdOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIG5ld0VtYmVkZGVkQ2xhc3NNZXRhRGF0YShWYWx1ZU1ldGFEYXRhIG93bmVyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NNYXBwaW5nKG93bmVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVmFsdWVNZXRhRGF0YSBuZXdWYWx1ZU1ldGFEYXRhKEZpZWxkTWV0YURhdGEgb3duZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZU1hcHBpbmdJbXBsKChGaWVsZE1hcHBpbmcpIG93bmVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU2VxdWVuY2VNZXRhRGF0YSBuZXdTZXF1ZW5jZU1ldGFEYXRhKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgU2VxdWVuY2VNYXBwaW5nKG5hbWUsIHRoaXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPcmRlciBuZXdWYWx1ZU9yZGVyKEZpZWxkTWV0YURhdGEgb3duZXIsIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIHJldHVybiBuZXcgSkRCQ1ZhbHVlT3JkZXIoKEZpZWxkTWFwcGluZykgb3duZXIsIGFzYyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9yZGVyIG5ld1JlbGF0ZWRGaWVsZE9yZGVyKEZpZWxkTWV0YURhdGEgb3duZXIsCisgICAgICAgIEZpZWxkTWV0YURhdGEgcmVsLCBib29sZWFuIGFzYykgeworICAgICAgICByZXR1cm4gbmV3IEpEQkNSZWxhdGVkRmllbGRPcmRlcigoRmllbGRNYXBwaW5nKSBvd25lciwKKyAgICAgICAgICAgIChGaWVsZE1hcHBpbmcpIHJlbCwgYXNjKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT3JkZXJbXSBuZXdPcmRlckFycmF5KGludCBzaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgSkRCQ09yZGVyW3NpemVdOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB2ZXJzaW9uIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlcnNpb24gbmV3VmVyc2lvbihDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIHJldHVybiBuZXcgVmVyc2lvbihjbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBkaXNjcmltaW5hdG9yIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIERpc2NyaW1pbmF0b3IgbmV3RGlzY3JpbWluYXRvcihDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlzY3JpbWluYXRvcihjbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSByYXcgbWFwcGluZyBpbmZvIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTWFwcGluZ0luZm8gbmV3TWFwcGluZ0luZm8oQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICBDbGFzc01hcHBpbmdJbmZvIGluZm8gPSBuZXcgQ2xhc3NNYXBwaW5nSW5mbygpOworICAgICAgICBpbmZvLnNldENsYXNzTmFtZShjbHMuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSByYXcgbWFwcGluZyBpbmZvIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkTWFwcGluZ0luZm8gbmV3TWFwcGluZ0luZm8oRmllbGRNYXBwaW5nIGZtKSB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGRNYXBwaW5nSW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSByYXcgbWFwcGluZyBpbmZvIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlTWFwcGluZ0luZm8gbmV3TWFwcGluZ0luZm8oVmFsdWVNYXBwaW5nIHZtKSB7CisgICAgICAgIHJldHVybiBuZXcgVmFsdWVNYXBwaW5nSW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSByYXcgbWFwcGluZyBpbmZvIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlcnNpb25NYXBwaW5nSW5mbyBuZXdNYXBwaW5nSW5mbyhWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uTWFwcGluZ0luZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgcmF3IG1hcHBpbmcgaW5mbyBmb3IgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXNjcmltaW5hdG9yTWFwcGluZ0luZm8gbmV3TWFwcGluZ0luZm8oRGlzY3JpbWluYXRvciBkaXNjKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIGNsYXNzJyBuYW1lZCBzdHJhdGVneSwgb3IgcmV0dXJuIG51bGwgaWYgbm8KKyAgICAgKiBuYW1lZCBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NTdHJhdGVneSBuYW1lZFN0cmF0ZWd5KENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjbHMuZ2V0TWFwcGluZ0luZm8oKS5nZXRTdHJhdGVneSgpOworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc1N0cmF0ZWd5KG5hbWUsIGNscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzU3RyYXRlZ3kgaW5zdGFudGlhdGVDbGFzc1N0cmF0ZWd5KFN0cmluZyBuYW1lLAorICAgICAgICBDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKE5vbmVDbGFzc1N0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBOb25lQ2xhc3NTdHJhdGVneS5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMobmFtZSk7CisgICAgICAgIG5hbWUgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUobmFtZSk7CisgICAgICAgIENsYXNzIHN0cmF0ID0gbnVsbDsKKworICAgICAgICAvLyBiYXNlIGFuZCB2ZXJ0aWNhbCBzdHJhdGVnaWVzIHVzZSBzYW1lIGFsaWFzOyBkaWZmZXJlbnRpYXRlIG9uIGpvaW4KKyAgICAgICAgaWYgKEZ1bGxDbGFzc1N0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHN0cmF0ID0gRnVsbENsYXNzU3RyYXRlZ3kuY2xhc3M7CisgICAgICAgIGVsc2UgaWYgKEZsYXRDbGFzc1N0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHN0cmF0ID0gRmxhdENsYXNzU3RyYXRlZ3kuY2xhc3M7CisgICAgICAgIGVsc2UgaWYgKFZlcnRpY2FsQ2xhc3NTdHJhdGVneS5BTElBUy5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICBzdHJhdCA9IFZlcnRpY2FsQ2xhc3NTdHJhdGVneS5jbGFzczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzdHJhdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHN0cmF0ID0gSmF2YVR5cGVzLmNsYXNzRm9yTmFtZShuYW1lLCBjbHMsCisgICAgICAgICAgICAgICAgICAgIENsYXNzU3RyYXRlZ3kuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBDbGFzc1N0cmF0ZWd5IHN0cmF0ZWd5ID0gKENsYXNzU3RyYXRlZ3kpIHN0cmF0Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShzdHJhdGVneSwgZ2V0Q29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIHByb3BzKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJhdGVneTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWNscy1zdHJhdGVneSIsCisgICAgICAgICAgICAgICAgY2xzLCBuYW1lKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgZ2l2ZW4gZmllbGQncyBuYW1lZCBzdHJhdGVneSwgb3IgcmV0dXJuIG51bGwgaWYgbm8KKyAgICAgKiBuYW1lZCBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmllbGRTdHJhdGVneSBuYW1lZFN0cmF0ZWd5KEZpZWxkTWFwcGluZyBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBpbnN0YWxsSGFuZGxlcnMpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWVsZC5nZXRNYXBwaW5nSW5mbygpLmdldFN0cmF0ZWd5KCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAoTm9uZUZpZWxkU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVGaWVsZFN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgU3RyaW5nIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhuYW1lKTsKKyAgICAgICAgbmFtZSA9IENvbmZpZ3VyYXRpb25zLmdldENsYXNzTmFtZShuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGMgPSBKYXZhVHlwZXMuY2xhc3NGb3JOYW1lKG5hbWUsIGZpZWxkLAorICAgICAgICAgICAgICAgIEZpZWxkU3RyYXRlZ3kuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBpZiAoRmllbGRTdHJhdGVneS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGMpKSB7CisgICAgICAgICAgICAgICAgRmllbGRTdHJhdGVneSBzdHJhdCA9IChGaWVsZFN0cmF0ZWd5KSBjLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2Uoc3RyYXQsIGdldENvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdHJhdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbXVzdCBiZSBuYW1lZCBoYW5kbGVyCisgICAgICAgICAgICBpZiAoaW5zdGFsbEhhbmRsZXJzKSB7CisgICAgICAgICAgICAgICAgVmFsdWVIYW5kbGVyIHZoID0gKFZhbHVlSGFuZGxlcikgYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKHZoLCBnZXRDb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIHByb3BzKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5zZXRIYW5kbGVyKHZoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFuZGxlckZpZWxkU3RyYXRlZ3koKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWZpZWxkLXN0cmF0ZWd5IiwKKyAgICAgICAgICAgICAgICBmaWVsZCwgbmFtZSksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIGRpc2NyaW1pbmF0b3IncyBuYW1lZCBzdHJhdGVneSwgb3IgcmV0dXJuIG51bGwKKyAgICAgKiBpZiBubyBuYW1lZCBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclN0cmF0ZWd5IG5hbWVkU3RyYXRlZ3koRGlzY3JpbWluYXRvciBkaXNjcmltKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZGlzY3JpbS5nZXRNYXBwaW5nSW5mbygpLmdldFN0cmF0ZWd5KCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIG5hbWVkIHN0cmF0ZWd5IHByZXNlbnQsIGRpc2NhcmQgaXQgaWYgaXQgbWF0Y2hlcworICAgICAgICAvLyB0aGUgYmFzZSBzdHJhdGVneSwgc28gdGhhdCB3ZSB3b24ndCBjcmVhdGUgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IGRpc2NyaW0uZ2V0Q2xhc3NNYXBwaW5nKCk7CisgICAgICAgIHdoaWxlIChjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGNscyA9IGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgRGlzY3JpbWluYXRvciBiYXNlID0gY2xzLmdldERpc2NyaW1pbmF0b3IoKTsKKyAgICAgICAgaWYgKGJhc2UgIT0gZGlzY3JpbSAmJiBiYXNlLmdldFN0cmF0ZWd5KCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgbmFtZS5lcXVhbHMoYmFzZS5nZXRTdHJhdGVneSgpLmdldEFsaWFzKCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlRGlzY3JpbWluYXRvclN0cmF0ZWd5KG5hbWUsIGRpc2NyaW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlIHRoZSBnaXZlbiBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5LgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXNjcmltaW5hdG9yU3RyYXRlZ3kgaW5zdGFudGlhdGVEaXNjcmltaW5hdG9yU3RyYXRlZ3kKKyAgICAgICAgKFN0cmluZyBuYW1lLCBEaXNjcmltaW5hdG9yIGRpc2NyaW0pIHsKKyAgICAgICAgaWYgKE5vbmVEaXNjcmltaW5hdG9yU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVEaXNjcmltaW5hdG9yU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICBTdHJpbmcgcHJvcHMgPSBDb25maWd1cmF0aW9ucy5nZXRQcm9wZXJ0aWVzKG5hbWUpOworICAgICAgICBuYW1lID0gQ29uZmlndXJhdGlvbnMuZ2V0Q2xhc3NOYW1lKG5hbWUpOworICAgICAgICBDbGFzcyBzdHJhdCA9IG51bGw7CisKKyAgICAgICAgaWYgKENsYXNzTmFtZURpc2NyaW1pbmF0b3JTdHJhdGVneS5BTElBUy5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICBzdHJhdCA9IENsYXNzTmFtZURpc2NyaW1pbmF0b3JTdHJhdGVneS5jbGFzczsKKyAgICAgICAgZWxzZSBpZiAoVmFsdWVNYXBEaXNjcmltaW5hdG9yU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgc3RyYXQgPSBWYWx1ZU1hcERpc2NyaW1pbmF0b3JTdHJhdGVneS5jbGFzczsKKyAgICAgICAgZWxzZSBpZiAoU3ViY2xhc3NKb2luRGlzY3JpbWluYXRvclN0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHN0cmF0ID0gU3ViY2xhc3NKb2luRGlzY3JpbWluYXRvclN0cmF0ZWd5LmNsYXNzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHJhdCA9IEphdmFUeXBlcy5jbGFzc0Zvck5hbWUobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGlzY3JpbS5nZXRDbGFzc01hcHBpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgRGlzY3JpbWluYXRvclN0cmF0ZWd5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgRGlzY3JpbWluYXRvclN0cmF0ZWd5IHN0cmF0ZWd5ID0gKERpc2NyaW1pbmF0b3JTdHJhdGVneSkKKyAgICAgICAgICAgICAgICBzdHJhdC5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2Uoc3RyYXRlZ3ksIGdldENvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICBwcm9wcyk7CisgICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3k7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1kaXNjcmltLXN0cmF0ZWd5IiwKKyAgICAgICAgICAgICAgICBkaXNjcmltLmdldENsYXNzTWFwcGluZygpLCBuYW1lKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgZ2l2ZW4gdmVyc2lvbidzIG5hbWVkIHN0cmF0ZWd5LCBvciByZXR1cm4gbnVsbAorICAgICAqIGlmIG5vIG5hbWVkIHN0cmF0ZWd5LgorICAgICAqLworICAgIHByb3RlY3RlZCBWZXJzaW9uU3RyYXRlZ3kgbmFtZWRTdHJhdGVneShWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSB2ZXJzaW9uLmdldE1hcHBpbmdJbmZvKCkuZ2V0U3RyYXRlZ3koKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgbmFtZWQgc3RyYXRlZ3kgcHJlc2VudCwgZGlzY2FyZCBpdCBpZiBpdCBtYXRjaGVzCisgICAgICAgIC8vIHRoZSBiYXNlIHN0cmF0ZWd5LCBzbyB0aGF0IHdlIHdvbid0IGNyZWF0ZSBhbiBpbmRlcGVuZGVudCBpbnN0YW5jZQorICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gdmVyc2lvbi5nZXRDbGFzc01hcHBpbmcoKTsKKyAgICAgICAgd2hpbGUgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgY2xzID0gY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBWZXJzaW9uIGJhc2UgPSBjbHMuZ2V0VmVyc2lvbigpOworICAgICAgICBpZiAoYmFzZSAhPSB2ZXJzaW9uICYmIGJhc2UuZ2V0U3RyYXRlZ3koKSAhPSBudWxsCisgICAgICAgICAgICAmJiBuYW1lLmVxdWFscyhiYXNlLmdldFN0cmF0ZWd5KCkuZ2V0QWxpYXMoKSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVWZXJzaW9uU3RyYXRlZ3kobmFtZSwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIHZlcnNpb24gc3RyYXRlZ3kuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlcnNpb25TdHJhdGVneSBpbnN0YW50aWF0ZVZlcnNpb25TdHJhdGVneShTdHJpbmcgbmFtZSwKKyAgICAgICAgVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIGlmIChOb25lVmVyc2lvblN0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBOb25lVmVyc2lvblN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgU3RyaW5nIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhuYW1lKTsKKyAgICAgICAgbmFtZSA9IENvbmZpZ3VyYXRpb25zLmdldENsYXNzTmFtZShuYW1lKTsKKyAgICAgICAgQ2xhc3Mgc3RyYXQgPSBudWxsOworCisgICAgICAgIGlmIChOdW1iZXJWZXJzaW9uU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgc3RyYXQgPSBOdW1iZXJWZXJzaW9uU3RyYXRlZ3kuY2xhc3M7CisgICAgICAgIGVsc2UgaWYgKFRpbWVzdGFtcFZlcnNpb25TdHJhdGVneS5BTElBUy5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICBzdHJhdCA9IFRpbWVzdGFtcFZlcnNpb25TdHJhdGVneS5jbGFzczsKKyAgICAgICAgZWxzZSBpZiAoU3RhdGVDb21wYXJpc29uVmVyc2lvblN0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHN0cmF0ID0gU3RhdGVDb21wYXJpc29uVmVyc2lvblN0cmF0ZWd5LmNsYXNzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdHJhdCA9IEphdmFUeXBlcy5jbGFzc0Zvck5hbWUobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5nZXRDbGFzc01hcHBpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgVmVyc2lvblN0cmF0ZWd5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtdmVyc2lvbi1zdHJhdGVneSIsCisgICAgICAgICAgICAgICAgdmVyc2lvbi5nZXRDbGFzc01hcHBpbmcoKSwgbmFtZSksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlVmVyc2lvblN0cmF0ZWd5KHN0cmF0LCB2ZXJzaW9uLCBwcm9wcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIHZlcnNpb24gc3RyYXRlZ3kuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlcnNpb25TdHJhdGVneSBpbnN0YW50aWF0ZVZlcnNpb25TdHJhdGVneShDbGFzcyBzdHJhdCwKKyAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgcHJvcHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZlcnNpb25TdHJhdGVneSBzdHJhdGVneSA9IChWZXJzaW9uU3RyYXRlZ3kpIHN0cmF0Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShzdHJhdGVneSwgZ2V0Q29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIHByb3BzKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJhdGVneTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXZlcnNpb24tc3RyYXRlZ3kiLAorICAgICAgICAgICAgICAgIHZlcnNpb24uZ2V0Q2xhc3NNYXBwaW5nKCksIHN0cmF0ICsgIiIpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVmYXVsdCBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSBnaXZlbiBjbGFzcy4gRG9lcworICAgICAqIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgY3VycmVudCBzdHJhdGVneSwgaWYgYW55LgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc1N0cmF0ZWd5IGRlZmF1bHRTdHJhdGVneShDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0U3RyYXRlZ3koY2xzLCBnZXRTdHJhdGVneUluc3RhbGxlcigpLmlzQWRhcHRpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIGdpdmVuIGNsYXNzLiBEb2VzCisgICAgICogbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBjdXJyZW50IHN0cmF0ZWd5LCBpZiBhbnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzU3RyYXRlZ3kgZGVmYXVsdFN0cmF0ZWd5KENsYXNzTWFwcGluZyBjbHMsCisgICAgICAgIGJvb2xlYW4gYWRhcHRpbmcpIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVtYmVkID0gY2xzLmdldEVtYmVkZGluZ01hcHBpbmcoKTsKKyAgICAgICAgaWYgKGVtYmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHN1cGVyY2xhc3Mgb2YgZW1iZWRkZWQgY2xhc3MgaXNuJ3QgbWFwcGVkCisgICAgICAgICAgICBpZiAoZW1iZWQuZ2V0VHlwZSgpICE9IGNscy5nZXREZXNjcmliZWRUeXBlKCkKKyAgICAgICAgICAgICAgICB8fCBlbWJlZC5nZXRGaWVsZE1hcHBpbmcoKS5nZXRTdHJhdGVneSgpCisgICAgICAgICAgICAgICAgPT0gTm9uZUZpZWxkU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZUNsYXNzU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChlbWJlZC5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PSUQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RJZENsYXNzU3RyYXRlZ3koKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRDbGFzc1N0cmF0ZWd5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNscy5pc0VtYmVkZGVkT25seSgpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVDbGFzc1N0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgT2JqZWN0IHN0cmF0ID0gX2RlZmF1bHRzLmdldFN0cmF0ZWd5KGNscywgYWRhcHRpbmcpOworICAgICAgICBpZiAoc3RyYXQgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc1N0cmF0ZWd5KChTdHJpbmcpIHN0cmF0LCBjbHMpOworICAgICAgICBpZiAoc3RyYXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NTdHJhdGVneSkgc3RyYXQ7CisgICAgICAgIAorICAgICAgICAvLyBzZWUgaWYgdGhlcmUgaXMgYSBkZWNsYXJlZCBoaWVyYXJjaHkgc3RyYXRlZ3kKKyAgICAgICAgQ2xhc3NTdHJhdGVneSBoc3RyYXQgPSBudWxsOworICAgICAgICBmb3IgKENsYXNzTWFwcGluZyBiYXNlID0gY2xzOyBiYXNlICE9IG51bGwgJiYgaHN0cmF0ID09IG51bGw7KSB7CisgICAgICAgICAgICBoc3RyYXQgPSBpbnN0YW50aWF0ZUNsYXNzU3RyYXRlZ3koYmFzZS5nZXRNYXBwaW5nSW5mbygpLgorICAgICAgICAgICAgICAgIGdldEhpZXJhcmNoeVN0cmF0ZWd5KCksIGNscyk7CisgICAgICAgICAgICBiYXNlID0gYmFzZS5nZXRNYXBwZWRQQ1N1cGVyY2xhc3NNYXBwaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgZnVsbCBzdHJhdGVneSBhcyBhcHBsaWVkIHRvIGEgaGllcmFyY2h5IGlzIGEKKyAgICAgICAgLy8gdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIHN0cmF0ZWd5LCBzbyBkb24ndCBtYXAgYWJzdHJhY3QgdHlwZXMKKyAgICAgICAgaWYgKGhzdHJhdCBpbnN0YW5jZW9mIEZ1bGxDbGFzc1N0cmF0ZWd5CisgICAgICAgICAgICAmJiAhY2xzLmlzTWFuYWdlZEludGVyZmFjZSgpCisgICAgICAgICAgICAmJiBNb2RpZmllci5pc0Fic3RyYWN0KGNscy5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVDbGFzc1N0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisgICAgICAgIAorICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gY2xzLmdldE1hcHBlZFBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKHN1cCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGdWxsQ2xhc3NTdHJhdGVneSgpOworICAgICAgICBpZiAoaHN0cmF0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gaHN0cmF0OworICAgICAgICByZXR1cm4gbmV3IEZsYXRDbGFzc1N0cmF0ZWd5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIGdpdmVuIGZpZWxkLiBEb2VzCisgICAgICogbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBuYW1lZCBvciBjdXJyZW50IHN0cmF0ZWd5LCBpZiBhbnkuIElmIGEKKyAgICAgKiBub24tbnVsbCBzdHJhdGVneSBpcyByZXR1cm5lZCwgdGhpcyBtZXRob2QgbWF5IGFzIGEgc2lkZSBlZmZlY3QgaW5zdGFsbAorICAgICAqIHZhbHVlIGhhbmRsZXJzIG9uIHRoZSBmaWVsZCdzIHZhbHVlIG1hcHBpbmdzLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWVsZFN0cmF0ZWd5IGRlZmF1bHRTdHJhdGVneShGaWVsZE1hcHBpbmcgZmllbGQsCisgICAgICAgIGJvb2xlYW4gaW5zdGFsbEhhbmRsZXJzKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0U3RyYXRlZ3koZmllbGQsIGluc3RhbGxIYW5kbGVycywKKyAgICAgICAgICAgIGdldFN0cmF0ZWd5SW5zdGFsbGVyKCkuaXNBZGFwdGluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gZmllbGQuIERvZXMKKyAgICAgKiBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIG5hbWVkIG9yIGN1cnJlbnQgc3RyYXRlZ3ksIGlmIGFueS4gSWYgYQorICAgICAqIG5vbi1udWxsIHN0cmF0ZWd5IGlzIHJldHVybmVkLCB0aGlzIG1ldGhvZCBtYXkgYXMgYSBzaWRlIGVmZmVjdCBpbnN0YWxsCisgICAgICogdmFsdWUgaGFuZGxlcnMgb24gdGhlIGZpZWxkJ3MgdmFsdWUgbWFwcGluZ3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkU3RyYXRlZ3kgZGVmYXVsdFN0cmF0ZWd5KEZpZWxkTWFwcGluZyBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBpbnN0YWxsSGFuZGxlcnMsIGJvb2xlYW4gYWRhcHRpbmcpIHsKKyAgICAgICAgLy8gbm90IHBlcnNpc3RlbnQ/CisgICAgICAgIGlmIChmaWVsZC5nZXRNYW5hZ2VtZW50KCkgIT0gZmllbGQuTUFOQUdFX1BFUlNJU1RFTlQKKyAgICAgICAgICAgIHx8IGZpZWxkLmlzVmVyc2lvbigpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVGaWVsZFN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmIChmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKS5nZXRTdHJhdGVneSgpID09CisgICAgICAgICAgICBOb25lQ2xhc3NTdHJhdGVneS5nZXRJbnN0YW5jZSgpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVGaWVsZFN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIG5hbWVkIGhhbmRsZXIgZmlyc3QKKyAgICAgICAgVmFsdWVIYW5kbGVyIGhhbmRsZXIgPSBuYW1lZEhhbmRsZXIoZmllbGQpOworICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFsbEhhbmRsZXJzKQorICAgICAgICAgICAgICAgIGZpZWxkLnNldEhhbmRsZXIoaGFuZGxlcik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhbmRsZXJGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmllbGQuaXNTZXJpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIGlmIChfZGljdC5tYXhFbWJlZGRlZEJsb2JTaXplICE9IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF4RW1iZWRkZWRCbG9iRmllbGRTdHJhdGVneSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG1hcHBlZCBzdHJhdGVneQorICAgICAgICAgICAgT2JqZWN0IHN0cmF0ID0gbWFwcGVkU3RyYXRlZ3koZmllbGQsIGZpZWxkLmdldFR5cGUoKSwgYWRhcHRpbmcpOworICAgICAgICAgICAgaWYgKHN0cmF0IGluc3RhbmNlb2YgRmllbGRTdHJhdGVneSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZpZWxkU3RyYXRlZ3kpIHN0cmF0OworICAgICAgICAgICAgaWYgKHN0cmF0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbEhhbmRsZXJzKQorICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRIYW5kbGVyKChWYWx1ZUhhbmRsZXIpIHN0cmF0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhbmRsZXJGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3Iga25vd24gZmllbGQgc3RyYXRlZ2llcworICAgICAgICBpZiAoIWZpZWxkLmlzU2VyaWFsaXplZCgpICYmIChmaWVsZC5nZXRUeXBlKCkgPT0gYnl0ZVtdLmNsYXNzCisgICAgICAgICAgICB8fCBmaWVsZC5nZXRUeXBlKCkgPT0gQnl0ZVtdLmNsYXNzKSkgeworICAgICAgICAgICAgaWYgKF9kaWN0Lm1heEVtYmVkZGVkQmxvYlNpemUgIT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXhFbWJlZGRlZEJ5dGVBcnJheUZpZWxkU3RyYXRlZ3koKTsKKyAgICAgICAgfSBlbHNlIGlmICghZmllbGQuaXNTZXJpYWxpemVkKCkKKyAgICAgICAgICAgICYmIChmaWVsZC5nZXRUeXBlKCkgPT0gY2hhcltdLmNsYXNzCisgICAgICAgICAgICB8fCBmaWVsZC5nZXRUeXBlKCkgPT0gQ2hhcmFjdGVyW10uY2xhc3MpKSB7CisgICAgICAgICAgICBpZiAoX2RpY3QubWF4RW1iZWRkZWRDbG9iU2l6ZSAhPSAtMSAmJiBpc0Nsb2IoZmllbGQsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1heEVtYmVkZGVkQ2hhckFycmF5RmllbGRTdHJhdGVneSgpOworICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC5pc1NlcmlhbGl6ZWQoKSkgeworICAgICAgICAgICAgRmllbGRTdHJhdGVneSBzdHJhdCA9IGRlZmF1bHRUeXBlU3RyYXRlZ3koZmllbGQsIGluc3RhbGxIYW5kbGVycywKKyAgICAgICAgICAgICAgICBhZGFwdGluZyk7CisgICAgICAgICAgICBpZiAoc3RyYXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyYXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3IgZGVmYXVsdCBoYW5kbGVyCisgICAgICAgIGhhbmRsZXIgPSBkZWZhdWx0SGFuZGxlcihmaWVsZCwgYWRhcHRpbmcpOworICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFsbEhhbmRsZXJzKQorICAgICAgICAgICAgICAgIGZpZWxkLnNldEhhbmRsZXIoaGFuZGxlcik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhbmRsZXJGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWZhdWx0IHRvIGJsb2IKKyAgICAgICAgaWYgKGluc3RhbGxIYW5kbGVycykgeworICAgICAgICAgICAgaWYgKGdldExvZygpLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJuby1maWVsZC1zdHJhdGVneSIsIGZpZWxkKSk7CisgICAgICAgICAgICBmaWVsZC5zZXRTZXJpYWxpemVkKHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChfZGljdC5tYXhFbWJlZGRlZEJsb2JTaXplID09IC0xKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFsbEhhbmRsZXJzKQorICAgICAgICAgICAgICAgIGZpZWxkLnNldEhhbmRsZXIoQmxvYlZhbHVlSGFuZGxlci5nZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFuZGxlckZpZWxkU3RyYXRlZ3koKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE1heEVtYmVkZGVkQmxvYkZpZWxkU3RyYXRlZ3koKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJ1aWx0LWluIHN0cmF0ZWd5IGZvciB0aGUgZmllbGQncyB0eXBlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkU3RyYXRlZ3kgZGVmYXVsdFR5cGVTdHJhdGVneShGaWVsZE1hcHBpbmcgZmllbGQsCisgICAgICAgIGJvb2xlYW4gaW5zdGFsbEhhbmRsZXJzLCBib29sZWFuIGFkYXB0aW5nKSB7CisgICAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmVGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKCFpc0Nsb2IoZmllbGQsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgICAgICAgICAgaWYgKF9kaWN0Lm1heEVtYmVkZGVkQ2xvYlNpemUgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF4RW1iZWRkZWRDbG9iRmllbGRTdHJhdGVneSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVtYmVkRmllbGRTdHJhdGVneSgpOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlTWFwcGluZygpLmlzTWFwcGVkKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXVzZVVudHlwZWRQQ0hhbmRsZXIoZmllbGQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uRmllbGRTdHJhdGVneSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIFZhbHVlTWFwcGluZyBlbGVtID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgICAgICAgICBWYWx1ZUhhbmRsZXIgZWhhbmRsZXIgPSBuYW1lZEhhbmRsZXIoZWxlbSk7CisgICAgICAgICAgICAgICAgaWYgKGVoYW5kbGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVoYW5kbGVyID0gZGVmYXVsdEhhbmRsZXIoZWxlbSk7CisgICAgICAgICAgICAgICAgaWYgKGVoYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyQ29sbGVjdGlvblN0cmF0ZWd5KGZpZWxkLCBlaGFuZGxlciwgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsSGFuZGxlcnMpOworICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDCisgICAgICAgICAgICAgICAgICAgICYmICFlbGVtLmlzU2VyaWFsaXplZCgpICYmICFlbGVtLmlzRW1iZWRkZWRQQygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VJbnZlcnNlS2V5TWFwcGluZyhmaWVsZCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uQ29sbGVjdGlvbkludmVyc2VLZXlGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25Db2xsZWN0aW9uVGFibGVGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIFZhbHVlTWFwcGluZyBrZXkgPSBmaWVsZC5nZXRLZXlNYXBwaW5nKCk7CisgICAgICAgICAgICAgICAgVmFsdWVIYW5kbGVyIGtoYW5kbGVyID0gbmFtZWRIYW5kbGVyKGtleSk7CisgICAgICAgICAgICAgICAgaWYgKGtoYW5kbGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGtoYW5kbGVyID0gZGVmYXVsdEhhbmRsZXIoa2V5KTsKKyAgICAgICAgICAgICAgICBWYWx1ZU1hcHBpbmcgdmFsID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgICAgICAgICBWYWx1ZUhhbmRsZXIgdmhhbmRsZXIgPSBuYW1lZEhhbmRsZXIodmFsKTsKKyAgICAgICAgICAgICAgICBpZiAodmhhbmRsZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdmhhbmRsZXIgPSBkZWZhdWx0SGFuZGxlcih2YWwpOworICAgICAgICAgICAgICAgIGJvb2xlYW4ga3JlbCA9IGtoYW5kbGVyID09IG51bGwgCisgICAgICAgICAgICAgICAgICAgICYmIGtleS5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5QQworICAgICAgICAgICAgICAgICAgICAmJiAha2V5LmlzU2VyaWFsaXplZCgpICYmICFrZXkuaXNFbWJlZGRlZFBDKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB2cmVsID0gdmhhbmRsZXIgPT0gbnVsbCAKKyAgICAgICAgICAgICAgICAgICAgJiYgdmFsLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDCisgICAgICAgICAgICAgICAgICAgICYmICF2YWwuaXNTZXJpYWxpemVkKCkgJiYgIXZhbC5pc0VtYmVkZGVkUEMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWtyZWwgJiYgdnJlbCAmJiBrZXkuZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUludmVyc2VLZXlNYXBwaW5nKGZpZWxkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25NYXBJbnZlcnNlS2V5RmllbGRTdHJhdGVneSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uTWFwVGFibGVGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgha3JlbCAmJiBraGFuZGxlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoIXZyZWwgJiYgdmhhbmRsZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJNYXBTdHJhdGVneShmaWVsZCwga2hhbmRsZXIsIHZoYW5kbGVyLCBrcmVsLAorICAgICAgICAgICAgICAgICAgICB2cmVsLCBpbnN0YWxsSGFuZGxlcnMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sbGVjdGlvbiBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaGFuZGxlciwgb3IgbnVsbAorICAgICAqIGlmIG5vbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkU3RyYXRlZ3kgaGFuZGxlckNvbGxlY3Rpb25TdHJhdGVneShGaWVsZE1hcHBpbmcgZmllbGQsIAorICAgICAgICBWYWx1ZUhhbmRsZXIgZWhhbmRsZXIsIGJvb2xlYW4gaW5zdGFsbEhhbmRsZXJzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwIHN0cmF0ZWd5IGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZSBoYW5kbGVycyAvIHJlbGF0aW9ucywKKyAgICAgKiBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkU3RyYXRlZ3kgaGFuZGxlck1hcFN0cmF0ZWd5KEZpZWxkTWFwcGluZyBmaWVsZCwgCisgICAgICAgIFZhbHVlSGFuZGxlciBraGFuZGxlciwgVmFsdWVIYW5kbGVyIHZoYW5kbGVyLCBib29sZWFuIGtyZWwsIAorICAgICAgICBib29sZWFuIHZyZWwsICBib29sZWFuIGluc3RhbGxIYW5kbGVycykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgaGludHMgaW4gbWFwcGluZyBkYXRhIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgZ2l2ZW4gcmVsYXRpb24KKyAgICAgKiBmaWVsZCBzaG91bGQgdXNlIGFuIGludmVyc2UgZm9yZWlnbiBrZXkgb3IgYW4gYXNzb2NpYXRpb24gdGFibGUgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlSW52ZXJzZUtleU1hcHBpbmcoRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWFwcGluZyBtYXBwZWQgPSBmaWVsZC5nZXRNYXBwZWRCeU1hcHBpbmcoKTsKKyAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobWFwcGVkLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG1hcHBlZC5nZXRFbGVtZW50KCkuZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWFwcGVkLWJ5IiwgZmllbGQsCisgICAgICAgICAgICAgICAgbWFwcGVkKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3aXRob3V0IGEgbWFwcGVkLWJ5LCB3ZSBoYXZlIHRvIGxvb2sgZm9yIGNsdWVzIGFzIHRvIHRoZSBtYXBwaW5nLgorICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBhbnl0aGluZyB3aXRoIGVsZW1lbnQgZm9yZWlnbiBrZXkgY29sdW1ucyBidXQgbm8gam9pbgorICAgICAgICAvLyBjb2x1bW5zIG9yIHRhYmxlIHVzZXMgYW4gaW52ZXJzZSBmb3JlaWduIGtleSwgYW5kIGFueXRoaW5nIGVsc2UgdXNlcworICAgICAgICAvLyBhbiBhc3NvY2lhdGlvbiB0YWJsZQorICAgICAgICBGaWVsZE1hcHBpbmdJbmZvIGluZm8gPSBmaWVsZC5nZXRNYXBwaW5nSW5mbygpOworICAgICAgICBWYWx1ZU1hcHBpbmcgZWxlbSA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiBpbmZvLmdldFRhYmxlTmFtZSgpID09IG51bGwgJiYgaW5mby5nZXRDb2x1bW5zKCkuaXNFbXB0eSgpCisgICAgICAgICAgICAmJiAhZWxlbS5nZXRWYWx1ZUluZm8oKS5nZXRDb2x1bW5zKCkuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBnaXZlbiB2YWx1ZSBhZ2FpbnN0IG1hcHBlZCBzdHJhdGVnaWVzLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IG1hcHBlZFN0cmF0ZWd5KFZhbHVlTWFwcGluZyB2YWwsIENsYXNzIHR5cGUsCisgICAgICAgIGJvb2xlYW4gYWRhcHRpbmcpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlID09IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIE9iamVjdCBzdHJhdCA9IF9kZWZhdWx0cy5nZXRTdHJhdGVneSh2YWwsIHR5cGUsIGFkYXB0aW5nKTsKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwpCisgICAgICAgICAgICBzdHJhdCA9IF9oYW5kbGVycy5nZXQodHlwZS5nZXROYW1lKCkpOworCisgICAgICAgIC8vIHJlY3Vyc2Ugb24gc3VwZXJjbGFzcyBzbyB0aGF0LCBmb3IgZXhhbXBsZSwgYSByZWdpc3RlcmVkIGhhbmRsZXIKKyAgICAgICAgLy8gZm9yIGphdmEubGFuZy5FbnVtIHdpbGwgd29yayBvbiBhbGwgZW51bXMKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbWFwcGVkU3RyYXRlZ3kodmFsLCB0eXBlLmdldFN1cGVyY2xhc3MoKSwgYWRhcHRpbmcpOworICAgICAgICBpZiAoIShzdHJhdCBpbnN0YW5jZW9mIFN0cmluZykpCisgICAgICAgICAgICByZXR1cm4gc3RyYXQ7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBzdHJhdDsKKyAgICAgICAgaWYgKE5vbmVGaWVsZFN0cmF0ZWd5LkFMSUFTLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBOb25lRmllbGRTdHJhdGVneS5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMobmFtZSk7CisgICAgICAgIG5hbWUgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUobmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IEphdmFUeXBlcy5jbGFzc0Zvck5hbWUobmFtZSwgdmFsLAorICAgICAgICAgICAgICAgIEZpZWxkU3RyYXRlZ3kuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKG8sIGdldENvbmZpZ3VyYXRpb24oKSwgcHJvcHMpOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tYXBwZWQtc3RyYXRlZ3kiLAorICAgICAgICAgICAgICAgIHZhbCwgbmFtZSksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIHZhbHVlJ3MgbmFtZWQgaGFuZGxlciwgb3IgcmV0dXJuIG51bGwgaWYgbm8KKyAgICAgKiBuYW1lZCBoYW5kbGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBWYWx1ZUhhbmRsZXIgbmFtZWRIYW5kbGVyKFZhbHVlTWFwcGluZyB2YWwpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSB2YWwuZ2V0VmFsdWVJbmZvKCkuZ2V0U3RyYXRlZ3koKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZyBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMobmFtZSk7CisgICAgICAgIG5hbWUgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUobmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjID0gSmF2YVR5cGVzLmNsYXNzRm9yTmFtZShuYW1lLCB2YWwsCisgICAgICAgICAgICAgICAgVmFsdWVIYW5kbGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgaWYgKFZhbHVlSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGMpKSB7CisgICAgICAgICAgICAgICAgVmFsdWVIYW5kbGVyIHZoID0gKFZhbHVlSGFuZGxlcikgYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKHZoLCBnZXRDb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIHByb3BzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gbmFtZWQgZmllbGQgc3RyYXRlZ3kKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXZhbHVlLWhhbmRsZXIiLAorICAgICAgICAgICAgICAgIHZhbCwgbmFtZSksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGhhbmRsZXIgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuIERvZXMKKyAgICAgKiBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIG5hbWVkIGhhbmRsZXIsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmFsdWVIYW5kbGVyIGRlZmF1bHRIYW5kbGVyKFZhbHVlTWFwcGluZyB2YWwpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKHZhbCwgZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pc0FkYXB0aW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVmYXVsdCBoYW5kbGVyIHRvIHVzZSBmb3IgdGhlIGdpdmVuIHZhbHVlLiBEb2VzCisgICAgICogbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBuYW1lZCBoYW5kbGVyLCBpZiBhbnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlSGFuZGxlciBkZWZhdWx0SGFuZGxlcihWYWx1ZU1hcHBpbmcgdmFsLCBib29sZWFuIGFkYXB0aW5nKSB7CisgICAgICAgIGlmICh2YWwuaXNTZXJpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIGlmIChfZGljdC5tYXhFbWJlZGRlZEJsb2JTaXplICE9IC0xKQorICAgICAgICAgICAgICAgIHdhcm5NYXhFbWJlZGRlZCh2YWwsIF9kaWN0Lm1heEVtYmVkZGVkQmxvYlNpemUpOworICAgICAgICAgICAgcmV0dXJuIEJsb2JWYWx1ZUhhbmRsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBoYW5kbGVyID0gbWFwcGVkU3RyYXRlZ3kodmFsLCB2YWwuZ2V0VHlwZSgpLCBhZGFwdGluZyk7CisgICAgICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgVmFsdWVIYW5kbGVyKQorICAgICAgICAgICAgcmV0dXJuIChWYWx1ZUhhbmRsZXIpIGhhbmRsZXI7CisKKyAgICAgICAgaWYgKHZhbC5nZXRUeXBlKCkgPT0gYnl0ZVtdLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoX2RpY3QubWF4RW1iZWRkZWRCbG9iU2l6ZSAhPSAtMSkKKyAgICAgICAgICAgICAgICB3YXJuTWF4RW1iZWRkZWQodmFsLCBfZGljdC5tYXhFbWJlZGRlZEJsb2JTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlQXJyYXlWYWx1ZUhhbmRsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsLmdldFR5cGUoKSA9PSBjaGFyW10uY2xhc3MKKyAgICAgICAgICAgIHx8IHZhbC5nZXRUeXBlKCkgPT0gQ2hhcmFjdGVyW10uY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChpc0Nsb2IodmFsLCB0cnVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhckFycmF5U3RyZWFtVmFsdWVIYW5kbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gQ2hhckFycmF5VmFsdWVIYW5kbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHZhbC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdJTlRFR0VSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHREVDSU1BTDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk5VTUJFUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DQUxFTkRBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPQ0FMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlVmFsdWVIYW5kbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKGlzQ2xvYih2YWwsIHRydWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xvYlZhbHVlSGFuZGxlci5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVWYWx1ZUhhbmRsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgICAgIGlmICghdmFsLmdldFR5cGVNYXBwaW5nKCkuaXNNYXBwZWQoKQorICAgICAgICAgICAgICAgICAgICAmJiB1c2VVbnR5cGVkUENIYW5kbGVyKHZhbCkpIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW50eXBlZFBDVmFsdWVIYW5kbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBVbnR5cGVkUENWYWx1ZUhhbmRsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9JRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdElkVmFsdWVIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgZ2VuZXJpYyB1bnR5cGVkIFBDIGhhbmRsZXIgZm9yIHRoZQorICAgICAqIGdpdmVuIHVubWFwcGVkIHJlbGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VVbnR5cGVkUENIYW5kbGVyKFZhbHVlTWFwcGluZyB2YWwpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbCA9IHZhbC5nZXRUeXBlTWFwcGluZygpOworICAgICAgICByZXR1cm4gcmVsLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9VTktOT1dOCisgICAgICAgICAgICB8fCAocmVsLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9BUFBMSUNBVElPTgorICAgICAgICAgICAgJiYgKHJlbC5nZXRQcmltYXJ5S2V5RmllbGRzKCkubGVuZ3RoID09IDAKKyAgICAgICAgICAgIHx8ICghcmVsLmlzT3BlbkpQQUlkZW50aXR5KCkgJiYgTW9kaWZpZXIuaXNBYnN0cmFjdAorICAgICAgICAgICAgKHJlbC5nZXRPYmplY3RJZFR5cGUoKS5nZXRNb2RpZmllcnMoKSkpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGZvciBoaW50cyBhcyB0byB3aGV0aGVyIHRoZSBnaXZlbiBjb2x1bW4gaXMgYSBDTE9CLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb2IoVmFsdWVNYXBwaW5nIHZhbCwgYm9vbGVhbiB3YXJuKSB7CisgICAgICAgIExpc3QgY29scyA9IHZhbC5nZXRWYWx1ZUluZm8oKS5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzLnNpemUoKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIENvbHVtbiBjb2wgPSAoQ29sdW1uKSBjb2xzLmdldCgwKTsKKyAgICAgICAgaWYgKGNvbC5nZXRTaXplKCkgIT0gLTEgJiYgY29sLmdldFR5cGUoKSAhPSBUeXBlcy5DTE9CKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChfZGljdC5nZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkNMT0IpICE9IFR5cGVzLkNMT0IpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKHdhcm4gJiYgX2RpY3QubWF4RW1iZWRkZWRDbG9iU2l6ZSAhPSAtMSkKKyAgICAgICAgICAgIHdhcm5NYXhFbWJlZGRlZCh2YWwsIF9kaWN0Lm1heEVtYmVkZGVkQ2xvYlNpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYXJuIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGJlaW5nIG1hcHBlZCB0byBhIGhhbmRsZXIgdGhhdCB3aWxsIG5vdAorICAgICAqIGJlIGFibGUgdG8gc3RvcmUgbGFyZ2UgbG9icy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2Fybk1heEVtYmVkZGVkKFZhbHVlTWFwcGluZyB2YWwsIGludCBzaXplKSB7CisgICAgICAgIGlmIChnZXRMb2coKS5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICBnZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJtYXgtZW1iZWQtbG9iIiwgdmFsLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHNpemUpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIGdpdmVuIGRpc2NyaW1pbmF0b3IuCisgICAgICogRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgc3RyYXRlZ3ksIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclN0cmF0ZWd5IGRlZmF1bHRTdHJhdGVneShEaXNjcmltaW5hdG9yIGRpc2NyaW0pIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRTdHJhdGVneShkaXNjcmltLCBnZXRTdHJhdGVneUluc3RhbGxlcigpLmlzQWRhcHRpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIGdpdmVuIGRpc2NyaW1pbmF0b3IuCisgICAgICogRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgc3RyYXRlZ3ksIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclN0cmF0ZWd5IGRlZmF1bHRTdHJhdGVneShEaXNjcmltaW5hdG9yIGRpc2NyaW0sCisgICAgICAgIGJvb2xlYW4gYWRhcHRpbmcpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IGRpc2NyaW0uZ2V0Q2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGlmIChjbHMuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVEaXNjcmltaW5hdG9yU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSA9PSBudWxsCisgICAgICAgICAgICAmJiAoY2xzLmdldFN0cmF0ZWd5KCkgPT0gTm9uZUNsYXNzU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKQorICAgICAgICAgICAgfHwgTW9kaWZpZXIuaXNGaW5hbChkaXNjcmltLmdldENsYXNzTWFwcGluZygpLmdldERlc2NyaWJlZFR5cGUoKS4KKyAgICAgICAgICAgIGdldE1vZGlmaWVycygpKSkpCisgICAgICAgICAgICByZXR1cm4gTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneS5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIE9iamVjdCBzdHJhdCA9IF9kZWZhdWx0cy5nZXRTdHJhdGVneShkaXNjcmltLCBhZGFwdGluZyk7CisgICAgICAgIGlmIChzdHJhdCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZURpc2NyaW1pbmF0b3JTdHJhdGVneSgoU3RyaW5nKSBzdHJhdCwgZGlzY3JpbSk7CisgICAgICAgIGlmIChzdHJhdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChEaXNjcmltaW5hdG9yU3RyYXRlZ3kpIHN0cmF0OworCisgICAgICAgIGlmIChjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3VwZXJjbGFzc0Rpc2NyaW1pbmF0b3JTdHJhdGVneSgpOworICAgICAgICBpZiAoZGlzY3JpbS5nZXRNYXBwaW5nSW5mbygpLmdldFZhbHVlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVNYXBEaXNjcmltaW5hdG9yU3RyYXRlZ3koKTsKKyAgICAgICAgaWYgKGNscy5nZXRNYXBwZWRQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBOb25lRGlzY3JpbWluYXRvclN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmIChhZGFwdGluZyB8fCBfZGVmYXVsdHMuZGVmYXVsdE1pc3NpbmdJbmZvKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzTmFtZURpc2NyaW1pbmF0b3JTdHJhdGVneSgpOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9ICgoSkRCQ0NvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKSkuCisgICAgICAgICAgICBnZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBpZiAoZGljdC5qb2luU3ludGF4ID09IEpvaW5TeW50YXhlcy5TWU5UQVhfVFJBRElUSU9OQUwpCisgICAgICAgICAgICByZXR1cm4gTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneS5nZXRJbnN0YW5jZSgpOworICAgICAgICByZXR1cm4gbmV3IFN1YmNsYXNzSm9pbkRpc2NyaW1pbmF0b3JTdHJhdGVneSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVmYXVsdCBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uLgorICAgICAqIERvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBjdXJyZW50IHN0cmF0ZWd5LCBpZiBhbnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlcnNpb25TdHJhdGVneSBkZWZhdWx0U3RyYXRlZ3koVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0U3RyYXRlZ3kodmVyc2lvbiwgZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pc0FkYXB0aW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVmYXVsdCBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uLgorICAgICAqIERvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBjdXJyZW50IHN0cmF0ZWd5LCBpZiBhbnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlcnNpb25TdHJhdGVneSBkZWZhdWx0U3RyYXRlZ3koVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICBib29sZWFuIGFkYXB0aW5nKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSB2ZXJzaW9uLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoY2xzLmdldEVtYmVkZGluZ01ldGFEYXRhKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBOb25lVmVyc2lvblN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmIChjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgPT0gbnVsbAorICAgICAgICAgICAgJiYgY2xzLmdldFN0cmF0ZWd5KCkgPT0gTm9uZUNsYXNzU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKSkKKyAgICAgICAgICAgIHJldHVybiBOb25lVmVyc2lvblN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgT2JqZWN0IHN0cmF0ID0gX2RlZmF1bHRzLmdldFN0cmF0ZWd5KHZlcnNpb24sIGFkYXB0aW5nKTsKKyAgICAgICAgaWYgKHN0cmF0IGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlVmVyc2lvblN0cmF0ZWd5KChTdHJpbmcpIHN0cmF0LCB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKHN0cmF0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKFZlcnNpb25TdHJhdGVneSkgc3RyYXQ7CisKKyAgICAgICAgaWYgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdXBlcmNsYXNzVmVyc2lvblN0cmF0ZWd5KCk7CisKKyAgICAgICAgRmllbGRNYXBwaW5nIHZmaWVsZCA9IHZlcnNpb24uZ2V0Q2xhc3NNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXRWZXJzaW9uRmllbGRNYXBwaW5nKCk7CisgICAgICAgIGlmICh2ZmllbGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U3RyYXRlZ3kodmVyc2lvbiwgdmZpZWxkKTsKKyAgICAgICAgaWYgKGFkYXB0aW5nIHx8IF9kZWZhdWx0cy5kZWZhdWx0TWlzc2luZ0luZm8oKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyVmVyc2lvblN0cmF0ZWd5KCk7CisgICAgICAgIHJldHVybiBOb25lVmVyc2lvblN0cmF0ZWd5LmdldEluc3RhbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHZlcnNpb24gc3RyYXRlZ3ksIGdpdmVuIGEgdmVyc2lvbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVyc2lvblN0cmF0ZWd5IGRlZmF1bHRTdHJhdGVneShWZXJzaW9uIHZlcnMsCisgICAgICAgIEZpZWxkTWFwcGluZyB2ZmllbGQpIHsKKyAgICAgICAgc3dpdGNoICh2ZmllbGQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNBTEVOREFSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wVmVyc2lvblN0cmF0ZWd5KCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJWZXJzaW9uU3RyYXRlZ3koKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmVWZXJzaW9uU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkKKyAgICB7CisgICAgICAgIHN1cGVyLmVuZENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gKEpEQkNDb25maWd1cmF0aW9uKSBnZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIF9kaWN0ID0gY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBpZiAoX2RlZmF1bHRzID09IG51bGwpCisgICAgICAgICAgICBfZGVmYXVsdHMgPSBjb25mLmdldE1hcHBpbmdEZWZhdWx0c0luc3RhbmNlKCk7CisgICAgICAgIGlmIChfc2NoZW1hICE9IG51bGwgJiYgX3NjaGVtYSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZSkgeworICAgICAgICAgICAgKChDb25maWd1cmFibGUpIF9zY2hlbWEpLnNldENvbmZpZ3VyYXRpb24oY29uZik7CisgICAgICAgICAgICAoKENvbmZpZ3VyYWJsZSkgX3NjaGVtYSkuc3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAoKENvbmZpZ3VyYWJsZSkgX3NjaGVtYSkuZW5kQ29uZmlndXJhdGlvbigpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdTdHJhdGVneUluc3RhbGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdTdHJhdGVneUluc3RhbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTBjZjcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTWFwcGluZ1N0cmF0ZWd5SW5zdGFsbGVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCisvKioKKyAqIEluc3RhbGxlciB1c2VkIGR1cmluZyBtYXBwaW5nIHRoYXQgYXR0ZW1wdHMgdG8gdXNlIHRoZSBnaXZlbiBtYXBwaW5nCisgKiBpbmZvcm1hdGlvbiAoaWYgYW55KSwgYW5kIGZhaWxzIGlmIGl0IGRvZXMgbm90IHdvcmsuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgTWFwcGluZ1N0cmF0ZWd5SW5zdGFsbGVyCisgICAgZXh0ZW5kcyBTdHJhdGVneUluc3RhbGxlciB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIE1hcHBpbmdTdHJhdGVneUluc3RhbGxlcihNYXBwaW5nUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBzdXBlcihyZXBvcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGluZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgQ2xhc3NTdHJhdGVneSBzdHJhdCA9IHJlcG9zLm5hbWVkU3RyYXRlZ3koY2xzKTsKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwpCisgICAgICAgICAgICBzdHJhdCA9IHJlcG9zLmRlZmF1bHRTdHJhdGVneShjbHMsIHRydWUpOworICAgICAgICBjbHMuc2V0U3RyYXRlZ3koc3RyYXQsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIGNscy5zZXRTb3VyY2VNb2RlKGNscy5NT0RFX01BUFBJTkcsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxTdHJhdGVneShGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgRmllbGRTdHJhdGVneSBzdHJhdGVneSA9IHJlcG9zLm5hbWVkU3RyYXRlZ3koZmllbGQsIHRydWUpOworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gcmVwb3MuZGVmYXVsdFN0cmF0ZWd5KGZpZWxkLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgZmllbGQuc2V0U3RyYXRlZ3koc3RyYXRlZ3ksIEJvb2xlYW4uVFJVRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICBWZXJzaW9uU3RyYXRlZ3kgc3RyYXQgPSByZXBvcy5uYW1lZFN0cmF0ZWd5KHZlcnNpb24pOworICAgICAgICBpZiAoc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmF0ID0gcmVwb3MuZGVmYXVsdFN0cmF0ZWd5KHZlcnNpb24sIHRydWUpOworICAgICAgICB2ZXJzaW9uLnNldFN0cmF0ZWd5KHN0cmF0LCBCb29sZWFuLlRSVUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxTdHJhdGVneShEaXNjcmltaW5hdG9yIGRpc2NyaW0pIHsKKyAgICAgICAgRGlzY3JpbWluYXRvclN0cmF0ZWd5IHN0cmF0ID0gcmVwb3MubmFtZWRTdHJhdGVneShkaXNjcmltKTsKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwpCisgICAgICAgICAgICBzdHJhdCA9IHJlcG9zLmRlZmF1bHRTdHJhdGVneShkaXNjcmltLCB0cnVlKTsKKyAgICAgICAgZGlzY3JpbS5zZXRTdHJhdGVneShzdHJhdCwgQm9vbGVhbi5UUlVFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTWFwcGluZ1Rvb2wuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNjIwNGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTWFwcGluZ1Rvb2wuamF2YQpAQCAtMCwwICsxLDExMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTZXE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRHluYW1pY1NjaGVtYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkxhenlTY2hlbWFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5YTUxTY2hlbWFTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuQ2xhc3NBcmdQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlNlcnZpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuUXVlcnlNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlU3RyYXRlZ2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5HZW5lcmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIFRvb2wgZm9yIG1hbmlwdWxhdGluZyBjbGFzcyBtYXBwaW5ncyBhbmQgYXNzb2NpYXRlZCBzY2hlbWEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIE1hcHBpbmdUb29sCisgICAgaW1wbGVtZW50cyBNZXRhRGF0YU1vZGVzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9BQ1RJT05fTk9ORSA9ICJub25lIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BREQgPSAiYWRkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVGUkVTSCA9ICJyZWZyZXNoIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQlVJTERfU0NIRU1BID0gImJ1aWxkU2NoZW1hIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRFJPUCA9ICJkcm9wIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVkFMSURBVEUgPSAidmFsaWRhdGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FWFBPUlQgPSAiZXhwb3J0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU1QT1JUID0gImltcG9ydCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFDVElPTlMgPSBuZXcgU3RyaW5nW117CisgICAgICAgIEFDVElPTl9BREQsCisgICAgICAgIEFDVElPTl9SRUZSRVNILAorICAgICAgICBBQ1RJT05fQlVJTERfU0NIRU1BLAorICAgICAgICBBQ1RJT05fRFJPUCwKKyAgICAgICAgQUNUSU9OX1ZBTElEQVRFLAorICAgICAgICBBQ1RJT05fRVhQT1JULAorICAgICAgICBBQ1RJT05fSU1QT1JULAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKE1hcHBpbmdUb29sLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgSkRCQ0NvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgX2xvZzsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfYWN0aW9uOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfbWV0YTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBfbW9kZTsKKworICAgIHByaXZhdGUgTWFwcGluZ1JlcG9zaXRvcnkgX3JlcG9zID0gbnVsbDsKKyAgICBwcml2YXRlIFNjaGVtYUdyb3VwIF9zY2hlbWEgPSBudWxsOworICAgIHByaXZhdGUgU2NoZW1hVG9vbCBfc2NoZW1hVG9vbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtYUFjdGlvbnMgPSBTY2hlbWFUb29sLkFDVElPTl9BREQ7CisgICAgcHJpdmF0ZSBib29sZWFuIF9yZWFkU2NoZW1hID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wa3MgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZrcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaW5kZXhlcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc2VxcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9kcm9wVW51c2VkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lnbm9yZUVycm9ycyA9IGZhbHNlOworICAgIHByaXZhdGUgRmlsZSBfZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBXcml0ZXIgX21hcHBpbmdXcml0ZXIgPSBudWxsOworICAgIHByaXZhdGUgV3JpdGVyIF9zY2hlbWFXcml0ZXIgPSBudWxsOworCisgICAgLy8gYnVmZmVyIG1ldGFkYXRhcyB0byBiZSBkcm9wcGVkCisgICAgcHJpdmF0ZSBTZXQgX2Ryb3BDbHMgPSBudWxsOworICAgIHByaXZhdGUgU2V0IF9kcm9wTWFwID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZsdXNoID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9mbHVzaFNjaGVtYSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBjb25maWd1cmF0aW9uIGFuZCBhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIE1hcHBpbmdUb29sKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBhY3Rpb24sIGJvb2xlYW4gbWV0YSkgeworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfTUVUQURBVEEpOworICAgICAgICBfbWV0YSA9IG1ldGE7CisKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgX2FjdGlvbiA9IEFDVElPTl9SRUZSRVNIOworICAgICAgICBlbHNlIGlmICghQXJyYXlzLmFzTGlzdChBQ1RJT05TKS5jb250YWlucyhhY3Rpb24pKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uID09ICIgKyBhY3Rpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfYWN0aW9uID0gYWN0aW9uOworCisgICAgICAgIGlmIChtZXRhICYmIEFDVElPTl9BREQuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgX21vZGUgPSBNT0RFX01FVEE7CisgICAgICAgIGVsc2UgaWYgKG1ldGEgJiYgQUNUSU9OX0RST1AuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgX21vZGUgPSBNT0RFX01FVEEgfCBNT0RFX01BUFBJTkcgfCBNT0RFX1FVRVJZOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfbW9kZSA9IE1PREVfTUFQUElORzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0aW9uIHN1cHBsaWVkIG9uIGNvbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9hY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgYWN0aW9uIHdvcmtzIG9uIG1ldGFkYXRhIGFzIHdlbGwgYXMgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRhRGF0YUFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlbWEgbW9kaWZpY2F0aW9uIHBvbGljeSwgb3IgPGNvZGU+bm9uZTwvY29kZT4uIFNlZSB0aGUKKyAgICAgKiBBQ1RJT04gY29uc3RhbnRzIGluIHtAbGluayBTY2hlbWFUb29sfS4gTWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkCisgICAgICogbGlzdCBvZiB2YWx1ZXMuIERlZmF1bHRzIHRvIHtAbGluayBTY2hlbWFUb29sI0FDVElPTl9BRER9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hQWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX3NjaGVtYUFjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtYSBtb2RpZmljYXRpb24gcG9saWN5LCBvciA8Y29kZT5ub25lPC9jb2RlPi4gU2VlIHRoZQorICAgICAqIEFDVElPTiBjb25zdGFudHMgaW4ge0BsaW5rIFNjaGVtYVRvb2x9LiBNYXkgYmUgYSBjb21tYS1zZXBhcmF0ZWQKKyAgICAgKiBsaXN0IG9mIHZhbHVlcy4gRGVmYXVsdHMgdG8ge0BsaW5rIFNjaGVtYVRvb2wjQUNUSU9OX0FERH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hQWN0aW9uKFN0cmluZyBzY2hlbWFBY3Rpb24pIHsKKyAgICAgICAgX3NjaGVtYUFjdGlvbnMgPSBzY2hlbWFBY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgdG8gcmVhZCB0aGUgZW50aXJlIHNjaGVtYSBiZWZvcmUgbWFwcGluZy4KKyAgICAgKiBMZWF2aW5nIHRoaXMgb3B0aW9uIGZhbHNlIHNhdmVzIHRpbWUsIGJ1dCBpcyBkYW5nZXJvdXMgd2hlbiBhZGRpbmcKKyAgICAgKiBuZXcgbWFwcGluZ3MsIGJlY2F1c2Ugd2l0aG91dCBmdWxsIGtub3dsZWRnZSBvZiB0aGUgZXhpc3Rpbmcgc2NoZW1hIHRoZQorICAgICAqIG1hcHBpbmcgdG9vbCBtaWdodCBjcmVhdGUgdGFibGVzIG9yIGluZGV4ZXMgdGhhdCBjb25mbGljdCB3aXRoCisgICAgICogZXhpc3RpbmcgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWFkU2NoZW1hKCkgeworICAgICAgICByZXR1cm4gX3JlYWRTY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgdG8gcmVhZCB0aGUgZW50aXJlIHNjaGVtYSBiZWZvcmUgbWFwcGluZy4KKyAgICAgKiBMZWF2aW5nIHRoaXMgb3B0aW9uIGZhbHNlIHNhdmVzIHRpbWUsIGJ1dCBpcyBkYW5nZXJvdXMgd2hlbiBhZGRpbmcKKyAgICAgKiBuZXcgbWFwcGluZ3MsIGJlY2F1c2Ugd2l0aG91dCBmdWxsIGtub3dsZWRnZSBvZiB0aGUgZXhpc3Rpbmcgc2NoZW1hIHRoZQorICAgICAqIG1hcHBpbmcgdG9vbCBtaWdodCBjcmVhdGUgdGFibGVzIG9yIGluZGV4ZXMgdGhhdCBjb25mbGljdCB3aXRoCisgICAgICogZXhpc3RpbmcgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkU2NoZW1hKGJvb2xlYW4gcmVhZFNjaGVtYSkgeworICAgICAgICBfcmVhZFNjaGVtYSA9IHJlYWRTY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBtYW5pcHVsYXRlIHNlcXVlbmNlcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZXF1ZW5jZXMoKSB7CisgICAgICAgIHJldHVybiBfc2VxczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIG1hbmlwdWxhdGUgc2VxdWVuY2VzLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcXVlbmNlcyhib29sZWFuIHNlcXMpIHsKKyAgICAgICAgX3NlcXMgPSBzZXFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgaW5kZXhlcyBvbiBleGlzdGluZyB0YWJsZXMgc2hvdWxkIGJlIG1hbmlwdWxhdGVkLgorICAgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEluZGV4ZXMoKSB7CisgICAgICAgIHJldHVybiBfaW5kZXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGluZGV4ZXMgb24gZXhpc3RpbmcgdGFibGVzIHNob3VsZCBiZSBtYW5pcHVsYXRlZC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleGVzKGJvb2xlYW4gaW5kZXhlcykgeworICAgICAgICBfaW5kZXhlcyA9IGluZGV4ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBmb3JlaWduIGtleXMgb24gZXhpc3RpbmcgdGFibGVzIHNob3VsZCBiZSBtYW5pcHVsYXRlZC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGb3JlaWduS2V5cygpIHsKKyAgICAgICAgcmV0dXJuIF9ma3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBmb3JlaWduIGtleXMgb24gZXhpc3RpbmcgdGFibGVzIHNob3VsZCBiZSBtYW5pcHVsYXRlZC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JlaWduS2V5cyhib29sZWFuIGZrcykgeworICAgICAgICBfZmtzID0gZmtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgcHJpbWFyeSBrZXlzIG9uIGV4aXN0aW5nIHRhYmxlcyBzaG91bGQgYmUgbWFuaXB1bGF0ZWQuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJpbWFyeUtleXMoKSB7CisgICAgICAgIHJldHVybiBfcGtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgcHJpbWFyeSBrZXlzIG9uIGV4aXN0aW5nIHRhYmxlcyBzaG91bGQgYmUgbWFuaXB1bGF0ZWQuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleXMoYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgX3BrcyA9IHBrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHNjaGVtYSBjb21wb25lbnRzIHRoYXQgYXJlIHVudXNlZCBieSBhbnkgbWFwcGluZyB3aWxsIGJlCisgICAgICogZHJvcHBlZCBmcm9tIHRoaXMgdG9vbCdzIHtAbGluayBTY2hlbWFHcm91cH0sIGFuZCwgZGVwZW5kaW5nIG9uCisgICAgICogdGhlIHNjaGVtYSBhY3Rpb24sIGZyb20gdGhlIGRhdGFiYXNlLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERyb3BVbnVzZWRDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gX2Ryb3BVbnVzZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBzY2hlbWEgY29tcG9uZW50cyB0aGF0IGFyZSB1bnVzZWQgYnkgYW55IG1hcHBpbmcgd2lsbCBiZQorICAgICAqIGRyb3BwZWQgZnJvbSB0aGlzIHRvb2wncyB7QGxpbmsgU2NoZW1hR3JvdXB9LCBhbmQsIGRlcGVuZGluZyBvbgorICAgICAqIHRoZSBzY2hlbWEgYWN0aW9uLCBmcm9tIHRoZSBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wVW51c2VkQ29tcG9uZW50cyhib29sZWFuIGRyb3BVbnVzZWQpIHsKKyAgICAgICAgX2Ryb3BVbnVzZWQgPSBkcm9wVW51c2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgYW5kIFNRTCBlcnJvcnMgc2hvdWxkIGNhdXNlIGEgZmFpbHVyZSBvciBqdXN0IGlzc3VlIGEgd2FybmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiBpZ25vcmVFcnJvcnMpIHsKKyAgICAgICAgX2lnbm9yZUVycm9ycyA9IGlnbm9yZUVycm9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFuZCBTUUwgZXJyb3JzIHNob3VsZCBjYXVzZSBhIGZhaWx1cmUgb3IganVzdCBpc3N1ZSBhIHdhcm5pbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlRXJyb3JzKCkgeworICAgICAgICByZXR1cm4gX2lnbm9yZUVycm9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtYSB0b29sIHRvIHVzZSBmb3Igc2NoZW1hIG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNjaGVtYVRvb2wgbmV3U2NoZW1hVG9vbChTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIGlmIChTQ0hFTUFfQUNUSU9OX05PTkUuZXF1YWxzKGFjdGlvbikpCisgICAgICAgICAgICBhY3Rpb24gPSBudWxsOworICAgICAgICBTY2hlbWFUb29sIHRvb2wgPSBuZXcgU2NoZW1hVG9vbChfY29uZiwgYWN0aW9uKTsKKyAgICAgICAgdG9vbC5zZXRJZ25vcmVFcnJvcnMoZ2V0SWdub3JlRXJyb3JzKCkpOworICAgICAgICB0b29sLnNldFByaW1hcnlLZXlzKGdldFByaW1hcnlLZXlzKCkpOworICAgICAgICB0b29sLnNldEZvcmVpZ25LZXlzKGdldEZvcmVpZ25LZXlzKCkpOworICAgICAgICB0b29sLnNldEluZGV4ZXMoZ2V0SW5kZXhlcygpKTsKKyAgICAgICAgdG9vbC5zZXRTZXF1ZW5jZXMoZ2V0U2VxdWVuY2VzKCkpOworICAgICAgICByZXR1cm4gdG9vbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjaGVtYSB0b29sIHRvIHVzZSBmb3Igc2NoZW1hIG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFUb29sKFNjaGVtYVRvb2wgdG9vbCkgeworICAgICAgICBfc2NoZW1hVG9vbCA9IHRvb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSB0byBleHBvcnQgdGhlIHBsYW5uZWQgc2NoZW1hIHRvIGFzIGFuIFhNTCBkb2N1bWVudC4KKyAgICAgKiBJZiBub24tbnVsbCwgdGhlbiB0aGUgZGF0YWJhc2Ugc2NoZW1hIHdpbGwgbm90IGJlIGFsdGVyZWQuCisgICAgICovCisgICAgcHVibGljIFdyaXRlciBnZXRTY2hlbWFXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiBfc2NoZW1hV3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gdG8gZXhwb3J0IHRoZSBwbGFubmVkIHNjaGVtYSB0byBhcyBhbiBYTUwgZG9jdW1lbnQuCisgICAgICogSWYgbm9uLW51bGwsIHRoZW4gdGhlIGRhdGFiYXNlIHNjaGVtYSB3aWxsIG5vdCBiZSBhbHRlcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYVdyaXRlcihXcml0ZXIgc2NoZW1hV3JpdGVyKSB7CisgICAgICAgIF9zY2hlbWFXcml0ZXIgPSBzY2hlbWFXcml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSB0byBleHBvcnQgdGhlIHBsYW5uZWQgbWFwcGluZ3MgdG8gYXMgYW4gWE1MIGRvY3VtZW50LgorICAgICAqIElmIG5vbi1udWxsLCB0aGVuIHRoZSBtYXBwaW5nIHJlcG9zaXRvcnkgd2lsbCBub3QgYmUgYWx0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JpdGVyIGdldE1hcHBpbmdXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiBfbWFwcGluZ1dyaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIHRvIGV4cG9ydCB0aGUgcGxhbm5lZCBtYXBwaW5ncyB0byBhcyBhbiBYTUwgZG9jdW1lbnQuCisgICAgICogSWYgbm9uLW51bGwsIHRoZW4gdGhlIG1hcHBpbmcgcmVwb3NpdG9yeSB3aWxsIG5vdCBiZSBhbHRlcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBpbmdXcml0ZXIoV3JpdGVyIG1hcHBpbmdXcml0ZXIpIHsKKyAgICAgICAgX21hcHBpbmdXcml0ZXIgPSBtYXBwaW5nV3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIGFkZGluZyBtZXRhZGF0YSwgdGhlIG1ldGFkYXRhIGZpbGUgdG8gYWRkIHRvLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldE1ldGFEYXRhRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIGFkZGluZyBtZXRhZGF0YSwgdGhlIG1ldGFkYXRhIGZpbGUgdG8gYWRkIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgX2ZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVwb3NpdG9yeSB0byB1c2UgdG8gYWNjZXNzIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgICAgICogRGVmYXVsdHMgdG8gYSBuZXcge0BsaW5rIE1hcHBpbmdSZXBvc2l0b3J5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGluZ1JlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgaWYgKF9yZXBvcyA9PSBudWxsKSB7CisgICAgICAgICAgICBfcmVwb3MgPSBfY29uZi5uZXdNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBfcmVwb3Muc2V0U2NoZW1hR3JvdXAoZ2V0U2NoZW1hR3JvdXAoKSk7CisgICAgICAgICAgICBfcmVwb3Muc2V0VmFsaWRhdGUoX3JlcG9zLlZBTElEQVRFX1VORU5IQU5DRUQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3JlcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVwb3NpdG9yeSB0byB1c2UgdG8gYWNjZXNzIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShNYXBwaW5nUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBfcmVwb3MgPSByZXBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtYSBncm91cCB0byB1c2UgaW4gbWFwcGluZy4gSWYgbm9uZSBoYXMgYmVlbiBzZXQsIHRoZQorICAgICAqIHNjaGVtYSB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgZ2V0U2NoZW1hR3JvdXAoKSB7CisgICAgICAgIGlmIChfc2NoZW1hID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfYWN0aW9uLmluZGV4T2YoQUNUSU9OX0JVSUxEX1NDSEVNQSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBEeW5hbWljU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gbmV3IER5bmFtaWNTY2hlbWFGYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5zZXRDb25maWd1cmF0aW9uKF9jb25mKTsKKyAgICAgICAgICAgICAgICBfc2NoZW1hID0gZmFjdG9yeTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX3JlYWRTY2hlbWEgCisgICAgICAgICAgICAgICAgfHwgY29udGFpbnMoX3NjaGVtYUFjdGlvbnMsU2NoZW1hVG9vbC5BQ1RJT05fUkVUQUlOKQorICAgICAgICAgICAgICAgIHx8IGNvbnRhaW5zKF9zY2hlbWFBY3Rpb25zLFNjaGVtYVRvb2wuQUNUSU9OX1JFRlJFU0gpKSB7CisgICAgICAgICAgICAgICAgX3NjaGVtYSA9IChTY2hlbWFHcm91cCkgbmV3U2NoZW1hVG9vbChudWxsKS5nZXREQlNjaGVtYUdyb3VwKCkuCisgICAgICAgICAgICAgICAgICAgIGNsb25lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdpdGggdGhpcyB3ZSdsbCBqdXN0IHJlYWQgdGFibGVzIGFzIGRpZmZlcmVudCBtYXBwaW5ncworICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZW0KKyAgICAgICAgICAgICAgICBMYXp5U2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gbmV3IExhenlTY2hlbWFGYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5zZXRDb25maWd1cmF0aW9uKF9jb25mKTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5LnNldFByaW1hcnlLZXlzKGdldFByaW1hcnlLZXlzKCkpOworICAgICAgICAgICAgICAgIGZhY3Rvcnkuc2V0Rm9yZWlnbktleXMoZ2V0Rm9yZWlnbktleXMoKSk7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5zZXRJbmRleGVzKGdldEluZGV4ZXMoKSk7CisgICAgICAgICAgICAgICAgX3NjaGVtYSA9IGZhY3Rvcnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2NoZW1hLmdldFNjaGVtYXMoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBfc2NoZW1hLmFkZFNjaGVtYSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2NoZW1hIHRvIHVzZSBpbiBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdyb3VwKFNjaGVtYUdyb3VwIHNjaGVtYSkgeworICAgICAgICBfc2NoZW1hID0gc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBpbnRlcm5hbCByZXBvc2l0b3J5LiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGFmdGVyCisgICAgICogZXZlcnkge0BsaW5rICNyZWNvcmR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfcmVwb3MgPSBudWxsOworICAgICAgICBfc2NoZW1hID0gbnVsbDsKKyAgICAgICAgX3NjaGVtYVRvb2wgPSBudWxsOworICAgICAgICBfZmx1c2ggPSBmYWxzZTsKKyAgICAgICAgX2ZsdXNoU2NoZW1hID0gZmFsc2U7CisgICAgICAgIGlmIChfZHJvcENscyAhPSBudWxsKQorICAgICAgICAgICAgX2Ryb3BDbHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKF9kcm9wTWFwICE9IG51bGwpCisgICAgICAgICAgICBfZHJvcE1hcC5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZHMgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSB0byBib3RoIHRoZSBtYXBwaW5ncyBhbmQgdGhlCisgICAgICogYXNzb2NpYXRlZCBzY2hlbWEsIGFuZCBjbGVhcnMgdGhlIHRvb2wgZm9yIGZ1cnRoZXIgdXNlLiBUaGlzIGFsc28KKyAgICAgKiBpbnZvbHZlcyBjbGVhcmluZyB0aGUgaW50ZXJuYWwgbWFwcGluZyByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY29yZCgpIHsKKyAgICAgICAgcmVjb3JkKG51bGwpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkKE1hcHBpbmdUb29sLkZsYWdzIGZsYWdzKSB7CisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBNZXRhRGF0YUZhY3RvcnkgaW8gPSByZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3M7CisgICAgICAgIGlmICghQUNUSU9OX0RST1AuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgbWFwcGluZ3MgPSByZXBvcy5nZXRNYXBwaW5ncygpOworICAgICAgICBlbHNlIGlmIChfZHJvcE1hcCAhPSBudWxsKQorICAgICAgICAgICAgbWFwcGluZ3MgPSAoQ2xhc3NNYXBwaW5nW10pIF9kcm9wTWFwLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IENsYXNzTWFwcGluZ1tfZHJvcE1hcC5zaXplKCldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWFwcGluZ3MgPSBuZXcgQ2xhc3NNYXBwaW5nWzBdOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX2Ryb3BDbHMgIT0gbnVsbCAmJiAhX2Ryb3BDbHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NbXSBjbHMgPSAoQ2xhc3NbXSkgX2Ryb3BDbHMudG9BcnJheQorICAgICAgICAgICAgICAgICAgICAobmV3IENsYXNzW19kcm9wQ2xzLnNpemUoKV0pOworICAgICAgICAgICAgICAgIGlmICghaW8uZHJvcChjbHMsIF9tb2RlLCBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJiYWQtZHJvcCIsIF9kcm9wQ2xzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfZmx1c2hTY2hlbWEpIHsKKyAgICAgICAgICAgICAgICAvLyBkcm9wIHBvcnRpb25zIG9mIHRoZSBrbm93biBzY2hlbWEgdGhhdCBubyBtYXBwaW5nIHVzZXMsIGFuZAorICAgICAgICAgICAgICAgIC8vIGFkZCBzZXF1ZW5jZXMgdXNlZCBmb3IgdmFsdWUgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgIGlmIChfZHJvcFVudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgZHJvcFVudXNlZFNjaGVtYUNvbXBvbmVudHMobWFwcGluZ3MpOworICAgICAgICAgICAgICAgIGFkZFNlcXVlbmNlQ29tcG9uZW50cyhtYXBwaW5ncyk7CisKKyAgICAgICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBzY2hlbWF0b29sIGFzIGxvbmcgYXMgd2UncmUgZG9pbmcgc29tZSBzY2hlbWEKKyAgICAgICAgICAgICAgICAvLyBhY3Rpb24gYW5kIHRoZSB1c2VyIGRvZXNuJ3QganVzdCB3YW50IGFuIHhtbCBvdXRwdXQKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzY2hlbWFBY3Rpb25zID0gX3NjaGVtYUFjdGlvbnMuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYUFjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFTQ0hFTUFfQUNUSU9OX05PTkUuZXF1YWxzKHNjaGVtYUFjdGlvbnNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoX3NjaGVtYVdyaXRlciA9PSBudWxsIHx8IChfc2NoZW1hVG9vbCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgX3NjaGVtYVRvb2wuZ2V0V3JpdGVyKCkgIT0gbnVsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUb29sIHRvb2wgPSBuZXdTY2hlbWFUb29sKHNjaGVtYUFjdGlvbnNbaV0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmUgdGhlIHRvb2wgd2l0aCBhZGRpdGlvbmFsIHNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2wuc2V0RHJvcFRhYmxlcyhmbGFncy5kcm9wVGFibGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sLnNldERyb3BTZXF1ZW5jZXMoZmxhZ3MuZHJvcFNlcXVlbmNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbC5zZXRXcml0ZXIoZmxhZ3Muc3FsV3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sLnNldE9wZW5KUEFUYWJsZXMoZmxhZ3Mub3BlbmpwYVRhYmxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvb2wuc2V0U2NoZW1hR3JvdXAoZ2V0U2NoZW1hR3JvdXAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b29sLnJ1bigpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9vbC5yZWNvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHhtbCBvdXRwdXQgb2Ygc2NoZW1hPworICAgICAgICAgICAgICAgIGlmIChfc2NoZW1hV3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBwbGFubmVkIHNjaGVtYSB0byB0aGUgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVNlcmlhbGl6ZXIgc2VyID0gbmV3IFhNTFNjaGVtYVNlcmlhbGl6ZXIoX2NvbmYpOworICAgICAgICAgICAgICAgICAgICBzZXIuYWRkQWxsKGdldFNjaGVtYUdyb3VwKCkpOworICAgICAgICAgICAgICAgICAgICBzZXIuc2VyaWFsaXplKF9zY2hlbWFXcml0ZXIsIHNlci5QUkVUVFkpOworICAgICAgICAgICAgICAgICAgICBfc2NoZW1hV3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFfZmx1c2gpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBRdWVyeU1ldGFEYXRhW10gcXVlcmllcyA9IHJlcG9zLmdldFF1ZXJ5TWV0YURhdGFzKCk7CisgICAgICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhW10gc2VxcyA9IHJlcG9zLmdldFNlcXVlbmNlTWV0YURhdGFzKCk7CisgICAgICAgICAgICBNYXAgb3V0cHV0ID0gbnVsbDsKKworICAgICAgICAgICAgLy8gaWYgd2UncmUgb3V0cHV0dGluZyB0byBzdHJlYW0sIHNldCBhbGwgbWV0YXMgdG8gc2FtZSBmaWxlIHNvCisgICAgICAgICAgICAvLyB0aGV5IGdldCBwbGFjZWQgaW4gc2luZ2xlIHN0cmluZworICAgICAgICAgICAgaWYgKF9tYXBwaW5nV3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIEZpbGUgdG1wID0gbmV3IEZpbGUoIm9wZW5qcGF0bXAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nc1tpXS5zZXRTb3VyY2UodG1wLCBtYXBwaW5nc1tpXS5TUkNfT1RIRVIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcXVlcmllc1tpXS5zZXRTb3VyY2UodG1wLCBxdWVyaWVzW2ldLmdldFNvdXJjZVNjb3BlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBxdWVyaWVzW2ldLlNSQ19PVEhFUik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzZXFzW2ldLnNldFNvdXJjZSh0bXAsIHNlcXNbaV0uZ2V0U291cmNlU2NvcGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcXNbaV0uU1JDX09USEVSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RvcmUKKyAgICAgICAgICAgIGlmICghaW8uc3RvcmUobWFwcGluZ3MsIHF1ZXJpZXMsIHNlcXMsIF9tb2RlLCBvdXRwdXQpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXN0b3JlIikpOworCisgICAgICAgICAgICAvLyB3cml0ZSB0byBzdHJlYW0KKyAgICAgICAgICAgIGlmIChfbWFwcGluZ1dyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKF9tYXBwaW5nV3JpdGVyKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG91dHB1dC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKFN0cmluZykgaXRyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJvcHMgc2NoZW1hIGNvbXBvbmVudHMgdGhhdCBhcHBlYXIgdG8gYmUgdW51c2VkIGZyb20gdGhlIGxvY2FsCisgICAgICogY29weSBvZiB0aGUgc2NoZW1hIGdyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcm9wVW51c2VkU2NoZW1hQ29tcG9uZW50cyhDbGFzc01hcHBpbmdbXSBtYXBwaW5ncykgeworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1hcHBpbmdzW2ldLnJlZlNjaGVtYUNvbXBvbmVudHMoKTsKKyAgICAgICAgICAgIG1hcHBpbmdzW2ldLmdldERpc2NyaW1pbmF0b3IoKS5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgICAgICAgICBtYXBwaW5nc1tpXS5nZXRWZXJzaW9uKCkucmVmU2NoZW1hQ29tcG9uZW50cygpOworICAgICAgICAgICAgZmllbGRzID0gbWFwcGluZ3NbaV0uZ2V0RGVmaW5lZEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmllbGRzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgIGZpZWxkc1tqXS5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbHNvIGFsbG93IHRoZSBkYmRpY3Rpb25hcnkgdG8gcmVmIGFueSBzY2hlbWEgY29tcG9uZW50cyB0aGF0CisgICAgICAgIC8vIGl0IGFkZHMgYXBhcnQgZnJvbSBtYXBwaW5ncworICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IGdldFNjaGVtYUdyb3VwKCk7CisgICAgICAgIFNjaGVtYVtdIHNjaGVtYXMgPSBncm91cC5nZXRTY2hlbWFzKCk7CisgICAgICAgIFRhYmxlW10gdGFibGVzOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFibGVzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFibGVzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgIGRpY3QucmVmU2NoZW1hQ29tcG9uZW50cyh0YWJsZXNbal0pOworICAgICAgICB9CisKKyAgICAgICAgZ3JvdXAucmVtb3ZlVW51c2VkQ29tcG9uZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0YWJsZXMgdXNlZCBieSBzZXF1ZW5jZXMgdG8gdGhlIGdpdmVuIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU2VxdWVuY2VDb21wb25lbnRzKENsYXNzTWFwcGluZ1tdIG1hcHBpbmdzKSB7CisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gZ2V0U2NoZW1hR3JvdXAoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGFkZFNlcXVlbmNlQ29tcG9uZW50cyhtYXBwaW5nc1tpXSwgZ3JvdXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0YWJsZXMgdXNlZCBieSBzZXF1ZW5jZXMgdG8gdGhlIGdpdmVuIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU2VxdWVuY2VDb21wb25lbnRzKENsYXNzTWFwcGluZyBtYXBwaW5nLAorICAgICAgICBTY2hlbWFHcm91cCBncm91cCkgeworICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhIHNtZCA9IG1hcHBpbmcuZ2V0SWRlbnRpdHlTZXF1ZW5jZU1ldGFEYXRhKCk7CisgICAgICAgIFNlcSBzZXEgPSBudWxsOworICAgICAgICBpZiAoc21kICE9IG51bGwpCisgICAgICAgICAgICBzZXEgPSBzbWQuZ2V0SW5zdGFuY2UobnVsbCk7CisgICAgICAgIGVsc2UgaWYgKG1hcHBpbmcuZ2V0SWRlbnRpdHlTdHJhdGVneSgpID09IFZhbHVlU3RyYXRlZ2llcy5OQVRJVkUKKyAgICAgICAgICAgIHx8IChtYXBwaW5nLmdldElkZW50aXR5U3RyYXRlZ3koKSA9PSBWYWx1ZVN0cmF0ZWdpZXMuTk9ORQorICAgICAgICAgICAgJiYgbWFwcGluZy5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01hcHBpbmcuSURfREFUQVNUT1JFKSkKKyAgICAgICAgICAgIHNlcSA9IF9jb25mLmdldFNlcXVlbmNlSW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoc2VxIGluc3RhbmNlb2YgSkRCQ1NlcSkKKyAgICAgICAgICAgICgoSkRCQ1NlcSkgc2VxKS5hZGRTY2hlbWEobWFwcGluZywgZ3JvdXApOworCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZtZHM7CisgICAgICAgIGlmIChtYXBwaW5nLmdldEVtYmVkZGluZ01ldGFEYXRhKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGZtZHMgPSBtYXBwaW5nLmdldERlZmluZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZtZHMgPSBtYXBwaW5nLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzbWQgPSBmbWRzW2ldLmdldFZhbHVlU2VxdWVuY2VNZXRhRGF0YSgpOworICAgICAgICAgICAgaWYgKHNtZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VxID0gc21kLmdldEluc3RhbmNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChzZXEgaW5zdGFuY2VvZiBKREJDU2VxKQorICAgICAgICAgICAgICAgICAgICAoKEpEQkNTZXEpIHNlcSkuYWRkU2NoZW1hKG1hcHBpbmcsIGdyb3VwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm1kc1tpXS5nZXRFbWJlZGRlZE1hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFkZFNlcXVlbmNlQ29tcG9uZW50cyhmbWRzW2ldLmdldEVtYmVkZGVkTWFwcGluZygpLCBncm91cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLworICAgIC8vIEFjdGlvbnMKKyAgICAvLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogUnVuIHRoZSBjb25maWd1cmVkIGFjdGlvbiBvbiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKENsYXNzIGNscykgeworICAgICAgICBpZiAoQUNUSU9OX0FERC5lcXVhbHMoX2FjdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChfbWV0YSkKKyAgICAgICAgICAgICAgICBhZGRNZXRhKGNscyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkKGNscyk7CisgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX1JFRlJFU0guZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgcmVmcmVzaChjbHMpOworICAgICAgICBlbHNlIGlmIChBQ1RJT05fQlVJTERfU0NIRU1BLmVxdWFscyhfYWN0aW9uKSkKKyAgICAgICAgICAgIGJ1aWxkU2NoZW1hKGNscyk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9EUk9QLmVxdWFscyhfYWN0aW9uKSkKKyAgICAgICAgICAgIGRyb3AoY2xzKTsKKyAgICAgICAgZWxzZSBpZiAoQUNUSU9OX1ZBTElEQVRFLmVxdWFscyhfYWN0aW9uKSkKKyAgICAgICAgICAgIHZhbGlkYXRlKGNscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZChDbGFzcyBjbHMpIHsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICByZXBvcy5zZXRTdHJhdGVneUluc3RhbGxlcihuZXcgTWFwcGluZ1N0cmF0ZWd5SW5zdGFsbGVyKHJlcG9zKSk7CisgICAgICAgIGlmIChnZXRNYXBwaW5nKHJlcG9zLCBjbHMsIHRydWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9mbHVzaCA9IHRydWU7CisgICAgICAgICAgICBfZmx1c2hTY2hlbWEgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZSwgb3IgbnVsbCBpZiB0aGUgdHlwZSBpcworICAgICAqIHBlcnNpc3RlbmNlLWF3YXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWFwcGluZyBnZXRNYXBwaW5nKE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zLCBDbGFzcyBjbHMsCisgICAgICAgIGJvb2xlYW4gdmFsaWRhdGUpIHsKKyAgICAgICAgLy8gdGhpcyB3aWxsIHBhcnNlIGFsbCBwb3NzaWJsZSBtZXRhZGF0YSByc3JjcyBsb29raW5nIGZvciBjbHMsIHNvCisgICAgICAgIC8vIHdpbGwgZGV0ZWN0IGlmIHAtYXdhcmUKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcgPSByZXBvcy5nZXRNYXBwaW5nKGNscywgbnVsbCwgZmFsc2UpOworICAgICAgICBpZiAobWFwcGluZyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmc7CisgICAgICAgIGlmICghdmFsaWRhdGUgfHwgY2xzLmlzSW50ZXJmYWNlKCkgCisgICAgICAgICAgICB8fCByZXBvcy5nZXRQZXJzaXN0ZW5jZUF3YXJlKGNscykgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLW1ldGEiLCBjbHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhKENsYXNzIGNscykgeworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgX2ZsdXNoID0gdHJ1ZTsKKyAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSBnZXRSZXBvc2l0b3J5KCk7CisgICAgICAgIHJlcG9zLnNldFJlc29sdmUoTU9ERV9NQVBQSU5HLCBmYWxzZSk7CisgICAgICAgIE1ldGFEYXRhRmFjdG9yeSBmYWN0b3J5ID0gcmVwb3MuZ2V0TWV0YURhdGFGYWN0b3J5KCk7CisgICAgICAgIGZhY3RvcnkuZ2V0RGVmYXVsdHMoKS5zZXRJZ25vcmVOb25QZXJzaXN0ZW50KGZhbHNlKTsKKyAgICAgICAgZmFjdG9yeS5zZXRTdG9yZU1vZGUoTWV0YURhdGFGYWN0b3J5LlNUT1JFX1ZFUkJPU0UpOworCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IHJlcG9zLmFkZE1ldGFEYXRhKGNscyk7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gbWV0YS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuT0JKRUNUCisgICAgICAgICAgICAgICAgJiYgZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKSAhPSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICAgICAgZm1kc1tpXS5zZXREZWNsYXJlZFR5cGVDb2RlKEphdmFUeXBlcy5QQyk7CisgICAgICAgIH0KKyAgICAgICAgbWV0YS5zZXRTb3VyY2UoX2ZpbGUsIG1ldGEuZ2V0U291cmNlVHlwZSgpKTsKKyAgICAgICAgbWV0YS5zZXRSZXNvbHZlKE1PREVfTUVUQSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmcmVzaCBvciBhZGQgdGhlIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaChDbGFzcyBjbHMpIHsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICByZXBvcy5zZXRTdHJhdGVneUluc3RhbGxlcihuZXcgUmVmcmVzaFN0cmF0ZWd5SW5zdGFsbGVyKHJlcG9zKSk7CisgICAgICAgIGlmIChnZXRNYXBwaW5nKHJlcG9zLCBjbHMsIHRydWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9mbHVzaCA9IHRydWU7CisgICAgICAgICAgICBfZmx1c2hTY2hlbWEgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIG1hcHBpbmdzIGZvciB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGl0cyBmaWVsZHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKENsYXNzIGNscykgeworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MgPSBnZXRSZXBvc2l0b3J5KCk7CisgICAgICAgIHJlcG9zLnNldFN0cmF0ZWd5SW5zdGFsbGVyKG5ldyBSdW50aW1lU3RyYXRlZ3lJbnN0YWxsZXIocmVwb3MpKTsKKyAgICAgICAgaWYgKGdldE1hcHBpbmcocmVwb3MsIGNscywgdHJ1ZSkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9mbHVzaFNjaGVtYSA9ICFjb250YWlucyhfc2NoZW1hQWN0aW9ucyxTQ0hFTUFfQUNUSU9OX05PTkUpCisgICAgICAgICAgICAgICAgJiYgIWNvbnRhaW5zKF9zY2hlbWFBY3Rpb25zLFNjaGVtYVRvb2wuQUNUSU9OX0FERCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBzY2hlbWEgdXNpbmcgdGhlIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVpbGRTY2hlbWEoQ2xhc3MgY2xzKSB7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBNYXBwaW5nUmVwb3NpdG9yeSByZXBvcyA9IGdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgcmVwb3Muc2V0U3RyYXRlZ3lJbnN0YWxsZXIobmV3IFJ1bnRpbWVTdHJhdGVneUluc3RhbGxlcihyZXBvcykpOworICAgICAgICBpZiAoZ2V0TWFwcGluZyhyZXBvcywgY2xzLCB0cnVlKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHNldCBhbnkgbG9naWNhbCBwa3MgdG8gbm9uLWxvZ2ljYWwgc28gdGhleSBnZXQgZmx1c2hlZAorICAgICAgICBfZmx1c2hTY2hlbWEgPSB0cnVlOworICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gX3NjaGVtYS5nZXRTY2hlbWFzKCk7CisgICAgICAgIFRhYmxlW10gdGFibGVzOworICAgICAgICBDb2x1bW5bXSBjb2xzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYmxlcyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYmxlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmICh0YWJsZXNbal0uZ2V0UHJpbWFyeUtleSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdGFibGVzW2pdLmdldFByaW1hcnlLZXkoKS5zZXRMb2dpY2FsKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjb2xzID0gdGFibGVzW2pdLmdldFByaW1hcnlLZXkoKS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb2xzLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICBjb2xzW2tdLnNldE5vdE51bGwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcm9wIG1hcHBpbmcgZm9yIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcm9wKENsYXNzIGNscykgeworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKF9kcm9wQ2xzID09IG51bGwpCisgICAgICAgICAgICBfZHJvcENscyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIF9kcm9wQ2xzLmFkZChjbHMpOworICAgICAgICBpZiAoIWNvbnRhaW5zKF9zY2hlbWFBY3Rpb25zLFNjaGVtYVRvb2wuQUNUSU9OX0RST1ApKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICByZXBvcy5zZXRTdHJhdGVneUluc3RhbGxlcihuZXcgUnVudGltZVN0cmF0ZWd5SW5zdGFsbGVyKHJlcG9zKSk7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hcHBpbmcgPSByZXBvcy5nZXRNYXBwaW5nKGNscywgbnVsbCwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcHBpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgX2ZsdXNoU2NoZW1hID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChfZHJvcE1hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9kcm9wTWFwID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIF9kcm9wTWFwLmFkZChtYXBwaW5nKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoIm5vLWRyb3AtbWV0YSIsIGNscykpOworICAgIH0KKworICAgIC8vLy8vLy8vCisgICAgLy8gTWFpbgorICAgIC8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBVc2FnZTogamF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdUb29sIFtvcHRpb25dKiAKKyAgICAgKiBbLWFjdGlvbi8tYSAmbHQ7cmVmcmVzaCB8IGFkZCB8IGJ1aWxkU2NoZW1hIHwgZHJvcCB8IHZhbGlkYXRlIHwgaW1wb3J0IAorICAgICAqIHwgZXhwb3J0Jmd0O10gJmx0O2NsYXNzIG5hbWUgfCAuamF2YSBmaWxlIHwgLmNsYXNzIGZpbGUgfCAuamRvIGZpbGUmZ3Q7KgorICAgICAqIFdoZXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZC4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPi1wcm9wZXJ0aWVzLy1wICZsdDtwcm9wZXJ0aWVzIGZpbGUgb3IgcmVzb3VyY2UmZ3Q7PC9pPjogVGhlCisgICAgICogcGF0aCBvciByZXNvdXJjZSBuYW1lIG9mIGEgT3BlbkpQQSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZworICAgICAqIGluZm9ybWF0aW9uIGFzIG91dGxpbmVkIGluIHtAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbn0uIE9wdGlvbmFsLjwvbGk+CisgICAgICogPGxpPjxpPi0mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvaT46IEFsbCBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgT3BlbkpQQSB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259IGNhbiBiZSBzZXQgYnkKKyAgICAgKiB1c2luZyB0aGVpcgluYW1lcyBhbmQgc3VwcGx5aW5nIGEgdmFsdWUuIEZvciBleGFtcGxlOgorICAgICAqIDxjb2RlPi1saWNlbnNlS2V5IGFkc2xmamE4M3IzbGthZGY8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+PGk+LWZpbGUvLWYgJmx0O3N0ZG91dCB8IG91dHB1dCBmaWxlIG9yIHJlc291cmNlJmd0OzwvaT46IFVzZQorICAgICAqIHRoaXMgb3B0aW9uIHRvIHdyaXRlIHRoZSBwbGFubmVkIG1hcHBpbmdzIHRvIGFuIFhNTCBkb2N1bWVudCByYXRoZXIKKyAgICAgKiB0aGFuIHN0b3JlIHRoZW0gaW4gdGhlIHJlcG9zaXRvcnkuIFRoaXMgb3B0aW9uIGFsc28gc3BlY2lmaWVzIHRoZQorICAgICAqIG1ldGFkYXRhIGZpbGUgdG8gd3JpdGUgdG8gaWYgdXNpbmcgdGhlIDxjb2RlPmFkZDwvY29kZT4gYWN0aW9uIHdpdGgKKyAgICAgKiB0aGUgPGNvZGU+LW1ldGEgdHJ1ZTwvY29kZT4gZmxhZywgb3IgdGhlIGZpbGUgdG8gZHVtcCB0byBpZiB1c2luZworICAgICAqIHRoZSA8Y29kZT5leHBvcnQ8L2NvZGU+IGFjdGlvbi48L2xpPgorICAgICAqIDxsaT48aT4tc2NoZW1hQWN0aW9uLy1zYSAmbHQ7c2NoZW1hIGFjdGlvbiB8IG5vbmUmZ3Q7PC9pPjogVGhlCisgICAgICoge0BsaW5rIFNjaGVtYVRvb2x9IGRlZmluZXMgdGhlIGFjdGlvbnMgcG9zc2libGUuIFRoZSBhY3Rpb25zIHdpbGwKKyAgICAgKiBhcHBseSB0byBhbGwgc2NoZW1hIGNvbXBvbmVudHMgdXNlZCBieSB0aGUgbWFwcGluZ3MgaW52b2x2ZWQuCisgICAgICogVW5sZXNzIHlvdSBhcmUgcnVubmluZyB0aGUgbWFwcGluZyB0b29sIG9uIGFsbCBvZiB5b3VyIHBlcnNpc3RlbnQKKyAgICAgKiB0eXBlcyBhdCBvbmNlLCBiZSBjYXJlZnVsIHJ1bm5pbmcgc2NoZW1hIGFjdGlvbnMgdGhhdCBjYW4gZHJvcCBkYXRhLgorICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIGFjY2lkZW50YWxseSBkcm9wIHNjaGVtYSBjb21wb25lbnRzIHRoYXQgYXJlCisgICAgICogdXNlZCBieSBjbGFzc2VzIHlvdSBhcmVuJ3QgY3VycmVudGx5IHJ1bm5pbmcgdGhlIHRvb2wgb3Zlci4gVGhlCisgICAgICogYWN0aW9uIGRlZmF1bHRzIHRvIDxjb2RlPmFkZDwvY29kZT4uPC9saT4KKyAgICAgKiA8bGk+PGk+LXNjaGVtYUZpbGUvLXNmICZsdDtzdGRvdXQgfCBvdXRwdXQgZmlsZSBvciByZXNvdXJjZSZndDs8L2k+OiBVc2UKKyAgICAgKiB0aGlzIG9wdGlvbiB0byB3cml0ZSB0aGUgcGxhbm5lZCBzY2hlbWEgdG8gYW4gWE1MIGRvY3VtZW50IHJhdGhlcgorICAgICAqIHRoYW4gbW9kaWZ5IHRoZSBkYXRhIHN0b3JlLjwvbGk+CisgICAgICogPGxpPjxpPi1zcWxGaWxlLy1zcWwgJmx0O3N0ZG91dCB8IG91dHB1dCBmaWxlIG9yIHJlc291cmNlJmd0OzwvaT46IFVzZQorICAgICAqIHRoaXMgb3B0aW9uIHRvIHdyaXRlIHRoZSBwbGFubmVkIHNjaGVtYSBjaGFuZ2VzIGFzIGEgU1FMCisgICAgICogc2NyaXB0IHJhdGhlciB0aGFuIG1vZGlmeWluZyB0aGUgZGF0YSBzdG9yZS48L2xpPgorICAgICAqIDxsaT48aT4tZHJvcFRhYmxlcy8tZHQgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogQ29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogc2FtZS1uYW1lZCBvcHRpb24gaW4gdGhlIHtAbGluayBTY2hlbWFUb29sfS48L2xpPgorICAgICAqIDxsaT48aT4tZHJvcFNlcXVlbmNlcy8tZHNxICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IENvcnJlc3BvbmRzCisgICAgICogdG8gdGhlIHNhbWUtbmFtZWQgb3B0aW9uIGluIHRoZSB7QGxpbmsgU2NoZW1hVG9vbH0uPC9saT4KKyAgICAgKiA8bGk+PGk+LW9wZW5qcGFUYWJsZXMvLWt0ICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IENvcnJlc3BvbmRzIHRvCisgICAgICogdGhlIHNhbWUtbmFtZWQgb3B0aW9uIGluIHRoZSB7QGxpbmsgU2NoZW1hVG9vbH0uPC9saT4KKyAgICAgKiA8bGk+PGk+LWlnbm9yZUVycm9ycy8taSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBDb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiBzYW1lLW5hbWVkIG9wdGlvbiBpbiB0aGUge0BsaW5rIFNjaGVtYVRvb2x9LjwvbGk+CisgICAgICogPGxpPjxpPi1yZWFkU2NoZW1hLy1ycyAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBTZXQgdGhpcyB0byB0cnVlCisgICAgICogdG8gcmVhZCB0aGUgZW50aXJlIGV4aXN0aW5nIHNjaGVtYSAoZXZlbiB3aGVuIGZhbHNlIHRoZSBwYXJ0cyBvZgorICAgICAqIHRoZSBzY2hlbWEgdXNlZCBieSBjbGFzc2VzIHRoZSB0b29sIGlzIHJ1biBvbiB3aWxsIHN0aWxsIGJlIHJlYWQpLgorICAgICAqIFR1cm5pbmcgb24gc2NoZW1hIHJlYWRpbmcgY2FuIGVuc3VyZSB0aGF0IG5vIG5hbWluZyBjb25mbGljdHMgd2lsbAorICAgICAqIG9jY3VyLCBidXQgaXQgY2FuIHRha2UgYSBsb25nIHRpbWUuPC9saT4KKyAgICAgKiA8bGk+PGk+LXByaW1hcnlLZXlzLy1wayAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBXaGV0aGVyIHByaW1hcnkKKyAgICAgKiBrZXlzIG9uIGV4aXN0aW5nIHRhYmxlcyBhcmUgbWFuaXB1bGF0ZWQuIERlZmF1bHRzIHRvIGZhbHNlLjwvbGk+CisgICAgICogPGxpPjxpPi1mb3JlaWduS2V5cy8tZmsgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogV2hldGhlciBmb3JlaWduCisgICAgICoga2V5cyBvbiBleGlzdGluZyB0YWJsZXMgYXJlIG1hbmlwdWxhdGVkLiBEZWZhdWx0cyB0byBmYWxzZS48L2xpPgorICAgICAqIDxsaT48aT4taW5kZXhlcy8taXggJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogV2hldGhlciBpbmRleGVzIG9uCisgICAgICogZXhpc3RpbmcgdGFibGVzIGFyZSBtYW5pcHVsYXRlZC4gRGVmYXVsdHMgdG8gZmFsc2UuPC9saT4KKyAgICAgKiA8bGk+PGk+LXNlcXVlbmNlcy8tc3EgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogV2hldGhlciBzZXF1ZW5jZXMKKyAgICAgKiBhcmUgbWFuaXB1bGF0ZWQuIERlZmF1bHRzIHRvIHRydWUuPC9saT4KKyAgICAgKiA8bGk+PGk+LXNjaGVtYXMvLXMgJmx0O3NjaGVtYSBhbmQgdGFibGUgbmFtZXMmZ3Q7PC9pPjogQSBsaXN0IG9mIHNjaGVtYXMKKyAgICAgKiBhbmQvb3IgdGFibGVzIHRvIHJlYWQuIENvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqIHNhbWUtbmFtZWQgb3B0aW9uIGluIHRoZSB7QGxpbmsgU2NoZW1hR2VuZXJhdG9yfS4gVGhpcyBvcHRpb24KKyAgICAgKiBpcyBpZ25vcmVkIGlmIDxjb2RlPnJlYWRTY2hlbWE8L2NvZGU+IGlzIGZhbHNlLjwvbGk+CisgICAgICogPGxpPjxpPi1tZXRhLy1tICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFdoZXRoZXIgdGhlIGdpdmVuIGFjdGlvbgorICAgICAqIGFwcGxpZXMgdG8gbWV0YWRhdGEgYXMgd2VsbCBhcyBtYXBwaW5ncy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogIFRoZSB2YXJpb3VzIGFjdGlvbnMgYXJlIGFzIGZvbGxvd3MuCisgICAgICogPHVsPgorICAgICAqIDxsaT48aT5yZWZyZXNoPC9pPjogQnJpbmcgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gdXAtdG8tZGF0ZQorICAgICAqIHdpdGggdGhlIGNsYXNzIGRlZmluaXRpb25zLiBPcGVuSlBBIHdpbGwgYXR0ZW1wdCB0byB1c2UgYW55IHByb3ZpZGVkCisgICAgICogbWFwcGluZyBpbmZvcm1hdGlvbiwgYW5kIGZpbGwgaW4gbWlzc2luZyBpbmZvcm1hdGlvbi4gSWYgdGhlCisgICAgICogcHJvdmlkZWQgaW5mb3JtYXRpb24gY29uZmxpY3RzIHdpdGggdGhlIGNsYXNzIGRlZmluaXRpb24sIHRoZQorICAgICAqIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgZGlzY2FyZGVkIGFuZCB0aGUgY2xhc3MvZmllbGQgd2lsbAorICAgICAqIGJlIHJlLW1hcHBlZCB0byBuZXcgY29sdW1ucy90YWJsZXMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYWN0aW9uLjwvbGk+CisgICAgICogPGxpPjxpPmFkZDwvaT46IElmIHVzZWQgd2l0aCB0aGUgPGNvZGU+LW1ldGE8L2NvZGU+IG9wdGlvbiwgYWRkcyBuZXcKKyAgICAgKiBkZWZhdWx0IG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY2xhc3MoZXMpLiBPdGhlcndpc2UsIGJyaW5ncyB0aGUKKyAgICAgKiBtYXBwaW5nIGluZm9ybWF0aW9uIHVwLXRvLWRhdGUgd2l0aCB0aGUgY2xhc3MKKyAgICAgKiBkZWZpbml0aW9ucy4gT3BlbkpQQSB3aWxsIGF0dGVtcHQgdG8gdXNlIGFueSBwcm92aWRlZCBtYXBwaW5nCisgICAgICogaW5mb3JtYXRpb24sIGFuZCBmaWxsIGluIG1pc3NpbmcgaW5mb3JtYXRpb24uIE9wZW5KUEEgd2lsbCBmYWlsIGlmCisgICAgICogdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uIGNvbmZsaWN0cyB3aXRoIHRoZSBjbGFzcyBkZWZpbml0aW9uLjwvbGk+CisgICAgICogPGxpPjxpPmJ1aWxkU2NoZW1hPC9pPjogQ3JlYXRlIHRoZSBzY2hlbWEgbWF0Y2hpbmcgdGhlIGV4aXN0aW5nCisgICAgICogbWFwcGluZ3MgZm9yIHRoZSBnaXZlbiBjbGFzcyhlcykuIEFueSBpbnZhbGlkIG1hcHBpbmcgaW5mb3JtYXRpb24KKyAgICAgKiB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbi48L2xpPgorICAgICAqIDxsaT48aT5kcm9wPC9pPjogRGVsZXRlIG1hcHBpbmdzIGZvciB0aGUgZ2l2ZW4gY2xhc3Nlcy4gSWYgdXNlZCB3aXRoCisgICAgICogdGhlIDxjb2RlPi1tZXRhPC9jb2RlPiBvcHRpb24sIGFsc28gZGVsZXRlcyBtZXRhZGF0YS48L2xpPgorICAgICAqIDxsaT48aT52YWxpZGF0ZTwvaT46IFZhbGlkYXRlIHRoZSBnaXZlbiBtYXBwaW5ncy4gVGhlIG1hcHBpbmcKKyAgICAgKiByZXBvc2l0b3J5IGFuZCBzY2hlbWEgd2lsbCBub3QgYmUgYWZmZWN0ZWQuPC9saT4KKyAgICAgKiA8bGk+PGk+aW1wb3J0PC9pPjogSW1wb3J0IG1hcHBpbmdzIGZyb20gYW4gWE1MIGRvY3VtZW50IGFuZCBzdG9yZQorICAgICAqIHRoZW0gYXMgdGhlIGN1cnJlbnQgc3lzdGVtIG1hcHBpbmdzLjwvbGk+CisgICAgICogPGxpPjxpPmV4cG9ydDwvaT46IER1bXAgdGhlIGN1cnJlbnQgbWFwcGluZ3MgZm9yIHRoZSBnaXZlbiBjbGFzc2VzIHRvCisgICAgICogYW4gWE1MIGRvY3VtZW50IHNwZWNpZmllZCBieSB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gb3B0aW9uLjwvbGk+CisgICAgICogSWYgdXNlZCB3aXRoIHRoZSA8Y29kZT4tbWV0YTwvY29kZT4gb3B0aW9uLCB0aGUgbWV0YWRhdGEgd2lsbCBiZQorICAgICAqIGluY2x1ZGVkIGluIHRoZSBleHBvcnQuCisgICAgICogPC91bD4KKyAgICAgKiAgRWFjaCBjbGFzcyBzdXBwbGllZCBhcyBhbiBhcmd1bWVudCBtdXN0IGhhdmUgdmFsaWQgbWV0YWRhdGEuIElmCisgICAgICogbm8gY2xhc3MgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIHRvb2wgcnVucyBvbiBhbGwgbWV0YWRhdGEgZmlsZXMgaW4KKyAgICAgKiB0aGUgQ0xBU1NQQVRILgorICAgICAqICBFeGFtcGxlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlJlZnJlc2ggdGhlIG1hcHBpbmdzIGZvciBnaXZlbiBwYWNrYWdlLCB3aXRob3V0IGRyb3BwaW5nIGFueQorICAgICAqIHNjaGVtYSBjb21wb25lbnRzOjxiciAvPgorICAgICAqIDxjb2RlPmphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCAKKyAgICAgKiAgICAgIG15cGFja2FnZS5qZG88L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+UmVmcmVzaCB0aGUgbWFwcGluZ3MgZm9yIGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgaW4gdGhlIGNsYXNzcGF0aCwKKyAgICAgKiBkcm9wcGluZyBhbnkgdW51c2VkIGNvbHVtbnMgYW5kIGV2ZW4gdGFibGVzOjxiciAvPgorICAgICAqIDxjb2RlPmphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCAtc2EgcmVmcmVzaAorICAgICAqIC1kdCB0cnVlPC9jb2RlPjwvbGk+CisgICAgICogPGxpPk1ha2Ugc3VyZSB0aGUgbWFwcGluZ3MgeW91J3ZlIGNyZWF0ZWQgYnkgaGFuZCBtYXRjaCB0aGUgb2JqZWN0CisgICAgICogbW9kZWwgYW5kIHNjaGVtYTo8YnIgLz4KKyAgICAgKiA8Y29kZT5qYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qYmRjLm1ldGEuTWFwcGluZ1Rvb2wKKyAgICAgKiAtYSB2YWxpZGF0ZSBQZXJzb24uamF2YTwvY29kZT48L2xpPgorICAgICAqIDxsaT5SZW1vdmUgdGhlIHJlY29yZGVkIG1hcHBpbmcgZm9yIGEgZ2l2ZW4gY2xhc3M6PGJyIC8+CisgICAgICogPGNvZGU+amF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamJkYy5tZXRhLk1hcHBpbmdUb29sCisgICAgICogLWEgZHJvcCBQZXJzb24uamF2YTwvY29kZT48L2xpPgorICAgICAqIDxsaT5SZWNvcmQgdGhlIGN1cnJlbnQgbWFwcGluZ3MgaW4gYW4gWE1MIGZpbGU6PGJyIC8+CisgICAgICogPGNvZGU+amF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdUb29sCisgICAgICogLWYgbXlwYWNrYWdlLm9ybSAtYSBleHBvcnQgbXlwYWNrYWdlLmpkbzwvY29kZT48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBhcmdzID0gb3B0cy5zZXRGcm9tQ21kTGluZShhcmdzKTsKKyAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBKREJDQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghcnVuKGNvbmYsIGFyZ3MsIG9wdHMpKQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihfbG9jLmdldCgidG9vbC11c2FnZSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbmYuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJucyBmYWxzZSBpZiBpbnZhbGlkIG9wdGlvbnMgYXJlIGdpdmVuLgorICAgICAqCisgICAgICogQHNlZSAjbWFpbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgT3B0aW9ucyBvcHRzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcHRzLmNvbnRhaW5zS2V5KCJoZWxwIikgfHwgb3B0cy5jb250YWluc0tleSgiLWhlbHAiKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBmbGFncworICAgICAgICBGbGFncyBmbGFncyA9IG5ldyBGbGFncygpOworICAgICAgICBmbGFncy5hY3Rpb24gPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJhY3Rpb24iLCAiYSIsIGZsYWdzLmFjdGlvbik7CisgICAgICAgIGZsYWdzLnNjaGVtYUFjdGlvbiA9IG9wdHMucmVtb3ZlUHJvcGVydHkoInNjaGVtYUFjdGlvbiIsICJzYSIsCisgICAgICAgICAgICBmbGFncy5zY2hlbWFBY3Rpb24pOworICAgICAgICBmbGFncy5kcm9wVGFibGVzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiZHJvcFRhYmxlcyIsICJkdCIsIGZsYWdzLmRyb3BUYWJsZXMpOworICAgICAgICBmbGFncy5vcGVuanBhVGFibGVzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgib3BlbmpwYVRhYmxlcyIsICJvdCIsIGZsYWdzLm9wZW5qcGFUYWJsZXMpOworICAgICAgICBmbGFncy5kcm9wU2VxdWVuY2VzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiZHJvcFNlcXVlbmNlcyIsICJkc3EiLCBmbGFncy5kcm9wU2VxdWVuY2VzKTsKKyAgICAgICAgZmxhZ3MucmVhZFNjaGVtYSA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoInJlYWRTY2hlbWEiLCAicnMiLCBmbGFncy5yZWFkU2NoZW1hKTsKKyAgICAgICAgZmxhZ3MucHJpbWFyeUtleXMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJwcmltYXJ5S2V5cyIsICJwayIsIGZsYWdzLnByaW1hcnlLZXlzKTsKKyAgICAgICAgZmxhZ3MuaW5kZXhlcyA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5KCJpbmRleGVzIiwgIml4IiwKKyAgICAgICAgICAgIGZsYWdzLmluZGV4ZXMpOworICAgICAgICBmbGFncy5mb3JlaWduS2V5cyA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5KCJmb3JlaWduS2V5cyIsICJmayIsCisgICAgICAgICAgICBmbGFncy5mb3JlaWduS2V5cyk7CisgICAgICAgIGZsYWdzLnNlcXVlbmNlcyA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5KCJzZXF1ZW5jZXMiLCAic3EiLAorICAgICAgICAgICAgZmxhZ3Muc2VxdWVuY2VzKTsKKyAgICAgICAgZmxhZ3MuaWdub3JlRXJyb3JzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiaWdub3JlRXJyb3JzIiwgImkiLCBmbGFncy5pZ25vcmVFcnJvcnMpOworICAgICAgICBmbGFncy5tZXRhID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkoIm1ldGEiLCAibSIsIGZsYWdzLm1ldGEpOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJmaWxlIiwgImYiLCBudWxsKTsKKyAgICAgICAgU3RyaW5nIHNjaGVtYUZpbGVOYW1lID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgic2NoZW1hRmlsZSIsICJzZiIsIG51bGwpOworICAgICAgICBTdHJpbmcgc3FsRmlsZU5hbWUgPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJzcWxGaWxlIiwgInNxbCIsIG51bGwpOworICAgICAgICBTdHJpbmcgc2NoZW1hcyA9IG9wdHMucmVtb3ZlUHJvcGVydHkoInMiKTsKKyAgICAgICAgaWYgKHNjaGVtYXMgIT0gbnVsbCkKKyAgICAgICAgICAgIG9wdHMuc2V0UHJvcGVydHkoInNjaGVtYXMiLCBzY2hlbWFzKTsKKworICAgICAgICBDb25maWd1cmF0aW9ucy5wb3B1bGF0ZUNvbmZpZ3VyYXRpb24oY29uZiwgb3B0cyk7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGNvbmYuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihNYXBwaW5nVG9vbC5jbGFzcywgbnVsbCk7CisgICAgICAgIGlmIChmbGFncy5tZXRhICYmIEFDVElPTl9BREQuZXF1YWxzKGZsYWdzLmFjdGlvbikpCisgICAgICAgICAgICBmbGFncy5tZXRhRGF0YUZpbGUgPSBGaWxlcy5nZXRGaWxlKGZpbGVOYW1lLCBsb2FkZXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFncy5tYXBwaW5nV3JpdGVyID0gRmlsZXMuZ2V0V3JpdGVyKGZpbGVOYW1lLCBsb2FkZXIpOworICAgICAgICBmbGFncy5zY2hlbWFXcml0ZXIgPSBGaWxlcy5nZXRXcml0ZXIoc2NoZW1hRmlsZU5hbWUsIGxvYWRlcik7CisgICAgICAgIGZsYWdzLnNxbFdyaXRlciA9IEZpbGVzLmdldFdyaXRlcihzcWxGaWxlTmFtZSwgbG9hZGVyKTsKKworICAgICAgICByZXR1cm4gcnVuKGNvbmYsIGFyZ3MsIGZsYWdzLCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJuIGZhbHNlIGlmIGFuIGludmFsaWQgb3B0aW9uIHdhcyBnaXZlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIEZsYWdzIGZsYWdzLCBDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZGVmYXVsdCBhY3Rpb24gYmFzZWQgb24gd2hldGhlciB0aGUgbWFwcGluZyBkZWZhdWx0cyBmaWxscyBpbgorICAgICAgICAvLyBtaXNzaW5nIGluZm8KKyAgICAgICAgaWYgKGZsYWdzLmFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29uZi5nZXRNYXBwaW5nRGVmYXVsdHNJbnN0YW5jZSgpLmRlZmF1bHRNaXNzaW5nSW5mbygpKQorICAgICAgICAgICAgICAgIGZsYWdzLmFjdGlvbiA9IEFDVElPTl9CVUlMRF9TQ0hFTUE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmxhZ3MuYWN0aW9uID0gQUNUSU9OX1JFRlJFU0g7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb2xsZWN0IHRoZSBjbGFzc2VzIHRvIGFjdCBvbgorICAgICAgICBMb2cgbG9nID0gY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1RPT0wpOworICAgICAgICBDb2xsZWN0aW9uIGNsYXNzZXMgPSBudWxsOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgaWYgKEFDVElPTl9JTVBPUlQuZXF1YWxzKGZsYWdzLmFjdGlvbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInJ1bm5pbmctYWxsLWNsYXNzZXMiKSk7CisgICAgICAgICAgICBjbGFzc2VzID0gY29uZi5nZXRNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgbG9hZFBlcnNpc3RlbnRUeXBlcyh0cnVlLCBsb2FkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBDbGFzc0FyZ1BhcnNlciBjbGFzc1BhcnNlciA9IGNvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICBnZXRNZXRhRGF0YUZhY3RvcnkoKS5uZXdDbGFzc0FyZ1BhcnNlcigpOworICAgICAgICAgICAgY2xhc3NQYXJzZXIuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgICAgIENsYXNzW10gcGFyc2VkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGFyZ3MgIT0gbnVsbCAmJiBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHBhcnNlZCA9IGNsYXNzUGFyc2VyLnBhcnNlVHlwZXMoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJzZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENsYXNzW10gYWN0ID0gKENsYXNzW10pIGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKTsKKyAgICAgICAgaWYgKEFDVElPTl9FWFBPUlQuZXF1YWxzKGZsYWdzLmFjdGlvbikpIHsKKyAgICAgICAgICAgIC8vIHJ1biBleHBvcnRzIHVudGlsIHRoZSBmaXJzdCBleHBvcnQgc3VjY2VlZHMKKyAgICAgICAgICAgIEltcG9ydEV4cG9ydFtdIGluc3RhbmNlcyA9IG5ld0ltcG9ydEV4cG9ydHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlc1tpXS5leHBvcnRNYXBwaW5ncyhjb25mLCBhY3QsIGZsYWdzLm1ldGEsIGxvZywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MubWFwcGluZ1dyaXRlcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChBQ1RJT05fSU1QT1JULmVxdWFscyhmbGFncy5hY3Rpb24pKSB7CisgICAgICAgICAgICAvLyBydW4gZXhwb3J0cyB1bnRpbCB0aGUgZmlyc3QgZXhwb3J0IHN1Y2NlZWRzCisgICAgICAgICAgICBJbXBvcnRFeHBvcnRbXSBpbnN0YW5jZXMgPSBuZXdJbXBvcnRFeHBvcnRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZXNbaV0uaW1wb3J0TWFwcGluZ3MoY29uZiwgYWN0LCBhcmdzLCBmbGFncy5tZXRhLAorICAgICAgICAgICAgICAgICAgICBsb2csIGxvYWRlcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTWFwcGluZ1Rvb2wgdG9vbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRvb2wgPSBuZXcgTWFwcGluZ1Rvb2woY29uZiwgZmxhZ3MuYWN0aW9uLCBmbGFncy5tZXRhKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0dXAgdGhlIHRvb2wKKyAgICAgICAgdG9vbC5zZXRJZ25vcmVFcnJvcnMoZmxhZ3MuaWdub3JlRXJyb3JzKTsKKyAgICAgICAgdG9vbC5zZXRNZXRhRGF0YUZpbGUoZmxhZ3MubWV0YURhdGFGaWxlKTsKKyAgICAgICAgdG9vbC5zZXRNYXBwaW5nV3JpdGVyKGZsYWdzLm1hcHBpbmdXcml0ZXIpOworICAgICAgICB0b29sLnNldFNjaGVtYUFjdGlvbihmbGFncy5zY2hlbWFBY3Rpb24pOworICAgICAgICB0b29sLnNldFNjaGVtYVdyaXRlcihmbGFncy5zY2hlbWFXcml0ZXIpOworICAgICAgICB0b29sLnNldFJlYWRTY2hlbWEoZmxhZ3MucmVhZFNjaGVtYQorICAgICAgICAgICAgJiYgIUFDVElPTl9WQUxJREFURS5lcXVhbHMoZmxhZ3MuYWN0aW9uKSk7CisgICAgICAgIHRvb2wuc2V0UHJpbWFyeUtleXMoZmxhZ3MucHJpbWFyeUtleXMpOworICAgICAgICB0b29sLnNldEZvcmVpZ25LZXlzKGZsYWdzLmZvcmVpZ25LZXlzKTsKKyAgICAgICAgdG9vbC5zZXRJbmRleGVzKGZsYWdzLmluZGV4ZXMpOworICAgICAgICB0b29sLnNldFNlcXVlbmNlcyhmbGFncy5zZXF1ZW5jZXMgfHwgZmxhZ3MuZHJvcFNlcXVlbmNlcyk7CisKKyAgICAgICAgLy8gYW5kIHJ1biB0aGUgYWN0aW9uCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgidG9vbC1ydW5uaW5nIiwgYWN0W2ldLCBmbGFncy5hY3Rpb24pKTsKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgZmxhZ3MucmVhZFNjaGVtYSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgidG9vbC10aW1lIikpOworICAgICAgICAgICAgdG9vbC5ydW4oYWN0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgidG9vbC1yZWNvcmQiKSk7CisgICAgICAgIHRvb2wucmVjb3JkKGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIHtAbGluayBJbXBvcnRFeHBvcnR9IGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEltcG9ydEV4cG9ydFtdIG5ld0ltcG9ydEV4cG9ydHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0gU2VydmljZXMuZ2V0SW1wbGVtZW50b3JDbGFzc2VzKEltcG9ydEV4cG9ydC5jbGFzcyk7CisgICAgICAgICAgICBJbXBvcnRFeHBvcnRbXSBpbnN0YW5jZXMgPSBuZXcgSW1wb3J0RXhwb3J0W3R5cGVzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGluc3RhbmNlc1tpXSA9IChJbXBvcnRFeHBvcnQpIHR5cGVzW2ldLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VzOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbXBvcnRleHBvcnQtaW5zdGFudGlhdGUiKSx0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBsaXN0LCBTdHJpbmcga2V5KSB7CisgICAgCXJldHVybiAobGlzdCA9PSBudWxsKSA/IGZhbHNlIDogbGlzdC5pbmRleE9mKGtleSkgIT0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxhZ3MgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYWN0aW9uID0gbnVsbDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWV0YSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgU3RyaW5nIHNjaGVtYUFjdGlvbiA9IFNjaGVtYVRvb2wuQUNUSU9OX0FERDsKKyAgICAgICAgcHVibGljIEZpbGUgbWV0YURhdGFGaWxlID0gbnVsbDsKKyAgICAgICAgcHVibGljIFdyaXRlciBtYXBwaW5nV3JpdGVyID0gbnVsbDsKKyAgICAgICAgcHVibGljIFdyaXRlciBzY2hlbWFXcml0ZXIgPSBudWxsOworICAgICAgICBwdWJsaWMgV3JpdGVyIHNxbFdyaXRlciA9IG51bGw7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlnbm9yZUVycm9ycyA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWFkU2NoZW1hID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGRyb3BUYWJsZXMgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb3BlbmpwYVRhYmxlcyA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkcm9wU2VxdWVuY2VzID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIHNlcXVlbmNlcyA9IHRydWU7CisgICAgICAgIHB1YmxpYyBib29sZWFuIHByaW1hcnlLZXlzID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGZvcmVpZ25LZXlzID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGluZGV4ZXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgdXNlZCB0byBpbXBvcnQgYW5kIGV4cG9ydCBtYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSW1wb3J0RXhwb3J0IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW1wb3J0IG1hcHBpbmdzIGZvciB0aGUgZ2l2ZW4gY2xhc3NlcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW1wb3J0TWFwcGluZ3MoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgQ2xhc3NbXSBhY3QsCisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzLCBib29sZWFuIG1ldGEsIExvZyBsb2csIENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhwb3J0IG1hcHBpbmdzIGZvciB0aGUgZ2l2ZW4gY2xhc3NlcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXhwb3J0TWFwcGluZ3MoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgQ2xhc3NbXSBhY3QsCisgICAgICAgICAgICBib29sZWFuIG1ldGEsIExvZyBsb2csIFdyaXRlciB3cml0ZXIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01ldGFEYXRhUGx1c01hcHBpbmdGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTWV0YURhdGFQbHVzTWFwcGluZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjJiZWMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01ldGFEYXRhUGx1c01hcHBpbmdGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkRlbGVnYXRpbmdNZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5RdWVyeU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlNlcXVlbmNlTWV0YURhdGE7CisKKy8qKgorICogQ29tYmluZXMgdHdvIGludGVybmFsIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IGluc3RhbmNlcyAtLSBvbmUgZm9yCisgKiBtZXRhZGF0YSwgb25lIGZvciBtYXBwaW5ncyAtLSBpbnRvIGEgc2luZ2xlIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IGZhY2FkZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgTWV0YURhdGFQbHVzTWFwcGluZ0ZhY3RvcnkKKyAgICBleHRlbmRzIERlbGVnYXRpbmdNZXRhRGF0YUZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YUZhY3RvcnkgX21hcDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YVBsdXNNYXBwaW5nRmFjdG9yeShNZXRhRGF0YUZhY3RvcnkgbWV0YSwKKyAgICAgICAgTWV0YURhdGFGYWN0b3J5IG1hcCkgeworICAgICAgICBzdXBlcihtZXRhKTsKKyAgICAgICAgX21hcCA9IG1hcDsKKworICAgICAgICBtZXRhLnNldFN0cmljdCh0cnVlKTsKKyAgICAgICAgbWFwLnNldFN0cmljdCh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIGZhY3RvcnkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIE1ldGFEYXRhRmFjdG9yeSBnZXRNYXBwaW5nRGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIElubmVybW9zdCBtYXBwaW5nIGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YUZhY3RvcnkgZ2V0SW5uZXJtb3N0TWFwcGluZ0RlbGVnYXRlKCkgeworICAgICAgICBpZiAoX21hcCBpbnN0YW5jZW9mIERlbGVnYXRpbmdNZXRhRGF0YUZhY3RvcnkpCisgICAgICAgICAgICByZXR1cm4gKChEZWxlZ2F0aW5nTWV0YURhdGFGYWN0b3J5KSBfbWFwKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICByZXR1cm4gX21hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5KE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBzdXBlci5zZXRSZXBvc2l0b3J5KHJlcG9zKTsKKyAgICAgICAgX21hcC5zZXRSZXBvc2l0b3J5KHJlcG9zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZURpcmVjdG9yeShGaWxlIGRpcikgeworICAgICAgICBzdXBlci5zZXRTdG9yZURpcmVjdG9yeShkaXIpOworICAgICAgICBfbWFwLnNldFN0b3JlRGlyZWN0b3J5KGRpcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVNb2RlKGludCBzdG9yZSkgeworICAgICAgICBzdXBlci5zZXRTdG9yZU1vZGUoc3RvcmUpOworICAgICAgICBfbWFwLnNldFN0b3JlTW9kZShzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaWN0KGJvb2xlYW4gc3RyaWN0KSB7CisgICAgICAgIC8vIGFsd2F5cyBpbiBzdHJpY3QgbW9kZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoQ2xhc3MgY2xzLCBpbnQgbW9kZSwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmICgobW9kZSAmIH5NT0RFX01BUFBJTkcpICE9IE1PREVfTk9ORSkKKyAgICAgICAgICAgIHN1cGVyLmxvYWQoY2xzLCBtb2RlICYgfk1PREVfTUFQUElORywgZW52TG9hZGVyKTsKKyAgICAgICAgaWYgKGNscyAhPSBudWxsICYmIChtb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwKQorICAgICAgICAgICAgX21hcC5sb2FkKGNscywgbW9kZSAmIH5NT0RFX01FVEEsIGVudkxvYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RvcmUoQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBRdWVyeU1ldGFEYXRhW10gcXVlcmllcywKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YVtdIHNlcXMsIGludCBtb2RlLCBNYXAgb3V0cHV0KSB7CisgICAgICAgIGJvb2xlYW4gc3RvcmUgPSB0cnVlOworICAgICAgICBpZiAoKG1vZGUgJiB+TU9ERV9NQVBQSU5HKSAhPSBNT0RFX05PTkUpCisgICAgICAgICAgICBzdG9yZSAmPSBzdXBlci5zdG9yZShtZXRhcywgcXVlcmllcywgc2VxcywgbW9kZSAmIH5NT0RFX01BUFBJTkcsCisgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwKQorICAgICAgICAgICAgc3RvcmUgJj0gX21hcC5zdG9yZShtZXRhcywgcXVlcmllcywgc2VxcywgbW9kZSAmIH5NT0RFX01FVEEsCisgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIHN0b3JlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRyb3AoQ2xhc3NbXSBjbHMsIGludCBtb2RlLCBDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgYm9vbGVhbiBkcm9wID0gdHJ1ZTsKKyAgICAgICAgaWYgKChtb2RlICYgfk1PREVfTUFQUElORykgIT0gTU9ERV9OT05FKQorICAgICAgICAgICAgZHJvcCAmPSBzdXBlci5kcm9wKGNscywgbW9kZSAmIH5NT0RFX01BUFBJTkcsIGVudkxvYWRlcik7CisgICAgICAgIGlmICgobW9kZSAmIE1PREVfTUFQUElORykgIT0gMCkKKyAgICAgICAgICAgIGRyb3AgJj0gX21hcC5kcm9wKGNscywgbW9kZSAmIH5NT0RFX01FVEEsIGVudkxvYWRlcik7CisgICAgICAgIHJldHVybiBkcm9wOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhib29sZWFuIGNsYXNzcGF0aCwKKyAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIFNldCBuYW1lcyA9IHN1cGVyLmdldFBlcnNpc3RlbnRUeXBlTmFtZXMoY2xhc3NwYXRoLCBlbnZMb2FkZXIpOworICAgICAgICBpZiAobmFtZXMgIT0gbnVsbCAmJiAhbmFtZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG5hbWVzOworICAgICAgICByZXR1cm4gX21hcC5nZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGNsYXNzcGF0aCwgZW52TG9hZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgc3VwZXIuY2xlYXIoKTsKKyAgICAgICAgX21hcC5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzRXh0ZW5zaW9uS2V5cyhDb2xsZWN0aW9uIGV4dHMpIHsKKyAgICAgICAgc3VwZXIuYWRkQ2xhc3NFeHRlbnNpb25LZXlzKGV4dHMpOworICAgICAgICBfbWFwLmFkZENsYXNzRXh0ZW5zaW9uS2V5cyhleHRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGaWVsZEV4dGVuc2lvbktleXMoQ29sbGVjdGlvbiBleHRzKSB7CisgICAgICAgIHN1cGVyLmFkZEZpZWxkRXh0ZW5zaW9uS2V5cyhleHRzKTsKKyAgICAgICAgX21hcC5hZGRGaWVsZEV4dGVuc2lvbktleXMoZXh0cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL05vbmVNYXBwaW5nRGVmYXVsdHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9Ob25lTWFwcGluZ0RlZmF1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4NjQ3NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9Ob25lTWFwcGluZ0RlZmF1bHRzLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CisKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBOby1vcCBtYXBwaW5nIGRlZmF1bHRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBOb25lTWFwcGluZ0RlZmF1bHRzCisgICAgaW1wbGVtZW50cyBNYXBwaW5nRGVmYXVsdHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9uZU1hcHBpbmdEZWZhdWx0cyBfaW5zdGFuY2UgPQorICAgICAgICBuZXcgTm9uZU1hcHBpbmdEZWZhdWx0cygpOworCisgICAgcHVibGljIHN0YXRpYyBOb25lTWFwcGluZ0RlZmF1bHRzIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gX2luc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlZmF1bHRNaXNzaW5nSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHVzZUNsYXNzQ3JpdGVyaWEoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFN0cmF0ZWd5KENsYXNzTWFwcGluZyBjbHMsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTdHJhdGVneShWZXJzaW9uIHZlcnMsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTdHJhdGVneShEaXNjcmltaW5hdG9yIGRpc2MsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTdHJhdGVneShWYWx1ZU1hcHBpbmcgdm0sIENsYXNzIHR5cGUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXREaXNjcmltaW5hdG9yVmFsdWUoRGlzY3JpbWluYXRvciBkaXNjLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKENsYXNzTWFwcGluZyBjbHMsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKGNscy5nZXREZXNjcmliZWRUeXBlKCkpLnJlcGxhY2UoJyQnLCAnXycpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKEZpZWxkTWFwcGluZyBmbSwgU2NoZW1hIHNjaGVtYSkgeworICAgICAgICByZXR1cm4gZm0uZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRGF0YVN0b3JlSWRDb2x1bW5zKENsYXNzTWFwcGluZyBjbHMsIFRhYmxlIHRhYmxlLAorICAgICAgICBDb2x1bW5bXSBjb2xzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVDb2x1bW5zKFZlcnNpb24gdmVycywgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbHVtbnMoRGlzY3JpbWluYXRvciBkaXNjLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlSm9pbkNvbHVtbihDbGFzc01hcHBpbmcgY20sIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBpbnQgcG9zLCBpbnQgY29scykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlSm9pbkNvbHVtbihGaWVsZE1hcHBpbmcgZm0sIFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgdGFyZ2V0LCBpbnQgcG9zLCBpbnQgY29scykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRm9yZWlnbktleUNvbHVtbihWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLAorICAgICAgICBUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwgQ29sdW1uIGNvbCwgT2JqZWN0IHRhcmdldCwgYm9vbGVhbiBpbnZlcnNlLAorICAgICAgICBpbnQgcG9zLCBpbnQgY29scykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29sdW1ucyhWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgQ29sdW1uW10gY29scykgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcHVsYXRlT3JkZXJDb2x1bW5zKEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcHVsYXRlTnVsbEluZGljYXRvckNvbHVtbnMoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KENsYXNzTWFwcGluZyBjbHMsIFRhYmxlIGxvY2FsLAorICAgICAgICBUYWJsZSBmb3JlaWduKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KEZpZWxkTWFwcGluZyBmbSwgVGFibGUgbG9jYWwsCisgICAgICAgIFRhYmxlIGZvcmVpZ24pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleShWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBUYWJsZSBsb2NhbCwKKyAgICAgICAgVGFibGUgZm9yZWlnbiwgYm9vbGVhbiBpbnZlcnNlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBJbmRleCBnZXRKb2luSW5kZXgoRmllbGRNYXBwaW5nIGZtLCBUYWJsZSB0YWJsZSwgQ29sdW1uW10gY29scykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEluZGV4IGdldEluZGV4KFZlcnNpb24gdmVycywgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEluZGV4IGdldEluZGV4KERpc2NyaW1pbmF0b3IgZGlzYywgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFVuaXF1ZSBnZXRKb2luVW5pcXVlKEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUsIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFVuaXF1ZSBnZXRVbmlxdWUoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUsCisgICAgICAgIENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5TmFtZShDbGFzc01hcHBpbmcgY20sIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxQcmltYXJ5S2V5KEZpZWxkTWFwcGluZyBmbSwgVGFibGUgdGFibGUpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTm9uZVN0cmF0ZWd5SW5zdGFsbGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvTm9uZVN0cmF0ZWd5SW5zdGFsbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwYjc5NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9Ob25lU3RyYXRlZ3lJbnN0YWxsZXIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5Ob25lQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5Ob25lRGlzY3JpbWluYXRvclN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk5vbmVGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk5vbmVWZXJzaW9uU3RyYXRlZ3k7CisKKy8qKgorICogQ2xlYXJzIGFsbCBtYXBwaW5nIGluZm9ybWF0aW9uIGZyb20gY2xhc3NlcyBhbmQgaW5zdGFsbHMgbm9uZSBzdHJhdGVnaWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIE5vbmVTdHJhdGVneUluc3RhbGxlcgorICAgIGV4dGVuZHMgU3RyYXRlZ3lJbnN0YWxsZXIgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBOb25lU3RyYXRlZ3lJbnN0YWxsZXIoTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgc3VwZXIocmVwb3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc3RhbGxTdHJhdGVneShDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIGNscy5jbGVhck1hcHBpbmcoKTsKKyAgICAgICAgY2xzLnNldFN0cmF0ZWd5KE5vbmVDbGFzc1N0cmF0ZWd5LmdldEluc3RhbmNlKCksIG51bGwpOworICAgICAgICBjbHMuc2V0U291cmNlTW9kZShjbHMuTU9ERV9NQVBQSU5HLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIGZpZWxkLmNsZWFyTWFwcGluZygpOworICAgICAgICBmaWVsZC5zZXRTdHJhdGVneShOb25lRmllbGRTdHJhdGVneS5nZXRJbnN0YW5jZSgpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIHZlcnNpb24uY2xlYXJNYXBwaW5nKCk7CisgICAgICAgIHZlcnNpb24uc2V0U3RyYXRlZ3koTm9uZVZlcnNpb25TdHJhdGVneS5nZXRJbnN0YW5jZSgpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koRGlzY3JpbWluYXRvciBkaXNjcmltKSB7CisgICAgICAgIGRpc2NyaW0uY2xlYXJNYXBwaW5nKCk7CisgICAgICAgIGRpc2NyaW0uc2V0U3RyYXRlZ3koTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneS5nZXRJbnN0YW5jZSgpLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUHJvcGVydGllc1JldmVyc2VDdXN0b21pemVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUHJvcGVydGllc1JldmVyc2VDdXN0b21pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4YzBhOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9Qcm9wZXJ0aWVzUmV2ZXJzZUN1c3RvbWl6ZXIuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogU2ltcGxlIHtAbGluayBSZXZlcnNlQ3VzdG9taXplcn0gdGhhdCB1c2VzIGEgcHJvcGVydGllcyBmaWxlIHRvCisgKiB0byBhbGxvdyBjdXN0b21pemF0aW9uIG9mIGJhc2ljIGNsYXNzIGFuZCBmaWVsZCBwcm9wZXJ0aWVzLiBUaGUKKyAqIGN1c3RvbWl6ZXIgdXNlcyB0aGUgZm9sbG93aW5nIGtleXM6CisgKiA8dWw+CisgKiA8bGk+PGk+Jmx0O3RhYmxlIG5hbWUmZ3Q7LnRhYmxlLXR5cGU8L2k+OiBPdmVycmlkZSB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZQorICogZ2l2ZW4gdGFibGUuIExlZ2FsIHZhbHVlcyBhcmU6IDxjb2RlPmJhc2UsIHNlY29uZGFyeSwKKyAqIHNlY29uZGFyeS1vdXRlciwgYXNzb2NpYXRpb24sIHN1YmNsYXNzLCBub25lPC9jb2RlPi4gU2VlCisgKiB0aGUgVEFCTEVfWFhYIGNvbnN0YW50cyBpbiB7QGxpbmsgUmV2ZXJzZU1hcHBpbmdUb29sfSBmb3IgZGVzY3JpcHRpb25zLjwvbGk+CisgKiA8bGk+PGk+Jmx0O2NsYXNzIG5hbWUmZ3Q7LnJlbmFtZTwvaT46IE92ZXJyaWRlIHRoZSB0b29sLWdlbmVyYXRlZCBjbGFzcyBuYW1lCisgKiB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gVXNlIGZ1bGwgY2xhc3MgbmFtZXMsIGluY2x1ZGluZyBwYWNrYWdlLiBVc2UgYQorICogdmFsdWUgb2YgPGNvZGU+bm9uZTwvY29kZT4gdG8gcmVqZWN0IHRoZSBjbGFzcyBhbmQgbGVhdmUgdGhlCisgKiBjb3JyZXNwb25kaW5nIHRhYmxlIHVubWFwcGVkLjwvbGk+CisgKiA8bGk+PGk+Jmx0O3RhYmxlIG5hbWUmZ3Q7LmNsYXNzLW5hbWU8L2k+OiBBc3NpZ24gdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZAorICogY2xhc3MgbmFtZSB0byB0aGUgdHlwZSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIHRhYmxlLiBVc2UgYSB2YWx1ZSBvZgorICogPGNvZGU+bm9uZTwvY29kZT4gdG8gcHJldmVudCBtYXBwaW5nIHRoaXMgdGFibGUuIFRoaXMgcHJvcGVydHkgY2FuIGJlCisgKiB1c2VkIGluIHBsYWNlIG9mIHRoZSA8Y29kZT5yZW5hbWU8L2NvZGU+IHByb3BlcnR5LgorICogPGxpPjxpPiZsdDtjbGFzcyBuYW1lJmd0Oy5pZGVudGl0eTwvaT46IFNldCB0aGlzIHByb3BlcnR5IHRvCisgKiA8Y29kZT5kYXRhc3RvcmU8L2NvZGU+LCA8Y29kZT5idWlsdGluPC9jb2RlPiwgb3IgdGhlIGRlc2lyZWQKKyAqIGZ1bGx5LXF1YWxpZmllZCBhcHBsaWNhdGlvbiBpZGVudGl0eSBjbGFzcyBuYW1lIHRvIG92ZXJyaWRlIHRoZQorICogcmV2ZXJzZSBtYXBwaW5nIHRvb2wncyBkZWZhdWx0IGlkZW50aXR5IHNldHRpbmdzLiBJZiB0aGUgY2xhc3MgaGFzIGJlZW4KKyAqIHJlbmFtZWQsIHVzZSB0aGUgbmV3IG5hbWUuPC9saT4KKyAqIDxsaT48aT4mbHQ7Y2xhc3MgbmFtZSZndDsuJmx0O2ZpZWxkIG5hbWUmZ3Q7LnJlbmFtZTwvaT46IE92ZXJyaWRlIHRoZQorICogdG9vbC1nZW5lcmF0ZWQgZmllbGQgbmFtZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gVXNlIHRoZSBmaWVsZCBvd25lcidzCisgKiBmdWxsIGNsYXNzIG5hbWUgaW4gdGhlIHByb3BlcnR5IGtleS4gVGhlIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSB0aGUKKyAqIG5ldyBmaWVsZCBuYW1lLCB3aXRob3V0IHRoZSBwcmVjZWRpbmcgY2xhc3MgbmFtZS4gVXNlIGEgdmFsdWUgb2YKKyAqIDxjb2RlPm5vbmU8L2NvZGU+IHRvIHJlamVjdCB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcuPC9saT4KKyAqIDxsaT48aT4mbHQ7dGFibGUgbmFtZSZndDsuJmx0O2NvbHVtbiBuYW1lJmd0Oy5maWVsZC1uYW1lPC9pPjogQXNzaWduIHRoZQorICogZmllbGQgbmFtZSB0byB1c2UgZm9yIHRoZSBtYXBwaW5nIG9mIGEgcGFydGljdWxhciBjb2x1bW4uIElmIHRoaXMgaXMKKyAqIGEgbXVsdGktY29sdW1uIG1hcHBpbmcsIGFueSBvbmUgb2YgdGhlIGNvbHVtbnMgY2FuIGJlIHVzZWQuIFVzZSBhIHZhbHVlCisgKiBvZiA8Y29kZT5ub25lPC9jb2RlPiB0byBwcmV2ZW50IHRoZSBjb2x1bW4gKGFuZCBhc3NvY2lhdGVkIGNvbHVtbnMpCisgKiBmcm9tIGJlaW5nIG1hcHBlZC4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUKKyAqIDxjb2RlPnJlbmFtZTwvY29kZT4gcHJvcGVydHkuCisgKiA8bGk+PGk+Jmx0O2NsYXNzIG5hbWUmZ3Q7LiZsdDtmaWVsZCBuYW1lJmd0Oy50eXBlPC9pPjogVGhlIGNsYXNzIG5hbWUgb2YKKyAqIHRoZSB0eXBlIHRvIGdpdmUgdGhlIG5hbWVkIGZpZWxkLiBVc2UgZnVsbCBjbGFzcyBuYW1lcy4gSWYgdGhlIGZpZWxkCisgKiBoYXMgYmVlbiByZW5hbWVkLCB1c2UgdGhlIG5ldyBuYW1lLjwvbGk+CisgKiA8bGk+PGk+Jmx0O2NsYXNzIG5hbWUmZ3Q7LiZsdDtmaWVsZCBuYW1lJmd0Oy52YWx1ZTwvaT46IFRoZSBpbml0aWFsIHZhbHVlCisgKiBmb3IgdGhlIG5hbWVkIGZpZWxkLiBUaGUgZ2l2ZW4gc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGFzLWlzIGluIHRoZQorICogZ2VuZXJhdGVkIEphdmEgY29kZSwgc28gYmUgc3VyZSB0byBhZGQgcXVvdGVzIHRvIHN0cmluZ3MsIGV0Yy4gSWYgdGhlCisgKiBmaWVsZCBoYXMgYmVlbiByZW5hbWVkLCB1c2UgdGhlIG5ldyBuYW1lLjwvbGk+CisgKiA8L3VsPiBBbGwga2V5cyBhcmUgb3B0aW9uYWw7IGlmIG5vdCBzcGVjaWZpZWQsIHRoZSBjdXN0b21pemVyIGtlZXBzIHRoZQorICogZGVmYXVsdCB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIHJldmVyc2UgbWFwcGluZyB0b29sLgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydGllc1JldmVyc2VDdXN0b21pemVyCisgICAgaW1wbGVtZW50cyBSZXZlcnNlQ3VzdG9taXplciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChQcm9wZXJ0aWVzUmV2ZXJzZUN1c3RvbWl6ZXIuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIFJldmVyc2VNYXBwaW5nVG9vbCB0b29sID0gbnVsbDsKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgX3Byb3BzID0gbnVsbDsKKyAgICBwcml2YXRlIFNldCBfdW5hY2Nlc3NlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAgICAgX3Byb3BzID0gcHJvcHM7CisgICAgICAgIF91bmFjY2Vzc2VkID0gbmV3IFRyZWVTZXQocHJvcHMua2V5U2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvb2woUmV2ZXJzZU1hcHBpbmdUb29sIHRvb2wpIHsKKyAgICAgICAgdGhpcy50b29sID0gdG9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRhYmxlVHlwZShUYWJsZSB0YWJsZSwgaW50IGRlZmF1bHRUeXBlKSB7CisgICAgICAgIFN0cmluZyB0eXBlID0gZ2V0UHJvcGVydHkodGFibGUuZ2V0TmFtZSgpICsgIi50YWJsZS10eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwgJiYgdGFibGUuZ2V0U2NoZW1hTmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICB0eXBlID0gZ2V0UHJvcGVydHkodGFibGUuZ2V0RnVsbE5hbWUoKSArICIudGFibGUtdHlwZSIpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUeXBlOworICAgICAgICBpZiAoIm5vbmUiLmVxdWFscyh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBSZXZlcnNlTWFwcGluZ1Rvb2wuVEFCTEVfTk9ORTsKKyAgICAgICAgaWYgKCJiYXNlIi5lcXVhbHModHlwZSkpCisgICAgICAgICAgICByZXR1cm4gUmV2ZXJzZU1hcHBpbmdUb29sLlRBQkxFX0JBU0U7CisgICAgICAgIGlmICgic2Vjb25kYXJ5Ii5lcXVhbHModHlwZSkpCisgICAgICAgICAgICByZXR1cm4gUmV2ZXJzZU1hcHBpbmdUb29sLlRBQkxFX1NFQ09OREFSWTsKKyAgICAgICAgaWYgKCJzZWNvbmRhcnktb3V0ZXIiLmVxdWFscyh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBSZXZlcnNlTWFwcGluZ1Rvb2wuVEFCTEVfU0VDT05EQVJZX09VVEVSOworICAgICAgICBpZiAoImFzc29jaWF0aW9uIi5lcXVhbHModHlwZSkpCisgICAgICAgICAgICByZXR1cm4gUmV2ZXJzZU1hcHBpbmdUb29sLlRBQkxFX0FTU09DSUFUSU9OOworICAgICAgICBpZiAoInN1YmNsYXNzIi5lcXVhbHModHlwZSkpCisgICAgICAgICAgICByZXR1cm4gUmV2ZXJzZU1hcHBpbmdUb29sLlRBQkxFX1NVQkNMQVNTOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRhYmxlLmdldE5hbWUoKSArICIudGFibGUtdHlwZTogIgorICAgICAgICAgICAgKyB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZShUYWJsZSB0YWJsZSwgU3RyaW5nIGRlZmF1bHROYW1lKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBhIHJlbmFtZSBwcm9wZXJ0eSBvciBhIHRhYmxlLW5hbWluZyBwcm9wZXJ0eQorICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5KGRlZmF1bHROYW1lICsgIi5yZW5hbWUiKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbmFtZSA9IGdldFByb3BlcnR5KHRhYmxlLmdldE5hbWUoKSArICIuY2xhc3MtbmFtZSIpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiB0YWJsZS5nZXRTY2hlbWFOYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuYW1lID0gZ2V0UHJvcGVydHkodGFibGUuZ2V0RnVsbE5hbWUoKSArICIuY2xhc3MtbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRvb2wuZ2V0TG9nKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICB0b29sLmdldExvZygpLnRyYWNlKF9sb2MuZ2V0KCJjdXN0b20tbm8tY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TmFtZSwgdGFibGUpKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgibm9uZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAodG9vbC5nZXRMb2coKS5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgdG9vbC5nZXRMb2coKS5pbmZvKF9sb2MuZ2V0KCJjdXN0b20tcm0tY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TmFtZSwgdGFibGUpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvb2wuZ2V0TG9nKCkuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgdG9vbC5nZXRMb2coKS5pbmZvKF9sb2MuZ2V0KCJjdXN0b20tY2xhc3MiLCBkZWZhdWx0TmFtZSwgbmFtZSkpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21pemUoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICAvLyBjdXN0b21pemUgaWRlbnRpdHkgdHlwZQorICAgICAgICBTdHJpbmcgaWQgPSBnZXRQcm9wZXJ0eShjbHMuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE5hbWUoKQorICAgICAgICAgICAgKyAiLmlkZW50aXR5Iik7CisgICAgICAgIGlmICgiZGF0YXN0b3JlIi5lcXVhbHMoaWQpKSB7CisgICAgICAgICAgICBjbHMuc2V0T2JqZWN0SWRUeXBlKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIGNscy5zZXRJZGVudGl0eVR5cGUoQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRSk7CisgICAgICAgIH0gZWxzZSBpZiAoImJ1aWx0aW4iLmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgIGNscy5zZXRPYmplY3RJZFR5cGUobnVsbCwgZmFsc2UpOworICAgICAgICAgICAgY2xzLnNldElkZW50aXR5VHlwZShDbGFzc01hcHBpbmcuSURfQVBQTElDQVRJT04pOworICAgICAgICB9IGVsc2UgaWYgKGlkICE9IG51bGwpCisgICAgICAgICAgICBjbHMuc2V0T2JqZWN0SWRUeXBlKHRvb2wuZ2VuZXJhdGVDbGFzcyhpZCwgbnVsbCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29kZShDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21pemUoRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIFN0cmluZyB0eXBlID0gZ2V0UHJvcGVydHkoZmllbGQuZ2V0RnVsbE5hbWUoZmFsc2UpICsgIi50eXBlIik7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICBmaWVsZC5zZXREZWNsYXJlZFR5cGUoU3RyaW5ncy50b0NsYXNzKHR5cGUsIG51bGwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZShDbGFzc01hcHBpbmcgZGVjLCBDb2x1bW5bXSBjb2xzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIGEgcmVuYW1lIHByb3BlcnR5IG9yIGEgY29sdW1uLW5hbWluZyBwcm9wZXJ0eQorICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5KGRlYy5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpICsgIi4iCisgICAgICAgICAgICArIGRlZmF1bHROYW1lICsgIi5yZW5hbWUiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IG5hbWUgPT0gbnVsbCAmJiBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbmFtZSA9IGdldFByb3BlcnR5KGNvbHNbaV0uZ2V0VGFibGVOYW1lKCkgKyAiLiIKKyAgICAgICAgICAgICAgICArIGNvbHNbaV0uZ2V0TmFtZSgpICsgIi4iICsgImZpZWxkLW5hbWUiKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgY29sc1tpXS5nZXRUYWJsZSgpLmdldFNjaGVtYU5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRQcm9wZXJ0eShjb2xzW2ldLmdldFRhYmxlKCkuZ2V0RnVsbE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIuIiArIGNvbHNbaV0uZ2V0TmFtZSgpICsgIi4iICsgImZpZWxkLW5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0b29sLmdldExvZygpLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgdG9vbC5nZXRMb2coKS50cmFjZShfbG9jLmdldCgiY3VzdG9tLW5vLWZpZWxkIiwgZGVmYXVsdE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRlYykpOworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHROYW1lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJub25lIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIGlmICh0b29sLmdldExvZygpLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICB0b29sLmdldExvZygpLmluZm8oX2xvYy5nZXQoImN1c3RvbS1ybS1maWVsZCIsIGRlZmF1bHROYW1lLAorICAgICAgICAgICAgICAgICAgICBkZWMpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvb2wuZ2V0TG9nKCkuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgdG9vbC5nZXRMb2coKS5pbmZvKF9sb2MuZ2V0KCJjdXN0b20tZmllbGQiLCBkZWZhdWx0TmFtZSwgZGVjLAorICAgICAgICAgICAgICAgIG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsVmFsdWUoRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eShmaWVsZC5nZXRGdWxsTmFtZShmYWxzZSkgKyAiLnZhbHVlIik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbihGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZENvZGUoRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHVubWFwcGVkVGFibGUoVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoIV91bmFjY2Vzc2VkLmlzRW1wdHkoKSAmJiB0b29sLmdldExvZygpLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICB0b29sLmdldExvZygpLnRyYWNlKF9sb2MuZ2V0KCJjdXN0b20tdW51c2VkLXByb3BzIiwgX3VuYWNjZXNzZWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyB2YWwgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKF9wcm9wcy5nZXRQcm9wZXJ0eShrZXkpKTsKKyAgICAgICAgX3VuYWNjZXNzZWQucmVtb3ZlKGtleSk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1F1ZXJ5UmVzdWx0TWFwcGluZy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1F1ZXJ5UmVzdWx0TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGU0NTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUXVlcnlSZXN1bHRNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw2MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5Tb3VyY2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuQ29tbWVudGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogTWFwcGluZyBvZiBhIHF1ZXJ5IHJlc3VsdCBzZXQgdG8gc2NhbGFyIGFuZC9vciBwZXJzaXN0ZW5jZS1jYXBhYmxlCisgKiBvYmplY3QtbGV2ZWwgdmFsdWVzLgorICoKKyAqIEBhdXRob3IgUGluYWtpIFBvZGRhcgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UmVzdWx0TWFwcGluZworICAgIGltcGxlbWVudHMgTWV0YURhdGFNb2RlcywgU291cmNlVHJhY2tlciwgQ29tbWVudGFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUXVlcnlSZXN1bHRNYXBwaW5nLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lOworICAgIHByaXZhdGUgZmluYWwgTWFwcGluZ1JlcG9zaXRvcnkgX3JlcG9zOworICAgIHByaXZhdGUgRmlsZSBfZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3QgX3Njb3BlID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc3JjVHlwZSA9IFNSQ19PVEhFUjsKKyAgICBwcml2YXRlIGludCBfbW9kZSA9IE1PREVfUVVFUlk7CisgICAgcHJpdmF0ZSBDbGFzcyBfY2xhc3MgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9pZHggPSAwOworICAgIHByaXZhdGUgU3RyaW5nW10gX2NvbW1lbnRzID0gbnVsbDsKKyAgICBwcml2YXRlIExpc3QgX2NvbExpc3QgPSBudWxsOworICAgIHByaXZhdGUgTGlzdCBfcGNMaXN0ID0gbnVsbDsKKworICAgIHByaXZhdGUgUENSZXN1bHRbXSBfcGNzID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdFtdIF9jb2xzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqLworICAgIFF1ZXJ5UmVzdWx0TWFwcGluZyhTdHJpbmcgbmFtZSwgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgICAgICBfcmVwb3MgPSByZXBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgcXVlcnkgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0aGF0IGRlZmluZXMgdGhpcyBxdWVyeSByZXN1bHQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGVmaW5pbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gX2NsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0aGF0IGRlZmluZXMgdGhpcyBxdWVyeSByZXN1bHQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZpbmluZ1R5cGUoQ2xhc3MgY2xzKSB7CisgICAgICAgIF9jbGFzcyA9IGNsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZHMgb2YgbWFwcGVkIHNjYWxhciBjb2x1bW5zIGluIHRoZSByZXN1bHQuIFRoZXNlIHdpbGwgdHlwaWNhbGx5IGJlCisgICAgICogY29sdW1uIG5hbWVzLgorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0CisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldENvbHVtblJlc3VsdHMoKSB7CisgICAgICAgIGlmIChfY29scyA9PSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3RbXSBjb2xzOworICAgICAgICAgICAgaWYgKF9jb2xMaXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgY29scyA9IG5ldyBPYmplY3RbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29scyA9IF9jb2xMaXN0LnRvQXJyYXkoKTsKKyAgICAgICAgICAgIF9jb2xzID0gY29sczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NvbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBpZCBvZiBhIG1hcHBlZCBjb2x1bW4gaW4gdGhlIHF1ZXJ5IHJlc3VsdC4gVGhpcyB3aWxsIHR5cGljYWxseQorICAgICAqIGJlIGEgY29sdW1uIG5hbWUuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb2x1bW5SZXN1bHQoT2JqZWN0IGlkKSB7CisgICAgICAgIF9jb2xzID0gbnVsbDsKKyAgICAgICAgaWYgKF9jb2xMaXN0ID09IG51bGwpCisgICAgICAgICAgICBfY29sTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgX2NvbExpc3QuYWRkKGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hcHBlZCBwZXJzaXN0ZW5jZS1jYXBhYmxlIHR5cGVzIGluIHRoZSBxdWVyeSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIFBDUmVzdWx0W10gZ2V0UENSZXN1bHRzKCkgeworICAgICAgICBpZiAoX3BjcyA9PSBudWxsKSB7CisgICAgICAgICAgICBQQ1Jlc3VsdFtdIHBjczsKKyAgICAgICAgICAgIGlmIChfcGNMaXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcGNzID0gbmV3IFBDUmVzdWx0WzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBjcyA9IChQQ1Jlc3VsdFtdKSBfcGNMaXN0LnRvQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBQQ1Jlc3VsdFtfcGNMaXN0LnNpemUoKV0pOworICAgICAgICAgICAgX3BjcyA9IHBjczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3BjczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtYXBwZWQgcGVyc2lzdGVuY2UtY2FwYWJsZSByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gY2FuZGlkYXRlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFBDUmVzdWx0IGFkZFBDUmVzdWx0KENsYXNzIGNhbmRpZGF0ZSkgeworICAgICAgICBfcGNzID0gbnVsbDsKKyAgICAgICAgUENSZXN1bHQgcGMgPSBuZXcgUENSZXN1bHQoY2FuZGlkYXRlKTsKKyAgICAgICAgaWYgKF9wY0xpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIF9wY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIF9wY0xpc3QuYWRkKHBjKTsKKyAgICAgICAgcmV0dXJuIHBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgbW9kZSBvZiB0aGlzIHF1ZXJ5IHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvdXJjZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBfbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIG1vZGUgb2YgdGhpcyBxdWVyeSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBfbW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsYXRpdmUgb3JkZXIgb2YgcmVzdWx0IG1hcHBpbmcgaW4gbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMaXN0aW5nSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfaWR4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGF0aXZlIG9yZGVyIG9mIHJlc3VsdCBtYXBwaW5nIGluIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RpbmdJbmRleChpbnQgaWR4KSB7CisgICAgICAgIF9pZHggPSBpZHg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbW1lbnRhYmxlCisgICAgLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiAoX2NvbW1lbnRzID09IG51bGwpID8gRU1QVFlfQ09NTUVOVFMgOiBfY29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudHMoU3RyaW5nW10gY29tbWVudHMpIHsKKyAgICAgICAgX2NvbW1lbnRzID0gY29tbWVudHM7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTb3VyY2VUcmFja2VyIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUZpbGUoKSB7CisgICAgICAgIHJldHVybiBfZmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gX3Njb3BlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShGaWxlIGZpbGUsIE9iamVjdCBzY29wZSwgaW50IHNyY1R5cGUpIHsKKyAgICAgICAgX2ZpbGUgPSBmaWxlOworICAgICAgICBfc2NvcGUgPSBzY29wZTsKKyAgICAgICAgX3NyY1R5cGUgPSBzcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gKF9jbGFzcyA9PSBudWxsKSA/IF9uYW1lIDogX2NsYXNzLmdldE5hbWUoKSArICI6IiArIF9uYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcGVyc2lzdGVuY2UtY2FwYWJsZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFBDUmVzdWx0IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGF0aCB0b2tlbiB0byByZXByZXNlbnQgYSBkaXNjcmltaW5hdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ1JJTUlOQVRPUiA9ICI8ZGlzY3JpbWluYXRvcj4iOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgX2NhbmRpZGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc01hcHBpbmcgX2NhbmRpZGF0ZU1hcCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgTWFwIF9yYXdNYXBwaW5ncyA9IG51bGw7IC8vIHN0cmluZy0+b2JqZWN0CisgICAgICAgIHByaXZhdGUgTWFwIF9tYXBwaW5ncyA9IG51bGw7IC8vIGxpc3QtPmNvbHVtbm1hcAorICAgICAgICBwcml2YXRlIE1hcCBfZWFnZXIgPSBudWxsOyAvLyBsaXN0LT5mZXRjaGluZm8KKyAgICAgICAgcHJpdmF0ZSBGZXRjaEluZm8gX2ZldGNoSW5mbyA9IG51bGw7IC8vIGZvciB0b3AtbGV2ZWwKKworICAgICAgICAvKioKKyAgICAgICAgICogU3VwcGx5IGNhbmRpZGF0ZSB0eXBlIG9uIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgUENSZXN1bHQoQ2xhc3MgY2FuZGlkYXRlKSB7CisgICAgICAgICAgICBfY2FuZGlkYXRlID0gY2FuZGlkYXRlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZXN1bHQgY2FuZGlkYXRlIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENsYXNzIGdldENhbmRpZGF0ZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gX2NhbmRpZGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5kaWRhdGUgbWFwcGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0Q2FuZGlkYXRlVHlwZU1hcHBpbmcoKSB7CisgICAgICAgICAgICBpZiAoX2NhbmRpZGF0ZU1hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9jYW5kaWRhdGVNYXAgPSBfcmVwb3MuZ2V0TWFwcGluZyhfY2FuZGlkYXRlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBfY2FuZGlkYXRlTWFwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgcmF3IG1hcHBpbmcgcGF0aHMgc3VwcGxpZWQgd2l0aCB7QGxpbmsgI2FkZE1hcHBpbmd9LCBvcgorICAgICAgICAgKiBlbXB0eSBhcnJheSBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1hcHBpbmdQYXRocygpIHsKKyAgICAgICAgICAgIGlmIChfcmF3TWFwcGluZ3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24ga2V5cyA9IF9yYXdNYXBwaW5ncy5rZXlTZXQoKTsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIGtleXMudG9BcnJheShuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBtYXBwaW5nIGlkIGZvciB0aGUgZ2l2ZW4gcGF0aCBzdXBwbGllZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjYWRkTWFwcGluZ30sIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0TWFwcGluZyhTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgcmV0dXJuIChfcmF3TWFwcGluZ3MgPT0gbnVsbCkgPyBudWxsIDogX3Jhd01hcHBpbmdzLmdldChwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXAgdGhlIGdpdmVuIHBhdGggdG8gdGhlIGdpdmVuIHJlc3VsdCBpZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHBhdGgsIE9iamVjdCBpZCkgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocGF0aCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJudWxsLXBhdGgiLAorICAgICAgICAgICAgICAgICAgICBRdWVyeVJlc3VsdE1hcHBpbmcudGhpcywgX2NhbmRpZGF0ZSkpOworCisgICAgICAgICAgICBfbWFwcGluZ3MgPSBudWxsOworICAgICAgICAgICAgX2VhZ2VyID0gbnVsbDsKKyAgICAgICAgICAgIF9mZXRjaEluZm8gPSBudWxsOworICAgICAgICAgICAgaWYgKF9yYXdNYXBwaW5ncyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9yYXdNYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBfcmF3TWFwcGluZ3MucHV0KHBhdGgsIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXAgdGhlIGdpdmVuIHJlcXVlc3Qgb250byBhIHJlc3VsdCBpZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdGggc3RhY2sgb2YgZGF0YSByZXF1ZXN0cyAoc2VlCisgICAgICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0I3N0YXJ0RGF0YVJlcXVlc3R9KQorICAgICAgICAgKiBAcGFyYW0gaWQgcmVxdWVzdGVkIGlkIG9yIGNvbHVtbiAoc2VlCisgICAgICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0fSBBUElzKQorICAgICAgICAgKiBAcGFyYW0gam9pbnMgcmVxdWVzdGVkIGpvaW5zLCBvciBudWxsCisgICAgICAgICAqIEByZXR1cm4gdGhlIGlkIG9yIGNvbHVtbiB0byBmZXRjaCBmcm9tIHRoZSByZXN1bHQKKyAgICAgICAgICogKHR5cGljYWxseSBhIGNvbHVtbiBuYW1lKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBtYXAoTGlzdCBwYXRoLCBPYmplY3QgaWQsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgICAgICBpZiAoX3Jhd01hcHBpbmdzID09IG51bGwgfHwgIShpZCBpbnN0YW5jZW9mIENvbHVtbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlkOworCisgICAgICAgICAgICByZXNvbHZlKCk7CisgICAgICAgICAgICBDb2x1bW5NYXAgY20gPSAoQ29sdW1uTWFwKSBfbWFwcGluZ3MuZ2V0KHBhdGgpOworICAgICAgICAgICAgcmV0dXJuIChjbSA9PSBudWxsKSA/IGlkIDogY20ubWFwKChDb2x1bW4pIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwcGVkIHJlc3VsdCBjb250YWlucyBlYWdlciBkYXRhIGZvciB0aGUgZ2l2ZW4KKyAgICAgICAgICogZmllbGQgYXQgdGhlIGdpdmVuIHBhdGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoIHN0YWNrIG9mIGRhdGEgcmVxdWVzdHMgKHNlZQorICAgICAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdCNzdGFydERhdGFSZXF1ZXN0fSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0VhZ2VyKExpc3QgcGF0aCwgRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgICAgICBpZiAoX3Jhd01hcHBpbmdzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXNvbHZlKCk7CisgICAgICAgICAgICBpZiAocGF0aC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9mZXRjaEluZm8uZWFnZXIuZ2V0KGZpZWxkLmdldEluZGV4KCkpOworICAgICAgICAgICAgaWYgKF9lYWdlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEZldGNoSW5mbyBpbmZvID0gKEZldGNoSW5mbykgX2VhZ2VyLmdldChwYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBpbmZvICE9IG51bGwgJiYgaW5mby5lYWdlci5nZXQoZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBmaWVsZCBpbmRleGVzIHRvIGV4Y2x1ZGUgd2hlbiBsb2FkaW5nIGRhdGEgZm9yIHRoZQorICAgICAgICAgKiBnaXZlbiBwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJpdFNldCBnZXRFeGNsdWRlcyhMaXN0IHBhdGgpIHsKKyAgICAgICAgICAgIGlmIChfcmF3TWFwcGluZ3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmVzb2x2ZSgpOworICAgICAgICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBfZmV0Y2hJbmZvLmV4Y2x1ZGVzOworICAgICAgICAgICAgaWYgKF9lYWdlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgRmV0Y2hJbmZvIGluZm8gPSAoRmV0Y2hJbmZvKSBfZWFnZXIuZ2V0KHBhdGgpOworICAgICAgICAgICAgcmV0dXJuIChpbmZvID09IG51bGwpID8gbnVsbCA6IGluZm8uZXhjbHVkZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb2x2ZSBpbnRlcm5hbCBkYXRhc3RydWN0dXJlcyBmcm9tIHJhdyBtYXBwaW5ncy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVzb2x2ZSgpIHsKKyAgICAgICAgICAgIGlmIChfcmF3TWFwcGluZ3MgPT0gbnVsbCB8fCBfbWFwcGluZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIF9tYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBfZmV0Y2hJbmZvID0gbmV3IEZldGNoSW5mbyhnZXRDYW5kaWRhdGVUeXBlTWFwcGluZygpKTsKKworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfcmF3TWFwcGluZ3MuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIHJlc29sdmVNYXBwaW5nKChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvbHZlIHRoZSBnaXZlbiBtYXBwaW5nIHBhdGguCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZU1hcHBpbmcoU3RyaW5nIHBhdGgsIE9iamVjdCBpZCkgeworICAgICAgICAgICAgLy8gYnVpbGQgdXAgcGF0aCB0byBzZWNvbmQtdG8tbGFzdCB0b2tlbgorICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gU3RyaW5ncy5zcGxpdChwYXRoLCAiLiIsIDApOworICAgICAgICAgICAgTGlzdCBycGF0aCA9IG5ldyBBcnJheUxpc3QodG9rZW5zLmxlbmd0aCk7CisgICAgICAgICAgICBDbGFzc01hcHBpbmcgY2FuZGlkYXRlID0gZ2V0Q2FuZGlkYXRlVHlwZU1hcHBpbmcoKTsKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZyBmbSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmbSA9IGNhbmRpZGF0ZS5nZXRGaWVsZE1hcHBpbmcodG9rZW5zW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoZm0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVJlc3VsdE1hcHBpbmcudGhpcywgX2NhbmRpZGF0ZSwgcGF0aCkpOworCisgICAgICAgICAgICAgICAgaWYgKGZtLmdldEVtYmVkZGVkTWFwcGluZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkSW5jbHVkZWQoY2FuZGlkYXRlLCBycGF0aCwgZm0pOworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBmbS5nZXRFbWJlZGRlZE1hcHBpbmcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gZm0uZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgidW50cmF2ZXJzYWJsZS1wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZy50aGlzLCBfY2FuZGlkYXRlLCBwYXRoKSk7CisgICAgICAgICAgICAgICAgcnBhdGguYWRkKGZtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBpZiAoRElTQ1JJTUlOQVRPUi5lcXVhbHMobGFzdFRva2VuKSkgeworICAgICAgICAgICAgICAgIERpc2NyaW1pbmF0b3IgZGlzY3JpbSA9IGNhbmRpZGF0ZS5nZXREaXNjcmltaW5hdG9yKCk7CisgICAgICAgICAgICAgICAgcnBhdGguYWRkKGRpc2NyaW0pOworICAgICAgICAgICAgICAgIGFzc2VydFNpbmdsZUNvbHVtbihkaXNjcmltLmdldENvbHVtbnMoKSwgcGF0aCk7CisgICAgICAgICAgICAgICAgX21hcHBpbmdzLnB1dChycGF0aCwgbmV3IFNpbmdsZUNvbHVtbk1hcChpZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaWVsZE1hcHBpbmcgbGFzdCA9IGNhbmRpZGF0ZS5nZXRGaWVsZE1hcHBpbmcobGFzdFRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoInVudHJhdmVyc2FibGUtcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVJlc3VsdE1hcHBpbmcudGhpcywgX2NhbmRpZGF0ZSwgcGF0aCkpOworICAgICAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBsYXN0LmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdC5pc1ZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgY29scyA9IGNhbmRpZGF0ZS5nZXRWZXJzaW9uKCkuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgICAgIGFzc2VydFNpbmdsZUNvbHVtbihjb2xzLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBDb2x1bW4gY29sID0gY29sc1swXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWFsLWNhc2Ugb2lkIGZpZWxkcywgc2luY2UgcGF0aCBsaXN0cyBzdXBwbGllZCBmb3IKKyAgICAgICAgICAgICAgICAvLyB0aGVtIGF0IHJ1bnRpbWUgZG9uJ3QgaW5jbHVkZSB0aGUgZW1iZWRkZWQgZmllbGRzCisgICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwgJiYgZm0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ29tcGxleENvbHVtbk1hcHBpbmcoZm0sIHJwYXRoLCBjb2wsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsICYmIGZtLmdldEZvcmVpZ25LZXkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsYXN0IGZpZWxkIGlzIG9uZSBvZiB0aGUgam9pbmFibGVzIHVzZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uJ3MgZm9yZWlnbiBrZXksIG1hcCB0byByZWxhdGlvbiBmaWVsZCBwYXRoLgorICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHJlY29yZCB0aGF0IHdlIGhhdmUgYW4gZWFnZXIgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIENvbHVtbiBma0NvbCA9IGZtLmdldEZvcmVpZ25LZXkoKS5nZXRDb2x1bW4oY29sKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZrQ29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDb21wbGV4Q29sdW1uTWFwcGluZyhmbSwgbmV3IEFycmF5TGlzdChycGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmtDb2wsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRFYWdlcihjYW5kaWRhdGUsIHJwYXRoLCBmbSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRJbmNsdWRlZChjYW5kaWRhdGUsIHJwYXRoLCBsYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZWNvcmRJbmNsdWRlZChjYW5kaWRhdGUsIHJwYXRoLCBsYXN0KTsKKworICAgICAgICAgICAgICAgIC8vIG1hcCB0byByZWxhdGVkIGZpZWxkIHBhdGguIGJlY2F1c2UgdGhlIFNpbmdsZUNvbHVtbk1hcAorICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgdGVzdCB0aGUgcmVxdWVzdGVkIGNvbHVtbiwgaXQgd2lsbCBhY2NlcHQKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBmb3IgYm90aCB0aGUgZmsgY29sIG9yIHRoZSByZWxhdGVkIGZpZWxkIGNvbAorICAgICAgICAgICAgICAgIHJwYXRoLmFkZChsYXN0KTsKKyAgICAgICAgICAgICAgICBfbWFwcGluZ3MucHV0KHJwYXRoLCBuZXcgU2luZ2xlQ29sdW1uTWFwKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGFwcHJvcHJpYXRlIGNvbHVtbiBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tcGxleENvbHVtbk1hcHBpbmcoRmllbGRNYXBwaW5nIGZtLCBMaXN0IHJwYXRoLAorICAgICAgICAgICAgQ29sdW1uIGNvbCwgT2JqZWN0IGlkKSB7CisgICAgICAgICAgICBpZiAoZm0uZ2V0Q29sdW1ucygpLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIF9tYXBwaW5ncy5wdXQocnBhdGgsIG5ldyBTaW5nbGVDb2x1bW5NYXAoaWQpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE11bHRpQ29sdW1uTWFwIG1jbSA9IChNdWx0aUNvbHVtbk1hcCkgX21hcHBpbmdzLmdldChycGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKG1jbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1jbSA9IG5ldyBNdWx0aUNvbHVtbk1hcChmbS5nZXRDb2x1bW5zKCkpOworICAgICAgICAgICAgICAgICAgICBfbWFwcGluZ3MucHV0KHJwYXRoLCBtY20pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtY20uc2V0KGNvbCwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciBub3csIHdlIG9ubHkgYWxsb3cgbWFwcGluZ3Mgd2l0aCBhIHNpbmdsZSBjb2x1bW4uIEluIHRoZQorICAgICAgICAgKiBmdXR1cmUgd2UgbWlnaHQgaW50cm9kdWNlIGEgc3ludGF4IHRvIG1hcCBtdWx0aXBsZSBjb2x1bW5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNpbmdsZUNvbHVtbihDb2x1bW5bXSBjb2xzLCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgaWYgKGNvbHMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJudW0tY29scy1wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgUXVlcnlSZXN1bHRNYXBwaW5nLnRoaXMsIF9jYW5kaWRhdGUsIHBhdGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNvcmQgdGhhdCB0aGVyZSBtYXkgYmUgZWFnZXIgZGF0YSBmb3IgdGhlIGdpdmVuIGZpZWxkIGF0IHRoZSBnaXZlbgorICAgICAgICAgKiBwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlY29yZEVhZ2VyKENsYXNzTWFwcGluZyBjYW5kaWRhdGUsIExpc3QgcGF0aCwKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZyBmbSkgeworICAgICAgICAgICAgaWYgKHBhdGguc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBfZmV0Y2hJbmZvLmVhZ2VyLnNldChmbS5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICBfZmV0Y2hJbmZvLmV4Y2x1ZGVzLmNsZWFyKGZtLmdldEluZGV4KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyByZWNvcmQgYXQgcHJldmlvdXMgcGF0aAorICAgICAgICAgICAgICAgIExpc3QgY29weSA9IG5ldyBBcnJheUxpc3QocGF0aC5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvcHkuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNvcHkuYWRkKHBhdGguZ2V0KGkpKTsKKworICAgICAgICAgICAgICAgIGlmIChfZWFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2VhZ2VyID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICBGZXRjaEluZm8gaW5mbyA9IChGZXRjaEluZm8pIF9lYWdlci5nZXQoY29weSk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gbmV3IEZldGNoSW5mbyhjYW5kaWRhdGUpOworICAgICAgICAgICAgICAgICAgICBfZWFnZXIucHV0KGNvcHksIGluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLmVhZ2VyLnNldChmbS5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICBpbmZvLmV4Y2x1ZGVzLmNsZWFyKGZtLmdldEluZGV4KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY29yZCB0aGF0IHRoZSBmaWVsZCBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZWNvcmRJbmNsdWRlZChDbGFzc01hcHBpbmcgY2FuZGlkYXRlLCBMaXN0IHBhdGgsCisgICAgICAgICAgICBGaWVsZE1hcHBpbmcgZm0pIHsKKyAgICAgICAgICAgIGlmIChwYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBfZmV0Y2hJbmZvLmV4Y2x1ZGVzLmNsZWFyKGZtLmdldEluZGV4KCkpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKF9lYWdlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfZWFnZXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIEZldGNoSW5mbyBpbmZvID0gKEZldGNoSW5mbykgX2VhZ2VyLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgRmV0Y2hJbmZvKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIF9lYWdlci5wdXQobmV3IEFycmF5TGlzdChwYXRoKSwgaW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8uZXhjbHVkZXMuY2xlYXIoZm0uZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGZXRjaEluZm8geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRleGVzIG9mIGZpZWxkcyB0byBleGNsdWRlIGZyb20gbG9hZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBCaXRTZXQgZXhjbHVkZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGV4ZXMgb2YgZWFnZXIgZmllbGRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIEJpdFNldCBlYWdlcjsKKworICAgICAgICBwdWJsaWMgRmV0Y2hJbmZvKENsYXNzTWFwcGluZyB0eXBlKSB7CisgICAgICAgICAgICBGaWVsZE1hcHBpbmdbXSBmbXMgPSB0eXBlLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgICAgIGVhZ2VyID0gbmV3IEJpdFNldChmbXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGV4Y2x1ZGVzID0gbmV3IEJpdFNldChmbXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmICghZm1zW2ldLmlzUHJpbWFyeUtleSgpKQorICAgICAgICAgICAgICAgICAgICBleGNsdWRlcy5zZXQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIG9mIGNvbHVtbnMgdG8gcmVzdWx0IGlkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgQ29sdW1uTWFwIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSByZXN1bHQgaWQgZm9yIHRoZSBnaXZlbiBjb2x1bW4sIG9yIHRoZSBnaXZlbiBjb2x1bQorICAgICAgICAgKiBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBtYXAoQ29sdW1uIGNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIENvbHVtbk1hcH0gc3BlY2lhbGl6ZWQgZm9yIGEgc2luZ2xlIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW5nbGVDb2x1bW5NYXAKKyAgICAgICAgaW1wbGVtZW50cyBDb2x1bW5NYXAgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IF9pZDsKKworICAgICAgICBwdWJsaWMgU2luZ2xlQ29sdW1uTWFwKE9iamVjdCBpZCkgeworICAgICAgICAgICAgX2lkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IG1hcChDb2x1bW4gY29sKSB7CisgICAgICAgICAgICByZXR1cm4gX2lkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBfaWQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBDb2x1bW5NYXB9IHNwZWNpYWxpemVkIGZvciBhIG11bHRpcGxlIGNvbHVtbnMuCisgICAgICogTWFwcyBjb2x1bW5zIGluIGxpbmVhciB0aW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE11bHRpQ29sdW1uTWFwCisgICAgICAgIGltcGxlbWVudHMgQ29sdW1uTWFwIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3QgX2NvbHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gX2lkczsKKworICAgICAgICBwdWJsaWMgTXVsdGlDb2x1bW5NYXAoQ29sdW1uW10gY29scykgeworICAgICAgICAgICAgX2NvbHMgPSBBcnJheXMuYXNMaXN0KGNvbHMpOworICAgICAgICAgICAgX2lkcyA9IG5ldyBPYmplY3RbY29scy5sZW5ndGhdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBtYXAoQ29sdW1uIGNvbCkgeworICAgICAgICAgICAgaW50IGlkeCA9IF9jb2xzLmluZGV4T2YoY29sKTsKKyAgICAgICAgICAgIHJldHVybiAoaWR4ID09IC0xKSA/IGNvbCA6IF9pZHNbaWR4XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChDb2x1bW4gY29sLCBPYmplY3QgaWQpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBfY29scy5pbmRleE9mKGNvbCk7CisgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKQorICAgICAgICAgICAgICAgIF9pZHNbaWR4XSA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBfY29scyArICI9IiArIEFycmF5cy5hc0xpc3QoX2lkcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmVmcmVzaFN0cmF0ZWd5SW5zdGFsbGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmVmcmVzaFN0cmF0ZWd5SW5zdGFsbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1ZWRmZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9SZWZyZXNoU3RyYXRlZ3lJbnN0YWxsZXIuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBBdHRlbXB0cyB0byBpbnN0YWxsIHVzaW5nIHRoZSBnaXZlbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBJZiB0aGF0CisgKiBmYWlscywgY2xlYXJzIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGFuZCBjb25zdHJ1Y3RzIG5ldyBtYXBwaW5ncy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZyZXNoU3RyYXRlZ3lJbnN0YWxsZXIKKyAgICBleHRlbmRzIFN0cmF0ZWd5SW5zdGFsbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFJlZnJlc2hTdHJhdGVneUluc3RhbGxlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIFJlZnJlc2hTdHJhdGVneUluc3RhbGxlcihNYXBwaW5nUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBzdXBlcihyZXBvcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGluZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgQ2xhc3NTdHJhdGVneSBzdHJhdCA9IHJlcG9zLm5hbWVkU3RyYXRlZ3koY2xzKTsKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwpCisgICAgICAgICAgICBzdHJhdCA9IHJlcG9zLmRlZmF1bHRTdHJhdGVneShjbHMsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xzLnNldFN0cmF0ZWd5KHN0cmF0LCBCb29sZWFuLlRSVUUpOworICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBtZGUpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjdXN0b20gc3RyYXRlZ3ksIGRvbid0IGF0dGVtcHQgdG8gb3ZlcnJpZGUKKyAgICAgICAgICAgIGlmIChpc0N1c3RvbVN0cmF0ZWd5KHN0cmF0KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBtZGU7CisKKyAgICAgICAgICAgIHJlcG9zLmdldExvZygpLndhcm4oX2xvYy5nZXQoImZhdGFsLWNoYW5nZSIsIGNscywKKyAgICAgICAgICAgICAgICBtZGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgICBjbHMuY2xlYXJNYXBwaW5nKCk7CisgICAgICAgICAgICBjbHMuc2V0U3RyYXRlZ3kocmVwb3MuZGVmYXVsdFN0cmF0ZWd5KGNscywgdHJ1ZSksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgY2xzLnNldFNvdXJjZU1vZGUoY2xzLk1PREVfTUFQUElORywgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KEZpZWxkTWFwcGluZyBmaWVsZCkgeworICAgICAgICBGaWVsZFN0cmF0ZWd5IHN0cmF0ZWd5ID0gcmVwb3MubmFtZWRTdHJhdGVneShmaWVsZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBudWxsKQorICAgICAgICAgICAgc3RyYXRlZ3kgPSByZXBvcy5kZWZhdWx0U3RyYXRlZ3koZmllbGQsIHRydWUsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmllbGQuc2V0U3RyYXRlZ3koc3RyYXRlZ3ksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIG1kZSkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGN1c3RvbSBzdHJhdGVneSwgZG9uJ3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgIGlmIChpc0N1c3RvbVN0cmF0ZWd5KHN0cmF0ZWd5KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBtZGU7CisKKyAgICAgICAgICAgIHJlcG9zLmdldExvZygpLndhcm4oX2xvYy5nZXQoImZhdGFsLWNoYW5nZSIsIGZpZWxkLAorICAgICAgICAgICAgICAgIG1kZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgIGZpZWxkLmNsZWFyTWFwcGluZygpOworICAgICAgICAgICAgZmllbGQuc2V0SGFuZGxlcihudWxsKTsKKyAgICAgICAgICAgIGZpZWxkLmdldEtleU1hcHBpbmcoKS5zZXRIYW5kbGVyKG51bGwpOworICAgICAgICAgICAgZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5zZXRIYW5kbGVyKG51bGwpOworICAgICAgICAgICAgZmllbGQuc2V0U3RyYXRlZ3kocmVwb3MuZGVmYXVsdFN0cmF0ZWd5KGZpZWxkLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICBWZXJzaW9uU3RyYXRlZ3kgc3RyYXQgPSByZXBvcy5uYW1lZFN0cmF0ZWd5KHZlcnNpb24pOworICAgICAgICBpZiAoc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmF0ID0gcmVwb3MuZGVmYXVsdFN0cmF0ZWd5KHZlcnNpb24sIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmVyc2lvbi5zZXRTdHJhdGVneShzdHJhdCwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFFeGNlcHRpb24gbWRlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY3VzdG9tIHN0cmF0ZWd5LCBkb24ndCBhdHRlbXB0IHRvIG92ZXJyaWRlCisgICAgICAgICAgICBpZiAoaXNDdXN0b21TdHJhdGVneShzdHJhdCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbWRlOworCisgICAgICAgICAgICByZXBvcy5nZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJmYXRhbC1jaGFuZ2UiLCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgIG1kZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgIHZlcnNpb24uY2xlYXJNYXBwaW5nKCk7CisgICAgICAgICAgICB2ZXJzaW9uLnNldFN0cmF0ZWd5KHJlcG9zLmRlZmF1bHRTdHJhdGVneSh2ZXJzaW9uLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KERpc2NyaW1pbmF0b3IgZGlzY3JpbSkgeworICAgICAgICBEaXNjcmltaW5hdG9yU3RyYXRlZ3kgc3RyYXQgPSByZXBvcy5uYW1lZFN0cmF0ZWd5KGRpc2NyaW0pOworICAgICAgICBpZiAoc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmF0ID0gcmVwb3MuZGVmYXVsdFN0cmF0ZWd5KGRpc2NyaW0sIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGlzY3JpbS5zZXRTdHJhdGVneShzdHJhdCwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFFeGNlcHRpb24gbWRlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY3VzdG9tIHN0cmF0ZWd5LCBkb24ndCBhdHRlbXB0IHRvIG92ZXJyaWRlCisgICAgICAgICAgICBpZiAoaXNDdXN0b21TdHJhdGVneShzdHJhdCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbWRlOworCisgICAgICAgICAgICByZXBvcy5nZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJmYXRhbC1jaGFuZ2UiLCBkaXNjcmltLAorICAgICAgICAgICAgICAgIG1kZS5nZXRNZXNzYWdlKCkpKTsKKworICAgICAgICAgICAgLy8gcmV0YWluIG9sZCBkaXNjcmltaW5hdG9yIHZlcnNpb24sIGlmIGFueQorICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGRpc2NyaW0uZ2V0TWFwcGluZ0luZm8oKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZGlzY3JpbS5jbGVhck1hcHBpbmcoKTsKKyAgICAgICAgICAgIGRpc2NyaW0uZ2V0TWFwcGluZ0luZm8oKS5zZXRWYWx1ZSh2YWwpOworICAgICAgICAgICAgZGlzY3JpbS5zZXRTdHJhdGVneShyZXBvcy5kZWZhdWx0U3RyYXRlZ3koZGlzY3JpbSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJhdGVneSBpcyBub3QgYSBidWlsdC1pbiB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDdXN0b21TdHJhdGVneShTdHJhdGVneSBzdHJhdCkgeworICAgICAgICByZXR1cm4gIXN0cmF0LmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUub3BlbmpwYS4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmVsYXRpb25JZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1JlbGF0aW9uSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGMwOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1JlbGF0aW9uSWQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBDYWxsYmFjayB0byBzdG9yZSBhIHJlbGF0aW9uIGFmdGVyIHRoZSBvYmplY3QgaWQgaGFzIGJlZW4gYXNzaWduZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uSWQgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJpYWxpemVkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcmVsYXRlZCBvYmplY3QsIG5vdyB0aGF0CisgICAgICogaXRzIGlkIGhhcyBiZWVuIGFzc2lnbmVkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9SZWxhdGlvbkRhdGFTdG9yZVZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENvbHVtbiBjb2wpOworfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmV2ZXJzZUN1c3RvbWl6ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9SZXZlcnNlQ3VzdG9taXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ODAxNzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmV2ZXJzZUN1c3RvbWl6ZXIuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIFBsdWdpbiBpbiBpbnRlcmZhY2UgdG8gY3VzdG9taXplIHRoZSBvdXRwdXQgb2YgdGhlCisgKiB7QGxpbmsgUmV2ZXJzZU1hcHBpbmdUb29sfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJldmVyc2VDdXN0b21pemVyCisgICAgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogU2V0IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBnaXZlbiBieSB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKFByb3BlcnRpZXMgcHJvcHMpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXZlcnNlIG1hcHBpbmcgdG9vbCB1c2luZyB0aGlzIGN1c3RvbWl6ZXIuIFlvdSBjYW4gdXNlCisgICAgICogdGhlIHRvb2wgdG8gc2VlIGhvdyBpdCBpcyBjb25maWd1cmVkLCBvciB0byB1c2UgdXRpbGl0eSBtZXRob2RzIHRoZQorICAgICAqIHRvb2wgcHJvdmlkZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9vbChSZXZlcnNlTWFwcGluZ1Rvb2wgdG9vbCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGdpdmVuIHRhYmxlLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB0eXBlLgorICAgICAqIFNlZSB0aGUgVEFCTEVfWFhYIGNvbnN0YW50cyBpbiB7QGxpbmsgUmV2ZXJzZU1hcHBpbmdUb29sfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRhYmxlVHlwZShUYWJsZSB0YWJsZSwgaW50IGRlZmF1bHRUeXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gZ2VuZXJhdGUgZm9yIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgKiBSZXR1cm4gbnVsbCB0byBwcmV2ZW50IHRoZSB0YWJsZSBmcm9tIGJlaW5nIG1hcHBlZC4gUmV0dXJuIHRoZSBnaXZlbgorICAgICAqIGRlZmF1bHQgbmFtZSBpZiBpdCBpcyBhY2NlcHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFRhYmxlIHRhYmxlLCBTdHJpbmcgZGVmYXVsdE5hbWUpOworCisgICAgLyoqCisgICAgICogQ3VzdG9taXplIHRoZSBnaXZlbiBjbGFzcyBpbmZvcm1hdGlvbiBwcm9kdWNlZCBieSB0aGUgcmV2ZXJzZSBtYXBwaW5nCisgICAgICogdG9vbC4gVG8gY2hhbmdlIHRoZSBhcHBsaWNhdGlvbiBpZGVudGl0eSBjbGFzcywgdXNlCisgICAgICoge0BsaW5rIFJldmVyc2VNYXBwaW5nVG9vbCNnZW5lcmF0ZUNsYXNzfSB0byBjcmVhdCB0aGUgbmV3IGNsYXNzIG9iamVjdC4KKyAgICAgKiBUaGUgY2xhc3Mgd2lsbCBub3QgaGF2ZSBhbnkgZmllbGRzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjdXN0b21pemUoQ2xhc3NNYXBwaW5nIGNscyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2RlIHRlbXBsYXRlIGZvciB0aGUgZ2l2ZW4gY2xhc3MsIG9yIG51bGwgdG8gdXNlIHRoZSBzdGFuZGFyZAorICAgICAqIHN5c3RlbS1nZW5lcmF0ZWQgSmF2YSBjb2RlLiBUbyBmYWNpbGl0YXRlIHRlbXBsYXRlIHJldXNlLCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluIHlvdXIgdGVtcGxhdGU7IHRoZSBwcm9wZXIgdmFsdWVzCisgICAgICogd2lsbCBiZSBzdWJ0aXR1dGVkIGJ5IHRoZSBzeXN0ZW06CisgICAgICogPHVsPgorICAgICAqIDxsaT4ke3BhY2thZ2VEZWN9OiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiwgaW4gdGhlIGZvcm0KKyAgICAgKiAicGFja2FnZSAmbHQ7cGFja2FnZSBuYW1lICZndDs7Iiwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIHBhY2thZ2UuPC9saT4KKyAgICAgKiA8bGk+JHtpbXBvcnRzfTogSW1wb3J0cyBmb3IgdGhlIHBhY2thZ2VzIHVzZWQgYnkgdGhlIGRlY2xhcmVkCisgICAgICogZmllbGQgdHlwZXMuPC9saT4KKyAgICAgKiA8bGk+JHtjbGFzc05hbWV9OiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MsIHdpdGhvdXQgcGFja2FnZS48L2xpPgorICAgICAqIDxsaT4ke2V4dGVuZHNEZWN9OiBFeHRlbmRzIGRlY2xhcmF0aW9uLCBpbiB0aGUgZm9ybQorICAgICAqICJleHRlbmRzICZsdDtzdXBlcmNsYXNzJmd0OyIsIG9yIGVtcHR5IHN0cmluZyBpZiBubyBzdXBlcmNsYXNzLjwvbGk+CisgICAgICogPGxpPiR7Y29uc3RydWN0b3J9OiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgaW4gYWxsIHByaW1hcnkga2V5IGZpZWxkcworICAgICAqIG9mIHRoZSBjbGFzcywgb3IgZW1wdHkgc3RyaW5nIGlmIHRoZSBjbGFzcyB1c2VzIGRhdGFzdG9yZSBpZGVudGl0eS48L2xpPgorICAgICAqIDxsaT4ke2ZpZWxkRGVjc306IERlY2xhcmF0aW9ucyBvZiBhbGwgdGhlIGdlbmVyYXRlZCBmaWVsZHMuPC9saT4KKyAgICAgKiA8bGk+JHtmaWVsZENvZGV9OiBHZXQvc2V0IG1ldGhvZHMgZm9yIGFsbCB0aGUgZ2VuZXJhdGVkIGZpZWxkcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvZGUoQ2xhc3NNYXBwaW5nIG1hcHBpbmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWVsZCBuYW1lIHVzZWQgdG8gbWFwIHRoZSBnaXZlbiBjb2x1bW5zLCBvciBudWxsIHRvIHByZXZlbnQKKyAgICAgKiB0aGUgY29sdW1ucyBmcm9tIGJlaW5nIG1hcHBlZC4gUmV0dXJuIHRoZSBnaXZlbiBkZWZhdWx0IGlmIGl0IGlzCisgICAgICogYWNjZXB0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWMgdGhlIGNsYXNzIHRoYXQgd2lsbCBkZWNsYXJlIHRoaXMgZmllbGQKKyAgICAgKiBAcGFyYW0gY29scyB0aGUgY29sdW1uKHMpIHRoaXMgZmllbGQgd2lsbCByZXByZXNlbnQKKyAgICAgKiBAcGFyYW0gZmsgZm9yIHJlbGF0aW9uIGZpZWxkcywgdGhlIGZvcmVpZ24ga2V5IHRvIHRoZSByZWxhdGVkIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZShDbGFzc01hcHBpbmcgZGVjLCBDb2x1bW5bXSBjb2xzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBTdHJpbmcgZGVmYXVsdE5hbWUpOworCisgICAgLyoqCisgICAgICogQ3VzdG9taXplIHRoZSBnaXZlbiBmaWVsZCBpbmZvcm1hdGlvbiBwcm9kdWNlZCBieSB0aGUgcmV2ZXJzZSBtYXBwaW5nCisgICAgICogdG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjdXN0b21pemUoRmllbGRNYXBwaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBjb2RlIGZvciB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkLCBvciBudWxsIHRvIHVzZQorICAgICAqIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCBieSB0aGUgc3lzdGVtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlKEZpZWxkTWFwcGluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2RlIHRlbXBsYXRlIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGdpdmVuIGZpZWxkLCBvciBudWxsCisgICAgICogdG8gdXNlIHRoZSBzeXN0ZW0tZ2VuZXJhdGVkIGRlZmF1bHQgSmF2YSBjb2RlLgorICAgICAqIFRvIGZhY2lsaXRhdGUgdGVtcGxhdGUgcmV1c2UsIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluCisgICAgICogeW91ciB0ZW1wbGF0ZTsgdGhlIHByb3BlciB2YWx1ZXMgd2lsbCBiZSBzdWJ0aXR1dGVkIGJ5IHRoZSBzeXN0ZW06CisgICAgICogPHVsPgorICAgICAqIDxsaT4ke2ZpZWxkTmFtZX06IFRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L2xpPgorICAgICAqIDxsaT4ke2NhcEZpZWxkTmFtZX06IFRoZSBjYXBpdGFsaXplZCBmaWVsZCBuYW1lLjwvbGk+CisgICAgICogPGxpPiR7cHJvcGVydHlOYW1lfTogVGhlIGZpZWxkIG5hbWUgd2l0aG91dCBsZWFkaW5nICdfJywgaWYgYW55LjwvbGk+CisgICAgICogPGxpPiR7ZmllbGRUeXBlfTogVGhlIGZpZWxkJ3MgdHlwZSBuYW1lLjwvbGk+CisgICAgICogPGxpPiR7ZmllbGRWYWx1ZX06IFRoZSBmaWVsZCdzIGluaXRpYWwgdmFsdWUsIGluIHRoZSBmb3JtCisgICAgICogIiA9ICZsdDt2YWx1ZSZndDsiLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbihGaWVsZE1hcHBpbmcgZmllbGQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29kZSB0ZW1wbGF0ZSBmb3IgdGhlIGdldC9zZXQgbWV0aG9kcyBvZiB0aGUgZ2l2ZW4gZmllbGQsIG9yCisgICAgICogbnVsbCB0byB1c2UgdGhlIHN5c3RlbS1nZW5lcmF0ZWQgZGVmYXVsdCBKYXZhIGNvZGUuCisgICAgICogVG8gZmFjaWxpdGF0ZSB0ZW1wbGF0ZSByZXVzZSwgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBhcHBlYXIgaW4KKyAgICAgKiB5b3VyIHRlbXBsYXRlOyB0aGUgcHJvcGVyIHZhbHVlcyB3aWxsIGJlIHN1YnRpdHV0ZWQgYnkgdGhlIHN5c3RlbToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiR7ZmllbGROYW1lfTogVGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwvbGk+CisgICAgICogPGxpPiR7Y2FwRmllbGROYW1lfTogVGhlIGNhcGl0YWxpemVkIGZpZWxkIG5hbWUuPC9saT4KKyAgICAgKiA8bGk+JHtwcm9wZXJ0eU5hbWV9OiBUaGUgZmllbGQgbmFtZSB3aXRob3V0IGxlYWRpbmcgJ18nLCBpZiBhbnkuPC9saT4KKyAgICAgKiA8bGk+JHtmaWVsZFR5cGV9OiBUaGUgZmllbGQncyB0eXBlIG5hbWUuPC9saT4KKyAgICAgKiA8bGk+JHtmaWVsZFZhbHVlfTogVGhlIGZpZWxkJ3MgaW5pdGlhbCB2YWx1ZSwgaW4gdGhlIGZvcm0KKyAgICAgKiAiPSAmbHQ7dmFsdWUmZ3Q7Iiwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmUuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRDb2RlKEZpZWxkTWFwcGluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhIHRhYmxlIGhhcyBnb25lIHVubWFwcGVkLiBZb3UgY2FuIG1hcCB0aGUgdGFibGUKKyAgICAgKiB5b3Vyc2VsZiB1c2luZyB0aGlzIG1ldGhvZC4gV2hlbiBtYXBwaW5nLCB1c2UKKyAgICAgKiB7QGxpbmsgUmV2ZXJzZU1hcHBpbmdUb29sI2dlbmVyYXRlQ2xhc3N9IHRvIGNyZWF0ZSB0aGUgY2xhc3MsCisgICAgICoge0BsaW5rIFJldmVyc2VNYXBwaW5nVG9vbCNuZXdDbGFzc01hcHBpbmd9IHRvIGNyZWF0ZSB0aGUgY2xhc3MgbWV0YWRhdGEsCisgICAgICogYW5kIHRoZW4ge0BsaW5rIENsYXNzTWFwcGluZyNhZGREZWNsYXJlZEZpZWxkTWFwcGluZ30gdG8gYWRkIGZpZWxkCisgICAgICogbWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgeW91IG1hcCB0aGUgdGFibGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHVubWFwcGVkVGFibGUoVGFibGUgdGFibGUpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIHRoZSBjdXN0b21pemVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9SZXZlcnNlTWFwcGluZ1Rvb2wuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9SZXZlcnNlTWFwcGluZ1Rvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE3NjExCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1JldmVyc2VNYXBwaW5nVG9vbC5qYXZhCkBAIC0wLDAgKzEsMjA1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkFwcGxpY2F0aW9uSWRUb29sOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5GdWxsQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5IYW5kbGVyRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5NYXhFbWJlZGRlZEJsb2JGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk1heEVtYmVkZGVkQ2xvYkZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5QcmltaXRpdmVGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlJlbGF0aW9uQ29sbGVjdGlvbkludmVyc2VLZXlGaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlJlbGF0aW9uQ29sbGVjdGlvblRhYmxlRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5SZWxhdGlvbkZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuU3RhdGVDb21wYXJpc29uVmVyc2lvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlN0cmluZ0ZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuU3ViY2xhc3NKb2luRGlzY3JpbWluYXRvclN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlN1cGVyY2xhc3NEaXNjcmltaW5hdG9yU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuU3VwZXJjbGFzc1ZlcnNpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5WZXJ0aWNhbENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlByaW1hcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5YTUxTY2hlbWFQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ29kZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YU1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk5vbmVNZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuUXVlcnlNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNDbGFzczsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3NMb2FkZXI7CitpbXBvcnQgc2VycC5ieXRlY29kZS5Qcm9qZWN0OworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIFJldmVyc2UtbWFwcyBhIHNjaGVtYSBpbnRvIGNsYXNzIG1hcHBpbmdzIGFuZCB0aGUgYXNzaWNpYXRlZCBqYXZhCisgKiBjb2RlLiBHZW5lcmF0ZXMgYSBKYXZhIGNvZGUgZmlsZXMgZm9yIHBlcnNpc3RlbnQgY2xhc3NlcyBhbmQgYXNzb2NpYXRlZAorICogaWRlbnRpdHkgY2xhc3NlcyBhbmQgbWV0YWRhdGEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFJldmVyc2VNYXBwaW5nVG9vbAorICAgIGltcGxlbWVudHMgTWV0YURhdGFNb2RlcywgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIFVubWFwcGVkIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogUHJpbWFyeSB0YWJsZSBmb3IgYSBuZXcgYmFzZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9CQVNFID0gMTsKKworICAgIC8qKgorICAgICAqIFNlY29uZGFyeSB0YWJsZSBvZiBhbiBleGlzdGluZyBjbGFzcy4gVGhlcmUgaXMgZXhhY3RseSBvbmUgcm93IGluCisgICAgICogdGhpcyB0YWJsZSBmb3IgZWFjaCByb3cgaW4gdGhlIHByaW1hcnkgdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfU0VDT05EQVJZID0gMjsKKworICAgIC8qKgorICAgICAqIFNlY29uZGFyeSB0YWJsZSBvZiBhbiBleGlzdGluZyBjbGFzcy4gVGhlcmUgaXMgemVybyBvciBvbmUgcm93IGluCisgICAgICogdGhpcyB0YWJsZSBmb3IgZWFjaCByb3cgaW4gdGhlIHByaW1hcnkgdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfU0VDT05EQVJZX09VVEVSID0gMzsKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0aW9uIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0FTU09DSUFUSU9OID0gNDsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX1NVQkNMQVNTID0gNTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX1BBQ0tBR0UgPSAicGFja2FnZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfQ0xBU1MgPSAiY2xhc3MiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmV2ZXJzZU1hcHBpbmdUb29sLmNsYXNzKTsKKworICAgIC8vIG1hcCBqYXZhIGtleXdvcmRzIHRvIHJlbGF0ZWQgd29yZHMgdG8gdXNlIGluIHRoZWlyIHBsYWNlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9qYXZhS2V5d29yZHMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBSZXZlcnNlTWFwcGluZ1Rvb2wuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbQorICAgICAgICAgICAgKCJqYXZhLWtleXdvcmRzLnJzcmMiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGtleXdvcmRzID0gU3RyaW5ncy5zcGxpdChuZXcgQnVmZmVyZWRSZWFkZXIKKyAgICAgICAgICAgICAgICAobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSkucmVhZExpbmUoKSwgIiwiLCAwKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXl3b3Jkcy5sZW5ndGg7IGkgKz0gMikKKyAgICAgICAgICAgICAgICBfamF2YUtleXdvcmRzLnB1dChrZXl3b3Jkc1tpXSwga2V5d29yZHNbaSArIDFdKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSkRCQ0NvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgX2xvZzsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfdGFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIFByb2plY3QgX3Byb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgQkNDbGFzc0xvYWRlciBfbG9hZGVyID0gbmV3IEJDQ2xhc3NMb2FkZXIoX3Byb2plY3QpOworICAgIHByaXZhdGUgU3RyYXRlZ3lJbnN0YWxsZXIgX3N0cmF0ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfcGFja2FnZSA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIF9kaXIgPSBudWxsOworICAgIHByaXZhdGUgTWFwcGluZ1JlcG9zaXRvcnkgX3JlcG9zID0gbnVsbDsKKyAgICBwcml2YXRlIFNjaGVtYUdyb3VwIF9zY2hlbWEgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfbnVsbEFzT2JqID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ibG9iQXNPYmogPSBmYWxzZTsKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgX3R5cGVNYXAgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfdXNlRksgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3VzZVNjaGVtYSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfcGtPbkpvaW4gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2RhdGFzdG9yZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfYnVpbHRpbiA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pbm5lciA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIF9pZFN1ZmZpeCA9ICJJZCI7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pbnZlcnNlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2RldGFjaGFibGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIENvZGVGb3JtYXQgX2Zvcm1hdCA9IG51bGw7CisgICAgcHJpdmF0ZSBSZXZlcnNlQ3VzdG9taXplciBfY3VzdG9tID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfZGlzY1N0cmF0ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfdmVyc1N0cmF0ID0gbnVsbDsKKworICAgIC8vIHdlIGhhdmUgdG8gdHJhY2sgZmllbGQgbmFtZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnV0IHRoZW4gYWJhbmRvbmVkIGJ5CisgICAgLy8gdGhlIGN1c3RvbWl6ZXIgc28gdGhhdCB3ZSBkb24ndCBhdHRlbXB0IHRvIHVzZSB0aGVtIGFnYWluOyBkb2luZyBzbyBjYW4KKyAgICAvLyBtZXNzIHVwIGNlcnRhaW4gY3VzdG9taXplcnMgKGJ1ZyA4ODEpCisgICAgcHJpdmF0ZSBTZXQgX2FiYW5kb25lZEZpZWxkTmFtZXMgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXZlcnNlTWFwcGluZ1Rvb2woSkRCQ0NvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfTUVUQURBVEEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW50ZXJuYWwgc3RyYXRlZ3kgaW5zdGFsbGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyYXRlZ3lJbnN0YWxsZXIgZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKSB7CisgICAgICAgIGlmIChfc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zdHJhdCA9IG5ldyBSZXZlcnNlU3RyYXRlZ3lJbnN0YWxsZXIoZ2V0UmVwb3NpdG9yeSgpKTsKKyAgICAgICAgcmV0dXJuIF9zdHJhdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgb24gY29uc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBKREJDQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2NvbmY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2cgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIExvZyBnZXRMb2coKSB7CisgICAgICAgIHJldHVybiBfbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBwYWNrYWdlIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMsIG9yIG51bGwgaWYgdW5zZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYWNrYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBwYWNrYWdlIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXM7IHVzZSBudWxsIHRvCisgICAgICogaW5kaWNhdGUgbm8gcGFja2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgX3BhY2thZ2UgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBvdXRwdXQgdGhlIGdlbmVyYXRlZCBjb2RlIHRvLCBvciBudWxsIGZvcgorICAgICAqIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBtYXRjaGVzIHRoZSBwYWNrYWdlLCBpdCB3aWxsCisgICAgICogYmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgcGFja2FnZSBzdHJ1Y3R1cmUgd2lsbCBiZSBjcmVhdGVkIHVuZGVyCisgICAgICogdGhpcyBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gX2RpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBvdXRwdXQgdGhlIGdlbmVyYXRlZCBjb2RlIHRvLCBvciBudWxsIGZvcgorICAgICAqIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBtYXRjaGVzIHRoZSBwYWNrYWdlLCBpdCB3aWxsCisgICAgICogYmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgcGFja2FnZSBzdHJ1Y3R1cmUgd2lsbCBiZSBjcmVhdGVkIHVuZGVyCisgICAgICogdGhpcyBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KEZpbGUgZGlyKSB7CisgICAgICAgIF9kaXIgPSBkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNjaGVtYSBuYW1lIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAorICAgICAqIGNsYXNzIG5hbWUgZm9yIGVhY2ggdGFibGUuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVNjaGVtYU5hbWUoKSB7CisgICAgICAgIHJldHVybiBfdXNlU2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBzY2hlbWEgbmFtZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQKKyAgICAgKiBjbGFzcyBuYW1lIGZvciBlYWNoIHRhYmxlLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VTY2hlbWFOYW1lKGJvb2xlYW4gdXNlU2NoZW1hKSB7CisgICAgICAgIF91c2VTY2hlbWEgPSB1c2VTY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGZvcmVpZ24ga2V5IG5hbWUgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlCisgICAgICogcmVsYXRpb24gbmFtZXMuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUZvcmVpZ25LZXlOYW1lKCkgeworICAgICAgICByZXR1cm4gX3VzZUZLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSBuYW1lIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZQorICAgICAqIHJlbGF0aW9uIG5hbWVzLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VGb3JlaWduS2V5TmFtZShib29sZWFuIHVzZUZLKSB7CisgICAgICAgIF91c2VGSyA9IHVzZUZLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIGV2ZW4gbnVsbGFibGUgY29sdW1ucyB3aWxsIGJlIG1hcHBlZCB0byB3cmFwcGVycworICAgICAqIHJhdGhlciB0aGFuIHByaW1pdGl2ZXMuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE51bGxhYmxlQXNPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBfbnVsbEFzT2JqOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIGV2ZW4gbnVsbGFibGUgY29sdW1ucyB3aWxsIGJlIG1hcHBlZCB0byB3cmFwcGVycworICAgICAqIHJhdGhlciB0aGFuIHByaW1pdGl2ZXMuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bGxhYmxlQXNPYmplY3QoYm9vbGVhbiBudWxsQXNPYmopIHsKKyAgICAgICAgX251bGxBc09iaiA9IG51bGxBc09iajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJldmVyc2UtbWFwIGJsb2IgY29sdW1ucyBhcyBjb250YWluaW5nIHNlcmlhbGl6ZWQgSmF2YQorICAgICAqIG9iamVjdHMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9mIHVzaW5nIGEgYnl0ZVtdIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJsb2JBc09iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9ibG9iQXNPYmo7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZXZlcnNlLW1hcCBibG9iIGNvbHVtbnMgYXMgY29udGFpbmluZyBzZXJpYWxpemVkIEphdmEKKyAgICAgKiBvYmplY3RzLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBvZiB1c2luZyBhIGJ5dGVbXSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbG9iQXNPYmplY3QoYm9vbGVhbiBibG9iQXNPYmopIHsKKyAgICAgICAgX2Jsb2JBc09iaiA9IGJsb2JBc09iajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAgb2YgSkRCQy1uYW1lIHRvIEphdmEtdHlwZS1uYW1lIGVudHJpZXMgdGhhdCBhbGxvd3MgY3VzdG9taXphdGlvbgorICAgICAqIG9mIHJldmVyc2UgbWFwcGluZyBjb2x1bW5zIHRvIGZpZWxkIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFR5cGVNYXAoKSB7CisgICAgICAgIHJldHVybiBfdHlwZU1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAgb2YgSkRCQy1uYW1lIHRvIEphdmEtdHlwZS1uYW1lIGVudHJpZXMgdGhhdCBhbGxvd3MgY3VzdG9taXphdGlvbgorICAgICAqIG9mIHJldmVyc2UgbWFwcGluZyBjb2x1bW5zIHRvIGZpZWxkIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVNYXAoUHJvcGVydGllcyB0eXBlTWFwKSB7CisgICAgICAgIF90eXBlTWFwID0gdHlwZU1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBqb2luIHRhYmxlcyBhcmUgYWxsb3dlZCB0byBoYXZlIHByaW1hcnkga2V5cywgZmFsc2UKKyAgICAgKiBpZiBhbGwgcHJpbWFyeSBrZXkgdGFibGVzIHdpbGwgYmUgbWFwcGVkIGFzIHBlcnNpc3RlbnQgY2xhc3Nlcy4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcmltYXJ5S2V5T25Kb2luKCkgeworICAgICAgICByZXR1cm4gX3BrT25Kb2luOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0byB0cnVlIGlmIGpvaW4gdGFibGVzIGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJpbWFyeSBrZXlzLCBmYWxzZQorICAgICAqIGlmIGFsbCBwcmltYXJ5IGtleSB0YWJsZXMgd2lsbCBiZSBtYXBwZWQgYXMgcGVyc2lzdGVudCBjbGFzc2VzLgorICAgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXlPbkpvaW4oYm9vbGVhbiBwa09uSm9pbikgeworICAgICAgICBfcGtPbkpvaW4gPSBwa09uSm9pbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBkYXRhc3RvcmUgaWRlbnRpdHkgd2hlbiBwb3NzaWJsZS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlRGF0YVN0b3JlSWRlbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBfZGF0YXN0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGRhdGFzdG9yZSBpZGVudGl0eSB3aGVuIHBvc3NpYmxlLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VEYXRhU3RvcmVJZGVudGl0eShib29sZWFuIGRhdGFzdG9yZSkgeworICAgICAgICBfZGF0YXN0b3JlID0gZGF0YXN0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGJ1aWx0IGluIGlkZW50aXR5IGNsYXNzZXMgd2hlbiBwb3NzaWJsZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VCdWlsdGluSWRlbnRpdHlDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIF9idWlsdGluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGJ1aWx0IGluIGlkZW50aXR5IGNsYXNzZXMgd2hlbiBwb3NzaWJsZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VCdWlsdGluSWRlbnRpdHlDbGFzcyhib29sZWFuIGJ1aWx0aW4pIHsKKyAgICAgICAgX2J1aWx0aW4gPSBidWlsdGluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIGdlbmVyYXRlIGlubmVyIGNsYXNzZXMgd2hlbiBjcmVhdGluZyBhcHBsaWNhdGlvbgorICAgICAqIGlkZW50aXR5IGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5uZXJJZGVudGl0eUNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBfaW5uZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdG8gZ2VuZXJhdGUgaW5uZXIgY2xhc3NlcyB3aGVuIGNyZWF0aW5nIGFwcGxpY2F0aW9uCisgICAgICogaWRlbnRpdHkgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbm5lcklkZW50aXR5Q2xhc3Nlcyhib29sZWFuIGlubmVyKSB7CisgICAgICAgIF9pbm5lciA9IGlubmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1ZmZpeCB1c2VkIHRvIGNyZWF0ZSBhcHBsaWNhdGlvbiBpZGVudGl0eSBjbGFzcyBuYW1lIGZyb20gYSBjbGFzcyBuYW1lLAorICAgICAqIG9yIGluIHRoZSBjYXNlIG9mIGlubmVyIGlkZW50aXR5IGNsYXNzZXMsIHRoZSBpbm5lciBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlDbGFzc1N1ZmZpeCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZFN1ZmZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWZmaXggdXNlZCB0byBjcmVhdGUgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MgbmFtZSBmcm9tIGEgY2xhc3MgbmFtZSwKKyAgICAgKiBvciBpbiB0aGUgY2FzZSBvZiBpbm5lciBpZGVudGl0eSBjbGFzc2VzLCB0aGUgaW5uZXIgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGl0eUNsYXNzU3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKyAgICAgICAgX2lkU3VmZml4ID0gc3VmZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgaW52ZXJzZSAxLW1hbnkvMS0xIHJlbGF0aW9ucyBmb3IgYWxsIG1hbnktMS8xLTEKKyAgICAgKiByZWxhdGlvbnMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJzZVJlbGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIF9pbnZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgaW52ZXJzZSAxLW1hbnkvMS0xIHJlbGF0aW9ucyBmb3IgYWxsIG1hbnktMS8xLTEKKyAgICAgKiByZWxhdGlvbnMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW52ZXJzZVJlbGF0aW9ucyhib29sZWFuIGludmVyc2UpIHsKKyAgICAgICAgX2ludmVyc2UgPSBpbnZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gbWFrZSBnZW5lcmF0ZWQgY2xhc3NlcyBkZXRhY2hhYmxlLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZXRhY2hhYmxlKCkgeworICAgICAgICByZXR1cm4gX2RldGFjaGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBtYWtlIGdlbmVyYXRlZCBjbGFzc2VzIGRldGFjaGFibGUuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaGFibGUoYm9vbGVhbiBkZXRhY2hhYmxlKSB7CisgICAgICAgIF9kZXRhY2hhYmxlID0gZGV0YWNoYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kgZm9yIGJhc2UgY2xhc3MgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNjcmltaW5hdG9yU3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBfZGlzY1N0cmF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZGlzY3JpbWluYXRvciBzdHJhdGVneSBmb3IgYmFzZSBjbGFzcyBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yU3RyYXRlZ3koU3RyaW5nIGRpc2NTdHJhdCkgeworICAgICAgICBfZGlzY1N0cmF0ID0gZGlzY1N0cmF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmVyc2lvbiBzdHJhdGVneSBmb3IgYmFzZSBjbGFzcyBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25TdHJhdGVneSgpIHsKKyAgICAgICAgcmV0dXJuIF92ZXJzU3RyYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2ZXJzaW9uIHN0cmF0ZWd5IGZvciBiYXNlIGNsYXNzIG1hcHBpbmdzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb25TdHJhdGVneShTdHJpbmcgdmVyc2lvblN0cmF0KSB7CisgICAgICAgIF92ZXJzU3RyYXQgPSB2ZXJzaW9uU3RyYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNvZGUgZm9ybWF0dGVyIGZvciB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBnZXRDb2RlRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gX2Zvcm1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvZGUgZm9ybWF0dGVyIGZvciB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2RlRm9ybWF0KENvZGVGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIF9mb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXN0b21pemVyIGluIHVzZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBSZXZlcnNlQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgeworICAgICAgICByZXR1cm4gX2N1c3RvbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1c3RvbWl6ZXIuIFRoZSBjb25maWd1cmF0aW9uIG9uIHRoZSBjdXN0b21pemVyLCBpZiBhbnksCisgICAgICogc2hvdWxkIGFscmVhZHkgYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoUmV2ZXJzZUN1c3RvbWl6ZXIgY3VzdG9taXplcikgeworICAgICAgICBpZiAoY3VzdG9taXplciAhPSBudWxsKQorICAgICAgICAgICAgY3VzdG9taXplci5zZXRUb29sKHRoaXMpOworICAgICAgICBfY3VzdG9tID0gY3VzdG9taXplcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hcHBpbmcgcmVwb3NpdG9yeSB1c2VkIHRvIGhvbGQgZ2VuZXJhdGVkIG1hcHBpbmdzLiBZb3UKKyAgICAgKiBjYW4gYWxzbyB1c2UgdGhlIHJlcG9zaXRvcnkgdG8gc2VlZCB0aGUgc2NoZW1hIGdyb3VwIHRvIGdlbmVyYXRlCisgICAgICogY2xhc3NlcyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgeworICAgICAgICBpZiAoX3JlcG9zID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBlbXB0eSByZXBvc2l0b3J5CisgICAgICAgICAgICBfcmVwb3MgPSBfY29uZi5uZXdNYXBwaW5nUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBfcmVwb3Muc2V0TWV0YURhdGFGYWN0b3J5KE5vbmVNZXRhRGF0YUZhY3RvcnkuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBfcmVwb3Muc2V0TWFwcGluZ0RlZmF1bHRzKE5vbmVNYXBwaW5nRGVmYXVsdHMuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBfcmVwb3Muc2V0UmVzb2x2ZShNT0RFX05PTkUpOworICAgICAgICAgICAgX3JlcG9zLnNldFZhbGlkYXRlKF9yZXBvcy5WQUxJREFURV9OT05FKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3JlcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVwb3NpdG9yeSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShNYXBwaW5nUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBfcmVwb3MgPSByZXBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtYSBncm91cCB0byByZXZlcnNlIG1hcC4gSWYgbm9uZSBoYXMgYmVlbiBzZXQsIHRoZQorICAgICAqIHNjaGVtYSB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgZ2V0U2NoZW1hR3JvdXAoKSB7CisgICAgICAgIGlmIChfc2NoZW1hID09IG51bGwpIHsKKyAgICAgICAgICAgIFNjaGVtYUdlbmVyYXRvciBnZW4gPSBuZXcgU2NoZW1hR2VuZXJhdG9yKF9jb25mKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2VuLmdlbmVyYXRlU2NoZW1hcygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwKKyAgICAgICAgICAgICAgICAgICAgX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc2NoZW1hID0gZ2VuLmdldFNjaGVtYUdyb3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9zY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY2hlbWEgdG8gcmV2ZXJzZSBtYXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR3JvdXAoU2NoZW1hR3JvdXAgc2NoZW1hKSB7CisgICAgICAgIF9zY2hlbWEgPSBzY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnZW5lcmF0ZWQgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldE1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeSgpLmdldE1hcHBpbmdzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgbWFwcGluZ3MgYW5kIGNsYXNzIGNvZGUgZm9yIHRoZSBjdXJyZW50IHNjaGVtYSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8vIG1hcCBiYXNlIGNsYXNzZXMgZmlyc3QKKyAgICAgICAgU2NoZW1hW10gc2NoZW1hcyA9IGdldFNjaGVtYUdyb3VwKCkuZ2V0U2NoZW1hcygpOworICAgICAgICBUYWJsZVtdIHRhYmxlczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJsZXMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJsZXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgaWYgKGlzQmFzZVRhYmxlKHRhYmxlc1tqXSkpCisgICAgICAgICAgICAgICAgICAgIG1hcEJhc2VDbGFzcyh0YWJsZXNbal0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFwIHZlcnRpY2FsIHN1YmNsYXNzZXMKKyAgICAgICAgU2V0IHN1YnMgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYmxlcyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYmxlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmICghX3RhYmxlcy5jb250YWluc0tleSh0YWJsZXNbal0pCisgICAgICAgICAgICAgICAgICAgICYmIGdldFNlY29uZGFyeVR5cGUodGFibGVzW2pdLCBmYWxzZSkgPT0gVEFCTEVfU1VCQ0xBU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgICAgICBzdWJzLmFkZCh0YWJsZXNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3VicyAhPSBudWxsKQorICAgICAgICAgICAgbWFwU3ViY2xhc3NlcyhzdWJzKTsKKworICAgICAgICAvLyBtYXAgZmllbGRzIGluIHRoZSBwcmltYXJ5IHRhYmxlcyBvZiB0aGUgY2xhc3NlcworICAgICAgICBDbGFzc01hcHBpbmcgY2xzOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF90YWJsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGNscyA9IChDbGFzc01hcHBpbmcpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBtYXBDb2x1bW5zKGNscywgY2xzLmdldFRhYmxlKCksIG51bGwsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1hcCBhc3NvY2lhdGlvbiB0YWJsZXMsIGpvaW4gdGFibGVzLCBhbmQgc2Vjb25kYXJ5IHRhYmxlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYmxlcyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYmxlcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoIV90YWJsZXMuY29udGFpbnNLZXkodGFibGVzW2pdKSkKKyAgICAgICAgICAgICAgICAgICAgbWFwVGFibGUodGFibGVzW2pdLCBnZXRTZWNvbmRhcnlUeXBlKHRhYmxlc1tqXSwgZmFsc2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1hcCBkaXNjcmltaW5hdG9ycyBhbmQgdmVyc2lvbnMsIG1ha2Ugc3VyZSBpZGVudGl0eSB0eXBlIGlzIGNvcnJlY3QsCisgICAgICAgIC8vIHNldCBzaW1wbGUgZmllbGQgY29sdW1uIGphdmEgdHlwZXMsIGFuZCByZWYgc2NoZW1hIGNvbXBvbmVudHMgc28KKyAgICAgICAgLy8gd2UgY2FuIHRlbGwgd2hhdCBpcyB1bm1hcHBlZAorICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHM7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX3RhYmxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY2xzID0gKENsYXNzTWFwcGluZykgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGNscy5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgICAgICAgICBpZiAoY2xzLmdldERpc2NyaW1pbmF0b3IoKS5nZXRTdHJhdGVneSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pbnN0YWxsU3RyYXRlZ3kKKyAgICAgICAgICAgICAgICAgICAgKGNscy5nZXREaXNjcmltaW5hdG9yKCkpOworICAgICAgICAgICAgY2xzLmdldERpc2NyaW1pbmF0b3IoKS5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgICAgICAgICBpZiAoY2xzLmdldFZlcnNpb24oKS5nZXRTdHJhdGVneSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pbnN0YWxsU3RyYXRlZ3koY2xzLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICBjbHMuZ2V0VmVyc2lvbigpLnJlZlNjaGVtYUNvbXBvbmVudHMoKTsKKworICAgICAgICAgICAgLy8gZG91YmxlLWNoZWNrIGlkZW50aXR5IHR5cGU7IGlmIGl0IHdhcyBzZXQgZm9yIGJ1aWx0aW4gaWRlbnRpdHkKKyAgICAgICAgICAgIC8vIGl0IG1pZ2h0IGhhdmUgdG8gc3dpdGNoIHRvIHN0ZCBhcHBsaWNhdGlvbiBpZGVudGl0eSBpZiBwayBmaWVsZAorICAgICAgICAgICAgLy8gbm90IGNvbXBhdGlibGUKKyAgICAgICAgICAgIGlmIChjbHMuZ2V0UENTdXBlcmNsYXNzKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNscy5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01hcHBpbmcuSURfQVBQTElDQVRJT04pIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xzLmdldFByaW1hcnlLZXlGaWVsZHMoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1way1maWVsZHMiLCBjbHMpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xzLmdldE9iamVjdElkVHlwZSgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNscy5pc09wZW5KUEFJZGVudGl0eSgpICYmICFpc0J1aWx0aW5JZGVudGl0eShjbHMpKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0T2JqZWN0SWRUeXBlKGNscyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNscy5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01hcHBpbmcuSURfREFUQVNUT1JFKQorICAgICAgICAgICAgICAgIGNscy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpWzBdLnNldEphdmFUeXBlKEphdmFUeXBlcy5MT05HKTsKKworICAgICAgICAgICAgLy8gc2V0IGphdmEgdHlwZXMgZm9yIHNpbXBsZSBmaWVsZHM7CisgICAgICAgICAgICBmaWVsZHMgPSBjbHMuZ2V0RGVjbGFyZWRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgICAgICAgICAgICAgc2V0Q29sdW1uSmF2YVR5cGUoZmllbGRzW2ldKTsKKyAgICAgICAgICAgICAgICBzZXRDb2x1bW5KYXZhVHlwZShmaWVsZHNbaV0uZ2V0RWxlbWVudE1hcHBpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdGhlIGphdmEgdHlwZXMgb2YgZm9yZWlnbiBrZXkgY29sdW1uczsgd2UgY291bGRuJ3QgZG8gdGhpcworICAgICAgICAvLyBlYXJsaWVyIGJlY2F1c2Ugd2UgcmVseSBvbiB0aGUgbGlua2VkLXRvIGNvbHVtbnMgdG8gZG8gaXQKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfdGFibGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjbHMgPSAoQ2xhc3NNYXBwaW5nKSBpdHIubmV4dCgpOworICAgICAgICAgICAgc2V0Rm9yZWlnbktleUphdmFUeXBlKGNscy5nZXRKb2luRm9yZWlnbktleSgpKTsKKworICAgICAgICAgICAgZmllbGRzID0gY2xzLmdldERlY2xhcmVkRmllbGRNYXBwaW5ncygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzZXRGb3JlaWduS2V5SmF2YVR5cGUoZmllbGRzW2ldLmdldEpvaW5Gb3JlaWduS2V5KCkpOworICAgICAgICAgICAgICAgIHNldEZvcmVpZ25LZXlKYXZhVHlwZShmaWVsZHNbaV0uZ2V0Rm9yZWlnbktleSgpKTsKKyAgICAgICAgICAgICAgICBzZXRGb3JlaWduS2V5SmF2YVR5cGUoZmllbGRzW2ldLmdldEVsZW1lbnRNYXBwaW5nKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEZvcmVpZ25LZXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGxvdyBjdXN0b21pemVyIHRvIG1hcCB1bm1hcHBlZCB0YWJsZXMsIGFuZCB3YXJuIGFib3V0IGFueXRoaW5nCisgICAgICAgIC8vIHRoYXQgZW5kcyB1cCB1bm1hcHBlZAorICAgICAgICBDb2x1bW5bXSBjb2xzOworICAgICAgICBDb2xsZWN0aW9uIHVubWFwcGVkQ29scyA9IG5ldyBBcnJheUxpc3QoNSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFibGVzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFibGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdW5tYXBwZWRDb2xzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgY29scyA9IHRhYmxlc1tqXS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb2xzLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICBpZiAoY29sc1trXS5nZXRSZWZDb3VudCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB1bm1hcHBlZENvbHMuYWRkKGNvbHNba10pOworCisgICAgICAgICAgICAgICAgaWYgKHVubWFwcGVkQ29scy5zaXplKCkgPT0gY29scy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXN0b20gPT0gbnVsbCB8fCAhX2N1c3RvbS51bm1hcHBlZFRhYmxlKHRhYmxlc1tqXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoInVubWFwLXRhYmxlIiwgdGFibGVzW2pdKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1bm1hcHBlZENvbHMuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgX2xvZy5pbmZvKF9sb2MuZ2V0KCJ1bm1hcC1jb2xzIiwgdGFibGVzW2pdLCB1bm1hcHBlZENvbHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX2N1c3RvbSAhPSBudWxsKQorICAgICAgICAgICAgX2N1c3RvbS5jbG9zZSgpOworCisgICAgICAgIC8vIHJlc29sdmUgbWFwcGluZ3MKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfdGFibGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgKChDbGFzc01hcHBpbmcpIGl0ci5uZXh0KCkpLnJlc29sdmUoTU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAgdGhlIHRhYmxlIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtYXBUYWJsZShUYWJsZSB0YWJsZSwgaW50IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRBQkxFX1NFQ09OREFSWToKKyAgICAgICAgICAgIGNhc2UgVEFCTEVfU0VDT05EQVJZX09VVEVSOgorICAgICAgICAgICAgICAgIG1hcFNlY29uZGFyeVRhYmxlKHRhYmxlLCB0eXBlICE9IFRBQkxFX1NFQ09OREFSWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRBQkxFX0FTU09DSUFUSU9OOgorICAgICAgICAgICAgICAgIG1hcEFzc29jaWF0aW9uVGFibGUodGFibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIGNvbXBhdGlibGUgd2l0aCBidWlsdGluIGlkZW50aXR5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCdWlsdGluSWRlbnRpdHkoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBjbHMuZ2V0UHJpbWFyeUtleUZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChmaWVsZHNbMF0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PSUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSB0eXBlIG9mIHRoZSBjb2x1bW4gZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldENvbHVtbkphdmFUeXBlKFZhbHVlTWFwcGluZyB2bSkgeworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdm0uZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGNvbHNbMF0uc2V0SmF2YVR5cGUodm0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEphdmEgdHlwZSBvZiB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEZvcmVpZ25LZXlKYXZhVHlwZShGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIGlmIChmayA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gZmsuZ2V0Q29sdW1ucygpOworICAgICAgICBDb2x1bW5bXSBwa3MgPSBmay5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoY29sc1tpXS5nZXRKYXZhVHlwZSgpID09IEphdmFUeXBlcy5PQkpFQ1QpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRKYXZhVHlwZShwa3NbaV0uZ2V0SmF2YVR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlcyB7QGxpbmsgQ29kZUdlbmVyYXRvcn1zIHRvIHdyaXRlIHRoZSBKYXZhIGNvZGUgZm9yIHRoZSBnZW5lcmF0ZWQKKyAgICAgKiBtYXBwaW5ncyB0byB0aGUgcHJvcGVyIHBhY2thZ2VzLgorICAgICAqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2Yge0BsaW5rIEZpbGV9IGluc3RhbmNlcyB0aGF0IHdlcmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IHJlY29yZENvZGUoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVjb3JkQ29kZShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29kZSBmb3IgdGhlIHRvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IGlmIG51bGwsIHRoZW4gcGVyZm9ybSB0aGUgd3JpdGUgZGlyZWN0bHkKKyAgICAgKiB0byB0aGUgZmlsZXN5c3RlbTsgb3RoZXJ3aXNlLCBwb3B1bGF0ZSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbWFwIHdpdGgga2V5cyBhcyB0aGUgZ2VuZXJhdGVkCisgICAgICoge0BsaW5rIENsYXNzTWFwcGluZ30gYW5kIHZhbHVlcyBhcyBhCisgICAgICoge0BsaW5rIFN0cmluZ30gdGhhdCBjb250YWlucyB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB7QGxpbmsgRmlsZX0gaW5zdGFuY2VzIHRoYXQgd2VyZSB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIExpc3QgcmVjb3JkQ29kZShNYXAgb3V0cHV0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0IHdyaXR0ZW4gPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgICAgIENsYXNzTWFwcGluZ1tdIG1hcHBpbmdzID0gZ2V0TWFwcGluZ3MoKTsKKyAgICAgICAgUmV2ZXJzZUNvZGVHZW5lcmF0b3IgZ2VuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy5pbmZvKF9sb2MuZ2V0KCJjbGFzcy1jb2RlIiwgbWFwcGluZ3NbaV0pKTsKKworICAgICAgICAgICAgQXBwbGljYXRpb25JZFRvb2wgYWlkID0gbmV3QXBwbGljYXRpb25JZFRvb2wobWFwcGluZ3NbaV0pOworICAgICAgICAgICAgZ2VuID0gbmV3IFJldmVyc2VDb2RlR2VuZXJhdG9yKG1hcHBpbmdzW2ldLCBhaWQpOworICAgICAgICAgICAgZ2VuLmdlbmVyYXRlQ29kZSgpOworCisgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZW4ud3JpdGVDb2RlKCk7CisgICAgICAgICAgICAgICAgd3JpdHRlbi5hZGQoZ2VuLmdldEZpbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGFpZCAhPSBudWxsICYmICFhaWQuaXNJbm5lckNsYXNzKCkpCisgICAgICAgICAgICAgICAgICAgIGFpZC5yZWNvcmQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICBnZW4ud3JpdGVDb2RlKHdyaXRlcik7CisgICAgICAgICAgICAgICAgb3V0cHV0LnB1dChtYXBwaW5nc1tpXS5nZXREZXNjcmliZWRUeXBlKCksIHdyaXRlci50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGlmIChhaWQgIT0gbnVsbCAmJiAhYWlkLmlzSW5uZXJDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYWlkLnNldFdyaXRlcih3cml0ZXIpOworICAgICAgICAgICAgICAgICAgICBhaWQucmVjb3JkKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQobWFwcGluZ3NbaV0uZ2V0T2JqZWN0SWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB3cml0dGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgdG8gdGhlIHByb3BlciBwYWNrYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBtZXRhZGF0YSB7QGxpbmsgRmlsZX1zIHRoYXQgd2VyZSB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gcmVjb3JkTWV0YURhdGEoYm9vbGVhbiBwZXJDbGFzcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlY29yZE1ldGFEYXRhKHBlckNsYXNzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29kZSBmb3IgdGhlIHRvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IGlmIG51bGwsIHRoZW4gcGVyZm9ybSB0aGUgd3JpdGUgZGlyZWN0bHkKKyAgICAgKiB0byB0aGUgZmlsZXN5c3RlbTsgb3RoZXJ3aXNlLCBwb3B1bGF0ZSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbWFwIHdpdGgga2V5cyBhcyB0aGUgZ2VuZXJhdGVkCisgICAgICoge0BsaW5rIENsYXNzTWFwcGluZ30gYW5kIHZhbHVlcyBhcyBhCisgICAgICoge0BsaW5rIFN0cmluZ30gdGhhdCBjb250YWlucyB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgbWV0YWRhdGEge0BsaW5rIEZpbGV9cyB0aGF0IHdlcmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHJlY29yZE1ldGFEYXRhKGJvb2xlYW4gcGVyQ2xhc3MsIE1hcCBvdXRwdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHByZXRlbmQgbWFwcGluZ3MgYXJlIGFsbCByZXNvbHZlZAorICAgICAgICBDbGFzc01hcHBpbmdbXSBtYXBwaW5ncyA9IGdldE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBtYXBwaW5nc1tpXS5zZXRSZXNvbHZlKE1PREVfTUVUQSB8IE1PREVfTUFQUElORywgdHJ1ZSk7CisKKyAgICAgICAgLy8gc3RvcmUgaW4gdXNlcidzIGNvbmZpZ3VyZWQgSU8KKyAgICAgICAgTWV0YURhdGFGYWN0b3J5IG1kZiA9IF9jb25mLm5ld01ldGFEYXRhRmFjdG9yeUluc3RhbmNlKCk7CisgICAgICAgIG1kZi5zZXRSZXBvc2l0b3J5KGdldFJlcG9zaXRvcnkoKSk7CisgICAgICAgIG1kZi5zZXRTdG9yZURpcmVjdG9yeShfZGlyKTsKKyAgICAgICAgaWYgKHBlckNsYXNzKQorICAgICAgICAgICAgbWRmLnNldFN0b3JlTW9kZShNZXRhRGF0YUZhY3RvcnkuU1RPUkVfUEVSX0NMQVNTKTsKKyAgICAgICAgbWRmLnN0b3JlKG1hcHBpbmdzLCBuZXcgUXVlcnlNZXRhRGF0YVswXSwgbmV3IFNlcXVlbmNlTWV0YURhdGFbMF0sCisgICAgICAgICAgICBNT0RFX01FVEEgfCBNT0RFX01BUFBJTkcsIG91dHB1dCk7CisKKyAgICAgICAgU2V0IGZpbGVzID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChtYXBwaW5nc1tpXS5nZXRTb3VyY2VGaWxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlcy5hZGQobWFwcGluZ3NbaV0uZ2V0U291cmNlRmlsZSgpKTsKKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGFuZCB3cml0ZSB0aGUgYXBwbGljYXRpb24gaWRlbnRpdHkgY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSWRUb29sIG5ld0FwcGxpY2F0aW9uSWRUb29sKENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIEFwcGxpY2F0aW9uSWRUb29sIHRvb2w7CisgICAgICAgIGlmIChtYXBwaW5nLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9BUFBMSUNBVElPTgorICAgICAgICAgICAgJiYgIW1hcHBpbmcuaXNPcGVuSlBBSWRlbnRpdHkoKQorICAgICAgICAgICAgJiYgbWFwcGluZy5nZXRQQ1N1cGVyY2xhc3MoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0b29sID0gbmV3IEFwcGxpY2F0aW9uSWRUb29sKF9jb25mLCBtYXBwaW5nLmdldERlc2NyaWJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICBtYXBwaW5nKTsKKyAgICAgICAgICAgIHRvb2wuc2V0RGlyZWN0b3J5KF9kaXIpOworICAgICAgICAgICAgdG9vbC5zZXRDb2RlRm9ybWF0KF9mb3JtYXQpOworICAgICAgICAgICAgaWYgKCF0b29sLnJ1bigpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRvb2w7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE1ldGhvZHMgZm9yIGN1c3RvbWl6ZXJzIHRvIHVzZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2xhc3MgbWFwcGluZyBmb3IgdGhlIGdpdmVuIHRhYmxlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzc01hcHBpbmcpIF90YWJsZXMuZ2V0KHRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY2xhc3MgdG8gYmUgbWFwcGVkIHRvIGEgdGFibGUuIFRoZSBjbGFzcyB3aWxsIHN0YXJ0IG91dAorICAgICAqIHdpdGggYSBkZWZhdWx0IGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIG5ld0NsYXNzTWFwcGluZyhDbGFzcyBjbHMsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgZ2V0UmVwb3NpdG9yeSgpLmFkZE1ldGFEYXRhKGNscyk7CisgICAgICAgIENsYXNzIHN1cCA9IG1hcHBpbmcuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cCA9PSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICBzZXRPYmplY3RJZFR5cGUobWFwcGluZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hcHBpbmcuc2V0UENTdXBlcmNsYXNzKHN1cCk7CisgICAgICAgIG1hcHBpbmcuc2V0VGFibGUodGFibGUpOworICAgICAgICBpZiAoX2RldGFjaGFibGUpCisgICAgICAgICAgICBtYXBwaW5nLnNldERldGFjaGFibGUodHJ1ZSk7CisgICAgICAgIF90YWJsZXMucHV0KHRhYmxlLCBtYXBwaW5nKTsKKyAgICAgICAgcmV0dXJuIG1hcHBpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiBjbGFzcycgb2JqZWN0aWQtY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE9iamVjdElkVHlwZShDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gY2xzLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgIGlmIChfaW5uZXIpCisgICAgICAgICAgICBuYW1lICs9ICIkIjsKKyAgICAgICAgbmFtZSArPSBfaWRTdWZmaXg7CisgICAgICAgIGNscy5zZXRPYmplY3RJZFR5cGUoZ2VuZXJhdGVDbGFzcyhuYW1lLCBudWxsKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgbmV3IGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIGEgbm9uLW51bGwgcGFyZW50IGNsYXNzCisgICAgICogaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgc2V0IGFzIHRoZSBzdXBlcmNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZW5lcmF0ZUNsYXNzKFN0cmluZyBuYW1lLCBDbGFzcyBwYXJlbnQpIHsKKyAgICAgICAgQkNDbGFzcyBiYyA9IF9wcm9qZWN0LmxvYWRDbGFzcyhuYW1lLCBudWxsKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgYmMuc2V0U3VwZXJjbGFzcyhwYXJlbnQpOworICAgICAgICBiYy5hZGREZWZhdWx0Q29uc3RydWN0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIF9sb2FkZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihjbmZlLnRvU3RyaW5nKCksIGNuZmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IGlzIHVuaXF1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZShGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIFByaW1hcnlLZXkgcGsgPSBmay5nZXRUYWJsZSgpLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgaWYgKHBrICE9IG51bGwgJiYgcGsuY29sdW1uc01hdGNoKGZrLmdldENvbHVtbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgSW5kZXhbXSBpZHggPSBmay5nZXRUYWJsZSgpLmdldEluZGV4ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHgubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoaWR4W2ldLmlzVW5pcXVlKCkgJiYgaWR4W2ldLmNvbHVtbnNNYXRjaChmay5nZXRDb2x1bW5zKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBVbmlxdWVbXSB1bnEgPSBmay5nZXRUYWJsZSgpLmdldFVuaXF1ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bnEubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAodW5xW2ldLmNvbHVtbnNNYXRjaChmay5nZXRDb2x1bW5zKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGdpdmVuIHRhYmxlIGhhcyBhIHNpbmdsZSB1bmlxdWUgZm9yZWlnbiBrZXkgb3IgYSBmb3JlaWduCisgICAgICoga2V5IHRoYXQgbWF0Y2hlcyB0aGUgcHJpbWFyeSBrZXksIHJldHVybiBpdC4gRWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRVbmlxdWVGb3JlaWduS2V5KFRhYmxlIHRhYmxlKSB7CisgICAgICAgIEZvcmVpZ25LZXlbXSBma3MgPSB0YWJsZS5nZXRGb3JlaWduS2V5cygpOworICAgICAgICBQcmltYXJ5S2V5IHBrID0gdGFibGUuZ2V0UHJpbWFyeUtleSgpOworICAgICAgICBGb3JlaWduS2V5IHVucSA9IG51bGw7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGsgIT0gbnVsbCAmJiBway5jb2x1bW5zTWF0Y2goZmtzW2ldLmdldENvbHVtbnMoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZrc1tpXTsKKyAgICAgICAgICAgIGlmICghaXNVbmlxdWUoZmtzW2ldKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmICh1bnEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB1bnEgPSBma3NbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjb3VudCA9PSAxKSA/IHVucSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGV4aXN0aW5nIHVuaXF1ZSBjb25zdHJhaW50cyBhbmQgaW5kZXhlcyB0byB0aGUgZ2l2ZW4gZmllbGQncyBqb2luLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEpvaW5Db25zdHJhaW50cyhGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgRm9yZWlnbktleSBmayA9IGZpZWxkLmdldEpvaW5Gb3JlaWduS2V5KCk7CisgICAgICAgIGlmIChmayA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluZGV4IGlkeCA9IGZpbmRJbmRleChmay5nZXRDb2x1bW5zKCkpOworICAgICAgICBpZiAoaWR4ICE9IG51bGwpCisgICAgICAgICAgICBmaWVsZC5zZXRKb2luSW5kZXgoaWR4KTsKKyAgICAgICAgVW5pcXVlIHVucSA9IGZpbmRVbmlxdWUoZmsuZ2V0Q29sdW1ucygpKTsKKyAgICAgICAgaWYgKHVucSAhPSBudWxsKQorICAgICAgICAgICAgZmllbGQuc2V0Sm9pblVuaXF1ZSh1bnEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBleGlzdGluZyB1bmlxdWUgY29uc3RyYWludHMgYW5kIGluZGV4ZXMgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnN0cmFpbnRzKFZhbHVlTWFwcGluZyB2bSkgeworICAgICAgICBDb2x1bW5bXSBjb2xzID0gKHZtLmdldEZvcmVpZ25LZXkoKSAhPSBudWxsKQorICAgICAgICAgICAgPyB2bS5nZXRGb3JlaWduS2V5KCkuZ2V0Q29sdW1ucygpIDogdm0uZ2V0Q29sdW1ucygpOworICAgICAgICBJbmRleCBpZHggPSBmaW5kSW5kZXgoY29scyk7CisgICAgICAgIGlmIChpZHggIT0gbnVsbCkKKyAgICAgICAgICAgIHZtLnNldFZhbHVlSW5kZXgoaWR4KTsKKyAgICAgICAgVW5pcXVlIHVucSA9IGZpbmRVbmlxdWUoY29scyk7CisgICAgICAgIGlmICh1bnEgIT0gbnVsbCkKKyAgICAgICAgICAgIHZtLnNldFZhbHVlVW5pcXVlKHVucSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbmRleCB3aXRoIHRoZSBnaXZlbiBjb2x1bW5zLgorICAgICAqLworICAgIHByaXZhdGUgSW5kZXggZmluZEluZGV4KENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCB8fCBjb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVGFibGUgdGFibGUgPSBjb2xzWzBdLmdldFRhYmxlKCk7CisgICAgICAgIEluZGV4W10gaWR4cyA9IHRhYmxlLmdldEluZGV4ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHhzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGlkeHNbaV0uY29sdW1uc01hdGNoKGNvbHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBpZHhzW2ldOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVuaXF1ZSBjb25zdHJpYW50IHdpdGggdGhlIGdpdmVuIGNvbHVtbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBVbmlxdWUgZmluZFVuaXF1ZShDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIGlmIChjb2xzID09IG51bGwgfHwgY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFRhYmxlIHRhYmxlID0gY29sc1swXS5nZXRUYWJsZSgpOworICAgICAgICBVbmlxdWVbXSB1bnFzID0gdGFibGUuZ2V0VW5pcXVlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVucXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAodW5xc1tpXS5jb2x1bW5zTWF0Y2goY29scykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHVucXNbaV07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8KKyAgICAvLyBVdGlsaXRpZXMKKyAgICAvLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gdGFibGUgaXMgYSBiYXNlIGNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQmFzZVRhYmxlKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIGlmICh0YWJsZS5nZXRQcmltYXJ5S2V5KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IHR5cGUgPSBnZXRTZWNvbmRhcnlUeXBlKHRhYmxlLCB0cnVlKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBUQUJMRV9CQVNFOworICAgICAgICBpZiAoX2N1c3RvbSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9jdXN0b20uZ2V0VGFibGVUeXBlKHRhYmxlLCBUQUJMRV9CQVNFKSA9PSBUQUJMRV9CQVNFOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZGFyeSBnaXZlbiB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRTZWNvbmRhcnlUeXBlKFRhYmxlIHRhYmxlLCBib29sZWFuIG1heWJlQmFzZSkgeworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IHRhYmxlLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIGlmIChma3MubGVuZ3RoID09IDIKKyAgICAgICAgICAgICYmICh0YWJsZS5nZXRQcmltYXJ5S2V5KCkgPT0gbnVsbCB8fCBfcGtPbkpvaW4pCisgICAgICAgICAgICAmJiBma3NbMF0uZ2V0Q29sdW1ucygpLmxlbmd0aCArIGZrc1sxXS5nZXRDb2x1bW5zKCkubGVuZ3RoCisgICAgICAgICAgICA9PSB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoCisgICAgICAgICAgICAmJiAoIWlzVW5pcXVlKGZrc1swXSkgfHwgIWlzVW5pcXVlKGZrc1sxXSkpKQorICAgICAgICAgICAgdHlwZSA9IFRBQkxFX0FTU09DSUFUSU9OOworICAgICAgICBlbHNlIGlmIChtYXliZUJhc2UgJiYgdGFibGUuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCisgICAgICAgICAgICB0eXBlID0gLTE7CisgICAgICAgIGVsc2UgaWYgKGdldFVuaXF1ZUZvcmVpZ25LZXkodGFibGUpICE9IG51bGwpCisgICAgICAgICAgICB0eXBlID0gVEFCTEVfU0VDT05EQVJZOworICAgICAgICBlbHNlIGlmIChma3MubGVuZ3RoID09IDEpCisgICAgICAgICAgICB0eXBlID0gVEFCTEVfTk9ORTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9IC0xOworCisgICAgICAgIGlmIChfY3VzdG9tICE9IG51bGwgJiYgdHlwZSAhPSAtMSkKKyAgICAgICAgICAgIHR5cGUgPSBfY3VzdG9tLmdldFRhYmxlVHlwZSh0YWJsZSwgdHlwZSk7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gY3JlYXRlIGEgYmFzZSBjbGFzcyBmcm9tIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWFwQmFzZUNsYXNzKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBuZXdDbGFzc01hcHBpbmcodGFibGUsIG51bGwpOworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIGRhdGFzdG9yZSBpZGVudGl0eSBhbmQgYnVpbHRpbiBpZGVudGl0eTsgZm9yIG5vdworICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBhbnkgbm9uLWRhdGFzdG9yZSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIHdpbGwgdXNlCisgICAgICAgIC8vIGJ1aWx0aW4gaWRlbnRpdHk7IGlmIHdlIGRpc2NvdmVyIHRoYXQgdGhlIHByaW1hcnkga2V5IGZpZWxkIGlzCisgICAgICAgIC8vIG5vdCBjb21wYXRpYmxlIHdpdGggYnVpbHRpbiBpZGVudGl0eSBsYXRlciwgdGhlbiB3ZSdsbCBhc3NpZ24KKyAgICAgICAgLy8gYW4gYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MKKyAgICAgICAgQ29sdW1uW10gcGtzID0gdGFibGUuZ2V0UHJpbWFyeUtleSgpLmdldENvbHVtbnMoKTsKKyAgICAgICAgY2xzLnNldFByaW1hcnlLZXlDb2x1bW5zKHBrcyk7CisgICAgICAgIGlmIChwa3MubGVuZ3RoID09IDEgJiYgX2RhdGFzdG9yZQorICAgICAgICAgICAgJiYgcGtzWzBdLmlzQ29tcGF0aWJsZShUeXBlcy5CSUdJTlQsIG51bGwsIDAsIDApKSB7CisgICAgICAgICAgICBjbHMuc2V0T2JqZWN0SWRUeXBlKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIGNscy5zZXRJZGVudGl0eVR5cGUoQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRSk7CisgICAgICAgIH0gZWxzZSBpZiAocGtzLmxlbmd0aCA9PSAxICYmIF9idWlsdGluKQorICAgICAgICAgICAgY2xzLnNldE9iamVjdElkVHlwZShudWxsLCBmYWxzZSk7CisgICAgICAgIGNscy5zZXRTdHJhdGVneShuZXcgRnVsbENsYXNzU3RyYXRlZ3koKSwgbnVsbCk7CisgICAgICAgIGlmIChfY3VzdG9tICE9IG51bGwpCisgICAgICAgICAgICBfY3VzdG9tLmN1c3RvbWl6ZShjbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gY3JlYXRlIGEgdmVydGljYWwgc3ViY2xhc3NlcyBmcm9tIHRoZSBnaXZlbiB0YWJsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1hcFN1YmNsYXNzZXMoU2V0IHRhYmxlcykgeworICAgICAgICAvLyBsb29wIHRocm91Z2ggdGFibGVzIHVudGlsIGVpdGhlciBhbGwgYXJlIG1hcHBlZCBvciBub25lIGxpbmsgdG8KKyAgICAgICAgLy8gYSBtYXBwZWQgYmFzZSBjbGFzcyB0YWJsZQorICAgICAgICBDbGFzc01hcHBpbmcgYmFzZSwgc3ViOworICAgICAgICBUYWJsZSB0YWJsZSA9IG51bGw7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBudWxsOworICAgICAgICB3aGlsZSAoIXRhYmxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIGZpbmQgYSB0YWJsZSB3aXRoIGEgZm9yZWlnbiBrZXkgbGlua2luZyB0byBhIG1hcHBlZCB0YWJsZQorICAgICAgICAgICAgYmFzZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHRhYmxlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHRhYmxlID0gKFRhYmxlKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGZrID0gZ2V0VW5pcXVlRm9yZWlnbktleSh0YWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKGZrID09IG51bGwgJiYgdGFibGUuZ2V0Rm9yZWlnbktleXMoKS5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgZmsgPSB0YWJsZS5nZXRGb3JlaWduS2V5cygpWzBdOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZrID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9IChDbGFzc01hcHBpbmcpIF90YWJsZXMuZ2V0KGZrLmdldFByaW1hcnlLZXlUYWJsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBubyB0YWJsZXMgbGluayB0byBhIGJhc2UgdGFibGUsIG5vdGhpbmcgbGVmdCB0byBkbworICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHN1YiA9IG5ld0NsYXNzTWFwcGluZyh0YWJsZSwgYmFzZS5nZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICAgICAgc3ViLnNldEpvaW5Gb3JlaWduS2V5KGZrKTsKKyAgICAgICAgICAgIHN1Yi5zZXRQcmltYXJ5S2V5Q29sdW1ucyhmay5nZXRDb2x1bW5zKCkpOworICAgICAgICAgICAgc3ViLnNldElkZW50aXR5VHlwZShiYXNlLmdldElkZW50aXR5VHlwZSgpKTsKKyAgICAgICAgICAgIHN1Yi5zZXRTdHJhdGVneShuZXcgVmVydGljYWxDbGFzc1N0cmF0ZWd5KCksIG51bGwpOworICAgICAgICAgICAgaWYgKF9jdXN0b20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY3VzdG9tLmN1c3RvbWl6ZShzdWIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byByZXZlcnNlIG1hcCB0aGUgZ2l2ZW4gdGFibGUgYXMgYW4gYXNzb2NpYXRpb24gdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1hcEFzc29jaWF0aW9uVGFibGUoVGFibGUgdGFibGUpIHsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IHRhYmxlLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIGlmIChma3MubGVuZ3RoICE9IDIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNsczEgPSAoQ2xhc3NNYXBwaW5nKSBfdGFibGVzLmdldAorICAgICAgICAgICAgKGZrc1swXS5nZXRQcmltYXJ5S2V5VGFibGUoKSk7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMyID0gKENsYXNzTWFwcGluZykgX3RhYmxlcy5nZXQKKyAgICAgICAgICAgIChma3NbMV0uZ2V0UHJpbWFyeUtleVRhYmxlKCkpOworICAgICAgICBpZiAoY2xzMSA9PSBudWxsIHx8IGNsczIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBhZGQgYSByZWxhdGlvbiBmcm9tIGVhY2ggY2xhc3MgdG8gdGhlIG90aGVyIHRocm91Z2ggdGhlCisgICAgICAgIC8vIGFzc29jaWF0aW9uIHRhYmxlCisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UmVsYXRpb25OYW1lKGNsczIuZ2V0RGVzY3JpYmVkVHlwZSgpLCB0cnVlLCBma3NbMV0sCisgICAgICAgICAgICBmYWxzZSwgY2xzMSk7CisgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZDEgPSBuZXdGaWVsZE1hcHBpbmcobmFtZSwgU2V0LmNsYXNzLCBudWxsLCBma3NbMV0sCisgICAgICAgICAgICBjbHMxKTsKKyAgICAgICAgaWYgKGZpZWxkMSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWVsZDEuc2V0Sm9pbkZvcmVpZ25LZXkoZmtzWzBdKTsKKyAgICAgICAgICAgIGFkZEpvaW5Db25zdHJhaW50cyhmaWVsZDEpOworICAgICAgICAgICAgVmFsdWVNYXBwaW5nIHZtID0gZmllbGQxLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgICAgICB2bS5zZXREZWNsYXJlZFR5cGUoY2xzMi5nZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICAgICAgdm0uc2V0Rm9yZWlnbktleShma3NbMV0pOworICAgICAgICAgICAgYWRkQ29uc3RyYWludHModm0pOworICAgICAgICAgICAgZmllbGQxLnNldFN0cmF0ZWd5KG5ldyBSZWxhdGlvbkNvbGxlY3Rpb25UYWJsZUZpZWxkU3RyYXRlZ3koKSwKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIGlmIChfY3VzdG9tICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2N1c3RvbS5jdXN0b21pemUoZmllbGQxKTsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBnZXRSZWxhdGlvbk5hbWUoY2xzMS5nZXREZXNjcmliZWRUeXBlKCksIHRydWUsIGZrc1swXSwKKyAgICAgICAgICAgIGZhbHNlLCBjbHMyKTsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkMiA9IG5ld0ZpZWxkTWFwcGluZyhuYW1lLCBTZXQuY2xhc3MsIG51bGwsIGZrc1swXSwKKyAgICAgICAgICAgIGNsczIpOworICAgICAgICBpZiAoZmllbGQyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZmllbGQyLnNldEpvaW5Gb3JlaWduS2V5KGZrc1sxXSk7CisgICAgICAgIGFkZEpvaW5Db25zdHJhaW50cyhmaWVsZDIpOworICAgICAgICBWYWx1ZU1hcHBpbmcgdm0gPSBmaWVsZDIuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgdm0uc2V0RGVjbGFyZWRUeXBlKGNsczEuZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKyAgICAgICAgdm0uc2V0Rm9yZWlnbktleShma3NbMF0pOworICAgICAgICBhZGRDb25zdHJhaW50cyh2bSk7CisgICAgICAgIGlmIChmaWVsZDEgIT0gbnVsbCAmJiBmaWVsZDEuZ2V0TWFwcGVkQnkoKSA9PSBudWxsKQorICAgICAgICAgICAgZmllbGQyLnNldE1hcHBlZEJ5KGZpZWxkMS5nZXROYW1lKCkpOworICAgICAgICBmaWVsZDIuc2V0U3RyYXRlZ3kobmV3IFJlbGF0aW9uQ29sbGVjdGlvblRhYmxlRmllbGRTdHJhdGVneSgpLCBudWxsKTsKKyAgICAgICAgaWYgKF9jdXN0b20gIT0gbnVsbCkKKyAgICAgICAgICAgIF9jdXN0b20uY3VzdG9taXplKGZpZWxkMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byByZXZlcnNlIG1hcCB0aGUgZ2l2ZW4gdGFibGUgYXMgYSBzZWNvbmRhcnkgdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1hcFNlY29uZGFyeVRhYmxlKFRhYmxlIHRhYmxlLCBib29sZWFuIG91dGVyKSB7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBnZXRVbmlxdWVGb3JlaWduS2V5KHRhYmxlKTsKKyAgICAgICAgaWYgKGZrID09IG51bGwgJiYgdGFibGUuZ2V0Rm9yZWlnbktleXMoKS5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGZrID0gdGFibGUuZ2V0Rm9yZWlnbktleXMoKVswXTsKKyAgICAgICAgZWxzZSBpZiAoZmsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChDbGFzc01hcHBpbmcpIF90YWJsZXMuZ2V0KGZrLmdldFByaW1hcnlLZXlUYWJsZSgpKTsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtYXBDb2x1bW5zKGNscywgdGFibGUsIGZrLCBvdXRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIHRoZSBjb2x1bW5zIG9mIHRoZSBnaXZlbiB0YWJsZSB0byBmaWVsZHMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1hcENvbHVtbnMoQ2xhc3NNYXBwaW5nIGNscywgVGFibGUgdGFibGUsIEZvcmVpZ25LZXkgam9pbiwKKyAgICAgICAgYm9vbGVhbiBvdXRlcikgeworICAgICAgICAvLyBmaXJzdCBtYXAgZm9yZWlnbiBrZXlzIHRvIHJlbGF0aW9ucworICAgICAgICBGb3JlaWduS2V5W10gZmtzID0gdGFibGUuZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBma3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoZmtzW2ldICE9IGpvaW4gJiYgZmtzW2ldICE9IGNscy5nZXRKb2luRm9yZWlnbktleSgpKQorICAgICAgICAgICAgICAgIG1hcEZvcmVpZ25LZXkoY2xzLCBma3NbaV0sIGpvaW4sIG91dGVyKTsKKworICAgICAgICAvLyBtYXAgYW55IGNvbHVtbnMgbm90IGNvbnRyb2xsZWQgYnkgZm9yZWlnbiBrZXlzOyBhbHNvIGZvcmNlIHByaW1hcnkKKyAgICAgICAgLy8ga2V5IGNvbHMgdG8gZ2V0IG1hcHBlZCB0byBzaW1wbGUgZmllbGRzIGV2ZW4gaWYgdGhlIGNvbHVtbnMgYXJlCisgICAgICAgIC8vIGFsc28gZm9yZWlnbiBrZXkgY29sdW1ucworICAgICAgICBQcmltYXJ5S2V5IHBrID0gKGpvaW4gIT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0UHJpbWFyeUtleSgpOworICAgICAgICBib29sZWFuIHBrY29sOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHBrY29sID0gcGsgIT0gbnVsbCAmJiBway5jb250YWluc0NvbHVtbihjb2xzW2ldKTsKKyAgICAgICAgICAgIGlmIChwa2NvbCAmJiBjbHMuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgoY2xzLmdldFBDU3VwZXJjbGFzcygpID09IG51bGwgJiYgcGtjb2wpCisgICAgICAgICAgICAgICAgfHwgIWlzRm9yZWlnbktleUNvbHVtbihjb2xzW2ldKSkKKyAgICAgICAgICAgICAgICBtYXBDb2x1bW4oY2xzLCBjb2xzW2ldLCBqb2luLCBvdXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBnaXZlbiBjb2x1bW4gYXBwZWFycyBpbiBhbnkgZm9yZWlnbiBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGb3JlaWduS2V5Q29sdW1uKENvbHVtbiBjb2wpIHsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IGNvbC5nZXRUYWJsZSgpLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGZrc1tpXS5jb250YWluc0NvbHVtbihjb2wpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIGEgZm9yZWlnbiBrZXkgdG8gYSByZWxhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWFwRm9yZWlnbktleShDbGFzc01hcHBpbmcgY2xzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBGb3JlaWduS2V5IGpvaW4sIGJvb2xlYW4gb3V0ZXIpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbCA9IChDbGFzc01hcHBpbmcpIF90YWJsZXMuZ2V0KGZrLmdldFByaW1hcnlLZXlUYWJsZSgpKTsKKyAgICAgICAgaWYgKHJlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UmVsYXRpb25OYW1lKHJlbC5nZXREZXNjcmliZWRUeXBlKCksIGZhbHNlLCBmaywKKyAgICAgICAgICAgIGZhbHNlLCBjbHMpOworICAgICAgICBGaWVsZE1hcHBpbmcgZmllbGQxID0gbmV3RmllbGRNYXBwaW5nKG5hbWUsIHJlbC5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICBudWxsLCBmaywgY2xzKTsKKyAgICAgICAgaWYgKGZpZWxkMSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWVsZDEuc2V0Sm9pbkZvcmVpZ25LZXkoam9pbik7CisgICAgICAgICAgICBmaWVsZDEuc2V0Sm9pbk91dGVyKG91dGVyKTsKKyAgICAgICAgICAgIGFkZEpvaW5Db25zdHJhaW50cyhmaWVsZDEpOworICAgICAgICAgICAgZmllbGQxLnNldEZvcmVpZ25LZXkoZmspOworICAgICAgICAgICAgYWRkQ29uc3RyYWludHMoZmllbGQxKTsKKyAgICAgICAgICAgIGZpZWxkMS5zZXRTdHJhdGVneShuZXcgUmVsYXRpb25GaWVsZFN0cmF0ZWd5KCksIG51bGwpOworICAgICAgICAgICAgaWYgKF9jdXN0b20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY3VzdG9tLmN1c3RvbWl6ZShmaWVsZDEpOworICAgICAgICB9CisgICAgICAgIGlmICghX2ludmVyc2UgfHwgam9pbiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGNyZWF0ZSBpbnZlcnNlIHJlbGF0aW9uCisgICAgICAgIGJvb2xlYW4gdW5xID0gaXNVbmlxdWUoZmspOworICAgICAgICBuYW1lID0gZ2V0UmVsYXRpb25OYW1lKGNscy5nZXREZXNjcmliZWRUeXBlKCksICF1bnEsIGZrLCB0cnVlLCByZWwpOworICAgICAgICBDbGFzcyB0eXBlID0gKHVucSkgPyBjbHMuZ2V0RGVzY3JpYmVkVHlwZSgpIDogU2V0LmNsYXNzOworICAgICAgICBGaWVsZE1hcHBpbmcgZmllbGQyID0gbmV3RmllbGRNYXBwaW5nKG5hbWUsIHR5cGUsIG51bGwsIGZrLCByZWwpOworICAgICAgICBpZiAoZmllbGQyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChmaWVsZDEgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpZWxkMi5zZXRNYXBwZWRCeShmaWVsZDEuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKHVucSkgeworICAgICAgICAgICAgZmllbGQyLnNldEZvcmVpZ25LZXkoZmspOworICAgICAgICAgICAgZmllbGQyLnNldEpvaW5EaXJlY3Rpb24oZmllbGQyLkpPSU5fSU5WRVJTRSk7CisgICAgICAgICAgICBmaWVsZDIuc2V0U3RyYXRlZ3kobmV3IFJlbGF0aW9uRmllbGRTdHJhdGVneSgpLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZhbHVlTWFwcGluZyB2bSA9IGZpZWxkMi5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICAgICAgdm0uc2V0RGVjbGFyZWRUeXBlKGNscy5nZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICAgICAgdm0uc2V0Rm9yZWlnbktleShmayk7CisgICAgICAgICAgICB2bS5zZXRKb2luRGlyZWN0aW9uKHZtLkpPSU5fRVhQRUNURURfSU5WRVJTRSk7CisgICAgICAgICAgICBmaWVsZDIuc2V0U3RyYXRlZ3kobmV3IFJlbGF0aW9uQ29sbGVjdGlvbkludmVyc2VLZXlGaWVsZFN0cmF0ZWd5KCksCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9jdXN0b20gIT0gbnVsbCkKKyAgICAgICAgICAgIF9jdXN0b20uY3VzdG9taXplKGZpZWxkMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIGEgY29sdW1uIHRvIGEgc2ltcGxlIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtYXBDb2x1bW4oQ2xhc3NNYXBwaW5nIGNscywgQ29sdW1uIGNvbCwgRm9yZWlnbktleSBqb2luLAorICAgICAgICBib29sZWFuIG91dGVyKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0RmllbGROYW1lKGNvbC5nZXROYW1lKCksIGNscyk7CisgICAgICAgIENsYXNzIHR5cGUgPSBnZXRGaWVsZFR5cGUoY29sLCBmYWxzZSk7CisgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IG5ld0ZpZWxkTWFwcGluZyhuYW1lLCB0eXBlLCBjb2wsIG51bGwsIGNscyk7CisgICAgICAgIGZpZWxkLnNldFNlcmlhbGl6ZWQodHlwZSA9PSBPYmplY3QuY2xhc3MpOworICAgICAgICBmaWVsZC5zZXRKb2luRm9yZWlnbktleShqb2luKTsKKyAgICAgICAgZmllbGQuc2V0Sm9pbk91dGVyKG91dGVyKTsKKyAgICAgICAgYWRkSm9pbkNvbnN0cmFpbnRzKGZpZWxkKTsKKyAgICAgICAgZmllbGQuc2V0Q29sdW1ucyhuZXcgQ29sdW1uW117IGNvbCB9KTsKKyAgICAgICAgYWRkQ29uc3RyYWludHMoZmllbGQpOworICAgICAgICBpZiAoY29sLmlzUHJpbWFyeUtleSgpCisgICAgICAgICAgICAmJiBjbHMuZ2V0SWRlbnRpdHlUeXBlKCkgIT0gQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgIGZpZWxkLnNldFByaW1hcnlLZXkodHJ1ZSk7CisKKyAgICAgICAgRmllbGRTdHJhdGVneSBzdHJhdDsKKyAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkKKyAgICAgICAgICAgIHN0cmF0ID0gbmV3IFByaW1pdGl2ZUZpZWxkU3RyYXRlZ3koKTsKKyAgICAgICAgZWxzZSBpZiAoY29sLmdldFR5cGUoKSA9PSBUeXBlcy5DTE9CCisgICAgICAgICAgICAmJiBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLm1heEVtYmVkZGVkQ2xvYlNpemUgIT0gLTEpCisgICAgICAgICAgICBzdHJhdCA9IG5ldyBNYXhFbWJlZGRlZENsb2JGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgIGVsc2UgaWYgKGNvbC5pc0xvYigpCisgICAgICAgICAgICAmJiBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLm1heEVtYmVkZGVkQmxvYlNpemUgIT0gLTEpCisgICAgICAgICAgICBzdHJhdCA9IG5ldyBNYXhFbWJlZGRlZEJsb2JGaWVsZFN0cmF0ZWd5KCk7CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgc3RyYXQgPSBuZXcgU3RyaW5nRmllbGRTdHJhdGVneSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJhdCA9IG5ldyBIYW5kbGVyRmllbGRTdHJhdGVneSgpOworICAgICAgICBmaWVsZC5zZXRTdHJhdGVneShzdHJhdCwgbnVsbCk7CisgICAgICAgIGlmIChfY3VzdG9tICE9IG51bGwpCisgICAgICAgICAgICBfY3VzdG9tLmN1c3RvbWl6ZShmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY2xhc3MgbWFwcGluZyBmb3IgdGhlIGdpdmVuIHRhYmxlLCBvciByZXR1cm4gbnVsbCBpZgorICAgICAqIGN1c3RvbWl6ZXIgcmVqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTWFwcGluZyBuZXdDbGFzc01hcHBpbmcoVGFibGUgdGFibGUsIENsYXNzIHBhcmVudCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZSh0YWJsZSk7CisgICAgICAgIGlmIChfY3VzdG9tICE9IG51bGwpCisgICAgICAgICAgICBuYW1lID0gX2N1c3RvbS5nZXRDbGFzc05hbWUodGFibGUsIG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBuZXdDbGFzc01hcHBpbmcoZ2VuZXJhdGVDbGFzcyhuYW1lLCBwYXJlbnQpLCB0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgbWFwcGluZyBmb3IgdGhlIGdpdmVuIGluZm8sIG9yIHJldHVybiBudWxsIGlmCisgICAgICogY3VzdG9taXplciByZWplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgbmV3RmllbGRNYXBwaW5nKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlLCBDb2x1bW4gY29sLAorICAgICAgICBGb3JlaWduS2V5IGZrLCBDbGFzc01hcHBpbmcgZGVjKSB7CisgICAgICAgIGlmIChfY3VzdG9tICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSAoZmsgPT0gbnVsbCkgPyBuZXcgQ29sdW1uW117IGNvbCB9CisgICAgICAgICAgICAgICAgOiBmay5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IF9jdXN0b20uZ2V0RmllbGROYW1lKGRlYywgY29scywgZmssIG5hbWUpOworICAgICAgICAgICAgaWYgKG5ld05hbWUgPT0gbnVsbCB8fCAhbmV3TmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX2FiYW5kb25lZEZpZWxkTmFtZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2FiYW5kb25lZEZpZWxkTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgIF9hYmFuZG9uZWRGaWVsZE5hbWVzLmFkZChkZWMuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIuIiArIG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIG5hbWUgPSBuZXdOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkID0gZGVjLmFkZERlY2xhcmVkRmllbGRNYXBwaW5nKG5hbWUsIHR5cGUpOworICAgICAgICBmaWVsZC5zZXRFeHBsaWNpdCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEphdmEgaWRlbnRpZmllci1mb3JtYXR0ZWQgbmFtZSBmb3IgdGhlIGdpdmVuIHRhYmxlCisgICAgICogbmFtZSwgdXNpbmcgdGhlIGRlZmF1bHQgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDbGFzc05hbWUoVGFibGUgdGFibGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGdldFBhY2thZ2VOYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0UGFja2FnZU5hbWUoKSkuYXBwZW5kKCIuIik7CisKKyAgICAgICAgU3RyaW5nW10gc3ViczsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSByZXBsYWNlSW52YWxpZENoYXJhY3RlcnModGFibGUuZ2V0U2NoZW1hTmFtZSgpKTsKKyAgICAgICAgaWYgKF91c2VTY2hlbWEgJiYgbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoYWxsVXBwZXJDYXNlKG5hbWUpKQorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBzdWJzID0gU3RyaW5ncy5zcGxpdChuYW1lLCAiXyIsIDApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMuY2FwaXRhbGlzZShzdWJzW2ldKSk7CisgICAgICAgIH0KKworICAgICAgICBuYW1lID0gcmVwbGFjZUludmFsaWRDaGFyYWN0ZXJzKHRhYmxlLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChhbGxVcHBlckNhc2UobmFtZSkpCisgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBzdWJzID0gU3RyaW5ncy5zcGxpdChuYW1lLCAiXyIsIDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbmFtZSBjYW4ndCBjb25mbGljdCB3aXRoIGdlbmVyYXRlZCBpZCBjbGFzcyBuYW1lczsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBuYW1lIHdvdWxkIGVuZCBpbiAnSWQnLCBtYWtlIGl0IGVuZCBpbiAnSWRlbnQnCisgICAgICAgICAgICBpZiAoaSA9PSBzdWJzLmxlbmd0aCAtIDEgJiYgc3Vic1tpXS5lcXVhbHNJZ25vcmVDYXNlKCJpZCIpKQorICAgICAgICAgICAgICAgIHN1YnNbaV0gPSAiaWRlbnQiOworICAgICAgICAgICAgYnVmLmFwcGVuZChTdHJpbmdVdGlscy5jYXBpdGFsaXNlKHN1YnNbaV0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZWZhdWx0IEphdmEgaWRlbnRpZmllci1mb3JtYXR0ZWQgbmFtZSBmb3IgdGhlIGdpdmVuCisgICAgICogY29sdW1uL3RhYmxlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoU3RyaW5nIG5hbWUsIENsYXNzTWFwcGluZyBkZWMpIHsKKyAgICAgICAgbmFtZSA9IHJlcGxhY2VJbnZhbGlkQ2hhcmFjdGVycyhuYW1lKTsKKyAgICAgICAgaWYgKGFsbFVwcGVyQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5hbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobmFtZS5jaGFyQXQoMCkpICsgbmFtZS5zdWJzdHJpbmcoMSk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nW10gc3VicyA9IFN0cmluZ3Muc3BsaXQobmFtZSwgIl8iLCAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgc3Vic1tpXSA9IFN0cmluZ1V0aWxzLmNhcGl0YWxpc2Uoc3Vic1tpXSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKHN1YnNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRVbmlxdWVOYW1lKGJ1Zi50b1N0cmluZygpLCBkZWMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGRlZmF1bHQgamF2YSBpZGVudGlmaWVyLWZvcm1hdHRlZCBmaWVsZCByZWxhdGlvbiBuYW1lCisgICAgICogZm9yIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aW9uTmFtZShDbGFzcyBmaWVsZFR5cGUsIGJvb2xlYW4gY29sbCwKKyAgICAgICAgRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBDbGFzc01hcHBpbmcgZGVjKSB7CisgICAgICAgIGlmIChfdXNlRksgJiYgZmsuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0RmllbGROYW1lKGZrLmdldE5hbWUoKSwgZGVjKTsKKyAgICAgICAgICAgIGlmIChpbnZlcnNlICYmIGNvbGwpCisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAiSW52ZXJzZXMiOworICAgICAgICAgICAgZWxzZSBpZiAoaW52ZXJzZSkKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICJJbnZlcnNlIjsKKyAgICAgICAgICAgIHJldHVybiBnZXRVbmlxdWVOYW1lKG5hbWUsIGRlYyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQganVzdCB0aGUgY2xhc3MgbmFtZSwgdy9vIHBhY2thZ2UKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWVsZFR5cGUuZ2V0TmFtZSgpOworICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7CisKKyAgICAgICAgLy8gbWFrZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGxvd2VyY2FzZSBhbmQgcGx1cmFsaXplIGlmIGEgY29sbGVjdGlvbgorICAgICAgICBuYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWUuY2hhckF0KDApKSArIG5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBpZiAoY29sbCAmJiAhbmFtZS5lbmRzV2l0aCgicyIpKQorICAgICAgICAgICAgbmFtZSArPSAicyI7CisKKyAgICAgICAgcmV0dXJuIGdldFVuaXF1ZU5hbWUobmFtZSwgZGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGFsbCB1cHBlcmNhc2UgbGV0dGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFsbFVwcGVyQ2FzZShTdHJpbmcgc3RyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoc3RyLmNoYXJBdChpKSkKKyAgICAgICAgICAgICAgICAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0ci5jaGFyQXQoaSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgaW4gSmF2YSBuYW1lcyB3aXRoIGFuIHVuZGVyc2NvcmU7CisgICAgICogcGFja2FnZS1wcml2YXRlIGZvciB0ZXN0aW5nLgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUludmFsaWRDaGFyYWN0ZXJzKFN0cmluZyBzdHIpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyKSkKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyKTsKKyAgICAgICAgY2hhciBjOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjID0gYnVmLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICckJyB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN0ci5jaGFyQXQoaSkpKQorICAgICAgICAgICAgICAgIGJ1Zi5zZXRDaGFyQXQoaSwgJ18nKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHVuZGVyc2NvcmVzCisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIHdoaWxlIChzdGFydCA8IGJ1Zi5sZW5ndGgoKSAmJiBidWYuY2hhckF0KHN0YXJ0KSA9PSAnXycpCisgICAgICAgICAgICBzdGFydCsrOworICAgICAgICBpbnQgZW5kID0gYnVmLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgd2hpbGUgKGVuZCA+PSAwICYmIGJ1Zi5jaGFyQXQoZW5kKSA9PSAnXycpCisgICAgICAgICAgICBlbmQtLTsKKworICAgICAgICAvLyBwb3NzaWJsZSB0aGF0IGFsbCBjaGFycyBpbiBuYW1lIGFyZSBpbnZhbGlkCisgICAgICAgIGlmIChzdGFydCA+IGVuZCkKKyAgICAgICAgICAgIHJldHVybiAieCI7CisgICAgICAgIHJldHVybiBidWYuc3Vic3RyaW5nKHN0YXJ0LCBlbmQgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgZ2l2ZW4gbmFtZSBhcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgaXQgaXNuJ3QgYWxyZWFkeQorICAgICAqIHRha2VuIGJ5IGEgZmllbGQgaW4gdGhlIGdpdmVuIHBhcmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVOYW1lKFN0cmluZyBuYW1lLCBDbGFzc01hcHBpbmcgZGVjKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbmFtZSBpc24ndCBhIGtleXdvcmQKKyAgICAgICAgaWYgKF9qYXZhS2V5d29yZHMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICBuYW1lID0gKFN0cmluZykgX2phdmFLZXl3b3Jkcy5nZXQobmFtZSk7CisKKyAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhbGdvcml0aG0gdXNlZCBpbiBEQkRpY3Rpb25hcnkgdG8gZ2V0IHVuaXF1ZSBuYW1lcworICAgICAgICBTdHJpbmcgcHJlZml4ID0gZGVjLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCkgKyAiLiI7CisgICAgICAgIGZvciAoaW50IHZlcnNpb24gPSAyLCBjaGFycyA9IDE7CisgICAgICAgICAgICBkZWMuZ2V0RGVjbGFyZWRGaWVsZChuYW1lKSAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgKF9hYmFuZG9uZWRGaWVsZE5hbWVzICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBfYWJhbmRvbmVkRmllbGROYW1lcy5jb250YWlucyhwcmVmaXggKyBuYW1lKSk7IHZlcnNpb24rKykgeworICAgICAgICAgICAgaWYgKHZlcnNpb24gPiAyKQorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gY2hhcnMpOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gTWF0aC5wb3coMTAsIGNoYXJzKSkKKyAgICAgICAgICAgICAgICBjaGFycysrOworICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyB2ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBmaWVsZCB0eXBlIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRGaWVsZFR5cGUoQ29sdW1uIGNvbCwgYm9vbGVhbiBmb3JjZU9iamVjdCkgeworICAgICAgICAvLyBjaGVjayB0aGUgY3VzdG9tIHR5cGUgbWFwIHRvIHNlZSBpZiB3ZSd2ZSBvdmVycmlkZGVuIHRoZQorICAgICAgICAvLyBkZWZhdWx0IHR5cGUgdG8gY3JlYXRlIGZvciBhIHJhdyBTUUwgdHlwZSBuYW1lCisgICAgICAgIENsYXNzIHR5cGUgPSBudWxsOworICAgICAgICBpZiAoX3R5cGVNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZmlyc3QgdHJ5ICJUWVBFKFNJWkUsREVDSU1BTFMpIiwgdGhlbiAiVFlQRShTSVpFKSwgdGhlbiAiVFlQRSIKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb3BOYW1lcyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICBjb2wuZ2V0VHlwZU5hbWUoKSArICIoIiArIGNvbC5nZXRTaXplKCkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgKyBjb2wuZ2V0RGVjaW1hbERpZ2l0cygpICsgIikiLAorICAgICAgICAgICAgICAgIGNvbC5nZXRUeXBlTmFtZSgpICsgIigiICsgY29sLmdldFNpemUoKSArICIpIiwKKyAgICAgICAgICAgICAgICBjb2wuZ2V0VHlwZU5hbWUoKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlU3BlYyA9IG51bGw7CisgICAgICAgICAgICBpbnQgbmFtZUlkeCA9IDA7CisgICAgICAgICAgICBmb3IgKDsgdHlwZVNwZWMgPT0gbnVsbCAmJiBuYW1lSWR4IDwgcHJvcE5hbWVzLmxlbmd0aDsgbmFtZUlkeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lc1tuYW1lSWR4XSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHR5cGVTcGVjID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChfdHlwZU1hcC5nZXRQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAocHJvcE5hbWVzW25hbWVJZHhdKSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVTcGVjICE9IG51bGwpIAorICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHByb3BOYW1lc1tuYW1lSWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlU3BlYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9sb2cuaW5mbyhfbG9jLmdldCgicmV2ZXJzZS10eXBlIiwgdHlwZU5hbWUsIHR5cGVTcGVjKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgibm8tcmV2ZXJzZS10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWVzW3Byb3BOYW1lcy5sZW5ndGggLSAxXSkpOworCisgICAgICAgICAgICBpZiAodHlwZVNwZWMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0eXBlID0gU3RyaW5ncy50b0NsYXNzKHR5cGVTcGVjLCBfY29uZi4KKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuZ2V0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgKFJldmVyc2VNYXBwaW5nVG9vbC5jbGFzcywgbnVsbCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHR5cGUgPSBTY2hlbWFzLmdldEphdmFUeXBlKGNvbC5nZXRUeXBlKCksIGNvbC5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgY29sLmdldERlY2ltYWxEaWdpdHMoKSk7CisgICAgICAgIGlmICh0eXBlID09IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgaWYgKCFfYmxvYkFzT2JqKQorICAgICAgICAgICAgICAgIHJldHVybiBieXRlW10uY2xhc3M7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyZWF0IGNoYXJzIHNwZWNpYWxseTsgaWYgdGhlIGRpY3Rpb25hcnkgaGFzIHN0b3JlQ2hhcnNBc051bWJlcnMKKyAgICAgICAgLy8gc2V0LCB0aGVuIHdlIGNhbid0IHJldmVyc2UgbWFwIGludG8gYSBjaGFyOyB1c2UgYSBzdHJpbmcgYW5kIHRlbGwKKyAgICAgICAgLy8gdGhlIHVzZXIgd2h5IHdlIGFyZSBkb2luZyBzbworICAgICAgICBpZiAodHlwZSA9PSBjaGFyLmNsYXNzCisgICAgICAgICAgICAmJiBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLnN0b3JlQ2hhcnNBc051bWJlcnMpIHsKKyAgICAgICAgICAgIHR5cGUgPSBTdHJpbmcuY2xhc3M7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJjYW50LXVzZS1jaGFyIiwgY29sLmdldEZ1bGxOYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdHlwZS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIGlmICghZm9yY2VPYmplY3QgJiYgKGNvbC5pc05vdE51bGwoKSB8fCAhX251bGxBc09iaikpCisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKworICAgICAgICAvLyBjb252ZXJ0IHRoZSB0eXBlIGludG8gdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIgY2xhc3MKKyAgICAgICAgc3dpdGNoICh0eXBlLmdldE5hbWUoKS5jaGFyQXQoMCkpIHsKKyAgICAgICAgICAgIGNhc2UnYic6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gYm9vbGVhbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY2xhc3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGUuY2xhc3M7CisgICAgICAgICAgICBjYXNlJ2MnOgorICAgICAgICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXIuY2xhc3M7CisgICAgICAgICAgICBjYXNlJ2QnOgorICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuY2xhc3M7CisgICAgICAgICAgICBjYXNlJ2YnOgorICAgICAgICAgICAgICAgIHJldHVybiBGbG9hdC5jbGFzczsKKyAgICAgICAgICAgIGNhc2UnaSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuY2xhc3M7CisgICAgICAgICAgICBjYXNlJ2wnOgorICAgICAgICAgICAgICAgIHJldHVybiBMb25nLmNsYXNzOworICAgICAgICAgICAgY2FzZSdzJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU2hvcnQuY2xhc3M7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHRvb2wgd2l0aCB0aGUgc2FtZSBzZXR0aW5ncyBhcyB0aGlzIG9uZS4gVXNlZCBpbiB3b3JrYmVuY2guCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgUmV2ZXJzZU1hcHBpbmdUb29sIHRvb2wgPSBuZXcgUmV2ZXJzZU1hcHBpbmdUb29sKF9jb25mKTsKKyAgICAgICAgdG9vbC5zZXRTY2hlbWFHcm91cChnZXRTY2hlbWFHcm91cCgpKTsKKyAgICAgICAgdG9vbC5zZXRQYWNrYWdlTmFtZShnZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgdG9vbC5zZXREaXJlY3RvcnkoZ2V0RGlyZWN0b3J5KCkpOworICAgICAgICB0b29sLnNldFVzZVNjaGVtYU5hbWUoZ2V0VXNlU2NoZW1hTmFtZSgpKTsKKyAgICAgICAgdG9vbC5zZXRVc2VGb3JlaWduS2V5TmFtZShnZXRVc2VGb3JlaWduS2V5TmFtZSgpKTsKKyAgICAgICAgdG9vbC5zZXROdWxsYWJsZUFzT2JqZWN0KGdldE51bGxhYmxlQXNPYmplY3QoKSk7CisgICAgICAgIHRvb2wuc2V0QmxvYkFzT2JqZWN0KGdldEJsb2JBc09iamVjdCgpKTsKKyAgICAgICAgdG9vbC5zZXRQcmltYXJ5S2V5T25Kb2luKGdldFByaW1hcnlLZXlPbkpvaW4oKSk7CisgICAgICAgIHRvb2wuc2V0VXNlRGF0YVN0b3JlSWRlbnRpdHkoZ2V0VXNlRGF0YVN0b3JlSWRlbnRpdHkoKSk7CisgICAgICAgIHRvb2wuc2V0VXNlQnVpbHRpbklkZW50aXR5Q2xhc3MoZ2V0VXNlQnVpbHRpbklkZW50aXR5Q2xhc3MoKSk7CisgICAgICAgIHRvb2wuc2V0SW5uZXJJZGVudGl0eUNsYXNzZXMoZ2V0SW5uZXJJZGVudGl0eUNsYXNzZXMoKSk7CisgICAgICAgIHRvb2wuc2V0SWRlbnRpdHlDbGFzc1N1ZmZpeChnZXRJZGVudGl0eUNsYXNzU3VmZml4KCkpOworICAgICAgICB0b29sLnNldEludmVyc2VSZWxhdGlvbnMoZ2V0SW52ZXJzZVJlbGF0aW9ucygpKTsKKyAgICAgICAgdG9vbC5zZXREZXRhY2hhYmxlKGdldERldGFjaGFibGUoKSk7CisgICAgICAgIHRvb2wuc2V0Q3VzdG9taXplcihnZXRDdXN0b21pemVyKCkpOworICAgICAgICB0b29sLnNldENvZGVGb3JtYXQoZ2V0Q29kZUZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIHRvb2w7CisgICAgfQorCisgICAgLy8vLy8vLy8KKyAgICAvLyBNYWluCisgICAgLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFVzYWdlOiBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUmV2ZXJzZU1hcHBpbmdUb29sCisgICAgICogW29wdGlvbl0qICZsdDsuc2NoZW1hIGZpbGUgb3IgcmVzb3VyY2UmZ3Q7KgorICAgICAqICBXaGVyZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQuCisgICAgICogPHVsPgorICAgICAqIDxsaT48aT4tcHJvcGVydGllcy8tcCAmbHQ7cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlJmd0OzwvaT46IFRoZQorICAgICAqIHBhdGggb3IgcmVzb3VyY2UgbmFtZSBvZiBhIE9wZW5KUEEgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcKKyAgICAgKiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBsaWNlbnNlIGtleQlkYXRhIGFzIG91dGxpbmVkIGluCisgICAgICoge0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9ufS4gT3B0aW9uYWwuPC9saT4KKyAgICAgKiA8bGk+PGk+LSZsdDtwcm9wZXJ0eSBuYW1lJmd0OyAmbHQ7cHJvcGVydHkgdmFsdWUmZ3Q7PC9pPjogQWxsIGJlYW4KKyAgICAgKiBwcm9wZXJ0aWVzIG9mIHRoZSBPcGVuSlBBIHtAbGluayBKREJDQ29uZmlndXJhdGlvbn0gY2FuIGJlIHNldCBieQorICAgICAqIHVzaW5nIHRoZWlyCW5hbWVzIGFuZCBzdXBwbHlpbmcgYSB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgICAgICogPGNvZGU+LWxpY2Vuc2VLZXkgYWRzbGZqYTgzcjNsa2FkZjwvY29kZT48L2xpPgorICAgICAqIDxsaT48aT4tc2NoZW1hcy8tcyAmbHQ7c2NoZW1hcyBhbmQgdGFibGVzJmd0OzwvaT46IENvbW1hLXNlcGFyYXRlZAorICAgICAqIGxpc3Qgb2Ygc2NoZW1hcyBhbmQgdGFibGVzIHRvIHJldmVyc2UtbWFwLjwvbGk+CisgICAgICogPGxpPjxpPi1wYWNrYWdlLy1wa2cgJmx0O3BhY2thZ2UgbmFtZSZndDs8L2k+OiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZQorICAgICAqIGZvciBhbGwgZ2VuZXJhdGVkIGNsYXNzZXMuIERlZmF1bHRzIHRvIG5vIHBhY2thZ2UuPC9saT4KKyAgICAgKiA8bGk+PGk+LWRpcmVjdG9yeS8tZCAmbHQ7b3V0cHV0IGRpcmVjdG9yeSZndDs8L2k+OiBUaGUgZGlyZWN0b3J5IHdoZXJlCisgICAgICogYWxsIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBiZSBwbGFjZWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50CisgICAgICogZGlyZWN0b3J5LjwvbGk+CisgICAgICogPGxpPjxpPi11c2VTY2hlbWFOYW1lLy1zbiAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBTZXQgdGhpcyBmbGFnIHRvCisgICAgICogdHJ1ZSB0byBpbmNsdWRlIHRoZSBzY2hlbWEgbmFtZSBhcyBwYXJ0IG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgbmFtZQorICAgICAqIGZvciBlYWNoIHRhYmxlLjwvbGk+CisgICAgICogPGxpPjxpPi11c2VGb3JlaWduS2V5TmFtZS8tZmtuICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFNldCB0aGlzCisgICAgICogZmxhZyB0byB0cnVlIHRvIHVzZSB0aGUgZm9yZWlnbiBrZXkgbmFtZSB0byBnZW5lcmF0ZSBmaWVsZHMKKyAgICAgKiByZXByZXNlbnRpbmcgcmVsYXRpb25zIGJldHdlZW4gY2xhc3Nlcy48L2xpPgorICAgICAqIDxsaT48aT4tbnVsbGFibGVBc09iamVjdC8tbm8gJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogU2V0IHRvIHRydWUKKyAgICAgKiB0byBtYWtlIGFsbCBudWxsYWJsZSBjb2x1bW5zIG1hcCB0byBvYmplY3QgdHlwZXM7IGNvbHVtbnMgdGhhdCB3b3VsZAorICAgICAqIG5vcm1hbGx5IG1hcCB0byBhIHByaW1pdGl2ZSB3aWxsIG1hcCB0byB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlcgorICAgICAqIHR5cGUgaW5zdGVhZC48L2xpPgorICAgICAqIDxsaT48aT4tYmxvYkFzT2JqZWN0Ly1ibyAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBTZXQgdG8gdHJ1ZQorICAgICAqIHRvIG1ha2UgYWxsIGJpbmFyeSBjb2x1bW5zIG1hcCB0byBPYmplY3QgcmF0aGVyIHRoYW4gYnl0ZVtdLjwvbGk+CisgICAgICogPGxpPjxpPi10eXBlTWFwLy10eXAgJmx0O3R5cGVzJmd0OzwvaT46IERlZmF1bHQgbWFwcGluZyBvZiBTUUwgdHlwZQorICAgICAqIG5hbWVzIHRvIEphdmEgY2xhc3Nlcy48L2xpPgorICAgICAqIDxsaT48aT4tcHJpbWFyeUtleU9uSm9pbi8tcGtqICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFNldCB0byB0cnVlCisgICAgICogdG8gYWxsb3cgcHJpbWFyeSBrZXlzIG9uIGpvaW4gdGFibGVzLjwvbGk+CisgICAgICogPGxpPjxpPi11c2VEYXRhc3RvcmVJZGVudGl0eS8tZHMgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogU2V0IHRvCisgICAgICogdHJ1ZSB0byB1c2UgZGF0YXN0b3JlIGlkZW50aXR5IHdoZXJlIHBvc3NpYmxlLjwvbGk+CisgICAgICogPGxpPjxpPi11c2VCdWlsdGluSWRlbnRpdHlDbGFzcy8tYmljICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFNldAorICAgICAqIHRvIGZhbHNlIHRvIG5ldmVyIHVzZSBPcGVuSlBBJ3MgYnVpbHRpbiBhcHBsaWNhdGlvbiBpZGVudGl0eQorICAgICAqIGNsYXNzZXMuPC9saT4KKyAgICAgKiA8bGk+PGk+LWlubmVySWRlbnRpdHlDbGFzc2VzLy1pbm4gJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogU2V0IHRvCisgICAgICogdHJ1ZSB0byBnZW5lcmF0ZSB0aGUgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3NlcyBhcyBpbm5lciBjbGFzc2VzLjwvbGk+CisgICAgICogPGxpPjxpPi1pZGVudGl0eUNsYXNzU3VmZml4Ly1pcyAmbHQ7c3VmZml4Jmd0OzwvaT46IFN1ZmZpeCB0byBhcHBlbmQKKyAgICAgKiB0byBjbGFzcyBuYW1lcyB0byBjcmVhdGUgaWRlbnRpdHkgY2xhc3MgbmFtZSwgb3IgZm9yIGlubmVyIGlkZW50aXR5CisgICAgICogY2xhc3NlcywgdGhlIGlubmVyIGNsYXNzIG5hbWUuPC9saT4KKyAgICAgKiA8bGk+PGk+LWludmVyc2VSZWxhdGlvbnMvLWlyICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFNldCB0bworICAgICAqIGZhbHNlIHRvIHByZXZlbnQgdGhlIGNyZWF0aW9uIG9mIGludmVyc2UgMS1tYW55LzEtMSByZWxhdGlvbnMgZm9yCisgICAgICogZWFjaCBlbmNvdW50ZXJlZCBtYW55LTEvMS0xIHJlbGF0aW9uLjwvbGk+CisgICAgICogPGxpPjxpPi1kZXRhY2hhYmxlLy1kZXQgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogU2V0IHRvCisgICAgICogdHJ1ZSB0byBtYWtlIGdlbmVyYXRlZCBjbGFzc2VzIGRldGFjaGFibGUuPC9saT4KKyAgICAgKiA8bGk+PGk+LWRpc2NyaW1pbmF0b3JTdHJhdGVneS8tZHMgJmx0O3N0cmF0ZWd5Jmd0OzwvaT46IFRoZSBkZWZhdWx0CisgICAgICogZGlzY3JpbWluYXRvciBzdHJhdGVneSB0byBwbGFjZSBvbiBiYXNlIGNsYXNzZXMuPC9saT4KKyAgICAgKiA8bGk+PGk+LXZlcnNpb25TdHJhdGVneS8tdnMgJmx0O3N0cmF0ZWd5Jmd0OzwvaT46IFRoZSBkZWZhdWx0CisgICAgICogdmVyc2lvbiBzdHJhdGVneSB0byBwbGFjZSBvbiBiYXNlIGNsYXNzZXMuPC9saT4KKyAgICAgKiA8bGk+PGk+LW1ldGFkYXRhLy1tZCAmbHQ7Y2xhc3MgfCBwYWNrYWdlJmd0OzwvaT46IFNwZWNpZnkgdGhlIGxldmVsIHRoZQorICAgICAqIG1ldGFkYXRhIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXQuIERlZmF1bHRzIHRvIGdlbmVyYXRpbmcgYQorICAgICAqIHNpbmdsZSBwYWNrYWdlLWxldmVsIG1ldGFkYXRhIGZpbGUuPC9saT4KKyAgICAgKiA8bGk+PGk+LWN1c3RvbWl6ZXJDbGFzcy8tY2MgJmx0O2NsYXNzIG5hbWUmZ3Q7PC9pPjogVGhlIGZ1bGwgY2xhc3MKKyAgICAgKiBuYW1lIG9mIGEge0BsaW5rIFJldmVyc2VDdXN0b21pemVyfSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgdG8KKyAgICAgKiBjdXN0b21pemUgdGhlIHJldmVyc2UgbWFwcGluZyBwcm9jZXNzLiBPcHRpb25hbC48L2xpPgorICAgICAqIDxsaT48aT4tY3VzdG9taXplclByb3BlcnRpZXMvLWNwICZsdDtwcm9wZXJ0aWVzIGZpbGUgb3IgcmVzb3VyY2UmZ3Q7PC9pPgorICAgICAqIDogVGhlIHBhdGggb3IgcmVzb3VyY2UgbmFtZSBvZiBhIHByb3BlcnRpZXMgZmlsZSB0aGF0IHdpbGwgYmUKKyAgICAgKiBwYXNzZWQgdG8gdGhlIHJldmVyc2UgY3VzdG9taXplciBvbiBpbml0aWFsaXphdGlvbi4gT3B0aW9uYWwuPC9saT4KKyAgICAgKiA8bGk+PGk+LWN1c3RvbWl6ZXIvLWMuJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDsgcHJvcGVydHkgdmFsdWUmZ3Q7PC9pPgorICAgICAqIDogQXJndW1lbnRzIGxpa2UgdGhpcyB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUge0BsaW5rIFJldmVyc2VDdXN0b21pemVyfS48L2xpPgorICAgICAqIDxsaT48aT4tY29kZUZvcm1hdC8tY2YuJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDsgcHJvcGVydHkgdmFsdWUmZ3Q7PC9pPgorICAgICAqIDogQXJndW1lbnRzIGxpa2UgdGhpcyB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgaW50ZXJuYWwge0BsaW5rIENvZGVGb3JtYXR9LjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiAgRWFjaCBzY2hlbWEgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgd2lsbCBiZSByZXZlcnNlLW1hcHBlZCBpbnRvCisgICAgICogcGVyc2lzdGVudCBjbGFzc2VzIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAorICAgICAqIHRoZSBkYXRhYmFzZSBzY2hlbWFzIGRlZmluZWQgYnkgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIHdpbGwgYmUKKyAgICAgKiByZXZlcnNlLW1hcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9wdGlvbnMgb3B0cyA9IG5ldyBPcHRpb25zKCk7CisgICAgICAgIGFyZ3MgPSBvcHRzLnNldEZyb21DbWRMaW5lKGFyZ3MpOworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEpEQkNDb25maWd1cmF0aW9uSW1wbCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFydW4oY29uZiwgYXJncywgb3B0cykpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKF9sb2MuZ2V0KCJyZXZ0b29sLXVzYWdlIikpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29uZi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0b29sLiBSZXR1cm5zIGZhbHNlIGlmIGludmFsaWQgb3B0aW9ucyB3ZXJlIGdpdmVuLgorICAgICAqCisgICAgICogQHNlZSAjbWFpbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgT3B0aW9ucyBvcHRzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcHRzLmNvbnRhaW5zS2V5KCJoZWxwIikgfHwgb3B0cy5jb250YWluc0tleSgiLWhlbHAiKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBmbGFncworICAgICAgICBGbGFncyBmbGFncyA9IG5ldyBGbGFncygpOworICAgICAgICBmbGFncy5wYWNrYWdlTmFtZSA9IG9wdHMucmVtb3ZlUHJvcGVydHkKKyAgICAgICAgICAgICgicGFja2FnZSIsICJwa2ciLCBmbGFncy5wYWNrYWdlTmFtZSk7CisgICAgICAgIGZsYWdzLmRpcmVjdG9yeSA9IEZpbGVzLmdldEZpbGUKKyAgICAgICAgICAgIChvcHRzLnJlbW92ZVByb3BlcnR5KCJkaXJlY3RvcnkiLCAiZCIsIG51bGwpLCBudWxsKTsKKyAgICAgICAgZmxhZ3MudXNlU2NoZW1hTmFtZSA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoInVzZVNjaGVtYU5hbWUiLCAic24iLCBmbGFncy51c2VTY2hlbWFOYW1lKTsKKyAgICAgICAgZmxhZ3MudXNlRm9yZWlnbktleU5hbWUgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJ1c2VGb3JlaWduS2V5TmFtZSIsICJma24iLCBmbGFncy51c2VGb3JlaWduS2V5TmFtZSk7CisgICAgICAgIGZsYWdzLm51bGxhYmxlQXNPYmplY3QgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJudWxsYWJsZUFzT2JqZWN0IiwgIm5vIiwgZmxhZ3MubnVsbGFibGVBc09iamVjdCk7CisgICAgICAgIGZsYWdzLmJsb2JBc09iamVjdCA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoImJsb2JBc09iamVjdCIsICJibyIsIGZsYWdzLmJsb2JBc09iamVjdCk7CisgICAgICAgIGZsYWdzLnByaW1hcnlLZXlPbkpvaW4gPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJwcmltYXJ5S2V5T25Kb2luIiwgInBraiIsIGZsYWdzLnByaW1hcnlLZXlPbkpvaW4pOworICAgICAgICBmbGFncy51c2VEYXRhU3RvcmVJZGVudGl0eSA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoInVzZURhdGFzdG9yZUlkZW50aXR5IiwgImRzIiwgZmxhZ3MudXNlRGF0YVN0b3JlSWRlbnRpdHkpOworICAgICAgICBmbGFncy51c2VCdWlsdGluSWRlbnRpdHlDbGFzcyA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoInVzZUJ1aWx0aW5JZGVudGl0eUNsYXNzIiwgImJpYyIsIGZsYWdzLnVzZUJ1aWx0aW5JZGVudGl0eUNsYXNzKTsKKyAgICAgICAgZmxhZ3MuaW5uZXJJZGVudGl0eUNsYXNzZXMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJpbm5lcklkZW50aXR5Q2xhc3NlcyIsICJpbm4iLCBmbGFncy5pbm5lcklkZW50aXR5Q2xhc3Nlcyk7CisgICAgICAgIGZsYWdzLmlkZW50aXR5Q2xhc3NTdWZmaXggPSBvcHRzLnJlbW92ZVByb3BlcnR5CisgICAgICAgICAgICAoImlkZW50aXR5Q2xhc3NTdWZmaXgiLCAiaXMiLCBmbGFncy5pZGVudGl0eUNsYXNzU3VmZml4KTsKKyAgICAgICAgZmxhZ3MuaW52ZXJzZVJlbGF0aW9ucyA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoImludmVyc2VSZWxhdGlvbnMiLCAiaXIiLCBmbGFncy5pbnZlcnNlUmVsYXRpb25zKTsKKyAgICAgICAgZmxhZ3MuZGV0YWNoYWJsZSA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoImRldGFjaGFibGUiLCAiZGV0IiwgZmxhZ3MuZGV0YWNoYWJsZSk7CisgICAgICAgIGZsYWdzLmRpc2NyaW1pbmF0b3JTdHJhdGVneSA9IG9wdHMucmVtb3ZlUHJvcGVydHkKKyAgICAgICAgICAgICgiZGlzY3JpbWluYXRvclN0cmF0ZWd5IiwgImRzIiwgZmxhZ3MuZGlzY3JpbWluYXRvclN0cmF0ZWd5KTsKKyAgICAgICAgZmxhZ3MudmVyc2lvblN0cmF0ZWd5ID0gb3B0cy5yZW1vdmVQcm9wZXJ0eQorICAgICAgICAgICAgKCJ2ZXJzaW9uU3RyYXRlZ3kiLCAidnMiLCBmbGFncy52ZXJzaW9uU3RyYXRlZ3kpOworICAgICAgICBmbGFncy5tZXRhRGF0YUxldmVsID0gb3B0cy5yZW1vdmVQcm9wZXJ0eQorICAgICAgICAgICAgKCJtZXRhZGF0YSIsICJtZCIsIGZsYWdzLm1ldGFEYXRhTGV2ZWwpOworCisgICAgICAgIFN0cmluZyB0eXBlTWFwID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgidHlwZU1hcCIsICJ0eXAiLCBudWxsKTsKKyAgICAgICAgaWYgKHR5cGVNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgIGZsYWdzLnR5cGVNYXAgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXModHlwZU1hcCk7CisKKyAgICAgICAgLy8gcmVtYXAgdGhlIC1zIHNob3J0Y3V0IHRvIHRoZSAic2NoZW1hcyIgcHJvcGVydHkgbmFtZSBzbyB0aGF0IGl0CisgICAgICAgIC8vIGdldHMgc2V0IGludG8gdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgaWYgKG9wdHMuY29udGFpbnNLZXkoInMiKSkKKyAgICAgICAgICAgIG9wdHMucHV0KCJzY2hlbWFzIiwgb3B0cy5nZXQoInMiKSk7CisKKyAgICAgICAgLy8gY3VzdG9taXplcgorICAgICAgICBTdHJpbmcgY3VzdG9tQ2xzID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgiY3VzdG9taXplckNsYXNzIiwgImNjIiwKKyAgICAgICAgICAgIFByb3BlcnRpZXNSZXZlcnNlQ3VzdG9taXplci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBGaWxlIGN1c3RvbUZpbGUgPSBGaWxlcy5nZXRGaWxlCisgICAgICAgICAgICAob3B0cy5yZW1vdmVQcm9wZXJ0eSgiY3VzdG9taXplclByb3BlcnRpZXMiLCAiY3AiLCBudWxsKSwgbnVsbCk7CisgICAgICAgIFByb3BlcnRpZXMgY3VzdG9tUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBpZiAoY3VzdG9tRmlsZSAhPSBudWxsICYmIGN1c3RvbUZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICBjdXN0b21Qcm9wcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oY3VzdG9tRmlsZSkpOworCisgICAgICAgIC8vIHNlcGFyYXRlIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgY3VzdG9taXplciBhbmQgY29kZSBmb3JtYXQKKyAgICAgICAgT3B0aW9ucyBjdXN0b21PcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgT3B0aW9ucyBmb3JtYXRPcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBTdHJpbmcga2V5OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9wdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoImN1c3RvbWl6ZXIuIikpIHsKKyAgICAgICAgICAgICAgICBjdXN0b21PcHRzLnB1dChrZXkuc3Vic3RyaW5nKDExKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aCgiYy4iKSkgeworICAgICAgICAgICAgICAgIGN1c3RvbU9wdHMucHV0KGtleS5zdWJzdHJpbmcoMiksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoImNvZGVGb3JtYXQuIikpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRPcHRzLnB1dChrZXkuc3Vic3RyaW5nKDExKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aCgiY2YuIikpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRPcHRzLnB1dChrZXkuc3Vic3RyaW5nKDMpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjb2RlIGZvcm1hdAorICAgICAgICBpZiAoIWZvcm1hdE9wdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmbGFncy5mb3JtYXQgPSBuZXcgQ29kZUZvcm1hdCgpOworICAgICAgICAgICAgZm9ybWF0T3B0cy5zZXRJbnRvKGZsYWdzLmZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXR1cCBhIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2Ugd2l0aCBjbWQtbGluZSBpbmZvCisgICAgICAgIENvbmZpZ3VyYXRpb25zLnBvcHVsYXRlQ29uZmlndXJhdGlvbihjb25mLCBvcHRzKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY29uZi5nZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS4KKyAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKFJldmVyc2VNYXBwaW5nVG9vbC5jbGFzcywgbnVsbCk7CisKKyAgICAgICAgLy8gY3VzdG9taXplcgorICAgICAgICBmbGFncy5jdXN0b21pemVyID0gKFJldmVyc2VDdXN0b21pemVyKSBDb25maWd1cmF0aW9ucy4KKyAgICAgICAgICAgIG5ld0luc3RhbmNlKGN1c3RvbUNscywgbG9hZGVyKTsKKyAgICAgICAgaWYgKGZsYWdzLmN1c3RvbWl6ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2UoZmxhZ3MuY3VzdG9taXplciwgY29uZiwKKyAgICAgICAgICAgICAgICBjdXN0b21PcHRzKTsKKyAgICAgICAgICAgIGZsYWdzLmN1c3RvbWl6ZXIuc2V0Q29uZmlndXJhdGlvbihjdXN0b21Qcm9wcyk7CisgICAgICAgIH0KKworICAgICAgICBydW4oY29uZiwgYXJncywgZmxhZ3MsIGxvYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIEZsYWdzIGZsYWdzLCBDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcGFyc2UgdGhlIHNjaGVtYSB0byByZXZlcnNlLW1hcAorICAgICAgICBMb2cgbG9nID0gY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1RPT0wpOworICAgICAgICBTY2hlbWFHcm91cCBzY2hlbWE7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgicmV2dG9vbC1ydW5uaW5nIikpOworICAgICAgICAgICAgU2NoZW1hR2VuZXJhdG9yIGdlbiA9IG5ldyBTY2hlbWFHZW5lcmF0b3IoY29uZik7CisgICAgICAgICAgICBnZW4uZ2VuZXJhdGVTY2hlbWFzKCk7CisgICAgICAgICAgICBzY2hlbWEgPSBnZW4uZ2V0U2NoZW1hR3JvdXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnNlciBwYXJzZXIgPSBuZXcgWE1MU2NoZW1hUGFyc2VyKGNvbmYpOworICAgICAgICAgICAgRmlsZSBmaWxlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmlsZSA9IEZpbGVzLmdldEZpbGUoYXJnc1tpXSwgbG9hZGVyKTsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgicmV2dG9vbC1ydW5uaW5nLWZpbGUiLCBmaWxlKSk7CisgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NoZW1hID0gcGFyc2VyLmdldFNjaGVtYUdyb3VwKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmbGFncworICAgICAgICBSZXZlcnNlTWFwcGluZ1Rvb2wgdG9vbCA9IG5ldyBSZXZlcnNlTWFwcGluZ1Rvb2woY29uZik7CisgICAgICAgIHRvb2wuc2V0U2NoZW1hR3JvdXAoc2NoZW1hKTsKKyAgICAgICAgdG9vbC5zZXRQYWNrYWdlTmFtZShmbGFncy5wYWNrYWdlTmFtZSk7CisgICAgICAgIHRvb2wuc2V0RGlyZWN0b3J5KGZsYWdzLmRpcmVjdG9yeSk7CisgICAgICAgIHRvb2wuc2V0VXNlU2NoZW1hTmFtZShmbGFncy51c2VTY2hlbWFOYW1lKTsKKyAgICAgICAgdG9vbC5zZXRVc2VGb3JlaWduS2V5TmFtZShmbGFncy51c2VGb3JlaWduS2V5TmFtZSk7CisgICAgICAgIHRvb2wuc2V0TnVsbGFibGVBc09iamVjdChmbGFncy5udWxsYWJsZUFzT2JqZWN0KTsKKyAgICAgICAgdG9vbC5zZXRCbG9iQXNPYmplY3QoZmxhZ3MuYmxvYkFzT2JqZWN0KTsKKyAgICAgICAgdG9vbC5zZXRUeXBlTWFwKGZsYWdzLnR5cGVNYXApOworICAgICAgICB0b29sLnNldFByaW1hcnlLZXlPbkpvaW4oZmxhZ3MucHJpbWFyeUtleU9uSm9pbik7CisgICAgICAgIHRvb2wuc2V0VXNlRGF0YVN0b3JlSWRlbnRpdHkoZmxhZ3MudXNlRGF0YVN0b3JlSWRlbnRpdHkpOworICAgICAgICB0b29sLnNldFVzZUJ1aWx0aW5JZGVudGl0eUNsYXNzKGZsYWdzLnVzZUJ1aWx0aW5JZGVudGl0eUNsYXNzKTsKKyAgICAgICAgdG9vbC5zZXRJbm5lcklkZW50aXR5Q2xhc3NlcyhmbGFncy5pbm5lcklkZW50aXR5Q2xhc3Nlcyk7CisgICAgICAgIHRvb2wuc2V0SWRlbnRpdHlDbGFzc1N1ZmZpeChmbGFncy5pZGVudGl0eUNsYXNzU3VmZml4KTsKKyAgICAgICAgdG9vbC5zZXRJbnZlcnNlUmVsYXRpb25zKGZsYWdzLmludmVyc2VSZWxhdGlvbnMpOworICAgICAgICB0b29sLnNldERldGFjaGFibGUoZmxhZ3MuZGV0YWNoYWJsZSk7CisgICAgICAgIHRvb2wuc2V0Q3VzdG9taXplcihmbGFncy5jdXN0b21pemVyKTsKKyAgICAgICAgdG9vbC5zZXRDb2RlRm9ybWF0KGZsYWdzLmZvcm1hdCk7CisKKyAgICAgICAgLy8gcnVuCisgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJyZXZ0b29sLW1hcCIpKTsKKyAgICAgICAgdG9vbC5ydW4oKTsKKyAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInJldnRvb2wtd3JpdGUtY29kZSIpKTsKKyAgICAgICAgdG9vbC5yZWNvcmRDb2RlKCk7CisgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJyZXZ0b29sLXdyaXRlLW1ldGFkYXRhIikpOworICAgICAgICB0b29sLnJlY29yZE1ldGFEYXRhKExFVkVMX0NMQVNTLmVxdWFscyhmbGFncy5tZXRhRGF0YUxldmVsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSG9sZGVyIGZvciBydW4gZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbGFncyB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBGaWxlIGRpcmVjdG9yeSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNjaGVtYU5hbWUgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlRm9yZWlnbktleU5hbWUgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbnVsbGFibGVBc09iamVjdCA9IGZhbHNlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBibG9iQXNPYmplY3QgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIFByb3BlcnRpZXMgdHlwZU1hcCA9IG51bGw7CisgICAgICAgIHB1YmxpYyBib29sZWFuIHByaW1hcnlLZXlPbkpvaW4gPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlRGF0YVN0b3JlSWRlbnRpdHkgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlQnVpbHRpbklkZW50aXR5Q2xhc3MgPSB0cnVlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbm5lcklkZW50aXR5Q2xhc3NlcyA9IGZhbHNlOworICAgICAgICBwdWJsaWMgU3RyaW5nIGlkZW50aXR5Q2xhc3NTdWZmaXggPSAiSWQiOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnZlcnNlUmVsYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGV0YWNoYWJsZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgU3RyaW5nIG1ldGFEYXRhTGV2ZWwgPSBMRVZFTF9QQUNLQUdFOworICAgICAgICBwdWJsaWMgU3RyaW5nIGRpc2NyaW1pbmF0b3JTdHJhdGVneSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmVyc2lvblN0cmF0ZWd5ID0gbnVsbDsKKyAgICAgICAgcHVibGljIFJldmVyc2VDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBudWxsOworICAgICAgICBwdWJsaWMgQ29kZUZvcm1hdCBmb3JtYXQgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaW5zdGFsbCBkaXNjcmltaW5hdG9yIGFuZCB2ZXJzaW9uIHN0cmF0ZWdpZXMgb24KKyAgICAgKiByZXZlcnNlLW1hcHBlZCBjbGFzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmV2ZXJzZVN0cmF0ZWd5SW5zdGFsbGVyCisgICAgICAgIGV4dGVuZHMgU3RyYXRlZ3lJbnN0YWxsZXIgeworCisgICAgICAgIHB1YmxpYyBSZXZlcnNlU3RyYXRlZ3lJbnN0YWxsZXIoTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlcG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluc3RhbGxTdHJhdGVneShDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluc3RhbGxTdHJhdGVneShGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5zdGFsbFN0cmF0ZWd5KFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IHZlcnNpb24uZ2V0Q2xhc3NNYXBwaW5nKCk7CisgICAgICAgICAgICBpZiAoY2xzLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdmVyc2lvbi5zZXRTdHJhdGVneShuZXcgU3VwZXJjbGFzc1ZlcnNpb25TdHJhdGVneSgpLCBudWxsKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF92ZXJzU3RyYXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFZlcnNpb25TdHJhdGVneSBzdHJhdCA9IHJlcG9zLmluc3RhbnRpYXRlVmVyc2lvblN0cmF0ZWd5CisgICAgICAgICAgICAgICAgICAgIChfdmVyc1N0cmF0LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uLnNldFN0cmF0ZWd5KHN0cmF0LCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHZlcnNpb24uc2V0U3RyYXRlZ3kobmV3IFN0YXRlQ29tcGFyaXNvblZlcnNpb25TdHJhdGVneSgpLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluc3RhbGxTdHJhdGVneShEaXNjcmltaW5hdG9yIGRpc2NyaW0pIHsKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBkaXNjcmltLmdldENsYXNzTWFwcGluZygpOworICAgICAgICAgICAgaWYgKGNscy5nZXRQQ1N1cGVyY2xhc3MoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGlzY3JpbS5zZXRTdHJhdGVneShuZXcgU3VwZXJjbGFzc0Rpc2NyaW1pbmF0b3JTdHJhdGVneSgpLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1N1YmNsYXNzZXMoY2xzKSkgeworICAgICAgICAgICAgICAgIGRpc2NyaW0uc2V0U3RyYXRlZ3koTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneS5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX2Rpc2NTdHJhdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRGlzY3JpbWluYXRvclN0cmF0ZWd5IHN0cmF0ID0gcmVwb3MuCisgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGlzY3JpbWluYXRvclN0cmF0ZWd5KF9kaXNjU3RyYXQsIGRpc2NyaW0pOworICAgICAgICAgICAgICAgIGRpc2NyaW0uc2V0U3RyYXRlZ3koc3RyYXQsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZGlzY3JpbS5zZXRTdHJhdGVneShuZXcgU3ViY2xhc3NKb2luRGlzY3JpbWluYXRvclN0cmF0ZWd5KCksCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBjbGFzcyBoYXMgYW55IG1hcHBlZCBwZXJzaXN0ZW50IHN1YmNsYXNzZXMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzU3ViY2xhc3NlcyhDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhW10gbWV0YXMgPSByZXBvcy5nZXRNZXRhRGF0YXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKG1ldGFzW2ldLmdldFBDU3VwZXJjbGFzcygpID09IGNscy5nZXREZXNjcmliZWRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uIG9mIHRoZSB7QGxpbmsgQ29kZUdlbmVyYXRvcn0gdG8gYWxsb3cgdXNlcnMgdG8gY3VzdG9taXplCisgICAgICogdGhlIGZvcm1hdHRpbmcgb2YgdGhlaXIgZ2VuZXJhdGVkIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZXZlcnNlQ29kZUdlbmVyYXRvcgorICAgICAgICBleHRlbmRzIENvZGVHZW5lcmF0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3NNYXBwaW5nIF9tYXBwaW5nOworICAgICAgICBwcml2YXRlIGZpbmFsIEFwcGxpY2F0aW9uSWRUb29sIF9hcHBpZDsKKworICAgICAgICBwdWJsaWMgUmV2ZXJzZUNvZGVHZW5lcmF0b3IoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICBBcHBsaWNhdGlvbklkVG9vbCBhaWQpIHsKKyAgICAgICAgICAgIHN1cGVyKG1hcHBpbmcpOworICAgICAgICAgICAgc3VwZXIuc2V0RGlyZWN0b3J5KF9kaXIpOworICAgICAgICAgICAgc3VwZXIuc2V0Q29kZUZvcm1hdChfZm9ybWF0KTsKKworICAgICAgICAgICAgX21hcHBpbmcgPSBtYXBwaW5nOworICAgICAgICAgICAgaWYgKGFpZCAhPSBudWxsICYmIGFpZC5pc0lubmVyQ2xhc3MoKSkKKyAgICAgICAgICAgICAgICBfYXBwaWQgPSBhaWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2FwcGlkID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB0aGVyZSBpcyBhbiBpbm5lciBhcHBsaWNhdGlvbiBpZGVudGl0eSBjbGFzcywgdGhlbgorICAgICAgICAgKiBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgY2xhc3MgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlQ2xhc3NCcmFjZShDb2RlRm9ybWF0IGNvZGUpIHsKKyAgICAgICAgICAgIGlmIChfYXBwaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoX2FwcGlkLmdldENvZGUoKSk7CisgICAgICAgICAgICAgICAgY29kZS5lbmRsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlQ2xhc3NCcmFjZShjb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgdGhlIGxpc3Qgb2YgaW1wb3J0cyBmb3IgYW55IGlubmVyIGFwcCBpZCBjbGFzc2VzCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTZXQgZ2V0SW1wb3J0UGFja2FnZXMoKSB7CisgICAgICAgICAgICBTZXQgcGtncyA9IHN1cGVyLmdldEltcG9ydFBhY2thZ2VzKCk7CisgICAgICAgICAgICBpZiAoX2FwcGlkICE9IG51bGwpCisgICAgICAgICAgICAgICAgcGtncy5hZGRBbGwoX2FwcGlkLmdldEltcG9ydFBhY2thZ2VzKCkpOworICAgICAgICAgICAgcmV0dXJuIHBrZ3M7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoX2N1c3RvbSA9PSBudWxsKSA/IG51bGwgOiBfY3VzdG9tLmdldENsYXNzQ29kZShfbWFwcGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxWYWx1ZShGaWVsZE1ldGFEYXRhIGZpZWxkKSB7CisgICAgICAgICAgICBpZiAoX2N1c3RvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIF9jdXN0b20uZ2V0SW5pdGlhbFZhbHVlKChGaWVsZE1hcHBpbmcpIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oRmllbGRNZXRhRGF0YSBmaWVsZCkgeworICAgICAgICAgICAgaWYgKF9jdXN0b20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBfY3VzdG9tLmdldERlY2xhcmF0aW9uKChGaWVsZE1hcHBpbmcpIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRDb2RlKEZpZWxkTWV0YURhdGEgZmllbGQpIHsKKyAgICAgICAgICAgIGlmIChfY3VzdG9tID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gX2N1c3RvbS5nZXRGaWVsZENvZGUoKEZpZWxkTWFwcGluZykgZmllbGQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1J1bnRpbWVTdHJhdGVneUluc3RhbGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1J1bnRpbWVTdHJhdGVneUluc3RhbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNWVkODYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUnVudGltZVN0cmF0ZWd5SW5zdGFsbGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5Ob25lRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIEluc3RhbGxlciB0aGF0IGF0dGVtcHRzIHRvIHVzZSB0aGUgZ2l2ZW4gbWFwcGluZyBpbmZvcm1hdGlvbiwgYW5kCisgKiBmYWlscyBpZiBpdCBkb2VzIG5vdCB3b3JrLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVTdHJhdGVneUluc3RhbGxlcgorICAgIGV4dGVuZHMgU3RyYXRlZ3lJbnN0YWxsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUnVudGltZVN0cmF0ZWd5SW5zdGFsbGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZVN0cmF0ZWd5SW5zdGFsbGVyKE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zKSB7CisgICAgICAgIHN1cGVyKHJlcG9zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICBpZiAoKGNscy5nZXRTb3VyY2VNb2RlKCkgJiBjbHMuTU9ERV9NQVBQSU5HKSA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1tYXBwaW5nIiwgY2xzKSk7CisKKyAgICAgICAgQ2xhc3NTdHJhdGVneSBzdHJhdCA9IHJlcG9zLm5hbWVkU3RyYXRlZ3koY2xzKTsKKyAgICAgICAgaWYgKHN0cmF0ID09IG51bGwpCisgICAgICAgICAgICBzdHJhdCA9IHJlcG9zLmRlZmF1bHRTdHJhdGVneShjbHMsIGZhbHNlKTsKKyAgICAgICAgY2xzLnNldFN0cmF0ZWd5KHN0cmF0LCBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIEZpZWxkU3RyYXRlZ3kgc3RyYXRlZ3kgPSByZXBvcy5uYW1lZFN0cmF0ZWd5KGZpZWxkLCB0cnVlKTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPSByZXBvcy5kZWZhdWx0U3RyYXRlZ3koZmllbGQsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIG1kZSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgY2xhc3MgaXMgYWJzdHJhY3QgYW5kIGZpZWxkIGlzIHVubWFwcGVkLAorICAgICAgICAgICAgICAgIC8vIGFsbG93IGl0IHRvIHBhc3MgKGFzc3VtZSBzdWJjbGFzc2VzIG1hcCB0aGUgZmllbGQpCisgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gZmllbGQuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QoY2xzLmdldE1vZGlmaWVycygpKQorICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgZmllbGQuZ2V0TWFwcGluZ0luZm8oKS5oYXNTY2hlbWFDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZmllbGQuZ2V0VmFsdWVJbmZvKCkuaGFzU2NoZW1hQ29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuCisgICAgICAgICAgICAgICAgICAgIGhhc1NjaGVtYUNvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZC5nZXRLZXlNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuCisgICAgICAgICAgICAgICAgICAgIGhhc1NjaGVtYUNvbXBvbmVudHMoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbWRlOworCisgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPSBOb25lRmllbGRTdHJhdGVneS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpZWxkLnNldFN0cmF0ZWd5KHN0cmF0ZWd5LCBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIFZlcnNpb25TdHJhdGVneSBzdHJhdCA9IHJlcG9zLm5hbWVkU3RyYXRlZ3kodmVyc2lvbik7CisgICAgICAgIGlmIChzdHJhdCA9PSBudWxsKQorICAgICAgICAgICAgc3RyYXQgPSByZXBvcy5kZWZhdWx0U3RyYXRlZ3kodmVyc2lvbiwgZmFsc2UpOworICAgICAgICB2ZXJzaW9uLnNldFN0cmF0ZWd5KHN0cmF0LCBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsU3RyYXRlZ3koRGlzY3JpbWluYXRvciBkaXNjcmltKSB7CisgICAgICAgIERpc2NyaW1pbmF0b3JTdHJhdGVneSBzdHJhdCA9IHJlcG9zLm5hbWVkU3RyYXRlZ3koZGlzY3JpbSk7CisgICAgICAgIGlmIChzdHJhdCA9PSBudWxsKQorICAgICAgICAgICAgc3RyYXQgPSByZXBvcy5kZWZhdWx0U3RyYXRlZ3koZGlzY3JpbSwgZmFsc2UpOworICAgICAgICBkaXNjcmltLnNldFN0cmF0ZWd5KHN0cmF0LCBCb29sZWFuLkZBTFNFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvU2VxdWVuY2VNYXBwaW5nLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvU2VxdWVuY2VNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMmMzZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9TZXF1ZW5jZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDU2VxVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkNsYXNzVGFibGVKREJDU2VxOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5UYWJsZUpEQkNTZXE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLlZhbHVlVGFibGVKREJDU2VxOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5QbHVnaW5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIG9mIHNlcXVlbmNlIG1ldGFkYXRhIGZvciBPUk0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbmNlTWFwcGluZworICAgIGV4dGVuZHMgU2VxdWVuY2VNZXRhRGF0YSB7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgVmFsdWVUYWJsZUpEQkNTZXF9IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExfVkFMVUVfVEFCTEUgPSAidmFsdWUtdGFibGUiOworCisgICAgLyoqCisgICAgICoge0BsaW5rIFRhYmxlSkRCQ1NlcX0gYWxpYXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTF9UQUJMRSA9ICJ0YWJsZSI7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgQ2xhc3NUYWJsZUpEQkNTZXF9IGFsaWFzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExfQ0xBU1NfVEFCTEUgPSAiY2xhc3MtdGFibGUiOworCisgICAgLy8gcGx1Z2luIHByb3BlcnR5IG5hbWVzIGZvciBzdGFuZGFyZCBwcm9wcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RBQkxFID0gIlRhYmxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TRVFVRU5DRV9DT0wgPSAiU2VxdWVuY2VDb2x1bW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BLX0NPTCA9ICJQcmltYXJ5S2V5Q29sdW1uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QS19WQUxVRSA9ICJQcmltYXJ5S2V5VmFsdWUiOworCisgICAgcHJpdmF0ZSBGaWxlIF9tYXBGaWxlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfdGFibGUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9zZXF1ZW5jZUNvbHVtbiA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3ByaW1hcnlLZXlDb2x1bW4gPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9wcmltYXJ5S2V5VmFsdWUgPSBudWxsOworCisgICAgcHVibGljIFNlcXVlbmNlTWFwcGluZyhTdHJpbmcgbmFtZSwgTWFwcGluZ1JlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVwb3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHNlcXVlbmNlIHRvIGhhdmUgYSBtYXBwaW5nIGZpbGUgc2VwYXJhdGUgZnJvbSBpdHMgbWV0YWRhdGEKKyAgICAgKiBzb3VyY2UgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRNYXBwaW5nRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9tYXBGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHNlcXVlbmNlIHRvIGhhdmUgYSBtYXBwaW5nIGZpbGUgc2VwYXJhdGUgZnJvbSBpdHMgbWV0YWRhdGEKKyAgICAgKiBzb3VyY2UgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgX21hcEZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2Ygc2VxdWVuY2UgdGFibGUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2Ygc2VxdWVuY2UgdGFibGUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKKyAgICAgICAgX3RhYmxlID0gdGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiBzZXF1ZW5jZSBjb2x1bW4sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlQ29sdW1uKCkgeworICAgICAgICByZXR1cm4gX3NlcXVlbmNlQ29sdW1uOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2Ygc2VxdWVuY2UgY29sdW1uLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VxdWVuY2VDb2x1bW4oU3RyaW5nIHNlcXVlbmNlQ29sdW1uKSB7CisgICAgICAgIF9zZXF1ZW5jZUNvbHVtbiA9IHNlcXVlbmNlQ29sdW1uOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgcHJpbWFyeSBrZXkgY29sdW1uLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uKCkgeworICAgICAgICByZXR1cm4gX3ByaW1hcnlLZXlDb2x1bW47CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiBwcmltYXJ5IGtleSBjb2x1bW4sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5Q29sdW1uKFN0cmluZyBwcmltYXJ5S2V5Q29sdW1uKSB7CisgICAgICAgIF9wcmltYXJ5S2V5Q29sdW1uID0gcHJpbWFyeUtleUNvbHVtbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmltYXJ5IGtleSB2YWx1ZSwgaWYgbm90IGF1dG8tZGV0ZXJtaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wcmltYXJ5S2V5VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbWFyeSBrZXkgdmFsdWUsIGlmIG5vdCBhdXRvLWRldGVybWluZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleVZhbHVlKFN0cmluZyBwcmltYXJ5S2V5VmFsdWUpIHsKKyAgICAgICAgX3ByaW1hcnlLZXlWYWx1ZSA9IHByaW1hcnlLZXlWYWx1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGx1Z2luVmFsdWUgbmV3UGx1Z2luVmFsdWUoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBuZXcgSkRCQ1NlcVZhbHVlKHByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGFuZGFyZFByb3BlcnRpZXMoU3RyaW5nQnVmZmVyIHByb3BzKSB7CisgICAgICAgIHN1cGVyLmFkZFN0YW5kYXJkUHJvcGVydGllcyhwcm9wcyk7CisgICAgICAgIGFwcGVuZFByb3BlcnR5KHByb3BzLCBQUk9QX1RBQkxFLCBfdGFibGUpOworICAgICAgICBhcHBlbmRQcm9wZXJ0eShwcm9wcywgUFJPUF9TRVFVRU5DRV9DT0wsIF9zZXF1ZW5jZUNvbHVtbik7CisgICAgICAgIGFwcGVuZFByb3BlcnR5KHByb3BzLCBQUk9QX1BLX0NPTCwgX3ByaW1hcnlLZXlDb2x1bW4pOworICAgICAgICBhcHBlbmRQcm9wZXJ0eShwcm9wcywgUFJPUF9QS19WQUxVRSwgX3ByaW1hcnlLZXlWYWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1N0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE2OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgbWFwcGluZyBzdHJhdGVnaWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGludGVyZmFjZSBTdHJhdGVneSAKKyAgICBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIG9mIHRoaXMgc3RyYXRlZ3kuIEZvciBjdXN0b20gc3RyYXRlZ2llcywgcmV0dXJuIHRoZQorICAgICAqIGZ1bGwgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgdGhlIG93bmluZyBtYXBwaW5nIHVzaW5nIHRoaXMgc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHQgaWYgdHJ1ZSwgdXNlIHRoZSBvd25pbmcgbWFwcGluZydzIHJhdyBtYXBwaW5nIGluZm8KKyAgICAgKiB0byBzZXQgaXRzIE9STSBkYXRhOyBpZiBmYWxzZSwgT1JNIGRhdGEgd2lsbCBhbHJlYWR5IGJlIHNldAorICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgdW5hYmxlIHRvIG1hcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KTsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gY2FjaGluZyBhbmQgb3RoZXIgaW5pdGlhbGl6YXRpb24gb3BlcmF0aW9ucy4gVGhpcyBtZXRob2QgaXMKKyAgICAgKiBjYWxsZWQgYWZ0ZXIge0BsaW5rICNtYXB9LCBhbmQgYWZ0ZXIgYWxsIHJlbGF0ZWQgY29tcG9uZW50cyBoYXZlIGJlZW4KKyAgICAgKiBtYXBwZWQgYXMgd2VsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdmFsdWVzIGZvciB0aGUgbWFwcGluZyBpbnRvIHRoZSBwcm9wZXIgcm93cy4gRm9yIGNsYXNzIG1hcHBpbmdzLAorICAgICAqIHRoaXMgbWV0aG9kCXdpbGwgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGhhcworICAgICAqIGJlZW4gY2FsbGVkIGZvciBhbGwgZmllbGRzIG9mIHRoaXMgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHZhbHVlcyBmb3IgdGhlIG1hcHBpbmcgaW50byB0aGUgcHJvcGVyIHJvd3MuCisgICAgICoKKyAgICAgKiBAc2VlICNpbnNlcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aGVyZSB2YWx1ZXMgYXBwcm9wcmlhdGVseSB0byBkZWxldGUgdGhlIHByb3BlciBpbnN0YW5jZSwKKyAgICAgKiBhbmQgc2V0IGFsbCByZWxhdGlvbnMgb24gbm9uLXNlY29uZGFyeSB0YWJsZXMgYXMgdXBkYXRlcy4gVGhpcyBhbGxvd3MKKyAgICAgKiBmb3JlaWduIGtleSBhbmFseXNpcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2luc2VydAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0BsaW5rIEJvb2xlYW4jRkFMU0V9IGlmIHRoaXMgbWFwcGluZyBkb2VzIG5vdCBjdXN0b21pemUgdGhlCisgICAgICogaW5zZXJ0IHByb2Nlc3MsIHtAbGluayBCb29sZWFuI1RSVUV9IGlmIGl0IGRvZXMsIG9yIG51bGwgaWYgaXQgZG9lcworICAgICAqIGN1c3RvbWl6ZSB0aGUgaW5zZXJ0LCBidXQgYWxzbyByZWxpZXMgb24gdGhlIHN0YW5kYXJkIGluc2VydCBtZXRob2QKKyAgICAgKiBiZWluZyBjYWxsZWQuIEltcGxlbWVudCB0aGUge0BsaW5rICNjdXN0b21JbnNlcnR9IG1ldGhvZAorICAgICAqIHRvIGltcGxlbWVudCB0aGUgY3VzdG9tIGluc2VydGlvbiBiZWhhdmlvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHtAbGluayBCb29sZWFuI0ZBTFNFfSBpZiB0aGlzIG1hcHBpbmcgZG9lcyBub3QgY3VzdG9taXplIHRoZQorICAgICAqIHVwZGF0ZSBwcm9jZXNzLCB7QGxpbmsgQm9vbGVhbiNUUlVFfSBpZiBpdCBkb2VzLCBvciBudWxsIGlmIGl0IGRvZXMKKyAgICAgKiBjdXN0b21pemUgdGhlIHVwZGF0ZSwgYnV0IGFsc28gcmVsaWVzIG9uIHRoZSBzdGFuZGFyZCB1cGRhdGUgbWV0aG9kCisgICAgICogYmVpbmcgY2FsbGVkLiBJbXBsZW1lbnQgdGhlIHtAbGluayAjY3VzdG9tVXBkYXRlfSBtZXRob2QKKyAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB1cGRhdGUgYmVoYXZpb3IuCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB7QGxpbmsgQm9vbGVhbiNGQUxTRX0gaWYgdGhpcyBtYXBwaW5nIGRvZXMgbm90IGN1c3RvbWl6ZSB0aGUKKyAgICAgKiBkZWxldGUgcHJvY2Vzcywge0BsaW5rIEJvb2xlYW4jVFJVRX0gaWYgaXQgZG9lcywgb3IgbnVsbCBpZiBpdCBkb2VzCisgICAgICogY3VzdG9taXplIHRoZSBkZWxldGUsIGJ1dCBhbHNvIHJlbGllcyBvbiB0aGUgc3RhbmRhcmQgZGVsZXRlIG1ldGhvZAorICAgICAqIGJlaW5nIGNhbGxlZC4gSW1wbGVtZW50IHRoZSB7QGxpbmsgI2N1c3RvbURlbGV0ZX0gbWV0aG9kCisgICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVsZXRpb24gYmVoYXZpb3IuCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21EZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKTsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBmbHVzaGluZyB0aGlzIG1hcHBpbmcuIEZvciBjbGFzc2VzLAorICAgICAqIHRoaXMgbWV0aG9kIG11c3QgYWxzbyBmbHVzaCBhbGwgZmllbGRzLiBGb3IgZmllbGRzLCB0aGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBhZnRlciB0aGUgb3duaW5nIG9iamVjdCBpcyBpbnNlcnRlZCwgc28gaWYgdGhpcyBmaWVsZCBpcyBpbgorICAgICAqIGEgcm93IHdpdGggb3RoZXIgZmllbGRzLCB0aGF0IHJvdyB3aWxsIGFscmVhZHkgZXhpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3VzdG9tSW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBmbHVzaGluZyB0aGlzIG1hcHBpbmcuIEZvciBjbGFzc2VzLAorICAgICAqIHRoaXMgbWV0aG9kIG11c3QgYWxzbyBmbHVzaCBhbGwgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGN1c3RvbVVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgZmx1c2hpbmcgdGhpcyBtYXBwaW5nLiBGb3IgY2xhc3NlcywKKyAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IGFsc28gZmx1c2ggYWxsIGZpZWxkcy4gRm9yIGZpZWxkcywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgb3duaW5nIG9iamVjdCBpcyBkZWxldGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGN1c3RvbURlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvU3RyYXRlZ3lJbnN0YWxsZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9TdHJhdGVneUluc3RhbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDQzYzUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvU3RyYXRlZ3lJbnN0YWxsZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBJbnN0YWxscyBtYXBwaW5nIHN0cmF0ZWdpZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RyYXRlZ3lJbnN0YWxsZXIgCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJhdGVneUluc3RhbGxlcihNYXBwaW5nUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICB0aGlzLnJlcG9zID0gcmVwb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBpbnN0YWxsZXIgYWRhcHRzIHRoZSBnaXZlbiBtYXBwaW5nIGRhdGEgYW5kCisgICAgICogc2NoZW1hLCB2cyByZXF1aXJpbmcgdGhhdCBhbGwgaW5mb3JtYXRpb24gYmUgc3VwcGxpZWQgY29ycmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRpbmcoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGEgc3RyYXRlZ3kgb24gdGhlIGdpdmVuIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5zdGFsbFN0cmF0ZWd5KENsYXNzTWFwcGluZyBjbHMpOworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIHN0cmF0ZWd5IG9uIHRoZSBnaXZlbiBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc3RhbGxTdHJhdGVneShGaWVsZE1hcHBpbmcgZm0pOworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIHN0cmF0ZWd5IG9uIHRoZSBnaXZlbiBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc3RhbGxTdHJhdGVneShWZXJzaW9uIHZlcnNpb24pOworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIHN0cmF0ZWd5IG9uIHRoZSBnaXZlbiBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc3RhbGxTdHJhdGVneShEaXNjcmltaW5hdG9yIGRpc2NyaW0pOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1ZhbHVlSGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1ZhbHVlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTNjNTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CisKKy8qKgorICogTWFwcyBhIHZhbHVlIHRvIGEgcmVsYXRpb25hbCBzY2hlbWEuIFZhbHVlIGhhbmRsZXIgYXJlIHN0YXRlbGVzcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsdWVIYW5kbGVyCisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogTWFwIHRoZSBnaXZlbiB2YWx1ZSBhbmQgcmV0dXJuIGFsbCBtYXBwZWQgY29sdW1ucywgb3Igc2ltcGx5IHJldHVybiBhbgorICAgICAqIGFycmF5IG9mIHVubWFwcGVkIGRlZmF1bHQgY29sdW1ucy4gVGhlIGNvbHVtbnMgc2hvdWxkIGhhdmUgYXQgbGVhc3QKKyAgICAgKiB0aGVpciA8Y29kZT5OYW1lPC9jb2RlPiBhbmQgPGNvZGU+SmF2YVR5cGU8L2NvZGU+IHByb3BlcnRpZXMgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdXNlIGFzIGEgYmFzZSB0byBmb3JtIGNvbHVtbiBuYW1lKHMpOyB0aGUgY29sdW1uIG5hbWVzCisgICAgICogb2YgdW5tYXBwZWQgY29sdW1ucyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0byBmaXQKKyAgICAgKiBkYXRhYmFzZSBsaW1pdGF0aW9ucworICAgICAqIEBwYXJhbSBpbyBJL08gaW5mb3JtYXRpb24gYWJvdXQgbWFwcGVkIGNvbHVtbnM7IHlvdSBkbyBub3QKKyAgICAgKiBoYXZlIHRvIHNldCB0aGlzIGluZm9ybWF0aW9uIGlmIHJldHVybmluZyB0ZW1wbGF0ZXMKKyAgICAgKiBAcGFyYW0gYWRhcHQgd2hldGhlciB0byBhZGFwdCB0aGUgbWFwcGluZyBvciBzY2hlbWEKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gbWFwKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIGFkYXB0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZXMgbWFuYWdlZCBieSB0aGlzIGhhbmRsZXIgY2FuIGJlIHVzZWQgaW4KKyAgICAgKiBzdGF0ZSBpbWFnZSB2ZXJzaW9uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbmFibGUoVmFsdWVNYXBwaW5nIHZtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgaGFuZGxlciBwb3RlbnRpYWxseSBtdXN0IGxvYWQgZXh0cmEgZGF0YSB0byBleHRyYWN0CisgICAgICogdGhlIG9iamVjdCB2YWx1ZSBmcm9tIGl0cyBkYXRhc3RvcmUgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb2JqZWN0VmFsdWVSZXF1aXJlc0xvYWQoVmFsdWVNYXBwaW5nIHZtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJndW1lbnQgdG8gcGFzcyB0byB0aGUgcmVzdWx0IHNldCB3aGVuIGxvYWRpbmcgZGF0YQorICAgICAqIHZpYSB7QGxpbmsgUmVzdWx0I2dldE9iamVjdH0sIG9yIG51bGwgaWYgbm9uZS4gSWYgdGhpcyB2YWx1ZQorICAgICAqIG9jY3VwaWVzIG11bHRpcGxlIGNvbHVtbnMsIHJldHVybiBhbiBhcnJheSB3aXRoIG9uZSBlbGVtZW50IHBlcgorICAgICAqIGNvbHVtbi4gWW91IG1heSByZXR1cm4gbnVsbCBpZiBhbGwgYXJyYXkgZWxlbWVudHMgd291bGQgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3VsdEFyZ3VtZW50KFZhbHVlTWFwcGluZyB2bSk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIGdpdmVuIHZhbHVlIHRvIGl0cyBkYXRhc3RvcmUgZXF1aXZhbGVudC4gSWYgdGhpcyB2YWx1ZQorICAgICAqIG9jY3VwaWVzIG11bHRpcGxlIGNvbHVtbnMsIHJldHVybiBhbiBvYmplY3QgYXJyYXkgd2l0aCBvbmUgZWxlbWVudAorICAgICAqIHBlciBjb2x1bW4uIEZvciByZWxhdGlvbiBpZCBjb2x1bW5zLCByZXR1cm4gdGhlIHN0YXRlIG1hbmFnZXIKKyAgICAgKiB0aGUgY29sdW1uIGRlcGVuZHMgb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKFZhbHVlTWFwcGluZyB2bSwgT2JqZWN0IHZhbCwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgZ2l2ZW4gZGF0YXN0b3JlIHZhbHVlIGludG8gaXRzIEphdmEgZXF1aXZhbGVudC4gSWYKKyAgICAgKiB0aGUgdmFsdWUgb2NjdXBpZXMgbXVsdGlwbGUgY29sdW1ucywgdGhlIGdpdmVuIG9iamVjdCB3aWxsIGJlIGFuIG9iamVjdAorICAgICAqIGFycmF5IHdpdGggb25lIGVudHJ5IHBlciBjb2x1bW4uIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGlmCisgICAgICoge0BsaW5rICNvYmplY3RWYWx1ZVJlcXVpcmVzTG9hZH0gcmV0dXJucyBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHRvT2JqZWN0VmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgZ2l2ZW4gZGF0YXN0b3JlIHZhbHVlIGludG8gaXRzIEphdmEgZXF1aXZhbGVudC4gSWYKKyAgICAgKiB0aGUgdmFsdWUgb2NjdXBpZXMgbXVsdGlwbGUgY29sdW1ucywgdGhlIGdpdmVuIG9iamVjdCB3aWxsIGJlIGFuIG9iamVjdAorICAgICAqIGFycmF5IHdpdGggb25lIGVudHJ5IHBlciBjb2x1bW4uIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGlmCisgICAgICoge0BsaW5rICNvYmplY3RWYWx1ZVJlcXVpcmVzTG9hZH0gcmV0dXJucyB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIHNtIHRoZSBzdGF0ZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdmFsdWU7IG1heSBiZSBudWxsIGlmCisgICAgICogbG9hZGluZyBhIHByb2plY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHRvT2JqZWN0VmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLAorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmFsdWVNYXBwaW5nLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmFsdWVNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzMzBjZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WYWx1ZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gb2YgdmFsdWUgbWV0YWRhdGEgZm9yIHJlbGF0aW9uYWwgZGF0YWJhc2VzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGludGVyZmFjZSBWYWx1ZU1hcHBpbmcKKyAgICBleHRlbmRzIFZhbHVlTWV0YURhdGEsIE1ldGFEYXRhQ29udGV4dCwgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIGZvcndhcmQgam9pbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKT0lOX0ZPUldBUkQgPSAwOworCisgICAgLyoqCisgICAgICogSW52ZXJzZSBqb2luLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpPSU5fSU5WRVJTRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBJbnZlcnNlIGpvaW4gdGhhdCBpcyBtYXJrZWQgdXAgYXMgYSBmb3J3YXJkIGpvaW4gYmVjYXVzZSB0aGUKKyAgICAgKiBiYWNraW5nIG1hcHBpbmcgZXhwZWN0cyBhbiBpbnZlcnNlIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKT0lOX0VYUEVDVEVEX0lOVkVSU0UgPSAyOworCisgICAgLyoqCisgICAgICogQSBmdWxseSBwb2x5bW9ycGhpYyByZWxhdGlvbiAodGhlIGRlZmF1bHQpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPTFlfVFJVRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBIG5vbi1wb2x5bW9ycGhpYyByZWxhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xZX0ZBTFNFID0gMTsKKworICAgIC8qKgorICAgICAqIEEgcmVsYXRpb24gdGhhdCBjYW4gaG9sZCBhbnkgam9pbmFibGUgc3ViY2xhc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xZX0pPSU5BQkxFID0gMjsKKworICAgIC8qKgorICAgICAqIFJhdyBtYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHVibGljIFZhbHVlTWFwcGluZ0luZm8gZ2V0VmFsdWVJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGFuZGxlciB1c2VkIGZvciB0aGlzIHZhbHVlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlSGFuZGxlciBnZXRIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGFuZGxlciB1c2VkIGZvciB0aGlzIHZhbHVlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihWYWx1ZUhhbmRsZXIgaGFuZGxlcik7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgVmFsdWVNZXRhRGF0YSNnZXRSZXBvc2l0b3J5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGluZ1JlcG9zaXRvcnkgZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKTsKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBWYWx1ZU1ldGFEYXRhI2dldEZpZWxkTWV0YURhdGF9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgVmFsdWVNZXRhRGF0YSNnZXRUeXBlTWV0YURhdGF9LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBWYWx1ZU1ldGFEYXRhI2dldERlY2xhcmVkVHlwZU1ldGFEYXRhfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldERlY2xhcmVkVHlwZU1hcHBpbmcoKTsKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwZXJmb3JtIGNhc3QgZnJvbQorICAgICAqIHtAbGluayBWYWx1ZU1ldGFEYXRhI2dldEVtYmVkZGVkTWV0YURhdGF9LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0RW1iZWRkZWRNYXBwaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGVyZm9ybSBjYXN0IGZyb20KKyAgICAgKiB7QGxpbmsgVmFsdWVNZXRhRGF0YSNnZXRWYWx1ZU1hcHBlZEJ5TWV0YURhdGF9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0VmFsdWVNYXBwZWRCeU1hcHBpbmcoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW5zIHRoYXQgaG9sZCB0aGUgZGF0YSBmb3IgdGhpcyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpOworCisgICAgLyoqCisgICAgICogVGhlIGNvbHVtbnMgdGhhdCBob2xkIHRoZSBkYXRhIGZvciB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbnMoQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBJL08gaW5mb3JtYXRpb24gb24gdGhlIGZvcmVpZ24ga2V5LCBvciBjb2x1bW5zIGlmIHRoaXMgdmFsdWUgZG9lc24ndAorICAgICAqIGhhdmUgYSBrZXkuCisgICAgICovCisgICAgcHVibGljIENvbHVtbklPIGdldENvbHVtbklPKCk7CisKKyAgICAvKioKKyAgICAgKiBJL08gaW5mb3JtYXRpb24gb24gdGhlIGZvcmVpZ24ga2V5LCBvciBjb2x1bW5zIGlmIHRoaXMgdmFsdWUgZG9lc24ndAorICAgICAqIGhhdmUgYSBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSU8oQ29sdW1uSU8gaW8pOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyB2YWx1ZSBqb2lucyB0byBhbm90aGVyIHJlY29yZCwgdGhlIGZvcmVpZ24ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlcXVpdmFsZW50IG9mIHRoaXMgdmFsdWUncyBmb3JlaWduIGtleSwgYnV0IGpvaW5pbmcgdG8gdGhlCisgICAgICogZ2l2ZW4gdGFyZ2V0LCB3aGljaCBtYXkgYmUgYW4gdW5qb2luZWQgc3ViY2xhc3Mgb2YgdGhpcyB2YWx1ZSdzCisgICAgICogcmVsYXRlZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoQ2xhc3NNYXBwaW5nIHRhcmdldCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHZhbHVlIGpvaW5zIHRvIGFub3RoZXIgcmVjb3JkLCB0aGUgZm9yZWlnbiBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrKTsKKworICAgIC8qKgorICAgICAqIFRoZSBqb2luIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpvaW5EaXJlY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIFRoZSBqb2luIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKb2luRGlyZWN0aW9uKGludCBkaXJlY3Rpb24pOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlJ3MgZm9yZWlnbiBrZXkgdG8gdGhlIGdpdmVuIHJlbGF0ZWQgb2JqZWN0LiBUaGUgb2JqZWN0CisgICAgICogbWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShSb3cgcm93LCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSdzIGZvcmVpZ24ga2V5IHRvIHRoZSBnaXZlbiByZWxhdGVkIG9iamVjdC4gVGhlIG9iamVjdAorICAgICAqIG1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlRm9yZWlnbktleShSb3cgcm93LCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgaW5kZXBlbmRlbnRseS1tYXBwZWQgam9pbmFibGUgdHlwZXMgZm9yIHRoaXMgdmFsdWUsIGRlcGVuZGluZworICAgICAqIG9uIHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBwb2x5bW9ycGhpYyBhbmQgaG93IHRoZSByZWxhdGVkIHR5cGUgaXMgbWFwcGVkLgorICAgICAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBpZiB2YWx1ZSB0eXBlIGlzIG5vdCBQQy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5zcWwuU2VsZWN0fSBzdWJjbGFzc2VzIGNvbnN0YW50IAorICAgICAqIGZvciBsb2FkaW5nIHRoaXMgcmVsYXRpb24sIGJhc2VkIG9uIGhvdyB0aGUgcmVsYXRlZCB0eXBlIGlzIG1hcHBlZCwgCisgICAgICogd2hldGhlciB0aGlzIHJlbGF0aW9uIGlzIHBvbHltb3JwaGljLCBhbmQgd2hldGhlciBpdCBpcyBjb25maWd1cmVkIHRvIAorICAgICAqIHVzZSBjbGFzcyBjcml0ZXJpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN1YmNsYXNzZXMoKTsKKworICAgIC8qKgorICAgICAqIFVuaXF1ZSBjb25zdHJhaW50IG9uIHRoaXMgdmFsdWUncyBjb2x1bW5zLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSBnZXRWYWx1ZVVuaXF1ZSgpOworCisgICAgLyoqCisgICAgICogVW5pcXVlIGNvbnN0cmFpbnQgb24gdGhpcyB2YWx1ZSdzIGNvbHVtbnMsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVVuaXF1ZShVbmlxdWUgdW5xKTsKKworICAgIC8qKgorICAgICAqIEluZGV4IG9uIHRoaXMgdmFsdWUncyBjb2x1bW5zLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIEluZGV4IGdldFZhbHVlSW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIEluZGV4IG9uIHRoaXMgdmFsdWUncyBjb2x1bW5zLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVJbmRleChJbmRleCBpZHgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB1c2UgY2xhc3MgY3JpdGVyaWEgd2hlbiBqb2luaW5nIHRvIHJlbGF0ZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VDbGFzc0NyaXRlcmlhKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBjbGFzcyBjcml0ZXJpYSB3aGVuIGpvaW5pbmcgdG8gcmVsYXRlZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUNsYXNzQ3JpdGVyaWEoYm9vbGVhbiBjcml0ZXJpYSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlIHRvIHdoaWNoIHRoaXMgcmVsYXRpb24gaXMgcG9seW1vcnBoaWMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb2x5bW9ycGhpYygpOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZSB0byB3aGljaCB0aGlzIHJlbGF0aW9uIGlzIHBvbHltb3JwaGljLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvbHltb3JwaGljKGludCBwb2x5bW9ycGhpYyk7CisKKyAgICAvKioKKyAgICAgKiBJbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHVzZWQgc2NoZW1hIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmU2NoZW1hQ29tcG9uZW50cygpOworCisgICAgLyoqCisgICAgICogTWFwIGluZGV4ZXMgYW5kIGNvbnN0cmFpbnRzIGZvciB0aGlzIHZhbHVlLCB1c2luZyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayBWYWx1ZU1hcHBpbmdJbmZvfS4gVGhlIGZvcmVpZ24ga2V5IG9yIGNvbHVtbnMgb2YgdGhpcyB2YWx1ZQorICAgICAqIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcENvbnN0cmFpbnRzKFN0cmluZyBuYW1lLCBib29sZWFuIGFkYXB0KTsKKworICAgIC8qKgorICAgICAqIENsZWFyIG1hcHBpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhck1hcHBpbmcoKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB7QGxpbmsgTWFwcGluZ0luZm99IHdpdGggb3VyIGN1cnJlbnQgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jTWFwcGluZ0luZm8oKTsKKworICAgIC8qKgorICAgICAqIENvcHkgbWFwcGluZyBpbmZvIGZyb20gdGhlIGdpdmVuIGluc3RhbmNlIHRvIHRoaXMgb25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlNYXBwaW5nSW5mbyhWYWx1ZU1hcHBpbmcgdm0pOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1ZhbHVlTWFwcGluZ0ltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WYWx1ZU1hcHBpbmdJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmMzk2YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WYWx1ZU1hcHBpbmdJbXBsLmphdmEKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YUltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogU3RhbmRhbG9uZSB7QGxpbmsgVmFsdWVNYXBwaW5nfSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZU1hcHBpbmdJbXBsCisgICAgZXh0ZW5kcyBWYWx1ZU1ldGFEYXRhSW1wbAorICAgIGltcGxlbWVudHMgVmFsdWVNYXBwaW5nIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFZhbHVlTWFwcGluZ0ltcGwuY2xhc3MpOworCisgICAgcHJpdmF0ZSBWYWx1ZU1hcHBpbmdJbmZvIF9pbmZvOworICAgIHByaXZhdGUgVmFsdWVIYW5kbGVyIF9oYW5kbGVyID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzTWFwcGluZ1tdIF90eXBlQXJyID0gbnVsbDsKKworICAgIHByaXZhdGUgQ29sdW1uW10gX2NvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgcHJpdmF0ZSBDb2x1bW5JTyBfaW8gPSBudWxsOworICAgIHByaXZhdGUgRm9yZWlnbktleSBfZmsgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF90YXJnZXRGS3MgPSBudWxsOworICAgIHByaXZhdGUgSW5kZXggX2lkeCA9IG51bGw7CisgICAgcHJpdmF0ZSBVbmlxdWUgX3VucSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2pvaW4gPSBKT0lOX0ZPUldBUkQ7CisgICAgcHJpdmF0ZSBib29sZWFuIF9jcml0ZXJpYSA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF9wb2x5ID0gUE9MWV9UUlVFOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBvd25pbmcgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVNYXBwaW5nSW1wbChGaWVsZE1hcHBpbmcgb3duZXIpIHsKKyAgICAgICAgc3VwZXIob3duZXIpOworICAgICAgICBfaW5mbyA9IG93bmVyLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkubmV3TWFwcGluZ0luZm8odGhpcyk7CisgICAgICAgIF9pbmZvLnNldFVzZUNsYXNzQ3JpdGVyaWEob3duZXIuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS4KKyAgICAgICAgICAgIGdldE1hcHBpbmdEZWZhdWx0cygpLnVzZUNsYXNzQ3JpdGVyaWEoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBkZXNlcmlhbGl6YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlTWFwcGluZ0ltcGwoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlTWFwcGluZ0luZm8gZ2V0VmFsdWVJbmZvKCkgeworICAgICAgICByZXR1cm4gX2luZm87CisgICAgfQorCisgICAgcHVibGljIFZhbHVlSGFuZGxlciBnZXRIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gX2hhbmRsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihWYWx1ZUhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBfaGFuZGxlciA9IGhhbmRsZXI7CisgICAgfQorCisgICAgcHVibGljIE1hcHBpbmdSZXBvc2l0b3J5IGdldE1hcHBpbmdSZXBvc2l0b3J5KCkgeworICAgICAgICByZXR1cm4gKE1hcHBpbmdSZXBvc2l0b3J5KSBnZXRSZXBvc2l0b3J5KCk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXRGaWVsZE1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiAoRmllbGRNYXBwaW5nKSBnZXRGaWVsZE1ldGFEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzc01hcHBpbmcpIGdldFR5cGVNZXRhRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0RGVjbGFyZWRUeXBlTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzc01hcHBpbmcpIGdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRFbWJlZGRlZE1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NNYXBwaW5nKSBnZXRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXRWYWx1ZU1hcHBlZEJ5TWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZE1hcHBpbmcpIGdldFZhbHVlTWFwcGVkQnlNZXRhRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKCkgeworICAgICAgICBpZiAoX2NvbHMubGVuZ3RoICE9IDApCisgICAgICAgICAgICByZXR1cm4gX2NvbHM7CisgICAgICAgIGlmIChfZmsgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfZmsuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVNYXBwZWRCeU1hcHBpbmcoKS5nZXRDb2x1bW5zKCk7CisgICAgICAgIHJldHVybiBfY29sczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5zKENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgICAgIF9jb2xzID0gY29sczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uSU8gZ2V0Q29sdW1uSU8oKSB7CisgICAgICAgIGlmIChfY29scy5sZW5ndGggPT0gMCAmJiBfZmsgPT0gbnVsbCAmJiBnZXRWYWx1ZU1hcHBlZEJ5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZU1hcHBlZEJ5TWFwcGluZygpLmdldENvbHVtbklPKCk7CisgICAgICAgIHJldHVybiAoX2lvID09IG51bGwpID8gQ29sdW1uSU8uVU5SRVNUUklDVEVEIDogX2lvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbklPKENvbHVtbklPIGlvKSB7CisgICAgICAgIF9pbyA9IGlvOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoKSB7CisgICAgICAgIGlmIChfZmsgPT0gbnVsbCAmJiBnZXRWYWx1ZU1hcHBlZEJ5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZU1hcHBlZEJ5TWFwcGluZygpLmdldEZvcmVpZ25LZXkoKTsKKyAgICAgICAgcmV0dXJuIF9mazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JlaWduS2V5KEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgX2ZrID0gZms7CisgICAgICAgIGlmIChmayA9PSBudWxsKQorICAgICAgICAgICAgX2pvaW4gPSBKT0lOX0ZPUldBUkQ7CisgICAgfQorCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleShDbGFzc01hcHBpbmcgdGFyZ2V0KSB7CisgICAgICAgIGlmIChfZmsgPT0gbnVsbCAmJiBnZXRWYWx1ZU1hcHBlZEJ5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZU1hcHBlZEJ5TWFwcGluZygpLmdldEZvcmVpZ25LZXkodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9mazsKKyAgICAgICAgaWYgKF9mayA9PSBudWxsICYmIF9jb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gYWx3YXlzIHVzZSBsZWFzdC1kZXJpdmVkIGpvaW5hYmxlIHR5cGUKKyAgICAgICAgZm9yIChDbGFzc01hcHBpbmcgc3VwID0gdGFyZ2V0OyBzdXAgIT0gbnVsbDsKKyAgICAgICAgICAgIHN1cCA9IHN1cC5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSkgeworICAgICAgICAgICAgaWYgKHN1cCA9PSBnZXRUeXBlTWV0YURhdGEoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZrOworICAgICAgICAgICAgdGFyZ2V0ID0gc3VwOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoX3RhcmdldEZLcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGNhY2hlZEZLID0gX3RhcmdldEZLcy5nZXQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRksgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGb3JlaWduS2V5KSBjYWNoZWRGSzsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF90YXJnZXRGS3MgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgICAgICBGb3JlaWduS2V5IG5ld2ZrID0gKF9qb2luID09IEpPSU5fRk9SV0FSRCkKKyAgICAgICAgICAgICAgICA/IG5ld0ZvcndhcmRGb3JlaWduS2V5KHRhcmdldCkgOiBuZXdJbnZlcnNlRm9yZWlnbktleSh0YXJnZXQpOworICAgICAgICAgICAgX3RhcmdldEZLcy5wdXQodGFyZ2V0LCBuZXdmayk7CisgICAgICAgICAgICByZXR1cm4gbmV3Zms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmb3J3YXJkIGZvcmVpZ24ga2V5IHRvIHRoZSBnaXZlbiB0YXJnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBGb3JlaWduS2V5IG5ld0ZvcndhcmRGb3JlaWduS2V5KENsYXNzTWFwcGluZyB0YXJnZXQpIHsKKyAgICAgICAgVGFibGUgdGFibGU7CisgICAgICAgIENvbHVtbltdIGNvbHM7CisgICAgICAgIGlmIChfZmsgPT0gbnVsbCkgeworICAgICAgICAgICAgdGFibGUgPSBfY29sc1swXS5nZXRUYWJsZSgpOworICAgICAgICAgICAgY29scyA9IF9jb2xzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFibGUgPSBfZmsuZ2V0VGFibGUoKTsKKyAgICAgICAgICAgIGNvbHMgPSBfZmsuZ2V0Q29sdW1ucygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2F0aGVyIHRhcmdldCBjb2xzIGJlZm9yZSBhZGRpbmcgZm9yZWlnbiBrZXkgdG8gdGFibGUgaW4gY2FzZQorICAgICAgICAvLyB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBsb29raW5nIGZvciBhIHRhcmdldCBjb2wKKyAgICAgICAgQ29sdW1uW10gdGNvbHMgPSBuZXcgQ29sdW1uW2NvbHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29sc1tpXS5nZXRUYXJnZXRGaWVsZCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGNvbHNbaV0gPSBnZXRFcXVpdmFsZW50Q29sdW1uKGNvbHNbaV0sIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgY29sc1tpXS5nZXRUYXJnZXRGaWVsZCgpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF9mayAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRjb2xzW2ldID0gZ2V0RXF1aXZhbGVudENvbHVtbihfZmsuZ2V0UHJpbWFyeUtleUNvbHVtbgorICAgICAgICAgICAgICAgICAgICAoY29sc1tpXSkuZ2V0TmFtZSgpLCB0YXJnZXQsIHRydWUpOworICAgICAgICAgICAgZWxzZSBpZiAoY29sc1tpXS5nZXRUYXJnZXQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRjb2xzW2ldID0gZ2V0RXF1aXZhbGVudENvbHVtbihjb2xzW2ldLmdldFRhcmdldCgpLCB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRjb2xzW2ldID0gZ2V0RXF1aXZhbGVudENvbHVtbihjb2xzW2ldLmdldE5hbWUoKSwgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBGb3JlaWduS2V5IG5ld2ZrID0gdGFibGUuYWRkRm9yZWlnbktleSgpOworICAgICAgICBuZXdmay5zZXRKb2lucyhjb2xzLCB0Y29scyk7CisgICAgICAgIGlmIChfZmsgIT0gbnVsbCkgeworICAgICAgICAgICAgY29scyA9IF9may5nZXRDb25zdGFudENvbHVtbnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBuZXdmay5qb2luQ29uc3RhbnQoY29sc1tpXSwgX2ZrLmdldENvbnN0YW50KGNvbHNbaV0pKTsKKworICAgICAgICAgICAgY29scyA9IF9may5nZXRDb25zdGFudFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbmV3Zmsuam9pbkNvbnN0YW50KF9may5nZXRQcmltYXJ5S2V5Q29uc3RhbnQoY29sc1tpXSksCisgICAgICAgICAgICAgICAgICAgIGdldEVxdWl2YWxlbnRDb2x1bW4oY29sc1tpXS5nZXROYW1lKCksIHRhcmdldCwgdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdmazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdpdmVuIG1hcHBpbmcncyBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbiBjb2x1bW4sIHVzaW5nIHRoZQorICAgICAqIHRhcmdldCBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbHVtbiBnZXRFcXVpdmFsZW50Q29sdW1uKENvbHVtbiBjb2wsIENsYXNzTWFwcGluZyB0YXJnZXQsCisgICAgICAgIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgZmllbGROYW1lID0gZmllbGROYW1lLnN1YnN0cmluZyhmaWVsZE5hbWUuaW5kZXhPZignLicpICsgMSk7CisgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IHRhcmdldC5nZXRGaWVsZE1hcHBpbmcoZmllbGROYW1lKTsKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWVxdWl2LWZpZWxkIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IHRoaXMsIHRhcmdldCwgZmllbGROYW1lLCBjb2wgfSkpOworCisgICAgICAgIENvbHVtbltdIGNvbHMgPSBmaWVsZC5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZXF1aXYtZmllbGQiLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgdGhpcywgdGFyZ2V0LCBmaWVsZE5hbWUsIGNvbCB9KSk7CisKKyAgICAgICAgcmV0dXJuIGNvbHNbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiBtYXBwaW5nJ3MgZXF1aXZhbGVudCBvZiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHByaXZhdGUgQ29sdW1uIGdldEVxdWl2YWxlbnRDb2x1bW4oU3RyaW5nIGNvbE5hbWUsIENsYXNzTWFwcGluZyB0YXJnZXQsCisgICAgICAgIGJvb2xlYW4gZXhwbGljaXQpIHsKKyAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vIGV4cGxpY2l0IHRhcmdldCwgdXNlIHNpbmdsZSBwayBjb2x1bW4KKyAgICAgICAgaWYgKCFleHBsaWNpdCkgeworICAgICAgICAgICAgZm9yIChDbGFzc01hcHBpbmcgY2xzID0gdGFyZ2V0OyBjbHMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xzLmdldFRhYmxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2xzLmdldFByaW1hcnlLZXlDb2x1bW5zKCkubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldFByaW1hcnlLZXlDb2x1bW5zKClbMF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENvbHVtbiByZXQ7CisgICAgICAgIGZvciAoQ2xhc3NNYXBwaW5nIGNscyA9IHRhcmdldDsgY2xzICE9IG51bGw7CisgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChjbHMuZ2V0VGFibGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gY2xzLmdldFRhYmxlKCkuZ2V0Q29sdW1uKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tZXF1aXYtY29sIiwgdGhpcywgdGFyZ2V0LAorICAgICAgICAgICAgY29sTmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBpbnZlcnNlIGZvcmVpZ24ga2V5IGZyb20gdGhlIGdpdmVuIHJlbGF0ZWQgdHlwZSB0byBvdXIgdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBGb3JlaWduS2V5IG5ld0ludmVyc2VGb3JlaWduS2V5KENsYXNzTWFwcGluZyB0YXJnZXQpIHsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkID0gZ2V0RmllbGRNYXBwaW5nKCk7CisgICAgICAgIEZpZWxkTWFwcGluZyBtYXBwZWQgPSBmaWVsZC5nZXRNYXBwZWRCeU1hcHBpbmcoKTsKKyAgICAgICAgaWYgKG1hcHBlZCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJjYW50LWludmVyc2UiLCB0aGlzKSk7CisKKyAgICAgICAgbWFwcGVkID0gdGFyZ2V0LmdldEZpZWxkTWFwcGluZyhtYXBwZWQuZ2V0SW5kZXgoKSk7CisgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbCB8fCBtYXBwZWQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuUEMpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWVxdWl2LW1hcHBlZC1ieSIsCisgICAgICAgICAgICAgICAgdGhpcywgdGFyZ2V0LCBmaWVsZC5nZXRNYXBwZWRCeSgpKSk7CisgICAgICAgIHJldHVybiBtYXBwZWQuZ2V0Rm9yZWlnbktleSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Sm9pbkRpcmVjdGlvbigpIHsKKyAgICAgICAgaWYgKF9mayA9PSBudWxsICYmIGdldFZhbHVlTWFwcGVkQnkoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlTWFwcGVkQnlNYXBwaW5nKCkuZ2V0Sm9pbkRpcmVjdGlvbigpOworICAgICAgICByZXR1cm4gX2pvaW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbkRpcmVjdGlvbihpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIF9qb2luID0gZGlyZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoUm93IHJvdywgT3BlbkpQQVN0YXRlTWFuYWdlciByZWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAocmVsICE9IG51bGwpCisgICAgICAgICAgICByb3cuc2V0Rm9yZWlnbktleShnZXRGb3JlaWduS2V5KChDbGFzc01hcHBpbmcpIHJlbC5nZXRNZXRhRGF0YSgpKSwKKyAgICAgICAgICAgICAgICBfaW8sIHJlbCk7CisgICAgICAgIGVsc2UgaWYgKF9mayAhPSBudWxsKQorICAgICAgICAgICAgcm93LnNldEZvcmVpZ25LZXkoX2ZrLCBfaW8sIG51bGwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lvID09IG51bGwgfHwgKHJvdy5nZXRBY3Rpb24oKSA9PSBSb3cuQUNUSU9OX0lOU0VSVAorICAgICAgICAgICAgICAgICAgICAmJiBfaW8uaXNJbnNlcnRhYmxlKGksIHRydWUpKQorICAgICAgICAgICAgICAgICAgICB8fCAocm93LmdldEFjdGlvbigpICE9IFJvdy5BQ1RJT05fSU5TRVJUCisgICAgICAgICAgICAgICAgICAgICYmIF9pby5pc1VwZGF0YWJsZShpLCB0cnVlKSkpCisgICAgICAgICAgICAgICAgICAgIHJvdy5zZXROdWxsKF9jb2xzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlRm9yZWlnbktleShSb3cgcm93LCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHJvdy53aGVyZUZvcmVpZ25LZXkoZ2V0Rm9yZWlnbktleSgoQ2xhc3NNYXBwaW5nKQorICAgICAgICAgICAgICAgIHJlbC5nZXRNZXRhRGF0YSgpKSwgcmVsKTsKKyAgICAgICAgZWxzZSBpZiAoX2ZrICE9IG51bGwpCisgICAgICAgICAgICByb3cud2hlcmVGb3JlaWduS2V5KF9maywgbnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcm93LndoZXJlTnVsbChfY29sc1tpXSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50VHlwZU1hcHBpbmdzKCkgeworICAgICAgICBDbGFzc01hcHBpbmcgcmVsID0gZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgaWYgKHJlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENsYXNzTWFwcGluZy5FTVBUWV9NQVBQSU5HUzsKKyAgICAgICAgaWYgKF9wb2x5ICE9IFBPTFlfVFJVRSkgeworICAgICAgICAgICAgaWYgKCFyZWwuaXNNYXBwZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3NNYXBwaW5nLkVNUFRZX01BUFBJTkdTOworICAgICAgICAgICAgaWYgKF90eXBlQXJyID09IG51bGwpCisgICAgICAgICAgICAgICAgX3R5cGVBcnIgPSBuZXcgQ2xhc3NNYXBwaW5nW117IHJlbCB9OworICAgICAgICAgICAgcmV0dXJuIF90eXBlQXJyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWwuZ2V0SW5kZXBlbmRlbnRBc3NpZ25hYmxlTWFwcGluZ3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN1YmNsYXNzZXMoKSB7CisgICAgICAgIENsYXNzTWFwcGluZyByZWwgPSBnZXRUeXBlTWFwcGluZygpOworICAgICAgICBpZiAocmVsID09IG51bGwgfHwgIXJlbC5pc01hcHBlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHN3aXRjaCAoX3BvbHkpIHsKKyAgICAgICAgICAgIGNhc2UgUE9MWV9GQUxTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9jcml0ZXJpYSkgPyBTZWxlY3QuU1VCU19OT05FIDogU2VsZWN0LlNVQlNfRVhBQ1Q7CisgICAgICAgICAgICBjYXNlIFBPTFlfVFJVRToKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmdbXSBhc3NpZ24gPSByZWwuZ2V0SW5kZXBlbmRlbnRBc3NpZ25hYmxlTWFwcGluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXNzaWduLmxlbmd0aCAhPSAxIHx8IGFzc2lnblswXSAhPSByZWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgY2FzZSBQT0xZX0pPSU5BQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAoX2NyaXRlcmlhKSA/IFNlbGVjdC5TVUJTX0pPSU5BQkxFCisgICAgICAgICAgICAgICAgICAgIDogU2VsZWN0LlNVQlNfQU5ZX0pPSU5BQkxFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBVbmlxdWUgZ2V0VmFsdWVVbmlxdWUoKSB7CisgICAgICAgIHJldHVybiBfdW5xOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlVW5pcXVlKFVuaXF1ZSB1bnEpIHsKKyAgICAgICAgX3VucSA9IHVucTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXggZ2V0VmFsdWVJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVJbmRleChJbmRleCBpZHgpIHsKKyAgICAgICAgX2lkeCA9IGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VDbGFzc0NyaXRlcmlhKCkgeworICAgICAgICBpZiAoX2ZrID09IG51bGwgJiYgZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVNYXBwZWRCeU1hcHBpbmcoKS5nZXRVc2VDbGFzc0NyaXRlcmlhKCk7CisgICAgICAgIHJldHVybiBfY3JpdGVyaWE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlQ2xhc3NDcml0ZXJpYShib29sZWFuIGNyaXRlcmlhKSB7CisgICAgICAgIF9jcml0ZXJpYSA9IGNyaXRlcmlhOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9seW1vcnBoaWMoKSB7CisgICAgICAgIHJldHVybiBfcG9seTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb2x5bW9ycGhpYyhpbnQgcG9seSkgeworICAgICAgICBfcG9seSA9IHBvbHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmU2NoZW1hQ29tcG9uZW50cygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIF9jb2xzW2ldLnJlZigpOworICAgICAgICBpZiAoX2ZrICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9may5yZWYoKTsKKyAgICAgICAgICAgIF9may5yZWZDb2x1bW5zKCk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc01hcHBpbmcgZW1iZWQgPSBnZXRFbWJlZGRlZE1hcHBpbmcoKTsKKyAgICAgICAgaWYgKGVtYmVkICE9IG51bGwpCisgICAgICAgICAgICBlbWJlZC5yZWZTY2hlbWFDb21wb25lbnRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFwQ29uc3RyYWludHMoU3RyaW5nIG5hbWUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgX3VucSA9IF9pbmZvLmdldFVuaXF1ZSh0aGlzLCBuYW1lLCBhZGFwdCk7CisgICAgICAgIF9pZHggPSBfaW5mby5nZXRJbmRleCh0aGlzLCBuYW1lLCBhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJNYXBwaW5nKCkgeworICAgICAgICBfaGFuZGxlciA9IG51bGw7CisgICAgICAgIF9jb2xzID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgICAgICBfdW5xID0gbnVsbDsKKyAgICAgICAgX2lkeCA9IG51bGw7CisgICAgICAgIF9mayA9IG51bGw7CisgICAgICAgIF9qb2luID0gSk9JTl9GT1JXQVJEOworICAgICAgICBfaW5mby5jbGVhcigpOworICAgICAgICBzZXRSZXNvbHZlKE1PREVfTUFQUElORyB8IE1PREVfTUFQUElOR19JTklULCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3luY01hcHBpbmdJbmZvKCkgeworICAgICAgICBpZiAoZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICBfaW5mby5jbGVhcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9pbmZvLnN5bmNXaXRoKHRoaXMpOworICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIGVtYmVkID0gZ2V0RW1iZWRkZWRNYXBwaW5nKCk7CisgICAgICAgICAgICBpZiAoZW1iZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlbWJlZC5zeW5jTWFwcGluZ0luZm8oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlNYXBwaW5nSW5mbyhWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgc2V0VmFsdWVNYXBwZWRCeSh2bS5nZXRWYWx1ZU1hcHBlZEJ5KCkpOworICAgICAgICBzZXRQb2x5bW9ycGhpYyh2bS5nZXRQb2x5bW9ycGhpYygpKTsKKyAgICAgICAgX2luZm8uY29weSh2bS5nZXRWYWx1ZUluZm8oKSk7CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGVtYmVkID0gdm0uZ2V0RW1iZWRkZWRNYXBwaW5nKCk7CisgICAgICAgIGlmIChlbWJlZCAhPSBudWxsICYmIGdldEVtYmVkZGVkTWFwcGluZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZ1tdIHRtcGxhdGVzID0gZW1iZWQuZ2V0RmllbGRNYXBwaW5ncygpOworICAgICAgICAgICAgRmllbGRNYXBwaW5nW10gZm1zID0gZ2V0RW1iZWRkZWRNYXBwaW5nKCkuZ2V0RmllbGRNYXBwaW5ncygpOworICAgICAgICAgICAgaWYgKHRtcGxhdGVzLmxlbmd0aCA9PSBmbXMubGVuZ3RoKQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBmbXNbaV0uY29weU1hcHBpbmdJbmZvKHRtcGxhdGVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlc29sdmUoaW50IG1vZGUpIHsKKyAgICAgICAgaW50IGN1ciA9IGdldFJlc29sdmUoKTsKKyAgICAgICAgaWYgKHN1cGVyLnJlc29sdmUobW9kZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGVtYmVkID0gZ2V0RW1iZWRkZWRNYXBwaW5nKCk7CisgICAgICAgIGlmIChlbWJlZCAhPSBudWxsKQorICAgICAgICAgICAgZW1iZWQucmVzb2x2ZShtb2RlKTsKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwICYmIChjdXIgJiBNT0RFX01BUFBJTkcpID09IDApCisgICAgICAgICAgICByZXNvbHZlTWFwcGluZygpOworICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01BUFBJTkdfSU5JVCkgIT0gMCAmJiAoY3VyICYgTU9ERV9NQVBQSU5HX0lOSVQpID09IDApCisgICAgICAgICAgICBpbml0aWFsaXplTWFwcGluZygpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgbWFwcGluZy4gT3VyIGhhbmRsZXIgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBzZXQgYnkgb3VyIG93bmluZworICAgICAqIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlTWFwcGluZygpIHsKKyAgICAgICAgLy8gbWFyayBtYXBwZWQgY29sdW1ucworICAgICAgICBDb2x1bW5bXSBjb2xzOworICAgICAgICBpbnQgaW5zZXJ0RmxhZzsKKyAgICAgICAgaWYgKF9mayAhPSBudWxsKSB7CisgICAgICAgICAgICBjb2xzID0gX2ZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgIGluc2VydEZsYWcgPSBDb2x1bW4uRkxBR19GS19JTlNFUlQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgaW5zZXJ0RmxhZyA9IENvbHVtbi5GTEFHX0RJUkVDVF9JTlNFUlQ7CisgICAgICAgIH0KKyAgICAgICAgQ29sdW1uSU8gaW8gPSBnZXRDb2x1bW5JTygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpby5pc0luc2VydGFibGUoaSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0RmxhZyhpbnNlcnRGbGFnLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChpby5pc1VwZGF0YWJsZShpLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRGbGFnKGluc2VydEZsYWcsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSBtYXBwaW5nIGZvciBydW50aW1lIHVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1hcHBpbmcoKSB7CisgICAgICAgIGlmIChfZmsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBpZiBvdXIgZmsgY29scyBhcmUgZGlyZWN0IG1hcHBlZCBieSBvdGhlciB2YWx1ZXMsIG1ha2UgdGhlbQorICAgICAgICAvLyBub24tbnVsbGFibGUKKyAgICAgICAgQ29sdW1uW10gY29scyA9IF9may5nZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbHNbaV0uZ2V0RmxhZyhDb2x1bW4uRkxBR19ESVJFQ1RfSU5TRVJUKSkKKyAgICAgICAgICAgICAgICBuZXdJTygpLnNldE51bGxJbnNlcnRhYmxlKGksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmdldEZsYWcoQ29sdW1uLkZMQUdfRElSRUNUX1VQREFURSkpCisgICAgICAgICAgICAgICAgbmV3SU8oKS5zZXROdWxsVXBkYXRhYmxlKGksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIGFueXRoaW5nIG1hcHMgb3VyIGNvbnN0YW50IGZrIGNvbHMsIG1ha2UgdGhlbSByZWFkIG9ubHkKKyAgICAgICAgaW50IGxlbiA9IGNvbHMubGVuZ3RoOworICAgICAgICBjb2xzID0gX2ZrLmdldENvbnN0YW50Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmdldEZsYWcoQ29sdW1uLkZMQUdfRElSRUNUX0lOU0VSVCkKKyAgICAgICAgICAgICAgICB8fCBjb2xzW2ldLmdldEZsYWcoQ29sdW1uLkZMQUdfRktfSU5TRVJUKSkKKyAgICAgICAgICAgICAgICBuZXdJTygpLnNldEluc2VydGFibGUobGVuICsgaSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKGNvbHNbaV0uZ2V0RmxhZyhDb2x1bW4uRkxBR19ESVJFQ1RfVVBEQVRFKQorICAgICAgICAgICAgICAgIHx8IGNvbHNbaV0uZ2V0RmxhZyhDb2x1bW4uRkxBR19GS19VUERBVEUpKQorICAgICAgICAgICAgICAgIG5ld0lPKCkuc2V0VXBkYXRhYmxlKGxlbiArIGksIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIEkvTyBpbmZvcm1hdGlvbiwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgQ29sdW1uSU8gbmV3SU8oKSB7CisgICAgICAgIGlmIChfaW8gPT0gbnVsbCkKKyAgICAgICAgICAgIF9pbyA9IG5ldyBDb2x1bW5JTygpOworICAgICAgICByZXR1cm4gX2lvOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WYWx1ZU1hcHBpbmdJbmZvLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmFsdWVNYXBwaW5nSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDdiYjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmFsdWVNYXBwaW5nSW5mby5qYXZhCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hcHBpbmcgZnJvbSBhIGZpZWxkIHZhbHVlIHRvIHRoZSBzY2hlbWEsIGluCisgKiByYXcgZm9ybS4gVGhlIGNvbHVtbnMgYW5kIHRhYmxlcyB1c2VkIGluIG1hcHBpbmcgaW5mbyB3aWxsIG5vdCBiZSBwYXJ0IG9mCisgKiB0aGUge0BsaW5rIFNjaGVtYUdyb3VwfSB1c2VkIGF0IHJ1bnRpbWUuIFJhdGhlciwgdGhleSB3aWxsIGJlIHN0cnVjdHMKKyAqIHdpdGggdGhlIHJlbGV2YW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBmaWxsZWQgaW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFZhbHVlTWFwcGluZ0luZm8KKyAgICBleHRlbmRzIE1hcHBpbmdJbmZvIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFZhbHVlTWFwcGluZ0luZm8uY2xhc3MpOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9jcml0ZXJpYSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2FuTnVsbCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBjbGFzcyBjcml0ZXJpYSB3aGVuIGpvaW5pbmcgdG8gcmVsYXRlZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUNsYXNzQ3JpdGVyaWEoKSB7CisgICAgICAgIHJldHVybiBfY3JpdGVyaWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB1c2UgY2xhc3MgY3JpdGVyaWEgd2hlbiBqb2luaW5nIHRvIHJlbGF0ZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VDbGFzc0NyaXRlcmlhKGJvb2xlYW4gY3JpdGVyaWEpIHsKKyAgICAgICAgX2NyaXRlcmlhID0gY3JpdGVyaWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB1c2VyIGhhcyBleHBsaWNpdGx5IHR1cm5lZCBudWxsIGluZGljYXRvciBjb2x1bW4gb2ZmLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbkluZGljYXRlTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIF9jYW5OdWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdXNlciBoYXMgZXhwbGljaXRseSB0dXJuZWQgbnVsbCBpbmRpY2F0b3IgY29sdW1uIG9mZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5JbmRpY2F0ZU51bGwoYm9vbGVhbiBpbmQpIHsKKyAgICAgICAgX2Nhbk51bGwgPSBpbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBqb2luIGZyb20gdGhpcyB2YWx1ZSB0byBpdHMgcmVsYXRlZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYmFzZSBuYW1lIGZvciB2YWx1ZSBtYXBwaW5nCisgICAgICogQHBhcmFtIGludmVyc2FibGUgd2hldGhlciBhbiBpbnZlcnNlIGpvaW4gaXMgYWxsb3dlZAorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldFR5cGVKb2luKGZpbmFsIFZhbHVlTWFwcGluZyB2YWwsIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBib29sZWFuIGludmVyc2FibGUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbCA9IHZhbC5nZXRUeXBlTWFwcGluZygpOworICAgICAgICBpZiAocmVsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBGb3JlaWduS2V5RGVmYXVsdHMgZGVmID0gbmV3IEZvcmVpZ25LZXlEZWZhdWx0cygpIHsKKyAgICAgICAgICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldChUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwgYm9vbGVhbiBpbnZlcnNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgICAgICAgICBnZXRGb3JlaWduS2V5KHZhbCwgbmFtZSwgbG9jYWwsIGZvcmVpZ24sIGludmVyc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwgQ29sdW1uIGNvbCwKKyAgICAgICAgICAgICAgICBPYmplY3QgdGFyZ2V0LCBib29sZWFuIGludmVyc2UsIGludCBwb3MsIGludCBjb2xzKSB7CisgICAgICAgICAgICAgICAgdmFsLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRm9yZWlnbktleUNvbHVtbih2YWwsIG5hbWUsIGxvY2FsLCBmb3JlaWduLCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGludmVyc2UsIHBvcywgY29scyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBjcmVhdGVGb3JlaWduS2V5KHZhbCwgbnVsbCwgZ2V0Q29sdW1ucygpLCBkZWYsCisgICAgICAgICAgICB2YWwuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0VGFibGUoKSwgdmFsLmdldEZpZWxkTWFwcGluZygpLgorICAgICAgICAgICAgZ2V0RGVmaW5pbmdNYXBwaW5nKCksIHJlbCwgaW52ZXJzYWJsZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgam9pbiBmcm9tIHRoZSByZWxhdGVkIHR5cGUgdG8gdGhpcyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRJbnZlcnNlVHlwZUpvaW4oZmluYWwgVmFsdWVNYXBwaW5nIHZhbCwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbCA9IHZhbC5nZXRUeXBlTWFwcGluZygpOworICAgICAgICBpZiAocmVsID09IG51bGwgfHwgcmVsLmdldFRhYmxlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZvcmVpZ25LZXlEZWZhdWx0cyBkZWYgPSBuZXcgRm9yZWlnbktleURlZmF1bHRzKCkgeworICAgICAgICAgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0KFRhYmxlIGxvY2FsLCBUYWJsZSBmb3JlaWduLCBib29sZWFuIGludmVyc2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEZvcmVpZ25LZXkodmFsLCBuYW1lLCBsb2NhbCwgZm9yZWlnbiwgIWludmVyc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShUYWJsZSBsb2NhbCwgVGFibGUgZm9yZWlnbiwgQ29sdW1uIGNvbCwKKyAgICAgICAgICAgICAgICBPYmplY3QgdGFyZ2V0LCBib29sZWFuIGludmVyc2UsIGludCBwb3MsIGludCBjb2xzKSB7CisgICAgICAgICAgICAgICAgdmFsLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlRm9yZWlnbktleUNvbHVtbih2YWwsIG5hbWUsIGxvY2FsLCBmb3JlaWduLCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsICFpbnZlcnNlLCBwb3MsIGNvbHMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICByZXR1cm4gY3JlYXRlRm9yZWlnbktleSh2YWwsIG51bGwsIGdldENvbHVtbnMoKSwgZGVmLCByZWwuZ2V0VGFibGUoKSwKKyAgICAgICAgICAgIHJlbCwgdmFsLmdldEZpZWxkTWFwcGluZygpLmdldERlZmluaW5nTWFwcGluZygpLCBmYWxzZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1ucyBmb3IgdGhpcyB2YWx1ZSwgYmFzZWQgb24gdGhlIGdpdmVuIHRlbXBsYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucyhWYWx1ZU1hcHBpbmcgdmFsLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgQ29sdW1uW10gdG1wbGF0ZXMsIFRhYmxlIHRhYmxlLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIG9yZGVyQ29sdW1uc0J5VGFyZ2V0RmllbGQodmFsLCB0bXBsYXRlcywgYWRhcHQpOworICAgICAgICB2YWwuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXRNYXBwaW5nRGVmYXVsdHMoKS5wb3B1bGF0ZUNvbHVtbnMKKyAgICAgICAgICAgICh2YWwsIG5hbWUsIHRhYmxlLCB0bXBsYXRlcyk7CisgICAgICAgIHJldHVybiBjcmVhdGVDb2x1bW5zKHZhbCwgbnVsbCwgdG1wbGF0ZXMsIHRhYmxlLCBhZGFwdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBnaXZlbiBjb2x1bW5zIG1hdGNoIHVwIHdpdGggdGhlIHRhcmdldCBmaWVsZHMgc3VwcGxpZWQgb24gdGhlCisgICAgICogdGVtcGxhdGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvcmRlckNvbHVtbnNCeVRhcmdldEZpZWxkKFZhbHVlTWFwcGluZyB2YWwsIENvbHVtbltdIHRtcGxhdGVzLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmICh0bXBsYXRlcy5sZW5ndGggPCAyIHx8IHRtcGxhdGVzWzBdLmdldFRhcmdldEZpZWxkKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgTGlzdCBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5pc0VtcHR5KCkgfHwgY29scy5zaXplKCkgIT0gdG1wbGF0ZXMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBDb2x1bW4gY3VyID0gKENvbHVtbikgY29scy5nZXQoMCk7CisgICAgICAgIENvbHVtbiBuZXh0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdXIuZ2V0VGFyZ2V0RmllbGQoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tdGFyZ2V0ZmllbGQiLCB2YWwpKTsKKworICAgICAgICAgICAgcG9zID0gZmluZFRhcmdldEZpZWxkKHRtcGxhdGVzLCBjdXIuZ2V0VGFyZ2V0RmllbGQoKSk7CisgICAgICAgICAgICBpZiAocG9zID09IC0xKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXRhcmdldGZpZWxkIiwKKyAgICAgICAgICAgICAgICAgICAgdmFsLCBjdXIuZ2V0VGFyZ2V0RmllbGQoKSkpOworCisgICAgICAgICAgICBuZXh0ID0gKENvbHVtbikgY29scy5nZXQocG9zKTsKKyAgICAgICAgICAgIGNvbHMuc2V0KHBvcywgY3VyKTsKKyAgICAgICAgICAgIGN1ciA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZFRhcmdldEZpZWxkKENvbHVtbltdIHRtcGxhdGVzLCBTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG1wbGF0ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAodGFyZ2V0LmVxdWFscyh0bXBsYXRlc1tpXS5nZXRUYXJnZXRGaWVsZCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHVuaXF1ZSBjb25zdHJhaW50IGZvciB0aGUgZ2l2ZW4gY29sdW1ucywgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBVbmlxdWUgZ2V0VW5pcXVlKFZhbHVlTWFwcGluZyB2YWwsIFN0cmluZyBuYW1lLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSB2YWwuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFVuaXF1ZSB1bnEgPSB2YWwuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXRNYXBwaW5nRGVmYXVsdHMoKS4KKyAgICAgICAgICAgIGdldFVuaXF1ZSh2YWwsIG5hbWUsIGNvbHNbMF0uZ2V0VGFibGUoKSwgY29scyk7CisgICAgICAgIHJldHVybiBjcmVhdGVVbmlxdWUodmFsLCBudWxsLCB1bnEsIGNvbHMsIGFkYXB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gaW5kZXggZm9yIHRoZSBnaXZlbiBjb2x1bW5zLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIEluZGV4IGdldEluZGV4KFZhbHVlTWFwcGluZyB2YWwsIFN0cmluZyBuYW1lLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSB2YWwuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEluZGV4IGlkeCA9IHZhbC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLgorICAgICAgICAgICAgZ2V0SW5kZXgodmFsLCBuYW1lLCBjb2xzWzBdLmdldFRhYmxlKCksIGNvbHMpOworICAgICAgICByZXR1cm4gY3JlYXRlSW5kZXgodmFsLCBudWxsLCBpZHgsIGNvbHMsIGFkYXB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bGwgaW5kaWNhdG9yIGNvbHVtbiBmb3IgdGhpcyB2YWx1ZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW4gZ2V0TnVsbEluZGljYXRvckNvbHVtbihWYWx1ZU1hcHBpbmcgdmFsLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgVGFibGUgdGFibGUsIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgLy8gcmVzZXQgSU8KKyAgICAgICAgc2V0Q29sdW1uSU8obnVsbCk7CisKKyAgICAgICAgLy8gaGFzIHRoZSB1c2VyIGV4cGxpY2l0bHkgdHVybmVkIG51bGwgaW5kaWNhdG9yIG9mZj8KKyAgICAgICAgaWYgKCFfY2FuTnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGV4dHJhY3QgZ2l2ZW4gbnVsbC1pbmQgY29sdW1uCisgICAgICAgIExpc3QgY29scyA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uIGdpdmVuID0gKGNvbHMuaXNFbXB0eSgpKSA/IG51bGwgOiAoQ29sdW1uKSBjb2xzLmdldCgwKTsKKyAgICAgICAgTWFwcGluZ0RlZmF1bHRzIGRlZiA9IHZhbC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpOworICAgICAgICBpZiAoZ2l2ZW4gPT0gbnVsbCAmJiAoIWFkYXB0ICYmICFkZWYuZGVmYXVsdE1pc3NpbmdJbmZvKCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ29sdW1uIHRtcGxhdGUgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIHRtcGxhdGUuc2V0TmFtZShuYW1lICsgIl9udWxsIik7CisgICAgICAgIHRtcGxhdGUuc2V0SmF2YVR5cGUoSmF2YVR5cGVzLklOVCk7CisgICAgICAgIGlmICghZGVmLnBvcHVsYXRlTnVsbEluZGljYXRvckNvbHVtbnModmFsLCBuYW1lLCB0YWJsZSwgbmV3IENvbHVtbltdCisgICAgICAgICAgICB7IHRtcGxhdGUgfSkgJiYgZ2l2ZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGlmIChnaXZlbiAhPSBudWxsICYmIChnaXZlbi5nZXRGbGFnKENvbHVtbi5GTEFHX1VOSU5TRVJUQUJMRSkKKyAgICAgICAgICAgIHx8IGdpdmVuLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5VUERBVEFCTEUpKSkgeworICAgICAgICAgICAgQ29sdW1uSU8gaW8gPSBuZXcgQ29sdW1uSU8oKTsKKyAgICAgICAgICAgIGlvLnNldEluc2VydGFibGUoMCwgIWdpdmVuLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFKSk7CisgICAgICAgICAgICBpby5zZXRVcGRhdGFibGUoMCwgIWdpdmVuLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5VUERBVEFCTEUpKTsKKyAgICAgICAgICAgIHNldENvbHVtbklPKGlvKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnaXZlbiAhPSBudWxsICYmIGdpdmVuLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB0ZXN0IGlmIGdpdmVuIGNvbHVtbiBuYW1lIGlzIGFjdHVhbGx5IGEgZmllbGQgbmFtZSwgaW4gd2hpY2gKKyAgICAgICAgICAgIC8vIGNhc2Ugd2UgdXNlIGl0cyBjb2x1bW4gYXMgdGhlIG51bGwgaW5kaWNhdG9yIGNvbHVtbgorICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIGVtYmVkID0gdmFsLmdldEVtYmVkZGVkTWFwcGluZygpOworICAgICAgICAgICAgRmllbGRNYXBwaW5nIGVmbSA9IChlbWJlZCA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGVtYmVkLmdldEZpZWxkTWFwcGluZyhnaXZlbi5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGVmbSAhPSBudWxsICYmIGVmbS5nZXRDb2x1bW5zKCkubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBnaXZlbi5zZXROYW1lKGVmbS5nZXRDb2x1bW5zKClbMF0uZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGNvbXBhdCA9IGdpdmVuID09IG51bGwgfHwgZ2l2ZW4uZ2V0TmFtZSgpID09IG51bGwKKyAgICAgICAgICAgIHx8IHRhYmxlID09IG51bGwgfHwgIXRhYmxlLmlzTmFtZVRha2VuKGdpdmVuLmdldE5hbWUoKSk7CisKKyAgICAgICAgcmV0dXJuIG1lcmdlQ29sdW1uKHZhbCwgIm51bGwtaW5kIiwgdG1wbGF0ZSwgY29tcGF0LCBnaXZlbiwKKyAgICAgICAgICAgIHRhYmxlLCBhZGFwdCwgZGVmLmRlZmF1bHRNaXNzaW5nSW5mbygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBtYXBwaW5nIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN5bmNXaXRoKFZhbHVlTWFwcGluZyB2YWwpIHsKKyAgICAgICAgY2xlYXIoZmFsc2UpOworCisgICAgICAgIF9jcml0ZXJpYSA9IHZhbC5nZXRVc2VDbGFzc0NyaXRlcmlhKCk7CisgICAgICAgIHNldENvbHVtbklPKHZhbC5nZXRDb2x1bW5JTygpKTsKKyAgICAgICAgaWYgKHZhbC5nZXRGb3JlaWduS2V5KCkgIT0gbnVsbCAmJiB2YWwuZ2V0VHlwZU1hcHBpbmcoKSAhPSBudWxsCisgICAgICAgICAgICAmJiB2YWwuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZyBmbSA9IHZhbC5nZXRGaWVsZE1hcHBpbmcoKTsKKyAgICAgICAgICAgIFRhYmxlIGxvY2FsID0gKGZtLmdldEpvaW5Gb3JlaWduS2V5KCkgIT0gbnVsbCkgPyBmbS5nZXRUYWJsZSgpCisgICAgICAgICAgICAgICAgOiBmbS5nZXREZWZpbmluZ01hcHBpbmcoKS5nZXRUYWJsZSgpOworICAgICAgICAgICAgVGFibGUgZm9yZWlnbjsKKyAgICAgICAgICAgIGlmICh2YWwuZ2V0Sm9pbkRpcmVjdGlvbigpID09IFZhbHVlTWFwcGluZy5KT0lOX0VYUEVDVEVEX0lOVkVSU0UpIHsKKyAgICAgICAgICAgICAgICBmb3JlaWduID0gbG9jYWw7CisgICAgICAgICAgICAgICAgbG9jYWwgPSB2YWwuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZSgpOworICAgICAgICAgICAgICAgIHNldEpvaW5EaXJlY3Rpb24oSk9JTl9GT1JXQVJEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yZWlnbiA9IHZhbC5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlKCk7CisgICAgICAgICAgICAgICAgc2V0Sm9pbkRpcmVjdGlvbigodmFsLmdldEpvaW5EaXJlY3Rpb24oKSA9PSB2YWwuSk9JTl9GT1JXQVJEKQorICAgICAgICAgICAgICAgICAgICA/IEpPSU5fRk9SV0FSRCA6IEpPSU5fSU5WRVJTRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jRm9yZWlnbktleSh2YWwsIHZhbC5nZXRGb3JlaWduS2V5KCksIGxvY2FsLCBmb3JlaWduKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzeW5jQ29sdW1ucyh2YWwsIHZhbC5nZXRDb2x1bW5zKCksIGZhbHNlKTsKKworICAgICAgICBzeW5jSW5kZXgodmFsLCB2YWwuZ2V0VmFsdWVJbmRleCgpKTsKKyAgICAgICAgc3luY1VuaXF1ZSh2YWwsIHZhbC5nZXRWYWx1ZVVuaXF1ZSgpKTsKKworICAgICAgICAvLyBleHBsaWNpdCBoYW5kbGVyIHN0cmF0ZWd5IGlmIHRoZSBoYW5kbGVyIGlzbid0IHRoZSBleHBlY3RlZCBkZWZhdWx0CisgICAgICAgIGlmICh2YWwuZ2V0SGFuZGxlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFZhbHVlSGFuZGxlciBkZWYgPSB2YWwuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS4KKyAgICAgICAgICAgICAgICBkZWZhdWx0SGFuZGxlcih2YWwpOworICAgICAgICAgICAgaWYgKGRlZiA9PSBudWxsIHx8IHZhbC5nZXRIYW5kbGVyKCkuZ2V0Q2xhc3MoKSAhPSBkZWYuZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneSh2YWwuZ2V0SGFuZGxlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyKGJvb2xlYW4gY2FuRmxhZ3MpIHsKKyAgICAgICAgc3VwZXIuY2xlYXIoY2FuRmxhZ3MpOworICAgICAgICBpZiAoY2FuRmxhZ3MpIHsKKyAgICAgICAgICAgIF9jcml0ZXJpYSA9IGZhbHNlOworICAgICAgICAgICAgX2Nhbk51bGwgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weShNYXBwaW5nSW5mbyBpbmZvKSB7CisgICAgICAgIHN1cGVyLmNvcHkoaW5mbyk7CisgICAgICAgIGlmICghKGluZm8gaW5zdGFuY2VvZiBWYWx1ZU1hcHBpbmdJbmZvKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBWYWx1ZU1hcHBpbmdJbmZvIHZpbmZvID0gKFZhbHVlTWFwcGluZ0luZm8pIGluZm87CisgICAgICAgIGlmICghX2NyaXRlcmlhKQorICAgICAgICAgICAgX2NyaXRlcmlhID0gdmluZm8uZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpOworICAgICAgICBpZiAoX2Nhbk51bGwpCisgICAgICAgICAgICBfY2FuTnVsbCA9IHZpbmZvLmNhbkluZGljYXRlTnVsbCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WZXJzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmM0NjcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YU1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKKworLyoqCisgKiBIYW5kbGVzIG9wdGltaXN0aWMgbG9jayB2ZXJzaW9uaW5nIGZvciBhIGNsYXNzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJzaW9uCisgICAgaW1wbGVtZW50cyBWZXJzaW9uU3RyYXRlZ3ksIE1ldGFEYXRhQ29udGV4dCwgTWV0YURhdGFNb2RlcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKFZlcnNpb24uY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01hcHBpbmcgX21hcHBpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uTWFwcGluZ0luZm8gX2luZm87CisgICAgcHJpdmF0ZSBWZXJzaW9uU3RyYXRlZ3kgX3N0cmF0ZWd5ID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfcmVzTW9kZSA9IE1PREVfTk9ORTsKKworICAgIHByaXZhdGUgQ29sdW1uW10gX2NvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgcHJpdmF0ZSBDb2x1bW5JTyBfaW8gPSBudWxsOworICAgIHByaXZhdGUgSW5kZXggX2lkeCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IG93bmluZyBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBWZXJzaW9uKENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIF9tYXBwaW5nID0gbWFwcGluZzsKKyAgICAgICAgX2luZm8gPSBnZXRNYXBwaW5nUmVwb3NpdG9yeSgpLm5ld01hcHBpbmdJbmZvKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIF9tYXBwaW5nLmdldFJlcG9zaXRvcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwcGluZ1JlcG9zaXRvcnkgZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiBfbWFwcGluZy5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3duaW5nIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBfbWFwcGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyYXRlZ3kgdXNlZCBmb3IgdmVyc2lvbmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmVyc2lvblN0cmF0ZWd5IGdldFN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gX3N0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJhdGVneSB1c2VkIGZvciB2ZXJzaW9uaW5nLiBUaGUgPGNvZGU+YWRhcHQ8L2NvZGU+CisgICAgICogcGFyYW1ldGVyIGRldGVybWluZXMgd2hldGhlciB0byBhZGFwdCB3aGVuIG1hcHBpbmcgdGhlIHN0cmF0ZWd5OworICAgICAqIHVzZSBudWxsIGlmIHRoZSBzdHJhdGVneSBzaG91bGQgbm90IGJlIG1hcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShWZXJzaW9uU3RyYXRlZ3kgc3RyYXRlZ3ksIEJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgLy8gc2V0IHN0cmF0ZWd5IGZpcnN0IHNvIHdlIGNhbiBhY2Nlc3MgaXQgZHVyaW5nIG1hcHBpbmcKKyAgICAgICAgVmVyc2lvblN0cmF0ZWd5IG9yaWcgPSBfc3RyYXRlZ3k7CisgICAgICAgIF9zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdHJhdGVneS5zZXRWZXJzaW9uKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChhZGFwdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJhdGVneS5tYXAoYWRhcHQuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgX3N0cmF0ZWd5ID0gb3JpZzsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJhdyBtYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHVibGljIFZlcnNpb25NYXBwaW5nSW5mbyBnZXRNYXBwaW5nSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIF9pbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgdXNlZCBmb3IgdmVyc2lvbmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgcmV0dXJuIF9jb2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgdXNlZCBmb3IgdmVyc2lvbmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5zKENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgICAgIF9jb2xzID0gY29sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJL08gaW5mb3JtYXRpb24gb24gdGhlIHZlcnNpb24gY29sdW1ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uSU8gZ2V0Q29sdW1uSU8oKSB7CisgICAgICAgIHJldHVybiAoX2lvID09IG51bGwpID8gQ29sdW1uSU8uVU5SRVNUUklDVEVEIDogX2lvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEkvTyBpbmZvcm1hdGlvbiBvbiB0aGUgdmVyc2lvbiBjb2x1bW5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbklPKENvbHVtbklPIGlvKSB7CisgICAgICAgIF9pbyA9IGlvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGV4IG9uIHRoZSB2ZXJzaW9uIGNvbHVtbnMsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfaWR4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGV4IG9uIHRoZSB2ZXJzaW9uIGNvbHVtbnMsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleChJbmRleCBpZHgpIHsKKyAgICAgICAgX2lkeCA9IGlkeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1c2VkIHNjaGVtYSBjb21wb25lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZlNjaGVtYUNvbXBvbmVudHMoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBfY29sc1tpXS5yZWYoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBtYXBwaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgc3RyYXRlZ3kuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJNYXBwaW5nKCkgeworICAgICAgICBfc3RyYXRlZ3kgPSBudWxsOworICAgICAgICBfY29scyA9IFNjaGVtYXMuRU1QVFlfQ09MVU1OUzsKKyAgICAgICAgX2lkeCA9IG51bGw7CisgICAgICAgIF9pbmZvLmNsZWFyKCk7CisgICAgICAgIHNldFJlc29sdmUoTU9ERV9NQVBQSU5HIHwgTU9ERV9NQVBQSU5HX0lOSVQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUge0BsaW5rIE1hcHBpbmdJbmZvfSB3aXRoIG91ciBjdXJyZW50IG1hcHBpbmcgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luY01hcHBpbmdJbmZvKCkgeworICAgICAgICBfaW5mby5zeW5jV2l0aCh0aGlzKTsKKworICAgICAgICAvLyBzZXR1cCB0aGUgdmVyc2lvbiBmaWVsZCB3aXRoIG91ciBtYXBwaW5nIGluZm8KKyAgICAgICAgRmllbGRNYXBwaW5nIGZtID0gX21hcHBpbmcuZ2V0VmVyc2lvbkZpZWxkTWFwcGluZygpOworICAgICAgICBpZiAoZm0gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZXJhc2UgZXhwbGljaXQgc3RyYXRlZ3kgaWYgaXQgaXMgc3RhbmRhcmQgdmVyc2lvbiBzdHJhdGVneSBmb3IKKyAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUKKyAgICAgICAgICAgIGlmIChfaW5mby5nZXRTdHJhdGVneSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBfaW5mby5nZXRTdHJhdGVneSgpLmVxdWFscyhnZXRNYXBwaW5nUmVwb3NpdG9yeSgpLgorICAgICAgICAgICAgICAgIGRlZmF1bHRTdHJhdGVneSh0aGlzLCBmbSkuZ2V0QWxpYXMoKSkpCisgICAgICAgICAgICAgICAgX2luZm8uc2V0U3RyYXRlZ3kobnVsbCk7CisKKyAgICAgICAgICAgIGZtLmdldE1hcHBpbmdJbmZvKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIGZtLmdldFZhbHVlSW5mbygpLmNsZWFyKCk7CisgICAgICAgICAgICBmbS5nZXRLZXlNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIGZtLmdldFZhbHVlSW5mbygpLmNvcHkoX2luZm8pOworICAgICAgICAgICAgX2luZm8uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBfcmVzTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZShpbnQgbW9kZSkgeworICAgICAgICBfcmVzTW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmUoaW50IG1vZGUsIGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9OT05FKQorICAgICAgICAgICAgX3Jlc01vZGUgPSBtb2RlOworICAgICAgICBlbHNlIGlmIChvbikKKyAgICAgICAgICAgIF9yZXNNb2RlIHw9IG1vZGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9yZXNNb2RlICY9IH5tb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXNvbHZlKGludCBtb2RlKSB7CisgICAgICAgIGlmICgoX3Jlc01vZGUgJiBtb2RlKSA9PSBtb2RlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGludCBjdXIgPSBfcmVzTW9kZTsKKyAgICAgICAgX3Jlc01vZGUgfD0gbW9kZTsKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwICYmIChjdXIgJiBNT0RFX01BUFBJTkcpID09IDApCisgICAgICAgICAgICByZXNvbHZlTWFwcGluZygpOworICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01BUFBJTkdfSU5JVCkgIT0gMCAmJiAoY3VyICYgTU9ERV9NQVBQSU5HX0lOSVQpID09IDApCisgICAgICAgICAgICBfc3RyYXRlZ3kuaW5pdGlhbGl6ZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZU1hcHBpbmcoKSB7CisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBmaWVsZCwgY29weSBtYXBwaW5nIGluZm8gZnJvbSBpdAorICAgICAgICBGaWVsZE1hcHBpbmcgZm0gPSBfbWFwcGluZy5nZXRWZXJzaW9uRmllbGRNYXBwaW5nKCk7CisgICAgICAgIGlmIChmbSAhPSBudWxsKQorICAgICAgICAgICAgX2luZm8uY29weShmbS5nZXRWYWx1ZUluZm8oKSk7CisKKyAgICAgICAgLy8gbWFwIHN0cmF0ZWd5CisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKTsKKyAgICAgICAgaWYgKF9zdHJhdGVneSA9PSBudWxsKQorICAgICAgICAgICAgcmVwb3MuZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pbnN0YWxsU3RyYXRlZ3kodGhpcyk7CisgICAgICAgIExvZyBsb2cgPSByZXBvcy5nZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzdHJhdGVneSIsIHRoaXMsIF9zdHJhdGVneS5nZXRBbGlhcygpKSk7CisKKyAgICAgICAgLy8gbWFyayBjb2x1bW5zIGFzIG1hcHBlZAorICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICBDb2x1bW5JTyBpbyA9IGdldENvbHVtbklPKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGlvLmlzSW5zZXJ0YWJsZShpLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRGbGFnKENvbHVtbi5GTEFHX0RJUkVDVF9JTlNFUlQsIHRydWUpOworICAgICAgICAgICAgaWYgKGlvLmlzVXBkYXRhYmxlKGksIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldEZsYWcoQ29sdW1uLkZMQUdfRElSRUNUX1VQREFURSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVmVyc2lvblN0cmF0ZWd5IGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuZ2V0QWxpYXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLm1hcChhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuaW5zZXJ0KHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTdHJhdGVneSgpLnVwZGF0ZShzbSwgc3RvcmUsIHJtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5kZWxldGUoc20sIHN0b3JlLCBybSk7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmlzQ3VzdG9tSW5zZXJ0KHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmlzQ3VzdG9tVXBkYXRlKHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21EZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLmlzQ3VzdG9tRGVsZXRlKHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tSW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuY3VzdG9tSW5zZXJ0KHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuY3VzdG9tVXBkYXRlKHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tRGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuY3VzdG9tRGVsZXRlKHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihWZXJzaW9uIG93bmVyKSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuc2V0VmVyc2lvbihvd25lcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRTdHJhdGVneSgpLnNlbGVjdChzZWwsIG1hcHBpbmcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U3RyYXRlZ3koKS5sb2FkKHNtLCBzdG9yZSwgcmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIGFzc2VydFN0cmF0ZWd5KCkuYWZ0ZXJMb2FkKHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tWZXJzaW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVWZXJzaW9uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFN0cmF0ZWd5KCkuY2hlY2tWZXJzaW9uKHNtLCBzdG9yZSwgdXBkYXRlVmVyc2lvbik7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVmVyc2lvbihPYmplY3QgdjEsIE9iamVjdCB2MikgeworICAgICAgICByZXR1cm4gYXNzZXJ0U3RyYXRlZ3koKS5jb21wYXJlVmVyc2lvbih2MSwgdjIpOworICAgIH0KKworICAgIHByaXZhdGUgVmVyc2lvblN0cmF0ZWd5IGFzc2VydFN0cmF0ZWd5KCkgeworICAgICAgICBpZiAoX3N0cmF0ZWd5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIF9zdHJhdGVneTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gX21hcHBpbmcgKyAiPHZlcnNpb24+IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmVyc2lvbk1hcHBpbmdJbmZvLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmVyc2lvbk1hcHBpbmdJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3NDFmZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WZXJzaW9uTWFwcGluZ0luZm8uamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5Ob25lVmVyc2lvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlN1cGVyY2xhc3NWZXJzaW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFwcGluZyBmcm9tIGEgdmVyc2lvbiBpbmRpY2F0b3IgdG8gdGhlIHNjaGVtYSwgaW4KKyAqIHJhdyBmb3JtLiBUaGUgY29sdW1ucyBhbmQgdGFibGVzIHVzZWQgaW4gbWFwcGluZyBpbmZvIHdpbGwgbm90IGJlIHBhcnQgb2YKKyAqIHRoZSB7QGxpbmsgU2NoZW1hR3JvdXB9IHVzZWQgYXQgcnVudGltZS4gUmF0aGVyLCB0aGV5IHdpbGwgYmUgc3RydWN0cworICogd2l0aCB0aGUgcmVsZXZhbnQgcGllY2VzIG9mIGluZm9ybWF0aW9uIGZpbGxlZCBpbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVmVyc2lvbk1hcHBpbmdJbmZvCisgICAgZXh0ZW5kcyBNYXBwaW5nSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbnMgc2V0IGZvciB0aGlzIHZlcnNpb24sIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZXMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoVmVyc2lvbiB2ZXJzaW9uLCBDb2x1bW5bXSB0bXBsYXRlcywKKyAgICAgICAgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IHZlcnNpb24uZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0VGFibGUoKTsKKyAgICAgICAgdmVyc2lvbi5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmdEZWZhdWx0cygpLnBvcHVsYXRlQ29sdW1ucworICAgICAgICAgICAgKHZlcnNpb24sIHRhYmxlLCB0bXBsYXRlcyk7CisgICAgICAgIHJldHVybiBjcmVhdGVDb2x1bW5zKHZlcnNpb24sIG51bGwsIHRtcGxhdGVzLCB0YWJsZSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggdG8gc2V0IG9uIHRoZSB2ZXJzaW9uIGNvbHVtbnMsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoVmVyc2lvbiB2ZXJzaW9uLCBDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIEluZGV4IGlkeCA9IG51bGw7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA+IDApCisgICAgICAgICAgICBpZHggPSB2ZXJzaW9uLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TWFwcGluZ0RlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgZ2V0SW5kZXgodmVyc2lvbiwgY29sc1swXS5nZXRUYWJsZSgpLCBjb2xzKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHZlcnNpb24sIG51bGwsIGlkeCwgY29scywgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplIGludGVybmFsIGluZm9ybWF0aW9uIHdpdGggdGhlIG1hcHBpbmcgZGF0YSBmb3IgdGhlIGdpdmVuCisgICAgICogdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jV2l0aChWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgY2xlYXIoZmFsc2UpOworCisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSB2ZXJzaW9uLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdmVyc2lvbi5nZXRDb2x1bW5zKCk7CisKKyAgICAgICAgc2V0Q29sdW1uSU8odmVyc2lvbi5nZXRDb2x1bW5JTygpKTsKKyAgICAgICAgc3luY0NvbHVtbnModmVyc2lvbiwgY29scywgZmFsc2UpOworICAgICAgICBzeW5jSW5kZXgodmVyc2lvbiwgdmVyc2lvbi5nZXRJbmRleCgpKTsKKworICAgICAgICBpZiAodmVyc2lvbi5nZXRTdHJhdGVneSgpID09IG51bGwKKyAgICAgICAgICAgIHx8IHZlcnNpb24uZ2V0U3RyYXRlZ3koKWluc3RhbmNlb2YgU3VwZXJjbGFzc1ZlcnNpb25TdHJhdGVneSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBleHBsaWNpdCB2ZXJzaW9uIHN0cmF0ZWd5IGlmOgorICAgICAgICAvLyAtIHVubWFwcGVkIGNsYXNzIGFuZCB2ZXJzaW9uIG1hcHBlZAorICAgICAgICAvLyAtIG1hcHBlZCBiYXNlIGNsYXNzCisgICAgICAgIC8vIC0gbWFwcGVkIHN1YmNsYXNzIHRoYXQgZG9lc24ndCByZWx5IG9uIHN1cGVyY2xhc3MgdmVyc2lvbgorICAgICAgICBTdHJpbmcgc3RyYXQgPSB2ZXJzaW9uLmdldFN0cmF0ZWd5KCkuZ2V0QWxpYXMoKTsKKyAgICAgICAgaWYgKCghY2xzLmlzTWFwcGVkKCkgJiYgIU5vbmVWZXJzaW9uU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKHN0cmF0KSkKKyAgICAgICAgICAgIHx8IChjbHMuaXNNYXBwZWQoKQorICAgICAgICAgICAgJiYgY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpID09IG51bGwpKQorICAgICAgICAgICAgc2V0U3RyYXRlZ3koc3RyYXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WZXJzaW9uU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9WZXJzaW9uU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2EwZjNiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1ZlcnNpb25TdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YTsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKKworLyoqCisgKiBIYW5kbGVzIG9wdGltaXN0aWMgbG9jayB2ZXJzaW9uaW5nIGZvciBhIGNsYXNzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmVyc2lvblN0cmF0ZWd5CisgICAgZXh0ZW5kcyBTdHJhdGVneSB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZlcnNpb24gdGhhdCB1c2VzIHRoaXMgc3RyYXRlZ3kuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFZlcnNpb24gb3duZXIpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBkYXRhIGZvciB0aGlzIGluZGljYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIHRoZSBrbm93biBiYXNlIGNsYXNzIGJlaW5nIHNlbGVjdGVkOyB0aGlzIG1heQorICAgICAqIG5vdCBiZSB0aGUgYmFzZSBjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgICAgICogQHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBzZWxlY3RlZDsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKTsKKworICAgIC8qKgorICAgICAqIExvYWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBkYXRhIGlzIGxvYWRlZCBpbnRvIHRoZSBpbnN0YW5jZSwgaW4KKyAgICAgKiBjYXNlIHRoZSB2ZXJzaW9uIGluZGljYXRvciB3b3JrcyBvZmYgb2YgYSBzdGF0ZSBpbWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciB3aXRoIHRoZSB2ZXJzaW9uCisgICAgICogc3RvcmVkIGluIG1lbW9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW4tbWVtb3J5IHZlcnNpb24gd2FzIHVwLXRvLWRhdGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIGJvb2xlYW4gdXBkYXRlVmVyc2lvbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEBzZWUgU3RvcmVNYW5hZ2VyI2NvbXBhcmVWZXJzaW9uCisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXJlVmVyc2lvbihPYmplY3QgdjEsIE9iamVjdCB2Mik7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQwOTRjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQS1KREJDIE9STSBNZXRhZGF0YTwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIGV4dGVuZHMgdGhlIHN0YW5kYXJkIHBlcnNpc3RlbmNlIG1ldGFkYXRhIHdpdGgKKyAgICBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdENsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQWJzdHJhY3RDbGFzc1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2MGNiZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQWJzdHJhY3RDbGFzc1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKKworLyoqCisgKiBOby1vcCBzdHJhdGVneSBmb3IgZWFzeSBleHRlbnNpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2xhc3NTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RTdHJhdGVneQorICAgIGltcGxlbWVudHMgQ2xhc3NTdHJhdGVneSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3duaW5nIGNsYXNzIG1hcHBpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTWFwcGluZyBjbHMgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NNYXBwaW5nKENsYXNzTWFwcGluZyBvd25lcikgeworICAgICAgICBjbHMgPSBvd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXlPYmplY3RJZChib29sZWFuIGhhc0FsbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5TdXBlcmNsYXNzKEpvaW5zIGpvaW5zLCBib29sZWFuIHRvVGhpcykgeworICAgICAgICByZXR1cm4gam9pbnM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFYWdlclNlbGVjdChTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIENsYXNzTWFwcGluZyBiYXNlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRPYmplY3RQcm92aWRlciBjdXN0b21Mb2FkKEpEQkNTdG9yZSBzdG9yZSwgYm9vbGVhbiBzdWJjbGFzc2VzLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBsb25nIHN0YXJ0SWR4LCBsb25nIGVuZElkeCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGN1c3RvbUxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBQQ1N0YXRlIHN0YXRlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGN1c3RvbUxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzdWx0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQWJzdHJhY3REaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQWJzdHJhY3REaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk5NzNhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdERpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRGlzY3JpbWluYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CisKKy8qKgorICogTm8tb3Agc3RyYXRlZ3kgZm9yIGVhc3kgZXh0ZW5zaW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpc2NyaW1pbmF0b3JTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RTdHJhdGVneQorICAgIGltcGxlbWVudHMgRGlzY3JpbWluYXRvclN0cmF0ZWd5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEFic3RyYWN0RGlzY3JpbWluYXRvclN0cmF0ZWd5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBvd25pbmcgZGlzY3JpbWluYXRvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlzY3JpbWluYXRvciBkaXNjID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIG93bmluZyBjbGFzcyBpcyBmaW5hbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmFsID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yKERpc2NyaW1pbmF0b3Igb3duZXIpIHsKKyAgICAgICAgZGlzYyA9IG93bmVyOworICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gZGlzYy5nZXRDbGFzc01hcHBpbmcoKTsKKyAgICAgICAgaXNGaW5hbCA9IE1vZGlmaWVyLmlzRmluYWwoY2xzLmdldERlc2NyaWJlZFR5cGUoKS5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCeSBkZWZhdWx0LCBsb2dzIGEgd2FybmluZyB0aGF0IHRoaXMgZGlzY3JpbWluYXRvciBjYW5ub3QgY2FsY3VsYXRlCisgICAgICogaXRzIGxpc3Qgb2Ygc3ViY2xhc3NlcyBvbiBpdHMgb3duLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRTdWJjbGFzc2VzKEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNGaW5hbCkgeworICAgICAgICAgICAgTG9nIGxvZyA9IGRpc2MuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXRMb2coKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJjYW50LWluaXQtc3VicyIsIGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbgorICAgICAgICBkaXNjLnNldFN1YmNsYXNzZXNMb2FkZWQodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldENsYXNzKEpEQkNTdG9yZSBzdG9yZSwgQ2xhc3NNYXBwaW5nIGJhc2UsIFJlc3VsdCByZXN1bHQpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYmFzZS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NDb25kaXRpb25zKENsYXNzTWFwcGluZyBiYXNlLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0Q2xhc3NDb25kaXRpb25zKFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zLCAKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGJhc2UsIGJvb2xlYW4gc3VicykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Fic3RyYWN0RmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdEZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUxNjhkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdEZpZWxkU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0RXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogTm8tb3Agc3RyYXRlZ3kgZm9yIGVhc3kgZXh0ZW5zaW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0U3RyYXRlZ3kKKyAgICBpbXBsZW1lbnRzIEZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQWJzdHJhY3RGaWVsZFN0cmF0ZWd5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSBvd25pbmcgZmllbGQgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmllbGRNYXBwaW5nIGZpZWxkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRocm93cyBhbiBpbmZvcm1hdGl2ZSBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRlY2xhcmVzIGEgbWFwcGVkLWJ5IHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE5vdE1hcHBlZEJ5KCkgeworICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtbWFwcGVkLWJ5IiwgZmllbGQsCisgICAgICAgICAgICAgICAgZ2V0QWxpYXMoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkTWFwcGluZyhGaWVsZE1hcHBpbmcgb3duZXIpIHsKKyAgICAgICAgZmllbGQgPSBvd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN1cHBvcnRzU2VsZWN0KFNlbGVjdCBzZWwsIGludCB0eXBlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0RWFnZXJKb2luKFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVhZ2VyUGFyYWxsZWwoU2VsZWN0RXhlY3V0b3Igc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VhZ2VyU2VsZWN0VG9NYW55KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGludCBzZWxlY3QoU2VsZWN0IHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRFYWdlclBhcmFsbGVsKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZEVhZ2VySm9pbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9LZXlEYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc0VtcHR5KFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHNxbC5hcHBlbmQoIjEgPD4gMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTm90RW1wdHkoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc3FsLmFwcGVuZCgiMSA9IDEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc3FsLmFwcGVuZCgiMSA8PiAxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHNxbC5hcHBlbmQoIjEgPD4gMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNpemUoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc3FsLmFwcGVuZCgiMSIpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5zOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luS2V5KEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5zOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luUmVsYXRpb24oSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlciwKKyAgICAgICAgYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICByZXR1cm4gam9pbnM7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5LZXlSZWxhdGlvbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyLAorICAgICAgICBib29sZWFuIHRyYXZlcnNlKSB7CisgICAgICAgIHJldHVybiBqb2luczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRLZXlQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25hYmxlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtLAorICAgICAgICBPYmplY3QgcHJldlZhbHVlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Fic3RyYWN0U3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQWJzdHJhY3RTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmQzODkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Fic3RyYWN0U3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBOby1vcCBzdHJhdGVneSBmb3IgZWFzeSBleHRlbnNpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RyYXRlZ3kKKyAgICBpbXBsZW1lbnRzIFN0cmF0ZWd5IHsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIHB1YmxpYyBCb29sZWFuIGlzQ3VzdG9tVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbURlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tSW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tRGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdFZhbHVlSGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdFZhbHVlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NWQzMWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Fic3RyYWN0VmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworCisvKioKKyAqIE5vLW9wIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgVmFsdWVIYW5kbGVyfSBpbnRlcmZhY2UgbWV0aG9kcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsdWVIYW5kbGVyCisgICAgaW1wbGVtZW50cyBWYWx1ZUhhbmRsZXIgeworCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uYWJsZShWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9iamVjdFZhbHVlUmVxdWlyZXNMb2FkKFZhbHVlTWFwcGluZyB2bSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRBcmd1bWVudChWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKFZhbHVlTWFwcGluZyB2bSwgT2JqZWN0IHZhbCwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b09iamVjdFZhbHVlKFZhbHVlTWFwcGluZyB2bSwgT2JqZWN0IHZhbCkgeworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9PYmplY3RWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdFZlcnNpb25TdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9BYnN0cmFjdFZlcnNpb25TdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZTdhZGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Fic3RyYWN0VmVyc2lvblN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmVyc2lvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZU1hbmFnZXI7CisKKy8qKgorICogTm8tb3Agc3RyYXRlZ3kgZm9yIGVhc3kgZXh0ZW5zaW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZlcnNpb25TdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RTdHJhdGVneQorICAgIGltcGxlbWVudHMgVmVyc2lvblN0cmF0ZWd5IHsKKworICAgIC8qKgorICAgICAqIFRoZSBvd25pbmcgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVyc2lvbiB2ZXJzID0gbnVsbDsKKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oVmVyc2lvbiBvd25lcikgeworICAgICAgICB2ZXJzID0gb3duZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJMb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIGJvb2xlYW4gdXBkYXRlVmVyc2lvbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVWZXJzaW9uKE9iamVjdCB2MSwgT2JqZWN0IHYyKSB7CisgICAgICAgIHJldHVybiBTdG9yZU1hbmFnZXIuVkVSU0lPTl9TQU1FOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQmxvYlZhbHVlSGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9CbG9iVmFsdWVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4YjI5YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQmxvYlZhbHVlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CisKKy8qKgorICogSGFuZGxlciBmb3IgYmxvYiB2YWx1ZXMuCisgKgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQmxvYlZhbHVlSGFuZGxlcgorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZUhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvYlZhbHVlSGFuZGxlciBfaW5zdGFuY2UgPSBuZXcgQmxvYlZhbHVlSGFuZGxlcigpOworCisgICAgLyoqCisgICAgICogU2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmxvYlZhbHVlSGFuZGxlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gbWFwKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGNvbC5zZXROYW1lKG5hbWUpOworICAgICAgICBjb2wuc2V0SmF2YVR5cGUoSmF2YVR5cGVzLk9CSkVDVCk7CisgICAgICAgIGNvbC5zZXRTaXplKC0xKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5bXXsgY29sIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9CeXRlQXJyYXlWYWx1ZUhhbmRsZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQnl0ZUFycmF5VmFsdWVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxNjM1NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQnl0ZUFycmF5VmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CisKKy8qKgorICogSGFuZGxlciBmb3IgYnl0ZSBhcnJheSB2YWx1ZXMuCisgKgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQnl0ZUFycmF5VmFsdWVIYW5kbGVyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlSGFuZGxlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQXJyYXlWYWx1ZUhhbmRsZXIgX2luc3RhbmNlID0KKyAgICAgICAgbmV3IEJ5dGVBcnJheVZhbHVlSGFuZGxlcigpOworCisgICAgLyoqCisgICAgICogU2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUFycmF5VmFsdWVIYW5kbGVyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gX2luc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBtYXAoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgQ29sdW1uSU8gaW8sCisgICAgICAgIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgY29sLnNldE5hbWUobmFtZSk7CisgICAgICAgIGNvbC5zZXRKYXZhVHlwZShKYXZhU1FMVHlwZXMuQllURVMpOworICAgICAgICBjb2wuc2V0U2l6ZSgtMSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uW117IGNvbCB9OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gUHJpbWl0aXZlV3JhcHBlckFycmF5cy50b0J5dGVBcnJheSh2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9PYmplY3RWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwpIHsKKyAgICAgICAgcmV0dXJuIFByaW1pdGl2ZVdyYXBwZXJBcnJheXMudG9PYmplY3RWYWx1ZSh2bSwgKGJ5dGVbXSkgdmFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0NoYXJBcnJheVN0cmVhbVZhbHVlSGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9DaGFyQXJyYXlTdHJlYW1WYWx1ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVjOTNjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9DaGFyQXJyYXlTdHJlYW1WYWx1ZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNpemVkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworCisvKioKKyAqIEhhbmRsZXIgZm9yIGNoYXIgYXJyYXkgdmFsdWVzLgorICoKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIENoYXJBcnJheVN0cmVhbVZhbHVlSGFuZGxlcgorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZUhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhckFycmF5U3RyZWFtVmFsdWVIYW5kbGVyIF9pbnN0YW5jZSA9CisgICAgICAgIG5ldyBDaGFyQXJyYXlTdHJlYW1WYWx1ZUhhbmRsZXIoKTsKKworICAgIC8qKgorICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJBcnJheVN0cmVhbVZhbHVlSGFuZGxlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gbWFwKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGNvbC5zZXROYW1lKG5hbWUpOworICAgICAgICBjb2wuc2V0SmF2YVR5cGUoSmF2YVNRTFR5cGVzLkNIQVJfU1RSRUFNKTsKKyAgICAgICAgY29sLnNldFNpemUoLTEpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbltdeyBjb2wgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGNoYXJbXSBjaGFycyA9IFByaW1pdGl2ZVdyYXBwZXJBcnJheXMudG9DaGFyQXJyYXkodmFsKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaXplZChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJzKSwgY2hhcnMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvT2JqZWN0VmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsKSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFJlYWRlciByZWFkZXIgPSAoUmVhZGVyKSB2YWw7CisgICAgICAgIENoYXJBcnJheVdyaXRlciB3cml0ZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKGludCBjOyAoYyA9IHJlYWRlci5yZWFkKCkpICE9IC0xOykKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFByaW1pdGl2ZVdyYXBwZXJBcnJheXMudG9PYmplY3RWYWx1ZSh2bSwgd3JpdGVyLnRvQ2hhckFycmF5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQ2hhckFycmF5VmFsdWVIYW5kbGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0NoYXJBcnJheVZhbHVlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDEzNjAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0NoYXJBcnJheVZhbHVlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKKworLyoqCisgKiBIYW5kbGVyIGZvciBjaGFyIGFycmF5IHZhbHVlcy4KKyAqCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFyQXJyYXlWYWx1ZUhhbmRsZXIKKyAgICBleHRlbmRzIEFic3RyYWN0VmFsdWVIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJBcnJheVZhbHVlSGFuZGxlciBfaW5zdGFuY2UgPQorICAgICAgICBuZXcgQ2hhckFycmF5VmFsdWVIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyQXJyYXlWYWx1ZUhhbmRsZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIG1hcChWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBDb2x1bW5JTyBpbywKKyAgICAgICAgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBDb2x1bW4gY29sID0gbmV3IENvbHVtbigpOworICAgICAgICBjb2wuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5TVFJJTkcpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbltdeyBjb2wgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBudWxsCisgICAgICAgICAgICA6IFN0cmluZy52YWx1ZU9mKFByaW1pdGl2ZVdyYXBwZXJBcnJheXMudG9DaGFyQXJyYXkodmFsKSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b09iamVjdFZhbHVlKFZhbHVlTWFwcGluZyB2bSwgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBjaGFyW10gYXJyYXkgPSAoKFN0cmluZykgdmFsKS50b0NoYXJBcnJheSgpOworICAgICAgICByZXR1cm4gUHJpbWl0aXZlV3JhcHBlckFycmF5cy50b09iamVjdFZhbHVlKHZtLCBhcnJheSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9DbGFzc05hbWVEaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQ2xhc3NOYW1lRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5Y2FjNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvQ2xhc3NOYW1lRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKKworLyoqCisgKiBTdG9yZXMgdGhlIGNsYXNzIG5hbWUgYWxvbmcgd2l0aCBlYWNoIGRhdGFiYXNlIG9iamVjdCByZWNvcmQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIENsYXNzTmFtZURpc2NyaW1pbmF0b3JTdHJhdGVneQorICAgIGV4dGVuZHMgSW5WYWx1ZURpc2NyaW1pbmF0b3JTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChDbGFzc05hbWVEaXNjcmltaW5hdG9yU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAiY2xhc3MtbmFtZSI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gQUxJQVM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRKYXZhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFUeXBlcy5TVFJJTkc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREaXNjcmltaW5hdG9yVmFsdWUoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICByZXR1cm4gY2xzLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGdldENsYXNzKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcihzdG9yZSk7CisgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKChTdHJpbmcpIHZhbCwgdHJ1ZSwgbG9hZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU3ViY2xhc3NlcyhKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNGaW5hbCkgeworICAgICAgICAgICAgZGlzYy5zZXRTdWJjbGFzc2VzTG9hZGVkKHRydWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQ29sdW1uIGNvbCA9IGRpc2MuZ2V0Q29sdW1ucygpWzBdOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IHN0b3JlLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBTUUxCdWZmZXIgc2VsZWN0ID0gZGljdC50b1NlbGVjdChuZXcgU1FMQnVmZmVyKGRpY3QpLmFwcGVuZChjb2wpLAorICAgICAgICAgICAgc3RvcmUuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICBuZXcgU1FMQnVmZmVyKGRpY3QpLmFwcGVuZChjb2wuZ2V0VGFibGUoKSksIG51bGwsIG51bGwsCisgICAgICAgICAgICBudWxsLCBudWxsLCB0cnVlLCBmYWxzZSwgMCwgTG9uZy5NQVhfVkFMVUUpOworCisgICAgICAgIExvZyBsb2cgPSBkaXNjLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgibG9hZC1zdWJzIiwgY29sLmdldFRhYmxlKCkuZ2V0RnVsbE5hbWUoKSkpOworCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzTG9hZGVyKHN0b3JlKTsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gc3RvcmUuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG1udCA9IHNlbGVjdC5wcmVwYXJlU3RhdGVtZW50KGNvbm4pOworICAgICAgICAgICAgcnMgPSBzdG1udC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWU7CisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZGljdC5nZXRTdHJpbmcocnMsIDEpOworICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGNsYXNzTmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1jbGFzcy1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCksIGNvbCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc2Muc2V0U3ViY2xhc3Nlc0xvYWRlZCh0cnVlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0bW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RtbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIGZvciBsb2FkaW5nIGNsYXNzIG5hbWVzLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBzdG9yZS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihkaXNjLmdldENsYXNzTWFwcGluZygpLmdldERlc2NyaWJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICBzdG9yZS5nZXRDb250ZXh0KCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9DbG9iVmFsdWVIYW5kbGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Nsb2JWYWx1ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRhMGVmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9DbG9iVmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKKworLyoqCisgKiBIYW5kbGVyIGZvciBjbG9iIHZhbHVlcy4KKyAqCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBDbG9iVmFsdWVIYW5kbGVyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlSGFuZGxlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbG9iVmFsdWVIYW5kbGVyIF9pbnN0YW5jZSA9IG5ldyBDbG9iVmFsdWVIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbG9iVmFsdWVIYW5kbGVyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gX2luc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBtYXAoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgQ29sdW1uSU8gaW8sCisgICAgICAgIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgY29sLnNldE5hbWUobmFtZSk7CisgICAgICAgIGNvbC5zZXRKYXZhVHlwZShKYXZhVHlwZXMuU1RSSU5HKTsKKyAgICAgICAgY29sLnNldFNpemUoLTEpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbltdeyBjb2wgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0NvbHVtblZlcnNpb25TdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Db2x1bW5WZXJzaW9uU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTU4YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Db2x1bW5WZXJzaW9uU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WZXJzaW9uTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBVc2VzIGEgc2luZ2xlIGNvbHVtbiBhbmQgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uVmVyc2lvblN0cmF0ZWd5CisgICAgZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25TdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChDb2x1bW5WZXJzaW9uU3RyYXRlZ3kuY2xhc3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2RlIGZyb20ge0BsaW5rIEphdmFUeXBlc30gZm9yIHRoZSB2ZXJzaW9uIHZhbHVlcyB0aGlzCisgICAgICogc3RyYXRlZ3kgdXNlcy4gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGR1cmluZyBtYXBwaW5nIGluc3RhbGxhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldEphdmFUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5leHQgdmVyc2lvbiBnaXZlbiB0aGUgY3VycmVudCBvbmUsIHdoaWNoIG1heSBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgbmV4dFZlcnNpb24oT2JqZWN0IHZlcnNpb24pOworCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgdHdvIHZlcnNpb25zLiBEZWZhdWx0cyB0byBhc3N1bWluZyB0aGUgdmVyc2lvbiBvYmplY3RzCisgICAgICogaW1wbGVtZW50IHtAbGluayBDb21wYXJhYmxlfS4KKyAgICAgKgorICAgICAqIEBzZWUgQ29tcGFyYXRvciNjb21wYXJlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjb21wYXJlKE9iamVjdCB2MSwgT2JqZWN0IHYyKSB7CisgICAgICAgIGlmICh2MSA9PSB2MikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAodjEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHYyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBpZiAodjEuZ2V0Q2xhc3MoKSAhPSB2Mi5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICBpZiAodjEgaW5zdGFuY2VvZiBOdW1iZXIgJiYgISh2MSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpKQorICAgICAgICAgICAgICAgIHYxID0gbmV3IEJpZ0RlY2ltYWwoKChOdW1iZXIpIHYxKS5kb3VibGVWYWx1ZSgpKTsKKworICAgICAgICAgICAgaWYgKHYyIGluc3RhbmNlb2YgTnVtYmVyICYmICEodjIgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSkKKyAgICAgICAgICAgICAgICB2MiA9IG5ldyBCaWdEZWNpbWFsKCgoTnVtYmVyKSB2MikuZG91YmxlVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSB2MSkuY29tcGFyZVRvKHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gdmVycy5nZXRDbGFzc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsCisgICAgICAgICAgICB8fCBjbHMuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtYmFzZS12ZXJzIiwgY2xzKSk7CisKKyAgICAgICAgVmVyc2lvbk1hcHBpbmdJbmZvIGluZm8gPSB2ZXJzLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIGluZm8uYXNzZXJ0Tm9Kb2luKHZlcnMsIHRydWUpOworICAgICAgICBpbmZvLmFzc2VydE5vRm9yZWlnbktleSh2ZXJzLCAhYWRhcHQpOworICAgICAgICBpbmZvLmFzc2VydE5vVW5pcXVlKHZlcnMsIGZhbHNlKTsKKworICAgICAgICBDb2x1bW4gdG1wbGF0ZSA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgdG1wbGF0ZS5zZXRKYXZhVHlwZShnZXRKYXZhVHlwZSgpKTsKKyAgICAgICAgdG1wbGF0ZS5zZXROYW1lKCJ2ZXJzbiIpOworCisgICAgICAgIENvbHVtbltdIGNvbHMgPSBpbmZvLmdldENvbHVtbnModmVycywgbmV3IENvbHVtbltdeyB0bXBsYXRlIH0sIGFkYXB0KTsKKyAgICAgICAgdmVycy5zZXRDb2x1bW5zKGNvbHMpOworICAgICAgICB2ZXJzLnNldENvbHVtbklPKGluZm8uZ2V0Q29sdW1uSU8oKSk7CisKKyAgICAgICAgSW5kZXggaWR4ID0gaW5mby5nZXRJbmRleCh2ZXJzLCBjb2xzLCBhZGFwdCk7CisgICAgICAgIHZlcnMuc2V0SW5kZXgoaWR4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHZlcnMuZ2V0Q29sdW1ucygpOworICAgICAgICBDb2x1bW5JTyBpbyA9IHZlcnMuZ2V0Q29sdW1uSU8oKTsKKyAgICAgICAgT2JqZWN0IGluaXRpYWwgPSBuZXh0VmVyc2lvbihudWxsKTsKKyAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyh2ZXJzLmdldENsYXNzTWFwcGluZygpLmdldFRhYmxlKCksCisgICAgICAgICAgICBSb3cuQUNUSU9OX0lOU0VSVCwgc20sIHRydWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoaW8uaXNJbnNlcnRhYmxlKGksIGluaXRpYWwgPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgcm93LnNldE9iamVjdChjb2xzW2ldLCBpbml0aWFsKTsKKworICAgICAgICAvLyBzZXQgaW5pdGlhbCB2ZXJzaW9uIGludG8gc3RhdGUgbWFuYWdlcgorICAgICAgICBPYmplY3QgbmV4dFZlcnNpb247CisgICAgICAgIG5leHRWZXJzaW9uID0gaW5pdGlhbDsKKyAgICAgICAgc20uc2V0TmV4dFZlcnNpb24obmV4dFZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdmVycy5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzID09IG51bGwgfHwgY29scy5sZW5ndGggPT0gMCB8fAorICAgICAgICAgICAgIXNtLmlzRGlydHkoKSAmJiAhc20uaXNWZXJzaW9uVXBkYXRlUmVxdWlyZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBPYmplY3QgY3VyVmVyc2lvbiA9IHNtLmdldFZlcnNpb24oKTsKKyAgICAgICAgT2JqZWN0IG5leHRWZXJzaW9uID0gbmV4dFZlcnNpb24oY3VyVmVyc2lvbik7CisKKyAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyh2ZXJzLmdldENsYXNzTWFwcGluZygpLmdldFRhYmxlKCksCisgICAgICAgICAgICBSb3cuQUNUSU9OX1VQREFURSwgc20sIHRydWUpOworICAgICAgICByb3cuc2V0RmFpbGVkT2JqZWN0KHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKTsKKworICAgICAgICAvLyBzZXQgd2hlcmUgYW5kIHVwZGF0ZSBjb25kaXRpb25zIG9uIHJvdworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdXJWZXJzaW9uICE9IG51bGwgJiYgc20uaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCgpKQorICAgICAgICAgICAgICAgIHJvdy53aGVyZU9iamVjdChjb2xzW2ldLCBjdXJWZXJzaW9uKTsKKyAgICAgICAgICAgIGlmICh2ZXJzLmdldENvbHVtbklPKCkuaXNVcGRhdGFibGUoaSwgbmV4dFZlcnNpb24gPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgcm93LnNldE9iamVjdChjb2xzW2ldLCBuZXh0VmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV4dFZlcnNpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHNtLnNldE5leHRWZXJzaW9uKG5leHRWZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyh2ZXJzLmdldENsYXNzTWFwcGluZygpLmdldFRhYmxlKCksCisgICAgICAgICAgICBSb3cuQUNUSU9OX0RFTEVURSwgc20sIHRydWUpOworICAgICAgICByb3cuc2V0RmFpbGVkT2JqZWN0KHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKTsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHZlcnMuZ2V0Q29sdW1ucygpOworCisgICAgICAgIE9iamVjdCBjdXJWZXJzaW9uID0gc20uZ2V0VmVyc2lvbigpOworICAgICAgICBPYmplY3QgY3VyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAxIHx8IGN1clZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjdXIgPSBjdXJWZXJzaW9uOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN1ciA9ICgoT2JqZWN0W10pIGN1clZlcnNpb24pW2ldOworCisgICAgICAgICAgICAvLyBzZXQgd2hlcmUgYW5kIHVwZGF0ZSBjb25kaXRpb25zIG9uIHJvdworICAgICAgICAgICAgaWYgKGN1ciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJvdy53aGVyZU9iamVjdChjb2xzW2ldLCBjdXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIHNlbC5zZWxlY3QodmVycy5nZXRDb2x1bW5zKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHR5cGljYWxseSBpZiBvbmUgdmVyc2lvbiBjb2x1bW4gaXMgaW4gdGhlIHJlc3VsdCwgdGhleSBhbGwgYXJlLCBzbworICAgICAgICAvLyBvcHRpbWl6ZSBieSBjaGVja2luZyBmb3IgdGhlIGZpcnN0IG9uZSBiZWZvcmUgZG9pbmcgYW55IHJlYWwgd29yaworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdmVycy5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmICghcmVzLmNvbnRhaW5zKGNvbHNbMF0pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9iamVjdCB2ZXJzaW9uID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHZlcnNpb24gPSBuZXcgT2JqZWN0W2NvbHMubGVuZ3RoXTsKKyAgICAgICAgT2JqZWN0IGN1cjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDAgJiYgIXJlcy5jb250YWlucyhjb2xzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjdXIgPSByZXMuZ2V0T2JqZWN0KGNvbHNbaV0sIC0xLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHZlcnNpb24gPSBjdXI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKChPYmplY3RbXSkgdmVyc2lvbilbaV0gPSBjdXI7CisgICAgICAgIH0KKyAgICAgICAgc20uc2V0VmVyc2lvbih2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1ZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBib29sZWFuIHVwZGF0ZVZlcnNpb24pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdmVycy5nZXRDb2x1bW5zKCk7CisgICAgICAgIFNlbGVjdCBzZWwgPSBzdG9yZS5nZXRTUUxGYWN0b3J5KCkubmV3U2VsZWN0KCk7CisgICAgICAgIHNlbC5zZWxlY3QoY29scyk7CisgICAgICAgIHNlbC53aGVyZVByaW1hcnlLZXkoc20uZ2V0T2JqZWN0SWQoKSwgdmVycy5nZXRDbGFzc01hcHBpbmcoKSwgc3RvcmUpOworCisgICAgICAgIFJlc3VsdCByZXMgPSBzZWwuZXhlY3V0ZShzdG9yZSwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXJlcy5uZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBPYmplY3QgbWVtVmVyc2lvbiA9IHNtLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIE9iamVjdCBkYlZlcnNpb24gPSBudWxsOworICAgICAgICAgICAgaWYgKGNvbHMubGVuZ3RoID4gMSkKKyAgICAgICAgICAgICAgICBkYlZlcnNpb24gPSBuZXcgT2JqZWN0W2NvbHMubGVuZ3RoXTsKKworICAgICAgICAgICAgYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7CisgICAgICAgICAgICBPYmplY3QgbWVtLCBkYjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGRiID0gcmVzLmdldE9iamVjdChjb2xzW2ldLCAtMSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgIGRiVmVyc2lvbiA9IGRiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKChPYmplY3RbXSkgZGJWZXJzaW9uKVtpXSA9IGRiOworCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRldGVybWluZWQgdGhhdCB3ZSBuZWVkIGEgcmVmcmVzaCwKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgbWVtIHZlcnNpb24gaXMgZWFybGllciB0aGFuIHRoZSBkYiBvbmUKKyAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHMubGVuZ3RoID09IDEgfHwgbWVtVmVyc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtID0gbWVtVmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtID0gKChPYmplY3RbXSkgbWVtVmVyc2lvbilbaV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbSA9PSBudWxsIHx8IChkYiAhPSBudWxsICYmIGNvbXBhcmUobWVtLCBkYikgPCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVwZGF0ZVZlcnNpb24pCisgICAgICAgICAgICAgICAgc20uc2V0VmVyc2lvbihkYlZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuICFyZWZyZXNoOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVWZXJzaW9uKE9iamVjdCB2MSwgT2JqZWN0IHYyKSB7CisgICAgICAgIGlmICh2MSA9PSB2MikKKyAgICAgICAgICAgIHJldHVybiBTdG9yZU1hbmFnZXIuVkVSU0lPTl9TQU1FOworICAgICAgICBpZiAodjEgPT0gbnVsbCB8fCB2MiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFN0b3JlTWFuYWdlci5WRVJTSU9OX0RJRkZFUkVOVDsKKworICAgICAgICBpbnQgY21wID0gY29tcGFyZSh2MSwgdjIpOworICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBTdG9yZU1hbmFnZXIuVkVSU0lPTl9FQVJMSUVSOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHJldHVybiBTdG9yZU1hbmFnZXIuVkVSU0lPTl9MQVRFUjsKKyAgICAgICAgcmV0dXJuIFN0b3JlTWFuYWdlci5WRVJTSU9OX1NBTUU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Db250YWluZXJGaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0NvbnRhaW5lckZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdhYzZjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Db250YWluZXJGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjb250YWluZXIgbWFwcGluZyB0aGF0IGhhbmRsZXMgdHJhdmVyc2luZyB0aGUKKyAqIGpvaW4gdG8gZXhhbWluZSB0aGUgc2l6ZSBvZiB0aGUgcmVsYXRpb24uCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lckZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0RmllbGRTdHJhdGVneSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIGluZGVwZW5kZW50IG1hcHBpbmdzIHRvIHdoaWNoIHRoaXMgc3RyYXRlZ3kgbXVzdCBqb2luIGluCisgICAgICogb3JkZXIgdG8gYWNjZXNzIGNvbGxlY3Rpb24gZWxlbWVudHMsIG9yIGVtcHR5IGFycmF5IGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhdmVyc2Ugd2hldGhlciB3ZSdyZSB0cmF2ZXJzaW5nIHRocm91Z2ggdG8gdGhlIHJlbGF0ZWQgdHlwZQorICAgICAqIEBzZWUgVmFsdWVNYXBwaW5nI2dldEluZGVwZW5kZW50VHlwZU1hcHBpbmdzCisgICAgICogQHNlZSBDbGFzc01hcHBpbmcjRU1QVFlfTUFQUElOR1MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3MKKyAgICAgICAgKGJvb2xlYW4gdHJhdmVyc2UpOworCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNFbXB0eShTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLCBKb2lucyBqb2lucykgeworICAgICAgICB0ZXN0RW1wdHkoc3FsLCBzZWwsIGpvaW5zLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdEVtcHR5KFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHRlc3RFbXB0eShzcWwsIHNlbCwgam9pbnMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgdGVzdEVtcHR5KHNxbCwgc2VsLCBqb2lucywgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHRlc3RFbXB0eShzcWwsIHNlbCwgam9pbnMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIFNRTCBmb3IgYSBzdWItc2VsZWN0IHRlc3Rpbmcgd2hldGhlciB0aGUgY29udGFpbmVyIGlzIGVtcHR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1wdHkoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMsCisgICAgICAgIGJvb2xlYW4gZW1wdHkpIHsKKyAgICAgICAgaWYgKGVtcHR5KQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiMCA9ICIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kKCIwIDwgIik7CisKKyAgICAgICAgYXBwZW5kU2l6ZShzcWwsIHNlbCwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KCk7CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRTaXplKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gZmllbGQuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGRpY3Quc3VwcG9ydHNTdWJzZWxlY3QsICJTdXBwb3J0c1N1YnNlbGVjdCIpOworCisgICAgICAgIENsYXNzTWFwcGluZ1tdIGluZCA9IGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKGZhbHNlKTsKKyAgICAgICAgaWYgKGluZCAhPSBudWxsICYmIGluZC5sZW5ndGggPiAxKQorICAgICAgICAgICAgdGhyb3cgUmVsYXRpb25TdHJhdGVnaWVzLnVuam9pbmFibGUoZmllbGQpOworCisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBnZXRKb2luRm9yZWlnbktleSgpOworICAgICAgICBhcHBlbmRKb2luQ291bnQoc3FsLCBzZWwsIGpvaW5zLCBkaWN0LCBmaWVsZCwgZmspOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBhcHBlbmRKb2luQ291bnQoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwKKyAgICAgICAgSm9pbnMgam9pbnMsIERCRGljdGlvbmFyeSBkaWN0LCBGaWVsZE1hcHBpbmcgZmllbGQsIEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgU3RyaW5nIGZ1bGxUYWJsZSA9IGRpY3QuZ2V0RnVsbE5hbWUoZmsuZ2V0VGFibGUoKSwgZmFsc2UpOworICAgICAgICBzcWwuYXBwZW5kKCIoU0VMRUNUIENPVU5UKCopIEZST00gIikuYXBwZW5kKGZ1bGxUYWJsZSkuCisgICAgICAgICAgICBhcHBlbmQoIiBXSEVSRSAiKTsKKyAgICAgICAgYXBwZW5kVW5hbGlhc2VkSm9pbihzcWwsIHNlbCwgam9pbnMsIGRpY3QsIGZpZWxkLCBmayk7CisgICAgICAgIHNxbC5hcHBlbmQoIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVW5hbGlhc2VkSm9pbihTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLAorICAgICAgICBKb2lucyBqb2lucywgREJEaWN0aW9uYXJ5IGRpY3QsIEZpZWxkTWFwcGluZyBmaWVsZCwgRm9yZWlnbktleSBmaykgeworICAgICAgICBTdHJpbmcgZnVsbFRhYmxlID0gZGljdC5nZXRGdWxsTmFtZShmay5nZXRUYWJsZSgpLCBmYWxzZSk7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uW10gcGtzID0gZmsuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrLCBjb3VudCsrKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKGZ1bGxUYWJsZSkuYXBwZW5kKCIuIikuYXBwZW5kKGNvbHNbaV0pLmFwcGVuZCgiID0gIikuCisgICAgICAgICAgICAgICAgYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhwa3NbaV0sIGpvaW5zKSk7CisgICAgICAgIH0KKworICAgICAgICBjb2xzID0gZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKywgY291bnQrKykgeworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgQU5EICIpOworICAgICAgICAgICAgc3FsLmFwcGVuZChmdWxsVGFibGUpLmFwcGVuZCgiLiIpLmFwcGVuZChjb2xzW2ldKS5hcHBlbmQoIiA9ICIpLgorICAgICAgICAgICAgICAgIGFwcGVuZFZhbHVlKGZrLmdldENvbnN0YW50KGNvbHNbaV0pLCBjb2xzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHBrcyA9IGZrLmdldENvbnN0YW50UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwa3MubGVuZ3RoOyBpKyssIGNvdW50KyspIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApCisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKHBrc1tpXSwgam9pbnMpKS5hcHBlbmQoIiA9ICIpLgorICAgICAgICAgICAgICAgIGFwcGVuZFZhbHVlKGZrLmdldFByaW1hcnlLZXlDb25zdGFudChwa3NbaV0pLCBwa3NbaV0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9FbWJlZEZpZWxkU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRW1iZWRGaWVsZFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiMGMzNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRW1iZWRGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxNTc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5BcnJheTsKK2ltcG9ydCBqYXZhLnNxbC5CbG9iOworaW1wb3J0IGphdmEuc3FsLkNsb2I7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWU7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5SZWxhdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogTWFwcGluZyBmb3IgYW4gZW1iZWRkZWQgcGVyc2lzdGVudCBvYmplY3QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgRW1iZWRGaWVsZFN0cmF0ZWd5CisgICAgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOU0VSVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChFbWJlZEZpZWxkU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9zeW50aGV0aWMgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRFbWJlZGRlZE1ldGFEYXRhKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWVtYmVkIiwgZmllbGQpKTsKKyAgICAgICAgYXNzZXJ0Tm90TWFwcGVkQnkoKTsKKworICAgICAgICAvLyBtYXAgam9pbiBrZXkgKGlmIGFueSkKKyAgICAgICAgZmllbGQubWFwSm9pbihhZGFwdCwgZmFsc2UpOworICAgICAgICBmaWVsZC5nZXRLZXlNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzCisgICAgICAgICAgICAoZmllbGQuZ2V0S2V5KCksICFhZGFwdCk7CisgICAgICAgIGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzCisgICAgICAgICAgICAoZmllbGQuZ2V0RWxlbWVudCgpLCAhYWRhcHQpOworCisgICAgICAgIFZhbHVlTWFwcGluZ0luZm8gdmluZm8gPSBmaWVsZC5nZXRWYWx1ZUluZm8oKTsKKyAgICAgICAgdmluZm8uYXNzZXJ0Tm9Kb2luKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgdmluZm8uYXNzZXJ0Tm9Gb3JlaWduS2V5KGZpZWxkLCAhYWRhcHQpOworICAgICAgICB2aW5mby5hc3NlcnROb1VuaXF1ZShmaWVsZCwgIWFkYXB0KTsKKyAgICAgICAgdmluZm8uYXNzZXJ0Tm9JbmRleChmaWVsZCwgIWFkYXB0KTsKKworICAgICAgICAvLyBiZWZvcmUgd2UgbWFwIHRoZSBudWxsIGluZGljYXRvciBjb2x1bW4sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIG91cgorICAgICAgICAvLyB2YWx1ZSBpcyBtYXBwZWQgc28gd2UgY2FuIHRlbGwgd2hldGhlciB0aGUgY29sdW1uIGlzIHN5bnRoZXRpYworICAgICAgICBmaWVsZC5nZXRWYWx1ZU1hcHBpbmcoKS5yZXNvbHZlKGZpZWxkLk1PREVfTUVUQSB8IGZpZWxkLk1PREVfTUFQUElORyk7CisgICAgICAgIENvbHVtbiBjb2wgPSB2aW5mby5nZXROdWxsSW5kaWNhdG9yQ29sdW1uKGZpZWxkLCBmaWVsZC5nZXROYW1lKCksCisgICAgICAgICAgICBmaWVsZC5nZXRUYWJsZSgpLCBhZGFwdCk7CisgICAgICAgIGlmIChjb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgZmllbGQuc2V0Q29sdW1ucyhuZXcgQ29sdW1uW117IGNvbCB9KTsKKyAgICAgICAgICAgIGZpZWxkLnNldENvbHVtbklPKHZpbmZvLmdldENvbHVtbklPKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmllbGQubWFwUHJpbWFyeUtleShhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGZpZWxkLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICBfc3ludGhldGljID0gZmFsc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gZG8gYW55IG9mIHRoZSBlbWJlZGRlZCBmaWVsZCBtYXBwaW5ncyB1c2UgdGhpcyBjb2x1bW4/CisgICAgICAgICAgICAvLyBpZiBub3QsIGNvbnNpZGVyIGl0IHN5bnRoZXRpYworICAgICAgICAgICAgQ29sdW1uIGNvbCA9IGNvbHNbMF07CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBmaWVsZC5nZXRFbWJlZGRlZE1hcHBpbmcoKS4KKyAgICAgICAgICAgICAgICBnZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb2xzID0gZmllbGRzW2ldLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xzW2pdLmVxdWFscyhjb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3N5bnRoZXRpYyA9ICFmb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSb3cgcm93ID0gZmllbGQuZ2V0Um93KHNtLCBzdG9yZSwgcm0sIFJvdy5BQ1RJT05fSU5TRVJUKTsKKyAgICAgICAgaWYgKHJvdyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW0gPSBzdG9yZS5nZXRDb250ZXh0KCkuZ2V0U3RhdGVNYW5hZ2VyCisgICAgICAgICAgICAoc20uZmV0Y2hPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICBpbnNlcnQoc20sIGVtLCBzdG9yZSwgcm0sIHJvdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0IGFuIGVtYmVkZGVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duaW5nIHN0YXRlIG1hbmFnZXIKKyAgICAgKiBAcGFyYW0gc20gdGhlIGVtYmVkZGVkIHN0YXRlIG1hbmFnZXIsIG9yIG51bGwgaWYgdGhlIHZhbHVlIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gcm0gdGhlIHJvdyBtYW5hZ2VyCisgICAgICogQHBhcmFtIHJvdyBleHBlY3RlZCByb3cgZm9yIHRoaXMgZW1iZWRkZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtLCBSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IHNtOworICAgICAgICBpZiAoZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIGVtID0gbmV3IE51bGxFbWJlZGRlZFN0YXRlTWFuYWdlcihvd25lciwgZmllbGQpOworICAgICAgICBybSA9IG5ldyBFbWJlZGRlZFJvd01hbmFnZXIocm0sIHJvdyk7CisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZmllbGRzW2ldLmlzQ3VzdG9tSW5zZXJ0KGVtLCBzdG9yZSkpKQorICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5pbnNlcnQoZW0sIHN0b3JlLCBybSk7CisKKyAgICAgICAgaWYgKGZpZWxkLmdldENvbHVtbklPKCkuaXNJbnNlcnRhYmxlKDAsIHRydWUpKQorICAgICAgICAgICAgc2V0TnVsbEluZGljYXRvckNvbHVtbihzbSwgcm93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IHN0b3JlLmdldENvbnRleHQoKS5nZXRTdGF0ZU1hbmFnZXIKKyAgICAgICAgICAgIChzbS5mZXRjaE9iamVjdChmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgIGJvb2xlYW4gbmV3VmFsID0gZW0gPT0gbnVsbCB8fCBlbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5FQ09QWTsKKworICAgICAgICBSb3cgcm93ID0gbnVsbDsKKyAgICAgICAgaWYgKG5ld1ZhbCAmJiBmaWVsZC5nZXRKb2luRm9yZWlnbktleSgpICE9IG51bGwKKyAgICAgICAgICAgICYmIGZpZWxkLmlzSm9pbk91dGVyKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIG91ciByZWNvcmQgaXMgaW4gYW4gb3V0ZXItam9pbmVkIHJlbGF0ZWQgdGFibGUgYW5kIHdlJ3JlIG5vdAorICAgICAgICAgICAgLy8gdXBkYXRpbmcgYW4gZXhpc3RpbmcgdmFsdWUsIGRlbGV0ZSB0aGUgb2xkIG9uZQorICAgICAgICAgICAgUm93IGRlbCA9IHJtLmdldFJvdyhmaWVsZC5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0RFTEVURSwgc20sIHRydWUpOworICAgICAgICAgICAgZGVsLndoZXJlRm9yZWlnbktleShmaWVsZC5nZXRKb2luRm9yZWlnbktleSgpLCBzbSk7CisgICAgICAgICAgICBkZWxldGUoc20sIG51bGwsIHN0b3JlLCBybSwgZGVsKTsKKworICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBuZXcgdmFsdWUKKyAgICAgICAgICAgIHJvdyA9IHJtLmdldFJvdyhmaWVsZC5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0lOU0VSVCwgc20sCisgICAgICAgICAgICAgICAgZW0gIT0gbnVsbCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcm93ID0gcm0uZ2V0Um93KGZpZWxkLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFLCBzbSwgdHJ1ZSk7CisgICAgICAgIGlmIChyb3cgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgaW5zZXJ0KHNtLCBlbSwgc3RvcmUsIHJtLCByb3cpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1cGRhdGUoc20sIGVtLCBzdG9yZSwgcm0sIHJvdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIGFuIGVtYmVkZGVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duaW5nIHN0YXRlIG1hbmFnZXIKKyAgICAgKiBAcGFyYW0gc20gdGhlIGVtYmVkZGVkIHN0YXRlIG1hbmFnZXIsIG9yIG51bGwgaWYgdGhlIHZhbHVlIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gcm0gdGhlIHJvdyBtYW5hZ2VyCisgICAgICogQHBhcmFtIHJvdyBleHBlY3RlZCByb3cgZm9yIHRoaXMgZW1iZWRkZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtLCBSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IHNtOworICAgICAgICBpZiAoZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIGVtID0gbmV3IE51bGxFbWJlZGRlZFN0YXRlTWFuYWdlcihvd25lciwgZmllbGQpOworICAgICAgICBybSA9IG5ldyBFbWJlZGRlZFJvd01hbmFnZXIocm0sIHJvdyk7CisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoZW0uZ2V0RGlydHkoKS5nZXQoaSkKKyAgICAgICAgICAgICAgICAmJiAhZW0uZ2V0Rmx1c2hlZCgpLmdldChpKQorICAgICAgICAgICAgICAgICYmICFCb29sZWFuLlRSVUUuZXF1YWxzKGZpZWxkc1tpXS5pc0N1c3RvbVVwZGF0ZShlbSwgc3RvcmUpKSkKKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0udXBkYXRlKGVtLCBzdG9yZSwgcm0pOworCisgICAgICAgIGlmIChmaWVsZC5nZXRDb2x1bW5JTygpLmlzVXBkYXRhYmxlKDAsIHRydWUpKQorICAgICAgICAgICAgc2V0TnVsbEluZGljYXRvckNvbHVtbihzbSwgcm93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IG51bGw7CisgICAgICAgIGlmIChzbS5nZXRMb2FkZWQoKS5nZXQoZmllbGQuZ2V0SW5kZXgoKSkpCisgICAgICAgICAgICBlbSA9IHN0b3JlLmdldENvbnRleHQoKS5nZXRTdGF0ZU1hbmFnZXIoc20uZmV0Y2hPYmplY3QKKyAgICAgICAgICAgICAgICAoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICBSb3cgcm93ID0gZmllbGQuZ2V0Um93KHNtLCBzdG9yZSwgcm0sIFJvdy5BQ1RJT05fREVMRVRFKTsKKyAgICAgICAgZGVsZXRlKHNtLCBlbSwgc3RvcmUsIHJtLCByb3cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhbiBlbWJlZGRlZCBvYmplY3QgcmVjb3JkLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBvd25pbmcgc3RhdGUgbWFuYWdlcgorICAgICAqIEBwYXJhbSBzbSB0aGUgZW1iZWRkZWQgc3RhdGUgbWFuYWdlciwgb3IgbnVsbCBpZiBub3Qga25vd24KKyAgICAgKiBAcGFyYW0gcm0gdGhlIHJvdyBtYW5hZ2VyCisgICAgICogQHBhcmFtIHJvdyBleHBlY3RlZCByb3cgZm9yIHRoaXMgZW1iZWRkZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtLCBSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcm0gPSBuZXcgRW1iZWRkZWRSb3dNYW5hZ2VyKHJtLCByb3cpOworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHNtID0gbmV3IE51bGxFbWJlZGRlZFN0YXRlTWFuYWdlcihvd25lciwgZmllbGQpOworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBmaWVsZC5nZXRFbWJlZGRlZE1hcHBpbmcoKS5nZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGZpZWxkc1tpXS5pc0N1c3RvbURlbGV0ZShzbSwgc3RvcmUpKSkKKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0uZGVsZXRlKHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvcGVyIG51bGwgaW5kaWNhdG9yIHZhbHVlIGludG8gdGhlIGdpdmVuIHJvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TnVsbEluZGljYXRvckNvbHVtbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFfc3ludGhldGljKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENvbHVtbiBjb2wgPSBmaWVsZC5nZXRDb2x1bW5zKClbMF07CisgICAgICAgIE9iamVjdCB2YWwgPSAoKEVtYmVkZGVkQ2xhc3NTdHJhdGVneSkgZmllbGQuZ2V0RW1iZWRkZWRNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXRTdHJhdGVneSgpKS5nZXROdWxsSW5kaWNhdG9yVmFsdWUoc20pOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByb3cuc2V0TnVsbChjb2wsIHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByb3cuc2V0T2JqZWN0KGNvbCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBpc0N1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IHNtLmdldENvbnRleHQoKS5nZXRTdGF0ZU1hbmFnZXIoc20uZmV0Y2hPYmplY3QKKyAgICAgICAgICAgIChmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgIEJvb2xlYW4gY3VzdG9tID0gaXNDdXN0b20oSU5TRVJULCBzbSwgZW0sIHN0b3JlKTsKKyAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoY3VzdG9tKSAmJiBfc3ludGhldGljKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBjdXN0b207CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW0gPSBzbS5nZXRDb250ZXh0KCkuZ2V0U3RhdGVNYW5hZ2VyKHNtLmZldGNoT2JqZWN0CisgICAgICAgICAgICAoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICBCb29sZWFuIGN1c3RvbSA9IGlzQ3VzdG9tKFVQREFURSwgc20sIGVtLCBzdG9yZSk7CisgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGN1c3RvbSkgJiYgX3N5bnRoZXRpYykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gY3VzdG9tOworICAgIH0KKworICAgIHB1YmxpYyBCb29sZWFuIGlzQ3VzdG9tRGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIGVtID0gc20uZ2V0Q29udGV4dCgpLmdldFN0YXRlTWFuYWdlcihzbS5mZXRjaE9iamVjdAorICAgICAgICAgICAgKGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICAgICAgcmV0dXJuIGlzQ3VzdG9tKERFTEVURSwgc20sIGVtLCBzdG9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFjdGlvbiByZXF1aXJlcyBjdXN0b20gaGFuZGxpbmcgZm9yIGFueSBmaWVsZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBCb29sZWFuIGlzQ3VzdG9tKGludCBhY3Rpb24sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgb3duZXIsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHNtID0gbmV3IE51bGxFbWJlZGRlZFN0YXRlTWFuYWdlcihvd25lciwgZmllbGQpOworICAgICAgICBib29sZWFuIGhhc0N1c3RvbSA9IGZhbHNlOworICAgICAgICBib29sZWFuIGhhc1N0ZCA9IGZhbHNlOworCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgQm9vbGVhbiBjdXN0b20gPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tID0gZmllbGRzW2ldLmlzQ3VzdG9tSW5zZXJ0KHNtLCBzdG9yZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFOgorICAgICAgICAgICAgICAgICAgICBjdXN0b20gPSBmaWVsZHNbaV0uaXNDdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbSA9IGZpZWxkc1tpXS5pc0N1c3RvbURlbGV0ZShzbSwgc3RvcmUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFCb29sZWFuLkZBTFNFLmVxdWFscyhjdXN0b20pKQorICAgICAgICAgICAgICAgIGhhc0N1c3RvbSA9IHRydWU7CisgICAgICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoY3VzdG9tKSkKKyAgICAgICAgICAgICAgICBoYXNTdGQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc0N1c3RvbSAmJiBoYXNTdGQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChoYXNDdXN0b20pID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IHN0b3JlLmdldENvbnRleHQoKS5nZXRTdGF0ZU1hbmFnZXIKKyAgICAgICAgICAgIChzbS5mZXRjaE9iamVjdChmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgIGlmIChlbSA9PSBudWxsKQorICAgICAgICAgICAgZW0gPSBuZXcgTnVsbEVtYmVkZGVkU3RhdGVNYW5hZ2VyKHNtLCBmaWVsZCk7CisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIUJvb2xlYW4uRkFMU0UuZXF1YWxzKGZpZWxkc1tpXS5pc0N1c3RvbUluc2VydChlbSwgc3RvcmUpKSkKKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0uY3VzdG9tSW5zZXJ0KGVtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3VzdG9tVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW0gPSBzdG9yZS5nZXRDb250ZXh0KCkuZ2V0U3RhdGVNYW5hZ2VyCisgICAgICAgICAgICAoc20uZmV0Y2hPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICBpZiAoZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIGVtID0gbmV3IE51bGxFbWJlZGRlZFN0YXRlTWFuYWdlcihzbSwgZmllbGQpOworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSBmaWVsZC5nZXRFbWJlZGRlZE1hcHBpbmcoKS5nZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGVtLmdldERpcnR5KCkuZ2V0KGkpCisgICAgICAgICAgICAgICAgJiYgIWVtLmdldEZsdXNoZWQoKS5nZXQoaSkKKyAgICAgICAgICAgICAgICAmJiAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoZmllbGRzW2ldLmlzQ3VzdG9tVXBkYXRlKGVtLCBzdG9yZSkpKQorICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5jdXN0b21VcGRhdGUoZW0sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21EZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBlbSA9IHN0b3JlLmdldENvbnRleHQoKS5nZXRTdGF0ZU1hbmFnZXIKKyAgICAgICAgICAgIChzbS5mZXRjaE9iamVjdChmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgIGlmIChlbSA9PSBudWxsKQorICAgICAgICAgICAgZW0gPSBuZXcgTnVsbEVtYmVkZGVkU3RhdGVNYW5hZ2VyKHNtLCBmaWVsZCk7CisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIUJvb2xlYW4uRkFMU0UuZXF1YWxzKGZpZWxkc1tpXS5pc0N1c3RvbURlbGV0ZShlbSwgc3RvcmUpKSkKKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0uY3VzdG9tRGVsZXRlKGVtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBzdXBwb3J0c1NlbGVjdChTZWxlY3Qgc2VsLCBpbnQgdHlwZSwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIGlmICh0eXBlID09IFNlbGVjdC5UWVBFX0pPSU5MRVNTICYmIHNlbC5pc1NlbGVjdGVkKGZpZWxkLmdldFRhYmxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2VsZWN0KFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSkgeworICAgICAgICBKb2lucyBqb2lucyA9IGZpZWxkLmpvaW4oc2VsKTsKKyAgICAgICAgc2VsLnNlbGVjdChmaWVsZC5nZXRDb2x1bW5zKCksIGpvaW5zKTsgLy8gbnVsbCBpbmRpY2F0b3IKKworICAgICAgICAvLyBsaW1pdCBlYWdlciBtb2RlIHRvIGpvaW4gYi9jIGF0IHRoaXMgcG9pbnQgdGhlIHNlbGVjdCBoYXMgYmVlbgorICAgICAgICAvLyBtb2RpZmllZCBhbmQgYW4gYXR0ZW1wdCB0byBjbG9uZSBpdCBmb3IgYSB0by1tYW55IGVhZ2VyIHNlbGVjdCBjYW4KKyAgICAgICAgLy8gcmVzdWx0IGluIGEgY2xvbmUgdGhhdCBwcm9kdWNlcyBpbnZhbGlkIFNRTAorICAgICAgICBlYWdlck1vZGUgPSBNYXRoLm1pbihlYWdlck1vZGUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTik7CisgICAgICAgIHNlbC5zZWxlY3QoZmllbGQuZ2V0RW1iZWRkZWRNYXBwaW5nKCksIHNlbC5TVUJTX0VYQUNULCBzdG9yZSwKKyAgICAgICAgICAgIGZldGNoLCBlYWdlck1vZGUsIGpvaW5zKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBCb29sZWFuIGlzTnVsbCA9IGluZGljYXRlc051bGwocmVzKTsKKyAgICAgICAgaWYgKGlzTnVsbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGlzTnVsbCkpIHsKKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0KGZpZWxkLmdldEluZGV4KCksIG51bGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8jIyMgbm90ZTogd2l0aG91dCBhIG51bGwgaW5kaWNhdG9yIGNvbHVtbiwgdGhlIGFib3ZlIGluZGljYXRlc051bGwoKQorICAgICAgICAvLyMjIyBjYWxsIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSwgbWVhbmluZyB3ZSBhbHdheXMgaGF2ZSB0byBhc3N1bWUKKyAgICAgICAgLy8jIyMgd2Ugc2VsZWN0ZWQgdGhlIGVtYmVkZGVkIG9iamVjdCBmaWVsZHMgYW5kIGxvYWQgdGhlIG9iamVjdAorICAgICAgICAvLyMjIyBpbW1lZGlhdGVseTsgdGhpcyB3aWxsIGJlIGluZWZmaWNpZW50IHdoZW4gdGhlIGVtYmVkZGVkIG9iamVjdAorICAgICAgICAvLyMjIyB3YXMgbm90IHNlbGVjdGVkIGFmdGVyIGFsbAorCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHggPSBzdG9yZS5nZXRDb250ZXh0KCk7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW0gPSBjdHguZW1iZWQobnVsbCwgbnVsbCwgc20sIGZpZWxkKTsKKyAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgZW0uZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgT2JqZWN0IGVyZXMsIHByb2Nlc3NlZDsKKyAgICAgICAgYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGVyZXMgPSByZXMuZ2V0RWFnZXIoZmllbGRzW2ldKTsKKyAgICAgICAgICAgIHJlcy5zdGFydERhdGFSZXF1ZXN0KGZpZWxkc1tpXSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChlcmVzID09IHJlcykKKyAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldLmxvYWRFYWdlckpvaW4oZW0sIHN0b3JlLCBmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChlcmVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5sb2FkRWFnZXJQYXJhbGxlbChlbSwgc3RvcmUsIGZldGNoLCBlcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NlZCAhPSBlcmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1dEVhZ2VyKGZpZWxkc1tpXSwgcHJvY2Vzc2VkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldLmxvYWQoZW0sIHN0b3JlLCBmZXRjaCwgcmVzKTsKKyAgICAgICAgICAgICAgICBsb2FkZWQgfD0gZW0uZ2V0TG9hZGVkKCkuZ2V0KGkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZXMuZW5kRGF0YVJlcXVlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFmdGVyIGxvYWRpbmcgZXZlcnl0aGluZyBmcm9tIHJlc3VsdCwgbG9hZCB0aGUgcmVzdCBvZiB0aGUKKyAgICAgICAgLy8gY29uZmlndXJlZCBmaWVsZHMKKyAgICAgICAgaWYgKGxvYWRlZCkKKyAgICAgICAgICAgIGVtLmxvYWQoZmV0Y2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlIGVtYmVkZGVkIHZhbHVlIGlzCisgICAgICogbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rIEJvb2xlYW4jVFJVRX0gaWYgdGhlIHZhbHVlIGlzIG51bGwsIHtAbGluayBCb29sZWFuI0ZBTFNFfQorICAgICAqIGlmIGl0IGlzIG5vdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3VsdCBkb2VzIG5vdAorICAgICAqIGNvbnRhaW4gdGhlIGVtYmVkZGVkIHZhbHVlCisgICAgICovCisgICAgcHJpdmF0ZSBCb29sZWFuIGluZGljYXRlc051bGwoUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBmaWVsZC5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIGlmICghcmVzLmNvbnRhaW5zKGNvbHNbMF0pKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT2JqZWN0IG9iaiA9IHJlcy5nZXRPYmplY3QoY29sc1swXSwgLTEsIChPYmplY3QpIG51bGwpOworICAgICAgICBpZiAoKChFbWJlZGRlZENsYXNzU3RyYXRlZ3kpIGZpZWxkLmdldEVtYmVkZGVkTWFwcGluZygpLmdldFN0cmF0ZWd5KCkpLgorICAgICAgICAgICAgaW5kaWNhdGVzTnVsbChvYmopKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBDbGFzc01hcHBpbmcgdHlwZSA9IGZpZWxkLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiB0eXBlLnRvRGF0YVN0b3JlVmFsdWUodmFsLCB0eXBlLmdldFByaW1hcnlLZXlDb2x1bW5zKCksIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgYXBwZW5kVGVzdE51bGwoc3FsLCBzZWwsIGpvaW5zLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgYXBwZW5kVGVzdE51bGwoc3FsLCBzZWwsIGpvaW5zLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIFNRTCB0byB0ZXN0IHdoZXRoZXIgdGhlIGVtYmVkZGVkIG9iamVjdCBpcyBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUZXN0TnVsbChTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLCBKb2lucyBqb2lucywKKyAgICAgICAgYm9vbGVhbiBpc051bGwpIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGZpZWxkLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoICE9IDEpIHsKKyAgICAgICAgICAgIGlmIChpc051bGwpCisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiMSA8PiAxIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiMSA9IDEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIGlmIChjb2xzWzBdLmlzTm90TnVsbCgpKSB7CisgICAgICAgICAgICBpZiAoX3N5bnRoZXRpYyB8fCBjb2xzWzBdLmdldERlZmF1bHRTdHJpbmcoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHZhbCA9IEphdmFTUUxUeXBlcy5nZXRFbXB0eVZhbHVlKGNvbHNbMF0uZ2V0SmF2YVR5cGUoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsID0gY29sc1swXS5nZXREZWZhdWx0KCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdmFsID0gbnVsbDsKKworICAgICAgICBqb2lucyA9IGpvaW4oam9pbnMsIGZhbHNlKTsKKyAgICAgICAgc3FsLmFwcGVuZChzZWwuZ2V0Q29sdW1uQWxpYXMoY29sc1swXSwgam9pbnMpKTsKKyAgICAgICAgaWYgKGlzTnVsbCAmJiB2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBJUyAiKTsKKyAgICAgICAgZWxzZSBpZiAoaXNOdWxsKQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiID0gIik7CisgICAgICAgIGVsc2UgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiIElTIE5PVCAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiIDw+ICIpOworICAgICAgICBzcWwuYXBwZW5kVmFsdWUodmFsLCBjb2xzWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5qb2luKGpvaW5zLCBmb3JjZU91dGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkUHJvamVjdGlvbihKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtcHJvamVjdC1vd25lZCIsIGZpZWxkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhdGUgbWFuYWdlciB0aGF0IHJlcHJlc2VudHMgYSBudWxsIGVtYmVkZGVkIG9iamVjdC4KKyAgICAgKiBVc2VkIHRvIHVwZGF0ZSBlbWJlZGRlZCBmaWVsZHMgd2hlbiB0aGUgZW1iZWRkZWQgdmFsdWUgaXMgbnVsbC4gVGhpcworICAgICAqIHN0YXRlIG1hbmFnZXIgZG9lc24ndCByZXF1aXJlIGFjY2VzcyB0byB0aGUgb2xkIGVtYmVkZGVkIHZhbHVlLCBiZWNhdXNlCisgICAgICogYWxsIHVwZGF0ZXMgYXJlIGZsdXNoZWQgYmVmb3JlIGFsbCBkZWxldGVzLCBzbyBhbGwgZm9yZWlnbiBrZXlzIHdpbGwKKyAgICAgKiBiZSBwcm9wZXJseSBudWxsZWQgYmVmb3JlIHRoZSByZWxhdGVkIG9iamVjdCBpcyBkZWxldGVkLiBIb3dldmVyLCB0aGlzCisgICAgICogc3RhdGUgbWFuYWdlciBzaG91bGQgbm90IGJlIHVzZWQgaWYgcG9zc2libGUgd2hlbiB0aGUgcGFyZW50IG9iamVjdCBpcworICAgICAqIGJlaW5nIGRlbGV0ZWQ7IGluIHRoYXQgY2FzZSBoYXZpbmcgdGhlIG9yaWdpbmFsIGVtYmVkZGVkIHN0YXRlIG1hbmFnZXIKKyAgICAgKiBpcyBwcmVmZXJhYmxlIHNvIHRoYXQgaXQgY2FuIHNldCBmb3JlaWduIGtleSByZWxhdGlvbnMgdG8gb3JkZXIgREVMRVRFCisgICAgICogc3RhdGVtZW50cyB0byBtZWV0IGNvbnN0cmFpbnRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxFbWJlZGRlZFN0YXRlTWFuYWdlcgorICAgICAgICBpbXBsZW1lbnRzIE9wZW5KUEFTdGF0ZU1hbmFnZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpdFNldCBFTVBUWV9CSVRTRVQgPSBuZXcgQml0U2V0KCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPcGVuSlBBU3RhdGVNYW5hZ2VyIF9vd25lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZU1ldGFEYXRhIF92bWQ7CisgICAgICAgIHByaXZhdGUgQml0U2V0IF9mdWxsID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSB0aGUgb3duZXIgb2YgdGhlIG51bGwvZGVsZXRlZCBlbWJlZGRlZCB2YWx1ZSwKKyAgICAgICAgICogYW5kIHRoZSB2YWx1ZSBtZXRhZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBOdWxsRW1iZWRkZWRTdGF0ZU1hbmFnZXIoT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwKKyAgICAgICAgICAgIFZhbHVlTWV0YURhdGEgdm1kKSB7CisgICAgICAgICAgICBfb3duZXIgPSBvd25lcjsKKyAgICAgICAgICAgIF92bWQgPSB2bWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzIGZvclR5cGUsIFBDU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbG9hZChGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXNzaWduT2JqZWN0SWQoYm9vbGVhbiBmbHVzaCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE1hbmFnZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBlcnNpc3RlbmNlQ2FwYWJsZSBnZXRQZXJzaXN0ZW5jZUNhcGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIF92bWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZ2V0T3duZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gX293bmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZhbHVlTWV0YURhdGEgZ2V0T3duZXJNZXRhRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfdm1kOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2FjdGlvbmFsKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICAgICAgcmV0dXJuIF9vd25lci5pc05ldygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIF9vd25lci5pc0RlbGV0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX293bmVyLmlzRGV0YWNoZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvblVwZGF0ZVJlcXVpcmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIF9vd25lci5pc1ZlcnNpb25VcGRhdGVSZXF1aXJlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfb3duZXIuaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGbHVzaGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIF9vd25lci5pc0ZsdXNoZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmx1c2hlZERpcnR5KCkgeworICAgICAgICAgICAgcmV0dXJuIGlzRmx1c2hlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aXNpb25hbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfb3duZXIuaXNQcm92aXNpb25hbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpdFNldCBnZXRMb2FkZWQoKSB7CisgICAgICAgICAgICAvLyBjb25zaWRlciBldmVyeXRoaW5nIGxvYWRlZAorICAgICAgICAgICAgaWYgKF9mdWxsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF92bWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICAgICAgICAgIF9mdWxsID0gbmV3IEJpdFNldChmbWRzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBfZnVsbC5zZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2Z1bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQml0U2V0IGdldERpcnR5KCkgeworICAgICAgICAgICAgLy8gY29uc2lkZXIgZXZlcnl0aGluZyBkaXJ0eQorICAgICAgICAgICAgaWYgKF9mdWxsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF92bWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICAgICAgICAgIF9mdWxsID0gbmV3IEJpdFNldChmbWRzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBfZnVsbC5zZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2Z1bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQml0U2V0IGdldEZsdXNoZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQklUU0VUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpdFNldCBnZXRVbmxvYWRlZChGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXdQcm94eShpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXdGaWVsZFByb3h5KGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZShpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0b3JlQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9vd25lci5nZXRDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIF9vd25lci5nZXRJZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfb3duZXIuZ2V0T2JqZWN0SWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdElkKE9iamVjdCBvaWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRMb2NrKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NrKE9iamVjdCBsb2NrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihPYmplY3QgdmVyc2lvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0VmVyc2lvbihPYmplY3QgdmVyc2lvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUENTdGF0ZSBnZXRQQ1N0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIChfb3duZXIuaXNEZWxldGVkKCkpID8gUENTdGF0ZS5FREVMRVRFRCA6IFBDU3RhdGUuRUNPUFk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEltcGxEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHNldEltcGxEYXRhKE9iamVjdCBkYXRhLCBib29sZWFuIGNhY2hlYWJsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ltcGxEYXRhQ2FjaGVhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbXBsRGF0YShpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBzZXRJbXBsRGF0YShpbnQgZmllbGQsIE9iamVjdCBkYXRhKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEludGVybWVkaWF0ZShpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW50ZXJtZWRpYXRlKGludCBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGZldGNoQm9vbGVhbkZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGUgZmV0Y2hCeXRlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gKGJ5dGUpIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2hhciBmZXRjaENoYXJGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hhcikgMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAwRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBmZXRjaEZsb2F0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gMEY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGZldGNoSW50RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGZldGNoTG9uZ0ZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIDBMOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2hvcnQgZmV0Y2hTaG9ydEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmdGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBmZXRjaEZpZWxkKGludCBmaWVsZCwgYm9vbGVhbiB0cmFuc2l0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUJvb2xlYW5GaWVsZChpbnQgZmllbGQsIGJvb2xlYW4gZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeXRlRmllbGQoaW50IGZpZWxkLCBieXRlIGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hhckZpZWxkKGludCBmaWVsZCwgY2hhciBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZURvdWJsZUZpZWxkKGludCBmaWVsZCwgZG91YmxlIGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXRGaWVsZChpbnQgZmllbGQsIGZsb2F0IGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlSW50RmllbGQoaW50IGZpZWxkLCBpbnQgZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVMb25nRmllbGQoaW50IGZpZWxkLCBsb25nIGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlT2JqZWN0RmllbGQoaW50IGZpZWxkLCBPYmplY3QgZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVTaG9ydEZpZWxkKGludCBmaWVsZCwgc2hvcnQgZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVTdHJpbmdGaWVsZChpbnQgZmllbGQsIFN0cmluZyBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUZpZWxkKGludCBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGZldGNoQm9vbGVhbihpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlIGZldGNoQnl0ZShpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSkgMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjaGFyIGZldGNoQ2hhcihpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hhcikgMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGUoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gMEQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZmV0Y2hGbG9hdChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAwRjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnQoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGZldGNoTG9uZyhpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAwTDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3QoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzaG9ydCBmZXRjaFNob3J0KGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmcoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZmV0Y2goaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbihpbnQgZmllbGQsIGJvb2xlYW4gZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeXRlKGludCBmaWVsZCwgYnl0ZSBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUNoYXIoaW50IGZpZWxkLCBjaGFyIGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlRG91YmxlKGludCBmaWVsZCwgZG91YmxlIGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXQoaW50IGZpZWxkLCBmbG9hdCBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUludChpbnQgZmllbGQsIGludCBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUxvbmcoaW50IGZpZWxkLCBsb25nIGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlT2JqZWN0KGludCBmaWVsZCwgT2JqZWN0IGV4dGVybmFsVmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlU2hvcnQoaW50IGZpZWxkLCBzaG9ydCBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZVN0cmluZyhpbnQgZmllbGQsIFN0cmluZyBleHRlcm5hbFZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZShpbnQgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGZldGNoSW5pdGlhbEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkaXJ0eShpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlZChpbnQgZmllbGQsIE9iamVjdCByZW1vdmVkLCBib29sZWFuIGtleSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVSZWZyZXNoKGJvb2xlYW4gcmVmcmVzaEFsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGUoaW50IGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBTdGF0ZU1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UENQcmltYXJ5S2V5KE9iamVjdCBvaWQsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RhdGVNYW5hZ2VyIHJlcGxhY2VTdGF0ZU1hbmFnZXIoU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0R2VuZXJpY0NvbnRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlydHkoU3RyaW5nIGZpZWxkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3RJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRPYmplY3RJZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXNzaW5nRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXJpYWxpemluZygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gd3JpdGVEZXRhY2hlZChPYmplY3RPdXRwdXQgb3V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3h5RGV0YWNoZWREZXNlcmlhbGl6ZWQoaW50IGlkeCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXR0aW5nQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgYm9vbGVhbiB2YWwxLCBib29sZWFuIHZhbDIsIGludCBzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0dGluZ0NoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgICAgIGNoYXIgdmFsMSwgY2hhciB2YWwyLCBpbnQgc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldHRpbmdCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBieXRlIHZhbDEsIGJ5dGUgdmFsMiwgaW50IHNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXR0aW5nU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgICAgIHNob3J0IHZhbDEsIHNob3J0IHZhbDIsIGludCBzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0dGluZ0ludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgaW50IHZhbDEsIGludCB2YWwyLCBpbnQgc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldHRpbmdMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBsb25nIHZhbDEsIGxvbmcgdmFsMiwgaW50IHNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXR0aW5nRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgICAgIGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIsIGludCBzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0dGluZ0RvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgZG91YmxlIHZhbDEsIGRvdWJsZSB2YWwyLCBpbnQgc2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldHRpbmdTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgICAgIFN0cmluZyB2YWwxLCBTdHJpbmcgdmFsMiwgaW50IHNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXR0aW5nT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBPYmplY3QgdmFsMSwgT2JqZWN0IHZhbDIsIGludCBzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvdmlkZWRCb29sZWFuRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBib29sZWFuIHZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm92aWRlZENoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgICAgIGNoYXIgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgYnl0ZSB2YWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvdmlkZWRTaG9ydEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgc2hvcnQgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBpbnQgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgbG9uZyB2YWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvdmlkZWRGbG9hdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICAgICAgZmxvYXQgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkRG91YmxlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBkb3VibGUgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2VCb29sZWFuRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNoYXIgcmVwbGFjZUNoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZSByZXBsYWNlQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzaG9ydCByZXBsYWNlU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlcGxhY2VJbnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyByZXBsYWNlTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCByZXBsYWNlRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZG91YmxlIHJlcGxhY2VEb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2VTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlcGxhY2VPYmplY3RGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIHJvdyBtYW5hZ2VyIHR5cGUgdGhhdCB1bndyYXBzIGVtYmVkZGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1iZWRkZWRSb3dNYW5hZ2VyCisgICAgICAgIGltcGxlbWVudHMgUm93TWFuYWdlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSb3dNYW5hZ2VyIF9ybTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSb3cgX3JvdzsKKworICAgICAgICBwdWJsaWMgRW1iZWRkZWRSb3dNYW5hZ2VyKFJvd01hbmFnZXIgZGVsZWdhdGUsIFJvdyByb3cpIHsKKyAgICAgICAgICAgIF9ybSA9IGRlbGVnYXRlOworICAgICAgICAgICAgX3JvdyA9IChyb3cgPT0gbnVsbCkgPyBudWxsIDogbmV3IEVtYmVkZGVkUm93KHJvdyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdXRvQXNzaWduQ29uc3RyYWludHMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRJbnNlcnRzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRVcGRhdGVzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXREZWxldGVzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZWNvbmRhcnlVcGRhdGVzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZWNvbmRhcnlEZWxldGVzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxSb3dVcGRhdGVzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxSb3dEZWxldGVzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUm93IGdldFJvdyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbiwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgICAgICB3aGlsZSAoc20gIT0gbnVsbCAmJiBzbS5nZXRPd25lcigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgc20gPSBzbS5nZXRPd25lcigpOworICAgICAgICAgICAgaWYgKF9yb3cgIT0gbnVsbCAmJiB0YWJsZSA9PSBfcm93LmdldFRhYmxlKCkKKyAgICAgICAgICAgICAgICAmJiBhY3Rpb24gPT0gX3Jvdy5nZXRBY3Rpb24oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX3JvdzsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRSb3coX3JtLmdldFJvdyh0YWJsZSwgYWN0aW9uLCBzbSwgY3JlYXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUm93IGdldFNlY29uZGFyeVJvdyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZFJvdyhfcm0uZ2V0U2Vjb25kYXJ5Um93KHRhYmxlLCBhY3Rpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoU2Vjb25kYXJ5Um93KFJvdyByb3cpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9ybS5mbHVzaFNlY29uZGFyeVJvdygoKEVtYmVkZGVkUm93KSByb3cpLmdldERlbGVnYXRlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJvdyBnZXRBbGxSb3dzKFRhYmxlIHRhYmxlLCBpbnQgYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkUm93KF9ybS5nZXRBbGxSb3dzKHRhYmxlLCBhY3Rpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoQWxsUm93cyhSb3cgcm93KQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm0uZmx1c2hBbGxSb3dzKCgoRW1iZWRkZWRSb3cpIHJvdykuZ2V0RGVsZWdhdGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIHJvdyB0eXBlIHRoYXQgdW53cmFwcyBlbWJlZGRlZCBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVtYmVkZGVkUm93CisgICAgICAgIGltcGxlbWVudHMgUm93IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJvdyBfcm93OworCisgICAgICAgIHB1YmxpYyBFbWJlZGRlZFJvdyhSb3cgZGVsZWdhdGUpIHsKKyAgICAgICAgICAgIF9yb3cgPSBkZWxlZ2F0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSb3cgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3JvdzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jvdy5pc1ZhbGlkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZChib29sZWFuIHZhbGlkKSB7CisgICAgICAgICAgICBfcm93LnNldFZhbGlkKHZhbGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRQcmltYXJ5S2V5KGdldE93bmVyKHNtKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5KENvbHVtbklPIGlvLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldFByaW1hcnlLZXkoaW8sIGdldE93bmVyKHNtKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZVByaW1hcnlLZXkoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZVByaW1hcnlLZXkoZ2V0T3duZXIoc20pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRGb3JlaWduS2V5KGZrLCBnZXRPd25lcihzbSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBDb2x1bW5JTyBpbywKKyAgICAgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0Rm9yZWlnbktleShmaywgaW8sIGdldE93bmVyKHNtKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZUZvcmVpZ25LZXkoZmssIGdldE93bmVyKHNtKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbklkKENvbHVtbiBjb2wsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgICAgICBSZWxhdGlvbklkIHJlbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRSZWxhdGlvbklkKGNvbCwgZ2V0T3duZXIoc20pLCByZWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldE93bmVyKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgICAgIHdoaWxlIChzbSAhPSBudWxsICYmIHNtLmdldE93bmVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzbSA9IHNtLmdldE93bmVyKCk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gUGFzcy10aHJvdWdoIG1ldGhvZHMKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIFRhYmxlIGdldFRhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9yb3cuZ2V0VGFibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIF9yb3cuZ2V0QWN0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcm93LmdldEZhaWxlZE9iamVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmFpbGVkT2JqZWN0KE9iamVjdCBmYWlsZWQpIHsKKyAgICAgICAgICAgIF9yb3cuc2V0RmFpbGVkT2JqZWN0KGZhaWxlZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRQcmltYXJ5S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIF9yb3cuZ2V0UHJpbWFyeUtleSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXJyYXkoQ29sdW1uIGNvbCwgQXJyYXkgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldEFycmF5KGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFzY2lpU3RyZWFtKENvbHVtbiBjb2wsIElucHV0U3RyZWFtIHZhbCwgaW50IGxlbmd0aCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRBc2NpaVN0cmVhbShjb2wsIHZhbCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWwoQ29sdW1uIGNvbCwgQmlnRGVjaW1hbCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0QmlnRGVjaW1hbChjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyKENvbHVtbiBjb2wsIEJpZ0ludGVnZXIgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldEJpZ0ludGVnZXIoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmluYXJ5U3RyZWFtKENvbHVtbiBjb2wsIElucHV0U3RyZWFtIHZhbCwgaW50IGxlbmd0aCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRCaW5hcnlTdHJlYW0oY29sLCB2YWwsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRCbG9iKENvbHVtbiBjb2wsIEJsb2IgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldEJsb2IoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbihDb2x1bW4gY29sLCBib29sZWFuIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRCb29sZWFuKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJ5dGUoQ29sdW1uIGNvbCwgYnl0ZSB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0Qnl0ZShjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRCeXRlcyhDb2x1bW4gY29sLCBieXRlW10gdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldEJ5dGVzKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENhbGVuZGFyKENvbHVtbiBjb2wsIENhbGVuZGFyIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRDYWxlbmRhcihjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGFyKENvbHVtbiBjb2wsIGNoYXIgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldENoYXIoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyU3RyZWFtKENvbHVtbiBjb2wsIFJlYWRlciB2YWwsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0Q2hhcmFjdGVyU3RyZWFtKGNvbCwgdmFsLCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xvYihDb2x1bW4gY29sLCBDbG9iIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRDbG9iKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGUoQ29sdW1uIGNvbCwgRGF0ZSB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0RGF0ZShjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRlKENvbHVtbiBjb2wsIGphdmEuc3FsLkRhdGUgdmFsLCBDYWxlbmRhciBjYWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0RGF0ZShjb2wsIHZhbCwgY2FsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShDb2x1bW4gY29sLCBkb3VibGUgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldERvdWJsZShjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdChDb2x1bW4gY29sLCBmbG9hdCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0RmxvYXQoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW50KENvbHVtbiBjb2wsIGludCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0SW50KGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldExvbmcoQ29sdW1uIGNvbCwgbG9uZyB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0TG9uZyhjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoQ29sdW1uIGNvbCwgTG9jYWxlIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRMb2NhbGUoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TnVsbChDb2x1bW4gY29sKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldE51bGwoY29sKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE51bGwoQ29sdW1uIGNvbCwgYm9vbGVhbiBvdmVycmlkZURlZmF1bHQpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0TnVsbChjb2wsIG92ZXJyaWRlRGVmYXVsdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoQ29sdW1uIGNvbCwgTnVtYmVyIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXROdW1iZXIoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KENvbHVtbiBjb2wsIE9iamVjdCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0T2JqZWN0KGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJhdyhDb2x1bW4gY29sLCBTdHJpbmcgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LnNldFJhdyhjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChDb2x1bW4gY29sLCBzaG9ydCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0U2hvcnQoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKENvbHVtbiBjb2wsIFN0cmluZyB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cuc2V0U3RyaW5nKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoQ29sdW1uIGNvbCwgVGltZSB2YWwsIENhbGVuZGFyIGNhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRUaW1lKGNvbCwgdmFsLCBjYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKENvbHVtbiBjb2wsIFRpbWVzdGFtcCB2YWwsIENhbGVuZGFyIGNhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy5zZXRUaW1lc3RhbXAoY29sLCB2YWwsIGNhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUFycmF5KENvbHVtbiBjb2wsIEFycmF5IHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZUFycmF5KGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlQXNjaWlTdHJlYW0oQ29sdW1uIGNvbCwgSW5wdXRTdHJlYW0gdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlQXNjaWlTdHJlYW0oY29sLCB2YWwsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUJpZ0RlY2ltYWwoQ29sdW1uIGNvbCwgQmlnRGVjaW1hbCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVCaWdEZWNpbWFsKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlQmlnSW50ZWdlcihDb2x1bW4gY29sLCBCaWdJbnRlZ2VyIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZUJpZ0ludGVnZXIoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVCaW5hcnlTdHJlYW0oQ29sdW1uIGNvbCwgSW5wdXRTdHJlYW0gdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlQmluYXJ5U3RyZWFtKGNvbCwgdmFsLCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVCbG9iKENvbHVtbiBjb2wsIEJsb2IgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlQmxvYihjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUJvb2xlYW4oQ29sdW1uIGNvbCwgYm9vbGVhbiB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVCb29sZWFuKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlQnl0ZShDb2x1bW4gY29sLCBieXRlIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZUJ5dGUoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVCeXRlcyhDb2x1bW4gY29sLCBieXRlW10gdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlQnl0ZXMoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVDYWxlbmRhcihDb2x1bW4gY29sLCBDYWxlbmRhciB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVDYWxlbmRhcihjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUNoYXIoQ29sdW1uIGNvbCwgY2hhciB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVDaGFyKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlQ2hhcmFjdGVyU3RyZWFtKENvbHVtbiBjb2wsIFJlYWRlciB2YWwsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVDaGFyYWN0ZXJTdHJlYW0oY29sLCB2YWwsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUNsb2IoQ29sdW1uIGNvbCwgQ2xvYiB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVDbG9iKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlRGF0ZShDb2x1bW4gY29sLCBEYXRlIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZURhdGUoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVEYXRlKENvbHVtbiBjb2wsIGphdmEuc3FsLkRhdGUgdmFsLCBDYWxlbmRhciBjYWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVEYXRlKGNvbCwgdmFsLCBjYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVEb3VibGUoQ29sdW1uIGNvbCwgZG91YmxlIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZURvdWJsZShjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUZsb2F0KENvbHVtbiBjb2wsIGZsb2F0IHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZUZsb2F0KGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlSW50KENvbHVtbiBjb2wsIGludCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVJbnQoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVMb25nKENvbHVtbiBjb2wsIGxvbmcgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlTG9uZyhjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZUxvY2FsZShDb2x1bW4gY29sLCBMb2NhbGUgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlTG9jYWxlKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlTnVsbChDb2x1bW4gY29sKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlTnVsbChjb2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVOdW1iZXIoQ29sdW1uIGNvbCwgTnVtYmVyIHZhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZU51bWJlcihjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZU9iamVjdChDb2x1bW4gY29sLCBPYmplY3QgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlT2JqZWN0KGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlUmF3KENvbHVtbiBjb2wsIFN0cmluZyB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVSYXcoY29sLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmVTaG9ydChDb2x1bW4gY29sLCBzaG9ydCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3cud2hlcmVTaG9ydChjb2wsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZVN0cmluZyhDb2x1bW4gY29sLCBTdHJpbmcgdmFsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlU3RyaW5nKGNvbCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlVGltZShDb2x1bW4gY29sLCBUaW1lIHZhbCwgQ2FsZW5kYXIgY2FsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm93LndoZXJlVGltZShjb2wsIHZhbCwgY2FsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlVGltZXN0YW1wKENvbHVtbiBjb2wsIFRpbWVzdGFtcCB2YWwsIENhbGVuZGFyIGNhbCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3Jvdy53aGVyZVRpbWVzdGFtcChjb2wsIHZhbCwgY2FsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRW1iZWRWYWx1ZUhhbmRsZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRW1iZWRWYWx1ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRjODk5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9FbWJlZFZhbHVlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgZW1iZWRkZWQgdmFsdWUgaGFuZGxlcnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW1iZWRWYWx1ZUhhbmRsZXIKKyAgICBleHRlbmRzIEFic3RyYWN0VmFsdWVIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEVtYmVkVmFsdWVIYW5kbGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIE1hcHMgZW1iZWRkZWQgdmFsdWUgYW5kIGdhdGhlcnMgY29sdW1ucyBhbmQgYXJndW1lbnRzIGludG8gZ2l2ZW4gbGlzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWFwKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIGFkYXB0LCBMaXN0IGNvbHMsIExpc3QgYXJncykgeworICAgICAgICAvLyBoYXZlIHRvIHJlc29sdmUgZW1iZWRkZWQgdmFsdWUgdG8gY29sbGVjdCBpdHMgY29sdW1ucworICAgICAgICB2bS5nZXRFbWJlZGRlZE1hcHBpbmcoKS5yZXNvbHZlKHZtLk1PREVfTUVUQSB8IHZtLk1PREVfTUFQUElORyk7CisKKyAgICAgICAgLy8gZ2F0aGVyIGNvbHVtbnMgYW5kIHJlc3VsdCBhcmd1bWVudHMKKyAgICAgICAgRmllbGRNYXBwaW5nW10gZm1zID0gdm0uZ2V0RW1iZWRkZWRNYXBwaW5nKCkuZ2V0RmllbGRNYXBwaW5ncygpOworICAgICAgICBDb2x1bW5bXSBjdXJDb2xzOworICAgICAgICBPYmplY3RbXSBjdXJBcmdzOworICAgICAgICBDb2x1bW5JTyBjdXJJTzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmbXNbaV0uZ2V0TWFuYWdlbWVudCgpICE9IEZpZWxkTWFwcGluZy5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghKGZtc1tpXS5nZXRTdHJhdGVneSgpaW5zdGFuY2VvZiBFbWJlZGRhYmxlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1lbWJlZGRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgdm0sIGZtc1tpXSkpOworCisgICAgICAgICAgICBjdXJDb2xzID0gKChFbWJlZGRhYmxlKSBmbXNbaV0uZ2V0U3RyYXRlZ3koKSkuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgY3VySU8gPSAoKEVtYmVkZGFibGUpIGZtc1tpXS5nZXRTdHJhdGVneSgpKS5nZXRDb2x1bW5JTygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjdXJDb2xzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW8uc2V0SW5zZXJ0YWJsZShjb2xzLnNpemUoKSwgY3VySU8uaXNJbnNlcnRhYmxlKGosIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgaW8uc2V0TnVsbEluc2VydGFibGUoY29scy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIGN1cklPLmlzSW5zZXJ0YWJsZShqLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgaW8uc2V0VXBkYXRhYmxlKGNvbHMuc2l6ZSgpLCBjdXJJTy5pc1VwZGF0YWJsZShqLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIGlvLnNldE51bGxVcGRhdGFibGUoY29scy5zaXplKCksIGN1cklPLmlzVXBkYXRhYmxlKGosIHRydWUpKTsKKyAgICAgICAgICAgICAgICBjb2xzLmFkZChjdXJDb2xzW2pdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyQXJncyA9ICgoRW1iZWRkYWJsZSkgZm1zW2ldLmdldFN0cmF0ZWd5KCkpLmdldFJlc3VsdEFyZ3VtZW50cygpOworICAgICAgICAgICAgaWYgKGN1ckNvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgYXJncy5hZGQoY3VyQXJncyk7CisgICAgICAgICAgICBlbHNlIGlmIChjdXJDb2xzLmxlbmd0aCA+IDEpCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjdXJDb2xzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBhcmdzLmFkZCgoY3VyQXJncyA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKChPYmplY3RbXSkgY3VyQXJncylbal0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHZhbHVlIHRvIGl0cyBkYXRhc3RvcmUgZXF1aXZhbGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbSBzdGF0ZSBtYW5hZ2VyIGZvciBlbWJlZGRlZCBvYmplY3QKKyAgICAgKiBAcGFyYW0gdm0gb3duaW5nIHZhbHVlCisgICAgICogQHBhcmFtIHN0b3JlIHN0b3JlIG1hbmFnZXIKKyAgICAgKiBAcGFyYW0gY29scyBlbWJlZGRlZCBjb2x1bW5zCisgICAgICogQHBhcmFtIHJ2YWwgcmV0dXJuIGFycmF5IGlmIG11bHRpcGxlIGNvbHVtbnMKKyAgICAgKiBAcGFyYW0gaWR4IGluZGV4IGluIGNvbHVtbnMgYXJyYXkgdG8gc3RhcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBlbSwgVmFsdWVNYXBwaW5nIHZtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIENvbHVtbltdIGNvbHMsIE9iamVjdCBydmFsLCBpbnQgaWR4KSB7CisgICAgICAgIC8vIHNldCByZXN0IG9mIGNvbHVtbnMgZnJvbSBmaWVsZHMKKyAgICAgICAgRmllbGRNYXBwaW5nW10gZm1zID0gdm0uZ2V0RW1iZWRkZWRNYXBwaW5nKCkuZ2V0RmllbGRNYXBwaW5ncygpOworICAgICAgICBPYmplY3QgY3ZhbDsKKyAgICAgICAgQ29sdW1uW10gZWNvbHM7CisgICAgICAgIEVtYmVkZGFibGUgZW1iZWQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1zW2ldLmdldE1hbmFnZW1lbnQoKSAhPSBGaWVsZE1hcHBpbmcuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlbWJlZCA9IChFbWJlZGRhYmxlKSBmbXNbaV0uZ2V0U3RyYXRlZ3koKTsKKyAgICAgICAgICAgIGVjb2xzID0gZW1iZWQuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgaWYgKGVjb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBjdmFsID0gKGVtID09IG51bGwpID8gbnVsbCA6IGVtLmZldGNoKGkpOworICAgICAgICAgICAgY3ZhbCA9IGVtYmVkLnRvRW1iZWRkZWREYXRhU3RvcmVWYWx1ZShjdmFsLCBzdG9yZSk7CisgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICBydmFsID0gY3ZhbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGVjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgICgoT2JqZWN0W10pIHJ2YWwpW2lkeCsrXSA9IGN2YWw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN2YWwsIDAsIHJ2YWwsIGlkeCwgZWNvbHMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZHggKz0gZWNvbHMubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0byBjb252ZXJ0IGEgZGF0YXN0b3JlIHZhbHVlIHRvIGl0cyBvYmplY3QgZXF1aXZhbGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbSBzdGF0ZSBtYW5hZ2VyIGZvciBlbWJlZGRlZCBvYmplY3QKKyAgICAgKiBAcGFyYW0gdm0gb3duaW5nIHZhbHVlCisgICAgICogQHBhcmFtIHZhbCBkYXRhc3RvcmUgdmFsdWUKKyAgICAgKiBAcGFyYW0gc3RvcmUgb3B0aW9uYWwgc3RvcmUgbWFuYWdlcgorICAgICAqIEBwYXJhbSBmZXRjaCBvcHRpb25hbCBmZXRjaCBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIGNvbHMgZW1iZWRkZWQgY29sdW1ucworICAgICAqIEBwYXJhbSBpZHggaW5kZXggaW4gY29sdW1ucyBhcnJheSB0byBzdGFydAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRvT2JqZWN0VmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBlbSwgVmFsdWVNYXBwaW5nIHZtLAorICAgICAgICBPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIENvbHVtbltdIGNvbHMsIGludCBpZHgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmbXMgPSB2bS5nZXRFbWJlZGRlZE1hcHBpbmcoKS5nZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgIEVtYmVkZGFibGUgZW1iZWQ7CisgICAgICAgIE9iamVjdCBjdmFsOworICAgICAgICBDb2x1bW5bXSBlY29sczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmbXNbaV0uZ2V0TWFuYWdlbWVudCgpICE9IEZpZWxkTWFwcGluZy5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZW1iZWQgPSAoRW1iZWRkYWJsZSkgZm1zW2ldLmdldFN0cmF0ZWd5KCk7CisgICAgICAgICAgICBlY29scyA9IGVtYmVkLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgIGlmIChlY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBjdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlkeCA9PSAwICYmIGVjb2xzLmxlbmd0aCA9PSBjb2xzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjdmFsID0gdmFsOworICAgICAgICAgICAgZWxzZSBpZiAoZWNvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgY3ZhbCA9ICgoT2JqZWN0W10pIHZhbClbaWR4KytdOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY3ZhbCA9IG5ldyBPYmplY3RbZWNvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbCwgaWR4LCBjdmFsLCAwLCBlY29scy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlkeCArPSBlY29scy5sZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdG9yZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVtYmVkLmxvYWRFbWJlZGRlZChlbSwgc3RvcmUsIGZldGNoLCBjdmFsKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGN2YWwgPSBlbWJlZC50b0VtYmVkZGVkT2JqZWN0VmFsdWUoY3ZhbCk7CisgICAgICAgICAgICAgICAgZW0uc3RvcmUoZm1zW2ldLmdldEluZGV4KCksIGN2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9FbWJlZGRlZENsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRW1iZWRkZWRDbGFzc1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YzU0NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRW1iZWRkZWRDbGFzc1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIENsYXNzIG1hcHBpbmcgZm9yIGVtYmVkZGVkIG9iamVjdHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEVtYmVkZGVkQ2xhc3NTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RDbGFzc1N0cmF0ZWd5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEVtYmVkZGVkQ2xhc3NTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBWYWx1ZU1hcHBpbmcgdm0gPSBjbHMuZ2V0RW1iZWRkaW5nTWFwcGluZygpOworICAgICAgICBpZiAodm0gPT0gbnVsbCB8fCB2bS5nZXRUeXBlKCkgIT0gY2xzLmdldERlc2NyaWJlZFR5cGUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWVtYmVkIiwgY2xzKSk7CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nSW5mbyBpbmZvID0gY2xzLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIGluZm8uYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzKGNscywgdHJ1ZSk7CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG93bmVyID0gdm0uZ2V0RmllbGRNYXBwaW5nKCkuZ2V0RGVmaW5pbmdNYXBwaW5nKCk7CisgICAgICAgIGNscy5zZXRJZGVudGl0eVR5cGUob3duZXIuZ2V0SWRlbnRpdHlUeXBlKCkpOworICAgICAgICBjbHMuc2V0T2JqZWN0SWRUeXBlKG93bmVyLmdldE9iamVjdElkVHlwZSgpLAorICAgICAgICAgICAgb3duZXIuaXNPYmplY3RJZFR5cGVTaGFyZWQoKSk7CisgICAgICAgIGNscy5zZXRUYWJsZSh2bS5nZXRGaWVsZE1hcHBpbmcoKS5nZXRUYWJsZSgpKTsKKyAgICAgICAgY2xzLnNldFByaW1hcnlLZXlDb2x1bW5zKG93bmVyLmdldFByaW1hcnlLZXlDb2x1bW5zKCkpOworICAgICAgICBjbHMuc2V0Q29sdW1uSU8ob3duZXIuZ2V0Q29sdW1uSU8oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXIgc3ludGhldGljIG51bGwgaW5kaWNhdG9yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXROdWxsSW5kaWNhdG9yVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBDb2x1bW5bXSBjb2xzID0gY2xzLmdldEVtYmVkZGluZ01hcHBpbmcoKS5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChzbSA9PSBudWxsICYmICFjb2xzWzBdLmlzTm90TnVsbCgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChzbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEphdmFTUUxUeXBlcy5nZXRFbXB0eVZhbHVlKGNvbHNbMF0uZ2V0SmF2YVR5cGUoKSk7CisgICAgICAgIHJldHVybiBKYXZhU1FMVHlwZXMuZ2V0Tm9uRW1wdHlWYWx1ZShjb2xzWzBdLmdldEphdmFUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBudWxsIGluZGljYXRvciB2YWx1ZSBtZWFucyB0aGUgb2JqZWN0IGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaW5kaWNhdGVzTnVsbChPYmplY3QgdmFsKSB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBjbHMuZ2V0RW1iZWRkaW5nTWFwcGluZygpLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoY29sc1swXS5pc05vdE51bGwoKQorICAgICAgICAgICAgJiYgdmFsLmVxdWFscyhKYXZhU1FMVHlwZXMuZ2V0RW1wdHlWYWx1ZShjb2xzWzBdLmdldEphdmFUeXBlKCkpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoY29sc1swXS5nZXREZWZhdWx0U3RyaW5nKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgdmFsLnRvU3RyaW5nKCkuZXF1YWxzKGNvbHNbMF0uZ2V0RGVmYXVsdFN0cmluZygpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5T2JqZWN0SWQoYm9vbGVhbiBoYXNBbGwpIHsKKyAgICAgICAgcmV0dXJuIGNscy5nZXRFbWJlZGRpbmdNYXBwaW5nKCkuZ2V0RmllbGRNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXREZWZpbmluZ01hcHBpbmcoKS5pc1ByaW1hcnlLZXlPYmplY3RJZChoYXNBbGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRmxhdENsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvRmxhdENsYXNzU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBlMDEyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9GbGF0Q2xhc3NTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogTWFwcGluZyBmb3IgY2xhc3NlcyBtYXBwZWQgdG8gdGhlaXIgc3VwZXJjbGFzcyB0YWJsZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgRmxhdENsYXNzU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0Q2xhc3NTdHJhdGVneSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBUyA9ICJmbGF0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEZsYXRDbGFzc1N0cmF0ZWd5LmNsYXNzKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBBTElBUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gY2xzLmdldE1hcHBlZFBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKHN1cCA9PSBudWxsIHx8IGNscy5nZXRFbWJlZGRpbmdNZXRhRGF0YSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1zdWIiLCBjbHMpKTsKKworICAgICAgICBDbGFzc01hcHBpbmdJbmZvIGluZm8gPSBjbHMuZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgaW5mby5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMoY2xzLCB0cnVlKTsKKworICAgICAgICBpZiAoaW5mby5nZXRUYWJsZU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBUYWJsZSB0YWJsZSA9IGluZm8uY3JlYXRlVGFibGUoY2xzLCBudWxsLCBpbmZvLmdldFNjaGVtYU5hbWUoKSwKKyAgICAgICAgICAgICAgICBpbmZvLmdldFRhYmxlTmFtZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAodGFibGUgIT0gc3VwLmdldFRhYmxlKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJmbGF0LXRhYmxlIiwgY2xzLAorICAgICAgICAgICAgICAgICAgICB0YWJsZS5nZXRGdWxsTmFtZSgpLCBzdXAuZ2V0VGFibGUoKS5nZXRGdWxsTmFtZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBjbHMuc2V0VGFibGUoc3VwLmdldFRhYmxlKCkpOworICAgICAgICBjbHMuc2V0UHJpbWFyeUtleUNvbHVtbnMoc3VwLmdldFByaW1hcnlLZXlDb2x1bW5zKCkpOworICAgICAgICBjbHMuc2V0Q29sdW1uSU8oc3VwLmdldENvbHVtbklPKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeUtleU9iamVjdElkKGJvb2xlYW4gaGFzQWxsKSB7CisgICAgICAgIHJldHVybiBjbHMuZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpLmlzUHJpbWFyeUtleU9iamVjdElkKGhhc0FsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9GdWxsQ2xhc3NTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9GdWxsQ2xhc3NTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0Z1bGxDbGFzc1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlU3RyYXRlZ2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBNYXBwaW5nIGZvciB3aGVuIHRoZSBjbGFzcyBtYXBzIGFsbCBmaWVsZHMgdG8gaXRzIG93biB0YWJsZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgRnVsbENsYXNzU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0Q2xhc3NTdHJhdGVneSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBUyA9ICJmdWxsIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEZ1bGxDbGFzc1N0cmF0ZWd5LmNsYXNzKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBBTElBUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoY2xzLmdldEVtYmVkZGluZ01ldGFEYXRhKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWZ1bGwiLCBjbHMpKTsKKworICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gY2xzLmdldE1hcHBlZFBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nSW5mbyBpbmZvID0gY2xzLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIGlmIChzdXAgIT0gbnVsbCAmJiBpbmZvLmlzSm9pbmVkU3ViY2xhc3MoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWZ1bGwiLCBjbHMpKTsKKworICAgICAgICBpbmZvLmFzc2VydE5vSm9pbihjbHMsIHRydWUpOworICAgICAgICBpbmZvLmFzc2VydE5vRm9yZWlnbktleShjbHMsICFhZGFwdCk7CisgICAgICAgIGluZm8uYXNzZXJ0Tm9JbmRleChjbHMsIGZhbHNlKTsKKyAgICAgICAgaW5mby5hc3NlcnROb1VuaXF1ZShjbHMsIGZhbHNlKTsKKworICAgICAgICAvLyBmaW5kIGNsYXNzIHRhYmxlCisgICAgICAgIFRhYmxlIHRhYmxlID0gaW5mby5nZXRUYWJsZShjbHMsIGFkYXB0KTsKKworICAgICAgICAvLyBmaW5kIHByaW1hcnkga2V5IGNvbHVtbgorICAgICAgICBDb2x1bW5bXSBwa0NvbHMgPSBudWxsOworICAgICAgICBpZiAoY2xzLmdldElkZW50aXR5VHlwZSgpID09IGNscy5JRF9EQVRBU1RPUkUpIHsKKyAgICAgICAgICAgIENvbHVtbiBpZCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgICAgIGlkLnNldE5hbWUoImlkIik7CisgICAgICAgICAgICBpZC5zZXRKYXZhVHlwZShKYXZhVHlwZXMuTE9ORyk7CisgICAgICAgICAgICBpZiAoY2xzLmdldElkZW50aXR5U3RyYXRlZ3koKSA9PSBWYWx1ZVN0cmF0ZWdpZXMuQVVUT0FTU0lHTikKKyAgICAgICAgICAgICAgICBpZC5zZXRBdXRvQXNzaWduZWQodHJ1ZSk7CisgICAgICAgICAgICBpZC5zZXROb3ROdWxsKHRydWUpOworICAgICAgICAgICAgcGtDb2xzID0gaW5mby5nZXREYXRhU3RvcmVJZENvbHVtbnMoY2xzLCBuZXcgQ29sdW1uW117IGlkIH0sCisgICAgICAgICAgICAgICAgdGFibGUsIGFkYXB0KTsKKyAgICAgICAgICAgIGNscy5zZXRQcmltYXJ5S2V5Q29sdW1ucyhwa0NvbHMpOworICAgICAgICAgICAgY2xzLnNldENvbHVtbklPKGluZm8uZ2V0Q29sdW1uSU8oKSk7CisgICAgICAgIH0KKyAgICAgICAgY2xzLnNldFRhYmxlKHRhYmxlKTsKKworICAgICAgICAvLyBhZGQgYSBwcmltYXJ5IGtleSBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5CisgICAgICAgIFByaW1hcnlLZXkgcGsgPSB0YWJsZS5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgIGlmIChwayA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgcGtuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChhZGFwdCkKKyAgICAgICAgICAgICAgICBwa25hbWUgPSBjbHMuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXRNYXBwaW5nRGVmYXVsdHMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeUtleU5hbWUoY2xzLCB0YWJsZSk7CisgICAgICAgICAgICBwayA9IHRhYmxlLmFkZFByaW1hcnlLZXkocGtuYW1lKTsKKyAgICAgICAgICAgIHBrLnNldExvZ2ljYWwoIWFkYXB0KTsKKyAgICAgICAgICAgIGlmIChwa0NvbHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBway5zZXRDb2x1bW5zKHBrQ29scyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgam9pbmFibGUKKyAgICAgICAgaWYgKGNscy5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01hcHBpbmcuSURfREFUQVNUT1JFKQorICAgICAgICAgICAgY2xzLnNldEpvaW5hYmxlKGNscy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpWzBdLAorICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eUpvaW5hYmxlKGNscykpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRWFnZXJTZWxlY3QoU2VsZWN0IHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBDbGFzc01hcHBpbmcgYmFzZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJvdyByb3cgPSBybS5nZXRSb3coY2xzLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fSU5TRVJULCBzbSwgdHJ1ZSk7CisgICAgICAgIGlmIChjbHMuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gY2xzLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgIHJvdy5zZXRQcmltYXJ5S2V5KGNscy5nZXRDb2x1bW5JTygpLCBzbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJvdyByb3cgPSBybS5nZXRSb3coY2xzLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFLCBzbSwgZmFsc2UpOworICAgICAgICBpZiAocm93ICE9IG51bGwpCisgICAgICAgICAgICByb3cud2hlcmVQcmltYXJ5S2V5KHNtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyhjbHMuZ2V0VGFibGUoKSwgUm93LkFDVElPTl9ERUxFVEUsIHNtLCB0cnVlKTsKKyAgICAgICAgcm93LndoZXJlUHJpbWFyeUtleShzbSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5T2JqZWN0SWQoYm9vbGVhbiBoYXNBbGwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9IYW5kbGVyRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9IYW5kbGVyRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZWM3MzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0hhbmRsZXJGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogTWFwcGluZyBmb3IgYSBzaW5nbGUtdmFsdWVkIGZpZWxkIHRoYXQgZGVsZWdhdGVzIHRvIGEge0BsaW5rIFZhbHVlSGFuZGxlcn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgSGFuZGxlckZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0RmllbGRTdHJhdGVneQorICAgIGltcGxlbWVudHMgSm9pbmFibGUsIEVtYmVkZGFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IE5VTEwgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChIYW5kbGVyRmllbGRTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwcml2YXRlIENvbHVtbltdIF9jb2xzID0gbnVsbDsKKyAgICBwcml2YXRlIENvbHVtbklPIF9pbyA9IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3RbXSBfYXJncyA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9sb2FkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9sb2IgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRIYW5kbGVyKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8taGFuZGxlciIsIGZpZWxkKSk7CisgICAgICAgIGFzc2VydE5vdE1hcHBlZEJ5KCk7CisKKyAgICAgICAgLy8gbWFwIGpvaW4ga2V5IChpZiBhbnkpCisgICAgICAgIGZpZWxkLm1hcEpvaW4oYWRhcHQsIGZhbHNlKTsKKyAgICAgICAgZmllbGQuZ2V0S2V5TWFwcGluZygpLmdldFZhbHVlSW5mbygpLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cworICAgICAgICAgICAgKGZpZWxkLmdldEtleSgpLCAhYWRhcHQpOworICAgICAgICBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFZhbHVlSW5mbygpLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cworICAgICAgICAgICAgKGZpZWxkLmdldEVsZW1lbnQoKSwgIWFkYXB0KTsKKworICAgICAgICBfaW8gPSBuZXcgQ29sdW1uSU8oKTsKKyAgICAgICAgX2NvbHMgPSBIYW5kbGVyU3RyYXRlZ2llcy5tYXAoZmllbGQsIGZpZWxkLmdldE5hbWUoKSwgX2lvLCBhZGFwdCk7CisgICAgICAgIGlmIChmaWVsZC5nZXRWYWx1ZVN0cmF0ZWd5KCkgPT0gVmFsdWVTdHJhdGVnaWVzLkFVVE9BU1NJR04pIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IHNlZSBpZiBhbnkgY29sdW1ucyBhbHJlYWR5IG1hcmtlZCBhdXRvYXNzaWduOyBpZiBub3QgbWFyaworICAgICAgICAgICAgLy8gdGhlbSBhbGwKKyAgICAgICAgICAgIGJvb2xlYW4gbWFya2VkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIW1hcmtlZCAmJiBpIDwgX2NvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKF9jb2xzW2ldLmlzQXV0b0Fzc2lnbmVkKCkpCisgICAgICAgICAgICAgICAgICAgIG1hcmtlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoIW1hcmtlZCkKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBfY29sc1tpXS5zZXRBdXRvQXNzaWduZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgcHJpbWFyeSBrZXkgY29sdW1ucyB0byB0YWJsZSBwayBpZiBsb2dpY2FsCisgICAgICAgIGZpZWxkLm1hcFByaW1hcnlLZXkoYWRhcHQpOworICAgICAgICBQcmltYXJ5S2V5IHBrID0gZmllbGQuZ2V0VGFibGUoKS5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgIGlmIChmaWVsZC5pc1ByaW1hcnlLZXkoKSAmJiBwayAhPSBudWxsICYmIChhZGFwdCB8fCBway5pc0xvZ2ljYWwoKSkpCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHBrLmFkZENvbHVtbihfY29sc1tpXSk7CisKKyAgICAgICAgLy8gc2V0IGpvaW5hYmxlCisgICAgICAgIGlmICghZmllbGQuZ2V0SGFuZGxlcigpLm9iamVjdFZhbHVlUmVxdWlyZXNMb2FkKGZpZWxkKSkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCkuc2V0Sm9pbmFibGUoX2NvbHNbaV0sIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIF9sb2FkID0gZmllbGQuZ2V0SGFuZGxlcigpLm9iamVjdFZhbHVlUmVxdWlyZXNMb2FkKGZpZWxkKTsKKyAgICAgICAgaWYgKF9sb2FkKQorICAgICAgICAgICAgZmllbGQuc2V0VXNlc0ludGVybWVkaWF0ZSh0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFfbG9iICYmIGkgPCBfY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIF9sb2IgPSBfY29sc1tpXS5pc0xvYigpOworCisgICAgICAgIE9iamVjdCBhcmdzID0gZmllbGQuZ2V0SGFuZGxlcigpLmdldFJlc3VsdEFyZ3VtZW50KGZpZWxkKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkKKyAgICAgICAgICAgIF9hcmdzID0gbnVsbDsKKyAgICAgICAgZWxzZSBpZiAoX2NvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICBfYXJncyA9IG5ldyBPYmplY3RbXXsgYXJncyB9OworICAgICAgICBlbHNlCisgICAgICAgICAgICBfYXJncyA9IChPYmplY3RbXSkgYXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IGZpZWxkLmdldFJvdyhzbSwgc3RvcmUsIHJtLCBSb3cuQUNUSU9OX0lOU0VSVCk7CisgICAgICAgIGlmIChyb3cgIT0gbnVsbCkKKyAgICAgICAgICAgIEhhbmRsZXJTdHJhdGVnaWVzLnNldChmaWVsZCwgc20uZmV0Y2goZmllbGQuZ2V0SW5kZXgoKSksIHN0b3JlLAorICAgICAgICAgICAgICAgIHJvdywgX2NvbHMsIF9pbywgZmllbGQuZ2V0TnVsbFZhbHVlKCkgPT0KKyAgICAgICAgICAgICAgICBGaWVsZE1hcHBpbmcuTlVMTF9OT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IGZpZWxkLmdldFJvdyhzbSwgc3RvcmUsIHJtLCBSb3cuQUNUSU9OX1VQREFURSk7CisgICAgICAgIGlmIChyb3cgIT0gbnVsbCkKKyAgICAgICAgICAgIEhhbmRsZXJTdHJhdGVnaWVzLnNldChmaWVsZCwgc20uZmV0Y2goZmllbGQuZ2V0SW5kZXgoKSksIHN0b3JlLAorICAgICAgICAgICAgICAgIHJvdywgX2NvbHMsIF9pbywgZmllbGQuZ2V0TnVsbFZhbHVlKCkgPT0KKyAgICAgICAgICAgICAgICBGaWVsZE1hcHBpbmcuTlVMTF9OT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmllbGQuZGVsZXRlUm93KHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc3VwcG9ydHNTZWxlY3QoU2VsZWN0IHNlbCwgaW50IHR5cGUsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAoKHR5cGUgPT0gU2VsZWN0LlRZUEVfSk9JTkxFU1MgJiYgc2VsLmlzU2VsZWN0ZWQoZmllbGQuZ2V0VGFibGUoKSkpCisgICAgICAgICAgICB8fCAoX2xvYWQgJiYgdHlwZSA9PSBzZWwuVFlQRV9UV09fUEFSVCkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGludCBzZWxlY3QoU2VsZWN0IHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIGlmIChfY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiBzbS5nZXRJbnRlcm1lZGlhdGUoZmllbGQuZ2V0SW5kZXgoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNlbC5pc0Rpc3RpbmN0KCkgJiYgX2xvYiAmJiAhZmllbGQuaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNlbC5zZWxlY3QoX2NvbHMsIGZpZWxkLmpvaW4oc2VsKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9jb2xzLmxlbmd0aCA9PSAwIHx8ICFyZXMuY29udGFpbnNBbGwoX2NvbHMpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9iamVjdCB2YWwgPSBIYW5kbGVyU3RyYXRlZ2llcy5sb2FkRGF0YVN0b3JlKGZpZWxkLCByZXMsIG51bGwsIF9jb2xzKTsKKyAgICAgICAgaWYgKCFfbG9hZCkKKyAgICAgICAgICAgIHNtLnN0b3JlKGZpZWxkLmdldEluZGV4KCksIGZpZWxkLmdldEhhbmRsZXIoKS4KKyAgICAgICAgICAgICAgICB0b09iamVjdFZhbHVlKGZpZWxkLCB2YWwpKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICAgICAgdmFsID0gTlVMTDsKKyAgICAgICAgICAgIHNtLnNldEludGVybWVkaWF0ZShmaWVsZC5nZXRJbmRleCgpLCB2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBldmVuIGlmIG5vIGNvbHVtbnMsIGFsbG93IGEgaGFuZGxlciB0byBsb2FkIGEgZ2VuZXJhdGVkIHZhbHVlCisgICAgICAgIGlmIChfY29scy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgaWYgKF9sb2FkKQorICAgICAgICAgICAgICAgIHNtLnN0b3JlKGZpZWxkLmdldEluZGV4KCksIGZpZWxkLmdldEhhbmRsZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgdG9PYmplY3RWYWx1ZShmaWVsZCwgbnVsbCwgc20sIHN0b3JlLCBmZXRjaCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNtLnN0b3JlKGZpZWxkLmdldEluZGV4KCksIGZpZWxkLmdldEhhbmRsZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgdG9PYmplY3RWYWx1ZShmaWVsZCwgbnVsbCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9hZCBjYWNoZWQgaW50ZXJtZWRpYXRlIHZhbHVlPworICAgICAgICBpZiAoX2xvYWQpIHsKKyAgICAgICAgICAgIE9iamVjdCBkcyA9IHNtLmdldEludGVybWVkaWF0ZShmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIGlmIChkcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGRzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGRzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzbS5zdG9yZShmaWVsZC5nZXRJbmRleCgpLCBmaWVsZC5nZXRIYW5kbGVyKCkuCisgICAgICAgICAgICAgICAgICAgIHRvT2JqZWN0VmFsdWUoZmllbGQsIGRzLCBzbSwgc3RvcmUsIGZldGNoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2VsZWN0IHNlbCA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdTZWxlY3QoKTsKKyAgICAgICAgc2VsLnNlbGVjdChfY29scyk7CisgICAgICAgIGZpZWxkLndoZXJlUHJpbWFyeUtleShzZWwsIHNtLCBzdG9yZSk7CisKKyAgICAgICAgUmVzdWx0IHJlcyA9IHNlbC5leGVjdXRlKHN0b3JlLCBmZXRjaCk7CisgICAgICAgIE9iamVjdCB2YWwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHJlcy5uZXh0KCkpCisgICAgICAgICAgICAgICAgdmFsID0gSGFuZGxlclN0cmF0ZWdpZXMubG9hZERhdGFTdG9yZShmaWVsZCwgcmVzLCBudWxsLCBfY29scyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXMuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRFbWJlZGRlZChzbSwgc3RvcmUsIGZldGNoLCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIEhhbmRsZXJTdHJhdGVnaWVzLnRvRGF0YVN0b3JlVmFsdWUoZmllbGQsIHZhbCwgX2NvbHMsIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgam9pbnMgPSBqb2luKGpvaW5zLCBmYWxzZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgQU5EICIpOworICAgICAgICAgICAgc3FsLmFwcGVuZChzZWwuZ2V0Q29sdW1uQWxpYXMoX2NvbHNbaV0sIGpvaW5zKSkuYXBwZW5kKCIgSVMgIikuCisgICAgICAgICAgICAgICAgYXBwZW5kVmFsdWUobnVsbCwgX2NvbHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGpvaW5zID0gam9pbihqb2lucywgZmFsc2UpOworICAgICAgICBpZiAoX2NvbHMubGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIigiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBPUiAiKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKF9jb2xzW2ldLCBqb2lucykpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiIElTIE5PVCAiKS5hcHBlbmRWYWx1ZShudWxsLCBfY29sc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9jb2xzLmxlbmd0aCA+IDEpCisgICAgICAgICAgICBzcWwuYXBwZW5kKCIpIik7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW4oSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlcikgeworICAgICAgICByZXR1cm4gZmllbGQuam9pbihqb2lucywgZm9yY2VPdXRlciwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luUmVsYXRpb24oSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlciwKKyAgICAgICAgYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICBpZiAodHJhdmVyc2UpCisgICAgICAgICAgICBIYW5kbGVyU3RyYXRlZ2llcy5hc3NlcnRKb2luYWJsZShmaWVsZCk7CisgICAgICAgIHJldHVybiBqb2luczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSGFuZGxlclN0cmF0ZWdpZXMubG9hZE9iamVjdChmaWVsZCwgbnVsbCwgc3RvcmUsIGZldGNoLCByZXMsCisgICAgICAgICAgICBqb2lucywgX2NvbHMsIF9sb2FkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25hYmxlKCkgeworICAgICAgICByZXR1cm4gIV9sb2IgJiYgIWZpZWxkLmlzSm9pbk91dGVyKCkKKyAgICAgICAgICAgICYmIGZpZWxkLmdldEhhbmRsZXIoKS5pc1ZlcnNpb25hYmxlKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0sCisgICAgICAgIE9iamVjdCBwcmV2VmFsdWUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSb3cgcm93ID0gZmllbGQuZ2V0Um93KHNtLCBzdG9yZSwgcm0sIFJvdy5BQ1RJT05fVVBEQVRFKTsKKyAgICAgICAgaWYgKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgSGFuZGxlclN0cmF0ZWdpZXMud2hlcmUoZmllbGQsIHByZXZWYWx1ZSwgc3RvcmUsIHJvdywgX2NvbHMpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpvaW5hYmxlIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgaW50IGdldEZpZWxkSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRJbmRleCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJpbWFyeUtleVZhbHVlKFJlc3VsdCByZXMsIENvbHVtbltdIGNvbHMsIEZvcmVpZ25LZXkgZmssCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW4gY29sOworICAgICAgICBPYmplY3QgdmFsID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIGNvbCA9IGNvbHNbMF07CisgICAgICAgICAgICBpZiAoZmsgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb2wgPSBmay5nZXRDb2x1bW4oY29sKTsKKyAgICAgICAgICAgIHZhbCA9IHJlcy5nZXRPYmplY3QoY29sLCBmaWVsZC5nZXRIYW5kbGVyKCkuCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0QXJndW1lbnQoZmllbGQpLCBqb2lucyk7CisgICAgICAgIH0gZWxzZSBpZiAoY29scy5sZW5ndGggPiAxKSB7CisgICAgICAgICAgICBPYmplY3RbXSB2YWxzID0gbmV3IE9iamVjdFtjb2xzLmxlbmd0aF07CisgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gKE9iamVjdFtdKSBmaWVsZC5nZXRIYW5kbGVyKCkuCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0QXJndW1lbnQoZmllbGQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29sID0gY29sc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZmsgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29sID0gZmsuZ2V0Q29sdW1uKGNvbCk7CisgICAgICAgICAgICAgICAgdmFsc1tpXSA9IHJlcy5nZXRPYmplY3QoY29sLCAoYXJncyA9PSBudWxsKSA/IG51bGwgOiBhcmdzW2ldLAorICAgICAgICAgICAgICAgICAgICBqb2lucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgPSB2YWxzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRIYW5kbGVyKCkudG9PYmplY3RWYWx1ZShmaWVsZCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgcmV0dXJuIF9jb2xzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRSZXN1bHRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBfYXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEpvaW5WYWx1ZShPYmplY3QgZmllbGRWYWwsIENvbHVtbiBjb2wsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBPYmplY3QgdmFsID0gSGFuZGxlclN0cmF0ZWdpZXMudG9EYXRhU3RvcmVWYWx1ZShmaWVsZCwgZmllbGRWYWwsCisgICAgICAgICAgICBfY29scywgc3RvcmUpOworICAgICAgICBpZiAodmFsID09IG51bGwgfHwgX2NvbHMubGVuZ3RoIDwgMikKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChfY29sc1tpXSA9PSBjb2wpCisgICAgICAgICAgICAgICAgcmV0dXJuICgoT2JqZWN0W10pIHZhbClbaV07CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Sm9pblZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENvbHVtbiBjb2wsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gZ2V0Sm9pblZhbHVlKHNtLmZldGNoKGZpZWxkLmdldEluZGV4KCkpLCBjb2wsIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQXNzaWduZWRWYWx1ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIENvbHVtbiBjb2wsIE9iamVjdCBhdXRvSW5jKSB7CisgICAgICAgIE9iamVjdCBkYXRhOworICAgICAgICBpZiAoX2NvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICBkYXRhID0gSmF2YVR5cGVzLmNvbnZlcnQoYXV0b0luYywgY29sLmdldEphdmFUeXBlKCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIG11bHRpcGxlIGNvbHVtbnM7IGhhdmUgdG8gZ2V0IGN1cnJlbnQgdmFsdWUsIHJlcGxhY2UgdGhpcyBjb2wncworICAgICAgICAgICAgLy8gdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gb25lLCBhbmQgcmVzZXQKKyAgICAgICAgICAgIGRhdGEgPSBmaWVsZC5nZXRIYW5kbGVyKCkudG9EYXRhU3RvcmVWYWx1ZShmaWVsZCwKKyAgICAgICAgICAgICAgICBzbS5mZXRjaChmaWVsZC5nZXRJbmRleCgpKSwgc3RvcmUpOworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IE9iamVjdFtfY29scy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChfY29sc1tpXSA9PSBjb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgKChPYmplY3RbXSkgZGF0YSlbaV0gPSBKYXZhVHlwZXMuY29udmVydChhdXRvSW5jLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5nZXRKYXZhVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IHZhbCA9IGZpZWxkLmdldEhhbmRsZXIoKS50b09iamVjdFZhbHVlKGZpZWxkLCBkYXRhKTsKKyAgICAgICAgc20uc3RvcmUoZmllbGQuZ2V0SW5kZXgoKSwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEVtYmVkZGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIENvbHVtbklPIGdldENvbHVtbklPKCkgeworICAgICAgICByZXR1cm4gX2lvOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9FbWJlZGRlZERhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICAvLyBkb24ndCB1c2UgSGFuZGxlclN0cmF0ZWdpZXMudG9EYXRhU3RvcmVWYWx1ZSBiL2Mgd2Ugd2FudCByZWxhdGlvbiBpZHMKKyAgICAgICAgLy8gdG8gYmUgcmVwcmVzZW50ZWQgYnkgc3RhdGUgbWFuYWdlcnMsIG5vdCB0aGUgc2VyaWFsaXplZCBpZCB2YWx1ZQorICAgICAgICB2YWwgPSBmaWVsZC5nZXRIYW5kbGVyKCkudG9EYXRhU3RvcmVWYWx1ZShmaWVsZCwgdmFsLCBzdG9yZSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBfY29scy5sZW5ndGggPiAxKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbX2NvbHMubGVuZ3RoXTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRW1iZWRkZWRPYmplY3RWYWx1ZShPYmplY3QgdmFsKSB7CisgICAgICAgIGlmICghX2xvYWQpCisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0SGFuZGxlcigpLnRvT2JqZWN0VmFsdWUoZmllbGQsIHZhbCk7CisgICAgICAgIHJldHVybiBVTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkRW1iZWRkZWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsICYmIF9jb2xzLmxlbmd0aCA+IDEpCisgICAgICAgICAgICB2YWwgPSBuZXcgT2JqZWN0W19jb2xzLmxlbmd0aF07CisgICAgICAgIGlmIChfbG9hZCkKKyAgICAgICAgICAgIHNtLnN0b3JlKGZpZWxkLmdldEluZGV4KCksIGZpZWxkLmdldEhhbmRsZXIoKS4KKyAgICAgICAgICAgICAgICB0b09iamVjdFZhbHVlKGZpZWxkLCB2YWwsIHNtLCBzdG9yZSwgZmV0Y2gpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc20uc3RvcmUoZmllbGQuZ2V0SW5kZXgoKSwgZmllbGQuZ2V0SGFuZGxlcigpLgorICAgICAgICAgICAgICAgIHRvT2JqZWN0VmFsdWUoZmllbGQsIHZhbCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSGFuZGxlclN0cmF0ZWdpZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSGFuZGxlclN0cmF0ZWdpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGI2YzRkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9IYW5kbGVyU3RyYXRlZ2llcy5qYXZhCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlJlbGF0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3Igc3RyYXRlZ2llcyB1c2luZyB2YWx1ZSBoYW5kbGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBIYW5kbGVyU3RyYXRlZ2llcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChIYW5kbGVyU3RyYXRlZ2llcy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uW10gbWFwKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIFZhbHVlTWFwcGluZ0luZm8gdmluZm8gPSB2bS5nZXRWYWx1ZUluZm8oKTsKKyAgICAgICAgdmluZm8uYXNzZXJ0Tm9Kb2luKHZtLCB0cnVlKTsKKyAgICAgICAgdmluZm8uYXNzZXJ0Tm9Gb3JlaWduS2V5KHZtLCAhYWRhcHQpOworCisgICAgICAgIENvbHVtbltdIGNvbHMgPSB2bS5nZXRIYW5kbGVyKCkubWFwKHZtLCBuYW1lLCBpbywgYWRhcHQpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPiAwICYmIGNvbHNbMF0uZ2V0VGFibGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBjb2xzID0gdmluZm8uZ2V0Q29sdW1ucyh2bSwgbmFtZSwgY29scywKKyAgICAgICAgICAgICAgICB2bS5nZXRGaWVsZE1hcHBpbmcoKS5nZXRUYWJsZSgpLCBhZGFwdCk7CisgICAgICAgICAgICBDb2x1bW5JTyBtYXBwZWRJTyA9IHZpbmZvLmdldENvbHVtbklPKCk7CisgICAgICAgICAgICB2bS5zZXRDb2x1bW5zKGNvbHMpOworICAgICAgICAgICAgdm0uc2V0Q29sdW1uSU8obWFwcGVkSU8pOworICAgICAgICAgICAgaWYgKG1hcHBlZElPICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW8uc2V0SW5zZXJ0YWJsZShpLCBtYXBwZWRJTy5pc0luc2VydGFibGUoaSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgaW8uc2V0TnVsbEluc2VydGFibGUoaSwgbWFwcGVkSU8uaXNJbnNlcnRhYmxlKGksIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgaW8uc2V0VXBkYXRhYmxlKGksIG1hcHBlZElPLmlzVXBkYXRhYmxlKGksIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIGlvLnNldE51bGxVcGRhdGFibGUoaSwgbWFwcGVkSU8uaXNVcGRhdGFibGUoaSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2bS5tYXBDb25zdHJhaW50cyhuYW1lLCBhZGFwdCk7CisgICAgICAgIHJldHVybiBjb2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgZ2l2ZW4gcm93LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIFJvdyByb3csIENvbHVtbltdIGNvbHMsIENvbHVtbklPIGlvLCBib29sZWFuIG51bGxOb25lKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFjYW5TZXRBbnkocm93LCBpbywgY29scykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVmFsdWVIYW5kbGVyIGhhbmRsZXIgPSB2bS5nZXRIYW5kbGVyKCk7CisgICAgICAgIHZhbCA9IGhhbmRsZXIudG9EYXRhU3RvcmVWYWx1ZSh2bSwgdmFsLCBzdG9yZSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChjYW5TZXQocm93LCBpbywgaSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIHNldChyb3csIGNvbHNbaV0sIG51bGwsIGhhbmRsZXIsIG51bGxOb25lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb2xzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoY2FuU2V0KHJvdywgaW8sIDAsIHZhbCA9PSBudWxsKSkKKyAgICAgICAgICAgICAgICBzZXQocm93LCBjb2xzWzBdLCB2YWwsIGhhbmRsZXIsIG51bGxOb25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdFtdIHZhbHMgPSAoT2JqZWN0W10pIHZhbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoY2FuU2V0KHJvdywgaW8sIGksIHZhbHNbaV0gPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgIHNldChyb3csIGNvbHNbaV0sIHZhbHNbaV0sIGhhbmRsZXIsIG51bGxOb25lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggaXMgc2V0dGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5TZXQoUm93IHJvdywgQ29sdW1uSU8gaW8sIGludCBpLAorICAgICAgICBib29sZWFuIG51bGxWYWx1ZSkgeworICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgcmV0dXJuIGlvLmlzSW5zZXJ0YWJsZShpLCBudWxsVmFsdWUpOworICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fVVBEQVRFKQorICAgICAgICAgICAgcmV0dXJuIGlvLmlzVXBkYXRhYmxlKGksIG51bGxWYWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBhbnkgY29sdW1uIHVwIHRvIHRoZSBnaXZlbiBpbmRleCBpcyBzZXR0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblNldEFueShSb3cgcm93LCBDb2x1bW5JTyBpbywgQ29sdW1uW10gY29scykgeworICAgICAgICBpZiAocm93LmdldEFjdGlvbigpID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgcmV0dXJuIGlvLmlzQW55SW5zZXJ0YWJsZShjb2xzLCBmYWxzZSk7CisgICAgICAgIGlmIChyb3cuZ2V0QWN0aW9uKCkgPT0gUm93LkFDVElPTl9VUERBVEUpCisgICAgICAgICAgICByZXR1cm4gaW8uaXNBbnlVcGRhdGFibGUoY29scywgZmFsc2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSB2YWx1ZSBpbnRvIGEgcm93LCB0YWtpbmcgY2FyZSBub3QgdG8gb3ZlcnJpZGUgY29sdW1uIGRlZnVhbHRzCisgICAgICogd2l0aCBudWxscyB1bmxlc3MgdGhlIHVzZXIgd2FudHMgdXMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXQoUm93IHJvdywgQ29sdW1uIGNvbCwgT2JqZWN0IHZhbCwKKyAgICAgICAgVmFsdWVIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gbnVsbE5vbmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByb3cuc2V0TnVsbChjb2wsIG51bGxOb25lKTsKKyAgICAgICAgZWxzZSBpZiAoY29sLmlzUmVsYXRpb25JZCgpICYmIGhhbmRsZXIgaW5zdGFuY2VvZiBSZWxhdGlvbklkKQorICAgICAgICAgICAgcm93LnNldFJlbGF0aW9uSWQoY29sLCAoT3BlbkpQQVN0YXRlTWFuYWdlcikgdmFsLAorICAgICAgICAgICAgICAgIChSZWxhdGlvbklkKSBoYW5kbGVyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm93LnNldE9iamVjdChjb2wsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHdoZXJlIGNvbmRpdGlvbnMgdG8gdGhlIGdpdmVuIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2hlcmUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIFJvdyByb3csIENvbHVtbltdIGNvbHMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YWwgPSB0b0RhdGFTdG9yZVZhbHVlKHZtLCB2YWwsIGNvbHMsIHN0b3JlKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJvdy53aGVyZU51bGwoY29sc1tpXSk7CisgICAgICAgIGVsc2UgaWYgKGNvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICB3aGVyZShyb3csIGNvbHNbMF0sIHZhbCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgT2JqZWN0W10gdmFscyA9IChPYmplY3RbXSkgdmFsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHdoZXJlKHJvdywgY29sc1tpXSwgdmFsc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSB3aGVyZSBjb25kaXRpb24gb24gdGhlIGdpdmVuIHJvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdoZXJlKFJvdyByb3csIENvbHVtbiBjb2wsIE9iamVjdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByb3cud2hlcmVOdWxsKGNvbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJvdy53aGVyZU9iamVjdChjb2wsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgT2JqZWN0IHZhbHVlIGZyb20gdGhlIGdpdmVuIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBsb2FkT2JqZWN0KFZhbHVlTWFwcGluZyB2bSwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLAorICAgICAgICBKb2lucyBqb2lucywgQ29sdW1uW10gY29scywgYm9vbGVhbiBvYmplY3RWYWx1ZVJlcXVpcmVzTG9hZCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1wcm9qZWN0LW93bmVkIiwKKyAgICAgICAgICAgICAgICB2bSkpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBsb2FkRGF0YVN0b3JlKHZtLCByZXMsIGpvaW5zLCBjb2xzKTsKKyAgICAgICAgaWYgKG9iamVjdFZhbHVlUmVxdWlyZXNMb2FkKQorICAgICAgICAgICAgcmV0dXJuIHZtLmdldEhhbmRsZXIoKS50b09iamVjdFZhbHVlKHZtLCB2YWwsIHNtLCBzdG9yZSwgZmV0Y2gpOworICAgICAgICByZXR1cm4gdm0uZ2V0SGFuZGxlcigpLnRvT2JqZWN0VmFsdWUodm0sIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgZGF0YXN0b3JlIHZhbHVlIGZyb20gdGhlIGdpdmVuIHJlc3VsdC4gVGhpcyBtZXRob2QgZG9lcworICAgICAqIDxiPm5vdDwvYj4gcHJvY2VzcyB0aGUgbG9hZGVkIHZhbHVlIHRocm91Z2gKKyAgICAgKiB7QGxpbmsgVmFsdWVIYW5kbGVyI3RvT2JqZWN0VmFsdWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGxvYWREYXRhU3RvcmUoVmFsdWVNYXBwaW5nIHZtLCBSZXN1bHQgcmVzLAorICAgICAgICBKb2lucyBqb2lucywgQ29sdW1uW10gY29scykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIHJlcy5nZXRPYmplY3QoY29sc1swXSwgdm0uZ2V0SGFuZGxlcigpLgorICAgICAgICAgICAgICAgIGdldFJlc3VsdEFyZ3VtZW50KHZtKSwgam9pbnMpOworCisgICAgICAgIE9iamVjdFtdIHZhbHMgPSBuZXcgT2JqZWN0W2NvbHMubGVuZ3RoXTsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IChPYmplY3RbXSkgdm0uZ2V0SGFuZGxlcigpLmdldFJlc3VsdEFyZ3VtZW50KHZtKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdmFsc1tpXSA9IHJlcy5nZXRPYmplY3QoY29sc1tpXSwgKGFyZ3MgPT0gbnVsbCkgPyBudWxsIDogYXJnc1tpXSwKKyAgICAgICAgICAgICAgICBqb2lucyk7CisgICAgICAgIHJldHVybiB2YWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIG9iamVjdCB0byBpdHMgZGF0YXN0b3JlIHZhbHVlKHMpLiBSZWxhdGlvbiBpZHMgYXJlCisgICAgICogY29udmVydGVkIHRvIHRoZWlyIGZpbmFsIHZhbHVlcyBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKFZhbHVlTWFwcGluZyB2bSwgT2JqZWN0IHZhbCwKKyAgICAgICAgQ29sdW1uW10gY29scywgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIFZhbHVlSGFuZGxlciBoYW5kbGVyID0gdm0uZ2V0SGFuZGxlcigpOworICAgICAgICB2YWwgPSBoYW5kbGVyLnRvRGF0YVN0b3JlVmFsdWUodm0sIHZhbCwgc3RvcmUpOworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb2xzLmxlbmd0aCA+IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbY29scy5sZW5ndGhdOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWxhdGlvbiBpZHMgYXJlIHJldHVybmVkIGFzIHN0YXRlIG1hbmFnZXJzOyByZXNvbHZlIHRoZSBmaW5hbAorICAgICAgICAvLyBkYXRhc3RvcmUgdmFsdWUgaW1tZWRpYXRlbHkKKyAgICAgICAgT2JqZWN0W10gdmFsczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWNvbHNbaV0uaXNSZWxhdGlvbklkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIShoYW5kbGVyIGluc3RhbmNlb2YgUmVsYXRpb25JZCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIHZhbCA9ICgoUmVsYXRpb25JZCkgaGFuZGxlcikudG9SZWxhdGlvbkRhdGFTdG9yZVZhbHVlCisgICAgICAgICAgICAgICAgICAgICgoT3BlbkpQQVN0YXRlTWFuYWdlcikgdmFsLCBjb2xzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFscyA9IChPYmplY3RbXSkgdmFsOworICAgICAgICAgICAgICAgIHZhbHNbaV0gPSAoKFJlbGF0aW9uSWQpIGhhbmRsZXIpLnRvUmVsYXRpb25EYXRhU3RvcmVWYWx1ZQorICAgICAgICAgICAgICAgICAgICAoKE9wZW5KUEFTdGF0ZU1hbmFnZXIpIHZhbHNbaV0sIGNvbHNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3cgdGhlIHByb3BlciBleGNlcHRpb24gaWYgdGhlIGdpdmVuIGhhbmRsZXItY29udHJvbGxlZCB2YWx1ZQorICAgICAqIHJlcHJlc2VudHMgYW4gdW5qb2luYWJsZSByZWxhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Sm9pbmFibGUoVmFsdWVNYXBwaW5nIHZtKSB7CisgICAgICAgIENsYXNzTWFwcGluZyByZWwgPSB2bS5nZXRUeXBlTWFwcGluZygpOworICAgICAgICBpZiAocmVsICE9IG51bGwgJiYgKHJlbC5nZXRUYWJsZSgpID09IG51bGwKKyAgICAgICAgICAgIHx8ICFyZWwuZ2V0VGFibGUoKS5lcXVhbHModm0uZ2V0RmllbGRNYXBwaW5nKCkuZ2V0VGFibGUoKSkpKQorICAgICAgICAgICAgdGhyb3cgUmVsYXRpb25TdHJhdGVnaWVzLnVuam9pbmFibGUodm0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSWRlbnRpdHlKb2luYWJsZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9JZGVudGl0eUpvaW5hYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMDRlYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSWRlbnRpdHlKb2luYWJsZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSm9pbmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSWQ7CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICoge0BsaW5rIEpvaW5hYmxlfSBmb3IgdGhlIGRhdGFzdG9yZSBpZGVudGl0eSBjb2x1bW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSWRlbnRpdHlKb2luYWJsZQorICAgIGltcGxlbWVudHMgSm9pbmFibGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01hcHBpbmcgbWFwcGluZzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGF0YXN0b3JlIGlkZW50aXR5IG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIElkZW50aXR5Sm9pbmFibGUoQ2xhc3NNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICAgICAgdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZpZWxkSW5kZXgoKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByaW1hcnlLZXlWYWx1ZShSZXN1bHQgcmVzLCBDb2x1bW5bXSBjb2xzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGNvbHNbMF07CisgICAgICAgIGlmIChmayAhPSBudWxsKQorICAgICAgICAgICAgY29sID0gZmsuZ2V0Q29sdW1uKGNvbCk7CisgICAgICAgIGxvbmcgaWQgPSByZXMuZ2V0TG9uZyhjb2wpOworICAgICAgICBpZiAoaWQgPT0gMCAmJiByZXMud2FzTnVsbCgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoaWQpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKCkgeworICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Sm9pblZhbHVlKE9iamVjdCB2YWwsIENvbHVtbiBjb2wsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Sm9pblZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENvbHVtbiBjb2wsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBJZCBpZCA9IChJZCkgc20uZ2V0T2JqZWN0SWQoKTsKKyAgICAgICAgcmV0dXJuIChpZCA9PSBudWxsKSA/IG51bGwgOiBpZC5nZXRJZE9iamVjdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9Bc3NpZ25lZFZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgQ29sdW1uIGNvbCwgT2JqZWN0IGF1dG9nZW4pIHsKKyAgICAgICAgbG9uZyBpZCA9ICgoTnVtYmVyKSBhdXRvZ2VuKS5sb25nVmFsdWUoKTsKKyAgICAgICAgc20uc2V0T2JqZWN0SWQoc3RvcmUubmV3RGF0YVN0b3JlSWQoaWQsIChDbGFzc01hcHBpbmcpCisgICAgICAgICAgICBzbS5nZXRNZXRhRGF0YSgpLCB0cnVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9JbW11dGFibGVWYWx1ZUhhbmRsZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSW1tdXRhYmxlVmFsdWVIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzMjkzYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSW1tdXRhYmxlVmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworCisvKioKKyAqIEhhbmRsZXIgZm9yIHNpbXBsZSB0eXBlIGFuZCBzdHJpbmcgdmFsdWVzLgorICoKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEltbXV0YWJsZVZhbHVlSGFuZGxlcgorICAgIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZUhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1tdXRhYmxlVmFsdWVIYW5kbGVyIF9pbnN0YW5jZSA9CisgICAgICAgIG5ldyBJbW11dGFibGVWYWx1ZUhhbmRsZXIoKTsKKworICAgIC8qKgorICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltbXV0YWJsZVZhbHVlSGFuZGxlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gbWFwKFZhbHVlTWFwcGluZyB2bSwgU3RyaW5nIG5hbWUsIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGNvbC5zZXROYW1lKG5hbWUpOworICAgICAgICBpZiAodm0uZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuREFURSkKKyAgICAgICAgICAgIGNvbC5zZXRKYXZhVHlwZShKYXZhU1FMVHlwZXMuZ2V0RGF0ZVR5cGVDb2RlKHZtLmdldFR5cGUoKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2wuc2V0SmF2YVR5cGUodm0uZ2V0VHlwZUNvZGUoKSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uW117IGNvbCB9OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbmFibGUoVmFsdWVNYXBwaW5nIHZtKSB7CisgICAgICAgIHN3aXRjaCAodm0uZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTl9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVJfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkdfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0lOVEVHRVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT0NBTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdmFsOworCisgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IHZtLmdldEZpZWxkTWFwcGluZygpOworICAgICAgICBpZiAoZmllbGQuZ2V0TnVsbFZhbHVlKCkgIT0gRmllbGRNYXBwaW5nLk5VTExfREVGQVVMVCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENvbHVtbltdIGNvbHMgPSB2bS5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzWzBdLmdldERlZmF1bHRTdHJpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gaG9ub3IgdGhlIHVzZXIncyBudWxsLXZhbHVlPWRlZmF1bHQKKyAgICAgICAgcmV0dXJuIEphdmFTUUxUeXBlcy5nZXRFbXB0eVZhbHVlKHZtLmdldFR5cGVDb2RlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSW5WYWx1ZURpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9JblZhbHVlRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwZjE0MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvSW5WYWx1ZURpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRpc2NyaW1pbmF0b3JNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogQmFzZSBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5IHRoYXQgZGV0ZXJtaW5lcyB0aGUgY2xhc3Mgb2YgZGF0YWJhc2UKKyAqIHJlY29yZHMgdXNpbmcgYSBjb2x1bW4gaG9sZGluZyBhIHZhbHVlIG1hcHBlZCB0byBhIGNsYXNzLCBhbmQgbGltaXRzCisgKiBTRUxFQ1RzIHVzaW5nIGFuIElOICguLi4pIHN0YXRlbWVudC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5WYWx1ZURpc2NyaW1pbmF0b3JTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3REaXNjcmltaW5hdG9yU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoSW5WYWx1ZURpc2NyaW1pbmF0b3JTdHJhdGVneS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBjb2RlIGZyb20ge0BsaW5rIEphdmFUeXBlc30gZm9yIHRoZSBkaXNjcmltaW5hdG9yCisgICAgICogdmFsdWVzLiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZHVyaW5nIG1hcHBpbmcgaW5zdGFsbGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0SmF2YVR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXREaXNjcmltaW5hdG9yVmFsdWUoQ2xhc3NNYXBwaW5nIGNscyk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBkaXNjcmltaW5hdG9yIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDbGFzcyBnZXRDbGFzcyhPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgbWFwKGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCk7CisgICAgICAgIGlmIChjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbAorICAgICAgICAgICAgfHwgY2xzLmdldEVtYmVkZGluZ01ldGFEYXRhKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWJhc2UtZGlzYyIsIGNscykpOworCisgICAgICAgIERpc2NyaW1pbmF0b3JNYXBwaW5nSW5mbyBpbmZvID0gZGlzYy5nZXRNYXBwaW5nSW5mbygpOworICAgICAgICBpbmZvLmFzc2VydE5vSm9pbihkaXNjLCB0cnVlKTsKKyAgICAgICAgaW5mby5hc3NlcnROb0ZvcmVpZ25LZXkoZGlzYywgIWFkYXB0KTsKKyAgICAgICAgaW5mby5hc3NlcnROb1VuaXF1ZShkaXNjLCBmYWxzZSk7CisKKyAgICAgICAgQ29sdW1uIHRtcGxhdGUgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIHRtcGxhdGUuc2V0SmF2YVR5cGUoZ2V0SmF2YVR5cGUoKSk7CisgICAgICAgIHRtcGxhdGUuc2V0TmFtZSgidHlwIik7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGluZm8uZ2V0Q29sdW1ucyhkaXNjLCBuZXcgQ29sdW1uW117IHRtcGxhdGUgfSwgYWRhcHQpOworICAgICAgICBkaXNjLnNldENvbHVtbnMoY29scyk7CisgICAgICAgIGRpc2Muc2V0Q29sdW1uSU8oaW5mby5nZXRDb2x1bW5JTygpKTsKKworICAgICAgICBJbmRleCBpZHggPSBpbmZvLmdldEluZGV4KGRpc2MsIGNvbHMsIGFkYXB0KTsKKyAgICAgICAgZGlzYy5zZXRJbmRleChpZHgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSb3cgcm93ID0gcm0uZ2V0Um93KGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0VGFibGUoKSwKKyAgICAgICAgICAgIFJvdy5BQ1RJT05fSU5TRVJULCBzbSwgdHJ1ZSk7CisgICAgICAgIE9iamVjdCBjbHMgPSBnZXREaXNjcmltaW5hdG9yVmFsdWUoKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKSk7CisgICAgICAgIGlmIChkaXNjLmdldENvbHVtbklPKCkuaXNJbnNlcnRhYmxlKDAsIGNscyA9PSBudWxsKSkKKyAgICAgICAgICAgIHJvdy5zZXRPYmplY3QoZGlzYy5nZXRDb2x1bW5zKClbMF0sIGNscyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIGlmIChpc0ZpbmFsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzZWwuc2VsZWN0KGRpc2MuZ2V0Q29sdW1ucygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldENsYXNzKEpEQkNTdG9yZSBzdG9yZSwgQ2xhc3NNYXBwaW5nIGJhc2UsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNGaW5hbCB8fCAhcmVzLmNvbnRhaW5zKGRpc2MuZ2V0Q29sdW1ucygpWzBdKQorICAgICAgICAgICAgfHwgKGJhc2UuZ2V0UENTdXBlcmNsYXNzKCkgPT0gbnVsbAorICAgICAgICAgICAgJiYgYmFzZS5nZXRKb2luYWJsZVBDU3ViY2xhc3NNYXBwaW5ncygpLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiBiYXNlLmdldERlc2NyaWJlZFR5cGUoKTsKKworICAgICAgICBPYmplY3QgY2xzID0gcmVzLmdldE9iamVjdChkaXNjLmdldENvbHVtbnMoKVswXSwgLTEsIG51bGwpOworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoY2xzLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NDb25kaXRpb25zKENsYXNzTWFwcGluZyBiYXNlLCBib29sZWFuIHN1YmNsYXNzZXMpIHsKKyAgICAgICAgLy8gaWYgc2VsZWN0aW5nIHRoZSBmaXJzdCBtYXBwZWQgY2xhc3MgYW5kIGFsbCBzdWJjbGFzc2VzLCBubyBuZWVkCisgICAgICAgIC8vIHRvIGxpbWl0IHRoZSBxdWVyeQorICAgICAgICBpZiAoaXNGaW5hbCB8fCAoYmFzZS5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSA9PSBudWxsCisgICAgICAgICAgICAmJiBzdWJjbGFzc2VzKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBpZiBubyBzdWJjbGFzc2VzIG9yIHN1cGVyY2xhc3MsIG5vIG5lZWQgZm9yIGNvbmRpdGlvbnMKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gc3VicyA9IGJhc2UuZ2V0Sm9pbmFibGVQQ1N1YmNsYXNzTWFwcGluZ3MoKTsKKyAgICAgICAgaWYgKHN1YnMubGVuZ3RoID09IDAgJiYgYmFzZS5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0Q2xhc3NDb25kaXRpb25zKFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zLCAKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGJhc2UsIGJvb2xlYW4gc3ViY2xhc3NlcykgeworICAgICAgICBDb2x1bW4gY29sID0gZGlzYy5nZXRDb2x1bW5zKClbMF07CisgICAgICAgIFNRTEJ1ZmZlciBzcWwgPSBuZXcgU1FMQnVmZmVyKHNlbC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpKTsKKyAgICAgICAgYm9vbGVhbiBvdXRlciA9IGpvaW5zICE9IG51bGwgJiYgam9pbnMuaXNPdXRlcigpOworICAgICAgICBpZiAob3V0ZXIpCisgICAgICAgICAgICBzcWwuYXBwZW5kKCIoIik7CisgICAgICAgIFN0cmluZyBhbGlhcyA9IHNlbC5nZXRDb2x1bW5BbGlhcyhjb2wsIGpvaW5zKTsKKyAgICAgICAgc3FsLmFwcGVuZChhbGlhcyk7CisKKyAgICAgICAgLy8gaWYgbm90IHNlbGVjdGluZyBzdWJjbGFzc2VzLCBsaW1pdCB0byBqdXN0IHRoZSBnaXZlbiBjbGFzcworICAgICAgICBDbGFzc01hcHBpbmdbXSBzdWJzID0gYmFzZS5nZXRKb2luYWJsZVBDU3ViY2xhc3NNYXBwaW5ncygpOworICAgICAgICBpZiAoIW91dGVyICYmICghc3ViY2xhc3NlcyB8fCBzdWJzLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiBzcWwuYXBwZW5kKCIgPSAiKS5hcHBlbmRWYWx1ZShnZXREaXNjcmltaW5hdG9yVmFsdWUoYmFzZSksCisgICAgICAgICAgICAgICAgY29sKTsKKworICAgICAgICBpZiAob3V0ZXIpCisgICAgICAgICAgICBzcWwuYXBwZW5kKCIgSVMgIikuYXBwZW5kVmFsdWUobnVsbCkuYXBwZW5kKCIgT1IgIikuYXBwZW5kKGFsaWFzKTsKKyAgICAgICAgc3FsLmFwcGVuZCgiIElOICgiKTsKKyAgICAgICAgc3FsLmFwcGVuZFZhbHVlKGdldERpc2NyaW1pbmF0b3JWYWx1ZShiYXNlKSwgY29sKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKS5hcHBlbmRWYWx1ZShnZXREaXNjcmltaW5hdG9yVmFsdWUoc3Vic1tpXSksIGNvbCk7CisgICAgICAgIHNxbC5hcHBlbmQoIikiKTsKKyAgICAgICAgaWYgKG91dGVyKQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gc3FsOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTFJTQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTFJTQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ0MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9MUlNDb2xsZWN0aW9uRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworCisvKioKKyAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBjb2xsZWN0aW9uIHN0cmF0ZWdpZXMgc28gdGhhdCB0aGV5IGNhbgorICogc3VwcG9ydCBsYXJnZSByZXN1bHQgc2V0IGNvbGxlY3Rpb25zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTFJTQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIEZpZWxkU3RyYXRlZ3kgeworCisgICAgLyoqCisgICAgICogVGhlIG93bmluZyBmaWVsZCBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIGluZGVwZW5kZW50IG1hcHBpbmdzIHRvIHdoaWNoIHRoaXMgc3RyYXRlZ3kgbXVzdCBqb2luIGluCisgICAgICogb3JkZXIgdG8gYWNjZXNzIGNvbGxlY3Rpb24gZWxlbWVudHMsIG9yIGVtcHR5IGFycmF5IGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhdmVyc2Ugd2hldGhlciB3ZSdyZSB0cmF2ZXJzaW5nIHRocm91Z2ggdG8gdGhlIHJlbGF0ZWQgdHlwZQorICAgICAqIEBzZWUgVmFsdWVNYXBwaW5nI2dldEluZGVwZW5kZW50VHlwZU1hcHBpbmdzCisgICAgICogQHNlZSBDbGFzc01hcHBpbmcjRU1QVFlfTUFQUElOR1MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHVzZWQgdG8gam9pbiB0byB0aGUgb3duaW5nIGZpZWxkIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBlbGVtZW50IG1hcHBpbmcgZnJvbSB7QGxpbmsgI2dldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzfSAob3IgbnVsbCkuCisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pbkZvcmVpZ25LZXkoQ2xhc3NNYXBwaW5nIGVsZW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW5zIGhvbGRpbmcgdGhlIGRhdGEgZm9yIGEgY29sbGVjdGlvbiBlbGVtZW50IGZvciB0aGUKKyAgICAgKiBnaXZlbiBlbGVtZW50IG1hcHBpbmcgZnJvbSB7QGxpbmsgI2dldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzfQorICAgICAqIChvciBudWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0RWxlbWVudENvbHVtbnMoQ2xhc3NNYXBwaW5nIGVsZW0pOworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNlbGVjdCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBmb3IgdGhlCisgICAgICogZ2l2ZW4gZWxlbWVudCBtYXBwaW5nIGZyb20ge0BsaW5rICNnZXRJbmRlcGVuZGVudEVsZW1lbnRNYXBwaW5nc30KKyAgICAgKiAob3IgbnVsbCkuIEVsZW1lbnRzIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBsb2FkZWQgd2l0aAorICAgICAqIHtAbGluayAjbG9hZEVsZW1lbnR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVsZW1lbnQoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGVsZW0sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSwKKyAgICAgICAgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogTG9hZCBhbiBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uLiBUaGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciBtaWdodCBiZQorICAgICAqIG51bGwgaWYgdGhlIGxvYWQgaXMgZm9yIGEgcHJvamVjdGlvbiBvciBmb3IgcHJvY2Vzc2luZyBlYWdlciBwYXJhbGxlbAorICAgICAqIHJlc3VsdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb2FkRWxlbWVudChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGlzIHZhbHVlJ3MgdGFibGUgdG8gdGhlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBtYXBwaW5nCisgICAgICogZnJvbSB7QGxpbmsgI2dldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzfSAob3IgbnVsbCkuCisgICAgICoKKyAgICAgKiBAc2VlIEZpZWxkTWFwcGluZyNqb2luUmVsYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pbkVsZW1lbnRSZWxhdGlvbihKb2lucyBqb2lucywgQ2xhc3NNYXBwaW5nIGVsZW0pOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9MUlNNYXBGaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL0xSU01hcEZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWY1NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9MUlNNYXBGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworCisvKioKKyAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBtYXAgc3RyYXRlZ2llcyBzbyB0aGF0IHRoZXkgY2FuCisgKiBzdXBwb3J0IGxhcmdlIHJlc3VsdCBzZXQgbWFwcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIExSU01hcEZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIEZpZWxkU3RyYXRlZ3kgeworCisgICAgLyoqCisgICAgICogVGhlIG93bmluZyBmaWVsZCBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIGluZGVwZW5kZW50IG1hcHBpbmdzIHRvIHdoaWNoIHRoaXMgc3RyYXRlZ3kgbXVzdCBqb2luIGluCisgICAgICogb3JkZXIgdG8gYWNjZXNzIG1hcCBrZXlzLCBvciBlbXB0eSBhcnJheSBpZiBub25lLgorICAgICAqCisgICAgICogQHNlZSBWYWx1ZU1hcHBpbmcjZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MKKyAgICAgKiBAc2VlIENsYXNzTWFwcGluZyNFTVBUWV9NQVBQSU5HUworICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmdbXSBnZXRJbmRlcGVuZGVudEtleU1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBpbmRlcGVuZGVudCBtYXBwaW5ncyB0byB3aGljaCB0aGlzIHN0cmF0ZWd5IG11c3Qgam9pbiBpbgorICAgICAqIG9yZGVyIHRvIGFjY2VzcyBtYXAgdmFsdWVzLCBvciBlbXB0eSBhcnJheSBpZiBub25lLgorICAgICAqCisgICAgICogQHNlZSBWYWx1ZU1hcHBpbmcjZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MKKyAgICAgKiBAc2VlIENsYXNzTWFwcGluZyNFTVBUWV9NQVBQSU5HUworICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmdbXSBnZXRJbmRlcGVuZGVudFZhbHVlTWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHVzZWQgdG8gam9pbiB0byB0aGUgb3duaW5nIGZpZWxkIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBtYXBwaW5nIGZyb20gZWl0aGVyIHtAbGluayAjZ2V0SW5kZXBlbmRlbnRLZXlNYXBwaW5nc30gb3IKKyAgICAgKiB7QGxpbmsgI2dldEluZGVwZW5kZW50VmFsdWVNYXBwaW5nc30gKG9yIG51bGwpLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KENsYXNzTWFwcGluZyBjbHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW5zIGhvbGRpbmcgZGF0YSBmb3IgYSBtYXAga2V5IGZvciB0aGUgZ2l2ZW4ga2V5IG1hcHBpbmcKKyAgICAgKiBmcm9tIHtAbGluayAjZ2V0SW5kZXBlbmRlbnRLZXlNYXBwaW5nc30gb3IKKyAgICAgKiB7QGxpbmsgI2dldEluZGVwZW5kZW50VmFsdWVNYXBwaW5nc30gKG9yIG51bGwpLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRLZXlDb2x1bW5zKENsYXNzTWFwcGluZyBjbHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW5zIGhvbGRpbmcgZGF0YSBmb3IgYSBtYXAgdmFsdWUgZm9yIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqIG1hcHBpbmcgZnJvbSB7QGxpbmsgI2dldEluZGVwZW5kZW50S2V5TWFwcGluZ3N9IG9yCisgICAgICoge0BsaW5rICNnZXRJbmRlcGVuZGVudFZhbHVlTWFwcGluZ3N9IChvciBudWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0VmFsdWVDb2x1bW5zKENsYXNzTWFwcGluZyBjbHMpOworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNlbGVjdCB0aGUga2V5cyBvZiB0aGlzIGZpZWxkLgorICAgICAqIEVsZW1lbnRzIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBsb2FkZWQgd2l0aCB7QGxpbmsgI2xvYWRLZXl9LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBpZiB0aGUga2V5IGlzIG5vdCBkZXJpdmVkIGZyb20gdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEtleShTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcga2V5LCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIExvYWQgYSBrZXkgZnJvbSB0aGUgZ2l2ZW4gcmVzdWx0LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBpZiB0aGUga2V5IGlzIG5vdCBkZXJpdmVkIGZyb20gdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9hZEtleShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU29tZSBtYXBwaW5nIGRlcml2ZSBrZXlzIGZyb20gbWFwIHZhbHVlcy4gT3RoZXIgbWFwcGluZ3MgbWF5IHJldHVybiBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZGVyaXZlS2V5KEpEQkNTdG9yZSBzdG9yZSwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNvbWUgbWFwcGluZyBkZXJpdmUgdmFsdWVzIGZyb20gbWFwIGtleXMuIE90aGVyIG1hcHBpbmdzIG1heSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGRlcml2ZVZhbHVlKEpEQkNTdG9yZSBzdG9yZSwgT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2VsZWN0IHRoZSB2YWx1ZXMgb2YgdGhpcyBmaWVsZC4KKyAgICAgKiBFbGVtZW50cyBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgbG9hZGVkIHdpdGgge0BsaW5rICNsb2FkVmFsdWV9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdFZhbHVlKFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyB2YWwsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgCisgICAgICAgIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIExvYWQgYSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb2FkVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiByZXN1bHRzIGNvbnRhaW5pbmcgYWxsIGtleXMgYW5kIHZhbHVlcyBmb3IgdGhpcyBtYXAuIElmIG9ubHkKKyAgICAgKiBvbmUgcmVzdWx0IGlzIG5lZWRlZCwgc2V0IGJvdGggYXJyYXkgaW5kZXhlcyB0byB0aGUgc2FtZSByZXN1bHQKKyAgICAgKiBpbnN0YW5jZS4gQWxzbyBmaWxsIGluIHRoZSBrZXkgYW5kIHZhbHVlIGpvaW5zIGluIHRoZSBnaXZlbiBhcnJheS4KKyAgICAgKiBUaGUgcmVzdWx0cyB3aWxsIGJlIGxvYWRlZCB3aXRoIHRoZSB7QGxpbmsgI2xvYWRLZXl9IG9yCisgICAgICoge0BsaW5rICNkZXJpdmVLZXl9IGFuZCB7QGxpbmsgI2xvYWRWYWx1ZX0gbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0W10gZ2V0UmVzdWx0cyhPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUsIEpvaW5zW10gam9pbnMsIGJvb2xlYW4gbHJzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGlzIHZhbHVlJ3MgdGFibGUgdG8gdGhlIHRhYmxlIGZvciB0aGUgZ2l2ZW4ga2V5IG1hcHBpbmcKKyAgICAgKiBmcm9tIHtAbGluayAjZ2V0SW5kZXBlbmRlbnRLZXlNYXBwaW5nc30gKG9yIG51bGwpLgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBqb2luS2V5UmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyBrZXkpOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGlzIHZhbHVlJ3MgdGFibGUgdG8gdGhlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gdmFsdWUgbWFwcGluZworICAgICAqIGZyb20ge0BsaW5rICNnZXRJbmRlcGVuZGVudFZhbHVlTWFwcGluZ3N9IChvciBudWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pblZhbHVlUmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyB2YWwpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9MUlNQcm94eUNvbGxlY3Rpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTFJTUHJveHlDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhZjVkMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTFJTUHJveHlDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5BYnN0cmFjdExSU1Byb3h5Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnZhbGlkU3RhdGVFeGNlcHRpb247CisKKy8qKgorICogTGFyZ2UgcmVzdWx0IHNldCBjb2xsZWN0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMUlNQcm94eUNvbGxlY3Rpb24KKyAgICBleHRlbmRzIEFic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKExSU1Byb3h5Q29sbGVjdGlvbi5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIExSU0NvbGxlY3Rpb25GaWVsZFN0cmF0ZWd5IF9zdHJhdDsKKworICAgIHB1YmxpYyBMUlNQcm94eUNvbGxlY3Rpb24oTFJTQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kgc3RyYXQpIHsKKyAgICAgICAgc3VwZXIoc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZSgpLAorICAgICAgICAgICAgc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0T3JkZXJDb2x1bW4oKSAhPSBudWxsKTsKKyAgICAgICAgX3N0cmF0ID0gc3RyYXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBjb3VudCgpIHsKKyAgICAgICAgZmluYWwgQ2xhc3NNYXBwaW5nW10gZWxlbXMgPSBfc3RyYXQuZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3MKKyAgICAgICAgICAgIChmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSBhc3NlcnRPd25lcigpOworICAgICAgICBmaW5hbCBKREJDU3RvcmUgc3RvcmUgPSBnZXRTdG9yZSgpOworICAgICAgICBVbmlvbiB1bmlvbiA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdVbmlvbgorICAgICAgICAgICAgKE1hdGgubWF4KDEsIGVsZW1zLmxlbmd0aCkpOworICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpZHgpIHsKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmcgZWxlbSA9IChlbGVtcy5sZW5ndGggPT0gMCkgPyBudWxsIDogZWxlbXNbaWR4XTsKKyAgICAgICAgICAgICAgICBzZWwud2hlcmVGb3JlaWduS2V5KF9zdHJhdC5nZXRKb2luRm9yZWlnbktleShlbGVtKSwKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0T2JqZWN0SWQoKSwgX3N0cmF0LmdldEZpZWxkTWFwcGluZygpLgorICAgICAgICAgICAgICAgICAgICBnZXREZWZpbmluZ01hcHBpbmcoKSwgc3RvcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHVuaW9uLmdldENvdW50KHN0b3JlKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSBlbGVtcyA9IF9zdHJhdC5nZXRJbmRlcGVuZGVudEVsZW1lbnRNYXBwaW5ncworICAgICAgICAgICAgKGZhbHNlKTsKKyAgICAgICAgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IGFzc2VydE93bmVyKCk7CisgICAgICAgIGZpbmFsIEpEQkNTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7CisgICAgICAgIFVuaW9uIHVuaW9uID0gc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1VuaW9uCisgICAgICAgICAgICAoTWF0aC5tYXgoMSwgZWxlbXMubGVuZ3RoKSk7CisgICAgICAgIHVuaW9uLnNlbGVjdChuZXcgVW5pb24uU2VsZWN0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0IHNlbCwgaW50IGlkeCkgeworICAgICAgICAgICAgICAgIENsYXNzTWFwcGluZyBlbGVtID0gKGVsZW1zLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBlbGVtc1tpZHhdOworICAgICAgICAgICAgICAgIHNlbC53aGVyZUZvcmVpZ25LZXkoX3N0cmF0LmdldEpvaW5Gb3JlaWduS2V5KGVsZW0pLAorICAgICAgICAgICAgICAgICAgICBzbS5nZXRPYmplY3RJZCgpLCBfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuCisgICAgICAgICAgICAgICAgICAgIGdldERlZmluaW5nTWFwcGluZygpLCBzdG9yZSk7CisKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gX3N0cmF0LnRvRGF0YVN0b3JlVmFsdWUob2JqLCBzdG9yZSk7CisgICAgICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IF9zdHJhdC5nZXRFbGVtZW50Q29sdW1ucyhlbGVtKTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSB2YWxzID0gKGNvbHMubGVuZ3RoID09IDEpID8gbnVsbCA6IChPYmplY3RbXSkgdmFsOworICAgICAgICAgICAgICAgIFNRTEJ1ZmZlciBzcWwgPSBuZXcgU1FMQnVmZmVyKHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiIEFORCAiKTsKKworICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhjb2xzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCh2YWwgPT0gbnVsbCkgPyAiIElTICIgOiAiID0gIikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVmFsdWUodmFsLCBjb2xzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgodmFsc1tpXSA9PSBudWxsKSA/ICIgSVMgIiA6ICIgPSAiKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRWYWx1ZSh2YWxzW2ldLCBjb2xzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsLndoZXJlKHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdW5pb24uZ2V0Q291bnQoc3RvcmUpID4gMDsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgaXRyKCkgeworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSBlbGVtcyA9IF9zdHJhdC5nZXRJbmRlcGVuZGVudEVsZW1lbnRNYXBwaW5ncyh0cnVlKTsKKyAgICAgICAgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IGFzc2VydE93bmVyKCk7CisgICAgICAgIGZpbmFsIEpEQkNTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7CisgICAgICAgIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSBzdG9yZS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZmluYWwgSm9pbnNbXSByZXNKb2lucyA9IG5ldyBKb2luc1tNYXRoLm1heCgxLCBlbGVtcy5sZW5ndGgpXTsKKyAgICAgICAgZmluYWwgRmllbGRNYXBwaW5nIGZtID0gX3N0cmF0LmdldEZpZWxkTWFwcGluZygpOworCisgICAgICAgIFVuaW9uIHVuaW9uID0gc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1VuaW9uCisgICAgICAgICAgICAoTWF0aC5tYXgoMSwgZWxlbXMubGVuZ3RoKSk7CisgICAgICAgIGlmIChmZXRjaC5nZXRTdWJjbGFzc0ZldGNoTW9kZShmbS5nZXRFbGVtZW50TWFwcGluZygpLgorICAgICAgICAgICAgZ2V0VHlwZU1hcHBpbmcoKSkgIT0gZmV0Y2guRUFHRVJfSk9JTikKKyAgICAgICAgICAgIHVuaW9uLmFib3J0VW5pb24oKTsKKyAgICAgICAgdW5pb24uc2V0TFJTKHRydWUpOworICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpZHgpIHsKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmcgZWxlbSA9IChlbGVtcy5sZW5ndGggPT0gMCkgPyBudWxsIDogZWxlbXNbaWR4XTsKKyAgICAgICAgICAgICAgICBzZWwud2hlcmVGb3JlaWduS2V5KF9zdHJhdC5nZXRKb2luRm9yZWlnbktleShlbGVtKSwKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0T2JqZWN0SWQoKSwgZm0uZ2V0RGVmaW5pbmdNYXBwaW5nKCksIHN0b3JlKTsKKworICAgICAgICAgICAgICAgIC8vIG9yZGVyIGJlZm9yZSBzZWxlY3QgaW4gY2FzZSB3ZSdyZSBmYWtpbmcgdW5pb24gd2l0aAorICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHNlbGVjdHM7IG9yZGVyIHZhbHMgdXNlZCB0byBtZXJnZSByZXN1bHRzCisgICAgICAgICAgICAgICAgZm0ub3JkZXJMb2NhbChzZWwsIGVsZW0sIG51bGwpOworICAgICAgICAgICAgICAgIHJlc0pvaW5zW2lkeF0gPSBfc3RyYXQuam9pbkVsZW1lbnRSZWxhdGlvbihzZWwubmV3Sm9pbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgZWxlbSk7CisgICAgICAgICAgICAgICAgZm0ub3JkZXJSZWxhdGlvbihzZWwsIGVsZW0sIHJlc0pvaW5zW2lkeF0pOworICAgICAgICAgICAgICAgIF9zdHJhdC5zZWxlY3RFbGVtZW50KHNlbCwgZWxlbSwgc3RvcmUsIGZldGNoLCBmZXRjaC5FQUdFUl9KT0lOLAorICAgICAgICAgICAgICAgICAgICByZXNKb2luc1tpZHhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc3VsdCByZXMgPSB1bmlvbi5leGVjdXRlKHN0b3JlLCBmZXRjaCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEl0ZXJhdG9yKHNtLCBzdG9yZSwgZmV0Y2gsIHJlcywgcmVzSm9pbnMpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT3BlbkpQQVN0YXRlTWFuYWdlciBhc3NlcnRPd25lcigpIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IGdldE93bmVyKCk7CisgICAgICAgIGlmIChzbSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibHJzLW5vLW93bmVyIiwKKyAgICAgICAgICAgICAgICBfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkpKTsKKyAgICAgICAgcmV0dXJuIHNtOworICAgIH0KKworICAgIHByaXZhdGUgSkRCQ1N0b3JlIGdldFN0b3JlKCkgeworICAgICAgICByZXR1cm4gKEpEQkNTdG9yZSkgZ2V0T3duZXIoKS5nZXRDb250ZXh0KCkuZ2V0U3RvcmVNYW5hZ2VyKCkuCisgICAgICAgICAgICBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlYWJsZSBpdGVyYXRvciBidWlsdCBhcm91bmQgYSBKREJDIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlc3VsdEl0ZXJhdG9yCisgICAgICAgIGltcGxlbWVudHMgSXRlcmF0b3IsIENsb3NlYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPcGVuSlBBU3RhdGVNYW5hZ2VyIF9zbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBKREJDU3RvcmUgX3N0b3JlOworICAgICAgICBwcml2YXRlIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gX2ZldGNoOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3VsdCBfcmVzOworICAgICAgICBwcml2YXRlIGZpbmFsIEpvaW5zW10gX2pvaW5zOworICAgICAgICBwcml2YXRlIEJvb2xlYW4gX25leHQgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBSZXN1bHRJdGVyYXRvcihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2luc1tdIGpvaW5zKSB7CisgICAgICAgICAgICBfc20gPSBzbTsKKyAgICAgICAgICAgIF9zdG9yZSA9IHN0b3JlOworICAgICAgICAgICAgX2ZldGNoID0gZmV0Y2g7CisgICAgICAgICAgICBfcmVzID0gcmVzOworICAgICAgICAgICAgX2pvaW5zID0gam9pbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgaWYgKF9uZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBfbmV4dCA9IChfcmVzLm5leHQoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBfc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfbmV4dC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmF0LmxvYWRFbGVtZW50KF9zbSwgX3N0b3JlLCBfZmV0Y2gsIF9yZXMsCisgICAgICAgICAgICAgICAgICAgIF9qb2luc1tfcmVzLmluZGV4T2YoKV0pOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgX3N0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBfbmV4dCA9IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICBfcmVzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTFJTUHJveHlNYXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTFJTUHJveHlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RjYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9MUlNQcm94eU1hcC5qYXZhCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5BYnN0cmFjdExSU1Byb3h5TWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKKworLyoqCisgKiBMYXJnZSByZXN1bHQgc2V0IG1hcC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBMUlNQcm94eU1hcAorICAgIGV4dGVuZHMgQWJzdHJhY3RMUlNQcm94eU1hcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChMUlNQcm94eU1hcC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIExSU01hcEZpZWxkU3RyYXRlZ3kgX3N0cmF0OworCisgICAgcHVibGljIExSU1Byb3h5TWFwKExSU01hcEZpZWxkU3RyYXRlZ3kgc3RyYXQpIHsKKyAgICAgICAgc3VwZXIoc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0S2V5KCkuZ2V0RGVjbGFyZWRUeXBlKCksCisgICAgICAgICAgICBzdHJhdC5nZXRGaWVsZE1hcHBpbmcoKS5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlKCkpOworICAgICAgICBfc3RyYXQgPSBzdHJhdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBjb3VudCgpIHsKKyAgICAgICAgYm9vbGVhbiBkZXJpdmVkVmFsID0gX3N0cmF0LmdldEZpZWxkTWFwcGluZygpLmdldEVsZW1lbnQoKS4KKyAgICAgICAgICAgIGdldFZhbHVlTWFwcGVkQnkoKSAhPSBudWxsOworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSBjbHNzID0gKGRlcml2ZWRWYWwpCisgICAgICAgICAgICA/IF9zdHJhdC5nZXRJbmRlcGVuZGVudEtleU1hcHBpbmdzKGZhbHNlKQorICAgICAgICAgICAgOiBfc3RyYXQuZ2V0SW5kZXBlbmRlbnRWYWx1ZU1hcHBpbmdzKGZhbHNlKTsKKyAgICAgICAgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IGFzc2VydE93bmVyKCk7CisgICAgICAgIGZpbmFsIEpEQkNTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7CisgICAgICAgIFVuaW9uIHVuaW9uID0gc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1VuaW9uCisgICAgICAgICAgICAoTWF0aC5tYXgoMSwgY2xzcy5sZW5ndGgpKTsKKyAgICAgICAgdW5pb24uc2VsZWN0KG5ldyBVbmlvbi5TZWxlY3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChjbHNzLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBjbHNzW2lkeF07CisgICAgICAgICAgICAgICAgc2VsLndoZXJlRm9yZWlnbktleShfc3RyYXQuZ2V0Sm9pbkZvcmVpZ25LZXkoY2xzKSwKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0T2JqZWN0SWQoKSwgX3N0cmF0LmdldEZpZWxkTWFwcGluZygpLgorICAgICAgICAgICAgICAgICAgICBnZXREZWZpbmluZ01hcHBpbmcoKSwgc3RvcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHVuaW9uLmdldENvdW50KHN0b3JlKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gaGFzKGtleSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBoYXModmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzKGZpbmFsIE9iamVjdCBvYmosIGZpbmFsIGJvb2xlYW4ga2V5KSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVyaXZlZEtleSA9IGtleSAmJiBfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXRLZXkoKS5nZXRWYWx1ZU1hcHBlZEJ5KCkgIT0gbnVsbDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkZXJpdmVkVmFsID0gIWtleSAmJiBfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXRFbGVtZW50KCkuZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGw7CisKKyAgICAgICAgZmluYWwgQ2xhc3NNYXBwaW5nW10gY2xzcyA9ICgoa2V5ICYmICFkZXJpdmVkS2V5KSB8fCBkZXJpdmVkVmFsKQorICAgICAgICAgICAgPyBfc3RyYXQuZ2V0SW5kZXBlbmRlbnRLZXlNYXBwaW5ncyhkZXJpdmVkVmFsKQorICAgICAgICAgICAgOiBfc3RyYXQuZ2V0SW5kZXBlbmRlbnRWYWx1ZU1hcHBpbmdzKGRlcml2ZWRLZXkpOworICAgICAgICBmaW5hbCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gYXNzZXJ0T3duZXIoKTsKKyAgICAgICAgZmluYWwgSkRCQ1N0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKKworICAgICAgICBVbmlvbiB1bmlvbiA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdVbmlvbgorICAgICAgICAgICAgKE1hdGgubWF4KDEsIGNsc3MubGVuZ3RoKSk7CisgICAgICAgIHVuaW9uLnNlbGVjdChuZXcgVW5pb24uU2VsZWN0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0IHNlbCwgaW50IGlkeCkgeworICAgICAgICAgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSAoY2xzcy5sZW5ndGggPT0gMCkgPyBudWxsIDogY2xzc1tpZHhdOworICAgICAgICAgICAgICAgIHNlbC53aGVyZUZvcmVpZ25LZXkoX3N0cmF0LmdldEpvaW5Gb3JlaWduS2V5KGNscyksCisgICAgICAgICAgICAgICAgICAgIHNtLmdldE9iamVjdElkKCksIF9zdHJhdC5nZXRGaWVsZE1hcHBpbmcoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVmaW5pbmdNYXBwaW5nKCksIHN0b3JlKTsKKworICAgICAgICAgICAgICAgIEpvaW5zIGpvaW5zID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDb2x1bW5bXSBjb2xzOworICAgICAgICAgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVyaXZlZEtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5zID0gX3N0cmF0LmpvaW5WYWx1ZVJlbGF0aW9uKHNlbC5uZXdKb2lucygpLCBjbHMpOworICAgICAgICAgICAgICAgICAgICB2YWwgPSBfc3RyYXQudG9LZXlEYXRhU3RvcmVWYWx1ZShvYmosIHN0b3JlKTsKKyAgICAgICAgICAgICAgICAgICAgY29scyA9IF9zdHJhdC5nZXRLZXlDb2x1bW5zKGNscyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlcml2ZWRWYWwpCisgICAgICAgICAgICAgICAgICAgICAgICBqb2lucyA9IF9zdHJhdC5qb2luS2V5UmVsYXRpb24oc2VsLm5ld0pvaW5zKCksIGNscyk7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IF9zdHJhdC50b0RhdGFTdG9yZVZhbHVlKG9iaiwgc3RvcmUpOworICAgICAgICAgICAgICAgICAgICBjb2xzID0gX3N0cmF0LmdldFZhbHVlQ29sdW1ucyhjbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3RbXSB2YWxzID0gKGNvbHMubGVuZ3RoID09IDEpID8gbnVsbCA6IChPYmplY3RbXSkgdmFsOworICAgICAgICAgICAgICAgIFNRTEJ1ZmZlciBzcWwgPSBuZXcgU1FMQnVmZmVyKHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiIEFORCAiKTsKKworICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhjb2xzW2ldLCBqb2lucykpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFscyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgodmFsID09IG51bGwpID8gIiBJUyAiIDogIiA9ICIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFZhbHVlKHZhbCwgY29sc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKHZhbHNbaV0gPT0gbnVsbCkgPyAiIElTICIgOiAiID0gIikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVmFsdWUodmFsc1tpXSwgY29sc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbC53aGVyZShzcWwsIGpvaW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiB1bmlvbi5nZXRDb3VudChzdG9yZSkgPiAwOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGtleXMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBmaW5hbCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gYXNzZXJ0T3duZXIoKTsKKyAgICAgICAgZmluYWwgSkRCQ1N0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKKyAgICAgICAgaWYgKF9zdHJhdC5nZXRGaWVsZE1hcHBpbmcoKS5nZXRLZXkoKS5nZXRWYWx1ZU1hcHBlZEJ5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IGtleSA9IF9zdHJhdC5kZXJpdmVLZXkoc3RvcmUsIG9iaik7CisgICAgICAgICAgICBpZiAoaGFzS2V5KGtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihrZXkpOworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSBjbHNzID0gX3N0cmF0LmdldEluZGVwZW5kZW50S2V5TWFwcGluZ3ModHJ1ZSk7CisgICAgICAgIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSBzdG9yZS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZmluYWwgSm9pbnNbXSByZXNKb2lucyA9IG5ldyBKb2luc1tNYXRoLm1heCgxLCBjbHNzLmxlbmd0aCldOworCisgICAgICAgIFVuaW9uIHVuaW9uID0gc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1VuaW9uCisgICAgICAgICAgICAoTWF0aC5tYXgoMSwgY2xzcy5sZW5ndGgpKTsKKyAgICAgICAgaWYgKGZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKF9zdHJhdC5nZXRGaWVsZE1hcHBpbmcoKS4KKyAgICAgICAgICAgIGdldEtleU1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpKSAhPSBmZXRjaC5FQUdFUl9KT0lOKQorICAgICAgICAgICAgdW5pb24uYWJvcnRVbmlvbigpOworICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpZHgpIHsKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gKGNsc3MubGVuZ3RoID09IDApID8gbnVsbCA6IGNsc3NbaWR4XTsKKyAgICAgICAgICAgICAgICBzZWwud2hlcmVGb3JlaWduS2V5KF9zdHJhdC5nZXRKb2luRm9yZWlnbktleShjbHMpLAorICAgICAgICAgICAgICAgICAgICBzbS5nZXRPYmplY3RJZCgpLCBfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuCisgICAgICAgICAgICAgICAgICAgIGdldERlZmluaW5nTWFwcGluZygpLCBzdG9yZSk7CisgICAgICAgICAgICAgICAgaWYgKF9zdHJhdC5nZXRGaWVsZE1hcHBpbmcoKS5nZXRFbGVtZW50KCkuZ2V0VmFsdWVNYXBwZWRCeSgpCisgICAgICAgICAgICAgICAgICAgICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW2lkeF0gPSBfc3RyYXQuam9pbktleVJlbGF0aW9uKHNlbC5uZXdKb2lucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xzKTsKKworICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSBfc3RyYXQudG9EYXRhU3RvcmVWYWx1ZShvYmosIHN0b3JlKTsKKyAgICAgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gX3N0cmF0LmdldFZhbHVlQ29sdW1ucyhjbHMpOworICAgICAgICAgICAgICAgIE9iamVjdFtdIHZhbHMgPSAoY29scy5sZW5ndGggPT0gMSkgPyBudWxsIDogKE9iamVjdFtdKSB2YWw7CisgICAgICAgICAgICAgICAgU1FMQnVmZmVyIHNxbCA9IG5ldyBTUUxCdWZmZXIoc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgQU5EICIpOworCisgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGNvbHNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKHZhbCA9PSBudWxsKSA/ICIgSVMgIiA6ICIgPSAiKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRWYWx1ZSh2YWwsIGNvbHNbaV0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCh2YWxzW2ldID09IG51bGwpID8gIiBJUyAiIDogIiA9ICIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFZhbHVlKHZhbHNbaV0sIGNvbHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWwud2hlcmUoc3FsKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXNKb2luc1tpZHhdID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW2lkeF0gPSBfc3RyYXQuam9pbktleVJlbGF0aW9uKHNlbC5uZXdKb2lucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xzKTsKKyAgICAgICAgICAgICAgICBfc3RyYXQuc2VsZWN0S2V5KHNlbCwgY2xzLCBzbSwgc3RvcmUsIGZldGNoLCByZXNKb2luc1tpZHhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgUmVzdWx0IHJlcyA9IG51bGw7CisgICAgICAgIENvbGxlY3Rpb24ga2V5cyA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXMgPSB1bmlvbi5leGVjdXRlKHN0b3JlLCBmZXRjaCk7CisgICAgICAgICAgICB3aGlsZSAocmVzLm5leHQoKSkKKyAgICAgICAgICAgICAgICBrZXlzLmFkZChfc3RyYXQubG9hZEtleShzbSwgc3RvcmUsIGZldGNoLCByZXMsCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW3Jlcy5pbmRleE9mKCldKSk7CisgICAgICAgICAgICByZXR1cm4ga2V5czsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IGFzc2VydE93bmVyKCk7CisgICAgICAgIGZpbmFsIEpEQkNTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7CisgICAgICAgIGlmIChfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0RWxlbWVudCgpLmdldFZhbHVlTWFwcGVkQnkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsID0gX3N0cmF0LmRlcml2ZVZhbHVlKHN0b3JlLCBvYmopOworICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKHZhbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCA9IHN0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSBjbHNzID0gX3N0cmF0LmdldEluZGVwZW5kZW50VmFsdWVNYXBwaW5ncyh0cnVlKTsKKyAgICAgICAgZmluYWwgSm9pbnNbXSByZXNKb2lucyA9IG5ldyBKb2luc1tNYXRoLm1heCgxLCBjbHNzLmxlbmd0aCldOworICAgICAgICBVbmlvbiB1bmlvbiA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdVbmlvbihNYXRoLm1heCgxLCBjbHNzLmxlbmd0aCkpOworICAgICAgICB1bmlvbi5zZXRFeHBlY3RlZFJlc3VsdENvdW50KDEsIGZhbHNlKTsKKyAgICAgICAgaWYgKGZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKF9zdHJhdC5nZXRGaWVsZE1hcHBpbmcoKS4KKyAgICAgICAgICAgIGdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKSkKKyAgICAgICAgICAgICE9IEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTikKKyAgICAgICAgICAgIHVuaW9uLmFib3J0VW5pb24oKTsKKyAgICAgICAgdW5pb24uc2VsZWN0KG5ldyBVbmlvbi5TZWxlY3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChjbHNzLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBjbHNzW2lkeF07CisgICAgICAgICAgICAgICAgc2VsLndoZXJlRm9yZWlnbktleShfc3RyYXQuZ2V0Sm9pbkZvcmVpZ25LZXkoY2xzKSwKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0T2JqZWN0SWQoKSwgX3N0cmF0LmdldEZpZWxkTWFwcGluZygpLgorICAgICAgICAgICAgICAgICAgICBnZXREZWZpbmluZ01hcHBpbmcoKSwgc3RvcmUpOworICAgICAgICAgICAgICAgIGlmIChfc3RyYXQuZ2V0RmllbGRNYXBwaW5nKCkuZ2V0S2V5KCkuZ2V0VmFsdWVNYXBwZWRCeSgpCisgICAgICAgICAgICAgICAgICAgICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW2lkeF0gPSBfc3RyYXQuam9pblZhbHVlUmVsYXRpb24oc2VsLm5ld0pvaW5zKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjbHMpOworCisgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IF9zdHJhdC50b0tleURhdGFTdG9yZVZhbHVlKG9iaiwgc3RvcmUpOworICAgICAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBfc3RyYXQuZ2V0S2V5Q29sdW1ucyhjbHMpOworICAgICAgICAgICAgICAgIE9iamVjdFtdIHZhbHMgPSAoY29scy5sZW5ndGggPT0gMSkgPyBudWxsIDogKE9iamVjdFtdKSBrZXk7CisgICAgICAgICAgICAgICAgU1FMQnVmZmVyIHNxbCA9IG5ldyBTUUxCdWZmZXIoc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgQU5EICIpOworCisgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGNvbHNbaV0sIHJlc0pvaW5zW2lkeF0pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGtleSA9PSBudWxsKSA/ICIgSVMgIiA6ICIgPSAiKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRWYWx1ZShrZXksIGNvbHNbaV0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCh2YWxzW2ldID09IG51bGwpID8gIiBJUyAiIDogIiA9ICIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFZhbHVlKHZhbHNbaV0sIGNvbHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWwud2hlcmUoc3FsLCByZXNKb2luc1tpZHhdKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXNKb2luc1tpZHhdID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW2lkeF0gPSBfc3RyYXQuam9pblZhbHVlUmVsYXRpb24oc2VsLm5ld0pvaW5zKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjbHMpOworICAgICAgICAgICAgICAgIF9zdHJhdC5zZWxlY3RWYWx1ZShzZWwsIGNscywgc20sIHN0b3JlLCBmZXRjaCwgcmVzSm9pbnNbaWR4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIFJlc3VsdCByZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzID0gdW5pb24uZXhlY3V0ZShzdG9yZSwgZmV0Y2gpOworICAgICAgICAgICAgaWYgKHJlcy5uZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHJhdC5sb2FkVmFsdWUoc20sIHN0b3JlLCBmZXRjaCwgcmVzLAorICAgICAgICAgICAgICAgICAgICByZXNKb2luc1tyZXMuaW5kZXhPZigpXSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgaXRyKCkgeworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gYXNzZXJ0T3duZXIoKTsKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCA9IHN0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSm9pbnNbXSBqb2lucyA9IG5ldyBKb2luc1syXTsKKyAgICAgICAgICAgIFJlc3VsdFtdIHJlcyA9IF9zdHJhdC5nZXRSZXN1bHRzKHNtLCBzdG9yZSwgZmV0Y2gsIGZldGNoLkVBR0VSX0pPSU4sCisgICAgICAgICAgICAgICAgam9pbnMsIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRJdGVyYXRvcihzbSwgc3RvcmUsIGZldGNoLCByZXMsIGpvaW5zKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBzdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE9wZW5KUEFTdGF0ZU1hbmFnZXIgYXNzZXJ0T3duZXIoKSB7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSBnZXRPd25lcigpOworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImxycy1uby1vd25lciIsCisgICAgICAgICAgICAgICAgX3N0cmF0LmdldEZpZWxkTWFwcGluZygpKSk7CisgICAgICAgIHJldHVybiBzbTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpEQkNTdG9yZSBnZXRTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIChKREJDU3RvcmUpIGdldE93bmVyKCkuZ2V0Q29udGV4dCgpLmdldFN0b3JlTWFuYWdlcigpLgorICAgICAgICAgICAgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZWFibGUgaXRlcmF0b3IgYnVpbHQgYXJvdW5kIGtleSBhbmQgdmFsdWUgSkRCQyByZXN1bHRzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVzdWx0SXRlcmF0b3IKKyAgICAgICAgaW1wbGVtZW50cyBJdGVyYXRvciwgQ2xvc2VhYmxlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgX3NtOworICAgICAgICBwcml2YXRlIGZpbmFsIEpEQkNTdG9yZSBfc3RvcmU7CisgICAgICAgIHByaXZhdGUgZmluYWwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBfZmV0Y2g7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzdWx0W10gX3JlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBKb2luc1tdIF9qb2luczsKKyAgICAgICAgcHJpdmF0ZSBCb29sZWFuIF9uZXh0ID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgUmVzdWx0SXRlcmF0b3IoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0W10gcmVzLCBKb2luc1tdIGpvaW5zKSB7CisgICAgICAgICAgICBfc20gPSBzbTsKKyAgICAgICAgICAgIF9zdG9yZSA9IHN0b3JlOworICAgICAgICAgICAgX2ZldGNoID0gZmV0Y2g7CisgICAgICAgICAgICBfcmVzID0gcmVzOworICAgICAgICAgICAgX2pvaW5zID0gam9pbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgaWYgKF9uZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBfbmV4dCA9IChfcmVzWzBdLm5leHQoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgICAgICAgICBpZiAoX25leHQuYm9vbGVhblZhbHVlKCkgJiYgX3Jlc1sxXSAhPSBfcmVzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc1sxXS5uZXh0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9zdG9yZS5nZXREQkRpY3Rpb25hcnkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9uZXh0LmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9uZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgYm9vbGVhbiBrZXlEZXJpdmVkID0gX3N0cmF0LmdldEZpZWxkTWFwcGluZygpLmdldEtleSgpLgorICAgICAgICAgICAgICAgIGdldFZhbHVlTWFwcGVkQnkoKSAhPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiB2YWxEZXJpdmVkID0gX3N0cmF0LmdldEZpZWxkTWFwcGluZygpLmdldEVsZW1lbnQoKS4KKyAgICAgICAgICAgICAgICBnZXRWYWx1ZU1hcHBlZEJ5KCkgIT0gbnVsbDsKKyAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgaWYgKCFrZXlEZXJpdmVkKQorICAgICAgICAgICAgICAgICAgICBlbnRyeS5rZXkgPSBfc3RyYXQubG9hZEtleShfc20sIF9zdG9yZSwgX2ZldGNoLCBfcmVzWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9qb2luc1swXSk7CisgICAgICAgICAgICAgICAgaWYgKCF2YWxEZXJpdmVkKQorICAgICAgICAgICAgICAgICAgICBlbnRyeS52YWwgPSBfc3RyYXQubG9hZFZhbHVlKF9zbSwgX3N0b3JlLCBfZmV0Y2gsIF9yZXNbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgX2pvaW5zWzFdKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5RGVyaXZlZCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnkua2V5ID0gX3N0cmF0LmRlcml2ZUtleShfc3RvcmUsIGVudHJ5LnZhbCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbERlcml2ZWQpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbCA9IF9zdHJhdC5kZXJpdmVWYWx1ZShfc3RvcmUsIGVudHJ5LmtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgX3N0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBfbmV4dCA9IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICBfcmVzWzBdLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoX3Jlc1sxXSAhPSBfcmVzWzBdKQorICAgICAgICAgICAgICAgIF9yZXNbMV0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcC5FbnRyeSBzdHJ1Y3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnkKKyAgICAgICAgaW1wbGVtZW50cyBNYXAuRW50cnkgeworCisgICAgICAgIHB1YmxpYyBPYmplY3Qga2V5OworICAgICAgICBwdWJsaWMgT2JqZWN0IHZhbDsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWFwVGFibGVGaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01hcFRhYmxlRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzU5OGUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01hcFRhYmxlRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIG1hcCBtYXBwaW5ncy4gSGFuZGxlcyBtYW5hZ2luZyB0aGUgc2Vjb25kYXJ5IHRhYmxlCisgKiB1c2VkIHRvIGhvbGQgbWFwIGtleXMgYW5kIHZhbHVlcyBhbmQgbG9hZGluZy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAorICogYWJzdHJhY3QgbWV0aG9kcyBhbmQgaW5zZXJ0L3VwZGF0ZSBiZWhhdmlvciBhcyB3ZWxsIGFzIG92ZXJyaWRpbmcKKyAqIHtAbGluayBGaWVsZFN0cmF0ZWd5I3RvRGF0YVN0b3JlVmFsdWV9LAorICoge0BsaW5rIEZpZWxkU3RyYXRlZ3kjdG9LZXlEYXRhU3RvcmVWYWx1ZX0sCisgKiB7QGxpbmsgRmllbGRTdHJhdGVneSNqb2luUmVsYXRpb259LCBhbmQKKyAqIHtAbGluayBGaWVsZFN0cmF0ZWd5I2pvaW5LZXlSZWxhdGlvbn0gaWYgbmVjZXNzYXJ5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXBUYWJsZUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIENvbnRhaW5lckZpZWxkU3RyYXRlZ3kKKyAgICBpbXBsZW1lbnRzIExSU01hcEZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoTWFwVGFibGVGaWVsZFN0cmF0ZWd5LmNsYXNzKTsKKworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50S2V5TWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICByZXR1cm4gKHRyYXZlcnNlKSA/IGZpZWxkLmdldEtleU1hcHBpbmcoKS5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpCisgICAgICAgICAgICA6IENsYXNzTWFwcGluZy5FTVBUWV9NQVBQSU5HUzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRWYWx1ZU1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuICh0cmF2ZXJzZSkgPyBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLgorICAgICAgICAgICAgZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKSA6IENsYXNzTWFwcGluZy5FTVBUWV9NQVBQSU5HUzsKKyAgICB9CisKKyAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleShDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRKb2luRm9yZWlnbktleSgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZGVyaXZlS2V5KEpEQkNTdG9yZSBzdG9yZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZGVyaXZlVmFsdWUoSkRCQ1N0b3JlIHN0b3JlLCBPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMge0BsaW5rIEZpZWxkU3RyYXRlZ3kjam9pbktleVJlbGF0aW9ufSBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBqb2luS2V5UmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5LZXlSZWxhdGlvbihqb2lucywgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHtAbGluayBGaWVsZFN0cmF0ZWd5I2pvaW5SZWxhdGlvbn0gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pblZhbHVlUmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyB2YWwpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5SZWxhdGlvbihqb2lucywgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuTUFQKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtbWFwIiwgZmllbGQpKTsKKyAgICAgICAgaWYgKGZpZWxkLmdldEtleSgpLmdldFZhbHVlTWFwcGVkQnkoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJtYXBwZWQtYnkta2V5IiwgZmllbGQpKTsKKyAgICAgICAgZmllbGQuZ2V0VmFsdWVJbmZvKCkuYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzKGZpZWxkLCAhYWRhcHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSb3cgcm93ID0gcm0uZ2V0QWxsUm93cyhmaWVsZC5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0RFTEVURSk7CisgICAgICAgIHJvdy53aGVyZUZvcmVpZ25LZXkoZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwgc20pOworICAgICAgICBybS5mbHVzaEFsbFJvd3Mocm93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN1cHBvcnRzU2VsZWN0KFNlbGVjdCBzZWwsIGludCB0eXBlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoZmllbGQuaXNMUlMoKSkgeworICAgICAgICAgICAgc20uc3RvcmVPYmplY3RGaWVsZChmaWVsZC5nZXRJbmRleCgpLCBuZXcgTFJTUHJveHlNYXAodGhpcykpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VsZWN0IGFsbCBhbmQgbG9hZCBpbnRvIGEgbm9ybWFsIHByb3h5CisgICAgICAgIEpvaW5zW10gam9pbnMgPSBuZXcgSm9pbnNbMl07CisgICAgICAgIFJlc3VsdFtdIHJlcyA9IGdldFJlc3VsdHMoc20sIHN0b3JlLCBmZXRjaCwKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfUEFSQUxMRUwsIGpvaW5zLCBmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYXAgbWFwID0gKE1hcCkgc20ubmV3UHJveHkoZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBPYmplY3Qga2V5LCB2YWw7CisgICAgICAgICAgICB3aGlsZSAocmVzWzBdLm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXNbMV0gIT0gcmVzWzBdICYmICFyZXNbMV0ubmV4dCgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGtleSA9IGxvYWRLZXkoc20sIHN0b3JlLCBmZXRjaCwgcmVzWzBdLCBqb2luc1swXSk7CisgICAgICAgICAgICAgICAgdmFsID0gbG9hZFZhbHVlKHNtLCBzdG9yZSwgZmV0Y2gsIHJlc1sxXSwgam9pbnNbMV0pOworICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgbWFwKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc1swXS5jbG9zZSgpOworICAgICAgICAgICAgaWYgKHJlc1sxXSAhPSByZXNbMF0pCisgICAgICAgICAgICAgICAgcmVzWzFdLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRLZXlQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZEtleShudWxsLCBzdG9yZSwgZmV0Y2gsIHJlcywgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZFByb2plY3Rpb24oSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb2FkVmFsdWUobnVsbCwgc3RvcmUsIGZldGNoLCByZXMsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5qb2luKGpvaW5zLCBmb3JjZU91dGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbktleShKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5qb2luKGpvaW5zLCBmb3JjZU91dGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldEpvaW5Gb3JlaWduS2V5KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuIENsYXNzTWFwcGluZy5FTVBUWV9NQVBQSU5HUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01heEVtYmVkZGVkQmxvYkZpZWxkU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWF4RW1iZWRkZWRCbG9iRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZGE4NzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01heEVtYmVkZGVkQmxvYkZpZWxkU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogTWFwcGluZyBmb3Igc2VyaWFsaXplZCBmaWVsZHMgb24gYSBkaWN0aW9uYXJ5IHRoYXQgaGFzIGEgbWF4aW11bSBlbWJlZGRlZAorICogQkxPQiBzaXplLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIE1heEVtYmVkZGVkQmxvYkZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIE1heEVtYmVkZGVkTG9iRmllbGRTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChNYXhFbWJlZGRlZEJsb2JGaWVsZFN0cmF0ZWd5LmNsYXNzKTsKKworICAgIHByaXZhdGUgaW50IF9tYXhTaXplID0gMDsKKworICAgIHByb3RlY3RlZCBpbnQgZ2V0RXhwZWN0ZWRKYXZhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFUeXBlcy5PQkpFQ1Q7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFJvdyByb3cpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBieXRlW10gYiA9IChieXRlW10pIHNtLmdldEltcGxEYXRhKGZpZWxkLmdldEluZGV4KCkpOworICAgICAgICBpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID4gX21heFNpemUpCisgICAgICAgICAgICByb3cuc2V0TnVsbChmaWVsZC5nZXRDb2x1bW5zKClbMF0sIHRydWUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNtLnNldEltcGxEYXRhKGZpZWxkLmdldEluZGV4KCksIG51bGwpOworICAgICAgICAgICAgREJEaWN0aW9uYXJ5LlNlcmlhbGl6ZWREYXRhIGRhdCA9CisgICAgICAgICAgICAgICAgbmV3IERCRGljdGlvbmFyeS5TZXJpYWxpemVkRGF0YShiKTsKKyAgICAgICAgICAgIHJvdy5zZXRPYmplY3QoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBkYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDdXN0b20oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIC8vIGhhdmUgd2UgYWxyZWFkeSBzdG9yZWQgb3VyIHNlcmlhbGl6ZWQgZGF0YT8KKyAgICAgICAgYnl0ZVtdIGIgPSAoYnl0ZVtdKSBzbS5nZXRJbXBsRGF0YShmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgaWYgKGIgPT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBzbS5mZXRjaChmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisKKyAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBmaWVsZCB2YWx1ZQorICAgICAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiID0gZGljdC5zZXJpYWxpemUobywgc3RvcmUpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgZGljdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNldCBpbiBpbXBsIGRhdGEgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlLXNlcmlhbGl6ZSBvbiBzdG9yZQorICAgICAgICAgICAgc20uc2V0SW1wbERhdGEoZmllbGQuZ2V0SW5kZXgoKSwgYik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiLmxlbmd0aCA+IF9tYXhTaXplKSA/IG51bGwgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHB1dERhdGEoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUmVzdWx0U2V0IHJzLAorICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBiID0gKGJ5dGVbXSkgc20uc2V0SW1wbERhdGEoZmllbGQuZ2V0SW5kZXgoKSwgbnVsbCk7CisgICAgICAgIE9iamVjdCBibG9iID0gcnMuZ2V0QmxvYigxKTsKKyAgICAgICAgZGljdC5wdXRCeXRlcyhibG9iLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoIWZpZWxkLmlzU2VyaWFsaXplZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3Qtc2VyaWFsaXplZCIsIGZpZWxkKSk7CisgICAgICAgIHN1cGVyLm1hcChhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBfbWF4U2l6ZSA9IGRpY3QubWF4RW1iZWRkZWRCbG9iU2l6ZTsKKyAgICAgICAgZmllbGQuc2V0VXNlc0ltcGxEYXRhKEJvb2xlYW4uVFJVRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9NYXhFbWJlZGRlZEJ5dGVBcnJheUZpZWxkU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWF4RW1iZWRkZWRCeXRlQXJyYXlGaWVsZFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4YmNmOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWF4RW1iZWRkZWRCeXRlQXJyYXlGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIE1hcHBpbmcgZm9yIGJ5dGUgYXJyYXkgZmllbGRzIG9uIGEgZGljdGlvbmFyeSB0aGF0IGhhcyBhIG1heGltdW0gZW1iZWRkZWQKKyAqIEJMT0Igc2l6ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBNYXhFbWJlZGRlZEJ5dGVBcnJheUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIE1heEVtYmVkZGVkTG9iRmllbGRTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChNYXhFbWJlZGRlZEJ5dGVBcnJheUZpZWxkU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHJpdmF0ZSBpbnQgX21heFNpemUgPSAwOworCisgICAgcHJvdGVjdGVkIGludCBnZXRFeHBlY3RlZEphdmFUeXBlKCkgeworICAgICAgICByZXR1cm4gSmF2YVNRTFR5cGVzLkJZVEVTOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGIgPSBQcmltaXRpdmVXcmFwcGVyQXJyYXlzLnRvQnl0ZUFycmF5KHNtLmZldGNoT2JqZWN0CisgICAgICAgICAgICAoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICBpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID4gX21heFNpemUpCisgICAgICAgICAgICByb3cuc2V0Qnl0ZXMoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm93LnNldEJ5dGVzKGZpZWxkLmdldENvbHVtbnMoKVswXSwgYik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDdXN0b20oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIE9iamVjdCB2YWwgPSBzbS5mZXRjaE9iamVjdChmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgcmV0dXJuICh2YWwgIT0gbnVsbCAmJiBBcnJheS5nZXRMZW5ndGgodmFsKSA+IF9tYXhTaXplKSA/IG51bGwKKyAgICAgICAgICAgIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwdXREYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFJlc3VsdFNldCBycywKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3QgYmxvYiA9IHJzLmdldEJsb2IoMSk7CisgICAgICAgIGRpY3QucHV0Qnl0ZXMoYmxvYiwgUHJpbWl0aXZlV3JhcHBlckFycmF5cy50b0J5dGVBcnJheShzbS5mZXRjaE9iamVjdAorICAgICAgICAgICAgKGZpZWxkLmdldEluZGV4KCkpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBsb2FkKENvbHVtbiBjb2wsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFByaW1pdGl2ZVdyYXBwZXJBcnJheXMudG9PYmplY3RWYWx1ZShmaWVsZCwKKyAgICAgICAgICAgIChieXRlW10pIHJlcy5nZXRCeXRlcyhjb2wsIGpvaW5zKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFwKGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGUoKSAhPSBieXRlW10uY2xhc3MgJiYgZmllbGQuZ2V0VHlwZSgpICE9IEJ5dGVbXS5jbGFzcykKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWJ5dGVzIiwgZmllbGQpKTsKKyAgICAgICAgc3VwZXIubWFwKGFkYXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGZpZWxkLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0REJEaWN0aW9uYXJ5KCk7CisgICAgICAgIF9tYXhTaXplID0gZGljdC5tYXhFbWJlZGRlZEJsb2JTaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWF4RW1iZWRkZWRDaGFyQXJyYXlGaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01heEVtYmVkZGVkQ2hhckFycmF5RmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTk2MmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01heEVtYmVkZGVkQ2hhckFycmF5RmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBNYXBwaW5nIGZvciBDTE9CIGNoYXJhY3RlciBhcnJheSBvbiBhIGRpY3Rpb25hcnkgdGhhdCBoYXMgYSBtYXhpbXVtCisgKiBlbWJlZGRlZCBDTE9CIHNpemUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgTWF4RW1iZWRkZWRDaGFyQXJyYXlGaWVsZFN0cmF0ZWd5CisgICAgZXh0ZW5kcyBNYXhFbWJlZGRlZExvYkZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoTWF4RW1iZWRkZWRDaGFyQXJyYXlGaWVsZFN0cmF0ZWd5LmNsYXNzKTsKKworICAgIHByaXZhdGUgaW50IF9tYXhTaXplID0gMDsKKworICAgIHByb3RlY3RlZCBpbnQgZ2V0RXhwZWN0ZWRKYXZhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFTUUxUeXBlcy5DSEFSX1NUUkVBTTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUm93IHJvdykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBjID0gUHJpbWl0aXZlV3JhcHBlckFycmF5cy4KKyAgICAgICAgICAgIHRvQ2hhckFycmF5KHNtLmZldGNoT2JqZWN0KGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjLmxlbmd0aCA+IF9tYXhTaXplKQorICAgICAgICAgICAgcm93LnNldE51bGwoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCB0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm93LnNldENoYXJhY3RlclN0cmVhbShmaWVsZC5nZXRDb2x1bW5zKClbMF0sCisgICAgICAgICAgICAgICAgbmV3IENoYXJBcnJheVJlYWRlcihjKSwgYy5sZW5ndGgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ3VzdG9tKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBPYmplY3QgdmFsID0gc20uZmV0Y2hPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgIHJldHVybiAodmFsICE9IG51bGwgJiYgQXJyYXkuZ2V0TGVuZ3RoKHZhbCkgPiBfbWF4U2l6ZSkgPyBudWxsCisgICAgICAgICAgICA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHV0RGF0YShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBSZXN1bHRTZXQgcnMsCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IGNsb2IgPSBycy5nZXRDbG9iKDEpOworICAgICAgICBkaWN0LnB1dENoYXJzKGNsb2IsIFByaW1pdGl2ZVdyYXBwZXJBcnJheXMuCisgICAgICAgICAgICB0b0NoYXJBcnJheShzbS5mZXRjaE9iamVjdChmaWVsZC5nZXRJbmRleCgpKSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgbG9hZChDb2x1bW4gY29sLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJlYWRlciByZWFkZXIgPSByZXMuZ2V0Q2hhcmFjdGVyU3RyZWFtKGNvbCwgam9pbnMpOworICAgICAgICBpZiAocmVhZGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2hhckFycmF5V3JpdGVyIHdyaXRlciA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGM7IChjID0gcmVhZGVyLnJlYWQoKSkgIT0gLTE7KQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjKTsKKyAgICAgICAgICAgIHJldHVybiBQcmltaXRpdmVXcmFwcGVyQXJyYXlzLnRvT2JqZWN0VmFsdWUoZmllbGQsCisgICAgICAgICAgICAgICAgd3JpdGVyLnRvQ2hhckFycmF5KCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oaW9lLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFwKGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGUoKSAhPSBjaGFyW10uY2xhc3MKKyAgICAgICAgICAgICYmIGZpZWxkLmdldFR5cGUoKSAhPSBDaGFyYWN0ZXJbXS5jbGFzcykKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWNoYXJzIiwgZmllbGQpKTsKKyAgICAgICAgc3VwZXIubWFwKGFkYXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9IGZpZWxkLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0REJEaWN0aW9uYXJ5KCk7CisgICAgICAgIF9tYXhTaXplID0gZGljdC5tYXhFbWJlZGRlZENsb2JTaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWF4RW1iZWRkZWRDbG9iRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9NYXhFbWJlZGRlZENsb2JGaWVsZFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4MmM5MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTWF4RW1iZWRkZWRDbG9iRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIE1hcHBpbmcgZm9yIENMT0Igc3RyaW5nIG9uIGEgZGljdGlvbmFyeSB0aGF0IGhhcyBhIG1heGltdW0gZW1iZWRkZWQKKyAqIENMT0Igc2l6ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBNYXhFbWJlZGRlZENsb2JGaWVsZFN0cmF0ZWd5CisgICAgZXh0ZW5kcyBNYXhFbWJlZGRlZExvYkZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoTWF4RW1iZWRkZWRDbG9iRmllbGRTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGludCBfbWF4U2l6ZSA9IDA7CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEV4cGVjdGVkSmF2YVR5cGUoKSB7CisgICAgICAgIHJldHVybiBKYXZhVHlwZXMuU1RSSU5HOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSBzbS5mZXRjaFN0cmluZyhmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID4gX21heFNpemUpCisgICAgICAgICAgICByb3cuc2V0TnVsbChmaWVsZC5nZXRDb2x1bW5zKClbMF0sIHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByb3cuc2V0U3RyaW5nKGZpZWxkLmdldENvbHVtbnMoKVswXSwgcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDdXN0b20oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIFN0cmluZyBzID0gc20uZmV0Y2hTdHJpbmcoZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgIHJldHVybiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiBfbWF4U2l6ZSkgPyBudWxsIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwdXREYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFJlc3VsdFNldCBycywKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3QgY2xvYiA9IHJzLmdldENsb2IoMSk7CisgICAgICAgIGRpY3QucHV0U3RyaW5nKGNsb2IsIHNtLmZldGNoU3RyaW5nKGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuU1RSSU5HKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtY2xvYnN0cmluZyIsIGZpZWxkKSk7CisgICAgICAgIHN1cGVyLm1hcChhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBmaWVsZC5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldERCRGljdGlvbmFyeSgpOworICAgICAgICBfbWF4U2l6ZSA9IGRpY3QubWF4RW1iZWRkZWRDbG9iU2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL01heEVtYmVkZGVkTG9iRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9NYXhFbWJlZGRlZExvYkZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjViNGMzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9NYXhFbWJlZGRlZExvYkZpZWxkU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIExPQnMgb24gZGF0YWJhc2VzIHRoYXQgbGltaXQgdGhlIG1heCBlbWJlZGRlZCBMT0Igc2l6ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK2Fic3RyYWN0IGNsYXNzIE1heEVtYmVkZGVkTG9iRmllbGRTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RGaWVsZFN0cmF0ZWd5IHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgZmllbGQgZnJvbSB7QGxpbmsgSmF2YVR5cGVzfSBvcgorICAgICAqIHtAbGluayBKYXZhU1FMVHlwZXN9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0RXhwZWN0ZWRKYXZhVHlwZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgb3duaW5nIGZpZWxkIGludG8gdGhlIGdpdmVuIHJvdy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUm93IHJvdykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBjdXN0b20gaW5zZXJ0L3VwZGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQm9vbGVhbiBpc0N1c3RvbShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIgaW50byB0aGUgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXREYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFJlc3VsdFNldCBycywKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBhc3NlcnROb3RNYXBwZWRCeSgpOworCisgICAgICAgIC8vIG1hcCBqb2luIGtleSwgaWYgYW55CisgICAgICAgIGZpZWxkLm1hcEpvaW4oYWRhcHQsIGZhbHNlKTsKKyAgICAgICAgZmllbGQuZ2V0S2V5TWFwcGluZygpLmdldFZhbHVlSW5mbygpLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cworICAgICAgICAgICAgKGZpZWxkLmdldEtleSgpLCAhYWRhcHQpOworICAgICAgICBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFZhbHVlSW5mbygpLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cworICAgICAgICAgICAgKGZpZWxkLmdldEVsZW1lbnQoKSwgIWFkYXB0KTsKKworICAgICAgICBWYWx1ZU1hcHBpbmdJbmZvIHZpbmZvID0gZmllbGQuZ2V0VmFsdWVJbmZvKCk7CisgICAgICAgIHZpbmZvLmFzc2VydE5vSm9pbihmaWVsZCwgdHJ1ZSk7CisgICAgICAgIHZpbmZvLmFzc2VydE5vRm9yZWlnbktleShmaWVsZCwgIWFkYXB0KTsKKworICAgICAgICAvLyBnZXQgdmFsdWUgY29sdW1ucworICAgICAgICBDb2x1bW4gdG1wQ29sID0gbmV3IENvbHVtbigpOworICAgICAgICB0bXBDb2wuc2V0TmFtZShmaWVsZC5nZXROYW1lKCkpOworICAgICAgICB0bXBDb2wuc2V0SmF2YVR5cGUoZ2V0RXhwZWN0ZWRKYXZhVHlwZSgpKTsKKyAgICAgICAgdG1wQ29sLnNldFNpemUoLTEpOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdmluZm8uZ2V0Q29sdW1ucyhmaWVsZCwgZmllbGQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgbmV3IENvbHVtbltdeyB0bXBDb2wgfSwgZmllbGQuZ2V0VGFibGUoKSwgYWRhcHQpOworCisgICAgICAgIGZpZWxkLnNldENvbHVtbnMoY29scyk7CisgICAgICAgIGZpZWxkLnNldENvbHVtbklPKHZpbmZvLmdldENvbHVtbklPKCkpOworICAgICAgICBmaWVsZC5tYXBDb25zdHJhaW50cyhmaWVsZC5nZXROYW1lKCksIGFkYXB0KTsKKyAgICAgICAgZmllbGQubWFwUHJpbWFyeUtleShhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gaXNDdXN0b21JbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIGlmICghZmllbGQuZ2V0Q29sdW1uSU8oKS5pc0luc2VydGFibGUoMCwgZmFsc2UpKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIHJldHVybiBpc0N1c3RvbShzbSwgc3RvcmUpOworICAgIH0KKworICAgIHB1YmxpYyBCb29sZWFuIGlzQ3VzdG9tVXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBpZiAoIWZpZWxkLmdldENvbHVtbklPKCkuaXNVcGRhdGFibGUoMCwgZmFsc2UpKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIHJldHVybiBpc0N1c3RvbShzbSwgc3RvcmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoIWZpZWxkLmdldENvbHVtbklPKCkuaXNJbnNlcnRhYmxlKDAsIGZhbHNlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgUm93IHJvdyA9IGZpZWxkLmdldFJvdyhzbSwgc3RvcmUsIHJtLCBSb3cuQUNUSU9OX0lOU0VSVCk7CisgICAgICAgIGlmIChyb3cgIT0gbnVsbCkKKyAgICAgICAgICAgIHVwZGF0ZShzbSwgcm93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaWVsZC5nZXRDb2x1bW5JTygpLmlzVXBkYXRhYmxlKDAsIGZhbHNlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgUm93IHJvdyA9IGZpZWxkLmdldFJvdyhzbSwgc3RvcmUsIHJtLCBSb3cuQUNUSU9OX1VQREFURSk7CisgICAgICAgIGlmIChyb3cgIT0gbnVsbCkKKyAgICAgICAgICAgIHVwZGF0ZShzbSwgcm93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmllbGQuZGVsZXRlUm93KHNtLCBzdG9yZSwgcm0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGN1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBjdXN0b21VcGRhdGUoc20sIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21VcGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2VsZWN0IGV4aXN0aW5nIHZhbHVlIGZvciB1cGRhdGUKKyAgICAgICAgQ29sdW1uIGNvbCA9IGZpZWxkLmdldENvbHVtbnMoKVswXTsKKyAgICAgICAgU2VsZWN0IHNlbCA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdTZWxlY3QoKTsKKyAgICAgICAgc2VsLnNlbGVjdChjb2wpOworICAgICAgICBmaWVsZC53aGVyZVByaW1hcnlLZXkoc2VsLCBzbSwgc3RvcmUpOworICAgICAgICBTUUxCdWZmZXIgc3FsID0gc2VsLnRvU2VsZWN0KHRydWUsIHN0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpKTsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBzdG9yZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0bW50ID0gc3FsLnByZXBhcmVTdGF0ZW1lbnQoY29ubiwKKyAgICAgICAgICAgICAgICBSZXN1bHRTZXQuVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUsCisgICAgICAgICAgICAgICAgUmVzdWx0U2V0LkNPTkNVUl9VUERBVEFCTEUpOworICAgICAgICAgICAgcnMgPSBzdG1udC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgIHJzLm5leHQoKTsKKworICAgICAgICAgICAgcHV0RGF0YShzbSwgcnMsIHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0bW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RtbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBzdXBwb3J0c1NlbGVjdChTZWxlY3Qgc2VsLCBpbnQgdHlwZSwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIGlmICh0eXBlID09IFNlbGVjdC5UWVBFX0pPSU5MRVNTICYmIHNlbC5pc1NlbGVjdGVkKGZpZWxkLmdldFRhYmxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2VsZWN0KFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSkgeworICAgICAgICBpZiAoc2VsLmlzRGlzdGluY3QoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsLnNlbGVjdChmaWVsZC5nZXRDb2x1bW5zKClbMF0sIGZpZWxkLmpvaW4oc2VsKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGZpZWxkLmdldENvbHVtbnMoKVswXTsKKyAgICAgICAgaWYgKHJlcy5jb250YWlucyhjb2wpKQorICAgICAgICAgICAgc20uc3RvcmUoZmllbGQuZ2V0SW5kZXgoKSwgbG9hZChjb2wsIHJlcywgbnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGZpZWxkLmdldENvbHVtbnMoKVswXTsKKyAgICAgICAgU2VsZWN0IHNlbCA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdTZWxlY3QoKTsKKyAgICAgICAgc2VsLnNlbGVjdChjb2wpOworICAgICAgICBmaWVsZC53aGVyZVByaW1hcnlLZXkoc2VsLCBzbSwgc3RvcmUpOworCisgICAgICAgIFJlc3VsdCByZXMgPSBzZWwuZXhlY3V0ZShzdG9yZSwgZmV0Y2gpOworICAgICAgICBPYmplY3QgdmFsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChyZXMubmV4dCgpKQorICAgICAgICAgICAgICAgIHZhbCA9IGxvYWQoY29sLCByZXMsIG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgc20uc3RvcmUoZmllbGQuZ2V0SW5kZXgoKSwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoaXMgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVzdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgbG9hZChDb2x1bW4gY29sLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXMuZ2V0T2JqZWN0KGNvbCwgbnVsbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTnVsbChTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLCBKb2lucyBqb2lucykgeworICAgICAgICBqb2lucyA9IGpvaW4oam9pbnMsIGZhbHNlKTsKKyAgICAgICAgc3FsLmFwcGVuZChzZWwuZ2V0Q29sdW1uQWxpYXMoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBqb2lucykpLgorICAgICAgICAgICAgYXBwZW5kKCIgSVMgIikuYXBwZW5kVmFsdWUobnVsbCwgZmllbGQuZ2V0Q29sdW1ucygpWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgam9pbnMgPSBqb2luKGpvaW5zLCBmYWxzZSk7CisgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGZpZWxkLmdldENvbHVtbnMoKVswXSwgam9pbnMpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiIElTIE5PVCAiKS5hcHBlbmRWYWx1ZShudWxsLCBmaWVsZC5nZXRDb2x1bW5zKClbMF0pOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmpvaW4oam9pbnMsIGZvcmNlT3V0ZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZChmaWVsZC5nZXRDb2x1bW5zKClbMF0sIHJlcywgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbmFibGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0sCisgICAgICAgIE9iamVjdCBwcmV2VmFsdWUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTm9uZUNsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTm9uZUNsYXNzU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRmMTFiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Ob25lQ2xhc3NTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKKworLyoqCisgKiBTdHJhdGVneSBmb3IgY2xhc3NlcyB0aGF0IGFyZW4ndCBtYXBwZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIE5vbmVDbGFzc1N0cmF0ZWd5CisgICAgZXh0ZW5kcyBBYnN0cmFjdENsYXNzU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAibm9uZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb25lQ2xhc3NTdHJhdGVneSBfaW5zdGFuY2UgPSBuZXcgTm9uZUNsYXNzU3RyYXRlZ3koKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE5vbmVDbGFzc1N0cmF0ZWd5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9uZUNsYXNzU3RyYXRlZ3kgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGlkZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5vbmVDbGFzc1N0cmF0ZWd5KCkgeworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBBTElBUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc01hcHBpbmcoQ2xhc3NNYXBwaW5nIG93bmVyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93Rmx1c2hFeGNlcHRpb24oc20pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvd0ZsdXNoRXhjZXB0aW9uKHNtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3dGbHVzaEV4Y2VwdGlvbihzbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3cgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIG9uIGF0dGVtcHQgdG8gZmx1c2ggYW4gdW5tYXBwZWQgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dGbHVzaEV4Y2VwdGlvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImZsdXNoLXZpcnR1YWwiLAorICAgICAgICAgICAgc20uZ2V0TWV0YURhdGEoKSwgc20uZ2V0T2JqZWN0SWQoKSkpLgorICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKS4KKyAgICAgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Ob25lRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2YzBlMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRpc2NyaW1pbmF0b3I7CisKKy8qKgorICogTm8tb3AgRGlzY3JpbWluYXRvciBzdHJhdGVneS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3REaXNjcmltaW5hdG9yU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAibm9uZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb25lRGlzY3JpbWluYXRvclN0cmF0ZWd5IF9pbnN0YW5jZSA9CisgICAgICAgIG5ldyBOb25lRGlzY3JpbWluYXRvclN0cmF0ZWd5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIaWRlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gQUxJQVM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvcihEaXNjcmltaW5hdG9yIG93bmVyKSB7CisgICAgICAgIC8vIG1hcmsgc3VicyBsb2FkZWQgaW1tZWRpYXRlbHkgc2luY2Ugd2Uga25vdyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgLy8gdG8gbG9hZCB0aGVtCisgICAgICAgIG93bmVyLnNldFN1YmNsYXNzZXNMb2FkZWQodHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Ob25lRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Ob25lRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZGQzMTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL05vbmVGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworCisvKioKKyAqIEFuIHVubWFwcGVkIGZpZWxkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBOb25lRmllbGRTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RGaWVsZFN0cmF0ZWd5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTID0gIm5vbmUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9uZUZpZWxkU3RyYXRlZ3kgX2luc3RhbmNlID0gbmV3IE5vbmVGaWVsZFN0cmF0ZWd5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5vbmVGaWVsZFN0cmF0ZWd5IGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gX2luc3RhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhpZGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBOb25lRmllbGRTdHJhdGVneSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gQUxJQVM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRNYXBwaW5nKEZpZWxkTWFwcGluZyBvd25lcikgeworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTm9uZVZlcnNpb25TdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9Ob25lVmVyc2lvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1ZDQ3OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTm9uZVZlcnNpb25TdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZlcnNpb247CisKKy8qKgorICogTm8tb3AgdmVyc2lvbiBzdHJhdGVneS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTm9uZVZlcnNpb25TdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAibm9uZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb25lVmVyc2lvblN0cmF0ZWd5IF9pbnN0YW5jZSA9CisgICAgICAgIG5ldyBOb25lVmVyc2lvblN0cmF0ZWd5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9uZVZlcnNpb25TdHJhdGVneSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIaWRlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgTm9uZVZlcnNpb25TdHJhdGVneSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gQUxJQVM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihWZXJzaW9uIG93bmVyKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9OdW1iZXJWZXJzaW9uU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTnVtYmVyVmVyc2lvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5N2JlNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvTnVtYmVyVmVyc2lvblN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBVc2VzIGEgdmVyc2lvbiBudW1iZXIgZm9yIG9wdGltaXN0aWMgdmVyc2lvbmluZy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTnVtYmVyVmVyc2lvblN0cmF0ZWd5CisgICAgZXh0ZW5kcyBDb2x1bW5WZXJzaW9uU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAidmVyc2lvbi1udW1iZXIiOworCisgICAgcHJpdmF0ZSBOdW1iZXIgX2luaXRpYWwgPSBOdW1iZXJzLnZhbHVlT2YoMSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHZlcnNpb24gY29sdW1uLiBEZWZhdWx0cyB0byAxLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShpbnQgaW5pdGlhbCkgeworICAgICAgICBfaW5pdGlhbCA9IE51bWJlcnMudmFsdWVPZihpbml0aWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgZm9yIHZlcnNpb24gY29sdW1uLiBEZWZhdWx0cyB0byAxLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5pdGlhbFZhbHVlKCkgeworICAgICAgICByZXR1cm4gX2luaXRpYWwuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gQUxJQVM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRKYXZhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFUeXBlcy5JTlQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBuZXh0VmVyc2lvbihPYmplY3QgdmVyc2lvbikgeworICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9pbml0aWFsOworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKCgoTnVtYmVyKSB2ZXJzaW9uKS5pbnRWYWx1ZSgpICsgMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9PYmplY3RJZENsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvT2JqZWN0SWRDbGFzc1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkYjVhOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvT2JqZWN0SWRDbGFzc1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBDbGFzcyBtYXBwaW5nIGZvciBlbWJlZGRlZCBvYmplY3QgaWQgZmllbGRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RJZENsYXNzU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0Q2xhc3NTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChPYmplY3RJZENsYXNzU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHVibGljIHZvaWQgbWFwKGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIHZtID0gY2xzLmdldEVtYmVkZGluZ01hcHBpbmcoKTsKKyAgICAgICAgaWYgKHZtID09IG51bGwgfHwgdm0uZ2V0VHlwZSgpICE9IGNscy5nZXREZXNjcmliZWRUeXBlKCkKKyAgICAgICAgICAgIHx8IHZtLmdldFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLk9JRCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LW9pZCIsIGNscykpOworCisgICAgICAgIENsYXNzTWFwcGluZ0luZm8gaW5mbyA9IGNscy5nZXRNYXBwaW5nSW5mbygpOworICAgICAgICBpbmZvLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cyhjbHMsIHRydWUpOworICAgICAgICBjbHMuc2V0VGFibGUodm0uZ2V0RmllbGRNYXBwaW5nKCkuZ2V0VGFibGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9PYmplY3RJZFZhbHVlSGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9PYmplY3RJZFZhbHVlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTc0NjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL09iamVjdElkVmFsdWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9iamVjdElkU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKKworLyoqCisgKiBIYW5kbGVyIGZvciBlbWJlZGRlZCBvYmplY3QgaWQgZmllbGRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIE9iamVjdElkVmFsdWVIYW5kbGVyCisgICAgZXh0ZW5kcyBFbWJlZFZhbHVlSGFuZGxlciB7CisKKyAgICBwcml2YXRlIE9iamVjdFtdIF9hcmdzID0gbnVsbDsKKworICAgIHB1YmxpYyBDb2x1bW5bXSBtYXAoVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwgQ29sdW1uSU8gaW8sCisgICAgICAgIGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgTGlzdCBjb2xzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHN1cGVyLm1hcCh2bSwgbmFtZSwgaW8sIGFkYXB0LCBjb2xzLCBhcmdzKTsKKworICAgICAgICB2bS5zZXRDb2x1bW5zKChDb2x1bW5bXSkgY29scy50b0FycmF5KG5ldyBDb2x1bW5bY29scy5zaXplKCldKSk7CisgICAgICAgIF9hcmdzID0gYXJncy50b0FycmF5KCk7CisgICAgICAgIHJldHVybiB2bS5nZXRDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRBcmd1bWVudChWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgcmV0dXJuIF9hcmdzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gKHZhbCA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogbmV3IE9iamVjdElkU3RhdGVNYW5hZ2VyKHZhbCwgbnVsbCwgdm0pOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdm0uZ2V0Q29sdW1ucygpOworICAgICAgICBPYmplY3QgcnZhbCA9IG51bGw7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA+IDEpCisgICAgICAgICAgICBydmFsID0gbmV3IE9iamVjdFtjb2xzLmxlbmd0aF07CisgICAgICAgIHJldHVybiBzdXBlci50b0RhdGFTdG9yZVZhbHVlKHNtLCB2bSwgc3RvcmUsIGNvbHMsIHJ2YWwsIDApOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9PYmplY3RWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwpIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IG5ldyBPYmplY3RJZFN0YXRlTWFuYWdlcihudWxsLCBudWxsLCB2bSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci50b09iamVjdFZhbHVlKHNtLCB2bSwgdmFsLCBudWxsLCBudWxsLCB2bS5nZXRDb2x1bW5zKCksIDApOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBiZSBwb3NzaWJsZQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc20uZ2V0TWFuYWdlZEluc3RhbmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9QcmltaXRpdmVGaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1ByaW1pdGl2ZUZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmU4ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9QcmltaXRpdmVGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuUHJpbWFyeUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVTdHJhdGVnaWVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIERpcmVjdCBtYXBwaW5nIGZyb20gYSBwcmltaXRpdmUgdmFsdWUgdG8gYSBjb2x1bW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgUHJpbWl0aXZlRmllbGRTdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RGaWVsZFN0cmF0ZWd5CisgICAgaW1wbGVtZW50cyBKb2luYWJsZSwgRW1iZWRkYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTCA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFByaW1pdGl2ZUZpZWxkU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9zdGF0ZUltYWdlID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoZmllbGQuaXNTZXJpYWxpemVkKCkgfHwgIWZpZWxkLmdldFR5cGUoKS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtcHJpbWl0aXZlIiwgZmllbGQpKTsKKyAgICAgICAgYXNzZXJ0Tm90TWFwcGVkQnkoKTsKKworICAgICAgICAvLyBtYXAgam9pbiBrZXksIGlmIGFueQorICAgICAgICBmaWVsZC5tYXBKb2luKGFkYXB0LCBmYWxzZSk7CisgICAgICAgIGZpZWxkLmdldEtleU1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMKKyAgICAgICAgICAgIChmaWVsZC5nZXRLZXkoKSwgIWFkYXB0KTsKKyAgICAgICAgZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMKKyAgICAgICAgICAgIChmaWVsZC5nZXRFbGVtZW50KCksICFhZGFwdCk7CisKKyAgICAgICAgVmFsdWVNYXBwaW5nSW5mbyB2aW5mbyA9IGZpZWxkLmdldFZhbHVlSW5mbygpOworICAgICAgICB2aW5mby5hc3NlcnROb0pvaW4oZmllbGQsIHRydWUpOworICAgICAgICB2aW5mby5hc3NlcnROb0ZvcmVpZ25LZXkoZmllbGQsICFhZGFwdCk7CisKKyAgICAgICAgLy8gZ2V0IHZhbHVlIGNvbHVtbnMKKyAgICAgICAgQ29sdW1uIHRtcENvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgdG1wQ29sLnNldE5hbWUoZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgdG1wQ29sLnNldEphdmFUeXBlKGZpZWxkLmdldFR5cGVDb2RlKCkpOworCisgICAgICAgIENvbHVtbltdIGNvbHMgPSB2aW5mby5nZXRDb2x1bW5zKGZpZWxkLCBmaWVsZC5nZXROYW1lKCksCisgICAgICAgICAgICBuZXcgQ29sdW1uW117IHRtcENvbCB9LCBmaWVsZC5nZXRUYWJsZSgpLCBhZGFwdCk7CisgICAgICAgIGlmIChmaWVsZC5nZXRWYWx1ZVN0cmF0ZWd5KCkgPT0gVmFsdWVTdHJhdGVnaWVzLkFVVE9BU1NJR04pCisgICAgICAgICAgICBjb2xzWzBdLnNldEF1dG9Bc3NpZ25lZCh0cnVlKTsKKworICAgICAgICBmaWVsZC5zZXRDb2x1bW5zKGNvbHMpOworICAgICAgICBmaWVsZC5zZXRDb2x1bW5JTyh2aW5mby5nZXRDb2x1bW5JTygpKTsKKyAgICAgICAgZmllbGQubWFwQ29uc3RyYWludHMoZmllbGQuZ2V0TmFtZSgpLCBhZGFwdCk7CisKKyAgICAgICAgLy8gYWRkIHByaW1hcnkga2V5IGNvbHVtbnMgdG8gdGFibGUgcGsgaWYgbG9naWNhbAorICAgICAgICBmaWVsZC5tYXBQcmltYXJ5S2V5KGFkYXB0KTsKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IGZpZWxkLmdldFRhYmxlKCkuZ2V0UHJpbWFyeUtleSgpOworICAgICAgICBpZiAoZmllbGQuaXNQcmltYXJ5S2V5KCkgJiYgcGsgIT0gbnVsbCAmJiAoYWRhcHQgfHwgcGsuaXNMb2dpY2FsKCkpKQorICAgICAgICAgICAgcGsuYWRkQ29sdW1uKGNvbHNbMF0pOworCisgICAgICAgIC8vIHNldCBqb2luYWJsZQorICAgICAgICBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKS5zZXRKb2luYWJsZShmaWVsZC5nZXRDb2x1bW5zKClbMF0sIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIC8vIHJlY29yZCB3aGV0aGVyIHdlJ3JlIHVzaW5nIGEgc3RhdGUgaW1hZ2UgaW5kaWNhdG9yLCB3aGljaCByZXF1aXJlcworICAgICAgICAvLyB0aGF0IHdlIGRvIHNwZWNpYWwgbnVsbCBjaGVja3Mgd2hlbiBsb2FkaW5nIHByaW1pdGl2ZXMKKyAgICAgICAgX3N0YXRlSW1hZ2UgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKS5nZXRWZXJzaW9uKCkuZ2V0U3RyYXRlZ3koKS4KKyAgICAgICAgICAgIGdldEFsaWFzKCkuZXF1YWxzKFN0YXRlQ29tcGFyaXNvblZlcnNpb25TdHJhdGVneS5BTElBUyk7CisgICAgICAgIGlmIChfc3RhdGVJbWFnZSkKKyAgICAgICAgICAgIGZpZWxkLnNldFVzZXNJbXBsRGF0YShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaWVsZC5nZXRDb2x1bW5JTygpLmlzSW5zZXJ0YWJsZSgwLCBmYWxzZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9JTlNFUlQpOworICAgICAgICBpZiAocm93ICE9IG51bGwpCisgICAgICAgICAgICB1cGRhdGUoc20sIHJvdyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZmllbGQuZ2V0Q29sdW1uSU8oKS5pc1VwZGF0YWJsZSgwLCBmYWxzZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9VUERBVEUpOworICAgICAgICBpZiAocm93ICE9IG51bGwpCisgICAgICAgICAgICB1cGRhdGUoc20sIHJvdyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGZpZWxkLmRlbGV0ZVJvdyhzbSwgc3RvcmUsIHJtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBvd25pbmcgZmllbGQgaW50byB0aGUgZ2l2ZW4gcm93LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUm93IHJvdykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbiBjb2wgPSBmaWVsZC5nZXRDb2x1bW5zKClbMF07CisgICAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByb3cuc2V0Qm9vbGVhbihjb2wsIHNtLmZldGNoQm9vbGVhbihmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIHJvdy5zZXRCeXRlKGNvbCwgc20uZmV0Y2hCeXRlKGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgcm93LnNldENoYXIoY29sLCBzbS5mZXRjaENoYXIoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJvdy5zZXREb3VibGUoY29sLCBzbS5mZXRjaERvdWJsZShmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICByb3cuc2V0RmxvYXQoY29sLCBzbS5mZXRjaEZsb2F0KGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICByb3cuc2V0SW50KGNvbCwgc20uZmV0Y2hJbnQoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgICAgICByb3cuc2V0TG9uZyhjb2wsIHNtLmZldGNoTG9uZyhmaWVsZC5nZXRJbmRleCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICByb3cuc2V0U2hvcnQoY29sLCBzbS5mZXRjaFNob3J0KGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN1cHBvcnRzU2VsZWN0KFNlbGVjdCBzZWwsIGludCB0eXBlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gU2VsZWN0LlRZUEVfSk9JTkxFU1MgJiYgc2VsLmlzU2VsZWN0ZWQoZmllbGQuZ2V0VGFibGUoKSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGludCBzZWxlY3QoU2VsZWN0IHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIHNlbC5zZWxlY3QoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBmaWVsZC5qb2luKHNlbCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbiBjb2wgPSBmaWVsZC5nZXRDb2x1bW5zKClbMF07CisgICAgICAgIGlmICghcmVzLmNvbnRhaW5zKGNvbCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGlkeCA9IGZpZWxkLmdldEluZGV4KCk7CisgICAgICAgIGJvb2xlYW4gY2hlY2tOdWxsID0gX3N0YXRlSW1hZ2UgJiYgIWZpZWxkLmlzSm9pbk91dGVyKCk7CisgICAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICBzbS5zdG9yZUJvb2xlYW4oaWR4LCByZXMuZ2V0Qm9vbGVhbihjb2wpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgc20uc3RvcmVCeXRlKGlkeCwgcmVzLmdldEJ5dGUoY29sKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIHNtLnN0b3JlQ2hhcihpZHgsIHJlcy5nZXRDaGFyKGNvbCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHNtLnN0b3JlRG91YmxlKGlkeCwgcmVzLmdldERvdWJsZShjb2wpKTsKKyAgICAgICAgICAgICAgICBjaGVja051bGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIHNtLnN0b3JlRmxvYXQoaWR4LCByZXMuZ2V0RmxvYXQoY29sKSk7CisgICAgICAgICAgICAgICAgY2hlY2tOdWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICAgICAgc20uc3RvcmVJbnQoaWR4LCByZXMuZ2V0SW50KGNvbCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgICAgICBzbS5zdG9yZUxvbmcoaWR4LCByZXMuZ2V0TG9uZyhjb2wpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgIHNtLnN0b3JlU2hvcnQoaWR4LCByZXMuZ2V0U2hvcnQoY29sKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UncmUgdXNpbmcgc3RhdGUgaW1hZ2UgdmVyc2lvbmluZywgc28gcmVjb3JkIHRoYXQgdGhlIGFjdHVhbCBkYgorICAgICAgICAvLyB2YWx1ZSB3YXMgbnVsbCBzbyB3ZSBhZGQgdGhlIGNvcnJlY3QgT0wgY2hlY2sgb24gdXBkYXRlCisgICAgICAgIGlmIChjaGVja051bGwgJiYgcmVzLndhc051bGwoKSkKKyAgICAgICAgICAgIHNtLnNldEltcGxEYXRhKGZpZWxkLmdldEluZGV4KCksIE5VTEwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZElzTnVsbChTUUxCdWZmZXIgc3FsLCBTZWxlY3Qgc2VsLCBKb2lucyBqb2lucykgeworICAgICAgICBqb2lucyA9IGpvaW4oam9pbnMsIGZhbHNlKTsKKyAgICAgICAgc3FsLmFwcGVuZChzZWwuZ2V0Q29sdW1uQWxpYXMoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBqb2lucykpLgorICAgICAgICAgICAgYXBwZW5kKCIgSVMgIikuYXBwZW5kVmFsdWUobnVsbCwgZmllbGQuZ2V0Q29sdW1ucygpWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgam9pbnMgPSBqb2luKGpvaW5zLCBmYWxzZSk7CisgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGZpZWxkLmdldENvbHVtbnMoKVswXSwgam9pbnMpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiIElTIE5PVCAiKS5hcHBlbmRWYWx1ZShudWxsLCBmaWVsZC5nZXRDb2x1bW5zKClbMF0pOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmpvaW4oam9pbnMsIGZvcmNlT3V0ZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVzLmdldE9iamVjdChmaWVsZC5nZXRDb2x1bW5zKClbMF0sIG51bGwsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25hYmxlKCkgeworICAgICAgICBpZiAoZmllbGQuaXNKb2luT3V0ZXIoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChmaWVsZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSwKKyAgICAgICAgT2JqZWN0IHByZXZWYWx1ZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9VUERBVEUpOworICAgICAgICBpZiAocm93ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gZm9yIHByaW1pdGl2ZXMgbG9hZGVkIGFzIGRlZmF1bHQgdmFscywgY2hlY2sgdG8gc2VlIGlmIHdhcyBudWxsIGluCisgICAgICAgIC8vIHRoZSBkYXRhYmFzZSB3aGVuIGxvYWRlZCA9PSByZW1vdmUgdGhlIGltcGwgZGF0YSBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIC8vIHRvIGJlIHN1cmUgd2UgZG9uJ3QgdGhpbmsgdGhlIHZhbHVlIGlzIG51bGwgYWZ0ZXIgdGhlIGNvbW1pdAorICAgICAgICBDb2x1bW4gY29sID0gZmllbGQuZ2V0Q29sdW1ucygpWzBdOworICAgICAgICBpZiAoc20uc2V0SW1wbERhdGEoZmllbGQuZ2V0SW5kZXgoKSwgbnVsbCkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJvdy53aGVyZU51bGwoY29sKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm93LndoZXJlT2JqZWN0KGNvbCwgcHJldlZhbHVlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBKb2luYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIGludCBnZXRGaWVsZEluZGV4KCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByaW1hcnlLZXlWYWx1ZShSZXN1bHQgcmVzLCBDb2x1bW5bXSBjb2xzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGNvbHNbMF07CisgICAgICAgIGlmIChmayAhPSBudWxsKQorICAgICAgICAgICAgY29sID0gZmsuZ2V0Q29sdW1uKGNvbCk7CisgICAgICAgIHJldHVybiBKYXZhVHlwZXMuY29udmVydChyZXMuZ2V0T2JqZWN0KGNvbCwgbnVsbCwgam9pbnMpLAorICAgICAgICAgICAgZmllbGQuZ2V0VHlwZUNvZGUoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRKb2luVmFsdWUoT2JqZWN0IGZpZWxkVmFsLCBDb2x1bW4gY29sLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkVmFsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Sm9pblZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENvbHVtbiBjb2wsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICByZXR1cm4gc20uZmV0Y2goZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0Fzc2lnbmVkVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgYXV0b0luYykgeworICAgICAgICBpbnQgaWR4ID0gZmllbGQuZ2V0SW5kZXgoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgIGlmIChhdXRvSW5jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlQm9vbGVhbihpZHgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhdXRvSW5jIGluc3RhbmNlb2YgQm9vbGVhbikKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVCb29sZWFuKGlkeCwgKChCb29sZWFuKSBhdXRvSW5jKS5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUJvb2xlYW4oaWR4LCAoKE51bWJlcikgYXV0b0luYykuaW50VmFsdWUoKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgaWYgKGF1dG9JbmMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVCeXRlKGlkeCwgKGJ5dGUpIDApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVCeXRlKGlkeCwgKChOdW1iZXIpIGF1dG9JbmMpLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgaWYgKGF1dG9JbmMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVDaGFyKGlkeCwgKGNoYXIpIDApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF1dG9JbmMgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCisgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlQ2hhcihpZHgsICgoQ2hhcmFjdGVyKSBhdXRvSW5jKS5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXV0b0luYyBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVDaGFyKGlkeCwgKChTdHJpbmcpIGF1dG9JbmMpLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUNoYXIoaWR4LCAoY2hhcikgKChOdW1iZXIpIGF1dG9JbmMpLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIGlmIChhdXRvSW5jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlRG91YmxlKGlkeCwgMEQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVEb3VibGUoaWR4LCAoKE51bWJlcikgYXV0b0luYykuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoYXV0b0luYyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUZsb2F0KGlkeCwgMEYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVGbG9hdChpZHgsICgoTnVtYmVyKSBhdXRvSW5jKS5mbG9hdFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgICAgIGlmIChhdXRvSW5jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlSW50KGlkeCwgMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUludChpZHgsICgoTnVtYmVyKSBhdXRvSW5jKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgaWYgKGF1dG9JbmMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVMb25nKGlkeCwgMEwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVMb25nKGlkeCwgKChOdW1iZXIpIGF1dG9JbmMpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgIGlmIChhdXRvSW5jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlU2hvcnQoaWR4LCAoc2hvcnQpIDApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVTaG9ydChpZHgsICgoTnVtYmVyKSBhdXRvSW5jKS5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRW1iZWRkYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgQ29sdW1uSU8gZ2V0Q29sdW1uSU8oKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRDb2x1bW5JTygpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRSZXN1bHRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9FbWJlZGRlZE9iamVjdFZhbHVlKE9iamVjdCB2YWwpIHsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRW1iZWRkZWREYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIHRvRGF0YVN0b3JlVmFsdWUodmFsLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZEVtYmVkZGVkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNtLnN0b3JlKGZpZWxkLmdldEluZGV4KCksIHZhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9QcmltaXRpdmVXcmFwcGVyQXJyYXlzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1ByaW1pdGl2ZVdyYXBwZXJBcnJheXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFhNDBhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9QcmltaXRpdmVXcmFwcGVyQXJyYXlzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworCisvKioKKyAqIFByaW1pdGl2ZSB3cmFwcGVyIGFycmF5IGhlbHBlciBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIFByaW1pdGl2ZVdyYXBwZXJBcnJheXMgeworCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gcHJpbWl0aXZlIGFycmF5IHRvIGEgd3JhcHBlciBhcnJheSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgdG9PYmplY3RWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIGNoYXJbXSBhcnJheSkgeworICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodm0uZ2V0VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIENoYXJhY3RlcltdIG9iamVjdEFycmF5ID0gbmV3IENoYXJhY3RlclthcnJheS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBvYmplY3RBcnJheVtpXSA9IG5ldyBDaGFyYWN0ZXIoYXJyYXlbaV0pOworICAgICAgICAgICAgcmV0dXJuIG9iamVjdEFycmF5OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiB2YWx1ZSB0byBhIHByaW1pdGl2ZSBhcnJheSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjaGFyW10gdG9DaGFyQXJyYXkoT2JqZWN0IG9iKSB7CisgICAgICAgIGlmIChvYiBpbnN0YW5jZW9mIENoYXJhY3RlcltdKSB7CisgICAgICAgICAgICBDaGFyYWN0ZXJbXSBjaGFyT2IgPSAoQ2hhcmFjdGVyW10pIG9iOworICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY2hhck9iLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJPYi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjaGFyc1tpXSA9IGNoYXJPYltpXSA9PSBudWxsID8gMCA6IGNoYXJPYltpXS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBjaGFyczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGNoYXJbXSkgb2I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gcHJpbWl0aXZlIGFycmF5IHRvIGEgd3JhcHBlciBhcnJheSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgdG9PYmplY3RWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIGJ5dGVbXSBhcnJheSkgeworICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodm0uZ2V0VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PSBCeXRlLmNsYXNzKSB7CisgICAgICAgICAgICBCeXRlW10gb2JqZWN0QXJyYXkgPSBuZXcgQnl0ZVthcnJheS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBvYmplY3RBcnJheVtpXSA9IG5ldyBCeXRlKGFycmF5W2ldKTsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3RBcnJheTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gdmFsdWUgdG8gYSBwcmltaXRpdmUgYXJyYXkgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZUFycmF5KE9iamVjdCBvYikgeworICAgICAgICBpZiAob2IgaW5zdGFuY2VvZiBCeXRlW10pIHsKKyAgICAgICAgICAgIEJ5dGVbXSBieXRlT2IgPSAoQnl0ZVtdKSBvYjsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVPYi5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlT2IubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSBieXRlT2JbaV0gPT0gbnVsbCA/IDAgOiBieXRlT2JbaV0uYnl0ZVZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChieXRlW10pIG9iOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvbkNvbGxlY3Rpb25JbnZlcnNlS2V5RmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvbkNvbGxlY3Rpb25JbnZlcnNlS2V5RmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjA5NDAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1JlbGF0aW9uQ29sbGVjdGlvbkludmVyc2VLZXlGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eTsKKworLyoqCisgKiBNYXBzIGEgcmVsYXRpb24gdG8gYSBjb2xsZWN0aW9uIG9mIG90aGVyIG9iamVjdHMgdXNpbmcgYW4gaW52ZXJzZQorICogZm9yZWlnbiBrZXkgaW4gdGhlIHJlbGF0ZWQgb2JqZWN0IHRhYmxlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxhdGlvbkNvbGxlY3Rpb25JbnZlcnNlS2V5RmllbGRTdHJhdGVneQorICAgIGV4dGVuZHMgUmVsYXRpb25Ub01hbnlJbnZlcnNlS2V5RmllbGRTdHJhdGVneQorICAgIGltcGxlbWVudHMgTFJTQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmVsYXRpb25Db2xsZWN0aW9uSW52ZXJzZUtleUZpZWxkU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXRGaWVsZE1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3ModHJhdmVyc2UpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRFbGVtZW50Q29sdW1ucyhDbGFzc01hcHBpbmcgZWxlbSkgeworICAgICAgICByZXR1cm4gZWxlbS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KENsYXNzTWFwcGluZyBlbGVtKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRKb2luRm9yZWlnbktleShlbGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RFbGVtZW50KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBlbGVtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHN1cGVyLnNlbGVjdEVsZW1lbnQoc2VsLCBlbGVtLCBzdG9yZSwgZmV0Y2gsIGVhZ2VyTW9kZSwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZEVsZW1lbnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzdXBlci5sb2FkRWxlbWVudChzbSwgc3RvcmUsIGZldGNoLCByZXMsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgQ2xhc3NNYXBwaW5nIGVsZW0pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmpvaW4oam9pbnMsIGVsZW0pOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luRWxlbWVudFJlbGF0aW9uKEpvaW5zIGpvaW5zLCBDbGFzc01hcHBpbmcgZWxlbSkgeworICAgICAgICByZXR1cm4gc3VwZXIuam9pbkVsZW1lbnRSZWxhdGlvbihqb2lucywgZWxlbSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFByb3h5IG5ld0xSU1Byb3h5KCkgeworICAgICAgICByZXR1cm4gbmV3IExSU1Byb3h5Q29sbGVjdGlvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuQ09MTEVDVElPTgorICAgICAgICAgICAgJiYgZmllbGQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuQVJSQVkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1jb2xsIiwgZmllbGQpKTsKKyAgICAgICAgc3VwZXIubWFwKGFkYXB0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1JlbGF0aW9uQ29sbGVjdGlvblRhYmxlRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvbkNvbGxlY3Rpb25UYWJsZUZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThkZDMyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvbkNvbGxlY3Rpb25UYWJsZUZpZWxkU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5OworCisvKioKKyAqIE1hcHMgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgb2JqZWN0cyB0aHJvdWdoIGFuIGFzc29jaWF0aW9uIHRhYmxlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxhdGlvbkNvbGxlY3Rpb25UYWJsZUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIFJlbGF0aW9uVG9NYW55VGFibGVGaWVsZFN0cmF0ZWd5CisgICAgaW1wbGVtZW50cyBMUlNDb2xsZWN0aW9uRmllbGRTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChSZWxhdGlvbkNvbGxlY3Rpb25UYWJsZUZpZWxkU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHVibGljIEZpZWxkTWFwcGluZyBnZXRGaWVsZE1hcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3ModHJhdmVyc2UpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRFbGVtZW50Q29sdW1ucyhDbGFzc01hcHBpbmcgZWxlbSkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pbkZvcmVpZ25LZXkoQ2xhc3NNYXBwaW5nIGVsZW0pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEpvaW5Gb3JlaWduS2V5KGVsZW0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVsZW1lbnQoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGVsZW0sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc3VwZXIuc2VsZWN0RWxlbWVudChzZWwsIGVsZW0sIHN0b3JlLCBmZXRjaCwgZWFnZXJNb2RlLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkRWxlbWVudChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRFbGVtZW50KHNtLCBzdG9yZSwgZmV0Y2gsIHJlcywgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBDbGFzc01hcHBpbmcgZWxlbSkgeworICAgICAgICByZXR1cm4gc3VwZXIuam9pbihqb2lucywgZWxlbSk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5FbGVtZW50UmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyBlbGVtKSB7CisgICAgICAgIHJldHVybiBzdXBlci5qb2luRWxlbWVudFJlbGF0aW9uKGpvaW5zLCBlbGVtKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJveHkgbmV3TFJTUHJveHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgTFJTUHJveHlDb2xsZWN0aW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5DT0xMRUNUSU9OCisgICAgICAgICAgICAmJiBmaWVsZC5nZXRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5BUlJBWSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWNvbGwiLCBmaWVsZCkpOworICAgICAgICBzdXBlci5tYXAoYWRhcHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25GaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1JlbGF0aW9uRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzY2M2IKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1JlbGF0aW9uRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsODYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3RFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5BcHBsaWNhdGlvbklkczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBNYXBwaW5nIGZvciBhIHNpbmdsZS12YWx1ZWQgcmVsYXRpb24gdG8gYW5vdGhlciBlbnRpdHkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgUmVsYXRpb25GaWVsZFN0cmF0ZWd5CisgICAgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkU3RyYXRlZ3kKKyAgICBpbXBsZW1lbnRzIEpvaW5hYmxlLCBFbWJlZGRhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFJlbGF0aW9uRmllbGRTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwcml2YXRlIEJvb2xlYW4gX2ZrT2lkID0gbnVsbDsKKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5QQyB8fCBmaWVsZC5pc0VtYmVkZGVkUEMoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LXJlbGF0aW9uIiwgZmllbGQpKTsKKworICAgICAgICBmaWVsZC5nZXRLZXlNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzCisgICAgICAgICAgICAoZmllbGQuZ2V0S2V5KCksICFhZGFwdCk7CisgICAgICAgIGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzCisgICAgICAgICAgICAoZmllbGQuZ2V0RWxlbWVudCgpLCAhYWRhcHQpOworICAgICAgICBib29sZWFuIGNyaXRlcmlhID0gZmllbGQuZ2V0VmFsdWVJbmZvKCkuZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpOworCisgICAgICAgIC8vIGNoZWNrIGZvciBuYW1lZCBpbnZlcnNlCisgICAgICAgIEZpZWxkTWFwcGluZyBtYXBwZWQgPSBmaWVsZC5nZXRNYXBwZWRCeU1hcHBpbmcoKTsKKyAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWVsZC5nZXRNYXBwaW5nSW5mbygpLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cyhmaWVsZCwgIWFkYXB0KTsKKyAgICAgICAgICAgIGZpZWxkLmdldFZhbHVlSW5mbygpLmFzc2VydE5vU2NoZW1hQ29tcG9uZW50cyhmaWVsZCwgIWFkYXB0KTsKKyAgICAgICAgICAgIG1hcHBlZC5yZXNvbHZlKG1hcHBlZC5NT0RFX01FVEEgfCBtYXBwZWQuTU9ERV9NQVBQSU5HKTsKKworICAgICAgICAgICAgaWYgKCFtYXBwZWQuaXNNYXBwZWQoKSB8fCBtYXBwZWQuaXNTZXJpYWxpemVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJtYXBwZWQtYnktdW5tYXBwZWQiLAorICAgICAgICAgICAgICAgICAgICBmaWVsZCwgbWFwcGVkKSk7CisKKyAgICAgICAgICAgIGlmIChtYXBwZWQuZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFwcGVkLmdldEpvaW5EaXJlY3Rpb24oKSA9PSBtYXBwZWQuSk9JTl9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldEpvaW5EaXJlY3Rpb24oZmllbGQuSk9JTl9JTlZFUlNFKTsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0Q29sdW1ucyhtYXBwZWQuZ2V0RGVmaW5pbmdNYXBwaW5nKCkuCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcmltYXJ5S2V5Q29sdW1ucygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzVHlwZVVuam9pbmVkU3ViY2xhc3MobWFwcGVkKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAoIm1hcHBlZC1pbnZlcnNlLXVuam9pbmVkIiwgZmllbGQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpLCBtYXBwZWQpKTsKKworICAgICAgICAgICAgICAgIGZpZWxkLnNldEZvcmVpZ25LZXkobWFwcGVkLmdldEZvcmVpZ25LZXkKKyAgICAgICAgICAgICAgICAgICAgKGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcHBlZC5nZXRFbGVtZW50KCkuZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNUeXBlVW5qb2luZWRTdWJjbGFzcyhtYXBwZWQuZ2V0RWxlbWVudE1hcHBpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAgICAgKCJtYXBwZWQtaW52ZXJzZS11bmpvaW5lZCIsIGZpZWxkLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKSwgbWFwcGVkKSk7CisKKyAgICAgICAgICAgICAgICAvLyB3YXJuIHRoZSB1c2VyIGFib3V0IG1ha2luZyB0aGUgY29sbGVjdGlvbiBzaWRlIHRoZSBvd25lcgorICAgICAgICAgICAgICAgIExvZyBsb2cgPSBmaWVsZC5nZXRSZXBvc2l0b3J5KCkuZ2V0TG9nKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJjb2xsLW93bmVyIiwgZmllbGQsIG1hcHBlZCkpOworICAgICAgICAgICAgICAgIGZpZWxkLnNldEZvcmVpZ25LZXkobWFwcGVkLmdldEVsZW1lbnRNYXBwaW5nKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEZvcmVpZ25LZXkoKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1pbnYtcmVsYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBmaWVsZCwgbWFwcGVkKSk7CisKKyAgICAgICAgICAgIGZpZWxkLnNldFVzZUNsYXNzQ3JpdGVyaWEoY3JpdGVyaWEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBvcGVuanBhIDMgbWFwcGluZ3MsIHdoaWNoIGRpZG4ndAorICAgICAgICAvLyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc2Vjb25kYXJ5IHRhYmxlIGpvaW5zIGFuZCByZWxhdGlvbnMgYnVpbHQKKyAgICAgICAgLy8gYXJvdW5kIGFuIGludmVyc2Uga2V5OiBjaGVjayB0byBzZWUgaWYgd2UncmUgbWFwcGVkIGFzIGEgc2Vjb25kYXJ5CisgICAgICAgIC8vIHRhYmxlIGpvaW4gYnV0IHdlJ3JlIGluIHRoZSB0YWJsZSBvZiB0aGUgcmVsYXRlZCB0eXBlLCBhbmQgaWYgc28KKyAgICAgICAgLy8gc3dpdGNoIG91ciBqb2luIG1hcHBpbmcgaW5mbyB0byBvdXIgdmFsdWUgbWFwcGluZyBpbmZvCisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBmaWVsZC5nZXRNYXBwaW5nSW5mbygpLmdldFRhYmxlTmFtZSgpOworICAgICAgICBUYWJsZSB0YWJsZSA9IGZpZWxkLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGUoKTsKKyAgICAgICAgVmFsdWVNYXBwaW5nSW5mbyB2aW5mbyA9IGZpZWxkLmdldFZhbHVlSW5mbygpOworICAgICAgICBpZiAodGFibGVOYW1lICE9IG51bGwgJiYgdGFibGUgIT0gbnVsbAorICAgICAgICAgICAgJiYgKHRhYmxlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRhYmxlLmdldE5hbWUoKSkKKyAgICAgICAgICAgIHx8IHRhYmxlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRhYmxlLmdldEZ1bGxOYW1lKCkpKSkgeworICAgICAgICAgICAgdmluZm8uc2V0Sm9pbkRpcmVjdGlvbihNYXBwaW5nSW5mby5KT0lOX0lOVkVSU0UpOworICAgICAgICAgICAgdmluZm8uc2V0Q29sdW1ucyhmaWVsZC5nZXRNYXBwaW5nSW5mbygpLmdldENvbHVtbnMoKSk7CisgICAgICAgICAgICBmaWVsZC5nZXRNYXBwaW5nSW5mbygpLnNldFRhYmxlTmFtZShudWxsKTsKKyAgICAgICAgICAgIGZpZWxkLmdldE1hcHBpbmdJbmZvKCkuc2V0Q29sdW1ucyhudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpZWxkLm1hcEpvaW4oYWRhcHQsIGZhbHNlKTsKKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGVNYXBwaW5nKCkuaXNNYXBwZWQoKSkgeworICAgICAgICAgICAgRm9yZWlnbktleSBmayA9IHZpbmZvLmdldFR5cGVKb2luKGZpZWxkLCBmaWVsZC5nZXROYW1lKCksIHRydWUsCisgICAgICAgICAgICAgICAgYWRhcHQpOworICAgICAgICAgICAgZmllbGQuc2V0Rm9yZWlnbktleShmayk7CisgICAgICAgICAgICBmaWVsZC5zZXRDb2x1bW5JTyh2aW5mby5nZXRDb2x1bW5JTygpKTsKKyAgICAgICAgICAgIGlmICh2aW5mby5nZXRKb2luRGlyZWN0aW9uKCkgPT0gdmluZm8uSk9JTl9JTlZFUlNFKQorICAgICAgICAgICAgICAgIGZpZWxkLnNldEpvaW5EaXJlY3Rpb24oZmllbGQuSk9JTl9JTlZFUlNFKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBSZWxhdGlvblN0cmF0ZWdpZXMubWFwUmVsYXRpb25Ub1VubWFwcGVkUEMoZmllbGQsIGZpZWxkLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBhZGFwdCk7CisKKyAgICAgICAgZmllbGQuc2V0VXNlQ2xhc3NDcml0ZXJpYShjcml0ZXJpYSk7CisgICAgICAgIGZpZWxkLm1hcFByaW1hcnlLZXkoYWRhcHQpOworICAgICAgICBQcmltYXJ5S2V5IHBrID0gZmllbGQuZ2V0VGFibGUoKS5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgIGlmIChmaWVsZC5pc1ByaW1hcnlLZXkoKSkgeworICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IGZpZWxkLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgIGlmIChwayAhPSBudWxsICYmIChhZGFwdCB8fCBway5pc0xvZ2ljYWwoKSkpCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBway5hZGRDb2x1bW4oY29sc1tpXSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCkuc2V0Sm9pbmFibGUoY29sc1tpXSwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXAgY29uc3RyYWludHMgYWZ0ZXIgcGsgc28gd2UgZG9uJ3QgcmUtaW5kZXggLyByZS11bmlxdWUgcGsgY29sCisgICAgICAgIGZpZWxkLm1hcENvbnN0cmFpbnRzKGZpZWxkLmdldE5hbWUoKSwgYWRhcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIG91ciBkZWZpbmluZyBtYXBwaW5nIGlzIGFuIHVuam9pbmVkIHN1YmNsYXNzIG9mCisgICAgICogdGhlIHR5cGUgb2YgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1R5cGVVbmpvaW5lZFN1YmNsYXNzKFZhbHVlTWFwcGluZyBtYXBwZWQpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGRlZiA9IGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpOworICAgICAgICBmb3IgKDsgZGVmICE9IG51bGw7IGRlZiA9IGRlZi5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSkKKyAgICAgICAgICAgIGlmIChkZWYgPT0gbWFwcGVkLmdldFR5cGVNYXBwaW5nKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBmaWVsZC5zZXRVc2VzSW50ZXJtZWRpYXRlKHRydWUpOworCisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBmaWVsZC5nZXRGb3JlaWduS2V5KCk7CisgICAgICAgIGlmIChmayA9PSBudWxsKQorICAgICAgICAgICAgX2ZrT2lkID0gQm9vbGVhbi5UUlVFOworICAgICAgICBlbHNlIGlmIChmaWVsZC5nZXRKb2luRGlyZWN0aW9uKCkgIT0gRmllbGRNYXBwaW5nLkpPSU5fSU5WRVJTRSkKKyAgICAgICAgICAgIF9ma09pZCA9IGZpZWxkLmdldFR5cGVNYXBwaW5nKCkuaXNGb3JlaWduS2V5T2JqZWN0SWQoZmspOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoZmllbGQuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgcmVsID0gUmVsYXRpb25TdHJhdGVnaWVzLmdldFN0YXRlTWFuYWdlcgorICAgICAgICAgICAgKHNtLmZldGNoT2JqZWN0RmllbGQoZmllbGQuZ2V0SW5kZXgoKSksIHN0b3JlLmdldENvbnRleHQoKSk7CisgICAgICAgIGlmIChmaWVsZC5nZXRKb2luRGlyZWN0aW9uKCkgPT0gZmllbGQuSk9JTl9JTlZFUlNFKQorICAgICAgICAgICAgdXBkYXRlSW52ZXJzZShzbSwgcmVsLCBzdG9yZSwgcm0pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9JTlNFUlQpOworICAgICAgICAgICAgaWYgKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpZWxkLnNldEZvcmVpZ25LZXkocm93LCByZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciByZWwgPSBSZWxhdGlvblN0cmF0ZWdpZXMuZ2V0U3RhdGVNYW5hZ2VyCisgICAgICAgICAgICAoc20uZmV0Y2hPYmplY3RGaWVsZChmaWVsZC5nZXRJbmRleCgpKSwgc3RvcmUuZ2V0Q29udGV4dCgpKTsKKworICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpID09IGZpZWxkLkpPSU5fSU5WRVJTRSkgeworICAgICAgICAgICAgbnVsbEludmVyc2Uoc20sIHJtKTsKKyAgICAgICAgICAgIHVwZGF0ZUludmVyc2Uoc20sIHJlbCwgc3RvcmUsIHJtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9VUERBVEUpOworICAgICAgICAgICAgaWYgKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpZWxkLnNldEZvcmVpZ25LZXkocm93LCByZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGZpZWxkLmdldEpvaW5EaXJlY3Rpb24oKSA9PSBmaWVsZC5KT0lOX0lOVkVSU0UpIHsKKyAgICAgICAgICAgIGlmIChzbS5nZXRMb2FkZWQoKS5nZXQoZmllbGQuZ2V0SW5kZXgoKSkpIHsKKyAgICAgICAgICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHJlbCA9IFJlbGF0aW9uU3RyYXRlZ2llcy5nZXRTdGF0ZU1hbmFnZXIoc20uCisgICAgICAgICAgICAgICAgICAgIGZldGNoT2JqZWN0RmllbGQoZmllbGQuZ2V0SW5kZXgoKSksIHN0b3JlLmdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgdXBkYXRlSW52ZXJzZShzbSwgcmVsLCBzdG9yZSwgcm0pOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbnVsbEludmVyc2Uoc20sIHJtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpZWxkLmRlbGV0ZVJvdyhzbSwgc3RvcmUsIHJtKTsKKworICAgICAgICAgICAgLy8gaWYgb3VyIGZvcmVpZ24ga2V5IGhhcyBhIGRlbGV0ZSBhY3Rpb24sIHdlIG5lZWQgdG8gc2V0IHRoZQorICAgICAgICAgICAgLy8gcmVsYXRlZCBvYmplY3Qgc28gY29uc3RyYWludHMgY2FuIGJlIGV2YWx1YXRlZAorICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciByZWwgPSBSZWxhdGlvblN0cmF0ZWdpZXMuZ2V0U3RhdGVNYW5hZ2VyCisgICAgICAgICAgICAgICAgKHNtLmZldGNoT2JqZWN0RmllbGQoZmllbGQuZ2V0SW5kZXgoKSksIHN0b3JlLmdldENvbnRleHQoKSk7CisgICAgICAgICAgICBpZiAocmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGb3JlaWduS2V5IGZrID0gZmllbGQuZ2V0Rm9yZWlnbktleSgoQ2xhc3NNYXBwaW5nKQorICAgICAgICAgICAgICAgICAgICByZWwuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgICAgICAgICAgaWYgKGZrLmdldERlbGV0ZUFjdGlvbigpID09IEZvcmVpZ25LZXkuQUNUSU9OX1JFU1RSSUNUKSB7CisgICAgICAgICAgICAgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9ERUxFVEUpOworICAgICAgICAgICAgICAgICAgICByb3cuc2V0Rm9yZWlnbktleShmaywgbnVsbCwgcmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOdWxsIGludmVyc2UgcmVsYXRpb25zIHRoYXQgcmVmZXJlbmNlIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG51bGxJbnZlcnNlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoZmllbGQuZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBmaWVsZC5nZXRGb3JlaWduS2V5KCk7CisgICAgICAgIENvbHVtbklPIGlvID0gZmllbGQuZ2V0Q29sdW1uSU8oKTsKKyAgICAgICAgaWYgKCFpby5pc0FueVVwZGF0YWJsZShmaywgdHJ1ZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gbnVsbCBpbnZlcnNlIGlmIG5vdCBhbHJlYWR5IGVuZm9yY2VkIGJ5IGZrCisgICAgICAgIGlmIChmaWVsZC5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgdGhyb3cgUmVsYXRpb25TdHJhdGVnaWVzLnVuaW52ZXJzYWJsZShmaWVsZCk7CisgICAgICAgIFJvdyByb3cgPSBybS5nZXRBbGxSb3dzKGZrLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFKTsKKyAgICAgICAgcm93LnNldEZvcmVpZ25LZXkoZmssIGlvLCBudWxsKTsKKyAgICAgICAgcm93LndoZXJlRm9yZWlnbktleShmaywgc20pOworICAgICAgICBybS5mbHVzaEFsbFJvd3Mocm93KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBpbnZlcnNlIGNvbHVtbnMgb2Ygb3VyIHJlbGF0aW9uCisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJbnZlcnNlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgcmVsLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAocmVsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRm9yZWlnbktleSBmayA9IGZpZWxkLmdldEZvcmVpZ25LZXkoKTsKKyAgICAgICAgQ29sdW1uSU8gaW8gPSBmaWVsZC5nZXRDb2x1bW5JTygpOworCisgICAgICAgIGludCBhY3Rpb247CisgICAgICAgIGlmIChyZWwuaXNOZXcoKSAmJiAhcmVsLmlzRmx1c2hlZCgpKSB7CisgICAgICAgICAgICBpZiAoc20uaXNEZWxldGVkKCkgfHwgIWlvLmlzQW55SW5zZXJ0YWJsZShmaywgZmFsc2UpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFjdGlvbiA9IFJvdy5BQ1RJT05fSU5TRVJUOworICAgICAgICB9IGVsc2UgaWYgKHJlbC5pc0RlbGV0ZWQoKSkgeworICAgICAgICAgICAgaWYgKHJlbC5pc0ZsdXNoZWQoKSB8fCAhc20uaXNEZWxldGVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYWN0aW9uID0gUm93LkFDVElPTl9ERUxFVEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc20uaXNEZWxldGVkKCkpCisgICAgICAgICAgICAgICAgc20gPSBudWxsOworICAgICAgICAgICAgaWYgKCFpby5pc0FueVVwZGF0YWJsZShmaywgc20gPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYWN0aW9uID0gUm93LkFDVElPTl9VUERBVEU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmllbGQuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKS5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIHRocm93IFJlbGF0aW9uU3RyYXRlZ2llcy51bmludmVyc2FibGUoZmllbGQpOworCisgICAgICAgIC8vIGdldCB0aGUgcm93IGZvciB0aGUgaW52ZXJzZSBvYmplY3Q7IHRoZSByb3cgbWlnaHQgYmUgaW4gYSBzZWNvbmRhcnkKKyAgICAgICAgLy8gdGFibGUgaWYgdGhlcmUgaXMgYSBmaWVsZCBjb250cm9sbGluZyB0aGUgZm9yZWlnbiBrZXkKKyAgICAgICAgUm93IHJvdyA9IG51bGw7CisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGludnMgPSBmaWVsZC5nZXRJbnZlcnNlTWFwcGluZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW52c1tpXS5nZXRNYXBwZWRCeU1ldGFEYXRhKCkgPT0gZmllbGQKKyAgICAgICAgICAgICAgICAmJiBpbnZzW2ldLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKSB7CisgICAgICAgICAgICAgICAgcm93ID0gaW52c1tpXS5nZXRSb3cocmVsLCBzdG9yZSwgcm0sIGFjdGlvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbE1hcHBpbmcgPSBmaWVsZC5nZXRUeXBlTWFwcGluZygpOworICAgICAgICBpZiAocm93ID09IG51bGwpCisgICAgICAgICAgICByb3cgPSBybS5nZXRSb3cocmVsTWFwcGluZy5nZXRUYWJsZSgpLCBhY3Rpb24sIHJlbCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiB1cGRhdGUsIHRoaXMgbWlnaHQgYmUgdGhlIG9ubHkgbW9kIHRvIHRoZSByb3csIHNvCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgd2hlcmUgY29uZGl0aW9uIGlzIHNldAorICAgICAgICBpZiAoYWN0aW9uID09IFJvdy5BQ1RJT05fVVBEQVRFCisgICAgICAgICAgICAmJiByb3cuZ2V0VGFibGUoKSA9PSByZWxNYXBwaW5nLmdldFRhYmxlKCkpCisgICAgICAgICAgICByb3cud2hlcmVQcmltYXJ5S2V5KHJlbCk7CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBpbnZlcnNlIHBvaW50ZXIgd2l0aCBvdXIgb2lkIHZhbHVlCisgICAgICAgIHJvdy5zZXRGb3JlaWduS2V5KGZrLCBpbywgc20pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc3VwcG9ydHNTZWxlY3QoU2VsZWN0IHNlbCwgaW50IHR5cGUsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAodHlwZSA9PSBTZWxlY3QuVFlQRV9KT0lOTEVTUykKKyAgICAgICAgICAgIHJldHVybiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpICE9IGZpZWxkLkpPSU5fSU5WRVJTRQorICAgICAgICAgICAgICAgICYmIHNlbC5pc1NlbGVjdGVkKGZpZWxkLmdldFRhYmxlKCkpKSA/IDEgOiAwOworICAgICAgICBpZiAodHlwZSA9PSBTZWxlY3QuVFlQRV9UV09fUEFSVCkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIC8vIGFscmVhZHkgY2FjaGVkPworICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IG9pZCA9IHNtLmdldEludGVybWVkaWF0ZShmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIGlmIChzdG9yZS5nZXRDb250ZXh0KCkuZmluZENhY2hlZChvaWQsIG51bGwpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc01hcHBpbmdbXSBjbHNzID0gZmllbGQuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNlbGVjdC5FQUdFUl9QQVJBTExFTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzcy5sZW5ndGg7CisgICAgICAgICAgICBjYXNlIFNlbGVjdC5FQUdFUl9PVVRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNsc3MubGVuZ3RoID09IDEgJiYgc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkuY2FuT3V0ZXJKb2luCisgICAgICAgICAgICAgICAgICAgIChzZWwuZ2V0Sm9pblN5bnRheCgpLCBmaWVsZC5nZXRGb3JlaWduS2V5KGNsc3NbMF0pKSkgPyAxIDoKKyAgICAgICAgICAgICAgICAgICAgMDsKKyAgICAgICAgICAgIGNhc2UgU2VsZWN0LkVBR0VSX0lOTkVSOgorICAgICAgICAgICAgICAgIHJldHVybiAoY2xzcy5sZW5ndGggPT0gMSkgPyAxIDogMDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RFYWdlclBhcmFsbGVsKFNlbGVjdEV4ZWN1dG9yIHNlbCwKKyAgICAgICAgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgZmluYWwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBmaW5hbCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIGZpbmFsIENsYXNzTWFwcGluZ1tdIGNsc3MgPSBmaWVsZC5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpOworICAgICAgICBpZiAoIShzZWwgaW5zdGFuY2VvZiBVbmlvbikpCisgICAgICAgICAgICBzZWxlY3RFYWdlclBhcmFsbGVsKChTZWxlY3QpIHNlbCwgY2xzc1swXSwgc3RvcmUsIGZldGNoLCBlYWdlck1vZGUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFVuaW9uIHVuaW9uID0gKFVuaW9uKSBzZWw7CisgICAgICAgICAgICBpZiAoZmV0Y2guZ2V0U3ViY2xhc3NGZXRjaE1vZGUgKGZpZWxkLmdldFR5cGVNYXBwaW5nKCkpIAorICAgICAgICAgICAgICAgICE9IEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTikKKyAgICAgICAgICAgICAgICB1bmlvbi5hYm9ydFVuaW9uKCk7CisgICAgICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVhZ2VyUGFyYWxsZWwoc2VsLCBjbHNzW2lkeF0sIHN0b3JlLCBmZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyTW9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFuIGVhZ2VyIHBhcmFsbGVsIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VsZWN0RWFnZXJQYXJhbGxlbChTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcgY2xzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpIHsKKyAgICAgICAgc2VsLnNlbGVjdFByaW1hcnlLZXkoZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCkpOworICAgICAgICAvLyBzZXQgYSB2YXJpYWJsZSBuYW1lIHRoYXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbnkgaW4gdGhlIHF1ZXJ5OworICAgICAgICAvLyB1c2luZyBhIHZhcmlhYmxlIGd1YXJhbnRlZXMgdGhhdCB0aGUgc2VsZWN0ZWQgZGF0YSB3aWxsIHVzZSBkaWZmZXJlbnQKKyAgICAgICAgLy8gYWxpYXNlcyBhbmQgam9pbnMgdGhhbiBhbnkgZXhpc3RpbmcgV0hFUkUgY29uZGl0aW9ucyBvbiB0aGlzIGZpZWxkCisgICAgICAgIC8vIHRoYXQgbWlnaHQgb3RoZXJ3aXNlIGxpbWl0IHRoZSByZWxhdGlvbnMgdGhhdCBtYXRjaAorICAgICAgICBKb2lucyBqb2lucyA9IHNlbC5uZXdKb2lucygpLnNldFZhcmlhYmxlKCIqIik7CisgICAgICAgIGVhZ2VySm9pbihqb2lucywgY2xzLCB0cnVlKTsKKyAgICAgICAgc2VsLnNlbGVjdChjbHMsIGZpZWxkLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgc3RvcmUsIGZldGNoLCBlYWdlck1vZGUsIAorICAgICAgICAgICAgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVhZ2VySm9pbihTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpIHsKKyAgICAgICAgLy8gbGltaXQgdGhlIGVhZ2VyIG1vZGUgdG8gc2luZ2xlIG9uIHJlY3Vyc2l2ZSBlYWdlciBmZXRjaGluZyBiL2MKKyAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgc2VsZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGFuZCBhbiBhdHRlbXB0IHRvCisgICAgICAgIC8vIGNsb25lIGl0IGZvciBhIHRvLW1hbnkgZWFnZXIgc2VsZWN0IGNhbiByZXN1bHQgaW4gYSBjbG9uZSB0aGF0CisgICAgICAgIC8vIHByb2R1Y2VzIGludmFsaWQgU1FMCisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBmaWVsZC5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpWzBdOworICAgICAgICBzZWwuc2VsZWN0KGNscywgZmllbGQuZ2V0U2VsZWN0U3ViY2xhc3NlcygpLCBzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX0pPSU4sCisgICAgICAgICAgICBlYWdlckpvaW4oc2VsLm5ld0pvaW5zKCksIGNscywgZmFsc2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGpvaW5zIG5lZWRlZCB0byBzZWxlY3QvbG9hZCBlYWdlciBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgSm9pbnMgZWFnZXJKb2luKEpvaW5zIGpvaW5zLCBDbGFzc01hcHBpbmcgY2xzLCBib29sZWFuIGZvcmNlSW5uZXIpIHsKKyAgICAgICAgYm9vbGVhbiBpbnZlcnNlID0gZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpID09IGZpZWxkLkpPSU5fSU5WRVJTRTsKKyAgICAgICAgaWYgKCFpbnZlcnNlKSB7CisgICAgICAgICAgICBqb2lucyA9IGpvaW4oam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgIGpvaW5zID0gc2V0RW1iZWRkZWRWYXJpYWJsZShqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbmQgam9pbiBpbnRvIHJlbGF0aW9uCisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBmaWVsZC5nZXRGb3JlaWduS2V5KGNscyk7CisgICAgICAgIGlmICghZm9yY2VJbm5lciAmJiBmaWVsZC5nZXROdWxsVmFsdWUoKSAhPSBGaWVsZE1hcHBpbmcuTlVMTF9FWENFUFRJT04pCisgICAgICAgICAgICByZXR1cm4gam9pbnMub3V0ZXJKb2luUmVsYXRpb24oZmllbGQuZ2V0TmFtZSgpLCBmaywgZmllbGQuCisgICAgICAgICAgICAgICAgZ2V0VHlwZU1hcHBpbmcoKSwgZmllbGQuZ2V0U2VsZWN0U3ViY2xhc3NlcygpLCBpbnZlcnNlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBqb2lucy5qb2luUmVsYXRpb24oZmllbGQuZ2V0TmFtZSgpLCBmaywgZmllbGQuZ2V0VHlwZU1hcHBpbmcoKSwgCisgICAgICAgICAgICBmaWVsZC5nZXRTZWxlY3RTdWJjbGFzc2VzKCksIGludmVyc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBqb2luaW5nIGZyb20gYW4gZW1iZWRkZWQgb3duZXIsIHVzZSB2YXJpYWJsZSB0byBjcmVhdGUgYSB1bmlxdWUKKyAgICAgKiBhbGlhcyBpbiBjYXNlIG93bmVyIGNvbnRhaW5zIG90aGVyIHNhbWUtdHlwZWQgZW1iZWRkZWQgcmVsYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgSm9pbnMgc2V0RW1iZWRkZWRWYXJpYWJsZShKb2lucyBqb2lucykgeworICAgICAgICBpZiAoZmllbGQuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLmdldEVtYmVkZGluZ01ldGFEYXRhKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBqb2luczsKKyAgICAgICAgcmV0dXJuIGpvaW5zLnNldFZhcmlhYmxlKGZpZWxkLmdldERlZmluaW5nTWV0YURhdGEoKS4KKyAgICAgICAgICAgIGdldEVtYmVkZGluZ01ldGFEYXRhKCkuZ2V0RmllbGRNZXRhRGF0YSgpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBzZWxlY3QoU2VsZWN0IHNlbCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRKb2luRGlyZWN0aW9uKCkgPT0gZmllbGQuSk9JTl9JTlZFUlNFKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvLyBhbHJlYWR5IGNhY2hlZCBvaWQ/CisgICAgICAgIGlmIChzbSAhPSBudWxsICYmIHNtLmdldEludGVybWVkaWF0ZShmaWVsZC5nZXRJbmRleCgpKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoX2ZrT2lkKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsLnNlbGVjdChmaWVsZC5nZXRDb2x1bW5zKCksIGZpZWxkLmpvaW4oc2VsKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZEVhZ2VyUGFyYWxsZWwoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHJvY2VzcyBiYXRjaGVkIHJlc3VsdHMgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5CisgICAgICAgIE1hcCByZWxzOworICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgUmVzdWx0KQorICAgICAgICAgICAgcmVscyA9IHByb2Nlc3NFYWdlclBhcmFsbGVsUmVzdWx0KHNtLCBzdG9yZSwgZmV0Y2gsIChSZXN1bHQpIHJlcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlbHMgPSAoTWFwKSByZXM7CisKKyAgICAgICAgLy8gc3RvcmUgb2JqZWN0IGZvciB0aGlzIG9pZCBpbiBpbnN0YW5jZQorICAgICAgICBzbS5zdG9yZU9iamVjdChmaWVsZC5nZXRJbmRleCgpLCByZWxzLnJlbW92ZShzbS5nZXRPYmplY3RJZCgpKSk7CisgICAgICAgIHJldHVybiByZWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIGJhdGNoZWQgcmVzdWx0LgorICAgICAqLworICAgIHByaXZhdGUgTWFwIHByb2Nlc3NFYWdlclBhcmFsbGVsUmVzdWx0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIHNhbWUgam9pbnMgYXMgZm9yIGxvYWQKKyAgICAgICAgLy8jIyMgY2hlYXQ6IHdlIGtub3cgdHlwaWNhbCByZXN1bHQgam9pbnMgb25seSBjYXJlIGFib3V0IHRoZSByZWxhdGlvbgorICAgICAgICAvLyMjIyBwYXRoOyB0aHVzIHdlIGNhbiBpZ25vcmUgZGlmZmVyZW50IG1hcHBpbmdzCisgICAgICAgIENsYXNzTWFwcGluZ1tdIGNsc3MgPSBmaWVsZC5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpOworICAgICAgICBKb2lucyBqb2lucyA9IHJlcy5uZXdKb2lucygpLnNldFZhcmlhYmxlKCIqIik7CisgICAgICAgIGVhZ2VySm9pbihqb2lucywgY2xzc1swXSwgdHJ1ZSk7CisKKyAgICAgICAgTWFwIHJlbHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBDbGFzc01hcHBpbmcgb3duZXIgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNsczsKKyAgICAgICAgT2JqZWN0IG9pZDsKKyAgICAgICAgd2hpbGUgKHJlcy5uZXh0KCkpIHsKKyAgICAgICAgICAgIGNscyA9IHJlcy5nZXRCYXNlTWFwcGluZygpOworICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNscyA9IGNsc3NbMF07CisgICAgICAgICAgICBvaWQgPSBvd25lci5nZXRPYmplY3RJZChzdG9yZSwgcmVzLCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIHJlbHMucHV0KG9pZCwgcmVzLmxvYWQoY2xzLCBzdG9yZSwgZmV0Y2gsIGpvaW5zKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIHJlbHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZEVhZ2VySm9pbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gZmllbGQuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKVswXTsKKyAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgcmVzLmxvYWQoY2xzLCBzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICBlYWdlckpvaW4ocmVzLm5ld0pvaW5zKCksIGNscywgZmFsc2UpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpID09IGZpZWxkLkpPSU5fSU5WRVJTRSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gY2FjaGVkIG9pZD8KKyAgICAgICAgaWYgKHNtICE9IG51bGwgJiYgc20uZ2V0SW50ZXJtZWRpYXRlKGZpZWxkLmdldEluZGV4KCkpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhfZmtPaWQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoIXJlcy5jb250YWluc0FsbChmaWVsZC5nZXRDb2x1bW5zKCkpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGdldCB0aGUgcmVsYXRlZCBvYmplY3QncyBvaWQKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbE1hcHBpbmcgPSBmaWVsZC5nZXRUeXBlTWFwcGluZygpOworICAgICAgICBPYmplY3Qgb2lkID0gbnVsbDsKKyAgICAgICAgaWYgKHJlbE1hcHBpbmcuaXNNYXBwZWQoKSkgeworICAgICAgICAgICAgb2lkID0gcmVsTWFwcGluZy5nZXRPYmplY3RJZChzdG9yZSwgcmVzLCBmaWVsZC5nZXRGb3JlaWduS2V5KCksCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0UG9seW1vcnBoaWMoKSAhPSBWYWx1ZU1hcHBpbmcuUE9MWV9GQUxTRSwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gZmllbGQuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgaWYgKHJlbE1hcHBpbmcuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRSkgeworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSByZXMuZ2V0TG9uZyhjb2xzWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcy53YXNOdWxsKCkpCisgICAgICAgICAgICAgICAgICAgIG9pZCA9IHN0b3JlLm5ld0RhdGFTdG9yZUlkKGlkLCByZWxNYXBwaW5nLCB0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGlkCisgICAgICAgICAgICAgICAgaWYgKGNvbHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlcy5nZXRPYmplY3QoY29sc1swXSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9pZCA9IEFwcGxpY2F0aW9uSWRzLmZyb21QS1ZhbHVlcyhuZXcgT2JqZWN0W117IHZhbCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbE1hcHBpbmcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHZhbHMgPSBuZXcgT2JqZWN0W2NvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxzW2ldID0gcmVzLmdldE9iamVjdChjb2xzW2ldLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBjb2xzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkID0gQXBwbGljYXRpb25JZHMuZnJvbVBLVmFsdWVzKHZhbHMsIHJlbE1hcHBpbmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgbnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNtLnNldEludGVybWVkaWF0ZShmaWVsZC5nZXRJbmRleCgpLCBvaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgZmluYWwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIGNhY2hlZCBvaWQgdmFsdWUsIG9yIGxvYWQgb2lkIGlmIG5vIHdheSB0byBqb2luCisgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKF9ma09pZCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBvaWQgPSBzbS5nZXRJbnRlcm1lZGlhdGUoZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBpZiAob2lkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gc3RvcmUuZmluZChvaWQsIGZpZWxkLCBmZXRjaCk7CisgICAgICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSByZWxzID0gZmllbGQuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKyAgICAgICAgZmluYWwgaW50IHN1YnMgPSBmaWVsZC5nZXRTZWxlY3RTdWJjbGFzc2VzKCk7CisgICAgICAgIGZpbmFsIEpvaW5zW10gcmVzSm9pbnMgPSBuZXcgSm9pbnNbcmVscy5sZW5ndGhdOworCisgICAgICAgIC8vIHNlbGVjdCByZWxhdGVkIG1hcHBpbmcgY29sdW1uczsgam9pbmluZyBmcm9tIHRoZSByZWxhdGVkIHR5cGUKKyAgICAgICAgLy8gYmFjayB0byBvdXIgZmsgdGFibGUgaWYgbm90IGFuIGludmVyc2UgbWFwcGluZyAoaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAvLyBjYW4ganVzdCBtYWtlIHN1cmUgdGhlIGludmVyc2UgY29scyA9PSBvdXIgcGsgdmFsdWVzKQorICAgICAgICBVbmlvbiB1bmlvbiA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdVbmlvbihyZWxzLmxlbmd0aCk7CisgICAgICAgIHVuaW9uLnNldEV4cGVjdGVkUmVzdWx0Q291bnQoMSwgZmFsc2UpOworICAgICAgICBpZiAoZmV0Y2guZ2V0U3ViY2xhc3NGZXRjaE1vZGUoZmllbGQuZ2V0VHlwZU1hcHBpbmcoKSkKKyAgICAgICAgICAgICE9IEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTikKKyAgICAgICAgICAgIHVuaW9uLmFib3J0VW5pb24oKTsKKyAgICAgICAgdW5pb24uc2VsZWN0KG5ldyBVbmlvbi5TZWxlY3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldEpvaW5EaXJlY3Rpb24oKSA9PSBmaWVsZC5KT0lOX0lOVkVSU0UpCisgICAgICAgICAgICAgICAgICAgIHNlbC53aGVyZUZvcmVpZ25LZXkoZmllbGQuZ2V0Rm9yZWlnbktleShyZWxzW2lkeF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0T2JqZWN0SWQoKSwgZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCksIHN0b3JlKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzSm9pbnNbaWR4XSA9IHNlbC5uZXdKb2lucygpLmpvaW5SZWxhdGlvbihmaWVsZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGb3JlaWduS2V5KHJlbHNbaWR4XSksIHJlbHNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQud2hlcmVQcmltYXJ5S2V5KHNlbCwgc20sIHN0b3JlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsLnNlbGVjdChyZWxzW2lkeF0sIHN1YnMsIHN0b3JlLCBmZXRjaCwgZmV0Y2guRUFHRVJfSk9JTiwgCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW2lkeF0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBSZXN1bHQgcmVzID0gdW5pb24uZXhlY3V0ZShzdG9yZSwgZmV0Y2gpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAocmVzLm5leHQoKSkKKyAgICAgICAgICAgICAgICB2YWwgPSByZXMubG9hZChyZWxzW3Jlcy5pbmRleE9mKCldLCBzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICAgICAgICAgIHJlc0pvaW5zW3Jlcy5pbmRleE9mKCldKTsKKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0KGZpZWxkLmdldEluZGV4KCksIHZhbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIFJlbGF0aW9uU3RyYXRlZ2llcy50b0RhdGFTdG9yZVZhbHVlKGZpZWxkLCB2YWwsIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgLy8gaWYgbm8gaW52ZXJzZSwganVzdCBqb2luIHRvIG1hcHBpbmcncyB0YWJsZSAodXN1YWxseSBhIG5vLW9wCisgICAgICAgIC8vIGJlY2F1c2UgaXQnbGwgYmUgaW4gdGhlIHByaW1hcnkgdGFibGUpIGFuZCBzZWUgaWYgZmsgY29scyBhcmUgbnVsbDsKKyAgICAgICAgLy8gaWYgaW52ZXJzZSwgdGhlbiB3ZSBoYXZlIHRvIGRvIGEgc3ViLXNlbGVjdCB0byBzZWUgaWYgYW55IGludmVyc2UKKyAgICAgICAgLy8gb2JqZWN0cyBwb2ludCBiYWNrIHRvIHRoaXMgZmllbGQncyBvd25lcgorICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpICE9IGZpZWxkLkpPSU5fSU5WRVJTRSkgeworICAgICAgICAgICAgLy8jIyMgcHJvYmFibHkgbmVlZCBzb21lIHNvcnQgb2Ygc3Vic2VsZWN0IGhlcmUgb24gZmsgY29uc3RhbnRzCisgICAgICAgICAgICBqb2lucyA9IGpvaW4oam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBmaWVsZC5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIxIDw+IDEiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhjb2xzWzBdLCBqb2lucykpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIiBJUyAiKS5hcHBlbmRWYWx1ZShudWxsLCBjb2xzWzBdKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0ZXN0SW52ZXJzZU51bGwoc3FsLCBzZWwsIGpvaW5zLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc05vdE51bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgLy8gaWYgbm8gaW52ZXJzZSwganVzdCBqb2luIHRvIG1hcHBpbmcncyB0YWJsZSAodXN1YWxseSBhIG5vLW9wCisgICAgICAgIC8vIGJlY2F1c2UgaXQnbGwgYmUgaW4gdGhlIHByaW1hcnkgdGFibGUpIGFuZCBzZWUgaWYgZmsgY29scyBhcmVuJ3QKKyAgICAgICAgLy8gbnVsbDsgaWYgaW52ZXJzZSwgdGhlbiB3ZSBoYXZlIHRvIGRvIGEgc3ViLXNlbGVjdCB0byBzZWUgaWYgYW55CisgICAgICAgIC8vIGludmVyc2Ugb2JqZWN0cyBwb2ludCBiYWNrIHRvIHRoaXMgZmllbGQncyBvd25lcgorICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpICE9IGZpZWxkLkpPSU5fSU5WRVJTRSkgeworICAgICAgICAgICAgLy8jIyMgcHJvYmFibHkgbmVlZCBzb21lIHNvcnQgb2Ygc3Vic2VsZWN0IGhlcmUgb24gZmsgY29uc3RhbnRzCisgICAgICAgICAgICBqb2lucyA9IGpvaW4oam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBmaWVsZC5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIxID0gMSIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGNvbHNbMF0sIGpvaW5zKSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiIElTIE5PVCAiKS5hcHBlbmRWYWx1ZShudWxsLCBjb2xzWzBdKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0ZXN0SW52ZXJzZU51bGwoc3FsLCBzZWwsIGpvaW5zLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIFNRTCBmb3IgYSBzdWItc2VsZWN0IHRlc3Rpbmcgd2hldGhlciBhbiBpbnZlcnNlIG9iamVjdCBleGlzdHMKKyAgICAgKiBmb3IgdGhpcyByZWxhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdEludmVyc2VOdWxsKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zLAorICAgICAgICBib29sZWFuIGVtcHR5KSB7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gZmllbGQuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXREQkRpY3Rpb25hcnkoKTsKKyAgICAgICAgZGljdC5hc3NlcnRTdXBwb3J0KGRpY3Quc3VwcG9ydHNTdWJzZWxlY3QsICJTdXBwb3J0c1N1YnNlbGVjdCIpOworCisgICAgICAgIGlmIChmaWVsZC5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgdGhyb3cgUmVsYXRpb25TdHJhdGVnaWVzLnVuaW52ZXJzYWJsZShmaWVsZCk7CisKKyAgICAgICAgaWYgKGVtcHR5KQorICAgICAgICAgICAgc3FsLmFwcGVuZCgiMCA9ICIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kKCIwIDwgIik7CisKKyAgICAgICAgRm9yZWlnbktleSBmayA9IGZpZWxkLmdldEZvcmVpZ25LZXkoKTsKKyAgICAgICAgQ29udGFpbmVyRmllbGRTdHJhdGVneS5hcHBlbmRKb2luQ291bnQoc3FsLCBzZWwsIGpvaW5zLCBkaWN0LCBmaWVsZCwKKyAgICAgICAgICAgIGZrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyKSB7CisgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBpbiBhbiBpbnZlcnNlIG9iamVjdCB0YWJsZSBqb2luIG5vcm1hbGx5LCBvdGhlcndpc2UKKyAgICAgICAgLy8gYWxyZWFkeSB0cmF2ZXJzZWQgdGhlIHJlbGF0aW9uOyBqdXN0IGpvaW4gYmFjayB0byBvd25lciB0YWJsZQorICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpICE9IGZpZWxkLkpPSU5fSU5WRVJTRSkKKyAgICAgICAgICAgIHJldHVybiBmaWVsZC5qb2luKGpvaW5zLCBmb3JjZU91dGVyLCBmYWxzZSk7CisgICAgICAgIENsYXNzTWFwcGluZ1tdIGNsc3MgPSBmaWVsZC5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpOworICAgICAgICBpZiAoY2xzcy5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIHRocm93IFJlbGF0aW9uU3RyYXRlZ2llcy51bmludmVyc2FibGUoZmllbGQpOworICAgICAgICBpZiAoZm9yY2VPdXRlcikKKyAgICAgICAgICAgIHJldHVybiBqb2lucy5vdXRlckpvaW5SZWxhdGlvbihmaWVsZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0Rm9yZWlnbktleSgpLCBjbHNzWzBdLCBmaWVsZC5nZXRTZWxlY3RTdWJjbGFzc2VzKCksIAorICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGpvaW5zLmpvaW5SZWxhdGlvbihmaWVsZC5nZXROYW1lKCksIGZpZWxkLmdldEZvcmVpZ25LZXkoKSwKKyAgICAgICAgICAgIGNsc3NbMF0sIGZpZWxkLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luUmVsYXRpb24oSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlciwKKyAgICAgICAgYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGludmVyc2UgbWFwcGluZyBpdCdzIGFscmVhZHkgam9pbmVkIHRvIHRoZSByZWxhdGlvbgorICAgICAgICBpZiAoZmllbGQuZ2V0Sm9pbkRpcmVjdGlvbigpID09IGZpZWxkLkpPSU5fSU5WRVJTRSkKKyAgICAgICAgICAgIHJldHVybiBqb2luczsKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gY2xzcyA9IGZpZWxkLmdldEluZGVwZW5kZW50VHlwZU1hcHBpbmdzKCk7CisgICAgICAgIGlmIChjbHNzLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICBpZiAodHJhdmVyc2UpCisgICAgICAgICAgICAgICAgdGhyb3cgUmVsYXRpb25TdHJhdGVnaWVzLnVuam9pbmFibGUoZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIGpvaW5zOworICAgICAgICB9CisKKyAgICAgICAgam9pbnMgPSBzZXRFbWJlZGRlZFZhcmlhYmxlKGpvaW5zKTsKKyAgICAgICAgaWYgKGZvcmNlT3V0ZXIpCisgICAgICAgICAgICByZXR1cm4gam9pbnMub3V0ZXJKb2luUmVsYXRpb24oZmllbGQuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICBmaWVsZC5nZXRGb3JlaWduS2V5KGNsc3NbMF0pLCBjbHNzWzBdLCAKKyAgICAgICAgICAgICAgICBmaWVsZC5nZXRTZWxlY3RTdWJjbGFzc2VzKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBqb2lucy5qb2luUmVsYXRpb24oZmllbGQuZ2V0TmFtZSgpLCBmaWVsZC5nZXRGb3JlaWduS2V5KGNsc3NbMF0pLAorICAgICAgICAgICAgY2xzc1swXSwgZmllbGQuZ2V0U2VsZWN0U3ViY2xhc3NlcygpLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpvaW5hYmxlIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgaW50IGdldEZpZWxkSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRJbmRleCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJpbWFyeUtleVZhbHVlKFJlc3VsdCByZXMsIENvbHVtbltdIGNvbHMsIEZvcmVpZ25LZXkgZmssCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDbGFzc01hcHBpbmcgcmVsbWFwcGluZyA9IGZpZWxkLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIGlmIChyZWxtYXBwaW5nLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9EQVRBU1RPUkUpIHsKKyAgICAgICAgICAgIENvbHVtbiBjb2wgPSBjb2xzWzBdOworICAgICAgICAgICAgaWYgKGZrICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29sID0gZmsuZ2V0Q29sdW1uKGNvbCk7ICAgCisgICAgICAgICAgICBsb25nIGlkID0gcmVzLmdldExvbmcoY29sLCBqb2lucyk7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0T2JqZWN0SWRGaWVsZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkxPTkcpCisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihpZCk7CisgICAgICAgICAgICByZXR1cm4gc3RvcmUubmV3RGF0YVN0b3JlSWQoaWQsIHJlbG1hcHBpbmcsIGZpZWxkLmdldFBvbHltb3JwaGljKCkgCisgICAgICAgICAgICAgICAgIT0gVmFsdWVNYXBwaW5nLlBPTFlfRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbG1hcHBpbmcuaXNPcGVuSlBBSWRlbnRpdHkoKSkKKyAgICAgICAgICAgIHJldHVybiAoKEpvaW5hYmxlKSByZWxtYXBwaW5nLmdldFByaW1hcnlLZXlGaWVsZE1hcHBpbmdzKClbMF0uCisgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3koKSkuZ2V0UHJpbWFyeUtleVZhbHVlKHJlcywgY29scywgZmssIHN0b3JlLCBqb2lucyk7CisKKyAgICAgICAgaWYgKGNvbHMgPT0gZ2V0Q29sdW1ucygpICYmIGZrID09IG51bGwpCisgICAgICAgICAgICBmayA9IGZpZWxkLmdldEZvcmVpZ25LZXkoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmsgPSBjcmVhdGVUcmFuc2xhdGluZ0ZvcmVpZ25LZXkocmVsbWFwcGluZywgY29scywgZmspOyAKKyAgICAgICAgcmV0dXJuIHJlbG1hcHBpbmcuZ2V0T2JqZWN0SWQoc3RvcmUsIHJlcywgZmssCisgICAgICAgICAgICBmaWVsZC5nZXRQb2x5bW9ycGhpYygpICE9IFZhbHVlTWFwcGluZy5QT0xZX0ZBTFNFLCBqb2lucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmF1eCBmb3JlaWduIGtleSB0aGF0IHRyYW5zbGF0ZXMgYmV0d2VlbiB0aGUgY29sdW1ucyB0byBwdWxsCisgICAgICogdGhlIGRhdGEgZnJvbSBhbmQgb3VyIHJlbGF0ZWQgdHlwZSdzIHByaW1hcnkga2V5IGNvbHVtbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBGb3JlaWduS2V5IGNyZWF0ZVRyYW5zbGF0aW5nRm9yZWlnbktleShDbGFzc01hcHBpbmcgcmVsbWFwcGluZywKKyAgICAgICAgQ29sdW1uW10gZ2NvbHMsIEZvcmVpZ25LZXkgZ2ZrKSB7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBmaWVsZC5nZXRGb3JlaWduS2V5KCk7IAorICAgICAgICBDb2x1bW5bXSBjb2xzID0gZmsuZ2V0Q29sdW1ucygpOworCisgICAgICAgIEZvcmVpZ25LZXkgdGZrID0gbnVsbDsKKyAgICAgICAgQ29sdW1uIHRjb2w7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRjb2wgPSBnY29sc1tpXTsKKyAgICAgICAgICAgIGlmIChnZmsgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0Y29sID0gZ2ZrLmdldENvbHVtbih0Y29sKTsKKyAgICAgICAgICAgIGlmICh0ZmsgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0ZmsgPSBuZXcgRm9yZWlnbktleShudWxsLCB0Y29sLmdldFRhYmxlKCkpOworICAgICAgICAgICAgdGZrLmpvaW4odGNvbCwgZmsuZ2V0UHJpbWFyeUtleUNvbHVtbihjb2xzW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRmazsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEpvaW5WYWx1ZShPYmplY3QgZmllbGRWYWwsIENvbHVtbiBjb2wsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBPYmplY3QgbyA9IGZpZWxkLmdldEZvcmVpZ25LZXkoKS5nZXRDb25zdGFudChjb2wpOworICAgICAgICBpZiAobyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIGNvbCA9IGZpZWxkLmdldEZvcmVpZ25LZXkoKS5nZXRQcmltYXJ5S2V5Q29sdW1uKGNvbCk7CisgICAgICAgIGlmIChjb2wgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgIENsYXNzTWFwcGluZyByZWxtYXBwaW5nID0gZmllbGQuZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgSm9pbmFibGUgaiA9IGZpZWxkLmdldFR5cGVNYXBwaW5nKCkuYXNzZXJ0Sm9pbmFibGUoY29sKTsKKyAgICAgICAgaWYgKEltcGxIZWxwZXIuaXNNYW5hZ2VhYmxlKGZpZWxkVmFsKSkKKyAgICAgICAgICAgIGZpZWxkVmFsID0gc3RvcmUuZ2V0Q29udGV4dCgpLmdldE9iamVjdElkKGZpZWxkVmFsKTsKKyAgICAgICAgaWYgKGZpZWxkVmFsIGluc3RhbmNlb2YgT3BlbkpQQUlkKQorICAgICAgICAgICAgZmllbGRWYWwgPSAoKE9wZW5KUEFJZCkgZmllbGRWYWwpLmdldElkT2JqZWN0KCk7CisgICAgICAgIGVsc2UgaWYgKHJlbG1hcHBpbmcuZ2V0T2JqZWN0SWRUeXBlKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgcmVsbWFwcGluZy5nZXRPYmplY3RJZFR5cGUoKS5pc0luc3RhbmNlKGZpZWxkVmFsKSkgeworICAgICAgICAgICAgT2JqZWN0W10gcGtzID0gQXBwbGljYXRpb25JZHMudG9QS1ZhbHVlcyhmaWVsZFZhbCwgcmVsbWFwcGluZyk7CisgICAgICAgICAgICBmaWVsZFZhbCA9IHBrc1tyZWxtYXBwaW5nLmdldEZpZWxkKGouZ2V0RmllbGRJbmRleCgpKS4KKyAgICAgICAgICAgICAgICBnZXRQcmltYXJ5S2V5SW5kZXgoKV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGouZ2V0Sm9pblZhbHVlKGZpZWxkVmFsLCBjb2wsIHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEpvaW5WYWx1ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBDb2x1bW4gY29sLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGdldEpvaW5WYWx1ZShzbS5mZXRjaChmaWVsZC5nZXRJbmRleCgpKSwgY29sLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0Fzc2lnbmVkVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBDb2x1bW4gY29sLCBPYmplY3QgYXV0b0luYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEVtYmVkZGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbklPIGdldENvbHVtbklPKCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0Q29sdW1uSU8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UmVzdWx0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRW1iZWRkZWREYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIHRvRGF0YVN0b3JlVmFsdWUodmFsLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0VtYmVkZGVkT2JqZWN0VmFsdWUoT2JqZWN0IHZhbCkgeworICAgICAgICByZXR1cm4gVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZEVtYmVkZGVkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTWFwcGluZyByZWxNYXBwaW5nID0gZmllbGQuZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgT2JqZWN0IG9pZDsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgb2lkID0gbnVsbDsKKyAgICAgICAgZWxzZSBpZiAocmVsTWFwcGluZy5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01hcHBpbmcuSURfREFUQVNUT1JFKQorICAgICAgICAgICAgb2lkID0gc3RvcmUubmV3RGF0YVN0b3JlSWQoKChOdW1iZXIpIHZhbCkubG9uZ1ZhbHVlKCksIHJlbE1hcHBpbmcsCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0UG9seW1vcnBoaWMoKSAhPSBWYWx1ZU1hcHBpbmcuUE9MWV9GQUxTRSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgT2JqZWN0W10gcGtzID0gKGdldENvbHVtbnMoKS5sZW5ndGggPT0gMSkgPyBuZXcgT2JqZWN0W117IHZhbCB9CisgICAgICAgICAgICAgICAgOiAoT2JqZWN0W10pIHZhbDsKKyAgICAgICAgICAgIGJvb2xlYW4gbnVsbHMgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IG51bGxzICYmIGkgPCBwa3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbnVsbHMgPSBwa3NbaV0gPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChudWxscykKKyAgICAgICAgICAgICAgICBvaWQgPSBudWxsOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb2lkID0gQXBwbGljYXRpb25JZHMuZnJvbVBLVmFsdWVzKHBrcywgcmVsTWFwcGluZyk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldFBvbHltb3JwaGljKCkgPT0gVmFsdWVNYXBwaW5nLlBPTFlfRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgJiYgb2lkIGluc3RhbmNlb2YgT3BlbkpQQUlkKSB7CisgICAgICAgICAgICAgICAgICAgICgoT3BlbkpQQUlkKSBvaWQpLnNldE1hbmFnZWRJbnN0YW5jZVR5cGUocmVsTWFwcGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlc2NyaWJlZFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgbnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNtLnNldEludGVybWVkaWF0ZShmaWVsZC5nZXRJbmRleCgpLCBvaWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25NYXBJbnZlcnNlS2V5RmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvbk1hcEludmVyc2VLZXlGaWVsZFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNWNhZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25NYXBJbnZlcnNlS2V5RmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5OworCisvKioKKyAqIFVzZXMgYW4gaW52ZXJzZSBmb3JlaWduIGtleSBpbiB0aGUgdGFibGUgb2YgdGhlIG1hcCB2YWx1ZSB0byBkZXRlcm1pbmUKKyAqIG1hcCB2YWx1ZXMuIERlcml2ZXMgbWFwIGtleXMgZnJvbSBhIGZpZWxkIGluIGVhY2ggdmFsdWUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFJlbGF0aW9uTWFwSW52ZXJzZUtleUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIFJlbGF0aW9uVG9NYW55SW52ZXJzZUtleUZpZWxkU3RyYXRlZ3kKKyAgICBpbXBsZW1lbnRzIExSU01hcEZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmVsYXRpb25NYXBJbnZlcnNlS2V5RmllbGRTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwdWJsaWMgRmllbGRNYXBwaW5nIGdldEZpZWxkTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmdbXSBnZXRJbmRlcGVuZGVudEtleU1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuIENsYXNzTWFwcGluZy5FTVBUWV9NQVBQSU5HUzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nW10gZ2V0SW5kZXBlbmRlbnRWYWx1ZU1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuIGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKHRyYXZlcnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0S2V5Q29sdW1ucyhDbGFzc01hcHBpbmcgY2xzKSB7CisgICAgICAgIHJldHVybiBjbHMuZ2V0RmllbGRNYXBwaW5nKGZpZWxkLmdldEtleSgpLgorICAgICAgICAgICAgZ2V0VmFsdWVNYXBwZWRCeU1ldGFEYXRhKCkuZ2V0SW5kZXgoKSkuZ2V0Q29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRWYWx1ZUNvbHVtbnMoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICByZXR1cm4gY2xzLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pbkZvcmVpZ25LZXkoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Sm9pbkZvcmVpZ25LZXkoY2xzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RLZXkoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGtleSwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBKb2lucyBqb2lucykgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRLZXkoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZGVyaXZlS2V5KEpEQkNTdG9yZSBzdG9yZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSBSZWxhdGlvblN0cmF0ZWdpZXMuZ2V0U3RhdGVNYW5hZ2VyKHZhbHVlLAorICAgICAgICAgICAgc3RvcmUuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgcmV0dXJuIChzbSA9PSBudWxsKSA/IG51bGwgOiBzbS5mZXRjaEZpZWxkKGZpZWxkLmdldEtleSgpLgorICAgICAgICAgICAgZ2V0VmFsdWVNYXBwZWRCeU1ldGFEYXRhKCkuZ2V0SW5kZXgoKSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZGVyaXZlVmFsdWUoSkRCQ1N0b3JlIHN0b3JlLCBPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdFZhbHVlKFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyB2YWwsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgCisgICAgICAgIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHNlbGVjdEVsZW1lbnQoc2VsLCB2YWwsIHN0b3JlLCBmZXRjaCwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9OT05FLAorICAgICAgICAgICAgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZFZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZEVsZW1lbnQoc20sIHN0b3JlLCBmZXRjaCwgcmVzLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFtdIGdldFJlc3VsdHMoZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgZmluYWwgSkRCQ1N0b3JlIHN0b3JlLCBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBmaW5hbCBpbnQgZWFnZXJNb2RlLCBmaW5hbCBKb2luc1tdIGpvaW5zLCBib29sZWFuIGxycykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFZhbHVlTWFwcGluZyB2YWwgPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSB2YWxzID0gdmFsLmdldEluZGVwZW5kZW50VHlwZU1hcHBpbmdzKCk7CisgICAgICAgIFVuaW9uIHVuaW9uID0gc3RvcmUuZ2V0U1FMRmFjdG9yeSgpLm5ld1VuaW9uKHZhbHMubGVuZ3RoKTsKKyAgICAgICAgaWYgKGZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKHZhbC5nZXRUeXBlTWFwcGluZygpKQorICAgICAgICAgICAgIT0gSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9KT0lOKQorICAgICAgICAgICAgdW5pb24uYWJvcnRVbmlvbigpOworICAgICAgICB1bmlvbi5zZXRMUlMobHJzKTsKKyAgICAgICAgdW5pb24uc2VsZWN0KG5ldyBVbmlvbi5TZWxlY3RvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgam9pbnNbMV0gPSBzZWxlY3RBbGwoc2VsLCB2YWxzW2lkeF0sIHNtLCBzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICAgICAgICAgIGVhZ2VyTW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBSZXN1bHQgcmVzID0gdW5pb24uZXhlY3V0ZShzdG9yZSwgZmV0Y2gpOworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdFtdeyByZXMsIHJlcyB9OworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luS2V5UmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5zOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luVmFsdWVSZWxhdGlvbihKb2lucyBqb2lucywgQ2xhc3NNYXBwaW5nIHZhbCkgeworICAgICAgICByZXR1cm4gam9pbkVsZW1lbnRSZWxhdGlvbihqb2lucywgdmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJveHkgbmV3TFJTUHJveHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgTFJTUHJveHlNYXAodGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkKEpEQkNTdG9yZSBzdG9yZSwgT2JqZWN0IGNvbGwsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiAhPSBudWxsKQorICAgICAgICAgICAgKChNYXApIGNvbGwpLnB1dChkZXJpdmVLZXkoc3RvcmUsIG9iaiksIG9iaik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gdG9Db2xsZWN0aW9uKE9iamVjdCB2YWwpIHsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBudWxsIDogKChNYXApIHZhbCkudmFsdWVzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFwKGJvb2xlYW4gYWRhcHQpIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLk1BUCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LW1hcCIsIGZpZWxkKSk7CisgICAgICAgIGlmIChmaWVsZC5nZXRLZXkoKS5nZXRWYWx1ZU1hcHBlZEJ5KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LW1hcHBlZC1ieS1rZXkiLCBmaWVsZCkpOworICAgICAgICBzdXBlci5tYXAoYWRhcHQpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luS2V5KEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5SZWxhdGlvbihqb2luKGpvaW5zLCBmb3JjZU91dGVyKSwgZm9yY2VPdXRlciwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25NYXBUYWJsZUZpZWxkU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25NYXBUYWJsZUZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzUwYTQwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvbk1hcFRhYmxlRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5OworCisvKioKKyAqIFVzZXMgYW4gYXNzb2NpYXRpb24gdGFibGUgdG8gaG9sZCBtYXAgdmFsdWVzLiBEZXJpdmVzIG1hcCBrZXlzIGZyb20KKyAqIGEgZmllbGQgaW4gZWFjaCB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgUmVsYXRpb25NYXBUYWJsZUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIFJlbGF0aW9uVG9NYW55VGFibGVGaWVsZFN0cmF0ZWd5CisgICAgaW1wbGVtZW50cyBMUlNNYXBGaWVsZFN0cmF0ZWd5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFJlbGF0aW9uTWFwVGFibGVGaWVsZFN0cmF0ZWd5LmNsYXNzKTsKKworICAgIHB1YmxpYyBGaWVsZE1hcHBpbmcgZ2V0RmllbGRNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50S2V5TWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICByZXR1cm4gQ2xhc3NNYXBwaW5nLkVNUFRZX01BUFBJTkdTOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01hcHBpbmdbXSBnZXRJbmRlcGVuZGVudFZhbHVlTWFwcGluZ3MoYm9vbGVhbiB0cmF2ZXJzZSkgeworICAgICAgICByZXR1cm4gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3ModHJhdmVyc2UpOworICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEpvaW5Gb3JlaWduS2V5KGNscyk7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIGdldEtleUNvbHVtbnMoQ2xhc3NNYXBwaW5nIGNscykgeworICAgICAgICByZXR1cm4gY2xzLmdldEZpZWxkTWFwcGluZyhmaWVsZC5nZXRLZXkoKS4KKyAgICAgICAgICAgIGdldFZhbHVlTWFwcGVkQnlNZXRhRGF0YSgpLmdldEluZGV4KCkpLmdldENvbHVtbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0VmFsdWVDb2x1bW5zKENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0Q29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEtleShTZWxlY3Qgc2VsLCBDbGFzc01hcHBpbmcga2V5LCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZEtleShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBkZXJpdmVLZXkoSkRCQ1N0b3JlIHN0b3JlLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IFJlbGF0aW9uU3RyYXRlZ2llcy5nZXRTdGF0ZU1hbmFnZXIodmFsdWUsCisgICAgICAgICAgICBzdG9yZS5nZXRDb250ZXh0KCkpOworICAgICAgICByZXR1cm4gKHNtID09IG51bGwpID8gbnVsbCA6IHNtLmZldGNoRmllbGQoZmllbGQuZ2V0S2V5KCkuCisgICAgICAgICAgICBnZXRWYWx1ZU1hcHBlZEJ5TWV0YURhdGEoKS5nZXRJbmRleCgpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBkZXJpdmVWYWx1ZShKREJDU3RvcmUgc3RvcmUsIE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0VmFsdWUoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIHZhbCwKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCAKKyAgICAgICAgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc2VsZWN0RWxlbWVudChzZWwsIHZhbCwgc3RvcmUsIGZldGNoLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX05PTkUsCisgICAgICAgICAgICBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkVmFsdWUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb2FkRWxlbWVudChzbSwgc3RvcmUsIGZldGNoLCByZXMsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0W10gZ2V0UmVzdWx0cyhmaW5hbCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBmaW5hbCBKREJDU3RvcmUgc3RvcmUsIGZpbmFsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGZpbmFsIGludCBlYWdlck1vZGUsIGZpbmFsIEpvaW5zW10gam9pbnMsIGJvb2xlYW4gbHJzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIHZhbCA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIGZpbmFsIENsYXNzTWFwcGluZ1tdIHZhbHMgPSB2YWwuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKyAgICAgICAgVW5pb24gdW5pb24gPSBzdG9yZS5nZXRTUUxGYWN0b3J5KCkubmV3VW5pb24odmFscy5sZW5ndGgpOworICAgICAgICBpZiAoZmV0Y2guZ2V0U3ViY2xhc3NGZXRjaE1vZGUodmFsLmdldFR5cGVNYXBwaW5nKCkpCisgICAgICAgICAgICAhPSBKREJDRmV0Y2hDb25maWd1cmF0aW9uLkVBR0VSX0pPSU4pCisgICAgICAgICAgICB1bmlvbi5hYm9ydFVuaW9uKCk7CisgICAgICAgIHVuaW9uLnNldExSUyhscnMpOworICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpZHgpIHsKKyAgICAgICAgICAgICAgICBqb2luc1sxXSA9IHNlbGVjdEFsbChzZWwsIHZhbHNbaWR4XSwgc20sIHN0b3JlLCBmZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgZWFnZXJNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIFJlc3VsdCByZXMgPSB1bmlvbi5leGVjdXRlKHN0b3JlLCBmZXRjaCk7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0W117IHJlcywgcmVzIH07CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5LZXlSZWxhdGlvbihKb2lucyBqb2lucywgQ2xhc3NNYXBwaW5nIGtleSkgeworICAgICAgICByZXR1cm4gam9pbnM7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5WYWx1ZVJlbGF0aW9uKEpvaW5zIGpvaW5zLCBDbGFzc01hcHBpbmcgdmFsKSB7CisgICAgICAgIHJldHVybiBqb2luRWxlbWVudFJlbGF0aW9uKGpvaW5zLCB2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcm94eSBuZXdMUlNQcm94eSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMUlNQcm94eU1hcCh0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGQoSkRCQ1N0b3JlIHN0b3JlLCBPYmplY3QgY29sbCwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqICE9IG51bGwpCisgICAgICAgICAgICAoKE1hcCkgY29sbCkucHV0KGRlcml2ZUtleShzdG9yZSwgb2JqKSwgb2JqKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiB0b0NvbGxlY3Rpb24oT2JqZWN0IHZhbCkgeworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IG51bGwgOiAoKE1hcCkgdmFsKS52YWx1ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuTUFQKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtbWFwIiwgZmllbGQpKTsKKyAgICAgICAgaWYgKGZpZWxkLmdldEtleSgpLmdldFZhbHVlTWFwcGVkQnkoKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtbWFwcGVkLWJ5LWtleSIsIGZpZWxkKSk7CisgICAgICAgIHN1cGVyLm1hcChhZGFwdCk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5LZXkoSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlcikgeworICAgICAgICByZXR1cm4gam9pblJlbGF0aW9uKGpvaW4oam9pbnMsIGZvcmNlT3V0ZXIpLCBmb3JjZU91dGVyLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvblN0cmF0ZWdpZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25TdHJhdGVnaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkYjRjYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvUmVsYXRpb25TdHJhdGVnaWVzLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZFN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGV0YWNoZWRWYWx1ZVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyBmb3IgcmVsYXRpb24gbWFwcGluZ3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFJlbGF0aW9uU3RyYXRlZ2llcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChSZWxhdGlvblN0cmF0ZWdpZXMuY2xhc3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgd2UgY2Fubm90IGpvaW4gdG8gdGhlIGdpdmVuIHJlbGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeGNlcHRpb24gdW5qb2luYWJsZShWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1qb2luIiwgdm0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgcmVsYXRpb24gY2Fubm90IGJlIGxvYWRlZAorICAgICAqIGJlY2F1c2UgaXQgaGFzIGluZGVwZW5kZW50IHN1YmNsYXNzZXMgYW5kIGRvZXMgbm90IHJlcHJlc2VudCBhIGZ1bGwgb2lkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeGNlcHRpb24gdW5sb2FkYWJsZShWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1sb2FkIiwgdm0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgcmVsYXRpb24gaXMgaW52YWxpZAorICAgICAqIGJlY2F1c2UgaXQgaGFzIGlzIGJhc2VkIG9uIGFuIGludmVyc2UgZm9yZWlnbiBrZXkgYW5kIGhhcyBpbmRlcGVuZGVudAorICAgICAqIHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4Y2VwdGlvbiB1bmludmVyc2FibGUoVmFsdWVNYXBwaW5nIHZtKSB7CisgICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtaW52ZXJzZSIsIHZtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiBvYmplY3QgYXMgaXRzIGZvcmVpZ24ga2V5IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBzZWUgRmllbGRTdHJhdGVneSN0b0RhdGFTdG9yZVZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBDbGFzc01hcHBpbmcgcmVsOworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzTWFwcGluZ1tdIGNsc3MgPSB2bS5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpOworICAgICAgICAgICAgcmVsID0gKGNsc3MubGVuZ3RoID4gMCkgPyBjbHNzWzBdIDogdm0uZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwuZ2V0Q2xhc3MoKSA9PSB2bS5nZXRUeXBlKCkpCisgICAgICAgICAgICByZWwgPSB2bS5nZXRUeXBlTWFwcGluZygpOyAvLyBjb21tb24gY2FzZQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZWwgPSB2bS5nZXRNYXBwaW5nUmVwb3NpdG9yeSgpLmdldE1hcHBpbmcodmFsLmdldENsYXNzKCksCisgICAgICAgICAgICAgICAgc3RvcmUuZ2V0Q29udGV4dCgpLmdldENsYXNzTG9hZGVyKCksIHRydWUpOworCisgICAgICAgIGlmICghcmVsLmlzTWFwcGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgidW5tYXBwZWQtZGF0YXN0b3JlLXZhbHVlIiwgCisgICAgICAgICAgICAgICAgcmVsLmdldERlc2NyaWJlZFR5cGUoKSkpOworCisgICAgICAgIENvbHVtbltdIGNvbHM7CisgICAgICAgIGlmICh2bS5nZXRKb2luRGlyZWN0aW9uKCkgPT0gVmFsdWVNYXBwaW5nLkpPSU5fSU5WRVJTRSkKKyAgICAgICAgICAgIGNvbHMgPSByZWwuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29scyA9IHZtLmdldEZvcmVpZ25LZXkocmVsKS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICByZXR1cm4gcmVsLnRvRGF0YVN0b3JlVmFsdWUodmFsLCBjb2xzLCBzdG9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIGEgbG9naWNhbCBmb3JlaWduIGtleSB0byBhbiB1bm1hcHBlZCBiYXNlIGNsYXNzIHJlbGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXBSZWxhdGlvblRvVW5tYXBwZWRQQyhWYWx1ZU1hcHBpbmcgdm0sCisgICAgICAgIFN0cmluZyBuYW1lLCBib29sZWFuIGFkYXB0KSB7CisgICAgICAgIGlmICh2bS5nZXRUeXBlTWFwcGluZygpLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9VTktOT1dOKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJyZWwtdG8tdW5rbm93bmlkIiwgdm0pKTsKKworICAgICAgICBWYWx1ZU1hcHBpbmdJbmZvIHZpbmZvID0gdm0uZ2V0VmFsdWVJbmZvKCk7CisgICAgICAgIENvbHVtbltdIHRtcGxhdGVzID0gbmV3VW5tYXBwZWRQQ1RlbXBsYXRlQ29sdW1ucyh2bSwgbmFtZSk7CisgICAgICAgIHZtLnNldENvbHVtbnModmluZm8uZ2V0Q29sdW1ucyh2bSwgbmFtZSwgdG1wbGF0ZXMsCisgICAgICAgICAgICB2bS5nZXRGaWVsZE1hcHBpbmcoKS5nZXRUYWJsZSgpLCBhZGFwdCkpOworICAgICAgICB2bS5zZXRDb2x1bW5JTyh2aW5mby5nZXRDb2x1bW5JTygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGVtcGxhdGUgY29sdW1ucyBmb3IgYSBsb2dpY2FsIGZvcmVpZ24ga2V5IHRvIGFuIHVubWFwcGVkIGJhc2UKKyAgICAgKiBjbGFzcyByZWxhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb2x1bW5bXSBuZXdVbm1hcHBlZFBDVGVtcGxhdGVDb2x1bW5zKFZhbHVlTWFwcGluZyB2bSwKKyAgICAgICAgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbCA9IHZtLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIGlmIChyZWwuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRSkgeworICAgICAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgICAgIGNvbC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5MT05HKTsKKyAgICAgICAgICAgIGNvbC5zZXRSZWxhdGlvbklkKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5bXXsgY29sIH07CisgICAgICAgIH0KKworICAgICAgICBGaWVsZE1hcHBpbmdbXSBwa3MgPSByZWwuZ2V0UHJpbWFyeUtleUZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IG5ldyBDb2x1bW5bcGtzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2xzW2ldID0gbWFwUHJpbWFyeUtleSh2bSwgcGtzW2ldKTsKKyAgICAgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbHNbaV0uZ2V0TmFtZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXROYW1lKG5hbWUgKyAiXyIgKyBwa3NbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldE5hbWUobmFtZSArICJfIiArIGNvbHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNvbHNbaV0uc2V0VGFyZ2V0RmllbGQocGtzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICBjb2xzW2ldLnNldFJlbGF0aW9uSWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZGVmYXVsdCBjb2x1bW4gZm9yIHRoZSBnaXZlbiBwcmltYXJ5IGtleSBmaWVsZC4gVXNlcyB0aGUKKyAgICAgKiB1c2VyJ3MgcmF3IG1hcHBpbmcgaW5mbyBpZiBnaXZlbi4gT25seSBzdXBwb3J0cyBzaW1wbGUgZmllbGQgdHlwZXMuCisgICAgICogVGhlIGNvbHVtbiBuYW1lIHdpbGwgYmUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSByZWxhdGVkIHByaW1hcnkga2V5CisgICAgICogY29sdW1uLCBpZiBhbnkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uIG1hcFByaW1hcnlLZXkoVmFsdWVNYXBwaW5nIHZtLCBGaWVsZE1hcHBpbmcgcGspIHsKKyAgICAgICAgTGlzdCBjb2xzID0gcGsuZ2V0VmFsdWVJbmZvKCkuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5zaXplKCkgPiAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtdW5tYXBwZWQtcmVsIiwgdm0sIHBrKSk7CisKKyAgICAgICAgQ29sdW1uIHRtcGxhdGUgPSBudWxsOworICAgICAgICBpZiAoY29scy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgIHRtcGxhdGUgPSAoQ29sdW1uKSBjb2xzLmdldCgwKTsKKworICAgICAgICBDb2x1bW4gY29sID0gbmV3IENvbHVtbigpOworICAgICAgICBzd2l0Y2ggKHBrLmdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0lOVEVHRVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdERUNJTUFMOgorICAgICAgICAgICAgICAgIGNvbC5zZXRKYXZhVHlwZShway5nZXRUeXBlQ29kZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFTUUxUeXBlcy5nZXREYXRlVHlwZUNvZGUocGsuZ2V0VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgX2xvYy5nZXQoImJhZC11bm1hcHBlZC1yZWwiLCB2bSwgcGspKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0bXBsYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbC5zZXROYW1lKHRtcGxhdGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlKHRtcGxhdGUuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlTmFtZSh0bXBsYXRlLmdldFR5cGVOYW1lKCkpOworICAgICAgICAgICAgY29sLnNldFNpemUodG1wbGF0ZS5nZXRTaXplKCkpOworICAgICAgICAgICAgY29sLnNldERlY2ltYWxEaWdpdHModG1wbGF0ZS5nZXREZWNpbWFsRGlnaXRzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UsIHVzaW5nIGEgZGV0YWNoZWQKKyAgICAgKiBzdGF0ZSBtYW5hZ2VyIGlmIHRoZSBpbnN0bmFjZSBpcyBub3QgbWFuYWdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZ2V0U3RhdGVNYW5hZ2VyKE9iamVjdCBvYmosCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSBjdHguZ2V0U3RhdGVNYW5hZ2VyKG9iaik7CisgICAgICAgIGlmIChzbSA9PSBudWxsKSAvLyBtdXN0IGJlIGRldGFjaGVkCisgICAgICAgICAgICByZXR1cm4gbmV3IERldGFjaGVkVmFsdWVTdGF0ZU1hbmFnZXIob2JqLCBjdHgpOworICAgICAgICByZXR1cm4gc207CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvblRvTWFueUludmVyc2VLZXlGaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1JlbGF0aW9uVG9NYW55SW52ZXJzZUtleUZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjkwN2UyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvblRvTWFueUludmVyc2VLZXlGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNoYW5nZVRyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eTsKKworLyoqCisgKiBNYXBzIGEgcmVsYXRpb24gdG8gYSBzZXQgb2Ygb3RoZXIgb2JqZWN0cyB1c2luZyBhbiBpbnZlcnNlCisgKiBmb3JlaWduIGtleSBpbiB0aGUgcmVsYXRlZCBvYmplY3QgdGFibGUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbGF0aW9uVG9NYW55SW52ZXJzZUtleUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIFN0b3JlQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmVsYXRpb25Ub01hbnlJbnZlcnNlS2V5RmllbGRTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gX29yZGVySW5zZXJ0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9vcmRlclVwZGF0ZSA9IGZhbHNlOworCisgICAgcHJvdGVjdGVkIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleShDbGFzc01hcHBpbmcgZWxlbSkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRGb3JlaWduS2V5KGVsZW0pOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdEVsZW1lbnQoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGVsZW0sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyTW9kZSwKKyAgICAgICAgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc2VsLnNlbGVjdChlbGVtLCBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwKKyAgICAgICAgICAgIHN0b3JlLCBmZXRjaCwgZWFnZXJNb2RlLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBsb2FkRWxlbWVudChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGVsZW0gPSByZXMuZ2V0QmFzZU1hcHBpbmcoKTsKKyAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIGVsZW0gPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldEluZGVwZW5kZW50VHlwZU1hcHBpbmdzKClbMF07CisgICAgICAgIHJldHVybiByZXMubG9hZChlbGVtLCBzdG9yZSwgZmV0Y2gsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSm9pbnMgam9pbihKb2lucyBqb2lucywgQ2xhc3NNYXBwaW5nIGVsZW0pIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIHZtID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgRm9yZWlnbktleSBmayA9IHZtLmdldEZvcmVpZ25LZXkoZWxlbSk7CisgICAgICAgIENsYXNzTWFwcGluZyBvd25lciA9IGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpOworICAgICAgICB3aGlsZSAoZmsuZ2V0UHJpbWFyeUtleVRhYmxlKCkgIT0gb3duZXIuZ2V0VGFibGUoKSkgeworICAgICAgICAgICAgam9pbnMgPSBvd25lci5qb2luU3VwZXJjbGFzcyhqb2lucywgZmFsc2UpOworICAgICAgICAgICAgb3duZXIgPSBvd25lci5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsgCisgICAgICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam9pbnMuam9pblJlbGF0aW9uKGZpZWxkLmdldE5hbWUoKSwgZmssIGVsZW0sIAorICAgICAgICAgICAgdm0uZ2V0U2VsZWN0U3ViY2xhc3NlcygpLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSm9pbnMgam9pbkVsZW1lbnRSZWxhdGlvbihKb2lucyBqb2lucywgQ2xhc3NNYXBwaW5nIGVsZW0pIHsKKyAgICAgICAgcmV0dXJuIGpvaW5SZWxhdGlvbihqb2lucywgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBmaWVsZC5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMoZmllbGQsICFhZGFwdCk7CisgICAgICAgIGZpZWxkLmdldEtleU1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMKKyAgICAgICAgICAgIChmaWVsZC5nZXRLZXkoKSwgIWFkYXB0KTsKKworICAgICAgICBWYWx1ZU1hcHBpbmcgZWxlbSA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIGlmIChlbGVtLmdldFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlBDIHx8IGVsZW0uaXNFbWJlZGRlZFBDKCkKKyAgICAgICAgICAgIHx8ICFlbGVtLmdldFR5cGVNYXBwaW5nKCkuaXNNYXBwZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWVsZW0tcmVsYXRpb24iLCBmaWVsZCkpOworCisgICAgICAgIC8vIGNoZWNrIGZvciBuYW1lZCBpbnZlcnNlCisgICAgICAgIEZpZWxkTWFwcGluZyBtYXBwZWQgPSBmaWVsZC5nZXRNYXBwZWRCeU1hcHBpbmcoKTsKKyAgICAgICAgRmllbGRNYXBwaW5nSW5mbyBmaW5mbyA9IGZpZWxkLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIFZhbHVlTWFwcGluZ0luZm8gdmluZm8gPSBlbGVtLmdldFZhbHVlSW5mbygpOworICAgICAgICBib29sZWFuIGNyaXRlcmlhID0gdmluZm8uZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpOworICAgICAgICBpZiAobWFwcGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hcHBlZC5yZXNvbHZlKG1hcHBlZC5NT0RFX01FVEEgfCBtYXBwZWQuTU9ERV9NQVBQSU5HKTsKKyAgICAgICAgICAgIGlmICghKG1hcHBlZC5nZXRTdHJhdGVneSgpIGluc3RhbmNlb2YgUmVsYXRpb25GaWVsZFN0cmF0ZWd5KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1pbnYtcmVsYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBmaWVsZCwgbWFwcGVkKSk7CisgICAgICAgICAgICB2aW5mby5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMoZWxlbSwgIWFkYXB0KTsKKyAgICAgICAgICAgIGVsZW0uc2V0Rm9yZWlnbktleShtYXBwZWQuZ2V0Rm9yZWlnbktleQorICAgICAgICAgICAgICAgIChmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKSkpOworICAgICAgICAgICAgZWxlbS5zZXRDb2x1bW5zKG1hcHBlZC5nZXREZWZpbmluZ01hcHBpbmcoKS4KKyAgICAgICAgICAgICAgICBnZXRQcmltYXJ5S2V5Q29sdW1ucygpKTsKKyAgICAgICAgICAgIGVsZW0uc2V0Sm9pbkRpcmVjdGlvbihWYWx1ZU1hcHBpbmcuSk9JTl9FWFBFQ1RFRF9JTlZFUlNFKTsKKyAgICAgICAgICAgIGVsZW0uc2V0VXNlQ2xhc3NDcml0ZXJpYShjcml0ZXJpYSk7CisKKyAgICAgICAgICAgIGZpZWxkLnNldE9yZGVyQ29sdW1uKGZpbmZvLmdldE9yZGVyQ29sdW1uKGZpZWxkLAorICAgICAgICAgICAgICAgIG1hcHBlZC5nZXRGb3JlaWduS2V5KCkuZ2V0VGFibGUoKSwgYWRhcHQpKTsKKyAgICAgICAgICAgIGZpZWxkLnNldE9yZGVyQ29sdW1uSU8oZmluZm8uZ2V0Q29sdW1uSU8oKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXAgaW52ZXJzZSBmb3JlaWduIGtleSBpbiByZWxhdGVkIHRhYmxlCisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSB2aW5mby5nZXRJbnZlcnNlVHlwZUpvaW4oZWxlbSwgZmllbGQuZ2V0TmFtZSgpLCBhZGFwdCk7CisgICAgICAgIGVsZW0uc2V0Rm9yZWlnbktleShmayk7CisgICAgICAgIGVsZW0uc2V0Q29sdW1uSU8odmluZm8uZ2V0Q29sdW1uSU8oKSk7CisgICAgICAgIGVsZW0uc2V0Q29sdW1ucyhlbGVtLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSk7CisgICAgICAgIGVsZW0uc2V0Sm9pbkRpcmVjdGlvbihWYWx1ZU1hcHBpbmcuSk9JTl9FWFBFQ1RFRF9JTlZFUlNFKTsKKyAgICAgICAgZWxlbS5zZXRVc2VDbGFzc0NyaXRlcmlhKGNyaXRlcmlhKTsKKyAgICAgICAgZWxlbS5tYXBDb25zdHJhaW50cyhmaWVsZC5nZXROYW1lKCksIGFkYXB0KTsKKworICAgICAgICBmaWVsZC5zZXRPcmRlckNvbHVtbihmaW5mby5nZXRPcmRlckNvbHVtbihmaWVsZCwgZmsuZ2V0VGFibGUoKSwKKyAgICAgICAgICAgIGFkYXB0KSk7CisgICAgICAgIGZpZWxkLnNldE9yZGVyQ29sdW1uSU8oZmluZm8uZ2V0Q29sdW1uSU8oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgQ29sdW1uIG9yZGVyID0gZmllbGQuZ2V0T3JkZXJDb2x1bW4oKTsKKyAgICAgICAgX29yZGVySW5zZXJ0ID0gZmllbGQuZ2V0T3JkZXJDb2x1bW5JTygpLmlzSW5zZXJ0YWJsZShvcmRlciwgZmFsc2UpOworICAgICAgICBfb3JkZXJVcGRhdGUgPSBmaWVsZC5nZXRPcmRlckNvbHVtbklPKCkuaXNVcGRhdGFibGUob3JkZXIsIGZhbHNlKTsKKworICAgICAgICBWYWx1ZU1hcHBpbmcgZWxlbSA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIExvZyBsb2cgPSBmaWVsZC5nZXRSZXBvc2l0b3J5KCkuZ2V0TG9nKCk7CisgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpID09IG51bGwKKyAgICAgICAgICAgICYmIGVsZW0uZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpICYmIGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBlbGVtLmdldEZvcmVpZ25LZXkoKTsKKyAgICAgICAgICAgIGlmIChlbGVtLmdldENvbHVtbklPKCkuaXNBbnlVcGRhdGFibGUoZmssIGZhbHNlKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgiY2xhc3MtY3JpdC1vd25lciIsIGZpZWxkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldE1hcHBlZEJ5KCkgPT0gbnVsbCB8fCBfb3JkZXJJbnNlcnQgfHwgX29yZGVyVXBkYXRlKQorICAgICAgICAgICAgaW5zZXJ0KHNtLCBybSwgc20uZmV0Y2hPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUm93TWFuYWdlciBybSwgT2JqZWN0IHZhbHMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoZmllbGQuZ2V0TWFwcGVkQnkoKSAhPSBudWxsICYmICFfb3JkZXJJbnNlcnQgJiYgIV9vcmRlclVwZGF0ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gdG9Db2xsZWN0aW9uKHZhbHMpOworICAgICAgICBpZiAoY29sbCA9PSBudWxsIHx8IGNvbGwuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENsYXNzTWFwcGluZyByZWwgPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbGwuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgaWR4KyspCisgICAgICAgICAgICB1cGRhdGVJbnZlcnNlKHNtLmdldENvbnRleHQoKSwgaXRyLm5leHQoKSwgcmVsLCBybSwgc20sIGlkeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwgJiYgIV9vcmRlckluc2VydCAmJiAhX29yZGVyVXBkYXRlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9iamVjdCBvYmogPSBzbS5mZXRjaE9iamVjdChmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgQ2hhbmdlVHJhY2tlciBjdCA9IG51bGw7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQcm94eSkgeworICAgICAgICAgICAgUHJveHkgcHJveHkgPSAoUHJveHkpIG9iajsKKyAgICAgICAgICAgIGlmIChQcm94aWVzLmlzT3duZXIocHJveHksIHNtLCBmaWVsZC5nZXRJbmRleCgpKSkKKyAgICAgICAgICAgICAgICBjdCA9IHByb3h5LmdldENoYW5nZVRyYWNrZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vIGZpbmUtZ3JhaW5lZCBjaGFuZ2UgdHJhY2tpbmcgdGhlbiBqdXN0IGRlbGV0ZSBhbmQgcmVpbnNlcnQKKyAgICAgICAgaWYgKGN0ID09IG51bGwgfHwgIWN0LmlzVHJhY2tpbmcoKSkgeworICAgICAgICAgICAgZGVsZXRlKHNtLCBzdG9yZSwgcm0pOworICAgICAgICAgICAgaW5zZXJ0KHNtLCBybSwgb2JqKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG51bGwgaW52ZXJzZSBjb2x1bW5zIGZvciBkZWxldGVzIGFuZCB1cGRhdGUgdGhlbSB3aXRoIG91ciBvaWQgZm9yCisgICAgICAgIC8vIGluc2VydHMKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHJlbCA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCA9IHN0b3JlLmdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKGZpZWxkLmdldE1hcHBlZEJ5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbiByZW0gPSBjdC5nZXRSZW1vdmVkKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlbS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICB1cGRhdGVJbnZlcnNlKGN0eCwgaXRyLm5leHQoKSwgcmVsLCBybSwgbnVsbCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9uIGFkZCA9IGN0LmdldEFkZGVkKCk7CisgICAgICAgIGludCBzZXEgPSBjdC5nZXROZXh0U2VxdWVuY2UoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBhZGQuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgc2VxKyspCisgICAgICAgICAgICB1cGRhdGVJbnZlcnNlKGN0eCwgaXRyLm5leHQoKSwgcmVsLCBybSwgc20sIHNlcSk7CisgICAgICAgIGlmIChmaWVsZC5nZXRPcmRlckNvbHVtbigpICE9IG51bGwpCisgICAgICAgICAgICBjdC5zZXROZXh0U2VxdWVuY2Uoc2VxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBpZiBudWxsYWJsZSwgbnVsbCBhbnkgZXhpc3RpbmcgaW52ZXJzZSBjb2x1bW5zIHRoYXQgcmVmZXIgdG8gdGhpcyBvYmoKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVsZW0gPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICBDb2x1bW5JTyBpbyA9IGVsZW0uZ2V0Q29sdW1uSU8oKTsKKyAgICAgICAgRm9yZWlnbktleSBmayA9IGVsZW0uZ2V0Rm9yZWlnbktleSgpOworICAgICAgICBpZiAoIWVsZW0uZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpICYmIGlvLmlzQW55VXBkYXRhYmxlKGZrLCB0cnVlKSkgeyAKKyAgICAgICAgICAgIGFzc2VydEludmVyc2FibGUoKTsKKyAgICAgICAgICAgIFJvdyByb3cgPSBybS5nZXRBbGxSb3dzKGZrLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFKTsKKyAgICAgICAgICAgIHJvdy5zZXRGb3JlaWduS2V5KGZrLCBpbywgbnVsbCk7CisgICAgICAgICAgICByb3cud2hlcmVGb3JlaWduS2V5KGZrLCBzbSk7CisgICAgICAgICAgICBybS5mbHVzaEFsbFJvd3Mocm93KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc20uZ2V0TG9hZGVkKCkuZ2V0KGZpZWxkLmdldEluZGV4KCkpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHVwZGF0ZSBmayBvbiBlYWNoIGZpZWxkIHZhbHVlIHJvdworICAgICAgICBDbGFzc01hcHBpbmcgcmVsID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpOworICAgICAgICBTdG9yZUNvbnRleHQgY3R4ID0gc3RvcmUuZ2V0Q29udGV4dCgpOworICAgICAgICBDb2xsZWN0aW9uIG9ianMgPSB0b0NvbGxlY3Rpb24oc20uZmV0Y2hPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSkpOworICAgICAgICBpZiAob2JqcyAhPSBudWxsICYmICFvYmpzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2Jqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICB1cGRhdGVJbnZlcnNlIChjdHgsIGl0ci5uZXh0KCksIHJlbCwgcm0sIHNtLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBpbnZlcnNlIGNvbHVtbnMgb2YgYSAxLU0gcmVsYXRlZCBvYmplY3QKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBvaWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUludmVyc2UoU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0IGludmVyc2UsCisgICAgICAgIENsYXNzTWFwcGluZyByZWwsIFJvd01hbmFnZXIgcm0sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBpZHgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIGludnNtID0gUmVsYXRpb25TdHJhdGVnaWVzLmdldFN0YXRlTWFuYWdlcihpbnZlcnNlLAorICAgICAgICAgICAgY3R4KTsKKyAgICAgICAgaWYgKGludnNtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVsZW0gPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICBGb3JlaWduS2V5IGZrID0gZWxlbS5nZXRGb3JlaWduS2V5KCk7CisgICAgICAgIENvbHVtbklPIGlvID0gZWxlbS5nZXRDb2x1bW5JTygpOworICAgICAgICBDb2x1bW4gb3JkZXIgPSBmaWVsZC5nZXRPcmRlckNvbHVtbigpOworCisgICAgICAgIGludCBhY3Rpb247CisgICAgICAgIGJvb2xlYW4gd3JpdGVhYmxlOworICAgICAgICBib29sZWFuIG9yZGVyV3JpdGVhYmxlOworICAgICAgICBpZiAoaW52c20uaXNOZXcoKSAmJiAhaW52c20uaXNGbHVzaGVkKCkpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gbnVsbCBpbnZlcnNlIGNvbHVtbnMgb2YgbmV3IGluc3RhbmNlCisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCB8fCBzbS5pc0RlbGV0ZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB3cml0ZWFibGUgPSBpby5pc0FueUluc2VydGFibGUoZmssIGZhbHNlKTsKKyAgICAgICAgICAgIG9yZGVyV3JpdGVhYmxlID0gX29yZGVySW5zZXJ0OworICAgICAgICAgICAgYWN0aW9uID0gUm93LkFDVElPTl9JTlNFUlQ7CisgICAgICAgIH0gZWxzZSBpZiAoaW52c20uaXNEZWxldGVkKCkpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gbnVsbCBpbnZlcnNlIGNvbHVtbnMgb2YgZGVsZXRlZCBpbnN0YW5jZQorICAgICAgICAgICAgaWYgKGludnNtLmlzRmx1c2hlZCgpIHx8IHNtID09IG51bGwgfHwgIXNtLmlzRGVsZXRlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHdyaXRlYWJsZSA9IHRydWU7CisgICAgICAgICAgICBvcmRlcldyaXRlYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgYWN0aW9uID0gUm93LkFDVElPTl9ERUxFVEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiBzbS5pc0RlbGV0ZWQoKSkKKyAgICAgICAgICAgICAgICBzbSA9IG51bGw7CisgICAgICAgICAgICB3cml0ZWFibGUgPSBpby5pc0FueVVwZGF0YWJsZShmaywgc20gPT0gbnVsbCk7CisgICAgICAgICAgICBvcmRlcldyaXRlYWJsZSA9IGZpZWxkLmdldE9yZGVyQ29sdW1uSU8oKS5pc1VwZGF0YWJsZQorICAgICAgICAgICAgICAgIChvcmRlciwgc20gPT0gbnVsbCk7CisgICAgICAgICAgICBhY3Rpb24gPSBSb3cuQUNUSU9OX1VQREFURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXdyaXRlYWJsZSAmJiAhb3JkZXJXcml0ZWFibGUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYXNzZXJ0SW52ZXJzYWJsZSgpOworCisgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gdXBkYXRlLCB0aGlzIG1pZ2h0IGJlIHRoZSBvbmx5IG1vZCB0byB0aGUgcm93LCBzbworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHdoZXJlIGNvbmRpdGlvbiBpcyBzZXQKKyAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyhmay5nZXRUYWJsZSgpLCBhY3Rpb24sIGludnNtLCB0cnVlKTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBSb3cuQUNUSU9OX1VQREFURSkKKyAgICAgICAgICAgIHJvdy53aGVyZVByaW1hcnlLZXkoaW52c20pOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW52ZXJzZSBwb2ludGVyIHdpdGggb3VyIG9pZCB2YWx1ZQorICAgICAgICBpZiAod3JpdGVhYmxlKQorICAgICAgICAgICAgcm93LnNldEZvcmVpZ25LZXkoZmssIGlvLCBzbSk7CisgICAgICAgIGlmIChvcmRlcldyaXRlYWJsZSkKKyAgICAgICAgICAgIHJvdy5zZXRJbnQob3JkZXIsIGlkeCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBDbGFzc01hcHBpbmcgY20gPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiBjbS50b0RhdGFTdG9yZVZhbHVlKHZhbCwgY20uZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwgc3RvcmUpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBib29sZWFuIGZvcmNlT3V0ZXIpIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVsZW0gPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICBDbGFzc01hcHBpbmdbXSBjbHNzID0gZWxlbS5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpOworICAgICAgICBpZiAoY2xzcy5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIHRocm93IFJlbGF0aW9uU3RyYXRlZ2llcy51bmpvaW5hYmxlKGVsZW0pOworICAgICAgICBpZiAoZm9yY2VPdXRlcikKKyAgICAgICAgICAgIHJldHVybiBqb2lucy5vdXRlckpvaW5SZWxhdGlvbihmaWVsZC5nZXROYW1lKCksIAorICAgICAgICAgICAgICAgIGVsZW0uZ2V0Rm9yZWlnbktleShjbHNzWzBdKSwgY2xzc1swXSwKKyAgICAgICAgICAgICAgICBlbGVtLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBqb2lucy5qb2luUmVsYXRpb24oZmllbGQuZ2V0TmFtZSgpLCBlbGVtLmdldEZvcmVpZ25LZXkoY2xzc1swXSksCisgICAgICAgICAgICBjbHNzWzBdLCBlbGVtLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEludmVyc2FibGUoKSB7CisgICAgICAgIFZhbHVlTWFwcGluZyBlbGVtID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgaWYgKGVsZW0uZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKS5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIHRocm93IFJlbGF0aW9uU3RyYXRlZ2llcy51bmludmVyc2FibGUoZWxlbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvblRvTWFueVRhYmxlRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9SZWxhdGlvblRvTWFueVRhYmxlRmllbGRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjYyMWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1JlbGF0aW9uVG9NYW55VGFibGVGaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZU1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DaGFuZ2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3hpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHk7CisKKy8qKgorICogTWFwcyBhIHNldCBvZiByZWxhdGVkIG9iamVjdHMgdGhyb3VnaCBhbiBhc3NvY2lhdGlvbiB0YWJsZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVsYXRpb25Ub01hbnlUYWJsZUZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIFN0b3JlQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmVsYXRpb25Ub01hbnlUYWJsZUZpZWxkU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIENsYXNzTWFwcGluZ1tdIGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgcmV0dXJuICh0cmF2ZXJzZSkKKyAgICAgICAgICAgID8gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpCisgICAgICAgICAgICA6IENsYXNzTWFwcGluZy5FTVBUWV9NQVBQSU5HUzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleShDbGFzc01hcHBpbmcgZWxlbSkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RFbGVtZW50KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBlbGVtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUsCisgICAgICAgIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHNlbC5zZWxlY3QoZWxlbSwgZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRTZWxlY3RTdWJjbGFzc2VzKCksCisgICAgICAgICAgICBzdG9yZSwgZmV0Y2gsIGVhZ2VyTW9kZSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgbG9hZEVsZW1lbnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTWFwcGluZyBlbGVtID0gcmVzLmdldEJhc2VNYXBwaW5nKCk7CisgICAgICAgIGlmIChlbGVtID09IG51bGwpCisgICAgICAgICAgICBlbGVtID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRJbmRlcGVuZGVudFR5cGVNYXBwaW5ncygpWzBdOworICAgICAgICByZXR1cm4gcmVzLmxvYWQoZWxlbSwgc3RvcmUsIGZldGNoLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEpvaW5zIGpvaW4oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyBlbGVtKSB7CisgICAgICAgIHJldHVybiBqb2luKGpvaW5zLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEpvaW5zIGpvaW5FbGVtZW50UmVsYXRpb24oSm9pbnMgam9pbnMsIENsYXNzTWFwcGluZyBlbGVtKSB7CisgICAgICAgIFZhbHVlTWFwcGluZyB2bSA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIHJldHVybiBqb2lucy5qb2luUmVsYXRpb24oZmllbGQuZ2V0TmFtZSgpLCB2bS5nZXRGb3JlaWduS2V5KGVsZW0pLCAKKyAgICAgICAgICAgIGVsZW0sIHZtLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBmaWVsZC5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMoZmllbGQsICFhZGFwdCk7CisgICAgICAgIGZpZWxkLmdldEtleU1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMKKyAgICAgICAgICAgIChmaWVsZC5nZXRLZXkoKSwgIWFkYXB0KTsKKworICAgICAgICBWYWx1ZU1hcHBpbmcgZWxlbSA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIGlmIChlbGVtLmdldFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlBDIHx8IGVsZW0uaXNFbWJlZGRlZFBDKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1lbGVtLXJlbGF0aW9uIiwgZmllbGQpKTsKKworICAgICAgICAvLyBjaGVjayBmb3IgbmFtZWQgaW52ZXJzZQorICAgICAgICBGaWVsZE1hcHBpbmcgbWFwcGVkID0gZmllbGQuZ2V0TWFwcGVkQnlNYXBwaW5nKCk7CisgICAgICAgIFZhbHVlTWFwcGluZ0luZm8gdmluZm8gPSBlbGVtLmdldFZhbHVlSW5mbygpOworICAgICAgICBib29sZWFuIGNyaXRlcmlhID0gdmluZm8uZ2V0VXNlQ2xhc3NDcml0ZXJpYSgpOworICAgICAgICBpZiAobWFwcGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtYXBwZWQuZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWludi1yZWxhdGlvbi1jb2xsIiwKKyAgICAgICAgICAgICAgICAgICAgZmllbGQsIG1hcHBlZCkpOworICAgICAgICAgICAgZmllbGQuZ2V0TWFwcGluZ0luZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMoZmllbGQsICFhZGFwdCk7CisgICAgICAgICAgICB2aW5mby5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMoZWxlbSwgIWFkYXB0KTsKKyAgICAgICAgICAgIG1hcHBlZC5yZXNvbHZlKG1hcHBlZC5NT0RFX01FVEEgfCBtYXBwZWQuTU9ERV9NQVBQSU5HKTsKKworICAgICAgICAgICAgaWYgKCFtYXBwZWQuaXNNYXBwZWQoKSB8fCBtYXBwZWQuaXNTZXJpYWxpemVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJtYXBwZWQtYnktdW5tYXBwZWQiLAorICAgICAgICAgICAgICAgICAgICBmaWVsZCwgbWFwcGVkKSk7CisKKyAgICAgICAgICAgIGZpZWxkLnNldEpvaW5Gb3JlaWduS2V5KG1hcHBlZC5nZXRFbGVtZW50TWFwcGluZygpLgorICAgICAgICAgICAgICAgIGdldEZvcmVpZ25LZXkoZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCkpKTsKKyAgICAgICAgICAgIGVsZW0uc2V0Rm9yZWlnbktleShtYXBwZWQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSk7CisgICAgICAgICAgICBlbGVtLnNldFVzZUNsYXNzQ3JpdGVyaWEoY3JpdGVyaWEpOworICAgICAgICAgICAgZmllbGQuc2V0T3JkZXJDb2x1bW4obWFwcGVkLmdldE9yZGVyQ29sdW1uKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmllbGQubWFwSm9pbihhZGFwdCwgdHJ1ZSk7CisgICAgICAgIGlmIChlbGVtLmdldFR5cGVNYXBwaW5nKCkuaXNNYXBwZWQoKSkgeworICAgICAgICAgICAgRm9yZWlnbktleSBmayA9IHZpbmZvLmdldFR5cGVKb2luKGVsZW0sICJlbGVtZW50IiwgZmFsc2UsIGFkYXB0KTsKKyAgICAgICAgICAgIGVsZW0uc2V0Rm9yZWlnbktleShmayk7CisgICAgICAgICAgICBlbGVtLnNldENvbHVtbklPKHZpbmZvLmdldENvbHVtbklPKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFJlbGF0aW9uU3RyYXRlZ2llcy5tYXBSZWxhdGlvblRvVW5tYXBwZWRQQyhlbGVtLCAiZWxlbWVudCIsIGFkYXB0KTsKKyAgICAgICAgZWxlbS5zZXRVc2VDbGFzc0NyaXRlcmlhKGNyaXRlcmlhKTsKKyAgICAgICAgZWxlbS5tYXBDb25zdHJhaW50cygiZWxlbWVudCIsIGFkYXB0KTsKKworICAgICAgICBGaWVsZE1hcHBpbmdJbmZvIGZpbmZvID0gZmllbGQuZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgQ29sdW1uIG9yZGVyQ29sID0gZmluZm8uZ2V0T3JkZXJDb2x1bW4oZmllbGQsIGZpZWxkLmdldFRhYmxlKCksIGFkYXB0KTsKKyAgICAgICAgZmllbGQuc2V0T3JkZXJDb2x1bW4ob3JkZXJDb2wpOworICAgICAgICBmaWVsZC5zZXRPcmRlckNvbHVtbklPKGZpbmZvLmdldENvbHVtbklPKCkpOworICAgICAgICBmaWVsZC5tYXBQcmltYXJ5S2V5KGFkYXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldE1hcHBlZEJ5KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGluc2VydChzbSwgcm0sIHNtLmZldGNoT2JqZWN0KGZpZWxkLmdldEluZGV4KCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zZXJ0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFJvd01hbmFnZXIgcm0sIE9iamVjdCB2YWxzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gdG9Db2xsZWN0aW9uKHZhbHMpOworICAgICAgICBpZiAoY29sbCA9PSBudWxsIHx8IGNvbGwuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFJvdyByb3cgPSBybS5nZXRTZWNvbmRhcnlSb3coZmllbGQuZ2V0VGFibGUoKSwgUm93LkFDVElPTl9JTlNFUlQpOworICAgICAgICByb3cuc2V0Rm9yZWlnbktleShmaWVsZC5nZXRKb2luRm9yZWlnbktleSgpLCBmaWVsZC5nZXRKb2luQ29sdW1uSU8oKSwKKyAgICAgICAgICAgIHNtKTsKKworICAgICAgICBWYWx1ZU1hcHBpbmcgZWxlbSA9IGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCk7CisgICAgICAgIFN0b3JlQ29udGV4dCBjdHggPSBzbS5nZXRDb250ZXh0KCk7CisgICAgICAgIENvbHVtbiBvcmRlciA9IGZpZWxkLmdldE9yZGVyQ29sdW1uKCk7CisgICAgICAgIGJvb2xlYW4gc2V0T3JkZXIgPSBmaWVsZC5nZXRPcmRlckNvbHVtbklPKCkuaXNJbnNlcnRhYmxlKG9yZGVyLCBmYWxzZSk7CisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIGVzbTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IGlkeCsrKSB7CisgICAgICAgICAgICBlc20gPSBSZWxhdGlvblN0cmF0ZWdpZXMuZ2V0U3RhdGVNYW5hZ2VyKGl0ci5uZXh0KCksIGN0eCk7CisgICAgICAgICAgICBlbGVtLnNldEZvcmVpZ25LZXkocm93LCBlc20pOworICAgICAgICAgICAgaWYgKHNldE9yZGVyKQorICAgICAgICAgICAgICAgIHJvdy5zZXRJbnQob3JkZXIsIGlkeCk7CisgICAgICAgICAgICBybS5mbHVzaFNlY29uZGFyeVJvdyhyb3cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgT2JqZWN0IG9iaiA9IHNtLmZldGNoT2JqZWN0KGZpZWxkLmdldEluZGV4KCkpOworICAgICAgICBDaGFuZ2VUcmFja2VyIGN0ID0gbnVsbDsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFByb3h5KSB7CisgICAgICAgICAgICBQcm94eSBwcm94eSA9IChQcm94eSkgb2JqOworICAgICAgICAgICAgaWYgKFByb3hpZXMuaXNPd25lcihwcm94eSwgc20sIGZpZWxkLmdldEluZGV4KCkpKQorICAgICAgICAgICAgICAgIGN0ID0gcHJveHkuZ2V0Q2hhbmdlVHJhY2tlcigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm8gZmluZS1ncmFpbmVkIGNoYW5nZSB0cmFja2luZyB0aGVuIGp1c3QgZGVsZXRlIGFuZCByZWluc2VydAorICAgICAgICBpZiAoY3QgPT0gbnVsbCB8fCAhY3QuaXNUcmFja2luZygpKSB7CisgICAgICAgICAgICBkZWxldGUoc20sIHN0b3JlLCBybSk7CisgICAgICAgICAgICBpbnNlcnQoc20sIHJtLCBvYmopOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCA9IHN0b3JlLmdldENvbnRleHQoKTsKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVsZW0gPSBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIGVzbTsKKworICAgICAgICAvLyBkZWxldGUgdGhlIHJlbW92ZXMKKyAgICAgICAgQ29sbGVjdGlvbiByZW0gPSBjdC5nZXRSZW1vdmVkKCk7CisgICAgICAgIGlmICghcmVtLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgUm93IGRlbFJvdyA9IHJtLmdldFNlY29uZGFyeVJvdyhmaWVsZC5nZXRUYWJsZSgpLAorICAgICAgICAgICAgICAgIFJvdy5BQ1RJT05fREVMRVRFKTsKKyAgICAgICAgICAgIGRlbFJvdy53aGVyZUZvcmVpZ25LZXkoZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwgc20pOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlbS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGVzbSA9IFJlbGF0aW9uU3RyYXRlZ2llcy5nZXRTdGF0ZU1hbmFnZXIoaXRyLm5leHQoKSwgY3R4KTsKKyAgICAgICAgICAgICAgICBlbGVtLndoZXJlRm9yZWlnbktleShkZWxSb3csIGVzbSk7CisgICAgICAgICAgICAgICAgcm0uZmx1c2hTZWNvbmRhcnlSb3coZGVsUm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluc2VydCB0aGUgYWRkcworICAgICAgICBDb2xsZWN0aW9uIGFkZCA9IGN0LmdldEFkZGVkKCk7CisgICAgICAgIGlmICghYWRkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgUm93IGFkZFJvdyA9IHJtLmdldFNlY29uZGFyeVJvdyhmaWVsZC5nZXRUYWJsZSgpLAorICAgICAgICAgICAgICAgIFJvdy5BQ1RJT05fSU5TRVJUKTsKKyAgICAgICAgICAgIGFkZFJvdy5zZXRGb3JlaWduS2V5KGZpZWxkLmdldEpvaW5Gb3JlaWduS2V5KCksCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0Sm9pbkNvbHVtbklPKCksIHNtKTsKKworICAgICAgICAgICAgaW50IHNlcSA9IGN0LmdldE5leHRTZXF1ZW5jZSgpOworICAgICAgICAgICAgQ29sdW1uIG9yZGVyID0gZmllbGQuZ2V0T3JkZXJDb2x1bW4oKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2V0T3JkZXIgPSBmaWVsZC5nZXRPcmRlckNvbHVtbklPKCkuaXNJbnNlcnRhYmxlKG9yZGVyLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYWRkLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IHNlcSsrKSB7CisgICAgICAgICAgICAgICAgZXNtID0gUmVsYXRpb25TdHJhdGVnaWVzLmdldFN0YXRlTWFuYWdlcihpdHIubmV4dCgpLCBjdHgpOworICAgICAgICAgICAgICAgIGVsZW0uc2V0Rm9yZWlnbktleShhZGRSb3csIGVzbSk7CisgICAgICAgICAgICAgICAgaWYgKHNldE9yZGVyKQorICAgICAgICAgICAgICAgICAgICBhZGRSb3cuc2V0SW50KG9yZGVyLCBzZXEpOworICAgICAgICAgICAgICAgIHJtLmZsdXNoU2Vjb25kYXJ5Um93KGFkZFJvdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3JkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjdC5zZXROZXh0U2VxdWVuY2Uoc2VxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSb3cgcm93ID0gcm0uZ2V0QWxsUm93cyhmaWVsZC5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX0RFTEVURSk7CisgICAgICAgIHJvdy53aGVyZUZvcmVpZ25LZXkoZmllbGQuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwgc20pOworICAgICAgICBybS5mbHVzaEFsbFJvd3Mocm93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRGF0YVN0b3JlVmFsdWUoT2JqZWN0IHZhbCwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBSZWxhdGlvblN0cmF0ZWdpZXMudG9EYXRhU3RvcmVWYWx1ZShmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLAorICAgICAgICAgICAgdmFsLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW4oSm9pbnMgam9pbnMsIGJvb2xlYW4gZm9yY2VPdXRlcikgeworICAgICAgICByZXR1cm4gZmllbGQuam9pbihqb2lucywgZm9yY2VPdXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5SZWxhdGlvbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyLAorICAgICAgICBib29sZWFuIHRyYXZlcnNlKSB7CisgICAgICAgIFZhbHVlTWFwcGluZyBlbGVtID0gZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gY2xzcyA9IGVsZW0uZ2V0SW5kZXBlbmRlbnRUeXBlTWFwcGluZ3MoKTsKKyAgICAgICAgaWYgKGNsc3MubGVuZ3RoICE9IDEpIHsKKyAgICAgICAgICAgIGlmICh0cmF2ZXJzZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBSZWxhdGlvblN0cmF0ZWdpZXMudW5qb2luYWJsZShlbGVtKTsKKyAgICAgICAgICAgIHJldHVybiBqb2luczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9yY2VPdXRlcikKKyAgICAgICAgICAgIHJldHVybiBqb2lucy5vdXRlckpvaW5SZWxhdGlvbihmaWVsZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgZWxlbS5nZXRGb3JlaWduS2V5KGNsc3NbMF0pLCBjbHNzWzBdLCAKKyAgICAgICAgICAgICAgICBlbGVtLmdldFNlbGVjdFN1YmNsYXNzZXMoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGpvaW5zLmpvaW5SZWxhdGlvbihmaWVsZC5nZXROYW1lKCksIGVsZW0uZ2V0Rm9yZWlnbktleShjbHNzWzBdKSwKKyAgICAgICAgICAgIGNsc3NbMF0sIGVsZW0uZ2V0U2VsZWN0U3ViY2xhc3NlcygpLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvU3RhdGVDb21wYXJpc29uVmVyc2lvblN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1N0YXRlQ29tcGFyaXNvblZlcnNpb25TdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTY1N2MKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1N0YXRlQ29tcGFyaXNvblZlcnNpb25TdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd0ltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvd01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXJyYXlTdGF0ZUltYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIFVzZXMgYSBzdGF0ZSBpbWFnZSB0byBkZXRlcm1pbmUgd2hldGhlciBjb25jdXJyZW5jeSB2aW9sYXRpb25zIHRha2UgcGxhY2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFN0YXRlQ29tcGFyaXNvblZlcnNpb25TdHJhdGVneQorICAgIGV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAic3RhdGUtY29tcGFyaXNvbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChTdGF0ZUNvbXBhcmlzb25WZXJzaW9uU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKKyAgICAgICAgcmV0dXJuIEFMSUFTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSB2ZXJzLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpICE9IG51bGwKKyAgICAgICAgICAgIHx8IGNscy5nZXRFbWJlZGRpbmdNZXRhRGF0YSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1iYXNlLXZlcnMiLCBjbHMpKTsKKworICAgICAgICB2ZXJzLmdldE1hcHBpbmdJbmZvKCkuYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzKHZlcnMsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBGaWVsZE1hcHBpbmdbXSBmaWVsZHMgPSAoRmllbGRNYXBwaW5nW10pIHNtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGRzKCk7CisgICAgICAgIE9iamVjdFtdIHN0YXRlID0gQXJyYXlTdGF0ZUltYWdlLm5ld0ltYWdlKGZpZWxkcy5sZW5ndGgpOworICAgICAgICBCaXRTZXQgbG9hZGVkID0gQXJyYXlTdGF0ZUltYWdlLmdldExvYWRlZChzdGF0ZSk7CisKKyAgICAgICAgLy8gdGFrZSBhIHNuYXBzaG90IG9mIGFsbCB2ZXJzaW9uYWJsZSBmaWVsZCB2YWx1ZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZmllbGRzW2ldLmlzUHJpbWFyeUtleSgpICYmIGZpZWxkc1tpXS5pc1ZlcnNpb25hYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBsb2FkZWQuc2V0KGkpOworICAgICAgICAgICAgICAgIHN0YXRlW2ldID0gc20uZmV0Y2goZmllbGRzW2ldLmdldEluZGV4KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNtLnNldE5leHRWZXJzaW9uKHN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBmb3IgY2xhc3MgbWFwcGluZ3MgdGhhdCB0YWtlIG92ZXIgdGhlIGluc2VydAorICAgICAqIHByb2Nlc3MsIGJ1dCBzdGlsbCB3YW50IHRvIHVzZSB0aGlzIGluZGljYXRvciBmb3Igb3B0aW1pc3RpYyBsb2NraW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGN1c3RvbUluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpbnNlcnQoc20sIHN0b3JlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVjb3JkZWQgc3RhdGUgKGZvciBleGFtcGxlLCBtb2RpZmljYXRpb24gbWFkZSB0bworICAgICAgICAvLyBob2xsb3cgaW5zdGFuY2UgYW5kIG5vIGZpZWxkcyBldmVyeSBsb2FkZWQpLCBjYW4ndCBkbyBhbnl0aGluZworICAgICAgICBPYmplY3RbXSBzdGF0ZSA9IChPYmplY3RbXSkgc20uZ2V0VmVyc2lvbigpOworICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBCaXRTZXQgbG9hZGVkID0gQXJyYXlTdGF0ZUltYWdlLmdldExvYWRlZChzdGF0ZSk7CisgICAgICAgIE9iamVjdFtdIG5leHRTdGF0ZSA9IEFycmF5U3RhdGVJbWFnZS5jbG9uZShzdGF0ZSk7CisKKyAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGZpZWxkcyBhbmQgdXBkYXRlIGNoYW5naW5nIHZhbHVlcyBmb3IgdGhlIG5leHQgc3RhdGUKKyAgICAgICAgLy8gaW1hZ2UsIHBsdXMgYWRkIFdIRVJFIGNvbmRpdGlvbnMgb24gdXBkYXRlcyB0byBtYWtlIHN1cmUgdGhhdAorICAgICAgICAvLyBkYiB2YWx1ZXMgbWF0Y2ggb3VyIHByZXZpb3VzIGltYWdlCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IChGaWVsZE1hcHBpbmdbXSkgc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZHMoKTsKKyAgICAgICAgUm93IHJvdzsKKyAgICAgICAgaWYgKHNtLmlzVmVyc2lvbkNoZWNrUmVxdWlyZWQoKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG1heCA9IGxvYWRlZC5sZW5ndGgoKTsgaSA8IG1heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFsb2FkZWQuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgbmV4dCBzdGF0ZSBpbWFnZSB3aXRoIHRoZSBuZXcgZmllbGQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoc20uZ2V0RGlydHkoKS5nZXQoaSkgJiYgIXNtLmdldEZsdXNoZWQoKS5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZVtpXSA9IHNtLmZldGNoKGZpZWxkc1tpXS5nZXRJbmRleCgpKTsKKworICAgICAgICAgICAgICAgIC8vIGZldGNoIHRoZSByb3cgZm9yIHRoaXMgZmllbGQ7IGlmIG5vIHJvdyBleGlzdHMsIHRoZW4gd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAvLyBhZGQgb25lIGJlY2F1c2Ugd2UgaGF2ZSBubyB1cGRhdGVzIHRvIHBlcmZvcm07IHRoYXQgbWVhbnMgd2UKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBkZXRlY3QgT0wgZXhjZXB0aW9ucyB3aGVuIGFub3RoZXIgdHJhbnNhY3Rpb24gY2hhbmdlcworICAgICAgICAgICAgICAgIC8vIGZpZWxkcyB0aGF0IGFyZW4ndCBpbiBhbnkgb2YgdGhlIHNhbWUgdGFibGVzIGFzIGZpZWxkcyB0aGF0CisgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFuc2FjdGlvbiBjaGFuZ2VkCisgICAgICAgICAgICAgICAgcm93ID0gcm0uZ2V0Um93KGZpZWxkc1tpXS5nZXRUYWJsZSgpLCBSb3cuQUNUSU9OX1VQREFURSwKKyAgICAgICAgICAgICAgICAgICAgc20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAocm93ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLy8gc2V0IFdIRVJFIGNyaXRlcmlhIG1hdGNoaW5nIHRoZSBwcmV2aW91cyBzdGF0ZSBpbWFnZSBzbyB0aGUKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgd2lsbCBmYWlsIGZvciBhbnkgY2hhbmdlcyBtYWRlIGJ5IGFub3RoZXIgdHJhbnNhY3Rpb24KKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0ud2hlcmUoc20sIHN0b3JlLCBybSwgc3RhdGVbaV0pOworICAgICAgICAgICAgICAgIHJvdy5zZXRGYWlsZWRPYmplY3Qoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNtLnNldE5leHRWZXJzaW9uKG5leHRTdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgZm9yIGNsYXNzIG1hcHBpbmdzIHRoYXQgdGFrZSBvdmVyIHRoZSB1cGRhdGUKKyAgICAgKiBwcm9jZXNzLCBidXQgc3RpbGwgd2FudCB0byB1c2UgdGhpcyBpbmRpY2F0b3IgZm9yIG9wdGltaXN0aWMgbG9ja2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzbSB0aGUgaW5zdGFuY2UgdG8gdGVzdAorICAgICAqIEBwYXJhbSBzdG9yZSBzdG9yZSBtYW5hZ2VyIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdGFibGUgb25seSBzdGF0ZSBpbWFnZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSB3aWxsIGJlIHRlc3RlZDsKKyAgICAgKiBpZiB0aGUgY3VzdG9tIG1hcHBpbmcgdXNlcyBkaWZmZXJlbnQgdXBkYXRlcyBmb3IKKyAgICAgKiBkaWZmZXJlbnQgdGFibGVzLCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlCisgICAgICogdGltZXMgZm9yIHRoZSBtdWx0aXBsZSB0YWJsZXMKKyAgICAgKiBAcGFyYW0gcmVjb3JkIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlIHRoZSBsYXN0IHRpbWUgeW91IGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZCwgc28gdGhlIGluZGljYXRvciBjYW4gc2V0dXAgdGhlIG5leHQKKyAgICAgKiB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyCisgICAgICogQHJldHVybiBhIHtAbGluayBDdXN0b21VcGRhdGV9IHdob3NlIGdldFNRTCBtZXRob2QgeWllbGRzIGEKKyAgICAgKiBib29sZWFuIFNRTCBleHByZXNzaW9uIHRoYXQgdGVzdHMgd2hldGhlciB0aGUgY3VycmVudAorICAgICAqIHJlY29yZCBpcyBlcXVhbCB0byBvdXIgcmVjb3JkZWQgc3RhdGUgaW1hZ2UsIGFuZCB3aG9zZQorICAgICAqIHNldFBhcmFtZXRlcnMgbWV0aG9kIHBhcmFtZXRlcml6ZXMgdGhlIGdpdmVuIHByZXBhcmVkCisgICAgICogc3RhdGVtZW50IHdpdGggdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBhYm92ZSBib29sZWFuIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ3VzdG9tVXBkYXRlIGN1c3RvbVVwZGF0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIFRhYmxlIHRhYmxlLCBib29sZWFuIHJlY29yZCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIEN1c3RvbVVwZGF0ZSBjdXN0b20gPSBuZXcgQ3VzdG9tVXBkYXRlKHRhYmxlKTsKKyAgICAgICAgT2JqZWN0W10gc3RhdGUgPSAoT2JqZWN0W10pIHNtLmdldFZlcnNpb24oKTsKKyAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY3VzdG9tOworCisgICAgICAgIEJpdFNldCBsb2FkZWQgPSBBcnJheVN0YXRlSW1hZ2UuZ2V0TG9hZGVkKHN0YXRlKTsKKyAgICAgICAgT2JqZWN0W10gbmV4dFN0YXRlID0gbnVsbDsKKyAgICAgICAgaWYgKHJlY29yZCkKKyAgICAgICAgICAgIG5leHRTdGF0ZSA9IEFycmF5U3RhdGVJbWFnZS5jbG9uZShzdGF0ZSk7CisKKyAgICAgICAgRmllbGRNYXBwaW5nW10gZmllbGRzID0gKEZpZWxkTWFwcGluZ1tdKSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbWF4ID0gbG9hZGVkLmxlbmd0aCgpOyBpIDwgbWF4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbG9hZGVkLmdldChpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHJlY29yZCAmJiBzbS5nZXREaXJ0eSgpLmdldChpKSAmJiAhc20uZ2V0Rmx1c2hlZCgpLmdldChpKSkKKyAgICAgICAgICAgICAgICBuZXh0U3RhdGVbaV0gPSBzbS5mZXRjaChmaWVsZHNbaV0uZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoZmllbGRzW2ldLmdldFRhYmxlKCkgPT0gdGFibGUpCisgICAgICAgICAgICAgICAgZmllbGRzW2ldLndoZXJlKHNtLCBzdG9yZSwgY3VzdG9tLCBzdGF0ZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY29yZCkKKyAgICAgICAgICAgIHNtLnNldE5leHRWZXJzaW9uKG5leHRTdGF0ZSk7CisKKyAgICAgICAgcmV0dXJuIGN1c3RvbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGZpZWxkcyA9IChGaWVsZE1hcHBpbmdbXSkgc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZHMoKTsKKworICAgICAgICBPYmplY3RbXSBzdGF0ZSA9IChPYmplY3RbXSkgc20uZ2V0VmVyc2lvbigpOworICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0YXRlID0gQXJyYXlTdGF0ZUltYWdlLm5ld0ltYWdlKGZpZWxkcy5sZW5ndGgpOworICAgICAgICBCaXRTZXQgbG9hZGVkID0gQXJyYXlTdGF0ZUltYWdlLmdldExvYWRlZChzdGF0ZSk7CisKKyAgICAgICAgLy8gdGFrZSBhIHNuYXBzaG90IG9mIGFsbCB2ZXJzaW9uYWJsZSBmaWVsZCB2YWx1ZXMgdGhhdCB3ZXJlIGxvYWRlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFmaWVsZHNbaV0uaXNQcmltYXJ5S2V5KCkKKyAgICAgICAgICAgICAgICAmJiBmaWVsZHNbaV0uaXNWZXJzaW9uYWJsZSgpCisgICAgICAgICAgICAgICAgJiYgc20uZ2V0TG9hZGVkKCkuZ2V0KGZpZWxkc1tpXS5nZXRJbmRleCgpKQorICAgICAgICAgICAgICAgICYmICFsb2FkZWQuZ2V0KGkpCisgICAgICAgICAgICAgICAgJiYgIXNtLmdldERpcnR5KCkuZ2V0KGZpZWxkc1tpXS5nZXRJbmRleCgpKSkgeworICAgICAgICAgICAgICAgIGxvYWRlZC5zZXQoaSk7CisgICAgICAgICAgICAgICAgc3RhdGVbaV0gPSBzbS5mZXRjaChmaWVsZHNbaV0uZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc20uc2V0VmVyc2lvbihzdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tWZXJzaW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVWZXJzaW9uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVwZGF0ZVZlcnNpb24pCisgICAgICAgICAgICBzbS5zZXRWZXJzaW9uKG51bGwpOworICAgICAgICByZXR1cm4gIXVwZGF0ZVZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVmVyc2lvbihPYmplY3QgdjEsIE9iamVjdCB2MikgeworICAgICAgICByZXR1cm4gKEFycmF5U3RhdGVJbWFnZS5zYW1lVmVyc2lvbigoT2JqZWN0W10pIHYxLCAoT2JqZWN0W10pIHYyKSkKKyAgICAgICAgICAgID8gU3RvcmVNYW5hZ2VyLlZFUlNJT05fU0FNRSA6IFN0b3JlTWFuYWdlci5WRVJTSU9OX0RJRkZFUkVOVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSb3cgaW1wbGVtZW50YXRpb24gd2UgdXNlIHRvIHBhc3MgdG8gdmVyc2lvbmFibGUgbWFwcGluZ3Mgc28gdGhleQorICAgICAqIGNhbiBzZXQgdXAgdGhlIHdoZXJlIGNvbmRpdGlvbnMgd2UgbmVlZCB0byBhZGQgdG8gdXBkYXRlIHN0YXRlbWVudHMuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tVXBkYXRlCisgICAgICAgIGV4dGVuZHMgUm93SW1wbAorICAgICAgICBpbXBsZW1lbnRzIFJvd01hbmFnZXIgeworCisgICAgICAgIHByaXZhdGUgQ3VzdG9tVXBkYXRlKFRhYmxlIHRhYmxlKSB7CisgICAgICAgICAgICB0aGlzKHRhYmxlLmdldENvbHVtbnMoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1c3RvbVVwZGF0ZShDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgICAgICBzdXBlcihjb2xzLCBSb3cuQUNUSU9OX1VQREFURSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgYm9vbGVhbiBTUUwgZXhwcmVzc2lvbiB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUKKyAgICAgICAgICogV0hFUkUgY2xhdXNlIG9mIGFuIFVQREFURSB0byB0ZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgZGF0YWJhc2UKKyAgICAgICAgICogcmVjb3JkIG1hdGNoZXMgb3VyIHN0b3JlZCB2ZXJzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTUUwoKSB7CisgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0VGFibGUoKS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNXaGVyZSA9IGZhbHNlOworICAgICAgICAgICAgT2JqZWN0IHZhbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbCA9IGdldFdoZXJlKGNvbHNbaV0pOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoaGFzV2hlcmUpCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNvbHNbaV0pLmFwcGVuZCgiIElTIE5VTEwiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29sc1tpXSkuYXBwZW5kKCIgPSA/Iik7CisgICAgICAgICAgICAgICAgaGFzV2hlcmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJvd0ltcGwgbmV3SW5zdGFuY2UoQ29sdW1uW10gY29scywgaW50IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21VcGRhdGUoY29scyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBSb3dNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQXV0b0Fzc2lnbkNvbnN0cmFpbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0SW5zZXJ0cygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VXBkYXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGVsZXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0U2Vjb25kYXJ5VXBkYXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0U2Vjb25kYXJ5RGVsZXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsUm93VXBkYXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsUm93RGVsZXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJvdyBnZXRSb3coVGFibGUgdGFibGUsIGludCBhY3Rpb24sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgICAgICBib29sZWFuIGNyZWF0ZSkgeworICAgICAgICAgICAgLy8gdmVyaW9uYWJsZSBtYXBwaW5ncyB3aWxsIG5ldmVyIHdhbnQgdG8gY3JlYXRlIHJvd3MsIHNvIHdlCisgICAgICAgICAgICAvLyBjYW4gYWx3YXlzIHNhZmVseSByZXR1cm4gbnVsbAorICAgICAgICAgICAgaWYgKHRhYmxlICE9IGdldFRhYmxlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSb3cgZ2V0U2Vjb25kYXJ5Um93KFRhYmxlIHRhYmxlLCBpbnQgYWN0aW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoU2Vjb25kYXJ5Um93KFJvdyByb3cpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSb3cgZ2V0QWxsUm93cyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaEFsbFJvd3MoUm93IHJvdykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KENvbHVtbiBjb2wsIE9iamVjdCB2YWwpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9TdG9yZUNvbGxlY3Rpb25GaWVsZFN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1N0b3JlQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTc2OGZlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9TdG9yZUNvbGxlY3Rpb25GaWVsZFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3RFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DaGFuZ2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHN0cmF0ZWdpZXMgdGhhdCBhcmUgc3RvcmVkIGFzIGEgY29sbGVjdGlvbiwgZXZlbiBpZgorICogdGhlaXIgZmllbGQgdmFsdWUgaXMgc29tZXRoaW5nIGVsc2UuIEhhbmRsZXMgZGF0YSBsb2FkaW5nIGFuZCBiYXNpYyBxdWVyeQorICogZnVuY3Rpb25hbGl0eS4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBhYnN0cmFjdCBtZXRob2RzIGFuZAorICogaW5zZXJ0L3VwZGF0ZS9kZWxldGUgYmVoYXZpb3IgYXMgd2VsbCBhcyBvdmVycmlkaW5nCisgKiB7QGxpbmsgRmllbGRTdHJhdGVneSN0b0RhdGFTdG9yZVZhbHVlfSwge0BsaW5rIEZpZWxkU3RyYXRlZ3kjam9pbn0sIGFuZAorICoge0BsaW5rIEZpZWxkU3RyYXRlZ3kjam9pblJlbGF0aW9ufSBpZiBuZWNlc3NhcnkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3JlQ29sbGVjdGlvbkZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIENvbnRhaW5lckZpZWxkU3RyYXRlZ3kgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSB1c2VkIHRvIGpvaW4gdG8gdGhlIG93bmluZyBmaWVsZCBmb3IgdGhlIGdpdmVuCisgICAgICogZWxlbWVudCBtYXBwaW5nIGZyb20ge0BsaW5rICNnZXRJbmRlcGVuZGVudEVsZW1lbnRNYXBwaW5nc30gKG9yIG51bGwpLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGb3JlaWduS2V5IGdldEpvaW5Gb3JlaWduS2V5KENsYXNzTWFwcGluZyBlbGVtKTsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZWxlY3QgdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgZm9yIHRoZQorICAgICAqIGdpdmVuIGVsZW1lbnQgbWFwcGluZyBmcm9tIHtAbGluayAjZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3N9CisgICAgICogKG9yIG51bGwpLiBFbGVtZW50cyBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgbG9hZGVkIHdpdGgKKyAgICAgKiB7QGxpbmsgI2xvYWRFbGVtZW50fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZWxlY3RFbGVtZW50KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBlbGVtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUsCisgICAgICAgIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIExvYWQgYW4gZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbi4gVGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIgbWlnaHQgYmUKKyAgICAgKiBudWxsIGlmIHRoZSBsb2FkIGlzIGZvciBhIHByb2plY3Rpb24gb3IgZm9yIHByb2Nlc3NpbmcgZWFnZXIgcGFyYWxsZWwKKyAgICAgKiByZXN1bHRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgbG9hZEVsZW1lbnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEpvaW4gdGhpcyB2YWx1ZSdzIHRhYmxlIHRvIHRoZSB0YWJsZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgbWFwcGluZworICAgICAqIGZyb20ge0BsaW5rICNnZXRJbmRlcGVuZGVudEVsZW1lbnRNYXBwaW5nc30gKG9yIG51bGwpLgorICAgICAqCisgICAgICogQHNlZSBGaWVsZE1hcHBpbmcjam9pblJlbGF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEpvaW5zIGpvaW5FbGVtZW50UmVsYXRpb24oSm9pbnMgam9pbnMsCisgICAgICAgIENsYXNzTWFwcGluZyBlbGVtKTsKKworICAgIC8qKgorICAgICAqIEpvaW4gdG8gdGhlIG93bmluZyBmaWVsZCB0YWJsZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgbWFwcGluZyBmcm9tCisgICAgICoge0BsaW5rICNnZXRJbmRlcGVuZGVudEVsZW1lbnRNYXBwaW5nc30gKG9yIG51bGwpLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBKb2lucyBqb2luKEpvaW5zIGpvaW5zLCBDbGFzc01hcHBpbmcgZWxlbSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsYXJnZSByZXN1bHQgc2V0IHByb3h5IGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQcm94eSBuZXdMUlNQcm94eSgpOworCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZmllbGQgdmFsdWUgdG8gYSBjb2xsZWN0aW9uLiBIYW5kbGVzIGNvbGxlY3Rpb25zIGFuZAorICAgICAqIGFycmF5cyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIHRvQ29sbGVjdGlvbihPYmplY3QgdmFsKSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5DT0xMRUNUSU9OKQorICAgICAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uKSB2YWw7CisgICAgICAgIHJldHVybiBKYXZhVHlwZXMudG9MaXN0KHZhbCwgZmllbGQuZ2V0RWxlbWVudCgpLmdldFR5cGUoKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpdGVtIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBmaWVsZCB2YWx1ZS4KKyAgICAgKiBCeSBkZWZhdWx0LCBhc3N1bWVzIHRoZSBzdHJ1Y3R1cmUgaXMgYSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZChKREJDU3RvcmUgc3RvcmUsIE9iamVjdCBjb2xsLCBPYmplY3Qgb2JqKSB7CisgICAgICAgICgoQ29sbGVjdGlvbikgY29sbCkuYWRkKG9iaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXBlbmRlbnQgZWxlbWVudCBtYXBwaW5nLCBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NNYXBwaW5nIGdldERlZmF1bHRFbGVtZW50TWFwcGluZyhib29sZWFuIHRyYXZlcnNlKSB7CisgICAgICAgIENsYXNzTWFwcGluZ1tdIGVsZW1zID0gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3ModHJhdmVyc2UpOworICAgICAgICByZXR1cm4gKGVsZW1zLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBlbGVtc1swXTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN1cHBvcnRzU2VsZWN0KFNlbGVjdCBzZWwsIGludCB0eXBlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgaWYgKGZpZWxkLmlzTFJTKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHR5cGUgPT0gU2VsZWN0LkVBR0VSX1BBUkFMTEVMKQorICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDEsIGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKHRydWUpLmxlbmd0aCk7CisgICAgICAgIGlmICh0eXBlICE9IFNlbGVjdC5FQUdFUl9JTk5FUiAmJiB0eXBlICE9IFNlbGVjdC5FQUdFUl9PVVRFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3ModHJ1ZSkubGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gKHR5cGUgPT0gU2VsZWN0LkVBR0VSX0lOTkVSIHx8IHN0b3JlLmdldERCRGljdGlvbmFyeSgpLgorICAgICAgICAgICAgY2FuT3V0ZXJKb2luKHNlbC5nZXRKb2luU3ludGF4KCksIGdldEpvaW5Gb3JlaWduS2V5CisgICAgICAgICAgICAgICAgKGdldERlZmF1bHRFbGVtZW50TWFwcGluZyhmYWxzZSkpKSkgPyAxIDogMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RFYWdlclBhcmFsbGVsKFNlbGVjdEV4ZWN1dG9yIHNlbCwKKyAgICAgICAgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgZmluYWwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBmaW5hbCBpbnQgZWFnZXJNb2RlKSB7CisgICAgICAgIGlmICghKHNlbCBpbnN0YW5jZW9mIFVuaW9uKSkKKyAgICAgICAgICAgIHNlbGVjdEVhZ2VyKChTZWxlY3QpIHNlbCwgZ2V0RGVmYXVsdEVsZW1lbnRNYXBwaW5nKHRydWUpLCBzbSwKKyAgICAgICAgICAgICAgICBzdG9yZSwgZmV0Y2gsIGVhZ2VyTW9kZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzTWFwcGluZ1tdIGVsZW1zID0gZ2V0SW5kZXBlbmRlbnRFbGVtZW50TWFwcGluZ3ModHJ1ZSk7CisgICAgICAgICAgICBVbmlvbiB1bmlvbiA9IChVbmlvbikgc2VsOworICAgICAgICAgICAgaWYgKGZldGNoLmdldFN1YmNsYXNzRmV0Y2hNb2RlKGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuCisgICAgICAgICAgICAgICAgZ2V0VHlwZU1hcHBpbmcoKSkgIT0gZmV0Y2guRUFHRVJfSk9JTikKKyAgICAgICAgICAgICAgICB1bmlvbi5hYm9ydFVuaW9uKCk7CisgICAgICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Qgc2VsLCBpbnQgaWR4KSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVhZ2VyKHNlbCwgZWxlbXNbaWR4XSwgc20sIHN0b3JlLCBmZXRjaCwgZWFnZXJNb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEVhZ2VySm9pbihTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpIHsKKyAgICAgICAgLy8gd2UgbGltaXQgZnVydGhlciBlYWdlciBmZXRjaGVzIHRvIGpvaW5zLCBiZWNhdXNlIGFmdGVyIHRoaXMgcG9pbnQKKyAgICAgICAgLy8gdGhlIHNlbGVjdCBoYXMgYmVlbiBtb2RpZmllZCBzdWNoIHRoYXQgcGFyYWxsZWwgY2xvbmVzIG1heSBwcm9kdWNlCisgICAgICAgIC8vIGludmFsaWQgc3FsCisgICAgICAgIHNlbGVjdEVhZ2VyKHNlbCwgZ2V0RGVmYXVsdEVsZW1lbnRNYXBwaW5nKHRydWUpLCBzbSwgc3RvcmUsIGZldGNoLCAKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uRUFHRVJfSk9JTiwgZmFsc2UsCisgICAgICAgICAgICBmaWVsZC5nZXROdWxsVmFsdWUoKQorICAgICAgICAgICAgICAgICE9IEZpZWxkTWFwcGluZy5OVUxMX0VYQ0VQVElPTik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFYWdlclNlbGVjdFRvTWFueSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IG91ciBkYXRhIGVhZ2VybHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEVhZ2VyKFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBlbGVtLAorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGludCBlYWdlck1vZGUsIGJvb2xlYW4gc2VsZWN0T2lkLCBib29sZWFuIG91dGVyKSB7CisgICAgICAgIC8vIGZvcmNlIGRpc3RpbmN0IGlmIHRoZXJlIHdhcyBhIHRvLW1hbnkgam9pbiB0byBhdm9pZCBkdXBzLCBidXQKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHBhcmFsbGVsIHNlbGVjdCBkb24ndCBtYWtlIGRpc3RpbmN0IGJhc2VkIG9uIHRoZQorICAgICAgICAvLyBlYWdlciBqb2lucyBhbG9uZSBpZiB0aGUgb3JpZ2luYWwgd2Fzbid0IGRpc3RpbmN0CisgICAgICAgIGlmIChlYWdlck1vZGUgPT0gSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9QQVJBTExFTCkgeworICAgICAgICAgICAgaWYgKHNlbC5oYXNKb2luKHRydWUpKQorICAgICAgICAgICAgICAgIHNlbC5zZXREaXN0aW5jdCh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzZWwuaXNEaXN0aW5jdCgpKQorICAgICAgICAgICAgICAgIHNlbC5zZXREaXN0aW5jdChmYWxzZSk7IC8vIHNldCBleHBsaWNpdGx5IHNvIHJlbWVtYmVyZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBhIHZhcmlhYmxlIG5hbWUgdGhhdCBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFueSBpbiB0aGUgcXVlcnk7CisgICAgICAgIC8vIHVzaW5nIGEgdmFyaWFibGUgZ3VhcmFudGVlcyB0aGF0IHRoZSBzZWxlY3RlZCBkYXRhIHdpbGwgdXNlIGRpZmZlcmVudAorICAgICAgICAvLyBhbGlhc2VzIGFuZCBqb2lucyB0aGFuIGFueSBleGlzdGluZyBXSEVSRSBjb25kaXRpb25zIG9uIHRoaXMgZmllbGQKKyAgICAgICAgLy8gdGhhdCBtaWdodCBvdGhlcndpc2UgbGltaXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBmaWVsZCB0aGF0IG1hdGNoCisgICAgICAgIGlmIChzZWxlY3RPaWQpCisgICAgICAgICAgICBzZWwub3JkZXJCeVByaW1hcnlLZXkoZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCksIHRydWUsIHRydWUpOworICAgICAgICBKb2lucyBqb2lucyA9IHNlbC5uZXdKb2lucygpLnNldFZhcmlhYmxlKCIqIik7CisgICAgICAgIGpvaW5zID0gam9pbihqb2lucywgZWxlbSk7CisKKyAgICAgICAgLy8gb3JkZXIsIHJlZiBjb2xzCisgICAgICAgIGlmIChmaWVsZC5nZXRPcmRlckNvbHVtbigpICE9IG51bGwgfHwgZmllbGQuZ2V0T3JkZXJzKCkubGVuZ3RoID4gMAorICAgICAgICAgICAgfHwgIXNlbGVjdE9pZCkgeworICAgICAgICAgICAgaWYgKG91dGVyKQorICAgICAgICAgICAgICAgIGpvaW5zID0gc2VsLm91dGVyKGpvaW5zKTsKKyAgICAgICAgICAgIGlmICghc2VsZWN0T2lkKSB7CisgICAgICAgICAgICAgICAgQ29sdW1uW10gcmVmcyA9IGdldEpvaW5Gb3JlaWduS2V5KGVsZW0pLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBzZWwub3JkZXJCeShyZWZzLCB0cnVlLCBqb2lucywgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWVsZC5vcmRlckxvY2FsKHNlbCwgZWxlbSwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VsZWN0IGRhdGEKKyAgICAgICAgam9pbnMgPSBqb2luRWxlbWVudFJlbGF0aW9uKGpvaW5zLCBlbGVtKTsKKyAgICAgICAgaWYgKG91dGVyKQorICAgICAgICAgICAgam9pbnMgPSBzZWwub3V0ZXIoam9pbnMpOworICAgICAgICBmaWVsZC5vcmRlclJlbGF0aW9uKHNlbCwgZWxlbSwgam9pbnMpOworICAgICAgICBzZWxlY3RFbGVtZW50KHNlbCwgZWxlbSwgc3RvcmUsIGZldGNoLCBlYWdlck1vZGUsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRFYWdlclBhcmFsbGVsKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHByb2Nlc3MgYmF0Y2hlZCByZXN1bHRzIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeQorICAgICAgICBNYXAgcmVsczsKKyAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFJlc3VsdCkKKyAgICAgICAgICAgIHJlbHMgPSBwcm9jZXNzRWFnZXJQYXJhbGxlbFJlc3VsdChzbSwgc3RvcmUsIGZldGNoLCAoUmVzdWx0KSByZXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWxzID0gKE1hcCkgcmVzOworCisgICAgICAgIC8vIGxvb2sgdXAgdGhlIGNvbGxlY3Rpb24gZm9yIHRoaXMgb2lkLCBhbmQgc3RvcmUgaW4gaW5zdGFuY2UKKyAgICAgICAgT2JqZWN0IGNvbGwgPSByZWxzLnJlbW92ZShzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkFSUkFZKQorICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgSmF2YVR5cGVzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAoKENvbGxlY3Rpb24pIGNvbGwsIGZpZWxkLmdldEVsZW1lbnQoKS5nZXRUeXBlKCkpKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoY29sbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbGwgPSBzbS5uZXdQcm94eShmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0KGZpZWxkLmdldEluZGV4KCksIGNvbGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIGJhdGNoZWQgcmVzdWx0LgorICAgICAqLworICAgIHByaXZhdGUgTWFwIHByb2Nlc3NFYWdlclBhcmFsbGVsUmVzdWx0KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIHNhbWUgam9pbnMgYXMgZm9yIGxvYWQKKyAgICAgICAgLy8jIyMgY2hlYXQ6IHdlIGtub3cgdHlwaWNhbCByZXN1bHQgam9pbnMgb25seSBjYXJlIGFib3V0IHRoZSByZWxhdGlvbgorICAgICAgICAvLyMjIyBwYXRoOyB0aHVzIHdlIGNhbiBpZ25vcmUgZGlmZmVyZW50IG1hcHBpbmdzCisgICAgICAgIENsYXNzTWFwcGluZyBlbGVtID0gZ2V0RGVmYXVsdEVsZW1lbnRNYXBwaW5nKHRydWUpOworICAgICAgICBKb2lucyBkYXRhSm9pbnMgPSByZXMubmV3Sm9pbnMoKS5zZXRWYXJpYWJsZSgiKiIpOworICAgICAgICBkYXRhSm9pbnMgPSBqb2luKGRhdGFKb2lucywgZWxlbSk7CisgICAgICAgIGRhdGFKb2lucyA9IGpvaW5FbGVtZW50UmVsYXRpb24oZGF0YUpvaW5zLCBlbGVtKTsKKyAgICAgICAgSm9pbnMgb3JkZXJKb2lucyA9IG51bGw7CisgICAgICAgIGlmIChmaWVsZC5nZXRPcmRlckNvbHVtbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9yZGVySm9pbnMgPSByZXMubmV3Sm9pbnMoKS5zZXRWYXJpYWJsZSgiKiIpOworICAgICAgICAgICAgb3JkZXJKb2lucyA9IGpvaW4ob3JkZXJKb2lucywgZWxlbSk7CisgICAgICAgIH0KKworICAgICAgICBNYXAgcmVscyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIENsYXNzTWFwcGluZyBvd25lck1hcHBpbmcgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKTsKKyAgICAgICAgT2JqZWN0IG5leHRPaWQsIG9pZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBjb2xsID0gbnVsbDsKKyAgICAgICAgaW50IHNlcSA9IDA7CisgICAgICAgIHdoaWxlIChyZXMubmV4dCgpKSB7CisgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBvd25lciBpZCB2YWx1ZQorICAgICAgICAgICAgbmV4dE9pZCA9IGdldE5leHRPYmplY3RJZChvd25lck1hcHBpbmcsIHN0b3JlLCByZXMsIG9pZCk7CisgICAgICAgICAgICBpZiAobmV4dE9pZCAhPSBvaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb2xkIGNvbGwgd2FzIGFuIG9yZGVyZWQgdHJhY2tpbmcgcHJveHksIHNldAorICAgICAgICAgICAgICAgIC8vIGl0cyBzZXEgdmFsdWUgdG8gdGhlIGxhc3Qgb3JkZXIgdmFsIHdlIHJlYWQKKyAgICAgICAgICAgICAgICBpZiAoc2VxICE9IDAgJiYgY29sbCBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgICAgICAgICAoKFByb3h5KSBjb2xsKS5nZXRDaGFuZ2VUcmFja2VyKCkuc2V0TmV4dFNlcXVlbmNlKHNlcSk7CisKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBhIG5ldyBjb2xsZWN0aW9uCisgICAgICAgICAgICAgICAgb2lkID0gbmV4dE9pZDsKKyAgICAgICAgICAgICAgICBzZXEgPSAwOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5BUlJBWSkKKyAgICAgICAgICAgICAgICAgICAgY29sbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbGwgPSBzbS5uZXdQcm94eShmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICByZWxzLnB1dChvaWQsIGNvbGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0T3JkZXJDb2x1bW4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcSA9IHJlcy5nZXRJbnQoZmllbGQuZ2V0T3JkZXJDb2x1bW4oKSwgb3JkZXJKb2lucykgKyAxOworICAgICAgICAgICAgYWRkKHN0b3JlLCBjb2xsLCBsb2FkRWxlbWVudChudWxsLCBzdG9yZSwgZmV0Y2gsIHJlcywgZGF0YUpvaW5zKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIHJlbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgb2lkIHZhbHVlIGZyb20gdGhlIGdpdmVuIHJlc3VsdC4gSWYgdGhlIG5leHQgb2lkIGlzIHRoZQorICAgICAqIHNhbWUgYXMgdGhlIGdpdmVuIG9uZSwgcmV0dXJucyB0aGUgZ2l2ZW4gSlZNIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldE5leHRPYmplY3RJZChDbGFzc01hcHBpbmcgb3duZXIsIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgUmVzdWx0IHJlcywgT2JqZWN0IG9pZCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBkYXRhc3RvcmUgaWQgY2xhc3Mgd2UgY2FuIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9pZAorICAgICAgICAvLyBvYmplY3QgZm9yIHRoZSBjb21tb24gY2FzZQorICAgICAgICBpZiAob2lkICE9IG51bGwgJiYgb3duZXIuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNYXBwaW5nLklEX0RBVEFTVE9SRQorICAgICAgICAgICAgJiYgb3duZXIuaXNQcmltYXJ5S2V5T2JqZWN0SWQodHJ1ZSkpIHsKKyAgICAgICAgICAgIGxvbmcgbmlkID0gcmVzLmdldExvbmcob3duZXIuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKVswXSk7CisgICAgICAgICAgICBsb25nIGlkID0gKChJZCkgb2lkKS5nZXRJZCgpOworICAgICAgICAgICAgcmV0dXJuIChuaWQgPT0gaWQpID8gb2lkIDogc3RvcmUubmV3RGF0YVN0b3JlSWQobmlkLCBvd25lciwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3Qgbm9pZCA9IG93bmVyLmdldE9iamVjdElkKHN0b3JlLCByZXMsIG51bGwsIHRydWUsIG51bGwpOworICAgICAgICBpZiAobm9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiAobm9pZC5lcXVhbHMob2lkKSkgPyBvaWQgOiBub2lkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRFYWdlckpvaW4oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBmaWVsZCB2YWx1ZQorICAgICAgICBPYmplY3QgY29sbDsKKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkFSUkFZKQorICAgICAgICAgICAgY29sbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29sbCA9IHNtLm5ld1Byb3h5KGZpZWxkLmdldEluZGV4KCkpOworCisgICAgICAgIEpvaW5zIGRhdGFKb2lucyA9IG51bGw7CisgICAgICAgIEpvaW5zIHJlZkpvaW5zID0gcmVzLm5ld0pvaW5zKCkuc2V0VmFyaWFibGUoIioiKTsKKyAgICAgICAgam9pbihyZWZKb2lucywgZmFsc2UpOworCisgICAgICAgIENsYXNzTWFwcGluZyBvd25lck1hcHBpbmcgPSBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKTsKKyAgICAgICAgT2JqZWN0IHJlZiA9IG51bGw7CisgICAgICAgIGludCBzZXEgPSAwOworICAgICAgICBpbnQgdHlwZUlkeCA9IHJlcy5pbmRleE9mKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyB0cnVlOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhlIG93bmVyIGlkIHZhbHVlCisgICAgICAgICAgICByZWYgPSBnZXROZXh0UmVmKG93bmVyTWFwcGluZywgc3RvcmUsIHJlcywgcmVmLCByZWZKb2lucyk7CisgICAgICAgICAgICBpZiAocmVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb2xkIGNvbGwgd2FzIGFuIG9yZGVyZWQgdHJhY2tpbmcgcHJveHksIHNldAorICAgICAgICAgICAgICAgIC8vIGl0cyBzZXEgdmFsdWUgdG8gdGhlIGxhc3Qgb3JkZXIgdmFsIHdlIHJlYWQKKyAgICAgICAgICAgICAgICBpZiAoc2VxICE9IDAgJiYgY29sbCBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgICAgICAgICAoKFByb3h5KSBjb2xsKS5nZXRDaGFuZ2VUcmFja2VyKCkuc2V0TmV4dFNlcXVlbmNlKHNlcSk7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2hCYWNrKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvIHNhbWUgam9pbnMgYXMgZm9yIGxvYWQKKyAgICAgICAgICAgIGlmIChkYXRhSm9pbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRhdGFKb2lucyA9IHJlcy5uZXdKb2lucygpLnNldFZhcmlhYmxlKCIqIik7CisgICAgICAgICAgICAgICAgZGF0YUpvaW5zID0gam9pbihkYXRhSm9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkYXRhSm9pbnMgPSBqb2luUmVsYXRpb24oZGF0YUpvaW5zLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0T3JkZXJDb2x1bW4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcSA9IHJlcy5nZXRJbnQoZmllbGQuZ2V0T3JkZXJDb2x1bW4oKSwgcmVmSm9pbnMpICsgMTsKKyAgICAgICAgICAgIHJlcy5zZXRCYXNlTWFwcGluZyhudWxsKTsKKyAgICAgICAgICAgIGFkZChzdG9yZSwgY29sbCwgbG9hZEVsZW1lbnQoc20sIHN0b3JlLCBmZXRjaCwgcmVzLCBkYXRhSm9pbnMpKTsKKyAgICAgICAgICAgIGlmICghcmVzLm5leHQoKSB8fCByZXMuaW5kZXhPZigpICE9IHR5cGVJZHgpIHsKKyAgICAgICAgICAgICAgICByZXMucHVzaEJhY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvYWQgdGhlIGNvbGxlY3Rpb24gaW50byB0aGUgb2JqZWN0CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5BUlJBWSkKKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0KGZpZWxkLmdldEluZGV4KCksIEphdmFUeXBlcy50b0FycmF5CisgICAgICAgICAgICAgICAgKChDb2xsZWN0aW9uKSBjb2xsLCBmaWVsZC5nZXRFbGVtZW50KCkuZ2V0VHlwZSgpKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0KGZpZWxkLmdldEluZGV4KCksIGNvbGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgdGhlIHJlZmVyZW5jZSBjb2x1bW4gdmFsdWUocykgZnJvbSB0aGUgZ2l2ZW4gcmVzdWx0LiBJZiB0aGUKKyAgICAgKiBleHRyYWN0ZWQgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG9uZSBvciB0aGUgY3VycmVudAorICAgICAqIG9uZSBpcyBudWxsLCByZXR1cm5zIHRoZSBleHRyYWN0ZWQgcmVzdWx0LiBFbHNlIHJldHVybnMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBnZXROZXh0UmVmKENsYXNzTWFwcGluZyBtYXBwaW5nLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIFJlc3VsdCByZXMsIE9iamVjdCByZWYsIEpvaW5zIHJlZkpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGdldEpvaW5Gb3JlaWduS2V5KGdldERlZmF1bHRFbGVtZW50TWFwcGluZyhmYWxzZSkpLgorICAgICAgICAgICAgZ2V0Q29sdW1ucygpOworICAgICAgICBPYmplY3QgdmFsOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgdmFsID0gcmVzLmdldE9iamVjdChjb2xzWzBdLCBudWxsLCByZWZKb2lucyk7CisgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgKHJlZiAhPSBudWxsICYmICF2YWwuZXF1YWxzKHJlZikpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIHJlZnMgPSAoT2JqZWN0W10pIHJlZjsKKyAgICAgICAgaWYgKHJlZnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJlZnMgPSBuZXcgT2JqZWN0W2NvbHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YWwgPSByZXMuZ2V0T2JqZWN0KGNvbHNbaV0sIG51bGwsIHJlZkpvaW5zKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZWZzW2ldICE9IG51bGwgJiYgIXZhbC5lcXVhbHMocmVmc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZWZzW2ldID0gdmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWZzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgZmluYWwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBmaW5hbCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpZWxkLmlzTFJTKCkpIHsKKyAgICAgICAgICAgIFByb3h5IGNvbGwgPSBuZXdMUlNQcm94eSgpOworCisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIG9yZGVyZWQgd2UgbmVlZCB0byBrbm93IHRoZSBuZXh0IHNlcSB0byB1c2UgaW4gY2FzZQorICAgICAgICAgICAgLy8gb2JqZWN0cyBhcmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRPcmRlckNvbHVtbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBhbGxvdyBvcmRlcmluZyB0YWJsZSBwZXIgY2xhc3Mgb25lLW1hbnkncywgc28KKyAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHdlIGRvbid0IG5lZWQgYSB1bmlvbgorICAgICAgICAgICAgICAgIFNlbGVjdCBzZWwgPSBzdG9yZS5nZXRTUUxGYWN0b3J5KCkubmV3U2VsZWN0KCk7CisgICAgICAgICAgICAgICAgc2VsLnNldEFnZ3JlZ2F0ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc3FsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIk1BWCgiKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhmaWVsZC5nZXRPcmRlckNvbHVtbigpKSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiKSIpOworICAgICAgICAgICAgICAgIHNlbC5zZWxlY3Qoc3FsLnRvU3RyaW5nKCksIGZpZWxkKTsKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmcgcmVsID0gZ2V0RGVmYXVsdEVsZW1lbnRNYXBwaW5nKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZWwud2hlcmVGb3JlaWduS2V5KGdldEpvaW5Gb3JlaWduS2V5KHJlbCksCisgICAgICAgICAgICAgICAgICAgIHNtLmdldE9iamVjdElkKCksIGZpZWxkLmdldERlZmluaW5nTWFwcGluZygpLCBzdG9yZSk7CisKKyAgICAgICAgICAgICAgICBSZXN1bHQgcmVzID0gc2VsLmV4ZWN1dGUoc3RvcmUsIGZldGNoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBjb2xsLmdldENoYW5nZVRyYWNrZXIoKS5zZXROZXh0U2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZXMuZ2V0SW50KGZpZWxkKSArIDEpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0RmllbGQoZmllbGQuZ2V0SW5kZXgoKSwgY29sbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBzZWxlY3QgZGF0YSBmb3IgdGhpcyBzbQorICAgICAgICBmaW5hbCBDbGFzc01hcHBpbmdbXSBlbGVtcyA9IGdldEluZGVwZW5kZW50RWxlbWVudE1hcHBpbmdzKHRydWUpOworICAgICAgICBmaW5hbCBKb2luc1tdIHJlc0pvaW5zID0gbmV3IEpvaW5zW01hdGgubWF4KDEsIGVsZW1zLmxlbmd0aCldOworICAgICAgICBVbmlvbiB1bmlvbiA9IHN0b3JlLmdldFNRTEZhY3RvcnkoKS5uZXdVbmlvbgorICAgICAgICAgICAgKE1hdGgubWF4KDEsIGVsZW1zLmxlbmd0aCkpOworICAgICAgICB1bmlvbi5zZWxlY3QobmV3IFVuaW9uLlNlbGVjdG9yKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpZHgpIHsKKyAgICAgICAgICAgICAgICBDbGFzc01hcHBpbmcgZWxlbSA9IChlbGVtcy5sZW5ndGggPT0gMCkgPyBudWxsIDogZWxlbXNbaWR4XTsKKyAgICAgICAgICAgICAgICByZXNKb2luc1tpZHhdID0gc2VsZWN0QWxsKHNlbCwgZWxlbSwgc20sIHN0b3JlLCBmZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbi5FQUdFUl9QQVJBTExFTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIGNyZWF0ZSBwcm94eQorICAgICAgICBPYmplY3QgY29sbDsKKyAgICAgICAgQ2hhbmdlVHJhY2tlciBjdCA9IG51bGw7CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5BUlJBWSkKKyAgICAgICAgICAgIGNvbGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29sbCA9IHNtLm5ld1Byb3h5KGZpZWxkLmdldEluZGV4KCkpOworICAgICAgICAgICAgaWYgKGNvbGwgaW5zdGFuY2VvZiBQcm94eSkKKyAgICAgICAgICAgICAgICBjdCA9ICgoUHJveHkpIGNvbGwpLmdldENoYW5nZVRyYWNrZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvYWQgdmFsdWVzCisgICAgICAgIFJlc3VsdCByZXMgPSB1bmlvbi5leGVjdXRlKHN0b3JlLCBmZXRjaCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgc2VxID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChyZXMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwgJiYgZmllbGQuZ2V0T3JkZXJDb2x1bW4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXEgPSByZXMuZ2V0SW50KGZpZWxkLmdldE9yZGVyQ29sdW1uKCkpOworICAgICAgICAgICAgICAgIGFkZChzdG9yZSwgY29sbCwgbG9hZEVsZW1lbnQoc20sIHN0b3JlLCBmZXRjaCwgcmVzLAorICAgICAgICAgICAgICAgICAgICByZXNKb2luc1tyZXMuaW5kZXhPZigpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwgJiYgZmllbGQuZ2V0T3JkZXJDb2x1bW4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGN0LnNldE5leHRTZXF1ZW5jZShzZXEgKyAxKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGludG8gc20KKyAgICAgICAgaWYgKGZpZWxkLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkFSUkFZKQorICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgSmF2YVR5cGVzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAoKENvbGxlY3Rpb24pIGNvbGwsIGZpZWxkLmdldEVsZW1lbnQoKS5nZXRUeXBlKCkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc20uc3RvcmVPYmplY3QoZmllbGQuZ2V0SW5kZXgoKSwgY29sbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IGRhdGEgZm9yIGxvYWRpbmcsIHN0YXJ0aW5nIGluIGZpZWxkIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBKb2lucyBzZWxlY3RBbGwoU2VsZWN0IHNlbCwgQ2xhc3NNYXBwaW5nIGVsZW0sCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgaW50IGVhZ2VyTW9kZSkgeworICAgICAgICBzZWwud2hlcmVGb3JlaWduS2V5KGdldEpvaW5Gb3JlaWduS2V5KGVsZW0pLCBzbS5nZXRPYmplY3RJZCgpLAorICAgICAgICAgICAgZmllbGQuZ2V0RGVmaW5pbmdNYXBwaW5nKCksIHN0b3JlKTsKKworICAgICAgICAvLyBvcmRlciBmaXJzdCwgdGhlbiBzZWxlY3Qgc28gdGhhdCBpZiB0aGUgcHJvamVjdGlvbiBpbnRyb2R1Y2VzCisgICAgICAgIC8vIGFkZGl0aW9uYWwgb3JkZXJpbmcsIGl0IHdpbGwgYmUgYWZ0ZXIgb3VyIHJlcXVpcmVkIG9yZGVyaW5nCisgICAgICAgIGZpZWxkLm9yZGVyTG9jYWwoc2VsLCBlbGVtLCBudWxsKTsKKyAgICAgICAgSm9pbnMgam9pbnMgPSBqb2luRWxlbWVudFJlbGF0aW9uKHNlbC5uZXdKb2lucygpLCBlbGVtKTsKKyAgICAgICAgZmllbGQub3JkZXJSZWxhdGlvbihzZWwsIGVsZW0sIGpvaW5zKTsKKyAgICAgICAgc2VsZWN0RWxlbWVudChzZWwsIGVsZW0sIHN0b3JlLCBmZXRjaCwgZWFnZXJNb2RlLCBqb2lucyk7CisgICAgICAgIHJldHVybiBqb2luczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGxvYWRQcm9qZWN0aW9uKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUmVzdWx0IHJlcywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZEVsZW1lbnQobnVsbCwgc3RvcmUsIGZldGNoLCByZXMsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRm9yZWlnbktleSBnZXRKb2luRm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEpvaW5Gb3JlaWduS2V5KGdldERlZmF1bHRFbGVtZW50TWFwcGluZyhmYWxzZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvU3RyaW5nRmllbGRTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9TdHJpbmdGaWVsZFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZjcwOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvU3RyaW5nRmllbGRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5Kb2luYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlByaW1hcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlU3RyYXRlZ2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBEaXJlY3QgbWFwcGluZyBmcm9tIGEgc3RyaW5nIHZhbHVlIHRvIGEgY29sdW1uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0ZpZWxkU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0RmllbGRTdHJhdGVneQorICAgIGltcGxlbWVudHMgSm9pbmFibGUsIEVtYmVkZGFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU3RyaW5nRmllbGRTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuU1RSSU5HKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3Qtc3RyaW5nIiwgZmllbGQpKTsKKyAgICAgICAgYXNzZXJ0Tm90TWFwcGVkQnkoKTsKKworICAgICAgICAvLyBtYXAgam9pbiBrZXksIGlmIGFueQorICAgICAgICBmaWVsZC5tYXBKb2luKGFkYXB0LCBmYWxzZSk7CisgICAgICAgIGZpZWxkLmdldEtleU1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMKKyAgICAgICAgICAgIChmaWVsZC5nZXRLZXkoKSwgIWFkYXB0KTsKKyAgICAgICAgZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5hc3NlcnROb1NjaGVtYUNvbXBvbmVudHMKKyAgICAgICAgICAgIChmaWVsZC5nZXRFbGVtZW50KCksICFhZGFwdCk7CisKKyAgICAgICAgVmFsdWVNYXBwaW5nSW5mbyB2aW5mbyA9IGZpZWxkLmdldFZhbHVlSW5mbygpOworICAgICAgICB2aW5mby5hc3NlcnROb0pvaW4oZmllbGQsIHRydWUpOworICAgICAgICB2aW5mby5hc3NlcnROb0ZvcmVpZ25LZXkoZmllbGQsICFhZGFwdCk7CisKKyAgICAgICAgLy8gZ2V0IHZhbHVlIGNvbHVtbnMKKyAgICAgICAgQ29sdW1uIHRtcENvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgdG1wQ29sLnNldE5hbWUoZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgdG1wQ29sLnNldEphdmFUeXBlKGZpZWxkLmdldFR5cGVDb2RlKCkpOworCisgICAgICAgIENvbHVtbltdIGNvbHMgPSB2aW5mby5nZXRDb2x1bW5zKGZpZWxkLCBmaWVsZC5nZXROYW1lKCksCisgICAgICAgICAgICBuZXcgQ29sdW1uW117IHRtcENvbCB9LCBmaWVsZC5nZXRUYWJsZSgpLCBhZGFwdCk7CisgICAgICAgIGlmIChmaWVsZC5nZXRWYWx1ZVN0cmF0ZWd5KCkgPT0gVmFsdWVTdHJhdGVnaWVzLkFVVE9BU1NJR04pCisgICAgICAgICAgICBjb2xzWzBdLnNldEF1dG9Bc3NpZ25lZCh0cnVlKTsKKworICAgICAgICBmaWVsZC5zZXRDb2x1bW5zKGNvbHMpOworICAgICAgICBmaWVsZC5zZXRDb2x1bW5JTyh2aW5mby5nZXRDb2x1bW5JTygpKTsKKyAgICAgICAgZmllbGQubWFwQ29uc3RyYWludHMoZmllbGQuZ2V0TmFtZSgpLCBhZGFwdCk7CisKKyAgICAgICAgLy8gYWRkIHByaW1hcnkga2V5IGNvbHVtbnMgdG8gdGFibGUgcGsgaWYgbG9naWNhbAorICAgICAgICBmaWVsZC5tYXBQcmltYXJ5S2V5KGFkYXB0KTsKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IGZpZWxkLmdldFRhYmxlKCkuZ2V0UHJpbWFyeUtleSgpOworICAgICAgICBpZiAoZmllbGQuaXNQcmltYXJ5S2V5KCkgJiYgcGsgIT0gbnVsbCAmJiAoYWRhcHQgfHwgcGsuaXNMb2dpY2FsKCkpKQorICAgICAgICAgICAgcGsuYWRkQ29sdW1uKGNvbHNbMF0pOworCisgICAgICAgIC8vIHNldCBqb2luYWJsZQorICAgICAgICBmaWVsZC5nZXREZWZpbmluZ01hcHBpbmcoKS5zZXRKb2luYWJsZShmaWVsZC5nZXRDb2x1bW5zKClbMF0sIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZykgdG9EYXRhU3RvcmVWYWx1ZShzbS5mZXRjaFN0cmluZworICAgICAgICAgICAgKGZpZWxkLmdldEluZGV4KCkpLCBzdG9yZSk7CisgICAgICAgIGlmIChmaWVsZC5nZXRDb2x1bW5JTygpLmlzSW5zZXJ0YWJsZSgwLCBzdHIgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIFJvdyByb3cgPSBmaWVsZC5nZXRSb3coc20sIHN0b3JlLCBybSwgUm93LkFDVElPTl9JTlNFUlQpOworICAgICAgICAgICAgaWYgKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJvdy5zZXRTdHJpbmcoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBzdHIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKSB0b0RhdGFTdG9yZVZhbHVlKHNtLmZldGNoU3RyaW5nCisgICAgICAgICAgICAoZmllbGQuZ2V0SW5kZXgoKSksIHN0b3JlKTsKKyAgICAgICAgaWYgKGZpZWxkLmdldENvbHVtbklPKCkuaXNVcGRhdGFibGUoMCwgc3RyID09IG51bGwpKSB7CisgICAgICAgICAgICBSb3cgcm93ID0gZmllbGQuZ2V0Um93KHNtLCBzdG9yZSwgcm0sIFJvdy5BQ1RJT05fVVBEQVRFKTsKKyAgICAgICAgICAgIGlmIChyb3cgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByb3cuc2V0U3RyaW5nKGZpZWxkLmdldENvbHVtbnMoKVswXSwgc3RyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIFJvd01hbmFnZXIgcm0pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBmaWVsZC5kZWxldGVSb3coc20sIHN0b3JlLCBybSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0RhdGFTdG9yZVZhbHVlKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdmFsOworCisgICAgICAgIGlmIChmaWVsZC5nZXROdWxsVmFsdWUoKSAhPSBGaWVsZE1hcHBpbmcuTlVMTF9ERUZBVUxUKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChmaWVsZC5nZXRDb2x1bW5zKClbMF0uZ2V0RGVmYXVsdFN0cmluZygpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgLy8gaG9ub3IgdGhlIHVzZXIncyBudWxsLXZhbHVlPWRlZmF1bHQKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc3VwcG9ydHNTZWxlY3QoU2VsZWN0IHNlbCwgaW50IHR5cGUsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAodHlwZSA9PSBTZWxlY3QuVFlQRV9KT0lOTEVTUyAmJiBzZWwuaXNTZWxlY3RlZChmaWVsZC5nZXRUYWJsZSgpKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNlbGVjdChTZWxlY3Qgc2VsLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlck1vZGUpIHsKKyAgICAgICAgc2VsLnNlbGVjdChmaWVsZC5nZXRDb2x1bW5zKClbMF0sIGZpZWxkLmpvaW4oc2VsKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGZpZWxkLmdldENvbHVtbnMoKVswXTsKKyAgICAgICAgaWYgKHJlcy5jb250YWlucyhjb2wpKQorICAgICAgICAgICAgc20uc3RvcmVTdHJpbmcoZmllbGQuZ2V0SW5kZXgoKSwgcmVzLmdldFN0cmluZyhjb2wpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRJc051bGwoU1FMQnVmZmVyIHNxbCwgU2VsZWN0IHNlbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgam9pbnMgPSBqb2luKGpvaW5zLCBmYWxzZSk7CisgICAgICAgIHNxbC5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGZpZWxkLmdldENvbHVtbnMoKVswXSwgam9pbnMpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiIElTICIpLmFwcGVuZFZhbHVlKG51bGwsIGZpZWxkLmdldENvbHVtbnMoKVswXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSXNOb3ROdWxsKFNRTEJ1ZmZlciBzcWwsIFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGpvaW5zID0gam9pbihqb2lucywgZmFsc2UpOworICAgICAgICBzcWwuYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhmaWVsZC5nZXRDb2x1bW5zKClbMF0sIGpvaW5zKSkuCisgICAgICAgICAgICBhcHBlbmQoIiBJUyBOT1QgIikuYXBwZW5kVmFsdWUobnVsbCwgZmllbGQuZ2V0Q29sdW1ucygpWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pbihKb2lucyBqb2lucywgYm9vbGVhbiBmb3JjZU91dGVyKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5qb2luKGpvaW5zLCBmb3JjZU91dGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkUHJvamVjdGlvbihKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIFJlc3VsdCByZXMsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlcy5nZXRTdHJpbmcoZmllbGQuZ2V0Q29sdW1ucygpWzBdLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtLAorICAgICAgICBPYmplY3QgcHJldlZhbHVlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IGZpZWxkLmdldFJvdyhzbSwgc3RvcmUsIHJtLCBSb3cuQUNUSU9OX1VQREFURSk7CisgICAgICAgIGlmIChyb3cgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDb2x1bW4gY29sID0gZmllbGQuZ2V0Q29sdW1ucygpWzBdOworICAgICAgICBpZiAocHJldlZhbHVlID09IG51bGwpCisgICAgICAgICAgICByb3cud2hlcmVOdWxsKGNvbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJvdy53aGVyZVN0cmluZyhjb2wsIHByZXZWYWx1ZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBKb2luYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIGludCBnZXRGaWVsZEluZGV4KCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByaW1hcnlLZXlWYWx1ZShSZXN1bHQgcmVzLCBDb2x1bW5bXSBjb2xzLCBGb3JlaWduS2V5IGZrLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IGNvbHNbMF07CisgICAgICAgIGlmIChmayAhPSBudWxsKQorICAgICAgICAgICAgY29sID0gZmsuZ2V0Q29sdW1uKGNvbCk7CisgICAgICAgIHJldHVybiByZXMuZ2V0U3RyaW5nKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0Q29sdW1ucygpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Sm9pblZhbHVlKE9iamVjdCBmaWVsZFZhbCwgQ29sdW1uIGNvbCwgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHJldHVybiBmaWVsZFZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEpvaW5WYWx1ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBDb2x1bW4gY29sLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIHNtLmZldGNoKGZpZWxkLmdldEluZGV4KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9Bc3NpZ25lZFZhbHVlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgQ29sdW1uIGNvbCwgT2JqZWN0IGF1dG9JbmMpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IChhdXRvSW5jID09IG51bGwpID8gbnVsbCA6IGF1dG9JbmMudG9TdHJpbmcoKTsKKyAgICAgICAgc20uc3RvcmVTdHJpbmcoZmllbGQuZ2V0SW5kZXgoKSwgc3RyKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEVtYmVkZGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIENvbHVtbklPIGdldENvbHVtbklPKCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0Q29sdW1uSU8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UmVzdWx0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvRW1iZWRkZWREYXRhU3RvcmVWYWx1ZShPYmplY3QgdmFsLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIHRvRGF0YVN0b3JlVmFsdWUodmFsLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB0b0VtYmVkZGVkT2JqZWN0VmFsdWUoT2JqZWN0IHZhbCkgeworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRFbWJlZGRlZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzbS5zdG9yZVN0cmluZyhmaWVsZC5nZXRJbmRleCgpLCAoU3RyaW5nKSB2YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvU3ViY2xhc3NKb2luRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1N1YmNsYXNzSm9pbkRpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTAzMWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1N1YmNsYXNzSm9pbkRpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRpc2NyaW1pbmF0b3JNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5TeW50YXhlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBEaXNjcmltaW5hdG9yIHN0cmF0ZWd5IHRoYXQgb3V0ZXIgam9pbnMgdG8gYWxsIHBvc3NpYmxlIHN1YmNsYXNzIHRhYmxlcworICogdG8gZGV0ZXJtaW5lIHRoZSBjbGFzcyBvZiBhbiBpbnN0YW5jZS4gVGhpcyBpbmRpY2F0b3IgdHlwZSBzaG91bGQgb25seQorICogYmUgdXNlZCB3aXRoIHZlcnRpY2FsIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJjbGFzc0pvaW5EaXNjcmltaW5hdG9yU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0RGlzY3JpbWluYXRvclN0cmF0ZWd5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTID0gInN1YmNsYXNzLWpvaW4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU3ViY2xhc3NKb2luRGlzY3JpbWluYXRvclN0cmF0ZWd5LmNsYXNzKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBBTElBUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gZGlzYy5nZXRDbGFzc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsCisgICAgICAgICAgICB8fCBjbHMuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtYmFzZS1kaXNjIiwgY2xzKSk7CisKKyAgICAgICAgRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvIGluZm8gPSBkaXNjLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIGluZm8uYXNzZXJ0Tm9TY2hlbWFDb21wb25lbnRzKGRpc2MsIHRydWUpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSBvdXRlciBqb2lucyBhcmUgc3VwcG9ydGVkCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gY2xzLmdldE1hcHBpbmdSZXBvc2l0b3J5KCkuZ2V0REJEaWN0aW9uYXJ5KCk7CisgICAgICAgIGlmIChkaWN0LmpvaW5TeW50YXggPT0gSm9pblN5bnRheGVzLlNZTlRBWF9UUkFESVRJT05BTCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgib3V0ZXItam9pbi1zdXBwb3J0IiwgY2xzKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNlbGVjdCBzZWwsIENsYXNzTWFwcGluZyBtYXBwaW5nKSB7CisgICAgICAgIGlmIChpc0ZpbmFsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBzZWxlY3Qgb3VyIGZpcnN0IHBrIGNvbCBzbyB0aGF0IHdlIGRldGVjdCBpdCBhcworICAgICAgICAvLyBub24tbnVsbCBpbiBnZXRDbGFzczsgaWYgd2UgaGF2ZSBubyBzdXBlcmNsYXNzIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8gZG8gdGhpcyBiZWNhdXNlIHRoZSBiYXNlIGNsYXNzIGFsd2F5cyBzZWxlY3RzIGl0cyBwa3MgYW55d2F5CisgICAgICAgIGJvb2xlYW4gc2VsZCA9IGZhbHNlOworICAgICAgICBpZiAobWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLmxlbmd0aCA+IDAKKyAgICAgICAgICAgICYmIG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsLnNlbGVjdChtYXBwaW5nLmdldFByaW1hcnlLZXlDb2x1bW5zKClbMF0pOworICAgICAgICAgICAgc2VsZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc01hcHBpbmdbXSBzdWJzID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3ViY2xhc3NNYXBwaW5ncygpOworICAgICAgICBpZiAoc3Vicy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBzZWxkOworCisgICAgICAgIC8vIG91dGVyIGpvaW4gdG8gZWFjaCBzdWJjbGFzcyBhbmQgc2VsZWN0IGl0cyBmaXJzdCBwayBjb2w7CisgICAgICAgIC8vIHRoZSBzdWJjbGFzcyBhcnJheSBpcyBhbHJlYWR5IG9yZGVyZWQgaW4gbGV2ZWxzIG9mIGluaGVyaXRhbmNlLCBzbworICAgICAgICAvLyBlYWNoIHN1YmNsYXNzIG9ubHkgaGFzIHRvIGpvaW4gZnJvbSBpdHMgZGlyZWN0IHN1cGVyY2xhc3MKKyAgICAgICAgQ29sdW1uW10gcGtzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdWJzW2ldLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHBrcyA9IHN1YnNbaV0uZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgICAgIGlmIChwa3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHNlbC5zZWxlY3QocGtzWzBdLCBzdWJzW2ldLmpvaW5TdXBlcmNsYXNzCisgICAgICAgICAgICAgICAgICAgIChzZWwubmV3Sm9pbnMoKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIHNlbGQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzZWxkOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRDbGFzcyhKREJDU3RvcmUgc3RvcmUsIENsYXNzTWFwcGluZyBiYXNlLCBSZXN1bHQgcmVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRmluYWwpCisgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXREZXNjcmliZWRUeXBlKCk7CisKKyAgICAgICAgLy8gZmluZCB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzIHdpdGggYSBub24tbnVsbCBwayBjb2wgaW4gdGhlIHJlc3VsdC4KKyAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvbid0IHBlcmZvcm0gYW55IGpvaW5zIGhlcmUsIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlCisgICAgICAgIC8vIGZhY3QgdGhhdCByZXN1bHQgam9pbnMgYXJlIHVubmVjZXNzYXJ5IHdoZW4gdGhlcmUgaXMgbm8gcmVsYXRpb24KKyAgICAgICAgLy8gaW52b2x2ZWQ7IHdlJ3JlIGNoZWF0aW5nIGEgbGl0dGxlCisgICAgICAgIENsYXNzTWFwcGluZ1tdIHN1YnMgPSBiYXNlLmdldEpvaW5hYmxlUENTdWJjbGFzc01hcHBpbmdzKCk7CisgICAgICAgIENsYXNzIGRlcml2ZWQgPSBiYXNlLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICAgICAgQ29sdW1uW10gcGtzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHBrcyA9IHN1YnNbaV0uZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgICAgIGlmIChwa3MubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIHBvc3NpYmxlIHRoYXQgYSBzaWJsaW5nIGNsYXNzIGNvbHMgd2VyZSBhbHJlYWR5IGRpc2NvdmVyZWQsIGluCisgICAgICAgICAgICAvLyB3aGljaCBjYXNlIHdlIGNhbiBza2lwIHRoaXMgc3ViCisgICAgICAgICAgICBpZiAoIWRlcml2ZWQuaXNBc3NpZ25hYmxlRnJvbShzdWJzW2ldLmdldERlc2NyaWJlZFR5cGUoKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIHNlZSBpZiBhbGwgcGsgY29scyBhcmUgbm9uLW51bGwKKyAgICAgICAgICAgIGlmIChyZXMuY29udGFpbnMocGtzWzBdKQorICAgICAgICAgICAgICAgICYmIHJlcy5nZXRPYmplY3QocGtzWzBdLCAtMSwgbnVsbCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZXJpdmVkID0gc3Vic1tpXS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlcml2ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NDb25kaXRpb25zKENsYXNzTWFwcGluZyBiYXNlLCBib29sZWFuIHN1YmNsYXNzZXMpIHsKKyAgICAgICAgaWYgKGlzRmluYWwgfHwgc3ViY2xhc3NlcykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nW10gc3VicyA9IGJhc2UuZ2V0Sm9pbmFibGVQQ1N1YmNsYXNzTWFwcGluZ3MoKTsKKyAgICAgICAgaWYgKHN1YnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0Q2xhc3NDb25kaXRpb25zKFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zLCAKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGJhc2UsIGJvb2xlYW4gc3ViY2xhc3NlcykgeworICAgICAgICAvLyBhZGQgY29uZGl0aW9ucyBtYWtpbmcgc3VyZSBubyBzdWJjbGFzcyB0YWJsZXMgaGF2ZSByZWNvcmRzIGZvcgorICAgICAgICAvLyB0aGlzIGluc3RhbmNlCisgICAgICAgIENsYXNzTWFwcGluZ1tdIHN1YnMgPSBiYXNlLmdldEpvaW5hYmxlUENTdWJjbGFzc01hcHBpbmdzKCk7CisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBudWxsOworICAgICAgICBDb2x1bW5bXSBwa3M7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcGtzID0gc3Vic1tpXS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICAgICAgaWYgKHBrcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBiYXNlIGNsYXNzIGlzIGFsaWFzZWQgZmlyc3Qgc28gdGhhdCB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIGVuZCB1cCB3aXRoIG91ciBvdXRlciBqb2lucyBiZWZvcmUgdGhlIGlubmVyIG9uZXMKKyAgICAgICAgICAgICAgICBidWYgPSBuZXcgU1FMQnVmZmVyKHNlbC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICAgICAgICAgIGdldERCRGljdGlvbmFyeUluc3RhbmNlKCkpOworICAgICAgICAgICAgICAgIHNlbC5nZXRDb2x1bW5BbGlhcyhiYXNlLmdldFByaW1hcnlLZXlDb2x1bW5zKClbMF0sIGpvaW5zKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKHNlbC5nZXRDb2x1bW5BbGlhcyhwa3NbMF0sIGpvaW5zKSkuYXBwZW5kKCIgSVMgTlVMTCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9TdXBlcmNsYXNzRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1N1cGVyY2xhc3NEaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBkMzdkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9TdXBlcmNsYXNzRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU2VsZWN0OworCisvKioKKyAqIERpc2NyaW1pbmF0b3Igc3RyYXRlZ3kgdGhhdCBkZWxlZ2F0ZXMgdG8gc3VwZXJjbGFzcyBkaXNjcmltaW5hdG9yLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTdXBlcmNsYXNzRGlzY3JpbWluYXRvclN0cmF0ZWd5CisgICAgZXh0ZW5kcyBBYnN0cmFjdERpc2NyaW1pbmF0b3JTdHJhdGVneSB7CisKKyAgICBwdWJsaWMgdm9pZCBtYXAoYm9vbGVhbiBhZGFwdCkgeworICAgICAgICAvLyBpZiBhIHN1cGVyY2xhc3MgbWFwcyB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSwgc28gc2hvdWxkIHdlLgorICAgICAgICAvLyBvdGhlcndpc2UgYXNzdW1lIGl0J3MgY2FsY3VsYXRlZAorICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gZGlzYy5nZXRDbGFzc01hcHBpbmcoKS4KKyAgICAgICAgICAgIGdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBmb3IgKDsgc3VwICE9IG51bGw7IHN1cCA9IHN1cC5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSkgeworICAgICAgICAgICAgaWYgKHN1cC5nZXREaXNjcmltaW5hdG9yKCkuZ2V0VmFsdWUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgc3VwLmdldERpc2NyaW1pbmF0b3IoKS5nZXRTdHJhdGVneSgpIGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICBWYWx1ZU1hcERpc2NyaW1pbmF0b3JTdHJhdGVneSkgeworICAgICAgICAgICAgICAgIGRpc2Muc2V0VmFsdWUoZGlzYy5nZXRNYXBwaW5nSW5mbygpLmdldFZhbHVlKGRpc2MsIGFkYXB0KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU3ViY2xhc3NlcyhKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBkaXNjLmdldENsYXNzTWFwcGluZygpLmdldFBDU3VwZXJjbGFzc01hcHBpbmcoKS4KKyAgICAgICAgICAgIGdldERpc2NyaW1pbmF0b3IoKS5sb2FkU3ViY2xhc3NlcyhzdG9yZSk7CisgICAgICAgIGRpc2Muc2V0U3ViY2xhc3Nlc0xvYWRlZCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0Q2xhc3MoSkRCQ1N0b3JlIHN0b3JlLCBDbGFzc01hcHBpbmcgYmFzZSwgUmVzdWx0IHJlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXNjLmdldENsYXNzTWFwcGluZygpLmdldFBDU3VwZXJjbGFzc01hcHBpbmcoKS4KKyAgICAgICAgICAgIGdldERpc2NyaW1pbmF0b3IoKS5nZXRDbGFzcyhzdG9yZSwgYmFzZSwgcmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc0NvbmRpdGlvbnMoQ2xhc3NNYXBwaW5nIGJhc2UsIGJvb2xlYW4gc3ViY2xhc3NlcykgeworICAgICAgICByZXR1cm4gZGlzYy5nZXRDbGFzc01hcHBpbmcoKS5nZXRQQ1N1cGVyY2xhc3NNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXREaXNjcmltaW5hdG9yKCkuaGFzQ2xhc3NDb25kaXRpb25zKGJhc2UsIHN1YmNsYXNzZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0Q2xhc3NDb25kaXRpb25zKFNlbGVjdCBzZWwsIEpvaW5zIGpvaW5zLCAKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGJhc2UsIGJvb2xlYW4gc3ViY2xhc3NlcykgeworICAgICAgICByZXR1cm4gZGlzYy5nZXRDbGFzc01hcHBpbmcoKS5nZXRQQ1N1cGVyY2xhc3NNYXBwaW5nKCkuCisgICAgICAgICAgICBnZXREaXNjcmltaW5hdG9yKCkuZ2V0Q2xhc3NDb25kaXRpb25zKHNlbCwgam9pbnMsIGJhc2UsIHN1YmNsYXNzZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvU3VwZXJjbGFzc1ZlcnNpb25TdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9TdXBlcmNsYXNzVmVyc2lvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4MDI1YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvU3VwZXJjbGFzc1ZlcnNpb25TdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBWZXJzaW9uIHN0cmF0ZWd5IHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBzdWVycGNsYXNzIHZlcnNpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFN1cGVyY2xhc3NWZXJzaW9uU3RyYXRlZ3kKKyAgICBleHRlbmRzIEFic3RyYWN0VmVyc2lvblN0cmF0ZWd5IHsKKworICAgIHB1YmxpYyB2b2lkIGFmdGVyTG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgdmVycy5nZXRDbGFzc01hcHBpbmcoKS5nZXRQQ1N1cGVyY2xhc3NNYXBwaW5nKCkuZ2V0VmVyc2lvbigpLgorICAgICAgICAgICAgYWZ0ZXJMb2FkKHNtLCBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tWZXJzaW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVWZXJzaW9uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHZlcnMuZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpLmdldFZlcnNpb24oKS4KKyAgICAgICAgICAgIGNoZWNrVmVyc2lvbihzbSwgc3RvcmUsIHVwZGF0ZVZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVZlcnNpb24oT2JqZWN0IHYxLCBPYmplY3QgdjIpIHsKKyAgICAgICAgcmV0dXJuIHZlcnMuZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpLmdldFZlcnNpb24oKS4KKyAgICAgICAgICAgIGNvbXBhcmVWZXJzaW9uKHYxLCB2Mik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9UaW1lc3RhbXBWZXJzaW9uU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvVGltZXN0YW1wVmVyc2lvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0YjdiNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvVGltZXN0YW1wVmVyc2lvblN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworCisvKioKKyAqIFVzZXMgYSB0aW1lc3RhbXAgZm9yIG9wdGltaXN0aWMgdmVyc2lvbmluZy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGltZXN0YW1wVmVyc2lvblN0cmF0ZWd5CisgICAgZXh0ZW5kcyBDb2x1bW5WZXJzaW9uU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAidGltZXN0YW1wIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiBBTElBUzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEphdmFUeXBlKCkgeworICAgICAgICByZXR1cm4gSmF2YVNRTFR5cGVzLlRJTUVTVEFNUDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG5leHRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1VudHlwZWRQQ1ZhbHVlSGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9VbnR5cGVkUENWYWx1ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM2ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9VbnR5cGVkUENWYWx1ZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUmVsYXRpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CisKKy8qKgorICogSGFuZGxlciBmb3IgdW5rbm93biBwZXJzaXN0ZW5jZS1jYXBhYmxlIG9iamVjdCBmaWVsZHMgdGhhdCBzdG9yZXMKKyAqIHN0cmluZ2lmaWVkIG9pZHMuCisgKgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgVW50eXBlZFBDVmFsdWVIYW5kbGVyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlSGFuZGxlcgorICAgIGltcGxlbWVudHMgUmVsYXRpb25JZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChVbnR5cGVkUENWYWx1ZUhhbmRsZXIuY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVudHlwZWRQQ1ZhbHVlSGFuZGxlciBfaW5zdGFuY2UgPQorICAgICAgICBuZXcgVW50eXBlZFBDVmFsdWVIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVbnR5cGVkUENWYWx1ZUhhbmRsZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIG1hcChWYWx1ZU1hcHBpbmcgdm0sIFN0cmluZyBuYW1lLCBDb2x1bW5JTyBpbywKKyAgICAgICAgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBDb2x1bW4gY29sID0gbmV3IENvbHVtbigpOworICAgICAgICBjb2wuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5TVFJJTkcpOworICAgICAgICBjb2wuc2V0UmVsYXRpb25JZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5bXXsgY29sIH07CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uYWJsZShWYWx1ZU1hcHBpbmcgdm0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb2JqZWN0VmFsdWVSZXF1aXJlc0xvYWQoVmFsdWVNYXBwaW5nIHZtKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdG9EYXRhU3RvcmVWYWx1ZShWYWx1ZU1hcHBpbmcgdm0sIE9iamVjdCB2YWwsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICAvLyBpbiB0aGUgcGFzdCB3ZSd2ZSBiZWVuIGxlbmllbnQgYWJvdXQgYmVpbmcgYWJsZSB0byB0cmFuc2xhdGUgb2JqZWN0cworICAgICAgICAvLyBmcm9tIG90aGVyIHBlcnNpc3RlbmNlIGNvbnRleHRzLCBzbyB0cnkgdG8gZ2V0IHNtIGRpcmVjdGx5IGZyb20KKyAgICAgICAgLy8gaW5zdGFuY2UgYmVmb3JlIGFza2luZyBvdXIgY29udGV4dAorICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlKSB7CisgICAgICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSB2YWw7CisgICAgICAgICAgICBpZiAocGMucGNHZXRTdGF0ZU1hbmFnZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBwYy5wY0dldFN0YXRlTWFuYWdlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZWxhdGlvblN0cmF0ZWdpZXMuZ2V0U3RhdGVNYW5hZ2VyKHZhbCwgc3RvcmUuZ2V0Q29udGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvT2JqZWN0VmFsdWUoVmFsdWVNYXBwaW5nIHZtLCBPYmplY3QgdmFsLAorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZykgdmFsOworICAgICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihfbG9jLmdldCgib2lkLWludmFsaWQiLCBzdHIsIHZtKSk7CisgICAgICAgIFN0cmluZyBjbHNOYW1lID0gc3RyLnN1YnN0cmluZygwLCBpZHgpOworICAgICAgICBTdHJpbmcgb2lkU3RyID0gc3RyLnN1YnN0cmluZyhpZHggKyAxKTsKKworICAgICAgICBTdG9yZUNvbnRleHQgY3R4ID0gc3RvcmUuZ2V0Q29udGV4dCgpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBzdG9yZS5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS5nZXRDbGFzc0xvYWRlcih2bS5nZXRUeXBlKCksCisgICAgICAgICAgICBjdHguZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIENsYXNzIGNscyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsc05hbWUsIHRydWUsIGxvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGNuZmUpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG9pZCA9IGN0eC5uZXdPYmplY3RJZChjbHMsIG9pZFN0cik7CisgICAgICAgIHJldHVybiBzdG9yZS5maW5kKG9pZCwgdm0sIGZldGNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHRvUmVsYXRpb25EYXRhU3RvcmVWYWx1ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBDb2x1bW4gY29sKSB7CisgICAgICAgIGlmIChzbSA9PSBudWxsIHx8IHNtLmdldE9iamVjdElkKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gc20uZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiCisgICAgICAgICAgICArIHNtLmdldE9iamVjdElkKCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1ZhbHVlTWFwRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL1ZhbHVlTWFwRGlzY3JpbWluYXRvclN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmODMyMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvVmFsdWVNYXBEaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRGlzY3JpbWluYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRpc2NyaW1pbmF0b3JNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworCisvKioKKyAqIE1hcHMgbWV0YWRhdGEtZ2l2ZW4gdmFsdWVzIHRvIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFZhbHVlTWFwRGlzY3JpbWluYXRvclN0cmF0ZWd5CisgICAgZXh0ZW5kcyBJblZhbHVlRGlzY3JpbWluYXRvclN0cmF0ZWd5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTID0gInZhbHVlLW1hcCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChWYWx1ZU1hcERpc2NyaW1pbmF0b3JTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwcml2YXRlIE1hcCBfdmFscyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICByZXR1cm4gQUxJQVM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRKYXZhVHlwZSgpIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGRpc2MuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIHZhbCAhPSBEaXNjcmltaW5hdG9yLk5VTEwpCisgICAgICAgICAgICByZXR1cm4gSmF2YVR5cGVzLmdldFR5cGVDb2RlKHZhbC5nZXRDbGFzcygpKTsKKworICAgICAgICAvLyBpZiB0aGUgdXNlciB3YW50cyB0aGUgdHlwZSB0byBiZSBudWxsLCB3ZSBuZWVkIGEgamRiYy10eXBlCisgICAgICAgIC8vIG9uIHRoZSBjb2x1bW4gb3IgYW4gZXhpc3RpbmcgY29sdW1uIHRvIGZpZ3VyZSBvdXQgdGhlIGphdmEgdHlwZQorICAgICAgICBEaXNjcmltaW5hdG9yTWFwcGluZ0luZm8gaW5mbyA9IGRpc2MuZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgTGlzdCBjb2xzID0gaW5mby5nZXRDb2x1bW5zKCk7CisgICAgICAgIENvbHVtbiBjb2wgPSAoY29scy5pc0VtcHR5KCkpID8gbnVsbCA6IChDb2x1bW4pIGNvbHMuZ2V0KDApOworICAgICAgICBpZiAoY29sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb2wuZ2V0SmF2YVR5cGUoKSAhPSBKYXZhVHlwZXMuT0JKRUNUKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2wuZ2V0SmF2YVR5cGUoKTsKKyAgICAgICAgICAgIGlmIChjb2wuZ2V0VHlwZSgpICE9IFR5cGVzLk9USEVSKQorICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVHlwZXMuZ2V0VHlwZUNvZGUoU2NoZW1hcy5nZXRKYXZhVHlwZQorICAgICAgICAgICAgICAgICAgICAoY29sLmdldFR5cGUoKSwgY29sLmdldFNpemUoKSwgY29sLmdldERlY2ltYWxEaWdpdHMoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhVHlwZXMuU1RSSU5HOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGlzY3JpbWluYXRvclZhbHVlKENsYXNzTWFwcGluZyBjbHMpIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGNscy5nZXREaXNjcmltaW5hdG9yKCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gRGlzY3JpbWluYXRvci5OVUxMKSA/IG51bGwgOiB2YWw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGdldENsYXNzKE9iamVjdCB2YWwsIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoX3ZhbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCk7CisgICAgICAgICAgICBDbGFzc01hcHBpbmdbXSBzdWJzID0gY2xzLmdldEpvaW5hYmxlUENTdWJjbGFzc01hcHBpbmdzKCk7CisgICAgICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKGludCkgKChzdWJzLmxlbmd0aCArIDEpICogMS4zMyArIDEpKTsKKyAgICAgICAgICAgIG1hcERpc2NyaW1pbmF0b3JWYWx1ZShjbHMsIG1hcCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbWFwRGlzY3JpbWluYXRvclZhbHVlKHN1YnNbaV0sIG1hcCk7CisgICAgICAgICAgICBfdmFscyA9IG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHIgPSAodmFsID09IG51bGwpID8gbnVsbCA6IHZhbC50b1N0cmluZygpOworICAgICAgICBDbGFzcyBjbHMgPSAoQ2xhc3MpIF92YWxzLmdldChzdHIpOworICAgICAgICBpZiAoY2xzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY2xzOworICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihfbG9jLmdldCgidW5rbm93bi1kaXNjcmltLXZhbHVlIiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgc3RyLCBkaXNjLmdldENsYXNzTWFwcGluZygpLmdldERlc2NyaWJlZFR5cGUoKS4KKyAgICAgICAgICAgIGdldE5hbWUoKSwgbmV3IFRyZWVTZXQoX3ZhbHMua2V5U2V0KCkpIH0pLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFwRGlzY3JpbWluYXRvclZhbHVlKENsYXNzTWFwcGluZyBjbHMsIE1hcCBtYXApIHsKKyAgICAgICAgLy8gcG9zc2libGUgdGhhdCBzb21lIHR5cGVzIHdpbGwgbmV2ZXIgYmUgcGVyc2lzdGVkIGFuZCB0aGVyZWZvcmUKKyAgICAgICAgLy8gY2FuIGhhdmUgbm8gZGlzY3JpbWluYXRvciB2YWx1ZQorICAgICAgICBPYmplY3QgdmFsID0gY2xzLmdldERpc2NyaW1pbmF0b3IoKS5nZXRWYWx1ZSgpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHN0ciA9ICh2YWwgPT0gRGlzY3JpbWluYXRvci5OVUxMKSA/IG51bGwgOiB2YWwudG9TdHJpbmcoKTsKKyAgICAgICAgQ2xhc3MgZXhpc3QgPSAoQ2xhc3MpIG1hcC5nZXQoc3RyKTsKKyAgICAgICAgaWYgKGV4aXN0ICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImR1cC1kaXNjcmltLXZhbHVlIiwKKyAgICAgICAgICAgICAgICBzdHIsIGV4aXN0LCBjbHMpKTsKKyAgICAgICAgbWFwLnB1dChzdHIsIGNscy5nZXREZXNjcmliZWRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIE9iamVjdCB2YWwgPSBkaXNjLmdldE1hcHBpbmdJbmZvKCkuZ2V0VmFsdWUoZGlzYywgYWRhcHQpOworICAgICAgICBpZiAodmFsID09IG51bGwgJiYgIU1vZGlmaWVyLmlzQWJzdHJhY3QoZGlzYy5nZXRDbGFzc01hcHBpbmcoKS4KKyAgICAgICAgICAgIGdldERlc2NyaWJlZFR5cGUoKS5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWRpc2NyaW0tdmFsdWUiLAorICAgICAgICAgICAgICAgIGRpc2MuZ2V0Q2xhc3NNYXBwaW5nKCkpKTsKKworICAgICAgICAvLyB3ZSBzZXQgdGhlIHZhbHVlIGJlZm9yZSBtYXBwaW5nIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIHRlbXBsYXRlCisgICAgICAgIC8vIGNvbHVtbidzIGphdmEgdHlwZQorICAgICAgICBkaXNjLnNldFZhbHVlKHZhbCk7CisgICAgICAgIHN1cGVyLm1hcChhZGFwdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9WZXJ0aWNhbENsYXNzU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvVmVydGljYWxDbGFzc1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNWI1NAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvVmVydGljYWxDbGFzc1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkRlbGVnYXRpbmdKb2luYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlByaW1hcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Kb2luczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Sb3dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICogTWFwcGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGpvaW4gdG8gdGhlaXIgc3VwZXJjbGFzcyB0YWJsZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVmVydGljYWxDbGFzc1N0cmF0ZWd5CisgICAgZXh0ZW5kcyBBYnN0cmFjdENsYXNzU3RyYXRlZ3kgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAidmVydGljYWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoVmVydGljYWxDbGFzc1N0cmF0ZWd5LmNsYXNzKTsKKworICAgIHByaXZhdGUgQm9vbGVhbiBfZmtPaWQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKKyAgICAgICAgcmV0dXJuIEFMSUFTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcChib29sZWFuIGFkYXB0KSB7CisgICAgICAgIENsYXNzTWFwcGluZyBzdXAgPSBjbHMuZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3VwID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1zdWIiLCBjbHMpKTsKKworICAgICAgICBDbGFzc01hcHBpbmdJbmZvIGluZm8gPSBjbHMuZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgaW5mby5hc3NlcnROb0luZGV4KGNscywgZmFsc2UpOworICAgICAgICBpbmZvLmFzc2VydE5vVW5pcXVlKGNscywgZmFsc2UpOworCisgICAgICAgIC8vIGZvcmVpZ24ga2V5IGZyb20gdGhpcyBjbGFzcyB0byBvdXIgc3VwZXJjbGFzcworICAgICAgICBUYWJsZSB0YWJsZSA9IGluZm8uZ2V0VGFibGUoY2xzLCBhZGFwdCk7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBpbmZvLmdldFN1cGVyY2xhc3NKb2luKGNscywgdGFibGUsIGFkYXB0KTsKKyAgICAgICAgQ29sdW1uW10gcGtDb2xzID0gZmsuZ2V0Q29sdW1ucygpOworCisgICAgICAgIGNscy5zZXRUYWJsZSh0YWJsZSk7CisgICAgICAgIGNscy5zZXRKb2luRm9yZWlnbktleShmayk7CisgICAgICAgIGNscy5zZXRQcmltYXJ5S2V5Q29sdW1ucyhwa0NvbHMpOworICAgICAgICBjbHMuc2V0Q29sdW1uSU8oaW5mby5nZXRDb2x1bW5JTygpKTsKKworICAgICAgICAvLyBhZGQgYSBwcmltYXJ5IGtleSBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5CisgICAgICAgIFByaW1hcnlLZXkgcGsgPSB0YWJsZS5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgIGlmIChwayA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgcGtuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChhZGFwdCkKKyAgICAgICAgICAgICAgICBwa25hbWUgPSBjbHMuZ2V0TWFwcGluZ1JlcG9zaXRvcnkoKS5nZXRNYXBwaW5nRGVmYXVsdHMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeUtleU5hbWUoY2xzLCB0YWJsZSk7CisgICAgICAgICAgICBwayA9IHRhYmxlLmFkZFByaW1hcnlLZXkocGtuYW1lKTsKKyAgICAgICAgICAgIHBrLnNldExvZ2ljYWwoIWFkYXB0KTsKKyAgICAgICAgICAgIHBrLnNldENvbHVtbnMocGtDb2xzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1hcCBqb2luYWJsZXMKKyAgICAgICAgSm9pbmFibGUgam9pbjsKKyAgICAgICAgQ29sdW1uW10gY29sczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwa0NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIG1heSBoYXZlIGFscmVhZHkgcmVnaXN0ZXJlZCBhIG11bHRpLWNvbHVtbiBqb2luYWJsZQorICAgICAgICAgICAgaWYgKGNscy5nZXRKb2luYWJsZShwa0NvbHNbaV0pICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBqb2luYWJsZSB0aGF0IGRlbGVnYXRlcyBhbGwgbWV0aG9kcyB0byB0aGUgc3VwZXJjbGFzcycKKyAgICAgICAgICAgIC8vIGpvaW5hYmxlLCBidXQgY2hhbmdlcyB0aGUgY29sdW1ucyBhcyBhcHByb3ByaWF0ZSB1c2luZworICAgICAgICAgICAgLy8gb3VyIHN1cGVyY2xhc3Mgam9pbiBmaworICAgICAgICAgICAgam9pbiA9IHN1cC5hc3NlcnRKb2luYWJsZShmay5nZXRQcmltYXJ5S2V5Q29sdW1uKHBrQ29sc1tpXSkpOworICAgICAgICAgICAgam9pbiA9IG5ldyBEZWxlZ2F0aW5nSm9pbmFibGUoam9pbiwgZmspOworICAgICAgICAgICAgY29scyA9IGpvaW4uZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgIGNscy5zZXRKb2luYWJsZShjb2xzW2pdLCBqb2luKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIC8vIHRoaXMgcmVxdWlyZXMgYWxsIGZpZWxkcyB0byBiZSByZXNvbHZlZCwgc28gZGVsYXkgaXQgdW50aWwgaW5pdAorICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gY2xzLmdldE1hcHBlZFBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgX2ZrT2lkID0gc3VwLmlzRm9yZWlnbktleU9iamVjdElkKGNscy5nZXRKb2luRm9yZWlnbktleSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgSkRCQ1N0b3JlIHN0b3JlLCBSb3dNYW5hZ2VyIHJtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUm93IHJvdyA9IHJtLmdldFJvdyhjbHMuZ2V0VGFibGUoKSwgUm93LkFDVElPTl9JTlNFUlQsIHNtLCB0cnVlKTsKKyAgICAgICAgcm93LnNldFByaW1hcnlLZXkoY2xzLmdldENvbHVtbklPKCksIHNtKTsKKyAgICAgICAgcm93LnNldEZvcmVpZ25LZXkoY2xzLmdldEpvaW5Gb3JlaWduS2V5KCksIGNscy5nZXRDb2x1bW5JTygpLCBzbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJvdyByb3cgPSBybS5nZXRSb3coY2xzLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fVVBEQVRFLCBzbSwgZmFsc2UpOworICAgICAgICBpZiAocm93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJvdy53aGVyZVByaW1hcnlLZXkoc20pOworICAgICAgICAgICAgcm93LndoZXJlRm9yZWlnbktleShjbHMuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwgc20pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVsZXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEpEQkNTdG9yZSBzdG9yZSwgUm93TWFuYWdlciBybSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJvdyByb3cgPSBybS5nZXRSb3coY2xzLmdldFRhYmxlKCksIFJvdy5BQ1RJT05fREVMRVRFLCBzbSwgdHJ1ZSk7CisgICAgICAgIHJvdy53aGVyZVByaW1hcnlLZXkoc20pOworICAgICAgICByb3cud2hlcmVGb3JlaWduS2V5KGNscy5nZXRKb2luRm9yZWlnbktleSgpLCBzbSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5T2JqZWN0SWQoYm9vbGVhbiBoYXNBbGwpIHsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoX2ZrT2lkKSB8fCAoIWhhc0FsbCAmJiBfZmtPaWQgPT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIGpvaW5TdXBlcmNsYXNzKEpvaW5zIGpvaW5zLCBib29sZWFuIHRvVGhpcykgeworICAgICAgICBpZiAodG9UaGlzKQorICAgICAgICAgICAgcmV0dXJuIGpvaW5zLm91dGVySm9pbihjbHMuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gam9pbnMuam9pbihjbHMuZ2V0Sm9pbkZvcmVpZ25LZXkoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0VhZ2VyU2VsZWN0KFNlbGVjdCBzZWwsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgQ2xhc3NNYXBwaW5nIGJhc2UsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlLmdldERCRGljdGlvbmFyeSgpLmNhbk91dGVySm9pbihzZWwuZ2V0Sm9pblN5bnRheCgpLAorICAgICAgICAgICAgY2xzLmdldEpvaW5Gb3JlaWduS2V5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMTdiZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBLUpEQkMgT1JNIFN0cmF0ZWdpZXM8L3N0cm9uZz48L3A+CisKKzxwPgorICAgIExpYnJhcnkgb2YgbWFwcGluZyBzdHJhdGVnaWVzLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvQ29sdW1uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9Db2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTljMjZhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvQ29sdW1uLmphdmEKQEAgLTAsMCArMSw3MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5EYXRlOworaW1wb3J0IGphdmEuc3FsLlRpbWU7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkYXRhYmFzZSBjb2x1bW4uIENsb3NlbHkgYWxpZ25lZCB3aXRoIHRoZSBjb2x1bW4KKyAqIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmcm9tIHtAbGluayBEYXRhYmFzZU1ldGFEYXRhfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBTdGVwaGVuIEtpbQorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uCisgICAgZXh0ZW5kcyBSZWZlcmVuY2VDb3VudGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVU5JTlNFUlRBQkxFID0gMiA8PCAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVU5VUERBVEFCTEUgPSAyIDw8IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESVJFQ1RfSU5TRVJUID0gMiA8PCAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRElSRUNUX1VQREFURSA9IDIgPDwgMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZLX0lOU0VSVCA9IDIgPDwgNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZLX1VQREFURSA9IDIgPDwgNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BLX0pPSU4gPSAyIDw8IDY7CisKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFRhYmxlIF90YWJsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhYmxlTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtYU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgaW50IF90eXBlID0gVHlwZXMuT1RIRVI7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3R5cGVOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfamF2YVR5cGUgPSBKYXZhVHlwZXMuT0JKRUNUOworICAgIHByaXZhdGUgaW50IF9zaXplID0gMDsKKyAgICBwcml2YXRlIGludCBfZGVjaW1hbHMgPSAwOworICAgIHByaXZhdGUgU3RyaW5nIF9kZWZhdWx0U3RyID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdCBfZGVmYXVsdCA9IG51bGw7CisgICAgcHJpdmF0ZSBCb29sZWFuIF9ub3ROdWxsID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2F1dG9Bc3NpZ24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3JlbCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIF90YXJnZXQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF90YXJnZXRGaWVsZCA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2ZsYWdzID0gMDsKKworICAgIHByaXZhdGUgaW50IF9pbmRleCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wayA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbgorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgY29sdW1uJ3MgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0VGFibGVOYW1lKHRhYmxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzZXRTY2hlbWFOYW1lKHRhYmxlLmdldFNjaGVtYU5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgX3RhYmxlID0gdGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbHVtbiBpcyByZW1vdmVkIGZyb20gaXRzIHRhYmxlLiBSZW1vdmVzIHRoZSBjb2x1bW4KKyAgICAgKiBmcm9tIGFsbCB0YWJsZSBjb25zdHJhaW50cyBhbmQgaW5kZXhlcywgdGhlbiBpbnZhbGlkYXRlcyBpdC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOworICAgICAgICBpZiAodGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTY2hlbWEgc2NoZW1hID0gdGFibGUuZ2V0U2NoZW1hKCk7CisgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gc2NoZW1hLmdldFNjaGVtYUdyb3VwKCkuZ2V0U2NoZW1hcygpOworICAgICAgICAgICAgVGFibGVbXSB0YWJzOworICAgICAgICAgICAgRm9yZWlnbktleVtdIGZrczsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHM7CisgICAgICAgICAgICBDb2x1bW5bXSBwa3M7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmtzID0gdGFic1tqXS5nZXRGb3JlaWduS2V5cygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGZrcy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGZrc1trXS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3MgPSBma3Nba10uZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgY29scy5sZW5ndGg7IGwrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lcXVhbHMoY29sc1tsXSkgfHwgdGhpcy5lcXVhbHMocGtzW2xdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmtzW2tdLnJlbW92ZUpvaW4oY29sc1tsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSBma3Nba10uZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGNvbHMubGVuZ3RoOyBsKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXF1YWxzKGNvbHNbbF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBma3Nba10ucmVtb3ZlSm9pbihjb2xzW2xdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGtzID0gZmtzW2tdLmdldENvbnN0YW50UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgcGtzLmxlbmd0aDsgbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhwa3NbbF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBma3Nba10ucmVtb3ZlSm9pbihwa3NbbF0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmtzW2tdLmdldENvbHVtbnMoKS5sZW5ndGggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZrc1trXS5nZXRDb25zdGFudENvbHVtbnMoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJzW2pdLnJlbW92ZUZvcmVpZ25LZXkoZmtzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEluZGV4W10gaWR4cyA9IHRhYmxlLmdldEluZGV4ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHhzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGlkeHNbaV0ucmVtb3ZlQ29sdW1uKHRoaXMpICYmIGlkeHNbaV0uZ2V0Q29sdW1ucygpLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUluZGV4KGlkeHNbaV0pOworCisgICAgICAgIFVuaXF1ZVtdIHVucXMgPSB0YWJsZS5nZXRVbmlxdWVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5xcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmICh1bnFzW2ldLnJlbW92ZUNvbHVtbih0aGlzKSAmJiB1bnFzW2ldLmdldENvbHVtbnMoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVVbmlxdWUodW5xc1tpXSk7CisKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IHRhYmxlLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgaWYgKHBrICE9IG51bGwgJiYgcGsucmVtb3ZlQ29sdW1uKHRoaXMpICYmIHBrLmdldENvbHVtbnMoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHRhYmxlLnJlbW92ZVByaW1hcnlLZXkoKTsKKworICAgICAgICBfdGFibGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIFRhYmxlIGdldFRhYmxlKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW4ncyB0YWJsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sdW1uJ3MgdGFibGUgbmFtZS4gWW91IGNhbiBvbmx5IGNhbGwgdGhpcyBtZXRob2Qgb24gY29sdW1ucworICAgICAqIHdob3NlIHRhYmxlIG9iamVjdCBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZ2V0VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfdGFibGVOYW1lID0gbmFtZTsKKyAgICAgICAgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sdW1uJ3Mgc2NoZW1hIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFOYW1lKCkgeworICAgICAgICByZXR1cm4gX3NjaGVtYU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNvbHVtbidzIHNjaGVtYSBuYW1lLiBZb3UgY2FuIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBvbiBjb2x1bW5zCisgICAgICogd2hvc2UgdGFibGUgb2JqZWN0IGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZ2V0VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfc2NoZW1hTmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4ncyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29sdW1uJ3MgbmFtZS4gWW91IGNhbiBvbmx5IGNhbGwgdGhpcyBtZXRob2Qgb24gY29sdW1ucworICAgICAqIHdob3NlIHRhYmxlIG9iamVjdCBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGdldFRhYmxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgICAgICBfZnVsbE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uJ3MgZnVsbCBuYW1lLCBpbiB0aGUgZm9ybSAmbHQ7dGFibGUmZ3Q7LiZsdDtuYW1lJmd0Oy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeworICAgICAgICBpZiAoX2Z1bGxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyB0bmFtZSA9IGdldFRhYmxlTmFtZSgpOworICAgICAgICAgICAgaWYgKHRuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICBfZnVsbE5hbWUgPSB0bmFtZSArICIuIiArIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9mdWxsTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbidzIFNRTCB0eXBlLiBUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSB0eXBlIGNvbnN0YW50cworICAgICAqIGRlZmluZWQgaW4ge0BsaW5rIFR5cGVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbidzIFNRTCB0eXBlLiBUaGlzIHNob3VsZCBiZSBvbmUgb2YgdGhlIHR5cGUgY29uc3RhbnRzCisgICAgICogZGVmaW5lZCBpbiB7QGxpbmsgVHlwZXN9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHNxbFR5cGUpIHsKKyAgICAgICAgX3R5cGUgPSBzcWxUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhYmFzZS1zcGVjaWZpYyBTUUwgdHlwZSBvZiB0aGlzIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworICAgICAgICByZXR1cm4gX3R5cGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhYmFzZS1zcGVjaWZpYyBTUUwgdHlwZSBvZiB0aGlzIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKKyAgICAgICAgX3R5cGVOYW1lID0gdHlwZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEphdmEgdHlwZSB0aGUgZGF0YSBpbiB0aGlzIGNvbHVtbiBpcyB0cmVhdGVkIGFzLCBmcm9tCisgICAgICoge0BsaW5rIEphdmFUeXBlc30gb3Ige0BsaW5rIEphdmFTUUxUeXBlc30uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKYXZhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9qYXZhVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSB0eXBlIHRoZSBkYXRhIGluIHRoaXMgY29sdW1uIGlzIHRyZWF0ZWQgYXMsIGZyb20KKyAgICAgKiB7QGxpbmsgSmF2YVR5cGVzfSBvciB7QGxpbmsgSmF2YVNRTFR5cGVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhVHlwZShpbnQgdHlwZSkgeworICAgICAgICBfamF2YVR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uJ3Mgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbidzIHNpemUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBfc2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgZm9yIHRoZSBjb2x1bW4sIGlmIGFwcGxpY2FibGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWNpbWFsRGlnaXRzKCkgeworICAgICAgICByZXR1cm4gX2RlY2ltYWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGZvciB0aGUgY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlY2ltYWxEaWdpdHMoaW50IGRpZ2l0cykgeworICAgICAgICBfZGVjaW1hbHMgPSBkaWdpdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIHNldCBmb3IgdGhlIGNvbHVtbiwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0U3RyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0U3RyaW5nKFN0cmluZyBkZWYpIHsKKyAgICAgICAgX2RlZmF1bHRTdHIgPSBkZWY7CisgICAgICAgIF9kZWZhdWx0ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgc2V0IGZvciB0aGlzIGNvbHVtbiwgaWYgYW55LiBJZiBvbmx5IGEgZGVmYXVsdAorICAgICAqIHN0cmluZyBoYXMgYmVlbiBzZXQsIGF0dGVtcHRzIHRvIGNvbnZlcnQgaXQgdG8gdGhlIHJpZ2h0IHR5cGUgYmFzZWQKKyAgICAgKiBvbiB0aGUgSmF2YSB0eXBlIHNldCBmb3IgdGhpcyBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0KCkgeworICAgICAgICBpZiAoX2RlZmF1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdDsKKyAgICAgICAgaWYgKF9kZWZhdWx0U3RyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKF9qYXZhVHlwZSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgICAgIF9kZWZhdWx0ID0gKCJ0cnVlIi5lcXVhbHMoX2RlZmF1bHRTdHIpKSA/IEJvb2xlYW4uVFJVRQorICAgICAgICAgICAgICAgICAgICA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgX2RlZmF1bHQgPSBuZXcgQnl0ZShfZGVmYXVsdFN0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgX2RlZmF1bHQgPSBuZXcgQ2hhcmFjdGVyKF9kZWZhdWx0U3RyLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEVfT0JKOgorICAgICAgICAgICAgICAgIF9kZWZhdWx0ID0gbmV3IERvdWJsZShfZGVmYXVsdFN0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgICAgICBfZGVmYXVsdCA9IG5ldyBGbG9hdChfZGVmYXVsdFN0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgIF9kZWZhdWx0ID0gTnVtYmVycy52YWx1ZU9mKEludGVnZXIucGFyc2VJbnQoX2RlZmF1bHRTdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HX09CSjoKKyAgICAgICAgICAgICAgICBfZGVmYXVsdCA9IE51bWJlcnMudmFsdWVPZihMb25nLnBhcnNlTG9uZyhfZGVmYXVsdFN0cikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTlVNQkVSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHREVDSU1BTDoKKyAgICAgICAgICAgICAgICBfZGVmYXVsdCA9IG5ldyBCaWdEZWNpbWFsKF9kZWZhdWx0U3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlRfT0JKOgorICAgICAgICAgICAgICAgIF9kZWZhdWx0ID0gbmV3IFNob3J0KF9kZWZhdWx0U3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgX2RlZmF1bHQgPSBuZXcgamF2YS51dGlsLkRhdGUoX2RlZmF1bHRTdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHSU5URUdFUjoKKyAgICAgICAgICAgICAgICBfZGVmYXVsdCA9IG5ldyBCaWdJbnRlZ2VyKF9kZWZhdWx0U3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLlNRTF9EQVRFOgorICAgICAgICAgICAgICAgIF9kZWZhdWx0ID0gRGF0ZS52YWx1ZU9mKF9kZWZhdWx0U3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLlRJTUVTVEFNUDoKKyAgICAgICAgICAgICAgICBfZGVmYXVsdCA9IFRpbWVzdGFtcC52YWx1ZU9mKF9kZWZhdWx0U3RyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLlRJTUU6CisgICAgICAgICAgICAgICAgX2RlZmF1bHQgPSBUaW1lLnZhbHVlT2YoX2RlZmF1bHRTdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfZGVmYXVsdCA9IF9kZWZhdWx0U3RyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZGVmYXVsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChPYmplY3QgZGVmKSB7CisgICAgICAgIF9kZWZhdWx0ID0gZGVmOworICAgICAgICBfZGVmYXVsdFN0ciA9IChkZWYgPT0gbnVsbCkgPyBudWxsIDogZGVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIE5PVCBOVUxMIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vdE51bGwoKSB7CisgICAgICAgIHJldHVybiBfbm90TnVsbCA9PSBCb29sZWFuLlRSVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyBpcyBhIE5PVCBOVUxMIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3ROdWxsKGJvb2xlYW4gbm90TnVsbCkgeworICAgICAgICBfbm90TnVsbCA9IChub3ROdWxsKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90LW51bGwgcHJvcGVydHkgaGFzIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTm90TnVsbEV4cGxpY2l0KCkgeworICAgICAgICByZXR1cm4gX25vdE51bGwgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgY29sdW1uIGlzIGF1dG8tYXNzaWduZWQgYSB2YWx1ZSBvbiBpbnNlcnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvQXNzaWduZWQoKSB7CisgICAgICAgIHJldHVybiBfYXV0b0Fzc2lnbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgY29sdW1uIGlzIGF1dG8taW5jcmVtZW50aW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9Bc3NpZ25lZChib29sZWFuIGF1dG9Bc3NpZ24pIHsKKyAgICAgICAgaWYgKGF1dG9Bc3NpZ24gIT0gX2F1dG9Bc3NpZ24gJiYgZ2V0VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgZ2V0VGFibGUoKS5jaGFuZ2VBdXRvQXNzaWduZWQodGhpcyk7CisgICAgICAgIF9hdXRvQXNzaWduID0gYXV0b0Fzc2lnbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgY29sdW1uIHN0b3JlcyBzb21lIGZvcm0gb2Ygc2VyaWFsaXplZCBpZGVudGl0eSB2YWx1ZSBmb3IKKyAgICAgKiBhIHJlbGF0ZWQgcmVjb3JkLiBUaGlzIG1ha2VzIHRoZSBjb2x1bW4gZGVwZW5kZW50IG9uIHRoZSBrbm93aW5nIHRoZQorICAgICAqIGZpbmFsIGlkZW50aXR5IG9mIHRoZSByZWxhdGlvbiBiZWZvcmUgdGhlIGNvbHVtbiB2YWx1ZSBpcyBzZXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbklkKCkgeworICAgICAgICByZXR1cm4gX3JlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgY29sdW1uIHN0b3JlcyBzb21lIGZvcm0gb2Ygc2VyaWFsaXplZCBpZGVudGl0eSB2YWx1ZSBmb3IKKyAgICAgKiBhIHJlbGF0ZWQgcmVjb3JkLiBUaGlzIG1ha2VzIHRoZSBjb2x1bW4gZGVwZW5kZW50IG9uIHRoZSBrbm93aW5nIHRoZQorICAgICAqIGZpbmFsIGlkZW50aXR5IG9mIHRoZSByZWxhdGlvbiBiZWZvcmUgdGhlIGNvbHVtbiB2YWx1ZSBpcyBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25JZChib29sZWFuIHJlbCkgeworICAgICAgICBpZiAocmVsICE9IF9yZWwgJiYgZ2V0VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgZ2V0VGFibGUoKS5jaGFuZ2VSZWxhdGlvbklkKHRoaXMpOworICAgICAgICBfcmVsID0gcmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdGhpcyBjb2x1bW4gam9pbnMgdG8sIGlmIGFueS4gVXNlZCBmb3IgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIF90YXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0aGlzIGNvbHVtbiBqb2lucyB0bywgaWYgYW55LiBVc2VkIGZvciBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIF90YXJnZXQgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRoaXMgY29sdW1uIGpvaW5zIHRvLCBpZiBhbnkuIFVzZWQgZm9yIG1hcHBpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIF90YXJnZXRGaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdGhpcyBjb2x1bW4gam9pbnMgdG8sIGlmIGFueS4gVXNlZCBmb3IgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRGaWVsZChTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHRhcmdldCA9IG51bGw7CisgICAgICAgIF90YXJnZXRGaWVsZCA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFncyBhcmUgdXNlZCBmb3IgYm9va2tlZXBpbmcgaW5mb3JtYXRpb24uIFRoZXkgYXJlIGlnbm9yZWQgYXQgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGbGFnKGludCBmbGFnKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgZmxhZykgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFncyBhcmUgdXNlZCBmb3IgYm9va2tlZXBpbmcgaW5mb3JtYXRpb24uIFRoZXkgYXJlIGlnbm9yZWQgYXQgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGbGFnKGludCBmbGFnLCBib29sZWFuIG9uKSB7CisgICAgICAgIGlmIChvbikKKyAgICAgICAgICAgIF9mbGFncyB8PSBmbGFnOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZmxhZ3MgJj0gfmZsYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBjb2x1bW4gYmVsb25ncyB0byB0aGUgdGFibGUncyBwcmltYXJ5IGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXkoKSB7CisgICAgICAgIHJldHVybiBfcGs7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyBjb2x1bW4gYmVsb25ncyB0byB0aGUgdGFibGUncyBwcmltYXJ5IGtleS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFByaW1hcnlLZXkoYm9vbGVhbiBwaykgeworICAgICAgICBfcGsgPSBwazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbidzIDAtYmFzZWQgaW5kZXggaW4gdGhlIG93bmluZyB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgICAgICBpZiAoZ2V0VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgZ2V0VGFibGUoKS5pbmRleENvbHVtbnMoKTsKKyAgICAgICAgcmV0dXJuIF9pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbidzIDAtYmFzZWQgaW5kZXggaW4gdGhlIG93bmluZyB0YWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEluZGV4KGludCBpbmRleCkgeworICAgICAgICBfaW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgY29sdW1uIGlzIGEgTE9CLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworICAgICAgICBzd2l0Y2ggKF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJTkFSWToKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQkxPQjoKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTE9OR1ZBUkJJTkFSWToKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQklOQVJZOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbHVtbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIEpEQkMgdHlwZQorICAgICAqIGZyb20ge0BsaW5rIFR5cGVzfSBhbmQgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoaW50IHR5cGUsIFN0cmluZyB0eXBlTmFtZSwgaW50IHNpemUsIAorICAgICAgICBpbnQgZGVjaW1hbHMpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuT1RIRVIgfHwgZ2V0VHlwZSgpID09IFR5cGVzLk9USEVSKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBnaXZlbiBzaXplIGlzIGN1cnJlbnRseSBpZ25vcmVkLCBidXQgbWF5IGJlIHVzZWZ1bAorICAgICAgICAvLyB0byBkeW5hbWljYWxseS1wb3B1bGF0aW5nIHN1YmNsYXNzZXMKKyAgICAgICAgc3dpdGNoIChnZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklUOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5USU5ZSU5UOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5CSUdJTlQ6CisgICAgICAgICAgICBjYXNlIFR5cGVzLklOVEVHRVI6CisgICAgICAgICAgICBjYXNlIFR5cGVzLk5VTUVSSUM6CisgICAgICAgICAgICBjYXNlIFR5cGVzLlNNQUxMSU5UOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5ERUNJTUFMOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIFR5cGVzLkZMT0FUOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5SRUFMOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5USU5ZSU5UOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJJR0lOVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JTlRFR0VSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLk5VTUVSSUM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU01BTExJTlQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuREVDSU1BTDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuUkVBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklOQVJZOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5CTE9COgorICAgICAgICAgICAgY2FzZSBUeXBlcy5MT05HVkFSQklOQVJZOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5WQVJCSU5BUlk6CisgICAgICAgICAgICBjYXNlIFR5cGVzLk9USEVSOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJJTkFSWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CTE9COgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxPTkdWQVJCSU5BUlk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQklOQVJZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLk9USEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgY2FzZSBUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5MT05HVkFSQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQ0hBUjoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTE9OR1ZBUkNIQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQ0hBUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRVNUQU1QOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBUeXBlcy5EQVRFOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5USU1FOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5USU1FU1RBTVA6CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTE9OR1ZBUkNIQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQ0xPQjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5WQVJDSEFSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5USU1FU1RBTVA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09IGdldFR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiRnVsbCBOYW1lOiAiKS5hcHBlbmQoZ2V0RnVsbE5hbWUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKCJUeXBlOiAiKS5hcHBlbmQoU2NoZW1hcy5nZXRKREJDTmFtZShnZXRUeXBlKCkpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiXG4iKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiU2l6ZTogIikuYXBwZW5kKGdldFNpemUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKCJEZWZhdWx0OiAiKS5hcHBlbmQoZ2V0RGVmYXVsdFN0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIk5vdCBOdWxsOiAiKS5hcHBlbmQoaXNOb3ROdWxsKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGNvbXBhdGliaWxpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzQ29sdW1uKENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChjb2wgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWdldEZ1bGxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShjb2wuZ2V0RnVsbE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghaXNDb21wYXRpYmxlKGNvbC5nZXRUeXBlKCksIGNvbC5nZXRUeXBlTmFtZSgpLCBjb2wuZ2V0U2l6ZSgpLAorICAgICAgICAgICAgY29sLmdldERlY2ltYWxEaWdpdHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChnZXRUeXBlKCkgPT0gVHlwZXMuVkFSQ0hBUiAmJiBnZXRTaXplKCkgPiAwICYmIGNvbC5nZXRTaXplKCkgPiAwCisgICAgICAgICAgICAmJiBnZXRTaXplKCkgIT0gY29sLmdldFNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBjb2x1bW4gdG8gdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weShDb2x1bW4gZnJvbSkgeworICAgICAgICBpZiAoZnJvbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZ2V0TmFtZSgpID09IG51bGwpCisgICAgICAgICAgICBzZXROYW1lKGZyb20uZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGdldFR5cGUoKSA9PSBUeXBlcy5PVEhFUikKKyAgICAgICAgICAgIHNldFR5cGUoZnJvbS5nZXRUeXBlKCkpOworICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgc2V0VHlwZU5hbWUoZnJvbS5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgaWYgKGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGVzLk9CSkVDVCkKKyAgICAgICAgICAgIHNldEphdmFUeXBlKGZyb20uZ2V0SmF2YVR5cGUoKSk7CisgICAgICAgIGlmIChnZXRTaXplKCkgPT0gMCkKKyAgICAgICAgICAgIHNldFNpemUoZnJvbS5nZXRTaXplKCkpOworICAgICAgICBpZiAoZ2V0RGVjaW1hbERpZ2l0cygpID09IDApCisgICAgICAgICAgICBzZXREZWNpbWFsRGlnaXRzKGZyb20uZ2V0RGVjaW1hbERpZ2l0cygpKTsKKyAgICAgICAgaWYgKGdldERlZmF1bHRTdHJpbmcoKSA9PSBudWxsKQorICAgICAgICAgICAgc2V0RGVmYXVsdFN0cmluZyhmcm9tLmdldERlZmF1bHRTdHJpbmcoKSk7CisgICAgICAgIGlmICghaXNOb3ROdWxsRXhwbGljaXQoKSAmJiBmcm9tLmlzTm90TnVsbEV4cGxpY2l0KCkpCisgICAgICAgICAgICBzZXROb3ROdWxsKGZyb20uaXNOb3ROdWxsKCkpOworICAgICAgICBpZiAoIWlzQXV0b0Fzc2lnbmVkKCkpCisgICAgICAgICAgICBzZXRBdXRvQXNzaWduZWQoZnJvbS5pc0F1dG9Bc3NpZ25lZCgpKTsKKyAgICAgICAgaWYgKCFpc1JlbGF0aW9uSWQoKSkKKyAgICAgICAgICAgIHNldFJlbGF0aW9uSWQoZnJvbS5pc1JlbGF0aW9uSWQoKSk7CisgICAgICAgIGlmIChnZXRUYXJnZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgc2V0VGFyZ2V0KGZyb20uZ2V0VGFyZ2V0KCkpOworICAgICAgICBpZiAoZ2V0VGFyZ2V0RmllbGQoKSA9PSBudWxsKQorICAgICAgICAgICAgc2V0VGFyZ2V0RmllbGQoZnJvbS5nZXRUYXJnZXRGaWVsZCgpKTsKKyAgICAgICAgaWYgKF9mbGFncyA9PSAwKQorICAgICAgICAgICAgX2ZsYWdzID0gZnJvbS5fZmxhZ3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvQ29sdW1uSU8uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0NvbHVtbklPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxODFjNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0NvbHVtbklPLmphdmEKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogTWV0YWRhdGEgYWJvdXQgY29sdW1uIEkvTyBpbiBhIHNwZWNpZmljIGNvbnRleHQuIEluIHRoZSBjb250ZXh0IG9mCisgKiBhIGZvcmVpZ24ga2V5LCB0aGUgc3RhbmRhcmQgZm9yZWlnbiBrZXkgY29sdW1ucyBhcmUgaW5kZXhlZCBmaXJzdCwgdGhlbgorICogdGhlIGNvbnN0YW50IGNvbHVtbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIENvbHVtbklPCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5JTyBVTlJFU1RSSUNURUQgPSBuZXcgQ29sdW1uSU8oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoaW50IGNvbCwgYm9vbGVhbiBpbnNlcnRhYmxlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShpbnQgY29sLCBib29sZWFuIHVwZGF0YWJsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROdWxsSW5zZXJ0YWJsZShpbnQgY29sLCBib29sZWFuIGluc2VydGFibGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TnVsbFVwZGF0YWJsZShpbnQgY29sLCBib29sZWFuIGluc2VydGFibGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgaW50IF91bkluc2VydGFibGUgPSAwOworICAgIHByaXZhdGUgaW50IF91blVwZGF0YWJsZSA9IDA7CisgICAgcHJpdmF0ZSBpbnQgX3VuTnVsbEluc2VydGFibGUgPSAwOworICAgIHByaXZhdGUgaW50IF91bk51bGxVcGRhdGFibGUgPSAwOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgY29sdW1uIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBpbnNlcnRhYmxlIGluIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoaW50IGNvbCwgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlzKGNvbCwgX3VuSW5zZXJ0YWJsZSwgX3VuTnVsbEluc2VydGFibGUsIG51bGxWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byA8Y29kZT5pc0luc2VydGFibGUgKDAsIG51bGxWYWx1ZSk8L2NvZGU+LCBidXQgcmV0dXJucworICAgICAqIGZhbHNlIGlmIHRoZSBnaXZlbiBjb2x1bW4gaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoQ29sdW1uIGNvbCwgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlzKGNvbCwgX3VuSW5zZXJ0YWJsZSwgX3VuTnVsbEluc2VydGFibGUsIG51bGxWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhbnkgY29sdW1uIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGdpdmVuIGluZGV4IGlzIGluc2VydGFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbnlJbnNlcnRhYmxlKGludCBjb2wsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FueShjb2wsIF91bkluc2VydGFibGUsIF91bk51bGxJbnNlcnRhYmxlLCBudWxsVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+aXNBbnlJbnNlcnRhYmxlIChjb2xzLmxlbmd0aCwgbnVsbFZhbHVlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbnlJbnNlcnRhYmxlKENvbHVtbltdIGNvbHMsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FueShjb2xzLCBfdW5JbnNlcnRhYmxlLCBfdW5OdWxsSW5zZXJ0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgY29sdW1ucyBmb3IgdGhlIGdpdmVuIGtleSBhcmUgaW5zZXJ0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FueUluc2VydGFibGUoRm9yZWlnbktleSBmaywgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlzQW55KGZrLCBfdW5JbnNlcnRhYmxlLCBfdW5OdWxsSW5zZXJ0YWJsZSwgbnVsbFZhbHVlKQorICAgICAgICAgICAgJiYgKCFudWxsVmFsdWUgfHwgZmsuaXNMb2dpY2FsKCkgfHwgaXNOdWxsYWJsZShmaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgYWxsIGNvbHVtbnMgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZ2l2ZW4gaW5kZXggYXJlIGluc2VydGFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbGxJbnNlcnRhYmxlKGludCBjb2wsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FsbChjb2wsIF91bkluc2VydGFibGUsIF91bk51bGxJbnNlcnRhYmxlLCBudWxsVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+aXNBbGxJbnNlcnRhYmxlIChjb2xzLmxlbmd0aCwgbnVsbFZhbHVlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbGxJbnNlcnRhYmxlKENvbHVtbltdIGNvbHMsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FsbChjb2xzLCBfdW5JbnNlcnRhYmxlLCBfdW5OdWxsSW5zZXJ0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgY29sdW1ucyBmb3IgdGhlIGdpdmVuIGtleSBhcmUgaW5zZXJ0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbEluc2VydGFibGUoRm9yZWlnbktleSBmaywgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlzQWxsKGZrLCBfdW5JbnNlcnRhYmxlLCBfdW5OdWxsSW5zZXJ0YWJsZSwgbnVsbFZhbHVlKQorICAgICAgICAgICAgJiYgKCFudWxsVmFsdWUgfHwgZmsuaXNMb2dpY2FsKCkgfHwgaXNOdWxsYWJsZShmaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNvbHVtbiBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgaW5zZXJ0YWJsZSBpbiB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShpbnQgY29sLCBib29sZWFuIGluc2VydGFibGUpIHsKKyAgICAgICAgX3VuSW5zZXJ0YWJsZSA9IHNldChjb2wsIGluc2VydGFibGUsIF91bkluc2VydGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBjb250ZXh0IGNhbiBpbnNlcnQgdGhlIGdpdmVuIGNvbHVtbiBhcyBudWxsL2RlZmF1bHQgaW4KKyAgICAgKiB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVsbEluc2VydGFibGUoaW50IGNvbCwgYm9vbGVhbiBpbnNlcnRhYmxlKSB7CisgICAgICAgIF91bk51bGxJbnNlcnRhYmxlID0gc2V0KGNvbCwgaW5zZXJ0YWJsZSwgX3VuTnVsbEluc2VydGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNvbHVtbiBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgdXBkYXRhYmxlIGluIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZShpbnQgY29sLCBib29sZWFuIG51bGxWYWx1ZSkgeworICAgICAgICByZXR1cm4gaXMoY29sLCBfdW5VcGRhdGFibGUsIF91bk51bGxVcGRhdGFibGUsIG51bGxWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byA8Y29kZT5pc1VwZGF0YWJsZSAoMCwgbnVsbFZhbHVlKTwvY29kZT4sIGJ1dCByZXR1cm5zCisgICAgICogZmFsc2UgaWYgdGhlIGdpdmVuIGNvbHVtbiBpcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXBkYXRhYmxlKENvbHVtbiBjb2wsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpcyhjb2wsIF91blVwZGF0YWJsZSwgX3VuTnVsbFVwZGF0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFueSBjb2x1bW4gdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZ2l2ZW4gaW5kZXggaXMgdXBkYXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQW55VXBkYXRhYmxlKGludCBjb2wsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FueShjb2wsIF91blVwZGF0YWJsZSwgX3VuTnVsbFVwZGF0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPmlzQW55VXBkYXRhYmxlIChjb2xzLmxlbmd0aCwgbnVsbFZhbHVlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbnlVcGRhdGFibGUoQ29sdW1uW10gY29scywgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlzQW55KGNvbHMsIF91blVwZGF0YWJsZSwgX3VuTnVsbFVwZGF0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgY29sdW1ucyBmb3IgdGhlIGdpdmVuIGtleSBhcmUgdXBkYXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQW55VXBkYXRhYmxlKEZvcmVpZ25LZXkgZmssIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FueShmaywgX3VuVXBkYXRhYmxlLCBfdW5OdWxsVXBkYXRhYmxlLCBudWxsVmFsdWUpCisgICAgICAgICAgICAmJiAoIW51bGxWYWx1ZSB8fCBmay5pc0xvZ2ljYWwoKSB8fCBpc051bGxhYmxlKGZrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhbGwgY29sdW1ucyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBnaXZlbiBpbmRleCBhcmUgdXBkYXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWxsVXBkYXRhYmxlKGludCBjb2wsIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FsbChjb2wsIF91blVwZGF0YWJsZSwgX3VuTnVsbFVwZGF0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPmlzQWxsVXBkYXRhYmxlIChjb2xzLmxlbmd0aCwgbnVsbFZhbHVlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbGxVcGRhdGFibGUoQ29sdW1uW10gY29scywgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlzQWxsKGNvbHMsIF91blVwZGF0YWJsZSwgX3VuTnVsbFVwZGF0YWJsZSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgY29sdW1ucyBmb3IgdGhlIGdpdmVuIGtleSBhcmUgdXBkYXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWxsVXBkYXRhYmxlKEZvcmVpZ25LZXkgZmssIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FsbChmaywgX3VuVXBkYXRhYmxlLCBfdW5OdWxsVXBkYXRhYmxlLCBudWxsVmFsdWUpCisgICAgICAgICAgICAmJiAoIW51bGxWYWx1ZSB8fCBmay5pc0xvZ2ljYWwoKSB8fCBpc051bGxhYmxlKGZrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgY29sdW1uIGF0IHRoZSBnaXZlbiBpbmRleCBpcyB1cGRhdGFibGUgaW4gdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShpbnQgY29sLCBib29sZWFuIHVwZGF0YWJsZSkgeworICAgICAgICBfdW5VcGRhdGFibGUgPSBzZXQoY29sLCB1cGRhdGFibGUsIF91blVwZGF0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGNvbnRleHQgY2FuIHNldCB0aGUgZ2l2ZW4gY29sdW1uIHRvIG51bGwvZGVmYXVsdCBpbgorICAgICAqIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsVXBkYXRhYmxlKGludCBjb2wsIGJvb2xlYW4gdXBkYXRhYmxlKSB7CisgICAgICAgIF91bk51bGxVcGRhdGFibGUgPSBzZXQoY29sLCB1cGRhdGFibGUsIF91bk51bGxVcGRhdGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNvbHVtbiBhdCB0aGUgZ2l2ZW4gaW5kZXggaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXMoaW50IGNvbCwgaW50IHByb3BlcnR5LCBpbnQgbnVsbFByb3BlcnR5LAorICAgICAgICBib29sZWFuIG51bGxWYWx1ZSkgeworICAgICAgICByZXR1cm4gKHByb3BlcnR5ICYgKDIgPDwgY29sKSkgPT0gMAorICAgICAgICAgICAgJiYgKCFudWxsVmFsdWUgfHwgKG51bGxQcm9wZXJ0eSAmICgyIDw8IGNvbCkpID09IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNvbHVtbiBoYXMgdGhlIGdpdmVuIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpcyhDb2x1bW4gY29sLCBpbnQgcHJvcGVydHksIGludCBudWxsUHJvcGVydHksCisgICAgICAgIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBjb2wgIT0gbnVsbCAmJiBpcygwLCBwcm9wZXJ0eSwgbnVsbFByb3BlcnR5LCBudWxsVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgYW55IGNvbHVtbiB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBnaXZlbiBpbmRleCBoYXMgdGhlIGdpdmVuCisgICAgICogcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQW55KGludCBjb2wsIGludCBwcm9wZXJ0eSwgaW50IG51bGxQcm9wZXJ0eSwKKyAgICAgICAgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgaWYgKGNvbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocHJvcGVydHkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbDsgaSsrKQorICAgICAgICAgICAgaWYgKGlzKGksIHByb3BlcnR5LCBudWxsUHJvcGVydHksIG51bGxWYWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFueSBjb2x1bW5zIGhhdmUgdGhlIGdpdmVuIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FueShDb2x1bW5bXSBjb2xzLCBpbnQgcHJvcGVydHksIGludCBudWxsUHJvcGVydHksCisgICAgICAgIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBpc0FueShjb2xzLmxlbmd0aCwgcHJvcGVydHksIG51bGxQcm9wZXJ0eSwgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFueSBjb2x1bW5zIGZvciB0aGUgZ2l2ZW4ga2V5IGhhdmUgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FueShGb3JlaWduS2V5IGZrLCBpbnQgcHJvcGVydHksIGludCBudWxsUHJvcGVydHksCisgICAgICAgIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBmayAhPSBudWxsICYmIGlzQW55KGZrLmdldENvbHVtbnMoKS5sZW5ndGgKKyAgICAgICAgICAgICsgZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCkubGVuZ3RoLCBwcm9wZXJ0eSwgbnVsbFByb3BlcnR5LAorICAgICAgICAgICAgbnVsbFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFsbCBjb2x1bW5zIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGdpdmVuIGluZGV4IGhhdmUgdGhlIGdpdmVuCisgICAgICogcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsKGludCBjb2wsIGludCBwcm9wZXJ0eSwgaW50IG51bGxQcm9wZXJ0eSwKKyAgICAgICAgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgaWYgKGNvbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocHJvcGVydHkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbDsgaSsrKQorICAgICAgICAgICAgaWYgKCFpcyhpLCBwcm9wZXJ0eSwgbnVsbFByb3BlcnR5LCBudWxsVmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhbGwgY29sdW1ucyBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBbGwoQ29sdW1uW10gY29scywgaW50IHByb3BlcnR5LCBpbnQgbnVsbFByb3BlcnR5LAorICAgICAgICBib29sZWFuIG51bGxWYWx1ZSkgeworICAgICAgICByZXR1cm4gaXNBbGwoY29scy5sZW5ndGgsIHByb3BlcnR5LCBudWxsUHJvcGVydHksIG51bGxWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhbGwgY29sdW1ucyBmb3IgdGhlIGtleSBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBbGwoRm9yZWlnbktleSBmaywgaW50IHByb3BlcnR5LCBpbnQgbnVsbFByb3BlcnR5LAorICAgICAgICBib29sZWFuIG51bGxWYWx1ZSkgeworICAgICAgICByZXR1cm4gZmsgIT0gbnVsbCAmJiBpc0FsbChmay5nZXRDb2x1bW5zKCkubGVuZ3RoCisgICAgICAgICAgICArIGZrLmdldENvbnN0YW50Q29sdW1ucygpLmxlbmd0aCwgcHJvcGVydHksIG51bGxQcm9wZXJ0eSwKKyAgICAgICAgICAgIG51bGxWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzZXQoaW50IGNvbCwgYm9vbGVhbiBpcywgaW50IHByb3BlcnR5KSB7CisgICAgICAgIGlmIChpcykKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eSAmIH4oMiA8PCBjb2wpOworICAgICAgICByZXR1cm4gcHJvcGVydHkgfCAoMiA8PCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IGlzIG51bGxhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc051bGxhYmxlKEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbHNbaV0uaXNOb3ROdWxsKCkgfHwgY29sc1tpXS5pc1ByaW1hcnlLZXkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0NvbnN0cmFpbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0NvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZlN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworLyoqCisgKiBBIHRhYmxlIGNvbnN0cmFpbnQuIFRoaXMgY2xhc3MgaXMgY2xvc2VseSBhbGlnbmVkIHdpdGggdGhlIGNvbnN0cmFpbnQKKyAqIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmcm9tIHtAbGluayBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludAorICAgIGV4dGVuZHMgUmVmZXJlbmNlQ291bnRlciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFRhYmxlIF90YWJsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhYmxlTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtYU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9jb2x1bW5OYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2RlZmVycmVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIENvbnN0cmFpbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCwgb3IgbnVsbCBpZiBub25lCisgICAgICogQHBhcmFtIHRhYmxlIHRoZSBsb2NhbCB0YWJsZSBvZiB0aGUgY29uc3RyYWludAorICAgICAqLworICAgIENvbnN0cmFpbnQoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRUYWJsZU5hbWUodGFibGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNldFNjaGVtYU5hbWUodGFibGUuZ2V0U2NoZW1hTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBfdGFibGUgPSB0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29uc3RyYWludCBpcyByZW1vdmVkIGZyb20gdGhlIG93bmluZyB0YWJsZS4KKyAgICAgKiBJbnZhbGlkYXRlcyB0aGUgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgX3RhYmxlID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIG9mIHRoaXMgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7CisgICAgICAgIHJldHVybiBfdGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4ncyB0YWJsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbidzIHRhYmxlIG5hbWUuIFlvdSBjYW4gb25seSBjYWxsIHRoaXMgbWV0aG9kIG9uCisgICAgICogY29sdW1ucyB3aG9zZSB0YWJsZSBvYmplY3QgaXMgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGdldFRhYmxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3RhYmxlTmFtZSA9IG5hbWU7CisgICAgICAgIF9mdWxsTmFtZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4gdGFibGUncyBzY2hlbWEgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYU5hbWUoKSB7CisgICAgICAgIHJldHVybiBfc2NoZW1hTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbiB0YWJsZSdzIHNjaGVtYSBuYW1lLiBZb3UgY2FuIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBvbgorICAgICAqIGNvbHVtbnMgd2hvc2UgdGJhbGUgb2JqZWN0IGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hTmFtZShTdHJpbmcgc2NoZW1hKSB7CisgICAgICAgIGlmIChnZXRUYWJsZSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9zY2hlbWFOYW1lID0gc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uJ3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBfY29sdW1uTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbidzIG5hbWUuIFlvdSBjYW4gb25seSBjYWxsIHRoaXMgbWV0aG9kIG9uCisgICAgICogY29sdW1ucyB3aG9zZSB0YWJsZSBvYmplY3QgaXMgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChnZXRUYWJsZSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9jb2x1bW5OYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50LiBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIGlmIHRoZQorICAgICAqIGNvbnN0cmFpbnQgYWxyZWFkeSBiZWxvbmdzIHRvIGEgdGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZ2V0VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgIF9mdWxsTmFtZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKKyAgICAgICAgaWYgKF9mdWxsTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBnZXRUYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGlmICh0bmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgX2Z1bGxOYW1lID0gdG5hbWUgKyAiLiIgKyBuYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZnVsbE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBjb25zdHJhaW50IGlzIGEgbG9naWNhbCBjb25zdHJhaW50IG9ubHk7IGkuZS4KKyAgICAgKiBpZiBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMb2dpY2FsKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgZGVmZXJyZWQgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmVycmVkKCkgeworICAgICAgICByZXR1cm4gX2RlZmVycmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgdGhpcyBjb25zdHJhaW4gZGVmZXJyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmZXJyZWQoYm9vbGVhbiBkZWZlcnJlZCkgeworICAgICAgICBfZGVmZXJyZWQgPSBkZWZlcnJlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAoZ2V0TmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKyAgICAgICAgcmV0dXJuICI8IiArIG5hbWUudG9Mb3dlckNhc2UoKSArICI+IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9EYXRhU291cmNlRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRGF0YVNvdXJjZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM5NWMyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRGF0YVNvdXJjZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRyaXZlcjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkNvbmZpZ3VyaW5nQ29ubmVjdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuQ29ubmVjdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuRGVjb3JhdGluZ0RhdGFTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlbGVnYXRpbmdEYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5KREJDRXZlbnRDb25uZWN0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5KREJDTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkxvZ2dpbmdDb25uZWN0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHtAbGluayBEYXRhU291cmNlfSBvYmplY3RzLiBUaGUgZmFjdG9yeSB1c2VzIHRoZSBzdXBwbGllZAorICogY29uZmlndXJhdGlvbiB0byBvYnRhaW4gYSAzcmQtcGFydHkgZGF0YXNvdXJjZSBvciB0byBjcmVhdGUgb25lLCBhbmQKKyAqIHRvIHNldHVwIHByZXBhcmVkIHN0YXRlbWVudCBjYWNoaW5nLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChEYXRhU291cmNlRmFjdG9yeS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBkYXRhc291cmNlIHVzaW5nIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0YVNvdXJjZSBuZXdEYXRhU291cmNlKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIGJvb2xlYW4gZmFjdG9yeTIpIHsKKyAgICAgICAgU3RyaW5nIGRyaXZlciA9IChmYWN0b3J5MikgPyBjb25mLmdldENvbm5lY3Rpb24yRHJpdmVyTmFtZSgpCisgICAgICAgICAgICA6IGNvbmYuZ2V0Q29ubmVjdGlvbkRyaXZlck5hbWUoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZHJpdmVyKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1kcml2ZXIiLCBkcml2ZXIpKS4KKyAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBjb25mLmdldENsYXNzUmVzb2x2ZXJJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIoRGF0YVNvdXJjZUZhY3RvcnkuY2xhc3MsIG51bGwpOworICAgICAgICBTdHJpbmcgcHJvcHMgPSAoZmFjdG9yeTIpID8gY29uZi5nZXRDb25uZWN0aW9uMlByb3BlcnRpZXMoKQorICAgICAgICAgICAgOiBjb25mLmdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBkcml2ZXJDbGFzczsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZHJpdmVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGRyaXZlciwgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgICAgIC8vIHRyeSB3aXRoIHRoZSBjb3JlIGNsYXNzIGxvYWRlcgorICAgICAgICAgICAgICAgIGRyaXZlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShkcml2ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRHJpdmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZHJpdmVyQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgRHJpdmVyRGF0YVNvdXJjZSBkcyA9IGNvbmYubmV3RHJpdmVyRGF0YVNvdXJjZUluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgZHMuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgICAgICAgICBkcy5zZXRDb25uZWN0aW9uRHJpdmVyTmFtZShkcml2ZXIpOworICAgICAgICAgICAgICAgIGRzLnNldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKENvbmZpZ3VyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICBwYXJzZVByb3BlcnRpZXMocHJvcHMpKTsKKworICAgICAgICAgICAgICAgIGlmICghZmFjdG9yeTIpIHsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKENvbmZpZ3VyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VQcm9wZXJ0aWVzKGNvbmYuZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0Q29ubmVjdGlvblVSTChjb25mLmdldENvbm5lY3Rpb25VUkwoKSk7CisgICAgICAgICAgICAgICAgICAgIGRzLnNldENvbm5lY3Rpb25Vc2VyTmFtZShjb25mLmdldENvbm5lY3Rpb25Vc2VyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0Q29ubmVjdGlvblBhc3N3b3JkKGNvbmYuZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRzLnNldENvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb25zLnBhcnNlUHJvcGVydGllcyhjb25mLgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcygpKSk7CisgICAgICAgICAgICAgICAgICAgIGRzLnNldENvbm5lY3Rpb25VUkwoY29uZi5nZXRDb25uZWN0aW9uMlVSTCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0Q29ubmVjdGlvblVzZXJOYW1lKGNvbmYuZ2V0Q29ubmVjdGlvbjJVc2VyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0Q29ubmVjdGlvblBhc3N3b3JkKGNvbmYuZ2V0Q29ubmVjdGlvbjJQYXNzd29yZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWUgaWYgdGhlaXIgZHJpdmVyIG5hbWUgaXMgYWN0dWFsbHkgYSBkYXRhIHNvdXJjZQorICAgICAgICAgICAgaWYgKERhdGFTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShkcml2ZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKERhdGFTb3VyY2UpIENvbmZpZ3VyYXRpb25zLm5ld0luc3RhbmNlKGRyaXZlciwKKyAgICAgICAgICAgICAgICAgICAgY29uZiwgcHJvcHMsIERhdGFTb3VyY2UuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpLnNldEZhdGFsKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm90IGEgZHJpdmVyIG9yIGEgZGF0YSBzb3VyY2U7IGRpZQorICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWRyaXZlciIsIGRyaXZlcikpLnNldEZhdGFsKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgbGlzdGVuZXJzIGFuZCBiYXNlIGRlY29yYXRvcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEZWNvcmF0aW5nRGF0YVNvdXJjZSBkZWNvcmF0ZURhdGFTb3VyY2UoRGF0YVNvdXJjZSBkcywKKyAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgYm9vbGVhbiBmYWN0b3J5MikgeworICAgICAgICBPcHRpb25zIG9wdHMgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXMoKGZhY3RvcnkyKQorICAgICAgICAgICAgPyBjb25mLmdldENvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMoKQorICAgICAgICAgICAgOiBjb25mLmdldENvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcygpKTsKKyAgICAgICAgTG9nIGpkYmNMb2cgPSBjb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfSkRCQyk7CisgICAgICAgIExvZyBzcWxMb2cgPSBjb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfU1FMKTsKKworICAgICAgICBEZWNvcmF0aW5nRGF0YVNvdXJjZSBkZHMgPSBuZXcgRGVjb3JhdGluZ0RhdGFTb3VyY2UoZHMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYWRkIHVzZXItZGVmaW5lZCBkZWNvcmF0b3JzCisgICAgICAgICAgICBMaXN0IGRlY29yYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBkZWNvcmF0b3JzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbmYuCisgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbkRlY29yYXRvckluc3RhbmNlcygpKSk7CisKKyAgICAgICAgICAgIC8vIGFkZCBqZGJjIGV2ZW50cyBkZWNvcmF0b3IKKyAgICAgICAgICAgIEpEQkNFdmVudENvbm5lY3Rpb25EZWNvcmF0b3IgZWNkID0KKyAgICAgICAgICAgICAgICBuZXcgSkRCQ0V2ZW50Q29ubmVjdGlvbkRlY29yYXRvcigpOworICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2UoZWNkLCBjb25mLCBvcHRzKTsKKyAgICAgICAgICAgIEpEQkNMaXN0ZW5lcltdIGxpc3RlbmVycyA9IGNvbmYuZ2V0SkRCQ0xpc3RlbmVySW5zdGFuY2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBlY2QuYWRkTGlzdGVuZXIobGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgIGRlY29yYXRvcnMuYWRkKGVjZCk7CisKKyAgICAgICAgICAgIC8vIGFzayB0aGUgRHJpdmVyRGF0YVNvdXJjZSB0byBwcm92aWRlIGFueSBhZGRpdGlvbmFsIGRlY29yYXRvcnMKKyAgICAgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIERyaXZlckRhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBMaXN0IGRlY3MgPSAoKERyaXZlckRhdGFTb3VyY2UpZHMpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3JzKCk7CisgICAgICAgICAgICAgICAgaWYgKGRlY3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9ycy5hZGRBbGwoZGVjcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvZ2dpbmcgZGVjb3JhdG9yCisgICAgICAgICAgICBMb2dnaW5nQ29ubmVjdGlvbkRlY29yYXRvciBsY2QgPSBuZXcgTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3IoKTsKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKGxjZCwgY29uZiwgb3B0cyk7CisgICAgICAgICAgICBsY2QuZ2V0TG9ncygpLnNldEpEQkNMb2coamRiY0xvZyk7CisgICAgICAgICAgICBsY2QuZ2V0TG9ncygpLnNldFNRTExvZyhzcWxMb2cpOworICAgICAgICAgICAgZGVjb3JhdG9ycy5hZGQobGNkKTsKKworICAgICAgICAgICAgZGRzLmFkZERlY29yYXRvcnMoZGVjb3JhdG9ycyk7CisgICAgICAgICAgICByZXR1cm4gZGRzOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgdGhpbmdzIGRlZmVycmVkIHVudGlsIHRoZSBEQkRpY3Rpb25hcnkgaW5zdGFuY2UgaXMgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQGF1dGhvciBTdGV2ZSBLaW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERlY29yYXRpbmdEYXRhU291cmNlIGluc3RhbGxEQkRpY3Rpb25hcnkoREJEaWN0aW9uYXJ5IGRpY3QsCisgICAgICAgIERlY29yYXRpbmdEYXRhU291cmNlIGRzLCBmaW5hbCBKREJDQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBib29sZWFuIGZhY3RvcnkyKSB7CisgICAgICAgIERhdGFTb3VyY2UgaW5uZXIgPSBkcy5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICBpZiAoaW5uZXIgaW5zdGFuY2VvZiBEcml2ZXJEYXRhU291cmNlKQorICAgICAgICAgICAgKChEcml2ZXJEYXRhU291cmNlKSBpbm5lcikuaW5pdERCRGljdGlvbmFyeShkaWN0KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYWRkIHRoZSBkaWN0aW9uYXJ5IGFzIGEgd2FybmluZyBoYW5kbGVyIG9uIHRoZSBsb2dnaW5nCisgICAgICAgICAgICAvLyBkZWNvcmF0b3IKKyAgICAgICAgICAgIENvbm5lY3Rpb25EZWNvcmF0b3IgY2Q7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGRzLmdldERlY29yYXRvcnMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGNkID0gKENvbm5lY3Rpb25EZWNvcmF0b3IpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNkIGluc3RhbmNlb2YgTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICgoTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3IpIGNkKS5zZXRXYXJuaW5nSGFuZGxlcihkaWN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWlzYyBjb25maWd1cmF0aW9uIGNvbm5lY3Rpb24gZGVjb3JhdG9yIChzdGF0ZW1lbnQgdGltZW91dHMsCisgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBpc29sYXRpb24sIGV0YykKKyAgICAgICAgICAgIENvbmZpZ3VyaW5nQ29ubmVjdGlvbkRlY29yYXRvciBjY2QgPQorICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmluZ0Nvbm5lY3Rpb25EZWNvcmF0b3IoKTsKKyAgICAgICAgICAgIGNjZC5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihjb25mLmdldFRyYW5zYWN0aW9uSXNvbGF0aW9uQ29uc3RhbnQoKSk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeTIgfHwgIWNvbmYuaXNDb25uZWN0aW9uRmFjdG9yeU1vZGVNYW5hZ2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRpY3Quc3VwcG9ydHNNdWx0aXBsZU5vbnRyYW5zYWN0aW9uYWxSZXN1bHRTZXRzKQorICAgICAgICAgICAgICAgICAgICBjY2Quc2V0QXV0b0NvbW1pdChCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNjZC5zZXRBdXRvQ29tbWl0KEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPcHRpb25zIG9wdHMgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXMoKGZhY3RvcnkyKQorICAgICAgICAgICAgICAgID8gY29uZi5nZXRDb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzKCkKKyAgICAgICAgICAgICAgICA6IGNvbmYuZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKCkpOworICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2UoY2NkLCBjb25mLCBvcHRzKTsKKyAgICAgICAgICAgIGRzLmFkZERlY29yYXRvcihjY2QpOworCisgICAgICAgICAgICAvLyBhbGxvdyB0aGUgZGJkaWN0aW9uYXJ5IHRvIGRlY29yYXRlIHRoZSBjb25uZWN0aW9uIGZ1cnRoZXIKKyAgICAgICAgICAgIGRzLmFkZERlY29yYXRvcihkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBkczsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGRhdGEgc291cmNlIHdpdGggdGhlIGdpdmVuIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQKKyAgICAgKiBwcmUtY29uZmlndXJlZCBhcyB0aGUgZGVmYXVsdHMgd2hlbiB7QGxpbmsgRGF0YVNvdXJjZSNnZXRDb25uZWN0aW9ufQorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGFTb3VyY2UgZGVmYXVsdHNEYXRhU291cmNlKERhdGFTb3VyY2UgZHMsCisgICAgICAgIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcykgeworICAgICAgICBpZiAodXNlciA9PSBudWxsICYmIHBhc3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkczsKKyAgICAgICAgLy8gYWxzbyBjaGVjayBpZiB0aGV5IGFyZSBib3RoIGJsYW5rIHN0cmluZ3MKKyAgICAgICAgaWYgKCIiLmVxdWFscyh1c2VyKSAmJiAiIi5lcXVhbHMocGFzcykpCisgICAgICAgICAgICByZXR1cm4gZHM7CisgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdHNEYXRhU291cmNlKGRzLCB1c2VyLCBwYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZ2l2ZW4gZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGF0YVNvdXJjZShEYXRhU291cmNlIGRzKSB7CisgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIERlbGVnYXRpbmdEYXRhU291cmNlKQorICAgICAgICAgICAgZHMgPSAoKERlbGVnYXRpbmdEYXRhU291cmNlKSBkcykuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgSW1wbEhlbHBlci5jbG9zZShkcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBkYXRhIHNvdXJjZSB3aXRoIHByZS1jb25maWd1cmVkIGRlZmF1bHQgdXNlciBuYW1lIGFuZCBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0c0RhdGFTb3VyY2UKKyAgICAgICAgZXh0ZW5kcyBEZWxlZ2F0aW5nRGF0YVNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3VzZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYXNzOworCisgICAgICAgIHB1YmxpYyBEZWZhdWx0c0RhdGFTb3VyY2UoRGF0YVNvdXJjZSBkcywgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKSB7CisgICAgICAgICAgICBzdXBlcihkcyk7CisgICAgICAgICAgICBfdXNlciA9IHVzZXI7CisgICAgICAgICAgICBfcGFzcyA9IHBhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbm5lY3Rpb24oX3VzZXIsIF9wYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29ubmVjdGlvbih1c2VyLCBwYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0RyaXZlckRhdGFTb3VyY2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0RyaXZlckRhdGFTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVmMmZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRHJpdmVyRGF0YVNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKKworLyoqCisgKiBBIERhdGFTb3VyY2UgdGhhdCBhbGxvd3MgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gYmUgc2V0CisgKiBpbnRvIGl0LCBzbyB0aGF0IGl0IGNhbiB3cmFwIGEgSkRCQyBkcml2ZXIgb3Igb3RoZXIgRGF0YVNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgaW50ZXJmYWNlIERyaXZlckRhdGFTb3VyY2UKKyAgICBleHRlbmRzIERhdGFTb3VyY2UgeworCisgICAgLyoqCisgICAgICogSkRCQyBVUkwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTChTdHJpbmcgY29ubmVjdGlvblVSTCk7CisKKyAgICAvKioKKyAgICAgKiBKREJDIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25VUkwoKTsKKworICAgIC8qKgorICAgICAqIERyaXZlciBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Ecml2ZXJOYW1lKFN0cmluZyBjb25uZWN0aW9uRHJpdmVyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBEcml2ZXIgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Ecml2ZXJOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBKREJDIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVXNlck5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Vc2VyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBKREJDIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpOworCisgICAgLyoqCisgICAgICogSkRCQyBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCk7CisKKyAgICAvKioKKyAgICAgKiBKREJDIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKTsKKworICAgIC8qKgorICAgICAqIENsYXNzbG9hZGVyIGZvciBsb2FkaW5nIGRyaXZlciBjbGFzcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBvZiBkYXRhc291cmNlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBvZiBkYXRhc291cmNlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIG9mIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcyk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIG9mIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgYW55IGJ1aWx0LWluIGRlY29yYXRvcnM7IG1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3JzKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHNlbGYgYW5kIGRpY3Rpb25hcnkgb25jZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdERCRGljdGlvbmFyeShEQkRpY3Rpb25hcnkgZGljdCk7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0R5bmFtaWNTY2hlbWFGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9EeW5hbWljU2NoZW1hRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTk1OTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9EeW5hbWljU2NoZW1hRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CisKKy8qKgorICogRmFjdG9yeSB3aG9zZSBzY2hlbWEgZ3JvdXAgZHluYW1pY2FsbHkgZmlsbHMgaXRzZWxmIHdpdGggaW5mb3JtYXRpb24KKyAqIGFzIG1hcHBpbmdzIHZhbGlkYXRlIHRoZW1zZWx2ZXMgaW4gdGhlaXIgPGNvZGU+bWFwPC9jb2RlPiBtZXRob2QuCisgKiBUYWJsZXMgYXJlIGFkZGVkIHdoZW4ge0BsaW5rIFNjaGVtYUdyb3VwI2ZpbmRUYWJsZX0gaXMgY2FsbGVkLiBDb2x1bW5zCisgKiBhcmUgYWRkZWQgdG8gdGFibGVzIHdoZW4ge0BsaW5rIFRhYmxlI2dldENvbHVtbn0gaXMgY2FsbGVkLiBBbmQgdGhlCisgKiBjb2x1bW4gdHlwZXMgYXJlIHNldCB3aGVuIHtAbGluayBDb2x1bW4jaXNDb21wYXRpYmxlfSBpcyBjYWxsZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIER5bmFtaWNTY2hlbWFGYWN0b3J5CisgICAgZXh0ZW5kcyBTY2hlbWFHcm91cAorICAgIGltcGxlbWVudHMgU2NoZW1hRmFjdG9yeSwgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IERCRGljdGlvbmFyeSBfZGljdCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtYSA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBqY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICAgICAgX2RpY3QgPSBqY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBfc2NoZW1hID0gamNvbmYuZ2V0U2NoZW1hKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRDb25maWd1cmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTY2hlbWFHcm91cCByZWFkU2NoZW1hKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVNjaGVtYShTY2hlbWFHcm91cCBzY2hlbWEpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzS25vd25UYWJsZShUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZmluZFRhYmxlKHRhYmxlKSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzS25vd25UYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZmluZFRhYmxlKG5hbWUpICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFRhYmxlIGZpbmRUYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVGFibGUgdGFibGUgPSBzdXBlci5maW5kVGFibGUobmFtZSk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlOworCisgICAgICAgIC8vIGlmIGZ1bGwgbmFtZSwgc3BsaXQKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gbmFtZTsKKyAgICAgICAgaW50IGRvdElkeCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdElkeCAhPSAtMSkgeworICAgICAgICAgICAgc2NoZW1hTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCk7CisgICAgICAgICAgICB0YWJsZU5hbWUgPSBuYW1lLnN1YnN0cmluZyhkb3RJZHggKyAxKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzY2hlbWFOYW1lID0gX3NjaGVtYTsKKworICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKHNjaGVtYU5hbWUpOworICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICBzY2hlbWEgPSBhZGRTY2hlbWEoc2NoZW1hTmFtZSk7CisgICAgICAgIHJldHVybiBzY2hlbWEuYWRkVGFibGUodGFibGVOYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVGFibGUgbmV3VGFibGUoU3RyaW5nIG5hbWUsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljVGFibGUobmFtZSwgc2NoZW1hKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29sdW1uIG5ld0NvbHVtbihTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljQ29sdW1uKG5hbWUsIHRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWJsZSB0eXBlIHRoYXQgYWRkcyBjb2x1bW5zIHdoZW4ge0BsaW5rICNnZXRDb2x1bW59IGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEeW5hbWljVGFibGUKKyAgICAgICAgZXh0ZW5kcyBUYWJsZSB7CisKKyAgICAgICAgcHVibGljIER5bmFtaWNUYWJsZShTdHJpbmcgbmFtZSwgU2NoZW1hIHNjaGVtYSkgeworICAgICAgICAgICAgc3VwZXIobmFtZSwgc2NoZW1hKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2x1bW4gZ2V0Q29sdW1uKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBDb2x1bW4gY29sID0gc3VwZXIuZ2V0Q29sdW1uKG5hbWUpOworICAgICAgICAgICAgaWYgKGNvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2w7CisgICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1uIHR5cGUgdGhhdCBzZXRzIGl0cyB0eXBlIHdoZW4ge0BsaW5rICNpc0NvbXBhdGlibGV9IGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIER5bmFtaWNDb2x1bW4KKyAgICAgICAgZXh0ZW5kcyBDb2x1bW4geworCisgICAgICAgIHB1YmxpYyBEeW5hbWljQ29sdW1uKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlKGludCB0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIGludCBzaXplLAorICAgICAgICAgICAgaW50IGRlY2ltYWxzKSB7CisgICAgICAgICAgICBpZiAoZ2V0VHlwZSgpICE9IFR5cGVzLk9USEVSKQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pc0NvbXBhdGlibGUodHlwZSwgdHlwZU5hbWUsIHNpemUsIGRlY2ltYWxzKTsKKworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuVkFSQ0hBUiAmJiBzaXplIDw9IDApCisgICAgICAgICAgICAgICAgc2l6ZSA9IF9kaWN0LmNoYXJhY3RlckNvbHVtblNpemU7CisgICAgICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICAgICAgc2V0U2l6ZShzaXplKTsKKyAgICAgICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNldFR5cGVOYW1lKHR5cGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChkZWNpbWFscyA+PSAwKQorICAgICAgICAgICAgICAgIHNldERlY2ltYWxEaWdpdHMoZGVjaW1hbHMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9GaWxlU2NoZW1hRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRmlsZVNjaGVtYUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZkZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRmlsZVNjaGVtYUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247CisKKy8qKgorICogRmFjdG9yeSB0aGF0IHVzZXMgYW4gWE1MIHNjaGVtYSBmaWxlIHRvIGNvbnN0cnVjdCB0aGUgc3lzdGVtIHNjaGVtYS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgRmlsZVNjaGVtYUZhY3RvcnkKKyAgICBpbXBsZW1lbnRzIFNjaGVtYUZhY3RvcnksIENvbmZpZ3VyYWJsZSB7CisKKyAgICBwcml2YXRlIEpEQkNDb25maWd1cmF0aW9uIF9jb25mID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfZmlsZU5hbWUgPSAicGFja2FnZS5zY2hlbWEiOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2xvYWRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFhNTCByZXNvdXJjZSBkZWZpbmluZyB0aGlzIHNjaGVtYS4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5wYWNrYWdlLnNjaGVtYTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlKCkgeworICAgICAgICByZXR1cm4gX2ZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgWE1MIHJlc291cmNlIGRlZmluaW5nIHRoaXMgc2NoZW1hLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPnBhY2thZ2Uuc2NoZW1hPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBfZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRGaWxlfS4gUmV0YWluZWQgZm9yCisgICAgICogYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldEZpbGUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgX2NvbmYgPSAoSkRCQ0NvbmZpZ3VyYXRpb24pIGNvbmY7CisgICAgICAgIF9sb2FkZXIgPSBfY29uZi5nZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS4KKyAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKGdldENsYXNzKCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHcm91cCByZWFkU2NoZW1hKCkgeworICAgICAgICBVUkwgdXJsID0gX2xvYWRlci5nZXRSZXNvdXJjZShfZmlsZU5hbWUpOworICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNjaGVtYUdyb3VwKCk7CisKKyAgICAgICAgWE1MU2NoZW1hUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxTY2hlbWFQYXJzZXIoX2NvbmYpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHVybCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VyLmdldFNjaGVtYUdyb3VwKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVTY2hlbWEoU2NoZW1hR3JvdXAgc2NoZW1hKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVzLmdldEZpbGUoX2ZpbGVOYW1lLCBfbG9hZGVyKTsKKyAgICAgICAgWE1MU2NoZW1hU2VyaWFsaXplciBzZXIgPSBuZXcgWE1MU2NoZW1hU2VyaWFsaXplcihfY29uZik7CisgICAgICAgIHNlci5hZGRBbGwoc2NoZW1hKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlci5zZXJpYWxpemUoZmlsZSwgc2VyLlBSRVRUWSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0ZvcmVpZ25LZXkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0ZvcmVpZ25LZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFmMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRm9yZWlnbktleS5qYXZhCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuT2JqZWN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuU3RyaW5nRGlzdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkYXRhYmFzZSBmb3JlaWduIGtleTsgbWF5IGJlIGEgbG9naWNhbCBrZXkgd2l0aCBubworICogZGF0YWJhc2UgcmVwcmVzZW50YXRpb24uIFRoaXMgY2xhc3MgY2FuIGFsc28gcmVwcmVzZW50IGEgcGFydGlhbCBrZXksCisgKiBhbGlnbmluZyB3aXRoIHtAbGluayBEYXRhYmFzZU1ldGFEYXRhfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgRm9yZWlnbktleQorICAgIGV4dGVuZHMgQ29uc3RyYWludCB7CisKKyAgICAvKioKKyAgICAgKiBMb2dpY2FsIGZvcmVpZ24ga2V5OyBsaW5rcyBjb2x1bW5zLCBidXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgYWN0aW9uCisgICAgICogd2hlbiB0aGUgam9pbmVkIHByaW1hcnkga2V5IGNvbHVtbnMgYXJlIG1vZGlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9OT05FID0gMTsKKworICAgIC8qKgorICAgICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBqb2luZWQgcHJpbWFyeSBrZXkgY29sdW1ucyBhcmUgbW9kaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1JFU1RSSUNUID0gMjsKKworICAgIC8qKgorICAgICAqIENhc2NhZGUgYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgam9pbmVkIHByaW1hcnkga2V5IGNvbHVtbnMgdG8KKyAgICAgKiB0aGlzIHRhYmxlLiBJZiB0aGUgam9pbmVkIHByaW1hcnkga2V5IHJvdyBpcyBkZWxldGVkLCB0aGUgcm93IGluIHRoaXMKKyAgICAgKiB0YWJsZSB3aWxsIGFsc28gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0FTQ0FERSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBOdWxsIHRoZSBsb2NhbCBjb2x1bW5zIGlmIHRoZSBqb2luZWQgcHJpbWFyeSBrZXkgY29sdW1ucyBhcmUgbW9kaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX05VTEwgPSA0OworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhbCBjb2x1bW5zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGlmIHRoZSBwcmltYXJ5IGtleQorICAgICAqIGNvbHVtbnMgYXJlIG1vZGlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9ERUZBVUxUID0gNTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gCisgICAgICAgIExvY2FsaXplci5mb3JQYWNrYWdlKEZvcmVpZ25LZXkuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX3BrVGFibGVOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfcGtTY2hlbWFOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfcGtDb2x1bW5OYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc2VxID0gMDsKKworICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcCBfam9pbnMgPSBudWxsOworICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcCBfam9pbnNQSyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwIF9jb25zdHMgPSBudWxsOworICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcCBfY29uc3RzUEsgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9kZWxBY3Rpb24gPSBBQ1RJT05fTk9ORTsKKyAgICBwcml2YXRlIGludCBfdXBBY3Rpb24gPSBBQ1RJT05fTk9ORTsKKyAgICBwcml2YXRlIGludCBfaW5kZXggPSAwOworCisgICAgLy8gY2FjaGVkIGl0ZW1zCisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfbG9jYWxzID0gbnVsbDsKKyAgICBwcml2YXRlIENvbHVtbltdIF9wa3MgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0W10gX2NvbnN0VmFscyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfY29uc3RDb2xzID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdFtdIF9jb25zdFZhbHNQSyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfY29uc3RDb2xzUEsgPSBudWxsOworICAgIHByaXZhdGUgVGFibGUgX3BrVGFibGUgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBfYXV0b0Fzc2lnbiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5IGFjdGlvbiBjb25zdGFudCBmb3IgdGhlIGdpdmVuIGFjdGlvbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEFjdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICJub25lIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9OT05FOworICAgICAgICBpZiAoImNhc2NhZGUiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gQUNUSU9OX0NBU0NBREU7CisgICAgICAgIGlmICgiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBBQ1RJT05fREVGQVVMVDsKKyAgICAgICAgaWYgKCJyZXN0cmljdCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKQorICAgICAgICAgICAgfHwgImV4Y2VwdGlvbiIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBBQ1RJT05fUkVTVFJJQ1Q7CisgICAgICAgIGlmICgibnVsbCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBBQ1RJT05fTlVMTDsKKworICAgICAgICAvLyBub3QgYSByZWNvZ25pemVkIGFjdGlvbjsgY2hlY2sgZm9yIHR5cG8KKyAgICAgICAgTGlzdCByZWNvZ25pemVkID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117ICJub25lIiwgImV4Y2VwdGlvbiIsCisgICAgICAgICAgICAicmVzdHJpY3QiLCAiY2FzY2FkZSIsICJudWxsIiwgImRlZmF1bHQiLCB9KTsKKyAgICAgICAgU3RyaW5nIGNsb3Nlc3QgPSBTdHJpbmdEaXN0YW5jZS5nZXRDbG9zZXN0TGV2ZW5zaHRlaW5EaXN0YW5jZShuYW1lLAorICAgICAgICAgICAgcmVjb2duaXplZCwgLjVGKTsKKworICAgICAgICBTdHJpbmcgbXNnOworICAgICAgICBpZiAoY2xvc2VzdCAhPSBudWxsKQorICAgICAgICAgICAgbXNnID0gX2xvYy5nZXQoImJhZC1may1hY3Rpb24taGludCIsIG5hbWUsIGNsb3Nlc3QsIHJlY29nbml6ZWQpCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXNnID0gX2xvYy5nZXQoImJhZC1may1hY3Rpb24iLCBuYW1lLCByZWNvZ25pemVkKS5nZXRNZXNzYWdlKCk7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5IGFjdGlvbiBuYW1lIGZvciB0aGUgZ2l2ZW4gYWN0aW9uIGNvbnN0YW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbk5hbWUoaW50IGFjdGlvbikgeworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBBQ1RJT05fTk9ORToKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vbmUiOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fUkVTVFJJQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJyZXN0cmljdCI7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9DQVNDQURFOgorICAgICAgICAgICAgICAgIHJldHVybiAiY2FzY2FkZSI7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9ERUZBVUxUOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGVmYXVsdCI7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9OVUxMOgorICAgICAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoYWN0aW9uKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZvcmVpZ24ga2V5IG5hbWUsIGlmIGFueQorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgbG9jYWwgdGFibGUgb2YgdGhlIGZvcmVpZ24ga2V5CisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25LZXkoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHRhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2ljYWwoKSB7CisgICAgICAgIHJldHVybiBfZGVsQWN0aW9uID09IEFDVElPTl9OT05FOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb2YgdGhpcyBrZXkgYXJlIGF1dG8taW5jcmVtZW50aW5nLCBvcgorICAgICAqIHdoZXRoZXIgdGhleSB0aGVtc2VsdmVzIGFyZSBtZW1iZXJzIG9mIGEgZm9yZWlnbiBrZXkgd2hvJ3MgcHJpbWFyeSBrZXkKKyAgICAgKiBpcyBhdXRvLWluY3JlbWVudGluZyAocmVjdXJzaW5nIHRvIGFyYml0cmFyeSBkZXB0aCkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5QXV0b0Fzc2lnbmVkKCkgeworICAgICAgICBpZiAoX2F1dG9Bc3NpZ24gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfYXV0b0Fzc2lnbi5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGlzUHJpbWFyeUtleUF1dG9Bc3NpZ25lZChuZXcgQXJyYXlMaXN0KDMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgdG8gY2FsY3VsYXRlIHdoZXRoZXIgdGhpcyBmb3JlaWduIGtleSBkZXBlbmRzIG9uIGF1dG8tYXNzaWduZWQgCisgICAgICogY29sdW1ucy4gIFJlY3Vyc2VzIGFwcHJvcHJpYXRlbHkgaWYgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgdGhpcyBrZXkKKyAgICAgKiBqb2lucyB0byBhcmUgdGhlbXNlbHZlcyBtZW1iZXJzIG9mIGEgZm9yZWlnbiBrZXkgdGhhdCBpcyBkZXBlbmRlbnQgb24KKyAgICAgKiBhdXRvLWFzc2lnbmVkIGNvbHVtbnMuICBDYWNoZXMgY2FsY3VsYXRlZCBhdXRvLWFzc2lnbiB2YWx1ZSBhcyBhIHNpZGUgCisgICAgICogZWZmZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlZW4gdHJhY2sgc2VlbiBmb3JlaWduIGtleXMgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gaW4KKyAgICAgKiB0aGUgY2FzZSBvZiBmb3JlaWduIGtleSBjeWNsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQcmltYXJ5S2V5QXV0b0Fzc2lnbmVkKExpc3Qgc2VlbikgeworICAgICAgICBpZiAoX2F1dG9Bc3NpZ24gIT0gbnVsbCkgCisgICAgICAgICAgICByZXR1cm4gX2F1dG9Bc3NpZ24uYm9vbGVhblZhbHVlKCk7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBfYXV0b0Fzc2lnbiA9IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmlzQXV0b0Fzc2lnbmVkKCkpIHsKKyAgICAgICAgICAgICAgICBfYXV0b0Fzc2lnbiA9IEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZvcmVpZ25LZXlbXSBma3MgPSBfcGtUYWJsZS5nZXRGb3JlaWduS2V5cygpOworICAgICAgICBzZWVuLmFkZCh0aGlzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZrcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmICghZmtzW2pdLmNvbnRhaW5zQ29sdW1uKGNvbHNbaV0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlZW4uY29udGFpbnMoZmtzW2pdKQorICAgICAgICAgICAgICAgICAgICAmJiBma3Nbal0uaXNQcmltYXJ5S2V5QXV0b0Fzc2lnbmVkKHNlZW4pKSB7CisgICAgICAgICAgICAgICAgICAgIF9hdXRvQXNzaWduID0gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfYXV0b0Fzc2lnbiA9IEJvb2xlYW4uRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5VGFibGVOYW1lKCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IGdldFByaW1hcnlLZXlUYWJsZSgpOworICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiBfcGtUYWJsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IHRhYmxlLiBZb3UgY2FuIG9ubHkgc2V0IHRoZSBwcmltYXJ5CisgICAgICoga2V5IHRhYmxlIG5hbWUgb24gZm9yZWlnbiBrZXlzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGpvaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5VGFibGVOYW1lKFN0cmluZyBwa1RhYmxlTmFtZSkgeworICAgICAgICBpZiAoZ2V0UHJpbWFyeUtleVRhYmxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3BrVGFibGVOYW1lID0gcGtUYWJsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IHRhYmxlJ3Mgc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleVNjaGVtYU5hbWUoKSB7CisgICAgICAgIFRhYmxlIHRhYmxlID0gZ2V0UHJpbWFyeUtleVRhYmxlKCk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldFNjaGVtYU5hbWUoKTsKKyAgICAgICAgcmV0dXJuIF9wa1NjaGVtYU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IHRhYmxlJ3Mgc2NoZW1hLiBZb3UgY2FuIG9ubHkgc2V0IHRoZQorICAgICAqIHByaW1hcnkga2V5IHNjaGVtYSBuYW1lIG9uIGZvcmVpZ24ga2V5cyB0aGF0IGhhdmUgbm90IGFscmVhZHkgYmVlbgorICAgICAqIGpvaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5U2NoZW1hTmFtZShTdHJpbmcgcGtTY2hlbWFOYW1lKSB7CisgICAgICAgIGlmIChnZXRQcmltYXJ5S2V5VGFibGUoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfcGtTY2hlbWFOYW1lID0gcGtTY2hlbWFOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wa0NvbHVtbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGNvbHVtbi4gWW91IGNhbiBvbmx5IHNldCB0aGUKKyAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSBvbiBmb3JlaWduIGtleXMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4KKyAgICAgKiBqb2luZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoU3RyaW5nIHBrQ29sdW1uTmFtZSkgeworICAgICAgICBpZiAoZ2V0UHJpbWFyeUtleVRhYmxlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3BrQ29sdW1uTmFtZSA9IHBrQ29sdW1uTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VxdWVuY2Ugb2YgdGhpcyBqb2luIGluIHRoZSBmb3JlaWduIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEtleVNlcXVlbmNlKCkgeworICAgICAgICByZXR1cm4gX3NlcTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VxdWVuY2Ugb2YgdGhpcyBqb2luIGluIHRoZSBmb3JlaWduIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTZXF1ZW5jZShpbnQgc2VxKSB7CisgICAgICAgIF9zZXEgPSBzZXE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWxldGUgYWN0aW9uIGZvciB0aGUga2V5LiBXaWxsIGJlIG9uZSBvZjoKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9OT05FfSwge0BsaW5rICNBQ1RJT05fUkVTVFJJQ1R9LAorICAgICAqIHtAbGluayAjQUNUSU9OX0NBU0NBREV9LCB7QGxpbmsgI0FDVElPTl9OVUxMfSwge0BsaW5rICNBQ1RJT05fREVGQVVMVH0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWxldGVBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBfZGVsQWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVsZXRlIGFjdGlvbiBmb3IgdGhlIGtleS4gTXVzdCBiZSBvbmUgb2Y6CisgICAgICoge0BsaW5rICNBQ1RJT05fTk9ORX0sIHtAbGluayAjQUNUSU9OX1JFU1RSSUNUfSwKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9DQVNDQURFfSwge0BsaW5rICNBQ1RJT05fTlVMTH0sIHtAbGluayAjQUNUSU9OX0RFRkFVTFR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbGV0ZUFjdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIF9kZWxBY3Rpb24gPSBhY3Rpb247CisgICAgICAgIGlmIChhY3Rpb24gPT0gQUNUSU9OX05PTkUpCisgICAgICAgICAgICBfdXBBY3Rpb24gPSBBQ1RJT05fTk9ORTsKKyAgICAgICAgZWxzZSBpZiAoX3VwQWN0aW9uID09IEFDVElPTl9OT05FKQorICAgICAgICAgICAgX3VwQWN0aW9uID0gQUNUSU9OX1JFU1RSSUNUOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXBkYXRlIGFjdGlvbiBmb3IgdGhlIGtleS4gV2lsbCBiZSBvbmUgb2Y6CisgICAgICoge0BsaW5rICNBQ1RJT05fTk9ORX0sIHtAbGluayAjQUNUSU9OX1JFU1RSSUNUfSwKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9DQVNDQURFfSwge0BsaW5rICNBQ1RJT05fTlVMTH0sIHtAbGluayAjQUNUSU9OX0RFRkFVTFR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VXBkYXRlQWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX3VwQWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXBkYXRlIGFjdGlvbiBmb3IgdGhlIGtleS4gTXVzdCBiZSBvbmUgb2Y6CisgICAgICoge0BsaW5rICNBQ1RJT05fTk9ORX0sIHtAbGluayAjQUNUSU9OX1JFU1RSSUNUfSwKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9DQVNDQURFfSwge0BsaW5rICNBQ1RJT05fTlVMTH0sIHtAbGluayAjQUNUSU9OX0RFRkFVTFR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZUFjdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIF91cEFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fTk9ORSkKKyAgICAgICAgICAgIF9kZWxBY3Rpb24gPSBBQ1RJT05fTk9ORTsKKyAgICAgICAgZWxzZSBpZiAoX2RlbEFjdGlvbiA9PSBBQ1RJT05fTk9ORSkKKyAgICAgICAgICAgIF9kZWxBY3Rpb24gPSBBQ1RJT05fUkVTVFJJQ1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIDAtYmFzZWQgaW5kZXggaW4gdGhlIG93bmluZyB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgdGFibGUuaW5kZXhGb3JlaWduS2V5cygpOworICAgICAgICByZXR1cm4gX2luZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9yZWlnbiBrZXkncyAwLWJhc2VkIGluZGV4IGluIHRoZSBvd25pbmcgdGFibGUuCisgICAgICovCisgICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgX2luZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gam9pbmVkIHRvIHRoZSBnaXZlbiBsb2NhbCBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIENvbHVtbiBnZXRQcmltYXJ5S2V5Q29sdW1uKENvbHVtbiBsb2NhbCkgeworICAgICAgICByZXR1cm4gKF9qb2lucyA9PSBudWxsKSA/IG51bGwgOiAoQ29sdW1uKSBfam9pbnMuZ2V0KGxvY2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsIGNvbHVtbiBqb2luZWQgdG8gdGhlIGdpdmVuIHByaW1hcnkga2V5IGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uIGdldENvbHVtbihDb2x1bW4gcGspIHsKKyAgICAgICAgcmV0dXJuIChfam9pbnNQSyA9PSBudWxsKSA/IG51bGwgOiAoQ29sdW1uKSBfam9pbnNQSy5nZXQocGspOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIGxvY2FsIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldENvbnN0YW50KENvbHVtbiBsb2NhbCkgeworICAgICAgICByZXR1cm4gKF9jb25zdHMgPT0gbnVsbCkgPyBudWxsIDogX2NvbnN0cy5nZXQobG9jYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIHByaW1hcnkga2V5IGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByaW1hcnlLZXlDb25zdGFudChDb2x1bW4gcGspIHsKKyAgICAgICAgcmV0dXJuIChfY29uc3RzUEsgPT0gbnVsbCkgPyBudWxsIDogX2NvbnN0c1BLLmdldChwayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbCBjb2x1bW5zIGluIHRoZSBmb3JlaWduIGtleSBsb2NhbCB0YWJsZSBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKF9sb2NhbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9sb2NhbHMgPSAoX2pvaW5zID09IG51bGwpID8gU2NoZW1hcy5FTVBUWV9DT0xVTU5TIDogKENvbHVtbltdKQorICAgICAgICAgICAgICAgIF9qb2lucy5rZXlTZXQoKS50b0FycmF5KG5ldyBDb2x1bW5bX2pvaW5zLnNpemUoKV0pOworICAgICAgICByZXR1cm4gX2xvY2FsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgbG9jYWwgY29sdW1ucworICAgICAqIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0Q29uc3RhbnRDb2x1bW5zfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q29uc3RhbnRzKCkgeworICAgICAgICBpZiAoX2NvbnN0VmFscyA9PSBudWxsKQorICAgICAgICAgICAgX2NvbnN0VmFscyA9IChfY29uc3RzID09IG51bGwpID8gU2NoZW1hcy5FTVBUWV9WQUxVRVMKKyAgICAgICAgICAgICAgICA6IF9jb25zdHMudmFsdWVzKCkudG9BcnJheSgpOworICAgICAgICByZXR1cm4gX2NvbnN0VmFsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucworICAgICAqIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1uc30uCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldFByaW1hcnlLZXlDb25zdGFudHMoKSB7CisgICAgICAgIGlmIChfY29uc3RWYWxzUEsgPT0gbnVsbCkKKyAgICAgICAgICAgIF9jb25zdFZhbHNQSyA9IChfY29uc3RzUEsgPT0gbnVsbCkgPyBTY2hlbWFzLkVNUFRZX1ZBTFVFUworICAgICAgICAgICAgICAgIDogX2NvbnN0c1BLLnZhbHVlcygpLnRvQXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIF9jb25zdFZhbHNQSzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmsgaW5jbHVkZXMgdGhlIGdpdmVuIGxvY2FsIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbHVtbihDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBfam9pbnMgIT0gbnVsbCAmJiBfam9pbnMuY29udGFpbnNLZXkoY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmsgaW5jbHVkZXMgdGhlIGdpdmVuIHByaW1hcnkga2V5IGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ByaW1hcnlLZXlDb2x1bW4oQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gX2pvaW5zUEsgIT0gbnVsbCAmJiBfam9pbnNQSy5jb250YWluc0tleShjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmayBpbmNsdWRlcyB0aGUgZ2l2ZW4gbG9jYWwgY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29uc3RhbnRDb2x1bW4oQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gX2NvbnN0cyAhPSBudWxsICYmIF9jb25zdHMuY29udGFpbnNLZXkoY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmsgaW5jbHVkZXMgdGhlIGdpdmVuIHByaW1hcnkga2V5IGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbnN0YW50UHJpbWFyeUtleUNvbHVtbihDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBfY29uc3RzUEsgIT0gbnVsbCAmJiBfY29uc3RzUEsuY29udGFpbnNLZXkoY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcmVpZ24gY29sdW1ucyBpbiB0aGUgZm9yZWlnbiBrZXksIGluIGpvaW4tb3JkZXIgd2l0aAorICAgICAqIHRoZSByZXN1bHQgb2Yge0BsaW5rICNnZXRDb2x1bW5zfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7CisgICAgICAgIGlmIChfcGtzID09IG51bGwpCisgICAgICAgICAgICBfcGtzID0gKF9qb2lucyA9PSBudWxsKSA/IFNjaGVtYXMuRU1QVFlfQ09MVU1OUyA6IChDb2x1bW5bXSkKKyAgICAgICAgICAgICAgICBfam9pbnMudmFsdWVzKCkudG9BcnJheShuZXcgQ29sdW1uW19qb2lucy5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIF9wa3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbCBjb2x1bW5zIHRoYXQgd2UgbGluayB0byB1c2luZyBjb25zdGFudCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbltdIGdldENvbnN0YW50Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKF9jb25zdENvbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9jb25zdENvbHMgPSAoX2NvbnN0cyA9PSBudWxsKSA/IFNjaGVtYXMuRU1QVFlfQ09MVU1OUyA6IChDb2x1bW5bXSkKKyAgICAgICAgICAgICAgICBfY29uc3RzLmtleVNldCgpLnRvQXJyYXkobmV3IENvbHVtbltfY29uc3RzLnNpemUoKV0pOworICAgICAgICByZXR1cm4gX2NvbnN0Q29sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgdGhhdCB3ZSBsaW5rIHRvIHVzaW5nIGNvbnN0YW50IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKF9jb25zdENvbHNQSyA9PSBudWxsKQorICAgICAgICAgICAgX2NvbnN0Q29sc1BLID0gKF9jb25zdHNQSyA9PSBudWxsKSA/IFNjaGVtYXMuRU1QVFlfQ09MVU1OUyA6CisgICAgICAgICAgICAgICAgKENvbHVtbltdKSBfY29uc3RzUEsua2V5U2V0KCkudG9BcnJheQorICAgICAgICAgICAgICAgICAgICAobmV3IENvbHVtbltfY29uc3RzUEsuc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBfY29uc3RDb2xzUEs7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb3JlaWduIGtleSdzIGpvaW5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5zKENvbHVtbltdIGNvbHMsIENvbHVtbltdIHBrQ29scykgeworICAgICAgICBDb2x1bW5bXSBjdXIgPSBnZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVtb3ZlSm9pbihjdXJbaV0pOworCisgICAgICAgIGlmIChjb2xzICE9IG51bGwpCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgam9pbihjb2xzW2ldLCBwa0NvbHNbaV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9yZWlnbiBrZXkncyBjb25zdGFudCBqb2lucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25zdGFudEpvaW5zKE9iamVjdFtdIGNvbnN0cywgQ29sdW1uW10gcGtDb2xzKSB7CisgICAgICAgIENvbHVtbltdIGN1ciA9IGdldENvbnN0YW50UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVKb2luKGN1cltpXSk7CisKKyAgICAgICAgaWYgKGNvbnN0cyAhPSBudWxsKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgam9pbkNvbnN0YW50KGNvbnN0c1tpXSwgcGtDb2xzW2ldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZvcmVpZ24ga2V5J3MgY29uc3RhbnQgam9pbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uc3RhbnRKb2lucyhDb2x1bW5bXSBjb2xzLCBPYmplY3RbXSBjb25zdHMpIHsKKyAgICAgICAgQ29sdW1uW10gY3VyID0gZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVtb3ZlSm9pbihjdXJbaV0pOworCisgICAgICAgIGlmIChjb25zdHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGpvaW5Db25zdGFudChjb2xzW2ldLCBjb25zdHNbaV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpvaW4gYSBsb2NhbCBjb2x1bW4gdG8gYSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgYW5vdGhlciB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqb2luKENvbHVtbiBsb2NhbCwgQ29sdW1uIHRvUEspIHsKKyAgICAgICAgaWYgKCFPYmplY3RVdGlscy5lcXVhbHMobG9jYWwuZ2V0VGFibGUoKSwgZ2V0VGFibGUoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ0YWJsZS1taXNtYXRjaCIsCisgICAgICAgICAgICAgICAgbG9jYWwuZ2V0VGFibGUoKSwgZ2V0VGFibGUoKSkpOworCisgICAgICAgIFRhYmxlIHBrVGFibGUgPSB0b1BLLmdldFRhYmxlKCk7CisgICAgICAgIGlmIChfcGtUYWJsZSAhPSBudWxsICYmICFfcGtUYWJsZS5lcXVhbHMocGtUYWJsZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJmay1taXNtYXRjaCIsCisgICAgICAgICAgICAgICAgcGtUYWJsZSwgX3BrVGFibGUpKTsKKworICAgICAgICBfcGtUYWJsZSA9IHBrVGFibGU7CisgICAgICAgIGlmIChfam9pbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9qb2lucyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9qb2lucy5wdXQobG9jYWwsIHRvUEspOworICAgICAgICBpZiAoX2pvaW5zUEsgPT0gbnVsbCkKKyAgICAgICAgICAgIF9qb2luc1BLID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgX2pvaW5zUEsucHV0KHRvUEssIGxvY2FsKTsKKworICAgICAgICAvLyBmb3JjZSByZS1jYWNoZQorICAgICAgICBfbG9jYWxzID0gbnVsbDsKKyAgICAgICAgX3BrcyA9IG51bGw7CisgICAgICAgIGlmIChfYXV0b0Fzc2lnbiA9PSBCb29sZWFuLkZBTFNFKQorICAgICAgICAgICAgX2F1dG9Bc3NpZ24gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpvaW4gYSBjb25zdGFudCB2YWx1ZSB0byBhIHByaW1hcnkga2V5IGNvbHVtbiBvZiBhbm90aGVyIHRhYmxlLiBUaGUKKyAgICAgKiBjb25zdGFudCBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqb2luQ29uc3RhbnQoT2JqZWN0IHZhbCwgQ29sdW1uIHRvUEspIHsKKyAgICAgICAgVGFibGUgcGtUYWJsZSA9IHRvUEsuZ2V0VGFibGUoKTsKKyAgICAgICAgaWYgKF9wa1RhYmxlICE9IG51bGwgJiYgIV9wa1RhYmxlLmVxdWFscyhwa1RhYmxlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImZrLW1pc21hdGNoIiwKKyAgICAgICAgICAgICAgICBwa1RhYmxlLCBfcGtUYWJsZSkpOworCisgICAgICAgIF9wa1RhYmxlID0gcGtUYWJsZTsKKyAgICAgICAgaWYgKF9jb25zdHNQSyA9PSBudWxsKQorICAgICAgICAgICAgX2NvbnN0c1BLID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgX2NvbnN0c1BLLnB1dCh0b1BLLCB2YWwpOworCisgICAgICAgIC8vIGZvcmNlIHJlLWNhY2hlCisgICAgICAgIF9jb25zdFZhbHNQSyA9IG51bGw7CisgICAgICAgIF9jb25zdENvbHNQSyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSm9pbiBhIGNvbnN0YW50IHZhbHVlIHRvIGEgbG9jYWwgY29sdW1uIG9mIHRoaXMgdGFibGUuIFRoZQorICAgICAqIGNvbnN0YW50IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpvaW5Db25zdGFudChDb2x1bW4gY29sLCBPYmplY3QgdmFsKSB7CisgICAgICAgIGlmIChfY29uc3RzID09IG51bGwpCisgICAgICAgICAgICBfY29uc3RzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgX2NvbnN0cy5wdXQoY29sLCB2YWwpOworCisgICAgICAgIC8vIGZvcmNlIHJlLWNhY2hlCisgICAgICAgIF9jb25zdFZhbHMgPSBudWxsOworICAgICAgICBfY29uc3RDb2xzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGpvaW5zIGlub2x2aW5nIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpvaW4gd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBwYXJ0IG9mIHRoZSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVKb2luKENvbHVtbiBjb2wpIHsKKyAgICAgICAgYm9vbGVhbiByZW1kID0gZmFsc2U7CisgICAgICAgIE9iamVjdCByZW07CisKKyAgICAgICAgaWYgKF9qb2lucyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW0gPSBfam9pbnMucmVtb3ZlKGNvbCk7CisgICAgICAgICAgICBpZiAocmVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfbG9jYWxzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfcGtzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfam9pbnNQSy5yZW1vdmUocmVtKTsKKyAgICAgICAgICAgICAgICByZW1kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChfam9pbnNQSyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW0gPSBfam9pbnNQSy5yZW1vdmUoY29sKTsKKyAgICAgICAgICAgIGlmIChyZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9sb2NhbHMgPSBudWxsOworICAgICAgICAgICAgICAgIF9wa3MgPSBudWxsOworICAgICAgICAgICAgICAgIF9qb2lucy5yZW1vdmUocmVtKTsKKyAgICAgICAgICAgICAgICByZW1kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChfY29uc3RzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfY29uc3RzLnJlbW92ZShjb2wpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfY29uc3RWYWxzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfY29uc3RDb2xzID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZW1kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChfY29uc3RzUEsgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9jb25zdHNQSy5jb250YWluc0tleShjb2wpKSB7CisgICAgICAgICAgICAgICAgX2NvbnN0c1BLLnJlbW92ZShjb2wpOworICAgICAgICAgICAgICAgIF9jb25zdFZhbHNQSyA9IG51bGw7CisgICAgICAgICAgICAgICAgX2NvbnN0Q29sc1BLID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZW1kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoX2pvaW5zID09IG51bGwgfHwgX2pvaW5zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICYmIChfY29uc3RzUEsgPT0gbnVsbCB8fCBfY29uc3RzUEsuaXNFbXB0eSgpKSkKKyAgICAgICAgICAgIF9wa1RhYmxlID0gbnVsbDsKKyAgICAgICAgaWYgKHJlbWQgJiYgX2F1dG9Bc3NpZ24gPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgX2F1dG9Bc3NpZ24gPSBudWxsOworICAgICAgICByZXR1cm4gcmVtZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YWJsZSB0aGlzIGZvcmVpZ24ga2V5IGlzIGxpbmtpbmcgdG8sIGlmIGl0IGlzIGtub3duIHlldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgZ2V0UHJpbWFyeUtleVRhYmxlKCkgeworICAgICAgICByZXR1cm4gX3BrVGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmIGFsbCBjb2x1bW5zIGluIHRoaXMga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZkNvbHVtbnMoKSB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBnZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvbHNbaV0ucmVmKCk7CisgICAgICAgIGNvbHMgPSBnZXRDb25zdGFudENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29sc1tpXS5yZWYoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXJlZiBhbGwgY29sdW1ucyBpbiB0aGlzIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXJlZkNvbHVtbnMoKSB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBnZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvbHNbaV0uZGVyZWYoKTsKKyAgICAgICAgY29scyA9IGdldENvbnN0YW50Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb2xzW2ldLmRlcmVmKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yZWlnbiBrZXlzIGFyZSBlcXVhbCBpZiB0aGUgc2F0aXNmeSB0aGUgZXF1YWxpdHkgY29uc3RyYWludHMgb2YKKyAgICAgKiB7QGxpbmsgQ29uc3RyYWludH0gYW5kIHRoZXkgaGF2ZSB0aGUgc2FtZSBsb2NhbCBhbmQgcHJpbWFyeSBrZXkKKyAgICAgKiBjb2x1bW5zIGFuZCBhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzRm9yZWlnbktleShGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIGlmIChmayA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChmayA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChnZXREZWxldGVBY3Rpb24oKSAhPSBmay5nZXREZWxldGVBY3Rpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGlzRGVmZXJyZWQoKSAhPSBmay5pc0RlZmVycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFjb2x1bW5zTWF0Y2goZmsuZ2V0Q29sdW1ucygpLCBmay5nZXRQcmltYXJ5S2V5Q29sdW1ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtYXRjaChnZXRDb25zdGFudENvbHVtbnMoKSwgZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1hdGNoKGdldENvbnN0YW50cygpLCBmay5nZXRDb25zdGFudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbWF0Y2goZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpLAorICAgICAgICAgICAgZmsuZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtYXRjaChnZXRQcmltYXJ5S2V5Q29uc3RhbnRzKCksIGZrLmdldFByaW1hcnlLZXlDb25zdGFudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBsb2NhbCBhbmQgZm9yZWlnbiBjb2x1bW5zIG1hdGNoIHRob3NlCisgICAgICogb24gdGhpcyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZCBmb3JlaWduIGtleXMgZ2l2ZW4gb25seQorICAgICAqIGNvbHVtbiBsaW5raW5nIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbHVtbnNNYXRjaChDb2x1bW5bXSBma0NvbHMsIENvbHVtbltdIGZrUEtDb2xzKSB7CisgICAgICAgIHJldHVybiBtYXRjaChnZXRDb2x1bW5zKCksIGZrQ29scykKKyAgICAgICAgICAgICYmIG1hdGNoKGdldFByaW1hcnlLZXlDb2x1bW5zKCksIGZrUEtDb2xzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoKENvbHVtbltdIGNvbHMsIENvbHVtbltdIGZrQ29scykgeworICAgICAgICBpZiAoY29scy5sZW5ndGggIT0gZmtDb2xzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBma0NvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIWhhc0NvbHVtbihjb2xzLCBma0NvbHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDb2x1bW4oQ29sdW1uW10gY29scywgQ29sdW1uIGNvbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoY29sc1tpXS5nZXRGdWxsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoY29sLmdldEZ1bGxOYW1lKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaChPYmplY3RbXSB2YWxzLCBPYmplY3RbXSBma1ZhbHMpIHsKKyAgICAgICAgaWYgKHZhbHMubGVuZ3RoICE9IGZrVmFscy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmICghT2JqZWN0VXRpbHMuZXF1YWxzKHZhbHNbaV0sIGZrVmFsc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9JbmRleC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQzM2MwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvSW5kZXguamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkYXRhYmFzZSBpbmRleC4gQ2FuIGFsc28gcmVwcmVzZW50IGEgcGFydGlhbCBpbmRleCwKKyAqIGFsaWduaW5nIHdpdGgge0BsaW5rIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGF9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFN0ZXBoZW4gS2ltCisgKi8KK3B1YmxpYyBjbGFzcyBJbmRleAorICAgIGV4dGVuZHMgTG9jYWxDb25zdHJhaW50IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfdW5pcXVlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBJbmRleCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBpbmRleAorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgb2YgdGhlIGluZGV4CisgICAgICovCisgICAgcHVibGljIEluZGV4KFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICBzdXBlcihuYW1lLCB0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIFVOSVFVRSBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF91bmlxdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyBpcyBhIFVOSVFVRSBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWUoYm9vbGVhbiB1bmlxdWUpIHsKKyAgICAgICAgX3VuaXF1ZSA9IHVuaXF1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2ljYWwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRleGVzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZSwgdGhlIHNhbWUgY29sdW1ucywgYW5kCisgICAgICogYXJlIGJvdGggdW5pcXVlL25vdCB1bmlxdWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzSW5kZXgoSW5kZXggaWR4KSB7CisgICAgICAgIGlmIChpZHggPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaWR4ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGlzVW5pcXVlKCkgIT0gaWR4LmlzVW5pcXVlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZShnZXRGdWxsTmFtZSgpLCBpZHguZ2V0RnVsbE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBlcXVhbHNMb2NhbENvbnN0cmFpbnQoaWR4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9MYXp5U2NoZW1hRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvTGF6eVNjaGVtYUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTMxNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvTGF6eVNjaGVtYUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworCisvKioKKyAqIEZhY3RvcnkgdGhhdCB1c2VzIGRhdGFiYXNlIG1ldGFkYXRhIHRvIGNvbnN0cnVjdCB0aGUgc3lzdGVtIHNjaGVtYS4KKyAqIFRoZSBsYXp5IHNjaGVtYSBmYWN0b3J5IG9ubHkgbG9hZHMgdGFibGUgZGF0YSBhcyBpdCBpcyByZXF1ZXN0ZWQuIEl0CisgKiBkb2VzIG5vdCBwcm9wZXJseSBzdXBwb3J0IG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgZW50aXJlCisgKiBzY2hlbWEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIExhenlTY2hlbWFGYWN0b3J5CisgICAgZXh0ZW5kcyBTY2hlbWFHcm91cAorICAgIGltcGxlbWVudHMgU2NoZW1hRmFjdG9yeSwgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IEpEQkNDb25maWd1cmF0aW9uIF9jb25mID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDb25uZWN0aW9uIF9jb25uID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBEYXRhYmFzZU1ldGFEYXRhIF9tZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTY2hlbWFHZW5lcmF0b3IgX2dlbiA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIF9pbmRleGVzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wa3MgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZrcyA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJpbWFyeUtleXMoKSB7CisgICAgICAgIHJldHVybiBfcGtzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXlzKGJvb2xlYW4gcGtzKSB7CisgICAgICAgIF9wa3MgPSBwa3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yZWlnbktleXMoKSB7CisgICAgICAgIHJldHVybiBfZmtzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXlzKGJvb2xlYW4gZmtzKSB7CisgICAgICAgIF9ma3MgPSBma3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5kZXhlcygpIHsKKyAgICAgICAgcmV0dXJuIF9pbmRleGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4ZXMoYm9vbGVhbiBpZHgpIHsKKyAgICAgICAgX2luZGV4ZXMgPSBpZHg7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUdyb3VwIHJlYWRTY2hlbWEoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU2NoZW1hKFNjaGVtYUdyb3VwIHNjaGVtYSkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgfQorCisgICAgcHVibGljIFRhYmxlIGZpbmRUYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVGFibGUgdGFibGUgPSBzdXBlci5maW5kVGFibGUobmFtZSk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlOworCisgICAgICAgIGdlbmVyYXRlU2NoZW1hT2JqZWN0KG5hbWUsIHRydWUpOworICAgICAgICByZXR1cm4gc3VwZXIuZmluZFRhYmxlKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTZXF1ZW5jZSBmaW5kU2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFNlcXVlbmNlIHNlcSA9IHN1cGVyLmZpbmRTZXF1ZW5jZShuYW1lKTsKKyAgICAgICAgaWYgKHNlcSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHNlcTsKKworICAgICAgICBnZW5lcmF0ZVNjaGVtYU9iamVjdChuYW1lLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBzdXBlci5maW5kU2VxdWVuY2UobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIHRhYmxlIG9yIHNlcXVlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2NoZW1hT2JqZWN0KFN0cmluZyBuYW1lLCBib29sZWFuIGlzVGFibGUpIHsKKyAgICAgICAgLy8gaWYgZnVsbCBuYW1lLCBzcGxpdAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gbmFtZTsKKworICAgICAgICAvLyBsb29rIGZvciB0aGUgc3RhbmRhcmQgc2NoZW1hIHNlcGFyYXRvci4uLgorICAgICAgICBpbnQgZG90SWR4ID0gbmFtZS5pbmRleE9mKCcuJyk7CisgICAgICAgIC8vIC4uLiBvciB0aGUgZGljdGlvbmFyeSBzY2hlbWEgc2VwYXJhdG9yCisgICAgICAgIGlmIChkb3RJZHggPT0gLTEpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXAgPSBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLmNhdGFsb2dTZXBhcmF0b3I7CisgICAgICAgICAgICBpZiAoISIuIi5lcXVhbHMoc2VwKSkKKyAgICAgICAgICAgICAgICBkb3RJZHggPSBuYW1lLmluZGV4T2Yoc2VwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb3RJZHggIT0gLTEpIHsKKyAgICAgICAgICAgIHNjaGVtYU5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpOworICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKGRvdElkeCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2Ugc2hhcmUgYSBzaW5nbGUgY29ubmVjdGlvbiBhY3Jvc3MgYWxsIHNjaGVtYXMsIHNvIHN5bmNoCisgICAgICAgIC8vIG9uIHRoZSBzY2hlbWEgZ3JvdXAKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBib29sZWFuIGNsb3NlID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBwb3NzaWJsZTsgdGhpcyBtZXRob2QKKyAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSByZWVudHJhbnQgaWYgZ2VuZXJhdGluZyB0aGUgZm9yZWlnbiBrZXlzIGZvcgorICAgICAgICAgICAgICAgIC8vIHRoaXMgdGFibGUgKHNlZSBiZWxvdykgcmVxdWlyZXMgbG9hZGluZyBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICAgLy8gdGFibGVzOyBpbiB0aGF0IGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBzcGF3biBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICAgLy8gY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfY29ubiA9IF9jb25mLmdldERhdGFTb3VyY2UyKG51bGwpLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBfbWV0YSA9IF9jb25uLmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzVGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIHRhYmxlIGZyb20gZGF0YWJhc2UgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgX2dlbi5nZW5lcmF0ZVRhYmxlcyhzY2hlbWFOYW1lLCBvYmplY3ROYW1lLCBfY29ubiwgX21ldGEpOworICAgICAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZSA9IHN1cGVyLmZpbmRUYWJsZShuYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9wa3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlbi5nZW5lcmF0ZVByaW1hcnlLZXlzKHRhYmxlLmdldFNjaGVtYU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0TmFtZSgpLCBfY29ubiwgX21ldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbmRleGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZW4uZ2VuZXJhdGVJbmRleGVzKHRhYmxlLmdldFNjaGVtYU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0TmFtZSgpLCBfY29ubiwgX21ldGEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBmb3JlaWduIGtleXMgZnJvbSB0aGUgdGFibGU7IHRoaXMgbWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCB1cCByZS1jYWxsaW5nIHRoaXMgZ2V0VGFibGUgbWV0aG9kIGlmIHRoZSBmb3JlaWduCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXkgbGlua3MgdG8gYSB0YWJsZSB0aGF0IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZmtzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZW4uZ2VuZXJhdGVGb3JlaWduS2V5cyh0YWJsZS5nZXRTY2hlbWFOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmdldE5hbWUoKSwgX2Nvbm4sIF9tZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBfZ2VuLmdlbmVyYXRlU2VxdWVuY2VzKHNjaGVtYU5hbWUsIG9iamVjdE5hbWUsIF9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgX21ldGEpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwKKyAgICAgICAgICAgICAgICAgICAgX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjbG9zZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2Nvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX2Nvbm4gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gKEpEQkNDb25maWd1cmF0aW9uKSBjb25mOworICAgICAgICBfZ2VuID0gbmV3IFNjaGVtYUdlbmVyYXRvcihfY29uZik7CisgICAgICAgIF9nZW4uc2V0U2NoZW1hR3JvdXAodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRDb25maWd1cmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvTG9jYWxDb25zdHJhaW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9Mb2NhbENvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNiOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvTG9jYWxDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk9iamVjdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworCisvKioKKyAqIENvbnN0cmFpbnQgb3ZlciBsb2NhbCB0YWJsZSBjb2x1bW5zLCBhcyBvcHBvc2VkIHRvIGEgZm9yZWlnbiBrZXkgd2hpY2gKKyAqIHNwYW5zIHRhYmxlcy4gQ29sdW1uIEFQSXMgY2FuIHJlcHJlc2VudCBhIGZ1bGwgY29uc3RyYWludCBvciBhIHBhcnRpYWwKKyAqIGNvbnN0cmFpbnQsIGFsaWduaW5nIHdpdGgge0BsaW5rIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGF9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2NhbENvbnN0cmFpbnQKKyAgICBleHRlbmRzIENvbnN0cmFpbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoTG9jYWxDb25zdHJhaW50LmNsYXNzKTsKKworICAgIHByaXZhdGUgTGlzdCBfY29sTGlzdCA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfY29scyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhbENvbnN0cmFpbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCwgaWYgYW55CisgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSBvZiB0aGUgY29uc3RyYWludAorICAgICAqLworICAgIHB1YmxpYyBMb2NhbENvbnN0cmFpbnQoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29uc3RyYWludCBpcyByZW1vdmVkIGZyb20gaXRzIHRhYmxlLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAvLyByZW1vdmUgYWxsIGNvbHVtbnMKKyAgICAgICAgc2V0Q29sdW1ucyhudWxsKTsKKyAgICAgICAgc3VwZXIucmVtb3ZlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB0aGUgY29sdW1ucyB0aGUgY29uc3RyYWludCBzcGFucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKF9jb2xzID09IG51bGwpCisgICAgICAgICAgICBfY29scyA9IChfY29sTGlzdCA9PSBudWxsKSA/IFNjaGVtYXMuRU1QVFlfQ09MVU1OUworICAgICAgICAgICAgICAgIDogKENvbHVtbltdKSBfY29sTGlzdC50b0FycmF5KG5ldyBDb2x1bW5bX2NvbExpc3Quc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBfY29sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbnMgdGhlIGNvbnN0cmFpbnQgc3BhbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1ucyhDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIENvbHVtbltdIGN1ciA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVDb2x1bW4oY3VyW2ldKTsKKworICAgICAgICBpZiAoY29scyAhPSBudWxsKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGFkZENvbHVtbihjb2xzW2ldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb2x1bW4gdG8gdGhlIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29sdW1uKENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSBudWxsIHx8ICFPYmplY3RVdGlscy5lcXVhbHMoY29sLmdldFRhYmxlKCksIGdldFRhYmxlKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidGFibGUtbWlzbWF0Y2giLAorICAgICAgICAgICAgICAgIGNvbCA9PSBudWxsID8gbnVsbCA6IGNvbC5nZXRUYWJsZSgpLAorICAgICAgICAgICAgICAgIGNvbCA9PSBudWxsID8gbnVsbCA6IGdldFRhYmxlKCkpKTsKKworICAgICAgICBpZiAoX2NvbExpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIF9jb2xMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKKyAgICAgICAgZWxzZSBpZiAoX2NvbExpc3QuY29udGFpbnMoY29sKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBfY29sTGlzdC5hZGQoY29sKTsKKyAgICAgICAgX2NvbHMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNvbHVtbiBmcm9tIHRoZSBjb25zdHJhaW50LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2x1bW4gd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBwYXJ0IG9mIHRoZQorICAgICAqIHByaW1hcnkga2V5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29sdW1uKENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSBudWxsIHx8IF9jb2xMaXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChfY29sTGlzdC5yZW1vdmUoY29sKSkgeworICAgICAgICAgICAgX2NvbHMgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwayBpbmNsdWRlcyB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29sdW1uKENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSBudWxsIHx8IF9jb2xMaXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfY29sTGlzdC5jb250YWlucyhjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZiBhbGwgY29sdW1ucyBpbiB0aGlzIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmQ29sdW1ucygpIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29sc1tpXS5yZWYoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXJlZiBhbGwgY29sdW1ucyBpbiB0aGlzIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVyZWZDb2x1bW5zKCkgeworICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb2xzW2ldLmRlcmVmKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbHVtbnMgbWF0Y2ggdGhlIGNvbHVtbnMgb2YgdGhpcyBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbHVtbnNNYXRjaChDb2x1bW5bXSBvY29scykgeworICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggIT0gb2NvbHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9jb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFoYXNDb2x1bW4oY29scywgb2NvbHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBleGlzdHMgaW4gdGhlIGFycmF5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ29sdW1uKENvbHVtbltdIGNvbHMsIENvbHVtbiBjb2wpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbHNbaV0uZ2V0RnVsbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGNvbC5nZXRGdWxsTmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2x1bW5zIG9mIHRoaXMgY29uc3RyYWludCBtYXRjaGVzIHRoYXQgb2YKKyAgICAgKiB0aGUgZ2l2ZW4gb25lLiBUaGUgY29uc3RyYWludHMgYXJlIG5vdCBjb21wYXJlZCBvbiBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsc0xvY2FsQ29uc3RyYWludChMb2NhbENvbnN0cmFpbnQgbGMpIHsKKyAgICAgICAgaWYgKGxjID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGxjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBjb2x1bW5zTWF0Y2gobGMuZ2V0Q29sdW1ucygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9OYW1lU2V0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9OYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjYzdjMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL05hbWVTZXQuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIE5hbWUgc2V0cyB0cmFjayB3aGF0IG5hbWVzIGhhdmUgYmVlbiB0YWtlbiwgaWdub3JpbmcgY2FzZS4KKyAqIHtAbGluayBTY2hlbWFHcm91cH1zIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBmb3IgdGFibGVzLCBpbmRleGVzLCBhbmQKKyAqIGNvbnN0cmFpbnRzOyB7QGxpbmsgVGFibGV9cyBpbXBsZW1lbnQgaXQgZm9yIHRoZWlyIGNvbHVtbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIE5hbWVTZXQKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKE5hbWVTZXQuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTZXQgX25hbWVzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGluIHVzZSBhbHJlYWR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZVRha2VuKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIF9uYW1lcyAhPSBudWxsICYmIF9uYW1lcy5jb250YWlucyhuYW1lLnRvVXBwZXJDYXNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gYWRkIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBhZGQKKyAgICAgKiBAcGFyYW0gdmFsaWRhdGUgaWYgdHJ1ZSwgbnVsbCBvciBlbXB0eSBuYW1lcyB3aWxsIG5vdCBiZSBhY2NlcHRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZE5hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsaWRhdGUpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpIHsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbmFtZSIsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gdW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSBuYW1lcywgYmVjYXVzZSBkaWZmZXJlbnQKKyAgICAgICAgLy8gREJzIHVzZSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBmb3IgY29tcG9uZW50cywgYW5kIGl0IHdvdWxkIGJlCisgICAgICAgIC8vIGRpZmZpY3VsdCB0byBmaW5kIGEgc2NoZW1lIHRoYXQgZml0cyBhbGwgYW5kIGlzIHN0aWxsIHVzZWZ1bAorICAgICAgICBpZiAoX25hbWVzID09IG51bGwpCisgICAgICAgICAgICBfbmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBfbmFtZXMuYWRkKG5hbWUudG9VcHBlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBfbmFtZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9uYW1lcy5yZW1vdmUobmFtZS50b1VwcGVyQ2FzZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9QcmltYXJ5S2V5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9QcmltYXJ5S2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2NmQzYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1ByaW1hcnlLZXkuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgdGFibGUgcHJpbWFyeSBrZXkuIEl0IGNhbiBhbHNvIHJlcHJlc2VudCBhIHBhcnRpYWwga2V5LAorICogYWxpZ25pbmcgd2l0aCB0aGUga2V5IGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmcm9tCisgKiB7QGxpbmsgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YX0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFByaW1hcnlLZXkKKyAgICBleHRlbmRzIExvY2FsQ29uc3RyYWludCB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gX2xvZ2ljYWwgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFByaW1hcnlLZXkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXksIGlmIGFueQorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgb2YgdGhlIHByaW1hcnkga2V5CisgICAgICovCisgICAgcHVibGljIFByaW1hcnlLZXkoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHRhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2ljYWwoKSB7CisgICAgICAgIHJldHVybiBfbG9naWNhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dpY2FsKGJvb2xlYW4gbG9naWNhbCkgeworICAgICAgICBfbG9naWNhbCA9IGxvZ2ljYWw7CisgICAgfQorCisgICAgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIC8vIGNoZWNrIGFsbCBmb3JlaWduIGtleXMgaW4gdGhlIHNjaGVtYSBncm91cCwgcmVtb3Zpbmcgb25lcyB0aGF0CisgICAgICAgIC8vIHJlZmVyZW5jZSB0aGlzIHByaW1hcnkga2V5CisgICAgICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKKyAgICAgICAgaWYgKHRhYmxlICE9IG51bGwgJiYgdGFibGUuZ2V0U2NoZW1hKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgdGFibGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hR3JvdXAoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBGb3JlaWduS2V5W10gZmtzID0gdGFibGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hR3JvdXAoKS4KKyAgICAgICAgICAgICAgICBmaW5kRXhwb3J0ZWRGb3JlaWduS2V5cyh0aGlzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZrc1tpXS5nZXRUYWJsZSgpLnJlbW92ZUZvcmVpZ25LZXkoZmtzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5yZW1vdmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb2x1bW4oQ29sdW1uIGNvbCkgeworICAgICAgICBzdXBlci5hZGRDb2x1bW4oY29sKTsKKyAgICAgICAgY29sLnNldFByaW1hcnlLZXkodHJ1ZSk7CisgICAgICAgIGlmICghX2xvZ2ljYWwpCisgICAgICAgICAgICBjb2wuc2V0Tm90TnVsbCh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RydWN0dXJlIG9mIHRoaXMgcHJpbWFyeSBrZXkgbWF0Y2hlcyB0aGF0IG9mCisgICAgICogdGhlIGdpdmVuIG9uZSAoc2FtZSB0YWJsZSwgc2FtZSBjb2x1bW5zKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNQcmltYXJ5S2V5KFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgcmV0dXJuIGVxdWFsc0xvY2FsQ29uc3RyYWludChwayk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvUmVmZXJlbmNlQ291bnRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvUmVmZXJlbmNlQ291bnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTVjZTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9SZWZlcmVuY2VDb3VudGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBTb21lIHNjaGVtYSBjb21wb25lbnRzIGNvdW50IHJlZmVyZW5jZXMgc28gdGhhdCB1bnVzZWQgY29tcG9uZW50cworICogY2FuIGJlIGRldGVjdGVkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFJlZmVyZW5jZUNvdW50ZXIgCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBpbnQgX2NvdW50ID0gMDsKKworICAgIHB1YmxpYyBpbnQgZ2V0UmVmQ291bnQoKSB7CisgICAgICAgIHJldHVybiBfY291bnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmKCkgeworICAgICAgICBfY291bnQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXJlZigpIHsKKyAgICAgICAgX2NvdW50LS07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9TY2hlbWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBmZDQxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hLmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkYXRhYmFzZSBzY2hlbWEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFNjaGVtYQorICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZSwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFNjaGVtYUdyb3VwIF9ncm91cCA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXAgX3RhYmxlTWFwID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcCBfc2VxTWFwID0gbnVsbDsKKworICAgIC8vIGNhY2hlCisgICAgcHJpdmF0ZSBUYWJsZVtdIF90YWJsZXMgPSBudWxsOworICAgIHByaXZhdGUgU2VxdWVuY2VbXSBfc2VxcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWEoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc2NoZW1hIG5hbWUsIGlmIGFueQorICAgICAqIEBwYXJhbSBncm91cCB0aGUgc2NoZW1hJ3Mgb3duaW5nIGdyb3VwCisgICAgICovCisgICAgcHVibGljIFNjaGVtYShTdHJpbmcgbmFtZSwgU2NoZW1hR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgX2dyb3VwID0gZ3JvdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHNjaGVtYSBpcyByZW1vdmVkIGZyb20gaXRzIGdyb3VwLiBJbnZhbGlkYXRlcyB0aGUKKyAgICAgKiBzY2hlbWEgYW5kIHJlbW92ZXMgYWxsIGl0cyBtZW1iZXIgdGFibGVzLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICBUYWJsZVtdIHRhYnMgPSBnZXRUYWJsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVtb3ZlVGFibGUodGFic1tpXSk7CisgICAgICAgIFNlcXVlbmNlW10gc2VxcyA9IGdldFNlcXVlbmNlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVTZXF1ZW5jZShzZXFzW2ldKTsKKyAgICAgICAgX2dyb3VwID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFHcm91cCBnZXRTY2hlbWFHcm91cCgpIHsKKyAgICAgICAgcmV0dXJuIF9ncm91cDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2NoZW1hLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIGZvciBzY2hlbWFzCisgICAgICogbm90IGF0dGFjaGVkIHRvIGEgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZ2V0U2NoZW1hR3JvdXAoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfbmFtZSA9IFN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzY2hlbWEncyB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIFRhYmxlW10gZ2V0VGFibGVzKCkgeworICAgICAgICBpZiAoX3RhYmxlcyA9PSBudWxsKQorICAgICAgICAgICAgX3RhYmxlcyA9IChfdGFibGVNYXAgPT0gbnVsbCkgPyBuZXcgVGFibGVbMF0gOiAoVGFibGVbXSkKKyAgICAgICAgICAgICAgICBfdGFibGVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgVGFibGVbX3RhYmxlTWFwLnNpemUoKV0pOworICAgICAgICByZXR1cm4gX3RhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgZ2V0VGFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBfdGFibGVNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKFRhYmxlKSBfdGFibGVNYXAuZ2V0KG5hbWUudG9VcHBlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdGFibGUgdG8gdGhlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgYWRkVGFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSBnZXRTY2hlbWFHcm91cCgpOworICAgICAgICBUYWJsZSB0YWI7CisgICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7CisgICAgICAgICAgICBncm91cC5hZGROYW1lKG5hbWUsIHRydWUpOworICAgICAgICAgICAgdGFiID0gZ3JvdXAubmV3VGFibGUobmFtZSwgdGhpcyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGFiID0gbmV3IFRhYmxlKG5hbWUsIHRoaXMpOworICAgICAgICBpZiAoX3RhYmxlTWFwID09IG51bGwpCisgICAgICAgICAgICBfdGFibGVNYXAgPSBuZXcgVHJlZU1hcCgpOworICAgICAgICBfdGFibGVNYXAucHV0KG5hbWUudG9VcHBlckNhc2UoKSwgdGFiKTsKKyAgICAgICAgX3RhYmxlcyA9IG51bGw7CisgICAgICAgIHJldHVybiB0YWI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiB0YWJsZSBmcm9tIHRoZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhYmxlIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBub3QgaW4gdGhlIHNjaGVtYQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVRhYmxlKFRhYmxlIHRhYikgeworICAgICAgICBpZiAodGFiID09IG51bGwgfHwgX3RhYmxlTWFwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgVGFibGUgY3VyID0gKFRhYmxlKSBfdGFibGVNYXAuZ2V0KHRhYi5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIGlmICghY3VyLmVxdWFscyh0YWIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIF90YWJsZU1hcC5yZW1vdmUodGFiLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgX3RhYmxlcyA9IG51bGw7CisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gZ2V0U2NoZW1hR3JvdXAoKTsKKyAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpCisgICAgICAgICAgICBncm91cC5yZW1vdmVOYW1lKHRhYi5nZXROYW1lKCkpOworICAgICAgICB0YWIucmVtb3ZlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcG9ydCBhIHRhYmxlIGZyb20gYW5vdGhlciBzY2hlbWEuCSBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcworICAgICAqIDxzdHJvbmc+bm90PC9zdHJvbmc+IGltcG9ydCBmb3JlaWduIGtleXMsIGluZGV4ZXMsIG9yIHVuaXF1ZSBjb25zdHJhaW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgaW1wb3J0VGFibGUoVGFibGUgdGFibGUpIHsKKyAgICAgICAgaWYgKHRhYmxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBUYWJsZSBjb3B5ID0gYWRkVGFibGUodGFibGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29weS5pbXBvcnRDb2x1bW4oY29sc1tpXSk7CisKKyAgICAgICAgY29weS5pbXBvcnRQcmltYXJ5S2V5KHRhYmxlLmdldFByaW1hcnlLZXkoKSk7CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1hJ3Mgc2VxdWVuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXF1ZW5jZVtdIGdldFNlcXVlbmNlcygpIHsKKyAgICAgICAgaWYgKF9zZXFzID09IG51bGwpCisgICAgICAgICAgICBfc2VxcyA9IChfc2VxTWFwID09IG51bGwpID8gbmV3IFNlcXVlbmNlWzBdIDogKFNlcXVlbmNlW10pCisgICAgICAgICAgICAgICAgX3NlcU1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBTZXF1ZW5jZVtfc2VxTWFwLnNpemUoKV0pOworICAgICAgICByZXR1cm4gX3NlcXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFNlcXVlbmNlIGdldFNlcXVlbmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgX3NlcU1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiAoU2VxdWVuY2UpIF9zZXFNYXAuZ2V0KG5hbWUudG9VcHBlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2VxdWVuY2UgdG8gdGhlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxdWVuY2UgYWRkU2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSBnZXRTY2hlbWFHcm91cCgpOworICAgICAgICBTZXF1ZW5jZSBzZXE7CisgICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7CisgICAgICAgICAgICBncm91cC5hZGROYW1lKG5hbWUsIHRydWUpOworICAgICAgICAgICAgc2VxID0gZ3JvdXAubmV3U2VxdWVuY2UobmFtZSwgdGhpcyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc2VxID0gbmV3IFNlcXVlbmNlKG5hbWUsIHRoaXMpOworICAgICAgICBpZiAoX3NlcU1hcCA9PSBudWxsKQorICAgICAgICAgICAgX3NlcU1hcCA9IG5ldyBUcmVlTWFwKCk7CisgICAgICAgIF9zZXFNYXAucHV0KG5hbWUudG9VcHBlckNhc2UoKSwgc2VxKTsKKyAgICAgICAgX3NlcXMgPSBudWxsOworICAgICAgICByZXR1cm4gc2VxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gc2VxdWVuY2UgZnJvbSB0aGUgc2NoZW1hLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXF1ZW5jZSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoZSBzY2hlbWEKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVTZXF1ZW5jZShTZXF1ZW5jZSBzZXEpIHsKKyAgICAgICAgaWYgKHNlcSA9PSBudWxsIHx8IF9zZXFNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTZXF1ZW5jZSBjdXIgPSAoU2VxdWVuY2UpIF9zZXFNYXAuZ2V0KHNlcS5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIGlmICghY3VyLmVxdWFscyhzZXEpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIF9zZXFNYXAucmVtb3ZlKHNlcS5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIF9zZXFzID0gbnVsbDsKKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSBnZXRTY2hlbWFHcm91cCgpOworICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKKyAgICAgICAgICAgIGdyb3VwLnJlbW92ZU5hbWUoc2VxLmdldE5hbWUoKSk7CisgICAgICAgIHNlcS5yZW1vdmUoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wb3J0IGEgc2VxdWVuY2UgZnJvbSBhbm90aGVyIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxdWVuY2UgaW1wb3J0U2VxdWVuY2UoU2VxdWVuY2Ugc2VxKSB7CisgICAgICAgIGlmIChzZXEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFNlcXVlbmNlIGNvcHkgPSBhZGRTZXF1ZW5jZShzZXEuZ2V0TmFtZSgpKTsKKyAgICAgICAgY29weS5zZXRJbml0aWFsVmFsdWUoc2VxLmdldEluaXRpYWxWYWx1ZSgpKTsKKyAgICAgICAgY29weS5zZXRJbmNyZW1lbnQoc2VxLmdldEluY3JlbWVudCgpKTsKKyAgICAgICAgY29weS5zZXRBbGxvY2F0ZShzZXEuZ2V0QWxsb2NhdGUoKSk7CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlcikgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIG90aGVyTmFtZSA9ICgoU2NoZW1hKSBvdGhlcikuZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsICYmIG90aGVyTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKG90aGVyTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbmFtZS5jb21wYXJlVG8ob3RoZXJOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NjaGVtYUZhY3RvcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NjaGVtYUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUwMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHtAbGluayBTY2hlbWFHcm91cH1zLiBVc2VycyBjYW4gcGx1ZyBpbiB0aGVpciBvd24gZmFjdG9yeQorICogaW1wbGVtZW50YXRpb24sIG9yIHJlbHkgb24gdGhlIG9uZXMgcHJvdmlkZWQuIE1vc3Qgc2NoZW1hIGZhY3RvcnlpZXMKKyAqIHdpbGwgcHJvYmFibHkgaW1wbGVtZW50IHtAbGluayBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlfSB0bworICogcmVjZWl2ZSB0aGUgc3lzdGVtIGNvbmdpZ3VyYXRpb24gb24gY29uc3RydWN0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NoZW1hRmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtYSBncm91cCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IG1vZGVsIGFuZCBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgcmVhZFNjaGVtYSgpOworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBzY2hlbWEgZ3JvdXAgYWZ0ZXIgY2hhbmdlcyBtYXkgaGF2ZSBiZWVuIG1hZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NoZW1hIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhlIGVudGlyZSBzeXN0ZW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZVNjaGVtYShTY2hlbWFHcm91cCBzY2hlbWEpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hR2VuZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9TY2hlbWFHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTMyM2JiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw5MzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBUaGUgU2NoZW1hR2VuZXJhdG9yIGNyZWF0ZXMge0BsaW5rIFNjaGVtYX1zIG1hdGNoaW5nIHRoZSBjdXJyZW50CisgKiBkYXRhYmFzZS4gQWxsIHNjaGVtYXMgYXJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHtAbGluayBTY2hlbWFHcm91cH0uCisgKiAgTm90ZSB0aGF0IHRhYmxlcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICJPUEVOSlBBXyIgd2lsbCBiZSBub3QgYmUgYWRkZWQKKyAqIHRvIHRoZSBkYXRhYmFzZSBzY2hlbWEuIFRoaXMgZW5hYmxlcyB0aGUgY3JlYXRpb24gb2Ygc3BlY2lhbCB0YWJsZXMKKyAqIHRoYXQgd2lsbCBuZXZlciBiZSBkcm9wcGVkIGJ5IHRoZSB7QGxpbmsgU2NoZW1hVG9vbH0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChTY2hlbWFHZW5lcmF0b3IuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlIF9kczsKKyAgICBwcml2YXRlIGZpbmFsIERCRGljdGlvbmFyeSBfZGljdDsKKyAgICBwcml2YXRlIGZpbmFsIExvZyBfbG9nOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W11bXSBfYWxsb3dlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2luZGV4ZXMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfZmtzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3BrcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9zZXFzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX29wZW5qcGFUYWJsZXMgPSB0cnVlOworICAgIHByaXZhdGUgU2NoZW1hR3JvdXAgX2dyb3VwID0gbnVsbDsKKworICAgIHByaXZhdGUgTGlzdCBfbGlzdGVuZXJzID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc2NoZW1hT2JqZWN0cyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25mIGNvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gdGhlIGRhdGEgc3RvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yKEpEQkNDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgLy8gbm90ZTogd2UgY2Fubm90IGFzc2VydCBkZXZlbG9wZXIgY2FwYWJpbGl0aWVzIGluIHRoaXMgdG9vbCBsaWtlCisgICAgICAgIC8vIHdlIG5vcm1hbGx5IGRvIGJlY2F1c2UgdGhpcyBjbGFzcyBpcyBhbHNvIHVzZWQgYXQgcnVudGltZQorCisgICAgICAgIF9kcyA9IGNvbmYuZ2V0RGF0YVNvdXJjZTIobnVsbCk7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfU0NIRU1BKTsKKworICAgICAgICAvLyBjYWNoZSB0aGlzIG5vdyBzbyB0aGF0IGlmIHRoZSBjb25uIHBvb2wgb25seSBoYXMgMSBjb25uZWN0aW9uIHdlCisgICAgICAgIC8vIGRvbid0IGNvbmZsaWN0IGxhdGVyIHdpdGggdGhlIG9wZW4gZGF0YWJhc2VtZXRhZGF0YSBjb25uZWN0aW9uCisgICAgICAgIF9kaWN0ID0gY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIHRhYmxlIG9mIGFsbG93ZWQgc2NoZW1hIGFuZCB0YWJsZXMgdG8gcmVmbGVjdCBvbgorICAgICAgICBfYWxsb3dlZCA9IHBhcnNlU2NoZW1hc0xpc3QoY29uZi5nZXRTY2hlbWFzTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGxpc3Qgb2Ygc2NoZW1hIG5hbWVzIGFuZCB0YWJsZSBuYW1lcyAod2hlcmUgdGFibGUgbmFtZXMKKyAgICAgKiBhcmUgYWx3YXlzIG9mIHRoZSBmb3JtIHNjaGVtYS50YWJsZSwgb3IganVzdCAudGFibGUgaWYgdGhlIHNjaGVtYSBpcworICAgICAqIHVua25vd24pLCBjcmVhdGVzIGEgdGFibGUgbWFwcGluZyBzY2hlbWEgbmFtZSB0byB0YWJsZSBsaXN0LiBSZXR1cm5zCisgICAgICogbnVsbCBpZiBubyBhcmdzIGFyZSBnaXZlbi4gSWYgbm8gdGFibGVzIGFyZSBnaXZlbiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogc2NoZW1hLCBtYXBzIHRoZSBzY2hlbWEgbmFtZSB0byBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdW10gcGFyc2VTY2hlbWFzTGlzdChTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIE1hcCBzY2hlbWFzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgU3RyaW5nIHNjaGVtYSwgdGFibGU7CisgICAgICAgIGludCBkb3RJZHg7CisgICAgICAgIENvbGxlY3Rpb24gdGFibGVzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRvdElkeCA9IGFyZ3NbaV0uaW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGRvdElkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNjaGVtYSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgdGFibGUgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChkb3RJZHggPT0gMCkgeworICAgICAgICAgICAgICAgIHNjaGVtYSA9IG51bGw7CisgICAgICAgICAgICAgICAgdGFibGUgPSBhcmdzW2ldLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2NoZW1hID0gYXJnc1tpXS5zdWJzdHJpbmcoMCwgZG90SWR4KTsKKyAgICAgICAgICAgICAgICB0YWJsZSA9IGFyZ3NbaV0uc3Vic3RyaW5nKGRvdElkeCArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBqdXN0IGEgc2NoZW1hIG5hbWUsIG1hcCBzY2hlbWEgdG8gbnVsbAorICAgICAgICAgICAgaWYgKHRhYmxlID09IG51bGwgJiYgIXNjaGVtYXMuY29udGFpbnNLZXkoc2NoZW1hKSkKKyAgICAgICAgICAgICAgICBzY2hlbWFzLnB1dChzY2hlbWEsIG51bGwpOworICAgICAgICAgICAgZWxzZSBpZiAodGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRhYmxlcyA9IChDb2xsZWN0aW9uKSBzY2hlbWFzLmdldChzY2hlbWEpOworICAgICAgICAgICAgICAgIGlmICh0YWJsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLnB1dChzY2hlbWEsIHRhYmxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhYmxlcy5hZGQodGFibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0W11bXSBwYXJzZWQgPSBuZXcgT2JqZWN0W3NjaGVtYXMuc2l6ZSgpXVsyXTsKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzY2hlbWFzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIHRhYmxlcyA9IChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICBwYXJzZWRbaWR4XVswXSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgaWYgKHRhYmxlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhcnNlZFtpZHhdWzFdID0gdGFibGVzLnRvQXJyYXkobmV3IFN0cmluZ1t0YWJsZXMuc2l6ZSgpXSk7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIGluZGV4ZXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmRleGVzKCkgeworICAgICAgICByZXR1cm4gX2luZGV4ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgaW5kZXhlcyBzaG91bGQgYmUgZ2VuZXJhdGVkLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4ZXMoYm9vbGVhbiBpbmRleGVzKSB7CisgICAgICAgIF9pbmRleGVzID0gaW5kZXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciBmb3JlaWduIGtleXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGb3JlaWduS2V5cygpIHsKKyAgICAgICAgcmV0dXJuIF9ma3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgZm9yZWlnbiBrZXlzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleXMoYm9vbGVhbiBma3MpIHsKKyAgICAgICAgX2ZrcyA9IGZrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciBwcmltYXJ5IGtleXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcmltYXJ5S2V5cygpIHsKKyAgICAgICAgcmV0dXJuIF9wa3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgcHJpbWFyeSBrZXlzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleXMoYm9vbGVhbiBwa3MpIHsKKyAgICAgICAgX3BrcyA9IHBrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciBzZXF1ZW5jZXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZXF1ZW5jZXMoKSB7CisgICAgICAgIHJldHVybiBfc2VxczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBzZXF1ZW5jZXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZXMoYm9vbGVhbiBzZXFzKSB7CisgICAgICAgIF9zZXFzID0gc2VxczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIGluZm8gb24gc3BlY2lhbCB0YWJsZXMgdXNlZCBieSBPcGVuSlBBIGNvbXBvbmVudHMKKyAgICAgKiBmb3IgYm9va2tlZXBpbmcuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3BlbkpQQVRhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIF9vcGVuanBhVGFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgaW5mbyBvbiBzcGVjaWFsIHRhYmxlcyB1c2VkIGJ5IE9wZW5KUEEgY29tcG9uZW50cworICAgICAqIGZvciBib29ra2VlcGluZy4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVuSlBBVGFibGVzKGJvb2xlYW4gb3BlbmpwYVRhYmxlcykgeworICAgICAgICBfb3BlbmpwYVRhYmxlcyA9IG9wZW5qcGFUYWJsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHNjaGVtYSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgZ2V0U2NoZW1hR3JvdXAoKSB7CisgICAgICAgIGlmIChfZ3JvdXAgPT0gbnVsbCkKKyAgICAgICAgICAgIF9ncm91cCA9IG5ldyBTY2hlbWFHcm91cCgpOworICAgICAgICByZXR1cm4gX2dyb3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2NoZW1hIGdyb3VwIHRvIGFkZCBnZW5lcmF0ZWQgc2NoZW1hcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFHcm91cChTY2hlbWFHcm91cCBncm91cCkgeworICAgICAgICBfZ3JvdXAgPSBncm91cDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhbGwgc2NoZW1hcyBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFRoaXMgbWV0aG9kIGFsc28KKyAgICAgKiBjYWxscyB7QGxpbmsgI2dlbmVyYXRlSW5kZXhlc30sIHtAbGluayAjZ2VuZXJhdGVQcmltYXJ5S2V5c30sIGFuZAorICAgICAqIHtAbGluayAjZ2VuZXJhdGVGb3JlaWduS2V5c30gYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVNjaGVtYXMoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmlyZUdlbmVyYXRpb25FdmVudChfbG9jLmdldCgiZ2VuZXJhdGluZy1zY2hlbWFzIikpOworICAgICAgICBnZW5lcmF0ZVNjaGVtYXMobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIHNjaGVtYXMgYW5kL29yIHRhYmxlcyBuYW1lZCBpbiB0aGUgZ2l2ZW4gc3RyaW5ncy4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYWxscyB7QGxpbmsgI2dlbmVyYXRlSW5kZXhlc30sCisgICAgICoge0BsaW5rICNnZW5lcmF0ZVByaW1hcnlLZXlzfSwgYW5kIHtAbGluayAjZ2VuZXJhdGVGb3JlaWduS2V5c30KKyAgICAgKiBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hcyhTdHJpbmdbXSBzY2hlbWFzQW5kVGFibGVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmlyZUdlbmVyYXRpb25FdmVudChfbG9jLmdldCgiZ2VuZXJhdGluZy1zY2hlbWFzIikpOworCisgICAgICAgIE9iamVjdFtdW10gc2NoZW1hTWFwOworICAgICAgICBpZiAoc2NoZW1hc0FuZFRhYmxlcyA9PSBudWxsIHx8IHNjaGVtYXNBbmRUYWJsZXMubGVuZ3RoID09IDApCisgICAgICAgICAgICBzY2hlbWFNYXAgPSBfYWxsb3dlZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2NoZW1hTWFwID0gcGFyc2VTY2hlbWFzTGlzdChzY2hlbWFzQW5kVGFibGVzKTsKKworICAgICAgICBpZiAoc2NoZW1hTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hKG51bGwsIG51bGwpOworCisgICAgICAgICAgICAvLyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHNjaGVtYSBvYmplY3RzIHdlIHdpbGwgbmVlZCB0byB2aXNpdAorICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZXN0aW1hdGUgcHJvZ3Jlc3NzIHRvdGFsIGZvciBhbnkgbGlzdGVuZXJzCisgICAgICAgICAgICBpbnQgbnVtVGFibGVzID0gZ2V0VGFibGVzKG51bGwpLnNpemUoKTsKKyAgICAgICAgICAgIF9zY2hlbWFPYmplY3RzICs9IG51bVRhYmxlcworICAgICAgICAgICAgICAgICsgKF9wa3MgPyBudW1UYWJsZXMgOiAwKQorICAgICAgICAgICAgICAgICsgKF9pbmRleGVzID8gbnVtVGFibGVzIDogMCkKKyAgICAgICAgICAgICAgICArIChfZmtzID8gbnVtVGFibGVzIDogMCk7CisKKyAgICAgICAgICAgIGlmIChfcGtzKQorICAgICAgICAgICAgICAgIGdlbmVyYXRlUHJpbWFyeUtleXMobnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoX2luZGV4ZXMpCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVJbmRleGVzKG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKF9ma3MpCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVGb3JlaWduS2V5cyhudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdlbmVyYXRlIGFsbCBzY2hlbWFzIGFuZCB0YWJsZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFNYXAubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYSgoU3RyaW5nKSBzY2hlbWFNYXBbaV1bMF0sCisgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBzY2hlbWFNYXBbaV1bMV0pOworCisgICAgICAgIC8vIGdlbmVyYXRlIHBrcywgaW5kZXhlcywgZmtzCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lOworICAgICAgICBTdHJpbmdbXSB0YWJsZU5hbWVzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYU1hcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2NoZW1hTmFtZSA9IChTdHJpbmcpIHNjaGVtYU1hcFtpXVswXTsKKyAgICAgICAgICAgIHRhYmxlTmFtZXMgPSAoU3RyaW5nW10pIHNjaGVtYU1hcFtpXVsxXTsKKworICAgICAgICAgICAgLy8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBzY2hlbWEgb2JqZWN0cyB3ZSB3aWxsIG5lZWQgdG8gdmlzaXQKKyAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGVzdGltYXRlIHByb2dyZXNzcyB0b3RhbCBmb3IgYW55IGxpc3RlbmVycworICAgICAgICAgICAgaW50IG51bVRhYmxlcyA9ICh0YWJsZU5hbWVzICE9IG51bGwpID8gdGFibGVOYW1lcy5sZW5ndGgKKyAgICAgICAgICAgICAgICA6IGdldFRhYmxlcyhzY2hlbWFOYW1lKS5zaXplKCk7CisgICAgICAgICAgICBfc2NoZW1hT2JqZWN0cyArPSBudW1UYWJsZXMKKyAgICAgICAgICAgICAgICArIChfcGtzID8gbnVtVGFibGVzIDogMCkKKyAgICAgICAgICAgICAgICArIChfaW5kZXhlcyA/IG51bVRhYmxlcyA6IDApCisgICAgICAgICAgICAgICAgKyAoX2ZrcyA/IG51bVRhYmxlcyA6IDApOworCisgICAgICAgICAgICBpZiAoX3BrcykKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVByaW1hcnlLZXlzKHNjaGVtYU5hbWUsIHRhYmxlTmFtZXMpOworICAgICAgICAgICAgaWYgKF9pbmRleGVzKQorICAgICAgICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcyhzY2hlbWFOYW1lLCB0YWJsZU5hbWVzKTsKKyAgICAgICAgICAgIGlmIChfZmtzKQorICAgICAgICAgICAgICAgIGdlbmVyYXRlRm9yZWlnbktleXMoc2NoZW1hTmFtZSwgdGFibGVOYW1lcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmdWxseS1jb25zdHJ1Y3RlZCB7QGxpbmsgU2NoZW1hfSBtYXRjaGluZyB0aGUgZ2l2ZW4gZGF0YWJhc2UKKyAgICAgKiBzY2hlbWEgdG8gdGhlIGN1cnJlbnQgZ3JvdXAuIE5vIGZvcmVpZ24ga2V5cyBhcmUgZ2VuZXJhdGVkIGJlY2F1c2UKKyAgICAgKiBzb21lIGtleXMgbWlnaHQgc3BhbiBzY2hlbWFzLiBZb3UgbXVzdCBjYWxsCisgICAgICoge0BsaW5rICNnZW5lcmF0ZVByaW1hcnlLZXlzfSwge0BsaW5rICNnZW5lcmF0ZUluZGV4ZXN9LCBhbmQKKyAgICAgKiB7QGxpbmsgI2dlbmVyYXRlRm9yZWlnbktleXN9IHNlcGFyYXRlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZGF0YWJhc2UgbmFtZSBvZiB0aGUgc2NoZW1hLCBvciBudWxsIGZvciBhbGwgc2NoZW1hcworICAgICAqIEBwYXJhbSB0YWJsZU5hbWVzIGEgbGlzdCBvZiB0YWJsZXMgdG8gZ2VuZXJhdGUgaW4gdGhlIHNjaGVtYSwgb3IgbnVsbAorICAgICAqIHRvIGdlbmVyYXRlIGFsbCB0YWJsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVNjaGVtYShTdHJpbmcgbmFtZSwgU3RyaW5nW10gdGFibGVOYW1lcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGZpcmVHZW5lcmF0aW9uRXZlbnQoX2xvYy5nZXQoImdlbmVyYXRpbmctc2NoZW1hIiwgbmFtZSkpOworCisgICAgICAgIC8vIGdlbmVyYXRlIHRhYmxlcywgaW5jbHVkaW5nIGNvbHVtbnMgYW5kIHByaW1hcnkga2V5cworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBfZHMuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBEYXRhYmFzZU1ldGFEYXRhIG1ldGEgPSBjb25uLmdldE1ldGFEYXRhKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGFibGVOYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGdlbmVyYXRlVGFibGVzKG5hbWUsIG51bGwsIGNvbm4sIG1ldGEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVOYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVUYWJsZXMobmFtZSwgdGFibGVOYW1lc1tpXSwgY29ubiwgbWV0YSk7CisKKyAgICAgICAgICAgIGlmIChfc2VxcykKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVNlcXVlbmNlcyhuYW1lLCBudWxsLCBjb25uLCBtZXRhKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHNvbWUgZGF0YWJhc2VzIHJlcXVpcmUgYSBjb21taXQgYWZ0ZXIgbWV0YWRhdGEgdG8gcmVsZWFzZSBsb2NrcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBzY2hlbWEuIFRoaXMgbWV0aG9kCisgICAgICogbXVzdCBiZSBjYWxsZWQgaW4gYWRkaXRpb24gdG8ge0BsaW5rICNnZW5lcmF0ZVNjaGVtYX0uIEl0IHNob3VsZAorICAgICAqIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBzY2hlbWFzIGFyZSBnZW5lcmF0ZWQuIFRoZSBzY2hlbWEgbmFtZSBhbmQKKyAgICAgKiB0YWJsZXMgYXJyYXkgY2FuIGJlIG51bGwgdG8gaW5kaWNhdGUgdGhhdCBpbmRleGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgKiBmb3IgYWxsIHNjaGVtYXMgYW5kL29yIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVByaW1hcnlLZXlzKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmdbXSB0YWJsZU5hbWVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmlyZUdlbmVyYXRpb25FdmVudChfbG9jLmdldCgiZ2VuZXJhdGluZy1hbGwtcHJpbWFyaWVzIiwgc2NoZW1hTmFtZSkpOworCisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IF9kcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgIERhdGFiYXNlTWV0YURhdGEgbWV0YSA9IGNvbm4uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0YWJsZU5hbWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVQcmltYXJ5S2V5cyhzY2hlbWFOYW1lLCBudWxsLCBjb25uLCBtZXRhKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlTmFtZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUHJpbWFyeUtleXMoc2NoZW1hTmFtZSwgdGFibGVOYW1lc1tpXSwgY29ubiwgbWV0YSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBzb21lIGRhdGFiYXNlcyByZXF1aXJlIGEgY29tbWl0IGFmdGVyIG1ldGFkYXRhIHRvIHJlbGVhc2UgbG9ja3MKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGluZGV4IGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gc2NoZW1hLiBUaGlzIG1ldGhvZAorICAgICAqIG11c3QgYmUgY2FsbGVkIGluIGFkZGl0aW9uIHRvIHtAbGluayAjZ2VuZXJhdGVTY2hlbWF9LiBJdCBzaG91bGQKKyAgICAgKiBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgc2NoZW1hcyBhcmUgZ2VuZXJhdGVkLiBUaGUgc2NoZW1hIG5hbWUgYW5kCisgICAgICogdGFibGVzIGFycmF5IGNhbiBiZSBudWxsIHRvIGluZGljYXRlIHRoYXQgaW5kZXhlcyBzaG91bGQgYmUgZ2VuZXJhdGVkCisgICAgICogZm9yIGFsbCBzY2hlbWFzIGFuZC9vciB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVJbmRleGVzKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmdbXSB0YWJsZU5hbWVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmlyZUdlbmVyYXRpb25FdmVudChfbG9jLmdldCgiZ2VuZXJhdGluZy1hbGwtaW5kZXhlcyIsIHNjaGVtYU5hbWUpKTsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBfZHMuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBEYXRhYmFzZU1ldGFEYXRhIG1ldGEgPSBjb25uLmdldE1ldGFEYXRhKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGFibGVOYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcyhzY2hlbWFOYW1lLCBudWxsLCBjb25uLCBtZXRhKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlTmFtZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcyhzY2hlbWFOYW1lLCB0YWJsZU5hbWVzW2ldLCBjb25uLCBtZXRhKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHNvbWUgZGF0YWJhc2VzIHJlcXVpcmUgYSBjb21taXQgYWZ0ZXIgbWV0YWRhdGEgdG8gcmVsZWFzZSBsb2NrcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBzY2hlbWEuIFRoaXMgbWV0aG9kCisgICAgICogbXVzdCBiZSBjYWxsZWQgaW4gYWRkaXRpb24gdG8ge0BsaW5rICNnZW5lcmF0ZVNjaGVtYX0uIEl0IHNob3VsZAorICAgICAqIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBzY2hlbWFzIGFyZSBnZW5lcmF0ZWQuIFRoZSBzY2hlbWEgbmFtZSBhbmQKKyAgICAgKiB0YWJsZXMgYXJyYXkgY2FuIGJlIG51bGwgdG8gaW5kaWNhdGUgdGhhdCBpbmRleGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgKiBmb3IgYWxsIHNjaGVtYXMgYW5kL29yIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUZvcmVpZ25LZXlzKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmdbXSB0YWJsZU5hbWVzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmlyZUdlbmVyYXRpb25FdmVudChfbG9jLmdldCgiZ2VuZXJhdGluZy1hbGwtZm9yZWlnbnMiLCBzY2hlbWFOYW1lKSk7CisKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gX2RzLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgRGF0YWJhc2VNZXRhRGF0YSBtZXRhID0gY29ubi5nZXRNZXRhRGF0YSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRhYmxlTmFtZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUZvcmVpZ25LZXlzKHNjaGVtYU5hbWUsIG51bGwsIGNvbm4sIG1ldGEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVOYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVGb3JlaWduS2V5cyhzY2hlbWFOYW1lLCB0YWJsZU5hbWVzW2ldLCBjb25uLCBtZXRhKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHNvbWUgZGF0YWJhc2VzIHJlcXVpcmUgYSBjb21taXQgYWZ0ZXIgbWV0YWRhdGEgdG8gcmVsZWFzZSBsb2NrcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbGwgdGFibGVzIG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lIHBhdHRlcm4gdG8gdGhlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRhYmxlcyhTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uLCBEYXRhYmFzZU1ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBmaXJlR2VuZXJhdGlvbkV2ZW50KF9sb2MuZ2V0KCJnZW5lcmF0aW5nLWNvbHVtbnMiLCBzY2hlbWFOYW1lLAorICAgICAgICAgICAgdGFibGVOYW1lKSk7CisgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJnZW4tdGFibGVzIiwgc2NoZW1hTmFtZSwgdGFibGVOYW1lKSk7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IF9kaWN0LmdldENvbHVtbnMobWV0YSwgY29ubi5nZXRDYXRhbG9nKCksIHNjaGVtYU5hbWUsCisgICAgICAgICAgICB0YWJsZU5hbWUsIG51bGwsIGNvbm4pOworCisgICAgICAgIC8vIHdoZW4gd2Ugd2FudCB0byBnZXQgYWxsIHRoZSBjb2x1bW5zIGZvciBhbGwgdGFibGVzLCB3ZSBuZWVkIHRvIGJ1aWxkCisgICAgICAgIC8vIGEgbGlzdCBvZiB0YWJsZXMgdG8gdmVyaWZ5IGJlY2F1c2Ugc29tZSBkYXRhYmFzZXMgKGUuZy4sIFBvc3RncmVzKQorICAgICAgICAvLyB3aWxsIGluY2x1ZGUgaW5kZXhlcyBpbiB0aGUgbGlzdCBvZiBjb2x1bW5zLCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvCisgICAgICAgIC8vIGRpc3Rpbmd1aXNoIHRoZSBpbmRleGVzIGZyb20gcHJvcGVyIGNvbHVtbnMKKyAgICAgICAgU2V0IHRhYmxlTmFtZXMgPSBudWxsOworICAgICAgICBpZiAodGFibGVOYW1lID09IG51bGwgfHwgIiUiLmVxdWFscyh0YWJsZU5hbWUpKSB7CisgICAgICAgICAgICBUYWJsZVtdIHRhYmxlcyA9IF9kaWN0LmdldFRhYmxlcyhtZXRhLCBjb25uLmdldENhdGFsb2coKSwKKyAgICAgICAgICAgICAgICBzY2hlbWFOYW1lLCB0YWJsZU5hbWUsIGNvbm4pOworICAgICAgICAgICAgdGFibGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgdGFibGVzICE9IG51bGwgJiYgaSA8IHRhYmxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjb2xzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZXMuYWRkKHRhYmxlc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lcy5hZGQodGFibGVzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIGRhdGFiYXNlIGNhbid0IGhhbmRsZSBudWxsIHRhYmxlIG5hbWUsIHJlY3Vyc2Ugb24gZWFjaCBrbm93biBuYW1lCisgICAgICAgIGlmIChjb2xzID09IG51bGwgJiYgdGFibGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVRhYmxlcyhzY2hlbWFOYW1lLCAoU3RyaW5nKSBpdHIubmV4dCgpLCBjb25uLCBtZXRhKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gZ2V0U2NoZW1hR3JvdXAoKTsKKyAgICAgICAgU2NoZW1hIHNjaGVtYTsKKyAgICAgICAgVGFibGUgdGFibGU7CisgICAgICAgIFN0cmluZyB0YWJsZVNjaGVtYTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNvbHMgIT0gbnVsbCAmJiBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFibGVOYW1lID0gY29sc1tpXS5nZXRUYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIHRhYmxlU2NoZW1hID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb2xzW2ldLmdldFNjaGVtYU5hbWUoKSk7CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSBzcGVjaWFsIHRhYmxlcworICAgICAgICAgICAgaWYgKCFfb3BlbmpwYVRhYmxlcyAmJgorICAgICAgICAgICAgICAgICh0YWJsZU5hbWUudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJPUEVOSlBBXyIpCisgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlTmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIkpET18iKSkpIC8vIGxlZ2FjeQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKF9kaWN0LmlzU3lzdGVtVGFibGUodGFibGVOYW1lLCB0YWJsZVNjaGVtYSwgc2NoZW1hTmFtZSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gaWdub3JlIHRhYmxlcyBub3QgaW4gbGlzdCwgb3Igbm90IGFsbG93ZWQgYnkgc2NoZW1hcyBwcm9wZXJ0eQorICAgICAgICAgICAgaWYgKHRhYmxlTmFtZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICF0YWJsZU5hbWVzLmNvbnRhaW5zKHRhYmxlTmFtZS50b1VwcGVyQ2FzZSgpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghaXNBbGxvd2VkVGFibGUodGFibGVTY2hlbWEsIHRhYmxlTmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHNjaGVtYSA9IGdyb3VwLmdldFNjaGVtYSh0YWJsZVNjaGVtYSk7CisgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICAgICAgc2NoZW1hID0gZ3JvdXAuYWRkU2NoZW1hKHRhYmxlU2NoZW1hKTsKKworICAgICAgICAgICAgdGFibGUgPSBzY2hlbWEuZ2V0VGFibGUodGFibGVOYW1lKTsKKyAgICAgICAgICAgIGlmICh0YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGFibGUgPSBzY2hlbWEuYWRkVGFibGUodGFibGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJjb2wtdGFibGUiLCB0YWJsZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImdlbi1jb2x1bW4iLCBjb2xzW2ldLmdldE5hbWUoKSwgdGFibGUpKTsKKworICAgICAgICAgICAgaWYgKHRhYmxlLmdldENvbHVtbihjb2xzW2ldLmdldE5hbWUoKSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0YWJsZS5pbXBvcnRDb2x1bW4oY29sc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gdGFibGUgaXMgYWxsb3dlZCBieSB0aGUgdXNlcidzIHNjaGVtYSBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FsbG93ZWRUYWJsZShTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUpIHsKKyAgICAgICAgaWYgKF9hbGxvd2VkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBkbyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gb24gYWxsb3dlZCB0YWJsZSBhbmQgc2NoZW1hIG5hbWVzCisgICAgICAgIFN0cmluZ1tdIHRhYmxlczsKKyAgICAgICAgU3RyaW5nW10gYW55U2NoZW1hVGFibGVzID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYWxsb3dlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKF9hbGxvd2VkW2ldWzBdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbnlTY2hlbWFUYWJsZXMgPSAoU3RyaW5nW10pIF9hbGxvd2VkW2ldWzFdOworICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1hLCAoU3RyaW5nKSBfYWxsb3dlZFtpXVswXSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICh0YWJsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgdGFibGVzID0gKFN0cmluZ1tdKSBfYWxsb3dlZFtpXVsxXTsKKyAgICAgICAgICAgIGlmICh0YWJsZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFibGVzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5lcXVhbHNJZ25vcmVDYXNlKHRhYmxlLCB0YWJsZXNbal0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbnlTY2hlbWFUYWJsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRhYmxlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFueVNjaGVtYVRhYmxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZSh0YWJsZSwgYW55U2NoZW1hVGFibGVzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0YWJsZSBwcmltYXJ5IGtleXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVQcmltYXJ5S2V5cyhTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uLCBEYXRhYmFzZU1ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBmaXJlR2VuZXJhdGlvbkV2ZW50KF9sb2MuZ2V0KCJnZW5lcmF0aW5nLXByaW1hcnkiLAorICAgICAgICAgICAgc2NoZW1hTmFtZSwgdGFibGVOYW1lKSk7CisgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJnZW4tcGtzIiwgc2NoZW1hTmFtZSwgdGFibGVOYW1lKSk7CisKKyAgICAgICAgLy8gaWYgbG9va2luZyBmb3IgYSBub24tZXhpc3RhbnQgdGFibGUsIGp1c3QgcmV0dXJuCisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gZ2V0U2NoZW1hR3JvdXAoKTsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSAhPSBudWxsICYmIGdyb3VwLmZpbmRUYWJsZSh0YWJsZU5hbWUpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gaWYgdGhlIGRhdGFiYXNlIGNhbid0IHVzZSBhIHRhYmxlIG5hbWUgd2lsZGNhcmQsIHJlY3Vyc2Ugb24gZWFjaAorICAgICAgICAvLyBjb25jcmV0ZSB0YWJsZSBpbiB0aGUgcmVxdWVzdGVkIHNjaGVtYShzKQorICAgICAgICBQcmltYXJ5S2V5W10gcGtzID0gX2RpY3QuZ2V0UHJpbWFyeUtleXMobWV0YSwgY29ubi5nZXRDYXRhbG9nKCksCisgICAgICAgICAgICBzY2hlbWFOYW1lLCB0YWJsZU5hbWUsIGNvbm4pOworICAgICAgICBUYWJsZSB0YWJsZTsKKyAgICAgICAgaWYgKHBrcyA9PSBudWxsICYmIHRhYmxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHRhYmxlcyA9IGdldFRhYmxlcyhzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdGFibGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgdGFibGUgPSAoVGFibGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVQcmltYXJ5S2V5cyh0YWJsZS5nZXRTY2hlbWFOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLmdldE5hbWUoKSwgY29ubiwgbWV0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWEgc2NoZW1hOworICAgICAgICBQcmltYXJ5S2V5IHBrOworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgU3RyaW5nIGNvbE5hbWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBwa3MgIT0gbnVsbCAmJiBpIDwgcGtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzY2hlbWFOYW1lID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChwa3NbaV0uZ2V0U2NoZW1hTmFtZSgpKTsKKyAgICAgICAgICAgIHNjaGVtYSA9IGdyb3VwLmdldFNjaGVtYShzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRhYmxlID0gc2NoZW1hLmdldFRhYmxlKHBrc1tpXS5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgICAgICBpZiAodGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY29sTmFtZSA9IHBrc1tpXS5nZXRDb2x1bW5OYW1lKCk7CisgICAgICAgICAgICBuYW1lID0gcGtzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiZ2VuLXBrIiwgbmFtZSwgdGFibGUsIGNvbE5hbWUpKTsKKworICAgICAgICAgICAgcGsgPSB0YWJsZS5nZXRQcmltYXJ5S2V5KCk7CisgICAgICAgICAgICBpZiAocGsgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwayA9IHRhYmxlLmFkZFByaW1hcnlLZXkobmFtZSk7CisgICAgICAgICAgICBway5hZGRDb2x1bW4odGFibGUuZ2V0Q29sdW1uKGNvbE5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0YWJsZSBpbmRleGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlSW5kZXhlcyhTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uLCBEYXRhYmFzZU1ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBmaXJlR2VuZXJhdGlvbkV2ZW50KF9sb2MuZ2V0KCJnZW5lcmF0aW5nLWluZGV4ZXMiLAorICAgICAgICAgICAgc2NoZW1hTmFtZSwgdGFibGVOYW1lKSk7CisgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJnZW4taW5kZXhlcyIsIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSkpOworCisgICAgICAgIC8vIGlmIGxvb2tpbmcgZm9yIGEgbm9uLWV4aXN0YW50IHRhYmxlLCBqdXN0IHJldHVybgorICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IGdldFNjaGVtYUdyb3VwKCk7CisgICAgICAgIGlmICh0YWJsZU5hbWUgIT0gbnVsbCAmJiBncm91cC5maW5kVGFibGUodGFibGVOYW1lKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGlmIHRoZSBkYXRhYmFzZSBjYW4ndCB1c2UgYSB0YWJsZSBuYW1lIHdpbGRjYXJkLCByZWN1cnNlIG9uIGVhY2gKKyAgICAgICAgLy8gY29uY3JldGUgdGFibGUgaW4gdGhlIHJlcXVlc3RlZCBzY2hlbWEocykKKyAgICAgICAgSW5kZXhbXSBpZHhzID0gX2RpY3QuZ2V0SW5kZXhJbmZvKG1ldGEsIGNvbm4uZ2V0Q2F0YWxvZygpLAorICAgICAgICAgICAgc2NoZW1hTmFtZSwgdGFibGVOYW1lLCBmYWxzZSwgdHJ1ZSwgY29ubik7CisgICAgICAgIFRhYmxlIHRhYmxlOworICAgICAgICBpZiAoaWR4cyA9PSBudWxsICYmIHRhYmxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHRhYmxlcyA9IGdldFRhYmxlcyhzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdGFibGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgdGFibGUgPSAoVGFibGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVJbmRleGVzKHRhYmxlLmdldFNjaGVtYU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0TmFtZSgpLCBjb25uLCBtZXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYSBzY2hlbWE7CisgICAgICAgIEluZGV4IGlkeDsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIFN0cmluZyBjb2xOYW1lOworICAgICAgICBTdHJpbmcgcGtOYW1lOworICAgICAgICBmb3IgKGludCBpID0gMDsgaWR4cyAhPSBudWxsICYmIGkgPCBpZHhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzY2hlbWFOYW1lID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChpZHhzW2ldLmdldFNjaGVtYU5hbWUoKSk7CisgICAgICAgICAgICBzY2hlbWEgPSBncm91cC5nZXRTY2hlbWEoc2NoZW1hTmFtZSk7CisgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0YWJsZSA9IHNjaGVtYS5nZXRUYWJsZShpZHhzW2ldLmdldFRhYmxlTmFtZSgpKTsKKyAgICAgICAgICAgIGlmICh0YWJsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAodGFibGUuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcGtOYW1lID0gdGFibGUuZ2V0UHJpbWFyeUtleSgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwa05hbWUgPSBudWxsOworCisgICAgICAgICAgICAvLyBzdGF0aXN0aWNzIGRvbid0IGhhdmUgbmFtZXM7IHNraXAgdGhlbQorICAgICAgICAgICAgbmFtZSA9IGlkeHNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkKKyAgICAgICAgICAgICAgICB8fCAocGtOYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKHBrTmFtZSkpCisgICAgICAgICAgICAgICAgfHwgX2RpY3QuaXNTeXN0ZW1JbmRleChuYW1lLCB0YWJsZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGNvbE5hbWUgPSBpZHhzW2ldLmdldENvbHVtbk5hbWUoKTsKKyAgICAgICAgICAgIGlmICh0YWJsZS5nZXRDb2x1bW4oY29sTmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJnZW4taW5kZXgiLCBuYW1lLCB0YWJsZSwgY29sTmFtZSkpOworCisgICAgICAgICAgICAvLyBzYW1lIGluZGV4IG1heSBoYXZlIG11bHRpcGxlIHJvd3MgZm9yIG11bHRpcGxlIGNvbHMKKyAgICAgICAgICAgIGlkeCA9IHRhYmxlLmdldEluZGV4KG5hbWUpOworICAgICAgICAgICAgaWYgKGlkeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWR4ID0gdGFibGUuYWRkSW5kZXgobmFtZSk7CisgICAgICAgICAgICAgICAgaWR4LnNldFVuaXF1ZShpZHhzW2ldLmlzVW5pcXVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWR4LmFkZENvbHVtbih0YWJsZS5nZXRDb2x1bW4oY29sTmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRhYmxlIGZvcmVpZ24ga2V5cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUZvcmVpZ25LZXlzKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLAorICAgICAgICBDb25uZWN0aW9uIGNvbm4sIERhdGFiYXNlTWV0YURhdGEgbWV0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGZpcmVHZW5lcmF0aW9uRXZlbnQoX2xvYy5nZXQoImdlbmVyYXRpbmctZm9yZWlnbiIsCisgICAgICAgICAgICBzY2hlbWFOYW1lLCB0YWJsZU5hbWUpKTsKKyAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImdlbi1ma3MiLCBzY2hlbWFOYW1lLCB0YWJsZU5hbWUpKTsKKworICAgICAgICAvLyBpZiBsb29raW5nIGZvciBhIG5vbi1leGlzdGFudCB0YWJsZSwganVzdCByZXR1cm4KKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSBnZXRTY2hlbWFHcm91cCgpOworICAgICAgICBpZiAodGFibGVOYW1lICE9IG51bGwgJiYgZ3JvdXAuZmluZFRhYmxlKHRhYmxlTmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBpZiB0aGUgZGF0YWJhc2UgY2FuJ3QgdXNlIGEgdGFibGUgbmFtZSB3aWxkY2FyZCwgcmVjdXJzZSBvbiBlYWNoCisgICAgICAgIC8vIGNvbmNyZXRlIHRhYmxlIGluIHRoZSByZXF1ZXN0ZWQgc2NoZW1hKHMpCisgICAgICAgIEZvcmVpZ25LZXlbXSBma3MgPSBfZGljdC5nZXRJbXBvcnRlZEtleXMobWV0YSwgY29ubi5nZXRDYXRhbG9nKCksCisgICAgICAgICAgICBzY2hlbWFOYW1lLCB0YWJsZU5hbWUsIGNvbm4pOworICAgICAgICBUYWJsZSB0YWJsZTsKKyAgICAgICAgaWYgKGZrcyA9PSBudWxsICYmIHRhYmxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHRhYmxlcyA9IGdldFRhYmxlcyhzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdGFibGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgdGFibGUgPSAoVGFibGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVGb3JlaWduS2V5cyh0YWJsZS5nZXRTY2hlbWFOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLmdldE5hbWUoKSwgY29ubiwgbWV0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWEgc2NoZW1hOworICAgICAgICBUYWJsZSBwa1RhYmxlOworICAgICAgICBGb3JlaWduS2V5IGZrOworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgU3RyaW5nIHBrU2NoZW1hTmFtZTsKKyAgICAgICAgU3RyaW5nIHBrVGFibGVOYW1lOworICAgICAgICBTdHJpbmcgcGtDb2xOYW1lOworICAgICAgICBTdHJpbmcgZmtDb2xOYW1lOworICAgICAgICBpbnQgc2VxOworICAgICAgICBib29sZWFuIHNlcVdhczAgPSBmYWxzZTsgLy8gc29tZSBkcml2ZXJzIGluY29ycmVjdGx5IHN0YXJ0IGF0IDAKKyAgICAgICAgQ29sbGVjdGlvbiBpbnZhbGlkcyA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBma3MgIT0gbnVsbCAmJiBpIDwgZmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzY2hlbWFOYW1lID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChma3NbaV0uZ2V0U2NoZW1hTmFtZSgpKTsKKyAgICAgICAgICAgIHNjaGVtYSA9IGdyb3VwLmdldFNjaGVtYShzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRhYmxlID0gc2NoZW1hLmdldFRhYmxlKGZrc1tpXS5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgICAgICBpZiAodGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbmFtZSA9IGZrc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICBma0NvbE5hbWUgPSBma3NbaV0uZ2V0Q29sdW1uTmFtZSgpOworICAgICAgICAgICAgcGtDb2xOYW1lID0gZmtzW2ldLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7CisgICAgICAgICAgICBzZXEgPSBma3NbaV0uZ2V0S2V5U2VxdWVuY2UoKTsKKyAgICAgICAgICAgIGlmIChzZXEgPT0gMCkKKyAgICAgICAgICAgICAgICBzZXFXYXMwID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzZXFXYXMwKQorICAgICAgICAgICAgICAgIHNlcSsrOworCisgICAgICAgICAgICAvLyBmaW5kIHBrIHRhYmxlCisgICAgICAgICAgICBwa1NjaGVtYU5hbWUgPSBma3NbaV0uZ2V0UHJpbWFyeUtleVNjaGVtYU5hbWUoKTsKKyAgICAgICAgICAgIHBrVGFibGVOYW1lID0gZmtzW2ldLmdldFByaW1hcnlLZXlUYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiZ2VuLWZrIiwgbmV3IE9iamVjdFtdeyBuYW1lLCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgZmtDb2xOYW1lLCBwa1RhYmxlTmFtZSwgcGtDb2xOYW1lLCBzZXEgKyAiIiB9KSk7CisKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShwa1NjaGVtYU5hbWUpKQorICAgICAgICAgICAgICAgIHBrVGFibGVOYW1lID0gcGtTY2hlbWFOYW1lICsgIi4iICsgcGtUYWJsZU5hbWU7CisgICAgICAgICAgICBwa1RhYmxlID0gZ3JvdXAuZmluZFRhYmxlKHBrVGFibGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChwa1RhYmxlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihfbG9jLmdldCgiZ2VuLW5vZmt0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBwa1RhYmxlTmFtZSkuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICAgICAgLy8gdGhpcyBzdWNrcywgYmVjYXVzZSBpdCBpcyAqbm90KiBndWFyYW50ZWVkIHRvIHdvcms7CisgICAgICAgICAgICAvLyB0aGUgZmsgcmVzdWx0c2V0IGlzIG9yZGVyZWQgYnkgcHJpbWFyeSBrZXkgdGFibGUsIHRoZW4KKyAgICAgICAgICAgIC8vIHNlcXVlbmNlIG51bWJlciB3aXRoaW4gdGhlIGZvcmVpZ24ga2V5IChzb21lIGRyaXZlcnMgZG9uJ3QKKyAgICAgICAgICAgIC8vIHVzZSBzZXF1ZW5jZSBudW1iZXJzIGNvcnJlY3RseSBlaXRoZXIpOyBzaW5jZSBmayBuYW1lcworICAgICAgICAgICAgLy8gYXJlIGFsbG93ZWQgdG8gYmUgbnVsbCwgYWxsIHRoaXMgYWRkcyB1cCB0byB0aGUgZmFjdAorICAgICAgICAgICAgLy8gdGhhdCB0aGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdheSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgICAgICAgICAvLyBtdWx0aXBsZSBtdWx0aS1jb2x1bW4gZmtzIHRvIHRoZSBzYW1lIHRhYmxlOyB3ZSdyZSBnb2luZworICAgICAgICAgICAgLy8gdG8gcmVseSBvbiBmayBuYW1lIGhlcmUgYW5kIGhvcGUgaXQgd29ya3MKKyAgICAgICAgICAgIGZrID0gdGFibGUuZ2V0Rm9yZWlnbktleShuYW1lKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgYSBuZXcgZms/CisgICAgICAgICAgICBpZiAoc2VxID09IDEgfHwgZmsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZrID0gdGFibGUuYWRkRm9yZWlnbktleShuYW1lKTsKKyAgICAgICAgICAgICAgICBmay5zZXREZWZlcnJlZChma3NbaV0uaXNEZWZlcnJlZCgpKTsKKyAgICAgICAgICAgICAgICBmay5zZXREZWxldGVBY3Rpb24oZmtzW2ldLmdldERlbGV0ZUFjdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGludmFsaWRzID09IG51bGwgfHwgIWludmFsaWRzLmNvbnRhaW5zKGZrKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZrLmpvaW4odGFibGUuZ2V0Q29sdW1uKGZrQ29sTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwa1RhYmxlLmdldENvbHVtbihwa0NvbE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYmFkLWpvaW4iLCBpYWUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZHMuYWRkKGZrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgaW52YWxpZCBma3MKKyAgICAgICAgaWYgKGludmFsaWRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaW52YWxpZHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBmayA9IChGb3JlaWduS2V5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGZrLmdldFRhYmxlKCkucmVtb3ZlRm9yZWlnbktleShmayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFsbCBzZXF1ZW5jZXMgbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUgcGF0dGVybiB0byB0aGUgc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2VxdWVuY2VzKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgc2VxdWVuY2VOYW1lLAorICAgICAgICBDb25uZWN0aW9uIGNvbm4sIERhdGFiYXNlTWV0YURhdGEgbWV0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGZpcmVHZW5lcmF0aW9uRXZlbnQoX2xvYy5nZXQoImdlbmVyYXRpbmctc2VxdWVuY2VzIiwgc2NoZW1hTmFtZSkpOworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiZ2VuLXNlcXMiLCBzY2hlbWFOYW1lLCBzZXF1ZW5jZU5hbWUpKTsKKworICAgICAgICBTZXF1ZW5jZVtdIHNlcXMgPSBfZGljdC5nZXRTZXF1ZW5jZXMobWV0YSwgY29ubi5nZXRDYXRhbG9nKCksCisgICAgICAgICAgICBzY2hlbWFOYW1lLCBzZXF1ZW5jZU5hbWUsIGNvbm4pOworCisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gZ2V0U2NoZW1hR3JvdXAoKTsKKyAgICAgICAgU2NoZW1hIHNjaGVtYTsKKyAgICAgICAgU3RyaW5nIHNlcXVlbmNlU2NoZW1hOworICAgICAgICBmb3IgKGludCBpID0gMDsgc2VxcyAhPSBudWxsICYmIGkgPCBzZXFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzZXF1ZW5jZU5hbWUgPSBzZXFzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHNlcXVlbmNlU2NoZW1hID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChzZXFzW2ldLmdldFNjaGVtYU5hbWUoKSk7CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSBzcGVjaWFsIHRhYmxlcworICAgICAgICAgICAgaWYgKCFfb3BlbmpwYVRhYmxlcyAmJgorICAgICAgICAgICAgICAgIChzZXF1ZW5jZU5hbWUudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJPUEVOSlBBXyIpCisgICAgICAgICAgICAgICAgICAgIHx8IHNlcXVlbmNlTmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIkpET18iKSkpIC8vIGxlZ2FjeQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKF9kaWN0LmlzU3lzdGVtU2VxdWVuY2Uoc2VxdWVuY2VOYW1lLCBzZXF1ZW5jZVNjaGVtYSwKKyAgICAgICAgICAgICAgICBzY2hlbWFOYW1lICE9IG51bGwpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFpc0FsbG93ZWRUYWJsZShzZXF1ZW5jZVNjaGVtYSwgbnVsbCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHNjaGVtYSA9IGdyb3VwLmdldFNjaGVtYShzZXF1ZW5jZVNjaGVtYSk7CisgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICAgICAgc2NoZW1hID0gZ3JvdXAuYWRkU2NoZW1hKHNlcXVlbmNlU2NoZW1hKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0U2VxdWVuY2Uoc2VxdWVuY2VOYW1lKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHNjaGVtYS5hZGRTZXF1ZW5jZShzZXF1ZW5jZU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IGFueSBsaXN0ZW5lcnMgdGhhdCBhIHNjaGVtYSBvYmplY3Qgd2FzIGdlbmVyYXRlZC4gUmV0dXJucworICAgICAqIHRydWUgaWYgZ2VuZXJhdGlvbiBzaG91bGQgY29udGludWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVHZW5lcmF0aW9uRXZlbnQoT2JqZWN0IHNjaGVtYU9iamVjdCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzY2hlbWFPYmplY3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKF9saXN0ZW5lcnMgPT0gbnVsbCB8fCBfbGlzdGVuZXJzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoc2NoZW1hT2JqZWN0LCBfc2NoZW1hT2JqZWN0cyk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9saXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBMaXN0ZW5lciBsID0gKExpc3RlbmVyKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghbC5zY2hlbWFPYmplY3RHZW5lcmF0ZWQoZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihfbG9jLmdldCgicmVmcmVzaC1jYW5jZWxsZWQiKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igc2NoZW1hIGdlbmVyYXRpb24gZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGwgdGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGwpIHsKKyAgICAgICAgaWYgKF9saXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9saXN0ZW5lcnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBfbGlzdGVuZXJzLmFkZChsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgc2NoZW1hIGdlbmVyYXRpb24gbGlzdGVuZXIgZm9yIHNjaGVtYSBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICogQHJldHVybiB0cnVlIGlmIGl0IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGwpIHsKKyAgICAgICAgcmV0dXJuIF9saXN0ZW5lcnMgIT0gbnVsbCAmJiBfbGlzdGVuZXJzLnJlbW92ZShsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHRhYmxlcyBmb3IgdGhlIGdpdmVuIHNjaGVtYSBuYW1lLCBvciBhbGwgdGFibGVzIGluCisgICAgICogdGhlIHNjaGVtYSBncm91cCBpZiBudWxsIGlzIGdpdmVuLgorICAgICAqLworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBnZXRUYWJsZXMoU3RyaW5nIHNjaGVtYU5hbWUpIHsKKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSBnZXRTY2hlbWFHcm91cCgpOworICAgICAgICBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ3JvdXAuZ2V0U2NoZW1hKHNjaGVtYU5hbWUpOworICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qoc2NoZW1hLmdldFRhYmxlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYVtdIHNjaGVtYXMgPSBncm91cC5nZXRTY2hlbWFzKCk7CisgICAgICAgIENvbGxlY3Rpb24gdGFibGVzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdGFibGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNjaGVtYXNbaV0uZ2V0VGFibGVzKCkpKTsKKyAgICAgICAgcmV0dXJuIHRhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3RlbmVyIGZvciBhIHBvdGVudGlhbGx5IGxlbmd0aHkgc2NoZW1hIGdlbmVyYXRpb24gcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBMaXN0ZW5lciB7CisKKyAgICAgICAgYm9vbGVhbiBzY2hlbWFPYmplY3RHZW5lcmF0ZWQoRXZlbnQgZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZXZlbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGlvbiBvZiBhIHNjaGVtYSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEV2ZW50CisgICAgICAgIGV4dGVuZHMgRXZlbnRPYmplY3QgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IF90b3RhbDsKKworICAgICAgICBwdWJsaWMgRXZlbnQoT2JqZWN0IG9iLCBpbnQgdG90YWwpIHsKKyAgICAgICAgICAgIHN1cGVyKG9iKTsKKyAgICAgICAgICAgIF90b3RhbCA9IHRvdGFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRUb3RhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfdG90YWw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9TY2hlbWFHcm91cC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU0NzhlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hR3JvdXAuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBncm91cGluZyBvZiBzY2hlbWFzIHVzZWQgaW4gYSBkYXRhYmFzZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgU2NoZW1hR3JvdXAKKyAgICBleHRlbmRzIE5hbWVTZXQKKyAgICBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIE1hcCBfc2NoZW1hTWFwID0gbnVsbDsKKworICAgIC8vIGNhY2hlCisgICAgcHJpdmF0ZSBTY2hlbWFbXSBfc2NoZW1hcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHNjaGVtYXMuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYVtdIGdldFNjaGVtYXMoKSB7CisgICAgICAgIGlmIChfc2NoZW1hcyA9PSBudWxsKQorICAgICAgICAgICAgX3NjaGVtYXMgPSAoX3NjaGVtYU1hcCA9PSBudWxsKSA/IG5ldyBTY2hlbWFbMF0gOiAoU2NoZW1hW10pCisgICAgICAgICAgICAgICAgX3NjaGVtYU1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFbX3NjaGVtYU1hcC5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIF9zY2hlbWFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1hIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoX3NjaGVtYU1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICBuYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOworICAgICAgICByZXR1cm4gKFNjaGVtYSkgX3NjaGVtYU1hcC5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2NoZW1hIHRvIHRoZSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hIGFkZFNjaGVtYSgpIHsKKyAgICAgICAgcmV0dXJuIGFkZFNjaGVtYShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzY2hlbWEgdG8gdGhlIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWEgYWRkU2NoZW1hKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFkZE5hbWUobmFtZSwgZmFsc2UpOworICAgICAgICBTY2hlbWEgc2NoZW1hID0gbmV3U2NoZW1hKG5hbWUpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKF9zY2hlbWFNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBfc2NoZW1hTWFwLnB1dChuYW1lLCBzY2hlbWEpOworICAgICAgICBfc2NoZW1hcyA9IG51bGw7CisgICAgICAgIHJldHVybiBzY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBzY2hlbWEgZnJvbSB0aGUgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNjaGVtYSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoZSBncm91cAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVNjaGVtYShTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNjaGVtYS5nZXROYW1lKCk7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICBuYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOworICAgICAgICBTY2hlbWEgcmVtID0gKFNjaGVtYSkgX3NjaGVtYU1hcC5nZXQobmFtZSk7CisgICAgICAgIGlmIChzY2hlbWEuZXF1YWxzKHJlbSkpIHsKKyAgICAgICAgICAgIF9zY2hlbWFNYXAucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgcmVtb3ZlTmFtZShzY2hlbWEuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIF9zY2hlbWFzID0gbnVsbDsKKyAgICAgICAgICAgIHNjaGVtYS5yZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBvcnQgYSBzY2hlbWEgZnJvbSBhbm90aGVyIGdyb3VwLiBGb3JlaWduIGtleXMgYXJlIG5vdCBpbXBvcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hIGltcG9ydFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFNjaGVtYSBjb3B5ID0gYWRkU2NoZW1hKHNjaGVtYS5nZXROYW1lKCkpOworICAgICAgICBTZXF1ZW5jZVtdIHNlcXMgPSBzY2hlbWEuZ2V0U2VxdWVuY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vxcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvcHkuaW1wb3J0U2VxdWVuY2Uoc2Vxc1tpXSk7CisKKyAgICAgICAgVGFibGVbXSB0YWJsZXMgPSBzY2hlbWEuZ2V0VGFibGVzKCk7CisgICAgICAgIEluZGV4W10gaWR4czsKKyAgICAgICAgVW5pcXVlW10gdW5xczsKKyAgICAgICAgVGFibGUgdGFiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFiID0gY29weS5pbXBvcnRUYWJsZSh0YWJsZXNbaV0pOworICAgICAgICAgICAgaWR4cyA9IHRhYmxlc1tpXS5nZXRJbmRleGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlkeHMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgdGFiLmltcG9ydEluZGV4KGlkeHNbal0pOworICAgICAgICAgICAgdW5xcyA9IHRhYmxlc1tpXS5nZXRVbmlxdWVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHVucXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgdGFiLmltcG9ydFVuaXF1ZSh1bnFzW2pdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGFibGUgaXMga25vd24gdG8gZXhpc3QuIFdoaWxlCisgICAgICoge0BsaW5rICNmaW5kVGFibGV9IG1heSBleGhpYml0IGR5bmFtaWMgYmVoYXZpb3IgaW4gc29tZSBzY2hlbWEgZ3JvdXAKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIHRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyB0cnVlIGlmIHRoZSB0YWJsZSBoYXMgYmVlbgorICAgICAqIGFkZGVkIHRvIHRoaXMgZ3JvdXAgb3IgaXMga25vd24gdG8gZXhpc3QgaW4gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzS25vd25UYWJsZShUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gZmluZFRhYmxlKHRhYmxlKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0YWJsZSBpcyBrbm93biB0byBleGlzdC4gV2hpbGUKKyAgICAgKiB7QGxpbmsgI2ZpbmRUYWJsZX0gbWF5IGV4aGliaXQgZHluYW1pYyBiZWhhdmlvciBpbiBzb21lIHNjaGVtYSBncm91cAorICAgICAqIGltcGxlbWVudGF0aW9ucywgdGhpcyBtZXRob2Qgb25seSByZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGhhcyBiZWVuCisgICAgICogYWRkZWQgdG8gdGhpcyBncm91cCBvciBpcyBrbm93biB0byBleGlzdCBpbiB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNLbm93blRhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBmaW5kVGFibGUobmFtZSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBnaXZlbiB0YWJsZSBpbiB0aGlzIHNjaGVtYSBncm91cC4gVGhlCisgICAgICogZ2l2ZW4gdGFibGUgdGhhdCBtYXkgaGF2ZSBjb21lIGZyb20gYW5vdGhlciBzY2hlbWEgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIFRhYmxlIGZpbmRUYWJsZShUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gZmluZFRhYmxlKHRhYmxlLmdldEZ1bGxOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHRhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdyb3VwLCB1c2luZyAnLicgYXMgdGhlCisgICAgICogY2F0YWxvZyBzZXBhcmF0b3IuIFJldHVybnMgbnVsbCBpZiBubyB0YWJsZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUgZmluZFRhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgZG90SWR4ID0gbmFtZS5pbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChkb3RJZHggIT0gLTEpIHsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KTsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhkb3RJZHggKyAxKTsKKyAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoc2NoZW1hTmFtZSk7CisgICAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5nZXRUYWJsZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNjaGVtYVtdIHNjaGVtYXMgPSBnZXRTY2hlbWFzKCk7CisgICAgICAgICAgICBUYWJsZSB0YWI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWIgPSBzY2hlbWFzW2ldLmdldFRhYmxlKG5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0YWIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgaXMga25vd24gdG8gZXhpc3QuIFdoaWxlCisgICAgICoge0BsaW5rICNmaW5kU2VxdWVuY2V9IG1heSBleGhpYml0IGR5bmFtaWMgYmVoYXZpb3IgaW4gc29tZSBzY2hlbWEgZ3JvdXAKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIHRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBoYXMgYmVlbgorICAgICAqIGFkZGVkIHRvIHRoaXMgZ3JvdXAgb3IgaXMga25vd24gdG8gZXhpc3QgaW4gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzS25vd25TZXF1ZW5jZShTZXF1ZW5jZSBzZXEpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRTZXF1ZW5jZShzZXEpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNlcXVlbmNlIGlzIGtub3duIHRvIGV4aXN0LiBXaGlsZQorICAgICAqIHtAbGluayAjZmluZFNlcXVlbmNlfSBtYXkgZXhoaWJpdCBkeW5hbWljIGJlaGF2aW9yIGluIHNvbWUgc2NoZW1hIGdyb3VwCisgICAgICogaW1wbGVtZW50YXRpb25zLCB0aGlzIG1ldGhvZCBvbmx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2UgaGFzIGJlZW4KKyAgICAgKiBhZGRlZCB0byB0aGlzIGdyb3VwIG9yIGlzIGtub3duIHRvIGV4aXN0IGluIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0tub3duU2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRTZXF1ZW5jZShuYW1lKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGdpdmVuIHNlcXVlbmNlIGluIHRoaXMgc2NoZW1hIGdyb3VwLiBUaGUKKyAgICAgKiBnaXZlbiBzZXF1ZW5jZSB0aGF0IG1heSBoYXZlIGNvbWUgZnJvbSBhbm90aGVyIHNjaGVtYSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxdWVuY2UgZmluZFNlcXVlbmNlKFNlcXVlbmNlIHNlcSkgeworICAgICAgICByZXR1cm4gZmluZFNlcXVlbmNlKHNlcS5nZXRGdWxsTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBncm91cCwgdXNpbmcgJy4nIGFzIHRoZQorICAgICAqIGNhdGFsb2cgc2VwYXJhdG9yLiBSZXR1cm5zIG51bGwgaWYgbm8gc2VxdWVuY2UgZm91bmQuCisgICAgICovCisgICAgcHVibGljIFNlcXVlbmNlIGZpbmRTZXF1ZW5jZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaW50IGRvdElkeCA9IG5hbWUuaW5kZXhPZignLicpOworICAgICAgICBpZiAoZG90SWR4ICE9IC0xKSB7CisgICAgICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCk7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoZG90SWR4ICsgMSk7CisgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKHNjaGVtYU5hbWUpOworICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBzY2hlbWEuZ2V0U2VxdWVuY2UobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gZ2V0U2NoZW1hcygpOworICAgICAgICAgICAgU2VxdWVuY2Ugc2VxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2VxID0gc2NoZW1hc1tpXS5nZXRTZXF1ZW5jZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VxICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhbGwgZm9yZWlnbiBrZXlzIGV4cG9ydGVkIGJ5IGEgZ2l2ZW4gcHJpbWFyeSBrZXkgKGFsbCBmb3JlaWduCisgICAgICoga2V5cyB0aGF0IGxpbmsgdG8gdGhlIHByaW1hcnkga2V5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleVtdIGZpbmRFeHBvcnRlZEZvcmVpZ25LZXlzKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgaWYgKHBrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlbMF07CisKKyAgICAgICAgU2NoZW1hW10gc2NoZW1hcyA9IGdldFNjaGVtYXMoKTsKKyAgICAgICAgVGFibGVbXSB0YWJzOworICAgICAgICBGb3JlaWduS2V5W10gZmtzOworICAgICAgICBDb2xsZWN0aW9uIGV4cG9ydHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYnMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgZmtzID0gdGFic1tqXS5nZXRGb3JlaWduS2V5cygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmtzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChma3Nba10uZ2V0UHJpbWFyeUtleVRhYmxlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGsuZXF1YWxzKGZrc1trXS5nZXRQcmltYXJ5S2V5VGFibGUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByaW1hcnlLZXkoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmFkZChma3Nba10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEZvcmVpZ25LZXlbXSkgZXhwb3J0cy50b0FycmF5KG5ldyBGb3JlaWduS2V5W2V4cG9ydHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHVucmVmZXJlbmNlZCBvciBlbXRweSBjb21wb25lbnRzIGZyb20gdGhlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVbnVzZWRDb21wb25lbnRzKCkgeworICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gZ2V0U2NoZW1hcygpOworICAgICAgICBUYWJsZVtdIHRhYnM7CisgICAgICAgIENvbHVtbltdIGNvbHM7CisgICAgICAgIFNlcXVlbmNlW10gc2VxczsKKyAgICAgICAgUHJpbWFyeUtleSBwazsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzZXFzID0gc2NoZW1hc1tpXS5nZXRTZXF1ZW5jZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2Vxcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoc2Vxc1tqXS5nZXRSZWZDb3VudCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYXNbaV0ucmVtb3ZlU2VxdWVuY2Uoc2Vxc1tqXSk7CisKKyAgICAgICAgICAgIHRhYnMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgcGsgPSB0YWJzW2pdLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgICAgICAgICBma3MgPSB0YWJzW2pdLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgICAgICAgICAgY29scyA9IHRhYnNbal0uZ2V0Q29sdW1ucygpOworCisgICAgICAgICAgICAgICAgaWYgKHBrICE9IG51bGwgJiYgcGsuZ2V0UmVmQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0YWJzW2pdLnJlbW92ZVByaW1hcnlLZXkoKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmtzLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICBpZiAoZmtzW2tdLmdldFJlZkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNbal0ucmVtb3ZlRm9yZWlnbktleShma3Nba10pOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb2xzLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICBpZiAoY29sc1trXS5nZXRSZWZDb3VudCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJzW2pdLnJlbW92ZUNvbHVtbihjb2xzW2tdKTsKKworICAgICAgICAgICAgICAgIGlmICh0YWJzW2pdLmdldENvbHVtbnMoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hc1tpXS5yZW1vdmVUYWJsZSh0YWJzW2pdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNjaGVtYXNbaV0uZ2V0VGFibGVzKCkubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmVtb3ZlU2NoZW1hKHNjaGVtYXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgU2NoZW1hR3JvdXAgY2xvbmUgPSBuZXdJbnN0YW5jZSgpOworICAgICAgICBjbG9uZS5jb3B5KHRoaXMpOworICAgICAgICByZXR1cm4gY2xvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNjaGVtYUdyb3VwIG5ld0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IFNjaGVtYUdyb3VwKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjbG9uZWFibGUgc3RhdGUgZnJvbSB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29weShTY2hlbWFHcm91cCBncm91cCkgeworICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gZ3JvdXAuZ2V0U2NoZW1hcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbXBvcnRTY2hlbWEoc2NoZW1hc1tpXSk7CisKKyAgICAgICAgLy8gaGF2ZSB0byBkbyBma3MgYWZ0ZXIgYWxsIHNjaGVtYXMgYXJlIGltcG9ydGVkCisgICAgICAgIFRhYmxlW10gdGFiczsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGZrcyA9IHRhYnNbal0uZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGZrcy5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hKHNjaGVtYXNbaV0uZ2V0TmFtZSgpKS5nZXRUYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgKHRhYnNbal0uZ2V0TmFtZSgpKS5pbXBvcnRGb3JlaWduS2V5KGZrc1trXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgc2NoZW1hIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNjaGVtYSBuZXdTY2hlbWEoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWEobmFtZSwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHNlcXVlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG93bmVyIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbmV3U2VxdWVuY2UoU3RyaW5nIG5hbWUsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW5jZShuYW1lLCBzY2hlbWEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyB0YWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBvd25lciBzY2hlbWEuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRhYmxlIG5ld1RhYmxlKFN0cmluZyBuYW1lLCBTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFibGUobmFtZSwgc2NoZW1hKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgY29sdW1uIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG93bmVyIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2x1bW4gbmV3Q29sdW1uKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gbmV3IENvbHVtbihuYW1lLCB0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHByaW1hcnkga2V5IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG93bmVyIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmltYXJ5S2V5IG5ld1ByaW1hcnlLZXkoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleShuYW1lLCB0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGluZGV4IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG93bmVyIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBJbmRleCBuZXdJbmRleChTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmRleChuYW1lLCB0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHVuaXF1ZSBjb25zdHJhaW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG93bmVyIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBVbmlxdWUgbmV3VW5pcXVlKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZShuYW1lLCB0YWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGZvcmVpZ24ga2V5IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG93bmVyIHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBGb3JlaWduS2V5IG5ld0ZvcmVpZ25LZXkoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleShuYW1lLCB0YWJsZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hUGFyc2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9TY2hlbWFQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2VmMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hUGFyc2VyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuTWV0YURhdGFQYXJzZXI7CisKKy8qKgorICogSW50ZXJmYWNlIGNsYXNzIGZvciBwYXJlcnMgdGhhdCByZWFkIHNjaGVtYSBpbmZvcm1hdGlvbi4gUGFyc2VycworICogd2lsbCBwbGFjZSBhbGwgcGFyc2VkIHNjaGVtYXMgaW50byB0aGUgY3VycmVudCB7QGxpbmsgU2NoZW1hR3JvdXB9LCBzZXQKKyAqIHZpYSB0aGUge0BsaW5rICNzZXRTY2hlbWFHcm91cH0gbWV0aG9kLiBUaGlzIGFsbG93cyBwYXJzaW5nIG9mCisgKiBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIHNjaGVtYSBncm91cC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVBhcnNlcgorICAgIGV4dGVuZHMgTWV0YURhdGFQYXJzZXIgeworCisgICAgLyoqCisgICAgICogRGVsYXkgcmVzb2x1dGlvbiBvZiBmb3JlaWduIGtleSBjb25zdHJhaW50cyB1bnRpbAorICAgICAqIHtAbGluayAjcmVzb2x2ZUNvbnN0cmFpbnRzfSBpcyBjYWxsZWQuIFRoaXMgYWxsb3dzIHlvdSB0byBwYXJzZQorICAgICAqIG11bHRpcGxlIHJlc291cmNlcyB3aGVyZSBhIGZvcmVpZ24ga2V5IGluIG9uZSByZXNvdXJjZSBtaWdodCByZWZlcgorICAgICAqIHRvIGEgdGFibGUgaW4gYW5vdGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxheUNvbnN0cmFpbnRSZXNvbHZlKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWxheSByZXNvbHV0aW9uIG9mIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIHVudGlsCisgICAgICoge0BsaW5rICNyZXNvbHZlQ29uc3RyYWludHN9IGlzIGNhbGxlZC4gVGhpcyBhbGxvd3MgeW91IHRvIHBhcnNlCisgICAgICogbXVsdGlwbGUgcmVzb3VyY2VzIHdoZXJlIGEgZm9yZWlnbiBrZXkgaW4gb25lIHJlc291cmNlIG1pZ2h0IHJlZmVyCisgICAgICogdG8gYSB0YWJsZSBpbiBhbm90aGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbGF5Q29uc3RyYWludFJlc29sdmUoYm9vbGVhbiBkZWxheSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2NoZW1hIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFHcm91cCBnZXRTY2hlbWFHcm91cCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50IHNjaGVtYSBncm91cDsgdGhpcyBjbGVhcnMgYWxsIHN0YXRlIGZyb20gdGhlIGxhc3QgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR3JvdXAoU2NoZW1hR3JvdXAgZ3JvdXApOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBwYXJzZXIgaXMgaW4gZGVsYXllZCByZXNvbHZlIG1vZGUsIHJlc29sdmUgYWxsIGNvbnN0cmFpbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc29sdmVDb25zdHJhaW50cygpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hU2VyaWFsaXplci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTExZDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9TY2hlbWFTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuTWV0YURhdGFTZXJpYWxpemVyOworCisvKioKKyAqIEludGVyZmFjZSBmb3Igc2NoZW1hIHNlcmlhbGl6ZXJzLiBTZXJpYWxpemVycyB3b3JrIGF0IHRoZSBmaW5lLWdyYWluZWQKKyAqIGZpbmUtZ3JhaW5lZCB0YWJsZSBsZXZlbCB0byBhbGxvdyB5b3UgdG8gc3BsaXQgc2NoZW1hcyBhbW9uZyBtdWx0aXBsZSBmaWxlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVNlcmlhbGl6ZXIKKyAgICBleHRlbmRzIE1ldGFEYXRhU2VyaWFsaXplciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB0YWJsZXMgdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIFRhYmxlW10gZ2V0VGFibGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHRhYmxlIHRvIHRoZSBzZXQgb2YgdGFibGVzIHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRhYmxlKFRhYmxlIHRhYmxlKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdGFibGUgZnJvbSB0aGUgc2V0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGFibGUgd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBpbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVUYWJsZShUYWJsZSB0YWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHNjaGVtYSdzIG9iamVjdHMgdG8gdGhlIHNldCBvZiBvYmplY3RzIHRoYXQgd2lsbCBiZQorICAgICAqIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxsKFNjaGVtYSBzY2hlbWEpOworCisgICAgLyoqCisgICAgICogQWRkIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gZ3JvdXAgdG8gdGhlIHNldCBvZiBvYmplY3RzIHRoYXQKKyAgICAgKiB3aWxsIGJlIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxsKFNjaGVtYUdyb3VwIGdyb3VwKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gc2NoZW1hJ3Mgb2JqZWN0cyBmcm9tIHRoZSBzZXQgdG8gYmUgc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb2JqZWN0cyBpbiBzY2hlbWEgcmVtb3ZlZCwgZmFsc2UgaWYgbm9uZSBpbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoU2NoZW1hIHNjaGVtYSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHNjaGVtYXMgaW4gdGhlIGdpdmVuIGdyb3VwIGZyb20gdGhlIHNldCB0byBiZSBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBvYmplY3RzIGluIHRoZSBncm91cCB3ZXJlIHJlbW92ZWQsIGZhbHNlIGlmCisgICAgICogbm9uZSBpbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoU2NoZW1hR3JvdXAgZ3JvdXApOworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIHNldCBvZiBvYmplY3RzIHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NjaGVtYVRvb2wuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NjaGVtYVRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzExODZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hVG9vbC5qYXZhCkBAIC0wLDAgKzEsMTUxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnZhbGlkU3RhdGVFeGNlcHRpb247CisKKy8qKgorICogVGhlIFNjaGVtYVRvb2wgaXMgdXNlZCB0byBtYW5hZ2UgdGhlIGRhdGFiYXNlIHNjaGVtYS4gTm90ZSB0aGF0IHRoZQorICogdG9vbCBuZXZlciBhZGRzIG9yIGRyb3BzIHVuaXF1ZSBjb25zdHJhaW50cyBmcm9tIGV4aXN0aW5nIHRhYmxlcywgYmVjYXVzZQorICogSkRCQyB7QGxpbmsgRGF0YWJhc2VNZXRhRGF0YX0gZG9lcyBub3QgaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiB0aGVzZQorICogY29uc3RyYWludHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWFUb29sIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BREQgPSAiYWRkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRFJPUCA9ICJkcm9wIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVUQUlOID0gInJldGFpbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFRlJFU0ggPSAicmVmcmVzaCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0JVSUxEID0gImJ1aWxkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVGTEVDVCA9ICJyZWZsZWN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ1JFQVRFREIgPSAiY3JlYXRlREIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9EUk9QREIgPSAiZHJvcERCIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU1QT1JUID0gImltcG9ydCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VYUE9SVCA9ICJleHBvcnQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9ERUxFVEVfVEFCTEVfQ09OVEVOVFMgPSAKKyAgICAgICAgImRlbGV0ZVRhYmxlQ29udGVudHMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBQ1RJT05TID0gbmV3IFN0cmluZ1tdeworICAgICAgICBBQ1RJT05fQURELAorICAgICAgICBBQ1RJT05fRFJPUCwKKyAgICAgICAgQUNUSU9OX1JFVEFJTiwKKyAgICAgICAgQUNUSU9OX1JFRlJFU0gsCisgICAgICAgIEFDVElPTl9CVUlMRCwKKyAgICAgICAgQUNUSU9OX1JFRkxFQ1QsCisgICAgICAgIEFDVElPTl9DUkVBVEVEQiwKKyAgICAgICAgQUNUSU9OX0RST1BEQiwKKyAgICAgICAgQUNUSU9OX0lNUE9SVCwKKyAgICAgICAgQUNUSU9OX0VYUE9SVCwKKyAgICAgICAgQUNUSU9OX0RFTEVURV9UQUJMRV9DT05URU5UUywKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU2NoZW1hVG9vbC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIEpEQkNDb25maWd1cmF0aW9uIF9jb25mOworICAgIHByaXZhdGUgZmluYWwgRGF0YVNvdXJjZSBfZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgX2xvZzsKKyAgICBwcml2YXRlIGZpbmFsIERCRGljdGlvbmFyeSBfZGljdDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfYWN0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBfaWdub3JlRXJycyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfb3BlbmpwYVRhYmxlcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfZHJvcFRhYmxlcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9kcm9wU2VxcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wa3MgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfZmtzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2luZGV4ZXMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc2VxcyA9IHRydWU7CisgICAgcHJpdmF0ZSBQcmludFdyaXRlciBfd3JpdGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFNjaGVtYUdyb3VwIF9ncm91cCA9IG51bGw7CisgICAgcHJpdmF0ZSBTY2hlbWFHcm91cCBfZGIgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfZnVsbERCID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBUb29scyBjb25zdHJ1Y3RlZCB0aGlzIHdheSB3aWxsIG5vdCBoYXZlIGFuCisgICAgICogYWN0aW9uLCBzbyB0aGUge0BsaW5rICNydW4oKX0gbWV0aG9kIHdpbGwgYmUgYSBuby1vcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVG9vbChKREJDQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHRoaXMoY29uZiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgdG9vbCB0byBwZXJmb3JtIHRoZSBnaXZlbiBhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFNjaGVtYVRvb2woSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGFjdGlvbikgeworICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgIUFycmF5cy5hc0xpc3QoQUNUSU9OUykuY29udGFpbnMoYWN0aW9uKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiA9PSAiICsgYWN0aW9uKTsKKworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgICAgIF9hY3Rpb24gPSBhY3Rpb247CisgICAgICAgIF9kcyA9IGNvbmYuZ2V0RGF0YVNvdXJjZTIobnVsbCk7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfU0NIRU1BKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoaXMgdXAtZnJvbnQ7IG90aGVyd2lzZSB0aGUgZGJkaWN0aW9uYXJ5ZmFjdG9yeSBtaWdodAorICAgICAgICAvLyB0cnkgdG8gdGFrZSBhIGNvbm5lY3Rpb24gdG8gaW5pdGlhbGl6ZSB3aGVuIHdlJ3ZlIGFscmVhZHkgZ290IG9uZToKKyAgICAgICAgLy8gYmFkIG5ld3MgaWYgdGhlIG1heCBwb29sIGlzIDEKKyAgICAgICAgX2RpY3QgPSBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gc3VwcGxpZWQgb24gY29uc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBTUUxFeGNlcHRpb25zIHRocm93biBkdXJpbmcgc2NoZW1hIG1hbmlwdWxhdGlvbiB3aWxsIGJlCisgICAgICogcHJpbnRlZCBidXQgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVFcnJvcnMoKSB7CisgICAgICAgIHJldHVybiBfaWdub3JlRXJyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBTUUxFeGNlcHRpb25zIHRocm93biBkdXJpbmcgc2NoZW1hIG1hbmlwdWxhdGlvbiB3aWxsIGJlCisgICAgICogcHJpbnRlZCBidXQgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiBpZ25vcmVFcnJzKSB7CisgICAgICAgIF9pZ25vcmVFcnJzID0gaWdub3JlRXJyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFjdCBvbiBzcGVjaWFsIHRhYmxlcyB1c2VkIGJ5IE9wZW5KUEEgY29tcG9uZW50cworICAgICAqIGZvciBib29ra2VlcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcGVuSlBBVGFibGVzKCkgeworICAgICAgICByZXR1cm4gX29wZW5qcGFUYWJsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhY3Qgb24gc3BlY2lhbCB0YWJsZXMgdXNlZCBieSBPcGVuSlBBIGNvbXBvbmVudHMKKyAgICAgKiBmb3IgYm9va2tlZXBpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3BlbkpQQVRhYmxlcyhib29sZWFuIG9wZW5qcGFUYWJsZXMpIHsKKyAgICAgICAgX29wZW5qcGFUYWJsZXMgPSBvcGVuanBhVGFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRhYmxlcyB0aGF0IGFwcGVhciB0byBiZSB1bnVzZWQgd2lsbCBiZSBkcm9wcGVkLiBEZWZhdWx0cyB0bworICAgICAqIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHJvcFRhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIF9kcm9wVGFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRhYmxlcyB0aGF0IGFwcGVhciB0byBiZSB1bnVzZWQgd2lsbCBiZSBkcm9wcGVkLiBEZWZhdWx0cyB0bworICAgICAqIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcFRhYmxlcyhib29sZWFuIGRyb3BUYWJsZXMpIHsKKyAgICAgICAgX2Ryb3BUYWJsZXMgPSBkcm9wVGFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHNlcXVlbmNlcyB0aGF0IGFwcGVhciB0byBiZSB1bnVzZWQgd2lsbCBiZSBkcm9wcGVkLiBEZWZhdWx0cworICAgICAqIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHJvcFNlcXVlbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIF9kcm9wU2VxczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBzZXF1ZW5jZXMgdGhhdCBhcHBlYXIgdG8gYmUgdW51c2VkIHdpbGwgYmUgZHJvcHBlZC4gRGVmYXVsdHMKKyAgICAgKiB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyb3BTZXF1ZW5jZXMoYm9vbGVhbiBkcm9wU2VxcykgeworICAgICAgICBfZHJvcFNlcXMgPSBkcm9wU2VxczsKKyAgICAgICAgaWYgKGRyb3BTZXFzKQorICAgICAgICAgICAgc2V0U2VxdWVuY2VzKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgc2VxdWVuY2VzIHNob3VsZCBiZSBtYW5pcHVsYXRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZXF1ZW5jZXMoKSB7CisgICAgICAgIHJldHVybiBfc2VxczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHNlcXVlbmNlcyBzaG91bGQgYmUgbWFuaXB1bGF0ZWQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VxdWVuY2VzKGJvb2xlYW4gc2VxcykgeworICAgICAgICBfc2VxcyA9IHNlcXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBpbmRleGVzIG9uIGV4aXN0aW5nIHRhYmxlcyBzaG91bGQgYmUgbWFuaXB1bGF0ZWQuCisgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmRleGVzKCkgeworICAgICAgICByZXR1cm4gX2luZGV4ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBpbmRleGVzIG9uIGV4aXN0aW5nIHRhYmxlcyBzaG91bGQgYmUgbWFuaXB1bGF0ZWQuCisgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleGVzKGJvb2xlYW4gaW5kZXhlcykgeworICAgICAgICBfaW5kZXhlcyA9IGluZGV4ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBmb3JlaWduIGtleXMgb24gZXhpc3RpbmcgdGFibGVzIHNob3VsZCBiZSBtYW5pcHVsYXRlZC4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmVpZ25LZXlzKCkgeworICAgICAgICByZXR1cm4gX2ZrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGZvcmVpZ24ga2V5cyBvbiBleGlzdGluZyB0YWJsZXMgc2hvdWxkIGJlIG1hbmlwdWxhdGVkLgorICAgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleXMoYm9vbGVhbiBma3MpIHsKKyAgICAgICAgX2ZrcyA9IGZrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHByaW1hcnkga2V5cyBvbiBleGlzdGluZyB0YWJsZXMgc2hvdWxkIGJlIG1hbmlwdWxhdGVkLgorICAgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJpbWFyeUtleXMoKSB7CisgICAgICAgIHJldHVybiBfcGtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgcHJpbWFyeSBrZXlzIG9uIGV4aXN0aW5nIHRhYmxlcyBzaG91bGQgYmUgbWFuaXB1bGF0ZWQuCisgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5cyhib29sZWFuIHBrcykgeworICAgICAgICBfcGtzID0gcGtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8gZm9yIHRoZSBjcmVhdGlvbiBvZiBTUUwgc2NyaXB0cy4gSWYgdGhlCisgICAgICogc3RyZWFtIGlzIG5vbi1udWxsLCBhbGwgU1FMIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIHN0cmVhbSByYXRoZXIgdGhhbgorICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBXcml0ZXIgZ2V0V3JpdGVyKCkgeworICAgICAgICByZXR1cm4gX3dyaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvIGZvciB0aGUgY3JlYXRpb24gb2YgU1FMIHNjcmlwdHMuIElmIHRoZQorICAgICAqIHN0cmVhbSBpcyBub24tbnVsbCwgYWxsIFNRTCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBzdHJlYW0gcmF0aGVyIHRoYW4KKyAgICAgKiBleGVjdXRlZCBhZ2FpbnN0IHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZXIoV3JpdGVyIHdyaXRlcikgeworICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCisgICAgICAgICAgICBfd3JpdGVyID0gbnVsbDsKKyAgICAgICAgZWxzZSBpZiAod3JpdGVyIGluc3RhbmNlb2YgUHJpbnRXcml0ZXIpCisgICAgICAgICAgICBfd3JpdGVyID0gKFByaW50V3JpdGVyKSB3cml0ZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF93cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNjaGVtYSBncm91cCB0aGUgdG9vbCB3aWxsIGFjdCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgZ2V0U2NoZW1hR3JvdXAoKSB7CisgICAgICAgIHJldHVybiBfZ3JvdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY2hlbWEgZ3JvdXAgdGhlIHRvb2wgd2lsbCBhY3Qgb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR3JvdXAoU2NoZW1hR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgX2dyb3VwID0gZ3JvdXA7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8KKyAgICAvLyBBY3Rpb25zCisgICAgLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbCBhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfYWN0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKEFDVElPTl9BREQuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgYWRkKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9EUk9QLmVxdWFscyhfYWN0aW9uKSkKKyAgICAgICAgICAgIGRyb3AoKTsKKyAgICAgICAgZWxzZSBpZiAoQUNUSU9OX1JFVEFJTi5lcXVhbHMoX2FjdGlvbikpCisgICAgICAgICAgICByZXRhaW4oKTsKKyAgICAgICAgZWxzZSBpZiAoQUNUSU9OX1JFRlJFU0guZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgcmVmcmVzaCgpOworICAgICAgICBlbHNlIGlmIChBQ1RJT05fQlVJTEQuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgYnVpbGQoKTsKKyAgICAgICAgZWxzZSBpZiAoQUNUSU9OX0NSRUFURURCLmVxdWFscyhfYWN0aW9uKSkKKyAgICAgICAgICAgIGNyZWF0ZURCKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9EUk9QREIuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgZHJvcERCKCk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9ERUxFVEVfVEFCTEVfQ09OVEVOVFMuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgZGVsZXRlVGFibGVDb250ZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW55IGNvbXBvbmVudHMgcHJlc2VudCBpbiB0aGUgc2NoZW1hIHJlcG9zaXRvcnkgYnV0IGFic2VudCBmcm9tCisgICAgICogdGhlIGRhdGFiYXNlLiBQYWNrYWdlLXByaXZhdGUgZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgdm9pZCBhZGQoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkKGdldERCU2NoZW1hR3JvdXAoZmFsc2UpLCBhc3NlcnRTY2hlbWFHcm91cCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcm9wcyBhbGwgc2NoZW1hIGNvbXBvbmVudHMgaW4gdGhlIHNjaGVtYSByZXBvc2l0b3J5IHRoYXQgYWxzbyBleGlzdAorICAgICAqIGluIHRoZSBkYXRhYmFzZS4gUGFja2FnZS1wcml2YXRlIGZvciB0ZXN0aW5nLgorICAgICAqLworICAgIHZvaWQgZHJvcCgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBkcm9wKGdldERCU2NoZW1hR3JvdXAoZmFsc2UpLCBhc3NlcnRTY2hlbWFHcm91cCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcm9wcyBkYXRhYmFzZSBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBtZW50aW9uZWQgaW4gdGhlIHNjaGVtYQorICAgICAqIHJlcG9zaXRvcnkuIFBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHJldGFpbigpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXRhaW4oZ2V0REJTY2hlbWFHcm91cCh0cnVlKSwgYXNzZXJ0U2NoZW1hR3JvdXAoKSwKKyAgICAgICAgICAgIGdldERyb3BUYWJsZXMoKSwgZ2V0RHJvcFNlcXVlbmNlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFueSBjb21wb25lbnRzIHByZXNlbnQgaW4gdGhlIHNjaGVtYSByZXBvc2l0b3J5IGJ1dCBhYnNlbnQgZnJvbQorICAgICAqIHRoZSBkYXRhYmFzZSwgYW5kIGRyb3BzIHVudXNlZCBkYXRhYmFzZSBjb21wb25lbnRzLgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHJlZnJlc2goKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU2NoZW1hR3JvdXAgbG9jYWwgPSBhc3NlcnRTY2hlbWFHcm91cCgpOworICAgICAgICBTY2hlbWFHcm91cCBkYiA9IGdldERCU2NoZW1hR3JvdXAodHJ1ZSk7CisgICAgICAgIHJldGFpbihkYiwgbG9jYWwsIGdldERyb3BUYWJsZXMoKSwgZ2V0RHJvcFNlcXVlbmNlcygpKTsKKyAgICAgICAgYWRkKGRiLCBsb2NhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmUtZXhlY3V0ZSBhbGwgU1FMIHVzZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgY3VycmVudCBkYXRhYmFzZTsKKyAgICAgKiB0aGlzIGFjdGlvbiBpcyB1c3VhbGx5IHVzZWQgd2hlbiBjcmVhdGluZyBTUUwgc2NyaXB0cy4KKyAgICAgKiBQYWNrYWdlLXByaXZhdGUgZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgdm9pZCBjcmVhdGVEQigpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IG5ldyBTY2hlbWFHcm91cCgpOworICAgICAgICBncm91cC5hZGRTY2hlbWEoKTsKKyAgICAgICAgYWRkKGdyb3VwLCBnZXREQlNjaGVtYUdyb3VwKHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZS1leGVjdXRlIGFsbCBTUUwgdXNlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBjdXJyZW50IGRhdGFiYXNlOworICAgICAqIHRoaXMgYWN0aW9uIGlzIHVzdWFsbHkgdXNlZCB3aGVuIGNyZWF0aW5nIFNRTCBzY3JpcHRzLgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICB2b2lkIGJ1aWxkKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFNjaGVtYUdyb3VwIGdyb3VwID0gbmV3IFNjaGVtYUdyb3VwKCk7CisgICAgICAgIGdyb3VwLmFkZFNjaGVtYSgpOworICAgICAgICBhZGQoZ3JvdXAsIGFzc2VydFNjaGVtYUdyb3VwKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3AgdGhlIGN1cnJlbnQgZGF0YWJhc2UuIFBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICB2b2lkIGRyb3BEQigpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXRhaW4oZ2V0REJTY2hlbWFHcm91cCh0cnVlKSwgbmV3IFNjaGVtYUdyb3VwKCksIHRydWUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzc3VlIERFTEVURSBzdGF0ZW1lbnQgYWdhaW5zdCBhbGwga25vd24gdGFibGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWxldGVUYWJsZUNvbnRlbnRzKCkgCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IGdldFNjaGVtYUdyb3VwKCk7CisgICAgICAgIFNjaGVtYVtdIHNjaGVtYXMgPSBncm91cC5nZXRTY2hlbWFzKCk7CisgICAgICAgIENvbGxlY3Rpb24gdGFibGVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBUYWJsZVtdIHRzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdHMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgdGFibGVzLmFkZCh0c1tqXSk7CisgICAgICAgIH0KKyAgICAgICAgVGFibGVbXSB0YWJsZUFycmF5ID0gKFRhYmxlW10pIHRhYmxlcy50b0FycmF5KG5ldyBUYWJsZVt0YWJsZXMuc2l6ZSgpXSk7CisgICAgICAgIFN0cmluZ1tdIHNxbCA9IF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCkKKyAgICAgICAgICAgIC5nZXREZWxldGVUYWJsZUNvbnRlbnRzU1FMKHRhYmxlQXJyYXkpOworICAgICAgICBpZiAoIWV4ZWN1dGVTUUwoc3FsKSkKKyAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZGVsZXRlLXRhYmxlLWNvbnRlbnRzIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBEQiBpbiB0aGUgY3VycmVudCB7QGxpbmsgU2NoZW1hRmFjdG9yeX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb3JkKCkgeworICAgICAgICBpZiAoX2RiICE9IG51bGwgJiYgX3dyaXRlciA9PSBudWxsKQorICAgICAgICAgICAgX2NvbmYuZ2V0U2NoZW1hRmFjdG9yeUluc3RhbmNlKCkuc3RvcmVTY2hlbWEoX2RiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFsbCBkYXRhYmFzZSBjb21wb25lbnRzIGluIHRoZSByZXBvc2l0b3J5IHNjaGVtYSB0aGF0IGFyZSBub3QKKyAgICAgKiBwcmVzZW50IGluIHRoZSBnaXZlbiBkYXRhYmFzZSBzY2hlbWEgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGQoU2NoZW1hR3JvdXAgZGIsIFNjaGVtYUdyb3VwIHJlcG9zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYWRkIHNlcXVlbmNlcworICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gcmVwb3MuZ2V0U2NoZW1hcygpOworICAgICAgICBTY2hlbWEgc2NoZW1hOworICAgICAgICBpZiAoX3NlcXMpIHsKKyAgICAgICAgICAgIFNlcXVlbmNlW10gc2VxczsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHNlcXMgPSBzY2hlbWFzW2ldLmdldFNlcXVlbmNlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2Vxcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGIuZmluZFNlcXVlbmNlKHNlcXNbal0pICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlU2VxdWVuY2Uoc2Vxc1tqXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGRiLmdldFNjaGVtYShzZXFzW2pdLmdldFNjaGVtYU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gZGIuYWRkU2NoZW1hKHNlcXNbal0uZ2V0U2NoZW1hTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5pbXBvcnRTZXF1ZW5jZShzZXFzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImFkZC1zZXEiLCBzZXFzW2pdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGluIHRoaXMgbWV0aG9kOyBzdGFydCB3aXRoIGNvbHVtbnMKKyAgICAgICAgVGFibGVbXSB0YWJzOworICAgICAgICBUYWJsZSBkYlRhYmxlOworICAgICAgICBDb2x1bW5bXSBjb2xzOworICAgICAgICBDb2x1bW4gY29sOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYnMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgY29scyA9IHRhYnNbal0uZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgICAgIGRiVGFibGUgPSBkYi5maW5kVGFibGUodGFic1tqXSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb2xzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYlRhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGRiVGFibGUuZ2V0Q29sdW1uKGNvbHNba10uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRDb2x1bW4oY29sc1trXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiVGFibGUuaW1wb3J0Q29sdW1uKGNvbHNba10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJhZGQtY29sIiwgY29sc1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbHNba10uZXF1YWxzQ29sdW1uKGNvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImJhZC1jb2wiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgZGJUYWJsZSwgY29sLmdldERlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHNba10uZ2V0RGVzY3JpcHRpb24oKSB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmltYXJ5IGtleXMKKyAgICAgICAgaWYgKF9wa3MpIHsKKyAgICAgICAgICAgIFByaW1hcnlLZXkgcGs7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGsgPSB0YWJzW2pdLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgZGJUYWJsZSA9IGRiLmZpbmRUYWJsZSh0YWJzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrICE9IG51bGwgJiYgIXBrLmlzTG9naWNhbCgpICYmIGRiVGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiVGFibGUuZ2V0UHJpbWFyeUtleSgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhZGRQcmltYXJ5S2V5KHBrKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlLmltcG9ydFByaW1hcnlLZXkocGspOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGJUYWJsZS5nZXRQcmltYXJ5S2V5KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImFkZC1wayIsIHBrLCB0YWJzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcGsuZXF1YWxzUHJpbWFyeUtleShkYlRhYmxlLmdldFByaW1hcnlLZXkoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJiYWQtcGsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlLmdldFByaW1hcnlLZXkoKSwgZGJUYWJsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGFibGVzCisgICAgICAgIFNldCBuZXdUYWJsZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYnMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRiLmZpbmRUYWJsZSh0YWJzW2pdKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChjcmVhdGVUYWJsZSh0YWJzW2pdKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZXMuYWRkKHRhYnNbal0pOworICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSBkYi5nZXRTY2hlbWEodGFic1tqXS5nZXRTY2hlbWFOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSBkYi5hZGRTY2hlbWEodGFic1tqXS5nZXRTY2hlbWFOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBzY2hlbWEuaW1wb3J0VGFibGUodGFic1tqXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYWRkLXRhYmxlIiwgdGFic1tqXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5kZXhlcworICAgICAgICBJbmRleFtdIGlkeHM7CisgICAgICAgIEluZGV4IGlkeDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpbmRleGVzIG9uIG5ldyB0YWJsZXMgZXZlbiBpZiBpbmRleGVzCisgICAgICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHR1cm5lZCBvZmYKKyAgICAgICAgICAgICAgICBpZiAoIV9pbmRleGVzICYmICFuZXdUYWJsZXMuY29udGFpbnModGFic1tqXSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWR4cyA9IHRhYnNbal0uZ2V0SW5kZXhlcygpOworICAgICAgICAgICAgICAgIGRiVGFibGUgPSBkYi5maW5kVGFibGUodGFic1tqXSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBpZHhzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYlRhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGZpbmRJbmRleChkYlRhYmxlLCBpZHhzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVJbmRleChpZHhzW2tdLCBkYlRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJUYWJsZS5pbXBvcnRJbmRleChpZHhzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYWRkLWluZGV4IiwgaWR4c1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlkeHNba10uZXF1YWxzSW5kZXgoaWR4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImJhZC1pbmRleCIsIGlkeCwgZGJUYWJsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVW5pcXVlIENvbnN0cmFpbnRzIG9uIGdyb3VwIG9mIGNvbHVtbnMKKyAgICAgICAgVW5pcXVlW10gdW5pcXVlczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB1bmlxdWUgY29uc3RyYWludHMgb25seSBvbiBuZXcgdGFibGVzIAorICAgICAgICAgICAgICAgIGlmICghbmV3VGFibGVzLmNvbnRhaW5zKHRhYnNbal0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHVuaXF1ZXMgPSB0YWJzW2pdLmdldFVuaXF1ZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAodW5pcXVlcyA9PSBudWxsIHx8IHVuaXF1ZXMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRiVGFibGUgPSBkYi5maW5kVGFibGUodGFic1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKGRiVGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB1bmlxdWVzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGRiVGFibGUuaW1wb3J0VW5pcXVlKHVuaXF1ZXNba10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gZm9yZWlnbiBrZXlzCisgICAgICAgIEZvcmVpZ25LZXlbXSBma3M7CisgICAgICAgIEZvcmVpZ25LZXkgZms7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFicyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9yZWlnbiBrZXlzIG9uIG5ldyB0YWJsZXMgZXZlbiBpZiBma3MKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGJlZW4gdHVybmVkIG9mZgorICAgICAgICAgICAgICAgIGlmICghX2ZrcyAmJiAhbmV3VGFibGVzLmNvbnRhaW5zKHRhYnNbal0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGZrcyA9IHRhYnNbal0uZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgICAgICAgICBkYlRhYmxlID0gZGIuZmluZFRhYmxlKHRhYnNbal0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmtzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmtzW2tdLmlzTG9naWNhbCgpICYmIGRiVGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmsgPSBmaW5kRm9yZWlnbktleShkYlRhYmxlLCBma3Nba10pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRm9yZWlnbktleShma3Nba10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlLmltcG9ydEZvcmVpZ25LZXkoZmtzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYWRkLWZrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZrc1trXSwgdGFic1tqXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmtzW2tdLmVxdWFsc0ZvcmVpZ25LZXkoZmspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYmFkLWZrIiwgZmssIGRiVGFibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3BzIGFsbCBkYXRhYmFzZSBjb21wb25lbnRzIHRoYXQgYXJlIGluIHRoZSBnaXZlbiBkYXRhYmFzZSBzY2hlbWEKKyAgICAgKiBidXQgbm90IGluIHRoZSByZXBvc2l0b3J5IHNjaGVtYS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmV0YWluKFNjaGVtYUdyb3VwIGRiLCBTY2hlbWFHcm91cCByZXBvcywgYm9vbGVhbiB0YWJsZXMsCisgICAgICAgIGJvb2xlYW4gc2VxdWVuY2VzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU2NoZW1hW10gc2NoZW1hcyA9IGRiLmdldFNjaGVtYXMoKTsKKyAgICAgICAgaWYgKF9zZXFzICYmIHNlcXVlbmNlcykgeworICAgICAgICAgICAgU2VxdWVuY2VbXSBzZXFzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2VxcyA9IHNjaGVtYXNbaV0uZ2V0U2VxdWVuY2VzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZXFzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNEcm9wcGFibGUoc2Vxc1tqXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zLmZpbmRTZXF1ZW5jZShzZXFzW2pdKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcFNlcXVlbmNlKHNlcXNbal0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYXNbaV0ucmVtb3ZlU2VxdWVuY2Uoc2Vxc1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJkcm9wLXNlcSIsIHNlcXNbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBpbiB0aGlzIG1ldGhvZDsgc3RhcnQgd2l0aCBmb3JlaWduIGtleXMKKyAgICAgICAgVGFibGVbXSB0YWJzOworICAgICAgICBUYWJsZSByZXBvc1RhYmxlOworICAgICAgICBpZiAoX2ZrcykgeworICAgICAgICAgICAgRm9yZWlnbktleVtdIGZrczsKKyAgICAgICAgICAgIEZvcmVpZ25LZXkgZms7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Ryb3BwYWJsZSh0YWJzW2pdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBma3MgPSB0YWJzW2pdLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgICAgICAgICAgICAgIHJlcG9zVGFibGUgPSByZXBvcy5maW5kVGFibGUodGFic1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGVzICYmIHJlcG9zVGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmtzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmtzW2tdLmlzTG9naWNhbCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBmayA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3NUYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZrID0gZmluZEZvcmVpZ25LZXkocmVwb3NUYWJsZSwgZmtzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc1RhYmxlID09IG51bGwgfHwgZmsgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFma3Nba10uZXF1YWxzRm9yZWlnbktleShmaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZvcmVpZ25LZXkoZmtzW2tdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFic1tqXS5yZW1vdmVGb3JlaWduS2V5KGZrc1trXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImRyb3AtZmsiLCBma3Nba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmltYXJ5IGtleXMKKyAgICAgICAgaWYgKF9wa3MpIHsKKyAgICAgICAgICAgIFByaW1hcnlLZXkgcGs7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Ryb3BwYWJsZSh0YWJzW2pdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBwayA9IHRhYnNbal0uZ2V0UHJpbWFyeUtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGsgIT0gbnVsbCAmJiBway5pc0xvZ2ljYWwoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIHJlcG9zVGFibGUgPSByZXBvcy5maW5kVGFibGUodGFic1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwayAhPSBudWxsICYmIHJlcG9zVGFibGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJlcG9zVGFibGUuZ2V0UHJpbWFyeUtleSgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFway5lcXVhbHNQcmltYXJ5S2V5KHJlcG9zVGFibGUuZ2V0UHJpbWFyeUtleSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wUHJpbWFyeUtleShwaykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFic1tqXS5yZW1vdmVQcmltYXJ5S2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJkcm9wLXBrIiwgcGssIHRhYnNbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbHVtbnMKKyAgICAgICAgQ29sdW1uW10gY29sczsKKyAgICAgICAgQ29sdW1uIGNvbDsKKyAgICAgICAgQ29sbGVjdGlvbiBkcm9wcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFicyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzRHJvcHBhYmxlKHRhYnNbal0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjb2xzID0gdGFic1tqXS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgcmVwb3NUYWJsZSA9IHJlcG9zLmZpbmRUYWJsZSh0YWJzW2pdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwb3NUYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgY29scy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gcmVwb3NUYWJsZS5nZXRDb2x1bW4oY29sc1trXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBudWxsIHx8ICFjb2xzW2tdLmVxdWFsc0NvbHVtbihjb2wpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYnNbal0uZ2V0Q29sdW1ucygpLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcy5hZGQodGFic1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJvcENvbHVtbihjb2xzW2tdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFic1tqXS5yZW1vdmVDb2x1bW4oY29sc1trXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImRyb3AtY29sIiwgY29sc1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB0YWJsZXMKKyAgICAgICAgaWYgKHRhYmxlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGFicyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBpZiAoISFpc0Ryb3BwYWJsZSh0YWJzW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVwb3MuZmluZFRhYmxlKHRhYnNbal0pID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcy5hZGQodGFic1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHJvcFRhYmxlcyhkcm9wcywgZGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3BzIGFsbCBkYXRhYmFzZSBjb21wb25lbnRzIGluIHRoZSBnaXZlbiByZXBvc2l0b3J5IHNjaGVtYS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZHJvcChTY2hlbWFHcm91cCBkYiwgU2NoZW1hR3JvdXAgcmVwb3MpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBkcm9wIHNlcXVlbmNlcworICAgICAgICBTY2hlbWFbXSBzY2hlbWFzID0gcmVwb3MuZ2V0U2NoZW1hcygpOworICAgICAgICBpZiAoX3NlcXMpIHsKKyAgICAgICAgICAgIFNlcXVlbmNlW10gc2VxczsKKyAgICAgICAgICAgIFNlcXVlbmNlIGRiU2VxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2VxcyA9IHNjaGVtYXNbaV0uZ2V0U2VxdWVuY2VzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZXFzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNEcm9wcGFibGUoc2Vxc1tqXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgZGJTZXEgPSBkYi5maW5kU2VxdWVuY2Uoc2Vxc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYlNlcSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcFNlcXVlbmNlKHNlcXNbal0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU2VxLmdldFNjaGVtYSgpLnJlbW92ZVNlcXVlbmNlKGRiU2VxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImRyb3Atc2VxIiwgc2Vxc1tqXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIHRhYmxlcyB0byBkcm9wOyB3ZSBjYW4gb25seSBkcm9wIHRhYmxlcyBpZiB3ZSdyZSBzdXJlCisgICAgICAgIC8vIHRoZSB1c2VyIGxpc3RlZCB0aGUgZW50aXJlIHRhYmxlIGRlZmluaXRpb24gaW4gdGhlIHN0dWZmIHRoZXkgd2FudAorICAgICAgICAvLyBkcm9wcGVkOyBlbHNlIHRoZXkgbWlnaHQganVzdCB3YW50IHRvIGRyb3AgYSBmZXcgY29sdW1ucworICAgICAgICBDb2xsZWN0aW9uIGRyb3BzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgVGFibGVbXSB0YWJzOworICAgICAgICBUYWJsZSBkYlRhYmxlOworICAgICAgICBDb2x1bW5bXSBkYkNvbHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGFicyA9IHNjaGVtYXNbaV0uZ2V0VGFibGVzKCk7CisgICAgICAgICAgICB0YWJsZXM6CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzRHJvcHBhYmxlKHRhYnNbal0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBkYlRhYmxlID0gZGIuZmluZFRhYmxlKHRhYnNbal0pOworICAgICAgICAgICAgICAgIGlmIChkYlRhYmxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZGJDb2xzID0gZGJUYWJsZS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBkYkNvbHMubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJzW2pdLmdldENvbHVtbihkYkNvbHNba10uZ2V0TmFtZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgdGFibGVzOworCisgICAgICAgICAgICAgICAgZHJvcHMuYWRkKHRhYnNbal0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGluIHRoaXMgbWV0aG9kOyBzdGFydCB3aXRoIGZvcmVpZ24ga2V5cyBtZW50aW9uZWQKKyAgICAgICAgLy8gaW4gdGhlIGRyb3Agc2NoZW1hCisgICAgICAgIGlmIChfZmtzKSB7CisgICAgICAgICAgICBGb3JlaWduS2V5W10gZmtzOworICAgICAgICAgICAgRm9yZWlnbktleSBmazsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRhYnMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRHJvcHBhYmxlKHRhYnNbal0pKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGZrcyA9IHRhYnNbal0uZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZGJUYWJsZSA9IGRiLmZpbmRUYWJsZSh0YWJzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBma3MubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChma3Nba10uaXNMb2dpY2FsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZrID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYlRhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmsgPSBmaW5kRm9yZWlnbktleShkYlRhYmxlLCBma3Nba10pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiVGFibGUgPT0gbnVsbCB8fCBmayA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZvcmVpZ25LZXkoZmtzW2tdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJUYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJkcm9wLWZrIiwgZmtzW2tdLCB0YWJzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFsc28gZHJvcCBpbXBvcnRlZCBmb3JlaWduIGtleXMgZm9yIHRhYmxlcyB0aGF0IHdpbGwgYmUgZHJvcHBlZAorICAgICAgICAgICAgVGFibGUgdGFiOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBkcm9wcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHRhYiA9IChUYWJsZSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBkYlRhYmxlID0gZGIuZmluZFRhYmxlKHRhYik7CisgICAgICAgICAgICAgICAgaWYgKGRiVGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBma3MgPSBkYi5maW5kRXhwb3J0ZWRGb3JlaWduS2V5cyhkYlRhYmxlLmdldFByaW1hcnlLZXkoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBma3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BGb3JlaWduS2V5KGZrc1tpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZmtzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJkcm9wLWZrIiwgZmtzW2ldLCBkYlRhYmxlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZHJvcCB0aGUgdGFibGVzIHdlIGNhbGN1bGF0ZWQgYWJvdmUKKyAgICAgICAgZHJvcFRhYmxlcyhkcm9wcywgZGIpOworCisgICAgICAgIC8vIGNvbHVtbnMKKyAgICAgICAgQ29sdW1uW10gY29sczsKKyAgICAgICAgQ29sdW1uIGNvbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJzID0gc2NoZW1hc1tpXS5nZXRUYWJsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmICghaXNEcm9wcGFibGUodGFic1tqXSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNvbHMgPSB0YWJzW2pdLmdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBkYlRhYmxlID0gZGIuZmluZFRhYmxlKHRhYnNbal0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgY29scy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBjb2wgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoZGJUYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gZGJUYWJsZS5nZXRDb2x1bW4oY29sc1trXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGJUYWJsZSA9PSBudWxsIHx8IGNvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BDb2x1bW4oY29sc1trXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYlRhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJUYWJsZS5yZW1vdmVDb2x1bW4oY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImRyb3AtY29sIiwgY29sc1trXSwgdGFic1tqXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHRhYmxlIGlzIGRyb3BwYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEcm9wcGFibGUoVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIF9vcGVuanBhVGFibGVzCisgICAgICAgICAgICB8fCAoIXRhYmxlLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIk9QRU5KUEFfIikKKyAgICAgICAgICAgICYmICF0YWJsZS5nZXROYW1lKCkudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJKRE9fIikpOyAvLyBsZWdhY3kKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2VxdWVuY2UgaXMgZHJvcHBhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0Ryb3BwYWJsZShTZXF1ZW5jZSBzZXEpIHsKKyAgICAgICAgcmV0dXJuIF9vcGVuanBhVGFibGVzCisgICAgICAgICAgICB8fCAoIXNlcS5nZXROYW1lKCkudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJPUEVOSlBBXyIpCisgICAgICAgICAgICAmJiAhc2VxLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIkpET18iKSk7IC8vIGxlZ2FjeQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYW4gaW5kZXggaW4gdGhlIGdpdmVuIHRhYmxlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLgorICAgICAqLworICAgIHByaXZhdGUgSW5kZXggZmluZEluZGV4KFRhYmxlIGRiVGFibGUsIEluZGV4IGlkeCkgeworICAgICAgICBJbmRleFtdIGlkeHMgPSBkYlRhYmxlLmdldEluZGV4ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHhzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGlkeC5jb2x1bW5zTWF0Y2goaWR4c1tpXS5nZXRDb2x1bW5zKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBpZHhzW2ldOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgZm9yZWlnbiBrZXkgaW4gdGhlIGdpdmVuIHRhYmxlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLgorICAgICAqLworICAgIHByaXZhdGUgRm9yZWlnbktleSBmaW5kRm9yZWlnbktleShUYWJsZSBkYlRhYmxlLCBGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIGlmIChmay5nZXRDb25zdGFudENvbHVtbnMoKS5sZW5ndGggPiAwCisgICAgICAgICAgICB8fCBmay5nZXRDb25zdGFudFByaW1hcnlLZXlDb2x1bW5zKCkubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBGb3JlaWduS2V5W10gZmtzID0gZGJUYWJsZS5nZXRGb3JlaWduS2V5cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZrcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChmay5jb2x1bW5zTWF0Y2goZmtzW2ldLmdldENvbHVtbnMoKSwKKyAgICAgICAgICAgICAgICBma3NbaV0uZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZrc1tpXTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIHRhYmxlcyBmcm9tIHRoZSBkYXRhYmFzZSBzY2hlbWEuIE9yZGVycworICAgICAqIHRoZSByZW1vdmFscyBhY2NvcmRpbmcgdG8gZm9yZWlnbiBrZXkgY29uc3RyYWludHMgb24gdGhlIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZHJvcFRhYmxlcyhDb2xsZWN0aW9uIHRhYmxlcywgU2NoZW1hR3JvdXAgY2hhbmdlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhYmxlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVGFibGUgdGFibGU7CisgICAgICAgIFRhYmxlIGNoYW5nZVRhYmxlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHRhYmxlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgdGFibGUgPSAoVGFibGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZHJvcFRhYmxlKHRhYmxlKSkgeworICAgICAgICAgICAgICAgIGNoYW5nZVRhYmxlID0gY2hhbmdlLmZpbmRUYWJsZSh0YWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVRhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRhYmxlLmdldFNjaGVtYSgpLnJlbW92ZVRhYmxlKGNoYW5nZVRhYmxlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZHJvcC10YWJsZSIsIHRhYmxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHRhYmxlIHRvIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlVGFibGUoVGFibGUgdGFibGUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY3V0ZVNRTChfZGljdC5nZXRDcmVhdGVUYWJsZVNRTCh0YWJsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3AgdGhlIGdpdmVuIHRhYmxlIGZyb20gdGhlIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkcm9wVGFibGUoVGFibGUgdGFibGUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY3V0ZVNRTChfZGljdC5nZXREcm9wVGFibGVTUUwodGFibGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHNlcXVlbmNlIHRvIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlU2VxdWVuY2UoU2VxdWVuY2Ugc2VxKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0Q3JlYXRlU2VxdWVuY2VTUUwoc2VxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJvcCB0aGUgZ2l2ZW4gc2VxdWVuY2UgZnJvbSB0aGUgZGF0YWJhc2Ugc2NoZW1hLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRyb3BTZXF1ZW5jZShTZXF1ZW5jZSBzZXEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY3V0ZVNRTChfZGljdC5nZXREcm9wU2VxdWVuY2VTUUwoc2VxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBpbmRleCB0byB0aGUgZGF0YWJhc2Ugc2NoZW1hLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KEluZGV4IGlkeCwgVGFibGUgdGFibGUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpbnQgbWF4ID0gX2RpY3QubWF4SW5kZXhlc1BlclRhYmxlOworCisgICAgICAgIGludCBsZW4gPSB0YWJsZS5nZXRJbmRleGVzKCkubGVuZ3RoOworICAgICAgICBpZiAodGFibGUuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCisgICAgICAgICAgICBsZW4gKz0gdGFibGUuZ2V0UHJpbWFyeUtleSgpLmdldENvbHVtbnMoKS5sZW5ndGg7CisKKyAgICAgICAgaWYgKGxlbiA+PSBtYXgpIHsKKyAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgidG9vLW1hbnktaW5kZXhlcyIsIGlkeCwgdGFibGUsIG1heCArICIiKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXhlY3V0ZVNRTChfZGljdC5nZXRDcmVhdGVJbmRleFNRTChpZHgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcm9wIHRoZSBnaXZlbiBpbmRleCBmcm9tIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZHJvcEluZGV4KEluZGV4IGlkeCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleGVjdXRlU1FMKF9kaWN0LmdldERyb3BJbmRleFNRTChpZHgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGNvbHVtbiB0byB0aGUgZGF0YWJhc2Ugc2NoZW1hLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZENvbHVtbihDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0QWRkQ29sdW1uU1FMKGNvbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3AgdGhlIGdpdmVuIGNvbHVtbiBmcm9tIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZHJvcENvbHVtbihDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0RHJvcENvbHVtblNRTChjb2wpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHByaW1hcnkga2V5IHRvIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkUHJpbWFyeUtleShQcmltYXJ5S2V5IHBrKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0QWRkUHJpbWFyeUtleVNRTChwaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3AgdGhlIGdpdmVuIHByaW1hcnkga2V5IGZyb20gdGhlIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkcm9wUHJpbWFyeUtleShQcmltYXJ5S2V5IHBrKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0RHJvcFByaW1hcnlLZXlTUUwocGspKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IHRvIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkRm9yZWlnbktleShGb3JlaWduS2V5IGZrKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0QWRkRm9yZWlnbktleVNRTChmaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3AgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IGZyb20gdGhlIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkcm9wRm9yZWlnbktleShGb3JlaWduS2V5IGZrKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVTUUwoX2RpY3QuZ2V0RHJvcEZvcmVpZ25LZXlTUUwoZmspKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgZ2V0REJTY2hlbWFHcm91cCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXREQlNjaGVtYUdyb3VwKHRydWUpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGF0YWJhc2Ugc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERCU2NoZW1hR3JvdXAoU2NoZW1hR3JvdXAgZGIpIHsKKyAgICAgICAgX2RiID0gZGI7CisgICAgICAgIGlmIChkYiAhPSBudWxsKQorICAgICAgICAgICAgX2Z1bGxEQiA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkYXRhYmFzZSBzY2hlbWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVsbCBpZiBmYWxzZSwgb25seSB0aGUgdGFibGVzIG5hbWVkIGluIHRoZSBzZXQgc2NoZW1hCisgICAgICogcmVwb3NpdG9yeSB3aWxsIGJlIGdlbmVyYXRlZAorICAgICAqLworICAgIHByaXZhdGUgU2NoZW1hR3JvdXAgZ2V0REJTY2hlbWFHcm91cChib29sZWFuIGZ1bGwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX2RiID09IG51bGwgfHwgKGZ1bGwgJiYgIV9mdWxsREIpKSB7CisgICAgICAgICAgICBTY2hlbWFHZW5lcmF0b3IgZ2VuID0gbmV3IFNjaGVtYUdlbmVyYXRvcihfY29uZik7CisgICAgICAgICAgICBnZW4uc2V0UHJpbWFyeUtleXMoX3Brcyk7CisgICAgICAgICAgICBnZW4uc2V0Rm9yZWlnbktleXMoX2Zrcyk7CisgICAgICAgICAgICBnZW4uc2V0SW5kZXhlcyhfaW5kZXhlcyk7CisgICAgICAgICAgICBpZiAoZnVsbCkKKyAgICAgICAgICAgICAgICBnZW4uZ2VuZXJhdGVTY2hlbWFzKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBvbmx5IHRoZSB0YWJsZXMgaW4gdGhlIGdpdmVuIHJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAvLyBncm91cDsgc29tZSBtYXkgbm90IGV4aXN0IHlldCwgd2hpY2ggaXMgT0s7IHdlIGp1c3QgbmVlZAorICAgICAgICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZGV0ZWN0IHRoZSBjaGFuZ2VzIHRvIHRoZSBvbmVzIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBkbyBleGlzdAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gdGFibGVzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IGFzc2VydFNjaGVtYUdyb3VwKCk7CisgICAgICAgICAgICAgICAgU2NoZW1hW10gc2NoZW1hcyA9IGdyb3VwLmdldFNjaGVtYXMoKTsKKyAgICAgICAgICAgICAgICBUYWJsZVtdIHRhYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYnMgPSBzY2hlbWFzW2ldLmdldFRhYmxlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJzW2pdLmdldFNjaGVtYU5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcy5hZGQoIi4iICsgdGFic1tqXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcy5hZGQodGFic1tqXS5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRhYmxlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGdlbi5nZW5lcmF0ZVNjaGVtYXMoKFN0cmluZ1tdKSB0YWJsZXMudG9BcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBTdHJpbmdbdGFibGVzLnNpemUoKV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9kYiA9IGdlbi5nZXRTY2hlbWFHcm91cCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTY2hlbWFHcm91cCBhc3NlcnRTY2hlbWFHcm91cCgpIHsKKyAgICAgICAgU2NoZW1hR3JvdXAgbG9jYWwgPSBnZXRTY2hlbWFHcm91cCgpOworICAgICAgICBpZiAobG9jYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoInRvb2wtbm9yZXBvcyIpKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8KKyAgICAvLyBVdGlsaXRpZXMKKyAgICAvLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gYXJyYXkgb2Ygbm9uLXNlbGVjdGluZyBTUUwgc3RhdGVtZW50cywgY29ycmVjdGx5CisgICAgICogbG9nZ2luZyB0aGUgU1FMIGNhbGxzIGFuZCBvcHRpb25hbGx5IGlnbm9yaW5nIGVycm9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3YXMgU1FMIHRvIGV4ZWN1dGUgYW5kIHRoZSBjYWxscyB3ZXJlCisgICAgICogc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVTUUwoU3RyaW5nW10gc3FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaWYgbm8gc3FsLCBwcm9iYWJseSBiL2MgZGljdGlvbmFyeSBkb2Vzbid0IHN1cHBvcnQgb3BlcmF0aW9uCisgICAgICAgIGlmIChzcWwubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiBlcnIgPSBmYWxzZTsKKyAgICAgICAgaWYgKF93cml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBvdXRzaWRlIHRoZSB0cnktY2F0Y2ggYmVjYXVzZSBhIGZhaWx1cmUgaGVyZSBpcworICAgICAgICAgICAgLy8gcmVhbGx5IGJhZCwgYW5kIHNob3VsZCBub3QgYmUgaWdub3JlZC4KKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IF9kcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzQXV0byA9IHRydWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdhc0F1dG8gPSBjb25uLmdldEF1dG9Db21taXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXdhc0F1dG8pCisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdCh0cnVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNxbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBjb25uZWN0aW9ucyByZXF1aXJlIHRoYXQgcm9sbGJhY2sgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBvbiB0aGUgY29ubmVjdGlvbiBiZWZvcmUgYW55IERETCBzdGF0ZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYmUgcnVuIG9uIGl0LCBldmVuIHdoZW4gYXV0b2NvbW1pdCBpcyBvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IERETCBzdGF0ZW1lbnRzIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tYW5kcyBpc3N1ZWQgb24gdGhlIGNvbm5lY3Rpb24sIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gcG9vbCBtYXkgaGF2ZSBpc3N1ZWQgc29tZSB2YWxpZGF0aW9uIFNRTC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlKHNxbFtpXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgY29ubmVjdGlvbnMgc2VlbSB0byByZXF1aXJlIGFuIGV4cGxpY2l0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXQgZm9yIERETCBzdGF0ZW1lbnRzLCBldmVuIHdoZW4gYXV0b2NvbW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgb24uIFRoZSBEYXRhRGlyZWN0IGRyaXZlcnMgc2VlbSB0byBzdWZmZXIgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsaW1pdGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoIXdhc0F1dG8pCisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3FsLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIF93cml0ZXIucHJpbnRsbihzcWxbaV0gKyAiOyIpOworICAgICAgICAgICAgX3dyaXRlci5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICFlcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBnaXZlbiBleGNlcHRpb24sIGxvZ2dpbmcgaXQgYW5kIG9wdGlvbmFsbHkgaWdub3JpbmcgaXQsCisgICAgICogZGVwZW5kaW5nIG9uIHRoZSBmbGFncyB0aGlzIFNjaGVtYVRvb2wgd2FzIGNyZWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFNRTEV4Y2VwdGlvbiBzcWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoIV9pZ25vcmVFcnJzKQorICAgICAgICAgICAgdGhyb3cgc3FsOworICAgICAgICBfbG9nLndhcm4oc3FsLmdldE1lc3NhZ2UoKSwgc3FsKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLworICAgIC8vIE1haW4KKyAgICAvLy8vLy8vLworCisgICAgLyoqCisgICAgICogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2wgW29wdGlvbl0qCisgICAgICogWy1hY3Rpb24vLWEgJmx0O2FkZCB8IHJldGFpbiB8IGRyb3AgfCByZWZyZXNoIHwgY3JlYXRlREIgfCBkcm9wREIKKyAgICAgKiB8IGJ1aWxkIHwgcmVmbGVjdCB8IGltcG9ydCB8IGV4cG9ydCZndDtdCisgICAgICogJmx0Oy5zY2hlbWEgZmlsZSBvciByZXNvdXJjZSZndDsqCisgICAgICogIFdoZXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZC4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPi1wcm9wZXJ0aWVzLy1wICZsdDtwcm9wZXJ0aWVzIGZpbGUgb3IgcmVzb3VyY2UmZ3Q7PC9pPjogVGhlCisgICAgICogcGF0aCBvciByZXNvdXJjZSBuYW1lIG9mIGEgT3BlbkpQQSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZworICAgICAqIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGxpY2Vuc2Uga2V5CWFuZCBjb25uZWN0aW9uIGRhdGEgYXMKKyAgICAgKiBvdXRsaW5lZCBpbiB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259LiBPcHRpb25hbC48L2xpPgorICAgICAqIDxsaT48aT4tJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDtwcm9wZXJ0eSB2YWx1ZSZndDs8L2k+OiBBbGwgYmVhbgorICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIE9wZW5KUEEge0BsaW5rIEpEQkNDb25maWd1cmF0aW9ufSBjYW4gYmUgc2V0IGJ5CisgICAgICogdXNpbmcgdGhlaXIJbmFtZXMgYW5kIHN1cHBseWluZyBhIHZhbHVlLiBGb3IgZXhhbXBsZToKKyAgICAgKiA8Y29kZT4tbGljZW5zZUtleSBhZHNsZmphODNyM2xrYWRmPC9jb2RlPjwvbGk+CisgICAgICogPGxpPjxpPi1pZ25vcmVFcnJvcnMvLWkgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogSWYgZmFsc2UsIGFuCisgICAgICogZXhjZXB0aW9uIHdpbGwgd2lsbCBiZSB0aHJvd24gaWYgdGhlIHRvb2wgZW5jb3VudGVycyBhbnkgZGF0YWJhc2UKKyAgICAgKiBleGNlcHRpb25zOyBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICAgKiA8bGk+PGk+LWZpbGUvLWYgJmx0O3N0ZG91dCB8IG91dHB1dCBmaWxlIG9yIHJlc291cmNlJmd0OzwvaT46IFVzZSB0aGlzCisgICAgICogb3B0aW9uIHRvIHdyaXRlIGEgU1FMIHNjcmlwdCBmb3IgdGhlIHBsYW5uZWQgc2NoZW1hIG1vZGlmaWNhdGlvbnMsCisgICAgICogcmF0aGVyIHRoYW4gY29tbWl0dGluZyB0aGVtIHRvIHRoZSBkYXRhYmFzZS4gVGhpcyBvcHRpb24gYWxzbworICAgICAqIGFwcGxpZXMgdG8gdGhlIDxjb2RlPmV4cG9ydDwvY29kZT4gYW5kIDxjb2RlPnJlZmxlY3Q8L2NvZGU+IGFjdGlvbnMuPC9saT4KKyAgICAgKiA8bGk+PGk+LW9wZW5qcGFUYWJsZXMvLWt0ICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFVuZGVyIHRoZQorICAgICAqIDxjb2RlPnJlZmxlY3Q8L2NvZGU+IGFjdGlvbiwgd2hldGhlciB0byByZWZsZWN0IG9uIHRhYmxlcyB3aXRoCisgICAgICogdGhlIG5hbWUgPGNvZGU+T1BFTkpQQV8qPC9jb2RlPi4gVW5kZXIgb3RoZXIgYWN0aW9ucywgd2hldGhlciB0bworICAgICAqIGRyb3Agc3VjaCB0YWJsZXMuIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgICAqIDxsaT48aT4tZHJvcFRhYmxlcy8tZHQgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogU2V0IHRoaXMgb3B0aW9uIHRvCisgICAgICogdHJ1ZSB0byBkcm9wIHRhYmxlcyB0aGF0IGFwcGVhciB0byBiZSB1bnVzZWQgZHVyaW5nCisgICAgICogPGNvZGU+cmV0YWluPC9jb2RlPglhbmQgPGNvZGU+cmVmcmVzaDwvY29kZT4gYWN0aW9ucy4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi48L2xpPgorICAgICAqIDxsaT48aT4tZHJvcFNlcXVlbmNlcy8tZHNxICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFNldCB0aGlzIG9wdGlvbgorICAgICAqIHRvIHRydWUgdG8gZHJvcCBzZXF1ZW5jZXMgdGhhdCBhcHBlYXIgdG8gYmUgdW51c2VkIGR1cmluZworICAgICAqIDxjb2RlPnJldGFpbjwvY29kZT4JYW5kIDxjb2RlPnJlZnJlc2g8L2NvZGU+IGFjdGlvbnMuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKyAgICAgKiA8bGk+PGk+LXByaW1hcnlLZXlzLy1wayAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBXaGV0aGVyIHByaW1hcnkKKyAgICAgKiBrZXlzIG9uIGV4aXN0aW5nIHRhYmxlcyBhcmUgbWFuaXB1bGF0ZWQuIERlZmF1bHRzIHRvIHRydWUuPC9saT4KKyAgICAgKiA8bGk+PGk+LWZvcmVpZ25LZXlzLy1mayAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBXaGV0aGVyIGZvcmVpZ24KKyAgICAgKiBrZXlzIG9uIGV4aXN0aW5nIHRhYmxlcyBhcmUgbWFuaXB1bGF0ZWQuIERlZmF1bHRzIHRvIHRydWUuPC9saT4KKyAgICAgKiA8bGk+PGk+LWluZGV4ZXMvLWl4ICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvaT46IFdoZXRoZXIgaW5kZXhlcworICAgICAqIG9uIGV4aXN0aW5nIHRhYmxlcyBhcmUgbWFuaXB1bGF0ZWQuIERlZmF1bHRzIHRvIHRydWUuPC9saT4KKyAgICAgKiA8bGk+PGk+LXNlcXVlbmNlcy8tc3EgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogV2hldGhlciB0bworICAgICAqIG1hbmlwdWxhdGUgc2VxdWVuY2VzLiBEZWZhdWx0cyB0byB0cnVlLjwvbGk+CisgICAgICogPGxpPjxpPi1yZWNvcmQvLXIgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9pPjogU2V0IHRoaXMgb3B0aW9uIHRvCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHByZXZlbnQgd3JpdGluZyB0aGUgc2NoZW1hIGNoYW5nZXMgdG8gdGhlCisgICAgICogY3VycmVudCB7QGxpbmsgU2NoZW1hRmFjdG9yeX0uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqICBBY3Rpb25zIGNhbiBiZSBjb21wb3NlZCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBUaGUgdmFyaW91cyBhY3Rpb25zIAorICAgICAqICBhcmUgYXMgZm9sbG93cy4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPmFkZDwvaT46IEJyaW5nIHRoZSBzY2hlbWEgdXAtdG8tZGF0ZSB3aXRoIHRoZSBsYXRlc3QKKyAgICAgKiBjaGFuZ2VzIHRvIHRoZSBzY2hlbWEgWE1MIGRhdGEgYnkgYWRkaW5nIHRhYmxlcywgY29sdW1ucywKKyAgICAgKiBpbmRleGVzLCBldGMuIFRoaXMgYWN0aW9uIG5ldmVyIGRyb3BzIGFueSBkYXRhLiBUaGlzIGlzIHRoZQorICAgICAqIGRlZmF1bHQgYWN0aW9uLjwvbGk+CisgICAgICogPGxpPjxpPnJldGFpbjwvaT46IEtlZXAgYWxsIHNjaGVtYSBjb21wb25lbnRzIGluIHRoZSBzY2hlbWEgWE1MLCBidXQKKyAgICAgKiBkcm9wIHRoZSByZXN0IGZyb20gdGhlIGRhdGFiYXNlLiBUaGlzIGFjdGlvbiBuZXZlciBhZGRzIGFueSBkYXRhLjwvbGk+CisgICAgICogPGxpPjxpPmRyb3A8L2k+OiBEcm9wIGFsbCB0aGUgc2NoZW1hIGNvbXBvbmVudHMgaW4gdGhlIHNjaGVtYSBYTUwuPC9saT4KKyAgICAgKiA8bGk+PGk+cmVmcmVzaDwvaT46IEVxdWl2YWxlbnQgdG8gcmV0YWluLCB0aGVuIGFkZC48L2xpPgorICAgICAqIDxsaT48aT5jcmVhdGVEQjwvaT46IEV4ZWN1dGUgU1FMIHRvIHJlLWNyZWF0ZSB0aGUgY3VycmVudCBkYXRhYmFzZS4KKyAgICAgKiBUaGlzIGFjdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggdGhlCisgICAgICogPGNvZGU+ZmlsZTwvY29kZT4gb3B0aW9uLjwvbGk+CisgICAgICogPGxpPjxpPmJ1aWxkPC9pPjogRXhlY3V0ZSBTUUwgdG8gYnVpbGQgdGhlIHNjaGVtYSBkZWZpbmVkIGluIHRoZSBYTUwuCisgICAgICogQmVjYXVzZSBpdCBkb2Vzbid0IHRha2UgdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hIGludG8gYWNjb3VudCwKKyAgICAgKiB0aGlzIGFjdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggdGhlCisgICAgICogPGNvZGU+ZmlsZTwvY29kZT4gb3B0aW9uLjwvbGk+CisgICAgICogPGxpPjxpPnJlZmxlY3Q8L2k+OiBSZWZsZWN0IG9uIHRoZSBjdXJyZW50IGRhdGFiYXNlIHNjaGVtYS4gV3JpdGUgdGhlCisgICAgICogc2NoZW1hJ3MgWE1MIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZQorICAgICAqIDxjb2RlPmZpbGU8L2NvZGU+IG9wdGlvbiwgb3IgdG8gc3Rkb3V0IGlmIG5vIGZpbGUgaXMgZ2l2ZW4uPC9saT4KKyAgICAgKiA8bGk+PGk+ZHJvcERCPC9pPjogRXhlY3V0ZSBTUUwgdG8gZHJvcCB0aGUgY3VycmVudCBkYXRhYmFzZS4gVGhpcworICAgICAqIGFjdGlvbiBpbXBsaWVzIDxjb2RlPmRyb3BUYWJsZXM8L2NvZGU+LjwvbGk+CisgICAgICogPGxpPjxpPmRlbGV0ZVRhYmxlQ29udGVudHM8L2k+OiBFeGVjdXRlIFNRTCB0byBkZWxldGUgYWxsIHJvd3MgZnJvbSAKKyAgICAgKiBhbGwgdGFibGVzIHRoYXQgT3BlbkpQQSBrbm93cyBhYm91dC48L2xpPgorICAgICAqIDxsaT48aT5pbXBvcnQ8L2k+OiBJbXBvcnQgdGhlIGdpdmVuIFhNTCBzY2hlbWEgZGVmaW5pdGlvbiBpbnRvIHRoZQorICAgICAqIGN1cnJlbnQge0BsaW5rIFNjaGVtYUZhY3Rvcnl9LjwvbGk+CisgICAgICogPGxpPjxpPmV4cG9ydDwvaT46IEV4cG9ydCB0aGUgY3VycmVudCB7QGxpbmsgU2NoZW1hRmFjdG9yeX0ncyByZWNvcmRlZAorICAgICAqIHNjaGVtYSB0byBhbiBYTUwgc2NoZW1hIGRlZmluaXRpb24gZmlsZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogIEV4YW1wbGVzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+V3JpdGUgYSBzY3JpcHQgdG8gc3Rkb3V0IHRvIHJlLWNyZWF0ZSB0aGUgY3VycmVudCBkYXRhYmFzZQorICAgICAqIHNjaGVtYTo8YnIgLz4KKyAgICAgKiA8Y29kZT5qYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIC1mIHN0ZG91dCAKKyAgICAgKiAtYSBjcmVhdGVEQjwvY29kZT48L2xpPgorICAgICAqIDxsaT5Ecm9wIHRoZSBjdXJyZW50IGRhdGFiYXNlIHNjaGVtYTo8YnIgLz4KKyAgICAgKiA8Y29kZT5qYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIAorICAgICAqIC1hIGRyb3BEQjwvY29kZT48L2xpPgorICAgICAqIDxsaT5SZWZyZXNoIHRoZSBzY2hlbWEgYW5kIGRlbGV0ZSBhbGwgcmVjb3JkcyBpbiBhbGwgdGFibGVzOjxiciAvPgorICAgICAqIDxjb2RlPmphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2wgCisgICAgICogLWEgcmVmcmVzaCxkZWxldGVUYWJsZUNvbnRlbnRzPC9jb2RlPjwvbGk+CisgICAgICogPGxpPkNyZWF0ZSBhIHNjaGVtYSBiYXNlZCBvbiBhbiBYTUwgc2NoZW1hIGRlZmluaXRpb24gZmlsZTo8YnIgLz4KKyAgICAgKiA8Y29kZT5qYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIAorICAgICAqIG15c2NoZW1hLnhtbDwvY29kZT48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBhcmdzID0gb3B0cy5zZXRGcm9tQ21kTGluZShhcmdzKTsKKyAgICAgICAgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBKREJDQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghcnVuKGNvbmYsIGFyZ3MsIG9wdHMpKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihfbG9jLmdldCgidG9vbC11c2FnZSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbmYuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJucyBmYWxzZSBpZiBhbnkgaW52YWxpZCBvcHRpb25zIHdlcmUgZ2l2ZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNtYWluCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihKREJDQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBPcHRpb25zIG9wdHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9wdHMuY29udGFpbnNLZXkoImhlbHAiKSB8fCBvcHRzLmNvbnRhaW5zS2V5KCItaGVscCIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEZsYWdzIGZsYWdzID0gbmV3IEZsYWdzKCk7CisgICAgICAgIGZsYWdzLmRyb3BUYWJsZXMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJkcm9wVGFibGVzIiwgImR0IiwgZmxhZ3MuZHJvcFRhYmxlcyk7CisgICAgICAgIGZsYWdzLmRyb3BTZXF1ZW5jZXMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJkcm9wU2VxdWVuY2VzIiwgImRzcSIsIGZsYWdzLmRyb3BTZXF1ZW5jZXMpOworICAgICAgICBmbGFncy5pZ25vcmVFcnJvcnMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJpZ25vcmVFcnJvcnMiLCAiaSIsIGZsYWdzLmlnbm9yZUVycm9ycyk7CisgICAgICAgIGZsYWdzLm9wZW5qcGFUYWJsZXMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJvcGVuanBhVGFibGVzIiwgIm90IiwgZmxhZ3Mub3BlbmpwYVRhYmxlcyk7CisgICAgICAgIGZsYWdzLnByaW1hcnlLZXlzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgicHJpbWFyeUtleXMiLCAicGsiLCBmbGFncy5wcmltYXJ5S2V5cyk7CisgICAgICAgIGZsYWdzLmZvcmVpZ25LZXlzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiZm9yZWlnbktleXMiLCAiZmtzIiwgZmxhZ3MuZm9yZWlnbktleXMpOworICAgICAgICBmbGFncy5pbmRleGVzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiaW5kZXhlcyIsICJpeCIsIGZsYWdzLmluZGV4ZXMpOworICAgICAgICBmbGFncy5zZXF1ZW5jZXMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJzZXF1ZW5jZXMiLCAic3EiLCBmbGFncy5zZXF1ZW5jZXMpOworICAgICAgICBmbGFncy5yZWNvcmQgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eSgicmVjb3JkIiwgInIiLCBmbGFncy5yZWNvcmQpOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJmaWxlIiwgImYiLCBudWxsKTsKKyAgICAgICAgU3RyaW5nIHNjaGVtYXMgPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJzIik7CisgICAgICAgIGlmIChzY2hlbWFzICE9IG51bGwpCisgICAgICAgICAgICBvcHRzLnNldFByb3BlcnR5KCJzY2hlbWFzIiwgc2NoZW1hcyk7CisKKyAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IG9wdHMucmVtb3ZlUHJvcGVydHkoImFjdGlvbiIsICJhIiwgZmxhZ3MuYWN0aW9uKQorICAgICAgICAgICAgLnNwbGl0KCIsIik7CisgICAgICAgIAorICAgICAgICAvLyBzZXR1cCBhIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2Ugd2l0aCBjbWQtbGluZSBpbmZvCisgICAgICAgIENvbmZpZ3VyYXRpb25zLnBvcHVsYXRlQ29uZmlndXJhdGlvbihjb25mLCBvcHRzKTsKKworICAgICAgICAvLyBjcmVhdGUgc2NyaXB0IHdyaXRlcgorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBjb25mLmdldENsYXNzUmVzb2x2ZXJJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIoU2NoZW1hVG9vbC5jbGFzcywgbnVsbCk7CisgICAgICAgIGZsYWdzLndyaXRlciA9IEZpbGVzLmdldFdyaXRlcihmaWxlTmFtZSwgbG9hZGVyKTsKKworICAgICAgICBib29sZWFuIHJldHVyblZhbHVlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmbGFncy5hY3Rpb24gPSBhY3Rpb25zW2ldOworICAgICAgICAgICAgcmV0dXJuVmFsdWUgJj0gcnVuKGNvbmYsIGFyZ3MsIGZsYWdzLCBsb2FkZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0b29sLiBSZXR1cm4gZmFsc2UgaWYgaW52YWxpZCBvcHRpb25zIHdlcmUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihKREJDQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBGbGFncyBmbGFncywgQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIExvZyBsb2cgPSBjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfVE9PTCk7CisgICAgICAgIGlmIChBQ1RJT05fUkVGTEVDVC5lcXVhbHMoZmxhZ3MuYWN0aW9uKSkgeworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoZmxhZ3Mud3JpdGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgZmxhZ3Mud3JpdGVyID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOworCisgICAgICAgICAgICBTY2hlbWFHZW5lcmF0b3IgZ2VuID0gbmV3IFNjaGVtYUdlbmVyYXRvcihjb25mKTsKKyAgICAgICAgICAgIGdlbi5zZXRQcmltYXJ5S2V5cyhmbGFncy5wcmltYXJ5S2V5cyk7CisgICAgICAgICAgICBnZW4uc2V0SW5kZXhlcyhmbGFncy5pbmRleGVzKTsKKyAgICAgICAgICAgIGdlbi5zZXRGb3JlaWduS2V5cyhmbGFncy5mb3JlaWduS2V5cyk7CisgICAgICAgICAgICBnZW4uc2V0U2VxdWVuY2VzKGZsYWdzLnNlcXVlbmNlcyk7CisgICAgICAgICAgICBnZW4uc2V0T3BlbkpQQVRhYmxlcyhmbGFncy5vcGVuanBhVGFibGVzKTsKKworICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXMgPSBjb25mLmdldFNjaGVtYXMoKTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHNjaGVtYXMpKQorICAgICAgICAgICAgICAgIHNjaGVtYXMgPSAiYWxsIjsKKyAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJzY2gtcmVmbGVjdCIsIHNjaGVtYXMpKTsKKyAgICAgICAgICAgIGdlbi5nZW5lcmF0ZVNjaGVtYXMoKTsKKworICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBzY2hlbWEKKyAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJzY2gtcmVmbGVjdC13cml0ZSIpKTsKKyAgICAgICAgICAgIFNjaGVtYVNlcmlhbGl6ZXIgc2VyID0gbmV3IFhNTFNjaGVtYVNlcmlhbGl6ZXIoY29uZik7CisgICAgICAgICAgICBzZXIuYWRkQWxsKGdlbi5nZXRTY2hlbWFHcm91cCgpKTsKKyAgICAgICAgICAgIHNlci5zZXJpYWxpemUoZmxhZ3Mud3JpdGVyLCBzZXIuUFJFVFRZKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDAKKyAgICAgICAgICAgICYmICFBQ1RJT05fQ1JFQVRFREIuZXF1YWxzKGZsYWdzLmFjdGlvbikKKyAgICAgICAgICAgICYmICFBQ1RJT05fRFJPUERCLmVxdWFscyhmbGFncy5hY3Rpb24pCisgICAgICAgICAgICAmJiAhQUNUSU9OX0VYUE9SVC5lcXVhbHMoZmxhZ3MuYWN0aW9uKQorICAgICAgICAgICAgJiYgIUFDVElPTl9ERUxFVEVfVEFCTEVfQ09OVEVOVFMuZXF1YWxzKGZsYWdzLmFjdGlvbikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gcGFyc2UgaW4gdGhlIGFyZ3VtZW50cworICAgICAgICBTY2hlbWFQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFNjaGVtYVBhcnNlcihjb25mKTsKKyAgICAgICAgcGFyc2VyLnNldERlbGF5Q29uc3RyYWludFJlc29sdmUodHJ1ZSk7CisgICAgICAgIEZpbGUgZmlsZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaWxlID0gRmlsZXMuZ2V0RmlsZShhcmdzW2ldLCBsb2FkZXIpOworICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInRvb2wtcnVubmluZyIsIGZpbGUpKTsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShmaWxlKTsKKyAgICAgICAgfQorICAgICAgICBwYXJzZXIucmVzb2x2ZUNvbnN0cmFpbnRzKCk7CisKKyAgICAgICAgaWYgKEFDVElPTl9JTVBPUlQuZXF1YWxzKGZsYWdzLmFjdGlvbikpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJ0b29sLWltcG9ydC1zdG9yZSIpKTsKKyAgICAgICAgICAgIFNjaGVtYUdyb3VwIHNjaGVtYSA9IHBhcnNlci5nZXRTY2hlbWFHcm91cCgpOworICAgICAgICAgICAgY29uZi5nZXRTY2hlbWFGYWN0b3J5SW5zdGFuY2UoKS5zdG9yZVNjaGVtYShzY2hlbWEpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFDVElPTl9FWFBPUlQuZXF1YWxzKGZsYWdzLmFjdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChmbGFncy53cml0ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmbGFncy53cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisKKyAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJ0b29sLWV4cG9ydC1nZW4iKSk7CisgICAgICAgICAgICBTY2hlbWFHcm91cCBzY2hlbWEgPSBjb25mLmdldFNjaGVtYUZhY3RvcnlJbnN0YW5jZSgpLnJlYWRTY2hlbWEoKTsKKworICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInRvb2wtZXhwb3J0LXdyaXRlIikpOworICAgICAgICAgICAgU2NoZW1hU2VyaWFsaXplciBzZXIgPSBuZXcgWE1MU2NoZW1hU2VyaWFsaXplcihjb25mKTsKKyAgICAgICAgICAgIHNlci5hZGRBbGwoc2NoZW1hKTsKKyAgICAgICAgICAgIHNlci5zZXJpYWxpemUoZmxhZ3Mud3JpdGVyLCBzZXIuUFJFVFRZKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hVG9vbCB0b29sID0gbmV3IFNjaGVtYVRvb2woY29uZiwgZmxhZ3MuYWN0aW9uKTsKKyAgICAgICAgdG9vbC5zZXRJZ25vcmVFcnJvcnMoZmxhZ3MuaWdub3JlRXJyb3JzKTsKKyAgICAgICAgdG9vbC5zZXREcm9wVGFibGVzKGZsYWdzLmRyb3BUYWJsZXMpOworICAgICAgICB0b29sLnNldFNlcXVlbmNlcyhmbGFncy5zZXF1ZW5jZXMpOyAvLyBzZXQgYmVmb3JlIGRyb3BzZXFzCisgICAgICAgIHRvb2wuc2V0RHJvcFNlcXVlbmNlcyhmbGFncy5kcm9wU2VxdWVuY2VzKTsKKyAgICAgICAgdG9vbC5zZXRQcmltYXJ5S2V5cyhmbGFncy5wcmltYXJ5S2V5cyk7CisgICAgICAgIHRvb2wuc2V0Rm9yZWlnbktleXMoZmxhZ3MuZm9yZWlnbktleXMpOworICAgICAgICB0b29sLnNldEluZGV4ZXMoZmxhZ3MuaW5kZXhlcyk7CisgICAgICAgIHRvb2wuc2V0T3BlbkpQQVRhYmxlcyhmbGFncy5vcGVuanBhVGFibGVzKTsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHRvb2wuc2V0U2NoZW1hR3JvdXAocGFyc2VyLmdldFNjaGVtYUdyb3VwKCkpOworICAgICAgICBpZiAoZmxhZ3Mud3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICB0b29sLnNldFdyaXRlcihmbGFncy53cml0ZXIpOworCisgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJ0b29sLWFjdGlvbiIsIGZsYWdzLmFjdGlvbikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG9vbC5ydW4oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmbGFncy5yZWNvcmQpIHsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgidG9vbC1yZWNvcmQiKSk7CisgICAgICAgICAgICAgICAgdG9vbC5yZWNvcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3Mud3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICBmbGFncy53cml0ZXIuZmx1c2goKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbGFncyB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBhY3Rpb24gPSBBQ1RJT05fQUREOworICAgICAgICBwdWJsaWMgV3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGRyb3BUYWJsZXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkcm9wU2VxdWVuY2VzID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaWdub3JlRXJyb3JzID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9wZW5qcGFUYWJsZXMgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJpbWFyeUtleXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBmb3JlaWduS2V5cyA9IHRydWU7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGluZGV4ZXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXF1ZW5jZXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWNvcmQgPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NjaGVtYXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NjaGVtYXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI0ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hcy5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gZGVhbCB3aXRoIHNjaGVtYXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFNjaGVtYXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5bXSBFTVBUWV9DT0xVTU5TID0gbmV3IENvbHVtblswXTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZvcmVpZ25LZXlbXSBFTVBUWV9GT1JFSUdOX0tFWVMgPSBuZXcgRm9yZWlnbktleVswXTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEluZGV4W10gRU1QVFlfSU5ERVhFUyA9IG5ldyBJbmRleFswXTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVuaXF1ZVtdIEVNUFRZX1VOSVFVRVMgPSBuZXcgVW5pcXVlWzBdOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfVkFMVUVTID0gbmV3IE9iamVjdFswXTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1hIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgbmV3IHRhYmxlcywgb3IgbnVsbCBpZgorICAgICAqIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmV3VGFibGVTY2hlbWEoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBpZiAoY29uZi5nZXRTY2hlbWEoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNvbmYuZ2V0U2NoZW1hKCk7CisKKyAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IGNvbmYuZ2V0U2NoZW1hc0xpc3QoKTsKKyAgICAgICAgaWYgKHNjaGVtYXMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaW50IGRvdElkeCA9IHNjaGVtYXNbMF0ubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdElkeCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChkb3RJZHggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2NoZW1hc1swXTsKKyAgICAgICAgcmV0dXJuIHNjaGVtYXNbMF0uc3Vic3RyaW5nKDAsIGRvdElkeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTUUwgdHlwZSBuYW1lIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFR5cGVzfSBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKREJDTmFtZShpbnQgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJR0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJpZ2ludCI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJTkFSWToKKyAgICAgICAgICAgICAgICByZXR1cm4gImJpbmFyeSI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJpdCI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJMT0I6CisgICAgICAgICAgICAgICAgcmV0dXJuICJibG9iIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gImNoYXIiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHJldHVybiAiY2xvYiI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRlY2ltYWwiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5ESVNUSU5DVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc3RpbmN0IjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLklOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJpbnRlZ2VyIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuSkFWQV9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhX29iamVjdCI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkxPTkdWQVJCSU5BUlk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJsb25ndmFyYmluYXJ5IjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTE9OR1ZBUkNIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJsb25ndmFyY2hhciI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLk5VTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTlVNRVJJQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm51bWVyaWMiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5PVEhFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm90aGVyIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuUkVBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInJlYWwiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5SRUY6CisgICAgICAgICAgICAgICAgcmV0dXJuICJyZWYiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5TTUFMTElOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInNtYWxsaW50IjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuU1RSVUNUOgorICAgICAgICAgICAgICAgIHJldHVybiAic3RydWN0IjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInRpbWUiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5USU1FU1RBTVA6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0aW1lc3RhbXAiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5USU5ZSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAidGlueWludCI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlZBUkJJTkFSWToKKyAgICAgICAgICAgICAgICByZXR1cm4gInZhcmJpbmFyeSI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlZBUkNIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJjaGFyIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duKCIgKyB0eXBlICsgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVHlwZXN9IGNvbnN0YW50IGZvciB0aGUgZ2l2ZW4gU1FMIHR5cGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRKREJDVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoImFycmF5Ii5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkFSUkFZOworICAgICAgICBpZiAoImJpZ2ludCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5CSUdJTlQ7CisgICAgICAgIGlmICgiYmluYXJ5Ii5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkJJTkFSWTsKKyAgICAgICAgaWYgKCJiaXQiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuQklUOworICAgICAgICBpZiAoImJsb2IiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuQkxPQjsKKyAgICAgICAgaWYgKCJjaGFyIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkNIQVI7CisgICAgICAgIGlmICgiY2xvYiIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5DTE9COworICAgICAgICBpZiAoImRhdGUiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuREFURTsKKyAgICAgICAgaWYgKCJkZWNpbWFsIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkRFQ0lNQUw7CisgICAgICAgIGlmICgiZGlzdGluY3QiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuRElTVElOQ1Q7CisgICAgICAgIGlmICgiZG91YmxlIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkRPVUJMRTsKKyAgICAgICAgaWYgKCJmbG9hdCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5GTE9BVDsKKyAgICAgICAgaWYgKCJpbnRlZ2VyIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLklOVEVHRVI7CisgICAgICAgIGlmICgiamF2YV9vYmplY3QiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuSkFWQV9PQkpFQ1Q7CisgICAgICAgIGlmICgibG9uZ3ZhcmJpbmFyeSIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5MT05HVkFSQklOQVJZOworICAgICAgICBpZiAoImxvbmd2YXJjaGFyIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkxPTkdWQVJDSEFSOworICAgICAgICBpZiAoIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuTlVMTDsKKyAgICAgICAgaWYgKCJudW1lcmljIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLk5VTUVSSUM7CisgICAgICAgIGlmICgib3RoZXIiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuT1RIRVI7CisgICAgICAgIGlmICgicmVhbCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5SRUFMOworICAgICAgICBpZiAoInJlZiIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5SRUY7CisgICAgICAgIGlmICgic21hbGxpbnQiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuU01BTExJTlQ7CisgICAgICAgIGlmICgic3RydWN0Ii5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLlNUUlVDVDsKKyAgICAgICAgaWYgKCJ0aW1lIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLlRJTUU7CisgICAgICAgIGlmICgidGltZXN0YW1wIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLlRJTUVTVEFNUDsKKyAgICAgICAgaWYgKCJ0aW55aW50Ii5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLlRJTllJTlQ7CisgICAgICAgIGlmICgidmFyYmluYXJ5Ii5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLlZBUkJJTkFSWTsKKyAgICAgICAgaWYgKCJ2YXJjaGFyIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLlZBUkNIQVI7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInVua25vd24iKSkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5PVEhFUjsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSA9ICIgKyBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGphdmEgdHlwZSBmb3IgdGhlIGdpdmVuIFNRTCB0eXBlIGZyb20ge0BsaW5rIFR5cGVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEphdmFUeXBlKGludCB0eXBlLCBpbnQgc2l6ZSwgaW50IGRlY2ltYWxzKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyLmNsYXNzOworICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICBjYXNlIFR5cGVzLlZBUkNIQVI6CisgICAgICAgICAgICBjYXNlIFR5cGVzLkxPTkdWQVJDSEFSOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9vbGVhbi5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVElOWUlOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZS5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuU01BTExJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0LmNsYXNzOworICAgICAgICAgICAgY2FzZSBUeXBlcy5JTlRFR0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJR0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuUkVBTDoKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0LmNsYXNzOworICAgICAgICAgICAgY2FzZSBUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIFR5cGVzLk5VTUVSSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuREVDSU1BTDoKKyAgICAgICAgICAgICAgICAvLyBvcmFjbGUgdXNlcyB0aGlzIGZvciBldmVyeXRoaW5nLCBzbyBsb29rIGF0IHNpemUgYW5kIGRlY2ltYWxzCisgICAgICAgICAgICAgICAgaWYgKGRlY2ltYWxzID09IDAgJiYgc2l6ZSA8IDEwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY2ltYWxzID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb25nLmNsYXNzOworICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGUuY2xhc3M7CisgICAgICAgICAgICAgICAgLy8gIyMjIHJldHVybiBhIEJpZ0RlY2ltYWwgaWYgdGhlIHNpemUgaWYgb3V0IG9mIGRvdWJsZSByYW5nZT8KKyAgICAgICAgICAgIGNhc2UgVHlwZXMuREFURToKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRToKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLmNsYXNzOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2VxdWVuY2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NlcXVlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjYWE5ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NlcXVlbmNlLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLlNvdXJjZVRyYWNrZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGRhdGFiYXNlIHNlcXVlbmNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZQorICAgIGV4dGVuZHMgUmVmZXJlbmNlQ291bnRlcgorICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZSwgU291cmNlVHJhY2tlciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFNjaGVtYSBfc2NoZW1hID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfc2NoZW1hTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2luaXRpYWwgPSAxOworICAgIHByaXZhdGUgaW50IF9pbmNyZW1lbnQgPSAxOworICAgIHByaXZhdGUgaW50IF9jYWNoZSA9IDA7CisKKyAgICAvLyBrZWVwIHRyYWNrIG9mIHNvdXJjZQorICAgIHByaXZhdGUgRmlsZSBfc291cmNlID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc3JjVHlwZSA9IFNSQ19PVEhFUjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFNlcXVlbmNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHNlcXVlbmNlIG5hbWUKKyAgICAgKiBAcGFyYW0gc2NoZW1hIHRoZSBzZXF1ZW5jZSBzY2hlbWEKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxdWVuY2UoU3RyaW5nIG5hbWUsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQorICAgICAgICAgICAgc2V0U2NoZW1hTmFtZShzY2hlbWEuZ2V0TmFtZSgpKTsKKyAgICAgICAgX3NjaGVtYSA9IHNjaGVtYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2VxdWVuY2UgaXMgcmVtb3ZlZCBmcm9tIGl0cyBzY2hlbWEuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIF9zY2hlbWEgPSBudWxsOworICAgICAgICBfZnVsbE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1hIGZvciB0aGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7CisgICAgICAgIHJldHVybiBfc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXF1ZW5jZSdzIHNjaGVtYSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zY2hlbWFOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXF1ZW5jZSdzIHNjaGVtYSBuYW1lLiBZb3UgY2FuIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBvbiBzZXF1ZW5jZXMKKyAgICAgKiB3aG9zZSBzY2hlbWEgb2JqZWN0IGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3NjaGVtYU5hbWUgPSBuYW1lOworICAgICAgICBfZnVsbE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZS4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uCisgICAgICogc2VxdWVuY2VzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGEgc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGdldFNjaGVtYSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcXVlbmNlIG5hbWUsIGluY2x1ZGluZyBzY2hlbWEsIHVzaW5nICcuJyBhcyB0aGUKKyAgICAgKiBjYXRhbG9nIHNlcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeworICAgICAgICBpZiAoX2Z1bGxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCB8fCBzY2hlbWEuZ2V0TmFtZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgX2Z1bGxOYW1lID0gZ2V0TmFtZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9mdWxsTmFtZSA9IHNjaGVtYS5nZXROYW1lKCkgKyAiLiIgKyBnZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9mdWxsTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VxdWVuY2UncyBpbml0aWFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5pdGlhbFZhbHVlKCkgeworICAgICAgICByZXR1cm4gX2luaXRpYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcXVlbmNlJ3MgaW5pdGlhbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoaW50IGluaXRpYWwpIHsKKyAgICAgICAgX2luaXRpYWwgPSBpbml0aWFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXF1ZW5jZSdzIGluY3JlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluY3JlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9pbmNyZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcXVlbmNlJ3MgaW5jcmVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY3JlbWVudChpbnQgaW5jcmVtZW50KSB7CisgICAgICAgIF9pbmNyZW1lbnQgPSBpbmNyZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcXVlbmNlJ3MgY2FjaGUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFsbG9jYXRlKCkgeworICAgICAgICByZXR1cm4gX2NhY2hlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXF1ZW5jZSdzIGNhY2hlIHNpemUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb2NhdGUoaW50IGNhY2hlKSB7CisgICAgICAgIF9jYWNoZSA9IGNhY2hlOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUZpbGUoKSB7CisgICAgICAgIHJldHVybiBfc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShGaWxlIHNvdXJjZSwgaW50IHNyY1R5cGUpIHsKKyAgICAgICAgX3NvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgX3NyY1R5cGUgPSBzcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RnVsbE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRGdWxsTmFtZSgpOworICAgICAgICBTdHJpbmcgb3RoZXJOYW1lID0gKChTZXF1ZW5jZSkgb3RoZXIpLmdldEZ1bGxOYW1lKCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgb3RoZXJOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBpZiAob3RoZXJOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBuYW1lLmNvbXBhcmVUbyhvdGhlck5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRGdWxsTmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NpbXBsZURyaXZlckRhdGFTb3VyY2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1NpbXBsZURyaXZlckRhdGFTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBjMzZkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2ltcGxlRHJpdmVyRGF0YVNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXI7CitpbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworCisvKioKKyAqIE5vbi1wb29saW5nIGRyaXZlciBkYXRhIHNvdXJjZS4KKyAqLworcHVibGljIGNsYXNzIFNpbXBsZURyaXZlckRhdGFTb3VyY2UKKyAgICBpbXBsZW1lbnRzIERyaXZlckRhdGFTb3VyY2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgX2Nvbm5lY3Rpb25Ecml2ZXJOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIF9jb25uZWN0aW9uVVJMOworICAgIHByaXZhdGUgU3RyaW5nIF9jb25uZWN0aW9uVXNlck5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Nvbm5lY3Rpb25QYXNzd29yZDsKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgX2Nvbm5lY3Rpb25Qcm9wZXJ0aWVzOworICAgIHByaXZhdGUgUHJvcGVydGllcyBfY29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgRHJpdmVyIF9kcml2ZXI7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3NMb2FkZXI7CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwpCisgICAgICAgICAgICB1c2VybmFtZSA9IF9jb25uZWN0aW9uVXNlck5hbWU7CisgICAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJ1c2VyIiwgdXNlcm5hbWUpOworCisgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKQorICAgICAgICAgICAgcGFzc3dvcmQgPSBfY29ubmVjdGlvblBhc3N3b3JkOworICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKKyAgICAgICAgICAgIHByb3BzLnB1dCgicGFzc3dvcmQiLCBwYXNzd29yZCk7CisKKyAgICAgICAgcmV0dXJuIGdldENvbm5lY3Rpb24ocHJvcHMpOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oUHJvcGVydGllcyBwcm9wcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXREcml2ZXIoKS5jb25uZWN0KF9jb25uZWN0aW9uVVJMLCBwcm9wcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMb2dpblRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luVGltZW91dChpbnQgc2Vjb25kcykgeworICAgIH0KKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRMb2dXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiBEcml2ZXJNYW5hZ2VyLmdldExvZ1dyaXRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ1dyaXRlcihQcmludFdyaXRlciBvdXQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0REJEaWN0aW9uYXJ5KERCRGljdGlvbmFyeSBkaWN0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTChTdHJpbmcgY29ubmVjdGlvblVSTCkgeworICAgICAgICBfY29ubmVjdGlvblVSTCA9IGNvbm5lY3Rpb25VUkw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVVJMKCkgeworICAgICAgICByZXR1cm4gX2Nvbm5lY3Rpb25VUkw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVzZXJOYW1lKFN0cmluZyBjb25uZWN0aW9uVXNlck5hbWUpIHsKKyAgICAgICAgX2Nvbm5lY3Rpb25Vc2VyTmFtZSA9IGNvbm5lY3Rpb25Vc2VyTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jb25uZWN0aW9uVXNlck5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblBhc3N3b3JkKFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQpIHsKKyAgICAgICAgX2Nvbm5lY3Rpb25QYXNzd29yZCA9IGNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIF9jb25uZWN0aW9uUHJvcGVydGllcyA9IHByb3BzOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gX2Nvbm5lY3Rpb25Qcm9wZXJ0aWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIF9jb25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMgPSBwcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRDb25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBfY29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3JzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICBfY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBfY2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkRyaXZlck5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Ecml2ZXJOYW1lKSB7CisgICAgICAgIF9jb25uZWN0aW9uRHJpdmVyTmFtZSA9IGNvbm5lY3Rpb25Ecml2ZXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkRyaXZlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBfY29ubmVjdGlvbkRyaXZlck5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBEcml2ZXIgZ2V0RHJpdmVyKCkgeworICAgICAgICBpZiAoX2RyaXZlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9kcml2ZXI7CisKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgICBfZHJpdmVyID0gRHJpdmVyTWFuYWdlci5nZXREcml2ZXIoX2Nvbm5lY3Rpb25VUkwpOworICAgICAgICAgICAgaWYgKF9kcml2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RyaXZlcjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKF9jb25uZWN0aW9uRHJpdmVyTmFtZSwgdHJ1ZSwgX2NsYXNzTG9hZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RyaXZlciA9IERyaXZlck1hbmFnZXIuZ2V0RHJpdmVyKF9jb25uZWN0aW9uVVJMKTsKKyAgICAgICAgICAgIGlmIChfZHJpdmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9kcml2ZXI7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RyaXZlciA9IChEcml2ZXIpIENsYXNzLmZvck5hbWUoX2Nvbm5lY3Rpb25Ecml2ZXJOYW1lLAorICAgICAgICAgICAgICAgIHRydWUsIF9jbGFzc0xvYWRlcikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBfZHJpdmVyOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93KFJ1bnRpbWVFeGNlcHRpb24pIGU7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1RhYmxlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9UYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjFmNDAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9UYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLlNvdXJjZVRyYWNrZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGRhdGFiYXNlIHRhYmxlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFN0ZXBoZW4gS2ltCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZQorICAgIGV4dGVuZHMgTmFtZVNldAorICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZSwgU291cmNlVHJhY2tlciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVtYU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF9jb2xNYXAgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF9pZHhNYXAgPSBudWxsOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZmtMaXN0ID0gbnVsbDsKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gX3VucUxpc3QgPSBudWxsOworICAgIHByaXZhdGUgU2NoZW1hIF9zY2hlbWEgPSBudWxsOworICAgIHByaXZhdGUgUHJpbWFyeUtleSBfcGsgPSBudWxsOworCisgICAgLy8ga2VlcCB0cmFjayBvZiBzb3VyY2UKKyAgICBwcml2YXRlIEZpbGUgX3NvdXJjZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX3NyY1R5cGUgPSBTUkNfT1RIRVI7CisKKyAgICAvLyBjYWNoZQorICAgIHByaXZhdGUgU3RyaW5nIF9mdWxsTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfY29scyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfYXV0b0Fzc2lnbiA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2x1bW5bXSBfcmVscyA9IG51bGw7CisgICAgcHJpdmF0ZSBGb3JlaWduS2V5W10gX2ZrcyA9IG51bGw7CisgICAgcHJpdmF0ZSBJbmRleFtdIF9pZHhzID0gbnVsbDsKKyAgICBwcml2YXRlIFVuaXF1ZVtdIF91bnFzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFRhYmxlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRhYmxlIG5hbWUKKyAgICAgKiBAcGFyYW0gc2NoZW1hIHRoZSB0YWJsZSBzY2hlbWEKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFibGUoU3RyaW5nIG5hbWUsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgYWRkTmFtZShuYW1lLCB0cnVlKTsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQorICAgICAgICAgICAgc2V0U2NoZW1hTmFtZShzY2hlbWEuZ2V0TmFtZSgpKTsKKyAgICAgICAgX3NjaGVtYSA9IHNjaGVtYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdGFibGUgaXMgcmVtb3ZlZCBmcm9tIGl0cyBzY2hlbWEuIFJlbW92ZXMgYWxsIHRhYmxlCisgICAgICogbWVtYmVycywgYW5kIGludmFsaWRhdGVzIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IGdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVtb3ZlRm9yZWlnbktleShma3NbaV0pOworICAgICAgICBJbmRleFtdIGlkeHMgPSBnZXRJbmRleGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWR4cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlbW92ZUluZGV4KGlkeHNbaV0pOworICAgICAgICBVbmlxdWVbXSB1bnFzID0gZ2V0VW5pcXVlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVucXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVVbmlxdWUodW5xc1tpXSk7CisgICAgICAgIHJlbW92ZVByaW1hcnlLZXkoKTsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVtb3ZlQ29sdW1uKGNvbHNbaV0pOworICAgICAgICBfc2NoZW1hID0gbnVsbDsKKyAgICAgICAgX3NjaGVtYU5hbWUgPSBudWxsOworICAgICAgICBfZnVsbE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1hIGZvciB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7CisgICAgICAgIHJldHVybiBfc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSdzIHNjaGVtYSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zY2hlbWFOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSdzIHNjaGVtYSBuYW1lLiBZb3UgY2FuIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBvbiB0YWJsZXMKKyAgICAgKiB3aG9zZSBzY2hlbWEgb2JqZWN0IGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3NjaGVtYU5hbWUgPSBuYW1lOworICAgICAgICBfZnVsbE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHRhYmxlcworICAgICAqIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGEgc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGdldFNjaGVtYSgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIG5hbWUsIGluY2x1ZGluZyBzY2hlbWEsIHVzaW5nICcuJyBhcyB0aGUKKyAgICAgKiBjYXRhbG9nIHNlcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeworICAgICAgICBpZiAoX2Z1bGxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCB8fCBzY2hlbWEuZ2V0TmFtZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgX2Z1bGxOYW1lID0gZ2V0TmFtZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9mdWxsTmFtZSA9IHNjaGVtYS5nZXROYW1lKCkgKyAiLiIgKyBnZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9mdWxsTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKCkgeworICAgICAgICByZXR1cm4gX3NvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNvdXJjZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfc3JjVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoRmlsZSBzb3VyY2UsIGludCBzcmNUeXBlKSB7CisgICAgICAgIF9zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIF9zcmNUeXBlID0gc3JjVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEZ1bGxOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbnMsIGluIGFscGhhYmV0aWNhbCBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKF9jb2xzID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfY29sTWFwID09IG51bGwpCisgICAgICAgICAgICAgICAgX2NvbHMgPSBTY2hlbWFzLkVNUFRZX0NPTFVNTlM7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gbmV3IENvbHVtbltfY29sTWFwLnNpemUoKV07CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gX2NvbE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpdHIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29sc1tpXSA9IChDb2x1bW4pIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0SW5kZXgoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9jb2xzID0gY29sczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NvbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgdGFibGUncyBhdXRvLWFzc2lnbmVkIGNvbHVtbnMuCisgICAgICovCisgICAgcHVibGljIENvbHVtbltdIGdldEF1dG9Bc3NpZ25lZENvbHVtbnMoKSB7CisgICAgICAgIGlmIChfYXV0b0Fzc2lnbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX2NvbE1hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9hdXRvQXNzaWduID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBhdXRvcyA9IG51bGw7CisgICAgICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IGdldENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHNbaV0uaXNBdXRvQXNzaWduZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3MgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3MuYWRkKGNvbHNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9hdXRvQXNzaWduID0gKGF1dG9zID09IG51bGwpID8gU2NoZW1hcy5FTVBUWV9DT0xVTU5TCisgICAgICAgICAgICAgICAgICAgIDogKENvbHVtbltdKSBhdXRvcy50b0FycmF5KG5ldyBDb2x1bW5bYXV0b3Muc2l6ZSgpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9hdXRvQXNzaWduOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGlzIHRhYmxlJ3MgcmVsYXRpb24gaWQgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0UmVsYXRpb25JZENvbHVtbnMoKSB7CisgICAgICAgIGlmIChfcmVscyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX2NvbE1hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9yZWxzID0gU2NoZW1hcy5FTVBUWV9DT0xVTU5TOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiByZWxzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29sc1tpXS5pc1JlbGF0aW9uSWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxzID0gbmV3IEFycmF5TGlzdCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbHMuYWRkKGNvbHNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9yZWxzID0gKHJlbHMgPT0gbnVsbCkgPyBTY2hlbWFzLkVNUFRZX0NPTFVNTlMKKyAgICAgICAgICAgICAgICAgICAgOiAoQ29sdW1uW10pIHJlbHMudG9BcnJheShuZXcgQ29sdW1uW3JlbHMuc2l6ZSgpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uIGdldENvbHVtbihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IF9jb2xNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKENvbHVtbikgX2NvbE1hcC5nZXQobmFtZS50b1VwcGVyQ2FzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb2x1bW4gdG8gdGhlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW4gYWRkQ29sdW1uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFkZE5hbWUobmFtZSwgdHJ1ZSk7CisgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgQ29sdW1uIGNvbDsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpICE9IG51bGwpCisgICAgICAgICAgICBjb2wgPSBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKS5uZXdDb2x1bW4obmFtZSwgdGhpcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbCA9IG5ldyBDb2x1bW4obmFtZSwgdGhpcyk7CisgICAgICAgIGlmIChfY29sTWFwID09IG51bGwpCisgICAgICAgICAgICBfY29sTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgX2NvbE1hcC5wdXQobmFtZS50b1VwcGVyQ2FzZSgpLCBjb2wpOworICAgICAgICBfY29scyA9IG51bGw7CisgICAgICAgIHJldHVybiBjb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBjb2x1bW4gZnJvbSB0aGUgdGFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbHVtbiB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoZSB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUNvbHVtbihDb2x1bW4gY29sKSB7CisgICAgICAgIGlmIChjb2wgPT0gbnVsbCB8fCBfY29sTWFwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQ29sdW1uIGN1ciA9IChDb2x1bW4pIF9jb2xNYXAuZ2V0KGNvbC5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIGlmICghY29sLmVxdWFscyhjdXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJlbW92ZU5hbWUoY29sLmdldE5hbWUoKSk7CisgICAgICAgIF9jb2xNYXAucmVtb3ZlKGNvbC5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIF9jb2xzID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbC5pc0F1dG9Bc3NpZ25lZCgpKQorICAgICAgICAgICAgX2F1dG9Bc3NpZ24gPSBudWxsOworICAgICAgICBpZiAoY29sLmlzUmVsYXRpb25JZCgpKQorICAgICAgICAgICAgX3JlbHMgPSBudWxsOworICAgICAgICBjb2wucmVtb3ZlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcG9ydCBhIGNvbHVtbiBmcm9tIGFub3RoZXIgdGFibGUuCisgICAgICovCisgICAgcHVibGljIENvbHVtbiBpbXBvcnRDb2x1bW4oQ29sdW1uIGNvbCkgeworICAgICAgICBpZiAoY29sID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDb2x1bW4gY29weSA9IGFkZENvbHVtbihjb2wuZ2V0TmFtZSgpKTsKKyAgICAgICAgY29weS5zZXRUeXBlKGNvbC5nZXRUeXBlKCkpOworICAgICAgICBjb3B5LnNldFR5cGVOYW1lKGNvbC5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgY29weS5zZXRKYXZhVHlwZShjb2wuZ2V0SmF2YVR5cGUoKSk7CisgICAgICAgIGNvcHkuc2V0Tm90TnVsbChjb2wuaXNOb3ROdWxsKCkpOworICAgICAgICBjb3B5LnNldERlZmF1bHRTdHJpbmcoY29sLmdldERlZmF1bHRTdHJpbmcoKSk7CisgICAgICAgIGNvcHkuc2V0U2l6ZShjb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgY29weS5zZXREZWNpbWFsRGlnaXRzKGNvbC5nZXREZWNpbWFsRGlnaXRzKCkpOworICAgICAgICBjb3B5LnNldEF1dG9Bc3NpZ25lZChjb2wuaXNBdXRvQXNzaWduZWQoKSk7CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSB0YWJsZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKSB7CisgICAgICAgIHJldHVybiBfcGs7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBQcmltYXJ5S2V5IGFkZFByaW1hcnlLZXkoKSB7CisgICAgICAgIHJldHVybiBhZGRQcmltYXJ5S2V5KG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbWFyeUtleSBhZGRQcmltYXJ5S2V5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLmFkZE5hbWUobmFtZSwgZmFsc2UpOworICAgICAgICAgICAgX3BrID0gc2NoZW1hLmdldFNjaGVtYUdyb3VwKCkubmV3UHJpbWFyeUtleShuYW1lLCB0aGlzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfcGsgPSBuZXcgUHJpbWFyeUtleShuYW1lLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9wazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHByaW1hcnkga2V5IGZyb20gdGhpcyB0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3YXMgYSBwayB0byByZW1vdmUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVByaW1hcnlLZXkoKSB7CisgICAgICAgIGJvb2xlYW4gcmVtID0gX3BrICE9IG51bGw7CisgICAgICAgIGlmIChyZW0pIHsKKyAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLnJlbW92ZU5hbWUoX3BrLmdldE5hbWUoKSk7CisgICAgICAgICAgICBfcGsucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgX3BrID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBvcnQgYSBwcmltYXJ5IGtleTsgY29sdW1uIG5hbWVzIG11c3QgbWF0Y2ggY29sdW1ucyBvZiB0aGlzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBQcmltYXJ5S2V5IGltcG9ydFByaW1hcnlLZXkoUHJpbWFyeUtleSBwaykgeworICAgICAgICBpZiAocGsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFByaW1hcnlLZXkgY29weSA9IGFkZFByaW1hcnlLZXkocGsuZ2V0TmFtZSgpKTsKKyAgICAgICAgY29weS5zZXRMb2dpY2FsKHBrLmlzTG9naWNhbCgpKTsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHBrLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29weS5hZGRDb2x1bW4oZ2V0Q29sdW1uKGNvbHNbaV0uZ2V0TmFtZSgpKSk7CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgbXVsdGlwbGUgZm9yZWlnbiBrZXlzCisgICAgICogaGF2ZSB0aGUgbmFtZSwgdGhlIGZpcnN0IG1hdGNoIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IGdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UobmFtZSwgZmtzW2ldLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZrc1tpXTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBmb3JlaWduIGtleXMgZm9yIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleVtdIGdldEZvcmVpZ25LZXlzKCkgeworICAgICAgICBpZiAoX2ZrcyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX2ZrTGlzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9ma3MgPSBTY2hlbWFzLkVNUFRZX0ZPUkVJR05fS0VZUzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEZvcmVpZ25LZXlbXSBma3MgPSBuZXcgRm9yZWlnbktleVtfZmtMaXN0LnNpemUoKV07CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gX2ZrTGlzdC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpdHIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmtzW2ldID0gKEZvcmVpZ25LZXkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGZrc1tpXS5zZXRJbmRleChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2ZrcyA9IGZrczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2ZrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmb3JlaWduIGtleSB0byB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25LZXkgYWRkRm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZvcmVpZ25LZXkobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZm9yZWlnbiBrZXkgdG8gdGhlIHRhYmxlLiBEdXBsaWNhdGUga2V5IG5hbWVzIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleSBhZGRGb3JlaWduS2V5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgRm9yZWlnbktleSBmazsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLmFkZE5hbWUobmFtZSwgZmFsc2UpOworICAgICAgICAgICAgZmsgPSBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKS5uZXdGb3JlaWduS2V5KG5hbWUsIHRoaXMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGZrID0gbmV3IEZvcmVpZ25LZXkobmFtZSwgdGhpcyk7CisgICAgICAgIGlmIChfZmtMaXN0ID09IG51bGwpCisgICAgICAgICAgICBfZmtMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKKyAgICAgICAgX2ZrTGlzdC5hZGQoZmspOworICAgICAgICBfZmtzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGZrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgZnJvbSB0aGUgdGFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoZSB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUZvcmVpZ25LZXkoRm9yZWlnbktleSBmaykgeworICAgICAgICBpZiAoZmsgPT0gbnVsbCB8fCBfZmtMaXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFfZmtMaXN0LnJlbW92ZShmaykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGdldFNjaGVtYSgpOworICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmdldFNjaGVtYUdyb3VwKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLnJlbW92ZU5hbWUoZmsuZ2V0TmFtZSgpKTsKKyAgICAgICAgX2ZrcyA9IG51bGw7CisgICAgICAgIGZrLnJlbW92ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBvcnQgYSBmb3JlaWduIGtleTsgY29sdW1uIG5hbWVzIG11c3QgbWF0Y2ggY29sdW1ucyBvZiB0aGlzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBGb3JlaWduS2V5IGltcG9ydEZvcmVpZ25LZXkoRm9yZWlnbktleSBmaykgeworICAgICAgICBpZiAoZmsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZvcmVpZ25LZXkgY29weSA9IGFkZEZvcmVpZ25LZXkoZmsuZ2V0TmFtZSgpKTsKKyAgICAgICAgY29weS5zZXREZWxldGVBY3Rpb24oZmsuZ2V0RGVsZXRlQWN0aW9uKCkpOworCisgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbHVtbltdIHBrcyA9IGZrLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgICAgICBUYWJsZSBqb2luZWQgPSBudWxsOworICAgICAgICAgICAgaWYgKHBrcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIGpvaW5lZCA9IHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLmZpbmRUYWJsZShwa3NbMF0uZ2V0VGFibGUoKSk7CisKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBmay5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY29weS5qb2luKGdldENvbHVtbihjb2xzW2ldLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgIGpvaW5lZC5nZXRDb2x1bW4ocGtzW2ldLmdldE5hbWUoKSkpOworCisgICAgICAgICAgICBjb2xzID0gZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY29weS5qb2luQ29uc3RhbnQoZ2V0Q29sdW1uKGNvbHNbaV0uZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgZmsuZ2V0UHJpbWFyeUtleUNvbnN0YW50KGNvbHNbaV0pKTsKKworICAgICAgICAgICAgcGtzID0gZmsuZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICAgICAgaWYgKGpvaW5lZCA9PSBudWxsICYmIHBrcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIGpvaW5lZCA9IHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLmZpbmRUYWJsZShwa3NbMF0uZ2V0VGFibGUoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBrcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjb3B5LmpvaW5Db25zdGFudChmay5nZXRDb25zdGFudChwa3NbaV0pLAorICAgICAgICAgICAgICAgICAgICBqb2luZWQuZ2V0Q29sdW1uKHBrc1tpXS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlJ3MgaW5kZXhlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXhbXSBnZXRJbmRleGVzKCkgeworICAgICAgICBpZiAoX2lkeHMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9pZHhzID0gKF9pZHhNYXAgPT0gbnVsbCkgPyBTY2hlbWFzLkVNUFRZX0lOREVYRVMgOiAoSW5kZXhbXSkKKyAgICAgICAgICAgICAgICBfaWR4TWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IEluZGV4W19pZHhNYXAuc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBfaWR4czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBfaWR4TWFwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChJbmRleCkgX2lkeE1hcC5nZXQobmFtZS50b1VwcGVyQ2FzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaW5kZXggdG8gdGhlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBJbmRleCBhZGRJbmRleChTdHJpbmcgbmFtZSkgeworICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7CisgICAgICAgIEluZGV4IGlkeDsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLmFkZE5hbWUobmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICBpZHggPSBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKS5uZXdJbmRleChuYW1lLCB0aGlzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZHggPSBuZXcgSW5kZXgobmFtZSwgdGhpcyk7CisgICAgICAgIGlmIChfaWR4TWFwID09IG51bGwpCisgICAgICAgICAgICBfaWR4TWFwID0gbmV3IFRyZWVNYXAoKTsKKyAgICAgICAgX2lkeE1hcC5wdXQobmFtZS50b1VwcGVyQ2FzZSgpLCBpZHgpOworICAgICAgICBfaWR4cyA9IG51bGw7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBpbmRleCBmcm9tIHRoZSB0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW5kZXggd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBpbiB0aGUgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVJbmRleChJbmRleCBpZHgpIHsKKyAgICAgICAgaWYgKGlkeCA9PSBudWxsIHx8IF9pZHhNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBJbmRleCBjdXIgPSAoSW5kZXgpIF9pZHhNYXAuZ2V0KGlkeC5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIGlmICghaWR4LmVxdWFscyhjdXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIF9pZHhNYXAucmVtb3ZlKGlkeC5nZXROYW1lKCkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKyAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpICE9IG51bGwpCisgICAgICAgICAgICBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKS5yZW1vdmVOYW1lKGlkeC5nZXROYW1lKCkpOworICAgICAgICBpZHgucmVtb3ZlKCk7CisgICAgICAgIF9pZHhzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wb3J0IGFuIGluZGV4OyBjb2x1bW4gbmFtZXMgbXVzdCBtYXRjaCBjb2x1bW5zIG9mIHRoaXMgdGFibGUuCisgICAgICovCisgICAgcHVibGljIEluZGV4IGltcG9ydEluZGV4KEluZGV4IGlkeCkgeworICAgICAgICBpZiAoaWR4ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBJbmRleCBjb3B5ID0gYWRkSW5kZXgoaWR4LmdldE5hbWUoKSk7CisgICAgICAgIGNvcHkuc2V0VW5pcXVlKGlkeC5pc1VuaXF1ZSgpKTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gaWR4LmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29weS5hZGRDb2x1bW4oZ2V0Q29sdW1uKGNvbHNbaV0uZ2V0TmFtZSgpKSk7CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFibGUncyB1bmlxdWUgY29uc3RyYWludHMuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZVtdIGdldFVuaXF1ZXMoKSB7CisgICAgICAgIGlmIChfdW5xcyA9PSBudWxsKQorICAgICAgICAgICAgX3VucXMgPSAoX3VucUxpc3QgPT0gbnVsbCkgPyBTY2hlbWFzLkVNUFRZX1VOSVFVRVMgOiAoVW5pcXVlW10pCisgICAgICAgICAgICAgICAgX3VucUxpc3QudG9BcnJheShuZXcgVW5pcXVlW191bnFMaXN0LnNpemUoKV0pOworICAgICAgICByZXR1cm4gX3VucXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bmlxdWUgY29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSBnZXRVbmlxdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgVW5pcXVlW10gdW5xcyA9IGdldFVuaXF1ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bnFzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UobmFtZSwgdW5xc1tpXS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB1bnFzW2ldOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB1bmlxdWUgY29uc3RyYWludCB0byB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSBhZGRVbmlxdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGdldFNjaGVtYSgpOworICAgICAgICBVbmlxdWUgdW5xOworICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmdldFNjaGVtYUdyb3VwKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2NoZW1hLmdldFNjaGVtYUdyb3VwKCkuYWRkTmFtZShuYW1lLCBmYWxzZSk7CisgICAgICAgICAgICB1bnEgPSBzY2hlbWEuZ2V0U2NoZW1hR3JvdXAoKS5uZXdVbmlxdWUobmFtZSwgdGhpcyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdW5xID0gbmV3IFVuaXF1ZShuYW1lLCB0aGlzKTsKKyAgICAgICAgaWYgKF91bnFMaXN0ID09IG51bGwpCisgICAgICAgICAgICBfdW5xTGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgIF91bnFMaXN0LmFkZCh1bnEpOworICAgICAgICBfdW5xcyA9IG51bGw7CisgICAgICAgIHJldHVybiB1bnE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiB1bmlxdWUgY29uc3RyYWludCBmcm9tIHRoZSB0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoZSB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVVuaXF1ZShVbmlxdWUgdW5xKSB7CisgICAgICAgIGlmICh1bnEgPT0gbnVsbCB8fCBfdW5xTGlzdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghX3VucUxpc3QucmVtb3ZlKHVucSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGdldFNjaGVtYSgpOworICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmdldFNjaGVtYUdyb3VwKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLnJlbW92ZU5hbWUodW5xLmdldE5hbWUoKSk7CisgICAgICAgIF91bnFzID0gbnVsbDsKKyAgICAgICAgdW5xLnJlbW92ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBvcnQgYSBjb25zdHJhaW50OyBjb2x1bW4gbmFtZXMgbXVzdCBtYXRjaCBjb2x1bW5zIG9mIHRoaXMgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSBpbXBvcnRVbmlxdWUoVW5pcXVlIHVucSkgeworICAgICAgICBpZiAodW5xID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBVbmlxdWUgY29weSA9IGFkZFVuaXF1ZSh1bnEuZ2V0TmFtZSgpKTsKKyAgICAgICAgY29weS5zZXREZWZlcnJlZCh1bnEuaXNEZWZlcnJlZCgpKTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdW5xLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29weS5hZGRDb2x1bW4oZ2V0Q29sdW1uKGNvbHNbaV0uZ2V0TmFtZSgpKSk7CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBjb2x1bW5zIHRvIGVuc3VyZSB0aGF0IGFsbCBjb2x1bW5zIGFyZSBwcm9wZXJseSBpbmRleGVkCisgICAgICogYmVmb3JlIHJldHVybmluZyB0aGF0IGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHZvaWQgaW5kZXhDb2x1bW5zKCkgeworICAgICAgICBnZXRDb2x1bW5zKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGZvcmVpZ24ga2V5cyB0byBlbnN1cmUgdGhhdCBhbGwgZmtzIGFyZSBwcm9wZXJseSBpbmRleGVkCisgICAgICogYmVmb3JlIHJldHVybmluZyB0aGF0IGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHZvaWQgaW5kZXhGb3JlaWduS2V5cygpIHsKKyAgICAgICAgZ2V0Rm9yZWlnbktleXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgY29sdW1ucyB3aGVuIHRoZWlyIGF1dG8gaW5jcmVtZW50IHN0YXR1cyBjaGFuZ2VzLgorICAgICAqLworICAgIHZvaWQgY2hhbmdlQXV0b0Fzc2lnbmVkKENvbHVtbiBjb2wpIHsKKyAgICAgICAgX2F1dG9Bc3NpZ24gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBjb2x1bW5zIHdoZW4gdGhlaXIgcmVsYXRpb24gaWQgc3RhdHVzIGNoYW5nZXMuCisgICAgICovCisgICAgdm9pZCBjaGFuZ2VSZWxhdGlvbklkKENvbHVtbiBjb2wpIHsKKyAgICAgICAgX3JlbHMgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlcikgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGdldEZ1bGxOYW1lKCk7CisgICAgICAgIFN0cmluZyBvdGhlck5hbWUgPSAoKFRhYmxlKSBvdGhlcikuZ2V0RnVsbE5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBvdGhlck5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmIChvdGhlck5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIG5hbWUuY29tcGFyZVRvKG90aGVyTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldEZ1bGxOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvVGFibGVTY2hlbWFGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9UYWJsZVNjaGVtYUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QyOTEzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvVGFibGVTY2hlbWFGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuR2VuZXJhbEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBGYWN0b3J5IHRoYXQgdXNlcyBhbiBYTUwgc2NoZW1hIGRlZmluaXRpb24gc3RvcmVkIGluIGEgZGF0YWJhc2UgdGFibGUKKyAqIHRvIHJlY29yZCB0aGUgc3lzdGVtIHNjaGVtYS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGFibGVTY2hlbWFGYWN0b3J5CisgICAgaW1wbGVtZW50cyBTY2hlbWFGYWN0b3J5LCBDb25maWd1cmFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERCA9ICJhZGQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9EUk9QID0gImRyb3AiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoVGFibGVTY2hlbWFGYWN0b3J5LmNsYXNzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9yZWZyZXNoZWRUYWJsZSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBKREJDQ29uZmlndXJhdGlvbiBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSBMb2cgX2xvZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhYmxlID0gIk9QRU5KUEFfU0NIRU1BIjsKKyAgICBwcml2YXRlIFN0cmluZyBfcGtDb2x1bW5OYW1lID0gIklEIjsKKyAgICBwcml2YXRlIFN0cmluZyBfc2NoZW1hQ29sdW1uTmFtZSA9ICJTQ0hFTUFfREVGIjsKKyAgICBwcml2YXRlIENvbHVtbiBfcGtDb2x1bW4gPSBudWxsOworICAgIHByaXZhdGUgQ29sdW1uIF9zY2hlbWFDb2x1bW4gPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBkZWZpbml0aW9uIHRhYmxlLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPk9QRU5KUEFfU0NIRU1BPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgeworICAgICAgICByZXR1cm4gX3RhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiB0YWJsZS4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5PUEVOSlBBX1NDSEVNQTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX3RhYmxlID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUYWJsZX0uIFJldGFpbmVkIGZvcgorICAgICAqIGJhY2t3YXJkcy1jb21wYXRpYmxlIGF1dG8tY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2V0VGFibGUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvbiB0aGUgc2NoZW1hIGRlZmluaXRpb24gdGFibGUuCisgICAgICogRGVmYXVsdHMgdG8gPGNvZGU+SUQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXlDb2x1bW4oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX3BrQ29sdW1uTmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvbiB0aGUgc2NoZW1hIGRlZmluaXRpb24gdGFibGUuCisgICAgICogRGVmYXVsdHMgdG8gPGNvZGU+SUQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbigpIHsKKyAgICAgICAgcmV0dXJuIF9wa0NvbHVtbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBjb2x1bW4gb24gdGhlIHNjaGVtYSBkZWZpbml0aW9uIHRhYmxlLgorICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPlNDSEVNQV9ERUY8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUNvbHVtbihTdHJpbmcgbmFtZSkgeworICAgICAgICBfc2NoZW1hQ29sdW1uTmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBjb2x1bW4gb24gdGhlIHNjaGVtYSBkZWZpbml0aW9uIHRhYmxlLgorICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPlNDSEVNQV9ERUY8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hQ29sdW1uKCkgeworICAgICAgICByZXR1cm4gX3NjaGVtYUNvbHVtbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIEpEQkNDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfY29uZjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICAgICAgX2xvZyA9IF9jb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfU0NIRU1BKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgYnVpbGRUYWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hR3JvdXAgcmVhZFNjaGVtYSgpIHsKKyAgICAgICAgU3RyaW5nIHNjaGVtYSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzY2hlbWEgPSByZWFkU2NoZW1hQ29sdW1uKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYmFkLXNjaC1yZWFkIiwgc2UpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNjaGVtYUdyb3VwKCk7CisKKyAgICAgICAgWE1MU2NoZW1hUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxTY2hlbWFQYXJzZXIoX2NvbmYpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBTdHJpbmdSZWFkZXIoc2NoZW1hKSwKKyAgICAgICAgICAgICAgICBfc2NoZW1hQ29sdW1uLmdldEZ1bGxOYW1lKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRTY2hlbWFHcm91cCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU2NoZW1hKFNjaGVtYUdyb3VwIHNjaGVtYSkgeworICAgICAgICBYTUxTY2hlbWFTZXJpYWxpemVyIHNlciA9IG5ldyBYTUxTY2hlbWFTZXJpYWxpemVyKF9jb25mKTsKKyAgICAgICAgc2VyLmFkZEFsbChzY2hlbWEpOworICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VyLnNlcmlhbGl6ZSh3cml0ZXIsIHNlci5DT01QQUNUKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHNjaGVtYVN0ciA9IHdyaXRlci50b1N0cmluZygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVTY2hlbWFDb2x1bW4oc2NoZW1hU3RyKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJiYWQtc2NoLXdyaXRlLTEiLCBzZSkpOworCisgICAgICAgICAgICAvLyBtYXliZSB0aGUgdXBkYXRlIGZhaWxlZCBiL2MgdGhlIHNlcXVlbmNlIHRhYmxlIGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGV4aXN0IHlldDsgY3JlYXRlIGl0IG5vdzsgbm90ZSB0aGF0IHRob3VnaCB3ZSBzeW5jaHJvbml6ZQorICAgICAgICAgICAgLy8gaGVyZSwgb3RoZXIgSlZNcyBjYW4gc3RpbGwgYmUgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgdGFibGUgYXQKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIHRpbWUgKHVubGlrZWx5LCBzaW5jZSB0aGlzIGlzIGEgZGV2LXRvb2wgb3ApCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRhYmxlU2NoZW1hRmFjdG9yeS5jbGFzcykgeworICAgICAgICAgICAgICAgIGlmICghX3JlZnJlc2hlZFRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIF9yZWZyZXNoZWRUYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoVGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImJhZC1zY2gtcmVmIiwgZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTY2hlbWFDb2x1bW4oc2NoZW1hU3RyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImJhZC1zY2gtd3JpdGUtMiIpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHNjaGVtYSB0YWJsZSBpbiB0aGUgREIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFRhYmxlKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cuaW5mbyhfbG9jLmdldCgibWFrZS1zY2gtdGFibGUiKSk7CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSB0YWJsZQorICAgICAgICBTY2hlbWFUb29sIHRvb2wgPSBuZXcgU2NoZW1hVG9vbChfY29uZik7CisgICAgICAgIHRvb2wuc2V0SWdub3JlRXJyb3JzKHRydWUpOworICAgICAgICB0b29sLmNyZWF0ZVRhYmxlKF9wa0NvbHVtbi5nZXRUYWJsZSgpKTsKKworICAgICAgICAvLyBpbnNlcnQgYW4gZW1wdHkgc2NoZW1hCisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IGdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICBib29sZWFuIHdhc0F1dG8gPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FzQXV0byA9IGNvbm4uZ2V0QXV0b0NvbW1pdCgpOworICAgICAgICAgICAgaWYgKCF3YXNBdXRvKQorICAgICAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdCh0cnVlKTsKKworICAgICAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICAgICAgc3RtbnQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIklOU0VSVCBJTlRPICIKKyAgICAgICAgICAgICAgICArIGRpY3QuZ2V0RnVsbE5hbWUoX3BrQ29sdW1uLmdldFRhYmxlKCksIGZhbHNlKQorICAgICAgICAgICAgICAgICsgIiAoIiArIF9wa0NvbHVtbiArICIsICIgKyBfc2NoZW1hQ29sdW1uICsgIikgVkFMVUVTICg/LCA/KSIpOworICAgICAgICAgICAgZGljdC5zZXRJbnQoc3RtbnQsIDEsIDEsIF9wa0NvbHVtbik7CisgICAgICAgICAgICBkaWN0LnNldE51bGwoc3RtbnQsIDIsIF9zY2hlbWFDb2x1bW4uZ2V0VHlwZSgpLCBfc2NoZW1hQ29sdW1uKTsKKworICAgICAgICAgICAgc3RtbnQuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0bW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RtbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXdhc0F1dG8pCisgICAgICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcm9wcyB0aGUgc2VxdWVuY2UgdGFibGUgaW4gdGhlIERCLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyb3BUYWJsZSgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoImRyb3Atc2NoLXRhYmxlIikpOworCisgICAgICAgIC8vIGRyb3AgdGhlIHRhYmxlCisgICAgICAgIFNjaGVtYVRvb2wgdG9vbCA9IG5ldyBTY2hlbWFUb29sKF9jb25mKTsKKyAgICAgICAgdG9vbC5zZXRJZ25vcmVFcnJvcnModHJ1ZSk7CisgICAgICAgIHRvb2wuZHJvcFRhYmxlKF9wa0NvbHVtbi5nZXRUYWJsZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgYXMgYW4gWE1MIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRTY2hlbWFDb2x1bW4oKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBTUUxCdWZmZXIgc2VsID0gbmV3IFNRTEJ1ZmZlcihkaWN0KS5hcHBlbmQoX3NjaGVtYUNvbHVtbik7CisgICAgICAgIFNRTEJ1ZmZlciB3aGVyZSA9IG5ldyBTUUxCdWZmZXIoZGljdCkuYXBwZW5kKF9wa0NvbHVtbikuYXBwZW5kKCIgPSAiKS4KKyAgICAgICAgICAgIGFwcGVuZFZhbHVlKE51bWJlcnMudmFsdWVPZigxKSwgX3BrQ29sdW1uKTsKKyAgICAgICAgU1FMQnVmZmVyIHRhYmxlcyA9IG5ldyBTUUxCdWZmZXIoZGljdCkuYXBwZW5kKF9wa0NvbHVtbi5nZXRUYWJsZSgpKTsKKworICAgICAgICBTUUxCdWZmZXIgc2VsZWN0ID0gZGljdC50b1NlbGVjdChzZWwsIG51bGwsIHRhYmxlcywgd2hlcmUsIG51bGwsCisgICAgICAgICAgICBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UsIDAsIExvbmcuTUFYX1ZBTFVFKTsKKworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB3YXNBdXRvID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhc0F1dG8gPSBjb25uLmdldEF1dG9Db21taXQoKTsKKyAgICAgICAgICAgIGlmICghd2FzQXV0bykKKyAgICAgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQodHJ1ZSk7CisKKyAgICAgICAgICAgIHN0bW50ID0gc2VsZWN0LnByZXBhcmVTdGF0ZW1lbnQoY29ubik7CisgICAgICAgICAgICBycyA9IHN0bW50LmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgcnMubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHNjaGVtYSA9IChfc2NoZW1hQ29sdW1uLmdldFR5cGUoKSA9PSBUeXBlcy5DTE9CKSA/CisgICAgICAgICAgICAgICAgZGljdC5nZXRDbG9iU3RyaW5nKHJzLCAxKSA6IGRpY3QuZ2V0U3RyaW5nKHJzLCAxKTsKKyAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0bW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF3YXNBdXRvKQorICAgICAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBzY2hlbWEgYXMgYSBzdHJpbmcgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlU2NoZW1hQ29sdW1uKFN0cmluZyBzY2hlbWEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBhbHdheXMgdXNlIHNwZWNpYWwgY2xvYiBoYW5kbGluZyB3aGVuIGRpY3QgaGFzIG1heCBlbWJlZGRlZCBzaXplOworICAgICAgICAvLyBmb3Igc29tZSByZWFzb24gb3B0aW1pemluZyBmb3Igc3RyaW5nIGxlbmd0aCBjYXVzZXMgZXJyb3JzCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gX2NvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICAgICAgYm9vbGVhbiBlbWJlZGRlZCA9IGRpY3QubWF4RW1iZWRkZWRDbG9iU2l6ZSA9PSAtMTsKKyAgICAgICAgU3RyaW5nIHVwZGF0ZTsKKyAgICAgICAgaWYgKGVtYmVkZGVkKQorICAgICAgICAgICAgdXBkYXRlID0gIlVQREFURSAiICsgZGljdC5nZXRGdWxsTmFtZShfcGtDb2x1bW4uZ2V0VGFibGUoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgKyAiIFNFVCAiICsgX3NjaGVtYUNvbHVtbiArICIgPSA/ICBXSEVSRSAiICsgX3BrQ29sdW1uICsgIiA9ID8iOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1cGRhdGUgPSAiU0VMRUNUICIgKyBfc2NoZW1hQ29sdW1uICsgIiBGUk9NICIKKyAgICAgICAgICAgICAgICArIGRpY3QuZ2V0RnVsbE5hbWUoX3BrQ29sdW1uLmdldFRhYmxlKCksIGZhbHNlKQorICAgICAgICAgICAgICAgICsgIiBXSEVSRSAiICsgX3BrQ29sdW1uICsgIiA9ID8iOworCisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IGdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICBib29sZWFuIHdhc0F1dG8gPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaWYgZW1iZWRkZWQgd2Ugd2FudCBhdXRvY29tbWl0IHRydWUsIGVsc2UgZmFsc2UKKyAgICAgICAgICAgIHdhc0F1dG8gPSBjb25uLmdldEF1dG9Db21taXQoKTsKKyAgICAgICAgICAgIGlmICh3YXNBdXRvICE9IGVtYmVkZGVkKQorICAgICAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChlbWJlZGRlZCk7CisKKyAgICAgICAgICAgIGlmIChlbWJlZGRlZCkgeworICAgICAgICAgICAgICAgIHN0bW50ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHVwZGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBkaWN0LnNldE51bGwoc3RtbnQsIDEsIF9zY2hlbWFDb2x1bW4uZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX3NjaGVtYUNvbHVtbik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3NjaGVtYUNvbHVtbi5nZXRUeXBlKCkgPT0gVHlwZXMuQ0xPQikKKyAgICAgICAgICAgICAgICAgICAgZGljdC5zZXRDbG9iU3RyaW5nKHN0bW50LCAxLCBzY2hlbWEsIF9zY2hlbWFDb2x1bW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGljdC5zZXRTdHJpbmcoc3RtbnQsIDEsIHNjaGVtYSwgX3NjaGVtYUNvbHVtbik7CisgICAgICAgICAgICAgICAgZGljdC5zZXRJbnQoc3RtbnQsIDIsIDEsIF9wa0NvbHVtbik7CisgICAgICAgICAgICAgICAgc3RtbnQuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG1udCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudCh1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgIFJlc3VsdFNldC5UWVBFX1NDUk9MTF9JTlNFTlNJVElWRSwKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0U2V0LkNPTkNVUl9VUERBVEFCTEUpOworICAgICAgICAgICAgICAgIGRpY3Quc2V0SW50KHN0bW50LCAxLCAxLCBfcGtDb2x1bW4pOworICAgICAgICAgICAgICAgIHJzID0gc3RtbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgcnMubmV4dCgpOworICAgICAgICAgICAgICAgIGRpY3QucHV0U3RyaW5nKHJzLmdldENsb2IoMSksIHNjaGVtYSk7CisgICAgICAgICAgICAgICAgY29ubi5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0bW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RtbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2FzQXV0byAhPSBlbWJlZGRlZCkKKyAgICAgICAgICAgICAgICBjb25uLnNldEF1dG9Db21taXQod2FzQXV0byk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgb2JqZWN0LWxldmVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVpbGRUYWJsZSgpIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKF90YWJsZSk7CisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lID0gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShfdGFibGUpOworICAgICAgICBpZiAoc2NoZW1hTmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgc2NoZW1hTmFtZSA9IFNjaGVtYXMuZ2V0TmV3VGFibGVTY2hlbWEoX2NvbmYpOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSB0YWJsZSBpbiBvbmUgb2YgdGhlIGRlc2lnbmF0ZWQgc2NoZW1hcworICAgICAgICBTY2hlbWFHcm91cCBncm91cCA9IG5ldyBTY2hlbWFHcm91cCgpOworICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ3JvdXAuYWRkU2NoZW1hKHNjaGVtYU5hbWUpOworCisgICAgICAgIFRhYmxlIHRhYmxlID0gc2NoZW1hLmFkZFRhYmxlKHRhYmxlTmFtZSk7CisgICAgICAgIFByaW1hcnlLZXkgcGsgPSB0YWJsZS5hZGRQcmltYXJ5S2V5KCk7CisKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBfcGtDb2x1bW4gPSB0YWJsZS5hZGRDb2x1bW4oZGljdC5nZXRWYWxpZENvbHVtbk5hbWUKKyAgICAgICAgICAgIChfcGtDb2x1bW5OYW1lLCB0YWJsZSkpOworICAgICAgICBfcGtDb2x1bW4uc2V0VHlwZShkaWN0LmdldFByZWZlcnJlZFR5cGUoVHlwZXMuVElOWUlOVCkpOworICAgICAgICBfcGtDb2x1bW4uc2V0SmF2YVR5cGUoSmF2YVR5cGVzLklOVCk7CisgICAgICAgIHBrLmFkZENvbHVtbihfcGtDb2x1bW4pOworCisgICAgICAgIF9zY2hlbWFDb2x1bW4gPSB0YWJsZS5hZGRDb2x1bW4oZGljdC5nZXRWYWxpZENvbHVtbk5hbWUKKyAgICAgICAgICAgIChfc2NoZW1hQ29sdW1uTmFtZSwgdGFibGUpKTsKKyAgICAgICAgX3NjaGVtYUNvbHVtbi5zZXRUeXBlKGRpY3QuZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5DTE9CKSk7CisgICAgICAgIF9zY2hlbWFDb2x1bW4uc2V0SmF2YVR5cGUoSmF2YVR5cGVzLlNUUklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29ubmVjdGlvbiB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9jb25mLmdldERhdGFTb3VyY2UyKG51bGwpLmdldENvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8KKyAgICAvLyBNYWluCisgICAgLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBVc2FnZTogamF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGVTY2hlbWFGYWN0b3J5CisgICAgICogW29wdGlvbl0qIC1hY3Rpb24vLWEgJmx0O2FkZCB8IGRyb3AmZ3Q7CisgICAgICogIFdoZXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZC4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPi1wcm9wZXJ0aWVzLy1wICZsdDtwcm9wZXJ0aWVzIGZpbGUgb3IgcmVzb3VyY2UmZ3Q7PC9pPjogVGhlCisgICAgICogcGF0aCBvciByZXNvdXJjZSBuYW1lIG9mIGEgT3BlbkpQQSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZworICAgICAqIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGxpY2Vuc2Uga2V5CWFuZCBjb25uZWN0aW9uIGRhdGEgYXMKKyAgICAgKiBvdXRsaW5lZCBpbiB7QGxpbmsgSkRCQ0NvbmZpZ3VyYXRpb259LiBPcHRpb25hbC48L2xpPgorICAgICAqIDxsaT48aT4tJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDtwcm9wZXJ0eSB2YWx1ZSZndDs8L2k+OiBBbGwgYmVhbgorICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIE9wZW5KUEEge0BsaW5rIEpEQkNDb25maWd1cmF0aW9ufSBjYW4gYmUgc2V0IGJ5CisgICAgICogdXNpbmcgdGhlaXIJbmFtZXMgYW5kIHN1cHBseWluZyBhIHZhbHVlLiBGb3IgZXhhbXBsZToKKyAgICAgKiA8Y29kZT4tbGljZW5zZUtleSBhZHNsZmphODNyM2xrYWRmPC9jb2RlPjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiAgVGhlIHZhcmlvdXMgYWN0aW9ucyBhcmUgYXMgZm9sbG93cy4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPmFkZDwvaT46IENyZWF0ZSB0aGUgc2NoZW1hIHRhYmxlLjwvbGk+CisgICAgICogPGxpPjxpPmRyb3A8L2k+OiBEcm9wIHRoZSBzY2hlbWEgdGFibGUuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgYXJncyA9IG9wdHMuc2V0RnJvbUNtZExpbmUoYXJncyk7CisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgSkRCQ0NvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXJ1bihjb25mLCBhcmdzLCBvcHRzKSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oX2xvYy5nZXQoInNjaC11c2FnZSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbmYuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJucyBmYWxzZSBpZiBpbnZhbGlkIG9wdGlvbnMgd2VyZSBnaXZlbi4KKyAgICAgKgorICAgICAqIEBzZWUgI21haW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIE9wdGlvbnMgb3B0cykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAob3B0cy5jb250YWluc0tleSgiaGVscCIpIHx8IG9wdHMuY29udGFpbnNLZXkoIi1oZWxwIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG9wdHMucmVtb3ZlUHJvcGVydHkoImFjdGlvbiIsICJhIiwgbnVsbCk7CisgICAgICAgIENvbmZpZ3VyYXRpb25zLnBvcHVsYXRlQ29uZmlndXJhdGlvbihjb25mLCBvcHRzKTsKKyAgICAgICAgcmV0dXJuIHJ1bihjb25mLCBhY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKEpEQkNDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBhY3Rpb24pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcnVuIHRoZSBhY3Rpb24KKyAgICAgICAgVGFibGVTY2hlbWFGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVGFibGVTY2hlbWFGYWN0b3J5KCk7CisgICAgICAgIFN0cmluZyBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoY29uZi5nZXRTY2hlbWFGYWN0b3J5KCkpOworICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShmYWN0b3J5LCBjb25mLCBwcm9wcyk7CisKKyAgICAgICAgaWYgKEFDVElPTl9EUk9QLmVxdWFscyhhY3Rpb24pKQorICAgICAgICAgICAgZmFjdG9yeS5kcm9wVGFibGUoKTsKKyAgICAgICAgZWxzZSBpZiAoQUNUSU9OX0FERC5lcXVhbHMoYWN0aW9uKSkKKyAgICAgICAgICAgIGZhY3RvcnkucmVmcmVzaFRhYmxlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvVW5pcXVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9VbmlxdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTMzOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvVW5pcXVlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHVuaXF1ZSBjb25zdHJhaW50LiBJdCBjYW4gYWxzbyByZXByZXNlbnQgYSBwYXJ0aWFsIGNvbnN0cmFpbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFVuaXF1ZQorICAgIGV4dGVuZHMgTG9jYWxDb25zdHJhaW50IHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFVuaXF1ZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50LCBpZiBhbnkKKyAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIG9mIHRoZSBjb25zdHJhaW50CisgICAgICovCisgICAgcHVibGljIFVuaXF1ZShTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgdGFibGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9naWNhbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBwcmltYXJ5IGtleSBtYXRjaGVzIHRoYXQgb2YKKyAgICAgKiB0aGUgZ2l2ZW4gb25lIChzYW1lIHRhYmxlLCBzYW1lIGNvbHVtbnMpLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc1VuaXF1ZShVbmlxdWUgdW5xKSB7CisgICAgICAgIHJldHVybiBlcXVhbHNMb2NhbENvbnN0cmFpbnQodW5xKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9YTUxTY2hlbWFQYXJzZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1hNTFNjaGVtYVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2U1MzkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9YTUxTY2hlbWFQYXJzZXIuamF2YQpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5YTUxNZXRhRGF0YVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEN1c3RvbSBTQVggcGFyc2VyIHVzZWQgdG8gcGFyc2Uge0BsaW5rIFNjaGVtYX0gb2JqZWN0cy4gVGhlIHBhcnNlcgorICogd2lsbCBwbGFjZSBhbGwgcGFyc2VkIHNjaGVtYXMgaW50byB0aGUgY3VycmVudCB7QGxpbmsgU2NoZW1hR3JvdXB9LCBzZXQKKyAqIHZpYSB0aGUge0BsaW5rICNzZXRTY2hlbWFHcm91cH0gbWV0aG9kLiBUaGlzIGFsbG93cyBwYXJzaW5nIG9mCisgKiBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIHNjaGVtYSBncm91cC4KKyAqICBUaGUgcGFyc2VyIGRlc2VyaWFsaXplcyBmcm9tIHRoZSBmb2xsb3dpbmcgWE1MIGZvcm1hdDo8YnIgLz4KKyAqIDxjb2RlPiAmbHQ7IUVMRU1FTlQgc2NoZW1hcyAoc2NoZW1hKSsmZ3Q7PGJyIC8+CisgKiAmbHQ7IUVMRU1FTlQgc2NoZW1hICh0YWJsZXxzZXF1ZW5jZSkrJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIHNjaGVtYSBuYW1lIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFFTEVNRU5UIHRhYmxlIChjb2x1bW58aW5kZXh8cGt8Zmt8dW5pcXVlKSsmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgdGFibGUgbmFtZSBDREFUQSAjUkVRVUlSRUQmZ3Q7PGJyIC8+CisgKiAmbHQ7IUVMRU1FTlQgY29sdW1uIEVNUFRZJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGNvbHVtbiBuYW1lIENEQVRBICNSRVFVSVJFRCZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCBjb2x1bW4gdHlwZSAoYXJyYXl8YmlnaW50fGJpbmFyeXxiaXR8YmxvYnxjaGFyfGNsb2IKKyAqIHxkYXRlfGRlY2ltYWx8ZGlzdGluY3R8ZG91YmxlfGZsb2F0fGludGVnZXJ8amF2YV9vYmplY3QKKyAqIHxsb25ndmFyYmluYXJ5fGxvbmd2YXJjaGFyfG51bGx8bnVtZXJpY3xvdGhlcnxyZWFsfHJlZnxzbWFsbGludHxzdHJ1Y3QKKyAqIHx0aW1lfHRpbXN0YW1wfHRpbnlpbnR8dmFyYmluYXJ5fHZhcmNoYXIpICNSRVFVSVJFRCZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCBjb2x1bW4gdHlwZS1uYW1lIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGNvbHVtbiBzaXplIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGNvbHVtbiBkZWNpbWFsLWRpZ2l0cyBDREFUQSAjSU1QTElFRCZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCBjb2x1bW4gbm90LW51bGwgKHRydWV8ZmFsc2UpICJmYWxzZSImZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgY29sdW1uIGRlZmF1bHQgQ0RBVEEgI0lNUExJRUQmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgY29sdW1uIGF1dG8tYXNzaWduICh0cnVlfGZhbHNlKSAiZmFsc2UiJmd0OzxiciAvPgorICogJmx0OyFFTEVNRU5UIGluZGV4IChvbikqJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGluZGV4IG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGluZGV4IGNvbHVtbiBDREFUQSAjSU1QTElFRCZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCBpbmRleCB1bmlxdWUgKHRydWV8ZmFsc2UpICJmYWxzZSImZ3Q7PGJyIC8+CisgKiAmbHQ7IUVMRU1FTlQgb24gRU1QVFkmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1Qgb24gY29sdW1uIENEQVRBICNSRVFVSVJFRCZndDs8YnIgLz4KKyAqICZsdDshRUxFTUVOVCBwayAob24pKiZndDs8YnIgLz4gJmx0OyFBVFRMSVNUIHBrIG5hbWUgQ0RBVEEgI0lNUExJRUQmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgcGsgY29sdW1uIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFFTEVNRU5UIGZrIChqb2luKSomZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgZmsgbmFtZSBDREFUQSAjSU1QTElFRCZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCBmayBkZWZlcnJlZCAodHJ1ZXxmYWxzZSkgImZhbHNlIiZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCBmayBjb2x1bW4gQ0RBVEEgI0lNUExJRUQmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgZmsgdG8tdGFibGUgQ0RBVEEgI1JFUVVJUkVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGZrIGRlbGV0ZS1hY3Rpb24gKGNhc2NhZGV8ZGVmYXVsdHxyZXN0cmljdHxub25lfG51bGwpCisgKiAibm9uZSImZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1QgZmsgdXBkYXRlLWFjdGlvbiAoY2FzY2FkZXxkZWZhdWx0fHJlc3RyaWN0fG5vbmV8bnVsbCkKKyAqICJub25lIiZndDs8YnIgLz4gJmx0OyFFTEVNRU5UIHVuaXF1ZSAob24pKiZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCB1bmlxdWUgbmFtZSBDREFUQSAjSU1QTElFRCZndDs8YnIgLz4KKyAqICZsdDshQVRUTElTVCB1bmlxdWUgY29sdW1uIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIHVuaXF1ZSBkZWZlcnJlZCAodHJ1ZXxmYWxzZSkgImZhbHNlIiZndDs8YnIgLz4KKyAqICZsdDshRUxFTUVOVCBqb2luIEVNUFRZJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGpvaW4gY29sdW1uIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIGpvaW4gdmFsdWUgQ0RBVEEgI0lNUExJRUQmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1Qgam9pbiB0by1jb2x1bW4gQ0RBVEEgI1JFUVVJUkVEJmd0OzxiciAvPgorICogJmx0OyFFTEVNRU5UIHNlcXVlbmNlIEVNUFRZJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIHNlcXVlbmNlIG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIHNlcXVlbmNlIGluaXRpYWwtdmFsdWUgQ0RBVEEgI0lNUExJRUQmZ3Q7PGJyIC8+CisgKiAmbHQ7IUFUVExJU1Qgc2VxdWVuY2UgaW5jcmVtZW50IENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogJmx0OyFBVFRMSVNUIHNlcXVlbmNlIGFsbG9jYXRlIENEQVRBICNJTVBMSUVEJmd0OzxiciAvPgorICogPC9jb2RlPgorICogIFNjaGVtYSBwYXJzZXJzIGFyZSBub3QgdGhyZWFkc2FmZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgWE1MU2NoZW1hUGFyc2VyCisgICAgZXh0ZW5kcyBYTUxNZXRhRGF0YVBhcnNlcgorICAgIGltcGxlbWVudHMgU2NoZW1hUGFyc2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFhNTFNjaGVtYVBhcnNlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIERCRGljdGlvbmFyeSBfZGljdDsKKworICAgIC8vIHN0YXRlIGZvciBjdXJyZW50IHBhcnNlCisgICAgcHJpdmF0ZSBTY2hlbWFHcm91cCBfZ3JvdXAgPSBudWxsOworICAgIHByaXZhdGUgU2NoZW1hIF9zY2hlbWEgPSBudWxsOworICAgIHByaXZhdGUgVGFibGUgX3RhYmxlID0gbnVsbDsKKyAgICBwcml2YXRlIFByaW1hcnlLZXlJbmZvIF9wayA9IG51bGw7CisgICAgcHJpdmF0ZSBJbmRleEluZm8gX2luZGV4ID0gbnVsbDsKKyAgICBwcml2YXRlIFVuaXF1ZUluZm8gX3VucSA9IG51bGw7CisgICAgcHJpdmF0ZSBGb3JlaWduS2V5SW5mbyBfZmsgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfZGVsYXkgPSBmYWxzZTsKKworICAgIC8vIHVzZWQgdG8gY29sbGVjdCBpbmZvIG9uIHNjaGVtYSBlbGVtZW50cyBiZWZvcmUgdGhleSdyZSByZXNvbHZlZAorICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBfcGtJbmZvcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIF9pbmRleEluZm9zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gX3VucUluZm9zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gX2ZrSW5mb3MgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBYTUxTY2hlbWFQYXJzZXIoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfZGljdCA9IGNvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKTsKKyAgICAgICAgc2V0TG9nKGNvbmYuZ2V0TG9nKEpEQkNDb25maWd1cmF0aW9uLkxPR19TQ0hFTUEpKTsKKyAgICAgICAgc2V0UGFyc2VUZXh0KGZhbHNlKTsKKyAgICAgICAgc2V0U3VmZml4KCIuc2NoZW1hIik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVsYXlDb25zdHJhaW50UmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxheUNvbnN0cmFpbnRSZXNvbHZlKGJvb2xlYW4gZGVsYXkpIHsKKyAgICAgICAgX2RlbGF5ID0gZGVsYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUNvbnN0cmFpbnRzKCkgeworICAgICAgICByZXNvbHZlUHJpbWFyeUtleXMoKTsKKyAgICAgICAgcmVzb2x2ZUluZGV4ZXMoKTsKKyAgICAgICAgcmVzb2x2ZUZvcmVpZ25LZXlzKCk7CisgICAgICAgIHJlc29sdmVVbmlxdWVzKCk7CisgICAgICAgIGNsZWFyQ29uc3RyYWludEluZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBjb25zdHJhaW50IGluZm9zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhckNvbnN0cmFpbnRJbmZvKCkgeworICAgICAgICBfcGtJbmZvcy5jbGVhcigpOworICAgICAgICBfaW5kZXhJbmZvcy5jbGVhcigpOworICAgICAgICBfZmtJbmZvcy5jbGVhcigpOworICAgICAgICBfdW5xSW5mb3MuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hR3JvdXAgZ2V0U2NoZW1hR3JvdXAoKSB7CisgICAgICAgIGlmIChfZ3JvdXAgPT0gbnVsbCkKKyAgICAgICAgICAgIF9ncm91cCA9IG5ldyBTY2hlbWFHcm91cCgpOworICAgICAgICByZXR1cm4gX2dyb3VwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdyb3VwKFNjaGVtYUdyb3VwIGdyb3VwKSB7CisgICAgICAgIF9ncm91cCA9IGdyb3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzY2hlbWEgcmVsYXRpbmcgdG8gdGhlIGdpdmVuIGNsYXNzLiBUaGUgc2NoZW1hcyB3aWxsCisgICAgICogYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc2NoZW1hIGdyb3VwLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgLy8gbm93IHJlc29sdmUgcGssIGlkeCwgZmsgaW5mbworICAgICAgICBzdXBlci5maW5pc2goKTsKKyAgICAgICAgaWYgKCFfZGVsYXkpCisgICAgICAgICAgICByZXNvbHZlQ29uc3RyYWludHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIHRoZSBjb2xsZWN0ZWQgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24gaW50byBhY3R1YWwKKyAgICAgKiBwcmltYXJ5IGtleXMgb24gdGhlIHNjaGVtYSB0YWJsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVQcmltYXJ5S2V5cygpIHsKKyAgICAgICAgUHJpbWFyeUtleUluZm8gcGtJbmZvOworICAgICAgICBTdHJpbmcgY29sTmFtZTsKKyAgICAgICAgQ29sdW1uIGNvbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfcGtJbmZvcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgcGtJbmZvID0gKFByaW1hcnlLZXlJbmZvKSBpdHIubmV4dCgpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBjb2xzID0gcGtJbmZvLmNvbHMuaXRlcmF0b3IoKTsgY29scy5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgY29sTmFtZSA9IChTdHJpbmcpIGNvbHMubmV4dCgpOworICAgICAgICAgICAgICAgIGNvbCA9IHBrSW5mby5way5nZXRUYWJsZSgpLmdldENvbHVtbihjb2xOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93VXNlckV4Y2VwdGlvbihfbG9jLmdldCgicGstcmVzb2x2ZSIsIG5ldyBPYmplY3RbXQorICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2xOYW1lLCBwa0luZm8ucGsuZ2V0VGFibGUoKSB9KSk7CisgICAgICAgICAgICAgICAgcGtJbmZvLnBrLmFkZENvbHVtbihjb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyB0aGUgY29sbGVjdGVkIGluZGV4IGluZm9ybWF0aW9uIGludG8gYWN0dWFsCisgICAgICogaW5kZXhlcyBvbiB0aGUgc2NoZW1hIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUluZGV4ZXMoKSB7CisgICAgICAgIEluZGV4SW5mbyBpbmRleEluZm87CisgICAgICAgIFN0cmluZyBjb2xOYW1lOworICAgICAgICBDb2x1bW4gY29sOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9pbmRleEluZm9zLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpbmRleEluZm8gPSAoSW5kZXhJbmZvKSBpdHIubmV4dCgpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBjb2xzID0gaW5kZXhJbmZvLmNvbHMuaXRlcmF0b3IoKTsgY29scy5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgY29sTmFtZSA9IChTdHJpbmcpIGNvbHMubmV4dCgpOworICAgICAgICAgICAgICAgIGNvbCA9IGluZGV4SW5mby5pbmRleC5nZXRUYWJsZSgpLmdldENvbHVtbihjb2xOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93VXNlckV4Y2VwdGlvbihfbG9jLmdldCgiaW5kZXgtcmVzb2x2ZSIsIG5ldyBPYmplY3RbXQorICAgICAgICAgICAgICAgICAgICAgICAgeyBpbmRleEluZm8uaW5kZXgsIGNvbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhJbmZvLmluZGV4LmdldFRhYmxlKCkgfSkpOworICAgICAgICAgICAgICAgIGluZGV4SW5mby5pbmRleC5hZGRDb2x1bW4oY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgdGhlIGNvbGxlY3RlZCBmb3JlaWduIGtleSBpbmZvcm1hdGlvbiBpbnRvIGFjdHVhbAorICAgICAqIGZvcmVpZ24ga2V5cyBvbiB0aGUgc2NoZW1hIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUZvcmVpZ25LZXlzKCkgeworICAgICAgICBGb3JlaWduS2V5SW5mbyBma0luZm87CisgICAgICAgIFRhYmxlIHRvVGFibGU7CisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIFN0cmluZyBjb2xOYW1lOworICAgICAgICBDb2x1bW4gcGtDb2w7CisgICAgICAgIFN0cmluZyBwa0NvbE5hbWU7CisgICAgICAgIFByaW1hcnlLZXkgcGs7CisgICAgICAgIEl0ZXJhdG9yIHBrczsKKyAgICAgICAgSXRlcmF0b3IgY29sczsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfZmtJbmZvcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZmtJbmZvID0gKEZvcmVpZ25LZXlJbmZvKSBpdHIubmV4dCgpOworICAgICAgICAgICAgdG9UYWJsZSA9IF9ncm91cC5maW5kVGFibGUoZmtJbmZvLnRvVGFibGUpOworICAgICAgICAgICAgaWYgKHRvVGFibGUgPT0gbnVsbCB8fCB0b1RhYmxlLmdldFByaW1hcnlLZXkoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93VXNlckV4Y2VwdGlvbihfbG9jLmdldCgiZmstdG90YWJsZSIsIG5ldyBPYmplY3RbXQorICAgICAgICAgICAgICAgICAgICB7IGZrSW5mby5maywgZmtJbmZvLnRvVGFibGUsIGZrSW5mby5may5nZXRUYWJsZSgpIH0pKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25seSBvbmUgZmsgY29sdW1uIGxpc3RlZCB1c2luZyBzaG9ydGN1dAorICAgICAgICAgICAgcGsgPSB0b1RhYmxlLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgICAgIGlmIChma0luZm8uY29scy5zaXplKCkgPT0gMSAmJiBma0luZm8ucGtzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgICAgIGZrSW5mby5wa3MuYWRkKHBrLmdldENvbHVtbnMoKVswXS5nZXROYW1lKCkpOworCisgICAgICAgICAgICAvLyBtYWtlIGpvaW5zCisgICAgICAgICAgICBwa3MgPSBma0luZm8ucGtzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBmb3IgKGNvbHMgPSBma0luZm8uY29scy5pdGVyYXRvcigpOyBjb2xzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBjb2xOYW1lID0gKFN0cmluZykgY29scy5uZXh0KCk7CisgICAgICAgICAgICAgICAgY29sID0gZmtJbmZvLmZrLmdldFRhYmxlKCkuZ2V0Q29sdW1uKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJmay1ub2NvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICBma0luZm8uZmssIGNvbE5hbWUsIGZrSW5mby5may5nZXRUYWJsZSgpKSk7CisKKyAgICAgICAgICAgICAgICBwa0NvbE5hbWUgPSAoU3RyaW5nKSBwa3MubmV4dCgpOworICAgICAgICAgICAgICAgIHBrQ29sID0gdG9UYWJsZS5nZXRDb2x1bW4ocGtDb2xOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocGtDb2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJmay1ub3BrY29sIiwgbmV3IE9iamVjdFtdCisgICAgICAgICAgICAgICAgICAgICAgICB7IGZrSW5mby5maywgcGtDb2xOYW1lLCB0b1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZrSW5mby5may5nZXRUYWJsZSgpIH0pKTsKKworICAgICAgICAgICAgICAgIGZrSW5mby5may5qb2luKGNvbCwgcGtDb2wpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIGNvbnN0YW50IGpvaW5zCisgICAgICAgICAgICBjb2xzID0gZmtJbmZvLmNvbnN0Q29scy5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciB2YWxzID0gZmtJbmZvLmNvbnN0cy5pdGVyYXRvcigpOyB2YWxzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBjb2xOYW1lID0gKFN0cmluZykgY29scy5uZXh0KCk7CisgICAgICAgICAgICAgICAgY29sID0gZmtJbmZvLmZrLmdldFRhYmxlKCkuZ2V0Q29sdW1uKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJmay1ub2NvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICBma0luZm8uZmssIGNvbE5hbWUsIGZrSW5mby5may5nZXRUYWJsZSgpKSk7CisKKyAgICAgICAgICAgICAgICBma0luZm8uZmsuam9pbkNvbnN0YW50KGNvbCwgdmFscy5uZXh0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwa3MgPSBma0luZm8uY29uc3RDb2xzUEsuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdmFscyA9IGZrSW5mby5jb25zdHNQSy5pdGVyYXRvcigpOyB2YWxzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBwa0NvbE5hbWUgPSAoU3RyaW5nKSBwa3MubmV4dCgpOworICAgICAgICAgICAgICAgIHBrQ29sID0gdG9UYWJsZS5nZXRDb2x1bW4ocGtDb2xOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocGtDb2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJmay1ub3BrY29sIiwgbmV3IE9iamVjdFtdCisgICAgICAgICAgICAgICAgICAgICAgICB7IGZrSW5mby5maywgcGtDb2xOYW1lLCB0b1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZrSW5mby5may5nZXRUYWJsZSgpIH0pKTsKKworICAgICAgICAgICAgICAgIGZrSW5mby5may5qb2luQ29uc3RhbnQodmFscy5uZXh0KCksIHBrQ29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgdGhlIGNvbGxlY3RlZCB1bmlxdWUgY29uc3RyYWludCBpbmZvcm1hdGlvbiBpbnRvIGFjdHVhbAorICAgICAqIGNvbnN0cmFpbnRzIG9uIHRoZSBzY2hlbWEgdGFibGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlVW5pcXVlcygpIHsKKyAgICAgICAgVW5pcXVlSW5mbyB1bnFJbmZvOworICAgICAgICBTdHJpbmcgY29sTmFtZTsKKyAgICAgICAgQ29sdW1uIGNvbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfdW5xSW5mb3MuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHVucUluZm8gPSAoVW5pcXVlSW5mbykgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgY29scyA9IHVucUluZm8uY29scy5pdGVyYXRvcigpOyBjb2xzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBjb2xOYW1lID0gKFN0cmluZykgY29scy5uZXh0KCk7CisgICAgICAgICAgICAgICAgY29sID0gdW5xSW5mby51bnEuZ2V0VGFibGUoKS5nZXRDb2x1bW4oY29sTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvd1VzZXJFeGNlcHRpb24oX2xvYy5nZXQoInVucS1yZXNvbHZlIiwgbmV3IE9iamVjdFtdCisgICAgICAgICAgICAgICAgICAgICAgICB7IHVucUluZm8udW5xLCBjb2xOYW1lLCB1bnFJbmZvLnVucS5nZXRUYWJsZSgpIH0pKTsKKyAgICAgICAgICAgICAgICB1bnFJbmZvLnVucS5hZGRDb2x1bW4oY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICAgICAgICBfc2NoZW1hID0gbnVsbDsKKyAgICAgICAgX3RhYmxlID0gbnVsbDsKKyAgICAgICAgX3BrID0gbnVsbDsKKyAgICAgICAgX2luZGV4ID0gbnVsbDsKKyAgICAgICAgX2ZrID0gbnVsbDsKKyAgICAgICAgX3VucSA9IG51bGw7CisgICAgICAgIGlmICghX2RlbGF5KQorICAgICAgICAgICAgY2xlYXJDb25zdHJhaW50SW5mbygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZWFkZXIgZ2V0RG9jVHlwZSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoWE1MU2NoZW1hUGFyc2VyLmNsYXNzCisgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic2NoZW1hcy1kb2N0eXBlLnJzcmMiKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChuYW1lLmNoYXJBdCgwKSkgeworICAgICAgICAgICAgY2FzZSdzJzoKKyAgICAgICAgICAgICAgICBpZiAoInNjaGVtYSIuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBzdGFydFNjaGVtYShhdHRycyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoInNlcXVlbmNlIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VxdWVuY2UoYXR0cnMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSd0JzoKKyAgICAgICAgICAgICAgICBzdGFydFRhYmxlKGF0dHJzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UnYyc6CisgICAgICAgICAgICAgICAgc3RhcnRDb2x1bW4oYXR0cnMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSdwJzoKKyAgICAgICAgICAgICAgICBzdGFydFByaW1hcnlLZXkoYXR0cnMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSdpJzoKKyAgICAgICAgICAgICAgICBzdGFydEluZGV4KGF0dHJzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UndSc6CisgICAgICAgICAgICAgICAgc3RhcnRVbmlxdWUoYXR0cnMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSdmJzoKKyAgICAgICAgICAgICAgICBzdGFydEZvcmVpZ25LZXkoYXR0cnMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSdvJzoKKyAgICAgICAgICAgICAgICBzdGFydE9uKGF0dHJzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2Unaic6CisgICAgICAgICAgICAgICAgc3RhcnRKb2luKGF0dHJzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgeworICAgICAgICBzd2l0Y2ggKG5hbWUuY2hhckF0KDApKSB7CisgICAgICAgICAgICBjYXNlJ3MnOgorICAgICAgICAgICAgICAgIGlmICgic2NoZW1hIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGVuZFNjaGVtYSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSd0JzoKKyAgICAgICAgICAgICAgICBlbmRUYWJsZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSdwJzoKKyAgICAgICAgICAgICAgICBlbmRQcmltYXJ5S2V5KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlJ2knOgorICAgICAgICAgICAgICAgIGVuZEluZGV4KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlJ3UnOgorICAgICAgICAgICAgICAgIGVuZFVuaXF1ZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSdmJzoKKyAgICAgICAgICAgICAgICBlbmRGb3JlaWduS2V5KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRTY2hlbWEoQXR0cmlidXRlcyBhdHRycykgeworICAgICAgICAvLyBjcmVhdGVzIGdyb3VwIGlmIG5vdCBzZXQKKyAgICAgICAgU2NoZW1hR3JvdXAgZ3JvdXAgPSBnZXRTY2hlbWFHcm91cCgpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgX3NjaGVtYSA9IGdyb3VwLmdldFNjaGVtYShuYW1lKTsKKyAgICAgICAgaWYgKF9zY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zY2hlbWEgPSBncm91cC5hZGRTY2hlbWEobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZFNjaGVtYSgpIHsKKyAgICAgICAgX3NjaGVtYSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2VxdWVuY2UoQXR0cmlidXRlcyBhdHRycykgeworICAgICAgICBTZXF1ZW5jZSBzZXEgPSBfc2NoZW1hLmFkZFNlcXVlbmNlKGF0dHJzLmdldFZhbHVlKCJuYW1lIikpOworICAgICAgICBzZXEuc2V0U291cmNlKGdldFNvdXJjZUZpbGUoKSwgc2VxLlNSQ19YTUwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJpbml0aWFsLXZhbHVlIik7CisgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VxLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnBhcnNlSW50KHZhbCkpOworICAgICAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImluY3JlbWVudCIpOworICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcS5zZXRJbmNyZW1lbnQoSW50ZWdlci5wYXJzZUludCh2YWwpKTsKKyAgICAgICAgICAgIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJhbGxvY2F0ZSIpOworICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcS5zZXRBbGxvY2F0ZShJbnRlZ2VyLnBhcnNlSW50KHZhbCkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICB0aHJvd1VzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1zZXEtbnVtIiwgc2VxLmdldEZ1bGxOYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFRhYmxlKEF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgX3RhYmxlID0gX3NjaGVtYS5hZGRUYWJsZShhdHRycy5nZXRWYWx1ZSgibmFtZSIpKTsKKyAgICAgICAgX3RhYmxlLnNldFNvdXJjZShnZXRTb3VyY2VGaWxlKCksIF90YWJsZS5TUkNfWE1MKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kVGFibGUoKSB7CisgICAgICAgIF90YWJsZSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29sdW1uKEF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IF90YWJsZS5hZGRDb2x1bW4oYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKSk7CisgICAgICAgIGNvbC5zZXRUeXBlKF9kaWN0LmdldFByZWZlcnJlZFR5cGUoU2NoZW1hcy5nZXRKREJDVHlwZQorICAgICAgICAgICAgKGF0dHJzLmdldFZhbHVlKCJ0eXBlIikpKSk7CisgICAgICAgIGNvbC5zZXRUeXBlTmFtZShhdHRycy5nZXRWYWx1ZSgidHlwZS1uYW1lIikpOworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInNpemUiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgY29sLnNldFNpemUoSW50ZWdlci5wYXJzZUludCh2YWwpKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImRlY2ltYWwtZGlnaXRzIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbC5zZXREZWNpbWFsRGlnaXRzKEludGVnZXIucGFyc2VJbnQodmFsKSk7CisgICAgICAgIGNvbC5zZXROb3ROdWxsKCJ0cnVlIi5lcXVhbHMoYXR0cnMuZ2V0VmFsdWUoIm5vdC1udWxsIikpKTsKKyAgICAgICAgY29sLnNldEF1dG9Bc3NpZ25lZCgidHJ1ZSIuZXF1YWxzKGF0dHJzLmdldFZhbHVlKCJhdXRvLWFzc2lnbiIpKQorICAgICAgICAgICAgfHwgInRydWUiLmVxdWFscyhhdHRycy5nZXRWYWx1ZSgiYXV0by1pbmNyZW1lbnQiKSkpOyAvLyBvbGQgYXR0cgorICAgICAgICBjb2wuc2V0RGVmYXVsdFN0cmluZyhhdHRycy5nZXRWYWx1ZSgiZGVmYXVsdCIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRQcmltYXJ5S2V5KEF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgX3BrID0gbmV3IFByaW1hcnlLZXlJbmZvKCk7CisgICAgICAgIF9way5wayA9IF90YWJsZS5hZGRQcmltYXJ5S2V5KGF0dHJzLmdldFZhbHVlKCJuYW1lIikpOworICAgICAgICBfcGsucGsuc2V0TG9naWNhbCgidHJ1ZSIuZXF1YWxzKGF0dHJzLmdldFZhbHVlKCJsb2dpY2FsIikpKTsKKworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImNvbHVtbiIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBfcGsuY29scy5hZGQodmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kUHJpbWFyeUtleSgpIHsKKyAgICAgICAgX3BrSW5mb3MuYWRkKF9wayk7CisgICAgICAgIF9wayA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0SW5kZXgoQXR0cmlidXRlcyBhdHRycykgeworICAgICAgICBfaW5kZXggPSBuZXcgSW5kZXhJbmZvKCk7CisgICAgICAgIF9pbmRleC5pbmRleCA9IF90YWJsZS5hZGRJbmRleChhdHRycy5nZXRWYWx1ZSgibmFtZSIpKTsKKyAgICAgICAgX2luZGV4LmluZGV4LnNldFVuaXF1ZSgidHJ1ZSIuZXF1YWxzKGF0dHJzLmdldFZhbHVlKCJ1bmlxdWUiKSkpOworCisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgiY29sdW1uIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIF9pbmRleC5jb2xzLmFkZCh2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRJbmRleCgpIHsKKyAgICAgICAgX2luZGV4SW5mb3MuYWRkKF9pbmRleCk7CisgICAgICAgIF9pbmRleCA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VW5pcXVlKEF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgX3VucSA9IG5ldyBVbmlxdWVJbmZvKCk7CisgICAgICAgIF91bnEudW5xID0gX3RhYmxlLmFkZFVuaXF1ZShhdHRycy5nZXRWYWx1ZSgibmFtZSIpKTsKKyAgICAgICAgX3VucS51bnEuc2V0RGVmZXJyZWQoInRydWUiLmVxdWFscyhhdHRycy5nZXRWYWx1ZSgiZGVmZXJyZWQiKSkpOworCisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgiY29sdW1uIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIF91bnEuY29scy5hZGQodmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kVW5pcXVlKCkgeworICAgICAgICBfdW5xSW5mb3MuYWRkKF91bnEpOworICAgICAgICBfdW5xID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRGb3JlaWduS2V5KEF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgX2ZrID0gbmV3IEZvcmVpZ25LZXlJbmZvKCk7CisgICAgICAgIF9may5mayA9IF90YWJsZS5hZGRGb3JlaWduS2V5KGF0dHJzLmdldFZhbHVlKCJuYW1lIikpOworCisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKGF0dHJzLmdldFZhbHVlKCJkZWZlcnJlZCIpKSkKKyAgICAgICAgICAgIF9may5may5zZXREZWZlcnJlZCh0cnVlKTsKKworICAgICAgICAvLyBzZXQgdXBkYXRlIGFjdGlvbiBiZWZvcmUgZGVsZXRlIGFjdGlvbiBpbiBjYXNlIHVzZXIgaW5jb3JyZWN0bHkKKyAgICAgICAgLy8gc2V0cyB1cGRhdGUtYWN0aW9uIHRvICJub25lIiB3aGVuIHRoZXJlIGlzIGEgZGVsZXRlLWFjdGlvbjsgb3RoZXJ3aXNlCisgICAgICAgIC8vIHNldHRpbmcgdGhlIHVwZGF0ZS1hY3Rpb24gdG8gIm5vbmUiIHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHNldCB0aGUKKyAgICAgICAgLy8gZGVsZXRlLWFjdGlvbiB0byAibm9uZSIsIHNpbmNlIEZLcyBjYW5ub3QgaGF2ZSBvbmUgYWN0aW8gYmUgbm9uZSBhbmQKKyAgICAgICAgLy8gdGhlIG90aGVyIGJlIG5vbi1ub25lCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBhdHRycy5nZXRWYWx1ZSgidXBkYXRlLWFjdGlvbiIpOworICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICBfZmsuZmsuc2V0VXBkYXRlQWN0aW9uKEZvcmVpZ25LZXkuZ2V0QWN0aW9uKGFjdGlvbikpOworICAgICAgICBhY3Rpb24gPSBhdHRycy5nZXRWYWx1ZSgiZGVsZXRlLWFjdGlvbiIpOworICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICBfZmsuZmsuc2V0RGVsZXRlQWN0aW9uKEZvcmVpZ25LZXkuZ2V0QWN0aW9uKGFjdGlvbikpOworCisgICAgICAgIF9may50b1RhYmxlID0gYXR0cnMuZ2V0VmFsdWUoInRvLXRhYmxlIik7CisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgiY29sdW1uIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIF9may5jb2xzLmFkZCh2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRGb3JlaWduS2V5KCkgeworICAgICAgICBfZmtJbmZvcy5hZGQoX2ZrKTsKKyAgICAgICAgX2ZrID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRPbihBdHRyaWJ1dGVzIGF0dHJzKSB7CisgICAgICAgIFN0cmluZyBjb2wgPSBhdHRycy5nZXRWYWx1ZSgiY29sdW1uIik7CisgICAgICAgIGlmIChfcGsgIT0gbnVsbCkKKyAgICAgICAgICAgIF9way5jb2xzLmFkZChjb2wpOworICAgICAgICBlbHNlIGlmIChfaW5kZXggIT0gbnVsbCkKKyAgICAgICAgICAgIF9pbmRleC5jb2xzLmFkZChjb2wpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfdW5xLmNvbHMuYWRkKGNvbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Sm9pbihBdHRyaWJ1dGVzIGF0dHJzKSB7CisgICAgICAgIFN0cmluZyBjb2wgPSBhdHRycy5nZXRWYWx1ZSgiY29sdW1uIik7CisgICAgICAgIFN0cmluZyB0b0NvbCA9IGF0dHJzLmdldFZhbHVlKCJ0by1jb2x1bW4iKTsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJ2YWx1ZSIpOworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIF9may5jb2xzLmFkZChjb2wpOworICAgICAgICAgICAgX2ZrLnBrcy5hZGQodG9Db2wpOworICAgICAgICB9IGVsc2UgaWYgKGNvbCA9PSBudWxsKSB7CisgICAgICAgICAgICBfZmsuY29uc3RzUEsuYWRkKGNvbnZlcnRDb25zdGFudCh2YWwpKTsKKyAgICAgICAgICAgIF9may5jb25zdENvbHNQSy5hZGQodG9Db2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX2ZrLmNvbnN0cy5hZGQoY29udmVydENvbnN0YW50KHZhbCkpOworICAgICAgICAgICAgX2ZrLmNvbnN0Q29scy5hZGQoY29sKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjb252ZXJ0Q29uc3RhbnQoU3RyaW5nIHZhbCkgeworICAgICAgICBpZiAoIm51bGwiLmVxdWFscyh2YWwpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh2YWwuc3RhcnRzV2l0aCgiJyIpKQorICAgICAgICAgICAgcmV0dXJuIHZhbC5zdWJzdHJpbmcoMSwgdmFsLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIGlmICh2YWwuaW5kZXhPZignLicpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHZhbCk7CisgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHZhbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRocm93VXNlckV4Y2VwdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihnZXRTb3VyY2VOYW1lKCkgKyAiOiAiICsgbXNnLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBob2xkIHByaW1hcnkga2V5IGluZm8gYmVmb3JlIGl0IGlzIHJlc29sdmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1hcnlLZXlJbmZvIHsKKworICAgICAgICBwdWJsaWMgUHJpbWFyeUtleSBwayA9IG51bGw7CisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGNvbHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaG9sZCBpbmRleCBpbmZvIGJlZm9yZSBpdCBpcyByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbmRleEluZm8geworCisgICAgICAgIHB1YmxpYyBJbmRleCBpbmRleCA9IG51bGw7CisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGNvbHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaG9sZCB1bmlxdWUgY29uc3RyYWludCBpbmZvIGJlZm9yZSBpdCBpcyByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVuaXF1ZUluZm8geworCisgICAgICAgIHB1YmxpYyBVbmlxdWUgdW5xID0gbnVsbDsKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gY29scyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBob2xkIGZvcmVpZ24ga2V5IGluZm8gYmVmb3JlIGl0IGlzIHJlc29sdmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvcmVpZ25LZXlJbmZvIHsKKworICAgICAgICBwdWJsaWMgRm9yZWlnbktleSBmayA9IG51bGw7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9UYWJsZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGNvbHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBwa3MgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBjb25zdHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBjb25zdENvbHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBjb25zdHNQSyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGNvbnN0Q29sc1BLID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9YTUxTY2hlbWFTZXJpYWxpemVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9YTUxTY2hlbWFTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkYzkxZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL1hNTFNjaGVtYVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuWE1MTWV0YURhdGFTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIFNlcmlhbGl6ZXMge0BsaW5rIFNjaGVtYX1zIHRvIFhNTCBtYXRjaGluZyB0aGUgZG9jdW1lbnQKKyAqIHR5cGUgZGVmaW5pdGlvbiBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgWE1MU2NoZW1hUGFyc2VyfS4gVGhlIHNlcmlhbGl6ZXIKKyAqIGFjdHVhbGx5IHdvcmtzIGF0IHRoZSBmaW5lLWdyYWluZWQgdGFibGUgbGV2ZWwgdG8gYWxsb3cgeW91IHRvIHNwbGl0CisgKiBzY2hlbWFzIGFtb25nIG11bHRpcGxlIGZpbGVzLgorICogIFNlcmlhbGl6ZXJzIGFyZSBub3QgdGhyZWFkIHNhZmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFhNTFNjaGVtYVNlcmlhbGl6ZXIKKyAgICBleHRlbmRzIFhNTE1ldGFEYXRhU2VyaWFsaXplcgorICAgIGltcGxlbWVudHMgU2NoZW1hU2VyaWFsaXplciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChYTUxTY2hlbWFTZXJpYWxpemVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBfdGFibGVzID0gbmV3IFRyZWVTZXQoKTsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gX3NlcXMgPSBuZXcgVHJlZVNldCgpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBYTUxTY2hlbWFTZXJpYWxpemVyKEpEQkNDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgc2V0TG9nKGNvbmYuZ2V0TG9nKEpEQkNDb25maWd1cmF0aW9uLkxPR19TQ0hFTUEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFibGVbXSBnZXRUYWJsZXMoKSB7CisgICAgICAgIHJldHVybiAoVGFibGVbXSkgX3RhYmxlcy50b0FycmF5KG5ldyBUYWJsZVtfdGFibGVzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRhYmxlKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgX3RhYmxlcy5hZGQodGFibGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVRhYmxlKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBfdGFibGVzLnJlbW92ZSh0YWJsZSk7CisgICAgfQorCisgICAgcHVibGljIFNlcXVlbmNlW10gZ2V0U2VxdWVuY2VzKCkgeworICAgICAgICByZXR1cm4gKFNlcXVlbmNlW10pIF9zZXFzLnRvQXJyYXkobmV3IFNlcXVlbmNlW19zZXFzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFNlcXVlbmNlKFNlcXVlbmNlIHNlcSkgeworICAgICAgICBpZiAoc2VxICE9IG51bGwpCisgICAgICAgICAgICBfc2Vxcy5hZGQoc2VxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVTZXF1ZW5jZShTZXF1ZW5jZSBzZXEpIHsKKyAgICAgICAgcmV0dXJuIF9zZXFzLnJlbW92ZShzZXEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFsbChTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgVGFibGVbXSB0YWJsZXMgPSBzY2hlbWEuZ2V0VGFibGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYWRkVGFibGUodGFibGVzW2ldKTsKKyAgICAgICAgU2VxdWVuY2VbXSBzZXFzID0gc2NoZW1hLmdldFNlcXVlbmNlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBhZGRTZXF1ZW5jZShzZXFzW2ldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoU2NoZW1hR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFNjaGVtYVtdIHNjaGVtYXMgPSBncm91cC5nZXRTY2hlbWFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGFkZEFsbChzY2hlbWFzW2ldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoU2NoZW1hIHNjaGVtYSkgeworICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CisgICAgICAgIFRhYmxlW10gdGFibGVzID0gc2NoZW1hLmdldFRhYmxlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlbW92ZWQgfD0gcmVtb3ZlVGFibGUodGFibGVzW2ldKTsKKyAgICAgICAgU2VxdWVuY2VbXSBzZXFzID0gc2NoZW1hLmdldFNlcXVlbmNlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVkIHw9IHJlbW92ZVNlcXVlbmNlKHNlcXNbaV0pOworICAgICAgICByZXR1cm4gcmVtb3ZlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoU2NoZW1hR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CisgICAgICAgIFNjaGVtYVtdIHNjaGVtYXMgPSBncm91cC5nZXRTY2hlbWFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlbW92ZWQgfD0gcmVtb3ZlQWxsKHNjaGVtYXNbaV0pOworICAgICAgICByZXR1cm4gcmVtb3ZlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX3RhYmxlcy5jbGVhcigpOworICAgICAgICBfc2Vxcy5jbGVhcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE9iamVjdHMoKSB7CisgICAgICAgIGlmIChfc2Vxcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gX3RhYmxlczsKKyAgICAgICAgaWYgKF90YWJsZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIF9zZXFzOworICAgICAgICBMaXN0IGFsbCA9IG5ldyBBcnJheUxpc3QoX3NlcXMuc2l6ZSgpICsgX3RhYmxlcy5zaXplKCkpOworICAgICAgICBhbGwuYWRkQWxsKF9zZXFzKTsKKyAgICAgICAgYWxsLmFkZEFsbChfdGFibGVzKTsKKyAgICAgICAgcmV0dXJuIGFsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoQ29sbGVjdGlvbiBvYmpzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZ3JvdXAgdGhlIG9iamVjdHMgYnkgc2NoZW1hCisgICAgICAgIE1hcCBzY2hlbWFzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWU7CisgICAgICAgIENvbGxlY3Rpb24gc2NoZW1hT2JqczsKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvYmpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBvYmogPSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRhYmxlKQorICAgICAgICAgICAgICAgIHNjaGVtYU5hbWUgPSAoKFRhYmxlKSBvYmopLmdldFNjaGVtYU5hbWUoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzY2hlbWFOYW1lID0gKChTZXF1ZW5jZSkgb2JqKS5nZXRTY2hlbWFOYW1lKCk7CisgICAgICAgICAgICBzY2hlbWFPYmpzID0gKENvbGxlY3Rpb24pIHNjaGVtYXMuZ2V0KHNjaGVtYU5hbWUpOworICAgICAgICAgICAgaWYgKHNjaGVtYU9ianMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNjaGVtYU9ianMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgICAgIHNjaGVtYXMucHV0KHNjaGVtYU5hbWUsIHNjaGVtYU9ianMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NoZW1hT2Jqcy5hZGQob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0RWxlbWVudCgic2NoZW1hcyIpOworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gc2NoZW1hcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBzZXJpYWxpemVTY2hlbWEoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIChDb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGVuZEVsZW1lbnQoInNjaGVtYXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBvYmplY3RzIHRvZ2V0aGVyIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVTY2hlbWEoU3RyaW5nIG5hbWUsIENvbGxlY3Rpb24gb2JqcykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvYmpzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoZ2V0TG9nKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGdldExvZygpLnRyYWNlKF9sb2MuZ2V0KCJzZXItc2NoZW1hIiwgbmFtZSkpOworCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKKyAgICAgICAgc3RhcnRFbGVtZW50KCJzY2hlbWEiKTsKKworICAgICAgICAvLyB0YWJsZXMgYW5kIHNlcXMKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvYmpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBvYmogPSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRhYmxlKQorICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVRhYmxlKChUYWJsZSkgb2JqKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVTZXF1ZW5jZSgoU2VxdWVuY2UpIG9iaik7CisgICAgICAgIH0KKworICAgICAgICBlbmRFbGVtZW50KCJzY2hlbWEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgdGhlIGdpdmVuIHNlcXVlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVTZXF1ZW5jZShTZXF1ZW5jZSBzZXEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBzZXEuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKHNlcS5nZXRJbml0aWFsVmFsdWUoKSAhPSAxKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJpbml0aWFsLXZhbHVlIiwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzZXEuZ2V0SW5pdGlhbFZhbHVlKCkpKTsKKyAgICAgICAgaWYgKHNlcS5nZXRJbmNyZW1lbnQoKSA+IDEpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImluY3JlbWVudCIsIFN0cmluZy52YWx1ZU9mKHNlcS5nZXRJbmNyZW1lbnQoKSkpOworICAgICAgICBpZiAoc2VxLmdldEFsbG9jYXRlKCkgPiAxKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJhbGxvY2F0ZSIsIFN0cmluZy52YWx1ZU9mKHNlcS5nZXRBbGxvY2F0ZSgpKSk7CisgICAgICAgIHN0YXJ0RWxlbWVudCgic2VxdWVuY2UiKTsKKyAgICAgICAgZW5kRWxlbWVudCgic2VxdWVuY2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplVGFibGUoVGFibGUgdGFibGUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCB0YWJsZS5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoInRhYmxlIik7CisKKyAgICAgICAgLy8gcHJpbWFyeSBrZXkKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IHRhYmxlLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgaWYgKHBrICE9IG51bGwpCisgICAgICAgICAgICBzZXJpYWxpemVQcmltYXJ5S2V5KHBrKTsKKworICAgICAgICAvLyBjb2x1bW5zCisgICAgICAgIENvbHVtbltdIGNvbHMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNlcmlhbGl6ZUNvbHVtbihjb2xzW2ldKTsKKworICAgICAgICAvLyBmb3JlaWduIGtleXMKKyAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IHRhYmxlLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmtzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc2VyaWFsaXplRm9yZWlnbktleShma3NbaV0pOworCisgICAgICAgIC8vIGluZGV4ZXMKKyAgICAgICAgSW5kZXhbXSBpZHhzID0gdGFibGUuZ2V0SW5kZXhlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkeHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBzZXJpYWxpemVJbmRleChpZHhzW2ldKTsKKworICAgICAgICAvLyB1bmlxdWUgY29uc3RyYWludHMKKyAgICAgICAgVW5pcXVlW10gdW5xcyA9IHRhYmxlLmdldFVuaXF1ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bnFzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc2VyaWFsaXplVW5pcXVlKHVucXNbaV0pOworCisgICAgICAgIGVuZEVsZW1lbnQoInRhYmxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVDb2x1bW4oQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIGNvbC5nZXROYW1lKCkpOworICAgICAgICBhZGRBdHRyaWJ1dGUoInR5cGUiLCBTY2hlbWFzLmdldEpEQkNOYW1lKGNvbC5nZXRUeXBlKCkpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGNvbC5nZXRUeXBlTmFtZSgpKQorICAgICAgICAgICAgJiYgIWNvbC5nZXRUeXBlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UKKyAgICAgICAgICAgIChTY2hlbWFzLmdldEpEQkNOYW1lKGNvbC5nZXRUeXBlKCkpKSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgidHlwZS1uYW1lIiwgY29sLmdldFR5cGVOYW1lKCkpOworICAgICAgICBpZiAoY29sLmlzTm90TnVsbCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJub3QtbnVsbCIsICJ0cnVlIik7CisgICAgICAgIGlmIChjb2wuaXNBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiYXV0by1hc3NpZ24iLCAidHJ1ZSIpOworICAgICAgICBpZiAoY29sLmdldERlZmF1bHRTdHJpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJkZWZhdWx0IiwgY29sLmdldERlZmF1bHRTdHJpbmcoKSk7CisgICAgICAgIGlmIChjb2wuZ2V0U2l6ZSgpICE9IDApCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInNpemUiLCBTdHJpbmcudmFsdWVPZihjb2wuZ2V0U2l6ZSgpKSk7CisgICAgICAgIGlmIChjb2wuZ2V0RGVjaW1hbERpZ2l0cygpICE9IDApCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImRlY2ltYWwtZGlnaXRzIiwgU3RyaW5nLnZhbHVlT2YKKyAgICAgICAgICAgICAgICAoY29sLmdldERlY2ltYWxEaWdpdHMoKSkpOworICAgICAgICBzdGFydEVsZW1lbnQoImNvbHVtbiIpOworICAgICAgICBlbmRFbGVtZW50KCJjb2x1bW4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBwcmltYXJ5IGtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplUHJpbWFyeUtleShQcmltYXJ5S2V5IHBrKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBrLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJuYW1lIiwgcGsuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKHBrLmlzTG9naWNhbCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJsb2dpY2FsIiwgInRydWUiKTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gcGsuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uIiwgY29sc1swXS5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoInBrIik7CisKKyAgICAgICAgLy8gY29sdW1ucworICAgICAgICBpZiAoY29scy5sZW5ndGggPiAxKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHNlcmlhbGl6ZU9uKGNvbHNbaV0pOworCisgICAgICAgIGVuZEVsZW1lbnQoInBrIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUluZGV4KEluZGV4IGlkeCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIGlkeC5nZXROYW1lKCkpOworICAgICAgICBpZiAoaWR4LmlzVW5pcXVlKCkpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInVuaXF1ZSIsICJ0cnVlIik7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBpZHguZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uIiwgY29sc1swXS5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoImluZGV4Iik7CisKKyAgICAgICAgLy8gY29sdW1ucworICAgICAgICBpZiAoY29scy5sZW5ndGggPiAxKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHNlcmlhbGl6ZU9uKGNvbHNbaV0pOworCisgICAgICAgIGVuZEVsZW1lbnQoImluZGV4Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplVW5pcXVlKFVuaXF1ZSB1bnEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAodW5xLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJuYW1lIiwgdW5xLmdldE5hbWUoKSk7CisgICAgICAgIGlmICh1bnEuaXNEZWZlcnJlZCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJkZWZlcnJlZCIsICJ0cnVlIik7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSB1bnEuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uIiwgY29sc1swXS5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoInVuaXF1ZSIpOworCisgICAgICAgIC8vIGNvbHVtbnMKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoID4gMSkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVPbihjb2xzW2ldKTsKKworICAgICAgICBlbmRFbGVtZW50KCJ1bmlxdWUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBmb3JlaWduIGtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplRm9yZWlnbktleShGb3JlaWduS2V5IGZrKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZrLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJuYW1lIiwgZmsuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoZmsuaXNEZWZlcnJlZCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJkZWZlcnJlZCIsICJ0cnVlIik7CisKKyAgICAgICAgaWYgKGZrLmdldERlbGV0ZUFjdGlvbigpICE9IEZvcmVpZ25LZXkuQUNUSU9OX05PTkUpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImRlbGV0ZS1hY3Rpb24iLCBGb3JlaWduS2V5LmdldEFjdGlvbk5hbWUKKyAgICAgICAgICAgICAgICAoZmsuZ2V0RGVsZXRlQWN0aW9uKCkpKTsKKyAgICAgICAgaWYgKGZrLmdldFVwZGF0ZUFjdGlvbigpICE9IEZvcmVpZ25LZXkuQUNUSU9OX05PTkUKKyAgICAgICAgICAgICYmIGZrLmdldFVwZGF0ZUFjdGlvbigpICE9IEZvcmVpZ25LZXkuQUNUSU9OX1JFU1RSSUNUKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJ1cGRhdGUtYWN0aW9uIiwgRm9yZWlnbktleS5nZXRBY3Rpb25OYW1lCisgICAgICAgICAgICAgICAgKGZrLmdldFVwZGF0ZUFjdGlvbigpKSk7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uW10gcGtzID0gZmsuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uW10gY29uc3RzID0gZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgIENvbHVtbltdIGNvbnN0c1BLID0gZmsuZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBhZGRBdHRyaWJ1dGUoInRvLXRhYmxlIiwgZmsuZ2V0UHJpbWFyeUtleVRhYmxlKCkuZ2V0RnVsbE5hbWUoKSk7CisgICAgICAgIGlmIChjb2xzLmxlbmd0aCA9PSAxICYmIGNvbnN0cy5sZW5ndGggPT0gMCAmJiBjb25zdHNQSy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uIiwgY29sc1swXS5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoImZrIik7CisKKyAgICAgICAgLy8gY29sdW1ucworICAgICAgICBpZiAoY29scy5sZW5ndGggPiAxIHx8IGNvbnN0cy5sZW5ndGggPiAwIHx8IGNvbnN0c1BLLmxlbmd0aCA+IDApCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgc2VyaWFsaXplSm9pbihjb2xzW2ldLCBwa3NbaV0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNlcmlhbGl6ZUpvaW4oY29uc3RzW2ldLCBmay5nZXRDb25zdGFudChjb25zdHNbaV0pKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHNQSy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNlcmlhbGl6ZUpvaW4oZmsuZ2V0UHJpbWFyeUtleUNvbnN0YW50KGNvbnN0c1BLW2ldKSwgY29uc3RzUEtbaV0pOworCisgICAgICAgIGVuZEVsZW1lbnQoImZrIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gY29sdW1uIHRvIGFuICdvbicgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplT24oQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uIiwgY29sLmdldE5hbWUoKSk7CisgICAgICAgIHN0YXJ0RWxlbWVudCgib24iKTsKKyAgICAgICAgZW5kRWxlbWVudCgib24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBjb2x1bW5zIHRvIGEgJ2pvaW4nIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUpvaW4oQ29sdW1uIGNvbCwgQ29sdW1uIHBrKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJjb2x1bW4iLCBjb2wuZ2V0TmFtZSgpKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJ0by1jb2x1bW4iLCBway5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoImpvaW4iKTsKKyAgICAgICAgZW5kRWxlbWVudCgiam9pbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIHZhbHVlcyB0byBhICdqb2luJyBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVKb2luKE9iamVjdCB2YWwsIENvbHVtbiBwaykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgidmFsdWUiLCBzdHJpbmdpZnlDb25zdGFudCh2YWwpKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJ0by1jb2x1bW4iLCBway5nZXROYW1lKCkpOworICAgICAgICBzdGFydEVsZW1lbnQoImpvaW4iKTsKKyAgICAgICAgZW5kRWxlbWVudCgiam9pbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIHZhbHVlcyB0byBhICdqb2luJyBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVKb2luKENvbHVtbiBjb2wsIE9iamVjdCB2YWwpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBhZGRBdHRyaWJ1dGUoImNvbHVtbiIsIGNvbC5nZXROYW1lKCkpOworICAgICAgICBhZGRBdHRyaWJ1dGUoInZhbHVlIiwgc3RyaW5naWZ5Q29uc3RhbnQodmFsKSk7CisgICAgICAgIHN0YXJ0RWxlbWVudCgiam9pbiIpOworICAgICAgICBlbmRFbGVtZW50KCJqb2luIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5naWZ5IHRoZSBnaXZlbiBjb25zdGFudCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaW5naWZ5Q29uc3RhbnQoT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuICInIiArIHZhbCArICInIjsKKyAgICAgICAgcmV0dXJuIHZhbC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2RhM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBLUpEQkMgU2NoZW1hIE1hbmFnZW1lbnQ8L3N0cm9uZz48L3A+CisKKzxwPgorICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIG1hbmFnaW5nIHRoZSBzY2hlbWEgb2YKKyAgICBwZXJzaXN0ZW50IG9iamVjdHMgc3RvcmVkIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4KKzwvcD4KKworPHA+CisgICAgU2NoZW1hIGNvbXBvbmVudHMgdGhlbXNlbHZlcyBhcmUgbGl0dGxlIG1vcmUgdGhhbiBzdGFuZGFyZCBKYXZhIGJlYW5zLgorICAgIEhlbHBlciBjbGFzc2VzIGFyZSByZXNwb25zaWJsZSBmb3IgYWRkZWQgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIFhNTAorICAgIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLCBldGMuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9BYnN0cmFjdERCMkRpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0Fic3RyYWN0REIyRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjAxN2MKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9BYnN0cmFjdERCMkRpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKKworLyoqCisgKiBCYXNlIGRpY3Rpb25hcnkgZm9yIHRoZSBJQk0gREIyIGZhbWlseSBvZiBkYXRhYmFzZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERCMkRpY3Rpb25hcnkKKyAgICBleHRlbmRzIERCRGljdGlvbmFyeSB7CisKKyAgICBwdWJsaWMgQWJzdHJhY3REQjJEaWN0aW9uYXJ5KCkgeworICAgICAgICBudW1lcmljVHlwZU5hbWUgPSAiRE9VQkxFIjsKKyAgICAgICAgYml0VHlwZU5hbWUgPSAiU01BTExJTlQiOworICAgICAgICBzbWFsbGludFR5cGVOYW1lID0gIlNNQUxMSU5UIjsKKyAgICAgICAgdGlueWludFR5cGVOYW1lID0gIlNNQUxMSU5UIjsKKyAgICAgICAgbG9uZ1ZhcmJpbmFyeVR5cGVOYW1lID0gIkJMT0IiOworICAgICAgICB2YXJiaW5hcnlUeXBlTmFtZSA9ICJCTE9CIjsKKworICAgICAgICAvLyBEQjItYmFzZWQgZGF0YWJhc2VzIGhhdmUgcmVzdHJpY3Rpb25zIG9uIGhhdmluZyB1bmNhc3QgcGFyYW1ldGVycworICAgICAgICAvLyBpbiBzdHJpbmcgZnVuY3Rpb25zCisgICAgICAgIHRvVXBwZXJDYXNlRnVuY3Rpb24gPSAiVVBQRVIoQ0FTVCh7MH0gQVMgVkFSQ0hBUigxMDAwKSkpIjsKKyAgICAgICAgdG9Mb3dlckNhc2VGdW5jdGlvbiA9ICJMT1dFUihDQVNUKHswfSBBUyBWQVJDSEFSKDEwMDApKSkiOworICAgICAgICBzdHJpbmdMZW5ndGhGdW5jdGlvbiA9ICJMRU5HVEgoQ0FTVCh7MH0gQVMgVkFSQ0hBUigxMDAwKSkpIjsKKyAgICAgICAgY29uY2F0ZW5hdGVGdW5jdGlvbiA9ICIoQ0FTVCh7MH0gQVMgVkFSQ0hBUigxMDAwKSkpfHwiCisgICAgICAgICAgICArICIoQ0FTVCh7MX0gQVMgVkFSQ0hBUigxMDAwKSkpIjsKKworICAgICAgICB0cmltTGVhZGluZ0Z1bmN0aW9uID0gIkxUUklNKHswfSkiOworICAgICAgICB0cmltVHJhaWxpbmdGdW5jdGlvbiA9ICJSVFJJTSh7MH0pIjsKKyAgICAgICAgdHJpbUJvdGhGdW5jdGlvbiA9ICJMVFJJTShSVFJJTSh7MH0pKSI7CisKKyAgICAgICAgLy8gaW4gREIyLCAiZm9yIHVwZGF0ZSIgc2VlbXMgdG8gYmUgaWdub3JlZCB3aXRoIGlzb2xhdGlvbgorICAgICAgICAvLyBsZXZlbHMgYmVsb3cgUkVQRUFUQUJMRV9SRUFELi4uIGZvcmNlIGlzb2xhdGlvbiB0byBiZWhhdmUgbGlrZSBSUgorICAgICAgICBmb3JVcGRhdGVDbGF1c2UgPSAiRk9SIFVQREFURSBXSVRIIFJSIjsKKworICAgICAgICBzdXBwb3J0c0xvY2tpbmdXaXRoRGlzdGluY3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNMb2NraW5nV2l0aE11bHRpcGxlVGFibGVzID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhPcmRlckNsYXVzZSA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c0xvY2tpbmdXaXRoT3V0ZXJKb2luID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW4gPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNMb2NraW5nV2l0aFNlbGVjdFJhbmdlID0gdHJ1ZTsKKworICAgICAgICByZXF1aXJlc0F1dG9Db21taXRGb3JNZXRhRGF0YSA9IHRydWU7CisgICAgICAgIHJlcXVpcmVzQWxpYXNGb3JTdWJzZWxlY3QgPSB0cnVlOworCisgICAgICAgIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IHRydWU7CisgICAgICAgIGF1dG9Bc3NpZ25DbGF1c2UgPSAiR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkiOworICAgICAgICBsYXN0R2VuZXJhdGVkS2V5UXVlcnkgPSAiVkFMVUVTKElERU5USVRZX1ZBTF9MT0NBTCgpKSI7CisKKyAgICAgICAgLy8gREIyIGRvZXNuJ3QgdW5kZXJzdGFuZCAiWCBDUk9TUyBKT0lOIFkiLCBidXQgaXQgZG9lcyB1bmRlcnN0YW5kCisgICAgICAgIC8vIHRoZSBlcXVpdmFsZW50ICJYIEpPSU4gWSBPTiAxID0gMSIKKyAgICAgICAgY3Jvc3NKb2luQ2xhdXNlID0gIkpPSU4iOworICAgICAgICByZXF1aXJlc0NvbmRpdGlvbkZvckNyb3NzSm9pbiA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5kZXhPZihTUUxCdWZmZXIgYnVmLCBGaWx0ZXJWYWx1ZSBzdHIsIEZpbHRlclZhbHVlIGZpbmQsCisgICAgICAgIEZpbHRlclZhbHVlIHN0YXJ0KSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIihMT0NBVEUoQ0FTVCgoIik7CisgICAgICAgIGZpbmQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSBBUyBWQVJDSEFSKDEwMDApKSwgQ0FTVCgoIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIpIEFTIFZBUkNIQVIoMTAwMCkpIik7CisgICAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIsIENBU1QoKCIpOworICAgICAgICAgICAgc3RhcnQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikgQVMgSU5URUdFUikgKyAxIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSAtIDEpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3Vic3RyaW5nKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgc3RhcnQsCisgICAgICAgIEZpbHRlclZhbHVlIGVuZCkgeworICAgICAgICBidWYuYXBwZW5kKCJTVUJTVFIoQ0FTVCgoIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIpIEFTIFZBUkNIQVIoMTAwMCkpLCBDQVNUKCgiKTsKKyAgICAgICAgc3RhcnQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSBBUyBJTlRFR0VSKSArIDEiKTsKKyAgICAgICAgaWYgKGVuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIsIENBU1QoKCIpOworICAgICAgICAgICAgZW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIEFTIElOVEVHRVIpIC0gQ0FTVCgoIik7CisgICAgICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSBBUyBJTlRFR0VSKSIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9BYnN0cmFjdFJlc3VsdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQWJzdHJhY3RSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFkYTczCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQWJzdHJhY3RSZXN1bHQuamF2YQpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc3FsLkFycmF5OworaW1wb3J0IGphdmEuc3FsLkJsb2I7CitpbXBvcnQgamF2YS5zcWwuQ2xvYjsKK2ltcG9ydCBqYXZhLnNxbC5SZWY7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWU7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBBIHtAbGluayBSZXN1bHR9IGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIGJlIHN1YmNsYXNzZWQgZWFzaWx5IGJ5CisgKiBpbXBsZW1lbnRhdGlvbnMuIEFsbCA8Y29kZT5nZXQmbHQ7dHlwZSZndDs8L2NvZGU+IGNhbGxzIGFyZSBkZWxlZ2F0ZWQgdG8KKyAqIHRoZSB7QGxpbmsgI2dldE9iamVjdEludGVybmFsKE9iamVjdCxpbnQsT2JqZWN0LEpvaW5zKX0gbWV0aG9kLCB3aGljaAorICogc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgYWxvbmcgd2l0aCB7QGxpbmsgI25leHRJbnRlcm5hbH0sCisgKiB7QGxpbmsgI2NvbnRhaW5zSW50ZXJuYWx9LCBhbmQge0BsaW5rIFJlc3VsdCNzaXplfS4KKyAqICBNb3N0IG9mIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3Mgd2lsbCBhY2NlcHQgcmV0dXJuIHZhbHVlcyBmcm9tCisgKiB7QGxpbmsgI2dldE9iamVjdEludGVybmFsKE9iamVjdCxpbnQsT2JqZWN0LEpvaW5zKX0gdGhhdCBhcmUgbm90IGV4YWN0bHkKKyAqIHRoZSByaWdodCB0eXBlLiBGb3IgZXhhbXBsZSwgYW55IG51bWVyaWMgdHlwZSBjYW4gYmUgcmV0dXJuZWQgYXMgYW55CisgKiB7QGxpbmsgTnVtYmVyfSB0eXBlLCBhbmQgZGF0ZXMsIGxvY2FsZXMsIGNoYXJhY3RlcnMsIGFuZCBib29sZWFucyBjYW4gYmUKKyAqIHJldHVybmVkIGFzIHN0cmluZ3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzZWUgUmVzdWx0U2V0UmVzdWx0CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc3VsdAorICAgIGltcGxlbWVudHMgUmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpvaW5zIEpPSU5TID0gbmV3IE5vT3BKb2lucygpOworCisgICAgcHJpdmF0ZSBNYXAgX2VhZ2VyID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzTWFwcGluZyBfYmFzZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2luZGV4ID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2dvdEVhZ2VyID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF93YXNOdWxsID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9sb2NraW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pZ25vcmVOZXh0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9sYXN0ID0gZmFsc2U7CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEVhZ2VyKEZpZWxkTWFwcGluZyBrZXkpIHsKKyAgICAgICAgTWFwIG1hcCA9IGdldEVhZ2VyTWFwKHRydWUpOworICAgICAgICByZXR1cm4gKG1hcCA9PSBudWxsKSA/IG51bGwgOiBtYXAuZ2V0KGtleSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0RWFnZXIoRmllbGRNYXBwaW5nIGtleSwgT2JqZWN0IHJlcykgeworICAgICAgICBNYXAgbWFwID0gZ2V0RWFnZXJNYXAoZmFsc2UpOworICAgICAgICBpZiAobWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBzZXRFYWdlck1hcChtYXApOworICAgICAgICB9CisgICAgICAgIG1hcC5wdXQoa2V5LCByZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJhdyBlYWdlciBpbmZvcm1hdGlvbi4gTWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50IHdoZXRoZXIgdGhlIGNsaWVudCBpcyBhY2Nlc3NpbmcgZWFnZXIgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIGdldEVhZ2VyTWFwKGJvb2xlYW4gY2xpZW50KSB7CisgICAgICAgIGlmIChjbGllbnQpCisgICAgICAgICAgICBfZ290RWFnZXIgPSB0cnVlOworICAgICAgICByZXR1cm4gX2VhZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJhdyBlYWdlciBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFYWdlck1hcChNYXAgZWFnZXIpIHsKKyAgICAgICAgX2VhZ2VyID0gZWFnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIGFsbCBlYWdlciByZXN1bHRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBjbG9zZUVhZ2VyTWFwKF9lYWdlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYWxsIHJlc3VsdHMgaW4gZWFnZXIgbWFwLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlRWFnZXJNYXAoTWFwIGVhZ2VyKSB7CisgICAgICAgIGlmIChlYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgcmVzOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBlYWdlci52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHJlcyA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSB0aGlzICYmIHJlcyBpbnN0YW5jZW9mIENsb3NlYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ2xvc2VhYmxlKSByZXMpLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2VzcygpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHJvdykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9nb3RFYWdlciA9IGZhbHNlOworICAgICAgICByZXR1cm4gYWJzb2x1dGVJbnRlcm5hbChyb3cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhYnNvbHV0ZUludGVybmFsKGludCByb3cpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9nb3RFYWdlciA9IGZhbHNlOworICAgICAgICBpZiAoX2lnbm9yZU5leHQpIHsKKyAgICAgICAgICAgIF9pZ25vcmVOZXh0ID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gX2xhc3Q7CisgICAgICAgIH0KKyAgICAgICAgX2xhc3QgPSBuZXh0SW50ZXJuYWwoKTsKKyAgICAgICAgcmV0dXJuIF9sYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkdmFuY2UgdGhpcyByb3cuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gbmV4dEludGVybmFsKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHB1c2hCYWNrKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9pZ25vcmVOZXh0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbm8tb3Agam9pbnMgb2JqZWN0IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIEpvaW5zIG5ld0pvaW5zKCkgeworICAgICAgICByZXR1cm4gSk9JTlM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb250YWluc0ludGVybmFsKG9iaiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gb2JqcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb250YWluc0FsbEludGVybmFsKG9ianMsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zSW50ZXJuYWwoY29sLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sdW1uW10gY29scywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29udGFpbnNBbGxJbnRlcm5hbChjb2xzLCBqb2lucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyByZXN1bHQgY29udGFpbnMgZGF0YSBmb3IgdGhlIGdpdmVuIGlkIG9yIGNvbHVtbi4KKyAgICAgKiBUaGUgaWQgb3IgY29sdW1uIGhhcyBub3QgYmVlZCBwYXNzZWQgdGhyb3VnaCB7QGxpbmsgI3RyYW5zbGF0ZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY29udGFpbnNJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgcmVzdWx0IGNvbnRhaW5zIGRhdGEgZm9yIGFsbCB0aGUgZ2l2ZW4gaWRzIG9yCisgICAgICogY29sdW1ucy4gVGhlIGlkcyBvciBjb2x1bW5zIGhhdmUgbm90IGJlZW4gcGFzc2VkIHRocm91Z2gKKyAgICAgKiB7QGxpbmsgI3RyYW5zbGF0ZX0uIERlbGVnYXRlcyB0byB7QGxpbmsgI2NvbnRhaW5zSW50ZXJuYWx9IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNBbGxJbnRlcm5hbChPYmplY3RbXSBvYmpzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmICghY29udGFpbnNJbnRlcm5hbChvYmpzW2ldLCBqb2lucykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNYXBwaW5nIGdldEJhc2VNYXBwaW5nKCkgeworICAgICAgICAvLyBpZiB3ZSd2ZSByZXR1cm5lZCBhbiBlYWdlciByZXN1bHQgdGhpcyBjYWxsIG1pZ2h0IGJlIGZvciB0aGF0IGVhZ2VyCisgICAgICAgIC8vIHJlc3VsdCBpbnN0ZWFkIG9mIG91ciBwcmltYXJ5IG1hcHBpbmcsIHNvIHJldHVybiBudWxsCisgICAgICAgIHJldHVybiAoX2dvdEVhZ2VyKSA/IG51bGwgOiBfYmFzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlTWFwcGluZyhDbGFzc01hcHBpbmcgYmFzZSkgeworICAgICAgICBfYmFzZSA9IGJhc2U7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleE9mKCkgeworICAgICAgICByZXR1cm4gX2luZGV4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4T2YoaW50IGlkeCkgeworICAgICAgICBfaW5kZXggPSBpZHg7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBsb2FkKENsYXNzTWFwcGluZyBtYXBwaW5nLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZChtYXBwaW5nLCBzdG9yZSwgZmV0Y2gsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChDbGFzc01hcHBpbmcgbWFwcGluZywgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoKEpEQkNTdG9yZU1hbmFnZXIpIHN0b3JlKS5sb2FkKG1hcHBpbmcsIGZldGNoLCBudWxsLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXkgZ2V0QXJyYXkoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBcnJheUludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXkgZ2V0QXJyYXkoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0QXJyYXlJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQXJyYXkgZ2V0QXJyYXlJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoQXJyYXkpIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuU1FMX0FSUkFZLCBudWxsLCBqb2lucykpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEFzY2lpU3RyZWFtSW50ZXJuYWwodHJhbnNsYXRlKG9iaiwgbnVsbCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBc2NpaVN0cmVhbUludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChJbnB1dFN0cmVhbSkgY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwKKyAgICAgICAgICAgIEphdmFTUUxUeXBlcy5BU0NJSV9TVFJFQU0sIG51bGwsIGpvaW5zKSk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJpZ0RlY2ltYWxJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCaWdEZWNpbWFsSW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbEludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosCisgICAgICAgICAgICBKYXZhVHlwZXMuQklHREVDSU1BTCwgbnVsbCwgam9pbnMpKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKQorICAgICAgICAgICAgcmV0dXJuIChCaWdEZWNpbWFsKSB2YWw7CisgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCh2YWwudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlcihPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJpZ0ludGVnZXJJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlcihDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCaWdJbnRlZ2VySW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosCisgICAgICAgICAgICBKYXZhVHlwZXMuQklHSU5URUdFUiwgbnVsbCwgam9pbnMpKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKQorICAgICAgICAgICAgcmV0dXJuIChCaWdJbnRlZ2VyKSB2YWw7CisgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcih2YWwudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJpbmFyeVN0cmVhbUludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QmluYXJ5U3RyZWFtKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJpbmFyeVN0cmVhbUludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW1JbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoSW5wdXRTdHJlYW0pIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuQklOQVJZX1NUUkVBTSwgbnVsbCwgam9pbnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvYiBnZXRCbG9iKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0QmxvYkludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvYiBnZXRCbG9iKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJsb2JJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQmxvYiBnZXRCbG9iSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKEJsb2IpIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosIEphdmFTUUxUeXBlcy5CTE9CLAorICAgICAgICAgICAgbnVsbCwgam9pbnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhbkludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5JbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRCb29sZWFuSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdmFsID0gY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwgSmF2YVR5cGVzLkJPT0xFQU4sCisgICAgICAgICAgICBudWxsLCBqb2lucykpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsLnRvU3RyaW5nKCkpLmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCeXRlSW50ZXJuYWwodHJhbnNsYXRlKG9iaiwgbnVsbCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qnl0ZUludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlIGdldEJ5dGVJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE51bWJlciB2YWwgPSAoTnVtYmVyKSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVR5cGVzLkJZVEUsIG51bGwsIGpvaW5zKSk7CisgICAgICAgIHJldHVybiAodmFsID09IG51bGwpID8gMCA6IHZhbC5ieXRlVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qnl0ZXNJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCeXRlc0ludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gZ2V0Qnl0ZXNJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoYnl0ZVtdKSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkJZVEVTLCBudWxsLCBqb2lucykpOworICAgIH0KKworICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhcihPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldENhbGVuZGFySW50ZXJuYWwodHJhbnNsYXRlKG9iaiwgbnVsbCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhcihDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRDYWxlbmRhckludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDYWxlbmRhciBnZXRDYWxlbmRhckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosIEphdmFUeXBlcy5DQUxFTkRBUiwKKyAgICAgICAgICAgIG51bGwsIGpvaW5zKSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQ2FsZW5kYXIpCisgICAgICAgICAgICByZXR1cm4gKENhbGVuZGFyKSB2YWw7CisKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsLnNldFRpbWUobmV3IERhdGUodmFsLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgcmV0dXJuIGNhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXRDaGFyKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Q2hhckludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXRDaGFyKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldENoYXJJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY2hhciBnZXRDaGFySW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdmFsID0gY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwgSmF2YVR5cGVzLkNIQVIsCisgICAgICAgICAgICBudWxsLCBqb2lucykpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIENoYXJhY3RlcikKKyAgICAgICAgICAgIHJldHVybiAoKENoYXJhY3RlcikgdmFsKS5jaGFyVmFsdWUoKTsKKworICAgICAgICBTdHJpbmcgc3RyID0gdmFsLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiAoc3RyLmxlbmd0aCgpID09IDApID8gMCA6IHN0ci5jaGFyQXQoMCk7CisgICAgfQorCisgICAgcHVibGljIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRDaGFyYWN0ZXJTdHJlYW1JbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Q2hhcmFjdGVyU3RyZWFtSW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW1JbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCB2YWwgPSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkNIQVJfU1RSRUFNLCBudWxsLCBqb2lucykpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFJlYWRlcikKKyAgICAgICAgICAgIHJldHVybiAoUmVhZGVyKSB2YWw7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKHZhbC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Q2xvYkludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldENsb2JJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xvYiBnZXRDbG9iSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKENsb2IpIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosIEphdmFTUUxUeXBlcy5DTE9CLAorICAgICAgICAgICAgbnVsbCwgam9pbnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RGF0ZUludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGVJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGF0ZSBnZXREYXRlSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdmFsID0gY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwgSmF2YVR5cGVzLkRBVEUsCisgICAgICAgICAgICBudWxsLCBqb2lucykpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpCisgICAgICAgICAgICByZXR1cm4gKERhdGUpIHZhbDsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKE9iamVjdCBvYmosIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXREYXRlSW50ZXJuYWwodHJhbnNsYXRlKG9iaiwgbnVsbCksIGNhbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGphdmEuc3FsLkRhdGUgZ2V0RGF0ZShDb2x1bW4gY29sLCBDYWxlbmRhciBjYWwsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGVJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGNhbCwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBqYXZhLnNxbC5EYXRlIGdldERhdGVJbnRlcm5hbChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwsCisgICAgICAgIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChqYXZhLnNxbC5EYXRlKSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLlNRTF9EQVRFLCBjYWwsIGpvaW5zKSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXREb3VibGVJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RG91YmxlSW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGRvdWJsZSBnZXREb3VibGVJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE51bWJlciB2YWwgPSAoTnVtYmVyKSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVR5cGVzLkRPVUJMRSwgbnVsbCwgam9pbnMpKTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyAwIDogdmFsLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RmxvYXRJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEZsb2F0SW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZsb2F0IGdldEZsb2F0SW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBOdW1iZXIgdmFsID0gKE51bWJlcikgY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwKKyAgICAgICAgICAgIEphdmFUeXBlcy5GTE9BVCwgbnVsbCwgam9pbnMpKTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyAwIDogdmFsLmZsb2F0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludChPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEludEludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludChDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRJbnRJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEludEludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTnVtYmVyIHZhbCA9IChOdW1iZXIpIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosCisgICAgICAgICAgICBKYXZhVHlwZXMuSU5ULCBudWxsLCBqb2lucykpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IDAgOiB2YWwuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldExvY2FsZUludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRMb2NhbGVJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldExvY2FsZUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosIEphdmFUeXBlcy5MT0NBTEUsCisgICAgICAgICAgICBudWxsLCBqb2lucykpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExvY2FsZSkKKyAgICAgICAgICAgIHJldHVybiAoTG9jYWxlKSB2YWw7CisgICAgICAgIFN0cmluZ1tdIHZhbHMgPSBTdHJpbmdzLnNwbGl0KHZhbC50b1N0cmluZygpLCAiXyIsIDApOworICAgICAgICBpZiAodmFscy5sZW5ndGggPCAyKQorICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbih2YWwudG9TdHJpbmcoKSk7CisgICAgICAgIGlmICh2YWxzLmxlbmd0aCA9PSAyKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbGUodmFsc1swXSwgdmFsc1sxXSk7CisgICAgICAgIHJldHVybiBuZXcgTG9jYWxlKHZhbHNbMF0sIHZhbHNbMV0sIHZhbHNbMl0pOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvbmcoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRMb25nSW50ZXJuYWwodHJhbnNsYXRlKG9iaiwgbnVsbCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvbmcoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0TG9uZ0ludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIGdldExvbmdJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE51bWJlciB2YWwgPSAoTnVtYmVyKSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVR5cGVzLklOVCwgbnVsbCwgam9pbnMpKTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyAwIDogdmFsLmludFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIE51bWJlciBnZXROdW1iZXIoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXROdW1iZXJJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE51bWJlciBnZXROdW1iZXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0TnVtYmVySW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciBnZXROdW1iZXJJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCB2YWwgPSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVR5cGVzLk5VTUJFUiwgbnVsbCwgam9pbnMpKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgICAgICByZXR1cm4gKE51bWJlcikgdmFsOworICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmosIGludCBtZXRhVHlwZSwgT2JqZWN0IGFyZykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRPYmplY3RJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbWV0YVR5cGUsIGFyZywgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoQ29sdW1uIGNvbCwgT2JqZWN0IGFyZywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SW50ZXJuYWwodHJhbnNsYXRlKGNvbCwgam9pbnMpLCBjb2wuZ2V0SmF2YVR5cGUoKSwKKyAgICAgICAgICAgIGFyZywgam9pbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBpZCBvciBjb2x1bW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRPYmplY3RJbnRlcm5hbChPYmplY3Qgb2JqLCBpbnQgbWV0YVR5cGUsCisgICAgICAgIE9iamVjdCBhcmcsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgcHVibGljIE9iamVjdCBnZXRTUUxPYmplY3QoT2JqZWN0IG9iaiwgTWFwIG1hcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRTUUxPYmplY3RJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbWFwLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFNRTE9iamVjdChDb2x1bW4gY29sLCBNYXAgbWFwLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRTUUxPYmplY3RJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIG1hcCwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U1FMT2JqZWN0SW50ZXJuYWwoT2JqZWN0IG9iaiwgTWFwIG1hcCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwgSmF2YVNRTFR5cGVzLlNRTF9PQkpFQ1QsCisgICAgICAgICAgICBtYXAsIGpvaW5zKSk7CisgICAgfQorCisgICAgcHVibGljIFJlZiBnZXRSZWYoT2JqZWN0IG9iaiwgTWFwIG1hcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRSZWZJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgbWFwLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVmIGdldFJlZihDb2x1bW4gY29sLCBNYXAgbWFwLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRSZWZJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIG1hcCwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZWYgZ2V0UmVmSW50ZXJuYWwoT2JqZWN0IG9iaiwgTWFwIG1hcCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFJlZikgY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwgSmF2YVNRTFR5cGVzLlJFRiwKKyAgICAgICAgICAgIG1hcCwgam9pbnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRTaG9ydEludGVybmFsKHRyYW5zbGF0ZShvYmosIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0U2hvcnRJbnRlcm5hbCh0cmFuc2xhdGUoY29sLCBqb2lucyksIGpvaW5zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc2hvcnQgZ2V0U2hvcnRJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE51bWJlciB2YWwgPSAoTnVtYmVyKSBjaGVja051bGwoZ2V0T2JqZWN0SW50ZXJuYWwob2JqLAorICAgICAgICAgICAgSmF2YVR5cGVzLlNIT1JULCBudWxsLCBqb2lucykpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IDAgOiB2YWwuc2hvcnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nSW50ZXJuYWwodHJhbnNsYXRlKG9iaiwgbnVsbCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZ0ludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgam9pbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdmFsID0gY2hlY2tOdWxsKGdldE9iamVjdEludGVybmFsKG9iaiwgSmF2YVR5cGVzLlNUUklORywKKyAgICAgICAgICAgIG51bGwsIGpvaW5zKSk7CisgICAgICAgIHJldHVybiAodmFsID09IG51bGwpID8gbnVsbCA6IHZhbC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoT2JqZWN0IG9iaiwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFRpbWVJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgY2FsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZSBnZXRUaW1lKENvbHVtbiBjb2wsIENhbGVuZGFyIGNhbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0VGltZUludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgY2FsLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFRpbWUgZ2V0VGltZUludGVybmFsKE9iamVjdCBvYmosIENhbGVuZGFyIGNhbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFRpbWUpIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosIEphdmFTUUxUeXBlcy5USU1FLAorICAgICAgICAgICAgY2FsLCBqb2lucykpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKE9iamVjdCBvYmosIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRUaW1lc3RhbXBJbnRlcm5hbCh0cmFuc2xhdGUob2JqLCBudWxsKSwgY2FsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChDb2x1bW4gY29sLCBDYWxlbmRhciBjYWwsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFRpbWVzdGFtcEludGVybmFsKHRyYW5zbGF0ZShjb2wsIGpvaW5zKSwgY2FsLCBqb2lucyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXBJbnRlcm5hbChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwsCisgICAgICAgIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChUaW1lc3RhbXApIGNoZWNrTnVsbChnZXRPYmplY3RJbnRlcm5hbChvYmosCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuVElNRVNUQU1QLCBjYWwsIGpvaW5zKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2FzTnVsbCgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3dhc051bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjaGVja051bGwoT2JqZWN0IHZhbCkgeworICAgICAgICBfd2FzTnVsbCA9ICh2YWwgPT0gbnVsbCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9ja2luZyhib29sZWFuIGxvY2tpbmcpIHsKKyAgICAgICAgX2xvY2tpbmcgPSBsb2NraW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2luZygpIHsKKyAgICAgICAgcmV0dXJuIF9sb2NraW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RGF0YVJlcXVlc3QoT2JqZWN0IG1hcHBpbmcpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmREYXRhUmVxdWVzdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIHVzZXItZ2l2ZW4gaWQgb3IgY29sdW1uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlCisgICAgICogZGVsZWdhdGluZyB0byBhbnkgPGNvZGU+Z2V0KkludGVybmFsPC9jb2RlPiBtZXRob2RzLiBSZXR1cm4gdGhlCisgICAgICogb3JpZ2luYWwgdmFsdWUgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zbGF0ZShPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8tbm90aGluZyBqb2lucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb09wSm9pbnMKKyAgICAgICAgaW1wbGVtZW50cyBKb2lucyB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPdXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBjcm9zc0pvaW4oVGFibGUgbG9jYWxUYWJsZSwgVGFibGUgZm9yZWlnblRhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBqb2luKEZvcmVpZ25LZXkgZmssIGJvb2xlYW4gaW52ZXJzZSwgYm9vbGVhbiB0b01hbnkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIG91dGVySm9pbihGb3JlaWduS2V5IGZrLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBqb2luUmVsYXRpb24oU3RyaW5nIG5hbWUsIEZvcmVpZ25LZXkgZmssIAorICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIHRhcmdldCwgaW50IHN1YnMsIGJvb2xlYW4gaW52ZXJzZSwgYm9vbGVhbiB0b01hbnkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIG91dGVySm9pblJlbGF0aW9uKFN0cmluZyBuYW1lLCBGb3JlaWduS2V5IGZrLAorICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIHRhcmdldCwgaW50IHN1YnMsIGJvb2xlYW4gaW52ZXJzZSwgYm9vbGVhbiB0b01hbnkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIHNldFZhcmlhYmxlKFN0cmluZyB2YXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIHNldFN1YnNlbGVjdChTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQWJzdHJhY3RTUUxTZXJ2ZXJEaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9BYnN0cmFjdFNRTFNlcnZlckRpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmY2OGI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQWJzdHJhY3RTUUxTZXJ2ZXJEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHMuRmlsdGVyVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXg7CisKKy8qKgorICogRGljdGlvbmFyeSBmb3IgdGhlIFNRTCBTZXJ2ZXIgZGF0YWJhc2VzIChTeWJhc2UgYW5kIE1TIFNRTCBTZXJ2ZXIpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTUUxTZXJ2ZXJEaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBEQkRpY3Rpb25hcnkgeworCisgICAgcHVibGljIEFic3RyYWN0U1FMU2VydmVyRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcmVzZXJ2ZWRXb3JkU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsgIkZJTEUiLCAiSU5ERVgiIH0pKTsKKyAgICAgICAgc3lzdGVtVGFibGVTZXQuYWRkKCJEVFBST1BFUlRJRVMiKTsKKyAgICAgICAgdmFsaWRhdGlvblNRTCA9ICJTRUxFQ1QgR0VUREFURSgpIjsKKyAgICAgICAgcmFuZ2VQb3NpdGlvbiA9IFJBTkdFX1BPU1RfRElTVElOQ1Q7CisKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0RW5kSW5kZXggPSB0cnVlOworICAgICAgICBhbGxvd3NBbGlhc0luQnVsa0NsYXVzZSA9IGZhbHNlOworCisgICAgICAgIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IHRydWU7CisgICAgICAgIGF1dG9Bc3NpZ25DbGF1c2UgPSAiSURFTlRJVFkiOworICAgICAgICBsYXN0R2VuZXJhdGVkS2V5UXVlcnkgPSAiU0VMRUNUIEBASURFTlRJVFkiOworCisgICAgICAgIHRyaW1MZWFkaW5nRnVuY3Rpb24gPSAiTFRSSU0oezB9KSI7CisgICAgICAgIHRyaW1UcmFpbGluZ0Z1bmN0aW9uID0gIlJUUklNKHswfSkiOworICAgICAgICB0cmltQm90aEZ1bmN0aW9uID0gIkxUUklNKFJUUklNKHswfSkpIjsKKyAgICAgICAgY29uY2F0ZW5hdGVGdW5jdGlvbiA9ICIoezB9K3sxfSkiOworICAgICAgICBzdXBwb3J0c01vZE9wZXJhdG9yID0gdHJ1ZTsKKworICAgICAgICBjdXJyZW50RGF0ZUZ1bmN0aW9uID0gIkdFVERBVEUoKSI7CisgICAgICAgIGN1cnJlbnRUaW1lRnVuY3Rpb24gPSAiR0VUREFURSgpIjsKKyAgICAgICAgY3VycmVudFRpbWVzdGFtcEZ1bmN0aW9uID0gIkdFVERBVEUoKSI7CisKKyAgICAgICAgdXNlR2V0U3RyaW5nRm9yQ2xvYnMgPSB0cnVlOworICAgICAgICB1c2VTZXRTdHJpbmdGb3JDbG9icyA9IHRydWU7CisgICAgICAgIHVzZUdldEJ5dGVzRm9yQmxvYnMgPSB0cnVlOworICAgICAgICB1c2VTZXRCeXRlc0ZvckJsb2JzID0gdHJ1ZTsKKyAgICAgICAgYmluYXJ5VHlwZU5hbWUgPSAiQklOQVJZIjsKKyAgICAgICAgYmxvYlR5cGVOYW1lID0gIklNQUdFIjsKKyAgICAgICAgbG9uZ1ZhcmJpbmFyeVR5cGVOYW1lID0gIklNQUdFIjsKKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBsb25nVmFyY2hhclR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBkYXRlVHlwZU5hbWUgPSAiREFURVRJTUUiOworICAgICAgICB0aW1lVHlwZU5hbWUgPSAiREFURVRJTUUiOworICAgICAgICB0aW1lc3RhbXBUeXBlTmFtZSA9ICJEQVRFVElNRSI7CisgICAgICAgIGZsb2F0VHlwZU5hbWUgPSAiRkxPQVQoMTYpIjsKKyAgICAgICAgZG91YmxlVHlwZU5hbWUgPSAiRkxPQVQoMzIpIjsKKyAgICAgICAgaW50ZWdlclR5cGVOYW1lID0gIklOVCI7CisgICAgICAgIGZpeGVkU2l6ZVR5cGVOYW1lU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJJTUFHRSIsICJURVhUIiwgIk5URVhUIiwgIk1PTkVZIiwgIlNNQUxMTU9ORVkiLCAiSU5UIiwKKyAgICAgICAgICAgICJET1VCTEUgUFJFQ0lTSU9OIiwgIkRBVEVUSU1FIiwgIlNNQUxMREFURVRJTUUiLAorICAgICAgICAgICAgIkVYVEVOREVEIFRZUEUiLCAiU1lTTkFNRSIsICJTUUxfVkFSSUFOVCIsICJJTkRFWCIsCisgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUsIENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBzdXBlci5nZXRDb2x1bW5zKG1ldGEsIGNhdGFsb2csIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSwKKyAgICAgICAgICAgIGNvbE5hbWUsIGNvbm4pOworICAgICAgICBmb3IgKGludCBpID0gMDsgY29scyAhPSBudWxsICYmIGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbHNbaV0uZ2V0VHlwZSgpID09IFR5cGVzLkxPTkdWQVJDSEFSKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0VHlwZShUeXBlcy5DTE9CKTsKKyAgICAgICAgcmV0dXJuIGNvbHM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZShJbmRleCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIGdldEZ1bGxOYW1lKGlkeC5nZXRUYWJsZSgpLCBmYWxzZSkgKyAiLiIgKyBpZHguZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bGwoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGludCBjb2xUeXBlLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU1FMU2VydmVyIGhhcyBzb21lIHByb2JsZW1zIHdpdGggc2V0TnVsbCBvbiBsb2JzCisgICAgICAgIGlmIChjb2xUeXBlID09IFR5cGVzLkNMT0IpCisgICAgICAgICAgICBzdG1udC5zZXRTdHJpbmcoaWR4LCBudWxsKTsKKyAgICAgICAgZWxzZSBpZiAoY29sVHlwZSA9PSBUeXBlcy5CTE9CKQorICAgICAgICAgICAgc3RtbnQuc2V0Qnl0ZXMoaWR4LCBudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VwZXIuc2V0TnVsbChzdG1udCwgaWR4LCBjb2xUeXBlLCBjb2wpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFNlbGVjdFJhbmdlKFNRTEJ1ZmZlciBidWYsIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIC8vIGNhbm5vdCB1c2UgYSB2YWx1ZSBoZXJlLCBzaW5jZSBTUUxTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAgICAvLyBib3VuZCBwYXJhbWV0ZXJzIGluIGEgIlRPUCIgY2xhdXNlCisgICAgICAgIGJ1Zi5hcHBlbmQoIiBUT1AgIikuYXBwZW5kKExvbmcudG9TdHJpbmcoZW5kKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3Vic3RyaW5nKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgc3RhcnQsCisgICAgICAgIEZpbHRlclZhbHVlIGVuZCkgeworICAgICAgICBidWYuYXBwZW5kKCJTVUJTVFJJTkcoIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgKyAxLCAiKTsKKyAgICAgICAgaWYgKGVuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIoIik7CisgICAgICAgICAgICBlbmQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkxFTigiKTsKKyAgICAgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIiAtICgiKTsKKyAgICAgICAgc3RhcnQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmRleE9mKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgZmluZCwKKyAgICAgICAgRmlsdGVyVmFsdWUgc3RhcnQpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiKENIQVJJTkRFWCgiKTsKKyAgICAgICAgZmluZC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHN1YnN0cmluZyhidWYsIHN0ciwgc3RhcnQsIG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHIuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSAtIDEiKTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiArICIpOworICAgICAgICAgICAgc3RhcnQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQWNjZXNzRGljdGlvbmFyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQWNjZXNzRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDc5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9BY2Nlc3NEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIEFjY2VzcyB2aWEgRGF0YURpcmVjdCBTZXF1ZUxpbmsgYW5kIERhdGFEaXJlY3QgT0RCQworICogRm94UHJvIGRyaXZlci4gVGhpcyB3aWxsIG5vdCB3b3JrIHdpdGggYW55IG90aGVyIGNvbWJpbmF0aW9uIG9mIEpEQkMvT0RCQworICogc2VydmVyIGFuZCBPREJDIGRyaXZlci4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc0RpY3Rpb25hcnkKKyAgICBleHRlbmRzIERCRGljdGlvbmFyeSB7CisKKyAgICBwdWJsaWMgQWNjZXNzRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiTWljcm9zb2Z0IEFjY2VzcyI7CisgICAgICAgIGpvaW5TeW50YXggPSBTWU5UQVhfVFJBRElUSU9OQUw7CisgICAgICAgIHZhbGlkYXRpb25TUUwgPSAiU0VMRUNUIDEiOworICAgICAgICByZXNlcnZlZFdvcmRTZXQuYWRkKCJWQUxVRSIpOworCisgICAgICAgIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IHRydWU7CisgICAgICAgIGF1dG9Bc3NpZ25UeXBlTmFtZSA9ICJDT1VOVEVSIjsKKyAgICAgICAgbGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID0gIlNFTEVDVCBAQGlkZW50aXR5IjsKKyAgICAgICAgbWF4VGFibGVOYW1lTGVuZ3RoID0gNjQ7CisgICAgICAgIG1heENvbHVtbk5hbWVMZW5ndGggPSA2NDsKKyAgICAgICAgbWF4SW5kZXhOYW1lTGVuZ3RoID0gNjQ7CisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gNjQ7CisKKyAgICAgICAgdXNlR2V0Qnl0ZXNGb3JCbG9icyA9IHRydWU7CisgICAgICAgIHVzZUdldEJlc3RSb3dJZGVudGlmaWVyRm9yUHJpbWFyeUtleXMgPSB0cnVlOworCisgICAgICAgIGJpbmFyeVR5cGVOYW1lID0gIkxPTkdCSU5BUlkiOworICAgICAgICBibG9iVHlwZU5hbWUgPSAiTE9OR0JJTkFSWSI7CisgICAgICAgIGxvbmdWYXJiaW5hcnlUeXBlTmFtZSA9ICJMT05HQklOQVJZIjsKKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIkxPTkdDSEFSIjsKKyAgICAgICAgbG9uZ1ZhcmNoYXJUeXBlTmFtZSA9ICJMT05HQ0hBUiI7CisgICAgICAgIGJpZ2ludFR5cGVOYW1lID0gIlJFQUwiOworICAgICAgICBudW1lcmljVHlwZU5hbWUgPSAiUkVBTCI7CisgICAgICAgIGludGVnZXJUeXBlTmFtZSA9ICJJTlRFR0VSIjsKKyAgICAgICAgc21hbGxpbnRUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisgICAgICAgIHRpbnlpbnRUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisKKyAgICAgICAgc3VwcG9ydHNGb3JlaWduS2V5cyA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHMgPSBmYWxzZTsKKyAgICAgICAgbWF4SW5kZXhlc1BlclRhYmxlID0gMzI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9uZyhQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgbG9uZyB2YWwsIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyB0aGUgYWNjZXNzIGRyaXZlciBkaXNhbGxvd3Mgc2V0TG9uZyBmb3Igc29tZSByZWFzb247IHVzZQorICAgICAgICAvLyBzZXRJbnQgaWYgcG9zc2libGUsIG90aGVyd2lzZSB1c2Ugc2V0RG91YmxlCisKKyAgICAgICAgaWYgKHZhbCA8IEludGVnZXIuTUFYX1ZBTFVFICYmIHZhbCA+IEludGVnZXIuTUlOX1ZBTFVFKQorICAgICAgICAgICAgc3RtbnQuc2V0SW50KGlkeCwgKGludCkgdmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RtbnQuc2V0RG91YmxlKGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIk1JRCgiKTsKKyAgICAgICAgc3RyLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgKCIpOworICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgKyAxKSIpOworICAgICAgICBpZiAoZW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgKCIpOworICAgICAgICAgICAgZW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAiKTsKKyAgICAgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQ2FjaGVEaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9DYWNoZURpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2RkZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvQ2FjaGVEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKKy8qKgorICogRGljdGlvbmFyeSBmb3IgSW50ZXJzeXN0ZW1zIENhY2hlLgorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVEaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBEQkRpY3Rpb25hcnkgeworCisgICAgcHVibGljIENhY2hlRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiSW50ZXJzeXN0ZW1zIENhY2hlIjsKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgdmFsaWRhdGlvblNRTCA9ICJTRVQgT1BUSU9OIERVTU1ZPURVTU1ZIjsKKworICAgICAgICBiaWdpbnRUeXBlTmFtZSA9ICJOVU1FUklDIjsKKyAgICAgICAgbnVtZXJpY1R5cGVOYW1lID0gIk5VTUVSSUMiOworICAgICAgICBjbG9iVHlwZU5hbWUgPSAiTE9OR1ZBUkNIQVIiOworICAgICAgICBibG9iVHlwZU5hbWUgPSAiTE9OR1ZBUkJJTkFSWSI7CisKKyAgICAgICAgLy8gdXNlIENhY2hlJ3Mgb2JqZWN0c2NyaXB0IGZvciBhc3NpZ25pbmcgYXV0by1hc3NpZ25lZCB2YWx1ZXMKKyAgICAgICAgYXV0b0Fzc2lnbkNsYXVzZSA9ICJERUZBVUxUIE9CSkVDVFNDUklQVCAnJElOQ1JFTUVOVCheTG9nTnVtYmVyKSciOworCisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGJ1aWx0LWluIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBsYXN0IGdlbmVyYXRlZAorICAgICAgICAvLyBrZXkgaW4gQ2FjaGU7IHVzaW5nIE1BWCB3aWxsIGhhdmUgdG8gc3VmZmljZQorICAgICAgICBsYXN0R2VuZXJhdGVkS2V5UXVlcnkgPSAiU0VMRUNUIE1BWCh7MH0pIEZST00gezF9IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9DYWxlbmRhcmQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0NhbGVuZGFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTJmNGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9DYWxlbmRhcmQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworLyoqCisgKiBBIGNhbGVuZGFyLW1vZGlmaWVkIHZhbHVlLiBVc2VkIHRvIHJlcHJlc2VudCBib3RoIGEgdmFsdWUgYW5kIGl0cworICogY2FsZW5kYXIgZm9yIGNhbGxzIHRvIHtAbGluayBSb3cjc2V0T2JqZWN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2FsZW5kYXJkIHsKKworICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgdmFsdWU7CisgICAgcHVibGljIGZpbmFsIENhbGVuZGFyIGNhbGVuZGFyOworCisgICAgcHVibGljIENhbGVuZGFyZChPYmplY3QgdmFsdWUsIENhbGVuZGFyIGNhbGVuZGFyKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgdGhpcy5jYWxlbmRhciA9IGNhbGVuZGFyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCMkRpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCMkRpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTY0YTExCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvREIyRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsNDIwIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOw0KK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2VxdWVuY2U7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247DQorDQorLyoqDQorICogRGljdGlvbmFyeSBmb3IgSUJNIERCMiBkYXRhYmFzZS4NCisgKi8NCitwdWJsaWMgY2xhc3MgREIyRGljdGlvbmFyeQ0KKyAgICBleHRlbmRzIEFic3RyYWN0REIyRGljdGlvbmFyeSB7DQorDQorICAgIHB1YmxpYyBTdHJpbmcgb3B0aW1pemVDbGF1c2UgPSAib3B0aW1pemUgZm9yIjsNCisgICAgcHVibGljIFN0cmluZyByb3dDbGF1c2UgPSAicm93IjsNCisgICAgcHJpdmF0ZSBpbnQgZGIyU2VydmVyVHlwZSA9IDA7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkYjJJU2VyaWVzVjVSM09yRWFybGllciA9IDE7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkYjJVREJWODFPckVhcmxpZXIgPSAyOw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGIyWk9TVjh4T3JMYXRlciA9IDM7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkYjJVREJWODJPckxhdGVyID0gNDsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRiMklTZXJpZXNWNVI0T3JMYXRlciA9IDU7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmb3JVcGRhdGVPZkNsYXVzZSA9ICJGT1IgVVBEQVRFIE9GIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdpdGhSU0NsYXVzZSA9ICJXSVRIIFJTIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdpdGhSUkNsYXVzZSA9ICJXSVRIIFJSIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZUtlZXBVcGRhdGVMb2NrQ2xhdXNlDQorICAgICAgICA9ICJVU0UgQU5EIEtFRVAgVVBEQVRFIExPQ0tTIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZUtlZXBFeGNsdXNpdmVMb2NrQ2xhdXNlDQorICAgICAgICA9ICJVU0UgQU5EIEtFRVAgRVhDTFVTSVZFIExPQ0tTIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZvclJlYWRPbmx5Q2xhdXNlID0gIkZPUiBSRUFEIE9OTFkiOw0KKw0KKyAgICBwdWJsaWMgREIyRGljdGlvbmFyeSgpIHsNCisgICAgICAgIHBsYXRmb3JtID0gIkRCMiI7DQorICAgICAgICB2YWxpZGF0aW9uU1FMID0gIlNFTEVDVCBESVNUSU5DVChDVVJSRU5UIFRJTUVTVEFNUCkgRlJPTSAiDQorICAgICAgICAgICAgKyAiU1lTSUJNLlNZU1RBQkxFUyI7DQorICAgICAgICBzdXBwb3J0c1NlbGVjdEVuZEluZGV4ID0gdHJ1ZTsNCisNCisgICAgICAgIG5leHRTZXF1ZW5jZVF1ZXJ5ID0gIlZBTFVFUyBORVhUVkFMIEZPUiB7MH0iOw0KKw0KKyAgICAgICAgc2VxdWVuY2VTUUwgPSAiU0VMRUNUIFNFUVNDSEVNQSBBUyBTRVFVRU5DRV9TQ0hFTUEsICINCisgICAgICAgICAgICArICJTRVFOQU1FIEFTIFNFUVVFTkNFX05BTUUgRlJPTSBTWVNDQVQuU0VRVUVOQ0VTIjsNCisgICAgICAgIHNlcXVlbmNlU2NoZW1hU1FMID0gIlNFUVNDSEVNQSA9ID8iOw0KKyAgICAgICAgc2VxdWVuY2VOYW1lU1FMID0gIlNFUU5BTUUgPSA/IjsNCisgICAgICAgIGNoYXJhY3RlckNvbHVtblNpemUgPSAyNTQ7DQorDQorICAgICAgICBiaW5hcnlUeXBlTmFtZSA9ICJCTE9CKDFNKSI7DQorICAgICAgICBsb25nVmFyYmluYXJ5VHlwZU5hbWUgPSAiQkxPQigxTSkiOw0KKyAgICAgICAgdmFyYmluYXJ5VHlwZU5hbWUgPSAiQkxPQigxTSkiOw0KKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIkNMT0IoMU0pIjsNCisgICAgICAgIGxvbmdWYXJjaGFyVHlwZU5hbWUgPSAiTE9ORyBWQVJDSEFSIjsNCisNCisgICAgICAgIGZpeGVkU2l6ZVR5cGVOYW1lU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsNCisgICAgICAgICAgICAiTE9ORyBWQVJDSEFSIEZPUiBCSVQgREFUQSIsICJMT05HIFZBUkNIQVIiLCAiTE9ORyBWQVJHUkFQSElDIiwNCisgICAgICAgIH0pKTsNCisNCisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gMTg7DQorICAgICAgICBtYXhJbmRleE5hbWVMZW5ndGggPSAxODsNCisgICAgICAgIG1heENvbHVtbk5hbWVMZW5ndGggPSAzMDsNCisgICAgICAgIHN1cHBvcnRzRGVmZXJyZWRDb25zdHJhaW50cyA9IGZhbHNlOw0KKyAgICAgICAgc3VwcG9ydHNEZWZhdWx0RGVsZXRlQWN0aW9uID0gZmFsc2U7DQorICAgICAgICBzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbiA9IGZhbHNlOw0KKw0KKyAgICAgICAgc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRDb2x1bW5zID0gZmFsc2U7DQorICAgICAgICByZXF1aXJlc0Nhc3RGb3JNYXRoRnVuY3Rpb25zID0gdHJ1ZTsNCisgICAgICAgIHJlcXVpcmVzQ2FzdEZvckNvbXBhcmlzb25zID0gdHJ1ZTsNCisNCisgICAgICAgIHJlc2VydmVkV29yZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117DQorICAgICAgICAgICAgIkFGVEVSIiwgIkFMSUFTIiwgIkFMTE9XIiwgIkFQUExJQ0FUSU9OIiwgIkFTU09DSUFURSIsICJBU1VUSU1FIiwNCisgICAgICAgICAgICAiQVVESVQiLCAiQVVYIiwgIkFVWElMSUFSWSIsICJCRUZPUkUiLCAiQklOQVJZIiwgIkJVRkZFUlBPT0wiLA0KKyAgICAgICAgICAgICJDQUNIRSIsICJDQUxMIiwgIkNBTExFRCIsICJDQVBUVVJFIiwgIkNBUkRJTkFMSVRZIiwgIkNDU0lEIiwNCisgICAgICAgICAgICAiQ0xVU1RFUiIsICJDT0xMRUNUSU9OIiwgIkNPTExJRCIsICJDT01NRU5UIiwgIkNPTkNBVCIsDQorICAgICAgICAgICAgIkNPTkRJVElPTiIsICJDT05UQUlOUyIsICJDT1VOVF9CSUciLCAiQ1VSUkVOVF9MQ19DVFlQRSIsDQorICAgICAgICAgICAgIkNVUlJFTlRfUEFUSCIsICJDVVJSRU5UX1NFUlZFUiIsICJDVVJSRU5UX1RJTUVaT05FIiwgIkNZQ0xFIiwNCisgICAgICAgICAgICAiREFUQSIsICJEQVRBQkFTRSIsICJEQVlTIiwgIkRCMkdFTkVSQUwiLCAiREIyR0VOUkwiLCAiREIyU1FMIiwNCisgICAgICAgICAgICAiREJJTkZPIiwgIkRFRkFVTFRTIiwgIkRFRklOSVRJT04iLCAiREVURVJNSU5JU1RJQyIsICJESVNBTExPVyIsDQorICAgICAgICAgICAgIkRPIiwgIkRTTkhBVFRSIiwgIkRTU0laRSIsICJEWU5BTUlDIiwgIkVBQ0giLCAiRURJVFBST0MiLCAiRUxTRUlGIiwNCisgICAgICAgICAgICAiRU5DT0RJTkciLCAiRU5ELUVYRUMxIiwgIkVSQVNFIiwgIkVYQ0xVRElORyIsICJFWElUIiwgIkZFTkNFRCIsDQorICAgICAgICAgICAgIkZJRUxEUFJPQyIsICJGSUxFIiwgIkZJTkFMIiwgIkZSRUUiLCAiRlVOQ1RJT04iLCAiR0VORVJBTCIsDQorICAgICAgICAgICAgIkdFTkVSQVRFRCIsICJHUkFQSElDIiwgIkhBTkRMRVIiLCAiSE9MRCIsICJIT1VSUyIsICJJRiIsDQorICAgICAgICAgICAgIklOQ0xVRElORyIsICJJTkNSRU1FTlQiLCAiSU5ERVgiLCAiSU5IRVJJVCIsICJJTk9VVCIsICJJTlRFR1JJVFkiLA0KKyAgICAgICAgICAgICJJU09CSUQiLCAiSVRFUkFURSIsICJKQVIiLCAiSkFWQSIsICJMQUJFTCIsICJMQ19DVFlQRSIsICJMRUFWRSIsDQorICAgICAgICAgICAgIkxJTktUWVBFIiwgIkxPQ0FMRSIsICJMT0NBVE9SIiwgIkxPQ0FUT1JTIiwgIkxPQ0siLCAiTE9DS01BWCIsDQorICAgICAgICAgICAgIkxPQ0tTSVpFIiwgIkxPTkciLCAiTE9PUCIsICJNQVhWQUxVRSIsICJNSUNST1NFQ09ORCIsDQorICAgICAgICAgICAgIk1JQ1JPU0VDT05EUyIsICJNSU5VVEVTIiwgIk1JTlZBTFVFIiwgIk1PREUiLCAiTU9ESUZJRVMiLCAiTU9OVEhTIiwNCisgICAgICAgICAgICAiTkVXIiwgIk5FV19UQUJMRSIsICJOT0NBQ0hFIiwgIk5PQ1lDTEUiLCAiTk9ERU5BTUUiLCAiTk9ERU5VTUJFUiIsDQorICAgICAgICAgICAgIk5PTUFYVkFMVUUiLCAiTk9NSU5WQUxVRSIsICJOT09SREVSIiwgIk5VTExTIiwgIk5VTVBBUlRTIiwgIk9CSUQiLA0KKyAgICAgICAgICAgICJPTEQiLCAiT0xEX1RBQkxFIiwgIk9QVElNSVpBVElPTiIsICJPUFRJTUlaRSIsICJPVVQiLCAiT1ZFUlJJRElORyIsDQorICAgICAgICAgICAgIlBBQ0tBR0UiLCAiUEFSQU1FVEVSIiwgIlBBUlQiLCAiUEFSVElUSU9OIiwgIlBBVEgiLCAiUElFQ0VTSVpFIiwNCisgICAgICAgICAgICAiUExBTiIsICJQUklRVFkiLCAiUFJPR1JBTSIsICJQU0lEIiwgIlFVRVJZTk8iLCAiUkVBRFMiLCAiUkVDT1ZFUlkiLA0KKyAgICAgICAgICAgICJSRUZFUkVOQ0lORyIsICJSRUxFQVNFIiwgIlJFTkFNRSIsICJSRVBFQVQiLCAiUkVTRVQiLCAiUkVTSUdOQUwiLA0KKyAgICAgICAgICAgICJSRVNUQVJUIiwgIlJFU1VMVCIsICJSRVNVTFRfU0VUX0xPQ0FUT1IiLCAiUkVUVVJOIiwgIlJFVFVSTlMiLA0KKyAgICAgICAgICAgICJST1VUSU5FIiwgIlJPVyIsICJSUk4iLCAiUlVOIiwgIlNBVkVQT0lOVCIsICJTQ1JBVENIUEFEIiwNCisgICAgICAgICAgICAiU0VDT05EUyIsICJTRUNRVFkiLCAiU0VDVVJJVFkiLCAiU0VOU0lUSVZFIiwgIlNJR05BTCIsICJTSU1QTEUiLA0KKyAgICAgICAgICAgICJTT1VSQ0UiLCAiU1BFQ0lGSUMiLCAiU1FMSUQiLCAiU1RBTkRBUkQiLCAiU1RBUlQiLCAiU1RBVElDIiwNCisgICAgICAgICAgICAiU1RBWSIsICJTVE9HUk9VUCIsICJTVE9SRVMiLCAiU1RZTEUiLCAiU1VCUEFHRVMiLCAiU1lOT05ZTSIsDQorICAgICAgICAgICAgIlNZU0ZVTiIsICJTWVNJQk0iLCAiU1lTUFJPQyIsICJTWVNURU0iLCAiVEFCTEVTUEFDRSIsICJUUklHR0VSIiwNCisgICAgICAgICAgICAiVFlQRSIsICJVTkRPIiwgIlVOVElMIiwgIlZBTElEUFJPQyIsICJWQVJJQUJMRSIsICJWQVJJQU5UIiwgIlZDQVQiLA0KKyAgICAgICAgICAgICJWT0xVTUVTIiwgIldISUxFIiwgIldMTSIsICJZRUFSUyIsDQorICAgICAgICB9KSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3NSZXN1bHRTZXQoU2VsZWN0IHNlbCwNCisgICAgICAgIGJvb2xlYW4gZm9yVXBkYXRlKSB7DQorICAgICAgICByZXR1cm4gIWZvclVwZGF0ZQ0KKyAgICAgICAgICAgICYmIHN1cGVyLnN1cHBvcnRzUmFuZG9tQWNjZXNzUmVzdWx0U2V0KHNlbCwgZm9yVXBkYXRlKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTZWxlY3RSYW5nZShTUUxCdWZmZXIgYnVmLCBsb25nIHN0YXJ0LCBsb25nIGVuZCkgew0KKyAgICAgICAgLy8gYXBwZW5kcyB0aGUgbGl0ZXJhbCByYW5nZSBzdHJpbmcsIHNpbmNlIERCMiBpcyB1bmFibGUgdG8gaGFuZGxlDQorICAgICAgICAvLyBhIGJvdW5kIHBhcmFtZXRlciBmb3IgaXQNCisgICAgICAgIGJ1Zi5hcHBlbmQoIiBGRVRDSCBGSVJTVCAiKS5hcHBlbmQoTG9uZy50b1N0cmluZyhlbmQpKS4NCisgICAgICAgICAgICBhcHBlbmQoIiBST1dTIE9OTFkiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlU2VxdWVuY2VTUUwoU2VxdWVuY2Ugc2VxKSB7DQorICAgICAgICBTdHJpbmdbXSBzcWwgPSBzdXBlci5nZXRDcmVhdGVTZXF1ZW5jZVNRTChzZXEpOw0KKyAgICAgICAgaWYgKHNlcS5nZXRBbGxvY2F0ZSgpID4gMSkNCisgICAgICAgICAgICBzcWxbMF0gKz0gIiBDQUNIRSAiICsgc2VxLmdldEFsbG9jYXRlKCk7DQorICAgICAgICByZXR1cm4gc3FsOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VxdWVuY2VzU1FMKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgc2VxdWVuY2VOYW1lKSB7DQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyAgICAgICAgYnVmLmFwcGVuZChzZXF1ZW5jZVNRTCk7DQorICAgICAgICBpZiAoc2NoZW1hTmFtZSAhPSBudWxsIHx8IHNlcXVlbmNlTmFtZSAhPSBudWxsKQ0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBXSEVSRSAiKTsNCisgICAgICAgIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBidWYuYXBwZW5kKHNlcXVlbmNlU2NoZW1hU1FMKTsNCisgICAgICAgICAgICBpZiAoc2VxdWVuY2VOYW1lICE9IG51bGwpDQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoc2VxdWVuY2VOYW1lICE9IG51bGwpDQorICAgICAgICAgICAgYnVmLmFwcGVuZChzZXF1ZW5jZU5hbWVTUUwpOw0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDb25uZWN0aW9uIGRlY29yYXRlKENvbm5lY3Rpb24gY29ubikNCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgLy8gc29tZSB2ZXJzaW9ucyBvZiB0aGUgREIyIGRyaXZlciBzZWVtIHRvIGRlZmF1bHQgdG8NCisgICAgICAgIC8vIFJFQURfVU5DT01NSVRURUQsIHdoaWNoIHdpbGwgcHJldmVudCBsb2NraW5nIGZyb20gd29ya2luZw0KKyAgICAgICAgLy8gKG11bHRpcGxlIFNFTEVDVCAuLi4gRk9SIFVQREFURSBzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkIG9uDQorICAgICAgICAvLyB0aGUgc2FtZSBpbnN0YW5jZSk7IGlmIHdlIGhhdmUgbm90IG92ZXJyaWRkZW4gdGhlDQorICAgICAgICAvLyB0cmFuc2FjdGlvbiBpc29sYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGRlZmF1bHQgdG8NCisgICAgICAgIC8vIFRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEDQorICAgICAgICBjb25uID0gc3VwZXIuZGVjb3JhdGUoY29ubik7DQorDQorICAgICAgICBpZiAoY29uZi5nZXRUcmFuc2FjdGlvbklzb2xhdGlvbkNvbnN0YW50KCkgPT0gLTENCisgICAgICAgICAgICAmJiBjb25uLmdldFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkgPCBjb25uLlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEKQ0KKyAgICAgICAgICAgIGNvbm4uc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oY29ubi5UUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRCk7DQorDQorICAgICAgICByZXR1cm4gY29ubjsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNKREJDMyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgLy8gSkRCQzMtb25seSBtZXRob2QsIHNvIGl0IG1pZ2h0IHRocm93IGEgQWJzdHJhY3RNZXRob2RFcnJvcg0KKyAgICAgICAgICAgIHJldHVybiBtZXRhLmdldEpEQkNNYWpvclZlcnNpb24oKSA+PSAzOw0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgY29ubmVjdGVkQ29uZmlndXJhdGlvbihDb25uZWN0aW9uIGNvbm4pIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAJc3VwZXIuY29ubmVjdGVkQ29uZmlndXJhdGlvbihjb25uKTsNCisNCisgICAgCURhdGFiYXNlTWV0YURhdGEgbWV0YURhdGEgPSBjb25uLmdldE1ldGFEYXRhKCk7DQorICAgIAlpZiAoaXNKREJDMyhtZXRhRGF0YSkpIHsNCisJCQlpbnQgbWFqID0gbWV0YURhdGEuZ2V0RGF0YWJhc2VNYWpvclZlcnNpb24oKTsNCisJICAgIAlpbnQgbWluID0gbWV0YURhdGEuZ2V0RGF0YWJhc2VNaW5vclZlcnNpb24oKTsNCisNCisJICAgIAkvLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgREIyIGRhdGFiYXNlDQorCSAgICAJaWYgKGlzREIySVNlcmllc1Y1UjNPckVhcmxpZXIobWV0YURhdGEpKQ0KKwkgICAgCSAgICBkYjJTZXJ2ZXJUeXBlID0gZGIySVNlcmllc1Y1UjNPckVhcmxpZXI7DQorCSAgICAJZWxzZSBpZiAoaXNEQjJVREJWODFPckVhcmxpZXIobWV0YURhdGEsbWFqLG1pbikpDQorCSAgICAJICAgIGRiMlNlcnZlclR5cGUgPSBkYjJVREJWODFPckVhcmxpZXI7DQorCSAgICAJZWxzZSBpZiAoaXNEQjJaT1NWOHhPckxhdGVyKG1ldGFEYXRhLG1haikpDQorCSAgICAJICAgIGRiMlNlcnZlclR5cGUgPSBkYjJaT1NWOHhPckxhdGVyOw0KKwkgICAgCWVsc2UgaWYgKGlzREIyVURCVjgyT3JMYXRlcihtZXRhRGF0YSxtYWosbWluKSkNCisJICAgIAkgICAgZGIyU2VydmVyVHlwZSA9IGRiMlVEQlY4Mk9yTGF0ZXI7DQorCSAgICAJZWxzZSBpZiAoaXNEQjJJU2VyaWVzVjVSNE9yTGF0ZXIobWV0YURhdGEpKQ0KKwkgICAgCSAgICBkYjJTZXJ2ZXJUeXBlID0gZGIySVNlcmllc1Y1UjRPckxhdGVyOw0KKw0KKwkgICAgCWlmIChtYWogPj0gOSB8fCAobWFqID09IDggJiYgbWluID49IDIpKSB7DQorCSAgICAJCXN1cHBvcnRzTG9ja2luZ1dpdGhNdWx0aXBsZVRhYmxlcyA9IHRydWU7DQorCSAgICAJCXN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW4gPSB0cnVlOw0KKwkgICAgCQlzdXBwb3J0c0xvY2tpbmdXaXRoT3V0ZXJKb2luID0gdHJ1ZTsNCisJICAgIAkJZm9yVXBkYXRlQ2xhdXNlID0gIldJVEggUlIgVVNFIEFORCBLRUVQIFVQREFURSBMT0NLUyI7DQorCSAgICAJfQ0KKw0KKyAgICAgICAgICAgIGlmIChtZXRhRGF0YS5nZXREYXRhYmFzZVByb2R1Y3RWZXJzaW9uKCkuaW5kZXhPZigiRFNOIikgIT0gLTEpIHsNCisgICAgICAgICAgICAgICAgLy8gREIyIFovT1MNCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyQ29sdW1uU2l6ZSA9IDI1NTsNCisgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID0gIlNFTEVDVCBJREVOVElUWV9WQUxfTE9DQUwoKSBGUk9NICINCisgICAgICAgICAgICAgICAgICAgICsgIlNZU0lCTS5TWVNEVU1NWTEiOw0KKyAgICAgICAgICAgICAgICBuZXh0U2VxdWVuY2VRdWVyeSA9ICJTRUxFQ1QgTkVYVFZBTCBGT1IgezB9IEZST00gIg0KKyAgICAgICAgICAgICAgICAgICAgKyAiU1lTSUJNLlNZU0RVTU1ZMSI7DQorICAgICAgICAgICAgICAgIHNlcXVlbmNlU1FMID0gIlNFTEVDVCBTQ0hFTUEgQVMgU0VRVUVOQ0VfU0NIRU1BLCAiDQorICAgICAgICAgICAgICAgICAgICArICJOQU1FIEFTIFNFUVVFTkNFX05BTUUgRlJPTSBTWVNJQk0uU1lTU0VRVUVOQ0VTIjsNCisgICAgICAgICAgICAgICAgc2VxdWVuY2VTY2hlbWFTUUwgPSAiU0NIRU1BID0gPyI7DQorICAgICAgICAgICAgICAgIHNlcXVlbmNlTmFtZVNRTCA9ICJOQU1FID0gPyI7DQorICAgICAgICAgICAgICAgIGlmIChtYWogPT0gOCkgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gREIyIFovT1MgVmVyc2lvbiA4OiBubyBiaWdpbnQgc3VwcG9ydCwgaGVuY2UgbWFwIEphdmENCisgICAgICAgICAgICAgICAgICAgIC8vIGxvbmcgdG8gZGVjaW1hbA0KKyAgICAgICAgICAgICAgICAgICAgYmlnaW50VHlwZU5hbWUgPSAiREVDSU1BTCgzMSwwKSI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgdXBkYXRlIGNsYXVzZSBmb3IgdGhlIHF1ZXJ5IGJhc2VkIG9uIHRoZQ0KKyAgICAgKiB1cGRhdGVDbGF1c2UgYW5kIGlzb2xhdGlvbkxldmVsIGhpbnRzDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZvclVwZGF0ZUNsYXVzZShKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLA0KKyAgICAgICAgYm9vbGVhbiBmb3JVcGRhdGUpIHsNCisgICAgICAgIGludCBpc29sYXRpb25MZXZlbDsNCisgICAgICAgIFN0cmluZ0J1ZmZlciBmb3JVcGRhdGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgaXNvbGF0aW9uTGV2ZWw7IHRoZSBmZXRjaA0KKyAgICAgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gZGF0YSBvdmVycmlkZXMgdGhlIHBlcnNpc3RlbmNlLnhtbCB2YWx1ZQ0KKyAgICAgICAgICAgIGlmIChmZXRjaCAhPSBudWxsICYmIGZldGNoLmdldElzb2xhdGlvbigpICE9IC0xKQ0KKyAgICAgICAgICAgICAgICBpc29sYXRpb25MZXZlbCA9IGZldGNoLmdldElzb2xhdGlvbigpOw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwgPSBjb25mLmdldFRyYW5zYWN0aW9uSXNvbGF0aW9uQ29uc3RhbnQoKTsNCisNCisgICAgICAgICAgICBpZiAoZm9yVXBkYXRlKSB7DQorICAgICAgICAgICAgICAgIHN3aXRjaChkYjJTZXJ2ZXJUeXBlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgZGIySVNlcmllc1Y1UjNPckVhcmxpZXI6DQorICAgICAgICAgICAgICAgIGNhc2UgZGIyVURCVjgxT3JFYXJsaWVyOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzb2xhdGlvbkxldmVsID09DQorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVEKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yVXBkYXRlU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZCh3aXRoUlNDbGF1c2UpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiKS5hcHBlbmQoZm9yVXBkYXRlT2ZDbGF1c2UpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yVXBkYXRlU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChmb3JVcGRhdGVPZkNsYXVzZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBkYjJaT1NWOHhPckxhdGVyOg0KKyAgICAgICAgICAgICAgICBjYXNlIGRiMlVEQlY4Mk9yTGF0ZXI6DQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNvbGF0aW9uTGV2ZWwgPT0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JVcGRhdGVTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKGZvclJlYWRPbmx5Q2xhdXNlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikuYXBwZW5kKHdpdGhSUkNsYXVzZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpLmFwcGVuZCh1c2VLZWVwVXBkYXRlTG9ja0NsYXVzZSk7ICAgDQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvclVwZGF0ZVN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQoZm9yUmVhZE9ubHlDbGF1c2UpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiKS5hcHBlbmQod2l0aFJTQ2xhdXNlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikuYXBwZW5kKHVzZUtlZXBVcGRhdGVMb2NrQ2xhdXNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBkYjJJU2VyaWVzVjVSNE9yTGF0ZXI6DQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNvbGF0aW9uTGV2ZWwgPT0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JVcGRhdGVTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKGZvclJlYWRPbmx5Q2xhdXNlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikuYXBwZW5kKHdpdGhSUkNsYXVzZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpLmFwcGVuZCh1c2VLZWVwRXhjbHVzaXZlTG9ja0NsYXVzZSk7ICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JVcGRhdGVTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKGZvclJlYWRPbmx5Q2xhdXNlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikuYXBwZW5kKHdpdGhSU0NsYXVzZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpLmFwcGVuZCh1c2VLZWVwRXhjbHVzaXZlTG9ja0NsYXVzZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkNCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUudG9TdHJpbmcoKSxlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBmb3JVcGRhdGVTdHJpbmcudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RCMlVEQlY4Mk9yTGF0ZXIoRGF0YWJhc2VNZXRhRGF0YSBtZXRhZGF0YSwgaW50IG1haiwNCisgICAgICAgIGludCBtaW4pIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOw0KKyAgICAgICAgaWYgKG1ldGFkYXRhLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKS5pbmRleE9mKCJTUUwiKSAhPSAtMQ0KKyAgICAgICAgICAgICYmICgobWFqID09IDggJiYgbWluID49IDIpIHx8KG1haiA+PSA4KSkpDQorICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIG1hdGNoOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzREIyWk9TVjh4T3JMYXRlcihEYXRhYmFzZU1ldGFEYXRhIG1ldGFkYXRhLCBpbnQgbWFqKQ0KKyAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOw0KKyAgICAgICBpZiAobWV0YWRhdGEuZ2V0RGF0YWJhc2VQcm9kdWN0VmVyc2lvbigpLmluZGV4T2YoIkRTTiIpICE9IC0xDQorICAgICAgICAgICAmJiBtYWogPj0gOCkNCisgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiBtYXRjaDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RCMklTZXJpZXNWNVIzT3JFYXJsaWVyKERhdGFiYXNlTWV0YURhdGEgbWV0YWRhdGEpDQorICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7DQorICAgICAgIGlmIChtZXRhZGF0YS5nZXREYXRhYmFzZVByb2R1Y3RWZXJzaW9uKCkuaW5kZXhPZigiQVMiKSAhPSAtMQ0KKyAgICAgICAgICAgJiYgZ2VuZXJhdGVWZXJzaW9uTnVtYmVyKG1ldGFkYXRhLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKSkNCisgICAgICAgICAgIDw9IDUzMCkNCisgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsNCisgICAgICAgcmV0dXJuIG1hdGNoOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzREIySVNlcmllc1Y1UjRPckxhdGVyKERhdGFiYXNlTWV0YURhdGEgbWV0YWRhdGEpDQorICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7DQorICAgICAgIGlmIChtZXRhZGF0YS5nZXREYXRhYmFzZVByb2R1Y3RWZXJzaW9uKCkuaW5kZXhPZigiQVMiKSAhPSAtMQ0KKyAgICAgICAgICAgJiYgZ2VuZXJhdGVWZXJzaW9uTnVtYmVyKG1ldGFkYXRhLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKSkNCisgICAgICAgICAgID49IDU0MCkNCisgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsNCisgICAgICByZXR1cm4gbWF0Y2g7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNEQjJVREJWODFPckVhcmxpZXIoRGF0YWJhc2VNZXRhRGF0YSBtZXRhZGF0YSwgaW50IG1haiwNCisgICAgICAgIGludCBtaW4pIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOw0KKyAgICAgICAgaWYgKG1ldGFkYXRhLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKS5pbmRleE9mKCJTUUwiKSAhPSAtMSAmJg0KKyAgICAgICAgICAgKChtYWogPT0gOCAmJiBtaW4gPD0gMSl8fCBtYWogPCA4KSkNCisgICAgICAgICAgICBtYXRjaCA9IHRydWU7DQorICAgICAgICByZXR1cm4gbWF0Y2g7DQorICAgIH0NCisNCisgICAgLyoqIEdldCB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBJU2VyaWVzDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgIGludCBnZW5lcmF0ZVZlcnNpb25OdW1iZXIoU3RyaW5nIHZlcnNpb25TdHJpbmcpIHsNCisgICAgICAgIFN0cmluZyBzID0gdmVyc2lvblN0cmluZy5zdWJzdHJpbmcodmVyc2lvblN0cmluZy5pbmRleE9mKCdWJykpOw0KKyAgICAgICAgcyA9IHMudG9VcHBlckNhc2UoKTsNCisgICAgICAgIGludCBpID0gLTE7DQorICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RyaW5ndG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiVlJNIiwgZmFsc2UpOw0KKyAgICAgICAgaWYgKHN0cmluZ3Rva2VuaXplci5jb3VudFRva2VucygpID09IDMpDQorICAgICAgICB7DQorICAgICAgICAgICAgU3RyaW5nIHMxID0gc3RyaW5ndG9rZW5pemVyLm5leHRUb2tlbigpOw0KKyAgICAgICAgICAgIHMxID0gczEgKyBzdHJpbmd0b2tlbml6ZXIubmV4dFRva2VuKCk7DQorICAgICAgICAgICAgczEgPSBzMSArIHN0cmluZ3Rva2VuaXplci5uZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBpID0gSW50ZWdlci5wYXJzZUludChzMSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU1FMQnVmZmVyIHRvU2VsZWN0KFNlbGVjdCBzZWwsIGJvb2xlYW4gZm9yVXBkYXRlLA0KKyAgICAgICAgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgew0KKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IHN1cGVyLnRvU2VsZWN0KHNlbCwgZm9yVXBkYXRlLCBmZXRjaCk7DQorDQorICAgICAgICBpZiAoc2VsLmdldEV4cGVjdGVkUmVzdWx0Q291bnQoKSA+IDApIHsNCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgIikuYXBwZW5kKG9wdGltaXplQ2xhdXNlKS5hcHBlbmQoIiAiKQ0KKyAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZy52YWx1ZU9mKHNlbC5nZXRFeHBlY3RlZFJlc3VsdENvdW50KCkpKQ0KKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikuYXBwZW5kKHJvd0NsYXVzZSk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gYnVmOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uIG5ld1N0b3JlRXhjZXB0aW9uKFN0cmluZyBtc2csIFNRTEV4Y2VwdGlvbltdIGNhdXNlcywNCisgICAgICAgIE9iamVjdCBmYWlsZWQpIHsNCisgICAgICAgIGlmIChjYXVzZXMgIT0gbnVsbCAmJiBjYXVzZXMubGVuZ3RoID4gMCkNCisgICAgICAgICAgICBtc2cgPSBhcHBlbmRFeHRlbmRlZEV4Y2VwdGlvbk1zZyhtc2csIGNhdXNlc1swXSk7DQorICAgICAgICByZXR1cm4gc3VwZXIubmV3U3RvcmVFeGNlcHRpb24obXNnLCBjYXVzZXMsIGZhaWxlZCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBBcHBlbmQgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGZyb20gU1FMQ0EgdG8gdGhlIGV4c2lzdGluZw0KKyAgICAgKiAgZXhjZXB0aW9uIG1lYXNzYWdlDQorICAgICAqLw0KKyAgICBwcml2YXRlIFN0cmluZyBhcHBlbmRFeHRlbmRlZEV4Y2VwdGlvbk1zZyhTdHJpbmcgbXNnLCBTUUxFeGNlcHRpb24gc3FsZSl7DQorICAgICAgIGZpbmFsIFN0cmluZyBHRVRTUUxDQSA9ImdldFNxbGNhIjsNCisgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk1zZyA9IG5ldyBTdHJpbmcoKTsNCisgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBNZXRob2Qgc3FsY2FNMiA9IHNxbGUuZ2V0TmV4dEV4Y2VwdGlvbigpLmdldENsYXNzKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoR0VUU1FMQ0EsbnVsbCk7DQorICAgICAgICAgICAgT2JqZWN0IHNxbGNhID0gc3FsY2FNMi5pbnZva2Uoc3FsZS5nZXROZXh0RXhjZXB0aW9uKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9KTsNCisgICAgICAgICAgICBNZXRob2QgIGdldFNxbEVycnBNZXRoZCA9IHNxbGNhLmdldENsYXNzKCkuDQorICAgICAgICAgICAgZ2V0TWV0aG9kKCJnZXRTcWxFcnJwIiwgbnVsbCk7DQorICAgICAgICAgICAgTWV0aG9kICBnZXRTcWxXYXJuTWV0aGQgPSBzcWxjYS5nZXRDbGFzcygpLg0KKyAgICAgICAgICAgIGdldE1ldGhvZCgiZ2V0U3FsV2FybiIsIG51bGwpOw0KKyAgICAgICAgICAgIE1ldGhvZCAgZ2V0U3FsRXJyZE1ldGhkID0gc3FsY2EuZ2V0Q2xhc3MoKS4NCisgICAgICAgICAgICBnZXRNZXRob2QoImdldFNxbEVycmQiLCBudWxsKTsNCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyZFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisNCisgICAgICAgICAgICBpbnRbXSBlcnJkcyA9IChpbnRbXSkgZ2V0U3FsRXJyZE1ldGhkLmludm9rZShzcWxjYSwgbmV3IE9iamVjdFtde30pOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXJyZHMubGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgICAgIGVycmRTdHIuYXBwZW5kKGVycmRTdHIubGVuZ3RoKCkgPiAwID8gIiwgIiA6ICIiKS4NCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZChlcnJkc1tpXSk7DQorICAgICAgICAgICAgZXhjZXB0aW9uTXNnID0gZXhjZXB0aW9uTXNnLmNvbmNhdCggIlNRTENBIE9VVFBVVCIgKw0KKyAgICAgICAgICAgICAgICAgICAgIltFcnJwPSIgKyBnZXRTcWxFcnJwTWV0aGQuaW52b2tlKHNxbGNhLCBuZXcgT2JqZWN0W117fSkNCisgICAgICAgICAgICAgICAgICAgICsgIiwgRXJyZD0iICsgZXJyZFN0cik7DQorDQorICAgICAgICAgICAgU3RyaW5nIFdhcm4gPSBuZXcgU3RyaW5nKChjaGFyW10pZ2V0U3FsV2Fybk1ldGhkLg0KKyAgICAgICAgICAgICAgICAgICAgaW52b2tlKHNxbGNhLCBuZXcgT2JqZWN0W117fSkpOw0KKyAgICAgICAgICAgIGlmKFdhcm4udHJpbSgpLmxlbmd0aCgpICE9IDApDQorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1zZyA9IGV4Y2VwdGlvbk1zZy5jb25jYXQoIiwgV2Fybj0iICtXYXJuICsgIl0iICk7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBleGNlcHRpb25Nc2cgPSBleGNlcHRpb25Nc2cuY29uY2F0KCAiXSIgKTsNCisgICAgICAgICAgICBtc2cgPSBtc2cuY29uY2F0KGV4Y2VwdGlvbk1zZyk7DQorICAgICAgICAgICAgcmV0dXJuIG1zZzsNCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQorICAgICAgICAgICAgcmV0dXJuIHNxbGUuZ2V0TWVzc2FnZSgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0RGIyU2VydmVyVHlwZSgpIHsNCisgICAgICAgIHJldHVybiBkYjJTZXJ2ZXJUeXBlOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCRGljdGlvbmFyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvREJEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzZjk1ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsMzgxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zcWwuQXJyYXk7CitpbXBvcnQgamF2YS5zcWwuQmxvYjsKK2ltcG9ydCBqYXZhLnNxbC5DbG9iOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZWY7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxXYXJuaW5nOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHMuRXhwQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5FeHBTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5WYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5KYXZhU1FMVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRGF0YVNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5OYW1lU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlVuaXF1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuQ29ubmVjdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5SZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TZXJpYWxpemF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIENsYXNzIHdoaWNoIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgU1FMIGR5bmFtaWNhbGx5LCBpbiBhCisgKiBkYXRhYmFzZSBhZ25vc3RpYyBmYXNoaW9uLiBTdWJjbGFzcyBmb3IgdGhlIG51YW5jZXMgb2YgZGlmZmVyZW50IGRhdGEgc3RvcmVzLgorICovCitwdWJsaWMgY2xhc3MgREJEaWN0aW9uYXJ5CisgICAgaW1wbGVtZW50cyBDb25maWd1cmFibGUsIENvbm5lY3Rpb25EZWNvcmF0b3IsIEpvaW5TeW50YXhlcywKKyAgICBMb2dnaW5nQ29ubmVjdGlvbkRlY29yYXRvci5TUUxXYXJuaW5nSGFuZGxlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfT1RIRVIgPSAib3RoZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9EQVRBRElSRUNUID0gImRhdGFkaXJlY3QiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0NBU0VfVVBQRVIgPSAidXBwZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9DQVNFX0xPV0VSID0gImxvd2VyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfQ0FTRV9QUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TX05BTUVfQkVGT1JFID0gImJlZm9yZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU19OQU1FX01JRCA9ICJtaWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNfTkFNRV9BRlRFUiA9ICJhZnRlciI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSQU5HRV9QT1NUX1NFTEVDVCA9IDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkFOR0VfUFJFX0RJU1RJTkNUID0gMTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSQU5HRV9QT1NUX0RJU1RJTkNUID0gMjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSQU5HRV9QT1NUX0xPQ0sgPSAzOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTkFOTyA9IDE7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUlDUk8gPSBOQU5PICogMTAwMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNSUxMSSA9IE1JQ1JPICogMTAwMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDRU5USSA9IE1JTExJICogMTA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVDSSA9IE1JTExJICogMTAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFQyA9IE1JTExJICogMTAwMDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5BTUVfQU5ZID0gMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOQU1FX1RBQkxFID0gMTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOQU1FX1NFUVVFTkNFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPX0RBVEVfU1RSID0KKyAgICAgICAgIiciICsgbmV3IGphdmEuc3FsLkRhdGUoMCkgKyAiJyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9fVElNRV9TVFIgPSAiJyIgKyBuZXcgVGltZSgwKSArICInIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST19USU1FU1RBTVBfU1RSID0KKyAgICAgICAgIiciICsgbmV3IFRpbWVzdGFtcCgwKSArICInIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKERCRGljdGlvbmFyeS5jbGFzcyk7CisKKyAgICAvLyBzY2hlbWEgZGF0YQorICAgIHB1YmxpYyBTdHJpbmcgcGxhdGZvcm0gPSAiR2VuZXJpYyI7CisgICAgcHVibGljIFN0cmluZyBkcml2ZXJWZW5kb3IgPSBudWxsOworICAgIHB1YmxpYyBTdHJpbmcgY2F0YWxvZ1NlcGFyYXRvciA9ICIuIjsKKyAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcmltYXJ5S2V5cyA9IHRydWU7CisgICAgcHVibGljIFN0cmluZyBjb25zdHJhaW50TmFtZU1vZGUgPSBDT05TX05BTUVfQkVGT1JFOworICAgIHB1YmxpYyBpbnQgbWF4VGFibGVOYW1lTGVuZ3RoID0gMTI4OworICAgIHB1YmxpYyBpbnQgbWF4Q29sdW1uTmFtZUxlbmd0aCA9IDEyODsKKyAgICBwdWJsaWMgaW50IG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gMTI4OworICAgIHB1YmxpYyBpbnQgbWF4SW5kZXhOYW1lTGVuZ3RoID0gMTI4OworICAgIHB1YmxpYyBpbnQgbWF4SW5kZXhlc1BlclRhYmxlID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNGb3JlaWduS2V5cyA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUaW1lc3RhbXBOYW5vcyA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVbmlxdWVDb25zdHJhaW50cyA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc3RyaWN0RGVsZXRlQWN0aW9uID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Nhc2NhZGVEZWxldGVBY3Rpb24gPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbERlbGV0ZUFjdGlvbiA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZhdWx0RGVsZXRlQWN0aW9uID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc3RyaWN0VXBkYXRlQWN0aW9uID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Nhc2NhZGVVcGRhdGVBY3Rpb24gPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbFVwZGF0ZUFjdGlvbiA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZhdWx0VXBkYXRlQWN0aW9uID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoQWRkQ29sdW1uID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbiA9IHRydWU7CisgICAgcHVibGljIFN0cmluZyByZXNlcnZlZFdvcmRzID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIHN5c3RlbVNjaGVtYXMgPSBudWxsOworICAgIHB1YmxpYyBTdHJpbmcgc3lzdGVtVGFibGVzID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIGZpeGVkU2l6ZVR5cGVOYW1lcyA9IG51bGw7CisgICAgcHVibGljIFN0cmluZyBzY2hlbWFDYXNlID0gU0NIRU1BX0NBU0VfVVBQRVI7CisKKyAgICAvLyBzcWwKKyAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRpb25TUUwgPSBudWxsOworICAgIHB1YmxpYyBTdHJpbmcgY2xvc2VQb29sU1FMID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIGluaXRpYWxpemF0aW9uU1FMID0gbnVsbDsKKyAgICBwdWJsaWMgaW50IGpvaW5TeW50YXggPSBTWU5UQVhfU1FMOTI7CisgICAgcHVibGljIFN0cmluZyBvdXRlckpvaW5DbGF1c2UgPSAiTEVGVCBPVVRFUiBKT0lOIjsKKyAgICBwdWJsaWMgU3RyaW5nIGlubmVySm9pbkNsYXVzZSA9ICJJTk5FUiBKT0lOIjsKKyAgICBwdWJsaWMgU3RyaW5nIGNyb3NzSm9pbkNsYXVzZSA9ICJDUk9TUyBKT0lOIjsKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0NvbmRpdGlvbkZvckNyb3NzSm9pbiA9IGZhbHNlOworICAgIHB1YmxpYyBTdHJpbmcgZm9yVXBkYXRlQ2xhdXNlID0gIkZPUiBVUERBVEUiOworICAgIHB1YmxpYyBTdHJpbmcgdGFibGVGb3JVcGRhdGVDbGF1c2UgPSBudWxsOworICAgIHB1YmxpYyBTdHJpbmcgZGlzdGluY3RDb3VudENvbHVtblNlcGFyYXRvciA9IG51bGw7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTG9ja2luZ1dpdGhEaXN0aW5jdENsYXVzZSA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMb2NraW5nV2l0aE11bHRpcGxlVGFibGVzID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xvY2tpbmdXaXRoT3JkZXJDbGF1c2UgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTG9ja2luZ1dpdGhPdXRlckpvaW4gPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW4gPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTG9ja2luZ1dpdGhTZWxlY3RSYW5nZSA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNRdWVyeVRpbWVvdXQgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHNpbXVsYXRlTG9ja2luZyA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3Vic2VsZWN0ID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvcnJlbGF0ZWRTdWJzZWxlY3QgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzSGF2aW5nID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlbGVjdFN0YXJ0SW5kZXggPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlbGVjdEVuZEluZGV4ID0gZmFsc2U7CisgICAgcHVibGljIGludCByYW5nZVBvc2l0aW9uID0gUkFOR0VfUE9TVF9TRUxFQ1Q7CisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIGFsbG93c0FsaWFzSW5CdWxrQ2xhdXNlID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpcGxlTm9udHJhbnNhY3Rpb25hbFJlc3VsdFNldHMgPSB0cnVlOworICAgIHB1YmxpYyBTdHJpbmcgc2VhcmNoU3RyaW5nRXNjYXBlID0gIlxcIjsKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0Nhc3RGb3JNYXRoRnVuY3Rpb25zID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDYXN0Rm9yQ29tcGFyaXNvbnMgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c01vZE9wZXJhdG9yID0gZmFsc2U7CisKKyAgICAvLyBmdW5jdGlvbnMKKyAgICBwdWJsaWMgU3RyaW5nIGNhc3RGdW5jdGlvbiA9ICJDQVNUKHswfSBBUyB7MX0pIjsKKyAgICBwdWJsaWMgU3RyaW5nIHRvTG93ZXJDYXNlRnVuY3Rpb24gPSAiTE9XRVIoezB9KSI7CisgICAgcHVibGljIFN0cmluZyB0b1VwcGVyQ2FzZUZ1bmN0aW9uID0gIlVQUEVSKHswfSkiOworICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nTGVuZ3RoRnVuY3Rpb24gPSAiQ0hBUl9MRU5HVEgoezB9KSI7CisgICAgcHVibGljIFN0cmluZyBiaXRMZW5ndGhGdW5jdGlvbiA9ICIoT0NURVRfTEVOR1RIKHswfSkgKiA4KSI7CisgICAgcHVibGljIFN0cmluZyB0cmltTGVhZGluZ0Z1bmN0aW9uID0gIlRSSU0oTEVBRElORyB7MX0gRlJPTSB7MH0pIjsKKyAgICBwdWJsaWMgU3RyaW5nIHRyaW1UcmFpbGluZ0Z1bmN0aW9uID0gIlRSSU0oVFJBSUxJTkcgezF9IEZST00gezB9KSI7CisgICAgcHVibGljIFN0cmluZyB0cmltQm90aEZ1bmN0aW9uID0gIlRSSU0oQk9USCB7MX0gRlJPTSB7MH0pIjsKKyAgICBwdWJsaWMgU3RyaW5nIGNvbmNhdGVuYXRlRnVuY3Rpb24gPSAiKHswfXx8ezF9KSI7CisgICAgcHVibGljIFN0cmluZyBjb25jYXRlbmF0ZURlbGltaXRlciA9ICInT1BFTkpQQVRPS0VOJyI7CisgICAgcHVibGljIFN0cmluZyBzdWJzdHJpbmdGdW5jdGlvbk5hbWUgPSAiU1VCU1RSSU5HIjsKKyAgICBwdWJsaWMgU3RyaW5nIGN1cnJlbnREYXRlRnVuY3Rpb24gPSAiQ1VSUkVOVF9EQVRFIjsKKyAgICBwdWJsaWMgU3RyaW5nIGN1cnJlbnRUaW1lRnVuY3Rpb24gPSAiQ1VSUkVOVF9USU1FIjsKKyAgICBwdWJsaWMgU3RyaW5nIGN1cnJlbnRUaW1lc3RhbXBGdW5jdGlvbiA9ICJDVVJSRU5UX1RJTUVTVEFNUCI7CisgICAgcHVibGljIFN0cmluZyBkcm9wVGFibGVTUUwgPSAiRFJPUCBUQUJMRSB7MH0iOworCisgICAgLy8gdHlwZXMKKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9yYWdlTGltaXRhdGlvbnNGYXRhbCA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIHN0b3JlTGFyZ2VOdW1iZXJzQXNTdHJpbmdzID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gc3RvcmVDaGFyc0FzTnVtYmVycyA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gdXNlR2V0Qnl0ZXNGb3JCbG9icyA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIHVzZVNldEJ5dGVzRm9yQmxvYnMgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiB1c2VHZXRPYmplY3RGb3JCbG9icyA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIHVzZUdldFN0cmluZ0ZvckNsb2JzID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gdXNlU2V0U3RyaW5nRm9yQ2xvYnMgPSBmYWxzZTsKKyAgICBwdWJsaWMgaW50IG1heEVtYmVkZGVkQmxvYlNpemUgPSAtMTsKKyAgICBwdWJsaWMgaW50IG1heEVtYmVkZGVkQ2xvYlNpemUgPSAtMTsKKyAgICBwdWJsaWMgaW50IGluQ2xhdXNlTGltaXQgPSAtMTsKKyAgICBwdWJsaWMgaW50IGRhdGVQcmVjaXNpb24gPSBNSUxMSTsKKyAgICBwdWJsaWMgaW50IGNoYXJhY3RlckNvbHVtblNpemUgPSAyNTU7CisgICAgcHVibGljIFN0cmluZyBhcnJheVR5cGVOYW1lID0gIkFSUkFZIjsKKyAgICBwdWJsaWMgU3RyaW5nIGJpZ2ludFR5cGVOYW1lID0gIkJJR0lOVCI7CisgICAgcHVibGljIFN0cmluZyBiaW5hcnlUeXBlTmFtZSA9ICJCSU5BUlkiOworICAgIHB1YmxpYyBTdHJpbmcgYml0VHlwZU5hbWUgPSAiQklUIjsKKyAgICBwdWJsaWMgU3RyaW5nIGJsb2JUeXBlTmFtZSA9ICJCTE9CIjsKKyAgICBwdWJsaWMgU3RyaW5nIGJvb2xlYW5UeXBlTmFtZSA9ICJCT09MRUFOIjsKKyAgICBwdWJsaWMgU3RyaW5nIGNoYXJUeXBlTmFtZSA9ICJDSEFSIjsKKyAgICBwdWJsaWMgU3RyaW5nIGNsb2JUeXBlTmFtZSA9ICJDTE9CIjsKKyAgICBwdWJsaWMgU3RyaW5nIGRhdGVUeXBlTmFtZSA9ICJEQVRFIjsKKyAgICBwdWJsaWMgU3RyaW5nIGRlY2ltYWxUeXBlTmFtZSA9ICJERUNJTUFMIjsKKyAgICBwdWJsaWMgU3RyaW5nIGRpc3RpbmN0VHlwZU5hbWUgPSAiRElTVElOQ1QiOworICAgIHB1YmxpYyBTdHJpbmcgZG91YmxlVHlwZU5hbWUgPSAiRE9VQkxFIjsKKyAgICBwdWJsaWMgU3RyaW5nIGZsb2F0VHlwZU5hbWUgPSAiRkxPQVQiOworICAgIHB1YmxpYyBTdHJpbmcgaW50ZWdlclR5cGVOYW1lID0gIklOVEVHRVIiOworICAgIHB1YmxpYyBTdHJpbmcgamF2YU9iamVjdFR5cGVOYW1lID0gIkpBVkFfT0JKRUNUIjsKKyAgICBwdWJsaWMgU3RyaW5nIGxvbmdWYXJiaW5hcnlUeXBlTmFtZSA9ICJMT05HVkFSQklOQVJZIjsKKyAgICBwdWJsaWMgU3RyaW5nIGxvbmdWYXJjaGFyVHlwZU5hbWUgPSAiTE9OR1ZBUkNIQVIiOworICAgIHB1YmxpYyBTdHJpbmcgbnVsbFR5cGVOYW1lID0gIk5VTEwiOworICAgIHB1YmxpYyBTdHJpbmcgbnVtZXJpY1R5cGVOYW1lID0gIk5VTUVSSUMiOworICAgIHB1YmxpYyBTdHJpbmcgb3RoZXJUeXBlTmFtZSA9ICJPVEhFUiI7CisgICAgcHVibGljIFN0cmluZyByZWFsVHlwZU5hbWUgPSAiUkVBTCI7CisgICAgcHVibGljIFN0cmluZyByZWZUeXBlTmFtZSA9ICJSRUYiOworICAgIHB1YmxpYyBTdHJpbmcgc21hbGxpbnRUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisgICAgcHVibGljIFN0cmluZyBzdHJ1Y3RUeXBlTmFtZSA9ICJTVFJVQ1QiOworICAgIHB1YmxpYyBTdHJpbmcgdGltZVR5cGVOYW1lID0gIlRJTUUiOworICAgIHB1YmxpYyBTdHJpbmcgdGltZXN0YW1wVHlwZU5hbWUgPSAiVElNRVNUQU1QIjsKKyAgICBwdWJsaWMgU3RyaW5nIHRpbnlpbnRUeXBlTmFtZSA9ICJUSU5ZSU5UIjsKKyAgICBwdWJsaWMgU3RyaW5nIHZhcmJpbmFyeVR5cGVOYW1lID0gIlZBUkJJTkFSWSI7CisgICAgcHVibGljIFN0cmluZyB2YXJjaGFyVHlwZU5hbWUgPSAiVkFSQ0hBUiI7CisKKyAgICAvLyBzY2hlbWEgbWV0YWRhdGEKKyAgICBwdWJsaWMgYm9vbGVhbiB1c2VTY2hlbWFOYW1lID0gdHJ1ZTsKKyAgICBwdWJsaWMgU3RyaW5nIHRhYmxlVHlwZXMgPSAiVEFCTEUiOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NoZW1hRm9yR2V0VGFibGVzID0gdHJ1ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYUZvckdldENvbHVtbnMgPSB0cnVlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbFRhYmxlRm9yR2V0Q29sdW1ucyA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRQcmltYXJ5S2V5cyA9IGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTnVsbFRhYmxlRm9yR2V0SW5kZXhJbmZvID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbXBvcnRlZEtleXMgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiB1c2VHZXRCZXN0Um93SWRlbnRpZmllckZvclByaW1hcnlLZXlzID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBdXRvQ29tbWl0Rm9yTWV0YURhdGEgPSBmYWxzZTsKKworICAgIC8vIGF1dG8taW5jcmVtZW50CisgICAgcHVibGljIGludCBtYXhBdXRvQXNzaWduTmFtZUxlbmd0aCA9IDMxOworICAgIHB1YmxpYyBTdHJpbmcgYXV0b0Fzc2lnbkNsYXVzZSA9IG51bGw7CisgICAgcHVibGljIFN0cmluZyBhdXRvQXNzaWduVHlwZU5hbWUgPSBudWxsOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IGZhbHNlOworICAgIHB1YmxpYyBTdHJpbmcgbGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIG5leHRTZXF1ZW5jZVF1ZXJ5ID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIHNlcXVlbmNlU1FMID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIHNlcXVlbmNlU2NoZW1hU1FMID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIHNlcXVlbmNlTmFtZVNRTCA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiA9IG51bGw7CisgICAgcHJvdGVjdGVkIExvZyBsb2cgPSBudWxsOworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBmaW5hbCBTZXQgcmVzZXJ2ZWRXb3JkU2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0IHN5c3RlbVNjaGVtYVNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNldCBzeXN0ZW1UYWJsZVNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNldCBmaXhlZFNpemVUeXBlTmFtZVNldCA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAvLyB3aGVuIHdlIHN0b3JlIHZhbHVlcyB0aGF0IGxvc2UgcHJlY2lvbiwgdHJhY2sgdGhlIHR5cGVzIHNvIHRoYXQgdGhlCisgICAgLy8gZmlyc3QgdGltZSBpdCBoYXBwZW5zIHdlIGNhbiB3YXJuIHRoZSB1c2VyCisgICAgcHJpdmF0ZSBTZXQgX3ByZWNpc2lvbldhcm5lZFR5cGVzID0gbnVsbDsKKworICAgIC8vIGNhY2hlIGxvYiBtZXRob2RzCisgICAgcHJpdmF0ZSBNZXRob2QgX3NldEJ5dGVzID0gbnVsbDsKKyAgICBwcml2YXRlIE1ldGhvZCBfc2V0U3RyaW5nID0gbnVsbDsKKyAgICBwcml2YXRlIE1ldGhvZCBfc2V0Q2hhclN0cmVhbSA9IG51bGw7CisKKyAgICBwdWJsaWMgREJEaWN0aW9uYXJ5KCkgeworICAgICAgICBmaXhlZFNpemVUeXBlTmFtZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiQklHSU5UIiwgIkJJVCIsICJCTE9CIiwgIkNMT0IiLCAiREFURSIsICJERUNJTUFMIiwgIkRJU1RJTkNUIiwKKyAgICAgICAgICAgICJET1VCTEUiLCAiRkxPQVQiLCAiSU5URUdFUiIsICJKQVZBX09CSkVDVCIsICJOVUxMIiwgIk5VTUVSSUMiLAorICAgICAgICAgICAgIk9USEVSIiwgIlJFQUwiLCAiUkVGIiwgIlNNQUxMSU5UIiwgIlNUUlVDVCIsICJUSU1FIiwgIlRJTUVTVEFNUCIsCisgICAgICAgICAgICAiVElOWUlOVCIsCisgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGljdGlvbmFyeSBmaXJzdCBzZWVzIGFueSBjb25uZWN0aW9uLgorICAgICAqIEl0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkaWN0aW9uYXJ5IG1ldGFkYXRhIGlmIG5lZWRlZC4gSWYgeW91CisgICAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGJlIHN1cmUgdG8gY2FsbAorICAgICAqIDxjb2RlPnN1cGVyLmNvbm5lY3RlZENvbmZpZ3VyYXRpb248L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RlZENvbmZpZ3VyYXRpb24oQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoREJEaWN0aW9uYXJ5RmFjdG9yeS50b1N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgKGNvbm4uZ2V0TWV0YURhdGEoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoZS50b1N0cmluZygpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBSZXN1bHRTZXQgd3JhcHBlcnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIEFycmF5IGdldEFycmF5KFJlc3VsdFNldCBycywgaW50IGNvbHVtbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBycy5nZXRBcnJheShjb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2x1bW4gb2YgdGhlIFNRTCBSZXN1bHRTZXQgdG8gdGhlIHByb3BlcgorICAgICAqIGphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QXNjaWlTdHJlYW0oUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldEFzY2lpU3RyZWFtKGNvbHVtbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0b3JlTGFyZ2VOdW1iZXJzQXNTdHJpbmdzKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0U3RyaW5nKHJzLCBjb2x1bW4pOworICAgICAgICAgICAgcmV0dXJuIChzdHIgPT0gbnVsbCkgPyBudWxsIDogbmV3IEJpZ0RlY2ltYWwoc3RyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMuZ2V0QmlnRGVjaW1hbChjb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBjb2x1bW4gdmFsdWUgYXMgYW4gdW5rbm93biBudW1lcmljIHR5cGU7CisgICAgICogd2UgdHJ5IGZyb20gdGhlIG1vc3QgZ2VuZXJpYyB0byB0aGUgbGVhc3QgZ2VuZXJpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTnVtYmVyIGdldE51bWJlcihSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyB0cnkgZnJvbSB0aGUgbW9zdCBnZW5lcmljLCBhbmQgaWYgZXJyb3JzIG9jY3VyLCB0cnkKKyAgICAgICAgLy8gbGVzcyBnZW5lcmljIHR5cGVzOyB0aGlzIGVuYWJsZXMgdXMgdG8gaGFuZGxlIHZhbHVlcworICAgICAgICAvLyBsaWtlIERvdWJsZS5OYU4gd2l0aG91dCBoYXZpbmcgdG8gaW50cm9zcGVjdCBvbiB0aGUKKyAgICAgICAgLy8gUmVzdWx0U2V0TWV0YURhdGEgKGJ1ZyAjMTA1MykuIG5vdGUgdGhhdCB3ZSBoYW5kbGUKKyAgICAgICAgLy8gZ2VuZXJpYyBleGNlcHRpb25zLCBzaW5jZSBzb21lIGRyaXZlcnMgbWF5IHRocm93CisgICAgICAgIC8vIE51bWJlckZvcm1hdEV4Y2VwdGlvbnMsIHdoZXJlYXMgb3RoZXJzIG1heSB0aHJvdyBTUUxFeGNlcHRpb25zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0QmlnRGVjaW1hbChycywgY29sdW1uKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKGdldERvdWJsZShycywgY29sdW1uKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KGdldEZsb2F0KHJzLCBjb2x1bW4pKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoZ2V0TG9uZyhycywgY29sdW1uKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGdldEludChycywgY29sdW1uKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGUxIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyhSdW50aW1lRXhjZXB0aW9uKSBlMTsKKyAgICAgICAgICAgIGlmIChlMSBpbnN0YW5jZW9mIFNRTEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyhTUUxFeGNlcHRpb24pIGUxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXIoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0b3JlTGFyZ2VOdW1iZXJzQXNTdHJpbmdzKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0U3RyaW5nKHJzLCBjb2x1bW4pOworICAgICAgICAgICAgcmV0dXJuIChzdHIgPT0gbnVsbCkgPyBudWxsIDogbmV3IEJpZ0RlY2ltYWwoc3RyKS50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgfQorICAgICAgICBCaWdEZWNpbWFsIGJkID0gZ2V0QmlnRGVjaW1hbChycywgY29sdW1uKTsKKyAgICAgICAgcmV0dXJuIChiZCA9PSBudWxsKSA/IG51bGwgOiBiZC50b0JpZ0ludGVnZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbShSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcnMuZ2V0QmluYXJ5U3RyZWFtKGNvbHVtbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBCbG9iIGdldEJsb2IoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldEJsb2IoY29sdW1uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRCbG9iT2JqZWN0KFJlc3VsdFNldCBycywgaW50IGNvbHVtbiwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICBpZiAodXNlR2V0Qnl0ZXNGb3JCbG9icyB8fCB1c2VHZXRPYmplY3RGb3JCbG9icykgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0Qnl0ZXMocnMsIGNvbHVtbik7CisgICAgICAgICAgICBpZiAoYnl0ZXMgIT0gbnVsbCAmJiBieXRlcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJsb2IgYmxvYiA9IGdldEJsb2IocnMsIGNvbHVtbik7CisgICAgICAgICAgICBpZiAoYmxvYiAhPSBudWxsICYmIGJsb2IubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIGluID0gYmxvYi5nZXRCaW5hcnlTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShpbiwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShpbiwgc3RvcmUuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldEJvb2xlYW4oY29sdW1uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcnMuZ2V0Qnl0ZShjb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2x1bW4gb2YgdGhlIFNRTCBSZXN1bHRTZXQgdG8gdGhlIHByb3BlcgorICAgICAqIGphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKFJlc3VsdFNldCBycywgaW50IGNvbHVtbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1c2VHZXRCeXRlc0ZvckJsb2JzKQorICAgICAgICAgICAgcmV0dXJuIHJzLmdldEJ5dGVzKGNvbHVtbik7CisgICAgICAgIGlmICh1c2VHZXRPYmplY3RGb3JCbG9icykKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZVtdKSBycy5nZXRPYmplY3QoY29sdW1uKTsKKworICAgICAgICBCbG9iIGJsb2IgPSBnZXRCbG9iKHJzLCBjb2x1bW4pOworICAgICAgICBpZiAoYmxvYiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGludCBsZW5ndGggPSAoaW50KSBibG9iLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGJsb2IuZ2V0Qnl0ZXMoMSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuIENvbnZlcnRzIHRoZSBkYXRlIGZyb20gYSB7QGxpbmsgVGltZXN0YW1wfSBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhcihSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBEYXRlIGQgPSBnZXREYXRlKHJzLCBjb2x1bW4pOworICAgICAgICBpZiAoZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsLnNldFRpbWUoZCk7CisgICAgICAgIHJldHVybiBjYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBjaGFyIGdldENoYXIoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0b3JlQ2hhcnNBc051bWJlcnMpCisgICAgICAgICAgICByZXR1cm4gKGNoYXIpIGdldEludChycywgY29sdW1uKTsKKworICAgICAgICBTdHJpbmcgc3RyID0gZ2V0U3RyaW5nKHJzLCBjb2x1bW4pOworICAgICAgICByZXR1cm4gKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyKSkgPyAwIDogc3RyLmNoYXJBdCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldENoYXJhY3RlclN0cmVhbShjb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2x1bW4gb2YgdGhlIFNRTCBSZXN1bHRTZXQgdG8gdGhlIHByb3BlcgorICAgICAqIGphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKFJlc3VsdFNldCBycywgaW50IGNvbHVtbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBycy5nZXRDbG9iKGNvbHVtbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xvYlN0cmluZyhSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodXNlR2V0U3RyaW5nRm9yQ2xvYnMpCisgICAgICAgICAgICByZXR1cm4gcnMuZ2V0U3RyaW5nKGNvbHVtbik7CisKKyAgICAgICAgQ2xvYiBjbG9iID0gZ2V0Q2xvYihycywgY29sdW1uKTsKKyAgICAgICAgaWYgKGNsb2IgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoY2xvYi5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgIC8vIHVubGlrZWx5IHRoYXQgd2UnbGwgaGF2ZSBzdHJpbmdzIG92ZXIgSW50ZWdlci5NQVhfVkFMVUUgY2hhcnMKKyAgICAgICAgcmV0dXJuIGNsb2IuZ2V0U3ViU3RyaW5nKDEsIChpbnQpIGNsb2IubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2x1bW4gb2YgdGhlIFNRTCBSZXN1bHRTZXQgdG8gdGhlIHByb3BlcgorICAgICAqIGphdmEgdHlwZS4gQ29udmVydHMgdGhlIGRhdGUgZnJvbSBhIHtAbGluayBUaW1lc3RhbXB9IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZShSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBUaW1lc3RhbXAgdHN0YW1wID0gZ2V0VGltZXN0YW1wKHJzLCBjb2x1bW4sIG51bGwpOworICAgICAgICBpZiAodHN0YW1wID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBnZXQgdGhlIGZyYWN0aW9uYWwgc2Vjb25kcyBjb21wb25lbnQsIHJvdW5kaW5nIGF3YXkgYW55dGhpbmcgYmV5b25kCisgICAgICAgIC8vIG1pbGxpc2Vjb25kcworICAgICAgICBpbnQgZnJhY3Rpb25hbCA9IChpbnQpIE1hdGgucm91bmQodHN0YW1wLmdldE5hbm9zKCkgLyAoZG91YmxlKSBNSUxMSSk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBtaWxsaXMgY29tcG9uZW50OyBzb21lIEpEQkMgZHJpdmVycyByb3VuZCB0aGlzIHRvIHRoZQorICAgICAgICAvLyBuZWFyZXN0IHNlY29uZCwgd2hpbGUgb3RoZXJzIGRvIG5vdAorICAgICAgICBsb25nIG1pbGxpcyA9ICh0c3RhbXAuZ2V0VGltZSgpIC8gMTAwMEwpICogMTAwMEw7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZShtaWxsaXMgKyBmcmFjdGlvbmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGphdmEuc3FsLkRhdGUgZ2V0RGF0ZShSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4sIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBycy5nZXREYXRlKGNvbHVtbik7CisgICAgICAgIHJldHVybiBycy5nZXREYXRlKGNvbHVtbiwgY2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldERvdWJsZShjb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2x1bW4gb2YgdGhlIFNRTCBSZXN1bHRTZXQgdG8gdGhlIHByb3BlcgorICAgICAqIGphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldEZsb2F0KGNvbHVtbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50KFJlc3VsdFNldCBycywgaW50IGNvbHVtbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBycy5nZXRJbnQoY29sdW1uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IGdldFN0cmluZyhycywgY29sdW1uKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IFN0cmluZ3Muc3BsaXQoc3RyLCAiXyIsIDMpOworICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA8IDMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbGUocGFyYW1zWzBdLCBwYXJhbXNbMV0sIHBhcmFtc1syXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExvbmcoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldExvbmcoY29sdW1uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uLCBNYXAgbWFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHJzLmdldE9iamVjdChjb2x1bW4pOworICAgICAgICByZXR1cm4gcnMuZ2V0T2JqZWN0KGNvbHVtbiwgbWFwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFJlZiBnZXRSZWYoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uLCBNYXAgbWFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldFJlZihjb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2x1bW4gb2YgdGhlIFNRTCBSZXN1bHRTZXQgdG8gdGhlIHByb3BlcgorICAgICAqIGphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJzLmdldFNob3J0KGNvbHVtbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvZiB0aGUgU1FMIFJlc3VsdFNldCB0byB0aGUgcHJvcGVyCisgICAgICogamF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFJlc3VsdFNldCBycywgaW50IGNvbHVtbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBycy5nZXRTdHJpbmcoY29sdW1uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFRpbWUgZ2V0VGltZShSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4sIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBycy5nZXRUaW1lKGNvbHVtbik7CisgICAgICAgIHJldHVybiBycy5nZXRUaW1lKGNvbHVtbiwgY2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sdW1uIG9mIHRoZSBTUUwgUmVzdWx0U2V0IHRvIHRoZSBwcm9wZXIKKyAgICAgKiBqYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoY2FsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcnMuZ2V0VGltZXN0YW1wKGNvbHVtbik7CisgICAgICAgIHJldHVybiBycy5nZXRUaW1lc3RhbXAoY29sdW1uLCBjYWwpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFByZXBhcmVkU3RhdGVtZW50IHdyYXBwZXJzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJyYXkoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIEFycmF5IHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN0bW50LnNldEFycmF5KGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsCisgICAgICAgIElucHV0U3RyZWFtIHZhbCwgaW50IGxlbmd0aCwgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN0bW50LnNldEFzY2lpU3RyZWFtKGlkeCwgdmFsLCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBCaWdEZWNpbWFsIHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoY29sICE9IG51bGwgJiYgY29sLmlzQ29tcGF0aWJsZShUeXBlcy5WQVJDSEFSLCBudWxsLCAwLCAwKSkKKyAgICAgICAgICAgIHx8IChjb2wgPT0gbnVsbCAmJiBzdG9yZUxhcmdlTnVtYmVyc0FzU3RyaW5ncykpCisgICAgICAgICAgICBzZXRTdHJpbmcoc3RtbnQsIGlkeCwgdmFsLnRvU3RyaW5nKCksIGNvbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0bW50LnNldEJpZ0RlY2ltYWwoaWR4LCB2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBCaWdJbnRlZ2VyIHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoY29sICE9IG51bGwgJiYgY29sLmlzQ29tcGF0aWJsZShUeXBlcy5WQVJDSEFSLCBudWxsLCAwLCAwKSkKKyAgICAgICAgICAgIHx8IChjb2wgPT0gbnVsbCAmJiBzdG9yZUxhcmdlTnVtYmVyc0FzU3RyaW5ncykpCisgICAgICAgICAgICBzZXRTdHJpbmcoc3RtbnQsIGlkeCwgdmFsLnRvU3RyaW5nKCksIGNvbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldEJpZ0RlY2ltYWwoc3RtbnQsIGlkeCwgbmV3IEJpZ0RlY2ltYWwodmFsKSwgY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmluYXJ5U3RyZWFtKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LAorICAgICAgICBJbnB1dFN0cmVhbSB2YWwsIGludCBsZW5ndGgsIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzdG1udC5zZXRCaW5hcnlTdHJlYW0oaWR4LCB2YWwsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsb2IoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIEJsb2IgdmFsLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3RtbnQuc2V0QmxvYihpZHgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LiBVc2VzIHRoZQorICAgICAqIHtAbGluayAjc2VyaWFsaXplfSBtZXRob2QgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbG9iT2JqZWN0KFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBPYmplY3QgdmFsLAorICAgICAgICBDb2x1bW4gY29sLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRCeXRlcyhzdG1udCwgaWR4LCBzZXJpYWxpemUodmFsLCBzdG9yZSksIGNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGJvb2xlYW4gdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3RtbnQuc2V0SW50KGlkeCwgKHZhbCkgPyAxIDogMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGUoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGJ5dGUgdmFsLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3RtbnQuc2V0Qnl0ZShpZHgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVzKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBieXRlW10gdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVzZVNldEJ5dGVzRm9yQmxvYnMpCisgICAgICAgICAgICBzdG1udC5zZXRCeXRlcyhpZHgsIHZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldEJpbmFyeVN0cmVhbShzdG1udCwgaWR4LCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsKSwKKyAgICAgICAgICAgICAgICB2YWwubGVuZ3RoLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBjaGFyIHZhbCwgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoY29sICE9IG51bGwgJiYgY29sLmlzQ29tcGF0aWJsZShUeXBlcy5JTlRFR0VSLCBudWxsLCAwLCAwKSkKKyAgICAgICAgICAgIHx8IChjb2wgPT0gbnVsbCAmJiBzdG9yZUNoYXJzQXNOdW1iZXJzKSkKKyAgICAgICAgICAgIHNldEludChzdG1udCwgaWR4LCAoaW50KSB2YWwsIGNvbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldFN0cmluZyhzdG1udCwgaWR4LCBTdHJpbmcudmFsdWVPZih2YWwpLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsCisgICAgICAgIFJlYWRlciB2YWwsIGludCBsZW5ndGgsIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzdG1udC5zZXRDaGFyYWN0ZXJTdHJlYW0oaWR4LCB2YWwsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb2IoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIENsb2IgdmFsLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3RtbnQuc2V0Q2xvYihpZHgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb2JTdHJpbmcoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIFN0cmluZyB2YWwsCisgICAgICAgIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodXNlU2V0U3RyaW5nRm9yQ2xvYnMpCisgICAgICAgICAgICBzdG1udC5zZXRTdHJpbmcoaWR4LCB2YWwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNldCByZWFkZXIgZnJvbSBzdHJpbmcKKyAgICAgICAgICAgIFN0cmluZ1JlYWRlciBpbiA9IG5ldyBTdHJpbmdSZWFkZXIodmFsKTsKKyAgICAgICAgICAgIHNldENoYXJhY3RlclN0cmVhbShzdG1udCwgaWR4LCBpbiwgdmFsLmxlbmd0aCgpLCBjb2wpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIERhdGUgdmFsLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNvbCAhPSBudWxsICYmIGNvbC5nZXRUeXBlKCkgPT0gVHlwZXMuREFURSkKKyAgICAgICAgICAgIHNldERhdGUoc3RtbnQsIGlkeCwgbmV3IGphdmEuc3FsLkRhdGUodmFsLmdldFRpbWUoKSksIG51bGwsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKGNvbCAhPSBudWxsICYmIGNvbC5nZXRUeXBlKCkgPT0gVHlwZXMuVElNRSkKKyAgICAgICAgICAgIHNldFRpbWUoc3RtbnQsIGlkeCwgbmV3IFRpbWUodmFsLmdldFRpbWUoKSksIG51bGwsIGNvbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldFRpbWVzdGFtcChzdG1udCwgaWR4LCBuZXcgVGltZXN0YW1wKHZhbC5nZXRUaW1lKCkpLCBudWxsLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBqYXZhLnNxbC5EYXRlIHZhbCwKKyAgICAgICAgQ2FsZW5kYXIgY2FsLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNhbCA9PSBudWxsKQorICAgICAgICAgICAgc3RtbnQuc2V0RGF0ZShpZHgsIHZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0bW50LnNldERhdGUoaWR4LCB2YWwsIGNhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhbGVuZGFyKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBDYWxlbmRhciB2YWwsCisgICAgICAgIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBieSBkZWZhdWx0IHdlIG1lcmVseSBkZWxlZ2F0ZSB0aGUgdGhlIERhdGUgcGFyYW1ldGVyCisgICAgICAgIHNldERhdGUoc3RtbnQsIGlkeCwgdmFsLmdldFRpbWUoKSwgY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBkb3VibGUgdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3RtbnQuc2V0RG91YmxlKGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGZsb2F0IHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN0bW50LnNldEZsb2F0KGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50KFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBpbnQgdmFsLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3RtbnQuc2V0SW50KGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9uZyhQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgbG9uZyB2YWwsIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzdG1udC5zZXRMb25nKGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBMb2NhbGUgdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0U3RyaW5nKHN0bW50LCBpZHgsIHZhbC5nZXRMYW5ndWFnZSgpICsgIl8iICsgdmFsLmdldENvdW50cnkoKQorICAgICAgICAgICAgKyAiXyIgKyB2YWwuZ2V0VmFyaWFudCgpLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBwYXJhbWV0ZXJzIHRvIHRoZSBzdGF0ZW1lbnQuIFRoZSBjb2x1bW4KKyAgICAgKiB0eXBlIHdpbGwgY29tZSBmcm9tIHtAbGluayBUeXBlc30uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVsbChQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgaW50IGNvbFR5cGUsCisgICAgICAgIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzdG1udC5zZXROdWxsKGlkeCwgY29sVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgTnVtYmVyIG51bSwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNoZWNrIGZvciBrbm93biBmbG9hdGluZyBwb2ludCB0eXBlcyB0byBnaXZlIGRyaXZlciBhIGNoYW5jZSB0bworICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBudW1iZXJzIGxpa2UgTmFOIGFuZCBpbmZpbml0eTsgYnVnICMxMDUzCisgICAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBEb3VibGUpCisgICAgICAgICAgICBzZXREb3VibGUoc3RtbnQsIGlkeCwgKChEb3VibGUpIG51bSkuZG91YmxlVmFsdWUoKSwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAobnVtIGluc3RhbmNlb2YgRmxvYXQpCisgICAgICAgICAgICBzZXRGbG9hdChzdG1udCwgaWR4LCAoKEZsb2F0KSBudW0pLmZsb2F0VmFsdWUoKSwgY29sKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0QmlnRGVjaW1hbChzdG1udCwgaWR4LCBuZXcgQmlnRGVjaW1hbChudW0udG9TdHJpbmcoKSksIGNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlcnMgdG8gdGhlIHN0YXRlbWVudC4gVGhlIGNvbHVtbgorICAgICAqIHR5cGUgd2lsbCBjb21lIGZyb20ge0BsaW5rIFR5cGVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIE9iamVjdCB2YWwsCisgICAgICAgIGludCBjb2xUeXBlLCBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNvbFR5cGUgPT0gLTEgfHwgY29sVHlwZSA9PSBUeXBlcy5PVEhFUikKKyAgICAgICAgICAgIHN0bW50LnNldE9iamVjdChpZHgsIHZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0bW50LnNldE9iamVjdChpZHgsIHZhbCwgY29sVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZihQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgUmVmIHZhbCwgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN0bW50LnNldFJlZihpZHgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0KFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBzaG9ydCB2YWwsCisgICAgICAgIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzdG1udC5zZXRTaG9ydChpZHgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgU3RyaW5nIHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN0bW50LnNldFN0cmluZyhpZHgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHBhcmFtZXRlciB0byB0aGUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIFRpbWUgdmFsLAorICAgICAgICBDYWxlbmRhciBjYWwsIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoY2FsID09IG51bGwpCisgICAgICAgICAgICBzdG1udC5zZXRUaW1lKGlkeCwgdmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RtbnQuc2V0VGltZShpZHgsIHZhbCwgY2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LAorICAgICAgICBUaW1lc3RhbXAgdmFsLCBDYWxlbmRhciBjYWwsIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgaW5zZXJ0IGRhdGVzIGF0IGEgZ3JlYXRlciBwcmVjaXNpb24gdGhhbgorICAgICAgICAvLyB0aGF0IGF0IHdoaWNoIHRoZXkgd2lsbCBiZSByZXR1cm5lZCBieSBhIFNFTEVDVAorICAgICAgICBpbnQgcm91bmRlZCA9IChpbnQpIE1hdGgucm91bmQodmFsLmdldE5hbm9zKCkgLworICAgICAgICAgICAgKGRvdWJsZSkgZGF0ZVByZWNpc2lvbik7CisgICAgICAgIGludCBuYW5vcyA9IHJvdW5kZWQgKiBkYXRlUHJlY2lzaW9uOworICAgICAgICBpZiAobmFub3MgPiA5OTk5OTk5OTkpIHsKKyAgICAgICAgICAgIC8vIHJvbGxvdmVyIHRvIG5leHQgc2Vjb25kCisgICAgICAgICAgICB2YWwuc2V0VGltZSh2YWwuZ2V0VGltZSgpICsgMTAwMCk7CisgICAgICAgICAgICBuYW5vcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VwcG9ydHNUaW1lc3RhbXBOYW5vcykKKyAgICAgICAgICAgIHZhbC5zZXROYW5vcyhuYW5vcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbC5zZXROYW5vcygwKTsKKworICAgICAgICBpZiAoY2FsID09IG51bGwpCisgICAgICAgICAgICBzdG1udC5zZXRUaW1lc3RhbXAoaWR4LCB2YWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG1udC5zZXRUaW1lc3RhbXAoaWR4LCB2YWwsIGNhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgY29sdW1uIHZhbHVlIGludG8gYSBwcmVwYXJlZCBzdGF0ZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RtbnQgdGhlIHByZXBhcmVkIHN0YXRlbWVudCB0byBwYXJhbWV0ZXJpemUKKyAgICAgKiBAcGFyYW0gaWR4IHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uCisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIGJlaW5nIHNldAorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBmaWVsZCBtYXBwaW5nIHR5cGUgY29kZSBmb3IgdGhlIHZhbHVlCisgICAgICogQHBhcmFtIHN0b3JlIHRoZSBzdG9yZSBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZWQoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIE9iamVjdCB2YWwsCisgICAgICAgIENvbHVtbiBjb2wsIGludCB0eXBlLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldE51bGwoc3RtbnQsIGlkeCwgKGNvbCA9PSBudWxsKSA/IFR5cGVzLk9USEVSIDogY29sLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICBjb2wpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2l6ZWQgczsKKyAgICAgICAgQ2FsZW5kYXJkIGM7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgICAgIHNldEJvb2xlYW4oc3RtbnQsIGlkeCwgKChCb29sZWFuKSB2YWwpLmJvb2xlYW5WYWx1ZSgpLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgICAgIHNldEJ5dGUoc3RtbnQsIGlkeCwgKChOdW1iZXIpIHZhbCkuYnl0ZVZhbHVlKCksIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgc2V0Q2hhcihzdG1udCwgaWR4LCAoKENoYXJhY3RlcikgdmFsKS5jaGFyVmFsdWUoKSwgY29sKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgc2V0RG91YmxlKHN0bW50LCBpZHgsICgoTnVtYmVyKSB2YWwpLmRvdWJsZVZhbHVlKCksIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgICAgICBzZXRGbG9hdChzdG1udCwgaWR4LCAoKE51bWJlcikgdmFsKS5mbG9hdFZhbHVlKCksIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgIHNldEludChzdG1udCwgaWR4LCAoKE51bWJlcikgdmFsKS5pbnRWYWx1ZSgpLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkdfT0JKOgorICAgICAgICAgICAgICAgIHNldExvbmcoc3RtbnQsIGlkeCwgKChOdW1iZXIpIHZhbCkubG9uZ1ZhbHVlKCksIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgICAgICBzZXRTaG9ydChzdG1udCwgaWR4LCAoKE51bWJlcikgdmFsKS5zaG9ydFZhbHVlKCksIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKGNvbCAhPSBudWxsICYmIChjb2wuZ2V0VHlwZSgpID09IFR5cGVzLkNMT0IKKyAgICAgICAgICAgICAgICAgICAgfHwgY29sLmdldFR5cGUoKSA9PSBUeXBlcy5MT05HVkFSQ0hBUikpCisgICAgICAgICAgICAgICAgICAgIHNldENsb2JTdHJpbmcoc3RtbnQsIGlkeCwgKFN0cmluZykgdmFsLCBjb2wpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RyaW5nKHN0bW50LCBpZHgsIChTdHJpbmcpIHZhbCwgY29sKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICBzZXRCbG9iT2JqZWN0KHN0bW50LCBpZHgsIHZhbCwgY29sLCBzdG9yZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgIHNldERhdGUoc3RtbnQsIGlkeCwgKERhdGUpIHZhbCwgY29sKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNBTEVOREFSOgorICAgICAgICAgICAgICAgIHNldENhbGVuZGFyKHN0bW50LCBpZHgsIChDYWxlbmRhcikgdmFsLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHREVDSU1BTDoKKyAgICAgICAgICAgICAgICBzZXRCaWdEZWNpbWFsKHN0bW50LCBpZHgsIChCaWdEZWNpbWFsKSB2YWwsIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdJTlRFR0VSOgorICAgICAgICAgICAgICAgIHNldEJpZ0ludGVnZXIoc3RtbnQsIGlkeCwgKEJpZ0ludGVnZXIpIHZhbCwgY29sKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk5VTUJFUjoKKyAgICAgICAgICAgICAgICBzZXROdW1iZXIoc3RtbnQsIGlkeCwgKE51bWJlcikgdmFsLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9DQUxFOgorICAgICAgICAgICAgICAgIHNldExvY2FsZShzdG1udCwgaWR4LCAoTG9jYWxlKSB2YWwsIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5TUUxfQVJSQVk6CisgICAgICAgICAgICAgICAgc2V0QXJyYXkoc3RtbnQsIGlkeCwgKEFycmF5KSB2YWwsIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5BU0NJSV9TVFJFQU06CisgICAgICAgICAgICAgICAgcyA9IChTaXplZCkgdmFsOworICAgICAgICAgICAgICAgIHNldEFzY2lpU3RyZWFtKHN0bW50LCBpZHgsIChJbnB1dFN0cmVhbSkgcy52YWx1ZSwgcy5zaXplLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuQklOQVJZX1NUUkVBTToKKyAgICAgICAgICAgICAgICBzID0gKFNpemVkKSB2YWw7CisgICAgICAgICAgICAgICAgc2V0QmluYXJ5U3RyZWFtKHN0bW50LCBpZHgsIChJbnB1dFN0cmVhbSkgcy52YWx1ZSwgcy5zaXplLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuQkxPQjoKKyAgICAgICAgICAgICAgICBzZXRCbG9iKHN0bW50LCBpZHgsIChCbG9iKSB2YWwsIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5CWVRFUzoKKyAgICAgICAgICAgICAgICBzZXRCeXRlcyhzdG1udCwgaWR4LCAoYnl0ZVtdKSB2YWwsIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5DSEFSX1NUUkVBTToKKyAgICAgICAgICAgICAgICBzID0gKFNpemVkKSB2YWw7CisgICAgICAgICAgICAgICAgc2V0Q2hhcmFjdGVyU3RyZWFtKHN0bW50LCBpZHgsIChSZWFkZXIpIHMudmFsdWUsIHMuc2l6ZSwgY29sKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLkNMT0I6CisgICAgICAgICAgICAgICAgc2V0Q2xvYihzdG1udCwgaWR4LCAoQ2xvYikgdmFsLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuU1FMX0RBVEU6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIENhbGVuZGFyZCkgeworICAgICAgICAgICAgICAgICAgICBjID0gKENhbGVuZGFyZCkgdmFsOworICAgICAgICAgICAgICAgICAgICBzZXREYXRlKHN0bW50LCBpZHgsIChqYXZhLnNxbC5EYXRlKSBjLnZhbHVlLCBjLmNhbGVuZGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29sKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2V0RGF0ZShzdG1udCwgaWR4LCAoamF2YS5zcWwuRGF0ZSkgdmFsLCBudWxsLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuUkVGOgorICAgICAgICAgICAgICAgIHNldFJlZihzdG1udCwgaWR4LCAoUmVmKSB2YWwsIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5USU1FOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBDYWxlbmRhcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IChDYWxlbmRhcmQpIHZhbDsKKyAgICAgICAgICAgICAgICAgICAgc2V0VGltZShzdG1udCwgaWR4LCAoVGltZSkgYy52YWx1ZSwgYy5jYWxlbmRhciwgY29sKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2V0VGltZShzdG1udCwgaWR4LCAoVGltZSkgdmFsLCBudWxsLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBDYWxlbmRhcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IChDYWxlbmRhcmQpIHZhbDsKKyAgICAgICAgICAgICAgICAgICAgc2V0VGltZXN0YW1wKHN0bW50LCBpZHgsIChUaW1lc3RhbXApIGMudmFsdWUsIGMuY2FsZW5kYXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2wpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBzZXRUaW1lc3RhbXAoc3RtbnQsIGlkeCwgKFRpbWVzdGFtcCkgdmFsLCBudWxsLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoY29sICE9IG51bGwgJiYgKGNvbC5nZXRUeXBlKCkgPT0gVHlwZXMuQkxPQgorICAgICAgICAgICAgICAgICAgICB8fCBjb2wuZ2V0VHlwZSgpID09IFR5cGVzLlZBUkJJTkFSWSkpCisgICAgICAgICAgICAgICAgICAgIHNldEJsb2JPYmplY3Qoc3RtbnQsIGlkeCwgdmFsLCBjb2wsIHN0b3JlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNldE9iamVjdChzdG1udCwgaWR4LCB2YWwsIGNvbC5nZXRUeXBlKCksIGNvbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjb21wbGV0ZWx5IHVua25vd24gcGFyYW1ldGVyIGludG8gYSBwcmVwYXJlZCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5rbm93bihQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgT2JqZWN0IHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFNpemVkIHNpemVkID0gbnVsbDsKKyAgICAgICAgQ2FsZW5kYXJkIGNhbGQgPSBudWxsOworICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgU2l6ZWQpIHsKKyAgICAgICAgICAgIHNpemVkID0gKFNpemVkKSB2YWw7CisgICAgICAgICAgICB2YWwgPSBzaXplZC52YWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBDYWxlbmRhcmQpIHsKKyAgICAgICAgICAgIGNhbGQgPSAoQ2FsZW5kYXJkKSB2YWw7CisgICAgICAgICAgICB2YWwgPSBjYWxkLnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgc2V0TnVsbChzdG1udCwgaWR4LCAoY29sID09IG51bGwpID8gVHlwZXMuT1RIRVIgOiBjb2wuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgIHNldFN0cmluZyhzdG1udCwgaWR4LCB2YWwudG9TdHJpbmcoKSwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgSW50ZWdlcikKKyAgICAgICAgICAgIHNldEludChzdG1udCwgaWR4LCAoKEludGVnZXIpIHZhbCkuaW50VmFsdWUoKSwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikKKyAgICAgICAgICAgIHNldEJvb2xlYW4oc3RtbnQsIGlkeCwgKChCb29sZWFuKSB2YWwpLmJvb2xlYW5WYWx1ZSgpLCBjb2wpOworICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBMb25nKQorICAgICAgICAgICAgc2V0TG9uZyhzdG1udCwgaWR4LCAoKExvbmcpIHZhbCkubG9uZ1ZhbHVlKCksIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEZsb2F0KQorICAgICAgICAgICAgc2V0RmxvYXQoc3RtbnQsIGlkeCwgKChGbG9hdCkgdmFsKS5mbG9hdFZhbHVlKCksIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIERvdWJsZSkKKyAgICAgICAgICAgIHNldERvdWJsZShzdG1udCwgaWR4LCAoKERvdWJsZSkgdmFsKS5kb3VibGVWYWx1ZSgpLCBjb2wpOworICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBCeXRlKQorICAgICAgICAgICAgc2V0Qnl0ZShzdG1udCwgaWR4LCAoKEJ5dGUpIHZhbCkuYnl0ZVZhbHVlKCksIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIENoYXJhY3RlcikKKyAgICAgICAgICAgIHNldENoYXIoc3RtbnQsIGlkeCwgKChDaGFyYWN0ZXIpIHZhbCkuY2hhclZhbHVlKCksIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFNob3J0KQorICAgICAgICAgICAgc2V0U2hvcnQoc3RtbnQsIGlkeCwgKChTaG9ydCkgdmFsKS5zaG9ydFZhbHVlKCksIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIExvY2FsZSkKKyAgICAgICAgICAgIHNldExvY2FsZShzdG1udCwgaWR4LCAoTG9jYWxlKSB2YWwsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpCisgICAgICAgICAgICBzZXRCaWdEZWNpbWFsKHN0bW50LCBpZHgsIChCaWdEZWNpbWFsKSB2YWwsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpCisgICAgICAgICAgICBzZXRCaWdJbnRlZ2VyKHN0bW50LCBpZHgsIChCaWdJbnRlZ2VyKSB2YWwsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KQorICAgICAgICAgICAgc2V0QXJyYXkoc3RtbnQsIGlkeCwgKEFycmF5KSB2YWwsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEJsb2IpCisgICAgICAgICAgICBzZXRCbG9iKHN0bW50LCBpZHgsIChCbG9iKSB2YWwsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIGJ5dGVbXSkKKyAgICAgICAgICAgIHNldEJ5dGVzKHN0bW50LCBpZHgsIChieXRlW10pIHZhbCwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQ2xvYikKKyAgICAgICAgICAgIHNldENsb2Ioc3RtbnQsIGlkeCwgKENsb2IpIHZhbCwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgUmVmKQorICAgICAgICAgICAgc2V0UmVmKHN0bW50LCBpZHgsIChSZWYpIHZhbCwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgamF2YS5zcWwuRGF0ZSkKKyAgICAgICAgICAgIHNldERhdGUoc3RtbnQsIGlkeCwgKGphdmEuc3FsLkRhdGUpIHZhbCwKKyAgICAgICAgICAgICAgICAoY2FsZCA9PSBudWxsKSA/IG51bGwgOiBjYWxkLmNhbGVuZGFyLCBjb2wpOworICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBUaW1lc3RhbXApCisgICAgICAgICAgICBzZXRUaW1lc3RhbXAoc3RtbnQsIGlkeCwgKFRpbWVzdGFtcCkgdmFsLAorICAgICAgICAgICAgICAgIChjYWxkID09IG51bGwpID8gbnVsbCA6IGNhbGQuY2FsZW5kYXIsIGNvbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFRpbWUpCisgICAgICAgICAgICBzZXRUaW1lKHN0bW50LCBpZHgsIChUaW1lKSB2YWwsCisgICAgICAgICAgICAgICAgKGNhbGQgPT0gbnVsbCkgPyBudWxsIDogY2FsZC5jYWxlbmRhciwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkKKyAgICAgICAgICAgIHNldERhdGUoc3RtbnQsIGlkeCwgKERhdGUpIHZhbCwgY29sKTsKKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQ2FsZW5kYXIpCisgICAgICAgICAgICBzZXREYXRlKHN0bW50LCBpZHgsICgoQ2FsZW5kYXIpIHZhbCkuZ2V0VGltZSgpLCBjb2wpOworICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBSZWFkZXIpCisgICAgICAgICAgICBzZXRDaGFyYWN0ZXJTdHJlYW0oc3RtbnQsIGlkeCwgKFJlYWRlcikgdmFsLAorICAgICAgICAgICAgICAgIChzaXplZCA9PSBudWxsKSA/IDAgOiBzaXplZC5zaXplLCBjb2wpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXBhcmFtIiwgdmFsLmdldENsYXNzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcmlhbGl6ZWQgYnl0ZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBzZXJpYWxpemUoT2JqZWN0IHZhbCwgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTZXJpYWxpemVkRGF0YSkKKyAgICAgICAgICAgIHJldHVybiAoKFNlcmlhbGl6ZWREYXRhKSB2YWwpLmJ5dGVzOworICAgICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5zZXJpYWxpemUodmFsLCBzdG9yZS5nZXRDb250ZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgSkRLIDEuNCA8Y29kZT5zZXRCeXRlczwvY29kZT4gbWV0aG9kIG9uIHRoZSBnaXZlbiBCTE9CIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXRCeXRlcyhPYmplY3QgYmxvYiwgYnl0ZVtdIGRhdGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX3NldEJ5dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3NldEJ5dGVzID0gYmxvYi5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0Qnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgbG9uZy5jbGFzcywgYnl0ZVtdLmNsYXNzIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW52b2tlUHV0TG9iTWV0aG9kKF9zZXRCeXRlcywgYmxvYiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgTnVtYmVycy52YWx1ZU9mKDFMKSwgZGF0YSB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIEpESyAxLjQgPGNvZGU+c2V0U3RyaW5nPC9jb2RlPiBtZXRob2Qgb24gdGhlIGdpdmVuIENMT0IKKyAgICAgKiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0U3RyaW5nKE9iamVjdCBjbG9iLCBTdHJpbmcgZGF0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfc2V0U3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3NldFN0cmluZyA9IGNsb2IuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldFN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBsb25nLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnZva2VQdXRMb2JNZXRob2QoX3NldFN0cmluZywgY2xvYiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgTnVtYmVycy52YWx1ZU9mKDFMKSwgZGF0YSB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIEpESyAxLjQgPGNvZGU+c2V0Q2hhcmFjdGVyU3RyZWFtPC9jb2RlPiBtZXRob2Qgb24gdGhlIGdpdmVuCisgICAgICogQ0xPQiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0Q2hhcnMoT2JqZWN0IGNsb2IsIGNoYXJbXSBkYXRhKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9zZXRDaGFyU3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3NldENoYXJTdHJlYW0gPSBjbG9iLmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgICAgICgic2V0Q2hhcmFjdGVyU3RyZWFtIiwgbmV3IENsYXNzW117IGxvbmcuY2xhc3MgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFdyaXRlciB3cml0ZXIgPSAoV3JpdGVyKSBpbnZva2VQdXRMb2JNZXRob2QoX3NldENoYXJTdHJlYW0sIGNsb2IsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117IE51bWJlcnMudmFsdWVPZigxTCkgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoZGF0YSk7CisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKGlvZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgZ2l2ZW4gTE9CIG1ldGhvZCBvbiB0aGUgZ2l2ZW4gdGFyZ2V0IHdpdGggdGhlIGdpdmVuIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGludm9rZVB1dExvYk1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgdGFyZ2V0LAorICAgICAgICBPYmplY3RbXSBhcmdzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgU1FMRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93KFNRTEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdhcm4gdGhhdCBhIHBhcnRpY3VsYXIgdmFsdWUgY291bGQgbm90IGJlIHN0b3JlZCBwcmVjaXNlbHkuCisgICAgICogQWZ0ZXIgdGhlIGZpcnN0IHdhcm5pbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLCBtZXNzYWdlcworICAgICAqIHdpbGwgYmUgdHVybmVkIGludG8gdHJhY2UgbWVzc2FnZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmFnZVdhcm5pbmcoT2JqZWN0IG9yaWcsIE9iamVjdCBjb252ZXJ0ZWQpIHsKKyAgICAgICAgYm9vbGVhbiB3YXJuOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChfcHJlY2lzaW9uV2FybmVkVHlwZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfcHJlY2lzaW9uV2FybmVkVHlwZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgd2FybiA9IF9wcmVjaXNpb25XYXJuZWRUeXBlcy5hZGQob3JpZy5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdG9yYWdlTGltaXRhdGlvbnNGYXRhbCB8fCAod2FybiAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgfHwgKCF3YXJuICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBfbG9jLmdldCgic3RvcmFnZS1yZXN0cmljdGlvbiIsIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICBvcmlnLAorICAgICAgICAgICAgICAgIG9yaWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgY29udmVydGVkLAorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmIChzdG9yYWdlTGltaXRhdGlvbnNGYXRhbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24obXNnKTsKKworICAgICAgICAgICAgaWYgKHdhcm4pCisgICAgICAgICAgICAgICAgbG9nLndhcm4obXNnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLworICAgIC8vIFR5cGVzCisgICAgLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZWZlcnJlZCB7QGxpbmsgVHlwZXN9IGNvbnN0YW50IGZvciB0aGUgZ2l2ZW4KKyAgICAgKiB7QGxpbmsgSmF2YVR5cGVzfSBvciB7QGxpbmsgSmF2YVNRTFR5cGVzfSBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpEQkNUeXBlKGludCBtZXRhVHlwZUNvZGUsIGJvb2xlYW4gbG9iKSB7CisgICAgICAgIGlmIChsb2IpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobWV0YVR5cGVDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLkFTQ0lJX1NUUkVBTToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5DSEFSX1NUUkVBTToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZFR5cGUoVHlwZXMuQ0xPQik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZFR5cGUoVHlwZXMuQkxPQik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1ldGFUeXBlQ29kZSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkJJVCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZFR5cGUoVHlwZXMuVElOWUlOVCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlQ2hhcnNBc051bWJlcnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLklOVEVHRVIpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkNIQVIpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5ET1VCTEUpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZFR5cGUoVHlwZXMuUkVBTCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLklOVEVHRVIpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkdfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkJJR0lOVCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5TTUFMTElOVCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT0NBTEU6CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5BU0NJSV9TVFJFQU06CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5DSEFSX1NUUkVBTToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5WQVJDSEFSKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0lOVEVHRVI6CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlTGFyZ2VOdW1iZXJzQXNTdHJpbmdzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5WQVJDSEFSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5CSUdJTlQpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHREVDSU1BTDoKKyAgICAgICAgICAgICAgICBpZiAoc3RvcmVMYXJnZU51bWJlcnNBc1N0cmluZ3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLlZBUkNIQVIpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkRPVUJMRSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlTGFyZ2VOdW1iZXJzQXNTdHJpbmdzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5WQVJDSEFSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5OVU1FUklDKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNBTEVOREFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkVHlwZShUeXBlcy5USU1FU1RBTVApOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuU1FMX0FSUkFZOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkFSUkFZKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLkJJTkFSWV9TVFJFQU06CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5CTE9COgorICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuQllURVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZFR5cGUoVHlwZXMuQkxPQik7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkNMT0IpOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuU1FMX0RBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByZWZlcnJlZFR5cGUoVHlwZXMuREFURSk7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5USU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLlRJTUUpOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLlRJTUVTVEFNUCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLkJMT0IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmVmZXJyZWQge0BsaW5rIFR5cGVzfSB0eXBlIGZvciB0aGUgZ2l2ZW4gb25lLiBSZXR1cm5zCisgICAgICogdGhlIGdpdmVuIHR5cGUgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByZWZlcnJlZFR5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmVmZXJyZWQgZGF0YWJhc2UgdHlwZSBuYW1lIGZvciB0aGUgZ2l2ZW4gY29sdW1uJ3MgdHlwZQorICAgICAqIGZyb20ge0BsaW5rIFR5cGVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGNvbC5nZXRUeXBlTmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBhcHBlbmRTaXplKGNvbCwgY29sLmdldFR5cGVOYW1lKCkpOworCisgICAgICAgIGlmIChjb2wuaXNBdXRvQXNzaWduZWQoKSAmJiBhdXRvQXNzaWduVHlwZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhcHBlbmRTaXplKGNvbCwgYXV0b0Fzc2lnblR5cGVOYW1lKTsKKworICAgICAgICByZXR1cm4gYXBwZW5kU2l6ZShjb2wsIGdldFR5cGVOYW1lKGNvbC5nZXRUeXBlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBjb25zdGFudCBhcyBkZWZpbmVkCisgICAgICogYnkge0BsaW5rIGphdmEuc3FsLlR5cGVzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCisgICAgICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKGludCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklHSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBiaWdpbnRUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklOQVJZOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklUOgorICAgICAgICAgICAgICAgIHJldHVybiBiaXRUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQkxPQjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvYlR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSAxNjogLy8gSkRLIDEuNCBpbnRyb2R1Y2VzIFR5cGVzLkJPT0xFQU4sIHdob3NlIHZhbHVlIGlzIDE2CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvb2xlYW5UeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhclR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHJldHVybiBjbG9iVHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjaW1hbFR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5ESVNUSU5DVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGluY3RUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGVUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0VHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLklOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXJUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuSkFWQV9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGphdmFPYmplY3RUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTE9OR1ZBUkJJTkFSWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZ1ZhcmJpbmFyeVR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5MT05HVkFSQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZ1ZhcmNoYXJUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTlVMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5OVU1FUklDOgorICAgICAgICAgICAgICAgIHJldHVybiBudW1lcmljVHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLk9USEVSOgorICAgICAgICAgICAgICAgIHJldHVybiBvdGhlclR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5SRUFMOgorICAgICAgICAgICAgICAgIHJldHVybiByZWFsVHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlJFRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVmVHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlNNQUxMSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBzbWFsbGludFR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdFR5cGVOYW1lOworICAgICAgICAgICAgY2FzZSBUeXBlcy5USU1FOgorICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUVTVEFNUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wVHlwZU5hbWU7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlRJTllJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRpbnlpbnRUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQklOQVJZOgorICAgICAgICAgICAgICAgIHJldHVybiB2YXJiaW5hcnlUeXBlTmFtZTsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFyY2hhclR5cGVOYW1lOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXJUeXBlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIHNpemUgcHJvcGVydGllcyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICogSWYgcHJlc2VudCwgdGhlIHN0cmluZyAiezB9IiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHNpemUgZGVmaW5pdGlvbjsKKyAgICAgKiBvdGhlcndpc2UgdGhlIHNpemUgZGVmaW5pdGlvbiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSB0eXBlIG5hbWUuCisgICAgICogSWYgeW91ciBkYXRhYmFzZSBoYXMgY29sdW1uIHR5cGVzIHRoYXQgZG9uJ3QgYWxsb3cgc2l6ZSBkZWZpbml0aW9ucywKKyAgICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlIHVuYWx0ZXJlZCB0eXBlIG5hbWUgZm9yIGNvbHVtbnMgb2YKKyAgICAgKiB0aG9zZSB0eXBlcyAob3IgYWRkIHRoZSB0eXBlIG5hbWVzIHRvIHRoZQorICAgICAqIDxjb2RlPmZpeGVkU2l6ZVR5cGVOYW1lU2V0PC9jb2RlPikuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhcHBlbmRTaXplKENvbHVtbiBjb2wsIFN0cmluZyB0eXBlTmFtZSkgeworICAgICAgICBpZiAoZml4ZWRTaXplVHlwZU5hbWVTZXQuY29udGFpbnModHlwZU5hbWUudG9VcHBlckNhc2UoKSkpCisgICAgICAgICAgICByZXR1cm4gdHlwZU5hbWU7CisgICAgICAgIGlmICh0eXBlTmFtZS5pbmRleE9mKCcoJykgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gdHlwZU5hbWU7CisKKyAgICAgICAgU3RyaW5nIHNpemUgPSBudWxsOworICAgICAgICBpZiAoY29sLmdldFNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIigiKS5hcHBlbmQoY29sLmdldFNpemUoKSk7CisgICAgICAgICAgICBpZiAoY29sLmdldERlY2ltYWxEaWdpdHMoKSA+IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoY29sLmdldERlY2ltYWxEaWdpdHMoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgICAgICBzaXplID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaWR4ID0gdHlwZU5hbWUuaW5kZXhPZigiezB9Iik7CisgICAgICAgIGlmIChpZHggPT0gLTEgJiYgc2l6ZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHR5cGVOYW1lICsgc2l6ZTsKKyAgICAgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiB0eXBlTmFtZTsKKworICAgICAgICAvLyByZXBsYWNlICd7MH0nIHdpdGggc2l6ZQorICAgICAgICBTdHJpbmcgcmV0ID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGlkeCk7CisgICAgICAgIGlmIChzaXplICE9IG51bGwpCisgICAgICAgICAgICByZXQgPSByZXQgKyBzaXplOworICAgICAgICBpZiAodHlwZU5hbWUubGVuZ3RoKCkgPiBpZHggKyAzKQorICAgICAgICAgICAgcmV0ID0gcmV0ICsgdHlwZU5hbWUuc3Vic3RyaW5nKGlkeCArIDMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vCisgICAgLy8gU2VsZWN0cworICAgIC8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGpvaW4gc3ludGF4IHRvIHVzZTogc3FsOTIsIHRyYWRpdGlvbmFsLCBkYXRhYmFzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpvaW5TeW50YXgoU3RyaW5nIHN5bnRheCkgeworICAgICAgICBpZiAoInNxbDkyIi5lcXVhbHMoc3ludGF4KSkKKyAgICAgICAgICAgIGpvaW5TeW50YXggPSBTWU5UQVhfU1FMOTI7CisgICAgICAgIGVsc2UgaWYgKCJ0cmFkaXRpb25hbCIuZXF1YWxzKHN5bnRheCkpCisgICAgICAgICAgICBqb2luU3ludGF4ID0gU1lOVEFYX1RSQURJVElPTkFMOworICAgICAgICBlbHNlIGlmICgiZGF0YWJhc2UiLmVxdWFscyhzeW50YXgpKQorICAgICAgICAgICAgam9pblN5bnRheCA9IFNZTlRBWF9EQVRBQkFTRTsKKyAgICAgICAgZWxzZSBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoc3ludGF4KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc3ludGF4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTUUwgc3RyaW5nIHRvIGFjdCBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGxhY2Vob2xkZXJWYWx1ZVN0cmluZyhDb2x1bW4gY29sKSB7CisgICAgICAgIHN3aXRjaCAoY29sLmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlcy5CSUdJTlQ6CisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVDoKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuSU5URUdFUjoKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTlVNRVJJQzoKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuU01BTExJTlQ6CisgICAgICAgICAgICBjYXNlIFR5cGVzLlRJTllJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0b3JlQ2hhcnNBc051bWJlcnMpID8gIjAiIDogIicgJyI7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkNMT0I6CisgICAgICAgICAgICBjYXNlIFR5cGVzLkxPTkdWQVJDSEFSOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5WQVJDSEFSOgorICAgICAgICAgICAgICAgIHJldHVybiAiJyciOworICAgICAgICAgICAgY2FzZSBUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBaRVJPX0RBVEVfU1RSOworICAgICAgICAgICAgY2FzZSBUeXBlcy5ERUNJTUFMOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIFR5cGVzLkZMT0FUOgorICAgICAgICAgICAgY2FzZSBUeXBlcy5SRUFMOgorICAgICAgICAgICAgICAgIHJldHVybiAiMC4wIjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gWkVST19USU1FX1NUUjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIHJldHVybiBaRVJPX1RJTUVTVEFNUF9TVFI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBTRUxFQ1QgQ09VTlQgc3RhdGVtZW50IGluIHRoZSBwcm9wZXIgam9pbiBzeW50YXggZm9yIHRoZQorICAgICAqIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3RDb3VudChTZWxlY3Qgc2VsKSB7CisgICAgICAgIFNRTEJ1ZmZlciBzZWxlY3RTUUwgPSBuZXcgU1FMQnVmZmVyKHRoaXMpOworICAgICAgICBTUUxCdWZmZXIgZnJvbTsKKyAgICAgICAgc2VsLmFkZEpvaW5DbGFzc0NvbmRpdGlvbnMoKTsKKyAgICAgICAgaWYgKHNlbC5nZXRGcm9tU2VsZWN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGZyb20gPSBnZXRGcm9tU2VsZWN0KHNlbCwgZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcm9tID0gZ2V0RnJvbShzZWwsIGZhbHNlKTsKKyAgICAgICAgU1FMQnVmZmVyIHdoZXJlID0gZ2V0V2hlcmUoc2VsLCBmYWxzZSk7CisKKyAgICAgICAgLy8gaWYgbm8gZ3JvdXBpbmcgYW5kIG5vIHJhbmdlLCB3ZSBtaWdodCBiZSBhYmxlIHRvIGdldCBieSB3aXRob3V0CisgICAgICAgIC8vIGEgc3Vic2VsZWN0CisgICAgICAgIGlmIChzZWwuZ2V0R3JvdXBpbmcoKSA9PSBudWxsICYmIHNlbC5nZXRTdGFydEluZGV4KCkgPT0gMAorICAgICAgICAgICAgJiYgc2VsLmdldEVuZEluZGV4KCkgPT0gTG9uZy5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBzZWxlY3QgaGFzIG5vIGlkZW50aWZpZXIgY29scywgdXNlIENPVU5UKCopCisgICAgICAgICAgICBMaXN0IGFsaWFzZXMgPSAoIXNlbC5pc0Rpc3RpbmN0KCkpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVAorICAgICAgICAgICAgICAgIDogc2VsLmdldElkZW50aWZpZXJBbGlhc2VzKCk7CisgICAgICAgICAgICBpZiAoYWxpYXNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RTUUwuYXBwZW5kKCJDT1VOVCgqKSIpOworICAgICAgICAgICAgICAgIHJldHVybiB0b1NlbGVjdChzZWxlY3RTUUwsIG51bGwsIGZyb20sIHdoZXJlLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDAsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBzaW5nbGUgZGlzdGluY3QgY29sLCB1c2UgQ09VTlQoRElTVElOQ1QgY29sKQorICAgICAgICAgICAgaWYgKGFsaWFzZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RTUUwuYXBwZW5kKCJDT1VOVChESVNUSU5DVCAiKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKGFsaWFzZXMuZ2V0KDApLnRvU3RyaW5nKCkpLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgICAgIHJldHVybiB0b1NlbGVjdChzZWxlY3RTUUwsIG51bGwsIGZyb20sIHdoZXJlLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIDAsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2FuIHdlIGNvbWJpbmUgZGlzdGluY3QgY29scz8KKyAgICAgICAgICAgIGlmIChkaXN0aW5jdENvdW50Q29sdW1uU2VwYXJhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RTUUwuYXBwZW5kKCJDT1VOVChESVNUSU5DVCAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RTUUwuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RTUUwuYXBwZW5kKGRpc3RpbmN0Q291bnRDb2x1bW5TZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0U1FMLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdFNRTC5hcHBlbmQoYWxpYXNlcy5nZXQoaSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGVjdFNRTC5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9TZWxlY3Qoc2VsZWN0U1FMLCBudWxsLCBmcm9tLCB3aGVyZSwgbnVsbCwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzaW5jZSB3ZSBjYW4ndCBjb21iaW5lIGRpc3RpbmN0IGNvbHMsIHdlIGhhdmUgdG8gcGVyZm9ybSBhbiBvdXRlcgorICAgICAgICAvLyBDT1VOVCgqKSBzZWxlY3QgdXNpbmcgdGhlIG9yaWdpbmFsIHNlbGVjdCBhcyBhIHN1YnNlbGVjdCBpbiB0aGUKKyAgICAgICAgLy8gRlJPTSBjbGF1c2UKKyAgICAgICAgYXNzZXJ0U3VwcG9ydChzdXBwb3J0c1N1YnNlbGVjdCwgIlN1cHBvcnRzU3Vic2VsZWN0Iik7CisKKyAgICAgICAgU1FMQnVmZmVyIHN1YlNlbGVjdCA9IGdldFNlbGVjdHMoc2VsLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIFNRTEJ1ZmZlciBzdWJGcm9tID0gZnJvbTsKKyAgICAgICAgZnJvbSA9IG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgICAgIGZyb20uYXBwZW5kKCIoIik7CisgICAgICAgIGZyb20uYXBwZW5kKHRvU2VsZWN0KHN1YlNlbGVjdCwgbnVsbCwgc3ViRnJvbSwgd2hlcmUsCisgICAgICAgICAgICBzZWwuZ2V0R3JvdXBpbmcoKSwgc2VsLmdldEhhdmluZygpLCBudWxsLCBzZWwuaXNEaXN0aW5jdCgpLAorICAgICAgICAgICAgZmFsc2UsIHNlbC5nZXRTdGFydEluZGV4KCksIHNlbC5nZXRFbmRJbmRleCgpKSk7CisgICAgICAgIGZyb20uYXBwZW5kKCIpIik7CisgICAgICAgIGlmIChyZXF1aXJlc0FsaWFzRm9yU3Vic2VsZWN0KQorICAgICAgICAgICAgZnJvbS5hcHBlbmQoIiAiKS5hcHBlbmQoU2VsZWN0LkZST01fU0VMRUNUX0FMSUFTKTsKKworICAgICAgICBzZWxlY3RTUUwuYXBwZW5kKCJDT1VOVCgqKSIpOworICAgICAgICByZXR1cm4gdG9TZWxlY3Qoc2VsZWN0U1FMLCBudWxsLCBmcm9tLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwLCBMb25nLk1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgREVMRVRFIHN0YXRlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBTZWxlY3QuIElmIHRoZQorICAgICAqIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1bGsgZGVsZXRlIHN0YXRlbWVudCAoc3VjaCBhcworICAgICAqIGNhc2VzIHdoZXJlIGEgc3Vic2VsZWN0IGlzIHJlcXVpcmVkIGFuZCB0aGUgZGF0YWJhc2UgZG9lc24ndCBzdXBwb3J0CisgICAgICogc3Vic2VsZWN0cyksIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIHRvRGVsZXRlKENsYXNzTWFwcGluZyBtYXBwaW5nLCBTZWxlY3Qgc2VsLCAKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiB0b0J1bGtPcGVyYXRpb24obWFwcGluZywgc2VsLCBudWxsLCBwYXJhbXMsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9VcGRhdGUoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIFNlbGVjdCBzZWwsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgT2JqZWN0W10gcGFyYW1zLCBNYXAgdXBkYXRlcykgeworICAgICAgICByZXR1cm4gdG9CdWxrT3BlcmF0aW9uKG1hcHBpbmcsIHNlbCwgc3RvcmUsIHBhcmFtcywgdXBkYXRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgU1FMIGZvciBhIGJ1bGsgb3BlcmF0aW9uLCBlaXRoZXIgYSBERUxFVEUgb3IgYW4gVVBEQVRFLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgdGhlIG1hcHBuZyBhZ2FpbnN0IHdoaWNoIHdlIGFyZSBvcGVyYXRpbmcKKyAgICAgKiBAcGFyYW0gc2VsIHRoZSBTZWxlY3QgdGhhdCB3aWxsIGNvbnN0aXR1dGUgdGhlIFdIRVJFIGNsYXVzZQorICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgY3VycmVudCBzdG9yZQorICAgICAqIEBwYXJhbSB1cGRhdGVQYXJhbXMgdGhlIE1hcCB0aGF0IGhvbGRzIHRoZSB1cGRhdGUgcGFyYW1ldGVyczsgYSBudWxsCisgICAgICogdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIGRlbGV0ZSBvcGVyYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBTUUxCdWZmZXIgZm9yIHRoZSB1cGRhdGUsIG9yIDxlbT5udWxsPC9lbT4gaWYgaXQgaXMgbm90CisgICAgICogcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgYnVsayB1cGRhdGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU1FMQnVmZmVyIHRvQnVsa09wZXJhdGlvbihDbGFzc01hcHBpbmcgbWFwcGluZywgU2VsZWN0IHNlbCwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBPYmplY3RbXSBwYXJhbXMsIE1hcCB1cGRhdGVQYXJhbXMpIHsKKyAgICAgICAgU1FMQnVmZmVyIHNxbCA9IG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgICAgIGlmICh1cGRhdGVQYXJhbXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIkRFTEVURSBGUk9NICIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcWwuYXBwZW5kKCJVUERBVEUgIik7CisgICAgICAgIHNlbC5hZGRKb2luQ2xhc3NDb25kaXRpb25zKCk7CisKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSB0YWJsZSBpbiB0aGUgc2VsZWN0LCB0aGVuIHdlIGNhbgorICAgICAgICAvLyBqdXN0IGlzc3VlIGEgc2luZ2xlIERFTEVURSBGUk9NIFRBQkxFIFdIRVJFIDxjb25kaXRpb25zPgorICAgICAgICAvLyBzdGF0ZW1lbnQ7IG90aGVyd2lzZSwgc2luY2UgU1FMIGRvZXNuJ3QgYWxsb3cgZGVsZXRpbmcKKyAgICAgICAgLy8gZnJvbSBvbmUgb2YgYSBtdWx0aS10YWJsZSBzZWxlY3QsIHdlIG5lZWQgdG8gaXNzdWUgYSBzdWJzZWxlY3QKKyAgICAgICAgLy8gbGlrZSBERUxFVEUgRlJPTSBUQUJMRSBXSEVSRSBFWElTVFMKKyAgICAgICAgLy8gKFNFTEVDVCAxIEZST00gVEFCTEUgdDAgV0hFUkUgdDAuSUQgPSBUQUJMRS5JRCk7IGFsc28sIHNvbWUKKyAgICAgICAgLy8gZGF0YWJhc2VzIGRvIG5vdCBhbGxvdyBhbGlhc2VzIGluIGRlbGV0ZSBzdGF0ZW1lbnRzLCB3aGljaAorICAgICAgICAvLyBhbHNvIGNhdXNlcyB1cyB0byB1c2UgYSBzdWJzZWxlY3QKKyAgICAgICAgaWYgKHNlbC5nZXRUYWJsZUFsaWFzZXMoKS5zaXplKCkgPT0gMSAmJiBzdXBwb3J0c1N1YnNlbGVjdAorICAgICAgICAgICAgJiYgYWxsb3dzQWxpYXNJbkJ1bGtDbGF1c2UpIHsKKyAgICAgICAgICAgIFNRTEJ1ZmZlciBmcm9tOworICAgICAgICAgICAgaWYgKHNlbC5nZXRGcm9tU2VsZWN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmcm9tID0gZ2V0RnJvbVNlbGVjdChzZWwsIGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcm9tID0gZ2V0RnJvbShzZWwsIGZhbHNlKTsKKworICAgICAgICAgICAgc3FsLmFwcGVuZChmcm9tKTsKKyAgICAgICAgICAgIGFwcGVuZFVwZGF0ZXMoc2VsLCBzdG9yZSwgc3FsLCBwYXJhbXMsIHVwZGF0ZVBhcmFtcywKKyAgICAgICAgICAgICAgICBhbGxvd3NBbGlhc0luQnVsa0NsYXVzZSk7CisKKyAgICAgICAgICAgIFNRTEJ1ZmZlciB3aGVyZSA9IHNlbC5nZXRXaGVyZSgpOworICAgICAgICAgICAgaWYgKHdoZXJlICE9IG51bGwgJiYgIXdoZXJlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBXSEVSRSAiKTsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKHdoZXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzcWw7CisgICAgICAgIH0KKworICAgICAgICBUYWJsZSB0YWJsZSA9IG1hcHBpbmcuZ2V0VGFibGUoKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IGdldEZ1bGxOYW1lKHRhYmxlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gb25seSB1c2UgYSAgc3Vic2VsZWN0IGlmIHRoZSB3aGVyZSBpcyBub3QgZW1wdHk7IG90aGVyd2lzZQorICAgICAgICAvLyBhbiB1bnF1YWxpZmllZCBkZWxldGUgb3IgdXBkYXRlIHdpbGwgd29yaworICAgICAgICBpZiAoc2VsLmdldFdoZXJlKCkgPT0gbnVsbCB8fCBzZWwuZ2V0V2hlcmUoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQodGFibGVOYW1lKTsKKyAgICAgICAgICAgIGFwcGVuZFVwZGF0ZXMoc2VsLCBzdG9yZSwgc3FsLCBwYXJhbXMsIHVwZGF0ZVBhcmFtcywgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHNxbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIG5lZWQgdG8gdXNlIGEgc3Vic2VsZWN0IGlmIHdlIGFyZSB0byBidWxrIGRlbGV0ZSB3aGVyZQorICAgICAgICAvLyB0aGUgc2VsZWN0IGluY2x1ZGVzIG11bHRpcGxlIHRhYmxlczsgaWYgdGhlIGRhdGFiYXNlCisgICAgICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBpdCwgdGhlbiB3ZSBuZWVkIHRvIHNpZ2FsIHRoaXMgYnkgcmV0dXJuaW5nIG51bGwKKyAgICAgICAgaWYgKCFzdXBwb3J0c1N1YnNlbGVjdCB8fCAhc3VwcG9ydHNDb3JyZWxhdGVkU3Vic2VsZWN0KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ29sdW1uW10gcGtzID0gbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBzZWwuY2xlYXJTZWxlY3RzKCk7CisgICAgICAgIHNlbC5zZXREaXN0aW5jdCh0cnVlKTsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlIG9ubHkgYSBzaW5nbGUgUEssIHdlIGNhbiB1c2UgYSBub24tY29ycmVsYXRlZAorICAgICAgICAvLyBzdWJxdWVyeSAodXNpbmcgYW4gSU4gc3RhdGVtZW50KSwgd2hpY2ggaXMgbXVjaCBmYXN0ZXIgdGhhbgorICAgICAgICAvLyBhIGNvcnJlbGF0ZWQgc3VicXVlcnkgKHNpbmNlIGEgY29ycmVsYXRlZCBzdWJxdWVyeSBuZWVkcworICAgICAgICAvLyB0byBiZSBleGVjdXRlZCBvbmNlIGZvciBlYWNoIHJvdyBpbiB0aGUgdGFibGUpCisgICAgICAgIGlmIChwa3MubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHNlbC5zZWxlY3QocGtzWzBdKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQodGFibGVOYW1lKTsKKyAgICAgICAgICAgIGFwcGVuZFVwZGF0ZXMoc2VsLCBzdG9yZSwgc3FsLCBwYXJhbXMsIHVwZGF0ZVBhcmFtcywgZmFsc2UpOworICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIpLgorICAgICAgICAgICAgICAgIGFwcGVuZChwa3NbMF0pLmFwcGVuZCgiIElOICgiKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoc2VsLnRvU2VsZWN0KGZhbHNlLCBudWxsKSkuYXBwZW5kKCIpIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWwuY2xlYXJTZWxlY3RzKCk7CisgICAgICAgICAgICBzZWwuc2V0RGlzdGluY3QoZmFsc2UpOworCisgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc2VsZWN0IGlzIHVzaW5nIGEgY29ycmVsYXRlZCBzdWJxdWVyeSwgd2UKKyAgICAgICAgICAgIC8vIG9ubHkgbmVlZCB0byBzZWxlY3QgYSBib2d1cyB2aXJ0dWFsIGNvbHVtbgorICAgICAgICAgICAgc2VsLnNlbGVjdCgiMSIsIG51bGwpOworCisgICAgICAgICAgICAvLyBhZGQgaW4gdGhlIGpvaW5zIHRvIHRoZSB0YWJsZQorICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IHRhYmxlLmdldFByaW1hcnlLZXkoKS5nZXRDb2x1bW5zKCk7CisgICAgICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcih0aGlzKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIigiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKworICAgICAgICAgICAgICAgIC8vIGFkZCBpbiAidDAuUEsgPSBNWVRBQkxFLlBLIgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc2VsLmdldENvbHVtbkFsaWFzKGNvbHNbaV0sIG51bGwpKS5hcHBlbmQoIiA9ICIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQodGFibGUpLmFwcGVuZChjYXRhbG9nU2VwYXJhdG9yKS5hcHBlbmQoY29sc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgICAgICBzZWwud2hlcmUoYnVmLCBudWxsKTsKKworICAgICAgICAgICAgc3FsLmFwcGVuZCh0YWJsZU5hbWUpOworICAgICAgICAgICAgYXBwZW5kVXBkYXRlcyhzZWwsIHN0b3JlLCBzcWwsIHBhcmFtcywgdXBkYXRlUGFyYW1zLCBmYWxzZSk7CisgICAgICAgICAgICBzcWwuYXBwZW5kKCIgV0hFUkUgRVhJU1RTICgiKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoc2VsLnRvU2VsZWN0KGZhbHNlLCBudWxsKSkuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRVcGRhdGVzKFNlbGVjdCBzZWwsIEpEQkNTdG9yZSBzdG9yZSwgU1FMQnVmZmVyIHNxbCwKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zLCBNYXAgdXBkYXRlUGFyYW1zLCBib29sZWFuIGFsbG93QWxpYXMpIHsKKyAgICAgICAgaWYgKHVwZGF0ZVBhcmFtcyA9PSBudWxsIHx8IHVwZGF0ZVBhcmFtcy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBtYW51YWxseSBidWlsZCB1cCB0aGUgU0VUIGNsYXVzZSBmb3IgdGhlIFVQREFURSBzdGF0ZW1lbnQKKyAgICAgICAgc3FsLmFwcGVuZCgiIFNFVCAiKTsKKyAgICAgICAgRXhwQ29udGV4dCBjdHggPSBuZXcgRXhwQ29udGV4dChzdG9yZSwgcGFyYW1zLCAKKyAgICAgICAgICAgIHN0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdXBkYXRlUGFyYW1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgbmV4dCA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSAoRmllbGRNZXRhRGF0YSkgbmV4dC5nZXRLZXkoKTsKKyAgICAgICAgICAgIFZhbCB2YWwgPSAoVmFsKSBuZXh0LmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgIENvbHVtbiBjb2wgPSAoKEZpZWxkTWFwcGluZykgZm1kKS5nZXRDb2x1bW5zKClbMF07CisgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbC5nZXROYW1lKCkpOworICAgICAgICAgICAgc3FsLmFwcGVuZCgiID0gIik7CisKKyAgICAgICAgICAgIEV4cFN0YXRlIHN0YXRlID0gdmFsLmluaXRpYWxpemUoc2VsLCBjdHgsIDApOworICAgICAgICAgICAgdmFsLmNhbGN1bGF0ZVZhbHVlKHNlbCwgY3R4LCBzdGF0ZSwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgdmFsdWUgd2l0aCBhIG51bGwgZm9yIHRoZSBTZWxlY3Q7IGkKKyAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGF0IHRoZQorICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbC5sZW5ndGgoc2VsLCBjdHgsIHN0YXRlKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgdmFsLmFwcGVuZFRvKChhbGxvd0FsaWFzKSA/IHNlbCA6IG51bGwsIGN0eCwgc3RhdGUsIHNxbCwgaik7CisKKyAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBTUUwgdG8gZGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHRhYmxlcy4gCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZHJvcHMgYWxsIG5vbi1kZWZlcnJlZCBSRVNUUklDVCBmb3JlaWduIGtleSAKKyAgICAgKiBjb25zdHJhaW50cyBpbnZvbHZpbmcgdGhlIHNwZWNpZmllZCB0YWJsZXMsIGlzc3VlcyBERUxFVEUgc3RhdGVtZW50cyAKKyAgICAgKiBhZ2FpbnN0IHRoZSB0YWJsZXMsIGFuZCB0aGVuIGFkZHMgdGhlIGRyb3BwZWQgY29uc3RyYWludHMgYmFjayBpbi4gCisgICAgICogRGF0YWJhc2VzIHdpdGggbW9yZSBvcHRpbWFsIHdheXMgb2YgZGVsZXRpbmcgdGhlIGNvbnRlbnRzIG9mIHNldmVyYWwgCisgICAgICogdGFibGVzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVsZXRlVGFibGVDb250ZW50c1NRTChUYWJsZVtdIHRhYmxlcykgeworICAgICAgICBDb2xsZWN0aW9uIHNxbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGNvbGxlY3QgYW5kIGRyb3Agbm9uLWRlZmVycmVkIHBoeXNpY2FsIHJlc3RyaWN0IGNvbnN0cmFpbnRzLCBhbmQKKyAgICAgICAgLy8gY29sbGVjdCB0aGUgREVMRVRFIEZST00gc3RhdGVtZW50cworICAgICAgICBDb2xsZWN0aW9uIGRlbGV0ZVNRTCA9IG5ldyBBcnJheUxpc3QodGFibGVzLmxlbmd0aCk7CisgICAgICAgIENvbGxlY3Rpb24gcmVzdHJpY3RDb25zdHJhaW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGb3JlaWduS2V5W10gZmtzID0gdGFibGVzW2ldLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZrcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmICghZmtzW2pdLmlzTG9naWNhbCgpICYmICFma3Nbal0uaXNEZWZlcnJlZCgpIAorICAgICAgICAgICAgICAgICAgICAmJiBma3Nbal0uZ2V0RGVsZXRlQWN0aW9uKCkgPT0gRm9yZWlnbktleS5BQ1RJT05fUkVTVFJJQ1QpCisgICAgICAgICAgICAgICAgcmVzdHJpY3RDb25zdHJhaW50cy5hZGQoZmtzW2pdKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb25zdHJhaW50U1FMID0gZ2V0RHJvcEZvcmVpZ25LZXlTUUwoZmtzW2pdKTsKKyAgICAgICAgICAgICAgICBzcWwuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29uc3RyYWludFNRTCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBkZWxldGVTUUwuYWRkKCJERUxFVEUgRlJPTSAiICsgdGFibGVzW2ldLmdldEZ1bGxOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBhZGQgdGhlIGRlbGV0ZSBzdGF0ZW1lbnRzIGFmdGVyIGFsbCB0aGUgY29uc3RyYWludCBtdXRhdGlvbnMKKyAgICAgICAgc3FsLmFkZEFsbChkZWxldGVTUUwpOworICAgICAgICAKKyAgICAgICAgLy8gYWRkIHRoZSBkZWxldGVkIGNvbnN0cmFpbnRzIGJhY2sgdG8gdGhlIHNjaGVtYQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN0cmljdENvbnN0cmFpbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGNvbnN0cmFpbnRTUUwgPSAKKyAgICAgICAgICAgICAgICBnZXRBZGRGb3JlaWduS2V5U1FMKChGb3JlaWduS2V5KSBpdGVyLm5leHQoKSk7CisgICAgICAgICAgICBzcWwuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29uc3RyYWludFNRTCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBzcWwudG9BcnJheShuZXcgU3RyaW5nW3NxbC5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBTRUxFQ1Qgc3RhdGVtZW50IGluIHRoZSBwcm9wZXIgam9pbiBzeW50YXggZm9yIHRoZSBnaXZlbgorICAgICAqIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3QoU2VsZWN0IHNlbCwgYm9vbGVhbiBmb3JVcGRhdGUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgc2VsLmFkZEpvaW5DbGFzc0NvbmRpdGlvbnMoKTsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGUgPSBmb3JVcGRhdGUgJiYgc2VsLmdldEZyb21TZWxlY3QoKSA9PSBudWxsOworICAgICAgICBTUUxCdWZmZXIgc2VsZWN0ID0gZ2V0U2VsZWN0cyhzZWwsIGZhbHNlLCB1cGRhdGUpOworICAgICAgICBTUUxCdWZmZXIgb3JkZXJpbmcgPSBudWxsOworICAgICAgICBpZiAoIXNlbC5pc0FnZ3JlZ2F0ZSgpIHx8IHNlbC5nZXRHcm91cGluZygpICE9IG51bGwpCisgICAgICAgICAgICBvcmRlcmluZyA9IHNlbC5nZXRPcmRlcmluZygpOworICAgICAgICBTUUxCdWZmZXIgZnJvbTsKKyAgICAgICAgaWYgKHNlbC5nZXRGcm9tU2VsZWN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGZyb20gPSBnZXRGcm9tU2VsZWN0KHNlbCwgZm9yVXBkYXRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnJvbSA9IGdldEZyb20oc2VsLCB1cGRhdGUpOworICAgICAgICBTUUxCdWZmZXIgd2hlcmUgPSBnZXRXaGVyZShzZWwsIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiB0b1NlbGVjdChzZWxlY3QsIGZldGNoLCBmcm9tLCB3aGVyZSwgc2VsLmdldEdyb3VwaW5nKCksCisgICAgICAgICAgICBzZWwuZ2V0SGF2aW5nKCksIG9yZGVyaW5nLCBzZWwuaXNEaXN0aW5jdCgpLCBmb3JVcGRhdGUsCisgICAgICAgICAgICBzZWwuZ2V0U3RhcnRJbmRleCgpLCBzZWwuZ2V0RW5kSW5kZXgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSBzZWxlY3Qgc3RhdGVtZW50IGJldHdlZW4gdGhlIEZST00ga2V5d29yZAorICAgICAqIGFuZCB0aGUgV0hFUkUga2V5d29yZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU1FMQnVmZmVyIGdldEZyb20oU2VsZWN0IHNlbCwgYm9vbGVhbiBmb3JVcGRhdGUpIHsKKyAgICAgICAgU1FMQnVmZmVyIGZyb21TUUwgPSBuZXcgU1FMQnVmZmVyKHRoaXMpOworICAgICAgICBDb2xsZWN0aW9uIGFsaWFzZXMgPSBzZWwuZ2V0VGFibGVBbGlhc2VzKCk7CisgICAgICAgIGlmIChhbGlhc2VzLnNpemUoKSA8IDIgfHwgc2VsLmdldEpvaW5TeW50YXgoKSAhPSBTWU5UQVhfU1FMOTIpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYWxpYXNlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGZyb21TUUwuYXBwZW5kKGl0ci5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGZvclVwZGF0ZSAmJiB0YWJsZUZvclVwZGF0ZUNsYXVzZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmcm9tU1FMLmFwcGVuZCgiICIpLmFwcGVuZCh0YWJsZUZvclVwZGF0ZUNsYXVzZSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGZyb21TUUwuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VsLmdldEpvaW5JdGVyYXRvcigpOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZyb21TUUwuYXBwZW5kKHRvU1FMOTJKb2luKChKb2luKSBpdHIubmV4dCgpLCBmb3JVcGRhdGUsCisgICAgICAgICAgICAgICAgICAgIGZpcnN0KSk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJvbVNRTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEZST00gY2xhdXNlIGZvciBhIHNlbGVjdCB0aGF0IHNlbGVjdHMgZnJvbSBhIHRtcCB0YWJsZQorICAgICAqIGNyZWF0ZWQgYnkgYW4gaW5uZXIgc2VsZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTUUxCdWZmZXIgZ2V0RnJvbVNlbGVjdChTZWxlY3Qgc2VsLCBib29sZWFuIGZvclVwZGF0ZSkgeworICAgICAgICBTUUxCdWZmZXIgZnJvbVNRTCA9IG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgICAgIGZyb21TUUwuYXBwZW5kKCIoIik7CisgICAgICAgIGZyb21TUUwuYXBwZW5kKHRvU2VsZWN0KHNlbC5nZXRGcm9tU2VsZWN0KCksIGZvclVwZGF0ZSwgbnVsbCkpOworICAgICAgICBmcm9tU1FMLmFwcGVuZCgiKSIpOworICAgICAgICBpZiAocmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCkKKyAgICAgICAgICAgIGZyb21TUUwuYXBwZW5kKCIgIikuYXBwZW5kKFNlbGVjdC5GUk9NX1NFTEVDVF9BTElBUyk7CisgICAgICAgIHJldHVybiBmcm9tU1FMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgV0hFUkUgcG9ydGlvbiBvZiB0aGUgc2VsZWN0IHN0YXRlbWVudCwgb3IgbnVsbCBpZiBubyB3aGVyZQorICAgICAqIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNRTEJ1ZmZlciBnZXRXaGVyZShTZWxlY3Qgc2VsLCBib29sZWFuIGZvclVwZGF0ZSkgeworICAgICAgICBKb2lucyBqb2lucyA9IHNlbC5nZXRKb2lucygpOworICAgICAgICBpZiAoc2VsLmdldEpvaW5TeW50YXgoKSA9PSBTWU5UQVhfU1FMOTIKKyAgICAgICAgICAgIHx8IGpvaW5zID09IG51bGwgfHwgam9pbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRXaGVyZSgpOworCisgICAgICAgIFNRTEJ1ZmZlciB3aGVyZSA9IG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgICAgIGlmIChzZWwuZ2V0V2hlcmUoKSAhPSBudWxsKQorICAgICAgICAgICAgd2hlcmUuYXBwZW5kKHNlbC5nZXRXaGVyZSgpKTsKKyAgICAgICAgaWYgKGpvaW5zICE9IG51bGwpCisgICAgICAgICAgICBzZWwuYXBwZW5kKHdoZXJlLCBqb2lucyk7CisgICAgICAgIHJldHVybiB3aGVyZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIGdpdmVuIGpvaW4gaW5zdGFuY2UgdG8gY3JlYXRlIFNRTCBqb2luaW5nIGl0cyB0YWJsZXMgaW4KKyAgICAgKiB0aGUgdHJhZGl0aW9uYWwgc3R5bGUuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciB0b1RyYWRpdGlvbmFsSm9pbihKb2luIGpvaW4pIHsKKyAgICAgICAgRm9yZWlnbktleSBmayA9IGpvaW4uZ2V0Rm9yZWlnbktleSgpOworICAgICAgICBpZiAoZmsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJvb2xlYW4gaW52ZXJzZSA9IGpvaW4uaXNGb3JlaWduS2V5SW52ZXJzZWQoKTsKKyAgICAgICAgQ29sdW1uW10gZnJvbSA9IChpbnZlcnNlKSA/IGZrLmdldFByaW1hcnlLZXlDb2x1bW5zKCkKKyAgICAgICAgICAgIDogZmsuZ2V0Q29sdW1ucygpOworICAgICAgICBDb2x1bW5bXSB0byA9IChpbnZlcnNlKSA/IGZrLmdldENvbHVtbnMoKQorICAgICAgICAgICAgOiBmay5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworCisgICAgICAgIC8vIGRvIGNvbHVtbiBqb2lucworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcih0aGlzKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tLmxlbmd0aDsgaSsrLCBjb3VudCsrKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0QWxpYXMxKCkpLmFwcGVuZCgiLiIpLmFwcGVuZChmcm9tW2ldKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChqb2luLmdldEFsaWFzMigpKS5hcHBlbmQoIi4iKS5hcHBlbmQodG9baV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gY29uc3RhbnQgam9pbnMKKyAgICAgICAgQ29sdW1uW10gY29uc3RDb2xzID0gZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RDb2xzLmxlbmd0aDsgaSsrLCBjb3VudCsrKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgICAgICBpZiAoaW52ZXJzZSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kVmFsdWUoZmsuZ2V0Q29uc3RhbnQoY29uc3RDb2xzW2ldKSwgY29uc3RDb2xzW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0QWxpYXMxKCkpLmFwcGVuZCgiLiIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoY29uc3RDb2xzW2ldKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworCisgICAgICAgICAgICBpZiAoaW52ZXJzZSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0QWxpYXMyKCkpLmFwcGVuZCgiLiIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoY29uc3RDb2xzW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kVmFsdWUoZmsuZ2V0Q29uc3RhbnQoY29uc3RDb2xzW2ldKSwgY29uc3RDb2xzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbHVtbltdIGNvbnN0Q29sc1BLID0gZmsuZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0Q29sc1BLLmxlbmd0aDsgaSsrLCBjb3VudCsrKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgICAgICBpZiAoaW52ZXJzZSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0QWxpYXMxKCkpLmFwcGVuZCgiLiIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoY29uc3RDb2xzUEtbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmRWYWx1ZShmay5nZXRQcmltYXJ5S2V5Q29uc3RhbnQoY29uc3RDb2xzUEtbaV0pLAorICAgICAgICAgICAgICAgICAgICBjb25zdENvbHNQS1tpXSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgPSAiKTsKKworICAgICAgICAgICAgaWYgKGludmVyc2UpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZFZhbHVlKGZrLmdldFByaW1hcnlLZXlDb25zdGFudChjb25zdENvbHNQS1tpXSksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0Q29sc1BLW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0QWxpYXMyKCkpLmFwcGVuZCgiLiIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoY29uc3RDb2xzUEtbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoZSBnaXZlbiBqb2luIGluc3RhbmNlIHRvIGNyZWF0ZSBTUUwgam9pbmluZyBpdHMgdGFibGVzIGluCisgICAgICogdGhlIFNRTDkyIHN0eWxlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TUUw5MkpvaW4oSm9pbiBqb2luLCBib29sZWFuIGZvclVwZGF0ZSwgYm9vbGVhbiBmaXJzdCkgeworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcih0aGlzKTsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0VGFibGUxKCkpLmFwcGVuZCgiICIpLgorICAgICAgICAgICAgICAgIGFwcGVuZChqb2luLmdldEFsaWFzMSgpKTsKKyAgICAgICAgICAgIGlmIChmb3JVcGRhdGUgJiYgdGFibGVGb3JVcGRhdGVDbGF1c2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIikuYXBwZW5kKHRhYmxlRm9yVXBkYXRlQ2xhdXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgaWYgKGpvaW4uZ2V0VHlwZSgpID09IEpvaW4uVFlQRV9PVVRFUikKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQob3V0ZXJKb2luQ2xhdXNlKTsKKyAgICAgICAgZWxzZSBpZiAoam9pbi5nZXRUeXBlKCkgPT0gSm9pbi5UWVBFX0lOTkVSKQorICAgICAgICAgICAgYnVmLmFwcGVuZChpbm5lckpvaW5DbGF1c2UpOworICAgICAgICBlbHNlIC8vIGNyb3NzCisgICAgICAgICAgICBidWYuYXBwZW5kKGNyb3NzSm9pbkNsYXVzZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKTsKKworICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0VGFibGUyKCkpLmFwcGVuZCgiICIpLmFwcGVuZChqb2luLmdldEFsaWFzMigpKTsKKyAgICAgICAgaWYgKGZvclVwZGF0ZSAmJiB0YWJsZUZvclVwZGF0ZUNsYXVzZSAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpLmFwcGVuZCh0YWJsZUZvclVwZGF0ZUNsYXVzZSk7CisKKyAgICAgICAgaWYgKGpvaW4uZ2V0Rm9yZWlnbktleSgpICE9IG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgT04gIikuYXBwZW5kKHRvVHJhZGl0aW9uYWxKb2luKGpvaW4pKTsKKyAgICAgICAgZWxzZSBpZiAocmVxdWlyZXNDb25kaXRpb25Gb3JDcm9zc0pvaW4gJiYKKyAgICAgICAgICAgIGpvaW4uZ2V0VHlwZSgpID09IEpvaW4uVFlQRV9DUk9TUykKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBPTiAoMSA9IDEpIik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIGdpdmVuIGpvaW4gaW5zdGFuY2UgdG8gY3JlYXRlIFNRTCBqb2luaW5nIGl0cyB0YWJsZXMgaW4KKyAgICAgKiB0aGUgZGF0YWJhc2UncyBuYXRpdmUgc3ludGF4LiBUaHJvd3MgYW4gZXhjZXB0aW9uIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciB0b05hdGl2ZUpvaW4oSm9pbiBqb2luKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IGNhbiBiZSBlYWdlcmx5IGxvYWRlZCB1c2luZyBvdGhlciBqb2lucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5PdXRlckpvaW4oaW50IHN5bnRheCwgRm9yZWlnbktleSBmaykgeworICAgICAgICByZXR1cm4gc3ludGF4ICE9IFNZTlRBWF9UUkFESVRJT05BTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21iaW5lIHRoZSBnaXZlbiBjb21wb25lbnRzIGludG8gYSBTRUxFQ1Qgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3QoU1FMQnVmZmVyIHNlbGVjdHMsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIFNRTEJ1ZmZlciBmcm9tLCBTUUxCdWZmZXIgd2hlcmUsIFNRTEJ1ZmZlciBncm91cCwKKyAgICAgICAgU1FMQnVmZmVyIGhhdmluZywgU1FMQnVmZmVyIG9yZGVyLAorICAgICAgICBib29sZWFuIGRpc3RpbmN0LCBib29sZWFuIGZvclVwZGF0ZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgcmV0dXJuIHRvT3BlcmF0aW9uKGdldFNlbGVjdE9wZXJhdGlvbihmZXRjaCksIHNlbGVjdHMsIGZyb20sIHdoZXJlLAorICAgICAgICAgICAgZ3JvdXAsIGhhdmluZywgb3JkZXIsIGRpc3RpbmN0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgZ2V0Rm9yVXBkYXRlQ2xhdXNlKGZldGNoLCBmb3JVcGRhdGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVwZGF0ZSBjbGF1c2UgZm9yIHRoZSBxdWVyeSBiYXNlZCBvbiB0aGUKKyAgICAgKiB1cGRhdGVDbGF1c2UgYW5kIGlzb2xhdGlvbkxldmVsIGhpbnRzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGb3JVcGRhdGVDbGF1c2UoSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgYm9vbGVhbiBmb3JVcGRhdGUpIHsKKyAgICAgICAgaWYgKGZldGNoICE9IG51bGwgJiYgZmV0Y2guZ2V0SXNvbGF0aW9uKCkgIT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoCisgICAgICAgICAgICAgICAgImlzb2xhdGlvbi1sZXZlbC1jb25maWctbm90LXN1cHBvcnRlZCIsIGdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZm9yVXBkYXRlICYmICFzaW11bGF0ZUxvY2tpbmcpIHsKKyAgICAgICAgICAgIGFzc2VydFN1cHBvcnQoc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUsICJTdXBwb3J0c1NlbGVjdEZvclVwZGF0ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZvclVwZGF0ZUNsYXVzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiU0VMRUNUIiBvcGVyYXRpb24gY2xhdXNlLCBhZGRpbmcgYW55IGF2YWlsYWJsZSBoaW50cywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0T3BlcmF0aW9uKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuICJTRUxFQ1QiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW5nIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU1FMQnVmZmVyIHRvT3BlcmF0aW9uKFN0cmluZyBvcCwgU1FMQnVmZmVyIHNlbGVjdHMsCisgICAgICAgIFNRTEJ1ZmZlciBmcm9tLCBTUUxCdWZmZXIgd2hlcmUsIFNRTEJ1ZmZlciBncm91cCwgU1FMQnVmZmVyIGhhdmluZywKKyAgICAgICAgU1FMQnVmZmVyIG9yZGVyLCBib29sZWFuIGRpc3RpbmN0LCBsb25nIHN0YXJ0LCBsb25nIGVuZCwKKyAgICAgICAgU3RyaW5nIGZvclVwZGF0ZUNsYXVzZSkgeworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcih0aGlzKTsKKyAgICAgICAgYnVmLmFwcGVuZChvcCk7CisKKyAgICAgICAgYm9vbGVhbiByYW5nZSA9IHN0YXJ0ICE9IDAgfHwgZW5kICE9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBpZiAocmFuZ2UgJiYgcmFuZ2VQb3NpdGlvbiA9PSBSQU5HRV9QUkVfRElTVElOQ1QpCisgICAgICAgICAgICBhcHBlbmRTZWxlY3RSYW5nZShidWYsIHN0YXJ0LCBlbmQpOworICAgICAgICBpZiAoZGlzdGluY3QpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgRElTVElOQ1QiKTsKKyAgICAgICAgaWYgKHJhbmdlICYmIHJhbmdlUG9zaXRpb24gPT0gUkFOR0VfUE9TVF9ESVNUSU5DVCkKKyAgICAgICAgICAgIGFwcGVuZFNlbGVjdFJhbmdlKGJ1Ziwgc3RhcnQsIGVuZCk7CisKKyAgICAgICAgYnVmLmFwcGVuZCgiICIpLmFwcGVuZChzZWxlY3RzKS5hcHBlbmQoIiBGUk9NICIpLmFwcGVuZChmcm9tKTsKKworICAgICAgICBpZiAod2hlcmUgIT0gbnVsbCAmJiAhd2hlcmUuaXNFbXB0eSgpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIFdIRVJFICIpLmFwcGVuZCh3aGVyZSk7CisgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgR1JPVVAgQlkgIikuYXBwZW5kKGdyb3VwKTsKKyAgICAgICAgaWYgKGhhdmluZyAhPSBudWxsICYmICFoYXZpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhc3NlcnRTdXBwb3J0KHN1cHBvcnRzSGF2aW5nLCAiU3VwcG9ydHNIYXZpbmciKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBIQVZJTkcgIikuYXBwZW5kKGhhdmluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yZGVyICE9IG51bGwgJiYgIW9yZGVyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBPUkRFUiBCWSAiKS5hcHBlbmQob3JkZXIpOworICAgICAgICBpZiAocmFuZ2UgJiYgcmFuZ2VQb3NpdGlvbiA9PSBSQU5HRV9QT1NUX1NFTEVDVCkKKyAgICAgICAgICAgIGFwcGVuZFNlbGVjdFJhbmdlKGJ1Ziwgc3RhcnQsIGVuZCk7CisgICAgICAgIGlmIChmb3JVcGRhdGVDbGF1c2UgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKS5hcHBlbmQoZm9yVXBkYXRlQ2xhdXNlKTsKKyAgICAgICAgaWYgKHJhbmdlICYmIHJhbmdlUG9zaXRpb24gPT0gUkFOR0VfUE9TVF9MT0NLKQorICAgICAgICAgICAgYXBwZW5kU2VsZWN0UmFuZ2UoYnVmLCBzdGFydCwgZW5kKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGRpY3Rpb25hcnkgY2FuIHNlbGVjdCByYW5nZXMsCisgICAgICogdXNlIHRoaXMgbWV0aG9kIHRvIGFwcGVuZCB0aGUgcmFuZ2UgU1FMLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFNlbGVjdFJhbmdlKFNRTEJ1ZmZlciBidWYsIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSBzZWxlY3Qgc3RhdGVtZW50IGJldHdlZW4gdGhlIFNFTEVDVCBrZXl3b3JkCisgICAgICogYW5kIHRoZSBGUk9NIGtleXdvcmQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNRTEJ1ZmZlciBnZXRTZWxlY3RzKFNlbGVjdCBzZWwsIGJvb2xlYW4gZGlzdGluY3RJZGVudGlmaWVycywKKyAgICAgICAgYm9vbGVhbiBmb3JVcGRhdGUpIHsKKyAgICAgICAgLy8gYXBwZW5kIHRoZSBhbGlhc2VzIGZvciBhbGwgdGhlIGNvbHVtbnMKKyAgICAgICAgU1FMQnVmZmVyIHNlbGVjdFNRTCA9IG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgICAgIExpc3QgYWxpYXNlczsKKyAgICAgICAgaWYgKGRpc3RpbmN0SWRlbnRpZmllcnMpCisgICAgICAgICAgICBhbGlhc2VzID0gc2VsLmdldElkZW50aWZpZXJBbGlhc2VzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFsaWFzZXMgPSBzZWwuZ2V0U2VsZWN0QWxpYXNlcygpOworCisgICAgICAgIE9iamVjdCBhbGlhczsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBhbGlhc2VzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhbGlhcyA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYWxpYXMgaW5zdGFuY2VvZiBTUUxCdWZmZXIpCisgICAgICAgICAgICAgICAgc2VsZWN0U1FMLmFwcGVuZCgoU1FMQnVmZmVyKSBhbGlhcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2VsZWN0U1FMLmFwcGVuZChhbGlhcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHNlbGVjdFNRTC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGVjdFNRTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSAiRk9SIFVQREFURSIgY2xhdXNlIGNhbiBiZSB1c2VkIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogU2VsZWN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xvY2tpbmcoU2VsZWN0IHNlbCkgeworICAgICAgICBpZiAoc2VsLmlzQWdncmVnYXRlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghc3VwcG9ydHNMb2NraW5nV2l0aFNlbGVjdFJhbmdlICYmIChzZWwuZ2V0U3RhcnRJbmRleCgpICE9IDAKKyAgICAgICAgICAgIHx8IHNlbC5nZXRFbmRJbmRleCgpICE9IExvbmcuTUFYX1ZBTFVFKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBvbmx5IGlubmVyIHNlbGVjdCBpcyBsb2NrZWQKKyAgICAgICAgaWYgKHNlbC5nZXRGcm9tU2VsZWN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNlbCA9IHNlbC5nZXRGcm9tU2VsZWN0KCk7CisKKyAgICAgICAgaWYgKCFzdXBwb3J0c0xvY2tpbmdXaXRoRGlzdGluY3RDbGF1c2UgJiYgc2VsLmlzRGlzdGluY3QoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFzdXBwb3J0c0xvY2tpbmdXaXRoTXVsdGlwbGVUYWJsZXMKKyAgICAgICAgICAgICYmIHNlbC5nZXRUYWJsZUFsaWFzZXMoKS5zaXplKCkgPiAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXN1cHBvcnRzTG9ja2luZ1dpdGhPcmRlckNsYXVzZSAmJiBzZWwuZ2V0T3JkZXJpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXN1cHBvcnRzTG9ja2luZ1dpdGhPdXRlckpvaW4gfHwgIXN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW4pIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gc2VsLmdldEpvaW5JdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEpvaW4gam9pbiA9IChKb2luKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmICghc3VwcG9ydHNMb2NraW5nV2l0aE91dGVySm9pbgorICAgICAgICAgICAgICAgICAgICAmJiBqb2luLmdldFR5cGUoKSA9PSBKb2luLlRZUEVfT1VURVIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoIXN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW4KKyAgICAgICAgICAgICAgICAgICAgJiYgam9pbi5nZXRUeXBlKCkgPT0gSm9pbi5UWVBFX0lOTkVSKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBnaXZlbiBzZWxlY3QgcmVxdWlyZXMgYSBmb3J3YXJkLW9ubHkgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2Vzc1Jlc3VsdFNldChTZWxlY3Qgc2VsLAorICAgICAgICBib29sZWFuIGZvclVwZGF0ZSkgeworICAgICAgICByZXR1cm4gIXNlbC5pc0FnZ3JlZ2F0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBkaWN0aW9uYXJ5IGZsYWcgaXMgdHJ1ZS4gSWYgaXQgaXMgbm90IHRydWUsCisgICAgICogdGhyb3cgYW4gZXJyb3Igc2F5aW5nIHRoYXQgdGhlIGdpdmVuIHNldHRpbmcgbmVlZHMgdG8gcmV0dXJuIHRydWUgZm9yCisgICAgICogdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHRvIHdvcmsuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0U3VwcG9ydChib29sZWFuIGZlYXR1cmUsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoIWZlYXR1cmUpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoImZlYXR1cmUtbm90LXN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwgcHJvcGVydHkpKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFF1ZXJ5IGZ1bmN0aW9ucworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhpcyBkYXRhYmFzZSdzIHN1YnN0cmluZyBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgdGhlIFNRTCBidWZmZXIgdG8gd3JpdGUgdGhlIHN1YnN0cmluZyBpbnZvY2F0aW9uIHRvCisgICAgICogQHBhcmFtIHN0ciBhIHF1ZXJ5IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IHN0cmluZworICAgICAqIEBwYXJhbSBzdGFydCBhIHF1ZXJ5IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgc3RhcnQgaW5kZXgKKyAgICAgKiBAcGFyYW0gZW5kIGEgcXVlcnkgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbmQgaW5kZXgsIG9yIG51bGwgZm9yIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoc3Vic3RyaW5nRnVuY3Rpb25OYW1lKS5hcHBlbmQoIigoIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIpLCAoIik7CisgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiArIDEpIik7CisgICAgICAgIGlmIChlbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAoIik7CisgICAgICAgICAgICBlbmQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAtICgiKTsKKyAgICAgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpKSIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhpcyBkYXRhYmFzZSdzIGluZGV4T2YgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBTUUwgYnVmZmVyIHRvIHdyaXRlIHRoZSBpbmRleE9mIGludm9jYXRpb24gdG8KKyAgICAgKiBAcGFyYW0gc3RyIGEgcXVlcnkgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgc3RyaW5nCisgICAgICogQHBhcmFtIGZpbmQgYSBxdWVyeSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHNlYXJjaCBzdHJpbmcKKyAgICAgKiBAcGFyYW0gc3RhcnQgYSBxdWVyeSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IGluZGV4LCBvciBudWxsCisgICAgICogdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluZGV4T2YoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBmaW5kLAorICAgICAgICBGaWx0ZXJWYWx1ZSBzdGFydCkgeworICAgICAgICBidWYuYXBwZW5kKCIoSU5TVFIoKCIpOworICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHN1YnN0cmluZyhidWYsIHN0ciwgc3RhcnQsIG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHIuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSwgKCIpOworICAgICAgICBmaW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIikpIC0gMSIpOworICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIG51bWVyaWMgcGFydHMgb2YgYSBtYXRoZW1hdGljYWwgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBTUUwgYnVmZmVyIHRvIHdyaXRlIHRoZSBtYXRoIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIG9wIHRoZSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIHRvIHBlcmZvcm0KKyAgICAgKiBAcGFyYW0gbGhzIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgbWF0aCBmdW5jdGlvbgorICAgICAqIEBwYXJhbSByaHMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgbWF0aCBmdW5jdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hdGhGdW5jdGlvbihTUUxCdWZmZXIgYnVmLCBTdHJpbmcgb3AsIEZpbHRlclZhbHVlIGxocywKKyAgICAgICAgRmlsdGVyVmFsdWUgcmhzKSB7CisgICAgICAgIGJvb2xlYW4gY2FzdGxocyA9IGZhbHNlOworICAgICAgICBib29sZWFuIGNhc3RyaHMgPSBmYWxzZTsKKyAgICAgICAgQ2xhc3MgbGMgPSBGaWx0ZXJzLndyYXAobGhzLmdldFR5cGUoKSk7CisgICAgICAgIENsYXNzIHJjID0gRmlsdGVycy53cmFwKHJocy5nZXRUeXBlKCkpOworICAgICAgICBpbnQgdHlwZSA9IDA7CisgICAgICAgIGlmIChyZXF1aXJlc0Nhc3RGb3JNYXRoRnVuY3Rpb25zICYmIChsYyAhPSByYworICAgICAgICAgICAgfHwgKGxocy5pc0NvbnN0YW50KCkgJiYgcmhzLmlzQ29uc3RhbnQoKSkpKSB7CisgICAgICAgICAgICBDbGFzcyBjID0gRmlsdGVycy5wcm9tb3RlKGxjLCByYyk7CisgICAgICAgICAgICB0eXBlID0gZ2V0SkRCQ1R5cGUoSmF2YVR5cGVzLmdldFR5cGVDb2RlKGMpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBUeXBlcy5WQVJCSU5BUlkgJiYgdHlwZSAhPSBUeXBlcy5CTE9CKSB7CisgICAgICAgICAgICAgICAgY2FzdGxocyA9IChsaHMuaXNDb25zdGFudCgpICYmIHJocy5pc0NvbnN0YW50KCkpIHx8IGxjICE9IGM7CisgICAgICAgICAgICAgICAgY2FzdHJocyA9IChsaHMuaXNDb25zdGFudCgpICYmIHJocy5pc0NvbnN0YW50KCkpIHx8IHJjICE9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIG1vZCA9ICJNT0QiLmVxdWFscyhvcCk7CisgICAgICAgIGlmIChtb2QpIHsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0c01vZE9wZXJhdG9yKQorICAgICAgICAgICAgICAgIG9wID0gIiUiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQob3ApOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIigiKTsKKworICAgICAgICBpZiAoY2FzdGxocykKKyAgICAgICAgICAgIGFwcGVuZENhc3QoYnVmLCBsaHMsIHR5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaHMuYXBwZW5kVG8oYnVmKTsKKworICAgICAgICBpZiAobW9kICYmICFzdXBwb3J0c01vZE9wZXJhdG9yKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpLmFwcGVuZChvcCkuYXBwZW5kKCIgIik7CisKKyAgICAgICAgaWYgKGNhc3RyaHMpCisgICAgICAgICAgICBhcHBlbmRDYXN0KGJ1ZiwgcmhzLCB0eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmhzLmFwcGVuZFRvKGJ1Zik7CisKKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIGNvbXBhcmlzb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBTUUwgYnVmZmVyIHRvIHdyaXRlIHRoZSBjb21wYXJpc29uCisgICAgICogQHBhcmFtIG9wIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbiB0byBwZXJmb3JtCisgICAgICogQHBhcmFtIGxocyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKiBAcGFyYW0gcmhzIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21wYXJpc29uKFNRTEJ1ZmZlciBidWYsIFN0cmluZyBvcCwgRmlsdGVyVmFsdWUgbGhzLAorICAgICAgICBGaWx0ZXJWYWx1ZSByaHMpIHsKKyAgICAgICAgYm9vbGVhbiBjYXN0bGhzID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gY2FzdHJocyA9IGZhbHNlOworICAgICAgICBDbGFzcyBsYyA9IEZpbHRlcnMud3JhcChsaHMuZ2V0VHlwZSgpKTsKKyAgICAgICAgQ2xhc3MgcmMgPSBGaWx0ZXJzLndyYXAocmhzLmdldFR5cGUoKSk7CisgICAgICAgIGludCB0eXBlID0gMDsKKyAgICAgICAgaWYgKHJlcXVpcmVzQ2FzdEZvckNvbXBhcmlzb25zICYmIChsYyAhPSByYworICAgICAgICAgICAgfHwgKGxocy5pc0NvbnN0YW50KCkgJiYgcmhzLmlzQ29uc3RhbnQoKSkpKSB7CisgICAgICAgICAgICBDbGFzcyBjID0gRmlsdGVycy5wcm9tb3RlKGxjLCByYyk7CisgICAgICAgICAgICB0eXBlID0gZ2V0SkRCQ1R5cGUoSmF2YVR5cGVzLmdldFR5cGVDb2RlKGMpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBUeXBlcy5WQVJCSU5BUlkgJiYgdHlwZSAhPSBUeXBlcy5CTE9CKSB7CisgICAgICAgICAgICAgICAgY2FzdGxocyA9IChsaHMuaXNDb25zdGFudCgpICYmIHJocy5pc0NvbnN0YW50KCkpIHx8IGxjICE9IGM7CisgICAgICAgICAgICAgICAgY2FzdHJocyA9IChsaHMuaXNDb25zdGFudCgpICYmIHJocy5pc0NvbnN0YW50KCkpIHx8IHJjICE9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FzdGxocykKKyAgICAgICAgICAgIGFwcGVuZENhc3QoYnVmLCBsaHMsIHR5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaHMuYXBwZW5kVG8oYnVmKTsKKworICAgICAgICBidWYuYXBwZW5kKCIgIikuYXBwZW5kKG9wKS5hcHBlbmQoIiAiKTsKKworICAgICAgICBpZiAoY2FzdHJocykKKyAgICAgICAgICAgIGFwcGVuZENhc3QoYnVmLCByaHMsIHR5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByaHMuYXBwZW5kVG8oYnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgU1FMIGZvciB0aGUgZ2l2ZW4gbnVtZXJpYyB2YWx1ZSB0byB0aGUgYnVmZmVyLCBjYXN0aW5nIGFzIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmROdW1lcmljQ2FzdChTUUxCdWZmZXIgYnVmLCBGaWx0ZXJWYWx1ZSB2YWwpIHsKKyAgICAgICAgaWYgKHZhbC5pc0NvbnN0YW50KCkpCisgICAgICAgICAgICBhcHBlbmRDYXN0KGJ1ZiwgdmFsLCBUeXBlcy5OVU1FUklDKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsLmFwcGVuZFRvKGJ1Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FzdCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgdGhlIGJ1ZmZlciB0byBhcHBlbmQgdGhlIGNhc3QgdG8KKyAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBjYXN0CisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGNhc2UsIGUuZy4ge0BsaW5rIFR5cGVzI05VTUVSSUN9CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kQ2FzdChTUUxCdWZmZXIgYnVmLCBGaWx0ZXJWYWx1ZSB2YWwsIGludCB0eXBlKSB7CisgICAgICAgIC8vIENvbnZlcnQgdGhlIGNhc3QgZnVuY3Rpb246ICJDQVNUKHswfSBBUyB7MX0pIgorICAgICAgICBpbnQgZmlyc3RQYXJhbSA9IGNhc3RGdW5jdGlvbi5pbmRleE9mKCJ7MH0iKTsKKyAgICAgICAgU3RyaW5nIHByZSA9IGNhc3RGdW5jdGlvbi5zdWJzdHJpbmcoMCwgZmlyc3RQYXJhbSk7IC8vICJDQVNUKCIKKyAgICAgICAgU3RyaW5nIG1pZCA9IGNhc3RGdW5jdGlvbi5zdWJzdHJpbmcoZmlyc3RQYXJhbSArIDMpOworICAgICAgICBpbnQgc2Vjb25kUGFyYW0gPSBtaWQuaW5kZXhPZigiezF9Iik7CisgICAgICAgIFN0cmluZyBwb3N0OworICAgICAgICBpZiAoc2Vjb25kUGFyYW0gPiAtMSkgeworICAgICAgICAgICAgcG9zdCA9IG1pZC5zdWJzdHJpbmcoc2Vjb25kUGFyYW0gKyAzKTsgLy8gIikiCisgICAgICAgICAgICBtaWQgPSBtaWQuc3Vic3RyaW5nKDAsIHNlY29uZFBhcmFtKTsgLy8gIiBBUyAiCisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcG9zdCA9ICIiOworCisgICAgICAgIGJ1Zi5hcHBlbmQocHJlKTsKKyAgICAgICAgdmFsLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQobWlkKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRUeXBlTmFtZSh0eXBlKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQocG9zdCk7CisgICAgfQorICAgIAorICAgIC8vLy8vLy8vLy8vCisgICAgLy8gRERMIFNRTAorICAgIC8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbnkgdGFibGUgY29tcG9uZW50cyB0aGF0IHRoaXMKKyAgICAgKiBkaWN0aW9uYXJ5IGFkZHMgdGhhdCBhcmUgbm90IHVzZWQgYnkgbWFwcGluZ3MuIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZlNjaGVtYUNvbXBvbmVudHMoVGFibGUgdGFibGUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHRhYmxlLCBpbmNsdWRpbmcgdGhlIHNjaGVtYSAoZGVsaW1pdGVkCisgICAgICogYnkge0BsaW5rICNjYXRhbG9nU2VwYXJhdG9yfSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZShUYWJsZSB0YWJsZSwgYm9vbGVhbiBsb2dpY2FsKSB7CisgICAgICAgIGlmICghdXNlU2NoZW1hTmFtZSB8fCB0YWJsZS5nZXRTY2hlbWFOYW1lKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXROYW1lKCk7CisgICAgICAgIGlmIChsb2dpY2FsIHx8ICIuIi5lcXVhbHMoY2F0YWxvZ1NlcGFyYXRvcikpCisgICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0RnVsbE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIHRhYmxlLmdldFNjaGVtYU5hbWUoKSArIGNhdGFsb2dTZXBhcmF0b3IgKyB0YWJsZS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBpbmRleCwgaW5jbHVkaW5nIHRoZSBzY2hlbWEgKGRlbGltaXRlZAorICAgICAqIGJ5IHRoZSByZXN1bHQgb2Yge0BsaW5rICNjYXRhbG9nU2VwYXJhdG9yfSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZShJbmRleCBpbmRleCkgeworICAgICAgICBpZiAoIXVzZVNjaGVtYU5hbWUgfHwgaW5kZXguZ2V0U2NoZW1hTmFtZSgpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gaW5kZXguZ2V0TmFtZSgpOworICAgICAgICBpZiAoIi4iLmVxdWFscyhjYXRhbG9nU2VwYXJhdG9yKSkKKyAgICAgICAgICAgIHJldHVybiBpbmRleC5nZXRGdWxsTmFtZSgpOworICAgICAgICByZXR1cm4gaW5kZXguZ2V0U2NoZW1hTmFtZSgpICsgY2F0YWxvZ1NlcGFyYXRvciArIGluZGV4LmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHNlcXVlbmNlLCBpbmNsdWRpbmcgdGhlIHNjaGVtYSAoZGVsaW1pdGVkCisgICAgICogYnkgdGhlIHJlc3VsdCBvZiB7QGxpbmsgI2NhdGFsb2dTZXBhcmF0b3J9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKFNlcXVlbmNlIHNlcSkgeworICAgICAgICBpZiAoIXVzZVNjaGVtYU5hbWUgfHwgc2VxLmdldFNjaGVtYU5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHNlcS5nZXROYW1lKCk7CisgICAgICAgIGlmICgiLiIuZXF1YWxzKGNhdGFsb2dTZXBhcmF0b3IpKQorICAgICAgICAgICAgcmV0dXJuIHNlcS5nZXRGdWxsTmFtZSgpOworICAgICAgICByZXR1cm4gc2VxLmdldFNjaGVtYU5hbWUoKSArIGNhdGFsb2dTZXBhcmF0b3IgKyBzZXEuZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRoZSBnaXZlbiB0YWJsZSBuYW1lIHRvIG1ha2UgaXQgdmFsaWQKKyAgICAgKiBmb3IgdGhlIGN1cnJlbnQgREIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWxpZFRhYmxlTmFtZShTdHJpbmcgbmFtZSwgU2NoZW1hIHNjaGVtYSkgeworICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKCJfIikpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIHJldHVybiBtYWtlTmFtZVZhbGlkKG5hbWUsIHNjaGVtYS5nZXRTY2hlbWFHcm91cCgpLAorICAgICAgICAgICAgbWF4VGFibGVOYW1lTGVuZ3RoLCBOQU1FX1RBQkxFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFueSBuZWNlc3NhcnkgY2hhbmdlcyB0byB0aGUgZ2l2ZW4gc2VxdWVuY2UgbmFtZSB0byBtYWtlIGl0IHZhbGlkCisgICAgICogZm9yIHRoZSBjdXJyZW50IERCLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5hbWUsIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgd2hpbGUgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICByZXR1cm4gbWFrZU5hbWVWYWxpZCgiU18iICsgbmFtZSwgc2NoZW1hLmdldFNjaGVtYUdyb3VwKCksCisgICAgICAgICAgICBtYXhUYWJsZU5hbWVMZW5ndGgsIE5BTUVfU0VRVUVOQ0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRoZSBnaXZlbiBjb2x1bW4gbmFtZSB0byBtYWtlIGl0IHZhbGlkCisgICAgICogZm9yIHRoZSBjdXJyZW50IERCLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRDb2x1bW5OYW1lKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKCJfIikpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIHJldHVybiBtYWtlTmFtZVZhbGlkKG5hbWUsIHRhYmxlLCBtYXhDb2x1bW5OYW1lTGVuZ3RoLCBOQU1FX0FOWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHByaW1hcnkga2V5IG5hbWUgdG8gbWFrZSBpdAorICAgICAqIHZhbGlkIGZvciB0aGUgY3VycmVudCBEQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkUHJpbWFyeUtleU5hbWUoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHdoaWxlIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgcmV0dXJuIG1ha2VOYW1lVmFsaWQoIlBfIiArIG5hbWUsIHRhYmxlLmdldFNjaGVtYSgpLmdldFNjaGVtYUdyb3VwKCksCisgICAgICAgICAgICBtYXhDb25zdHJhaW50TmFtZUxlbmd0aCwgTkFNRV9BTlkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRoZSBnaXZlbiBmb3JlaWduIGtleSBuYW1lIHRvIG1ha2UgaXQKKyAgICAgKiB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgREIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWxpZEZvcmVpZ25LZXlOYW1lKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSwKKyAgICAgICAgVGFibGUgdG9UYWJsZSkgeworICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKCJfIikpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSB0YWJsZS5nZXROYW1lKCk7CisgICAgICAgIGludCBsZW4gPSBNYXRoLm1pbih0YWJsZU5hbWUubGVuZ3RoKCksIDcpOworICAgICAgICBuYW1lID0gIkZfIiArIHNob3J0ZW4odGFibGVOYW1lLCBsZW4pICsgIl8iICsgbmFtZTsKKyAgICAgICAgcmV0dXJuIG1ha2VOYW1lVmFsaWQobmFtZSwgdGFibGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hR3JvdXAoKSwKKyAgICAgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoLCBOQU1FX0FOWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIGluZGV4IG5hbWUgdG8gbWFrZSBpdCB2YWxpZAorICAgICAqIGZvciB0aGUgY3VycmVudCBEQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkSW5kZXhOYW1lKFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKCJfIikpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSB0YWJsZS5nZXROYW1lKCk7CisgICAgICAgIGludCBsZW4gPSBNYXRoLm1pbih0YWJsZU5hbWUubGVuZ3RoKCksIDcpOworICAgICAgICBuYW1lID0gIklfIiArIHNob3J0ZW4odGFibGVOYW1lLCBsZW4pICsgIl8iICsgbmFtZTsKKyAgICAgICAgcmV0dXJuIG1ha2VOYW1lVmFsaWQobmFtZSwgdGFibGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hR3JvdXAoKSwKKyAgICAgICAgICAgIG1heEluZGV4TmFtZUxlbmd0aCwgTkFNRV9BTlkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRoZSBnaXZlbiB1bmlxdWUgY29uc3RyYWludCBuYW1lIHRvIG1ha2UKKyAgICAgKiBpdCB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgREIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWxpZFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIHdoaWxlIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IHRhYmxlLmdldE5hbWUoKTsKKyAgICAgICAgaW50IGxlbiA9IE1hdGgubWluKHRhYmxlTmFtZS5sZW5ndGgoKSwgNyk7CisgICAgICAgIG5hbWUgPSAiVV8iICsgc2hvcnRlbih0YWJsZU5hbWUsIGxlbikgKyAiXyIgKyBuYW1lOworICAgICAgICByZXR1cm4gbWFrZU5hbWVWYWxpZChuYW1lLCB0YWJsZS5nZXRTY2hlbWEoKS5nZXRTY2hlbWFHcm91cCgpLAorICAgICAgICAgICAgbWF4Q29uc3RyYWludE5hbWVMZW5ndGgsIE5BTUVfQU5ZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG9ydGVuIHRoZSBzcGVjaWZpZWQgbmFtZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBuYW1lLiBUaGlzIHdpbGwKKyAgICAgKiBiZSBkb25lIGJ5IGZpcnN0IHN0cmlwcGluZyBvdXQgdGhlIHZvd2VscywgYW5kIHRoZW4gcmVtb3ZpbmcKKyAgICAgKiBjaGFyYWN0ZXJzIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgd29yZCB1bnRpbCBpdCByZWFjaGVzIHRoZSB0YXJnZXQKKyAgICAgKiBsZW5ndGguCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgc2hvcnRlbihTdHJpbmcgbmFtZSwgaW50IHRhcmdldExlbmd0aCkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPD0gdGFyZ2V0TGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIG5tID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKKyAgICAgICAgd2hpbGUgKG5tLmxlbmd0aCgpID4gdGFyZ2V0TGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoIXN0cmlwVm93ZWwobm0pKSB7CisgICAgICAgICAgICAgICAgLy8gY3V0IG91dCB0aGUgbWlkZGxlIGNoYXIKKyAgICAgICAgICAgICAgICBubS5yZXBsYWNlKG5tLmxlbmd0aCgpIC8gMiwgKG5tLmxlbmd0aCgpIC8gMikgKyAxLCAiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5tLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHZvd2VscyBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSB2b3dlbHMgaGF2ZSBiZWVuIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmlwVm93ZWwoU3RyaW5nQnVmZmVyIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY2hhcltdIHZvd2VscyA9IHsgJ0EnLCAnRScsICdJJywgJ08nLCAnVScsIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdm93ZWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5pbmRleE9mKHZvd2Vsc1tpXSk7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBuYW1lLnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgIiIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG9ydGVucyB0aGUgZ2l2ZW4gbmFtZSB0byB0aGUgZ2l2ZW4gbWF4aW11bSBsZW5ndGgsIHRoZW4gY2hlY2tzIHRoYXQKKyAgICAgKiBpdCBpcyBub3QgYSByZXNlcnZlZCB3b3JkLiBJZiBpdCBpcyByZXNlcnZlZCwgYXBwZW5kcyBhICIwIi4gSWYKKyAgICAgKiB0aGUgbmFtZSBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWEgY29tcG9uZW50LCB0aGUgbGFzdAorICAgICAqIGNoYXJhY3RlciBpcyByZXBsYWNlIHdpdGggJzAnLCB0aGVuICcxJywgZXRjLgorICAgICAqIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gbWF4IGxlbiBtYXkgYmUgMCBpZiB0aGUgZGF0YWJhc2UgbWV0YWRhdGEgaXMKKyAgICAgKiBpbmNvbXBsZXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWFrZU5hbWVWYWxpZChTdHJpbmcgbmFtZSwgTmFtZVNldCBzZXQsIGludCBtYXhMZW4sCisgICAgICAgIGludCBuYW1lVHlwZSkgeworICAgICAgICBpZiAobWF4TGVuIDwgMSkKKyAgICAgICAgICAgIG1heExlbiA9IDI1NTsKKyAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiBtYXhMZW4pCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbWF4TGVuKTsKKyAgICAgICAgaWYgKHJlc2VydmVkV29yZFNldC5jb250YWlucyhuYW1lLnRvVXBwZXJDYXNlKCkpKSB7CisgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSBtYXhMZW4pCisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIG5hbWUgKz0gIjAiOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IG1ha2Ugc3VyZSB0aGUgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgaWYgKHNldCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRlcjoKKyAgICAgICAgICAgIGZvciAoaW50IHZlcnNpb24gPSAxLCBjaGFycyA9IDE7IHRydWU7IHZlcnNpb24rKykgeworICAgICAgICAgICAgICAgIC8vIGZvciB0YWJsZSBuYW1lcywgd2UgY2hlY2sgZm9yIHRoZSB0YWJsZSBpdHNlbGYgaW4gY2FzZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBuYW1lIHNldCBpcyBsYXp5IGFib3V0IHNjaGVtYSByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE5BTUVfVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoU2NoZW1hR3JvdXApIHNldCkuaXNLbm93blRhYmxlKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTkFNRV9TRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKChTY2hlbWFHcm91cCkgc2V0KS5pc0tub3duU2VxdWVuY2UobmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0LmlzTmFtZVRha2VuKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGEgc2luZ2xlIGNoYXIgZm9yIHRoZSB2ZXJzaW9uIGlzIHByb2JhYmx5IGVub3VnaCwgYnV0IG1pZ2h0CisgICAgICAgICAgICAgICAgLy8gYXMgd2VsbCBiZSBnZW5lcmFsIGFib3V0IGl0Li4uCisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPiAxKQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIGNoYXJzKTsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA+PSBNYXRoLnBvdygxMCwgY2hhcnMpKQorICAgICAgICAgICAgICAgICAgICBjaGFycysrOworICAgICAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCgpICsgY2hhcnMgPiBtYXhMZW4pCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBtYXhMZW4gLSBjaGFycyk7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyB2ZXJzaW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHRvIGNyZWF0ZSB0aGUgZ2l2ZW4gdGFibGUsIGNvbXBsZXRlCisgICAgICogd2l0aCBjb2x1bW5zLiBJbmRleGVzIGFuZCBjb25zdHJhaW50cyB3aWxsIGJlIGNyZWF0ZWQgc2VwYXJhdGVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlVGFibGVTUUwoVGFibGUgdGFibGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiQ1JFQVRFIFRBQkxFICIpLmFwcGVuZChnZXRGdWxsTmFtZSh0YWJsZSwgZmFsc2UpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiICgiKTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChnZXREZWNsYXJlQ29sdW1uU1FMKGNvbHNbaV0sIGZhbHNlKSk7CisgICAgICAgIH0KKworICAgICAgICBQcmltYXJ5S2V5IHBrID0gdGFibGUuZ2V0UHJpbWFyeUtleSgpOworICAgICAgICBTdHJpbmcgcGtTdHI7CisgICAgICAgIGlmIChwayAhPSBudWxsKSB7CisgICAgICAgICAgICBwa1N0ciA9IGdldFByaW1hcnlLZXlDb25zdHJhaW50U1FMKHBrKTsKKyAgICAgICAgICAgIGlmIChwa1N0ciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKHBrU3RyKTsKKyAgICAgICAgfQorCisgICAgICAgIFVuaXF1ZVtdIHVucXMgPSB0YWJsZS5nZXRVbmlxdWVzKCk7CisgICAgICAgIFN0cmluZyB1bnFTdHI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5xcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdW5xU3RyID0gZ2V0VW5pcXVlQ29uc3RyYWludFNRTCh1bnFzW2ldKTsKKyAgICAgICAgICAgIGlmICh1bnFTdHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZCh1bnFTdHIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyBidWYudG9TdHJpbmcoKSB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB0byBkcm9wIHRoZSBnaXZlbiB0YWJsZS4gSW5kZXhlcworICAgICAqIHdpbGwgYmUgZHJvcHBlZCBzZXBhcmF0ZWx5LiBSZXR1cm5zCisgICAgICogPGNvZGU+RFJPUCBUQUJMRSAmbHQ7dGFibGUgbmFtZSZndDs8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERyb3BUYWJsZVNRTChUYWJsZSB0YWJsZSkgeworICAgICAgICBTdHJpbmcgZHJvcCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGRyb3BUYWJsZVNRTCwgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgZ2V0RnVsbE5hbWUodGFibGUsIGZhbHNlKSB9KTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgZHJvcCB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB0byBjcmVhdGUgdGhlIGdpdmVuIHNlcXVlbmNlLiBSZXR1cm5zCisgICAgICogPGNvZGU+Q1JFQVRFIFNFUVVFTkNFICZsdDtzZXF1ZW5jZSBuYW1lJmd0O1sgU1RBUlQgV0lUSCAmbHQ7c3RhcnQmZ3Q7XQorICAgICAqIFsgSU5DUkVNRU5UIEJZICZsdDtpbmNyZW1lbnQmZ3Q7XTwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlU2VxdWVuY2VTUUwoU2VxdWVuY2Ugc2VxKSB7CisgICAgICAgIGlmIChuZXh0U2VxdWVuY2VRdWVyeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiQ1JFQVRFIFNFUVVFTkNFICIpOworICAgICAgICBidWYuYXBwZW5kKGdldEZ1bGxOYW1lKHNlcSkpOworICAgICAgICBpZiAoc2VxLmdldEluaXRpYWxWYWx1ZSgpICE9IDApCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgU1RBUlQgV0lUSCAiKS5hcHBlbmQoc2VxLmdldEluaXRpYWxWYWx1ZSgpKTsKKyAgICAgICAgaWYgKHNlcS5nZXRJbmNyZW1lbnQoKSA+IDEpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgSU5DUkVNRU5UIEJZICIpLmFwcGVuZChzZXEuZ2V0SW5jcmVtZW50KCkpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyBidWYudG9TdHJpbmcoKSB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB0byBkcm9wIHRoZSBnaXZlbiBzZXF1ZW5jZS4gUmV0dXJucworICAgICAqIDxjb2RlPkRST1AgU0VRVUVOQ0UgJmx0O3NlcXVlbmNlIG5hbWUmZ3Q7PC9jb2RlPiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREcm9wU2VxdWVuY2VTUUwoU2VxdWVuY2Ugc2VxKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ICJEUk9QIFNFUVVFTkNFICIgKyBnZXRGdWxsTmFtZShzZXEpIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHRvIGNyZWF0ZSB0aGUgZ2l2ZW4gaW5kZXguIFJldHVybnMKKyAgICAgKiA8Y29kZT5DUkVBVEUgW1VOSVFVRV0gSU5ERVggJmx0O2luZGV4IG5hbWUmZ3Q7IE9OICZsdDt0YWJsZSBuYW1lJmd0OworICAgICAqICgmbHQ7Y29sIGxpc3QmZ3Q7KTwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlSW5kZXhTUUwoSW5kZXggaW5kZXgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiQ1JFQVRFICIpOworICAgICAgICBpZiAoaW5kZXguaXNVbmlxdWUoKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlVOSVFVRSAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiSU5ERVggIikuYXBwZW5kKGluZGV4LmdldE5hbWUoKSk7CisKKyAgICAgICAgYnVmLmFwcGVuZCgiIE9OICIpLmFwcGVuZChnZXRGdWxsTmFtZShpbmRleC5nZXRUYWJsZSgpLCBmYWxzZSkpOworICAgICAgICBidWYuYXBwZW5kKCIgKCIpLmFwcGVuZChTdHJpbmdzLmpvaW4oaW5kZXguZ2V0Q29sdW1ucygpLCAiLCAiKSkuCisgICAgICAgICAgICBhcHBlbmQoIikiKTsKKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyBidWYudG9TdHJpbmcoKSB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB0byBkcm9wIHRoZSBnaXZlbiBpbmRleC4gUmV0dXJucworICAgICAqIDxjb2RlPkRST1AgSU5ERVggJmx0O2luZGV4IG5hbWUmZ3Q7PC9jb2RlPiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREcm9wSW5kZXhTUUwoSW5kZXggaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkRST1AgSU5ERVggIiArIGdldEZ1bGxOYW1lKGluZGV4KSB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB0byBhZGQgdGhlIGdpdmVuIGNvbHVtbiB0bworICAgICAqIGl0cyB0YWJsZS4gUmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIG9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkLiBSZXR1cm5zCisgICAgICogPGNvZGU+QUxURVIgVEFCTEUgJmx0O3RhYmxlIG5hbWUmZ3Q7IEFERCAoJmx0O2NvbCBkZWMmZ3Q7KTwvY29kZT4KKyAgICAgKiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZGRDb2x1bW5TUUwoQ29sdW1uIGNvbHVtbikgeworICAgICAgICBpZiAoIXN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhBZGRDb2x1bW4pCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKworICAgICAgICBTdHJpbmcgZGVjID0gZ2V0RGVjbGFyZUNvbHVtblNRTChjb2x1bW4sIHRydWUpOworICAgICAgICBpZiAoZGVjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkFMVEVSIFRBQkxFICIKKyAgICAgICAgICAgICsgZ2V0RnVsbE5hbWUoY29sdW1uLmdldFRhYmxlKCksIGZhbHNlKSArICIgQUREICIgKyBkZWMgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzZXJpZXMgb2YgU1FMIHN0YXRlbWVudHMgdG8gZHJvcCB0aGUgZ2l2ZW4gY29sdW1uIGZyb20KKyAgICAgKiBpdHMgdGFibGUuIFJldHVybiBhbiBlbXB0eSBhcnJheSBpZiBvcGVyYXRpb24gbm90IHN1cHBvcnRlZC4gUmV0dXJucworICAgICAqIDxjb2RlPkFMVEVSIFRBQkxFICZsdDt0YWJsZSBuYW1lJmd0OyBEUk9QIENPTFVNTiAmbHQ7Y29sIG5hbWUmZ3Q7PC9jb2RlPgorICAgICAqIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERyb3BDb2x1bW5TUUwoQ29sdW1uIGNvbHVtbikgeworICAgICAgICBpZiAoIXN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhEcm9wQ29sdW1uKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ICJBTFRFUiBUQUJMRSAiCisgICAgICAgICAgICArIGdldEZ1bGxOYW1lKGNvbHVtbi5nZXRUYWJsZSgpLCBmYWxzZSkKKyAgICAgICAgICAgICsgIiBEUk9QIENPTFVNTiAiICsgY29sdW1uIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHRvIGFkZCB0aGUgZ2l2ZW4gcHJpbWFyeSBrZXkgdG8KKyAgICAgKiBpdHMgdGFibGUuIFJldHVybiBhbiBlbXB0eSBhcnJheSBpZiBvcGVyYXRpb24gbm90IHN1cHBvcnRlZC4KKyAgICAgKiBSZXR1cm5zIDxjb2RlPkFMVEVSIFRBQkxFICZsdDt0YWJsZSBuYW1lJmd0OyBBREQKKyAgICAgKiAmbHQ7cGsgY29ucyBzcWwgJmd0OzwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWRkUHJpbWFyeUtleVNRTChQcmltYXJ5S2V5IHBrKSB7CisgICAgICAgIFN0cmluZyBwa3NxbCA9IGdldFByaW1hcnlLZXlDb25zdHJhaW50U1FMKHBrKTsKKyAgICAgICAgaWYgKHBrc3FsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkFMVEVSIFRBQkxFICIKKyAgICAgICAgICAgICsgZ2V0RnVsbE5hbWUocGsuZ2V0VGFibGUoKSwgZmFsc2UpICsgIiBBREQgIiArIHBrc3FsIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHRvIGRyb3AgdGhlIGdpdmVuIHByaW1hcnkga2V5IGZyb20KKyAgICAgKiBpdHMgdGFibGUuIFJldHVybiBhbiBlbXB0eSBhcnJheSBpZiBvcGVyYXRpb24gbm90IHN1cHBvcnRlZC4KKyAgICAgKiBSZXR1cm5zIDxjb2RlPkFMVEVSIFRBQkxFICZsdDt0YWJsZSBuYW1lJmd0OyBEUk9QIENPTlNUUkFJTlQKKyAgICAgKiAmbHQ7cGsgbmFtZSZndDs8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERyb3BQcmltYXJ5S2V5U1FMKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgaWYgKHBrLmdldE5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ICJBTFRFUiBUQUJMRSAiCisgICAgICAgICAgICArIGdldEZ1bGxOYW1lKHBrLmdldFRhYmxlKCksIGZhbHNlKQorICAgICAgICAgICAgKyAiIERST1AgQ09OU1RSQUlOVCAiICsgcGsuZ2V0TmFtZSgpIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHRvIGFkZCB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgdG8KKyAgICAgKiBpdHMgdGFibGUuIFJldHVybiBhbiBlbXB0eSBhcnJheSBpZiBvcGVyYXRpb24gbm90IHN1cHBvcnRlZC4KKyAgICAgKiBSZXR1cm5zIDxjb2RlPkFMVEVSIFRBQkxFICZsdDt0YWJsZSBuYW1lJmd0OyBBREQKKyAgICAgKiAmbHQ7ZmsgY29ucyBzcWwgJmd0OzwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWRkRm9yZWlnbktleVNRTChGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIFN0cmluZyBma1NRTCA9IGdldEZvcmVpZ25LZXlDb25zdHJhaW50U1FMKGZrKTsKKyAgICAgICAgaWYgKGZrU1FMID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkFMVEVSIFRBQkxFICIKKyAgICAgICAgICAgICsgZ2V0RnVsbE5hbWUoZmsuZ2V0VGFibGUoKSwgZmFsc2UpICsgIiBBREQgIiArIGZrU1FMIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHRvIGRyb3AgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IGZyb20KKyAgICAgKiBpdHMgdGFibGUuIFJldHVybiBhbiBlbXB0eSBhcnJheSBpZiBvcGVyYXRpb24gbm90IHN1cHBvcnRlZC4KKyAgICAgKiBSZXR1cm5zIDxjb2RlPkFMVEVSIFRBQkxFICZsdDt0YWJsZSBuYW1lJmd0OyBEUk9QIENPTlNUUkFJTlQKKyAgICAgKiAmbHQ7ZmsgbmFtZSZndDs8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERyb3BGb3JlaWduS2V5U1FMKEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgaWYgKGZrLmdldE5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ICJBTFRFUiBUQUJMRSAiCisgICAgICAgICAgICArIGdldEZ1bGxOYW1lKGZrLmdldFRhYmxlKCksIGZhbHNlKQorICAgICAgICAgICAgKyAiIERST1AgQ09OU1RSQUlOVCAiICsgZmsuZ2V0TmFtZSgpIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWNsYXJhdGlvbiBTUUwgZm9yIHRoZSBnaXZlbiBjb2x1bW4uIFRoaXMgbWV0aG9kIGlzIHVzZWQKKyAgICAgKiBmb3IgZWFjaCBjb2x1bW4gZnJvbSB3aXRoaW4ge0BsaW5rICNnZXRDcmVhdGVUYWJsZVNRTH0gYW5kCisgICAgICoge0BsaW5rICNnZXRBZGRDb2x1bW5TUUx9LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjbGFyZUNvbHVtblNRTChDb2x1bW4gY29sLCBib29sZWFuIGFsdGVyKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoY29sKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRUeXBlTmFtZShjb2wpKTsKKworICAgICAgICAvLyBjYW4ndCBhZGQgY29uc3RyYWludHMgdG8gYSBjb2x1bW4gd2UncmUgYWRkaW5nIGFmdGVyIHRhYmxlCisgICAgICAgIC8vIGNyZWF0aW9uLCBjYXVzZSBzb21lIGRhdGEgbWlnaHQgYWxyZWFkeSBiZSBpbnNlcnRlZAorICAgICAgICBpZiAoIWFsdGVyKSB7CisgICAgICAgICAgICBpZiAoY29sLmdldERlZmF1bHRTdHJpbmcoKSAhPSBudWxsICYmICFjb2wuaXNBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgREVGQVVMVCAiKS5hcHBlbmQoY29sLmdldERlZmF1bHRTdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoY29sLmlzTm90TnVsbCgpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBOT1QgTlVMTCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2wuaXNBdXRvQXNzaWduZWQoKSkgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0c0F1dG9Bc3NpZ24pCisgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImludmFsaWQtYXV0b2Fzc2lnbiIsIHBsYXRmb3JtLCBjb2wpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF1dG9Bc3NpZ25DbGF1c2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIikuYXBwZW5kKGF1dG9Bc3NpZ25DbGF1c2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIFNRTCBmb3IgdGhlIGdpdmVuIHByaW1hcnkga2V5LiBUaGlzIG1ldGhvZCBpcworICAgICAqIHVzZWQgZnJvbSB3aXRoaW4ge0BsaW5rICNnZXRDcmVhdGVUYWJsZVNRTH0gYW5kCisgICAgICoge0BsaW5rICNnZXRBZGRQcmltYXJ5S2V5U1FMfS4gUmV0dXJucworICAgICAqIDxjb2RlPkNPTlNUUkFJTlQgJmx0O3BrIG5hbWUmZ3Q7IFBSSU1BUlkgS0VZICgmbHQ7Y29sIGxpc3QmZ3Q7KTwvY29kZT4KKyAgICAgKiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbnN0cmFpbnRTUUwoUHJpbWFyeUtleSBwaykgeworICAgICAgICAvLyBpZiB3ZSBoYXZlIGRpc2FibGVkIHRoZSBjcmVhdGlvbiBvZiBwcmltYXJ5IGtleXMsIGFib3J0IGhlcmUKKyAgICAgICAgaWYgKCFjcmVhdGVQcmltYXJ5S2V5cykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZyBuYW1lID0gcGsuZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIHJlc2VydmVkV29yZFNldC5jb250YWlucyhuYW1lLnRvVXBwZXJDYXNlKCkpKQorICAgICAgICAgICAgbmFtZSA9IG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBDT05TX05BTUVfQkVGT1JFLmVxdWFscyhjb25zdHJhaW50TmFtZU1vZGUpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiQ09OU1RSQUlOVCAiKS5hcHBlbmQobmFtZSkuYXBwZW5kKCIgIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlBSSU1BUlkgS0VZICIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIENPTlNfTkFNRV9NSUQuZXF1YWxzKGNvbnN0cmFpbnROYW1lTW9kZSkpCisgICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgiICIpOworICAgICAgICBidWYuYXBwZW5kKCIoIikuYXBwZW5kKFN0cmluZ3Muam9pbihway5nZXRDb2x1bW5zKCksICIsICIpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiKSIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIENPTlNfTkFNRV9BRlRFUi5lcXVhbHMoY29uc3RyYWludE5hbWVNb2RlKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBDT05TVFJBSU5UICIpLmFwcGVuZChuYW1lKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVjbGFyYXRpb24gU1FMIGZvciB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXksIG9yIG51bGwgaWYgaXQgaXMKKyAgICAgKiBub3Qgc3VwcG9ydGVkLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZyb20gd2l0aGluCisgICAgICoge0BsaW5rICNnZXRDcmVhdGVUYWJsZVNRTH0gYW5kIHtAbGluayAjZ2V0QWRkRm9yZWlnbktleVNRTH0uIFJldHVybnMKKyAgICAgKiA8Y29kZT5DT05TVFJBSU5UICZsdDtjb25zIG5hbWUmZ3Q7IEZPUkVJR04gS0VZICgmbHQ7Y29sIGxpc3QmZ3Q7KQorICAgICAqIFJFRkVSRU5DRVMgJmx0O2ZvcmVpZ24gdGFibGUmZ3Q7ICgmbHQ7Y29sIGxpc3QmZ3Q7KQorICAgICAqIFtPTiBERUxFVEUgJmx0O2FjdGlvbiZndDtdIFtPTiBVUERBVEUgJmx0O2FjdGlvbiZndDtdPC9jb2RlPiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rm9yZWlnbktleUNvbnN0cmFpbnRTUUwoRm9yZWlnbktleSBmaykgeworICAgICAgICBpZiAoIXN1cHBvcnRzRm9yZWlnbktleXMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGZrLmdldERlbGV0ZUFjdGlvbigpID09IEZvcmVpZ25LZXkuQUNUSU9OX05PTkUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGZrLmlzRGVmZXJyZWQoKSAmJiAhc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghc3VwcG9ydHNEZWxldGVBY3Rpb24oZmsuZ2V0RGVsZXRlQWN0aW9uKCkpCisgICAgICAgICAgICB8fCAhc3VwcG9ydHNVcGRhdGVBY3Rpb24oZmsuZ2V0VXBkYXRlQWN0aW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ29sdW1uW10gbG9jYWxzID0gZmsuZ2V0Q29sdW1ucygpOworICAgICAgICBDb2x1bW5bXSBmb3JlaWducyA9IGZrLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisKKyAgICAgICAgaW50IGRlbEFjdGlvbklkID0gZmsuZ2V0RGVsZXRlQWN0aW9uKCk7CisgICAgICAgIGlmIChkZWxBY3Rpb25JZCA9PSBGb3JlaWduS2V5LkFDVElPTl9OVUxMKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbHNbaV0uaXNOb3ROdWxsKCkpCisgICAgICAgICAgICAgICAgICAgIGRlbEFjdGlvbklkID0gRm9yZWlnbktleS5BQ1RJT05fTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkZWxBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKGRlbEFjdGlvbklkKTsKKyAgICAgICAgU3RyaW5nIHVwQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShmay5nZXRVcGRhdGVBY3Rpb24oKSk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGZrLmdldE5hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBDT05TX05BTUVfQkVGT1JFLmVxdWFscyhjb25zdHJhaW50TmFtZU1vZGUpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiQ09OU1RSQUlOVCAiKS5hcHBlbmQoZmsuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiRk9SRUlHTiBLRVkgIik7CisgICAgICAgIGlmIChmay5nZXROYW1lKCkgIT0gbnVsbCAmJiBDT05TX05BTUVfTUlELmVxdWFscyhjb25zdHJhaW50TmFtZU1vZGUpKQorICAgICAgICAgICAgYnVmLmFwcGVuZChmay5nZXROYW1lKCkpLmFwcGVuZCgiICIpOworICAgICAgICBidWYuYXBwZW5kKCIoIikuYXBwZW5kKFN0cmluZ3Muam9pbihsb2NhbHMsICIsICIpKS5hcHBlbmQoIikiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIFJFRkVSRU5DRVMgIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0RnVsbE5hbWUoZm9yZWlnbnNbMF0uZ2V0VGFibGUoKSwgZmFsc2UpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiICgiKS5hcHBlbmQoU3RyaW5ncy5qb2luKGZvcmVpZ25zLCAiLCAiKSkuYXBwZW5kKCIpIik7CisgICAgICAgIGlmIChkZWxBY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBPTiBERUxFVEUgIikuYXBwZW5kKGRlbEFjdGlvbik7CisgICAgICAgIGlmICh1cEFjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIE9OIFVQREFURSAiKS5hcHBlbmQodXBBY3Rpb24pOworICAgICAgICBpZiAoZmsuaXNEZWZlcnJlZCgpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIElOSVRJQUxMWSBERUZFUlJFRCIpOworICAgICAgICBpZiAoc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIERFRkVSUkFCTEUiKTsKKyAgICAgICAgaWYgKGZrLmdldE5hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBDT05TX05BTUVfQUZURVIuZXF1YWxzKGNvbnN0cmFpbnROYW1lTW9kZSkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgQ09OU1RSQUlOVCAiKS5hcHBlbmQoZmsuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEFjdGlvbk5hbWUoaW50IGFjdGlvbikgeworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBGb3JlaWduS2V5LkFDVElPTl9DQVNDQURFOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ0FTQ0FERSI7CisgICAgICAgICAgICBjYXNlIEZvcmVpZ25LZXkuQUNUSU9OX05VTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJTRVQgTlVMTCI7CisgICAgICAgICAgICBjYXNlIEZvcmVpZ25LZXkuQUNUSU9OX0RFRkFVTFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJTRVQgREVGQVVMVCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGRhdGFiYXNlIHN1cHBvcnRzIHRoZSBnaXZlbiBmb3JlaWduIGtleSBkZWxldGUgYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVsZXRlQWN0aW9uKGludCBhY3Rpb24pIHsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBGb3JlaWduS2V5LkFDVElPTl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghc3VwcG9ydHNGb3JlaWduS2V5cykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRm9yZWlnbktleS5BQ1RJT05fUkVTVFJJQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRzUmVzdHJpY3REZWxldGVBY3Rpb247CisgICAgICAgICAgICBjYXNlIEZvcmVpZ25LZXkuQUNUSU9OX0NBU0NBREU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRzQ2FzY2FkZURlbGV0ZUFjdGlvbjsKKyAgICAgICAgICAgIGNhc2UgRm9yZWlnbktleS5BQ1RJT05fTlVMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydHNOdWxsRGVsZXRlQWN0aW9uOworICAgICAgICAgICAgY2FzZSBGb3JlaWduS2V5LkFDVElPTl9ERUZBVUxUOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c0RlZmF1bHREZWxldGVBY3Rpb247CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBkYXRhYmFzZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgdXBkYXRlIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZUFjdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIGlmIChhY3Rpb24gPT0gRm9yZWlnbktleS5BQ1RJT05fTk9ORSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXN1cHBvcnRzRm9yZWlnbktleXMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEZvcmVpZ25LZXkuQUNUSU9OX1JFU1RSSUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c1Jlc3RyaWN0VXBkYXRlQWN0aW9uOworICAgICAgICAgICAgY2FzZSBGb3JlaWduS2V5LkFDVElPTl9DQVNDQURFOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c0Nhc2NhZGVVcGRhdGVBY3Rpb247CisgICAgICAgICAgICBjYXNlIEZvcmVpZ25LZXkuQUNUSU9OX05VTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRzTnVsbFVwZGF0ZUFjdGlvbjsKKyAgICAgICAgICAgIGNhc2UgRm9yZWlnbktleS5BQ1RJT05fREVGQVVMVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydHNEZWZhdWx0VXBkYXRlQWN0aW9uOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIFNRTCBmb3IgdGhlIGdpdmVuIHVuaXF1ZSBjb25zdHJhaW50LiBUaGlzCisgICAgICogbWV0aG9kIGlzIHVzZWQgZnJvbSB3aXRoaW4ge0BsaW5rICNnZXRDcmVhdGVUYWJsZVNRTH0uCisgICAgICogUmV0dXJucwk8Y29kZT5DT05TVFJBSU5UICZsdDtuYW1lJmd0OyBVTklRVUUgKCZsdDtjb2wgbGlzdCZndDspPC9jb2RlPgorICAgICAqIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50U1FMKFVuaXF1ZSB1bnEpIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1VuaXF1ZUNvbnN0cmFpbnRzCisgICAgICAgICAgICB8fCAodW5xLmlzRGVmZXJyZWQoKSAmJiAhc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmICh1bnEuZ2V0TmFtZSgpICE9IG51bGwKKyAgICAgICAgICAgICYmIENPTlNfTkFNRV9CRUZPUkUuZXF1YWxzKGNvbnN0cmFpbnROYW1lTW9kZSkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCJDT05TVFJBSU5UICIpLmFwcGVuZCh1bnEuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiVU5JUVVFICIpOworICAgICAgICBpZiAodW5xLmdldE5hbWUoKSAhPSBudWxsICYmIENPTlNfTkFNRV9NSUQuZXF1YWxzKGNvbnN0cmFpbnROYW1lTW9kZSkpCisgICAgICAgICAgICBidWYuYXBwZW5kKHVucS5nZXROYW1lKCkpLmFwcGVuZCgiICIpOworICAgICAgICBidWYuYXBwZW5kKCIoIikuYXBwZW5kKFN0cmluZ3Muam9pbih1bnEuZ2V0Q29sdW1ucygpLCAiLCAiKSkuCisgICAgICAgICAgICBhcHBlbmQoIikiKTsKKyAgICAgICAgaWYgKHVucS5pc0RlZmVycmVkKCkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgSU5JVElBTExZIERFRkVSUkVEIik7CisgICAgICAgIGlmIChzdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHMpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgREVGRVJSQUJMRSIpOworICAgICAgICBpZiAodW5xLmdldE5hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBDT05TX05BTUVfQUZURVIuZXF1YWxzKGNvbnN0cmFpbnROYW1lTW9kZSkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgQ09OU1RSQUlOVCAiKS5hcHBlbmQodW5xLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEYXRhYmFzZSBtZXRhZGF0YQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmaWx0ZXIgc3lzdGVtIHRhYmxlcyBmcm9tIGRhdGFiYXNlIG1ldGFkYXRhLgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0YWJsZSBuYW1lIHJlcHJlc2VudHMgYSBzeXN0ZW0gdGFibGUgdGhhdAorICAgICAqIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBzY2hlbWEgZGVmaW5pdGlvbi4gQnkgZGVmYXVsdCwgcmV0dXJucworICAgICAqIHRydWUgb25seSBpZiB0aGUgZ2l2ZW4gdGFibGUgaXMgaW4gdGhlIGludGVybmFsIGxpc3Qgb2Ygc3lzdGVtIHRhYmxlcywKKyAgICAgKiBvciBpZiB0aGUgZ2l2ZW4gc2NoZW1hIGlzIGluIHRoZSBsaXN0IG9mIHN5c3RlbSBzY2hlbWFzIGFuZCBpcyBub3QKKyAgICAgKiB0aGUgdGFyZ2V0IHNjaGVtYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSB0YWJsZSBuYW1lCisgICAgICogQHBhcmFtIHNjaGVtYSB0aGUgdGFibGUgc2NoZW1hOyBtYXkgYmUgbnVsbAorICAgICAqIEBwYXJhbSB0YXJnZXRTY2hlbWEgaWYgdHJ1ZSwgdGhlbiB0aGUgZ2l2ZW4gc2NoZW1hIHdhcyBsaXN0ZWQgYnkKKyAgICAgKiB0aGUgdXNlciBhcyBvbmUgb2YgaGlzIHNjaGVtYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbVRhYmxlKFN0cmluZyBuYW1lLCBTdHJpbmcgc2NoZW1hLAorICAgICAgICBib29sZWFuIHRhcmdldFNjaGVtYSkgeworICAgICAgICBpZiAoc3lzdGVtVGFibGVTZXQuY29udGFpbnMobmFtZS50b1VwcGVyQ2FzZSgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gIXRhcmdldFNjaGVtYSAmJiBzY2hlbWEgIT0gbnVsbAorICAgICAgICAgICAgJiYgc3lzdGVtU2NoZW1hU2V0LmNvbnRhaW5zKHNjaGVtYS50b1VwcGVyQ2FzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGZpbHRlciBzeXN0ZW0gaW5kZXhlcyBmcm9tIGRhdGFiYXNlIG1ldGFkYXRhLgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBpbmRleCBuYW1lIHJlcHJlc2VudHMgYSBzeXN0ZW0gaW5kZXggdGhhdAorICAgICAqIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBzY2hlbWEgZGVmaW5pdGlvbi4gUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGluZGV4IG5hbWUKKyAgICAgKiBAcGFyYW0gdGFibGUgdGhlIGluZGV4IHRhYmxlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1JbmRleChTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZmlsdGVyIHN5c3RlbSBzZXF1ZW5jZXMgZnJvbSBkYXRhYmFzZSBtZXRhZGF0YS4KKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgcmVwcmVzZW50cyBhIHN5c3RlbSBzZXF1ZW5jZSB0aGF0CisgICAgICogc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIHNjaGVtYSBkZWZpbml0aW9uLiBSZXR1cm5zIHRydWUgaWYgc3lzdGVtCisgICAgICogc2NoZW1hIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdGFibGUgbmFtZQorICAgICAqIEBwYXJhbSBzY2hlbWEgdGhlIHRhYmxlIHNjaGVtYTsgbWF5IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gdGFyZ2V0U2NoZW1hIGlmIHRydWUsIHRoZW4gdGhlIGdpdmVuIHNjaGVtYSB3YXMgbGlzdGVkIGJ5CisgICAgICogdGhlIHVzZXIgYXMgb25lIG9mIGhpcyBzY2hlbWFzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1TZXF1ZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNjaGVtYSwKKyAgICAgICAgYm9vbGVhbiB0YXJnZXRTY2hlbWEpIHsKKyAgICAgICAgcmV0dXJuICF0YXJnZXRTY2hlbWEgJiYgc2NoZW1hICE9IG51bGwKKyAgICAgICAgICAgICYmIHN5c3RlbVNjaGVtYVNldC5jb250YWlucyhzY2hlbWEudG9VcHBlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmbGVjdCBvbiB0aGUgc2NoZW1hIHRvIGZpbmQgdGFibGVzIG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIFRhYmxlW10gZ2V0VGFibGVzKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzU2NoZW1hRm9yR2V0VGFibGVzKQorICAgICAgICAgICAgc2NoZW1hTmFtZSA9IG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNjaGVtYU5hbWUgPSBnZXRTY2hlbWFOYW1lRm9yTWV0YWRhdGEoc2NoZW1hTmFtZSk7CisKKyAgICAgICAgU3RyaW5nW10gdHlwZXMgPSBTdHJpbmdzLnNwbGl0KHRhYmxlVHlwZXMsICIsIiwgMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGVzW2ldLnRyaW0oKTsKKworICAgICAgICBiZWZvcmVNZXRhZGF0YU9wZXJhdGlvbihjb25uKTsKKyAgICAgICAgUmVzdWx0U2V0IHRhYmxlcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YWJsZXMgPSBtZXRhLmdldFRhYmxlcyhnZXRDYXRhbG9nTmFtZUZvck1ldGFkYXRhKGNhdGFsb2cpLAorICAgICAgICAgICAgICAgIHNjaGVtYU5hbWUsIGdldFRhYmxlTmFtZUZvck1ldGFkYXRhKHRhYmxlTmFtZSksIHR5cGVzKTsKKyAgICAgICAgICAgIExpc3QgdGFibGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgd2hpbGUgKHRhYmxlcyAhPSBudWxsICYmIHRhYmxlcy5uZXh0KCkpCisgICAgICAgICAgICAgICAgdGFibGVMaXN0LmFkZChuZXdUYWJsZSh0YWJsZXMpKTsKKyAgICAgICAgICAgIHJldHVybiAoVGFibGVbXSkgdGFibGVMaXN0LnRvQXJyYXkobmV3IFRhYmxlW3RhYmxlTGlzdC5zaXplKCldKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh0YWJsZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB0YWJsZSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2NoZW1hIG1ldGFkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBUYWJsZSBuZXdUYWJsZShSZXN1bHRTZXQgdGFibGVNZXRhKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgVGFibGUgdCA9IG5ldyBUYWJsZSgpOworICAgICAgICB0LnNldE5hbWUodGFibGVNZXRhLmdldFN0cmluZygiVEFCTEVfTkFNRSIpKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmbGVjdCBvbiB0aGUgc2NoZW1hIHRvIGZpbmQgc2VxdWVuY2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lIHBhdHRlcm4uCisgICAgICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBieSBkZWZhdWx0LCBhcyB0aGVyZSBpcyBubyBzdGFuZGFyZCB3YXkgdG8KKyAgICAgKiByZXRyaWV2ZSBhIGxpc3Qgb2Ygc2VxdWVuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXF1ZW5jZVtdIGdldFNlcXVlbmNlcyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHNlcXVlbmNlTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IGdldFNlcXVlbmNlc1NRTChzY2hlbWFOYW1lLCBzZXF1ZW5jZU5hbWUpOworICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcXVlbmNlWzBdOworCisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHN0cik7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gMTsKKyAgICAgICAgICAgIGlmIChzY2hlbWFOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3RtbnQuc2V0U3RyaW5nKGlkeCsrLCBzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdG1udC5zZXRTdHJpbmcoaWR4KyssIHNlcXVlbmNlTmFtZSk7CisKKyAgICAgICAgICAgIHJzID0gc3RtbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICBMaXN0IHNlcUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKQorICAgICAgICAgICAgICAgIHNlcUxpc3QuYWRkKG5ld1NlcXVlbmNlKHJzKSk7CisgICAgICAgICAgICByZXR1cm4gKFNlcXVlbmNlW10pIHNlcUxpc3QudG9BcnJheShuZXcgU2VxdWVuY2Vbc2VxTGlzdC5zaXplKCldKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG1udC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2VxdWVuY2UgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHNjaGVtYSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbmV3U2VxdWVuY2UoUmVzdWx0U2V0IHNlcXVlbmNlTWV0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFNlcXVlbmNlIHNlcSA9IG5ldyBTZXF1ZW5jZSgpOworICAgICAgICBzZXEuc2V0U2NoZW1hTmFtZShzZXF1ZW5jZU1ldGEuZ2V0U3RyaW5nKCJTRVFVRU5DRV9TQ0hFTUEiKSk7CisgICAgICAgIHNlcS5zZXROYW1lKHNlcXVlbmNlTWV0YS5nZXRTdHJpbmcoIlNFUVVFTkNFX05BTUUiKSk7CisgICAgICAgIHJldHVybiBzZXE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTUUwgbmVlZGVkIHRvIHNlbGVjdCB0aGUgbGlzdCBvZiBzZXF1ZW5jZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXF1ZW5jZXNTUUwoU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmbGVjdCBvbiB0aGUgc2NoZW1hIHRvIGZpbmQgY29sdW1ucyBtYXRjaGluZyB0aGUgZ2l2ZW4gdGFibGUgYW5kCisgICAgICogY29sdW1uIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sdW1uTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSA9PSBudWxsICYmICFzdXBwb3J0c051bGxUYWJsZUZvckdldENvbHVtbnMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAoIXN1cHBvcnRzU2NoZW1hRm9yR2V0Q29sdW1ucykKKyAgICAgICAgICAgIHNjaGVtYU5hbWUgPSBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzY2hlbWFOYW1lID0gZ2V0U2NoZW1hTmFtZUZvck1ldGFkYXRhKHNjaGVtYU5hbWUpOworCisgICAgICAgIGJlZm9yZU1ldGFkYXRhT3BlcmF0aW9uKGNvbm4pOworICAgICAgICBSZXN1bHRTZXQgY29scyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb2xzID0gbWV0YS5nZXRDb2x1bW5zKGdldENhdGFsb2dOYW1lRm9yTWV0YWRhdGEoY2F0YWxvZyksCisgICAgICAgICAgICAgICAgc2NoZW1hTmFtZSwgZ2V0VGFibGVOYW1lRm9yTWV0YWRhdGEodGFibGVOYW1lKSwKKyAgICAgICAgICAgICAgICBnZXRDb2x1bW5OYW1lRm9yTWV0YWRhdGEoY29sdW1uTmFtZSkpOworCisgICAgICAgICAgICBMaXN0IGNvbHVtbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAoY29scyAhPSBudWxsICYmIGNvbHMubmV4dCgpKQorICAgICAgICAgICAgICAgIGNvbHVtbkxpc3QuYWRkKG5ld0NvbHVtbihjb2xzKSk7CisgICAgICAgICAgICByZXR1cm4gKENvbHVtbltdKSBjb2x1bW5MaXN0LnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IENvbHVtbltjb2x1bW5MaXN0LnNpemUoKV0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGNvbHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb2xzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY29sdW1uIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2hlbWEgbWV0YWRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbHVtbiBuZXdDb2x1bW4oUmVzdWx0U2V0IGNvbE1ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW4gYyA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgYy5zZXRTY2hlbWFOYW1lKGNvbE1ldGEuZ2V0U3RyaW5nKCJUQUJMRV9TQ0hFTSIpKTsKKyAgICAgICAgYy5zZXRUYWJsZU5hbWUoY29sTWV0YS5nZXRTdHJpbmcoIlRBQkxFX05BTUUiKSk7CisgICAgICAgIGMuc2V0TmFtZShjb2xNZXRhLmdldFN0cmluZygiQ09MVU1OX05BTUUiKSk7CisgICAgICAgIGMuc2V0VHlwZShjb2xNZXRhLmdldEludCgiREFUQV9UWVBFIikpOworICAgICAgICBjLnNldFR5cGVOYW1lKGNvbE1ldGEuZ2V0U3RyaW5nKCJUWVBFX05BTUUiKSk7CisgICAgICAgIGMuc2V0U2l6ZShjb2xNZXRhLmdldEludCgiQ09MVU1OX1NJWkUiKSk7CisgICAgICAgIGMuc2V0RGVjaW1hbERpZ2l0cyhjb2xNZXRhLmdldEludCgiREVDSU1BTF9ESUdJVFMiKSk7CisgICAgICAgIGMuc2V0Tm90TnVsbChjb2xNZXRhLmdldEludCgiTlVMTEFCTEUiKQorICAgICAgICAgICAgPT0gRGF0YWJhc2VNZXRhRGF0YS5jb2x1bW5Ob051bGxzKTsKKworICAgICAgICBTdHJpbmcgZGVmID0gY29sTWV0YS5nZXRTdHJpbmcoIkNPTFVNTl9ERUYiKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGRlZikgJiYgISJudWxsIi5lcXVhbHNJZ25vcmVDYXNlKGRlZikpCisgICAgICAgICAgICBjLnNldERlZmF1bHRTdHJpbmcoZGVmKTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmbGVjdCBvbiB0aGUgc2NoZW1hIHRvIGZpbmQgcHJpbWFyeSBrZXlzIGZvciB0aGUgZ2l2ZW4gdGFibGUgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbWFyeUtleVtdIGdldFByaW1hcnlLZXlzKERhdGFiYXNlTWV0YURhdGEgbWV0YSwKKyAgICAgICAgU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodXNlR2V0QmVzdFJvd0lkZW50aWZpZXJGb3JQcmltYXJ5S2V5cykKKyAgICAgICAgICAgIHJldHVybiBnZXRQcmltYXJ5S2V5c0Zyb21CZXN0Um93SWRlbnRpZmllcihtZXRhLCBjYXRhbG9nLAorICAgICAgICAgICAgICAgIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSwgY29ubik7CisgICAgICAgIHJldHVybiBnZXRQcmltYXJ5S2V5c0Zyb21HZXRQcmltYXJ5S2V5cyhtZXRhLCBjYXRhbG9nLAorICAgICAgICAgICAgc2NoZW1hTmFtZSwgdGFibGVOYW1lLCBjb25uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZsZWN0IG9uIHRoZSBzY2hlbWEgdG8gZmluZCBwcmltYXJ5IGtleXMgZm9yIHRoZSBnaXZlbiB0YWJsZSBwYXR0ZXJuLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmltYXJ5S2V5W10gZ2V0UHJpbWFyeUtleXNGcm9tR2V0UHJpbWFyeUtleXMKKyAgICAgICAgKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSA9PSBudWxsICYmICFzdXBwb3J0c051bGxUYWJsZUZvckdldFByaW1hcnlLZXlzKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYmVmb3JlTWV0YWRhdGFPcGVyYXRpb24oY29ubik7CisgICAgICAgIFJlc3VsdFNldCBwa3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGtzID0gbWV0YS5nZXRQcmltYXJ5S2V5cyhnZXRDYXRhbG9nTmFtZUZvck1ldGFkYXRhKGNhdGFsb2cpLAorICAgICAgICAgICAgICAgIGdldFNjaGVtYU5hbWVGb3JNZXRhZGF0YShzY2hlbWFOYW1lKSwKKyAgICAgICAgICAgICAgICBnZXRUYWJsZU5hbWVGb3JNZXRhZGF0YSh0YWJsZU5hbWUpKTsKKworICAgICAgICAgICAgTGlzdCBwa0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAocGtzICE9IG51bGwgJiYgcGtzLm5leHQoKSkKKyAgICAgICAgICAgICAgICBwa0xpc3QuYWRkKG5ld1ByaW1hcnlLZXkocGtzKSk7CisgICAgICAgICAgICByZXR1cm4gKFByaW1hcnlLZXlbXSkgcGtMaXN0LnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IFByaW1hcnlLZXlbcGtMaXN0LnNpemUoKV0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBrcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBrcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHByaW1hcnkga2V5IGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2hlbWEgbWV0YWRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW1hcnlLZXkgbmV3UHJpbWFyeUtleShSZXN1bHRTZXQgcGtNZXRhKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IG5ldyBQcmltYXJ5S2V5KCk7CisgICAgICAgIHBrLnNldFNjaGVtYU5hbWUocGtNZXRhLmdldFN0cmluZygiVEFCTEVfU0NIRU0iKSk7CisgICAgICAgIHBrLnNldFRhYmxlTmFtZShwa01ldGEuZ2V0U3RyaW5nKCJUQUJMRV9OQU1FIikpOworICAgICAgICBway5zZXRDb2x1bW5OYW1lKHBrTWV0YS5nZXRTdHJpbmcoIkNPTFVNTl9OQU1FIikpOworICAgICAgICBway5zZXROYW1lKHBrTWV0YS5nZXRTdHJpbmcoIlBLX05BTUUiKSk7CisgICAgICAgIHJldHVybiBwazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZsZWN0IG9uIHRoZSBzY2hlbWEgdG8gZmluZCBwcmltYXJ5IGtleXMgZm9yIHRoZSBnaXZlbiB0YWJsZSBwYXR0ZXJuLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmltYXJ5S2V5W10gZ2V0UHJpbWFyeUtleXNGcm9tQmVzdFJvd0lkZW50aWZpZXIKKyAgICAgICAgKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYmVmb3JlTWV0YWRhdGFPcGVyYXRpb24oY29ubik7CisgICAgICAgIFJlc3VsdFNldCBwa3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGtzID0gbWV0YS5nZXRCZXN0Um93SWRlbnRpZmllcihjYXRhbG9nLCBzY2hlbWFOYW1lLAorICAgICAgICAgICAgICAgIHRhYmxlTmFtZSwgMCwgZmFsc2UpOworCisgICAgICAgICAgICBMaXN0IHBrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHdoaWxlIChwa3MgIT0gbnVsbCAmJiBwa3MubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUHJpbWFyeUtleSBwayA9IG5ldyBQcmltYXJ5S2V5KCk7CisgICAgICAgICAgICAgICAgcGsuc2V0U2NoZW1hTmFtZShzY2hlbWFOYW1lKTsKKyAgICAgICAgICAgICAgICBway5zZXRUYWJsZU5hbWUodGFibGVOYW1lKTsKKyAgICAgICAgICAgICAgICBway5zZXRDb2x1bW5OYW1lKHBrcy5nZXRTdHJpbmcoIkNPTFVNTl9OQU1FIikpOworICAgICAgICAgICAgICAgIHBrTGlzdC5hZGQocGspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChQcmltYXJ5S2V5W10pIHBrTGlzdC50b0FycmF5CisgICAgICAgICAgICAgICAgKG5ldyBQcmltYXJ5S2V5W3BrTGlzdC5zaXplKCldKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwa3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBwa3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZmxlY3Qgb24gdGhlIHNjaGVtYSB0byBmaW5kIGluZGV4ZXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHRhYmxlIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIEluZGV4W10gZ2V0SW5kZXhJbmZvKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBib29sZWFuIHVuaXF1ZSwKKyAgICAgICAgYm9vbGVhbiBhcHByb3gsIENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0YWJsZU5hbWUgPT0gbnVsbCAmJiAhc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbmRleEluZm8pCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBiZWZvcmVNZXRhZGF0YU9wZXJhdGlvbihjb25uKTsKKyAgICAgICAgUmVzdWx0U2V0IGluZGV4ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5kZXhlcyA9IG1ldGEuZ2V0SW5kZXhJbmZvKGdldENhdGFsb2dOYW1lRm9yTWV0YWRhdGEoY2F0YWxvZyksCisgICAgICAgICAgICAgICAgZ2V0U2NoZW1hTmFtZUZvck1ldGFkYXRhKHNjaGVtYU5hbWUpLAorICAgICAgICAgICAgICAgIGdldFRhYmxlTmFtZUZvck1ldGFkYXRhKHRhYmxlTmFtZSksIHVuaXF1ZSwgYXBwcm94KTsKKworICAgICAgICAgICAgTGlzdCBpbmRleExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXhlcyAhPSBudWxsICYmIGluZGV4ZXMubmV4dCgpKQorICAgICAgICAgICAgICAgIGluZGV4TGlzdC5hZGQobmV3SW5kZXgoaW5kZXhlcykpOworICAgICAgICAgICAgcmV0dXJuIChJbmRleFtdKSBpbmRleExpc3QudG9BcnJheShuZXcgSW5kZXhbaW5kZXhMaXN0LnNpemUoKV0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluZGV4ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbmRleGVzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5kZXggZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHNjaGVtYSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5kZXggbmV3SW5kZXgoUmVzdWx0U2V0IGlkeE1ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBJbmRleCBpZHggPSBuZXcgSW5kZXgoKTsKKyAgICAgICAgaWR4LnNldFNjaGVtYU5hbWUoaWR4TWV0YS5nZXRTdHJpbmcoIlRBQkxFX1NDSEVNIikpOworICAgICAgICBpZHguc2V0VGFibGVOYW1lKGlkeE1ldGEuZ2V0U3RyaW5nKCJUQUJMRV9OQU1FIikpOworICAgICAgICBpZHguc2V0Q29sdW1uTmFtZShpZHhNZXRhLmdldFN0cmluZygiQ09MVU1OX05BTUUiKSk7CisgICAgICAgIGlkeC5zZXROYW1lKGlkeE1ldGEuZ2V0U3RyaW5nKCJJTkRFWF9OQU1FIikpOworICAgICAgICBpZHguc2V0VW5pcXVlKCFpZHhNZXRhLmdldEJvb2xlYW4oIk5PTl9VTklRVUUiKSk7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmbGVjdCBvbiB0aGUgc2NoZW1hIHRvIHJldHVybiBmb3JlaWduIGtleXMgaW1wb3J0ZWQgYnkgdGhlIGdpdmVuCisgICAgICogdGFibGUgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWlnbktleVtdIGdldEltcG9ydGVkS2V5cyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c0ZvcmVpZ25LZXlzKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh0YWJsZU5hbWUgPT0gbnVsbCAmJiAhc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbXBvcnRlZEtleXMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBiZWZvcmVNZXRhZGF0YU9wZXJhdGlvbihjb25uKTsKKyAgICAgICAgUmVzdWx0U2V0IGtleXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAga2V5cyA9IG1ldGEuZ2V0SW1wb3J0ZWRLZXlzKGdldENhdGFsb2dOYW1lRm9yTWV0YWRhdGEoY2F0YWxvZyksCisgICAgICAgICAgICAgICAgZ2V0U2NoZW1hTmFtZUZvck1ldGFkYXRhKHNjaGVtYU5hbWUpLAorICAgICAgICAgICAgICAgIGdldFRhYmxlTmFtZUZvck1ldGFkYXRhKHRhYmxlTmFtZSkpOworCisgICAgICAgICAgICBMaXN0IGltcG9ydGVkS2V5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHdoaWxlIChrZXlzICE9IG51bGwgJiYga2V5cy5uZXh0KCkpCisgICAgICAgICAgICAgICAgaW1wb3J0ZWRLZXlMaXN0LmFkZChuZXdGb3JlaWduS2V5KGtleXMpKTsKKyAgICAgICAgICAgIHJldHVybiAoRm9yZWlnbktleVtdKSBpbXBvcnRlZEtleUxpc3QudG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgRm9yZWlnbktleVtpbXBvcnRlZEtleUxpc3Quc2l6ZSgpXSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoa2V5cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtleXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBmb3JlaWduIGtleSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2NoZW1hIG1ldGFkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBGb3JlaWduS2V5IG5ld0ZvcmVpZ25LZXkoUmVzdWx0U2V0IGZrTWV0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIEZvcmVpZ25LZXkgZmsgPSBuZXcgRm9yZWlnbktleSgpOworICAgICAgICBmay5zZXRTY2hlbWFOYW1lKGZrTWV0YS5nZXRTdHJpbmcoIkZLVEFCTEVfU0NIRU0iKSk7CisgICAgICAgIGZrLnNldFRhYmxlTmFtZShma01ldGEuZ2V0U3RyaW5nKCJGS1RBQkxFX05BTUUiKSk7CisgICAgICAgIGZrLnNldENvbHVtbk5hbWUoZmtNZXRhLmdldFN0cmluZygiRktDT0xVTU5fTkFNRSIpKTsKKyAgICAgICAgZmsuc2V0TmFtZShma01ldGEuZ2V0U3RyaW5nKCJGS19OQU1FIikpOworICAgICAgICBmay5zZXRQcmltYXJ5S2V5U2NoZW1hTmFtZShma01ldGEuZ2V0U3RyaW5nKCJQS1RBQkxFX1NDSEVNIikpOworICAgICAgICBmay5zZXRQcmltYXJ5S2V5VGFibGVOYW1lKGZrTWV0YS5nZXRTdHJpbmcoIlBLVEFCTEVfTkFNRSIpKTsKKyAgICAgICAgZmsuc2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoZmtNZXRhLmdldFN0cmluZygiUEtDT0xVTU5fTkFNRSIpKTsKKyAgICAgICAgZmsuc2V0S2V5U2VxdWVuY2UoZmtNZXRhLmdldEludCgiS0VZX1NFUSIpKTsKKyAgICAgICAgZmsuc2V0RGVmZXJyZWQoZmtNZXRhLmdldEludCgiREVGRVJSQUJJTElUWSIpCisgICAgICAgICAgICA9PSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5SW5pdGlhbGx5RGVmZXJyZWQpOworCisgICAgICAgIGludCBkZWwgPSBma01ldGEuZ2V0SW50KCJERUxFVEVfUlVMRSIpOworICAgICAgICBzd2l0Y2ggKGRlbCkgeworICAgICAgICAgICAgY2FzZSBEYXRhYmFzZU1ldGFEYXRhLmltcG9ydGVkS2V5U2V0TnVsbDoKKyAgICAgICAgICAgICAgICBmay5zZXREZWxldGVBY3Rpb24oRm9yZWlnbktleS5BQ1RJT05fTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlTWV0YURhdGEuaW1wb3J0ZWRLZXlTZXREZWZhdWx0OgorICAgICAgICAgICAgICAgIGZrLnNldERlbGV0ZUFjdGlvbihGb3JlaWduS2V5LkFDVElPTl9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YWJhc2VNZXRhRGF0YS5pbXBvcnRlZEtleUNhc2NhZGU6CisgICAgICAgICAgICAgICAgZmsuc2V0RGVsZXRlQWN0aW9uKEZvcmVpZ25LZXkuQUNUSU9OX0NBU0NBREUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmay5zZXREZWxldGVBY3Rpb24oRm9yZWlnbktleS5BQ1RJT05fUkVTVFJJQ1QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YWJsZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24KKyAgICAgKiBmcm9tIHtAbGluayBEYXRhYmFzZU1ldGFEYXRhfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlTmFtZUZvck1ldGFkYXRhKFN0cmluZyB0YWJsZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRTY2hlbWFDYXNlKHRhYmxlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2NoZW1hIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIG9idGFpbmluZyBpbmZvcm1hdGlvbgorICAgICAqIGZyb20ge0BsaW5rIERhdGFiYXNlTWV0YURhdGF9LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTmFtZUZvck1ldGFkYXRhKFN0cmluZyBzY2hlbWFOYW1lKSB7CisgICAgICAgIGlmIChzY2hlbWFOYW1lID09IG51bGwpCisgICAgICAgICAgICBzY2hlbWFOYW1lID0gY29uZi5nZXRTY2hlbWEoKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRTY2hlbWFDYXNlKHNjaGVtYU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNhdGFsb2cgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igb2J0YWluaW5nIGluZm9ybWF0aW9uCisgICAgICogZnJvbSB7QGxpbmsgRGF0YWJhc2VNZXRhRGF0YX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDYXRhbG9nTmFtZUZvck1ldGFkYXRhKFN0cmluZyBjYXRhbG9nTmFtZSkgeworICAgICAgICByZXR1cm4gY29udmVydFNjaGVtYUNhc2UoY2F0YWxvZ05hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24KKyAgICAgKiBmcm9tIHtAbGluayBEYXRhYmFzZU1ldGFEYXRhfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWVGb3JNZXRhZGF0YShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICByZXR1cm4gY29udmVydFNjaGVtYUNhc2UoY29sdW1uTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHNjaGVtYSBuYW1lIHRvIGEgbmFtZSB0aGF0IHRoZSBkYXRhYmFzZSB3aWxsCisgICAgICogYmUgYWJsZSB0byB1bmRlcnN0YW5kLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFNjaGVtYUNhc2UoU3RyaW5nIG9iamVjdE5hbWUpIHsKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGlmIChTQ0hFTUFfQ0FTRV9MT1dFUi5lcXVhbHMoc2NoZW1hQ2FzZSkpCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0TmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBpZiAoU0NIRU1BX0NBU0VfUFJFU0VSVkUuZXF1YWxzKHNjaGVtYUNhc2UpKQorICAgICAgICAgICAgcmV0dXJuIG9iamVjdE5hbWU7CisgICAgICAgIHJldHVybiBvYmplY3ROYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZWQgdGhlIGNvbm5lY3Rpb24gZm9yIG1ldGFkYXRhIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZU1ldGFkYXRhT3BlcmF0aW9uKENvbm5lY3Rpb24gYykgeworICAgICAgICBpZiAocmVxdWlyZXNBdXRvQ29tbWl0Rm9yTWV0YURhdGEpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYy5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNxbGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCFjLmdldEF1dG9Db21taXQoKSkKKyAgICAgICAgICAgICAgICAgICAgYy5zZXRBdXRvQ29tbWl0KHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNxbGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2VxdWVuY2VzIGFuZCBBdXRvLUFzc2lnbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhc3QgZ2VuZXJhdGVkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gYnkgZGVmYXVsdCBpZiB7QGxpbmsgI2xhc3RHZW5lcmF0ZWRLZXlRdWVyeX0gaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEdlbmVyYXRlZEtleShDb2x1bW4gY29sLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAobGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWF1dG8tYXNzaWduIikpOworCisgICAgICAgIC8vIHJlcGxhY2UgdGhpbmdzIGxpa2UgIlNFTEVDVCBNQVgoezB9KSBGUk9NIHsxfSIKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gbGFzdEdlbmVyYXRlZEtleVF1ZXJ5OworICAgICAgICBpZiAocXVlcnkuaW5kZXhPZigneycpICE9IC0xKSAvLyBvbmx5IGlmIHRoZSB0b2tlbiBpcyBpbiB0aGUgc3RyaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1ZXJ5ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocXVlcnksIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICBjb2wuZ2V0TmFtZSgpLCBnZXRGdWxsTmFtZShjb2wuZ2V0VGFibGUoKSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIGdldEdlbmVyYXRlZEtleVNlcXVlbmNlTmFtZShjb2wpLAorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChxdWVyeSk7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBycyA9IHN0bW50LmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgaWYgKCFycy5uZXh0KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1nZW5rZXkiKSk7CisgICAgICAgICAgICBPYmplY3Qga2V5ID0gcnMuZ2V0T2JqZWN0KDEpOworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJpbnZhbGlkLWdlbmtleSIsIGNvbCkpOworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHJzLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30gCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcXVlbmNlIG5hbWUgdXNlZCBieSBkYXRhYmFzZXMgZm9yIHRoZSBnaXZlbiBhdXRvYXNzaWduZWQKKyAgICAgKiBjb2x1bW4uIFRoaXMgaXMgb25seSB1c2VkIGJ5IGRhdGFiYXNlcyB0aGF0IHJlcXVpcmUgYW4gZXhwbGljaXQgbmFtZQorICAgICAqIHRvIGJlIHVzZWQgZm9yIGF1dG8tYXNzaWduIHN1cHBvcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHZW5lcmF0ZWRLZXlTZXF1ZW5jZU5hbWUoQ29sdW1uIGNvbCkgeworICAgICAgICBTdHJpbmcgdG5hbWUgPSBjb2wuZ2V0VGFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyBjbmFtZSA9IGNvbC5nZXROYW1lKCk7CisgICAgICAgIGludCBtYXggPSBtYXhBdXRvQXNzaWduTmFtZUxlbmd0aDsKKyAgICAgICAgaW50IGV4dHJhQ2hhcnMgPSAtbWF4ICsgdG5hbWUubGVuZ3RoKCkgKyAxIC8vIDx0bmFtZT4gKyAnXycKKyAgICAgICAgICAgICsgY25hbWUubGVuZ3RoKCkgKyA0OyAvLyA8Y25hbWU+ICsgJ19TRVEnCisgICAgICAgIGlmIChleHRyYUNoYXJzID4gMCkgeworICAgICAgICAgICAgLy8gdGhpcyBhc3N1bWVzIHRoYXQgdG5hbWUgaXMgbG9uZ2VyIHRoYW4gZXh0cmFDaGFycworICAgICAgICAgICAgdG5hbWUgPSB0bmFtZS5zdWJzdHJpbmcoMCwgdG5hbWUubGVuZ3RoKCkgLSBleHRyYUNoYXJzKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtYXgpOworICAgICAgICBidWYuYXBwZW5kKHRuYW1lKS5hcHBlbmQoIl8iKS5hcHBlbmQoY25hbWUpLmFwcGVuZCgiX1NFUSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbmZpZ3VyYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHRoaXMuY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmNvbmYuZ2V0TG9nKEpEQkNDb25maWd1cmF0aW9uLkxPR19KREJDKTsKKworICAgICAgICAvLyB3YXJuIGFib3V0IHVuc3VwcG9ydGVkIGRpY3RzCisgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpICYmICFpc1N1cHBvcnRlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImRpY3Qtbm90LXN1cHBvcnRlZCIsIGdldENsYXNzKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWQoKSB7CisgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjdXN0b20gZGljdCwgdHJhdmVyc2UgdG8gd2hhdGV2ZXIgb3BlbmpwYSBkaWN0IGl0IGV4dGVuZHMKKyAgICAgICAgQ2xhc3MgYyA9IGdldENsYXNzKCk7CisgICAgICAgIHdoaWxlICghYy5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5vcGVuanBhLiIpKQorICAgICAgICAgICAgYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworCisgICAgICAgIC8vIHRoZSBnZW5lcmljIGRiZGljdGlvbmFyeSBpcyBub3QgY29uc2lkZXJlZCBhIHN1cHBvcnRlZCBkaWN0OyBhbGwKKyAgICAgICAgLy8gb3RoZXIgY29uY3JldGUgZGljdGlvbmFyaWVzIGFyZQorICAgICAgICBpZiAoYyA9PSBEQkRpY3Rpb25hcnkuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzZXQgb2YgcmVzZXJ2ZWQgU1FMOTIgd29yZHMgZnJvbSByZXNvdXJjZQorICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IERCRGljdGlvbmFyeS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtCisgICAgICAgICAgICAoInNxbC1rZXl3b3Jkcy5yc3JjIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcga2V5d29yZHMgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSkuCisgICAgICAgICAgICAgICAgcmVhZExpbmUoKTsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICByZXNlcnZlZFdvcmRTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoU3RyaW5ncy5zcGxpdAorICAgICAgICAgICAgICAgIChrZXl3b3JkcywgIiwiLCAwKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcmVzZXJ2ZWQgd29yZHMgc2V0IGJ5IHVzZXIKKyAgICAgICAgaWYgKHJlc2VydmVkV29yZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlc2VydmVkV29yZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChTdHJpbmdzLnNwbGl0CisgICAgICAgICAgICAgICAgKHJlc2VydmVkV29yZHMudG9VcHBlckNhc2UoKSwgIiwiLCAwKSkpOworCisgICAgICAgIC8vIGFkZCBzeXN0ZW0gc2NoZW1hcyBzZXQgYnkgdXNlcgorICAgICAgICBpZiAoc3lzdGVtU2NoZW1hcyAhPSBudWxsKQorICAgICAgICAgICAgc3lzdGVtU2NoZW1hU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KFN0cmluZ3Muc3BsaXQKKyAgICAgICAgICAgICAgICAoc3lzdGVtU2NoZW1hcy50b1VwcGVyQ2FzZSgpLCAiLCIsIDApKSk7CisKKyAgICAgICAgLy8gYWRkIHN5c3RlbSB0YWJsZXMgc2V0IGJ5IHVzZXIKKyAgICAgICAgaWYgKHN5c3RlbVRhYmxlcyAhPSBudWxsKQorICAgICAgICAgICAgc3lzdGVtVGFibGVTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoU3RyaW5ncy5zcGxpdAorICAgICAgICAgICAgICAgIChzeXN0ZW1UYWJsZXMudG9VcHBlckNhc2UoKSwgIiwiLCAwKSkpOworCisgICAgICAgIC8vIGFkZCBmaXhlZCBzaXplIHR5cGUgbmFtZXMgc2V0IGJ5IHRoZSB1c2VyCisgICAgICAgIGlmIChmaXhlZFNpemVUeXBlTmFtZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpeGVkU2l6ZVR5cGVOYW1lU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KFN0cmluZ3Muc3BsaXQKKyAgICAgICAgICAgICAgICAoZml4ZWRTaXplVHlwZU5hbWVzLnRvVXBwZXJDYXNlKCksICIsIiwgMCkpKTsKKworICAgICAgICAvLyBpZiB1c2VyIGhhcyB1bnNldCBzZXF1ZW5jZSBzcWwsIG51bGwgaXQgb3V0IHNvIHdlIGtub3cgc2VxdWVuY2VzCisgICAgICAgIC8vIGFyZW4ndCBzdXBwb3J0ZWQKKyAgICAgICAgbmV4dFNlcXVlbmNlUXVlcnkgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKG5leHRTZXF1ZW5jZVF1ZXJ5KTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbm5lY3Rpb25EZWNvcmF0b3IgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogRGVjb3JhdGUgdGhlIGdpdmVuIGNvbm5lY3Rpb24gaWYgbmVlZGVkLiBTb21lIGRhdGFiYXNlcyByZXF1aXJlIHNwZWNpYWwKKyAgICAgKiBoYW5kbGluZyBmb3IgSkRCQyBidWdzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzc3VlcyBhbnkKKyAgICAgKiB7QGxpbmsgI2luaXRpYWxpemF0aW9uU1FMfSB0aGF0IGhhcyBiZWVuIHNldCBmb3IgdGhlIGRpY3Rpb25hcnkgYnV0CisgICAgICogZG9lcyBub3QgZGVjb3JlYXRlIHRoZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0aW9uIGRlY29yYXRlKENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghY29ubmVjdGVkKQorICAgICAgICAgICAgY29ubmVjdGVkQ29uZmlndXJhdGlvbihjb25uKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGluaXRpYWxpemF0aW9uU1FMKSkgeworICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG1udCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChpbml0aWFsaXphdGlvblNRTCk7CisgICAgICAgICAgICAgICAgc3RtbnQuZXhlY3V0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShlLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RtbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbm47CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlCisgICAgICoge0BsaW5rIExvZ2dpbmdDb25uZWN0aW9uRGVjb3JhdG9yLlNRTFdhcm5pbmdIYW5kbGVyfSBpbnRlcmZhY2UKKyAgICAgKiB0aGF0IGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHRoZSBhY3Rpb25zIHRvIHBlcmZvcm0gd2hlbiBhCisgICAgICoge0BsaW5rIFNRTFdhcm5pbmd9IG9jY3VycyBhdCBhbnkgcG9pbnQgb24gYSB7QGxpbmsgQ29ubmVjdGlvbn0sCisgICAgICoge0BsaW5rIFN0YXRlbWVudH0sIG9yIHtAbGluayBSZXN1bHRTZXR9LiBUaGlzIG1ldGhvZCBtYXkKKyAgICAgKiBiZSB1c2VkIGRldGVybWluZSB0aG9zZSB3YXJuaW5ncyB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8KKyAgICAgKiBjb25zaWRlciBjcml0aWNhbCBmYWlsdXJlcywgYW5kIHRocm93IHRoZSB3YXJuaW5nIGluIHRob3NlCisgICAgICogY2FzZXMuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3Ijc2V0V2FybmluZ0FjdGlvbgorICAgICAqIEBzZWUgTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3Ijc2V0V2FybmluZ0hhbmRsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVXYXJuaW5nKFNRTFdhcm5pbmcgd2FybmluZykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGV4Y2VwdGlvbiB0aGF0IHdyYXBzIDxjb2RlPmNhdXNlczwvY29kZT4uCisgICAgICogSG93ZXZlciwgdGhlIGRldGFpbHMgb2YgZXhhY3RseSB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIGlzIHJldHVybmVkIGNhbgorICAgICAqIGJlIGRldGVybWluZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIG1heSB0YWtlIGludG8gYWNjb3VudAorICAgICAqIERCLXNwZWNpZmljIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpbiA8Y29kZT5jYXVzZXM8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uIG5ld1N0b3JlRXhjZXB0aW9uKFN0cmluZyBtc2csIFNRTEV4Y2VwdGlvbltdIGNhdXNlcywKKyAgICAgICAgT2JqZWN0IGZhaWxlZCkgeworICAgICAgICBpZiAoY2F1c2VzLmxlbmd0aCA+IDAgJiYgIjIzMDAwIi5lcXVhbHMoY2F1c2VzWzBdLmdldFNRTFN0YXRlKCkpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbihtc2cpLgorICAgICAgICAgICAgICAgIHNldEZhaWxlZE9iamVjdChmYWlsZWQpLnNldE5lc3RlZFRocm93YWJsZXMoY2F1c2VzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdG9yZUV4Y2VwdGlvbihtc2cpLnNldEZhaWxlZE9iamVjdChmYWlsZWQpLgorICAgICAgICAgICAgc2V0TmVzdGVkVGhyb3dhYmxlcyhjYXVzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIHtAbGluayBEYXRhU291cmNlfSBhbmQgcmVsZWFzZXMgYW55CisgICAgICogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhU291cmNlIHRoZSBEYXRhU291cmNlIHRvIGNsb3NlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VEYXRhU291cmNlKERhdGFTb3VyY2UgZGF0YVNvdXJjZSkgeworICAgICAgICBEYXRhU291cmNlRmFjdG9yeS5jbG9zZURhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBzb21lIG1hcHBpbmdzIHRvIHJlcHJlc2VudCBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbgorICAgICAqIHNlcmlhbGl6ZWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHNlcmlhbGl6ZSBtdWx0aXBsZSB0aW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZWREYXRhIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGJ5dGVzOworCisgICAgICAgIHB1YmxpYyBTZXJpYWxpemVkRGF0YShieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCRGljdGlvbmFyeUZhY3RvcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCRGljdGlvbmFyeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM1MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvREJEaWN0aW9uYXJ5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgdG8gaW5zdGFudGlhdGUgYSBkaWN0aW9uYXJ5LiBJdCB3aWxsIHVzZQorICogdGhlIGZvbGxvd2luZyBoZXVyaXN0aWM6CisgKiA8dWw+CisgKiA8bGk+Q2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgRGljdGlvbmFyeUNsYXNzIHByb3BlcnR5LAorICogYW5kIGlmIHNvLCB1c2UgdGhhdCB0byBpbnN0YW50aWF0ZSB0aGUgZGljdGlvbmFyeS48L2xpPgorICogPGxpPkNoZWNrIHRoZSBVUkwgaW4gdGhlIEpEQkNDb25maWd1cmF0aW9uIGFnYWluc3QgYSBsaXN0CisgKiBvZiBwcmUtZGVmaW5lZCBVUkxzIGZvciB2YXJpb3VzIGRpY3Rpb25hcmllcy48L2xpPgorICogPGxpPkNoZWNrIHRoZSBkcml2ZXIgaW4gdGhlIEpEQkNDb25maWd1cmF0aW9uIGFnYWluc3QgYSBsaXN0IG9mIGtub3duCisgKiBwYXR0ZXJucy48L2xpPgorICogPGxpPkFjcXVpcmUgYSBjb25uZWN0aW9uIGFuZCBjaGVjayBpdHMgZGF0YWJhc2UgbWV0YWRhdGEuPC9saT4KKyAqIDxsaT5SZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGdlbmVyaWMgREJEaWN0aW9uYXJ5LjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBEQkRpY3Rpb25hcnlGYWN0b3J5IHsKKworICAgIC8vIHBjbDogY2FuJ3QgdXNlIHRoZXNlIGNsYXNzZXMgZGlyZWN0bHkgYmVjYXVzZSB0aGV5IHJlbHkgb24gbmF0aXZlIGxpYnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFX0RJQ1RfTkFNRSA9CisgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuT3JhY2xlRGljdGlvbmFyeSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhTUUxfRElDVF9OQU1FID0KKyAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5IU1FMRGljdGlvbmFyeSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChEQkRpY3Rpb25hcnlGYWN0b3J5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUgYW5kIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEQkRpY3Rpb25hcnkgbmV3REJEaWN0aW9uYXJ5KEpEQkNDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIFN0cmluZyBkY2xhc3MsIFN0cmluZyBwcm9wcykgeworICAgICAgICByZXR1cm4gbmV3REJEaWN0aW9uYXJ5KGNvbmYsIGRjbGFzcywgcHJvcHMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gY3JlYXRlIHRoZSBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb24gVVJMIGFuZAorICAgICAqIGRyaXZlciBuYW1lLCBlaXRoZXIgb3IgYm90aCBvZiB3aGljaCBtYXkgYmUgbnVsbC4gSWYgdGhlIGRpY3Rpb25hcnkKKyAgICAgKiBjYW5ub3QgYmUgY2FsY3VsYXRlZCwgcmV0dXJucyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgREJEaWN0aW9uYXJ5IGNhbGN1bGF0ZURCRGljdGlvbmFyeShKREJDQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBTdHJpbmcgdXJsLCBTdHJpbmcgZHJpdmVyLCBTdHJpbmcgcHJvcHMpIHsKKyAgICAgICAgU3RyaW5nIGRjbGFzcyA9IGRpY3Rpb25hcnlDbGFzc0ZvclN0cmluZyh1cmwpOworICAgICAgICBpZiAoZGNsYXNzID09IG51bGwpCisgICAgICAgICAgICBkY2xhc3MgPSBkaWN0aW9uYXJ5Q2xhc3NGb3JTdHJpbmcoZHJpdmVyKTsKKyAgICAgICAgaWYgKGRjbGFzcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBuZXdEQkRpY3Rpb25hcnkoY29uZiwgZGNsYXNzLCBwcm9wcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBkaWN0aW9uYXJ5IHVzaW5nIGNvbm5lY3Rpb24gbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgREJEaWN0aW9uYXJ5IG5ld0RCRGljdGlvbmFyeShKREJDQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBEYXRhU291cmNlIGRzLCBTdHJpbmcgcHJvcHMpIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBEYXRhYmFzZU1ldGFEYXRhIG1ldGEgPSBjb25uLmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICBTdHJpbmcgZGNsYXNzID0gZGljdGlvbmFyeUNsYXNzRm9yU3RyaW5nKG1ldGEuZ2V0VVJMKCkpOworICAgICAgICAgICAgaWYgKGRjbGFzcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGRjbGFzcyA9IGRpY3Rpb25hcnlDbGFzc0ZvclN0cmluZworICAgICAgICAgICAgICAgICAgICAobWV0YS5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkpOworICAgICAgICAgICAgaWYgKGRjbGFzcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGRjbGFzcyA9IERCRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3REJEaWN0aW9uYXJ5KGNvbmYsIGRjbGFzcywgcHJvcHMsIGNvbm4pOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihzZSkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGRpY3Rpb25hcnkgdXNpbmcgdGhlIGdpdmVuIGNsYXNzIG5hbWUgYW5kIHByb3BlcnRpZXM7IHRoZQorICAgICAqIGNvbm5lY3Rpb24gbWF5IGJlIG51bGwgaWYgbm90IHN1cHBsaWVkIHRvIHRoZSBmYWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIERCRGljdGlvbmFyeSBuZXdEQkRpY3Rpb25hcnkoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwKKyAgICAgICAgU3RyaW5nIGRjbGFzcywgU3RyaW5nIHByb3BzLCBDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGljdCA9IChEQkRpY3Rpb25hcnkpIENsYXNzLmZvck5hbWUoZGNsYXNzLCB0cnVlLAorICAgICAgICAgICAgICAgIERCRGljdGlvbmFyeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oZSkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3YXJuIGlmIHdlIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIGRpY3Rpb25hcnkKKyAgICAgICAgTG9nIGxvZyA9IGNvbmYuZ2V0TG9nKEpEQkNDb25maWd1cmF0aW9uLkxPR19KREJDKTsKKyAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkgJiYgZGljdC5nZXRDbGFzcygpID09IERCRGljdGlvbmFyeS5jbGFzcykKKyAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJ3YXJuLWdlbmVyaWMiKSk7CisKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBpbmZvU3RyaW5nID0gIiI7CisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VNZXRhRGF0YSBtZXRhID0gY29ubi5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBpbmZvU3RyaW5nID0gIiAoIiArIG1ldGEuZ2V0RGF0YWJhc2VQcm9kdWN0TmFtZSgpICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1ldGEuZ2V0RGF0YWJhc2VQcm9kdWN0VmVyc2lvbigpICsgIiAsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhLmdldERyaXZlck5hbWUoKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRhLmdldERyaXZlclZlcnNpb24oKSArICIpIjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNlLnRvU3RyaW5nKCksIHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJ1c2luZy1kaWN0IiwgZGNsYXNzLCBpbmZvU3RyaW5nKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdGhlIGRpY3Rpb25hcnkncyBtZXRhZGF0YQorICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShkaWN0LCBjb25mLCBwcm9wcywgIkRCRGljdGlvbmFyeSIpOworICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRpY3QuY29ubmVjdGVkQ29uZmlndXJhdGlvbihjb25uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihzZSkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3Vlc3MgdGhlIGRpY3Rpb25hcnkgY2xhc3MgbmFtZSB0byB1c2UgYmFzZWQgb24gdGhlIHByb2R1Y3Qgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkaWN0aW9uYXJ5Q2xhc3NGb3JTdHJpbmcoU3RyaW5nIHByb2QpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocHJvZCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcHJvZCA9IHByb2QudG9Mb3dlckNhc2UoKTsKKworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJvcmFjbGUiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBPUkFDTEVfRElDVF9OQU1FOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJzcWxzZXJ2ZXIiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBTUUxTZXJ2ZXJEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigianNxbGNvbm5lY3QiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBTUUxTZXJ2ZXJEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigibXlzcWwiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBNeVNRTERpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJwb3N0Z3JlcyIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIFBvc3RncmVzRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChwcm9kLmluZGV4T2YoInN5YmFzZSIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIFN5YmFzZURpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJhZGFwdGl2ZSBzZXJ2ZXIiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBTeWJhc2VEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigiaW5mb3JtaXgiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBJbmZvcm1peERpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJoc3FsIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gSFNRTF9ESUNUX05BTUU7CisgICAgICAgIGlmIChwcm9kLmluZGV4T2YoImZveHBybyIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIEZveFByb0RpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJpbnRlcmJhc2UiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBJbnRlcmJhc2VEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigiamRhdGFzdG9yZSIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIEpEYXRhU3RvcmVEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigiYm9ybGFuZCIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIEpEYXRhU3RvcmVEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigiYWNjZXNzIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gQWNjZXNzRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChwcm9kLmluZGV4T2YoInBvaW50YmFzZSIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIFBvaW50YmFzZURpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJlbXByZXNzIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gRW1wcmVzc0RpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJmaXJlYmlyZCIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIEZpcmViaXJkRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChwcm9kLmluZGV4T2YoImNhY2hlIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gQ2FjaGVEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigiZGVyYnkiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBEZXJieURpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAvLyB0ZXN0IGgyIGluIGEgc3BlY2lhbCB3YXksIGJlY2F1c2UgdGhlcmUncyBhIGRlY2VudCBjaGFuY2UgdGhlIHN0cmluZyAKKyAgICAgICAgLy8gaDIgY291bGQgYXBwZWFyIGluIHRoZSBVUkwgb2YgYW5vdGhlciBkYXRhYmFzZQorICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJqZGJjOmgyOiIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIEgyRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChwcm9kLmluZGV4T2YoImgyIGRhdGFiYXNlIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gSDJEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgLy8gdGVzdCBkYjIgbGFzdCwgYmVjYXVzZSB0aGVyZSdzIGEgZGVjZW50IGNoYW5jZSB0aGlzIHN0cmluZyBjb3VsZAorICAgICAgICAvLyBhcHBlYXIgaW4gdGhlIFVSTCBvZiBhbm90aGVyIGRhdGFiYXNlIChsaWtlIGlmIHRoZSBkYiBpcyBuYW1lZAorICAgICAgICAvLyAidGVzdGRiMiIgb3Igc29tZXRoaW5nKQorICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJkYjIiKSAhPSAtMSB8fCBwcm9kLmluZGV4T2YoImFzNDAwIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gREIyRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAgICAgLy8ga25vd24gZGJzIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydAorICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJjbG91ZHNjYXBlIikgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gREJEaWN0aW9uYXJ5LmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHByb2QuaW5kZXhPZigiZGFmZm9kaWwiKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBEQkRpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBpZiAocHJvZC5pbmRleE9mKCJzYXBkYiIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIERCRGljdGlvbmFyeS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChwcm9kLmluZGV4T2YoImlkYiIpICE9IC0xKSAvLyBpbnN0YW50ZGIKKyAgICAgICAgICAgIHJldHVybiBEQkRpY3Rpb25hcnkuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIGdpdmUgdXAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgdGhlIGdpdmVuCisgICAgICogZGF0YWJhc2UgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoRGF0YWJhc2VNZXRhRGF0YSBtZXRhKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJjYXRhbG9nU2VwYXJhdG9yOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRDYXRhbG9nU2VwYXJhdG9yKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoImNhdGFsb2dUZXJtOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRDYXRhbG9nVGVybSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJkYXRhYmFzZVByb2R1Y3ROYW1lOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoImRhdGFiYXNlUHJvZHVjdFZlcnNpb246ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiZHJpdmVyTmFtZTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0RHJpdmVyTmFtZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJkcml2ZXJWZXJzaW9uOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXREcml2ZXJWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoImV4dHJhTmFtZUNoYXJhY3RlcnM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldEV4dHJhTmFtZUNoYXJhY3RlcnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiaWRlbnRpZmllclF1b3RlU3RyaW5nOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRJZGVudGlmaWVyUXVvdGVTdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibnVtZXJpY0Z1bmN0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TnVtZXJpY0Z1bmN0aW9ucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJwcm9jZWR1cmVUZXJtOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRQcm9jZWR1cmVUZXJtKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInNjaGVtYVRlcm06ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldFNjaGVtYVRlcm0oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic2VhcmNoU3RyaW5nRXNjYXBlOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRTZWFyY2hTdHJpbmdFc2NhcGUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3FsS2V5d29yZHM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldFNRTEtleXdvcmRzKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN0cmluZ0Z1bmN0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0U3RyaW5nRnVuY3Rpb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN5c3RlbUZ1bmN0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0U3lzdGVtRnVuY3Rpb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInRpbWVEYXRlRnVuY3Rpb25zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRUaW1lRGF0ZUZ1bmN0aW9ucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJ1cmw6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldFVSTCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJ1c2VyTmFtZTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0VXNlck5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiZGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXREZWZhdWx0VHJhbnNhY3Rpb25Jc29sYXRpb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiZHJpdmVyTWFqb3JWZXJzaW9uOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXREcml2ZXJNYWpvclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiZHJpdmVyTWlub3JWZXJzaW9uOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXREcml2ZXJNaW5vclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4QmluYXJ5TGl0ZXJhbExlbmd0aDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4QmluYXJ5TGl0ZXJhbExlbmd0aCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJtYXhDYXRhbG9nTmFtZUxlbmd0aDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4Q2F0YWxvZ05hbWVMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4Q2hhckxpdGVyYWxMZW5ndGg6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heENoYXJMaXRlcmFsTGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm1heENvbHVtbk5hbWVMZW5ndGg6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heENvbHVtbk5hbWVMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4Q29sdW1uc0luR3JvdXBCeTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4Q29sdW1uc0luR3JvdXBCeSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJtYXhDb2x1bW5zSW5JbmRleDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4Q29sdW1uc0luSW5kZXgoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4Q29sdW1uc0luT3JkZXJCeTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4Q29sdW1uc0luT3JkZXJCeSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJtYXhDb2x1bW5zSW5TZWxlY3Q6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heENvbHVtbnNJblNlbGVjdCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJtYXhDb2x1bW5zSW5UYWJsZTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4Q29sdW1uc0luVGFibGUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4Q29ubmVjdGlvbnM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heENvbm5lY3Rpb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm1heEN1cnNvck5hbWVMZW5ndGg6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heEN1cnNvck5hbWVMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4SW5kZXhMZW5ndGg6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heEluZGV4TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm1heFByb2NlZHVyZU5hbWVMZW5ndGg6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heFByb2NlZHVyZU5hbWVMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4Um93U2l6ZTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4Um93U2l6ZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJtYXhTY2hlbWFOYW1lTGVuZ3RoOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRNYXhTY2hlbWFOYW1lTGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm1heFN0YXRlbWVudExlbmd0aDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZ2V0TWF4U3RhdGVtZW50TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm1heFN0YXRlbWVudHM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heFN0YXRlbWVudHMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4VGFibGVOYW1lTGVuZ3RoOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRNYXhUYWJsZU5hbWVMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibWF4VGFibGVzSW5TZWxlY3Q6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmdldE1heFRhYmxlc0luU2VsZWN0KCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm1heFVzZXJOYW1lTGVuZ3RoOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5nZXRNYXhVc2VyTmFtZUxlbmd0aCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJpc0NhdGFsb2dBdFN0YXJ0OiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5pc0NhdGFsb2dBdFN0YXJ0KCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoImlzUmVhZE9ubHk6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLmlzUmVhZE9ubHkoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibnVsbFBsdXNOb25OdWxsSXNOdWxsOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5udWxsUGx1c05vbk51bGxJc051bGwoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibnVsbHNBcmVTb3J0ZWRBdEVuZDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEubnVsbHNBcmVTb3J0ZWRBdEVuZCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJudWxsc0FyZVNvcnRlZEF0U3RhcnQ6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLm51bGxzQXJlU29ydGVkQXRTdGFydCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJudWxsc0FyZVNvcnRlZEhpZ2g6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLm51bGxzQXJlU29ydGVkSGlnaCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJudWxsc0FyZVNvcnRlZExvdzogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEubnVsbHNBcmVTb3J0ZWRMb3coKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN0b3Jlc0xvd2VyQ2FzZUlkZW50aWZpZXJzKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN0b3Jlc0xvd2VyQ2FzZVF1b3RlZElkZW50aWZpZXJzOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdG9yZXNMb3dlckNhc2VRdW90ZWRJZGVudGlmaWVycygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdG9yZXNNaXhlZENhc2VJZGVudGlmaWVyczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3RvcmVzTWl4ZWRDYXNlSWRlbnRpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3RvcmVzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN0b3Jlc01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN0b3Jlc1VwcGVyQ2FzZUlkZW50aWZpZXJzOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdG9yZXNVcHBlckNhc2VJZGVudGlmaWVycygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVyczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3RvcmVzVXBwZXJDYXNlUXVvdGVkSWRlbnRpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbjogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbigpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbjogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNBbHRlclRhYmxlV2l0aERyb3BDb2x1bW4oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNBTlNJOTJFbnRyeUxldmVsU1FMOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c0FOU0k5MkVudHJ5TGV2ZWxTUUwoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNBTlNJOTJGdWxsU1FMOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c0FOU0k5MkZ1bGxTUUwoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNBTlNJOTJJbnRlcm1lZGlhdGVTUUw6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzQ2F0YWxvZ3NJbkRhdGFNYW5pcHVsYXRpb246ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQ2F0YWxvZ3NJbkRhdGFNYW5pcHVsYXRpb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNDYXRhbG9nc0luSW5kZXhEZWZpbml0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNDYXRhbG9nc0luSW5kZXhEZWZpbml0aW9ucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0NhdGFsb2dzSW5Qcml2aWxlZ2VEZWZpbml0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNDYXRhbG9nc0luUHJpdmlsZWdlRGVmaW5pdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNDYXRhbG9nc0luUHJvY2VkdXJlQ2FsbHM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQ2F0YWxvZ3NJblByb2NlZHVyZUNhbGxzKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzQ2F0YWxvZ3NJblRhYmxlRGVmaW5pdGlvbnM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQ2F0YWxvZ3NJblRhYmxlRGVmaW5pdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNDb2x1bW5BbGlhc2luZzogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNDb2x1bW5BbGlhc2luZygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0NvbnZlcnQ6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQ29udmVydCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0NvcmVTUUxHcmFtbWFyOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c0NvcmVTUUxHcmFtbWFyKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzQ29ycmVsYXRlZFN1YnF1ZXJpZXM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQ29ycmVsYXRlZFN1YnF1ZXJpZXMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRzRGF0YURlZmluaXRpb25BbmREYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS4KKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNEYXRhRGVmaW5pdGlvbkFuZERhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0RpZmZlcmVudFRhYmxlQ29ycmVsYXRpb25OYW1lczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNEaWZmZXJlbnRUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNFeHByZXNzaW9uc0luT3JkZXJCeTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNFeHByZXNzaW9uc0luT3JkZXJCeSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0V4dGVuZGVkU1FMR3JhbW1hcjogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNFeHRlbmRlZFNRTEdyYW1tYXIoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNGdWxsT3V0ZXJKb2luczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNGdWxsT3V0ZXJKb2lucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0dyb3VwQnk6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzR3JvdXBCeSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0dyb3VwQnlCZXlvbmRTZWxlY3Q6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzR3JvdXBCeUJleW9uZFNlbGVjdCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0dyb3VwQnlVbnJlbGF0ZWQ6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzR3JvdXBCeVVucmVsYXRlZCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0ludGVncml0eUVuaGFuY2VtZW50RmFjaWxpdHk6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzSW50ZWdyaXR5RW5oYW5jZW1lbnRGYWNpbGl0eSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0xpa2VFc2NhcGVDbGF1c2U6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzTGlrZUVzY2FwZUNsYXVzZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c0xpbWl0ZWRPdXRlckpvaW5zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c0xpbWl0ZWRPdXRlckpvaW5zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzTWluaW11bVNRTEdyYW1tYXI6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzTWluaW11bVNRTEdyYW1tYXIoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNNaXhlZENhc2VJZGVudGlmaWVyczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNNaXhlZENhc2VJZGVudGlmaWVycygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzTXVsdGlwbGVSZXN1bHRTZXRzOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c011bHRpcGxlUmVzdWx0U2V0cygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c011bHRpcGxlVHJhbnNhY3Rpb25zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c011bHRpcGxlVHJhbnNhY3Rpb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzTm9uTnVsbGFibGVDb2x1bW5zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c05vbk51bGxhYmxlQ29sdW1ucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzQ29tbWl0OiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzQ29tbWl0KCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NSb2xsYmFjazogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNPcGVuQ3Vyc29yc0Fjcm9zc1JvbGxiYWNrKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NDb21taXQ6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NDb21taXQoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc1JvbGxiYWNrOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c09wZW5TdGF0ZW1lbnRzQWNyb3NzUm9sbGJhY2soKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNPcmRlckJ5VW5yZWxhdGVkOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNPdXRlckpvaW5zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c091dGVySm9pbnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNQb3NpdGlvbmVkRGVsZXRlOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1Bvc2l0aW9uZWREZWxldGUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNQb3NpdGlvbmVkVXBkYXRlOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1Bvc2l0aW9uZWRVcGRhdGUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNTY2hlbWFzSW5EYXRhTWFuaXB1bGF0aW9uOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1NjaGVtYXNJbkRhdGFNYW5pcHVsYXRpb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNTY2hlbWFzSW5JbmRleERlZmluaXRpb25zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1NjaGVtYXNJbkluZGV4RGVmaW5pdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNTY2hlbWFzSW5Qcml2aWxlZ2VEZWZpbml0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNTY2hlbWFzSW5Qcml2aWxlZ2VEZWZpbml0aW9ucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c1NjaGVtYXNJblByb2NlZHVyZUNhbGxzOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1NjaGVtYXNJblByb2NlZHVyZUNhbGxzKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzU2NoZW1hc0luVGFibGVEZWZpbml0aW9uczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNTY2hlbWFzSW5UYWJsZURlZmluaXRpb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1NlbGVjdEZvclVwZGF0ZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c1N0b3JlZFByb2NlZHVyZXM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c1N1YnF1ZXJpZXNJbkNvbXBhcmlzb25zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1N1YnF1ZXJpZXNJbkNvbXBhcmlzb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzU3VicXVlcmllc0luRXhpc3RzOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5zdXBwb3J0c1N1YnF1ZXJpZXNJbkV4aXN0cygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c1N1YnF1ZXJpZXNJbkluczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNTdWJxdWVyaWVzSW5JbnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNTdWJxdWVyaWVzSW5RdWFudGlmaWVkczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNTdWJxdWVyaWVzSW5RdWFudGlmaWVkcygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJzdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNUcmFuc2FjdGlvbnM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoInN1cHBvcnRzVW5pb246ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzVW5pb24oKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNVbmlvbkFsbDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuc3VwcG9ydHNVbmlvbkFsbCgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJ1c2VzTG9jYWxGaWxlUGVyVGFibGU6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnVzZXNMb2NhbEZpbGVQZXJUYWJsZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJ1c2VzTG9jYWxGaWxlczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEudXNlc0xvY2FsRmlsZXMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiYWxsUHJvY2VkdXJlc0FyZUNhbGxhYmxlOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5hbGxQcm9jZWR1cmVzQXJlQ2FsbGFibGUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiYWxsVGFibGVzQXJlU2VsZWN0YWJsZTogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuYWxsVGFibGVzQXJlU2VsZWN0YWJsZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJkYXRhRGVmaW5pdGlvbkNhdXNlc1RyYW5zYWN0aW9uQ29tbWl0OiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5kYXRhRGVmaW5pdGlvbkNhdXNlc1RyYW5zYWN0aW9uQ29tbWl0KCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZChsaW5lU2VwKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoImRhdGFEZWZpbml0aW9uSWdub3JlZEluVHJhbnNhY3Rpb25zOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0YS5kYXRhRGVmaW5pdGlvbklnbm9yZWRJblRyYW5zYWN0aW9ucygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobGluZVNlcCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJkb2VzTWF4Um93U2l6ZUluY2x1ZGVCbG9iczogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGEuZG9lc01heFJvd1NpemVJbmNsdWRlQmxvYnMoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGxpbmVTZXApCisgICAgICAgICAgICAgICAgLmFwcGVuZCgic3VwcG9ydHNCYXRjaFVwZGF0ZXM6ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtZXRhLnN1cHBvcnRzQmF0Y2hVcGRhdGVzKCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gbWF5YmUgYWJzdHJhY3QgbWV0aG9kIGVycm9yIGZvciBqZGJjIDMgbWV0YWRhdGEgbWV0aG9kLCBvcgorICAgICAgICAgICAgLy8gb3RoZXIgZXJyb3IKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZVNlcCkuYXBwZW5kKCJDYXVnaHQgdGhyb3dhYmxlOiAiKS5hcHBlbmQodCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRGVyYnlEaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9EZXJieURpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJiNGVjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRGVyYnlEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIEFwYWNoZSBEZXJieSAoZm9ybWVybHkgQ2xvdWRzY2FwZSkuCisgKi8KK3B1YmxpYyBjbGFzcyBEZXJieURpY3Rpb25hcnkKKyAgICBleHRlbmRzIEFic3RyYWN0REIyRGljdGlvbmFyeSB7CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB3ZSB3aWxsIHNodXRkb3duIHRoZSBlbWJlZGRlZCBkYXRhYmFzZSB3aGVuIGNsb3NpbmcKKyAgICAgKiB0aGUgRGF0YVNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzaHV0ZG93bk9uQ2xvc2UgPSB0cnVlOworCisgICAgcHVibGljIERlcmJ5RGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiQXBhY2hlIERlcmJ5IjsKKyAgICAgICAgdmFsaWRhdGlvblNRTCA9ICJWQUxVRVMoMSkiOworICAgICAgICBzdHJpbmdMZW5ndGhGdW5jdGlvbiA9ICJMRU5HVEgoezB9KSI7CisgICAgICAgIHN1YnN0cmluZ0Z1bmN0aW9uTmFtZSA9ICJTVUJTVFIiOworCisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gMTg7CisgICAgICAgIG1heEluZGV4TmFtZUxlbmd0aCA9IDE4OworICAgICAgICBtYXhDb2x1bW5OYW1lTGVuZ3RoID0gMzA7CisgICAgICAgIG1heFRhYmxlTmFtZUxlbmd0aCA9IDE4OworCisgICAgICAgIHVzZUdldEJ5dGVzRm9yQmxvYnMgPSB0cnVlOworICAgICAgICB1c2VTZXRCeXRlc0ZvckJsb2JzID0gdHJ1ZTsKKworICAgICAgICBhbGxvd3NBbGlhc0luQnVsa0NsYXVzZSA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHMgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUgPSB0cnVlOworICAgICAgICBzdXBwb3J0c0RlZmF1bHREZWxldGVBY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgcmVxdWlyZXNDYXN0Rm9yTWF0aEZ1bmN0aW9ucyA9IHRydWU7CisgICAgICAgIHJlcXVpcmVzQ2FzdEZvckNvbXBhcmlzb25zID0gdHJ1ZTsKKworICAgICAgICBmaXhlZFNpemVUeXBlTmFtZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiQklHSU5UIiwgIklOVEVHRVIiLAorICAgICAgICB9KSk7CisgICAgICAgIHJlc2VydmVkV29yZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiQUxJQVMiLCAiQklHSU5UIiwgIkJPT0xFQU4iLCAiQ0FMTCIsICJDTEFTUyIsCisgICAgICAgICAgICAiQ09QWSIsICJEQjJKX0RFQlVHIiwgIkVYRUNVVEUiLCAiRVhQTEFJTiIsCisgICAgICAgICAgICAiRklMRSIsICJGSUxURVIiLCAiR0VUQ1VSUkVOVENPTk5FQ1RJT04iLCAiSU5ERVgiLAorICAgICAgICAgICAgIklOU1RBTkNFT0YiLCAiTUVUSE9EIiwgIk5FVyIsICJPRkYiLCAiT1VUIiwgIlBST1BFUlRJRVMiLAorICAgICAgICAgICAgIlBVQkxJQ0FUSU9OIiwgIlJFQ09NUElMRSIsICJSRUZSRVNIIiwgIlJFTkFNRSIsCisgICAgICAgICAgICAiUlVOVElNRVNUQVRJU1RJQ1MiLCAiU1RBVEVNRU5UIiwgIlNUQVRJU1RJQ1MiLAorICAgICAgICAgICAgIlRJTUlORyIsICJXQUlUIiwgIlhNTCIsCisgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZURhdGFTb3VyY2UoRGF0YVNvdXJjZSBkYXRhU291cmNlKSB7CisgICAgICAgIHN1cGVyLmNsb3NlRGF0YVNvdXJjZShkYXRhU291cmNlKTsKKworICAgICAgICBpZiAoIXNodXRkb3duT25DbG9zZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBhcyB3ZWxsIGFzIGNsb3NpbmcgdGhlIERhdGFTb3VyY2UsIHdlIGFsc28gbmVlZCB0bworICAgICAgICAvLyBzaHV0IGRvd24gdGhlIGluc3RhbmNlIGlmIHdlIGFyZSB1c2luZyBhbiBlbWJlZGRlZCBkYXRhYmFzZSwgd2hpY2gKKyAgICAgICAgLy8gY2FuIG9ubHkgYmUgZG9uZSBieSBjb25uZWN0aW5nIHRvIHRoZSBzYW1lIFVSTCB3aXRoIHRoZQorICAgICAgICAvLyAiO3NodXRkb3duPXRydWUiIHN0cmluZyBhcHBlbmRlZCB0byB0aGUgZW5kCisgICAgICAgIC8vIHNlZTogaHR0cDovL2RiLmFwYWNoZS5vcmcvZGVyYnkvZG9jcy9kZXYvZGV2Z3VpZGUvdGRldmR2bHA0MDQ2NC5odG1sCisgICAgICAgIGlmIChjb25mICE9IG51bGwgJiYgY29uZi5nZXRDb25uZWN0aW9uRHJpdmVyTmFtZSgpICE9IG51bGwgJiYKKyAgICAgICAgICAgIGNvbmYuZ2V0Q29ubmVjdGlvbkRyaXZlck5hbWUoKS5pbmRleE9mKCJFbWJlZGRlZERyaXZlciIpICE9IC0xKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbihjb25mLmdldENvbm5lY3Rpb25VUkwoKQorICAgICAgICAgICAgICAgICAgICArICI7c2h1dGRvd249dHJ1ZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhY3R1YWxsIGV4cGVjdCBhIFNRTEV4Y2VwdGlvbiB0byBiZSB0aHJvd24gaGVyZToKKyAgICAgICAgICAgICAgICAvLyBEZXJieSBzdHJhbmdlbHkgdXNlcyB0aGF0IGFzIGEgbWVjaGFuaXNtIHRvIHJlcG9ydAorICAgICAgICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCBzaHV0ZG93bgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRW1wcmVzc0RpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0VtcHJlc3NEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3NTM4OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0VtcHJlc3NEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKKworLyoqCisgKiBEaWN0aW9uYXJ5IGZvciBFbXByZXNzIHVzaW5nIE9EQkMgc2VydmVyIGNvbWJpbmVkIHdpdGggdGhlaXIKKyAqIHR5cGUgMiBkcml2ZXIuIFRoaXMgZGljdGlvbmFyeSBtYXkgaXNzdWVzIHdpdGggb3RoZXIKKyAqIGRyaXZlci90b3BvbG9neSBjb25maWd1cmF0aW9ucy4KKyAqICBFbXByZXNzIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIGNvbm5lY3Rpb25zIHRvIHJlYWQgcm93cworICogcmVhZCBpbiBhIHRyYW5zYWN0aW9uLCBlZmZlY3RpdmVseSBmb3JjaW5nIHBlc3NpbWlzdGljIHRyYW5zYWN0aW9ucworICogcmVnYXJkbGVzcyBvZiB0aGUgT3B0aW1pc3RpYyBzZXR0aW5nLiBUbyBhbGxvdyB1c2VycyB0byB1c2UKKyAqIG9wdGltaXN0aWMgdHJhbnNhY3Rpb25zIGluIGEgbXVsdGktY29ubmVjdGlvbiBldmlyb25tZW50LCB5b3UKKyAqIG11c3Qgc2V0IHRoZSBBbGxvd0NvbmN1cnJlbnRSZWFkIHNldHRpbmcgdG8gdHJ1ZSBpbiBhZGRpdGlvbgorICogdG8gc3RhbmRhcmQgb3B0aW9ucy4KKyAqICBFbXByZXNzIGhhcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbGltaXRhdGlvbnM6CisgKiA8dWw+CisgKiA8bGk+Rm9yZWlnbiBrZXlzIGFyZSBxdWl0ZSBsaW1pdGVkIGluIEVtcHJlc3MgYW5kIGl0IGlzIHJlY29tbWVuZGVkCisgKiB0aGF0IHRoZXNlIGJlIGNyZWF0ZWQgYnkgaGFuZC48L2xpPgorICogPGxpPkJhdGNoaW5nIGNhbiBiZSB1bnJlbGlhYmxlLiBVc2luZyBCYXRjaExpbWl0PTAgaXMgc3Ryb25nbHkKKyAqIHJlY29tbWVuZGVkLjwvbGk+CisgKiA8bGk+VXNpbmcgQWxsb3dDb25jdXJyZW50UmVhZCBzaG91bGQgYmUgYWNjb21wYW5pZWQgYnkKKyAqIFNpbXVsYXRlTG9ja2luZz10cnVlPC9saT4KKyAqIDxsaT5Db25uZWN0aW9ucyBzaG91bGQgYmUgcm9sbGVkIGJhY2sgb24gcmV0dXJuIHRvIGVuc3VyZSBsb2NrcworICogYXJlIHJlbGVhc2VkIChzZWUgT3BlbkpQQSBkZWZhdWx0IERhdGFTb3VyY2UgZG9jdW1lbnRhdGlvbi48L2xpPgorICogPGxpPkNlcnRhaW4gb3V0ZXIgam9pbnMgcmVxdWlyaW5nIHBhcmFtZXRlcnMgaW4gYSBzdWJzZWxlY3QgaXMgbm90CisgKiBzdXBwb3J0ZWQgYnkgRW1wcmVzcyBhbmQgbWF5IHVuZGVyIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgY2F1c2UKKyAqIHNpemUgKCkgY2FsbHMgb24gcXVlcnkgcmVzdWx0cyBhbmQgTFJTIGZpZWxkcyB0byB0aHJvdyBhbiBleGNlcHRpb24uPC9saT4KKyAqIDxsaT5DZXJ0YWluIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBFbXByZXNzRGljdGlvbmFyeQorICAgIGV4dGVuZHMgREJEaWN0aW9uYXJ5IHsKKworICAgIC8qKgorICAgICAqIFRoaXMgc2V0dGluZyBpbnNlcnRzICJCWVBBU1MiIGFmdGVyIGV2ZXJ5ICJTRUxFQ1QiLiBUaGlzCisgICAgICogYWxsb3dzIGZvciBtdWx0aXBsZSB0cmFuc2FjdGlvbmFsIHJlYWRzIG9mIHRoZSBzYW1lIHJvdworICAgICAqIGZyb20gZGlmZmVyZW50IGNvbm5lY3Rpb25zIGF0IHRoZSBleHBlbnNlIG9mIGxvc3Mgb2YKKyAgICAgKiBwZXNzaW1pc3RpYyBsb2NraW5nLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhbGxvd0NvbmN1cnJlbnRSZWFkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgRW1wcmVzc0RpY3Rpb25hcnkoKSB7CisgICAgICAgIHBsYXRmb3JtID0gIkVtcHJlc3MiOworCisgICAgICAgIHZhbGlkYXRpb25TUUwgPSAiU0VMRUNUIERJU1RJTkNUIHRvZGF5IEZST00gc3lzX3RhYmxlcyI7CisgICAgICAgIGpvaW5TeW50YXggPSBTWU5UQVhfVFJBRElUSU9OQUw7CisgICAgICAgIHRvVXBwZXJDYXNlRnVuY3Rpb24gPSAiVE9VUFBFUih7MH0pIjsKKyAgICAgICAgdG9Mb3dlckNhc2VGdW5jdGlvbiA9ICJUT0xPV0VSKHswfSkiOworCisgICAgICAgIHN1cHBvcnRzRGVmZXJyZWRDb25zdHJhaW50cyA9IGZhbHNlOworICAgICAgICByZXF1aXJlc0FsaWFzRm9yU3Vic2VsZWN0ID0gdHJ1ZTsKKyAgICAgICAgbWF4VGFibGVOYW1lTGVuZ3RoID0gMjg7CisgICAgICAgIG1heENvbHVtbk5hbWVMZW5ndGggPSAyODsKKyAgICAgICAgbWF4SW5kZXhOYW1lTGVuZ3RoID0gMjg7CisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gMjg7CisgICAgICAgIHNjaGVtYUNhc2UgPSBTQ0hFTUFfQ0FTRV9QUkVTRVJWRTsKKworICAgICAgICB1c2VHZXRCeXRlc0ZvckJsb2JzID0gdHJ1ZTsKKyAgICAgICAgdXNlU2V0Qnl0ZXNGb3JCbG9icyA9IHRydWU7CisgICAgICAgIHVzZUdldFN0cmluZ0ZvckNsb2JzID0gdHJ1ZTsKKyAgICAgICAgdXNlU2V0U3RyaW5nRm9yQ2xvYnMgPSB0cnVlOworCisgICAgICAgIGNsb2JUeXBlTmFtZSA9ICJURVhUIjsKKyAgICAgICAgYmxvYlR5cGVOYW1lID0gIkJVTEsiOworICAgICAgICByZWFsVHlwZU5hbWUgPSAiRkxPQVQoOCkiOworICAgICAgICBiaWdpbnRUeXBlTmFtZSA9ICJERUNJTUFMKDM4KSI7CisgICAgICAgIHRpbWVzdGFtcFR5cGVOYW1lID0gIkRBVEUiOworICAgICAgICB2YXJjaGFyVHlwZU5hbWUgPSAiQ0hBUkFDVEVSIjsKKyAgICAgICAgdGlueWludFR5cGVOYW1lID0gIkRPVUJMRSBQUkVDSVNJT04iOworICAgICAgICBkb3VibGVUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisgICAgICAgIGJpdFR5cGVOYW1lID0gIlNNQUxMSU5UIjsKKworICAgICAgICBmaXhlZFNpemVUeXBlTmFtZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiVEVYVCIsICJCVUxLIiwgIkxPTkdGTE9BVCIsICJJTlRFR0VSNjQiLCAiU0hPUlRJTlRFR0VSIiwKKyAgICAgICAgICAgICJMT05HSU5URUdFUiIsCisgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbUluZGV4KFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIlNZU18iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMQnVmZmVyIHRvU2VsZWN0KFNRTEJ1ZmZlciBzZWxlY3RzLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBTUUxCdWZmZXIgZnJvbSwgU1FMQnVmZmVyIHdoZXJlLCBTUUxCdWZmZXIgZ3JvdXAsCisgICAgICAgIFNRTEJ1ZmZlciBoYXZpbmcsIFNRTEJ1ZmZlciBvcmRlciwKKyAgICAgICAgYm9vbGVhbiBkaXN0aW5jdCwgYm9vbGVhbiBmb3JVcGRhdGUsIGxvbmcgc3RhcnRJZHgsIGxvbmcgZW5kSWR4KSB7CisgICAgICAgIGlmICghYWxsb3dDb25jdXJyZW50UmVhZCkKKyAgICAgICAgICAgIHJldHVybiBzdXBlci50b1NlbGVjdChzZWxlY3RzLCBmZXRjaCwgZnJvbSwgd2hlcmUsIGdyb3VwLAorICAgICAgICAgICAgICAgIGhhdmluZywgb3JkZXIsIGRpc3RpbmN0LCBmb3JVcGRhdGUsIHN0YXJ0SWR4LCBlbmRJZHgpOworCisgICAgICAgIC8vIG92ZXJyaWRlIHRvIGFsbG93IGEgIkJZUEFTUyIgdG8gYmUgaW5zZXJ0ZWQgcG9zdC0ic2VsZWN0IgorICAgICAgICAvLyBkZXBlbmRpbmcgb24gYWxsb3dDb25jdXJyZW50UmVhZCBzZXR0aW5nCisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKHRoaXMpOworICAgICAgICBidWYuYXBwZW5kKCJTRUxFQ1QgQllQQVNTICIpOworICAgICAgICBpZiAoZGlzdGluY3QpCisgICAgICAgICAgICBidWYuYXBwZW5kKCJESVNUSU5DVCAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChzZWxlY3RzKS5hcHBlbmQoIiBGUk9NICIpLmFwcGVuZChmcm9tKTsKKworICAgICAgICBpZiAod2hlcmUgIT0gbnVsbCAmJiAhd2hlcmUuaXNFbXB0eSgpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIFdIRVJFICIpLmFwcGVuZCh3aGVyZSk7CisgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgR1JPVVAgQlkgIikuYXBwZW5kKGdyb3VwKTsKKyAgICAgICAgaWYgKGhhdmluZyAhPSBudWxsICYmICFoYXZpbmcuaXNFbXB0eSgpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEhBVklORyAiKS5hcHBlbmQoaGF2aW5nKTsKKyAgICAgICAgaWYgKG9yZGVyICE9IG51bGwgJiYgIW9yZGVyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBPUkRFUiBCWSAiKS5hcHBlbmQob3JkZXIpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREcm9wQ29sdW1uU1FMKENvbHVtbiBjb2x1bW4pIHsKKyAgICAgICAgLy8gZW1wcmVzcyB3YW50cyBkcm9wcGVkIGNvbHVtbnMgaW4gdGhlIGZvcm06IEFMVEVSIFRBQkxFIGZvbworICAgICAgICAvLyBERUxFVEUgY29sdW1uVG9Ecm9wCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ICJBTFRFUiBUQUJMRSAiCisgICAgICAgICAgICArIGdldEZ1bGxOYW1lKGNvbHVtbi5nZXRUYWJsZSgpLCBmYWxzZSkgKyAiIERFTEVURSAiICsgY29sdW1uIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGZsb2F0IHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVtcHJlc3Mgc2VlbXMgdG8gYWxsb3cgSU5GSU5JVFkgdG8gYmUgc3RvcmVkLCBidXQgbm90IHJldHJpZXZlZCwKKyAgICAgICAgLy8gd2hpY2ggY2FuIHByb3ZlIHRvIGJlIGRpZmZpY3VsdCB0byBoYW5kbGUKKyAgICAgICAgaWYgKHZhbCA9PSBGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkgeworICAgICAgICAgICAgdmFsID0gRmxvYXQuTUFYX1ZBTFVFOworICAgICAgICAgICAgc3RvcmFnZVdhcm5pbmcobmV3IEZsb2F0KEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKSwKKyAgICAgICAgICAgICAgICBuZXcgRmxvYXQodmFsKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsID09IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKSB7CisgICAgICAgICAgICB2YWwgPSBGbG9hdC5NSU5fVkFMVUUgKyAxOworICAgICAgICAgICAgc3RvcmFnZVdhcm5pbmcobmV3IEZsb2F0KEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKSwKKyAgICAgICAgICAgICAgICBuZXcgRmxvYXQodmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0RmxvYXQoc3RtbnQsIGlkeCwgdmFsLCBjb2wpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgZG91YmxlIHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVtcHJlc3Mgc2VlbXMgdG8gYWxsb3cgSU5GSU5JVFkgdG8gYmUgc3RvcmVkLCBidXQgbm90IHJldHJpZXZlZCwKKyAgICAgICAgLy8gd2hpY2ggY2FuIHByb3ZlIHRvIGJlIGRpZmZpY3VsdCB0byBoYW5kbGUKKyAgICAgICAgaWYgKHZhbCA9PSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpIHsKKyAgICAgICAgICAgIHZhbCA9IERvdWJsZS5NQVhfVkFMVUU7CisgICAgICAgICAgICBzdG9yYWdlV2FybmluZyhuZXcgRG91YmxlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSksCisgICAgICAgICAgICAgICAgbmV3IERvdWJsZSh2YWwpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgPT0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSB7CisgICAgICAgICAgICB2YWwgPSBEb3VibGUuTUlOX1ZBTFVFICsgMTsKKyAgICAgICAgICAgIHN0b3JhZ2VXYXJuaW5nKG5ldyBEb3VibGUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSwKKyAgICAgICAgICAgICAgICBuZXcgRG91YmxlKHZhbCkpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldERvdWJsZShzdG1udCwgaWR4LCB2YWwsIGNvbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRmlyZWJpcmREaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9GaXJlYmlyZERpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRiYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRmlyZWJpcmREaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIEZpcmViaXJkLgorICovCitwdWJsaWMgY2xhc3MgRmlyZWJpcmREaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBJbnRlcmJhc2VEaWN0aW9uYXJ5IHsKKworICAgIHB1YmxpYyBGaXJlYmlyZERpY3Rpb25hcnkoKSB7CisgICAgICAgIHBsYXRmb3JtID0gIkZpcmViaXJkIjsKKworICAgICAgICAvLyBGaXJlYmlyZCAxLjUrIGxvY2tpbmcgc3RhdGVtZW50CisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhNdWx0aXBsZVRhYmxlcyA9IGZhbHNlOworICAgICAgICBmb3JVcGRhdGVDbGF1c2UgPSAiRk9SIFVQREFURSBXSVRIIExPQ0siOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGxhY2Vob2xkZXJWYWx1ZVN0cmluZyhDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQbGFjZWhvbGRlclZhbHVlU3RyaW5nKGNvbCkKKyAgICAgICAgICAgICsgIiBBUyAiICsgZ2V0VHlwZU5hbWUoY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIC8vIFNVQlNUUklORyBpbiBGaXJlYmlyZCBpcyBvZiB0aGUgZm9ybToKKyAgICAgICAgLy8gU0VMRUNUIFNVQlNUUklORyhTT01FX0NPTFVNTiBGUk9NIDEgRk9SIDUpCisgICAgICAgIGJ1Zi5hcHBlbmQoIlNVQlNUUklORygiKTsKKyAgICAgICAgc3RyLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBGUk9NICIpOworICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgKyAxIik7CisgICAgICAgIGlmIChlbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEZPUiAiKTsKKyAgICAgICAgICAgIGVuZC5hcHBlbmRUbyhidWYpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIC0gKCIpOworICAgICAgICAgICAgc3RhcnQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRm94UHJvRGljdGlvbmFyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRm94UHJvRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDk0MmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Gb3hQcm9EaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuUHJpbWFyeUtleTsKKworLyoqCisgKiBEaWN0aW9uYXJ5IGZvciBWaXN1YWwgRm94UHJvIHZpYSBEYXRhRGlyZWN0IFNlcXVlTGluaworICogYW5kIERhdGFEaXJlY3QgT0RCQyBGb3hQcm8gZHJpdmVyLiBUaGlzIHdpbGwgbm90CisgKiB3b3JrIHdpdGggYW55IG90aGVyIGNvbWJpbmF0aW9uIG9mIEpEQkMvT0RCQyBzZXJ2ZXIgYW5kIE9EQkMgZHJpdmVyLgorICogIEZveFBybyBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKyAqIDx1bD4KKyAqIDxsaT5QcmltYXJ5IEtleXMgYW5kIGluZGV4ZXMgY2Fubm90IGJlIGNyZWF0ZWQgdmlhIEpEQkM8L2xpPgorICogPGxpPk9ubHkgaGFzIGZpeGVkLWxlbmd0aCBjaGFyIGZpZWxkczogYWxsIHN0cmluZ3MgbXVzdCBiZQorICogdHJpbW1lZCBpbiByZXN1bHQgc2V0czwvbGk+CisgKiA8bGk+RG9lcyBub3QgaGF2ZSBzdWZmaWNpZW50IHN1cHBvcnQgZm9yIGZvcmVpZ24ga2V5czwvbGk+CisgKiA8bGk+T0RCQyBkcml2ZXIgY2Fubm90IGhhbmRsZSBjZXJ0YWluIEFnZ3JlZ2F0ZSBmdW5jdGlvbnMuPC9saT4KKyAqIDxsaT5Mb2NraW5nIGlzIGV4dHJlbWVsZXkgdW5yZWxpYWJsZS4gTXVsdGlwbGUgY2xpZW50cworICogYWNjZXNzaW5nIHNpbmdsZSBkYXRhc3RvcmUgbWF5IHJlc3VsdCBpbiBjb25jdXJyZW5jeQorICogZGF0YSB2YWxpZGl0eSBlcnJvcnMuPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBGb3hQcm9EaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBEQkRpY3Rpb25hcnkgeworCisgICAgcHVibGljIEZveFByb0RpY3Rpb25hcnkoKSB7CisgICAgICAgIHBsYXRmb3JtID0gIlZpc3VhbCBGb3hQcm8iOworICAgICAgICBqb2luU3ludGF4ID0gU1lOVEFYX1RSQURJVElPTkFMOworCisgICAgICAgIHN1cHBvcnRzRm9yZWlnbktleXMgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgICAgIG1heFRhYmxlTmFtZUxlbmd0aCA9IDMwOworICAgICAgICBtYXhDb2x1bW5OYW1lTGVuZ3RoID0gMzA7CisgICAgICAgIG1heEluZGV4TmFtZUxlbmd0aCA9IDg7CisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gODsKKworICAgICAgICBiaW5hcnlUeXBlTmFtZSA9ICJHRU5FUkFMIjsKKyAgICAgICAgYmxvYlR5cGVOYW1lID0gIkdFTkVSQUwiOworICAgICAgICBsb25nVmFyYmluYXJ5VHlwZU5hbWUgPSAiR0VORVJBTCI7CisgICAgICAgIGNsb2JUeXBlTmFtZSA9ICJNRU1PIjsKKyAgICAgICAgbG9uZ1ZhcmNoYXJUeXBlTmFtZSA9ICJNRU1PIjsKKyAgICAgICAgZGF0ZVR5cGVOYW1lID0gIlRJTUVTVEFNUCI7CisgICAgICAgIHRpbWVUeXBlTmFtZSA9ICJUSU1FU1RBTVAiOworICAgICAgICB2YXJjaGFyVHlwZU5hbWUgPSAiQ0hBUkFDVEVSezB9IjsKKyAgICAgICAgYmlnaW50VHlwZU5hbWUgPSAiRE9VQkxFIjsKKyAgICAgICAgbnVtZXJpY1R5cGVOYW1lID0gIklOVEVHRVIiOworICAgICAgICBzbWFsbGludFR5cGVOYW1lID0gIklOVEVHRVIiOworICAgICAgICBiaXRUeXBlTmFtZSA9ICJOVU1FUklDKDEpIjsKKyAgICAgICAgaW50ZWdlclR5cGVOYW1lID0gIklOVEVHRVIiOworICAgICAgICB0aW55aW50VHlwZU5hbWUgPSAiSU5URUdFUiI7CisgICAgICAgIGRlY2ltYWxUeXBlTmFtZSA9ICJET1VCTEUiOworICAgICAgICBkb3VibGVUeXBlTmFtZSA9ICJET1VCTEUiOworICAgICAgICByZWFsVHlwZU5hbWUgPSAiRE9VQkxFIjsKKyAgICAgICAgZmxvYXRUeXBlTmFtZSA9ICJOVU1FUklDKDE5LDE2KSI7CisKKyAgICAgICAgLy8gdGhlIG1heCBjaGFyYWN0ZXIgbGl0ZXJhbCBsZW5ndGggaXMgYWN0dWFsbHkgMjU0LCBidXQgZm9yIHByaW1hcnkKKyAgICAgICAgLy8ga2V5cywgaXQgaXMgMjQwOyBkZWZhdWx0IHRvIHRoYXQgbGVuZ3RoIHNvIHVzZXJzIGNhbiBhZGQgUEtzIGxhdGVyCisgICAgICAgIGNoYXJhY3RlckNvbHVtblNpemUgPSAyNDA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZm94cHJvIGRvZXNuJ3QgYXV0by10cnVuY2F0ZSB2YWx1ZXMuCisgICAgICAgIFN0cmluZyBzdHIgPSBycy5nZXRTdHJpbmcoY29sdW1uKTsKKyAgICAgICAgaWYgKHN0ciAhPSBudWxsKQorICAgICAgICAgICAgc3RyID0gc3RyLnRyaW0oKTsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBpbnQgY29sVHlwZSwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVuc3VyZSB0aGF0IGJsb2IvY2xvYiBpcyBoYW5kbGVkIHdpdGggc2FmZSBtZXRob2RzLgorICAgICAgICBzd2l0Y2ggKGNvbFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQkxPQjoKKyAgICAgICAgICAgICAgICBzdG1udC5zZXRCeXRlcyhpZHgsIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHN0bW50LnNldFN0cmluZyhpZHgsIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdXBlci5zZXROdWxsKHN0bW50LCBpZHgsIGNvbFR5cGUsIGNvbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFwcGVuZFNpemUoQ29sdW1uIGNvbCwgU3RyaW5nIHR5cGVOYW1lKSB7CisgICAgICAgIC8vIGZveHBybyBkb2VzIG5vdCBsaWtlIHVuc2l6ZWQgY29sdW1uIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgaWYgKGNvbC5nZXRTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCJDSEFSQUNURVIiLmVxdWFscyh0eXBlTmFtZSkpCisgICAgICAgICAgICAgICAgY29sLnNldFNpemUoMjQwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJOVU1FUklDIi5lcXVhbHModHlwZU5hbWUpKQorICAgICAgICAgICAgICAgIGNvbC5zZXRTaXplKDE5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuYXBwZW5kU2l6ZShjb2wsIHR5cGVOYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByaW1hcnlLZXlDb25zdHJhaW50U1FMKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgLy8gdGhpcyBmb3hwcm8gZHJpdmVyIGNvbWJpbmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgcHJpbWFyeSBrZXlzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDcmVhdGVJbmRleFNRTChJbmRleCBpbmRleCkgeworICAgICAgICAvLyBmb3hwcm8gSkRCQyBhY2Nlc3MgZG9lcyBub3QgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGluZGV4ZXMKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoRGF0YWJhc2VNZXRhRGF0YSBtZXRhLCBTdHJpbmcgY2F0YWxvZywKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2x1bW5OYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IHN1cGVyLmdldENvbHVtbnMobWV0YSwgY2F0YWxvZywgc2NoZW1hTmFtZSwKKyAgICAgICAgICAgICAgICB0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbm4pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNvbHMgIT0gbnVsbCAmJiBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIGZveHBybyByZXR1cm5zIGFuIG9kZCB0eXBlICIxMSIgY29kZSBmb3IgREFURVRJTUUgZmllbGRzCisgICAgICAgICAgICAgICAgaWYgKGNvbHNbaV0uZ2V0VHlwZSgpID09IDExKQorICAgICAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuVElNRVNUQU1QKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTUVNTyBtYXBzIHRvIExPTkdWQVJDSEFSIGR1cmluZyByZXZlcnNlIGFuYWx5c2lzCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIk1FTU8iLmVxdWFscyhjb2xzW2ldLmdldFR5cGVOYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuQ0xPQik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29sczsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAvLyBmb3hwcm8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgdGFibGUgc3BlY2lmaWVkIGluIHRoZQorICAgICAgICAgICAgLy8gY29sdW1uIGxpc3QgaXMgbm90IGZvdW5kCisgICAgICAgICAgICBpZiAoc2UuZ2V0RXJyb3JDb2RlKCkgPT0gNTYyKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgdGhyb3cgc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbWFyeUtleVtdIGdldFByaW1hcnlLZXlzKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyB0aGlzIGNvbWJpbmF0aW9uIGRvZXMgbm90IHJlbGlhYmx5IHJldHVybiBQSyBpbmZvcm1hdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9IMkRpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0gyRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGYxOWYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9IMkRpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkZpbHRlclZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlByaW1hcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworCisvKioKKyAqIFN1cHBvcnQgZm9yIHRoZSBIMiBkYXRhYmFzZSAoe0BsaW5rIGh0dHA6Ly93d3cuaDJkYXRhYmFzZS5jb219KS4KKyAqCisgKiBAc2luY2UgMC45LjcKKyAqLworcHVibGljIGNsYXNzIEgyRGljdGlvbmFyeSBleHRlbmRzIERCRGljdGlvbmFyeSB7CisKKyAgICBwdWJsaWMgSDJEaWN0aW9uYXJ5KCkgeworICAgICAgICBwbGF0Zm9ybSA9ICJIMiI7CisgICAgICAgIHZhbGlkYXRpb25TUUwgPSAiQ0FMTCAxIjsKKyAgICAgICAgY2xvc2VQb29sU1FMID0gIlNIVVRET1dOIjsKKworICAgICAgICBzdXBwb3J0c0F1dG9Bc3NpZ24gPSB0cnVlOworICAgICAgICBsYXN0R2VuZXJhdGVkS2V5UXVlcnkgPSAiQ0FMTCBJREVOVElUWSgpIjsKKyAgICAgICAgYXV0b0Fzc2lnbkNsYXVzZSA9ICJJREVOVElUWSI7CisgICAgICAgIGF1dG9Bc3NpZ25UeXBlTmFtZSA9ICJJTlRFR0VSIjsKKyAgICAgICAgbmV4dFNlcXVlbmNlUXVlcnkgPSAiQ0FMTCBORVhUIFZBTFVFIEZPUiB7MH0iOworCisgICAgICAgIC8vIENST1NTIEpPSU4gaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgY3Jvc3NKb2luQ2xhdXNlID0gIkpPSU4iOworICAgICAgICByZXF1aXJlc0NvbmRpdGlvbkZvckNyb3NzSm9pbiA9IHRydWU7CisgICAgICAgIHN0cmluZ0xlbmd0aEZ1bmN0aW9uID0gIkxFTkdUSCh7MH0pIjsKKyAgICAgICAgdHJpbUxlYWRpbmdGdW5jdGlvbiA9ICJMVFJJTSh7MH0pIjsKKyAgICAgICAgdHJpbVRyYWlsaW5nRnVuY3Rpb24gPSAiUlRSSU0oezB9KSI7CisgICAgICAgIHRyaW1Cb3RoRnVuY3Rpb24gPSAiVFJJTSh7MH0pIjsKKworICAgICAgICB1c2VTY2hlbWFOYW1lID0gdHJ1ZTsKKyAgICAgICAgc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUgPSB0cnVlOworICAgICAgICBzdXBwb3J0c1NlbGVjdFN0YXJ0SW5kZXggPSB0cnVlOworICAgICAgICBzdXBwb3J0c1NlbGVjdEVuZEluZGV4ID0gdHJ1ZTsKKyAgICAgICAgcmFuZ2VQb3NpdGlvbiA9IFJBTkdFX1BPU1RfTE9DSzsKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisKKyAgICAgICAgdXNlR2V0T2JqZWN0Rm9yQmxvYnMgPSB0cnVlOworICAgICAgICBibG9iVHlwZU5hbWUgPSAiQkxPQiI7CisgICAgICAgIGRvdWJsZVR5cGVOYW1lID0gIkRPVUJMRSI7CisKKyAgICAgICAgc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRQcmltYXJ5S2V5cyA9IHRydWU7CisgICAgICAgIHN1cHBvcnRzTnVsbFRhYmxlRm9yR2V0SW5kZXhJbmZvID0gdHJ1ZTsKKworICAgICAgICByZXF1aXJlc0Nhc3RGb3JNYXRoRnVuY3Rpb25zID0gZmFsc2U7CisgICAgICAgIHJlcXVpcmVzQ2FzdEZvckNvbXBhcmlzb25zID0gZmFsc2U7CisKKyAgICAgICAgcmVzZXJ2ZWRXb3JkU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiQ1VSUkVOVF9USU1FU1RBTVAiLCAiQ1VSUkVOVF9USU1FIiwgIkNVUlJFTlRfREFURSIsICJDUk9TUyIsCisgICAgICAgICAgICAiRElTVElOQ1QiLCAiRVhDRVBUIiwgIkVYSVNUUyIsICJGUk9NIiwgIkZPUiIsICJGQUxTRSIsICJGVUxMIiwKKyAgICAgICAgICAgICJHUk9VUCIsICJIQVZJTkciLCAiSU5ORVIiLCAiSU5URVJTRUNUIiwgIklTIiwgIkpPSU4iLCAiTElLRSIsCisgICAgICAgICAgICAiTUlOVVMiLCAiTkFUVVJBTCIsICJOT1QiLCAiTlVMTCIsICJPTiIsICJPUkRFUiIsICJQUklNQVJZIiwKKyAgICAgICAgICAgICJST1dOVU0iLCAiU0VMRUNUIiwgIlNZU0RBVEUiLCAiU1lTVElNRSIsICJTWVNUSU1FU1RBTVAiLCAiVE9EQVkiLAorICAgICAgICAgICAgIlRSVUUiLCAiVU5JT04iLCAiV0hFUkUiIAorICAgICAgICAgICAgfSkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SkRCQ1R5cGUoaW50IG1ldGFUeXBlQ29kZSwgYm9vbGVhbiBsb2IpIHsKKyAgICAgICAgaW50IHR5cGUgPSBzdXBlci5nZXRKREJDVHlwZShtZXRhVHlwZUNvZGUsIGxvYik7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFR5cGVzLkJJR0lOVDoKKyAgICAgICAgICAgIGlmIChtZXRhVHlwZUNvZGUgPT0gSmF2YVR5cGVzLkJJR0lOVEVHRVIpCisgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVzLk5VTUVSSUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFByZWZlcnJlZFR5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByZWZlcnJlZFR5cGUodHlwZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFkZFByaW1hcnlLZXlTUUwoUHJpbWFyeUtleSBwaykgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RHJvcFByaW1hcnlLZXlTUUwoUHJpbWFyeUtleSBwaykgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWRkQ29sdW1uU1FMKENvbHVtbiBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IAorICAgICAgICAgICAgIkFMVEVSIFRBQkxFICIgKyBnZXRGdWxsTmFtZShjb2x1bW4uZ2V0VGFibGUoKSwgZmFsc2UpIAorICAgICAgICAgICAgICAgICsgIiBBREQgQ09MVU1OICIgKyBnZXREZWNsYXJlQ29sdW1uU1FMKGNvbHVtbiwgdHJ1ZSkgCisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldENyZWF0ZVRhYmxlU1FMKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIkNSRUFURSBUQUJMRSAiKS5hcHBlbmQoZ2V0RnVsbE5hbWUodGFibGUsIGZhbHNlKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiAoIik7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0RGVjbGFyZUNvbHVtblNRTChjb2xzW2ldLCBmYWxzZSkpOworICAgICAgICB9CisKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IHRhYmxlLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgU3RyaW5nIHBrU3RyOworICAgICAgICBpZiAocGsgIT0gbnVsbCkgeworICAgICAgICAgICAgcGtTdHIgPSBnZXRQcmltYXJ5S2V5Q29uc3RyYWludFNRTChwayk7CisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkocGtTdHIpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKHBrU3RyKTsKKyAgICAgICAgfQorCisgICAgICAgIFVuaXF1ZVtdIHVucXMgPSB0YWJsZS5nZXRVbmlxdWVzKCk7CisgICAgICAgIFN0cmluZyB1bnFTdHI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5xcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdW5xU3RyID0gZ2V0VW5pcXVlQ29uc3RyYWludFNRTCh1bnFzW2ldKTsKKyAgICAgICAgICAgIGlmICh1bnFTdHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZCh1bnFTdHIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgYnVmLnRvU3RyaW5nKCkgfTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByaW1hcnlLZXlDb25zdHJhaW50U1FMKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHBrLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKGNvbHMubGVuZ3RoID09IDEgJiYgY29sc1swXS5pc0F1dG9Bc3NpZ25lZCgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQcmltYXJ5S2V5Q29uc3RyYWludFNRTChwayk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1JbmRleChTdHJpbmcgbmFtZSwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpLnN0YXJ0c1dpdGgoIlNZU1RFTV8iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcXVlbmNlc1NRTChTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHNlcXVlbmNlTmFtZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJTRUxFQ1QgU0VRVUVOQ0VfU0NIRU1BLCBTRVFVRU5DRV9OQU1FIEZST00gIikKKyAgICAgICAgICAgIC5hcHBlbmQoIklORk9STUFUSU9OX1NDSEVNQS5TRVFVRU5DRVMiKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCB8fCBzZXF1ZW5jZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBXSEVSRSAiKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiU0VRVUVOQ0VfU0NIRU1BID0gPyIpOworICAgICAgICAgICAgaWYgKHNlcXVlbmNlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcXVlbmNlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiU0VRVUVOQ0VfTkFNRSA9ID8iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW5bXSBnZXRDb2x1bW5zKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sdW1uTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHN1cGVyLmdldENvbHVtbnMobWV0YSwgY2F0YWxvZywgc2NoZW1hTmFtZSwgdGFibGVOYW1lLCAKKyAgICAgICAgICAgIGNvbHVtbk5hbWUsIGNvbm4pOworICAgICAgICByZXR1cm4gY29sczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTZWxlY3RSYW5nZShTUUxCdWZmZXIgYnVmLCBsb25nIHN0YXJ0LCBsb25nIGVuZCkgeworICAgICAgICBpZiAoZW5kICE9IExvbmcuTUFYX1ZBTFVFKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIExJTUlUICIpLmFwcGVuZFZhbHVlKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IDApCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgT0ZGU0VUICIpLmFwcGVuZFZhbHVlKHN0YXJ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlNVQlNUUigiKTsKKyAgICAgICAgc3RyLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgKCIpOworICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgKyAxKSIpOworICAgICAgICBpZiAoZW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgKCIpOworICAgICAgICAgICAgZW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAiKTsKKyAgICAgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluZGV4T2YoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBmaW5kLAorICAgICAgICBGaWx0ZXJWYWx1ZSBzdGFydCkgeworICAgICAgICBidWYuYXBwZW5kKCIoUE9TSVRJT04oIik7CisgICAgICAgIGZpbmQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIElOICIpOworICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHN1YnN0cmluZyhidWYsIHN0ciwgc3RhcnQsIG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHIuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSAtIDEiKTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiArICIpOworICAgICAgICAgICAgc3RhcnQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSFNRTERpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0hTUUxEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0ZjdkNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0hTUUxEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmhzcWxkYi5UcmFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJlZmVyZW50aWFsSW50ZWdyaXR5RXhjZXB0aW9uOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIEh5cGVyc29uaWMgU1FMIGRhdGFiYXNlLgorICovCitwdWJsaWMgY2xhc3MgSFNRTERpY3Rpb25hcnkKKyAgICBleHRlbmRzIERCRGljdGlvbmFyeSB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgSFNRTCBzaG91bGQgdXNlICJDUkVBVEVEIENBQ0hFRCBUQUJMRSIgcmF0aGVyIHRoYW4KKyAgICAgKiAiQ1JFQVRFIFRBQkxFIiwgd2hpY2ggYWxsb3dzIGRpc2stYmFzZWQgZGF0YWJhc2Ugb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYWNoZVRhYmxlcyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBTUUxCdWZmZXIgX29uZUJ1ZmZlciA9IG5ldyBTUUxCdWZmZXIodGhpcykuYXBwZW5kKCIxIik7CisKKyAgICBwdWJsaWMgSFNRTERpY3Rpb25hcnkoKSB7CisgICAgICAgIHBsYXRmb3JtID0gIkhTUUwiOworICAgICAgICB2YWxpZGF0aW9uU1FMID0gIkNBTEwgMSI7CisgICAgICAgIGNsb3NlUG9vbFNRTCA9ICJTSFVURE9XTiI7CisKKyAgICAgICAgc3VwcG9ydHNBdXRvQXNzaWduID0gdHJ1ZTsKKyAgICAgICAgbGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID0gIkNBTEwgSURFTlRJVFkoKSI7CisgICAgICAgIGF1dG9Bc3NpZ25DbGF1c2UgPSAiSURFTlRJVFkiOworICAgICAgICBhdXRvQXNzaWduVHlwZU5hbWUgPSAiSU5URUdFUiI7CisgICAgICAgIG5leHRTZXF1ZW5jZVF1ZXJ5ID0gIlNFTEVDVCBORVhUIFZBTFVFIEZPUiB7MH0gRlJPTSIKKyAgICAgICAgICAgICsgIiBJTkZPUk1BVElPTl9TQ0hFTUEuU1lTVEVNX1NFUVVFTkNFUyI7CisgICAgICAgIGNyb3NzSm9pbkNsYXVzZSA9ICJKT0lOIjsKKyAgICAgICAgcmVxdWlyZXNDb25kaXRpb25Gb3JDcm9zc0pvaW4gPSB0cnVlOworICAgICAgICBzdHJpbmdMZW5ndGhGdW5jdGlvbiA9ICJMRU5HVEgoezB9KSI7CisgICAgICAgIHRyaW1MZWFkaW5nRnVuY3Rpb24gPSAiTFRSSU0oezB9KSI7CisgICAgICAgIHRyaW1UcmFpbGluZ0Z1bmN0aW9uID0gIlJUUklNKHswfSkiOworICAgICAgICB0cmltQm90aEZ1bmN0aW9uID0gIkxUUklNKFJUUklNKHswfSkpIjsKKworICAgICAgICAvLyBIU1FMIDEuOC4wIGRvZXMgc3VwcG9ydCBzY2hlbWEgbmFtZXMgaW4gdGhlIHRhYmxlICgic2NoZW1hLnRhYmxlIiksCisgICAgICAgIC8vIGJ1dCBkb2Vzbid0IHN1cHBvcnQgaXQgZm9yIGNvbHVtbnMgcmVmZXJlbmNlcyAoInNjaGVtYS50YWJsZS5jb2x1bW4iKQorICAgICAgICB1c2VTY2hlbWFOYW1lID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0U3RhcnRJbmRleCA9IHRydWU7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0RW5kSW5kZXggPSB0cnVlOworICAgICAgICByYW5nZVBvc2l0aW9uID0gUkFOR0VfUFJFX0RJU1RJTkNUOworICAgICAgICBzdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHMgPSBmYWxzZTsKKworICAgICAgICB1c2VHZXRPYmplY3RGb3JCbG9icyA9IHRydWU7CisgICAgICAgIGJsb2JUeXBlTmFtZSA9ICJWQVJCSU5BUlkiOworICAgICAgICBkb3VibGVUeXBlTmFtZSA9ICJOVU1FUklDIjsKKworICAgICAgICBzdXBwb3J0c051bGxUYWJsZUZvckdldFByaW1hcnlLZXlzID0gdHJ1ZTsKKyAgICAgICAgc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbmRleEluZm8gPSB0cnVlOworCisgICAgICAgIHJlcXVpcmVzQ2FzdEZvck1hdGhGdW5jdGlvbnMgPSB0cnVlOworICAgICAgICByZXF1aXJlc0Nhc3RGb3JDb21wYXJpc29ucyA9IHRydWU7CisKKyAgICAgICAgcmVzZXJ2ZWRXb3JkU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJCRUZPUkUiLCAiQklHSU5UIiwgIkJJTkFSWSIsICJDQUNIRUQiLCAiREFURVRJTUUiLCAiTElNSVQiLAorICAgICAgICAgICAgIkxPTkdWQVJCSU5BUlkiLCAiTE9OR1ZBUkNIQVIiLCAiT0JKRUNUIiwgIk9USEVSIiwKKyAgICAgICAgICAgICJTQVZFUE9JTlQiLCAiVEVNUCIsICJURVhUIiwgIlRSSUdHRVIiLCAiVElOWUlOVCIsCisgICAgICAgICAgICAiVkFSQklOQVJZIiwgIlZBUkNIQVJfSUdOT1JFQ0FTRSIsCisgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEpEQkNUeXBlKGludCBtZXRhVHlwZUNvZGUsIGJvb2xlYW4gbG9iKSB7CisgICAgICAgIGludCB0eXBlID0gc3VwZXIuZ2V0SkRCQ1R5cGUobWV0YVR5cGVDb2RlLCBsb2IpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklHSU5UOgorICAgICAgICAgICAgICAgIGlmIChtZXRhVHlwZUNvZGUgPT0gSmF2YVR5cGVzLkJJR0lOVEVHRVIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlcy5OVU1FUklDOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UHJlZmVycmVkVHlwZShpbnQgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ0xPQjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZXMuVkFSQ0hBUjsKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQkxPQjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZXMuVkFSQklOQVJZOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJlZmVycmVkVHlwZSh0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZGRQcmltYXJ5S2V5U1FMKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldERyb3BQcmltYXJ5S2V5U1FMKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFkZENvbHVtblNRTChDb2x1bW4gY29sdW1uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ICJBTFRFUiBUQUJMRSAiCisgICAgICAgICAgICArIGdldEZ1bGxOYW1lKGNvbHVtbi5nZXRUYWJsZSgpLCBmYWxzZSkKKyAgICAgICAgICAgICsgIiBBREQgQ09MVU1OICIgKyBnZXREZWNsYXJlQ29sdW1uU1FMKGNvbHVtbiwgdHJ1ZSkgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlVGFibGVTUUwoVGFibGUgdGFibGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiQ1JFQVRFICIpOworICAgICAgICBpZiAoY2FjaGVUYWJsZXMpCisgICAgICAgICAgICBidWYuYXBwZW5kKCJDQUNIRUQgIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlRBQkxFICIpLmFwcGVuZChnZXRGdWxsTmFtZSh0YWJsZSwgZmFsc2UpKS5hcHBlbmQoIiAoIik7CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0RGVjbGFyZUNvbHVtblNRTChjb2xzW2ldLCBmYWxzZSkpOworICAgICAgICB9CisKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IHRhYmxlLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgU3RyaW5nIHBrU3RyOworICAgICAgICBpZiAocGsgIT0gbnVsbCkgeworICAgICAgICAgICAgcGtTdHIgPSBnZXRQcmltYXJ5S2V5Q29uc3RyYWludFNRTChwayk7CisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkocGtTdHIpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKHBrU3RyKTsKKyAgICAgICAgfQorCisgICAgICAgIFVuaXF1ZVtdIHVucXMgPSB0YWJsZS5nZXRVbmlxdWVzKCk7CisgICAgICAgIFN0cmluZyB1bnFTdHI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5xcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdW5xU3RyID0gZ2V0VW5pcXVlQ29uc3RyYWludFNRTCh1bnFzW2ldKTsKKyAgICAgICAgICAgIGlmICh1bnFTdHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZCh1bnFTdHIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyBidWYudG9TdHJpbmcoKSB9OworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbnN0cmFpbnRTUUwoUHJpbWFyeUtleSBwaykgeworICAgICAgICBDb2x1bW5bXSBjb2xzID0gcGsuZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scy5sZW5ndGggPT0gMSAmJiBjb2xzWzBdLmlzQXV0b0Fzc2lnbmVkKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByaW1hcnlLZXlDb25zdHJhaW50U1FMKHBrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbUluZGV4KFN0cmluZyBuYW1lLCBUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIlNZU18iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcXVlbmNlc1NRTChTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHNlcXVlbmNlTmFtZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJTRUxFQ1QgU0VRVUVOQ0VfU0NIRU1BLCBTRVFVRU5DRV9OQU1FIEZST00gIikuCisgICAgICAgICAgICBhcHBlbmQoIklORk9STUFUSU9OX1NDSEVNQS5TWVNURU1fU0VRVUVOQ0VTIik7CisgICAgICAgIGlmIChzY2hlbWFOYW1lICE9IG51bGwgfHwgc2VxdWVuY2VOYW1lICE9IG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIgV0hFUkUgIik7CisgICAgICAgIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlNFUVVFTkNFX1NDSEVNQSA9ID8iKTsKKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgQU5EICIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXF1ZW5jZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlNFUVVFTkNFX05BTUUgPSA/Iik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU1FMQnVmZmVyIHRvT3BlcmF0aW9uKFN0cmluZyBvcCwgU1FMQnVmZmVyIHNlbGVjdHMsCisgICAgICAgIFNRTEJ1ZmZlciBmcm9tLCBTUUxCdWZmZXIgd2hlcmUsIFNRTEJ1ZmZlciBncm91cCwgU1FMQnVmZmVyIGhhdmluZywKKyAgICAgICAgU1FMQnVmZmVyIG9yZGVyLCBib29sZWFuIGRpc3RpbmN0LCBsb25nIHN0YXJ0LCBsb25nIGVuZCwKKyAgICAgICAgU3RyaW5nIGZvclVwZGF0ZUNsYXVzZSkgeworICAgICAgICAvLyBoc3FsIHJlcXVpcmVzIG9yZGVyaW5nIHdoZW4gbGltaXQgaXMgdXNlZAorICAgICAgICBpZiAoKHN0YXJ0ICE9IDAgfHwgZW5kICE9IExvbmcuTUFYX1ZBTFVFKQorICAgICAgICAgICAgJiYgKG9yZGVyID09IG51bGwgfHwgb3JkZXIuaXNFbXB0eSgpKSkKKyAgICAgICAgICAgIG9yZGVyID0gX29uZUJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvT3BlcmF0aW9uKG9wLCBzZWxlY3RzLCBmcm9tLCB3aGVyZSwgZ3JvdXAsIGhhdmluZywKKyAgICAgICAgICAgIG9yZGVyLCBkaXN0aW5jdCwgc3RhcnQsIGVuZCwgZm9yVXBkYXRlQ2xhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbHVtbk5hbWUsIENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBzdXBlci5nZXRDb2x1bW5zKG1ldGEsIGNhdGFsb2csIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSwKKyAgICAgICAgICAgIGNvbHVtbk5hbWUsIGNvbm4pOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBjb2xzICE9IG51bGwgJiYgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIkJPT0xFQU4iLmVxdWFsc0lnbm9yZUNhc2UoY29sc1tpXS5nZXRUeXBlTmFtZSgpKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuQklUKTsKKyAgICAgICAgcmV0dXJuIGNvbHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBkb3VibGUgdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSFNRTCBoYXMgYSBidWcgd2hlcmUgaXQgY2Fubm90IHN0b3JlIGEgZG91YmxlIGlmIGl0IGlzCisgICAgICAgIC8vIGV4YWN0bHkgdGhlIHNhbWUgYXMgTG9uZy5NQVhfVkFMVUUgb3IgTUlOX1ZBTFVFCisgICAgICAgIGlmICh2YWwgPT0gTG9uZy5NQVhfVkFMVUUgfHwgdmFsID09IExvbmcuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgICBzdG1udC5zZXRMb25nKGlkeCwgKGxvbmcpdmFsKTsKKyAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICBzdXBlci5zZXREb3VibGUoc3RtbnQsIGlkeCwgdmFsLCBjb2wpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbChQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgQmlnRGVjaW1hbCB2YWwsCisgICAgICAgIENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBoc3FsIGNhbid0IGNvbXBhcmUgYSBCaWdEZWNpbWFsIGVxdWFsIHRvIGFueSBvdGhlciB0eXBlLCBzbyB0cnkKKyAgICAgICAgLy8gdG8gc2V0IHR5cGUgYmFzZWQgb24gY29sdW1uCisgICAgICAgIGludCB0eXBlID0gKHZhbCA9PSBudWxsIHx8IGNvbCA9PSBudWxsKSA/IEphdmFUeXBlcy5CSUdERUNJTUFMCisgICAgICAgICAgICA6IGNvbC5nZXRKYXZhVHlwZSgpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgc2V0RG91YmxlKHN0bW50LCBpZHgsIHZhbC5kb3VibGVWYWx1ZSgpLCBjb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgc2V0RG91YmxlKHN0bW50LCBpZHgsIHZhbC5mbG9hdFZhbHVlKCksIGNvbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN1cGVyLnNldEJpZ0RlY2ltYWwoc3RtbnQsIGlkeCwgdmFsLCBjb2wpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2VsZWN0UmFuZ2UoU1FMQnVmZmVyIGJ1ZiwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgLy8gSFNRTCBkb2Vzbid0IHBhcmFtZXRlcnMgaW4gcmFuZ2UKKyAgICAgICAgYnVmLmFwcGVuZCgiIExJTUlUICIpLmFwcGVuZChTdHJpbmcudmFsdWVPZihzdGFydCkpLmFwcGVuZCgiICIpOworICAgICAgICBpZiAoZW5kID09IExvbmcuTUFYX1ZBTFVFKQorICAgICAgICAgICAgYnVmLmFwcGVuZChTdHJpbmcudmFsdWVPZigwKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZW5kIC0gc3RhcnQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoc3Vic3RyaW5nRnVuY3Rpb25OYW1lKS5hcHBlbmQoIigoIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIpLCAoIik7CisgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiArIDEpIik7CisgICAgICAgIGlmIChlbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAoIik7CisgICAgICAgICAgICBhcHBlbmROdW1lcmljQ2FzdChidWYsIGVuZCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAoIik7CisgICAgICAgICAgICBhcHBlbmROdW1lcmljQ2FzdChidWYsIHN0YXJ0KTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikpIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluZGV4T2YoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBmaW5kLAorICAgICAgICBGaWx0ZXJWYWx1ZSBzdGFydCkgeworICAgICAgICBidWYuYXBwZW5kKCIoTE9DQVRFKCIpOworICAgICAgICBmaW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAoIik7CisgICAgICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgMSkiKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIpIC0gMSkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBsYWNlaG9sZGVyVmFsdWVTdHJpbmcoQ29sdW1uIGNvbCkgeworICAgICAgICBTdHJpbmcgdHlwZSA9IGdldFR5cGVOYW1lKGNvbC5nZXRUeXBlKCkpOworICAgICAgICBpbnQgaWR4ID0gdHlwZS5pbmRleE9mKCJ7MH0iKTsKKyAgICAgICAgaWYgKGlkeCAhPSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIHByZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGlkeCk7CisgICAgICAgICAgICBpZiAodHlwZS5sZW5ndGgoKSA+IGlkeCArIDMpCisgICAgICAgICAgICAgICAgdHlwZSA9IHByZSArIHR5cGUuc3Vic3RyaW5nKGlkeCArIDMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHR5cGUgPSBwcmU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJOVUxMIEFTICIgKyB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uIG5ld1N0b3JlRXhjZXB0aW9uKFN0cmluZyBtc2csIFNRTEV4Y2VwdGlvbltdIGNhdXNlcywKKyAgICAgICAgT2JqZWN0IGZhaWxlZCkgeworICAgICAgICBPcGVuSlBBRXhjZXB0aW9uIGtlID0gc3VwZXIubmV3U3RvcmVFeGNlcHRpb24obXNnLCBjYXVzZXMsIGZhaWxlZCk7CisgICAgICAgIGlmIChrZSBpbnN0YW5jZW9mIFJlZmVyZW50aWFsSW50ZWdyaXR5RXhjZXB0aW9uCisgICAgICAgICAgICAmJiBjYXVzZXNbMF0uZ2V0RXJyb3JDb2RlKCkgPT0gLVRyYWNlLlZJT0xBVElPTl9PRl9VTklRVUVfSU5ERVgpIHsKKyAgICAgICAgICAgICgoUmVmZXJlbnRpYWxJbnRlZ3JpdHlFeGNlcHRpb24pIGtlKS5zZXRJbnRlZ3JpdHlWaW9sYXRpb24KKyAgICAgICAgICAgICAgICAoUmVmZXJlbnRpYWxJbnRlZ3JpdHlFeGNlcHRpb24uSVZfVU5JUVVFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSW5mb3JtaXhEaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9JbmZvcm1peERpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSW5mb3JtaXhEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuUHJpbWFyeUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlJlZmVyZW5jZUhhc2hTZXQ7CisKKy8qKgorICogRGljdGlvbmFyeSBmb3IgSW5mb3JtaXggZGF0YWJhc2UuIE5vdGFibGUgZmVhdHVyZXM6CisgKiA8dWw+CisgKiA8bGk+SW5mb3JtaXggZG9lcyBub3QgYWxsb3cgcGVzc2ltaXN0aWMgbG9ja2luZyBvbiBzY3JvbGxhYmxlIHJlc3VsdAorICogc2V0cy48L2xpPgorICogPGxpPlNFVCBMT0NLIE1PREUgVE8gV0FJVCBOIHN0YXRlbWVudHMgYXJlIGlzc3VlZCB0byB3YWl0IG9uIGxvY2tzLiBTZWUKKyAqIHtAbGluayAjbG9ja1dhaXRTZWNvbmRzfSBhbmQge0BsaW5rICNsb2NrTW9kZUVuYWJsZWR9LjwvbGk+CisgKiA8bGk+TE9DSyBNT0RFIFJPVyBpcyB1c2VkIGJ5IGRlZmF1bHQgZm9yIHRhYmxlIGNyZWF0aW9uIHRvIGFsbG93IHRoZQorICogbWF4aW11bSBjb25jdXJyZW5jeS48L2xpPgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIEluZm9ybWl4RGljdGlvbmFyeQorICAgIGV4dGVuZHMgREJEaWN0aW9uYXJ5IHsKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRoZW4gd2Ugd2lsbCBpc3N1ZSBhICJTRVQgTE9DSyBNT0RFIFRPIFdBSVQgTiIKKyAgICAgKiBzdGF0ZW1lbnQgd2hlbmV2ZXIgd2UgY3JlYXRlIGEge0BsaW5rIENvbm5lY3Rpb259LCBpbiBvcmRlcgorICAgICAqIGFsbG93IHdhaXRpbmcgb24gbG9ja3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbG9ja01vZGVFbmFibGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGxpbmsgI2xvY2tNb2RlRW5hYmxlZH0gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhpcworICAgICAqIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHdlIHdpbGwgd2FpdCB0bworICAgICAqIG9idGFpbiBhIGxvY2sgZm9yIGluc2VydHMgYW5kIHBlc3NpbWlzdGljIGxvY2tpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBsb2NrV2FpdFNlY29uZHMgPSAzMDsKKworICAgIC8qKgorICAgICAqIEluZm9ybWl4IEpEQkMgbWV0YWRhdGEgZm9yIGFsbCBrbm93biBkcml2ZXJzIHJldHVybnMgd2l0aCB0aGUKKyAgICAgKiB0YWJsZSBjYXRhbG9nIGFuZCB0aGUgdGFibGUgc2NoZW1hIG5hbWUgc3dhcHBlZC4gQSA8Y29kZT50cnVlPC9jb2RlPgorICAgICAqIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IGluZGljYXRlcyB0aGF0IHRoZXkgc2hvdWxkIGJlIHJldmVyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN3YXBTY2hlbWFBbmRDYXRhbG9nID0gdHJ1ZTsKKworICAgIC8vIHdlYWsgc2V0IG9mIGNvbm5lY3Rpb25zIHdlJ3ZlIGFscmVhZHkgZXhlY3V0ZWQgbG9jayBtb2RlIHNxbCBvbgorICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBfc2VlbkNvbm5lY3Rpb25zID0gbmV3IFJlZmVyZW5jZUhhc2hTZXQKKyAgICAgICAgKFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisKKyAgICBwdWJsaWMgSW5mb3JtaXhEaWN0aW9uYXJ5KCkgeworICAgICAgICBwbGF0Zm9ybSA9ICJJbmZvcm1peCI7CisgICAgICAgIHZhbGlkYXRpb25TUUwgPSAiU0VMRUNUIEZJUlNUIDEgQ1VSUkVOVCBUSU1FU1RBTVAgIgorICAgICAgICAgICAgKyAiRlJPTSBpbmZvcm1peC5zeXN0YWJsZXMiOworCisgICAgICAgIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IHRydWU7CisgICAgICAgIGF1dG9Bc3NpZ25UeXBlTmFtZSA9ICJzZXJpYWwiOworICAgICAgICBsYXN0R2VuZXJhdGVkS2V5UXVlcnkgPSAiU0VMRUNUIEZJUlNUIDEgREJJTkZPKCdzcWxjYS5zcWxlcnJkMScpICIKKyAgICAgICAgICAgICsgIkZST00gaW5mb3JtaXguc3lzdGFibGVzIjsKKworICAgICAgICAvLyBpbmZvcm1peCBhY3R1YWxseSBkb2VzIHN1cHBvcnQgZGVmZXJyZWQgY29uc3RyYWludHMsIGJ1dCBub3QKKyAgICAgICAgLy8gaW4gdGhlIHRhYmxlIGRlZmluaXRpb247IGRlZmVycmVkIGNvbnN0cmFpbnRzIGNhbiBiZSBhY3RpdmF0ZWQgYnkKKyAgICAgICAgLy8gaW52b2tpbmcgInNldCBjb25zdHJhaW50cyBhbGwgZGVmZXJyZWQiIG9uIHRoZSBjb25uZWN0aW9uLCB3aGljaAorICAgICAgICAvLyB3ZSBkb24ndCBkbyB5ZXQKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgICAgIGNvbnN0cmFpbnROYW1lTW9kZSA9IENPTlNfTkFNRV9BRlRFUjsKKworICAgICAgICBtYXhUYWJsZU5hbWVMZW5ndGggPSAxODsKKyAgICAgICAgbWF4Q29sdW1uTmFtZUxlbmd0aCA9IDE4OworICAgICAgICBtYXhJbmRleE5hbWVMZW5ndGggPSAxODsKKyAgICAgICAgbWF4Q29uc3RyYWludE5hbWVMZW5ndGggPSAxODsKKworICAgICAgICAvLyBJbmZvcm1peCB1c2VzIGEgbm9uLXN0YW5kYXJkICI6IiB0byBzZXBhcmF0ZSBzY2hlbWEgYW5kIHRhYmxlIG5hbWVzCisgICAgICAgIGNhdGFsb2dTZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgLy8gaW5mb3JtaXggc3VwcG9ydHMgIkNMT0IiIHR5cGUsIGJ1dCBhbnkgYXR0ZW1wdCB0byBpbnNlcnQKKyAgICAgICAgLy8gaW50byB0aGVtIHJhaXNlczogImphdmEuc3FsLlNRTEV4Y2VwdGlvbjogQ2FuJ3QgY29udmVydCBmcm9tbnVsbCIKKyAgICAgICAgdXNlR2V0U3RyaW5nRm9yQ2xvYnMgPSB0cnVlOworICAgICAgICBsb25nVmFyY2hhclR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBjbG9iVHlwZU5hbWUgPSAiVEVYVCI7CisgICAgICAgIHNtYWxsaW50VHlwZU5hbWUgPSAiSU5UOCI7CisgICAgICAgIHRpbnlpbnRUeXBlTmFtZSA9ICJJTlQ4IjsKKyAgICAgICAgZmxvYXRUeXBlTmFtZSA9ICJGTE9BVCI7CisgICAgICAgIGJpdFR5cGVOYW1lID0gIkJPT0xFQU4iOworICAgICAgICBibG9iVHlwZU5hbWUgPSAiQllURSI7CisgICAgICAgIGRvdWJsZVR5cGVOYW1lID0gIk5VTUVSSUMoMzIsMjApIjsKKyAgICAgICAgZGF0ZVR5cGVOYW1lID0gIkRBVEUiOworICAgICAgICB0aW1lc3RhbXBUeXBlTmFtZSA9ICJEQVRFIjsKKyAgICAgICAgZG91YmxlVHlwZU5hbWUgPSAiTlVNRVJJQygzMiwyMCkiOworICAgICAgICBmbG9hdFR5cGVOYW1lID0gIlJFQUwiOworICAgICAgICBiaWdpbnRUeXBlTmFtZSA9ICJOVU1FUklDKDMyLDApIjsKKyAgICAgICAgZG91YmxlVHlwZU5hbWUgPSAiRE9VQkxFIFBSRUNJU0lPTiI7CisgICAgICAgIGZpeGVkU2l6ZVR5cGVOYW1lU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJCWVRFIiwgIkRPVUJMRSBQUkVDSVNJT04iLCAiSU5URVJWQUwiLCAiU01BTExGTE9BVCIsICJURVhUIiwKKyAgICAgICAgICAgICJJTlQ4IiwKKyAgICAgICAgfSkpOworCisgICAgICAgIHN1cHBvcnRzUXVlcnlUaW1lb3V0ID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzTXVsdGlwbGVOb250cmFuc2FjdGlvbmFsUmVzdWx0U2V0cyA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c0xvY2tpbmdXaXRoRGlzdGluY3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNMb2NraW5nV2l0aE11bHRpcGxlVGFibGVzID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhPcmRlckNsYXVzZSA9IGZhbHNlOworCisgICAgICAgIC8vIHRoZSBpbmZvcm1peCBKREJDIGRyaXZlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIHVzaW5nIHRoZQorICAgICAgICAvLyBzY2hlbWEgbmFtZSBpbiByZWZsZWN0aW9uIG9uIGNvbHVtbnMgYW5kIHRhYmxlcworICAgICAgICBzdXBwb3J0c1NjaGVtYUZvckdldENvbHVtbnMgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNTY2hlbWFGb3JHZXRUYWJsZXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0ZWRDb25maWd1cmF0aW9uKENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmNvbm5lY3RlZENvbmZpZ3VyYXRpb24oY29ubik7CisgICAgICAgIGlmIChkcml2ZXJWZW5kb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgRGF0YWJhc2VNZXRhRGF0YSBtZXRhID0gY29ubi5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgaWYgKCJJbmZvcm1peCIuZXF1YWxzSWdub3JlQ2FzZShtZXRhLmdldERyaXZlck5hbWUoKSkpCisgICAgICAgICAgICAgICAgZHJpdmVyVmVuZG9yID0gVkVORE9SX0RBVEFESVJFQ1Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHJpdmVyVmVuZG9yID0gVkVORE9SX09USEVSOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoRGF0YWJhc2VNZXRhRGF0YSBtZXRhLCBTdHJpbmcgY2F0YWxvZywKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2x1bW5OYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW5bXSBjb2xzID0gc3VwZXIuZ2V0Q29sdW1ucyhtZXRhLCBjYXRhbG9nLCBzY2hlbWFOYW1lLCB0YWJsZU5hbWUsCisgICAgICAgICAgICBjb2x1bW5OYW1lLCBjb25uKTsKKworICAgICAgICAvLyB0cmVhdCBsb2d2YXJjaGFyIGFzIGNsb2IKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNvbHMgIT0gbnVsbCAmJiBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmdldFR5cGUoKSA9PSBUeXBlcy5MT05HVkFSQ0hBUikKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuQ0xPQik7CisgICAgICAgIHJldHVybiBjb2xzOworICAgIH0KKworICAgIHB1YmxpYyBDb2x1bW4gbmV3Q29sdW1uKFJlc3VsdFNldCBjb2xNZXRhKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IHN1cGVyLm5ld0NvbHVtbihjb2xNZXRhKTsKKyAgICAgICAgaWYgKHN3YXBTY2hlbWFBbmRDYXRhbG9nKQorICAgICAgICAgICAgY29sLnNldFNjaGVtYU5hbWUoY29sTWV0YS5nZXRTdHJpbmcoIlRBQkxFX0NBVCIpKTsKKyAgICAgICAgcmV0dXJuIGNvbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5KFJlc3VsdFNldCBwa01ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBQcmltYXJ5S2V5IHBrID0gc3VwZXIubmV3UHJpbWFyeUtleShwa01ldGEpOworICAgICAgICBpZiAoc3dhcFNjaGVtYUFuZENhdGFsb2cpCisgICAgICAgICAgICBway5zZXRTY2hlbWFOYW1lKHBrTWV0YS5nZXRTdHJpbmcoIlRBQkxFX0NBVCIpKTsKKyAgICAgICAgcmV0dXJuIHBrOworICAgIH0KKworICAgIHB1YmxpYyBJbmRleCBuZXdJbmRleChSZXN1bHRTZXQgaWR4TWV0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIEluZGV4IGlkeCA9IHN1cGVyLm5ld0luZGV4KGlkeE1ldGEpOworICAgICAgICBpZiAoc3dhcFNjaGVtYUFuZENhdGFsb2cpCisgICAgICAgICAgICBpZHguc2V0U2NoZW1hTmFtZShpZHhNZXRhLmdldFN0cmluZygiVEFCTEVfQ0FUIikpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGJvb2xlYW4gdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaW5mb3JtaXggYWN0dWFsbHkgcmVxdWlyZXMgdGhhdCBhIGJvb2xlYW4gYmUgc2V0OiBpdCBjYW5ub3QKKyAgICAgICAgLy8gaGFuZGxlIGEgbnVtZXJpYyBhcmd1bWVudAorICAgICAgICBzdG1udC5zZXRCb29sZWFuKGlkeCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlVGFibGVTUUwoVGFibGUgdGFibGUpIHsKKyAgICAgICAgU3RyaW5nW10gY3JlYXRlID0gc3VwZXIuZ2V0Q3JlYXRlVGFibGVTUUwodGFibGUpOworICAgICAgICBjcmVhdGVbMF0gPSBjcmVhdGVbMF0gKyAiIExPQ0sgTU9ERSBST1ciOworICAgICAgICByZXR1cm4gY3JlYXRlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZGRQcmltYXJ5S2V5U1FMKFByaW1hcnlLZXkgcGspIHsKKyAgICAgICAgU3RyaW5nIHBrc3FsID0gZ2V0UHJpbWFyeUtleUNvbnN0cmFpbnRTUUwocGspOworICAgICAgICBpZiAocGtzcWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyAiQUxURVIgVEFCTEUgIgorICAgICAgICAgICAgKyBnZXRGdWxsTmFtZShway5nZXRUYWJsZSgpLCBmYWxzZSkgKyAiIEFERCBDT05TVFJBSU5UICIgKyBwa3NxbCB9OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZGRGb3JlaWduS2V5U1FMKEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgU3RyaW5nIGZrc3FsID0gZ2V0Rm9yZWlnbktleUNvbnN0cmFpbnRTUUwoZmspOworICAgICAgICBpZiAoZmtzcWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyAiQUxURVIgVEFCTEUgIgorICAgICAgICAgICAgKyBnZXRGdWxsTmFtZShmay5nZXRUYWJsZSgpLCBmYWxzZSkgKyAiIEFERCBDT05TVFJBSU5UICIgKyBma3NxbCB9OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzUmVzdWx0U2V0KFNlbGVjdCBzZWwsCisgICAgICAgIGJvb2xlYW4gZm9yVXBkYXRlKSB7CisgICAgICAgIHJldHVybiAhZm9yVXBkYXRlICYmICFzZWwuaXNMb2IoKQorICAgICAgICAgICAgJiYgc3VwZXIuc3VwcG9ydHNSYW5kb21BY2Nlc3NSZXN1bHRTZXQoc2VsLCBmb3JVcGRhdGUpOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGRlY29yYXRlKENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbm4gPSBzdXBlci5kZWNvcmF0ZShjb25uKTsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgaW5pdGlhbGl6ZSB0aGUgbG9jayBtb2RlIG9mIHRoZQorICAgICAgICAvLyBjb25uZWN0aW9uCisgICAgICAgIGlmIChsb2NrTW9kZUVuYWJsZWQgJiYgX3NlZW5Db25uZWN0aW9ucy5hZGQoY29ubikpIHsKKyAgICAgICAgICAgIFN0cmluZyBzcWwgPSAiU0VUIExPQ0sgTU9ERSBUTyBXQUlUIjsKKyAgICAgICAgICAgIGlmIChsb2NrV2FpdFNlY29uZHMgPiAwKQorICAgICAgICAgICAgICAgIHNxbCA9IHNxbCArICIgIiArIGxvY2tXYWl0U2Vjb25kczsKKworICAgICAgICAgICAgU3RhdGVtZW50IHN0bW50ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RtbnQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgICAgICAgICAgIHN0bW50LmV4ZWN1dGVVcGRhdGUoc3FsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIHRoaXMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RtbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgZGF0YWRpcmVjdCBkcml2ZXIgcmVxdWlyZXMgdGhhdCB3ZSBpc3N1ZSBhIHJvbGxiYWNrIGJlZm9yZSB1c2luZworICAgICAgICAvLyBlYWNoIGNvbm5lY3Rpb24KKyAgICAgICAgaWYgKFZFTkRPUl9EQVRBRElSRUNULmVxdWFsc0lnbm9yZUNhc2UoZHJpdmVyVmVuZG9yKSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29ubi5yb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25uOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0ludGVyYmFzZURpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0ludGVyYmFzZURpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjNiNTJlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSW50ZXJiYXNlRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHMuRmlsdGVyVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKKworLyoqCisgKiBEaWN0aW9uYXJ5IGZvciBCb3JsYW5kIEludGVyYmFzZS4KKyAqLworcHVibGljIGNsYXNzIEludGVyYmFzZURpY3Rpb25hcnkKKyAgICBleHRlbmRzIERCRGljdGlvbmFyeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChJbnRlcmJhc2VEaWN0aW9uYXJ5LmNsYXNzKTsKKworICAgIHB1YmxpYyBJbnRlcmJhc2VEaWN0aW9uYXJ5KCkgeworICAgICAgICBwbGF0Zm9ybSA9ICJCb3JsYW5kIEludGVyYmFzZSI7CisgICAgICAgIHZhbGlkYXRpb25TUUwgPSAiU0VMRUNUIDEgRlJPTSBSREIkREFUQUJBU0UiOworICAgICAgICBzdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHMgPSBmYWxzZTsKKworICAgICAgICB1c2VHZXRTdHJpbmdGb3JDbG9icyA9IHRydWU7CisgICAgICAgIHVzZVNldFN0cmluZ0ZvckNsb2JzID0gdHJ1ZTsKKyAgICAgICAgdXNlR2V0Qnl0ZXNGb3JCbG9icyA9IHRydWU7CisgICAgICAgIHVzZVNldEJ5dGVzRm9yQmxvYnMgPSB0cnVlOworCisgICAgICAgIC8vIHRoZSBKREJDIGRyaXZlciBjbGFpbXMgMzEsIGJ1dCB0aGF0IGNhdXNlcyBleGNlcHRpb25zCisgICAgICAgIG1heFRhYmxlTmFtZUxlbmd0aCA9IDMwOworCisgICAgICAgIGJpZ2ludFR5cGVOYW1lID0gIk5VTUVSSUMoMTgsMCkiOworICAgICAgICBpbnRlZ2VyVHlwZU5hbWUgPSAiSU5URUdFUiI7CisgICAgICAgIGRvdWJsZVR5cGVOYW1lID0gIkRPVUJMRSBQUkVDSVNJT04iOworICAgICAgICBjaGFyVHlwZU5hbWUgPSAiQ0hBUigxKSI7CisgICAgICAgIGJsb2JUeXBlTmFtZSA9ICJCTE9CIjsKKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIkJMT0IgU1VCX1RZUEUgMSI7CisgICAgICAgIGJpdFR5cGVOYW1lID0gIlNNQUxMSU5UIjsKKyAgICAgICAgc21hbGxpbnRUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisgICAgICAgIHRpbnlpbnRUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisKKyAgICAgICAgLy8gbm8gc3VwcG9ydCBmb3IgbG93ZXItY2FzaW5nIG9yIGZpbmRpbmcgdGhlIGxlbmd0aCBvZiBzdHJpbmdzCisgICAgICAgIC8vIChhbHRob3VnaCBpdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGRhdGFiYXNlOyBzZWUKKyAgICAgICAgLy8gaHR0cDovL2Jkbi5ib3JsYW5kLmNvbS9hcnRpY2xlLzAsMTQxMCwyNzU2MywwMC5odG1sICkKKyAgICAgICAgdG9Mb3dlckNhc2VGdW5jdGlvbiA9IG51bGw7CisgICAgICAgIHN0cmluZ0xlbmd0aEZ1bmN0aW9uID0gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlTmFtZUZvck1ldGFkYXRhKFN0cmluZyB0YWJsZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuICh0YWJsZU5hbWUgPT0gbnVsbCkgPyAiJSIKKyAgICAgICAgICAgIDogc3VwZXIuZ2V0VGFibGVOYW1lRm9yTWV0YWRhdGEodGFibGVOYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWVGb3JNZXRhZGF0YShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICByZXR1cm4gKGNvbHVtbk5hbWUgPT0gbnVsbCkgPyAiJSIKKyAgICAgICAgICAgIDogc3VwZXIuZ2V0Q29sdW1uTmFtZUZvck1ldGFkYXRhKGNvbHVtbk5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgYXBwZW5kU2l6ZShDb2x1bW4gY29sLCBTdHJpbmcgdHlwZU5hbWUpIHsKKyAgICAgICAgaWYgKGNvbC5pc1ByaW1hcnlLZXkoKSAmJiBjb2wuZ2V0VHlwZSgpID09IFR5cGVzLlZBUkNIQVIpIHsKKyAgICAgICAgICAgIC8vIHJlZHVjZSBzaXplIG9mIHZhcmNoYXIgcHJpbWFyeSBrZXkgY29scyBwcm9wb3J0aW9uYWwgdG8gdGhlCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgY29scywgYmVjYXVzZSBpbnRlcmJhc2UgY2FwcyB0aGUgdG90YWwgcGsgc2l6ZQorICAgICAgICAgICAgaW50IG51bUtleXMgPSAxOworICAgICAgICAgICAgaWYgKGNvbC5nZXRUYWJsZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb2wuZ2V0VGFibGUoKS5nZXRQcmltYXJ5S2V5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBudW1LZXlzID0gY29sLmdldFRhYmxlKCkuZ2V0UHJpbWFyeUtleSgpLmdldENvbHVtbnMoKS5sZW5ndGg7CisgICAgICAgICAgICBjb2wuc2V0U2l6ZShNYXRoLm1pbihjb2wuZ2V0U2l6ZSgpLCAyMDAgLyBudW1LZXlzKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29sLmdldFR5cGUoKSA9PSBUeXBlcy5WQVJDSEFSICYmIGNvbC5nZXRTaXplKCkgPiAyMDAKKyAgICAgICAgICAgICYmIGNvbC5nZXRUYWJsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGluZGV4ZWQgdmFyY2hhciBjb2xzIGhhdmUgdG8gYmUgPD0gMjUwIGNoYXJzCisgICAgICAgICAgICBJbmRleFtdIGlkeCA9IGNvbC5nZXRUYWJsZSgpLmdldEluZGV4ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWR4Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeFtpXS5jb250YWluc0NvbHVtbihjb2wpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRTaXplKE1hdGgubWluKGNvbC5nZXRTaXplKCksIDIwMCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmFwcGVuZFNpemUoY29sLCB0eXBlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5kZXhPZihTUUxCdWZmZXIgYnVmLCBGaWx0ZXJWYWx1ZSBzdHIsIEZpbHRlclZhbHVlIGZpbmQsCisgICAgICAgIEZpbHRlclZhbHVlIHN0YXJ0KSB7CisgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihfbG9jLmdldCgiaW5kZXhvZi1ub3Qtc3VwcG9ydGVkIiwgcGxhdGZvcm0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihfbG9jLmdldCgic3Vic3RyaW5nLW5vdC1zdXBwb3J0ZWQiLAorICAgICAgICAgICAgcGxhdGZvcm0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RHJvcENvbHVtblNRTChDb2x1bW4gY29sdW1uKSB7CisgICAgICAgIC8vIEludGVyYmFzZSB1c2VzICJBTFRFUiBUQUJMRSBEUk9QIDxDT0xVTU5fTkFNRT4iIHJhdGhlciB0aGFuIHRoZQorICAgICAgICAvLyB1c3VhbCAiQUxURVIgVEFCTEUgRFJPUCBDT0xVTU4gPENPTFVNTl9OQU1FPiIKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkFMVEVSIFRBQkxFICIKKyAgICAgICAgICAgICsgZ2V0RnVsbE5hbWUoY29sdW1uLmdldFRhYmxlKCksIGZhbHNlKSArICIgRFJPUCAiICsgY29sdW1uIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSkRhdGFTdG9yZURpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pEYXRhU3RvcmVEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ODkyMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pEYXRhU3RvcmVEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJlZmVyZW50aWFsSW50ZWdyaXR5RXhjZXB0aW9uOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIEJvcmxhbmQgSkRhdGFTdG9yZQorICovCitwdWJsaWMgY2xhc3MgSkRhdGFTdG9yZURpY3Rpb25hcnkKKyAgICBleHRlbmRzIERCRGljdGlvbmFyeSB7CisKKyAgICBwdWJsaWMgSkRhdGFTdG9yZURpY3Rpb25hcnkoKSB7CisgICAgICAgIHBsYXRmb3JtID0gIkJvcmxhbmQgSkRhdGFTdG9yZSI7CisgICAgICAgIGpvaW5TeW50YXggPSBTWU5UQVhfVFJBRElUSU9OQUw7CisKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgICAgIGFsbG93c0FsaWFzSW5CdWxrQ2xhdXNlID0gZmFsc2U7CisKKyAgICAgICAgbWF4VGFibGVOYW1lTGVuZ3RoID0gMzE7CisgICAgICAgIG1heENvbHVtbk5hbWVMZW5ndGggPSAzMTsKKyAgICAgICAgbWF4SW5kZXhOYW1lTGVuZ3RoID0gMzE7CisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gMzE7CisKKyAgICAgICAgdXNlR2V0U3RyaW5nRm9yQ2xvYnMgPSB0cnVlOworICAgICAgICB1c2VTZXRTdHJpbmdGb3JDbG9icyA9IHRydWU7CisgICAgICAgIHVzZUdldEJ5dGVzRm9yQmxvYnMgPSB0cnVlOworICAgICAgICBibG9iVHlwZU5hbWUgPSAiVkFSQklOQVJZIjsKKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIlZBUkNIQVIiOworCisgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhIEZPUiBVUERBVEUgY2xhdXNlIHdpdGggSkRhdGFTdG9yZSwKKyAgICAgICAgLy8gYnV0IHRoZSBhY3R1YWwgcm93IHdvbid0IHdpbmQgdXAgYmVpbmcgbG9ja2VkCisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhEaXN0aW5jdENsYXVzZSA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c1F1ZXJ5VGltZW91dCA9IGZhbHNlOworCisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGJ1aWxkLWluIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBsYXN0IGdlbmVyYXRlZAorICAgICAgICAvLyBrZXkgaW4gSkRhdGFTdG9yZTsgdXNpbmcgTUFYIHdpbGwgaGF2ZSB0byBzdWZmaWNlCisgICAgICAgIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IHRydWU7CisgICAgICAgIGxhc3RHZW5lcmF0ZWRLZXlRdWVyeSA9ICJTRUxFQ1QgTUFYKHswfSkgRlJPTSB7MX0iOworICAgICAgICBhdXRvQXNzaWduQ2xhdXNlID0gIkFVVE9JTkNSRU1FTlQiOworCisgICAgICAgIGZpeGVkU2l6ZVR5cGVOYW1lU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJTSE9SVCIsICJJTlQiLCAiTE9ORyIsICJET1VCTEUgUFJFQ0lTSU9OIiwgIkJPT0xFQU4iLAorICAgICAgICB9KSk7CisKKyAgICAgICAgc2VhcmNoU3RyaW5nRXNjYXBlID0gIiI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3Vic3RyaW5nKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgc3RhcnQsCisgICAgICAgIEZpbHRlclZhbHVlIGVuZCkgeworICAgICAgICBidWYuYXBwZW5kKCJTVUJTVFJJTkcoIik7CisgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgRlJPTSAoIik7CisgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiArIDEpIEZPUiAoIik7CisgICAgICAgIGlmIChlbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQ0hBUl9MRU5HVEgoIik7CisgICAgICAgICAgICBzdHIuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBlbmQuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIC0gKCIpOworICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIpKSkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmRleE9mKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgZmluZCwKKyAgICAgICAgRmlsdGVyVmFsdWUgc3RhcnQpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiKFBPU0lUSU9OKCIpOworICAgICAgICBmaW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBJTiAiKTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICBzdWJzdHJpbmcoYnVmLCBzdHIsIHN0YXJ0LCBudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIikgLSAxIik7CisgICAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uIG5ld1N0b3JlRXhjZXB0aW9uKFN0cmluZyBtc2csIFNRTEV4Y2VwdGlvbltdIGNhdXNlcywKKyAgICAgICAgT2JqZWN0IGZhaWxlZCkgeworICAgICAgICBPcGVuSlBBRXhjZXB0aW9uIGtlID0gc3VwZXIubmV3U3RvcmVFeGNlcHRpb24obXNnLCBjYXVzZXMsIGZhaWxlZCk7CisgICAgICAgIGlmIChrZSBpbnN0YW5jZW9mIFJlZmVyZW50aWFsSW50ZWdyaXR5RXhjZXB0aW9uCisgICAgICAgICAgICAmJiBjYXVzZXNbMF0uZ2V0TWVzc2FnZSgpLmluZGV4T2YoIkR1cGxpY2F0ZSBrZXkgdmFsdWUgZm9yIikgPiAtMSkgeworICAgICAgICAgICAgKChSZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbikga2UpLnNldEludGVncml0eVZpb2xhdGlvbgorICAgICAgICAgICAgICAgIChSZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbi5JVl9VTklRVUUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Kb2luLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Kb2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjZTVkOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pvaW4uamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIFNRTCBqb2luLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBKb2luCisgICAgaW1wbGVtZW50cyBDbG9uZWFibGUsIEpvaW5TeW50YXhlcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOTkVSID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX09VVEVSID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0NST1NTID0gMjsKKworICAgIHByaXZhdGUgaW50IF90eXBlID0gVFlQRV9JTk5FUjsKKworICAgIHByaXZhdGUgaW50IF9hbGlhczE7CisgICAgcHJpdmF0ZSBpbnQgX2FsaWFzMjsKKyAgICBwcml2YXRlIFRhYmxlIF90YWJsZTE7CisgICAgcHJpdmF0ZSBUYWJsZSBfdGFibGUyOworICAgIHByaXZhdGUgRm9yZWlnbktleSBfZms7CisgICAgcHJpdmF0ZSBDbGFzc01hcHBpbmcgX3RhcmdldDsKKyAgICBwcml2YXRlIGludCBfc3ViczsKKyAgICBwcml2YXRlIEpvaW5zIF9qb2luczsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ludmVyc2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgaW5uZXIgYW5kIG91dGVyIGpvaW5zLgorICAgICAqLworICAgIEpvaW4oVGFibGUgdGFibGUxLCBpbnQgYWxpYXMxLCBUYWJsZSB0YWJsZTIsIGludCBhbGlhczIsIEZvcmVpZ25LZXkgZmssCisgICAgICAgIGJvb2xlYW4gaW52ZXJzZSkgeworICAgICAgICBfdGFibGUxID0gdGFibGUxOworICAgICAgICBfYWxpYXMxID0gYWxpYXMxOworICAgICAgICBfdGFibGUyID0gdGFibGUyOworICAgICAgICBfYWxpYXMyID0gYWxpYXMyOworICAgICAgICBfZmsgPSBmazsKKyAgICAgICAgX2ludmVyc2UgPSBpbnZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpvaW4oKSB7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhczEoKSB7CisgICAgICAgIHJldHVybiBTZWxlY3RJbXBsLnRvQWxpYXMoX2FsaWFzMSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhczIoKSB7CisgICAgICAgIHJldHVybiBTZWxlY3RJbXBsLnRvQWxpYXMoX2FsaWFzMik7CisgICAgfQorCisgICAgaW50IGdldEluZGV4MSgpIHsKKyAgICAgICAgcmV0dXJuIF9hbGlhczE7CisgICAgfQorCisgICAgaW50IGdldEluZGV4MigpIHsKKyAgICAgICAgcmV0dXJuIF9hbGlhczI7CisgICAgfQorCisgICAgcHVibGljIFRhYmxlIGdldFRhYmxlMSgpIHsKKyAgICAgICAgcmV0dXJuIF90YWJsZTE7CisgICAgfQorCisgICAgcHVibGljIFRhYmxlIGdldFRhYmxlMigpIHsKKyAgICAgICAgcmV0dXJuIF90YWJsZTI7CisgICAgfQorCisgICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKKyAgICAgICAgcmV0dXJuIF9mazsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvcmVpZ25LZXlJbnZlcnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIGpvaW5pbmcgYSByZWxhdGlvbiwgdGhlIHRhcmdldCB0eXBlLiAgCisgICAgICovCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRSZWxhdGlvblRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIF90YXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgam9pbmluZyBhIHJlbGF0aW9uLCBob3cgdG8gZGVhbCB3aXRoIHN1YmNsYXNzZXMuICBTZWUgc3ViY2xhc3MKKyAgICAgKiBjb25zdGFudHMgaW4ge0BsaW5rIFNlbGVjdH0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdWJjbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gX3N1YnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgam9pbmluZyBhIHJlbGF0aW9uLCB0aGUgam9pbnMgbGVhZGluZyB0byB0aGUgcmVsYXRpb24uCisgICAgICovCisgICAgcHVibGljIEpvaW5zIGdldFJlbGF0aW9uSm9pbnMoKSB7CisgICAgICAgIHJldHVybiBfam9pbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBqb2luaW5nIGEgcmVsYXRpb24sIHNldCB0YXJnZXQgdHlwZSBhbmQgaG93IHRvIGRlYWwgd2l0aAorICAgICAqIHN1YmNsYXNzZXMuICBTZWUgc3ViY2xhc3MgY29uc3RhbnRzIGluIHtAbGluayAjU2VsZWN0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbihDbGFzc01hcHBpbmcgdGFyZ2V0LCBpbnQgc3VicywgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgX3RhcmdldCA9IHRhcmdldDsKKyAgICAgICAgX3N1YnMgPSBzdWJzOworICAgICAgICBfam9pbnMgPSBqb2luczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBqb2luIHRoYXQgaXMgdGhpcyBqb2luIGluIHJldmVyc2UuCisgICAgICovCisgICAgcHVibGljIEpvaW4gcmV2ZXJzZSgpIHsKKyAgICAgICAgSm9pbiBqb2luID0gbmV3IEpvaW4oKTsKKyAgICAgICAgam9pbi5fdHlwZSA9IF90eXBlOworICAgICAgICBqb2luLl90YWJsZTEgPSBfdGFibGUyOworICAgICAgICBqb2luLl9hbGlhczEgPSBfYWxpYXMyOworICAgICAgICBqb2luLl90YWJsZTIgPSBfdGFibGUxOworICAgICAgICBqb2luLl9hbGlhczIgPSBfYWxpYXMxOworICAgICAgICBqb2luLl9pbnZlcnNlID0gIV9pbnZlcnNlOworICAgICAgICBqb2luLl9mayA9IF9mazsKKyAgICAgICAgam9pbi5fdGFyZ2V0ID0gX3RhcmdldDsKKyAgICAgICAgam9pbi5fc3VicyA9IF9zdWJzOworICAgICAgICBqb2luLl9qb2lucyA9IF9qb2luczsKKyAgICAgICAgcmV0dXJuIGpvaW47CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9hbGlhczEgXiBfYWxpYXMyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBKb2luKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBKb2luIGogPSAoSm9pbikgb3RoZXI7CisgICAgICAgIHJldHVybiAoX2FsaWFzMSA9PSBqLl9hbGlhczEgJiYgX2FsaWFzMiA9PSBqLl9hbGlhczIpCisgICAgICAgICAgICB8fCAoX2FsaWFzMSA9PSBqLl9hbGlhczIgJiYgX2FsaWFzMiA9PSBqLl9hbGlhczEpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyB0eXBlU3RyaW5nOworICAgICAgICBpZiAoX3R5cGUgPT0gVFlQRV9DUk9TUykKKyAgICAgICAgICAgIHR5cGVTdHJpbmcgPSAiY3Jvc3MiOworICAgICAgICBlbHNlIGlmIChfdHlwZSA9PSBUWVBFX0lOTkVSKQorICAgICAgICAgICAgdHlwZVN0cmluZyA9ICJpbm5lciI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGVTdHJpbmcgPSAib3V0ZXIiOworICAgICAgICByZXR1cm4gIjwiICsgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykgKyAiPiB0IgorICAgICAgICAgICAgKyBfYWxpYXMxICsgIi0+dCIgKyBfYWxpYXMyICsgIiAoIiArIHR5cGVTdHJpbmcgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pvaW5TZXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pvaW5TZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTBjNDdmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSm9pblNldC5qYXZhCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKKworLyoqCisgKiBTZXQgdHlwZSB0aGF0IHJlY29nbml6ZXMgdGhhdCBpbm5lciBqb2lucyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlCisgKiBvdmVyIG90aGVyd2lzZSBlcXVhbCBvdXRlciBqb2lucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBKb2luU2V0IHsKKworICAgIC8vIHRoZSBqb2lucyBhcmUgc3RvcmVkIGFzIGFuIGFkamFjZW5jeSBsaXN0IGdyYXBoLiAgaXQncyBhIHJlYXNvbmFibHkKKyAgICAvLyBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24gd2l0aCBPKDEpIGxvb2t1cCwgYWRkLCByZW1vdmUgb3BlcmF0aW9ucyBmb3IKKyAgICAvLyB0eXBpY2FsIHNldHMgb2Ygam9pbnMsIGFuZCBpdCBtZWFucyB3ZSdkIGhhdmUgdG8gY3JlYXRlIGEgZ3JhcGggYW55d2F5CisgICAgLy8gd2hlbiBqb2luSXRlcmF0b3IoKSBpcyBjYWxsZWQKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX2dyYXBoID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgaW50IF9zaXplID0gMDsKKyAgICBwcml2YXRlIExpc3QgX3NvcnRlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgSm9pblNldCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pblNldChKb2luU2V0IGNvcHkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3B5Ll9ncmFwaC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvcHkuX2dyYXBoLmdldChpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9ncmFwaC5hZGQobnVsbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2dyYXBoLmFkZCgoKE5vZGUpIGNvcHkuX2dyYXBoLmdldChpKSkuY2xvbmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgX3NpemUgPSBjb3B5Ll9zaXplOworICAgICAgICBfc29ydGVkID0gY29weS5fc29ydGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVjb3JkZWQgam9pbiBtYXRjaGluZyB0aGUgZ2l2ZW4gam9pbidzIGFsaWFzZXMuCisgICAgICovCisgICAgcHVibGljIEpvaW4gZ2V0UmVjb3JkZWRKb2luKEpvaW4gam9pbikgeworICAgICAgICBpZiAoam9pbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoam9pbiwgam9pbi5nZXRJbmRleDEoKSk7CisgICAgICAgIHJldHVybiAobm9kZSA9PSBudWxsKSA/IG51bGwgOiBub2RlLmpvaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIGpvaW4gYW5kIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSBnZXROb2RlKEpvaW4gam9pbiwgaW50IGlkeCkgeworICAgICAgICBpZiAoX2dyYXBoLnNpemUoKSA8PSBpZHgpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIF9ncmFwaC5nZXQoaWR4KTsKKyAgICAgICAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dCkKKyAgICAgICAgICAgIGlmIChub2RlLmpvaW4uZXF1YWxzKGpvaW4pKQorICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZ2ljYWwgbGFzdCBqb2luLgorICAgICAqLworICAgIHB1YmxpYyBKb2luIGxhc3QoKSB7CisgICAgICAgIGlmIChfc2l6ZSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBfZ3JhcGguZ2V0KF9ncmFwaC5zaXplKCkgLSAxKTsKKyAgICAgICAgd2hpbGUgKG5vZGUubmV4dCAhPSBudWxsKQorICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDsKKyAgICAgICAgcmV0dXJuIG5vZGUuam9pbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBvdmVyIGpvaW5zIHRoYXQgcHJlcGFyZXMgdGhlbSBmb3IgU1FMIHRyYW5zbGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBqb2luSXRlcmF0b3IoKSB7CisgICAgICAgIGlmIChfc2l6ZSA8IDIpCisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IoKTsKKyAgICAgICAgaWYgKF9zb3J0ZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfc29ydGVkLml0ZXJhdG9yKCk7CisKKyAgICAgICAgTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KF9zaXplKTsKKyAgICAgICAgTGlua2VkTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIEJpdFNldCBzZWVuID0gbmV3IEJpdFNldChfZ3JhcGguc2l6ZSgpICogX2dyYXBoLnNpemUoKQorICAgICAgICAgICAgKyBfZ3JhcGguc2l6ZSgpKTsKKworICAgICAgICAvLyB0cmF2ZXJzZSBncmFwaAorICAgICAgICBOb2RlIG47CisgICAgICAgIGludCBpZHgsIHNpZHg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2dyYXBoLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAvLyBzZWVkIHF1ZXVlIHdpdGggbmV4dCBzZXQgb2YgZGlzY29ubmVjdGVkIGpvaW5zCisgICAgICAgICAgICBmb3IgKG4gPSAoTm9kZSkgX2dyYXBoLmdldChpKTsgbiAhPSBudWxsOyBuID0gbi5uZXh0KSB7CisgICAgICAgICAgICAgICAgc2lkeCA9IGdldFNlZW5JbmRleChuLmpvaW4pOworICAgICAgICAgICAgICAgIGlmICghc2Vlbi5nZXQoc2lkeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vlbi5zZXQoc2lkeCk7CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocXVldWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyB0cmF2ZXJzZSBmcm9tIHRob3NlIGpvaW5zIHRvIHJlYWNoYWJsZXMKKyAgICAgICAgICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbiA9IChOb2RlKSBxdWV1ZS5yZW1vdmVGaXJzdCgpOworCisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVwZWF0IGEgam9pbiB0byBhIHRhYmxlIHdlJ3ZlIGFscmVhZHkgam9pbmVkLCBidXQKKyAgICAgICAgICAgICAgICAvLyBkbyB0cmF2ZXJzZSB0aHJvdWdoIGl0IGluIHRoZSBncmFwaCAodGhlIGZpcnN0IGluZGV4ZXMgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2VlZW4gYml0c2V0IGFyZSByZXNlcnZlZCBmb3Igam9pbmVkLXRvIHRhYmxlcykKKyAgICAgICAgICAgICAgICBpZHggPSAobi5mb3J3YXJkKSA/IG4uam9pbi5nZXRJbmRleDIoKSA6IG4uam9pbi5nZXRJbmRleDEoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlZW4uZ2V0KGlkeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkLmFkZCgobi5mb3J3YXJkKSA/IG4uam9pbiA6IG4uam9pbi5yZXZlcnNlKCkpOworICAgICAgICAgICAgICAgICAgICBzZWVuLnNldChpZHgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAobiA9IChOb2RlKSBfZ3JhcGguZ2V0KGlkeCk7IG4gIT0gbnVsbDsgbiA9IG4ubmV4dCkgeworICAgICAgICAgICAgICAgICAgICBzaWR4ID0gZ2V0U2VlbkluZGV4KG4uam9pbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2Vlbi5nZXQoc2lkeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4uc2V0KHNpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKG4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9zb3J0ZWQgPSBzb3J0ZWQ7CisgICAgICAgIHJldHVybiBfc29ydGVkLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgY3JlYXRlIGEgdW5pcXVlIGluZGV4IGZvciByZWNvcmRpbmcgc2VlbiBub2RlcyBieQorICAgICAqIHRyZWF0aW5nIHRoZSBqb2luZWQgaW5kZXhlcyBhcyBhIGJhc2UgKG1heC1pbmRleCkgbnVtYmVyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldFNlZW5JbmRleChKb2luIGpvaW4pIHsKKyAgICAgICAgLy8gd2UgcmVzZXJ2ZSBpbmRleGVzIDAuLi5fZ3JhcGguc2l6ZSgpIGZvciBqb2luZWQgdGFibGVzCisgICAgICAgIHJldHVybiBqb2luLmdldEluZGV4MSgpICogX2dyYXBoLnNpemUoKSArIGpvaW4uZ2V0SW5kZXgyKCkKKyAgICAgICAgICAgICsgX2dyYXBoLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoSm9pbiBqb2luKSB7CisgICAgICAgIGlmIChqb2luLmdldFR5cGUoKSA9PSBKb2luLlRZUEVfT1VURVIpIHsKKyAgICAgICAgICAgIC8vIG91dGVyIHNob3VsZG4ndCBvdmVycmlkZSBhbnkgb3RoZXIgam9pbiB0eXBlCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGpvaW4pKSB7CisgICAgICAgICAgICAgICAgYWRkTm9kZShqb2luKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlcGxhY2UgYW55IGV4aXN0aW5nIGpvaW4gd2l0aCB0aGlzIG9uZQorICAgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKGpvaW4sIGpvaW4uZ2V0SW5kZXgxKCkpOworICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBub2RlLmpvaW4gPSBqb2luOworICAgICAgICAgICAgZ2V0Tm9kZShqb2luLCBqb2luLmdldEluZGV4MigpKS5qb2luID0gam9pbjsKKyAgICAgICAgICAgIF9zb3J0ZWQgPSBudWxsOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGFkZE5vZGUoam9pbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChKb2luU2V0IGpzKSB7CisgICAgICAgIGlmIChqcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiBhZGRlZCA9IGZhbHNlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgYWRkZWQgPSBhZGQoKEpvaW4pIGl0ci5uZXh0KCkpIHx8IGFkZGVkOworICAgICAgICByZXR1cm4gYWRkZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlIGpvaW4gdG8gb3VyIGdyYXBoLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlKEpvaW4gam9pbikgeworICAgICAgICBfc29ydGVkID0gbnVsbDsKKworICAgICAgICBpbnQgc2l6ZSA9IE1hdGgubWF4KGpvaW4uZ2V0SW5kZXgxKCksIGpvaW4uZ2V0SW5kZXgyKCkpICsgMTsKKyAgICAgICAgd2hpbGUgKF9ncmFwaC5zaXplKCkgPCBzaXplKQorICAgICAgICAgICAgX2dyYXBoLmFkZChudWxsKTsKKworICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgX2dyYXBoLmdldChqb2luLmdldEluZGV4MSgpKTsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIF9ncmFwaC5zZXQoam9pbi5nZXRJbmRleDEoKSwgbmV3IE5vZGUoam9pbiwgdHJ1ZSkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlIChub2RlLm5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IE5vZGUoam9pbiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBub2RlID0gKE5vZGUpIF9ncmFwaC5nZXQoam9pbi5nZXRJbmRleDIoKSk7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICBfZ3JhcGguc2V0KGpvaW4uZ2V0SW5kZXgyKCksIG5ldyBOb2RlKGpvaW4sIGZhbHNlKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKG5vZGUubmV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7CisgICAgICAgICAgICBub2RlLm5leHQgPSBuZXcgTm9kZShqb2luLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgX3NpemUrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7CisgICAgICAgICAgICBwcml2YXRlIE5vZGUgX25leHQgPSBudWxsOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgX2lkeCA9IC0xOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChfbmV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgrK19pZHggPCBfZ3JhcGguc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIF9uZXh0ID0gKE5vZGUpIF9ncmFwaC5nZXQoX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfbmV4dCAhPSBudWxsICYmICFfbmV4dC5mb3J3YXJkKQorICAgICAgICAgICAgICAgICAgICAgICAgX25leHQgPSBfbmV4dC5uZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAoX25leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBKb2luIGogPSBfbmV4dC5qb2luOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgX25leHQgPSBfbmV4dC5uZXh0OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKF9uZXh0ICE9IG51bGwgJiYgIV9uZXh0LmZvcndhcmQpOworICAgICAgICAgICAgICAgIHJldHVybiBqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKEpvaW4gam9pbikgeworICAgICAgICBpZiAoam9pbiA9PSBudWxsIHx8IF9ncmFwaC5zaXplKCkgPD0gam9pbi5nZXRJbmRleDEoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHJlbW92ZShqb2luLCBqb2luLmdldEluZGV4MSgpKSkgeworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmUoam9pbiwgam9pbi5nZXRJbmRleDIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVhY2ggam9pbiBpcyByZWNvcmRlZCBvbmUgYXQgaXRzIGZpcnN0IGluZGV4IGFuZCBvbmNlIGF0IGl0cyBzZWNvbmQ7CisgICAgICogcmVtb3ZlIHRoZSBqb2luIGF0IG9uZSBvZiBpdHMgaW5kZXhlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlKEpvaW4gam9pbiwgaW50IGlkeCkgeworICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgX2dyYXBoLmdldChpZHgpOworICAgICAgICBmb3IgKE5vZGUgcHJldiA9IG51bGw7IG5vZGUgIT0gbnVsbDsgcHJldiA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQpIHsKKyAgICAgICAgICAgIGlmICghbm9kZS5qb2luLmVxdWFscyhqb2luKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfZ3JhcGguc2V0KGlkeCwgbm9kZS5uZXh0KTsKKyAgICAgICAgICAgICAgICAvLyB0cmltIHRvIHNpemUKKyAgICAgICAgICAgICAgICB3aGlsZSAoIV9ncmFwaC5pc0VtcHR5KCkgJiYgX2dyYXBoLmdldChpZHgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgaWR4ID09IF9ncmFwaC5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBfZ3JhcGgucmVtb3ZlKGlkeC0tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoSm9pblNldCBqcykgeworICAgICAgICBib29sZWFuIHJlbWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHJlbWQgPSByZW1vdmUoKEpvaW4pIGl0ci5uZXh0KCkpIHx8IHJlbWQ7CisgICAgICAgIHJldHVybiByZW1kOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChKb2luU2V0IGpzKSB7CisgICAgICAgIGJvb2xlYW4gcmVtZCA9IGZhbHNlOworICAgICAgICBKb2luIGpvaW47CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGpvaW4gPSAoSm9pbikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghanMuY29udGFpbnMoam9pbikpCisgICAgICAgICAgICAgICAgcmVtZCA9IHJlbW92ZShqb2luKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX2dyYXBoLmNsZWFyKCk7CisgICAgICAgIF9zb3J0ZWQgPSBudWxsOworICAgICAgICBfc2l6ZSA9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoSm9pbiBqb2luKSB7CisgICAgICAgIHJldHVybiBnZXRSZWNvcmRlZEpvaW4oam9pbikgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChKb2luU2V0IGpzKSB7CisgICAgICAgIGlmIChqcy5fc2l6ZSA+IF9zaXplIHx8IGpzLl9ncmFwaC5zaXplKCkgPiBfZ3JhcGguc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgaWYgKCFjb250YWlucygoSm9pbikgaXRyLm5leHQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gX3NpemUgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgSm9pblNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfZ3JhcGguZXF1YWxzKCgoSm9pblNldCkgb3RoZXIpLl9ncmFwaCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9ncmFwaC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlsiKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBpdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPCIpLmFwcGVuZChpdHIubmV4dCgpKS5hcHBlbmQoIj4iKTsKKyAgICAgICAgICAgIGlmIChpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi5hcHBlbmQoIl0iKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZ3JhcGggbm9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlCisgICAgICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgICAgICBwdWJsaWMgSm9pbiBqb2luOworICAgICAgICBwdWJsaWMgTm9kZSBuZXh0OworICAgICAgICBwdWJsaWMgYm9vbGVhbiBmb3J3YXJkOworCisgICAgICAgIHB1YmxpYyBOb2RlKEpvaW4gam9pbiwgYm9vbGVhbiBmb3J3YXJkKSB7CisgICAgICAgICAgICB0aGlzLmpvaW4gPSBqb2luOworICAgICAgICAgICAgdGhpcy5mb3J3YXJkID0gZm9yd2FyZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcnMgPSAxNzsKKyAgICAgICAgICAgIHJzID0gMzcgKiBycyArIGpvaW4uaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcnMgPSAzNyAqIHJzICsgbmV4dC5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmV0dXJuIHJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBOb2RlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuZXF1YWxzKGpvaW4sIG5vZGUuam9pbikKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RVdGlscy5lcXVhbHMobmV4dCwgbm9kZS5uZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgICAgIGlmIChub2RlLm5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gKE5vZGUpIG5vZGUubmV4dC5jbG9uZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY25zZSkgeworICAgICAgICAgICAgICAgIC8vIGNhbid0IGhhcHBlbgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBqb2luICsgIigiICsgKChmb3J3YXJkKSA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpICsgIikiCisgICAgICAgICAgICAgICAgKyAiOyBuZXh0OiAiICsgbmV4dDsKKyAgICAgICAgfQorICAgIH0KK30JCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Kb2luU3ludGF4ZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pvaW5TeW50YXhlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Kb2luU3ludGF4ZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIHdheXMgb2YgZGVzY3JpYmluZyBqb2lucyBpbiBTUUwuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBKb2luU3ludGF4ZXMgeworCisgICAgLyoqCisgICAgICogQU5TSSBTUUwgOTIgam9pbiBzeW50YXg7IG91dGVyIGpvaW5zIGFyZSBzdXBwb3J0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEFYX1NRTDkyID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYWRpdGlvbmFsIGpvaW4gc3ludGF4OyBvdXRlciBqb2lucyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5UQVhfVFJBRElUSU9OQUwgPSAxOworCisgICAgLyoqCisgICAgICogTmF0aXZlIGRhdGFiYXNlIGpvaW4gc3ludGF4OyBvdXRlciBqb2lucyBhcmUgc3VwcG9ydGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTlRBWF9EQVRBQkFTRSA9IDI7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Kb2lucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSm9pbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVlNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSm9pbnMuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKKworLyoqCisgKiBUcmFja3Mgam9pbnMgbWFkZSB3aGVuIHRyYXZlcnNpbmcgcmVsYXRpb25zIGluIGEgc2VsZWN0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9pbnMgeworCisgICAgLyoqCisgICAgICogV2hldGhlciB3ZSBoYXZlIGFueSBqb2lucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgam9pbnMgcGF0aCByZXN1bHRzIGluIG91dGVyIGpvaW5zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT3V0ZXIoKTsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYSBjcm9zcyBqb2luIG9uIHRoZSBnaXZlbiB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIEpvaW5zIGNyb3NzSm9pbihUYWJsZSBsb2NhbFRhYmxlLCBUYWJsZSBmb3JlaWduVGFibGUpOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGUgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkuCisgICAgICovCisgICAgcHVibGljIEpvaW5zIGpvaW4oRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSk7CisKKyAgICAvKioKKyAgICAgKiBKb2luIHRoZSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBmb3JlaWduIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgb3V0ZXJKb2luKEZvcmVpZ25LZXkgZmssIGJvb2xlYW4gaW52ZXJzZSwgYm9vbGVhbiB0b01hbnkpOworCisgICAgLyoqCisgICAgICogSm9pbiB0aGUgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXksIHdoaWNoIHJlcHJlc2VudHMgYSByZWxhdGlvbgorICAgICAqIHZpYSB0aGUgZ2l2ZW4gZmllbGQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgam9pblJlbGF0aW9uKFN0cmluZyBuYW1lLCBGb3JlaWduS2V5IGZrLCBDbGFzc01hcHBpbmcgdGFyZ2V0LAorICAgICAgICBpbnQgc3ViY2xhc3NlcywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSk7CisKKyAgICAvKioKKyAgICAgKiBKb2luIHRoZSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBmb3JlaWduIGtleSwgd2hpY2ggcmVwcmVzZW50cyBhIHJlbGF0aW9uCisgICAgICogdmlhIHRoZSBnaXZlbiBmaWVsZCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW5SZWxhdGlvbihTdHJpbmcgbmFtZSwgRm9yZWlnbktleSBmaywgCisgICAgICAgIENsYXNzTWFwcGluZyB0YXJnZXQsIGludCBzdWJjbGFzc2VzLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFyaWFibGUgbmFtZSBiZWluZyB0cmF2ZXJzZWQgaW50byB3aXRoIHRoZSBuZXh0IGpvaW4uCisgICAgICovCisgICAgcHVibGljIEpvaW5zIHNldFZhcmlhYmxlKFN0cmluZyB2YXIpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJxdWVyeSBhbGlhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgc2V0U3Vic2VsZWN0KFN0cmluZyBhbGlhcyk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Mb2dpY2FsVW5pb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0xvZ2ljYWxVbmlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjRjZTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Mb2dpY2FsVW5pb24uamF2YQpAQCAtMCwwICsxLDkzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogQSBsb2dpY2FsIHVuaW9uIG1hZGUgdXAgb2YgbXVsdGlwbGUgZGlzdGluY3Qgc2VsZWN0cyB3aG9zZSByZXN1bHRzIGFyZQorICogY29tYmluZWQgaW4gbWVtb3J5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dpY2FsVW5pb24KKyAgICBpbXBsZW1lbnRzIFVuaW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKExvZ2ljYWxVbmlvbi5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgVW5pb25TZWxlY3RbXSBzZWxzOworICAgIHByb3RlY3RlZCBmaW5hbCBEQkRpY3Rpb25hcnkgZGljdDsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3NNYXBwaW5nW10gbWFwcGluZ3M7CisgICAgcHJvdGVjdGVkIGZpbmFsIEJpdFNldCBkZXNjID0gbmV3IEJpdFNldCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBfZGlzdGluY3QgPSB0cnVlOworICAgCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25mIHN5c3RlbSBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIHNlbHMgdGhlIG51bWJlciBvZiBTUUwgc2VsZWN0cyB0byB1bmlvbiB0b2dldGhlcgorICAgICAqLworICAgIHB1YmxpYyBMb2dpY2FsVW5pb24oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgaW50IHNlbHMpIHsKKyAgICAgICAgdGhpcyhjb25mLCBzZWxzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIHNlZWQgdGhlIGludGVybmFsIHNlbGVjdHMuCisgICAgICovCisgICAgcHVibGljIExvZ2ljYWxVbmlvbihKREJDQ29uZmlndXJhdGlvbiBjb25mLCBTZWxlY3RbXSBzZWVkcykgeworICAgICAgICB0aGlzKGNvbmYsIHNlZWRzLmxlbmd0aCwgc2VlZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2dpY2FsVW5pb24oSkRCQ0NvbmZpZ3VyYXRpb24gY29uZiwgaW50IHNlbHMsIFNlbGVjdFtdIHNlZWRzKSB7CisgICAgICAgIGlmIChzZWxzID09IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oInNlbHMgPT0gMCIpOworCisgICAgICAgIGRpY3QgPSBjb25mLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIG1hcHBpbmdzID0gbmV3IENsYXNzTWFwcGluZ1tzZWxzXTsKKyAgICAgICAgdGhpcy5zZWxzID0gbmV3IFVuaW9uU2VsZWN0W3NlbHNdOworCisgICAgICAgIFNlbGVjdEltcGwgc2VlZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxzOyBpKyspIHsKKyAgICAgICAgICAgIHNlZWQgPSAoc2VlZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IChTZWxlY3RJbXBsKSBjb25mLmdldFNRTEZhY3RvcnlJbnN0YW5jZSgpLm5ld1NlbGVjdCgpCisgICAgICAgICAgICAgICAgOiAoU2VsZWN0SW1wbCkgc2VlZHNbaV07CisgICAgICAgICAgICB0aGlzLnNlbHNbaV0gPSBuZXdVbmlvblNlbGVjdChzZWVkLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB1bmlvbiBzZWxlY3Qgd2l0aCB0aGUgZ2l2ZW4gZGVsZWdhdGUgYW5kIHVuaW9uIHBvc2l0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBVbmlvblNlbGVjdCBuZXdVbmlvblNlbGVjdChTZWxlY3RJbXBsIHNlZWQsIGludCBwb3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVbmlvblNlbGVjdChzZWVkLCBwb3MpOworICAgIH0KKworICAgIHB1YmxpYyBTZWxlY3RbXSBnZXRTZWxlY3RzKCkgeworICAgICAgICByZXR1cm4gc2VsczsKKyAgICB9CisgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWJvcnRVbmlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9yZGVyaW5nKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNlbHNbMF0uZ2V0Q29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBEQkRpY3Rpb25hcnkgZ2V0REJEaWN0aW9uYXJ5KCkgeworICAgICAgICByZXR1cm4gZGljdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMQnVmZmVyIHRvU2VsZWN0KGJvb2xlYW4gZm9yVXBkYXRlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHJldHVybiBkaWN0LnRvU2VsZWN0KHNlbHNbMF0sIGZvclVwZGF0ZSwgZmV0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3RDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGRpY3QudG9TZWxlY3RDb3VudChzZWxzWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvRGlzdGluY3QoKSB7CisgICAgICAgIHJldHVybiBzZWxzWzBdLmdldEF1dG9EaXN0aW5jdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EaXN0aW5jdChib29sZWFuIGRpc3RpbmN0KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNlbHNbaV0uc2V0QXV0b0Rpc3RpbmN0KGRpc3RpbmN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc3RpbmN0KCkgeworICAgICAgICByZXR1cm4gX2Rpc3RpbmN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RpbmN0KGJvb2xlYW4gZGlzdGluY3QpIHsKKyAgICAgICAgX2Rpc3RpbmN0ID0gZGlzdGluY3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMUlMoKSB7CisgICAgICAgIHJldHVybiBzZWxzWzBdLmlzTFJTKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TFJTKGJvb2xlYW4gbHJzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNlbHNbaV0uc2V0TFJTKGxycyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRFeHBlY3RlZFJlc3VsdENvdW50KCkgeworICAgICAgICByZXR1cm4gc2Vsc1swXS5nZXRFeHBlY3RlZFJlc3VsdENvdW50KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkUmVzdWx0Q291bnQoaW50IGV4cGVjdGVkUmVzdWx0Q291bnQsCisgICAgICAgIGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc2Vsc1tpXS5zZXRFeHBlY3RlZFJlc3VsdENvdW50KGV4cGVjdGVkUmVzdWx0Q291bnQsIGZvcmNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEpvaW5TeW50YXgoKSB7CisgICAgICAgIHJldHVybiBzZWxzWzBdLmdldEpvaW5TeW50YXgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2luU3ludGF4KGludCBzeW50YXgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc2Vsc1tpXS5zZXRKb2luU3ludGF4KHN5bnRheCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoYm9vbGVhbiBmb3JVcGRhdGUpIHsKKyAgICAgICAgaWYgKHNlbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICByZXR1cm4gc2Vsc1swXS5zdXBwb3J0c1JhbmRvbUFjY2Vzcyhmb3JVcGRhdGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMb2NraW5nKCkgeworICAgICAgICBpZiAoc2Vscy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBzZWxzWzBdLnN1cHBvcnRzTG9ja2luZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIXNlbHNbaV0uc3VwcG9ydHNMb2NraW5nKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvdW50KEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvdW50ICs9IHNlbHNbaV0uZ2V0Q291bnQoc3RvcmUpOworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdCBleGVjdXRlKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmZXRjaCA9PSBudWxsKQorICAgICAgICAgICAgZmV0Y2ggPSBzdG9yZS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGUoc3RvcmUsIGZldGNoLCBmZXRjaC5nZXRSZWFkTG9ja0xldmVsKCkpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHQgZXhlY3V0ZShKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGludCBsb2NrTGV2ZWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIGZldGNoID0gc3RvcmUuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKHNlbHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIFJlc3VsdCByZXMgPSBzZWxzWzBdLmV4ZWN1dGUoc3RvcmUsIGZldGNoLCBsb2NrTGV2ZWwpOworICAgICAgICAgICAgKChBYnN0cmFjdFJlc3VsdCkgcmVzKS5zZXRCYXNlTWFwcGluZyhtYXBwaW5nc1swXSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldEV4cGVjdGVkUmVzdWx0Q291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICBBYnN0cmFjdFJlc3VsdCByZXM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXMgPSAoQWJzdHJhY3RSZXN1bHQpIHNlbHNbaV0uZXhlY3V0ZShzdG9yZSwgZmV0Y2gsCisgICAgICAgICAgICAgICAgICAgIGxvY2tMZXZlbCk7CisgICAgICAgICAgICAgICAgcmVzLnNldEJhc2VNYXBwaW5nKG1hcHBpbmdzW2ldKTsKKyAgICAgICAgICAgICAgICByZXMuc2V0SW5kZXhPZihpKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGdldCB0byB0aGUgbGFzdCBzZWxlY3QsIGp1c3QgcmV0dXJuIGl0cyByZXN1bHQKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBzZWxzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHJlc3VsdCB0aGF0IGhhcyBhIHJvdworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoQmFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBzaW5nbGUgcmVzdWx0IGZyb20gZWFjaCBzZWxlY3QgaW4gb3VyIGZha2UgdW5pb24sIG1lcmdpbmcKKyAgICAgICAgLy8gdGhlbSBhcyBuZWVkZWQKKyAgICAgICAgQWJzdHJhY3RSZXN1bHRbXSByZXMgPSBuZXcgQWJzdHJhY3RSZXN1bHRbc2Vscy5sZW5ndGhdOworICAgICAgICBMaXN0W10gb3JkZXJJZHhzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3QgbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzW2ldID0gKEFic3RyYWN0UmVzdWx0KSBzZWxzW2ldLmV4ZWN1dGUoc3RvcmUsIGZldGNoLAorICAgICAgICAgICAgICAgICAgICBsb2NrTGV2ZWwpOworICAgICAgICAgICAgICAgIHJlc1tpXS5zZXRCYXNlTWFwcGluZyhtYXBwaW5nc1tpXSk7CisgICAgICAgICAgICAgICAgcmVzW2ldLnNldEluZGV4T2YoaSk7CisKKyAgICAgICAgICAgICAgICBsID0gc2Vsc1tpXS5nZXRTZWxlY3RlZE9yZGVySW5kZXhlcygpOworICAgICAgICAgICAgICAgIGlmIChsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9yZGVySWR4cyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJJZHhzID0gbmV3IExpc3Rbc2Vscy5sZW5ndGhdOworICAgICAgICAgICAgICAgICAgICBvcmRlcklkeHNbaV0gPSBsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgcmVzW2ldICE9IG51bGw7IGkrKykKKyAgICAgICAgICAgICAgICByZXNbaV0uY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbXVsdGlwbGUgc2VsZWN0cyBoYXZlIG9yZGVyaW5nLCB1c2UgYSBjb21wYXJhdG9yIHRvIGNvbGxhdGUKKyAgICAgICAgUmVzdWx0Q29tcGFyYXRvciBjb21wID0gbnVsbDsKKyAgICAgICAgaWYgKG9yZGVySWR4cyAhPSBudWxsKQorICAgICAgICAgICAgY29tcCA9IG5ldyBSZXN1bHRDb21wYXJhdG9yKG9yZGVySWR4cywgZGVzYywgZGljdCk7CisgICAgICAgIHJldHVybiBuZXcgTWVyZ2VkUmVzdWx0KHJlcywgY29tcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFVuaW9uLlNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdChzZWxzW2ldLCBpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdG9TZWxlY3QoZmFsc2UsIG51bGwpLmdldFNRTCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdXNlZCB0byBjcmVhdGUgdGhlIHNlbGVjdHMgaW4gYSBTUUwgdW5pb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU2VsZWN0b3IgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQb3B1bGF0ZSB0aGUgPGNvZGU+aTwvY29kZT50aCBzZWxlY3QgaW4gdGhlIHVuaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNlbGVjdCB0aGF0IGlzIHBhcnQgb2YgYSBsb2dpY2FsIHVuaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBVbmlvblNlbGVjdAorICAgICAgICBpbXBsZW1lbnRzIFNlbGVjdCB7CisKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdEltcGwgc2VsOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHBvczsKKyAgICAgICAgcHJvdGVjdGVkIGludCBvcmRlcnMgPSAwOworICAgICAgICBwcm90ZWN0ZWQgTGlzdCBvcmRlcklkeHMgPSBudWxsOworICAgICAgIAorICAgICAgICBwdWJsaWMgVW5pb25TZWxlY3QoU2VsZWN0SW1wbCBzZWwsIGludCBwb3MpIHsKKyAgICAgICAgICAgIHRoaXMuc2VsID0gc2VsOworICAgICAgICAgICAgdGhpcy5wb3MgPSBwb3M7CisgICAgICAgICAgICBzZWwuc2V0UmVjb3JkT3JkZXJlZEluZGV4ZXModHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVsZWdhdGUgc2VsZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNlbGVjdEltcGwgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgaW5kZXhlcyBvZiB0aGUgZGF0YSBpbiB0aGUgc2VsZWN0IGNsYXVzZSB0aGlzIHF1ZXJ5IGlzCisgICAgICAgICAqIG9yZGVyZWQgYnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE9yZGVySW5kZXhlcygpIHsKKyAgICAgICAgICAgIGlmIChvcmRlcklkeHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBvcmRlcklkeHMgPSBzZWwuZ2V0T3JkZXJlZEluZGV4ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBvcmRlcklkeHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSkRCQ0NvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmRleE9mKCkgeworICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3QoYm9vbGVhbiBmb3JVcGRhdGUsCisgICAgICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLnRvU2VsZWN0KGZvclVwZGF0ZSwgZmV0Y2gpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNRTEJ1ZmZlciB0b1NlbGVjdENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC50b1NlbGVjdENvdW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvRGlzdGluY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldEF1dG9EaXN0aW5jdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXV0b0Rpc3RpbmN0KGJvb2xlYW4gZGlzdGluY3QpIHsKKyAgICAgICAgICAgIHNlbC5zZXRBdXRvRGlzdGluY3QoZGlzdGluY3QpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXN0aW5jdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuaXNEaXN0aW5jdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGlzdGluY3QoYm9vbGVhbiBkaXN0aW5jdCkgeworICAgICAgICAgICAgc2VsLnNldERpc3RpbmN0KGRpc3RpbmN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTFJTKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5pc0xSUygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TFJTKGJvb2xlYW4gbHJzKSB7CisgICAgICAgICAgICBzZWwuc2V0TFJTKGxycyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEpvaW5TeW50YXgoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldEpvaW5TeW50YXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEpvaW5TeW50YXgoaW50IGpvaW5TeW50YXgpIHsKKyAgICAgICAgICAgIHNlbC5zZXRKb2luU3ludGF4KGpvaW5TeW50YXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoYm9vbGVhbiBmb3JVcGRhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc3VwcG9ydHNSYW5kb21BY2Nlc3MoZm9yVXBkYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTG9ja2luZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc3VwcG9ydHNMb2NraW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRDb3VudChzdG9yZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzdWx0IGV4ZWN1dGUoSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmV4ZWN1dGUoc3RvcmUsIGZldGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXN1bHQgZXhlY3V0ZShKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgICAgICBpbnQgbG9ja0xldmVsKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmV4ZWN1dGUoc3RvcmUsIGZldGNoLCBsb2NrTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3QgZ2V0U3Vic2VsZWN0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlbGVjdCBnZXRQYXJlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic2VsZWN0UGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFNlbGVjdCBwYXJlbnQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoInVuaW9uLWVsZW1lbnQiKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2VsZWN0IGdldEZyb21TZWxlY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyb21TZWxlY3QoU2VsZWN0IHNlbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bmlvbi1lbGVtZW50IikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRWFnZXJKb2luKGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmhhc0VhZ2VySm9pbih0b01hbnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzSm9pbihib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5oYXNKb2luKHRvTWFueSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFRhYmxlIHRhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmlzU2VsZWN0ZWQodGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VGFibGVBbGlhc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRUYWJsZUFsaWFzZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0IGdldFNlbGVjdEFsaWFzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldFNlbGVjdEFsaWFzZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0IGdldElkZW50aWZpZXJBbGlhc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRJZGVudGlmaWVyQWxpYXNlcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNRTEJ1ZmZlciBnZXRPcmRlcmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuZ2V0T3JkZXJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0R3JvdXBpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldEdyb3VwaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU1FMQnVmZmVyIGdldFdoZXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRXaGVyZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNRTEJ1ZmZlciBnZXRIYXZpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldEhhdmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkSm9pbkNsYXNzQ29uZGl0aW9ucygpIHsKKyAgICAgICAgICAgIHNlbC5hZGRKb2luQ2xhc3NDb25kaXRpb25zKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgZ2V0Sm9pbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldEpvaW5zKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Sm9pbkl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRKb2luSXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0SW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmdldFN0YXJ0SW5kZXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldEVuZEluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRFbmRJbmRleCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmFuZ2UobG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgICAgIHNlbC5zZXRSYW5nZShzdGFydCwgZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoQ29sdW1uIGNvbCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRDb2x1bW5BbGlhcyhjb2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhDb2x1bW4gY29sLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRDb2x1bW5BbGlhcyhjb2wsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoU3RyaW5nIGNvbCwgVGFibGUgdGFibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuZ2V0Q29sdW1uQWxpYXMoY29sLCB0YWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKFN0cmluZyBjb2wsIFRhYmxlIHRhYmxlLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5nZXRDb2x1bW5BbGlhcyhjb2wsIHRhYmxlLCBqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuaXNBZ2dyZWdhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFnZ3JlZ2F0ZShib29sZWFuIGFnZykgeworICAgICAgICAgICAgc2VsLnNldEFnZ3JlZ2F0ZShhZ2cpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLmlzTG9iKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBsb2IpIHsKKyAgICAgICAgICAgIHNlbC5zZXRMb2IobG9iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBsYWNlaG9sZGVyKFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIHNlbC5zZWxlY3RQbGFjZWhvbGRlcihzcWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXJTZWxlY3RzKCkgeworICAgICAgICAgICAgc2VsLmNsZWFyU2VsZWN0cygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNRTEJ1ZmZlciBzcWwsIE9iamVjdCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5zZWxlY3Qoc3FsLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoU1FMQnVmZmVyIHNxbCwgT2JqZWN0IGlkLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5zZWxlY3Qoc3FsLCBpZCwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFN0cmluZyBzcWwsIE9iamVjdCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5zZWxlY3Qoc3FsLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoU3RyaW5nIHNxbCwgT2JqZWN0IGlkLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5zZWxlY3Qoc3FsLCBpZCwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KENvbHVtbiBjb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc2VsZWN0KGNvbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc2VsZWN0KGNvbCwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzZWxlY3QoQ29sdW1uW10gY29scykgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5zZWxlY3QoY29scyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNlbGVjdChDb2x1bW5bXSBjb2xzLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5zZWxlY3QoY29scywgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KENsYXNzTWFwcGluZyBtYXBwaW5nLCBpbnQgc3ViY2xhc3NlcywKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyKSB7CisgICAgICAgICAgICBzZWxlY3QobWFwcGluZywgc3ViY2xhc3Nlcywgc3RvcmUsIGZldGNoLCBlYWdlciwgbnVsbCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KENsYXNzTWFwcGluZyBtYXBwaW5nLCBpbnQgc3ViY2xhc3NlcywKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyLAorICAgICAgICAgICAgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbGVjdChtYXBwaW5nLCBzdWJjbGFzc2VzLCBzdG9yZSwgZmV0Y2gsIGVhZ2VyLCBqb2lucywgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdChDbGFzc01hcHBpbmcgbWFwcGluZywgaW50IHN1YmNsYXNzZXMsCisgICAgICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlciwKKyAgICAgICAgICAgIEpvaW5zIGpvaW5zLCBib29sZWFuIGlkZW50aWZpZXIpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IChwcmltYXJ5KSBtYXBwaW5nIHNlbGVjdGVkIGZvciB0aGlzCisgICAgICAgICAgICAvLyBTRUxFQ1QsIHJlY29yZCBpdCBzbyB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IHRoZSByZXN1bHQgdHlwZSBpcworICAgICAgICAgICAgLy8gc2luY2UgdGhlIGRpc2NyaW1pbmF0b3IgbWlnaHQgbm90IGJlIHNlbGVjdGVkCisgICAgICAgICAgICBpZiAobWFwcGluZ3NbcG9zXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIG1hcHBpbmdzW3Bvc10gPSBtYXBwaW5nOworCisgICAgICAgICAgICBzZWwuc2VsZWN0KHRoaXMsIG1hcHBpbmcsIHN1YmNsYXNzZXMsIHN0b3JlLCBmZXRjaCwgZWFnZXIsCisgICAgICAgICAgICAgICAgam9pbnMsIGlkZW50aWZpZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0SWRlbnRpZmllcihDb2x1bW4gY29sKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLnNlbGVjdElkZW50aWZpZXIoY29sKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdElkZW50aWZpZXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc2VsZWN0SWRlbnRpZmllcihjb2wsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgc2VsZWN0SWRlbnRpZmllcihDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLnNlbGVjdElkZW50aWZpZXIoY29scyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNlbGVjdElkZW50aWZpZXIoQ29sdW1uW10gY29scywgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc2VsZWN0SWRlbnRpZmllcihjb2xzLCBqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RJZGVudGlmaWVyKENsYXNzTWFwcGluZyBtYXBwaW5nLCBpbnQgc3ViY2xhc3NlcywKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyKSB7CisgICAgICAgICAgICBzZWxlY3QobWFwcGluZywgc3ViY2xhc3Nlcywgc3RvcmUsIGZldGNoLCBlYWdlciwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RJZGVudGlmaWVyKENsYXNzTWFwcGluZyBtYXBwaW5nLCBpbnQgc3ViY2xhc3NlcywKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyLAorICAgICAgICAgICAgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbGVjdChtYXBwaW5nLCBzdWJjbGFzc2VzLCBzdG9yZSwgZmV0Y2gsIGVhZ2VyLCBqb2lucywgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNlbGVjdFByaW1hcnlLZXkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc2VsZWN0UHJpbWFyeUtleShtYXBwaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgc2VsZWN0UHJpbWFyeUtleShDbGFzc01hcHBpbmcgbWFwcGluZywgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuc2VsZWN0UHJpbWFyeUtleShtYXBwaW5nLCBqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IG9yZGVyQnlQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nLCBib29sZWFuIGFzYywKKyAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gb3JkZXJCeVByaW1hcnlLZXkobWFwcGluZywgYXNjLCBudWxsLCBzZWxlY3QpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBvcmRlckJ5UHJpbWFyeUtleShDbGFzc01hcHBpbmcgbWFwcGluZywgYm9vbGVhbiBhc2MsCisgICAgICAgICAgICBKb2lucyBqb2lucywgYm9vbGVhbiBzZWxlY3QpIHsKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyBwa3MgPSBtYXBwaW5nOworICAgICAgICAgICAgd2hpbGUgKCFwa3MuaXNQcmltYXJ5S2V5T2JqZWN0SWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgcGtzID0gcGtzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IHBrcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICAgICAgcmVjb3JkT3JkZXJDb2x1bW5zKGNvbHMsIGFzYyk7CisgICAgICAgICAgICByZXR1cm4gc2VsLm9yZGVyQnlQcmltYXJ5S2V5KG1hcHBpbmcsIGFzYywgam9pbnMsIHNlbGVjdCwKKyAgICAgICAgICAgICAgICBpc1VuaW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY29yZCB0aGF0IHdlJ3JlIG9yZGVyaW5nIGJ5IGEgU1FMIGV4cHJlc3Npb24uCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCByZWNvcmRPcmRlcihPYmplY3Qgb3JkLCBib29sZWFuIGFzYykgeworICAgICAgICAgICAgaWYgKG9yZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG9yZGVySWR4cyA9IG51bGw7CisKKyAgICAgICAgICAgIGludCBpZHggPSBvcmRlcnMrKzsKKyAgICAgICAgICAgIGlmIChkZXNjLmdldChpZHgpICYmIGFzYykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiaW5jb21wYXQtb3JkZXJpbmciKSk7CisgICAgICAgICAgICBpZiAoIWFzYykKKyAgICAgICAgICAgICAgICBkZXNjLnNldChpZHgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY29yZCB0aGF0IHdlJ3JlIG9yZGVyaW5nIGJ5IHRoZSBnaXZlbiBjb2x1bW5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVjb3JkT3JkZXJDb2x1bW5zKENvbHVtbltdIGNvbHMsIGJvb2xlYW4gYXNjKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVjb3JkT3JkZXIoY29sc1tpXSwgYXNjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9yZGVyQnkoQ29sdW1uIGNvbCwgYm9vbGVhbiBhc2MsIGJvb2xlYW4gc2VsZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gb3JkZXJCeShjb2wsIGFzYywgbnVsbCwgc2VsZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9yZGVyQnkoQ29sdW1uIGNvbCwgYm9vbGVhbiBhc2MsIEpvaW5zIGpvaW5zLAorICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3QpIHsKKyAgICAgICAgICAgIHJlY29yZE9yZGVyKGNvbCwgYXNjKTsKKyAgICAgICAgICAgIHJldHVybiBzZWwub3JkZXJCeShjb2wsIGFzYywgam9pbnMsIHNlbGVjdCwgaXNVbmlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgb3JkZXJCeShDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFzYywgYm9vbGVhbiBzZWxlY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmRlckJ5KGNvbHMsIGFzYywgbnVsbCwgc2VsZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgb3JkZXJCeShDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsCisgICAgICAgICAgICBib29sZWFuIHNlbGVjdCkgeworICAgICAgICAgICAgcmVjb3JkT3JkZXJDb2x1bW5zKGNvbHMsIGFzYyk7CisgICAgICAgICAgICByZXR1cm4gc2VsLm9yZGVyQnkoY29scywgYXNjLCBqb2lucywgc2VsZWN0LCBpc1VuaW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShTUUxCdWZmZXIgc3FsLCBib29sZWFuIGFzYywgYm9vbGVhbiBzZWxlY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmRlckJ5KHNxbCwgYXNjLCBudWxsLCBzZWxlY3QpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShTUUxCdWZmZXIgc3FsLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsCisgICAgICAgICAgICBib29sZWFuIHNlbGVjdCkgeworICAgICAgICAgICAgcmVjb3JkT3JkZXIoc3FsLmdldFNRTChmYWxzZSksIGFzYyk7CisgICAgICAgICAgICByZXR1cm4gc2VsLm9yZGVyQnkoc3FsLCBhc2MsIGpvaW5zLCBzZWxlY3QsIGlzVW5pb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvcmRlckJ5KFN0cmluZyBzcWwsIGJvb2xlYW4gYXNjLCBib29sZWFuIHNlbGVjdCkgeworICAgICAgICAgICAgcmV0dXJuIG9yZGVyQnkoc3FsLCBhc2MsIG51bGwsIHNlbGVjdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvcmRlckJ5KFN0cmluZyBzcWwsIGJvb2xlYW4gYXNjLCBKb2lucyBqb2lucywKKyAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0KSB7CisgICAgICAgICAgICByZWNvcmRPcmRlcihzcWwsIGFzYyk7CisgICAgICAgICAgICByZXR1cm4gc2VsLm9yZGVyQnkoc3FsLCBhc2MsIGpvaW5zLCBzZWxlY3QsIGlzVW5pb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhck9yZGVyaW5nKCkgeworICAgICAgICAgICAgc2VsLmNsZWFyT3JkZXJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlUHJpbWFyeUtleShPYmplY3Qgb2lkLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICAgICAgc2VsLndoZXJlUHJpbWFyeUtleShvaWQsIG1hcHBpbmcsIHN0b3JlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlRm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBPYmplY3Qgb2lkLAorICAgICAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICAgICAgc2VsLndoZXJlRm9yZWlnbktleShmaywgb2lkLCBtYXBwaW5nLCBzdG9yZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGVyZShKb2lucyBqb2lucykgeworICAgICAgICAgICAgc2VsLndoZXJlKGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlKFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgICAgIHNlbC53aGVyZShzcWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmUoU1FMQnVmZmVyIHNxbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbC53aGVyZShzcWwsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoZXJlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIHNlbC53aGVyZShzcWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2hlcmUoU3RyaW5nIHNxbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbC53aGVyZShzcWwsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhdmluZyhTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgICAgICBzZWwuaGF2aW5nKHNxbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYXZpbmcoU1FMQnVmZmVyIHNxbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbC5oYXZpbmcoc3FsLCBqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYXZpbmcoU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgc2VsLmhhdmluZyhzcWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGF2aW5nKFN0cmluZyBzcWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgICAgICBzZWwuaGF2aW5nKHNxbCwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgICAgICBzZWwuZ3JvdXBCeShzcWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTUUxCdWZmZXIgc3FsLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgc2VsLmdyb3VwQnkoc3FsLCBqb2lucyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIHNlbC5ncm91cEJ5KHNxbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFN0cmluZyBzcWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgICAgICBzZWwuZ3JvdXBCeShzcWwsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ29sdW1uIGNvbCkgeworICAgICAgICAgICAgc2VsLmdyb3VwQnkoY29sKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbC5ncm91cEJ5KGNvbCwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ3JvdXBCeShDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgICAgICBzZWwuZ3JvdXBCeShjb2xzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ29sdW1uW10gY29scywgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbC5ncm91cEJ5KGNvbHMsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLCAKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICAgICAgc2VsLmdyb3VwQnkobWFwcGluZywgc3ViY2xhc3Nlcywgc3RvcmUsIGZldGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLCAKKyAgICAgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHNlbC5ncm91cEJ5KG1hcHBpbmcsIHN1YmNsYXNzZXMsIHN0b3JlLCBmZXRjaCwgam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlbGVjdEV4ZWN1dG9yIHdoZXJlQ2xvbmUoaW50IHNlbHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwud2hlcmVDbG9uZShzZWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciBmdWxsQ2xvbmUoaW50IHNlbHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuZnVsbENsb25lKHNlbHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlbGVjdEV4ZWN1dG9yIGVhZ2VyQ2xvbmUoRmllbGRNYXBwaW5nIGtleSwgaW50IGVhZ2VyVHlwZSwKKyAgICAgICAgICAgIGJvb2xlYW4gdG9NYW55LCBpbnQgc2VscykgeworICAgICAgICAgICAgU2VsZWN0RXhlY3V0b3IgZXggPSBzZWwuZWFnZXJDbG9uZShrZXksIGVhZ2VyVHlwZSwgdG9NYW55LCBzZWxzKTsKKyAgICAgICAgICAgIHJldHVybiAoZXggPT0gc2VsKSA/IHRoaXMgOiBleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciBnZXRFYWdlcihGaWVsZE1hcHBpbmcga2V5KSB7CisgICAgICAgICAgICBTZWxlY3RFeGVjdXRvciBleCA9IHNlbC5nZXRFYWdlcihrZXkpOworICAgICAgICAgICAgcmV0dXJuIChleCA9PSBzZWwpID8gdGhpcyA6IGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIG5ld0pvaW5zKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5uZXdKb2lucygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIG5ld091dGVySm9pbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsLm5ld091dGVySm9pbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTUUxCdWZmZXIgYnVmLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgc2VsLmFwcGVuZChidWYsIGpvaW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBhbmQoSm9pbnMgam9pbnMxLCBKb2lucyBqb2luczIpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuYW5kKGpvaW5zMSwgam9pbnMyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBvcihKb2lucyBqb2luczEsIEpvaW5zIGpvaW5zMikgeworICAgICAgICAgICAgcmV0dXJuIHNlbC5vcihqb2luczEsIGpvaW5zMik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgb3V0ZXIoSm9pbnMgam9pbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwub3V0ZXIoam9pbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RXhwZWN0ZWRSZXN1bHRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWwuZ2V0RXhwZWN0ZWRSZXN1bHRDb3VudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRSZXN1bHRDb3VudChpbnQgZXhwZWN0ZWRSZXN1bHRDb3VudCwgCisgICAgICAgICAgICBib29sZWFuIGZvcmNlKSB7CisgICAgICAgICAgICBzZWwuc2V0RXhwZWN0ZWRSZXN1bHRDb3VudChleHBlY3RlZFJlc3VsdENvdW50LCBmb3JjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJhdG9yIGZvciBjb2xsYXRpbmcgb3JkZXJlZCByZXN1bHRzIHdoZW4gZmFraW5nIGEgdW5pb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzdWx0Q29tcGFyYXRvcgorICAgICAgICBpbXBsZW1lbnRzIE1lcmdlZFJlc3VsdC5SZXN1bHRDb21wYXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3RbXSBfb3JkZXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdFNldCBfZGVzYzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEQkRpY3Rpb25hcnkgX2RpY3Q7CisKKyAgICAgICAgcHVibGljIFJlc3VsdENvbXBhcmF0b3IoTGlzdFtdIG9yZGVycywgQml0U2V0IGRlc2MsIERCRGljdGlvbmFyeSBkaWN0KSB7CisgICAgICAgICAgICBfb3JkZXJzID0gb3JkZXJzOworICAgICAgICAgICAgX2Rlc2MgPSBkZXNjOworICAgICAgICAgICAgX2RpY3QgPSBkaWN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKFJlc3VsdCByZXMsIGludCBpZHgpIHsKKyAgICAgICAgICAgIC8vIGlmIG9uZSB2YWx1ZSBqdXN0IHJldHVybiBpdAorICAgICAgICAgICAgUmVzdWx0U2V0IHJzID0gKChSZXN1bHRTZXRSZXN1bHQpIHJlcykuZ2V0UmVzdWx0U2V0KCk7CisgICAgICAgICAgICBpZiAoX29yZGVyc1tpZHhdLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRPcmRlcmluZ1ZhbHVlKHJzLCBfb3JkZXJzW2lkeF0uZ2V0KDApKTsKKworICAgICAgICAgICAgLy8gcmV0dXJuIGFycmF5IG9mIHZhbHVlcworICAgICAgICAgICAgT2JqZWN0W10gdmFscyA9IG5ldyBPYmplY3RbX29yZGVyc1tpZHhdLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdmFsc1tpXSA9IGdldE9yZGVyaW5nVmFsdWUocnMsIF9vcmRlcnNbaWR4XS5nZXQoaSkpOworICAgICAgICAgICAgcmV0dXJuIHZhbHM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRXh0cmFjdCB2YWx1ZSBhdCBnaXZlbiBpbmRleCBmcm9tIHJlc3VsdCBzZXQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKFJlc3VsdFNldCBycywgT2JqZWN0IGkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kaWN0LmdldE9iamVjdChycywgKChJbnRlZ2VyKSBpKS5pbnRWYWx1ZSgpICsgMSwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBfZGljdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgIGlmIChvMSA9PSBvMikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChvMSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoX2Rlc2MuZ2V0KDApKSA/IC0xIDogMTsKKyAgICAgICAgICAgIGlmIChvMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoX2Rlc2MuZ2V0KDApKSA/IDEgOiAtMTsKKworICAgICAgICAgICAgaW50IGNtcDsKKyAgICAgICAgICAgIGlmICghKG8xIGluc3RhbmNlb2YgT2JqZWN0W10pKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobzIgaW5zdGFuY2VvZiBPYmplY3RbXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY21wID0gKChDb21wYXJhYmxlKSBvMSkuY29tcGFyZVRvKG8yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfZGVzYy5nZXQoMCkpID8gLWNtcCA6IGNtcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbXAgPSAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8oKChPYmplY3RbXSkgbzIpWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAoY21wICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2Rlc2MuZ2V0KDApKSA/IC1jbXAgOiBjbXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShvMiBpbnN0YW5jZW9mIE9iamVjdFtdKSkgeworICAgICAgICAgICAgICAgIGNtcCA9ICgoQ29tcGFyYWJsZSkgKChPYmplY3RbXSkgbzEpWzBdKS5jb21wYXJlVG8obzIpOworICAgICAgICAgICAgICAgIGlmIChjbXAgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfZGVzYy5nZXQoMCkpID8gLWNtcCA6IGNtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0W10gYTEgPSAoT2JqZWN0W10pIG8xOworICAgICAgICAgICAgT2JqZWN0W10gYTIgPSAoT2JqZWN0W10pIG8yOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNtcCA9ICgoQ29tcGFyYWJsZSkgYTFbaV0pLmNvbXBhcmVUbyhhMltpXSk7CisgICAgICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9kZXNjLmdldChpKSkgPyAtY21wIDogY21wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGExLmxlbmd0aCAtIGEyLmxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL01lcmdlZFJlc3VsdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvTWVyZ2VkUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjZWY2NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL01lcmdlZFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zcWwuQXJyYXk7CitpbXBvcnQgamF2YS5zcWwuQmxvYjsKK2ltcG9ydCBqYXZhLnNxbC5DbG9iOworaW1wb3J0IGphdmEuc3FsLlJlZjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXN1bHQgdGhhdCBtZXJnZXMgbXVsdGlwbGUgcmVzdWx0IGRlbGVnYXRlcy4gU3VwcG9ydCBleGlzdHMgZm9yCisgKiBtYWludGFpbmluZyBvcmRlcmluZyBvZiB0aGUgaW50ZXJuYWxseS1oZWxkIHJlc3VsdHMsIHByb3ZpZGVkIHRoYXQgZWFjaAorICogb2YgdGhlIGluZGl2aWR1YWwgcmVzdWx0cyBpcyBpdHNlbGYgb3JkZXJlZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTWVyZ2VkUmVzdWx0CisgICAgaW1wbGVtZW50cyBSZXN1bHQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBORVhUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIENVUlJFTlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRE9ORSA9IDI7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc3VsdFtdIF9yZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gX3N0YXR1czsKKyAgICBwcml2YXRlIGZpbmFsIFJlc3VsdENvbXBhcmF0b3IgX2NvbXA7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBfb3JkZXI7CisgICAgcHJpdmF0ZSBpbnQgX2lkeCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wdXNoZWRCYWNrID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVyZ2VkUmVzdWx0KFJlc3VsdFtdIHJlcykgeworICAgICAgICB0aGlzKHJlcywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZXMgYW5kIGNvbXBhcmF0b3IgZm9yIG9yZGVyaW5nIHJlc3VsdHMuCisgICAgICovCisgICAgcHVibGljIE1lcmdlZFJlc3VsdChSZXN1bHRbXSByZXMsIFJlc3VsdENvbXBhcmF0b3IgY29tcCkgeworICAgICAgICBfcmVzID0gcmVzOworICAgICAgICBfY29tcCA9IGNvbXA7CisgICAgICAgIF9vcmRlciA9IChjb21wID09IG51bGwpID8gbnVsbCA6IG5ldyBPYmplY3RbcmVzLmxlbmd0aF07CisgICAgICAgIF9zdGF0dXMgPSAoY29tcCA9PSBudWxsKSA/IG51bGwgOiBuZXcgYnl0ZVtyZXMubGVuZ3RoXTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEVhZ2VyKEZpZWxkTWFwcGluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0RWFnZXIoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRFYWdlcihGaWVsZE1hcHBpbmcga2V5LCBPYmplY3QgcmVzKSB7CisgICAgICAgIF9yZXNbX2lkeF0ucHV0RWFnZXIoa2V5LCByZXMpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBuZXdKb2lucygpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0ubmV3Sm9pbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX3Jlc1tpXS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2luZygpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uaXNMb2NraW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFic29sdXRlKGludCByb3cpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfcHVzaGVkQmFjaykgeworICAgICAgICAgICAgX3B1c2hlZEJhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9jb21wID09IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlICghX3Jlc1tfaWR4XS5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lkeCA9PSBfcmVzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBfaWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9yZGVyaW5nIGlzIGludm9sdmVkOyBleHRyYWN0IG9yZGVyIHZhbHVlcyBmcm9tIGVhY2ggcmVzdWx0CisgICAgICAgIGJvb2xlYW4gaGFzVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc3RhdHVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9zdGF0dXNbaV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5FWFQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzW2ldLm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXR1c1tpXSA9IENVUlJFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBfb3JkZXJbaV0gPSBfY29tcC5nZXRPcmRlcmluZ1ZhbHVlKF9yZXNbaV0sIGkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdGF0dXNbaV0gPSBET05FOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGwgcmVzdWx0cyBleGhhdXN0ZWQKKyAgICAgICAgaWYgKCFoYXNWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBmb3IgYWxsIHJlc3VsdHMgd2l0aCB2YWx1ZXMsIGZpbmQgdGhlICdsZWFzdCcgb25lIGFjY29yZGluZyB0bworICAgICAgICAvLyB0aGUgY29tcGFyYXRvcgorICAgICAgICBpbnQgbGVhc3QgPSAtMTsKKyAgICAgICAgT2JqZWN0IG9yZGVyVmFsID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfb3JkZXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfc3RhdHVzW2ldICE9IENVUlJFTlQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAobGVhc3QgPT0gLTEgfHwgX2NvbXAuY29tcGFyZShfb3JkZXJbaV0sIG9yZGVyVmFsKSA8IDApIHsKKyAgICAgICAgICAgICAgICBsZWFzdCA9IGk7CisgICAgICAgICAgICAgICAgb3JkZXJWYWwgPSBfb3JkZXJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHRoZSBjdXJyZW50IHJlc3VsdCB0aGUgb25lIHdpdGggdGhlIGxlYXN0IHZhbHVlLCBhbmQgY2xlYXIKKyAgICAgICAgLy8gdGhlIGNhY2hlZCB2YWx1ZSBmb3IgdGhhdCByZXN1bHQKKyAgICAgICAgX2lkeCA9IGxlYXN0OworICAgICAgICBfb3JkZXJbbGVhc3RdID0gbnVsbDsKKyAgICAgICAgX3N0YXR1c1tsZWFzdF0gPSBORVhUOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXNoQmFjaygpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcHVzaGVkQmFjayA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc2l6ZSArPSBfcmVzW2ldLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmNvbnRhaW5zKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gb2JqcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmNvbnRhaW5zQWxsKG9ianMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uY29udGFpbnMoY29sLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sdW1uW10gY29scywgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5jb250YWluc0FsbChjb2xzLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWFwcGluZyBnZXRCYXNlTWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0QmFzZU1hcHBpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlTWFwcGluZyhDbGFzc01hcHBpbmcgbWFwcGluZykgeworICAgICAgICBfcmVzW19pZHhdLnNldEJhc2VNYXBwaW5nKG1hcHBpbmcpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5kZXhPZigpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uaW5kZXhPZigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChDbGFzc01hcHBpbmcgbWFwcGluZywgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0ubG9hZChtYXBwaW5nLCBzdG9yZSwgZmV0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbG9hZChDbGFzc01hcHBpbmcgbWFwcGluZywgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmxvYWQobWFwcGluZywgc3RvcmUsIGZldGNoLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5IGdldEFycmF5KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRBcnJheShvYmopOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0QXNjaWlTdHJlYW0ob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRCaWdEZWNpbWFsKG9iaik7CisgICAgfQorCisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlcihPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0QmlnSW50ZWdlcihvYmopOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJpbmFyeVN0cmVhbShvYmopOworICAgIH0KKworICAgIHB1YmxpYyBCbG9iIGdldEJsb2IoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJsb2Iob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRCb29sZWFuKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0Qnl0ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJ5dGVzKG9iaik7CisgICAgfQorCisgICAgcHVibGljIENhbGVuZGFyIGdldENhbGVuZGFyKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRDYWxlbmRhcihvYmopOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGdldENoYXIoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldENoYXIob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVhZGVyIGdldENoYXJhY3RlclN0cmVhbShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0Q2hhcmFjdGVyU3RyZWFtKG9iaik7CisgICAgfQorCisgICAgcHVibGljIENsb2IgZ2V0Q2xvYihPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0Q2xvYihvYmopOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldERhdGUoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldERhdGUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKE9iamVjdCBvYmosIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldERhdGUob2JqLCBjYWwpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXREb3VibGUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEZsb2F0KG9iaik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnQoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEludChvYmopOworICAgIH0KKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRMb2NhbGUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRMb25nKG9iaik7CisgICAgfQorCisgICAgcHVibGljIE51bWJlciBnZXROdW1iZXIoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldE51bWJlcihvYmopOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmosIGludCBtZXRhVHlwZSwgT2JqZWN0IGFyZykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldE9iamVjdChvYmosIG1ldGFUeXBlLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMT2JqZWN0KE9iamVjdCBvYmosIE1hcCBtYXApCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRTUUxPYmplY3Qob2JqLCBtYXApOworICAgIH0KKworICAgIHB1YmxpYyBSZWYgZ2V0UmVmKE9iamVjdCBvYmosIE1hcCBtYXApCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRSZWYob2JqLCBtYXApOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0U2hvcnQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0U3RyaW5nKG9iaik7CisgICAgfQorCisgICAgcHVibGljIFRpbWUgZ2V0VGltZShPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRUaW1lKG9iaiwgY2FsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRUaW1lc3RhbXAob2JqLCBjYWwpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheSBnZXRBcnJheShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEFycmF5KGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEFzY2lpU3RyZWFtKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRCaWdEZWNpbWFsKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRCaWdJbnRlZ2VyKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRCaW5hcnlTdHJlYW0oY29sLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIEJsb2IgZ2V0QmxvYihDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJsb2IoY29sLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJvb2xlYW4oY29sLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJ5dGUoY29sLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEJ5dGVzKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhcihDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldENhbGVuZGFyKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGdldENoYXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRDaGFyKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0Q2hhcmFjdGVyU3RyZWFtKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBDbG9iIGdldENsb2IoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRDbG9iKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldERhdGUoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXREYXRlKGNvbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBqYXZhLnNxbC5EYXRlIGdldERhdGUoQ29sdW1uIGNvbCwgQ2FsZW5kYXIgY2FsLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldERhdGUoY29sLCBjYWwsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldERvdWJsZShjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRGbG9hdChjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludChDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldEludChjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldExvY2FsZShjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0TG9uZyhjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTnVtYmVyIGdldE51bWJlcihDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldE51bWJlcihjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChDb2x1bW4gY29sLCBPYmplY3QgYXJnLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldE9iamVjdChjb2wsIGFyZywgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U1FMT2JqZWN0KENvbHVtbiBjb2wsIE1hcCBtYXAsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0uZ2V0U1FMT2JqZWN0KGNvbCwgbWFwLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIFJlZiBnZXRSZWYoQ29sdW1uIGNvbCwgTWFwIG1hcCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRSZWYoY29sLCBtYXAsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRTaG9ydChjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldFN0cmluZyhjb2wsIGpvaW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZSBnZXRUaW1lKENvbHVtbiBjb2wsIENhbGVuZGFyIGNhbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Jlc1tfaWR4XS5nZXRUaW1lKGNvbCwgY2FsLCBqb2lucyk7CisgICAgfQorCisgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoQ29sdW1uIGNvbCwgQ2FsZW5kYXIgY2FsLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcmVzW19pZHhdLmdldFRpbWVzdGFtcChjb2wsIGNhbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdhc051bGwoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9yZXNbX2lkeF0ud2FzTnVsbCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RGF0YVJlcXVlc3QoT2JqZWN0IG1hcHBpbmcpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX3Jlc1tpXS5zdGFydERhdGFSZXF1ZXN0KG1hcHBpbmcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZERhdGFSZXF1ZXN0KCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBfcmVzW2ldLmVuZERhdGFSZXF1ZXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyYXRvciBmb3Igb3JkZXJpbmcgcmVzdWx0IHJvd3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVzdWx0Q29tcGFyYXRvcgorICAgICAgICBleHRlbmRzIENvbXBhcmF0b3IgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIG9yZGVyaW5nIHZhbHVlIG9mIHRoZSBjdXJyZW50IHJvdyBvZiB0aGUgZ2l2ZW4gcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKFJlc3VsdCByZXMsIGludCBpZHgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL015U1FMRGljdGlvbmFyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvTXlTUUxEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjNDg1MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL015U1FMRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlByaW1hcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIE15U1FMLgorICovCitwdWJsaWMgY2xhc3MgTXlTUUxEaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBEQkRpY3Rpb25hcnkgeworCisgICAgLyoqCisgICAgICogVGhlIE15U1FMIHRhYmxlIHR5cGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGFibGVzOyBkZWZhdWx0cyB0byBpbm5vZGIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0YWJsZVR5cGUgPSAiaW5ub2RiIjsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGNsb2JzLiBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE15U1FMIGRvIG5vdCBoYW5kbGUKKyAgICAgKiBjbG9icyBwcm9wZXJseSBzbyB3ZSBkZWZhdWx0IHRvIGZhbHNlIGhlcmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdXNlQ2xvYnMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZHJpdmVyIGF1dG9tYXRpY2FsbHkgZGVzZXJpYWxpemVzIGJsb2JzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRyaXZlckRlc2VyaWFsaXplc0Jsb2JzID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW5saW5lIG11bHRpLXRhYmxlIGJ1bGstZGVsZXRlIG9wZXJhdGlvbnMgaW50byBNeVNRTCdzIAorICAgICAqIGNvbWJpbmVkIDxjb2RlPkRFTEVURSBGUk9NIGZvbywgYmFyLCBiYXo8L2NvZGU+IHN5bnRheC4gCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UsIHNpbmNlIHRoaXMgbWF5IGZhaWwgaW4gdGhlIHByZXNlbmNlIG9mIElubm9EQiB0YWJsZXMKKyAgICAgKiB3aXRoIGZvcmVpZ24ga2V5cy4KKyAgICAgKiBAc2VlIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL2RlbGV0ZS5odG1sCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb3B0aW1pemVNdWx0aVRhYmxlRGVsZXRlcyA9IGZhbHNlOworCisgICAgcHVibGljIE15U1FMRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiTXlTUUwiOworICAgICAgICB2YWxpZGF0aW9uU1FMID0gIlNFTEVDVCBOT1coKSI7CisgICAgICAgIGRpc3RpbmN0Q291bnRDb2x1bW5TZXBhcmF0b3IgPSAiLCI7CisKKyAgICAgICAgc3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgICAgIGNvbnN0cmFpbnROYW1lTW9kZSA9IENPTlNfTkFNRV9NSUQ7CisgICAgICAgIHN1cHBvcnRzTXVsdGlwbGVOb250cmFuc2FjdGlvbmFsUmVzdWx0U2V0cyA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c1N1YnNlbGVjdCA9IGZhbHNlOyAvLyBvbGQgdmVyc2lvbnMKKyAgICAgICAgcmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCA9IHRydWU7IC8vIG5ldyB2ZXJzaW9ucworICAgICAgICBzdXBwb3J0c1NlbGVjdFN0YXJ0SW5kZXggPSB0cnVlOworICAgICAgICBzdXBwb3J0c1NlbGVjdEVuZEluZGV4ID0gdHJ1ZTsKKyAgICAgICAgYWxsb3dzQWxpYXNJbkJ1bGtDbGF1c2UgPSBmYWxzZTsKKworICAgICAgICBjb25jYXRlbmF0ZUZ1bmN0aW9uID0gIkNPTkNBVCh7MH0sezF9KSI7CisKKyAgICAgICAgbWF4VGFibGVOYW1lTGVuZ3RoID0gNjQ7CisgICAgICAgIG1heENvbHVtbk5hbWVMZW5ndGggPSA2NDsKKyAgICAgICAgbWF4SW5kZXhOYW1lTGVuZ3RoID0gNjQ7CisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gNjQ7CisgICAgICAgIG1heEluZGV4ZXNQZXJUYWJsZSA9IDMyOworICAgICAgICBzY2hlbWFDYXNlID0gU0NIRU1BX0NBU0VfUFJFU0VSVkU7CisKKyAgICAgICAgc3VwcG9ydHNBdXRvQXNzaWduID0gdHJ1ZTsKKyAgICAgICAgbGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID0gIlNFTEVDVCBMQVNUX0lOU0VSVF9JRCgpIjsKKyAgICAgICAgYXV0b0Fzc2lnbkNsYXVzZSA9ICJBVVRPX0lOQ1JFTUVOVCI7CisKKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBsb25nVmFyY2hhclR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBsb25nVmFyYmluYXJ5VHlwZU5hbWUgPSAiTE9ORyBWQVJCSU5BUlkiOworICAgICAgICB0aW1lc3RhbXBUeXBlTmFtZSA9ICJEQVRFVElNRSI7CisgICAgICAgIGZpeGVkU2l6ZVR5cGVOYW1lU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJCT09MIiwgIkxPTkcgVkFSQklOQVJZIiwgIk1FRElVTUJMT0IiLCAiTE9OR0JMT0IiLAorICAgICAgICAgICAgIlRJTllCTE9CIiwgIkxPTkcgVkFSQ0hBUiIsICJNRURJVU1URVhUIiwgIkxPTkdURVhUIiwgIlRFWFQiLAorICAgICAgICAgICAgIlRJTllURVhUIiwgIkRPVUJMRSBQUkVDSVNJT04iLCAiRU5VTSIsICJTRVQiLCAiREFURVRJTUUiLAorICAgICAgICB9KSk7CisgICAgICAgIHJlc2VydmVkV29yZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiSU5UMSIsICJJTlQyIiwgIklOVDQiLCAiRkxPQVQxIiwgIkZMT0FUMiIsICJGTE9BVDQiLAorICAgICAgICAgICAgIkFVVE9fSU5DUkVNRU5UIiwgIkJJTkFSWSIsICJCTE9CIiwgIkNIQU5HRSIsICJFTlVNIiwgIklORklMRSIsCisgICAgICAgICAgICAiTE9BRCIsICJNRURJVU1JTlQiLCAiT1BUSU9OIiwgIk9VVEZJTEUiLCAiUkVQTEFDRSIsCisgICAgICAgICAgICAiU0VUIiwgIlNUQVJUSU5HIiwgIlRFWFQiLCAiVU5TSUdORUQiLCAiWkVST0ZJTEwiLAorICAgICAgICB9KSk7CisKKyAgICAgICAgLy8gTXlTUUwgcmVxdWlyZXMgZG91YmxlLWVzY2FwZSBmb3Igc3RyaW5ncworICAgICAgICBzZWFyY2hTdHJpbmdFc2NhcGUgPSAiXFxcXCI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldENyZWF0ZVRhYmxlU1FMKFRhYmxlIHRhYmxlKSB7CisgICAgICAgIFN0cmluZ1tdIHNxbCA9IHN1cGVyLmdldENyZWF0ZVRhYmxlU1FMKHRhYmxlKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KHRhYmxlVHlwZSkpCisgICAgICAgICAgICBzcWxbMF0gPSBzcWxbMF0gKyAiIFRZUEUgPSAiICsgdGFibGVUeXBlOworICAgICAgICByZXR1cm4gc3FsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREcm9wSW5kZXhTUUwoSW5kZXggaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkRST1AgSU5ERVggIiArIGdldEZ1bGxOYW1lKGluZGV4KSArICIgT04gIgorICAgICAgICAgICAgKyBnZXRGdWxsTmFtZShpbmRleC5nZXRUYWJsZSgpLCBmYWxzZSkgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWRkUHJpbWFyeUtleVNRTChQcmltYXJ5S2V5IHBrKSB7CisgICAgICAgIFN0cmluZ1tdIHNxbCA9IHN1cGVyLmdldEFkZFByaW1hcnlLZXlTUUwocGspOworCisgICAgICAgIC8vIG15c3FsIHJlcXVpcmVzIHRoYXQgYSBjb2x1bW4gYmUgZGVjbGFyZWQgTk9UIE5VTEwgYmVmb3JlCisgICAgICAgIC8vIGl0IGNhbiBiZSBtYWRlIGEgcHJpbWFyeSBrZXkuCisgICAgICAgIENvbHVtbltdIGNvbHMgPSBway5nZXRDb2x1bW5zKCk7CisgICAgICAgIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbY29scy5sZW5ndGggKyBzcWwubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXRbaV0gPSAiQUxURVIgVEFCTEUgIiArIGdldEZ1bGxOYW1lKGNvbHNbaV0uZ2V0VGFibGUoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgKyAiIENIQU5HRSAiICsgY29sc1tpXS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICArICIgIiArIGNvbHNbaV0uZ2V0TmFtZSgpIC8vIG5hbWUgdHdpY2UKKyAgICAgICAgICAgICAgICArICIgIiArIGdldFR5cGVOYW1lKGNvbHNbaV0pICsgIiBOT1QgTlVMTCI7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNxbCwgMCwgcmV0LCBjb2xzLmxlbmd0aCwgc3FsLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGb3JlaWduS2V5Q29uc3RyYWludFNRTChGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIC8vIG15c3FsIGRvZXMgbm90IHN1cHBvcnQgY29tcG9zaXRlIGZvcmVpZ24ga2V5cworICAgICAgICBpZiAoZmsuZ2V0Q29sdW1ucygpLmxlbmd0aCA+IDEpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEZvcmVpZ25LZXlDb25zdHJhaW50U1FMKGZrKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZ1tdIGdldERlbGV0ZVRhYmxlQ29udGVudHNTUUwoVGFibGVbXSB0YWJsZXMpIHsKKyAgICAgICAgLy8gbXlzcWwgPj0gNCBzdXBwb3J0cyBtb3JlLW9wdGltYWwgZGVsZXRlIHN5bnRheAorICAgICAgICBpZiAoIW9wdGltaXplTXVsdGlUYWJsZURlbGV0ZXMpCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVsZXRlVGFibGVDb250ZW50c1NRTCh0YWJsZXMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYmxlcy5sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkRFTEVURSBGUk9NICIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHRhYmxlc1tpXS5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IHRhYmxlcy5sZW5ndGggLSAxKQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IGJ1Zi50b1N0cmluZygpIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTZWxlY3RSYW5nZShTUUxCdWZmZXIgYnVmLCBsb25nIHN0YXJ0LCBsb25nIGVuZCkgeworICAgICAgICBidWYuYXBwZW5kKCIgTElNSVQgIikuYXBwZW5kVmFsdWUoc3RhcnQpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgaWYgKGVuZCA9PSBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmRWYWx1ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmRWYWx1ZShlbmQgLSBzdGFydCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbHVtbiBuZXdDb2x1bW4oUmVzdWx0U2V0IGNvbE1ldGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW4gY29sID0gc3VwZXIubmV3Q29sdW1uKGNvbE1ldGEpOworICAgICAgICBpZiAoY29sLmlzTm90TnVsbCgpICYmICIwIi5lcXVhbHMoY29sLmdldERlZmF1bHRTdHJpbmcoKSkpCisgICAgICAgICAgICBjb2wuc2V0RGVmYXVsdFN0cmluZyhudWxsKTsKKyAgICAgICAgcmV0dXJuIGNvbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEJsb2JPYmplY3QoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uLCBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgc2V0IGEgZ2V0LWJsb2Igc3RyYXRlZ3kgZXhwbGljaXRseSBvciB0aGUgZHJpdmVyCisgICAgICAgIC8vIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZGVzZXJpYWxpemUsIGRlbGVnYXRlIHRvIHN1cGVyCisgICAgICAgIGlmICh1c2VHZXRCeXRlc0ZvckJsb2JzIHx8IHVzZUdldE9iamVjdEZvckJsb2JzCisgICAgICAgICAgICB8fCAhZHJpdmVyRGVzZXJpYWxpemVzQmxvYnMpCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QmxvYk9iamVjdChycywgY29sdW1uLCBzdG9yZSk7CisKKyAgICAgICAgLy8gbW9zdCBteXNxbCBkcml2ZXJzIGRlc2VyaWFsaXplIG9uIGdldE9iamVjdAorICAgICAgICByZXR1cm4gcnMuZ2V0T2JqZWN0KGNvbHVtbik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcmVmZXJyZWRUeXBlKGludCB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlID09IFR5cGVzLkNMT0IgJiYgIXVzZUNsb2JzKQorICAgICAgICAgICAgcmV0dXJuIFR5cGVzLkxPTkdWQVJDSEFSOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJlZmVycmVkVHlwZSh0eXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9PcmFjbGVEaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9PcmFjbGVEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZWFjOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL09yYWNsZURpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDEwMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zcWwuQmxvYjsKK2ltcG9ydCBqYXZhLnNxbC5DbG9iOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkZpbHRlclZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5QcmltYXJ5S2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlbGVnYXRpbmdEYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5EZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBEaWN0aW9uYXJ5IGZvciBPcmFjbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBPcmFjbGVEaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBEQkRpY3Rpb25hcnkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0hJTlQgPSAib3BlbmpwYS5oaW50Lk9yYWNsZVNlbGVjdEhpbnQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9PUkFDTEUgPSAib3JhY2xlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUhBVkVfT1RIRVIgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUhBVkVfT1JBQ0xFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkVIQVZFX0RBVEFESVJFQ1QzMSA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBCbG9iIEVNUFRZX0JMT0IgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIENsb2IgRU1QVFlfQ0xPQiA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChPcmFjbGVEaWN0aW9uYXJ5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRoZW4gc2ltdWxhdGUgYXV0by1hc3NpZ25lZCB2YWx1ZXMgaW4gT3JhY2xlIGJ5CisgICAgICogdXNpbmcgYSB0cmlnZ2VyIHRoYXQgaW5zZXJ0cyBhIHNlcXVlbmNlIHZhbHVlIGludG8gdGhlCisgICAgICogcHJpbWFyeSBrZXkgdmFsdWUgd2hlbiBhIHJvdyBpcyBpbnNlcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB1c2VUcmlnZ2Vyc0ZvckF1dG9Bc3NpZ24gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBnbG9iYWwgc2VxdWVuY2UgbmFtZSB0byB1c2UgZm9yIGF1dG9hc3NpZ24gc2ltdWxhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGF1dG9Bc3NpZ25TZXF1ZW5jZU5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogRmxhZyB0byB1c2UgT3BlbkpQQSAwLjMgc3R5bGUgbmFtaW5nIGZvciBhdXRvIGFzc2lnbiBzZXF1ZW5jZSBuYW1lIGFuZAorICAgICAqIHRyaWdnZXIgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb3BlbmpwYTNHZW5lcmF0ZWRLZXlOYW1lcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlbiBPcGVuSlBBIHdpbGwgYXR0ZW1wdCB0byB1c2UgdGhlIHNwZWNpYWwKKyAgICAgKiBPcmFjbGVQcmVwYXJlZFN0YXRlbWVudC5zZXRGb3JtT2ZVc2UgbWV0aG9kIHRvCisgICAgICogY29uZmlndXJlIHN0YXRlbWVudHMgdGhhdCBpdCBkZXRlY3RzIGFyZSBvcGVyYXRpbmcgb24gdW5pY29kZSBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdXNlU2V0Rm9ybU9mVXNlRm9yVW5pY29kZSA9IHRydWU7CisKKyAgICAvLyBzb21lIG9yYWNsZSBkcml2ZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBzZWxlY3QgZm9yIHVwZGF0ZTsgd2FybiB0aGUKKyAgICAvLyBmaXJzdCB0aW1lIGxvY2tpbmcgaXMgYXR0ZW1wdGVkCisgICAgcHJpdmF0ZSBib29sZWFuIF9jaGVja2VkVXBkYXRlQnVnID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF93YXJuZWRDaGFyQ29sdW1uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF93YXJuZWROY2hhckNvbHVtbiA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF9kcml2ZXJCZWhhdmlvciA9IC0xOworCisgICAgLy8gY2FjaGUgbG9iIG1ldGhvZHMKKyAgICBwcml2YXRlIE1ldGhvZCBfcHV0Qnl0ZXMgPSBudWxsOworICAgIHByaXZhdGUgTWV0aG9kIF9wdXRTdHJpbmcgPSBudWxsOworICAgIHByaXZhdGUgTWV0aG9kIF9wdXRDaGFycyA9IG51bGw7CisKKyAgICBwdWJsaWMgT3JhY2xlRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiT3JhY2xlIjsKKyAgICAgICAgdmFsaWRhdGlvblNRTCA9ICJTRUxFQ1QgU1lTREFURSBGUk9NIERVQUwiOworICAgICAgICBuZXh0U2VxdWVuY2VRdWVyeSA9ICJTRUxFQ1QgezB9Lk5FWFRWQUwgRlJPTSBEVUFMIjsKKyAgICAgICAgc3RyaW5nTGVuZ3RoRnVuY3Rpb24gPSAiTEVOR1RIKHswfSkiOworICAgICAgICBqb2luU3ludGF4ID0gU1lOVEFYX0RBVEFCQVNFOworICAgICAgICBtYXhUYWJsZU5hbWVMZW5ndGggPSAzMDsKKyAgICAgICAgbWF4Q29sdW1uTmFtZUxlbmd0aCA9IDMwOworICAgICAgICBtYXhJbmRleE5hbWVMZW5ndGggPSAzMDsKKyAgICAgICAgbWF4Q29uc3RyYWludE5hbWVMZW5ndGggPSAzMDsKKyAgICAgICAgbWF4RW1iZWRkZWRCbG9iU2l6ZSA9IDQwMDA7CisgICAgICAgIG1heEVtYmVkZGVkQ2xvYlNpemUgPSA0MDAwOworICAgICAgICBpbkNsYXVzZUxpbWl0ID0gMTAwMDsKKworICAgICAgICBzdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHMgPSB0cnVlOworICAgICAgICBzdXBwb3J0c0xvY2tpbmdXaXRoRGlzdGluY3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNTZWxlY3RTdGFydEluZGV4ID0gdHJ1ZTsKKyAgICAgICAgc3VwcG9ydHNTZWxlY3RFbmRJbmRleCA9IHRydWU7CisKKyAgICAgICAgc3lzdGVtU2NoZW1hU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJDVFhTWVMiLCAiTURTWVMiLCAiU1lTIiwgIlNZU1RFTSIsICJXS1NZUyIsICJXTVNZUyIsICJYREIiLAorICAgICAgICB9KSk7CisKKyAgICAgICAgYmlnaW50VHlwZU5hbWUgPSAiTlVNQkVSezB9IjsKKyAgICAgICAgYml0VHlwZU5hbWUgPSAiTlVNQkVSezB9IjsKKyAgICAgICAgZGVjaW1hbFR5cGVOYW1lID0gIk5VTUJFUnswfSI7CisgICAgICAgIGRvdWJsZVR5cGVOYW1lID0gIk5VTUJFUnswfSI7CisgICAgICAgIGludGVnZXJUeXBlTmFtZSA9ICJOVU1CRVJ7MH0iOworICAgICAgICBudW1lcmljVHlwZU5hbWUgPSAiTlVNQkVSezB9IjsKKyAgICAgICAgc21hbGxpbnRUeXBlTmFtZSA9ICJOVU1CRVJ7MH0iOworICAgICAgICB0aW55aW50VHlwZU5hbWUgPSAiTlVNQkVSezB9IjsKKyAgICAgICAgbG9uZ1ZhcmNoYXJUeXBlTmFtZSA9ICJMT05HIjsKKyAgICAgICAgYmluYXJ5VHlwZU5hbWUgPSAiQkxPQiI7CisgICAgICAgIHZhcmJpbmFyeVR5cGVOYW1lID0gIkJMT0IiOworICAgICAgICBsb25nVmFyYmluYXJ5VHlwZU5hbWUgPSAiQkxPQiI7CisgICAgICAgIHRpbWVUeXBlTmFtZSA9ICJEQVRFIjsKKyAgICAgICAgdmFyY2hhclR5cGVOYW1lID0gIlZBUkNIQVIyezB9IjsKKyAgICAgICAgZml4ZWRTaXplVHlwZU5hbWVTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdeworICAgICAgICAgICAgIkxPTkcgUkFXIiwgIlJBVyIsICJMT05HIiwgIlJFRiIsCisgICAgICAgIH0pKTsKKyAgICAgICAgcmVzZXJ2ZWRXb3JkU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJBQ0NFU1MiLCAiQVVESVQiLCAiQ0xVU1RFUiIsICJDT01NRU5UIiwgIkNPTVBSRVNTIiwgIkVYQ0xVU0lWRSIsCisgICAgICAgICAgICAiRklMRSIsICJJREVOVElGSUVEIiwgIklOQ1JFTUVOVCIsICJJTkRFWCIsICJJTklUSUFMIiwgIkxPQ0siLAorICAgICAgICAgICAgIkxPTkciLCAiTUFYRVhURU5UUyIsICJNSU5VUyIsICJNT0RFIiwgIk5PQVVESVQiLCAiTk9DT01QUkVTUyIsCisgICAgICAgICAgICAiTk9XQUlUIiwgIk9GRkxJTkUiLCAiT05MSU5FIiwgIlBDVEZSRUUiLCAiUk9XIiwKKyAgICAgICAgfSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHN1cGVyLmVuZENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKHVzZVRyaWdnZXJzRm9yQXV0b0Fzc2lnbikKKyAgICAgICAgICAgIHN1cHBvcnRzQXV0b0Fzc2lnbiA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdGVkQ29uZmlndXJhdGlvbihDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzdXBlci5jb25uZWN0ZWRDb25maWd1cmF0aW9uKGNvbm4pOworICAgICAgICBpZiAoZHJpdmVyVmVuZG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIERhdGFiYXNlTWV0YURhdGEgbWV0YSA9IGNvbm4uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgICAgIFN0cmluZyB1cmwgPSAobWV0YS5nZXRVUkwoKSA9PSBudWxsKSA/ICIiIDogbWV0YS5nZXRVUkwoKTsKKyAgICAgICAgICAgIFN0cmluZyBkcml2ZXJOYW1lID0gbWV0YS5nZXREcml2ZXJOYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgbWV0YWRhdGFDbGFzc05hbWU7CisgICAgICAgICAgICBpZiAobWV0YSBpbnN0YW5jZW9mIERlbGVnYXRpbmdEYXRhYmFzZU1ldGFEYXRhKQorICAgICAgICAgICAgICAgIG1ldGFkYXRhQ2xhc3NOYW1lID0gKChEZWxlZ2F0aW5nRGF0YWJhc2VNZXRhRGF0YSkgbWV0YSkuCisgICAgICAgICAgICAgICAgICAgIGdldElubmVybW9zdERlbGVnYXRlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0YWRhdGFDbGFzc05hbWUgPSBtZXRhLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAvLyBjaGVjayBib3RoIHRoZSBkcml2ZXIgY2xhc3MgbmFtZSBhbmQgdGhlIFVSTCBmb3Iga25vd24gcGF0dGVybnMKKyAgICAgICAgICAgIGlmIChtZXRhZGF0YUNsYXNzTmFtZS5zdGFydHNXaXRoKCJvcmFjbGUuIikKKyAgICAgICAgICAgICAgICB8fCB1cmwuaW5kZXhPZigiamRiYzpvcmFjbGU6IikgIT0gLTEKKyAgICAgICAgICAgICAgICB8fCAiT3JhY2xlIEpEQkMgZHJpdmVyIi5lcXVhbHMoZHJpdmVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXJWZW5kb3IgPSBWRU5ET1JfT1JBQ0xFICsgbWV0YS5nZXREcml2ZXJNYWpvclZlcnNpb24oKQorICAgICAgICAgICAgICAgICAgICArIG1ldGEuZ2V0RHJpdmVyTWlub3JWZXJzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAvLyB3YXJuIHNxbDkyCisgICAgICAgICAgICAgICAgaWYgKG1ldGEuZ2V0RGF0YWJhc2VQcm9kdWN0VmVyc2lvbigpLmluZGV4T2YoIlJlbGVhc2UgOC4iKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoam9pblN5bnRheCA9PSBTWU5UQVhfU1FMOTIgJiYgbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJvcmFjbGUtc3ludGF4IikpOworICAgICAgICAgICAgICAgICAgICBqb2luU3ludGF4ID0gU1lOVEFYX0RBVEFCQVNFOworICAgICAgICAgICAgICAgICAgICBkYXRlVHlwZU5hbWUgPSAiREFURSI7IC8vIGFkZGVkIG9yYWNsZSA5CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFR5cGVOYW1lID0gIkRBVEUiOyAvLyBhZGRlZCBvcmFjbGUgOQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFDbGFzc05hbWUuc3RhcnRzV2l0aCgiY29tLmRkdGVrLiIpCisgICAgICAgICAgICAgICAgfHwgdXJsLmluZGV4T2YoImpkYmM6ZGF0YWRpcmVjdDpvcmFjbGU6IikgIT0gLTEKKyAgICAgICAgICAgICAgICB8fCAiT3JhY2xlIi5lcXVhbHMoZHJpdmVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXJWZW5kb3IgPSBWRU5ET1JfREFUQURJUkVDVCArIG1ldGEuZ2V0RHJpdmVyTWFqb3JWZXJzaW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyBtZXRhLmdldERyaXZlck1pbm9yVmVyc2lvbigpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZHJpdmVyVmVuZG9yID0gVkVORE9SX09USEVSOworICAgICAgICB9CisgICAgICAgIGNhY2hlRHJpdmVyQmVoYXZpb3IoZHJpdmVyVmVuZG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBjb25zdGFudCBmb3IgZHJpdmVycyB3aXRoIGJlaGF2aW9ycyB3ZSBoYXZlIHRvIGRlYWwgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FjaGVEcml2ZXJCZWhhdmlvcihTdHJpbmcgZHJpdmVyVmVuZG9yKSB7CisgICAgICAgIGlmIChfZHJpdmVyQmVoYXZpb3IgIT0gLTEpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZHJpdmVyVmVuZG9yID0gZHJpdmVyVmVuZG9yLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGlmIChkcml2ZXJWZW5kb3Iuc3RhcnRzV2l0aChWRU5ET1JfT1JBQ0xFKSkKKyAgICAgICAgICAgIF9kcml2ZXJCZWhhdmlvciA9IEJFSEFWRV9PUkFDTEU7CisgICAgICAgIGVsc2UgaWYgKGRyaXZlclZlbmRvci5lcXVhbHMoVkVORE9SX0RBVEFESVJFQ1QgKyAiMzAiKQorICAgICAgICAgICAgfHwgZHJpdmVyVmVuZG9yLmVxdWFscyhWRU5ET1JfREFUQURJUkVDVCArICIzMSIpKQorICAgICAgICAgICAgX2RyaXZlckJlaGF2aW9yID0gQkVIQVZFX0RBVEFESVJFQ1QzMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RyaXZlckJlaGF2aW9yID0gQkVIQVZFX09USEVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IHRoZSBkcml2ZXIgdmVuZG9yIGhhcyBiZWVuIHNldCwgYW5kIGlmIG5vdCwgc2V0IGl0IG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbnN1cmVEcml2ZXJWZW5kb3IoKSB7CisgICAgICAgIGlmIChkcml2ZXJWZW5kb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVEcml2ZXJCZWhhdmlvcihkcml2ZXJWZW5kb3IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgib3JhY2xlLWNvbm5lY3RpbmctZm9yLWRyaXZlciIpKTsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm4gPSBjb25mLmdldERhdGFTb3VyY2UyKG51bGwpLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm5lY3RlZENvbmZpZ3VyYXRpb24oY29ubik7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgU1FMRXhjZXB0aW9ucy5nZXRTdG9yZShzZSwgdGhpcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xvY2tpbmcoU2VsZWN0IHNlbCkgeworICAgICAgICBpZiAoIXN1cGVyLnN1cHBvcnRzTG9ja2luZyhzZWwpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gIXJlcXVpcmVzU3Vic2VsZWN0Rm9yUmFuZ2Uoc2VsLmdldFN0YXJ0SW5kZXgoKSwKKyAgICAgICAgICAgIHNlbC5nZXRFbmRJbmRleCgpLCBzZWwuaXNEaXN0aW5jdCgpLCBzZWwuZ2V0T3JkZXJpbmcoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNRTEJ1ZmZlciBnZXRTZWxlY3RzKFNlbGVjdCBzZWwsIGJvb2xlYW4gZGlzdGluY3RJZGVudGlmaWVycywKKyAgICAgICAgYm9vbGVhbiBmb3JVcGRhdGUpIHsKKyAgICAgICAgLy8gaWYgcmFuZ2UgZG9lc24ndCByZXF1aXJlIGEgc3Vic2VsZWN0IGNhbiB1c2Ugc3VwZXIKKyAgICAgICAgaWYgKCFyZXF1aXJlc1N1YnNlbGVjdEZvclJhbmdlKHNlbC5nZXRTdGFydEluZGV4KCksCisgICAgICAgICAgICBzZWwuZ2V0RW5kSW5kZXgoKSwgc2VsLmlzRGlzdGluY3QoKSwgc2VsLmdldE9yZGVyaW5nKCkpKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdHMoc2VsLCBkaXN0aW5jdElkZW50aWZpZXJzLCBmb3JVcGRhdGUpOworCisgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBqb2lucyBpbnZvbHZlZCBvciB3ZSdyZSB1c2luZyBhIGZyb20gc2VsZWN0IHNvCisgICAgICAgIC8vIHRoYXQgYWxsIGNvbHMgYWxyZWFkeSBoYXZlIHVuaXF1ZSBhbGlhc2VzLCBjYW4gdXNlIHN1cGVyCisgICAgICAgIGlmIChzZWwuZ2V0RnJvbVNlbGVjdCgpICE9IG51bGwgfHwgc2VsLmdldFRhYmxlQWxpYXNlcygpLnNpemUoKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U2VsZWN0cyhzZWwsIGRpc3RpbmN0SWRlbnRpZmllcnMsIGZvclVwZGF0ZSk7CisKKyAgICAgICAgLy8gc2luY2Ugbm9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSB3ZXJlIG1ldCwgd2UncmUgZGVhbGluZyB3aXRoCisgICAgICAgIC8vIGEgc2VsZWN0IHRoYXQgdXNlcyBqb2lucyBhbmQgcmVxdWlyZXMgc3Vic2VsZWN0cyB0byBzZWxlY3QgdGhlCisgICAgICAgIC8vIHByb3BlciByYW5nZTsgYWxpYXMgYWxsIGNvbHVtbiB2YWx1ZXMgc28gdGhhdCB0aGV5IGFyZSB1bmlxdWUgd2l0aGluCisgICAgICAgIC8vIHRoZSBzdWJzZWxlY3QKKyAgICAgICAgU1FMQnVmZmVyIHNlbGVjdFNRTCA9IG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgICAgIExpc3QgYWxpYXNlczsKKyAgICAgICAgaWYgKGRpc3RpbmN0SWRlbnRpZmllcnMpCisgICAgICAgICAgICBhbGlhc2VzID0gc2VsLmdldElkZW50aWZpZXJBbGlhc2VzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFsaWFzZXMgPSBzZWwuZ2V0U2VsZWN0QWxpYXNlcygpOworCisgICAgICAgIE9iamVjdCBhbGlhczsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGFsaWFzZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgaSsrKSB7CisgICAgICAgICAgICBhbGlhcyA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYWxpYXMgaW5zdGFuY2VvZiBTUUxCdWZmZXIpCisgICAgICAgICAgICAgICAgc2VsZWN0U1FMLmFwcGVuZCgoU1FMQnVmZmVyKSBhbGlhcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2VsZWN0U1FMLmFwcGVuZChhbGlhcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNlbGVjdFNRTC5hcHBlbmQoIiBBUyBjIikuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIGlmIChpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHNlbGVjdFNRTC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGVjdFNRTDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5PdXRlckpvaW4oaW50IHN5bnRheCwgRm9yZWlnbktleSBmaykgeworICAgICAgICBpZiAoIXN1cGVyLmNhbk91dGVySm9pbihzeW50YXgsIGZrKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGZrICE9IG51bGwgJiYgc3ludGF4ID09IFNZTlRBWF9EQVRBQkFTRSkgeworICAgICAgICAgICAgaWYgKGZrLmdldENvbnN0YW50cygpLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKGZrLmdldFByaW1hcnlLZXlDb25zdGFudHMoKS5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMQnVmZmVyIHRvTmF0aXZlSm9pbihKb2luIGpvaW4pIHsKKyAgICAgICAgaWYgKGpvaW4uZ2V0VHlwZSgpICE9IEpvaW4uVFlQRV9PVVRFUikKKyAgICAgICAgICAgIHJldHVybiB0b1RyYWRpdGlvbmFsSm9pbihqb2luKTsKKworICAgICAgICBGb3JlaWduS2V5IGZrID0gam9pbi5nZXRGb3JlaWduS2V5KCk7CisgICAgICAgIGlmIChmayA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYm9vbGVhbiBpbnZlcnNlID0gam9pbi5pc0ZvcmVpZ25LZXlJbnZlcnNlZCgpOworICAgICAgICBDb2x1bW5bXSBmcm9tID0gKGludmVyc2UpID8gZmsuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKQorICAgICAgICAgICAgOiBmay5nZXRDb2x1bW5zKCk7CisgICAgICAgIENvbHVtbltdIHRvID0gKGludmVyc2UpID8gZmsuZ2V0Q29sdW1ucygpCisgICAgICAgICAgICA6IGZrLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisKKyAgICAgICAgLy8gZG8gY29sdW1uIGpvaW5zCisgICAgICAgIFNRTEJ1ZmZlciBidWYgPSBuZXcgU1FMQnVmZmVyKHRoaXMpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyb20ubGVuZ3RoOyBpKyssIGNvdW50KyspIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoam9pbi5nZXRBbGlhczEoKSkuYXBwZW5kKCIuIikuYXBwZW5kKGZyb21baV0pOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiID0gIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGpvaW4uZ2V0QWxpYXMyKCkpLmFwcGVuZCgiLiIpLmFwcGVuZCh0b1tpXSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIoKykiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGNvbnN0YW50IGpvaW5zCisgICAgICAgIGlmIChmay5nZXRDb25zdGFudENvbHVtbnMoKS5sZW5ndGggPiAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKF9sb2MuZ2V0KCJvcmFjbGUtY29uc3RhbnQiLAorICAgICAgICAgICAgICAgIGpvaW4uZ2V0VGFibGUxKCksIGpvaW4uZ2V0VGFibGUyKCkpKS5zZXRGYXRhbCh0cnVlKTsKKworICAgICAgICBpZiAoZmsuZ2V0Q29uc3RhbnRQcmltYXJ5S2V5Q29sdW1ucygpLmxlbmd0aCA+IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oX2xvYy5nZXQoIm9yYWNsZS1jb25zdGFudCIsCisgICAgICAgICAgICAgICAgam9pbi5nZXRUYWJsZTEoKSwgam9pbi5nZXRUYWJsZTIoKSkpLnNldEZhdGFsKHRydWUpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3QoU1FMQnVmZmVyIHNlbGVjdCwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgU1FMQnVmZmVyIHRhYmxlcywgU1FMQnVmZmVyIHdoZXJlLCBTUUxCdWZmZXIgZ3JvdXAsCisgICAgICAgIFNRTEJ1ZmZlciBoYXZpbmcsIFNRTEJ1ZmZlciBvcmRlciwKKyAgICAgICAgYm9vbGVhbiBkaXN0aW5jdCwgYm9vbGVhbiBmb3JVcGRhdGUsIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIGlmICghX2NoZWNrZWRVcGRhdGVCdWcpIHsKKyAgICAgICAgICAgIGVuc3VyZURyaXZlclZlbmRvcigpOworICAgICAgICAgICAgaWYgKGZvclVwZGF0ZSAmJiBfZHJpdmVyQmVoYXZpb3IgPT0gQkVIQVZFX0RBVEFESVJFQ1QzMSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgiZGQtbG9jay1idWciKSk7CisgICAgICAgICAgICBfY2hlY2tlZFVwZGF0ZUJ1ZyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBubyByYW5nZSwgdXNlIHN0YW5kYXJkIHNlbGVjdAorICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TZWxlY3Qoc2VsZWN0LCBmZXRjaCwgdGFibGVzLCB3aGVyZSwgZ3JvdXAsIGhhdmluZywKKyAgICAgICAgICAgICAgICBvcmRlciwgZGlzdGluY3QsIGZvclVwZGF0ZSwgMCwgTG9uZy5NQVhfVkFMVUUpOworCisgICAgICAgIC8vIGlmIG5vIHNraXAsIG9yZGVyaW5nLCBvciBkaXN0aW5jdCBjYW4gdXNlIHJvd251bSBkaXJlY3RseQorICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcih0aGlzKTsKKyAgICAgICAgaWYgKCFyZXF1aXJlc1N1YnNlbGVjdEZvclJhbmdlKHN0YXJ0LCBlbmQsIGRpc3RpbmN0LCBvcmRlcikpIHsKKyAgICAgICAgICAgIGlmICh3aGVyZSAhPSBudWxsICYmICF3aGVyZS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh3aGVyZSkuYXBwZW5kKCIgQU5EICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiUk9XTlVNIDw9ICIpLmFwcGVuZFZhbHVlKGVuZCk7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TZWxlY3Qoc2VsZWN0LCBmZXRjaCwgdGFibGVzLCBidWYsIGdyb3VwLCBoYXZpbmcsCisgICAgICAgICAgICAgICAgb3JkZXIsIGRpc3RpbmN0LCBmb3JVcGRhdGUsIDAsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIG9yZGVyaW5nLCBza2lwLCBvciBkaXN0aW5jdCB3ZSBoYXZlIHRvIHVzZSBzdWJzZWxlY3RzCisgICAgICAgIFNRTEJ1ZmZlciBzZWwgPSBzdXBlci50b1NlbGVjdChzZWxlY3QsIGZldGNoLCB0YWJsZXMsIHdoZXJlLAorICAgICAgICAgICAgZ3JvdXAsIGhhdmluZywgb3JkZXIsIGRpc3RpbmN0LCBmb3JVcGRhdGUsIDAsIExvbmcuTUFYX1ZBTFVFKTsKKworICAgICAgICAvLyBpZiBubyBza2lwLCBjYW4gdXNlIHNpbmdsZSBuZXN0ZWQgc3Vic2VsZWN0CisgICAgICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGdldFNlbGVjdE9wZXJhdGlvbihmZXRjaCkgKyAiICogRlJPTSAoIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKHNlbCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIFdIRVJFIFJPV05VTSA8PSAiKS5hcHBlbmRWYWx1ZShlbmQpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdpdGggYSBza2lwLCB3ZSBoYXZlIHRvIHVzZSBhIGRvdWJsZS1uZXN0ZWQgc3Vic2VsZWN0IHRvIHB1dAorICAgICAgICAvLyB3aGVyZSBjb25kaXRpb25zIG9uIHRoZSByb3dudW0KKyAgICAgICAgYnVmLmFwcGVuZChnZXRTZWxlY3RPcGVyYXRpb24oZmV0Y2gpCisgICAgICAgICAgICArICIgKiBGUk9NIChTRUxFQ1Qgci4qLCBST1dOVU0gUk5VTSBGUk9NICgiKTsKKyAgICAgICAgYnVmLmFwcGVuZChzZWwpOworICAgICAgICBidWYuYXBwZW5kKCIpIHIiKTsKKyAgICAgICAgaWYgKGVuZCAhPSBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBXSEVSRSBST1dOVU0gPD0gIikuYXBwZW5kVmFsdWUoZW5kKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKSBXSEVSRSBSTlVNID4gIikuYXBwZW5kVmFsdWUoc3RhcnQpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBzZWxlY3Qgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBuZWVkcyBhCisgICAgICogc3Vic2VsZWN0IHRvIGFwcGx5IGEgcmFuZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzU3Vic2VsZWN0Rm9yUmFuZ2UobG9uZyBzdGFydCwgbG9uZyBlbmQsCisgICAgICAgIGJvb2xlYW4gZGlzdGluY3QsIFNRTEJ1ZmZlciBvcmRlcikgeworICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdGFydCAhPSAwIHx8IGRpc3RpbmN0IHx8IChvcmRlciAhPSBudWxsICYmICFvcmRlci5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHNldCB0aGUge0BsaW5rICNTRUxFQ1RfSElOVH0gaW4gdGhlCisgICAgICogZmV0Y2ggY29uZmlndXJhaXRvbiwgYW5kIGlmIHNvLCBhcHBlbmQgdGhlIE9yYWNoZSBoaW50IGFmdGVyIHRoZQorICAgICAqICJTRUxFQ1QiIHBhcnQgb2YgdGhlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0T3BlcmF0aW9uKEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgT2JqZWN0IGhpbnQgPSBmZXRjaCA9PSBudWxsID8gbnVsbCA6IGZldGNoLmdldEhpbnQoU0VMRUNUX0hJTlQpOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCI7CisgICAgICAgIGlmIChoaW50ICE9IG51bGwpCisgICAgICAgICAgICBzZWxlY3QgKz0gIiAiICsgaGludDsKKyAgICAgICAgcmV0dXJuIHNlbGVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJzdHJpbmcoU1FMQnVmZmVyIGJ1ZiwgRmlsdGVyVmFsdWUgc3RyLCBGaWx0ZXJWYWx1ZSBzdGFydCwKKyAgICAgICAgRmlsdGVyVmFsdWUgZW5kKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlNVQlNUUigiKTsKKyAgICAgICAgc3RyLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgKCIpOworICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgKyAxKSIpOworICAgICAgICBpZiAoZW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgKCIpOworICAgICAgICAgICAgZW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAiKTsKKyAgICAgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhQcmVwYXJlZFN0YXRlbWVudCBzdG1udCwgaW50IGlkeCwgU3RyaW5nIHZhbCwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG9yYWNsZSBOQ0hBUi9OVkFSQ0hBUi9OQ0xPQiB1bmljb2RlIGNvbHVtbnMgcmVxdWlyZSBzb21lCisgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgdG8gY29uZmlndXJlIHRoZW0gY29ycmVjdGx5OyBzZWU6CisgICAgICAgIC8vIGh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobm9sb2d5L3NhbXBsZV9jb2RlL3RlY2gvamF2YS8KKyAgICAgICAgLy8gc3Fsal9qZGJjL2ZpbGVzLzlpX2pkYmMvTkNIQVJzdXBwb3J0NFVuaWNvZGVTYW1wbGUvUmVhZG1lLmh0bWwKKyAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gKGNvbCA9PSBudWxsKSA/IG51bGwgOiBjb2wuZ2V0VHlwZU5hbWUoKTsKKyAgICAgICAgaWYgKHVzZVNldEZvcm1PZlVzZUZvclVuaWNvZGUgJiYgdHlwZU5hbWUgIT0gbnVsbCAmJgorICAgICAgICAgICAgKHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgibnZhcmNoYXIiKSB8fAorICAgICAgICAgICAgICAgIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgibmNoYXIiKSB8fAorICAgICAgICAgICAgICAgIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgibmNsb2IiKSkpIHsKKyAgICAgICAgICAgIFN0YXRlbWVudCBpbm5lciA9IHN0bW50OworICAgICAgICAgICAgaWYgKGlubmVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50KQorICAgICAgICAgICAgICAgIGlubmVyID0gKChEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQpIGlubmVyKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgICAgIGlmIChpc09yYWNsZVByZXBhcmVkU3RhdGVtZW50KGlubmVyKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlubmVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRGb3JtT2ZVc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcywgc2hvcnQuY2xhc3MgfSkuCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2UoaW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihpZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm9yYWNsZS5qZGJjLk9yYWNsZVByZXBhcmVkU3RhdGVtZW50IikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZCgiRk9STV9OQ0hBUiIpLmdldChudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghX3dhcm5lZE5jaGFyQ29sdW1uICYmIGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBfd2FybmVkTmNoYXJDb2x1bW4gPSB0cnVlOworICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJ1bmNvbmZpZ3VyZWQtbmNoYXItY29scyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbGwgc2V0Rml4ZWRDSEFSIGZvciBmaXhlZCB3aWR0aCBjaGFyYWN0ZXIgY29sdW1ucyB0byBnZXQgcGFkZGluZworICAgICAgICAvLyBzZW1hbnRpY3MKKyAgICAgICAgaWYgKGNvbCAhPSBudWxsICYmIGNvbC5nZXRUeXBlKCkgPT0gVHlwZXMuQ0hBUgorICAgICAgICAgICAgJiYgdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IGNvbC5nZXRTaXplKCkpIHsKKyAgICAgICAgICAgIFN0YXRlbWVudCBpbm5lciA9IHN0bW50OworICAgICAgICAgICAgaWYgKGlubmVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50KQorICAgICAgICAgICAgICAgIGlubmVyID0gKChEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQpIGlubmVyKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgICAgIGlmIChpc09yYWNsZVByZXBhcmVkU3RhdGVtZW50KGlubmVyKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlubmVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRGaXhlZENIQVIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcywgU3RyaW5nLmNsYXNzIH0pLgorICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlKGlubmVyLCBuZXcgT2JqZWN0W117IG5ldyBJbnRlZ2VyKGlkeCksIHZhbCB9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfd2FybmVkQ2hhckNvbHVtbiAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgX3dhcm5lZENoYXJDb2x1bW4gPSB0cnVlOworICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJ1bnBhZGRlZC1jaGFyLWNvbHMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0U3RyaW5nKHN0bW50LCBpZHgsIHZhbCwgY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBpbnQgaWR4LCBpbnQgY29sVHlwZSwKKyAgICAgICAgQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb2xUeXBlID09IFR5cGVzLkJMT0IgJiYgX2RyaXZlckJlaGF2aW9yID09IEJFSEFWRV9PUkFDTEUpCisgICAgICAgICAgICBzdG1udC5zZXRCbG9iKGlkeCwgZ2V0RW1wdHlCbG9iKCkpOworICAgICAgICBlbHNlIGlmIChjb2xUeXBlID09IFR5cGVzLkNMT0IgJiYgX2RyaXZlckJlaGF2aW9yID09IEJFSEFWRV9PUkFDTEUpCisgICAgICAgICAgICBzdG1udC5zZXRDbG9iKGlkeCwgZ2V0RW1wdHlDbG9iKCkpOworICAgICAgICBlbHNlIGlmICgoY29sVHlwZSA9PSBUeXBlcy5TVFJVQ1QgfHwgY29sVHlwZSA9PSBUeXBlcy5PVEhFUikKKyAgICAgICAgICAgICYmIGNvbCAhPSBudWxsICYmIGNvbC5nZXRUeXBlTmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICBzdG1udC5zZXROdWxsKGlkeCwgVHlwZXMuU1RSVUNULCBjb2wuZ2V0VHlwZU5hbWUoKSk7CisgICAgICAgICAgICAvLyBzb21lIHZlcnNpb25zIG9mIHRoZSBPcmFjbGUgSkRCQyBkcml2ZXIgd2lsbCBmYWlsIGlmIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIHNldE51bGwgd2l0aCBEQVRFOyBzZWUgYnVnICMxMTcxCisgICAgICAgIGVsc2UgaWYgKGNvbFR5cGUgPT0gVHlwZXMuREFURSkKKyAgICAgICAgICAgIHN1cGVyLnNldE51bGwoc3RtbnQsIGlkeCwgVHlwZXMuVElNRVNUQU1QLCBjb2wpOworICAgICAgICAvLyB0aGUgT3JhY2xlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IFR5cGVzLk9USEVSIHdpdGggc2V0TnVsbAorICAgICAgICBlbHNlIGlmIChjb2xUeXBlID09IFR5cGVzLk9USEVSKQorICAgICAgICAgICAgc3VwZXIuc2V0TnVsbChzdG1udCwgaWR4LCBUeXBlcy5OVUxMLCBjb2wpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdXBlci5zZXROdWxsKHN0bW50LCBpZHgsIGNvbFR5cGUsIGNvbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDbG9iU3RyaW5nKFJlc3VsdFNldCBycywgaW50IGNvbHVtbikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZHJpdmVyQmVoYXZpb3IgIT0gQkVIQVZFX09SQUNMRSkKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDbG9iU3RyaW5nKHJzLCBjb2x1bW4pOworCisgICAgICAgIENsb2IgY2xvYiA9IGdldENsb2IocnMsIGNvbHVtbik7CisgICAgICAgIGlmIChjbG9iID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGNsb2IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJvcmFjbGUuc3FsLkNMT0IiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoKChCb29sZWFuKSBDbGFzcy5mb3JOYW1lKCJvcmFjbGUuc3FsLkNMT0IiKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0TWV0aG9kKCJpc0VtcHR5TG9iIiwgbmV3IENsYXNzWzBdKS4KKyAgICAgICAgICAgICAgICAgICAgaW52b2tlKGNsb2IsIG5ldyBPYmplY3RbMF0pKS4KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBwb3NzaWJseSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsb2IubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHVubGlrZWx5IHRoYXQgd2UnbGwgaGF2ZSBzdHJpbmdzIG92ZXIgNCBiaWxsaW9uIGNoYXJzCisgICAgICAgIHJldHVybiBjbG9iLmdldFN1YlN0cmluZygxLCAoaW50KSBjbG9iLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4sIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGltZXN0YW1wKHJzLCBjb2x1bW4sIGNhbCk7CisgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWUpIHsKKyAgICAgICAgICAgICAgICAvLyBDUjI5NTYwNDogaXNzdWUgYSB3YXJuaW5nIHRoaXMgdGhpcyBidWcgY2FuIGJlIGdvdHRlbgorICAgICAgICAgICAgICAgIC8vIGFyb3VuZCB3aXRoIFN1cHBvcnRzVGltZXN0YW1wTmFub3M9ZmFsc2UKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgib3JhY2xlLXRpbWVzdGFtcC1idWciKSwgYWUpOworICAgICAgICAgICAgICAgIHRocm93IGFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIE9yYWNsZSBidWcgd2hlcmUgbmFub3Mgbm90IHJldHVybmVkIGZyb20gY2FsbCB3aXRoIENhbGVuZGFyCisgICAgICAgIC8vIHBhcmFtZXRlcgorICAgICAgICBUaW1lc3RhbXAgdHMgPSBycy5nZXRUaW1lc3RhbXAoY29sdW1uLCBjYWwpOworICAgICAgICBpZiAodHMgIT0gbnVsbCAmJiB0cy5nZXROYW5vcygpID09IDApCisgICAgICAgICAgICB0cy5zZXROYW5vcyhycy5nZXRUaW1lc3RhbXAoY29sdW1uKS5nZXROYW5vcygpKTsKKyAgICAgICAgcmV0dXJuIHRzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFJlc3VsdFNldCBycywgaW50IGNvbHVtbiwgTWFwIG1hcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJlY2VudCBvcmFjbGUgZHJpdmVycyByZXR1cm4gb3JhY2xlLXNwZWNpZmljIHR5cGVzIGZvciB0aW1lc3RhbXBzCisgICAgICAgIC8vIGFuZCBkYXRlcworICAgICAgICBPYmplY3Qgb2JqID0gc3VwZXIuZ2V0T2JqZWN0KHJzLCBjb2x1bW4sIG1hcCk7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoIm9yYWNsZS5zcWwuREFURSIuZXF1YWxzKG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSkpCisgICAgICAgICAgICBvYmogPSBjb252ZXJ0RnJvbU9yYWNsZVR5cGUob2JqLCAiZGF0ZVZhbHVlIik7CisgICAgICAgIGVsc2UgaWYgKCJvcmFjbGUuc3FsLlRJTUVTVEFNUCIuZXF1YWxzKG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSkpCisgICAgICAgICAgICBvYmogPSBjb252ZXJ0RnJvbU9yYWNsZVR5cGUob2JqLCAidGltZXN0YW1wVmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGFuIG9iamVjdCBmcm9tIGl0cyBwcm9wcmlldGFyeSBPcmFjbGUgdHlwZSB0byB0aGUgc3RhbmRhcmQKKyAgICAgKiBKYXZhIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNvbnZlcnRGcm9tT3JhY2xlVHlwZShPYmplY3Qgb2JqLAorICAgICAgICBTdHJpbmcgY29udmVydE1ldGhvZCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZChjb252ZXJ0TWV0aG9kLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gbS5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHQgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHQpLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBTUUxFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3coU1FMRXhjZXB0aW9uKSB0OworICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbHVtbk5hbWUsIENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBzdXBlci5nZXRDb2x1bW5zKG1ldGEsIGNhdGFsb2csIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSwKKyAgICAgICAgICAgIGNvbHVtbk5hbWUsIGNvbm4pOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBjb2xzICE9IG51bGwgJiYgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmdldFR5cGVOYW1lKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmdldFR5cGVOYW1lKCkudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJUSU1FU1RBTVAiKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuVElNRVNUQU1QKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJCTE9CIi5lcXVhbHNJZ25vcmVDYXNlKGNvbHNbaV0uZ2V0VHlwZU5hbWUoKSkpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRUeXBlKFR5cGVzLkJMT0IpOworICAgICAgICAgICAgZWxzZSBpZiAoIkNMT0IiLmVxdWFsc0lnbm9yZUNhc2UoY29sc1tpXS5nZXRUeXBlTmFtZSgpKQorICAgICAgICAgICAgICAgIHx8ICJOQ0xPQiIuZXF1YWxzSWdub3JlQ2FzZShjb2xzW2ldLmdldFR5cGVOYW1lKCkpKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0VHlwZShUeXBlcy5DTE9CKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJGTE9BVCIuZXF1YWxzSWdub3JlQ2FzZShjb2xzW2ldLmdldFR5cGVOYW1lKCkpKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0VHlwZShUeXBlcy5GTE9BVCk7CisgICAgICAgICAgICBlbHNlIGlmICgiTlZBUkNIQVIiLmVxdWFsc0lnbm9yZUNhc2UoY29sc1tpXS5nZXRUeXBlTmFtZSgpKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuVkFSQ0hBUik7CisgICAgICAgICAgICBlbHNlIGlmICgiTkNIQVIiLmVxdWFsc0lnbm9yZUNhc2UoY29sc1tpXS5nZXRUeXBlTmFtZSgpKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuQ0hBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbHM7CisgICAgfQorCisgICAgcHVibGljIFByaW1hcnlLZXlbXSBnZXRQcmltYXJ5S2V5cyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsCisgICAgICAgIFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiU0VMRUNUIHQwLk9XTkVSIEFTIFRBQkxFX1NDSEVNLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgidDAuVEFCTEVfTkFNRSBBUyBUQUJMRV9OQU1FLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgidDAuQ09MVU1OX05BTUUgQVMgQ09MVU1OX05BTUUsICIpLgorICAgICAgICAgICAgYXBwZW5kKCJ0MC5DT05TVFJBSU5UX05BTUUgQVMgUEtfTkFNRSAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiRlJPTSBBTExfQ09OU19DT0xVTU5TIHQwLCBBTExfQ09OU1RSQUlOVFMgdDEgIikuCisgICAgICAgICAgICBhcHBlbmQoIldIRVJFIHQwLk9XTkVSID0gdDEuT1dORVIgIikuCisgICAgICAgICAgICBhcHBlbmQoIkFORCB0MC5DT05TVFJBSU5UX05BTUUgPSB0MS5DT05TVFJBSU5UX05BTUUgIikuCisgICAgICAgICAgICBhcHBlbmQoIkFORCB0MS5DT05TVFJBSU5UX1RZUEUgPSAnUCciKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgdDAuT1dORVIgPSA/Iik7CisgICAgICAgIGlmICh0YWJsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgdDAuVEFCTEVfTkFNRSA9ID8iKTsKKworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gMTsKKyAgICAgICAgICAgIGlmIChzY2hlbWFOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2V0U3RyaW5nKHN0bW50LCBpZHgrKywgc2NoZW1hTmFtZS50b1VwcGVyQ2FzZSgpLCBudWxsKTsKKyAgICAgICAgICAgIGlmICh0YWJsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXRTdHJpbmcoc3RtbnQsIGlkeCsrLCB0YWJsZU5hbWUudG9VcHBlckNhc2UoKSwgbnVsbCk7CisKKyAgICAgICAgICAgIHJzID0gc3RtbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICBMaXN0IHBrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHdoaWxlIChycyAhPSBudWxsICYmIHJzLm5leHQoKSkKKyAgICAgICAgICAgICAgICBwa0xpc3QuYWRkKG5ld1ByaW1hcnlLZXkocnMpKTsKKyAgICAgICAgICAgIHJldHVybiAoUHJpbWFyeUtleVtdKSBwa0xpc3QudG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgUHJpbWFyeUtleVtwa0xpc3Quc2l6ZSgpXSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG1udC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJbmRleFtdIGdldEluZGV4SW5mbyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgYm9vbGVhbiB1bmlxdWUsIGJvb2xlYW4gYXBwcm94LAorICAgICAgICBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJTRUxFQ1QgdDAuSU5ERVhfT1dORVIgQVMgVEFCTEVfU0NIRU0sICIpLgorICAgICAgICAgICAgYXBwZW5kKCJ0MC5UQUJMRV9OQU1FIEFTIFRBQkxFX05BTUUsICIpLgorICAgICAgICAgICAgYXBwZW5kKCJERUNPREUodDEuVU5JUVVFTkVTUywgJ1VOSVFVRScsIDAsICdOT05VTklRVUUnLCAxKSAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiQVMgTk9OX1VOSVFVRSwgIikuCisgICAgICAgICAgICBhcHBlbmQoInQwLklOREVYX05BTUUgQVMgSU5ERVhfTkFNRSwgIikuCisgICAgICAgICAgICBhcHBlbmQoInQwLkNPTFVNTl9OQU1FIEFTIENPTFVNTl9OQU1FICIpLgorICAgICAgICAgICAgYXBwZW5kKCJGUk9NIEFMTF9JTkRfQ09MVU1OUyB0MCwgQUxMX0lOREVYRVMgdDEgIikuCisgICAgICAgICAgICBhcHBlbmQoIldIRVJFIHQwLklOREVYX09XTkVSID0gdDEuT1dORVIgIikuCisgICAgICAgICAgICBhcHBlbmQoIkFORCB0MC5JTkRFWF9OQU1FID0gdDEuSU5ERVhfTkFNRSIpOworICAgICAgICBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCB0MC5UQUJMRV9PV05FUiA9ID8iKTsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCB0MC5UQUJMRV9OQU1FID0gPyIpOworCisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KGJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBpZHggPSAxOworICAgICAgICAgICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXRTdHJpbmcoc3RtbnQsIGlkeCsrLCBzY2hlbWFOYW1lLnRvVXBwZXJDYXNlKCksIG51bGwpOworICAgICAgICAgICAgaWYgKHRhYmxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNldFN0cmluZyhzdG1udCwgaWR4KyssIHRhYmxlTmFtZS50b1VwcGVyQ2FzZSgpLCBudWxsKTsKKworICAgICAgICAgICAgcnMgPSBzdG1udC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgIExpc3QgaWR4TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHdoaWxlIChycyAhPSBudWxsICYmIHJzLm5leHQoKSkKKyAgICAgICAgICAgICAgICBpZHhMaXN0LmFkZChuZXdJbmRleChycykpOworICAgICAgICAgICAgcmV0dXJuIChJbmRleFtdKSBpZHhMaXN0LnRvQXJyYXkobmV3IEluZGV4W2lkeExpc3Quc2l6ZSgpXSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG1udC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGb3JlaWduS2V5W10gZ2V0SW1wb3J0ZWRLZXlzKERhdGFiYXNlTWV0YURhdGEgbWV0YSwgU3RyaW5nIGNhdGFsb2csCisgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgZGVsQWN0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigiREVDT0RFKHQxLkRFTEVURV9SVUxFIikuCisgICAgICAgICAgICBhcHBlbmQoIiwgJ05PIEFDVElPTicsICIpLmFwcGVuZChtZXRhLmltcG9ydGVkS2V5Tm9BY3Rpb24pLgorICAgICAgICAgICAgYXBwZW5kKCIsICdSRVNUUklDVCcsICIpLmFwcGVuZChtZXRhLmltcG9ydGVkS2V5UmVzdHJpY3QpLgorICAgICAgICAgICAgYXBwZW5kKCIsICdDQVNDQURFJywgIikuYXBwZW5kKG1ldGEuaW1wb3J0ZWRLZXlDYXNjYWRlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCAnU0VUIE5VTEwnLCAiKS5hcHBlbmQobWV0YS5pbXBvcnRlZEtleVNldE51bGwpLgorICAgICAgICAgICAgYXBwZW5kKCIsICdTRVQgREVGQVVMVCcsICIpLmFwcGVuZChtZXRhLmltcG9ydGVkS2V5U2V0RGVmYXVsdCkuCisgICAgICAgICAgICBhcHBlbmQoIikiKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJTRUxFQ1QgdDIuT1dORVIgQVMgUEtUQUJMRV9TQ0hFTSwgIikuCisgICAgICAgICAgICBhcHBlbmQoInQyLlRBQkxFX05BTUUgQVMgUEtUQUJMRV9OQU1FLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgidDIuQ09MVU1OX05BTUUgQVMgUEtDT0xVTU5fTkFNRSwgIikuCisgICAgICAgICAgICBhcHBlbmQoInQwLk9XTkVSIEFTIEZLVEFCTEVfU0NIRU0sICIpLgorICAgICAgICAgICAgYXBwZW5kKCJ0MC5UQUJMRV9OQU1FIEFTIEZLVEFCTEVfTkFNRSwgIikuCisgICAgICAgICAgICBhcHBlbmQoInQwLkNPTFVNTl9OQU1FIEFTIEZLQ09MVU1OX05BTUUsICIpLgorICAgICAgICAgICAgYXBwZW5kKCJ0MC5QT1NJVElPTiBBUyBLRVlfU0VRLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZChkZWxBY3Rpb24pLmFwcGVuZCgiIEFTIERFTEVURV9SVUxFLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgidDAuQ09OU1RSQUlOVF9OQU1FIEFTIEZLX05BTUUsICIpLgorICAgICAgICAgICAgYXBwZW5kKCJERUNPREUodDEuREVGRVJSRUQsICdERUZFUlJFRCcsICIpLgorICAgICAgICAgICAgYXBwZW5kKG1ldGEuaW1wb3J0ZWRLZXlJbml0aWFsbHlEZWZlcnJlZCkuCisgICAgICAgICAgICBhcHBlbmQoIiwgJ0lNTUVESUFURScsICIpLgorICAgICAgICAgICAgYXBwZW5kKG1ldGEuaW1wb3J0ZWRLZXlJbml0aWFsbHlJbW1lZGlhdGUpLgorICAgICAgICAgICAgYXBwZW5kKCIpIEFTIERFRkVSUkFCSUxJVFkgIikuCisgICAgICAgICAgICBhcHBlbmQoIkZST00gQUxMX0NPTlNfQ09MVU1OUyB0MCwgQUxMX0NPTlNUUkFJTlRTIHQxLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiQUxMX0NPTlNfQ09MVU1OUyB0MiAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiV0hFUkUgdDAuT1dORVIgPSB0MS5PV05FUiAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiQU5EIHQwLkNPTlNUUkFJTlRfTkFNRSA9IHQxLkNPTlNUUkFJTlRfTkFNRSAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiQU5EIHQxLkNPTlNUUkFJTlRfVFlQRSA9ICdSJyAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiQU5EIHQxLlJfT1dORVIgPSB0Mi5PV05FUiAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiQU5EIHQxLlJfQ09OU1RSQUlOVF9OQU1FID0gdDIuQ09OU1RSQUlOVF9OQU1FICIpLgorICAgICAgICAgICAgYXBwZW5kKCJBTkQgdDAuUE9TSVRJT04gPSB0Mi5QT1NJVElPTiIpOworICAgICAgICBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCB0MC5PV05FUiA9ID8iKTsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCB0MC5UQUJMRV9OQU1FID0gPyIpOworICAgICAgICBidWYuYXBwZW5kKCIgT1JERVIgQlkgdDIuT1dORVIsIHQyLlRBQkxFX05BTUUsIHQwLlBPU0lUSU9OIik7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGlkeCA9IDE7CisgICAgICAgICAgICBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNldFN0cmluZyhzdG1udCwgaWR4KyssIHNjaGVtYU5hbWUudG9VcHBlckNhc2UoKSwgbnVsbCk7CisgICAgICAgICAgICBpZiAodGFibGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2V0U3RyaW5nKHN0bW50LCBpZHgrKywgdGFibGVOYW1lLnRvVXBwZXJDYXNlKCksIG51bGwpOworCisgICAgICAgICAgICBycyA9IHN0bW50LmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgTGlzdCBma0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAocnMgIT0gbnVsbCAmJiBycy5uZXh0KCkpCisgICAgICAgICAgICAgICAgZmtMaXN0LmFkZChuZXdGb3JlaWduS2V5KHJzKSk7CisgICAgICAgICAgICByZXR1cm4gKEZvcmVpZ25LZXlbXSkgZmtMaXN0LnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IEZvcmVpZ25LZXlbZmtMaXN0LnNpemUoKV0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RtbnQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlVGFibGVTUUwoVGFibGUgdGFibGUpIHsKKyAgICAgICAgLy8gb25seSBvdmVycmlkZSBpZiB3ZSBhcmUgc2ltdWxhdGluZyBhdXRvLWluY3JlbWVuZXQgd2l0aCB0cmlnZ2VycworICAgICAgICBTdHJpbmdbXSBjcmVhdGUgPSBzdXBlci5nZXRDcmVhdGVUYWJsZVNRTCh0YWJsZSk7CisgICAgICAgIGlmICghdXNlVHJpZ2dlcnNGb3JBdXRvQXNzaWduKQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOworICAgICAgICBMaXN0IHNlcXMgPSBudWxsOworICAgICAgICBTdHJpbmcgc2VxLCB0cmlnOworICAgICAgICBmb3IgKGludCBpID0gMDsgY29scyAhPSBudWxsICYmIGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWNvbHNbaV0uaXNBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzZXFzID09IG51bGwpCisgICAgICAgICAgICAgICAgc2VxcyA9IG5ldyBBcnJheUxpc3QoNCk7CisKKyAgICAgICAgICAgIHNlcSA9IGF1dG9Bc3NpZ25TZXF1ZW5jZU5hbWU7CisgICAgICAgICAgICBpZiAoc2VxID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAob3BlbmpwYTNHZW5lcmF0ZWRLZXlOYW1lcykKKyAgICAgICAgICAgICAgICAgICAgc2VxID0gZ2V0T3BlbkpQQTNHZW5lcmF0ZWRLZXlTZXF1ZW5jZU5hbWUoY29sc1tpXSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzZXEgPSBnZXRHZW5lcmF0ZWRLZXlTZXF1ZW5jZU5hbWUoY29sc1tpXSk7CisgICAgICAgICAgICAgICAgc2Vxcy5hZGQoIkNSRUFURSBTRVFVRU5DRSAiICsgc2VxICsgIiBTVEFSVCBXSVRIIDEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGVuanBhM0dlbmVyYXRlZEtleU5hbWVzKQorICAgICAgICAgICAgICAgIHRyaWcgPSBnZXRPcGVuSlBBM0dlbmVyYXRlZEtleVRyaWdnZXJOYW1lKGNvbHNbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRyaWcgPSBnZXRHZW5lcmF0ZWRLZXlUcmlnZ2VyTmFtZShjb2xzW2ldKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB0cmlnZ2VyIHRoYXQgd2lsbCBpbnNlcnQgbmV3IHZhbHVlcyBpbnRvCisgICAgICAgICAgICAvLyB0aGUgdGFibGUgd2hlbmV2ZXIgYSByb3cgaXMgY3JlYXRlZAorICAgICAgICAgICAgc2Vxcy5hZGQoIkNSRUFURSBPUiBSRVBMQUNFIFRSSUdHRVIgIiArIHRyaWcKKyAgICAgICAgICAgICAgICArICIgQkVGT1JFIElOU0VSVCBPTiAiICsgdGFibGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIEZPUiBFQUNIIFJPVyBCRUdJTiBTRUxFQ1QgIiArIHNlcSArICIubmV4dHZhbCBJTlRPICIKKyAgICAgICAgICAgICAgICArICI6bmV3LiIgKyBjb2xzW2ldLmdldE5hbWUoKSArICIgRlJPTSBEVUFMOyAiCisgICAgICAgICAgICAgICAgKyAiRU5EICIgKyB0cmlnICsgIjsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VxcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZTsKKworICAgICAgICAvLyBjb21iaW5lIGNyZWF0ZSB0YWJsZSBzcWwgYW5kIGNyZWF0ZSBzZXFlbmNlcyBzcWwKKyAgICAgICAgU3RyaW5nW10gc3FsID0gbmV3IFN0cmluZ1tjcmVhdGUubGVuZ3RoICsgc2Vxcy5zaXplKCldOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNyZWF0ZSwgMCwgc3FsLCAwLCBjcmVhdGUubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3FsW2NyZWF0ZS5sZW5ndGggKyBpXSA9IChTdHJpbmcpIHNlcXMuZ2V0KGkpOworICAgICAgICByZXR1cm4gc3FsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDcmVhdGVTZXF1ZW5jZVNRTChTZXF1ZW5jZSBzZXEpIHsKKyAgICAgICAgU3RyaW5nW10gc3FsID0gc3VwZXIuZ2V0Q3JlYXRlU2VxdWVuY2VTUUwoc2VxKTsKKyAgICAgICAgaWYgKHNlcS5nZXRBbGxvY2F0ZSgpID4gMSkKKyAgICAgICAgICAgIHNxbFswXSArPSAiIENBQ0hFICIgKyBzZXEuZ2V0QWxsb2NhdGUoKTsKKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcXVlbmNlc1NRTChTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHNlcXVlbmNlTmFtZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJTRUxFQ1QgU0VRVUVOQ0VfT1dORVIgQVMgU0VRVUVOQ0VfU0NIRU1BLCAiKS4KKyAgICAgICAgICAgIGFwcGVuZCgiU0VRVUVOQ0VfTkFNRSBGUk9NIEFMTF9TRVFVRU5DRVMiKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCB8fCBzZXF1ZW5jZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBXSEVSRSAiKTsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiU0VRVUVOQ0VfT1dORVIgPSA/Iik7CisgICAgICAgICAgICBpZiAoc2VxdWVuY2VOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VxdWVuY2VOYW1lICE9IG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKCJTRVFVRU5DRV9OQU1FID0gPyIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1TZXF1ZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNjaGVtYSwKKyAgICAgICAgYm9vbGVhbiB0YXJnZXRTY2hlbWEpIHsKKyAgICAgICAgaWYgKHN1cGVyLmlzU3lzdGVtU2VxdWVuY2UobmFtZSwgc2NoZW1hLCB0YXJnZXRTY2hlbWEpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gZmlsdGVyIG91dCBnZW5lcmF0ZWQgc2VxdWVuY2VzIHVzZWQgZm9yIGF1dG8tYXNzaWduCisgICAgICAgIHJldHVybiAoYXV0b0Fzc2lnblNlcXVlbmNlTmFtZSAhPSBudWxsCisgICAgICAgICAgICAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoYXV0b0Fzc2lnblNlcXVlbmNlTmFtZSkpCisgICAgICAgICAgICB8fCAoYXV0b0Fzc2lnblNlcXVlbmNlTmFtZSA9PSBudWxsCisgICAgICAgICAgICAmJiBuYW1lLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiU1RfIikpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0R2VuZXJhdGVkS2V5KENvbHVtbiBjb2wsIENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghdXNlVHJpZ2dlcnNGb3JBdXRvQXNzaWduKQorICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigwTCk7CisKKyAgICAgICAgLy8gaWYgd2Ugc2ltdWxhdGUgYXV0by1hc3NpZ25lZCBjb2x1bW5zIHVzaW5nIHRyaWdnZXJzIGFuZAorICAgICAgICAvLyBzZXF1ZW5jZXMsIHRoZW4gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZQorICAgICAgICAvLyBmcm9tIGF1dG9Bc3NpZ25TZXF1ZW5jZU5hbWUKKyAgICAgICAgU3RyaW5nIHNlcSA9IGF1dG9Bc3NpZ25TZXF1ZW5jZU5hbWU7CisgICAgICAgIGlmIChzZXEgPT0gbnVsbCAmJiBvcGVuanBhM0dlbmVyYXRlZEtleU5hbWVzKQorICAgICAgICAgICAgc2VxID0gZ2V0T3BlbkpQQTNHZW5lcmF0ZWRLZXlTZXF1ZW5jZU5hbWUoY29sKTsKKyAgICAgICAgZWxzZSBpZiAoc2VxID09IG51bGwpCisgICAgICAgICAgICBzZXEgPSBnZXRHZW5lcmF0ZWRLZXlTZXF1ZW5jZU5hbWUoY29sKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIlNFTEVDVCAiICsgc2VxCisgICAgICAgICAgICArICIuY3VycnZhbCBGUk9NIERVQUwiKTsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJzID0gc3RtbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICBycy5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKHJzLmdldExvbmcoMSkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsgcnMuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorICAgICAgICAgICAgdHJ5IHsgc3RtbnQuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7fQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZ2dlciBuYW1lIGZvciBzaW11bGF0aW5nIGF1dG8tYXNzaWduIHZhbHVlcyBvbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhdGVkS2V5VHJpZ2dlck5hbWUoQ29sdW1uIGNvbCkgeworICAgICAgICAvLyByZXBsYWNlIHRyYWlsaW5nIF9TRVEgd2l0aCBfVFJHCisgICAgICAgIFN0cmluZyBzZXFOYW1lID0gZ2V0R2VuZXJhdGVkS2V5U2VxdWVuY2VOYW1lKGNvbCk7CisgICAgICAgIHJldHVybiBzZXFOYW1lLnN1YnN0cmluZygwLCBzZXFOYW1lLmxlbmd0aCgpIC0gMykgKyAiVFJHIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgT3BlbkpQQSAzLWNvbXBhdGlibGUgbmFtZSBmb3IgYW4gYXV0by1hc3NpZ24gc2VxdWVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3BlbkpQQTNHZW5lcmF0ZWRLZXlTZXF1ZW5jZU5hbWUoQ29sdW1uIGNvbCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IGNvbC5nZXRUYWJsZSgpOworICAgICAgICByZXR1cm4gbWFrZU5hbWVWYWxpZCgiU0VRXyIgKyB0YWJsZS5nZXROYW1lKCksIHRhYmxlLmdldFNjaGVtYSgpLgorICAgICAgICAgICAgZ2V0U2NoZW1hR3JvdXAoKSwgbWF4VGFibGVOYW1lTGVuZ3RoLCBOQU1FX0FOWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIE9wZW5KUEEgMy1jb21wYXRpYmxlIG5hbWUgZm9yIGFuIGF1dG8tYXNzaWduIHRyaWdnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3BlbkpQQTNHZW5lcmF0ZWRLZXlUcmlnZ2VyTmFtZShDb2x1bW4gY29sKSB7CisgICAgICAgIFRhYmxlIHRhYmxlID0gY29sLmdldFRhYmxlKCk7CisgICAgICAgIHJldHVybiBtYWtlTmFtZVZhbGlkKCJUUklHXyIgKyB0YWJsZS5nZXROYW1lKCksIHRhYmxlLmdldFNjaGVtYSgpLgorICAgICAgICAgICAgZ2V0U2NoZW1hR3JvdXAoKSwgbWF4VGFibGVOYW1lTGVuZ3RoLCBOQU1FX0FOWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIE9yYWNsZSdzIDxjb2RlPnB1dEJ5dGVzPC9jb2RlPiBtZXRob2Qgb24gdGhlIGdpdmVuIEJMT0Igb2JqZWN0LgorICAgICAqIFVzZXMgcmVmbGVjdGlvbiBpbiBjYXNlIHRoZSBibG9iIGlzIHdyYXBwZWQgaW4gYW5vdGhlcgorICAgICAqIHZlbmRvci1zcGVjaWZpYyBjbGFzczsgZm9yIGV4YW1wbGUgV2VibG9naWMgd3JhcHMgb3JhY2xlIHRoaW4gZHJpdmVyCisgICAgICogbG9icyBpbiBpdHMgb3duIGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dEJ5dGVzKE9iamVjdCBibG9iLCBieXRlW10gZGF0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChibG9iID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChfcHV0Qnl0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfcHV0Qnl0ZXMgPSBibG9iLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJwdXRCeXRlcyIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBsb25nLmNsYXNzLCBieXRlW10uY2xhc3MgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnZva2VQdXRMb2JNZXRob2QoX3B1dEJ5dGVzLCBibG9iLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgT3JhY2xlJ3MgPGNvZGU+cHV0U3RyaW5nPC9jb2RlPiBtZXRob2Qgb24gdGhlIGdpdmVuIENMT0Igb2JqZWN0LgorICAgICAqIFVzZXMgcmVmbGVjdGlvbiBpbiBjYXNlIHRoZSBjbG9iIGlzIHdyYXBwZWQgaW4gYW5vdGhlcgorICAgICAqIHZlbmRvci1zcGVjaWZpYyBjbGFzczsgZm9yIGV4YW1wbGUgV2VibG9naWMgd3JhcHMgb3JhY2xlIHRoaW4gZHJpdmVyCisgICAgICogbG9icyBpbiBpdHMgb3duIGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dFN0cmluZyhPYmplY3QgY2xvYiwgU3RyaW5nIGRhdGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX3B1dFN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9wdXRTdHJpbmcgPSBjbG9iLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJwdXRTdHJpbmciLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgbG9uZy5jbGFzcywgU3RyaW5nLmNsYXNzIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW52b2tlUHV0TG9iTWV0aG9kKF9wdXRTdHJpbmcsIGNsb2IsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSBPcmFjbGUncyA8Y29kZT5wdXRDaGFyczwvY29kZT4gbWV0aG9kIG9uIHRoZSBnaXZlbiBDTE9CCisgICAgICogb2JqZWN0LiBVc2VzIHJlZmxlY3Rpb24gaW4gY2FzZSB0aGUgY2xvYiBpcyB3cmFwcGVkIGluIGFub3RoZXIKKyAgICAgKiB2ZW5kb3Itc3BlY2lmaWMgY2xhc3M7IGZvciBleGFtcGxlIFdlYmxvZ2ljIHdyYXBzIG9yYWNsZSB0aGluIGRyaXZlcgorICAgICAqIGxvYnMgaW4gaXRzIG93biBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXRDaGFycyhPYmplY3QgY2xvYiwgY2hhcltdIGRhdGEpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoX3B1dENoYXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3B1dENoYXJzID0gY2xvYi5nZXRDbGFzcygpLmdldE1ldGhvZCgicHV0Q2hhcnMiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgbG9uZy5jbGFzcywgY2hhcltdLmNsYXNzIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW52b2tlUHV0TG9iTWV0aG9kKF9wdXRDaGFycywgY2xvYiwgZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBMT0IgbWV0aG9kIG9uIHRoZSBnaXZlbiB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZVB1dExvYk1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgdGFyZ2V0LAorICAgICAgICBPYmplY3QgZGF0YSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKHRhcmdldCwgbmV3IE9iamVjdFtdeyBOdW1iZXJzLnZhbHVlT2YoMUwpLCBkYXRhIH0pOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFNRTEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyhTUUxFeGNlcHRpb24pIHQ7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24odCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbG9iIGdldEVtcHR5Q2xvYigpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoRU1QVFlfQ0xPQiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NMT0I7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQ0xPQiA9IChDbG9iKSBDbGFzcy5mb3JOYW1lKCJvcmFjbGUuc3FsLkNMT0IiKS4KKyAgICAgICAgICAgICAgICBnZXRNZXRob2QoImVtcHR5X2xvYiIsIG5ldyBDbGFzc1swXSkuCisgICAgICAgICAgICAgICAgaW52b2tlKG51bGwsIG5ldyBPYmplY3RbMF0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCbG9iIGdldEVtcHR5QmxvYigpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoRU1QVFlfQkxPQiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JMT0I7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQkxPQiA9IChCbG9iKSBDbGFzcy5mb3JOYW1lKCJvcmFjbGUuc3FsLkJMT0IiKS4KKyAgICAgICAgICAgICAgICBnZXRNZXRob2QoImVtcHR5X2xvYiIsIG5ldyBDbGFzc1swXSkuCisgICAgICAgICAgICAgICAgaW52b2tlKG51bGwsIG5ldyBPYmplY3RbMF0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT3JhY2xlUHJlcGFyZWRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0bW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgib3JhY2xlLmpkYmMuT3JhY2xlUHJlcGFyZWRTdGF0ZW1lbnQiKS4KKyAgICAgICAgICAgICAgICBpc0luc3RhbmNlKHN0bW50KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1BvaW50YmFzZURpY3Rpb25hcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1BvaW50YmFzZURpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYyYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUG9pbnRiYXNlRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5JbmRleDsKKworLyoqCisgKiBEaWN0aW9uYXJ5IGZvciBQb2ludGJhc2UgRW1iZWRkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb2ludGJhc2VEaWN0aW9uYXJ5CisgICAgZXh0ZW5kcyBEQkRpY3Rpb25hcnkgeworCisgICAgcHVibGljIFBvaW50YmFzZURpY3Rpb25hcnkoKSB7CisgICAgICAgIHBsYXRmb3JtID0gIlBvaW50YmFzZSBFbWJlZGRlZCI7CisgICAgICAgIHN1cHBvcnRzRGVmZXJyZWRDb25zdHJhaW50cyA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c011bHRpcGxlTm9udHJhbnNhY3Rpb25hbFJlc3VsdFNldHMgPSBmYWxzZTsKKyAgICAgICAgcmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCA9IHRydWU7CisKKyAgICAgICAgc3VwcG9ydHNMb2NraW5nV2l0aERpc3RpbmN0Q2xhdXNlID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhNdWx0aXBsZVRhYmxlcyA9IGZhbHNlOworICAgICAgICBzdXBwb3J0c0xvY2tpbmdXaXRoRGlzdGluY3RDbGF1c2UgPSBmYWxzZTsKKworICAgICAgICBiaXRUeXBlTmFtZSA9ICJUSU5ZSU5UIjsKKyAgICAgICAgYmxvYlR5cGVOYW1lID0gIkJMT0IoMU0pIjsKKyAgICAgICAgbG9uZ1ZhcmJpbmFyeVR5cGVOYW1lID0gIkJMT0IoMU0pIjsKKyAgICAgICAgY2hhclR5cGVOYW1lID0gIkNIQVJBQ1RFUnswfSI7CisgICAgICAgIGNsb2JUeXBlTmFtZSA9ICJDTE9CKDFNKSI7CisgICAgICAgIGRvdWJsZVR5cGVOYW1lID0gIkRPVUJMRSBQUkVDSVNJT04iOworICAgICAgICBmbG9hdFR5cGVOYW1lID0gIkZMT0FUIjsKKyAgICAgICAgYmlnaW50VHlwZU5hbWUgPSAiQklHSU5UIjsKKyAgICAgICAgaW50ZWdlclR5cGVOYW1lID0gIklOVEVHRVIiOworICAgICAgICByZWFsVHlwZU5hbWUgPSAiUkVBTCI7CisgICAgICAgIHNtYWxsaW50VHlwZU5hbWUgPSAiU01BTExJTlQiOworICAgICAgICB0aW55aW50VHlwZU5hbWUgPSAiVElOWUlOVCI7CisKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gYnVpbGQtaW4gZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGxhc3QgZ2VuZXJhdGVkCisgICAgICAgIC8vIGtleSBpbiBQb2ludGJhc2U7IHVzaW5nIE1BWCB3aWxsIGhhdmUgdG8gc3VmZmljZQorICAgICAgICBzdXBwb3J0c0F1dG9Bc3NpZ24gPSB0cnVlOworICAgICAgICBsYXN0R2VuZXJhdGVkS2V5UXVlcnkgPSAiU0VMRUNUIE1BWCh7MH0pIEZST00gezF9IjsKKyAgICAgICAgYXV0b0Fzc2lnblR5cGVOYW1lID0gIkJJR0lOVCBJREVOVElUWSI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcmVmZXJyZWRUeXBlKGludCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUeXBlcy5MT05HVkFSQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZXMuQ0xPQjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByZWZlcnJlZFR5cGUodHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucyhEYXRhYmFzZU1ldGFEYXRhIG1ldGEsIFN0cmluZyBjYXRhbG9nLAorICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbHVtbk5hbWUsIENvbm5lY3Rpb24gY29ubikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBzdXBlci5nZXRDb2x1bW5zKG1ldGEsIGNhdGFsb2csIHNjaGVtYU5hbWUsIHRhYmxlTmFtZSwKKyAgICAgICAgICAgIGNvbHVtbk5hbWUsIGNvbm4pOworCisgICAgICAgIC8vIHBvaW50YmFzZSByZXBvcnRzIHRoZSB0eXBlIGZvciBhIENMT0IgZmllbGQgYXMgVkFSQ0hBUjogb3ZlcnJpZGUgaXQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNvbHMgIT0gbnVsbCAmJiBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmdldFR5cGVOYW1lKCkudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJDTE9CIikpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRUeXBlKFR5cGVzLkNMT0IpOworICAgICAgICByZXR1cm4gY29sczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKEluZGV4IGluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRGdWxsTmFtZShpbmRleC5nZXRUYWJsZSgpLCBmYWxzZSkgKyAiLiIgKyBpbmRleC5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3Vic3RyaW5nKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgc3RhcnQsCisgICAgICAgIEZpbHRlclZhbHVlIGVuZCkgeworICAgICAgICAvLyBTVUJTVFJJTkcgaW4gUG9pbnRiYXNlIGlzIG9mIHRoZSBmb3JtOgorICAgICAgICAvLyBTRUxFQ1QgU1VCU1RSSU5HKFNPTUVfQ09MVU1OIEZST00gMSBGT1IgNSkKKyAgICAgICAgYnVmLmFwcGVuZCgiU1VCU1RSSU5HKCIpOworICAgICAgICBzdHIuYXBwZW5kVG8oYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIEZST00gIik7CisgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiArIDEiKTsKKyAgICAgICAgaWYgKGVuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgRk9SICIpOworICAgICAgICAgICAgZW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAoIik7CisgICAgICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmRleE9mKFNRTEJ1ZmZlciBidWYsIEZpbHRlclZhbHVlIHN0ciwgRmlsdGVyVmFsdWUgZmluZCwKKyAgICAgICAgRmlsdGVyVmFsdWUgc3RhcnQpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiKFBPU0lUSU9OKCIpOworICAgICAgICBmaW5kLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBJTiAiKTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICBzdWJzdHJpbmcoYnVmLCBzdHIsIHN0YXJ0LCBudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyLmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIikgLSAxIik7CisgICAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIHN0YXJ0LmFwcGVuZFRvKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Bvc3RncmVzRGljdGlvbmFyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUG9zdGdyZXNEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3MGQwYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Bvc3RncmVzRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuZXhwcy5GaWx0ZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlbGVnYXRpbmdDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5EZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBEaWN0aW9uYXJ5IGZvciBQb3N0Z3Jlcy4KKyAqLworcHVibGljIGNsYXNzIFBvc3RncmVzRGljdGlvbmFyeQorICAgIGV4dGVuZHMgREJEaWN0aW9uYXJ5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFBvc3RncmVzRGljdGlvbmFyeS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTUUwgc3RhdGVtZW50IHRvIGxvYWQgYWxsIHNlcXVlbmNlIHNjaGVtYSxuYW1lIHBhaXJzIGZyb20gYWxsIHNjaGVtYXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhbGxTZXF1ZW5jZXNTUUwgPSAiU0VMRUNUIE5VTEwgQVMgU0VRVUVOQ0VfU0NIRU1BLCByZWxuYW1lICIgKworICAgICAgICAiQVMgU0VRVUVOQ0VfTkFNRSBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbGtpbmQ9J1MnIjsKKworICAgIC8qKgorICAgICAqIFNRTCBzdGF0ZW1lbnQgdG8gbG9hZCBzY2hlbWEsbmFtZSBwYWlycyBmb3IgYWxsIHNlcXVlbmNlcyB3aXRoIGEKKyAgICAgKiBjZXJ0YWluIG5hbWUgZnJvbSBhbGwgc2NoZW1hcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5hbWVkU2VxdWVuY2VzRnJvbUFsbFNjaGVtYXNTUUwgPSAiU0VMRUNUIE5VTEwgQVMgIiArCisgICAgICAgICJTRVFVRU5DRV9TQ0hFTUEsIHJlbG5hbWUgQVMgU0VRVUVOQ0VfTkFNRSBGUk9NIHBnX2NsYXNzICIgKworICAgICAgICAiV0hFUkUgcmVsa2luZD0nUycgQU5EIHJlbG5hbWUgPSA/IjsKKworICAgIC8qKgorICAgICAqIFNRTCBzdGF0ZW1lbnQgdG8gbG9hZCBzY2hlbWEsbmFtZSBwYWlycyBmcm9tIGEgbmFtZWQgc2NoZW1hLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWxsU2VxdWVuY2VzRnJvbU9uZVNjaGVtYVNRTCA9ICJTRUxFQ1QgTlVMTCBBUyAiICsKKyAgICAgICAgIlNFUVVFTkNFX1NDSEVNQSwgcmVsbmFtZSBBUyBTRVFVRU5DRV9OQU1FIEZST00gcGdfY2xhc3MsICIgKworICAgICAgICAicGdfbmFtZXNwYWNlIFdIRVJFIHJlbGtpbmQ9J1MnIEFORCBwZ19jbGFzcy5yZWxuYW1lc3BhY2UgPSAiICsKKyAgICAgICAgInBnX25hbWVzcGFjZS5vaWQgQU5EIG5zcG5hbWUgPSA/IjsKKworICAgIC8qKgorICAgICAqIFNRTCBzdGF0ZW1lbnQgdG8gbG9hZCBhIHNlcXVlbmNlJ3Mgc2NoZW1hLG5hbWUgcGFpciBmcm9tIG9uZSBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBuYW1lZFNlcXVlbmNlRnJvbU9uZVNjaGVtYVNRTCA9ICJTRUxFQ1QgTlVMTCBBUyAiICsKKyAgICAgICAgIlNFUVVFTkNFX1NDSEVNQSwgcmVsbmFtZSBBUyBTRVFVRU5DRV9OQU1FIEZST00gcGdfY2xhc3MsICIgKworICAgICAgICAicGdfbmFtZXNwYWNlIFdIRVJFIHJlbGtpbmQ9J1MnIEFORCBwZ19jbGFzcy5yZWxuYW1lc3BhY2UgPSAiICsKKyAgICAgICAgInBnX25hbWVzcGFjZS5vaWQgQU5EIHJlbG5hbWUgPSA/IEFORCBuc3BuYW1lID0gPyI7CisKKyAgICAvKioKKyAgICAgKiBTb21lIFBvc3RncmVzIGRyaXZlcnMgZG8gbm90IHN1cHBvcnQgdGhlIHtAbGluayBTdGF0ZW1lbnQjc2V0RmV0Y2hTaXplfQorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NldEZldGNoU2l6ZSA9IHRydWU7CisKKyAgICBwdWJsaWMgUG9zdGdyZXNEaWN0aW9uYXJ5KCkgeworICAgICAgICBwbGF0Zm9ybSA9ICJQb3N0Z3JlU1FMIjsKKyAgICAgICAgdmFsaWRhdGlvblNRTCA9ICJTRUxFQ1QgTk9XKCkiOworICAgICAgICBkYXRlUHJlY2lzaW9uID0gQ0VOVEk7CisgICAgICAgIHN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhEcm9wQ29sdW1uID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzRGVmZXJyZWRDb25zdHJhaW50cyA9IHRydWU7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0U3RhcnRJbmRleCA9IHRydWU7CisgICAgICAgIHN1cHBvcnRzU2VsZWN0RW5kSW5kZXggPSB0cnVlOworCisgICAgICAgIC8vIFBvc3RncmVTUUwgcmVxdWlyZXMgZG91YmxlLWVzY2FwZSBmb3Igc3RyaW5ncworICAgICAgICBzZWFyY2hTdHJpbmdFc2NhcGUgPSAiXFxcXCI7CisKKyAgICAgICAgbWF4VGFibGVOYW1lTGVuZ3RoID0gMzE7CisgICAgICAgIG1heENvbHVtbk5hbWVMZW5ndGggPSAzMTsKKyAgICAgICAgbWF4SW5kZXhOYW1lTGVuZ3RoID0gMzE7CisgICAgICAgIG1heENvbnN0cmFpbnROYW1lTGVuZ3RoID0gMzE7CisgICAgICAgIHNjaGVtYUNhc2UgPSBTQ0hFTUFfQ0FTRV9MT1dFUjsKKyAgICAgICAgcmFuZ2VQb3NpdGlvbiA9IFJBTkdFX1BPU1RfTE9DSzsKKyAgICAgICAgcmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCA9IHRydWU7CisgICAgICAgIGFsbG93c0FsaWFzSW5CdWxrQ2xhdXNlID0gZmFsc2U7CisKKyAgICAgICAgLy8gezJ9IGlzIHRoZSByZXN1bHQgb2YgZ2V0R2VuZXJhdGVkS2V5U2VxdWVuY2VOYW1lOyB0aGUKKyAgICAgICAgLy8gc2luZ2xlLXF1b3RlIGVzY2FwZSB3aWxsIHJlc3VsdCBpbiBTRUxFQ1QgQ1VSVkFMKCdteXNlcXVlbmNlJykKKyAgICAgICAgbGFzdEdlbmVyYXRlZEtleVF1ZXJ5ID0gIlNFTEVDVCBDVVJSVkFMKCcnezJ9JycpIjsKKyAgICAgICAgc3VwcG9ydHNBdXRvQXNzaWduID0gdHJ1ZTsKKyAgICAgICAgYXV0b0Fzc2lnblR5cGVOYW1lID0gIkJJR1NFUklBTCI7CisgICAgICAgIG5leHRTZXF1ZW5jZVF1ZXJ5ID0gIlNFTEVDVCBORVhUVkFMKCcnezB9JycpIjsKKworICAgICAgICB1c2VHZXRCeXRlc0ZvckJsb2JzID0gdHJ1ZTsKKyAgICAgICAgdXNlU2V0Qnl0ZXNGb3JCbG9icyA9IHRydWU7CisgICAgICAgIHVzZUdldFN0cmluZ0ZvckNsb2JzID0gdHJ1ZTsKKyAgICAgICAgdXNlU2V0U3RyaW5nRm9yQ2xvYnMgPSB0cnVlOworICAgICAgICBiaXRUeXBlTmFtZSA9ICJCT09MIjsKKyAgICAgICAgc21hbGxpbnRUeXBlTmFtZSA9ICJTTUFMTElOVCI7CisgICAgICAgIHJlYWxUeXBlTmFtZSA9ICJGTE9BVDgiOworICAgICAgICB0aW55aW50VHlwZU5hbWUgPSAiU01BTExJTlQiOworICAgICAgICBiaW5hcnlUeXBlTmFtZSA9ICJCWVRFQSI7CisgICAgICAgIGJsb2JUeXBlTmFtZSA9ICJCWVRFQSI7CisgICAgICAgIGxvbmdWYXJiaW5hcnlUeXBlTmFtZSA9ICJCWVRFQSI7CisgICAgICAgIHZhcmJpbmFyeVR5cGVOYW1lID0gIkJZVEVBIjsKKyAgICAgICAgY2xvYlR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBsb25nVmFyY2hhclR5cGVOYW1lID0gIlRFWFQiOworICAgICAgICBkb3VibGVUeXBlTmFtZSA9ICJET1VCTEUgUFJFQ0lTSU9OIjsKKyAgICAgICAgdmFyY2hhclR5cGVOYW1lID0gIlZBUkNIQVJ7MH0iOworICAgICAgICB0aW1lc3RhbXBUeXBlTmFtZSA9ICJBQlNUSU1FIjsKKyAgICAgICAgZml4ZWRTaXplVHlwZU5hbWVTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdeworICAgICAgICAgICAgIkJPT0wiLCAiQllURUEiLCAiTkFNRSIsICJJTlQ4IiwgIklOVDIiLCAiSU5UMlZFQ1RPUiIsICJJTlQ0IiwKKyAgICAgICAgICAgICJSRUdQUk9DIiwgIlRFWFQiLCAiT0lEIiwgIlRJRCIsICJYSUQiLCAiQ0lEIiwgIk9JRFZFQ1RPUiIsCisgICAgICAgICAgICAiU0VUIiwgIkZMT0FUNCIsICJGTE9BVDgiLCAiQUJTVElNRSIsICJSRUxUSU1FIiwgIlRJTlRFUlZBTCIsCisgICAgICAgICAgICAiTU9ORVkiLAorICAgICAgICB9KSk7CisKKyAgICAgICAgc3VwcG9ydHNMb2NraW5nV2l0aERpc3RpbmN0Q2xhdXNlID0gZmFsc2U7CisgICAgICAgIHN1cHBvcnRzTG9ja2luZ1dpdGhPdXRlckpvaW4gPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbXBvcnRlZEtleXMgPSB0cnVlOworCisgICAgICAgIHJlc2VydmVkV29yZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiQUJPUlQiLCAiQUNMIiwgIkFHR1JFR0FURSIsICJBUFBFTkQiLCAiQVJDSElWRSIsICJBUkNIX1NUT1JFIiwKKyAgICAgICAgICAgICJCQUNLV0FSRCIsICJCSU5BUlkiLCAiQ0hBTkdFIiwgIkNMVVNURVIiLCAiQ09QWSIsICJEQVRBQkFTRSIsCisgICAgICAgICAgICAiREVMSU1JVEVSIiwgIkRFTElNSVRFUlMiLCAiRE8iLCAiRVhQTEFJTiIsICJFWFRFTkQiLAorICAgICAgICAgICAgIkZPUldBUkQiLCAiSEVBVlkiLCAiSU5ERVgiLCAiSU5IRVJJVFMiLCAiSVNOVUxMIiwgIkxJR0hUIiwKKyAgICAgICAgICAgICJMSVNURU4iLCAiTE9BRCIsICJNRVJHRSIsICJOT1RISU5HIiwgIk5PVElGWSIsICJOT1ROVUxMIiwKKyAgICAgICAgICAgICJPSUQiLCAiT0lEUyIsICJQVVJHRSIsICJSRUNJUEUiLCAiUkVOQU1FIiwgIlJFUExBQ0UiLAorICAgICAgICAgICAgIlJFVFJJRVZFIiwgIlJFVFVSTlMiLCAiUlVMRSIsICJTRVRPRiIsICJTVERJTiIsICJTVERPVVQiLAorICAgICAgICAgICAgIlNUT1JFIiwgIlZBQ1VVTSIsICJWRVJCT1NFIiwgIlZFUlNJT04iLAorICAgICAgICB9KSk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZShSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldERhdGUocnMsIGNvbHVtbik7CisgICAgICAgIH0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JlKSB7CisgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGJ1ZyBpbiBzb21lIHZlcnNpb25zIG9mIHRoZSBwb3N0Z3JlcyBKREJDCisgICAgICAgICAgICAvLyBkcml2ZXIgc3VjaCB0aGF0IGEgZGF0ZSB3aXRoIG5vdCBlbm91Z2ggbnVtYmVycyBpbiBpdAorICAgICAgICAgICAgLy8gd2lsbCB0aHJvdyBhIHBhcnNpbmcgZXhjZXB0aW9uOiB0aGlzIHRyaWVzIHRvIHdvcmsKKyAgICAgICAgICAgIC8vIGFyb3VuZCBpdC4gVGhlIGJ1ZyBvbmx5IG9jY3VycyB3aGVuIHRoZXJlIGlzIGEgdHJhaWxpbmcKKyAgICAgICAgICAgIC8vIG1pbGxpc2Vjb25kIG1pc3NpbmcgZnJvbSB0aGUgZW5kLiBFLmcuLCB3aGVuIHRoZSBkYXRlIGlzCisgICAgICAgICAgICAvLyBsaWtlOgorICAgICAgICAgICAgLy8gMjA2Ni0xMC0xOSAyMjowODozMi44MworICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gd2hhdCB0aGUgZHJpdmVyIGV4cGVjdHM6CisgICAgICAgICAgICAvLyAyMDY2LTEwLTE5IDIyOjA4OjMyLjgzMAorICAgICAgICAgICAgU3RyaW5nIGRhdGVTdHIgPSBycy5nZXRTdHJpbmcoY29sdW1uKTsKKyAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm10ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCisgICAgICAgICAgICAgICAgInl5eXktTU0tZGQgaGg6bW06c3MuU1MiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZtdC5wYXJzZShkYXRlU3RyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihwZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcG9zdGdyZXMgZG9lcyBub3QgcGVyZm9ybSBhdXRvbWF0aWMgY29udmVyc2lvbnMsIHNvIGF0dGVtcHRpbmcgdG8KKyAgICAgICAgLy8gZ2V0IGEgd2hvbGUgbnVtYmVyIG91dCBvZiBhIGRlY2ltYWwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICAgIC8vIGZhbGwgYmFjayB0byBwZXJmb3JtaW5nIG1hbnVhbCBjb252ZXJzaW9uIGlmIHRoZSBpbml0aWFsIGdldCBmYWlscworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJ5dGUocnMsIGNvbHVtbik7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzcWxlKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QmlnRGVjaW1hbChycywgY29sdW1uKS5ieXRlVmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBwb3N0Z3JlcyBkb2VzIG5vdCBwZXJmb3JtIGF1dG9tYXRpYyBjb252ZXJzaW9ucywgc28gYXR0ZW1wdGluZyB0bworICAgICAgICAvLyBnZXQgYSB3aG9sZSBudW1iZXIgb3V0IG9mIGEgZGVjaW1hbCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHBlcmZvcm1pbmcgbWFudWFsIGNvbnZlcnNpb24gaWYgdGhlIGluaXRpYWwgZ2V0IGZhaWxzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U2hvcnQocnMsIGNvbHVtbik7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzcWxlKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QmlnRGVjaW1hbChycywgY29sdW1uKS5zaG9ydFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludChSZXN1bHRTZXQgcnMsIGludCBjb2x1bW4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAvLyBwb3N0Z3JlcyBkb2VzIG5vdCBwZXJmb3JtIGF1dG9tYXRpYyBjb252ZXJzaW9ucywgc28gYXR0ZW1wdGluZyB0bworICAgICAgICAvLyBnZXQgYSB3aG9sZSBudW1iZXIgb3V0IG9mIGEgZGVjaW1hbCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHBlcmZvcm1pbmcgbWFudWFsIGNvbnZlcnNpb24gaWYgdGhlIGluaXRpYWwgZ2V0IGZhaWxzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW50KHJzLCBjb2x1bW4pOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc3FsZSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJpZ0RlY2ltYWwocnMsIGNvbHVtbikuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvbmcoUmVzdWx0U2V0IHJzLCBpbnQgY29sdW1uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcG9zdGdyZXMgZG9lcyBub3QgcGVyZm9ybSBhdXRvbWF0aWMgY29udmVyc2lvbnMsIHNvIGF0dGVtcHRpbmcgdG8KKyAgICAgICAgLy8gZ2V0IGEgd2hvbGUgbnVtYmVyIG91dCBvZiBhIGRlY2ltYWwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICAgIC8vIGZhbGwgYmFjayB0byBwZXJmb3JtaW5nIG1hbnVhbCBjb252ZXJzaW9uIGlmIHRoZSBpbml0aWFsIGdldCBmYWlscworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldExvbmcocnMsIGNvbHVtbik7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzcWxlKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QmlnRGVjaW1hbChycywgY29sdW1uKS5sb25nVmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIGJvb2xlYW4gdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcG9zdGdyZXMgYWN0dWFsbHkgcmVxdWlyZXMgdGhhdCBhIGJvb2xlYW4gYmUgc2V0OiBpdCBjYW5ub3QKKyAgICAgICAgLy8gaGFuZGxlIGEgbnVtZXJpYyBhcmd1bWVudC4KKyAgICAgICAgc3RtbnQuc2V0Qm9vbGVhbihpZHgsIHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2VsZWN0UmFuZ2UoU1FMQnVmZmVyIGJ1ZiwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgaWYgKGVuZCAhPSBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBMSU1JVCAiKS5hcHBlbmRWYWx1ZShlbmQgLSBzdGFydCk7CisgICAgICAgIGlmIChzdGFydCAhPSAwKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIE9GRlNFVCAiKS5hcHBlbmRWYWx1ZShzdGFydCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5kZXhPZihTUUxCdWZmZXIgYnVmLCBGaWx0ZXJWYWx1ZSBzdHIsIEZpbHRlclZhbHVlIGZpbmQsCisgICAgICAgIEZpbHRlclZhbHVlIHN0YXJ0KSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIihQT1NJVElPTigiKTsKKyAgICAgICAgZmluZC5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIgSU4gIik7CisgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQorICAgICAgICAgICAgc3Vic3RyaW5nKGJ1Ziwgc3RyLCBzdGFydCwgbnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0ci5hcHBlbmRUbyhidWYpOworICAgICAgICBidWYuYXBwZW5kKCIpIC0gMSIpOworICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICBzdGFydC5hcHBlbmRUbyhidWYpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlU2VxdWVuY2VTUUwoU2VxdWVuY2Ugc2VxKSB7CisgICAgICAgIFN0cmluZ1tdIHNxbCA9IHN1cGVyLmdldENyZWF0ZVNlcXVlbmNlU1FMKHNlcSk7CisgICAgICAgIGlmIChzZXEuZ2V0QWxsb2NhdGUoKSA+IDEpCisgICAgICAgICAgICBzcWxbMF0gKz0gIiBDQUNIRSAiICsgc2VxLmdldEFsbG9jYXRlKCk7CisgICAgICAgIHJldHVybiBzcWw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXF1ZW5jZXNTUUwoU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsKKyAgICAgICAgaWYgKHNjaGVtYU5hbWUgPT0gbnVsbCAmJiBzZXF1ZW5jZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhbGxTZXF1ZW5jZXNTUUw7CisgICAgICAgIGVsc2UgaWYgKHNjaGVtYU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lZFNlcXVlbmNlc0Zyb21BbGxTY2hlbWFzU1FMOworICAgICAgICBlbHNlIGlmIChzZXF1ZW5jZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhbGxTZXF1ZW5jZXNGcm9tT25lU2NoZW1hU1FMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmFtZWRTZXF1ZW5jZUZyb21PbmVTY2hlbWFTUUw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1TZXF1ZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNjaGVtYSwKKyAgICAgICAgYm9vbGVhbiB0YXJnZXRTY2hlbWEpIHsKKyAgICAgICAgaWYgKHN1cGVyLmlzU3lzdGVtU2VxdWVuY2UobmFtZSwgc2NoZW1hLCB0YXJnZXRTY2hlbWEpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gZmlsdGVyIG91dCBnZW5lcmF0ZWQgc2VxdWVuY2VzIHVzZWQgZm9yIGJpZ3NlcmlhbCBjb2xzLCB3aGljaCBhcmUKKyAgICAgICAgLy8gb2YgdGhlIGZvcm0gPHRhYmxlPl88Y29sPl9zZXEKKyAgICAgICAgaW50IGlkeCA9IG5hbWUuaW5kZXhPZignXycpOworICAgICAgICByZXR1cm4gaWR4ICE9IC0xICYmIGlkeCAhPSBuYW1lLmxlbmd0aCgpIC0gNAorICAgICAgICAgICAgJiYgbmFtZS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJfU0VRIik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1UYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNjaGVtYSwKKyAgICAgICAgYm9vbGVhbiB0YXJnZXRTY2hlbWEpIHsKKyAgICAgICAgLy8gbmFtZXMgc3RhcnRpbmcgd2l0aCAicGdfIiBhcmUgcmVzZXJ2ZWQgZm9yIFBvc3RncmVzcWwgaW50ZXJuYWwgdXNlCisgICAgICAgIHJldHVybiBzdXBlci5pc1N5c3RlbVRhYmxlKG5hbWUsIHNjaGVtYSwgdGFyZ2V0U2NoZW1hKQorICAgICAgICAgICAgfHwgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgicGdfIikpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3lzdGVtSW5kZXgoU3RyaW5nIG5hbWUsIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIC8vIG5hbWVzIHN0YXJ0aW5nIHdpdGggInBnXyIgYXJlIHJlc2VydmVkIGZvciBQb3N0Z3Jlc3FsIGludGVybmFsIHVzZQorICAgICAgICByZXR1cm4gc3VwZXIuaXNTeXN0ZW1JbmRleChuYW1lLCB0YWJsZSkKKyAgICAgICAgICAgIHx8IChuYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInBnXyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBkZWNvcmF0ZShDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFBvc3RncmVzQ29ubmVjdGlvbihzdXBlci5kZWNvcmF0ZShjb25uKSwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdGlvbiB3cmFwcGVyIHRvIHdvcmsgYXJvdW5kIHRoZSBwb3N0Z3JlcyBlbXB0eSByZXN1bHQgc2V0IGJ1Zy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0Z3Jlc0Nvbm5lY3Rpb24KKyAgICAgICAgZXh0ZW5kcyBEZWxlZ2F0aW5nQ29ubmVjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQb3N0Z3Jlc0RpY3Rpb25hcnkgX2RpY3Q7CisKKyAgICAgICAgcHVibGljIFBvc3RncmVzQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm4sIFBvc3RncmVzRGljdGlvbmFyeSBkaWN0KSB7CisgICAgICAgICAgICBzdXBlcihjb25uKTsKKyAgICAgICAgICAgIF9kaWN0ID0gZGljdDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsIGJvb2xlYW4gd3JhcCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0Z3Jlc1ByZXBhcmVkU3RhdGVtZW50KHN1cGVyLnByZXBhcmVTdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAoc3FsLCBmYWxzZSksIHRoaXMsIF9kaWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsIGludCByc1R5cGUsCisgICAgICAgICAgICBpbnQgcnNDb25jdXIsIGJvb2xlYW4gd3JhcCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0Z3Jlc1ByZXBhcmVkU3RhdGVtZW50KHN1cGVyLnByZXBhcmVTdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAoc3FsLCByc1R5cGUsIHJzQ29uY3VyLCBmYWxzZSksIHRoaXMsIF9kaWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXRlbWVudCB3cmFwcGVyIHRvIHdvcmsgYXJvdW5kIHRoZSBwb3N0Z3JlcyBlbXB0eSByZXN1bHQgc2V0IGJ1Zy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0Z3Jlc1ByZXBhcmVkU3RhdGVtZW50CisgICAgICAgIGV4dGVuZHMgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFBvc3RncmVzRGljdGlvbmFyeSBfZGljdDsKKworICAgICAgICBwdWJsaWMgUG9zdGdyZXNQcmVwYXJlZFN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudCBwcywKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubiwgUG9zdGdyZXNEaWN0aW9uYXJ5IGRpY3QpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzLCBjb25uKTsKKyAgICAgICAgICAgIF9kaWN0ID0gZGljdDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBSZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KGJvb2xlYW4gd3JhcCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZVF1ZXJ5KHdyYXApOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIG91ciBiZXN0IGd1ZXNzIHdoZXRoZXIgdGhpcyBpcyB0aGUgZW1wdHkKKyAgICAgICAgICAgICAgICAvLyBSZXN1bHRTZXQgYnVnLCBzaW5jZSB0aGlzIGV4Y2VwdGlvbiBjb3VsZCBvY2N1cgorICAgICAgICAgICAgICAgIC8vIGZvciBvdGhlciByZWFzb25zIChsaWtlIGFuIGludmFsaWQgcXVlcnkgc3RyaW5nKS4gTm90ZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgUG9zdGdyZXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxvY2FsaXplZCwgc28gd2UKKyAgICAgICAgICAgICAgICAvLyBjYW5ub3QganVzdCBwYXJzZSB0aGUgZXhjZXB0aW9uIFN0cmluZy4KKyAgICAgICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBnZXRSZXN1bHRTZXQod3JhcCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXN1bHRTZXQgc2hvdWxkIGJlIGVtcHR5OiBpZiBub3QsIHRoZW4gbWF5YmUgYW4KKyAgICAgICAgICAgICAgICAvLyBhY3R1YWwgZXJyb3Igb2NjdXJlZAorICAgICAgICAgICAgICAgIGlmIChycyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZTsKKworICAgICAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZldGNoU2l6ZShpbnQgaSkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgLy8gc29tZSBwb3N0Z3JlcyBkcml2ZXJzIGRvIG5vdCBzdXBwb3J0IHRoZSBzZXRGZXRjaFNpemUgbWV0aG9kCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChfZGljdC5zdXBwb3J0c1NldEZldGNoU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmV0Y2hTaXplKGkpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBfZGljdC5zdXBwb3J0c1NldEZldGNoU2l6ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChfZGljdC5sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfZGljdC5sb2cud2FybihfbG9jLmdldCgicHNxbC1uby1zZXQtZmV0Y2gtc2l6ZSIpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1ByaW1hcnlSb3cuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1ByaW1hcnlSb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODNjMzMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUHJpbWFyeVJvdy5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk9iamVjdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUmVsYXRpb25JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW5JTzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworCisvKioKKyAqIFByaW1hcnkgdGFibGUgcm93IHRoYXQgdHJhY2tzIGZvcmVpZ24ga2V5cyBhbmQgYXV0by1pbmMgY29sdW1ucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUHJpbWFyeVJvdworICAgIGV4dGVuZHMgUm93SW1wbCB7CisKKyAgICAvLyBWQUxJRCBmbGFnIGluIHN1cGVyY2xhc3MgdXNlcyAyIDw8IDAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFBLX1NFVCA9IDIgPDwgMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFBLX1dIRVJFID0gMiA8PCAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgREVQRU5ERU5UID0gMiA8PCA0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUHJpbWFyeVJvdy5jbGFzcyk7CisKKyAgICBwcml2YXRlIE9wZW5KUEFTdGF0ZU1hbmFnZXIgX3BrID0gbnVsbDsKKyAgICBwcml2YXRlIENvbHVtbklPIF9wa0lPID0gbnVsbDsKKyAgICBwcml2YXRlIE9wZW5KUEFTdGF0ZU1hbmFnZXJbXSBfZmtTZXQgPSBudWxsOworICAgIHByaXZhdGUgQ29sdW1uSU9bXSBfZmtJTyA9IG51bGw7CisgICAgcHJpdmF0ZSBPcGVuSlBBU3RhdGVNYW5hZ2VyW10gX2ZrV2hlcmUgPSBudWxsOworICAgIHByaXZhdGUgT3BlbkpQQVN0YXRlTWFuYWdlcltdIF9yZWxTZXQgPSBudWxsOworICAgIHByaXZhdGUgUmVsYXRpb25JZFtdIF9jYWxsYmFja3MgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0IF9mYWlsZWQgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9pZHggPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgdGFibGUgYW5kIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbWFyeVJvdyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbiwgT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lcikgeworICAgICAgICB0aGlzKHRhYmxlLmdldENvbHVtbnMoKSwgYWN0aW9uLCBvd25lcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFByaW1hcnlSb3coQ29sdW1uW10gY29scywgaW50IGFjdGlvbiwgT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lcikgeworICAgICAgICBzdXBlcihjb2xzLCBhY3Rpb24pOworICAgICAgICBfcGsgPSBvd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoaXMgcm93IGFzIGRlcGVuZGVudCBvbiBzb21lIG90aGVyIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVudCgpIHsKKyAgICAgICAgcmV0dXJuIChmbGFncyAmIERFUEVOREVOVCkgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmsgdGhpcyByb3cgYXMgZGVwZW5kZW50IG9uIHNvbWUgb3RoZXIgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcGVuZGVudChib29sZWFuIGRlcGVuZGVudCkgeworICAgICAgICBpZiAoZGVwZW5kZW50KQorICAgICAgICAgICAgZmxhZ3MgfD0gREVQRU5ERU5UOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFncyAmPSB+REVQRU5ERU5UOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIHJvdyBpbiBvcmRlcmVkIHJvdyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfaWR4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIHJvdyBpbiBvcmRlcmVkIHJvdyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpZHgpIHsKKyAgICAgICAgX2lkeCA9IGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmFpbGVkT2JqZWN0KE9iamVjdCBmYWlsZWQpIHsKKyAgICAgICAgX2ZhaWxlZCA9IGZhaWxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRQcmltYXJ5S2V5KCkgeworICAgICAgICByZXR1cm4gX3BrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFByaW1hcnlLZXkobnVsbCwgc20pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoQ29sdW1uSU8gaW8sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgX3BrID0gc207CisgICAgICAgIGZsYWdzIHw9IFBLX1NFVDsKKyAgICAgICAgX3BrSU8gPSBpbzsKKworICAgICAgICAvLyBmb3JjZSB2YWxpZAorICAgICAgICBzZXRWYWxpZCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZVByaW1hcnlLZXkoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9wayA9IHNtOworICAgICAgICBmbGFncyB8PSBQS19XSEVSRTsKKworICAgICAgICAvLyBmb3JjZSB2YWxpZAorICAgICAgICBpZiAoZ2V0QWN0aW9uKCkgPT0gQUNUSU9OX0RFTEVURSkKKyAgICAgICAgICAgIHNldFZhbGlkKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSS9PIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gc2V0IGZvcmVpZ24ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBDb2x1bW5JTyBnZXRGb3JlaWduS2V5SU8oRm9yZWlnbktleSBmaykgeworICAgICAgICByZXR1cm4gKF9ma0lPID09IG51bGwpID8gbnVsbCA6IF9ma0lPW2ZrLmdldEluZGV4KCldOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBmb3JlaWduIGtleS4gVmFsdWVzIG5vdCBuZWVkZWQgZm9yCisgICAgICogY29uc3RyYWludCBhbmFseXNlcyBhcmUgbm90IHJlY29yZGVkLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldEZvcmVpZ25LZXlTZXQoRm9yZWlnbktleSBmaykgeworICAgICAgICByZXR1cm4gKF9ma1NldCA9PSBudWxsKSA/IG51bGwgOiBfZmtTZXRbZmsuZ2V0SW5kZXgoKV07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZvcmVpZ24ga2V5LiBWYWx1ZXMgbm90IG5lZWRlZCBmb3IKKyAgICAgKiBjb25zdHJhaW50IGFuYWx5c2VzIGFyZSBub3QgcmVjb3JkZWQuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZ2V0Rm9yZWlnbktleVdoZXJlKEZvcmVpZ25LZXkgZmspIHsKKyAgICAgICAgcmV0dXJuIChfZmtXaGVyZSA9PSBudWxsKSA/IG51bGwgOiBfZmtXaGVyZVtmay5nZXRJbmRleCgpXTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JlaWduS2V5KEZvcmVpZ25LZXkgZmssIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRGb3JlaWduS2V5KGZrLCBudWxsLCBzbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBDb2x1bW5JTyBpbywKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZGVsYXlGb3JlaWduS2V5KGZrLCBzbSwgdHJ1ZSkpCisgICAgICAgICAgICBzdXBlci5zZXRGb3JlaWduS2V5KGZrLCBpbywgc20pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWNvcmRGb3JlaWduS2V5KGZrLCBpbywgc20sIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlRm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFkZWxheUZvcmVpZ25LZXkoZmssIHNtLCBmYWxzZSkpCisgICAgICAgICAgICBzdXBlci53aGVyZUZvcmVpZ25LZXkoZmssIHNtKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVjb3JkRm9yZWlnbktleShmaywgbnVsbCwgc20sIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckZvcmVpZ25LZXkoRm9yZWlnbktleSBmaykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmNsZWFyRm9yZWlnbktleShmayk7CisgICAgICAgIGlmIChfZmtTZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIF9ma1NldFtmay5nZXRJbmRleCgpXSA9IG51bGw7CisgICAgICAgIGlmIChfZmtJTyAhPSBudWxsKQorICAgICAgICAgICAgX2ZrSU9bZmsuZ2V0SW5kZXgoKV0gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgaXMgYSBkZWxldGUsIGRlbGF5IGZvcmVpZ24ga2V5cyB0byBvdGhlciBkZWxldGVkIG9iamVjdHMgaWYKKyAgICAgKiB0aGUga2V5IGlzIHJlc3RyaWN0ZWQuIElmIHRoaXMgaXMgYW4gdXBkYXRlIG9yIGluc2VydCwgZGVsYXkgZm9yZWlnbgorICAgICAqIGtleXMgdG8gb3RoZXIgaW5zZXJ0cyBpZiB0aGUga2V5IGlzIG5vdCBsb2dpY2FsLiBJZiB0aGUgZm9yZWlnbiBrZXkKKyAgICAgKiBpcyB0byBhIG5ldyByZWNvcmQgYW5kIHRoZSBjb2x1bW5zIGFyZSBhdXRvLWluYywgcmVjb3JkIGl0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxheUZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgYm9vbGVhbiBzZXQpIHsKKyAgICAgICAgaWYgKHNtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGdldEFjdGlvbigpID09IEFDVElPTl9ERUxFVEUpCisgICAgICAgICAgICByZXR1cm4gc20uaXNEZWxldGVkKCkgJiYgIWZrLmlzRGVmZXJyZWQoKQorICAgICAgICAgICAgICAgICYmIGZrLmdldERlbGV0ZUFjdGlvbigpID09IEZvcmVpZ25LZXkuQUNUSU9OX1JFU1RSSUNUOworCisgICAgICAgIGlmICghc20uaXNOZXcoKSB8fCBzbS5pc0ZsdXNoZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFmay5pc0RlZmVycmVkKCkgJiYgIWZrLmlzTG9naWNhbCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChmay5pc1ByaW1hcnlLZXlBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIGEgZGVsYXllZCBmb3JlaWduIGtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkRm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBDb2x1bW5JTyBpbywKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgYm9vbGVhbiBzZXQpIHsKKyAgICAgICAgaWYgKHNldCkgeworICAgICAgICAgICAgLy8gZm9yY2UgdmFsaWQKKyAgICAgICAgICAgIGlmIChjYW5TZXRBbnkoaW8sIGZrLmdldENvbHVtbnMoKS5sZW5ndGgKKyAgICAgICAgICAgICAgICArIGZrLmdldENvbnN0YW50Q29sdW1ucygpLmxlbmd0aCwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHNldFZhbGlkKHRydWUpOworCisgICAgICAgICAgICBpZiAoX2ZrU2V0ID09IG51bGwpCisgICAgICAgICAgICAgICAgX2ZrU2V0ID0gbmV3IE9wZW5KUEFTdGF0ZU1hbmFnZXJbZ2V0VGFibGUoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0Rm9yZWlnbktleXMoKS5sZW5ndGhdOworICAgICAgICAgICAgX2ZrU2V0W2ZrLmdldEluZGV4KCldID0gc207CisKKyAgICAgICAgICAgIGlmIChfZmtJTyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9ma0lPW2ZrLmdldEluZGV4KCldID0gaW87CisgICAgICAgICAgICBlbHNlIGlmIChpbyAhPSBudWxsICYmICgoZ2V0QWN0aW9uKCkgPT0gQUNUSU9OX0lOU0VSVAorICAgICAgICAgICAgICAgICYmICFpby5pc0FsbEluc2VydGFibGUoZmssIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB8fCAoZ2V0QWN0aW9uKCkgIT0gQUNUSU9OX0lOU0VSVAorICAgICAgICAgICAgICAgICYmICFpby5pc0FsbFVwZGF0YWJsZShmaywgZmFsc2UpKSkpIHsKKyAgICAgICAgICAgICAgICBfZmtJTyA9IG5ldyBDb2x1bW5JT1tfZmtTZXQubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBfZmtJT1tmay5nZXRJbmRleCgpXSA9IGlvOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZm9yY2UgdmFsaWQKKyAgICAgICAgICAgIGlmIChnZXRBY3Rpb24oKSA9PSBBQ1RJT05fREVMRVRFKQorICAgICAgICAgICAgICAgIHNldFZhbGlkKHRydWUpOworCisgICAgICAgICAgICBpZiAoX2ZrV2hlcmUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZmtXaGVyZSA9IG5ldyBPcGVuSlBBU3RhdGVNYW5hZ2VyW2dldFRhYmxlKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEZvcmVpZ25LZXlzKCkubGVuZ3RoXTsKKyAgICAgICAgICAgIF9ma1doZXJlW2ZrLmdldEluZGV4KCldID0gc207CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlY29yZGVkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcmVsYXRpb24gaWQgY29sdW1uLiBPbmx5CisgICAgICogdmFsdWVzIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBhIG5ldywgdW5mbHVzaGVkIGF1dG8tYXNzaWduZWQgaW5zdGFuY2UKKyAgICAgKiBhcmUgcmVjb3JkZWQuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZ2V0UmVsYXRpb25JZFNldChDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiAoX3JlbFNldCA9PSBudWxsKSA/IG51bGwgOiBfcmVsU2V0W2dldFJlbGF0aW9uSWRJbmRleChjb2wpXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlY29yZGVkIGNhbGxiYWNrcyBmb3IgdGhlIGdpdmVuIHJlbGF0aW9uIGlkIGNvbHVtbi4gT25seQorICAgICAqIHZhbHVlcyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gYSBuZXcsIHVuZmx1c2hlZCBhdXRvLWFzc2lnbmVkIGluc3RhbmNlCisgICAgICogYXJlIHJlY29yZGVkLgorICAgICAqLworICAgIHB1YmxpYyBSZWxhdGlvbklkIGdldFJlbGF0aW9uSWRDYWxsYmFjayhDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiAoX2NhbGxiYWNrcyA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogX2NhbGxiYWNrc1tnZXRSZWxhdGlvbklkSW5kZXgoY29sKV07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25JZChDb2x1bW4gY29sLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBSZWxhdGlvbklkIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzbSA9PSBudWxsIHx8IHNtLmdldE9iamVjdElkKCkgIT0gbnVsbCB8fCAhc20uaXNOZXcoKQorICAgICAgICAgICAgfHwgc20uaXNGbHVzaGVkKCkgfHwgIWlzUHJpbWFyeUtleUF1dG9Bc3NpZ25lZChzbSkpCisgICAgICAgICAgICBzdXBlci5zZXRSZWxhdGlvbklkKGNvbCwgc20sIHJlbCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKF9yZWxTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBnZXRUYWJsZSgpLmdldFJlbGF0aW9uSWRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgX3JlbFNldCA9IG5ldyBPcGVuSlBBU3RhdGVNYW5hZ2VyW2NvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBfY2FsbGJhY2tzID0gbmV3IFJlbGF0aW9uSWRbY29scy5sZW5ndGhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGlkeCA9IGdldFJlbGF0aW9uSWRJbmRleChjb2wpOworICAgICAgICAgICAgX3JlbFNldFtpZHhdID0gc207CisgICAgICAgICAgICBfY2FsbGJhY2tzW2lkeF0gPSByZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclJlbGF0aW9uSWQoQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmNsZWFyUmVsYXRpb25JZChjb2wpOworICAgICAgICBpZiAoX3JlbFNldCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gZ2V0UmVsYXRpb25JZEluZGV4KGNvbCk7CisgICAgICAgICAgICBfcmVsU2V0W2lkeF0gPSBudWxsOworICAgICAgICAgICAgX2NhbGxiYWNrc1tpZHhdID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggaW50byBvdXIgcmVsYXRpb24gaWQgYXJyYXkgb2YgdGhlIHZhbHVlIGZvciB0aGUKKyAgICAgKiBnaXZlbiBjb2x1bW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0UmVsYXRpb25JZEluZGV4KENvbHVtbiBjb2wpIHsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGdldFRhYmxlKCkuZ2V0UmVsYXRpb25JZENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbHNbaV0gPT0gY29sKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgYW55IHByaW1hcnkga2V5IGNvbHVtbnMgb2YgdGhlIGdpdmVuIGluc3RhbmNlIGFyZQorICAgICAqIGF1dG8tYXNzaWduZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByaW1hcnlLZXlBdXRvQXNzaWduZWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgd2hpbGUgKGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgY2xzID0gY2xzLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gY2xzLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChjb2xzW2ldLmlzQXV0b0Fzc2lnbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3QoQ29sdW1uIGNvbCwgT2JqZWN0IHZhbCwgaW50IG1ldGFUeXBlLAorICAgICAgICBib29sZWFuIG92ZXJyaWRlRGVmYXVsdCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2V0dGluZyB0d28gZGlmZmVyZW50IHZhbHVlcworICAgICAgICBPYmplY3QgcHJldiA9IGdldFNldChjb2wpOworICAgICAgICBpZiAocHJldiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocHJldiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHByZXYgPSBudWxsOworICAgICAgICAgICAgaWYgKCFyb3dWYWx1ZUVxdWFscyhwcmV2LCB2YWwpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiZGlmZi12YWx1ZXMiLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGNvbC5nZXRGdWxsTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHByZXYgPT0gbnVsbCkgPyBudWxsIDogcHJldi5nZXRDbGFzcygpLCBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgKHZhbCA9PSBudWxsKSA/IG51bGwgOiB2YWwuZ2V0Q2xhc3MoKSwgdmFsIH0pKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0T2JqZWN0KGNvbCwgdmFsLCBtZXRhVHlwZSwgb3ZlcnJpZGVEZWZhdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIHZhbHVlcyBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJvd1ZhbHVlRXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIGlmIChPYmplY3RVdGlscy5lcXVhbHMobzEsIG8yKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIGNoZWNrIGZvciBudW1lcmljIGVxdWFsaXR5IChidWcgIzExNTEpCisgICAgICAgIHJldHVybiBvMSBpbnN0YW5jZW9mIE51bWJlciAmJiBvMiBpbnN0YW5jZW9mIE51bWJlcgorICAgICAgICAgICAgJiYgKChOdW1iZXIpIG8xKS5kb3VibGVWYWx1ZSgpID09ICgoTnVtYmVyKSBvMikuZG91YmxlVmFsdWUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlU1FMKERCRGljdGlvbmFyeSBkaWN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoKGZsYWdzICYgUEtfU0VUKSA+IDApCisgICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJpbWFyeUtleShfcGtJTywgX3BrKTsKKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQS19XSEVSRSkgPiAwKQorICAgICAgICAgICAgICAgIHN1cGVyLndoZXJlUHJpbWFyeUtleShfcGspOworICAgICAgICAgICAgaWYgKF9ma1NldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IGdldFRhYmxlKCkuZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgICAgICAgICBDb2x1bW5JTyBpbzsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9ma1NldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2ZrU2V0W2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvID0gKF9ma0lPID09IG51bGwpID8gbnVsbCA6IF9ma0lPW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0Rm9yZWlnbktleShma3NbaV0sIGlvLCBfZmtTZXRbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9yZWxTZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBnZXRUYWJsZSgpLmdldFJlbGF0aW9uSWRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcmVsU2V0Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoX3JlbFNldFtpXSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0UmVsYXRpb25JZChjb2xzW2ldLCBfcmVsU2V0W2ldLCBfY2FsbGJhY2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfZmtXaGVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRm9yZWlnbktleVtdIGZrcyA9IGdldFRhYmxlKCkuZ2V0Rm9yZWlnbktleXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9ma1doZXJlLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoX2ZrV2hlcmVbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLndoZXJlRm9yZWlnbktleShma3NbaV0sIF9ma1doZXJlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBTUUxFeGNlcHRpb25zLmdldFN0b3JlKHNlLCBkaWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2VuZXJhdGVTUUwoZGljdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJvd0ltcGwgbmV3SW5zdGFuY2UoQ29sdW1uW10gY29scywgaW50IGFjdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlSb3coY29scywgYWN0aW9uLCBfcGspOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlJbnRvKFJvd0ltcGwgcm93LCBib29sZWFuIHdoZXJlT25seSkgeworICAgICAgICBzdXBlci5jb3B5SW50byhyb3csIHdoZXJlT25seSk7CisgICAgICAgIGlmICghKHJvdyBpbnN0YW5jZW9mIFByaW1hcnlSb3cpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFByaW1hcnlSb3cgcHJvdyA9IChQcmltYXJ5Um93KSByb3c7CisgICAgICAgIHByb3cuX3BrID0gX3BrOworICAgICAgICBwcm93Ll9wa0lPID0gX3BrSU87CisgICAgICAgIGlmICgoZmxhZ3MgJiBQS19XSEVSRSkgPiAwKQorICAgICAgICAgICAgcHJvdy5mbGFncyB8PSBQS19XSEVSRTsKKyAgICAgICAgaWYgKCF3aGVyZU9ubHkgJiYgKGZsYWdzICYgUEtfU0VUKSA+IDApCisgICAgICAgICAgICBwcm93LmZsYWdzIHw9IFBLX1NFVDsKKworICAgICAgICBpZiAoX2ZrV2hlcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHByb3cuX2ZrV2hlcmUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm93Ll9ma1doZXJlID0gbmV3IE9wZW5KUEFTdGF0ZU1hbmFnZXJbX2ZrV2hlcmUubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2ZrV2hlcmUsIDAsIHByb3cuX2ZrV2hlcmUsIDAsIF9ma1doZXJlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3aGVyZU9ubHkgJiYgX2ZrU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwcm93Ll9ma1NldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHByb3cuX2ZrU2V0ID0gbmV3IE9wZW5KUEFTdGF0ZU1hbmFnZXJbX2ZrU2V0Lmxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9ma1NldCwgMCwgcHJvdy5fZmtTZXQsIDAsIF9ma1NldC5sZW5ndGgpOworICAgICAgICAgICAgaWYgKF9ma0lPICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdy5fZmtJTyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwcm93Ll9ma0lPID0gbmV3IENvbHVtbklPW19ma0lPLmxlbmd0aF07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShfZmtJTywgMCwgcHJvdy5fZmtJTywgMCwgX2ZrSU8ubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdoZXJlT25seSAmJiBfcmVsU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwcm93Ll9yZWxTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3cuX3JlbFNldCA9IG5ldyBPcGVuSlBBU3RhdGVNYW5hZ2VyW19yZWxTZXQubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBwcm93Ll9jYWxsYmFja3MgPSBuZXcgUmVsYXRpb25JZFtfY2FsbGJhY2tzLmxlbmd0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9yZWxTZXQsIDAsIHByb3cuX3JlbFNldCwgMCwgX3JlbFNldC5sZW5ndGgpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShfY2FsbGJhY2tzLCAwLCBwcm93Ll9jYWxsYmFja3MsIDAsCisgICAgICAgICAgICAgICAgX2NhbGxiYWNrcy5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUmF3LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9SYXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA5MjZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUmF3LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJhdyBTUUwgc3RyaW5nIGZvciBwYXNzaW5nIHRvCisgKiA8Y29kZT5Sb3cuc2V0T2JqZWN0PC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgUmF3IHsKKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3FsOworCisgICAgcHVibGljIFJhdyhTdHJpbmcgc3FsKSB7CisgICAgICAgIHRoaXMuc3FsID0gc3FsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzcWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUmVzdWx0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGVhMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUmVzdWx0LmphdmEKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5BcnJheTsKK2ltcG9ydCBqYXZhLnNxbC5CbG9iOworaW1wb3J0IGphdmEuc3FsLkNsb2I7CitpbXBvcnQgamF2YS5zcWwuUmVmOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkphdmFTUUxUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICogQSByZXN1bHQgZnJvbSB0aGUgZXhlY3V0aW9uIG9mIGEgcXVlcnkgb3Igc3RvcmVkIHByb2NlZHVyZS4gVGhpcworICogaW50ZXJmYWNlIGlzIGFsaWduZWQgY2xvc2VseSB3aXRoIHRoZSB7QGxpbmsgamF2YS5zcWwuUmVzdWx0U2V0fSwgc28geW91CisgKiBjYW4gZXhwZWN0IGxpa2UtbmFtZWQgbWV0aG9kcyB0byBoYXZlIHNpbWlsYXIgc2VtYW50aWNzLiBIb3dldmVyLCB0aGUKKyAqIGludGVyZmFjZSBoYXMgYmVlbiBkaXN0aWxsZWQgYW5kIHNpbXBsaWZpZWQsIHNvIGEgcmVzdWx0IG9iamVjdCBjb3VsZAorICogZWFzaWx5IG1hc2sgaW5mb3JtYXRpb24gc291cmNlcyBvdGhlciB0aGFuIGEgcmVzdWx0IHNldC4KKyAqICBGb3IgbW9yZSBmbGV4aWJsZSBjdXN0b21pemF0aW9uIG9mIGRhdGEgbG9hZGluZywgc2VlIHRoZQorICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENSZXN1bHRPYmplY3RQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzZWUgUmVzdWx0U2V0UmVzdWx0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdWx0CisgICAgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIGVhZ2VyIHJlc3VsdCBmb3IgdGhlIGdpdmVuIGtleSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RWFnZXIoRmllbGRNYXBwaW5nIGtleSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZWFnZXIgcmVzdWx0IGZvciB0aGUgZ2l2ZW4ga2V5LCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0RWFnZXIoRmllbGRNYXBwaW5nIGtleSwgT2JqZWN0IHJlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgam9pbnMgaW5zdGFuY2UgdG8gdXNlIGZvciB0cmF2ZXJzaW5nIHRvIHJlbGF0ZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgbmV3Sm9pbnMoKTsKKworICAgIC8qKgorICAgICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgcmVzdWx0OyBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPgorICAgICAqIGNsb3NlIHRoZSBTUUwgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlbiBhbnkgcmVzdWx0cyBsb2FkZWQgZnJvbSB0aGlzIFJlc3VsdAorICAgICAqIHdpbGwgYmUgbG9ja2VkIGluIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tpbmcoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgc3VwcG9ydHMgcmFuZG9tIGFjY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2VzcygpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBNb3ZlIHRvIHRoZSBnaXZlbiA8c3Ryb25nPjAtYmFzZWQ8L3N0cm9uZz4gcm93IGluIHRoZSByZXN1bHQsIG9yCisgICAgICogcmV0dXJuIGZhbHNlIGlmIHRoZSByb3cgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZQorICAgICAqIGNhbGxlZCBpZiB0aGUgcmVzdWx0IHN1cHBvcnRzIHJhbmRvbSBhY2Nlc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHJvdykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEFkdmFuY2UgdG8gdGhlIG5leHQgcm93LCBvciByZXR1cm4gZmFsc2UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcm93cworICAgICAqIGluIHRoZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmV4dCgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQdXNoIGJhY2sgdGhlIGxhc3QgcmVzdWx0LiBJbiBvdGhlciB3b3JkcywganVzdCBpZ25vcmUgdGhlIG5leHQgY2FsbAorICAgICAqIHRvIHtAbGluayAjbmV4dH0uIEFmdGVyIHRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKKyAgICAgKiBhZGRpdGlvbmFsIGNhbGxzIGJlZm9yZSBhIGNhbGwgdG8ge0BsaW5rICNuZXh0fSBvciB7QGxpbmsgI2Fic29sdXRlfQorICAgICAqIHNob3VsZCBoYXZlIG5vIGZ1cnRoZXIgYWZmZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2hCYWNrKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhpcyByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBpZCBvciBjb2x1bW4gaXMgYXZhaWxhYmxlIGluIHRoZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIGFsbCB0aGUgZ2l2ZW4gaWRzIG9yIGNvbHVtbnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIG9ianMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29sdW1uIGlzIGF2YWlsYWJsZSBpbiB0aGUgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgYWxsIHRoZSBnaXZlbiBjb2x1bW5zIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2x1bW5bXSBjb2xzLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIFVOSU9OIHVzZWQgdG8gc2VsZWN0IGEgaGllcmFyY2h5IG9mCisgICAgICogbWFwcGluZ3MsIHRoZSBiYXNlIG1hcHBpbmcgcmVwcmVzZW50ZWQgYnkgdGhlIGN1cnJlbnQgcm93LgorICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBhZnRlciBnZXR0aW5nIGFueSBlYWdlciByZXN1bHRzCisgICAgICogZnJvbSB0aGUgcm93LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01hcHBpbmcgZ2V0QmFzZU1hcHBpbmcoKTsKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIFVOSU9OIHVzZWQgdG8gc2VsZWN0IGEgaGllcmFyY2h5IG9mCisgICAgICogbWFwcGluZ3MsIHRoZSBiYXNlIG1hcHBpbmcgcmVwcmVzZW50ZWQgYnkgdGhlIGN1cnJlbnQgcm93LgorICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBhZnRlciBnZXR0aW5nIGFueSBlYWdlciByZXN1bHRzCisgICAgICogZnJvbSB0aGUgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VNYXBwaW5nKENsYXNzTWFwcGluZyBtYXBwaW5nKTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2VsZWN0IHdpdGhpbiB0aGUgVU5JT04gdGhhdCB0aGUgY3VycmVudCByb3cKKyAgICAgKiBjb3JyZXNwb25kcyB0bywgb3IgMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluZGV4T2YoKTsKKworICAgIC8qKgorICAgICAqIExvYWQgYSBwYyBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHN0b3JlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb2FkKENsYXNzTWFwcGluZyBtYXBwaW5nLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGEgcGMgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBzdG9yZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9hZChDbGFzc01hcHBpbmcgbWFwcGluZywgSkRCQ1N0b3JlIHN0b3JlLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQ7IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIEFycmF5IGdldEFycmF5KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbiBvciBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXIoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQ7IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbiBvciBpZDsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmxvYiBnZXRCbG9iKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICovCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbiBvciBpZDsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBDYWxlbmRhciBnZXRDYWxlbmRhcihPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbiBvciBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2hhciBnZXRDaGFyKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBDbG9iIGdldENsb2IoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZShPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbiBvciBpZDsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKE9iamVjdCBvYmosIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExvbmcoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICovCisgICAgcHVibGljIE51bWJlciBnZXROdW1iZXIoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBjb2x1bW4gb3IgaWQgd2hvc2UgZGF0YSB0byBmZXRjaAorICAgICAqIEBwYXJhbSBtZXRhVHlwZSB0aGUgdHlwZSBjb2RlIGZyb20ge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlc30gb3IKKyAgICAgKiB7QGxpbmsgSmF2YVNRTFR5cGVzfSBmb3IgdGhlIHR5cGUgb2YgdGhlIGRhdGE7IGlmCisgICAgICogPGNvZGU+b2JqPC9jb2RlPiBpcyBhIGNvbHVtbiwgeW91IG1heSBzcGVjaWZ5IC0xCisgICAgICogdG8gdXNlIHRoZSBjb2x1bW4ncyByZWNvcmRlZCBqYXZhIHR5cGUKKyAgICAgKiBAcGFyYW0gYXJnIHNvbWUgSkRCQyBkYXRhIGFjY2VzcyBtZXRob2RzIHVzZSBhbiBhcmd1bWVudCwgc3VjaAorICAgICAqIGFzIGEge0BsaW5rIENhbGVuZGFyfSBvciB7QGxpbmsgTWFwfQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmosIGludCBtZXRhVHlwZSwgT2JqZWN0IGFyZykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQ7IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRTUUxPYmplY3QoT2JqZWN0IG9iaiwgTWFwIG1hcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQ7IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIFJlZiBnZXRSZWYoT2JqZWN0IG9iaiwgTWFwIG1hcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4gb3IgaWQuCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldFNob3J0KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uIG9yIGlkOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoT2JqZWN0IG9iaiwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbiBvciBpZDsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBBcnJheSBnZXRBcnJheShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW47IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldEFzY2lpU3RyZWFtKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbjsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QmluYXJ5U3RyZWFtKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbjsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmxvYiBnZXRCbG9iKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbjsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBjaGFyIGdldENoYXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbjsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbjsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKENvbHVtbiBjb2wsIENhbGVuZGFyIGNhbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50KENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZShDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIE51bWJlciBnZXROdW1iZXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHdob3NlIGRhdGEgdG8gZmV0Y2gKKyAgICAgKiBAcGFyYW0gYXJnIHNvbWUgSkRCQyBkYXRhIGFjY2VzcyBtZXRob2RzIHVzZSBhbiBhcmd1bWVudCwgc3VjaAorICAgICAqIGFzIGEge0BsaW5rIENhbGVuZGFyfSBvciB7QGxpbmsgTWFwfQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KENvbHVtbiBjb2wsIE9iamVjdCBhcmcsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbHVtbjsgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSByZXN1bHRzIHRoYXQgYXJlIG5vdCBiYWNrZWQgYnkgYSBTUUwgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNRTE9iamVjdChDb2x1bW4gY29sLCBNYXAgbWFwLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW47IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIFJlZiBnZXRSZWYoQ29sdW1uIGNvbCwgTWFwIG1hcCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChDb2x1bW4gY29sLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gY29sdW1uOyBtYXkgbm90IGJlIHN1cHBvcnRlZAorICAgICAqIGJ5IHJlc3VsdHMgdGhhdCBhcmUgbm90IGJhY2tlZCBieSBhIFNRTCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoQ29sdW1uIGNvbCwgQ2FsZW5kYXIgY2FsLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBnaXZlbiBjb2x1bW47IG1heSBub3QgYmUgc3VwcG9ydGVkCisgICAgICogYnkgcmVzdWx0cyB0aGF0IGFyZSBub3QgYmFja2VkIGJ5IGEgU1FMIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoQ29sdW1uIGNvbCwgQ2FsZW5kYXIgY2FsLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBsYXN0IHZhbHVlIGZldGNoZWQgd2FzIG51bGwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gd2FzTnVsbCgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoaXMgcmVjZWl2ZXIgYWJvdXQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgZm9yIHdoaWNoIGEKKyAgICAgKiBzdWJzZXF1ZW50IGRhdGEgcmVxdWVzdCB3aWxsIGJlIG1hZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnREYXRhUmVxdWVzdChPYmplY3QgbWFwcGluZyk7CisKKyAgICAvKioKKyAgICAgKiBFbmRzIGEgZGF0YSByZXF1ZXN0LiBNdXN0IGJlIGNhbGxlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgICAgICoge0BsaW5rICNzdGFydERhdGFSZXF1ZXN0fS4gVGhlIGNhbGxzIGNhbiBiZSBuZXN0ZWQgYXMgZm9sbHdzPGJyIC8+CisgICAgICogPHByZT4gc3RhcnREYXRhUmVxdWVzdCAocmVsYXRpb24pOyBzdGFydERhdGFSZXF1ZXN0IChyZWxhdGlvbnNGaWVsZCk7CisgICAgICogZ2V0T2JqZWN0KCJDT0xVTU5fWSIpOyBlbmREYXRhUmVxdWVzdCAoKTsgZW5kRGF0YVJlcXVlc3QgKCk7CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRGF0YVJlcXVlc3QoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Jlc3VsdFNldFJlc3VsdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUmVzdWx0U2V0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlNGMzMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Jlc3VsdFNldFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zcWwuQXJyYXk7CitpbXBvcnQgamF2YS5zcWwuQmxvYjsKK2ltcG9ydCBqYXZhLnNxbC5DbG9iOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUmVmOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlRpbWU7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIEJhc2Uge0BsaW5rIFJlc3VsdH0gaW1wbGVtZW50YXRpb24gd3JhcHBlZCBhcm91bmQgYSByZXN1bHQgc2V0LgorICogQ29sdW1uIG9iamVjdHMsIGNvbHVtbiBuYW1lcywgb3IgY29sdW1uIGluZGV4ZXMgKGFzIDxjb2RlPk51bWJlcjwvY29kZT4KKyAqIGluc3RhbmNlcykgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgcmVzdWx0IHNldCBkYXRhLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN1bHRTZXRSZXN1bHQKKyAgICBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbiBfY29ubjsKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlbWVudCBfc3RtbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRTZXQgX3JzOworICAgIHByaXZhdGUgZmluYWwgREJEaWN0aW9uYXJ5IF9kaWN0OworICAgIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VDb25uID0gdHJ1ZTsKKyAgICBwcml2YXRlIGludCBfcm93ID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgX3NpemUgPSAtMTsKKworICAgIC8vIG9wdGlvbmFsOyB1c2VkIHRvIGRlc2VyaWFsaXplIGJsb2JzIGNvbnRhaW5pbmcgcmVmcyB0byBwZXJzaXN0ZW50IG9ianMKKyAgICBwcml2YXRlIEpEQkNTdG9yZSBfc3RvcmUgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdFNldFJlc3VsdChDb25uZWN0aW9uIGNvbm4sIFN0YXRlbWVudCBzdG1udCwKKyAgICAgICAgUmVzdWx0U2V0IHJzLCBEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICBpZiAoc3RtbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RtbnQgPSBycy5nZXRTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgX2Nvbm4gPSBjb25uOworICAgICAgICBfc3RtbnQgPSBzdG1udDsKKyAgICAgICAgX3JzID0gcnM7CisgICAgICAgIF9kaWN0ID0gZGljdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0U2V0UmVzdWx0KENvbm5lY3Rpb24gY29ubiwgU3RhdGVtZW50IHN0bW50LAorICAgICAgICBSZXN1bHRTZXQgcnMsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICB0aGlzKGNvbm4sIHN0bW50LCBycywgc3RvcmUuZ2V0REJEaWN0aW9uYXJ5KCkpOworICAgICAgICBzZXRTdG9yZShzdG9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkRCQyAyIGNvbnN0cnVjdG9yLiBSZWxpZXMgb24gYmVpbmcgYWJsZSB0byByZXRyaWV2ZSB0aGUgc3RhdGVtZW50CisgICAgICogZnJvbSB0aGUgcmVzdWx0IHNldCwgYW5kIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0U2V0UmVzdWx0KFJlc3VsdFNldCBycywgREJEaWN0aW9uYXJ5IGRpY3QpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQgPSBycy5nZXRTdGF0ZW1lbnQoKTsKKyAgICAgICAgX2Nvbm4gPSBfc3RtbnQuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBfcnMgPSByczsKKyAgICAgICAgX2RpY3QgPSBkaWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEpEQkMgMiBjb25zdHJ1Y3Rvci4gUmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gcmV0cmlldmUgdGhlIHN0YXRlbWVudAorICAgICAqIGZyb20gdGhlIHJlc3VsdCBzZXQsIGFuZCB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdFNldFJlc3VsdChSZXN1bHRTZXQgcnMsIEpEQkNTdG9yZSBzdG9yZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMocnMsIHN0b3JlLmdldERCRGljdGlvbmFyeSgpKTsKKyAgICAgICAgc2V0U3RvcmUoc3RvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhdGVtZW50IHRoYXQgcHJvZHVjZWQgdGhpcyByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIFN0YXRlbWVudCBnZXRTdGF0ZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBfc3RtbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYWNraW5nIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRSZXN1bHRTZXQoKSB7CisgICAgICAgIHJldHVybiBfcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaWN0aW9uYXJ5IGluIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgREJEaWN0aW9uYXJ5IGdldERCRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIHN0b3JlIG1hbmFnZXIgdXNlZCB0byBkZXNlcmlhbGl6ZSBibG9icyBjb250YWluaW5nCisgICAgICogcmVmZXJlbmNlcyB0byBwZXJzaXN0ZW50IG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEpEQkNTdG9yZSBnZXRTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpb25hbCBzdG9yZSBtYW5hZ2VyIHVzZWQgdG8gZGVzZXJpYWxpemUgYmxvYnMgY29udGFpbmluZworICAgICAqIHJlZmVyZW5jZXMgdG8gcGVyc2lzdGVudCBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlKEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICBfc3RvcmUgPSBzdG9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBiYWNraW5nIGNvbm5lY3Rpb24gd2hlbiB0aGlzIHJlc3VsdCBpcyBjbG9zZWQuCisgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbG9zZUNvbm5lY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBfY2xvc2VDb25uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIGJhY2tpbmcgY29ubmVjdGlvbiB3aGVuIHRoaXMgcmVzdWx0IGlzIGNsb3NlZC4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb3NlQ29ubmVjdGlvbihib29sZWFuIGNsb3NlQ29ubikgeworICAgICAgICBfY2xvc2VDb25uID0gY2xvc2VDb25uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3JzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICB9CisgICAgICAgIGlmIChfc3RtbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3N0bW50LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKF9jbG9zZUNvbm4pCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9jb25uLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2VzcygpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFR5cGUoKSAhPSBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWJzb2x1dGVJbnRlcm5hbChpbnQgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJvdyA9PSArK19yb3cpCisgICAgICAgICAgICByZXR1cm4gX3JzLm5leHQoKTsKKworICAgICAgICAvLyByYW5kb20gYWNjZXNzCisgICAgICAgIF9ycy5hYnNvbHV0ZShyb3cgKyAxKTsKKyAgICAgICAgaWYgKF9ycy5nZXRSb3coKSA9PSAwKSB7CisgICAgICAgICAgICBfcm93ID0gLTE7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgX3JvdyA9IHJvdzsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbmV4dEludGVybmFsKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9yb3crKzsKKyAgICAgICAgcmV0dXJuIF9ycy5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgX3JzLmxhc3QoKTsKKyAgICAgICAgICAgIF9zaXplID0gX3JzLmdldFJvdygpOworICAgICAgICAgICAgaWYgKF9yb3cgPT0gLTEpCisgICAgICAgICAgICAgICAgX3JzLmJlZm9yZUZpcnN0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX3JzLmFic29sdXRlKF9yb3cgKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3NpemU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoKE51bWJlcikgdHJhbnNsYXRlKG9iaiwgam9pbnMpKS5pbnRWYWx1ZSgpID4gMDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQXJyYXkgZ2V0QXJyYXlJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRBcnJheShfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldEFzY2lpU3RyZWFtKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbEludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldEJpZ0RlY2ltYWwoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGdldE51bWJlckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldE51bWJlcihfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRCaWdJbnRlZ2VyKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldEJpbmFyeVN0cmVhbShfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCbG9iIGdldEJsb2JJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRCbG9iKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Qm9vbGVhbkludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldEJvb2xlYW4oX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYnl0ZSBnZXRCeXRlSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2RpY3QuZ2V0Qnl0ZShfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBieXRlW10gZ2V0Qnl0ZXNJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRCeXRlcyhfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDYWxlbmRhciBnZXRDYWxlbmRhckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldENhbGVuZGFyKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNoYXIgZ2V0Q2hhckludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldENoYXIoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVhZGVyIGdldENoYXJhY3RlclN0cmVhbUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldENoYXJhY3RlclN0cmVhbShfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbG9iIGdldENsb2JJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRDbG9iKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIERhdGUgZ2V0RGF0ZUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldERhdGUoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgamF2YS5zcWwuRGF0ZSBnZXREYXRlSW50ZXJuYWwoT2JqZWN0IG9iaiwgQ2FsZW5kYXIgY2FsLAorICAgICAgICBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXREYXRlKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSwgY2FsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZG91YmxlIGdldERvdWJsZUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldERvdWJsZShfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmbG9hdCBnZXRGbG9hdEludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldEZsb2F0KF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRJbnRJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRJbnQoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldExvY2FsZUludGVybmFsKE9iamVjdCBvYmosIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldExvY2FsZShfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIGdldExvbmdJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRMb25nKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RJbnRlcm5hbChPYmplY3Qgb2JqLCBpbnQgbWV0YVR5cGVDb2RlLAorICAgICAgICBPYmplY3QgYXJnLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtZXRhVHlwZUNvZGUgPT0gLTEgJiYgb2JqIGluc3RhbmNlb2YgQ29sdW1uKQorICAgICAgICAgICAgbWV0YVR5cGVDb2RlID0gKChDb2x1bW4pIG9iaikuZ2V0SmF2YVR5cGUoKTsKKworICAgICAgICBPYmplY3QgdmFsID0gbnVsbDsKKyAgICAgICAgc3dpdGNoIChtZXRhVHlwZUNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOX09CSjoKKyAgICAgICAgICAgICAgICB2YWwgPSAoZ2V0Qm9vbGVhbkludGVybmFsKG9iaiwgam9pbnMpKSA/IEJvb2xlYW4uVFJVRQorICAgICAgICAgICAgICAgICAgICA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgdmFsID0gbmV3IEJ5dGUoZ2V0Qnl0ZUludGVybmFsKG9iaiwgam9pbnMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgICAgICB2YWwgPSBuZXcgQ2hhcmFjdGVyKGdldENoYXJJbnRlcm5hbChvYmosIGpvaW5zKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEVfT0JKOgorICAgICAgICAgICAgICAgIHZhbCA9IG5ldyBEb3VibGUoZ2V0RG91YmxlSW50ZXJuYWwob2JqLCBqb2lucykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgdmFsID0gbmV3IEZsb2F0KGdldEZsb2F0SW50ZXJuYWwob2JqLCBqb2lucykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UX09CSjoKKyAgICAgICAgICAgICAgICB2YWwgPSBOdW1iZXJzLnZhbHVlT2YoZ2V0SW50SW50ZXJuYWwob2JqLCBqb2lucykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkdfT0JKOgorICAgICAgICAgICAgICAgIHZhbCA9IE51bWJlcnMudmFsdWVPZihnZXRMb25nSW50ZXJuYWwob2JqLCBqb2lucykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgdmFsID0gbmV3IFNob3J0KGdldFNob3J0SW50ZXJuYWwob2JqLCBqb2lucykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmdJbnRlcm5hbChvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RpY3QKKyAgICAgICAgICAgICAgICAgICAgLmdldEJsb2JPYmplY3QoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpLCBfc3RvcmUpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0ZUludGVybmFsKG9iaiwgam9pbnMpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0FMRU5EQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldENhbGVuZGFySW50ZXJuYWwob2JqLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdERUNJTUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaWdEZWNpbWFsSW50ZXJuYWwob2JqLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldE51bWJlckludGVybmFsKG9iaiwgam9pbnMpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmlnSW50ZWdlckludGVybmFsKG9iaiwgam9pbnMpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9DQUxFOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVJbnRlcm5hbChvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLlNRTF9BUlJBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXJyYXlJbnRlcm5hbChvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLkFTQ0lJX1NUUkVBTToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXNjaWlTdHJlYW1JbnRlcm5hbChvYmosIGpvaW5zKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLkJJTkFSWV9TVFJFQU06CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeVN0cmVhbUludGVybmFsKG9iaiwgam9pbnMpOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuQkxPQjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmxvYkludGVybmFsKG9iaiwgam9pbnMpOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuQllURVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ5dGVzSW50ZXJuYWwob2JqLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5DSEFSX1NUUkVBTToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhcmFjdGVyU3RyZWFtSW50ZXJuYWwob2JqLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5DTE9COgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRDbG9iSW50ZXJuYWwob2JqLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5TUUxfREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0ZUludGVybmFsKG9iaiwgKENhbGVuZGFyKSBhcmcsIGpvaW5zKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVNRTFR5cGVzLlNRTF9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNRTE9iamVjdEludGVybmFsKG9iaiwgKE1hcCkgYXJnLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5SRUY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJlZkludGVybmFsKG9iaiwgKE1hcCkgYXJnLCBqb2lucyk7CisgICAgICAgICAgICBjYXNlIEphdmFTUUxUeXBlcy5USU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRUaW1lSW50ZXJuYWwob2JqLCAoQ2FsZW5kYXIpIGFyZywgam9pbnMpOworICAgICAgICAgICAgY2FzZSBKYXZhU1FMVHlwZXMuVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRUaW1lc3RhbXBJbnRlcm5hbChvYmosIChDYWxlbmRhcikgYXJnLCBqb2lucyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb2x1bW4pIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sdW1uIGNvbCA9IChDb2x1bW4pIG9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5nZXRUeXBlKCkgPT0gVHlwZXMuQkxPQgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29sLmdldFR5cGUoKSA9PSBUeXBlcy5WQVJCSU5BUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGljdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCbG9iT2JqZWN0KF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2RpY3QuZ2V0T2JqZWN0KF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChfcnMud2FzTnVsbCgpKSA/IG51bGwgOiB2YWw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTUUxPYmplY3RJbnRlcm5hbChPYmplY3Qgb2JqLCBNYXAgbWFwLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRPYmplY3QoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpLCBtYXApOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZWYgZ2V0UmVmSW50ZXJuYWwoT2JqZWN0IG9iaiwgTWFwIG1hcCwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2RpY3QuZ2V0UmVmKF9ycywgKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKSwgbWFwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc2hvcnQgZ2V0U2hvcnRJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRTaG9ydChfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nSW50ZXJuYWwoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sdW1uICYmICgoQ29sdW1uKSBvYmopLmdldFR5cGUoKSA9PSBUeXBlcy5DTE9CKQorICAgICAgICAgICAgcmV0dXJuIF9kaWN0LmdldENsb2JTdHJpbmcoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldFN0cmluZyhfcnMsICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBUaW1lIGdldFRpbWVJbnRlcm5hbChPYmplY3Qgb2JqLCBDYWxlbmRhciBjYWwsIEpvaW5zIGpvaW5zKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kaWN0LmdldFRpbWUoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpLCBjYWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wSW50ZXJuYWwoT2JqZWN0IG9iaiwgQ2FsZW5kYXIgY2FsLAorICAgICAgICBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZGljdC5nZXRUaW1lc3RhbXAoX3JzLCAoKE51bWJlcikgb2JqKS5pbnRWYWx1ZSgpLCBjYWwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdhc051bGwoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy53YXNOdWxsKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2xhdGUoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihmaW5kT2JqZWN0KG9iaiwgam9pbnMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDEtYmFzZWQgcmVzdWx0IHNldCBpbmRleCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBvciBpZCwgb3IgYQorICAgICAqIG5vbi1wb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGNvbHVtbiBpcyBub3QgY29udGFpbmVkIGluIHRoaXMgcmVzdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZmluZE9iamVjdChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0U2V0KCkuZmluZENvbHVtbihvYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3cuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Jvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzdlYjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3cuamF2YQpAQCAtMCwwICsxLDUyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc3FsLkFycmF5OworaW1wb3J0IGphdmEuc3FsLkJsb2I7CitpbXBvcnQgamF2YS5zcWwuQ2xvYjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlJlbGF0aW9uSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uSU87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBMb2dpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgdGFibGUgcm93IGZvciBpbnNlcnQvdXBkYXRlL2RlbGV0ZS4gVGhlCisgKiB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLlVwZGF0ZU1hbmFnZXJ9IGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcKKyAqIHJvd3MgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZXMgYXJlIHNldC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJvdyB7CisKKyAgICAvKioKKyAgICAgKiBTeW1ib2xpYyBjb25zdGFudCByZXNlcnZlZCBmb3Igc2l0dWF0aW9ucyB3aGVuIGEgcm93IG9wZXJhdGlvbgorICAgICAqIGlzIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1VOS05PV04gPSAtMTsKKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIHJvdyBmb3IgdXBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9VUERBVEUgPSAwOworCisgICAgLyoqCisgICAgICogTWFyayB0aGUgcm93IGZvciBpbnNlcnR0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9JTlNFUlQgPSAxOworCisgICAgLyoqCisgICAgICogTWFyayB0aGUgcm93IGZvciBkZWxldGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fREVMRVRFID0gMjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyBUYWJsZSBnZXRUYWJsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhY3Rpb24gZm9yIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZhaWxlZCBvYmplY3QgdG8gaW5jbHVkZSBpbiBvcHRpbWlzdGljIGxvY2sgZXhjZXB0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmYWlsZWQgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIG9wdGltaXN0aWMgbG9jayBleGNlcHRpb24KKyAgICAgKiB0aGF0IHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgdXBkYXRlIHJlc3VsdHMgaW4gYW4gdXBkYXRlIGNvdW50IG9mIDAKKyAgICAgKiB3aGVuIGV4ZWN1dGVkLiBMZWF2ZSBudWxsIHRvIGF2b2lkIGNoZWNraW5nIHRoZSB1cGRhdGUgY291bnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbGVkT2JqZWN0KE9iamVjdCBmYWlsZWQpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHJvdyBoYXMgaW5mb3JtYXRpb24gc2V0IG9uIGl0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyByb3cgaGFzIGluZm9ybWF0aW9uIHNldCBvbiBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZChib29sZWFuIHZhbGlkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5zdGFuY2UgdGhhdCBjb250cm9scyB0aGlzIHJvdy4gVGhlCisgICAgICoge0BsaW5rICNzZXRQcmltYXJ5S2V5fSBtZXRob2QgZG9lcyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBiZSBjYWxsZWQKKyAgICAgKiB0byBrbm93IHRoZSBvd25pbmcgaW5zdGFuY2UsIG5vciBkb2VzIHRoaXMgcm93J3MgdGFibGUgaGF2ZSB0byBoYXZlCisgICAgICogYW4gYWN0dWFsIHByaW1hcnkga2V5LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldFByaW1hcnlLZXkoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJpbWFyeSBrZXkgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcmltYXJ5IGtleSB0byByZXByZXNlbnQgdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbyBpbmZvcm1hdGlvbiBvbiB3aGljaCBjb2x1bW5zIGFyZSBzZXR0YWJsZTsgbWF5IGJlIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5KENvbHVtbklPIGlvLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcmltYXJ5IGtleSBlcXVhbGl0eSBjcml0ZXJpYSBmb3IgdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVQcmltYXJ5S2V5KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmb3JlaWduIGtleSB0byB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqIElmIHRoZSByZWxhdGVkIHR5cGUgdXNlcyB0YWJsZS1wZXItY2xhc3MgbWFwcGluZ3MsIHRoZSBmb3JlaWduIGtleSBtYXkKKyAgICAgKiBiZSB0YXJnZXRlZCBhdCBhbiBpbmRlcGVuZGVudCBzdXBlcmNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IHRvIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICogSWYgdGhlIHJlbGF0ZWQgdHlwZSB1c2VzIHRhYmxlLXBlci1jbGFzcyBtYXBwaW5ncywgdGhlIGZvcmVpZ24ga2V5IG1heQorICAgICAqIGJlIHRhcmdldGVkIGF0IGFuIGluZGVwZW5kZW50IHN1cGVyY2xhc3MgdGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW8gaW5mb3JtYXRpb24gb24gd2hpY2ggY29sdW1ucyBhcmUgc2V0dGFibGU7IG1heSBiZSBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBDb2x1bW5JTyBpbywKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9yZWlnbiBrZXkgZXF1YWxpdHkgY3JpdGVyaWEgdG8gbGluayB0byB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqIElmIHRoZSByZWxhdGVkIHR5cGUgdXNlcyB0YWJsZS1wZXItY2xhc3MgbWFwcGluZ3MsIHRoZSBmb3JlaWduIGtleSBtYXkKKyAgICAgKiBiZSB0YXJnZXRlZCBhdCBhbiBpbmRlcGVuZGVudCBzdXBlcmNsYXNzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlRm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5KENvbHVtbiBjb2wsIEFycmF5IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBc2NpaVN0cmVhbShDb2x1bW4gY29sLCBJbnB1dFN0cmVhbSB2YWwsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbChDb2x1bW4gY29sLCBCaWdEZWNpbWFsIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaWdJbnRlZ2VyKENvbHVtbiBjb2wsIEJpZ0ludGVnZXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeVN0cmVhbShDb2x1bW4gY29sLCBJbnB1dFN0cmVhbSB2YWwsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmxvYihDb2x1bW4gY29sLCBCbG9iIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKENvbHVtbiBjb2wsIGJvb2xlYW4gdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGUoQ29sdW1uIGNvbCwgYnl0ZSB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoQ29sdW1uIGNvbCwgYnl0ZVtdIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxlbmRhcihDb2x1bW4gY29sLCBDYWxlbmRhciB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcihDb2x1bW4gY29sLCBjaGFyIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oQ29sdW1uIGNvbCwgUmVhZGVyIHZhbCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9iKENvbHVtbiBjb2wsIENsb2IgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoQ29sdW1uIGNvbCwgRGF0ZSB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShDb2x1bW4gY29sLCBqYXZhLnNxbC5EYXRlIHZhbCwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShDb2x1bW4gY29sLCBkb3VibGUgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0KENvbHVtbiBjb2wsIGZsb2F0IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnQoQ29sdW1uIGNvbCwgaW50IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb25nKENvbHVtbiBjb2wsIGxvbmcgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShDb2x1bW4gY29sLCBMb2NhbGUgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bGwoQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdmVycmlkZURlZmF1bHQgd2hldGhlciB0byBzZXQgdGhpcyBjb2x1bW4gdG8gbnVsbCBldmVuIGlmIHRoaXMKKyAgICAgKiBpcyBhbiBpbnNlcnQgYW5kIHRoZSBjb2x1bW4gaGFzIGEgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bGwoQ29sdW1uIGNvbCwgYm9vbGVhbiBvdmVycmlkZURlZmF1bHQpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtYmVyKENvbHVtbiBjb2wsIE51bWJlciB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gYmVpbmcgc2V0CisgICAgICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgZm9yIHRoZSBjb2x1bW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoQ29sdW1uIGNvbCwgT2JqZWN0IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhIERCIHVuZGVyc3Rvb2QgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICogVGhlIHZhbHVlIHdpbGwgbm90IGJlIHBhcmFtZXRlcml6ZWQgYW5kIGluc3RlYWQgYmUgaW5zZXJ0ZWQgYXMgcmF3IFNRTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYXcoQ29sdW1uIGNvbCwgU3RyaW5nIHZhbHVlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIHRvIHRoZSBpZGVudGl0eSBvZiBnaXZlbiBpbnN0YW5jZSwKKyAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gY2FsbGJhY2sgdG8gY3JlYXRlIHRoZSBjb2x1bW4gdmFsdWUuIFRoaXMgbWV0aG9kIGlzCisgICAgICogdXNlZCBmb3IgbWFwcGluZ3MgdGhhdCBzdG9yZSBzb21lIHNlcmlhbGl6ZWQgZm9ybSBvZiBpZCB2YWx1ZXMsIGJ1dCBtdXN0CisgICAgICogbWFrZSBzdXJlIHRoYXQgdGhlIHJlbGF0ZWQgb2JqZWN0J3MgaWQgaXMgYXNzaWduZWQgKHdoaWNoIG1pZ2h0CisgICAgICogcmVxdWlyZSBhbiBpbnNlcnQgaWYgdGhlIGluc3RhbmNlIHVzZXMgYXV0by1pbmNyZW1lbnQpIGJlZm9yZSBpdCBpcworICAgICAqIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25JZChDb2x1bW4gY29sLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBSZWxhdGlvbklkIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChDb2x1bW4gY29sLCBzaG9ydCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKENvbHVtbiBjb2wsIFN0cmluZyB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZShDb2x1bW4gY29sLCBUaW1lIHZhbCwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChDb2x1bW4gY29sLCBUaW1lc3RhbXAgdmFsLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlQXJyYXkoQ29sdW1uIGNvbCwgQXJyYXkgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUFzY2lpU3RyZWFtKENvbHVtbiBjb2wsIElucHV0U3RyZWFtIHZhbCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhbiBlcXVhbGl0eSBjb25kaXRpb24gb24gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVCaWdEZWNpbWFsKENvbHVtbiBjb2wsIEJpZ0RlY2ltYWwgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUJpZ0ludGVnZXIoQ29sdW1uIGNvbCwgQmlnSW50ZWdlciB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlQmluYXJ5U3RyZWFtKENvbHVtbiBjb2wsIElucHV0U3RyZWFtIHZhbCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhbiBlcXVhbGl0eSBjb25kaXRpb24gb24gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVCbG9iKENvbHVtbiBjb2wsIEJsb2IgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUJvb2xlYW4oQ29sdW1uIGNvbCwgYm9vbGVhbiB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlQnl0ZShDb2x1bW4gY29sLCBieXRlIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhbiBlcXVhbGl0eSBjb25kaXRpb24gb24gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVCeXRlcyhDb2x1bW4gY29sLCBieXRlW10gdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUNhbGVuZGFyKENvbHVtbiBjb2wsIENhbGVuZGFyIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhbiBlcXVhbGl0eSBjb25kaXRpb24gb24gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVDaGFyKENvbHVtbiBjb2wsIGNoYXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUNoYXJhY3RlclN0cmVhbShDb2x1bW4gY29sLCBSZWFkZXIgdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUNsb2IoQ29sdW1uIGNvbCwgQ2xvYiB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlRGF0ZShDb2x1bW4gY29sLCBEYXRlIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhbiBlcXVhbGl0eSBjb25kaXRpb24gb24gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVEYXRlKENvbHVtbiBjb2wsIGphdmEuc3FsLkRhdGUgdmFsLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlRG91YmxlKENvbHVtbiBjb2wsIGRvdWJsZSB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlRmxvYXQoQ29sdW1uIGNvbCwgZmxvYXQgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUludChDb2x1bW4gY29sLCBpbnQgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUxvbmcoQ29sdW1uIGNvbCwgbG9uZyB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlTG9jYWxlKENvbHVtbiBjb2wsIExvY2FsZSB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlTnVsbChDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZU51bWJlcihDb2x1bW4gY29sLCBOdW1iZXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiBiZWluZyBzZXQKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSBmb3IgdGhlIGNvbHVtbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlT2JqZWN0KENvbHVtbiBjb2wsIE9iamVjdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBEQiB1bmRlcnN0b29kIHdoZXJlIGNvbmRpdGlvbiBmb3IgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKiBUaGUgdmFsdWUgd2lsbCBub3QgYmUgcGFyYW1ldGVyaXplZCBhbmQgaW5zdGVhZCBiZSBpbnNlcnRlZCBhcyByYXcgU1FMLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlUmF3KENvbHVtbiBjb2wsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldCBhbiBlcXVhbGl0eSBjb25kaXRpb24gb24gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhpcyByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmVTaG9ydChDb2x1bW4gY29sLCBzaG9ydCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlU3RyaW5nKENvbHVtbiBjb2wsIFN0cmluZyB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gZXF1YWxpdHkgY29uZGl0aW9uIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlVGltZShDb2x1bW4gY29sLCBUaW1lIHZhbCwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGVxdWFsaXR5IGNvbmRpdGlvbiBvbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZVRpbWVzdGFtcChDb2x1bW4gY29sLCBUaW1lc3RhbXAgdmFsLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3dJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3dJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiMjdjNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Jvd0ltcGwuamF2YQpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc3FsLkFycmF5OworaW1wb3J0IGphdmEuc3FsLkJsb2I7CitpbXBvcnQgamF2YS5zcWwuQ2xvYjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuQ2xhc3NNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSmF2YVNRTFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSm9pbmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5SZWxhdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIEJhc2ljIHtAbGluayBSb3d9IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBSb3dJbXBsCisgICAgaW1wbGVtZW50cyBSb3csIENsb25lYWJsZSB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBOVUxMID0gbmV3IE9iamVjdCgpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBTElEID0gMiA8PCAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBVyA9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgcHJvdGVjdGVkIGJ5dGUgZmxhZ3MgPSAwOworICAgIHByaXZhdGUgZmluYWwgQ29sdW1uW10gX2NvbHM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX2FjdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF92YWxzOworICAgIHByaXZhdGUgZmluYWwgaW50W10gX3R5cGVzOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX3NxbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdGhlIHJvdyBpcyBhIHBhcnQgb2YKKyAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gb24gdGhlIHJvdworICAgICAqLworICAgIHB1YmxpYyBSb3dJbXBsKFRhYmxlIHRhYmxlLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIHRoaXModGFibGUuZ2V0Q29sdW1ucygpLCBhY3Rpb24pOworICAgIH0KKworICAgIHByb3RlY3RlZCBSb3dJbXBsKENvbHVtbltdIGNvbHMsIGludCBhY3Rpb24pIHsKKyAgICAgICAgX2NvbHMgPSBjb2xzOworICAgICAgICBfYWN0aW9uID0gYWN0aW9uOworCisgICAgICAgIC8vIHdlIG5lZWQgcm9vbSBmb3IgdmFsdWVzIGFuZCB0eXBlcyBmb3IgYWxsIGNvbHVtbnM7IGlmIGFuIHVwZGF0ZSBvcgorICAgICAgICAvLyBkZWxldGUsIHRoZW4gd2UgbmVlZCB0byBkb3VibGUgdGhhdCBmb3Igd2hlcmUgY29sdW1uIGNvbmRpdGlvbnMKKyAgICAgICAgaW50IGxlbiA9IF9jb2xzLmxlbmd0aDsKKyAgICAgICAgaWYgKGFjdGlvbiAhPSBBQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgbGVuICo9IDI7CisgICAgICAgIF92YWxzID0gbmV3IE9iamVjdFtsZW5dOworICAgICAgICBfdHlwZXMgPSBuZXcgaW50W2xlbl07CisgICAgfQorCisgICAgcHVibGljIFRhYmxlIGdldFRhYmxlKCkgeworICAgICAgICByZXR1cm4gX2NvbHNbMF0uZ2V0VGFibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uW10gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgcmV0dXJuIF9jb2xzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gKGZsYWdzICYgVkFMSUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiB2YWxpZCkgeworICAgICAgICBpZiAodmFsaWQpCisgICAgICAgICAgICBmbGFncyB8PSBWQUxJRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MgJj0gflZBTElEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdHJhY2sgcHJpbWFyeSBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldFByaW1hcnlLZXkoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdHJhY2sgZmFpbGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRGYWlsZWRPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdHJhY2sgZmFpbGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbGVkT2JqZWN0KE9iamVjdCBmYWlsZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2Vjb25kYXJ5IHJvd3MgY2Fubm90IGJlIGRlcGVuZGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc2V0IGZvciB1cGRhdGUgb24gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNldChDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBfdmFsc1tnZXRTZXRJbmRleChjb2wpXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHNldCBmb3Igd2hlcmUgb24gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFdoZXJlKENvbHVtbiBjb2wpIHsKKyAgICAgICAgcmV0dXJuIF92YWxzW2dldFdoZXJlSW5kZXgoY29sKV07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0UHJpbWFyeUtleShudWxsLCBzbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShDb2x1bW5JTyBpbywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGZsdXNoUHJpbWFyeUtleShzbSwgaW8sIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlUHJpbWFyeUtleShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmx1c2hQcmltYXJ5S2V5KHNtLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHByaW1hcnkga2V5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmx1c2hQcmltYXJ5S2V5KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIENvbHVtbklPIGlvLAorICAgICAgICBib29sZWFuIHNldCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nID0gKENsYXNzTWFwcGluZykgc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2V0VGFibGUoKSAhPSBnZXRUYWJsZSgpKQorICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmcuZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpOworICAgICAgICBDb2x1bW5bXSBjb2xzID0gbWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBmbHVzaEpvaW5WYWx1ZXMoc20sIGNvbHMsIGNvbHMsIGlvLCBzZXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldEZvcmVpZ25LZXkoZmssIG51bGwsIHNtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JlaWduS2V5KEZvcmVpZ25LZXkgZmssIENvbHVtbklPIGlvLAorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmx1c2hGb3JlaWduS2V5KGZrLCBpbywgc20sIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlRm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmx1c2hGb3JlaWduS2V5KGZrLCBudWxsLCBzbSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGEgY2lyY3VsYXIgZm9yZWlnbiBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJGb3JlaWduS2V5KEZvcmVpZ25LZXkgZmspCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3FsID0gbnVsbDsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX3ZhbHNbZ2V0U2V0SW5kZXgoY29sc1tpXSldID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgZm9yZWlnbiBrZXkgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaEZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgQ29sdW1uSU8gaW8sCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGJvb2xlYW4gc2V0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmx1c2hKb2luVmFsdWVzKHNtLCBmay5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLCBmay5nZXRDb2x1bW5zKCksCisgICAgICAgICAgICBpbywgc2V0KTsKKyAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbHVtbltdIGNvbHMgPSBmay5nZXRDb25zdGFudENvbHVtbnMoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBmay5nZXRDb2x1bW5zKCkubGVuZ3RoOworICAgICAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgb2JqID0gZmsuZ2V0Q29uc3RhbnQoY29sc1tpXSk7CisgICAgICAgICAgICAgICAgdHlwZSA9IGNvbHNbaV0uZ2V0SmF2YVR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0ICYmIGNhblNldChpbywgaSArIGxlbiwgb2JqID09IG51bGwpKQorICAgICAgICAgICAgICAgICAgICBzZXRPYmplY3QoY29sc1tpXSwgb2JqLCB0eXBlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNldCkKKyAgICAgICAgICAgICAgICAgICAgd2hlcmVPYmplY3QoY29sc1tpXSwgb2JqLCB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBnaXZlbiBpbnN0YW5jZSB2YWx1ZSB0byB0aGUgZ2l2ZW4gY29sdW1ucy4gTm90ZSB0aGF0CisgICAgICogZm9yZWlnbiBrZXlzIG1heSBpbmNsdWRlIGNvbHVtbnMgYWxzbyBtYXBwZWQgYnkgc2ltcGxlIHZhbHVlcy4gV2UKKyAgICAgKiB1c2UgYSBwcmlvcml0eSBtZWNoYW5pc20gdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGxldCB0aGUgbnVsbGluZworICAgICAqIG9mIGEgZm9yZWlnbiBrZXkgbnVsbCBjb2x1bW5zIGFsc28gb3duZWQgYnkgc2ltcGxlIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0byB0aGUgaW5zdGFuY2UgYmVpbmcgam9pbmVkIHRvCisgICAgICogQHBhcmFtIHRvQ29scyB0aGUgY29sdW1ucyBiZWluZyBqb2luZWQgdG8KKyAgICAgKiBAcGFyYW0gZnJvbUNvbHMgdGhlIGNvbHVtbnMgYmVpbmcgam9pbmVkIGZyb20KKyAgICAgKiBAcGFyYW0gaW8gaW5mb3JtYXRpb24gYWJvdXQgSS9PIGNhcGFiaWxpdGllcyBpbiB0aGlzIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gc2V0IHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgZmx1c2hlZCBhcyBhbiB1cGRhdGUgb3IKKyAgICAgKiBhcyBhIHdoZXJlIGNvbmRpdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaEpvaW5WYWx1ZXMoT3BlbkpQQVN0YXRlTWFuYWdlciB0bywgQ29sdW1uW10gdG9Db2xzLAorICAgICAgICBDb2x1bW5bXSBmcm9tQ29scywgQ29sdW1uSU8gaW8sIGJvb2xlYW4gc2V0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRvID09IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJvbUNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0ICYmIGNhblNldChpbywgaSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIHNldE51bGwoZnJvbUNvbHNbaV0pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzZXQpCisgICAgICAgICAgICAgICAgICAgIHdoZXJlTnVsbChmcm9tQ29sc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldCAmJiAhY2FuU2V0QW55KGlvLCBmcm9tQ29scy5sZW5ndGgsIGZhbHNlKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDbGFzc01hcHBpbmcgdG9NYXBwaW5nID0gKENsYXNzTWFwcGluZykgdG8uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgSm9pbmFibGUgam9pbjsKKyAgICAgICAgT2JqZWN0IHZhbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b0NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGV2ZW4gdHJhbnNsYXRlIGpvaW4gdmFsdWUgaWYgdW5zZXR0YWJsZQorICAgICAgICAgICAgaWYgKHNldCkgeworICAgICAgICAgICAgICAgIGlmIChfYWN0aW9uID09IEFDVElPTl9JTlNFUlQgJiYgZnJvbUNvbHNbaV0uaXNBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCFjYW5TZXQoaW8sIGksIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGpvaW4gPSB0b01hcHBpbmcuYXNzZXJ0Sm9pbmFibGUodG9Db2xzW2ldKTsKKyAgICAgICAgICAgIHZhbCA9IGpvaW4uZ2V0Sm9pblZhbHVlKHRvLCB0b0NvbHNbaV0sIChKREJDU3RvcmUpIHRvLgorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdG9yZU1hbmFnZXIoKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpKTsKKyAgICAgICAgICAgIGlmIChzZXQgJiYgdmFsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuU2V0KGlvLCBpLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0TnVsbChmcm9tQ29sc1tpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNldCAmJiB2YWwgaW5zdGFuY2VvZiBSYXcpCisgICAgICAgICAgICAgICAgc2V0UmF3KGZyb21Db2xzW2ldLCB2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzZXQpCisgICAgICAgICAgICAgICAgc2V0T2JqZWN0KGZyb21Db2xzW2ldLCB2YWwsIHRvQ29sc1tpXS5nZXRKYXZhVHlwZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBlbHNlIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3aGVyZU51bGwoZnJvbUNvbHNbaV0pOworICAgICAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgUmF3KQorICAgICAgICAgICAgICAgIHdoZXJlUmF3KGZyb21Db2xzW2ldLCB2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd2hlcmVPYmplY3QoZnJvbUNvbHNbaV0sIHZhbCwgdG9Db2xzW2ldLmdldEphdmFUeXBlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBnaXZlbiBjb2x1bW4gaW5kZXhlcyBhcmUgc2V0dGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuU2V0QW55KENvbHVtbklPIGlvLCBpbnQgaSwgYm9vbGVhbiBudWxsVmFsdWUpIHsKKyAgICAgICAgaWYgKGlvID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKF9hY3Rpb24gPT0gQUNUSU9OX0lOU0VSVCkKKyAgICAgICAgICAgIHJldHVybiBpby5pc0FueUluc2VydGFibGUoaSwgbnVsbFZhbHVlKTsKKyAgICAgICAgaWYgKF9hY3Rpb24gPT0gQUNUSU9OX1VQREFURSkKKyAgICAgICAgICAgIHJldHVybiBpby5pc0FueVVwZGF0YWJsZShpLCBudWxsVmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4IGlzIHNldHRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhblNldChDb2x1bW5JTyBpbywgaW50IGksIGJvb2xlYW4gbnVsbFZhbHVlKSB7CisgICAgICAgIGlmIChpbyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChfYWN0aW9uID09IEFDVElPTl9JTlNFUlQpCisgICAgICAgICAgICByZXR1cm4gaW8uaXNJbnNlcnRhYmxlKGksIG51bGxWYWx1ZSk7CisgICAgICAgIGlmIChfYWN0aW9uID09IEFDVElPTl9VUERBVEUpCisgICAgICAgICAgICByZXR1cm4gaW8uaXNVcGRhdGFibGUoaSwgbnVsbFZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25JZChDb2x1bW4gY29sLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBSZWxhdGlvbklkIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHJlbC50b1JlbGF0aW9uRGF0YVN0b3JlVmFsdWUoc20sIGNvbCksCisgICAgICAgICAgICBjb2wuZ2V0SmF2YVR5cGUoKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGEgY2lyY3VsYXIgcmVsYXRpb24gaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJSZWxhdGlvbklkKENvbHVtbiBjb2wpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3FsID0gbnVsbDsKKyAgICAgICAgX3ZhbHNbZ2V0U2V0SW5kZXgoY29sKV0gPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5KENvbHVtbiBjb2wsIEFycmF5IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHZhbCwgSmF2YVNRTFR5cGVzLkFSUkFZLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oQ29sdW1uIGNvbCwgSW5wdXRTdHJlYW0gdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgKHZhbCA9PSBudWxsKSA/IG51bGwgOiBuZXcgU2l6ZWQodmFsLCBsZW5ndGgpLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkFTQ0lJX1NUUkVBTSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWwoQ29sdW1uIGNvbCwgQmlnRGVjaW1hbCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCB2YWwsIEphdmFUeXBlcy5CSUdERUNJTUFMLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmlnSW50ZWdlcihDb2x1bW4gY29sLCBCaWdJbnRlZ2VyIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHZhbCwgSmF2YVR5cGVzLkJJR0lOVEVHRVIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCaW5hcnlTdHJlYW0oQ29sdW1uIGNvbCwgSW5wdXRTdHJlYW0gdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgKHZhbCA9PSBudWxsKSA/IG51bGwgOiBuZXcgU2l6ZWQodmFsLCBsZW5ndGgpLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkJJTkFSWV9TVFJFQU0sIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCbG9iKENvbHVtbiBjb2wsIEJsb2IgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgdmFsLCBKYXZhU1FMVHlwZXMuQkxPQiwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oQ29sdW1uIGNvbCwgYm9vbGVhbiB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCAoKHZhbCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKSwKKyAgICAgICAgICAgIEphdmFUeXBlcy5CT09MRUFOLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZShDb2x1bW4gY29sLCBieXRlIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIG5ldyBCeXRlKHZhbCksIEphdmFUeXBlcy5CWVRFLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoQ29sdW1uIGNvbCwgYnl0ZVtdIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHZhbCwgSmF2YVNRTFR5cGVzLkJZVEVTLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FsZW5kYXIoQ29sdW1uIGNvbCwgQ2FsZW5kYXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgdmFsLCBKYXZhVHlwZXMuQ0FMRU5EQVIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyKENvbHVtbiBjb2wsIGNoYXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgbmV3IENoYXJhY3Rlcih2YWwpLCBKYXZhVHlwZXMuQ0hBUiwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlclN0cmVhbShDb2x1bW4gY29sLCBSZWFkZXIgdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgKHZhbCA9PSBudWxsKSA/IG51bGwgOiBuZXcgU2l6ZWQodmFsLCBsZW5ndGgpLAorICAgICAgICAgICAgSmF2YVNRTFR5cGVzLkNIQVJfU1RSRUFNLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xvYihDb2x1bW4gY29sLCBDbG9iIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHZhbCwgSmF2YVNRTFR5cGVzLkNMT0IsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlKENvbHVtbiBjb2wsIERhdGUgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgdmFsLCBKYXZhVHlwZXMuREFURSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoQ29sdW1uIGNvbCwgamF2YS5zcWwuRGF0ZSB2YWwsIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBjYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIG9iaiA9IHZhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2JqID0gbmV3IENhbGVuZGFyZCh2YWwsIGNhbCk7CisgICAgICAgIHNldE9iamVjdChjb2wsIG9iaiwgSmF2YVNRTFR5cGVzLlNRTF9EQVRFLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKENvbHVtbiBjb2wsIGRvdWJsZSB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCBuZXcgRG91YmxlKHZhbCksIEphdmFUeXBlcy5ET1VCTEUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdChDb2x1bW4gY29sLCBmbG9hdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCBuZXcgRmxvYXQodmFsKSwgSmF2YVR5cGVzLkZMT0FULCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50KENvbHVtbiBjb2wsIGludCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCBOdW1iZXJzLnZhbHVlT2YodmFsKSwgSmF2YVR5cGVzLklOVCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvbmcoQ29sdW1uIGNvbCwgbG9uZyB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCBOdW1iZXJzLnZhbHVlT2YodmFsKSwgSmF2YVR5cGVzLkxPTkcsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoQ29sdW1uIGNvbCwgTG9jYWxlIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHZhbCwgSmF2YVR5cGVzLkxPQ0FMRSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bGwoQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE51bGwoY29sLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbChDb2x1bW4gY29sLCBib29sZWFuIG92ZXJyaWRlRGVmYXVsdCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIG51bGwsIGNvbC5nZXRKYXZhVHlwZSgpLCBvdmVycmlkZURlZmF1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihDb2x1bW4gY29sLCBOdW1iZXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgdmFsLCBKYXZhVHlwZXMuTlVNQkVSLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmF3KENvbHVtbiBjb2wsIFN0cmluZyB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzZXRPYmplY3QoY29sLCB2YWwsIFJBVywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0KENvbHVtbiBjb2wsIHNob3J0IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIG5ldyBTaG9ydCh2YWwpLCBKYXZhVHlwZXMuU0hPUlQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoQ29sdW1uIGNvbCwgU3RyaW5nIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9iamVjdChjb2wsIHZhbCwgSmF2YVR5cGVzLlNUUklORywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoQ29sdW1uIGNvbCwgVGltZSB2YWwsIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBjYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIG9iaiA9IHZhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2JqID0gbmV3IENhbGVuZGFyZCh2YWwsIGNhbCk7CisgICAgICAgIHNldE9iamVjdChjb2wsIG9iaiwgSmF2YVNRTFR5cGVzLlRJTUUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoQ29sdW1uIGNvbCwgVGltZXN0YW1wIHZhbCwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IGNhbCA9PSBudWxsKQorICAgICAgICAgICAgb2JqID0gdmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvYmogPSBuZXcgQ2FsZW5kYXJkKHZhbCwgY2FsKTsKKyAgICAgICAgc2V0T2JqZWN0KGNvbCwgb2JqLCBKYXZhU1FMVHlwZXMuVElNRVNUQU1QLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KENvbHVtbiBjb2wsIE9iamVjdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUmF3KQorICAgICAgICAgICAgc2V0T2JqZWN0KGNvbCwgdmFsLCBSQVcsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0T2JqZWN0KGNvbCwgdmFsLCBjb2wuZ2V0SmF2YVR5cGUoKSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQXJyYXkoQ29sdW1uIGNvbCwgQXJyYXkgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCB2YWwsIEphdmFTUUxUeXBlcy5TUUxfQVJSQVkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQXNjaWlTdHJlYW0oQ29sdW1uIGNvbCwgSW5wdXRTdHJlYW0gdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCAodmFsID09IG51bGwpID8gbnVsbCA6IG5ldyBTaXplZCh2YWwsIGxlbmd0aCksCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuQVNDSUlfU1RSRUFNKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZUJpZ0RlY2ltYWwoQ29sdW1uIGNvbCwgQmlnRGVjaW1hbCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsIHZhbCwgSmF2YVR5cGVzLkJJR0RFQ0lNQUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQmlnSW50ZWdlcihDb2x1bW4gY29sLCBCaWdJbnRlZ2VyIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgdmFsLCBKYXZhVHlwZXMuQklHSU5URUdFUik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVCaW5hcnlTdHJlYW0oQ29sdW1uIGNvbCwgSW5wdXRTdHJlYW0gdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCAodmFsID09IG51bGwpID8gbnVsbCA6IG5ldyBTaXplZCh2YWwsIGxlbmd0aCksCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuQklOQVJZX1NUUkVBTSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVCbG9iKENvbHVtbiBjb2wsIEJsb2IgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCB2YWwsIEphdmFTUUxUeXBlcy5CTE9CKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZUJvb2xlYW4oQ29sdW1uIGNvbCwgYm9vbGVhbiB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsICgodmFsKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpLAorICAgICAgICAgICAgSmF2YVR5cGVzLkJPT0xFQU4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQnl0ZShDb2x1bW4gY29sLCBieXRlIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgbmV3IEJ5dGUodmFsKSwgSmF2YVR5cGVzLkJZVEUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQnl0ZXMoQ29sdW1uIGNvbCwgYnl0ZVtdIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgdmFsLCBKYXZhU1FMVHlwZXMuQllURVMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQ2FsZW5kYXIoQ29sdW1uIGNvbCwgQ2FsZW5kYXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCB2YWwsIEphdmFUeXBlcy5DQUxFTkRBUik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVDaGFyKENvbHVtbiBjb2wsIGNoYXIgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCBuZXcgQ2hhcmFjdGVyKHZhbCksIEphdmFUeXBlcy5DSEFSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZUNoYXJhY3RlclN0cmVhbShDb2x1bW4gY29sLCBSZWFkZXIgdmFsLCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCAodmFsID09IG51bGwpID8gbnVsbCA6IG5ldyBTaXplZCh2YWwsIGxlbmd0aCksCisgICAgICAgICAgICBKYXZhU1FMVHlwZXMuQ0hBUl9TVFJFQU0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlQ2xvYihDb2x1bW4gY29sLCBDbG9iIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgdmFsLCBKYXZhU1FMVHlwZXMuQ0xPQik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVEYXRlKENvbHVtbiBjb2wsIERhdGUgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCB2YWwsIEphdmFUeXBlcy5EQVRFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZURhdGUoQ29sdW1uIGNvbCwgamF2YS5zcWwuRGF0ZSB2YWwsIENhbGVuZGFyIGNhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBjYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIG9iaiA9IHZhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2JqID0gbmV3IENhbGVuZGFyZCh2YWwsIGNhbCk7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgb2JqLCBKYXZhU1FMVHlwZXMuU1FMX0RBVEUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlRG91YmxlKENvbHVtbiBjb2wsIGRvdWJsZSB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsIG5ldyBEb3VibGUodmFsKSwgSmF2YVR5cGVzLkRPVUJMRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVGbG9hdChDb2x1bW4gY29sLCBmbG9hdCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsIG5ldyBGbG9hdCh2YWwpLCBKYXZhVHlwZXMuRkxPQVQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlSW50KENvbHVtbiBjb2wsIGludCB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsIE51bWJlcnMudmFsdWVPZih2YWwpLCBKYXZhVHlwZXMuSU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZUxvbmcoQ29sdW1uIGNvbCwgbG9uZyB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsIE51bWJlcnMudmFsdWVPZih2YWwpLCBKYXZhVHlwZXMuTE9ORyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVMb2NhbGUoQ29sdW1uIGNvbCwgTG9jYWxlIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgdmFsLCBKYXZhVHlwZXMuTE9DQUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZU51bGwoQ29sdW1uIGNvbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgbnVsbCwgY29sLmdldEphdmFUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlTnVtYmVyKENvbHVtbiBjb2wsIE51bWJlciB2YWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3aGVyZU9iamVjdChjb2wsIHZhbCwgSmF2YVR5cGVzLk5VTUJFUik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVSYXcoQ29sdW1uIGNvbCwgU3RyaW5nIHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdoZXJlT2JqZWN0KGNvbCwgdmFsLCBSQVcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlU2hvcnQoQ29sdW1uIGNvbCwgc2hvcnQgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCBuZXcgU2hvcnQodmFsKSwgSmF2YVR5cGVzLlNIT1JUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZVN0cmluZyhDb2x1bW4gY29sLCBTdHJpbmcgdmFsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCB2YWwsIEphdmFUeXBlcy5TVFJJTkcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlVGltZShDb2x1bW4gY29sLCBUaW1lIHZhbCwgQ2FsZW5kYXIgY2FsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IGNhbCA9PSBudWxsKQorICAgICAgICAgICAgb2JqID0gdmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvYmogPSBuZXcgQ2FsZW5kYXJkKHZhbCwgY2FsKTsKKyAgICAgICAgd2hlcmVPYmplY3QoY29sLCBvYmosIEphdmFTUUxUeXBlcy5USU1FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3aGVyZVRpbWVzdGFtcChDb2x1bW4gY29sLCBUaW1lc3RhbXAgdmFsLCBDYWxlbmRhciBjYWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICBpZiAodmFsID09IG51bGwgfHwgY2FsID09IG51bGwpCisgICAgICAgICAgICBvYmogPSB2YWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9iaiA9IG5ldyBDYWxlbmRhcmQodmFsLCBjYWwpOworICAgICAgICB3aGVyZU9iamVjdChjb2wsIG9iaiwgSmF2YVNRTFR5cGVzLlRJTUVTVEFNUCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVPYmplY3QoQ29sdW1uIGNvbCwgT2JqZWN0IHZhbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBSYXcpCisgICAgICAgICAgICB3aGVyZU9iamVjdChjb2wsIHZhbCwgUkFXKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd2hlcmVPYmplY3QoY29sLCB2YWwsIGNvbC5nZXRKYXZhVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGwgc2V0IGNvbHVtbiBtZXRob2RzIGRlbGVnYXRlIHRvIHRoaXMgb25lLiBTZXQgdGhlIGdpdmVuIG9iamVjdAorICAgICAqIHVubGVzcyB0aGlzIGlzIGFuIGluc2VydCBhbmQgdGhlIGdpdmVuIGNvbHVtbiBpcyBhdXRvLWFzc2lnbmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldE9iamVjdChDb2x1bW4gY29sLCBPYmplY3QgdmFsLCBpbnQgbWV0YVR5cGUsCisgICAgICAgIGJvb2xlYW4gb3ZlcnJpZGVEZWZhdWx0KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbmV2ZXIgc2V0IGF1dG8gaW5jcmVtZW50IGNvbHVtbnMgYW5kIGhvbm9yIGNvbHVtbiBkZWZhdWx0cworICAgICAgICBpZiAoX2FjdGlvbiA9PSBBQ1RJT05fSU5TRVJUKSB7CisgICAgICAgICAgICBpZiAoY29sLmlzQXV0b0Fzc2lnbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKCFvdmVycmlkZURlZmF1bHQgJiYgdmFsID09IG51bGwgCisgICAgICAgICAgICAgICAgJiYgY29sLmdldERlZmF1bHRTdHJpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsID09IG51bGwgJiYgY29sLmlzTm90TnVsbCgpKQorICAgICAgICAgICAgdmFsID0gSmF2YVNRTFR5cGVzLmdldEVtcHR5VmFsdWUoY29sLmdldEphdmFUeXBlKCkpOworICAgICAgICBmbHVzaChjb2wsIHZhbCwgbWV0YVR5cGUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbCB3aGVyZSBjb2x1bW4gbWV0aG9kcyBkZWxlZ2F0ZSB0byB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3aGVyZU9iamVjdChDb2x1bW4gY29sLCBPYmplY3QgdmFsLCBpbnQgbWV0YVR5cGUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBmbHVzaChjb2wsIHZhbCwgbWV0YVR5cGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBzZXQgb3Igd2hlcmUgY29uZGl0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaChDb2x1bW4gY29sLCBPYmplY3QgdmFsLCBpbnQgbWV0YVR5cGUsIGJvb2xlYW4gc2V0KSB7CisgICAgICAgIGludCBpZHggPSAoc2V0KSA/IGdldFNldEluZGV4KGNvbCkgOiBnZXRXaGVyZUluZGV4KGNvbCk7CisgICAgICAgIF90eXBlc1tpZHhdID0gbWV0YVR5cGU7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIF92YWxzW2lkeF0gPSBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfdmFsc1tpZHhdID0gdmFsOworICAgICAgICBpZiAoc2V0IHx8IF9hY3Rpb24gPT0gQUNUSU9OX0RFTEVURSkKKyAgICAgICAgICAgIHNldFZhbGlkKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIGZvciB0aGUgb3BlcmF0aW9uIG9uIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U1FMKERCRGljdGlvbmFyeSBkaWN0KSB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICBpZiAoX3NxbCA9PSBudWxsKQorICAgICAgICAgICAgX3NxbCA9IGdlbmVyYXRlU1FMKGRpY3QpOworICAgICAgICByZXR1cm4gX3NxbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgU1FMIGZvciB0aGlzIHJvdzsgdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZVNRTChEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICBzd2l0Y2ggKGdldEFjdGlvbigpKSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9VUERBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVwZGF0ZVNRTChkaWN0KTsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0lOU0VSVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5zZXJ0U1FMKGRpY3QpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVsZXRlU1FMKGRpY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTUUwgZm9yIGEgcHJlcGFyZWQgc3RhdGVtZW50IHVwZGF0ZSBvbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRVcGRhdGVTUUwoREJEaWN0aW9uYXJ5IGRpY3QpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiVVBEQVRFICIpLmFwcGVuZChkaWN0LmdldEZ1bGxOYW1lKGdldFRhYmxlKCksIGZhbHNlKSkuCisgICAgICAgICAgICBhcHBlbmQoIiBTRVQgIik7CisKKyAgICAgICAgYm9vbGVhbiBoYXNWYWwgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKF92YWxzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChoYXNWYWwpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2NvbHNbaV0pOworICAgICAgICAgICAgaWYgKF90eXBlc1tpXSA9PSBSQVcpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiID0gIikuYXBwZW5kKF92YWxzW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgPSA/Iik7CisgICAgICAgICAgICBoYXNWYWwgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXBwZW5kV2hlcmUoYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIGZvciBhIHByZXBhcmVkIHN0YXRlbWVudCBpbnNlcnQgb24gdGhpcyByb3cuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5zZXJ0U1FMKERCRGljdGlvbmFyeSBkaWN0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciB2YWxzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJJTlNFUlQgSU5UTyAiKS4KKyAgICAgICAgICAgIGFwcGVuZChkaWN0LmdldEZ1bGxOYW1lKGdldFRhYmxlKCksIGZhbHNlKSkuYXBwZW5kKCIgKCIpOworCisgICAgICAgIGJvb2xlYW4gaGFzVmFsID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfdmFsc1tpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoaGFzVmFsKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2NvbHNbaV0pOworICAgICAgICAgICAgaWYgKF90eXBlc1tpXSA9PSBSQVcpCisgICAgICAgICAgICAgICAgdmFscy5hcHBlbmQoX3ZhbHNbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHMuYXBwZW5kKCI/Iik7CisgICAgICAgICAgICBoYXNWYWwgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZCgiKSBWQUxVRVMgKCIpLmFwcGVuZCh2YWxzLnRvU3RyaW5nKCkpLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTUUwgZm9yIGEgcHJlcGFyZWQgc3RhdGVtZW50IGRlbGV0ZSBvbiB0aGlzIHJvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXREZWxldGVTUUwoREJEaWN0aW9uYXJ5IGRpY3QpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiREVMRVRFIEZST00gIikuCisgICAgICAgICAgICBhcHBlbmQoZGljdC5nZXRGdWxsTmFtZShnZXRUYWJsZSgpLCBmYWxzZSkpOworICAgICAgICBhcHBlbmRXaGVyZShidWYpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgd2hlcmUgY2xhdXNlIG9udG8gdGhlIGdpdmVuIHNxbCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFdoZXJlKFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNXaGVyZSA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX3ZhbHNbZ2V0V2hlcmVJbmRleChfY29sc1tpXSldID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICghaGFzV2hlcmUpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIFdIRVJFICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBBTkQgIik7CisKKyAgICAgICAgICAgIC8vIHNxbHNlcnZlciBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHVzaW5nIG51bGwgcGFyYW1ldGVycyBpbiB0aGUKKyAgICAgICAgICAgIC8vIHdoZXJlIGNsYXVzZQorICAgICAgICAgICAgaWYgKF92YWxzW2dldFdoZXJlSW5kZXgoX2NvbHNbaV0pXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2NvbHNbaV0pLmFwcGVuZCgiIElTIE5VTEwiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF90eXBlc1tpXSA9PSBSQVcpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChfY29sc1tpXSkuYXBwZW5kKCIgPSAiKS5hcHBlbmQoX3ZhbHNbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2NvbHNbaV0pLmFwcGVuZCgiID0gPyIpOworICAgICAgICAgICAgaGFzV2hlcmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBzZXQgZm9yIHRoaXMgcm93LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKSB7CisgICAgICAgIHJldHVybiBfdmFscy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHJvdydzIHZhbHVlcyB0byB0aGUgZ2l2ZW4gcHJlcGFyZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKFByZXBhcmVkU3RhdGVtZW50IHN0bW50LCBEQkRpY3Rpb25hcnkgZGljdCwKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgZmx1c2goc3RtbnQsIDEsIGRpY3QsIHN0b3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgcm93J3MgdmFsdWVzIHRvIHRoZSBnaXZlbiBwcmVwYXJlZCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmx1c2goUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIERCRGljdGlvbmFyeSBkaWN0LAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworCisgICAgICAgIC8vIHRoaXMgc2ltcGxlIG1ldGhvZCB3b3JrcyBiZWNhdXNlIHRoZSBTUUwgaXMgYWx3YXlzIHByZXBhcmVkCisgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBpbmRleGluZyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgdGFibGUgb2JqZWN0IC0tIHRoZQorICAgICAgICAvLyBzYW1lIG9yZGVyaW5nIHdlIHVzZSB3aGVuIHN0b3JpbmcgdmFsdWVzIGFuZCBtZXRhIHR5cGVzLiBza2lwCisgICAgICAgIC8vIHVwZGF0ZXMgd2hlbiBzZXR0aW5nIHBhcmFtcyBmb3IgREVMRVRFczsgdGhlIHVwZGF0ZXMgYXJlIGp1c3QgdGhlcmUKKyAgICAgICAgLy8gdG8gbGV0IHVzIGV2YWwgZmsgY29uc3RyYWludHMKKyAgICAgICAgaW50IGkgPSAoZ2V0QWN0aW9uKCkgPT0gQUNUSU9OX0RFTEVURSkgPyBfY29scy5sZW5ndGg6IDA7CisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIGludCBoYWxmID0gX3ZhbHMubGVuZ3RoIC8gMjsKKyAgICAgICAgZm9yICg7IGkgPCBfdmFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKF92YWxzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IHNldCBudWxsIHBhcmFtcyBpbiB0aGUgV0hFUkUgY2xhdXNlOyB3ZSB1c2UgdGhlIE5VTEwKKyAgICAgICAgICAgIC8vIGtleXdvcmQgaW5zdGVhZCB0byBzYXRpc2Z5IHNxbHNlcnZlcgorICAgICAgICAgICAgaWYgKF92YWxzW2ldID09IE5VTEwgJiYgZ2V0QWN0aW9uKCkgIT0gQUNUSU9OX0lOU0VSVCAmJiBpID49IGhhbGYpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gdXBkYXRlIHRoZSB2YWxzIGFycmF5IHdpbGwgYmUgMiB4IHRoZSBjb2xzCisgICAgICAgICAgICAvLyBhcnJheSBsZW5ndGg7IGl0IHJlcGVhdHMgZm9yIHdoZXJlIHZhbHVlcworICAgICAgICAgICAgaWYgKGkgPCBfY29scy5sZW5ndGgpCisgICAgICAgICAgICAgICAgY29sID0gX2NvbHNbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29sID0gX2NvbHNbaSAtIF9jb2xzLmxlbmd0aF07CisKKyAgICAgICAgICAgIHZhbCA9IF92YWxzW2ldOworICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHZhbCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBfdHlwZXNbaV0gIT0gUkFXKSB7CisgICAgICAgICAgICAgICAgZGljdC5zZXRUeXBlZChzdG1udCwgaWR4LCB2YWwsIGNvbCwgX3R5cGVzW2ldLCBzdG9yZSk7CisgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgdmFsdWUgYXJyYXkgaW5kZXggZm9yIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRTZXRJbmRleChDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBjb2wuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgdmFsdWUgYXJyYXkgaW5kZXggZm9yIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRXaGVyZUluZGV4KENvbHVtbiBjb2wpIHsKKyAgICAgICAgcmV0dXJuIGNvbC5nZXRJbmRleCgpICsgX2NvbHMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgcHJvcGVyIGRlZXAgY2xvbmUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgUm93SW1wbCBjbG9uZSA9IG5ld0luc3RhbmNlKGdldENvbHVtbnMoKSwgZ2V0QWN0aW9uKCkpOworICAgICAgICBjb3B5SW50byhjbG9uZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gY2xvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHJvdy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUm93SW1wbCBuZXdJbnN0YW5jZShDb2x1bW5bXSBjb2xzLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgUm93SW1wbChjb2xzLCBhY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgYWxsIHZhbHVlcyBmcm9tIHRoaXMgcm93IGludG8gdGhlIGdpdmVuIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGVyZU9ubHkgaWYgdHJ1ZSwgb25seSBjb3B5IHdoZXJlIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5SW50byhSb3dJbXBsIHJvdywgYm9vbGVhbiB3aGVyZU9ubHkpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IGdldEFjdGlvbigpOworICAgICAgICBpbnQgcm93QWN0aW9uID0gcm93LmdldEFjdGlvbigpOworCisgICAgICAgIGludCBzdGFydDsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgaWYgKHdoZXJlT25seSkgeworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fSU5TRVJUIHx8IHJvd0FjdGlvbiA9PSBBQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGVuID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGFydCA9IGxlbiA9IF92YWxzLmxlbmd0aCAvIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBpZiAocm93QWN0aW9uID09IEFDVElPTl9JTlNFUlQgJiYgYWN0aW9uICE9IEFDVElPTl9JTlNFUlQpCisgICAgICAgICAgICAgICAgbGVuID0gX3ZhbHMubGVuZ3RoIC8gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBfdmFscy5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF92YWxzLCBzdGFydCwgcm93Ll92YWxzLCBzdGFydCwgbGVuKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfdHlwZXMsIHN0YXJ0LCByb3cuX3R5cGVzLCBzdGFydCwgbGVuKTsKKyAgICAgICAgaWYgKGlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJvdy5zZXRWYWxpZCh0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3dNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3dNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NDE3YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1Jvd01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CisKKy8qKgorICogTWFuYWdlcyByb3dzIGR1cmluZyBhbiBpbnNlcnQvdXBkYXRlL2RlbGV0ZSBwcm9jZXNzLiBSb3cgbWFuYWdlcnMKKyAqIGRvIG5vdCBoYXZlIHRvIGJlIHRocmVhZHNhZmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBSb3dNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm93IGZvciB0aGUgZ2l2ZW4gdGFibGUgYW5kIG93bmVyIG9iamVjdCwgb3IgbnVsbCBpZgorICAgICAqIDxjb2RlPmNyZWF0ZTwvY29kZT4gaXMgZmFsc2UgYW5kIHRoZSByb3cgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KKyAgICAgKiBUaGUgYWN0aW9uIG11c3QgYmUgb25lIG9mIHtAbGluayBSb3cjQUNUSU9OX0lOU0VSVH0sCisgICAgICoge0BsaW5rIFJvdyNBQ1RJT05fVVBEQVRFfSwge0BsaW5rIFJvdyNBQ1RJT05fREVMRVRFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUm93IGdldFJvdyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbiwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgYm9vbGVhbiBjcmVhdGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcm93IGZvciB0aGUgZ2l2ZW4gc2Vjb25kYXJ5IHRhYmxlLgorICAgICAqIFRoZSBhY3Rpb24gbXVzdCBiZSBvbmUgb2Yge0BsaW5rIFJvdyNBQ1RJT05fSU5TRVJUfSwKKyAgICAgKiB7QGxpbmsgUm93I0FDVElPTl9VUERBVEV9LCB7QGxpbmsgUm93I0FDVElPTl9ERUxFVEV9LgorICAgICAqIE5vdGUgdGhhdCBzZWNvbmRhcnkgcm93cyBhcmUgbm90IGNvbnNpZGVyZWQgd2hlbiBjcmVhdGluZyB0aGUgZm9yZWlnbgorICAgICAqIGtleSBkZXBlbmRlbmN5IGdyYXBoLCB3aXRoIGNhbiBjYXVzZSBjb25zdHJhaW50IHZpb2xhdGlvbnMgd2hlbiB1c2luZworICAgICAqIHRoZSA8Y29kZT5VUERBVEU8L2NvZGU+IGFjdGlvbi4gT25seSB1c2UgdGhpcyBhY3Rpb24gaWYgdGhlIHNlY29uZGFyeQorICAgICAqIHJvdyBkb2VzIG5vdCBoYXZlIHJlc3RyaWN0LWFjdGlvbiBmb3JlaWduIGtleXMuIE90aGVyd2lzZSB1c2UgYm90aAorICAgICAqIGEgZGVsZXRlIGFuZCB0aGVuIGFuIGluc2VydCB0byBwZXJmb3JtIHRoZSB1cGRhdGUuCisgICAgICovCisgICAgcHVibGljIFJvdyBnZXRTZWNvbmRhcnlSb3coVGFibGUgdGFibGUsIGludCBhY3Rpb24pOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHNlY29uZGFyeSByb3c7IGFmdGVyIGZsdXNoaW5nIHRoZSByb3cgaXMgYXZhaWxhYmxlIGZvciByZXVzZS4KKyAgICAgKiBJdCB3aWxsIHJldGFpbiBhbGwgcHJldmlvdXNseSBzZXQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoU2Vjb25kYXJ5Um93KFJvdyByb3cpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsb2dpY2FsIHJvdyByZXByZXNlbnRpbmcgYW4gdXBkYXRlIHRoYXQgc2hvdWxkIGJlIG1hZGUgdG8KKyAgICAgKiBhbGwgcm93cyBvZiB0aGUgZ2l2ZW4gdGFibGUuIFRoZSBhY3Rpb24gbXVzdCBiZSBvbmUgb2YKKyAgICAgKiB7QGxpbmsgUm93I0FDVElPTl9VUERBVEV9LCB7QGxpbmsgUm93I0FDVElPTl9ERUxFVEV9LgorICAgICAqLworICAgIHB1YmxpYyBSb3cgZ2V0QWxsUm93cyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgbG9naWNhbCByb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmx1c2hBbGxSb3dzKFJvdyByb3cpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Sb3dNYW5hZ2VySW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUm93TWFuYWdlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDVjZTRhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvUm93TWFuYWdlckltcGwuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CisKKy8qKgorICogTWFuYWdlcyBTUUwgcm93cyBkdXJpbmcgYW4gaW5zZXJ0L3VwZGF0ZS9kZWxldGUgcHJvY2Vzcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUm93TWFuYWdlckltcGwKKyAgICBpbXBsZW1lbnRzIFJvd01hbmFnZXIgeworCisgICAgcHJpdmF0ZSBNYXAgX2luc2VydHMgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF91cGRhdGVzID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcCBfZGVsZXRlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9zZWNvbmRhcnlVcGRhdGVzID0gbnVsbDsKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gX3NlY29uZGFyeURlbGV0ZXMgPSBudWxsOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfYWxsUm93VXBkYXRlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9hbGxSb3dEZWxldGVzID0gbnVsbDsKKworICAgIC8vIHdlIG1haW50YWluIGEgbGlzdCBvZiB0aGUgb3JkZXIgb2YgYWxsIHByaW1hcnkgcm93cyBpZiB0aGUgdXNlcgorICAgIC8vIHdhbnRzIHRvIGJlIGFibGUgdG8gZmV0Y2ggdGhlbSBpbiBvcmRlcgorICAgIHByaXZhdGUgZmluYWwgTGlzdCBfcHJpbWFyeU9yZGVyOworCisgICAgLy8gdHJhY2sgd2hldGhlciB3ZSdyZSBkZWFsaW5nIHdpdGggYW55IGF1dG8taW5jIGNvbHVtbnMKKyAgICBwcml2YXRlIGJvb2xlYW4gX2F1dG8gPSBmYWxzZTsKKworICAgIC8vIGNhY2hlIHRoZSBsYXN0IGtleSBhbmQgcHJpbWFyeSByb3c7IHdoZW4gbG9vcGluZyBvdmVyCisgICAgLy8gYWxsIHRoZSBmaWVsZCBtYXBwaW5ncyBvZiBhIGNsYXNzIGVhY2ggb25lIHdpbGwgcHJvYmFibHkgYXNrIGZvciB0aGUKKyAgICAvLyBzYW1lIGtleSwgc28gYXZvaWQgdGhlIGtleSBjcmVhdGlvbiBhbmQgcm93IGxvb2t1cCB3aGVuIHBvc3NpYmxlCisgICAgcHJpdmF0ZSBLZXkgX2tleSA9IG51bGw7CisgICAgcHJpdmF0ZSBQcmltYXJ5Um93IF9yb3cgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JkZXIgd2hldGhlciB0byBrZWVwIHRyYWNrIG9mIHRoZSBvcmRlciBpbiB3aGljaCByb3dzIGFyZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyBSb3dNYW5hZ2VySW1wbChib29sZWFuIG9yZGVyKSB7CisgICAgICAgIF9wcmltYXJ5T3JkZXIgPSAob3JkZXIpID8gbmV3IEFycmF5TGlzdCgpIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFueSBwcmltYXJ5IHJvd3MgaGF2ZSBhdXRvLWFzc2lnbiBjb25zdHJhaW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdXRvQXNzaWduQ29uc3RyYWludHMoKSB7CisgICAgICAgIHJldHVybiBfYXV0bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9yZGVyZWQgcHJpbWFyeSByb3dzLiBPbmx5IGF2YWlsYWJsZSBpZiBvcmRlcmluZyByZXF1ZXN0ZWQKKyAgICAgKiBvbiBjb25zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0T3JkZXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIChfcHJpbWFyeU9yZGVyID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IF9wcmltYXJ5T3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBpbnNlcnRlZCBwcmltYXJ5IHJvd3MuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0SW5zZXJ0cygpIHsKKyAgICAgICAgcmV0dXJuIChfaW5zZXJ0cyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBfaW5zZXJ0cy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHVwZGF0ZWQgcHJpbWFyeSByb3dzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFVwZGF0ZXMoKSB7CisgICAgICAgIHJldHVybiAoX3VwZGF0ZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX3VwZGF0ZXMudmFsdWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBkZWxldGVkIHByaW1hcnkgcm93cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXREZWxldGVzKCkgeworICAgICAgICByZXR1cm4gKF9kZWxldGVzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IF9kZWxldGVzLnZhbHVlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgaW5zZXJ0ZWQgYW5kIHVwZGF0ZWQgc2Vjb25kYXJ5IHJvd3MuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0U2Vjb25kYXJ5VXBkYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIChfc2Vjb25kYXJ5VXBkYXRlcyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QKKyAgICAgICAgICAgIDogX3NlY29uZGFyeVVwZGF0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBkZWxldGVkIHNlY29uZGFyeSByb3dzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFNlY29uZGFyeURlbGV0ZXMoKSB7CisgICAgICAgIHJldHVybiAoX3NlY29uZGFyeURlbGV0ZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUCisgICAgICAgICAgICA6IF9zZWNvbmRhcnlEZWxldGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbnkgJ2FsbCByb3cnIHVwZGF0ZXMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QWxsUm93VXBkYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIChfYWxsUm93VXBkYXRlcyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QKKyAgICAgICAgICAgIDogX2FsbFJvd1VwZGF0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFueSAnYWxsIHJvdycgZGVsZXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxSb3dEZWxldGVzKCkgeworICAgICAgICByZXR1cm4gKF9hbGxSb3dEZWxldGVzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVAorICAgICAgICAgICAgOiBfYWxsUm93RGVsZXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93IGdldFNlY29uZGFyeVJvdyhUYWJsZSB0YWJsZSwgaW50IGFjdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IFNlY29uZGFyeVJvdyh0YWJsZSwgYWN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaFNlY29uZGFyeVJvdyhSb3cgcm93KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFyb3cuaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNlY29uZGFyeVJvdyBzcm93ID0gKFNlY29uZGFyeVJvdykgcm93OworICAgICAgICBpZiAoc3Jvdy5nZXRBY3Rpb24oKSA9PSBSb3cuQUNUSU9OX0RFTEVURSkgeworICAgICAgICAgICAgaWYgKF9zZWNvbmRhcnlEZWxldGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgX3NlY29uZGFyeURlbGV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBfc2Vjb25kYXJ5RGVsZXRlcy5hZGQoc3Jvdy5jbG9uZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChfc2Vjb25kYXJ5VXBkYXRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zZWNvbmRhcnlVcGRhdGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgX3NlY29uZGFyeVVwZGF0ZXMuYWRkKHNyb3cuY2xvbmUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUm93IGdldEFsbFJvd3MoVGFibGUgdGFibGUsIGludCBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSb3dJbXBsKHRhYmxlLCBhY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoQWxsUm93cyhSb3cgcm93KSB7CisgICAgICAgIGlmICghcm93LmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzd2l0Y2ggKHJvdy5nZXRBY3Rpb24oKSkgeworICAgICAgICAgICAgY2FzZSBSb3cuQUNUSU9OX1VQREFURToKKyAgICAgICAgICAgICAgICBpZiAoX2FsbFJvd1VwZGF0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2FsbFJvd1VwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgX2FsbFJvd1VwZGF0ZXMuYWRkKHJvdyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJvdy5BQ1RJT05fREVMRVRFOgorICAgICAgICAgICAgICAgIGlmIChfYWxsUm93RGVsZXRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfYWxsUm93RGVsZXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBfYWxsUm93RGVsZXRlcy5hZGQocm93KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCJhY3Rpb24gPSAiICsgcm93LmdldEFjdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSb3cgZ2V0Um93KFRhYmxlIHRhYmxlLCBpbnQgYWN0aW9uLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBib29sZWFuIGNyZWF0ZSkgeworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGNoZWNrIGlmIHJlcXVlc3QgbWF0Y2hlcyBjYWNoZWQgdmVyc2lvbgorICAgICAgICBpZiAoX2tleSAhPSBudWxsICYmIF9rZXkudGFibGUgPT0gdGFibGUgJiYgX2tleS5zbSA9PSBzbQorICAgICAgICAgICAgJiYgX3JvdyAhPSBudWxsICYmIF9yb3cuZ2V0QWN0aW9uKCkgPT0gYWN0aW9uKQorICAgICAgICAgICAgcmV0dXJuIF9yb3c7CisKKyAgICAgICAgTWFwIG1hcDsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBSb3cuQUNUSU9OX0RFTEVURSkgeworICAgICAgICAgICAgaWYgKF9kZWxldGVzID09IG51bGwgJiYgY3JlYXRlKQorICAgICAgICAgICAgICAgIF9kZWxldGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIG1hcCA9IF9kZWxldGVzOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBSb3cuQUNUSU9OX0lOU0VSVCkgeworICAgICAgICAgICAgaWYgKF9pbnNlcnRzID09IG51bGwgJiYgY3JlYXRlKQorICAgICAgICAgICAgICAgIF9pbnNlcnRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIG1hcCA9IF9pbnNlcnRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKF91cGRhdGVzID09IG51bGwgJiYgY3JlYXRlKQorICAgICAgICAgICAgICAgIF91cGRhdGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIG1hcCA9IF91cGRhdGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIF9rZXkgPSBuZXcgS2V5KHRhYmxlLCBzbSk7CisgICAgICAgIF9yb3cgPSAoUHJpbWFyeVJvdykgbWFwLmdldChfa2V5KTsKKworICAgICAgICBpZiAoX3JvdyA9PSBudWxsICYmIGNyZWF0ZSkgeworICAgICAgICAgICAgX3JvdyA9IG5ldyBQcmltYXJ5Um93KHRhYmxlLCBhY3Rpb24sIHNtKTsKKyAgICAgICAgICAgIG1hcC5wdXQoX2tleSwgX3Jvdyk7CisgICAgICAgICAgICBpZiAoX3ByaW1hcnlPcmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3Jvdy5zZXRJbmRleChfcHJpbWFyeU9yZGVyLnNpemUoKSk7CisgICAgICAgICAgICAgICAgX3ByaW1hcnlPcmRlci5hZGQoX3Jvdyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghX2F1dG8gJiYgYWN0aW9uID09IFJvdy5BQ1RJT05fSU5TRVJUKQorICAgICAgICAgICAgICAgIF9hdXRvID0gdGFibGUuZ2V0QXV0b0Fzc2lnbmVkQ29sdW1ucygpLmxlbmd0aCA+IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3JvdyAhPSBudWxsKQorICAgICAgICAgICAgX3Jvdy5zZXRGYWlsZWRPYmplY3Qoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworICAgICAgICByZXR1cm4gX3JvdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGhhc2hpbmcgdmlydHVhbCByb3dzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleSB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFRhYmxlIHRhYmxlOworICAgICAgICBwdWJsaWMgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTsKKworICAgICAgICBwdWJsaWMgS2V5KFRhYmxlIHRhYmxlLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7CisgICAgICAgICAgICB0aGlzLnNtID0gc207CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuICh0YWJsZS5oYXNoQ29kZSgpICsgc20uaGFzaENvZGUoKSkgJSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBLZXkga2V5ID0gKEtleSkgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gdGFibGUgPT0ga2V5LnRhYmxlICYmIHNtID09IGtleS5zbTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NRTEJ1ZmZlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU1FMQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwYzhmYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NRTEJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNjE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc3FsLkNhbGxhYmxlU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogQnVmZmVyIGZvciBTUUwgc3RhdGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICogamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnRzLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMi40CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTUUxCdWZmZXIKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfVE9LRU4gPSAiPyI7CisKKyAgICBwcml2YXRlIGZpbmFsIERCRGljdGlvbmFyeSBfZGljdDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBfc3FsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHByaXZhdGUgTGlzdCBfc3Vic2VscyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaXN0IF9wYXJhbXMgPSBudWxsOworICAgIHByaXZhdGUgTGlzdCBfY29scyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIoREJEaWN0aW9uYXJ5IGRpY3QpIHsKKyAgICAgICAgX2RpY3QgPSBkaWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlcihTUUxCdWZmZXIgYnVmKSB7CisgICAgICAgIF9kaWN0ID0gYnVmLl9kaWN0OworICAgICAgICBhcHBlbmQoYnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGlzIFNRTCBCdWZmZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTUUxCdWZmZXIodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBpcyBlbXRweS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gX3NxbC5sZW5ndGgoKSA9PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhbGwgU1FMIGFuZCBwYXJhbWV0ZXJzIG9mIHRoZSBnaXZlbiBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmQoU1FMQnVmZmVyIGJ1ZikgeworICAgICAgICBhcHBlbmQoYnVmLCBfc3FsLmxlbmd0aCgpLCAoX3BhcmFtcyA9PSBudWxsKSA/IDAgOiBfcGFyYW1zLnNpemUoKSwKKyAgICAgICAgICAgIHRydWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYWxsIFNRTCBhbmQgcGFyYW1ldGVycyBvZiB0aGUgZ2l2ZW4gYnVmZmVyIGF0IHRoZSBnaXZlbiBwb3NpdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZChTUUxCdWZmZXIgYnVmLCBpbnQgc3FsSW5kZXgsIGludCBwYXJhbUluZGV4LAorICAgICAgICBib29sZWFuIHN1YnNlbHMpIHsKKyAgICAgICAgaWYgKHN1YnNlbHMpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgYWxsb3cgYXBwZW5kaW5nIG9mIGJ1ZmZlcnMgd2l0aCBzdWJzZWxlY3RzLCBub3QgaW5zZXJ0aW9uCisgICAgICAgICAgICBpZiAoX3N1YnNlbHMgIT0gbnVsbCAmJiAhX3N1YnNlbHMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgc3FsSW5kZXggIT0gX3NxbC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoYnVmLl9zdWJzZWxzICE9IG51bGwgJiYgIWJ1Zi5fc3Vic2Vscy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3FsSW5kZXggIT0gX3NxbC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChfc3Vic2VscyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfc3Vic2VscyA9IG5ldyBBcnJheUxpc3QoYnVmLl9zdWJzZWxzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuX3N1YnNlbHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIF9zdWJzZWxzLmFkZCgoKFN1YnNlbGVjdCkgYnVmLl9zdWJzZWxzLmdldChpKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZShzcWxJbmRleCwgcGFyYW1JbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNxbEluZGV4ID09IF9zcWwubGVuZ3RoKCkpCisgICAgICAgICAgICBfc3FsLmFwcGVuZChidWYuX3NxbC50b1N0cmluZygpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3NxbC5pbnNlcnQoc3FsSW5kZXgsIGJ1Zi5fc3FsLnRvU3RyaW5nKCkpOworCisgICAgICAgIGlmIChidWYuX3BhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX3BhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9wYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBpZiAoX2NvbHMgPT0gbnVsbCAmJiBidWYuX2NvbHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9jb2xzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChfY29scy5zaXplKCkgPCBfcGFyYW1zLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgX2NvbHMuYWRkKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW1JbmRleCA9PSBfcGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIF9wYXJhbXMuYWRkQWxsKGJ1Zi5fcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmLl9jb2xzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9jb2xzLmFkZEFsbChidWYuX2NvbHMpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9jb2xzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfY29scy5zaXplKCkgPCBfcGFyYW1zLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2xzLmFkZChudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX3BhcmFtcy5hZGRBbGwocGFyYW1JbmRleCwgYnVmLl9wYXJhbXMpOworICAgICAgICAgICAgICAgIGlmIChidWYuX2NvbHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2NvbHMuYWRkQWxsKHBhcmFtSW5kZXgsIGJ1Zi5fY29scyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2NvbHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9jb2xzLnNpemUoKSA8IF9wYXJhbXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgX2NvbHMuYWRkKHBhcmFtSW5kZXgsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmQoVGFibGUgdGFibGUpIHsKKyAgICAgICAgX3NxbC5hcHBlbmQoX2RpY3QuZ2V0RnVsbE5hbWUodGFibGUsIGZhbHNlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kKFNlcXVlbmNlIHNlcSkgeworICAgICAgICBfc3FsLmFwcGVuZChfZGljdC5nZXRGdWxsTmFtZShzZXEpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmQoQ29sdW1uIGNvbCkgeworICAgICAgICBfc3FsLmFwcGVuZChjb2wuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmQoU3RyaW5nIHMpIHsKKyAgICAgICAgX3NxbC5hcHBlbmQocyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHN1YnNlbGVjdC4gVGhpcyBkZWxheXMgcmVzb2x1dGlvbiBvZiB0aGUgc2VsZWN0IFNRTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZChTZWxlY3Qgc2VsLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHJldHVybiBhcHBlbmQoc2VsLCBmZXRjaCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHN1YnNlbGVjdCBjb3VudC4gVGhpcyBkZWxheXMgcmVzb2x1dGlvbiBvZiB0aGUgc2VsZWN0IFNRTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZENvdW50KFNlbGVjdCBzZWwsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuIGFwcGVuZChzZWwsIGZldGNoLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBzdWJzZWxlY3QuIFRoaXMgZGVsYXlzIHJlc29sdXRpb24gb2YgdGhlIHNlbGVjdCBTUUwuCisgICAgICovCisgICAgcHJpdmF0ZSBTUUxCdWZmZXIgYXBwZW5kKFNlbGVjdCBzZWwsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGJvb2xlYW4gY291bnQpIHsKKyAgICAgICAgX3NxbC5hcHBlbmQoIigiKTsKKyAgICAgICAgU3Vic2VsZWN0IHN1YiA9IG5ldyBTdWJzZWxlY3QoKTsKKyAgICAgICAgc3ViLnNlbGVjdCA9IHNlbDsKKyAgICAgICAgc3ViLmZldGNoID0gZmV0Y2g7CisgICAgICAgIHN1Yi5jb3VudCA9IGNvdW50OworICAgICAgICBzdWIuc3FsSW5kZXggPSBfc3FsLmxlbmd0aCgpOworICAgICAgICBzdWIucGFyYW1JbmRleCA9IChfcGFyYW1zID09IG51bGwpID8gMCA6IF9wYXJhbXMuc2l6ZSgpOworICAgICAgICBfc3FsLmFwcGVuZCgiKSIpOworCisgICAgICAgIGlmIChfc3Vic2VscyA9PSBudWxsKQorICAgICAgICAgICAgX3N1YnNlbHMgPSBuZXcgQXJyYXlMaXN0KDIpOworICAgICAgICBfc3Vic2Vscy5hZGQoc3ViKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhIHN1YnNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKFNlbGVjdCBvbGQsIFNlbGVjdCBzZWwpIHsKKyAgICAgICAgaWYgKF9zdWJzZWxzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFN1YnNlbGVjdCBzdWI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3N1YnNlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHN1YiA9IChTdWJzZWxlY3QpIF9zdWJzZWxzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChzdWIuc2VsZWN0ID09IG9sZCkgeworICAgICAgICAgICAgICAgIHN1Yi5zZWxlY3QgPSBzZWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZFZhbHVlKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBhcHBlbmRWYWx1ZShvLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBwYXJhbWV0ZXIgdmFsdWUgZm9yIGEgc3BlY2lmaWMgY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoT2JqZWN0IG8sIENvbHVtbiBjb2wpIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgIF9zcWwuYXBwZW5kKCJOVUxMIik7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSYXcpCisgICAgICAgICAgICBfc3FsLmFwcGVuZChvLnRvU3RyaW5nKCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9zcWwuYXBwZW5kKFBBUkFNRVRFUl9UT0tFTik7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGFyYW0gYW5kIGNvbCBsaXN0czsgd2UgaG9sZCBvZmYgb24gY29sIGxpc3QgdW50aWwKKyAgICAgICAgICAgIC8vIHdlIGdldCB0aGUgZmlyc3Qgbm9uLW51bGwgY29sCisgICAgICAgICAgICBpZiAoX3BhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9wYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBpZiAoY29sICE9IG51bGwgJiYgX2NvbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9jb2xzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChfY29scy5zaXplKCkgPCBfcGFyYW1zLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgX2NvbHMuYWRkKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfcGFyYW1zLmFkZChvKTsKKyAgICAgICAgICAgIGlmIChfY29scyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9jb2xzLmFkZChjb2wpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZFZhbHVlKGJvb2xlYW4gYikgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUoYiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoYm9vbGVhbiBiLCBDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBhcHBlbmRWYWx1ZSgoYikgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZFZhbHVlKGJ5dGUgYikgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUoYiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoYnl0ZSBiLCBDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBhcHBlbmRWYWx1ZShuZXcgQnl0ZShiKSwgY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmRWYWx1ZShjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIGFwcGVuZFZhbHVlKGMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZFZhbHVlKGNoYXIgYywgQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUobmV3IENoYXJhY3RlcihjKSwgY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmRWYWx1ZShkb3VibGUgZCkgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUoZCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoZG91YmxlIGQsIENvbHVtbiBjb2wpIHsKKyAgICAgICAgcmV0dXJuIGFwcGVuZFZhbHVlKG5ldyBEb3VibGUoZCksIGNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoZmxvYXQgZikgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUoZiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoZmxvYXQgZiwgQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUobmV3IEZsb2F0KGYpLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZFZhbHVlKGludCBpKSB7CisgICAgICAgIHJldHVybiBhcHBlbmRWYWx1ZShpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciBhcHBlbmRWYWx1ZShpbnQgaSwgQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUoTnVtYmVycy52YWx1ZU9mKGkpLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGFwcGVuZFZhbHVlKGxvbmcgbCkgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUobCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUobG9uZyBsLCBDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBhcHBlbmRWYWx1ZShOdW1iZXJzLnZhbHVlT2YobCksIGNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoc2hvcnQgcykgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUocywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgYXBwZW5kVmFsdWUoc2hvcnQgcywgQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gYXBwZW5kVmFsdWUobmV3IFNob3J0KHMpLCBjb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBwYXJhbWV0ZXIgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiAoX3BhcmFtcyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBfcGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNRTCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNRTChmYWxzZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNRTCBmb3IgdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZVBhcmFtcyBpZiB0cnVlLCB0aGVuIHJlcGxhY2UgcGFyYW1ldGVycyB3aXRoIHRoZQorICAgICAqIGFjdHVhbCBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTUUwoYm9vbGVhbiByZXBsYWNlUGFyYW1zKSB7CisgICAgICAgIHJlc29sdmVTdWJzZWxlY3RzKCk7CisgICAgICAgIFN0cmluZyBzcWwgPSBfc3FsLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICghcmVwbGFjZVBhcmFtcyB8fCBfcGFyYW1zID09IG51bGwgfHwgX3BhcmFtcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gc3FsOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEl0ZXJhdG9yIHBpID0gX3BhcmFtcy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNxbC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3FsLmNoYXJBdChpKSAhPSAnPycpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHNxbC5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3QgcGFyYW0gPSBwaS5oYXNOZXh0KCkgPyBwaS5uZXh0KCkgOiBudWxsOworICAgICAgICAgICAgaWYgKHBhcmFtID09IG51bGwpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiTlVMTCIpOworICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBOdW1iZXIgfHwgcGFyYW0gaW5zdGFuY2VvZiBCb29sZWFuKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFyYW0pOworICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBTdHJpbmcgfHwgcGFyYW0gaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiJyIpLmFwcGVuZChwYXJhbSkuYXBwZW5kKCInIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiPyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIG91ciBkZWxheWVkIHN1YnNlbGVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVTdWJzZWxlY3RzKCkgeworICAgICAgICBpZiAoX3N1YnNlbHMgPT0gbnVsbCB8fCBfc3Vic2Vscy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gYWRkIHN1YnNlbHMgYmFja3dhcmRzIHNvIHRoYXQgdGhlIHN0b3JlZCBpbnNlcnRpb24gcG9pbnRzIG9mCisgICAgICAgIC8vIGxhdGVyIHN1YnNlbHMgcmVtYWluIHZhbGlkCisgICAgICAgIFN1YnNlbGVjdCBzdWI7CisgICAgICAgIFNRTEJ1ZmZlciBidWY7CisgICAgICAgIGZvciAoaW50IGkgPSBfc3Vic2Vscy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgc3ViID0gKFN1YnNlbGVjdCkgX3N1YnNlbHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHN1Yi5jb3VudCkKKyAgICAgICAgICAgICAgICBidWYgPSBzdWIuc2VsZWN0LnRvU2VsZWN0Q291bnQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWYgPSBzdWIuc2VsZWN0LnRvU2VsZWN0KGZhbHNlLCBzdWIuZmV0Y2gpOworICAgICAgICAgICAgYnVmLnJlc29sdmVTdWJzZWxlY3RzKCk7CisgICAgICAgICAgICBhcHBlbmQoYnVmLCBzdWIuc3FsSW5kZXgsIHN1Yi5wYXJhbUluZGV4LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgX3N1YnNlbHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgcHJlcGFyZWQgc3RhdGVtZW50IHVzaW5nCisgICAgICogdGhlIFNRTCBpbiB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlcGFyZVN0YXRlbWVudChjb25uLCBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFksCisgICAgICAgICAgICBSZXN1bHRTZXQuQ09OQ1VSX1JFQURfT05MWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgcGFyYW1ldGVycyBvZiBhIHByZXBhcmVkIHN0YXRlbWVudCB1c2luZworICAgICAqIHRoZSBTUUwgaW4gdGhpcyBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoQ29ubmVjdGlvbiBjb25uLCBpbnQgcnNUeXBlLAorICAgICAgICBpbnQgcnNDb25jdXIpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlcGFyZVN0YXRlbWVudChjb25uLCBudWxsLCByc1R5cGUsIHJzQ29uY3VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgcHJlcHJlZCBzdGF0ZW1lbnQgdXNpbmcgdGhlCisgICAgICogU1FMIGluIHRoaXMgYnVmZmVyIGFuZCB0aGUgZ2l2ZW4gZmV0Y2ggY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChDb25uZWN0aW9uIGNvbm4sCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCByc1R5cGUsIGludCByc0NvbmN1cikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyc1R5cGUgPT0gLTEgJiYgZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIHJzVHlwZSA9IFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWTsKKyAgICAgICAgZWxzZSBpZiAocnNUeXBlID09IC0xKQorICAgICAgICAgICAgcnNUeXBlID0gZmV0Y2guZ2V0UmVzdWx0U2V0VHlwZSgpOworICAgICAgICBpZiAocnNDb25jdXIgPT0gLTEpCisgICAgICAgICAgICByc0NvbmN1ciA9IFJlc3VsdFNldC5DT05DVVJfUkVBRF9PTkxZOworCisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50OworICAgICAgICBpZiAocnNUeXBlID09IFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWQorICAgICAgICAgICAgJiYgcnNDb25jdXIgPT0gUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkpCisgICAgICAgICAgICBzdG1udCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChnZXRTUUwoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0bW50ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KGdldFNRTCgpLCByc1R5cGUsIHJzQ29uY3VyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldFBhcmFtZXRlcnMoc3RtbnQpOworICAgICAgICAgICAgaWYgKGZldGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmV0Y2guZ2V0RmV0Y2hCYXRjaFNpemUoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHN0bW50LnNldEZldGNoU2l6ZShmZXRjaC5nZXRGZXRjaEJhdGNoU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocnNUeXBlICE9IFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWQorICAgICAgICAgICAgICAgICAgICAmJiBmZXRjaC5nZXRGZXRjaERpcmVjdGlvbigpICE9IFJlc3VsdFNldC5GRVRDSF9GT1JXQVJEKQorICAgICAgICAgICAgICAgICAgICBzdG1udC5zZXRGZXRjaERpcmVjdGlvbihmZXRjaC5nZXRGZXRjaERpcmVjdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdG1udDsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0bW50LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UyKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIHBhcmFtZXRlcnMgb2YgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgdXNpbmcKKyAgICAgKiB0aGUgU1FMIGluIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBDYWxsYWJsZVN0YXRlbWVudCBwcmVwYXJlQ2FsbChDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlcGFyZUNhbGwoY29ubiwgUmVzdWx0U2V0LlRZUEVfRk9SV0FSRF9PTkxZLAorICAgICAgICAgICAgUmVzdWx0U2V0LkNPTkNVUl9SRUFEX09OTFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIHBhcmFtZXRlcnMgb2YgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgdXNpbmcKKyAgICAgKiB0aGUgU1FMIGluIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBDYWxsYWJsZVN0YXRlbWVudCBwcmVwYXJlQ2FsbChDb25uZWN0aW9uIGNvbm4sIGludCByc1R5cGUsCisgICAgICAgIGludCByc0NvbmN1cikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVwYXJlQ2FsbChjb25uLCBudWxsLCByc1R5cGUsIHJzQ29uY3VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgcHJlcHJlZCBzdGF0ZW1lbnQgdXNpbmcgdGhlCisgICAgICogU1FMIGluIHRoaXMgYnVmZmVyIGFuZCB0aGUgZ2l2ZW4gZmV0Y2ggY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoQ29ubmVjdGlvbiBjb25uLAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgcnNUeXBlLCBpbnQgcnNDb25jdXIpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAocnNUeXBlID09IC0xICYmIGZldGNoID09IG51bGwpCisgICAgICAgICAgICByc1R5cGUgPSBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFk7CisgICAgICAgIGVsc2UgaWYgKHJzVHlwZSA9PSAtMSkKKyAgICAgICAgICAgIHJzVHlwZSA9IGZldGNoLmdldFJlc3VsdFNldFR5cGUoKTsKKyAgICAgICAgaWYgKHJzQ29uY3VyID09IC0xKQorICAgICAgICAgICAgcnNDb25jdXIgPSBSZXN1bHRTZXQuQ09OQ1VSX1JFQURfT05MWTsKKworICAgICAgICBDYWxsYWJsZVN0YXRlbWVudCBzdG1udDsKKyAgICAgICAgaWYgKHJzVHlwZSA9PSBSZXN1bHRTZXQuVFlQRV9GT1JXQVJEX09OTFkKKyAgICAgICAgICAgICYmIHJzQ29uY3VyID09IFJlc3VsdFNldC5DT05DVVJfUkVBRF9PTkxZKQorICAgICAgICAgICAgc3RtbnQgPSBjb25uLnByZXBhcmVDYWxsKGdldFNRTCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RtbnQgPSBjb25uLnByZXBhcmVDYWxsKGdldFNRTCgpLCByc1R5cGUsIHJzQ29uY3VyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldFBhcmFtZXRlcnMoc3RtbnQpOworICAgICAgICAgICAgaWYgKGZldGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmV0Y2guZ2V0RmV0Y2hCYXRjaFNpemUoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHN0bW50LnNldEZldGNoU2l6ZShmZXRjaC5nZXRGZXRjaEJhdGNoU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocnNUeXBlICE9IFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWQorICAgICAgICAgICAgICAgICAgICAmJiBmZXRjaC5nZXRGZXRjaERpcmVjdGlvbigpICE9IFJlc3VsdFNldC5GRVRDSF9GT1JXQVJEKQorICAgICAgICAgICAgICAgICAgICBzdG1udC5zZXRGZXRjaERpcmVjdGlvbihmZXRjaC5nZXRGZXRjaERpcmVjdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdG1udDsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0bW50LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UyKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIFByZXBhcmVkU3RhdGVtZW50CisgICAgICogd2l0aCB2YWx1ZXMgZnJvbSB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFByZXBhcmVkU3RhdGVtZW50IHBzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9wYXJhbXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDb2x1bW4gY29sOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9wYXJhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbCA9IChfY29scyA9PSBudWxsKSA/IG51bGwgOiAoQ29sdW1uKSBfY29scy5nZXQoaSk7CisgICAgICAgICAgICBfZGljdC5zZXRVbmtub3duKHBzLCBpICsgMSwgX3BhcmFtcy5nZXQoaSksIGNvbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IF9zcWwuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIChfcGFyYW1zID09IG51bGwpID8gaGFzaCA6IGhhc2ggXiBfcGFyYW1zLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSBpbnRlcm5hbCBTUUwgd2l0aG91dCByZXNvbHZpbmcgc3Vic2VsZWN0cyBvciBzdHJpbmdpZnlpbmcKKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNxbEVxdWFscyhTdHJpbmcgc3FsKSB7CisgICAgICAgIHJldHVybiBfc3FsLnRvU3RyaW5nKCkuZXF1YWxzKHNxbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNRTEJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU1FMQnVmZmVyIGJ1ZiA9IChTUUxCdWZmZXIpIG90aGVyOworICAgICAgICByZXR1cm4gX3NxbC5lcXVhbHMoYnVmLl9zcWwpCisgICAgICAgICAgICAmJiBPYmplY3RVdGlscy5lcXVhbHMoX3BhcmFtcywgYnVmLl9wYXJhbXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBzdWJzZWxlY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3Vic2VsZWN0IHsKKworICAgICAgICBwdWJsaWMgU2VsZWN0IHNlbGVjdDsKKyAgICAgICAgcHVibGljIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2g7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvdW50OworICAgICAgICBwdWJsaWMgaW50IHNxbEluZGV4OworICAgICAgICBwdWJsaWMgaW50IHBhcmFtSW5kZXg7CisKKyAgICAgICAgcHVibGljIFN1YnNlbGVjdCBjbG9uZShpbnQgc3FsSW5kZXgsIGludCBwYXJhbUluZGV4KSB7CisgICAgICAgICAgICBpZiAoc3FsSW5kZXggPT0gMCAmJiBwYXJhbUluZGV4ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIFN1YnNlbGVjdCBzdWIgPSBuZXcgU3Vic2VsZWN0KCk7CisgICAgICAgICAgICBzdWIuc2VsZWN0ID0gc2VsZWN0OworICAgICAgICAgICAgc3ViLmZldGNoID0gZmV0Y2g7CisgICAgICAgICAgICBzdWIuY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIHN1Yi5zcWxJbmRleCA9IHRoaXMuc3FsSW5kZXggKyBzcWxJbmRleDsKKyAgICAgICAgICAgIHN1Yi5wYXJhbUluZGV4ID0gdGhpcy5wYXJhbUluZGV4ICsgcGFyYW1JbmRleDsKKyAgICAgICAgICAgIHJldHVybiBzdWI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxFeGNlcHRpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxFeGNlcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MzE0MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NRTEV4Y2VwdGlvbnMuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYSB7QGxpbmsgU1FMRXhjZXB0aW9ufSBpbnRvCisgKiB0aGUgYXBwcm9wcmlhdGUgT3BlbkpQQSB0eXBlLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxFeGNlcHRpb25zIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNRTEV4Y2VwdGlvbltdIEVNUFRZX0VYQ0VQUyA9IG5ldyBTUUxFeGNlcHRpb25bMF07CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGludG8gYSB7QGxpbmsgU3RvcmVFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUV4Y2VwdGlvbiBnZXRTdG9yZShTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgcmV0dXJuIGdldFN0b3JlKHNlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGludG8gYSB7QGxpbmsgT3BlbkpQQUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPcGVuSlBBRXhjZXB0aW9uIGdldFN0b3JlKFNRTEV4Y2VwdGlvbiBzZSwgT2JqZWN0IGZhaWxlZCkgeworICAgICAgICByZXR1cm4gZ2V0U3RvcmUoc2UsIGZhaWxlZCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBpbnRvIGEge0BsaW5rIFN0b3JlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFFeGNlcHRpb24gZ2V0U3RvcmUoU1FMRXhjZXB0aW9uIHNlLAorICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICByZXR1cm4gZ2V0U3RvcmUoc2UuZ2V0TWVzc2FnZSgpLCBzZSwgZGljdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBpbnRvIGEge0BsaW5rIFN0b3JlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFFeGNlcHRpb24gZ2V0U3RvcmUoU1FMRXhjZXB0aW9uIHNlLCBPYmplY3QgZmFpbGVkLAorICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICByZXR1cm4gZ2V0U3RvcmUoc2UuZ2V0TWVzc2FnZSgpLCBzZSwgZmFpbGVkLCBkaWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGludG8gYSB7QGxpbmsgU3RvcmVFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUV4Y2VwdGlvbiBnZXRTdG9yZShNZXNzYWdlIG1zZywgU1FMRXhjZXB0aW9uIHNlLAorICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICByZXR1cm4gZ2V0U3RvcmUobXNnLmdldE1lc3NhZ2UoKSwgc2UsIG51bGwsIGRpY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gaW50byBhIHtAbGluayBTdG9yZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPcGVuSlBBRXhjZXB0aW9uIGdldFN0b3JlKFN0cmluZyBtc2csIFNRTEV4Y2VwdGlvbiBzZSwKKyAgICAgICAgREJEaWN0aW9uYXJ5IGRpY3QpIHsKKyAgICAgICAgcmV0dXJuIGdldFN0b3JlKG1zZywgc2UsIG51bGwsIGRpY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gaW50byBhIHtAbGluayBTdG9yZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPcGVuSlBBRXhjZXB0aW9uIGdldFN0b3JlKFN0cmluZyBtc2csIFNRTEV4Y2VwdGlvbiBzZSwKKyAgICAgICAgT2JqZWN0IGZhaWxlZCwgREJEaWN0aW9uYXJ5IGRpY3QpIHsKKyAgICAgICAgaWYgKG1zZyA9PSBudWxsKQorICAgICAgICAgICAgbXNnID0gc2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIFNRTEV4Y2VwdGlvbltdIHNlcyA9IGdldFNRTEV4Y2VwdGlvbnMoc2UpOworICAgICAgICBpZiAoZGljdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yZUV4Y2VwdGlvbihtc2cpLnNldEZhaWxlZE9iamVjdChmYWlsZWQpLgorICAgICAgICAgICAgICAgIHNldE5lc3RlZFRocm93YWJsZXMoc2VzKTsKKyAgICAgICAgcmV0dXJuIGRpY3QubmV3U3RvcmVFeGNlcHRpb24obXNnLCBzZXMsIGZhaWxlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgU1FMRXhjZXB0aW9ufSBpbnN0YW5jZXMgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCBleGNlcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU1FMRXhjZXB0aW9uW10gZ2V0U1FMRXhjZXB0aW9ucyhTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgaWYgKHNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfRVhDRVBTOworCisgICAgICAgIExpc3QgZXJycyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHdoaWxlIChzZSAhPSBudWxsICYmICFlcnJzLmNvbnRhaW5zKHNlKSkgeworICAgICAgICAgICAgZXJycy5hZGQoc2UpOworICAgICAgICAgICAgc2UgPSBzZS5nZXROZXh0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTUUxFeGNlcHRpb25bXSkgZXJycy50b0FycmF5KG5ldyBTUUxFeGNlcHRpb25bZXJycy5zaXplKCldKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzM2FjZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NRTEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworLyoqCisgKiBGYWN0b3J5IGZvciBTUUwgY29uc3RydWN0cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNRTEZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogU2VsZWN0IGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFNlbGVjdCBuZXdTZWxlY3QoKTsKKworICAgIC8qKgorICAgICAqIFVuaW9uIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0cyB0aGUgbnVtYmVyIG9mIHNlbGVjdHMgaW4gdGhlIHVuaW9uCisgICAgICovCisgICAgcHVibGljIFVuaW9uIG5ld1VuaW9uKGludCBzZWxlY3RzKTsKKworICAgIC8qKgorICAgICAqIFVuaW9uIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0cyB0aGUgbWVtYmVycyBvZiB0aGUgdW5pb24KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pb24gbmV3VW5pb24oU2VsZWN0W10gc2VsZWN0cyk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxGYWN0b3J5SW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU1FMRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY5N2M2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU1FMRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIFNRTCBhYnN0cmFjdGlvbiBjb25zdHJ1Y3RzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxGYWN0b3J5SW1wbAorICAgIGltcGxlbWVudHMgU1FMRmFjdG9yeSwgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgSkRCQ0NvbmZpZ3VyYXRpb24gX2NvbmYgPSBudWxsOworCisgICAgLyoqCisgICAgICogU3lzdGVtIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIEpEQkNDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfY29uZjsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VsZWN0IG5ld1NlbGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RJbXBsKF9jb25mKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5pb24gbmV3VW5pb24oaW50IHNlbGVjdHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb2dpY2FsVW5pb24oX2NvbmYsIHNlbGVjdHMpOworICAgIH0KKworICAgIHB1YmxpYyBVbmlvbiBuZXdVbmlvbihTZWxlY3RbXSBzZWxlY3RzKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9naWNhbFVuaW9uKF9jb25mLCBzZWxlY3RzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxTZXJ2ZXJEaWN0aW9uYXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxTZXJ2ZXJEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0MGMyMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NRTFNlcnZlckRpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIE1TIFNRTFNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIFNRTFNlcnZlckRpY3Rpb25hcnkKKyAgICBleHRlbmRzIEFic3RyYWN0U1FMU2VydmVyRGljdGlvbmFyeSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTUlDUk9TT0ZUID0gIm1pY3Jvc29mdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX05FVERJUkVDVCA9ICJuZXRkaXJlY3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9KVERTID0gImp0ZHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU1FMU2VydmVyRGljdGlvbmFyeS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoZXRoZXIgdG8gdHJlYXQgVU5JUVVFSURFTlRJRklFUiBhcyBWQVJCSU5BUlkgb3IgVkFSQ0hBUgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHVuaXF1ZUlkZW50aWZpZXJBc1ZhcmJpbmFyeSA9IHRydWU7CisKKyAgICBwdWJsaWMgU1FMU2VydmVyRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIiOworCisgICAgICAgIC8vIFNRTFNlcnZlciBsb2NrcyBvbiBhIHRhYmxlLWJ5LXRhYmxlIGJhc2lzCisgICAgICAgIGZvclVwZGF0ZUNsYXVzZSA9IG51bGw7CisgICAgICAgIHRhYmxlRm9yVXBkYXRlQ2xhdXNlID0gIldJVEggKFVQRExPQ0spIjsKKworICAgICAgICBzdXBwb3J0c051bGxUYWJsZUZvckdldENvbHVtbnMgPSBmYWxzZTsKKyAgICAgICAgcmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCA9IHRydWU7CisKKyAgICAgICAgc3RyaW5nTGVuZ3RoRnVuY3Rpb24gPSAiTEVOKHswfSkiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RlZENvbmZpZ3VyYXRpb24oQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuY29ubmVjdGVkQ29uZmlndXJhdGlvbihjb25uKTsKKworICAgICAgICBEYXRhYmFzZU1ldGFEYXRhIG1ldGEgPSBjb25uLmdldE1ldGFEYXRhKCk7CisgICAgICAgIFN0cmluZyBkcml2ZXJOYW1lID0gbWV0YS5nZXREcml2ZXJOYW1lKCk7CisgICAgICAgIFN0cmluZyB1cmwgPSBtZXRhLmdldFVSTCgpOworICAgICAgICBpZiAoZHJpdmVyVmVuZG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgiTmV0RGlyZWN0IEpTUUxDb25uZWN0Ii5lcXVhbHMoZHJpdmVyTmFtZSkpCisgICAgICAgICAgICAgICAgZHJpdmVyVmVuZG9yID0gVkVORE9SX05FVERJUkVDVDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlck5hbWUgIT0gbnVsbCAmJiBkcml2ZXJOYW1lLnN0YXJ0c1dpdGgoImpURFMiKSkKKyAgICAgICAgICAgICAgICBkcml2ZXJWZW5kb3IgPSBWRU5ET1JfSlREUzsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJTUUxTZXJ2ZXIiLmVxdWFscyhkcml2ZXJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwuc3RhcnRzV2l0aCgiamRiYzptaWNyb3NvZnQ6c3Fsc2VydmVyOiIpKQorICAgICAgICAgICAgICAgICAgICBkcml2ZXJWZW5kb3IgPSBWRU5ET1JfTUlDUk9TT0ZUOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVybCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIHVybC5zdGFydHNXaXRoKCJqZGJjOmRhdGFkaXJlY3Q6c3Fsc2VydmVyOiIpKQorICAgICAgICAgICAgICAgICAgICBkcml2ZXJWZW5kb3IgPSBWRU5ET1JfREFUQURJUkVDVDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRyaXZlclZlbmRvciA9IFZFTkRPUl9PVEhFUjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGRyaXZlclZlbmRvciA9IFZFTkRPUl9PVEhFUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdhcm4gYWJvdXQgdXNpbmcgY3Vyc29ycworICAgICAgICBpZiAoKFZFTkRPUl9NSUNST1NPRlQuZXF1YWxzSWdub3JlQ2FzZShkcml2ZXJWZW5kb3IpCisgICAgICAgICAgICB8fCBWRU5ET1JfREFUQURJUkVDVC5lcXVhbHNJZ25vcmVDYXNlKGRyaXZlclZlbmRvcikpCisgICAgICAgICAgICAmJiB1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJzZWxlY3RtZXRob2Q9Y3Vyc29yIikgPT0gLTEpCisgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgic3Fsc2VydmVyLWN1cnNvciIsIHVybCkpOworCisgICAgICAgIC8vIHdhcm4gYWJvdXQgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcgaWYgdXNpbmcgbXMgZHJpdmVyCisgICAgICAgIFN0cmluZyBwcm9wcyA9IGNvbmYuZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKQorICAgICAgICAgICAgcHJvcHMgPSAiIjsKKyAgICAgICAgaWYgKFZFTkRPUl9NSUNST1NPRlQuZXF1YWxzSWdub3JlQ2FzZShkcml2ZXJWZW5kb3IpCisgICAgICAgICAgICAmJiBwcm9wcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIm1heGNhY2hlZHN0YXRlbWVudHM9MCIpID09IC0xKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoInNxbHNlcnZlci1jYWNoZWRzdG1udHMiKSk7CisgICAgfQorCisgICAgcHVibGljIENvbHVtbltdIGdldENvbHVtbnMoRGF0YWJhc2VNZXRhRGF0YSBtZXRhLCBTdHJpbmcgY2F0YWxvZywKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2x1bW5OYW1lLCBDb25uZWN0aW9uIGNvbm4pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb2x1bW5bXSBjb2xzID0gc3VwZXIuZ2V0Q29sdW1ucyhtZXRhLCBjYXRhbG9nLCBzY2hlbWFOYW1lLCB0YWJsZU5hbWUsCisgICAgICAgICAgICBjb2x1bW5OYW1lLCBjb25uKTsKKworICAgICAgICAvLyBmb3Igb3B0YSBkcml2ZXIsIHdoaWNoIHJlcG9ydHMgbnZhcmNoYXIgYXMgdW5rbm93biB0eXBlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBjb2xzICE9IG51bGwgJiYgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGNvbHNbaV0uZ2V0VHlwZU5hbWUoKTsKKyAgICAgICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnRvVXBwZXJDYXNlKCk7CisKKyAgICAgICAgICAgIGlmICgiTlZBUkNIQVIiLmVxdWFscyh0eXBlTmFtZSkpCisgICAgICAgICAgICAgICAgY29sc1tpXS5zZXRUeXBlKFR5cGVzLlZBUkNIQVIpOworICAgICAgICAgICAgZWxzZSBpZiAoIlVOSVFVRUlERU5USUZJRVIiLmVxdWFscyh0eXBlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodW5pcXVlSWRlbnRpZmllckFzVmFyYmluYXJ5KQorICAgICAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuVkFSQklOQVJZKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0VHlwZShUeXBlcy5WQVJDSEFSKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIk5DSEFSIi5lcXVhbHModHlwZU5hbWUpKQorICAgICAgICAgICAgICAgIGNvbHNbaV0uc2V0VHlwZShUeXBlcy5DSEFSKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJOVEVYVCIuZXF1YWxzKHR5cGVOYW1lKSkKKyAgICAgICAgICAgICAgICBjb2xzW2ldLnNldFR5cGUoVHlwZXMuQ0xPQik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU2Vjb25kYXJ5Um93LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TZWNvbmRhcnlSb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTk1YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU2Vjb25kYXJ5Um93LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5SZWxhdGlvbklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbklPOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CisKKy8qKgorICogU2Vjb25kYXJ5IHRhYmxlIHJvdyB0aGF0IHRyYWNrcyBmb3JlaWduIGtleXMgdG8gYXV0by1pbmMgY29sdW1ucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU2Vjb25kYXJ5Um93CisgICAgZXh0ZW5kcyBSb3dJbXBsIHsKKworICAgIHByaXZhdGUgT3BlbkpQQVN0YXRlTWFuYWdlcltdIF9ma3MgPSBudWxsOworICAgIHByaXZhdGUgQ29sdW1uSU9bXSBfZmtJTyA9IG51bGw7CisgICAgcHJpdmF0ZSBPcGVuSlBBU3RhdGVNYW5hZ2VyW10gX3JlbHMgPSBudWxsOworICAgIHByaXZhdGUgUmVsYXRpb25JZFtdIF9jYWxsYmFja3MgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSB0YWJsZSBhbmQgYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTZWNvbmRhcnlSb3coVGFibGUgdGFibGUsIGludCBhY3Rpb24pIHsKKyAgICAgICAgdGhpcyh0YWJsZS5nZXRDb2x1bW5zKCksIGFjdGlvbik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNlY29uZGFyeVJvdyhDb2x1bW5bXSBjb2xzLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIHN1cGVyKGNvbHMsIGFjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0Rm9yZWlnbktleShmaywgbnVsbCwgc20pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgQ29sdW1uSU8gaW8sCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoIWRlbGF5Rm9yZWlnbktleShmaywgc20pKSB7CisgICAgICAgICAgICBzdXBlci5zZXRGb3JlaWduS2V5KGZrLCBpbywgc20pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yY2UgdmFsaWQKKyAgICAgICAgaWYgKGNhblNldEFueShpbywgZmsuZ2V0Q29sdW1ucygpLmxlbmd0aAorICAgICAgICAgICAgKyBmay5nZXRDb25zdGFudENvbHVtbnMoKS5sZW5ndGgsIGZhbHNlKSkKKyAgICAgICAgICAgIHNldFZhbGlkKHRydWUpOworCisgICAgICAgIC8vIHJlY29yZCBmb3JlaWcga2V5IGZvciBkZWxheWVkIGZsdXNoCisgICAgICAgIGlmIChfZmtzID09IG51bGwpCisgICAgICAgICAgICBfZmtzID0gbmV3IE9wZW5KUEFTdGF0ZU1hbmFnZXJbZ2V0VGFibGUoKS5nZXRGb3JlaWduS2V5cygpLmxlbmd0aF07CisgICAgICAgIF9ma3NbZmsuZ2V0SW5kZXgoKV0gPSBzbTsKKworICAgICAgICBpZiAoX2ZrSU8gIT0gbnVsbCkKKyAgICAgICAgICAgIF9ma0lPW2ZrLmdldEluZGV4KCldID0gaW87CisgICAgICAgIGVsc2UgaWYgKGlvICE9IG51bGwKKyAgICAgICAgICAgICYmICgoZ2V0QWN0aW9uKCkgPT0gQUNUSU9OX0lOU0VSVAorICAgICAgICAgICAgJiYgIWlvLmlzQWxsSW5zZXJ0YWJsZShmaywgZmFsc2UpKQorICAgICAgICAgICAgfHwgKGdldEFjdGlvbigpICE9IEFDVElPTl9JTlNFUlQKKyAgICAgICAgICAgICYmICFpby5pc0FsbFVwZGF0YWJsZShmaywgZmFsc2UpKSkpIHsKKyAgICAgICAgICAgIF9ma0lPID0gbmV3IENvbHVtbklPW19ma3MubGVuZ3RoXTsKKyAgICAgICAgICAgIF9ma0lPW2ZrLmdldEluZGV4KCldID0gaW87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgZm9yZWlnbiBrZXlzIHRvIG5ldyBhdXRvLWluYyBpbnN0YW5jZXM7IGZsdXNoIHRoZW0gb25seSB3aGVuCisgICAgICogd2UgaGF2ZSB0byBnZW5lcmF0ZSBvdXIgU1FMIHRvIGdpdmUgdGhlIGluc3RhbmNlIGEgY2hhbmNlIHRvIGZpbmFsaXplCisgICAgICogaXRzIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsYXlGb3JlaWduS2V5KEZvcmVpZ25LZXkgZmssIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIGZrLmlzUHJpbWFyeUtleUF1dG9Bc3NpZ25lZCgpICYmIGdldEFjdGlvbigpICE9IEFDVElPTl9ERUxFVEUKKyAgICAgICAgICAgICYmIHNtICE9IG51bGwgJiYgc20uaXNOZXcoKSAmJiAhc20uaXNGbHVzaGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25JZChDb2x1bW4gY29sLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBSZWxhdGlvbklkIHJlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzbSA9PSBudWxsIHx8IHNtLmdldE9iamVjdElkKCkgIT0gbnVsbCB8fCAhc20uaXNOZXcoKQorICAgICAgICAgICAgfHwgc20uaXNGbHVzaGVkKCkgfHwgIWlzUHJpbWFyeUtleUF1dG9Bc3NpZ25lZChzbSkpCisgICAgICAgICAgICBzdXBlci5zZXRSZWxhdGlvbklkKGNvbCwgc20sIHJlbCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKF9yZWxzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb2x1bW5bXSBjb2xzID0gZ2V0VGFibGUoKS5nZXRSZWxhdGlvbklkQ29sdW1ucygpOworICAgICAgICAgICAgICAgIF9yZWxzID0gbmV3IE9wZW5KUEFTdGF0ZU1hbmFnZXJbY29scy5sZW5ndGhdOworICAgICAgICAgICAgICAgIF9jYWxsYmFja3MgPSBuZXcgUmVsYXRpb25JZFtjb2xzLmxlbmd0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaWR4ID0gZ2V0UmVsYXRpb25JZEluZGV4KGNvbCk7CisgICAgICAgICAgICBfcmVsc1tpZHhdID0gc207CisgICAgICAgICAgICBfY2FsbGJhY2tzW2lkeF0gPSByZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IGludG8gb3VyIHJlbGF0aW9uIGlkIGFycmF5IG9mIHRoZSB2YWx1ZSBmb3IgdGhlCisgICAgICogZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldFJlbGF0aW9uSWRJbmRleChDb2x1bW4gY29sKSB7CisgICAgICAgIENvbHVtbltdIGNvbHMgPSBnZXRUYWJsZSgpLmdldFJlbGF0aW9uSWRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChjb2xzW2ldID09IGNvbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIGFueSBwcmltYXJ5IGtleSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBpbnN0YW5jZSBhcmUKKyAgICAgKiBhdXRvLWFzc2lnbmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5QXV0b0Fzc2lnbmVkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChDbGFzc01hcHBpbmcpIHNtLmdldE1ldGFEYXRhKCk7CisgICAgICAgIHdoaWxlIChjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGNscyA9IGNscy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgQ29sdW1uW10gY29scyA9IGNscy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoY29sc1tpXS5pc0F1dG9Bc3NpZ25lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZVNRTChEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9ma3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZvcmVpZ25LZXlbXSBma3MgPSBnZXRUYWJsZSgpLmdldEZvcmVpZ25LZXlzKCk7CisgICAgICAgICAgICAgICAgQ29sdW1uSU8gaW87CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZmtzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvID0gKF9ma0lPID09IG51bGwpID8gbnVsbCA6IF9ma0lPW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0Rm9yZWlnbktleShma3NbaV0sIGlvLCBfZmtzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfcmVscyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29sdW1uW10gY29scyA9IGdldFRhYmxlKCkuZ2V0UmVsYXRpb25JZENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yZWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoX3JlbHNbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldFJlbGF0aW9uSWQoY29sc1tpXSwgX3JlbHNbaV0sIF9jYWxsYmFja3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IFNRTEV4Y2VwdGlvbnMuZ2V0U3RvcmUoc2UsIGRpY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZW5lcmF0ZVNRTChkaWN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUm93SW1wbCBuZXdJbnN0YW5jZShDb2x1bW5bXSBjb2xzLCBpbnQgYWN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU2Vjb25kYXJ5Um93KGNvbHMsIGFjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weUludG8oUm93SW1wbCByb3csIGJvb2xlYW4gd2hlcmVPbmx5KSB7CisgICAgICAgIHN1cGVyLmNvcHlJbnRvKHJvdywgd2hlcmVPbmx5KTsKKyAgICAgICAgaWYgKF9ma3MgPT0gbnVsbCB8fCB3aGVyZU9ubHkgfHwgcm93LmdldEFjdGlvbigpID09IEFDVElPTl9ERUxFVEUKKyAgICAgICAgICAgIHx8ICEocm93IGluc3RhbmNlb2YgU2Vjb25kYXJ5Um93KSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTZWNvbmRhcnlSb3cgc3JvdyA9IChTZWNvbmRhcnlSb3cpIHJvdzsKKyAgICAgICAgaWYgKHNyb3cuX2ZrcyA9PSBudWxsKQorICAgICAgICAgICAgc3Jvdy5fZmtzID0gbmV3IE9wZW5KUEFTdGF0ZU1hbmFnZXJbX2Zrcy5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9ma3MsIDAsIHNyb3cuX2ZrcywgMCwgX2Zrcy5sZW5ndGgpOworICAgICAgICBpZiAoX2ZrSU8gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNyb3cuX2ZrSU8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzcm93Ll9ma0lPID0gbmV3IENvbHVtbklPW19ma0lPLmxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9ma0lPLCAwLCBzcm93Ll9ma0lPLCAwLCBfZmtJTy5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU2VsZWN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TZWxlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM5ZjUwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU2VsZWN0LmphdmEKQEAgLTAsMCArMSw2ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZTsKKworLyoqCisgKiBBYnN0cmFjdGlvbiBvZiBhIFNRTCBTRUxFQ1Qgc3RhdGVtZW50LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VsZWN0CisgICAgZXh0ZW5kcyBTZWxlY3RFeGVjdXRvciB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRvIGJhdGNoIHRoZSBzZWxlY3QgdXNpbmcgYW4gaW5uZXIgam9pbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQUdFUl9JTk5FUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRvIGJhdGNoIHRoZSBzZWxlY3QgdXNpbmcgYW4gb3V0ZXIgam9pbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQUdFUl9PVVRFUiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRvIHVzZSBhIHNlcGFyYXRlIHNlbGVjdCBleGVjdXRlZCBpbiBwYXJhbGxlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQUdFUl9QQVJBTExFTCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIGEgc2VsZWN0IGNhbiBiZSBtYWRlIHdpdGhvdXQgam9pbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9KT0lOTEVTUyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIGEgdHdvLXBhcnQgc2VsZWN0IGFuZCBsb2FkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVFdPX1BBUlQgPSA0OworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0byBhZGQgY29uZGl0aW9ucyB0byB0aGUgc2VsY2V0IHRvIHNlbGVjdCB0aGlzCisgICAgICogY2xhc3MgYW5kIGpvaW5hYmxlIHN1YmNsYXNzZXMgb25seS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTX0pPSU5BQkxFID0gMTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdG8gYWRkIGNvbmRpdGlvbnMgdG8gdGhlIHNlbGVjdCB0byBzZWxlY3QgdGhpcworICAgICAqIGNsYXNzIG9ubHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCU19OT05FID0gMjsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdG8gc2VsZWN0IHN1YmNsYXNzZXMgYnV0IHdpdGhvdXQgYWRkaW5nIGFueQorICAgICAqIGNsYXNzIGNvbmRpdGlvbnMgdG8gdGhlIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTX0FOWV9KT0lOQUJMRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRvIHNlbGVjdCB0aGlzIGNsYXNzIGJ1dCB3aXRob3V0IGFkZGluZyBhbnkKKyAgICAgKiBjbGFzcyBjb25kaXRpb25zIHRvIHRoZSBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCU19FWEFDVCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWxpYXMgdG8gdXNlIGZvciB0aGUgZnJvbSBzZWxlY3QsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUk9NX1NFTEVDVF9BTElBUyA9ICJzIjsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIHNlbGVjdCB3aXRoaW4gdGhlIFVOSU9OLCBvciAwLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5kZXhPZigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgc2VsZWN0J3Mgc3Vic2VsZWN0cywgb3IgZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFN1YnNlbGVjdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgc2VsZWN0LCBpZiBpdCBpcyBhIHN1YnNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0IGdldFBhcmVudCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdWJzZWxlY3QgcGF0aCBmb3IgdGhpcyBzZWxlY3QsIGlmIGl0IGlzIGEgc3Vic2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic2VsZWN0UGF0aCgpOworCisgICAgLyoqCisgICAgICogVHVybiB0aGlzIHNlbGVjdCBpbnRvIGEgc3Vic2VsZWN0IG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoU2VsZWN0IHBhcmVudCwgU3RyaW5nIHBhdGgpOworCisgICAgLyoqCisgICAgICogQW5vdGhlciBzZWxlY3QgaW5zdGFuY2UgdGhhdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IHRhYmxlIGZyb20gd2hpY2gKKyAgICAgKiB0aGlzIHNlbGVjdCBwdWxscyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3QgZ2V0RnJvbVNlbGVjdCgpOworCisgICAgLyoqCisgICAgICogQW5vdGhlciBzZWxlY3QgaW5zdGFuY2UgdGhhdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IHRhYmxlIGZyb20gd2hpY2gKKyAgICAgKiB0aGlzIHNlbGVjdCBwdWxscyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb21TZWxlY3QoU2VsZWN0IHNlbCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgc2VsZWN0IGhhcyBhbiBlYWdlciBqb2luIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFYWdlckpvaW4oYm9vbGVhbiB0b01hbnkpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHNlbGVjdCBoYXMgYSBqb2luIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNKb2luKGJvb2xlYW4gdG9NYW55KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiB0YWJsZSBpcyBiZWluZyB1c2VkIGluIHRoaXMgc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoVGFibGUgdGFibGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgYWxsIHVzZWQgdGFibGUgYWxpYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRUYWJsZUFsaWFzZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxpYXNlcyBvZiBhbGwgc2VsZWN0ZWQgY29sdW1ucyBhbmQgYWxsIHNlbGVjdGVkIGJ1ZmZlcnMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzZWxlY3RlZC4gRWFjaCBhbGlhcyBtYXkgYmUgZWl0aGVyIGEgc3RyaW5nCisgICAgICogb3IgYSB7QGxpbmsgU1FMQnVmZmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRTZWxlY3RBbGlhc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFsaWFzZXMgZm9yIGlkZW50aWZpZXIgY29sdW1ucyB0aGF0IGNhbiBiZSB1c2VkIGluIENPVU5UCisgICAgICogc2VsZWN0cyB0byBmaW5kIHRoZSBudW1iZXIgb2YgbWF0Y2hlcy4gRWFjaCBhbGlhcyB3aWxsIGJlIGEKKyAgICAgKiBzdHJpbmcuIElmIG5vIGlkZW50aWZpZXIgY29sdW1ucyBoYXZlIGJlZW4gbm9taW5hdGVkLCB0aGVuIGFsbAorICAgICAqIGNvbHVtbiBhbGlzZXMgYXJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldElkZW50aWZpZXJBbGlhc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9yZGVyaW5nIFNRTCBmb3IgdGhpcyBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIFNRTEJ1ZmZlciBnZXRPcmRlcmluZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBncm91cGluZyBTUUwgZm9yIHRoaXMgc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0R3JvdXBpbmcoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgV0hFUkUgY2xhdXNlLCBtaW51cyBhbnkgbmVjZXNzYXJ5IGVuZCBqb2lucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGdldFdoZXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEhBVklORyBjbGF1c2UsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIGdldEhhdmluZygpOworCisgICAgLyoqCisgICAgICogQXBwbHkgY2xhc3MgY29uZGl0aW9ucyBmcm9tIHJlbGF0aW9uIGpvaW5zLiAgVGhpcyBtYXkgYWZmZWN0IHRoZSByZXR1cm4KKyAgICAgKiB2YWx1ZXMgb2Yge0BsaW5rICNnZXRKb2luc30sIHtAbGluayAjZ2V0Sm9pbkl0ZXJhdG9yfSwgYW5kCisgICAgICoge0BsaW5rICNnZXRXaGVyZX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSm9pbkNsYXNzQ29uZGl0aW9ucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0b3AtbGV2ZWwgam9pbnMgZm9yIHRoaXMgc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBnZXRKb2lucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0b3AtbGV2ZWwge0BsaW5rIEpvaW59IGVsZW1lbnRzIGZvciB0aGlzIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Sm9pbkl0ZXJhdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzdWx0IHN0YXJ0IGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0SW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIFRoZSByZXN1bHQgZW5kIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEVuZEluZGV4KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc3VsdCByYW5nZSBmb3IgdGhpcyBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmFuZ2UobG9uZyBzdGFydCwgbG9uZyBlbmQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGlhcyBmb3IgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKENvbHVtbiBjb2wpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGlhcyBmb3IgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxpYXMgZm9yIHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhTdHJpbmcgY29sLCBUYWJsZSB0YWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoU3RyaW5nIGNvbCwgVGFibGUgdGFibGUsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYWdncmVnYXRlIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgZm9yIGFnZ3JlZ2F0ZSBzZWxlY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFnZ3JlZ2F0ZShib29sZWFuIGFnZyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlbGVjdCBpbmNsdWRlcyBhIExPQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYigpOworCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgZm9yIHNlbGVjdHMgdGhhdCBpbmNsdWRlIExPQiBjb2x1bW5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIGxvYik7CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgZXhpc3RpbmcgY29sdW1uIHNlbGVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTZWxlY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIFNRTCBhcyBhIHBsYWNlaG9sZGVyIGZvciBhIFVOSU9OIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0UGxhY2Vob2xkZXIoU3RyaW5nIHNxbCk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIFNRTDsgdGhlIGdpdmVuIGlkIG9iamVjdCBpcyBhbiBpZGVudGlmaWVyCisgICAgICogdG8gdXNlIHdoZW4gcmV0cmlldmluZyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGEge0BsaW5rIFJlc3VsdH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoU1FMQnVmZmVyIHNxbCwgT2JqZWN0IGlkKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgZ2l2ZW4gU1FMOyB0aGUgZ2l2ZW4gaWQgb2JqZWN0IGlzIGFuIGlkZW50aWZpZXIKKyAgICAgKiB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYSB7QGxpbmsgUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChTUUxCdWZmZXIgc3FsLCBPYmplY3QgaWQsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgZ2l2ZW4gU1FMOyB0aGUgZ2l2ZW4gaWQgb2JqZWN0IGlzIGFuIGlkZW50aWZpZXIKKyAgICAgKiB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYSB7QGxpbmsgUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChTdHJpbmcgc3FsLCBPYmplY3QgaWQpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBnaXZlbiBTUUw7IHRoZSBnaXZlbiBpZCBvYmplY3QgaXMgYW4gaWRlbnRpZmllcgorICAgICAqIHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhIHtAbGluayBSZXN1bHR9LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFN0cmluZyBzcWwsIE9iamVjdCBpZCwgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoQ29sdW1uIGNvbCk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChDb2x1bW4gY29sLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIGNvbHVtbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJpdCBzZXQgb2YgaW5kZXhlcyBvZiBjb2x1bW5zIHRoYXQgd2VyZSBzZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2VsZWN0KENvbHVtbltdIGNvbHMpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBnaXZlbiBjb2x1bW5zLgorICAgICAqCisgICAgICogQHJldHVybiBiaXQgc2V0IG9mIGluZGV4ZXMgb2YgY29sdW1ucyB0aGF0IHdlcmUgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdChDb2x1bW5bXSBjb2xzLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGNvbHVtbnMgb2YgdGhlIGdpdmVuIG1hcHBpbmcsIHBvc3NpYmx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGFkZGVkIGluCisgICAgICogY2FzZSB0aGUgZ2l2ZW4gbWFwcGluZyBiYXRjaGVzIG90aGVyIHNlbGVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0KENsYXNzTWFwcGluZyBtYXBwaW5nLCBpbnQgc3ViY2xhc3NlcywKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgZWFnZXIpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBtYXBwaW5nLCBwb3NzaWJseSBpbmNsdWRpbmcgc3ViY2xhc3Nlcy4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFsbCB3aGVyZSBjb25kaXRpb25zIGFyZSBhZGRlZCBpbgorICAgICAqIGNhc2UgdGhlIGdpdmVuIG1hcHBpbmcgYmF0Y2hlcyBvdGhlciBzZWxlY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdChDbGFzc01hcHBpbmcgbWFwcGluZywgaW50IHN1YmNsYXNzZXMsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyLAorICAgICAgICBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIGNvbHVtbiBhcyBvbmUgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgYSBjb3VudCBvZgorICAgICAqIGRpc3RpbmN0IG1hdGNoZXMuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGVzaWduYXRlIGRpc3RpbmN0IGlkZW50aWZpZXJzCisgICAgICogd2hlbiBlYWdlcmx5IHRyYXZlcnNpbmcgdGhlIGVudGlyZSByZXN1bHQgb2YgdGhlIHNlbGVjdCBvciB3aGVuCisgICAgICogbm90IHVzaW5nIGFuIExSU1NpemUgc2V0dGluZyBvZiA8Y29kZT5jb3VudDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RJZGVudGlmaWVyKENvbHVtbiBjb2wpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBnaXZlbiBjb2x1bW4gYXMgb25lIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgY291bnQgb2YKKyAgICAgKiBkaXN0aW5jdCBtYXRjaGVzLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlc2lnbmF0ZSBkaXN0aW5jdCBpZGVudGlmaWVycworICAgICAqIHdoZW4gZWFnZXJseSB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgcmVzdWx0IG9mIHRoZSBzZWxlY3Qgb3Igd2hlbgorICAgICAqIG5vdCB1c2luZyBhbiBMUlNTaXplIHNldHRpbmcgb2YgPGNvZGU+Y291bnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0SWRlbnRpZmllcihDb2x1bW4gY29sLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIGNvbHVtbnMgYXMgb25lcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBhIGNvdW50IG9mCisgICAgICogZGlzdGluY3QgbWF0Y2hlcy4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkZXNpZ25hdGUgZGlzdGluY3QgaWRlbnRpZmllcnMKKyAgICAgKiB3aGVuIGVhZ2VybHkgdHJhdmVyc2luZyB0aGUgZW50aXJlIHJlc3VsdCBvZiB0aGUgc2VsZWN0IG9yIHdoZW4KKyAgICAgKiBub3QgdXNpbmcgYW4gTFJTU2l6ZSBzZXR0aW5nIG9mIDxjb2RlPmNvdW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYml0IHNldCBvZiBpbmRleGVzIG9mIGNvbHVtbnMgdGhhdCB3ZXJlIHNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIGludCBzZWxlY3RJZGVudGlmaWVyKENvbHVtbltdIGNvbHMpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBnaXZlbiBjb2x1bW5zIGFzIG9uZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgYSBjb3VudCBvZgorICAgICAqIGRpc3RpbmN0IG1hdGNoZXMuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGVzaWduYXRlIGRpc3RpbmN0IGlkZW50aWZpZXJzCisgICAgICogd2hlbiBlYWdlcmx5IHRyYXZlcnNpbmcgdGhlIGVudGlyZSByZXN1bHQgb2YgdGhlIHNlbGVjdCBvciB3aGVuCisgICAgICogbm90IHVzaW5nIGFuIExSU1NpemUgc2V0dGluZyBvZiA8Y29kZT5jb3VudDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJpdCBzZXQgb2YgaW5kZXhlcyBvZiBjb2x1bW5zIHRoYXQgd2VyZSBzZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2VsZWN0SWRlbnRpZmllcihDb2x1bW5bXSBjb2xzLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGNvbHVtbnMgb2YgdGhlIGdpdmVuIG1hcHBpbmcsIHBvc3NpYmx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGFkZGVkIGluCisgICAgICogY2FzZSB0aGUgZ2l2ZW4gbWFwcGluZyBiYXRjaGVzIG90aGVyIHNlbGVjdHMuCisgICAgICogVGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb2YgdGhlIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgY291bnQgb2YKKyAgICAgKiBkaXN0aW5jdCBtYXRjaGVzLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlc2lnbmF0ZSBkaXN0aW5jdCBpZGVudGlmaWVycworICAgICAqIHdoZW4gZWFnZXJseSB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgcmVzdWx0IG9mIHRoZSBzZWxlY3Qgb3Igd2hlbgorICAgICAqIG5vdCB1c2luZyBhbiBMUlNTaXplIHNldHRpbmcgb2YgPGNvZGU+Y291bnQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdElkZW50aWZpZXIoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlcik7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGNvbHVtbnMgb2YgdGhlIGdpdmVuIG1hcHBpbmcsIHBvc3NpYmx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGFkZGVkIGluCisgICAgICogY2FzZSB0aGUgZ2l2ZW4gbWFwcGluZyBiYXRjaGVzIG90aGVyIHNlbGVjdHMuCisgICAgICogVGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb2YgdGhlIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgY291bnQgb2YKKyAgICAgKiBkaXN0aW5jdCBtYXRjaGVzLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlc2lnbmF0ZSBkaXN0aW5jdCBpZGVudGlmaWVycworICAgICAqIHdoZW4gZWFnZXJseSB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgcmVzdWx0IG9mIHRoZSBzZWxlY3Qgb3Igd2hlbgorICAgICAqIG5vdCB1c2luZyBhbiBMUlNTaXplIHNldHRpbmcgb2YgPGNvZGU+Y291bnQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdElkZW50aWZpZXIoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlciwKKyAgICAgICAgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBtYXBwaW5nLCBqb2luaW5nIHRvCisgICAgICogc3VwZXJjbGFzc2VzIGFzIG5lY2Vzc2FyeSB0byBnZXQgYWxsIGNvbHVtbnMgbmVlZGVkIHRvIGNvbnN0cnVjdAorICAgICAqIGFuIG9iamVjdCBpZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYml0IHNldCBvZiBpbmRleGVzIG9mIHBrIGNvbHVtbnMgdGhhdCB3ZXJlIHNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIGludCBzZWxlY3RQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gbWFwcGluZywgam9pbmluZyB0bworICAgICAqIHN1cGVyY2xhc3NlcyBhcyBuZWNlc3NhcnkgdG8gZ2V0IGFsbCBjb2x1bW5zIG5lZWRlZCB0byBjb25zdHJ1Y3QKKyAgICAgKiBhbiBvYmplY3QgaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJpdCBzZXQgb2YgaW5kZXhlcyBvZiBwayBjb2x1bW5zIHRoYXQgd2VyZSBzZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2VsZWN0UHJpbWFyeUtleShDbGFzc01hcHBpbmcgbWFwcGluZywgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogQ2xlYXIgb2RlcmluZyBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyT3JkZXJpbmcoKTsKKworICAgIC8qKgorICAgICAqIE9yZGVyIG9uIHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBtYXBwaW5nLAorICAgICAqIGpvaW5pbmcgdG8gc3VwZXJjbGFzc2VzIGFzIG5lY2Vzc2FyeSB0byBnZXQgYWxsIGNvbHVtbnMgbmVlZGVkIHRvCisgICAgICogY29uc3RydWN0IGFuIG9iamVjdCBpZC4KKyAgICAgKiBPcHRpb25hbGx5IHNlbGVjdHMgb3JkZXJpbmcgZGF0YSBpZiBub3QgYWxyZWFkeSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG9yZGVyQnlQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nLCBib29sZWFuIGFzYywKKyAgICAgICAgYm9vbGVhbiBzZWwpOworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuZCBvcmRlciBvbiB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gbWFwcGluZywKKyAgICAgKiBqb2luaW5nIHRvIHN1cGVyY2xhc3NlcyBhcyBuZWNlc3NhcnkgdG8gZ2V0IGFsbCBjb2x1bW5zIG5lZWRlZCB0bworICAgICAqIGNvbnN0cnVjdCBhbiBvYmplY3QgaWQuCisgICAgICogT3B0aW9uYWxseSBzZWxlY3RzIG9yZGVyaW5nIGRhdGEgaWYgbm90IGFscmVhZHkgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIGludCBvcmRlckJ5UHJpbWFyeUtleShDbGFzc01hcHBpbmcgbWFwcGluZywgYm9vbGVhbiBhc2MsCisgICAgICAgIEpvaW5zIGpvaW5zLCBib29sZWFuIHNlbCk7CisKKyAgICAvKioKKyAgICAgKiBPcmRlciBieSB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqIE9wdGlvbmFsbHkgc2VsZWN0cyBvcmRlcmluZyBkYXRhIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9yZGVyQnkoQ29sdW1uIGNvbCwgYm9vbGVhbiBhc2MsIGJvb2xlYW4gc2VsKTsKKworICAgIC8qKgorICAgICAqIE9yZGVyIGJ5IHRoZSBnaXZlbiBjb2x1bW4uCisgICAgICogT3B0aW9uYWxseSBzZWxlY3RzIG9yZGVyaW5nIGRhdGEgaWYgbm90IGFscmVhZHkgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShDb2x1bW4gY29sLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsCisgICAgICAgIGJvb2xlYW4gc2VsKTsKKworICAgIC8qKgorICAgICAqIE9yZGVyIGJ5IHRoZSBnaXZlbiBjb2x1bW5zLgorICAgICAqIE9wdGlvbmFsbHkgc2VsZWN0cyBvcmRlcmluZyBkYXRhIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgb3JkZXJCeShDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFzYywgYm9vbGVhbiBzZWwpOworCisgICAgLyoqCisgICAgICogT3JkZXIgYnkgdGhlIGdpdmVuIGNvbHVtbnMuCisgICAgICogT3B0aW9uYWxseSBzZWxlY3RzIG9yZGVyaW5nIGRhdGEgaWYgbm90IGFscmVhZHkgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIGludCBvcmRlckJ5KENvbHVtbltdIGNvbHMsIGJvb2xlYW4gYXNjLCBKb2lucyBqb2lucywgYm9vbGVhbiBzZWwpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIE9SREVSIEJZIGNsYXVzZS4KKyAgICAgKiBPcHRpb25hbGx5IHNlbGVjdHMgb3JkZXJpbmcgZGF0YSBpZiBub3QgYWxyZWFkeSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvcmRlckJ5KFNRTEJ1ZmZlciBzcWwsIGJvb2xlYW4gYXNjLCBib29sZWFuIHNlbCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gT1JERVIgQlkgY2xhdXNlLgorICAgICAqIE9wdGlvbmFsbHkgc2VsZWN0cyBvcmRlcmluZyBkYXRhIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9yZGVyQnkoU1FMQnVmZmVyIHNxbCwgYm9vbGVhbiBhc2MsIEpvaW5zIGpvaW5zLAorICAgICAgICBib29sZWFuIHNlbCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gT1JERVIgQlkgY2xhdXNlLgorICAgICAqIE9wdGlvbmFsbHkgc2VsZWN0cyBvcmRlcmluZyBkYXRhIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9yZGVyQnkoU3RyaW5nIHNxbCwgYm9vbGVhbiBhc2MsIGJvb2xlYW4gc2VsKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBPUkRFUiBCWSBjbGF1c2UuCisgICAgICogT3B0aW9uYWxseSBzZWxlY3RzIG9yZGVyaW5nIGRhdGEgaWYgbm90IGFscmVhZHkgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShTdHJpbmcgc3FsLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsKTsKKworICAgIC8qKgorICAgICAqIEFkZCB3aGVyZSBjb25kaXRpb25zIHNldHRpbmcgdGhlIG1hcHBpbmcncyBwcmltYXJ5IGtleSB0byB0aGUgZ2l2ZW4KKyAgICAgKiBvaWQgdmFsdWVzLiBJZiB0aGUgZ2l2ZW4gbWFwcGluZyBkb2VzIG5vdCB1c2Ugb2lkIHZhbHVlcyBmb3IgaXRzCisgICAgICogcHJpbWFyeSBrZXksIHdlIHdpbGwgcmVjdXJzaXZlbHkgam9pbiB0byBpdHMgc3VwZXJjbGFzcyB1bnRpbCB3ZSBmaW5kCisgICAgICogYW4gYW5jZXN0b3IgdGhhdCBkb2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlUHJpbWFyeUtleShPYmplY3Qgb2lkLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlKTsKKworICAgIC8qKgorICAgICAqIEFkZCB3aGVyZSBjb25kaXRpb25zIHNldHRpbmcgdGhlIGdpdmVuIGZvcmVpZ24ga2V5IHRvIHRoZSBnaXZlbgorICAgICAqIG9pZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAc2VlICN3aGVyZVByaW1hcnlLZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZUZvcmVpZ25LZXkoRm9yZWlnbktleSBmaywgT2JqZWN0IG9pZCwKKyAgICAgICAgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHdoZXJlIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2hlcmUoSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB3aGVyZSBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlKFNRTEJ1ZmZlciBzcWwpOworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB3aGVyZSBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdoZXJlKFNRTEJ1ZmZlciBzcWwsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gd2hlcmUgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZShTdHJpbmcgc3FsKTsKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gd2hlcmUgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aGVyZShTdHJpbmcgc3FsLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGhhdmluZyBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhdmluZyhTUUxCdWZmZXIgc3FsKTsKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gaGF2aW5nIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGF2aW5nKFNRTEJ1ZmZlciBzcWwsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gaGF2aW5nIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGF2aW5nKFN0cmluZyBzcWwpOworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBoYXZpbmcgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYXZpbmcoU3RyaW5nIHNxbCwgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogR3JvdXAgYnkgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KENvbHVtbiBjb2wpOworCisgICAgLyoqCisgICAgICogR3JvdXAgYnkgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KENvbHVtbiBjb2wsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIEdyb3VwIGJ5IHRoZSBnaXZlbiBjb2x1bW5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ29sdW1uW10gY29scyk7CisKKyAgICAvKioKKyAgICAgKiBHcm91cCBieSB0aGUgZ2l2ZW4gY29sdW1ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KENvbHVtbltdIGNvbHMsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIEdST1VQIEJZIGNsYXVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFNRTEJ1ZmZlciBzcWwpOworCisgICAgLyoqCisgICAgICogQWRkIGEgR1JPVVAgQlkgY2xhdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU1FMQnVmZmVyIHNxbCwgSm9pbnMgam9pbnMpOworCisgICAgLyoqCisgICAgICogQWRkIGEgR1JPVVAgQlkgY2xhdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU3RyaW5nIHNxbCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBHUk9VUCBCWSBjbGF1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTdHJpbmcgc3FsLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBHcm91cCBieSB0aGUgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gbWFwcGluZywgcG9zc2libHkgaW5jbHVkaW5nIHN1YmNsYXNzZXMuCisgICAgICogQXNzdW1lcyBFQUdFUl9OT05FLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLCBKREJDU3RvcmUgc3RvcmUsIAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKTsKKworICAgIC8qKgorICAgICAqIEdyb3VwIGJ5IHRoZSBjb2x1bW5zIG9mIHRoZSBnaXZlbiBtYXBwaW5nLCBwb3NzaWJseSBpbmNsdWRpbmcgc3ViY2xhc3Nlcy4KKyAgICAgKiBBc3N1bWVzIEVBR0VSX05PTkUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShDbGFzc01hcHBpbmcgbWFwcGluZywgaW50IHN1YmNsYXNzZXMsIEpEQkNTdG9yZSBzdG9yZSwgCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEpvaW5zIGpvaW5zKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFNFTEVDVCB3aXRoIHRoZSBzYW1lIGpvaW5zIGFuZCB3aGVyZSBjb25kaXRpb25zIGFzIHRoaXMgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbHMgbnVtYmVyIG9mIHNlbGVjdHMgdG8gVU5JT04gdG9nZXRoZXI7IGlnbm9yZWQgaWYgJmx0Oz0gMQorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciB3aGVyZUNsb25lKGludCBzZWxzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFNFTEVDVCB0aGF0IGlzIGEgY29tcGxldGUgY2xvbmUgb2YgdGhpcyBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VscyBudW1iZXIgb2Ygc2VsZWN0cyB0byBVTklPTiB0b2dldGhlcjsgaWdub3JlZCBpZiAmbHQ7PSAxCisgICAgICovCisgICAgcHVibGljIFNlbGVjdEV4ZWN1dG9yIGZ1bGxDbG9uZShpbnQgc2Vscyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzZWxlY3QgdGhhdCB3aWxsIGJlIGVhZ2VybHkgZXhlY3V0ZWQgd2l0aCB0aGlzIG9uZSwgb3IgbnVsbCBpZgorICAgICAqIHRoZQlzZWxlY3QgY2Fubm90IGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGpvaW4gdHlwZS4KKyAgICAgKiBJZiB0aGUgam9pbiB0eXBlIGlzIGlubmVyIG9yIG91dGVyLCB0aGVuIHRoaXMgc2VsZWN0IGluc3RhbmNlIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgc2VsZWN0IHdpbGwgaGF2ZSBhIGNsb25lIG9mIHRoaXMKKyAgICAgKiBzZWxlY3QncyB3aGVyZSBjb25kaXRpb25zIGFuZCBqb2lucyBidXQgd2lsbCBiZSBpbmRlcGVuZGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIGVhZ2VyIHNlbGVjdAorICAgICAqIEBwYXJhbSBlYWdlclR5cGUgb25lIG9mIHRoZSBFQUdFUl8qIGNvbnN0YW50cworICAgICAqIEBwYXJhbSB0b01hbnkgd2hldGhlciB0aGUgZWFnZXIgam9pbiBpcyB0by1tYW55CisgICAgICogQHBhcmFtIHNlbHMgbnVtYmVyIG9mIHNlbGVjdHMgdG8gVU5JT04gdG9nZXRoZXI7IGlnbm9yZWQgaWYgJmx0Oz0gMQorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciBlYWdlckNsb25lKEZpZWxkTWFwcGluZyBrZXksIGludCBlYWdlclR5cGUsCisgICAgICAgIGJvb2xlYW4gdG9NYW55LCBpbnQgc2Vscyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVhZ2VyIHNlbGVjdCBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0RXhlY3V0b3IgZ2V0RWFnZXIoRmllbGRNYXBwaW5nIGtleSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2UgdG8gdXNlIGZvciBqb2luaW5nLgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBuZXdKb2lucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIHRvIHVzZSBmb3Igb3V0ZXIgam9pbmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm9pbnMgbmV3T3V0ZXJKb2lucygpOworCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiBqb2lucyB0byB0aGUgZ2l2ZW4gYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTUUxCdWZmZXIgYnVmLCBKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBBTkQgdGhlIGdpdmVuIGpvaW5zIHRvZ2V0aGVyLiBUaGUgZ2l2ZW4gam9pbnMgd2lsbCBiZSBob2xsb3dlZCBpbiB0aGUKKyAgICAgKiBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBhbmQoSm9pbnMgam9pbnMxLCBKb2lucyBqb2luczIpOworCisgICAgLyoqCisgICAgICogT1IgdGhlIGdpdmVuIGpvaW5zIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGpvaW5zIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUKKyAgICAgKiBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBvcihKb2lucyBqb2luczEsIEpvaW5zIGpvaW5zMik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBqb2luIHNldCBtYWtpbmcgdGhlIGdpdmVuIGpvaW5zIG91dGVyIGpvaW5zLgorICAgICAqLworICAgIHB1YmxpYyBKb2lucyBvdXRlcihKb2lucyBqb2lucyk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdG9TdHJpbmcgdG8gZ2VuZXJhdGUgU1FMIHN0cmluZyBmb3IgcHJvZmlsaW5nL2RlYnVnZ2dpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU2VsZWN0RXhlY3V0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NlbGVjdEV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwYWRkOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NlbGVjdEV4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgY29uZmlndXJpbmcgYW5kIGV4ZWN1dGluZyBhIFNRTCBzZWxlY3QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBTZWxlY3RFeGVjdXRvciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlbGVjdCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBKREJDQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBzZWxlY3QgYXMgYSBTUUwgc3RhdGVtZW50IGZvcm1hdHRlZCBmb3IgdGhlIGN1cnJlbnQKKyAgICAgKiBkaWN0aW9uYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTUUxCdWZmZXIgdG9TZWxlY3QoYm9vbGVhbiBmb3JVcGRhdGUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgc2VsZWN0IGFzIGEgQ09VTlQgU1FMIHN0YXRlbWVudCBmb3JtYXR0ZWQgZm9yIHRoZSBjdXJyZW50CisgICAgICogZGljdGlvbmFyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMQnVmZmVyIHRvU2VsZWN0Q291bnQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBtYWtlIHJlc3VsdHMgZGlzdGluY3Qgd2hlbiByZWxhdGlvbmFsIGpvaW5zCisgICAgICogd291bGQgb3RoZXJ3aXNlIGludHJvZHVjZSBkdXBsaWNhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEF1dG9EaXN0aW5jdCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IG1ha2UgcmVzdWx0cyBkaXN0aW5jdCB3aGVuIHJlbGF0aW9uYWwgam9pbnMKKyAgICAgKiB3b3VsZCBvdGhlcndpc2UgaW50cm9kdWNlIGR1cGxpY2F0ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0Rpc3RpbmN0KGJvb2xlYW4gZGlzdGluY3QpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGlzIGEgU0VMRUNUIERJU1RJTkNUIC8gVU5JT04gQUxMLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlzdGluY3QoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhIFNFTEVDVCBESVNUSU5DVCAvIFVOSU9OIEFMTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0aW5jdChib29sZWFuIGRpc3RpbmN0KTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHJlc3VsdCBvZiB0aGlzIHNlbGVjdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGxhcmdlCisgICAgICogcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xSUygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcmVzdWx0IG9mIHRoaXMgc2VsZWN0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbGFyZ2UKKyAgICAgKiByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExSUyhib29sZWFuIGxycyk7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGV4cGVjdGVkIHJlc3VsdCBjb3VudCBmb3IgdGhlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXhwZWN0ZWRSZXN1bHRDb3VudCgpOworCisgICAgLyoqCisgICAgICogVGhlIGV4cGVjdGVkIHJlc3VsdCBjb3VudCBmb3IgdGhlIHF1ZXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGZvcmNlIGlmIGZhbHNlLCB0aGUgY291bnQgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhpcyBzZWxlY3QgaGFzCisgICAgICogYW55IHRvLW1hbnkgZWFnZXIgam9pbnMgdGhhdCB3b3VsZCB0aHJvdyBvZmYgdGhlIHJlc3VsdCBjb3VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkUmVzdWx0Q291bnQoaW50IGV4cGVjdGVkUmVzdWx0Q291bnQsIGJvb2xlYW4gZm9yY2UpOworCisgICAgLyoqCisgICAgICogVGhlIGpvaW4gc3ludGF4IGZvciB0aGlzIHNlbGVjdCwgYXMgb25lIG9mIHRoZSBzeW50YXggY29uc3RhbnRzIGZyb20KKyAgICAgKiB7QGxpbmsgSm9pblN5bnRheGVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpvaW5TeW50YXgoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBqb2luIHN5bnRheCBmb3IgdGhpcyBzZWxlY3QsIGFzIG9uZSBvZiB0aGUgc3ludGF4IGNvbnN0YW50cyBmcm9tCisgICAgICoge0BsaW5rIEpvaW5TeW50YXhlc30uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pblN5bnRheChpbnQgam9pblN5bnRheCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIHNlbGVjdCBjYW4gc3VwcG9ydCBhIHJhbmRvbSBhY2Nlc3MgcmVzdWx0IHNldCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzKGJvb2xlYW4gZm9yVXBkYXRlKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBzZWxlY3QgY2FuIGJlIGV4ZWN1dGVkIGZvciB1cGRhdGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMb2NraW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgbWF0Y2hpbmcgdGhpcyBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb3VudChKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoaXMgc2VsZWN0IGluIHRoZSBjb250ZXh0IG9mIHRoZSBnaXZlbiBzdG9yZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBSZXN1bHQgZXhlY3V0ZShKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoaXMgc2VsZWN0IGluIHRoZSBjb250ZXh0IG9mIHRoZSBnaXZlbiBzdG9yZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBSZXN1bHQgZXhlY3V0ZShKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIGludCBsb2NrTGV2ZWwpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TZWxlY3RJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TZWxlY3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNmFiYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NlbGVjdEltcGwuamF2YQpAQCAtMCwwICsxLDI4NzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuRWFnZXJGZXRjaE1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDTG9ja01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuSkRCQ1N0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkZpZWxkTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkFwcGxpY2F0aW9uSWRzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIFN0YW5kYXJkIHtAbGluayBTZWxlY3R9IGltcGxlbWVudGF0aW9uLiBVc2FnZSBub3RlOiB0aG91Z2ggdGhpcyBjbGFzcworICogaW1wbGVtZW50cyB7QGxpbmsgSm9pbnN9LCBpdCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGpvaW5pbmcgZGlyZWN0bHkuCisgKiBJbnN0ZWFkLCB1c2UgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgI25ld0pvaW5zfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU2VsZWN0SW1wbAorICAgIGltcGxlbWVudHMgU2VsZWN0LCBQYXRoSm9pbnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkFVVE9fRElTVElOQ1QgPSAyIDw8IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1RJTkNUID0gMiA8PCAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfRElTVElOQ1QgPSAyIDw8IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNUExJQ0lUX0RJU1RJTkNUID0gMiA8PCAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT19NQU5ZID0gMiA8PCA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBR0dSRUdBVEUgPSAyIDw8IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQiA9IDIgPDwgNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1VURVIgPSAyIDw8IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExSUyA9IDIgPDwgODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUFHRVJfVE9fT05FID0gMiA8PCA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFQUdFUl9UT19NQU5ZID0gMiA8PCAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDT1JEX09SREVSRUQgPSAyIDw8IDExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUk9VUElORyA9IDIgPDwgMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUkNFX0NPVU5UID0gMiA8PCAxMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX0FMSUFTRVMgPSBuZXcgU3RyaW5nWzE2XTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUkRFUl9BTElBU0VTID0gbmV3IFN0cmluZ1sxNl07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gTlVMTF9JRFMgPSBuZXcgT2JqZWN0WzE2XTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBQTEFDRUhPTERFUlMgPSBuZXcgT2JqZWN0WzUwXTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoU2VsZWN0LmNsYXNzKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEFCTEVfQUxJQVNFUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIFRBQkxFX0FMSUFTRVNbaV0gPSAidCIgKyBpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SREVSX0FMSUFTRVMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBPUkRFUl9BTElBU0VTW2ldID0gIm8iICsgaTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVUxMX0lEUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIE5VTExfSURTW2ldID0gbmV3IE51bGxJZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBMQUNFSE9MREVSUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIFBMQUNFSE9MREVSU1tpXSA9IG5ldyBQbGFjZWhvbGRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSkRCQ0NvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBmaW5hbCBEQkRpY3Rpb25hcnkgX2RpY3Q7CisKKyAgICAvLyBtYXAgb2YgdmFyaWFibGUgKyByZWxhdGlvbiBwYXRoICsgdGFibGUga2V5cyB0byB0aGUgY29ycmVjdCBhbGlhcyBpbmRleDoKKyAgICAvLyBlYWNoIHJlbGF0aW9uIHBhdGgvdGFibGUgY29tYmluYXRpb24gc2hvdWxkIGhhdmUgYSB1bmlxdWUgYWxpYXMgYmVjYXVzZQorICAgIC8vIGl0IHJlcHJlc2VudHMgYSBzZXBhcmF0ZSBvYmplY3Q7IGZvciBleGFtcGxlLCBpZiBhIFBlcnNvbiBjbGFzcyBoYXMgYQorICAgIC8vICdwYXJlbnQnIGZpZWxkIHJlcHJlc2VudGluZyBhbm90aGVyIFBlcnNvbiBhbmQgYWxzbyBoYXMgYW4gJ2FkZHJlc3MnCisgICAgLy8gZmllbGQgb2YgdHlwZSBBZGRyZXNzOgorICAgIC8vICdhZGRyZXNzLnN0cmVldCcgc2hvdWxkIG1hcCB0byBhIGRpZmZlcmVudCB0YWJsZSBhbGlhcyB0aGFuCisgICAgLy8gJ3BhcmVudC5hZGRyZXNzLnN0cmVldCcgZm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wYXJpc29ucworICAgIHByaXZhdGUgTWFwIF9hbGlhc2VzID0gbnVsbDsKKworICAgIC8vIG1hcCBvZiBpbmRleGVzIHRvIHRhYmxlIGFsaWFzZXMgbGlrZSAnVEFCTEVOQU1FIHQwJworICAgIHByaXZhdGUgU29ydGVkTWFwIF90YWJsZXMgPSBudWxsOworCisgICAgLy8gY29tYmluZWQgbGlzdCBvZiBzZWxlY3RlZCBpZHMgYW5kIG1hcCBvZiBlYWNoIGlkIHRvIGl0cyBhbGlhcworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0cyBfc2VsZWN0cyA9IG5ldyBTZWxlY3RzKCk7CisgICAgcHJpdmF0ZSBMaXN0IF9vcmRlcmVkID0gbnVsbDsKKworICAgIC8vIGZsYWdzCisgICAgcHJpdmF0ZSBpbnQgX2ZsYWdzID0gMDsKKyAgICBwcml2YXRlIGludCBfam9pblN5bnRheCA9IDA7CisgICAgcHJpdmF0ZSBsb25nIF9zdGFydElkeCA9IDA7CisgICAgcHJpdmF0ZSBsb25nIF9lbmRJZHggPSBMb25nLk1BWF9WQUxVRTsKKyAgICBwcml2YXRlIGludCBfbnVsbElkcyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgX29yZGVycyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgX3BsYWNlaG9sZGVycyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgX2V4cGVjdGVkUmVzdWx0Q291bnQgPSAwOworCisgICAgLy8gcXVlcnkgY2xhdXNlcworICAgIHByaXZhdGUgU1FMQnVmZmVyIF9vcmRlcmluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTUUxCdWZmZXIgX3doZXJlID0gbnVsbDsKKyAgICBwcml2YXRlIFNRTEJ1ZmZlciBfZ3JvdXBpbmcgPSBudWxsOworICAgIHByaXZhdGUgU1FMQnVmZmVyIF9oYXZpbmcgPSBudWxsOworCisgICAgLy8gam9pbnMgdG8gYWRkIHRvIHRoZSBlbmQgb2Ygb3VyIHdoZXJlIGNsYXVzZSwgYW5kIGpvaW5zIHRvIHByZXBlbmQgdG8KKyAgICAvLyBhbGwgc2VsZWN0cyAoc2VlIHNlbGVjdChjbGFzc21hcHBpbmcpIG1ldGhvZCkKKyAgICBwcml2YXRlIFNlbGVjdEpvaW5zIF9qb2lucyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdGFjayBfcHJlSm9pbnMgPSBudWxsOworCisgICAgLy8gbWFwIG9mIGpvaW5zK2tleXMgdG8gZWFnZXIgc2VsZWN0cyBhbmQgZ2xvYmFsIHNldCBvZiBlYWdlciBrZXlzOyB0aGUKKyAgICAvLyBzYW1lIGtleSBjYW4ndCBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlCisgICAgcHJpdmF0ZSBNYXAgX2VhZ2VyID0gbnVsbDsKKyAgICBwcml2YXRlIFNldCBfZWFnZXJLZXlzID0gbnVsbDsKKworICAgIC8vIHN1YnNlbGVjdCBzdXBwb3J0CisgICAgcHJpdmF0ZSBMaXN0IF9zdWJzZWxzID0gbnVsbDsKKyAgICBwcml2YXRlIFNlbGVjdEltcGwgX3BhcmVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3N1YlBhdGggPSBudWxsOworCisgICAgLy8gZnJvbSBzZWxlY3QgaWYgdGhpcyBzZWxlY3Qgc2VsZWN0cyBmcm9tIGEgdG1wIHRhYmxlIGNyZWF0ZWQgYnkgYW5vdGhlcgorICAgIHByaXZhdGUgU2VsZWN0SW1wbCBfZnJvbSA9IG51bGw7CisgICAgcHJpdmF0ZSBTZWxlY3RJbXBsIF9vdXRlciA9IG51bGw7CisgICAgIAorICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0dXJuIHRoZSBwcm9wZXIgdGFibGUgYWxpYXMgZm9yIHRoZSBnaXZlbiBhbGlhcyBpbmRleC4KKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHRvQWxpYXMoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoaW5kZXggPCBUQUJMRV9BTElBU0VTLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBUQUJMRV9BTElBU0VTW2luZGV4XTsKKyAgICAgICAgcmV0dXJuICJ0IiArIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0dXJuIHRoZSBwcm9wZXIgb3JkZXIgYWxpYXMgZm9yIHRoZSBnaXZlbiBvcmRlcgorICAgICAqIGNvbHVtbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b09yZGVyQWxpYXMoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoaW5kZXggPCBPUkRFUl9BTElBU0VTLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBPUkRFUl9BTElBU0VTW2luZGV4XTsKKyAgICAgICAgcmV0dXJuICJvIiArIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0SW1wbChKREJDQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gY29uZjsKKyAgICAgICAgX2RpY3QgPSBfY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworICAgICAgICBfam9pblN5bnRheCA9IF9kaWN0LmpvaW5TeW50YXg7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2VsZWN0RXhlY3V0b3IgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBKREJDQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2NvbmY7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciB0b1NlbGVjdChib29sZWFuIGZvclVwZGF0ZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICByZXR1cm4gX2RpY3QudG9TZWxlY3QodGhpcywgZm9yVXBkYXRlLCBmZXRjaCk7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciB0b1NlbGVjdENvdW50KCkgeworICAgICAgICByZXR1cm4gX2RpY3QudG9TZWxlY3RDb3VudCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvRGlzdGluY3QoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgTk9OQVVUT19ESVNUSU5DVCkgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGlzdGluY3QoYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgICAgIF9mbGFncyAmPSB+Tk9OQVVUT19ESVNUSU5DVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2ZsYWdzIHw9IE5PTkFVVE9fRElTVElOQ1Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXN0aW5jdCgpIHsKKyAgICAgICAgcmV0dXJuIChfZmxhZ3MgJiBOT1RfRElTVElOQ1QpID09IDAgJiYgKChfZmxhZ3MgJiBESVNUSU5DVCkgIT0gMAorICAgICAgICAgICAgfHwgKChfZmxhZ3MgJiBOT05BVVRPX0RJU1RJTkNUKSA9PSAwCisgICAgICAgICAgICAmJiAoX2ZsYWdzICYgSU1QTElDSVRfRElTVElOQ1QpICE9IDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0aW5jdChib29sZWFuIGRpc3RpbmN0KSB7CisgICAgICAgIC8vIG5lZWQgdHdvIGZsYWdzIGluIGNhc2Ugc2V0IG5vdF9kaXN0aW5jdCwgdGhlbiBhIHRvLW1hbnkgam9pbiBoYXBwZW5zCisgICAgICAgIC8vIGFuZCBkaXN0aW5jdCBmbGFnIGdldHMgc2V0IGF1dG9tYXRpY2FsbHkKKyAgICAgICAgaWYgKGRpc3RpbmN0KSB7CisgICAgICAgICAgICBfZmxhZ3MgfD0gRElTVElOQ1Q7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfk5PVF9ESVNUSU5DVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9mbGFncyB8PSBOT1RfRElTVElOQ1Q7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkRJU1RJTkNUOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMUlMoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgTFJTKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExSUyhib29sZWFuIGxycykgeworICAgICAgICBpZiAobHJzKQorICAgICAgICAgICAgX2ZsYWdzIHw9IExSUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2ZsYWdzICY9IH5MUlM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRFeHBlY3RlZFJlc3VsdENvdW50KCkgeworICAgICAgICAvLyBpZiB0aGUgY291bnQgaXNuJ3QgZm9yY2VkIGFuZCB3ZSBoYXZlIHRvLW1hbnkgZWFnZXIgam9pbnMgdGhhdCBjb3VsZAorICAgICAgICAvLyB0aHJvdyB0aGUgY291bnQgb2ZmLCBkb24ndCBwYXkgYXR0ZW50aW9uIHRvIGl0CisgICAgICAgIGlmICgoX2ZsYWdzICYgRk9SQ0VfQ09VTlQpID09IDAgJiYgaGFzRWFnZXJKb2luKHRydWUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBfZXhwZWN0ZWRSZXN1bHRDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFJlc3VsdENvdW50KGludCBleHBlY3RlZFJlc3VsdENvdW50LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIF9leHBlY3RlZFJlc3VsdENvdW50ID0gZXhwZWN0ZWRSZXN1bHRDb3VudDsKKyAgICAgICAgaWYgKGZvcmNlKQorICAgICAgICAgICAgX2ZsYWdzIHw9IEZPUkNFX0NPVU5UOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgX2ZsYWdzICY9IH5GT1JDRV9DT1VOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEpvaW5TeW50YXgoKSB7CisgICAgICAgIHJldHVybiBfam9pblN5bnRheDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2luU3ludGF4KGludCBqb2luU3ludGF4KSB7CisgICAgICAgIF9qb2luU3ludGF4ID0gam9pblN5bnRheDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2Vzcyhib29sZWFuIGZvclVwZGF0ZSkgeworICAgICAgICByZXR1cm4gX2RpY3Quc3VwcG9ydHNSYW5kb21BY2Nlc3NSZXN1bHRTZXQodGhpcywgZm9yVXBkYXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xvY2tpbmcoKSB7CisgICAgICAgIHJldHVybiBfZGljdC5zdXBwb3J0c0xvY2tpbmcodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb3VudChKREJDU3RvcmUgc3RvcmUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTUUxCdWZmZXIgc3FsID0gdG9TZWxlY3RDb3VudCgpOworICAgICAgICAgICAgY29ubiA9IHN0b3JlLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHN0bW50ID0gc3FsLnByZXBhcmVTdGF0ZW1lbnQoY29ubik7CisgICAgICAgICAgICBycyA9IHN0bW50LmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgcnMubmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIHJzLmdldEludCgxKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHJzLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkge30KKyAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsgY29ubi5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHt9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0IGV4ZWN1dGUoSkRCQ1N0b3JlIHN0b3JlLCBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZldGNoID09IG51bGwpCisgICAgICAgICAgICBmZXRjaCA9IHN0b3JlLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICByZXR1cm4gZXhlY3V0ZShzdG9yZS5nZXRDb250ZXh0KCksIHN0b3JlLCBmZXRjaCwKKyAgICAgICAgICAgIGZldGNoLmdldFJlYWRMb2NrTGV2ZWwoKSk7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdCBleGVjdXRlKEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgaW50IGxvY2tMZXZlbCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmZXRjaCA9PSBudWxsKQorICAgICAgICAgICAgZmV0Y2ggPSBzdG9yZS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGUoc3RvcmUuZ2V0Q29udGV4dCgpLCBzdG9yZSwgZmV0Y2gsIGxvY2tMZXZlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIHNlbGVjdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2l2ZW4gc3RvcmUgbWFuYWdlci4gVGhlCisgICAgICogY29udGV4dCBpcyBwYXNzZWQgaW4gc2VwYXJhdGVseSBmb3IgcHJvZmlsaW5nIHB1cnBvc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXN1bHQgZXhlY3V0ZShTdG9yZUNvbnRleHQgY3R4LCBKREJDU3RvcmUgc3RvcmUsIAorICAgICAgICBKREJDRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBmb3JVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFpc0FnZ3JlZ2F0ZSgpICYmIF9ncm91cGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBKREJDTG9ja01hbmFnZXIgbG0gPSBzdG9yZS5nZXRMb2NrTWFuYWdlcigpOworICAgICAgICAgICAgaWYgKGxtICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm9yVXBkYXRlID0gbG0uc2VsZWN0Rm9yVXBkYXRlKHRoaXMsIGxvY2tMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBTUUxCdWZmZXIgc3FsID0gdG9TZWxlY3QoZm9yVXBkYXRlLCBmZXRjaCk7CisgICAgICAgIGludCByc1R5cGUgPSAoaXNMUlMoKSAmJiBzdXBwb3J0c1JhbmRvbUFjY2Vzcyhmb3JVcGRhdGUpKQorICAgICAgICAgICAgPyAtMSA6IFJlc3VsdFNldC5UWVBFX0ZPUldBUkRfT05MWTsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gc3RvcmUuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNMUlMoKSkKKyAgICAgICAgICAgICAgICBzdG1udCA9IHNxbC5wcmVwYXJlU3RhdGVtZW50KGNvbm4sIGZldGNoLCByc1R5cGUsIC0xKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdG1udCA9IHNxbC5wcmVwYXJlU3RhdGVtZW50KGNvbm4sIHJzVHlwZSwgLTEpOworCisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbG9ja2luZyBzZWxlY3QgYW5kIHRoZSBsb2NrIHRpbWVvdXQgaXMgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAvLyB0aGUgY29uZmlndXJlZCBxdWVyeSB0aW1lb3V0LCB1c2UgdGhlIGxvY2sgdGltZW91dAorICAgICAgICAgICAgaWYgKGZvclVwZGF0ZSAmJiBfZGljdC5zdXBwb3J0c1F1ZXJ5VGltZW91dCAmJiBmZXRjaCAhPSBudWxsIAorICAgICAgICAgICAgICAgICYmIGZldGNoLmdldExvY2tUaW1lb3V0KCkgPiBzdG1udC5nZXRRdWVyeVRpbWVvdXQoKSAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICBpbnQgdGltZW91dCA9IGZldGNoLmdldExvY2tUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPCAxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAxMDAwOyAKKyAgICAgICAgICAgICAgICAgICAgTG9nIGxvZyA9IF9jb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfSkRCQyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoIm1pbGxpcy1xdWVyeS10aW1lb3V0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG1udC5zZXRRdWVyeVRpbWVvdXQoZmV0Y2guZ2V0TG9ja1RpbWVvdXQoKSAvIDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnMgPSBzdG1udC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZW1lbnQKKyAgICAgICAgICAgIGlmIChzdG1udCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IHN0bW50LmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZTIpIHt9CisgICAgICAgICAgICB0cnkgeyBjb25uLmNsb3NlKCk7IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZTIpIHt9CisgICAgICAgICAgICB0aHJvdyBzZTsKKyAgICAgICAgfQorCisgICAgICAgIFNlbGVjdFJlc3VsdCByZXMgPSBuZXcgU2VsZWN0UmVzdWx0KGNvbm4sIHN0bW50LCBycywgX2RpY3QpOworICAgICAgICByZXMuc2V0U2VsZWN0KHRoaXMpOworICAgICAgICByZXMuc2V0U3RvcmUoc3RvcmUpOworICAgICAgICByZXMuc2V0TG9ja2luZyhmb3JVcGRhdGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRkRWFnZXJSZXN1bHRzKHJlcywgdGhpcywgc3RvcmUsIGZldGNoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICByZXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBvdXIgZWFnZXIgc2VsZWN0cywgYWRkaW5nIHRoZSByZXN1bHRzIHVuZGVyIHRoZSBzYW1lIGtleXMKKyAgICAgKiB0byB0aGUgZ2l2ZW4gcmVzdWx0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRWFnZXJSZXN1bHRzKFNlbGVjdFJlc3VsdCByZXMsIFNlbGVjdEltcGwgc2VsLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoc2VsLl9lYWdlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGV4ZWN1dGUgZWFnZXIgc2VsZWN0cworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIFJlc3VsdCBlcmVzOworICAgICAgICBNYXAgZWFnZXI7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gc2VsLl9lYWdlci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisKKyAgICAgICAgICAgIC8vIHNpbXVsYXRlZCBiYXRjaGVkIHNlbGVjdHMgZm9yIGlubmVyL291dGVyIGpvaW5zOyBmb3Igc2VwYXJhdGUKKyAgICAgICAgICAgIC8vIHNlbGVjdHMsIGRvbid0IHBhc3Mgb24gbG9jayBsZXZlbCwgYmVjYXVzZSB0aGV5J3JlIHByb2JhYmx5CisgICAgICAgICAgICAvLyBmb3IgcmVsYXRpb25zIGFuZCB0aGVyZWZvcmUgc2hvdWxkIHVzZSBkZWZhdWx0IGxldmVsCisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSA9PSBzZWwpCisgICAgICAgICAgICAgICAgZXJlcyA9IHJlczsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcmVzID0gKChTZWxlY3RFeGVjdXRvcikgZW50cnkuZ2V0VmFsdWUoKSkuZXhlY3V0ZShzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2gpOworCisgICAgICAgICAgICBlYWdlciA9IHJlcy5nZXRFYWdlck1hcChmYWxzZSk7CisgICAgICAgICAgICBpZiAoZWFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVhZ2VyID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICByZXMuc2V0RWFnZXJNYXAoZWFnZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWFnZXIucHV0KGVudHJ5LmdldEtleSgpLCBlcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTZWxlY3QgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgaW50IGluZGV4T2YoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFN1YnNlbGVjdHMoKSB7CisgICAgICAgIHJldHVybiAoX3N1YnNlbHMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX3N1YnNlbHM7CisgICAgfQorCisgICAgcHVibGljIFNlbGVjdCBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBfcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic2VsZWN0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdWJQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChTZWxlY3QgcGFyZW50LCBTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAocGF0aCAhPSBudWxsKQorICAgICAgICAgICAgX3N1YlBhdGggPSBwYXRoICsgJzonOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfc3ViUGF0aCA9IG51bGw7CisKKyAgICAgICAgaWYgKHBhcmVudCA9PSBfcGFyZW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoX3BhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgX3BhcmVudC5fc3Vic2Vscy5yZW1vdmUodGhpcyk7CisKKyAgICAgICAgLy8jIyMgcmlnaHQgbm93IHdlIGNhbid0IHVzZSBzcWw5MiBqb2lucyB3aXRoIHN1YnNlbGVjdHMsIGNhdXNlCisgICAgICAgIC8vIyMjIEkgY2FuJ3QgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdoZW4gdGhlIHN1YnNlbGVjdCBoYXMgYSBqb2luCisgICAgICAgIC8vIyMjIHdpdGggYW4gYWxpYXMgYWxzbyBwcmVzZW50IGluIHRoZSBvdXRlciBzZWxlY3QuLi4geW91IGRvbid0IHdhbnQKKyAgICAgICAgLy8jIyMgdGhlIGpvaW4gdG8gYXBwZWFyIGluIHRoZSBGUk9NIGNsYXVzZSBvZiB0aGUgc3Vic2VsZWN0IGNhdXNlCisgICAgICAgIC8vIyMjIHRoZW4gaXQgcmUtYWxpYXNlcyBib3RoIHRhYmxlcyBpbiB0aGUgc2NvcGUgb2YgdGhlIHN1YnNlbGVjdAorICAgICAgICAvLyMjIyBhbmQgdGhlIGNvcnJlbGF0aW9uIHdpdGggdGhlIG91dGVyIHNlbGVjdCBpcyBsb3N0CisgICAgICAgIF9wYXJlbnQgPSAoU2VsZWN0SW1wbCkgcGFyZW50OworICAgICAgICBpZiAoX3BhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX3BhcmVudC5fc3Vic2VscyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9wYXJlbnQuX3N1YnNlbHMgPSBuZXcgQXJyYXlMaXN0KDIpOworICAgICAgICAgICAgX3BhcmVudC5fc3Vic2Vscy5hZGQodGhpcyk7CisgICAgICAgICAgICBpZiAoX3BhcmVudC5fam9pblN5bnRheCA9PSBKb2luU3ludGF4ZXMuU1lOVEFYX1NRTDkyKQorICAgICAgICAgICAgICAgIF9qb2luU3ludGF4ID0gSm9pblN5bnRheGVzLlNZTlRBWF9UUkFESVRJT05BTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfam9pblN5bnRheCA9IF9wYXJlbnQuX2pvaW5TeW50YXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2VsZWN0IGdldEZyb21TZWxlY3QoKSB7CisgICAgICAgIHJldHVybiBfZnJvbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tU2VsZWN0KFNlbGVjdCBzZWwpIHsKKyAgICAgICAgX2Zyb20gPSAoU2VsZWN0SW1wbCkgc2VsOworICAgICAgICBpZiAoX2Zyb20gIT0gbnVsbCkKKyAgICAgICAgICAgIF9mcm9tLl9vdXRlciA9IHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzRWFnZXJKb2luKGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgIGlmICh0b01hbnkpCisgICAgICAgICAgICByZXR1cm4gKF9mbGFncyAmIEVBR0VSX1RPX01BTlkpICE9IDA7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRUFHRVJfVE9fT05FKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0pvaW4oYm9vbGVhbiB0b01hbnkpIHsKKyAgICAgICAgaWYgKHRvTWFueSkKKyAgICAgICAgICAgIHJldHVybiAoX2ZsYWdzICYgVE9fTUFOWSkgIT0gMDsKKyAgICAgICAgcmV0dXJuIF90YWJsZXMgIT0gbnVsbCAmJiBfdGFibGVzLnNpemUoKSA+IDE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChUYWJsZSB0YWJsZSkgeworICAgICAgICBQYXRoSm9pbnMgcGogPSBnZXRKb2lucyhudWxsLCBmYWxzZSk7CisgICAgICAgIGlmIChfZnJvbSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9mcm9tLmdldFRhYmxlSW5kZXgodGFibGUsIHBqLCBmYWxzZSkgIT0gLTE7CisgICAgICAgIHJldHVybiBnZXRUYWJsZUluZGV4KHRhYmxlLCBwaiwgZmFsc2UpICE9IC0xOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFRhYmxlQWxpYXNlcygpIHsKKyAgICAgICAgcmV0dXJuIChfdGFibGVzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogX3RhYmxlcy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRTZWxlY3RBbGlhc2VzKCkgeworICAgICAgICByZXR1cm4gX3NlbGVjdHMuZ2V0QWxpYXNlcyhmYWxzZSwgX291dGVyICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldElkZW50aWZpZXJBbGlhc2VzKCkgeworICAgICAgICByZXR1cm4gX3NlbGVjdHMuZ2V0QWxpYXNlcyh0cnVlLCBfb3V0ZXIgIT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciBnZXRPcmRlcmluZygpIHsKKyAgICAgICAgcmV0dXJuIF9vcmRlcmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMQnVmZmVyIGdldEdyb3VwaW5nKCkgeworICAgICAgICByZXR1cm4gX2dyb3VwaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTUUxCdWZmZXIgZ2V0V2hlcmUoKSB7CisgICAgICAgIHJldHVybiBfd2hlcmU7CisgICAgfQorCisgICAgcHVibGljIFNRTEJ1ZmZlciBnZXRIYXZpbmcoKSB7CisgICAgICAgIHJldHVybiBfaGF2aW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEpvaW5DbGFzc0NvbmRpdGlvbnMoKSB7CisgICAgICAgIGlmIChfam9pbnMgPT0gbnVsbCB8fCBfam9pbnMuam9pbnMoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGpvaW4gc2V0IGl0ZXJhdG9yIGFsbG93cyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgorICAgICAgICBKb2luIGo7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2pvaW5zLmpvaW5zKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGogPSAoSm9pbikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChqLmdldFJlbGF0aW9uVGFyZ2V0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGouZ2V0UmVsYXRpb25UYXJnZXQoKS5nZXREaXNjcmltaW5hdG9yKCkuYWRkQ2xhc3NDb25kaXRpb25zCisgICAgICAgICAgICAgICAgICAgICh0aGlzLCBqLmdldFN1YmNsYXNzZXMoKSA9PSBTVUJTX0pPSU5BQkxFLCAKKyAgICAgICAgICAgICAgICAgICAgai5nZXRSZWxhdGlvbkpvaW5zKCkpOworICAgICAgICAgICAgICAgIGouc2V0UmVsYXRpb24obnVsbCwgMCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgZ2V0Sm9pbnMoKSB7CisgICAgICAgIHJldHVybiBfam9pbnM7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldEpvaW5JdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKF9qb2lucyA9PSBudWxsIHx8IF9qb2lucy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRW1wdHlJdGVyYXRvci5JTlNUQU5DRTsKKyAgICAgICAgcmV0dXJuIF9qb2lucy5qb2lucygpLmpvaW5JdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfc3RhcnRJZHg7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RW5kSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfZW5kSWR4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJhbmdlKGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIF9zdGFydElkeCA9IHN0YXJ0OworICAgICAgICBfZW5kSWR4ID0gZW5kOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoQ29sdW1uIGNvbCkgeworICAgICAgICByZXR1cm4gZ2V0Q29sdW1uQWxpYXMoY29sLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbHVtbkFsaWFzKGNvbCwgZ2V0Sm9pbnMoam9pbnMsIGZhbHNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGlhcyBmb3IgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhDb2x1bW4gY29sLCBQYXRoSm9pbnMgcGopIHsKKyAgICAgICAgcmV0dXJuIGdldENvbHVtbkFsaWFzKGNvbC5nZXROYW1lKCksIGNvbC5nZXRUYWJsZSgpLCBwaik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhTdHJpbmcgY29sLCBUYWJsZSB0YWJsZSkgeworICAgICAgICByZXR1cm4gZ2V0Q29sdW1uQWxpYXMoY29sLCB0YWJsZSwgKEpvaW5zKSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbkFsaWFzKFN0cmluZyBjb2wsIFRhYmxlIHRhYmxlLCBKb2lucyBqb2lucykgeworICAgICAgICByZXR1cm4gZ2V0Q29sdW1uQWxpYXMoY29sLCB0YWJsZSwgZ2V0Sm9pbnMoam9pbnMsIGZhbHNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGlhcyBmb3IgdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDb2x1bW5BbGlhcyhTdHJpbmcgY29sLCBUYWJsZSB0YWJsZSwgUGF0aEpvaW5zIHBqKSB7CisgICAgICAgIGlmIChfZnJvbSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSB0b0FsaWFzKF9mcm9tLmdldFRhYmxlSW5kZXgodGFibGUsIHBqLCB0cnVlKSk7CisgICAgICAgICAgICBpZiAoX2RpY3QucmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRlJPTV9TRUxFQ1RfQUxJQVMgKyAiLiIgKyBhbGlhcyArICJfIiArIGNvbDsKKyAgICAgICAgICAgIHJldHVybiBhbGlhcyArICJfIiArIGNvbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9BbGlhcyhnZXRUYWJsZUluZGV4KHRhYmxlLCBwaiwgdHJ1ZSkpICsgIi4iICsgY29sOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWdncmVnYXRlKCkgeworICAgICAgICByZXR1cm4gKF9mbGFncyAmIEFHR1JFR0FURSkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZ2dyZWdhdGUoYm9vbGVhbiBhZ2cpIHsKKyAgICAgICAgaWYgKGFnZykKKyAgICAgICAgICAgIF9mbGFncyB8PSBBR0dSRUdBVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9mbGFncyAmPSB+QUdHUkVHQVRFOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworICAgICAgICByZXR1cm4gKF9mbGFncyAmIExPQikgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBsb2IpIHsKKyAgICAgICAgaWYgKGxvYikKKyAgICAgICAgICAgIF9mbGFncyB8PSBMT0I7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9mbGFncyAmPSB+TE9COworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0cygpIHsKKyAgICAgICAgX3NlbGVjdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoU1FMQnVmZmVyIHNxbCwgT2JqZWN0IGlkKSB7CisgICAgICAgIHJldHVybiBzZWxlY3Qoc3FsLCBpZCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFNRTEJ1ZmZlciBzcWwsIE9iamVjdCBpZCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgaWYgKCFpc0dyb3VwaW5nKCkpCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0KChPYmplY3QpIHNxbCwgaWQsIGpvaW5zKTsKKyAgICAgICAgZ3JvdXBCeShzcWwsIGpvaW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgc2VsZWN0IG9mIHRoZSBnaXZlbiBTUUwgYnVmZmVyIG9yIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0KE9iamVjdCBzcWwsIE9iamVjdCBpZCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgZ2V0Sm9pbnMoam9pbnMsIHRydWUpOworICAgICAgICBib29sZWFuIGNvbnRhaW5zOworICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGlkeCA9IF9zZWxlY3RzLmluZGV4T2ZBbGlhcyhzcWwpOworICAgICAgICAgICAgY29udGFpbnMgPSBpZHggIT0gLTE7CisgICAgICAgICAgICBpZiAoY29udGFpbnMpCisgICAgICAgICAgICAgICAgaWQgPSBfc2VsZWN0cy5nZXQoaWR4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZCA9IG51bGxJZCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvbnRhaW5zID0gX3NlbGVjdHMuY29udGFpbnMoaWQpOworCisgICAgICAgIGlmIChjb250YWlucykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgX3NlbGVjdHMuc2V0QWxpYXMoaWQsIHNxbCwgZmFsc2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkIGZvciBhIFNRTCBzdHJpbmcgd2hvc2UgZ2l2ZW4gaWQgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBudWxsSWQoKSB7CisgICAgICAgIGlmIChfbnVsbElkcyA+PSBOVUxMX0lEUy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gbmV3IE51bGxJZCgpOworICAgICAgICByZXR1cm4gTlVMTF9JRFNbX251bGxJZHMrK107CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFN0cmluZyBzcWwsIE9iamVjdCBpZCkgeworICAgICAgICByZXR1cm4gc2VsZWN0KHNxbCwgaWQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChTdHJpbmcgc3FsLCBPYmplY3QgaWQsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGlmICghaXNHcm91cGluZygpKQorICAgICAgICAgICAgcmV0dXJuIHNlbGVjdCgoT2JqZWN0KSBzcWwsIGlkLCBqb2lucyk7CisgICAgICAgIGdyb3VwQnkoc3FsLCBqb2lucyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBsYWNlaG9sZGVyKFN0cmluZyBzcWwpIHsKKyAgICAgICAgT2JqZWN0IGhvbGRlciA9IChfcGxhY2Vob2xkZXJzID49IFBMQUNFSE9MREVSUy5sZW5ndGgpCisgICAgICAgICAgICA/IG5ldyBQbGFjZWhvbGRlcigpIDogUExBQ0VIT0xERVJTW19wbGFjZWhvbGRlcnMrK107CisgICAgICAgIHNlbGVjdChzcWwsIGhvbGRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0IGEgcGxhY2Vob2xkZXIgYXQgdGhlIGdpdmVuIGluZGV4OyB1c2UgYSBuZWdhdGl2ZSBpbmRleAorICAgICAqIHRvIGNvdW50IGZyb20gdGhlIGJhY2sgb2YgdGhlIHNlbGVjdCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydFBsYWNlaG9sZGVyKFN0cmluZyBzcWwsIGludCBwb3MpIHsKKyAgICAgICAgT2JqZWN0IGhvbGRlciA9IChfcGxhY2Vob2xkZXJzID49IFBMQUNFSE9MREVSUy5sZW5ndGgpCisgICAgICAgICAgICA/IG5ldyBQbGFjZWhvbGRlcigpIDogUExBQ0VIT0xERVJTW19wbGFjZWhvbGRlcnMrK107CisgICAgICAgIF9zZWxlY3RzLmluc2VydEFsaWFzKHBvcywgaG9sZGVyLCBzcWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHNlbGVjdGVkIHBsYWNlaG9sZGVycywgYW5kIHJldHVybiByZW1vdmVkIHNlbGVjdCBpbmRleGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyUGxhY2Vob2xkZXJTZWxlY3RzKCkgeworICAgICAgICBfc2VsZWN0cy5jbGVhclBsYWNlaG9sZGVycygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChDb2x1bW4gY29sKSB7CisgICAgICAgIHJldHVybiBzZWxlY3QoY29sLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChDb2x1bW4gY29sLCBKb2lucyBqb2lucykgeworICAgICAgICBpZiAoIWlzR3JvdXBpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3QoY29sLCBnZXRKb2lucyhqb2lucywgdHJ1ZSksIGZhbHNlKTsKKyAgICAgICAgZ3JvdXBCeShjb2wsIGpvaW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2VsZWN0KENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgcmV0dXJuIHNlbGVjdChjb2xzLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNlbGVjdChDb2x1bW5bXSBjb2xzLCBKb2lucyBqb2lucykgeworICAgICAgICBpZiAoY29scyA9PSBudWxsIHx8IGNvbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGlzR3JvdXBpbmcoKSkgeworICAgICAgICAgICAgZ3JvdXBCeShjb2xzLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQYXRoSm9pbnMgcGogPSBnZXRKb2lucyhqb2lucywgdHJ1ZSk7CisgICAgICAgIGludCBzZWxkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHNlbGVjdChjb2xzW2ldLCBwaiwgZmFsc2UpKQorICAgICAgICAgICAgICAgIHNlbGQgfD0gMiA8PCBpOworICAgICAgICByZXR1cm4gc2VsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGdpdmVuIGNvbHVtbiBhZnRlciBtYWtpbmcgdGhlIGdpdmVuIGpvaW5zLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3QoQ29sdW1uIGNvbCwgUGF0aEpvaW5zIHBqLCBib29sZWFuIGlkZW50KSB7CisgICAgICAgIC8vIHdlIGNhY2hlIG9uIGNvbHVtbiBvYmplY3QgaWYgdGhlcmUgYXJlIG5vIGpvaW5zIHNvIHRoYXQgd2hlbgorICAgICAgICAvLyBsb29raW5nIHVwIGNvbHVtbnMgaW4gdGhlIHJlc3VsdCB3ZSBkb24ndCBoYXZlIHRvIGNyZWF0ZSBhIHN0cmluZworICAgICAgICAvLyBidWZmZXIgZm9yIHRoZSB0YWJsZSArIGNvbHVtbiBhbGlhczsgaWYgdGhlcmUgYXJlIGpvaW5zLCB0aGVuCisgICAgICAgIC8vIHdlIGtleSBvbiB0aGUgYWxpYXMKKyAgICAgICAgU3RyaW5nIGFsaWFzID0gZ2V0Q29sdW1uQWxpYXMoY29sLCBwaik7CisgICAgICAgIE9iamVjdCBpZDsKKyAgICAgICAgaWYgKHBqID09IG51bGwgfHwgcGoucGF0aCgpID09IG51bGwpCisgICAgICAgICAgICBpZCA9IGNvbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWQgPSBhbGlhczsKKyAgICAgICAgaWYgKF9zZWxlY3RzLmNvbnRhaW5zKGlkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoY29sLmdldFR5cGUoKSA9PSBUeXBlcy5CTE9CIHx8IGNvbC5nZXRUeXBlKCkgPT0gVHlwZXMuQ0xPQikKKyAgICAgICAgICAgIHNldExvYih0cnVlKTsKKyAgICAgICAgX3NlbGVjdHMuc2V0QWxpYXMoaWQsIGFsaWFzLCBpZGVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdChDbGFzc01hcHBpbmcgbWFwcGluZywgaW50IHN1YmNsYXNzZXMsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyKSB7CisgICAgICAgIHNlbGVjdChtYXBwaW5nLCBzdWJjbGFzc2VzLCBzdG9yZSwgZmV0Y2gsIGVhZ2VyLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3QoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlciwKKyAgICAgICAgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc2VsZWN0KHRoaXMsIG1hcHBpbmcsIHN1YmNsYXNzZXMsIHN0b3JlLCBmZXRjaCwgZWFnZXIsIGpvaW5zLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBnaXZlbiBtYXBwaW5nLgorICAgICAqLworICAgIHZvaWQgc2VsZWN0KFNlbGVjdCB3cmFwcGVyLCBDbGFzc01hcHBpbmcgbWFwcGluZywgaW50IHN1YmNsYXNzZXMsCisgICAgICAgIEpEQkNTdG9yZSBzdG9yZSwgSkRCQ0ZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGVhZ2VyLAorICAgICAgICBKb2lucyBqb2lucywgYm9vbGVhbiBpZGVudCkgeworICAgICAgICAvLyBub3RlIHRoYXQgdGhpcyBpcyBvbmUgY2FzZSB3aGVyZSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgcmVzdWx0CisgICAgICAgIC8vIG9mIGdldEpvaW5zKCk7IGp1c3QgdXNlIHRoZSBnaXZlbiBqb2lucywgd2hpY2ggd2lsbCBlaXRoZXIgYmUgY2xlYW4KKyAgICAgICAgLy8gb3IgdGhlIHJlc3VsdCBvZiBwcmV2aW91cyBwcmUtam9pbnMuIHRoaXMgd2F5IHdlIGRvbid0IHB1c2ggZXh0cmEKKyAgICAgICAgLy8gc3RhY2sgc3R1ZmYgd2hlbiBubyBhY3R1YWwgbmV3IGpvaW5zIGhhdmUgYmVlbiBtYWRlLCBhbmQgd2UgZG9uJ3QKKyAgICAgICAgLy8gdGhpbmsgdGhlIHVzZXIgd2FudHMgb3V0ZXIgam9pbnMgd2hlbiBhY3R1YWxseSBvbmx5IHRoZSBwcmV2aW91cworICAgICAgICAvLyBqb2lucyB3ZXJlIG91dGVyLiAgd2UgZG8gaW52b2tlIGdldEpvaW5zKCksIHRob3VnaCwgdG8gYWRkIHRoZXNlCisgICAgICAgIC8vIGpvaW5zIChpZiBhbnkpIHRvIG91ciB0b3AtbGV2ZWwgam9pbnM7IG90aGVyd2lzZSBpdCdkIGJlIHBvc3NpYmxlCisgICAgICAgIC8vIGZvciB0aGUgdXNlciB0byBpbW1lZGlhdGVseSBkbyBhbm90aGVyIGpvaW4gYW5kIHNlbGVjdCBzb21ldGhpbmcsCisgICAgICAgIC8vIGFuZCBpZiB3ZSdyZSBpbiBvdXRlciBtb2RlIGFsbCB0aGVzZSBqb2lucyB3aWxsIGdldCBzd2l0Y2hlZCB0byBvdXRlcgorICAgICAgICAvLyBqb2lucy4gIGNhY2hpbmcgdGhlbSBhcyB0aGVpciBvcmlnaW5hbCBqb2luIHR5cGUgcHJldmVudHMgdGhhdAorICAgICAgICBnZXRKb2lucyhqb2lucywgdHJ1ZSk7CisKKyAgICAgICAgUGF0aEpvaW5zIHBqID0gKFBhdGhKb2lucykgam9pbnM7CisgICAgICAgIGJvb2xlYW4gaGFzSm9pbnMgPSBwaiAhPSBudWxsICYmIHBqLmlzRGlydHkoKTsKKyAgICAgICAgaWYgKGhhc0pvaW5zKSB7CisgICAgICAgICAgICBpZiAoX3ByZUpvaW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgX3ByZUpvaW5zID0gbmV3IFN0YWNrKCk7CisgICAgICAgICAgICBfcHJlSm9pbnMucHVzaChwaik7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGV5IGFyZSBzZWxlY3RpbmcgdGhpcyBtYXBwaW5nIHdpdGggb3V0ZXIgam9pbnMsIHRoZW4gYWxsIGpvaW5zCisgICAgICAgIC8vIGZyb20gdGhpcyBtYXBwaW5nIHNob3VsZCBhbHNvIGJlIG91dGVyCisgICAgICAgIGJvb2xlYW4gd2FzT3V0ZXIgPSAoX2ZsYWdzICYgT1VURVIpICE9IDA7CisgICAgICAgIGlmIChoYXNKb2lucyAmJiAhd2FzT3V0ZXIgJiYgcGouaXNPdXRlcigpKQorICAgICAgICAgICAgX2ZsYWdzIHw9IE9VVEVSOworCisgICAgICAgIC8vIGRlbGVnYXRlIHRvIHN0b3JlIG1hbmFnZXIgdG8gc2VsZWN0IGluIHNhbWUgb3JkZXIgaXQgbG9hZHMgcmVzdWx0CisgICAgICAgICgoSkRCQ1N0b3JlTWFuYWdlcikgc3RvcmUpLnNlbGVjdCh3cmFwcGVyLCBtYXBwaW5nLCBzdWJjbGFzc2VzLCBudWxsLAorICAgICAgICAgICAgbnVsbCwgZmV0Y2gsIGVhZ2VyLCBpZGVudCwgKF9mbGFncyAmIE9VVEVSKSAhPSAwKTsKKworICAgICAgICAvLyByZXNldAorICAgICAgICBpZiAoaGFzSm9pbnMpCisgICAgICAgICAgICBfcHJlSm9pbnMucG9wKCk7CisgICAgICAgIGlmICghd2FzT3V0ZXIgJiYgKF9mbGFncyAmIE9VVEVSKSAhPSAwKQorICAgICAgICAgICAgX2ZsYWdzICY9IH5PVVRFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RJZGVudGlmaWVyKENvbHVtbiBjb2wpIHsKKyAgICAgICAgcmV0dXJuIHNlbGVjdElkZW50aWZpZXIoY29sLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdElkZW50aWZpZXIoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgaWYgKCFpc0dyb3VwaW5nKCkpCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0KGNvbCwgZ2V0Sm9pbnMoam9pbnMsIHRydWUpLCB0cnVlKTsKKyAgICAgICAgZ3JvdXBCeShjb2wsIGpvaW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2VsZWN0SWRlbnRpZmllcihDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIHJldHVybiBzZWxlY3RJZGVudGlmaWVyKGNvbHMsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2VsZWN0SWRlbnRpZmllcihDb2x1bW5bXSBjb2xzLCBKb2lucyBqb2lucykgeworICAgICAgICBpZiAoY29scyA9PSBudWxsIHx8IGNvbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGlzR3JvdXBpbmcoKSkgeworICAgICAgICAgICAgZ3JvdXBCeShjb2xzLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQYXRoSm9pbnMgcGogPSBnZXRKb2lucyhqb2lucywgdHJ1ZSk7CisgICAgICAgIGludCBzZWxkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHNlbGVjdChjb2xzW2ldLCBwaiwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgc2VsZCB8PSAyIDw8IGk7CisgICAgICAgIHJldHVybiBzZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdElkZW50aWZpZXIoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlcikgeworICAgICAgICBzZWxlY3RJZGVudGlmaWVyKG1hcHBpbmcsIHN1YmNsYXNzZXMsIHN0b3JlLCBmZXRjaCwgZWFnZXIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdElkZW50aWZpZXIoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUsIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBlYWdlciwKKyAgICAgICAgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgc2VsZWN0KHRoaXMsIG1hcHBpbmcsIHN1YmNsYXNzZXMsIHN0b3JlLCBmZXRjaCwgZWFnZXIsIGpvaW5zLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNlbGVjdFByaW1hcnlLZXkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICAgICAgcmV0dXJuIHNlbGVjdFByaW1hcnlLZXkobWFwcGluZywgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzZWxlY3RQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nLCBKb2lucyBqb2lucykgeworICAgICAgICByZXR1cm4gcHJpbWFyeUtleU9wZXJhdGlvbihtYXBwaW5nLCB0cnVlLCBudWxsLCBqb2lucywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZXJhdGUgb24gcHJpbWFyeSBrZXkgZGF0YS4gUmV0dXJuIGEgYml0IG1hc2sgb2Ygc2VsZWN0ZWQgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwcmltYXJ5S2V5T3BlcmF0aW9uKENsYXNzTWFwcGluZyBtYXBwaW5nLCBib29sZWFuIHNlbCwKKyAgICAgICAgQm9vbGVhbiBhc2MsIEpvaW5zIGpvaW5zLCBib29sZWFuIGFsaWFzT3JkZXIpIHsKKyAgICAgICAgaWYgKCFzZWwgJiYgYXNjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvLyBpZiB0aGlzIG1hcHBpbmcgY2FuJ3Qgc2VsZWN0IHRoZSBmdWxsIHBrIHZhbHVlcywgdGhlbiBqb2luIHRvCisgICAgICAgIC8vIHN1cGVyIGFuZCByZWN1cnNlCisgICAgICAgIENsYXNzTWFwcGluZyBzdXA7CisgICAgICAgIGlmICghbWFwcGluZy5pc1ByaW1hcnlLZXlPYmplY3RJZCh0cnVlKSkgeworICAgICAgICAgICAgc3VwID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgICAgIGlmIChqb2lucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGpvaW5zID0gbmV3Sm9pbnMoKTsKKyAgICAgICAgICAgIGpvaW5zID0gbWFwcGluZy5qb2luU3VwZXJjbGFzcyhqb2lucywgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHByaW1hcnlLZXlPcGVyYXRpb24oc3VwLCBzZWwsIGFzYywgam9pbnMsIGFsaWFzT3JkZXIpOworICAgICAgICB9CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgaWYgKGlzR3JvdXBpbmcoKSkgeworICAgICAgICAgICAgZ3JvdXBCeShjb2xzLCBqb2lucyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIFBhdGhKb2lucyBwaiA9IGdldEpvaW5zKGpvaW5zLCBmYWxzZSk7CisgICAgICAgIGludCBzZWxkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbHVtbk9wZXJhdGlvbihjb2xzW2ldLCBzZWwsIGFzYywgcGosIGFsaWFzT3JkZXIpKQorICAgICAgICAgICAgICAgIHNlbGQgfD0gMiA8PCBpOworCisgICAgICAgIC8vIGlmIHRoaXMgbWFwcGluZyBoYXMgbm90IGJlZW4gdXNlZCBpbiB0aGUgc2VsZWN0IHlldCAoYW5kIHRoZXJlZm9yZQorICAgICAgICAvLyBpcyBub3Qgam9pbmVkIHRvIGFueXRoaW5nKSwgYnV0IGhhcyBhbiBvdGhlci10YWJsZSBzdXBlcmNsYXNzIHRoYXQKKyAgICAgICAgLy8gaGFzIGJlZW4gdXNlZCwgbWFrZSBzdXJlIHRvIGpvaW4gdG8gaXQKKyAgICAgICAgYm9vbGVhbiBqb2luZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzdXAgPSBtYXBwaW5nLmdldEpvaW5hYmxlUENTdXBlcmNsYXNzTWFwcGluZygpOyBzdXAgIT0gbnVsbDsKKyAgICAgICAgICAgIG1hcHBpbmcgPSBzdXAsIHN1cCA9IG1hcHBpbmcuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChzdXAuZ2V0VGFibGUoKSA9PSBtYXBwaW5nLmdldFRhYmxlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChtYXBwaW5nLmdldFRhYmxlKCkgIT0gc3VwLmdldFRhYmxlKCkKKyAgICAgICAgICAgICAgICAmJiBnZXRUYWJsZUluZGV4KG1hcHBpbmcuZ2V0VGFibGUoKSwgcGosIGZhbHNlKSA9PSAtMQorICAgICAgICAgICAgICAgICYmIGdldFRhYmxlSW5kZXgoc3VwLmdldFRhYmxlKCksIHBqLCBmYWxzZSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAocGogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGogPSAoUGF0aEpvaW5zKSBuZXdKb2lucygpOworICAgICAgICAgICAgICAgIHBqID0gKFBhdGhKb2lucykgbWFwcGluZy5qb2luU3VwZXJjbGFzcyhwaiwgZmFsc2UpOworICAgICAgICAgICAgICAgIGpvaW5lZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoam9pbmVkKQorICAgICAgICAgICAgd2hlcmUocGopOworCisgICAgICAgIHJldHVybiBzZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gb3BlcmF0aW9uIG9uIGEgY29sdW1uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb2x1bW5PcGVyYXRpb24oQ29sdW1uIGNvbCwgYm9vbGVhbiBzZWwsIEJvb2xlYW4gYXNjLAorICAgICAgICBQYXRoSm9pbnMgcGosIGJvb2xlYW4gYWxpYXNPcmRlcikgeworICAgICAgICBTdHJpbmcgYXMgPSBudWxsOworICAgICAgICBpZiAoYXNjICE9IG51bGwgJiYgKGFsaWFzT3JkZXIgfHwgKF9mbGFncyAmIFJFQ09SRF9PUkRFUkVEKSAhPSAwKSkgeworICAgICAgICAgICAgT2JqZWN0IGlkOworICAgICAgICAgICAgaWYgKHBqID09IG51bGwgfHwgcGoucGF0aCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgaWQgPSBjb2w7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWQgPSBnZXRDb2x1bW5BbGlhcyhjb2wsIHBqKTsKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgUkVDT1JEX09SREVSRUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoX29yZGVyZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX29yZGVyZWQgPSBuZXcgQXJyYXlMaXN0KDUpOworICAgICAgICAgICAgICAgIF9vcmRlcmVkLmFkZChpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxpYXNPcmRlcikgeworICAgICAgICAgICAgICAgIGFzID0gdG9PcmRlckFsaWFzKF9vcmRlcnMrKyk7CisgICAgICAgICAgICAgICAgX3NlbGVjdHMuc2V0U2VsZWN0QXMoaWQsIGFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gc2VsZCA9IHNlbCAmJiBzZWxlY3QoY29sLCBwaiwgZmFsc2UpOworICAgICAgICBpZiAoYXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBhbGlhcyA9IChhcyAhPSBudWxsKSA/IGFzIDogZ2V0Q29sdW1uQWxpYXMoY29sLCBwaik7CisgICAgICAgICAgICBhcHBlbmRPcmRlcmluZyhhbGlhcywgYXNjLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgb3JkZXJpbmcgaW5mb3JtYXRpb24gdG8gb3VyIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kT3JkZXJpbmcoT2JqZWN0IG9yZGVyQnksIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIGlmIChfb3JkZXJpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIF9vcmRlcmluZyA9IG5ldyBTUUxCdWZmZXIoX2RpY3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfb3JkZXJpbmcuYXBwZW5kKCIsICIpOworCisgICAgICAgIGlmIChvcmRlckJ5IGluc3RhbmNlb2YgU1FMQnVmZmVyKQorICAgICAgICAgICAgX29yZGVyaW5nLmFwcGVuZCgoU1FMQnVmZmVyKSBvcmRlckJ5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX29yZGVyaW5nLmFwcGVuZCgoU3RyaW5nKSBvcmRlckJ5KTsKKyAgICAgICAgaWYgKGFzYykKKyAgICAgICAgICAgIF9vcmRlcmluZy5hcHBlbmQoIiBBU0MiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX29yZGVyaW5nLmFwcGVuZCgiIERFU0MiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG9yZGVyQnlQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nLCBib29sZWFuIGFzYywKKyAgICAgICAgYm9vbGVhbiBzZWwpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVyQnlQcmltYXJ5S2V5KG1hcHBpbmcsIGFzYywgbnVsbCwgc2VsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG9yZGVyQnlQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nLCBib29sZWFuIGFzYywKKyAgICAgICAgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsKSB7CisgICAgICAgIHJldHVybiBvcmRlckJ5UHJpbWFyeUtleShtYXBwaW5nLCBhc2MsIGpvaW5zLCBzZWwsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyB1bmlvbnMgdG8gc2V0IGFsaWFzZXMgb24gb3JkZXIgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG9yZGVyQnlQcmltYXJ5S2V5KENsYXNzTWFwcGluZyBtYXBwaW5nLCBib29sZWFuIGFzYywKKyAgICAgICAgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsLCBib29sZWFuIGFsaWFzT3JkZXIpIHsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlLZXlPcGVyYXRpb24obWFwcGluZywgc2VsLAorICAgICAgICAgICAgKGFzYykgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLCBqb2lucywgYWxpYXNPcmRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShDb2x1bW4gY29sLCBib29sZWFuIGFzYywgYm9vbGVhbiBzZWwpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVyQnkoY29sLCBhc2MsIG51bGwsIHNlbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShDb2x1bW4gY29sLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsKSB7CisgICAgICAgIHJldHVybiBvcmRlckJ5KGNvbCwgYXNjLCBqb2lucywgc2VsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgdW5pb25zIHRvIHNldCBhbGlhc2VzIG9uIG9yZGVyIGNvbHVtbnMuCisgICAgICovCisgICAgYm9vbGVhbiBvcmRlckJ5KENvbHVtbiBjb2wsIGJvb2xlYW4gYXNjLCBKb2lucyBqb2lucywgYm9vbGVhbiBzZWwsCisgICAgICAgIGJvb2xlYW4gYWxpYXNPcmRlcikgeworICAgICAgICByZXR1cm4gY29sdW1uT3BlcmF0aW9uKGNvbCwgc2VsLCAoYXNjKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCisgICAgICAgICAgICBnZXRKb2lucyhqb2lucywgdHJ1ZSksIGFsaWFzT3JkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgb3JkZXJCeShDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFzYywgYm9vbGVhbiBzZWwpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVyQnkoY29scywgYXNjLCBudWxsLCBzZWwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgb3JkZXJCeShDb2x1bW5bXSBjb2xzLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsKSB7CisgICAgICAgIHJldHVybiBvcmRlckJ5KGNvbHMsIGFzYywgam9pbnMsIHNlbCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHVuaW9ucyB0byBzZXQgYWxpYXNlcyBvbiBvcmRlciBjb2x1bW5zLgorICAgICAqLworICAgIGludCBvcmRlckJ5KENvbHVtbltdIGNvbHMsIGJvb2xlYW4gYXNjLCBKb2lucyBqb2lucywgYm9vbGVhbiBzZWwsCisgICAgICAgIGJvb2xlYW4gYWxpYXNPcmRlcikgeworICAgICAgICBQYXRoSm9pbnMgcGogPSBnZXRKb2lucyhqb2lucywgdHJ1ZSk7CisgICAgICAgIGludCBzZWxkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbHVtbk9wZXJhdGlvbihjb2xzW2ldLCBzZWwsCisgICAgICAgICAgICAgICAgKGFzYykgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLCBwaiwgYWxpYXNPcmRlcikpCisgICAgICAgICAgICAgICAgc2VsZCB8PSAyIDw8IGk7CisgICAgICAgIHJldHVybiBzZWxkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9yZGVyQnkoU1FMQnVmZmVyIHNxbCwgYm9vbGVhbiBhc2MsIGJvb2xlYW4gc2VsKSB7CisgICAgICAgIHJldHVybiBvcmRlckJ5KHNxbCwgYXNjLCAoSm9pbnMpIG51bGwsIHNlbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShTUUxCdWZmZXIgc3FsLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsCisgICAgICAgIGJvb2xlYW4gc2VsKSB7CisgICAgICAgIHJldHVybiBvcmRlckJ5KHNxbCwgYXNjLCBqb2lucywgc2VsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgdW5pb25zIHRvIHNldCBhbGlhc2VzIG9uIG9yZGVyIGNvbHVtbnMuCisgICAgICovCisgICAgYm9vbGVhbiBvcmRlckJ5KFNRTEJ1ZmZlciBzcWwsIGJvb2xlYW4gYXNjLCBKb2lucyBqb2lucywgYm9vbGVhbiBzZWwsCisgICAgICAgIGJvb2xlYW4gYWxpYXNPcmRlcikgeworICAgICAgICByZXR1cm4gb3JkZXJCeSgoT2JqZWN0KSBzcWwsIGFzYywgam9pbnMsIHNlbCwgYWxpYXNPcmRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3JkZXIgb24gYSBTUUwgYnVmZmVyIG9yIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3JkZXJCeShPYmplY3Qgc3FsLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsLAorICAgICAgICBib29sZWFuIGFsaWFzT3JkZXIpIHsKKyAgICAgICAgT2JqZWN0IG9yZGVyID0gc3FsOworICAgICAgICBpZiAoYWxpYXNPcmRlcikgeworICAgICAgICAgICAgb3JkZXIgPSB0b09yZGVyQWxpYXMoX29yZGVycysrKTsKKyAgICAgICAgICAgIF9zZWxlY3RzLnNldFNlbGVjdEFzKHNxbCwgKFN0cmluZykgb3JkZXIpOworICAgICAgICB9CisgICAgICAgIGlmICgoX2ZsYWdzICYgUkVDT1JEX09SREVSRUQpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChfb3JkZXJlZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9vcmRlcmVkID0gbmV3IEFycmF5TGlzdCg1KTsKKyAgICAgICAgICAgIF9vcmRlcmVkLmFkZChzcWwpOworICAgICAgICB9CisKKyAgICAgICAgZ2V0Sm9pbnMoam9pbnMsIHRydWUpOworICAgICAgICBhcHBlbmRPcmRlcmluZyhvcmRlciwgYXNjKTsKKyAgICAgICAgaWYgKHNlbCkgeworICAgICAgICAgICAgaW50IGlkeCA9IF9zZWxlY3RzLmluZGV4T2ZBbGlhcyhzcWwpOworICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgIF9zZWxlY3RzLnNldEFsaWFzKG51bGxJZCgpLCBzcWwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShTdHJpbmcgc3FsLCBib29sZWFuIGFzYywgYm9vbGVhbiBzZWwpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVyQnkoc3FsLCBhc2MsIG51bGwsIHNlbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb3JkZXJCeShTdHJpbmcgc3FsLCBib29sZWFuIGFzYywgSm9pbnMgam9pbnMsIGJvb2xlYW4gc2VsKSB7CisgICAgICAgIHJldHVybiBvcmRlckJ5KHNxbCwgYXNjLCBqb2lucywgc2VsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgdW5pb25zIHRvIHNldCBhbGlhc2VzIG9uIG9yZGVyIGNvbHVtbnMuCisgICAgICovCisgICAgYm9vbGVhbiBvcmRlckJ5KFN0cmluZyBzcWwsIGJvb2xlYW4gYXNjLCBKb2lucyBqb2lucywgYm9vbGVhbiBzZWwsCisgICAgICAgIGJvb2xlYW4gYWxpYXNPcmRlcikgeworICAgICAgICByZXR1cm4gb3JkZXJCeSgoT2JqZWN0KSBzcWwsIGFzYywgam9pbnMsIHNlbCwgYWxpYXNPcmRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJPcmRlcmluZygpIHsKKyAgICAgICAgX29yZGVyaW5nID0gbnVsbDsKKyAgICAgICAgX29yZGVycyA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgdW5pb25zIHRvIHJlY29yZCB0aGUgc2VsZWN0IGxpc3QgaW5kZXhlcyBvZiBpdGVtcyB3ZSBvcmRlciBieS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJlY29yZE9yZGVyZWRJbmRleGVzKGJvb2xlYW4gcmVjb3JkKSB7CisgICAgICAgIGlmIChyZWNvcmQpCisgICAgICAgICAgICBfZmxhZ3MgfD0gUkVDT1JEX09SREVSRUQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX29yZGVyZWQgPSBudWxsOworICAgICAgICAgICAgX2ZsYWdzICY9IH5SRUNPUkRfT1JERVJFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXhlcyBpbiB0aGUgc2VsZWN0IGxpc3Qgb2YgYWxsIGl0ZW1zIHdlJ3JlIG9yZGVyaW5nCisgICAgICogYnksIG9yIG51bGwgaWYgbm9uZS4gRm9yIHVzZSB3aXRoIHVuaW9ucy4KKyAgICAgKi8KKyAgICBMaXN0IGdldE9yZGVyZWRJbmRleGVzKCkgeworICAgICAgICBpZiAoX29yZGVyZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBMaXN0IGlkeHMgPSBuZXcgQXJyYXlMaXN0KF9vcmRlcmVkLnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX29yZGVyZWQuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBpZHhzLmFkZChOdW1iZXJzLnZhbHVlT2YoX3NlbGVjdHMuaW5kZXhPZihfb3JkZXJlZC5nZXQoaSkpKSk7CisgICAgICAgIHJldHVybiBpZHhzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlUHJpbWFyeUtleShPYmplY3Qgb2lkLCBDbGFzc01hcHBpbmcgbWFwcGluZywKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIHdoZXJlUHJpbWFyeUtleShvaWQsIG1hcHBpbmcsIG51bGwsIHN0b3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgd2hlcmUgY29uZGl0aW9ucyBzZXR0aW5nIHRoZSBtYXBwaW5nJ3MgcHJpbWFyeSBrZXkgdG8gdGhlIGdpdmVuCisgICAgICogb2lkIHZhbHVlcy4gSWYgdGhlIGdpdmVuIG1hcHBpbmcgZG9lcyBub3QgdXNlIG9pZCB2YWx1ZXMgZm9yIGl0cworICAgICAqIHByaW1hcnkga2V5LCB3ZSB3aWxsIHJlY3Vyc2l2ZWx5IGpvaW4gdG8gaXRzIHN1cGVyY2xhc3MgdW50aWwgd2UgZmluZAorICAgICAqIGFuIGFuY2VzdG9yIHRoYXQgZG9lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2hlcmVQcmltYXJ5S2V5KE9iamVjdCBvaWQsIENsYXNzTWFwcGluZyBtYXBwaW5nLCBKb2lucyBqb2lucywKKyAgICAgICAgSkRCQ1N0b3JlIHN0b3JlKSB7CisgICAgICAgIC8vIGlmIHRoaXMgbWFwcGluZydzIGlkZW50aWZpZXJzIGluY2x1ZGUgc29tZXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICAgLy8gdGhlIHBrIHZhbHVlcywgam9pbiB0byBzdXBlciBhbmQgcmVjdXJzZQorICAgICAgICBpZiAoIW1hcHBpbmcuaXNQcmltYXJ5S2V5T2JqZWN0SWQoZmFsc2UpKSB7CisgICAgICAgICAgICBDbGFzc01hcHBpbmcgc3VwID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgICAgIGlmIChqb2lucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGpvaW5zID0gbmV3Sm9pbnMoKTsKKyAgICAgICAgICAgIGpvaW5zID0gbWFwcGluZy5qb2luU3VwZXJjbGFzcyhqb2lucywgZmFsc2UpOworICAgICAgICAgICAgd2hlcmVQcmltYXJ5S2V5KG9pZCwgc3VwLCBqb2lucywgc3RvcmUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQ29sdW1uW10gY29scyA9IG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgd2hlcmUob2lkLCBtYXBwaW5nLCBjb2xzLCBjb2xzLCBudWxsLCBudWxsLCBnZXRKb2lucyhqb2lucywgdHJ1ZSksCisgICAgICAgICAgICBzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2hlcmVGb3JlaWduS2V5KEZvcmVpZ25LZXkgZmssIE9iamVjdCBvaWQsCisgICAgICAgIENsYXNzTWFwcGluZyBtYXBwaW5nLCBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgd2hlcmVGb3JlaWduS2V5KGZrLCBvaWQsIG1hcHBpbmcsIG51bGwsIHN0b3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgd2hlcmUgY29uZGl0aW9ucyBzZXR0aW5nIHRoZSBnaXZlbiBmb3JlaWduIGtleSB0byB0aGUgZ2l2ZW4KKyAgICAgKiBvaWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHNlZSAjd2hlcmVQcmltYXJ5S2V5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdoZXJlRm9yZWlnbktleShGb3JlaWduS2V5IGZrLCBPYmplY3Qgb2lkLAorICAgICAgICBDbGFzc01hcHBpbmcgbWFwcGluZywgSm9pbnMgam9pbnMsIEpEQkNTdG9yZSBzdG9yZSkgeworICAgICAgICAvLyBpZiB0aGlzIG1hcHBpbmcncyBpZGVudGlmaWVycyBpbmNsdWRlIHNvbWV0aGluZyBvdGhlciB0aGFuCisgICAgICAgIC8vIHRoZSBwayB2YWx1ZXMsIG9yIGlmIHRoaXMgZm9yZWlnbiBrZXkgZG9lc24ndCBsaW5rIHRvIG9ubHkKKyAgICAgICAgLy8gaWRlbnRpZmllcnMsIGpvaW4gdG8gdGFibGUgYW5kIGRvIGEgZ2V0UHJpbWFyeUtleQorICAgICAgICBpZiAoIW1hcHBpbmcuaXNQcmltYXJ5S2V5T2JqZWN0SWQoZmFsc2UpIHx8ICFjb250YWluc0FsbAorICAgICAgICAgICAgKG1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwgZmsuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSkpIHsKKyAgICAgICAgICAgIGlmIChqb2lucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGpvaW5zID0gbmV3Sm9pbnMoKTsKKyAgICAgICAgICAgIC8vIHRyYXZlcnNlIHRvIGZvcmVpZ24ga2V5IHRhcmdldCBtYXBwaW5nCisgICAgICAgICAgICB3aGlsZSAobWFwcGluZy5nZXRUYWJsZSgpICE9IGZrLmdldFByaW1hcnlLZXlUYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGpvaW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGpvaW5zID0gbmV3Sm9pbnMoKTsKKyAgICAgICAgICAgICAgICBqb2lucyA9IG1hcHBpbmcuam9pblN1cGVyY2xhc3Moam9pbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtYXBwaW5nID0gbWFwcGluZy5nZXRKb2luYWJsZVBDU3VwZXJjbGFzc01hcHBpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGpvaW5zID0gam9pbnMuam9pbihmaywgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHdoZXJlUHJpbWFyeUtleShvaWQsIG1hcHBpbmcsIGpvaW5zLCBzdG9yZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDb2x1bW5bXSBmcm9tQ29scyA9IGZrLmdldENvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uW10gdG9Db2xzID0gZmsuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKKyAgICAgICAgQ29sdW1uW10gY29uc3RDb2xzID0gZmsuZ2V0Q29uc3RhbnRDb2x1bW5zKCk7CisgICAgICAgIE9iamVjdFtdIGNvbnN0cyA9IGZrLmdldENvbnN0YW50cygpOworICAgICAgICB3aGVyZShvaWQsIG1hcHBpbmcsIHRvQ29scywgZnJvbUNvbHMsIGNvbnN0cywgY29uc3RDb2xzLAorICAgICAgICAgICAgZ2V0Sm9pbnMoam9pbnMsIHRydWUpLCBzdG9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGZsdXNoIHRoZSBvaWQgdmFsdWVzIGFzIHdoZXJlIGNvbmRpdGlvbnMgdG8gdGhlCisgICAgICogZ2l2ZW4gY29sdW1ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2hlcmUoT2JqZWN0IG9pZCwgQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIENvbHVtbltdIHRvQ29scywKKyAgICAgICAgQ29sdW1uW10gZnJvbUNvbHMsIE9iamVjdFtdIHZhbHMsIENvbHVtbltdIGNvbnN0Q29scywgUGF0aEpvaW5zIHBqLAorICAgICAgICBKREJDU3RvcmUgc3RvcmUpIHsKKyAgICAgICAgVmFsdWVNYXBwaW5nIGVtYmVkID0gbWFwcGluZy5nZXRFbWJlZGRpbmdNYXBwaW5nKCk7CisgICAgICAgIGlmIChlbWJlZCAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGVyZShvaWQsIGVtYmVkLmdldEZpZWxkTWFwcGluZygpLmdldERlZmluaW5nTWFwcGluZygpLAorICAgICAgICAgICAgICAgIHRvQ29scywgZnJvbUNvbHMsIHZhbHMsIGNvbnN0Q29scywgcGosIHN0b3JlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9ubHkgYm90aGVyIHRvIHBhY2sgcGsgdmFsdWVzIGludG8gYXJyYXkgaWYgYXBwIGlkCisgICAgICAgIE9iamVjdFtdIHBrcyA9IG51bGw7CisgICAgICAgIGlmIChtYXBwaW5nLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWFwcGluZy5JRF9BUFBMSUNBVElPTikKKyAgICAgICAgICAgIHBrcyA9IEFwcGxpY2F0aW9uSWRzLnRvUEtWYWx1ZXMob2lkLCBtYXBwaW5nKTsKKworICAgICAgICBTUUxCdWZmZXIgYnVmID0gbmV3IFNRTEJ1ZmZlcihfZGljdCk7CisgICAgICAgIEpvaW5hYmxlIGpvaW47CisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9Db2xzLmxlbmd0aDsgaSsrLCBjb3VudCsrKSB7CisgICAgICAgICAgICBpZiAocGtzID09IG51bGwpCisgICAgICAgICAgICAgICAgdmFsID0gKG9pZCA9PSBudWxsKSA/IG51bGwgOiBOdW1iZXJzLnZhbHVlT2YoKChJZClvaWQpLmdldElkKCkpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhcHAgaWRlbnRpdHk7IHVzZSBwayBpbmRleCB0byBnZXQgY29ycmVjdCBwayB2YWx1ZQorICAgICAgICAgICAgICAgIGpvaW4gPSBtYXBwaW5nLmFzc2VydEpvaW5hYmxlKHRvQ29sc1tpXSk7CisgICAgICAgICAgICAgICAgdmFsID0gcGtzW21hcHBpbmcuZ2V0RmllbGQoam9pbi5nZXRGaWVsZEluZGV4KCkpLgorICAgICAgICAgICAgICAgICAgICBnZXRQcmltYXJ5S2V5SW5kZXgoKV07CisgICAgICAgICAgICAgICAgdmFsID0gam9pbi5nZXRKb2luVmFsdWUodmFsLCB0b0NvbHNbaV0sIHN0b3JlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgQU5EICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChnZXRDb2x1bW5BbGlhcyhmcm9tQ29sc1tpXSwgcGopKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgSVMgIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiID0gIik7CisgICAgICAgICAgICBidWYuYXBwZW5kVmFsdWUodmFsLCBmcm9tQ29sc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uc3RDb2xzICE9IG51bGwgJiYgY29uc3RDb2xzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RDb2xzLmxlbmd0aDsgaSsrLCBjb3VudCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGdldENvbHVtbkFsaWFzKGNvbnN0Q29sc1tpXSwgcGopKTsKKworICAgICAgICAgICAgICAgIGlmICh2YWxzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBJUyAiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmRWYWx1ZSh2YWxzW2ldLCBjb25zdENvbHNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hlcmUoYnVmLCBwaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgaWYgdGhlIGdpdmVuIHNldCBvZiBjb2x1bW5zIGNvbnRhaW5zIGFsbCB0aGUKKyAgICAgKiBjb2x1bW5zIGluIHRoZSBnaXZlbiBwb3RlbnRpYWwgc3Vic2V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sdW1uW10gc2V0LCBDb2x1bW5bXSBzdWIpIHsKKyAgICAgICAgaWYgKHN1Yi5sZW5ndGggPiBzZXQubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIHRoaXMgaXMgb2J2aW91c2x5IG5eMiwgYnV0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBzaG91bGQgYmUgaW4KKyAgICAgICAgLy8gdGhlIDEtMiByYW5nZSwgc28gbm8gYmlnZ2llCisgICAgICAgIGJvb2xlYW4gZm91bmQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1Yi5sZW5ndGggJiYgZm91bmQ7IGkrKykgeworICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2V0Lmxlbmd0aCAmJiAhZm91bmQ7IGorKykKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHN1YltpXSA9PSBzZXRbal07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGlmIChqb2lucyAhPSBudWxsKQorICAgICAgICAgICAgd2hlcmUoKFN0cmluZykgbnVsbCwgam9pbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgd2hlcmUoc3FsLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKFNRTEJ1ZmZlciBzcWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHdoZXJlKHNxbCwgZ2V0Sm9pbnMoam9pbnMsIHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGNvbmRpdGlvbiB0byB0aGUgV0hFUkUgY2xhdXNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3aGVyZShTUUxCdWZmZXIgc3FsLCBQYXRoSm9pbnMgcGopIHsKKyAgICAgICAgLy8gbm8gbmVlZCB0byB1c2Ugam9pbnMuLi4KKyAgICAgICAgaWYgKHNxbCA9PSBudWxsIHx8IHNxbC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKF93aGVyZSA9PSBudWxsKQorICAgICAgICAgICAgX3doZXJlID0gbmV3IFNRTEJ1ZmZlcihfZGljdCk7CisgICAgICAgIGVsc2UgaWYgKCFfd2hlcmUuaXNFbXB0eSgpKQorICAgICAgICAgICAgX3doZXJlLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgX3doZXJlLmFwcGVuZChzcWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgd2hlcmUoc3FsLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdoZXJlKFN0cmluZyBzcWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIHdoZXJlKHNxbCwgZ2V0Sm9pbnMoam9pbnMsIHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGNvbmRpdGlvbiB0byB0aGUgV0hFUkUgY2xhdXNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3aGVyZShTdHJpbmcgc3FsLCBQYXRoSm9pbnMgcGopIHsKKyAgICAgICAgLy8gbm8gbmVlZCB0byB1c2Ugam9pbnMuLi4KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3FsKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoX3doZXJlID09IG51bGwpCisgICAgICAgICAgICBfd2hlcmUgPSBuZXcgU1FMQnVmZmVyKF9kaWN0KTsKKyAgICAgICAgZWxzZSBpZiAoIV93aGVyZS5pc0VtcHR5KCkpCisgICAgICAgICAgICBfd2hlcmUuYXBwZW5kKCIgQU5EICIpOworICAgICAgICBfd2hlcmUuYXBwZW5kKHNxbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGF2aW5nKFNRTEJ1ZmZlciBzcWwpIHsKKyAgICAgICAgaGF2aW5nKHNxbCwgKEpvaW5zKSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYXZpbmcoU1FMQnVmZmVyIHNxbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgaGF2aW5nKHNxbCwgZ2V0Sm9pbnMoam9pbnMsIHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGNvbmRpdGlvbiB0byB0aGUgSEFWSU5HIGNsYXVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGF2aW5nKFNRTEJ1ZmZlciBzcWwsIFBhdGhKb2lucyBwaikgeworICAgICAgICAvLyBubyBuZWVkIHRvIHVzZSBqb2lucy4uLgorICAgICAgICBpZiAoc3FsID09IG51bGwgfHwgc3FsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoX2hhdmluZyA9PSBudWxsKQorICAgICAgICAgICAgX2hhdmluZyA9IG5ldyBTUUxCdWZmZXIoX2RpY3QpOworICAgICAgICBlbHNlIGlmICghX2hhdmluZy5pc0VtcHR5KCkpCisgICAgICAgICAgICBfaGF2aW5nLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgX2hhdmluZy5hcHBlbmQoc3FsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYXZpbmcoU3RyaW5nIHNxbCkgeworICAgICAgICBoYXZpbmcoc3FsLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhdmluZyhTdHJpbmcgc3FsLCBKb2lucyBqb2lucykgeworICAgICAgICBoYXZpbmcoc3FsLCBnZXRKb2lucyhqb2lucywgdHJ1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gY29uZGl0aW9uIHRvIHRoZSBIQVZJTkcgY2xhdXNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYXZpbmcoU3RyaW5nIHNxbCwgUGF0aEpvaW5zIHBqKSB7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gdXNlIGpvaW5zLi4uCisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHNxbCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKF9oYXZpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIF9oYXZpbmcgPSBuZXcgU1FMQnVmZmVyKF9kaWN0KTsKKyAgICAgICAgZWxzZSBpZiAoIV9oYXZpbmcuaXNFbXB0eSgpKQorICAgICAgICAgICAgX2hhdmluZy5hcHBlbmQoIiBBTkQgIik7CisgICAgICAgIF9oYXZpbmcuYXBwZW5kKHNxbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JvdXBCeShTUUxCdWZmZXIgc3FsKSB7CisgICAgICAgIGdyb3VwQnkoc3FsLCAoSm9pbnMpIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU1FMQnVmZmVyIHNxbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgZ2V0Sm9pbnMoam9pbnMsIHRydWUpOworICAgICAgICBpZiAoX2dyb3VwaW5nID09IG51bGwpCisgICAgICAgICAgICBfZ3JvdXBpbmcgPSBuZXcgU1FMQnVmZmVyKF9kaWN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2dyb3VwaW5nLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgX2dyb3VwaW5nLmFwcGVuZChzcWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoU3RyaW5nIHNxbCkgeworICAgICAgICBncm91cEJ5KHNxbCwgKEpvaW5zKSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KFN0cmluZyBzcWwsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGdldEpvaW5zKGpvaW5zLCB0cnVlKTsKKyAgICAgICAgaWYgKF9ncm91cGluZyA9PSBudWxsKQorICAgICAgICAgICAgX2dyb3VwaW5nID0gbmV3IFNRTEJ1ZmZlcihfZGljdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9ncm91cGluZy5hcHBlbmQoIiwgIik7CisgICAgICAgIF9ncm91cGluZy5hcHBlbmQoc3FsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KENvbHVtbiBjb2wpIHsKKyAgICAgICAgZ3JvdXBCeShjb2wsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ29sdW1uIGNvbCwgSm9pbnMgam9pbnMpIHsKKyAgICAgICAgaWYgKF9ncm91cGluZyA9PSBudWxsKQorICAgICAgICAgICAgX2dyb3VwaW5nID0gbmV3IFNRTEJ1ZmZlcihfZGljdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9ncm91cGluZy5hcHBlbmQoIiwgIik7CisKKyAgICAgICAgUGF0aEpvaW5zIHBqID0gZ2V0Sm9pbnMoam9pbnMsIHRydWUpOworICAgICAgICBfZ3JvdXBpbmcuYXBwZW5kKGdldENvbHVtbkFsaWFzKGNvbCwgcGopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KENvbHVtbltdIGNvbHMpIHsKKyAgICAgICAgZ3JvdXBCeShjb2xzLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncm91cEJ5KENvbHVtbltdIGNvbHMsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIGlmIChfZ3JvdXBpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIF9ncm91cGluZyA9IG5ldyBTUUxCdWZmZXIoX2RpY3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZ3JvdXBpbmcuYXBwZW5kKCIsICIpOworCisgICAgICAgIFBhdGhKb2lucyBwaiA9IGdldEpvaW5zKGpvaW5zLCB0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgX2dyb3VwaW5nLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIF9ncm91cGluZy5hcHBlbmQoZ2V0Q29sdW1uQWxpYXMoY29sc1tpXSwgcGopKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgZ3JvdXBCeShtYXBwaW5nLCBzdWJjbGFzc2VzLCBzdG9yZSwgZmV0Y2gsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyb3VwQnkoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIGludCBzdWJjbGFzc2VzLCBKREJDU3RvcmUgc3RvcmUsCisgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEpvaW5zIGpvaW5zKSB7CisgICAgICAgIC8vIHdlIGltcGxlbWVudCB0aGlzIGJ5IHB1dHRpbmcgb3Vyc2VsdmVzIGludG8gZ3JvdXBpbmcgbW9kZSwgd2hlcmUKKyAgICAgICAgLy8gYWxsIHNlbGVjdCBpbnZvY2F0aW9ucyBhcmUgcmUtcm91dGVkIHRvIGdyb3VwLWJ5IGludm9jYXRpb25zIGluc3RlYWQuCisgICAgICAgIC8vIHRoaXMgYWxsb3dzIHVzIHRvIHV0aWxpemUgdGhlIHNhbWUgc2VsZWN0IEFQSXMgb2YgdGhlIHN0b3JlIG1hbmFnZXIKKyAgICAgICAgLy8gYW5kIGFsbCB0aGUgbWFwcGluZyBzdHJhdGVnaWVzLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gY3JlYXRlIAorICAgICAgICAvLyBlcXVpdmFsZW50IEFQSXMgYW5kIGR1cGxpY2F0ZSBsb2dpYyBmb3IgZ3JvdXBpbmcKKyAgICAgICAgYm9vbGVhbiB3YXNHcm91cGluZyA9IGlzR3JvdXBpbmcoKTsKKyAgICAgICAgX2ZsYWdzIHw9IEdST1VQSU5HOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0KG1hcHBpbmcsIHN1YmNsYXNzZXMsIHN0b3JlLCBmZXRjaCwgCisgICAgICAgICAgICAgICAgRWFnZXJGZXRjaE1vZGVzLkVBR0VSX05PTkUsIGpvaW5zKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghd2FzR3JvdXBpbmcpCisgICAgICAgICAgICAgICAgX2ZsYWdzICY9IH5HUk9VUElORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgd2UncmUgaW4gZ3JvdXAgbW9kZSwgd2hlcmUgYW55IHNlbGVjdCBpcyBjaGFuZ2VkIHRvIGEgZ3JvdXAtYnkKKyAgICAgKiBjYWxsLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0dyb3VwaW5nKCkgeworICAgICAgICByZXR1cm4gKF9mbGFncyAmIEdST1VQSU5HKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgam9pbnMgdG8gdXNlIGZvciBjb2x1bW4gYWxpYXNlcywgZXRjLgorICAgICAqCisgICAgICogQHBhcmFtIGpvaW5zIGpvaW5zIGdpdmVuIGJ5IHRoZSB1c2VyCisgICAgICogQHJldHVybiB0aGUgam9pbnMgdG8gdXNlIGZvciBhbGlhc2VzLCBldGMKKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGhKb2lucyBnZXRKb2lucyhKb2lucyBqb2lucywgYm9vbGVhbiByZWNvcmQpIHsKKyAgICAgICAgUGF0aEpvaW5zIHBqID0gKFBhdGhKb2lucykgam9pbnM7CisgICAgICAgIGJvb2xlYW4gcHJlID0gKHBqID09IG51bGwgfHwgIXBqLmlzRGlydHkoKSkKKyAgICAgICAgICAgICYmIF9wcmVKb2lucyAhPSBudWxsICYmICFfcHJlSm9pbnMuaXNFbXB0eSgpOworICAgICAgICBpZiAocHJlKQorICAgICAgICAgICAgcGogPSAoUGF0aEpvaW5zKSBfcHJlSm9pbnMucGVlaygpOworCisgICAgICAgIGlmIChwaiA9PSBudWxsIHx8ICFwai5pc0RpcnR5KCkpCisgICAgICAgICAgICBwaiA9IF9qb2luczsKKyAgICAgICAgZWxzZSBpZiAoIXByZSkgeworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBPVVRFUikgIT0gMCkKKyAgICAgICAgICAgICAgICBwaiA9IChQYXRoSm9pbnMpIG91dGVyKHBqKTsKKyAgICAgICAgICAgIGlmIChyZWNvcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBqLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUGFyZW50Sm9pbnMocGopOworICAgICAgICAgICAgICAgIGlmICghcGouaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUpvaW5zRnJvbVN1YnNlbGVjdHMocGopOworICAgICAgICAgICAgICAgICAgICBpZiAoX2pvaW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBfam9pbnMgPSBuZXcgU2VsZWN0Sm9pbnModGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfam9pbnMuam9pbnMoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgX2pvaW5zLnNldEpvaW5zKG5ldyBKb2luU2V0KHBqLmpvaW5zKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX2pvaW5zLmpvaW5zKCkuYWRkQWxsKHBqLmpvaW5zKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGo7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBqb2lucyBhbHJlYWR5IGluIG91ciBwYXJlbnQgc2VsZWN0IGZyb20gdGhlIGdpdmVuIG5vbi1lbXB0eQorICAgICAqIGpvaW4gc2V0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQYXJlbnRKb2lucyhQYXRoSm9pbnMgcGopIHsKKyAgICAgICAgaWYgKF9wYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKF9wYXJlbnQuX2pvaW5zICE9IG51bGwgJiYgIV9wYXJlbnQuX2pvaW5zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHBqLmpvaW5zKCkucmVtb3ZlQWxsKF9wYXJlbnQuX2pvaW5zLmpvaW5zKCkpOworICAgICAgICBpZiAoIXBqLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIF9wYXJlbnQucmVtb3ZlUGFyZW50Sm9pbnMocGopOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gbm9uLWVtcHR5IGpvaW5zIGZyb20gdGhlIGpvaW5zIG9mIG91ciBzdWJzZWxlY3RzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZW1vdmVKb2luc0Zyb21TdWJzZWxlY3RzKFBhdGhKb2lucyBwaikgeworICAgICAgICBpZiAoX3N1YnNlbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2VsZWN0SW1wbCBzdWI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3N1YnNlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHN1YiA9IChTZWxlY3RJbXBsKSBfc3Vic2Vscy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoc3ViLl9qb2lucyAhPSBudWxsICYmICFzdWIuX2pvaW5zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzdWIuX2pvaW5zLmpvaW5zKCkucmVtb3ZlQWxsKHBqLmpvaW5zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNlbGVjdEV4ZWN1dG9yIHdoZXJlQ2xvbmUoaW50IHNlbHMpIHsKKyAgICAgICAgaWYgKHNlbHMgPCAxKQorICAgICAgICAgICAgc2VscyA9IDE7CisKKyAgICAgICAgU2VsZWN0W10gY2xvbmVzID0gbnVsbDsKKyAgICAgICAgU2VsZWN0SW1wbCBzZWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsczsgaSsrKSB7CisgICAgICAgICAgICBzZWwgPSAoU2VsZWN0SW1wbCkgX2NvbmYuZ2V0U1FMRmFjdG9yeUluc3RhbmNlKCkubmV3U2VsZWN0KCk7CisgICAgICAgICAgICBzZWwuX2ZsYWdzID0gX2ZsYWdzOworICAgICAgICAgICAgc2VsLl9mbGFncyAmPSB+QUdHUkVHQVRFOworICAgICAgICAgICAgc2VsLl9mbGFncyAmPSB+T1VURVI7CisgICAgICAgICAgICBzZWwuX2ZsYWdzICY9IH5MUlM7CisgICAgICAgICAgICBzZWwuX2ZsYWdzICY9IH5FQUdFUl9UT19PTkU7CisgICAgICAgICAgICBzZWwuX2ZsYWdzICY9IH5FQUdFUl9UT19NQU5ZOworICAgICAgICAgICAgc2VsLl9mbGFncyAmPSB+Rk9SQ0VfQ09VTlQ7CisgICAgICAgICAgICBzZWwuX2pvaW5TeW50YXggPSBfam9pblN5bnRheDsKKyAgICAgICAgICAgIGlmIChfYWxpYXNlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlbC5fYWxpYXNlcyA9IG5ldyBIYXNoTWFwKF9hbGlhc2VzKTsKKyAgICAgICAgICAgIGlmIChfdGFibGVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VsLl90YWJsZXMgPSBuZXcgVHJlZU1hcChfdGFibGVzKTsKKyAgICAgICAgICAgIGlmIChfam9pbnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZWwuX2pvaW5zID0gX2pvaW5zLmNsb25lKHNlbCk7CisgICAgICAgICAgICBpZiAoX3doZXJlICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VsLl93aGVyZSA9IG5ldyBTUUxCdWZmZXIoX3doZXJlKTsKKyAgICAgICAgICAgIGlmIChfZnJvbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VsLl9mcm9tID0gKFNlbGVjdEltcGwpIF9mcm9tLndoZXJlQ2xvbmUoMSk7CisgICAgICAgICAgICAgICAgc2VsLl9mcm9tLl9vdXRlciA9IHNlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfc3Vic2VscyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VsLl9zdWJzZWxzID0gbmV3IEFycmF5TGlzdChfc3Vic2Vscy5zaXplKCkpOworICAgICAgICAgICAgICAgIFNlbGVjdEltcGwgc3ViLCBzZWxTdWI7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfc3Vic2Vscy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBzdWIgPSAoU2VsZWN0SW1wbCkgX3N1YnNlbHMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICBzZWxTdWIgPSAoU2VsZWN0SW1wbCkgc3ViLmZ1bGxDbG9uZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsU3ViLl9wYXJlbnQgPSBzZWw7CisgICAgICAgICAgICAgICAgICAgIHNlbFN1Yi5fc3ViUGF0aCA9IHN1Yi5fc3ViUGF0aDsKKyAgICAgICAgICAgICAgICAgICAgc2VsLl9zdWJzZWxzLmFkZChzZWxTdWIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VsLl93aGVyZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsLl93aGVyZS5yZXBsYWNlKHN1Yiwgc2VsU3ViKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZWxzID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbDsKKyAgICAgICAgICAgIGlmIChjbG9uZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbG9uZXMgPSBuZXcgU2VsZWN0W3NlbHNdOworICAgICAgICAgICAgY2xvbmVzW2ldID0gc2VsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY29uZi5nZXRTUUxGYWN0b3J5SW5zdGFuY2UoKS5uZXdVbmlvbihjbG9uZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciBmdWxsQ2xvbmUoaW50IHNlbHMpIHsKKyAgICAgICAgaWYgKHNlbHMgPCAxKQorICAgICAgICAgICAgc2VscyA9IDE7CisKKyAgICAgICAgU2VsZWN0W10gY2xvbmVzID0gbnVsbDsKKyAgICAgICAgU2VsZWN0SW1wbCBzZWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsczsgaSsrKSB7CisgICAgICAgICAgICBzZWwgPSAoU2VsZWN0SW1wbCkgd2hlcmVDbG9uZSgxKTsKKyAgICAgICAgICAgIHNlbC5fZmxhZ3MgPSBfZmxhZ3M7CisgICAgICAgICAgICBzZWwuX2V4cGVjdGVkUmVzdWx0Q291bnQgPSBfZXhwZWN0ZWRSZXN1bHRDb3VudDsKKyAgICAgICAgICAgIHNlbC5fc2VsZWN0cy5hZGRBbGwoX3NlbGVjdHMpOworICAgICAgICAgICAgaWYgKF9vcmRlcmluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlbC5fb3JkZXJpbmcgPSBuZXcgU1FMQnVmZmVyKF9vcmRlcmluZyk7CisgICAgICAgICAgICBzZWwuX29yZGVycyA9IF9vcmRlcnM7CisgICAgICAgICAgICBpZiAoX2dyb3VwaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VsLl9ncm91cGluZyA9IG5ldyBTUUxCdWZmZXIoX2dyb3VwaW5nKTsKKyAgICAgICAgICAgIGlmIChfaGF2aW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VsLl9oYXZpbmcgPSBuZXcgU1FMQnVmZmVyKF9oYXZpbmcpOworICAgICAgICAgICAgaWYgKF9mcm9tICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWwuX2Zyb20gPSAoU2VsZWN0SW1wbCkgX2Zyb20uZnVsbENsb25lKDEpOworICAgICAgICAgICAgICAgIHNlbC5fZnJvbS5fb3V0ZXIgPSBzZWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZWxzID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbDsKKyAgICAgICAgICAgIGlmIChjbG9uZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbG9uZXMgPSBuZXcgU2VsZWN0W3NlbHNdOworICAgICAgICAgICAgY2xvbmVzW2ldID0gc2VsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY29uZi5nZXRTUUxGYWN0b3J5SW5zdGFuY2UoKS5uZXdVbmlvbihjbG9uZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTZWxlY3RFeGVjdXRvciBlYWdlckNsb25lKEZpZWxkTWFwcGluZyBrZXksIGludCBlYWdlclR5cGUsCisgICAgICAgIGJvb2xlYW4gdG9NYW55LCBpbnQgc2VscykgeworICAgICAgICBpZiAoZWFnZXJUeXBlID09IEVBR0VSX09VVEVSCisgICAgICAgICAgICAmJiBfam9pblN5bnRheCA9PSBKb2luU3ludGF4ZXMuU1lOVEFYX1RSQURJVElPTkFMKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChfZWFnZXJLZXlzICE9IG51bGwgJiYgX2VhZ2VyS2V5cy5jb250YWlucyhrZXkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gZ2xvYmFsIHNldCBvZiBlYWdlciBrZXlzCisgICAgICAgIGlmIChfZWFnZXJLZXlzID09IG51bGwpCisgICAgICAgICAgICBfZWFnZXJLZXlzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgX2VhZ2VyS2V5cy5hZGQoa2V5KTsKKworICAgICAgICBTZWxlY3RFeGVjdXRvciBzZWw7CisgICAgICAgIGlmIChlYWdlclR5cGUgIT0gRUFHRVJfUEFSQUxMRUwpIHsKKyAgICAgICAgICAgIGlmICh0b01hbnkpCisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEVBR0VSX1RPX01BTlk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEVBR0VSX1RPX09ORTsKKyAgICAgICAgICAgIHNlbCA9IHRoaXM7CisgICAgICAgIH0gZWxzZSBpZiAoc2VscyA8IDIpCisgICAgICAgICAgICBzZWwgPSBwYXJhbGxlbENsb25lKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgU2VsZWN0W10gY2xvbmVzID0gbmV3IFNlbGVjdFtzZWxzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xvbmVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNsb25lc1tpXSA9IHBhcmFsbGVsQ2xvbmUoKTsKKyAgICAgICAgICAgIHNlbCA9IF9jb25mLmdldFNRTEZhY3RvcnlJbnN0YW5jZSgpLm5ld1VuaW9uKGNsb25lcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2VhZ2VyID09IG51bGwpCisgICAgICAgICAgICBfZWFnZXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBfZWFnZXIucHV0KHRvRWFnZXJLZXkoa2V5LCBnZXRKb2lucyhudWxsLCBmYWxzZSkpLCBzZWwpOworICAgICAgICByZXR1cm4gc2VsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgc2VsZWN0IGZvciB1c2UgaW4gZWFnZXIgcGFyYWxsZWwgc2VsZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlbGVjdEltcGwgcGFyYWxsZWxDbG9uZSgpIHsKKyAgICAgICAgU2VsZWN0SW1wbCBzZWwgPSAoU2VsZWN0SW1wbCkgd2hlcmVDbG9uZSgxKTsKKyAgICAgICAgc2VsLl9mbGFncyAmPSB+Tk9OQVVUT19ESVNUSU5DVDsKKyAgICAgICAgc2VsLl9lYWdlcktleXMgPSBfZWFnZXJLZXlzOworICAgICAgICBpZiAoX3ByZUpvaW5zICE9IG51bGwgJiYgIV9wcmVKb2lucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNlbC5fcHJlSm9pbnMgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgICAgIHNlbC5fcHJlSm9pbnMucHVzaCgoKFNlbGVjdEpvaW5zKSBfcHJlSm9pbnMucGVlaygpKS4KKyAgICAgICAgICAgICAgICBjbG9uZShzZWwpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB2aWV3IG9mIGVhZ2VyIHNlbGVjdHMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0RWFnZXJNYXAoKSB7CisgICAgICAgIHJldHVybiBfZWFnZXI7CisgICAgfQorCisgICAgcHVibGljIFNlbGVjdEV4ZWN1dG9yIGdldEVhZ2VyKEZpZWxkTWFwcGluZyBrZXkpIHsKKyAgICAgICAgaWYgKF9lYWdlciA9PSBudWxsIHx8ICFfZWFnZXJLZXlzLmNvbnRhaW5zKGtleSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChTZWxlY3RFeGVjdXRvcikgX2VhZ2VyLmdldCh0b0VhZ2VyS2V5KGtleSwgZ2V0Sm9pbnMobnVsbCwKKyAgICAgICAgICAgIGZhbHNlKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZWFnZXIga2V5IHRvIHVzZSBmb3IgdGhlIHVzZXItZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCB0b0VhZ2VyS2V5KEZpZWxkTWFwcGluZyBrZXksIFBhdGhKb2lucyBwaikgeworICAgICAgICBpZiAocGogPT0gbnVsbCB8fCBwai5wYXRoKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIHJldHVybiBuZXcgS2V5KHBqLnBhdGgoKS50b1N0cmluZygpLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBuZXdKb2lucygpIHsKKyAgICAgICAgaWYgKF9wcmVKb2lucyAhPSBudWxsICYmICFfcHJlSm9pbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTZWxlY3RKb2lucyBzaiA9IChTZWxlY3RKb2lucykgX3ByZUpvaW5zLnBlZWsoKTsKKyAgICAgICAgICAgIHJldHVybiBzai5jbG9uZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXR1cm4gdGhpcyBmb3IgZWZmaWNpZW5jeSBpbiBjYXNlIG5vIGpvaW5zIGVuZCB1cCBiZWluZyBtYWRlCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBuZXdPdXRlckpvaW5zKCkgeworICAgICAgICByZXR1cm4gKChQYXRoSm9pbnMpIG5ld0pvaW5zKCkpLnNldE91dGVyKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTUUxCdWZmZXIgYnVmLCBKb2lucyBqb2lucykgeworICAgICAgICBpZiAoam9pbnMgPT0gbnVsbCB8fCBqb2lucy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCFidWYuaXNFbXB0eSgpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgSm9pbiBqb2luID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSAoKFBhdGhKb2lucykgam9pbnMpLmpvaW5zKCkuam9pbkl0ZXJhdG9yKCk7CisgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgam9pbiA9IChKb2luKSBpdHIubmV4dCgpOworICAgICAgICAgICAgc3dpdGNoIChfam9pblN5bnRheCkgeworICAgICAgICAgICAgICAgIGNhc2UgSm9pblN5bnRheGVzLlNZTlRBWF9UUkFESVRJT05BTDoKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChfZGljdC50b1RyYWRpdGlvbmFsSm9pbihqb2luKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSm9pblN5bnRheGVzLlNZTlRBWF9EQVRBQkFTRToKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChfZGljdC50b05hdGl2ZUpvaW4oam9pbikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIEFORCAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBhbmQoSm9pbnMgam9pbnMxLCBKb2lucyBqb2luczIpIHsKKyAgICAgICAgcmV0dXJuIGFuZCgoUGF0aEpvaW5zKSBqb2luczEsIChQYXRoSm9pbnMpIGpvaW5zMiwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tYmluZSB0aGUgZ2l2ZW4gam9pbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTZWxlY3RKb2lucyBhbmQoUGF0aEpvaW5zIGoxLCBQYXRoSm9pbnMgajIsIGJvb2xlYW4gbnVsbEpvaW5zKSB7CisgICAgICAgIGlmICgoajEgPT0gbnVsbCB8fCBqMS5pc0VtcHR5KCkpCisgICAgICAgICAgICAmJiAoajIgPT0gbnVsbCB8fCBqMi5pc0VtcHR5KCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU2VsZWN0Sm9pbnMgc2ogPSBuZXcgU2VsZWN0Sm9pbnModGhpcyk7CisgICAgICAgIGlmIChqMSA9PSBudWxsIHx8IGoxLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG51bGxKb2lucykKKyAgICAgICAgICAgICAgICBzai5zZXRKb2lucyhqMi5qb2lucygpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzai5zZXRKb2lucyhuZXcgSm9pblNldChqMi5qb2lucygpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBKb2luU2V0IHNldDsKKyAgICAgICAgICAgIGlmIChudWxsSm9pbnMpCisgICAgICAgICAgICAgICAgc2V0ID0gajEuam9pbnMoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXQgPSBuZXcgSm9pblNldChqMS5qb2lucygpKTsKKworICAgICAgICAgICAgaWYgKGoyICE9IG51bGwgJiYgIWoyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzZXQuYWRkQWxsKGoyLmpvaW5zKCkpOworICAgICAgICAgICAgc2ouc2V0Sm9pbnMoc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG51bGwgcHJldmlvdXMgam9pbnM7IGFsbCBhcmUgY29tYmluZWQgaW50byB0aGlzIG9uZQorICAgICAgICBpZiAobnVsbEpvaW5zICYmIGoxICE9IG51bGwpCisgICAgICAgICAgICBqMS5udWxsSm9pbnMoKTsKKyAgICAgICAgaWYgKG51bGxKb2lucyAmJiBqMiAhPSBudWxsKQorICAgICAgICAgICAgajIubnVsbEpvaW5zKCk7CisKKyAgICAgICAgcmV0dXJuIHNqOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBvcihKb2lucyBqb2luczEsIEpvaW5zIGpvaW5zMikgeworICAgICAgICBQYXRoSm9pbnMgajEgPSAoUGF0aEpvaW5zKSBqb2luczE7CisgICAgICAgIFBhdGhKb2lucyBqMiA9IChQYXRoSm9pbnMpIGpvaW5zMjsKKworICAgICAgICAvLyBpZiBubyBjb21tb24gam9pbnMsIHJldHVybiBudWxsOyBpZiBvbmUgc2lkZSBvZiB0aGUgb3IgY2xhdXNlIGhhcworICAgICAgICAvLyBkaWZmZXJlbnQgam9pbnMgdGhhbiB0aGUgb3RoZXIsIHRoZW4gd2UgbmVlZCB0byB1c2UgZGlzdGluY3QKKyAgICAgICAgYm9vbGVhbiBqMUVtcHR5ID0gajEgPT0gbnVsbCB8fCBqMS5pc0VtcHR5KCk7CisgICAgICAgIGJvb2xlYW4gajJFbXB0eSA9IGoyID09IG51bGwgfHwgajIuaXNFbXB0eSgpOworICAgICAgICBpZiAoajFFbXB0eSB8fCBqMkVtcHR5KSB7CisgICAgICAgICAgICBpZiAoajFFbXB0eSAmJiAhajJFbXB0eSkgeworICAgICAgICAgICAgICAgIGNvbGxlY3RPdXRlckpvaW5zKGoyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWoyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IElNUExJQ0lUX0RJU1RJTkNUOworICAgICAgICAgICAgfSBlbHNlIGlmIChqMkVtcHR5ICYmICFqMUVtcHR5KSB7CisgICAgICAgICAgICAgICAgY29sbGVjdE91dGVySm9pbnMoajEpOworICAgICAgICAgICAgICAgIGlmICghajEuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gSU1QTElDSVRfRElTVElOQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIGFsbCBjb21tb24gam9pbnMsIG1vdmUgYWxsIGpvaW5zIHRvIHJldHVybmVkIGluc3RhbmNlCisgICAgICAgIFNlbGVjdEpvaW5zIHNqID0gbmV3IFNlbGVjdEpvaW5zKHRoaXMpOworICAgICAgICBpZiAoajEuam9pbnMoKS5lcXVhbHMoajIuam9pbnMoKSkpIHsKKyAgICAgICAgICAgIHNqLnNldEpvaW5zKGoxLmpvaW5zKCkpOworICAgICAgICAgICAgajEubnVsbEpvaW5zKCk7CisgICAgICAgICAgICBqMi5udWxsSm9pbnMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEpvaW5TZXQgY29tbW9uSm9pbnMgPSBuZXcgSm9pblNldChqMS5qb2lucygpKTsKKyAgICAgICAgICAgIGNvbW1vbkpvaW5zLnJldGFpbkFsbChqMi5qb2lucygpKTsKKyAgICAgICAgICAgIGlmICghY29tbW9uSm9pbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gcHV0IGNvbW1vbiBqb2lucyBpbiByZXR1cm5lZCBpbnN0YW5jZTsgcmVtb3ZlIHRoZW0gZnJvbQorICAgICAgICAgICAgICAgIC8vIGVhY2ggZ2l2ZW4gaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBzai5zZXRKb2lucyhjb21tb25Kb2lucyk7CisgICAgICAgICAgICAgICAgajEuam9pbnMoKS5yZW1vdmVBbGwoY29tbW9uSm9pbnMpOworICAgICAgICAgICAgICAgIGoyLmpvaW5zKCkucmVtb3ZlQWxsKGNvbW1vbkpvaW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbGxlY3RPdXRlckpvaW5zKGoxKTsKKyAgICAgICAgICAgIGNvbGxlY3RPdXRlckpvaW5zKGoyKTsKKworICAgICAgICAgICAgLy8gaWYgb25lIHNpZGUgb2YgdGhlIG9yIGNsYXVzZSBoYXMgZGlmZmVyZW50IGpvaW5zIHRoYW4gdGhlIG90aGVyLAorICAgICAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIHVzZSBkaXN0aW5jdAorICAgICAgICAgICAgaWYgKCFqMS5pc0VtcHR5KCkgfHwgIWoyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gSU1QTElDSVRfRElTVElOQ1Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNqOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBvdXRlcihKb2lucyBqb2lucykgeworICAgICAgICBpZiAoX2pvaW5TeW50YXggPT0gSm9pblN5bnRheGVzLlNZTlRBWF9UUkFESVRJT05BTCB8fCBqb2lucyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGpvaW5zOworCisgICAgICAgIC8vIHJlY29yZCB0aGF0IHRoaXMgaXMgYW4gb3V0ZXIgam9pbiBzZXQsIGV2ZW4gaWYgaXQncyBlbXB0eQorICAgICAgICBQYXRoSm9pbnMgcGogPSAoKFBhdGhKb2lucykgam9pbnMpLnNldE91dGVyKHRydWUpOworICAgICAgICBpZiAocGouaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHBqOworCisgICAgICAgIEpvaW4gam9pbjsKKyAgICAgICAgSm9pbiByZWM7CisgICAgICAgIGJvb2xlYW4gaGFzSm9pbnMgPSBfam9pbnMgIT0gbnVsbCAmJiBfam9pbnMuam9pbnMoKSAhPSBudWxsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHBqLmpvaW5zKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGpvaW4gPSAoSm9pbikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChqb2luLmdldFR5cGUoKSA9PSBKb2luLlRZUEVfSU5ORVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0pvaW5zKQorICAgICAgICAgICAgICAgICAgICBqb2luLnNldFR5cGUoSm9pbi5UWVBFX09VVEVSKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjID0gX2pvaW5zLmpvaW5zKCkuZ2V0UmVjb3JkZWRKb2luKGpvaW4pOworICAgICAgICAgICAgICAgICAgICBpZiAocmVjID09IG51bGwgfHwgcmVjLmdldFR5cGUoKSA9PSBKb2luLlRZUEVfT1VURVIpCisgICAgICAgICAgICAgICAgICAgICAgICBqb2luLnNldFR5cGUoSm9pbi5UWVBFX09VVEVSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGpvaW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBqb2lucyBmcm9tIHRoZSBnaXZlbiBpbnN0YW5jZSBpbnRvIG91ciBvdXRlciBqb2lucyBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RPdXRlckpvaW5zKFBhdGhKb2lucyBwaikgeworICAgICAgICBpZiAoX2pvaW5TeW50YXggPT0gSm9pblN5bnRheGVzLlNZTlRBWF9UUkFESVRJT05BTCB8fCBwaiA9PSBudWxsCisgICAgICAgICAgICB8fCBwai5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKF9qb2lucyA9PSBudWxsKQorICAgICAgICAgICAgX2pvaW5zID0gbmV3IFNlbGVjdEpvaW5zKHRoaXMpOworCisgICAgICAgIGJvb2xlYW4gYWRkID0gdHJ1ZTsKKyAgICAgICAgaWYgKF9qb2lucy5qb2lucygpID09IG51bGwpIHsKKyAgICAgICAgICAgIF9qb2lucy5zZXRKb2lucyhwai5qb2lucygpKTsKKyAgICAgICAgICAgIGFkZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgSm9pbiBqb2luOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHBqLmpvaW5zKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGpvaW4gPSAoSm9pbikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChqb2luLmdldFR5cGUoKSA9PSBKb2luLlRZUEVfSU5ORVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoam9pbi5nZXRGb3JlaWduS2V5KCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAhX2RpY3QuY2FuT3V0ZXJKb2luKF9qb2luU3ludGF4LCBqb2luLmdldEZvcmVpZ25LZXkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nIGxvZyA9IF9jb25mLmdldExvZyhKREJDQ29uZmlndXJhdGlvbi5MT0dfSkRCQyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImNhbnQtb3V0ZXItZmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uZ2V0Rm9yZWlnbktleSgpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGpvaW4uc2V0VHlwZShKb2luLlRZUEVfT1VURVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZCkKKyAgICAgICAgICAgICAgICBfam9pbnMuam9pbnMoKS5hZGQoam9pbik7CisgICAgICAgIH0KKyAgICAgICAgcGoubnVsbEpvaW5zKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGlhcyBmb3IgdGhlIGdpdmVuIHRhYmxlIHVuZGVyIHRoZSBnaXZlbiBqb2lucy4KKyAgICAgKiBOT1RFOiBXRSBSRUxZIE9OIFRIRVNFIElOREVYRVMgQkVJTkcgTU9OT1RPTklDQUxMWSBJTkNSRUFTSU5HIEZST00gMAorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldFRhYmxlSW5kZXgoVGFibGUgdGFibGUsIFBhdGhKb2lucyBwaiwgYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGZyb20gc2VsZWN0LCB0aGVuIHRoZXJlIGFyZSBubyB0YWJsZSBhbGlhc2VzCisgICAgICAgIGlmIChfZnJvbSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIE9iamVjdCBrZXkgPSB0YWJsZS5nZXRGdWxsTmFtZSgpOworICAgICAgICBpZiAocGogIT0gbnVsbCAmJiBwai5wYXRoKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGtleSA9IG5ldyBLZXkocGoucGF0aCgpLnRvU3RyaW5nKCksIGtleSk7CisKKyAgICAgICAgLy8gY2hlY2sgb3V0IGV4aXN0aW5nIGFsaWFzZXMKKyAgICAgICAgSW50ZWdlciBpID0gZmluZEFsaWFzKHRhYmxlLCBrZXksIGZhbHNlLCBudWxsKTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7CisgICAgICAgIGlmICghY3JlYXRlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8vIG5vdCBmb3VuZDsgY3JlYXRlIGFsaWFzCisgICAgICAgIGkgPSBOdW1iZXJzLnZhbHVlT2YoYWxpYXNTaXplKCkpOworICAgICAgICByZWNvcmRUYWJsZUFsaWFzKHRhYmxlLCBrZXksIGkpOworICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gZmluZCB0aGUgYWxpYXMgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbVBhcmVudCB3aGV0aGVyIGEgcGFyZW50IGlzIGNoZWNraW5nIGl0cyBzdWJzZWxlY3RzCisgICAgICogQHBhcmFtIGZyb21TdWIgdGhlIHN1YnNlbGVjdCBjaGVja2luZyBpdHMgcGFyZW50CisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGZpbmRBbGlhcyhUYWJsZSB0YWJsZSwgT2JqZWN0IGtleSwgYm9vbGVhbiBmcm9tUGFyZW50LAorICAgICAgICBTZWxlY3RJbXBsIGZyb21TdWIpIHsKKyAgICAgICAgSW50ZWdlciBhbGlhcyA9IG51bGw7CisgICAgICAgIGlmIChfYWxpYXNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBhbGlhcyA9IChJbnRlZ2VyKSAoKGZyb21QYXJlbnQpID8gX2FsaWFzZXMucmVtb3ZlKGtleSkKKyAgICAgICAgICAgICAgICA6IF9hbGlhc2VzLmdldChrZXkpKTsKKyAgICAgICAgICAgIGlmIChhbGlhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb21QYXJlbnQpCisgICAgICAgICAgICAgICAgICAgIF90YWJsZXMucmVtb3ZlKGFsaWFzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmcm9tUGFyZW50ICYmIF9wYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWxpYXMgPSBfcGFyZW50LmZpbmRBbGlhcyh0YWJsZSwga2V5LCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9zdWJzZWxzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNlbGVjdEltcGwgc3ViOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc3Vic2Vscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHN1YiA9IChTZWxlY3RJbXBsKSBfc3Vic2Vscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHN1YiA9PSBmcm9tU3ViKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3ViLl9hbGlhc2VzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzdWIuX2FsaWFzZXMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWIuX3RhYmxlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViLl90YWJsZXMucmVtb3ZlKGFsaWFzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbGlhcyA9IHN1Yi5maW5kQWxpYXModGFibGUsIGtleSwgdHJ1ZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZnJvbVBhcmVudCAmJiBhbGlhcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVGFibGVBbGlhcyh0YWJsZSwga2V5LCBhbGlhcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGlhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIG1hcHBpbmcgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gYWxpYXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlY29yZFRhYmxlQWxpYXMoVGFibGUgdGFibGUsIE9iamVjdCBrZXksIEludGVnZXIgYWxpYXMpIHsKKyAgICAgICAgaWYgKF9hbGlhc2VzID09IG51bGwpCisgICAgICAgICAgICBfYWxpYXNlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIF9hbGlhc2VzLnB1dChrZXksIGFsaWFzKTsKKworICAgICAgICBTdHJpbmcgdGFibGVTdHJpbmcgPSBfZGljdC5nZXRGdWxsTmFtZSh0YWJsZSwgZmFsc2UpICsgIiAiCisgICAgICAgICAgICArIHRvQWxpYXMoYWxpYXMuaW50VmFsdWUoKSk7CisgICAgICAgIGlmIChfdGFibGVzID09IG51bGwpCisgICAgICAgICAgICBfdGFibGVzID0gbmV3IFRyZWVNYXAoKTsKKyAgICAgICAgX3RhYmxlcy5wdXQoYWxpYXMsIHRhYmxlU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mIGFsaWFzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYWxpYXNTaXplKCkgeworICAgICAgICByZXR1cm4gYWxpYXNTaXplKGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mIGFsaWFzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbVBhcmVudCB3aGV0aGVyIGEgcGFyZW50IGlzIGNoZWNraW5nIGl0cyBzdWJzZWxlY3RzCisgICAgICogQHBhcmFtIGZyb21TdWIgdGhlIHN1YnNlbGVjdCBjaGVja2luZyBpdHMgcGFyZW50CisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYWxpYXNTaXplKGJvb2xlYW4gZnJvbVBhcmVudCwgU2VsZWN0SW1wbCBmcm9tU3ViKSB7CisgICAgICAgIGludCBhbGlhc2VzID0gKGZyb21QYXJlbnQgfHwgX3BhcmVudCA9PSBudWxsKSA/IDAKKyAgICAgICAgICAgIDogX3BhcmVudC5hbGlhc1NpemUoZmFsc2UsIHRoaXMpOworICAgICAgICBhbGlhc2VzICs9IChfYWxpYXNlcyA9PSBudWxsKSA/IDAgOiBfYWxpYXNlcy5zaXplKCk7CisgICAgICAgIGlmIChfc3Vic2VscyAhPSBudWxsKSB7CisgICAgICAgICAgICBTZWxlY3RJbXBsIHN1YjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3N1YnNlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdWIgPSAoU2VsZWN0SW1wbCkgX3N1YnNlbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChzdWIgIT0gZnJvbVN1YikKKyAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyArPSBzdWIuYWxpYXNTaXplKHRydWUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGlhc2VzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0b1NlbGVjdChmYWxzZSwgbnVsbCkuZ2V0U1FMKCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFBhdGhKb2lucyBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3V0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0aEpvaW5zIHNldE91dGVyKGJvb2xlYW4gb3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RKb2lucyh0aGlzKS5zZXRPdXRlcih0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBwYXRoKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pblNldCBqb2lucygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBqb2luQ291bnQoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG51bGxKb2lucygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgY3Jvc3NKb2luKFRhYmxlIGxvY2FsVGFibGUsIFRhYmxlIGZvcmVpZ25UYWJsZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEpvaW5zKHRoaXMpLmNyb3NzSm9pbihsb2NhbFRhYmxlLCBmb3JlaWduVGFibGUpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBqb2luKEZvcmVpZ25LZXkgZmssIGJvb2xlYW4gaW52ZXJzZSwgYm9vbGVhbiB0b01hbnkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RKb2lucyh0aGlzKS5qb2luKGZrLCBpbnZlcnNlLCB0b01hbnkpOworICAgIH0KKworICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW4oRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEpvaW5zKHRoaXMpLm91dGVySm9pbihmaywgaW52ZXJzZSwgdG9NYW55KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgam9pblJlbGF0aW9uKFN0cmluZyBuYW1lLCBGb3JlaWduS2V5IGZrLCBDbGFzc01hcHBpbmcgdGFyZ2V0LAorICAgICAgICBpbnQgc3VicywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEpvaW5zKHRoaXMpLmpvaW5SZWxhdGlvbihuYW1lLCBmaywgdGFyZ2V0LCBzdWJzLCAKKyAgICAgICAgICAgIGludmVyc2UsIHRvTWFueSk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIG91dGVySm9pblJlbGF0aW9uKFN0cmluZyBuYW1lLCBGb3JlaWduS2V5IGZrLCAKKyAgICAgICAgQ2xhc3NNYXBwaW5nIHRhcmdldCwgaW50IHN1YnMsIGJvb2xlYW4gaW52ZXJzZSwgYm9vbGVhbiB0b01hbnkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RKb2lucyh0aGlzKS5vdXRlckpvaW5SZWxhdGlvbihuYW1lLCBmaywgdGFyZ2V0LCBzdWJzLCAKKyAgICAgICAgICAgIGludmVyc2UsIHRvTWFueSk7CisgICAgfQorCisgICAgcHVibGljIEpvaW5zIHNldFZhcmlhYmxlKFN0cmluZyB2YXIpIHsKKyAgICAgICAgaWYgKHZhciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgU2VsZWN0Sm9pbnModGhpcykuc2V0VmFyaWFibGUodmFyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSm9pbnMgc2V0U3Vic2VsZWN0KFN0cmluZyBhbGlhcykgeworICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEpvaW5zKHRoaXMpLnNldFN1YnNlbGVjdChhbGlhcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIFNRTCBzdHJpbmcgc2VsZWN0ZWQgd2l0aCBudWxsIGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxJZCB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHBsYWNlaG9sZGVyIFNRTCBzdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGxhY2Vob2xkZXIgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEtleSB0eXBlIHVzZWQgZm9yIGFsaWFzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2V5IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX2tleTsKKworICAgICAgICBwdWJsaWMgS2V5KFN0cmluZyBwYXRoLCBPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBfcGF0aCA9IHBhdGg7CisgICAgICAgICAgICBfa2V5ID0ga2V5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcGF0aC5oYXNoQ29kZSgpIF4gX2tleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAob3RoZXIuZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEtleSBrID0gKEtleSkgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gay5fcGF0aC5lcXVhbHMoX3BhdGgpICYmIGsuX2tleS5lcXVhbHMoX2tleSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIF9wYXRoICsgInwiICsgX2tleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEge0BsaW5rIFJlc3VsdH0gaW1wbGVtZW50YXRpb24gd3JhcHBlZCBhcm91bmQgdGhpcyBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3RSZXN1bHQKKyAgICAgICAgZXh0ZW5kcyBSZXN1bHRTZXRSZXN1bHQKKyAgICAgICAgaW1wbGVtZW50cyBQYXRoSm9pbnMgeworCisgICAgICAgIHByaXZhdGUgU2VsZWN0SW1wbCBfc2VsID0gbnVsbDsKKworICAgICAgICAvLyBwb3NpdGlvbiBpbiBzZWxlY3RlZCBjb2x1bW5zIGxpc3Qgd2hlcmUgd2UgZXhwZWN0IHRoZSBuZXh0IGxvYWQKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3BvcyA9IDA7CisgICAgICAgIHByaXZhdGUgU3RhY2sgX3ByZUpvaW5zID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU2VsZWN0UmVzdWx0KENvbm5lY3Rpb24gY29ubiwgU3RhdGVtZW50IHN0bW50LCBSZXN1bHRTZXQgcnMsCisgICAgICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCkgeworICAgICAgICAgICAgc3VwZXIoY29ubiwgc3RtbnQsIHJzLCBkaWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZWxlY3QgZm9yIHRoaXMgcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNlbGVjdEltcGwgZ2V0U2VsZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9zZWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VsZWN0IGZvciB0aGlzIHJlc3VsdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdChTZWxlY3RJbXBsIHNlbCkgeworICAgICAgICAgICAgX3NlbCA9IHNlbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RWFnZXIoRmllbGRNYXBwaW5nIGtleSkgeworICAgICAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGNyZWF0aW5nIGtleSBpZiB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55CisgICAgICAgICAgICAvLyBlYWdlciByZXN1bHRzCisgICAgICAgICAgICBpZiAoX3NlbC5fZWFnZXIgPT0gbnVsbCB8fCAhX3NlbC5fZWFnZXJLZXlzLmNvbnRhaW5zKGtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBNYXAgbWFwID0gU2VsZWN0UmVzdWx0LnRoaXMuZ2V0RWFnZXJNYXAodHJ1ZSk7CisgICAgICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gbWFwLmdldChfc2VsLnRvRWFnZXJLZXkoa2V5LCBnZXRKb2lucyhudWxsKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0RWFnZXIoRmllbGRNYXBwaW5nIGtleSwgT2JqZWN0IHJlcykgeworICAgICAgICAgICAgTWFwIG1hcCA9IFNlbGVjdFJlc3VsdC50aGlzLmdldEVhZ2VyTWFwKHRydWUpOworICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICBzZXRFYWdlck1hcChtYXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwLnB1dChfc2VsLnRvRWFnZXJLZXkoa2V5LCBnZXRKb2lucyhudWxsKSksIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGxvYWQoQ2xhc3NNYXBwaW5nIG1hcHBpbmcsIEpEQkNTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEpvaW5zIGpvaW5zKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBib29sZWFuIGhhc0pvaW5zID0gam9pbnMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICgoUGF0aEpvaW5zKSBqb2lucykucGF0aCgpICE9IG51bGw7CisgICAgICAgICAgICBpZiAoaGFzSm9pbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ByZUpvaW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9wcmVKb2lucyA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgICAgIF9wcmVKb2lucy5wdXNoKGpvaW5zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHN1cGVyLmxvYWQobWFwcGluZywgc3RvcmUsIGZldGNoLCBqb2lucyk7CisKKyAgICAgICAgICAgIC8vIHJlc2V0CisgICAgICAgICAgICBpZiAoaGFzSm9pbnMpCisgICAgICAgICAgICAgICAgX3ByZUpvaW5zLnBvcCgpOworICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBuZXdKb2lucygpIHsKKyAgICAgICAgICAgIFBhdGhKb2lucyBwcmUgPSBnZXRQcmVKb2lucygpOworICAgICAgICAgICAgaWYgKHByZSA9PSBudWxsIHx8IHByZS5wYXRoKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICAgICAgUGF0aEpvaW5zSW1wbCBwaiA9IG5ldyBQYXRoSm9pbnNJbXBsKCk7CisgICAgICAgICAgICBwai5wYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihwcmUucGF0aCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHBqOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNJbnRlcm5hbChPYmplY3Qgb2JqLCBKb2lucyBqb2lucykgeworICAgICAgICAgICAgLy8gd2Uga2V5IGRpcmVjdGx5IG9uIG9ianMgYW5kIGpvaW4tbGVzcyBjb2xzLCBvciBvbiB0aGUgYWxpYXMKKyAgICAgICAgICAgIC8vIGZvciBjb2xzIHdpdGggam9pbnMKKyAgICAgICAgICAgIFBhdGhKb2lucyBwaiA9IGdldEpvaW5zKGpvaW5zKTsKKyAgICAgICAgICAgIGlmIChwaiAhPSBudWxsICYmIHBqLnBhdGgoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG9iaiA9IGdldENvbHVtbkFsaWFzKChDb2x1bW4pIG9iaiwgcGopOworICAgICAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF9zZWwuX3NlbGVjdHMuY29udGFpbnMob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zQWxsSW50ZXJuYWwoT2JqZWN0W10gb2JqcywgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFBhdGhKb2lucyBwaiA9IGdldEpvaW5zKGpvaW5zKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGogIT0gbnVsbCAmJiBwai5wYXRoKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gZ2V0Q29sdW1uQWxpYXMoKENvbHVtbikgb2Jqc1tpXSwgcGopOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gb2Jqc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIV9zZWwuX3NlbGVjdHMuY29udGFpbnMob2JqKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwdXNoQmFjaygpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9wb3MgPSAwOworICAgICAgICAgICAgc3VwZXIucHVzaEJhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGFic29sdXRlSW50ZXJuYWwoaW50IHJvdykKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3BvcyA9IDA7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuYWJzb2x1dGVJbnRlcm5hbChyb3cpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbmV4dEludGVybmFsKCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgX3BvcyA9IDA7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIubmV4dEludGVybmFsKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRPYmplY3QoT2JqZWN0IG9iaiwgSm9pbnMgam9pbnMpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfcG9zID09IF9zZWwuX3NlbGVjdHMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIF9wb3MgPSAwOworCisgICAgICAgICAgICAvLyB3ZSBrZXkgZGlyZWN0bHkgb24gb2JqcyBhbmQgam9pbi1sZXNzIGNvbHMsIG9yIG9uIHRoZSBhbGlhcworICAgICAgICAgICAgLy8gZm9yIGNvbHMgd2l0aCBqb2lucworICAgICAgICAgICAgUGF0aEpvaW5zIHBqID0gZ2V0Sm9pbnMoam9pbnMpOworICAgICAgICAgICAgQm9vbGVhbiBwayA9IG51bGw7CisgICAgICAgICAgICBpZiAocGogIT0gbnVsbCAmJiBwai5wYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbHVtbiBjb2wgPSAoQ29sdW1uKSBvYmo7CisgICAgICAgICAgICAgICAgcGsgPSAoY29sLmlzUHJpbWFyeUtleSgpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICAgICAgb2JqID0gZ2V0Q29sdW1uQWxpYXMoY29sLCBwaik7CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKGNvbC5nZXRUYWJsZSgpICsgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwai5wYXRoKCkgKyAiICgiICsgX3NlbC5fYWxpYXNlcyArICIpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdlIGxvYWQgaW4gdGhlIHNhbWUgb3JkZXIgd2Ugc2VsZWN0LCBtb3JlIG9yIGxlc3MuLi4KKyAgICAgICAgICAgIGlmIChfc2VsLl9zZWxlY3RzLmdldChfcG9zKS5lcXVhbHMob2JqKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKytfcG9zOworCisgICAgICAgICAgICAvLyBpZiB3ZSdyZSBsb29raW5nIGZvciBhIHByaW1hcnkga2V5LCB0cnkgYmFjayBhIGNvdXBsZSBwbGFjZXMsCisgICAgICAgICAgICAvLyBzaW5jZSBwa3MgbWlnaHQgYmUgc2VsZWN0ZWQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgb3JkZXIgdGhhbgorICAgICAgICAgICAgLy8gdGhleSBhcmUgbG9hZGVkIGJhY2s7IGRvbid0IGNoYW5nZSB0aGUgbWFya2VyIHBvc2l0aW9uCisgICAgICAgICAgICBpZiAocGsgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwayA9IChvYmogaW5zdGFuY2VvZiBDb2x1bW4gJiYgKChDb2x1bW4pIG9iaikuaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICAgICAgICAgID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgIGlmIChway5ib29sZWFuVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBfcG9zIC0gMTsgaSA+PSAwICYmIGkgPj0gX3BvcyAtIDM7IGktLSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9zZWwuX3NlbGVjdHMuZ2V0KGkpLmVxdWFscyhvYmopKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWFyY2ggZm9yd2FyZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHdlIG1pZ2h0IGJlIHNraXBwaW5nCisgICAgICAgICAgICAvLyBzZWxlY3RzIGZvciBzaWJsaW5nIGNsYXNzZXM7IGFkdmFuY2UgdGhlIHBvc2l0aW9uIGlmIHdlIGZpbmQKKyAgICAgICAgICAgIC8vIHNvbWV0aGluZyBmb3J3YXJkCisgICAgICAgICAgICBmb3IgKGludCBpID0gX3BvcyArIDE7IGkgPCBfc2VsLl9zZWxlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKF9zZWwuX3NlbGVjdHMuZ2V0KGkpLmVxdWFscyhvYmopKSB7CisgICAgICAgICAgICAgICAgICAgIF9wb3MgPSBpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKytfcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWF5YmUgdGhlIGNvbHVtbiB3YXMgc2VsZWN0ZWQgYnkgMiBkaWZmZXJlbnQgbWFwcGluZ3MsIHNvIGl0J3MKKyAgICAgICAgICAgIC8vIHNvbWV3aGVyZSBwcmlvciB0byB0aGUgY3VycmVudCBwb3NpdGlvbjsgaW4gdGhpcyBjYXNlIGxlYXZlIHRoZQorICAgICAgICAgICAgLy8gcG9zaXRpb24gbWFya2VyIGF0IGl0cyBjdXJyZW50IHBsYWNlIGNhdXNlIHN1YnNlcXVlbnQgbG9hZHMgd2lsbAorICAgICAgICAgICAgLy8gc3RpbGwgcHJvYmFibHkgc3RhcnQgZnJvbSB0aGVyZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcG9zOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKF9zZWwuX3NlbGVjdHMuZ2V0KGkpLmVxdWFscyhvYmopKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7CisKKyAgICAgICAgICAgIC8vIHNvbWV0aGluZ3MncyB3cm9uZy4uLgorICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihvYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBqb2lucyB0byB1c2UgdG8gZmluZCBjb2x1bW4gZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgUGF0aEpvaW5zIGdldEpvaW5zKEpvaW5zIGpvaW5zKSB7CisgICAgICAgICAgICBQYXRoSm9pbnMgcGogPSAoUGF0aEpvaW5zKSBqb2luczsKKyAgICAgICAgICAgIGlmIChwaiAhPSBudWxsICYmIHBqLnBhdGgoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBwajsKKyAgICAgICAgICAgIHJldHVybiBnZXRQcmVKb2lucygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgcHJlIGpvaW5zIGZvciB0aGUgcmVzdWx0LCBvciBudWxsIGlmIG5vbmUuIE5vdGUgdGhhdAorICAgICAgICAgKiB3ZSBoYXZlIHRvIHRha2UgdGhlIFNlbGVjdCdzIHByZSBqb2lucyBpbnRvIGFjY291bnQgdG9vLCBzaW5jZQorICAgICAgICAgKiBiYXRjaGVkIHNlbGVjdHMgY2FuIGhhdmUgYWRkaXRpb25hbCBwcmUgam9pbnMgb24gdGhlIHN0YWNrIGV2ZW4KKyAgICAgICAgICogb24gZXhlY3V0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBQYXRoSm9pbnMgZ2V0UHJlSm9pbnMoKSB7CisgICAgICAgICAgICBpZiAoX3ByZUpvaW5zICE9IG51bGwgJiYgIV9wcmVKb2lucy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQYXRoSm9pbnMpIF9wcmVKb2lucy5wZWVrKCk7CisgICAgICAgICAgICBpZiAoX3NlbC5fcHJlSm9pbnMgIT0gbnVsbCAmJiAhX3NlbC5fcHJlSm9pbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUGF0aEpvaW5zKSBfc2VsLl9wcmVKb2lucy5wZWVrKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIHVzZWQgdG8ga2V5IG9uIHRoZSBjb2x1bW4gZGF0YSwgY29uc2lkZXJpbmcgdGhlCisgICAgICAgICAqIGdpdmVuIGpvaW5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29sdW1uQWxpYXMoQ29sdW1uIGNvbCwgUGF0aEpvaW5zIHBqKSB7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXM7CisgICAgICAgICAgICBpZiAoX3NlbC5fZnJvbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWxpYXMgPSBfc2VsLnRvQWxpYXMoX3NlbC5fZnJvbS5nZXRUYWJsZUluZGV4CisgICAgICAgICAgICAgICAgICAgIChjb2wuZ2V0VGFibGUoKSwgcGosIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgaWYgKGFsaWFzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGlmIChfc2VsLl9kaWN0LnJlcXVpcmVzQWxpYXNGb3JTdWJzZWxlY3QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGUk9NX1NFTEVDVF9BTElBUyArICIuIiArIGFsaWFzICsgIl8iICsgY29sOworICAgICAgICAgICAgICAgIHJldHVybiBhbGlhcyArICJfIiArIGNvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsaWFzID0gX3NlbC50b0FsaWFzKF9zZWwuZ2V0VGFibGVJbmRleChjb2wuZ2V0VGFibGUoKSwgcGosIGZhbHNlKSk7CisgICAgICAgICAgICByZXR1cm4gKGFsaWFzID09IG51bGwpID8gbnVsbCA6IGFsaWFzICsgIi4iICsgY29sOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBQYXRoSm9pbnMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3V0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGF0aEpvaW5zIHNldE91dGVyKGJvb2xlYW4gb3V0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgcGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5TZXQgam9pbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgam9pbkNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBudWxsSm9pbnMoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgY3Jvc3NKb2luKFRhYmxlIGxvY2FsVGFibGUsIFRhYmxlIGZvcmVpZ25UYWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgam9pbihGb3JlaWduS2V5IGZrLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW4oRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgam9pblJlbGF0aW9uKFN0cmluZyBuYW1lLCBGb3JlaWduS2V5IGZrLCAKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyB0YXJnZXQsIGludCBzdWJzLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhKb2luc0ltcGwoKS5qb2luUmVsYXRpb24obmFtZSwgZmssIHRhcmdldCwgc3VicywgCisgICAgICAgICAgICAgICAgaW52ZXJzZSwgdG9NYW55KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW5SZWxhdGlvbihTdHJpbmcgbmFtZSwgRm9yZWlnbktleSBmaywKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyB0YXJnZXQsIGludCBzdWJzLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhKb2luc0ltcGwoKS5vdXRlckpvaW5SZWxhdGlvbihuYW1lLCBmaywgdGFyZ2V0LCBzdWJzLAorICAgICAgICAgICAgICAgIGludmVyc2UsIHRvTWFueSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgc2V0VmFyaWFibGUoU3RyaW5nIHZhcikgeworICAgICAgICAgICAgaWYgKHZhciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoSm9pbnNJbXBsKCkuc2V0VmFyaWFibGUodmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBzZXRTdWJzZWxlY3QoU3RyaW5nIGFsaWFzKSB7CisgICAgICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aEpvaW5zSW1wbCgpLnNldFN1YnNlbGVjdChhbGlhcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGpvaW5zIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhdGhKb2luc0ltcGwKKyAgICAgICAgaW1wbGVtZW50cyBQYXRoSm9pbnMgeworCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgcGF0aCA9IG51bGw7CisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdmFyID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc091dGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhdGhKb2lucyBzZXRPdXRlcihib29sZWFuIG91dGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFyICE9IG51bGwgfHwgcGF0aCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBwYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pblNldCBqb2lucygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBqb2luQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG51bGxKb2lucygpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBzZXRWYXJpYWJsZShTdHJpbmcgdmFyKSB7CisgICAgICAgICAgICB0aGlzLnZhciA9IHZhcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIHNldFN1YnNlbGVjdChTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgICAgIGlmICghYWxpYXMuZW5kc1dpdGgoIjoiKSkKKyAgICAgICAgICAgICAgICBhbGlhcyArPSAnOic7CisgICAgICAgICAgICBhcHBlbmQoYWxpYXMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgY3Jvc3NKb2luKFRhYmxlIGxvY2FsVGFibGUsIFRhYmxlIGZvcmVpZ25UYWJsZSkgeworICAgICAgICAgICAgYXBwZW5kKHZhcik7CisgICAgICAgICAgICB2YXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgam9pbihGb3JlaWduS2V5IGZrLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICBhcHBlbmQodmFyKTsKKyAgICAgICAgICAgIHZhciA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW4oRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgYXBwZW5kKHZhcik7CisgICAgICAgICAgICB2YXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgam9pblJlbGF0aW9uKFN0cmluZyBuYW1lLCBGb3JlaWduS2V5IGZrLCAKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyB0YXJnZXQsIGludCBzdWJzLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICBhcHBlbmQobmFtZSk7CisgICAgICAgICAgICBhcHBlbmQodmFyKTsKKyAgICAgICAgICAgIHZhciA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW5SZWxhdGlvbihTdHJpbmcgbmFtZSwgRm9yZWlnbktleSBmaywKKyAgICAgICAgICAgIENsYXNzTWFwcGluZyB0YXJnZXQsIGludCBzdWJzLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55KSB7CisgICAgICAgICAgICBhcHBlbmQobmFtZSk7CisgICAgICAgICAgICBhcHBlbmQodmFyKTsKKyAgICAgICAgICAgIHZhciA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJy4nKS5hcHBlbmQoc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlBhdGhKb2luc0ltcGw8IiArIGhhc2hDb2RlKCkgKyAiPjogIgorICAgICAgICAgICAgICAgICsgU3RyaW5nLnZhbHVlT2YocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKb2lucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZWxlY3RKb2lucworICAgICAgICBleHRlbmRzIFBhdGhKb2luc0ltcGwgCisgICAgICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdEltcGwgX3NlbDsKKyAgICAgICAgcHJpdmF0ZSBKb2luU2V0IF9qb2lucyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfb3V0ZXIgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2NvdW50ID0gMDsKKworICAgICAgICBwdWJsaWMgU2VsZWN0Sm9pbnMoU2VsZWN0SW1wbCBzZWwpIHsKKyAgICAgICAgICAgIF9zZWwgPSBzZWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc091dGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIF9vdXRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXRoSm9pbnMgc2V0T3V0ZXIoYm9vbGVhbiBvdXRlcikgeworICAgICAgICAgICAgX291dGVyID0gb3V0ZXI7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNEaXJ0eSgpIHx8ICFpc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pblNldCBqb2lucygpIHsKKyAgICAgICAgICAgIHJldHVybiBfam9pbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRKb2lucyhKb2luU2V0IGpvaW5zKSB7CisgICAgICAgICAgICBfam9pbnMgPSBqb2luczsKKyAgICAgICAgICAgIF9vdXRlciA9IGpvaW5zICE9IG51bGwgJiYgam9pbnMubGFzdCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBqb2lucy5sYXN0KCkuZ2V0VHlwZSgpID09IEpvaW4uVFlQRV9PVVRFUjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgam9pbkNvdW50KCkgeworICAgICAgICAgICAgaWYgKF9qb2lucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBfY291bnQ7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoX2NvdW50LCBfam9pbnMuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG51bGxKb2lucygpIHsKKyAgICAgICAgICAgIGlmIChfam9pbnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY291bnQgPSBNYXRoLm1heChfY291bnQsIF9qb2lucy5zaXplKCkpOworICAgICAgICAgICAgX2pvaW5zID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gX2pvaW5zID09IG51bGwgfHwgX2pvaW5zLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBjcm9zc0pvaW4oVGFibGUgbG9jYWxUYWJsZSwgVGFibGUgZm9yZWlnblRhYmxlKSB7CisgICAgICAgICAgICAvLyBjcm9zcyBqb2lucyBhcmUgZm9yIHVuYm91bmQgdmFyaWFibGVzOyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUKKyAgICAgICAgICAgIC8vIHRvIGFsd2F5cyBnbyBESVNUSU5DVCBmb3IgdW5ib3VuZCB2YXJzIGJlY2F1c2UgdGhlcmUgYXJlIGNlcnRhaW4KKyAgICAgICAgICAgIC8vIGNhc2VzIHRoYXQgcmVxdWlyZSBpdCwgYW5kIHdlIGNhbid0IGRpZmZlcmVudGlhdGUgdGhlbSBmcm9tIHRoZQorICAgICAgICAgICAgLy8gY2FzZXMgdGhhdCBkb24ndAorICAgICAgICAgICAgX3NlbC5fZmxhZ3MgfD0gSU1QTElDSVRfRElTVElOQ1Q7CisKKyAgICAgICAgICAgIGlmIChfc2VsLmdldEpvaW5TeW50YXgoKSAhPSBKb2luU3ludGF4ZXMuU1lOVEFYX1NRTDkyCisgICAgICAgICAgICAgICAgfHwgX3NlbC5fZnJvbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbWFrZSBhbnkgam9pbnMsIGJ1dCB1cGRhdGUgdGhlIHBhdGggaWYgYSB2YXJpYWJsZQorICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIHNldAorICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMudmFyKTsKKyAgICAgICAgICAgICAgICB0aGlzLnZhciA9IG51bGw7CisgICAgICAgICAgICAgICAgX291dGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvbid0IGxldCB0aGUgZ2V0IGFsaWFzIG1ldGhvZHMgc2VlIHRoYXQgYSB2YXIgaGFzIGJlZW4gc2V0CisgICAgICAgICAgICAvLyB1bnRpbCB3ZSBnZXQgcGFzdCB0aGUgbG9jYWwgdGFibGUKKyAgICAgICAgICAgIFN0cmluZyB2YXIgPSB0aGlzLnZhcjsKKyAgICAgICAgICAgIHRoaXMudmFyID0gbnVsbDsKKworICAgICAgICAgICAgaW50IGFsaWFzMSA9IF9zZWwuZ2V0VGFibGVJbmRleChsb2NhbFRhYmxlLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuYXBwZW5kKHZhcik7CisgICAgICAgICAgICBpbnQgYWxpYXMyID0gX3NlbC5nZXRUYWJsZUluZGV4KGZvcmVpZ25UYWJsZSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBKb2luIGogPSBuZXcgSm9pbihsb2NhbFRhYmxlLCBhbGlhczEsIGZvcmVpZ25UYWJsZSwgYWxpYXMyLAorICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIGouc2V0VHlwZShKb2luLlRZUEVfQ1JPU1MpOworCisgICAgICAgICAgICBpZiAoX2pvaW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgX2pvaW5zID0gbmV3IEpvaW5TZXQoKTsKKyAgICAgICAgICAgIF9qb2lucy5hZGQoaik7CisgICAgICAgICAgICBfb3V0ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIGpvaW4oRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4obnVsbCwgZmssIG51bGwsIC0xLCBpbnZlcnNlLCB0b01hbnksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2lucyBvdXRlckpvaW4oRm9yZWlnbktleSBmaywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4obnVsbCwgZmssIG51bGwsIC0xLCBpbnZlcnNlLCB0b01hbnksIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvaW5zIGpvaW5SZWxhdGlvbihTdHJpbmcgbmFtZSwgRm9yZWlnbktleSBmaywgCisgICAgICAgICAgICBDbGFzc01hcHBpbmcgdGFyZ2V0LCBpbnQgc3VicywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4obmFtZSwgZmssIHRhcmdldCwgc3VicywgaW52ZXJzZSwgdG9NYW55LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSm9pbnMgb3V0ZXJKb2luUmVsYXRpb24oU3RyaW5nIG5hbWUsIEZvcmVpZ25LZXkgZmssCisgICAgICAgICAgICBDbGFzc01hcHBpbmcgdGFyZ2V0LCBpbnQgc3VicywgYm9vbGVhbiBpbnZlcnNlLCBib29sZWFuIHRvTWFueSkgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4obmFtZSwgZmssIHRhcmdldCwgc3VicywgaW52ZXJzZSwgdG9NYW55LCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSm9pbnMgam9pbihTdHJpbmcgbmFtZSwgRm9yZWlnbktleSBmaywgQ2xhc3NNYXBwaW5nIHRhcmdldCwKKyAgICAgICAgICAgIGludCBzdWJzLCBib29sZWFuIGludmVyc2UsIGJvb2xlYW4gdG9NYW55LCBib29sZWFuIG91dGVyKSB7CisgICAgICAgICAgICAvLyBkb24ndCBsZXQgdGhlIGdldCBhbGlhcyBtZXRob2RzIHNlZSB0aGF0IGEgdmFyIGhhcyBiZWVuIHNldAorICAgICAgICAgICAgLy8gdW50aWwgd2UgZ2V0IHBhc3QgdGhlIGxvY2FsIHRhYmxlCisgICAgICAgICAgICBTdHJpbmcgdmFyID0gdGhpcy52YXI7CisgICAgICAgICAgICB0aGlzLnZhciA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIGdldCBmaXJzdCB0YWJsZSBhbGlhcyBiZWZvcmUgdXBkYXRpbmcgcGF0aDsgaWYgdGhlcmUgaXMgYSBmcm9tCisgICAgICAgICAgICAvLyBzZWxlY3QgdGhlbiB3ZSBzaG91bGRuJ3QgYWN0dWFsbHkgY3JlYXRlIGEgam9pbiBvYmplY3QsIHNpbmNlCisgICAgICAgICAgICAvLyB0aGUgam9pbnMgd2lsbCBhbGwgYmUgZG9uZSBpbiB0aGUgZnJvbSBzZWxlY3QKKyAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlSm9pbiA9IF9zZWwuX2Zyb20gPT0gbnVsbDsKKyAgICAgICAgICAgIFRhYmxlIHRhYmxlMSA9IG51bGw7CisgICAgICAgICAgICBpbnQgYWxpYXMxID0gLTE7CisgICAgICAgICAgICBpZiAoY3JlYXRlSm9pbikgeworICAgICAgICAgICAgICAgIHRhYmxlMSA9IChpbnZlcnNlKSA/IGZrLmdldFByaW1hcnlLZXlUYWJsZSgpIDogZmsuZ2V0VGFibGUoKTsKKyAgICAgICAgICAgICAgICBhbGlhczEgPSBfc2VsLmdldFRhYmxlSW5kZXgodGFibGUxLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHJlbGF0aW9uIG5hbWUgYmVmb3JlIGdldHRpbmcgcGsgYWxpYXMKKyAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgdGhpcy5hcHBlbmQodmFyKTsKKyAgICAgICAgICAgIGlmICh0b01hbnkpIHsKKyAgICAgICAgICAgICAgICBfc2VsLl9mbGFncyB8PSBJTVBMSUNJVF9ESVNUSU5DVDsKKyAgICAgICAgICAgICAgICBfc2VsLl9mbGFncyB8PSBUT19NQU5ZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX291dGVyID0gb3V0ZXI7CisKKyAgICAgICAgICAgIGlmIChjcmVhdGVKb2luKSB7CisgICAgICAgICAgICAgICAgVGFibGUgdGFibGUyID0gKGludmVyc2UpID8gZmsuZ2V0VGFibGUoKSAKKyAgICAgICAgICAgICAgICAgICAgOiBmay5nZXRQcmltYXJ5S2V5VGFibGUoKTsKKyAgICAgICAgICAgICAgICBpbnQgYWxpYXMyID0gX3NlbC5nZXRUYWJsZUluZGV4KHRhYmxlMiwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgSm9pbiBqID0gbmV3IEpvaW4odGFibGUxLCBhbGlhczEsIHRhYmxlMiwgYWxpYXMyLCBmaywgaW52ZXJzZSk7CisgICAgICAgICAgICAgICAgai5zZXRUeXBlKChvdXRlcikgPyBKb2luLlRZUEVfT1VURVIgOiBKb2luLlRZUEVfSU5ORVIpOworCisgICAgICAgICAgICAgICAgaWYgKF9qb2lucyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfam9pbnMgPSBuZXcgSm9pblNldCgpOworICAgICAgICAgICAgICAgIGlmIChfam9pbnMuYWRkKGopICYmIChzdWJzID09IFNlbGVjdC5TVUJTX0pPSU5BQkxFIAorICAgICAgICAgICAgICAgICAgICB8fCBzdWJzID09IFNlbGVjdC5TVUJTX05PTkUpKQorICAgICAgICAgICAgICAgICAgICBqLnNldFJlbGF0aW9uKHRhcmdldCwgc3VicywgY2xvbmUoX3NlbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2VsZWN0Sm9pbnMgY2xvbmUoU2VsZWN0SW1wbCBzZWwpIHsKKyAgICAgICAgICAgIFNlbGVjdEpvaW5zIHNqID0gbmV3IFNlbGVjdEpvaW5zKHNlbCk7CisgICAgICAgICAgICBzai52YXIgPSB2YXI7CisgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNqLnBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKHBhdGgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoX2pvaW5zICE9IG51bGwgJiYgIV9qb2lucy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2ouX2pvaW5zID0gbmV3IEpvaW5TZXQoX2pvaW5zKTsKKyAgICAgICAgICAgIHNqLl9vdXRlciA9IF9vdXRlcjsKKyAgICAgICAgICAgIHJldHVybiBzajsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgKCIgKyBfb3V0ZXIgKyAiKTogIiArIF9qb2luczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcyB0byB0cmFjayBzZWxlY3RlZCBjb2x1bW5zLCB3aXRoIGZhc3QgY29udGFpbnMgbWV0aG9kLgorICAgICAqIEFjdHMgYXMgYSBsaXN0IG9mIHNlbGVjdCBpZHMsIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIHRvIG1hbmlwdWxhdGUKKyAgICAgKiB0aGUgYWxpYXMgb2YgZWFjaCBzZWxlY3RlZCBpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZWxlY3RzCisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0IHsKKworICAgICAgICBwcml2YXRlIExpc3QgX2lkcyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgTGlzdCBfaWRlbnRzID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBNYXAgX2FsaWFzZXMgPSBudWxsOworICAgICAgICBwcml2YXRlIE1hcCBfc2VsZWN0QXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYWxsIGFsaWFzZXMgZnJvbSBhbm90aGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsKFNlbGVjdHMgc2VscykgeworICAgICAgICAgICAgaWYgKF9pZHMgPT0gbnVsbCAmJiBzZWxzLl9pZHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaWRzID0gbmV3IEFycmF5TGlzdChzZWxzLl9pZHMpOworICAgICAgICAgICAgZWxzZSBpZiAoc2Vscy5faWRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2lkcy5hZGRBbGwoc2Vscy5faWRzKTsKKworICAgICAgICAgICAgaWYgKF9pZGVudHMgPT0gbnVsbCAmJiBzZWxzLl9pZGVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaWRlbnRzID0gbmV3IEFycmF5TGlzdChzZWxzLl9pZGVudHMpOworICAgICAgICAgICAgZWxzZSBpZiAoc2Vscy5faWRlbnRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2lkZW50cy5hZGRBbGwoc2Vscy5faWRlbnRzKTsKKworICAgICAgICAgICAgaWYgKF9hbGlhc2VzID09IG51bGwgJiYgc2Vscy5fYWxpYXNlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9hbGlhc2VzID0gbmV3IEhhc2hNYXAoc2Vscy5fYWxpYXNlcyk7CisgICAgICAgICAgICBlbHNlIGlmIChzZWxzLl9hbGlhc2VzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2FsaWFzZXMucHV0QWxsKHNlbHMuX2FsaWFzZXMpOworCisgICAgICAgICAgICBpZiAoX3NlbGVjdEFzID09IG51bGwgJiYgc2Vscy5fc2VsZWN0QXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc2VsZWN0QXMgPSBuZXcgSGFzaE1hcChzZWxzLl9zZWxlY3RBcyk7CisgICAgICAgICAgICBlbHNlIGlmIChzZWxzLl9zZWxlY3RBcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zZWxlY3RBcy5wdXRBbGwoc2Vscy5fc2VsZWN0QXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGFsaWFzIG9mIGEgZ2l2ZW4gaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFsaWFzKE9iamVjdCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIChfYWxpYXNlcyA9PSBudWxsKSA/IG51bGwgOiBfYWxpYXNlcy5nZXQoaWQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhbiBhbGlhcyBmb3IgYSBnaXZlbiBpZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgc2V0QWxpYXMoT2JqZWN0IGlkLCBPYmplY3QgYWxpYXMsIGJvb2xlYW4gaWRlbnQpIHsKKyAgICAgICAgICAgIGlmIChfaWRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfaWRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIF9hbGlhc2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGlkeDsKKyAgICAgICAgICAgIGlmIChfYWxpYXNlcy5wdXQoaWQsIGFsaWFzKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGlkeCA9IF9pZHMuaW5kZXhPZihpZCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfaWRzLmFkZChpZCk7CisgICAgICAgICAgICAgICAgaWR4ID0gX2lkcy5zaXplKCkgLSAxOworCisgICAgICAgICAgICAgICAgaWYgKGlkZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfaWRlbnRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBfaWRlbnRzID0gbmV3IEFycmF5TGlzdCgzKTsKKyAgICAgICAgICAgICAgICAgICAgX2lkZW50cy5hZGQoaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGFuIGFsaWFzIGZvciBhIGdpdmVuIGluZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWxpYXMoaW50IGlkeCwgT2JqZWN0IGFsaWFzKSB7CisgICAgICAgICAgICBPYmplY3QgaWQgPSBfaWRzLmdldChpZHgpOworICAgICAgICAgICAgX2FsaWFzZXMucHV0KGlkLCBhbGlhcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5zZXJ0IGFuIGFsaWFzIGJlZm9yZSB0aGUgZ2l2ZW4gaW5kZXgsIHVzaW5nIG5lZ2F0aXZlIGluZGV4ZXMKKyAgICAgICAgICogdG8gY291bnQgYmFja3dhcmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgaW5zZXJ0QWxpYXMoaW50IGlkeCwgT2JqZWN0IGlkLCBPYmplY3QgYWxpYXMpIHsKKyAgICAgICAgICAgIF9hbGlhc2VzLnB1dChpZCwgYWxpYXMpOworICAgICAgICAgICAgaWYgKGlkeCA+PSAwKQorICAgICAgICAgICAgICAgIF9pZHMuYWRkKGlkeCwgaWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9pZHMuYWRkKF9pZHMuc2l6ZSgpICsgaWR4LCBpZCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gYWxpYXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGluZGV4T2ZBbGlhcyhPYmplY3QgYWxpYXMpIHsKKyAgICAgICAgICAgIGlmIChfYWxpYXNlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2lkcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoYWxpYXMuZXF1YWxzKF9hbGlhc2VzLmdldChfaWRzLmdldChpKSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGxpc3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFsaWFzZXMsIGluIHNlbGVjdCBvcmRlciwgd2l0aAorICAgICAgICAgKiBBUyBhbGlhc2VzIHByZXNlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdCBnZXRBbGlhc2VzKGZpbmFsIGJvb2xlYW4gaWRlbnQsIGZpbmFsIGJvb2xlYW4gaW5uZXIpIHsKKyAgICAgICAgICAgIGlmIChfaWRzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RMaXN0KCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpZGVudCAmJiBfaWRlbnRzICE9IG51bGwpID8gX2lkZW50cy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogX2lkcy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGlkID0gKGlkZW50ICYmIF9pZGVudHMgIT0gbnVsbCkgPyBfaWRlbnRzLmdldChpKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfaWRzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFsaWFzID0gX2FsaWFzZXMuZ2V0KGlkKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgYXMgPSAoKFN0cmluZykgYWxpYXMpLnJlcGxhY2UoJy4nLCAnXycpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfc2VsZWN0QXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzID0gKFN0cmluZykgX3NlbGVjdEFzLmdldChpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZGVudCAmJiBfaWRlbnRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzIGluc3RhbmNlb2YgU1FMQnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzID0gbmV3IFNRTEJ1ZmZlcigoU1FMQnVmZmVyKSBhbGlhcykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiIEFTICIpLmFwcGVuZChhcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMgPSBhbGlhcyArICIgQVMgIiArIGFzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlhczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGF0IGEgZ2l2ZW4gaWQncyBhbGlhcyBoYXMgYW4gQVMgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RBcyhPYmplY3QgaWQsIFN0cmluZyBhcykgeworICAgICAgICAgICAgaWYgKF9zZWxlY3RBcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zZWxlY3RBcyA9IG5ldyBIYXNoTWFwKChpbnQpICg1ICogMS4zMyArIDEpKTsKKyAgICAgICAgICAgIF9zZWxlY3RBcy5wdXQoaWQsIGFzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciBhbGwgcGxhY2Vob2xkZXJzIGFuZCBzZWxlY3QgQVMgY2xhdXNlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyUGxhY2Vob2xkZXJzKCkgeworICAgICAgICAgICAgaWYgKF9pZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIE9iamVjdCBpZDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2lkcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGlkID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBQbGFjZWhvbGRlcikgeworICAgICAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIF9hbGlhc2VzLnJlbW92ZShpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IGlkKSB7CisgICAgICAgICAgICByZXR1cm4gX2FsaWFzZXMgIT0gbnVsbCAmJiBfYWxpYXNlcy5jb250YWluc0tleShpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaSkgeworICAgICAgICAgICAgaWYgKF9pZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gX2lkcy5nZXQoaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gKF9pZHMgPT0gbnVsbCkgPyAwIDogX2lkcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIF9pZHMgPSBudWxsOworICAgICAgICAgICAgX2FsaWFzZXMgPSBudWxsOworICAgICAgICAgICAgX3NlbGVjdEFzID0gbnVsbDsKKyAgICAgICAgICAgIF9pZGVudHMgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIENvbW1vbiBqb2lucyBpbnRlcmZhY2UgdXNlZCBpbnRlcm5hbGx5LiBDYW5ub3QgYmUgbWFkZSBhbiBpbm5lciBjbGFzcworICogYmVjYXVzZSB0aGUgb3V0ZXIgY2xhc3MgKFNlbGVjdCkgaGFzIHRvIGltcGxlbWVudCBpdC4KKyAqLworaW50ZXJmYWNlIFBhdGhKb2lucworICAgIGV4dGVuZHMgSm9pbnMgeworCisgICAgLyoqCisgICAgICogTWFyayB0aGlzIGFzIGFuIG91dGVyIGpvaW5zIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aEpvaW5zIHNldE91dGVyKGJvb2xlYW4gb3V0ZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBoYXMgYSBwYXRoLCBhbnkgam9pbnMsIG9yIGEgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxhdGlvbiBwYXRoIHRyYXZlcnNlZCBieSB0aGVzZSBqb2lucywgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgcGF0aCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIEpvaW59IGVsZW1lbnRzLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIEpvaW5TZXQgam9pbnMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygam9pbnMgY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UgYXQgYW55CisgICAgICogdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGpvaW5Db3VudCgpOworCisgICAgLyoqCisgICAgICogTnVsbCB0aGUgc2V0IG9mIHtAbGluayBKb2lufSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBudWxsSm9pbnMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU2l6ZWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NpemVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0MjBlNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NpemVkLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKKy8qKgorICogQSBzaXplZCB2YWx1ZS4gVXNlZCB0byByZXByZXNlbnQgYm90aCBhIHZhbHVlIGFuZCBpdHMgc2l6ZSBmb3IgY2FsbHMKKyAqIHRvIHtAbGluayBSb3cjc2V0T2JqZWN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgU2l6ZWQgeworCisgICAgcHVibGljIGZpbmFsIE9iamVjdCB2YWx1ZTsKKyAgICBwdWJsaWMgZmluYWwgaW50IHNpemU7CisKKyAgICBwdWJsaWMgU2l6ZWQoT2JqZWN0IHZhbHVlLCBpbnQgc2l6ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU3liYXNlRGljdGlvbmFyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvU3liYXNlRGljdGlvbmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMGU3MWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TeWJhc2VEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlByaW1hcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkRlbGVnYXRpbmdDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworCisvKioKKyAqIERpY3Rpb25hcnkgZm9yIFN5YmFzZS4KKyAqICBUaGUgbWFpbiBwb2ludCBvZiBpbnRlcmVzdCBpcyB0aGF0IGJ5IGRlZmF1bHQsIGV2ZXJ5IHRhYmxlCisgKiB0aGF0IGlzIGNyZWF0ZWQgd2lsbCBoYXZlIGEgdW5pcXVlIGNvbHVtbiBuYW1lZCAiVU5RX0lOREVYIiBvZgorICogdGhlICJJREVOVElUWSIgdHlwZS4gT3BlbkpQQSB3aWxsIG5vdCBldmVyIHV0aWxpemUgdGhpcyBjb2x1bW4uIEhvd2V2ZXIsCisgKiBkdWUgdG8gaW50ZXJuYWwgU3liYXNlIHJlc3RyaWN0aW9ucywgdGhpcyBjb2x1bW4gaXMgcmVxdWlyZWQKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgcGVzc2ltaXN0aWMgKGRhdGFzdG9yZSkgbG9ja2luZywgc2luY2UgU3liYXNlCisgKiByZXF1aXJlcyB0aGF0IGFueSB0YWJsZXMgaW4gYSAiU0VMRUNUIC4uLiBGT1IgVVBEQVRFIiBjbGF1c2UgaGF2ZQorICogYSB1bmlxdWUgaW5kZXggdGhhdCBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBpbmNsdWRlZCBpbiB0aGUgbGlzdAorICogb2YgY29sdW1ucywgYXMgZGVzY3JpYmVkIGluIHRoZQorICogPGEgaHJlZj0iaHR0cDovL3d3dy5zeWJhc2UuY29tL2RldGFpbC8xLDY5MDQsMTAyMzA3NSwwMC5odG1sIgorICogPlN5YmFzZSBkb2N1bWVudGF0aW9uPC9hPi4gVGhpcyBiZWhhdmlvciBjYW4gYmUgc3VycHJlc3NlZCBieSBzZXR0aW5nIHRoZQorICogZGljdGlvbmFyeSBwcm9wZXJ0eSA8Y29kZT5DcmVhdGVJZGVudGl0eUNvbHVtbj1mYWxzZTwvY29kZT4uIFRoZQorICogbmFtZSBvZiB0aGUgdW5pcXVlIGNvbHVtbiBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0eQorICogPGNvZGU+SWRlbnRpdHlDb2x1bW5OYW1lPUNPTFVNTl9OQU1FPC9jb2RlPi4KKyAqICBBIGdvb2QgU3liYXNlIHR5cGUgcmVmZXJlbmNlIGlzIGNhbiBiZSBmb3VuZCA8YQorICogaHJlZj0iaHR0cDovL3d3dy5pc3BpcmVyLmNvbS9kb2Mvc3Fsd2F5czM2L3N5YmFzZS9zeWJfZHR5cGVzLmh0bWwiPmhlcmU8L2E+LgorICovCitwdWJsaWMgY2xhc3MgU3liYXNlRGljdGlvbmFyeQorICAgIGV4dGVuZHMgQWJzdHJhY3RTUUxTZXJ2ZXJEaWN0aW9uYXJ5IHsKKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFN5YmFzZURpY3Rpb25hcnkuY2xhc3MpOworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlbiB3aGVuZXZlciB0aGUgPGNvZGU+c2NoZW1hdG9vbDwvY29kZT4gY3JlYXRlcyBhCisgICAgICogdGFibGUsIGl0IHdpbGwgYXBwZW5kIGFuIGFkZGl0aW9uYWwgSURFTlRJVFkgY29sdW1uIHRvIHRoZQorICAgICAqIHRhYmxlJ3MgY3JlYXRpb24gU1FMLiBUaGlzIGlzIHNvIFN5YmFzZSB3aWxsIGJlIGFibGUgdG8KKyAgICAgKiBwZXJmb3JtIDxjb2RlPlNFTEVDVC4uLkZPUiBVUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlSWRlbnRpdHlDb2x1bW4gPSB0cnVlOworCisgICAgLyoqCisgICAgICogSWYge0BsaW5rICNjcmVhdGVJZGVudGl0eUNvbHVtbn0gaXMgdHJ1ZSwgdGhlbiB0aGUKKyAgICAgKiA8Y29kZT5pZGVudGl0eUNvbHVtbk5hbWU8L2NvZGU+IHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlCisgICAgICogYWRkaXRpb25hbCB1bmlxdWUgY29sdW1uIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaWRlbnRpdHlDb2x1bW5OYW1lID0gIlVOUV9JTkRFWCI7CisKKyAgICBwdWJsaWMgU3liYXNlRGljdGlvbmFyeSgpIHsKKyAgICAgICAgcGxhdGZvcm0gPSAiU3liYXNlIjsKKyAgICAgICAgc2NoZW1hQ2FzZSA9IFNDSEVNQV9DQVNFX1BSRVNFUlZFOworICAgICAgICBmb3JVcGRhdGVDbGF1c2UgPSAiRk9SIFVQREFURSBBVCBJU09MQVRJT04gU0VSSUFMSVpBQkxFIjsKKworICAgICAgICBzdXBwb3J0c0xvY2tpbmdXaXRoRGlzdGluY3RDbGF1c2UgPSBmYWxzZTsKKyAgICAgICAgc3VwcG9ydHNOdWxsVGFibGVGb3JHZXRDb2x1bW5zID0gZmFsc2U7CisgICAgICAgIHJlcXVpcmVzQXV0b0NvbW1pdEZvck1ldGFEYXRhID0gdHJ1ZTsKKworICAgICAgICBtYXhUYWJsZU5hbWVMZW5ndGggPSAzMDsKKyAgICAgICAgbWF4Q29sdW1uTmFtZUxlbmd0aCA9IDMwOworICAgICAgICBtYXhJbmRleE5hbWVMZW5ndGggPSAzMDsKKyAgICAgICAgbWF4Q29uc3RyYWludE5hbWVMZW5ndGggPSAzMDsKKworICAgICAgICBiaWdpbnRUeXBlTmFtZSA9ICJOVU1FUklDKDM4KSI7CisgICAgICAgIGJpdFR5cGVOYW1lID0gIlRJTllJTlQiOworCisgICAgICAgIC8vIFN5YmFzZSBkb2Vzbid0IHVuZGVyc3RhbmQgIlggQ1JPU1MgSk9JTiBZIiwgYnV0IGl0IGRvZXMgdW5kZXJzdGFuZAorICAgICAgICAvLyB0aGUgZXF1aXZhbGVudCAiWCBKT0lOIFkgT04gMSA9IDEiCisgICAgICAgIGNyb3NzSm9pbkNsYXVzZSA9ICJKT0lOIjsKKyAgICAgICAgcmVxdWlyZXNDb25kaXRpb25Gb3JDcm9zc0pvaW4gPSB0cnVlOworCisgICAgICAgIC8vIHRoZXNlIHRhYmxlcyBzaG91bGQgbm90IGJlIHJlZmxlY3RlZCBvbgorICAgICAgICBzeXN0ZW1UYWJsZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiSUpEQkNfRlVOQ1RJT05fRVNDQVBFUyIsICJKREJDX0ZVTkNUSU9OX0VTQ0FQRVMiLAorICAgICAgICAgICAgIlNQVF9JSkRCQ19DT05WRVJTSU9OIiwgIlNQVF9JSkRCQ19NREEiLCAiU1BUX0lKREJDX1RBQkxFX1RZUEVTIiwKKyAgICAgICAgICAgICJTUFRfSkRCQ19DT05WRVJTSU9OIiwgIlNQVF9KREJDX1RBQkxFX1RZUEVTIiwgIlNQVF9KVEVYVCIsCisgICAgICAgICAgICAiU1BUX0xJTUlUX1RZUEVTIiwgIlNQVF9NREEiLCAiU1BUX01PTklUT1IiLCAiU1BUX1ZBTFVFUyIsCisgICAgICAgICAgICAiU1lCTElDRU5TRVNMT0ciLAorICAgICAgICB9KSk7CisKKyAgICAgICAgLy8gcmVzZXJ2ZWQgd29yZHMgc3BlY2lmaWVkIGF0OgorICAgICAgICAvLyBodHRwOi8vbWFudWFscy5zeWJhc2UuY29tL29ubGluZWJvb2tzL2dyb3VwLWFzL2FzZzEyNTBlLworICAgICAgICAvLyByZWZtYW4vQEdlbmVyaWNfX0Jvb2tUZXh0Vmlldy8yNjYwMworICAgICAgICByZXNlcnZlZFdvcmRTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdeworICAgICAgICAgICAgIkFSSVRIX09WRVJGTE9XIiwgIkJSRUFLIiwgIkJST1dTRSIsICJCVUxLIiwgIkNIQVJfQ09OVkVSVCIsCisgICAgICAgICAgICAiQ0hFQ0tQT0lOVCIsICJDTFVTVEVSRUQiLCAiQ09NUFVURSIsICJDT05GSVJNIiwgIkNPTlRST0xST1ciLAorICAgICAgICAgICAgIkRBVEFCQVNFIiwgIkRCQ0MiLCAiREVURVJNSU5JU1RJQyIsICJESVNLIERJU1RJTkNUIiwgIkRVTU1ZIiwKKyAgICAgICAgICAgICJEVU1QIiwgIkVORFRSQU4iLCAiRVJSTFZMIiwgIkVSUk9SREFUQSIsICJFUlJPUkVYSVQiLCAiRVhDTFVTSVZFIiwKKyAgICAgICAgICAgICJFWElUIiwgIkVYUF9ST1dfU0laRSIsICJGSUxMRkFDVE9SIiwgIkZVTkMiLCAiRlVOQ1RJT04iLAorICAgICAgICAgICAgIkhPTERMT0NLIiwgIklERU5USVRZX0dBUCIsICJJREVOVElUWV9JTlNFUlQiLCAiSURFTlRJVFlfU1RBUlQiLAorICAgICAgICAgICAgIklGIiwgIklOREVYIiwgIklOT1VUIiwgIklOU1RBTEwiLCAiSU5URVJTRUNUIiwgIkpBUiIsICJLSUxMIiwKKyAgICAgICAgICAgICJMSU5FTk8iLCAiTE9BRCIsICJMT0NLIiwgIk1BWF9ST1dTX1BFUl9QQUdFIiwgIk1JUlJPUiIsCisgICAgICAgICAgICAiTUlSUk9SRVhJVCIsICJNT0RJRlkiLCAiTkVXIiwgIk5PSE9MRExPQ0siLCAiTk9OQ0xVU1RFUkVEIiwKKyAgICAgICAgICAgICJOVU1FUklDX1RSVU5DQVRJT04iLCAiT0ZGIiwgIk9GRlNFVFMiLCAiT05DRSIsICJPTkxJTkUiLCAiT1VUIiwKKyAgICAgICAgICAgICJPVkVSIiwgIlBBUlRJVElPTiIsICJQRVJNIiwgIlBFUk1BTkVOVCIsICJQTEFOIiwgIlBSSU5UIiwgIlBST0MiLAorICAgICAgICAgICAgIlBST0NFU1NFWElUIiwgIlBST1hZX1RBQkxFIiwgIlFVSUVTQ0UiLCAiUkFJU0VSUk9SIiwgIlJFQUQiLAorICAgICAgICAgICAgIlJFQURQQVNUIiwgIlJFQURURVhUIiwgIlJFQ09ORklHVVJFIiwgIlJFRkVSRU5DRVMgUkVNT1ZFIiwgIlJFT1JHIiwKKyAgICAgICAgICAgICJSRVBMQUNFIiwgIlJFUExJQ0FUSU9OIiwgIlJFU0VSVkVQQUdFR0FQIiwgIlJFVFVSTiIsICJSRVRVUk5TIiwKKyAgICAgICAgICAgICJST0xFIiwgIlJPV0NPVU5UIiwgIlJVTEUiLCAiU0FWRSIsICJTRVRVU0VSIiwgIlNIQVJFRCIsCisgICAgICAgICAgICAiU0hVVERPV04iLCAiU09NRSIsICJTVEFUSVNUSUNTIiwgIlNUUklOR1NJWkUiLCAiU1RSSVBFIiwKKyAgICAgICAgICAgICJTWUJfSURFTlRJVFkiLCAiU1lCX1JFU1RSRUUiLCAiU1lCX1RFUk1JTkFURSIsICJURU1QIiwgIlRFWFRTSVpFIiwKKyAgICAgICAgICAgICJUUkFOIiwgIlRSSUdHRVIiLCAiVFJVTkNBVEUiLCAiVFNFUVVBTCIsICJVTlBBUlRJVElPTiIsICJVU0UiLAorICAgICAgICAgICAgIlVTRVJfT1BUSU9OIiwgIldBSVRGT1IiLCAiV0hJTEUiLCAiV1JJVEVURVhUIiwKKyAgICAgICAgfSkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SkRCQ1R5cGUoaW50IG1ldGFUeXBlQ29kZSwgYm9vbGVhbiBsb2IpIHsKKyAgICAgICAgc3dpdGNoIChtZXRhVHlwZUNvZGUpIHsKKyAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IG1hcHBpbmcgZm9yIEJZVEUgaXMgYSBUSU5ZSU5ULCBidXQgU3liYXNlJ3MgVElOWUlOVAorICAgICAgICAgICAgLy8gdHlwZSBjYW4ndCBoYW5kbGUgdGhlIGNvbXBsZXRlIHJhbmdlIGZvciBhIEphdmEgYnl0ZQorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRUeXBlKFR5cGVzLlNNQUxMSU5UKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEpEQkNUeXBlKG1ldGFUeXBlQ29kZSwgbG9iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpZ0ludGVnZXIoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIGludCBpZHgsIEJpZ0ludGVnZXIgdmFsLAorICAgICAgICBDb2x1bW4gY29sKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0QmlnRGVjaW1hbCBkb2Vzbid0IHdvcmsgaGVyZTogaW4gb25lIGNhc2UsIGEgc3RvcmVkIHZhbHVlCisgICAgICAgIC8vIG9mIDc3OTk0Mzg1MTQ5MjQzNDk0NDAgdHVybnMgaW50byA3Nzk5NDM4NTE0OTI0MzQ5NDAwCisgICAgICAgIC8vIHNldE9iamVjdCBnZXRzIGFyb3VuZCB0aGlzIGluIHRoZSBTeWJhc2UgSkRCQyBkcml2ZXJzCisgICAgICAgIHNldE9iamVjdChzdG1udCwgaWR4LCBuZXcgQmlnRGVjaW1hbCh2YWwpLCBUeXBlcy5CSUdJTlQsIGNvbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFkZEZvcmVpZ25LZXlTUUwoRm9yZWlnbktleSBmaykgeworICAgICAgICAvLyBTeWJhc2UgaGFzIHByb2JsZW1zIHdpdGggYWRkaW5nIGZvcmllZ24ga2V5cyB2aWEgQUxURVIgVEFCTEUgY29tbWFuZAorICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlVGFibGVTUUwoVGFibGUgdGFibGUpIHsKKyAgICAgICAgaWYgKCFjcmVhdGVJZGVudGl0eUNvbHVtbikKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDcmVhdGVUYWJsZVNRTCh0YWJsZSk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiQ1JFQVRFIFRBQkxFICIpLmFwcGVuZChnZXRGdWxsTmFtZSh0YWJsZSwgZmFsc2UpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiICgiKTsKKworICAgICAgICBDb2x1bW5bXSBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOworICAgICAgICBib29sZWFuIGhhc0lkZW50aXR5ID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29sc1tpXS5pc0F1dG9Bc3NpZ25lZCgpKQorICAgICAgICAgICAgICAgIGhhc0lkZW50aXR5ID0gdHJ1ZTsKKworICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChnZXREZWNsYXJlQ29sdW1uU1FMKGNvbHNbaV0sIGZhbHNlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgYW4gaWRlbnRpdHkgY29sdW1uIGlmIHdlIGRvIG5vdCBhbHJlYWR5IGhhdmUgb25lCisgICAgICAgIGlmICghaGFzSWRlbnRpdHkpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZChpZGVudGl0eUNvbHVtbk5hbWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiIE5VTUVSSUMgSURFTlRJVFkgVU5JUVVFIik7CisKKyAgICAgICAgUHJpbWFyeUtleSBwayA9IHRhYmxlLmdldFByaW1hcnlLZXkoKTsKKyAgICAgICAgaWYgKHBrICE9IG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZChnZXRQcmltYXJ5S2V5Q29uc3RyYWludFNRTChwaykpOworCisgICAgICAgIFVuaXF1ZVtdIHVucXMgPSB0YWJsZS5nZXRVbmlxdWVzKCk7CisgICAgICAgIFN0cmluZyB1bnFTdHI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5xcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdW5xU3RyID0gZ2V0VW5pcXVlQ29uc3RyYWludFNRTCh1bnFzW2ldKTsKKyAgICAgICAgICAgIGlmICh1bnFTdHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZCh1bnFTdHIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyBidWYudG9TdHJpbmcoKSB9OworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjbGFyZUNvbHVtblNRTChDb2x1bW4gY29sLCBib29sZWFuIGFsdGVyKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoY29sKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRUeXBlTmFtZShjb2wpKTsKKworICAgICAgICAvLyBjYW4ndCBhZGQgY29uc3RyYWludHMgdG8gYSBjb2x1bW4gd2UncmUgYWRkaW5nIGFmdGVyIHRhYmxlCisgICAgICAgIC8vIGNyZWF0aW9uLCBjYXVzZSBzb21lIGRhdGEgbWlnaHQgYWxyZWFkeSBiZSBpbnNlcnRlZAorICAgICAgICBpZiAoIWFsdGVyKSB7CisgICAgICAgICAgICBpZiAoY29sLmdldERlZmF1bHRTdHJpbmcoKSAhPSBudWxsICYmICFjb2wuaXNBdXRvQXNzaWduZWQoKSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgREVGQVVMVCAiKS5hcHBlbmQoY29sLmdldERlZmF1bHRTdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoY29sLmlzQXV0b0Fzc2lnbmVkKCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIElERU5USVRZIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29sLmlzTm90TnVsbCgpKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiIE5PVCBOVUxMIik7CisgICAgICAgIGVsc2UgaWYgKCFjb2wuaXNQcmltYXJ5S2V5KCkpIHsKKyAgICAgICAgICAgIC8vIHN5YmFzZSBmb3JjZXMgeW91IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGF0CisgICAgICAgICAgICAvLyB5b3Ugd2lsbCBhbGxvdyBOVUxMIHZhbHVlcworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIE5VTEwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RHJvcENvbHVtblNRTChDb2x1bW4gY29sdW1uKSB7CisgICAgICAgIC8vIFN5YmFzZSB1c2VzICJBTFRFUiBUQUJMRSBEUk9QIDxDT0xVTU5fTkFNRT4iIHJhdGhlciB0aGFuIHRoZQorICAgICAgICAvLyB1c3VhbCAiQUxURVIgVEFCTEUgRFJPUCBDT0xVTU4gPENPTFVNTl9OQU1FPiIKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgIkFMVEVSIFRBQkxFICIKKyAgICAgICAgICAgICsgZ2V0RnVsbE5hbWUoY29sdW1uLmdldFRhYmxlKCksIGZhbHNlKSArICIgRFJPUCAiICsgY29sdW1uIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmU2NoZW1hQ29tcG9uZW50cyhUYWJsZSB0YWJsZSkgeworICAgICAgICAvLyBub3RlIHRoYXQgd2UgdXNlIGdldENvbHVtbnMoKSByYXRoZXIgdGhhbiBnZXR0aW5nIHRoZSBjb2x1bW4gYnkgbmFtZQorICAgICAgICAvLyBiZWNhdXNlIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdW5kZXIgdGhlCisgICAgICAgIC8vIGR5bmFtaWMgc2NoZW1hIGZhY3RvcnksIHdoZXJlIGdldHRpbmcgYSBjb2x1bW4gYnkgbmFtZSBjcmVhdGVzCisgICAgICAgIC8vIHRoYXQgY29sdW1uCisgICAgICAgIENvbHVtbltdIGNvbHMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChpZGVudGl0eUNvbHVtbk5hbWUuZXF1YWxzSWdub3JlQ2FzZShjb2xzW2ldLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgY29sc1tpXS5yZWYoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworICAgICAgICBzdXBlci5lbmRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgLy8gd2FybiBhYm91dCBqZGJjIGNvbXBsaWFudCBmbGFnCisgICAgICAgIFN0cmluZyB1cmwgPSBjb25mLmdldENvbm5lY3Rpb25VUkwoKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KHVybCkKKyAgICAgICAgICAgICYmIHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImpkYmM6c3liYXNlOnRkcyIpICE9IC0xCisgICAgICAgICAgICAmJiB1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJiZV9hc19qZGJjX2NvbXBsaWFudF9hc19wb3NzaWJsZT0iKQorICAgICAgICAgICAgPT0gLTEpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJzeWJhc2UtY29tcGxpYW5jZSIsIHVybCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbm5lY3Rpb24gZGVjb3JhdGUoQ29ubmVjdGlvbiBjb25uKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTeWJhc2VDb25uZWN0aW9uKHN1cGVyLmRlY29yYXRlKGNvbm4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9uIHdyYXBwZXIgdG8gY2FjaGUgdGhlIHtAbGluayBDb25uZWN0aW9uI2dldENhdGFsb2d9IHJlc3VsdCwKKyAgICAgKiB3aGljaCB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lIHdpdGggdGhlIFN5YmFzZSBDb25uZWN0aW9uIChhbmQKKyAgICAgKiB3aGljaCB3ZSBmcmVxdWVudGx5IGludm9rZSkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3liYXNlQ29ubmVjdGlvbgorICAgICAgICBleHRlbmRzIERlbGVnYXRpbmdDb25uZWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBfY2F0YWxvZyA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFN5YmFzZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgICAgICBzdXBlcihjb25uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfY2F0YWxvZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9jYXRhbG9nID0gc3VwZXIuZ2V0Q2F0YWxvZygpOworICAgICAgICAgICAgcmV0dXJuIF9jYXRhbG9nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXV0b0NvbW1pdChib29sZWFuIGF1dG9jb21taXQpCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHRoZSBzeWJhc2UgamRiYyBkcml2ZXIgZGVtYW5kcyB0aGF0IHRoZSBDb25uZWN0aW9uIGFsd2F5cworICAgICAgICAgICAgLy8gYmUgcm9sbGVkIGJhY2sgYmVmb3JlIGF1dG9jb21taXQgc3RhdHVzIGNoYW5nZXMuIEZhaWx1cmUgdG8KKyAgICAgICAgICAgIC8vIGRvIHNvIHdpbGwgeWllbGQgIlNFVCBDSEFJTkVEIGNvbW1hbmQgbm90IGFsbG93ZWQgd2l0aGluCisgICAgICAgICAgICAvLyBtdWx0aS1zdGF0ZW1lbnQgdHJhbnNhY3Rpb24uIiBleGNlcHRpb25zCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN1cGVyLnNldEF1dG9Db21taXQoYXV0b2NvbW1pdCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBmb3Igc29tZSByZWFzb246IHRyeSByb2xsaW5nIGJhY2sgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGF1dG9jb21taXQgYWdhaW4uCisgICAgICAgICAgICAgICAgaWYgKGF1dG9jb21taXQpCisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIucm9sbGJhY2soKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRBdXRvQ29tbWl0KGF1dG9jb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvVW5pb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1VuaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0OTk0YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1VuaW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWw7CisKKy8qKgorICogU1FMIFVOSU9OLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVW5pb24KKyAgICBleHRlbmRzIFNlbGVjdEV4ZWN1dG9yIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VsZWN0cyB0aGF0IG1ha2UgdXAgdGhpcyB1bmlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0W10gZ2V0U2VsZWN0cygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1bmlvbi1sZXZlbCBvcmRlcmluZywgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJpbmcoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhIHRydWUgVU5JT04sIHJhdGhlciB0aGFuIGEgbG9naWNhbCBjb21iaW5hdGlvbiBvZgorICAgICAqIGluZGVwZW5kZW50IHNlbGVjdHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmlvbigpOworCisgICAgLyoqCisgICAgICogRm9yY2UgdGhlIHVzZSBvZiBhIHNlcmllcyBvZiBzdGFuZGFyZCBzZWxlY3RzIHJhdGhlciB0aGFuIGEgdHJ1ZSBVTklPTi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhYm9ydFVuaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgZGF0YSB1c2luZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdG9yIHNlbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdXNlZCB0byBjcmVhdGUgdGhlIHNlbGVjdHMgaW4gYSBTUUwgdW5pb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU2VsZWN0b3IgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQb3B1bGF0ZSB0aGUgPGNvZGU+aTwvY29kZT50aCBzZWxlY3QgaW4gdGhlIHVuaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdCBzZWwsIGludCBpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkMjhjZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQS1KREJDIFNRTCBBYnN0cmFjdGlvbjwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVXRpbGl0aWVzIGZvciBnZW5lcmF0aW5nIFNRTC4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUHJvZHVjdERlcml2YXRpb24gYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYTg5NDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uCkBAIC0wLDAgKzEsMTcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCitvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNQcm9kdWN0RGVyaXZhdGlvbgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9hbnRsaWIueG1sIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODRmMzYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L2FudGxpYi54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tIAorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxhbnRsaWI+CisJPHRhc2tkZWYgcmVzb3VyY2U9Im9yZy9hcGFjaGUvb3BlbmpwYS9hbnQvYW50bGliLnhtbCIvPgorCTx0YXNrZGVmIG5hbWU9Im1hcHBpbmd0b29sIiAKKwkJY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5hbnQuTWFwcGluZ1Rvb2xUYXNrIi8+CisJPHRhc2tkZWYgbmFtZT0icmV2ZXJzZW1hcHBpbmd0b29sIiAKKwkJY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5hbnQuUmV2ZXJzZU1hcHBpbmdUb29sVGFzayIvPgorCTx0YXNrZGVmIG5hbWU9InNjaGVtYXRvb2wiIAorCQljbGFzc25hbWU9Im9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmFudC5TY2hlbWFUb29sVGFzayIvPgorPC9hbnRsaWI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvYW50L2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M0OTdjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2FudC9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK2JhZC1jb25mOiBUaGUgb3B0aW9ucyBzdXBwbGllZCB0byB0aGUgezB9IGFyZSBub3QgdmFsaWQuIFBsZWFzZSBjaGVjayB5b3VyIFwKKwlhbnQgYnVpbGQgZmlsZS4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjYTdmNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQ2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK1NjaGVtYS1uYW1lOiBTY2hlbWEKK1NjaGVtYS1kZXNjOiBUaGUgZGVmYXVsdCBzY2hlbWEgZm9yIHVucXVhbGlmaWVkIHRhYmxlIG5hbWVzLiAKK1NjaGVtYS10eXBlOiBDb25uZWN0aW5nCitTY2hlbWEtY2F0OiBEYXRhYmFzZS5TY2hlbWFzCitTY2hlbWEtZGlzcGxheW9yZGVyOiA1MAorCitTY2hlbWFzLW5hbWU6IFNjaGVtYXMKK1NjaGVtYXMtZGVzYzogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgc2NoZW1hcyBhbmQvb3IgdGFibGVzIHlvdSBhcmUgXAorCXVzaW5nIGZvciBwZXJzaXN0ZW50IGNsYXNzIHRhYmxlcy4gIAorU2NoZW1hcy10eXBlOiBDb25uZWN0aW5nCitTY2hlbWFzLWNhdDogRGF0YWJhc2UuU2NoZW1hcworU2NoZW1hcy1kaXNwbGF5b3JkZXI6IDUwCisKK1RyYW5zYWN0aW9uSXNvbGF0aW9uLW5hbWU6IEpEQkMgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsCitUcmFuc2FjdGlvbklzb2xhdGlvbi1kZXNjOiBUaGUgbmFtZSBvZiB0aGUgSkRCQyB0cmFuc2FjdGlvbiBpc29sYXRpb24gXAorCWxldmVsIHRvIHVzZS4gICJkZWZhdWx0IiBpbmRpY2F0ZXMgdG8gdXNlIFwKKwl0aGUgSkRCQyBkcml2ZXInJ3MgZGVmYXVsdCBsZXZlbC4gXAorCU90aGVyIHN0YW5kYXJkIHZhbHVlcyBhcmUgIm5vbmUiLCAicmVhZC1jb21taXR0ZWQiLCAicmVhZC11bmNvbW1pdHRlZCIsIFwKKwkicmVwZWF0YWJsZS1yZWFkIiwgYW5kICJzZXJpYWxpemFibGUiLgorVHJhbnNhY3Rpb25Jc29sYXRpb24tdHlwZTogQ29ubmVjdGluZworVHJhbnNhY3Rpb25Jc29sYXRpb24tY2F0OiBEYXRhYmFzZS5UcmFuc2FjdGlvbnMKK1RyYW5zYWN0aW9uSXNvbGF0aW9uLWRpc3BsYXlvcmRlcjogNTAKK1RyYW5zYWN0aW9uSXNvbGF0aW9uLWV4cGVydDogdHJ1ZQorCitSZXN1bHRTZXRUeXBlLW5hbWU6IEpEQkMgcmVzdWx0IHNldCB0eXBlCitSZXN1bHRTZXRUeXBlLWRlc2M6IFRoZSBuYW1lIG9mIHRoZSBKREJDIHJlc3VsdCBzZXQgdHlwZSB0byB1c2UuICBTdGFuZGFyZCBcCisJdmFsdWVzIGFyZSAiZm9yd2FyZC1vbmx5IiwgInNjcm9sbC1zZW5zaXRpdmUiLCBhbmQgInNjcm9sbC1pbnNlbnNpdGl2ZSIuCitSZXN1bHRTZXRUeXBlLXR5cGU6IE9wdGltaXphdGlvbgorUmVzdWx0U2V0VHlwZS1jYXQ6IEpEQkMKK1Jlc3VsdFNldFR5cGUtZGlzcGxheW9yZGVyOiA1MAorUmVzdWx0U2V0VHlwZS1leHBlcnQ6IHRydWUKKworRmV0Y2hEaXJlY3Rpb24tbmFtZTogSkRCQyBmZXRjaCBkaXJlY3Rpb24KK0ZldGNoRGlyZWN0aW9uLWRlc2M6IFRoZSBuYW1lIG9mIHRoZSBKREJDIGZldGNoIGRpcmVjdGlvbiB0byB1c2UuICBTdGFuZGFyZCBcCisJdmFsdWVzIGFyZSAiZm9yd2FyZCIsICJyZXZlcnNlIiwgYW5kICJ1bmtub3duIi4KK0ZldGNoRGlyZWN0aW9uLXR5cGU6IE9wdGltaXphdGlvbgorRmV0Y2hEaXJlY3Rpb24tY2F0OiBKREJDCitGZXRjaERpcmVjdGlvbi1kaXNwbGF5b3JkZXI6IDUwCitGZXRjaERpcmVjdGlvbi1leHBlcnQ6IHRydWUKKworRWFnZXJGZXRjaE1vZGUtbmFtZTogRWFnZXIgZmV0Y2ggbW9kZQorRWFnZXJGZXRjaE1vZGUtZGVzYzogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGVhZ2VyIGZldGNoIG1vZGUgdG8gdXNlLiAgRWl0aGVyIFwKKwkibm9uZSIgdG8gbmV2ZXIgZWFnZXJseS1sb2FkIHJlbGF0aW9ucywgImpvaW4iIGZvciBzZWxlY3RpbmcgMS0xIHJlbGF0aW9ucyBcCisJYWxvbmcgd2l0aCB0aGUgdGFyZ2V0IG9iamVjdCB1c2luZyBpbm5lciBvciBvdXRlciBqb2lucywgb3IgInBhcmFsbGVsIiBmb3IgXAorCXNlbGVjdGluZyAxLTEgcmVsYXRpb25zIHZpYSBqb2lucywgYW5kIGNvbGxlY3Rpb25zIChpbmNsdWRpbmcgdG8tbWFueSBcCisJcmVsYXRpb25zKSBhbG9uZyB3aXRoIHRoZSB0YXJnZXQgb2JqZWN0IHVzaW5nIHNlcGFyYXRlIHNlbGVjdCBzdGF0ZW1lbnRzIFwKKwlleGVjdXRlZCBpbiBwYXJhbGxlbC4KK0VhZ2VyRmV0Y2hNb2RlLXR5cGU6IE9wdGltaXphdGlvbgorRWFnZXJGZXRjaE1vZGUtY2F0OiBGZXRjaGluZworRWFnZXJGZXRjaE1vZGUtZGlzcGxheW9yZGVyOiA1MAorRWFnZXJGZXRjaE1vZGUtZXhwZXJ0OiB0cnVlCisKK1N1YmNsYXNzRmV0Y2hNb2RlLW5hbWU6IFN1YmNsYXNzIGZldGNoIG1vZGUKK1N1YmNsYXNzRmV0Y2hNb2RlLWRlc2M6IFNwZWNpZmllcyB0aGUgZGVmYXVsdCBzdWJjbGFzcyBmZXRjaCBtb2RlIHRvIHVzZS4gXAorCUVpdGVociAibm9uZSIgdG8gYWx3YXlzIHNlbGVjdCBkYXRhIGluIGJhc2UgY2xhc3MgdGFibGVzIG9ubHksICJqb2luIiB0byBcCisJb3V0ZXItam9pbiB0byB0YWJsZXMgZm9yIGFsbCBzdWJjbGFzc2VzLCBvciAicGFyYWxsZWwiIHRvIGV4ZWN1dGUgYSBcCisJc2VwYXJhdGUgc2VsZWN0IGluIHBhcmFsbGVsIGZvciBlYWNoIHBvc3NpYmxlIHN1YmNsYXNzLiAgUGFyYWxsZWwgbW9kZSBpcyBcCisJb25seSBhcHBsaWNhYmxlIHRvIFF1ZXJ5IGV4ZWN1dGlvbjsgaW4gb3RoZXIgc2l0dWF0aW9ucyBpdCBtaXJyb3JzIFwKKwlqb2luIG1vZGUuCitTdWJjbGFzc0ZldGNoTW9kZS10eXBlOiBPcHRpbWl6YXRpb24KK1N1YmNsYXNzRmV0Y2hNb2RlLWNhdDogRmV0Y2hpbmcKK1N1YmNsYXNzRmV0Y2hNb2RlLWRpc3BsYXlvcmRlcjogNTAKK1N1YmNsYXNzRmV0Y2hNb2RlLWV4cGVydDogdHJ1ZQorCitMUlNTaXplLW5hbWU6IExhcmdlIHJlc3VsdCBzZXQgc2l6ZSBtb2RlCitMUlNTaXplLWRlc2M6IFRoZSBtb2RlIHRvIHVzZSBmb3IgY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgbGFyZ2UgcmVzdWx0IHNldHMuIFwKKwlMZWdhbCB2YWx1ZXMgYXJlICJ1bmtub3duIiwgImxhc3QiLCBhbmQgInF1ZXJ5Ii4KK0xSU1NpemUtdHlwZTogT3B0aW1pemF0aW9uCitMUlNTaXplLWNhdDogSkRCQworTFJTU2l6ZS1kaXNwbGF5b3JkZXI6IDUwCitMUlNTaXplLWV4cGVydDogdHJ1ZQorCitTeW5jaHJvbml6ZU1hcHBpbmdzLW5hbWU6IEF1dG9tYXRpY2FsbHkgc3luY2hyb25pemUgc2NoZW1hCitTeW5jaHJvbml6ZU1hcHBpbmdzLWRlc2M6IENvbnRyb2xzIHdoZXRoZXIgT3BlbkpQQSB3aWxsIGF0dGVtcHQgdG8gcnVuIHRoZSBcCisJbWFwcGluZyB0b29sIG9uIGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgdG8gc3luY2hyb25pemUgdGhlaXIgbWFwcGluZ3MgXAorCWFuZCBzY2hlbWEgYXQgcnVudGltZS4KK1N5bmNocm9uaXplTWFwcGluZ3MtdHlwZTogR2VuZXJhbAorU3luY2hyb25pemVNYXBwaW5ncy1jYXQ6IE1hcHBpbmdzCitTeW5jaHJvbml6ZU1hcHBpbmdzLWRpc3BsYXlvcmRlcjogNTAKK1N5bmNocm9uaXplTWFwcGluZ3MtZXhwZXJ0OiB0cnVlCisKK0pEQkNMaXN0ZW5lcnMtbmFtZTogSkRCQyBldmVudCBsaXN0ZW5lcnMKK0pEQkNMaXN0ZW5lcnMtZGVzYzogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBcCisJb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkpEQkNMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbnMgdG8gaW5zdGFsbCBvbiBcCisJYWxsIGNvbm5lY3Rpb24gcG9vbHMuCitKREJDTGlzdGVuZXJzLXR5cGU6IENvbm5lY3RpbmcKK0pEQkNMaXN0ZW5lcnMtY2F0OiBKREJDLkFkdmFuY2VkCitKREJDTGlzdGVuZXJzLWRpc3BsYXlvcmRlcjogNTAKK0pEQkNMaXN0ZW5lcnMtZXhwZXJ0OiB0cnVlCisKK0Nvbm5lY3Rpb25EZWNvcmF0b3JzLW5hbWU6IENvbm5lY3Rpb24gZGVjb3JhdG9ycworQ29ubmVjdGlvbkRlY29yYXRvcnMtZGVzYzogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBcCisJb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkNvbm5lY3Rpb25EZWNvcmF0b3IgaW1wbGVtZW50YXRpb25zIHRvIGluc3RhbGwgXAorCW9uIGFsbCBjb25uZWN0aW9uIHBvb2xzLgorQ29ubmVjdGlvbkRlY29yYXRvcnMtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbkRlY29yYXRvcnMtY2F0OiBKREJDLkFkdmFuY2VkCitDb25uZWN0aW9uRGVjb3JhdG9ycy1kaXNwbGF5b3JkZXI6IDUwCitDb25uZWN0aW9uRGVjb3JhdG9ycy1leHBlcnQ6IHRydWUKK0Nvbm5lY3Rpb25EZWNvcmF0b3JzLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkNvbm5lY3Rpb25EZWNvcmF0b3IKKworREJEaWN0aW9uYXJ5LW5hbWU6IERhdGFiYXNlIGRpY3Rpb25hcnkKK0RCRGljdGlvbmFyeS1kZXNjOiBUaGUgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeSB0byB1c2UgZm9yIFwKKyAgICBkYXRhYmFzZSBpbnRlcmFjdGlvbi4gVGhpcyBpcyBhdXRvLWRldGVjdGVkIGJhc2VkIG9uIHRoZSBDb25uZWN0aW9uVVJMIFwKKyAgICBzZXR0aW5nLCBzbyB5b3UgbmVlZCBvbmx5IHNldCB0aGlzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHdpdGggeW91ciBvd24gXAorICAgIGN1c3RvbSBkaWN0aW9uYXJ5IG9yIGlmIHlvdSBhcmUgdXNpbmcgYW4gdW5yZWNvZ25pemVkIGRyaXZlci4KK0RCRGljdGlvbmFyeS10eXBlOiBDb25uZWN0aW5nCitEQkRpY3Rpb25hcnktY2F0OiBEYXRhYmFzZQorREJEaWN0aW9uYXJ5LWRpc3BsYXlvcmRlcjogNTAKK0RCRGljdGlvbmFyeS1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnkKKworVXBkYXRlTWFuYWdlci1uYW1lOiBVcGRhdGUgbWFuYWdlcgorVXBkYXRlTWFuYWdlci1kZXNjOiBUaGUgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLlVwZGF0ZU1hbmFnZXIgdG8gdXNlIHRvIFwKKyAgICBmbHVzaCBwZXJzaXN0ZW50IG9iamVjdCBtb2RpZmljYXRpb25zIHRvIHRoZSBkYXRhYmFzZS4KK1VwZGF0ZU1hbmFnZXItdHlwZTogR2VuZXJhbAorVXBkYXRlTWFuYWdlci1jYXQ6IEpEQkMuSW50ZXJhY3Rpb24KK1VwZGF0ZU1hbmFnZXItZGlzcGxheW9yZGVyOiA1MAorVXBkYXRlTWFuYWdlci1leHBlcnQ6IHRydWUKK1VwZGF0ZU1hbmFnZXItaW50ZXJmYWNlOiBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuVXBkYXRlTWFuYWdlcgorCitEcml2ZXJEYXRhU291cmNlLW5hbWU6IFVwZGF0ZSBtYW5hZ2VyCitEcml2ZXJEYXRhU291cmNlLWRlc2M6IFRoZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRHJpdmVyRGF0YVNvdXJjZSB0byBcCisgICAgdXNlIHRvIHdyYXAgYSBKREJDIGRyaXZlciBpbiBhIERhdGFTb3VyY2UuCitEcml2ZXJEYXRhU291cmNlLXR5cGU6IEdlbmVyYWwKK0RyaXZlckRhdGFTb3VyY2UtY2F0OiBKREJDLkludGVyYWN0aW9uCitEcml2ZXJEYXRhU291cmNlLWRpc3BsYXlvcmRlcjogNTAKK0RyaXZlckRhdGFTb3VyY2UtZXhwZXJ0OiB0cnVlCitEcml2ZXJEYXRhU291cmNlLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkRyaXZlckRhdGFTb3VyY2UKKworU2NoZW1hRmFjdG9yeS1uYW1lOiBTY2hlbWEgZmFjdG9yeQorU2NoZW1hRmFjdG9yeS1kZXNjOiBUaGUgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUZhY3RvcnkgdGhhdCBcCisJd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGlzdGluZyB0YWJsZXMgYW5kIG90aGVyIGRhdGFiYXNlIFwKKwlzdHJ1Y3R1cmVzIGF0IHJ1bnRpbWUuCitTY2hlbWFGYWN0b3J5LXR5cGU6IEdlbmVyYWwKK1NjaGVtYUZhY3RvcnktY2F0OiBKREJDLkludGVyYWN0aW9uCitTY2hlbWFGYWN0b3J5LWRpc3BsYXlvcmRlcjogNTAKK1NjaGVtYUZhY3RvcnktZXhwZXJ0OiB0cnVlCitTY2hlbWFGYWN0b3J5LWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUZhY3RvcnkKKworU1FMRmFjdG9yeS1uYW1lOiBTUUwgZmFjdG9yeQorU1FMRmFjdG9yeS1kZXNjOiBUaGUgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLlNRTEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgXAorICAgIFNRTCBjb25zdHJ1Y3RzLgorU1FMRmFjdG9yeS10eXBlOiBHZW5lcmFsCitTUUxGYWN0b3J5LWNhdDogSkRCQy5JbnRlcmFjdGlvbgorU1FMRmFjdG9yeS1kaXNwbGF5b3JkZXI6IDUwCitTUUxGYWN0b3J5LWV4cGVydDogdHJ1ZQorU1FMRmFjdG9yeS1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxGYWN0b3J5CisKK01hcHBpbmdGYWN0b3J5LW5hbWU6IE1hcHBpbmcgZmFjdG9yeQorTWFwcGluZ0ZhY3RvcnktZGVzYzogVGhlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhRmFjdG9yeSB0aGF0IHdpbGwgXAorICAgIHByb3ZpZGUgdGhlIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgaW5mb3JtYXRpb24gbmVlZGVkIHRvIG1hcCBlYWNoIFwKKyAgICBwZXJzaXN0ZW50IGNsYXNzIHRvIHRoZSBkYXRhYmFzZSwgaWYgaXQgaXNuJ3QgcHJvdmlkZWQgYnkgY3VycmVudCBtZXRhZGF0YSBcCisgICAgTWV0YURhdGFGYWN0b3J5LgorTWFwcGluZ0ZhY3RvcnktdHlwZTogR2VuZXJhbAorTWFwcGluZ0ZhY3RvcnktY2F0OiBNYXBwaW5ncworTWFwcGluZ0ZhY3RvcnktZGlzcGxheW9yZGVyOiA1MAorTWFwcGluZ0ZhY3RvcnktZXhwZXJ0OiB0cnVlCitNYXBwaW5nRmFjdG9yeS1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhRmFjdG9yeQorCitNYXBwaW5nRGVmYXVsdHMtbmFtZTogTWFwcGluZyBkZWZhdWx0cworTWFwcGluZ0RlZmF1bHRzLWRlc2M6IFRoZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdEZWZhdWx0cyB0aGF0IFwKKyAgICBkZXRlcm1pbmVzIGRlZmF1bHQgdGFibGUgbmFtZXMsIGNvbHVtbiBuYW1lcywgYW5kIG90aGVyIGluZm9ybWF0aW9uLgorTWFwcGluZ0RlZmF1bHRzLXR5cGU6IEdlbmVyYWwKK01hcHBpbmdEZWZhdWx0cy1jYXQ6IE1hcHBpbmdzCitNYXBwaW5nRGVmYXVsdHMtZGlzcGxheW9yZGVyOiA1MAorTWFwcGluZ0RlZmF1bHRzLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nRGVmYXVsdHMKKworQ29ubmVjdGlvbkRyaXZlck5hbWUtdmFsdWVzOiBvcmcuaHNxbGRiLmpkYmNEcml2ZXIsb3JnLmhzcWwuamRiY0RyaXZlcixcCisJb3JnLmgyLkRyaXZlcixcCisJQ09NLmNsb3Vkc2NhcGUuY29yZS5KREJDRHJpdmVyLGluLmNvLmRhZmZvZGlsLmRiLmpkYmMuRGFmZm9kaWxEQkRyaXZlcixcCisJY29tLmRkdGVrLmpkYmMuZGIyLkRCMkRyaXZlcixpbnRlcmJhc2UuaW50ZXJjbGllbnQuRHJpdmVyLFwKKwljb20ubXlzcWwuamRiYy5Ecml2ZXIsY29tLmRkdGVrLmpkYmMub3JhY2xlLk9yYWNsZURyaXZlcixcCisJb3JnLnBvc3RncmVzcWwuRHJpdmVyLGNvbS5wb2ludGJhc2UuamRiYy5qZGJjVW5pdmVyc2FsRHJpdmVyLFwKKwlvcmcuc291cmNlZm9yZ2UuanhkYmNvbi5KWERCQ29uRHJpdmVyLFwKKwljb20uZGR0ZWsuamRiYy5zcWxzZXJ2ZXIuU1FMU2VydmVyRHJpdmVyLGNvbS5qbmV0ZGlyZWN0LmpzcWwuSlNRTERyaXZlcixcCisJY29tLm1pY3Jvc29mdC5qZGJjLnNxbHNlcnZlci5TUUxTZXJ2ZXJEcml2ZXIsXAorCXdlYmxvZ2ljLmpkYmMubXNzcWxzZXJ2ZXI0LkRyaXZlcixjb20uZGR0ZWsuamRiYy5zeWJhc2UuU3liYXNlRHJpdmVyLFwKKwlvcmFjbGUuamRiYy5wb29sLk9yYWNsZURhdGFTb3VyY2Usb3JnLmF4aW9uZGIuamRiYy5BeGlvbkRyaXZlcixcCisJQ09NLmlibS5kYjIuamRiYy5hcHAuREIyRHJpdmVyLGNvbS5pYm0uYXM0MDAuYWNjZXNzLkFTNDAwSkRCQ0RyaXZlcixcCisJQ09NLkZpcnN0U1FMLkRiY3AuRGJjcERyaXZlcixDT00uaWJtLmRiMi5qZGJjLm5ldC5EQjJEcml2ZXIsXAorCW9yZy5lbmh5ZHJhLmluc3RhbnRkYi5qZGJjLmlkYkRyaXZlcixjb20uaW5mb3JtaXguamRiYy5JZnhEcml2ZXIsXAorCWNvbS5taWNyb3NvZnQuamRiYy5zcWxzZXJ2ZXIuU1FMU2VydmVyRHJpdmVyLFwKKwljb20uaW1hZ2luYXJ5LnNxbC5tc3FsLk1zcWxEcml2ZXIsc3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlcixcCisJb3JhY2xlLmpkYmMuZHJpdmVyLk9yYWNsZURyaXZlcixpbnRlcnNvbHYuamRiYy5zZXF1ZWxpbmsuU2VxdWVMaW5rRHJpdmVyLFwKKwlvcGVubGluay5qZGJjMi5Ecml2ZXIsY29tLnBvaW50YmFzZS5qZGJjLmpkYmNVbml2ZXJzYWxEcml2ZXIsXAorCXBvc3RncmVzOTUuUEdEcml2ZXIscG9zdGdyZXNxbC5Ecml2ZXIsc29saWQuamRiYy5Tb2xpZERyaXZlcixcCisgCWNlbnR1cmEuamF2YS5zcWxiYXNlLlNxbGJhc2VEcml2ZXIsaW50ZXJiYXNlLmludGVyY2xpZW50LkRyaXZlcixcCisJY29tLm1ja29pLkpEQkNEcml2ZXIsY29tLmluZXQudGRzLlRkc0RyaXZlcixcCisJY29tLm1pY3Jvc29mdC5qZGJjLnNxbHNlcnZlci5TUUxTZXJ2ZXJEcml2ZXIsY29tLnRoaW53ZWIudGRzLkRyaXZlcixcCisJd2VibG9naWMuamRiYy5tc3NxbHNlcnZlcjQuRHJpdmVyLGNvbS5teXNxbC5qZGJjLkRhdGFiYXNlTWV0YURhdGEsXAorCW9yZy5nanQubW0ubXlzcWwuRHJpdmVyLGNvbS5zYXAuZGJ0ZWNoLmpkYmMuRHJpdmVyU2FwREIsXAorCWNvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXIsY29tLnN5YmFzZS5qZGJjLlN5YkRyaXZlcixcCisJY29tLmludGVybmV0Y2RzLmpkYmMudGRzLkRyaXZlcix3ZWJsb2dpYy5qZGJjLnBvb2wuRHJpdmVyCitDb25uZWN0aW9uVVJMLXZhbHVlczogamRiYzpKU1FMQ29ubmVjdDovLzxob3N0bmFtZT4vZGF0YWJhc2U9PGRhdGFiYXNlPixcCisJamRiYzpjbG91ZHNjYXBlOjxkYXRhYmFzZT47Y3JlYXRlPXRydWUsXAorCWpkYmM6dHd0ZHM6c3Fsc2VydmVyOi8vPGhvc3RuYW1lPi88ZGF0YWJhc2U+LFwKKwlqZGJjOmRhZmZvZGlsREJfZW1iZWRkZWQ6PGRhdGFiYXNlPjtjcmVhdGU9dHJ1ZSxcCisJamRiYzpkYXRhZGlyZWN0OmRiMjovLzxob3N0bmFtZT46NTAwMDA7ZGF0YWJhc2VOYW1lPTxkYXRhYmFzZT4sXAorCWpkYmM6aW5ldGRhZTo8aG9zdG5hbWU+OjE0MzMsXAorCWpkYmM6ZGF0YWRpcmVjdDpvcmFjbGU6Ly88aG9zdG5hbWU+OjE1MjE7U0lEPTxkYXRhYmFzZT47XAorCU1heFBvb2xlZFN0YXRlbWVudHM9MCxcCisJamRiYzpkYXRhZGlyZWN0OnNxbHNlcnZlcjovLzxob3N0bmFtZT46MTQzMztTZWxlY3RNZXRob2Q9Y3Vyc29yO1wKKwlEYXRhYmFzZU5hbWU9PGRhdGFiYXNlPixqZGJjOmRhdGFkaXJlY3Q6c3liYXNlOi8vPGhvc3RuYW1lPjo1MDAwLFwKKwlqZGJjOmRiMjovLzxob3N0bmFtZT4vPGRhdGFiYXNlPixqZGJjOmhzcWxkYjo8ZGF0YWJhc2U+LGpkYmM6aDI6PGRhdGFiYXNlPixcCisJamRiYzppZGI6PGRhdGFiYXNlPi5wcm9wZXJ0aWVzLFwKKwlqZGJjOmluZm9ybWl4LXNxbGk6Ly88aG9zdG5hbWU+OjE1MjYvPGRhdGFiYXNlPjpJTkZPUk1JWFNFUlZFUj08ZGF0YWJhc2U+LFwKKwlqZGJjOmludGVyYmFzZTovLzxob3N0bmFtZT4vLzxkYXRhYmFzZT4uZ2RiLFwKKwlqZGJjOm1pY3Jvc29mdDpzcWxzZXJ2ZXI6Ly88aG9zdG5hbWU+OjE0MzM7RGF0YWJhc2VOYW1lPTxkYXRhYmFzZT47XAorCVNlbGVjdE1ldGhvZD1jdXJzb3IsamRiYzpteXNxbDovLzxob3N0bmFtZT4vPGRhdGFiYXNlPj9hdXRvUmVjb25uZWN0PXRydWUsXAorCWpkYmM6b3JhY2xlOnRoaW46QDxob3N0bmFtZT46MTUyMTo8ZGF0YWJhc2U+LFwKKwlqZGJjOnBvc3RncmVzcWw6Ly88aG9zdG5hbWU+OjU0MzIvPGRhdGFiYXNlPixcCisJamRiYzpwb3N0Z3Jlc3FsOm5ldC8vPGhvc3RuYW1lPi88ZGF0YWJhc2U+LFwKKwlqZGJjOnN5YmFzZTpUZHM6PGhvc3RuYW1lPjo0MTAwLzxkYXRhYmFzZT4/U2VydmljZU5hbWU9PGRhdGFiYXNlPixcCisJamRiYzp3ZWJsb2dpYzptc3NxbHNlcnZlcjQ6PGRhdGFiYXNlPkA8aG9zdG5hbWU+OjE0MzMsXAorCWpkYmM6b2RiYzo8ZGF0YWJhc2U+LGpkYmM6c2VxdWVsaW5rOi8vPGhvc3RuYW1lPjo0MDAzL1tPcmFjbGVdLFwKKwlqZGJjOnNlcXVlbGluazovLzxob3N0bmFtZT46NDAwNC9bSW5mb3JtaXhdO0RhdGFiYXNlPTxkYXRhYmFzZT4sXAorCWpkYmM6c2VxdWVsaW5rOi8vPGhvc3RuYW1lPjo0MDA1L1tTeWJhc2VdO0RhdGFiYXNlPTxkYXRhYmFzZT4sXAorCWpkYmM6c2VxdWVsaW5rOi8vPGhvc3RuYW1lPjo0MDA2L1tTUUxTZXJ2ZXJdO0RhdGFiYXNlPTxkYXRhYmFzZT4sXAorCWpkYmM6c2VxdWVsaW5rOi8vPGhvc3RuYW1lPjo0MDExL1tPREJDIE1TIEFjY2Vzc107RGF0YWJhc2U9PGRhdGFiYXNlPixcCisJamRiYzpvcGVubGluazovLzxob3N0bmFtZT4vRFNOPVNRTFNlcnZlckRCL1VJRD1zYS9QV0Q9LFwKKwlqZGJjOnNvbGlkOi8vPGhvc3RuYW1lPjo8cG9ydD4vPFVJRD4vPFBXRD4sXAorCWpkYmM6ZGJhdzovLzxob3N0bmFtZT46ODg4OS88ZGF0YWJhc2U+CisKK2Nvbm5lY3RpbmctZm9yLWRpY3Rpb25hcnk6IE9wZW5KUEEgd2lsbCBub3cgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UgdG8gYXR0ZW1wdCBcCisgICAgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBkYXRhYmFzZSBkaWN0aW9uYXJ5IHRvIHVzZS4gIFRvIHByZXZlbnQgdGhpcyBcCisJY29ubmVjdGlvbiBpbiB0aGUgZnV0dXJlLCBzZXQgeW91ciBvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5IFwKKyAgICBjb25maWd1cmF0aW9uIHByb3BlcnR5IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgeW91ciBkYXRhYmFzZSAoc2VlIFwKKyAgICB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYXZhaWxhYmxlIHZhbHVlcykuCittYXAtZmFjdG9yeTogVXNpbmcgbWFwcGluZyBmYWN0b3J5ICJ7MH0iLgorbWV0YS1mYWN0b3J5OiBVc2luZyBtZXRhZGF0YSBmYWN0b3J5ICJ7MH0iLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWQ5MWMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitiYWQtZ2V0b2JqZWN0aWQ6IEF0dGVtcHQgdG8gZ2V0IHRoZSBvYmplY3QgaWQgb2YgYSBub24tcGVyc2lzdGVudCBvciBcCisJZW1iZWRkZWQgb2JqZWN0IGZpZWxkICJ7MH0iLgorbm9uLXBlcnMtZmllbGQ6IEZpZWxkICJ7MH0iIGlzIG5vdCBwZXJzaXN0ZW50LCBhbmQgdGh1cyBjYW5ub3QgYmUgcXVlcmllZC4KK25vLWluLW1lbTogVGhlIGZpbHRlciBsaXN0ZW5lciAiezB9IiBkb2VzIG5vdCBzdXBwb3J0IGluLW1lbW9yeSBvcGVyYXRpb247IGl0IFwKKwljYW4gb25seSBiZSB1c2VkIHdpdGggcXVlcmllcyBhZ2FpbnN0IHRoZSBkYXRhYmFzZS4KK2NvbnN0LW9ubHk6IFRoZSBmaWx0ZXIgbGlzdGVuZXIgInswfSIgcmVxdWlyZXMgYSBjb25zdGFudCBhcmd1bWVudC4JCitwYXRoLW9ubHk6IFRoZSB0YXJnZXQgZm9yIGZpbHRlciBsaXN0ZW5lciAiezB9IiBtdXN0IGJlICJ0aGlzIiBvciBzb21lIFwKKwlmaWVsZCB0cmF2ZXJzYWwgdG8gYSByZWxhdGVkIG9iamVjdHMsIHN1Y2ggYXMgImNvbXBhbnkuYWRkcmVzcyIuCituby1jb2w6IFRoZSBjb2x1bW4gInswfSIgZ2l2ZW4gdG8gZmlsdGVyICJ7MX0iIGRvZXNuJyd0IGV4aXN0IGluIHRoZSB0YWJsZSBcCisJb2YgdGhlIHNwZWNpZmllZCB0YXJnZXQuCitjYW50LWNvbnZlcnQ6IEF0dGVtcHQgdG8gY29tcGFyZSBpbmNvbXBhdGlibGUgdHlwZXMgInswfSIgYW5kICJ7MX0iLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZDNlNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMDQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworZXJyb3Itcm9sbGJhY2s6IEFuIGVycm9yIG9jY3VycmVkIGF0dGVtcHRpbmcgdG8gcm9sbGJhY2sgdG8gdGhlIHNhdmVwb2ludCAiezB9IgorZXJyb3Itc2F2ZTogQW4gZXJyb3Igb2NjdXJyZWQgYXR0ZW1wdGluZyB0byBzZXQgdGhlIHNhdmVwb2ludCAiezB9Ii4gIFRoaXMgXAorCWRyaXZlciBtYXkgbm90IHN1cHBvcnQgSkRCQyAzIHNhdmVwb2ludHMuCittdWx0LW1hcHBpbmctYWdncmVnYXRlOiBDYW5ub3QgcGVyZm9ybSBhbiBhZ2dyZWdhdGUgcXVlcnkgb24gYSBoaWVyYXJjaHkgd2l0aCBcCisJdW5qb2luZWQgc3ViY2xhc3NlczogezB9CitzcWxxdWVyeS1taXNzaW5nLXBhcmFtczogU1FMIHF1ZXJ5ICJ7MH0iIGRlY2xhcmVzIGEgcGFyYW1ldGVyIGluZGV4ICJ7MX0iIGZvciBcCisJd2hpY2ggbm8gdmFsdWUgd2FzIGdpdmVuLiAgVGhlIGdpdmVuIHBhcmFtZXRlcnMgd2VyZTogezJ9Cituby1zcWw6IFlvdSBoYXZlIG5vdCBzcGVjaWZpZWQgYSBTUUwgZmlsdGVyIHRvIGV4ZWN1dGUgaW4geW91ciBTUUwgcXVlcnkuCitkZWwtaW5zLWN5Y2xlOiBBbiB1bnJlc29sdmFibGUgY29uc3RyYWludCBjeWNsZSB3YXMgZGV0ZWN0ZWQuICBUaGlzIHR5cGljYWxseSBcCisJbWVhbnMgdGhhdCB5b3UgYXJlIHBlcnNpc3RpbmcgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJpbWFyeSBrZXkgdmFsdWUgXAorCWFzIGFuIG9iamVjdCB5b3UgYXJlIGRlbGV0aW5nIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCBhbmQgYXQgdGhlIHNhbWUgXAorCXRpbWUgeW91IGhhdmUgY2lyY3VsYXIgZm9yZWlnbiBrZXkgZGVwZW5kZW5jaWVzIGluIHRoZSB0cmFuc2FjdGlvbi4gIFRoZSBcCisJY29tYmluYXRpb24gb2YgdGhlc2UgdHdvIGZhY3RvcnMgY2FuIHNvbWV0aW1lcyBsZWFkIHRvIGEgc2l0dWF0aW9uIGluIFwKKwl3aGljaCBPcGVuSlBBIGNhbm5vdCBtZWV0IGFsbCB0aGUgZGF0YWJhc2UgY29uc3RyYWludHMuCityZWYtY3ljbGU6IEFuIHVucmVzb2x2YWJsZSBjb25zdHJhaW50IGN5Y2xlIHdhcyBkZXRlY3RlZC4gIFRoaXMgdHlwaWNhbGx5IFwKKwltZWFucyB0aGF0IGEgbWFwcGluZyBpbiBhIHRhYmxlIG90aGVyIHRoYW4gdGhlIGNsYXNzJycgcHJpbWFyeSB0YWJsZSBoYXMgXAorCWEgZm9yZWlnbiBrZXkgdGhhdCBpcyBwYXJ0IG9mIGEgY2lyY3VsYXIgZm9yZWlnbiBrZXkgZGVwZW5kZW5jeS4gIE9wZW5KUEEgXAorCXNvbWV0aW1lcyBjYW5ub3QgbWVldCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgd2hlbiBzb21lIG9mIHRoZSBpbnZvbHZlZCBcCisJbWFwcGluZ3MgYXJlIGluIHNlY29uZGFyeSB0YWJsZXMuCit1cGRhdGUtZmFpbGVkLW5vLWZhaWxlZC1vYmo6IERhdGFiYXNlIG9wZXJhdGlvbiBmYWlsZWQuIFVwZGF0ZSBjb3VudCBmb3IgU1FMIFwKKyAgICBzdGF0ZW1lbnQgd2FzIHswfS4gU3RhdGVtZW50OiB7MX0KK3ZpcnR1YWwtbWFwcGluZzogQ2Fubm90IGluc3RhbnRpYXRlIHZpcnR1YWwgbWFwcGluZyAiezB9Ii4KK3ByZXNzLWtleS1lbmQ6IFNlcnZlciBydW5uaW5nLiAgUHJlc3MgZW50ZXIgdG8gc3RvcC4KK25vLXNlcnZlci1jb25mOiBUaGVyZSBpcyBubyBwZXJzaXN0ZW5jZSBzZXJ2ZXIgY29uZmlndXJlZC4KK3NlcnZlci11c2FnZTogVXNhZ2U6IFwKKyAgICBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5TdGFydFBlcnNpc3RlbmNlU2VydmVyXG5cCisJXHRbLXByb3BlcnRpZXMvLXAgPHByb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLTxwcm9wZXJ0eSBuYW1lPiA8cHJvcGVydHkgdmFsdWU+XSogCitjYW50LWxvY2stb24tbG9hZDogVGhlIGRhdGFiYXNlIGlzIHVuYWJsZSB0byBsb2NrIHRoaXMgcXVlcnkuICBFYWNoIG9iamVjdCBcCisJbWF0Y2hpbmcgdGhlIHF1ZXJ5IHdpbGwgYmUgbG9ja2VkIGluZGl2aWR1YWxseSBhZnRlciBpdCBpcyBsb2FkZWQ7IFwKKwlob3dldmVyLCBpdCBpcyB0ZWNobmljYWxseSBwb3NzaWJsZSB0aGF0IGFub3RoZXIgdHJhbnNhY3Rpb24gY291bGQgbW9kaWZ5IFwKKwl0aGUgZGF0YSBiZWZvcmUgdGhlIGxvY2sgaXMgb2J0YWluZWQuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gT2JqZWN0IFwKKwlMb2NraW5nIGZvciBkZXRhaWxzLlxuInswfSIgCitzdGFydC10cmFucy1mb3ItbG9jazogVGhvdWdoIHlvdSBhcmUgdXNpbmcgb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMsIE9wZW5KUEEgaXMgXAorCW5vdyBiZWdpbm5pbmcgYSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24gYmVjYXVzZSB5b3UgaGF2ZSByZXF1ZXN0ZWQgYSBsb2NrIFwKKwlvbiBzb21lIGRhdGEuCittaWxsaXMtcXVlcnktdGltZW91dDogSkRCQyBsb2NraW5nIGRvZXMgbm90IHN1cHBvcnQgbWlsbGlzZWNvbmQtZ3JhbnVsYXJpdHkgXAorICAgIHRpbWVvdXRzLiAgVXNlIHRpbWVvdXRzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiAxMDAwIGZvciBldmVuIHNlY29uZCB2YWx1ZXMuCitiYXRjaC1ub3Qtc3VwcG9ydGVkOiBUaGUgdXBkYXRlIGNvdW50IGZvciB0aGUgc3RhdGVtZW50IHdhcyBhbiBpbnZhbGlkIFwKKwl2YWx1ZSAoezB9KS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3VyIGRhdGFiYXNlIG9yIEpEQkMgZHJpdmVyIGRvZXMgbm90IFwKKwloYXZlIGNvbXBsZXRlIHN1cHBvcnQgZm9yIGV4ZWN1dGluZyBiYXRjaCBzdGF0ZW1lbnRzLiBCYXRjaCBcCisJZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgaW5jbHVkaW5nICJCYXRjaExpbWl0PTAiIGluIFwKKwl5b3VyIG9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gU3RhdGVtZW50OiB7MX0KK2JhZC1zeW5jaC1tYXBwaW5nczogSW52YWxpZCBTeW5jaHJvbml6ZU1hcHBpbmdzIG9wZXJhdGlvbiAoInswfSIpIHNwZWNpZmllZC4gXAorCVZhbGlkIG9wZXJhdGlvbnMgYXJlOiB7MX0KK21ha2UtbmF0aXZlLXNlcTogQ3JlYXRpbmcgc2VxdWVuY2UuCitkcm9wLW5hdGl2ZS1zZXE6IERyb3BwaW5nIHNlcXVlbmNlLgorbWFrZS1zZXEtdGFibGU6IENyZWF0aW5nIHNlcXVlbmNlIHRhYmxlLgorZHJvcC1zZXEtdGFibGU6IERyb3BwaW5nIHNlcXVlbmNlIHRhYmxlLgorYmFkLXNlcS11cDogQXR0ZW1wdCB0byB1cGRhdGUgdGhlIHNlcXVlbmNlIHRhYmxlICJ7MH0iIGZhaWxlZC4gIFRoZSBzZXF1ZW5jZSBcCisJdGFibGUgaXMgdHlwaWNhbGx5IGNyZWF0ZWQgd2hlbiB5b3UgcnVuIHRoZSBtYXBwaW5ndG9vbCcncyByZWZyZXNoIGFjdGlvbiBcCisJb24gYW55IGRhdGFzdG9yZSBpZGVudGl0eSBjbGFzcy4gSWYgeW91IGhhdmUgbm90IHJ1biB0aGUgbWFwcGluZ3Rvb2wgYnV0IFwKKwl3YW50IHRvIGNyZWF0ZSB0aGUgc2VxdWVuY2UgdGFibGUsIHJ1bjpcblwKKwlqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5UYWJsZUpEQkNTZXEgLWFjdGlvbiBhZGQKK2JhZC1zZXEtdHlwZTogVGhpcyBzZXF1ZW5jZSBvZiB0eXBlICJ7MH0iIGNhbm5vdCBnZW5lcmF0ZSB2YWx1ZXMgZm9yIFwKKwlwZXJzaXN0ZW50IHR5cGUgInsxfSIuCituby1zZXEtc3FsOiBFcnJvciBpbnN0YW50aWF0aW5nIG5hbWVkIHNlcXVlbmNlICJ7MH0iOiBZb3VyIGRhdGFiYXNlIGRpY3Rpb25hcnkgXAorCWRvZXMgbm90IHN1cHBvcnQgbmF0aXZlIHNlcXVlbmNlcy4gIFRvIHRlbGwgdGhlIGRpY3Rpb25hcnkgaG93IHRvIHNlbGVjdCBcCisJc2VxdWVuY2UgdmFsdWVzLCB1c2U6XG5cCisJb3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeTogTmV4dFNlcXVlbmNlUXVlcnk9IlNFTEVDVCBORVhUIFZBTFVFIFwKKyAgICBGT1IgXHswXH0iXG5cCisJV2hlcmUgdGhlIGFib3ZlIHN0cmluZyBpcyByZXBsYWNlZCB3aXRoIHRoZSBwcm9wZXIgU1FMIGZvciB5b3VyIGRhdGFiYXNlLgoraW52YWxpZC1zZXEtc3FsOiBObyByb3dzIHJldHVybmVkIGZvciBzcWwgInswfSIuICBDaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24uCitpbnNlcnQtc2VxOiBJbnNlcnRpbmcgcm93IGZvciB0aGlzIG1hcHBpbmcgaW50byBzZXF1ZW5jZSB0YWJsZS4KK25vLXNlcS1yb3c6IFRoZXJlIGlzIG5vIHJvdyBmb3IgbWFwcGluZyAiezB9IiBpbiBzZXF1ZW5jZSB0YWJsZSAiezF9IiwgYW5kIFwKKwl0aGUgYXR0ZW1wdCB0byBpbnNlcnQgYSByb3cgaGFzIGFwcGFyZW50bHkgZmFpbGVkLgordXBkYXRlLXNlcTogVXBkYXRpbmcgc2VxdWVuY2UgdmFsdWVzLgorbnVsbC1qb2luOiBBdHRlbXB0IHRvIGFkZCBhIG51bGwvZW1wdHkgZmV0Y2ggam9pbiBmaWVsZC4KK2dldC1zZXE6IEdldHRpbmcgY3VycmVudCBzZXF1ZW5jZSB2YWx1ZXMuCitzZXEtdXNhZ2U6IFVzYWdlOiBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5UYWJsZUpEQkNTZXFcblwKKwlcdFstcHJvcGVydGllcy8tcCA8cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstPHByb3BlcnR5IG5hbWU+IDxwcm9wZXJ0eSB2YWx1ZT5dKlxuXAorCVx0LWFjdGlvbi8tYSA8YWRkIHwgZHJvcCB8IGdldCB8IHNldD4gW3ZhbHVlXQorY2xzdGFibGUtc2VxLXVzYWdlOiBVc2FnZTogXAorICAgIGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkNsYXNzVGFibGVKREJDU2VxXG5cCisJXHRbLXByb3BlcnRpZXMvLXAgPHByb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLTxwcm9wZXJ0eSBuYW1lPiA8cHJvcGVydHkgdmFsdWU+XSpcblwKKwlcdC1hY3Rpb24vLWEgPGFkZCB8IGRyb3AgfCBnZXQgfCBzZXQ+XG5cCisJXHRbY2xhc3MgbmFtZSB8IC5qYXZhIGZpbGUgfCAuY2xhc3MgZmlsZSB8IC5qZG8gZmlsZV0gW3ZhbHVlXQorbmF0aXZlLXNlcS11c2FnZTogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLk5hdGl2ZUpEQkNTZXFcblwKKwlcdFstcHJvcGVydGllcy8tcCA8cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstPHByb3BlcnR5IG5hbWU+IDxwcm9wZXJ0eSB2YWx1ZT5dKgorYmFkLWxldmVsOiBJbnZhbGlkIGlzb2xhdGlvbiBsZXZlbC4gVmFsaWQgbGV2ZWxzIGFyZSAtMSwgXAorICAgIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fTk9ORSwgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVELCBcIAorICAgIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQsIFwKKyAgICBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCwgb3IgXAorICAgIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFLiBTcGVjaWZpZWQgdmFsdWU6IHswfS4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL2phdmEta2V5d29yZHMucnNyYyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL2phdmEta2V5d29yZHMucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTExMWZjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvamF2YS1rZXl3b3Jkcy5yc3JjCkBAIC0wLDAgKzEgQEAKK2Fic3RyYWN0LGFicyxhc3NlcnQsYXNzZXJ0aW9uLGJvb2xlYW4sYm9vbCxicmVhayxicmssYnl0ZSxiaXRzLGNhc2UsY3NlLGNhdGNoLGN0Y2gsY2hhcixjaCxjbGFzcyx0eXBlLGNvbnN0LGNuc3QsY29udGludWUsY29udCxkZWZhdWx0LGRlZixkbyxkb0l0LGRvdWJsZSxkYmwsZWxzZSxlbHMsZXh0ZW5kcyxleHRlbmQsZmluYWwsZm5sLGZpbmFsbHksZm5seSxmbG9hdCxmbHQsZm9yLGZvcldoYXQsZ290byxnbzIsaWYsaWZUcnVlLGltcGxlbWVudHMsaW1wbCxpbXBvcnQsaW1wb3J0cyxpbnN0YW5jZW9mLGluc3RhbmNlLGludCxpbnRlZ2VyLGludGVyZmFjZSxpbnRyZmFjZSxsb25nLGxvbmdpbnQsbmF0aXZlLG5hdGl2ZWx5LG5ldyxpc05ldyxudWxsLGlzTnVsbCxwYWNrYWdlLHBrZyxwcml2YXRlLHByaXYscHJvdGVjdGVkLHByb3RlY3QscHVibGljLHB1YixyZXR1cm4scmV0LHNob3J0LHNocnQsc3RhdGljLHN0YXQsc3VwZXIsc3VwLHN3aXRjaCxjaGFuZ2Usc3luY2hyb25pemVkLHN5bmNoLHRoaXMsdGhpc09uZSx0aHJvdyx0aHJ3LHRocm93cyx0aHJ3cyx0cmFuc2llbnQsdHJhbnMsdHJ5LHRyeUl0LHZvaWQsaXNWb2lkLHZvbGF0aWxlLHZvbCx3aGlsZSx3aGlsCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTY3NzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDQxMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCityZXNvbHZlLW1hcHBpbmc6IFJlc29sdmluZyBtYXBwaW5nIGZvciAiezB9Ii4KK2luaXQtbWFwcGluZzogSW5pdGlhbGl6aW5nIG1hcHBpbmcgZm9yICJ7MH0iLgorc3RyYXRlZ3k6ICJ7MH0iIGhhcyBtYXBwaW5nIHN0cmF0ZWd5ICJ7MX0iLgorZmllbGQtc3RyYXRlZ3k6IFx0InswfSIgaGFzIG1hcHBpbmcgc3RyYXRlZ3kgInsxfSIuCituby1lcXVpdi1jb2w6IENhbm5vdCB1c2UgInswfSIgYXMgdGhlIG1hcHBlZC1ieSB2YWx1ZSBmb3IgYSBmaWVsZCBpbiAiezF9Ii4gIFwKKwlUaGVyZSBpcyBubyBjb2x1bW4gInsyfSIgaW4gdGhpcyBzdWJjbGFzcycnIHRhYmxlLgorbm8tZXF1aXYtZmllbGQ6IENhbm5vdCB1c2UgInswfSIgYXMgdGhlIG1hcHBlZC1ieSB2YWx1ZSBmb3IgYSBmaWVsZCBpbiAiezF9Ii4gIFwKKwlUaGVyZSBpcyBubyB0YXJnZXQtZmllbGQgInsyfSIgZm9yIGNvbHVtbiAiezN9IiBpbiB0aGlzIHN1YmNsYXNzLgorYmFkLWVxdWl2LWZpZWxkOiBDYW5ub3QgdXNlICJ7MH0iIGFzIHRoZSBtYXBwZWQtYnkgdmFsdWUgZm9yIGEgZmllbGQgaW4gInsxfSIuIFwKKwlUaGUgdGFyZ2V0LWZpZWxkICJ7Mn0iIGZvciBjb2x1bW4gInszfSIgaXMgbWFwcGVkIHRvIG11bHRpcGxlIGNvbHVtbnMuCituby1tYXBwaW5nOiBObyBtYXBwaW5nIGluZm9ybWF0aW9uIGZvdW5kIGZvciB0eXBlICJ7MH0iLgorYmFkLW1hcHBlZC1ieTogQ29sbGVjdGlvbiBmaWVsZCAiezB9IiBkZWNsYXJlcyB0aGF0IGl0IGlzIG1hcHBlZCBieSAiezF9IiwgYnV0IFwKKwl0aGlzIGlzIG5vdCBhIHZhbGlkIGludmVyc2UgcmVsYXRpb24uCituby10YXJnZXRmaWVsZDogU29tZSBvZiB0aGUgY29sdW1ucyBvbiAiezB9IiBhcmUgbWlzc2luZyB0YXJnZXQgZmllbGQgXAorCWRlY2xhcmF0aW9ucy4KK2JhZC10YXJnZXRmaWVsZDogInswfSIgaGFzIGEgY29sdW1uIHdpdGggdGFyZ2V0IGZpZWxkICJ7MX0iLCBidXQgdGhhdCBpcyBub3QgYSBcCisJcHJpbWFyeSBrZXkgZmllbGQgb2YgdGhlIHJlbGF0ZWQgY2xhc3MuCituby1qb2luYWJsZTogWW91IGNhbm5vdCBqb2luIG9uIGNvbHVtbiAiezB9Ii4gIEl0IGlzIG5vdCBtYW5hZ2VkIGJ5IGEgbWFwcGluZyBcCisJdGhhdCBzdXBwb3J0cyBqb2lucy4KK2pvaW4tcmVxdWlyZWQ6IE1pc3NpbmcgdGFibGUgbmFtZSBmb3IgZmllbGQgInswfSIuICBUaGlzIGZpZWxkIGNhbm5vdCByZXNpZGUgXAorCWluIHRoZSBvd25pbmcgY2xhc3MgdGFibGUuCitiYWQtZGlzY3JpbS12YWx1ZTogVGhlIGRlY2xhcmVkIGRpc2NyaW1pbmF0b3IgdmFsdWUgInsxfSIgZm9yIHR5cGUgInswfSIgXAorCWNhbm5vdCBiZSBwYXJzZWQgYXMgYSBudW1iZXIsIHRob3VnaCBpdCBzdGFydHMgd2l0aCBhIGRpZ2l0LgordW5leHBlY3RlZC1jb2xzOiBZb3UgaGF2ZSBzdXBwbGllZCBjb2x1bW5zIGZvciAiezB9IiwgYnV0IHRoaXMgbWFwcGluZyBjYW5ub3QgXAorCWhhdmUgY29sdW1ucyBpbiB0aGlzIGNvbnRleHQuCit1bmV4cGVjdGVkLWluZGV4OiAiezB9IiBpcyBtYXJrZWQgYXMgaW5kZXhlZCwgYnV0IE9wZW5KUEEgZG9lcyBub3Qgc3VwcG9ydCBcCisJYW4gaW5kZXggb24gdGhpcyBtYXBwaW5nIGluIHRoaXMgY29udGV4dC4KK3VuZXhwZWN0ZWQtdW5pcXVlOiAiezB9IiBpcyBtYXJrZWQgYXMgaGF2aW5nIGEgdW5pcXVlIGNvbnN0cmFpbnQsIGJ1dCBPcGVuSlBBIFwKKwlkb2VzIG5vdCBzdXBwb3J0IGEgY29uc3RyYWludCBvbiB0aGlzIG1hcHBpbmcgaW4gdGhpcyBjb250ZXh0LgordW5leHBlY3RlZC1mazogInswfSIgaXMgbWFya2VkIGFzIGhhdmluZyBhIGZvcmVpZ24ga2V5LCBidXQgT3BlbkpQQSBkb2VzIG5vdCBcCisJc3VwcG9ydCBhIGZvcmVpZ24ga2V5IG9uIHRoaXMgbWFwcGluZyBpbiB0aGlzIGNvbnRleHQuCit1bmV4cGVjdGVkLWpvaW46ICJ7MH0iIGhhcyBjb2x1bW5zIHdpdGggdGFyZ2V0cywgYnV0IE9wZW5KUEEgZG9lcyBub3Qgc3VwcG9ydCBhbnkgXAorCWpvaW5zIG9uIHRoaXMgbWFwcGluZyBpbiB0aGlzIGNvbnRleHQuCit1bmV4cGVjdGVkLXN0cmF0ZWd5OiAiezB9IiBoYXMgYW4gaW52YWxpZCBtYXBwaW5nIHN0cmF0ZWd5IGluIHRoaXMgY29udGV4dC4gXAorCUV4cGVjdGVkICJ7MX0iIGJ1dCBmb3VuZCAiezJ9Ii4KK25vLXRhYmxlOiBObyB0YWJsZSB3YXMgZ2l2ZW4gZm9yIHBlcnNpc3RlbnQgdHlwZSAiezB9Ii4KK2JhZC10YWJsZTogVGFibGUgInswfSIgZ2l2ZW4gZm9yICJ7MX0iIGRvZXMgbm90IGV4aXN0LgorZ2VuZXJpYy1udW0tY29sczogRm9yICJ7MH0iLCBleHBlY3RlZCB7MX0gY29sdW1uKHMpLCBidXQgZm91bmQgezJ9LgorZ2VuZXJpYy1uby1jb2wtbmFtZTogTm8gY29sdW1uIG5hbWUgd2FzIGdpdmVuIGZvciAiezB9Ii4KK2dlbmVyaWMtYmFkLWNvbC1uYW1lOiAiezB9IiBkZWNsYXJlcyBjb2x1bW4gInsxfSIsIGJ1dCB0aGlzIGNvbHVtbiBkb2VzIG5vdCBcCisJZXhpc3QgaW4gdGFibGUgInsyfSIuCitnZW5lcmljLWluY29tcGF0LWNvbDogInswfSIgZGVjbGFyZXMgYSBjb2x1bW4gInsxfSIgd2hvc2UgamRiYy10eXBlIGlzIG5vdCBcCisJY29tcGF0aWJsZSB3aXRoIHRoZSBleHBlY3RlZCB0eXBlICJ7Mn0iLgorZ2VuZXJpYy1iYWQtY29sOiAiezB9IiBkZWNsYXJlcyBhIGNvbHVtbiB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwKKwlleHBlY3RlZCB0eXBlICJ7MX0iLiAgQ29sdW1uIGRldGFpbHM6XG57Mn0KK2RhdGFzdG9yZWlkLW51bS1jb2xzOiBGb3IgdHlwZSAiezB9IiwgZXhwZWN0ZWQgezF9IGRhdGFzdG9yZSBpZGVudGl0eSBcCisJY29sdW1uKHMpLCBidXQgZm91bmQgezJ9LgorZGF0YXN0b3JlaWQtbm8tY29sLW5hbWU6IE5vIGRhdGFzdG9yZSBpZGVudGl0eSBjb2x1bW4gbmFtZSB3YXMgZ2l2ZW4gZm9yICJ7MH0iLgorZGF0YXN0b3JlaWQtYmFkLWNvbC1uYW1lOiBUeXBlICJ7MH0iIGRlY2xhcmVzIGRhdGFzdG9yZSBpZGVudGl0eSBjb2x1bW4gInsxfSIsIFwKKwlidXQgdGhpcyBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gdGFibGUgInsyfSIuCitkYXRhc3RvcmVpZC1pbmNvbXBhdC1jb2w6IFR5cGUgInswfSIgZGVjbGFyZXMgYSBkYXRhc3RvcmUgaWRlbnRpdHkgY29sdW1uIFwKKwkiezF9IiB3aG9zZSBqZGJjLXR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZXhwZWN0ZWQgdHlwZSAiezJ9Ii4KK2RhdGFzdG9yZWlkLWJhZC1jb2w6IFR5cGUgInswfSIgZGVjbGFyZXMgYSBkYXRhc3RvcmUgaWRlbnRpdHkgY29sdW1uIHRoYXQgaXMgXAorCW5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGV4cGVjdGVkIHR5cGUgInsxfSIuICBDb2x1bW4gZGV0YWlsczpcbnsyfQorbm9uZGZnLWZpZWxkLW9yZGVyYWJsZTogQ2Fubm90IG9yZGVyICJ7MH0iIG9uICJ7MX0iLCBiZWNhdXNlIHRoYXQgZmllbGQgaXMgbm90IFwKKwlpbiB0aGUgZGVmYXVsdCBmZXRjaCBncm91cC4gIFlvdSBjYW4gb25seSBvcmRlciBvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIFwKKwlzZWxlY3RlZCB3aGVuIHRoZSByZWxhdGVkIG9iamVjdCBpcyBsb2FkZWQuCitvcmRlci1jb25mbGljdDogRmllbGQgInswfSIgZGVjbGFyZXMgYm90aCBhIHN5bnRoZXRpYyBvcmRlcmluZyBjb2x1bW4gYW5kIFwKKwlvcmRlci1ieSB2YWx1ZXMuICBZb3UgY2Fubm90IHVzZSBib3RoLgorb3JkZXItbm8tY29sLW5hbWU6IE5vIG9yZGVyIGNvbHVtbiBuYW1lIHdhcyBnaXZlbiBmb3IgInswfSIuCitvcmRlci1iYWQtY29sLW5hbWU6ICJ7MH0iIGRlY2xhcmVzIG9yZGVyIGNvbHVtbiAiezF9IiwgYnV0IHRoaXMgY29sdW1uIGRvZXMgXAorCW5vdCBleGlzdCBpbiB0YWJsZSAiezJ9Ii4KK29yZGVyLWluY29tcGF0LWNvbDogInswfSIgZGVjbGFyZXMgYW4gb3JkZXIgY29sdW1uICJ7MX0iIHdob3NlIGpkYmMtdHlwZSBpcyBcCisJbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgZXhwZWN0ZWQgdHlwZSAiezJ9Ii4KK29yZGVyLWJhZC1jb2w6ICJ7MH0iIGRlY2xhcmVzIGFuIG9yZGVyIGNvbHVtbiBjb2x1bW4gdGhhdCBpcyBub3QgY29tcGF0aWJsZSBcCisJd2l0aCB0aGUgZXhwZWN0ZWQgdHlwZSAiezF9Ii4gIENvbHVtbiBkZXRhaWxzOlxuezJ9CitudWxsLWluZC1uby1jb2wtbmFtZTogTm8gbnVsbC1pbmRpY2F0b3IgY29sdW1uIG5hbWUgd2FzIGdpdmVuIGZvciAiezB9Ii4KK251bGwtaW5kLWJhZC1jb2wtbmFtZTogInswfSIgZGVjbGFyZXMgbnVsbC1pbmRpY2F0b3IgY29sdW1uICJ7MX0iLCBidXQgdGhpcyBcCisJY29sdW1uIGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICJ7Mn0iLgorbnVsbC1pbmQtaW5jb21wYXQtY29sOiAiezB9IiBkZWNsYXJlcyBhIG51bGwtaW5kaWNhdG9yIGNvbHVtbiAiezF9IiB3aG9zZSBcCisJamRiYy10eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGV4cGVjdGVkIHR5cGUgInsyfSIuCitudWxsLWluZC1iYWQtY29sOiAiezB9IiBkZWNsYXJlcyBhIG51bGwtaW5kaWNhdG9yIGNvbHVtbiBjb2x1bW4gdGhhdCBpcyBub3QgXAorCWNvbXBhdGlibGUgd2l0aCB0aGUgZXhwZWN0ZWQgdHlwZSAiezF9Ii4gIENvbHVtbiBkZXRhaWxzOlxuezJ9CitnZW5lcmljLW5vLWluZGV4LWNvbHM6ICJ7MH0iIGRlY2xhcmVzIGFuIGluZGV4LCBidXQgaGFzIG5vIGNvbHVtbnMuCitnZW5lcmljLWluZGV4LWV4aXN0czogInswfSIgbWFya3MgaXRzIGNvbHVtbnMgYXMgZXhwbGljaXRseSBub3QgaW5kZXhlZCwgYnV0IFwKKwlhbiBpbmRleCBleGlzdHMuCitnZW5lcmljLWluZGV4LW5vdC11bmlxdWU6ICJ7MH0iIG1hcmtzIGl0cyBjb2x1bW5zIGFzIGhhdmluZyBhIHVuaXF1ZSBpbmRleCwgXAorCWJ1dCB0aGUgZXhpc3RpbmcgaW5kZXggb24gdGhvc2UgY29sdW1ucyBpcyBub3QgdW5pcXVlLgorZ2VuZXJpYy1uby11bmlxdWUtY29sczogInswfSIgZGVjbGFyZXMgYSB1bmlxdWUgY29uc3RyYWludCwgYnV0IGhhcyBubyBjb2x1bW5zLgorZ2VuZXJpYy11bmlxdWUtZXhpc3RzOiAiezB9IiBtYXJrcyBpdHMgY29sdW1ucyBhcyBleHBsaWNpdGx5IG5vdCB1bmlxdWUsIGJ1dCBcCisJYSB1bmlxdWUgY29uc3RyYWludCBleGlzdHMuCitnZW5lcmljLXVuaXF1ZS1zdXBwb3J0OiAiezB9IiBtYXJrcyBpdHMgY29sdW1ucyBhcyBoYXZpbmcgYSB1bmlxdWUgY29uc3RyYWludCwgXAorCWJ1dCB5b3VyIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdW5pcXVlIGNvbnN0cmFpbnRzLiAgSW5jbHVkZSBcCisJIlN1cHBvcnRzVW5pcXVlQ29uc3RyYWludHM9dHJ1ZSIgaW4gdGhlIG9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkgXAorCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdG8gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0LgorZ2VuZXJpYy1kZWZlci11bmlxdWU6ICJ7MH0iIG1hcmtzIGl0cyBjb2x1bW5zIGFzIGhhdmluZyBhIGRlZmVycmVkIHVuaXF1ZSBcCisJY29uc3RyYWludCwgYnV0IHRoZSBleGlzdGluZyBjb25zdHJhaW50IG9uIHRoZXNlIGNvbHVtbnMgaXMgbm90IGRlZmVycmVkLiBcCisJT3BlbkpQQSBjYW5ub3QgY2hhbmdlIHRoZSBkZWZlcnJhYmlsaXR5IG9mIGEgY29uc3RyYWludC4KK2dlbmVyaWMtY3JlYXRlLWRlZmVyLXVuaXF1ZTogInswfSIgbWFya3MgaXRzIGNvbHVtbnMgYXMgaGF2aW5nIGEgZGVmZXJyZWQgXAorCXVuaXF1ZSBjb25zdHJhaW50LCBidXQgdGhlIGRhdGFiYXNlIGRpY3Rpb25hcnkgInsxfSIgcmVwb3J0cyB0aGF0IGl0IGRvZXMgXAorCW5vdCBzdXBwb3J0IGRlZmVycmVkIGNvbnN0cmFpbnRzLiAgQ3JlYXRpbmcgYW4gdW5kZWZlcnJlZCBjb25zdHJhaW50LgorZ2VuZXJpYy1uby1may1jb2xzOiAiezB9IiBkZWNsYXJlcyBhIGZvcmVpZ24ga2V5LCBidXQgaGFzIG5vIGNvbHVtbnMuCitnZW5lcmljLW5vLWZrY29sLW5hbWU6ICJ7MH0iIGRvZXMgbm90IHN1cHBseSBhIG5hbWUgZm9yIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCBcCisJY29sdW1uLgorZ2VuZXJpYy1iYWQtZmtjb25zdDogInswfSIgZGVjbGFyZXMgaW52YWxpZCBjb25zdGFudCB2YWx1ZSB0YXJnZXQgInsxfSIgZm9yIFwKKwljb2x1bW4gd2l0aCBuYW1lICJ7Mn0iLgorZ2VuZXJpYy1iYWQtZmt0YXJnZXQtaW52ZXJzZTogInswfSIgZGVjbGFyZXMgYSB0YXJnZXQgZm9yIGNvbHVtbiAiezF9IiBpbiBcCisJdGFibGUgInszfSIsIGJ1dCBhbGwgdGFyZ2V0cyBtdXN0IGJlIGluIHRhYmxlICJ7Mn0iLgorZ2VuZXJpYy1iYWQtZmstaW52ZXJzZTogInswfSIgZGVjbGFyZXMgYSBjb2x1bW4gaW4gdGFibGUgInsxfSIsIGJ1dCBhbGwgXAorCWNvbHVtbnMgbXVzdCBiZSBpbiB0YWJsZSAiezJ9Ii4KK2dlbmVyaWMtYmFkLWZrLXNlbGYtaW52ZXJzZTogInswfSIgZGVjbGFyZXMgYW4gaW52ZXJzZSBzZWxmLWpvaW4gb24gdGFibGUgXAorCSJ7MX0iLCBidXQgdGhpcyBtYXBwaW5nIGRvZXMgbm90IGFsbG93IGludmVyc2Ugam9pbnMuICBJZiB5b3UgZGlkIG5vdCBcCisJaW50ZW5kIHRvIG1ha2UgdGhpcyBhbiBpbnZlcnNlIGpvaW4sIHRha2UgdGhlIHRhYmxlIG5hbWUgb3V0IG9mIHRoZSBcCisJY29sdW1uIG5hbWVzIGZvciB0aGlzIG1hcHBpbmcuCitnZW5lcmljLW5vLWZrY29sLW5hbWUtYWRhcHQ6ICJ7MH0iIGRvZXMgbm90IHN1cHBseSBhIG5hbWUgZm9yIGF0IGxlYXN0IG9uZSBcCisJZGVjbGFyZWQgY29sdW1uLiAgU2luY2UgdGhpcyBtYXBwaW5nIGNhbiBpbnZvbHZlIG11bHRpcGxlIGNvbHVtbnMgb3IgdXNlcyBcCisJY29uc3RhbnQgam9pbnMsIGVhY2ggY29sdW1uIG11c3QgZ2l2ZSBlaXRoZXIgaXRzIG5hbWUgb3IgYSBub24tY29uc3RhbnQgXAorCXRhcmdldC4KK2dlbmVyaWMtbm8tZmtjb2wtdGFyZ2V0LWFkYXB0OiAiezB9IiBkb2VzIG5vdCBzdXBwbHkgYSB0YXJnZXQgZm9yIGNvbHVtbiBcCisJInsxfSIuICBTaW5jZSB0aGlzIG1hcHBpbmcgY2FuIGludm9sdmUgbXVsdGlwbGUgY29sdW1ucyBhbmQgdGhlIGEgdGFyZ2V0IFwKKwljb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGRvZXNuJyd0IGV4aXN0LCB5b3UgbXVzdCBnaXZlIGEgdGFyZ2V0IGV4cGxpY2l0bHkuCitnZW5lcmljLWJhZC1ma3RhcmdldDogInswfSIgZGVmaW5lcyBhIHRhcmdldCBvZiAiezF9IiBmb3IgY29sdW1uICJ7Mn0iLCBidXQgXAorCXRoYXQgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICJ7M30iLgorZ2VuZXJpYy1iYWQtZmt0YXJnZXRjbHM6ICJ7MH0iIGRlZmluZXMgdGFyZ2V0IGZpZWxkICJ7MX0iIGZvciBjb2x1bW4gXAorCSJ7Mn0iLCBidXQgT3BlbkpQQSBjYW5ub3QgZGV0ZXJpbWluZSB0aGUgb3duaW5nIGNsYXNzIGZvciB0aGF0IGZpZWxkLgorZ2VuZXJpYy1iYWQtZmt0YXJnZXRmaWVsZDogInswfSIgZGVmaW5lcyB0YXJnZXQgZmllbGQgInsxfSIgZm9yIGNvbHVtbiBcCisJInsyfSIsIGJ1dCB0aGF0IGZpZWxkIGRvZXMgbm90IGV4aXN0IGluIHR5cGUgInszfSIuCitnZW5lcmljLWZrdGFyZ2V0ZmllbGQtY29sczogInswfSIgZGVmaW5lcyB0YXJnZXQgZmllbGQgInsxfSIgZm9yIGNvbHVtbiBcCisJInsyfSIsIGJ1dCB0aGF0IGZpZWxkIGlzIGVpdGhlciB1bm1hcHBlZCBvciBoYXMgbXVsdGlwbGUgY29sdW1ucy4KK2dlbmVyaWMtbXVsdC1may10YWJsZXM6ICJ7MH0iIHVzZXMgY29sdW1ucyBmcm9tIG11bHRpcGxlIGRpZmZlcmVudCB0YWJsZXM6IFwKKwkiezF9IiwgInsyfSIKK2dlbmVyaWMtZmstZXhpc3RzOiAiezB9IiBtYXJrcyBpdHMgY29sdW1ucyBhcyBleHBsaWNpdGx5IG5vdCBoYXZpbmcgYSBmb3JlaWduIFwKKwlrZXkgZGVsZXRlIGFjdGlvbiwgYnV0IGEgZGF0YWJhc2UgZm9yZWlnbiBrZXkgZXhpc3RzIG9uIHRoZXNlIGNvbHVtbnMuCitnZW5lcmljLWRlZmVyLWZrOiAiezB9IiBtYXJrcyBpdHMgY29sdW1ucyBhcyBoYXZpbmcgYSBkZWZlcnJlZCBmb3JlaWduIGtleSwgXAorCWJ1dCB0aGUgZXhpc3RpbmcgY29uc3RyYWludCBvbiB0aGVzZSBjb2x1bW5zIGlzIG5vdCBkZWZlcnJlZC4gT3BlbkpQQSBjYW5ub3QgXAorCWNoYW5nZSB0aGUgZGVmZXJyYWJpbGl0eSBvZiBhIGNvbnN0cmFpbnQuCitnZW5lcmljLWNyZWF0ZS1kZWZlci1mazogInswfSIgbWFya3MgaXRzIGNvbHVtbnMgYXMgaGF2aW5nIGEgZGVmZXJyZWQgZm9yZWlnbiBcCisJa2V5LCBidXQgdGhlIGRhdGFiYXNlIGRpY3Rpb25hcnkgInsxfSIgcmVwb3J0cyB0aGF0IGl0IGRvZXMgbm90IHN1cHBvcnQgXAorCWRlZmVycmVkIGNvbnN0cmFpbnRzLiAgQ3JlYXRpbmcgYW4gdW5kZWZlcnJlZCBjb25zdHJhaW50LgorZ2VuZXJpYy11bnN1cHBvcnRlZC1may1hY3Rpb246ICJ7MH0iIHVzZXMgYW4gdW5zdXBwb3J0ZWQgZm9yZWlnbiBrZXkgZGVsZXRlIG9yIFwKKwl1cGRhdGUgYWN0aW9uIG9uIGl0cyBjb2x1bW5zLiAgUmV2ZXJ0aW5nIHRvIGEgbG9naWNhbCBmb3JlaWduIGtleS4KK2dlbmVyaWMtY29uc3Qtam9pbjogInswfSIgYXR0bXB0cyB0byBqb2luIGEgY29uc3RhbnQgdmFsdWUgdG8gYW5vdGhlciBjb25zdGFudCBcCisJdmFsdWUuCitzdXBlcmNsYXNzLW5vLWZrLWNvbHM6IFR5cGUgInswfSIgaXMgbWlzc2luZyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gam9pbiB0byBcCisJaXRzIHN1cGVyY2xhc3MuCitzdXBlcmNsYXNzLW5vLWZrY29sLW5hbWU6IFR5cGUgInswfSIgZG9lcyBub3Qgc3VwcGx5IGEgbmFtZSBmb3IgYXQgbGVhc3Qgb25lIFwKKwlkZWNsYXJlZCBzdXBlcmNsYXNzIGpvaW4gY29sdW1uLgorc3VwZXJjbGFzcy1iYWQtZmtjb25zdDogVHlwZSAiezB9IiBkZWNsYXJlcyBpbnZhbGlkIGNvbnN0YW50IHZhbHVlIHRhcmdldCBcCisJInsxfSIgZm9yIHRoZSBjb2x1bW4gd2l0aCBuYW1lICJ7Mn0iIGluIGl0cyBzdXBlcmNsYXNzIGpvaW4uCitzdXBlcmNsYXNzLWJhZC1ma3RhcmdldC1pbnZlcnNlOiBUeXBlICJ7MH0iIGRlY2xhcmVzIHN1cGVyY2xhc3Mgam9pbiBjb2x1bW4gXAorCSJ7MX0iIHdpdGggYSB0YXJnZXQgaW4gdGFibGUgInszfSIsIGJ1dCBhbGwgdGFyZ2V0cyBtdXN0IGJlIGluIHRhYmxlICJ7Mn0iLgorc3VwZXJjbGFzcy1iYWQtZmstaW52ZXJzZTogVHlwZSAiezB9IiBkZWNsYXJlcyBhIHN1cGVyY2xhc3Mgam9pbiBpbiB0YWJsZSBcCisJInsxfSIsIGJ1dCBhbGwgY29sdW1ucyBtdXN0IGJlIGluIHRhYmxlICJ7Mn0iLgorc3VwZXJjbGFzcy1uby1ma2NvbC1uYW1lLWFkYXB0OiBUeXBlICJ7MH0iIGRvZXMgbm90IHN1cHBseSBhIG5hbWUgZm9yIGF0IFwKKwlsZWFzdCBvbmUgZGVjbGFyZWQgY29sdW1uIGluIGl0cyBzdXBlcmNsYXNzIGpvaW4uICBTaW5jZSB0aGlzIGpvaW4gY2FuIFwKKwlpbnZvbHZlIG11bHRpcGxlIGNvbHVtbnMsIGVhY2ggY29sdW1uIG11c3QgZ2l2ZSBlaXRoZXIgaXRzIG5hbWUgb3IgaXRzIFwKKwl0YXJnZXQuCitzdXBlcmNsYXNzLW5vLWZrY29sLXRhcmdldC1hZGFwdDogVHlwZSAiezB9IiBkb2VzIG5vdCBzdXBwbHkgYSB0YXJnZXQgZm9yIFwKKwljb2x1bW4gInsxfSIgaW4gaXRzIHN1cGVyY2xhc3Mgam9pbi4gIFNpbmNlIHRoaXMgbWFwcGluZyBjYW4gaW52b2x2ZSBcCisJbXVsdGlwbGUgY29sdW1ucyBhbmQgdGhlIGEgdGFyZ2V0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24nJ3QgXAorCWV4aXN0LCB5b3UgbXVzdCBnaXZlIGEgdGFyZ2V0IGV4cGxpY2l0bHkuCitzdXBlcmNsYXNzLWJhZC1ma3RhcmdldDogVHlwZSAiezB9IiBkZWZpbmVzIGEgdGFyZ2V0IG9mICJ7MX0iIGZvciBzdXBlcmNsYXNzIFwKKwlqb2luIGNvbHVtbiAiezJ9IiwgYnV0IHRoYXQgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICJ7M30iLgorc3VwZXJjbGFzcy1iYWQtZmt0YXJnZXRjbHM6ICJ7MH0iIGRlZmluZXMgdGFyZ2V0IGZpZWxkICJ7MX0iIGZvciBzdXBlcmNsYXNzIFwKKwlqb2luIGNvbHVtbiAiezJ9IiwgYnV0IE9wZW5KUEEgY2Fubm90IGRldGVyaW1pbmUgdGhlIG93bmluZyBjbGFzcyBmb3IgdGhhdCBcCisJZmllbGQuCitzdXBlcmNsYXNzLWJhZC1ma3RhcmdldGZpZWxkOiBUeXBlICJ7MH0iIGRlZmluZXMgdGFyZ2V0IGZpZWxkIG9mICJ7MX0iIGZvciBcCisJc3VwZXJjbGFzcyBqb2luIGNvbHVtbiAiezJ9IiwgYnV0IHRoYXQgZmllbGQgZG9lcyBub3QgZXhpc3QgaW4gdHlwZSAiezN9Ii4KK3N1cGVyY2xhc3MtZmt0YXJnZXRmaWVsZC1jb2xzOiBUeXBlICJ7MH0iIGRlZmluZXMgdGFyZ2V0IGZpZWxkICJ7MX0iIGZvciBcCisJc3VwZXJjbGFzcyBqb2luIGNvbHVtbiAiezJ9IiwgYnV0IHRoYXQgZmllbGQgaXMgZWl0aGVyIHVubWFwcGVkIG9yIGhhcyBcCisJbXVsdGlwbGUgY29sdW1ucy4KK3N1cGVyY2xhc3MtbXVsdC1may10YWJsZXM6IFRoZSBzdXBlcmNsYXNzIGpvaW4gb24gdHlwZSAiezB9IiB1c2VzIGNvbHVtbnMgZnJvbSBcCisJbXVsdGlwbGUgZGlmZmVyZW50IHRhYmxlczogInsxfSIsICJ7Mn0iCitzdXBlcmNsYXNzLWZrLWV4aXN0czogVHlwZSAiezB9IiBtYXJrcyBpdHMgc3VwZXJjbGFzcyBqb2luIGNvbHVtbnMgYXMgXAorCWV4cGxpY2l0bHkgbm90IGhhdmluZyBhIGZvcmVpZ24ga2V5IGRlbGV0ZSBhY3Rpb24sIGJ1dCBhIGRhdGFiYXNlIGZvcmVpZ24gXAorCWtleSBleGlzdHMgb24gdGhlc2UgY29sdW1ucy4KK3N1cGVyY2xhc3MtZGVmZXItZms6IFR5cGUgInswfSIgbWFya3MgaXRzIHN1cGVyY2xhc3Mgam9pbiBjb2x1bW5zIGFzIGhhdmluZyBhIFwKKwlkZWZlcnJlZCBmb3JlaWduIGtleSwgYnV0IHRoZSBleGlzdGluZyBjb25zdHJhaW50IG9uIHRoZXNlIGNvbHVtbnMgaXMgbm90IFwKKwlkZWZlcnJlZC4gT3BlbkpQQSBjYW5ub3QgY2hhbmdlIHRoZSBkZWZlcnJhYmlsaXR5IG9mIGEgY29uc3RyYWludC4KK3N1cGVyY2xhc3MtY3JlYXRlLWRlZmVyLWZrOiBUeXBlICJ7MH0iIG1hcmtzIGl0cyBzdXBlcmNsYXNzIGpvaW4gY29sdW1ucyBhcyBcCisJaGF2aW5nIGEgZGVmZXJyZWQgZm9yZWlnbiBrZXksIGJ1dCB0aGUgZGF0YWJhc2UgZGljdGlvbmFyeSAiezF9IiByZXBvcnRzIFwKKwl0aGF0IGl0IGRvZXMgbm90IHN1cHBvcnQgZGVmZXJyZWQgY29uc3RyYWludHMuICBDcmVhdGluZyBhbiB1bmRlZmVycmVkIFwKKwljb25zdHJhaW50Lgorc3VwZXJjbGFzcy11bnN1cHBvcnRlZC1may1hY3Rpb246IFR5cGUgInswfSIgdXNlcyBhbiB1bnN1cHBvcnRlZCBmb3JlaWduIGtleSBcCisJZGVsZXRlIG9yIHVwZGF0ZSBhY3Rpb24gb24gaXRzIHN1cGVyY2xhc3Mgam9pbiBjb2x1bW5zLiAgUmV2ZXJ0aW5nIHRvIGEgXAorCWxvZ2ljYWwgZm9yZWlnbiBrZXkuCitzdXBlcmNsYXNzLWNvbnN0LWpvaW46ICJ7MH0iIGF0dG1wdHMgdG8gam9pbiBhIGNvbnN0YW50IHZhbHVlIHRvIGFub3RoZXIgXAorCWNvbnN0YW50IHZhbHVlLgoram9pbi1uby1pbmRleC1jb2xzOiAiezB9IiBkZWNsYXJlcyBhIGpvaW4gaW5kZXgsIGJ1dCBoYXMgbm8gam9pbiBjb2x1bW5zLgoram9pbi1pbmRleC1leGlzdHM6ICJ7MH0iIG1hcmtzIGl0cyBqb2luIGNvbHVtbnMgYXMgZXhwbGljaXRseSBub3QgaW5kZXhlZCwgYnV0IFwKKwlhbiBpbmRleCBleGlzdHMuCitqb2luLWluZGV4LW5vdC11bmlxdWU6ICJ7MH0iIG1hcmtzIGl0cyBqb2luIGNvbHVtbnMgYXMgaGF2aW5nIGEgdW5pcXVlIGluZGV4LCBcCisJYnV0IHRoZSBleGlzdGluZyBpbmRleCBvbiB0aG9zZSBjb2x1bW5zIGlzIG5vdCB1bmlxdWUuCitqb2luLW5vLXVuaXF1ZS1jb2xzOiAiezB9IiBkZWNsYXJlcyBhIHVuaXF1ZSBqb2luIGNvbnN0cmFpbnQsIGJ1dCBoYXMgbm8gXAorCWpvaW4gY29sdW1ucy4KK2pvaW4tdW5pcXVlLWV4aXN0czogInswfSIgbWFya3MgaXRzIGpvaW4gY29sdW1ucyBhcyBleHBsaWNpdGx5IG5vdCB1bmlxdWUsIGJ1dCBcCisJYSB1bmlxdWUgY29uc3RyYWludCBleGlzdHMuCitqb2luLXVuaXF1ZS1zdXBwb3J0OiAiezB9IiBtYXJrcyBpdHMgam9pbiBjb2x1bW5zIGFzIGhhdmluZyBhIHVuaXF1ZSBcCisJY29uc3RyYWludCwgYnV0IHlvdXIgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCB1bmlxdWUgY29uc3RyYWludHMuICBcCisJSW5jbHVkZSAiU3VwcG9ydHNVbmlxdWVDb25zdHJhaW50cz10cnVlIiBpbiB0aGUgb3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeSBcCisJY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQuCitqb2luLWRlZmVyLXVuaXF1ZTogInswfSIgbWFya3MgaXRzIGpvaW4gY29sdW1ucyBhcyBoYXZpbmcgYSBkZWZlcnJlZCB1bmlxdWUgXAorCWNvbnN0cmFpbnQsIGJ1dCB0aGUgZXhpc3RpbmcgY29uc3RyYWludCBvbiB0aGVzZSBjb2x1bW5zIGlzIG5vdCBkZWZlcnJlZC4gXAorCU9wZW5KUEEgY2Fubm90IGNoYW5nZSB0aGUgZGVmZXJyYWJpbGl0eSBvZiBhIGNvbnN0cmFpbnQuCitqb2luLWNyZWF0ZS1kZWZlci11bmlxdWU6ICJ7MH0iIG1hcmtzIGl0cyBqb2luIGNvbHVtbnMgYXMgaGF2aW5nIGEgZGVmZXJyZWQgXAorCXVuaXF1ZSBjb25zdHJhaW50LCBidXQgdGhlIGRhdGFiYXNlIGRpY3Rpb25hcnkgInsxfSIgcmVwb3J0cyB0aGF0IGl0IGRvZXMgXAorCW5vdCBzdXBwb3J0IGRlZmVycmVkIGNvbnN0cmFpbnRzLiAgQ3JlYXRpbmcgYW4gdW5kZWZlcnJlZCBjb25zdHJhaW50Lgoram9pbi1uby1may1jb2xzOiAiezB9IiBkZWNsYXJlcyBhIGpvaW4gZm9yZWlnbiBrZXksIGJ1dCBoYXMgbm8gam9pbiBjb2x1bW5zLgoram9pbi1uby1ma2NvbC1uYW1lOiAiezB9IiBkb2VzIG5vdCBzdXBwbHkgYSBuYW1lIGZvciBhdCBsZWFzdCBvbmUgZGVjbGFyZWQgXAorCWpvaW4gY29sdW1uLgoram9pbi1iYWQtZmtjb25zdDogInswfSIgZGVjbGFyZXMgaW52YWxpZCBjb25zdGFudCB2YWx1ZSB0YXJnZXQgInsxfSIgZm9yIFwKKwlqb2luIGNvbHVtbiB3aXRoIG5hbWUgInsyfSIuCitqb2luLWJhZC1jb2wtbmFtZTogInswfSIgZGVjbGFyZXMgY29sdW1uICJ7MX0iLCBidXQgdGhpcyBjb2x1bW4gZG9lcyBub3QgXAorCWV4aXN0IGluIHRhYmxlICJ7Mn0iLgoram9pbi1iYWQtZmt0YXJnZXQtaW52ZXJzZTogInswfSIgZGVjbGFyZXMgYSB0YXJnZXQgZm9yIGpvaW4gY29sdW1uICJ7MX0iIGluIFwKKwl0YWJsZSAiezN9IiwgYnV0IGFsbCBqb2luIHRhcmdldHMgbXVzdCBiZSBpbiB0YWJsZSAiezJ9Ii4KK2pvaW4tYmFkLWZrLWludmVyc2U6ICJ7MH0iIGRlY2xhcmVzIGEgam9pbiBjb2x1bW4gaW4gdGFibGUgInsxfSIsIGJ1dCBhbGwgXAorCWpvaW4gY29sdW1ucyBtdXN0IGJlIGluIHRhYmxlICJ7Mn0iLgoram9pbi1iYWQtZmstc2VsZi1pbnZlcnNlOiAiezB9IiBkZWNsYXJlcyBhbiBpbnZlcnNlIHNlbGYtam9pbiBvbiB0YWJsZSBcCisJInsxfSIsIGJ1dCB0aGlzIG1hcHBpbmcgZG9lcyBub3QgYWxsb3cgaW52ZXJzZSBqb2lucy4gIElmIHlvdSBkaWQgbm90IFwKKwlpbnRlbmQgdG8gbWFrZSB0aGlzIGFuIGludmVyc2Ugam9pbiwgdGFrZSB0aGUgdGFibGUgbmFtZSBvdXQgb2YgdGhlIFwKKwljb2x1bW4gbmFtZXMgZm9yIHRoaXMgbWFwcGluZy4KK2pvaW4tbm8tZmtjb2wtbmFtZS1hZGFwdDogInswfSIgZG9lcyBub3Qgc3VwcGx5IGEgbmFtZSBmb3IgYXQgbGVhc3Qgb25lIFwKKwlkZWNsYXJlZCBqb2luIGNvbHVtbi4gIFNpbmNlIHRoaXMgam9pbiBjYW4gaW52b2x2ZSBtdWx0aXBsZSBjb2x1bW5zIG9yIFwKKwl1c2VzIGNvbnN0YW50IGpvaW5zLCBlYWNoIGNvbHVtbiBtdXN0IGdpdmUgZWl0aGVyIGl0cyBuYW1lIG9yIGEgXAorCW5vbi1jb25zdGFudCB0YXJnZXQuCitqb2luLW5vLWZrY29sLXRhcmdldC1hZGFwdDogInswfSIgZG9lcyBub3Qgc3VwcGx5IGEgdGFyZ2V0IGZvciBqb2luIGNvbHVtbiBcCisJInsxfSIuICBTaW5jZSB0aGlzIGpvaW4gY2FuIGludm9sdmUgbXVsdGlwbGUgY29sdW1ucyBhbmQgdGhlIGEgdGFyZ2V0IFwKKwljb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGRvZXNuJyd0IGV4aXN0LCB5b3UgbXVzdCBnaXZlIGEgdGFyZ2V0IGV4cGxpY2l0bHkuCitqb2luLWJhZC1ma3RhcmdldDogInswfSIgZGVmaW5lcyBhIHRhcmdldCBvZiAiezF9IiBmb3Igam9pbiBjb2x1bW4gInsyfSIsIGJ1dCBcCisJdGhhdCB0YXJnZXQgZG9lcyBub3QgZXhpc3QgaW4gdGFibGUgInszfSIuCitqb2luLWJhZC1ma3RhcmdldGNsczogInswfSIgZGVmaW5lcyB0YXJnZXQgZmllbGQgInsxfSIgZm9yIGpvaW4gY29sdW1uICJ7Mn0iLCBcCisJYnV0IE9wZW5KUEEgY2Fubm90IGRldGVyaW1pbmUgdGhlIG93bmluZyBjbGFzcyBmb3IgdGhhdCBmaWVsZC4KK2pvaW4tYmFkLWZrdGFyZ2V0ZmllbGQ6ICJ7MH0iIGRlZmluZXMgdGFyZ2V0IGZpZWxkIG9mICJ7MX0iIGZvciBqb2luIGNvbHVtbiBcCisJInsyfSIsIGJ1dCB0aGF0IGZpZWxkIGRvZXMgbm90IGV4aXN0IGluIHR5cGUgInszfSIuCitqb2luLWZrdGFyZ2V0ZmllbGQtY29sczogInswfSIgZGVmaW5lcyB0YXJnZXQgZmllbGQgInsxfSIgZm9yIGpvaW4gY29sdW1uIFwKKwkiezJ9IiwgYnV0IHRoYXQgZmllbGQgaXMgZWl0aGVyIHVubWFwcGVkIG9yIGhhcyBtdWx0aXBsZSBjb2x1bW5zLgoram9pbi1tdWx0LWZrLXRhYmxlczogInswfSIgdXNlcyBqb2luIGNvbHVtbnMgZnJvbSBtdWx0aXBsZSBkaWZmZXJlbnQgdGFibGVzOiBcCisJInsxfSIsICJ7Mn0iCitqb2luLWZrLWV4aXN0czogInswfSIgbWFya3MgaXRzIGpvaW4gY29sdW1ucyBhcyBleHBsaWNpdGx5IG5vdCBoYXZpbmcgYSBcCisJZm9yZWlnbiBrZXkgZGVsZXRlIGFjdGlvbiwgYnV0IGEgZGF0YWJhc2UgZm9yZWlnbiBrZXkgZXhpc3RzIG9uIHRoZXNlIFwKKwljb2x1bW5zLgoram9pbi1kZWZlci1mazogInswfSIgbWFya3MgaXRzIGpvaW4gY29sdW1ucyBhcyBoYXZpbmcgYSBkZWZlcnJlZCBmb3JlaWduIGtleSwgXAorCWJ1dCB0aGUgZXhpc3RpbmcgY29uc3RyYWludCBvbiB0aGVzZSBjb2x1bW5zIGlzIG5vdCBkZWZlcnJlZC4gT3BlbkpQQSBjYW5ub3QgXAorCWNoYW5nZSB0aGUgZGVmZXJyYWJpbGl0eSBvZiBhIGNvbnN0cmFpbnQuCitqb2luLWNyZWF0ZS1kZWZlci1mazogInswfSIgbWFya3MgaXRzIGpvaW4gY29sdW1ucyBhcyBoYXZpbmcgYSBkZWZlcnJlZCBcCisJZm9yZWlnbiBrZXksIGJ1dCB0aGUgZGF0YWJhc2UgZGljdGlvbmFyeSAiezF9IiByZXBvcnRzIHRoYXQgaXQgZG9lcyBub3QgXAorCXN1cHBvcnQgZGVmZXJyZWQgY29uc3RyYWludHMuICBDcmVhdGluZyBhbiB1bmRlZmVycmVkIGNvbnN0cmFpbnQuCitqb2luLXVuc3VwcG9ydGVkLWZrLWFjdGlvbjogInswfSIgdXNlcyBhbiB1bnN1cHBvcnRlZCBmb3JlaWduIGtleSBkZWxldGUgb3IgXAorCXVwZGF0ZSBhY3Rpb24gb24gaXRzIGpvaW4gY29sdW1ucy4gIFJldmVydGluZyB0byBhIGxvZ2ljYWwgZm9yZWlnbiBrZXkuCitqb2luLWNvbnN0LWpvaW46ICJ7MH0iIGF0dG1wdHMgdG8gam9pbiBhIGNvbnN0YW50IHZhbHVlIHRvIGFub3RoZXIgY29uc3RhbnQgXAorCXZhbHVlLgordW5tYXBwZWQ6IEF0dGVtcHQgdG8gbWFwICJ7MH0iIGZhaWxlZDogdGhlIG93bmluZyBlbnRpdHkgaXMgbm90IG1hcHBlZC4KK2NvbC13cm9uZy10YWJsZTogV2hlbiBtYXBwaW5nICJ7MH0iIHRvIHRhYmxlICJ7MX0iLCBmb3VuZCBhIGNvbHVtbiBtYXBwZWQgdG8gXAorCWlsbGVnYWwgdGFibGUgInsyfSIuCit0YXJnZXQtd3JvbmctY2xzOiBXaGVuIG1hcHBpbmcgInswfSIsIGZvdW5kIGpvaW4gd2l0aCBhIHRhcmdldC1maWVsZCBpbiBjbGFzcyBcCisJInsxfSIuICBUaGlzIGNsYXNzIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBzb3VyY2Ugb3IgdGFyZ2V0IG1hcHBpbmdzIFwKKwlmb3IgdGhlIGpvaW4gKCJ7Mn0iLCAiezN9IikuCituby1lcXVpdi1tYXBwZWQtYnk6ICJ7MH0iIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBtYXBwaW5nLiAgSXQgZGVjbGFyZXMgdGhhdCBpdCBcCisJaXMgbWFwcGVkIGJ5ICJ7Mn0iLCBidXQgInsxfSIsIGEgc3ViY2xhc3Mgb2YgaXRzIGRlY2xhcmVkIHR5cGUsIGRvZXMgbm90IFwKKwlpbmhlcml0IHRoYXQgcmVsYXRpb24gZmllbGQuCitjYW50LWludmVyc2U6ICJ7MH0iIGlzIG5vdCBhIHZhbGlkIG1hcHBpbmcuICBJbnZlcnNlIGZvcmVpZ24ga2V5LWJhc2VkIFwKKwlyZWxhdGlvbnMgdG8gdHlwZXMgd2l0aCB1bmpvaW5lZCBzdWJjbGFzc2VzIGFyZSBub3Qgc3VwcG9ydGVkLgoraW1wb3J0ZXhwb3J0LWluc3RhbnRpYXRlOiBDb3VsZCBub3QgaW5zdGFudGlhdGUgbGlicmFyeSB0byBpbXBvcnQgXAorCW9yIGV4cG9ydCBtYXBwaW5nIGluZm9ybWF0aW9uLgordG9vbC11c2FnZTogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbFxuXAorCVx0Wy1wcm9wZXJ0aWVzLy1wIDxwcm9wZXJ0aWVzIGZpbGUgb3IgcmVzb3VyY2U+XVxuXAorCVx0Wy08cHJvcGVydHkgbmFtZT4gPHByb3BlcnR5IHZhbHVlPl0qXG5cCisJXHRbLWZpbGUvLWYgPHN0ZG91dCB8IG91dHB1dCBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstc2NoZW1hRmlsZS8tc2YgPHN0ZG91dCB8IG91dHB1dCBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstc3FsRmlsZS8tc3FsIDxzdGRvdXQgfCBvdXRwdXQgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLXNjaGVtYUFjdGlvbi8tc2EgPGFkZCB8IHJldGFpbiB8IGRyb3AgfCByZWZyZXNoIHwgYnVpbGQgfCBub25lPl1cblwKKwlcdFstc2NoZW1hcy8tcyA8c2NoZW1hcyBhbmQgdGFibGVzPl1cblwKKwlcdFstcmVhZFNjaGVtYS8tcnMgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1wcmltYXJ5S2V5cy8tcGsgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1mb3JlaWduS2V5cy8tZmsgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1pbmRleGVzLy1peCA8dHJ1ZS90IHwgZmFsc2UvZj5dXG5cCisJXHRbLWRyb3BUYWJsZXMvLWR0IDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstb3BlbmpwYVRhYmxlcy8tb3QgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1kcm9wU2VxdWVuY2VzLy1kc3EgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1zZXF1ZW5jZXMvLXNxIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstaWdub3JlRXJyb3JzLy1pIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstYWN0aW9uLy1hIDxyZWZyZXNoIHwgYWRkIHwgYnVpbGRTY2hlbWEgfCBkcm9wIHwgdmFsaWRhdGUgfCBpbXBvcnQgXG5cCisJfCBleHBvcnQ+XVxuXAorCVx0PGNsYXNzIG5hbWUgfCAuamF2YSBmaWxlIHwgLmNsYXNzIGZpbGUgfCAuamRvIGZpbGUgfCAub3JtIGZpbGUgfCBcCisJLm1hcHBpbmcgZmlsZT4qCit0b29sLXJ1bm5pbmc6IE1hcHBpbmcgdG9vbCBydW5uaW5nIG9uIHR5cGUgInswfSIgd2l0aCBhY3Rpb24gInsxfSIuCit0b29sLXRpbWU6IFRoZSB0b29sIGlzIG5vdyByZWFkaW5nIGV4aXN0aW5nIHNjaGVtYSBpbmZvcm1hdGlvbjsgdGhpcyBwcm9jZXNzIFwKKwltYXkgdGFrZSBzb21lIHRpbWUuICBFbmFibGUgdGhlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLlNjaGVtYSBsb2dnaW5nIGNhdGVnb3J5IHRvIHNlZSBcCisJbWVzc2FnZXMgYWJvdXQgc2NoZW1hIGRhdGEuICBBbHNvIHNlZSB0aGUgLXJlYWRTY2hlbWEgdG9vbCBmbGFnLgordG9vbC1yZWNvcmQ6IFJlY29yZGluZyBtYXBwaW5nIGFuZCBzY2hlbWEgY2hhbmdlcy4KK2JhZC1zdG9yZTogWW91ciBjb25maWd1cmVkIE1ldGFEYXRhRmFjdG9yeSBvciBNYXBwaW5nRmFjdG9yeSBwbHVnaW4gZG9lcyBub3QgXAorCXN1cHBvcnQgc3RvcmluZyBpbmZvcm1hdGlvbi4gIFlvdSBtdXN0IHdyaXRlIHRoZSBpbmZvcm1hdGlvbiBieSBoYW5kLiBJZiBcCisJeW91IGFyZSB0cnlpbmcgdG8gY3JlYXRlIGEgc2NoZW1hIHVzaW5nIGRlZmF1bHQgY29sdW1uIGFuZCB0YWJsZSBuYW1lcywgXAorCXJ1biBtYXBwaW5ndG9vbCB3aXRoIHRoZSAiYnVpbGRTY2hlbWEiIGFjdGlvbiBpbnN0ZWFkIG9mIHRoZSBcCisJInJlZnJlc2giIG9yICJhZGQiIGFjdGlvbnMuCitiYWQtZHJvcDogU29tZSBvZiB0aGUgZm9sbG93aW5nIG1hcHBpbmdzIG1heSBub3QgaGF2ZSBiZWVuIGRyb3BwZWQ6IHswfS4gXAorCVVuZHJvcHBlZCBtYXBwaW5ncyB3aWxsIG5vdCBhZmZlY3QgdGhlIHN5c3RlbS4KK25vLWRyb3AtbWV0YTogVGhlIHNjaGVtYSBmb3IgdHlwZSAiezB9IiBtYXkgbm90IGJlIGRyb3BwZWQsIGJlY2F1c2UgaXRzIFwKKwltYXBwaW5nIGNvdWxkIG5vdCBiZSBwYXJzZWQuCituby1tZXRhOiBUeXBlICJ7MH0iIGRvZXMgbm90IGhhdmUgcGVyc2lzdGVuY2UgbWV0YWRhdGEuCitiYWQtYmstZmlsZTogQ291bGQgbm90IGNyZWF0ZSBhIGJhY2t1cCBmaWxlIGZvciAiezB9Ii4KK3J1bm5pbmctYWxsLWNsYXNzZXM6IE5vIHRhcmdldHMgd2VyZSBnaXZlbi4gIFJ1bm5pbmcgb24gYWxsIGNsYXNzZXMgbGlzdGVkIGluIFwKKwl5b3VyIGNvbmZpZ3VyYXRpb24sIG9yIGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgaW4gdGhlIGNsYXNzcGF0aCBpZiBubyBcCisJY2xhc3NlcyBhcmUgY29uZmlndXJlZC4gIFVzZSAtaGVscCB0byBkaXNwbGF5IHRvb2wgdXNhZ2UgaW5mb3JtYXRpb24uCitmYXRhbC1jaGFuZ2U6IFRoZXJlIGhhcyBiZWVuIGEgZmF0YWwgY2hhbmdlIHRvIHRoZSBkZWZpbml0aW9uIG9mICJ7MH0iIG9yIGl0cyBcCisJc2NoZW1hIHNpbmNlIGl0IHdhcyBsYXN0IG1hcHBlZCwgb3IgdGhlIG1hcHBpbmcgeW91IGRlZmluZWQgaXMgaW52YWxpZDpcblwKKwl7MX1cbk9wZW5KUEEgd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBtYXBwaW5nLgorYmFkLWZpZWxkLXN0cmF0ZWd5OiBGaWVsZCAiezB9IiBkZWNsYXJlZCBjdXN0b20gbWFwcGluZyBzdHJhdGVneSAiezF9IiwgYnV0IFwKKwl0aGlzIHN0cmF0ZWd5IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCitiYWQtY2xzLXN0cmF0ZWd5OiBDb3VsZCBub3QgaW5zdGFudGlhdGUgY3VzdG9tIGNsYXNzIHN0cmF0ZWd5ICJ7MX0iIFwKKwlmb3IgdHlwZSAiezB9Ii4gIE1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgQ2xhc3NTdHJhdGVneSBpbXBsZW1lbnRhdGlvbi4KK2JhZC1kaXNjcmltLXN0cmF0ZWd5OiBDb3VsZCBub3QgaW5zdGFudGlhdGUgY3VzdG9tIGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kgXAorCSJ7MX0iIGZvciB0eXBlICJ7MH0iLiAgTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBEaXNjcmltaW5hdG9yU3RyYXRlZ3kgXAorCWltcGxlbWVudGF0aW9uLgorYmFkLXZlcnNpb24tc3RyYXRlZ3k6IENvdWxkIG5vdCBpbnN0YW50aWF0ZSBjdXN0b20gdmVyc2lvbiBzdHJhdGVneSBcCisJInsxfSIgZm9yIHR5cGUgInswfSIuICBNYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIFZlcnNpb25TdHJhdGVneSBcCisJaW1wbGVtZW50YXRpb24uCitiYWQtdmFsdWUtaGFuZGxlcjogInswfSIgZGVjbGFyZWQgY3VzdG9tIHZhbHVlIGhhbmRsZXIgInsxfSIsIGJ1dCB0aGlzIGhhbmRsZXIgXAorCWNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCitiYWQtbWFwcGVkLXN0cmF0ZWd5OiBUaGUgdHlwZSBmb3IgInswfSIgaXMgbWFwcGVkIHRvIGN1c3RvbSBzdHJhdGVneSAiezF9IiwgXAorCWJ1dCB0aGlzIHN0cmF0ZWd5IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCituby1maWVsZC1zdHJhdGVneTogT3BlbkpQQSBjYW5ub3QgbWFwIGZpZWxkICJ7MH0iIGVmZmljaWVudGx5LiAgSXQgaXMgb2YgYW4gXAorCXVuc3VwcG9ydGVkIHR5cGUuIFRoZSBmaWVsZCB2YWx1ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBCTE9CIGJ5IGRlZmF1bHQuCittYXgtZW1iZWQtbG9iOiAiezB9IiBpcyBiZWluZyBtYXBwZWQgd2l0aCBhIGhhbmRsZXIgdGhhdCBtYXkgbm90IGJlIGFibGUgdG8gXAorCXN0b3JlIHZhbHVlcyBvdmVyIHsxfSBieXRlcy9jaGFycyBsb25nLgoraW5jb21wbGV0ZS1qb2luOiBUaGUgc3lzdGVtIGhhcyBkZXRlY3RlZCBhbiBpbmNvbXBsZXRlIGpvaW4gb24gY29sdW1uICJ7MH0iLiAgXAorCVdoZW4geW91IHNwZWNpZnkgYSBqb2luIGJldHdlZW4gdGFibGVzLCB5b3UgbXVzdCBqb2luIHRvIGFsbCB0aGUgY29sdW1ucyBcCisJb2YgYW55IGZpZWxkcyBpbnZvbHZlZC4KK2JhZC1yZW1hcDogQ29sdW1uICJ7MH0iIGNhbm5vdCBiZSBpbnZvbHZlZCBpbiBwb2x5bW9ycGhpYyB0YWJsZS1wZXItY2xhc3MgXAorCXJlbGF0aW9uc2hpcHMgYmVjYXVzZSBpdHMgY29ycmVzcG9uZGluZyBmaWVsZCBpcyBtYXBwZWQgZGlmZmVyZW50bHkgaW4gXAorCXZhcmlvdXMgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5LgordW5tYXAtdGFibGU6IFRhYmxlICJ7MH0iIGNvdWxkIG5vdCBiZSByZXZlcnNlIG1hcHBlZC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgXAorCXRhYmxlIGRvZXMgbm90IGhhdmUgYSBwcmltYXJ5IGtleSAocHJpbWFyeSBrZXlzIGFyZSByZXF1aXJlZCB0byBlc3RhYmxpc2ggXAorCXVuaXF1ZSBpZGVudGlmaWVycyBmb3IgYWxsIHBlcnNpc3RlbnQgb2JqZWN0cykgYW5kIGRvZXMgbm90IG1hdGNoIGEga25vd24gXAorCXBhdHRlcm4gZm9yIGEgdGFibGUgdXNlZCBmb3IgY3Jvc3MtcmVmZXJlbmNlIG9yIHZhbHVlIGNvbGxlY3Rpb25zLgordW5tYXAtY29sczogVGhlIGZvbGxvd2luZyBjb2x1bW5zIG9mIHRhYmxlICJ7MH0iIGNvdWxkIG5vdCBiZSByZXZlcnNlIFwKKwltYXBwZWQgInsxfSIuCituby1way1maWVsZHM6IFJldmVyc2UtbWFwcGVkIHR5cGUgInswfSIgaXMgY29uZmlndXJlZCB0byB1c2UgYXBwbGljYXRpb24gXAorCWlkZW50aXR5LCBidXQgaGFzIG5vIHByaW1hcnkga2V5IGZpZWxkcy4KK2NsYXNzLWNvZGU6IFdyaXRpbmcgamF2YSBjb2RlIGZvciBnZW5lcmF0ZWQgdHlwZSAiezB9Ii4KK2NhbnQtdXNlLWNoYXI6IENvbHVtbiAiezB9IiBpcyB0eXBlIENIQVIoMSksIGJ1dCBPcGVuSlBBIGNhbm5vdCBcCisJcmV2ZXJzZSBtYXAgaXQgaW50byBhIEphdmEgY2hhciBiZWNhdXNlIE9wZW5KUEEgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgdG8gXAorCXN0b3JlIEphdmEgY2hhcnMgaW50byBudW1lcmljIGRhdGFiYXNlIGNvbHVtbnMuICBUbyBjb25maWd1cmUgT3BlbkpQQSB0byBcCisJc3RvcmUgSmF2YSBjaGFycyBpbnRvIENIQVIoMSkgY29sdW1ucywgc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydHk6XG5cCisJb3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeTogU3RvcmVDaGFyc0FzTnVtYmVycz1mYWxzZQorcmV2dG9vbC1ydW5uaW5nOiBUaGUgcmV2ZXJzZSBtYXBwaW5nIHRvb2wgd2lsbCBydW4gb24gdGhlIGRhdGFiYXNlLiAgVGhlIHRvb2wgXAorCWlzIGdhdGhlcmluZyBzY2hlbWEgaW5mb3JtYXRpb247IHRoaXMgcHJvY2VzcyBtYXkgdGFrZSBzb21lIHRpbWUuICBFbmFibGUgXAorCXRoZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5TY2hlbWEgbG9nZ2luZyBjYXRlZ29yeSB0byBzZWUgbWVzc2FnZXMgYWJvdXQgc2NoZW1hIGRhdGEuCityZXZ0b29sLXJ1bm5pbmctZmlsZTogVGhlIHJldmVyc2UgbWFwcGluZyB0b29sIHdpbGwgcnVuIG9uIHNjaGVtYSBmaWxlICJ7MH0iLgorcmV2dG9vbC1tYXA6IENhbGN1bGF0aW5nIHJldmVyc2UgbWFwcGluZ3MuCityZXZ0b29sLXdyaXRlLWNvZGU6IFdyaXRpbmcgZ2VuZXJhdGVkIGNsYXNzIHNvdXJjZSBjb2RlLgorcmV2dG9vbC13cml0ZS1hcHBpZDogV3JpdGluZyBnZW5lcmF0ZWQgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3Nlcy4KK3JldnRvb2wtd3JpdGUtbWV0YWRhdGE6IFdyaXRpbmcgZ2VuZXJhdGVkIG1ldGFkYXRhLgorcmV2dG9vbC11c2FnZTogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5SZXZlcnNlTWFwcGluZ1Rvb2xcblwKKwlcdFstcHJvcGVydGllcy8tcCA8cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstPHByb3BlcnR5IG5hbWU+IDxwcm9wZXJ0eSB2YWx1ZT5dKlxuXAorCVx0Wy1kaXJlY3RvcnkvLWQgPG91dHB1dCBkaXJlY3Rvcnk+XVxuXAorCVx0Wy1zY2hlbWFzLy1zIDxzY2hlbWEgYW5kIHRhYmxlIGxpc3Q+XVxuXAorCVx0Wy1wYWNrYWdlLy1wa2cgPHBhY2thZ2UgbmFtZT5dXG5cCisJXHRbLXVzZVNjaGVtYU5hbWUvLXNuIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstdXNlRm9yZWlnbktleU5hbWUvLWZrbiA8dHJ1ZS90IHwgZmFsc2UvZj5dXG5cCisJXHRbLW51bGxhYmxlQXNPYmplY3QvLW5vIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstYmxvYkFzT2JqZWN0Ly1ibyA8dHJ1ZS90IHwgZmFsc2UvZj5dXG5cCisJXHRbLXR5cGVNYXAvLXR5cGUgPHR5cGVzPl1cblwKKwlcdFstcHJpbWFyeUtleU9uSm9pbi8tcGtqIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstdXNlRGF0YXN0b3JlSWRlbnRpdHkvLWRzIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstdXNlQnVpbHRpbklkZW50aXR5Q2xhc3MvLWJpYyA8dHJ1ZS90IHwgZmFsc2UvZj5dXG5cCisJXHRbLWlubmVySWRlbnRpdHlDbGFzc2VzLy1pbm4gPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1pZGVudGl0eUNsYXNzU3VmZml4Ly1pcyA8c3VmZml4Pl1cblwKKwlcdFstaW52ZXJzZVJlbGF0aW9ucy8taXIgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1kZXRhY2hhYmxlLy1kZXQgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1kaXNjcmltaW5hdG9yU3RyYXRlZ3kvLWRzIDxzdHJhdGVneT5dXG5cCisJXHRbLXZlcnNpb25TdHJhdGVneS8tdnMgPHN0cmF0ZWd5Pl1cblwKKwlcdFstbWV0YWRhdGEvLW1kIDxwYWNrYWdlIHwgY2xhc3M+XVxuXAorCVx0Wy1jdXN0b21pemVyQ2xhc3MvLWNjIDxmdWxsIGNsYXNzIG5hbWU+XVxuXAorCVx0Wy1jdXN0b21pemVyUHJvcGVydGllcy8tY3AgPHByb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLWN1c3RvbWl6ZXIvLWMuPHByb3BlcnR5IG5hbWU+IDxwcm9wZXJ0eSB2YWx1ZT5dKlxuXAorCVx0Wy1jb2RlRm9ybWF0Ly1jZi48cHJvcGVydHkgbmFtZT4gPHByb3BlcnR5IHZhbHVlPl0qXG5cCisJXHRbLnNjaGVtYSBmaWxlXSoKK2N1c3RvbS1jbGFzczogQ3VzdG9taXplZCBuYW1lIGZvdW5kIGZvciBjbGFzcyAiezB9Ijogd2lsbCByZW5hbWUgYXMgInsxfSIuCitjdXN0b20tbm8tY2xhc3M6IE5vIGN1c3RvbWl6ZWQgbmFtZSBmb3VuZCBmb3IgY2xhc3MgInswfSIgb2YgdGFibGUgInsxfSIuCitjdXN0b20tcm0tY2xhc3M6IFJlbW92aW5nIGNsYXNzICJ7MH0iIG9mIHRhYmxlICJ7MX0iIGZyb20gcmV2ZXJzZSBtYXBwZWQgc2V0LgorY3VzdG9tLWZpZWxkOiBDdXN0b21pemVkIG5hbWUgZm91bmQgZm9yIGZpZWxkICJ7MH0iIGluIHR5cGUgInsxfSI6IHdpbGwgXAorCXJlbmFtZSBhcyAiezF9Ii4KK2N1c3RvbS1uby1maWVsZDogTm8gY3VzdG9taXplZCBuYW1lIGZvdW5kIGZvciBmaWVsZCAiezB9IiBpbiB0eXBlICJ7MX0iLgorY3VzdG9tLXJtLWZpZWxkOiBSZW1vdmluZyBmaWVsZCAiezB9IiBpbiB0eXBlICJ7MX0iIGZyb20gcmV2ZXJzZSBtYXBwZWQgc2V0LgorY3VzdG9tLXVudXNlZC1wcm9wczogVGhlIGZvbGxvd2luZyBjdXN0b21pemVyIHByb3BlcnRpZXMgd2VyZSBub3QgdXNlZCBpbiBcCisJdGhlIHJldmVyc2UgbWFwcGluZyBwcm9jZXNzOiB7MH0uCityZXZlcnNlLXR5cGU6IE92ZXJyaWRpbmcgdHlwZSBtYXBwaW5nIGZvciBjb2x1bW4gb2YgdHlwZSBuYW1lICJ7MH0iIHRvIEphdmEgXAorCWNsYXNzICJ7MX0iLgorbm8tcmV2ZXJzZS10eXBlOiBObyBvdmVycmlkZGVuIHR5cGUgbWFwcGluZyBmb3IgY29sdW1uIG9mIHR5cGUgbmFtZSAiezB9Ii4KK25vLXF1ZXJ5LXJlczogVGhlcmUgaXMgbm8gcXVlcnkgcmVzdWx0IG1hcHBpbmcgZm9yICJ7MH0iIHdpdGggbmFtZSAiezF9Ii4KK251bGwtcGF0aDogQXR0ZW1wdCB0byBhZGQgYSBudWxsIG9yIGVtcHR5IHBhdGggdG8gcmVzdWx0IHR5cGUgInsxfSIgaW4gbWFwcGluZyBcCisJInswfSIuCitiYWQtcGF0aDogUmVzdWx0IHBhdGggInsyfSIgaW4gcmVzdWx0IHR5cGUgInsxfSIgb2YgbWFwcGluZyAiezB9IiBjb250YWlucyBcCisJaW52YWxpZCBmaWVsZHMuCit1bnRyYXZlcnNhYmxlLXBhdGg6IFJlc3VsdCBwYXRoICJ7Mn0iIGluIHJlc3VsdCB0eXBlICJ7MX0iIG9mIG1hcHBpbmcgInswfSIgXAorCWF0dGVtcHRzIHRvIHRyYXZlcnNlIHRocm91Z2ggYSBub24tcmVsYXRpb24gZmllbGQuCitudW0tY29scy1wYXRoOiBSZXN1bHQgcGF0aCAiezJ9IiBpbiByZXN1bHQgdHlwZSAiezF9IiBvZiBtYXBwaW5nICJ7MH0iIFwKKwlhdHRlbXB0cyB0byBtYXAgYSBmaWVsZCB0aGF0IGRvZXMgbm90IGhhdmUgZXhhY3RseSAxIGNvbHVtbi4KK21pc3NpbmctdW5pcXVlLWNvbHVtbjogQSB1bmlxdWUgY29uc3RyYWludCBzcGVjaWZpZWQgaW4gbWFwcGluZyBvZiBjbGFzcyAiezB9IiBcCisgICAgdG8gdGFibGUgInsxfSIgaW5jbHVkZXMgYSBjb2x1bW4gInsyfSIuIEhvd2V2ZXIsIHRoZSBjb2x1bW4gZG9lcyBub3QgXAorCWV4aXN0IGluICJ7MX0iIHRhYmxlLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTMzMjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9zdHJhdHMvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMzggQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworcmVsLXRvLXVua25vd25pZDogWW91IGNhbm5vdCBtYXAgYSBsb2dpY2FsIGZvcmVpZ24ga2V5IHJlbGF0aW9uIHRvIGFuIG9iamVjdCBcCisJd2l0aCBhbiB1bmtub3duIGlkZW50aXR5IHR5cGUuCitjYW50LW1hcHBlZC1ieTogRmllbGQgInswfSIgY2Fubm90IGRlY2xhcmUgdGhhdCBpdCBpcyBtYXBwZWQgYnkgYW5vdGhlciBmaWVsZC4gXAorCUl0cyBtYXBwaW5nIHN0cmF0ZWd5ICh7MX0pIGRvZXMgbm90IHN1cHBvcnQgbWFwcGluZyBieSBhbm90aGVyIGZpZWxkLgorbWFwcGVkLWludmVyc2UtdW5qb2luZWQ6IEZpZWxkICJ7MH0iIGFzIGRlZmluZWQgaW4gInsxfSIgY2Fubm90IGJlIG1hcHBlZCBieSBcCisJInsyfSIuICBZb3UgY2Fubm90IHVzZSBhbiBpbnZlcnNlIGZvcmVpZ24ga2V5IHRvIG1hcCBhIHN1cGVyY2xhc3MgZmllbGQgb2YgXAorCWFuIHVuam9pbmVkIHN1YmNsYXNzLgorbWFwcGVkLWJ5LXVubWFwcGVkOiBGaWVsZCAiezB9IiBjYW5ub3QgYmUgbWFwcGVkIGJ5ICJ7MX0iLCBiZWNhdXNlIHRoZSByZWxhdGVkIFwKKwlmaWVsZCBvciB0eXBlIGlzIHVubWFwcGVkLgorY2FudC1qb2luOiBDYW5ub3Qgam9pbiBhY3Jvc3MgInswfSIuICBUaGUgcmVsYXRlZCB0eXBlIGhhcyB1bmpvaW5lZCBzdWJjbGFzc2VzLgorY2FudC1pbnZlcnNlOiAiezB9IiBpcyBub3QgYSB2YWxpZCBtYXBwaW5nLiAgSW52ZXJzZSBmb3JlaWduIGtleS1iYXNlZCBcCisJcmVsYXRpb25zIHRvIHR5cGVzIHdpdGggdW5qb2luZWQgc3ViY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4KK2NhbnQtbG9hZDogInswfSIgaXMgbm90IGEgdmFsaWQgbWFwcGluZy4gVGhlIHJlbGF0ZWQgdHlwZSBoYXMgc3ViY2xhc3NlcyB0aGF0IFwKKwlhcmUgbm90IHJlYWNoYWJsZSB2aWEgam9pbnMsIHNvIE9wZW5KUEEgbXVzdCBiZSBhYmxlIHRvIGNvbnN0cnVjdCBhbiBvaWQgXAorCWZyb20gdGhlIG1hcHBlZCBmb3JlaWduIGtleS4gIEJ1dCB5b3VyIGZvcmVpZ24ga2V5IGRvZXMgbm90IHJlcHJlc2VudCBhbGwgXAorCXByaW1hcnkga2V5IHZhbHVlcyBvZiB0aGUgcmVsYXRlZCB0eXBlLgorZmx1c2gtdmlydHVhbDogQXR0ZW1wdCB0byBmbHVzaCBhbiB1bm1hcHBlZCBvYmplY3Qgb2YgdHlwZSAiezB9IiB3aXRoIG9pZCAiezF9Ii4KK2NhbnQtcHJvamVjdC1vd25lZDogInswfSIgY2Fubm90IGJlIHVzZWQgaW4gYSBwcm9qZWN0aW9uLCBiZWNhdXNlIGl0IGNhbiBvbmx5IFwKKwliZSBsb2FkZWQgYXMgcGFydCBvZiBpdHMgb3duaW5nIG9iamVjdC4KK25vdC1lbWJlZGRhYmxlOiAiezB9IiBpcyBtYXBwZWQgYXMgZW1iZWRkZWQsIGJ1dCBlbWJlZGRlZCBmaWVsZCAiezF9IiBpcyBub3QgXAorCWVtYmVkZGFibGUuICBFbWJlZGRlZCBlbGVtZW50L2tleS92YWx1ZSB0eXBlcyBhcmUgbGltaXRlZCB0byBzaW1wbGUgZmllbGRzIFwKKwlhbmQgZGlyZWN0IHJlbGF0aW9ucyB0byBvdGhlciBwZXJzaXN0ZW50IHR5cGVzLgorb2lkLWludmFsaWQ6IE9iamVjdCBpZCBkYXRhICJ7MH0iIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZSBmb3IgInsxfSIgaXMgbm90IGluIFwKKwl0aGUgY29ycmVjdCBmb3JtYXQuIFBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGRhdGFiYXNlIHJlY29yZHMgYXJlIGluIHRoZSBcCisJY29ycmVjdCBmb3JtYXQuCitscnMtbm8tb3duZXI6IFRoaXMgY29udGFpbmVyIHdhcyBsb2FkZWQgaW4gbGFyZ2UgcmVzdWx0IHNldCBmaWVsZCAiezB9IiwgYnV0IFwKKwloYXMgYmVlbiByZW1vdmVkIGZyb20gaXRzIG93bmluZyBmaWVsZC4gIFRoZXJlZm9yZSwgaXQgY2FuIG5vIGxvbmdlciBiZSBcCisJdXNlZC4KK25vdC1mdWxsOiBUeXBlICJ7MH0iIHNwZWNpZmllcyBhIGZ1bGwgY2xhc3MgbWFwcGluZyBzdHJhdGVneSwgYnV0IGhhcyBhIG1hcHBlZCBcCisJcGVyc2lzdGVuY2UgY2FwYWJsZSBzdXBlcmNsYXNzIG9yIGlzIGVtYmVkZGVkLiAgVXNlIGEgdmFsaWQgc3ViY2xhc3Mgb3IgXAorCWVtYmVkZGVkIHN0cmF0ZWd5IGluc3RlYWQuCitub3QtYmFzZS12ZXJzOiBUeXBlICJ7MH0iIHNwZWNpZmllcyBhIHZlcnNpb24gc3RyYXRlZ3ksIGJ1dCBoYXMgYSBtYXBwZWQgXAorCXBlcnNpc3RlbmNlIGNhcGFibGUgc3VwZXJjbGFzcyBvciBpcyBlbWJlZGRlZC4gIFN1YmNsYXNzZXMgYW5kIGVtYmVkZGVkIFwKKwl2YWx1ZXMgbXVzdCB1c2UgdGhlIHZlcnNpb24gc3RyYXRlZ3kgb2YgdGhlIGJhc2Ugb3IgZW1iZWRkaW5nIGNsYXNzLgorbm90LWJhc2UtZGlzYzogVHlwZSAiezB9IiBzcGVjaWZpZXMgYSBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5LCBidXQgaGFzIGEgbWFwcGVkIFwKKwlwZXJzaXN0ZW5jZSBjYXBhYmxlIHN1cGVyY2xhc3Mgb3IgaXMgZW1iZWRkZWQuICBTdWJjbGFzc2VzIGFuZCBlbWJlZGRlZCBcCisJdmFsdWVzIG11c3QgdXNlIHRoZSBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5IG9mIHRoZSBiYXNlIG9yIGVtYmVkZGluZyBjbGFzcy4KK25vdC1zdWI6IFR5cGUgInswfSIgc3BlY2lmaWVzIGEgc3ViY2xhc3MgbWFwcGluZyBzdHJhdGVneSwgYnV0IGRvZXMgbm90IFwKKwloYXZlIGEgbWFwcGVkIHBlcnNpc3RlbmNlIGNhcGFibGUgc3VwZXJjbGFzcyBvciBpcyBlbWJlZGRlZC4gIFVzZSBhIHZhbGlkIFwKKwliYXNlIG9yIGVtYmVkZGVkIGNsYXNzIHN0cmF0ZWd5IGluc3RlYWQuCitub3QtZW1iZWQ6ICJ7MH0iIHNwZWNpZmllcyBhbiBlbWJlZGRlZCBtYXBwaW5nIHN0cmF0ZWd5LCBidXQgaXQgaXMgbm90IFwKKwllbWJlZGRlZC4KK25vdC1vaWQ6ICJ7MH0iIHNwZWNpZXMgYW4gb2JqZWN0IGlkIG1hcHBpbmcgc3RyYXRlZ3ksIGJ1dCBpdCBpcyBub3QgXAorCWFuIG9iamVjdCBpZCBmaWVsZC4KK29pZC1ub3Qtam9pbmFibGU6IEZpZWxkICJ7MH0iIGVtYmVkZGVkIHdpdGhpbiBvYmplY3QgaWQgZmllbGQgInsxfSIgY2Fubm90IGJlIFwKKwlhIHByaW1hcnkga2V5IHZhbHVlLiAgSXRzIG1hcHBpbmcgZG9lcyBub3QgaXQgdG8gYmUgYSBqb2luIHRhcmdldC4KK2ZsYXQtdGFibGU6IFR5cGUgInswfSIgdXNlcyBhIGZsYXQgaW5oZXJpdGFuY2UgbWFwcGluZywgYnV0IGRlY2xhcmVzIGEgdGFibGUgXAorCW5hbWUgb2YgInsxfSIsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBzdXBlcmNsYXNzIHRhYmxlICJ7Mn0iLgorbm90LXN0cmluZzogRmllbGQgInswfSIgZGVjbGFyZXMgYSBzdHJpbmcgZmllbGQgbWFwcGluZyBzdHJhdGVneSwgYnV0IGlzIG5vdCBcCisJYSBzdHJpbmcgZmllbGQuCitub3QtcHJpbWl0aXZlOiBGaWVsZCAiezB9IiBkZWNsYXJlcyBhIHByaW1pdGl2ZSBmaWVsZCBtYXBwaW5nIHN0cmF0ZWd5LCBidXQgXAorCWlzIG5vdCBvZiBhIHByaW1pdGl2ZSB0eXBlLgorbm90LWNsb2JzdHJpbmc6IEZpZWxkICJ7MH0iIGRlY2xhcmVzIGEgY2xvYiBmaWVsZCBtYXBwaW5nIHN0cmF0ZWd5LCBidXQgaXMgXAorCW5vdCBhIHN0cmluZyBmaWVsZC4KK25vdC1ieXRlczogRmllbGQgInswfSIgZGVjbGFyZXMgYSBieXRlIGFycmF5IGZpZWxkIG1hcHBpbmcgc3RyYXRlZ3ksIGJ1dCBpcyBcCisJbm90IGEgYnl0ZSBhcnJheSBmaWVsZC4KK25vdC1jaGFyczogRmllbGQgInswfSIgZGVjbGFyZXMgYSBjaGFyIGFycmF5IGZpZWxkIG1hcHBpbmcgc3RyYXRlZ3ksIGJ1dCBpcyBcCisJbm90IGEgY2hhciBhcnJheSBmaWVsZC4KK25vdC1zZXJpYWxpemVkOiBGaWVsZCAiezB9IiBkZWNsYXJlcyBhIGJsb2IgbWFwcGluZyBzdHJhdGVneSwgYnV0IHRoZSBcCisJZmllbGQnJ3MgdmFsdWUgaXMgbm90IHNlcmlhbGl6ZWQuICBTZXQgdGhlIGZpZWxkJydzICJzZXJpYWxpemVkIiBhdHRyaWJ1dGUgXAorCXRvIHRydWUuCitub3QtcmVsYXRpb246ICJ7MH0iIGRlY2xhcmVzIGEgcmVsYXRpb24gbWFwcGluZyBzdHJhdGVneSwgYnV0IGlzIG5vdCBhIFwKKwlkaXJlY3QsIG5vbi1lbWJlZGRlZCByZWxhdGlvbiB0byBhbm90aGVyIHBlcnNpc3RlbmNlLWNhcGFibGUgb2JqZWN0Lgorbm90LWVsZW0tcmVsYXRpb246ICJ7MH0iIGRlY2xhcmVzIGEgdG8tbWFueSByZWxhdGlvbiBzdHJhdGVneSwgYnV0IGl0cyBcCisJZWxlbWVudHMgYXJlIG5vdCBkaXJlY3QsIG5vbi1lbWJlZGRlZCByZWxhdGlvbnMgdG8gYW5vdGhlciBtYXBwZWQgXAorCXBlcnNpc3RlbmNlLWNhcGFibGUgb2JqZWN0Lgorbm90LWludi1yZWxhdGlvbjogRmllbGQgInswfSIgZGVjbGFyZXMgInsxfSIgYXMgaXRzIG1hcHBlZC1ieSBmaWVsZCwgYnV0IHRoaXMgXAorCWZpZWxkIGlzIG5vdCBhIGRpcmVjdCByZWxhdGlvbi4KK25vdC1pbnYtcmVsYXRpb24tY29sbDogRmllbGQgInswfSIgZGVjbGFyZXMgInsxfSIgYXMgaXRzIG1hcHBlZC1ieSBmaWVsZCwgYnV0IFwKKwl0aGlzIGZpZWxkIGlzIG5vdCBhIGNvbGxlY3Rpb24gb2YgaW52ZXJzZSByZWxhdGlvbnMuCitub3QtY29sbDogRmllbGQgInswfSIgZGVjbGFyZXMgYSBjb2xsZWN0aW9uIG1hcHBpbmcgc3RyYXRlZ3ksIGJ1dCBpcyBub3QgYSBcCisJY29sbGVjdGlvbiBvciBhcnJheSB0eXBlLgorY29sbC1vd25lcjogIEluZWZmaWNpZW50IG1hcHBpbmc6IFlvdSBoYXZlIGRlY2xhcmVkIHRoYXQgZmllbGQgInswfSIgaXMgbWFwcGVkIFwKKwlieSBjb2xsZWN0aW9uICJ7MX0iLiAgVGhlIG1hcHBpbmcgd291bGQgYmUgbXVjaCBtb3JlIGVmZmljaWVudCBpZiBpbnN0ZWFkIFwKKwl5b3UgbWFwICJ7MH0iIGFuZCBkZWNsYXJlIHRoYXQgInsxfSIgaXMgbWFwcGVkIGJ5IGl0LgorY2xhc3MtY3JpdC1vd25lcjogRmllbGQgInswfSIgZGVjbGFyZXMgdGhhdCBpdCB1c2VzIGNsYXNzIGNyaXRlcmlhIGZvciBqb2lucywgXAorCWFuZCB0aGlzIGZpZWxkIGlzIG5vdCBvd25lZCBieSBhbiBpbnZlcnNlIGZpZWxkLiAgQXMgYSByZXN1bHQsIGl0IGlzIFwKKwlpbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBudWxsIHRoZSBpbnZlcnNlIGZvcmVpZ24ga2V5cyB3aGVuIHRoZSBmaWVsZCBpcyBcCisJZGVsZXRlZC4gIE9wZW5KUEEgbWF5IGxlYXZlIG9ycGhhbiBrZXkgdmFsdWVzIGluIHRoZSBkYXRhYmFzZSBpZiB5b3UgZG8gXAorICAgIG5vdCBwcm92aWRlIGFuIG93bmluZyBpbnZlcnNlIHJlbGF0aW9uIHVzaW5nIHRoZSAibWFwcGVkLWJ5IiBhdHRyaWJ1dGUuCitub3QtbWFwOiBGaWVsZCAiezB9IiBkZWNsYXJlcyBhIG1hcCBtYXBwaW5nIHN0cmF0ZWd5LCBidXQgaXMgbm90IGEgbWFwIHR5cGUuCittYXBwZWQtYnkta2V5OiBNYXAgZmllbGQgInswfSIgaXMgYXR0ZW1wdGluZyB0byB1c2UgYSBtYXAgdGFibGUsIGJ1dCBpdHMga2V5IFwKKwlpcyBtYXBwZWQgYnkgYW5vdGhlciBmaWVsZC4gIFVzZSBhbiBpbnZlcnNlIGtleSBvciBqb2luIHRhYmxlIG1hcHBpbmcuCitub3QtbWFwcGVkLWJ5LWtleTogTWFwIGZpZWxkICJ7MH0iIGlzIGF0dGVtcHRpbmcgdG8gdXNlIGFuIGludmVyc2Uga2V5IG9yIGpvaW4gXAorCXRhYmxlIG1hcHBpbmcsIGJ1dCBpdHMga2V5IGlzIG5vdCBtYXBwZWQgYnkgYW5vdGhlciBmaWVsZC4gIFVzZSBhIG1hcCBcCisJdGFibGUgbWFwcGluZy4KK25vLWhhbmRsZXI6IEZpZWxkICJ7MH0iIGRlY2xhcmVzIGEgaGFuZGxlci1iYXNlZCBtYXBwaW5nIHN0cmF0ZWd5LCBidXQgbm8gXAorCXZhbHVlIGhhbmRsZXIgaXMgaW5zdGFsbGVkLgorYXV0by1hc3NpZ24taGFuZGxlcjogQXR0ZW1wdCB0byB1c2UgYW4gYXV0by1hc3NpZ25lZCBjb2x1bW4gdmFsdWUgaW4gYSBoYW5kbGVyIFwKKwl3aXRoIG11bHRpcGxlIGNvbHVtbnMuICBUbyB1c2UgYW4gYXV0by1hc3NpZ25lZCBjb2x1bW4gdmFsdWUgd2l0aCBmaWVsZCBcCisJInswfSIsIHlvdSB3aWxsIGhhdmUgdG8gd3JpdGUgYSBjdXN0b20gZmllbGQgbWFwcGluZyB0aGF0IGltcGxlbWVudHMgdGhlIFwKKwlvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkpvaW5hYmxlIGludGVyZmFjZS4KK2xvYWQtc3ViczogTG9hZGluZyBzdWJjbGFzc2VzIGZyb20gZGlzY3JpbWluYXRvciBjb2x1bW4gb2YgInswfSIuCituby1jbGFzcy1uYW1lOiBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gInsxfSIgZm9yIHR5cGUgInsxfSIgY29udGFpbnMgYSBudWxsIFwKKwlvciBlbXB0eSB2YWx1ZS4KK2NhbnQtaW5pdC1zdWJzOiBUaGUgZGlzY3JpbWluYXRvciBmb3IgdHlwZSAiezB9IiBjYW5ub3QgY29tcHV0ZSB0aGUgbGlzdCBvZiBcCisJaXRzIHN1YmNsYXNzZXMgb24gaXRzIG93bi4gIFlvdSBzaG91bGQgZWl0aGVyIHVzZSBhIGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kgXAorCXRoYXQgaGFzIHRoaXMgYWJpbGl0eSAoc3VjaCBhcyB0aGUgY2xhc3MtbmFtZSBzdHJhdGVneSksIGluY2x1ZGUgdGhlIHNldCBcCisJb2YgcGVyc2lzdGVudCBjbGFzc2VzIGluIHRoZSAib3BlbmpwYS5NZXRhRGF0YUZhY3RvcnkiIHByb3BlcnR5IHNvIHRoYXQgXAorICAgIE9wZW5KUEEgY2FuIGRpc2NvdmVyIGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgYXQgc3RhcnR1cCwgb3IgbWFrZSBzdXJlIHRoYXQgXAorICAgIGFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgdHlwZSBoYXZlIGhhZCB0aGVpciBjbGFzcyBpbnN0YW50aWF0ZWQgaW4gdGhlIEpWTSBcCisJYmVmb3JlIHBlcmZvcm1pbmcgYW55IHBlcnNpc3RlbnQgb3BlcmF0aW9ucyBvbiB0aGlzIGNsYXNzIG9yIGl0cyBcCisJc3ViY2xhc3Nlcy4gIElmIHRoaXMgY2xhc3MgZG9lcyBub3QgaGF2ZSBhbnkgc3ViY2xhc3NlcywgY29uc2lkZXIgbWFraW5nIFwKKwl0aGUgY2xhc3MgZmluYWwgb3IgY2hhbmdpbmcgaXRzIGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kgdG8gImZpbmFsIi4KK25vLWRpc2NyaW0tdmFsdWU6IFR5cGUgInswfSIgdXNlcyB0aGUgdmFsdWUtbWFwIGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3ksIGJ1dCBcCisJZG9lcyBub3QgZGVjbGFyZSBhIGRpc2NyaW1pbmF0b3IgdmFsdWUuCitkdXAtZGlzY3JpbS12YWx1ZTogRGlzY3JpbWluYXRvciB2YWx1ZSAiezB9IiBpcyB1c2VkIGZvciB0d28gZGlmZmVyZW50IFwKKwljbGFzc2VzIGluIHRoZSBzYW1lIGluaGVyaXRhbmNlIHRyZWU6ICJ7MX0iLCAiezJ9Igorb3V0ZXItam9pbi1zdXBwb3J0OiBUaGUgc3ViY2xhc3Mtam9pbiBjbGFzcyBpbmRpY2F0b3IgbWFwcGVkIHRvICJ7MH0iIHJlcXVpcmVzIFwKKwlvdXRlciBqb2lucyB0byBmdW5jdGlvbi4gIFlvdXIgZGF0YWJhc2UgZGljdGlvbmFyeSBpcyBjb25maWd1cmVkIHRvIHVzZSBcCisJInRyYWRpdGlvbmFsIiBqb2luIHN5bnRheCwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBvdXRlciBqb2lucy4gIFRvIFwKKwl1c2UgU1FMIDkyIGpvaW5zIGluc3RlYWQsIHNldCB0aGUgZm9sbG93aW5nIHByb3BlcnR5OlxuXAorCW9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnk6IEpvaW5TeW50YXg9c3FsOTIKK3Vua25vd24tZGlzY3JpbS12YWx1ZTogQ291bGQgbm90IG1hcCBkaXNjaW1pbmF0b3IgdmFsdWUgInswfSIgdG8gYW55IFwKKwlrbm93biBzdWJjbGFzc2VzIG9mIHRoZSByZXF1ZXN0ZWQgY2xhc3MgInsxfSIgKGtub3duIGRpc2NyaW1pbmF0b3IgXAorCXZhbHVlczogezJ9KS4KK2JhZC11bm1hcHBlZC1yZWw6ICJ7MH0iIGNhbm5vdCBiZSBtYXBwZWQgd2l0aG91dCBzdHJpbmdpZnlpbmcgdGhlIG9pZCBvZiBcCisJdGhlIHJlbGF0ZWQgb2JqZWN0IHRvIGEgc3RyaW5nIGNvbHVtbi4gIFRoZSByZWxhdGVkIHR5cGUgaXMgdW5tYXBwZWQgYW5kIFwKKwlpdHMgInsxfSIgcHJpbWFyeSBrZXkgZmllbGQgZG9lcyBub3QgdXNlIGEgc2ltcGxlIG1hcHBpbmcuCit1bm1hcHBlZC1kYXRhc3RvcmUtdmFsdWU6IEluc3RhbmNlcyBvZiB0eXBlICJ7MH0iIGFyZSBub3QgdmFsaWQgcXVlcnkgXAorCXBhcmFtZXRlcnMgYmVjYXVzZSB0aGUgdHlwZSBpcyBub3QgbWFwcGVkLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxNWY5MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNDkgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworYmFkLWpvaW46IFRoZSBmb2xsb3dpbmcgZXJyb3Igd2FzIGRldGVjdGVkIHdoZW4gY3JlYXRpbmcgYSBmb3JlaWduIGtleTogXAorCSJ7MH0iLiAgVGhlIGZvcmVpZ24ga2V5IGlzIGJlaW5nIGlnbm9yZWQuCituby1kcml2ZXI6IEEgSkRCQyBEcml2ZXIgb3IgRGF0YVNvdXJjZSBjbGFzcyBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBcCisJQ29ubmVjdGlvbkRyaXZlck5hbWUgcHJvcGVydHkuCitiYWQtZHJpdmVyOiBUaGUgc3BlY2lmaWVkIGRyaXZlciAiezB9IiBpcyBuZWl0aGVyIGEgamF2YS5zcWwuRHJpdmVyIFwKKwlub3IgYSBqYXZheC5zcWwuRGF0YVNvdXJjZSBjbGFzcyBuYW1lLgorYmFkLXNjaC1yZWY6IFRoZSBzY2hlbWEgaW5mb3JtYXRpb24gdGFibGUgY291bGQgbm90IGJlIGNyZWF0ZWQ6IHswfQorYmFkLXNjaC1yZWFkOiBBdHRlbXB0IHRvIHJlYWQgdGhlIHNjaGVtYSBpbmZvcm1hdGlvbiB0YWJsZSBmYWlsZWQ7IGNvbnRpbnVpbmcgXAorCW9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHRhYmxlIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCwgYW5kIHRoZXJlIGlzIFwKKwlubyBkYXRhIHRvIHJlYWQ6IHswfQorYmFkLXNjaC13cml0ZS0xOiBGaXJzdCBhdHRlbXB0IHRvIHdyaXRlIHRvIHRoZSBzY2hlbWEgaW5mb3JtYXRpb24gdGFibGUgXAorCWZhaWxlZDsgd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZSB0aGUgdGFibGUgaW4gY2FzZSBpdCBoYXMgYmVlbiBkcm9wcGVkIFwKKwliZWZvcmUgcmUtdHJ5aW5nOiB7MH0KK2JhZC1zY2gtd3JpdGUtMjogQXR0ZW1wdCB0byB3cml0ZSB0aGUgc2NoZW1hIGluZm9ybWF0aW9uIHRhYmxlIGZvciB0aGUgc2Vjb25kIFwKKwl0aW1lIGZhaWxlZC4gIFNlZSBwcmV2aW91cyBsb2cgbWVzc2FnZXMgZm9yIHBvc3NpYmxlIHJlYXNvbnMuCitiYWQtc2VxLW51bTogQmFkIG51bWVyaWMgY29uc3RhbnQgZm9yIGF0dHJpYnV0ZSBpbiBzZXF1ZW5jZSAiezB9Ii4KK3BrLXJlc29sdmU6IFRoZSBjb2x1bW4gInswfSIgc3BlY2lmaWVkIGFzIGEgcHJpbWFyeSBrZXkgZm9yIHRhYmxlICJ7MX0iIFwKKwlkb2VzIG5vdCBleGlzdCBpbiB0aGF0IHRhYmxlLgoraW5kZXgtaW5mbzogVW5hYmxlIHRvIGdldCBpbmRleCBpbmZvcm1hdGlvbiBmb3IgdGFibGUgInswfSI6ICJ7MX0iCitpbmRleC1yZXNvbHZlOiBUaGUgY29sdW1uICJ7MX0iIHNwZWNpZmllZCBhcyBwYXJ0IG9mIGluZGV4ICJ7MH0iIG9uIHRhYmxlIFwKKwkiezJ9IiBkb2VzIG5vdCBleGlzdCBpbiB0aGF0IHRhYmxlLgordW5xLXJlc29sdmU6IFRoZSBjb2x1bW4gInsxfSIgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdW5pcXVlIGNvbnN0cmFpbnQgInswfSIgb24gXAorCXRhYmxlICJ7Mn0iIGRvZXMgbm90IGV4aXN0IGluIHRoYXQgdGFibGUuCitmay10b3RhYmxlOiBUaGUgZm9yZWlnbiB0YWJsZSAiezF9IiBzcGVjaWZpZWQgaW4gZm9yZWlnbiBrZXkgInswfSIgb24gXAorCXRhYmxlICJ7Mn0iIGRvZXMgbm90IGV4aXN0IG9yIGRvZXMgbm90IGhhdmUgYSBwcmltYXJ5IGtleS4KK2ZrLW5vY29sOiBUaGUgY29sdW1uICJ7MX0iIHNwZWNpZmllZCBieSBmb3JlaWduIGtleSAiezB9IiBvbiB0YWJsZSAiezJ9IiBcCisJZG9lcyBub3QgZXhpc3QgaW4gdGhhdCB0YWJsZS4KK2ZrLW5vcGtjb2w6IFRoZSBjb2x1bW4gInsxfSIgb2YgdGFibGUgInsyfSIgam9pbmVkIHRvIGJ5IGZvcmVpZ24ga2V5ICJ7MH0iIFwKKwlvbiB0YWJsZSAiezN9IiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBwcmltYXJ5IGtleSBjb2x1bW4uCitiYWQtbmFtZTogWW91IG11c3Qgc3VwcGx5IGEgdmFsaWQgbmFtZSBmb3IgdGhpcyBzY2hlbWEgY29tcG9uZW50LgorZHVwLWNvbC1uYW1lOiBUaGUgbmFtZSAiezB9IiBpcyBhbHJlYWR5IHRha2VuIGJ5IGEgY29sdW1uIGluIHRoaXMgdGFibGUuCit0YWJsZS1taXNtYXRjaDogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGFkZCBhIGNvbHVtbiBmcm9tIHRhYmxlICJ7MH0iIHRvIGEgXAorCWNvbnN0cmFpbnQgb3IgaW5kZXggb24gdGFibGUgInsxfSIuCitmay1taXNtYXRjaDogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGxpbmsgdG8gYSBwcmltYXJ5IGtleSBjb2x1bW4gaW4gdGFibGUgXAorCSJ7MH0iIGluIGEgZm9yZWlnbiBrZXkgdGhhdCBpcyBhbHJlYWR5IGxpbmtlZCB0byBwcmltYXJ5IGtleSBjb2x1bW5zIGluIFwKKwl0YWJsZSAiezF9Ii4KK3Nlci1zY2hlbWE6IFdyaXRpbmcgc2NoZW1hICJ7MH0iLgordG9vbC1ub3JlcG9zOiBZb3UgY2Fubm90IHBlcmZvcm0gdGhpcyBhY3Rpb24gdW50aWwgeW91IHNldCB0aGUgc2NoZW1hIGdyb3VwIFwKKwl0byBhY3Qgb24uCit0b29sLXJ1bm5pbmc6IFNjaGVtYSB0b29sIHdpbGwgcnVuIG9uIHNjaGVtYSBmaWxlICJ7MH0iLgordG9vbC1pbXBvcnQtc3RvcmU6IFN0b3JpbmcgaW1wb3J0ZWQgc2NoZW1hIGRhdGEgaW4gc2NoZW1hIGZhY3RvcnkuCit0b29sLWV4cG9ydC1nZW46IEdhdGhlcmluZyBzY2hlbWEgaW5mb3JtYXRpb24gdG8gZXhwb3J0OyB0aGlzIHByb2Nlc3MgXAorCW1heSB0YWtlIHNvbWUgdGltZS4gIEVuYWJsZSB0aGUgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuU2NoZW1hIGxvZ2dpbmcgY2F0ZWdvcnkgdG8gc2VlIFwKKwltZXNzYWdlcyBhYm91dCB0aGUgY29sbGVjdGlvbiBvZiBzY2hlbWEgZGF0YS4KK3Rvb2wtYWN0aW9uOiBTY2hlbWEgdG9vbCBydW5uaW5nIGFjdGlvbiAiezB9Ii4gIFRoaXMgcHJvY2VzcyBtYXkgdGFrZSBzb21lIFwKKwl0aW1lLiAgRW5hYmxlIHRoZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5TY2hlbWEgbG9nZ2luZyBjYXRlZ29yeSB0byBzZWUgbWVzc2FnZXMgYWJvdXQgXAorCXRoZSBjb2xsZWN0aW9uIG9mIHNjaGVtYSBkYXRhLCBhbmQgdGhlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLlNRTCBjYXRlZ29yeSB0byBzZWUgXAorCWdlbmVyYXRlZCBTUUwgY29tbWFuZHMuCit0b29sLXJlY29yZDogUmVjb3JkaW5nIHNjaGVtYSBjaGFuZ2VzLgordG9vbC1leHBvcnQtd3JpdGU6IFdyaXRpbmcgc2NoZW1hIGRhdGEgdG8gWE1MLgordG9vbC11c2FnZTogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2xcblwKKwlcdFstcHJvcGVydGllcy8tcCA8cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstPHByb3BlcnR5IG5hbWU+IDxwcm9wZXJ0eSB2YWx1ZT5dKlxuXAorCVx0Wy1maWxlLy1mIDxzdGRvdXQgfCBvdXRwdXQgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLWlnbm9yZUVycm9ycy8taSA8dHJ1ZS90IHwgZmFsc2UvZj5dXG5cCisJXHRbLWRyb3BUYWJsZXMvLWR0IDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstb3BlbmpwYVRhYmxlcy8tb3QgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1kcm9wU2VxdWVuY2VzLy1kc3EgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1zZXF1ZW5jZXMvLXNxIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstcHJpbWFyeUtleXMvLXBrIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstZm9yZWlnbktleXMvLWZrIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstaW5kZXhlcy8taXggPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1yZWNvcmQvLXIgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy1hY3Rpb24vLWEgPGFkZCB8IHJldGFpbiB8IGRyb3AgfCByZWZyZXNoIHwgYnVpbGQgfCByZWZsZWN0XG5cCisJXHRcdHwgY3JlYXRlREIgfCBkcm9wREIgfCBpbXBvcnQgfCBleHBvcnQgfCBkZWxldGVUYWJsZUNvbnRlbnRzPl1cblwKKwlcdDwuc2NoZW1hIGZpbGUgb3IgcmVzb3VyY2U+Kgorc2NoLXJlZmxlY3Q6IFJlZmxlY3Rpbmcgb24gc2NoZW1hcyAiezB9Ii4gIFRoaXMgcHJvY2VzcyBtYXkgdGFrZSBzb21lIHRpbWUuICBcCisJRW5hYmxlIHRoZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5TY2hlbWEgbG9nZ2luZyBjYXRlZ29yeSB0byBzZWUgbWVzc2FnZXMgYWJvdXQgdGhlIFwKKwljb2xsZWN0aW9uIG9mIHNjaGVtYSBkYXRhLgorc2NoLXJlZmxlY3Qtd3JpdGU6IFdyaXRpbmcgWE1MIHJlcHJlc2VudGF0aW9uIG9mIHNjaGVtYS4KK2Ryb3AtaW5kZXg6IFRoZSBpbmRleCAiezB9IiB3YXMgbm90IGRyb3BwZWQgZnJvbSB0YWJsZSAiezF9Ii4KK2Ryb3AtZms6IFRoZSBmb3JlaWduIGtleSAiezB9IiB3YXMgbm90IGRyb3BwZWQgZnJvbSB0YWJsZSAiezF9Ii4KK2Ryb3AtcGs6IFRoZSBwcmltYXJ5IGtleSAiezB9IiB3YXMgbm90IGRyb3BwZWQgZnJvbSB0YWJsZSAiezF9Ii4KK2Ryb3AtY29sOiBUaGUgY29sdW1uICJ7MH0iIHdhcyBub3QgZHJvcHBlZCBmcm9tIHRhYmxlICJ7MX0iLgorZHJvcC10YWJsZTogVGhlIHRhYmxlICJ7MH0iIHdhcyBub3QgZHJvcHBlZC4KK2Ryb3Atc2VxOiBUaGUgc2VxdWVuY2UgInswfSIgd2FzIG5vdCBkcm9wcGVkLgorYWRkLWNvbDogVGhlIGNvbHVtbiAiezB9IiB3YXMgbm90IGFkZGVkIHRvIHRhYmxlICJ7MX0iLgorYWRkLWluZGV4OiBUaGUgaW5kZXggInswfSIgd2FzIG5vdCBjcmVhdGVkIG9uIHRhYmxlICJ7MX0iLgordG9vLW1hbnktaW5kZXhlczogVGhlIGluZGV4ICJ7MH0iIHdhcyBub3QgY3JlYXRlZCBvbiB0YWJsZSAiezF9Iiwgc2luY2UgaXQgXAorCXdvdWxkIGdvIGJleW9uZCB0aGUgbWF4aW11bSBpbmRleCBsaW1pdCBvZiB7Mn0uCithZGQtcGs6IFRoZSBwcmltYXJ5IGtleSAiezB9IiB3YXMgbm90IGFkZGVkIHRvIHRhYmxlICJ7MX0iLgorYWRkLWZrOiBUaGUgZm9yZWlnbiBrZXkgInswfSIgd2FzIG5vdCBhZGRlZCB0byB0YWJsZSAiezF9Ii4KK2FkZC10YWJsZTogVGhlIHRhYmxlICJ7MH0iIHdhcyBub3QgY3JlYXRlZC4KK2FkZC1zZXE6IFRoZSBzZXF1ZW5jZSAiezB9IiB3YXMgbm90IGFkZGVkIHRvIHRoZSBkYXRhYmFzZS4KK2JhZC1jb2w6IEV4aXN0aW5nIGNvbHVtbiAiezB9IiBvbiB0YWJsZSAiezF9IiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgXAorCXNhbWUgY29sdW1uIGluIHRoZSBnaXZlbiBzY2hlbWEgZGVmaW5pdGlvbi4gRXhpc3RpbmcgY29sdW1uOlxuezJ9XAorCUdpdmVuIGNvbHVtbjpcbnszfQorYmFkLXBrOiBFeGlzdGluZyBwcmltYXJ5IGtleSAiezB9IiBvbiB0YWJsZSAiezF9IiBpcyBpbmNvbXBhdGlibGUgd2l0aCBcCisJdGhlIHNhbWUgcHJpbWFyeSBrZXkgaW4gdGhlIGdpdmVuIHNjaGVtYSBkZWZpbml0aW9uLgorYmFkLWluZGV4OiBFeGlzdGluZyBpbmRleCAiezB9IiBvbiB0YWJsZSAiezF9IiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgXAorCXNhbWUgaW5kZXggaW4gdGhlIGdpdmVuIHNjaGVtYSBkZWZpbml0aW9uLgorYmFkLWZrOiBFeGlzdGluZyBmb3JlaWduIGtleSAiezB9IiBvbiB0YWJsZSAiezF9IiBpcyBpbmNvbXBhdGlibGUgd2l0aCBcCisJdGhlIHNhbWUgZm9yZWlnbiBrZXkgaW4gdGhlIGdpdmVuIHNjaGVtYSBkZWZpbml0aW9uLgorYmFkLWZrLWFjdGlvbi1oaW50OiAiezF9IiBpcyBub3QgYSByZWNvZ25pemVkIGZvcmVpZ24ga2V5IGFjdGlvbiwgdGhvdWdoIGl0IFwKKwljbG9zZWx5IHJlc2VtYmxlcyB0aGUgc3RhbmRhcmQgYWN0aW9uICJ7Mn0iLiBBdmFpbGFibGUgYWN0aW9ucyBhcmU6IHszfQorYmFkLWZrLWFjdGlvbjogInsxfSIgaXMgbm90IGEgcmVjb2duaXplZCBmb3JlaWduIGtleSBhY3Rpb24uICBBdmFpbGFibGUgXAorCWFjdGlvbnMgYXJlOiB7Mn0KK2dlbi1wazogRm91bmQgZXhpc3RpbmcgcHJpbWFyeSBrZXkgInswfSIgb24gdGFibGUgInsxfSAoezJ9KSIuCitnZW4taW5kZXg6IEZvdW5kIGV4aXN0aW5nIGluZGV4ICJ7MH0iIG9uIHRhYmxlICJ7MX0gKHsyfSkiLgorZ2VuLWZrOiBGb3VuZCBleGlzdGluZyBmb3JlaWduIGtleSAiezB9IiBvbiB0YWJsZSAiezF9ICh7Mn0pIiBsaW5raW5nIHRvIFwKKwl0YWJsZSAiezN9ICh7NH0pIi4gIFNlcXVlbmNlOiAiezV9Ii4KK2dlbi1ub2ZrdGFibGU6IFRhYmxlICJ7MH0iIGhhcyBhIGZvcmVpZ24ga2V5IHRvIHRhYmxlICJ7MX0iIHRoYXQgaGFzIG5vdCBiZWVuIFwKKwlnZW5lcmF0ZWQuICBZb3UgbXVzdCBydW4gdGhlIHNjaGVtYSBnZW5lcmF0b3Igb24gYWxsIGludGVyLXJlbGF0ZWQgdGFibGVzIFwKKwlhdCBvbmNlLgorZ2VuLXRhYmxlczogUmVhZGluZyB0YWJsZSBpbmZvcm1hdGlvbiBmb3Igc2NoZW1hIG5hbWUgInswfSIsIHRhYmxlIG5hbWUgInsxfSIuCitnZW4tcGtzOiBSZWFkaW5nIHByaW1hcnkga2V5cyBmb3Igc2NoZW1hIG5hbWUgInswfSIsIHRhYmxlIG5hbWUgInsxfSIuCitnZW4taW5kZXhlczogUmVhZGluZyBpbmRleGVzIGZvciBzY2hlbWEgbmFtZSAiezB9IiwgdGFibGUgbmFtZSAiezF9Ii4KK2dlbi1ma3M6IFJlYWRpbmcgZm9yZWlnbiBrZXlzIGZvciBzY2hlbWEgbmFtZSAiezB9IiwgdGFibGUgbmFtZSAiezF9Ii4KK2NvbC10YWJsZTogUmVhZGluZyBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRhYmxlICJ7MH0iLgorZ2VuLWNvbHVtbjogRm91bmQgZXhpc3RpbmcgY29sdW1uICJ7MH0iIG9uIHRhYmxlICJ7MX0iLgorZ2VuLXNlcXM6IFJlYWRpbmcgc2VxdWVuY2UgaW5mb3JtYXRpb24gZm9yIHNjaGVtYSAiezB9Iiwgc2VxdWVuY2UgbmFtZSAiezF9Ii4KK25vLWlkeC1tZXRhOiBVbmFibGUgdG8gZ2V0IGluZGV4IG1ldGFkYXRhIGZvciB0YWJsZSAiezB9IjogezF9CittYWtlLXNjaC10YWJsZTogQ3JlYXRpbmcgdGFibGUgdG8gaG9sZCBzY2hlbWEgaW5mb3JtYXRpb24uCitkcm9wLXNjaC10YWJsZTogRHJvcHBpbmcgc2NoZW1hIHRhYmxlLgorc2NoLXVzYWdlOiBVc2FnZTogamF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGVTY2hlbWFGYWN0b3J5XG5cCisJXHRbLXByb3BlcnRpZXMgPHByb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLTxwcm9wZXJ0eSBuYW1lPiA8cHJvcGVydHkgdmFsdWU+XVxuXAorCVx0LWFjdGlvbi8tYSA8YWRkIHwgZHJvcD4KK3JlZnJlc2gtY2FuY2VsbGVkOiBSZWZyZXNoIG9wZXJhdGlvbiBjYW5jZWxsZWQuCitnZW5lcmF0aW5nLXNjaGVtYXM6IFJlYWRpbmcgc2NoZW1hcworZ2VuZXJhdGluZy1zY2hlbWE6IFJlYWRpbmcgc2NoZW1hICJ7MH0iCitnZW5lcmF0aW5nLWFsbC1wcmltYXJpZXM6IFJlYWRpbmcgcHJpbWFyeSBrZXlzIGZvciBzY2hlbWEgInswfSIKK2dlbmVyYXRpbmctYWxsLWluZGV4ZXM6IFJlYWRpbmcgaW5kZXhlcyBmb3Igc2NoZW1hICJ7MH0iCitnZW5lcmF0aW5nLWFsbC1mb3JlaWduczogUmVhZGluZyBmb3JlaWduIGtleXMgZm9yIHNjaGVtYSAiezB9IgorZ2VuZXJhdGluZy1jb2x1bW5zOiBSZWFkaW5nIGNvbHVtbnMgZm9yIHRhYmxlICJ7MX0iCitnZW5lcmF0aW5nLXByaW1hcnk6IFJlYWRpbmcgcHJpbWFyeSBrZXlzIGZvciB0YWJsZSAiezF9IgorZ2VuZXJhdGluZy1pbmRleGVzOiBSZWFkaW5nIGluZGV4ZXMgZm9yIHRhYmxlICJ7MX0iCitnZW5lcmF0aW5nLWZvcmVpZ246IFJlYWRpbmcgZm9yZWlnbiBrZXlzIGZvciB0YWJsZSAiezF9IgorZ2VuZXJhdGluZy1zZXF1ZW5jZXM6IFJlYWRpbmcgc2VxdWVuY2VzIGZvciBzY2hlbWEgInswfSIKK25vLWN1c3RvbS1kczogdXNlIGEgY3VzdG9tIERhdGFTb3VyY2UKK2RlbGV0ZS10YWJsZS1jb250ZW50czogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBkZWxldGUgYWxsIFwKKyAgICByZWNvcmRzIGZyb20gYWxsIG1hcHBlZCB0YWJsZXMuCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL3NjaGVtYXMtZG9jdHlwZS5yc3JjIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9zY2hlbWFzLWRvY3R5cGUucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRkMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9zY2hlbWFzLWRvY3R5cGUucnNyYwpAQCAtMCwwICsxLDQ3IEBACis8IURPQ1RZUEUgc2NoZW1hcyBbCisJPCFFTEVNRU5UIHNjaGVtYXMgKHNjaGVtYSkqPgorCTwhRUxFTUVOVCBzY2hlbWEgKHRhYmxlfHNlcXVlbmNlKSo+CisJPCFBVFRMSVNUIHNjaGVtYSBuYW1lIENEQVRBICNJTVBMSUVEPgorCTwhRUxFTUVOVCB0YWJsZSAoY29sdW1ufGluZGV4fHBrfGZrfHVuaXF1ZSkrPgorCTwhQVRUTElTVCB0YWJsZSBuYW1lIENEQVRBICNSRVFVSVJFRD4KKwk8IUVMRU1FTlQgY29sdW1uIEVNUFRZPgorCTwhQVRUTElTVCBjb2x1bW4gbmFtZSBDREFUQSAjUkVRVUlSRUQ+IAorIAk8IUFUVExJU1QgY29sdW1uIHR5cGUgKGFycmF5fGJpZ2ludHxiaW5hcnl8Yml0fGJsb2J8Y2hhcnxjbG9ifGRhdGV8ZGVjaW1hbHxkaXN0aW5jdHxkb3VibGV8ZmxvYXR8aW50ZWdlcnxqYXZhX29iamVjdHxsb25ndmFyYmluYXJ5fGxvbmd2YXJjaGFyfG51bGx8bnVtZXJpY3xvdGhlcnxyZWFsfHJlZnxzbWFsbGludHxzdHJ1Y3R8dGltZXx0aW1lc3RhbXB8dGlueWludHx2YXJiaW5hcnl8dmFyY2hhcikgI1JFUVVJUkVEPgorCTwhQVRUTElTVCBjb2x1bW4gdHlwZS1uYW1lIENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCBjb2x1bW4gbm90LW51bGwgKHRydWV8ZmFsc2UpICNJTVBMSUVEPgorCTwhQVRUTElTVCBjb2x1bW4gYXV0by1hc3NpZ24gKHRydWV8ZmFsc2UpICNJTVBMSUVEPgorCTwhQVRUTElTVCBjb2x1bW4gYXV0by1pbmNyZW1lbnQgKHRydWV8ZmFsc2UpICNJTVBMSUVEPiA8IS0tIGRlcHJlY2F0ZWQgLS0+CisJPCFBVFRMSVNUIGNvbHVtbiBkZWZhdWx0IENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCBjb2x1bW4gc2l6ZSBDREFUQSAjSU1QTElFRD4KKwk8IUFUVExJU1QgY29sdW1uIGRlY2ltYWwtZGlnaXRzIENEQVRBICNJTVBMSUVEPgorCTwhRUxFTUVOVCBpbmRleCAob24pKj4KKwk8IUFUVExJU1QgaW5kZXggbmFtZSBDREFUQSAjUkVRVUlSRUQ+CisJPCFBVFRMSVNUIGluZGV4IGNvbHVtbiBDREFUQSAjSU1QTElFRD4KKwk8IUFUVExJU1QgaW5kZXggdW5pcXVlICh0cnVlfGZhbHNlKSAjSU1QTElFRD4KKwk8IUVMRU1FTlQgcGsgKG9uKSo+CisJPCFBVFRMSVNUIHBrIG5hbWUgQ0RBVEEgI0lNUExJRUQ+CisJPCFBVFRMSVNUIHBrIGxvZ2ljYWwgKHRydWV8ZmFsc2UpICNJTVBMSUVEPgorCTwhQVRUTElTVCBwayBjb2x1bW4gQ0RBVEEgI0lNUExJRUQ+CisJPCFFTEVNRU5UIG9uIEVNUFRZPgorCTwhQVRUTElTVCBvbiBjb2x1bW4gQ0RBVEEgI1JFUVVJUkVEPgorCTwhRUxFTUVOVCBmayAoam9pbikqPgorCTwhQVRUTElTVCBmayBuYW1lIENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCBmayBkZWZlcnJlZCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQ+CisJPCFBVFRMSVNUIGZrIHRvLXRhYmxlIENEQVRBICNSRVFVSVJFRD4KKwk8IUFUVExJU1QgZmsgY29sdW1uIENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCBmayBkZWxldGUtYWN0aW9uIChjYXNjYWRlfGRlZmF1bHR8cmVzdHJpY3R8ZXhjZXB0aW9ufG5vbmV8bnVsbCkgI0lNUExJRUQ+CisJPCFBVFRMSVNUIGZrIHVwZGF0ZS1hY3Rpb24gKGNhc2NhZGV8ZGVmYXVsdHxyZXN0cmljdHxleGNlcHRpb258bm9uZXxudWxsKSAjSU1QTElFRD4KKwk8IUVMRU1FTlQgam9pbiBFTVBUWT4KKwk8IUFUVExJU1Qgam9pbiBjb2x1bW4gQ0RBVEEgI0lNUExJRUQ+CisJPCFBVFRMSVNUIGpvaW4gdG8tY29sdW1uIENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCBqb2luIHZhbHVlIENEQVRBICNJTVBMSUVEPgorCTwhRUxFTUVOVCB1bmlxdWUgKG9uKSo+CisJPCFBVFRMSVNUIHVuaXF1ZSBuYW1lIENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCB1bmlxdWUgY29sdW1uIENEQVRBICNJTVBMSUVEPgorCTwhQVRUTElTVCB1bmlxdWUgZGVmZXJyZWQgKHRydWV8ZmFsc2UpICNJTVBMSUVEPgorCTwhRUxFTUVOVCBzZXF1ZW5jZSBFTVBUWT4KKwk8IUFUVExJU1Qgc2VxdWVuY2UgbmFtZSBDREFUQSAjUkVRVUlSRUQ+CisJPCFBVFRMSVNUIHNlcXVlbmNlIGluaXRpYWwtdmFsdWUgQ0RBVEEgI0lNUExJRUQ+CisJPCFBVFRMSVNUIHNlcXVlbmNlIGluY3JlbWVudCBDREFUQSAjSU1QTElFRD4KKwk8IUFUVExJU1Qgc2VxdWVuY2UgYWxsb2NhdGUgQ0RBVEEgI0lNUExJRUQ+CitdPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNjQ5NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNjkgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKwordW5pb24tc3FsLXBsYWNlaG9sZGVyOiBBYm9ydGluZyBVTklPTjogY2Fubm90IHNlbGVjdCBwbGFjZWhvbGRlciBmb3IgXAorCW5vbi1jb2x1bW4gc2VsZWN0IFNRTC4KK3VuaW9uLW51bWJlci1vcmRlcmluZzogQWJvcnRpbmcgVU5JT046IGRpZmZlcmVudCBudW1iZXJzIG9mIG9yZGVyLWJ5IGNyaXRlcmlhIFwKKwlpbiBzZWxlY3RzLgordW5pb24taW5jb21wYXQtb3JkZXJpbmc6IEFib3J0aW5nIFVOSU9OOiBpbmNvbXBhdGlibGUgb3JkZXJpbmcgY29sdW1ucy9zcWwgb3IgXAorCWRpcmVjdGlvbi4KK3VuaW9uLXVuYWxpZ25lZC1vcmRlcmluZzogQWJvcnRpbmcgVU5JT046IHlvdXIgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBcCisJb3JkZXJpbmcgY29sdW1ucy9zcWwgdGhhdCBhcHBlYXIgYXQgZGlmZmVyZW50IHBvc2l0aW9ucyBpbiB0aGUgU0VMRUNUcyBcCisJdGhhdCBtYWtlIHVwIHRoZSBVTklPTi4KK3VuaW9uLWVsZW1lbnQ6IEluZGl2aWR1YWwgc2VsZWN0cyBpbnZvbHZlZCBpbiBhIFVOSU9OIGRvIG5vdCBzdXBwb3J0IHRoaXMgXAorCW9wZXJhdGlvbi4KK2luY29tcGF0LW9yZGVyaW5nOiBUaGlzIHF1ZXJ5IGNhbm5vdCBiZSBjb21wbGV0ZWQuICBUaGUgU1FMIFNFTEVDVHMgbmVlZGVkIFwKKwl0byBjb21wbGV0ZSB0aGUgcXVlcnkgaGF2ZSBpbmNvbXBhdGlibGUgb3JkZXJpbmcuICBUaGVpciByZXN1bHRzIGNhbm5vdCBcCisJYmUgbWVyZ2VkLgordW5wYWRkZWQtY2hhci1jb2xzOiBZb3UgYXJlIHVzaW5nIENIQVIgY29sdW1ucyB3aXRoIGEgZGF0YSBzb3VyY2Ugb3IgZHJpdmVyIFwKKwl0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IE9yYWNsZVByZXBhcmVkU3RhdGVtZW50LnNldEZpeGVkQ0hBUigpLiBcCisJQ29tcGFyaXNvbnMgb24gdW5wYWRkZWQgc3RyaW5nIHZhbHVlcyBtYXkgZmFpbC4KK3VuY29uZmlndXJlZC1uY2hhci1jb2xzOiBZb3UgYXJlIHVzaW5nIE5DSEFSIG9yIE5DTE9CIGNvbHVtbnMgd2l0aCBhIFwKKwlkYXRhIHNvdXJjZSBvciBkcml2ZXIgXAorCXRoYXQgZG9lc24ndCBpbXBsZW1lbnQgT3JhY2xlUHJlcGFyZWRTdGF0ZW1lbnQuc2V0Rm9ybU9mVXNlKCkuIFwKKwlTdG9yaW5nIHVuaWNvZGUgdmFsdWVzIG1heSBmYWlsIG9yIGJlIGNvcnJ1cHRlZC4KK2RpZmYtdmFsdWVzOiBBdHRlbXB0IHRvIHNldCBjb2x1bW4gInswfSIgdG8gdHdvIGRpZmZlcmVudCB2YWx1ZXM6IFwKKwkoezF9KSJ7Mn0iLCAoezN9KSJ7NH0iIFwKKwlUaGlzIGNhbiBvY2N1ciB3aGVuIHlvdSBmYWlsIHRvIHNldCBib3RoIHNpZGVzIG9mIGEgdHdvLXNpZGVkIHJlbGF0aW9uIFwKKwliZXR3ZWVuIG9iamVjdHMsIG9yIHdoZW4geW91IG1hcCBkaWZmZXJlbnQgZmllbGRzIHRvIHRoZSBzYW1lIGNvbHVtbiwgYnV0IFwKKwl5b3UgZG8gbm90IGtlZXAgdGhlIHZhbHVlcyBvZiB0aGVzZSBmaWVsZHMgaW4gc3luY2guCitmZWF0dXJlLW5vdC1zdXBwb3J0ZWQ6IFRoZSBkYXRhYmFzZSBkaWN0aW9uYXJ5IGluIHVzZSAoInswfSIpIHJlcG9ydHMgdGhhdCBpdCBcCisJZG9lcyBub3QgaGF2ZSBmZWF0dXJlICJ7MX0iLiAgVGhpcyBmZWF0dXJlIGlzIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgXAorCWN1cnJlbnQgb3BlcmF0aW9uLiAgVG8gZm9yY2UgT3BlbkpQQSB0byB0cnkgdG8gdXNlIHRoZSBmZWF0dXJlIGFueXdheSwgc2V0IFwKKwl0aGUgZm9sbG93aW5nIHByb3BlcnR5OlxuXAorCW9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnk6IHsxfT08dmFsdWU+CitjYW50LW91dGVyLWZrOiBDb3VsZCBub3Qgb3V0ZXIgam9pbiB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgInswfSIgZHVlIHRvIHN5bnRheCBcCisJYW5kIGZvcmVpZ24ga2V5IGxpbWl0YXRpb25zLiAgVGhlIGpvaW4gd2FzIGNvbnZlcnRlZCB0byBhbiBpbm5lciBqb2luLgorbm8tYXV0by1hc3NpZ246IFRoaXMgZGF0YWJhc2UgZGljdGlvbmFyeSBkb2VzIG5vdCBzdXBwb3J0IGF1dG8tYXNzaWduZWQgY29sdW1uIFwKKwl2YWx1ZXMuCitiYWQtam9pbjogVGhlIGZvbGxvd2luZyBlcnJvciB3YXMgZGV0ZWN0ZWQgd2hlbiBjcmVhdGluZyBhIGZvcmVpZ24ga2V5OiBcCisJInswfSIuICBUaGUgZm9yZWlnbiBrZXkgaXMgYmVpbmcgaWdub3JlZC4KK3N5YmFzZS1jb21wbGlhbmNlOiBUaGV5IFN5YmFzZSBjb25uZWN0aW9uIFVSTCAiezB9IiBtYXkgYmUgaW52YWxpZDogXAorCWl0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHBhcmFtZXRlciAiQkVfQVNfSkRCQ19DT01QTElBTlRfQVNfUE9TU0lCTEU9dHJ1ZSIsIFwKKwl3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIFN5YmFzZSBKQ29ubmVjdCBkcml2ZXIgdG8gYmVoYXZlIGluIGEgXAorCUpEQkMtY29tcGxpYW50IHdheS4KK3NxbHNlcnZlci1jYWNoZWRzdG1udHM6IFRoZSBNaWNyb3NvZnQgSkRCQyBkcml2ZXIgaGFzIGJ1Z3MgdGhhdCBtYW5pZmVzdCBcCisJdGhlbXNlbHZlcyB3aGVuIHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIHBvb2xlZC4gIFBsZWFzZSBkaXNhYmxlIHByZXBhcmVkIFwKKwlzdGF0ZW1lbnQgcG9vbGluZyB3aGVuIHVzaW5nIHRoZSBNaWNyb3NvZnQgSkRCQyBkcml2ZXIgYnkgaW5jbHVkaW5nIFwKKwkiTWF4Q2FjaGVkU3RhdGVtZW50cz0wIiBpbiB5b3VyIG9yZy5hcGFjaGUub3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMgXAorCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCitzcWxzZXJ2ZXItbmV0ZGlyZWN0LWJhdGNoOiBUaGUgSk5ldERpcmVjdCBKREJDIGRyaXZlciBoYXMgcHJvYmxlbXMgd2hlbiB1c2luZyBcCisJYmF0Y2ggc3RhdGVtZW50cy4gUGxlYXNlIGRpc2FibGUgcHJlcGFyZWQgXAorCXN0YXRlbWVudCBwb29saW5nIHdoZW4gdXNpbmcgdGhlIHRoaXMgSkRCQyBkcml2ZXIgYnkgaW5jbHVkaW5nIFwKKwkiQmF0Y2hMaW1pdD0wIiBpbiB5b3VyIG9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkgXAorCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCitzcWxzZXJ2ZXItY3Vyc29yOiBUaGUgU1FMU2VydmVyIGNvbm5lY3Rpb24gVVJMICJ7MH0iIG1heSBiZSBpbnZhbGlkOiBcCisJaXQgZG9lcyBub3QgY29udGFpbiB0aGUgcGFyYW1ldGVyICJTZWxlY3RNZXRob2Q9Y3Vyc29yIiwgd2hpY2ggaXMgXAorCW5lY2Vzc2FyeSBmb3IgdGhlIGRyaXZlciB0byBwcm9wZXJseSBzdXBwb3J0IGxhcmdlIHJlc3VsdCBzZXRzLgorb3JhY2xlLXN5bnRheDogT3JhY2xlIDggZG9lcyBub3Qgc3VwcG9ydCBTUUw5MiBzeW50YXguICBZb3UgY2FuIGF2b2lkIFwKKwl0aGlzIG1lc3NhZ2UgYnkgc2V0dGluZyB0aGUgIkpvaW5TeW50YXgiIERCRGljdGlvbmFyeSBwcm9wZXJ0eSBcCisJdG8gImRhdGFiYXNlIi5cCisJRm9yIGV4YW1wbGU6XG5cCisJb3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeTogb3JhY2xlKEpvaW5TeW50YXg9ZGF0YWJhc2UpCitvcmFjbGUtYmF0Y2gtbG9iOiBMT0Igb3BlcmF0aW9ucyBub3QgYWxsb3dlZCBmb3IgYmF0Y2hlZCBzdGF0ZW1lbnQ6IHswfQorb3JhY2xlLWJhdGNoLWJ1ZzogVGhlIE9yYWNsZSA5LjIgSkRCQyBkcml2ZXIgaGFzIHByb2JsZW1zIHdpdGggXAorCWJhdGNoIHN0YXRlbWVudHMgYW5kIGhhcyBiZWVuIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBZb3UgY2FuIFwKKwllbmFibGUgYmF0Y2hlZCBzdGF0ZW1lbnRzIGJ5IHNldHRpbmcgdGhlICJCYXRjaExpbWl0IiBEQkRpY3Rpb25hcnkgXAorCXByb3BlcnR5LiAgWW91IG1heSBiZSBhYmxlIHRvIGJ5cGFzcyB0aGlzIHByb2JsZW0gYnkgZGlzYWJsaW5nIFwKKwlwcmVwYXJlZCBzdGF0ZW1lbnQgcG9vbGluZy4gVGhlIGNvbXBhdGlibGUgOS4wLjEgZHJpdmVyIGRvZXMgbm90IFwKKwloYXZlIHRoaXMgYmVoYXZpb3IuCitvcmFjbGUtYmF0Y2gtb3ZlcnJpZGU6IFRoZSBCYXRjaExpbWl0IHByb3BlcnR5IHdhcyBzZXQgZXZlbiB0aG91Z2ggXAorCXRoZSBPcmFjbGUgOS4yIGRyaXZlciBtYXkgbm90IHN1cHBvcnQgdGhpcyBiZWhhdmlvciBjb3JyZWN0bHkuIFwKKwlJZiB5b3Ugc2VlIGEgbnVtYmVyIG9mIGludmFsaWQgdXBkYXRlIGNvdW50IGVycm9ycywgeW91IHNob3VsZCBcCisJZGlzYWJsZSBzdGF0ZW1lbnQgYmF0Y2hpbmcgYnkgc2V0dGluZyB0aGUgQmF0Y2hMaW1pdCBwcm9wZXJ0eSB0byAwLgorb3JhY2xlLWNvbm5lY3RpbmctZm9yLWRyaXZlcjogT3BlbkpQQSBpcyBub3cgY29ubmVjdGluZyB0byB0aGUgZGF0YWJhc2UgaW4gb3JkZXIgXAorCXRvIGZpZ3VyZSBvdXQgd2hhdCBKREJDIGRyaXZlciB5b3UgYXJlIHVzaW5nLCBhcyBPcGVuSlBBIG11c3QgYWx0ZXIgaXRzIFwKKwliZWhhdmlvciBmb3IgdGhpcyBkYXRhYmFzZSBkZXBlbmRpbmcgb24gdGhlIGRyaXZlciB2ZW5kb3IuICBUbyBhdm9pZCB0aGlzIFwKKwljb25uZWN0aW9uLCBzZXQgdGhlIERyaXZlclZlbmRvciB2YWx1ZSBpbiB5b3VyIG9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkgXAorCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuXAorCW9yYWNsZSwgb3JhY2xlOTIgKGZvciB0aGUgOS4yIGRyaXZlciksIGRhdGFkaXJlY3QsIGRhdGFkaXJlY3Q2MSBcCisJKGZvciBkcml2ZXIgdmVyc2lvbnMgPD0gMy4xKSwgb3RoZXIgXG5cCisJRm9yIGV4YW1wbGU6XG5cCisJb3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeTogb3JhY2xlKERyaXZlclZlbmRvcj1vcmFjbGU5MikKK29yYWNsZS1jb25zdGFudDogQ2Fubm90IG91dGVyIGpvaW4gdGFibGVzICJ7MH0iIGFuZCAiezF9IiB1c2luZyBuYXRpdmUgXAorCWpvaW4gc3ludGF4IGFuZCBjb25zdGFudCBqb2lucy4gIElmIHlvdSBhcmUgdXNpbmcgT3JhY2xlIDkgb3IgaGlnaGVyLCBcCisJeW91IHNob3VsZCBpbnN0ZWFkIHVzZSBTUUw5MiBqb2lucyBieSBzcGVjaWZ5aW5nIHRoZSBKb2luU3ludGF4IFwKKwl2YWx1ZSBpbiB0aGUgb3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeSBjb25maWd1cmF0aW9uIHByb3BlcnR5OlxuXAorCW9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnk6IG9yYWNsZShKb2luU3ludGF4PXNxbDkyKS4KK29yYWNsZS1zYXZlcG9pbnQ6IEFuIGVycm9yIG9jY3VycmVkIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgYW4gT3JhY2xlIFwKKwlzYXZlcG9pbnQgInswfSIuICBZb3UgbXVzdCB1c2UgT3JhY2xlIGRyaXZlciBhbmQgZGF0YWJhc2UgOS4yIG9yIGhpZ2hlci4KK29yYWNsZS1yb2xsYmFjazogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHJvbGxiYWNrIHRvIGFuIE9yYWNsZSBcCisJc2F2ZXBvaW50ICJ7MH0iLiAgWW91IG11c3QgdXNlIE9yYWNsZSBkcml2ZXIgYW5kIGRhdGFiYXNlIDkuMiBvciBoaWdoZXIuCitvcmFjbGUtdW5rbm93bi1zdnB0OiBDb3VsZCBub3QgZmluZCBhbiBPcmFjbGVDb25uZWN0aW9uIGluc3RhbmNlIGZyb20gdGhpcyBcCisJY29ubmVjdGlvbiBjbGFzcyAiezB9Ii4KK2RiMi1jYW50LWxvY2s6IERCMiBjYW5ub3QgcGVyZm9ybSBGT1IgVVBEQVRFIHNlbGVjdHMgb24gbXVsdGlwbGUgdGFibGVzLiBcCisJVGhlIHRhYmxlcyB1c2VkIGluIHRoaXMgc2VsZWN0IGFyZTogInswfSIuICBZb3Ugc2hvdWxkIGVpdGhlciBjb25maWd1cmUgXAorCXlvdXIgYXBwbGljYXRpb24gdG8gYXZvaWQgbXVsdGktdGFibGUgc2VsZWN0cywgdXNlIG9wdGltaXN0aWMgbG9ja2luZywgXAorCW9yIHNldCB0aGUgIlNpbXVsYXRlTG9ja2luZyIgREJEaWN0aW9uYXJ5IHByb3BlcnR5IHRvIGFsbG93IG5vbi1sb2NraW5nIFwKKwlzZWxlY3RzIHdpdGhpbiBwZXNzaW1pc3RpYyB0cmFuc2FjdGlvbnMuCitpbmZvcm1peC1jYW50LWxvY2s6IEluZm9ybWl4IGNhbm5vdCBwZXJmb3JtIEZPUiBVUERBVEUgc2VsZWN0cyBvbiBtdWx0aXBsZSBcCisJdGFibGVzLCBvciB3aGVuIGl0IGlzIGEgU0VMRUNUIERJU1RJTkNULiAgVGhlIHRhYmxlcyB1c2VkIGluIHRoaXMgc2VsZWN0IFwKKwlhcmU6ICJ7MH0iLiAgWW91IHNob3VsZCBlaXRoZXIgY29uZmlndXJlIHlvdXIgYXBwbGljYXRpb24gdG8gYXZvaWQgXAorCW11bHRpLXRhYmxlL2Rpc3RpbmN0IHNlbGVjdHMsIHVzZSBvcHRpbWlzdGljIGxvY2tpbmcsIG9yIHNldCB0aGUgXAorCSJTaW11bGF0ZUxvY2tpbmciIERCRGljdGlvbmFyeSBwcm9wZXJ0eSB0byBhbGxvdyBub24tbG9ja2luZyBzZWxlY3RzIFwKKwl3aXRoaW4gcGVzc2ltaXN0aWMgdHJhbnNhY3Rpb25zLgorYmFkLXBhcmFtOiBUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBvZiB0eXBlICJ7MH0iIGlzIG5vdCBhIHZhbGlkIHF1ZXJ5IHBhcmFtZXRlci4KK3dhcm4tZ2VuZXJpYzogWW91ciBkYXRhYmFzZSBjb25maWd1cmF0aW9uIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIHN1cHBvcnRlZCBcCisJT3BlbkpQQSBkYXRhYmFzZS4gVGhlIGdlbmVyaWMgZGljdGlvbmFyeSB3aWxsIGJlIHVzZWQsIHdoaWNoIG1heSByZXN1bHQgaW4gXAorCWxpbWl0ZWQgZnVuY3Rpb25hbGl0eS4gVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nIHRoZSBcCisJYXBwcm9wcmlhdGUgZGljdGlvbmFyeSBjbGFzcyBpbiB0aGUgIm9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkiIFwKKwlwcm9wZXJ0eSBvZiB0aGUgT3BlbkpQQSBjb25maWd1cmF0aW9uLgordXNpbmctZGljdDogVXNpbmcgZGljdGlvbmFyeSBjbGFzcyAiezB9InsxfS4KK25vLXBlc3NpbWlzdGljOiBUaGlzIGRpY3Rpb25hcnkgKHswfSkgZG9lcyBub3Qgc3VwcG9ydCBsb2NraW5nLCBzbyBcCisJb3BlcmF0aW9ucyBtYXkgbm90IGJlIHBlcmZvcm1lZCB1c2luZyBhIEJyb2tlciB0aGF0IGRvZXMgbm90IGhhdmUgXAorCW9wdGltaXN0aWMgbG9ja2luZyBlbmFibGVkLgorbm8tZmstdGFibGU6IEZvcmVpZ24ga2V5ICJ7MH0iIG9uIHRhYmxlICJ7MX0iIHJlZmVyZW5jZXMgYSB0YWJsZSBcCisJKCJ7Mn0iKSB0aGF0IHdhcyBub3QgZm91bmQuCitkZC1sb2NrLWJ1ZzogVGhpcyB2ZXJzaW9uIG9mIHRoZSBEYXRhRGlyZWN0IEpEQkMgZHJpdmVyIGhhcyBhIGJ1ZyB0aGF0IFwKKwlwcmV2ZW50cyBTRUxFQ1QgRk9SIFVQREFURSBzdGF0ZW1lbnRzIGZyb20gd29ya2luZy4gIFBsZWFzZSBcCisJdXNlIHZlcnNpb24gMy4yIG9yIGhpZ2hlciBvZiB0aGUgZHJpdmVyLgorc3RvcmFnZS1yZXN0cmljdGlvbjogVGhlIGRhdGFiYXNlICJ7MH0iIGhhcyByZXN0cmljdGlvbnMgdGhhdCBwcmV2ZW50IGl0IFwKKwlmcm9tIGJlaW5nIGFibGUgdG8gc3RvcmUgdGhlIHZhbHVlICJ7MX0iIG9mIHR5cGUgInsyfSIuIFRoZSB2YWx1ZSBcCisJd2lsbCBiZSByb3VuZGVkIHRvICJ7M30iIGZvciBzdG9yYWdlLgorZGljdC1ub3Qtc3VwcG9ydGVkOiBUaGlzIGRhdGFiYXNlIGRpY3Rpb25hcnkgInswfSIgaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIFwKKwlieSBCRUEuCitpbnZhbGlkLWF1dG9hc3NpZ246IFRoaXMgZGF0YWJhc2UgZGljdGlvbmFyeSAiezB9IiBkb2VzIG5vdCBzdXBwb3J0IFwKKwlhdXRvLWFzc2lnbmVkIGNvbHVtbiB2YWx1ZXMuICBUaGUgY29sdW1uICJ7MX0iIG1heSBub3QgYmVoYXZlIGFzIGRlc2lyZWQuCitwc3FsLW5vLXNldC1mZXRjaC1zaXplOglUaGlzIHZlcnNpb24gb2YgdGhlIFBvc3RncmVTUUwgSkRCQyBkcml2ZXIgZG9lcyBub3QgXAorCXN1cHBvcnQgdGhlIFN0YXRlbWVudC5zZXRGZXRjaFNpemUoKSBtZXRob2QuIE9wZW5KUEEgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCBcCisJdG8gc2V0IHRoZSBzdGF0ZW1lbnQgZmV0Y2ggc2l6ZS4gVG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nLCBlbnN1cmUgdGhhdCBcCisJdGhlIG9yZy5hcGFjaGUub3BlbmpwYS5GZXRjaEJhdGNoU2l6ZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIHNldCB0byB6ZXJvLiBUaGUgXAorCW9yaWdpbmFsIFBvc3RncmVTUUwgZHJpdmVyIGV4Y2VwdGlvbiBpcyBiZWluZyBsb2dnZWQgZm9yIHlvdXIgcmVmZXJlbmNlLgorbm8tZ2Vua2V5OiBUaGUgbGFzdCBnZW5lcmF0ZWQga2V5IHF1ZXJ5IGRpZCBub3QgcmV0dXJuIGFueSByZXN1bHRzLgoraW52YWxpZC1nZW5rZXk6IFRoZSBjb2x1bW4gInswfSIgd2FzIG1hcmtlZCBhcyBiZWluZyBhdXRvLWFzc2lnbmVkLCBidXQgXAorCXRoZSBzZXJ2ZXIgcmVwb3J0ZWQgdGhhdCB0aGUgYXNzaWduZWQgdmFsdWUgd2FzIG51bGwuCitpbmRleG9mLW5vdC1zdXBwb3J0ZWQ6IFRoZSBkYXRhYmFzZSAiezB9IiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcCisJaW5kZXhPZiBmdW5jdGlvbi4KK3N1YnN0cmluZy1ub3Qtc3VwcG9ydGVkOiBUaGUgZGF0YWJhc2UgInswfSIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgXAorCXN1YnN0cmluZyBmdW5jdGlvbi4KK251bGwtcmVzdWx0LXByb3ZpZGVyOiBzdXBwbGllZCBhcnJheSBvZiByZXN1bHQgb2JqZWN0IHByb3ZpZGVycyBpcyBudWxsCitlbXB0eS1yZXN1bHQtcHJvdmlkZXI6IHN1cHBsaWVkIGFycmF5IG9mIHJlc3VsdCBvYmplY3QgcHJvdmlkZXJzIGlzIGVtcHR5CitudWxsLXNoYXJlZC1yZXN1bHQtc2V0OiBzdXBwbGllZCByZXN1bHQgc2V0IGlzIG51bGwKK2lsbGVnYWwtbWV0aG9kOiB7MH0uezF9KCkgaXMgaWxsZWdhbCB0byBiZSBpbnZva2VkCitjb2x1bW4tbm90LW1hcHBlZDogU1FMUmVzdWx0U2V0TWFwcGluZyAiezB9IiBkb2VzIG5vdCBtYXAgdGhlIGNvbHVtbnMgInsxfSIgXAorCXRoYXQgYXJlIHNlbGVjdGVkIGJ5IHRoZSBTUUwgcXVlcnlcclxuICJ7Mn0iCitkaWN0aW9uYXJ5LWNvbmZpZ3VyYXRpb246IERCRGljdGlvbmFyeSBjb25maWd1cmF0aW9uOiBcbnswfQorb3JhY2xlLXRpbWVzdGFtcC1idWc6IEFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBoYXMgb2NjdXJlZCB3aGVuIFwKKyAgICBnZXR0aW5nIGEgdGltZXN0YW1wIHZhbHVlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB1c2luZyB2ZXJzaW9ucyBvZiB0aGUgXAorICAgIE9yYWNsZSBKREJDIGRyaXZlciBncmVhdGVyIHRoYW4gOS4yIGluIGNvbmp1bmNpb24gd2l0aCBhIHNlcnZlciB2ZXJzaW9uIFwKKyAgICBsZXNzIHRoYW4gOS4yLiBEb3duZ3JhZGluZyB0aGUgZHJpdmVyIHdpbGwgc29sdmUgdGhpcywgb3IgaXQgY2FuIGJlIFwKKyAgICB3b3JrZWQgYXJvdW5kIGJ5IHNldHRpbmcgdGhlICJTdXBwb3J0c1RpbWVzdGFtcE5hbm9zIiBEQkRpY3Rpb25hcnkgXAorICAgIHByb3BlcnR5IHRvICJ0cnVlIi4KK2lzb2xhdGlvbi1sZXZlbC1jb25maWctbm90LXN1cHBvcnRlZDogVGhpcyBEQkRpY3Rpb25hcnkgZG9lcyBub3Qgc3VwcG9ydCBcCisgICAgY3VzdG9taXphdGlvbiBvZiBpc29sYXRpb24gbGV2ZWxzIG9uIGEgcGVyLXF1ZXJ5IGJhc2lzLiBEQkRpY3Rpb25hcnk6IHswfS4KK21pbGxpcy1xdWVyeS10aW1lb3V0OiBKREJDIGxvY2tpbmcgZG9lcyBub3Qgc3VwcG9ydCBtaWxsaXNlY29uZC1ncmFudWxhcml0eSBcCisgICAgdGltZW91dHMuICBVc2UgdGltZW91dHMgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIDEwMDAgZm9yIGV2ZW4gc2Vjb25kIHZhbHVlcy4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvc3FsLWtleXdvcmRzLnJzcmMgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL3NxbC1rZXl3b3Jkcy5yc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmFlNGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL3NxbC1rZXl3b3Jkcy5yc3JjCkBAIC0wLDAgKzEgQEAKK0FCU09MVVRFLEFDVElPTixBREQsQUxMLEFMTE9DQVRFLEFMVEVSLEFORCxBTlksQVJFLEFTLEFTQyxBU1NFUlRJT04sQVQsQVVUSE9SSVpBVElPTixBVkcsQkVHSU4sQkVUV0VFTixCSVQsQklUX0xFTkdUSCxCT1RILEJZLENBU0NBREUsQ0FTQ0FERUQsQ0FTRSxDQVNULENBVEFMT0csQ0hBUixDSEFSQUNURVIsQ0hBUl9MRU5HVEgsQ0hBUkFDVEVSX0xFTkdUSCxDSEVDSyxDTE9TRSxDT0FMRVNDRSxDT0xMQVRFLENPTExBVElPTixDT0xVTU4sQ09NTUlULENPTk5FQ1QsQ09OTkVDVElPTixDT05TVFJBSU5ULENPTlNUUkFJTlRTLENPTlRJTlVFLENPTlZFUlQsQ09SUkVTUE9ORElORyxDT1VOVCxDUkVBVEUsQ1JPU1MsQ1VSUkVOVCxDVVJSRU5UX0RBVEUsQ1VSUkVOVF9USU1FLENVUlJFTlRfVElNRVNUQU1QLENVUlJFTlRfVVNFUixDVVJTT1IsREFURSxEQVksREVBTExPQ0FURSxERUMsREVDSU1BTCxERUNMQVJFLERFRkFVTFQsREVGRVJSQUJMRSxERUZFUlJFRCxERUxFVEUsREVTQyxERVNDUklCRSxERVNDUklQVE9SLERJQUdOT1NUSUNTLERJU0NPTk5FQ1QsRElTVElOQ1QsRE9NQUlOLERPVUJMRSxEUk9QLEVMU0UsRU5ELEVORC1FWEVDLEVTQ0FQRSxFWENFUFQsRVhDRVBUSU9OLEVYRUMsRVhFQ1VURSxFWElTVFMsRVhURVJOQUwsRVhUUkFDVCxGQUxTRSxGRVRDSCxGSVJTVCxGTE9BVCxGT1IsRk9SRUlHTixGT1VORCxGUk9NLEZVTEwsR0VULEdMT0JBTCxHTyxHT1RPLEdSQU5ULEdST1VQLEhBVklORyxIT1VSLElERU5USVRZLElNTUVESUFURSxJTixJTkRJQ0FUT1IsSU5JVElBTExZLElOTkVSLElOUFVULElOU0VOU0lUSVZFLElOU0VSVCxJTlQsSU5URUdFUixJTlRFUlNFQ1QsSU5URVJWQUwsSU5UTyxJUyxJU09MQVRJT04sSk9JTixLRVksTEFOR1VBR0UsTEFTVCxMRUFESU5HLExFRlQsTEVWRUwsTElLRSxMT0NBTCxMT1dFUixNQVRDSCxNQVgsTUlOLE1JTlVURSxNT0RVTEUsTU9OVEgsTkFNRVMsTkFUSU9OQUwsTkFUVVJBTCxOQ0hBUixORVhULE5PLE5PVCxOVUxMLE5VTExJRixOVU1FUklDLE9DVEVUX0xFTkdUSCxPRixPTixPTkxZLE9QRU4sT1BUSU9OLE9SLE9SREVSLE9VVEVSLE9VVFBVVCxPVkVSTEFQUyxQQUQsUEFSVElBTCxQT1NJVElPTixQUkVDSVNJT04sUFJFUEFSRSxQUkVTRVJWRSxQUklNQVJZLFBSSU9SLFBSSVZJTEVHRVMsUFJPQ0VEVVJFLFBVQkxJQyxSRUFELFJFQUwsUkVGRVJFTkNFUyxSRUxBVElWRSxSRVNUUklDVCxSRVZPS0UsUklHSFQsUk9MTEJBQ0ssUk9XUyxTQ0hFTUEsU0NST0xMLFNFQ09ORCxTRUNUSU9OLFNFTEVDVCxTRVNTSU9OLFNFU1NJT05fVVNFUixTRVQsU0laRSxTTUFMTElOVCxTT01FLFNQQUNFLFNRTCxTUUxDT0RFLFNRTEVSUk9SLFNRTFNUQVRFLFNVQlNUUklORyxTVU0sU1lTVEVNX1VTRVIsVEFCTEUsVEVNUE9SQVJZLFRIRU4sVElNRSxUSU1FU1RBTVAsVElNRVpPTkVfSE9VUixUSU1FWk9ORV9NSU5VVEUsVE8sVFJBSUxJTkcsVFJBTlNBQ1RJT04sVFJBTlNMQVRFLFRSQU5TTEFUSU9OLFRSSU0sVFJVRSxVTklPTixVTklRVUUsVU5LTk9XTixVUERBVEUsVVBQRVIsVVNBR0UsVVNFUixVU0lORyxWQUxVRSxWQUxVRVMsVkFSQ0hBUixWQVJZSU5HLFZJRVcsV0hFTixXSEVORVZFUixXSEVSRSxXSVRILFdPUkssV1JJVEUsWUVBUixaT05FLEFEQSxDLENBVEFMT0dfTkFNRSxDSEFSQUNURVJfU0VUX0NBVEFMT0csQ0hBUkFDVEVSX1NFVF9OQU1FLENIQVJBQ1RFUl9TRVRfU0NIRU1BLENMQVNTX09SSUdJTixDT0JPTCxDT0xMQVRJT05fQ0FUQUxPRyxDT0xMQVRJT05fTkFNRSxDT0xMQVRJT05fU0NIRU1BLENPTFVNTl9OQU1FLENPTU1BTkRfRlVOQ1RJT04sQ09NTUlUVEVELENPTkRJVElPTl9OVU1CRVIsQ09OTkVDVElPTl9OQU1FLENPTlNUUkFJTlRfQ0FUQUxPRyxDT05TVFJBSU5UX05BTUUsQ09OU1RSQUlOVF9TQ0hFTUEsQ1VSU09SX05BTUUsREFUQSxEQVRFVElNRV9JTlRFUlZBTF9DT0RFLERBVEVUSU1FX0lOVEVSVkFMX1BSRUNJU0lPTixEWU5BTUlDX0ZVTkNUSU9OLEZPUlRSQU4sTEVOR1RILE1FU1NBR0VfTEVOR1RILE1FU1NBR0VfT0NURVRfTEVOR1RILE1FU1NBR0VfVEVYVCxNT1JFLE1VTVBTLE5BTUUsTlVMTEFCTEUsTlVNQkVSLFBBU0NBTCxQTEksUkVQRUFUQUJMRSxSRVRVUk5FRF9MRU5HVEgsUkVUVVJORURfT0NURVRfTEVOR1RILFJFVFVSTkVEX1NRTFNUQVRFLFJPV19DT1VOVCxTQ0FMRSxTQ0hFTUFfTkFNRSxTRVJJQUxJWkFCTEUsU0VSVkVSX05BTUUsU1VCQ0xBU1NfT1JJR0lOLFRBQkxFX05BTUUsVFlQRSxVTkNPTU1JVFRFRCxVTk5BTUVECmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsLTUvcG9tLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwtNS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDIyYTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsLTUvcG9tLnhtbApAQCAtMCwwICsxLDY4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWtlcm5lbC01PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+T3BlbkpQQSBLZXJuZWwgMS41PC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj5PcGVuSlBBIEtlcm5lbCAxLjU8L2Rlc2NyaXB0aW9uPgorICAgIDx1cmw+aHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3Byb2plY3RzL29wZW5qcGE8L3VybD4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEta2VybmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBjcmVhdGUgZW5oYW5jZXIgcHJlLW1haW4gYXR0cmlidXRlIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQcmVtYWluLUNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyQWdlbnQ8L1ByZW1haW4tQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwtNS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL1BDQ2xhc3NGaWxlVHJhbnNmb3JtZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwtNS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL1BDQ2xhc3NGaWxlVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU4Mjg3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC01L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENDbGFzc0ZpbGVUcmFuc2Zvcm1lci5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuaW5zdHJ1bWVudC5DbGFzc0ZpbGVUcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZhLmxhbmcuaW5zdHJ1bWVudC5JbGxlZ2FsQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuR2VuZXJhbEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLlByb2plY3Q7CitpbXBvcnQgc2VycC5ieXRlY29kZS5sb3dsZXZlbC5Db25zdGFudFBvb2xUYWJsZTsKKworLyoqCisgKiBUcmFuc2Zvcm1lciB0aGF0IG1ha2VzIHBlcnNpc3RlbnQgY2xhc3NlcyBpbXBsZW1lbnQgdGhlCisgKiB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlfSBpbnRlcmZhY2UgYXQgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUENDbGFzc0ZpbGVUcmFuc2Zvcm1lcgorICAgIGltcGxlbWVudHMgQ2xhc3NGaWxlVHJhbnNmb3JtZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUENDbGFzc0ZpbGVUcmFuc2Zvcm1lci5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIE1ldGFEYXRhUmVwb3NpdG9yeSBfcmVwb3M7CisgICAgcHJpdmF0ZSBmaW5hbCBQQ0VuaGFuY2VyLkZsYWdzIF9mbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIF90bXBMb2FkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgX2xvZzsKKyAgICBwcml2YXRlIGZpbmFsIFNldCBfbmFtZXM7CisgICAgcHJpdmF0ZSBib29sZWFuIF90cmFuc2Zvcm1pbmcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcG9zIG1ldGFkYXRhIHJlcG9zaXRvcnkgdG8gdXNlIGludGVybmFsbHkKKyAgICAgKiBAcGFyYW0gb3B0cyBlbmhhbmNlciBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAgICAgKiBAcGFyYW0gbG9hZGVyIHRlbXBvcmFyeSBjbGFzcyBsb2FkZXIgZm9yIGxvYWRpbmcgaW50ZXJtZWRpYXRlIGNsYXNzZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgUENDbGFzc0ZpbGVUcmFuc2Zvcm1lcihNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MsIE9wdGlvbnMgb3B0cywKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRoaXMocmVwb3MsIHRvRmxhZ3Mob3B0cyksIGxvYWRlciwgb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgic2NhbkRldlBhdGgiLCAiU2NhbkRldlBhdGgiLCBmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBlbmhhbmNlciBmbGFncyBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFBDRW5oYW5jZXIuRmxhZ3MgdG9GbGFncyhPcHRpb25zIG9wdHMpIHsKKyAgICAgICAgUENFbmhhbmNlci5GbGFncyBmbGFncyA9IG5ldyBQQ0VuaGFuY2VyLkZsYWdzKCk7CisgICAgICAgIGZsYWdzLmFkZERlZmF1bHRDb25zdHJ1Y3RvciA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoImFkZERlZmF1bHRDb25zdHJ1Y3RvciIsICJBZGREZWZhdWx0Q29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIGZsYWdzLmFkZERlZmF1bHRDb25zdHJ1Y3Rvcik7CisgICAgICAgIGZsYWdzLmVuZm9yY2VQcm9wZXJ0eVJlc3RyaWN0aW9ucyA9IG9wdHMucmVtb3ZlQm9vbGVhblByb3BlcnR5CisgICAgICAgICAgICAoImVuZm9yY2VQcm9wZXJ0eVJlc3RyaWN0aW9ucyIsICJFbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMiLAorICAgICAgICAgICAgICAgIGZsYWdzLmVuZm9yY2VQcm9wZXJ0eVJlc3RyaWN0aW9ucyk7CisgICAgICAgIHJldHVybiBmbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBvcyBtZXRhZGF0YSByZXBvc2l0b3J5IHRvIHVzZSBpbnRlcm5hbGx5CisgICAgICogQHBhcmFtIGZsYWdzIGVuaGFuY2VyIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAcGFyYW0gbG9hZGVyIHRlbXBvcmFyeSBjbGFzcyBsb2FkZXIgZm9yIGxvYWRpbmcgaW50ZXJtZWRpYXRlIGNsYXNzZXMKKyAgICAgKiBAcGFyYW0gZGV2c2NhbiB3aGV0aGVyIHRvIHNjYW4gdGhlIGRldiBjbGFzc3BhdGggZm9yIHBlcnNpc3RlbnQgdHlwZXMKKyAgICAgKiBpZiBub25lIGFyZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFBDQ2xhc3NGaWxlVHJhbnNmb3JtZXIoTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zLAorICAgICAgICBQQ0VuaGFuY2VyLkZsYWdzIGZsYWdzLCBDbGFzc0xvYWRlciB0bXBMb2FkZXIsIGJvb2xlYW4gZGV2c2NhbikgeworICAgICAgICBfcmVwb3MgPSByZXBvczsKKyAgICAgICAgX3RtcExvYWRlciA9IHRtcExvYWRlcjsKKworICAgICAgICBfbG9nID0gcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0TG9nKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19FTkhBTkNFKTsKKyAgICAgICAgX2ZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgX25hbWVzID0gcmVwb3MuZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhkZXZzY2FuLCB0bXBMb2FkZXIpOworICAgICAgICBpZiAoX25hbWVzID09IG51bGwgJiYgX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoInJ1bnRpbWUtZW5oYW5jZS1wY2NsYXNzZXMiKSk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSB0cmFuc2Zvcm0oQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgICBDbGFzcyByZWRlZiwgUHJvdGVjdGlvbkRvbWFpbiBkb21haW4sIGJ5dGVbXSBieXRlcykKKyAgICAgICAgdGhyb3dzIElsbGVnYWxDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gX3RtcExvYWRlcikKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHByZXZlbnQgcmUtZW50cmFudCBjYWxscywgd2hpY2ggY2FuIG9jY3VyIGlmIHRoZSBlbmhhbmNlaW5nCisgICAgICAgIC8vIGxvYWRlciBpcyB1c2VkIHRvIGFsc28gbG9hZCBPcGVuSlBBIGxpYnJhcmllczsgdGhpcyBpcyB0byBwcmV2ZW50IAorICAgICAgICAvLyByZWN1cnNpdmUgZW5oYW5jZW1lbnQgYXR0ZW1wdHMgZm9yIGludGVybmFsIG9wZW5qcGEgbGlicmFyaWVzCisgICAgICAgIGlmIChfdHJhbnNmb3JtaW5nKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgX3RyYW5zZm9ybWluZyA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIGVuaGFuY2UgPSBuZWVkc0VuaGFuY2UoY2xhc3NOYW1lLCByZWRlZiwgYnl0ZXMpOworICAgICAgICAgICAgaWYgKGVuaGFuY2UgIT0gbnVsbCAmJiBfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgibmVlZHMtcnVudGltZS1lbmhhbmNlIiwgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICBlbmhhbmNlKSk7CisgICAgICAgICAgICBpZiAoZW5oYW5jZSAhPSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIFBDRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgUENFbmhhbmNlcihfcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBQcm9qZWN0KCkubG9hZENsYXNzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksCisgICAgICAgICAgICAgICAgICAgIF90bXBMb2FkZXIpLCBfcmVwb3MpOworICAgICAgICAgICAgZW5oYW5jZXIuc2V0QWRkRGVmYXVsdENvbnN0cnVjdG9yKF9mbGFncy5hZGREZWZhdWx0Q29uc3RydWN0b3IpOworICAgICAgICAgICAgZW5oYW5jZXIuc2V0RW5mb3JjZVByb3BlcnR5UmVzdHJpY3Rpb25zCisgICAgICAgICAgICAgICAgKF9mbGFncy5lbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMpOworCisgICAgICAgICAgICBpZiAoZW5oYW5jZXIucnVuKCkgPT0gUENFbmhhbmNlci5FTkhBTkNFX05PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gZW5oYW5jZXIuZ2V0Qnl0ZWNvZGUoKS50b0J5dGVBcnJheSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJjZnQtZXhjZXB0aW9uLXRocm93biIsIGNsYXNzTmFtZSksIHQpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJbGxlZ2FsQ2xhc3NGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKElsbGVnYWxDbGFzc0Zvcm1hdEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX3RyYW5zZm9ybWluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGNsYXNzIG5lZWRzIGVuaGFuY2VtZW50LgorICAgICAqLworICAgIHByaXZhdGUgQm9vbGVhbiBuZWVkc0VuaGFuY2UoU3RyaW5nIGNsc05hbWUsIENsYXNzIHJlZGVmLCBieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzW10gaW50ZnMgPSByZWRlZi5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGZzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MuZ2V0TmFtZSgpLgorICAgICAgICAgICAgICAgICAgICBlcXVhbHMoaW50ZnNbaV0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZighaXNFbmhhbmNlZChieXRlcykpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX25hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfbmFtZXMuY29udGFpbnMoY2xzTmFtZS5yZXBsYWNlKCcvJywgJy4nKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZighaXNFbmhhbmNlZChieXRlcykpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xzTmFtZS5zdGFydHNXaXRoKCJqYXZhLyIpIHx8IGNsc05hbWUuc3RhcnRzV2l0aCgiamF2YXgvIikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGlzRW5oYW5jZWQoYnl0ZXMpKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKGNsc05hbWUucmVwbGFjZSgnLycsICcuJyksIGZhbHNlLAorICAgICAgICAgICAgICAgIF90bXBMb2FkZXIpOworICAgICAgICAgICAgaWYgKF9yZXBvcy5nZXRNZXRhRGF0YShjLCBudWxsLCBmYWxzZSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgLy8gY2Fubm90IGxvYWQgdGhlIGNsYXNzOiB0aGlzIG1pZ2h0IG1lYW4gdGhhdCBpdCBpcyBhIHByb3h5CisgICAgICAgICAgICAvLyBvciBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlIGNsYXNzIHdoaWNoIGNhbid0IGJlIGFuIGVudGl0eQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBjY2UpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBhcmUgbG9hZGluZyBjbGFzc2VzIHRoYXQgdGhpcworICAgICAgICAgICAgLy8gY2xhc3MgZGVwZW5kcyBvbjsgdGhlc2Ugd2lsbCBuZXZlciBiZSBlbmhhbmNlZCBhbnl3YXkKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5hbHl6ZSB0aGUgYnl0ZWNvZGUgdG8gc2VlIGlmIHRoZSBnaXZlbiBjbGFzcyBkZWZpbml0aW9uIGltcGxlbWVudHMKKyAgICAgKiB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5oYW5jZWQoYnl0ZVtdIGIpIHsKKyAgICAgICAgQ29uc3RhbnRQb29sVGFibGUgdGFibGUgPSBuZXcgQ29uc3RhbnRQb29sVGFibGUoYik7CisgICAgICAgIGludCBpZHggPSB0YWJsZS5nZXRFbmRJbmRleCgpOworCisgICAgICAgIGlkeCArPSA2OyAvLyBza2lwIGFjY2VzcywgY2xzLCBzdXBlcgorICAgICAgICBpbnQgaWZhY2VzID0gdGFibGUucmVhZFVuc2lnbmVkU2hvcnQoaWR4KTsKKyAgICAgICAgaW50IGNsc0VudHJ5LCB1dGZFbnRyeTsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWZhY2VzOyBpKyspIHsKKyAgICAgICAgICAgIGlkeCArPSAyOworICAgICAgICAgICAgY2xzRW50cnkgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydChpZHgpOworICAgICAgICAgICAgdXRmRW50cnkgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydCh0YWJsZS5nZXQoY2xzRW50cnkpKTsKKyAgICAgICAgICAgIG5hbWUgPSB0YWJsZS5yZWFkU3RyaW5nKHRhYmxlLmdldCh1dGZFbnRyeSkpOworICAgICAgICAgICAgaWYgKCJvcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9QZXJzaXN0ZW5jZUNhcGFibGUiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC01L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENFbmhhbmNlckFnZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsLTUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9QQ0VuaGFuY2VyQWdlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhiYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC01L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENFbmhhbmNlckFnZW50LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZTsKKworaW1wb3J0IGphdmEubGFuZy5pbnN0cnVtZW50Lkluc3RydW1lbnRhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlRlbXBvcmFyeUNsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNsYXNzUmVzb2x2ZXI7CisKKy8qKgorICogSmF2YSBhZ2VudCB0aGF0IG1ha2VzIHBlcnNpc3RlbnQgY2xhc3NlcyBpbXBsZW1lbnQgdGhlCisgKiB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlfSBpbnRlcmZhY2UgYXQgcnVudGltZS4gVGhlIGFnZW50IGlzIGxhdW5jaGVkCisgKiBhdCBKVk0gc3RhcnR1cCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6CisgKiAKKyAqIDxjb2RlPmphdmEgLWphdmFhZ2VudDpvcGVuanBhLmphcls9Jmx0O29wdGlvbnMmZ3Q7XTwvY29kZT4KKyAqICBUaGUgb3B0aW9ucyBzdHJpbmcgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBhIE9wZW5KUEEgcGx1Z2luLCBhbmQgbWF5CisgKiBjb250YWluIGFueSBwcm9wZXJ0aWVzIHVuZGVyc3Rvb2QgYnkgdGhlIE9wZW5KUEEgZW5oYW5jZXIgb3IgYW55CisgKiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuIEZvciBleGFtcGxlOgorICogCisgKiA8Y29kZT5qYXZhIC1qYXZhYWdlbnQ6b3BlbmpwYS5qYXI8L2NvZGU+CisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFBDRW5oYW5jZXJBZ2VudCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlbWFpbihTdHJpbmcgYXJncywgSW5zdHJ1bWVudGF0aW9uIGluc3QpIHsKKyAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzKGFyZ3MpOworICAgICAgICBDb25maWd1cmF0aW9ucy5wb3B1bGF0ZUNvbmZpZ3VyYXRpb24oY29uZiwgb3B0cyk7CisgICAgICAgIC8vIGRvbid0IGFsbG93IGNvbm5lY3Rpb25zCisgICAgICAgIGNvbmYuc2V0Q29ubmVjdGlvblVzZXJOYW1lKG51bGwpOworICAgICAgICBjb25mLnNldENvbm5lY3Rpb25QYXNzd29yZChudWxsKTsKKyAgICAgICAgY29uZi5zZXRDb25uZWN0aW9uVVJMKG51bGwpOworICAgICAgICBjb25mLnNldENvbm5lY3Rpb25Ecml2ZXJOYW1lKG51bGwpOworICAgICAgICBjb25mLnNldENvbm5lY3Rpb25GYWN0b3J5TmFtZShudWxsKTsKKyAgICAgICAgLy8gc2V0IHNpbmdsZSBjbGFzcyByZXNvbHZlcgorICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciB0bXBMb2FkZXIgPSBuZXcgVGVtcG9yYXJ5Q2xhc3NMb2FkZXIoVGhyZWFkLgorICAgICAgICAgICAgY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgY29uZi5zZXRDbGFzc1Jlc29sdmVyKG5ldyBDbGFzc1Jlc29sdmVyKCkgeworICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzIGNvbnRleHQsIENsYXNzTG9hZGVyIGVudikgeworICAgICAgICAgICAgICAgIHJldHVybiB0bXBMb2FkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBjb25mLnNldFJlYWRPbmx5KHRydWUpOworICAgICAgICBjb25mLmluc3RhbnRpYXRlQWxsKCk7IC8vIGF2b2lkIHRocmVhZGluZyBpc3N1ZXMKKworICAgICAgICBQQ0NsYXNzRmlsZVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gbmV3IFBDQ2xhc3NGaWxlVHJhbnNmb3JtZXIKKyAgICAgICAgICAgIChjb25mLm5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCksIG9wdHMsIHRtcExvYWRlcik7CisgICAgICAgIGluc3QuYWRkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvcG9tLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjMwMmUwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9wb20ueG1sCkBAIC0wLDAgKzEsMTc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyANCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIA0KKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyB1bmRlciB0aGUgTGljZW5zZS4gICANCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWtlcm5lbDwvYXJ0aWZhY3RJZD4NCisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCisgICAgPG5hbWU+T3BlbkpQQSBLZXJuZWw8L25hbWU+DQorICAgIDxkZXNjcmlwdGlvbj5PcGVuSlBBIEtlcm5lbDwvZGVzY3JpcHRpb24+DQorICAgIDx1cmw+aHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3Byb2plY3RzL29wZW5qcGE8L3VybD4NCisgICAgPHBhcmVudD4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgIDwvcGFyZW50Pg0KKyAgICA8cHJvZmlsZXM+DQorICAgICAgICA8cHJvZmlsZT4NCisgICAgICAgICAgICA8aWQ+amF2YTE0LXZhbGlkYXRlPC9pZD4NCisgICAgICAgICAgICA8YWN0aXZhdGlvbj48cHJvcGVydHk+PG5hbWU+amF2YTE0LmphcjwvbmFtZT48L3Byb3BlcnR5PjwvYWN0aXZhdGlvbj4NCisgICAgICAgICAgICA8YnVpbGQ+DQorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50Pg0KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym9vdGNsYXNzcGF0aD4ke2phdmExNC5qYXJ9PC9ib290Y2xhc3NwYXRoPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3VtZW50cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+DQorICAgICAgICAgICAgPC9idWlsZD4NCisgICAgICAgIDwvcHJvZmlsZT4NCisgICAgPC9wcm9maWxlcz4NCisgICAgPGRlcGVuZGVuY2llcz4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4NCisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWxpYjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4NCisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgICAgICA8L2RlcGVuZGVuY3k+DQorICAgICAgICA8ZGVwZW5kZW5jeT4NCisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPg0KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWptc18xLjFfc3BlYzwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4NCisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgICAgICA8L2RlcGVuZGVuY3k+DQorICAgICAgICA8ZGVwZW5kZW5jeT4NCisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPg0KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWoyZWUtY29ubmVjdG9yXzEuNV9zcGVjPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPg0KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tanRhXzEuMC4xQl9zcGVjPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPg0KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtcG9vbDwvZ3JvdXBJZD4NCisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXBvb2w8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPg0KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPC9kZXBlbmRlbmNpZXM+DQorICAgIDxidWlsZD4NCisgICAgICAgIDxwbHVnaW5zPg0KKyAgICAgICAgICAgIDxwbHVnaW4+DQorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNDwvc291cmNlPg0KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjQ8L3RhcmdldD4NCisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgIDwvcGx1Z2luPg0KKyAgICAgICAgICAgIDxwbHVnaW4+DQorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhY2MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmpqdHJlZS1qcHFsPC9pZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2Jhc2VkaXJ9L3NyYy9tYWluL2pqdHJlZS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWw8L3NvdXJjZURpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL2pqdHJlZS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWw8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1aWxkTm9kZUZpbGVzPmZhbHNlPC9idWlsZE5vZGVGaWxlcz4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qanRyZWU8L2dvYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWNjLWpwcWw8L2lkPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZURpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL2pqdHJlZS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWw8L3NvdXJjZURpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL2phdmFjYy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWw8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhY2M8L2dvYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQorICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXNvdXJjZXM8L3BoYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvamF2YWNjL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvanBxbC9QYXJzZUV4Y2VwdGlvbi5qYXZhIi8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorCQkJCQkJPGlkPmFkZC13YXMtaW50ZXJmYWNlczwvaWQ+DQorCQkJCQkJPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+DQorCQkJCQkJPGNvbmZpZ3VyYXRpb24+DQorCQkJCQkJCTx0YXNrcz4NCisJCQkJCQkJCTxqYXZhDQorCQkJCQkJCQkJY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm9wZW5qcGEuZWUuV0FTTWFuYWdlZFJ1bnRpbWUiIGNsYXNzcGF0aHJlZj0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+DQorCQkJCQkJCTwvdGFza3M+DQorCQkJCQkJPC9jb25maWd1cmF0aW9uPg0KKwkJCQkJCTxnb2Fscz4NCisJCQkJCQkJPGdvYWw+cnVuPC9nb2FsPg0KKwkJCQkJCTwvZ29hbHM+DQorCQkJCQk8L2V4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorCQkJCQkJPGlkPmdlbmVyYXRlLXN0YW5kYXJkLXNjby1wcm94aWVzPC9pZD4NCisJCQkJCQk8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4NCisJCQkJCQk8Y29uZmlndXJhdGlvbj4NCisJCQkJCQkJPHRhc2tzPg0KKwkJCQkJCQkJPGphdmENCisJCQkJCQkJCQljbGFzc25hbWU9Im9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5TWFuYWdlckltcGwiIGNsYXNzcGF0aHJlZj0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLXV0aWxzIDUiLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4NCisJCQkJCQkJPC90YXNrcz4NCisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+DQorCQkJCQkJPGdvYWxzPg0KKwkJCQkJCQk8Z29hbD5ydW48L2dvYWw+DQorCQkJCQkJPC9nb2Fscz4NCisJCQkJCTwvZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQorICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICA8L3BsdWdpbnM+DQorICAgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9BYnN0cmFjdFN0b3JlQnJva2VyRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9hYnN0cmFjdHN0b3JlL0Fic3RyYWN0U3RvcmVCcm9rZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwYjQxMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9BYnN0cmFjdFN0b3JlQnJva2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5hYnN0cmFjdHN0b3JlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQWJzdHJhY3RCcm9rZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQm9vdHN0cmFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUHJvZHVjdERlcml2YXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgQnJva2VyRmFjdG9yeX0gaW1wbGVtZW50YXRpb24gZm9yIHVzZSB3aXRoIHRoZQorICoge0BsaW5rIEFic3RyYWN0U3RvcmVNYW5hZ2VyfS4gVGhpcyBwcm92aWRlcyBpbnRlZ3JhdGlvbiBpbnRvIHRoZQorICoge0BsaW5rIEJvb3RzdHJhcCNnZXRCcm9rZXJGYWN0b3J5KCl9IGJvb3RzdHJhcHBpbmcgbWVjaGFuaXNtLCB0byBmYWNpbGl0YXRlCisgKiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIHN1YmNsYXNzIG9mIHtAbGluayBBYnN0cmFjdFN0b3JlTWFuYWdlcn0uIE5ldworICogc3RvcmUgbWFuYWdlciBpbXBsZW1lbnRhdGlvbnMgbmVlZCBub3QgZXh0ZW5kIHRoaXMgY2xhc3MuIEluc3RlYWQsIHNldCB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUub3BlbmpwYS5Ccm9rZXJGYWN0b3J5PC9jb2RlPiBjb25maWd1cmF0aW9uIHByb3BlcnR5IHRvCisgKiA8Y29kZT5hYnN0cmFjdHN0b3JlPC9jb2RlPiwKKyAqIGFuZCBzZXQgdGhlIDxjb2RlPm9yZy5hcGFjaGUub3BlbmpwYS5hYnN0cmFjdHN0b3JlLkFic3RyYWN0U3RvcmVNYW5hZ2VyPC9jb2RlPgorICogY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0byB0aGUgZnVsbCBjbGFzcyBuYW1lIG9mIHlvdXIgaW1wbGVtZW50YXRpb24uCisgKiAgQWRkaXRpb25hbGx5LCB5b3UgY2FuIG9wdGlvbmFsbHkgY3JlYXRlIHlvdXIgb3duCisgKiA8Y29kZT5Ccm9rZXJGYWN0b3J5PC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHRoYXQgeW91CisgKiB1c2UgdGhlIDxjb2RlPkFic3RyYWN0U3RvcmVCcm9rZXJGYWN0b3J5PC9jb2RlPiwgYXMgaXQgZGVhbHMgd2l0aCBwb29saW5nCisgKiBhbmQgYm9vdHN0cmFwcGluZyBmcm9tIGEge0BsaW5rIE1hcH0gb2JqZWN0ICh0aGUgc3RyYXRlZ3kgdXNlZCBieQorICoge0BsaW5rIEJvb3RzdHJhcH0gdG8gY3JlYXRlIGEgZmFjdG9yeSBpbiBhIHZlbmRvci1uZXV0cmFsIG1hbm5lcikuCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFN0b3JlQnJva2VyRmFjdG9yeQorICAgIGV4dGVuZHMgQWJzdHJhY3RCcm9rZXJGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBuYW1lIHVuZGVyIHdoaWNoIHRvIG5hbWUgdGhlIGNvbmNyZXRlIHN0b3JlIG1hbmFnZXIKKyAgICAgKiBjbGFzcyBmb3IgdGhpcyBydW50aW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FCU1RSQUNUX1NUT1JFID0KKyAgICAgICAgImFic3RyYWN0c3RvcmUuQWJzdHJhY3RTdG9yZU1hbmFnZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIHNfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEFic3RyYWN0U3RvcmVCcm9rZXJGYWN0b3J5LmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RyaW5nIF9zdG9yZUNscyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3N0b3JlUHJvcHMgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9wbGF0Zm9ybSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3Igb2J0YWluaW5nIGEgcG9zc2libHktcG9vbGVkIHtAbGluayBCcm9rZXJGYWN0b3J5fQorICAgICAqIGZyb20gcHJvcGVydGllcy4gSW52b2tlZCBmcm9tIHtAbGluayBCb290c3RyYXAjZ2V0QnJva2VyRmFjdG9yeSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0U3RvcmVCcm9rZXJGYWN0b3J5IGdldEluc3RhbmNlCisgICAgICAgIChDb25maWd1cmF0aW9uUHJvdmlkZXIgY3ApIHsKKyAgICAgICAgQWJzdHJhY3RTdG9yZUJyb2tlckZhY3RvcnkgZmFjdG9yeSA9IChBYnN0cmFjdFN0b3JlQnJva2VyRmFjdG9yeSkKKyAgICAgICAgICAgIGdldFBvb2xlZEZhY3RvcnkoY3AuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5OworCisgICAgICAgIGZhY3RvcnkgPSBuZXdJbnN0YW5jZShjcCk7CisgICAgICAgIGZhY3RvcnkucG9vbCgpOworICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEge0BsaW5rIEJyb2tlckZhY3Rvcnl9CisgICAgICogZnJvbSBwcm9wZXJ0aWVzLiBJbnZva2VkIGZyb20ge0BsaW5rIEJvb3RzdHJhcCNuZXdCcm9rZXJGYWN0b3J5KCl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RTdG9yZUJyb2tlckZhY3RvcnkgbmV3SW5zdGFuY2UKKyAgICAgICAgKENvbmZpZ3VyYXRpb25Qcm92aWRlciBjcCkgeworICAgICAgICAvLyB1c2UgYSB0bXAgc3RvcmUgbWFuYWdlciB0byBnZXQgbWV0YWRhdGEgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBvZgorICAgICAgICAvLyB0aGlzIHJ1bnRpbWUKKyAgICAgICAgTWFwIG1hcCA9IGNwLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgU3RyaW5nIHN0b3JlUGx1Z2luID0gKFN0cmluZykgbWFwLmdldChQcm9kdWN0RGVyaXZhdGlvbnMKKyAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uS2V5KFBST1BfQUJTVFJBQ1RfU1RPUkUsIG1hcCkpOworICAgICAgICBTdHJpbmcgc3RvcmVDbHMgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUoc3RvcmVQbHVnaW4pOworICAgICAgICBTdHJpbmcgc3RvcmVQcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoc3RvcmVQbHVnaW4pOworICAgICAgICBBYnN0cmFjdFN0b3JlTWFuYWdlciBzdG9yZSA9IGNyZWF0ZVN0b3JlTWFuYWdlcihzdG9yZUNscywKKyAgICAgICAgICAgIHN0b3JlUHJvcHMpOworCisgICAgICAgIC8vIHBvcHVsYXRlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiA9IHN0b3JlLm5ld0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY3Auc2V0SW50byhjb25mKTsKKyAgICAgICAgY29uZi5zdXBwb3J0ZWRPcHRpb25zKCkucmVtb3ZlQWxsKHN0b3JlLmdldFVuc3VwcG9ydGVkT3B0aW9ucygpKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvb2wgYSBuZXcgZmFjdG9yeQorICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0U3RvcmVCcm9rZXJGYWN0b3J5KGNvbmYsIHN0b3JlQ2xzLCBzdG9yZVByb3BzLAorICAgICAgICAgICAgc3RvcmUuZ2V0UGxhdGZvcm0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIHNldHRpbmdzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0b3JlQnJva2VyRmFjdG9yeShPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBTdHJpbmcgc3RvcmVDbHMsIFN0cmluZyBzdG9yZVByb3BzLCBTdHJpbmcgcGxhdGZvcm0pIHsKKyAgICAgICAgc3VwZXIoY29uZik7CisgICAgICAgIF9zdG9yZUNscyA9IHN0b3JlQ2xzOworICAgICAgICBfc3RvcmVQcm9wcyA9IHN0b3JlUHJvcHM7CisgICAgICAgIF9wbGF0Zm9ybSA9IHBsYXRmb3JtOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBzdXBlci5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJQbGF0Zm9ybSIsIF9wbGF0Zm9ybSk7CisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RvcmVNYW5hZ2VyIG5ld1N0b3JlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVN0b3JlTWFuYWdlcihfc3RvcmVDbHMsIF9zdG9yZVByb3BzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFN0b3JlTWFuYWdlciBjcmVhdGVTdG9yZU1hbmFnZXIoU3RyaW5nIGNscywKKyAgICAgICAgU3RyaW5nIHByb3BzKSB7CisgICAgICAgIEFic3RyYWN0U3RvcmVNYW5hZ2VyIHN0b3JlID0gKEFic3RyYWN0U3RvcmVNYW5hZ2VyKSBDb25maWd1cmF0aW9ucy4KKyAgICAgICAgICAgIG5ld0luc3RhbmNlKGNscywgQWJzdHJhY3RTdG9yZU1hbmFnZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIENvbmZpZ3VyYXRpb25zLmNvbmZpZ3VyZUluc3RhbmNlKHN0b3JlLCBudWxsLCBwcm9wcywKKyAgICAgICAgICAgIFBST1BfQUJTVFJBQ1RfU1RPUkUpOworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKHNfbG9jLmdldCgibm8tc3RvcmUtbWFuYWdlciIsCisgICAgICAgICAgICAgICAgUFJPUF9BQlNUUkFDVF9TVE9SRSkpLnNldEZhdGFsKHRydWUpOworCisgICAgICAgIHJldHVybiBzdG9yZTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2Fic3RyYWN0c3RvcmUvQWJzdHJhY3RTdG9yZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9BYnN0cmFjdFN0b3JlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGZkODEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2Fic3RyYWN0c3RvcmUvQWJzdHJhY3RTdG9yZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuYWJzdHJhY3RzdG9yZTsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlNlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXBwbGljYXRpb25JZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlcjsKKworLyoqCisgKiBBYnN0cmFjdCBzdG9yZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHRvIGVhc2UgZGV2ZWxvcG1lbnQgb2YgY3VzdG9tCisgKiBPcGVuSlBBIGJhY2stZW5kcy4gQSBjb25jcmV0ZSBzdWJjbGFzcyBtdXN0IGRlZmluZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQorICogZm9sbG93aW5nIG1ldGhvZHM6CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rIFN0b3JlTWFuYWdlciNleGlzdHN9PC9saT4KKyAqIDxsaT57QGxpbmsgI2luaXRpYWxpemV9PC9saT4KKyAqIDxsaT57QGxpbmsgI2xvYWR9PC9saT4KKyAqIDxsaT57QGxpbmsKKyAqICNmbHVzaChDb2xsZWN0aW9uLENvbGxlY3Rpb24sQ29sbGVjdGlvbixDb2xsZWN0aW9uLENvbGxlY3Rpb24pfTwvbGk+CisgKiA8bGk+e0BsaW5rICNleGVjdXRlRXh0ZW50fTwvbGk+CisgKiA8L3VsPiBBZGRpdGlvbmFsbHksIHN1YmNsYXNzZXMgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGFjcXVpcmUgcmVzb3VyY2VzCisgKiB1bnRpbCB7QGxpbmsgI29wZW59IGhhcyBiZWVuIGNhbGxlZC4gU3RvcmUgbWFuYWdlciBpbnN0YW5jZXMgbWlnaHQgYmUKKyAqIGNyZWF0ZWQgdG8gY2FsbCBtZXRhZGF0YSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNuZXdDb25maWd1cmF0aW9ufSBvcgorICoge0BsaW5rICNnZXRVbnN1cHBvcnRlZE9wdGlvbnN9IGFuZCBuZXZlciBvcGVuZWQuIFRoZXNlIGluc3RhbmNlcyBzaG91bGQKKyAqIG5vdCBjb25zdW1lIGFueSBkYXRhIHN0b3JlIHJlc291cmNlcy4KKyAqICBOb3RlczoKKyAqIDx1bD4KKyAqIDxsaT5UaGUge0BsaW5rIFN0b3JlTWFuYWdlciNpbml0aWFsaXplfSBtZXRob2QgaXMgcmVzcG9uc2libGUKKyAqIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzIG9mIG9iamVjdHMgZnJlc2hseSBsb2FkZWQgZnJvbSB0aGUKKyAqIGRhdGFiYXNlLiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXJ9CisgKiB0aGF0IHRoZSBuZXdseS1sb2FkZWQgb2JqZWN0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguIFRvIGNyZWF0ZSB0aGUKKyAqIG5ldyBvYmplY3QgYW5kIHNldCB1cCB0aGlzIGFzc29jaWF0aW9uIGNvcnJlY3RseSwgdGhlIGltcGxlbWVudGF0aW9uCisgKiBzaG91bGQgdXNlIHRoZSB7QGxpbmsgT3BlbkpQQVN0YXRlTWFuYWdlciNpbml0aWFsaXplfSBtZXRob2QuPC9saT4KKyAqIDxsaT5JZiB5b3VyIGRhdGEgc3RvcmUgc3VwcG9ydHMgc29tZSBzb3J0IG9mIHRyYW5zYWN0aW9uIG9yCisgKiB1bml0IG9mIHdvcmssIHlvdSBzaG91bGQgb3ZlcnJpZGUgdGhlIHtAbGluayAjYmVnaW59LCB7QGxpbmsgI2NvbW1pdH0sCisgKiBhbmQge0BsaW5rICNyb2xsYmFja30gbWV0aG9kcy48L2xpPgorICogPGxpPlRoaXMgY2xhc3MgcHJvdmlkZXMgbm8gaW5mcmFzdHJ1Y3R1cmUgc3VwcG9ydCBmb3Igb3B0aW1pc3RpYworICogdHJhbnNhY3Rpb25zLiBUbyBwcm92aWRlIG9wdGltaXN0aWMgdHJhbnNhY3Rpb24gc3VwcG9ydDoKKyAqIDx1bD4KKyAqIDxsaT5PdmVycmlkZSB7QGxpbmsgI2JlZ2luT3B0aW1pc3RpY30sIHtAbGluayAjcm9sbGJhY2tPcHRpbWlzdGljfSwKKyAqIGFuZCB7QGxpbmsgI3N5bmNWZXJzaW9ufS48L2xpPgorICogPGxpPk92ZXJyaWRlIHtAbGluayAjZ2V0VW5zdXBwb3J0ZWRPcHRpb25zfSB0byBub3QgaW5jbHVkZSB7QGxpbmsKKyAqIE9wZW5KUEFDb25maWd1cmF0aW9uI09QVElPTl9PUFRJTUlTVElDfSBpbiB0aGUgbGlzdCBvZiB1bnN1cHBvcnRlZAorICogb3B0aW9ucy48L2xpPgorICogPGxpPkVuc3VyZSB0aGF0IHlvdXIgZmx1c2ggaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgbmV4dAorICogdmVyc2lvbiBmb3IgZWFjaCBtb2RpZmllZCBvYmplY3QgdmlhIHRoZSB7QGxpbmsKKyAqIE9wZW5KUEFTdGF0ZU1hbmFnZXIjc2V0TmV4dFZlcnNpb259IG1ldGhvZC48L2xpPgorICogPGxpPklmIHlvdXIgdmVyc2lvbiBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHtAbGluayBDb21wYXJhYmxlfSwKKyAqIG92ZXJyaWRlIHtAbGluayAjY29tcGFyZVZlcnNpb259LCB3aGljaCByZWxpZXMgb24gdGhlCisgKiB7QGxpbmsgQ29tcGFyYWJsZSNjb21wYXJlVG99IG1ldGhvZC48L2xpPgorICogPC91bD48L2xpPgorICogPGxpPklmIHlvdXIgZGF0YSBzdG9yZSBzdXBwb3J0cyBhIG1lY2hhbmlzbSBmb3IgYXV0b21hdGljYWxseQorICogZ2VuZXJhdGluZyBhbmQgbWFuYWdpbmcgaWRlbnRpdHkgdmFsdWVzIChvciBpZiB5b3Ugd2FudCB0bworICogcHJvdmlkZSB0aGF0IGZhY2lsaXR5IG9uIHRvcCBvZiB5b3VyIGRhdGEgc3RvcmUpLCBpbXBsZW1lbnQKKyAqIHRoZSB7QGxpbmsgI2dldERhdGFTdG9yZUlkU2VxdWVuY2V9IG1ldGhvZCBpZiB5b3Ugd2FudCB0byB1c2UgYQorICogPGNvZGU+bG9uZzwvY29kZT4gYXMgeW91ciBkYXRhc3RvcmUgaWRlbnRpdHkgdHlwZSBhbmQgYXJlCisgKiBoYXBweSB3aXRoIE9wZW5KUEEncyB7QGxpbmsgSWR9IGNsYXNzLiBUbyB1c2UgYW5vdGhlciBkYXRhc3RvcmUgaWRlbnRpdHkKKyAqIHR5cGUsIG92ZXJyaWRlIHtAbGluayAjZ2V0TWFuYWdlZFR5cGV9LAorICoge0BsaW5rICNnZXREYXRhU3RvcmVJZFR5cGV9LCB7QGxpbmsgI2NvcHlEYXRhU3RvcmVJZH0sIGFuZAorICoge0BsaW5rICNuZXdEYXRhU3RvcmVJZH0gaW5zdGVhZC4gSW4gZWl0aGVyIGNhc2UsIG92ZXJyaWRlCisgKiB7QGxpbmsgI2dldFVuc3VwcG9ydGVkT3B0aW9uc30gdG8gbm90IGluY2x1ZGUKKyAqIHtAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNPUFRJT05fSURfREFUQVNUT1JFfSBpbiB0aGUgbGlzdCBvZgorICogdW5zdXBwb3J0ZWQgb3B0aW9ucy48L2xpPgorICogPGxpPklmIHlvdXIgZGF0YSBzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXJpZXMgKG9yIGlmIHlvdSBkbworICogbm90IHdhbnQgdG8gY29udmVydCBPcGVuSlBBJ3MgcXVlcnkgcGFyc2UgdHJlZSBpbnRvIGEKKyAqIGRhdGFzdG9yZS1zcGVjaWZpYyBxdWVyeSksIHlvdSBzdGlsbCBoYXZlIHR3byBvcHRpb25zIGluIHRlcm1zCisgKiBvZiBxdWVyeSBleGVjdXRpb246CisgKiA8dWw+CisgKiA8bGk+PGVtPkluLW1lbW9yeSBleGVjdXRpb248L2VtPjogSWYgeW91CisgKiBleGVjdXRlIGEgcXVlcnkgYWdhaW5zdCBhbiBleHRlbnQgb3IgYSBjbGFzcywgT3BlbkpQQSB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIGZ1bGwgZXh0ZW50IG9mIG9iamVjdHMgaW50byBtZW1vcnkgYW5kCisgKiBleGVjdXRlIHRoZSBxdWVyeSBpbiBtZW1vcnkuPC9saT4KKyAqIDxsaT48ZW0+b3BlbmpwYS5NZXRob2RRTDwvZW0+OiBNZXRob2RRTCBhbGxvd3MKKyAqIHlvdSB0byB1c2UgdGhlIHF1ZXJ5IEFQSXMgdG8gZXhlY3V0ZSBhIG1ldGhvZCB0aGF0IGZpbmRzCisgKiBkYXRhIGluIHlvdXIgYmFjay1lbmQgYW5kIHJldHVybnMgdGhhdCBkYXRhIGFzIGEKKyAqIHtAbGluayBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRMaXN0fS4gRm9yIG1vcmUgZGV0YWlscyBvbgorICogTWV0aG9kUUwsIHNlZSB0aGUgT3BlbkpQQSBSZWZlcmVuY2UgR3VpZGUuPC9saT4KKyAqIDwvdWw+PC9saT4KKyAqIDwvdWw+CisgKgorICogQHNpbmNlIDAuMy4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JlTWFuYWdlcgorICAgIGltcGxlbWVudHMgU3RvcmVNYW5hZ2VyIHsKKworICAgIHByb3RlY3RlZCBTdG9yZUNvbnRleHQgY3R4OworCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q29udGV4dChTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMuY3R4ID0gY3R4OworICAgICAgICBvcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFN0b3JlQ29udGV4dH0gdGhhdCB0aGlzIHN0b3JlIG1hbmFnZXIgaXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHVibGljIFN0b3JlQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY3R4OworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vLW9wIGltcGxlbWVudGF0aW9uLiBSZWFkeSB0aGlzIHN0b3JlIG1hbmFnZXIgZm9yIHBlcnNpc3RlbnQgb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvcGVuKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vLW9wIGltcGxlbWVudGF0aW9uLiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIG9wdGltaXN0aWMKKyAgICAgKiBsb2NraW5nIHNlbWFudGljcyBmb3IgeW91ciBkYXRhIHN0b3JlIGlmIHlvdSBuZWVkIG5vdGlmaWNhdGlvbiBvZgorICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgYW4gb3B0aW1pc3RpYyB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbk9wdGltaXN0aWMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AgaW1wbGVtZW50YXRpb24uIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgb3B0aW1pc3RpYworICAgICAqIGxvY2tpbmcgc2VtYW50aWNzIGZvciB5b3VyIGRhdGEgc3RvcmUgaWYgeW91IG5lZWQgbm90aWZpY2F0aW9uIG9mCisgICAgICogYSByb2xsYmFjayBvZiBhbiBvcHRpbWlzdGljIHRyYW5zYWN0aW9uIGJlZm9yZSB7QGxpbmsgI2JlZ2lufSBpcyBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrT3B0aW1pc3RpYygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuSlBBIGFzc3VtZXMgdGhhdCBhZnRlciB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBhbGwgZGF0YQorICAgICAqIGFjY2Vzc2VzIHRocm91Z2ggdGhpcyBzdG9yZSBtYW5hZ2VyIHdpbGwgYmUgcGFydCBvZiBhIHNpbmdsZQorICAgICAqIHVuaXQgb2Ygd29yayB0aGF0IGNhbiBiZSByb2xsZWQgYmFjay4KKyAgICAgKiAgVGhpcyBpcyBhIG5vLW9wIGltcGxlbWVudGF0aW9uLiBJZiB5b3VyIGRhdGEgc3RvcmUgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IGFueSBjb25jZXB0IG9mIGxvY2tpbmcgb3IgdHJhbnNhY3Rpb25zLCB5b3UgbmVlZCBub3QKKyAgICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbm8tb3AgaW1wbGVtZW50YXRpb24uIElmIHlvdXIgZGF0YSBzdG9yZSBkb2VzIG5vdAorICAgICAqIGhhdmUgYSBjb25jZXB0IG9mIHRyYW5zYWN0aW9ucyBvciBhIHVuaXQgb2Ygd29yaywgeW91IG5lZWQgbm90CisgICAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGl0IGRvZXMsIHRoZW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KKyAgICAgKiBub3RpZnkgdGhlIGRhdGEgc3RvcmUgdGhhdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzaG91bGQgYmUgY29tbWl0dGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbm8tb3AgaW1wbGVtZW50YXRpb24uIElmIHlvdXIgZGF0YSBzdG9yZSBkb2VzIG5vdAorICAgICAqIGhhdmUgYSBjb25jZXB0IG9mIHRyYW5zYWN0aW9ucyBvciBhIHVuaXQgb2Ygd29yaywgeW91IG5lZWQgbm90CisgICAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGl0IGRvZXMsIHRoZW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KKyAgICAgKiBub3RpZnkgdGhlIGRhdGEgc3RvcmUgdGhhdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcm9sbGVkIGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2luY2UgdGhpcyBzdG9yZSBtYW5hZ2VyIGRvZXMgbm90IHByb3ZpZGUgb3B0aW1pc3RpYyBsb2NraW5nCisgICAgICogc3VwcG9ydCwgdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1ZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgT2JqZWN0IGVkYXRhKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBPcGVuSlBBIG5lZWRzIHRvIGxvYWQgYW4gb2JqZWN0IHdob3NlCisgICAgICogaWRlbnRpdHkgaXMga25vd24gYnV0IHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkIGZyb20gdGhlIGRhdGEKKyAgICAgKiBzdG9yZS4gPGNvZGU+c208L2NvZGU+IGlzIGEgcGFydGlhbGx5LXNldC11cCBzdGF0ZSBtYW5hZ2VyIGZvciB0aGlzCisgICAgICogb2JqZWN0LiBUaGUgSUQgYW5kIGxlYXN0LWRlcml2ZWQgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGluc3RhbmNlCisgICAgICogdG8gbG9hZCBjYW4gYmUgb2J0YWluZWQgYnkgaW52b2tpbmcKKyAgICAgKiA8Y29kZT5zbS5nZXRPYmplY3RJZCgpPC9jb2RlPiBhbmQgPGNvZGU+c20uZ2V0TWV0YURhdGEoKTwvY29kZT4uCisgICAgICogCisgICAgICogIFdoZW4gaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kLCBsb2FkIHRoZSBkYXRhIGZvciB0aGlzIG9iamVjdCBmcm9tCisgICAgICogdGhlIGRhdGEgc3RvcmUsIGRldGVybWluZSB0aGUgbW9zdC1kZXJpdmVkIHN1YmNsYXNzIG9mIHRoZSBuZXdseS1sb2FkZWQKKyAgICAgKiBkYXRhLCBhbmQgdGhlbiB1c2UgdGhlIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyI2luaXRpYWxpemV9IG1ldGhvZCB0bworICAgICAqIHBvcHVsYXRlIDxjb2RlPnNtPC9jb2RlPiB3aXRoIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICAgICAqIE9uY2Uge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXIjaW5pdGlhbGl6ZX0gaGFzIGJlZW4gaW52b2tlZCwgcHJvY2VlZCB0bworICAgICAqIGxvYWQgZmllbGQgZGF0YSBpbnRvIDxjb2RlPnNtPC9jb2RlPiBhcyBpbiB0aGUge0BsaW5rICNsb2FkfSBtZXRob2QsIGJ5CisgICAgICogdXNpbmcge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXIjc3RvcmV9IChvciB0aGUgYXBwcm9wcmlhdGUKKyAgICAgKiA8Y29kZT5PcGVuSlBBU3RhdGVNYW5hZ2VyLnN0b3JlPGVtPnR5cGU8L2VtPjwvY29kZT4gbWV0aG9kKSB0byBwdXQgdGhlCisgICAgICogZGF0YSBpbnRvIHRoZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaW5pdGlhbGl6ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBQQ1N0YXRlIHN0YXRlLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBlZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gT3BlbkpQQSBuZWVkcyB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YQorICAgICAqIGludG8gYW4gb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhdCBsZWFzdCBwYXJ0aWFsbHkgbG9hZGVkIGJ5CisgICAgICogYSBwcmV2aW91cyB7QGxpbmsgI2luaXRpYWxpemV9IGludm9jYXRpb24uCisgICAgICogIExvYWQgZGF0YSBpbnRvIDxjb2RlPnNtPC9jb2RlPiBieSB1c2luZyB7QGxpbmsKKyAgICAgKiBPcGVuSlBBU3RhdGVNYW5hZ2VyI3N0b3JlfSAob3IgdGhlIGFwcHJvcHJpYXRlCisgICAgICogPGNvZGU+T3BlbkpQQVN0YXRlTWFuYWdlci5zdG9yZTxlbT50eXBlPC9lbT48L2NvZGU+IG1ldGhvZCkgdG8gcHV0IHRoZQorICAgICAqIGRhdGEgaW50byB0aGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLCBPYmplY3QgZWRhdGEpOworCisgICAgLyoqCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBqdXN0IGRlbGVnYXRlcyB0byB0aGUgcHJvcGVyIHNpbmd1bGFyCisgICAgICogbWV0aG9kICh7QGxpbmsgU3RvcmVNYW5hZ2VyI2luaXRpYWxpemV9IG9yIHtAbGluayBTdG9yZU1hbmFnZXIjbG9hZH0pCisgICAgICogZGVwZW5kaW5nIG9uIGVhY2ggc3RhdGUgbWFuYWdlcidzIHN0YXRlLiBJZiB5b3VyIGRhdGEgc3RvcmUgcHJvdmlkZXMKKyAgICAgKiBidWxrIGxvYWRpbmcgQVBJcywgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB0byBiZSBtb3JlIGNsZXZlciBtYXkgYmUKKyAgICAgKiBhZHZhbnRhZ2VvdXMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gbG9hZEFsbChDb2xsZWN0aW9uIHNtcywgUENTdGF0ZSBzdGF0ZSwgaW50IGxvYWQsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGVkYXRhKSB7CisgICAgICAgIHJldHVybiBJbXBsSGVscGVyLmxvYWRBbGwoc21zLCB0aGlzLCBzdGF0ZSwgbG9hZCwgZmV0Y2gsIGVkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCcmVha3MgZG93biA8Y29kZT5zdGF0ZXM8L2NvZGU+IGJhc2VkIG9uIHRoZSBvYmplY3RzJyBjdXJyZW50CisgICAgICogc3RhdGVzLCBhbmQgZGVsZWdhdGVzIHRvCisgICAgICoge0BsaW5rICNmbHVzaChDb2xsZWN0aW9uLENvbGxlY3Rpb24sQ29sbGVjdGlvbixDb2xsZWN0aW9uLENvbGxlY3Rpb24pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBmbHVzaChDb2xsZWN0aW9uIHNtcykgeworICAgICAgICAvLyBicmVhayBkb3duIHN0YXRlIG1hbmFnZXJzIGJ5IHN0YXRlOyBpbml0aWFsaXplIGFzIGVtcHR5IGxpc3RzOworICAgICAgICAvLyB1c2UgY29uc3RhbnRzIGZvciBlZmZpY2llbmN5CisgICAgICAgIENvbGxlY3Rpb24gcE5ldyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIENvbGxlY3Rpb24gcE5ld1VwZGF0ZWQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBDb2xsZWN0aW9uIHBOZXdGbHVzaGVkRGVsZXRlZCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIENvbGxlY3Rpb24gcERpcnR5ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgQ29sbGVjdGlvbiBwRGVsZXRlZCA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNtID0gKE9wZW5KUEFTdGF0ZU1hbmFnZXIpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuUE5FVyAmJiAhc20uaXNGbHVzaGVkKCkpCisgICAgICAgICAgICAgICAgcE5ldy5hZGQoc20pOworICAgICAgICAgICAgZWxzZSBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuUE5FVyAmJiBzbS5pc0ZsdXNoZWQoKSkKKyAgICAgICAgICAgICAgICBwTmV3VXBkYXRlZC5hZGQoc20pOworICAgICAgICAgICAgZWxzZSBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuUE5FV0ZMVVNIRURERUxFVEVEKQorICAgICAgICAgICAgICAgIHBOZXdGbHVzaGVkRGVsZXRlZC5hZGQoc20pOworICAgICAgICAgICAgZWxzZSBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuUERJUlRZKQorICAgICAgICAgICAgICAgIHBEaXJ0eS5hZGQoc20pOworICAgICAgICAgICAgZWxzZSBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuUERFTEVURUQpCisgICAgICAgICAgICAgICAgcERlbGV0ZWQuYWRkKHNtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vIGRpcnR5IGluc3RhbmNlcyB0byBmbHVzaD8KKyAgICAgICAgaWYgKHBOZXcuaXNFbXB0eSgpICYmIHBOZXdVcGRhdGVkLmlzRW1wdHkoKQorICAgICAgICAgICAgJiYgcE5ld0ZsdXNoZWREZWxldGVkLmlzRW1wdHkoKSAmJiBwRGlydHkuaXNFbXB0eSgpCisgICAgICAgICAgICAmJiBwRGVsZXRlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKworICAgICAgICByZXR1cm4gZmx1c2gocE5ldywgcE5ld1VwZGF0ZWQsIHBOZXdGbHVzaGVkRGVsZXRlZCwgcERpcnR5LCBwRGVsZXRlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVmb3JlU3RhdGVDaGFuZ2UoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUENTdGF0ZSBmcm9tU3RhdGUsCisgICAgICAgIFBDU3RhdGUgdG9TdGF0ZSkgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFzc2lnbk9iamVjdElkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGJvb2xlYW4gcHJlRmx1c2gpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgaWYgKG1ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5JRF9BUFBMSUNBVElPTikKKyAgICAgICAgICAgIHJldHVybiBBcHBsaWNhdGlvbklkcy5hc3NpZ24oc20sIHRoaXMsIHByZUZsdXNoKTsKKworICAgICAgICAvLyBkYXRhc3RvcmUgaWRlbnRpdHkKKyAgICAgICAgT2JqZWN0IHZhbCA9IEltcGxIZWxwZXIuZ2VuZXJhdGVJZGVudGl0eVZhbHVlKGN0eCwgbWV0YSwKKyAgICAgICAgICAgIEphdmFUeXBlcy5MT05HKTsKKyAgICAgICAgcmV0dXJuIGFzc2lnbkRhdGFTdG9yZUlkKHNtLCB2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbiBhIG5ldyBkYXRhc3RvcmUgaWRlbnRpdHkgdG8gdGhlIGdpdmVuIGluc3RhbmNlLiBUaGlzIGdpdmVuCisgICAgICogdmFsdWUgbWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzaWduRGF0YVN0b3JlSWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgT2JqZWN0IHZhbCkgeworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBzbS5nZXRNZXRhRGF0YSgpOworICAgICAgICBpZiAodmFsID09IG51bGwgJiYgbWV0YS5nZXRJZGVudGl0eVN0cmF0ZWd5KCkgIT0gVmFsdWVTdHJhdGVnaWVzLk5BVElWRSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgdmFsID0gZ2V0RGF0YVN0b3JlSWRTZXF1ZW5jZShtZXRhKS5uZXh0KGN0eCwgbWV0YSk7CisgICAgICAgIHNtLnNldE9iamVjdElkKG5ld0RhdGFTdG9yZUlkKHZhbCwgbWV0YSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25GaWVsZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBpbnQgZmllbGQsCisgICAgICAgIGJvb2xlYW4gcHJlRmx1c2gpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgT2JqZWN0IHZhbCA9IEltcGxIZWxwZXIuZ2VuZXJhdGVGaWVsZFZhbHVlKGN0eCwgZm1kKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzbS5zdG9yZShmaWVsZCwgdmFsKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldE1hbmFnZWRUeXBlKE9iamVjdCBvaWQpIHsKKyAgICAgICAgaWYgKG9pZCBpbnN0YW5jZW9mIElkKQorICAgICAgICAgICAgcmV0dXJuICgoSWQpIG9pZCkuZ2V0VHlwZSgpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGF0YVN0b3JlSWRUeXBlKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gSWQuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjb3B5RGF0YVN0b3JlSWQoT2JqZWN0IG9pZCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIElkIGlkID0gKElkKSBvaWQ7CisgICAgICAgIHJldHVybiBuZXcgSWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksIGlkLmdldElkKCksCisgICAgICAgICAgICBpZC5oYXNTdWJjbGFzc2VzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3RGF0YVN0b3JlSWQoT2JqZWN0IHZhbCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIC8vIHdlIHVzZSBiYXNlIHR5cGVzIGZvciBhbGwgb2lkcworICAgICAgICB3aGlsZSAobWV0YS5nZXRQQ1N1cGVyY2xhc3MoKSAhPSBudWxsKQorICAgICAgICAgICAgbWV0YSA9IG1ldGEuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgcmV0dXJuIElkLm5ld0luc3RhbmNlKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCB2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRvIHJldGFpbiBhIGRlZGljYXRlZCBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldGFpbkNvbm5lY3Rpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gcmVsZWFzZSBwcmV2aW91c2x5LXJldGFpbmVkIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZUNvbm5lY3Rpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gSWYgeW91ciBkYXRhIHN0b3JlIGNhbiBwcm92aWRlIGEKKyAgICAgKiBkaXN0aW5jdCBjb25uZWN0aW9uIG9iamVjdCwgcmV0dXJuIGl0IGhlcmUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDbGllbnRDb25uZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgUmVzdWx0T2JqZWN0UHJvdmlkZXJ9IHRoYXQgY2FuIHJldHVybiBhbGwgaW5zdGFuY2VzCisgICAgICogb2YgPGNvZGU+dHlwZTwvY29kZT4sIG9wdGlvbmFsbHkgaW5jbHVkaW5nIHN1YmNsYXNzZXMgYXMgZGVmaW5lZAorICAgICAqIGJ5IDxjb2RlPnN1YmNsYXNzZXM8L2NvZGU+LgorICAgICAqICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc3VsdCBwcm92aWRlciB3aWxsIHR5cGljYWxseSBleGVjdXRlCisgICAgICogc29tZSBzb3J0IG9mIGRhdGEgc3RvcmUgcXVlcnkgdG8gZmluZCBhbGwgdGhlIGFwcGxpY2FibGUgb2JqZWN0cywgbG9vcAorICAgICAqIHRocm91Z2ggdGhlIHJlc3VsdHMsIGV4dHJhY3Rpbmcgb2JqZWN0IElEcyBmcm9tIHRoZSBkYXRhLCBhbmQgaW52b2tlCisgICAgICoge0BsaW5rIFN0b3JlQ29udGV4dCNmaW5kKE9iamVjdCxGZXRjaENvbmZpZ3VyYXRpb24sQml0U2V0LE9iamVjdCxpbnQpfQorICAgICAqIG9uIGVhY2ggT0lELiBXaGVuIGludm9raW5nIHRoaXMgbWV0aG9kLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIE9JRC4KKyAgICAgKiBUaGUgc2Vjb25kIGlzIHRoZSBnaXZlbiBmZXRjaCBjb25maWd1cmF0aW9uLiBUaGUKKyAgICAgKiB0aGlyZCBhcmd1bWVudCBpcyBhIG1hc2sgb2YgZmllbGRzIHRvIGV4Y2x1ZGUgZnJvbSBsb2FkaW5nOyBpdCB3aWxsCisgICAgICogdHlwaWNhbGx5IGJlIG51bGwuIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0aHJvdWdoIHRvIHtAbGluayAjaW5pdGlhbGl6ZX0gb3Ige0BsaW5rICNsb2FkfSwgYW5kIHR5cGljYWxseSB3aWxsCisgICAgICogY29udGFpbiB0aGUgYWN0dWFsIGRhdGEgdG8gbG9hZC4gRm9yIGV4YW1wbGUsIGZvciBhIEpEQkMtYmFzZWQgc3RvcmUKKyAgICAgKiBtYW5hZ2VyLCB0aGlzIG1pZ2h0IGJlIHRoZSByZXN1bHQgc2V0IHRoYXQgaXMgYmVpbmcgaXRlcmF0ZWQgb3Zlci4gSWYKKyAgICAgKiB0aGlzIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSB7QGxpbmsgI2luaXRpYWxpemV9IG9yCisgICAgICoge0BsaW5rICNsb2FkfSBtZXRob2Qgd2lsbCBoYXZlIHRvIGlzc3VlIGFub3RoZXIgY29tbWFuZCB0byB0aGUgZGF0YQorICAgICAqIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIHRoZSBkYXRhIHRvIGJlIGxvYWRlZC4gCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVFeHRlbnQoQ2xhc3NNZXRhRGF0YSBtZXRhLAorICAgICAgICBib29sZWFuIHN1YnMsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCk7CisKKyAgICBwdWJsaWMgU3RvcmVRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBuZXdGZXRjaENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgRmV0Y2hDb25maWd1cmF0aW9uSW1wbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhc3RzIDxjb2RlPnYxPC9jb2RlPiBhbmQgPGNvZGU+djI8L2NvZGU+IHRvIHtAbGluayBDb21wYXJhYmxlfSwgYW5kCisgICAgICogaW52b2tlcyA8Y29kZT52MS5jb21wYXJlVG8gKHYyKTwvY29kZT4uIElmIDxjb2RlPnYxPC9jb2RlPiBpcyBsZXNzCisgICAgICogdGhhbiA8Y29kZT52MjwvY29kZT4sIHJldHVybnMge0BsaW5rICNWRVJTSU9OX0VBUkxJRVJ9LiBJZiB0aGUgc2FtZSwKKyAgICAgKiByZXR1cm5zIHtAbGluayAjVkVSU0lPTl9TQU1FfS4gT3RoZXJ3aXNlLCByZXR1cm5zIHtAbGluaworICAgICAqICNWRVJTSU9OX0xBVEVSfS4gSWYgZWl0aGVyIDxjb2RlPnYxPC9jb2RlPiBvciA8Y29kZT52MjwvY29kZT4gYXJlCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybnMge0BsaW5rICNWRVJTSU9OX0RJRkZFUkVOVH0uCisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXJlVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHN0YXRlLCBPYmplY3QgdjEsIE9iamVjdCB2MikgeworICAgICAgICBpZiAodjEgPT0gbnVsbCB8fCB2MiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFZFUlNJT05fRElGRkVSRU5UOworCisgICAgICAgIGludCBjb21wYXJlID0gKChDb21wYXJhYmxlKSB2MSkuY29tcGFyZVRvKChDb21wYXJhYmxlKSB2Mik7CisgICAgICAgIGlmIChjb21wYXJlIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBWRVJTSU9OX0VBUkxJRVI7CisgICAgICAgIGlmIChjb21wYXJlID09IDApCisgICAgICAgICAgICByZXR1cm4gVkVSU0lPTl9TQU1FOworICAgICAgICByZXR1cm4gVkVSU0lPTl9MQVRFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0tY29uZmlndXJlZCBzZXF1ZW5jZS4gVG8gdXNlIHNvbWUgb3RoZXIgc29ydAorICAgICAqIG9mIGRhdGFzdG9yZSBpZGVudGlmaWVyIChhIEdVSUQsIHN0cmluZywgb3Igc29tZXRpbmcgb2YgdGhhdCBuYXR1cmUpLAorICAgICAqIG92ZXJyaWRlIHtAbGluayAjZ2V0TWFuYWdlZFR5cGV9LAorICAgICAqIHtAbGluayAjZ2V0RGF0YVN0b3JlSWRUeXBlfSwge0BsaW5rICNjb3B5RGF0YVN0b3JlSWR9LAorICAgICAqIHtAbGluayAjbmV3RGF0YVN0b3JlSWR9LgorICAgICAqLworICAgIHB1YmxpYyBTZXEgZ2V0RGF0YVN0b3JlSWRTZXF1ZW5jZShDbGFzc01ldGFEYXRhIGZvckNsYXNzKSB7CisgICAgICAgIHJldHVybiBjdHguZ2V0Q29uZmlndXJhdGlvbigpLmdldFNlcXVlbmNlSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG51bGwuCisgICAgICovCisgICAgcHVibGljIFNlcSBnZXRWYWx1ZVNlcXVlbmNlKEZpZWxkTWV0YURhdGEgZm9yRmllbGQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uIElmIHlvdXIgZGF0YSBzdG9yZSBzdXBwb3J0cworICAgICAqIGNhbmNlbGxpbmcgcXVlcmllcywgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbmNlbCBhbnkKKyAgICAgKiBjdXJyZW50bHktcnVubmluZyBxdWVyaWVzIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55CisgICAgICogd2VyZSBjYW5jZWxsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsQWxsKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzcG9uc2libGUgZm9yIHdyaXRpbmcgbW9kaWZpY2F0aW9ucyBoYXBwZW5lZCBiYWNrIHRvIHRoZSBkYXRhCisgICAgICogc3RvcmUuIElmIHlvdSBkbyBub3QgcmVtb3ZlIHRoZQorICAgICAqIHtAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNPUFRJT05fSU5DX0ZMVVNIfSBvcHRpb24gaW4KKyAgICAgKiB7QGxpbmsgI2dldFVuc3VwcG9ydGVkT3B0aW9uc30sIHRoaXMgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZQorICAgICAqIGVuZAlvZiBhIHRyYW5zYWN0aW9uLiBPdGhlcndpc2UsIGl0IG1heSBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5CisgICAgICogdGhyb3VnaG91dCB0aGUgY291cnNlIG9mIGEgdHJhbnNhY3Rpb24uCisgICAgICogIElmIHRoaXMgc3RvcmUgbWFuYWdlciBzdXBwb3J0cyBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucywgZGF0YXN0b3JlCisgICAgICogdmVyc2lvbiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgdXBkYXRlZCBkdXJpbmcgZmx1c2gsIGFuZCB0aGUgc3RhdGUKKyAgICAgKiBtYW5hZ2VyJ3MgdmVyc2lvbiBpbmRpY2F0b3Igc2hvdWxkIGJlIHVwZGF0ZWQgdGhyb3VnaCB0aGUKKyAgICAgKiB7QGxpbmsgT3BlbkpQQVN0YXRlTWFuYWdlciNzZXROZXh0VmVyc2lvbn0gbWV0aG9kLgorICAgICAqICBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgaW52b2tlZCBpZiB0aGVyZSBhcmUgbWVhbmluZ2Z1bCBjaGFuZ2VzCisgICAgICogdG8gc3RvcmUuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgU3RvcmVNYW5hZ2VyI2ZsdXNofSwKKyAgICAgKiB3aGljaCBtYXkgYmUgaW52b2tlZCB3aXRoIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzIGluIHN0YXRlcyB0aGF0CisgICAgICogZG8gbm90IHJlcXVpcmUgYW55IGRhdGFzdG9yZSBhY3Rpb24gKGZvciBleGFtcGxlLCBvYmplY3RzIGluIHRoZQorICAgICAqIHRyYW5zaWVudC10cmFuc2FjdGlvbmFsIHN0YXRlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwTmV3IE9iamVjdHMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHN0b3JlLAorICAgICAqIGFuZCB0aGF0IGhhdmUgbm90IHByZXZpb3VzbHkgYmVlbiBmbHVzaGVkLgorICAgICAqIEBwYXJhbSBwTmV3VXBkYXRlZCBOZXcgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZQorICAgICAqIHRoZXkgd2VyZSBpbml0aWFsbHkgZmx1c2hlZC4gVGhlc2Ugd2VyZQorICAgICAqIGluIDxjb2RlPnBlcnNpc3RlbnROZXc8L2NvZGU+IGluIGFuIGVhcmxpZXIgZmx1c2ggaW52b2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcE5ld0ZsdXNoZWREZWxldGVkIE5ldyBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGRlbGV0ZWQgc2luY2UKKyAgICAgKiB0aGV5IHdlcmUgaW5pdGlhbGx5IGZsdXNoZWQuIFRoZXNlIHdlcmUKKyAgICAgKiBpbiA8Y29kZT5wZXJzaXN0ZW50TmV3PC9jb2RlPiBpbiBhbiBlYXJsaWVyIGZsdXNoIGludm9jYXRpb24uCisgICAgICogQHBhcmFtIHBEaXJ0eSBPYmplY3RzIHRoYXQgd2VyZSBsb2FkZWQgZnJvbSB0aGUgZGF0YQorICAgICAqIHN0b3JlIGFuZCBoYXZlIHNpbmNlIGJlZW4gbW9kaWZpZWQuCisgICAgICogQHBhcmFtIHBEZWxldGVkIE9iamVjdHMgdGhhdCB3ZXJlIGxvYWRlZCBmcm9tIHRoZSBkYXRhCisgICAgICogc3RvcmUgYW5kIGhhdmUgc2luY2UgYmVlbiBkZWxldGVkLiBUaGVzZQorICAgICAqIG1heSBoYXZlIGJlZW4gaW4gYSBwcmV2aW91cyBmbHVzaCBpbnZvY2F0aW9uJ3MgcGVyc2lzdGVudERpcnR5IGxpc3QuCisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZCBkdXJpbmcgZmx1c2hpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENvbGxlY3Rpb24gZmx1c2goQ29sbGVjdGlvbiBwTmV3LAorICAgICAgICBDb2xsZWN0aW9uIHBOZXdVcGRhdGVkLCBDb2xsZWN0aW9uIHBOZXdGbHVzaGVkRGVsZXRlZCwKKyAgICAgICAgQ29sbGVjdGlvbiBwRGlydHksIENvbGxlY3Rpb24gcERlbGV0ZWQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIHRoaXMgcnVudGltZS4gQ29uZmlndXJhdGlvbgorICAgICAqIGRhdGEgaXMgbWFpbnRhaW5lZCBhdCB0aGUgZmFjdG9yeSBsZXZlbCBhbmQgaXMgYXZhaWxhYmxlIHRvIGFsbCBPcGVuSlBBCisgICAgICogY29tcG9uZW50czsgdGhlcmVmb3JlIGl0IGlzIGEgZ29vZCBwbGFjZSB0byBtYWludGFpbiBzaGFyZWQgcmVzb3VyY2VzCisgICAgICogc3VjaCBhcyBjb25uZWN0aW9uIHBvb2xzLCBldGMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9wZW5KUEFDb25maWd1cmF0aW9uIG5ld0NvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiBvcHRpb24gbmFtZXMgdGhhdCB0aGlzIHN0b3JlIG1hbmFnZXIgZG9lcworICAgICAqIG5vdCBzdXBwb3J0LiBCeSBkZWZhdWx0LCByZXR1cm5zIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgT3BlbkpQQUNvbmZpZ3VyYXRpb24jT1BUSU9OX09QVElNSVNUSUN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9uI09QVElPTl9JRF9EQVRBU1RPUkV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9uI09QVElPTl9JTkNfRkxVU0h9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9uI09QVElPTl9WQUxVRV9BVVRPQVNTSUdOfTwvbGk+CisgICAgICogPGxpPntAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNPUFRJT05fVkFMVUVfSU5DUkVNRU5UfTwvbGk+CisgICAgICogPGxpPntAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNPUFRJT05fREFUQVNUT1JFX0NPTk5FQ1RJT059PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldFVuc3VwcG9ydGVkT3B0aW9ucygpIHsKKyAgICAgICAgQ29sbGVjdGlvbiBjID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgYy5hZGQoT3BlbkpQQUNvbmZpZ3VyYXRpb24uT1BUSU9OX09QVElNSVNUSUMpOworICAgICAgICBjLmFkZChPcGVuSlBBQ29uZmlndXJhdGlvbi5PUFRJT05fSURfREFUQVNUT1JFKTsKKyAgICAgICAgYy5hZGQoT3BlbkpQQUNvbmZpZ3VyYXRpb24uT1BUSU9OX0lOQ19GTFVTSCk7CisgICAgICAgIGMuYWRkKE9wZW5KUEFDb25maWd1cmF0aW9uLk9QVElPTl9WQUxVRV9BVVRPQVNTSUdOKTsKKyAgICAgICAgYy5hZGQoT3BlbkpQQUNvbmZpZ3VyYXRpb24uT1BUSU9OX1ZBTFVFX0lOQ1JFTUVOVCk7CisgICAgICAgIGMuYWRkKE9wZW5KUEFDb25maWd1cmF0aW9uLk9QVElPTl9EQVRBU1RPUkVfQ09OTkVDVElPTik7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSB0byBpZGVudGlmeSB0aGUgcGxhdGZvcm0gb2YgdGhpcworICAgICAqIHN0b3JlIG1hbmFnZXIuIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgb2YgdGhpcyBzdG9yZSBtYW5hZ2VyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybSAoKQorCXsKKwkJcmV0dXJuIGdldENsYXNzICgpLmdldE5hbWUgKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9hYnN0cmFjdHN0b3JlL3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4MmMyYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw3NyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxodG1sPgorPGJvZHk+Cis8cD48c3Ryb25nPk9wZW5KUEEgQWJzdHJhY3QgU3RvcmVNYW5hZ2VyIEltcGxlbWVudGF0aW9uPC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgc29tZSBpbmZyYXN0cnVjdHVyZSBjbGFzc2VzIHRvIGhlbHAgaW4gdGhlIGNyZWF0aW9uCisgICAgb2YgT3BlbkpQQSBkcml2ZXJzIGZvciBuZXcgbm9uLXJlbGF0aW9uYWwgZGF0YSBzdG9yZXMuCis8L3A+CisKKzxwPgorICAgIFRvIGNyZWF0ZSBzdXBwb3J0IGZvciBhIG5ldyBkYXRhIHN0b3JlOgorICAgIDx1bD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgRXh0ZW5kIDxjb2RlPkFic3RyYWN0U3RvcmVNYW5hZ2VyPC9jb2RlPiBmb2xsb3dpbmcgdGhlIHJ1bGVzCisgICAgICAgICAgICAgICAgb3V0bGluZWQgaW4gaXRzIGRvY3VtZW50YXRpb24uCisgICAgICAgICAgICA8L3A+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIENvbmZpZ3VyZSB5b3VyIG9yZy5hcGFjaGUub3BlbmpwYS5wcm9wZXJ0aWVzIGZpbGUgKG9yIHlvdXIKKyAgICAgICAgICAgICAgICByZXNvdXJjZSBhcmNoaXZlCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlKSB0byB1c2UgPGNvZGU+CisgICAgICAgICAgICAgICAgQWJzdHJhY3RTdG9yZUJyb2tlckZhY3Rvcnk8L2NvZGU+LAorICAgICAgICAgICAgICAgIGFuZCBzcGVjaWZ5IHlvdXIgPGNvZGU+QWJzdHJhY3RTdG9yZTwvY29kZT4gZXh0ZW5zaW9uIGFzIHRoZQorICAgICAgICAgICAgICAgIDxjb2RlPgorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEuYWJzdHJhY3RzdG9yZS5BYnN0cmFjdFN0b3JlTWFuYWdlcjwvY29kZT4KKyAgICAgICAgICAgICAgICBjbGFzczoKKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGNvZGU+CisgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5Ccm9rZXJGYWN0b3J5OiBhYnN0cmFjdHN0b3JlPGJyLz4KKyAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLmFic3RyYWN0c3RvcmUuQWJzdHJhY3RTdG9yZU1hbmFnZXI6CisgICAgICAgICAgICAgICAgICAgIGNvbS54eXouTXlBYnN0cmFjdFN0b3JlTWFuYWdlclN1YmNsYXNzCisgICAgICAgICAgICAgICAgPC9jb2RlPgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L2xpPgorICAgIDwvdWw+Cis8L3A+CisKKzxwPgorICAgIEFkZGl0aW9uYWxseSwgeW91IGNhbiBvcHRpb25hbGx5IGV4dGVuZCA8Y29kZT4KKyAgICBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGw8L2NvZGU+CisgICAgdG8gZGVmaW5lIHlvdXIgb3duIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgdXNpbmcgdGhlIGhlbHBlciBjbGFzc2VzIGRlZmluZWQKKyAgICBpbiB0aGUgPGEgaHJlZj0iLi4vLi4vb3BlbmpwYS9jb25mL3BhY2thZ2UuaHRtbCI+CisgICAgPGNvZGU+b3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mPC9jb2RlPjwvYT4gcGFja2FnZS4gVG8gZG8gdGhpcyB5b3UgbXVzdAorICAgIGFsc28KKyAgICBvdmVycmlkZSB0aGUgPGNvZGU+QWJzdHJhY3RTdG9yZU1hbmFnZXIubmV3Q29uZmlndXJhdGlvbjwvY29kZT4gbWV0aG9kLgorPC9wPgorCis8cD4KKyAgICBGb3IgYSBzYW1wbGUgb2YgaG93IHRvIHVzZSB0aGlzIHBhY2thZ2UsIHNlZSB0aGUKKyAgICA8YSBocmVmPSIuLi94bWwvcGFja2FnZS5odG1sIj48Y29kZT5vcmcuYXBhY2hlLm9wZW5qcGEueG1sc3RvcmU8L2NvZGU+PC9hPgorICAgIGFic3RyYWN0CisgICAgc3RvcmUgaW1wbGVtZW50YXRpb24uCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9BcHBsaWNhdGlvbklkVG9vbFRhc2suamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYW50L0FwcGxpY2F0aW9uSWRUb29sVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyMzIwMDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9BcHBsaWNhdGlvbklkVG9vbFRhc2suamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuYW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5BcHBsaWNhdGlvbklkVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmFudC5BYnN0cmFjdFRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Db2RlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5GaWxlczsKKworLyoqCisgKiA8cD5FeGVjdXRlcyB0aGUgYXBwbGljYXRpb24gaWQgdG9vbCBvbiB0aGUgc3BlY2lmaWVkIGZpbGVzLiAgVGhpcyB0YXNrCisgKiBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5kaXJlY3Rvcnk8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5pZ25vcmVFcnJvcnM8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5uYW1lPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+c3VmZml4PC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+dG9rZW48L2NvZGU+PC9saT4KKyAqIDwvdWw+CisgKiBJdCBjYW4gYWxzbyB0YWtlIGFuIGVtYmVkZGVkIDxjb2RlPmNvZGVGb3JtYXQ8L2NvZGU+IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzCisgKiBmb3IgdGhlIGJlYW4gcHJvcGVydGllcyBvZiB0aGUge0BsaW5rIENvZGVGb3JtYXR9LjwvcD4KKyAqLworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSWRUb29sVGFzaworICAgIGV4dGVuZHMgQWJzdHJhY3RUYXNrIHsKKworICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbklkVG9vbC5GbGFncyBmbGFncyA9IG5ldyBBcHBsaWNhdGlvbklkVG9vbC5GbGFncygpOworICAgIHByb3RlY3RlZCBTdHJpbmcgZGlyTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbklkVG9vbFRhc2soKSB7CisgICAgICAgIGZsYWdzLmZvcm1hdCA9IG5ldyBDb2RlRm9ybWF0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdlIHdhbnQgdGhlIGVuaGFuY2VyIHRvIHdyaXRlIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyTmFtZSkgeworICAgICAgICB0aGlzLmRpck5hbWUgPSBkaXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGlnbm9yZSBlcnJvcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlRXJyb3JzKGJvb2xlYW4gaWdub3JlRXJyb3JzKSB7CisgICAgICAgIGZsYWdzLmlnbm9yZUVycm9ycyA9IGlnbm9yZUVycm9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGlkZW50aXR5IGNsYXNzOyB3aXRoIHRoaXMgb3B0aW9uIHlvdSBtdXN0IHN1cHBseQorICAgICAqIGV4YWN0bHkgb25lIGNsYXNzIHRvIHJ1biBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZsYWdzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHN1ZmZpeCB0byBhcHBlbmQgdG8gcGVyc2lzdGVudCBjbGFzc2VzIHRvIGZvcm0gdGhlaXIgaWRlbnRpdHkKKyAgICAgKiBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1ZmZpeChTdHJpbmcgc3VmZml4KSB7CisgICAgICAgIGZsYWdzLnN1ZmZpeCA9IHN1ZmZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRva2VuIHRvIHNlcGFyYXRlIHN0cmluZ2lmaWVkIHByaW1hcnkga2V5IGZpZWxkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgZmxhZ3MudG9rZW4gPSB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGVtYmVkZGVkIGNvZGUgZm9ybWF0IGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb2RlRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gZmxhZ3MuZm9ybWF0OworICAgIH0KKworICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wbCBuZXdDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IE9wZW5KUEFDb25maWd1cmF0aW9uSW1wbCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPbihTdHJpbmdbXSBmaWxlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgZmxhZ3MuZGlyZWN0b3J5ID0gKGRpck5hbWUgPT0gbnVsbCkgPyBudWxsCisgICAgICAgICAgICA6IEZpbGVzLmdldEZpbGUoZGlyTmFtZSwgZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIEFwcGxpY2F0aW9uSWRUb29sLnJ1bigoT3BlbkpQQUNvbmZpZ3VyYXRpb24pIGdldENvbmZpZ3VyYXRpb24oKSwgZmlsZXMsCisgICAgICAgICAgICBmbGFncywgZ2V0Q2xhc3NMb2FkZXIgKCkpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYW50L01ldGFEYXRhVG9vbFRhc2suamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYW50L01ldGFEYXRhVG9vbFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFlYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9hbnQvTWV0YURhdGFUb29sVGFzay5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmFudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuYW50LkFic3RyYWN0VGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFUb29sOworCisvKioKKyAqIEV4ZWN1dGVzIHRoZSBtZXRhZGF0YSB0b29sIG9uIHRoZSBzcGVjaWZpZWQgZmlsZXMuIFRoaXMgdGFzayBjYW4KKyAqIHRha2UgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CisgKiA8dWw+CisgKiA8bGk+PGNvZGU+ZmlsZTwvY29kZT48L2xpPgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIE1ldGFEYXRhVG9vbFRhc2sKKyAgICBleHRlbmRzIEFic3RyYWN0VGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChNZXRhRGF0YVRvb2xUYXNrLmNsYXNzKTsKKworICAgIHByb3RlY3RlZCBNZXRhRGF0YVRvb2wuRmxhZ3MgZmxhZ3MgPSBuZXcgTWV0YURhdGFUb29sLkZsYWdzKCk7CisgICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRvb2wgYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihBY3Rpb24gYWN0KSB7CisgICAgICAgIGZsYWdzLmFjdGlvbiA9IGFjdC5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsZSB0byB3cml0ZSB0aGUgbWV0YWRhdGEgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wbCBuZXdDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IE9wZW5KUEFDb25maWd1cmF0aW9uSW1wbCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPbihTdHJpbmdbXSBmaWxlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKCJzdGRvdXQiLmVxdWFscyhmaWxlTmFtZSkpCisgICAgICAgICAgICBmbGFncy53cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisgICAgICAgIGVsc2UgaWYgKCJzdGRlcnIiLmVxdWFscyhmaWxlTmFtZSkpCisgICAgICAgICAgICBmbGFncy53cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVycik7CisgICAgICAgIGVsc2UgaWYgKGZpbGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICBmbGFncy5maWxlID0gRmlsZXMuZ2V0RmlsZShmaWxlTmFtZSwgbG9hZGVyKTsKKyAgICAgICAgaWYgKCFNZXRhRGF0YVRvb2wucnVuKChPcGVuSlBBQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpLCBmaWxlcywKKyAgICAgICAgICAgIGZsYWdzLCBudWxsLCBsb2FkZXIpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtY29uZiIsICJNZXRhRGF0YVRvb2xUYXNrIikKKyAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGlvbgorICAgICAgICBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gTWV0YURhdGFUb29sLkFDVElPTlM7CisgICAgICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9QQ0VuaGFuY2VyVGFzay5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9hbnQvUENFbmhhbmNlclRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJmZGEwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9hbnQvUENFbmhhbmNlclRhc2suamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRW5oYW5jZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5hbnQuQWJzdHJhY3RUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworCisvKioKKyAqIEV4ZWN1dGVzIHRoZSBlbmhhbmNlciBvbiB0aGUgc3BlY2lmaWVkIGZpbGVzLiBUaGlzIHRhc2sgY2FuIHRha2UKKyAqIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPjxjb2RlPmRpcmVjdG9yeTwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPmFkZERlZmF1bHRDb25zdHJ1Y3RvcjwvY29kZT48L2xpPgorICogPGxpPjxjb2RlPnRtcENsYXNzTG9hZGVyPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+ZW5mb3JjZVByb3BlcnR5UmVzdHJpY3Rpb25zPC9jb2RlPjwvbGk+CisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgUENFbmhhbmNlclRhc2sKKyAgICBleHRlbmRzIEFic3RyYWN0VGFzayB7CisKKyAgICBwcm90ZWN0ZWQgUENFbmhhbmNlci5GbGFncyBmbGFncyA9IG5ldyBQQ0VuaGFuY2VyLkZsYWdzKCk7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkaXJOYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSB3ZSB3YW50IHRoZSBlbmhhbmNlciB0byB3cml0ZSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpck5hbWUpIHsKKyAgICAgICAgdGhpcy5kaXJOYW1lID0gZGlyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIGVuaGFuY2VyIHNob3VsZCBhZGQgYSBuby1hcmdzIGNvbnN0cnVjdG9yCisgICAgICogdG8gYW55IFBDIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG5vLWFyZ3MgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkRGVmYXVsdENvbnN0cnVjdG9yKGJvb2xlYW4gYWRkRGVmQ29ucykgeworICAgICAgICBmbGFncy5hZGREZWZhdWx0Q29uc3RydWN0b3IgPSBhZGREZWZDb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGZhaWwgaWYgdGhlIHBlcnNpc3RlbnQgdHlwZSB1c2VzIHByb3BlcnR5IGFjY2VzcyBhbmQKKyAgICAgKiBieXRlY29kZSBhbmFseXNpcyBzaG93cyB0aGF0IGl0IG1heSBiZSB2aW9sYXRpbmcgT3BlbkpQQSdzIHByb3BlcnR5CisgICAgICogYWNjZXNzIHJlc3RyaWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMoYm9vbGVhbiBmYWlsKSB7CisgICAgICAgIGZsYWdzLmVuZm9yY2VQcm9wZXJ0eVJlc3RyaWN0aW9ucyA9IGZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIGRlZmF1bHQgY2xhc3MgbG9hZGVyIGZvciBsb2FkaW5nCisgICAgICogdGhlIHVuZW5oYW5jZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbXBDbGFzc0xvYWRlcihib29sZWFuIHRtcENsYXNzTG9hZGVyKSB7CisgICAgICAgIGZsYWdzLnRtcENsYXNzTG9hZGVyID0gdG1wQ2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25JbXBsIG5ld0NvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9uKFN0cmluZ1tdIGZpbGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmbGFncy5kaXJlY3RvcnkgPSAoZGlyTmFtZSA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogRmlsZXMuZ2V0RmlsZShkaXJOYW1lLCBnZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiA9IChPcGVuSlBBQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MgPSBjb25mLm5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgIFBDRW5oYW5jZXIucnVuKGNvbmYsIGZpbGVzLCBmbGFncywgcmVwb3MsIG51bGwsIGdldENsYXNzTG9hZGVyICgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxZDg2MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvYW50L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQSBBbnQgVGFza3M8L3N0cm9uZz48L3A+CisKKzxwPgorICAgIEFudCB0YXNrcyBmb3IgT3BlbkpQQSB0b29scy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9BdXRvRGV0YWNoVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9BdXRvRGV0YWNoVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFjMDljCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0F1dG9EZXRhY2hWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmNvbmY7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BdXRvRGV0YWNoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5TdHJpbmdMaXN0VmFsdWU7CisKKy8qKgorICogVmFsdWUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBhdXRvIGRldGFjaCBmbGFncy4gU2VwYXJhdGUgdG8KKyAqIG9wdGltaXplIHRyYW5zbGF0aW9uIG9mIFN0cmluZ3MgdG8gYml0IGZsYWdzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAbm9qYXZhZG9jCisgKi8KK2NsYXNzIEF1dG9EZXRhY2hWYWx1ZQorICAgIGV4dGVuZHMgU3RyaW5nTGlzdFZhbHVlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFDSF9DTE9TRSA9ICJjbG9zZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUNIX0NPTU1JVCA9ICJjb21taXQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFDSF9ST0xMQkFDSz0gInJvbGxiYWNrIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBQ0hfTk9OVFhSRUFEID0gIm5vbnR4LXJlYWQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gQUxJQVNFUyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgREVUQUNIX0NMT1NFLCBTdHJpbmcudmFsdWVPZihBdXRvRGV0YWNoLkRFVEFDSF9DTE9TRSksCisgICAgICAgIERFVEFDSF9DT01NSVQsIFN0cmluZy52YWx1ZU9mKEF1dG9EZXRhY2guREVUQUNIX0NPTU1JVCksCisgICAgICAgIERFVEFDSF9OT05UWFJFQUQsIFN0cmluZy52YWx1ZU9mKEF1dG9EZXRhY2guREVUQUNIX05PTlRYUkVBRCksCisgICAgICAgIERFVEFDSF9ST0xMQkFDSywgU3RyaW5nLnZhbHVlT2YoQXV0b0RldGFjaC5ERVRBQ0hfUk9MTEJBQ0spLAorICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEpETyBEZXRhY2hBbGxPbkNvbW1pdAorICAgICAgICAidHJ1ZSIsIFN0cmluZy52YWx1ZU9mKEF1dG9EZXRhY2guREVUQUNIX0NPTU1JVCksCisgICAgICAgICJmYWxzZSIsICIwIiwKKyAgICB9OworICAgIAorICAgIHByaXZhdGUgaW50IF9mbGFnczsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZsYWdzU2V0OworCisgICAgcHVibGljIEF1dG9EZXRhY2hWYWx1ZSgpIHsKKyAgICAgICAgc3VwZXIoIkF1dG9EZXRhY2giKTsKKyAgICAgICAgc2V0QWxpYXNlcyhBTElBU0VTKTsKKyAgICAgICAgc2V0QWxpYXNMaXN0Q29tcHJlaGVuc2l2ZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nW10uY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uc3RhbnQoaW50IGZsYWdzKSB7CisgICAgICAgIF9mbGFncyA9IGZsYWdzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29uc3RhbnQoKSB7CisgICAgICAgIGlmICghX2ZsYWdzU2V0KSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWxzID0gZ2V0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEludGVnZXIucGFyc2VJbnQodW5hbGlhcyh2YWxzW2ldKSk7CisgICAgICAgICAgICBfZmxhZ3NTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIF9mbGFnczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdCBnZXRBbGlhc0xpc3QoKSB7CisgICAgICAgIC8vIFdlIGRvIG5vdCBkb2N1bWVudCB0aGUgbnVtZXJpYyB2YWx1ZXMgYW5kIHRoZXkgYXJlIG5vdAorICAgICAgICAvLyBoZWxwZnVsIHRvIHNvbWVvbmUgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgQUxJQVNFUy5sZW5ndGg7IHggKz0gMikKKyAgICAgICAgICAgIGxpc3QuYWRkKEFMSUFTRVNbeF0pOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvQnJva2VyRmFjdG9yeVZhbHVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvQnJva2VyRmFjdG9yeVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwYTExMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9Ccm9rZXJGYWN0b3J5VmFsdWUuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5jb25mOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuYWJzdHJhY3RzdG9yZS5BYnN0cmFjdFN0b3JlQnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUGx1Z2luVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUHJvZHVjdERlcml2YXRpb247CisKKy8qKgorICogVmFsdWUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUge0BsaW5rIEJyb2tlckZhY3Rvcnl9LiBUaGlzIHR5cGUgaXMKKyAqIGRlZmluZWQgc2VwYXJhdGVseSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJvdGggaW4gdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uCisgKiBhbmQgaW4ge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQm9vdHN0cmFwfSB3aXRoIHRoZSBzYW1lCisgKiBlbmNhcHN1bGF0ZWQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9rZXJGYWN0b3J5VmFsdWUKKyAgICBleHRlbmRzIFBsdWdpblZhbHVlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJCcm9rZXJGYWN0b3J5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIF9hbGlhc2VzOworICAgIHN0YXRpYyB7CisgICAgICAgIE1hcCBhbGlhc2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgYWxpYXNlcy5wdXQoImFic3RyYWN0c3RvcmUiLCAKKyAgICAgICAgICAgIEFic3RyYWN0U3RvcmVCcm9rZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIFByb2R1Y3REZXJpdmF0aW9uW10gZHMgPSBQcm9kdWN0RGVyaXZhdGlvbnMuZ2V0UHJvZHVjdERlcml2YXRpb25zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkc1tpXSBpbnN0YW5jZW9mIE9wZW5KUEFQcm9kdWN0RGVyaXZhdGlvbikKKyAgICAgICAgICAgICAgICAoKE9wZW5KUEFQcm9kdWN0RGVyaXZhdGlvbikgZHNbaV0pLnB1dEJyb2tlckZhY3RvcnlBbGlhc2VzCisgICAgICAgICAgICAgICAgICAgIChhbGlhc2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIF9hbGlhc2VzID0gbmV3IFN0cmluZ1thbGlhc2VzLnNpemUoKSAqIDJdOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFsaWFzZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgX2FsaWFzZXNbaSsrXSA9IChTdHJpbmcpIGUuZ2V0S2V5KCk7CisgICAgICAgICAgICBfYWxpYXNlc1tpKytdID0gKFN0cmluZykgZS5nZXRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpZiBzZXQgaW4gdGhlIGdpdmVuIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldChDb25maWd1cmF0aW9uUHJvdmlkZXIgY3ApIHsKKyAgICAgICAgTWFwIHByb3BzID0gY3AuZ2V0UHJvcGVydGllcygpOworICAgICAgICByZXR1cm4gcHJvcHMuZ2V0KFByb2R1Y3REZXJpdmF0aW9ucy5nZXRDb25maWd1cmF0aW9uS2V5KEtFWSwgcHJvcHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaW4gdGhlIGdpdmVuIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoQ29uZmlndXJhdGlvblByb3ZpZGVyIGNwLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IFByb2R1Y3REZXJpdmF0aW9ucy5nZXRDb25maWd1cmF0aW9uS2V5KEtFWSwgCisgICAgICAgICAgICBjcC5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICBjcC5hZGRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VyRmFjdG9yeVZhbHVlKCkgeworICAgICAgICBzdXBlcihLRVksIGZhbHNlKTsKKyAgICAgICAgc2V0QWxpYXNlcyhfYWxpYXNlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0Jyb2tlclZhbHVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvQnJva2VyVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhkMGUyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0Jyb2tlclZhbHVlLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5QbHVnaW5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaW5hbGl6aW5nQnJva2VySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKKworLyoqCisgKiBDdXN0b20ge0BsaW5rIFBsdWdpblZhbHVlfSB0aGF0IGNhbiBlZmZpY2llbnRseSBjcmVhdGUge0BsaW5rIEJyb2tlckltcGx9CisgKiBpbnN0YW5jZXMuCisgKgorICogQHNpbmNlIDAuOS43CisgKi8KK3B1YmxpYyBjbGFzcyBCcm9rZXJWYWx1ZSAKKyAgICBleHRlbmRzIFBsdWdpblZhbHVlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJCcm9rZXJJbXBsIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fRklOQUxJWklOR19BTElBUyA9ICJub24tZmluYWxpemluZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BTElBUyA9ICJkZWZhdWx0IjsKKworICAgIHByaXZhdGUgQnJva2VySW1wbCBfdGVtcGxhdGVCcm9rZXI7CisKKyAgICBwdWJsaWMgQnJva2VyVmFsdWUoKSB7CisgICAgICAgIHN1cGVyKEtFWSwgZmFsc2UpOworICAgICAgICBTdHJpbmdbXSBhbGlhc2VzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIERFRkFVTFRfQUxJQVMsIEZpbmFsaXppbmdCcm9rZXJJbXBsLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgIE5PTl9GSU5BTElaSU5HX0FMSUFTLCBCcm9rZXJJbXBsLmNsYXNzLmdldE5hbWUoKSwgCisgICAgICAgIH07CisgICAgICAgIHNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIHNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIHNldFN0cmluZyhhbGlhc2VzWzBdKTsgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsc05hbWUsIENsYXNzIHR5cGUsIENvbmZpZ3VyYXRpb24gY29uZiwKKyAgICAgICAgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBzeW5jaHJvbml6ZWQuIElmIHRoZXJlIGFyZSBjb25jdXJyZW50IGludm9jYXRpb25zCisgICAgICAgIC8vIHdoaWxlIF90ZW1wbGF0ZUJyb2tlciBpcyBudWxsLCB3ZSdsbCBqdXN0IGVuZCB1cCB3aXRoIGV4dHJhCisgICAgICAgIC8vIHRlbXBsYXRlIGJyb2tlcnMsIHdoaWNoIHdpbGwgZ2V0IHNhZmVseSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgICAgaWYgKF90ZW1wbGF0ZUJyb2tlciA9PSBudWxsKQorICAgICAgICAgICAgX3RlbXBsYXRlQnJva2VyID0gKEJyb2tlckltcGwpIHN1cGVyLm5ld0luc3RhbmNlKGNsc05hbWUsIHR5cGUsCisgICAgICAgICAgICAgICAgY29uZiwgZmF0YWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF90ZW1wbGF0ZUJyb2tlci5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvQ29tcGF0aWJpbGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0NvbXBhdGliaWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFhMDdiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0NvbXBhdGliaWxpdHkuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZjsKKworLyoqCisgKiBTdHJ1Y3QgZW5jb21wYXNzaW5nIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG9wdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfc3RyaWN0SWRWYWx1ZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2hvbGxvd0xvb2t1cHMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2hlY2tTdG9yZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfY29weUlkcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VPbkNvbW1pdCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9xdW90ZWROdW1iZXJzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ub25PcHRpbWlzdGljVmVyc2lvbkNoZWNrID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgZXhhY3QgaWRlbnRpdHkgdmFsdWUgdHlwZXMgd2hlbiBjcmVhdGluZyBvYmplY3QKKyAgICAgKiBpZHMgZnJvbSBhIGNsYXNzIGFuZCB2YWx1ZS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3RyaWN0SWRlbnRpdHlWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBfc3RyaWN0SWRWYWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZXF1aXJlIGV4YWN0IGlkZW50aXR5IHZhbHVlIHR5cGVzIHdoZW4gY3JlYXRpbmcgb2JqZWN0CisgICAgICogaWRzIGZyb20gYSBjbGFzcyBhbmQgdmFsdWUuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdElkZW50aXR5VmFsdWVzKGJvb2xlYW4gc3RyaWN0VmFscykgeworICAgICAgICBfc3RyaWN0SWRWYWx1ZXMgPSBzdHJpY3RWYWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW50ZXJwcmV0IHF1b3RlZCBudW1iZXJzIGluIHF1ZXJ5IHN0cmluZ3MgYXMgbnVtYmVycy4KKyAgICAgKiBPcGVuSlBBIHZlcnNpb25zIDAuMy4xIGFuZCBwcmlvciB0cmVhdGVkIHRoZW0gYXMgbnVtYmVyczsgbW9yZSByZWNlbnQKKyAgICAgKiB2ZXJzaW9ucyB0cmVhdCB0aGVtIGFzIHN0cmluZ3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UXVvdGVkTnVtYmVyc0luUXVlcmllcygpIHsKKyAgICAgICAgcmV0dXJuIF9xdW90ZWROdW1iZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaW50ZXJwcmV0IHF1b3RlZCBudW1iZXJzIGluIHF1ZXJ5IHN0cmluZ3MgYXMgbnVtYmVycy4KKyAgICAgKiBPcGVuSlBBIHZlcnNpb25zIDAuMy4xIGFuZCBwcmlvciB0cmVhdGVkIHRoZW0gYXMgbnVtYmVyczsgbW9yZSByZWNlbnQKKyAgICAgKiB2ZXJzaW9ucyB0cmVhdCB0aGVtIGFzIHN0cmluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVvdGVkTnVtYmVyc0luUXVlcmllcyhib29sZWFuIHF1b3RlZE51bWJlcnMpIHsKKyAgICAgICAgX3F1b3RlZE51bWJlcnMgPSBxdW90ZWROdW1iZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcmV0dXJuIGhvbGxvdyBpbnN0YW5jZXMgdG8gYnJva2VyIGxvb2t1cHMgd2l0aCBhCisgICAgICogPGNvZGU+dmFsaWRhdGU8L2NvZGU+IHBhcmFtZXRlciBvZiBmYWxzZS4gT3BlbkpQQSB2ZXJzaW9ucyBwcmlvciB0bworICAgICAqIDAuNC4wIGRpZCBub3QgcmV0dXJuIGhvbGxvdyBpbnN0YW5jZXMgd2l0aG91dCBzcGVjaWFsIGNvbmZpZ3VyYXRpb24KKyAgICAgKiAodGhlIDxjb2RlPk9iamVjdExvb2t1cE1vZGU8L2NvZGU+KS4gQmVnaW5uaW5nIHdpdGggMC40LjAsIGhvbGxvdworICAgICAqIG9iamVjdHMgYXJlIHRoZSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFZhbGlkYXRlRmFsc2VSZXR1cm5zSG9sbG93KCkgeworICAgICAgICByZXR1cm4gX2hvbGxvd0xvb2t1cHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZXR1cm4gaG9sbG93IGluc3RhbmNlcyB0byBicm9rZXIgbG9va3VwcyB3aXRoIGEKKyAgICAgKiA8Y29kZT52YWxpZGF0ZTwvY29kZT4gcGFyYW1ldGVyIG9mIGZhbHNlLiBPcGVuSlBBIHZlcnNpb25zIHByaW9yIHRvCisgICAgICogMC40LjAgZGlkIG5vdCByZXR1cm4gaG9sbG93IGluc3RhbmNlcyB3aXRob3V0IHNwZWNpYWwgY29uZmlndXJhdGlvbgorICAgICAqICh0aGUgPGNvZGU+T2JqZWN0TG9va3VwTW9kZTwvY29kZT4pLiBCZWdpbm5pbmcgd2l0aCAwLjQuMCwgaG9sbG93CisgICAgICogb2JqZWN0cyBhcmUgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVGYWxzZVJldHVybnNIb2xsb3coYm9vbGVhbiBob2xsb3cpIHsKKyAgICAgICAgX2hvbGxvd0xvb2t1cHMgPSBob2xsb3c7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBjaGVjayB0aGUgZGF0YXN0b3JlIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgbm9udHJhbnNhY3Rpb25hbAorICAgICAqIGNhY2hlZCBvYmplY3QgaW4gYnJva2VyIGxvb2t1cHMgd2l0aCBhIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiBwYXJhbWV0ZXIKKyAgICAgKiBvZiB0cnVlLiBPcGVuSlBBIHZlcnNpb25zIHByaW9yIHRvIDAuNC4wIGNoZWNrZWQgdGhlIGRhdGFzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWYWxpZGF0ZVRydWVDaGVja3NTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jaGVja1N0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY2hlY2sgdGhlIGRhdGFzdG9yZSBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIG5vbnRyYW5zYWN0aW9uYWwKKyAgICAgKiBjYWNoZWQgb2JqZWN0IGluIGJyb2tlciBsb29rdXBzIHdpdGggYSA8Y29kZT52YWxpZGF0ZTwvY29kZT4gcGFyYW1ldGVyCisgICAgICogb2YgdHJ1ZS4gT3BlbkpQQSB2ZXJzaW9ucyBwcmlvciB0byAwLjQuMCBjaGVja2VkIHRoZSBkYXRhc3RvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVUcnVlQ2hlY2tzU3RvcmUoYm9vbGVhbiBjaGVjaykgeworICAgICAgICBfY2hlY2tTdG9yZSA9IGNoZWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY29weSBpZGVudGl0eSBvYmplY3RzIGJlZm9yZSByZXR1cm5pbmcgdGhlbSB0byBjbGllbnQgY29kZS4KKyAgICAgKiBWZXJzaW9ucyBvZiBPcGVuSlBBIHByaW9yIHRvIDAuMy4wIGFsd2F5cyBjb3BpZWQgaWRlbnRpdHkgb2JqZWN0cy4gQWxzbywKKyAgICAgKiB5b3Ugc2hvdWxkIGNvbmZpZ3VyZSBPcGVuSlBBIHRvIGNvcHkgaWRlbnRpdHkgb2JqZWN0cyBpZiB5b3UgbXV0YXRlIHRoZW0KKyAgICAgKiBhZnRlciB1c2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29weU9iamVjdElkcygpIHsKKyAgICAgICAgcmV0dXJuIF9jb3B5SWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY29weSBpZGVudGl0eSBvYmplY3RzIGJlZm9yZSByZXR1cm5pbmcgdGhlbSB0byBjbGllbnQgY29kZS4KKyAgICAgKiBWZXJzaW9ucyBvZiBPcGVuSlBBIHByaW9yIHRvIDAuMy4wIGFsd2F5cyBjb3BpZWQgaWRlbnRpdHkgb2JqZWN0cy4gQWxzbywKKyAgICAgKiB5b3Ugc2hvdWxkIGNvbmZpZ3VyZSBPcGVuSlBBIHRvIGNvcHkgaWRlbnRpdHkgb2JqZWN0cyBpZiB5b3UgbXV0YXRlIHRoZW0KKyAgICAgKiBhZnRlciB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29weU9iamVjdElkcyhib29sZWFuIGNvcHkpIHsKKyAgICAgICAgX2NvcHlJZHMgPSBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIGJyb2tlciB3aGVuIHRoZSBtYW5hZ2VkIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisgICAgICogVmVyc2lvbnMgb2YgT3BlbkpQQSBwcmlvciB0byAwLjMuMCBkaWQgbm90IGNsb3NlIHRoZSBicm9rZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2xvc2VPbk1hbmFnZWRDb21taXQoKSB7CisgICAgICAgIHJldHVybiBfY2xvc2VPbkNvbW1pdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBicm9rZXIgd2hlbiB0aGUgbWFuYWdlZCB0cmFuc2FjdGlvbiBjb21taXRzLgorICAgICAqIFZlcnNpb25zIG9mIE9wZW5KUEEgcHJpb3IgdG8gMC4zLjAgZGlkIG5vdCBjbG9zZSB0aGUgYnJva2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb3NlT25NYW5hZ2VkQ29tbWl0KGJvb2xlYW4gY2xvc2UpIHsKKyAgICAgICAgX2Nsb3NlT25Db21taXQgPSBjbG9zZTsKKwl9CQorCisgICAgLyoqIAorICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gYSB2ZXJzaW9uIGNoZWNrIG9uIGluc3RhbmNlcyBiZWluZyB1cGRhdGVkCisgICAgICogaW4gYSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24uIFZlcnNpb24gb2YgT3BlbkpQQSBwcmlvciB0byAwLjQuMSBhbHdheXMKKyAgICAgKiBmb3JjZWQgYSB2ZXJzaW9uIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vbk9wdGltaXN0aWNWZXJzaW9uQ2hlY2sKKyAgICAgICAgKGJvb2xlYW4gbm9uT3B0aW1pc3RpY1ZlcnNpb25DaGVjaykgeworICAgICAgICBfbm9uT3B0aW1pc3RpY1ZlcnNpb25DaGVjayA9IG5vbk9wdGltaXN0aWNWZXJzaW9uQ2hlY2s7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gYSB2ZXJzaW9uIGNoZWNrIG9uIGluc3RhbmNlcyBiZWluZyB1cGRhdGVkCisgICAgICogaW4gYSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24uIFZlcnNpb24gb2YgT3BlbkpQQSBwcmlvciB0byAwLjQuMSBhbHdheXMKKyAgICAgKiBmb3JjZWQgYSB2ZXJzaW9uIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vbk9wdGltaXN0aWNWZXJzaW9uQ2hlY2soKSB7CisgICAgICAgIHJldHVybiBfbm9uT3B0aW1pc3RpY1ZlcnNpb25DaGVjazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvRGV0YWNoT3B0aW9ucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0RldGFjaE9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFiZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL0RldGFjaE9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGV0YWNoU3RhdGU7CisKKy8qKgorICogRGV0YWNoIG9wdGlvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERldGFjaE9wdGlvbnMKKyAgICBpbXBsZW1lbnRzIERldGFjaFN0YXRlIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfZmllbGQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfdHJhbnNpZW50ID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX21hbmFnZXIgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfYWNjZXNzID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgRGV0YWNoU3RhdGV9IGNvbnN0YW50LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGV0YWNoU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYWRkIGEgZGV0YWNoZWQgc3RhdGUgZmllbGQgdG8gZW5oYW5jZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZXRhY2hlZFN0YXRlRmllbGQoKSB7CisgICAgICAgIHJldHVybiBfZmllbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhZGQgYSBkZXRhY2hlZCBzdGF0ZSBmaWVsZCB0byBlbmhhbmNlZCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaGVkU3RhdGVGaWVsZChib29sZWFuIHZhbCkgeworICAgICAgICBfZmllbGQgPSB2YWw7CisgICAgICAgIGlmICghdmFsKQorICAgICAgICAgICAgX21hbmFnZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgYXV0by1jb25maWd1cmF0aW9uIG9mIHRoZSBkZXRhY2hlZCBzdGF0ZSBmaWVsZC4gQWNjZXB0cyB2YWx1ZXMKKyAgICAgKiAidHJ1ZSIsICJmYWxzZSIsIG9yICJ0cmFuc2llbnQiLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaGVkU3RhdGVGaWVsZChTdHJpbmcgdmFsKSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCJ0cmFuc2llbnQiLmVxdWFscyh2YWwpKSB7CisgICAgICAgICAgICBzZXREZXRhY2hlZFN0YXRlRmllbGQodHJ1ZSk7CisgICAgICAgICAgICBfdHJhbnNpZW50ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICgidHJ1ZSIuZXF1YWxzKHZhbCkpIHsKKyAgICAgICAgICAgIHNldERldGFjaGVkU3RhdGVGaWVsZCh0cnVlKTsKKyAgICAgICAgICAgIF90cmFuc2llbnQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICgiZmFsc2UiLmVxdWFscyh2YWwpKSB7CisgICAgICAgICAgICBzZXREZXRhY2hlZFN0YXRlRmllbGQoZmFsc2UpOworICAgICAgICAgICAgX3RyYW5zaWVudCA9IGZhbHNlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRldGFjaGVkU3RhdGVGaWVsZD0iICsgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSB0cmFuc2llbnQgZGV0YWNoZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZXRhY2hlZFN0YXRlVHJhbnNpZW50KCkgeworICAgICAgICByZXR1cm4gX3RyYW5zaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSB0cmFuc2llbnQgZGV0YWNoZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGV0YWNoZWRTdGF0ZVRyYW5zaWVudChib29sZWFuIHZhbCkgeworICAgICAgICBfdHJhbnNpZW50ID0gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGEgZGV0YWNoZWQgc3RhdGUgbWFuYWdlciBvbiB0eXBlcyB0aGF0IGFsbG93IGl0LgorICAgICAqIFR5cGVzIHRoYXQgZG8gbm90IHVzZSBkZXRhY2hlZCBzdGF0ZSBvciB0aGF0IGRlY2xhcmUgYSBjdXN0b20gZGV0YWNoZWQKKyAgICAgKiBzdGF0ZSBmaWVsZCB0byBtYWludGFpbiBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2lsbCBuZXZlciB1c2UKKyAgICAgKiBhIGRldGFjaGVkIHN0YXRlIG1hbmFnZXIuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGV0YWNoZWRTdGF0ZU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBfbWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBhIGRldGFjaGVkIHN0YXRlIG1hbmFnZXIgb24gdHlwZXMgdGhhdCBhbGxvdyBpdC4KKyAgICAgKiBUeXBlcyB0aGF0IGRvIG5vdCB1c2UgZGV0YWNoZWQgc3RhdGUgb3IgdGhhdCBkZWNsYXJlIGEgY3VzdG9tIGRldGFjaGVkCisgICAgICogc3RhdGUgZmllbGQgdG8gbWFpbnRhaW4gc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpbGwgbmV2ZXIgdXNlCisgICAgICogYSBkZXRhY2hlZCBzdGF0ZSBtYW5hZ2VyLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaGVkU3RhdGVNYW5hZ2VyKGJvb2xlYW4gdmFsKSB7CisgICAgICAgIF9tYW5hZ2VyID0gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgYWNjZXNzIHRvIHVubG9hZGVkIGRldGFjaGVkIGZpZWxkcy4gVGhpcyBzZXR0aW5nIG9ubHkKKyAgICAgKiBhcHBsaWVzIHRvIGluc3RhbmNlcyB3aXRoIGRldGFjaGVkIHN0YXRlIG1hbmFnZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEFjY2Vzc1VubG9hZGVkKCkgeworICAgICAgICByZXR1cm4gX2FjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsbG93IGFjY2VzcyB0byB1bmxvYWRlZCBkZXRhY2hlZCBmaWVsZHMuIFRoaXMgc2V0dGluZyBvbmx5CisgICAgICogYXBwbGllcyB0byBpbnN0YW5jZXMgd2l0aCBkZXRhY2hlZCBzdGF0ZSBtYW5hZ2Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NVbmxvYWRlZChib29sZWFuIHZhbCkgeworICAgICAgICBfYWNjZXNzID0gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaCBsb2FkZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2FkZWQKKyAgICAgICAgZXh0ZW5kcyBEZXRhY2hPcHRpb25zIHsKKworICAgICAgICBwdWJsaWMgaW50IGdldERldGFjaFN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIERFVEFDSF9MT0FERUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWJsaWMgdG8gYWxsb3cgcmVmbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZldGNoR3JvdXBzCisgICAgICAgIGV4dGVuZHMgRGV0YWNoT3B0aW9ucyB7CisKKyAgICAgICAgcHVibGljIGludCBnZXREZXRhY2hTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBERVRBQ0hfRkdTOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVibGljIHRvIGFsbG93IHJlZmxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbGwKKyAgICAgICAgZXh0ZW5kcyBEZXRhY2hPcHRpb25zIHsKKworICAgICAgICBwdWJsaWMgaW50IGdldERldGFjaFN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIERFVEFDSF9BTEw7CisJCX0JCQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2NjA2ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVlLk1hbmFnZWRSdW50aW1lOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5PcnBoYW5lZEtleUFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkF1dG9DbGVhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkF1dG9EZXRhY2g7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkNvbm5lY3Rpb25SZXRhaW5Nb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkludmVyc2VNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuTG9ja01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUZsdXNoTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5SZXN0b3JlU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TYXZlcG9pbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU2VxOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DbGFzc1Jlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUZhY2FkZVR5cGVSZWdpc3RyeTsKKworLyoqCisgKiBEZWZpbmVzIHRoZSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgcnVudGltZSBwcm9wZXJ0aWVzIGFuZAorICogY29ubmVjdCB0byBhIGRhdGEgc291cmNlLiBUaGVyZSBpcyBhIDEtMSByZWxhdGlvbiBiZXR3ZWVuIGEgY29uZmlndXJhdGlvbgorICogYW5kIGEge0BsaW5rIEJyb2tlckZhY3Rvcnl9LgorICogIEFsbCBzZXR0ZXIgbWV0aG9kcyB0aGF0IHRha2UgcHJpbWl0aXZlIHBhcmFtZXRlcnMgYWxzbyBoYXZlIHdyYXBwZXIKKyAqIHNldHRlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcmltaXRpdmUgd3JhcHBlci4gVGhpcyBpcyBzbyB0aGUgaW50ZXJmYWNlCisgKiBjYW4gYmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBKMkVFIENvbm5lY3RvciBBcmNoaXRlY3R1cmUuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2VlIENvbmZpZ3VyYXRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBPcGVuSlBBQ29uZmlndXJhdGlvbgorICAgIGV4dGVuZHMgQ29uZmlndXJhdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIGxvZ2dlciBmb3IgbWV0YWRhdGEtcmVsYXRlZCBtZXNzYWdlczoKKyAgICAgKiA8Y29kZT5vcGVuanBhLk1ldGFEYXRhPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfTUVUQURBVEEgPSAib3BlbmpwYS5NZXRhRGF0YSI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIGxvZ2dlciBmb3IgZW5oYW5jZW1lbnQtcmVsYXRlZCBtZXNzYWdlczoKKyAgICAgKiA8Y29kZT5vcGVuanBhLkVuaGFuY2U8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19FTkhBTkNFID0gIm9wZW5qcGEuRW5oYW5jZSI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIGxvZ2dlciBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgcnVudGltZSBzeXN0ZW06CisgICAgICogPGNvZGU+b3BlbmpwYS5SdW50aW1lPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfUlVOVElNRSA9ICJvcGVuanBhLlJ1bnRpbWUiOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBsb2dnZXIgZm9yIHF1ZXJ5IGxvZ2dpbmc6CisgICAgICogPGNvZGU+b3BlbmpwYS5RdWVyeTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1FVRVJZID0gIm9wZW5qcGEuUXVlcnkiOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBsb2dnZXIgZm9yIG1lc3NhZ2VzIGZyb20gdGhlIGRhdGEgY2FjaGU6CisgICAgICogPGNvZGU+b3BlbmpwYS5EYXRhQ2FjaGU8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19EQVRBQ0FDSEUgPSAib3BlbmpwYS5EYXRhQ2FjaGUiOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBsb2dnZXIgZm9yIG1lc3NhZ2VzIGZyb20gdGhlIGRldmVsb3BtZW50IHRvb2xzOgorICAgICAqIDxjb2RlPm9wZW5qcGEuVG9vbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RPT0wgPSAib3BlbmpwYS5Ub29sIjsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgcnVudGltZXMgdGhhdCBzdXBwb3J0IG5vbnRyYW5zYWN0aW9uYWwgcmVhZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX05PTlRSQU5TX1JFQUQgPQorICAgICAgICAib3BlbmpwYS5vcHRpb24uTm9udHJhbnNhY3Rpb25hbFJlYWQiOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHN1cHBvcnQgb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX09QVElNSVNUSUMgPQorICAgICAgICAib3BlbmpwYS5vcHRpb24uT3B0aW1pc3RpYyI7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIHJ1bnRpbWVzIHRoYXQgc3VwcG9ydCBhcHBsaWNhdGlvbiBpZGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fSURfQVBQTElDQVRJT04gPQorICAgICAgICAib3BlbmpwYS5vcHRpb24uQXBwbGljYXRpb25JZGVudGl0eSI7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIHJ1bnRpbWVzIHRoYXQgc3VwcG9ydCBhcHBsaWNhdGlvbiBpZGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fSURfREFUQVNUT1JFID0KKyAgICAgICAgIm9wZW5qcGEub3B0aW9uLkRhdGFzdG9yZUlkZW50aXR5IjsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgU1FMIHN1cHBvcnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1FVRVJZX1NRTCA9ICJvcGVuanBhLm9wdGlvbi5TUUwiOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHN1cHBvcnQgcGVyc2lzdGVudCBjb2xsZWN0aW9uIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVFlQRV9DT0xMRUNUSU9OID0KKyAgICAgICAgIm9wZW5qcGEub3B0aW9uLkNvbGxlY3Rpb24iOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHN1cHBvcnQgcGVyc2lzdGVudCBtYXAgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9UWVBFX01BUCA9ICJvcGVuanBhLm9wdGlvbi5NYXAiOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHN1cHBvcnQgcGVyc2lzdGVudCBhcnJheSBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1RZUEVfQVJSQVkgPSAib3BlbmpwYS5vcHRpb24uQXJyYXkiOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lIHRoYXQgY2FuIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBudWxsIGFuZCBlbXB0eQorICAgICAqIGNvbnRhaW5lciBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX05VTExfQ09OVEFJTkVSID0KKyAgICAgICAgIm9wZW5qcGEub3B0aW9uLk51bGxDb250YWluZXIiOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHN1cHBvcnQgZW1iZWRkZWQgcmVsYXRpb25zIHRvIG90aGVyCisgICAgICogcGVyc2lzdGVuY2UgY2FwYWJsZSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9FTUJFRERFRF9SRUxBVElPTiA9CisgICAgICAgICJvcGVuanBhLm9wdGlvbi5FbWJlZGRlZFJlbGF0aW9uIjsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgcnVudGltZXMgdGhhdCBzdXBwb3J0IGNvbGxlY3Rpb25zIG9mIGVtYmVkZGVkCisgICAgICogcmVsYXRpb25zIHRvIG90aGVyIHBlcnNpc3RlbmNlIGNhcGFibGUgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRU1CRURERURfQ09MTEVDVElPTl9SRUxBVElPTiA9CisgICAgICAgICJvcGVuanBhLm9wdGlvbi5FbWJlZGRlZENvbGxlY3Rpb25SZWxhdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIHJ1bnRpbWVzIHRoYXQgc3VwcG9ydCBtYXBzIG9mIGVtYmVkZGVkCisgICAgICogcmVsYXRpb25zIHRvIG90aGVyIHBlcnNpc3RlbmNlIGNhcGFibGUgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRU1CRURERURfTUFQX1JFTEFUSU9OID0KKyAgICAgICAgIm9wZW5qcGEub3B0aW9uLkVtYmVkZGVkTWFwUmVsYXRpb24iOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHN1cHBvcnQgaW5jcmVtZW50YWwgZmx1c2hpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0lOQ19GTFVTSCA9CisgICAgICAgICJvcGVuanBhLm9wdGlvbi5JbmNyZW1lbnRhbEZsdXNoIjsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgcnVudGltZXMgdGhhdCB0aGUgYXV0b2Fzc2lnbiB2YWx1ZSBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVkFMVUVfQVVUT0FTU0lHTiA9CisgICAgICAgICJvcGVuanBhLm9wdGlvbi5BdXRvYXNzaWduVmFsdWUiOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBydW50aW1lcyB0aGF0IHRoZSBpbmNyZW1lbnQgdmFsdWUgc3RyYXRlZ3kuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1ZBTFVFX0lOQ1JFTUVOVCA9CisgICAgICAgICJvcGVuanBhLm9wdGlvbi5JbmNyZW1lbnRWYWx1ZSI7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIHJ1bnRpbWVzIHRoYXQgc3VwcG9ydCByZXR1cm5pbmcgdGhlIGRhdGFzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9EQVRBU1RPUkVfQ09OTkVDVElPTiA9CisgICAgICAgICJvcGVuanBhLm9wdGlvbi5EYXRhU3RvcmVDb25uZWN0aW9uIjsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgcnVudGltZXMgdGhhdCBzdXBwb3J0IHJldHVybmluZyB0aGUgZGF0YXN0b3JlIGNvbm5lY3Rpb24KKyAgICAgKiB0aGF0IGlzIGEgSkRCQyBDb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9KREJDX0NPTk5FQ1RJT04gPQorICAgICAgICAib3BlbmpwYS5vcHRpb24uSkRCQ0Nvbm5lY3Rpb24iOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Ygb3B0aW9uIHN0cmluZ3Mgc3VwcG9ydGVkIGJ5IHRoaXMgcnVudGltZS4gVGhpcyBzZXQKKyAgICAgKiBpcyBtdXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHN1cHBvcnRlZE9wdGlvbnMoKTsKKworICAgIC8qKgorICAgICAqIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgc2V0IHdpdGggZGVmYXVsdHMgZm9yIGEgc3BlY2lmaWMgc3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmljYXRpb24oKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmljYXRpb24gdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIHVzZSBmb3IgdGhlCisgICAgICogdmFyaW91cyBwcm9wZXJ0aWVzIHRoYXQgbmVlZCB0byBoYXZlIGRpZmZlcmVudCBkZWZhdWx0cyBmb3IgZGlmZmVyZW50CisgICAgICogc3BlYyBlbnZpcm9ubWVudHMuIFRoaXMgc2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIGFueSBjb25maWd1cmF0aW9uCisgICAgICogb3B0aW9ucyBhcmUgc2V0LCBhcyBpdCB3aWxsIG11dGF0ZSB2YXJpb3VzIHZhbHVlcy4KKyAgICAgKiBZb3UgY2FuIG9ubHkgYXNzaWduIHRoZSBzcGVjaWZpY2F0aW9uIG9uY2UsIHRob3VnaCBpdCBpcyBub3QgZmF0YWwKKyAgICAgKiB0byBhdHRlbXB0IHRvIGRvIHNvIG11bHRpcGxlIHRpbWVzLiBBdHRlbXB0cyB0byBzZXQgdG8gbnVsbCB3aWxsCisgICAgICogYmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRTcGVjaWZpY2F0aW9uKFN0cmluZyBzcGVjKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gc3RyaW5nIGZvciB0aGUge0BsaW5rIENsYXNzUmVzb2x2ZXJ9IHRvIHVzZSBmb3IgY3VzdG9tCisgICAgICogY2xhc3MgbG9hZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzUmVzb2x2ZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gc3RyaW5nIGZvciB0aGUge0BsaW5rIENsYXNzUmVzb2x2ZXJ9IHRvIHVzZSBmb3IgY3VzdG9tCisgICAgICogY2xhc3MgbG9hZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1Jlc29sdmVyKFN0cmluZyBjbGFzc1Jlc29sdmVyKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQ2xhc3NSZXNvbHZlcn0gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1Jlc29sdmVyIGdldENsYXNzUmVzb2x2ZXJJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBDbGFzc1Jlc29sdmVyfSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NSZXNvbHZlcihDbGFzc1Jlc29sdmVyIGNsYXNzUmVzb2x2ZXIpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBCcm9rZXJGYWN0b3J5fSBjbGFzcyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCcm9rZXJGYWN0b3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEJyb2tlckZhY3Rvcnl9IGNsYXNzIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCcm9rZXJGYWN0b3J5KFN0cmluZyBmYWN0b3J5KTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gc3RyaW5nIG9mIHRoZSB7QGxpbmsgQnJva2VySW1wbH0gZXh0ZW5zaW9uIHRvIGNyZWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJyb2tlckltcGwoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gc3RyaW5nIG9mIHRoZSB7QGxpbmsgQnJva2VySW1wbH0gZXh0ZW5zaW9uIHRvIGNyZWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCcm9rZXJJbXBsKFN0cmluZyBicm9rZXIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGJyb2tlciBpbnN0YW5jZSB3aXRoIHRoZSBjb25maWd1cmVkIHBsdWdpbiBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXJJbXBsIG5ld0Jyb2tlckluc3RhbmNlKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIERhdGFDYWNoZX0gdG8gdXNlIGZvciBsZXZlbC0yIGRhdGEgc3RvcmUgY2FjaGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBEYXRhQ2FjaGV9IHRvIHVzZSBmb3IgbGV2ZWwtMiBkYXRhIHN0b3JlIGNhY2hpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlKFN0cmluZyBkYXRhQ2FjaGUpOworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgY2FjaGUgbWFuYWdlciBtYW5hZ2VzIHRoaXMgY29uZmlndXJhdGlvbidzIGNhY2hlIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFDYWNoZU1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGNhY2hlIG1hbmFnZXIgbWFuYWdlcyB0aGlzIGNvbmZpZ3VyYXRpb24ncyBjYWNoZSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlTWFuYWdlcihTdHJpbmcgbWdyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGNhY2hlIG1hbmFnZXIgbWFuYWdlcyB0aGlzIGNvbmZpZ3VyYXRpb24ncyBjYWNoZSBpbnN0YW5jZXMuCisgICAgICogVGhlIGNhY2hlIG1hbmFnZXIgaXMgY3JlYXRlZCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0LiBPbmNlIHRoZSBjYWNoZQorICAgICAqIG1hbmFnZXIgaGFzIGJlZW4gc2V0L2NyZWF0ZWQsIGFsbCBjaGFuZ2VzIHRvIGNhY2hpbmcgY29uZmlndXJhdGlvbgorICAgICAqIG11c3QgcHJvY2VlZCB0aHJvdWdoIHRoZSBjYWNoZSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4wCisgICAgICovCisgICAgcHVibGljIERhdGFDYWNoZU1hbmFnZXIgZ2V0RGF0YUNhY2hlTWFuYWdlckluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSBjYWNoZSBtYW5hZ2VyIG1hbmFnZXMgdGhpcyBjb25maWd1cmF0aW9uJ3MgY2FjaGUgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlTWFuYWdlcihEYXRhQ2FjaGVNYW5hZ2VyIG1hbmFnZXIpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBkYXRhIGNhY2hlIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERhdGFDYWNoZVRpbWVvdXQoKTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZGF0YSBjYWNoZSB0aW1lb3V0LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlVGltZW91dChpbnQgdGltZW91dCk7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciBKQ0EgdXNhZ2Ugb2Yge0BsaW5rICNzZXREYXRhQ2FjaGVUaW1lb3V0KGludCl9LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlVGltZW91dChJbnRlZ2VyIHRpbWVvdXQpOworCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiB0byB1c2UgZm9yIGxldmVsLTIgZGF0YSBzdG9yZSBxdWVyeSBjYWNoaW5nLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHRvIHVzZSBmb3IgbGV2ZWwtMiBkYXRhIHN0b3JlIHF1ZXJ5IGNhY2hpbmcuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUNhY2hlKFN0cmluZyBxdWVyeUNhY2hlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRvIGdlbmVyYXRlIGR5bmFtaWMgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICogd2hlcmUgcG9zc2libGUgZm9yIGNhY2hlIGFuZCBydW50aW1lIHVzYWdlLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4zCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHluYW1pY0RhdGFTdHJ1Y3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBnZW5lcmF0ZSBkeW5hbWljIGRhdGEgc3RydWN0dXJlcworICAgICAqIHdoZXJlIHBvc3NpYmxlIGZvciBjYWNoZSBhbmQgcnVudGltZSB1c2FnZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER5bmFtaWNEYXRhU3RydWN0cyhib29sZWFuIGR5bmFtaWMpOworCisgICAgLyoqCisgICAgICogV3JhcHBlciBmb3IgSkNBIHVzYWdlIG9mIHtAbGluayAjc2V0RHluYW1pY0RhdGFTdHJ1Y3RzKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREeW5hbWljRGF0YVN0cnVjdHMoQm9vbGVhbiBkeW5hbWljKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gdG8gdXNlIGZvciBkYXRhc3RvcmUgbG9jayBtYW5hZ2VtZW50LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NrTWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiB0byB1c2UgZm9yIGRhdGFzdG9yZSBsb2NrIG1hbmFnZW1lbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrTWFuYWdlcihTdHJpbmcgbG9ja01hbmFnZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGxvY2sgbWFuYWdlciBpbnN0YW5jZSB1c2luZyB0aGUgY29uZmlndXJlZCBwbHVnaW4gc2V0dGluZ3MuCisgICAgICovCisgICAgcHVibGljIExvY2tNYW5hZ2VyIG5ld0xvY2tNYW5hZ2VySW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gdG8gdXNlIGZvciBtYW5hZ2luZyBpbnZlcnNlIHJlbGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW52ZXJzZU1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gdG8gdXNlIGZvciBtYW5hZ2luZyBpbnZlcnNlIHJlbGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludmVyc2VNYW5hZ2VyKFN0cmluZyBpbnZlcnNlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBpbnZlcnNlIG1hbmFnZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgcGx1Z2luCisgICAgICogc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgSW52ZXJzZU1hbmFnZXIgbmV3SW52ZXJzZU1hbmFnZXJJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiB0byB1c2UgZm9yIHNhdmVwb2ludCBtYW5hZ2VtZW50LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy40CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTYXZlcG9pbnRNYW5hZ2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHRvIHVzZSBmb3Igc2F2ZXBvaW50IG1hbmFnZW1lbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlcG9pbnRNYW5hZ2VyKFN0cmluZyBzYXZlcG9pbnRNYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29uZmlndXJlZCBzYXZlcG9pbnQgbWFuYWdlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2F2ZXBvaW50TWFuYWdlciBnZXRTYXZlcG9pbnRNYW5hZ2VySW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gdG8gdGFrZSB3aGVuIGFuIG9ycGhhbmVkIGtleSBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMi4yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPcnBoYW5lZEtleUFjdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIGFjdGlvbiB0byB0YWtlIHdoZW4gYW4gb3JwaGFuZWQga2V5IGlzIGRldGVjdGVkLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4yLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcnBoYW5lZEtleUFjdGlvbihTdHJpbmcgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gdG8gdGFrZSB3aGVuIGFuIG9ycGhhbmVkIGtleSBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMi4yCisgICAgICovCisgICAgcHVibGljIE9ycGhhbmVkS2V5QWN0aW9uIGdldE9ycGhhbmVkS2V5QWN0aW9uSW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gdG8gdGFrZSB3aGVuIGFuIG9ycGhhbmVkIGtleSBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3JwaGFuZWRLZXlBY3Rpb24oT3JwaGFuZWRLZXlBY3Rpb24gYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gdG8gdXNlIGZvciByZW1vdGUgY29tbWl0IG5vdGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQ29tbWl0UHJvdmlkZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gdG8gdXNlIGZvciByZW1vdGUgY29tbWl0IG5vdGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUNvbW1pdFByb3ZpZGVyKFN0cmluZyByZW1vdGVDb21taXRQcm92aWRlcik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSByZW1vdGUgY29tbWl0IHByb3ZpZGVyIGZyb20gdGhlIGNvbmZpZ3VyZWQgcGx1Z2luLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4wCisgICAgICovCisgICAgcHVibGljIFJlbW90ZUNvbW1pdFByb3ZpZGVyIG5ld1JlbW90ZUNvbW1pdFByb3ZpZGVySW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSByZW1vdGUgZXZlbnQgbWFuYWdlciB0aGF0IG1hbmFnZXMgdGhpcyBjb25maWd1cmF0aW9uJ3MgcmVtb3RlCisgICAgICogZXZlbnQgbGlzdGVuZXJzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4wCisgICAgICovCisgICAgcHVibGljIFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlciBnZXRSZW1vdGVDb21taXRFdmVudE1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSByZW1vdGUgZXZlbnQgbWFuYWdlciB0aGF0IG1hbmFnZXMgdGhpcyBjb25maWd1cmF0aW9uJ3MgcmVtb3RlCisgICAgICogZXZlbnQgbGlzdGVuZXJzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyKFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlciBtYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHRyYW5zYWN0aW9uIG1vZGVsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+bG9jYWw8L2NvZGU+OiBQZXJmb3JtIHRyYW5zYWN0aW9uIG9wZXJhdGlvbnMgbG9jYWxseS48L2xpPgorICAgICAqIDxsaT48Y29kZT5tYW5hZ2VkPC9jb2RlPjogVXNlIG1hbmFnZWQgZW52aXJvbm1lbnQncyBnbG9iYWwKKyAgICAgKiB0cmFuc2FjdGlvbnMuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUcmFuc2FjdGlvbk1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHRyYW5zYWN0aW9uIG1vZGVsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+bG9jYWw8L2NvZGU+OiBQZXJmb3JtIHRyYW5zYWN0aW9uIG9wZXJhdGlvbnMgbG9jYWxseS48L2xpPgorICAgICAqIDxsaT48Y29kZT5tYW5hZ2VkPC9jb2RlPjogVXNlIG1hbmFnZWQgZW52aXJvbm1lbnQncyBnbG9iYWwKKyAgICAgKiB0cmFuc2FjdGlvbnMuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25Nb2RlKFN0cmluZyBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIG1hbmFnZWQgdHJhbnNhY3Rpb25zIGFyZSBiZWluZyB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25Nb2RlTWFuYWdlZCgpOworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgbWFuYWdlZCB0cmFuc2FjdGlvbnMgYXJlIGJlaW5nIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25Nb2RlTWFuYWdlZChib29sZWFuIG1hbmFnZWQpOworCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBzdHJpbmcgZm9yIHRoZSB7QGxpbmsgTWFuYWdlZFJ1bnRpbWV9IHRvIHVzZSBmb3IgbWFuYWdlZAorICAgICAqIGVudmlyb25tZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZWRSdW50aW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHN0cmluZyBmb3IgdGhlIHtAbGluayBNYW5hZ2VkUnVudGltZX0gdG8gdXNlIGZvciBtYW5hZ2VkCisgICAgICogZW52aXJvbm1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnZWRSdW50aW1lKFN0cmluZyBtYW5hZ2VkUnVudGltZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHRvIHVzZSBmb3IgaW50ZWdyYXRpbmcgd2l0aCBhIG1hbmFnZWQgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlZFJ1bnRpbWUgZ2V0TWFuYWdlZFJ1bnRpbWVJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiB0byB1c2UgZm9yIGludGVncmF0aW5nIHdpdGggYSBtYW5hZ2VkIHJ1bnRpbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlZFJ1bnRpbWUoTWFuYWdlZFJ1bnRpbWUgcnVudGltZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHN0cmluZyBmb3IgdGhlIHtAbGluayBQcm94eU1hbmFnZXJ9IHRvIHVzZSBmb3Igc2Vjb25kCisgICAgICogY2xhc3Mgb2JqZWN0IHByb3hpZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm94eU1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gc3RyaW5nIGZvciB0aGUge0BsaW5rIFByb3h5TWFuYWdlcn0gdG8gdXNlIGZvciBzZWNvbmQKKyAgICAgKiBjbGFzcyBvYmplY3QgcHJveGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm94eU1hbmFnZXIoU3RyaW5nIHByb3h5TWFuYWdlcik7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFByb3h5TWFuYWdlcn0gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBQcm94eU1hbmFnZXIgZ2V0UHJveHlNYW5hZ2VySW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgUHJveHlNYW5hZ2VyfSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlNYW5hZ2VyKFByb3h5TWFuYWdlciBtYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG1hcHBpbmcgdG8gdXNlIGZvciB0aGlzIGRhdGEgc3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBtYXBwaW5nIHRvIHVzZSBmb3IgdGhpcyBkYXRhIHN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpOworCisgICAgLyoqCisgICAgICogQSBwbHVnaW4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogQSBwbHVnaW4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUZhY3RvcnkoU3RyaW5nIG1ldGEpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IHRvIHVzZSB3aXRoIGEgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFGYWN0b3J5IG5ld01ldGFEYXRhRmFjdG9yeUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBBIHBsdWdpbiBzdHJpbmcgZGVzY3JpYmluZyB0aGUge0BsaW5rIE1ldGFEYXRhUmVwb3NpdG9yeX0gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFSZXBvc2l0b3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBBIHBsdWdpbiBzdHJpbmcgZGVzY3JpYmluZyB0aGUge0BsaW5rIE1ldGFEYXRhUmVwb3NpdG9yeX0gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhUmVwb3NpdG9yeShTdHJpbmcgbWV0YSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBvZiBtYW5hZ2VkIGNsYXNzIGluZm9ybWF0aW9uLiBJZiBubworICAgICAqIHJlcG9zaXRvcnkgaGFzIGJlZW4gc2V0LCBjcmVhdGVzIG9uZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMAorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBtZXRhZGF0YSByZXBvc2l0b3J5IG9mIHRoZSBjb25maWd1cmVkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIE1ldGFEYXRhUmVwb3NpdG9yeSBuZXdNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhIHJlcG9zaXRvcnkgb2YgbWFuYWdlZCBjbGFzcyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhUmVwb3NpdG9yeShNZXRhRGF0YVJlcG9zaXRvcnkgbWRSZXBvcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBuYW1lIGZvciB0aGUgZGF0YSBzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblVzZXJOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBuYW1lIGZvciB0aGUgZGF0YSBzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Vc2VyTmFtZShTdHJpbmcgY29ubmVjdGlvblVzZXJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXNzd29yZCBmb3IgdGhlIGRhdGEgc3RvcmUgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpOworCisgICAgLyoqCisgICAgICogVGhlIHBhc3N3b3JkIGZvciB0aGUgZGF0YSBzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25QYXNzd29yZChTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkKTsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkwgZm9yIHRoZSBkYXRhIHN0b3JlIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVVJMKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJMIGZvciB0aGUgZGF0YSBzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25VUkwoU3RyaW5nIGNvbm5lY3Rpb25VUkwpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBkcml2ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uRHJpdmVyTmFtZSgpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBkcml2ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkRyaXZlck5hbWUoU3RyaW5nIGRyaXZlck5hbWUpOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgZm9yIHRoZSBkYXRhIHN0b3JlIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5TmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgZm9yIHRoZSBkYXRhIHN0b3JlIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeU5hbWUoU3RyaW5nIGNmTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBmYWN0b3J5LCBwb3NzaWJseSBmcm9tIEpOREkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb25uZWN0aW9uRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeShPYmplY3QgZmFjdG9yeSk7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIHRvCisgICAgICogZXN0YWJsaXNoIGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZXNlIHByb3BlcnRpZXMgcHJvdmlkZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8KKyAgICAgKiBlc3RhYmxpc2ggY29ubmVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblByb3BlcnRpZXMoU3RyaW5nIHByb3BzKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcygpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgY29ubmVjdGlvbiBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcyhTdHJpbmcgcHJvcHMpOworCisgICAgLyoqCisgICAgICogVGhlIG1vZGUgb2YgdGhlIGNvbm5lY3Rpb24gZmFjdG9yeSBpbiB1c2UuIEF2YWlsYWJsZSBvcHRpb25zIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmxvY2FsOiBPcGVuSlBBIGNvbnRyb2xzIHRoZSBjb25uZWN0aW9ucy48L2xpPgorICAgICAqIDxsaT5tYW5hZ2VkOiBDb25uZWN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBlbmxpc3RlZCBpbgorICAgICAqIHRoZSBjdXJyZW50IGdsb2JhbCB0cmFuc2FjdGlvbiBieSBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIuPC9saT4KKyAgICAgKiA8L3VsPiBEZWZhdWx0cyB0byBsb2NhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5TW9kZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1vZGUgb2YgdGhlIGNvbm5lY3Rpb24gZmFjdG9yeSBpbiB1c2UuIEF2YWlsYWJsZSBvcHRpb25zIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmxvY2FsOiBPcGVuSlBBIGNvbnRyb2xzIHRoZSBjb25uZWN0aW9ucy48L2xpPgorICAgICAqIDxsaT5tYW5hZ2VkOiBDb25uZWN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBlbmxpc3RlZCBpbgorICAgICAqIHRoZSBjdXJyZW50IGdsb2JhbCB0cmFuc2FjdGlvbiBieSBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIuPC9saT4KKyAgICAgKiA8L3VsPiBEZWZhdWx0cyB0byBsb2NhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeU1vZGUoU3RyaW5nIG1vZGUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBjb25uZWN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBlbmxpc3RlZCBpbiBnbG9iYWwgdHJhbnNhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkZhY3RvcnlNb2RlTWFuYWdlZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBjb25uZWN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBlbmxpc3RlZCBpbiBnbG9iYWwgdHJhbnNhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5TW9kZU1hbmFnZWQoYm9vbGVhbiBtYW5hZ2VkKTsKKworICAgIC8qKgorICAgICAqIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBub24tWEEgZGF0YSBzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbjJVc2VyTmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHVzZXIgbmFtZSBmb3IgdGhlIG5vbi1YQSBkYXRhIHN0b3JlIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbjJVc2VyTmFtZShTdHJpbmcgY29ubmVjdGlvblVzZXJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXNzd29yZCBmb3IgdGhlIG5vbi1YQSBkYXRhIHN0b3JlIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uMlBhc3N3b3JkKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFzc3dvcmQgZm9yIHRoZSBub24tWEEgZGF0YSBzdG9yZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24yUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJMIGZvciB0aGUgbm9uLVhBIGRhdGEgc3RvcmUgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb24yVVJMKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJMIGZvciB0aGUgbm9uLVhBIGRhdGEgc3RvcmUgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMlVSTChTdHJpbmcgY29ubmVjdGlvblVSTCk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBuYW1lIG9mIHRoZSBub24tWEEgY29ubmVjdGlvbiBkcml2ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uMkRyaXZlck5hbWUoKTsKKworICAgIC8qKgorICAgICAqIENsYXNzIG5hbWUgb2YgdGhlIG5vbi1YQSBjb25uZWN0aW9uIGRyaXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMkRyaXZlck5hbWUoU3RyaW5nIGRyaXZlck5hbWUpOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgZm9yIHRoZSBzZWNvbmQgZGF0YSBzdG9yZSBjb25uZWN0aW9uIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeTJOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBmb3IgdGhlIHNlY29uZCBkYXRhIHN0b3JlIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeTJOYW1lKFN0cmluZyBjZjJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFRoZSBub24tWEEgY29ubmVjdGlvbiBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29ubmVjdGlvbkZhY3RvcnkyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm9uLVhBIGNvbm5lY3Rpb24gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeTIoT2JqZWN0IGZhY3RvcnkpOworCisgICAgLyoqCisgICAgICogVGhlc2UgcHJvcGVydGllcyBwcm92aWRlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRlZCB0bworICAgICAqIGVzdGFibGlzaCBub24tWEEgY29ubmVjdGlvbnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb24yUHJvcGVydGllcygpOworCisgICAgLyoqCisgICAgICogVGhlc2UgcHJvcGVydGllcyBwcm92aWRlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRlZCB0bworICAgICAqIGVzdGFibGlzaCBub24tWEEgY29ubmVjdGlvbnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMlByb3BlcnRpZXMoU3RyaW5nIHByb3BzKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIG5vbi1YQSBjb25uZWN0aW9uIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIG5vbi1YQSBjb25uZWN0aW9uIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzKFN0cmluZyBwcm9wcyk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXN0aWMoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIG9wdGltaXN0aWMgdHJhbnNhY3Rpb25zIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pc3RpYyhib29sZWFuIG9wdGltaXN0aWMpOworCisgICAgLyoqCisgICAgICogV3JhcHBlciBmb3IgSkNBIHVzYWdlIG9mIHtAbGluayAjc2V0T3B0aW1pc3RpYyhib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pc3RpYyhCb29sZWFuIG9wdGltaXN0aWMpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZXRhaW4gc3RhdGUgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJldGFpblN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJldGFpbiBzdGF0ZSBhZnRlciBhIHRyYW5zYWN0aW9uIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluU3RhdGUoYm9vbGVhbiByZXRhaW5TdGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciBKQ0EgdXNhZ2Ugb2Yge0BsaW5rICNzZXRSZXRhaW5TdGF0ZShib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluU3RhdGUoQm9vbGVhbiByZXRhaW5TdGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGluc3RhbmNlcyBjbGVhciB0aGVpciBzdGF0ZSB3aGVuIGVudGVyaW5nIGEgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRvQ2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgaW5zdGFuY2VzIGNsZWFyIHRoZWlyIHN0YXRlIHdoZW4gZW50ZXJpbmcgYSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ2xlYXIoU3RyaW5nIGNsZWFyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIEF1dG9DbGVhcn0gY29uc3RhbnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBdXRvQ2xlYXJDb25zdGFudCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBpbnN0YW5jZXMgY2xlYXIgdGhlaXIgc3RhdGUgd2hlbiBlbnRlcmluZyBhIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9DbGVhcihpbnQgY2xlYXIpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZXN0b3JlIGluaXRpYWwgc3RhdGUgb24gcm9sbGJhY2sgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3RvcmVTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZXN0b3JlIGluaXRpYWwgc3RhdGUgb24gcm9sbGJhY2sgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN0b3JlU3RhdGUoU3RyaW5nIHJlc3RvcmVTdGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBSZXN0b3JlU3RhdGV9IGNvbnN0YW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdG9yZVN0YXRlQ29uc3RhbnQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcmVzdG9yZSBpbml0aWFsIHN0YXRlIG9uIHJvbGxiYWNrIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzdG9yZVN0YXRlKGludCByZXN0b3JlU3RhdGUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBjaGFuZ2VzIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFyZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbgorICAgICAqIGV4ZWN1dGluZyBxdWVyaWVzIGFuZCBpdGVyYXRpbmcgZXh0ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGNoYW5nZXMgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYXJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuCisgICAgICogZXhlY3V0aW5nIHF1ZXJpZXMgYW5kIGl0ZXJhdGluZyBleHRlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBpZ25vcmVDaGFuZ2VzKTsKKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgZm9yIEpDQSB1c2FnZSBvZiB7QGxpbmsgI3NldElnbm9yZUNoYW5nZXMoYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoQm9vbGVhbiBpZ25vcmVDaGFuZ2VzKTsKKworICAgIC8qKgorICAgICAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnRzIHdoaWNoIHRyaWdnZXIgYXV0by1kZXRhY2htZW50CisgICAgICogaW4gcGxhY2Ugb2YgbWFuYWdlZCBzdGF0ZXMuIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5jb21taXQ8L2NvZGU+OiBXaGVuIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGNvbW1pdHMuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+Y2xvc2U8L2NvZGU+OiBXaGVuIHRoZSBicm9rZXIgY2xvc2VzLjwvbGk+CisgICAgICogPGxpPjxjb2RlPm5vbnR4LXJlYWQ8L2NvZGU+OiBXaGVuIGluc3RhbmNlcyBhcmUgcmVhZAorICAgICAqIG5vbi10cmFuc2FjdGlvbmFsbHkuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0b0RldGFjaCgpOworCisgICAgLyoqCisgICAgICogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBldmVudHMgd2hpY2ggdHJpZ2dlciBhdXRvLWRldGFjaG1lbnQKKyAgICAgKiBpbiBwbGFjZSBvZiBtYW5hZ2VkIHN0YXRlcy4gUG9zc2libGUgdmFsdWVzIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPmNvbW1pdDwvY29kZT46IFdoZW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gY29tbWl0cy48L2xpPgorICAgICAqIDxsaT48Y29kZT5jbG9zZTwvY29kZT46IFdoZW4gdGhlIGJyb2tlciBjbG9zZXMuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+bm9udHgtcmVhZDwvY29kZT46IFdoZW4gaW5zdGFuY2VzIGFyZSByZWFkCisgICAgICogbm9uLXRyYW5zYWN0aW9uYWxseS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0RldGFjaChTdHJpbmcgZGV0YWNoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQXV0b0RldGFjaH0gZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBdXRvRGV0YWNoQ29uc3RhbnQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQXV0b0RldGFjaH0gZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0RldGFjaChpbnQgZmxhZ3MpOworCisgICAgLyoqCisgICAgICogV2hpY2ggZmllbGQgdmFsdWVzIHRvIGluY2x1ZGUgd2hlbiBkZXRhY2hpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGV0YWNoU3RhdGUoU3RyaW5nIGRldGFjaFN0YXRlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IHRoZSBkZXRhY2ggc3RhdGUgcGx1Z2luLgorICAgICAqLworICAgIHB1YmxpYyBEZXRhY2hPcHRpb25zIGdldERldGFjaFN0YXRlSW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IHRoZSBkZXRhY2ggc3RhdGUgcGx1Z2luLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaFN0YXRlKERldGFjaE9wdGlvbnMgZGV0YWNoU3RhdGUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBwZXJzaXN0ZW50IHN0YXRlIGlzIGFjY2Vzc2libGUgb3V0c2lkZSBhIHRyYW5zYWN0aW9uIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgcGVyc2lzdGVudCBzdGF0ZSBpcyBhY2Nlc3NpYmxlIG91dHNpZGUgYSB0cmFuc2FjdGlvbiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vbnRyYW5zYWN0aW9uYWxSZWFkKGJvb2xlYW4gbnRSZWFkKTsKKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgZm9yIEpDQSB1c2FnZSBvZiB7QGxpbmsgI3NldE5vbnRyYW5zYWN0aW9uYWxSZWFkKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsUmVhZChCb29sZWFuIG50UmVhZCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHBlcnNpc3RlbnQgc3RhdGUgY2FuIGJlIG1vZGlmaWVkIG91dHNpZGUgYSB0cmFuc2FjdGlvbiBieQorICAgICAqIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHBlcnNpc3RlbnQgc3RhdGUgY2FuIGJlIG1vZGlmaWVkIG91dHNpZGUgYSB0cmFuc2FjdGlvbiBieQorICAgICAqIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKGJvb2xlYW4gbnRXcml0ZSk7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciBKQ0EgdXNhZ2Ugb2Yge0BsaW5rICNzZXROb250cmFuc2FjdGlvbmFsV3JpdGUoYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vbnRyYW5zYWN0aW9uYWxXcml0ZShCb29sZWFuIG50V3JpdGUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBicm9rZXJzIG9yIHRoZWlyIG1hbmFnZWQgb2JqZWN0cyB3aWxsIGJlIHVzZWQgYnkgbXVsdGlwbGUKKyAgICAgKiBjb25jdXJyZW50IHRocmVhZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TXVsdGl0aHJlYWRlZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBicm9rZXJzIG9yIHRoZWlyIG1hbmFnZWQgb2JqZWN0cyB3aWxsIGJlIHVzZWQgYnkgbXVsdGlwbGUKKyAgICAgKiBjb25jdXJyZW50IHRocmVhZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGl0aHJlYWRlZChib29sZWFuIG11bHRpdGhyZWFkZWQpOworCisgICAgLyoqCisgICAgICogV3JhcHBlciBmb3IgSkNBIHVzYWdlIG9mIHtAbGluayAjc2V0TXVsdGl0aHJlYWRlZChib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGl0aHJlYWRlZChCb29sZWFuIG11bHRpdGhyZWFkZWQpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBiYXRjaCB0aGF0IHdpbGwgYmUgcHJlLXNlbGVjdGVkIHdoZW4gYWNjZXNzaW5nCisgICAgICogZWxlbWVudHMgaW4gYSBxdWVyeSBvciByZWxhdGlvbnNoaXAuIFVzZSAtMSB0byBwcmVmZXRjaCBhbGwgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZldGNoQmF0Y2hTaXplKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNpemUgb2YgdGhlIGJhdGNoIHRoYXQgd2lsbCBiZSBwcmUtc2VsZWN0ZWQgd2hlbiBhY2Nlc3NpbmcKKyAgICAgKiBlbGVtZW50cyBpbiBhIHF1ZXJ5IG9yIHJlbGF0aW9uc2hpcC4gVXNlIC0xIHRvIHByZWZldGNoIGFsbCByZXN1bHRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZldGNoQmF0Y2hTaXplKGludCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgZm9yIEpDQSB1c2FnZSBvZiB7QGxpbmsgI3NldEZldGNoQmF0Y2hTaXplKGludCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZldGNoQmF0Y2hTaXplKEludGVnZXIgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSByZWxhdGlvbiBkZXB0aCB0byB0cmF2ZXJzZSB3aGVuIGVhZ2VyIGZldGNoaW5nLiAgVXNlCisgICAgICogLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4RmV0Y2hEZXB0aCgpOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gcmVsYXRpb24gZGVwdGggdG8gdHJhdmVyc2Ugd2hlbiBlYWdlciBmZXRjaGluZy4gIFVzZQorICAgICAqIC0xIGZvciBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhGZXRjaERlcHRoKGludCBkZXB0aCk7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciBKQ0EgdXNhZ2Ugb2Yge0BsaW5rICNzZXRNYXhGZXRjaERlcHRoKGludCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEZldGNoRGVwdGgoSW50ZWdlciBzaXplKTsKKworICAgIC8qKgorICAgICAqIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZldGNoIGdyb3VwIG5hbWVzIHRoYXQgd2lsbCBiZSBwcmUtc2V0IGZvcgorICAgICAqIGFsbCBuZXcge0BsaW5rIEZldGNoQ29uZmlndXJhdGlvbn1zLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGZXRjaEdyb3VwcygpOworCisgICAgLyoqCisgICAgICogQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmV0Y2ggZ3JvdXAgbmFtZXMgdGhhdCB3aWxsIGJlIHByZS1zZXQgZm9yCisgICAgICogYWxsIG5ldyB7QGxpbmsgRmV0Y2hDb25maWd1cmF0aW9ufXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaEdyb3VwcyhTdHJpbmcgZ3JvdXBzKTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgZmV0Y2ggZ3JvdXAgbmFtZXMgdGhhdCB3aWxsIGJlIHByZS1zZXQgZm9yIGFsbCBuZXcKKyAgICAgKiB7QGxpbmsgRmV0Y2hDb25maWd1cmF0aW9ufXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEZldGNoR3JvdXBzTGlzdCgpOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBmZXRjaCBncm91cCBuYW1lcyB0aGF0IHdpbGwgYmUgcHJlLXNldCBmb3IgYWxsIG5ldworICAgICAqIHtAbGluayBGZXRjaENvbmZpZ3VyYXRpb259cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaEdyb3VwcyhTdHJpbmdbXSBuYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IE9wZW5KUEEgc2hvdWxkIGF1dG9tYXRpY2FsbHkgZmx1c2gKKyAgICAgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBkYXRhIHN0b3JlIGJlZm9yZSBleGVjdXRpbmcgcXVlcmllcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IE9wZW5KUEEgc2hvdWxkIGF1dG9tYXRpY2FsbHkgZmx1c2gKKyAgICAgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBkYXRhIHN0b3JlIGJlZm9yZSBleGVjdXRpbmcgcXVlcmllcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsdXNoQmVmb3JlUXVlcmllcyhTdHJpbmcgZmx1c2gpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBvbmUgb2Yge0BsaW5rIFF1ZXJ5Rmx1c2hNb2RlcyNGTFVTSF9UUlVFfSwKKyAgICAgKiB7QGxpbmsgUXVlcnlGbHVzaE1vZGVzI0ZMVVNIX0ZBTFNFfSwgb3IKKyAgICAgKiB7QGxpbmsgUXVlcnlGbHVzaE1vZGVzI0ZMVVNIX1dJVEhfQ09OTkVDVElPTn0sIGFzIGRldGVybWluZWQKKyAgICAgKiBieSBwYXJzaW5nIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRGbHVzaEJlZm9yZVF1ZXJpZXN9LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIGludCBnZXRGbHVzaEJlZm9yZVF1ZXJpZXNDb25zdGFudCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRvIG9uZSBvZiB7QGxpbmsgUXVlcnlGbHVzaE1vZGVzI0ZMVVNIX1RSVUV9LAorICAgICAqIHtAbGluayBRdWVyeUZsdXNoTW9kZXMjRkxVU0hfRkFMU0V9LCBvcgorICAgICAqIHtAbGluayBRdWVyeUZsdXNoTW9kZXMjRkxVU0hfV0lUSF9DT05ORUNUSU9OfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsdXNoQmVmb3JlUXVlcmllcyhpbnQgZmx1c2hCZWZvcmVRdWVyaWVzKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIHRvIHdhaXQgZm9yIGFuIG9iamVjdCBsb2NrIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgZm9yIG5vCisgICAgICogdGltZW91dC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TG9ja1RpbWVvdXQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIHRvIHdhaXQgZm9yIGFuIG9iamVjdCBsb2NrIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgZm9yIG5vCisgICAgICogdGltZW91dC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2tUaW1lb3V0KGludCB0aW1lb3V0KTsKKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgZm9yIEpDQSB1c2FnZSBvZiB7QGxpbmsgI3NldExvY2tUaW1lb3V0KGludCl9LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9ja1RpbWVvdXQoSW50ZWdlciB0aW1lb3V0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHJlYWQgbG9jayBsZXZlbCB0byB1c2UgZHVyaW5nIG5vbi1vcHRpbWlzdGljIHRyYW5zYWN0aW9ucy4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT5yZWFkPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZExvY2tMZXZlbCgpOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgcmVhZCBsb2NrIGxldmVsIHRvIHVzZSBkdXJpbmcgbm9uLW9wdGltaXN0aWMgdHJhbnNhY3Rpb25zLgorICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPnJlYWQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVhZExvY2tMZXZlbChTdHJpbmcgbGV2ZWwpOworCisgICAgLyoqCisgICAgICogVGhlIG51bWVyaWMgcmVhZCBsb2NrIGxldmVsLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWFkTG9ja0xldmVsQ29uc3RhbnQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1lcmljIHJlYWQgbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRMb2NrTGV2ZWwoaW50IGxldmVsKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHdyaXRlIGxvY2sgbGV2ZWwgdG8gdXNlIGR1cmluZyBub24tb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMuCisgICAgICogRGVmYXVsdHMgdG8gPGNvZGU+d3JpdGU8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXcml0ZUxvY2tMZXZlbCgpOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgd3JpdGUgbG9jayBsZXZlbCB0byB1c2UgZHVyaW5nIG5vbi1vcHRpbWlzdGljIHRyYW5zYWN0aW9ucy4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT53cml0ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZUxvY2tMZXZlbChTdHJpbmcgbGV2ZWwpOworCisgICAgLyoqCisgICAgICogVGhlIG51bWVyaWMgd3JpdGUgbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V3JpdGVMb2NrTGV2ZWxDb25zdGFudCgpOworCisgICAgLyoqCisgICAgICogVGhlIG51bWVyaWMgd3JpdGUgbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyaXRlTG9ja0xldmVsKGludCBsZXZlbCk7CisKKyAgICAvKioKKyAgICAgKiBQbHVnaW4gc3RyaW5nIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0ge0BsaW5rIFNlcX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZSgpOworCisgICAgLyoqCisgICAgICogUGx1Z2luIHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHtAbGluayBTZXF9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcXVlbmNlKFN0cmluZyBzZXF1ZW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBzeXN0ZW0gc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIFNlcSBnZXRTZXF1ZW5jZUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBzeXN0ZW0gc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VxdWVuY2UoU2VxIHNlcXVlbmNlKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGJyb2tlciB3aXRoIHJlc3BlY3QgdG8gZGF0YSBzdG9yZQorICAgICAqIGNvbm5lY3Rpb25zLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+YWx3YXlzPC9jb2RlPjogRWFjaCBicm9rZXIgb2J0YWlucyBhIHNpbmdsZSBjb25uZWN0aW9uIGFuZAorICAgICAqIHVzZXMgaXQgdW50aWwgdGhlIGJyb2tlciBpcyBjbG9zZWQuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+dHJhbnNhY3Rpb248L2NvZGU+OiBBIGNvbm5lY3Rpb24gaXMgb2J0YWluZWQgd2hlbiBlYWNoCisgICAgICogdHJhbnNhY3Rpb24gYmVnaW5zIChvcHRpbWlzdGljIG9yIGRhdGFzdG9yZSksIGFuZCBpcyByZWxlYXNlZAorICAgICAqIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcy48L2xpPgorICAgICAqIDxsaT48Y29kZT5vbi1kZW1hbmQ8L2NvZGU+OiBDb25uZWN0aW9ucyBhcmUgb2J0YWluZWQgb25seSB3aGVuIG5lZWRlZC4KKyAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUuIEl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIHByZXZpb3VzIG9wdGlvbgorICAgICAqIHdoZW4gZGF0YXN0b3JlIHRyYW5zYWN0aW9ucyBhcmUgdXNlZC4gRm9yIG9wdGltaXN0aWMgdHJhbnNhY3Rpb25zLAorICAgICAqIHRob3VnaCwgaXQgbWVhbnMgdGhhdCBhIGNvbm5lY3Rpb24gd2lsbCBiZSByZXRhaW5lZCBvbmx5IGZvcgorICAgICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGF0YSBzdG9yZSBjb21taXQgcHJvY2Vzcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25SZXRhaW5Nb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBicm9rZXIgd2l0aCByZXNwZWN0IHRvIGRhdGEgc3RvcmUKKyAgICAgKiBjb25uZWN0aW9ucy4gUG9zc2libGUgdmFsdWVzIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPmFsd2F5czwvY29kZT46IEVhY2ggYnJva2VyIG9idGFpbnMgYSBzaW5nbGUgY29ubmVjdGlvbiBhbmQKKyAgICAgKiB1c2VzIGl0IHVudGlsIHRoZSBicm9rZXIgaXMgY2xvc2VkLjwvbGk+CisgICAgICogPGxpPjxjb2RlPnRyYW5zYWN0aW9uPC9jb2RlPjogQSBjb25uZWN0aW9uIGlzIG9idGFpbmVkIHdoZW4gZWFjaAorICAgICAqIHRyYW5zYWN0aW9uIGJlZ2lucyAob3B0aW1pc3RpYyBvciBkYXRhc3RvcmUpLCBhbmQgaXMgcmVsZWFzZWQKKyAgICAgKiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0ZXMuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+b24tZGVtYW5kPC9jb2RlPjogQ29ubmVjdGlvbnMgYXJlIG9idGFpbmVkIG9ubHkgd2hlbiBuZWVkZWQuCisgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBtb2RlLiBJdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBwcmV2aW91cyBvcHRpb24KKyAgICAgKiB3aGVuIGRhdGFzdG9yZSB0cmFuc2FjdGlvbnMgYXJlIHVzZWQuIEZvciBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucywKKyAgICAgKiB0aG91Z2gsIGl0IG1lYW5zIHRoYXQgYSBjb25uZWN0aW9uIHdpbGwgYmUgcmV0YWluZWQgb25seSBmb3IKKyAgICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIGRhdGEgc3RvcmUgY29tbWl0IHByb2Nlc3MuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblJldGFpbk1vZGUoU3RyaW5nIG1vZGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIHJldGFpbiBtb2RlIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN5bWJvbGljCisgICAgICogY29uc3RhbnRzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIENvbm5lY3Rpb25SZXRhaW5Nb2RlcyNDT05OX1JFVEFJTl9BTFdBWVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENvbm5lY3Rpb25SZXRhaW5Nb2RlcyNDT05OX1JFVEFJTl9UUkFOU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ29ubmVjdGlvblJldGFpbk1vZGVzI0NPTk5fUkVUQUlOX0RFTUFORH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUmV0YWluTW9kZUNvbnN0YW50KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb24gcmV0YWluIG1vZGUgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3ltYm9saWMKKyAgICAgKiBjb25zdGFudHM6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgQ29ubmVjdGlvblJldGFpbk1vZGVzI0NPTk5fUkVUQUlOX0FMV0FZU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ29ubmVjdGlvblJldGFpbk1vZGVzI0NPTk5fUkVUQUlOX1RSQU5TfTwvbGk+CisgICAgICogPGxpPntAbGluayBDb25uZWN0aW9uUmV0YWluTW9kZXMjQ09OTl9SRVRBSU5fREVNQU5EfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUmV0YWluTW9kZShpbnQgbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hLXNlcGFydGVkIGxpc3Qgb2YgdGhlIHBsdWdpbiBzdHJpbmdzIG9mIHRoZSBxdWVyeQorICAgICAqIHtAbGluayBGaWx0ZXJMaXN0ZW5lcn1zIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlckxpc3RlbmVycygpOworCisgICAgLyoqCisgICAgICogQSBjb21tYS1zZXBhcnRlZCBsaXN0IG9mIHRoZSBwbHVnaW4gc3RyaW5ncyBvZiB0aGUgcXVlcnkKKyAgICAgKiB7QGxpbmsgRmlsdGVyTGlzdGVuZXJ9cyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyTGlzdGVuZXJzKFN0cmluZyBsaXN0ZW5lcnMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBxdWVyeSBmaWx0ZXIgbGlzdGVuZXJzLiBJZiBub25lIGhhdmUgYmVlbiBzZXQgZXhwbGljaXRseSwKKyAgICAgKiB0aGlzIG1ldGhvZCBpbnN0YW50aWF0ZXMgdGhlIGxpc3RlbmVycyBmcm9tIHRoZSBzZXQgcGx1Z2luIGxpc3QuCisgICAgICovCisgICAgcHVibGljIEZpbHRlckxpc3RlbmVyW10gZ2V0RmlsdGVyTGlzdGVuZXJJbnN0YW5jZXMoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcXVlcnkgZmlsdGVyIGxpc3RlbmVycy4gT3ZlcnJpZGVzIHRoZSBsaXN0IG9mIGxpc3RlbmVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyTGlzdGVuZXJzKEZpbHRlckxpc3RlbmVyW10gbGlzdGVuZXJzKTsKKworICAgIC8qKgorICAgICAqIEEgY29tbWEtc2VwYXJ0ZWQgbGlzdCBvZiB0aGUgcGx1Z2luIHN0cmluZ3Mgb2YgdGhlIHF1ZXJ5CisgICAgICoge0BsaW5rIEFnZ3JlZ2F0ZUxpc3RlbmVyfXMgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWdncmVnYXRlTGlzdGVuZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hLXNlcGFydGVkIGxpc3Qgb2YgdGhlIHBsdWdpbiBzdHJpbmdzIG9mIHRoZSBxdWVyeQorICAgICAqIHtAbGluayBBZ2dyZWdhdGVMaXN0ZW5lcn1zIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZ2dyZWdhdGVMaXN0ZW5lcnMoU3RyaW5nIGxpc3RlbmVycyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHF1ZXJ5IGZ1bmN0aW9uIGxpc3RlbmVycy4gSWYgbm9uZSBoYXZlIGJlZW4gc2V0IGV4cGxpY2l0bHksCisgICAgICogdGhpcyBtZXRob2QgaW5zdGFudGlhdGVzIHRoZSBsaXN0ZW5lcnMgZnJvbSB0aGUgc2V0IHBsdWdpbiBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBBZ2dyZWdhdGVMaXN0ZW5lcltdIGdldEFnZ3JlZ2F0ZUxpc3RlbmVySW5zdGFuY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHF1ZXJ5IGZ1bmN0aW9uIGxpc3RlbmVycy4gT3ZlcnJpZGVzIHRoZSBsaXN0IG9mIGxpc3RlbmVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWdncmVnYXRlTGlzdGVuZXJzKEFnZ3JlZ2F0ZUxpc3RlbmVyW10gbGlzdGVuZXJzKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gd2FybiBhbmQgZGVmZXIgcmVnaXN0cmF0aW9uIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4KKyAgICAgKiBleGNlcHRpb24gd2hlbiBhIHJlZ2lzdGVyZWQgcGVyc2lzdGVudCBjbGFzcyBjYW5ub3QgYmUgcHJvY2Vzc2VkLgorICAgICAqIFNob3VsZCBvbmx5IGJlIHNldCB0byB0cnVlIGluIGNvbXBsZXggY2xhc3Nsb2FkZXIgdG9wb2xvZ2llcy4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjIuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gd2FybiBhbmQgZGVmZXIgcmVnaXN0cmF0aW9uIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4KKyAgICAgKiBleGNlcHRpb24gd2hlbiBhIHJlZ2lzdGVyZWQgcGVyc2lzdGVudCBjbGFzcyBjYW5ub3QgYmUgcHJvY2Vzc2VkLgorICAgICAqIFNob3VsZCBvbmx5IGJlIHNldCB0byB0cnVlIGluIGNvbXBsZXggY2xhc3Nsb2FkZXIgdG9wb2xvZ2llcy4KKwkgKiBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCisJICoKKwkgKiBAc2luY2UgMC4zLjIuMworCSAqLworCXB1YmxpYyB2b2lkIHNldFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24gKGJvb2xlYW4gd2Fybik7CisKKwkvKioKKwkgKiBXcmFwcGVyIGZvciBKQ0EgdXNhZ2Ugb2Yge0BsaW5rICNzZXRSZXRyeUNsYXNzUmVnaXN0cmF0aW9uKGJvb2xlYW4pfS4KKwkgKgorCSAqIEBzaW5jZSAwLjMuMi4zCisJICovCisJcHVibGljIHZvaWQgc2V0UmV0cnlDbGFzc1JlZ2lzdHJhdGlvbiAoQm9vbGVhbiB3YXJuKTsKKworCS8qKgorCSAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9wdGlvbnMuCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb21wYXRpYmlsaXR5ICgpOworCisJLyoqCisJICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb3B0aW9ucy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb21wYXRpYmlsaXR5IChTdHJpbmcgY29tcGF0aWJpbGl0eSk7CisKKwkvKioKKwkgKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvcHRpb25zLgorCSAqLworCXB1YmxpYyBDb21wYXRpYmlsaXR5IGdldENvbXBhdGliaWxpdHlJbnN0YW5jZSAoKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBxdWVyeSBjb21waWxhdGlvbiBjYWNoZSB0byB1c2UuIAorICAgICAqIEBzZWUgUXVlcnlDb21waWxhdGlvbkNhY2hlVmFsdWUKKyAgICAgKiBAc2luY2UgMC45LjYKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5Q29tcGlsYXRpb25DYWNoZSgpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIHF1ZXJ5IGNvbXBpbGF0aW9uIGNhY2hlIHRvIHVzZS4gCisgICAgICogQHNlZSBRdWVyeUNvbXBpbGF0aW9uQ2FjaGVWYWx1ZQorICAgICAqIEBzaW5jZSAwLjkuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5Q29tcGlsYXRpb25DYWNoZShTdHJpbmcgY29uZik7CisgICAgCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIHF1ZXJ5IGNvbXBpbGF0aW9uIGNhY2hlIHRvIHVzZS4gCisgICAgICogQHNlZSBRdWVyeUNvbXBpbGF0aW9uQ2FjaGVWYWx1ZQorICAgICAqIEBzaW5jZSAwLjkuNgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0UXVlcnlDb21waWxhdGlvbkNhY2hlSW5zdGFuY2UoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBTdG9yZUZhY2FkZVR5cGVSZWdpc3RyeX0gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUZhY2FkZVR5cGVSZWdpc3RyeSBnZXRTdG9yZUZhY2FkZVR5cGVSZWdpc3RyeSgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzVjNmQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSwxNDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5jb25mOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuQ29uY3VycmVudERhdGFDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkNvbmN1cnJlbnRRdWVyeUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGF0YUNhY2hlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZU1hbmFnZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lZS5NYW5hZ2VkUnVudGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuT3JwaGFuZWRLZXlBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuUmVtb3RlQ29tbWl0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BdXRvQ2xlYXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQ29ubmVjdGlvblJldGFpbk1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuSW52ZXJzZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Mb2NrTGV2ZWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuTG9ja01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUZsdXNoTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5SZXN0b3JlU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TYXZlcG9pbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU2VxOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DbGFzc1Jlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRmFjYWRlVHlwZVJlZ2lzdHJ5OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgT3BlbkpQQUNvbmZpZ3VyYXRpb259IGludGVyZmFjZS4KKyAqCisgKiBAc2VlIENvbmZpZ3VyYXRpb25JbXBsCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIE9wZW5KUEFDb25maWd1cmF0aW9uSW1wbAorICAgIGV4dGVuZHMgQ29uZmlndXJhdGlvbkltcGwKKyAgICBpbXBsZW1lbnRzIE9wZW5KUEFDb25maWd1cmF0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0KKyAgICAgICAgTG9jYWxpemVyLmZvclBhY2thZ2UoT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsLmNsYXNzKTsKKworICAgIC8vIGNhY2hlZCBzdGF0ZTsgc29tZSBvZiB0aGlzIGlzIGNyZWF0ZWQgaW4gZ2V0dGVyIG1ldGhvZHMsIHNvIG1ha2UKKyAgICAvLyBwcm90ZWN0ZWQgaW4gY2FzZSBzdWJjbGFzc2VzIHdhbnQgdG8gYWNjZXNzIHdpdGhvdXQgY3JlYXRpbmcKKyAgICBwcm90ZWN0ZWQgTWV0YURhdGFSZXBvc2l0b3J5IG1ldGFSZXBvc2l0b3J5ID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyIHJlbW90ZUV2ZW50TWFuYWdlciA9IG51bGw7CisKKyAgICAvLyBvcGVuanBhIHByb3BlcnRpZXMKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgY2xhc3NSZXNvbHZlclBsdWdpbjsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgYnJva2VyUGx1Z2luOworICAgIHB1YmxpYyBPYmplY3RWYWx1ZSBkYXRhQ2FjaGVQbHVnaW47CisgICAgcHVibGljIE9iamVjdFZhbHVlIGRhdGFDYWNoZU1hbmFnZXJQbHVnaW47CisgICAgcHVibGljIEludFZhbHVlIGRhdGFDYWNoZVRpbWVvdXQ7CisgICAgcHVibGljIE9iamVjdFZhbHVlIHF1ZXJ5Q2FjaGVQbHVnaW47CisgICAgcHVibGljIEJvb2xlYW5WYWx1ZSBkeW5hbWljRGF0YVN0cnVjdHM7CisgICAgcHVibGljIE9iamVjdFZhbHVlIG1hbmFnZWRSdW50aW1lUGx1Z2luOworICAgIHB1YmxpYyBCb29sZWFuVmFsdWUgdHJhbnNhY3Rpb25Nb2RlOworICAgIHB1YmxpYyBJbnRWYWx1ZSBjb25uZWN0aW9uUmV0YWluTW9kZTsKKyAgICBwdWJsaWMgSW50VmFsdWUgZmV0Y2hCYXRjaFNpemU7CisgICAgcHVibGljIEludFZhbHVlIG1heEZldGNoRGVwdGg7CisgICAgcHVibGljIFN0cmluZ0xpc3RWYWx1ZSBmZXRjaEdyb3VwczsKKyAgICBwdWJsaWMgSW50VmFsdWUgZmx1c2hCZWZvcmVRdWVyaWVzOworICAgIHB1YmxpYyBJbnRWYWx1ZSBsb2NrVGltZW91dDsKKyAgICBwdWJsaWMgSW50VmFsdWUgcmVhZExvY2tMZXZlbDsKKyAgICBwdWJsaWMgSW50VmFsdWUgd3JpdGVMb2NrTGV2ZWw7CisgICAgcHVibGljIE9iamVjdFZhbHVlIHNlcVBsdWdpbjsKKyAgICBwdWJsaWMgUGx1Z2luTGlzdFZhbHVlIGZpbHRlckxpc3RlbmVyUGx1Z2luczsKKyAgICBwdWJsaWMgUGx1Z2luTGlzdFZhbHVlIGFnZ3JlZ2F0ZUxpc3RlbmVyUGx1Z2luczsKKyAgICBwdWJsaWMgQm9vbGVhblZhbHVlIHJldHJ5Q2xhc3NSZWdpc3RyYXRpb247CisgICAgcHVibGljIE9iamVjdFZhbHVlIHByb3h5TWFuYWdlclBsdWdpbjsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgY29ubmVjdGlvblVzZXJOYW1lOworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgcHVibGljIFN0cmluZ1ZhbHVlIGNvbm5lY3Rpb25VUkw7CisgICAgcHVibGljIFN0cmluZ1ZhbHVlIGNvbm5lY3Rpb25Ecml2ZXJOYW1lOworICAgIHB1YmxpYyBPYmplY3RWYWx1ZSBjb25uZWN0aW9uRmFjdG9yeTsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgY29ubmVjdGlvbkZhY3RvcnlOYW1lOworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBjb25uZWN0aW9uUHJvcGVydGllczsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgY29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzOworICAgIHB1YmxpYyBCb29sZWFuVmFsdWUgY29ubmVjdGlvbkZhY3RvcnlNb2RlOworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBjb25uZWN0aW9uMlVzZXJOYW1lOworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBjb25uZWN0aW9uMlBhc3N3b3JkOworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBjb25uZWN0aW9uMlVSTDsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgY29ubmVjdGlvbjJEcml2ZXJOYW1lOworICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSBjb25uZWN0aW9uMlByb3BlcnRpZXM7CisgICAgcHVibGljIE9iamVjdFZhbHVlIGNvbm5lY3Rpb25GYWN0b3J5MjsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgY29ubmVjdGlvbkZhY3RvcnkyTmFtZTsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgY29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllczsKKyAgICBwdWJsaWMgQm9vbGVhblZhbHVlIG9wdGltaXN0aWM7CisgICAgcHVibGljIEludFZhbHVlIGF1dG9DbGVhcjsKKyAgICBwdWJsaWMgQm9vbGVhblZhbHVlIHJldGFpblN0YXRlOworICAgIHB1YmxpYyBJbnRWYWx1ZSByZXN0b3JlU3RhdGU7CisgICAgcHVibGljIE9iamVjdFZhbHVlIGRldGFjaFN0YXRlUGx1Z2luOworICAgIHB1YmxpYyBCb29sZWFuVmFsdWUgaWdub3JlQ2hhbmdlczsKKyAgICBwdWJsaWMgQm9vbGVhblZhbHVlIG5vbnRyYW5zYWN0aW9uYWxSZWFkOworICAgIHB1YmxpYyBCb29sZWFuVmFsdWUgbm9udHJhbnNhY3Rpb25hbFdyaXRlOworICAgIHB1YmxpYyBCb29sZWFuVmFsdWUgbXVsdGl0aHJlYWRlZDsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgbWFwcGluZzsKKyAgICBwdWJsaWMgUGx1Z2luVmFsdWUgbWV0YUZhY3RvcnlQbHVnaW47CisgICAgcHVibGljIE9iamVjdFZhbHVlIG1ldGFSZXBvc2l0b3J5UGx1Z2luOworICAgIHB1YmxpYyBPYmplY3RWYWx1ZSBsb2NrTWFuYWdlclBsdWdpbjsKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgaW52ZXJzZU1hbmFnZXJQbHVnaW47CisgICAgcHVibGljIE9iamVjdFZhbHVlIHNhdmVwb2ludE1hbmFnZXJQbHVnaW47CisgICAgcHVibGljIE9iamVjdFZhbHVlIG9ycGhhbmVkS2V5UGx1Z2luOworICAgIHB1YmxpYyBPYmplY3RWYWx1ZSBjb21wYXRpYmlsaXR5UGx1Z2luOworICAgIHB1YmxpYyBRdWVyeUNvbXBpbGF0aW9uQ2FjaGVWYWx1ZSBxdWVyeUNvbXBpbGF0aW9uQ2FjaGVQbHVnaW47CisKKyAgICAvLyBjdXN0b20gdmFsdWVzCisgICAgcHVibGljIEJyb2tlckZhY3RvcnlWYWx1ZSBicm9rZXJGYWN0b3J5UGx1Z2luOworICAgIHB1YmxpYyBSZW1vdGVDb21taXRQcm92aWRlclZhbHVlIHJlbW90ZVByb3ZpZGVyUGx1Z2luOworICAgIHB1YmxpYyBBdXRvRGV0YWNoVmFsdWUgYXV0b0RldGFjaDsKKworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBzdXBwb3J0ZWRPcHRpb25zID0gbmV3IEhhc2hTZXQoMzMpOworICAgIHByaXZhdGUgU3RyaW5nIHNwZWMgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgU3RvcmVGYWNhZGVUeXBlUmVnaXN0cnkgX3N0b3JlRmFjYWRlUmVnaXN0cnkgPQorICAgICAgICBuZXcgU3RvcmVGYWNhZGVUeXBlUmVnaXN0cnkoKTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEF0dGVtcHRzIHRvIGxvYWQgZ2xvYmFsIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uSW1wbCgpIHsKKyAgICAgICAgdGhpcyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkR2xvYmFscyB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gbG9hZCB0aGUgZ2xvYmFsIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKGJvb2xlYW4gbG9hZEdsb2JhbHMpIHsKKyAgICAgICAgdGhpcyh0cnVlLCBsb2FkR2xvYmFscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVyaXZhdGlvbnMgd2hldGhlciB0byBhcHBseSBwcm9kdWN0IGRlcml2YXRpb25zCisgICAgICogQHBhcmFtIGxvYWRHbG9iYWxzIHdoZXRoZXIgdG8gYXR0ZW1wdCB0byBsb2FkIHRoZSBnbG9iYWwgcHJvcGVydGllcworICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwoYm9vbGVhbiBkZXJpdmF0aW9ucywgYm9vbGVhbiBsb2FkR2xvYmFscykgeworICAgICAgICBzdXBlcihmYWxzZSk7CisgICAgICAgIFN0cmluZ1tdIGFsaWFzZXM7CisKKyAgICAgICAgY2xhc3NSZXNvbHZlclBsdWdpbiA9IGFkZFBsdWdpbigiQ2xhc3NSZXNvbHZlciIsIHRydWUpOworICAgICAgICBhbGlhc2VzID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQ2xhc3NSZXNvbHZlckltcGwiLAorICAgICAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgYWxpYXMKKyAgICAgICAgICAgICAgICAic3BlYyIsICJvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DbGFzc1Jlc29sdmVySW1wbCIsIH07CisgICAgICAgIGNsYXNzUmVzb2x2ZXJQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgY2xhc3NSZXNvbHZlclBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBjbGFzc1Jlc29sdmVyUGx1Z2luLnNldFN0cmluZyhhbGlhc2VzWzBdKTsKKyAgICAgICAgY2xhc3NSZXNvbHZlclBsdWdpbi5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UiKTsKKworICAgICAgICBicm9rZXJGYWN0b3J5UGx1Z2luID0gbmV3IEJyb2tlckZhY3RvcnlWYWx1ZSgpOworICAgICAgICBhZGRWYWx1ZShicm9rZXJGYWN0b3J5UGx1Z2luKTsKKworICAgICAgICBicm9rZXJQbHVnaW4gPSBuZXcgQnJva2VyVmFsdWUoKTsKKyAgICAgICAgYWRkVmFsdWUoYnJva2VyUGx1Z2luKTsKKworICAgICAgICBkYXRhQ2FjaGVNYW5hZ2VyUGx1Z2luID0gYWRkUGx1Z2luKCJEYXRhQ2FjaGVNYW5hZ2VyIiwgdHJ1ZSk7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImRlZmF1bHQiLCBEYXRhQ2FjaGVNYW5hZ2VySW1wbC5jbGFzcy5nZXROYW1lKCksIH07CisgICAgICAgIGRhdGFDYWNoZU1hbmFnZXJQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgZGF0YUNhY2hlTWFuYWdlclBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBkYXRhQ2FjaGVNYW5hZ2VyUGx1Z2luLnNldFN0cmluZyhhbGlhc2VzWzBdKTsKKyAgICAgICAgZGF0YUNhY2hlTWFuYWdlclBsdWdpbi5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXREYXRhQ2FjaGVNYW5hZ2VyIik7CisKKyAgICAgICAgZGF0YUNhY2hlUGx1Z2luID0gYWRkUGx1Z2luKCJEYXRhQ2FjaGUiLCBmYWxzZSk7CisgICAgICAgIGFsaWFzZXMgPSBuZXcgU3RyaW5nW10geyAKKyAgICAgICAgICAgICJmYWxzZSIsIG51bGwsIAorICAgICAgICAgICAgInRydWUiLCBDb25jdXJyZW50RGF0YUNhY2hlLmNsYXNzLmdldE5hbWUoKSwgCisgICAgICAgICAgICAiY29uY3VycmVudCIsIENvbmN1cnJlbnREYXRhQ2FjaGUuY2xhc3MuZ2V0TmFtZSgpLCAKKyAgICAgICAgfTsKKyAgICAgICAgZGF0YUNhY2hlUGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIGRhdGFDYWNoZVBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBkYXRhQ2FjaGVQbHVnaW4uc2V0U3RyaW5nKGFsaWFzZXNbMF0pOworCisgICAgICAgIGRhdGFDYWNoZVRpbWVvdXQgPSBhZGRJbnQoIkRhdGFDYWNoZVRpbWVvdXQiKTsKKyAgICAgICAgZGF0YUNhY2hlVGltZW91dC5zZXREZWZhdWx0KCItMSIpOworICAgICAgICBkYXRhQ2FjaGVUaW1lb3V0LnNldCgtMSk7CisKKyAgICAgICAgcXVlcnlDYWNoZVBsdWdpbiA9IGFkZFBsdWdpbigiUXVlcnlDYWNoZSIsIHRydWUpOworICAgICAgICBhbGlhc2VzID0gbmV3IFN0cmluZ1tdIHsgCisgICAgICAgICAgICAidHJ1ZSIsIENvbmN1cnJlbnRRdWVyeUNhY2hlLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICJjb25jdXJyZW50IiwgQ29uY3VycmVudFF1ZXJ5Q2FjaGUuY2xhc3MuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICJmYWxzZSIsIG51bGwsIAorICAgICAgICB9OworICAgICAgICBxdWVyeUNhY2hlUGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIHF1ZXJ5Q2FjaGVQbHVnaW4uc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgcXVlcnlDYWNoZVBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisKKyAgICAgICAgZHluYW1pY0RhdGFTdHJ1Y3RzID0gYWRkQm9vbGVhbigiRHluYW1pY0RhdGFTdHJ1Y3RzIik7CisgICAgICAgIGR5bmFtaWNEYXRhU3RydWN0cy5zZXREZWZhdWx0KCJmYWxzZSIpOworICAgICAgICBkeW5hbWljRGF0YVN0cnVjdHMuc2V0KGZhbHNlKTsKKworICAgICAgICBsb2NrTWFuYWdlclBsdWdpbiA9IGFkZFBsdWdpbigiTG9ja01hbmFnZXIiLCBmYWxzZSk7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIm5vbmUiLCAib3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ob25lTG9ja01hbmFnZXIiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuVmVyc2lvbkxvY2tNYW5hZ2VyIiwgfTsKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0U3RyaW5nKGFsaWFzZXNbMF0pOworCisgICAgICAgIGludmVyc2VNYW5hZ2VyUGx1Z2luID0gYWRkUGx1Z2luKCJJbnZlcnNlTWFuYWdlciIsIGZhbHNlKTsKKyAgICAgICAgYWxpYXNlcyA9CisgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiZmFsc2UiLCBudWxsLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuSW52ZXJzZU1hbmFnZXIiLCB9OworICAgICAgICBpbnZlcnNlTWFuYWdlclBsdWdpbi5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICBpbnZlcnNlTWFuYWdlclBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBpbnZlcnNlTWFuYWdlclBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisKKyAgICAgICAgc2F2ZXBvaW50TWFuYWdlclBsdWdpbiA9IGFkZFBsdWdpbigiU2F2ZXBvaW50TWFuYWdlciIsIHRydWUpOworICAgICAgICBhbGlhc2VzID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJpbi1tZW0iLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkluTWVtb3J5U2F2ZXBvaW50TWFuYWdlciIsIH07CisgICAgICAgIHNhdmVwb2ludE1hbmFnZXJQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgc2F2ZXBvaW50TWFuYWdlclBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBzYXZlcG9pbnRNYW5hZ2VyUGx1Z2luLnNldFN0cmluZyhhbGlhc2VzWzBdKTsKKyAgICAgICAgc2F2ZXBvaW50TWFuYWdlclBsdWdpbgorICAgICAgICAgICAgLnNldEluc3RhbnRpYXRpbmdHZXR0ZXIoImdldFNhdmVwb2ludE1hbmFnZXJJbnN0YW5jZSIpOworCisgICAgICAgIG9ycGhhbmVkS2V5UGx1Z2luID0gYWRkUGx1Z2luKCJPcnBoYW5lZEtleUFjdGlvbiIsIHRydWUpOworICAgICAgICBhbGlhc2VzID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJsb2ciLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTG9nT3JwaGFuZWRLZXlBY3Rpb24iLCAiZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkV4Y2VwdGlvbk9ycGhhbmVkS2V5QWN0aW9uIiwgIm5vbmUiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTm9uZU9ycGhhbmVkS2V5QWN0aW9uIiwgfTsKKyAgICAgICAgb3JwaGFuZWRLZXlQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgb3JwaGFuZWRLZXlQbHVnaW4uc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgb3JwaGFuZWRLZXlQbHVnaW4uc2V0U3RyaW5nKGFsaWFzZXNbMF0pOworICAgICAgICBvcnBoYW5lZEtleVBsdWdpbgorICAgICAgICAgICAgLnNldEluc3RhbnRpYXRpbmdHZXR0ZXIoImdldE9ycGhhbmVkS2V5QWN0aW9uSW5zdGFuY2UiKTsKKworICAgICAgICByZW1vdGVQcm92aWRlclBsdWdpbiA9IG5ldyBSZW1vdGVDb21taXRQcm92aWRlclZhbHVlKCk7CisgICAgICAgIGFkZFZhbHVlKHJlbW90ZVByb3ZpZGVyUGx1Z2luKTsKKworICAgICAgICB0cmFuc2FjdGlvbk1vZGUgPSBhZGRCb29sZWFuKCJUcmFuc2FjdGlvbk1vZGUiKTsKKyAgICAgICAgYWxpYXNlcyA9IG5ldyBTdHJpbmdbXSB7ICJsb2NhbCIsICJmYWxzZSIsICJtYW5hZ2VkIiwgInRydWUiLCB9OworICAgICAgICB0cmFuc2FjdGlvbk1vZGUuc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgdHJhbnNhY3Rpb25Nb2RlLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisKKyAgICAgICAgbWFuYWdlZFJ1bnRpbWVQbHVnaW4gPSBhZGRQbHVnaW4oIk1hbmFnZWRSdW50aW1lIiwgdHJ1ZSk7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImF1dG8iLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEuZWUuQXV0b21hdGljTWFuYWdlZFJ1bnRpbWUiLCAiam5kaSIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5lZS5KTkRJTWFuYWdlZFJ1bnRpbWUiLCAiaW52b2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5lZS5JbnZvY2F0aW9uTWFuYWdlZFJ1bnRpbWUiLCB9OworICAgICAgICBtYW5hZ2VkUnVudGltZVBsdWdpbi5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICBtYW5hZ2VkUnVudGltZVBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBtYW5hZ2VkUnVudGltZVBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisgICAgICAgIG1hbmFnZWRSdW50aW1lUGx1Z2luCisgICAgICAgICAgICAuc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0TWFuYWdlZFJ1bnRpbWVJbnN0YW5jZSIpOworCisgICAgICAgIHByb3h5TWFuYWdlclBsdWdpbiA9IGFkZFBsdWdpbigiUHJveHlNYW5hZ2VyIiwgdHJ1ZSk7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImRlZmF1bHQiLAorICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eU1hbmFnZXJJbXBsIiB9OworICAgICAgICBwcm94eU1hbmFnZXJQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgcHJveHlNYW5hZ2VyUGx1Z2luLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIHByb3h5TWFuYWdlclBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisgICAgICAgIHByb3h5TWFuYWdlclBsdWdpbi5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXRQcm94eU1hbmFnZXJJbnN0YW5jZSIpOworCisgICAgICAgIG1hcHBpbmcgPSBhZGRTdHJpbmcoIk1hcHBpbmciKTsKKyAgICAgICAgbWV0YUZhY3RvcnlQbHVnaW4gPSBhZGRQbHVnaW4oIk1ldGFEYXRhRmFjdG9yeSIsIGZhbHNlKTsKKworICAgICAgICBtZXRhUmVwb3NpdG9yeVBsdWdpbiA9IGFkZFBsdWdpbigiTWV0YURhdGFSZXBvc2l0b3J5IiwgZmFsc2UpOworICAgICAgICBhbGlhc2VzID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5IiB9OworICAgICAgICBtZXRhUmVwb3NpdG9yeVBsdWdpbi5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICBtZXRhUmVwb3NpdG9yeVBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBtZXRhUmVwb3NpdG9yeVBsdWdpbi5zZXRTdHJpbmcoYWxpYXNlc1swXSk7CisKKyAgICAgICAgY29ubmVjdGlvbkZhY3RvcnkgPSBhZGRPYmplY3QoIkNvbm5lY3Rpb25GYWN0b3J5Iik7CisgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5LnNldEluc3RhbnRpYXRpbmdHZXR0ZXIoImdldENvbm5lY3Rpb25GYWN0b3J5Iik7CisKKyAgICAgICAgY29ubmVjdGlvbkZhY3RvcnkyID0gYWRkT2JqZWN0KCJDb25uZWN0aW9uRmFjdG9yeTIiKTsKKyAgICAgICAgY29ubmVjdGlvbkZhY3RvcnkyLnNldEluc3RhbnRpYXRpbmdHZXR0ZXIoImdldENvbm5lY3Rpb25GYWN0b3J5MiIpOworCisgICAgICAgIGNvbm5lY3Rpb25Vc2VyTmFtZSA9IGFkZFN0cmluZygiQ29ubmVjdGlvblVzZXJOYW1lIik7CisgICAgICAgIGNvbm5lY3Rpb25QYXNzd29yZCA9IGFkZFN0cmluZygiQ29ubmVjdGlvblBhc3N3b3JkIik7CisgICAgICAgIGNvbm5lY3Rpb25VUkwgPSBhZGRTdHJpbmcoIkNvbm5lY3Rpb25VUkwiKTsKKyAgICAgICAgY29ubmVjdGlvbkRyaXZlck5hbWUgPSBhZGRTdHJpbmcoIkNvbm5lY3Rpb25Ecml2ZXJOYW1lIik7CisgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5TmFtZSA9IGFkZFN0cmluZygiQ29ubmVjdGlvbkZhY3RvcnlOYW1lIik7CisgICAgICAgIGNvbm5lY3Rpb25Qcm9wZXJ0aWVzID0gYWRkU3RyaW5nKCJDb25uZWN0aW9uUHJvcGVydGllcyIpOworICAgICAgICBjb25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMgPSBhZGRTdHJpbmcoIkNvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcyIpOworICAgICAgICBjb25uZWN0aW9uMlVzZXJOYW1lID0gYWRkU3RyaW5nKCJDb25uZWN0aW9uMlVzZXJOYW1lIik7CisgICAgICAgIGNvbm5lY3Rpb24yUGFzc3dvcmQgPSBhZGRTdHJpbmcoIkNvbm5lY3Rpb24yUGFzc3dvcmQiKTsKKyAgICAgICAgY29ubmVjdGlvbjJVUkwgPSBhZGRTdHJpbmcoIkNvbm5lY3Rpb24yVVJMIik7CisgICAgICAgIGNvbm5lY3Rpb24yRHJpdmVyTmFtZSA9IGFkZFN0cmluZygiQ29ubmVjdGlvbjJEcml2ZXJOYW1lIik7CisgICAgICAgIGNvbm5lY3Rpb24yUHJvcGVydGllcyA9IGFkZFN0cmluZygiQ29ubmVjdGlvbjJQcm9wZXJ0aWVzIik7CisgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMgPQorICAgICAgICAgICAgYWRkU3RyaW5nKCJDb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzIik7CisgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5Mk5hbWUgPSBhZGRTdHJpbmcoIkNvbm5lY3Rpb25GYWN0b3J5Mk5hbWUiKTsKKworICAgICAgICBjb25uZWN0aW9uRmFjdG9yeU1vZGUgPSBhZGRCb29sZWFuKCJDb25uZWN0aW9uRmFjdG9yeU1vZGUiKTsKKyAgICAgICAgYWxpYXNlcyA9IG5ldyBTdHJpbmdbXSB7ICJsb2NhbCIsICJmYWxzZSIsICJtYW5hZ2VkIiwgInRydWUiLCB9OworICAgICAgICBjb25uZWN0aW9uRmFjdG9yeU1vZGUuc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgY29ubmVjdGlvbkZhY3RvcnlNb2RlLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisKKyAgICAgICAgb3B0aW1pc3RpYyA9IGFkZEJvb2xlYW4oIk9wdGltaXN0aWMiKTsKKyAgICAgICAgb3B0aW1pc3RpYy5zZXREZWZhdWx0KCJ0cnVlIik7CisgICAgICAgIG9wdGltaXN0aWMuc2V0KHRydWUpOworCisgICAgICAgIGF1dG9DbGVhciA9IGFkZEludCgiQXV0b0NsZWFyIik7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImRhdGFzdG9yZSIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoQXV0b0NsZWFyLkNMRUFSX0RBVEFTVE9SRSksICJhbGwiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKEF1dG9DbGVhci5DTEVBUl9BTEwpLCB9OworICAgICAgICBhdXRvQ2xlYXIuc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgYXV0b0NsZWFyLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIGF1dG9DbGVhci5zZXQoQXV0b0NsZWFyLkNMRUFSX0RBVEFTVE9SRSk7CisgICAgICAgIGF1dG9DbGVhci5zZXRBbGlhc0xpc3RDb21wcmVoZW5zaXZlKHRydWUpOworCisgICAgICAgIHJldGFpblN0YXRlID0gYWRkQm9vbGVhbigiUmV0YWluU3RhdGUiKTsKKyAgICAgICAgcmV0YWluU3RhdGUuc2V0RGVmYXVsdCgidHJ1ZSIpOworICAgICAgICByZXRhaW5TdGF0ZS5zZXQodHJ1ZSk7CisKKyAgICAgICAgcmVzdG9yZVN0YXRlID0gYWRkSW50KCJSZXN0b3JlU3RhdGUiKTsKKyAgICAgICAgYWxpYXNlcyA9CisgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAibm9uZSIsIFN0cmluZy52YWx1ZU9mKFJlc3RvcmVTdGF0ZS5SRVNUT1JFX05PTkUpLAorICAgICAgICAgICAgICAgICJmYWxzZSIsIFN0cmluZy52YWx1ZU9mKFJlc3RvcmVTdGF0ZS5SRVNUT1JFX05PTkUpLAorICAgICAgICAgICAgICAgICJpbW11dGFibGUiLCBTdHJpbmcudmFsdWVPZihSZXN0b3JlU3RhdGUuUkVTVE9SRV9JTU1VVEFCTEUpLAorICAgICAgICAgICAgICAgIC8vICJ0cnVlIiBmb3IgY29tcGF0IHdpdGggamRvIFJlc3RvcmVWYWx1ZXMKKyAgICAgICAgICAgICAgICAidHJ1ZSIsIFN0cmluZy52YWx1ZU9mKFJlc3RvcmVTdGF0ZS5SRVNUT1JFX0lNTVVUQUJMRSksICJhbGwiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFJlc3RvcmVTdGF0ZS5SRVNUT1JFX0FMTCksIH07CisgICAgICAgIHJlc3RvcmVTdGF0ZS5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICByZXN0b3JlU3RhdGUuc2V0RGVmYXVsdChhbGlhc2VzWzBdKTsKKyAgICAgICAgcmVzdG9yZVN0YXRlLnNldChSZXN0b3JlU3RhdGUuUkVTVE9SRV9JTU1VVEFCTEUpOworICAgICAgICByZXN0b3JlU3RhdGUuc2V0QWxpYXNMaXN0Q29tcHJlaGVuc2l2ZSh0cnVlKTsKKworICAgICAgICBhdXRvRGV0YWNoID0gbmV3IEF1dG9EZXRhY2hWYWx1ZSgpOworICAgICAgICBhZGRWYWx1ZShhdXRvRGV0YWNoKTsKKworICAgICAgICBkZXRhY2hTdGF0ZVBsdWdpbiA9IGFkZFBsdWdpbigiRGV0YWNoU3RhdGUiLCB0cnVlKTsKKyAgICAgICAgYWxpYXNlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAibG9hZGVkIiwgRGV0YWNoT3B0aW9ucy5Mb2FkZWQuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgImZncyIsIERldGFjaE9wdGlvbnMuRmV0Y2hHcm91cHMuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgImZldGNoLWdyb3VwcyIsIERldGFjaE9wdGlvbnMuRmV0Y2hHcm91cHMuY2xhc3MuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICJhbGwiLCBEZXRhY2hPcHRpb25zLkFsbC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIH07CisgICAgICAgIGRldGFjaFN0YXRlUGx1Z2luLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIGRldGFjaFN0YXRlUGx1Z2luLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIGRldGFjaFN0YXRlUGx1Z2luLnNldFN0cmluZyhhbGlhc2VzWzBdKTsKKyAgICAgICAgZGV0YWNoU3RhdGVQbHVnaW4uc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0RGV0YWNoU3RhdGVJbnN0YW5jZSIpOworCisgICAgICAgIGlnbm9yZUNoYW5nZXMgPSBhZGRCb29sZWFuKCJJZ25vcmVDaGFuZ2VzIik7CisKKyAgICAgICAgbm9udHJhbnNhY3Rpb25hbFJlYWQgPSBhZGRCb29sZWFuKCJOb250cmFuc2FjdGlvbmFsUmVhZCIpOworICAgICAgICBub250cmFuc2FjdGlvbmFsUmVhZC5zZXREZWZhdWx0KCJ0cnVlIik7CisgICAgICAgIG5vbnRyYW5zYWN0aW9uYWxSZWFkLnNldCh0cnVlKTsKKworICAgICAgICBub250cmFuc2FjdGlvbmFsV3JpdGUgPSBhZGRCb29sZWFuKCJOb250cmFuc2FjdGlvbmFsV3JpdGUiKTsKKyAgICAgICAgbXVsdGl0aHJlYWRlZCA9IGFkZEJvb2xlYW4oIk11bHRpdGhyZWFkZWQiKTsKKworICAgICAgICBmZXRjaEJhdGNoU2l6ZSA9IGFkZEludCgiRmV0Y2hCYXRjaFNpemUiKTsKKyAgICAgICAgZmV0Y2hCYXRjaFNpemUuc2V0RGVmYXVsdCgiLTEiKTsKKyAgICAgICAgZmV0Y2hCYXRjaFNpemUuc2V0KC0xKTsKKworICAgICAgICBtYXhGZXRjaERlcHRoID0gYWRkSW50KCJNYXhGZXRjaERlcHRoIik7CisgICAgICAgIG1heEZldGNoRGVwdGguc2V0RGVmYXVsdCgiLTEiKTsKKyAgICAgICAgbWF4RmV0Y2hEZXB0aC5zZXQoLTEpOworCisgICAgICAgIGZldGNoR3JvdXBzID0gYWRkU3RyaW5nTGlzdCgiRmV0Y2hHcm91cHMiKTsKKyAgICAgICAgZmV0Y2hHcm91cHMuc2V0RGVmYXVsdCgiZGVmYXVsdCIpOworICAgICAgICBmZXRjaEdyb3Vwcy5zZXQobmV3IFN0cmluZ1tdIHsgImRlZmF1bHQiIH0pOworCisgICAgICAgIGZsdXNoQmVmb3JlUXVlcmllcyA9IGFkZEludCgiRmx1c2hCZWZvcmVRdWVyaWVzIik7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgInRydWUiLCBTdHJpbmcudmFsdWVPZihRdWVyeUZsdXNoTW9kZXMuRkxVU0hfVFJVRSksCisgICAgICAgICAgICAgICAgImZhbHNlIiwgU3RyaW5nLnZhbHVlT2YoUXVlcnlGbHVzaE1vZGVzLkZMVVNIX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAid2l0aC1jb25uZWN0aW9uIiwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihRdWVyeUZsdXNoTW9kZXMuRkxVU0hfV0lUSF9DT05ORUNUSU9OKSwgfTsKKyAgICAgICAgZmx1c2hCZWZvcmVRdWVyaWVzLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIGZsdXNoQmVmb3JlUXVlcmllcy5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBmbHVzaEJlZm9yZVF1ZXJpZXMuc2V0KFF1ZXJ5Rmx1c2hNb2Rlcy5GTFVTSF9UUlVFKTsKKyAgICAgICAgZmx1c2hCZWZvcmVRdWVyaWVzLnNldEFsaWFzTGlzdENvbXByZWhlbnNpdmUodHJ1ZSk7CisKKyAgICAgICAgbG9ja1RpbWVvdXQgPSBhZGRJbnQoIkxvY2tUaW1lb3V0Iik7CisgICAgICAgIGxvY2tUaW1lb3V0LnNldERlZmF1bHQoIi0xIik7CisgICAgICAgIGxvY2tUaW1lb3V0LnNldCgtMSk7CisKKyAgICAgICAgcmVhZExvY2tMZXZlbCA9IGFkZEludCgiUmVhZExvY2tMZXZlbCIpOworICAgICAgICBhbGlhc2VzID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJyZWFkIiwgU3RyaW5nLnZhbHVlT2YoTG9ja0xldmVscy5MT0NLX1JFQUQpLAorICAgICAgICAgICAgICAgICJ3cml0ZSIsIFN0cmluZy52YWx1ZU9mKExvY2tMZXZlbHMuTE9DS19XUklURSksICJub25lIiwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihMb2NrTGV2ZWxzLkxPQ0tfTk9ORSksIH07CisgICAgICAgIHJlYWRMb2NrTGV2ZWwuc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgcmVhZExvY2tMZXZlbC5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICByZWFkTG9ja0xldmVsLnNldChMb2NrTGV2ZWxzLkxPQ0tfUkVBRCk7CisgICAgICAgIHJlYWRMb2NrTGV2ZWwuc2V0QWxpYXNMaXN0Q29tcHJlaGVuc2l2ZSh0cnVlKTsKKworICAgICAgICB3cml0ZUxvY2tMZXZlbCA9IGFkZEludCgiV3JpdGVMb2NrTGV2ZWwiKTsKKyAgICAgICAgYWxpYXNlcyA9CisgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAicmVhZCIsIFN0cmluZy52YWx1ZU9mKExvY2tMZXZlbHMuTE9DS19SRUFEKSwKKyAgICAgICAgICAgICAgICAid3JpdGUiLCBTdHJpbmcudmFsdWVPZihMb2NrTGV2ZWxzLkxPQ0tfV1JJVEUpLCAibm9uZSIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTG9ja0xldmVscy5MT0NLX05PTkUpLCB9OworICAgICAgICB3cml0ZUxvY2tMZXZlbC5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICB3cml0ZUxvY2tMZXZlbC5zZXREZWZhdWx0KGFsaWFzZXNbMV0pOworICAgICAgICB3cml0ZUxvY2tMZXZlbC5zZXQoTG9ja0xldmVscy5MT0NLX1dSSVRFKTsKKyAgICAgICAgd3JpdGVMb2NrTGV2ZWwuc2V0QWxpYXNMaXN0Q29tcHJlaGVuc2l2ZSh0cnVlKTsKKworICAgICAgICBzZXFQbHVnaW4gPSBuZXcgU2VxVmFsdWUoIlNlcXVlbmNlIik7CisgICAgICAgIHNlcVBsdWdpbi5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXRTZXF1ZW5jZUluc3RhbmNlIik7CisgICAgICAgIGFkZFZhbHVlKHNlcVBsdWdpbik7CisKKyAgICAgICAgY29ubmVjdGlvblJldGFpbk1vZGUgPSBhZGRJbnQoIkNvbm5lY3Rpb25SZXRhaW5Nb2RlIik7CisgICAgICAgIGFsaWFzZXMgPQorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIm9uLWRlbWFuZCIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoQ29ubmVjdGlvblJldGFpbk1vZGVzLkNPTk5fUkVUQUlOX0RFTUFORCksCisgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihDb25uZWN0aW9uUmV0YWluTW9kZXMuQ09OTl9SRVRBSU5fVFJBTlMpLAorICAgICAgICAgICAgICAgICJhbHdheXMiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKENvbm5lY3Rpb25SZXRhaW5Nb2Rlcy5DT05OX1JFVEFJTl9BTFdBWVMpLAorICAgICAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQKKyAgICAgICAgICAgICAgICAicGVyc2lzdGVuY2UtbWFuYWdlciIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoQ29ubmVjdGlvblJldGFpbk1vZGVzLkNPTk5fUkVUQUlOX0FMV0FZUyksIH07CisgICAgICAgIGNvbm5lY3Rpb25SZXRhaW5Nb2RlLnNldEFsaWFzZXMoYWxpYXNlcyk7CisgICAgICAgIGNvbm5lY3Rpb25SZXRhaW5Nb2RlLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIGNvbm5lY3Rpb25SZXRhaW5Nb2RlLnNldEFsaWFzTGlzdENvbXByZWhlbnNpdmUodHJ1ZSk7CisgICAgICAgIGNvbm5lY3Rpb25SZXRhaW5Nb2RlLnNldChDb25uZWN0aW9uUmV0YWluTW9kZXMuQ09OTl9SRVRBSU5fREVNQU5EKTsKKworICAgICAgICBmaWx0ZXJMaXN0ZW5lclBsdWdpbnMgPSBhZGRQbHVnaW5MaXN0KCJGaWx0ZXJMaXN0ZW5lcnMiKTsKKyAgICAgICAgZmlsdGVyTGlzdGVuZXJQbHVnaW5zCisgICAgICAgICAgICAuc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0RmlsdGVyTGlzdGVuZXJJbnN0YW5jZXMiKTsKKworICAgICAgICBhZ2dyZWdhdGVMaXN0ZW5lclBsdWdpbnMgPSBhZGRQbHVnaW5MaXN0KCJBZ2dyZWdhdGVMaXN0ZW5lcnMiKTsKKyAgICAgICAgYWdncmVnYXRlTGlzdGVuZXJQbHVnaW5zCisgICAgICAgICAgICAuc2V0SW5zdGFudGlhdGluZ0dldHRlcigiZ2V0QWdncmVnYXRlTGlzdGVuZXJJbnN0YW5jZXMiKTsKKworICAgICAgICByZXRyeUNsYXNzUmVnaXN0cmF0aW9uID0gYWRkQm9vbGVhbigiUmV0cnlDbGFzc1JlZ2lzdHJhdGlvbiIpOworCisgICAgICAgIGNvbXBhdGliaWxpdHlQbHVnaW4gPSBhZGRQbHVnaW4oIkNvbXBhdGliaWxpdHkiLCB0cnVlKTsKKyAgICAgICAgYWxpYXNlcyA9IG5ldyBTdHJpbmdbXSB7ICJkZWZhdWx0IiwgQ29tcGF0aWJpbGl0eS5jbGFzcy5nZXROYW1lKCkgfTsKKyAgICAgICAgY29tcGF0aWJpbGl0eVBsdWdpbi5zZXRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICBjb21wYXRpYmlsaXR5UGx1Z2luLnNldERlZmF1bHQoYWxpYXNlc1swXSk7CisgICAgICAgIGNvbXBhdGliaWxpdHlQbHVnaW4uc2V0U3RyaW5nKGFsaWFzZXNbMF0pOworICAgICAgICBjb21wYXRpYmlsaXR5UGx1Z2luLnNldEluc3RhbnRpYXRpbmdHZXR0ZXIoImdldENvbXBhdGliaWxpdHlJbnN0YW5jZSIpOworICAgICAgICAKKyAgICAgICAgcXVlcnlDb21waWxhdGlvbkNhY2hlUGx1Z2luID0gbmV3IFF1ZXJ5Q29tcGlsYXRpb25DYWNoZVZhbHVlKAorICAgICAgICAgICAgIlF1ZXJ5Q29tcGlsYXRpb25DYWNoZSIpOworICAgICAgICBxdWVyeUNvbXBpbGF0aW9uQ2FjaGVQbHVnaW4uc2V0SW5zdGFudGlhdGluZ0dldHRlcigKKyAgICAgICAgICAgICJnZXRRdWVyeUNvbXBpbGF0aW9uQ2FjaGVJbnN0YW5jZSIpOworICAgICAgICBhZGRWYWx1ZShxdWVyeUNvbXBpbGF0aW9uQ2FjaGVQbHVnaW4pOworICAgICAgICAKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBzdXBwb3J0ZWQgb3B0aW9ucyB0aGF0IHNvbWUgcnVudGltZXMgbWF5IG5vdCBzdXBwb3J0CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMuYWRkKE9QVElPTl9OT05UUkFOU19SRUFEKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX09QVElNSVNUSUMpOworICAgICAgICBzdXBwb3J0ZWRPcHRpb25zLmFkZChPUFRJT05fSURfQVBQTElDQVRJT04pOworICAgICAgICBzdXBwb3J0ZWRPcHRpb25zLmFkZChPUFRJT05fSURfREFUQVNUT1JFKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX1RZUEVfQ09MTEVDVElPTik7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMuYWRkKE9QVElPTl9UWVBFX01BUCk7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMuYWRkKE9QVElPTl9UWVBFX0FSUkFZKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX05VTExfQ09OVEFJTkVSKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX0VNQkVEREVEX1JFTEFUSU9OKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX0VNQkVEREVEX0NPTExFQ1RJT05fUkVMQVRJT04pOworICAgICAgICBzdXBwb3J0ZWRPcHRpb25zLmFkZChPUFRJT05fRU1CRURERURfTUFQX1JFTEFUSU9OKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX0lOQ19GTFVTSCk7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMuYWRkKE9QVElPTl9WQUxVRV9BVVRPQVNTSUdOKTsKKyAgICAgICAgc3VwcG9ydGVkT3B0aW9ucy5hZGQoT1BUSU9OX1ZBTFVFX0lOQ1JFTUVOVCk7CisgICAgICAgIHN1cHBvcnRlZE9wdGlvbnMuYWRkKE9QVElPTl9EQVRBU1RPUkVfQ09OTkVDVElPTik7CisKKyAgICAgICAgaWYgKGRlcml2YXRpb25zKQorICAgICAgICAgICAgUHJvZHVjdERlcml2YXRpb25zLmJlZm9yZUNvbmZpZ3VyYXRpb25Mb2FkKHRoaXMpOworICAgICAgICBpZiAobG9hZEdsb2JhbHMpCisgICAgICAgICAgICBsb2FkR2xvYmFscygpOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHN1cHBvcnRlZE9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRPcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNwZWM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2V0U3BlY2lmaWNhdGlvbihTdHJpbmcgc3BlYykgeworICAgICAgICBpZiAoc3BlYyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICh0aGlzLnNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnNwZWMuZXF1YWxzKHNwZWMpCisgICAgICAgICAgICAgICAgJiYgZ2V0Q29uZmlndXJhdGlvbkxvZygpLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uTG9nKCkud2FybigKKyAgICAgICAgICAgICAgICAgICAgX2xvYy5nZXQoImRpZmYtc3BlY3MiLCB0aGlzLnNwZWMsIHNwZWMpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNwZWMgPSBzcGVjOworICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMuYWZ0ZXJTcGVjaWZpY2F0aW9uU2V0KHRoaXMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1Jlc29sdmVyKFN0cmluZyBjbGFzc1Jlc29sdmVyKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGNsYXNzUmVzb2x2ZXJQbHVnaW4uc2V0U3RyaW5nKGNsYXNzUmVzb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NSZXNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzUmVzb2x2ZXJQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NSZXNvbHZlcihDbGFzc1Jlc29sdmVyIGNsYXNzUmVzb2x2ZXIpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgY2xhc3NSZXNvbHZlclBsdWdpbi5zZXQoY2xhc3NSZXNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIENsYXNzUmVzb2x2ZXIgZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkgeworICAgICAgICBpZiAoY2xhc3NSZXNvbHZlclBsdWdpbi5nZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgY2xhc3NSZXNvbHZlclBsdWdpbi5pbnN0YW50aWF0ZShDbGFzc1Jlc29sdmVyLmNsYXNzLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChDbGFzc1Jlc29sdmVyKSBjbGFzc1Jlc29sdmVyUGx1Z2luLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJyb2tlckZhY3RvcnkoU3RyaW5nIGZhY3RvcnkpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgYnJva2VyRmFjdG9yeVBsdWdpbi5zZXRTdHJpbmcoZmFjdG9yeSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCcm9rZXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gYnJva2VyRmFjdG9yeVBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCcm9rZXJJbXBsKFN0cmluZyBicm9rZXIpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgYnJva2VyUGx1Z2luLnNldFN0cmluZyhicm9rZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJva2VySW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIGJyb2tlclBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VySW1wbCBuZXdCcm9rZXJJbnN0YW5jZShTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3MpIHsKKyAgICAgICAgQnJva2VySW1wbCBicm9rZXIgPQorICAgICAgICAgICAgKEJyb2tlckltcGwpIGJyb2tlclBsdWdpbi5pbnN0YW50aWF0ZShCcm9rZXJJbXBsLmNsYXNzLCB0aGlzKTsKKyAgICAgICAgaWYgKGJyb2tlciAhPSBudWxsKQorICAgICAgICAgICAgYnJva2VyLnNldEF1dGhlbnRpY2F0aW9uKHVzZXIsIHBhc3MpOworICAgICAgICByZXR1cm4gYnJva2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGFDYWNoZU1hbmFnZXIoU3RyaW5nIG1ncikgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBkYXRhQ2FjaGVNYW5hZ2VyUGx1Z2luLnNldFN0cmluZyhtZ3IpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YUNhY2hlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFDYWNoZU1hbmFnZXJQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlTWFuYWdlcihEYXRhQ2FjaGVNYW5hZ2VyIGRjbSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBpZiAoZGNtICE9IG51bGwpCisgICAgICAgICAgICBkY20uaW5pdGlhbGl6ZSh0aGlzLCBkYXRhQ2FjaGVQbHVnaW4sIHF1ZXJ5Q2FjaGVQbHVnaW4pOworICAgICAgICBkYXRhQ2FjaGVNYW5hZ2VyUGx1Z2luLnNldChkY20pOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhQ2FjaGVNYW5hZ2VyIGdldERhdGFDYWNoZU1hbmFnZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgRGF0YUNhY2hlTWFuYWdlciBkY20gPSAoRGF0YUNhY2hlTWFuYWdlcikgZGF0YUNhY2hlTWFuYWdlclBsdWdpbi5nZXQoKTsKKyAgICAgICAgaWYgKGRjbSA9PSBudWxsKSB7CisgICAgICAgICAgICBkY20gPQorICAgICAgICAgICAgICAgIChEYXRhQ2FjaGVNYW5hZ2VyKSBkYXRhQ2FjaGVNYW5hZ2VyUGx1Z2luLmluc3RhbnRpYXRlKAorICAgICAgICAgICAgICAgICAgICBEYXRhQ2FjaGVNYW5hZ2VyLmNsYXNzLCB0aGlzKTsKKyAgICAgICAgICAgIGRjbS5pbml0aWFsaXplKHRoaXMsIGRhdGFDYWNoZVBsdWdpbiwgcXVlcnlDYWNoZVBsdWdpbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRjbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhQ2FjaGUoU3RyaW5nIGRhdGFDYWNoZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBkYXRhQ2FjaGVQbHVnaW4uc2V0U3RyaW5nKGRhdGFDYWNoZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhQ2FjaGUoKSB7CisgICAgICAgIHJldHVybiBkYXRhQ2FjaGVQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUNhY2hlVGltZW91dChpbnQgZGF0YUNhY2hlVGltZW91dCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmRhdGFDYWNoZVRpbWVvdXQuc2V0KGRhdGFDYWNoZVRpbWVvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGFDYWNoZVRpbWVvdXQoSW50ZWdlciBkYXRhQ2FjaGVUaW1lb3V0KSB7CisgICAgICAgIGlmIChkYXRhQ2FjaGVUaW1lb3V0ICE9IG51bGwpCisgICAgICAgICAgICBzZXREYXRhQ2FjaGVUaW1lb3V0KGRhdGFDYWNoZVRpbWVvdXQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXRhQ2FjaGVUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gZGF0YUNhY2hlVGltZW91dC5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUNhY2hlKFN0cmluZyBxdWVyeUNhY2hlKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHF1ZXJ5Q2FjaGVQbHVnaW4uc2V0U3RyaW5nKHF1ZXJ5Q2FjaGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5Q2FjaGVQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHluYW1pY0RhdGFTdHJ1Y3RzKCkgeworICAgICAgICByZXR1cm4gZHluYW1pY0RhdGFTdHJ1Y3RzLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER5bmFtaWNEYXRhU3RydWN0cyhib29sZWFuIGR5bmFtaWMpIHsKKyAgICAgICAgZHluYW1pY0RhdGFTdHJ1Y3RzLnNldChkeW5hbWljKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREeW5hbWljRGF0YVN0cnVjdHMoQm9vbGVhbiBkeW5hbWljKSB7CisgICAgICAgIHNldER5bmFtaWNEYXRhU3RydWN0cyhkeW5hbWljLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrTWFuYWdlcihTdHJpbmcgbG9ja01hbmFnZXIpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0U3RyaW5nKGxvY2tNYW5hZ2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2tNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbG9ja01hbmFnZXJQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIExvY2tNYW5hZ2VyIG5ld0xvY2tNYW5hZ2VySW5zdGFuY2UoKSB7CisgICAgICAgIC8vIGRvbid0IHZhbGlkYXRlIHBsdWdpbiBwcm9wZXJ0aWVzIG9uIGluc3RhbnRpYXRpb24gYmVjYXVzZSBpdAorICAgICAgICAvLyBpcyBsaWtlbHkgdGhhdCBiYWNrIGVuZHMgd2lsbCBvdmVycmlkZSBkZWZhdWx0cyB3aXRoIHRoZWlyCisgICAgICAgIC8vIG93biBzdWJjbGFzc2VzIHdpdGggbmV3IHByb3BlcnRpZXMKKyAgICAgICAgcmV0dXJuIChMb2NrTWFuYWdlcikgbG9ja01hbmFnZXJQbHVnaW4uaW5zdGFudGlhdGUoTG9ja01hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICB0aGlzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW52ZXJzZU1hbmFnZXIoU3RyaW5nIGludmVyc2VNYW5hZ2VyKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGludmVyc2VNYW5hZ2VyUGx1Z2luLnNldFN0cmluZyhpbnZlcnNlTWFuYWdlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbnZlcnNlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGludmVyc2VNYW5hZ2VyUGx1Z2luLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBJbnZlcnNlTWFuYWdlciBuZXdJbnZlcnNlTWFuYWdlckluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gKEludmVyc2VNYW5hZ2VyKSBpbnZlcnNlTWFuYWdlclBsdWdpbi5pbnN0YW50aWF0ZSgKKyAgICAgICAgICAgIEludmVyc2VNYW5hZ2VyLmNsYXNzLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlcG9pbnRNYW5hZ2VyKFN0cmluZyBzYXZlcG9pbnRNYW5hZ2VyKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHNhdmVwb2ludE1hbmFnZXJQbHVnaW4uc2V0U3RyaW5nKHNhdmVwb2ludE1hbmFnZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2F2ZXBvaW50TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVwb2ludE1hbmFnZXJQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFNhdmVwb2ludE1hbmFnZXIgZ2V0U2F2ZXBvaW50TWFuYWdlckluc3RhbmNlKCkgeworICAgICAgICBpZiAoc2F2ZXBvaW50TWFuYWdlclBsdWdpbi5nZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgc2F2ZXBvaW50TWFuYWdlclBsdWdpbi5pbnN0YW50aWF0ZShTYXZlcG9pbnRNYW5hZ2VyLmNsYXNzLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChTYXZlcG9pbnRNYW5hZ2VyKSBzYXZlcG9pbnRNYW5hZ2VyUGx1Z2luLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9ycGhhbmVkS2V5QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgb3JwaGFuZWRLZXlQbHVnaW4uc2V0U3RyaW5nKGFjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPcnBoYW5lZEtleUFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG9ycGhhbmVkS2V5UGx1Z2luLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBPcnBoYW5lZEtleUFjdGlvbiBnZXRPcnBoYW5lZEtleUFjdGlvbkluc3RhbmNlKCkgeworICAgICAgICBpZiAob3JwaGFuZWRLZXlQbHVnaW4uZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIG9ycGhhbmVkS2V5UGx1Z2luLmluc3RhbnRpYXRlKE9ycGhhbmVkS2V5QWN0aW9uLmNsYXNzLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChPcnBoYW5lZEtleUFjdGlvbikgb3JwaGFuZWRLZXlQbHVnaW4uZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3JwaGFuZWRLZXlBY3Rpb24oT3JwaGFuZWRLZXlBY3Rpb24gYWN0aW9uKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIG9ycGhhbmVkS2V5UGx1Z2luLnNldChhY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUNvbW1pdFByb3ZpZGVyKFN0cmluZyByZW1vdGVDb21taXRQcm92aWRlcikgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICByZW1vdGVQcm92aWRlclBsdWdpbi5zZXRTdHJpbmcocmVtb3RlQ29tbWl0UHJvdmlkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQ29tbWl0UHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiByZW1vdGVQcm92aWRlclBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlQ29tbWl0UHJvdmlkZXIgbmV3UmVtb3RlQ29tbWl0UHJvdmlkZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlbW90ZVByb3ZpZGVyUGx1Z2luLmluc3RhbnRpYXRlUHJvdmlkZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyKAorICAgICAgICBSZW1vdGVDb21taXRFdmVudE1hbmFnZXIgcmVtb3RlRXZlbnRNYW5hZ2VyKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMucmVtb3RlRXZlbnRNYW5hZ2VyID0gcmVtb3RlRXZlbnRNYW5hZ2VyOworICAgICAgICByZW1vdGVQcm92aWRlclBsdWdpbi5jb25maWd1cmVFdmVudE1hbmFnZXIocmVtb3RlRXZlbnRNYW5hZ2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyIGdldFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcigpIHsKKyAgICAgICAgaWYgKHJlbW90ZUV2ZW50TWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdGVFdmVudE1hbmFnZXIgPSBuZXcgUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyKHRoaXMpOworICAgICAgICAgICAgcmVtb3RlUHJvdmlkZXJQbHVnaW4uY29uZmlndXJlRXZlbnRNYW5hZ2VyKHJlbW90ZUV2ZW50TWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlbW90ZUV2ZW50TWFuYWdlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbk1vZGUoU3RyaW5nIHRyYW5zYWN0aW9uTW9kZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLnRyYW5zYWN0aW9uTW9kZS5zZXRTdHJpbmcodHJhbnNhY3Rpb25Nb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zYWN0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uTW9kZS5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbk1vZGVNYW5hZ2VkKGJvb2xlYW4gbWFuYWdlZCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0cmFuc2FjdGlvbk1vZGUuc2V0KG1hbmFnZWQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25Nb2RlTWFuYWdlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uTW9kZS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VkUnVudGltZShTdHJpbmcgbWFuYWdlZFJ1bnRpbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgbWFuYWdlZFJ1bnRpbWVQbHVnaW4uc2V0U3RyaW5nKG1hbmFnZWRSdW50aW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZWRSdW50aW1lKCkgeworICAgICAgICByZXR1cm4gbWFuYWdlZFJ1bnRpbWVQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlZFJ1bnRpbWUoTWFuYWdlZFJ1bnRpbWUgbWFuYWdlZFJ1bnRpbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgbWFuYWdlZFJ1bnRpbWVQbHVnaW4uc2V0KG1hbmFnZWRSdW50aW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFuYWdlZFJ1bnRpbWUgZ2V0TWFuYWdlZFJ1bnRpbWVJbnN0YW5jZSgpIHsKKyAgICAgICAgaWYgKG1hbmFnZWRSdW50aW1lUGx1Z2luLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBtYW5hZ2VkUnVudGltZVBsdWdpbi5pbnN0YW50aWF0ZShNYW5hZ2VkUnVudGltZS5jbGFzcywgdGhpcyk7CisgICAgICAgIHJldHVybiAoTWFuYWdlZFJ1bnRpbWUpIG1hbmFnZWRSdW50aW1lUGx1Z2luLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3h5TWFuYWdlcihTdHJpbmcgcHJveHlNYW5hZ2VyKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHByb3h5TWFuYWdlclBsdWdpbi5zZXRTdHJpbmcocHJveHlNYW5hZ2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIHByb3h5TWFuYWdlclBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm94eU1hbmFnZXIoUHJveHlNYW5hZ2VyIHByb3h5TWFuYWdlcikgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBwcm94eU1hbmFnZXJQbHVnaW4uc2V0KHByb3h5TWFuYWdlcik7CisgICAgfQorCisgICAgcHVibGljIFByb3h5TWFuYWdlciBnZXRQcm94eU1hbmFnZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgaWYgKHByb3h5TWFuYWdlclBsdWdpbi5nZXQoKSA9PSBudWxsKQorICAgICAgICAgICAgcHJveHlNYW5hZ2VyUGx1Z2luLmluc3RhbnRpYXRlKFByb3h5TWFuYWdlci5jbGFzcywgdGhpcyk7CisgICAgICAgIHJldHVybiAoUHJveHlNYW5hZ2VyKSBwcm94eU1hbmFnZXJQbHVnaW4uZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGluZyhTdHJpbmcgbWFwcGluZykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLm1hcHBpbmcuc2V0U3RyaW5nKG1hcHBpbmcpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBpbmcuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFGYWN0b3J5KFN0cmluZyBtZXRhKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMubWV0YUZhY3RvcnlQbHVnaW4uc2V0U3RyaW5nKG1ldGEpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbWV0YUZhY3RvcnlQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFEYXRhRmFjdG9yeSBuZXdNZXRhRGF0YUZhY3RvcnlJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZXRhRGF0YUZhY3RvcnkpIG1ldGFGYWN0b3J5UGx1Z2luLmluc3RhbnRpYXRlKAorICAgICAgICAgICAgTWV0YURhdGFGYWN0b3J5LmNsYXNzLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVJlcG9zaXRvcnkoU3RyaW5nIG1ldGEpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5tZXRhUmVwb3NpdG9yeVBsdWdpbi5zZXRTdHJpbmcobWV0YSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVJlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiBtZXRhUmVwb3NpdG9yeVBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVJlcG9zaXRvcnkoTWV0YURhdGFSZXBvc2l0b3J5IG1ldGEpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgbWV0YVJlcG9zaXRvcnkgPSBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChtZXRhUmVwb3NpdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgbWV0YVJlcG9zaXRvcnkgPSBuZXdNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICByZXR1cm4gbWV0YVJlcG9zaXRvcnk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFEYXRhUmVwb3NpdG9yeSBuZXdNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZXRhRGF0YVJlcG9zaXRvcnkpIG1ldGFSZXBvc2l0b3J5UGx1Z2luLmluc3RhbnRpYXRlKAorICAgICAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5LmNsYXNzLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVXNlck5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Vc2VyTmFtZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25Vc2VyTmFtZS5zZXRTdHJpbmcoY29ubmVjdGlvblVzZXJOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25Vc2VyTmFtZS5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZC5zZXRTdHJpbmcoY29ubmVjdGlvblBhc3N3b3JkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25QYXNzd29yZC5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVVJMKFN0cmluZyBjb25uZWN0aW9uVVJMKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTC5zZXRTdHJpbmcoY29ubmVjdGlvblVSTCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVVJMKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvblVSTC5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRHJpdmVyTmFtZShTdHJpbmcgZHJpdmVyTmFtZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25Ecml2ZXJOYW1lLnNldFN0cmluZyhkcml2ZXJOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Ecml2ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbkRyaXZlck5hbWUuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblByb3BlcnRpZXMoU3RyaW5nIGNvbm5lY3Rpb25Qcm9wZXJ0aWVzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblByb3BlcnRpZXMuc2V0U3RyaW5nKGNvbm5lY3Rpb25Qcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvblByb3BlcnRpZXMuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKAorICAgICAgICBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzLnNldFN0cmluZyhjb25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlNb2RlKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlNb2RlLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5TW9kZShTdHJpbmcgbW9kZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBjb25uZWN0aW9uRmFjdG9yeU1vZGUuc2V0U3RyaW5nKG1vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkZhY3RvcnlNb2RlTWFuYWdlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25GYWN0b3J5TW9kZS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeU1vZGVNYW5hZ2VkKGJvb2xlYW4gbWFuYWdlZCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBjb25uZWN0aW9uRmFjdG9yeU1vZGUuc2V0KG1hbmFnZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5TmFtZShTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlOYW1lKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbkZhY3RvcnlOYW1lLnNldFN0cmluZyhjb25uZWN0aW9uRmFjdG9yeU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlOYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlOYW1lLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5KE9iamVjdCBmYWN0b3J5KSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5LnNldChmYWN0b3J5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldENvbm5lY3Rpb25GYWN0b3J5KCkgeworICAgICAgICBpZiAoY29ubmVjdGlvbkZhY3RvcnkuZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5LnNldCgKKyAgICAgICAgICAgICAgICBsb29rdXBDb25uZWN0aW9uRmFjdG9yeShnZXRDb25uZWN0aW9uRmFjdG9yeU5hbWUoKSksIHRydWUpOworICAgICAgICByZXR1cm4gY29ubmVjdGlvbkZhY3RvcnkuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3VwIHRoZSBjb25uZWN0aW9uIGZhY3RvcnkgYXQgdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgbG9va3VwQ29ubmVjdGlvbkZhY3RvcnkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbmFtZSA9IFN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25zLmxvb2t1cChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMlVzZXJOYW1lKFN0cmluZyBjb25uZWN0aW9uMlVzZXJOYW1lKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbjJVc2VyTmFtZS5zZXRTdHJpbmcoY29ubmVjdGlvbjJVc2VyTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uMlVzZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbjJVc2VyTmFtZS5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMlBhc3N3b3JkKFN0cmluZyBjb25uZWN0aW9uMlBhc3N3b3JkKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbjJQYXNzd29yZC5zZXRTdHJpbmcoY29ubmVjdGlvbjJQYXNzd29yZCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uMlBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbjJQYXNzd29yZC5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMlVSTChTdHJpbmcgY29ubmVjdGlvbjJVUkwpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uMlVSTC5zZXRTdHJpbmcoY29ubmVjdGlvbjJVUkwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbjJVUkwoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uMlVSTC5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uMkRyaXZlck5hbWUoU3RyaW5nIGRyaXZlck5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uMkRyaXZlck5hbWUuc2V0U3RyaW5nKGRyaXZlck5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbjJEcml2ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbjJEcml2ZXJOYW1lLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24yUHJvcGVydGllcyhTdHJpbmcgY29ubmVjdGlvbjJQcm9wZXJ0aWVzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbjJQcm9wZXJ0aWVzLnNldFN0cmluZyhjb25uZWN0aW9uMlByb3BlcnRpZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbjJQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbjJQcm9wZXJ0aWVzLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMoCisgICAgICAgIFN0cmluZyBjb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcworICAgICAgICAgICAgLnNldFN0cmluZyhjb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5Mk5hbWUoU3RyaW5nIGNvbm5lY3Rpb25GYWN0b3J5Mk5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uRmFjdG9yeTJOYW1lLnNldFN0cmluZyhjb25uZWN0aW9uRmFjdG9yeTJOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5Mk5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uRmFjdG9yeTJOYW1lLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5MihPYmplY3QgZmFjdG9yeSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBjb25uZWN0aW9uRmFjdG9yeTIuc2V0KGZhY3RvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29ubmVjdGlvbkZhY3RvcnkyKCkgeworICAgICAgICBpZiAoY29ubmVjdGlvbkZhY3RvcnkyLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBjb25uZWN0aW9uRmFjdG9yeTIuc2V0KAorICAgICAgICAgICAgICAgIGxvb2t1cENvbm5lY3Rpb25GYWN0b3J5KGdldENvbm5lY3Rpb25GYWN0b3J5Mk5hbWUoKSksIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25GYWN0b3J5Mi5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpbWlzdGljKGJvb2xlYW4gb3B0aW1pc3RpYykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLm9wdGltaXN0aWMuc2V0KG9wdGltaXN0aWMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWMoQm9vbGVhbiBvcHRpbWlzdGljKSB7CisgICAgICAgIGlmIChvcHRpbWlzdGljICE9IG51bGwpCisgICAgICAgICAgICBzZXRPcHRpbWlzdGljKG9wdGltaXN0aWMuYm9vbGVhblZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXN0aWMoKSB7CisgICAgICAgIHJldHVybiBvcHRpbWlzdGljLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9DbGVhcihTdHJpbmcgY2xlYXIpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgYXV0b0NsZWFyLnNldFN0cmluZyhjbGVhcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRvQ2xlYXIoKSB7CisgICAgICAgIHJldHVybiBhdXRvQ2xlYXIuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0NsZWFyKGludCBjbGVhcikgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBhdXRvQ2xlYXIuc2V0KGNsZWFyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEF1dG9DbGVhckNvbnN0YW50KCkgeworICAgICAgICByZXR1cm4gYXV0b0NsZWFyLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJldGFpblN0YXRlKGJvb2xlYW4gcmV0YWluU3RhdGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5yZXRhaW5TdGF0ZS5zZXQocmV0YWluU3RhdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJldGFpblN0YXRlKEJvb2xlYW4gcmV0YWluU3RhdGUpIHsKKyAgICAgICAgaWYgKHJldGFpblN0YXRlICE9IG51bGwpCisgICAgICAgICAgICBzZXRSZXRhaW5TdGF0ZShyZXRhaW5TdGF0ZS5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmV0YWluU3RhdGUoKSB7CisgICAgICAgIHJldHVybiByZXRhaW5TdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN0b3JlU3RhdGUoU3RyaW5nIHJlc3RvcmVTdGF0ZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLnJlc3RvcmVTdGF0ZS5zZXRTdHJpbmcocmVzdG9yZVN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3RvcmVTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3RvcmVTdGF0ZS5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN0b3JlU3RhdGUoaW50IHJlc3RvcmVTdGF0ZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLnJlc3RvcmVTdGF0ZS5zZXQocmVzdG9yZVN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3RvcmVTdGF0ZUNvbnN0YW50KCkgeworICAgICAgICByZXR1cm4gcmVzdG9yZVN0YXRlLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXRhY2goU3RyaW5nIGF1dG9EZXRhY2gpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5hdXRvRGV0YWNoLnNldFN0cmluZyhhdXRvRGV0YWNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dG9EZXRhY2goKSB7CisgICAgICAgIHJldHVybiBhdXRvRGV0YWNoLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXRhY2goaW50IGF1dG9EZXRhY2hGbGFncykgeworICAgICAgICBhdXRvRGV0YWNoLnNldENvbnN0YW50KGF1dG9EZXRhY2hGbGFncyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBdXRvRGV0YWNoQ29uc3RhbnQoKSB7CisgICAgICAgIHJldHVybiBhdXRvRGV0YWNoLmdldENvbnN0YW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGV0YWNoU3RhdGUoU3RyaW5nIGRldGFjaFN0YXRlKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGRldGFjaFN0YXRlUGx1Z2luLnNldFN0cmluZyhkZXRhY2hTdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXRhY2hTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRldGFjaFN0YXRlUGx1Z2luLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaFN0YXRlKERldGFjaE9wdGlvbnMgZGV0YWNoU3RhdGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgZGV0YWNoU3RhdGVQbHVnaW4uc2V0KGRldGFjaFN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGV0YWNoT3B0aW9ucyBnZXREZXRhY2hTdGF0ZUluc3RhbmNlKCkgeworICAgICAgICBpZiAoZGV0YWNoU3RhdGVQbHVnaW4uZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGRldGFjaFN0YXRlUGx1Z2luLmluc3RhbnRpYXRlKERldGFjaE9wdGlvbnMuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKERldGFjaE9wdGlvbnMpIGRldGFjaFN0YXRlUGx1Z2luLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBpZ25vcmVDaGFuZ2VzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuaWdub3JlQ2hhbmdlcy5zZXQoaWdub3JlQ2hhbmdlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hhbmdlcyhCb29sZWFuIGlnbm9yZUNoYW5nZXMpIHsKKyAgICAgICAgaWYgKGlnbm9yZUNoYW5nZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldElnbm9yZUNoYW5nZXMoaWdub3JlQ2hhbmdlcy5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlQ2hhbmdlcygpIHsKKyAgICAgICAgcmV0dXJuIGlnbm9yZUNoYW5nZXMuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm9udHJhbnNhY3Rpb25hbFJlYWQoYm9vbGVhbiBub250cmFuc2FjdGlvbmFsUmVhZCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLm5vbnRyYW5zYWN0aW9uYWxSZWFkLnNldChub250cmFuc2FjdGlvbmFsUmVhZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm9udHJhbnNhY3Rpb25hbFJlYWQoQm9vbGVhbiBub250cmFuc2FjdGlvbmFsUmVhZCkgeworICAgICAgICBpZiAobm9udHJhbnNhY3Rpb25hbFJlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldE5vbnRyYW5zYWN0aW9uYWxSZWFkKG5vbnRyYW5zYWN0aW9uYWxSZWFkLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb250cmFuc2FjdGlvbmFsUmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIG5vbnRyYW5zYWN0aW9uYWxSZWFkLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vbnRyYW5zYWN0aW9uYWxXcml0ZShib29sZWFuIG5vbnRyYW5zYWN0aW9uYWxXcml0ZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLm5vbnRyYW5zYWN0aW9uYWxXcml0ZS5zZXQobm9udHJhbnNhY3Rpb25hbFdyaXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsV3JpdGUoQm9vbGVhbiBub250cmFuc2FjdGlvbmFsV3JpdGUpIHsKKyAgICAgICAgaWYgKG5vbnRyYW5zYWN0aW9uYWxXcml0ZSAhPSBudWxsKQorICAgICAgICAgICAgc2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKG5vbnRyYW5zYWN0aW9uYWxXcml0ZS5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKCkgeworICAgICAgICByZXR1cm4gbm9udHJhbnNhY3Rpb25hbFdyaXRlLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE11bHRpdGhyZWFkZWQoYm9vbGVhbiBtdWx0aXRocmVhZGVkKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMubXVsdGl0aHJlYWRlZC5zZXQobXVsdGl0aHJlYWRlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGl0aHJlYWRlZChCb29sZWFuIG11bHRpdGhyZWFkZWQpIHsKKyAgICAgICAgaWYgKG11bHRpdGhyZWFkZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldE11bHRpdGhyZWFkZWQobXVsdGl0aHJlYWRlZC5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TXVsdGl0aHJlYWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG11bHRpdGhyZWFkZWQuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hCYXRjaFNpemUoaW50IGZldGNoQmF0Y2hTaXplKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuZmV0Y2hCYXRjaFNpemUuc2V0KGZldGNoQmF0Y2hTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaEJhdGNoU2l6ZShJbnRlZ2VyIGZldGNoQmF0Y2hTaXplKSB7CisgICAgICAgIGlmIChmZXRjaEJhdGNoU2l6ZSAhPSBudWxsKQorICAgICAgICAgICAgc2V0RmV0Y2hCYXRjaFNpemUoZmV0Y2hCYXRjaFNpemUuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGZXRjaEJhdGNoU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoQmF0Y2hTaXplLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heEZldGNoRGVwdGgoaW50IG1heEZldGNoRGVwdGgpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgdGhpcy5tYXhGZXRjaERlcHRoLnNldChtYXhGZXRjaERlcHRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhGZXRjaERlcHRoKEludGVnZXIgbWF4RmV0Y2hEZXB0aCkgeworICAgICAgICBpZiAobWF4RmV0Y2hEZXB0aCAhPSBudWxsKQorICAgICAgICAgICAgc2V0TWF4RmV0Y2hEZXB0aChtYXhGZXRjaERlcHRoLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4RmV0Y2hEZXB0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1heEZldGNoRGVwdGguZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hHcm91cHMoU3RyaW5nIGZldGNoR3JvdXBzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHRoaXMuZmV0Y2hHcm91cHMuc2V0U3RyaW5nKGZldGNoR3JvdXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZldGNoR3JvdXBzKCkgeworICAgICAgICByZXR1cm4gZmV0Y2hHcm91cHMuZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEZldGNoR3JvdXBzTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoR3JvdXBzLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZldGNoR3JvdXBzKFN0cmluZ1tdIGZldGNoR3JvdXBzKSB7CisgICAgICAgIHRoaXMuZmV0Y2hHcm91cHMuc2V0KGZldGNoR3JvdXBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbHVzaEJlZm9yZVF1ZXJpZXMoU3RyaW5nIGZsdXNoKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGZsdXNoQmVmb3JlUXVlcmllcy5zZXRTdHJpbmcoZmx1c2gpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzKCkgeworICAgICAgICByZXR1cm4gZmx1c2hCZWZvcmVRdWVyaWVzLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZsdXNoQmVmb3JlUXVlcmllcyhpbnQgZmx1c2gpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgZmx1c2hCZWZvcmVRdWVyaWVzLnNldChmbHVzaCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGbHVzaEJlZm9yZVF1ZXJpZXNDb25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIGZsdXNoQmVmb3JlUXVlcmllcy5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrVGltZW91dChpbnQgdGltZW91dCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBsb2NrVGltZW91dC5zZXQodGltZW91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9ja1RpbWVvdXQoSW50ZWdlciB0aW1lb3V0KSB7CisgICAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpCisgICAgICAgICAgICBzZXRMb2NrVGltZW91dCh0aW1lb3V0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TG9ja1RpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBsb2NrVGltZW91dC5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkTG9ja0xldmVsKFN0cmluZyBsZXZlbCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICByZWFkTG9ja0xldmVsLnNldFN0cmluZyhsZXZlbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFkTG9ja0xldmVsKCkgeworICAgICAgICByZXR1cm4gcmVhZExvY2tMZXZlbC5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkTG9ja0xldmVsKGludCBsZXZlbCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICByZWFkTG9ja0xldmVsLnNldChsZXZlbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZWFkTG9ja0xldmVsQ29uc3RhbnQoKSB7CisgICAgICAgIHJldHVybiByZWFkTG9ja0xldmVsLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdyaXRlTG9ja0xldmVsKFN0cmluZyBsZXZlbCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB3cml0ZUxvY2tMZXZlbC5zZXRTdHJpbmcobGV2ZWwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVMb2NrTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiB3cml0ZUxvY2tMZXZlbC5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZUxvY2tMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgd3JpdGVMb2NrTGV2ZWwuc2V0KGxldmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdyaXRlTG9ja0xldmVsQ29uc3RhbnQoKSB7CisgICAgICAgIHJldHVybiB3cml0ZUxvY2tMZXZlbC5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZShTdHJpbmcgc2VxdWVuY2UpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgc2VxUGx1Z2luLnNldFN0cmluZyhzZXF1ZW5jZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlcVBsdWdpbi5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZShTZXEgc2VxKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIHNlcVBsdWdpbi5zZXQoc2VxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VxIGdldFNlcXVlbmNlSW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChzZXFQbHVnaW4uZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcVBsdWdpbi5pbnN0YW50aWF0ZShTZXEuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKFNlcSkgc2VxUGx1Z2luLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25SZXRhaW5Nb2RlKFN0cmluZyBjb25uZWN0aW9uUmV0YWluTW9kZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXRhaW5Nb2RlLnNldFN0cmluZyhjb25uZWN0aW9uUmV0YWluTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUmV0YWluTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25SZXRhaW5Nb2RlLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25SZXRhaW5Nb2RlKGludCBjb25uZWN0aW9uUmV0YWluTW9kZSkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXRhaW5Nb2RlLnNldChjb25uZWN0aW9uUmV0YWluTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUmV0YWluTW9kZUNvbnN0YW50KCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvblJldGFpbk1vZGUuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyTGlzdGVuZXJzKFN0cmluZyBmaWx0ZXJMaXN0ZW5lcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgZmlsdGVyTGlzdGVuZXJQbHVnaW5zLnNldFN0cmluZyhmaWx0ZXJMaXN0ZW5lcnMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gZmlsdGVyTGlzdGVuZXJQbHVnaW5zLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlckxpc3RlbmVycyhGaWx0ZXJMaXN0ZW5lcltdIGxpc3RlbmVycykgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICBmaWx0ZXJMaXN0ZW5lclBsdWdpbnMuc2V0KGxpc3RlbmVycyk7CisgICAgfQorCisgICAgcHVibGljIEZpbHRlckxpc3RlbmVyW10gZ2V0RmlsdGVyTGlzdGVuZXJJbnN0YW5jZXMoKSB7CisgICAgICAgIGlmIChmaWx0ZXJMaXN0ZW5lclBsdWdpbnMuZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGZpbHRlckxpc3RlbmVyUGx1Z2lucy5pbnN0YW50aWF0ZShGaWx0ZXJMaXN0ZW5lci5jbGFzcywgdGhpcyk7CisgICAgICAgIHJldHVybiAoRmlsdGVyTGlzdGVuZXJbXSkgZmlsdGVyTGlzdGVuZXJQbHVnaW5zLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFnZ3JlZ2F0ZUxpc3RlbmVycyhTdHJpbmcgYWdncmVnYXRlTGlzdGVuZXJzKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGFnZ3JlZ2F0ZUxpc3RlbmVyUGx1Z2lucy5zZXRTdHJpbmcoYWdncmVnYXRlTGlzdGVuZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFnZ3JlZ2F0ZUxpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZUxpc3RlbmVyUGx1Z2lucy5nZXRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZ2dyZWdhdGVMaXN0ZW5lcnMoQWdncmVnYXRlTGlzdGVuZXJbXSBsaXN0ZW5lcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgYWdncmVnYXRlTGlzdGVuZXJQbHVnaW5zLnNldChsaXN0ZW5lcnMpOworICAgIH0KKworICAgIHB1YmxpYyBBZ2dyZWdhdGVMaXN0ZW5lcltdIGdldEFnZ3JlZ2F0ZUxpc3RlbmVySW5zdGFuY2VzKCkgeworICAgICAgICBpZiAoYWdncmVnYXRlTGlzdGVuZXJQbHVnaW5zLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBhZ2dyZWdhdGVMaXN0ZW5lclBsdWdpbnMuaW5zdGFudGlhdGUoQWdncmVnYXRlTGlzdGVuZXIuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKEFnZ3JlZ2F0ZUxpc3RlbmVyW10pIGFnZ3JlZ2F0ZUxpc3RlbmVyUGx1Z2lucy5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXRyeUNsYXNzUmVnaXN0cmF0aW9uKGJvb2xlYW4gcmV0cnkpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgcmV0cnlDbGFzc1JlZ2lzdHJhdGlvbi5zZXQocmV0cnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24oQm9vbGVhbiByZXRyeSkgeworICAgICAgICBpZiAocmV0cnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24ocmV0cnkuYm9vbGVhblZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24oKSB7CisgICAgICAgIHJldHVybiByZXRyeUNsYXNzUmVnaXN0cmF0aW9uLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGF0aWJpbGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhdGliaWxpdHlQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGF0aWJpbGl0eShTdHJpbmcgY29tcGF0aWJpbGl0eSkgeworICAgICAgICBjb21wYXRpYmlsaXR5UGx1Z2luLnNldFN0cmluZyhjb21wYXRpYmlsaXR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGF0aWJpbGl0eSBnZXRDb21wYXRpYmlsaXR5SW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChjb21wYXRpYmlsaXR5UGx1Z2luLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBjb21wYXRpYmlsaXR5UGx1Z2luLmluc3RhbnRpYXRlKENvbXBhdGliaWxpdHkuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKENvbXBhdGliaWxpdHkpIGNvbXBhdGliaWxpdHlQbHVnaW4uZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeUNvbXBpbGF0aW9uQ2FjaGUoKSB7CisgICAgICAgIHJldHVybiBxdWVyeUNvbXBpbGF0aW9uQ2FjaGVQbHVnaW4uZ2V0U3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlDb21waWxhdGlvbkNhY2hlKFN0cmluZyBxdWVyeUNvbXBpbGF0aW9uQ2FjaGUpIHsKKyAgICAgICAgcXVlcnlDb21waWxhdGlvbkNhY2hlUGx1Z2luLnNldFN0cmluZyhxdWVyeUNvbXBpbGF0aW9uQ2FjaGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWFwIGdldFF1ZXJ5Q29tcGlsYXRpb25DYWNoZUluc3RhbmNlKCkgeworICAgICAgICBpZiAocXVlcnlDb21waWxhdGlvbkNhY2hlUGx1Z2luLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBxdWVyeUNvbXBpbGF0aW9uQ2FjaGVQbHVnaW4uaW5zdGFudGlhdGUoTWFwLmNsYXNzLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChNYXApIHF1ZXJ5Q29tcGlsYXRpb25DYWNoZVBsdWdpbi5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVGYWNhZGVUeXBlUmVnaXN0cnkgZ2V0U3RvcmVGYWNhZGVUeXBlUmVnaXN0cnkoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmVGYWNhZGVSZWdpc3RyeTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaW5zdGFudGlhdGVBbGwoKSB7CisgICAgICAgIHN1cGVyLmluc3RhbnRpYXRlQWxsKCk7CisgICAgICAgIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgIGdldFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByZUNsb3NlKCkgeworICAgICAgICBJbXBsSGVscGVyLmNsb3NlKG1ldGFSZXBvc2l0b3J5KTsKKyAgICAgICAgSW1wbEhlbHBlci5jbG9zZShyZW1vdGVFdmVudE1hbmFnZXIpOworICAgICAgICBzdXBlci5wcmVDbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBMb2cgZ2V0Q29uZmlndXJhdGlvbkxvZygpIHsKKyAgICAgICAgcmV0dXJuIGdldExvZyhMT0dfUlVOVElNRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFQcm9kdWN0RGVyaXZhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFQcm9kdWN0RGVyaXZhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjc2YjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQVByb2R1Y3REZXJpdmF0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKy8qKg0KKyAqIEFkZHMgZGF0YXN0b3JlIGJhc2VkIGV4dGVuc2lvbiB0byBQcm9kdWN0RGVyaXZhdGlvbi4gIA0KKyAqDQorICogQHNpbmNlIDAuNC4xDQorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyDQorICovDQorcHVibGljIGludGVyZmFjZSBPcGVuSlBBUHJvZHVjdERlcml2YXRpb24gZXh0ZW5kcyBQcm9kdWN0RGVyaXZhdGlvbiB7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1BFQyA9IDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RPUkUgPSAyMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1BFQ19TVE9SRSA9IDMwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUk9EVUNUX1NUT1JFID0gNDAwOw0KKw0KKyAgICAvKioNCisgICAgICogTG9hZCBkZWZhdWx0IGFsaWFzIG9wdGlvbnMgaW50byB0aGUgZ2l2ZW4gbWFwLiAgRWFjaCBlbnRyeSBtYXBzIGFuDQorICAgICAqIGFsaWFzIHRvIGEgYnJva2VyIGZhY3RvcnkgY2xhc3MgbmFtZS4gIFJlcGxhY2UgYW55dGhpbmcgcHJldmlvdXNseSANCisgICAgICogdW5kZXIgdGhlIGRlc2lyZWQga2V5cy4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHB1dEJyb2tlckZhY3RvcnlBbGlhc2VzKE1hcCBhbGlhc2VzKTsNCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFWZXJzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQVZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWYzMjRmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmNvbmY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgT3BlbkpQQS4gSXQgdXNlcworICogQW50J3MgZmlsdGVyIHRva2VucyB0byBjb252ZXJ0IHRoZSB0ZW1wbGF0ZSBpbnRvIGEgamF2YQorICogZmlsZSB3aXRoIGN1cnJlbnQgaW5mb3JtYXRpb24uCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgsIFBhdHJpY2sgTGluc2tleQorICovCitwdWJsaWMgY2xhc3MgT3BlbkpQQVZlcnNpb24geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9OVU1CRVI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9JRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTkFNRSA9ICJPcGVuSlBBIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9SRUxFQVNFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX1JFTEVBU0U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFUQ0hfUkVMRUFTRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxFQVNFX1NUQVRVUzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZJU0lPTl9OVU1CRVI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBQYWNrYWdlIHBhY2sgPSBPcGVuSlBBVmVyc2lvbi5jbGFzcy5nZXRQYWNrYWdlKCk7CisgICAgICAgIFN0cmluZyB2ZXJzID0gcGFjayA9PSBudWxsID8gbnVsbCA6IHBhY2suZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCk7CisgICAgICAgIGlmICh2ZXJzID09IG51bGwgfHwgIiIuZXF1YWxzKHZlcnMudHJpbSgpKSkKKyAgICAgICAgICAgIHZlcnMgPSAiMC4wLjAiOworICAgICAgICBWRVJTSU9OX05VTUJFUiA9IHZlcnM7CisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoVkVSU0lPTl9OVU1CRVIsICIuLSIpOworICAgICAgICBpbnQgbWFqb3IsIG1pbm9yLCBwYXRjaDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ham9yID0gdG9rLmhhc01vcmVUb2tlbnMoKSA/IEludGVnZXIucGFyc2VJbnQodG9rLm5leHRUb2tlbigpKSA6IDA7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtYWpvciA9IDA7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWlub3IgPSB0b2suaGFzTW9yZVRva2VucygpID8gSW50ZWdlci5wYXJzZUludCh0b2submV4dFRva2VuKCkpIDogMDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG1pbm9yID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXRjaCA9IHRvay5oYXNNb3JlVG9rZW5zKCkgPyBJbnRlZ2VyLnBhcnNlSW50KHRvay5uZXh0VG9rZW4oKSkgOiAwOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcGF0Y2ggPSAwOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJldmlzaW9uID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IE9wZW5KUEFWZXJzaW9uLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0KKyAgICAgICAgICAgICAgICAoIi9NRVRBLUlORi9vcmcuYXBhY2hlLm9wZW5qcGEucmV2aXNpb24ucHJvcGVydGllcyIpOworICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMubG9hZChpbik7CisgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0gcHJvcHMuZ2V0UHJvcGVydHkoInJldmlzaW9uLm51bWJlciIpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgTUFKT1JfUkVMRUFTRSA9IG1ham9yOworICAgICAgICBNSU5PUl9SRUxFQVNFID0gbWlub3I7CisgICAgICAgIFBBVENIX1JFTEVBU0UgPSBwYXRjaDsKKyAgICAgICAgUkVMRUFTRV9TVEFUVVMgPSB0b2suaGFzTW9yZVRva2VucygpID8gdG9rLm5leHRUb2tlbigiISIpIDogIiI7CisgICAgICAgIFJFVklTSU9OX05VTUJFUiA9IHJldmlzaW9uOworICAgICAgICBWRVJTSU9OX0lEID0gIm9wZW5qcGEtIiArIFZFUlNJT05fTlVNQkVSICsgIi1yIiArIFJFVklTSU9OX05VTUJFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IE9wZW5KUEFWZXJzaW9uKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoODAgKiAzMCk7CisgICAgICAgIGFwcGVuZE9wZW5KUEFCYW5uZXIoYnVmKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKworICAgICAgICBhcHBlbmRQcm9wZXJ0eSgib3MubmFtZSIsIGJ1ZikuYXBwZW5kKCJcbiIpOworICAgICAgICBhcHBlbmRQcm9wZXJ0eSgib3MudmVyc2lvbiIsIGJ1ZikuYXBwZW5kKCJcbiIpOworICAgICAgICBhcHBlbmRQcm9wZXJ0eSgib3MuYXJjaCIsIGJ1ZikuYXBwZW5kKCJcblxuIik7CisKKyAgICAgICAgYXBwZW5kUHJvcGVydHkoImphdmEudmVyc2lvbiIsIGJ1ZikuYXBwZW5kKCJcbiIpOworICAgICAgICBhcHBlbmRQcm9wZXJ0eSgiamF2YS52ZW5kb3IiLCBidWYpLmFwcGVuZCgiXG5cbiIpOworCisgICAgICAgIGJ1Zi5hcHBlbmQoImphdmEuY2xhc3MucGF0aDpcbiIpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcgorICAgICAgICAgICAgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIiksIEZpbGUucGF0aFNlcGFyYXRvcik7CisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcdCIpLmFwcGVuZCh0b2submV4dFRva2VuKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworCisgICAgICAgIGFwcGVuZFByb3BlcnR5KCJ1c2VyLmRpciIsIGJ1Zik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRPcGVuSlBBQmFubmVyKFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgYnVmLmFwcGVuZChWRU5ET1JfTkFNRSkuYXBwZW5kKCIgIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoVkVSU0lPTl9OVU1CRVIpOworICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKCJ2ZXJzaW9uIGlkOiAiKS5hcHBlbmQoVkVSU0lPTl9JRCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIkFwYWNoZSBzdm4gcmV2aXNpb246ICIpLmFwcGVuZChSRVZJU0lPTl9OVU1CRVIpOworICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGFwcGVuZFByb3BlcnR5KFN0cmluZyBwcm9wLCBTdHJpbmdCdWZmZXIgYnVmKSB7CisgICAgICAgIHJldHVybiBidWYuYXBwZW5kKHByb3ApLmFwcGVuZCgiOiAiKS5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KHByb3ApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvUXVlcnlDb21waWxhdGlvbkNhY2hlVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9RdWVyeUNvbXBpbGF0aW9uQ2FjaGVWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZGM1OTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvUXVlcnlDb21waWxhdGlvbkNhY2hlVmFsdWUuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5jb25mOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUGx1Z2luVmFsdWU7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DYWNoZU1hcDsNCisNCisvKioNCisgKiBBIGNhY2hlIG9mIGNvbXBpbGVkIHF1ZXJpZXMuDQorICoNCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQ0KKyAqIEBzaW5jZSAwLjkuNiAoYWxzbyBleGlzdGVkIGluIHByaW9yIHZlcnNpb25zIG9mIEtvZG8pDQorICogQG5vamF2YWRvYw0KKyAqLw0KK3B1YmxpYyBjbGFzcyBRdWVyeUNvbXBpbGF0aW9uQ2FjaGVWYWx1ZQ0KKyAgICBleHRlbmRzIFBsdWdpblZhbHVlIHsNCisNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBTElBU0VTID0gew0KKyAgICAgICAgInRydWUiLCBDYWNoZU1hcC5jbGFzcy5nZXROYW1lKCksDQorICAgICAgICAiYWxsIiwgQ29uY3VycmVudEhhc2hNYXAuY2xhc3MuZ2V0TmFtZSgpLA0KKyAgICAgICAgImZhbHNlIiwgbnVsbCwNCisgICAgfTsNCisNCisgICAgcHVibGljIFF1ZXJ5Q29tcGlsYXRpb25DYWNoZVZhbHVlKFN0cmluZyBwcm9wKSB7DQorICAgICAgICBzdXBlcihwcm9wLCB0cnVlKTsNCisgICAgICAgIHNldEFsaWFzZXMoQUxJQVNFUyk7DQorICAgICAgICBzZXREZWZhdWx0KEFMSUFTRVNbMF0pOw0KKyAgICAgICAgc2V0Q2xhc3NOYW1lKEFMSUFTRVNbMV0pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsc05hbWUsIENsYXNzIHR5cGUsDQorICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYsIGJvb2xlYW4gZmF0YWwpIHsNCisgICAgICAgIC8vIG1ha2Ugc3VyZSBtYXAgaGFuZGxlcyBjb25jdXJyZW5jeQ0KKyAgICAgICAgTWFwIG1hcCA9IChNYXApIHN1cGVyLm5ld0luc3RhbmNlKGNsc05hbWUsIHR5cGUsIGNvbmYsIGZhdGFsKTsNCisgICAgICAgIGlmIChtYXAgIT0gbnVsbCAmJiAhKG1hcCBpbnN0YW5jZW9mIEhhc2h0YWJsZSkNCisgICAgICAgICAgICAmJiAhKG1hcCBpbnN0YW5jZW9mIENhY2hlTWFwKQ0KKyAgICAgICAgICAgICYmICEobWFwIGluc3RhbmNlb2YgQ29uY3VycmVudE1hcCkpDQorICAgICAgICAgICAgbWFwID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG1hcCk7DQorICAgICAgICByZXR1cm4gbWFwOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9SZW1vdGVDb21taXRQcm92aWRlclZhbHVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvUmVtb3RlQ29tbWl0UHJvdmlkZXJWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTM3MTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvUmVtb3RlQ29tbWl0UHJvdmlkZXJWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5jb25mOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuUmVtb3RlQ29tbWl0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5QbHVnaW5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKKworLyoqCisgKiBWYWx1ZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGEge0BsaW5rIFJlbW90ZUNvbW1pdFByb3ZpZGVyfS4gVGhpcworICogcGx1Z2luIGFsbG93cyB1c2VycyB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdHJhbnNtaXQgdGhlIGlkcyBvZiBhZGRlZCBvYmplY3RzCisgKiBpbiB0aGUgcmVtb3RlIGNvbW1pdCBldmVudHMgZGlzdHJpYnV0ZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFJlbW90ZUNvbW1pdFByb3ZpZGVyVmFsdWUKKyAgICBleHRlbmRzIFBsdWdpblZhbHVlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMSUFTRVMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICJzanZtIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5TaW5nbGVKVk1SZW1vdGVDb21taXRQcm92aWRlciIsCisgICAgICAgICJqbXMiLCAib3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkpNU1JlbW90ZUNvbW1pdFByb3ZpZGVyIiwKKyAgICAgICAgInRjcCIsICJvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIiLAorICAgIH07CisKKyAgICBwcml2YXRlIE9wdGlvbnMgX29wdHMgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBfdHJhbnNtaXRQZXJzSWRzID0gbnVsbDsKKworICAgIHB1YmxpYyBSZW1vdGVDb21taXRQcm92aWRlclZhbHVlKCkgeworICAgICAgICBzdXBlcigiUmVtb3RlQ29tbWl0UHJvdmlkZXIiLCB0cnVlKTsKKyAgICAgICAgc2V0QWxpYXNlcyhBTElBU0VTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFN0cmluZyBwcm9wcykgeworICAgICAgICBzdXBlci5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKKyAgICAgICAgX29wdHMgPSBudWxsOworICAgICAgICBfdHJhbnNtaXRQZXJzSWRzID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cikgeworICAgICAgICBzdXBlci5zZXRTdHJpbmcoc3RyKTsKKyAgICAgICAgX29wdHMgPSBudWxsOworICAgICAgICBfdHJhbnNtaXRQZXJzSWRzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBSZW1vdGVDb21taXRQcm92aWRlciBnZXRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIChSZW1vdGVDb21taXRQcm92aWRlcikgZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNhY2hlZCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihSZW1vdGVDb21taXRQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBzZXQocHJvdmlkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdHJhbnNtaXQgcGVyc2lzdGVkIG9iamVjdCBpZHMgaW4gcmVtb3RlIGNvbW1pdCBldmVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNtaXRQZXJzaXN0ZWRPYmplY3RJZHMoKSB7CisgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKF90cmFuc21pdFBlcnNJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZWQgZGVjb3JhdG9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc21pdFBlcnNpc3RlZE9iamVjdElkcyhib29sZWFuIHRyYW5zbWl0KSB7CisgICAgICAgIF90cmFuc21pdFBlcnNJZHMgPSAodHJhbnNtaXQpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIFJlbW90ZUNvbW1pdFByb3ZpZGVyIGluc3RhbnRpYXRlUHJvdmlkZXIoQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZVByb3ZpZGVyKGNvbmYsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlIHRoZSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVtb3RlQ29tbWl0UHJvdmlkZXIgaW5zdGFudGlhdGVQcm92aWRlcihDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgcmV0dXJuIChSZW1vdGVDb21taXRQcm92aWRlcikgaW5zdGFudGlhdGUoUmVtb3RlQ29tbWl0UHJvdmlkZXIuY2xhc3MsCisgICAgICAgICAgICBjb25mLCBmYXRhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSByZW1vdGUgZXZlbnQgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVFdmVudE1hbmFnZXIoUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyIG1ncikgeworICAgICAgICBwYXJzZU9wdGlvbnMoKTsKKyAgICAgICAgaWYgKF90cmFuc21pdFBlcnNJZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIG1nci5zZXRUcmFuc21pdFBlcnNpc3RlZE9iamVjdElkcyhfdHJhbnNtaXRQZXJzSWRzLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0byBrZWVwIGRlY29yYXRvcnMgb3V0IG9mIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW5zdGFudGlhdGUoQ2xhc3MgdHlwZSwgQ29uZmlndXJhdGlvbiBjb25mLCBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIE9iamVjdCBvYmogPSBuZXdJbnN0YW5jZShnZXRDbGFzc05hbWUoKSwgdHlwZSwgY29uZiwgZmF0YWwpOworICAgICAgICBwYXJzZU9wdGlvbnMoKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2Uob2JqLCBjb25mLCBfb3B0cywgZ2V0UHJvcGVydHkoKSk7CisgICAgICAgIHNldChvYmosIHRydWUpOworICAgICAgICByZXR1cm4gb2JqOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZU9wdGlvbnMoKSB7CisgICAgICAgIGlmIChfb3B0cyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIF9vcHRzID0gQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzKGdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIFN0cmluZyB0cmFuc21pdCA9IFN0cmluZ1V0aWxzLnRyaW1Ub051bGwoX29wdHMucmVtb3ZlUHJvcGVydHkKKyAgICAgICAgICAgICgidHJhbnNtaXRQZXJzaXN0ZWRPYmplY3RJZHMiLCAiVHJhbnNtaXRQZXJzaXN0ZWRPYmplY3RJZHMiLCBudWxsKSk7CisgICAgICAgIGlmICh0cmFuc21pdCAhPSBudWxsKQorICAgICAgICAgICAgX3RyYW5zbWl0UGVyc0lkcyA9IEJvb2xlYW4udmFsdWVPZiAodHJhbnNtaXQpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9TZXFWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL1NlcVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0MTA4YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9TZXFWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmNvbmY7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlRpbWVTZWVkZWRTZXE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlBsdWdpblZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlNlcXVlbmNlTWV0YURhdGE7CisKKy8qKgorICogVmFsdWUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNlcXVlbmNlLiBUaGlzIHR5cGUgaXMKKyAqIGRlZmluZWQgc2VwYXJhdGVseSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJvdGggaW4gdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uCisgKiBhbmQgaW4gY2xhc3MgbWV0YWRhdGEgd2l0aCB0aGUgc2FtZSBlbmNhcHN1bGF0ZWQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU2VxVmFsdWUKKyAgICBleHRlbmRzIFBsdWdpblZhbHVlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMSUFTRVMgPSBuZXcgU3RyaW5nW117CisgICAgICAgIFNlcXVlbmNlTWV0YURhdGEuSU1QTF9USU1FLCBUaW1lU2VlZGVkU2VxLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YS5JTVBMX05BVElWRSwgVGltZVNlZWRlZFNlcS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIC8vIGRlcHJlY2F0ZWQgYWxpYXNlcworICAgICAgICAic2p2bSIsIFRpbWVTZWVkZWRTZXEuY2xhc3MuZ2V0TmFtZSgpLAorICAgIH07CisKKyAgICBwdWJsaWMgU2VxVmFsdWUoU3RyaW5nIHByb3ApIHsKKyAgICAgICAgc3VwZXIocHJvcCwgdHJ1ZSk7CisgICAgICAgIHNldEFsaWFzZXMoQUxJQVNFUyk7CisgICAgICAgIHNldERlZmF1bHQoQUxJQVNFU1swXSk7CisgICAgICAgIHNldENsYXNzTmFtZShBTElBU0VTWzFdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWMzYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQSBDb25maWd1cmF0aW9uPC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYmFzZSBPcGVuSlBBIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlcy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0Fic3RyYWN0RGF0YUNhY2hlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9BYnN0cmFjdERhdGFDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NThkZTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9BYnN0cmFjdERhdGFDYWNoZS5qYXZhCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdEV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlcjsKKworLyoqCisgKiBBYnN0cmFjdCB7QGxpbmsgRGF0YUNhY2hlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHByb3ZpZGVzIHZhcmlvdXMKKyAqIHN0YXRpc3RpY3MsIGxvZ2dpbmcsIGFuZCB0aW1lb3V0IGZ1bmN0aW9uYWxpdHkgY29tbW9uIGFjcm9zcyBjYWNoZQorICogaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhQ2FjaGUKKyAgICBleHRlbmRzIEFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlcgorICAgIGltcGxlbWVudHMgRGF0YUNhY2hlLCBDb25maWd1cmFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQml0U2V0IEVNUFRZX0JJVFNFVCA9IG5ldyBCaXRTZXQoMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgc19sb2MgPQorICAgICAgICBMb2NhbGl6ZXIuZm9yUGFja2FnZShBYnN0cmFjdERhdGFDYWNoZS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBzZXQgYnkgdGhlIHN5c3RlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZjsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2cgbG9nOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWUgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NjaGVkdWxlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZpY3Rpb25TY2hlZHVsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zY2hlZHVsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFdmljdGlvblNjaGVkdWxlKFN0cmluZyBzKSB7CisgICAgICAgIF9zY2hlZHVsZSA9IHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShEYXRhQ2FjaGVNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgaWYgKF9zY2hlZHVsZSAhPSBudWxsICYmICEiIi5lcXVhbHMoX3NjaGVkdWxlKSkgeworICAgICAgICAgICAgRGF0YUNhY2hlU2NoZWR1bGVyIHNjaGVkdWxlciA9IG1hbmFnZXIuZ2V0RGF0YUNhY2hlU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBpZiAoc2NoZWR1bGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlRXZpY3Rpb24odGhpcywgX3NjaGVkdWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbW1pdChDb2xsZWN0aW9uIGFkZGl0aW9ucywgQ29sbGVjdGlvbiBuZXdVcGRhdGVzLAorICAgICAgICBDb2xsZWN0aW9uIGV4aXN0aW5nVXBkYXRlcywgQ29sbGVjdGlvbiBkZWxldGVzKSB7CisgICAgICAgIC8vIHJlbW92ZSBhbGwgb2JqZWN0cyBpbiBkZWxldGVzIGxpc3QKKyAgICAgICAgcmVtb3ZlQWxsSW50ZXJuYWwoZGVsZXRlcyk7CisKKyAgICAgICAgLy8gbmV4dCwgYWRkIGFsbCB0aGUgbmV3IGFkZGl0aW9ucworICAgICAgICBwdXRBbGxJbnRlcm5hbChhZGRpdGlvbnMpOworICAgICAgICBwdXRBbGxJbnRlcm5hbChuZXdVcGRhdGVzKTsKKworICAgICAgICAvLyBwb3NzaWJseSBhZGQgdGhlIGV4aXN0aW5nIHVwZGF0ZXMsIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgLy8gc2VtYW50aWNzIG9mIHRoZSBjYWNoZSwgYXMgZGljdGF0ZWQgYnkgcmVjYWNoZVVwZGF0ZXMoKQorICAgICAgICBpZiAocmVjYWNoZVVwZGF0ZXMoKSkKKyAgICAgICAgICAgIHB1dEFsbEludGVybmFsKGV4aXN0aW5nVXBkYXRlcyk7CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGFkZElkcyA9IG5ldyBBcnJheUxpc3QoYWRkaXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHVwSWRzID0gbmV3IEFycmF5TGlzdChuZXdVcGRhdGVzLnNpemUoKSk7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGV4SWRzID0gbmV3IEFycmF5TGlzdChleGlzdGluZ1VwZGF0ZXMuc2l6ZSgpKTsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWRkaXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICBhZGRJZHMuYWRkKCgoRGF0YUNhY2hlUENEYXRhKSBpdGVyLm5leHQoKSkuZ2V0SWQoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdVcGRhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICB1cElkcy5hZGQoKChEYXRhQ2FjaGVQQ0RhdGEpIGl0ZXIubmV4dCgpKS5nZXRJZCgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4aXN0aW5nVXBkYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgZXhJZHMuYWRkKCgoRGF0YUNhY2hlUENEYXRhKSBpdGVyLm5leHQoKSkuZ2V0SWQoKSk7CisKKyAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLWNvbW1pdCIsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBhZGRJZHMsIHVwSWRzLCBleElkcywgZGVsZXRlcyB9KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qga2V5KSB7CisgICAgICAgIERhdGFDYWNoZVBDRGF0YSBvID0gZ2V0SW50ZXJuYWwoa2V5KTsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiBvLmlzVGltZWRPdXQoKSkgeworICAgICAgICAgICAgbyA9IG51bGw7CisgICAgICAgICAgICByZW1vdmVJbnRlcm5hbChrZXkpOworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXRpbWVvdXQiLCBrZXkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbyAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgY29udGFpbnNBbGwoQ29sbGVjdGlvbiBrZXlzKSB7CisgICAgICAgIGlmIChrZXlzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9CSVRTRVQ7CisKKyAgICAgICAgQml0U2V0IHNldCA9IG5ldyBCaXRTZXQoa2V5cy5zaXplKCkpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGkrKykKKyAgICAgICAgICAgIGlmIChjb250YWlucyhpdGVyLm5leHQoKSkpCisgICAgICAgICAgICAgICAgc2V0LnNldChpKTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhIGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIERhdGFDYWNoZVBDRGF0YSBvID0gZ2V0SW50ZXJuYWwoa2V5KTsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiBvLmlzVGltZWRPdXQoKSkgeworICAgICAgICAgICAgbyA9IG51bGw7CisgICAgICAgICAgICByZW1vdmVJbnRlcm5hbChrZXkpOworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXRpbWVvdXQiLCBrZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS1taXNzIiwga2V5KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgiY2FjaGUtaGl0Iiwga2V5KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhIHB1dChEYXRhQ2FjaGVQQ0RhdGEgZGF0YSkgeworICAgICAgICBEYXRhQ2FjaGVQQ0RhdGEgbyA9IHB1dEludGVybmFsKGRhdGEuZ2V0SWQoKSwgZGF0YSk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXB1dCIsIGRhdGEuZ2V0SWQoKSkpOworICAgICAgICByZXR1cm4gKG8gPT0gbnVsbCB8fCBvLmlzVGltZWRPdXQoKSkgPyBudWxsIDogbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoRGF0YUNhY2hlUENEYXRhIGRhdGEpIHsKKyAgICAgICAgaWYgKHJlY2FjaGVVcGRhdGVzKCkpCisgICAgICAgICAgICBwdXRJbnRlcm5hbChkYXRhLmdldElkKCksIGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhQ2FjaGVQQ0RhdGEgcmVtb3ZlKE9iamVjdCBrZXkpIHsKKyAgICAgICAgRGF0YUNhY2hlUENEYXRhIG8gPSByZW1vdmVJbnRlcm5hbChrZXkpOworICAgICAgICBpZiAobyAhPSBudWxsICYmIG8uaXNUaW1lZE91dCgpKQorICAgICAgICAgICAgbyA9IG51bGw7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS1yZW1vdmUtbWlzcyIsIGtleSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXJlbW92ZS1oaXQiLCBrZXkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IHJlbW92ZUFsbChDb2xsZWN0aW9uIGtleXMpIHsKKyAgICAgICAgaWYgKGtleXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JJVFNFVDsKKworICAgICAgICBCaXRTZXQgc2V0ID0gbmV3IEJpdFNldChrZXlzLnNpemUoKSk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaSsrKQorICAgICAgICAgICAgaWYgKHJlbW92ZShpdGVyLm5leHQoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXQuc2V0KGkpOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0cyBvZiB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKENsYXNzIGNscywgYm9vbGVhbiBzdWJDbGFzc2VzKSB7CisgICAgICAgIHJlbW92ZUFsbEludGVybmFsKGNscywgc3ViQ2xhc3Nlcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGluKE9iamVjdCBrZXkpIHsKKyAgICAgICAgYm9vbGVhbiBib29sID0gcGluSW50ZXJuYWwoa2V5KTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoYm9vbCkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS1waW4taGl0Iiwga2V5KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgiY2FjaGUtcGluLW1pc3MiLCBrZXkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IHBpbkFsbChDb2xsZWN0aW9uIGtleXMpIHsKKyAgICAgICAgaWYgKGtleXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JJVFNFVDsKKworICAgICAgICBCaXRTZXQgc2V0ID0gbmV3IEJpdFNldChrZXlzLnNpemUoKSk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaSsrKQorICAgICAgICAgICAgaWYgKHBpbihpdGVyLm5leHQoKSkpCisgICAgICAgICAgICAgICAgc2V0LnNldChpKTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwaW5BbGwoQ2xhc3MgY2xzLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cud2FybihzX2xvYy5nZXQoImNhY2hlLWNsYXNzLXBpbiIsIGdldE5hbWUoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHVucGluKE9iamVjdCBrZXkpIHsKKyAgICAgICAgYm9vbGVhbiBib29sID0gdW5waW5JbnRlcm5hbChrZXkpOworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChib29sKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXVucGluLWhpdCIsIGtleSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXVucGluLW1pc3MiLCBrZXkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IHVucGluQWxsKENvbGxlY3Rpb24ga2V5cykgeworICAgICAgICBpZiAoa2V5cy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQklUU0VUOworCisgICAgICAgIEJpdFNldCBzZXQgPSBuZXcgQml0U2V0KGtleXMuc2l6ZSgpKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpKyspCisgICAgICAgICAgICBpZiAodW5waW4oaXRlci5uZXh0KCkpKQorICAgICAgICAgICAgICAgIHNldC5zZXQoaSk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5waW5BbGwoQ2xhc3MgY2xzLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICBsb2cud2FybihzX2xvYy5nZXQoImNhY2hlLWNsYXNzLXVucGluIiwgZ2V0TmFtZSgpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGNsZWFySW50ZXJuYWwoKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgiY2FjaGUtY2xlYXIiLCBnZXROYW1lKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgY2xvc2UodHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoYm9vbGVhbiBjbGVhcikgeworICAgICAgICBpZiAoIV9jbG9zZWQpIHsKKyAgICAgICAgICAgIGlmIChjbGVhcikKKyAgICAgICAgICAgICAgICBjbGVhckludGVybmFsKCk7CisgICAgICAgICAgICBfY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gX2Nsb3NlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRFeHBpcmF0aW9uTGlzdGVuZXIoRXhwaXJhdGlvbkxpc3RlbmVyIGxpc3RlbikgeworICAgICAgICBhZGRMaXN0ZW5lcihsaXN0ZW4pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUV4cGlyYXRpb25MaXN0ZW5lcihFeHBpcmF0aW9uTGlzdGVuZXIgbGlzdGVuKSB7CisgICAgICAgIHJldHVybiByZW1vdmVMaXN0ZW5lcihsaXN0ZW4pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiWyIgKyBzdXBlci50b1N0cmluZygpICsgIjoiICsgX25hbWUgKyAiXSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIFJlbW90ZUNvbW1pdExpc3RlbmVyfSBpbnRlcmZhY2UuIElmCisgICAgICogeW91ciBjYWNoZSBzdWJjbGFzcyByZWxpZXMgb24gT3BlbkpQQSBmb3IgY2x1c3RlcmluZyBzdXBwb3J0LCBtYWtlIGl0CisgICAgICogaW1wbGVtZW50IDxjb2RlPlJlbW90ZUNvbW1pdExpc3RlbmVyPC9jb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCB0YWtlCisgICAgICogY2FyZSBvZiBpbnZhbGlkYXRpbmcgZW50cmllcyBmcm9tIHJlbW90ZSBjb21taXRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ29tbWl0KFJlbW90ZUNvbW1pdEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChfY2xvc2VkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChldmVudC5nZXRQYXlsb2FkVHlwZSgpID09IFJlbW90ZUNvbW1pdEV2ZW50LlBBWUxPQURfRVhURU5UUykgeworICAgICAgICAgICAgcmVtb3ZlQWxsVHlwZU5hbWVzSW50ZXJuYWwoZXZlbnQuZ2V0VXBkYXRlZFR5cGVOYW1lcygpKTsKKyAgICAgICAgICAgIHJlbW92ZUFsbFR5cGVOYW1lc0ludGVybmFsKGV2ZW50LmdldERlbGV0ZWRUeXBlTmFtZXMoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkcm9wIGFsbCB0aGUgY29tbWl0dGVkIE9JRHMsIGV4Y2VwdGluZyBicmFuZAorICAgICAgICAgICAgLy8gbmV3IE9JRHMuIGJyYW5kIG5ldyBPSURzIGVpdGhlciB3b24ndCBiZSBpbgorICAgICAgICAgICAgLy8gdGhlIGNhY2hlLCBvciBpZiB0aGV5IGFyZSwgd2lsbCBiZSBtb3JlIHVwIHRvIGRhdGUKKyAgICAgICAgICAgIHJlbW92ZUFsbEludGVybmFsKGV2ZW50LmdldFVwZGF0ZWRPYmplY3RJZHMoKSk7CisgICAgICAgICAgICByZW1vdmVBbGxJbnRlcm5hbChldmVudC5nZXREZWxldGVkT2JqZWN0SWRzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHdoZW4gYSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgY2FjaGUuIFByb3BhZ2F0ZXMgdGhlCisgICAgICogZXhwaXJhdGlvbiBldmVudCBvbiB0byBhbGwgZXhwaXJhdGlvbiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZAorICAgICAqIHdpdGggdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBrZXlSZW1vdmVkKE9iamVjdCBrZXksIGJvb2xlYW4gZXhwaXJlZCkgeworICAgICAgICAvLyBOb3RpZnkgYW55IGV4cGlyYXRpb24gbGlzdGVuZXJzIG9mIHRoZSBleHBpcmF0aW9uLgorICAgICAgICBpZiAoaGFzTGlzdGVuZXJzKCkpCisgICAgICAgICAgICBmaXJlRXZlbnQobmV3IEV4cGlyYXRpb25FdmVudCh0aGlzLCBrZXksIGV4cGlyZWQpKTsKKworICAgICAgICBpZiAoZXhwaXJlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLWV4cGlyZWQiLCBrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdXBkYXRlcyB0byBkYXRhIGFscmVhZHkgaW4gdGhlCisgICAgICogY2FjaGUgKGVpdGhlciBpbiB7QGxpbmsgI2NvbW1pdH0gb3IgdGhlIHtAbGluayAjdXBkYXRlfSkKKyAgICAgKiBzaG91bGQgYmUgcHV0IGJhY2sgaW50byB0aGUgY2FjaGUuIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNhY2hlVXBkYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gb2lkLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBEYXRhQ2FjaGVQQ0RhdGEgZ2V0SW50ZXJuYWwoT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgY2FjaGUsIHJldHVybmluZyB0aGUgb2xkIG9iamVjdCB1bmRlciB0aGUKKyAgICAgKiBnaXZlbiBvaWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IERhdGFDYWNoZVBDRGF0YSBwdXRJbnRlcm5hbChPYmplY3Qgb2lkLAorICAgICAgICBEYXRhQ2FjaGVQQ0RhdGEgcGMpOworCisgICAgLyoqCisgICAgICogQWxsIGFsbCBvZiB0aGUgZ2l2ZW4gb2JqZWN0cyB0byB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHV0QWxsSW50ZXJuYWwoQ29sbGVjdGlvbiBwY3MpIHsKKyAgICAgICAgRGF0YUNhY2hlUENEYXRhIHBjOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwY3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBwYyA9IChEYXRhQ2FjaGVQQ0RhdGEpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgcHV0SW50ZXJuYWwocGMuZ2V0SWQoKSwgcGMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgdW5kZXIgdGhlIGdpdmVuIG9pZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRGF0YUNhY2hlUENEYXRhIHJlbW92ZUludGVybmFsKE9iamVjdCBvaWQpOworCisgICAgLyoqCisgICAgICogRXZpY3Qgb2JqZWN0cyBpbiBjYWNoZSBieSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVBbGxJbnRlcm5hbChDbGFzcyBjbHMsIGJvb2xlYW4gc3ViY2xhc3Nlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG9iamVjdHMgdW5kZXIgdGhlIGdpdmVuIG9pZHMgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsSW50ZXJuYWwoQ29sbGVjdGlvbiBvaWRzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9pZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgcmVtb3ZlSW50ZXJuYWwoaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgb2JqZWN0cyBvZiB0aGUgZ2l2ZW4gY2xhc3MgbmFtZXMgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsVHlwZU5hbWVzSW50ZXJuYWwoQ29sbGVjdGlvbiBjbGFzc05hbWVzKSB7CisgICAgICAgIENvbGxlY3Rpb24gY2xhc3NlcyA9IENhY2hlcy5hZGRUeXBlc0J5TmFtZShjb25mLCBjbGFzc05hbWVzLCBudWxsKTsKKyAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDbGFzcyBjbHM7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjbHMgPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXJlbW92ZWNsYXNzIiwgY2xzLmdldE5hbWUoKSkpOworICAgICAgICAgICAgcmVtb3ZlQWxsSW50ZXJuYWwoY2xzLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xlYXJJbnRlcm5hbCgpOworCisgICAgLyoqCisgICAgICogUGluIGFuIG9iamVjdCB0byB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcGluSW50ZXJuYWwoT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBVbnBpbiBhbiBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gdW5waW5JbnRlcm5hbChPYmplY3Qgb2lkKTsKKworICAgIC8vIC0tLS0tLS0tLS0gQ29uZmlndXJhYmxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHRoaXMuY29uZiA9IChPcGVuSlBBQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICAgICAgdGhpcy5sb2cgPSBjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfREFUQUNBQ0hFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgaWYgKF9uYW1lID09IG51bGwpCisgICAgICAgICAgICBzZXROYW1lKE5BTUVfREVGQVVMVCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLSBBYnN0cmFjdEV2ZW50TWFuYWdlciBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoT2JqZWN0IGV2ZW50LCBPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgRXhwaXJhdGlvbkxpc3RlbmVyIGxpc3RlbiA9IChFeHBpcmF0aW9uTGlzdGVuZXIpIGxpc3RlbmVyOworICAgICAgICBFeHBpcmF0aW9uRXZlbnQgZXYgPSAoRXhwaXJhdGlvbkV2ZW50KSBldmVudDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxpc3Rlbi5vbkV4cGlyZShldik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihzX2xvYy5nZXQoImV4cC1saXN0ZW5lci1leCIpLCBlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0Fic3RyYWN0UXVlcnlDYWNoZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvQWJzdHJhY3RRdWVyeUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2YmViOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0Fic3RyYWN0UXVlcnlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdEV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50UmVmZXJlbmNlSGFzaFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JZDsKKworLyoqCisgKiBBYnN0cmFjdCB7QGxpbmsgUXVlcnlDYWNoZX0gaW1wbGVtZW50YXRpb24gdGhhdCBwcm92aWRlcyB2YXJpb3VzCisgKiBzdGF0aXN0aWNzLCBsb2dnaW5nLCBhbmQgdGltZW91dCBmdW5jdGlvbmFsaXR5IGNvbW1vbiBhY3Jvc3MgY2FjaGUKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVlcnlDYWNoZQorICAgIGV4dGVuZHMgQWJzdHJhY3RDb25jdXJyZW50RXZlbnRNYW5hZ2VyIAorICAgIGltcGxlbWVudHMgUXVlcnlDYWNoZSwgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBzX2xvYyA9CisgICAgICAgIExvY2FsaXplci5mb3JQYWNrYWdlKEFic3RyYWN0UXVlcnlDYWNoZS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBzZXQgYnkgdGhlIHN5c3RlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZjsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2cgbG9nOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9jbG9zZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGF0YUNhY2hlTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UeXBlc0NoYW5nZWQoVHlwZXNDaGFuZ2VkRXZlbnQgZXYpIHsKKyAgICAgICAgd3JpdGVMb2NrKCk7CisgICAgICAgIENvbGxlY3Rpb24ga2V5cyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaGFzTGlzdGVuZXJzKCkpCisgICAgICAgICAgICAgICAgZmlyZUV2ZW50KGV2KTsKKyAgICAgICAgICAgIGtleXMgPSBrZXlTZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHdyaXRlVW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBRdWVyeUtleSBxazsKKyAgICAgICAgTGlzdCByZW1vdmVzID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHFrID0gKFF1ZXJ5S2V5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChxay5jaGFuZ2VJbnZhbGlkYXRlc1F1ZXJ5KGV2LmdldFR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbW92ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVzLmFkZChxayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbW92ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlbW92ZUFsbEludGVybmFsKHJlbW92ZXMpOworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeVJlc3VsdCBnZXQoUXVlcnlLZXkga2V5KSB7CisgICAgICAgIFF1ZXJ5UmVzdWx0IG8gPSBnZXRJbnRlcm5hbChrZXkpOworICAgICAgICBpZiAobyAhPSBudWxsICYmIG8uaXNUaW1lZE91dCgpKSB7CisgICAgICAgICAgICBvID0gbnVsbDsKKyAgICAgICAgICAgIHJlbW92ZUludGVybmFsKGtleSk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgiY2FjaGUtdGltZW91dCIsIGtleSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAobyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLW1pc3MiLCBrZXkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS1oaXQiLCBrZXkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgUXVlcnlSZXN1bHQgcHV0KFF1ZXJ5S2V5IHFrLCBRdWVyeVJlc3VsdCBvaWRzKSB7CisgICAgICAgIFF1ZXJ5UmVzdWx0IG8gPSBwdXRJbnRlcm5hbChxaywgb2lkcyk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXB1dCIsIHFrKSk7CisgICAgICAgIHJldHVybiAobyA9PSBudWxsIHx8IG8uaXNUaW1lZE91dCgpKSA/IG51bGwgOiBvOworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeVJlc3VsdCByZW1vdmUoUXVlcnlLZXkga2V5KSB7CisgICAgICAgIFF1ZXJ5UmVzdWx0IG8gPSByZW1vdmVJbnRlcm5hbChrZXkpOworICAgICAgICBpZiAobyAhPSBudWxsICYmIG8uaXNUaW1lZE91dCgpKQorICAgICAgICAgICAgbyA9IG51bGw7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS1yZW1vdmUtbWlzcyIsIGtleSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXJlbW92ZS1oaXQiLCBrZXkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwaW4oUXVlcnlLZXkga2V5KSB7CisgICAgICAgIGJvb2xlYW4gYm9vbCA9IHBpbkludGVybmFsKGtleSk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGJvb2wpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgiY2FjaGUtcGluLWhpdCIsIGtleSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoImNhY2hlLXBpbi1taXNzIiwga2V5KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvb2w7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdW5waW4oUXVlcnlLZXkga2V5KSB7CisgICAgICAgIGJvb2xlYW4gYm9vbCA9IHVucGluSW50ZXJuYWwoa2V5KTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoYm9vbCkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS11bnBpbi1oaXQiLCBrZXkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJjYWNoZS11bnBpbi1taXNzIiwga2V5KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvb2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGNsZWFySW50ZXJuYWwoKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgiY2FjaGUtY2xlYXIiLCAiPHF1ZXJ5LWNhY2hlPiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgY2xvc2UodHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoYm9vbGVhbiBjbGVhcikgeworICAgICAgICBpZiAoIV9jbG9zZWQpIHsKKyAgICAgICAgICAgIGlmIChjbGVhcikKKyAgICAgICAgICAgICAgICBjbGVhckludGVybmFsKCk7CisgICAgICAgICAgICBfY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gX2Nsb3NlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUeXBlc0NoYW5nZWRMaXN0ZW5lcihUeXBlc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW4pIHsKKyAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVUeXBlc0NoYW5nZWRMaXN0ZW5lcihUeXBlc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW4pIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUxpc3RlbmVyKGxpc3Rlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIFJlbW90ZUNvbW1pdExpc3RlbmVyfSBpbnRlcmZhY2UuIElmCisgICAgICogeW91ciBjYWNoZSBzdWJjbGFzcyByZWxpZXMgb24gT3BlbkpQQSBmb3IgY2x1c3RlcmluZyBzdXBwb3J0LCBtYWtlIGl0CisgICAgICogaW1wbGVtZW50IDxjb2RlPlJlbW90ZUNvbW1pdExpc3RlbmVyPC9jb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCB0YWtlCisgICAgICogY2FyZSBvZiBpbnZhbGlkYXRpbmcgZW50cmllcyBmcm9tIHJlbW90ZSBjb21taXRzLCBieSBkZWxlZ2F0aW5nIHRvCisgICAgICoge0BsaW5rICNvblR5cGVzQ2hhbmdlZH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXQoUmVtb3RlQ29tbWl0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKF9jbG9zZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gZHJvcCBhbGwgY29tbWl0dGVkIGNsYXNzZXMKKyAgICAgICAgU2V0IGNsYXNzZXMgPSBDYWNoZXMuYWRkVHlwZXNCeU5hbWUoY29uZiwKKyAgICAgICAgICAgIGV2ZW50LmdldFBlcnNpc3RlZFR5cGVOYW1lcygpLCBudWxsKTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFBheWxvYWRUeXBlKCkgPT0gUmVtb3RlQ29tbWl0RXZlbnQuUEFZTE9BRF9FWFRFTlRTKSB7CisgICAgICAgICAgICBjbGFzc2VzID0gQ2FjaGVzLmFkZFR5cGVzQnlOYW1lKGNvbmYsIGV2ZW50LmdldFVwZGF0ZWRUeXBlTmFtZXMoKSwKKyAgICAgICAgICAgICAgICBjbGFzc2VzKTsKKyAgICAgICAgICAgIGNsYXNzZXMgPSBDYWNoZXMuYWRkVHlwZXNCeU5hbWUoY29uZiwgZXZlbnQuZ2V0RGVsZXRlZFR5cGVOYW1lcygpLAorICAgICAgICAgICAgICAgIGNsYXNzZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NlcyA9IGFkZFR5cGVzKGV2ZW50LmdldFVwZGF0ZWRPYmplY3RJZHMoKSwgY2xhc3Nlcyk7CisgICAgICAgICAgICBjbGFzc2VzID0gYWRkVHlwZXMoZXZlbnQuZ2V0RGVsZXRlZE9iamVjdElkcygpLCBjbGFzc2VzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhc3NlcyAhPSBudWxsKQorICAgICAgICAgICAgb25UeXBlc0NoYW5nZWQobmV3IFR5cGVzQ2hhbmdlZEV2ZW50KHRoaXMsIGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCB1cCBhIHNldCBvZiBjbGFzc2VzIGZvciB0aGUgZ2l2ZW4gb2lkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBhZGRUeXBlcyhDb2xsZWN0aW9uIG9pZHMsIFNldCBjbGFzc2VzKSB7CisgICAgICAgIGlmIChvaWRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgICAgICBpZiAoY2xhc3NlcyA9PSBudWxsKQorICAgICAgICAgICAgY2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgIE9iamVjdCBvaWQ7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2lkcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgb2lkID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChvaWQgaW5zdGFuY2VvZiBJZCkKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZCgoKElkKSBvaWQpLmdldFR5cGUoKSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvayBpZiBubyBtZXRhZGF0YSBmb3Igb2lkOyB0aGF0IGp1c3QgbWVhbnMgdGhlIHBjIHR5cGUKKyAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBoYXNuJ3QgYmVlbiBsb2FkZWQgaW50byB0aGlzIEpWTSB5ZXQsIGFuZCB0aGVyZWZvcmUKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSB0aGF0IGl0J3MgaW4gdGhlIGNhY2hlIGFueXdheQorICAgICAgICAgICAgICAgIG1ldGEgPSByZXBvcy5nZXRNZXRhRGF0YShvaWQsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChtZXRhLmdldERlc2NyaWJlZFR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdGhyZWFkc2FmZSB2aWV3IG9mIHRoZSBrZXlzIGluIHRoaXMgY2FjaGUuIFRoaXMgY29sbGVjdGlvbgorICAgICAqIG11c3QgYmUgaXRlcmFibGUgd2l0aG91dCByaXNrIG9mIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbnMuCisgICAgICogSXQgZG9lcyBub3QgaGF2ZSB0byBpbXBsZW1lbnQgY29udGFpbnMoKSBlZmZpY2llbnRseSBvciB1c2Ugc2V0CisgICAgICogc2VtYW50aWNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb2xsZWN0aW9uIGtleVNldCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsaXN0IGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBRdWVyeVJlc3VsdCBnZXRJbnRlcm5hbChRdWVyeUtleSBxayk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHJlc3VsdCB0byB0aGUgY2FjaGUsIHJldHVybmluZyB0aGUgb2xkIHJlc3VsdCB1bmRlciB0aGUKKyAgICAgKiBnaXZlbiBrZXkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFF1ZXJ5UmVzdWx0IHB1dEludGVybmFsKFF1ZXJ5S2V5IHFrLCBRdWVyeVJlc3VsdCBvaWRzKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgcmVzdWx0IHVuZGVyIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFF1ZXJ5UmVzdWx0IHJlbW92ZUludGVybmFsKFF1ZXJ5S2V5IHFrKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgcmVzdWx0cyB1bmRlciB0aGUgZ2l2ZW4ga2V5cyBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxJbnRlcm5hbChDb2xsZWN0aW9uIHFrcykgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBxa3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgcmVtb3ZlSW50ZXJuYWwoKFF1ZXJ5S2V5KSBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNhY2hlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNsZWFySW50ZXJuYWwoKTsKKworICAgIC8qKgorICAgICAqIFBpbiBhbiBvYmplY3QgdG8gdGhlIGNhY2hlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHBpbkludGVybmFsKFF1ZXJ5S2V5IHFrKTsKKworICAgIC8qKgorICAgICAqIFVucGluIGFuIG9iamVjdCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiB1bnBpbkludGVybmFsKFF1ZXJ5S2V5IHFrKTsKKworICAgIC8vIC0tLS0tLS0tLS0gQ29uZmlndXJhYmxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHRoaXMuY29uZiA9IChPcGVuSlBBQ29uZmlndXJhdGlvbikgY29uZjsKKyAgICAgICAgdGhpcy5sb2cgPSBjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfREFUQUNBQ0hFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tIEFic3RyYWN0RXZlbnRNYW5hZ2VyIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVFdmVudChPYmplY3QgZXZlbnQsIE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBUeXBlc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW4gPSAoVHlwZXNDaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyOworICAgICAgICBUeXBlc0NoYW5nZWRFdmVudCBldiA9IChUeXBlc0NoYW5nZWRFdmVudCkgZXZlbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaXN0ZW4ub25UeXBlc0NoYW5nZWQoZXYpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJleHAtbGlzdGVuZXItZXgiKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpdmlkdWFsIHF1ZXJ5IHJlc3VsdHMgd2lsbCBiZSByZWdpc3RlcmVkIGFzIHR5cGVzIGNoYW5nZWQKKyAgICAgKiBsaXN0ZW5lcnMuIFdlIHdhbnQgc3VjaCBxdWVyeSByZXN1bHRzIHRvIGJlIGdjJ2Qgb25jZQorICAgICAqIHRoZSBvbmx5IHJlZmVyZW5jZSBpcyBoZWxkIGJ5IHRoZSBsaXN0IG9mIGV4cGlyYXRpb24gbGlzdGVuZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIG5ld0xpc3RlbmVyQ29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaFNldCAoQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvQ2FjaGVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9DYWNoZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU4MmVhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvQ2FjaGVzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKKworY2xhc3MgQ2FjaGVzIHsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgdG8gYnVpbGQgdXAgYSBzZXQgb2YgY2xhc3NlcyBmcm9tIHRoZWlyIGNsYXNzIG5hbWVzCisgICAgICogd2hlbiBvcGVyYXRpbmcgb3V0c2lkZSB0aGUgY29udGV4dCBvZiBhIHBlcnNpc3RlbmNlIG1hbmFnZXIuCisgICAgICogVGhlIHNldCBjbGFzc2VzIGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGEgbmV3IFNldCB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljIFNldCBhZGRUeXBlc0J5TmFtZShPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBDb2xsZWN0aW9uIGNsYXNzTmFtZXMsIFNldCBjbGFzc2VzKSB7CisgICAgICAgIGlmIChjbGFzc05hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBjbGFzc2VzOworCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGNvbmYuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihudWxsLCBudWxsKTsKKworICAgICAgICBDbGFzcyBjbHM7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWU7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNsYXNzTmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjbGFzc05hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGxvYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpLndhcm4obnVsbCwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvQ29uY3VycmVudERhdGFDYWNoZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvQ29uY3VycmVudERhdGFDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDViODcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9Db25jdXJyZW50RGF0YUNhY2hlLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNhY2hlTWFwOworCisvKioKKyAqIEEge0BsaW5rIERhdGFDYWNoZX0gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGNvbmN1cnJlbnQKKyAqIGFjY2Vzcy4gV2hlbiB0aGUgY2FjaGUgZmlsbHMgdXAsIHZhbHVlcyB0byByZW1vdmUgZnJvbSBjYWNoZSBhcmUgY2hvc2VuCisgKiByYW5kb21seS4gRHVlIHRvIHJhY2UgY29uZGl0aW9ucywgaXQgaXMgcG9zc2libGUgdGhhdCBhIGdldCBjYWxsIG1pZ2h0IG5vdAorICogcmV0dXJuIGEgY2FjaGVkIGluc3RhbmNlIGlmIHRoYXQgaW5zdGFuY2UgaXMgYmVpbmcgdHJhbnNmZXJyZWQgYmV0d2VlbgorICogaW50ZXJuYWwgZGF0YXN0cnVjdHVyZXMuCisgKgorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBDb25jdXJyZW50RGF0YUNhY2hlCisgICAgZXh0ZW5kcyBBYnN0cmFjdERhdGFDYWNoZQorICAgIGltcGxlbWVudHMgUmVtb3RlQ29tbWl0TGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQ29uY3VycmVudERhdGFDYWNoZS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIENhY2hlTWFwIF9jYWNoZSA9IG5ld0NhY2hlTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDYWNoZU1hcH0gdGhhdCB0aGlzIGNhY2hlIGlzIHVzaW5nLgorICAgICAqIFRoaXMgaXMgbm90IGFuIHVubW9kaWZpYWJsZSB2aWV3IG9uIHRoZSBtYXAsIHNvIGNhcmUgc2hvdWxkIGJlIHRha2VuCisgICAgICogd2l0aCB0aGlzIHJlZmVyZW5jZS4gSW1wbGVtZW50YXRpb25zIHNob3VsZCBwcm9iYWJseSBub3QgbW9kaWZ5IHRoZQorICAgICAqIGNvbnRlbnRzIG9mIHRoZSBjYWNoZSwgYnV0IHNob3VsZCBvbmx5IHVzZSB0aGlzIHJlZmVyZW5jZSB0bworICAgICAqIG9idGFpbiBjYWNoZSBtZXRyaWNzLgorICAgICAqLworICAgIHB1YmxpYyBDYWNoZU1hcCBnZXRDYWNoZU1hcCgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnBpbm5lZCBvYmplY3RzIHRvIGtlZXAgaGFyZAorICAgICAqIHJlZmVyZW5jZXMgdG8uIElmIHRoZSBtYXAgY29udGFpbnMgbW9yZSB1bnBpbm5lZCBvYmplY3RzIHRoYW4KKyAgICAgKiA8Y29kZT5zaXplPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJlc3VsdCBpbiB0aGUgY2FjaGUKKyAgICAgKiBmbHVzaGluZyBvbGQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBfY2FjaGUuc2V0Q2FjaGVTaXplKHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVucGlubmVkIG9iamVjdHMgdG8ga2VlcCBoYXJkCisgICAgICogcmVmZXJlbmNlcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS5nZXRDYWNoZVNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnBpbm5lZCBvYmplY3RzIHRvIGtlZXAgc29mdAorICAgICAqIHJlZmVyZW5jZXMgdG8uIElmIHRoZSBtYXAgY29udGFpbnMgbW9yZSBzb2Z0IHJlZmVyZW5jZXMgdGhhbgorICAgICAqIDxjb2RlPnNpemU8L2NvZGU+LCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmVzdWx0IGluIHRoZSBjYWNoZQorICAgICAqIGZsdXNoaW5nIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb2Z0UmVmZXJlbmNlU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBfY2FjaGUuc2V0U29mdFJlZmVyZW5jZVNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW5waW5uZWQgb2JqZWN0cyB0byBrZWVwIHNvZnQKKyAgICAgKiByZWZlcmVuY2VzIHRvLiBEZWZhdWx0cyB0byA8Y29kZT4tMTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb2Z0UmVmZXJlbmNlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS5nZXRTb2Z0UmVmZXJlbmNlU2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGF0YUNhY2hlTWFuYWdlciBtZ3IpIHsKKyAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZShtZ3IpOworICAgICAgICBjb25mLmdldFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcigpLmFkZExpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucGluQWxsKENsYXNzIGNscywgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImNhY2hlLWNsYXNzLXVucGluLWFsbCIsIGdldE5hbWUoKSkpOworICAgICAgICB1bnBpbkFsbChfY2FjaGUuZ2V0UGlubmVkS2V5cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvY2soKSB7CisgICAgICAgIF9jYWNoZS53cml0ZUxvY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVVubG9jaygpIHsKKyAgICAgICAgX2NhY2hlLndyaXRlVW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXAgdG8gdXNlIGFzIGFuIGludGVybmFsIGNhY2hlOyBlbnRyeSBleHBpcmF0aW9ucyBtdXN0CisgICAgICogaW52b2tlIHtAbGluayBBYnN0cmFjdERhdGFDYWNoZSNrZXlSZW1vdmVkfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2FjaGVNYXAgbmV3Q2FjaGVNYXAoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2FjaGVNYXAoKSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbnRyeVJlbW92ZWQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwaXJlZCkgeworICAgICAgICAgICAgICAgIGtleVJlbW92ZWQoa2V5LCBleHBpcmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGF0YUNhY2hlUENEYXRhIGdldEludGVybmFsKE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIChEYXRhQ2FjaGVQQ0RhdGEpIF9jYWNoZS5nZXQoa2V5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGF0YUNhY2hlUENEYXRhIHB1dEludGVybmFsKE9iamVjdCBrZXksIERhdGFDYWNoZVBDRGF0YSBwYykgeworICAgICAgICByZXR1cm4gKERhdGFDYWNoZVBDRGF0YSkgX2NhY2hlLnB1dChrZXksIHBjKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGF0YUNhY2hlUENEYXRhIHJlbW92ZUludGVybmFsKE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIChEYXRhQ2FjaGVQQ0RhdGEpIF9jYWNoZS5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxJbnRlcm5hbChDbGFzcyBjbHMsIGJvb2xlYW4gc3VicykgeworICAgICAgICAvLyB3ZSBjb3VsZCBrZWVwIGEgaGlzdG9ncmFtIG9mIHRoZSBjb3VudHMgb2YgY29udGFpbmVkIGNsYXNzZXMgYW5kCisgICAgICAgIC8vIG9ubHkgY2xlYXIgaWYgd2UgaGF2ZSB0aGUgY2xhc3MsIGJ1dCB0aGF0IHN0aWxsIHdvdWxkbid0IHN1cHBvcnQgc3VicworICAgICAgICAvLyB3ZWxsLCB3b3VsZCBpbnZvbHZlIHN5bmNoaW5nLCBhbmQgd29uJ3QgeWllbGQgbXVjaCBiZW5lZml0IHdoZW4gd2UncmUKKyAgICAgICAgLy8gdXNlZCBhcyBhIHByaW1hcnkgY2FjaGUKKyAgICAgICAgX2NhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJJbnRlcm5hbCgpIHsKKyAgICAgICAgX2NhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGluSW50ZXJuYWwoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gX2NhY2hlLnBpbihrZXkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHVucGluSW50ZXJuYWwoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gX2NhY2hlLnVucGluIChrZXkpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0NvbmN1cnJlbnRRdWVyeUNhY2hlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9Db25jdXJyZW50UXVlcnlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGQwYWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9Db25jdXJyZW50UXVlcnlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DYWNoZU1hcDsKKworLyoqCisgKiBBIHtAbGluayBRdWVyeUNhY2hlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG9wdGltaXplZCBmb3IgY29uY3VycmVudAorICogYWNjZXNzLiBXaGVuIHRoZSBjYWNoZSBmaWxsIHVwLCB2YWx1ZXMgdG8gcmVtb3ZlIGZyb20gdGhlIGNhY2hlIGFyZSBjaG9zZW4KKyAqIHJhbmRvbWx5LiBEdWUgdG8gcmFjZSBjb25kaXRpb25zLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgZ2V0IGNhbGwgbWlnaHQgbm90CisgKiByZXR1ciBhIGNhY2hlZCBpbnN0YW5jZSBpZiB0aGF0IGluc3RhbmNlIGlzIGJlaW5nIHRyYW5zZmVycmVkIGJldHdlZW4KKyAqIGludGVybmFsIGRhdGFzdHJ1Y3R1cmVzLgorICoKKyAqIEBzaW5jZSAwLjQuMQorICovCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudFF1ZXJ5Q2FjaGUKKyAgICBleHRlbmRzIEFic3RyYWN0UXVlcnlDYWNoZQorICAgIGltcGxlbWVudHMgUmVtb3RlQ29tbWl0TGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBDYWNoZU1hcCBfY2FjaGUgPSBuZXdDYWNoZU1hcCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2FjaGVNYXB9IHRoYXQgdGhpcyBjYWNoZSBpcyB1c2luZy4KKyAgICAgKiBUaGlzIGlzIG5vdCBhbiB1bm1vZGlmaWFibGUgdmlldyBvbiB0aGUgbWFwLCBzbyBjYXJlIHNob3VsZCBiZSB0YWtlbgorICAgICAqIHdpdGggdGhpcyByZWZlcmVuY2UuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgcHJvYmFibHkgbm90IG1vZGlmeSB0aGUKKyAgICAgKiBjb250ZW50cyBvZiB0aGUgY2FjaGUsIGJ1dCBzaG91bGQgb25seSB1c2UgdGhpcyByZWZlcmVuY2UKKyAgICAgKiB0byBvYnRhaW4gY2FjaGUgbWV0cmljcy4gQWRkaXRpb25hbGx5LCB0aGlzIG1hcCBtYXkgY29udGFpbgorICAgICAqIGV4cGlyZWQgZGF0YS4gUmVtb3ZhbCBvZiB0aW1lZC1vdXQgZGF0YSBpcyBkb25lIGluIGEgbGF6eQorICAgICAqIGZhc2hpb24sIHNvIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgbWFwIG1heSBiZSBncmVhdGVyIHRoYW4gdGhlCisgICAgICogbnVtYmVyIG9mIG5vbi1leHBpcmVkIHF1ZXJ5IHJlc3VsdHMgaW4gY2FjaGUuCisgICAgICovCisgICAgcHVibGljIENhY2hlTWFwIGdldENhY2hlTWFwKCkgeworICAgICAgICByZXR1cm4gX2NhY2hlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVucGlubmVkIG9iamVjdHMgdG8ga2VlcCBoYXJkCisgICAgICogcmVmZXJlbmNlcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS5nZXRDYWNoZVNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnBpbm5lZCBvYmplY3RzIHRvIGtlZXAgaGFyZAorICAgICAqIHJlZmVyZW5jZXMgdG8uIElmIHRoZSBtYXAgY29udGFpbnMgbW9yZSB1bnBpbm5lZCBvYmplY3RzIHRoYW4KKyAgICAgKiA8Y29kZT5zaXplPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJlc3VsdCBpbiB0aGUgY2FjaGUKKyAgICAgKiBmbHVzaGluZyBvbGQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBfY2FjaGUuc2V0Q2FjaGVTaXplKHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVucGlubmVkIG9iamVjdHMgdG8ga2VlcCBzb2Z0CisgICAgICogcmVmZXJlbmNlcyB0by4gRGVmYXVsdHMgdG8gPGNvZGU+LTE8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U29mdFJlZmVyZW5jZVNpemUoKSB7CisgICAgICAgIHJldHVybiBfY2FjaGUuZ2V0U29mdFJlZmVyZW5jZVNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnBpbm5lZCBvYmplY3RzIHRvIGtlZXAgc29mdAorICAgICAqIHJlZmVyZW5jZXMgdG8uIElmIHRoZSBtYXAgY29udGFpbnMgbW9yZSBzb2Z0IHJlZmVyZW5jZXMgdGhhbgorICAgICAqIDxjb2RlPnNpemU8L2NvZGU+LCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmVzdWx0IGluIHRoZSBjYWNoZQorICAgICAqIGZsdXNoaW5nIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb2Z0UmVmZXJlbmNlU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBfY2FjaGUuc2V0U29mdFJlZmVyZW5jZVNpemUoc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShEYXRhQ2FjaGVNYW5hZ2VyIG1ncikgeworICAgICAgICBzdXBlci5pbml0aWFsaXplKG1ncik7CisgICAgICAgIGNvbmYuZ2V0UmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyKCkuYWRkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVMb2NrKCkgeworICAgICAgICAvLyBkZWxlZ2F0ZSBhY3R1YWxseSBkb2VzIG5vdGhpbmcsIGJ1dCBpbiBjYXNlIHRoYXQgY2hhbmdlcy4uLgorICAgICAgICBfY2FjaGUud3JpdGVMb2NrKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVVbmxvY2soKSB7CisgICAgICAgIC8vIGRlbGVnYXRlIGFjdHVhbGx5IGRvZXMgbm90aGluZywgYnV0IGluIGNhc2UgdGhhdCBjaGFuZ2VzLi4uCisgICAgICAgIF9jYWNoZS53cml0ZVVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwIHRvIHVzZSBhcyBhbiBpbnRlcm5hbCBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2FjaGVNYXAgbmV3Q2FjaGVNYXAoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2FjaGVNYXAoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUXVlcnlSZXN1bHQgZ2V0SW50ZXJuYWwoUXVlcnlLZXkgcWspIHsKKyAgICAgICAgcmV0dXJuIChRdWVyeVJlc3VsdCkgX2NhY2hlLmdldChxayk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFF1ZXJ5UmVzdWx0IHB1dEludGVybmFsKFF1ZXJ5S2V5IHFrLCBRdWVyeVJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIChRdWVyeVJlc3VsdCkgX2NhY2hlLnB1dChxaywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUXVlcnlSZXN1bHQgcmVtb3ZlSW50ZXJuYWwoUXVlcnlLZXkgcWspIHsKKyAgICAgICAgcmV0dXJuIChRdWVyeVJlc3VsdCkgX2NhY2hlLnJlbW92ZShxayk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJJbnRlcm5hbCgpIHsKKyAgICAgICAgX2NhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGluSW50ZXJuYWwoUXVlcnlLZXkgcWspIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS5waW4ocWspOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHVucGluSW50ZXJuYWwoUXVlcnlLZXkgcWspIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS51bnBpbihxayk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gX2NhY2hlLmtleVNldCAoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNzIxN2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGUuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsKKworLyoqCisgKiBJbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFueSBsZXZlbCAyIGNhY2hlIHVzZWQgYnkKKyAqIE9wZW5KUEEuIE1vc3QgZGF0YSBjYWNoZXMgd2lsbCBjaG9vc2UgdG8gaW1wbGVtZW50IHRoZQorICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGV9IGludGVyZmFjZSBhcyB3ZWxsIHNvIHRoYXQKKyAqIHRoZXkgd2lsbCBiZSBnaXZlbiB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24ganVzdCBhZnRlciBjb25zdHJ1Y3Rpb24uCisgKiAgSW1wbGVtZW50YXRpb25zIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIHJldHVybiB0aW1lZCBvdXQgZGF0YS4KKyAqCisgKiBAc2VlIEFic3RyYWN0RGF0YUNhY2hlCisgKiBAc2VlIERhdGFDYWNoZVBDRGF0YSNpc1RpbWVkT3V0CisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhQ2FjaGUKKyAgICBleHRlbmRzIENsb3NlYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBkYXRhIGNhY2hlOiA8Y29kZT5kZWZhdWx0PC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfREVGQVVMVCA9ICJkZWZhdWx0IjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGVuZC11c2VyLXZpc2libGUKKyAgICAgKiBjb2RlIHRvIGlkZW50aWZ5IHRoaXMgY2FjaGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHN0cmluZyBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjYWNoZSB0byBlbmQtdXNlciBuZWVkcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNS4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBEYXRhQ2FjaGVNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKERhdGFDYWNoZU1hbmFnZXIgbWFuYWdlcik7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgYmF0Y2ggdXBkYXRlIG9mIHRoZSBjYWNoZS4gQWRkIGFsbCB7QGxpbmsgRGF0YUNhY2hlUENEYXRhfQorICAgICAqIG9iamVjdHMgaW4gPGNvZGU+YWRkaXRpb25zPC9jb2RlPiBhbmQgaW4KKyAgICAgKiA8Y29kZT5uZXdVcGRhdGVzPC9jb2RlPiwgbWFrZSB0aGUgYXBwcm9wcmlhdGUgbW9kaWZpY2F0aW9ucyB0bworICAgICAqIGFsbCBEYXRhQ2FjaGVQQ0RhdGFzIGluIDxjb2RlPmV4aXN0aW5nVXBkYXRlczwvY29kZT4sIGFuZCBkZWxldGUgYWxsCisgICAgICogT0lEcyBpbiA8Y29kZT5kZWxldGVzPC9jb2RlPi4KKyAgICAgKiAgQWxsIGNoYW5nZXMgbWFkZSB0byBjYWNoZWQgZGF0YSBtdXN0IGJlIG1hZGUgdmlhIHRoaXMKKyAgICAgKiBtZXRob2QuIEl0IGlzIHRoaXMgbWV0aG9kIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcKKyAgICAgKiBhbnkgc2lkZS1lZmZlY3RzIHRoYXQgc2hvdWxkIGhhcHBlbiBvbiBtZWFuaW5nZnVsIGNhY2hlIGNoYW5nZXMuCisgICAgICogIEltcGxlbWVudGF0aW9ucyBzaG91bGQgYmVhciBpbiBtaW5kIHRoYXQgdGhlCisgICAgICogPGNvZGU+ZGVsZXRlczwvY29kZT4gY29sbGVjdGlvbiBtYXkgY29udGFpbiBvaWRzIHRoYXQgYXJlIGFsc28KKyAgICAgKiBpbiB0aGUgPGNvZGU+YWRkaXRpb25zPC9jb2RlPiBtYXAuIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBpdAorICAgICAqIGlzIHZhbGlkIGZvciBhIHVzZXIgdG8gZGVsZXRlIGFuIG9iamVjdCB3aXRoIGEgcGFydGljdWxhciBvaWQKKyAgICAgKiBhbmQgdGhlbiBhZGQgdGhhdCBvYmplY3QgaW4gdGhlIHNhbWUgYmF0Y2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkaXRpb25zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGF0YUNhY2hlUENEYXRhfSBvYmplY3RzLgorICAgICAqIFRoZXNlIHJlcHJlc2VudCBkYXRhIHRoYXQgaGF2ZSBiZWVuIG5ld2x5IGNyZWF0ZWQsCisgICAgICogYW5kIHRodXMgbXVzdCBiZSBhZGRlZCB0byB0aGUgY2FjaGUuCisgICAgICogQHBhcmFtIG5ld1VwZGF0ZXMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEYXRhQ2FjaGVQQ0RhdGF9IG9iamVjdHMuCisgICAgICogVGhlc2UgcmVwcmVzZW50IGRhdGEgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgYnV0CisgICAgICogd2VyZSBub3Qgb3JpZ2luYWxseSBpbiB0aGUgY2FjaGUsIGFuZCB0aHVzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGNhY2hlLgorICAgICAqIEBwYXJhbSBleGlzdGluZ1VwZGF0ZXMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEYXRhQ2FjaGVQQ0RhdGF9IG9iamVjdHMuCisgICAgICogVGhlc2UgcmVwcmVzZW50IGRhdGEgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgYW5kCisgICAgICogd2VyZSBvcmlnaW5hbGx5IGxvYWRlZCBmcm9tIHRoZSBjYWNoZS4gSXQgaXMKKyAgICAgKiB1cCB0byB0aGUgY2FjaGUgaW1wbGVtZW50YXRpb24gdG8gZGVjaWRlIGlmCisgICAgICogdGhlc2UgdmFsdWVzIG11c3QgYmUgcmUtZW5saXN0ZWQgaW4gdGhlIGNhY2hlLgorICAgICAqIFNvbWUgY2FjaGVzIG1heSByZXR1cm4gbGl2ZSBkYXRhIGZyb20ge0BsaW5rICNnZXR9CisgICAgICogaW52b2NhdGlvbnMsIGluIHdoaWNoIGNhc2UgdGhlc2UgdmFsdWVzIG5lZWQgbm90IGJlIHJlLWVubGlzdGVkLgorICAgICAqIEBwYXJhbSBkZWxldGVzIEEgY29sbGVjdGlvbiBvZiBvYmplY3QgSURzIHRoYXQgaGF2ZSBiZWVuIGRlbGV0ZWQKKyAgICAgKiBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgZHJvcHBlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29sbGVjdGlvbiBhZGRpdGlvbnMsIENvbGxlY3Rpb24gbmV3VXBkYXRlcywKKyAgICAgICAgQ29sbGVjdGlvbiBleGlzdGluZ1VwZGF0ZXMsIENvbGxlY3Rpb24gZGVsZXRlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2FjaGUgY29udGFpbnMgZGF0YQorICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gPGNvZGU+b2lkPC9jb2RlPjsgb3RoZXJ3aXNlIHJldHVybnMKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleGVzIG9mIHRoZSBvaWRzIGluIHRoaXMgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIEJpdFNldCBjb250YWluc0FsbChDb2xsZWN0aW9uIG9pZHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gb2lkLiBNb2RpZnlpbmcgdGhlIHJldHVybmVkCisgICAgICogb2JqZWN0IG1heSBvciBtYXkgbm90IGNoYW5nZSB0aGUgY2FjaGVkIHZhbHVlOyB0aGUge0BsaW5rICN1cGRhdGV9CisgICAgICogbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIHJlLWNhY2hlIGFueSBjaGFuZ2VkIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIG9pZCwgb3IgbnVsbCBpZiBub25lCisgICAgICovCisgICAgcHVibGljIERhdGFDYWNoZVBDRGF0YSBnZXQoT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGluc3RhbmNlLiBUaGlzIGRvZXMgPGVtPm5vdDwvZW0+CisgICAgICogcmVzdWx0IGluIGFuIHVwZGF0ZSBvZiBvdGhlciBjYWNoZXMuIFJhdGhlciwgaXQgc2hvdWxkIG9ubHkgYmUKKyAgICAgKiB1c2VkIGZvciBsb2FkaW5nIGNsZWFuIGRhdGEgaW50byB0aGUgY2FjaGUuIE1lYW5pbmdmdWwgY2hhbmdlcworICAgICAqIHRvIHRoZSBzdGF0ZSBvZiB0aGUgY2FjaGUgc2hvdWxkIGJlIG1hZGUgdmlhIHRoZSB7QGxpbmsgI2NvbW1pdH0gbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBjYWNoZWQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogdGhlIHZhbHVlIHdhcyBub3QgcHJldmlvdXNseSBjYWNoZWQuIFNlZSB7QGxpbmsgTWFwI3B1dH0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhIHB1dChEYXRhQ2FjaGVQQ0RhdGEgdmFsdWUpOworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4gVGhpcyBkb2VzCisgICAgICogPGVtPm5vdDwvZW0+IHJlc3VsdCBpbiBhbiB1cGRhdGUgb2Ygb3RoZXIgY2FjaGVzLiBSYXRoZXIsIGl0IHNob3VsZAorICAgICAqIG9ubHkgYmUgdXNlZCBmb3IgbG9hZGluZyBjbGVhbiBkYXRhIGludG8gdGhlIGNhY2hlLiBNZWFuaW5nZnVsIGNoYW5nZXMKKyAgICAgKiB0byB0aGUgc3RhdGUgb2YgdGhlIGNhY2hlIHNob3VsZCBiZSBtYWRlIHZpYSB0aGUge0BsaW5rICNjb21taXR9IG1ldGhvZC4KKyAgICAgKiAgQSBjYWNoZSBpbXBsZW1lbnRhdGlvbiBtYXkgb3IgbWF5IG5vdCByZXR1cm4gYSBsaXZlIG9iamVjdAorICAgICAqIGZyb20ge0BsaW5rICNnZXR9IGludm9jYXRpb25zLiBJZiBhbiBvYmplY3QgcmV0cmlldmVkIGZyb20gYQorICAgICAqIHtAbGluayAjZ2V0fSBvcGVyYXRpb24gbmVlZHMgdG8gYmUgdXBkYXRlZCwgdGhpcyBtZXRob2QgY2FuIGJlCisgICAgICogaW52b2tlZCBpbnN0ZWFkIG9mIGludm9raW5nIHtAbGluayAjcHV0fS4gVGhlIERhdGFDYWNoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNhbiB0aGVuIG1ha2Ugb3B0aW1pemF0aW9ucyBiYXNlZCBvbiBob3cgaXRzIHtAbGluayAjZ2V0fSBtZXRob2Qgd29ya3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKERhdGFDYWNoZVBDRGF0YSB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHZhbHVlIHN0b3JlZCB1bmRlciB0aGUgZ2l2ZW4gb2lkLiBUaGlzIGRvZXMKKyAgICAgKiA8ZW0+bm90PC9lbT4gcmVzdWx0IGluIGFuIHVwZGF0ZSBvZiBvdGhlciBjYWNoZXMuIFJhdGhlciwgaXQKKyAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciByZW1vdmluZyBkYXRhIGluIHRoZSBjYWNoZS4KKyAgICAgKiBNZWFuaW5nZnVsIGNoYW5nZXMgdG8gdGhlIHN0YXRlIG9mIHRoZSBjYWNoZSBzaG91bGQgYmUgbWFkZQorICAgICAqIHZpYSB0aGUge0BsaW5rICNjb21taXR9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgY2FjaGVkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqIHRoZSBvaWQgd2FzIG5vdCBwcmV2aW91c2x5IGNhY2hlZC4gU2VlIHtAbGluayBNYXAjcmVtb3ZlfQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhQ2FjaGVQQ0RhdGEgcmVtb3ZlKE9iamVjdCBvaWQpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSB2YWx1ZXMgc3RvcmVkIHVuZGVyIHRoZSBnaXZlbiBvaWRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW5kZXhlcyBvZiB0aGUgcmVtb3ZlZCBvaWRzCisgICAgICogQHNlZSAjcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIEJpdFNldCByZW1vdmVBbGwoQ29sbGVjdGlvbiBvaWRzKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0IGFsbCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoQ2xhc3MgY2xzLCBib29sZWFuIHN1YmNsYXNzZXMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBkYXRhIGZyb20gdGhpcyBjYWNoZS4gVGhpcyBkb2VzIDxlbT5ub3Q8L2VtPiByZXN1bHQKKyAgICAgKiBpbiBhbiB1cGRhdGUgb2Ygb3RoZXIgY2FjaGVzLiBSYXRoZXIsIGl0IHNob3VsZCBvbmx5IGJlIHVzZWQKKyAgICAgKiBmb3IgY2xlYXJpbmcgdGhlIGNhY2hlLiBNZWFuaW5nZnVsIGNoYW5nZXMgdG8gdGhlIHN0YXRlIG9mIHRoZQorICAgICAqIGNhY2hlIHNob3VsZCBiZSBtYWRlIHZpYSB0aGUge0BsaW5rICNjb21taXR9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogUGluIHRoZSB2YWx1ZSBzdG9yZWQgdW5kZXIgPGNvZGU+b2lkPC9jb2RlPiBpbnRvIHRoZSBjYWNoZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBndWFyYW50ZWVzIHRoYXQgPGNvZGU+b2lkPC9jb2RlPidzIHZhbHVlIHdpbGwgbm90CisgICAgICogYmUgZHJvcHBlZCBieSB0aGUgY2FjaGluZyBhbGdvcml0aG0uIFRoaXMgbWV0aG9kIGRvZXMgbm90CisgICAgICogYWZmZWN0IHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgI3JlbW92ZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPm9pZDwvY29kZT4ncyB2YWx1ZSB3YXMKKyAgICAgKiBwaW5uZWQgaW50byB0aGUgY2FjaGU7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgb2lkIGlzIG5vdCBpbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcGluKE9iamVjdCBvaWQpOworCisgICAgLyoqCisgICAgICogUGluIGFsbCBvaWRzIHRvIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4ZXMgb2YgdGhlIHBpbm5lZCBvaWRzCisgICAgICogQHNlZSAjcGluCisgICAgICovCisgICAgcHVibGljIEJpdFNldCBwaW5BbGwoQ29sbGVjdGlvbiBvaWRzKTsKKworICAgIC8qKgorICAgICAqIFBpbiBhbGwgb2lkcyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICogQHBhcmFtIHN1YnMgV2hldGhlciB0byBpbmNsdWRlIHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGluQWxsKENsYXNzIGNscywgYm9vbGVhbiBzdWJzKTsKKworICAgIC8qKgorICAgICAqIFVucGluIHRoZSB2YWx1ZSBzdG9yZWQgdW5kZXIgPGNvZGU+b2lkPC9jb2RlPiBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXZlcnNlcyBhIHByZXZpb3VzIGludm9jYXRpb24gb2Yge0BsaW5rICNwaW59LgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJlbW92ZSBhbnl0aGluZyBmcm9tIHRoZSBjYWNoZTsgaXQgbWVyZWx5CisgICAgICogbWFrZXMgPGNvZGU+b2lkPC9jb2RlPidzIHZhbHVlIGEgY2FuZGlkYXRlIGZvciBmbHVzaGluZyBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+b2lkPC9jb2RlPidzIHZhbHVlIHdhcworICAgICAqIHVucGlubmVkIGZyb20gdGhlIGNhY2hlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlCisgICAgICogb2lkIGlzIG5vdCBpbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdW5waW4oT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBVbnBpbiBhbGwgb2lkcyBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4ZXMgb2YgdGhlIHVucGlubmVkIG9pZHMKKyAgICAgKiBAc2VlICN1bnBpbgorICAgICAqLworICAgIHB1YmxpYyBCaXRTZXQgdW5waW5BbGwoQ29sbGVjdGlvbiBvaWRzKTsKKworICAgIC8qKgorICAgICAqIFVucGluIGFsbCBvaWRzIGFzc29jaWFlZCB3aXRoIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGNhY2hlLgorICAgICAqIEBwYXJhbSBzdWJzIFdoZXRoZXIgdG8gaW5jbHVkZSBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucGluQWxsKENsYXNzIGNscywgYm9vbGVhbiBzdWJzKTsKKworICAgIC8qKgorICAgICAqIE9idGFpbiBhIHdyaXRlIGxvY2sgb24gdGhlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG9jaygpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgd3JpdGUgbG9jayBvbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVVbmxvY2soKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBleHBpcmF0aW9uIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY2FjaGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4yLjUuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEV4cGlyYXRpb25MaXN0ZW5lcihFeHBpcmF0aW9uTGlzdGVuZXIgbGlzdGVuKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleHBpcmF0aW9uIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjYWNoZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNS4wCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRXhwaXJhdGlvbkxpc3RlbmVyKEV4cGlyYXRpb25MaXN0ZW5lciBsaXN0ZW4pOworCisgICAgLyoqCisgICAgICogRnJlZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhpcyBjYWNoZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZSAoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzRiZWMxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5PYmplY3RWYWx1ZTsKKworLyoqCisgKiBNYW5hZ2VzIHRoZSBzeXN0ZW0ncyBkYXRhIGFuZCBxdWVyeSBjYWNoZXMuIFlvdSBjYW4KKyAqIHJldHJpZXZlIHRoZSBkYXRhIGNhY2hlIG1hbmFnZXIgZnJvbSB0aGUge0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9ufS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhQ2FjaGVNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIG1hbmFnZXIsIHN1cHBseWluZyB0aGUgY2FjaGUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYsIE9iamVjdFZhbHVlIGRhdGFDYWNoZSwKKyAgICAgICAgT2JqZWN0VmFsdWUgcXVlcnlDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbS13aWRlIGRhdGEgY2FjaGUsIG9yIG51bGwgaWYgY2FjaGluZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YUNhY2hlIGdldFN5c3RlbURhdGFDYWNoZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lZCBkYXRhIGNhY2hlLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBEYXRhQ2FjaGUgZ2V0RGF0YUNhY2hlKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZWQgZGF0YSBjYWNoZS4gSWYgdGhlIGdpdmVuIG5hbWUgaXMgbnVsbCwgdGhlIGRlZmF1bHQKKyAgICAgKiBkYXRhIGNhY2hlIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNyZWF0ZSBpZiB0cnVlLCB0aGUgY2FjaGUgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKKyAgICAgKiBub3QgYWxyZWFkeSBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBEYXRhQ2FjaGUgZ2V0RGF0YUNhY2hlKFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBxdWVyeSBjYWNoZSwgb3IgbnVsbCBpZiBub3QgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlDYWNoZSBnZXRTeXN0ZW1RdWVyeUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFBDRGF0YSBnZW5lcmF0b3IgaWYgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhR2VuZXJhdG9yIGdldFBDRGF0YUdlbmVyYXRvcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBydW5uYWJsZSB3aGljaCBzY2hlZHVsZXMgZXZpY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhQ2FjaGVTY2hlZHVsZXIgZ2V0RGF0YUNhY2hlU2NoZWR1bGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhbGwgY2FjaGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGVNYW5hZ2VySW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlTWFuYWdlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWE0MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlTWFuYWdlckltcGwuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuT2JqZWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworCisvKioKKyAqIERlZmF1bHQgZGF0YSBjYWNoZSBtYW5hZ2VyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICovCitwdWJsaWMgY2xhc3MgRGF0YUNhY2hlTWFuYWdlckltcGwKKyAgICBpbXBsZW1lbnRzIENsb3NlYWJsZSwgRGF0YUNhY2hlTWFuYWdlciB7CisKKyAgICBwcml2YXRlIERhdGFDYWNoZSBfY2FjaGUgPSBudWxsOworICAgIHByaXZhdGUgUXVlcnlDYWNoZSBfcXVlcnlDYWNoZSA9IG51bGw7CisgICAgcHJpdmF0ZSBEYXRhQ2FjaGVQQ0RhdGFHZW5lcmF0b3IgX3BjR2VuZXJhdG9yID0gbnVsbDsKKyAgICBwcml2YXRlIERhdGFDYWNoZVNjaGVkdWxlciBfc2NoZWR1bGVyID0gbnVsbDsKKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiwgT2JqZWN0VmFsdWUgZGF0YUNhY2hlLAorICAgICAgICBPYmplY3RWYWx1ZSBxdWVyeUNhY2hlKSB7CisgICAgICAgIF9jYWNoZSA9IChEYXRhQ2FjaGUpIGRhdGFDYWNoZS5pbnN0YW50aWF0ZShEYXRhQ2FjaGUuY2xhc3MsIGNvbmYpOworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gY3JlYXRlIGhlbHBlcnMgYmVmb3JlIGluaXRpYWxpemluZyBjYWNoZXMKKyAgICAgICAgaWYgKGNvbmYuZ2V0RHluYW1pY0RhdGFTdHJ1Y3RzKCkpCisgICAgICAgICAgICBfcGNHZW5lcmF0b3IgPSBuZXcgRGF0YUNhY2hlUENEYXRhR2VuZXJhdG9yKGNvbmYpOworICAgICAgICBfc2NoZWR1bGVyID0gbmV3IERhdGFDYWNoZVNjaGVkdWxlcihjb25mKTsKKworICAgICAgICBfY2FjaGUuaW5pdGlhbGl6ZSh0aGlzKTsKKyAgICAgICAgX3F1ZXJ5Q2FjaGUgPSAoUXVlcnlDYWNoZSkgcXVlcnlDYWNoZS5pbnN0YW50aWF0ZShRdWVyeUNhY2hlLmNsYXNzLAorICAgICAgICAgICAgY29uZik7CisgICAgICAgIGlmIChfcXVlcnlDYWNoZSAhPSBudWxsKQorICAgICAgICAgICAgX3F1ZXJ5Q2FjaGUuaW5pdGlhbGl6ZSh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlIGdldFN5c3RlbURhdGFDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGFDYWNoZShudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIERhdGFDYWNoZSBnZXREYXRhQ2FjaGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGFDYWNoZShuYW1lLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIERhdGFDYWNoZSBnZXREYXRhQ2FjaGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgKF9jYWNoZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKF9jYWNoZS5nZXROYW1lKCkpKSkKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGU7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeUNhY2hlIGdldFN5c3RlbVF1ZXJ5Q2FjaGUoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnlDYWNoZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhR2VuZXJhdG9yIGdldFBDRGF0YUdlbmVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIF9wY0dlbmVyYXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlU2NoZWR1bGVyIGdldERhdGFDYWNoZVNjaGVkdWxlcigpIHsKKyAgICAgICAgcmV0dXJuIF9zY2hlZHVsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIEltcGxIZWxwZXIuY2xvc2UoX2NhY2hlKTsKKyAgICAgICAgSW1wbEhlbHBlci5jbG9zZShfcXVlcnlDYWNoZSk7CisgICAgICAgIGlmIChfc2NoZWR1bGVyICE9IG51bGwpCisgICAgICAgICAgICBfc2NoZWR1bGVyLnN0b3AoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGVQQ0RhdGEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVBDRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWI0MGYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGVQQ0RhdGEuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlBDRGF0YTsKKworLyoqCisgKiBTcGVjaWFsaXplZCB7QGxpbmsgUENEYXRhfSBpbXBsZW1lbnRhdGlvbiBmb3IgZGF0YSBjYWNoaW5nLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YUNhY2hlUENEYXRhCisgICAgZXh0ZW5kcyBQQ0RhdGEgeworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGRhdGEgaXMgdGltZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVGltZWRPdXQoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVBDRGF0YUdlbmVyYXRvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlUENEYXRhR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwYjQ0ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVBDRGF0YUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRGF0YUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkFic3RyYWN0UENEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0NsYXNzOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNGaWVsZDsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDTWV0aG9kOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQ29kZTsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuSnVtcEluc3RydWN0aW9uOworCisvKioKKyAqIEEge0BsaW5rIFBDRGF0YUdlbmVyYXRvcn0gaW5zdGFuY2Ugd2hpY2ggZ2VuZXJhdGVzIHByb3Blcmx5CisgKiBzeW5jaHJvbml6ZWQgaW5zdGFuY2VzIHN1aXRhYmxlIGZvciB1c2UgaW4gdGhlIGNhY2hlLiBJbiBhZGRpdGlvbiwKKyAqIHByb3BlciB0aW1lZCBiZWhhdmlvciBpcyBhZGRlZC4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQHNpbmNlIDAuMy4zLjAKKyAqLworcHVibGljIGNsYXNzIERhdGFDYWNoZVBDRGF0YUdlbmVyYXRvciBleHRlbmRzIFBDRGF0YUdlbmVyYXRvciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NURklYID0gImRhdGFjYWNoZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgX3N5bmNocyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QKKyAgICAgICAgKG5ldyBTdHJpbmcgW117ICJnZXREYXRhIiwgInNldERhdGEiLCAiY2xlYXJEYXRhIiwgImdldEltcGxEYXRhIiwKKyAgICAgICAgICAgICJzZXRJbXBsRGF0YSIsICJzZXRJbnRlcm1lZGlhdGUiLCAiZ2V0SW50ZXJtZWRpYXRlIiwKKyAgICAgICAgICAgICJpc0xvYWRlZCIsICJzZXRMb2FkZWQiLCAic2V0VmVyc2lvbiIsICJnZXRWZXJzaW9uIiwgInN0b3JlIgorICAgICAgICB9KSk7CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhR2VuZXJhdG9yKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgc3VwZXIoY29uZik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVOYW1lKENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFVuaXF1ZU5hbWUodHlwZSkgKyBQT1NURklYOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaChEeW5hbWljUENEYXRhIGRhdGEsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpbnQgdGltZW91dCA9IG1ldGEuZ2V0RGF0YUNhY2hlVGltZW91dCgpOworICAgICAgICBpZiAodGltZW91dCA+IDApCisgICAgICAgICAgICAoKFRpbWVkKSBkYXRhKS5zZXRUaW1lb3V0KHRpbWVvdXQgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICgoVGltZWQpIGRhdGEpLnNldFRpbWVvdXQoLTEpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRlY29yYXRlKEJDQ2xhc3MgYmMsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBlbmhhbmNlVG9EYXRhKGJjKTsKKyAgICAgICAgZW5oYW5jZVRvTmVzdGVkRGF0YShiYyk7CisgICAgICAgIHJlcGxhY2VOZXdFbWJlZGRlZFBDRGF0YShiYyk7CisgICAgICAgIGFkZFN5bmNocm9uaXphdGlvbihiYyk7CisgICAgICAgIGFkZFRpbWVvdXQoYmMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmhhbmNlVG9EYXRhKEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgQkNNZXRob2QgbWV0aCA9IGJjLmRlY2xhcmVNZXRob2QoInRvRGF0YSIsIE9iamVjdC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzcyBbXXsgRmllbGRNZXRhRGF0YS5jbGFzcywgT2JqZWN0LmNsYXNzLCAKKyAgICAgICAgICAgIFN0b3JlQ29udGV4dC5jbGFzcyB9KTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworICAgICAgICAvLyBpZiAoZm1kLmlzTFJTICgpKSkKKyAgICAgICAgLy8gCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoRmllbGRNZXRhRGF0YS5jbGFzcywgImlzTFJTIiwKKyAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MsIG51bGwpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmZXEoKTsKKyAgICAgICAgY29kZS5nZXRzdGF0aWMoKS5zZXRGaWVsZChBYnN0cmFjdFBDRGF0YS5jbGFzcywgIk5VTEwiLCBPYmplY3QuY2xhc3MpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgLy8gc3VwZXIudG9EYXRhIChmbWQsIHZhbCwgY3R4KTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRUaGlzKCkpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgxKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDIpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoQWJzdHJhY3RQQ0RhdGEuY2xhc3MsICJ0b0RhdGEiLAorICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCBuZXcgQ2xhc3NbXXsgRmllbGRNZXRhRGF0YS5jbGFzcywgT2JqZWN0LmNsYXNzLAorICAgICAgICAgICAgU3RvcmVDb250ZXh0LmNsYXNzIH0pOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmhhbmNlVG9OZXN0ZWREYXRhKEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgQkNNZXRob2QgbWV0aCA9IGJjLmRlY2xhcmVNZXRob2QoInRvTmVzdGVkRGF0YSIsIE9iamVjdC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzcyBbXXsgVmFsdWVNZXRhRGF0YS5jbGFzcywgT2JqZWN0LmNsYXNzLCAKKyAgICAgICAgICAgIFN0b3JlQ29udGV4dC5jbGFzcyB9KTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgLy8gCQlyZXR1cm4gbnVsbDsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbm9ubnVsbCgpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKworICAgICAgICAvLyBpbnQgdHlwZSA9IHZtZC5nZXREZWNsYXJlZFR5cGVDb2RlICgpOworICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFBhcmFtKDApKTsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoVmFsdWVNZXRhRGF0YS5jbGFzcywKKyAgICAgICAgICAgICJnZXREZWNsYXJlZFR5cGVDb2RlIiwgaW50LmNsYXNzLCBudWxsKTsKKyAgICAgICAgaW50IGxvY2FsID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgY29kZS5pc3RvcmUoKS5zZXRMb2NhbChsb2NhbCk7CisKKyAgICAgICAgLy8gaWYgKHR5cGUgIT0gSmF2YVR5cGVzLkNPTExFQ1RJT04gJiYKKyAgICAgICAgLy8gCSAgIHR5cGUgIT0gSmF2YVR5cGVzLk1BUCAmJgorICAgICAgICAvLyAJICAgdHlwZSAhPSBKYXZhVHlwZXMuQVJSQVkpCisgICAgICAgIC8vIAkgICByZXR1cm4gc3VwZXIudG9OZXN0ZWREYXRhKHR5cGUsIHZhbCwgY3R4KTsKKyAgICAgICAgLy8gCWVsc2UKKyAgICAgICAgLy8gCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgQ29sbGVjdGlvbiBqdW1wcyA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRMb2NhbChsb2NhbCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShKYXZhVHlwZXMuQ09MTEVDVElPTik7CisgICAgICAgIGp1bXBzLmFkZChjb2RlLmlmaWNtcGVxKCkpOworICAgICAgICBjb2RlLmlsb2FkKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoSmF2YVR5cGVzLk1BUCk7CisgICAgICAgIGp1bXBzLmFkZChjb2RlLmlmaWNtcGVxKCkpOworICAgICAgICBjb2RlLmlsb2FkKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoSmF2YVR5cGVzLkFSUkFZKTsKKyAgICAgICAganVtcHMuYWRkKGNvZGUuaWZpY21wZXEoKSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMik7CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChBYnN0cmFjdFBDRGF0YS5jbGFzcywgInRvTmVzdGVkRGF0YSIsCisgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG5ldyBDbGFzc1tdeyBWYWx1ZU1ldGFEYXRhLmNsYXNzLCBPYmplY3QuY2xhc3MsCisgICAgICAgICAgICBTdG9yZUNvbnRleHQuY2xhc3MgfSk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICBzZXRUYXJnZXQoY29kZS5nZXRzdGF0aWMoKS5zZXRGaWVsZAorICAgICAgICAgICAgKEFic3RyYWN0UENEYXRhLmNsYXNzLCAiTlVMTCIsIE9iamVjdC5jbGFzcyksIGp1bXBzKTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZU5ld0VtYmVkZGVkUENEYXRhKEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgQkNNZXRob2QgbWV0aCA9IGJjLmRlY2xhcmVNZXRob2QoIm5ld0VtYmVkZGVkUENEYXRhIiwgCisgICAgICAgICAgICBBYnN0cmFjdFBDRGF0YS5jbGFzcywgbmV3IENsYXNzW117IE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MgfSk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyByZXR1cm4gbmV3IERhdGFDYWNoZVBDRGF0YUltcGwoc20uZ2V0T2JqZWN0SWQoKSwgc20uZ2V0TWV0YURhdGEoKSk7CisgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoRGF0YUNhY2hlUENEYXRhSW1wbC5jbGFzcyk7CisgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywgImdldElkIiwgCisgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsIAorICAgICAgICAgICAgImdldE1ldGFEYXRhIiwgQ2xhc3NNZXRhRGF0YS5jbGFzcywgbnVsbCk7CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChEYXRhQ2FjaGVQQ0RhdGFJbXBsLmNsYXNzLCAiPGluaXQ+IiwKKyAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLCBDbGFzc01ldGFEYXRhLmNsYXNzIH0pOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRpbWVvdXQoQkNDbGFzcyBiYykgeworICAgICAgICBiYy5kZWNsYXJlSW50ZXJmYWNlKERhdGFDYWNoZVBDRGF0YS5jbGFzcyk7CisgICAgICAgIGJjLmRlY2xhcmVJbnRlcmZhY2UoVGltZWQuY2xhc3MpOworCisgICAgICAgIC8vIHB1YmxpYyBib29sZWFuIGlzVGltZWRPdXQgKCk7CisgICAgICAgIEJDRmllbGQgZmllbGQgPSBhZGRCZWFuRmllbGQoYmMsICJ0aW1lb3V0IiwgbG9uZy5jbGFzcyk7CisgICAgICAgIEJDTWV0aG9kIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKCJpc1RpbWVkT3V0IiwgYm9vbGVhbi5jbGFzcywgbnVsbCk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyBpZiAodGltZW91dCA9PSAtMSkgLi4uCisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgtMUwpOworICAgICAgICBjb2RlLmxjbXAoKTsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmbmVnID0gY29kZS5pZmVxKCk7CisKKyAgICAgICAgLy8gaWYgKHRpbWVvdXQgPj0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpKQorICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoZmllbGQpOworICAgICAgICBjb2RlLmludm9rZXN0YXRpYygpLnNldE1ldGhvZChTeXN0ZW0uY2xhc3MsICJjdXJyZW50VGltZU1pbGxpcyIsCisgICAgICAgICAgICBsb25nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgY29kZS5sY21wKCk7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZm5leHAgPSBjb2RlLmlmZ2UoKTsKKworICAgICAgICAvLyByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKDEpOworCisgICAgICAgIC8vIC4uLiBlbHNlIHJldHVybiBmYWxzZTsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIGdvMiA9IGNvZGUuZ28yKCk7CisgICAgICAgIEluc3RydWN0aW9uIGZsc2UgPSBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMCk7CisgICAgICAgIGlmbmVnLnNldFRhcmdldChmbHNlKTsKKyAgICAgICAgaWZuZXhwLnNldFRhcmdldChmbHNlKTsKKyAgICAgICAgZ28yLnNldFRhcmdldChjb2RlLmlyZXR1cm4oKSk7CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRTeW5jaHJvbml6YXRpb24oQkNDbGFzcyBiYykgeworICAgICAgICBCQ01ldGhvZFtdIG1ldGhvZHMgPSBiYy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5pc1B1YmxpYygpCisgICAgICAgICAgICAgICAgJiYgX3N5bmNocy5jb250YWlucyhtZXRob2RzW2ldLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgbWV0aG9kc1tpXS5zZXRTeW5jaHJvbml6ZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgc3luY2hyb25pemVkIGlzTG9hZGVkIGNhbGwuCisgICAgICAgIC8vIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0xvYWRlZCAoaW50IGZpZWxkKQorICAgICAgICAvLyB7CisgICAgICAgIC8vIAkJcmV0dXJuIHN1cGVyLmlzTG9hZGVkIChmaWVsZCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gYmMuZGVjbGFyZU1ldGhvZCgiaXNMb2FkZWQiLCBib29sZWFuLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgbWV0aG9kLnNldFN5bmNocm9uaXplZCh0cnVlKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKEFic3RyYWN0UENEYXRhLmNsYXNzLCAiaXNMb2FkZWQiLAorICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmlyZXR1cm4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgaW50ZXJmYWNlIHRvIGdpdmUgYWNjZXNzIHRvIGV4cGlyYXRpb24gdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBUaW1lZCB7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVBDRGF0YUltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVBDRGF0YUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFhNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlUENEYXRhSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQWJzdHJhY3RQQ0RhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5QQ0RhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5QQ0RhdGFJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKKworLyoqCisgKiBTcGVjaWFsaXplZCB7QGxpbmsgUENEYXRhfSBpbXBsZW1lbnRhdGlvbiBmb3IgZGF0YSBjYWNoaW5nLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBpcyBwcm9wZXJseSBzeW5jaHJvbml6ZWQuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGNsYXNzIERhdGFDYWNoZVBDRGF0YUltcGwKKyAgICBleHRlbmRzIFBDRGF0YUltcGwKKyAgICBpbXBsZW1lbnRzIERhdGFDYWNoZVBDRGF0YSB7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgX2V4cDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhQ2FjaGVQQ0RhdGFJbXBsKE9iamVjdCBvaWQsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBzdXBlcihvaWQsIG1ldGEpOworCisgICAgICAgIGludCB0aW1lb3V0ID0gbWV0YS5nZXREYXRhQ2FjaGVUaW1lb3V0KCk7CisgICAgICAgIGlmICh0aW1lb3V0ID4gMCkKKyAgICAgICAgICAgIF9leHAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9leHAgPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RpbWVkT3V0KCkgeworICAgICAgICByZXR1cm4gX2V4cCAhPSAtMSAmJiBfZXhwIDwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0RGF0YShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldERhdGEoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREYXRhKGludCBpbmRleCwgT2JqZWN0IHZhbCkgeworICAgICAgICBzdXBlci5zZXREYXRhKGluZGV4LCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRhdGEoaW50IGluZGV4KSB7CisgICAgICAgIHN1cGVyLmNsZWFyRGF0YShpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0SW1wbERhdGEoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRJbXBsRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbXBsRGF0YShPYmplY3QgdmFsKSB7CisgICAgICAgIHN1cGVyLnNldEltcGxEYXRhKHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0SW1wbERhdGEoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRJbXBsRGF0YShpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEltcGxEYXRhKGludCBpbmRleCwgT2JqZWN0IHZhbCkgeworICAgICAgICBzdXBlci5zZXRJbXBsRGF0YShpbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXRJbnRlcm1lZGlhdGUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRJbnRlcm1lZGlhdGUoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbnRlcm1lZGlhdGUoaW50IGluZGV4LCBPYmplY3QgdmFsKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybWVkaWF0ZShpbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMb2FkZWQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBzdXBlci5pc0xvYWRlZChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExvYWRlZChpbnQgaW5kZXgsIGJvb2xlYW4gbG9hZGVkKSB7CisgICAgICAgIHN1cGVyLnNldExvYWRlZChpbmRleCwgbG9hZGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmVyc2lvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKSB7CisgICAgICAgIHN1cGVyLnNldFZlcnNpb24odmVyc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgc3VwZXIuc3RvcmUoc20pOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9yZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzKSB7CisgICAgICAgIHN1cGVyLnN0b3JlKHNtLCBmaWVsZHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgdG9EYXRhKEZpZWxkTWV0YURhdGEgZm1kLCBPYmplY3QgdmFsLCBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIC8vIGF2b2lkIGNhY2hpbmcgbGFyZ2UgcmVzdWx0IHNldCBmaWVsZHMKKyAgICAgICAgaWYgKGZtZC5pc0xSUygpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBzdXBlci50b0RhdGEoZm1kLCB2YWwsIGN0eCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCB0b05lc3RlZERhdGEoVmFsdWVNZXRhRGF0YSB2bWQsIE9iamVjdCB2YWwsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gZG9uJ3QgdHJ5IHRvIGNhY2hlIG5lc3RlZCBjb250YWluZXJzCisgICAgICAgIHN3aXRjaCAodm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9OZXN0ZWREYXRhKHZtZCwgdmFsLCBjdHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0UENEYXRhIG5ld0VtYmVkZGVkUENEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ2FjaGVQQ0RhdGFJbXBsKHNtLmdldElkKCksIHNtLmdldE1ldGFEYXRhKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVNjaGVkdWxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlU2NoZWR1bGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3MGMzNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZVNjaGVkdWxlci5qYXZhCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIENyb24tc3R5bGUgY2FjaGUgZXZpY3Rpb24uIFVuZGVyc3RhbmRzIHNjaGVkdWxlcyBiYXNlZCBvbiBjcm9uIGZvcm1hdDoKKyAqIDxjb2RlPm1pbnV0ZSBob3VyIG1kYXkgbW9udGggd2RheTwvY29kZT4KKyAqIEZvciBleGFtcGxlOgorICogPGNvZGU+MTUsMzAgNiwxOSAyLDEwIDEgMiA8L2NvZGU+CisgKiBXb3VsZCBydW4gYXQgMTUgYW5kIDMwIHBhc3QgdGhlIDZBTSBhbmQgN1BNLCBvbiB0aGUgMm5kIGFuZCAxMHRoCisgKiBvZiBKYW51YXJ5IHdoZW4gaXRzIGEgTW9uZGF5LgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhQ2FjaGVTY2hlZHVsZXIKKyAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKERhdGFDYWNoZVNjaGVkdWxlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IF9mb20gPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSBISDptbTpzcyIpOworCisgICAgcHJpdmF0ZSBNYXAgX2NhY2hlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3RvcCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF9pbnRlcnZhbCA9IDI7CisgICAgcHJpdmF0ZSBMb2cgX2xvZzsKKyAgICBwcml2YXRlIFRocmVhZCBfdGhyZWFkOworCisgICAgcHVibGljIERhdGFDYWNoZVNjaGVkdWxlcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZ0ZhY3RvcnkoKS5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX0RBVEFDQUNIRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVydmFsIHRpbWUgaW4gbWludXRlcyBiZXR3ZWVuIGNhY2hlIGNoZWNrcy4gRGVmYXVsdHMgdG8gMi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEludGVydmFsKCkgeworICAgICAgICByZXR1cm4gX2ludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcnZhbCB0aW1lIGluIG1pbnV0ZXMgYmV0d2VlbiBjYWNoZSBjaGVja3MuIERlZmF1bHRzIHRvIDIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJ2YWwoaW50IGludGVydmFsKSB7CisgICAgICAgIF9pbnRlcnZhbCA9IGludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGFzc29jaWF0ZWQgdGhyZWFkIGlmIHRoZXJlIGFuZCBzdG9wIHRoZSBjdXJyZW50IHJ1bm5hYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBfc3RvcCA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3RvcHBlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9wOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlIHRoZSBnaXZlbiBjYWNoZSBmb3IgZXZpY3Rpb24uIFN0YXJ0cyB0aGUgc2NoZWR1bGluZyB0aHJlYWQKKyAgICAgKiBpZiBub3Qgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2NoZWR1bGVFdmljdGlvbihEYXRhQ2FjaGUgY2FjaGUsIFN0cmluZyB0aW1lcykgeworICAgICAgICBpZiAodGltZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTY2hlZHVsZSBzY2hlZHVsZSA9IG5ldyBTY2hlZHVsZSh0aW1lcyk7CisgICAgICAgIF9jYWNoZXMucHV0KGNhY2hlLCBzY2hlZHVsZSk7CisgICAgICAgIF9zdG9wID0gZmFsc2U7CisgICAgICAgIGlmIChfdGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIF90aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsIF9sb2MuZ2V0KCJzY2hlZHVsZXItbmFtZSIpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBfdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIF90aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgic2NoZWR1bGVyLXN0YXJ0IiwgX3RocmVhZC5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FjaGUgZnJvbSBzY2hlZHVsaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVGcm9tU2NoZWR1bGUoRGF0YUNhY2hlIGNhY2hlKSB7CisgICAgICAgIF9jYWNoZXMucmVtb3ZlKGNhY2hlKTsKKyAgICAgICAgaWYgKF9jYWNoZXMuc2l6ZSgpID09IDApCisgICAgICAgICAgICBzdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgic2NoZWR1bGVyLWludGVydmFsIiwgX2ludGVydmFsICsgIiIpKTsKKworICAgICAgICBEYXRlIGxhc3RSdW4gPSBuZXcgRGF0ZSgpOworICAgICAgICB3aGlsZSAoIWlzU3RvcHBlZCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChfaW50ZXJ2YWwgKiA2MCAqIDEwMDApOworCisgICAgICAgICAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgICAgIERhdGFDYWNoZSBjYWNoZTsKKyAgICAgICAgICAgICAgICBTY2hlZHVsZSBzY2hlZHVsZTsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NhY2hlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IChEYXRhQ2FjaGUpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IChTY2hlZHVsZSkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlLm1hdGNoZXMobGFzdFJ1biwgbm93KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJzY2hlZHVsZXItY2xlYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5nZXROYW1lKCksIF9mb20uZm9ybWF0KG5vdykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2aWN0KGNhY2hlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0UnVuID0gbm93OworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJzY2hlZHVsZXItZmFpbCIpLCBlKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoInNjaGVkdWxlci1zdG9wIikpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChpc1N0b3BwZWQoKSkKKyAgICAgICAgICAgICAgICBfdGhyZWFkID0gbnVsbDsgLy8gYmUgc3VyZSB0byBkZXJlZiB0aGUgdGhyZWFkIHNvIGl0IGNhbiByZXN0YXJ0CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmljdChEYXRhQ2FjaGUgY2FjaGUpIHsKKyAgICAgICAgY2FjaGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyB0aGUgZ2l2ZW4gdGltZSBzY2hlZHVsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY2hlZHVsZSB7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludFtdIFdJTERDQVJEID0gbmV3IGludFswXTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludFtdIFVOSVRTID0geworICAgICAgICAgICAgQ2FsZW5kYXIuTU9OVEgsCisgICAgICAgICAgICBDYWxlbmRhci5EQVlfT0ZfTU9OVEgsCisgICAgICAgICAgICBDYWxlbmRhci5EQVlfT0ZfV0VFSywKKyAgICAgICAgICAgIENhbGVuZGFyLkhPVVJfT0ZfREFZLAorICAgICAgICAgICAgQ2FsZW5kYXIuTUlOVVRFCisgICAgICAgIH07CisgICAgICAgIGZpbmFsIGludFtdIG1vbnRoOworICAgICAgICBmaW5hbCBpbnRbXSBkYXlPZk1vbnRoOworICAgICAgICBmaW5hbCBpbnRbXSBkYXlPZldlZWs7CisgICAgICAgIGZpbmFsIGludFtdIGhvdXI7CisgICAgICAgIGZpbmFsIGludFtdIG1pbjsKKworICAgICAgICBwdWJsaWMgU2NoZWR1bGUoU3RyaW5nIGRhdGUpIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGF0ZSwgIiBcdCIpOworICAgICAgICAgICAgaWYgKHRva2VuLmNvdW50VG9rZW5zKCkgIT0gNSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWNvdW50IiwgZGF0ZSkpLgorICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWluID0gcGFyc2UodG9rZW4ubmV4dFRva2VuKCksIDAsIDYwKTsKKyAgICAgICAgICAgICAgICBob3VyID0gcGFyc2UodG9rZW4ubmV4dFRva2VuKCksIDAsIDI0KTsKKyAgICAgICAgICAgICAgICBkYXlPZk1vbnRoID0gcGFyc2UodG9rZW4ubmV4dFRva2VuKCksIDEsIDMxKTsKKyAgICAgICAgICAgICAgICBtb250aCA9IHBhcnNlKHRva2VuLm5leHRUb2tlbigpLCAxLCAxMyk7CisgICAgICAgICAgICAgICAgZGF5T2ZXZWVrID0gcGFyc2UodG9rZW4ubmV4dFRva2VuKCksIDEsIDgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXNjaGVkdWxlIiwgZGF0ZSksIHQpLgorICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50W10gcGFyc2UoU3RyaW5nIHRva2VuLCBpbnQgbWluLCBpbnQgbWF4KSB7CisgICAgICAgICAgICBpZiAoIioiLmVxdWFscyh0b2tlbi50cmltKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBXSUxEQ0FSRDsKKyAgICAgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IFN0cmluZ3Muc3BsaXQodG9rZW4sICIsIiwgMCk7CisgICAgICAgICAgICBpbnQgW10gdGltZXMgPSBuZXcgaW50W3Rva2Vucy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aW1lc1tpXSA9IEludGVnZXIucGFyc2VJbnQodG9rZW5zW2ldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm90LW51bWJlciIsIHRva2VuKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzW2ldIDwgbWluIHx8IHRpbWVzW2ldID49IG1heCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1yYW5nZSIsIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YobWluKSwgU3RyaW5nLnZhbHVlT2YobWF4KSkpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGltZXM7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIG1hdGNoZXMoRGF0ZSBsYXN0LCBEYXRlIG5vdykgeworICAgICAgICAgICAgQ2FsZW5kYXIgdGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICB0aW1lLnNldFRpbWUobm93KTsKKyAgICAgICAgICAgIHRpbWUuc2V0KENhbGVuZGFyLlNFQ09ORCwgMCk7CisgICAgICAgICAgICB0aW1lLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7CisKKyAgICAgICAgICAgIGludFtdW10gYWxsID0KKyAgICAgICAgICAgICAgICBuZXcgaW50W11bXXsgbW9udGgsIGRheU9mTW9udGgsIGRheU9mV2VlaywgaG91ciwgbWluIH07CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcyhsYXN0LCBub3csIHRpbWUsIGFsbCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhEYXRlIGxhc3QsIERhdGUgbm93LCBDYWxlbmRhciB0aW1lLAorICAgICAgICAgICAgaW50W11bXSB0aW1lcywgaW50IGRlcHRoKSB7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gVU5JVFMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgRGF0ZSBjb21wYXJlID0gdGltZS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUuY29tcGFyZVRvKGxhc3QpID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgY29tcGFyZS5jb21wYXJlVG8obm93KSA8IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lc1tkZXB0aF0gIT0gV0lMRENBUkQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzW2RlcHRoXS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aW1lLnNldChVTklUU1tkZXB0aF0sIHRpbWVzW2RlcHRoXVtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKGxhc3QsIG5vdywgdGltZSwgdGltZXMsIGRlcHRoICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcyhsYXN0LCBub3csIHRpbWUsIHRpbWVzLCBkZXB0aCArIDEpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlU3RvcmVNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGVTdG9yZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFmYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGF0YUNhY2hlU3RvcmVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRGF0YUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkRlbGVnYXRpbmdTdG9yZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Mb2NrTGV2ZWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlBDU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUxhbmd1YWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3B0aW1pc3RpY0V4Y2VwdGlvbjsKKworLyoqCisgKiBTdG9yZU1hbmFnZXIgcHJveHkgdGhhdCBkZWxlZ2F0ZXMgdG8gYSBkYXRhIGNhY2hlIHdoZW4gcG9zc2libGUuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIERhdGFDYWNoZVN0b3JlTWFuYWdlcgorICAgIGV4dGVuZHMgRGVsZWdhdGluZ1N0b3JlTWFuYWdlciB7CisKKyAgICAvLyBhbGwgdGhlIHN0YXRlIG1hbmFnZXJzIGNoYW5nZWQgaW4gdGhpcyB0cmFuc2FjdGlvbgorICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfaW5zZXJ0cyA9IG51bGw7IC8vIHN0YXRlbWFuYWdlcnMKKyAgICBwcml2YXRlIE1hcCBfdXBkYXRlcyA9IG51bGw7IC8vIHN0YXRlbWFuYWdlciAtPiBmbWQgc2V0CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9kZWxldGVzID0gbnVsbDsgLy8gc3RhdGVtYW5hZ2VycworCisgICAgLy8gdGhlIG93bmluZyBjb250ZXh0CisgICAgcHJpdmF0ZSBTdG9yZUNvbnRleHQgX2N0eCA9IG51bGw7CisKKyAgICAvLyBwYyBkYXRhIGdlbmVyYXRvcgorICAgIHByaXZhdGUgUENEYXRhR2VuZXJhdG9yIF9nZW4gPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc20gdGhlIHN0b3JlIG1hbmFnZXIgdG8gZGVsZWdhdGUgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YUNhY2hlU3RvcmVNYW5hZ2VyKFN0b3JlTWFuYWdlciBzbSkgeworICAgICAgICBzdXBlcihzbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIF9jdHggPSBjdHg7CisgICAgICAgIF9nZW4gPSBjdHguZ2V0Q29uZmlndXJhdGlvbigpLmdldERhdGFDYWNoZU1hbmFnZXJJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0UENEYXRhR2VuZXJhdG9yKCk7CisgICAgICAgIHN1cGVyLnNldENvbnRleHQoY3R4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbigpIHsKKyAgICAgICAgc3VwZXIuYmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhY2hlcygpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2luc2VydHMgPSBudWxsOworICAgICAgICAgICAgX3VwZGF0ZXMgPSBudWxsOworICAgICAgICAgICAgX2RlbGV0ZXMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5yb2xsYmFjaygpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2luc2VydHMgPSBudWxsOworICAgICAgICAgICAgX3VwZGF0ZXMgPSBudWxsOworICAgICAgICAgICAgX2RlbGV0ZXMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZpY3QgYWxsIG1lbWJlcnMgb2YgdGhlIGdpdmVuIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV2aWN0VHlwZXMoQ29sbGVjdGlvbiBjbGFzc2VzKSB7CisgICAgICAgIGlmIChjbGFzc2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgbWRyID0gX2N0eC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBfY3R4LmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgQ2xhc3MgY2xzOworICAgICAgICBEYXRhQ2FjaGUgY2FjaGU7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY2xhc3Nlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY2xzID0gKENsYXNzKSBpdHIubmV4dCgpOworICAgICAgICAgICAgY2FjaGUgPSBtZHIuZ2V0TWV0YURhdGEoY2xzLCBsb2FkZXIsIGZhbHNlKS5nZXREYXRhQ2FjaGUoKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNhY2hlLnJlbW92ZUFsbChjbHMsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBhbGwgY2FjaGVzIHdpdGggdGhlIGNvbW1pdHRlZCBpbnNlcnRzLCB1cGRhdGVzLCBhbmQgZGVsZXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVzKCkgeworICAgICAgICAvLyBtYXAgZWFjaCBkYXRhIGNhY2hlIHRvIHRoZSBtb2RpZmljYXRpb25zIHdlIG5lZWQgdG8gcGVyZm9ybQorICAgICAgICBNYXAgbW9kTWFwID0gbnVsbDsKKyAgICAgICAgTW9kaWZpY2F0aW9ucyBtb2RzOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtOworICAgICAgICBEYXRhQ2FjaGVQQ0RhdGEgZGF0YTsKKyAgICAgICAgRGF0YUNhY2hlIGNhY2hlOworCisgICAgICAgIC8vIGNyZWF0ZSBwYyBkYXRhcyBmb3IgaW5zZXJ0cworICAgICAgICBpZiAoX2N0eC5nZXRQb3B1bGF0ZURhdGFDYWNoZSgpICYmIF9pbnNlcnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2luc2VydHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBzbSA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGNhY2hlID0gc20uZ2V0TWV0YURhdGEoKS5nZXREYXRhQ2FjaGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAobW9kTWFwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG1vZE1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgbW9kcyA9IGdldE1vZGlmaWNhdGlvbnMobW9kTWFwLCBjYWNoZSk7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ld1BDRGF0YShzbSk7CisgICAgICAgICAgICAgICAgZGF0YS5zdG9yZShzbSk7CisgICAgICAgICAgICAgICAgbW9kcy5hZGRpdGlvbnMuYWRkKG5ldyBQQ0RhdGFIb2xkZXIoZGF0YSwgc20pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSBwY2RhdGFzIGZvciB1cGRhdGVzCisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgaWYgKF91cGRhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJpdFNldCBmaWVsZHM7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF91cGRhdGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBzbSA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBmaWVsZHMgPSAoQml0U2V0KSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgY2FjaGUgPSBzbS5nZXRNZXRhRGF0YSgpLmdldERhdGFDYWNoZSgpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgbm90IHRvIGNsb25lIHRoZSBvYmplY3QgdGhhdCB3ZSBnZXQgZnJvbSB0aGUgY2FjaGUsCisgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgaW5zaWRlIHRoZSBjb21taXQoKSBtZXRob2QsIHNvIGFueSBtb2RpZmljYXRpb25zCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHVuZGVybHlpbmcgY2FjaGUgYXJlIHZhbGlkLiBJZiB0aGUgY29tbWl0IGhhZCBub3QKKyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCwgdGhlbiB3ZSdkIHdhbnQgdG8gY2xvbmUgdGhlIHJldHJpZXZlZAorICAgICAgICAgICAgICAgIC8vIG9iamVjdC4KKyAgICAgICAgICAgICAgICBpZiAobW9kTWFwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG1vZE1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGNhY2hlLmdldChzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgICAgICAgICBtb2RzID0gZ2V0TW9kaWZpY2F0aW9ucyhtb2RNYXAsIGNhY2hlKTsKKworICAgICAgICAgICAgICAgIC8vIGRhdGEgc2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbCwgc2luY2UgdGhlIG9iamVjdCBpcworICAgICAgICAgICAgICAgIC8vIGRpcnR5LCBidXQgbWF5YmUgaXQgZ290IGRyb3BwZWQgZnJvbSB0aGUgY2FjaGUgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gaW50ZXJpbQorICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ld1BDRGF0YShzbSk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RvcmUoc20pOworICAgICAgICAgICAgICAgICAgICBtb2RzLm5ld1VwZGF0ZXMuYWRkKG5ldyBQQ0RhdGFIb2xkZXIoZGF0YSwgc20pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkYXRhLnN0b3JlKHNtLCBmaWVsZHMpOworICAgICAgICAgICAgICAgICAgICBtb2RzLmV4aXN0aW5nVXBkYXRlcy5hZGQobmV3IFBDRGF0YUhvbGRlcihkYXRhLCBzbSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSBwY2RhdGFzIGZvciBkZWxldGVzCisgICAgICAgIGlmIChfZGVsZXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9kZWxldGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjYWNoZSA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RGF0YUNhY2hlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKG1vZE1hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBtb2RNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIG1vZHMgPSBnZXRNb2RpZmljYXRpb25zKG1vZE1hcCwgY2FjaGUpOworICAgICAgICAgICAgICAgIG1vZHMuZGVsZXRlcy5hZGQoc20uZ2V0T2JqZWN0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3RpZnkgdGhlIGNhY2hlcyBvZiB0aGUgY2hhbmdlcworICAgICAgICBpZiAobW9kTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbW9kTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgY2FjaGUgPSAoRGF0YUNhY2hlKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBtb2RzID0gKE1vZGlmaWNhdGlvbnMpIGVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgbm90IGNhY2hpbmcgb2xkIHZlcnNpb25zCisgICAgICAgICAgICAgICAgY2FjaGUud3JpdGVMb2NrKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtVG9WZXJzaW9uU2FmZVBDRGF0YXMoY2FjaGUsIG1vZHMuYWRkaXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtVG9WZXJzaW9uU2FmZVBDRGF0YXMoY2FjaGUsIG1vZHMubmV3VXBkYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVRvVmVyc2lvblNhZmVQQ0RhdGFzKGNhY2hlLCBtb2RzLmV4aXN0aW5nVXBkYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlLmNvbW1pdChtb2RzLmFkZGl0aW9ucywgbW9kcy5uZXdVcGRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kcy5leGlzdGluZ1VwZGF0ZXMsIG1vZHMuZGVsZXRlcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUud3JpdGVVbmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSB3ZXJlIGluIGxhcmdlVHJhbnNhY3Rpb24gbW9kZSwgdGhlbiB3ZSBoYXZlIHJlY29yZGVkCisgICAgICAgIC8vIHRoZSBjbGFzc2VzIG9mIHVwZGF0ZWQvZGVsZXRlZCBvYmplY3RzIGFuZCB0aGVzZSBub3cgbmVlZCB0byBiZQorICAgICAgICAvLyBldmljdGVkCisgICAgICAgIGlmIChfY3R4LmlzTGFyZ2VUcmFuc2FjdGlvbigpKSB7CisgICAgICAgICAgICBldmljdFR5cGVzKF9jdHguZ2V0RGVsZXRlZFR5cGVzKCkpOworICAgICAgICAgICAgZXZpY3RUeXBlcyhfY3R4LmdldFVwZGF0ZWRUeXBlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFuZCBub3RpZnkgdGhlIHF1ZXJ5IGNhY2hlLiAgbm90aWZ5IGluIG9uZSBiYXRjaCB0byByZWR1Y2Ugc3luY2gKKyAgICAgICAgUXVlcnlDYWNoZSBxdWVyeUNhY2hlID0gX2N0eC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXREYXRhQ2FjaGVNYW5hZ2VySW5zdGFuY2UoKS5nZXRTeXN0ZW1RdWVyeUNhY2hlKCk7CisgICAgICAgIGlmIChxdWVyeUNhY2hlICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gcGVycyA9IF9jdHguZ2V0UGVyc2lzdGVkVHlwZXMoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gZGVsID0gX2N0eC5nZXREZWxldGVkVHlwZXMoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gdXAgPSBfY3R4LmdldFVwZGF0ZWRUeXBlcygpOworICAgICAgICAgICAgaW50IHNpemUgPSBwZXJzLnNpemUoKSArIGRlbC5zaXplKCkgKyB1cC5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdChzaXplKTsKKyAgICAgICAgICAgICAgICB0eXBlcy5hZGRBbGwocGVycyk7CisgICAgICAgICAgICAgICAgdHlwZXMuYWRkQWxsKGRlbCk7CisgICAgICAgICAgICAgICAgdHlwZXMuYWRkQWxsKHVwKTsKKyAgICAgICAgICAgICAgICBxdWVyeUNhY2hlLm9uVHlwZXNDaGFuZ2VkKG5ldyBUeXBlc0NoYW5nZWRFdmVudCh0aGlzLCB0eXBlcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFBDRGF0YUhvbGRlcn1zIHRoYXQgbWlnaHQgY29udGFpbgorICAgICAqIHN0YWxlIGluc3RhbmNlcyBpbnRvIGEgY29sbGVjdGlvbiBvZiB1cC10by1kYXRlIHtAbGluayBEYXRhQ2FjaGVQQ0RhdGF9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdHJhbnNmb3JtVG9WZXJzaW9uU2FmZVBDRGF0YXMoRGF0YUNhY2hlIGNhY2hlLAorICAgICAgICBMaXN0IGhvbGRlcnMpIHsKKyAgICAgICAgUENEYXRhSG9sZGVyIGhvbGRlcjsKKyAgICAgICAgRGF0YUNhY2hlUENEYXRhIG9sZHBjOworICAgICAgICBmb3IgKExpc3RJdGVyYXRvciBpdGVyID0gaG9sZGVycy5saXN0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBob2xkZXIgPSAoUENEYXRhSG9sZGVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIG9sZHBjID0gY2FjaGUuZ2V0KGhvbGRlci5zbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgICAgIGlmIChvbGRwYyAhPSBudWxsICYmIGNvbXBhcmVWZXJzaW9uKGhvbGRlci5zbSwKKyAgICAgICAgICAgICAgICBob2xkZXIuc20uZ2V0VmVyc2lvbigpLCBvbGRwYy5nZXRWZXJzaW9uKCkpID09IFZFUlNJT05fRUFSTElFUikKKyAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGl0ZXIuc2V0KGhvbGRlci5wY2RhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEge0BsaW5rIE1vZGlmaWNhdGlvbnN9IGluc3RhbmNlIHRvIHRyYWNrIG1vZGlmaWNhdGlvbnMKKyAgICAgKiB0byB0aGUgZ2l2ZW4gY2FjaGUsIGNyZWF0aW5nIGFuZCBjYWNoaW5nIHRoZSBpbnN0YW5jZSBpZiBpdCBkb2VzCisgICAgICogbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGdpdmVuIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNb2RpZmljYXRpb25zIGdldE1vZGlmaWNhdGlvbnMoTWFwIG1vZE1hcCwgRGF0YUNhY2hlIGNhY2hlKSB7CisgICAgICAgIE1vZGlmaWNhdGlvbnMgbW9kcyA9IChNb2RpZmljYXRpb25zKSBtb2RNYXAuZ2V0KGNhY2hlKTsKKyAgICAgICAgaWYgKG1vZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbW9kcyA9IG5ldyBNb2RpZmljYXRpb25zKCk7CisgICAgICAgICAgICBtb2RNYXAucHV0KGNhY2hlLCBtb2RzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW9kczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgT2JqZWN0IGVkYXRhKSB7CisgICAgICAgIERhdGFDYWNoZSBjYWNoZSA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RGF0YUNhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZSAhPSBudWxsICYmICFpc0xvY2tpbmcobnVsbCkKKyAgICAgICAgICAgICYmIGNhY2hlLmNvbnRhaW5zKHNtLmdldE9iamVjdElkKCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBzdXBlci5leGlzdHMoc20sIGVkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBPYmplY3QgZWRhdGEpIHsKKyAgICAgICAgRGF0YUNhY2hlIGNhY2hlID0gc20uZ2V0TWV0YURhdGEoKS5nZXREYXRhQ2FjaGUoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IG51bGwgfHwgc20uaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnN5bmNWZXJzaW9uKHNtLCBlZGF0YSk7CisKKyAgICAgICAgRGF0YUNhY2hlUENEYXRhIGRhdGE7CisgICAgICAgIE9iamVjdCB2ZXJzaW9uID0gbnVsbDsKKyAgICAgICAgZGF0YSA9IGNhY2hlLmdldChzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgaWYgKCFpc0xvY2tpbmcobnVsbCkgJiYgZGF0YSAhPSBudWxsKQorICAgICAgICAgICAgdmVyc2lvbiA9IGRhdGEuZ2V0VmVyc2lvbigpOworCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBjYWNoZWQgdmVyc2lvbiB1cGRhdGUgZnJvbSB0aGVyZQorICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIXZlcnNpb24uZXF1YWxzKHNtLmdldFZlcnNpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBzbS5zZXRWZXJzaW9uKHZlcnNpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIGRhdGEgc3RvcmUgdmVyc2lvbgorICAgICAgICByZXR1cm4gc3VwZXIuc3luY1ZlcnNpb24oc20sIGVkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFBDU3RhdGUgc3RhdGUsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGVkYXRhKSB7CisgICAgICAgIERhdGFDYWNoZSBjYWNoZSA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RGF0YUNhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsIHx8IHNtLmlzRW1iZWRkZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5pbml0aWFsaXplKHNtLCBzdGF0ZSwgZmV0Y2gsIGVkYXRhKTsKKworICAgICAgICBEYXRhQ2FjaGVQQ0RhdGEgZGF0YSA9IGNhY2hlLmdldChzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiAhaXNMb2NraW5nKGZldGNoKSkgeworICAgICAgICAgICAgLy8jIyMgdGhlICdkYXRhLnR5cGUnIGFjY2VzcyBoZXJlIHByb2JhYmx5IG5lZWRzIHRvIGJlCisgICAgICAgICAgICAvLyMjIyBhZGRyZXNzZWQgZm9yIGJ1ZyA1MTEKKyAgICAgICAgICAgIHNtLmluaXRpYWxpemUoZGF0YS5nZXRUeXBlKCksIHN0YXRlKTsKKyAgICAgICAgICAgIGRhdGEubG9hZChzbSwgZmV0Y2gsIGVkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBmcm9tIHN0b3JlIG1hbmFnZXIKKyAgICAgICAgaWYgKCFzdXBlci5pbml0aWFsaXplKHNtLCBzdGF0ZSwgZmV0Y2gsIGVkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFfY3R4LmdldFBvcHVsYXRlRGF0YUNhY2hlKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSdyZSBub3QgdHJ5aW5nIHRvIGNhY2hlIGFuIG9sZCB2ZXJzaW9uCisgICAgICAgIGNhY2hlLndyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGF0YSA9IGNhY2hlLmdldChzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgY29tcGFyZVZlcnNpb24oc20sIHNtLmdldFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICBkYXRhLmdldFZlcnNpb24oKSkgPT0gVkVSU0lPTl9FQVJMSUVSKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBjYWNoZSBuZXdseSBsb2FkZWQgaW5mby4gSXQgaXMgc2FmZSB0byBjYWNoZSBkYXRhIGZyb3JtCisgICAgICAgICAgICAvLyBpbml0aWFsaXplKCkgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB1cG9uCisgICAgICAgICAgICAvLyBpbml0aWFsIGxvYWQgb2YgdGhlIGRhdGEuCisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXdQQ0RhdGEoc20pOworICAgICAgICAgICAgZGF0YS5zdG9yZShzbSk7CisgICAgICAgICAgICBjYWNoZS5wdXQoZGF0YSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjYWNoZS53cml0ZVVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLCBPYmplY3QgZWRhdGEpIHsKKyAgICAgICAgRGF0YUNhY2hlIGNhY2hlID0gc20uZ2V0TWV0YURhdGEoKS5nZXREYXRhQ2FjaGUoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IG51bGwgfHwgc20uaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWQoc20sIGZpZWxkcywgZmV0Y2gsIGxvY2tMZXZlbCwgZWRhdGEpOworCisgICAgICAgIERhdGFDYWNoZVBDRGF0YSBkYXRhID0gY2FjaGUuZ2V0KHNtLmdldE9iamVjdElkKCkpOworICAgICAgICBpZiAobG9ja0xldmVsID09IExvY2tMZXZlbHMuTE9DS19OT05FICYmICFpc0xvY2tpbmcoZmV0Y2gpCisgICAgICAgICAgICAmJiBkYXRhICE9IG51bGwpCisgICAgICAgICAgICBkYXRhLmxvYWQoc20sIGZpZWxkcywgZmV0Y2gsIGVkYXRhKTsKKyAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gbG9hZCBmcm9tIHN0b3JlIG1hbmFnZXI7IGNsb25lIHRoZSBzZXQgb2Ygc3RpbGwtdW5sb2FkZWQgZmllbGRzCisgICAgICAgIC8vIHNvIHRoYXQgaWYgdGhlIHN0b3JlIG1hbmFnZXIgZGVjaWRlcyB0byBtb2RpZnkgaXQgaXQgd29uJ3QgYWZmZWN0IHVzCisgICAgICAgIGlmICghc3VwZXIubG9hZChzbSwgKEJpdFNldCkgZmllbGRzLmNsb25lKCksIGZldGNoLCBsb2NrTGV2ZWwsIGVkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFfY3R4LmdldFBvcHVsYXRlRGF0YUNhY2hlKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSdyZSBub3QgdHJ5aW5nIHRvIGNhY2hlIGFuIG9sZCB2ZXJzaW9uCisgICAgICAgIGNhY2hlLndyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGF0YSA9IGNhY2hlLmdldChzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgY29tcGFyZVZlcnNpb24oc20sIHNtLmdldFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICBkYXRhLmdldFZlcnNpb24oKSkgPT0gVkVSU0lPTl9FQVJMSUVSKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBjYWNoZSBuZXdseSBsb2FkZWQgaW5mbworICAgICAgICAgICAgYm9vbGVhbiBpc05ldyA9IGRhdGEgPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpc05ldykKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3UENEYXRhKHNtKTsKKyAgICAgICAgICAgIGRhdGEuc3RvcmUoc20sIGZpZWxkcyk7CisgICAgICAgICAgICBpZiAoaXNOZXcpCisgICAgICAgICAgICAgICAgY2FjaGUucHV0KGRhdGEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNhY2hlLnVwZGF0ZShkYXRhKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNhY2hlLndyaXRlVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gbG9hZEFsbChDb2xsZWN0aW9uIHNtcywgUENTdGF0ZSBzdGF0ZSwgaW50IGxvYWQsCisgICAgCQlGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBlZGF0YSkgeworICAgICAgICBpZiAoaXNMb2NraW5nKGZldGNoKSkKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5sb2FkQWxsKHNtcywgc3RhdGUsIGxvYWQsIGZldGNoLCBlZGF0YSk7CisKKyAgICAgICAgTWFwIHVubG9hZGVkID0gbnVsbDsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTsKKyAgICAgICAgRGF0YUNhY2hlIGNhY2hlOworICAgICAgICBEYXRhQ2FjaGVQQ0RhdGEgZGF0YTsKKyAgICAgICAgQml0U2V0IGZpZWxkczsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHNtcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGNhY2hlID0gc20uZ2V0TWV0YURhdGEoKS5nZXREYXRhQ2FjaGUoKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSA9PSBudWxsIHx8IHNtLmlzRW1iZWRkZWQoKSkgeworICAgICAgICAgICAgICAgIHVubG9hZGVkID0gYWRkVW5sb2FkZWQoc20sIG51bGwsIHVubG9hZGVkKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gY2FjaGUuZ2V0KHNtLmdldE9iamVjdElkKCkpOworICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8jIyMgdGhlICdkYXRhLnR5cGUnIGFjY2VzcyBoZXJlIHByb2JhYmx5IG5lZWRzCisgICAgICAgICAgICAgICAgICAgIC8vIyMjIHRvIGJlIGFkZHJlc3NlZCBmb3IgYnVnIDUxMQorICAgICAgICAgICAgICAgICAgICBzbS5pbml0aWFsaXplKGRhdGEuZ2V0VHlwZSgpLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEubG9hZChzbSwgZmV0Y2gsIGVkYXRhKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdW5sb2FkZWQgPSBhZGRVbmxvYWRlZChzbSwgbnVsbCwgdW5sb2FkZWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2FkICE9IEZPUkNFX0xPQURfTk9ORQorICAgICAgICAgICAgICAgIHx8IHNtLmdldFBDU3RhdGUoKSA9PSBQQ1N0YXRlLkhPTExPVykgeworICAgICAgICAgICAgICAgIGRhdGEgPSBjYWNoZS5nZXQoc20uZ2V0T2JqZWN0SWQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHVubG9hZGVkIGZpZWxkcworICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSBzbS5nZXRVbmxvYWRlZChmZXRjaCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEubG9hZChzbSwgZmllbGRzLCBmZXRjaCwgZWRhdGEpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubG9hZGVkID0gYWRkVW5sb2FkZWQoc20sIGZpZWxkcywgdW5sb2FkZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB1bmxvYWRlZCA9IGFkZFVubG9hZGVkKHNtLCBudWxsLCB1bmxvYWRlZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjYWNoZS5jb250YWlucyhzbS5nZXRPYmplY3RJZCgpKSkKKyAgICAgICAgICAgICAgICB1bmxvYWRlZCA9IGFkZFVubG9hZGVkKHNtLCBudWxsLCB1bmxvYWRlZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodW5sb2FkZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCisgICAgICAgIC8vIGxvYWQgd2l0aCBkZWxlZ2F0ZQorICAgICAgICBDb2xsZWN0aW9uIGZhaWxlZCA9IHN1cGVyLmxvYWRBbGwodW5sb2FkZWQua2V5U2V0KCksIHN0YXRlLCBsb2FkLAorICAgICAgICAgICAgZmV0Y2gsIGVkYXRhKTsKKyAgICAgICAgaWYgKCFfY3R4LmdldFBvcHVsYXRlRGF0YUNhY2hlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFpbGVkOworCisgICAgICAgIC8vIGZvciBlYWNoIGxvYWRlZCBpbnN0YW5jZSwgbWVyZ2UgbG9hZGVkIHN0YXRlIGludG8gY2FjaGVkIGRhdGEKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBib29sZWFuIGlzTmV3OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHVubG9hZGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIHNtID0gKE9wZW5KUEFTdGF0ZU1hbmFnZXIpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgZmllbGRzID0gKEJpdFNldCkgZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgY2FjaGUgPSBzbS5nZXRNZXRhRGF0YSgpLmdldERhdGFDYWNoZSgpOworICAgICAgICAgICAgaWYgKGNhY2hlID09IG51bGwgfHwgc20uaXNFbWJlZGRlZCgpIHx8IChmYWlsZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGZhaWxlZC5jb250YWlucyhzbS5nZXRJZCgpKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCB0cnlpbmcgdG8gY2FjaGUgYW4gb2xkIHZlcnNpb24KKyAgICAgICAgICAgIGNhY2hlLndyaXRlTG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhID0gY2FjaGUuZ2V0KHNtLmdldE9iamVjdElkKCkpOworICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgY29tcGFyZVZlcnNpb24oc20sIHNtLmdldFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRWZXJzaW9uKCkpID09IFZFUlNJT05fRUFSTElFUikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpc05ldyA9IGRhdGEgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoaXNOZXcpCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZXdQQ0RhdGEoc20pOworICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5zdG9yZShzbSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkYXRhLnN0b3JlKHNtLCBmaWVsZHMpOworICAgICAgICAgICAgICAgIGlmIChpc05ldykKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUucHV0KGRhdGEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUudXBkYXRlKGRhdGEpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjYWNoZS53cml0ZVVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWlsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgYW4gdW5sb2FkZWQgaW5zdGFuY2UgdG8gdGhlIGdpdmVuIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgYWRkVW5sb2FkZWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgTWFwIHVubG9hZGVkKSB7CisgICAgICAgIGlmICh1bmxvYWRlZCA9PSBudWxsKQorICAgICAgICAgICAgdW5sb2FkZWQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB1bmxvYWRlZC5wdXQoc20sIGZpZWxkcyk7CisgICAgICAgIHJldHVybiB1bmxvYWRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBmbHVzaChDb2xsZWN0aW9uIHN0YXRlcykgeworICAgICAgICBDb2xsZWN0aW9uIGV4Y2VwcyA9IHN1cGVyLmZsdXNoKHN0YXRlcyk7CisKKyAgICAgICAgLy8gaWYgdGhlcmUgd2VyZSBlcnJvcnMgZXZpY3QgYmFkIGluc3RhbmNlcyBhbmQgZG9uJ3QgcmVjb3JkIGNoYW5nZXMKKyAgICAgICAgaWYgKCFleGNlcHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPcHRpbWlzdGljRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICBldmljdE9wdGltaXN0aWNMb2NrRmFpbHVyZSgoT3B0aW1pc3RpY0V4Y2VwdGlvbikgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXhjZXBzOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbGFyZ2UgdHJhbnNhY3Rpb24gbW9kZSBkb24ndCByZWNvcmQgaW5kaXZpZHVhbCBjaGFuZ2VzCisgICAgICAgIGlmIChfY3R4LmlzTGFyZ2VUcmFuc2FjdGlvbigpKQorICAgICAgICAgICAgcmV0dXJuIGV4Y2VwczsKKworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHN0YXRlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgaXRyLm5leHQoKTsKKworICAgICAgICAgICAgaWYgKHNtLmdldFBDU3RhdGUoKSA9PSBQQ1N0YXRlLlBORVcgJiYgIXNtLmlzRmx1c2hlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKF9pbnNlcnRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9pbnNlcnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIF9pbnNlcnRzLmFkZChzbSk7CisKKyAgICAgICAgICAgICAgICAvLyBtYXkgaGF2ZSBiZWVuIHJlLXBlcnNpc3RlZAorICAgICAgICAgICAgICAgIGlmIChfZGVsZXRlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfZGVsZXRlcy5yZW1vdmUoc20pOworICAgICAgICAgICAgfSBlbHNlIGlmIChfaW5zZXJ0cyAhPSBudWxsIAorICAgICAgICAgICAgICAgICYmIChzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5QTkVXREVMRVRFRCAKKyAgICAgICAgICAgICAgICB8fCBzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5QTkVXRkxVU0hFRERFTEVURUQpKQorICAgICAgICAgICAgICAgIF9pbnNlcnRzLnJlbW92ZShzbSk7CisgICAgICAgICAgICBlbHNlIGlmIChzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5QRElSVFkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX3VwZGF0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIF91cGRhdGVzLnB1dChzbSwgc20uZ2V0RGlydHkoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmdldFBDU3RhdGUoKSA9PSBQQ1N0YXRlLlBERUxFVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKF9kZWxldGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9kZWxldGVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBfZGVsZXRlcy5hZGQoc20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2aWN0IGZyb20gdGhlIGNhY2hlIHRoZSBPSUQgKGlmIGF2YWlsYWJsZSkgdGhhdCByZXN1bHRlZCBpbiBhbgorICAgICAqIG9wdGltaXN0aWMgbG9jayBleGNlcHRpb24gaWZmIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBjYWNoZSAKKyAgICAgKiBtYXRjaGVzIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBzdGF0ZSBtYW5hZ2VyIGZvciB0aGUgZmFpbGVkCisgICAgICogaW5zdGFuY2UuIFRoaXMgbWVhbnMgdGhhdCB3ZSB3aWxsIGV2aWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgZm9yIHJlY29yZHMgCisgICAgICogdGhhdCBzaG91bGQgaGF2ZSBzdWNjZXNzZnVsbHkgY29tbWl0dGVkIGFjY29yZGluZyB0byB0aGUgZGF0YSBjYWNoZSBidXQgCisgICAgICogZGlkIG5vdC4gVGhlIG9ubHkgcHJlZGljdGFibGUgcmVhc29uIHRoYXQgY291bGQgY2F1c2UgdGhpcyBiZWhhdmlvcgorICAgICAqIGlzIGEgY29uY3VycmVudCBvdXQtb2YtYmFuZCBtb2RpZmljYXRpb24gdG8gdGhlIGRhdGFiYXNlIHRoYXQgd2FzIG5vdCAKKyAgICAgKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNhY2hlLiBUaGlzIGxvZ2ljIG1ha2VzIE9wZW5KUEEncyBkYXRhIGNhY2hlIAorICAgICAqIHNvbWV3aGF0IHRvbGVyYW50IG9mIHN1Y2ggYmVoYXZpb3IsIGluIHRoYXQgdGhlIGNhY2hlIHdpbGwgYmUgY2xlYW5lZCAKKyAgICAgKiB1cCBhcyBmYWlsdXJlcyBvY2N1ci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXZpY3RPcHRpbWlzdGljTG9ja0ZhaWx1cmUoT3B0aW1pc3RpY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIE9iamVjdCBvID0gKChPcHRpbWlzdGljRXhjZXB0aW9uKSBlKS5nZXRGYWlsZWRPYmplY3QoKTsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IF9jdHguZ2V0U3RhdGVNYW5hZ2VyKG8pOworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyB0aGlzIGxvZ2ljIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IC0tIHdlIGNvdWxkIGFnZ3JlZ2F0ZQorICAgICAgICAvLyBhbGwgdGhlIGNhY2hlLT5vaWQgY2hhbmdlcywgYW5kIHRoZW4gdXNlIERhdGFDYWNoZS5yZW1vdmVBbGwoKSAKKyAgICAgICAgLy8gYW5kIGxlc3Mgd3JpdGUgbG9ja3MgdG8gZG8gdGhlIG11dGF0aW9uLgorICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBzbS5nZXRNZXRhRGF0YSgpOworICAgICAgICBEYXRhQ2FjaGUgY2FjaGUgPSBtZXRhLmdldERhdGFDYWNoZSgpOworICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjYWNoZS53cml0ZUxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERhdGFDYWNoZVBDRGF0YSBkYXRhID0gY2FjaGUuZ2V0KHNtLmdldElkKCkpOworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlOworICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlVmVyc2lvbihzbSwgc20uZ2V0VmVyc2lvbigpLCBkYXRhLmdldFZlcnNpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFN0b3JlTWFuYWdlci5WRVJTSU9OX0xBVEVSOgorICAgICAgICAgICAgICAgIGNhc2UgU3RvcmVNYW5hZ2VyLlZFUlNJT05fU0FNRToKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0eCdzIGN1cnJlbnQgdmVyc2lvbiBpcyBsYXRlciB0aGFuIG9yIHRoZSBzYW1lIGFzIAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGF0YSBjYWNoZSB2ZXJzaW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21taXQgc2hvdWxkIAorICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHN1Y2NlZWRlZCBmcm9tIHRoZSBzdGFuZHBvaW50IG9mIHRoZSBjYWNoZS4gUmVtb3ZlIAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zdGFuY2UgZnJvbSBjYWNoZSBpbiB0aGUgaG9wZXMgdGhhdCB0aGUgY2FjaGUgaXMgCisgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBzeW5jLgorICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFN0b3JlTWFuYWdlci5WRVJTSU9OX0VBUkxJRVI6CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdHgncyBjdXJyZW50IHZlcnNpb24gaXMgZWFybGllciB0aGFuIHRoZSBkYXRhIAorICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSB2ZXJzaW9uLiBUaGlzIGlzIGEgbm9ybWFsIG9wdGltaXN0aWMgbG9jayBmYWlsdXJlLiAKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNsZWFuIHVwIHRoZSBjYWNoZTsgaXQgcHJvYmFibHkgYWxyZWFkeSBoYXMgdGhlIAorICAgICAgICAgICAgICAgICAgICAvLyByaWdodCB2YWx1ZXMsIGFuZCBpZiBub3QsIGl0J2xsIGdldCBjbGVhbmVkIHVwIGJ5IGEgdHgKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBmYWlscyBpbiBvbmUgb2YgdGhlIG90aGVyIGNhc2Ugc3RhdGVtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU3RvcmVNYW5hZ2VyLlZFUlNJT05fRElGRkVSRU5UOgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmVyc2lvbiBzdHJhdGVneSBmb3IgdGhlIGZhaWxlZCBvYmplY3QgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIG9wdGltaXplIGZvciBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcy4gQ2xlYW4gdXAgdGhlIGNhY2hlLgorICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIHJldHVybiB2YWx1ZS4gUmVtb3ZlIHRvIGJlIGZ1dHVyZS1wcm9vZi4KKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVtb3ZlKQorICAgICAgICAgICAgICAgIGNhY2hlLnJlbW92ZShzbS5nZXRJZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNhY2hlLndyaXRlVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgU3RvcmVRdWVyeSBxID0gc3VwZXIubmV3UXVlcnkobGFuZ3VhZ2UpOworCisgICAgICAgIC8vIGlmIHRoZSBxdWVyeSBjYW4ndCBiZSBwYXJzZWQgb3IgaXQncyB1c2luZyBhIG5vbi1wYXJzZWQgbGFuZ3VhZ2UKKyAgICAgICAgLy8gKG9uZSBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gRXhwcmVzc2lvblBhcnNlciksIHdlIGNhbid0IGNhY2hlIGl0LgorICAgICAgICBpZiAocSA9PSBudWxsIHx8IFF1ZXJ5TGFuZ3VhZ2VzLnBhcnNlckZvckxhbmd1YWdlKGxhbmd1YWdlKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHE7CisKKyAgICAgICAgUXVlcnlDYWNoZSBxdWVyeUNhY2hlID0gX2N0eC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXREYXRhQ2FjaGVNYW5hZ2VySW5zdGFuY2UoKS5nZXRTeXN0ZW1RdWVyeUNhY2hlKCk7CisgICAgICAgIGlmIChxdWVyeUNhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcTsKKworICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q2FjaGVTdG9yZVF1ZXJ5KHEsIHF1ZXJ5Q2FjaGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjYWNoZWFibGUgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgRGF0YUNhY2hlUENEYXRhIG5ld1BDRGF0YShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IHNtLmdldE1ldGFEYXRhKCk7CisgICAgICAgIGlmIChfZ2VuICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKERhdGFDYWNoZVBDRGF0YSkgX2dlbi5nZW5lcmF0ZVBDRGF0YQorICAgICAgICAgICAgICAgIChzbS5nZXRPYmplY3RJZCgpLCBtZXRhKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ2FjaGVQQ0RhdGFJbXBsKHNtLmZldGNoT2JqZWN0SWQoKSwgbWV0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgbG9ja2luZyBsb2FkZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NraW5nKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAoZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIGZldGNoID0gX2N0eC5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIGZldGNoLmdldFJlYWRMb2NrTGV2ZWwoKSA+IExvY2tMZXZlbHMuTE9DS19OT05FOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cnVjdHVyZSB1c2VkIGR1cmluZyB0aGUgY29tbWl0IHByb2Nlc3MgdG8gdHJhY2sgY2FjaGUgbW9kaWZpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2RpZmljYXRpb25zIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgTGlzdCBhZGRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0IG5ld1VwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0IGV4aXN0aW5nVXBkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcHVibGljIGZpbmFsIExpc3QgZGVsZXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQQ0RhdGFIb2xkZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBEYXRhQ2FjaGVQQ0RhdGEgcGNkYXRhOworICAgICAgICBwdWJsaWMgZmluYWwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTsKKworICAgICAgICBwdWJsaWMgUENEYXRhSG9sZGVyKERhdGFDYWNoZVBDRGF0YSBwY2RhdGEsCisgICAgICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgICAgICB0aGlzLnBjZGF0YSA9IHBjZGF0YTsKKyAgICAgICAgICAgIHRoaXMuc20gPSBzbTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGVsZWdhdGluZ0RhdGFDYWNoZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRGVsZWdhdGluZ0RhdGFDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTI3NTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EZWxlZ2F0aW5nRGF0YUNhY2hlLmphdmEKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5SdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvcjsKKworLyoqCisgKiBEZWxlZ2F0aW5nIGRhdGEgY2FjaGUgdGhhdCBjYW4gYWxzbyBwZXJmb3JtIGV4Y2VwdGlvbiB0cmFuc2xhdGlvbiBmb3IKKyAqIHVzZSBpbiBmYWNhZGVzLiBUaGlzIGNhY2hlIGFsbG93cyBpdHMgZGVsZWdhdGUgdG8gYmUgbnVsbCwgaW4gd2hpY2gKKyAqIGNhc2UgaXQgcmV0dXJucyBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wZXJhdGlvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdEYXRhQ2FjaGUKKyAgICBpbXBsZW1lbnRzIERhdGFDYWNoZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaXRTZXQgRU1QVFlfQklUU0VUID0gbmV3IEJpdFNldCgwKTsKKworICAgIHByaXZhdGUgZmluYWwgRGF0YUNhY2hlIF9jYWNoZTsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdEYXRhQ2FjaGUgX2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIF90cmFuczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdEYXRhQ2FjaGUoRGF0YUNhY2hlIGNhY2hlKSB7CisgICAgICAgIHRoaXMoY2FjaGUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBEZWxlZ2F0aW5nRGF0YUNhY2hlKERhdGFDYWNoZSBjYWNoZSwKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgdHJhbnMpIHsKKyAgICAgICAgX2NhY2hlID0gY2FjaGU7CisgICAgICAgIF90cmFucyA9IHRyYW5zOworICAgICAgICBpZiAoY2FjaGUgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nRGF0YUNhY2hlKQorICAgICAgICAgICAgX2RlbCA9IChEZWxlZ2F0aW5nRGF0YUNhY2hlKSBfY2FjaGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kZWwgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhQ2FjaGUgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfY2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYXRpdmUgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERhdGFDYWNoZSBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX2NhY2hlIDogX2RlbC5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ0RhdGFDYWNoZSkKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nRGF0YUNhY2hlKSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmVxdWFscyhnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLCBvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBPcGVuSlBBIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiB0cmFuc2xhdGUoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICByZXR1cm4gKF90cmFucyA9PSBudWxsKSA/IHJlIDogX3RyYW5zLnRyYW5zbGF0ZShyZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUuZ2V0TmFtZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfY2FjaGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGF0YUNhY2hlTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS5pbml0aWFsaXplKG1hbmFnZXIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tbWl0KENvbGxlY3Rpb24gYWRkaXRpb25zLCBDb2xsZWN0aW9uIG5ld1VwZGF0ZXMsCisgICAgICAgIENvbGxlY3Rpb24gZXhpc3RpbmdVcGRhdGVzLCBDb2xsZWN0aW9uIGRlbGV0ZXMpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLmNvbW1pdChhZGRpdGlvbnMsIG5ld1VwZGF0ZXMsIGV4aXN0aW5nVXBkYXRlcywgZGVsZXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2lkKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUuY29udGFpbnMob2lkKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgY29udGFpbnNBbGwoQ29sbGVjdGlvbiBvaWRzKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9CSVRTRVQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2NhY2hlLmNvbnRhaW5zQWxsKG9pZHMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERhdGFDYWNoZVBDRGF0YSBnZXQoT2JqZWN0IG9pZCkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUuZ2V0KG9pZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNhY2hlUENEYXRhIHB1dChEYXRhQ2FjaGVQQ0RhdGEgdmFsdWUpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2NhY2hlLnB1dCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoRGF0YUNhY2hlUENEYXRhIHZhbHVlKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS51cGRhdGUodmFsdWUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERhdGFDYWNoZVBDRGF0YSByZW1vdmUoT2JqZWN0IG9pZCkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUucmVtb3ZlKG9pZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IHJlbW92ZUFsbChDb2xsZWN0aW9uIG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JJVFNFVDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUucmVtb3ZlQWxsKG9pZHMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKENsYXNzIGNscywgYm9vbGVhbiBzdWJjbGFzc2VzKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS5yZW1vdmVBbGwoY2xzLCBzdWJjbGFzc2VzKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfY2FjaGUuY2xlYXIoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBpbihPYmplY3Qgb2lkKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUucGluKG9pZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IHBpbkFsbChDb2xsZWN0aW9uIG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JJVFNFVDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUucGluQWxsKG9pZHMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGluQWxsKENsYXNzIGNscywgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS5waW5BbGwoY2xzLCBzdWJzKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHVucGluKE9iamVjdCBvaWQpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9jYWNoZS51bnBpbihvaWQpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCB1bnBpbkFsbChDb2xsZWN0aW9uIG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JJVFNFVDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUudW5waW5BbGwob2lkcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnBpbkFsbChDbGFzcyBjbHMsIGJvb2xlYW4gc3VicykgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfY2FjaGUudW5waW5BbGwoY2xzLCBzdWJzKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG9jaygpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLndyaXRlTG9jaygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVVbmxvY2soKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS53cml0ZVVubG9jaygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRXhwaXJhdGlvbkxpc3RlbmVyKEV4cGlyYXRpb25MaXN0ZW5lciBsaXN0ZW4pIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLmFkZEV4cGlyYXRpb25MaXN0ZW5lcihsaXN0ZW4pOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRXhwaXJhdGlvbkxpc3RlbmVyKEV4cGlyYXRpb25MaXN0ZW5lciBsaXN0ZW4pIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9jYWNoZS5yZW1vdmVFeHBpcmF0aW9uTGlzdGVuZXIobGlzdGVuKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfY2FjaGUuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RlbGVnYXRpbmdRdWVyeUNhY2hlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EZWxlZ2F0aW5nUXVlcnlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YmY4OTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EZWxlZ2F0aW5nUXVlcnlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5SdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvcjsKKworLyoqCisgKiBEZWxlZ2F0aW5nIHF1ZXJ5IGNhY2hlIHRoYXQgY2FuIGFsc28gcGVyZm9ybSBleGNlcHRpb24gdHJhbnNsYXRpb24gZm9yCisgKiB1c2UgaW4gZmFjYWRlcy4gVGhpcyBjYWNoZSBhbGxvd3MgaXRzIGRlbGVnYXRlIHRvIGJlIG51bGwsIGluIHdoaWNoIGNhc2UKKyAqIGl0IHJldHVybnMgZGVmYXVsdCB2YWx1ZXMgb3IgYWxsIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1F1ZXJ5Q2FjaGUKKyAgICBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBRdWVyeUNhY2hlIF9jYWNoZTsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdRdWVyeUNhY2hlIF9kZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciBfdHJhbnM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nUXVlcnlDYWNoZShRdWVyeUNhY2hlIGNhY2hlKSB7CisgICAgICAgIHRoaXMoY2FjaGUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBEZWxlZ2F0aW5nUXVlcnlDYWNoZShRdWVyeUNhY2hlIGNhY2hlLAorICAgICAgICBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciB0cmFucykgeworICAgICAgICBfY2FjaGUgPSBjYWNoZTsKKyAgICAgICAgX3RyYW5zID0gdHJhbnM7CisgICAgICAgIGlmIChjYWNoZSBpbnN0YW5jZW9mIERlbGVnYXRpbmdRdWVyeUNhY2hlKQorICAgICAgICAgICAgX2RlbCA9IChEZWxlZ2F0aW5nUXVlcnlDYWNoZSkgX2NhY2hlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGVsID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpcmVjdCBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlDYWNoZSBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlDYWNoZSBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX2NhY2hlIDogX2RlbC5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nUXVlcnlDYWNoZSkKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nUXVlcnlDYWNoZSkgb3RoZXIpLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBPYmplY3RVdGlscy5lcXVhbHMoZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSwgb3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgT3BlbkpQQSBleGNlcHRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFJ1bnRpbWVFeGNlcHRpb24gdHJhbnNsYXRlKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgcmV0dXJuIChfdHJhbnMgPT0gbnVsbCkgPyByZSA6IF90cmFucy50cmFuc2xhdGUocmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGF0YUNhY2hlTWFuYWdlciBtZ3IpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLmluaXRpYWxpemUobWdyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVHlwZXNDaGFuZ2VkKFR5cGVzQ2hhbmdlZEV2ZW50IGUpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLm9uVHlwZXNDaGFuZ2VkKGUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFF1ZXJ5UmVzdWx0IGdldChRdWVyeUtleSBxaykgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUuZ2V0KHFrKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBRdWVyeVJlc3VsdCBwdXQoUXVlcnlLZXkgcWssIFF1ZXJ5UmVzdWx0IG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2NhY2hlLnB1dChxaywgb2lkcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUXVlcnlSZXN1bHQgcmVtb3ZlKFF1ZXJ5S2V5IHFrKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9jYWNoZS5yZW1vdmUocWspOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGluKFF1ZXJ5S2V5IHFrKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUucGluKHFrKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHVucGluKFF1ZXJ5S2V5IHFrKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGUudW5waW4ocWspOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVMb2NrKCkgeworICAgICAgICBpZiAoX2NhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfY2FjaGUud3JpdGVMb2NrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVVubG9jaygpIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLndyaXRlVW5sb2NrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUeXBlc0NoYW5nZWRMaXN0ZW5lcihUeXBlc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW4pIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2NhY2hlLmFkZFR5cGVzQ2hhbmdlZExpc3RlbmVyKGxpc3Rlbik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVUeXBlc0NoYW5nZWRMaXN0ZW5lcihUeXBlc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW4pIHsKKyAgICAgICAgaWYgKF9jYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9jYWNoZS5yZW1vdmVUeXBlc0NoYW5nZWRMaXN0ZW5lcihsaXN0ZW4pOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jYWNoZS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRXhwaXJhdGlvbkV2ZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9FeHBpcmF0aW9uRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y0MGZiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRXhwaXJhdGlvbkV2ZW50LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisvKioKKyAqIEFuIGV2ZW50IGluZGljYXRpbmcgdGhlIGV4cGlyYXRpb24gb2YgYW4gb2JqZWN0IGZyb20gdGhlIGRhdGEgY2FjaGUsCisgKiBvciBhbiBleHBpcmF0aW9uIG9mIGEgcmVzdWx0IGxpc3QgZnJvbSB0aGUgcXVlcnkgY2FjaGUuCisgKiBUaGUgc291cmNlIG9mIHRoZSBldmVudCB3aWxsIGJlIHRoZSBjYWNoZS4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBpcmF0aW9uRXZlbnQKKyAgICBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IF9rZXk7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9leHBpcmVkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBkYXRhIG9yIHF1ZXJ5IGNhY2hlCisgICAgICogQHBhcmFtIGtleSB0aGUgZXhwaXJlZCBvYmplY3Qgb2lkIG9yIHF1ZXJ5IGtleQorICAgICAqIEBwYXJhbSBleHBpcmVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3Qgd2FzIGV4cGlyZWQKKyAgICAgKiBuYXR1cmFsbHk7IGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBFeHBpcmF0aW9uRXZlbnQoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IGtleSwgYm9vbGVhbiBleHBpcmVkKSB7CisgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgIF9rZXkgPSBrZXk7CisgICAgICAgIF9leHBpcmVkID0gZXhwaXJlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4cGlyZWQgb2JqZWN0IGlkIG9yIHF1ZXJ5IGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKKyAgICAgICAgcmV0dXJuIF9rZXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGV4cGlyZWQgb2JqZWN0IHdhcyBleHBpcmVkIG5hdHVyYWxseSwgb3IgaWYKKyAgICAgKiB0aGUgb2JqZWN0IHdhcyBleHBsaWNpdGx5IHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RXhwaXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9leHBpcmVkOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0V4cGlyYXRpb25MaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvRXhwaXJhdGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1ZjRmYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0V4cGlyYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworLyoqCisgKiBBbiBlbnRpdHkgdGhhdCB3aXNoZXMgdG8gYmUgbm90aWZpZWQgd2hlbiBjYWNoZSBrZXlzIGV4cGlyZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwaXJhdGlvbkxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIG9iamVjdCBoYXMgZXhwaXJlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkV4cGlyZShFeHBpcmF0aW9uRXZlbnQgZXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlDYWNoZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTg5MzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9RdWVyeUNhY2hlLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEludGVyZmFjZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYW55IGxldmVsIDIgcXVlcnkgY2FjaGUKKyAqIHVzZWQgYnkgT3BlbkpQQS4gVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgdGhyZWFkc2FmZS4KKyAqIE1vc3QgcXVlcnkgY2FjaGUgaW1wbGVtZW50YXRpb25zIHdpbGwgcHJvYmFibHkgaW1wbGVtZW50CisgKiB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYWJsZX0gdG8gcmVjZWl2ZSBhIGhhbmRsZSB0byB0aGUKKyAqIHN5c3RlbSBjb25maWd1cmF0aW9uIG9uIGNvbnN0cnVjdGlvbi4KKyAqCisgKiBAc2luY2UgMC4yLjUKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlDYWNoZQorICAgIGV4dGVuZHMgVHlwZXNDaGFuZ2VkTGlzdGVuZXIsIENsb3NlYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBEYXRhQ2FjaGVNYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjQuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGF0YUNhY2hlTWFuYWdlciBtYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2Ygb2lkcyBmb3IgdGhlIGdpdmVuIHF1ZXJ5IGtleS4gVGhpcyBpcyBhbgorICAgICAqIHVubW9kaWZpYWJsZSBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcXVlcnkgcmVzdWx0cyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBudWxsIGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlSZXN1bHQgZ2V0KFF1ZXJ5S2V5IHFrKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGlzdCBvZiBPSURzIGZvciB0aGUgZ2l2ZW4gcXVlcnkga2V5LiBBIHJlZmVyZW5jZQorICAgICAqIHRvIHRoZSBnaXZlbiBsaXN0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBxdWVyeSBjYWNoZSwgc28gdGhlCisgICAgICogbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBjYWNoZWQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogdGhlIGtleSB3YXMgbm90IHByZXZpb3VzbHkgY2FjaGVkLiBTZWUge0BsaW5rIE1hcCNwdXR9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5UmVzdWx0IHB1dChRdWVyeUtleSBxaywgUXVlcnlSZXN1bHQgb2lkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHZhbHVlIHN0b3JlZCB1bmRlciB0aGUgZ2l2ZW4gcXVlcnkga2V5LgorICAgICAqICBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgbm90IGludm9rZWQgZGlyZWN0bHkgZnJvbSBvdXRzaWRlCisgICAgICogdGhlIDxjb2RlPlF1ZXJ5Q2FjaGU8L2NvZGU+IGNsYXNzLiBJbnN0ZWFkLCB0aGUgY2FjaGUgc2hvdWxkCisgICAgICogYmUgdXBkYXRlZCBieSBpbXBsZW1lbnRpbmcge0BsaW5rCisgICAgICogb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdExpc3RlbmVyfSwKKyAgICAgKiB3aGljaCB3aWxsIHJlc3VsdCBpbiBhbGwgcXVlcmllcyB0aGF0IG1heSBiZSBpbnZhbGlkIGJlaW5nIGRyb3BwZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNhY2hlZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiB0aGUga2V5IHdhcyBub3QgcHJldmlvdXNseSBjYWNoZWQuIFNlZSB7QGxpbmsgTWFwI3JlbW92ZX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlSZXN1bHQgcmVtb3ZlKFF1ZXJ5S2V5IHFrKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgZGF0YSBmcm9tIHRoaXMgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFBpbiB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyIDxjb2RlPnFrPC9jb2RlPiBpbnRvIHRoZQorICAgICAqIGNhY2hlLiBUaGlzIG1ldGhvZCBndWFyYW50ZWVzIHRoYXQgPGNvZGU+cWs8L2NvZGU+J3MgdmFsdWUKKyAgICAgKiB3aWxsIG5vdCBiZSBleHBpcmVkIGlmIHRoZSBjYWNoZSBleGNlZWRzIGl0cyBjYXBhY2l0eS4gSXQKKyAgICAgKiBjYXVzZXMgdGhpcyBkYXRhIHRvIGJlIGlnbm9yZWQgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdAorICAgICAqIHRoZSBjYWNoZSBpcyBmdWxsLCBlZmZlY3RpdmVseSBpbmNyZWFzaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YKKyAgICAgKiBkYXRhIHN0b3JlZCBpbiB0aGUgY2FjaGUuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFmZmVjdCB0aGUKKyAgICAgKiBiZWhhdmlvciBvZiB7QGxpbmsgI3JlbW92ZX0gb3Ige0BsaW5rICNvblR5cGVzQ2hhbmdlZH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmtleTwvY29kZT4ncyB2YWx1ZSB3YXMKKyAgICAgKiBwaW5uZWQgaW50byB0aGUgY2FjaGU7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcGluKFF1ZXJ5S2V5IHFrKTsKKworICAgIC8qKgorICAgICAqIFVucGluIHRoZSB2YWx1ZSBzdG9yZWQgdW5kZXIgPGNvZGU+a2V5PC9jb2RlPiBpbnRvIHRoZSBjYWNoZS4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXZlcnNlcyBhIHByZXZpb3VzIGludm9jYXRpb24gb2Yge0BsaW5rICNwaW59LgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJlbW92ZSBhbnl0aGluZyBmcm9tIHRoZSBjYWNoZTsgaXQgbWVyZWx5CisgICAgICogbWFrZXMgPGNvZGU+a2V5PC9jb2RlPidzIHZhbHVlIGEgY2FuZGlkYXRlIGZvciBmbHVzaGluZyBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+a2V5PC9jb2RlPidzIHZhbHVlIHdhcworICAgICAqIHVucGlubmVkIGZyb20gdGhlIGNhY2hlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlCisgICAgICoga2V5IGlzIG5vdCBpbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdW5waW4oUXVlcnlLZXkgcWspOworCisgICAgLyoqCisgICAgICogT2J0YWluIGEgd3JpdGUgbG9jayBvbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVMb2NrKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSB3cml0ZSBsb2NrIG9uIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVVubG9jaygpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHR5cGVzIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY2FjaGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUeXBlc0NoYW5nZWRMaXN0ZW5lcihUeXBlc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW4pOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIHR5cGVzIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjYWNoZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVR5cGVzQ2hhbmdlZExpc3RlbmVyKFR5cGVzQ2hhbmdlZExpc3RlbmVyIGxpc3Rlbik7CisKKyAgICAvKioKKyAgICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIGNhY2hlLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlICgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlDYWNoZVN0b3JlUXVlcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL1F1ZXJ5Q2FjaGVTdG9yZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiMzJmZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL1F1ZXJ5Q2FjaGVTdG9yZVF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZTsKKworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxpbmtlZE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkxvY2tMZXZlbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBBIHtAbGluayBTdG9yZVF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhY2hlcyB0aGUgT0lEcyBpbnZvbHZlZCBpbgorICogdGhlIHF1ZXJ5LCBhbmQgY2FuIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgcXVlcnkgaGFzIGJlZW4gZGlydGllZC4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQHNpbmNlIDAuMi41LjAKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5Q2FjaGVTdG9yZVF1ZXJ5CisgICAgaW1wbGVtZW50cyBTdG9yZVF1ZXJ5IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RvcmVRdWVyeSBfcXVlcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBRdWVyeUNhY2hlIF9jYWNoZTsKKyAgICBwcml2YXRlIFN0b3JlQ29udGV4dCBfc2N0eDsKKyAgICBwcml2YXRlIE1ldGFEYXRhUmVwb3NpdG9yeSBfcmVwb3M7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgdGhhdCBkZWxlZ2F0ZXMgdG8gPGNvZGU+cXVlcnk8L2NvZGU+IGlmIG5vCisgICAgICogY2FjaGVkIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlDYWNoZVN0b3JlUXVlcnkoU3RvcmVRdWVyeSBxdWVyeSwgUXVlcnlDYWNoZSBjYWNoZSkgeworICAgICAgICBfcXVlcnkgPSBxdWVyeTsKKyAgICAgICAgX2NhY2hlID0gY2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgUXVlcnlDYWNoZX0gdGhhdCB0aGlzIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5Q2FjaGUgZ2V0Q2FjaGUoKSB7CisgICAgICAgIHJldHVybiBfY2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIFN0b3JlUXVlcnkgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9vayBpbiB0aGUgcXVlcnkgY2FjaGUgZm9yIGEgcmVzdWx0IGZvciB0aGUgZ2l2ZW4gcXVlcnkKKyAgICAgKiBrZXkuIE9ubHkgbG9vayBpZiB0aGlzIHF1ZXJ5IGlzIGJlaW5nIGV4ZWN1dGVkIG91dHNpZGUgYQorICAgICAqIHRyYW5zYWN0aW9uIG9yIGluIGEgdHJhbnNhY3Rpb24gd2l0aCBJZ25vcmVDaGFuZ2VzIHNldCB0byB0cnVlCisgICAgICogb3IgaW4gYSB0cmFuc2FjdGlvbiB3aXRoIElnbm9yZUNoYW5nZXMgc2V0IHRvIGZhbHNlIGJ1dCBpbiB3aGljaAorICAgICAqIG5vbmUgb2YgdGhlIGNsYXNzZXMgaW52b2x2ZWQgaW4gdGhpcyBxdWVyeSBoYXZlIGJlZW4gdG91Y2hlZC4KKyAgICAgKiAgQ2FjaGluZyBpcyBub3QgdXNlZCB3aGVuIHVzaW5nIG9iamVjdCBsb2NraW5nLgorICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtdXN0IG9idGFpbiBsb2NrcyBvbiB0aGUKKyAgICAgKiBkYXRhLCBhbmQgaXQgaXMgbGlrZWx5IHRoYXQgbWFraW5nIG4gdHJpcHMgdG8gdGhlIGRhdGFiYXNlIHRvCisgICAgICogbWFrZSB0aGUgbG9ja3Mgd2lsbCBiZSBzbG93ZXIgdGhhbiBydW5uaW5nIHRoZSBxdWVyeSBhZ2FpbnN0CisgICAgICogdGhlIGRhdGFiYXNlLgorICAgICAqICBJZiB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbiBoYXMgcXVlcnkgY2FjaGluZyBkaXNhYmxlZCwKKyAgICAgKiB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogIFJldHVybiB0aGUgbGlzdCBpZiB3ZSBtZWV0IHRoZSBhYm92ZSBjcml0ZXJpYSBhbmQgaWYgYSBsaXN0CisgICAgICogaXMgZm91bmQgZm9yIDxjb2RlPnFrPC9jb2RlPi4gRWxzZSwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogIFRoaXMgaW1wbGVtZW50YXRpb24gbWVhbnMgdGhhdCBxdWVyaWVzIGFnYWluc3QgdGhlIGNhY2hlCisgICAgICogYXJlIG9mIFJFQURfQ09NTUlUVEVEIGlzb2xhdGlvbiBsZXZlbC4gSXQnZCBiZSBuaWNlIHRvIHN1cHBvcnQKKyAgICAgKiBSRUFEX1NFUklBTElaQUJMRSAtLSB0byBkbyBzbywgd2UnZCBqdXN0IHJldHVybiBmYWxzZSB3aGVuIGluCisgICAgICogYSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgY2hlY2tDYWNoZShRdWVyeUtleSBxaykgeworICAgICAgICBpZiAocWsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSBnZXRDb250ZXh0KCkuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmICghZmV0Y2guZ2V0UXVlcnlDYWNoZSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChmZXRjaC5nZXRSZWFkTG9ja0xldmVsKCkgPiBMb2NrTGV2ZWxzLkxPQ0tfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGdldCB0aGUgY2FjaGVkIGRhdGEKKyAgICAgICAgUXVlcnlSZXN1bHQgcmVzID0gX2NhY2hlLmdldChxayk7CisgICAgICAgIGlmIChyZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAocmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCisgICAgICAgIGludCBwcm9qcyA9IGdldENvbnRleHQoKS5nZXRQcm9qZWN0aW9uQWxpYXNlcygpLmxlbmd0aDsKKyAgICAgICAgaWYgKHByb2pzID09IDApIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YSBjYWNoZSBjb250YWlucyB0aGUgb2lkcyBmb3IgdGhlIHF1ZXJ5IHJlc3VsdDsKKyAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QsIHRoZW4gdXNpbmcgdGhlIHJlc3VsdCBjb3VsZCBiZSBzbG93ZXIgdGhhbiBub3QKKyAgICAgICAgICAgIC8vIHVzaW5nIGl0IGJlY2F1c2Ugb2YgdGhlIGluZGl2aWR1YWwgYnktb2lkIGxvb2t1cHMKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IF9yZXBvcy5nZXRNZXRhRGF0YShnZXRDb250ZXh0KCkuCisgICAgICAgICAgICAgICAgZ2V0Q2FuZGlkYXRlVHlwZSgpLCBfc2N0eC5nZXRDbGFzc0xvYWRlcigpLCB0cnVlKTsKKyAgICAgICAgICAgIEJpdFNldCBpZHhzID0gbWV0YS5nZXREYXRhQ2FjaGUoKS5jb250YWluc0FsbChyZXMpOworCisgICAgICAgICAgICAvLyBldmVudHVhbGx5IHdlIHNob3VsZCBvcHRpbWl6ZSB0aGlzIHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgb2JqZWN0cworICAgICAgICAgICAgLy8gdGhlIGNhY2hlIGlzIG1pc3NpbmcgYW5kIGlmIG9ubHkgYSBmZXcgZG8gYSBidWxrIGZldGNoIGZvciB0aGVtCisgICAgICAgICAgICBpbnQgbGVuID0gaWR4cy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCByZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoIWlkeHMuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENhY2hlZExpc3QocmVzLCBwcm9qcyAhPSAwLCBfc2N0eCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcCB0aGUgcmVzdWx0IG9iamVjdCBwcm92aWRlciByZXR1cm5lZCBieSBvdXIgZGVsZWdhdGUgaW4gYQorICAgICAqIGNhY2hpbmcgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXN1bHRPYmplY3RQcm92aWRlciB3cmFwUmVzdWx0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCwKKyAgICAgICAgUXVlcnlLZXkga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByb3A7CisgICAgICAgIHJldHVybiBuZXcgQ2FjaGluZ1Jlc3VsdE9iamVjdFByb3ZpZGVyKHJvcCwgZ2V0Q29udGV4dCgpLgorICAgICAgICAgICAgZ2V0UHJvamVjdGlvbkFsaWFzZXMoKS5sZW5ndGggPiAwLCBrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgYSBwcm9qZWN0aW9uIGVsZW1lbnQgZm9yIGNhY2hpbmcgLyByZXR1cm5pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNvcHlQcm9qZWN0aW9uKE9iamVjdCBvYmosIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHN3aXRjaCAoSmF2YVR5cGVzLmdldFR5cGVDb2RlKG9iai5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTl9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVJfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdJTlRFR0VSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOgorICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAoKERhdGUpIG9iaikuY2xvbmUoKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPQ0FMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gKChMb2NhbGUpIG9iaikuY2xvbmUoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENhY2hlZE9iamVjdElkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbU9iamVjdElkKCgoQ2FjaGVkT2JqZWN0SWQpIG9iaikub2lkLCBjdHgpOworICAgICAgICAgICAgICAgIE9iamVjdCBvaWQgPSBjdHguZ2V0T2JqZWN0SWQob2JqKTsKKyAgICAgICAgICAgICAgICBpZiAob2lkICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FjaGVkT2JqZWN0SWQob2lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXN1bHQgb2JqZWN0IGJhc2VkIG9uIGl0cyBjYWNoZWQgb2lkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBmcm9tT2JqZWN0SWQoT2JqZWN0IG9pZCwgU3RvcmVDb250ZXh0IHNjdHgpIHsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT2JqZWN0IG9iaiA9IHNjdHguZmluZChvaWQsIG51bGwsIG51bGwsIG51bGwsIDApOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24ob2lkKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpCisgICAgICAgIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3F1ZXJ5OworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChRdWVyeUNvbnRleHQgcWN0eCkgeworICAgICAgICBfcXVlcnkuc2V0Q29udGV4dChxY3R4KTsKKyAgICAgICAgX3NjdHggPSBxY3R4LmdldFN0b3JlQ29udGV4dCgpOworICAgICAgICBfcmVwb3MgPSBfc2N0eC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRRdWVyeShPYmplY3QgcXVlcnkpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5zZXRRdWVyeShxdWVyeSk7CisgICAgfQorCisgICAgcHVibGljIEZpbHRlckxpc3RlbmVyIGdldEZpbHRlckxpc3RlbmVyKFN0cmluZyB0YWcpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRGaWx0ZXJMaXN0ZW5lcih0YWcpOworICAgIH0KKworICAgIHB1YmxpYyBBZ2dyZWdhdGVMaXN0ZW5lciBnZXRBZ2dyZWdhdGVMaXN0ZW5lcihTdHJpbmcgdGFnKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0QWdncmVnYXRlTGlzdGVuZXIodGFnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0NvbXBpbGF0aW9uS2V5KCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5Lm5ld0NvbXBpbGF0aW9uS2V5KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdDb21waWxhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5uZXdDb21waWxhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRnJvbUNvbXBpbGF0aW9uKE9iamVjdCBjb21wKSB7CisgICAgICAgIF9xdWVyeS5wb3B1bGF0ZUZyb21Db21waWxhdGlvbihjb21wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlQ29tcGlsYXRpb24oKSB7CisgICAgICAgIF9xdWVyeS5pbnZhbGlkYXRlQ29tcGlsYXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RhdGFTdG9yZUV4ZWN1dGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5zdXBwb3J0c0RhdGFTdG9yZUV4ZWN1dGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5NZW1vcnlFeGVjdXRpb24oKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkuc3VwcG9ydHNJbk1lbW9yeUV4ZWN1dGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBFeGVjdXRvciBuZXdJbk1lbW9yeUV4ZWN1dG9yKENsYXNzTWV0YURhdGEgbWV0YSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkubmV3SW5NZW1vcnlFeGVjdXRvcihtZXRhLCBzdWJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhlY3V0b3IgbmV3RGF0YVN0b3JlRXhlY3V0b3IoQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgRXhlY3V0b3IgZXggPSBfcXVlcnkubmV3RGF0YVN0b3JlRXhlY3V0b3IobWV0YSwgc3Vicyk7CisgICAgICAgIHJldHVybiBuZXcgUXVlcnlDYWNoZUV4ZWN1dG9yKGV4LCBtZXRhLCBzdWJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Fic3RyYWN0RXhlY3V0b3JzKCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5LnN1cHBvcnRzQWJzdHJhY3RFeGVjdXRvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0NhbmRpZGF0ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkucmVxdWlyZXNDYW5kaWRhdGVUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNQYXJhbWV0ZXJEZWNsYXJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkucmVxdWlyZXNQYXJhbWV0ZXJEZWNsYXJhdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1BhcmFtZXRlckRlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5zdXBwb3J0c1BhcmFtZXRlckRlY2xhcmF0aW9ucygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hpbmcgZXhlY3V0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUXVlcnlDYWNoZUV4ZWN1dG9yCisgICAgICAgIGltcGxlbWVudHMgRXhlY3V0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgX2V4OworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzIF9jYW5kaWRhdGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfc3ViczsKKworICAgICAgICBwdWJsaWMgUXVlcnlDYWNoZUV4ZWN1dG9yKEV4ZWN1dG9yIGV4LCBDbGFzc01ldGFEYXRhIG1ldGEsCisgICAgICAgICAgICBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgICAgIF9leCA9IGV4OworICAgICAgICAgICAgX2NhbmRpZGF0ZSA9IChtZXRhID09IG51bGwpID8gbnVsbCA6IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgX3N1YnMgPSBzdWJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVRdWVyeShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcywKKyAgICAgICAgICAgIFJhbmdlIHJhbmdlKSB7CisgICAgICAgICAgICBRdWVyeUNhY2hlU3RvcmVRdWVyeSBjcSA9IChRdWVyeUNhY2hlU3RvcmVRdWVyeSkgcTsKKyAgICAgICAgICAgIFF1ZXJ5S2V5IGtleSA9IFF1ZXJ5S2V5Lm5ld0luc3RhbmNlKGNxLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBfZXguaXNQYWNraW5nKHEpLCBwYXJhbXMsIF9jYW5kaWRhdGUsIF9zdWJzLCByYW5nZS5zdGFydCwgCisgICAgICAgICAgICAgICAgcmFuZ2UuZW5kKTsKKyAgICAgICAgICAgIExpc3QgY2FjaGVkID0gY3EuY2hlY2tDYWNoZShrZXkpOworICAgICAgICAgICAgaWYgKGNhY2hlZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGNhY2hlZCk7CisKKyAgICAgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCA9IF9leC5leGVjdXRlUXVlcnkoY3EuZ2V0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICBwYXJhbXMsIHJhbmdlKTsKKyAgICAgICAgICAgIHJldHVybiBjcS53cmFwUmVzdWx0KHJvcCwga2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciB0aGUgY2FjaGVkIHF1ZXJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgcGF0aAorICAgICAgICAgKiBjbGFzc2VzIGluIHRoZSBxdWVyeS4gVGhpcyBpcyBkb25lIHdoZW4gYnVsayBvcGVyYXRpb25zCisgICAgICAgICAqIChzdWNoIGFzIGRlbGV0ZXMgb3IgdXBkYXRlcykgYXJlIHBlcmZvcm1lZCBzbyB0aGF0IHRoZQorICAgICAgICAgKiBjYWNoZSByZW1haW5zIHVwLXRvLWRhdGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJBY2Nlc3NQYXRoKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgaWYgKHEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGFbXSBjbWQgPSBnZXRBY2Nlc3NQYXRoTWV0YURhdGFzKHEpOworICAgICAgICAgICAgaWYgKGNtZCA9PSBudWxsIHx8IGNtZC5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIExpc3QgY2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoY21kLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbWRbaV0uZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKworICAgICAgICAgICAgLy8gZXZpY3QgZnJvbSB0aGUgcXVlcnkgY2FjaGUKKyAgICAgICAgICAgIFF1ZXJ5Q2FjaGVTdG9yZVF1ZXJ5IGNxID0gKFF1ZXJ5Q2FjaGVTdG9yZVF1ZXJ5KSBxOworICAgICAgICAgICAgY3EuZ2V0Q2FjaGUoKS5vblR5cGVzQ2hhbmdlZChuZXcgVHlwZXNDaGFuZ2VkRXZlbnQKKyAgICAgICAgICAgICAgICAocS5nZXRDb250ZXh0KCksIGNsYXNzZXMpKTsKKworICAgICAgICAgICAgLy8gZXZpY3QgZnJvbSB0aGUgZGF0YSBjYWNoZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY21kW2ldLmdldERhdGFDYWNoZSgpLnJlbW92ZUFsbCgKKyAgICAgICAgICAgICAgICAgICAgY21kW2ldLmdldERlc2NyaWJlZFR5cGUoKSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTnVtYmVyIGV4ZWN1dGVEZWxldGUoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9leC5leGVjdXRlRGVsZXRlKHVud3JhcChxKSwgcGFyYW1zKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xlYXJBY2Nlc3NQYXRoKHEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE51bWJlciBleGVjdXRlVXBkYXRlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBfZXguZXhlY3V0ZVVwZGF0ZSh1bndyYXAocSksIHBhcmFtcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsZWFyQWNjZXNzUGF0aChxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVFJJTkdTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICBfZXgudmFsaWRhdGUodW53cmFwKHEpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0UmFuZ2UoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMsIFJhbmdlIHJhbmdlKSB7CisgICAgICAgICAgICBfZXguZ2V0UmFuZ2UocSwgcGFyYW1zLCByYW5nZSk7IAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgT2JqZWN0IHJlc3VsdE9iamVjdCwgaW50IG9yZGVySW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXguZ2V0T3JkZXJpbmdWYWx1ZSh1bndyYXAocSksIHBhcmFtcywgcmVzdWx0T2JqZWN0LAorICAgICAgICAgICAgICAgIG9yZGVySW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW5bXSBnZXRBc2NlbmRpbmcoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4LmdldEFzY2VuZGluZyh1bndyYXAocSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNraW5nKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9leC5pc1BhY2tpbmcodW53cmFwKHEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4LmdldEFsaWFzKHVud3JhcChxKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0Q2xhc3MoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4LmdldFJlc3VsdENsYXNzKHVud3JhcChxKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvamVjdGlvbkFsaWFzZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4LmdldFByb2plY3Rpb25BbGlhc2VzKHVud3JhcChxKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRQcm9qZWN0aW9uVHlwZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4LmdldFByb2plY3Rpb25UeXBlcyh1bndyYXAocSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzTWV0YURhdGFbXSBnZXRBY2Nlc3NQYXRoTWV0YURhdGFzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9leC5nZXRBY2Nlc3NQYXRoTWV0YURhdGFzKHVud3JhcChxKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbihTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXguZ2V0T3BlcmF0aW9uKHVud3JhcChxKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZShTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXguaXNBZ2dyZWdhdGUodW53cmFwKHEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0dyb3VwaW5nKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9leC5oYXNHcm91cGluZyh1bndyYXAocSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpbmtlZE1hcCBnZXRQYXJhbWV0ZXJUeXBlcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXguZ2V0UGFyYW1ldGVyVHlwZXModW53cmFwKHEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXAgZ2V0VXBkYXRlcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXguZ2V0VXBkYXRlcyh1bndyYXAocSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RvcmVRdWVyeSB1bndyYXAoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gKChRdWVyeUNhY2hlU3RvcmVRdWVyeSkgcSkuZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3VsdCBsaXN0IGltcGxlbWVudGF0aW9uIGZvciBhIGNhY2hlZCBxdWVyeSByZXN1bHQuIFBhY2thZ2UtcHJvdGVjdGVkCisgICAgICogZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWNoZWRMaXN0CisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0CisgICAgICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFF1ZXJ5UmVzdWx0IF9yZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcHJvajsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdG9yZUNvbnRleHQgX3NjdHg7CisKKyAgICAgICAgcHVibGljIENhY2hlZExpc3QoUXVlcnlSZXN1bHQgcmVzLCBib29sZWFuIHByb2osIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgICAgIF9yZXMgPSByZXM7CisgICAgICAgICAgICBfcHJvaiA9IHByb2o7CisgICAgICAgICAgICBfc2N0eCA9IGN0eDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpZHgpIHsKKyAgICAgICAgICAgIGlmICghX3Byb2opCisgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21PYmplY3RJZChfcmVzLmdldChpZHgpLCBfc2N0eCk7CisKKyAgICAgICAgICAgIE9iamVjdFtdIGNhY2hlZCA9IChPYmplY3RbXSkgX3Jlcy5nZXQoaWR4KTsKKyAgICAgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIE9iamVjdFtdIHVuY2FjaGVkID0gbmV3IE9iamVjdFtjYWNoZWQubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHVuY2FjaGVkW2ldID0gY29weVByb2plY3Rpb24oY2FjaGVkW2ldLCBfc2N0eCk7CisgICAgICAgICAgICByZXR1cm4gdW5jYWNoZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpCisgICAgICAgICAgICB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB3cmFwcGVyIGFyb3VuZCBhIHtAbGluayBSZXN1bHRPYmplY3RQcm92aWRlcn0gdGhhdCBidWlsZHMgdXAgYSBsaXN0IG9mCisgICAgICogYWxsIHRoZSBPSURzIGluIHRoaXMgbGlzdCBhbmQgcmVnaXN0ZXJzIHRoYXQgbGlzdCB3aXRoIHRoZQorICAgICAqIHF1ZXJ5IGNhY2hlLiBBYmFuZG9ucyBtb25pdG9yaW5nIGFuZCByZWdpc3RlcmluZyBpZiBvbmUgb2YgdGhlIGNsYXNzZXMKKyAgICAgKiBpbiB0aGUgYWNjZXNzIHBhdGggaXMgbW9kaWZpZWQgd2hpbGUgdGhlIHF1ZXJ5IHJlc3VsdHMgYXJlIGJlaW5nIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIENhY2hpbmdSZXN1bHRPYmplY3RQcm92aWRlcgorICAgICAgICBpbXBsZW1lbnRzIFJlc3VsdE9iamVjdFByb3ZpZGVyLCBUeXBlc0NoYW5nZWRMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRPYmplY3RQcm92aWRlciBfcm9wOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX3Byb2o7CisgICAgICAgIHByaXZhdGUgZmluYWwgUXVlcnlLZXkgX3FrOworICAgICAgICBwcml2YXRlIGZpbmFsIFRyZWVNYXAgX2RhdGEgPSBuZXcgVHJlZU1hcCgpOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gX21haW50YWluQ2FjaGUgPSB0cnVlOworICAgICAgICBwcml2YXRlIGludCBfcG9zID0gLTE7CisKKyAgICAgICAgLy8gdXNlZCB0byBkZXRlcm1pbmUgbGlzdCBzaXplIHdpdGhvdXQgbmVjZXNzYXJpbHkgY2FsbGluZyBzaXplKCksCisgICAgICAgIC8vIHdoaWNoIG1heSByZXF1aXJlIGEgREIgdHJpcCBvciByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUUKKyAgICAgICAgcHJpdmF0ZSBpbnQgX21heCA9IC0xOworICAgICAgICBwcml2YXRlIGludCBfc2l6ZSA9IEludGVnZXIuTUFYX1ZBTFVFOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGRlbGVnYXRlIHJlc3VsdCBwcm92aWRlciBhbmQgb3VyIHF1ZXJ5IGtleS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDYWNoaW5nUmVzdWx0T2JqZWN0UHJvdmlkZXIoUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wLAorICAgICAgICAgICAgYm9vbGVhbiBwcm9qLCBRdWVyeUtleSBrZXkpIHsKKyAgICAgICAgICAgIF9yb3AgPSByb3A7CisgICAgICAgICAgICBfcHJvaiA9IHByb2o7CisgICAgICAgICAgICBfcWsgPSBrZXk7CisgICAgICAgICAgICBfY2FjaGUuYWRkVHlwZXNDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcCBjYWNoaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFib3J0Q2FjaGluZygpIHsKKyAgICAgICAgICAgIGlmICghX21haW50YWluQ2FjaGUpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBjYWxsZWQgdmlhIGFuIGV2ZW50IGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIC8vIGl0J3MgaW1wb3J0YW50IHRoYXQgd2Ugc2V0IHRoaXMgZmxhZyBmaXJzdCBzbyB0aGF0IGFueQorICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBvYmplY3QgYXJlIGJ5cGFzc2VkLgorICAgICAgICAgICAgICAgIF9tYWludGFpbkNhY2hlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgX2NhY2hlLnJlbW92ZVR5cGVzQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIF9kYXRhLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgd2hldGhlciB3ZSd2ZSBidWZmZXJlZCBhbGwgcmVzdWx0cywgd2hpbGUgb3B0aW9uYWxseSBhZGRpbmcKKyAgICAgICAgICogdGhlIGdpdmVuIHJlc3VsdC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0ZpbmlzaGVkKE9iamVjdCBvYmosIGJvb2xlYW4gcmVzdWx0KSB7CisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBjYWxsZWQgYXQgdGhlIHNhbWUgdGltZSBhcyBhYm9ydENhY2hpbmcgdmlhCisgICAgICAgICAgICAvLyBhIHR5cGVzIGNoYW5nZWQgZXZlbnQKKyAgICAgICAgICAgIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChfbWFpbnRhaW5DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGluZGV4ID0gTnVtYmVycy52YWx1ZU9mKF9wb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfZGF0YS5jb250YWluc0tleShpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY2FjaGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghX3Byb2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZCA9IF9zY3R4LmdldE9iamVjdElkKG9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyciA9IChPYmplY3RbXSkgb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBjcCA9IG5ldyBPYmplY3RbYXJyLmxlbmd0aF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BbaV0gPSBjb3B5UHJvamVjdGlvbihhcnJbaV0sIF9zY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkID0gY3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RhdGEucHV0KGluZGV4LCBjYWNoZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gX3NpemUgPT0gX2RhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgLy8gYW4gYWJvcnRDYWNoaW5nIGNhbGwgY2FuIHNuZWFrIGluIGhlcmUgdmlhIG9uRXhwaXJlOyB0aGUKKyAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBsb2NrZWQgZHVyaW5nIGV2ZW50IGZpcmluZ3MsIHNvIHRoZSBsb2NrIGhlcmUgd2lsbAorICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGl0IChvciB3aWxsIGZvcmNlIHRoZSBuZXh0IGZpcmluZyB0byB3YWl0KQorICAgICAgICAgICAgICAgIF9jYWNoZS53cml0ZUxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZGlkbid0IGFib3J0CisgICAgICAgICAgICAgICAgICAgIGlmIChfbWFpbnRhaW5DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlSZXN1bHQgcmVzID0gbmV3IFF1ZXJ5UmVzdWx0KF9xaywgX2RhdGEudmFsdWVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgX2NhY2hlLnB1dChfcWssIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydENhY2hpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgX2NhY2hlLndyaXRlVW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gX3JvcC5zdXBwb3J0c1JhbmRvbUFjY2VzcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb3BlbigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9yb3Aub3BlbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRPYmplY3QoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gX3JvcC5nZXRSZXN1bHRPYmplY3QoKTsKKyAgICAgICAgICAgIGNoZWNrRmluaXNoZWQob2JqLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX3BvcysrOworICAgICAgICAgICAgYm9vbGVhbiBuZXh0ID0gX3JvcC5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIW5leHQgJiYgX3BvcyA9PSBfbWF4ICsgMSkgeworICAgICAgICAgICAgICAgIF9zaXplID0gX3BvczsKKyAgICAgICAgICAgICAgICBjaGVja0ZpbmlzaGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCAmJiBfcG9zID4gX21heCkKKyAgICAgICAgICAgICAgICBfbWF4ID0gX3BvczsKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX3BvcyA9IHBvczsKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBfcm9wLmFic29sdXRlKHBvcyk7CisgICAgICAgICAgICBpZiAoIXZhbGlkICYmIF9wb3MgPT0gX21heCArIDEpIHsKKyAgICAgICAgICAgICAgICBfc2l6ZSA9IF9wb3M7CisgICAgICAgICAgICAgICAgY2hlY2tGaW5pc2hlZChudWxsLCBmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkICYmIF9wb3MgPiBfbWF4KQorICAgICAgICAgICAgICAgIF9tYXggPSBfcG9zOworICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKF9zaXplICE9IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICAgICAgICAgIGludCBzaXplID0gX3JvcC5zaXplKCk7CisgICAgICAgICAgICBfc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBjaGVja0ZpbmlzaGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcm9wLnJlc2V0KCk7CisgICAgICAgICAgICBfcG9zID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFib3J0Q2FjaGluZygpOworICAgICAgICAgICAgX3JvcC5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UeXBlc0NoYW5nZWQoVHlwZXNDaGFuZ2VkRXZlbnQgZXYpIHsKKyAgICAgICAgICAgIGlmIChfcWsuY2hhbmdlSW52YWxpZGF0ZXNRdWVyeShldi5nZXRUeXBlcygpKSkKKyAgICAgICAgICAgICAgICBhYm9ydENhY2hpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cnVjdCB0byByZWNvZ25pemUgY2FjaGVkIG9pZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FjaGVkT2JqZWN0SWQgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3Qgb2lkOworCisgICAgICAgIHB1YmxpYyBDYWNoZWRPYmplY3RJZCAoT2JqZWN0IG9pZCkKKwkJeworCQkJdGhpcy5vaWQgPSBvaWQ7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9RdWVyeUtleS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTU3ZDBmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlLZXkuamF2YQpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlOworCitpbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuT2JqZWN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUXVlcnlDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworCisvKioKKyAqIFRoaXMgY2xhc3Mgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBpbnZvY2F0aW9uIG9mCisgKiBhIHF1ZXJ5LiBJdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgZXh0ZXJuYWwgcHJvcGVydGllcyBvZiB0aGUKKyAqIHF1ZXJ5IHRoYXQgd2FzIGV4ZWN1dGVkLCBhcyB3ZWxsIGFzIGFueSBwYXJhbWV0ZXJzIHVzZWQgdG8gZXhlY3V0ZQorICogdGhhdCBxdWVyeSwgd2l0aCBvbmUgZXhjZXB0aW9uOiBmaXJzdC1jbGFzcyBvYmplY3RzIHVzZWQgYXMKKyAqIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBPSURzLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeUtleQorICAgIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgeworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc2V0IG9mIHVubW9kaWZpYWJsZSBjbGFzc2VzLiBUaGlzIGFsbG93cyB1cworICAgIC8vIHRvIGF2b2lkIGNsb25pbmcgY29sbGVjdGlvbnMgdGhhdCBhcmUgbm90IG1vZGlmaWFibGUsCisgICAgLy8gcHJvdmlkZWQgdGhhdCB0aGV5IGRvIG5vdCBjb250YWluIG11dGFibGUgb2JqZWN0cy4KKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHNfdW5tb2QgPSBuZXcgSGFzaFNldCgpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gaGFuZGxlIHRoZSBzZXQgdHlwZXM7IGpkayB1c2VzIGRpZmZlcmVudCBjbGFzc2VzIGZvciBjb2xsZWN0aW9uLAorICAgICAgICAvLyBzZXQsIGFuZCBzb3J0ZWQgc2V0CisgICAgICAgIFRyZWVTZXQgcyA9IG5ldyBUcmVlU2V0KCk7CisgICAgICAgIHNfdW5tb2QuYWRkKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24ocykuZ2V0Q2xhc3MoKSk7CisgICAgICAgIHNfdW5tb2QuYWRkKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChzKS5nZXRDbGFzcygpKTsKKyAgICAgICAgc191bm1vZC5hZGQoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KHMpLmdldENsYXNzKCkpOworCisgICAgICAgIC8vIGhhbmRsZSB0aGUgbGlzdCB0eXBlczsgamRrIHVzZXMgZGlmZmVyZW50IGNsYXNzZXMgZm9yIHN0YW5kYXJkCisgICAgICAgIC8vIGFuZCByYW5kb20gYWNjZXNzIGxpc3RzCisgICAgICAgIExpc3QgbCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHNfdW5tb2QuYWRkKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGwgPSBuZXcgQXJyYXlMaXN0KDApOworICAgICAgICBzX3VubW9kLmFkZChDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGwpLmdldENsYXNzKCkpOworCisgICAgICAgIC8vIGhhbmRsZSB0aGUgY29uc3RhbnQgdHlwZXMKKyAgICAgICAgc191bm1vZC5hZGQoQ29sbGVjdGlvbnMuRU1QVFlfU0VULmdldENsYXNzKCkpOworICAgICAgICBzX3VubW9kLmFkZChDb2xsZWN0aW9ucy5FTVBUWV9MSVNULmdldENsYXNzKCkpOworICAgIH0KKworICAgIC8vIGNhY2hpbmcgc3RhdGU7IG5vIG5lZWQgdG8gaW5jbHVkZSBwYXJhbWV0ZXIgYW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgaW1wbGljaXQgaW4gdGhlIGZpbHRlcgorICAgIHByaXZhdGUgU3RyaW5nIF9jYW5kaWRhdGVDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9zdWJjbGFzc2VzOworICAgIHByaXZhdGUgU2V0IF9hY2Nlc3NQYXRoQ2xhc3NOYW1lczsKKyAgICBwcml2YXRlIFN0cmluZyBfcXVlcnk7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pZ25vcmVDaGFuZ2VzOworICAgIHByaXZhdGUgTWFwIF9wYXJhbXM7CisgICAgcHJpdmF0ZSBsb25nIF9yYW5nZVN0YXJ0OworICAgIHByaXZhdGUgbG9uZyBfcmFuZ2VFbmQ7CisKKyAgICAvLyAjIyMgcGNsOiAyIE1heSAyMDAzOiBzaG91bGQgdGhpcyB0aW1lb3V0IHRha2UgaW50byBhY2NvdW50IHRoZQorICAgIC8vICMjIyB0aW1lb3V0cyBmb3IgY2xhc3NlcyBpbiB0aGUgYWNjZXNzIHBhdGggb2YgdGhlIHF1ZXJ5PworICAgIC8vICMjIyBDdXJyZW50bHksIGl0IG9ubHkgY29uc2lkZXJzIHRoZSBjYW5kaWRhdGUgY2xhc3MgYW5kIGl0cworICAgIC8vICMjIyBzdWJjbGFzc2VzLiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCisgICAgLy8gIyMjIG9yIG5vdCBPSURzIHNob3VsZCBiZSByZWdpc3RlcmVkIGZvciBleHBpcmF0aW9uIGNhbGxiYWNrcworICAgIHByaXZhdGUgaW50IF90aW1lb3V0ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBrZXkgZm9yIHRoZSBnaXZlbiBxdWVyeSwgb3IgbnVsbCBpZiBpdCBpcyBub3QgY2FjaGVhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUXVlcnlLZXkgbmV3SW5zdGFuY2UoUXVlcnkgcSkgeworICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UocSwgKE9iamVjdFtdKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBrZXkgZm9yIHRoZSBnaXZlbiBxdWVyeSwgb3IgbnVsbCBpZiBpdCBpcyBub3QgY2FjaGVhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUXVlcnlLZXkgbmV3SW5zdGFuY2UoUXVlcnkgcSwgT2JqZWN0W10gYXJncykgeworICAgICAgICAvLyBjb21waWxlIHRvIG1ha2Ugc3VyZSBpbmZvIGVuY29kZWQgaW4gcXVlcnkgc3RyaW5nIGlzIGF2YWlsYWJsZQorICAgICAgICAvLyB2aWEgQVBJIGNhbGxzIChjYW5kaWRhdGUgY2xhc3MsIHJlc3VsdCBjbGFzcywgZXRjKQorICAgICAgICBxLmNvbXBpbGUoKTsKKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHEsIGZhbHNlLCBhcmdzLCBxLmdldENhbmRpZGF0ZVR5cGUoKSwKKyAgICAgICAgICAgIHEuaGFzU3ViY2xhc3NlcygpLCBxLmdldFN0YXJ0UmFuZ2UoKSwgcS5nZXRFbmRSYW5nZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBrZXkgZm9yIHRoZSBnaXZlbiBxdWVyeSwgb3IgbnVsbCBpZiBpdCBpcyBub3QgY2FjaGVhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUXVlcnlLZXkgbmV3SW5zdGFuY2UoUXVlcnkgcSwgTWFwIGFyZ3MpIHsKKyAgICAgICAgLy8gY29tcGlsZSB0byBtYWtlIHN1cmUgaW5mbyBlbmNvZGVkIGluIHF1ZXJ5IHN0cmluZyBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8gdmlhIEFQSSBjYWxscyAoY2FuZGlkYXRlIGNsYXNzLCByZXN1bHQgY2xhc3MsIGV0YykKKyAgICAgICAgcS5jb21waWxlKCk7CisgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShxLCBmYWxzZSwgYXJncywgcS5nZXRDYW5kaWRhdGVUeXBlKCksCisgICAgICAgICAgICBxLmhhc1N1YmNsYXNzZXMoKSwgcS5nZXRTdGFydFJhbmdlKCksIHEuZ2V0RW5kUmFuZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEga2V5IGZvciB0aGUgZ2l2ZW4gcXVlcnksIG9yIG51bGwgaWYgaXQgaXMgbm90IGNhY2hlYWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgUXVlcnlLZXkgbmV3SW5zdGFuY2UoUXVlcnlDb250ZXh0IHEsIGJvb2xlYW4gcGFja2VkLCBPYmplY3RbXSBhcmdzLAorICAgICAgICBDbGFzcyBjYW5kaWRhdGUsIGJvb2xlYW4gc3VicywgbG9uZyBzdGFydElkeCwgbG9uZyBlbmRJZHgpIHsKKyAgICAgICAgUXVlcnlLZXkga2V5ID0gY3JlYXRlS2V5KHEsIHBhY2tlZCwgY2FuZGlkYXRlLCBzdWJzLCBzdGFydElkeCwgZW5kSWR4KTsKKyAgICAgICAgaWYgKGtleSAhPSBudWxsICYmIHNldFBhcmFtcyhrZXksIHEsIGFyZ3MpKQorICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEga2V5IGZvciB0aGUgZ2l2ZW4gcXVlcnksIG9yIG51bGwgaWYgaXQgaXMgbm90IGNhY2hlYWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgUXVlcnlLZXkgbmV3SW5zdGFuY2UoUXVlcnlDb250ZXh0IHEsIGJvb2xlYW4gcGFja2VkLCBNYXAgYXJncywKKyAgICAgICAgQ2xhc3MgY2FuZGlkYXRlLCBib29sZWFuIHN1YnMsIGxvbmcgc3RhcnRJZHgsIGxvbmcgZW5kSWR4KSB7CisgICAgICAgIFF1ZXJ5S2V5IGtleSA9IGNyZWF0ZUtleShxLCBwYWNrZWQsIGNhbmRpZGF0ZSwgc3Vicywgc3RhcnRJZHgsIGVuZElkeCk7CisgICAgICAgIGlmIChrZXkgIT0gbnVsbCAmJiAoYXJncyA9PSBudWxsIHx8IGFyZ3MuaXNFbXB0eSgpIHx8CisgICAgICAgICAgICBzZXRQYXJhbXMoa2V5LCBxLmdldFN0b3JlQ29udGV4dCgpLCBuZXcgSGFzaE1hcChhcmdzKSkpKQorICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgcmVsZXZhbnQgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZnJvbQorICAgICAqIDxjb2RlPnE8L2NvZGU+LiBUaGlzIGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgY2FuZGlkYXRlCisgICAgICogY2xhc3MsIHF1ZXJ5IGZpbHRlciwgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFF1ZXJ5S2V5IGNyZWF0ZUtleShRdWVyeUNvbnRleHQgcSwgYm9vbGVhbiBwYWNrZWQsCisgICAgICAgIENsYXNzIGNhbmRpZGF0ZUNsYXNzLCBib29sZWFuIHN1YmNsYXNzZXMsIGxvbmcgc3RhcnRJZHgsIGxvbmcgZW5kSWR4KSB7CisgICAgICAgIGlmIChjYW5kaWRhdGVDbGFzcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY2FuIG9ubHkgY2FjaGUgZGF0YXN0b3JlIHF1ZXJpZXMKKyAgICAgICAgaWYgKHEuZ2V0Q2FuZGlkYXRlQ29sbGVjdGlvbigpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBubyBzdXBwb3J0IGFscmVhZHktcGFja2VkIHJlc3VsdHMKKyAgICAgICAgaWYgKHEuZ2V0UmVzdWx0VHlwZSgpICE9IG51bGwgJiYgcGFja2VkKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY2FuJ3QgY2FjaGUgbm9uLXNlcmlhbGl6YWJsZSBub24tbWFuYWdlZCBjb21wbGV4IHR5cGVzCisgICAgICAgIENsYXNzW10gdHlwZXMgPSBxLmdldFByb2plY3Rpb25UeXBlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKEphdmFUeXBlcy5nZXRUeXBlQ29kZSh0eXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICBpZiAoIUltcGxIZWxwZXIuaXNNYW5hZ2VkVHlwZSh0eXBlc1tpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBjYW4ndCBjYWNoZSB0aGUgcXVlcnkgaWYgd2UgZG9uJ3Qga25vdyB3aGljaCBjbGFzc2VzIGFyZSBpbiB0aGUKKyAgICAgICAgLy8gYWNjZXNzIHBhdGgKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzID0gcS5nZXRBY2Nlc3NQYXRoTWV0YURhdGFzKCk7CisgICAgICAgIGlmIChtZXRhcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFNldCBhY2Nlc3NQYXRoQ2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0KChpbnQpIChtZXRhcy5sZW5ndGggKiAxLjMzICsgMSkpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjbGFzcyBjaGFuZ2UgZnJhbWV3b3JrIGRlYWxzIHdpdGggbGVhc3QtZGVyaXZlZCB0eXBlcywKKyAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgbGVhc3QtZGVyaXZlZCBhY2Nlc3MgcGF0aCB0eXBlcworICAgICAgICAgICAgbWV0YSA9IG1ldGFzW2ldOworICAgICAgICAgICAgd2hpbGUgKG1ldGEuZ2V0UENTdXBlcmNsYXNzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtZXRhID0gbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworCisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGlzIG1ldGFkYXRhIGlzIGNhY2hlYWJsZQorICAgICAgICAgICAgaWYgKG1ldGEuZ2V0RGF0YUNhY2hlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGFjY2Vzc1BhdGhDbGFzc05hbWVzLmFkZChtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgYW55IG9mIHRoZSB0eXBlcyBhcmUgY3VycmVudGx5IGRpcnR5LCB3ZSBjYW4ndCBjYWNoZSB0aGlzIHF1ZXJ5CisgICAgICAgIFN0b3JlQ29udGV4dCBjdHggPSBxLmdldFN0b3JlQ29udGV4dCgpOworICAgICAgICBpZiAoaW50ZXJzZWN0cyhhY2Nlc3NQYXRoQ2xhc3NOYW1lcywgY3R4LmdldFBlcnNpc3RlZFR5cGVzKCkpCisgICAgICAgICAgICB8fCBpbnRlcnNlY3RzKGFjY2Vzc1BhdGhDbGFzc05hbWVzLCBjdHguZ2V0VXBkYXRlZFR5cGVzKCkpCisgICAgICAgICAgICB8fCBpbnRlcnNlY3RzKGFjY2Vzc1BhdGhDbGFzc05hbWVzLCBjdHguZ2V0RGVsZXRlZFR5cGVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lb3V0IGZvciB0aGUga2V5CisgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcyA9IGN0eC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworCisgICAgICAgIC8vIHdvbid0IGZpbmQgbWV0YWRhdGEgZm9yIGludGVyZmFjZXMuCisgICAgICAgIGlmIChjYW5kaWRhdGVDbGFzcy5pc0ludGVyZmFjZSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG1ldGEgPSByZXBvcy5nZXRNZXRhRGF0YShjYW5kaWRhdGVDbGFzcywgY3R4LmdldENsYXNzTG9hZGVyKCksIHRydWUpOworICAgICAgICBpbnQgdGltZW91dCA9IG1ldGEuZ2V0RGF0YUNhY2hlVGltZW91dCgpOworICAgICAgICBpZiAoc3ViY2xhc3NlcykgeworICAgICAgICAgICAgbWV0YXMgPSBtZXRhLmdldFBDU3ViY2xhc3NNZXRhRGF0YXMoKTsKKyAgICAgICAgICAgIGludCBzdWJUaW1lb3V0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtZXRhc1tpXS5nZXREYXRhQ2FjaGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHN1YlRpbWVvdXQgPSBtZXRhc1tpXS5nZXREYXRhQ2FjaGVUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN1YlRpbWVvdXQgIT0gLTEgJiYgc3ViVGltZW91dCA8IHRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzdWJUaW1lb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGVzdHMgYWxsIHBhc3NlZDsgY2FjaGVhYmxlCisgICAgICAgIFF1ZXJ5S2V5IGtleSA9IG5ldyBRdWVyeUtleSgpOworICAgICAgICBrZXkuX2NhbmRpZGF0ZUNsYXNzTmFtZSA9IGNhbmRpZGF0ZUNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAga2V5Ll9zdWJjbGFzc2VzID0gc3ViY2xhc3NlczsKKyAgICAgICAga2V5Ll9hY2Nlc3NQYXRoQ2xhc3NOYW1lcyA9IGFjY2Vzc1BhdGhDbGFzc05hbWVzOworICAgICAgICBrZXkuX3RpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICBrZXkuX3F1ZXJ5ID0gcS5nZXRRdWVyeVN0cmluZygpOworICAgICAgICBrZXkuX2lnbm9yZUNoYW5nZXMgPSBxLmdldElnbm9yZUNoYW5nZXMoKTsKKyAgICAgICAga2V5Ll9yYW5nZVN0YXJ0ID0gc3RhcnRJZHg7CisgICAgICAgIGtleS5fcmFuZ2VFbmQgPSBlbmRJZHg7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhbiBhcnJheSBvZiBhcmd1bWVudHMgaW50byB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIKKyAgICAgKiBtYXAsIGFuZCBkbyBhbnkgUEMgdG8gT0lEIGNvbnZlcnNpb24gbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2V0UGFyYW1zKFF1ZXJ5S2V5IGtleSwgUXVlcnlDb250ZXh0IHEsCisgICAgICAgIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbWFwIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycywgYW5kIGNvbnZlcnQgdGhlCisgICAgICAgIC8vIHBhcmFtZXRlciBsaXN0IGludG8gYSBtYXAsIHVzaW5nIHRoZSBxdWVyeSdzIHBhcmFtZXRlcgorICAgICAgICAvLyBkZWNsYXJhdGlvbiB0byBkZXRlcm1pbmUgb3JkZXJpbmcgZXRjLgorICAgICAgICBNYXAgdHlwZXMgPSBxLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgoaW50KSAodHlwZXMuc2l6ZSgpICogMS4zMyArIDEpKTsKKyAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpZHgrKykKKyAgICAgICAgICAgIG1hcC5wdXQoaXRlci5uZXh0KCksIGFyZ3NbaWR4XSk7CisgICAgICAgIHJldHVybiBzZXRQYXJhbXMoa2V5LCBxLmdldFN0b3JlQ29udGV4dCgpLCBtYXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgcGFyYW1ldGVycyB0byBhIGZvcm0gdGhhdCBpcyBjYWNoZWFibGUuIE11dGFibGUgcGFyYW1zCisgICAgICogd2lsbCBiZSBjbG9uZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXRQYXJhbXMoUXVlcnlLZXkga2V5LCBTdG9yZUNvbnRleHQgY3R4LAorICAgICAgICBNYXAgcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCB8fCBwYXJhbXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgTWFwLkVudHJ5IGU7CisgICAgICAgIE9iamVjdCB2OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJhbXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGUgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHYgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoSW1wbEhlbHBlci5pc01hbmFnZWFibGUodikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWN0eC5pc1BlcnNpc3RlbnQodikgfHwgY3R4LmlzTmV3KHYpIHx8IGN0eC5pc0RlbGV0ZWQodikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBlLnNldFZhbHVlKGN0eC5nZXRPYmplY3RJZCh2KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSB2OworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29udGVudHNBcmVEYXRlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChjLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjb2xsZWN0aW9uIGlzIGhvbW9nZW5lb3VzCisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gYy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEltcGxIZWxwZXIuaXNNYW5hZ2VhYmxlKG8pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBjbDogMjcgSnVuIDIwMDQ6IGlmIHdlIGdyb3cgdGhpcyBsb2dpYyB0bworICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgb3RoZXIgbXV0YWJsZSB0eXBlcyB0aGF0IGFyZSBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vd24gdG8gYmUgY2xvbmVhYmxlLCB3ZSB3aWxsIGhhdmUgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljIHRvIGhhbmRsZSB0aGVtLiBUaGlzIGlzIGJlY2F1c2Ugd2UKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QganVzdCBjYXN0IHRvIENsb25lYWJsZSBhbmQgaW52b2tlCisgICAgICAgICAgICAgICAgICAgIC8vIGNsb25lKCksIGFzIGNsb25lKCkgaXMgYSBwcm90ZWN0ZWQgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIC8vIGluIE9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNBcmVEYXRlcyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbm90IGEga25vd24gaW1tdXRhYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUsIG9yIGlmIGl0IGNvbnRhaW5zIG11dGFibGUgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAvLyBjbG9uZSBpdCBmb3IgZ29vZCBtZWFzdXJlLgorICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHNBcmVEYXRlcyB8fCAhc191bm1vZC5jb250YWlucyhjLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSBjb2xsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFNvcnRlZFNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBTZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IG5ldyBBcnJheUxpc3QoYy5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHNBcmVEYXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgZ28gdGhyb3VnaCBieSBoYW5kIGFuZCBkbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5LCBzaW5jZSBEYXRlIGlzIG11dGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIyID0gYy5pdGVyYXRvcigpOyBpdHIyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkuYWRkKCgoRGF0ZSkgaXRyMi5uZXh0KCkpLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5hZGRBbGwoYyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoY29weSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKQorICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoKChEYXRlKSB2KS5jbG9uZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGtleS5fcGFyYW1zID0gcGFyYW1zOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWJsaWMgY29uc3RydWN0b3IgZm9yIGV4dGVybmFsaXphdGlvbiBvbmx5LgorICAgICAqLworICAgIHB1YmxpYyBRdWVyeUtleSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENhbmRpZGF0ZVR5cGVOYW1lKCkgeworICAgICAgICByZXR1cm4gX2NhbmRpZGF0ZUNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiB0aW1lIHRoaXMga2V5IGlzIGdvb2QgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIF90aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbW9kaWZpY2F0aW9ucyB0byBhbnkgb2YgdGhlCisgICAgICogY2xhc3NlcyBpbiA8Y29kZT5jaGFuZ2VkPC9jb2RlPiByZXN1bHRzIGluIGEgcG9zc2libGUKKyAgICAgKiBpbnZhbGlkYXRpb24gb2YgdGhpcyBxdWVyeTsgb3RoZXJ3aXNlIHJldHVybnMKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uIEludmFsaWRhdGlvbiBpcyBwb3NzaWJsZSBpZiBvbmUgb3IgbW9yZSBvZgorICAgICAqIHRoZSBjbGFzc2VzIGluIHRoaXMgcXVlcnkga2V5J3MgYWNjZXNzIHBhdGggaGFzIGJlZW4gY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGFuZ2VJbnZhbGlkYXRlc1F1ZXJ5KENvbGxlY3Rpb24gY2hhbmdlZCkgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0cyhfYWNjZXNzUGF0aENsYXNzTmFtZXMsIGNoYW5nZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGdpdmVuIHNldCBvZiBsZWFzdC1kZXJpdmVkIGNsYXNzIG5hbWVzIGludGVyc2VjdHMgd2l0aAorICAgICAqIHRoZSBnaXZlbiBzZXQgb2YgY2hhbmdlZCBjbGFzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW50ZXJzZWN0cyhDb2xsZWN0aW9uIG5hbWVzLCBDb2xsZWN0aW9uIGNoYW5nZWQpIHsKKyAgICAgICAgQ2xhc3MgY2xzOworICAgICAgICBDbGFzcyBzdXA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjbHMgPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgd2hpbGUgKChzdXAgPSBQQ1JlZ2lzdHJ5LmdldFBlcnNpc3RlbnRTdXBlcmNsYXNzKGNscykpICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xzID0gc3VwOworICAgICAgICAgICAgaWYgKG5hbWVzLmNvbnRhaW5zKGNscy5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgZXF1YWxpdHkgYmFzZWQgb24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIEtleXMKKyAgICAgKiBjcmVhdGVkIGZvciBxdWVyaWVzIHRoYXQgc3BlY2lmeSBhIGNhbmRpZGF0ZSBjb2xsZWN0aW9uIGFyZQorICAgICAqIGFsd2F5cyBub3QgZXF1YWwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYikgeworICAgICAgICBpZiAodGhpcyA9PSBvYikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2IgPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG9iLmdldENsYXNzKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUXVlcnlLZXkgb3RoZXIgPSAoUXVlcnlLZXkpIG9iOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuZXF1YWxzKF9jYW5kaWRhdGVDbGFzc05hbWUsCisgICAgICAgICAgICBvdGhlci5fY2FuZGlkYXRlQ2xhc3NOYW1lKQorICAgICAgICAgICAgJiYgX3N1YmNsYXNzZXMgPT0gb3RoZXIuX3N1YmNsYXNzZXMKKyAgICAgICAgICAgICYmIF9pZ25vcmVDaGFuZ2VzID09IG90aGVyLl9pZ25vcmVDaGFuZ2VzCisgICAgICAgICAgICAmJiBfcmFuZ2VTdGFydCA9PSBvdGhlci5fcmFuZ2VTdGFydAorICAgICAgICAgICAgJiYgX3JhbmdlRW5kID09IG90aGVyLl9yYW5nZUVuZAorICAgICAgICAgICAgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKF9xdWVyeSwgb3RoZXIuX3F1ZXJ5KQorICAgICAgICAgICAgJiYgT2JqZWN0VXRpbHMuZXF1YWxzKF9wYXJhbXMsIG90aGVyLl9wYXJhbXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZSBhIGhhc2hpbmcgYWxnb3JpdGhtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHtAbGluayAjZXF1YWxzfQorICAgICAqIG1ldGhvZCBkZWZpbmVkIGFib3ZlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBjb2RlID0gMzcgKiAxNyArIF9jYW5kaWRhdGVDbGFzc05hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgaWYgKF9xdWVyeSAhPSBudWxsKQorICAgICAgICAgICAgY29kZSA9IDM3ICogY29kZSArIF9xdWVyeS5oYXNoQ29kZSgpOworICAgICAgICBpZiAoX3BhcmFtcyAhPSBudWxsKQorICAgICAgICAgICAgY29kZSA9IDM3ICogY29kZSArIF9wYXJhbXMuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU1KTsKKyAgICAgICAgYnVmLmFwcGVuZChzdXBlci50b1N0cmluZygpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiW3F1ZXJ5OlsiKS5hcHBlbmQoX3F1ZXJ5KS5hcHBlbmQoIl0iKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLGFjY2VzcyBwYXRoOiIpLmFwcGVuZChfYWNjZXNzUGF0aENsYXNzTmFtZXMpLgorICAgICAgICAgICAgYXBwZW5kKCIsc3ViczoiKS5hcHBlbmQoX3N1YmNsYXNzZXMpLgorICAgICAgICAgICAgYXBwZW5kKCIsaWdub3JlQ2hhbmdlczoiKS5hcHBlbmQoX2lnbm9yZUNoYW5nZXMpLgorICAgICAgICAgICAgYXBwZW5kKCIsc3RhcnRSYW5nZToiKS5hcHBlbmQoX3JhbmdlU3RhcnQpLgorICAgICAgICAgICAgYXBwZW5kKCIsZW5kUmFuZ2U6IikuYXBwZW5kKF9yYW5nZUVuZCkuCisgICAgICAgICAgICBhcHBlbmQoIix0aW1lb3V0OiIpLmFwcGVuZChfdGltZW91dCkuCisgICAgICAgICAgICBhcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gRXh0ZXJuYWxpemFibGUgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVPYmplY3QoX2NhbmRpZGF0ZUNsYXNzTmFtZSk7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4oX3N1YmNsYXNzZXMpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoX2FjY2Vzc1BhdGhDbGFzc05hbWVzKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KF9xdWVyeSk7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4oX2lnbm9yZUNoYW5nZXMpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoX3BhcmFtcyk7CisgICAgICAgIG91dC53cml0ZUxvbmcoX3JhbmdlU3RhcnQpOworICAgICAgICBvdXQud3JpdGVMb25nKF9yYW5nZUVuZCk7CisgICAgICAgIG91dC53cml0ZUludChfdGltZW91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBfY2FuZGlkYXRlQ2xhc3NOYW1lID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOworICAgICAgICBfc3ViY2xhc3NlcyA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIF9hY2Nlc3NQYXRoQ2xhc3NOYW1lcyA9IChTZXQpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgX3F1ZXJ5ID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOworICAgICAgICBfaWdub3JlQ2hhbmdlcyA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIF9wYXJhbXMgPSAoTWFwKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIF9yYW5nZVN0YXJ0ID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgX3JhbmdlRW5kID0gaW4ucmVhZExvbmcgKCk7CisJCV90aW1lb3V0ID0gaW4ucmVhZEludCAoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9RdWVyeVJlc3VsdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQ2MzA0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvUXVlcnlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIEEgcXVlcnkgcmVzdWx0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeVJlc3VsdAorICAgIGV4dGVuZHMgQXJyYXlMaXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgbG9uZyBfZXg7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGNvcnJlc3BvbmRpbmcgcXVlcnkga2V5IGFuZCByZXN1bHQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlSZXN1bHQoUXVlcnlLZXkga2V5LCBDb2xsZWN0aW9uIGRhdGEpIHsKKyAgICAgICAgc3VwZXIoZGF0YSk7CisKKyAgICAgICAgaWYgKGtleS5nZXRUaW1lb3V0KCkgPT0gLTEpCisgICAgICAgICAgICBfZXggPSAtMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2V4ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBrZXkuZ2V0VGltZW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRvIHNldCBpbnRlcm5hbCBkYXRhIGZyb20gYSBzZXJpYWxpemVyLgorICAgICAqLworICAgIHB1YmxpYyBRdWVyeVJlc3VsdChDb2xsZWN0aW9uIGRhdGEsIGxvbmcgZXgpIHsKKyAgICAgICAgc3VwZXIoZGF0YSk7CisgICAgICAgIF9leCA9IGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGlyYXRpb24gdGltZSwgb3IgLTEgZm9yIG5vIHRpbWVvdXQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VGltZW91dFRpbWUoKSB7CisgICAgICAgIHJldHVybiBfZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGRhdGEgaXMgdGltZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVGltZWRPdXQoKSB7CisgICAgICAgIHJldHVybiBfZXggIT0gLTEgJiYgX2V4IDwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvVHlwZXNDaGFuZ2VkRXZlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL1R5cGVzQ2hhbmdlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNjAxMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL1R5cGVzQ2hhbmdlZEV2ZW50LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisvKioKKyAqIEFuIGV2ZW50IGluZGljYXRpbmcgdGhhdCBpbnN0YW5jZXMgb2YgZ2l2ZW4gcGVyc2lzdGVudCB0eXBlcyBoYXZlCisgKiBiZWVuIG1vZGlmaWVkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlc0NoYW5nZWRFdmVudAorICAgIGV4dGVuZHMgRXZlbnRPYmplY3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIF90eXBlczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgZGF0YSBvciBxdWVyeSBjYWNoZQorICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgY2hhbmdlZCB0eXBlcworICAgICAqLworICAgIHB1YmxpYyBUeXBlc0NoYW5nZWRFdmVudChPYmplY3Qgc291cmNlLCBDb2xsZWN0aW9uIHR5cGVzKSB7CisgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgIF90eXBlcyA9IHR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhwaXJlZCB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIF90eXBlczsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9UeXBlc0NoYW5nZWRMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvVHlwZXNDaGFuZ2VkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA3ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvVHlwZXNDaGFuZ2VkTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU7CisKKy8qKgorICogQW4gZW50aXR5IHRoYXQgd2lzaGVzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdHlwZXMgY2hhbmdlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjAKKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlc0NoYW5nZWRMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBpbnN0YW5jZXMgb2YgcGVyc2lzdGVudCB0eXBlcyBoYXZlIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25UeXBlc0NoYW5nZWQoVHlwZXNDaGFuZ2VkRXZlbnQgZXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDFiYWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxodG1sPgorPGJvZHk+Cis8cD48c3Ryb25nPk9wZW5KUEEgRGF0YSBDYWNoZTwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgT3BlbkpQQSdzIGRhdGEgYW5kIHF1ZXJ5IGNhY2hpbmcgZnJhbWV3b3Jrcy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvQXV0b21hdGljTWFuYWdlZFJ1bnRpbWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvQXV0b21hdGljTWFuYWdlZFJ1bnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ4MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9BdXRvbWF0aWNNYW5hZ2VkUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lZTsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXI7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnZhbGlkU3RhdGVFeGNlcHRpb247DQorDQorLyoqDQorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNYW5hZ2VkUnVudGltZX0gaW50ZXJmYWNlIHRoYXQgc2VhcmNoZXMNCisgKiB0aHJvdWdoIGEgc2V0IG9mIGtub3duIEpOREkgbG9jYXRpb25zIGFuZCBtZXRob2QgaW52b2NhdGlvbnMgdG8gbG9jYXRlIHRoZQ0KKyAqIGFwcHJvcHJpYXRlIG1lY2hhbmlzbSBmb3Igb2J0YWluaW5nIGEgVHJhbnNhY3Rpb25NYW5hZ2VyLg0KKyAqICBCdWlsdCBpbiBzdXBwb3J0IGlzIHByb3ZpZGVkIGZvciB0aGUgZm9sbG93aW5nIEFwcGxpY2F0aW9uIFNlcnZlcnM6DQorICogPHVsPg0KKyAqIDxsaT5CbHVlc3RvbmU8L2xpPg0KKyAqIDxsaT5IUCBBcHBsaWNhdGlvbiBTZXJ2ZXI8L2xpPg0KKyAqIDxsaT5KQm9zczwvbGk+DQorICogPGxpPkpSdW48L2xpPg0KKyAqIDxsaT5PcGVuRUpCPC9saT4NCisgKiA8bGk+T3JhY2xlIEFwcGxpY2F0aW9uIFNlcnZlcjwvbGk+DQorICogPGxpPk9yaW9uPC9saT4NCisgKiA8bGk+U3VuT05FPC9saT4NCisgKiA8bGk+V2VibG9naWM8L2xpPg0KKyAqIDxsaT5XZWJzcGhlcmU8L2xpPg0KKyAqIDwvdWw+DQorICoNCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNNYW5hZ2VkUnVudGltZQ0KKyAgICBpbXBsZW1lbnRzIE1hbmFnZWRSdW50aW1lLCBDb25maWd1cmFibGUgew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gSk5ESV9MT0NTID0gbmV3IFN0cmluZyBbXXsNCisgICAgICAgICJqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXIiLCAvLyB3ZWJsb2dpYw0KKyAgICAgICAgImphdmE6L1RyYW5zYWN0aW9uTWFuYWdlciIsIC8vIGpib3NzICYganJ1bg0KKyAgICAgICAgImphdmE6L0RlZmF1bHREb21haW4vVHJhbnNhY3Rpb25NYW5hZ2VyIiwgLy8ganJ1biB0b28NCisgICAgICAgICJqYXZhOmNvbXAvcG0vVHJhbnNhY3Rpb25NYW5hZ2VyIiwgLy8gb3Jpb24gJiBvcmFjbGUNCisgICAgICAgICJqYXZhOmNvbXAvVHJhbnNhY3Rpb25NYW5hZ2VyIiwgLy8gZ2VuZXJpYw0KKyAgICAgICAgImphdmE6cG0vVHJhbnNhY3Rpb25NYW5hZ2VyIiwgLy8gYm9ybGFuZA0KKyAgICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gTUVUSE9EUyA9IG5ldyBTdHJpbmdbXXsNCisgICAgICAgICJjb20uYXJqdW5hLmp0YS5KVEFfVHJhbnNhY3Rpb25NYW5hZ2VyLnRyYW5zYWN0aW9uTWFuYWdlciIsIC8vIGhwDQorICAgICAgICAiY29tLmJsdWVzdG9uZS5qdGEuU2FUcmFuc2FjdGlvbk1hbmFnZXJGYWN0b3J5LlNhR2V0VHJhbnNhY3Rpb25NYW5hZ2VyIiwNCisgICAgICAgICJvcmcub3BlbmVqYi5PcGVuRUpCLmdldFRyYW5zYWN0aW9uTWFuYWdlciIsDQorICAgICAgICAiY29tLnN1bi5qdHMuanRhLlRyYW5zYWN0aW9uTWFuYWdlckltcGwuZ2V0VHJhbnNhY3Rpb25NYW5hZ2VySW1wbCIsDQorICAgICAgICAiY29tLmlucHJpc2UudmlzaXRyYW5zYWN0Lmp0YS5UcmFuc2FjdGlvbk1hbmFnZXJJbXBsLiINCisgICAgICAgICAgICArICJnZXRUcmFuc2FjdGlvbk1hbmFnZXJJbXBsIiwgLy8gYm9ybGFuZA0KKyAgICB9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXTFNNYW5hZ2VkUnVudGltZSBXTFM7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN1bk9uZU1hbmFnZWRSdW50aW1lIFNVTk9ORTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV0FTTWFuYWdlZFJ1bnRpbWUgV0FTOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlDQorICAgICAgICAoQXV0b21hdGljTWFuYWdlZFJ1bnRpbWUuY2xhc3MpOw0KKw0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgTWFuYWdlZFJ1bnRpbWUgbXIgPSBudWxsOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBtciA9IG5ldyBXTFNNYW5hZ2VkUnVudGltZSgpOw0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCisgICAgICAgIH0NCisgICAgICAgIFdMUyA9IChXTFNNYW5hZ2VkUnVudGltZSkgbXI7DQorDQorICAgICAgICBtciA9IG51bGw7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIG1yID0gbmV3IFN1bk9uZU1hbmFnZWRSdW50aW1lKCk7DQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgU1VOT05FID0gKFN1bk9uZU1hbmFnZWRSdW50aW1lKSBtcjsNCisNCisgICAgICAgIG1yID0gbnVsbDsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgbXIgPSBuZXcgV0FTTWFuYWdlZFJ1bnRpbWUoKTsNCisgICAgICAgIH0NCisgICAgICAgIGNhdGNoKFRocm93YWJsZSB0KSB7DQorICAgICAgICB9DQorICAgICAgICBXQVM9IChXQVNNYW5hZ2VkUnVudGltZSkgbXI7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIF9jb25mID0gbnVsbDsNCisgICAgcHJpdmF0ZSBNYW5hZ2VkUnVudGltZSBfcnVudGltZSA9IG51bGw7DQorDQorICAgIHB1YmxpYyBUcmFuc2FjdGlvbk1hbmFnZXIgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkNCisgICAgICAgIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKF9ydW50aW1lICE9IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIF9ydW50aW1lLmdldFRyYW5zYWN0aW9uTWFuYWdlcigpOw0KKw0KKyAgICAgICAgTGlzdCBlcnJvcnMgPSBuZXcgTGlua2VkTGlzdCgpOw0KKyAgICAgICAgVHJhbnNhY3Rpb25NYW5hZ2VyIHRtID0gbnVsbDsNCisNCisgICAgICAgIGlmIChXTFMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIHRtID0gV0xTLmdldFRyYW5zYWN0aW9uTWFuYWdlcigpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQorICAgICAgICAgICAgICAgIGVycm9ycy5hZGQodCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0bSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIF9ydW50aW1lID0gV0xTOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdG07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKFdBUyAhPSBudWxsKSB7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgV0FTLnNldENvbmZpZ3VyYXRpb24oX2NvbmYpOw0KKyAgICAgICAgICAgICAgICBXQVMuc3RhcnRDb25maWd1cmF0aW9uKCk7DQorICAgICAgICAgICAgICAgIFdBUy5lbmRDb25maWd1cmF0aW9uKCk7DQorICAgICAgICAgICAgICAgIHRtID0gV0FTLmdldFRyYW5zYWN0aW9uTWFuYWdlcigpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQorICAgICAgICAgICAgICAgIGVycm9ycy5hZGQodCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0bSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIF9ydW50aW1lID0gV0FTOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdG07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBqbmRpIHJ1bnRpbWUNCisgICAgICAgIEpORElNYW5hZ2VkUnVudGltZSBqbXIgPSBuZXcgSk5ESU1hbmFnZWRSdW50aW1lKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEpORElfTE9DUy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGptci5zZXRUcmFuc2FjdGlvbk1hbmFnZXJOYW1lKEpORElfTE9DU1tpXSk7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgdG0gPSBqbXIuZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCk7DQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHRtICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgX3J1bnRpbWUgPSBqbXI7DQorICAgICAgICAgICAgICAgIHJldHVybiB0bTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBsb29rIGZvciBhIG1ldGhvZCBydW50aW1lDQorICAgICAgICBJbnZvY2F0aW9uTWFuYWdlZFJ1bnRpbWUgaW1yID0gbmV3IEludm9jYXRpb25NYW5hZ2VkUnVudGltZSgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRVRIT0RTLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgaW1yLnNldENvbmZpZ3VyYXRpb24oX2NvbmYpOw0KKyAgICAgICAgICAgIGltci5zZXRUcmFuc2FjdGlvbk1hbmFnZXJNZXRob2QoTUVUSE9EU1tpXSk7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgdG0gPSBpbXIuZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCk7DQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHRtICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgX3J1bnRpbWUgPSBpbXI7DQorICAgICAgICAgICAgICAgIHJldHVybiB0bTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoU1VOT05FICE9IG51bGwpIHsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICB0bSA9IFNVTk9ORS5nZXRUcmFuc2FjdGlvbk1hbmFnZXIoKTsNCisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodG0gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBfcnVudGltZSA9IFNVTk9ORTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIFRocm93YWJsZVtdIHQgPSAoVGhyb3dhYmxlIFtdKSBlcnJvcnMudG9BcnJheSgNCisgICAgICAgICAgICBuZXcgVGhyb3dhYmxlIFtlcnJvcnMuc2l6ZSgpXSk7DQorICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ0bS1ub3QtZm91bmQiKSkuDQorICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSkuc2V0TmVzdGVkVGhyb3dhYmxlcyh0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgew0KKyAgICAgICAgX2NvbmYgPSBjb25mOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFJvbGxiYWNrT25seShUaHJvd2FibGUgY2F1c2UpDQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgcnVudGltZSBpcyBjYWNoZWQNCisgICAgICAgIGlmIChfcnVudGltZSA9PSBudWxsKQ0KKyAgICAgICAgICAgIGdldFRyYW5zYWN0aW9uTWFuYWdlcigpOw0KKw0KKyAgICAgICAgaWYgKF9ydW50aW1lICE9IG51bGwpDQorICAgICAgICAgICAgX3J1bnRpbWUuc2V0Um9sbGJhY2tPbmx5KGNhdXNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFJvbGxiYWNrQ2F1c2UoKQ0KKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHJ1bnRpbWUgaXMgY2FjaGVkDQorICAgICAgICBpZiAoX3J1bnRpbWUgPT0gbnVsbCkNCisgICAgICAgICAgICBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKTsNCisNCisgICAgICAgIGlmIChfcnVudGltZSAhPSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5nZXRSb2xsYmFja0NhdXNlKCk7DQorDQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL0ludm9jYXRpb25NYW5hZ2VkUnVudGltZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9JbnZvY2F0aW9uTWFuYWdlZFJ1bnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDQ0MzU4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9JbnZvY2F0aW9uTWFuYWdlZFJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWFuYWdlZFJ1bnRpbWV9IGludGVyZmFjZSB0aGF0IHVzZXMKKyAqIGEgc3RhdGljIG1ldGhvZCBjYWxsIHRvIGZpbmQgdGhlIFRyYW5zYWN0aW9uTWFuYWdlci4KKyAqICBGb3IgZXhhbXBsZSwgdG8gY29uZmlndXJlIGl0IHRvIHVzZSBJQk0gV2Vic3BoZXJlJ3MgVHJhbnNhY3Rpb25NYW5hZ2VyLAorICogdXNlIHRoZSBtZXRob2Q6PGJyIC8+CisgKiA8Y29kZT5jb20uaWJtLmVqcy5qdHMuanRhLkpUU1hBLmdldFRyYW5zYWN0aW9uTWFuYWdlcjwvY29kZT4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgSW52b2NhdGlvbk1hbmFnZWRSdW50aW1lCisgICAgaW1wbGVtZW50cyBNYW5hZ2VkUnVudGltZSwgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIF9tZXRob2ROYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfY2xhenogPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGhvZCBfbWV0aG9kID0gbnVsbDsKKyAgICBwcml2YXRlIE9wZW5KUEFDb25maWd1cmF0aW9uIF9jb25mID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWV0aG9kIHRvIGludm9rZSB0byBnZXQgdGhlIHtAbGluayBUcmFuc2FjdGlvbk1hbmFnZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gX21ldGhvZE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXRob2QgdG8gaW52b2tlIHRvIGdldCB0aGUge0BsaW5rIFRyYW5zYWN0aW9uTWFuYWdlcn0uCisgICAgICogIEUuZy46IGNvbS5pYm0uZWpzLmp0cy5qdGEuSlRTWEEuZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25NYW5hZ2VyTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIF9jbGF6eiA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIG1ldGhvZE5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgICAgIF9tZXRob2ROYW1lID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcobWV0aG9kTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7CisgICAgICAgIF9tZXRob2QgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBUcmFuc2FjdGlvbk1hbmFnZXIgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IF9jb25mLmdldENsYXNzUmVzb2x2ZXJJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKGdldENsYXNzKCksIG51bGwpOworICAgICAgICAgICAgX21ldGhvZCA9IENsYXNzLmZvck5hbWUoX2NsYXp6LCB0cnVlLCBsb2FkZXIpCisgICAgICAgICAgICAgICAgLmdldE1ldGhvZChfbWV0aG9kTmFtZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUcmFuc2FjdGlvbk1hbmFnZXIpIF9tZXRob2QuaW52b2tlKG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gKE9wZW5KUEFDb25maWd1cmF0aW9uKSBjb25mOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworCX0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGxiYWNrT25seShUaHJvd2FibGUgY2F1c2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0aGVyZSBpcyBubyBnZW5lcmljIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIHJvbGxiYWNrIGNhdXNlCisgICAgICAgIGdldFRyYW5zYWN0aW9uTWFuYWdlcigpLmdldFRyYW5zYWN0aW9uKCkuc2V0Um9sbGJhY2tPbmx5KCk7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRSb2xsYmFja0NhdXNlKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGdlbmVyaWMgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgcm9sbGJhY2sgY2F1c2UKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9KTkRJTWFuYWdlZFJ1bnRpbWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvSk5ESU1hbmFnZWRSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NzdlNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvSk5ESU1hbmFnZWRSdW50aW1lLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZWU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWFuYWdlZFJ1bnRpbWV9IGludGVyZmFjZSB0aGF0IHVzZXMgSk5ESSB0bworICogZmluZCB0aGUgVHJhbnNhY3Rpb25NYW5hZ2VyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBKTkRJTWFuYWdlZFJ1bnRpbWUKKyAgICBpbXBsZW1lbnRzIE1hbmFnZWRSdW50aW1lIHsKKworICAgIHByaXZhdGUgU3RyaW5nIF90bUxvYyA9ICJqYXZhOi9UcmFuc2FjdGlvbk1hbmFnZXIiOworICAgIHByaXZhdGUgVHJhbnNhY3Rpb25NYW5hZ2VyIF90bSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25NYW5hZ2VyfSBpbiBKTkRJLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF90bUxvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25NYW5hZ2VyfSBpbiBKTkRJLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uTWFuYWdlck5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX3RtTG9jID0gbmFtZTsKKyAgICAgICAgX3RtID0gbnVsbDsgIC8vIHJlc2V0IHRoZSBjYWNoZWQgVE0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBUcmFuc2FjdGlvbk1hbmFnZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFRyYW5zYWN0aW9uTWFuYWdlciBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoX3RtID09IG51bGwpIHsKKyAgICAgICAgICAgIENvbnRleHQgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF90bSA9IChUcmFuc2FjdGlvbk1hbmFnZXIpIGN0eC5sb29rdXAoX3RtTG9jKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY3R4LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF90bTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoVGhyb3dhYmxlIGNhdXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gZ2VuZXJpYyBzdXBwb3J0IGZvciBzZXR0aW5nIHRoZSByb2xsYmFjayBjYXVzZQorICAgICAgICBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKS5nZXRUcmFuc2FjdGlvbigpLnNldFJvbGxiYWNrT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9sbGJhY2tDYXVzZSgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0aGVyZSBpcyBubyBnZW5lcmljIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIHJvbGxiYWNrIGNhdXNlCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvTWFuYWdlZFJ1bnRpbWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvTWFuYWdlZFJ1bnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzllOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9NYW5hZ2VkUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmVlOworCitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgcGx1Z2lucyB0byBhcHBsaWNhdGlvbgorICogc2VydmVycyBpbiBvcmRlciB0byBpbnRlZ3JhdGUgdGhlIE9wZW5KUEEgcnVudGltZSBpbiBhIG1hbmFnZWQgZW52aXJvbm1lbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBNYW5hZ2VkUnVudGltZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFRyYW5zYWN0aW9uTWFuYWdlciBmb3IgdGhlIG1hbmFnZWQgcnVudGltZS4gVGhpcworICAgICAqIG1hbmFnZXIgaXMgdXNlZCB0byByZWdpc3RlciBzeW5jaHJvbml6YXRpb24gbGlzdGVuZXJzLCB0bworICAgICAqIG1hcCB0cmFuc2FjdGlvbmFsIFBlcnNpc3RlbmNlTWFuYWdlcnMgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sCisgICAgICogYW5kIHBvc3NpYmx5IHRvIGVubGlzdCBYQSByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIFRyYW5zYWN0aW9uTWFuYWdlciBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqIAorICAgICAqIFNldHMgdGhlIHJvbGxiYWNrIG9ubHkgZmxhZyBvbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gSWYgdGhlCisgICAgICogVHJhbnNhY3Rpb25NYW5hZ2VyIGlzIGNhcGFibGUgb2YgdHJhY2tpbmcgdGhlIGNhdXNlIG9mIHRoZQorICAgICAqIHJvbGxiYWNrLW9ubHkgZmxhZywgaXQgd2lsbCBhbHNvIHBhc3MgYWxvbmcgY2F1c2UgaW5mb3JtYXRpb24uCisgICAgICogIAorICAgICAqIEBwYXJhbSAgY2F1c2UgIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIHRyYW5zYWN0aW9uIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgbWFya2VkIGZvciByb2xsYmFjaywgb3IgbnVsbCBvZiBub25lIGlzIGtub3duCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sbGJhY2tPbmx5KFRocm93YWJsZSBjYXVzZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gYmUKKyAgICAgKiBtYXJrZWQgZm9yIHJvbGxiYWNrLCBwcm92aWRlZCB0aGF0IGFueSBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBUaHJvd2FibGUgY2F1c2UsIG9yIG51bGwgaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9sbGJhY2tDYXVzZSgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1N1bk9uZU1hbmFnZWRSdW50aW1lLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1N1bk9uZU1hbmFnZWRSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkYmQ4ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvU3VuT25lTWFuYWdlZFJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXI7CisKKy8qKgorICoge0BsaW5rIE1hbmFnZWRSdW50aW1lfSBpbXBsZW1lbnRhdGlvbiBmb3IgU3VuT05FLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK3B1YmxpYyBjbGFzcyBTdW5PbmVNYW5hZ2VkUnVudGltZQorICAgIGltcGxlbWVudHMgTWFuYWdlZFJ1bnRpbWUgeworCisgICAgcHJpdmF0ZSBNZXRob2QgX3N3aXRjaE1ldGg7CisgICAgcHJpdmF0ZSBNZXRob2QgX3R4TWFuYWdlck1ldGg7CisKKyAgICBwdWJsaWMgU3VuT25lTWFuYWdlZFJ1bnRpbWUoKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3Mgc3d0Y2ggPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLmVudGVycHJpc2UuU3dpdGNoIik7CisgICAgICAgIF9zd2l0Y2hNZXRoID0gc3d0Y2guZ2V0TWV0aG9kKCJnZXRTd2l0Y2giLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgIF90eE1hbmFnZXJNZXRoID0gc3d0Y2guZ2V0TWV0aG9kKCJnZXRUcmFuc2FjdGlvbk1hbmFnZXIiLAorICAgICAgICAgICAgKENsYXNzW10pIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBUcmFuc2FjdGlvbk1hbmFnZXIgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJldHVybiBTd2l0Y2guZ2V0U3dpdGNoICgpLmdldFRyYW5zYWN0aW9uTWFuYWdlciAoKTsKKyAgICAgICAgT2JqZWN0IHN3ID0gX3N3aXRjaE1ldGguaW52b2tlKG51bGwsIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgIHJldHVybiAoVHJhbnNhY3Rpb25NYW5hZ2VyKSBfdHhNYW5hZ2VyTWV0aC5pbnZva2Uoc3csIChPYmplY3RbXSkgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sbGJhY2tPbmx5KFRocm93YWJsZSBjYXVzZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGdlbmVyaWMgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgcm9sbGJhY2sgY2F1c2UKKyAgICAgICAgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkuZ2V0VHJhbnNhY3Rpb24oKS5zZXRSb2xsYmFja09ubHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFJvbGxiYWNrQ2F1c2UoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gZ2VuZXJpYyBzdXBwb3J0IGZvciBzZXR0aW5nIHRoZSByb2xsYmFjayBjYXVzZQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1dBU01hbmFnZWRSdW50aW1lLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1dBU01hbmFnZWRSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxYTNjZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvV0FTTWFuYWdlZFJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLkhldXJpc3RpY01peGVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLkhldXJpc3RpY1JvbGxiYWNrRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLkludmFsaWRUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uUm9sbGJhY2tFeGNlcHRpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uU3RhdHVzOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlN5bmNocm9uaXphdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5TeXN0ZW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24ueGEuWEFSZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk5vVHJhbnNhY3Rpb25FeGNlcHRpb247CisKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5Qcm9qZWN0OworCisvKioKKyAqIHtAbGluayBNYW5hZ2VkUnVudGltZX0gaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3Mgc3luY2hyb25pemF0aW9uIHdpdGggYQorICogV2ViU3BoZXJlIG1hbmFnZWQgdHJhbnNhY3Rpb24uCisgKgorICogPFA+CisgKiBXZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIGRvZXMgbm90IGV4cG9zZSB0aGUgVHJhbnNhY3Rpb25NYW5hZ2VyIHRvIGFuCisgKiBhcHBsaWNhdGlvbi4gSW5zdGVhZCBpdCBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGludGVyZmFjZSB0byByZWdpc3RlciBmb3IKKyAqIHN5bmNocm9uaXphdGlvbiBhbmQgb2J0YWluIHRyYW5zYWN0aW9uIGlkcy4KKyAqCisgKiA8UD4KKyAqIFdBU01hbmFnZWRSdW50aW1lIHByb3ZpZGVzIHRoZSB3cmFwcGVyIGNsYXNzZXMgbmVlZGVkIHRvIGludGVyYWN0IHdpdGggdGhlCisgKiBXQVMgcHJvcHJpZXRhcnkgaW50ZXJmYWNlIGFuZCB0aGUgT3BlbkpQQSBrZXJuZWwuCisgKgorICogQGF1dGhvciBNaWNoYWVsIERpY2ssIEtldmluIFN1dHRlcgorICovCitwdWJsaWMgY2xhc3MgV0FTTWFuYWdlZFJ1bnRpbWUgaW1wbGVtZW50cyBNYW5hZ2VkUnVudGltZSwgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsaXplciBfbG9jID0KKyAgICAgICAgTG9jYWxpemVyLmZvclBhY2thZ2UoV0FTTWFuYWdlZFJ1bnRpbWUuY2xhc3MpOworCisgICAgcHJpdmF0ZSBPYmplY3QgX2V4dGVuZGVkVHJhbnNhY3Rpb24gPSBudWxsOworICAgIHByaXZhdGUgTWV0aG9kIF9nZXRHbG9iYWxJZCA9IG51bGw7CisgICAgcHJpdmF0ZSBNZXRob2QgX3JlZ2lzdGVyU3luYyA9IG51bGw7CisgICAgcHJpdmF0ZSBPcGVuSlBBQ29uZmlndXJhdGlvbiBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSBMb2cgX2xvZyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGV4dGVuZGVkSlRBVHJhbnNhY3Rpb24gZnJvbSBKTkRJIGFuZCBjcmVhdGVzIGEgdHJhbnNhY3Rpb24KKyAgICAgKiB3cmFwcGVyCisgICAgICovCisgICAgcHVibGljIGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uTWFuYWdlciBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXQVNUcmFuc2FjdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zYWN0aW9uIHdyYXBwZXIgZm9yIFdlYlNwaGVyZS4gV2ViU3BoZXJlIGV4cG9zZXMgYSBzdWJzZXQgb2YgdGhlCisgICAgICogVHJhbnNhY3Rpb24gYW5kIFRyYW5zYWN0aW9uTWFuYWdlciBpbnRlcmZhY2VzIHRvIHRoZSBjdXN0b21lci4gQW55CisgICAgICogbWV0aG9kcyB3aGljaCBhcmUgbm90IGV4cG9zZWQgYnkgV2ViU3BoZXJlIHdpbGwgdGhyb3cgYW4KKyAgICAgKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdG8gdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIDxQPgorICAgICAqIE1ldGhvZHMgc3VwcG9ydGVkIGJ5IFdBUyBhcmUKKyAgICAgKiA8VUw+CisgICAgICogPExJPlJlZ2lzdGVyU3luY2hyb25pemF0aW9uIDwvTEk+CisgICAgICogPExJPkdldFN0YXR1czwvTEk+CisgICAgICogPC9VTD4KKyAgICAgKi8KKyAgICBjbGFzcyBXQVNUcmFuc2FjdGlvbiBpbXBsZW1lbnRzIGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uTWFuYWdlciwKKyAgICAgICAgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb24geworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgdGhyb3dzIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgcnZhbCA9IFN0YXR1cy5TVEFUVVNfVU5LTk9XTjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGdldEdsb2JhbElkKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBydmFsID0gU3RhdHVzLlNUQVRVU19BQ1RJVkU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnZhbCA9IFN0YXR1cy5TVEFUVVNfTk9fVFJBTlNBQ1RJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9UcmFuc2FjdGlvbkV4Y2VwdGlvbihfbG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJ3YXMtdHJhbnNhY3Rpb24taWQtZXhjZXB0aW9uIikpLnNldENhdXNlKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ2YWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZXMgYSBUcmFuc2FjdGlvbiB3cmFwcGVyLiBUaGUgdHJhbnNhY3Rpb24gd3JhcHBlciBtYXliIG9ubHkgYmUKKyAgICAgICAgICogdXNlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXR1cyBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gV2ViU3BoZXJlCisgICAgICAgICAqIGRvZXMgbm90IGFsbG93IGRpcmVjdCBjb250cm9sIG9mIGNvbnRhaW5lciB0cmFuc2FjdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQSBXZWJTcGhlcmUgdHJhbnNhY3Rpb24gd3JhcHBlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUcmFuc2FjdGlvbiBnZXRUcmFuc2FjdGlvbigpIHRocm93cyBTeXN0ZW1FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVnaXN0ZXIgZm9yIHN5bmNocm9uaXphdGlvbiB3aXRoIGEgV2ViU3BoZXJlIG1hbmFnZWQgdHJhbnNhY3Rpb24gdmlhCisgICAgICAgICAqIHRoZSBleHRlbmRlZEpUQVRyYW5zYWN0aW9uIGludGVyZmFjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU3luY2hyb25pemF0aW9uKFN5bmNocm9uaXphdGlvbiBhcmcwKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgUm9sbGJhY2tFeGNlcHRpb24sIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoX2V4dGVuZGVkVHJhbnNhY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIF9yZWdpc3RlclN5bmMuaW52b2tlKF9leHRlbmRlZFRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IFdBU1N5bmNocm9uaXphdGlvbihhcmcwKSB9KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoIndhcy1yZWZsZWN0aW9uLWV4Y2VwdGlvbiIpKS5zZXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIndhcy1sb29rdXAtZXJyb3IiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgR2xvYmFsVHJhbnNhY3Rpb24gSUQgb2YgdGhlIFdlYlNwaGVyZSBtYW5hZ2VkIHRyYW5zYWN0aW9uLgorICAgICAgICAgKiBJZiBubyBHbG9iYWwgVHJhbnNhY3Rpb24gaXMgYWN0aXZlIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBOdWxsIGlmIGEgZ2xvYmFsIHRyYW5zYWN0aW9uIGlzIG5vdCBhY3RpdmUgb3IgaWYgYW4gZXJyb3IKKyAgICAgICAgICogICAgICAgICBvY2N1cnMuIGJ5dGVbXSBpZCBpZiBhIGdsb2JhbCB0cmFuc2FjdGlvbiBpcyBhY3RpdmUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJ5dGVbXSBnZXRHbG9iYWxJZCgpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBydmFsID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcnZhbCA9IChieXRlW10pIF9nZXRHbG9iYWxJZC5pbnZva2UoX2V4dGVuZGVkVHJhbnNhY3Rpb24sIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MKKyAgICAgICAgICAgICAgICAgICAgLmdldCgid2FzLXJlZmxlY3Rpb24tZXhjZXB0aW9uIikpLnNldENhdXNlKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ2YWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5pbXBsZW1lbnRlZCwgV0FTIGRvZXMgbm90IHByb3ZpZGUgdGhpcyBsZXZlbCBvZiBjb250cm9sLiBUaHJvd3MgYW4KKyAgICAgICAgICogSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBiZWdpbigpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ3YXMtdW5zdXBwb3J0ZWQtb3AiLAorICAgICAgICAgICAgICAgICJiZWdpbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmltcGxlbWVudGVkLCBXQVMgZG9lcyBub3QgcHJvdmlkZSB0aGlzIGxldmVsIG9mIGNvbnRyb2wuIFRocm93cyBhbgorICAgICAgICAgKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBIZXVyaXN0aWNNaXhlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEhldXJpc3RpY1JvbGxiYWNrRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sCisgICAgICAgICAgICBSb2xsYmFja0V4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ3YXMtdW5zdXBwb3J0ZWQtb3AiLAorICAgICAgICAgICAgICAgICJjb21taXQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5pbXBsZW1lbnRlZCwgV0FTIGRvZXMgbm90IHByb3ZpZGUgdGhpcyBsZXZlbCBvZiBjb250cm9sLiBUaHJvd3MgYW4KKyAgICAgICAgICogSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZXN1bWUoVHJhbnNhY3Rpb24gYXJnMCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRUcmFuc2FjdGlvbkV4Y2VwdGlvbiwgU3lzdGVtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIndhcy11bnN1cHBvcnRlZC1vcCIsCisgICAgICAgICAgICAgICAgInJlc3VtZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmltcGxlbWVudGVkLCBXQVMgZG9lcyBub3QgcHJvdmlkZSB0aGlzIGxldmVsIG9mIGNvbnRyb2wuIExvZyBhCisgICAgICAgICAqIHRyYWNlIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiBSb2xsYmFjayBtYXkgYmUgdXNlZCBpbgorICAgICAgICAgKiBzb21lIGVycm9yIHBhdGhzLCB0aHJvd2luZyBhbm90aGVyIGV4Y2VwdGlvbiBtYXkgcmVzdWx0IGluIHRoZQorICAgICAgICAgKiBvcmlnaW5hbCBleGNlcHRpb24gYmVpbmcgbG9zdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sCisgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoIndhcy11bnN1cHBvcnRlZC1vcCIsICJyb2xsYmFjayIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmltcGxlbWVudGVkLCBXQVMgZG9lcyBub3QgcHJvdmlkZSB0aGlzIGxldmVsIG9mIGNvbnRyb2wuIExvZyBhCisgICAgICAgICAqIHRyYWNlIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiBTZXRSb2xsYmFja09ubHkgbWF5IGJlIHVzZWQKKyAgICAgICAgICogaW4gc29tZSBlcnJvciBwYXRocywgdGhyb3dpbmcgYW5vdGhlciBleGNlcHRpb24gbWF5IHJlc3VsdCBpbiB0aGUKKyAgICAgICAgICogb3JpZ2luYWwgZXhjZXB0aW9uIGJlaW5nIGxvc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgU3lzdGVtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJ3YXMtdW5zdXBwb3J0ZWQtb3AiLCAic2V0Um9sbGJhY2tPbmx5IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVuaW1wbGVtZW50ZWQsIFdBUyBkb2VzIG5vdCBwcm92aWRlIHRoaXMgbGV2ZWwgb2YgY29udHJvbC4gVGhyb3dzIGFuCisgICAgICAgICAqIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UaW1lb3V0KGludCBhcmcwKSB0aHJvd3MgU3lzdGVtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIndhcy11bnN1cHBvcnRlZC1vcCIsCisgICAgICAgICAgICAgICAgInNldFRyYW5zYWN0aW9uVGltZW91dCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmltcGxlbWVudGVkLCBXQVMgZG9lcyBub3QgcHJvdmlkZSB0aGlzIGxldmVsIG9mIGNvbnRyb2wuIFRocm93cyBhbgorICAgICAgICAgKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUcmFuc2FjdGlvbiBzdXNwZW5kKCkgdGhyb3dzIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ3YXMtdW5zdXBwb3J0ZWQtb3AiLAorICAgICAgICAgICAgICAgICJzdXNwZW5kIikpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVuaW1wbGVtZW50ZWQsIFdBUyBkb2VzIG5vdCBwcm92aWRlIHRoaXMgbGV2ZWwgb2YgY29udHJvbC4gVGhyb3dzIGFuCisgICAgICAgICAqIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGVsaXN0UmVzb3VyY2UoWEFSZXNvdXJjZSBhcmcwLCBpbnQgYXJnMSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ3YXMtdW5zdXBwb3J0ZWQtb3AiLAorICAgICAgICAgICAgICAgICJkZWxpc3RSZXNvdXJjZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmltcGxlbWVudGVkLCBXQVMgZG9lcyBub3QgcHJvdmlkZSB0aGlzIGxldmVsIG9mIGNvbnRyb2wuIFRocm93cyBhbgorICAgICAgICAgKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVubGlzdFJlc291cmNlKFhBUmVzb3VyY2UgYXJnMCkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFJvbGxiYWNrRXhjZXB0aW9uLCBTeXN0ZW1FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgid2FzLXVuc3VwcG9ydGVkLW9wIiwKKyAgICAgICAgICAgICAgICAiZW5saXN0UmVzb3VyY2UiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXQVNTeW5jaHJvbml6YXRpb24gd3JhcHBlci4gVGhpcyBjbGFzcyB0cmFuc2xhdGVzIHRoZSBXQVMgcHJvcHJpZXRhcnkKKyAgICAgKiBzeW5jaHJvbml6YXRpb24gY2FsbGJhY2sgbWV0aG9kcyB0byBqYXZheC50cmFuc2FjdGlvbi5TeW5jaHJvbml6YXRpb24KKyAgICAgKiBtZXRob2RzLgorICAgICAqCisgICAgICogPFA+CisgICAgICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZQorICAgICAqIGNvbS5pYm0ud2Vic3BoZXJlLmp0YWV4dGVuc2lvbnMuU3luY2hyb25pemF0aW9uQ2FsbGJhY2sgaW50ZXJmYWNlLiBTaW5jZQorICAgICAqIFN5bmNocm9uaXphdGlvbkNhbGxiYWNrIGlzIG5vdCBhdmFpbGFibGUgYXQgY29tcGlsZSB0aW1lIHdlIHVzZSBTZXJwIHRvCisgICAgICogYWRkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIGFmdGVyIGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBjb21waWxlZC4KKyAgICAgKgorICAgICAqIDxQPgorICAgICAqIFN5bmNocm9uaXphdGlvbkNhbGxiYWNrIGlzIGV4cGVjdGVkIHRvIGJlIGF2YWlsYWJsZSB3aGVuZXZlciB0aGlzIGNsYXNzCisgICAgICogaXMgaW5zdGFudGlhdGVkLCB0aGVyZWZvcmUgdGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gcnVubmluZyBpbgorICAgICAqIFdlYlNwaGVyZS4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuV0FTVHJhbnNmb3JtZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgV0FTU3luY2hyb25pemF0aW9uIHsKKworICAgICAgICBTeW5jaHJvbml6YXRpb24gX3N5bmMgPSBudWxsOworCisgICAgICAgIFdBU1N5bmNocm9uaXphdGlvbihTeW5jaHJvbml6YXRpb24gc3luYykgeworICAgICAgICAgICAgX3N5bmMgPSBzeW5jOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFmdGVyQ29tcGxldGlvbiB3cmFwcGVyLiBUcmFuc2xhdGVzIHRoZSBXQVMgcHJvcHJpZXRhcnkgY2FsbCB0byBhCisgICAgICAgICAqIGphdmF4LnRyYW5zYWN0aW9uLlN5bmNocm9uaXphdGlvbiBjYWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21wbGV0aW9uKGludCBsb2NhbFRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBieXRlW10gZ2xvYmFsVHJhbnNhY3Rpb25JZCwgYm9vbGVhbiBjb21taXR0ZWQpIHsKKyAgICAgICAgICAgIGlmIChfc3luYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1pdHRlZCkgeworICAgICAgICAgICAgICAgICAgICBfc3luYy5hZnRlckNvbXBsZXRpb24oU3RhdHVzLlNUQVRVU19DT01NSVRURUQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9zeW5jLmFmdGVyQ29tcGxldGlvbihTdGF0dXMuU1RBVFVTX1VOS05PV04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCZWZvcmVDb21wbGV0aW9uIHdyYXBwZXIuIFRyYW5zbGF0ZXMgV0FTIHByb3ByaWV0YXJ5IGNhbGwgdG8gYQorICAgICAgICAgKiBqYXZheC50cmFuc2FjdGlvbi5TeW5jaHJvbml6YXRpb24gY2FsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbXBsZXRpb24oaW50IGFyZzAsIGJ5dGVbXSBhcmcxKSB7CisgICAgICAgICAgICBpZiAoX3N5bmMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9zeW5jLmJlZm9yZUNvbXBsZXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hlcyBhIGNvcHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gb2J0YWluCisgICAgICogdGhlIGxvZ2dlciBhbmQgY2xhc3Nsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgX2NvbmYgPSAoT3BlbkpQQUNvbmZpZ3VyYXRpb24pIGNvbmY7CisgICAgICAgIF9sb2cgPSBfY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZENvbmZpZ3VyYXRpb24gc3R1Yi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX2V4dGVuZGVkVHJhbnNhY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICBjdHgubG9va3VwKCJqYXZhOmNvbXAvd2Vic3BoZXJlL0V4dGVuZGVkSlRBVHJhbnNhY3Rpb24iKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY3R4LmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IF9jb25mLmdldENsYXNzUmVzb2x2ZXJJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKGdldENsYXNzKCksIG51bGwpOworCisgICAgICAgICAgICBDbGFzcyBleHRlbmRlZEpUQVRyYW5zYWN0aW9uID0gQ2xhc3MuZm9yTmFtZSgKKyAgICAgICAgICAgICAgICAiY29tLmlibS53ZWJzcGhlcmUuanRhZXh0ZW5zaW9ucy5FeHRlbmRlZEpUQVRyYW5zYWN0aW9uIiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBsb2FkZXIpOworCisgICAgICAgICAgICBfcmVnaXN0ZXJTeW5jID0gZXh0ZW5kZWRKVEFUcmFuc2FjdGlvbi5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgInJlZ2lzdGVyU3luY2hyb25pemF0aW9uQ2FsbGJhY2tGb3JDdXJyZW50VHJhbiIsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDbGFzcy5mb3JOYW1lKAorICAgICAgICAgICAgICAgICAgICAiY29tLmlibS53ZWJzcGhlcmUuanRhZXh0ZW5zaW9ucy5TeW5jaHJvbml6YXRpb25DYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgIHRydWUsIGxvYWRlcikgfSk7CisgICAgICAgICAgICBfZ2V0R2xvYmFsSWQgPSBleHRlbmRlZEpUQVRyYW5zYWN0aW9uLgorICAgICAgICAgICAgICAgIGdldE1ldGhvZCgiZ2V0R2xvYmFsSWQiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYworICAgICAgICAgICAgICAgIC5nZXQoIndhcy1yZWZsZWN0aW9uLWV4Y2VwdGlvbiIpLCBlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0Q29uZmlndXJhdGlvbiBzdHViLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzIHRoYXQgd2lsbCBiZSBtb2RpZmllZAorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPQorICAgICAgICAib3JnLmFwYWNoZS5vcGVuanBhLmVlLldBU01hbmFnZWRSdW50aW1lJFdBU1N5bmNocm9uaXphdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2Ugd2hpY2ggd2lsbCBiZSBhZGRlZAorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJGQUNFID0KKyAgICAgICAgImNvbS5pYm0ud2Vic3BoZXJlLmp0YWV4dGVuc2lvbnMuU3luY2hyb25pemF0aW9uQ2FsbGJhY2siOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgCisgICAgICAgIElucHV0U3RyZWFtIGluID0gV0FTTWFuYWdlZFJ1bnRpbWUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oQ0xBU1MucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIik7CisgICAgICAgIEJDQ2xhc3MgYmNDbGFzcyA9IHByb2plY3QubG9hZENsYXNzKGluKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBbXSBpbnRlcmZhY2VzID0gYmNDbGFzcy5nZXRJbnRlcmZhY2VOYW1lcygpOworICAgICAgICAKKyAgICAgICAgaWYoaW50ZXJmYWNlcyAhPSBudWxsKSB7CisgICAgICAgIAlmb3IoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeyAKKyAgICAgICAgCQlpZihpbnRlcmZhY2VzW2ldLmVxdWFscyhJTlRFUkZBQ0UpKSB7CisgICAgICAgIAkJCXJldHVybjsgCisgICAgICAgIAkJfQorICAgICAgICAJfQorICAgICAgICB9CisgICAgICAgIGJjQ2xhc3MuZGVjbGFyZUludGVyZmFjZShJTlRFUkZBQ0UpOworICAgICAgICBiY0NsYXNzLndyaXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sbGJhY2tPbmx5KFRocm93YWJsZSBjYXVzZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGdlbmVyaWMgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgcm9sbGJhY2sgY2F1c2UKKyAgICAgICAgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkuZ2V0VHJhbnNhY3Rpb24oKS5zZXRSb2xsYmFja09ubHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFJvbGxiYWNrQ2F1c2UoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gZ2VuZXJpYyBzdXBwb3J0IGZvciBzZXR0aW5nIHRoZSByb2xsYmFjayBjYXVzZQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1dMU01hbmFnZWRSdW50aW1lLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1dMU01hbmFnZWRSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViNDM1OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvV0xTTWFuYWdlZFJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXI7CisKKy8qKgorICoge0BsaW5rIE1hbmFnZWRSdW50aW1lfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGRpcmVjdGx5IGFjY2Vzc2VzIHRoZQorICogdHJhbnNhY3Rpb24gbWFuYWdlciB2aWEgV2ViTG9naWMgU2VydmVyIGhlbHBlciBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgQXJ1bmFiaCBIYXphcmlrYSwgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBjbGFzcyBXTFNNYW5hZ2VkUnVudGltZQorICAgIGltcGxlbWVudHMgTWFuYWdlZFJ1bnRpbWUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgX3R4SGVscGVyTWV0aDsKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBfdHhNYW5hZ2VyTWV0aDsKKworICAgIHB1YmxpYyBXTFNNYW5hZ2VkUnVudGltZSgpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBDbGFzcyB0eEhlbHBlciA9IENsYXNzLmZvck5hbWUKKyAgICAgICAgICAgICgid2VibG9naWMudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25IZWxwZXIiKTsKKyAgICAgICAgX3R4SGVscGVyTWV0aCA9IHR4SGVscGVyLmdldE1ldGhvZCgiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCBudWxsKTsKKyAgICAgICAgX3R4TWFuYWdlck1ldGggPSB0eEhlbHBlci5nZXRNZXRob2QoImdldFRyYW5zYWN0aW9uTWFuYWdlciIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBUcmFuc2FjdGlvbk1hbmFnZXIgZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJldHVybiBUcmFuc2FjdGlvbkhlbHBlci5nZXRUcmFuc2FjdGlvbkhlbHBlciAoKS4KKyAgICAgICAgLy8JZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyICgpOworICAgICAgICBPYmplY3QgbyA9IF90eEhlbHBlck1ldGguaW52b2tlKG51bGwsIG51bGwpOworICAgICAgICByZXR1cm4gKFRyYW5zYWN0aW9uTWFuYWdlcikgX3R4TWFuYWdlck1ldGguaW52b2tlKG8sIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGxiYWNrT25seShUaHJvd2FibGUgY2F1c2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uTWFuYWdlcigpLmdldFRyYW5zYWN0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB0cnkgdG8gdXNlIHJlZmxlY3Rpb24gdG8gY2FsbCB0aGUgc2V0Um9sbGJhY2tPbmx5KFRocm93YWJsZSkKKyAgICAgICAgICAgIC8vIG1ldGhvZCBpbiB3ZWJsb2dpYy50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbgorICAgICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0Q2xhc3MoKS4KKyAgICAgICAgICAgICAgICBnZXRNZXRob2QoInNldFJvbGxiYWNrT25seSIsIG5ldyBDbGFzc1tdIHsgVGhyb3dhYmxlLmNsYXNzIH0pLgorICAgICAgICAgICAgICAgICAgICBpbnZva2UodHJhbnNhY3Rpb24sIG5ldyBPYmplY3RbXSB7IGNhdXNlIH0pOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgLy8gc29tZSBwcm9ibGVtIG9jY3VycmVkOiBmYWxsIGJhY2sgdG8gdGhlIHRyYWRpdGlvbmFsIGNhbGwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldFJvbGxiYWNrT25seSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRSb2xsYmFja0NhdXNlKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkuZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRyeSB0byB1c2UgcmVmbGVjdGlvbiB0byBjYWxsIHRoZSBnZXRSb2xsYmFja1JlYXNvbigpCisgICAgICAgICAgICAvLyBtZXRob2QgaW4gd2VibG9naWMudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb24KKyAgICAgICAgICAgIHJldHVybiAoVGhyb3dhYmxlKSB0cmFuc2FjdGlvbi5nZXRDbGFzcygpLgorICAgICAgICAgICAgICAgIGdldE1ldGhvZCgiZ2V0Um9sbGJhY2tSZWFzb24iLCBuZXcgQ2xhc3NbMF0pLgorICAgICAgICAgICAgICAgICAgICBpbnZva2UodHJhbnNhY3Rpb24sIG5ldyBPYmplY3RbMF0pOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgLy8gc29tZSBwcm9ibGVtIG9jY3VycmVkOiBqdXN0IHJldHVybiBudWxsCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2MjIyNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBIEVudGVycHJpc2UgRXh0ZW5zaW9uczwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGVudGVycHJpc2UgZXh0ZW5zaW9ucyB0byB0aGUgT3BlbkpQQSBydW50aW1lLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0FwcGxpY2F0aW9uSWRUb29sLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvQXBwbGljYXRpb25JZFRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc0Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0FwcGxpY2F0aW9uSWRUb29sLmphdmEKQEAgLTAsMCArMSwxNDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuQ2xhc3NBcmdQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNvZGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5KYXZhVmVyc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkRlbGVnYXRpbmdNZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnZhbGlkU3RhdGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0NsYXNzTG9hZGVyOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuUHJvamVjdDsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdXNlIGFzIGFuIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25JZFRvb2wgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fREVGQVVMVCA9ICI6OiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5JWkVSX0NVU1RPTSA9ICJUb2tlbml6ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTklaRVJfU1REID0gIlN0cmluZ1Rva2VuaXplciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBcHBsaWNhdGlvbklkVG9vbC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIExvZyBfbG9nOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgX3R5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01ldGFEYXRhIF9tZXRhOworICAgIHByaXZhdGUgYm9vbGVhbiBfYWJzdHJhY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIEZpZWxkTWV0YURhdGFbXSBfZmllbGRzID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lnbm9yZSA9IHRydWU7CisgICAgcHJpdmF0ZSBGaWxlIF9kaXIgPSBudWxsOworICAgIHByaXZhdGUgV3JpdGVyIF93cml0ZXIgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9jb2RlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfdG9rZW4gPSBUT0tFTl9ERUZBVUxUOworICAgIHByaXZhdGUgQ29kZUZvcm1hdCBfZm9ybWF0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQXBwbGljYXRpb25JZFRvb2wgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIGFuCisgICAgICogb2JqZWN0IGlkIGNsYXNzIGZvciA8Y29kZT50eXBlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25JZFRvb2woT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiwgQ2xhc3MgdHlwZSkgeworICAgICAgICBfbG9nID0gY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX0VOSEFOQ0UpOworICAgICAgICBfdHlwZSA9IHR5cGU7CisKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gY29uZi5uZXdNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICByZXBvcy5zZXRWYWxpZGF0ZShyZXBvcy5WQUxJREFURV9OT05FKTsKKyAgICAgICAgcmVwb3Muc2V0U291cmNlTW9kZShyZXBvcy5NT0RFX01BUFBJTkcsIGZhbHNlKTsKKyAgICAgICAgbG9hZE9iamVjdElkcyhyZXBvcywgdHJ1ZSk7CisgICAgICAgIF9tZXRhID0gcmVwb3MuZ2V0TWV0YURhdGEodHlwZSwgbnVsbCwgZmFsc2UpOworICAgICAgICBpZiAoX21ldGEgIT0gbnVsbCkgeworICAgICAgICAgICAgX2Fic3RyYWN0ID0gTW9kaWZpZXIuaXNBYnN0cmFjdChfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkuCisgICAgICAgICAgICAgICAgZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICAgICAgX2ZpZWxkcyA9IGdldERlY2xhcmVkUHJpbWFyeUtleUZpZWxkcyhfbWV0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRvb2wgaW5zdGFuY2UgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIGFuCisgICAgICogb2JqZWN0IGlkIGNsYXNzIGZvciA8Y29kZT5tZXRhPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25JZFRvb2woT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiwgQ2xhc3MgdHlwZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfRU5IQU5DRSk7CisKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgICAgIGlmIChfbWV0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBfYWJzdHJhY3QgPSBNb2RpZmllci5pc0Fic3RyYWN0KF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKS4KKyAgICAgICAgICAgICAgICBnZXRNb2RpZmllcnMoKSk7CisgICAgICAgICAgICBfZmllbGRzID0gZ2V0RGVjbGFyZWRQcmltYXJ5S2V5RmllbGRzKF9tZXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBtZXRhZGF0YSBmb3IgcHJpbWFyeSBrZXkgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBGaWVsZE1ldGFEYXRhW10gZ2V0RGVjbGFyZWRQcmltYXJ5S2V5RmllbGRzCisgICAgICAgIChDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEuZ2V0UENTdXBlcmNsYXNzKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBtZXRhLmdldFByaW1hcnlLZXlGaWVsZHMoKTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHByaW1hcnkga2V5IGZpZWxkcyB0aGF0IGFyZSBub3QgZGVjbGFyZWQKKyAgICAgICAgLy8gaW4gdGhlIGN1cnJlbnQgY2xhc3MKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IG1ldGEuZ2V0UHJpbWFyeUtleUZpZWxkcygpOworICAgICAgICBMaXN0IGRlY3MgPSBuZXcgQXJyYXlMaXN0KGZpZWxkcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0RGVjbGFyaW5nVHlwZSgpID09IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKQorICAgICAgICAgICAgICAgIGRlY3MuYWRkKGZpZWxkc1tpXSk7CisgICAgICAgIHJldHVybiAoRmllbGRNZXRhRGF0YVtdKSBkZWNzLnRvQXJyYXkobmV3IEZpZWxkTWV0YURhdGFbZGVjcy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhpcyB0b29sIGlzIGNvbmZpZ3VyZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9uCisgICAgICogYW4gYXR0ZW1wdCB0byBnZW5lcmF0ZSBhbiBpZCBjbGFzcyBmb3IgYSB0eXBlIHRoYXQgZG9lcyBub3QgdXNlCisgICAgICogYXBwbGljYXRpb24gaWRlbnRpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlRXJyb3JzKCkgeworICAgICAgICByZXR1cm4gX2lnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gZmFsc2UgaWYgdGhpcyB0b29sIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gb24KKyAgICAgKiBhbiBhdHRlbXB0IHRvIGdlbmVyYXRlIGFuIGlkIGNsYXNzIGZvciBhIHR5cGUgdGhhdCBkb2VzIG5vdCB1c2UKKyAgICAgKiBhcHBsaWNhdGlvbiBpZGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgX2lnbm9yZSA9IGlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29kZSBmb3JtYXR0ZXIgZm9yIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IGdldENvZGVGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBfZm9ybWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29kZSBmb3JtYXR0ZXIgZm9yIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvZGVGb3JtYXQoQ29kZUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHNvdXJjZSB0by4gRGVmYXVsdHMgdG8gdGhlIGRpcmVjdG9yeQorICAgICAqIG9mIHRoZSBKYXZhIGZpbGUgZm9yIHRoZSBzZXQgdHlwZS4gSWYgdGhlIGdpdmVuIGRpcmVjdG9yeSBkb2VzIG5vdAorICAgICAqIG1hdGNoIHRoZSBwYWNrYWdlIG9mIHRoZSBvYmplY3QgaWQsIHRoZSBwYWNrYWdlIHN0cnVjdHVyZSB3aWxsIGJlCisgICAgICogY3JlYXRlZCBiZWxvdyB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIF9kaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSB0byB3cml0ZSBzb3VyY2UgdG8uIERlZmF1bHRzIHRvIHRoZSBkaXJlY3RvcnkKKyAgICAgKiBvZiB0aGUgSmF2YSBmaWxlIGZvciB0aGUgc2V0IHR5cGUuIElmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QKKyAgICAgKiBtYXRjaCB0aGUgcGFja2FnZSBvZiB0aGUgb2JqZWN0IGlkLCB0aGUgcGFja2FnZSBzdHJ1Y3R1cmUgd2lsbCBiZQorICAgICAqIGNyZWF0ZWQgYmVsb3cgdGhlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoRmlsZSBkaXIpIHsKKyAgICAgICAgX2RpciA9IGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdG9rZW4gdG8gdXNlIHRvIHNlcGFyYXRlIHN0cmluZ2lmaWVkIHByaW1hcnkga2V5IGZpZWxkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKCkgeworICAgICAgICByZXR1cm4gX3Rva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0b2tlbiB0byB1c2UgdG8gc2VwYXJhdGUgc3RyaW5naWZpZWQgcHJpbWFyeSBrZXkgZmllbGQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRva2VuKFN0cmluZyB0b2tlbikgeworICAgICAgICBfdG9rZW4gPSB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGVyIHRvIHdyaXRlIHNvdXJjZSB0bywgb3IgbnVsbCB0byB3cml0ZSB0byBkZWZhdWx0IGZpbGUuCisgICAgICovCisgICAgcHVibGljIFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiBfd3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZXIgdG8gd3JpdGUgc291cmNlIHRvLCBvciBudWxsIHRvIHdyaXRlIHRvIGRlZmF1bHQgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZXIoV3JpdGVyIHdyaXRlcikgeworICAgICAgICBfd3JpdGVyID0gd3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSB3ZSBhcmUgZ2VuZXJhdGluZyBhbiBhcHBsaWNhdGlvbiBpZCBmb3IuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbWV0YWRhdGEgZm9yIHRoZSB0eXBlIHdlIGFyZSBnZW5lcmF0aW5nIGFuIGFwcGxpY2F0aW9uIGlkIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBpZCwgb3IgbnVsbAorICAgICAqIGlmIGludmFsaWQgY2xhc3Mgb3IgdGhlIHtAbGluayAjcnVufSBtZXRob2QgaGFzIG5vdCBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvZGUoKSB7CisgICAgICAgIHJldHVybiBfY29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzIHNob3VsZCBiZSBhbiBpbm5lciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lubmVyQ2xhc3MoKSB7CisgICAgICAgIENsYXNzIG9pZENsYXNzID0gX21ldGEuZ2V0T2JqZWN0SWRUeXBlKCk7CisgICAgICAgIHJldHVybiBvaWRDbGFzcy5nZXROYW1lKCkuaW5kZXhPZignJCcpICE9IC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNob3J0IGNsYXNzIG5hbWUgZm9yIHRoZSBvYmplY3QgaWQgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICBpZiAoX21ldGEuaXNPcGVuSlBBSWRlbnRpdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBTb21lQ2xhc3MkSUQgdG8gSUQKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKF9tZXRhLmdldE9iamVjdElkVHlwZSgpKTsKKyAgICAgICAgaWYgKGlzSW5uZXJDbGFzcygpKQorICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKSArIDEpOworICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgc291cmNlY29kZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGlkIGNsYXNzOyByZXR1cm5zCisgICAgICogZmFsc2UgaWYgdGhlIGNsYXNzIGlzIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcnVuKCkgeworICAgICAgICBpZiAoX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoImFwcGlkLXN0YXJ0IiwgX3R5cGUpKTsKKworICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGlzIHR5cGUgaXMgYSBjYW5kaWRhdGUgZm9yIGFwcGxpY2F0aW9uIGlkZW50aXR5CisgICAgICAgIGlmIChfbWV0YSA9PSBudWxsCisgICAgICAgICAgICB8fCBfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSAhPSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OCisgICAgICAgICAgICB8fCBfbWV0YS5pc09wZW5KUEFJZGVudGl0eSgpKSB7CisgICAgICAgICAgICBpZiAoIV9pZ25vcmUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImFwcGlkLWludmFsaWQiLCBfdHlwZSkpOworCisgICAgICAgICAgICAvLyBlbHNlIGp1c3Qgd2FybgorICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiYXBwaWQtd2FybiIsIF90eXBlKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBDbGFzcyBvaWRDbGFzcyA9IF9tZXRhLmdldE9iamVjdElkVHlwZSgpOworICAgICAgICBDbGFzcyBzdXBlck9pZENsYXNzID0gbnVsbDsKKworICAgICAgICAvLyBhbGxvdyBkaWZmIG9pZCBjbGFzcyBpbiBzdWJjbGFzcyAoaG9yaXpvbnRhbCkKKyAgICAgICAgaWYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1cGVyT2lkQ2xhc3MgPSBfbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmdldE9iamVjdElkVHlwZSgpOworICAgICAgICAgICAgaWYgKG9pZENsYXNzID09IG51bGwgfHwgb2lkQ2xhc3MuZXF1YWxzKHN1cGVyT2lkQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgLy8ganVzdCB3YXJuCisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImFwcGlkLXdhcm4iLCBfdHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGVuc3VyZSB0aGF0IGFuIGlkIGNsYXNzIGlzIGRlY2xhcmVkCisgICAgICAgIGlmIChvaWRDbGFzcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWlkLWNsYXNzIiwgX3R5cGUpKS4KKyAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKworICAgICAgICAvLyBlbnN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBrIGZpZWxkIGlmIHdlIGFyZQorICAgICAgICAvLyBub24tYWJzcmFjdCwgYW5kIHNlZSBpZiB3ZSBoYXZlIGFueSBieXRlW10KKyAgICAgICAgYm9vbGVhbiBieXRlcyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgIWJ5dGVzICYmIGkgPCBfZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYnl0ZXMgPSBfZmllbGRzW2ldLmdldERlY2xhcmVkVHlwZSgpID09IGJ5dGVbXS5jbGFzczsKKworICAgICAgICAvLyBjb2xsZWN0IGluZm8gb24gaWQgdHlwZQorICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUob2lkQ2xhc3MpOworICAgICAgICBTdHJpbmcgcGFja2FnZURlYyA9ICIiOworICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgcGFja2FnZURlYyA9ICJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7IjsKKworICAgICAgICBTdHJpbmcgaW1wb3J0cyA9IGdldEltcG9ydHMoKTsKKyAgICAgICAgU3RyaW5nIGZpZWxkRGVjcyA9IGdldEZpZWxkRGVjbGFyYXRpb25zKCk7CisgICAgICAgIFN0cmluZyBjb25zdHJ1Y3RvciA9IGdldENvbnN0cnVjdG9yKHN1cGVyT2lkQ2xhc3MgIT0gbnVsbCk7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcygpOworICAgICAgICBTdHJpbmcgZnJvbVN0cmluZ0NvZGUgPSBnZXRGcm9tU3RyaW5nQ29kZShzdXBlck9pZENsYXNzICE9IG51bGwpOworICAgICAgICBTdHJpbmcgdG9TdHJpbmdDb2RlID0gZ2V0VG9TdHJpbmdDb2RlKHN1cGVyT2lkQ2xhc3MgIT0gbnVsbCk7CisgICAgICAgIFN0cmluZyBlcXVhbHNDb2RlID0gZ2V0RXF1YWxzQ29kZShzdXBlck9pZENsYXNzICE9IG51bGwpOworICAgICAgICBTdHJpbmcgaGFzaENvZGVDb2RlID0gZ2V0SGFzaENvZGVDb2RlKHN1cGVyT2lkQ2xhc3MgIT0gbnVsbCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGphdmEgY29kZQorICAgICAgICBDb2RlRm9ybWF0IGNvZGUgPSBuZXdDb2RlRm9ybWF0KCk7CisgICAgICAgIGlmICghaXNJbm5lckNsYXNzKCkgJiYgcGFja2FnZURlYy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb2RlLmFwcGVuZChwYWNrYWdlRGVjKS5hZnRlclNlY3Rpb24oKTsKKworICAgICAgICBpZiAoIWlzSW5uZXJDbGFzcygpICYmIGltcG9ydHMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgY29kZS5hcHBlbmQoaW1wb3J0cykuYWZ0ZXJTZWN0aW9uKCk7CisKKyAgICAgICAgY29kZS5hcHBlbmQoIi8qKiIpLmVuZGwoKS4KKyAgICAgICAgICAgIGFwcGVuZCgiICogIikuCisgICAgICAgICAgICBhcHBlbmQoX2xvYy5nZXQoImFwcGlkLWNvbW1lbnQtZm9yIiwgX3R5cGUuZ2V0TmFtZSgpKSkuCisgICAgICAgICAgICBlbmRsKCkuCisgICAgICAgICAgICBhcHBlbmQoIiAqIikuZW5kbCgpLgorICAgICAgICAgICAgYXBwZW5kKCIgKiAiKS5hcHBlbmQoX2xvYy5nZXQoImFwcGlkLWNvbW1lbnQtZ2VuIikpLmVuZGwoKS4KKyAgICAgICAgICAgIGFwcGVuZCgiICogIikuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKS5lbmRsKCkuCisgICAgICAgICAgICBhcHBlbmQoIiAqLyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS5hcHBlbmQoInB1YmxpYyAiKTsKKyAgICAgICAgaWYgKGlzSW5uZXJDbGFzcygpKQorICAgICAgICAgICAgY29kZS5hcHBlbmQoInN0YXRpYyAiKTsKKyAgICAgICAgY29kZS5hcHBlbmQoImNsYXNzICIpLmFwcGVuZChjbGFzc05hbWUpOworICAgICAgICBpZiAoY29kZS5nZXRCcmFjZU9uU2FtZUxpbmUoKSkKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIgIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvZGUuZW5kbCgpLnRhYigpOworCisgICAgICAgIGlmIChzdXBlck9pZENsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJleHRlbmRzICIgKyBTdHJpbmdzLmdldENsYXNzTmFtZShzdXBlck9pZENsYXNzKSk7CisgICAgICAgICAgICBpZiAoY29kZS5nZXRCcmFjZU9uU2FtZUxpbmUoKSkKKyAgICAgICAgICAgICAgICBjb2RlLmFwcGVuZCgiICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvZGUuZW5kbCgpLnRhYigpOworICAgICAgICB9CisgICAgICAgIGNvZGUuYXBwZW5kKCJpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSIpLm9wZW5CcmFjZSgxKS5lbmRsKCk7CisKKyAgICAgICAgLy8gaWYgd2UgdXNlIGEgYnl0ZSBhcnJheSB3ZSBuZWVkIGEgc3RhdGljIGFycmF5IGZvciBlbmNvZGluZyB0byBzdHJpbmcKKyAgICAgICAgaWYgKGJ5dGVzKSB7CisgICAgICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWCA9ICIpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgibmV3IGNoYXJbXSB7IikuZW5kbCgpOworICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCInMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywiKS4KKyAgICAgICAgICAgICAgICBlbmRsKCk7CisgICAgICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoIic4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnIikuCisgICAgICAgICAgICAgICAgZW5kbCgpOworICAgICAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoIn07IikuZW5kbCgyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0YXRpYyBibG9jayB0byByZWdpc3RlciBjbGFzcworICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgic3RhdGljIikub3BlbkJyYWNlKDIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCIvLyByZWdpc3RlciBwZXJzaXN0ZW50IGNsYXNzIGluIEpWTSIpLmVuZGwoKTsKKyAgICAgICAgaWYgKEphdmFWZXJzaW9ucy5WRVJTSU9OID49IDUpIHsKKyAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgidHJ5IHsgQ2xhc3MuZm9yTmFtZSIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoIlwiIikuYXBwZW5kKF90eXBlLmdldE5hbWUoKSkuYXBwZW5kKCJcIiIpLgorICAgICAgICAgICAgICAgIGNsb3NlUGFyZW4oKS5hcHBlbmQoIjsiKS5hcHBlbmQoIiB9IikuZW5kbCgpOworICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJjYXRjaCIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoIkV4Y2VwdGlvbiBlIikuY2xvc2VQYXJlbigpLmFwcGVuZCgiIHt9IikuZW5kbCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgiQ2xhc3MgYyA9ICIpLmFwcGVuZChfdHlwZS5nZXROYW1lKCkpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiLmNsYXNzOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS5jbG9zZUJyYWNlKDIpOworCisgICAgICAgIC8vIGZpZWxkIGRlY2xhcmF0aW9ucworICAgICAgICBpZiAoZmllbGREZWNzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGNvZGUuZW5kbCgyKS5hcHBlbmQoZmllbGREZWNzKTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkudGFiKCkuYXBwZW5kKCJwdWJsaWMgIikuYXBwZW5kKGNsYXNzTmFtZSkuCisgICAgICAgICAgICBwYXJlbnMoKS5vcGVuQnJhY2UoMikuZW5kbCgpOworICAgICAgICBjb2RlLmNsb3NlQnJhY2UoMik7CisKKyAgICAgICAgLy8gc3RyaW5nIGNvbnN0cnVjdG9yCisgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKGNvbnN0cnVjdG9yKTsKKworICAgICAgICAvLyBwcm9wZXJ0aWVzCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKHByb3BlcnRpZXMpOworCisgICAgICAgIC8vIHRvU3RyaW5nLCBlcXVhbHMsIGhhc2hDb2RlIG1ldGhvZHMKKyAgICAgICAgaWYgKHRvU3RyaW5nQ29kZS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb2RlLmFmdGVyU2VjdGlvbigpLmFwcGVuZCh0b1N0cmluZ0NvZGUpOworICAgICAgICBpZiAoaGFzaENvZGVDb2RlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKGhhc2hDb2RlQ29kZSk7CisgICAgICAgIGlmIChlcXVhbHNDb2RlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKGVxdWFsc0NvZGUpOworICAgICAgICBpZiAoZnJvbVN0cmluZ0NvZGUubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgY29kZS5hZnRlclNlY3Rpb24oKS5hcHBlbmQoZnJvbVN0cmluZ0NvZGUpOworCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGJ5dGUgYXJyYXkgZmllbGRzLCB3ZSBoYXZlIHRvIGFkZCB0aGUgZXh0cmEKKyAgICAgICAgLy8gbWV0aG9kcyBmb3IgaGFuZGxpbmcgYnl0ZSBhcnJheXMKKyAgICAgICAgaWYgKGJ5dGVzKSB7CisgICAgICAgICAgICBjb2RlLmFmdGVyU2VjdGlvbigpLmFwcGVuZChnZXRUb0J5dGVzQnl0ZUFycmF5Q29kZSgpKTsKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKGdldFRvU3RyaW5nQnl0ZUFycmF5Q29kZSgpKTsKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKGdldEVxdWFsc0J5dGVBcnJheUNvZGUoKSk7CisgICAgICAgICAgICBjb2RlLmFmdGVyU2VjdGlvbigpLmFwcGVuZChnZXRIYXNoQ29kZUJ5dGVBcnJheUNvZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBiYXNlIGNsYXNzZXMgbWlnaHQgbmVlZCB0byBkZWZpbmUgYSBjdXN0b20gdG9rZW5pemVyCisgICAgICAgIGlmIChzdXBlck9pZENsYXNzID09IG51bGwgJiYgZ2V0VG9rZW5pemVyKGZhbHNlKSA9PSBUT0tFTklaRVJfQ1VTVE9NKQorICAgICAgICAgICAgY29kZS5hZnRlclNlY3Rpb24oKS5hcHBlbmQoZ2V0Q3VzdG9tVG9rZW5pemVyQ2xhc3MoKSk7CisKKyAgICAgICAgY29kZS5lbmRsKCk7CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgxKTsKKworICAgICAgICBfY29kZSA9IGNvZGUudG9TdHJpbmcoKTsKKworICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGlubmVyIGNsYXNzLCB0aGVuIGluZGVudCB0aGUgZW50aXJlCisgICAgICAgIC8vIGNvZGUgdW5pdCBvbmUgdGFiIGxldmVsCisgICAgICAgIGlmIChpc0lubmVyQ2xhc3MoKSkgeworICAgICAgICAgICAgLy8gaW5kZW50IHRoZSBlbnRpcmUgY29kZSBibG9jayBvbmUgbGV2ZWwgdG8gbWFrZSBpdAorICAgICAgICAgICAgLy8gYSBwcm9wZXJ0bHkgaW5kZW50ZWQgaW5uZGVyIGNsYXNzCisgICAgICAgICAgICBfY29kZSA9IGNvZGUuZ2V0VGFiKCkgKyBTdHJpbmdzLnJlcGxhY2UoX2NvZGUsCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLAorICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSArIGNvZGUuZ2V0VGFiKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBnZW5lcmF0ZWQgY29kZSB0byB0aGUgcHJvcGVyIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb3JkKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9jb2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgV3JpdGVyIHdyaXRlciA9IF93cml0ZXI7CisgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gZ2V0RmlsZSgpOworICAgICAgICAgICAgRmlsZXMuYmFja3VwKGZpbGUsIGZhbHNlKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworICAgICAgICBwcmludGVyLnByaW50KF9jb2RlKTsKKyAgICAgICAgcHJpbnRlci5mbHVzaCgpOworCisgICAgICAgIGlmIChfd3JpdGVyID09IG51bGwpCisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5lY2Vzc2FyeSBpbXBvcnRzIGZvciB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgU2V0IHBrZ3MgPSBnZXRJbXBvcnRQYWNrYWdlcygpOworCisgICAgICAgIENvZGVGb3JtYXQgaW1wb3J0cyA9IG5ld0NvZGVGb3JtYXQoKTsKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBTdHJpbmdzLmdldFBhY2thZ2VOYW1lKF9tZXRhLmdldE9iamVjdElkVHlwZSgpKTsKKyAgICAgICAgU3RyaW5nIHBrZzsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwa2dzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBwa2cgPSAoU3RyaW5nKSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKHBrZy5sZW5ndGgoKSA+IDAgJiYgISJqYXZhLmxhbmciLmVxdWFscyhwa2cpCisgICAgICAgICAgICAgICAgJiYgIWJhc2UuZXF1YWxzKHBrZykpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1wb3J0cy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuZW5kbCgpOworICAgICAgICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKHBrZykuYXBwZW5kKCIuKjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW1wb3J0cy50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgcGFja2FnZXMgdGhhdCBuZWVkIHRvIGJlIGltcG9ydGVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXQgZ2V0SW1wb3J0UGFja2FnZXMoKSB7CisgICAgICAgIFNldCBwa2dzID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgcGtncy5hZGQoU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShfdHlwZSkpOworCisgICAgICAgIENsYXNzIHN1cGVyT2lkQ2xhc3MgPSBudWxsOworICAgICAgICBpZiAoX21ldGEgIT0gbnVsbCAmJiBfbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpICE9IG51bGwpCisgICAgICAgICAgICBzdXBlck9pZENsYXNzID0gX21ldGEuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKS5nZXRPYmplY3RJZFR5cGUoKTsKKyAgICAgICAgaWYgKHN1cGVyT2lkQ2xhc3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHBrZ3MuYWRkKFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoc3VwZXJPaWRDbGFzcykpOworCisgICAgICAgIHBrZ3MuYWRkKCJqYXZhLmlvIik7CisgICAgICAgIHBrZ3MuYWRkKCJqYXZhLnV0aWwiKTsKKyAgICAgICAgQ2xhc3MgdHlwZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0eXBlID0gX2ZpZWxkc1tpXS5nZXRPYmplY3RJZEZpZWxkVHlwZSgpOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gYnl0ZVtdLmNsYXNzICYmIHR5cGUgIT0gY2hhcltdLmNsYXNzCisgICAgICAgICAgICAgICAgJiYgIXR5cGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEuc3FsLiIpKSB7CisgICAgICAgICAgICAgICAgcGtncy5hZGQoU3RyaW5ncy5nZXRQYWNrYWdlTmFtZSh0eXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBrZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2RlIHRvIGRlY2xhcmUgYWxsIHByaW1hcnkga2V5IGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRGaWVsZERlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9maWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBjb2RlLmVuZGwoKTsKKyAgICAgICAgICAgIGNvZGUudGFiKCkuYXBwZW5kKCJwdWJsaWMgIikuYXBwZW5kKGdldFR5cGVOYW1lKF9maWVsZHNbaV0pKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoIiAiKS5hcHBlbmQoX2ZpZWxkc1tpXS5nZXROYW1lKCkpLmFwcGVuZCgiOyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0eXBlIG5hbWUgdG8gZGVjbGFyZSB0aGUgZ2l2ZW4gZmllbGQgYXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZU5hbWUoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGZtZC5nZXRPYmplY3RJZEZpZWxkVHlwZSgpOworICAgICAgICBpZiAodHlwZSA9PSBieXRlW10uY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgICAgIGlmICh0eXBlID09IGNoYXJbXS5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiAiY2hhcltdIjsKKyAgICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEuc3FsLiIpKQorICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOworICAgICAgICByZXR1cm4gU3RyaW5ncy5nZXRDbGFzc05hbWUodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciBhbGwgcHJpbWFyeSBrZXkgZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIGlmIChfbWV0YS5nZXRBY2Nlc3NUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQpCisgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBTdHJpbmcgcHJvcE5hbWU7CisgICAgICAgIFN0cmluZyB0eXBlTmFtZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgY29kZS5hZnRlclNlY3Rpb24oKTsKKyAgICAgICAgICAgIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoX2ZpZWxkc1tpXSk7CisgICAgICAgICAgICBwcm9wTmFtZSA9IFN0cmluZ1V0aWxzLmNhcGl0YWxpemUoX2ZpZWxkc1tpXS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgicHVibGljICIpLmFwcGVuZCh0eXBlTmFtZSkuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBpZiAoX2ZpZWxkc1tpXS5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkJPT0xFQU4KKyAgICAgICAgICAgICAgICB8fCBfZmllbGRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuQk9PTEVBTl9PQkopCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoImlzIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoImdldCIpOworICAgICAgICAgICAgY29kZS5hcHBlbmQocHJvcE5hbWUpLnBhcmVucygpLm9wZW5CcmFjZSgyKS5lbmRsKCk7CisgICAgICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoInJldHVybiAiKS5hcHBlbmQoX2ZpZWxkc1tpXS5nZXROYW1lKCkpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCk7CisKKyAgICAgICAgICAgIGNvZGUudGFiKCkuYXBwZW5kKCJwdWJsaWMgdm9pZCBzZXQiKS5hcHBlbmQocHJvcE5hbWUpOworICAgICAgICAgICAgY29kZS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoIiAiKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoX2ZpZWxkc1tpXS5nZXROYW1lKCkpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgIGNvZGUub3BlbkJyYWNlKDIpLmVuZGwoKTsKKyAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgidGhpcy4iKS5hcHBlbmQoX2ZpZWxkc1tpXS5nZXROYW1lKCkpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiID0gIikuYXBwZW5kKF9maWVsZHNbaV0uZ2V0TmFtZSgpKS5hcHBlbmQoIjsiKS4KKyAgICAgICAgICAgICAgICBlbmRsKCk7CisgICAgICAgICAgICBjb2RlLmNsb3NlQnJhY2UoMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN0cmluZyBjb25zdHJ1Y3RvciBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldENvbnN0cnVjdG9yKGJvb2xlYW4gaGFzU3VwZXJjbGFzcykgeworICAgICAgICBDb2RlRm9ybWF0IGNvZGUgPSBuZXdDb2RlRm9ybWF0KCk7CisgICAgICAgIGNvZGUudGFiKCkuYXBwZW5kKCJwdWJsaWMgIik7CisgICAgICAgIGNvZGUuYXBwZW5kKGdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgY29kZS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKCJTdHJpbmcgc3RyIikuY2xvc2VQYXJlbigpOworICAgICAgICBjb2RlLm9wZW5CcmFjZSgyKS5lbmRsKCk7CisKKyAgICAgICAgaWYgKF9maWVsZHMubGVuZ3RoICE9IDAgfHwgKGhhc1N1cGVyY2xhc3MKKyAgICAgICAgICAgICYmIF9tZXRhLmdldFByaW1hcnlLZXlGaWVsZHMoKS5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJmcm9tU3RyaW5nIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgic3RyIikuY2xvc2VQYXJlbigpLmFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGZyb21TdHJpbmcgbWV0aG9kIHRoYXQgcGFyc2VzIHRoZSByZXN1bHQgb2Ygb3VyIHRvU3RyaW5nCisgICAgICogbWV0aG9kLiBJZiB3ZSBoYXZlIHN1cGVyY2xhc3NlcyB3aXRoIGlkIGZpZWxkcywgdGhpcyB3aWxsIGNhbGwKKyAgICAgKiBzdXBlci5mcm9tU3RyaW5nKCkgc28gdGhhdCB0aGUgcGFyZW50IGNsYXNzIGNhbiBwYXJzZSBpdHMgb3duIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRGcm9tU3RyaW5nQ29kZShib29sZWFuIGhhc1N1cGVyY2xhc3MpIHsKKyAgICAgICAgLy8gaWYgd2UgYXJlIGJlbG93IGEgY29uY3JldGUgY2xhc3MgdGhlbiB3ZSBjYW5ub3QgZGVjbGFyZSBhbnkKKyAgICAgICAgLy8gbW9yZSBwcmltYXJ5IGtleSBmaWVsZHM7IHRodXMsIGp1c3QgdXNlIHRoZSBwYXJlbnQgaW52b2NhdGlvbgorICAgICAgICBpZiAoaGFzQ29uY3JldGVTdXBlcmNsYXNzKCkpCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIGlmIChfZmllbGRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICBoYXNTdXBlcmNsYXNzID0gaGFzU3VwZXJjbGFzcyAmJiBnZXREZWNsYXJlZFByaW1hcnlLZXlGaWVsZHMKKyAgICAgICAgICAgIChfbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpKS5sZW5ndGggPiAwOworCisgICAgICAgIFN0cmluZyB0b2tlID0gZ2V0VG9rZW5pemVyKGhhc1N1cGVyY2xhc3MpOworICAgICAgICBDb2RlRm9ybWF0IGNvZGUgPSBuZXdDb2RlRm9ybWF0KCk7CisgICAgICAgIGlmIChfYWJzdHJhY3QgfHwgaGFzU3VwZXJjbGFzcykKKyAgICAgICAgICAgIGNvZGUudGFiKCkuYXBwZW5kKCJwcm90ZWN0ZWQgIikuYXBwZW5kKHRva2UpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiIGZyb21TdHJpbmciKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInByaXZhdGUgdm9pZCBmcm9tU3RyaW5nIik7CisgICAgICAgIGNvZGUub3BlblBhcmVuKHRydWUpLmFwcGVuZCgiU3RyaW5nIHN0ciIpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgY29kZS5vcGVuQnJhY2UoMikuZW5kbCgpOworCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IE9iamVjdC10eXBlIGZpZWxkcywgZGllIGltbWVkaWF0ZWx5IAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9maWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfZmllbGRzW2ldLmdldE9iamVjdElkRmllbGRUeXBlKCkgIT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJ0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKS4KKyAgICAgICAgICAgICAgICBwYXJlbnMoKS5hcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgICAgICBjb2RlLmNsb3NlQnJhY2UoMik7IAorICAgICAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICAgICAgfSAKKworICAgICAgICBpZiAodG9rZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQodG9rZSkuYXBwZW5kKCIgdG9rZSA9ICIpOworICAgICAgICAgICAgaWYgKGhhc1N1cGVyY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBjYWxsIHN1cGVyLmZyb21TdHJpbmcoc3RyKSB0byBnZXQgdGhlIHRva2VuaXplciB0aGF0IHdhcworICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gcGFyc2UgdGhlIHN1cGVyY2xhc3MKKyAgICAgICAgICAgICAgICBjb2RlLmFwcGVuZCgic3VwZXIuZnJvbVN0cmluZyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCJzdHIiKS5jbG9zZVBhcmVuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjb25zdHJ1Y3QgYSBuZXcgdG9rZW5pemVyIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJuZXcgIikuYXBwZW5kKHRva2UpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCJzdHIiKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZSA9PSBUT0tFTklaRVJfU1REKQorICAgICAgICAgICAgICAgICAgICBjb2RlLmFwcGVuZCgiLCBcIiIpLmFwcGVuZChfdG9rZW4pLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICBjb2RlLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCI7IikuZW5kbCgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodG9rZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJzdHIgPSB0b2tlLm5leHRUb2tlbiIpLnBhcmVucygpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoZ2V0Q29udmVyc2lvbkNvZGUoX2ZpZWxkc1tpXSwgInN0ciIpKS5lbmRsKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9hYnN0cmFjdCB8fCBoYXNTdXBlcmNsYXNzKQorICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gdG9rZTsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRva2VuaXplciB0byB1c2UsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRUb2tlbml6ZXIoYm9vbGVhbiBoYXNTdXBlcmNsYXNzKSB7CisgICAgICAgIGlmICghX2Fic3RyYWN0ICYmICFoYXNTdXBlcmNsYXNzICYmIF9maWVsZHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKF90b2tlbi5sZW5ndGgoKSA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIFRPS0VOSVpFUl9TVEQ7CisgICAgICAgIHJldHVybiBUT0tFTklaRVJfQ1VTVE9NOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwYXJzaW5nIGNvZGUgZm9yIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDb252ZXJzaW9uQ29kZShGaWVsZE1ldGFEYXRhIGZpZWxkLCBTdHJpbmcgdmFyKSB7CisgICAgICAgIENvZGVGb3JtYXQgcGFyc2UgPSBuZXdDb2RlRm9ybWF0KCk7CisgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKHZhcikpCisgICAgICAgICAgICBwYXJzZS5hcHBlbmQoInRoaXMuIik7CisgICAgICAgIHBhcnNlLmFwcGVuZChmaWVsZC5nZXROYW1lKCkpLmFwcGVuZCgiID0gIik7CisKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGZpZWxkLmdldE9iamVjdElkRmllbGRUeXBlKCk7CisgICAgICAgIGlmICh0eXBlID09IERhdGUuY2xhc3MpIHsKKyAgICAgICAgICAgIHBhcnNlLmFwcGVuZCgibmV3IERhdGUiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICAgICAgYXBwZW5kKCJMb25nLnBhcnNlTG9uZyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQodmFyKS5jbG9zZVBhcmVuKCkuY2xvc2VQYXJlbigpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gamF2YS5zcWwuRGF0ZS5jbGFzcworICAgICAgICAgICAgfHwgdHlwZSA9PSBqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MKKyAgICAgICAgICAgIHx8IHR5cGUgPT0gamF2YS5zcWwuVGltZS5jbGFzcykgeworICAgICAgICAgICAgcGFyc2UuYXBwZW5kKHR5cGUuZ2V0TmFtZSgpKS5hcHBlbmQoIi52YWx1ZU9mIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCh2YXIpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgIHBhcnNlLmFwcGVuZCh2YXIpOworICAgICAgICBlbHNlIGlmICh0eXBlID09IENoYXJhY3Rlci5jbGFzcykgeworICAgICAgICAgICAgcGFyc2UuYXBwZW5kKCJuZXcgQ2hhcmFjdGVyIikub3BlblBhcmVuKHRydWUpLmFwcGVuZCh2YXIpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiLmNoYXJBdCIpLm9wZW5QYXJlbih0cnVlKS5hcHBlbmQoMCkuCisgICAgICAgICAgICAgICAgY2xvc2VQYXJlbigpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGJ5dGVbXS5jbGFzcykKKyAgICAgICAgICAgIHBhcnNlLmFwcGVuZCgidG9CeXRlcyIpLm9wZW5QYXJlbih0cnVlKS5hcHBlbmQodmFyKS5jbG9zZVBhcmVuKCk7CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gY2hhcltdLmNsYXNzKQorICAgICAgICAgICAgcGFyc2UuYXBwZW5kKHZhcikuYXBwZW5kKCIudG9DaGFyQXJyYXkiKS5wYXJlbnMoKTsKKyAgICAgICAgZWxzZSBpZiAoIXR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgcGFyc2UuYXBwZW5kKCJuZXcgIikuYXBwZW5kKFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKHR5cGUpKS4KKyAgICAgICAgICAgICAgICBvcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKHZhcikuY2xvc2VQYXJlbigpOworICAgICAgICB9IGVsc2UgLy8gcHJpbWl0aXZlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXROYW1lKCkuY2hhckF0KDApKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGJvb2xlYW4uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZS5hcHBlbmQoIlwidHJ1ZVwiLmVxdWFscyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQodmFyKS5jbG9zZVBhcmVuKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlLmFwcGVuZCgiQnl0ZS5wYXJzZUJ5dGUiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHZhcikuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2UuYXBwZW5kKHZhcikuYXBwZW5kKCIuY2hhckF0Iikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKDApLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlLmFwcGVuZCgiRG91YmxlLnBhcnNlRG91YmxlIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHZhcikuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2UuYXBwZW5kKCJGbG9hdC5wYXJzZUZsb2F0Iikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHZhcikuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2UuYXBwZW5kKCJJbnRlZ2VyLnBhcnNlSW50Iikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHZhcikuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2UuYXBwZW5kKCJMb25nLnBhcnNlTG9uZyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCh2YXIpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlLmFwcGVuZCgiU2hvcnQucGFyc2VTaG9ydCIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCh2YXIpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXR5cGUuaXNQcmltaXRpdmUoKSAmJiB0eXBlICE9IGJ5dGVbXS5jbGFzcykgeworICAgICAgICAgICAgQ29kZUZvcm1hdCBpc051bGwgPSBuZXdDb2RlRm9ybWF0KCk7CisgICAgICAgICAgICBpc051bGwuYXBwZW5kKCJpZiIpLm9wZW5QYXJlbih0cnVlKS5hcHBlbmQoIlwibnVsbFwiLmVxdWFscyIpLgorICAgICAgICAgICAgICAgIG9wZW5QYXJlbih0cnVlKS5hcHBlbmQodmFyKS5jbG9zZVBhcmVuKCkuY2xvc2VQYXJlbigpLgorICAgICAgICAgICAgICAgIGVuZGwoKS50YWIoMyk7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyh2YXIpKQorICAgICAgICAgICAgICAgIGlzTnVsbC5hcHBlbmQoInRoaXMuIik7CisgICAgICAgICAgICBpc051bGwuYXBwZW5kKGZpZWxkLmdldE5hbWUoKSkuYXBwZW5kKCIgPSBudWxsOyIpLmVuZGwoKTsKKyAgICAgICAgICAgIGlzTnVsbC50YWIoMikuYXBwZW5kKCJlbHNlIikuZW5kbCgpOworICAgICAgICAgICAgaXNOdWxsLnRhYigzKS5hcHBlbmQocGFyc2UpOworICAgICAgICAgICAgcGFyc2UgPSBpc051bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyc2UuYXBwZW5kKCI7IikudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXF1YWxpdHkgbWV0aG9kIHRoYXQgY29tcGFyZXMgYWxsIHBrIHZhcmlhYmxlcy4KKyAgICAgKiBNdXN0IGRlYWwgY29ycmVjdGx5IHdpdGggYm90aCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEVxdWFsc0NvZGUoYm9vbGVhbiBoYXNTdXBlcmNsYXNzKSB7CisgICAgICAgIC8vIGlmIHdlIGFyZSBiZWxvdyBhIGNvbmNyZXRlIGNsYXNzIHRoZW4gd2UgY2Fubm90IGRlY2xhcmUgYW55CisgICAgICAgIC8vIG1vcmUgcHJpbWFyeSBrZXkgZmllbGRzOyB0aHVzLCBqdXN0IHVzZSB0aGUgcGFyZW50IGludm9jYXRpb24KKyAgICAgICAgaWYgKGhhc0NvbmNyZXRlU3VwZXJjbGFzcygpIHx8IChoYXNTdXBlcmNsYXNzICYmIF9maWVsZHMubGVuZ3RoID09IDApKQorICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgIENvZGVGb3JtYXQgY29kZSA9IG5ld0NvZGVGb3JtYXQoKTsKKyAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInB1YmxpYyBib29sZWFuIGVxdWFscyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiT2JqZWN0IG9iaiIpLmNsb3NlUGFyZW4oKS5vcGVuQnJhY2UoMikuZW5kbCgpOworCisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgiaWYiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoInRoaXMgPT0gb2JqIikuY2xvc2VQYXJlbigpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyZXR1cm4gdHJ1ZTsiKS5lbmRsKCk7CisKKyAgICAgICAgLy8gY2FsbCBzdXBlci5lcXVhbHMoKSBpZiB3ZSBoYXZlIGEgc3VwZXJjbGFzcworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgIGlmIChoYXNTdXBlcmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoImlmIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiIXN1cGVyLmVxdWFscyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoIm9iaiIpLmNsb3NlUGFyZW4oKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyZXR1cm4gZmFsc2U7IikuZW5kbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJpZiIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoIm9iaiA9PSBudWxsIHx8IG9iai5nZXRDbGFzcyIpLnBhcmVucygpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiICE9ICIpLmFwcGVuZCgiZ2V0Q2xhc3MiKS5wYXJlbnMoKS4KKyAgICAgICAgICAgICAgICBjbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyZXR1cm4gZmFsc2U7IikuZW5kbCgpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIENsYXNzIHR5cGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2ZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvZGUuZW5kbCgpLnRhYigyKS5hcHBlbmQoY2xhc3NOYW1lKS5hcHBlbmQoIiBvdGhlciA9ICIpLgorICAgICAgICAgICAgICAgICAgICBvcGVuUGFyZW4oZmFsc2UpLmFwcGVuZChjbGFzc05hbWUpLmNsb3NlUGFyZW4oKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIgb2JqOyIpLmVuZGwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGZpZWxkLCBhZGQgYW4gJiYKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29kZS5lbmRsKCkudGFiKDMpLmFwcGVuZCgiJiYgIik7CisKKyAgICAgICAgICAgIG5hbWUgPSBfZmllbGRzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHR5cGUgPSBfZmllbGRzW2ldLmdldE9iamVjdElkRmllbGRUeXBlKCk7CisgICAgICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgY29kZS5vcGVuUGFyZW4oZmFsc2UpLmFwcGVuZChuYW1lKS5hcHBlbmQoIiA9PSAiKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCJvdGhlci4iKS5hcHBlbmQobmFtZSkuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGJ5dGVbXS5jbGFzcykgeworICAgICAgICAgICAgICAgIGNvZGUub3BlblBhcmVuKGZhbHNlKS5hcHBlbmQoImVxdWFscyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKG5hbWUpLmFwcGVuZCgiLCAiKS5hcHBlbmQoIm90aGVyLiIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQobmFtZSkuY2xvc2VQYXJlbigpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjaGFyW10uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAvLyAoKG5hbWUgPT0gbnVsbCAmJiBvdGhlci5uYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgLy8JfHwgKG5hbWUgIT0gbnVsbCAmJiBTdHJpbmcudmFsdWVPZiAobmFtZSkuCisgICAgICAgICAgICAgICAgLy8JZXF1YWxzIChTdHJpbmcudmFsdWVPZiAob3RoZXIubmFtZSkpKSkKKyAgICAgICAgICAgICAgICBjb2RlLmFwcGVuZCgiKCIpLm9wZW5QYXJlbihmYWxzZSkuYXBwZW5kKG5hbWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIiA9PSBudWxsICYmIG90aGVyLiIpLmFwcGVuZChuYW1lKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIgPT0gbnVsbCIpLmNsb3NlUGFyZW4oKS5lbmRsKCk7CisgICAgICAgICAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJ8fCAiKTsKKyAgICAgICAgICAgICAgICBjb2RlLm9wZW5QYXJlbihmYWxzZSkuYXBwZW5kKG5hbWUpLmFwcGVuZCgiICE9IG51bGwgIikuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiJiYgU3RyaW5nLnZhbHVlT2YiKS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKG5hbWUpLgorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhcmVuKCkuYXBwZW5kKCIuIikuZW5kbCgpOworICAgICAgICAgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgiZXF1YWxzIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIlN0cmluZy52YWx1ZU9mIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIm90aGVyLiIpLmFwcGVuZChuYW1lKS5jbG9zZVBhcmVuKCkuY2xvc2VQYXJlbigpLgorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhcmVuKCkuYXBwZW5kKCIpIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vICgobmFtZSA9PSBudWxsICYmIG90aGVyLm5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAvLwl8fCAobmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzIChvdGhlci5uYW1lKSkpCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoIigiKS5vcGVuUGFyZW4oZmFsc2UpLmFwcGVuZChuYW1lKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIgPT0gbnVsbCAmJiBvdGhlci4iKS5hcHBlbmQobmFtZSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiID09IG51bGwiKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICAgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgifHwgIik7CisgICAgICAgICAgICAgICAgY29kZS5vcGVuUGFyZW4oZmFsc2UpLmFwcGVuZChuYW1lKS5hcHBlbmQoIiAhPSBudWxsICIpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIiYmICIpLmFwcGVuZChuYW1lKS5hcHBlbmQoIi5lcXVhbHMiKS4KKyAgICAgICAgICAgICAgICAgICAgb3BlblBhcmVuKHRydWUpLmFwcGVuZCgib3RoZXIuIikuYXBwZW5kKG5hbWUpLgorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhcmVuKCkuY2xvc2VQYXJlbigpLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gX2ZpZWxkczoganVzdCByZXR1cm4gdHJ1ZSBhZnRlciBjaGVja2luZyBpbnN0YW5jZW9mCisgICAgICAgIGlmIChfZmllbGRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gdHJ1ZTsiKS5lbmRsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCI7IikuZW5kbCgpOworCisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBoYXNoQ29kZSBtZXRob2QgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsCisgICAgICogcHJpbWFyeSBrZXkgdmFsdWVzLiBNdXN0IGRlYWwgY29ycmVjdGx5IHdpdGggYm90aCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEhhc2hDb2RlQ29kZShib29sZWFuIGhhc1N1cGVyY2xhc3MpIHsKKyAgICAgICAgLy8gaWYgd2UgYXJlIGJlbG93IGEgY29uY3JldGUgY2xhc3MgdGhlbiB3ZSBjYW5ub3QgZGVjbGFyZSBhbnkKKyAgICAgICAgLy8gbW9yZSBwcmltYXJ5IGtleSBmaWVsZHM7IHRodXMsIGp1c3QgdXNlIHRoZSBwYXJlbnQgaW52b2NhdGlvbgorICAgICAgICBpZiAoaGFzQ29uY3JldGVTdXBlcmNsYXNzKCkgfHwgKGhhc1N1cGVyY2xhc3MgJiYgX2ZpZWxkcy5sZW5ndGggPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgicHVibGljIGludCBoYXNoQ29kZSIpLnBhcmVucygpLgorICAgICAgICAgICAgb3BlbkJyYWNlKDIpLmVuZGwoKTsKKworICAgICAgICBpZiAoX2ZpZWxkcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicmV0dXJuIDE3OyIpLmVuZGwoKTsKKyAgICAgICAgZWxzZSBpZiAoX2ZpZWxkcy5sZW5ndGggPT0gMSAmJiAhaGFzU3VwZXJjbGFzcykgeworICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gIik7CisgICAgICAgICAgICBhcHBlbmRIYXNoQ29kZUNvZGUoX2ZpZWxkc1swXSwgY29kZSk7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgiaW50IHJzID0gIik7CisgICAgICAgICAgICBpZiAoaGFzU3VwZXJjbGFzcykgeworICAgICAgICAgICAgICAgIC8vIGNhbGwgc3VwZXIuaGFzaENvZGUoKSBpZiB3ZSBoYXZlIGEgc3VwZXJjbGFzcworICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJzdXBlci5oYXNoQ29kZSIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgICAgICAgICAgY2xvc2VQYXJlbigpLmFwcGVuZCgiOyIpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoIjE3OyIpOworICAgICAgICAgICAgY29kZS5lbmRsKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2ZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicnMgPSBycyAqIDM3ICsgIik7CisgICAgICAgICAgICAgICAgYXBwZW5kSGFzaENvZGVDb2RlKF9maWVsZHNbaV0sIGNvZGUpOworICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCI7IikuZW5kbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gcnM7IikuZW5kbCgpOworICAgICAgICB9CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIGhhcyBhIGNvbmNyZXRlIHN1cGVyY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbmNyZXRlU3VwZXJjbGFzcygpIHsKKyAgICAgICAgZm9yIChDbGFzc01ldGFEYXRhIHN1cCA9IF9tZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgICAgICBzdXAgIT0gbnVsbDsgc3VwID0gc3VwLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkpIHsKKyAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChzdXAuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGNvZGUgY2FsY3VsYXRpbmcgdGhlIGhhc2hjb2RlIGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZEhhc2hDb2RlQ29kZShGaWVsZE1ldGFEYXRhIGZpZWxkLCBDb2RlRm9ybWF0IGNvZGUpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWVsZC5nZXROYW1lKCk7CisgICAgICAgIGlmICgicnMiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIG5hbWUgPSAidGhpcy4iICsgbmFtZTsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGZpZWxkLmdldE9iamVjdElkRmllbGRUeXBlKCk7CisgICAgICAgIGlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAvLyAoKG5hbWUpID8gMSA6IDApCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoIigiKS5vcGVuUGFyZW4oZmFsc2UpLmFwcGVuZChuYW1lKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiID8gMSA6IDAiKS5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBsb25nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgLy8gKGludCkgKG5hbWUgXiAobmFtZSA+Pj4gMzIpKQorICAgICAgICAgICAgICAgIGNvZGUub3BlblBhcmVuKGZhbHNlKS5hcHBlbmQoImludCIpLmNsb3NlUGFyZW4oKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCIgIikub3BlblBhcmVuKGZhbHNlKS5hcHBlbmQobmFtZSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiIF4gIikub3BlblBhcmVuKGZhbHNlKS5hcHBlbmQobmFtZSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiID4+PiAzMiIpLmNsb3NlUGFyZW4oKS5jbG9zZVBhcmVuKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gZG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgLy8gKGludCkgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzIChuYW1lKQorICAgICAgICAgICAgICAgIC8vICAgICBeIChEb3VibGUuZG91YmxlVG9Mb25nQml0cyAobmFtZSkgPj4+IDMyKSkKKyAgICAgICAgICAgICAgICBjb2RlLm9wZW5QYXJlbihmYWxzZSkuYXBwZW5kKCJpbnQiKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiICIpLm9wZW5QYXJlbihmYWxzZSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZChuYW1lKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICAgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgiXiAiKS5vcGVuUGFyZW4oZmFsc2UpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQobmFtZSkuY2xvc2VQYXJlbigpLmFwcGVuZCgiID4+PiAzMiIpLgorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhcmVuKCkuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgLy8gRmxvYXQuZmxvYXRUb0ludEJpdHMgKG5hbWUpCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoIkZsb2F0LmZsb2F0VG9JbnRCaXRzIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQobmFtZSkuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGludC5jbGFzcykKKyAgICAgICAgICAgICAgICBjb2RlLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIChpbnQpIG5hbWUKKyAgICAgICAgICAgICAgICBjb2RlLm9wZW5QYXJlbihmYWxzZSkuYXBwZW5kKCJpbnQiKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiICIpLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGJ5dGVbXS5jbGFzcykgeworICAgICAgICAgICAgLy8gaGFzaENvZGUgKG5hbWUpOworICAgICAgICAgICAgY29kZS5hcHBlbmQoImhhc2hDb2RlIikub3BlblBhcmVuKHRydWUpLmFwcGVuZChuYW1lKS4KKyAgICAgICAgICAgICAgICBjbG9zZVBhcmVuKCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjaGFyW10uY2xhc3MpIHsKKyAgICAgICAgICAgIC8vICgobmFtZSA9PSBudWxsKSA/IDAgOiBTdHJpbmcudmFsdWVPZiAobmFtZSkuaGFzaENvZGUgKCkpCisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiKCIpLm9wZW5QYXJlbihmYWxzZSkuYXBwZW5kKG5hbWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiID09IG51bGwiKS5jbG9zZVBhcmVuKCkuYXBwZW5kKCIgPyAwIDogIikuCisgICAgICAgICAgICAgICAgYXBwZW5kKCJTdHJpbmcudmFsdWVPZiIpLm9wZW5QYXJlbih0cnVlKS5hcHBlbmQobmFtZSkuCisgICAgICAgICAgICAgICAgY2xvc2VQYXJlbigpLmFwcGVuZCgiLmhhc2hDb2RlIikucGFyZW5zKCkuYXBwZW5kKCIpIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSAoKSkKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIoIikub3BlblBhcmVuKGZhbHNlKS5hcHBlbmQobmFtZSkuCisgICAgICAgICAgICAgICAgYXBwZW5kKCIgPT0gbnVsbCIpLmNsb3NlUGFyZW4oKS5hcHBlbmQoIiA/IDAgOiAiKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQobmFtZSkuYXBwZW5kKCIuaGFzaENvZGUiKS5wYXJlbnMoKS5hcHBlbmQoIikiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1ldGhvZCB0byBjcmVhdGUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcHJpbWFyeSBrZXkKKyAgICAgKiB2YWx1ZXMgdGhhdCBkZWZpbmUgdGhlIGFwcGxpY2F0aW9uIGlkIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRUb1N0cmluZ0NvZGUoYm9vbGVhbiBoYXNTdXBlcmNsYXNzKSB7CisgICAgICAgIC8vIGlmIHdlIGFyZSBiZWxvdyBhIGNvbmNyZXRlIGNsYXNzIHRoZW4gd2UgY2Fubm90IGRlY2xhcmUgYW55CisgICAgICAgIC8vIG1vcmUgcHJpbWFyeSBrZXkgZmllbGRzOyB0aHVzLCBqdXN0IHVzZSB0aGUgcGFyZW50IGludm9jYXRpb24KKyAgICAgICAgaWYgKGhhc0NvbmNyZXRlU3VwZXJjbGFzcygpIHx8IChoYXNTdXBlcmNsYXNzICYmIF9maWVsZHMubGVuZ3RoID09IDApKQorICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgIENvZGVGb3JtYXQgY29kZSA9IG5ld0NvZGVGb3JtYXQoKTsKKyAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInB1YmxpYyBTdHJpbmcgdG9TdHJpbmciKS5wYXJlbnMoKS4KKyAgICAgICAgICAgIG9wZW5CcmFjZSgyKS5lbmRsKCk7CisKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIENsYXNzIHR5cGU7CisgICAgICAgIFN0cmluZyBhcHBlbmREZWxpbWl0ZXIgPSAiKyBcIiIgKyBfdG9rZW4gKyAiXCIgKyAiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9maWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBmaWVsZCwgYWRkIGEgKworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicmV0dXJuICIpOworCisgICAgICAgICAgICAgICAgLy8gYWRkIGluIHRoZSBzdXBlci50b1N0cmluZygpIGlmIHdlIGhhdmUgYSBwYXJlbnQKKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VwZXJjbGFzcyAmJiBnZXREZWNsYXJlZFByaW1hcnlLZXlGaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgKF9tZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoInN1cGVyLnRvU3RyaW5nIikucGFyZW5zKCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuZW5kbCgpLnRhYigzKS5hcHBlbmQoYXBwZW5kRGVsaW1pdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjb2RlLmVuZGwoKS50YWIoMykuYXBwZW5kKGFwcGVuZERlbGltaXRlcik7CisKKyAgICAgICAgICAgIG5hbWUgPSBfZmllbGRzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHR5cGUgPSBfZmllbGRzW2ldLmdldE9iamVjdElkRmllbGRUeXBlKCk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IGJ5dGVbXS5jbGFzcykKKyAgICAgICAgICAgICAgICBjb2RlLmFwcGVuZCgidG9TdHJpbmciKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZChuYW1lKS5jbG9zZVBhcmVuKCk7CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IGNoYXJbXS5jbGFzcykKKyAgICAgICAgICAgICAgICBjb2RlLm9wZW5QYXJlbih0cnVlKS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKG5hbWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIiA9PSBudWxsIikuY2xvc2VQYXJlbigpLmFwcGVuZCgiID8gXCJudWxsXCIiKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKCI6IFN0cmluZy52YWx1ZU9mIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQobmFtZSkuY2xvc2VQYXJlbigpLmNsb3NlUGFyZW4oKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICBjb2RlLm9wZW5QYXJlbih0cnVlKS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKG5hbWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIiA9PSBudWxsIikuY2xvc2VQYXJlbigpLmFwcGVuZCgiID8gXCJudWxsXCIiKS4KKyAgICAgICAgICAgICAgICAgICAgZW5kbCgpLnRhYig0KS5hcHBlbmQoIjogU3RyaW5nLnZhbHVlT2YiKS4KKyAgICAgICAgICAgICAgICAgICAgb3BlblBhcmVuKHRydWUpLmFwcGVuZChuYW1lKS5hcHBlbmQoIi5nZXRUaW1lIikuCisgICAgICAgICAgICAgICAgICAgIHBhcmVucygpLmNsb3NlUGFyZW4oKS5jbG9zZVBhcmVuKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29kZS5hcHBlbmQoIlN0cmluZy52YWx1ZU9mIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQobmFtZSkuY2xvc2VQYXJlbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gZmllbGRzOyBqdXN0IHVzZSAiIgorICAgICAgICBpZiAoX2ZpZWxkcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicmV0dXJuIFwiXCIiKTsKKyAgICAgICAgY29kZS5hcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHRvIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQmFzZTE2RW5jb2RlciNkZWNvZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRUb0J5dGVzQnl0ZUFycmF5Q29kZSgpIHsKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgicHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRvQnl0ZXMiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoIlN0cmluZyBzIikuY2xvc2VQYXJlbigpLm9wZW5CcmFjZSgyKS5lbmRsKCk7CisKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJpZiIpLm9wZW5QYXJlbih0cnVlKS5hcHBlbmQoIlwibnVsbFwiLmVxdWFscyIpLgorICAgICAgICAgICAgb3BlblBhcmVuKHRydWUpLmFwcGVuZCgicyIpLmNsb3NlUGFyZW4oKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoInJldHVybiBudWxsOyIpLmVuZGwoMik7CisKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJpbnQgbGVuID0gcy5sZW5ndGgiKS5wYXJlbnMoKS4KKyAgICAgICAgICAgIGFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJieXRlW10gciA9IG5ldyBieXRlW2xlbiAvIDJdOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJmb3IiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoImludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKysiKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICBvcGVuQnJhY2UoMykuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoImludCBkaWdpdDEgPSBzLmNoYXJBdCIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiaSAqIDIiKS5jbG9zZVBhcmVuKCkuYXBwZW5kKCIsICIpLgorICAgICAgICAgICAgYXBwZW5kKCJkaWdpdDIgPSBzLmNoYXJBdCIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiaSAqIDIgKyAxIikuY2xvc2VQYXJlbigpLmFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJpZiIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiZGlnaXQxID49ICcwJyAmJiBkaWdpdDEgPD0gJzknIikuY2xvc2VQYXJlbigpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoNCkuYXBwZW5kKCJkaWdpdDEgLT0gJzAnOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJlbHNlIGlmIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJkaWdpdDEgPj0gJ0EnICYmIGRpZ2l0MSA8PSAnRiciKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYig0KS5hcHBlbmQoImRpZ2l0MSAtPSAnQScgLSAxMDsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgiaWYiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoImRpZ2l0MiA+PSAnMCcgJiYgZGlnaXQyIDw9ICc5JyIpLmNsb3NlUGFyZW4oKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDQpLmFwcGVuZCgiZGlnaXQyIC09ICcwJzsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgiZWxzZSBpZiIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiZGlnaXQyID49ICdBJyAmJiBkaWdpdDIgPD0gJ0YnIikuY2xvc2VQYXJlbigpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoNCkuYXBwZW5kKCJkaWdpdDIgLT0gJ0EnIC0gMTA7IikuZW5kbCgyKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyW2ldID0gKGJ5dGUpICIpLm9wZW5QYXJlbihmYWxzZSkuCisgICAgICAgICAgICBvcGVuUGFyZW4oZmFsc2UpLmFwcGVuZCgiZGlnaXQxIDw8IDQiKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICBhcHBlbmQoIiArIGRpZ2l0MiIpLmNsb3NlUGFyZW4oKS5hcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgzKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicmV0dXJuIHI7IikuZW5kbCgpOworCisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHRvIGNvbnZlcnQgYSBieXRlIGFycmF5IHRvIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQmFzZTE2RW5jb2RlciNlbmNvZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRUb1N0cmluZ0J5dGVBcnJheUNvZGUoKSB7CisgICAgICAgIENvZGVGb3JtYXQgY29kZSA9IG5ld0NvZGVGb3JtYXQoKTsKKyAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiYnl0ZVtdIGIiKS5jbG9zZVBhcmVuKCkub3BlbkJyYWNlKDIpLmVuZGwoKTsKKworICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoImlmIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJiID09IG51bGwiKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoInJldHVybiBcIm51bGxcIjsiKS5lbmRsKDIpOworCisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgiU3RyaW5nQnVmZmVyIHIgPSBuZXcgU3RyaW5nQnVmZmVyIikuCisgICAgICAgICAgICBvcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKCJiLmxlbmd0aCAqIDIiKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICBhcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgiZm9yIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJpbnQgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrIikuY2xvc2VQYXJlbigpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJmb3IiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoImludCBqID0gMTsgaiA+PSAwOyBqLS0iKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYig0KS5hcHBlbmQoInIuYXBwZW5kIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJIRVhbIikub3BlblBhcmVuKGZhbHNlKS5hcHBlbmQoImJbaV0gPj4gIikuCisgICAgICAgICAgICBvcGVuUGFyZW4oZmFsc2UpLmFwcGVuZCgiaiAqIDQiKS5jbG9zZVBhcmVuKCkuY2xvc2VQYXJlbigpLgorICAgICAgICAgICAgYXBwZW5kKCIgJiAweEZdIikuY2xvc2VQYXJlbigpLmFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gci50b1N0cmluZyIpLnBhcmVucygpLgorICAgICAgICAgICAgYXBwZW5kKCI7IikuZW5kbCgpOworCisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHRvIHRlc3QgaWYgdHdvIGJ5dGUgYXJyYXlzIGFyZSBlcXVhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRFcXVhbHNCeXRlQXJyYXlDb2RlKCkgeworICAgICAgICBDb2RlRm9ybWF0IGNvZGUgPSBuZXdDb2RlRm9ybWF0KCk7CisgICAgICAgIGNvZGUudGFiKCkuYXBwZW5kKCJwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiYnl0ZVtdIGIxLCBieXRlW10gYjIiKS5jbG9zZVBhcmVuKCkub3BlbkJyYWNlKDIpLmVuZGwoKTsKKworICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoImlmIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJiMSA9PSBudWxsICYmIGIyID09IG51bGwiKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoInJldHVybiB0cnVlOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJpZiIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiYjEgPT0gbnVsbCB8fCBiMiA9PSBudWxsIikuY2xvc2VQYXJlbigpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyZXR1cm4gZmFsc2U7IikuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoImlmIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJiMS5sZW5ndGggIT0gYjIubGVuZ3RoIikuY2xvc2VQYXJlbigpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyZXR1cm4gZmFsc2U7IikuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoImZvciIpLm9wZW5QYXJlbih0cnVlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiaW50IGkgPSAwOyBpIDwgYjEubGVuZ3RoOyBpKysiKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoImlmIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJiMVtpXSAhPSBiMltpXSIpLmNsb3NlUGFyZW4oKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDQpLmFwcGVuZCgicmV0dXJuIGZhbHNlOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gdHJ1ZTsiKS5lbmRsKCk7CisKKyAgICAgICAgY29kZS5jbG9zZUJyYWNlKDIpOworICAgICAgICByZXR1cm4gY29kZS50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEhhc2hDb2RlQnl0ZUFycmF5Q29kZSgpIHsKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgicHJpdmF0ZSBzdGF0aWMgaW50IGhhc2hDb2RlIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJieXRlW10gYiIpLmNsb3NlUGFyZW4oKS5vcGVuQnJhY2UoMikuZW5kbCgpOworCisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgiaWYiKS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKCJiID09IG51bGwiKS4KKyAgICAgICAgICAgIGNsb3NlUGFyZW4oKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgicmV0dXJuIDA7IikuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoImludCBzdW0gPSAwOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJmb3IiKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoImludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKysiKS5jbG9zZVBhcmVuKCkuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoInN1bSArPSBiW2ldOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJyZXR1cm4gc3VtOyIpLmVuZGwoKTsKKworICAgICAgICBjb2RlLmNsb3NlQnJhY2UoMik7CisgICAgICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29kZSBkZWZpbmluZyBhIHRva2VuaXplciBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDdXN0b21Ub2tlbml6ZXJDbGFzcygpIHsKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBjb2RlLnRhYigpLmFwcGVuZCgicHJvdGVjdGVkIHN0YXRpYyBjbGFzcyAiKS4KKyAgICAgICAgICAgIGFwcGVuZChUT0tFTklaRVJfQ1VTVE9NKS5vcGVuQnJhY2UoMikuZW5kbCgpOworCisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RyOyIpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJwcml2YXRlIGludCBsYXN0OyIpLmFmdGVyU2VjdGlvbigpOworCisgICAgICAgIGNvZGUudGFiKDIpLmFwcGVuZCgicHVibGljIFRva2VuaXplciAoU3RyaW5nIHN0cikiKS4KKyAgICAgICAgICAgIG9wZW5CcmFjZSgzKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgidGhpcy5zdHIgPSBzdHI7IikuZW5kbCgpOworICAgICAgICBjb2RlLmNsb3NlQnJhY2UoMykuYWZ0ZXJTZWN0aW9uKCk7CisKKyAgICAgICAgY29kZS50YWIoMikuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG5leHRUb2tlbiAoKSIpLgorICAgICAgICAgICAgb3BlbkJyYWNlKDMpLmVuZGwoKTsKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJpbnQgbmV4dCA9IHN0ci5pbmRleE9mIikub3BlblBhcmVuKHRydWUpLgorICAgICAgICAgICAgYXBwZW5kKCJcIiIpLmFwcGVuZChfdG9rZW4pLmFwcGVuZCgiXCIsIGxhc3QiKS5jbG9zZVBhcmVuKCkuCisgICAgICAgICAgICBhcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDMpLmFwcGVuZCgiU3RyaW5nIHBhcnQ7IikuZW5kbCgpOworICAgICAgICBjb2RlLnRhYigzKS5hcHBlbmQoImlmIikub3BlblBhcmVuKHRydWUpLmFwcGVuZCgibmV4dCA9PSAtMSIpLgorICAgICAgICAgICAgY2xvc2VQYXJlbigpLm9wZW5CcmFjZSg0KS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDQpLmFwcGVuZCgicGFydCA9IHN0ci5zdWJzdHJpbmciKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoImxhc3QiKS5jbG9zZVBhcmVuKCkuYXBwZW5kKCI7IikuZW5kbCgpOworICAgICAgICBjb2RlLnRhYig0KS5hcHBlbmQoImxhc3QgPSBzdHIubGVuZ3RoIikucGFyZW5zKCkuYXBwZW5kKCI7IikuCisgICAgICAgICAgICBlbmRsKCkuY2xvc2VCcmFjZSg0KTsKKyAgICAgICAgaWYgKCFjb2RlLmdldEJyYWNlT25TYW1lTGluZSgpKQorICAgICAgICAgICAgY29kZS5lbmRsKCkudGFiKDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiICIpOworICAgICAgICBjb2RlLmFwcGVuZCgiZWxzZSIpLm9wZW5CcmFjZSg0KS5lbmRsKCk7CisgICAgICAgIGNvZGUudGFiKDQpLmFwcGVuZCgicGFydCA9IHN0ci5zdWJzdHJpbmciKS5vcGVuUGFyZW4odHJ1ZSkuCisgICAgICAgICAgICBhcHBlbmQoImxhc3QsIG5leHQiKS5jbG9zZVBhcmVuKCkuYXBwZW5kKCI7IikuZW5kbCgpOworICAgICAgICBjb2RlLnRhYig0KS5hcHBlbmQoImxhc3QgPSBuZXh0ICsgIikuYXBwZW5kKF90b2tlbi5sZW5ndGgoKSkuCisgICAgICAgICAgICBhcHBlbmQoIjsiKS5lbmRsKCkuY2xvc2VCcmFjZSg0KS5lbmRsKCk7CisKKyAgICAgICAgY29kZS50YWIoMykuYXBwZW5kKCJyZXR1cm4gcGFydDsiKS5lbmRsKCk7CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgzKTsKKyAgICAgICAgY29kZS5lbmRsKCkuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpbGUgdGhhdCB0aGlzIHRvb2wgc2hvdWxkIG91dHB1dCB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgaWYgKF9tZXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBTdHJpbmdzLmdldFBhY2thZ2VOYW1lKF9tZXRhLmdldE9iamVjdElkVHlwZSgpKTsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gU3RyaW5ncy5nZXRDbGFzc05hbWUoX21ldGEuZ2V0T2JqZWN0SWRUeXBlKCkpCisgICAgICAgICAgICArICIuamF2YSI7CisKKyAgICAgICAgLy8gaWYgcGMgY2xhc3MgaW4gc2FtZSBwYWNrYWdlIGFzIG9pZCBjbGFzcywgdHJ5IHRvIGZpbmQgcGMgLmphdmEgZmlsZQorICAgICAgICBGaWxlIGRpciA9IG51bGw7CisgICAgICAgIGlmIChfZGlyID09IG51bGwgJiYgU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShfdHlwZSkuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgZGlyID0gRmlsZXMuZ2V0U291cmNlRmlsZShfdHlwZSk7CisgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGlyID0gZGlyLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyID09IG51bGwpCisgICAgICAgICAgICBkaXIgPSBGaWxlcy5nZXRQYWNrYWdlRmlsZShfZGlyLCBwYWNrYWdlTmFtZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBjb3JyZWN0IGNvZGUgZm9ybWF0LgorICAgICAqLworICAgIHByaXZhdGUgQ29kZUZvcm1hdCBuZXdDb2RlRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gKF9mb3JtYXQgPT0gbnVsbCkgPyBuZXcgQ29kZUZvcm1hdCgpCisgICAgICAgICAgICA6IChDb2RlRm9ybWF0KSBfZm9ybWF0LmNsb25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuQXBwbGljYXRpb25JZFRvb2wgW29wdGlvbl0qCisgICAgICogJmx0O2NsYXNzIG5hbWUgfCAuamF2YSBmaWxlIHwgLmNsYXNzIGZpbGUgfCAuamRvIGZpbGUmZ3Q7KworICAgICAqICBXaGVyZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQuCisgICAgICogPHVsPgorICAgICAqIDxsaT48aT4tcHJvcGVydGllcy8tcCAmbHQ7cHJvcGVydGllcyBmaWxlJmd0OzwvaT46IFRoZSBwYXRoIHRvIGEgT3BlbkpQQQorICAgICAqIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFzIG91dGxpbmVkIGluCisgICAgICoge0BsaW5rIENvbmZpZ3VyYXRpb259OyBvcHRpb25hbC48L2xpPgorICAgICAqIDxsaT48aT4tJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDtwcm9wZXJ0eSB2YWx1ZSZndDs8L2k+OiBBbGwgYmVhbgorICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIHN0YW5kYXJkIE9wZW5KUEEge0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9ufSBjYW4gYmUKKyAgICAgKiBzZXQgYnkgdXNpbmcgdGhlaXIgbmFtZXMgYW5kIHN1cHBseWluZyBhIHZhbHVlLjwvbGk+CisgICAgICogPGxpPjxpPi1kaXJlY3RvcnkvLWQgJmx0O291dHB1dCBkaXJlY3RvcnkmZ3Q7PC9pPjogUGF0aCB0byB0aGUgYmFzZQorICAgICAqIHNvdXJjZSBkaXJlY3RvcnkuIFRoZSBwYWNrYWdlIHN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYmVuZWF0aAorICAgICAqIHRoaXMgZGlyZWN0b3J5IGlmIG5lY2Vzc2FyeS4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHRvb2wgd2lsbCB0cnkKKyAgICAgKiB0byBsb2NhdGUgdGhlIC5qYXZhIGZpbGUgaW4gdGhlIENMQVNTUEFUSCBhbmQgb3V0cHV0IHRvIHRoZSBzYW1lCisgICAgICogZGlyZWN0b3J5OyBmYWlsaW5nIHRoYXQsIGl0IHdpbGwgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcworICAgICAqIHRoZSBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKiA8bGk+PGk+LWlnbm9yZUVycm9ycy8taSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2k+OiBJZiBmYWxzZSwgYW4KKyAgICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIHRvb2wgZW5jb3VudGVycyBhbnkgY2xhc3MgdGhhdAorICAgICAqIGRvZXMgbm90IHVzZSBhcHBsaWNhdGlvbiBpZGVudGl0eSBvciB1c2VzIHRoZSBpZGVudGl0eSBjbGFzcyBvZgorICAgICAqIGl0cyBzdXBlcmNsYXNzOyBkZWZhdWx0cyB0byB0cnVlLjwvbGk+CisgICAgICogPGxpPjxpPi10b2tlbi8tdCAmbHQ7dG9rZW4mZ3Q7PC9pPjogVGhlIHRva2VuIHRvIHVzZSB0byBzZXBhcmF0ZQorICAgICAqIHN0aW5naWZpZWQgcHJpbWFyeSBrZXkgZmllbGQgdmFsdWVzIGluIHRoZSBzdHJpbmdpZmllZCBvaWQuPC9saT4KKyAgICAgKiA8bGk+PGk+LW5hbWUvLW4gJmx0O2lkIGNsYXNzIG5hbWUmZ3Q7PC9pPjogVGhlIG5hbWUgb2YgdGhlIGlkZW50aXR5CisgICAgICogY2xhc3MgdG8gZ2VuZXJhdGUuIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgeW91IG11c3Qgb25seQorICAgICAqIGdpdmUgYSBzaW5nbGUgY2xhc3MgYXJndW1lbnQuIElmIHRoZSBjbGFzcyBtZXRhZGF0YSBuYW1lcyBhbiBvYmplY3QKKyAgICAgKiBpZCBjbGFzcywgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLjwvbGk+CisgICAgICogPGxpPjxpPi1zdWZmaXgvLXMgJmx0O2lkIGNsYXNzIHN1ZmZpeCZndDs8L2k+OiBBIHN0cmluZyB0byBzdWZmaXggZWFjaAorICAgICAqIHBlcnNpc3RlbnQgY2xhc3Mgd2l0aCB0byBjcmVhdGUgdGhlIGlkZW50aXR5IGNsYXNzIG5hbWUuIFRoaXMgaXMKKyAgICAgKiBvdmVycmlkZGVuIGJ5IDxjb2RlPi1uYW1lPC9jb2RlPiBvciBieSBhbnkgaWRlbnRpdHkgY2xhc3MgbmFtZQorICAgICAqIHNwZWNpZmllZCBpbiBtZXRhZGF0YS48L2xpPgorICAgICAqIDxsaT48aT4tY29kZUZvcm1hdC8tY2YuJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDsgcHJvcGVydHkgdmFsdWUmZ3Q7PC9pPgorICAgICAqIDogQXJndW1lbnRzIGxpa2UgdGhpcyB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgaW50ZXJuYWwge0BsaW5rIENvZGVGb3JtYXR9LjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiAgRWFjaCBhZGRpdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBlaXRoZXIgdGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUKKyAgICAgKiB0eXBlIHRvIGNyZWF0ZSBhbiBpZCBjbGFzcyBmb3IsIHRoZSBwYXRoIHRvIHRoZSAuamF2YSBmaWxlIGZvciB0aGUgdHlwZSwKKyAgICAgKiB0aGUgcGF0aCB0byB0aGUgLmNsYXNzIGZpbGUgZm9yIHRoZSB0eXBlLCBvciB0aGUgcGF0aCB0byBhIC5qZG8gZmlsZQorICAgICAqIGxpc3Rpbmcgb25lIG9yIG1vcmUgdHlwZXMuIElmIGEgLmphdmEgZmlsZSBhbHJlYWR5IGV4aXN0cyBmb3IgYW4KKyAgICAgKiBhcHBsaWNhdGlvbiBpZCwgaXQgd2lsbCBiZSBiYWNrZWQgdXAgdG8gYSBmaWxlIG5hbWVkCisgICAgICogJmx0O29yaWcgZmlsZSBuYW1lJmd0O34uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgYXJncyA9IG9wdHMuc2V0RnJvbUNtZExpbmUoYXJncyk7CisgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXJ1bihjb25mLCBhcmdzLCBvcHRzKSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oX2xvYy5nZXQoImFwcGlkLXVzYWdlIikpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29uZi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBhcHBsaWNhdGlvbiBpZCB0b29sIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQtbGluZSBhbmQKKyAgICAgKiBnaXZlbiBjb25maWd1cmF0aW9uLiBSZXR1cm5zIGZhbHNlIGlmIGludmFsaWQgb3B0aW9ucyB3ZXJlIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgT3B0aW9ucyBvcHRzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAob3B0cy5jb250YWluc0tleSgiaGVscCIpIHx8IG9wdHMuY29udGFpbnNLZXkoIi1oZWxwIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgRmxhZ3MgZmxhZ3MgPSBuZXcgRmxhZ3MoKTsKKyAgICAgICAgZmxhZ3MuaWdub3JlRXJyb3JzID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiaWdub3JlRXJyb3JzIiwgImkiLCBmbGFncy5pZ25vcmVFcnJvcnMpOworICAgICAgICBmbGFncy5kaXJlY3RvcnkgPSBGaWxlcy5nZXRGaWxlKG9wdHMucmVtb3ZlUHJvcGVydHkoImRpcmVjdG9yeSIsICJkIiwKKyAgICAgICAgICAgIG51bGwpLCBudWxsKTsKKyAgICAgICAgZmxhZ3MudG9rZW4gPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJ0b2tlbiIsICJ0IiwgZmxhZ3MudG9rZW4pOworICAgICAgICBmbGFncy5uYW1lID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgibmFtZSIsICJuIiwgZmxhZ3MubmFtZSk7CisgICAgICAgIGZsYWdzLnN1ZmZpeCA9IG9wdHMucmVtb3ZlUHJvcGVydHkoInN1ZmZpeCIsICJzIiwgZmxhZ3Muc3VmZml4KTsKKworICAgICAgICAvLyBzZXBhcmF0ZSB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGN1c3RvbWl6ZXIgYW5kIGNvZGUgZm9ybWF0CisgICAgICAgIE9wdGlvbnMgZm9ybWF0T3B0cyA9IG5ldyBPcHRpb25zKCk7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgU3RyaW5nIGtleTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvcHRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCJjb2RlRm9ybWF0LiIpKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0T3B0cy5wdXQoa2V5LnN1YnN0cmluZygxMSksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoImNmLiIpKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0T3B0cy5wdXQoa2V5LnN1YnN0cmluZygzKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm9ybWF0T3B0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsYWdzLmZvcm1hdCA9IG5ldyBDb2RlRm9ybWF0KCk7CisgICAgICAgICAgICBmb3JtYXRPcHRzLnNldEludG8oZmxhZ3MuZm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIENvbmZpZ3VyYXRpb25zLnBvcHVsYXRlQ29uZmlndXJhdGlvbihjb25mLCBvcHRzKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY29uZi5nZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS4KKyAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKEFwcGxpY2F0aW9uSWRUb29sLmNsYXNzLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIHJ1bihjb25mLCBhcmdzLCBmbGFncywgbG9hZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRvb2wuIFJldHVybnMgZmFsc2UgaWYgaW52YWxpZCBvcHRpb25zIHdlcmUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBGbGFncyBmbGFncywgQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MgPSBjb25mLm5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgIHJlcG9zLnNldFZhbGlkYXRlKHJlcG9zLlZBTElEQVRFX05PTkUsIHRydWUpOworICAgICAgICBsb2FkT2JqZWN0SWRzKHJlcG9zLCBmbGFncy5uYW1lID09IG51bGwgJiYgZmxhZ3Muc3VmZml4ID09IG51bGwpOworCisgICAgICAgIExvZyBsb2cgPSBjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfVE9PTCk7CisgICAgICAgIENvbGxlY3Rpb24gY2xhc3NlczsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJydW5uaW5nLWFsbC1jbGFzc2VzIikpOworICAgICAgICAgICAgY2xhc3NlcyA9IHJlcG9zLmxvYWRQZXJzaXN0ZW50VHlwZXModHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENsYXNzQXJnUGFyc2VyIGNhcCA9IGNvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICBnZXRNZXRhRGF0YUZhY3RvcnkoKS5uZXdDbGFzc0FyZ1BhcnNlcigpOworICAgICAgICAgICAgY2FwLnNldENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICBjbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNhcC5wYXJzZVR5cGVzKGFyZ3NbaV0pKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzLm5hbWUgIT0gbnVsbCAmJiBjbGFzc2VzLnNpemUoKSA+IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibmFtZS1tdWx0LWFyZ3MiLCBjbGFzc2VzKSk7CisKKyAgICAgICAgQXBwbGljYXRpb25JZFRvb2wgdG9vbDsKKyAgICAgICAgQ2xhc3MgY2xzOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgIEJDQ2xhc3NMb2FkZXIgYmMgPSBuZXcgQkNDbGFzc0xvYWRlcihuZXcgUHJvamVjdCgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjbGFzc2VzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjbHMgPSAoQ2xhc3MpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgiYXBwaWQtcnVubmluZyIsIGNscykpOworCisgICAgICAgICAgICBtZXRhID0gcmVwb3MuZ2V0TWV0YURhdGEoY2xzLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBzZXRPYmplY3RJZFR5cGUobWV0YSwgZmxhZ3MsIGJjKTsKKworICAgICAgICAgICAgdG9vbCA9IG5ldyBBcHBsaWNhdGlvbklkVG9vbChjb25mLCBjbHMsIG1ldGEpOworICAgICAgICAgICAgdG9vbC5zZXREaXJlY3RvcnkoZmxhZ3MuZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIHRvb2wuc2V0SWdub3JlRXJyb3JzKGZsYWdzLmlnbm9yZUVycm9ycyk7CisgICAgICAgICAgICB0b29sLnNldFRva2VuKGZsYWdzLnRva2VuKTsKKyAgICAgICAgICAgIHRvb2wuc2V0Q29kZUZvcm1hdChmbGFncy5mb3JtYXQpOworICAgICAgICAgICAgaWYgKHRvb2wucnVuKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgiYXBwaWQtb3V0cHV0IiwgdG9vbC5nZXRGaWxlKCkpKTsKKyAgICAgICAgICAgICAgICB0b29sLnJlY29yZCgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoImFwcGlkLW5vcnVuIikpOworICAgICAgICB9CisgICAgICAgIGJjLmdldFByb2plY3QoKS5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBpZCB0eXBlIG9mIHRoZSBnaXZlbiBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldE9iamVjdElkVHlwZShDbGFzc01ldGFEYXRhIG1ldGEsIEZsYWdzIGZsYWdzLAorICAgICAgICBCQ0NsYXNzTG9hZGVyIGJjKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtZXRhID09IG51bGwgfHwgKG1ldGEuZ2V0T2JqZWN0SWRUeXBlKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgKCFtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkgfHwgZmxhZ3MubmFtZSA9PSBudWxsKSkKKyAgICAgICAgICAgIHx8IGdldERlY2xhcmVkUHJpbWFyeUtleUZpZWxkcyhtZXRhKS5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDbGFzcyBkZXNjID0gbWV0YS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgIENsYXNzIGNscyA9IG51bGw7CisgICAgICAgIGlmIChmbGFncy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICBjbHMgPSBsb2FkQ2xhc3MoZGVzYywgZmxhZ3MubmFtZSwgYmMpOworICAgICAgICBlbHNlIGlmIChmbGFncy5zdWZmaXggIT0gbnVsbCkKKyAgICAgICAgICAgIGNscyA9IGxvYWRDbGFzcyhkZXNjLCBkZXNjLmdldE5hbWUoKSArIGZsYWdzLnN1ZmZpeCwgYmMpOworICAgICAgICBtZXRhLnNldE9iamVjdElkVHlwZShjbHMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBjbGFzcyBuYW1lIGV2ZW4gaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKENsYXNzIGNvbnRleHQsIFN0cmluZyBuYW1lLAorICAgICAgICBCQ0NsYXNzTG9hZGVyIGJjKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA9PSAtMSAmJiBjb250ZXh0LmdldE5hbWUoKS5pbmRleE9mKCcuJykgIT0gLTEpCisgICAgICAgICAgICBuYW1lID0gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShjb250ZXh0KSArICIuIiArIG5hbWU7CisKKyAgICAgICAgLy8gZmlyc3QgdHJ5IHdpdGggcmVndWxhciBjbGFzcyBsb2FkZXIKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY29udGV4dC5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGxvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgY2xhc3MKKyAgICAgICAgQkNDbGFzcyBvaWQgPSBiYy5nZXRQcm9qZWN0KCkubG9hZENsYXNzKG5hbWUsIG51bGwpOworICAgICAgICBvaWQuYWRkRGVmYXVsdENvbnN0cnVjdG9yKCk7CisgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBiYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgbWV0YWRhdGEgZmFjdG9yeSB0byBsb2FkIG9iamVjdCBpZCBjbGFzc2VzIGV2ZW4gaWYgdGhleSBkb24ndAorICAgICAqIGV4aXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZE9iamVjdElkcyhNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgTWV0YURhdGFGYWN0b3J5IG1kZiA9IHJlcG9zLmdldE1ldGFEYXRhRmFjdG9yeSgpOworICAgICAgICBpZiAobWRmIGluc3RhbmNlb2YgRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeSkKKyAgICAgICAgICAgIG1kZiA9ICgoRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeSkgbWRmKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICBpZiAobWRmIGluc3RhbmNlb2YgT2JqZWN0SWRMb2FkZXIpCisgICAgICAgICAgICAoKE9iamVjdElkTG9hZGVyKSBtZGYpLnNldExvYWRPYmplY3RJZHMoKTsKKyAgICAgICAgZWxzZSBpZiAoZmF0YWwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJmYWN0b3J5LW5vdC1vaWRsb2FkZXIiKSkuCisgICAgICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxhZ3MgeworCisgICAgICAgIHB1YmxpYyBGaWxlIGRpcmVjdG9yeSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlnbm9yZUVycm9ycyA9IHRydWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9rZW4gPSBUT0tFTl9ERUZBVUxUOworICAgICAgICBwdWJsaWMgQ29kZUZvcm1hdCBmb3JtYXQgPSBudWxsOworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBwdWJsaWMgU3RyaW5nIHN1ZmZpeCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IG1ldGFkYXRhIGZhY3RvcmllcyB0aGF0IGNhbiBsb2FkIG5vbi1leGlzdGFudAorICAgICAqIG9iamVjdCBpZCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9iamVjdElkTG9hZGVyCisJeworCQkvKioKKwkJICogVHVybiBvbiB0aGUgbG9hZGluZyBvZiBhbGwgaWRlbnRpdHkgY2xhc3NlcywgZXZlbiBpZiB0aGV5IGRvbid0IAorICAgICAgICAgKiBleGlzdC4KKwkgCSAqLworCQlwdWJsaWMgdm9pZCBzZXRMb2FkT2JqZWN0SWRzICgpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9Db2RlR2VuZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvQ29kZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTM5MDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvQ29kZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ29kZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlBhcmFtZXRlclRlbXBsYXRlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogR2VuZXJhdGVzIEphdmEgY2xhc3MgY29kZSBmcm9tIG1ldGFkYXRhLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFN0ZXBoZW4gS2ltCisgKiBAc2luY2UgMC4zLjAKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIENvZGVHZW5lcmF0b3IgeworCisgICAgcHJpdmF0ZSBGaWxlIF9kaXIgPSBudWxsOworICAgIHByaXZhdGUgQ29kZUZvcm1hdCBfZm9ybWF0ID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX3R5cGUgPSBudWxsOworICAgIHByaXZhdGUgUGFyYW1ldGVyVGVtcGxhdGUgX2NvZGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBjb25maWd1cmF0aW9uIGFuZCBjbGFzcyB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUdlbmVyYXRvcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHRoaXMoY29uZi5uZXdNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGEodHlwZSwgbnVsbCwgdHJ1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbiBhbmQgbWV0YWRhdGEgdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgICAgICovCisgICAgcHVibGljIENvZGVHZW5lcmF0b3IoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICAgICAgX3R5cGUgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHNvdXJjZSB0by4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAqIElmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2Ugb2YgdGhlIG1ldGFkYXRhLCB0aGUKKyAgICAgKiBwYWNrYWdlIHN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYmVsb3cgdGhlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRDb2RlRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gX2RpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHNvdXJjZSB0by4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAqIElmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2Ugb2YgdGhlIG1ldGFkYXRhLCB0aGUKKyAgICAgKiBwYWNrYWdlIHN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYmVsb3cgdGhlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoRmlsZSBkaXIpIHsKKyAgICAgICAgX2RpciA9IGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29kZSBmb3JtYXR0ZXIgZm9yIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IGdldENvZGVGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBfZm9ybWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29kZSBmb3JtYXR0ZXIgZm9yIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvZGVGb3JtYXQoQ29kZUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR5cGUgYmVpbmcgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3R5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG1ldGFkYXRhIGZvciB0aGUgdHlwZSBiZWluZyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbWV0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdlbmVyYXRlZCBjb2RlLCBvciBudWxsIGlmIHtAbGluayAjZ2VuZXJhdGVDb2RlfSBoYXMgbm90CisgICAgICogYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb2RlKCkgeworICAgICAgICByZXR1cm4gKF9jb2RlID09IG51bGwpID8gbnVsbCA6IF9jb2RlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBnZW5lcmF0ZWQgY29kZSB0byB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoKSB7CisgICAgICAgIC8vIHNldHVwIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKF90eXBlKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShfdHlwZSk7CisgICAgICAgIFN0cmluZyBwYWNrYWdlRGVjID0gIiI7CisgICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBwYWNrYWdlRGVjID0gInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjsiOworCisgICAgICAgIFN0cmluZyBleHRlbmRzRGVjID0gIiI7CisgICAgICAgIFN0cmluZyBleHRlbmRzTmFtZSA9ICIiOworICAgICAgICBpZiAoIV90eXBlLmdldFN1cGVyY2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBleHRlbmRzTmFtZSA9IFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKF90eXBlLmdldFN1cGVyY2xhc3MoKSk7CisgICAgICAgICAgICBleHRlbmRzRGVjID0gImV4dGVuZHMgIiArIGV4dGVuZHNOYW1lOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGltcG9ydHMgPSBnZXRJbXBvcnRzKCk7CisgICAgICAgIFN0cmluZ1tdIGZpZWxkQ29kZSA9IGdldEZpZWxkQ29kZSgpOworICAgICAgICBTdHJpbmcgY29uc3RydWN0b3IgPSBnZXRDb25zdHJ1Y3RvcigpOworCisgICAgICAgIC8vIGdldCBjb2RlIHRlbXBsYXRlCisgICAgICAgIF9jb2RlID0gbmV3IFBhcmFtZXRlclRlbXBsYXRlKCk7CisgICAgICAgIFN0cmluZyBjb2RlU3RyID0gZ2V0Q2xhc3NDb2RlKCk7CisgICAgICAgIGlmIChjb2RlU3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9jb2RlLmFwcGVuZChjb2RlU3RyKTsKKyAgICAgICAgICAgIF9jb2RlLnNldFBhcmFtZXRlcigicGFja2FnZURlYyIsIHBhY2thZ2VEZWMpOworICAgICAgICAgICAgX2NvZGUuc2V0UGFyYW1ldGVyKCJpbXBvcnRzIiwgaW1wb3J0cyk7CisgICAgICAgICAgICBfY29kZS5zZXRQYXJhbWV0ZXIoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7CisgICAgICAgICAgICBfY29kZS5zZXRQYXJhbWV0ZXIoImV4dGVuZHNEZWMiLCBleHRlbmRzRGVjKTsKKyAgICAgICAgICAgIF9jb2RlLnNldFBhcmFtZXRlcigiY29uc3RydWN0b3IiLCBjb25zdHJ1Y3Rvcik7CisgICAgICAgICAgICBfY29kZS5zZXRQYXJhbWV0ZXIoImZpZWxkRGVjcyIsIGZpZWxkQ29kZVswXSk7CisgICAgICAgICAgICBfY29kZS5zZXRQYXJhbWV0ZXIoImZpZWxkQ29kZSIsIGZpZWxkQ29kZVsxXSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX2NvZGUuYXBwZW5kKGdldENsYXNzQ29kZShwYWNrYWdlRGVjLCBpbXBvcnRzLCBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgZXh0ZW5kc05hbWUsIGNvbnN0cnVjdG9yLCBmaWVsZENvZGVbMF0sIGZpZWxkQ29kZVsxXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBnZW5lcmF0ZWQgY29kZSB0byB0aGUgcHJvcGVyIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVDb2RlKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9jb2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRmlsZSBmaWxlID0gZ2V0RmlsZSgpOworICAgICAgICBGaWxlcy5iYWNrdXAoZmlsZSwgZmFsc2UpOworICAgICAgICBfY29kZS53cml0ZShmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29kZSB0byB0aGUgc3BlY2lmaWVkIHtAbGluayBXcml0ZXJ9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29kZShXcml0ZXIgb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoX2NvZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBfY29kZS53cml0ZShvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmVjZXNzYXJ5IGltcG9ydHMgZm9yIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRJbXBvcnRzKCkgeworICAgICAgICBTZXQgcGtncyA9IGdldEltcG9ydFBhY2thZ2VzKCk7CisKKyAgICAgICAgQ29kZUZvcm1hdCBpbXBvcnRzID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBTdHJpbmcgYmFzZSA9IFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoX3R5cGUpOworICAgICAgICBTdHJpbmcgcGtnOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHBrZ3MuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHBrZyA9IChTdHJpbmcpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAocGtnLmxlbmd0aCgpID4gMCAmJiAhImphdmEubGFuZyIuZXF1YWxzKHBrZykKKyAgICAgICAgICAgICAgICAmJiAhYmFzZS5lcXVhbHMocGtnKSkgeworICAgICAgICAgICAgICAgIGlmIChpbXBvcnRzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0cy5lbmRsKCk7CisgICAgICAgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQocGtnKS5hcHBlbmQoIi4qOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbXBvcnRzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHBhY2thZ2VzIHRoYXQgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgZm9yIHRoaXMgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0IGdldEltcG9ydFBhY2thZ2VzKCkgeworICAgICAgICBTZXQgcGtncyA9IG5ldyBUcmVlU2V0KCk7CisgICAgICAgIHBrZ3MuYWRkKFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoX3R5cGUuZ2V0U3VwZXJjbGFzcygpKSk7CisKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcGtncy5hZGQoU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShmaWVsZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkpKTsKKworICAgICAgICBmaWVsZHMgPSBfbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcGtncy5hZGQoU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShmaWVsZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkpKTsKKworICAgICAgICByZXR1cm4gcGtnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY29kZSBmb3IgYSBwcmltYXJ5IGtleSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldENvbnN0cnVjdG9yKCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZmllbGRzID0gX21ldGEuZ2V0UHJpbWFyeUtleUZpZWxkcygpOworICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgIENvZGVGb3JtYXQgY29ucyA9IG5ld0NvZGVGb3JtYXQoKTsKKyAgICAgICAgQ29kZUZvcm1hdCBib2R5ID0gbmV3Q29kZUZvcm1hdCgpOworCisgICAgICAgIC8vIHB1YmxpYyA8Y2xhc3M+ICgKKyAgICAgICAgY29ucy50YWIoKS5hcHBlbmQoInB1YmxpYyAiKS5hcHBlbmQoU3RyaW5ncy5nZXRDbGFzc05hbWUoX3R5cGUpKTsKKyAgICAgICAgY29ucy5vcGVuUGFyZW4odHJ1ZSk7CisKKyAgICAgICAgLy8gYXBwZW5kIGFyZ3MgdG8gY29uc3RydWN0b3IsIGFuZCBidWlsZCB1cCBib2R5IGF0IHNhbWUgdGltZQorICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lOworICAgICAgICBTdHJpbmcgZmllbGRUeXBlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiXyIpKQorICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBmaWVsZFR5cGUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShmaWVsZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkpOworCisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgY29ucy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBjb25zLmFwcGVuZChmaWVsZFR5cGUpLmFwcGVuZCgiICIpLmFwcGVuZChwcm9wZXJ0eU5hbWUpOworCisgICAgICAgICAgICBpZiAoX21ldGEuZ2V0UENTdXBlcmNsYXNzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYm9keS5lbmRsKCk7CisgICAgICAgICAgICAgICAgYm9keS50YWIoMik7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoZmllbGRzW2ldLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCJ0aGlzLiIpOworICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKGZpZWxkc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCIgPSAiKS5hcHBlbmQocHJvcGVydHlOYW1lKS5hcHBlbmQoIjsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc3VwZXIgKC4uLik7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYm9keS50YWIoMikuYXBwZW5kKCJzdXBlciIpLm9wZW5QYXJlbih0cnVlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gZmllbGRzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgICAgIGJvZHkuY2xvc2VQYXJlbigpLmFwcGVuZCgiOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnMuY2xvc2VQYXJlbigpOworCisgICAgICAgIGNvbnMub3BlbkJyYWNlKDIpLmVuZGwoKTsKKyAgICAgICAgY29ucy5hcHBlbmQoYm9keS50b1N0cmluZygpKS5lbmRsKCk7CisgICAgICAgIGNvbnMuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgcmV0dXJuIGNvbnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIGRlY2xhcmF0aW9uIGFuZCBhY2Nlc3MgbWV0aG9kIGNvZGUgZm9yIGFsbCBkZWNsYXJlZAorICAgICAqIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGdldEZpZWxkQ29kZSgpIHsKKyAgICAgICAgQ29kZUZvcm1hdCBkZWNzID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBDb2RlRm9ybWF0IGNvZGUgPSBuZXdDb2RlRm9ybWF0KCk7CisKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXBwZW5kRmllbGRDb2RlKGZpZWxkc1tpXSwgZGVjcywgY29kZSk7CisgICAgICAgIGZpZWxkcyA9IF9tZXRhLmdldERlY2xhcmVkVW5tYW5hZ2VkRmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXBwZW5kRmllbGRDb2RlKGZpZWxkc1tpXSwgZGVjcywgY29kZSk7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117IGRlY3MudG9TdHJpbmcoKSwgY29kZS50b1N0cmluZygpIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBkZWNsYXJhdGlvbiBhbmQgY29kZSBmb3IgdGhlIGdpdmVuIGZpZWxkIHRvIHRoZSBnaXZlbiBidWZmZXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRGaWVsZENvZGUoRmllbGRNZXRhRGF0YSBmbWQsIENvZGVGb3JtYXQgZGVjcywKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlKSB7CisgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSBmbWQuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgY2FwRmllbGROYW1lID0gU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShmaWVsZE5hbWUpOworICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZmllbGROYW1lOworICAgICAgICBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIl8iKSkKKyAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIFN0cmluZyBmaWVsZFR5cGUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShmbWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworCisgICAgICAgIFN0cmluZyBmaWVsZFZhbHVlID0gZ2V0SW5pdGlhbFZhbHVlKGZtZCk7CisgICAgICAgIGlmIChmaWVsZFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgiU2V0Ii5lcXVhbHMoZmllbGRUeXBlKSkKKyAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gIm5ldyBIYXNoU2V0IiArIGRlY3MuZ2V0UGFyZW5zKCk7CisgICAgICAgICAgICBlbHNlIGlmICgiVHJlZVNldCIuZXF1YWxzKGZpZWxkVHlwZSkpCisgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9ICJuZXcgVHJlZVNldCIgKyBkZWNzLmdldFBhcmVucygpOworICAgICAgICAgICAgZWxzZSBpZiAoIkNvbGxlY3Rpb24iLmVxdWFscyhmaWVsZFR5cGUpKQorICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSAibmV3IEFycmF5TGlzdCIgKyBkZWNzLmdldFBhcmVucygpOworICAgICAgICAgICAgZWxzZSBpZiAoIk1hcCIuZXF1YWxzKGZpZWxkVHlwZSkpCisgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9ICJuZXcgSGFzaE1hcCIgKyBkZWNzLmdldFBhcmVucygpOworICAgICAgICAgICAgZWxzZSBpZiAoIlRyZWVNYXAiLmVxdWFscyhmaWVsZFR5cGUpKQorICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSAibmV3IFRyZWVNYXAiICsgZGVjcy5nZXRQYXJlbnMoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkNPTExFQ1RJT04KKyAgICAgICAgICAgICAgICB8fCBmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5NQVApCisgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9ICJuZXcgIiArIGZpZWxkVHlwZSArIGRlY3MuZ2V0UGFyZW5zKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChmaWVsZFZhbHVlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGZpZWxkVmFsdWUgPSAiID0gIiArIGZpZWxkVmFsdWU7CisKKyAgICAgICAgU3RyaW5nIGN1c3RvbSA9IGdldERlY2xhcmF0aW9uKGZtZCk7CisgICAgICAgIGlmIChkZWNzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGRlY3MuZW5kbCgpOworICAgICAgICBQYXJhbWV0ZXJUZW1wbGF0ZSB0ZW1wbDsKKyAgICAgICAgaWYgKGN1c3RvbSAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZW1wbCA9IG5ldyBQYXJhbWV0ZXJUZW1wbGF0ZSgpOworICAgICAgICAgICAgdGVtcGwuYXBwZW5kKGN1c3RvbSk7CisgICAgICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImZpZWxkTmFtZSIsIGZpZWxkTmFtZSk7CisgICAgICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImNhcEZpZWxkTmFtZSIsIGNhcEZpZWxkTmFtZSk7CisgICAgICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoInByb3BlcnR5TmFtZSIsIHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImZpZWxkVHlwZSIsIGZpZWxkVHlwZSk7CisgICAgICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImZpZWxkVmFsdWUiLCBmaWVsZFZhbHVlKTsKKyAgICAgICAgICAgIGRlY3MuYXBwZW5kKHRlbXBsLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjcy50YWIoKS5hcHBlbmQoInByaXZhdGUgIikuYXBwZW5kKGZpZWxkVHlwZSkuCisgICAgICAgICAgICAgICAgYXBwZW5kKCIgIikuYXBwZW5kKGZpZWxkTmFtZSkuYXBwZW5kKGZpZWxkVmFsdWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiOyIpOworICAgICAgICB9CisKKyAgICAgICAgY3VzdG9tID0gZ2V0RmllbGRDb2RlKGZtZCk7CisgICAgICAgIGlmIChjb2RlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCk7CisgICAgICAgIGlmIChjdXN0b20gIT0gbnVsbCkgeworICAgICAgICAgICAgdGVtcGwgPSBuZXcgUGFyYW1ldGVyVGVtcGxhdGUoKTsKKyAgICAgICAgICAgIHRlbXBsLmFwcGVuZChjdXN0b20pOworICAgICAgICAgICAgdGVtcGwuc2V0UGFyYW1ldGVyKCJmaWVsZE5hbWUiLCBmaWVsZE5hbWUpOworICAgICAgICAgICAgdGVtcGwuc2V0UGFyYW1ldGVyKCJjYXBGaWVsZE5hbWUiLCBjYXBGaWVsZE5hbWUpOworICAgICAgICAgICAgdGVtcGwuc2V0UGFyYW1ldGVyKCJwcm9wZXJ0eU5hbWUiLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgdGVtcGwuc2V0UGFyYW1ldGVyKCJmaWVsZFR5cGUiLCBmaWVsZFR5cGUpOworICAgICAgICAgICAgdGVtcGwuc2V0UGFyYW1ldGVyKCJmaWVsZFZhbHVlIiwgZmllbGRWYWx1ZSk7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCh0ZW1wbC50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGdldHRlcgorICAgICAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInB1YmxpYyAiKS5hcHBlbmQoZmllbGRUeXBlKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzSWdub3JlQ2FzZShmaWVsZFR5cGUpKQorICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJpcyIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJnZXQiKTsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKGNhcEZpZWxkTmFtZSkucGFyZW5zKCk7CisgICAgICAgICAgICBjb2RlLm9wZW5CcmFjZSgyKS5lbmRsKCk7CisgICAgICAgICAgICBjb2RlLnRhYigyKS5hcHBlbmQoInJldHVybiAiKS5hcHBlbmQoZmllbGROYW1lKS4KKyAgICAgICAgICAgICAgICBhcHBlbmQoIjsiKS5lbmRsKCk7CisgICAgICAgICAgICBjb2RlLmNsb3NlQnJhY2UoMikuYWZ0ZXJTZWN0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIHNldHRlcgorICAgICAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInB1YmxpYyB2b2lkIHNldCIpLmFwcGVuZChjYXBGaWVsZE5hbWUpOworICAgICAgICAgICAgY29kZS5vcGVuUGFyZW4odHJ1ZSkuYXBwZW5kKGZpZWxkVHlwZSkuYXBwZW5kKCIgIikuCisgICAgICAgICAgICAgICAgYXBwZW5kKHByb3BlcnR5TmFtZSkuY2xvc2VQYXJlbigpOworICAgICAgICAgICAgY29kZS5vcGVuQnJhY2UoMikuZW5kbCgpOworICAgICAgICAgICAgY29kZS50YWIoMik7CisgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhmaWVsZE5hbWUpKQorICAgICAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJ0aGlzLiIpOworICAgICAgICAgICAgY29kZS5hcHBlbmQoZmllbGROYW1lKS5hcHBlbmQoIiA9ICIpLmFwcGVuZChwcm9wZXJ0eU5hbWUpLgorICAgICAgICAgICAgICAgIGFwcGVuZCgiOyIpLmVuZGwoKTsKKyAgICAgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvZGUgdGVtcGxhdGUgZm9yIGEgZ2VuZXJhdGVkIEphdmEgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NDb2RlKFN0cmluZyBwYWNrYWdlRGVjLCBTdHJpbmcgaW1wb3J0cywKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGV4dGVuZHNOYW1lLCBTdHJpbmcgY29uc3RydWN0b3IsCisgICAgICAgIFN0cmluZyBmaWVsZERlY3MsIFN0cmluZyBmaWVsZENvZGUpIHsKKyAgICAgICAgQ29kZUZvcm1hdCBjb2RlID0gbmV3Q29kZUZvcm1hdCgpOworICAgICAgICBpZiAocGFja2FnZURlYy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb2RlLmFwcGVuZChwYWNrYWdlRGVjKS5hZnRlclNlY3Rpb24oKTsKKyAgICAgICAgaWYgKGltcG9ydHMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgY29kZS5hcHBlbmQoaW1wb3J0cykuYWZ0ZXJTZWN0aW9uKCk7CisKKyAgICAgICAgY29kZS5hcHBlbmQoIi8qKiIpLmVuZGwoKS4KKyAgICAgICAgICAgIGFwcGVuZCgiICogQXV0by1nZW5lcmF0ZWQgYnk6IikuZW5kbCgpLgorICAgICAgICAgICAgYXBwZW5kKCIgKiAiKS5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmVuZGwoKS4KKyAgICAgICAgICAgIGFwcGVuZCgiICovIikuZW5kbCgpOworCisgICAgICAgIGNvZGUuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKGNsYXNzTmFtZSk7CisgICAgICAgIGlmIChleHRlbmRzTmFtZS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb2RlLmV4dGVuZHNEZWMoMSkuYXBwZW5kKCIgIikuYXBwZW5kKGV4dGVuZHNOYW1lKTsKKyAgICAgICAgb3BlbkNsYXNzQnJhY2UoY29kZSk7CisKKyAgICAgICAgaWYgKGZpZWxkRGVjcy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb2RlLmFwcGVuZChmaWVsZERlY3MpLmFmdGVyU2VjdGlvbigpOworCisgICAgICAgIC8vIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICAgY29kZS50YWIoKS5hcHBlbmQoInB1YmxpYyAiKS5hcHBlbmQoY2xhc3NOYW1lKS5wYXJlbnMoKTsKKyAgICAgICAgY29kZS5vcGVuQnJhY2UoMikuZW5kbCgpLmNsb3NlQnJhY2UoMik7CisKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIGNvZGUuYWZ0ZXJTZWN0aW9uKCkuYXBwZW5kKGNvbnN0cnVjdG9yKTsKKyAgICAgICAgaWYgKGZpZWxkQ29kZS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb2RlLmFmdGVyU2VjdGlvbigpLmFwcGVuZChmaWVsZENvZGUpOworICAgICAgICBjb2RlLmVuZGwoKTsKKworICAgICAgICBjbG9zZUNsYXNzQnJhY2UoY29kZSk7CisKKyAgICAgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIG9wZW5pbmcgY29kZS1sZXZlbCBicmFjZSB0byB0aGUgY29kZTsgdGhpcyBjYW4gYmUKKyAgICAgKiBvdmVycmlkZGVuIHRvIGFkZCBjb2RlIHRvIHRoZSB0b3Agb2YgdGhlIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG9wZW5DbGFzc0JyYWNlKENvZGVGb3JtYXQgY29kZSkgeworICAgICAgICBjb2RlLm9wZW5CcmFjZSgxKS5lbmRsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBjbG9zaW5nIGNvZGUtbGV2ZWwgYnJhY2UgdG8gdGhlIGNvZGU7IHRoaXMgY2FuIGJlCisgICAgICogb3ZlcnJpZGRlbiB0byBhZGQgY29kZSB0byB0aGUgYm90dG9tIG9mIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUNsYXNzQnJhY2UoQ29kZUZvcm1hdCBjb2RlKSB7CisgICAgICAgIGNvZGUuY2xvc2VCcmFjZSgxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gSmF2YSBmaWxlIHRvIHdyaXRlIHRvLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoX3R5cGUpOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShfdHlwZSkgKyAiLmphdmEiOworCisgICAgICAgIEZpbGUgZGlyID0gRmlsZXMuZ2V0UGFja2FnZUZpbGUoX2RpciwgcGFja2FnZU5hbWUsIHRydWUpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgY29kZSBmb3JtYXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvZGVGb3JtYXQgbmV3Q29kZUZvcm1hdCgpIHsKKyAgICAgICAgaWYgKF9mb3JtYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29kZUZvcm1hdCgpOworICAgICAgICByZXR1cm4gKENvZGVGb3JtYXQpIF9mb3JtYXQuY2xvbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2RlIHRlbXBsYXRlIGZvciB0aGUgZ2l2ZW4gY2xhc3MsIG9yIG51bGwgdG8gdXNlIHRoZSBzdGFuZGFyZAorICAgICAqIHN5c3RlbS1nZW5lcmF0ZWQgSmF2YSBjb2RlLiBUbyBmYWNpbGl0YXRlIHRlbXBsYXRlIHJldXNlLCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluIHRoZSB0ZW1wbGF0ZTsgdGhlIHByb3BlciB2YWx1ZXMKKyAgICAgKiB3aWxsIGJlIHN1YnRpdHV0ZWQgYnkgdGhlIHN5c3RlbToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiR7cGFja2FnZURlY306IFRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uLCBpbiB0aGUgZm9ybQorICAgICAqICJwYWNrYWdlICZsdDtwYWNrYWdlIG5hbWUgJmd0OzsiLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gcGFja2FnZS48L2xpPgorICAgICAqIDxsaT4ke2ltcG9ydHN9OiBJbXBvcnRzIGZvciB0aGUgcGFja2FnZXMgdXNlZCBieSB0aGUgZGVjbGFyZWQKKyAgICAgKiBmaWVsZCB0eXBlcy48L2xpPgorICAgICAqIDxsaT4ke2NsYXNzTmFtZX06IFRoZSBuYW1lIG9mIHRoZSBjbGFzcywgd2l0aG91dCBwYWNrYWdlLjwvbGk+CisgICAgICogPGxpPiR7ZXh0ZW5kc0RlY306IEV4dGVuZHMgZGVjbGFyYXRpb24sIGluIHRoZSBmb3JtCisgICAgICogImV4dGVuZHMgJmx0O3N1cGVyY2xhc3MmZ3Q7Iiwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIHN1cGVyY2xhc3MuPC9saT4KKyAgICAgKiA8bGk+JHtjb25zdHJ1Y3Rvcn06IEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBpbiBhbGwgcHJpbWFyeSBrZXkgZmllbGRzCisgICAgICogb2YgdGhlIGNsYXNzLCBvciBlbXB0eSBzdHJpbmcgaWYgdGhlIGNsYXNzIHVzZXMgZGF0YXN0b3JlIGlkZW50aXR5LjwvbGk+CisgICAgICogPGxpPiR7ZmllbGREZWNzfTogRGVjbGFyYXRpb25zIG9mIGFsbCB0aGUgZGVjbGFyZWQgZmllbGRzLjwvbGk+CisgICAgICogPGxpPiR7ZmllbGRDb2RlfTogR2V0L3NldCBtZXRob2RzIGZvciBhbGwgdGhlIGRlY2xhcmVkIGZpZWxkcy48L2xpPgorICAgICAqIDwvdWw+IFJldHVybnMgbnVsbCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb2RlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY29kZSBmb3IgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCwgb3IgbnVsbCB0byB1c2UKKyAgICAgKiB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgYnkgdGhlIHN5c3RlbS4gUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsVmFsdWUoRmllbGRNZXRhRGF0YSBmaWVsZCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2RlIHRlbXBsYXRlIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGdpdmVuIGZpZWxkLCBvciBudWxsCisgICAgICogdG8gdXNlIHRoZSBzeXN0ZW0tZ2VuZXJhdGVkIGRlZmF1bHQgSmF2YSBjb2RlLgorICAgICAqIFRvIGZhY2lsaXRhdGUgdGVtcGxhdGUgcmV1c2UsIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluCisgICAgICogeW91ciB0ZW1wbGF0ZTsgdGhlIHByb3BlciB2YWx1ZXMgd2lsbCBiZSBzdWJ0aXR1dGVkIGJ5IHRoZSBzeXN0ZW06CisgICAgICogPHVsPgorICAgICAqIDxsaT4ke2ZpZWxkTmFtZX06IFRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L2xpPgorICAgICAqIDxsaT4ke2NhcEZpZWxkTmFtZX06IFRoZSBjYXBpdGFsaXplZCBmaWVsZCBuYW1lLjwvbGk+CisgICAgICogPGxpPiR7cHJvcGVydHlOYW1lfTogVGhlIGZpZWxkIG5hbWUgd2l0aG91dCBsZWFkaW5nICdfJywgaWYgYW55LjwvbGk+CisgICAgICogPGxpPiR7ZmllbGRUeXBlfTogVGhlIGZpZWxkJ3MgdHlwZSBuYW1lLjwvbGk+CisgICAgICogPGxpPiR7ZmllbGRWYWx1ZX06IFRoZSBmaWVsZCdzIGluaXRpYWwgdmFsdWUsIGluIHRoZSBmb3JtCisgICAgICogIiA9ICZsdDt2YWx1ZSZndDsiLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS48L2xpPgorICAgICAqIDwvdWw+IFJldHVybnMgbnVsbCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oRmllbGRNZXRhRGF0YSBmaWVsZCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2RlIHRlbXBsYXRlIGZvciB0aGUgZ2V0L3NldCBtZXRob2RzIG9mIHRoZSBnaXZlbiBmaWVsZCwgb3IKKyAgICAgKiBudWxsIHRvIHVzZSB0aGUgc3lzdGVtLWdlbmVyYXRlZCBkZWZhdWx0IEphdmEgY29kZS4KKyAgICAgKiBUbyBmYWNpbGl0YXRlIHRlbXBsYXRlIHJldXNlLCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGFwcGVhciBpbgorICAgICAqIHlvdXIgdGVtcGxhdGU7IHRoZSBwcm9wZXIgdmFsdWVzIHdpbGwgYmUgc3VidGl0dXRlZCBieSB0aGUgc3lzdGVtOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+JHtmaWVsZE5hbWV9OiBUaGUgbmFtZSBvZiB0aGUgZmllbGQuPC9saT4KKyAgICAgKiA8bGk+JHtjYXBGaWVsZE5hbWV9OiBUaGUgY2FwaXRhbGl6ZWQgZmllbGQgbmFtZS48L2xpPgorICAgICAqIDxsaT4ke3Byb3BlcnR5TmFtZX06IFRoZSBmaWVsZCBuYW1lIHdpdGhvdXQgbGVhZGluZyAnXycsIGlmIGFueS48L2xpPgorICAgICAqIDxsaT4ke2ZpZWxkVHlwZX06IFRoZSBmaWVsZCdzIHR5cGUgbmFtZS48L2xpPgorICAgICAqIDxsaT4ke2ZpZWxkVmFsdWV9OiBUaGUgZmllbGQncyBpbml0aWFsIHZhbHVlLCBpbiB0aGUgZm9ybQorICAgICAqICI9ICZsdDt2YWx1ZSZndDsiLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZENvZGUgKEZpZWxkTWV0YURhdGEgZmllbGQpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvRHluYW1pY1N0b3JhZ2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9EeW5hbWljU3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmM2MDMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvRHluYW1pY1N0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBjbGFzc2VzLiBDZXJ0YWluIGdldHRlcnMvc2V0dGVycworICogbWF5IGVpdGhlciByZXR1cm4gbnVsbCBvciB0aHJvdyBhbiBleGNlcHRpb24gZGVwZW5kaW5nIG9uIHRoZQorICoge0BsaW5rIER5bmFtaWNTdG9yYWdlR2VuZXJhdG9yfSdzIGZpZWxkIHBvbGljeS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQG5vamF2YWRvYworICogQHNpbmNlIDAuMy4yLjAKKyAqLworcHVibGljIGludGVyZmFjZSBEeW5hbWljU3RvcmFnZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWVsZHMsIHJlZ2FyZGxlc3Mgb2YgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RmllbGRDb3VudCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0IGZpZWxkcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0T2JqZWN0Q291bnQoKTsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIGZvciBnZXR0aW5nIG5ldyBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHluYW1pY1N0b3JhZ2UgbmV3SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYm9vbGVhbiBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBib29sZWFuIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGludCBmaWVsZCwgYm9vbGVhbiB2YWwpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBieXRlIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGUoaW50IGZpZWxkLCBieXRlIHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNoYXIgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBjaGFyIGdldENoYXIoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2hhciBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcihpbnQgZmllbGQsIGNoYXIgdmFsKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZG91YmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShpbnQgZmllbGQsIGRvdWJsZSB2YWwpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZsb2F0IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdChpbnQgZmllbGQsIGZsb2F0IHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGludCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnQoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW50IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IGZpZWxkLCBpbnQgdmFsKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbG9uZyBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb25nIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb25nKGludCBmaWVsZCwgbG9uZyB2YWwpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaG9ydCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldFNob3J0KGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNob3J0IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChpbnQgZmllbGQsIHNob3J0IHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoaW50IGZpZWxkLCBPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIEVuc3VyZSBvYmplY3QgY2FwYWNpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplICgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0R5bmFtaWNTdG9yYWdlR2VuZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvRHluYW1pY1N0b3JhZ2VHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkyNmMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0R5bmFtaWNTdG9yYWdlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0NsYXNzTG9hZGVyOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNGaWVsZDsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDTWV0aG9kOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQ29kZTsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkNvbnN0YW50czsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuSnVtcEluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuTG9hZEluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuUHJvamVjdDsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLlRhYmxlU3dpdGNoSW5zdHJ1Y3Rpb247CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IHtAbGluayBEeW5hbWljU3RvcmFnZX0gY2xhc3Nlcy4gQ2FuIGJlCisgKiBleHRlbmRlZCB0byBkZWNvcmF0ZS9tb2RpZnkgdGhlIGdlbmVyYXRlZCBpbnN0YW5jZXMgYmVoYXZpb3IuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjMuMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljU3RvcmFnZUdlbmVyYXRvciB7CisKKyAgICAvLyBwcmVmaXggZm9yIGdlbmVyaWMgZ2VuZXJhdGVkIGNsYXNzZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcGVuanBhc3RvcmFnZSQiOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGludmFsaWQgaW5kZXggcGFzc2VkIHRvIHR5cGUgc2V0L2dldAorICAgICAqIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfRVhDRVBUSU9OID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHRvIG5vdCBnZW5lcmF0ZSB0eXBlIHNldC9nZXQgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfRU1QVFkgPSAxOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdG8gYmUgYXMgc2lsZW50IGFzIHBvc3NpYmxlIGR1cmluZyBpbnZhbGlkIGluZGV4IHBhc3NlZAorICAgICAqIHRvIHNldC9nZXQgdHlwZSBtZXRob2RzLiBPbiBnZXR0aW5nIGFuIE9iamVjdCwgZm9yIGV4YW1wbGUsCisgICAgICogbnVsbCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqIEhvd2V2ZXIsIG9uIHByaW1pdGl2ZSBnZXRzLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX1NJTEVOVCA9IDI7CisKKyAgICAvLyB3cmFwcGVycyBmb3IgcHJpbWl0aXZlIHR5cGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXVtdIFdSQVBQRVJTID0gbmV3IENsYXNzW11bXXsKKyAgICAgICAgeyBib29sZWFuLmNsYXNzLCBCb29sZWFuLmNsYXNzIH0sCisgICAgICAgIHsgYnl0ZS5jbGFzcywgQnl0ZS5jbGFzcyB9LAorICAgICAgICB7IGNoYXIuY2xhc3MsIENoYXJhY3Rlci5jbGFzcyB9LAorICAgICAgICB7IGludC5jbGFzcywgSW50ZWdlci5jbGFzcyB9LAorICAgICAgICB7IHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcyB9LAorICAgICAgICB7IGxvbmcuY2xhc3MsIExvbmcuY2xhc3MgfSwKKyAgICAgICAgeyBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MgfSwKKyAgICAgICAgeyBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcyB9LAorICAgIH07CisKKyAgICAvLyBwcmltaXRpdmUgdHlwZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBUWVBFUyA9IG5ldyBpbnRbXXsKKyAgICAgICAgSmF2YVR5cGVzLkJPT0xFQU4sCisgICAgICAgIEphdmFUeXBlcy5CWVRFLAorICAgICAgICBKYXZhVHlwZXMuQ0hBUiwKKyAgICAgICAgSmF2YVR5cGVzLklOVCwKKyAgICAgICAgSmF2YVR5cGVzLlNIT1JULAorICAgICAgICBKYXZhVHlwZXMuTE9ORywKKyAgICAgICAgSmF2YVR5cGVzLkZMT0FULAorICAgICAgICBKYXZhVHlwZXMuRE9VQkxFLAorICAgICAgICBKYXZhVHlwZXMuT0JKRUNUCisgICAgfTsKKworICAgIC8vIHRoZSBwcm9qZWN0L2NsYXNzbG9hZGVyIGZvciB0aGUgY2xhc3Nlcy4KKyAgICBwcml2YXRlIGZpbmFsIFByb2plY3QgX3Byb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgQkNDbGFzc0xvYWRlciBfbG9hZGVyID0gbmV3IEJDQ2xhc3NMb2FkZXIoX3Byb2plY3QsCisgICAgICAgIER5bmFtaWNTdG9yYWdlLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSBnZW5lcmljIHtAbGluayBEeW5hbWljU3RvcmFnZX0gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBhcnJheSBvZiB7QGxpbmsgSmF2YVR5cGVzfSBjb25zdGFudHMgYW5kIHRoZSBnaXZlbiBvYmplY3QgYXMKKyAgICAgKiB0aGUgdXNlciBrZXkgZm9yIGdlbmVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIER5bmFtaWNTdG9yYWdlIGdlbmVyYXRlU3RvcmFnZShpbnRbXSB0eXBlcywgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShvYmopOworICAgICAgICBCQ0NsYXNzIGJjID0gX3Byb2plY3QubG9hZENsYXNzKG5hbWUpOworICAgICAgICBkZWNsYXJlQ2xhc3NlcyhiYyk7CisgICAgICAgIGJjLmFkZERlZmF1bHRDb25zdHJ1Y3RvcigpLm1ha2VQdWJsaWMoKTsKKworICAgICAgICBpbnQgb2JqZWN0Q291bnQgPSBkZWNsYXJlRmllbGRzKHR5cGVzLCBiYyk7CisgICAgICAgIGFkZEZhY3RvcnlNZXRob2QoYmMpOworICAgICAgICBhZGRGaWVsZENvdW50KGJjLCB0eXBlcywgb2JqZWN0Q291bnQpOworICAgICAgICBhZGRTZXRNZXRob2RzKGJjLCB0eXBlcywgb2JqZWN0Q291bnQpOworICAgICAgICBhZGRHZXRNZXRob2RzKGJjLCB0eXBlcyk7CisgICAgICAgIGFkZEluaXRpYWxpemUoYmMsIG9iamVjdENvdW50KTsKKyAgICAgICAgZGVjb3JhdGUob2JqLCBiYywgdHlwZXMpOworICAgICAgICByZXR1cm4gY3JlYXRlRmFjdG9yeShiYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY2xhc3MgbmFtZSB0byB1c2UgZm9yIHRoZSBnaXZlbiB1c2VyIGtleS4gQnkgZGVmYXVsdCwKKyAgICAgKiByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCBrZXkgcHJlZml4ZWQgYnkgUFJFRklYLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIFBSRUZJWCArIG9iai50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBmaWVsZCBBQ0NFU1MgY29uc3RhbnQgZm9yIGdlbmVyYXRlZCBmaWVsZHMgZnJvbQorICAgICAqIHtAbGluayBDb25zdGFudHN9LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0RmllbGRBY2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBDb25zdGFudHMuQUNDRVNTX1BSSVZBVEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGZpZWxkIGF0IHRoZSBnaXZlbiBpbmRleC4gUmV0dXJucworICAgICAqIDxjb2RlPiJmaWVsZCIgKyBpPC9jb2RlPiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGROYW1lKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gImZpZWxkIiArIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9saWN5IGNvbnN0YW50IGZvciBob3cgdG8gY3JlYXRlIHR5cGUgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldENyZWF0ZUZpZWxkTWV0aG9kcyhpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gUE9MSUNZX0VYQ0VQVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvcmF0ZSB0aGUgZ2VuZXJhdGVkIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlY29yYXRlKE9iamVjdCBvYmosIEJDQ2xhc3MgY2xzLCBpbnRbXSB0eXBlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0dWIgZmFjdG9yeSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBEeW5hbWljU3RvcmFnZSBjcmVhdGVGYWN0b3J5KEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzLmZvck5hbWUoYmMuZ2V0TmFtZSgpLCBmYWxzZSwgX2xvYWRlcik7CisgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gY2xzLmdldENvbnN0cnVjdG9yKChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIER5bmFtaWNTdG9yYWdlIGRhdGEgPSAoRHluYW1pY1N0b3JhZ2UpIGNvbnMubmV3SW5zdGFuY2UKKyAgICAgICAgICAgICAgICAoKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgIF9wcm9qZWN0LmNsZWFyKCk7IC8vIHJlbW92ZSBvbGQgcmVmcworICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oImNvbnMtYWNjZXNzIiwgdCkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgaW50ZXJmYWNlIG9yIHN1cGVyY2xhc3MgZGVjbGFyYXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVjbGFyZUNsYXNzZXMoQkNDbGFzcyBiYykgeworICAgICAgICBiYy5kZWNsYXJlSW50ZXJmYWNlKER5bmFtaWNTdG9yYWdlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIG5ld0luc3RhbmNlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkRmFjdG9yeU1ldGhvZChCQ0NsYXNzIGJjKSB7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IGJjLmRlY2xhcmVNZXRob2QoIm5ld0luc3RhbmNlIiwKKyAgICAgICAgICAgIER5bmFtaWNTdG9yYWdlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoYmMpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoYmMuZ2V0TmFtZSgpLCAiPGluaXQ+IiwgInZvaWQiLCBudWxsKTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgZ2V0RmllbGRDb3VudC9nZXRPYmplY3RDb3VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkRmllbGRDb3VudChCQ0NsYXNzIGJjLCBpbnRbXSB0eXBlcywgaW50IG9iamVjdENvdW50KSB7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IGJjLmRlY2xhcmVNZXRob2QoImdldEZpZWxkQ291bnQiLCBpbnQuY2xhc3MsIG51bGwpOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKHR5cGVzLmxlbmd0aCk7CisgICAgICAgIGNvZGUuaXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisKKyAgICAgICAgbWV0aG9kID0gYmMuZGVjbGFyZU1ldGhvZCgiZ2V0T2JqZWN0Q291bnQiLCBpbnQuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShvYmplY3RDb3VudCk7CisgICAgICAgIGNvZGUuaXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IGluaXRpYWxpemUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEluaXRpYWxpemUoQkNDbGFzcyBiYywgaW50IG9iamVjdENvdW50KSB7CisgICAgICAgIEJDTWV0aG9kIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKCJpbml0aWFsaXplIiwgdm9pZC5jbGFzcywgbnVsbCk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmaW5zID0gbnVsbDsKKyAgICAgICAgaWYgKG9iamVjdENvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gaWYgKG9iamVjdHMgPT0gbnVsbCkKKyAgICAgICAgICAgIC8vIAkJb2JqZWN0cyA9IG5ldyBPYmplY3Rbb2JqZWN0Q291bnRdOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgib2JqZWN0cyIsIE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgICAgIGlmaW5zID0gY29kZS5pZm5vbm51bGwoKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUob2JqZWN0Q291bnQpOworICAgICAgICAgICAgY29kZS5hbmV3YXJyYXkoKS5zZXRUeXBlKE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoIm9iamVjdHMiLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgSW5zdHJ1Y3Rpb24gaW5zID0gY29kZS52cmV0dXJuKCk7CisgICAgICAgIGlmIChpZmlucyAhPSBudWxsKQorICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGlucyk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNsYXJlIHRoZSBwcmltaXRpdmUgZmllbGRzIGFuZCB0aGUgb2JqZWN0IGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlY2xhcmVGaWVsZHMoaW50W10gdHlwZXMsIEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgYmMuZGVjbGFyZUZpZWxkKCJvYmplY3RzIiwgT2JqZWN0W10uY2xhc3MpLm1ha2VQcml2YXRlKCk7CisKKyAgICAgICAgaW50IG9iamVjdENvdW50ID0gMDsKKyAgICAgICAgQ2xhc3MgdHlwZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHlwZSA9IGZvclR5cGUodHlwZXNbaV0pOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgIG9iamVjdENvdW50Kys7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBCQ0ZpZWxkIGZpZWxkID0gYmMuZGVjbGFyZUZpZWxkKGdldEZpZWxkTmFtZShpKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzRmxhZ3MoZ2V0RmllbGRBY2Nlc3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9iamVjdENvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbGwgdGhlIHR5cGVkIHNldCBieSBpbmRleCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFNldE1ldGhvZHMoQkNDbGFzcyBiYywgaW50W10gdHlwZXMsIGludCB0b3RhbE9iamVjdHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUWVBFUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGFkZFNldE1ldGhvZChUWVBFU1tpXSwgYmMsIHR5cGVzLCB0b3RhbE9iamVjdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgdHlwZWQgc2V0IGJ5IGluZGV4IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU2V0TWV0aG9kKGludCB0eXBlQ29kZSwgQkNDbGFzcyBiYywgaW50W10gdHlwZXMsCisgICAgICAgIGludCB0b3RhbE9iamVjdHMpIHsKKyAgICAgICAgaW50IGhhbmRsZSA9IGdldENyZWF0ZUZpZWxkTWV0aG9kcyh0eXBlQ29kZSk7CisgICAgICAgIGlmIChoYW5kbGUgPT0gUE9MSUNZX0VNUFRZKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBDbGFzcyB0eXBlID0gZm9yVHlwZSh0eXBlQ29kZSk7CisgICAgICAgIC8vIHB1YmxpYyB2b2lkIHNldDxUeXBlPiAoaW50IGZpZWxkLCA8dHlwZT4gdmFsKQorICAgICAgICBTdHJpbmcgbmFtZSA9IE9iamVjdC5jbGFzcy5lcXVhbHModHlwZSkgPyAiT2JqZWN0IiA6CisgICAgICAgICAgICBTdHJpbmdVdGlscy5jYXBpdGFsaXplKHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmFtZSA9ICJzZXQiICsgbmFtZTsKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gYmMuZGVjbGFyZU1ldGhvZChuYW1lLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcywgdHlwZSB9KTsKKyAgICAgICAgbWV0aG9kLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIC8vIHN3aXRjaCAoZmllbGQpCisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgVGFibGVTd2l0Y2hJbnN0cnVjdGlvbiB0YWJpbnMgPSBjb2RlLnRhYmxlc3dpdGNoKCk7CisgICAgICAgIHRhYmlucy5zZXRMb3coMCk7CisgICAgICAgIHRhYmlucy5zZXRIaWdoKHR5cGVzLmxlbmd0aCAtIDEpOworICAgICAgICBJbnN0cnVjdGlvbiBkZWZhdWx0SW5zOworICAgICAgICBpZiAoaGFuZGxlID09IFBPTElDWV9TSUxFTlQpCisgICAgICAgICAgICBkZWZhdWx0SW5zID0gY29kZS52cmV0dXJuKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlZmF1bHRJbnMgPSB0aHJvd0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChjb2RlLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0YWJpbnMuc2V0RGVmYXVsdFRhcmdldChkZWZhdWx0SW5zKTsKKyAgICAgICAgaW50IG9iamVjdENvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gZGVmYXVsdDogdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgKCFpc0NvbXBhdGlibGUodHlwZXNbaV0sIHR5cGVDb2RlKSkgeworICAgICAgICAgICAgICAgIHRhYmlucy5hZGRUYXJnZXQodGFiaW5zLmdldERlZmF1bHRUYXJnZXQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhYmlucy5hZGRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFRoaXMoKSk7CisgICAgICAgICAgICBpZiAodHlwZUNvZGUgPj0gSmF2YVR5cGVzLk9CSkVDVCkgeworICAgICAgICAgICAgICAgIC8vIGlmIChvYmplY3RzID09IG51bGwpCisgICAgICAgICAgICAgICAgLy8gCQlvYmplY3RzID0gbmV3IE9iamVjdFt0b3RhbE9iamVjdHNdOworICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKCJvYmplY3RzIiwgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZub25udWxsKCk7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUodG90YWxPYmplY3RzKTsKKyAgICAgICAgICAgICAgICBjb2RlLmFuZXdhcnJheSgpLnNldFR5cGUoT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoIm9iamVjdHMiLCBPYmplY3RbXS5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAvLyBvYmplY3RzW29iamVjdENvdW50XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFRoaXMoKSk7CisgICAgICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKCJvYmplY3RzIiwgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShvYmplY3RDb3VudCk7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICAgICAgICAgIGNvZGUuYWFzdG9yZSgpOworICAgICAgICAgICAgICAgIG9iamVjdENvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNhc2UgaTogZmllbGRpID0gdmFsOworICAgICAgICAgICAgICAgIExvYWRJbnN0cnVjdGlvbiBsb2FkID0gY29kZS54bG9hZCgpOworICAgICAgICAgICAgICAgIGxvYWQuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICBsb2FkLnNldFBhcmFtKDEpOworICAgICAgICAgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZCgiZmllbGQiICsgaSwgdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXR1cm4KKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICB9CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYWxsIHR5cGVkIGdldCBieSBpbmRleCBtZXRob2QgZm9yIHRoZSBnaXZlbiBmaWVsZHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEdldE1ldGhvZHMoQkNDbGFzcyBiYywgaW50W10gdHlwZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUWVBFUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGFkZEdldE1ldGhvZChUWVBFU1tpXSwgYmMsIHR5cGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdHlwZWQgZ2V0IGJ5IGluZGV4IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkR2V0TWV0aG9kKGludCB0eXBlQ29kZSwgQkNDbGFzcyBiYywgaW50W10gdHlwZXMpIHsKKyAgICAgICAgaW50IGhhbmRsZSA9IGdldENyZWF0ZUZpZWxkTWV0aG9kcyh0eXBlQ29kZSk7CisgICAgICAgIGlmIChoYW5kbGUgPT0gUE9MSUNZX0VNUFRZKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBDbGFzcyB0eXBlID0gZm9yVHlwZSh0eXBlQ29kZSk7CisgICAgICAgIC8vIHB1YmxpYyA8dHlwZT4gZ2V0PFR5cGU+RmllbGQgKGludCBmaWVsZCkKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBPYmplY3QuY2xhc3MuZXF1YWxzKHR5cGUpID8gIk9iamVjdCIgOgorICAgICAgICAgICAgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZSh0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIG5hbWUgPSAiZ2V0IiArIG5hbWU7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IGJjLmRlY2xhcmVNZXRob2QobmFtZSwgdHlwZSwKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgIG1ldGhvZC5tYWtlUHVibGljKCk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworICAgICAgICAvLyBzd2l0Y2ggKGZpZWxkKQorICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIFRhYmxlU3dpdGNoSW5zdHJ1Y3Rpb24gdGFiaW5zID0gY29kZS50YWJsZXN3aXRjaCgpOworICAgICAgICB0YWJpbnMuc2V0TG93KDApOworICAgICAgICB0YWJpbnMuc2V0SGlnaCh0eXBlcy5sZW5ndGggLSAxKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gZGVmYXVsdElucyA9IG51bGw7CisgICAgICAgIGlmICh0eXBlQ29kZSA9PSBKYXZhVHlwZXMuT0JKRUNUICYmIGhhbmRsZSA9PSBQT0xJQ1lfU0lMRU5UKSB7CisgICAgICAgICAgICBkZWZhdWx0SW5zID0gY29kZS5jb25zdGFudCgpLnNldE51bGwoKTsKKyAgICAgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRlZmF1bHRJbnMgPSB0aHJvd0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChjb2RlLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0YWJpbnMuc2V0RGVmYXVsdFRhcmdldChkZWZhdWx0SW5zKTsKKyAgICAgICAgaW50IG9iamVjdENvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gZGVmYXVsdDogdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgKCFpc0NvbXBhdGlibGUodHlwZXNbaV0sIHR5cGVDb2RlKSkgeworICAgICAgICAgICAgICAgIHRhYmlucy5hZGRUYXJnZXQodGFiaW5zLmdldERlZmF1bHRUYXJnZXQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhYmlucy5hZGRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFRoaXMoKSk7CisgICAgICAgICAgICBpZiAodHlwZUNvZGUgPj0gSmF2YVR5cGVzLk9CSkVDVCkgeworICAgICAgICAgICAgICAgIC8vIGlmIChvYmplY3RzID09IG51bGwpCisgICAgICAgICAgICAgICAgLy8gCQlyZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2JqZWN0c1tvYmplY3RDb3VudF07CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoIm9iamVjdHMiLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmaW5zID0gY29kZS5pZm5vbm51bGwoKTsKKyAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICAgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICAgICAgICAgIGlmaW5zLnNldFRhcmdldChjb2RlLmFsb2FkKCkuc2V0VGhpcygpKTsKKyAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoIm9iamVjdHMiLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKG9iamVjdENvdW50KTsKKyAgICAgICAgICAgICAgICBjb2RlLmFhbG9hZCgpOworICAgICAgICAgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICAgICAgICAgIG9iamVjdENvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNhc2UgaTogcmV0dXJuIGZpZWxkaTsKKyAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoImZpZWxkIiArIGksIHR5cGUpOworICAgICAgICAgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUodHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8KKyAgICAvLyBVdGlsaXRpZXMKKyAgICAvLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybgorICAgICAqIHRoZSBlbXB0eSBjb2RlLiBXaWxsIHJldHVybiBudWxsIGlmIHRoZSBtZXRob2Qgc2hvdWxkIGJlIGVtcHR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2RlIHJlcGxhY2VNZXRob2QoQkNDbGFzcyBiYywgU3RyaW5nIG5hbWUsIENsYXNzIHJldFR5cGUsCisgICAgICAgIENsYXNzW10gYXJncywgYm9vbGVhbiByZW1vdmUpIHsKKyAgICAgICAgYmMucmVtb3ZlRGVjbGFyZWRNZXRob2QobmFtZSwgYXJncyk7CisgICAgICAgIEJDTWV0aG9kIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKG5hbWUsIHJldFR5cGUsIGFyZ3MpOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRoLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGlmICghcmVtb3ZlKQorICAgICAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUocmV0VHlwZSk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgYmVhbiBmaWVsZCBvZiB0aGUgZ2l2ZW4gbmFtZSBhbmQgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQkNGaWVsZCBhZGRCZWFuRmllbGQoQkNDbGFzcyBiYywgU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgPT0gbnVsbCIpOworCisgICAgICAgIC8vIHByaXZhdGUgPHR5cGU+IDxuYW1lPgorICAgICAgICBCQ0ZpZWxkIGZpZWxkID0gYmMuZGVjbGFyZUZpZWxkKG5hbWUsIHR5cGUpOworICAgICAgICBmaWVsZC5zZXRBY2Nlc3NGbGFncyhnZXRGaWVsZEFjY2VzcygpKTsKKyAgICAgICAgbmFtZSA9IFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobmFtZSk7CisKKyAgICAgICAgLy8gZ2V0dGVyCisgICAgICAgIFN0cmluZyBwcmVmaXggPSAodHlwZSA9PSBib29sZWFuLmNsYXNzKSA/ICJpcyIgOiAiZ2V0IjsKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gYmMuZGVjbGFyZU1ldGhvZChwcmVmaXggKyBuYW1lLCB0eXBlLCBudWxsKTsKKyAgICAgICAgbWV0aG9kLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUodHlwZSk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKworICAgICAgICAvLyBzZXR0ZXIKKyAgICAgICAgbWV0aG9kID0gYmMuZGVjbGFyZU1ldGhvZCgic2V0IiArIG5hbWUsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgdHlwZSB9KTsKKyAgICAgICAgbWV0aG9kLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLnhsb2FkKCkuc2V0UGFyYW0oMCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgY29kZS5wdXRmaWVsZCgpLnNldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBmaWVsZCB0eXBlIGFuZCBzdG9yYWdlIHR5cGUgYXJlIGNvbXBhdGlibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wYXRpYmxlKGludCBmaWVsZFR5cGUsIGludCBzdG9yYWdlVHlwZSkgeworICAgICAgICBpZiAoc3RvcmFnZVR5cGUgPT0gSmF2YVR5cGVzLk9CSkVDVCkKKyAgICAgICAgICAgIHJldHVybiBmaWVsZFR5cGUgPj0gSmF2YVR5cGVzLk9CSkVDVDsKKyAgICAgICAgcmV0dXJuIGZpZWxkVHlwZSA9PSBzdG9yYWdlVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEluc3RydWN0aW9uIHRocm93RXhjZXB0aW9uKENvZGUgY29kZSwgQ2xhc3MgdHlwZSkgeworICAgICAgICBJbnN0cnVjdGlvbiBpbnMgPSBjb2RlLmFuZXcoKS5zZXRUeXBlKHR5cGUpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QodHlwZSwgIjxpbml0PiIsIHZvaWQuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlLmF0aHJvdygpOworICAgICAgICByZXR1cm4gaW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvcGVyIHR5cGUgZm9yIHRoZSBnaXZlbiB7QGxpbmsgSmF2YVR5cGVzfSBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZm9yVHlwZShpbnQgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvb2xlYW4uY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBieXRlLmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhci5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0LmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdC5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLmNsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIEphdmFUeXBlc30gY29uc3RhbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzIGdldFdyYXBwZXIoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFdyYXBwZXIoZm9yVHlwZSh0eXBlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0V3JhcHBlcihDbGFzcyBjKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgV1JBUFBFUlMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChXUkFQUEVSU1tpXVswXS5lcXVhbHMgKGMpKQorCQkJCXJldHVybiBXUkFQUEVSU1tpXVsxXTsKKwkJfQorCQlyZXR1cm4gYzsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvRmllbGRDb25zdW1lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0ZpZWxkQ29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmJmZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0ZpZWxkQ29uc3VtZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCisvKioKKyAqIENvbnN1bWVzIHBlcnNpc3RlbnQgZmllbGQgdmFsdWVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZpZWxkQ29uc3VtZXIgeworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgdm9pZCBzdG9yZUJvb2xlYW5GaWVsZChpbnQgZmllbGRJbmRleCwgYm9vbGVhbiB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlQ2hhckZpZWxkKGludCBmaWVsZEluZGV4LCBjaGFyIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgc3RvcmVCeXRlRmllbGQoaW50IGZpZWxkSW5kZXgsIGJ5dGUgdmFsdWUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgdm9pZCBzdG9yZVNob3J0RmllbGQoaW50IGZpZWxkSW5kZXgsIHNob3J0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgc3RvcmVJbnRGaWVsZChpbnQgZmllbGRJbmRleCwgaW50IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgc3RvcmVMb25nRmllbGQoaW50IGZpZWxkSW5kZXgsIGxvbmcgdmFsdWUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgdm9pZCBzdG9yZUZsb2F0RmllbGQoaW50IGZpZWxkSW5kZXgsIGZsb2F0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgc3RvcmVEb3VibGVGaWVsZChpbnQgZmllbGRJbmRleCwgZG91YmxlIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgc3RvcmVTdHJpbmdGaWVsZChpbnQgZmllbGRJbmRleCwgU3RyaW5nIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgc3RvcmVPYmplY3RGaWVsZChpbnQgZmllbGRJbmRleCwgT2JqZWN0IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9GaWVsZE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9GaWVsZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODRhMzZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0ZpZWxkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2U7CisKKy8qKgorICogTWFuYWdlcyBwZXJzaXN0ZW50IGZpZWxkcy4KKyAqLworcHVibGljIGludGVyZmFjZSBGaWVsZE1hbmFnZXIKKyAgICBleHRlbmRzIEZpZWxkQ29uc3VtZXIsIEZpZWxkU3VwcGxpZXIgeworCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvRmllbGRTdXBwbGllci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0ZpZWxkU3VwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhhNTIwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL0ZpZWxkU3VwcGxpZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCisvKioKKyAqIFN1cHBsaWVzIHBlcnNpc3RlbnQgZmllbGQgdmFsdWVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZpZWxkU3VwcGxpZXIgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgYm9vbGVhbiBmZXRjaEJvb2xlYW5GaWVsZChpbnQgZmllbGRJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBjaGFyIGZldGNoQ2hhckZpZWxkKGludCBmaWVsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIGJ5dGUgZmV0Y2hCeXRlRmllbGQoaW50IGZpZWxkSW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgc2hvcnQgZmV0Y2hTaG9ydEZpZWxkKGludCBmaWVsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIGludCBmZXRjaEludEZpZWxkKGludCBmaWVsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIGxvbmcgZmV0Y2hMb25nRmllbGQoaW50IGZpZWxkSW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgZmxvYXQgZmV0Y2hGbG9hdEZpZWxkKGludCBmaWVsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIGRvdWJsZSBmZXRjaERvdWJsZUZpZWxkKGludCBmaWVsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIFN0cmluZyBmZXRjaFN0cmluZ0ZpZWxkKGludCBmaWVsZEluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIE9iamVjdCBmZXRjaE9iamVjdEZpZWxkIChpbnQgZmllbGRJbmRleCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENEYXRhR2VuZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENEYXRhR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4YTYzMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9QQ0RhdGFHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDEwNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BYnN0cmFjdFBDRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5QQ0RhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0ZpZWxkOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNNZXRob2Q7CitpbXBvcnQgc2VycC5ieXRlY29kZS5Db2RlOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQ29uc3RhbnRzOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuRXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuSnVtcEluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuTG9va3VwU3dpdGNoSW5zdHJ1Y3Rpb247CisKKy8qKgorICogR2VuZXJhdGVzIHtAbGluayBQQ0RhdGF9IGluc3RhbmNlcyB3aGljaCBhdm9pZCBwcmltaXR2ZSB3cmFwcGVycworICogdG8gb3B0aW1pemUgbWVtb3J5IHVzZSBhbmQgcGVyZm9ybWFuY2UgYXQgdGhlIGNvc3Qgb2Ygc2xpZ2h0bHkgaGlnaGVyCisgKiBzdGFydHVwIHRpbWUuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjMuMgorICovCitwdWJsaWMgY2xhc3MgUENEYXRhR2VuZXJhdG9yCisgICAgZXh0ZW5kcyBEeW5hbWljU3RvcmFnZUdlbmVyYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChQQ0RhdGFHZW5lcmF0b3IuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVEZJWCA9ICIkb3BlbmpwYXBjZGF0YSI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfZ2VuZXJhdGVkID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBPcGVuSlBBQ29uZmlndXJhdGlvbiBfY29uZjsKKyAgICBwcml2YXRlIGZpbmFsIExvZyBfbG9nOworCisgICAgcHVibGljIFBDRGF0YUdlbmVyYXRvcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gY29uZjsKKyAgICAgICAgX2xvZyA9IF9jb25mLmdldExvZ0ZhY3RvcnkoKS5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX0VOSEFOQ0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9jb25mOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHtAbGluayBQQ0RhdGF9IGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gb2lkIGFuZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUENEYXRhIGdlbmVyYXRlUENEYXRhKE9iamVjdCBvaWQsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIENsYXNzIHR5cGUgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICAgICAgRHluYW1pY1N0b3JhZ2Ugc3RvcmFnZSA9IChEeW5hbWljU3RvcmFnZSkgX2dlbmVyYXRlZC5nZXQodHlwZSk7CisgICAgICAgIGlmIChzdG9yYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHN0b3JhZ2UgPSBnZW5lcmF0ZVN0b3JhZ2UobWV0YSk7CisgICAgICAgICAgICBfZ2VuZXJhdGVkLnB1dCh0eXBlLCBzdG9yYWdlKTsKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGNkYXRhLWNyZWF0ZWQiLCB0eXBlLmdldE5hbWUoKSwgbWV0YSkpOworICAgICAgICB9CisgICAgICAgIER5bmFtaWNQQ0RhdGEgZGF0YSA9IChEeW5hbWljUENEYXRhKSBzdG9yYWdlLm5ld0luc3RhbmNlKCk7CisgICAgICAgIGRhdGEuc2V0SWQob2lkKTsKKyAgICAgICAgZGF0YS5zZXRTdG9yYWdlR2VuZXJhdG9yKHRoaXMpOworICAgICAgICBmaW5pc2goZGF0YSwgbWV0YSk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbGx5IGdlbmVyYXRlIHRoZSBmYWN0b3J5IGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgRHluYW1pY1N0b3JhZ2UgZ2VuZXJhdGVTdG9yYWdlKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGNkYXRhLWdlbmVyYXRlIiwgbWV0YSkpOworCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBtZXRhLmdldEZpZWxkcygpOworICAgICAgICBpbnRbXSB0eXBlcyA9IG5ldyBpbnRbZmllbGRzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB0eXBlc1tpXSA9IHJlcGxhY2VUeXBlKGZpZWxkc1tpXSk7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZVN0b3JhZ2UodHlwZXMsIG1ldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGZpbmFsIGFjdGlvbnMgYmVmb3JlIHRoZSBwY2RhdGEgaXMgcmV0dXJuZWQgdG8gY2xpZW50IGNvZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoKER5bmFtaWNQQ0RhdGEgZGF0YSwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRDcmVhdGVGaWVsZE1ldGhvZHMoaW50IHR5cGVDb2RlKSB7CisgICAgICAgIGlmICh0eXBlQ29kZSA+PSBKYXZhVHlwZXMuT0JKRUNUKQorICAgICAgICAgICAgcmV0dXJuIFBPTElDWV9TSUxFTlQ7CisgICAgICAgIC8vIGRvbid0IGJvdGhlciBjcmVhdGluZyBzZXQvZ2V0PFByaW1pdGl2ZT4gbWV0aG9kcworICAgICAgICByZXR1cm4gUE9MSUNZX0VNUFRZOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRlY2xhcmVDbGFzc2VzKEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgc3VwZXIuZGVjbGFyZUNsYXNzZXMoYmMpOworICAgICAgICBiYy5kZWNsYXJlSW50ZXJmYWNlKER5bmFtaWNQQ0RhdGEuY2xhc3MpOworICAgICAgICBiYy5zZXRTdXBlcmNsYXNzKEFic3RyYWN0UENEYXRhLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldENsYXNzTmFtZShPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBnZXRVbmlxdWVOYW1lKCgoQ2xhc3NNZXRhRGF0YSkgb2JqKS5nZXREZXNjcmliZWRUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGdpdmVuIHR5cGUncyBwY2RhdGEgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVOYW1lKENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpICsgIiQiICsgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodHlwZSkgKyBQT1NURklYOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRlY29yYXRlKE9iamVjdCBvYmosIEJDQ2xhc3MgYmMsIGludFtdIHR5cGVzKSB7CisgICAgICAgIHN1cGVyLmRlY29yYXRlKG9iaiwgYmMsIHR5cGVzKTsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gKENsYXNzTWV0YURhdGEpIG9iajsKKworICAgICAgICBlbmhhbmNlQ29uc3RydWN0b3IoYmMpOworICAgICAgICBhZGRCYXNlRmllbGRzKGJjKTsKKyAgICAgICAgYWRkSW1wbERhdGFNZXRob2RzKGJjLCBtZXRhKTsKKyAgICAgICAgYWRkRmllbGRJbXBsRGF0YU1ldGhvZHMoYmMsIG1ldGEpOworICAgICAgICBhZGRWZXJzaW9uTWV0aG9kcyhiYyk7CisgICAgICAgIGFkZEdldFR5cGUoYmMsIG1ldGEpOworICAgICAgICBhZGRMb2FkTWV0aG9kKGJjLCBtZXRhKTsKKyAgICAgICAgYWRkTG9hZFdpdGhGaWVsZHNNZXRob2QoYmMsIG1ldGEpOworICAgICAgICBhZGRTdG9yZU1ldGhvZHMoYmMsIG1ldGEpOworICAgICAgICBhZGROZXdFbWJlZGRlZChiYyk7CisgICAgICAgIGFkZEdldERhdGEoYmMpOworICAgICAgICBkZWNvcmF0ZShiYywgbWV0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgYWRkaXRpb25hbCBkZWNvcmF0aW9uIHRvIGdlbmVyYXRlZCBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZShCQ0NsYXNzIGJjLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmhhbmNlIGNvbnN0cnVjdG9yIHRvIGluaXRpYWxpemUgZmllbGRzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuaGFuY2VDb25zdHJ1Y3RvcihCQ0NsYXNzIGJjKSB7CisgICAgICAgIEJDTWV0aG9kIGNvbnMgPSBiYy5nZXREZWNsYXJlZE1ldGhvZCgiPGluaXQ+IiwgKFN0cmluZ1tdKSBudWxsKTsKKyAgICAgICAgQ29kZSBjb2RlID0gY29ucy5nZXRDb2RlKGZhbHNlKTsKKyAgICAgICAgY29kZS5hZnRlckxhc3QoKTsKKyAgICAgICAgY29kZS5wcmV2aW91cygpOworCisgICAgICAgIC8vIHByaXZhdGUgQml0U2V0IGxvYWRlZCA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgQkNGaWVsZCBsb2FkZWQgPSBhZGRCZWFuRmllbGQoYmMsICJsb2FkZWQiLCBCaXRTZXQuY2xhc3MpOworICAgICAgICBsb2FkZWQuc2V0RmluYWwodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoQml0U2V0LmNsYXNzKTsKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGJjLmdldEZpZWxkcygpLmxlbmd0aCk7CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChCaXRTZXQuY2xhc3MsICI8aW5pdD4iLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgY29kZS5wdXRmaWVsZCgpLnNldEZpZWxkKGxvYWRlZCk7CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhdmUgdG8gbG9hZCB0aGUgdHlwZSBzaW5jZSBpdCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB0aGUKKyAgICAgKiBzYW1lIGNsYXNzbG9hZGVyIChpLmUuIHJhciB2cy4gZWFyKS4gVGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIKKyAgICAgKiAoaS5lLiB0aGUgdXNlciBhcHAgY2xhc3Nsb2FkZXIpIHNob3VsZCBiZSBmaW5lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRHZXRUeXBlKEJDQ2xhc3MgYmMsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBCQ0ZpZWxkIHR5cGUgPSBiYy5kZWNsYXJlRmllbGQoInR5cGUiLCBDbGFzcy5jbGFzcyk7CisgICAgICAgIHR5cGUuc2V0U3RhdGljKHRydWUpOworICAgICAgICB0eXBlLm1ha2VQcml2YXRlKCk7CisgICAgICAgIC8vIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICBCQ01ldGhvZCBnZXR0ZXIgPSBiYy5kZWNsYXJlTWV0aG9kKCJnZXRUeXBlIiwgQ2xhc3MuY2xhc3MsIG51bGwpOworICAgICAgICBnZXR0ZXIubWFrZVB1YmxpYygpOworICAgICAgICBDb2RlIGNvZGUgPSBnZXR0ZXIuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgLy8gaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAvLyAJCXRyeSB7CisgICAgICAgIC8vIAkJCXR5cGUgPSBDbGFzcy5mb3JOYW1lCisgICAgICAgIC8vIAkJCQkobWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpLCB0cnVlLAorICAgICAgICAvLyAJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIC8vIAkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgIC8vIAkJCXRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICAvLyAJCX0KKyAgICAgICAgLy8gfQorICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKHR5cGUpOworCisgICAgICAgIENvbGxlY3Rpb24ganVtcHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBqdW1wcy5hZGQoY29kZS5pZm5vbm51bGwoKSk7CisgICAgICAgIEV4Y2VwdGlvbkhhbmRsZXIgaGFuZGxlciA9IGNvZGUuYWRkRXhjZXB0aW9uSGFuZGxlcigpOworCisgICAgICAgIGhhbmRsZXIuc2V0VHJ5U3RhcnQoY29kZS5jb25zdGFudCgpLnNldFZhbHVlCisgICAgICAgICAgICAobWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSh0cnVlKTsKKyAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoVGhyZWFkLmNsYXNzLCAiY3VycmVudFRocmVhZCIsCisgICAgICAgICAgICBUaHJlYWQuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoVGhyZWFkLmNsYXNzLCAiZ2V0Q29udGV4dENsYXNzTG9hZGVyIiwKKyAgICAgICAgICAgIENsYXNzTG9hZGVyLmNsYXNzLCBudWxsKTsKKyAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoQ2xhc3MuY2xhc3MsICJmb3JOYW1lIiwgQ2xhc3MuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBDbGFzc0xvYWRlci5jbGFzcyB9KTsKKyAgICAgICAgY29kZS5wdXRzdGF0aWMoKS5zZXRGaWVsZCh0eXBlKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gZ28yID0gY29kZS5nbzIoKTsKKyAgICAgICAganVtcHMuYWRkKGdvMik7CisgICAgICAgIGhhbmRsZXIuc2V0VHJ5RW5kKGdvMik7CisgICAgICAgIGhhbmRsZXIuc2V0Q2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGhhbmRsZXIuc2V0SGFuZGxlclN0YXJ0KHRocm93RXhjZXB0aW9uCisgICAgICAgICAgICAoY29kZSwgSW50ZXJuYWxFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgc2V0VGFyZ2V0KGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQodHlwZSksIGp1bXBzKTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY2xhcmUgc3RhbmRhcmQgZHluYW1pYyBwY2RhdGEgZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRCYXNlRmllbGRzKEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgYWRkQmVhbkZpZWxkKGJjLCAiaWQiLCBPYmplY3QuY2xhc3MpOworICAgICAgICBCQ0ZpZWxkIGZpZWxkID0gYWRkQmVhbkZpZWxkKGJjLCAic3RvcmFnZUdlbmVyYXRvciIsCisgICAgICAgICAgICBQQ0RhdGFHZW5lcmF0b3IuY2xhc3MpOworICAgICAgICBmaWVsZC5zZXRBY2Nlc3NGbGFncyhmaWVsZC5nZXRBY2Nlc3NGbGFncygpCisgICAgICAgICAgICB8IENvbnN0YW50cy5BQ0NFU1NfVFJBTlNJRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbWV0aG9kcyBmb3IgbG9hZGluZyBhbmQgc3RvcmluZyBjbGFzcy1sZXZlbCBpbXBsIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEltcGxEYXRhTWV0aG9kcyhCQ0NsYXNzIGJjLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgLy8gdm9pZCBzdG9yZUltcGxEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIpOworICAgICAgICBCQ01ldGhvZCBtZXRoID0gYmMuZGVjbGFyZU1ldGhvZCgic3RvcmVJbXBsRGF0YSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcyB9KTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIEJDRmllbGQgaW1wbCA9IG51bGw7CisgICAgICAgIGlmICghdXNlc0ltcGxEYXRhKG1ldGEpKQorICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaWYgKHNtLmlzSW1wbERhdGFDYWNoZWFibGUoKSkKKyAgICAgICAgICAgIC8vIAkJc2V0SW1wbERhdGEoc20uZ2V0SW1wbERhdGEoKSk7CisgICAgICAgICAgICBpbXBsID0gYWRkQmVhbkZpZWxkKGJjLCAiaW1wbERhdGEiLCBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAiaXNJbXBsRGF0YUNhY2hlYWJsZSIsIGJvb2xlYW4uY2xhc3MsIG51bGwpOworICAgICAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmaW5zID0gY29kZS5pZmVxKCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAiZ2V0SW1wbERhdGEiLCBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKCJzZXRJbXBsRGF0YSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgICAgIGlmaW5zLnNldFRhcmdldChjb2RlLnZyZXR1cm4oKSk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHZvaWQgbG9hZEltcGxEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIpOworICAgICAgICBtZXRoID0gYmMuZGVjbGFyZU1ldGhvZCgibG9hZEltcGxEYXRhIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzIH0pOworICAgICAgICBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworICAgICAgICBpZiAoIXVzZXNJbXBsRGF0YShtZXRhKSkKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIChzbS5nZXRJbXBsRGF0YSgpID09IG51bGwgJiYgaW1wbERhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgIC8vIAkJc20uc2V0SW1wbERhdGEoaW1wbCwgdHJ1ZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLAorICAgICAgICAgICAgICAgICJnZXRJbXBsRGF0YSIsIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbm9ubnVsbCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChpbXBsKTsKKyAgICAgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmluczIgPSBjb2RlLmlmbnVsbCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChpbXBsKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSh0cnVlKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgInNldEltcGxEYXRhIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT2JqZWN0LmNsYXNzLCBib29sZWFuLmNsYXNzIH0pOworICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gaW5zID0gY29kZS52cmV0dXJuKCk7CisgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQoaW5zKTsKKyAgICAgICAgICAgIGlmaW5zMi5zZXRUYXJnZXQoaW5zKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG1ldGhvZHMgZm9yIGxvYWRpbmcgYW5kIHN0b3JpbmcgY2xhc3MtbGV2ZWwgaW1wbCBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRGaWVsZEltcGxEYXRhTWV0aG9kcyhCQ0NsYXNzIGJjLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgbG9hZEltcGxEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBpKQorICAgICAgICBCQ01ldGhvZCBtZXRoID0gYmMuZGVjbGFyZU1ldGhvZCgibG9hZEltcGxEYXRhIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLCBpbnQuY2xhc3MgfSk7CisgICAgICAgIG1ldGgubWFrZVByaXZhdGUoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIGludCBjb3VudCA9IGNvdW50SW1wbERhdGFGaWVsZHMobWV0YSk7CisgICAgICAgIEJDRmllbGQgaW1wbCA9IG51bGw7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gT2JqZWN0W10gZmllbGRJbXBsCisgICAgICAgICAgICBpbXBsID0gYmMuZGVjbGFyZUZpZWxkKCJmaWVsZEltcGwiLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICBpbXBsLm1ha2VQcml2YXRlKCk7CisKKyAgICAgICAgICAgIC8vIGlmIChmaWVsZEltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoaW1wbCk7CisgICAgICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbm9ubnVsbCgpOworICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisKKyAgICAgICAgICAgIC8vIE9iamVjdCBvYmogPSBudWxsOworICAgICAgICAgICAgaW50IG9iaiA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5jb25zdGFudCgpLnNldE51bGwoKSk7CisgICAgICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKG9iaik7CisKKyAgICAgICAgICAgIC8vIGVzdGFibGlzaCBzd2l0Y2ggdGFyZ2V0LCB0aGVuIG1vdmUgYmVmb3JlIGl0CisgICAgICAgICAgICBJbnN0cnVjdGlvbiB0YXJnZXQgPSBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2JqKTsKKyAgICAgICAgICAgIGNvZGUucHJldmlvdXMoKTsKKworICAgICAgICAgICAgLy8gc3dpdGNoKGkpCisgICAgICAgICAgICBjb2RlLmlsb2FkKCkuc2V0UGFyYW0oMSk7CisgICAgICAgICAgICBMb29rdXBTd2l0Y2hJbnN0cnVjdGlvbiBsc3dpdGNoID0gY29kZS5sb29rdXBzd2l0Y2goKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBtZXRhLmdldEZpZWxkcygpOworICAgICAgICAgICAgaW50IGNhY2hlYWJsZSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghdXNlc0ltcGxEYXRhKGZpZWxkc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8vIGNhc2UgeDogb2JqID0gZmllbGRJbXBsW3ldOyBicmVhazsKKyAgICAgICAgICAgICAgICBsc3dpdGNoLmFkZENhc2UoaSwgY29kZS5hbG9hZCgpLnNldFRoaXMoKSk7CisgICAgICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGltcGwpOworICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShjYWNoZWFibGUrKyk7CisgICAgICAgICAgICAgICAgY29kZS5hYWxvYWQoKTsKKyAgICAgICAgICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKG9iaik7CisgICAgICAgICAgICAgICAgY29kZS5nbzIoKS5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxzd2l0Y2guc2V0RGVmYXVsdFRhcmdldCh0YXJnZXQpOworCisgICAgICAgICAgICAvLyBpZiAob2JqICE9IG51bGwpCisgICAgICAgICAgICBjb2RlLm5leHQoKTsgICAgLy8ganVtcCBiYWNrIG92ZXIgdGFyZ2V0CisgICAgICAgICAgICBpZmlucyA9IGNvZGUuaWZub25udWxsKCk7CisgICAgICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKworICAgICAgICAgICAgLy8gc20uc2V0SW1wbERhdGEoaW5kZXgsIGltcGwpOworICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKSk7CisgICAgICAgICAgICBjb2RlLmlsb2FkKCkuc2V0UGFyYW0oMSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2JqKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgInNldEltcGxEYXRhIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzLCBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisKKyAgICAgICAgLy8gdm9pZCBzdG9yZUltcGxEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBpbmRleCwgYm9vbGVhbiBsb2FkZWQpCisgICAgICAgIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKCJzdG9yZUltcGxEYXRhIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLCBpbnQuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgIGNvZGUgPSBtZXRoLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaW50IGFycklkeCA9IC0xOworICAgICAgICAgICAgLy8gc3dpdGNoKGluZGV4KQorICAgICAgICAgICAgaW50IGFycklkeCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoLTEpOworICAgICAgICAgICAgY29kZS5pc3RvcmUoKS5zZXRMb2NhbChhcnJJZHgpOworICAgICAgICAgICAgY29kZS5pbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICAgICAgTG9va3VwU3dpdGNoSW5zdHJ1Y3Rpb24gbHN3aXRjaCA9IGNvZGUubG9va3Vwc3dpdGNoKCk7CisKKyAgICAgICAgICAgIC8vIGVzdGFibGlzaCBzd2l0Y2ggdGFyZ2V0LCB0aGVuIG1vdmUgYmVmb3JlIGl0CisgICAgICAgICAgICBJbnN0cnVjdGlvbiBzd2l0Y2hUYXJnZXQgPSBjb2RlLmlsb2FkKCkuc2V0TG9jYWwoYXJySWR4KTsKKyAgICAgICAgICAgIGNvZGUucHJldmlvdXMoKTsKKworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IG1ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBpbnQgY2FjaGVhYmxlID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCF1c2VzSW1wbERhdGEoZmllbGRzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8gY2FzZSB4OiBhcnJJZHggPSB5OyBicmVhazsKKyAgICAgICAgICAgICAgICBsc3dpdGNoLmFkZENhc2UoaSwgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGNhY2hlYWJsZSsrKSk7CisgICAgICAgICAgICAgICAgY29kZS5pc3RvcmUoKS5zZXRMb2NhbChhcnJJZHgpOworICAgICAgICAgICAgICAgIGNvZGUuZ28yKCkuc2V0VGFyZ2V0KHN3aXRjaFRhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsc3dpdGNoLnNldERlZmF1bHRUYXJnZXQoc3dpdGNoVGFyZ2V0KTsKKyAgICAgICAgICAgIGNvZGUubmV4dCgpOyAgICAvLyBzdGVwIG92ZXIgc3dpdGNoIHRhcmdldAorCisgICAgICAgICAgICAvLyBpZiAoYXJySWR4ICE9IC0xKQorICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKC0xKTsKKyAgICAgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZpY21wbmUoKTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgbnVsbCB0YXJnZXQsIHRoZW4gbW92ZSBiZWZvcmUgaXQKKyAgICAgICAgICAgIEluc3RydWN0aW9uIG51bGxUYXJnZXQgPSBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5wcmV2aW91cygpOworCisgICAgICAgICAgICAvLyBpZiAobG9hZGVkKQorICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuaWxvYWQoKS5zZXRQYXJhbSgyKSk7CisgICAgICAgICAgICBjb2RlLmlmZXEoKS5zZXRUYXJnZXQobnVsbFRhcmdldCk7CisKKyAgICAgICAgICAgIC8vIE9iamVjdCBvYmogPSBzbS5nZXRJbXBsRGF0YShpbmRleCkKKyAgICAgICAgICAgIGludCBvYmogPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAiZ2V0SW1wbERhdGEiLCBPYmplY3QuY2xhc3MsIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKG9iaik7CisKKyAgICAgICAgICAgIC8vIGlmIChvYmogIT0gbnVsbCkKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvYmopOworICAgICAgICAgICAgY29kZS5pZm51bGwoKS5zZXRUYXJnZXQobnVsbFRhcmdldCk7CisKKyAgICAgICAgICAgIC8vIGlmIChmaWVsZEltcGwgPT0gbnVsbCkKKyAgICAgICAgICAgIC8vIAkJZmllbGRJbXBsID0gbmV3IE9iamVjdFtmaWVsZHNdOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChpbXBsKTsKKyAgICAgICAgICAgIGlmaW5zID0gY29kZS5pZm5vbm51bGwoKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoY291bnQpOworICAgICAgICAgICAgY29kZS5hbmV3YXJyYXkoKS5zZXRUeXBlKE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoaW1wbCk7CisKKyAgICAgICAgICAgIC8vIGZpZWxkSW1wbFthcnJJZHhdID0gb2JqOworICAgICAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRUaGlzKCkpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGltcGwpOworICAgICAgICAgICAgY29kZS5pbG9hZCgpLnNldExvY2FsKGFycklkeCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2JqKTsKKyAgICAgICAgICAgIGNvZGUuYWFzdG9yZSgpOworICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisKKyAgICAgICAgICAgIC8vIGlmIChmaWVsZEltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgIC8vIAkJZmllbGRJbXBsW2luZGV4XSA9IG51bGw7CisgICAgICAgICAgICBjb2RlLm5leHQoKTsgLy8gc3RlcCBvdmVyIG51bGxUYXJnZXQKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChpbXBsKTsKKyAgICAgICAgICAgIGlmaW5zID0gY29kZS5pZm5vbm51bGwoKTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRUaGlzKCkpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGltcGwpOworICAgICAgICAgICAgY29kZS5pbG9hZCgpLnNldExvY2FsKGFycklkeCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICAgICAgY29kZS5hYXN0b3JlKCk7CisgICAgICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG1ldGhvZHMgZm9yIGxvYWRpbmcgYW5kIHN0b3JpbmcgdmVyc2lvbiBkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25NZXRob2RzKEJDQ2xhc3MgYmMpIHsKKyAgICAgICAgLy8gdm9pZCBzdG9yZVZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSk7CisgICAgICAgIGFkZEJlYW5GaWVsZChiYywgInZlcnNpb24iLCBPYmplY3QuY2xhc3MpOworICAgICAgICBCQ01ldGhvZCBtZXRoID0gYmMuZGVjbGFyZU1ldGhvZCgic3RvcmVWZXJzaW9uIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzIH0pOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRoLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy8gdmVyc2lvbiA9IHNtLmdldFZlcnNpb24oKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpCisgICAgICAgICAgICAuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsICJnZXRWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoInZlcnNpb24iLCBPYmplY3QuY2xhc3MpOworICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHZvaWQgbG9hZFZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkKKyAgICAgICAgbWV0aCA9IGJjLmRlY2xhcmVNZXRob2QoImxvYWRWZXJzaW9uIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzIH0pOworICAgICAgICBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGlmIChzbS5nZXRWZXJzaW9uKCkgPT0gbnVsbCkKKyAgICAgICAgLy8gCQlzbS5zZXRWZXJzaW9uKHZlcnNpb24pOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAiZ2V0VmVyc2lvbiIsIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZub25udWxsKCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKCJ2ZXJzaW9uIiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKQorICAgICAgICAgICAgLnNldE1ldGhvZChPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLCAic2V0VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW117IE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUudnJldHVybigpKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRMb2FkTWV0aG9kKEJDQ2xhc3MgYmMsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICAvLyBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgLy8gCQlPYmplY3QgY29udGV4dCkKKyAgICAgICAgQ29kZSBjb2RlID0gYWRkTG9hZE1ldGhvZChiYywgZmFsc2UpOworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIENvbGxlY3Rpb24ganVtcHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBDb2xsZWN0aW9uIGp1bXBzMjsKKwkJCisgICAgICAgIGludCBsb2NhbCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7CisgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICBpbnQgaW50ZXIgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKGludGVyKTsKKworICAgICAgICBpbnQgb2JqZWN0Q291bnQgPSAwOworICAgICAgICBib29sZWFuIGludGVybWVkaWF0ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBqdW1wczIgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgaW50ZXJtZWRpYXRlID0gdXNlc0ludGVybWVkaWF0ZShmbWRzW2ldKTsKKyAgICAgICAgICAgIHNldFRhcmdldChjb2RlLmFsb2FkKCkuc2V0VGhpcygpLCBqdW1wcyk7CisgICAgICAgICAgICAvLyBpZiAobG9hZGVkLmdldChpKSkgb3IgKCFsb2FkZWQuZ2V0KGkpKSBkZXBlbmRpbmcgb24gaW50ZXIgcmVzcAorICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKCJsb2FkZWQiLCBCaXRTZXQuY2xhc3MpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEJpdFNldC5jbGFzcywgImdldCIsCisgICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgIGp1bXBzLmFkZChjb2RlLmlmbmUoKSk7CisKKyAgICAgICAgICAgIGlmIChpbnRlcm1lZGlhdGUpCisgICAgICAgICAgICAgICAgYWRkTG9hZEludGVybWVkaWF0ZShjb2RlLCBpLCBvYmplY3RDb3VudCwganVtcHMyLCBpbnRlcik7CisgICAgICAgICAgICBqdW1wczIuYWRkKGNvZGUuZ28yKCkpOworCisgICAgICAgICAgICAvLyBpZiAoZmV0Y2gucmVxdWlyZXNGZXRjaChmbWRzW2ldKSE9RmV0Y2hDb25maWd1cmF0aW9uLkZFVENIX05PTkUpCisgICAgICAgICAgICBzZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpLCBqdW1wcyk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLAorICAgICAgICAgICAgICAgICJnZXRNZXRhRGF0YSIsIENsYXNzTWV0YURhdGEuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGZtZHNbaV0uZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoQ2xhc3NNZXRhRGF0YS5jbGFzcywKKyAgICAgICAgICAgICAgICAiZ2V0RmllbGQiLCBGaWVsZE1ldGFEYXRhLmNsYXNzLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3N9KTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kIChGZXRjaENvbmZpZ3VyYXRpb24uY2xhc3MsIAorICAgICAgICAgICAgICAgICJyZXF1aXJlc0ZldGNoIiwgaW50LmNsYXNzLCBuZXcgQ2xhc3NbXXtGaWVsZE1ldGFEYXRhLmNsYXNzfSk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoRmV0Y2hDb25maWd1cmF0aW9uLkZFVENIX05PTkUpOworICAgICAgICAgICAganVtcHMyLmFkZChjb2RlLmlmaWNtcGVxKCkpOworICAgICAgICAgICAgYWRkTG9hZChiYywgY29kZSwgZm1kc1tpXSwgb2JqZWN0Q291bnQsIGxvY2FsLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGp1bXBzID0ganVtcHMyOworICAgICAgICAgICAgaWYgKHJlcGxhY2VUeXBlKGZtZHNbaV0pID49IEphdmFUeXBlcy5PQkpFQ1QpCisgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBzZXRUYXJnZXQoY29kZS52cmV0dXJuKCksIGp1bXBzKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRMb2FkV2l0aEZpZWxkc01ldGhvZChCQ0NsYXNzIGJjLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgQ29kZSBjb2RlID0gYWRkTG9hZE1ldGhvZChiYywgdHJ1ZSk7CisgICAgICAgIC8vIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgLy8gCQlGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBjb25uKQorICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIENvbGxlY3Rpb24ganVtcHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBDb2xsZWN0aW9uIGp1bXBzMjsKKyAgICAgICAgaW50IG9iamVjdENvdW50ID0gMDsKKyAgICAgICAgYm9vbGVhbiBpbnRlcm1lZGlhdGU7CisgICAgICAgIGludCBsb2NhbCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7CisgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICBpbnQgaW50ZXIgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKGludGVyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGp1bXBzMiA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSB1c2VzSW50ZXJtZWRpYXRlKGZtZHNbaV0pOworICAgICAgICAgICAgLy8gaWYgKGZpZWxkcy5nZXQoaSkpCisgICAgICAgICAgICAvLyB7CisgICAgICAgICAgICAvLyAJCWlmIChsb2FkZWQuZ2V0KGkpKQorICAgICAgICAgICAgc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgxKSwganVtcHMpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEJpdFNldC5jbGFzcywgImdldCIsCisgICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgIGp1bXBzMi5hZGQoY29kZS5pZmVxKCkpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgibG9hZGVkIiwgQml0U2V0LmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChCaXRTZXQuY2xhc3MsICJnZXQiLAorICAgICAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MsIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlKQorICAgICAgICAgICAgICAgIGp1bXBzLmFkZChjb2RlLmlmZXEoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAganVtcHMyLmFkZChjb2RlLmlmZXEoKSk7CisKKyAgICAgICAgICAgIGFkZExvYWQoYmMsIGNvZGUsIGZtZHNbaV0sIG9iamVjdENvdW50LCBsb2NhbCwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAodXNlc0ltcGxEYXRhKGZtZHNbaV0pKSB7CisgICAgICAgICAgICAgICAgLy8gbG9hZEltcGxEYXRhKHNtLCBpKTsKKyAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKCJsb2FkSW1wbERhdGEiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywgaW50LmNsYXNzIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaWVsZHMuY2xlYXIoaSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMSk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoQml0U2V0LmNsYXNzLCAiY2xlYXIiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzIH0pOworCisgICAgICAgICAgICBqdW1wczIuYWRkKGNvZGUuZ28yKCkpOworCisgICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlKQorICAgICAgICAgICAgICAgIHNldFRhcmdldChhZGRMb2FkSW50ZXJtZWRpYXRlCisgICAgICAgICAgICAgICAgICAgIChjb2RlLCBpLCBvYmplY3RDb3VudCwganVtcHMyLCBpbnRlciksIGp1bXBzKTsKKworICAgICAgICAgICAganVtcHMgPSBqdW1wczI7CisgICAgICAgICAgICBpZiAocmVwbGFjZVR5cGUoZm1kc1tpXSkgPj0gSmF2YVR5cGVzLk9CSkVDVCkKKyAgICAgICAgICAgICAgICBvYmplY3RDb3VudCsrOworICAgICAgICB9CisgICAgICAgIHNldFRhcmdldChjb2RlLnZyZXR1cm4oKSwganVtcHMpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjbGFyZSBhbmQgc3RhcnQgdGhlIGJhc2UgbG9hZCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBDb2RlIGFkZExvYWRNZXRob2QoQkNDbGFzcyBiYywgYm9vbGVhbiBmaWVsZHMpIHsKKyAgICAgICAgQ2xhc3NbXSBhcmdzID0gbnVsbDsKKyAgICAgICAgaWYgKGZpZWxkcykKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbXXsgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywgQml0U2V0LmNsYXNzLAorICAgICAgICAgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbi5jbGFzcywgT2JqZWN0LmNsYXNzIH07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbXXsgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OworICAgICAgICBCQ01ldGhvZCBsb2FkID0gYmMuZGVjbGFyZU1ldGhvZCgibG9hZCIsIHZvaWQuY2xhc3MsIGFyZ3MpOworICAgICAgICBDb2RlIGNvZGUgPSBsb2FkLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy9sb2FkVmVyc2lvbihzbSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKCJsb2FkVmVyc2lvbiIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcyB9KTsKKworICAgICAgICAvL2xvYWRJbXBsRGF0YShzbSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKCJsb2FkSW1wbERhdGEiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW117IE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MgfSk7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZmllbGQgbG9hZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEluc3RydWN0aW9uIGFkZExvYWQoQkNDbGFzcyBiYywgQ29kZSBjb2RlLCBGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgaW50IG9iamVjdENvdW50LCBpbnQgbG9jYWwsIGJvb2xlYW4gZmllbGRzKSB7CisgICAgICAgIGludCBpbmRleCA9IGZtZC5nZXRJbmRleCgpOworICAgICAgICBpbnQgdHlwZUNvZGUgPSByZXBsYWNlVHlwZShmbWQpOworICAgICAgICBJbnN0cnVjdGlvbiBmaXJzdDsKKyAgICAgICAgaWYgKHR5cGVDb2RlIDwgSmF2YVR5cGVzLk9CSkVDVCkgeworICAgICAgICAgICAgLy8gc20uc3RvcmU8dHlwZT4oaSwgZmllbGQ8aT4pCisgICAgICAgICAgICBDbGFzcyB0eXBlID0gZm9yVHlwZShmbWQuZ2V0VHlwZUNvZGUoKSk7CisgICAgICAgICAgICBmaXJzdCA9IGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpbmRleCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGdldEZpZWxkTmFtZShpbmRleCksIHR5cGUpOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAic3RvcmUiICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZSh0eXBlLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcywgdHlwZSB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZtZCA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoaSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZmllbGRzID8gMSA6IDA7CisgICAgICAgICAgICBmaXJzdCA9IGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgImdldE1ldGFEYXRhIiwgQ2xhc3NNZXRhRGF0YS5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoZm1kLmdldEluZGV4KCkpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKENsYXNzTWV0YURhdGEuY2xhc3MsICJnZXRGaWVsZCIsCisgICAgICAgICAgICAgICAgRmllbGRNZXRhRGF0YS5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICAgICAgLy8gc20uc3RvcmVGaWVsZChpLCB0b0ZpZWxkKHNtLCBmbWQsIG9iamVjdHNbb2JqZWN0Q291bnRdLAorICAgICAgICAgICAgLy8gCQlmZXRjaCwgY29udGV4dCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaW5kZXgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChsb2NhbCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKCJvYmplY3RzIiwgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKG9iamVjdENvdW50KTsKKyAgICAgICAgICAgIGNvZGUuYWFsb2FkKCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMSArIG9mZnNldCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMiArIG9mZnNldCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoYmMuZ2V0TmFtZSgpLCAidG9GaWVsZCIsCisgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgdG9TdHJpbmdzKG5ldyBDbGFzc1tdeyAKKyAgICAgICAgICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLCBGaWVsZE1ldGFEYXRhLmNsYXNzLAorICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgRmV0Y2hDb25maWd1cmF0aW9uLmNsYXNzLCBPYmplY3QuY2xhc3MgfSkpOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAic3RvcmVGaWVsZCIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcywgT2JqZWN0LmNsYXNzIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGludGVybWVkaWF0ZSBkYXRhIGlmIHBvc3NpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgSW5zdHJ1Y3Rpb24gYWRkTG9hZEludGVybWVkaWF0ZShDb2RlIGNvZGUsIGludCBpbmRleCwKKyAgICAgICAgaW50IG9iamVjdENvdW50LCBDb2xsZWN0aW9uIGp1bXBzMiwgaW50IGludGVyKSB7CisgICAgICAgIC8vIHsKKyAgICAgICAgLy8gCQlPYmplY3QgaW50ZXIgPSBvYmplY3RzW29iamVjdENvdW50XTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gZmlyc3QgPSBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoIm9iamVjdHMiLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShvYmplY3RDb3VudCk7CisgICAgICAgIGNvZGUuYWFsb2FkKCk7CisgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwoaW50ZXIpOworICAgICAgICAvLyAJCWlmIChpbnRlciAhPSBudWxsICYmICFzbS5nZXRMb2FkZWQoKS5nZXQoaW5kZXgpKQorICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwoaW50ZXIpOworICAgICAgICBqdW1wczIuYWRkKGNvZGUuaWZudWxsKCkpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAiZ2V0TG9hZGVkIiwgQml0U2V0LmNsYXNzLCBudWxsKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGluZGV4KTsKKyAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEJpdFNldC5jbGFzcywgImdldCIsCisgICAgICAgICAgICBib29sZWFuLmNsYXNzLCBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICBqdW1wczIuYWRkKGNvZGUuaWZuZSgpKTsKKyAgICAgICAgLy8JCQlzbS5zZXRJbnRlcm1lZGlhdGUoaW5kZXgsIGludGVyKTsKKyAgICAgICAgLy8JfSAgLy8gZW5kIGVsc2UKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaW5kZXgpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwoaW50ZXIpOworICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLAorICAgICAgICAgICAgInNldEludGVybWVkaWF0ZSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzLCBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkU3RvcmVNZXRob2RzKEJDQ2xhc3MgYmMsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICAvLyBpLmUuIHZvaWQgc3RvcmUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcyk7CisgICAgICAgIGFkZFN0b3JlTWV0aG9kKGJjLCBtZXRhLCB0cnVlKTsKKyAgICAgICAgLy8gaS5lLiB2b2lkIHN0b3JlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pOworICAgICAgICBhZGRTdG9yZU1ldGhvZChiYywgbWV0YSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRTdG9yZU1ldGhvZChCQ0NsYXNzIGJjLCBDbGFzc01ldGFEYXRhIG1ldGEsCisgICAgICAgIGJvb2xlYW4gZmllbGRzKSB7CisgICAgICAgIEJDTWV0aG9kIHN0b3JlOworICAgICAgICBpZiAoZmllbGRzKQorICAgICAgICAgICAgc3RvcmUgPSBiYy5kZWNsYXJlTWV0aG9kKCJzdG9yZSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsIEJpdFNldC5jbGFzcyB9KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RvcmUgPSBiYy5kZWNsYXJlTWV0aG9kKCJzdG9yZSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MgfSk7CisgICAgICAgIENvZGUgY29kZSA9IHN0b3JlLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSgpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoImluaXRpYWxpemUiLCB2b2lkLmNsYXNzLCBudWxsKTsKKworICAgICAgICAvLyBzdG9yZVZlcnNpb24oc20pOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZCgic3RvcmVWZXJzaW9uIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzIH0pOworCisgICAgICAgIC8vIHN0b3JlSW1wbERhdGEoc20pOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZCgic3RvcmVJbXBsRGF0YSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcyB9KTsKKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIENvbGxlY3Rpb24ganVtcHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBpbnQgb2JqZWN0Q291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmaWVsZHMpIHsKKyAgICAgICAgICAgICAgICAvLyAgaWYgKGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5nZXQoaW5kZXgpKQorICAgICAgICAgICAgICAgIHNldFRhcmdldChjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMSksIGp1bXBzKTsKKyAgICAgICAgICAgICAgICBqdW1wcy5hZGQoY29kZS5pZm51bGwoKSk7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoQml0U2V0LmNsYXNzLCAiZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgICAgICBqdW1wcy5hZGQoY29kZS5pZmVxKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZiAoc20uZ2V0TG9hZGVkKCkuZ2V0KGluZGV4KSkpCisgICAgICAgICAgICAgICAgc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKSwganVtcHMpOworICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICJnZXRMb2FkZWQiLCBCaXRTZXQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoQml0U2V0LmNsYXNzLCAiZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgICAgICBqdW1wcy5hZGQoY29kZS5pZmVxKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkU3RvcmUoYmMsIGNvZGUsIGZtZHNbaV0sIG9iamVjdENvdW50KTsKKyAgICAgICAgICAgIGlmICh1c2VzSW50ZXJtZWRpYXRlKGZtZHNbaV0pKSB7CisgICAgICAgICAgICAgICAgSnVtcEluc3RydWN0aW9uIGVsc2VJbnMgPSBjb2RlLmdvMigpOworICAgICAgICAgICAgICAgIC8vIGVsc2UgaWYgKCFsb2FkZWQuZ2V0KGluZGV4KSkKKyAgICAgICAgICAgICAgICBzZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFRoaXMoKSwganVtcHMpOworICAgICAgICAgICAgICAgIGp1bXBzLmFkZChlbHNlSW5zKTsKKyAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoImxvYWRlZCIsIEJpdFNldC5jbGFzcyk7CisgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChCaXRTZXQuY2xhc3MsICJnZXQiLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuLmNsYXNzLCBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICAgICAgICAgIGp1bXBzLmFkZChjb2RlLmlmbmUoKSk7CisgICAgICAgICAgICAgICAgLy8gT2JqZWN0IHZhbCA9IHNtLmdldEludGVybWVkaWF0ZShpbmRleCk7CisgICAgICAgICAgICAgICAgLy8gaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIC8vIAkJb2JqZWN0c1tvYmplY3RDb3VudF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAiZ2V0SW50ZXJtZWRpYXRlIiwgT2JqZWN0LmNsYXNzLCBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICAgICAgICAgIGludCBsb2NhbCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgICAgICAgICAgY29kZS5hc3RvcmUoKS5zZXRMb2NhbChsb2NhbCk7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKGxvY2FsKTsKKyAgICAgICAgICAgICAgICBqdW1wcy5hZGQoY29kZS5pZm51bGwoKSk7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoIm9iamVjdHMiLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKG9iamVjdENvdW50KTsKKyAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICAgICAgICAgIGNvZGUuYWFzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcGxhY2VUeXBlKGZtZHNbaV0pID49IEphdmFUeXBlcy5PQkpFQ1QpCisgICAgICAgICAgICAgICAgb2JqZWN0Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBzZXRUYXJnZXQoY29kZS52cmV0dXJuKCksIGp1bXBzKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRTdG9yZShCQ0NsYXNzIGJjLCBDb2RlIGNvZGUsIEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBpbnQgb2JqZWN0Q291bnQpIHsKKyAgICAgICAgaW50IHR5cGVDb2RlID0gcmVwbGFjZVR5cGUoZm1kKTsKKyAgICAgICAgaW50IGluZGV4ID0gZm1kLmdldEluZGV4KCk7CisgICAgICAgIGlmICh0eXBlQ29kZSA8IEphdmFUeXBlcy5PQkpFQ1QpIHsKKyAgICAgICAgICAgIENsYXNzIHR5cGUgPSBmb3JUeXBlKHR5cGVDb2RlKTsKKyAgICAgICAgICAgIC8vIGZpZWxkPGk+ID0gc20uZmV0Y2g8VHlwZT4oaW5kZXgpCisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGluZGV4KTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgImZldGNoIiArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUodHlwZS5nZXROYW1lKCkpLCB0eXBlLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoZ2V0RmllbGROYW1lKGluZGV4KSwgdHlwZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKCJsb2FkZWQiLCBCaXRTZXQuY2xhc3MpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGluZGV4KTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChCaXRTZXQuY2xhc3MsICJzZXQiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPYmplY3QgdmFsID0gdG9EYXRhKHNtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoaW5kZXgpLAorICAgICAgICAgICAgLy8gCQlzbS5mZXRjaEZpZWxkKGluZGV4LCBmYWxzZSksIHNtLmdldENvbnRleHQoKSk7CisgICAgICAgICAgICBpbnQgbG9jYWwgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgImdldE1ldGFEYXRhIiwgQ2xhc3NNZXRhRGF0YS5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoZm1kLmdldEluZGV4KCkpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKENsYXNzTWV0YURhdGEuY2xhc3MsCisgICAgICAgICAgICAgICAgImdldEZpZWxkIiwgRmllbGRNZXRhRGF0YS5jbGFzcywgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShmbWQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoZmFsc2UpOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAiZmV0Y2hGaWVsZCIsIE9iamVjdC5jbGFzcywgbmV3IENsYXNzW10KKyAgICAgICAgICAgICAgICB7IGludC5jbGFzcywgYm9vbGVhbi5jbGFzcyB9KTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgImdldENvbnRleHQiLCBTdG9yZUNvbnRleHQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKGJjLmdldE5hbWUoKSwgInRvRGF0YSIsCisgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgdG9TdHJpbmdzKG5ldyBDbGFzcyBbXXsKKyAgICAgICAgICAgICAgICBGaWVsZE1ldGFEYXRhLmNsYXNzLCBPYmplY3QuY2xhc3MsIFN0b3JlQ29udGV4dC5jbGFzcyB9KSk7CisgICAgICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKGxvY2FsKTsKKworICAgICAgICAgICAgLy8gaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyAJCXZhbCA9IG51bGw7CisgICAgICAgICAgICAvLyAJCWxvYWRlZC5jbGVhcihpbmRleCk7CisgICAgICAgICAgICAvLyAJfSBlbHNlCisgICAgICAgICAgICAvLyAJCWxvYWRlZC5zZXQoaW5kZXgpOworICAgICAgICAgICAgLy8gCW9iamVjdHNbb2JqZWN0Q291bnRdID0gdmFsOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKGxvY2FsKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoQWJzdHJhY3RQQ0RhdGEuY2xhc3MsICJOVUxMIiwKKyAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmaW5zID0gY29kZS5pZmFjbXBuZSgpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldE51bGwoKTsKKyAgICAgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgibG9hZGVkIiwgQml0U2V0LmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpbmRleCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoQml0U2V0LmNsYXNzLCAiY2xlYXIiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gZ28yID0gY29kZS5nbzIoKTsKKyAgICAgICAgICAgIGlmaW5zLnNldFRhcmdldChjb2RlLmFsb2FkKCkuc2V0VGhpcygpKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgibG9hZGVkIiwgQml0U2V0LmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpbmRleCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoQml0U2V0LmNsYXNzLCAic2V0Iiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICAgICAgZ28yLnNldFRhcmdldChjb2RlLmFsb2FkKCkuc2V0VGhpcygpKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgib2JqZWN0cyIsIE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShvYmplY3RDb3VudCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwobG9jYWwpOworICAgICAgICAgICAgY29kZS5hYXN0b3JlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1c2VzSW1wbERhdGEoZm1kKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBzdG9yZUltcGxEYXRhKHNtLCBpLCBsb2FkZWQuZ2V0KGkpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpbmRleCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgibG9hZGVkIiwgQml0U2V0LmNsYXNzKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGluZGV4KTsKKyAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEJpdFNldC5jbGFzcywgImdldCIsIGJvb2xlYW4uY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoInN0b3JlSW1wbERhdGEiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW117IE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsIGludC5jbGFzcywgYm9vbGVhbi5jbGFzcyB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTmV3RW1iZWRkZWQoQkNDbGFzcyBiYykgeworICAgICAgICAvLyB2b2lkIG5ld0VtYmVkZGVkUENEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW1iZWRkZWQpCisgICAgICAgIEJDTWV0aG9kIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKCJuZXdFbWJlZGRlZFBDRGF0YSIsIFBDRGF0YS5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBPcGVuSlBBU3RhdGVNYW5hZ2VyLmNsYXNzIH0pOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRoLmdldENvZGUodHJ1ZSk7CisgICAgICAgIC8vIHJldHVybiBnZXRTdG9yYWdlR2VuZXJhdG9yKCkuZ2VuZXJhdGVQQ0RhdGEKKyAgICAgICAgLy8gCQkoc20uZ2V0SWQoKSwgc20uZ2V0TWV0YURhdGEoKSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCgic3RvcmFnZUdlbmVyYXRvciIsIFBDRGF0YUdlbmVyYXRvci5jbGFzcyk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICJnZXRJZCIsIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywKKyAgICAgICAgICAgICJnZXRNZXRhRGF0YSIsIENsYXNzTWV0YURhdGEuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoUENEYXRhR2VuZXJhdG9yLmNsYXNzLAorICAgICAgICAgICAgImdlbmVyYXRlUENEYXRhIiwgUENEYXRhLmNsYXNzLCBuZXcgQ2xhc3NbXQorICAgICAgICAgICAgeyBPYmplY3QuY2xhc3MsIENsYXNzTWV0YURhdGEuY2xhc3MgfSk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEdldERhdGEoQkNDbGFzcyBiYykgeworICAgICAgICAvLyByZXR1cm4gZ2V0T2JqZWN0RmllbGQoaSk7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IGJjLmRlY2xhcmVNZXRob2QoImdldERhdGEiLCBPYmplY3QuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5pbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoImdldE9iamVjdCIsIE9iamVjdC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLworICAgIC8vIFV0aWxpdGllcworICAgIC8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbGlkIHtAbGluayBKYXZhVHlwZXN9IGNvbnN0YW50IGZvciB0aGUgZ2l2ZW4gZmllbGQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlcGxhY2VUeXBlKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGlmICh1c2VzSW50ZXJtZWRpYXRlKGZtZCkpCisgICAgICAgICAgICByZXR1cm4gSmF2YVR5cGVzLk9CSkVDVDsKKyAgICAgICAgcmV0dXJuIGZtZC5nZXRUeXBlQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGdpdmVuIGZpZWxkIHVzZXMgYSBjYWNoZWFibGUgaW50ZXJtZWRpYXRlIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzZXNJbnRlcm1lZGlhdGUoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgcmV0dXJuIGZtZC51c2VzSW50ZXJtZWRpYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBtaWdodCBoYXZlIGNhY2hlYWJsZSBjbGFzcy1sZXZlbCBpbXBsIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0ltcGxEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBnaXZlbiBmaWVsZCBtaWdodCBoYXZlIGNhY2hlYWJsZSBpbXBsIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0ltcGxEYXRhKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIHJldHVybiBmbWQudXNlc0ltcGxEYXRhKCkgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGZpZWxkcyB3aXRoIGNhY2hlYWJsZSBpbXBsIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY291bnRJbXBsRGF0YUZpZWxkcyhDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBtZXRhLmdldEZpZWxkcygpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAodXNlc0ltcGxEYXRhKGZtZHNbaV0pKQorICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbWV0aG9kIHdoaWNoIGRlZmVycyB0byBBYnN0cmFjdFBDRGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjYWxsQWJzdHJhY3RQQ0RhdGEoQkNDbGFzcyBiYywgU3RyaW5nIG5hbWUsIENsYXNzIHJldFR5cGUsCisgICAgICAgIENsYXNzW10gYXJncykgeworICAgICAgICBCQ01ldGhvZCBtZXRoID0gYmMuZGVjbGFyZU1ldGhvZChuYW1lLCByZXRUeXBlLCBhcmdzKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb2RlLnhsb2FkKCkuc2V0UGFyYW0oaSkuc2V0VHlwZShhcmdzW2ldKTsKKyAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEFic3RyYWN0UENEYXRhLmNsYXNzLCBuYW1lLCByZXRUeXBlLAorICAgICAgICAgICAgYXJncyk7CisgICAgICAgIGlmICghdm9pZC5jbGFzcy5lcXVhbHMocmV0VHlwZSkpCisgICAgICAgICAgICBjb2RlLnhyZXR1cm4oKS5zZXRUeXBlKHJldFR5cGUpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBKdW1wSW5zdHJ1Y3Rpb259cyB0byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24sCisgICAgICogY2xlYXJpbmcgdGhlIGNvbGxlY3Rpb24gaW4gdGhlIHByb2Nlc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KEluc3RydWN0aW9uIGlucywgQ29sbGVjdGlvbiBqdW1wcykgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0ganVtcHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICgoSnVtcEluc3RydWN0aW9uKSBpdC5uZXh0KCkpLnNldFRhcmdldChpbnMpOworICAgICAgICBqdW1wcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2xhc3NlcyB0byBzdHJpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRvU3RyaW5ncyhDbGFzc1tdIGNscykgeworICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1tjbHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc3RyaW5nc1tpXSA9IGNsc1tpXS5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiBzdHJpbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIER5bmFtaWMge0BsaW5rIFBDRGF0YX1zIGdlbmVyYXRlZCB3aWxsIGltcGxlbWVudCB0aGlzIGludGVyZmFjZQorICAgICAqIHRvIHNpbXBsaWZ5IGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIER5bmFtaWNQQ0RhdGEgZXh0ZW5kcyBQQ0RhdGEgeworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElkKE9iamVjdCBvaWQpOworCisgICAgICAgIHB1YmxpYyBQQ0RhdGFHZW5lcmF0b3IgZ2V0U3RvcmFnZUdlbmVyYXRvcigpOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0b3JhZ2VHZW5lcmF0b3IgKFBDRGF0YUdlbmVyYXRvciBnZW5lcmF0b3IpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9QQ0VuaGFuY2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENFbmhhbmNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjM3YzcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENFbmhhbmNlci5qYXZhCkBAIC0wLDAgKzEsMzcwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZTsKKworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3M7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNsYXNzQXJnUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5CeXRlY29kZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuU2VydmljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlRlbXBvcmFyeUNsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuR2VuZXJhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5CeXRlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQ2hhcklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkRhdGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Eb3VibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5GbG9hdElkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkxvbmdJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PYmplY3RJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TaG9ydElkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0cmluZ0lkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0ZpZWxkOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNNZXRob2Q7CitpbXBvcnQgc2VycC5ieXRlY29kZS5Db2RlOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQ29uc3RhbnRzOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuRXhjZXB0aW9uczsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkZpZWxkSW5zdHJ1Y3Rpb247CitpbXBvcnQgc2VycC5ieXRlY29kZS5HZXRGaWVsZEluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuSWZJbnN0cnVjdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuSnVtcEluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuTG9hZEluc3RydWN0aW9uOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuTWV0aG9kSW5zdHJ1Y3Rpb247CitpbXBvcnQgc2VycC5ieXRlY29kZS5Qcm9qZWN0OworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuVGFibGVTd2l0Y2hJbnN0cnVjdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBCeXRlY29kZSBlbmhhbmNlciB1c2VkIHRvIGVuaGFuY2UgcGVyc2lzdGVudCBjbGFzc2VzIGZyb20gbWV0YWRhdGEuIFRoZQorICogZW5oYW5jZXIgbXVzdCBiZSBpbnZva2VkIG9uIGFsbCBwZXJzaXN0ZW5jZS1jYXBhYmxlIGFuZCBwZXJzaXN0ZW5jZSBhd2FyZQorICogY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgUENFbmhhbmNlciB7CisgICAgLy8gRGVzaWduYXRlcyBhIHZlcnNpb24gZm9yIG1haW50YWluaW5nIGNvbXBhdGJpbGl0eSB3aGVuIFBDRW5oYW5jZXIKKyAgICAvLyBtb2RpZmllcyBlbmhhbmNlbWVudCB0aGF0IGNhbiBicmVhayBzZXJpYWxpemF0aW9uIG9yIG90aGVyIGNvbnRyYWN0cworICAgIC8vIEVhY2ggZW5oYW5jZWQgY2xhc3Mgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgdmlhCisgICAgLy8gcHVibGljIGludCBnZXRFbmhhbmNlbWVudENvbnRyYWN0VmVyc2lvbigpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5IQU5DRVJfVkVSU0lPTiA9IDI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkhBTkNFX05PTkUgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOSEFOQ0VfQVdBUkUgPSAyIDw8IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5IQU5DRV9JTlRFUkZBQ0UgPSAyIDw8IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5IQU5DRV9QQyA9IDIgPDwgMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSAicGMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFBDVFlQRSA9IFBlcnNpc3RlbmNlQ2FwYWJsZS5jbGFzczsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU00gPSBQUkUgKyAiU3RhdGVNYW5hZ2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBTTVRZUEUgPSBTdGF0ZU1hbmFnZXIuY2xhc3M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSEVSSVQgPSBQUkUgKyAiSW5oZXJpdGVkRmllbGRDb3VudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFROQU1FID0gIkdlbmVyaWNDb250ZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBVU0VSRVhDRVAgPSBVc2VyRXhjZXB0aW9uLmNsYXNzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElOVEVSTkVYQ0VQID0gSW50ZXJuYWxFeGNlcHRpb24uY2xhc3M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSEVMUEVSVFlQRSA9IFBDUmVnaXN0cnkuY2xhc3M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSID0gUFJFICsgIlBDU3VwZXJjbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgT0lERlNUWVBFID0gRmllbGRTdXBwbGllci5jbGFzczsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBPSURGQ1RZUEUgPSBGaWVsZENvbnN1bWVyLmNsYXNzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUENFbmhhbmNlci5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXV4aWxpYXJ5RW5oYW5jZXJbXSBfYXV4RW5oYW5jZXJzOworICAgIHN0YXRpYyB7CisgICAgICAgIENsYXNzW10gY2xhc3NlcyA9IFNlcnZpY2VzLmdldEltcGxlbWVudG9yQ2xhc3NlcygKKyAgICAgICAgICAgIEF1eGlsaWFyeUVuaGFuY2VyLmNsYXNzLCAKKyAgICAgICAgICAgIEF1eGlsaWFyeUVuaGFuY2VyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICBMaXN0IGF1eEVuaGFuY2VycyA9IG5ldyBBcnJheUxpc3QoY2xhc3Nlcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXV4RW5oYW5jZXJzLmFkZChjbGFzc2VzW2ldLm5ld0luc3RhbmNlKCkpOworCQkgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBhdXggZW5oYW5jZXIgbWF5IHJlbHkgb24gbm9uLWV4aXN0YW50IHNwZWMgY2xhc3NlcywgZXRjCisJCSAgICB9CisJCX0KKyAgICAJX2F1eEVuaGFuY2VycyA9IChBdXhpbGlhcnlFbmhhbmNlcltdKSBhdXhFbmhhbmNlcnMudG9BcnJheQorICAgICAgICAgICAgKG5ldyBBdXhpbGlhcnlFbmhhbmNlclthdXhFbmhhbmNlcnMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCQ0NsYXNzIF9wYzsKKyAgICBwcml2YXRlIGZpbmFsIE1ldGFEYXRhUmVwb3NpdG9yeSBfcmVwb3M7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01ldGFEYXRhIF9tZXRhOworICAgIHByaXZhdGUgZmluYWwgTG9nIF9sb2c7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9vaWRzID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2RlZkNvbnMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfZmFpbCA9IGZhbHNlOworICAgIHByaXZhdGUgRmlsZSBfZGlyID0gbnVsbDsKKyAgICBwcml2YXRlIEJ5dGVjb2RlV3JpdGVyIF93cml0ZXIgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF9iYWNraW5nRmllbGRzID0gbnVsbDsKKyAgICBwcml2YXRlIFNldCBfdmlvbGF0aW9ucyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbmZpZ3VyYXRpb24gYW5kIHR5cGUgdG8gZW5oYW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUENFbmhhbmNlcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHRoaXMoY29uZiwgbmV3IFByb2plY3QoKS5sb2FkQ2xhc3ModHlwZSksIChNZXRhRGF0YVJlcG9zaXRvcnkpIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbiBhbmQgdHlwZSB0byBlbmhhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBQQ0VuaGFuY2VyKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYsIENsYXNzTWV0YURhdGEgdHlwZSkgeworICAgICAgICB0aGlzKGNvbmYsIG5ldyBQcm9qZWN0KCkubG9hZENsYXNzKHR5cGUuZ2V0RGVzY3JpYmVkVHlwZSgpKSwKKyAgICAgICAgICAgIHR5cGUuZ2V0UmVwb3NpdG9yeSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgYnl0ZWNvZGUgcmVwcmVzZW50YXRpb24gZm8gdGhlIHR5cGUgdG8KKyAgICAgKiBlbmhhbmNlOyB0aGlzIGNhbiBiZSBjcmVhdGVkIGZyb20gYW55IHN0cmVhbSBvciBmaWxlCisgICAgICogQHBhcmFtIHJlcG9zIGEgbWV0YWRhdGEgcmVwb3NpdG9yeSB0byB1c2UgZm9yIG1ldGFkYXRhIGFjY2VzcywKKyAgICAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIG5ldyByZXBvcml0b3J5OyB0aGUgcmVwb3NpdG9yeQorICAgICAqIGZyb20gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gaXNuJ3QgdXNlZCBieSBkZWZhdWx0CisgICAgICogYmVjYXVzZSB0aGUgY29uZmlndXJhdGlvbiBtaWdodCBiZSBhbgorICAgICAqIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHN1YmNsYXNzIHdob3NlIG1ldGFkYXRhCisgICAgICogcmVxdWlyZWQgbW9yZSB0aGFuIGp1c3QgYmFzZSBtZXRhZGF0YSBmaWxlcworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI1BDRW5oYW5jZXIoT3BlbkpQQUNvbmZpZ3VyYXRpb24sIEJDQ2xhc3MsCisgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSwgQ2xhc3NMb2FkZXIpfSBpbnN0ZWFkLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgUENFbmhhbmNlcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBCQ0NsYXNzIHR5cGUsCisgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICB0aGlzKGNvbmYsIHR5cGUsIHJlcG9zLCAoQ2xhc3NMb2FkZXIpIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBieXRlY29kZSByZXByZXNlbnRhdGlvbiBmbyB0aGUgdHlwZSB0bworICAgICAqIGVuaGFuY2U7IHRoaXMgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhbnkgc3RyZWFtIG9yIGZpbGUKKyAgICAgKiBAcGFyYW0gcmVwb3MgYSBtZXRhZGF0YSByZXBvc2l0b3J5IHRvIHVzZSBmb3IgbWV0YWRhdGEgYWNjZXNzLAorICAgICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgbmV3IHJlcG9yaXRvcnk7IHRoZSByZXBvc2l0b3J5CisgICAgICogZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBpc24ndCB1c2VkIGJ5IGRlZmF1bHQKKyAgICAgKiBiZWNhdXNlIHRoZSBjb25maWd1cmF0aW9uIG1pZ2h0IGJlIGFuCisgICAgICogaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgc3ViY2xhc3Mgd2hvc2UgbWV0YWRhdGEKKyAgICAgKiByZXF1aXJlZCBtb3JlIHRoYW4ganVzdCBiYXNlIG1ldGFkYXRhIGZpbGVzCisgICAgICogQHBhcmFtIGxvYWRlciB0aGUgZW52aXJvbm1lbnQgY2xhc3Nsb2FkZXIgdG8gdXNlIGZvciBsb2FkaW5nCisgICAgICogY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBQQ0VuaGFuY2VyKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYsIEJDQ2xhc3MgdHlwZSwKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgX3BjID0gdHlwZTsKKyAgICAgICAgX2xvZyA9IGNvbmYuZ2V0TG9nKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19FTkhBTkNFKTsKKworICAgICAgICBpZiAocmVwb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgX3JlcG9zID0gY29uZi5uZXdNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICAgICAgX3JlcG9zLnNldFNvdXJjZU1vZGUoTWV0YURhdGFSZXBvc2l0b3J5Lk1PREVfTUVUQSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX3JlcG9zID0gcmVwb3M7CisgICAgICAgIF9tZXRhID0gX3JlcG9zLmdldE1ldGFEYXRhKHR5cGUuZ2V0VHlwZSgpLCBsb2FkZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbmZpZ3VyYXRpb24sIHR5cGUsIGFuZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUENFbmhhbmNlcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBCQ0NsYXNzIHR5cGUsCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfcGMgPSB0eXBlOworICAgICAgICBfbG9nID0gY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX0VOSEFOQ0UpOworICAgICAgICBfcmVwb3MgPSBtZXRhLmdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnl0ZWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzIGJlaW5nIG1hbmlwdWxhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBCQ0NsYXNzIGdldEJ5dGVjb2RlKCkgeworICAgICAgICByZXR1cm4gX3BjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWV0YWRhdGEgZm9yIHRoZSBjbGFzcyBiZWluZyBtYW5pcHVsYXRlZCwgb3IgbnVsbCBpZiBub3QKKyAgICAgKiBhIHBlcnNpc3RlbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuaGFuY2VyIHNob3VsZCBhZGQgYSBuby1hcmdzCisgICAgICogY29uc3RydWN0b3IgaWYgb25lIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGNsYXNzLiBPcGVuSlBBCisgICAgICogcmVxdWlyZXMgdGhhdCBhIG5vLWFyZyBjb25zdHJ1Y3RvciAod2hldGhlciBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcgorICAgICAqIG9yIGJ5IHRoZSB1c2VyKSBiZSBwcmVzZW50IGluIGEgUEMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QWRkRGVmYXVsdENvbnN0cnVjdG9yKCkgeworICAgICAgICByZXR1cm4gX2RlZkNvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZW5oYW5jZXIgc2hvdWxkIGFkZCBhIG5vLWFyZ3MKKyAgICAgKiBjb25zdHJ1Y3RvciBpZiBvbmUgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgY2xhc3MuIE9wZW5KUEEKKyAgICAgKiByZXF1aXJlcyB0aGF0IGEgbm8tYXJnIGNvbnN0cnVjdG9yICh3aGV0aGVyIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyCisgICAgICogb3IgYnkgdGhlIHVzZXIpIGJlIHByZXNlbnQgaW4gYSBQQy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGREZWZhdWx0Q29uc3RydWN0b3IoYm9vbGVhbiBhZGREZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgICAgICAgX2RlZkNvbnMgPSBhZGREZWZhdWx0Q29uc3RydWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBwZXJzaXN0ZW50IHR5cGUgdXNlcyBwcm9wZXJ0eSBhY2Nlc3MgYW5kCisgICAgICogYnl0ZWNvZGUgYW5hbHlzaXMgc2hvd3MgdGhhdCBpdCBtYXkgYmUgdmlvbGF0aW5nIE9wZW5KUEEncyBwcm9wZXJ0eQorICAgICAqIGFjY2VzcyByZXN0cmljdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5mb3JjZVByb3BlcnR5UmVzdHJpY3Rpb25zKCkgeworICAgICAgICByZXR1cm4gX2ZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBwZXJzaXN0ZW50IHR5cGUgdXNlcyBwcm9wZXJ0eSBhY2Nlc3MgYW5kCisgICAgICogYnl0ZWNvZGUgYW5hbHlzaXMgc2hvd3MgdGhhdCBpdCBtYXkgYmUgdmlvbGF0aW5nIE9wZW5KUEEncyBwcm9wZXJ0eQorICAgICAqIGFjY2VzcyByZXN0cmljdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5mb3JjZVByb3BlcnR5UmVzdHJpY3Rpb25zKGJvb2xlYW4gZmFpbCkgeworICAgICAgICBfZmFpbCA9IGZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgYnVpbGQgZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGNvZGUgdG8uIFRoZSBwcm9wZXIgcGFja2FnZQorICAgICAqIHN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYmVuZWF0aCB0aGlzIGRpcmVjdG9yeS4gRGVmYXVsdHMgdG8KKyAgICAgKiBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmcgY2xhc3MgZmlsZSBpZiBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIF9kaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgYnVpbGQgZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGNvZGUgdG8uIFRoZSBwcm9wZXIgcGFja2FnZQorICAgICAqIHN0cnVjdHVyZSB3aWxsIGJlIGNyZWFlZCBiZW5lYXRoIHRoaXMgZGlyZWN0b3J5LiBEZWZhdWx0cyB0bworICAgICAqIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZyBjbGFzcyBmaWxlIGlmIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KEZpbGUgZGlyKSB7CisgICAgICAgIF9kaXIgPSBkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHtAbGluayBCeXRlY29kZVdyaXRlcn0gdG8gd3JpdGUgdG8gb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlY29kZVdyaXRlciBnZXRCeXRlY29kZVdyaXRlcigpIHsKKyAgICAgICAgcmV0dXJuIF93cml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB7QGxpbmsgQnl0ZWNvZGVXcml0ZXJ9IHRvIHdyaXRlIHRoZSBieXRlY29kZSB0byBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZWNvZGVXcml0ZXIoQnl0ZWNvZGVXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIF93cml0ZXIgPSB3cml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBieXRlY29kZSBlbmhhbmNlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPkVOSEFOQ0VfKjwvY29kZT4gY29uc3RhbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJ1bigpIHsKKyAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImVuaGFuY2Utc3RhcnQiLCBfcGMuZ2V0VHlwZSgpKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGlmIG1hbmFnZWQgaW50ZXJmYWNlLCBza2lwCisgICAgICAgICAgICBpZiAoX3BjLmlzSW50ZXJmYWNlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVOSEFOQ0VfSU5URVJGQUNFOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IGVuaGFuY2VkCisgICAgICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBfcGMuZ2V0RGVjbGFyZWRJbnRlcmZhY2VUeXBlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhQQ1RZUEUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGMtdHlwZSIsIF9wYy5nZXRUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOSEFOQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHByb3BlcnRpZXMgYmVmb3JlIHJlcGxhY2luZyBmaWVsZCBhY2Nlc3Mgc28gdGhhdAorICAgICAgICAgICAgLy8gd2UgYnVpbGQgdXAgYSByZWNvcmQgb2YgYmFja2luZyBmaWVsZHMsIGV0YworICAgICAgICAgICAgaWYgKF9tZXRhICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBfbWV0YS5nZXRBY2Nlc3NUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfUFJPUEVSVFkpCisgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICByZXBsYWNlQW5kVmFsaWRhdGVGaWVsZEFjY2VzcygpOworICAgICAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbnMoKTsKKworICAgICAgICAgICAgaWYgKF9tZXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gRU5IQU5DRV9QQzsKKyAgICAgICAgICAgICAgICBlbmhhbmNlQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICBhZGRGaWVsZHMoKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0aWNJbml0aWFsaXplcigpOworICAgICAgICAgICAgICAgIGFkZFBDTWV0aG9kcygpOworICAgICAgICAgICAgICAgIGFkZEFjY2Vzc29ycygpOworICAgICAgICAgICAgICAgIGFkZEF0dGFjaERldGFjaENvZGUoKTsKKyAgICAgICAgICAgICAgICBhZGRTZXJpYWxpemF0aW9uQ29kZSgpOworICAgICAgICAgICAgICAgIGFkZENsb25pbmdDb2RlKCk7CisgICAgICAgICAgICAgICAgcnVuQXV4aWxpYXJ5RW5oYW5jZXJzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgicGVycy1hd2FyZSIsIF9wYy5nZXRUeXBlKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBFTkhBTkNFX0FXQVJFOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGdlbmVyYXRlZCBieXRlY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvcmQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWNvcmQoX3BjKTsKKyAgICAgICAgaWYgKF9vaWRzICE9IG51bGwpCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9vaWRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgIHJlY29yZCgoQkNDbGFzcykgaXRyLm5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWNvcmQoQkNDbGFzcyBiYykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF93cml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF93cml0ZXIud3JpdGUoYmMpOworICAgICAgICBlbHNlIGlmIChfZGlyID09IG51bGwpCisgICAgICAgICAgICBiYy53cml0ZSgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gRmlsZXMuZ2V0UGFja2FnZUZpbGUoX2RpciwgYmMuZ2V0UGFja2FnZU5hbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBiYy53cml0ZShuZXcgRmlsZShkaXIsIGJjLmdldENsYXNzTmFtZSgpICsgIi5jbGFzcyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIG1ldGhvZHMgaW4gdGhpcyBwcm9wZXJ0eS1hY2Nlc3MgaW5zdGFuY2UgYXJlCisgICAgICogd3JpdHRlbiBjb3JyZWN0bHkuIFRoaXMgbWV0aG9kIGFsc28gZ2F0aGVycyBpbmZvcm1hdGlvbiBvbiBlYWNoCisgICAgICogcHJvcGVydHkncyBiYWNraW5nIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnRpZXMoKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgTWV0aG9kIG1ldGg7CisgICAgICAgIEJDTWV0aG9kIGdldHRlciwgc2V0dGVyID0gbnVsbDsKKyAgICAgICAgQkNGaWVsZCByZXR1cm5lZCwgYXNzaWduZWQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKGZtZHNbaV0uZ2V0QmFja2luZ01lbWJlcigpIGluc3RhbmNlb2YgTWV0aG9kKSkgeworICAgICAgICAgICAgICAgIGFkZFZpb2xhdGlvbigicHJvcGVydHktYmFkLW1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgZm1kc1tpXSwgZm1kc1tpXS5nZXRCYWNraW5nTWVtYmVyKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGggPSAoTWV0aG9kKSBmbWRzW2ldLmdldEJhY2tpbmdNZW1iZXIoKTsKKyAgICAgICAgICAgIGdldHRlciA9IF9wYy5nZXREZWNsYXJlZE1ldGhvZChtZXRoLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtZXRoLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICAgICAgaWYgKGdldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlvbGF0aW9uKCJwcm9wZXJ0eS1uby1nZXR0ZXIiLCBuZXcgT2JqZWN0W117IGZtZHNbaV0gfSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm5lZCA9IGdldFJldHVybmVkRmllbGQoZ2V0dGVyKTsKKyAgICAgICAgICAgIGlmIChyZXR1cm5lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9iYWNraW5nRmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9iYWNraW5nRmllbGRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICBfYmFja2luZ0ZpZWxkcy5wdXQoZ2V0dGVyLmdldE5hbWUoKSwgcmV0dXJuZWQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0dGVyID0gX3BjLmdldERlY2xhcmVkTWV0aG9kKGdldFNldHRlck5hbWUoZm1kc1tpXSksCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkgfSk7CisgICAgICAgICAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRWaW9sYXRpb24oInByb3BlcnR5LW5vLXNldHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGZtZHNbaV0gfSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBzeW50aGV0aWMgc2V0dGVyCisgICAgICAgICAgICAgICAgICAgIHNldHRlciA9IF9wYy5kZWNsYXJlTWV0aG9kKGdldFNldHRlck5hbWUoZm1kc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKSB9KTsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGVyLm1ha2VQcml2YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIENvZGUgY29kZSA9IHNldHRlci5nZXRDb2RlKHRydWUpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgICAgICAgICBjb2RlLnhsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChyZXR1cm5lZCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2V0dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgYXNzaWduZWQgPSBnZXRBc3NpZ25lZEZpZWxkKHNldHRlcik7CisKKyAgICAgICAgICAgIGlmIChhc3NpZ25lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9iYWNraW5nRmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9iYWNraW5nRmllbGRzID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2JhY2tpbmdGaWVsZHMucHV0KHNldHRlci5nZXROYW1lKCksIGFzc2lnbmVkLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWQgIT0gcmV0dXJuZWQpCisgICAgICAgICAgICAgICAgICAgIGFkZFZpb2xhdGlvbigicHJvcGVydHktc2V0dGVyLWdldHRlci1taXNtYXRjaCIsIG5ldyBPYmplY3RbXQorICAgICAgICAgICAgICAgICAgICAgICAgeyBmbWRzW2ldLCBhc3NpZ25lZC5nZXROYW1lKCksIChyZXR1cm5lZCA9PSBudWxsKSAKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbCA6IHJldHVybmVkLmdldE5hbWUoKSB9LCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNldHRlciBtZXRob2QgZm9yIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2V0dGVyTmFtZShGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICByZXR1cm4gInNldCIgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKGZtZC5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmllbGQgcmV0dXJuZWQgYnkgdGhlIGdpdmVuIG1ldGhvZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIFBhY2thZ2UtcHJvdGVjdGVkIGFuZCBzdGF0aWMgZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgc3RhdGljIEJDRmllbGQgZ2V0UmV0dXJuZWRGaWVsZChCQ01ldGhvZCBtZXRoKSB7CisgICAgICAgIHJldHVybiBmaW5kRmllbGQobWV0aCwgbmV3IENvZGUoKS54cmV0dXJuKCkuc2V0VHlwZQorICAgICAgICAgICAgKG1ldGguZ2V0UmV0dXJuVHlwZSgpKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmllbGQgYXNzaWduZWQgaW4gdGhlIGdpdmVuIG1ldGhvZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIFBhY2thZ2UtcHJvdGVjdGVkIGFuZCBzdGF0aWMgZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgc3RhdGljIEJDRmllbGQgZ2V0QXNzaWduZWRGaWVsZChCQ01ldGhvZCBtZXRoKSB7CisgICAgICAgIHJldHVybiBmaW5kRmllbGQobWV0aCwgbmV3IENvZGUoKS5wdXRmaWVsZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpZWxkIHJldHVybmVkIC8gYXNzaWduZWQgYnkgPGNvZGU+bWV0aDwvY29kZT4uIFJldHVybnMKKyAgICAgKiBudWxsIGlmIG5vbi1maWVsZHMgKG1ldGhvZHMsIGxpdGVyYWxzLCBwYXJhbWV0ZXJzLCB2YXJpYWJsZXMpIGFyZQorICAgICAqIHJldHVybmVkLCBvciBpZiBub24tcGFyYW1ldGVycyBhcmUgYXNzaWduZWQgdG8gZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJDRmllbGQgZmluZEZpZWxkKEJDTWV0aG9kIG1ldGgsIEluc3RydWN0aW9uIHRlbXBsYXRlLAorICAgICAgICBib29sZWFuIGZpbmRBY2Nlc3NlZCkgeworICAgICAgICAvLyBpZ25vcmUgYW55IHN0YXRpYyBtZXRob2RzLiBPcGVuSlBBIG9ubHkgY3VycmVudGx5IHN1cHBvcnRzIG5vbi1zdGF0aWMKKyAgICAgICAgLy8gc2V0dGVycyBhbmQgZ2V0dGVycworICAgICAgICBpZiAobWV0aC5pc1N0YXRpYygpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKGZhbHNlKTsKKyAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBjb2RlLmJlZm9yZUZpcnN0KCk7CisKKyAgICAgICAgQkNGaWVsZCBmaWVsZCA9IG51bGwsIGN1cjsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gdGVtcGxhdGVJbnMsIHByZXZJbnMsIHR3b1ByZXZJbnM7CisgICAgICAgIHdoaWxlIChjb2RlLnNlYXJjaEZvcndhcmQodGVtcGxhdGUpKSB7CisgICAgICAgICAgICB0ZW1wbGF0ZUlucyA9IGNvZGUucHJldmlvdXMoKTsKKyAgICAgICAgICAgIGlmICghY29kZS5oYXNQcmV2aW91cygpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcHJldklucyA9IGNvZGUucHJldmlvdXMoKTsKKyAgICAgICAgICAgIGlmICghY29kZS5oYXNQcmV2aW91cygpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgdHdvUHJldklucyA9IGNvZGUucHJldmlvdXMoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIG9wY29kZSB0d28gYmVmb3JlIHRoZSB0ZW1wbGF0ZSB3YXMgYW4gYWxvYWRfMCwgY2hlY2sKKyAgICAgICAgICAgIC8vIGFnYWluc3QgdGhlIG1pZGRsZSBpbnN0cnVjdGlvbiBiYXNlZCBvbiB3aGF0IHR5cGUgb2YgZmluZAorICAgICAgICAgICAgLy8gd2UncmUgZG9pbmcKKyAgICAgICAgICAgIGlmICghKHR3b1ByZXZJbnMgaW5zdGFuY2VvZiBMb2FkSW5zdHJ1Y3Rpb24pCisgICAgICAgICAgICAgICAgfHwgISgoTG9hZEluc3RydWN0aW9uKSB0d29QcmV2SW5zKS5pc1RoaXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgLy8gaWYgdGhlIG1pZGRsZSBpbnN0cnVjdGlvbiB3YXMgYSBnZXRmaWVsZCwgdGhlbiBpdCdzIHRoZQorICAgICAgICAgICAgLy8gZmllbGQgdGhhdCdzIGJlaW5nIGFjY2Vzc2VkCisgICAgICAgICAgICBpZiAoIWZpbmRBY2Nlc3NlZCAmJiBwcmV2SW5zIGluc3RhbmNlb2YgR2V0RmllbGRJbnN0cnVjdGlvbikKKyAgICAgICAgICAgICAgICBjdXIgPSAoKEZpZWxkSW5zdHJ1Y3Rpb24pIHByZXZJbnMpLmdldEZpZWxkKCk7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1pZGRsZSBpbnN0cnVjdGlvbiB3YXMgYW4geGxvYWRfMSwgdGhlbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBtYXRjaGVkIGluc3RydWN0aW9uIGlzIHRoZSBmaWVsZCB0aGF0J3MgYmVpbmcgc2V0LgorICAgICAgICAgICAgZWxzZSBpZiAoZmluZEFjY2Vzc2VkICYmIHByZXZJbnMgaW5zdGFuY2VvZiBMb2FkSW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAmJiAoKExvYWRJbnN0cnVjdGlvbikgcHJldklucykuZ2V0UGFyYW0oKSA9PSAwKQorICAgICAgICAgICAgICAgIGN1ciA9ICgoRmllbGRJbnN0cnVjdGlvbikgdGVtcGxhdGVJbnMpLmdldEZpZWxkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGN1ciAhPSBmaWVsZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGZpZWxkID0gY3VyOworCisgICAgICAgICAgICAvLyByZWFkeSBmb3IgbmV4dCBzZWFyY2ggaXRlcmF0aW9uCisgICAgICAgICAgICBjb2RlLm5leHQoKTsKKyAgICAgICAgICAgIGNvZGUubmV4dCgpOworICAgICAgICAgICAgY29kZS5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCBhIHZpb2xhdGlvbiBvZiB0aGUgcHJvcGVydHkgYWNjZXNzIHJlc3RyaWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkVmlvbGF0aW9uKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgaWYgKF92aW9sYXRpb25zID09IG51bGwpCisgICAgICAgICAgICBfdmlvbGF0aW9ucyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIF92aW9sYXRpb25zLmFkZChfbG9jLmdldChrZXksIGFyZ3MpKTsKKyAgICAgICAgX2ZhaWwgfD0gZmF0YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIC8gdGhyb3cgcmVjb3JkZWQgcHJvcGVydHkgYWNjZXNzIHZpb2xhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NWaW9sYXRpb25zKCkgeworICAgICAgICBpZiAoX3Zpb2xhdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmcgc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF92aW9sYXRpb25zLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGl0ci5uZXh0KCkpOworICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChzZXApOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2UgbXNnID0gX2xvYy5nZXQoInByb3BlcnR5LXZpb2xhdGlvbnMiLCBidWYpOworCisgICAgICAgIGlmIChfZmFpbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cud2Fybihtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VkIGFsbCBkaXJlY3QgYWNjZXNzIHRvIG1hbmFnZWQgZmllbGRzIHdpdGggdGhlIGFwcHJvcHJpYXRlCisgICAgICogcGNHZXQvcGNTZXQgbWV0aG9kLiBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhY2Nlc3MgdG8gZmllbGRzCisgICAgICogb3duZWQgYnkgUGVyc2lzdGVuY2VDYXBhYmxlIGNsYXNzZXMgb3RoZXIgdGhhbiB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZUFuZFZhbGlkYXRlRmllbGRBY2Nlc3MoKSB7CisgICAgICAgIC8vIGNyZWF0ZSB0ZW1wbGF0ZSBwdXRmaWVsZC9nZXRmaWVsZCBpbnN0cnVjdGlvbnMgdG8gc2VhcmNoIGZvcgorICAgICAgICBDb2RlIHRlbXBsYXRlID0gbmV3IENvZGUoKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gcHV0ID0gdGVtcGxhdGUucHV0ZmllbGQoKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gZ2V0ID0gdGVtcGxhdGUuZ2V0ZmllbGQoKTsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gc3RhdCA9IHRlbXBsYXRlLmludm9rZXN0YXRpYygpOworCisgICAgICAgIC8vIGxvb2sgdGhyb3VnaCBhbGwgbWV0aG9kczsgdGhpcyBpcyBkb25lIGJlZm9yZSBhbnkgbWV0aG9kcyBhcmUgYWRkZWQKKyAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBleGNsdWRpbmcgc3ludGhldGljIG1ldGhvZHMuCisgICAgICAgIEJDTWV0aG9kW10gbWV0aG9kcyA9IF9wYy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgQ29kZSBjb2RlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvZGUgPSBtZXRob2RzW2ldLmdldENvZGUoZmFsc2UpOworCisgICAgICAgICAgICAvLyBkb24ndCBtb2RpZnkgdGhlIG1ldGhvZHMgc3BlY2lmaWVkIGJ5IHRoZSBhdXhpbGlhcnkgZW5oYW5jZXJzCisgICAgICAgICAgICBpZiAoY29kZSAhPSBudWxsICYmICFza2lwRW5oYW5jZShtZXRob2RzW2ldKSkgeworICAgICAgICAgICAgICAgIHJlcGxhY2VBbmRWYWxpZGF0ZUZpZWxkQWNjZXNzKGNvZGUsIGdldCwgdHJ1ZSwgc3RhdCk7CisgICAgICAgICAgICAgICAgcmVwbGFjZUFuZFZhbGlkYXRlRmllbGRBY2Nlc3MoY29kZSwgcHV0LCBmYWxzZSwgc3RhdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyBhbGwgaW5zdHJ1Y3Rpb25zIG1hdGNoaW5nIHRoZSBnaXZlbiB0ZW1wbGF0ZSBpbiB0aGUgZ2l2ZW4KKyAgICAgKiBjb2RlIGJsb2NrIHdpdGggY2FsbHMgdG8gdGhlIGFwcHJvcHJpYXRlIGdlbmVyYXRlZCBnZXR0ZXIvc2V0dGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGUgdGhlIGNvZGUgYmxvY2sgdG8gbW9kaWZ5OyB0aGUgY29kZSBpdGVyYXRvciB3aWxsCisgICAgICogYmUgcGxhY2VkIGJlZm9yZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb24gbWV0aG9kIHN0YXJ0LAorICAgICAqIGFuZCB3aWxsIGJlIGFmdGVyIHRoZSBsYXN0IGluc3RydWN0aW9uIG9uIG1ldGhvZCBjb21wbGV0aW9uCisgICAgICogQHBhcmFtIGlucyB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gdG8gc2VhcmNoIGZvcjsgZWl0aGVyIGEKKyAgICAgKiBnZXRmaWVsZCBvciBwdXRmaWVsZCBpbnN0cnVjdGlvbgorICAgICAqIEBwYXJhbSBnZXQgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBnZXQgaW5zdHJ1Y3Rpb24KKyAgICAgKiBAcGFyYW0gc3RhdCB0ZW1wbGF0ZSBpbnZva2VzdGF0aWMgaW5zdHJ1Y3Rpb24gdG8gcmVwbGFjZSB3aXRoCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VBbmRWYWxpZGF0ZUZpZWxkQWNjZXNzKENvZGUgY29kZSwgSW5zdHJ1Y3Rpb24gaW5zLAorICAgICAgICBib29sZWFuIGdldCwgSW5zdHJ1Y3Rpb24gc3RhdCkgeworICAgICAgICBjb2RlLmJlZm9yZUZpcnN0KCk7CisKKyAgICAgICAgRmllbGRJbnN0cnVjdGlvbiBmaTsKKyAgICAgICAgTWV0aG9kSW5zdHJ1Y3Rpb24gbWk7CisgICAgICAgIENsYXNzTWV0YURhdGEgb3duZXI7CisgICAgICAgIFN0cmluZyBuYW1lLCB0eXBlTmFtZSwgbWV0aG9kTmFtZTsKKyAgICAgICAgd2hpbGUgKGNvZGUuc2VhcmNoRm9yd2FyZChpbnMpKSB7CisgICAgICAgICAgICAvLyBiYWNrIHVwIHRvIHRoZSBtYXRjaGVkIGluc3RydWN0aW9uCisgICAgICAgICAgICBmaSA9IChGaWVsZEluc3RydWN0aW9uKSBjb2RlLnByZXZpb3VzKCk7CisgICAgICAgICAgICBuYW1lID0gZmkuZ2V0RmllbGROYW1lKCk7CisgICAgICAgICAgICB0eXBlTmFtZSA9IGZpLmdldEZpZWxkVHlwZU5hbWUoKTsKKyAgICAgICAgICAgIG93bmVyID0gZ2V0UGVyc2lzdGVuY2VDYXBhYmxlT3duZXIobmFtZSwKKyAgICAgICAgICAgICAgICBmaS5nZXRGaWVsZERlY2xhcmVyVHlwZSgpKTsKKworICAgICAgICAgICAgaWYgKG93bmVyICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvd25lci5nZXRBY2Nlc3NUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfUFJPUEVSVFkpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBkaXJlY3RseSBhY2Nlc3NpbmcgYSBmaWVsZCBpbiBhbm90aGVyIGNsYXNzCisgICAgICAgICAgICAgICAgLy8gaGllcmFyY2h5IHRoYXQgdXNlcyBwcm9wZXJ0eSBhY2Nlc3MsIHNvbWV0aGluZyBpcyB3cm9uZworICAgICAgICAgICAgICAgIGlmIChvd25lciAhPSBfbWV0YSAmJiBvd25lci5nZXREZWNsYXJlZEZpZWxkKG5hbWUpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgX21ldGEgIT0gbnVsbCAmJiAhb3duZXIuZ2V0RGVzY3JpYmVkVHlwZSgpLgorICAgICAgICAgICAgICAgICAgICBpc0Fzc2lnbmFibGVGcm9tKF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJwcm9wZXJ0eS1maWVsZC1hY2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBfbWV0YSwgb3duZXIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5nZXRNZXRob2QoKS5nZXROYW1lKCkgfSkpOworCisgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgZGlyZWN0bHkgYWNjZXNzaW5nIGEgcHJvcGVydHktYmFja2luZyBmaWVsZCBvdXRzaWRlCisgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGluIG91ciBvd24gY2xhc3MsIG5vdGlmeSB1c2VyCisgICAgICAgICAgICAgICAgaWYgKGlzQmFja2luZ0ZpZWxkT2ZBbm90aGVyUHJvcGVydHkobmFtZSwgY29kZSkpCisgICAgICAgICAgICAgICAgICAgIGFkZFZpb2xhdGlvbigicHJvcGVydHktZmllbGQtYWNjZXNzIiwgbmV3IE9iamVjdFtdeyBfbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyLCBuYW1lLCBjb2RlLmdldE1ldGhvZCgpLmdldE5hbWUoKSB9LCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBjb2RlLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm90IHBlcnNpc3RlbnQgZmllbGQ/CisgICAgICAgICAgICBpZiAob3duZXIgPT0gbnVsbCB8fCBvd25lci5nZXREZWNsYXJlZEZpZWxkKG5hbWUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb2RlLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGNhbGwgdG8gdGhlIGdlbmVyYXRlZCBhY2Nlc3MKKyAgICAgICAgICAgIC8vIG1ldGhvZAorICAgICAgICAgICAgbWkgPSAoTWV0aG9kSW5zdHJ1Y3Rpb24pIGNvZGUuc2V0KHN0YXQpOworCisgICAgICAgICAgICAvLyBpbnZva2UgdGhlIHByb3BlciBhY2Nlc3MgbWV0aG9kLCB3aGV0aGVyIGdldHRlciBvciBzZXR0ZXIKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoZ2V0KSA/IFBSRSArICJHZXQiIDogUFJFICsgIlNldCI7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gcHJlZml4ICsgbmFtZTsKKyAgICAgICAgICAgIGlmIChnZXQpIHsKKyAgICAgICAgICAgICAgICBtaS5zZXRNZXRob2QoZ2V0VHlwZShvd25lcikuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCB0eXBlTmFtZSwgbmV3IFN0cmluZ1tdCisgICAgICAgICAgICAgICAgICAgIHsgZ2V0VHlwZShvd25lcikuZ2V0TmFtZSgpIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaS5zZXRNZXRob2QoZ2V0VHlwZShvd25lcikuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCAidm9pZCIsIG5ldyBTdHJpbmdbXQorICAgICAgICAgICAgICAgICAgICB7IGdldFR5cGUob3duZXIpLmdldE5hbWUoKSwgdHlwZU5hbWUgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gYWNjZXNzZXMgYSBmaWVsZCB0aGF0IGlzIGEgYmFja2luZworICAgICAqIGZpZWxkIG9mIGFub3RoZXIgcHJvcGVydHkgaW4gdGhpcyBwcm9wZXJ0eS1hY2Nlc3MgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFja2luZ0ZpZWxkT2ZBbm90aGVyUHJvcGVydHkoU3RyaW5nIG5hbWUsIENvZGUgY29kZSkgeworICAgICAgICBTdHJpbmcgbWV0aE5hbWUgPSBjb2RlLmdldE1ldGhvZCgpLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuICEiPGluaXQ+Ii5lcXVhbHMobWV0aE5hbWUpCisgICAgICAgICAgICAmJiBfYmFja2luZ0ZpZWxkcyAhPSBudWxsCisgICAgICAgICAgICAmJiAhbmFtZS5lcXVhbHMoX2JhY2tpbmdGaWVsZHMuZ2V0KG1ldGhOYW1lKSkKKyAgICAgICAgICAgICYmIF9iYWNraW5nRmllbGRzLmNvbnRhaW5zVmFsdWUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byByZXR1cm4gdGhlIGRlY2xhcmluZyBQZXJzaXN0ZW5jZUNhcGFibGUgY2xhc3Mgb2YKKyAgICAgKiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBvd25lciB0aGUgbm9taW5hbCBvd25lciBvZiB0aGUgZmllbGQKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBmb3IgdGhlIFBlcnNpc3RlbmNlQ2FwYWJsZSB0eXBlIHRoYXQKKyAgICAgKiBkZWNsYXJlcyB0aGUgZmllbGQgKGFuZCB0aGVyZWZvcmUgaGFzIHRoZSBzdGF0aWMgbWV0aG9kKSwgb3IgbnVsbCBpZiBub25lCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIGdldFBlcnNpc3RlbmNlQ2FwYWJsZU93bmVyKFN0cmluZyBmaWVsZE5hbWUsCisgICAgICAgIENsYXNzIG93bmVyKSB7CisgICAgICAgIC8vIGZpbmQgdGhlIGFjdHVhbCBhbmNlc3RvciBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCwgdGhlbgorICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xhc3MgaXMgcGVyc2lzdGVudCwgYW5kIGlmIHRoZSBmaWVsZCBpcyBtYW5hZ2VkCisgICAgICAgIEZpZWxkIGYgPSBSZWZsZWN0aW9uLmZpbmRGaWVsZChvd25lciwgZmllbGROYW1lLCBmYWxzZSk7CisgICAgICAgIGlmIChmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBtYW5hZ2VkIGludGVyZmFjZQorICAgICAgICBpZiAoX21ldGEgIT0gbnVsbCAmJiBfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkuaXNJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiBfbWV0YTsKKworICAgICAgICByZXR1cm4gX3JlcG9zLmdldE1ldGFEYXRhKG93bmVyLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbGwgc3ludGhldGljIG1ldGhvZHMgdG8gdGhlIGJ5dGVjb2RlIGJ5IGRlbGVnYXRpbmcgdG8KKyAgICAgKiB0aGUgdmFyaW91cyBhZGRYWFhNZXRob2RzICgpIGZ1bmN0aW9ucyBpbiB0aGlzIGNsYXNzLiBJbmNsdWRlcworICAgICAqIGFsbCBzdGF0aWMgZmllbGQgYWNjZXNzIG1ldGhvZHMuCisgICAgICogTm90ZSB0aGF0IHRoZSAnc3RvY2snIG1ldGhvZHMgbGlrZSA8Y29kZT5wY0lzVHJhbnNhY3Rpb25hbDwvY29kZT4sCisgICAgICogPGNvZGU+cGNGZXRjaE9iamVjdElkPC9jb2RlPiwgZXRjIGFyZSBkZWZpbmVkIG9ubHkgaW4gdGhlCisgICAgICogbGVhc3QtZGVyaXZlZCBQZXJzaXN0ZW5jZUNhcGFibGUgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUENNZXRob2RzKCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZENsZWFyRmllbGRzTWV0aG9kKCk7CisgICAgICAgIGFkZE5ld0luc3RhbmNlTWV0aG9kKHRydWUpOworICAgICAgICBhZGROZXdJbnN0YW5jZU1ldGhvZChmYWxzZSk7CisgICAgICAgIGFkZE1hbmFnZWRGaWVsZENvdW50TWV0aG9kKCk7CisgICAgICAgIGFkZFJlcGxhY2VGaWVsZHNNZXRob2RzKCk7CisgICAgICAgIGFkZFByb3ZpZGVGaWVsZHNNZXRob2RzKCk7CisgICAgICAgIGFkZENvcHlGaWVsZHNNZXRob2QoKTsKKworICAgICAgICBpZiAoX21ldGEuZ2V0UENTdXBlcmNsYXNzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgYWRkU3RvY2tNZXRob2RzKCk7CisgICAgICAgICAgICBhZGRHZXRWZXJzaW9uTWV0aG9kKCk7CisgICAgICAgICAgICBhZGRSZXBsYWNlU3RhdGVNYW5hZ2VyTWV0aG9kKCk7CisKKyAgICAgICAgICAgIGlmIChfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSAhPSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OKQorICAgICAgICAgICAgICAgIGFkZE5vT3BBcHBsaWNhdGlvbklkZW50aXR5TWV0aG9kcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHRoZSBhcHAgaWQgbWV0aG9kcyB0byBlYWNoIHN1YmNsYXNzIHJhdGhlcgorICAgICAgICAvLyB0aGFuIGp1c3QgdGhlIHN1cGVyY2xhc3MsIHNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKKyAgICAgICAgLy8gYSBzdWJjbGFzcyB3aXRoIGFuIGFwcCBpZCBoaWVyYXJjaHkgdGhhdCBtYXRjaGVzIHRoZQorICAgICAgICAvLyBwZXJzaXN0ZW50IGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICAgICAgICBpZiAoX21ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5JRF9BUFBMSUNBVElPTgorICAgICAgICAgICAgJiYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpID09IG51bGwgfHwgX21ldGEuZ2V0T2JqZWN0SWRUeXBlKCkKKyAgICAgICAgICAgICE9IF9tZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkuZ2V0T2JqZWN0SWRUeXBlKCkpKSB7CisgICAgICAgICAgICBhZGRDb3B5S2V5RmllbGRzVG9PYmplY3RJZE1ldGhvZCh0cnVlKTsKKyAgICAgICAgICAgIGFkZENvcHlLZXlGaWVsZHNUb09iamVjdElkTWV0aG9kKGZhbHNlKTsKKyAgICAgICAgICAgIGFkZENvcHlLZXlGaWVsZHNGcm9tT2JqZWN0SWRNZXRob2QodHJ1ZSk7CisgICAgICAgICAgICBhZGRDb3B5S2V5RmllbGRzRnJvbU9iamVjdElkTWV0aG9kKGZhbHNlKTsKKyAgICAgICAgICAgIGFkZE5ld09iamVjdElkSW5zdGFuY2VNZXRob2QodHJ1ZSk7CisgICAgICAgICAgICBhZGROZXdPYmplY3RJZEluc3RhbmNlTWV0aG9kKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG1ldGhvZCB0byBjbGVhciBhbGwgcGVyc2lzdGVudCBmaWVsZHM7IHdlJ2xsIGNhbGwgdGhpcyBmcm9tCisgICAgICogdGhlIG5ldyBpbnN0YW5jZSBtZXRob2QgdG8gZW5zdXJlIHRoYXQgdW5sb2FkZWQgZmllbGRzIGhhdmUKKyAgICAgKiBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkQ2xlYXJGaWVsZHNNZXRob2QoKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHJvdGVjdGVkIHZvaWQgcGNDbGVhckZpZWxkcyAoKQorICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiQ2xlYXJGaWVsZHMiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIG1ldGhvZC5tYWtlUHJvdGVjdGVkKCk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIHN1cGVyLnBjQ2xlYXJGaWVsZHMgKCkKKyAgICAgICAgaWYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoZ2V0VHlwZShfbWV0YS4KKyAgICAgICAgICAgICAgICBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpKSwgUFJFICsgIkNsZWFyRmllbGRzIiwgdm9pZC5jbGFzcywgCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZtZHNbaV0uZ2V0TWFuYWdlbWVudCgpICE9IEZpZWxkTWV0YURhdGEuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgc3dpdGNoIChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgwRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMEYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMEwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkU2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBmbWRzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgPGNvZGU+cGNOZXdJbnN0YW5jZTwvY29kZT4gbWV0aG9kIHRvIHRoZSBieXRlY29kZS4KKyAgICAgKiBUaGVzZSBtZXRob2RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsIGhlbHBlciB0byBjcmVhdGUgbmV3CisgICAgICogbWFuYWdlZCBpbnN0YW5jZXMgZWZmaWNpZW50bHkgd2l0aG91dCByZWZsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9pZCBzZXQgdG8gdHJ1ZSB0byBtaW1pYyB0aGUgbWV0aG9kIHZlcnNpb24gdGhhdCB0YWtlcworICAgICAqIGFuIG9pZCB2YWx1ZSBhcyB3ZWxsIGFzIGEgc3RhdGUgbWFuYWdlcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGROZXdJbnN0YW5jZU1ldGhvZChib29sZWFuIG9pZCkgeworICAgICAgICAvLyBwdWJsaWMgUGVyc2lzdGVuY2VDYXBhYmxlIHBjTmV3SW5zdGFuY2UgKC4uLikKKyAgICAgICAgQ2xhc3NbXSBhcmdzID0KKyAgICAgICAgICAgIChvaWQpID8gbmV3IENsYXNzW117IFNNVFlQRSwgT2JqZWN0LmNsYXNzLCBib29sZWFuLmNsYXNzIH0KKyAgICAgICAgICAgICAgICA6IG5ldyBDbGFzc1tdeyBTTVRZUEUsIGJvb2xlYW4uY2xhc3MgfTsKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gX3BjLmRlY2xhcmVNZXRob2QoUFJFICsgIk5ld0luc3RhbmNlIiwgUENUWVBFLCBhcmdzKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy8gaWYgdGhlIHR5cGUgaXMgYWJzdHJhY3QsIHRocm93IGEgVXNlckV4Y2VwdGlvbgorICAgICAgICBpZiAoX3BjLmlzQWJzdHJhY3QoKSkgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oY29kZSwgVVNFUkVYQ0VQKTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworCisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gWFhYIHBjID0gbmV3IFhYWCAoKTsKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShfcGMpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoIjxpbml0PiIsIHZvaWQuY2xhc3MsIG51bGwpOworICAgICAgICBpbnQgaW5zdCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwoaW5zdCk7CisKKyAgICAgICAgLy8gaWYgKGNsZWFyKQorICAgICAgICAvLyAgIHBjLnBjQ2xlYXJGaWVsZHMgKCk7CisgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRQYXJhbSgob2lkKSA/IDIgOiAxKTsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIG5vY2xlYXIgPSBjb2RlLmlmZXEoKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKGluc3QpOworICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoUFJFICsgIkNsZWFyRmllbGRzIiwgdm9pZC5jbGFzcywgbnVsbCk7CisKKyAgICAgICAgLy8gcGMucGNTdGF0ZU1hbmFnZXIgPSBzbTsKKyAgICAgICAgbm9jbGVhci5zZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldExvY2FsKGluc3QpKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisKKyAgICAgICAgLy8gY29weSBrZXkgZmllbGRzIGZyb20gb2lkCisgICAgICAgIGlmIChvaWQpIHsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChpbnN0KTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgxKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChQUkUgKyAiQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZCIsCisgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW117IE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHVybiBwYzsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKGluc3QpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgPGNvZGU+cHJvdGVjdGVkIHN0YXRpYyBpbnQgcGNHZXRNYW5hZ2VkRmllbGRDb3VudCAoKTwvY29kZT4KKyAgICAgKiBtZXRob2QgdG8gdGhlIGJ5dGVjb2RlLCByZXR1cm5pbmcgdGhlIGluaGVyaXRlZCBmaWVsZCBjb3VudCBhZGRlZAorICAgICAqIHRvIHRoZSBudW1iZXIgb2YgbWFuYWdlZCBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgUGVyc2lzdGVuY2VDYXBhYmxlIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRNYW5hZ2VkRmllbGRDb3VudE1ldGhvZCgpIHsKKyAgICAgICAgLy8gcHJvdGVjdGVkIHN0YXRpYyBpbnQgcGNHZXRNYW5hZ2VkRmllbGRDb3VudCAoKQorICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiR2V0TWFuYWdlZEZpZWxkQ291bnQiLAorICAgICAgICAgICAgaW50LmNsYXNzLCBudWxsKTsKKyAgICAgICAgbWV0aG9kLnNldFN0YXRpYyh0cnVlKTsKKyAgICAgICAgbWV0aG9kLm1ha2VQcm90ZWN0ZWQoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy8gcmV0dXJuIDxmaWVsZHM+ICsgcGNJbmhlcml0ZWRGaWVsZENvdW50CisgICAgICAgIC8vIGF3aGl0ZTogdGhlIGFib3ZlIHNob3VsZCB3b3JrLCBidXQgSSdtIHNlZWluZyBhIG1lc3NlZCB1cCBzaXR1YXRpb24KKyAgICAgICAgLy8gYWxsIG9mIGEgc3VkZGVuIHdoZXJlIHdoZW4gYSBzdWJjbGFzcyBjYWxscyB0aGlzIG1ldGhvZCwgaXQgc29tZWhvdworICAgICAgICAvLyBoYXBwZW5zIGJlZm9yZSA8Y2xpbml0PiBpcyBldmVyIGludm9rZWQsIGFuZCBzbyBvdXIKKyAgICAgICAgLy8gcGNJbmhlcml0ZWRGaWVsZENvdW50IGZpZWxkIGlzbid0IGluaXRpYWxpemVkISAgc28gaW5zdGVhZCwKKyAgICAgICAgLy8gcmV0dXJuIDxmaWVsZHM+ICsgPHN1cGVyY2xhc3M+LnBjR2V0TWFuYWdlZEZpZWxkQ291bnQgKCkKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoKTsKKyAgICAgICAgaWYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlc3RhdGljKCkuc2V0TWV0aG9kKGdldFR5cGUoX21ldGEuCisgICAgICAgICAgICAgICAgZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKSkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIFBSRSArICJHZXRNYW5hZ2VkRmllbGRDb3VudCIsIGludC5jbGFzcy5nZXROYW1lKCksIG51bGwpOworICAgICAgICAgICAgY29kZS5pYWRkKCk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS5pcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlI3BjUHJvdmlkZUZpZWxkfSBhbmQKKyAgICAgKiB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlI3BjUHJvdmlkZUZpZWxkc30gbWV0aG9kcyB0byB0aGUgYnl0ZWNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3ZpZGVGaWVsZHNNZXRob2RzKCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHB1YmxpYyB2b2lkIHBjUHJvdmlkZUZpZWxkIChpbnQgZmllbGROdW1iZXIpCisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJQcm92aWRlRmllbGQiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy8gYWRkcyBldmVyeXRoaW5nIHRocm91Z2ggdGhlIHN3aXRjaCAoKQorICAgICAgICBpbnQgcmVsTG9jYWwgPSBiZWdpblN3aXRjaE1ldGhvZChQUkUgKyAiUHJvdmlkZUZpZWxkIiwgY29kZSk7CisKKyAgICAgICAgLy8gaWYgbm8gZmllbGRzIGluIHRoaXMgaW5zdCwganVzdCB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBpZiAoZm1kcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKGNvZGUsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gc3dpdGNoICh2YWwpCisgICAgICAgICAgICBjb2RlLmlsb2FkKCkuc2V0TG9jYWwocmVsTG9jYWwpOworICAgICAgICAgICAgVGFibGVTd2l0Y2hJbnN0cnVjdGlvbiB0YWJpbnMgPSBjb2RlLnRhYmxlc3dpdGNoKCk7CisgICAgICAgICAgICB0YWJpbnMuc2V0TG93KDApOworICAgICAgICAgICAgdGFiaW5zLnNldEhpZ2goZm1kcy5sZW5ndGggLSAxKTsKKworICAgICAgICAgICAgLy8gPGZpZWxkPiA9IHBjU3RhdGVNYW5hZ2VyLnByb3ZpZGVkPHR5cGU+RmllbGQKKyAgICAgICAgICAgIC8vICAgICAodGhpcywgZmllbGROdW1iZXIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGFiaW5zLmFkZFRhcmdldChsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhZGRHZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIGZtZHNbaV0pOworICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKGdldFN0YXRlTWFuYWdlck1ldGhvZAorICAgICAgICAgICAgICAgICAgICAoZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKSwgInByb3ZpZGVkIiwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRlZmF1bHQ6IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKCkKKyAgICAgICAgICAgIHRhYmlucy5zZXREZWZhdWx0VGFyZ2V0KHRocm93RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKGNvZGUsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIGFkZE11bHRpcGxlRmllbGRzTWV0aG9kVmVyc2lvbihtZXRob2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHtAbGluayBQZXJzaXN0ZW5jZUNhcGFibGUjcGNSZXBsYWNlRmllbGR9IGFuZAorICAgICAqIHtAbGluayBQZXJzaXN0ZW5jZUNhcGFibGUjcGNSZXBsYWNlRmllbGRzfSBtZXRob2RzIHRvIHRoZSBieXRlY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUmVwbGFjZUZpZWxkc01ldGhvZHMoKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNSZXBsYWNlRmllbGQgKGludCBmaWVsZE51bWJlcikKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gX3BjLmRlY2xhcmVNZXRob2QoUFJFICsgIlJlcGxhY2VGaWVsZCIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzIH0pOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyBhZGRzIGV2ZXJ5dGhpbmcgdGhyb3VnaCB0aGUgc3dpdGNoICgpCisgICAgICAgIGludCByZWxMb2NhbCA9IGJlZ2luU3dpdGNoTWV0aG9kKFBSRSArICJSZXBsYWNlRmllbGQiLCBjb2RlKTsKKworICAgICAgICAvLyBpZiBubyBmaWVsZHMgaW4gdGhpcyBpbnN0LCBqdXN0IHRocm93IGV4Y2VwdGlvbgorICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGlmIChmbWRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oY29kZSwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBzd2l0Y2ggKHZhbCkKKyAgICAgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRMb2NhbChyZWxMb2NhbCk7CisgICAgICAgICAgICBUYWJsZVN3aXRjaEluc3RydWN0aW9uIHRhYmlucyA9IGNvZGUudGFibGVzd2l0Y2goKTsKKyAgICAgICAgICAgIHRhYmlucy5zZXRMb3coMCk7CisgICAgICAgICAgICB0YWJpbnMuc2V0SGlnaChmbWRzLmxlbmd0aCAtIDEpOworCisgICAgICAgICAgICAvLyA8ZmllbGQ+ID0gcGNTdGF0ZU1hbmFnZXIucmVwbGFjZTx0eXBlPkZpZWxkCisgICAgICAgICAgICAvLyAgKHRoaXMsIGZpZWxkTnVtYmVyKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgYWRkU2V0TWFuYWdlZFZhbHVlQ29kZSBjYWxsIGJlbG93LgorICAgICAgICAgICAgICAgIHRhYmlucy5hZGRUYXJnZXQobG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSkpOworCisgICAgICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChnZXRTdGF0ZU1hbmFnZXJNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgKGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCksICJyZXBsYWNlIiwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkuaXNQcmltaXRpdmUoKSkKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkpOworCisgICAgICAgICAgICAgICAgYWRkU2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBmbWRzW2ldKTsKKyAgICAgICAgICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVmYXVsdDogdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAoKQorICAgICAgICAgICAgdGFiaW5zLnNldERlZmF1bHRUYXJnZXQodGhyb3dFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoY29kZSwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisKKyAgICAgICAgYWRkTXVsdGlwbGVGaWVsZHNNZXRob2RWZXJzaW9uKG1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUge0BsaW5rIFBlcnNpc3RlbmNlQ2FwYWJsZSNwY0NvcHlGaWVsZHN9IG1ldGhvZCB0byB0aGUgYnl0ZWNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZENvcHlGaWVsZHNNZXRob2QoKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNDb3B5RmllbGQgKE9iamVjdCBwYywgaW50IGZpZWxkKQorICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiQ29weUZpZWxkIiwKKyAgICAgICAgICAgIHZvaWQuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyBfcGMuZ2V0TmFtZSgpLCBpbnQuY2xhc3MuZ2V0TmFtZSgpIH0pOworICAgICAgICBtZXRob2QubWFrZVByb3RlY3RlZCgpOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyBhZGRzIGV2ZXJ5dGhpbmcgdGhyb3VnaCB0aGUgc3dpdGNoICgpCisgICAgICAgIGludCByZWxMb2NhbCA9IGJlZ2luU3dpdGNoTWV0aG9kKFBSRSArICJDb3B5RmllbGQiLCBjb2RlKTsKKworICAgICAgICAvLyBpZiBubyBmaWVsZHMgaW4gdGhpcyBpbnN0LCBqdXN0IHRocm93IGV4Y2VwdGlvbgorICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGlmIChmbWRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oY29kZSwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBzd2l0Y2ggKHZhbCkKKyAgICAgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRMb2NhbChyZWxMb2NhbCk7CisgICAgICAgICAgICBUYWJsZVN3aXRjaEluc3RydWN0aW9uIHRhYmlucyA9IGNvZGUudGFibGVzd2l0Y2goKTsKKyAgICAgICAgICAgIHRhYmlucy5zZXRMb3coMCk7CisgICAgICAgICAgICB0YWJpbnMuc2V0SGlnaChmbWRzLmxlbmd0aCAtIDEpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyA8ZmllbGQ+ID0gb3RoZXIuPGZpZWxkPjsKKyAgICAgICAgICAgICAgICAvLyBvciBzZXQ8ZmllbGQ+IChvdGhlci5nZXQ8ZmllbGQ+KTsKKyAgICAgICAgICAgICAgICB0YWJpbnMuYWRkVGFyZ2V0KGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICAgICAgYWRkR2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBmbWRzW2ldKTsKKyAgICAgICAgICAgICAgICBhZGRTZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIGZtZHNbaV0pOworCisgICAgICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRlZmF1bHQ6IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKCkKKyAgICAgICAgICAgIHRhYmlucy5zZXREZWZhdWx0VGFyZ2V0KHRocm93RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKGNvZGUsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIGFkZE11bHRpcGxlRmllbGRzTWV0aG9kVmVyc2lvbihtZXRob2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIHRoZSBjb2RlIGNvbW1vbiB0byB0aGUgYmVnaW5uaW5nIG9mIGJvdGggdGhlCisgICAgICogcGNSZXBsYWNlRmllbGQgbWV0aG9kIGFuZCB0aGUgcGNQcm92aWRlRmllbGQgbWV0aG9kLiBUaGlzIGluY2x1ZGVzCisgICAgICogY2FsY3VsYXRpbmcgdGhlIHJlbGF0aXZlIGZpZWxkIG51bWJlciBvZiB0aGUgZGVzaXJlZCBmaWVsZCBhbmQgY2FsbGluZworICAgICAqIHRoZSBzdXBlcmNsYXNzIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHdoaWNoIHRoZSBsb2NhbCB2YXJpYWJsZSBob2xkaW5nIHRoZSByZWxhdGl2ZQorICAgICAqIGZpZWxkIG51bWJlciBpcyBzdG9yZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBiZWdpblN3aXRjaE1ldGhvZChTdHJpbmcgbmFtZSwgQ29kZSBjb2RlKSB7CisgICAgICAgIGJvb2xlYW4gY29weSA9IChQUkUgKyAiQ29weUZpZWxkIikuZXF1YWxzKG5hbWUpOworICAgICAgICBpbnQgZmllbGROdW1iZXIgPSAoY29weSkgPyAxIDogMDsKKworICAgICAgICAvLyBpbnQgcmVsID0gZmllbGROdW1iZXIgLSBwY0luaGVyaXRlZEZpZWxkQ291bnQKKyAgICAgICAgaW50IHJlbExvY2FsID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgY29kZS5pbG9hZCgpLnNldFBhcmFtKGZpZWxkTnVtYmVyKTsKKyAgICAgICAgY29kZS5nZXRzdGF0aWMoKS5zZXRGaWVsZChJTkhFUklULCBpbnQuY2xhc3MpOworICAgICAgICBjb2RlLmlzdWIoKTsKKyAgICAgICAgY29kZS5pc3RvcmUoKS5zZXRMb2NhbChyZWxMb2NhbCk7CisgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRMb2NhbChyZWxMb2NhbCk7CisKKyAgICAgICAgLy8gc3VwZXI6IGlmIChyZWwgPCAwKSBzdXBlci5wY1JlcGxhY2VGaWVsZCAoZmllbGROdW1iZXIpOyByZXR1cm47CisgICAgICAgIC8vIG5vIHN1cGVyOiBpZiAocmVsIDwgMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAoKTsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmaW5zID0gY29kZS5pZmdlKCk7CisgICAgICAgIGlmIChfbWV0YS5nZXRQQ1N1cGVyY2xhc3MoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3M7CisgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgU3RyaW5nW117IGdldFR5cGUoX21ldGEuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKSkuCisgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgaW50LmNsYXNzLmdldE5hbWUoKSB9OworICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgU3RyaW5nW117IGludC5jbGFzcy5nZXROYW1lKCkgfTsKKyAgICAgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRQYXJhbShmaWVsZE51bWJlcik7CisgICAgICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoZ2V0VHlwZShfbWV0YS4KKyAgICAgICAgICAgICAgICBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpKS5nZXROYW1lKCksIG5hbWUsIAorICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBhcmdzKTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKGNvZGUsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUubm9wKCkpOworICAgICAgICByZXR1cm4gcmVsTG9jYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBoZWxwZXIgbWV0aG9kLCBnaXZlbiB0aGUgcGNSZXBsYWNlRmllbGQgb3IgcGNQcm92aWRlRmllbGQKKyAgICAgKiBtZXRob2QsIGFkZHMgdGhlIGJ5dGVjb2RlIGZvciB0aGUgY29ycmVzcG9uZGluZyAncGx1cmFsJyB2ZXJzaW9uCisgICAgICogb2YgdGhlIG1ldGhvZCAtLSB0aGUgdmVyc2lvbiB0aGF0IHRha2VzIGFuIGludFtdIG9mIGZpZWxkcyB0bworICAgICAqIHRvIGFjY2VzcyByYXRoZXIgdGhhbiBhIHNpbmdsZSBmaWVsZC4gVGhlIG11bHRpcGxlIGZpZWxkcyB2ZXJzaW9uCisgICAgICogc2ltcGx5IGxvb3BzIHRocm91Z2ggdGhlIHByb3ZpZGVkIGluZGV4ZXMgYW5kIGRlbGVnYXRlcyB0byB0aGUKKyAgICAgKiBzaW5ndWxhciB2ZXJzaW9uIGZvciBlYWNoIG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkTXVsdGlwbGVGaWVsZHNNZXRob2RWZXJzaW9uKEJDTWV0aG9kIHNpbmdsZSkgeworICAgICAgICBib29sZWFuIGNvcHkgPSAoUFJFICsgIkNvcHlGaWVsZCIpLmVxdWFscyhzaW5nbGUuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBwdWJsaWMgdm9pZCA8bWV0aG9kPnMgKGludFtdIGZpZWxkcykKKyAgICAgICAgQ2xhc3NbXSBhcmdzID0gKGNvcHkpID8gbmV3IENsYXNzW117IE9iamVjdC5jbGFzcywgaW50W10uY2xhc3MgfQorICAgICAgICAgICAgOiBuZXcgQ2xhc3NbXXsgaW50W10uY2xhc3MgfTsKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gX3BjLmRlY2xhcmVNZXRob2Qoc2luZ2xlLmdldE5hbWUoKSArICJzIiwKKyAgICAgICAgICAgIHZvaWQuY2xhc3MsIGFyZ3MpOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICBpbnQgZmllbGROdW1iZXJzID0gMDsKKyAgICAgICAgaW50IGluc3QgPSAwOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgZmllbGROdW1iZXJzID0gMTsKKworICAgICAgICAgICAgLy8gWFhYIG90aGVyID0gKFhYWCkgcGM7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoX3BjKTsKKyAgICAgICAgICAgIGluc3QgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICAgICAgY29kZS5hc3RvcmUoKS5zZXRMb2NhbChpbnN0KTsKKworICAgICAgICAgICAgLy8gaWYgKG90aGVyLnBjU3RhdGVNYW5hZ2VyICE9IHBjU3RhdGVNYW5hZ2VyKQorICAgICAgICAgICAgLy8JdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKGluc3QpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmYWNtcGVxKCk7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihjb2RlLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUubm9wKCkpOworCisgICAgICAgICAgICAvLyBpZiAocGNTdGF0ZU1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIC8vICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChTTSwgU01UWVBFKTsKKyAgICAgICAgICAgIGlmaW5zID0gY29kZS5pZm5vbm51bGwoKTsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKGNvZGUsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5ub3AoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgKGludCBpID0gMDsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKDApOworICAgICAgICBpbnQgaWR4ID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgY29kZS5pc3RvcmUoKS5zZXRMb2NhbChpZHgpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gdGVzdGlucyA9IGNvZGUuZ28yKCk7CisKKyAgICAgICAgLy8gPG1ldGhvZD4gKGZpZWxkc1tpXSk7CisgICAgICAgIEluc3RydWN0aW9uIGJvZHlpbnMgPSBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgaWYgKGNvcHkpCisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwoaW5zdCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbShmaWVsZE51bWJlcnMpOworICAgICAgICBjb2RlLmlsb2FkKCkuc2V0TG9jYWwoaWR4KTsKKyAgICAgICAgY29kZS5pYWxvYWQoKTsKKyAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKHNpbmdsZSk7CisKKyAgICAgICAgLy8gaSsrOworICAgICAgICBjb2RlLmlpbmMoKS5zZXRJbmNyZW1lbnQoMSkuc2V0TG9jYWwoaWR4KTsKKworICAgICAgICAvLyBpIDwgZmllbGRzLmxlbmd0aAorICAgICAgICB0ZXN0aW5zLnNldFRhcmdldChjb2RlLmlsb2FkKCkuc2V0TG9jYWwoaWR4KSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbShmaWVsZE51bWJlcnMpOworICAgICAgICBjb2RlLmFycmF5bGVuZ3RoKCk7CisgICAgICAgIGNvZGUuaWZpY21wbHQoKS5zZXRUYXJnZXQoYm9keWlucyk7CisgICAgICAgIGNvZGUudnJldHVybigpOworCisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSAnc3RvY2snIG1ldGhvZHMgdG8gdGhlIGJ5dGVjb2RlOyB0aGVzZSBpbmNsdWRlIG1ldGhvZHMKKyAgICAgKiBsaWtlIHtAbGluayBQZXJzaXN0ZW5jZUNhcGFibGUjcGNGZXRjaE9iamVjdElkfQorICAgICAqIGFuZCB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlI3BjSXNUcmFuc2FjdGlvbmFsfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU3RvY2tNZXRob2RzKCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBjR2V0R2VuZXJpY0NvbnRleHQKKyAgICAgICAgdHJhbnNsYXRlRnJvbVN0YXRlTWFuYWdlck1ldGhvZChTTVRZUEUuZ2V0RGVjbGFyZWRNZXRob2QKKyAgICAgICAgICAgICgiZ2V0IiArIENPTlRFWFROQU1FLCAoQ2xhc3NbXSkgbnVsbCkpOworCisgICAgICAgIC8vIHBjRmV0Y2hPYmplY3RJZAorICAgICAgICB0cmFuc2xhdGVGcm9tU3RhdGVNYW5hZ2VyTWV0aG9kKFNNVFlQRS5nZXREZWNsYXJlZE1ldGhvZAorICAgICAgICAgICAgKCJmZXRjaE9iamVjdElkIiwgKENsYXNzW10pIG51bGwpKTsKKworICAgICAgICAvLyBwY0lzRGVsZXRlZAorICAgICAgICB0cmFuc2xhdGVGcm9tU3RhdGVNYW5hZ2VyTWV0aG9kKFNNVFlQRS5nZXREZWNsYXJlZE1ldGhvZAorICAgICAgICAgICAgKCJpc0RlbGV0ZWQiLCAoQ2xhc3NbXSkgbnVsbCkpOworCisgICAgICAgIC8vIHBjSXNEaXJ0eQorICAgICAgICB0cmFuc2xhdGVGcm9tU3RhdGVNYW5hZ2VyTWV0aG9kKFNNVFlQRS5nZXREZWNsYXJlZE1ldGhvZAorICAgICAgICAgICAgKCJpc0RpcnR5IiwgKENsYXNzW10pIG51bGwpKTsKKworICAgICAgICAvLyBwY0lzTmV3CisgICAgICAgIHRyYW5zbGF0ZUZyb21TdGF0ZU1hbmFnZXJNZXRob2QoU01UWVBFLmdldERlY2xhcmVkTWV0aG9kCisgICAgICAgICAgICAoImlzTmV3IiwgKENsYXNzW10pIG51bGwpKTsKKworICAgICAgICAvLyBwY0lzUGVyc2lzdGVudAorICAgICAgICB0cmFuc2xhdGVGcm9tU3RhdGVNYW5hZ2VyTWV0aG9kKFNNVFlQRS5nZXREZWNsYXJlZE1ldGhvZAorICAgICAgICAgICAgKCJpc1BlcnNpc3RlbnQiLCAoQ2xhc3NbXSkgbnVsbCkpOworCisgICAgICAgIC8vIHBjSXNUcmFuc2FjdGlvbmFsCisgICAgICAgIHRyYW5zbGF0ZUZyb21TdGF0ZU1hbmFnZXJNZXRob2QoU01UWVBFLmdldERlY2xhcmVkTWV0aG9kCisgICAgICAgICAgICAoImlzVHJhbnNhY3Rpb25hbCIsIChDbGFzc1tdKSBudWxsKSk7CisKKyAgICAgICAgLy8gcGNTZXJpYWxpemluZworICAgICAgICB0cmFuc2xhdGVGcm9tU3RhdGVNYW5hZ2VyTWV0aG9kKFNNVFlQRS5nZXREZWNsYXJlZE1ldGhvZAorICAgICAgICAgICAgKCJzZXJpYWxpemluZyIsIChDbGFzc1tdKSBudWxsKSk7CisKKyAgICAgICAgLy8gcGNEaXJ0eQorICAgICAgICB0cmFuc2xhdGVGcm9tU3RhdGVNYW5hZ2VyTWV0aG9kKFNNVFlQRS5nZXREZWNsYXJlZE1ldGhvZCgiZGlydHkiLAorICAgICAgICAgICAgbmV3IENsYXNzW117IFN0cmluZy5jbGFzcyB9KSk7CisKKyAgICAgICAgLy8gcGNHZXRTdGF0ZU1hbmFnZXIKKyAgICAgICAgQkNNZXRob2QgbWV0aCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJHZXRTdGF0ZU1hbmFnZXIiLAorICAgICAgICAgICAgU3RhdGVNYW5hZ2VyLmNsYXNzLCBudWxsKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTdGF0ZU1hbmFnZXIuY2xhc3MpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIGEgc3RvY2sgbWV0aG9kIHRvIHRoZSBieXRlY29kZS4gRWFjaAorICAgICAqIHN0b2NrIG1ldGhvZCBzaW1wbHkgZGVsZWdhdGVzIHRvIGEgY29ycmVzcG9uZGluZyBTdGF0ZU1hbmFnZXIgbWV0aG9kLgorICAgICAqIEdpdmVuIHRoZSBTdGF0ZU1hbmFnZXIgbWV0aG9kLCB0aGVuLCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgaXQgaW50bworICAgICAqIHRoZSB3cmFwcGVyIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgYnl0ZWNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUZyb21TdGF0ZU1hbmFnZXJNZXRob2QoTWV0aG9kIG0pIHsKKyAgICAgICAgLy8gZm9ybSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJ5IHByZXBlbmRpbmcgJ3BjJyB0byB0aGUgc20gbWV0aG9kCisgICAgICAgIFN0cmluZyBuYW1lID0gUFJFICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShtLmdldE5hbWUoKSk7CisgICAgICAgIENsYXNzW10gcGFyYW1zID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbS5nZXRSZXR1cm5UeXBlKCk7CisKKyAgICAgICAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIHBjCisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKG5hbWUsIHJldHVyblR5cGUsIHBhcmFtcyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGlmIChwY1N0YXRlTWFuYWdlciA9PSBudWxsKSByZXR1cm4gPGRlZmF1bHQ+OworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbm9ubnVsbCgpOworICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoYm9vbGVhbi5jbGFzcykpCisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoZmFsc2UpOworICAgICAgICBlbHNlIGlmICghcmV0dXJuVHlwZS5lcXVhbHModm9pZC5jbGFzcykpCisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBjb2RlLnhyZXR1cm4oKS5zZXRUeXBlKHJldHVyblR5cGUpOworCisgICAgICAgIC8vIHJldHVybiBwY1N0YXRlTWFuYWdlci48bWV0aG9kPiAoPGFyZ3M+KTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvZGUueGxvYWQoKS5zZXRQYXJhbShpKTsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QobSk7CisgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUocmV0dXJuVHlwZSk7CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHtAbGluayBQZXJzaXN0ZW5jZUNhcGFibGUjcGNHZXRWZXJzaW9ufSBtZXRob2QgdG8gdGhlIGJ5dGVjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRHZXRWZXJzaW9uTWV0aG9kKCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJHZXRWZXJzaW9uIiwgT2JqZWN0LmNsYXNzLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGlmIChwY1N0YXRlTWFuYWdlciA9PSBudWxsKQorICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbm9ubnVsbCgpOworICAgICAgICBGaWVsZE1ldGFEYXRhIHZlcnNpb25GaWVsZCA9IF9tZXRhLmdldFZlcnNpb25GaWVsZCgpOworCisgICAgICAgIGlmICh2ZXJzaW9uRmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7IC8vIHJldHVybiBudWxsOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJldHVybiA8dmVyc2lvbkZpZWxkPjsKKyAgICAgICAgICAgIENsYXNzIHdyYXBwZXIgPSB0b1ByaW1pdGl2ZVdyYXBwZXIodmVyc2lvbkZpZWxkKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVyICE9IHZlcnNpb25GaWVsZC5nZXREZWNsYXJlZFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUod3JhcHBlcik7CisgICAgICAgICAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgYWRkR2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCB2ZXJzaW9uRmllbGQpOworICAgICAgICAgICAgaWYgKHdyYXBwZXIgIT0gdmVyc2lvbkZpZWxkLmdldERlY2xhcmVkVHlwZSgpKQorICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZCh3cmFwcGVyLCAiPGluaXQ+Iiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IHZlcnNpb25GaWVsZC5nZXREZWNsYXJlZFR5cGUoKSB9KTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKworICAgICAgICAvLyByZXR1cm4gcGNTdGF0ZU1hbmFnZXIuZ2V0VmVyc2lvbiAoKTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChTTVRZUEUsICJnZXRWZXJzaW9uIiwgT2JqZWN0LmNsYXNzLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworCisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZlcnNpb24gZmllbGQgdHlwZSBhcyBhIHByaW1pdGl2ZSB3cmFwcGVyLCBvciBudWxsIGlmCisgICAgICogdGhlIHZlcnNpb24gZmllbGQgaXMgbm90IHByaW1pdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIHRvUHJpbWl0aXZlV3JhcHBlcihGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBCeXRlLmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmxvYXQuY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBMb25nLmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNob3J0LmNsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmbWQuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUge0BsaW5rIFBlcnNpc3RlbmNlQ2FwYWJsZSNwY1JlcGxhY2VTdGF0ZU1hbmFnZXJ9CisgICAgICogbWV0aG9kIHRvIHRoZSBieXRlY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUmVwbGFjZVN0YXRlTWFuYWdlck1ldGhvZCgpIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNSZXBsYWNlU3RhdGVNYW5hZ2VyIChTdGF0ZU1hbmFnZXIgc20pCisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJSZXBsYWNlU3RhdGVNYW5hZ2VyIiwKKyAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdeyBTTVRZUEUgfSk7CisgICAgICAgIG1ldGhvZC5zZXRTeW5jaHJvbml6ZWQodHJ1ZSk7CisgICAgICAgIG1ldGhvZC5nZXRFeGNlcHRpb25zKHRydWUpLmFkZEV4Y2VwdGlvbihTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGlmIChwY1N0YXRlTWFuYWdlciAhPSBudWxsKQorICAgICAgICAvLwlwY1N0YXRlTWFuYWdlciA9IHBjU3RhdGVNYW5hZ2VyLnJlcGxhY2VTdGF0ZU1hbmFnZXIoc20pOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbnVsbCgpOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChTTSwgU01UWVBFKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChTTVRZUEUsICJyZXBsYWNlU3RhdGVNYW5hZ2VyIiwKKyAgICAgICAgICAgIFNNVFlQRSwgbmV3IENsYXNzW117IFNNVFlQRSB9KTsKKyAgICAgICAgY29kZS5wdXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKworICAgICAgICAvLyBTZWN1cml0eU1hbmFnZXIgc2VjID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlciAoKTsKKyAgICAgICAgLy8gaWYgKHNlYyAhPSBudWxsKQorICAgICAgICAvLwkJc2VjLmNoZWNrUGVybWlzc2lvbiAoUGVybWlzc2lvbi5TRVRfU1RBVEVfTUFOQUdFUik7CisgICAgICAgIGlmaW5zLnNldFRhcmdldChjb2RlLmludm9rZXN0YXRpYygpLnNldE1ldGhvZChTeXN0ZW0uY2xhc3MsCisgICAgICAgICAgICAiZ2V0U2VjdXJpdHlNYW5hZ2VyIiwgU2VjdXJpdHlNYW5hZ2VyLmNsYXNzLCBudWxsKSk7CisKKyAgICAgICAgLy8gcGNTdGF0ZU1hbmFnZXIgPSBzbTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgIGNvZGUudnJldHVybigpOworCisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBQZXJzaXN0ZW5jZUNhcGFibGUgbWV0aG9kcyBkZWFsaW5nIHdpdGggYXBwbGljYXRpb24KKyAgICAgKiBpZGVudGl0eSBhbmQgZ2l2ZXMgdGhlbSBuby1vcCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZE5vT3BBcHBsaWNhdGlvbklkZW50aXR5TWV0aG9kcygpIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNDb3B5S2V5RmllbGRzVG9PYmplY3RJZCAoT2JqZWN0SWRGaWVsZFN1cHBsaWVyIGZzLAorICAgICAgICAvLyAJT2JqZWN0IG9pZCkKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gX3BjLmRlY2xhcmVNZXRob2QoUFJFICsgIkNvcHlLZXlGaWVsZHNUb09iamVjdElkIiwKKyAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdeyBPSURGU1RZUEUsIE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHB1YmxpYyB2b2lkIHBjQ29weUtleUZpZWxkc1RvT2JqZWN0SWQgKE9iamVjdCBvaWQpCisgICAgICAgIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJDb3B5S2V5RmllbGRzVG9PYmplY3RJZCIsCisgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgT2JqZWN0LmNsYXNzIH0pOworICAgICAgICBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHB1YmxpYyB2b2lkIHBjQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZCAoT2JqZWN0SWRGaWVsZENvbnN1bWVyIGZjLAorICAgICAgICAvLwlPYmplY3Qgb2lkKQorICAgICAgICBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZCIsCisgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgT0lERkNUWVBFLCBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNDb3B5S2V5RmllbGRzRnJvbU9iamVjdElkIChPYmplY3Qgb2lkKQorICAgICAgICBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZCIsCisgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgT2JqZWN0LmNsYXNzIH0pOworICAgICAgICBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHB1YmxpYyBPYmplY3QgcGNOZXdPYmplY3RJZEluc3RhbmNlICgpCisgICAgICAgIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJOZXdPYmplY3RJZEluc3RhbmNlIiwKKyAgICAgICAgICAgIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldE51bGwoKTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKworICAgICAgICAvLyBwdWJsaWMgT2JqZWN0IHBjTmV3T2JqZWN0SWRJbnN0YW5jZSAoT2JqZWN0IG9iaikKKyAgICAgICAgbWV0aG9kID0gX3BjLmRlY2xhcmVNZXRob2QoUFJFICsgIk5ld09iamVjdElkSW5zdGFuY2UiLAorICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCBuZXcgQ2xhc3NbXXsgT2JqZWN0LmNsYXNzIH0pOworICAgICAgICBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgPGNvZGU+cGNDb3B5S2V5RmllbGRzVG9PYmplY3RJZDwvY29kZT4gbWV0aG9kcworICAgICAqIHRvIGNsYXNzZXMgdXNpbmcgYXBwbGljYXRpb24gaWRlbnRpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZENvcHlLZXlGaWVsZHNUb09iamVjdElkTWV0aG9kKGJvb2xlYW4gZmllbGRNYW5hZ2VyKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNDb3B5S2V5RmllbGRzVG9PYmplY3RJZCAoT2JqZWN0SWRGaWVsZFN1cHBsaWVyIGZzLAorICAgICAgICAvLwlPYmplY3Qgb2lkKQorICAgICAgICBTdHJpbmdbXSBhcmdzID0gKGZpZWxkTWFuYWdlcikgPworICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyBPSURGU1RZUEUuZ2V0TmFtZSgpLCBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpIH0KKyAgICAgICAgICAgIDogbmV3IFN0cmluZ1tdeyBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpIH07CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJDb3B5S2V5RmllbGRzVG9PYmplY3RJZCIsCisgICAgICAgICAgICB2b2lkLmNsYXNzLmdldE5hbWUoKSwgYXJncyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIHNpbmdsZSBmaWVsZCBpZGVudGl0eSBhbHdheXMgdGhyb3dzIGV4Y2VwdGlvbgorICAgICAgICBpZiAoX21ldGEuaXNPcGVuSlBBSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oY29kZSwgSU5URVJORVhDRVApOworICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisKKyAgICAgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBjYWxsIHN1cGVyY2xhc3MgbWV0aG9kCisgICAgICAgIGlmIChfbWV0YS5nZXRQQ1N1cGVyY2xhc3MoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oaSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoZ2V0VHlwZShfbWV0YS4KKyAgICAgICAgICAgICAgICBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgUFJFICsgIkNvcHlLZXlGaWVsZHNUb09iamVjdElkIiwgdm9pZC5jbGFzcy5nZXROYW1lKCksIGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT2JqZWN0IGlkID0gb2lkOworICAgICAgICBpZiAoZmllbGRNYW5hZ2VyKQorICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisKKyAgICAgICAgaWYgKF9tZXRhLmlzT2JqZWN0SWRUeXBlU2hhcmVkKCkpIHsKKyAgICAgICAgICAgIC8vIG9pZCA9ICgoT2JqZWN0SWQpIGlkKS5nZXRJZCAoKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShPYmplY3RJZC5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoT2JqZWN0SWQuY2xhc3MsICJnZXRJZCIsCisgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDxvaWQgdHlwZT4gaWQgPSAoPG9pZCB0eXBlPikgb2lkOworICAgICAgICBpbnQgaWQgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICBDbGFzcyBvaWRUeXBlID0gX21ldGEuZ2V0T2JqZWN0SWRUeXBlKCk7CisgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShvaWRUeXBlKTsKKyAgICAgICAgY29kZS5hc3RvcmUoKS5zZXRMb2NhbChpZCk7CisKKyAgICAgICAgLy8gaW50IGluaGVyaXRlZCA9IHBjSW5oZXJpdGVkRmllbGRDb3VudDsKKyAgICAgICAgaW50IGluaGVyaXRlZCA9IDA7CisgICAgICAgIGlmIChmaWVsZE1hbmFnZXIpIHsKKyAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoSU5IRVJJVCwgaW50LmNsYXNzKTsKKyAgICAgICAgICAgIGluaGVyaXRlZCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgICAgICBjb2RlLmlzdG9yZSgpLnNldExvY2FsKGluaGVyaXRlZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZC48ZmllbGQ+ID0gZnMuZmV0Y2g8dHlwZT5GaWVsZCAoPGluZGV4Pik7IG9yLi4uCisgICAgICAgIC8vIGlkLjxmaWVsZD4gPSBwYy48ZmllbGQ+OworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIENsYXNzIHR5cGU7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBGaWVsZCBmaWVsZDsKKyAgICAgICAgTWV0aG9kIHNldHRlcjsKKyAgICAgICAgYm9vbGVhbiByZWZsZWN0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZm1kc1tpXS5pc1ByaW1hcnlLZXkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChpZCk7CisKKyAgICAgICAgICAgIG5hbWUgPSBmbWRzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHR5cGUgPSBmbWRzW2ldLmdldE9iamVjdElkRmllbGRUeXBlKCk7CisgICAgICAgICAgICBpZiAoX21ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKSB7CisgICAgICAgICAgICAgICAgc2V0dGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmaWVsZCA9IFJlZmxlY3Rpb24uZmluZEZpZWxkKG9pZFR5cGUsIG5hbWUsIHRydWUpOworICAgICAgICAgICAgICAgIHJlZmxlY3QgPSAhTW9kaWZpZXIuaXNQdWJsaWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICAgICAgICAgIGlmIChyZWZsZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY2xhc3Njb25zdGFudCgpLnNldENsYXNzKG9pZFR5cGUpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoUmVmbGVjdGlvbi5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAiZmluZEZpZWxkIiwgRmllbGQuY2xhc3MsIG5ldyBDbGFzc1tdIHsgQ2xhc3MuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICAgICAgICAgICAgc2V0dGVyID0gUmVmbGVjdGlvbi5maW5kU2V0dGVyKG9pZFR5cGUsIG5hbWUsIHR5cGUsIHRydWUpOworICAgICAgICAgICAgICAgIHJlZmxlY3QgPSAhTW9kaWZpZXIuaXNQdWJsaWMoc2V0dGVyLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVmbGVjdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlLmNsYXNzY29uc3RhbnQoKS5zZXRDbGFzcyhvaWRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNsYXNzY29uc3RhbnQoKS5zZXRDbGFzcyh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKHRydWUpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmludm9rZXN0YXRpYygpLnNldE1ldGhvZChSZWZsZWN0aW9uLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaW5kU2V0dGVyIiwgTWV0aG9kLmNsYXNzLCBuZXcgQ2xhc3NbXSB7IENsYXNzLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBDbGFzcy5jbGFzcywgYm9vbGVhbi5jbGFzcyB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWVsZE1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGNvZGUuaWxvYWQoKS5zZXRMb2NhbChpbmhlcml0ZWQpOworICAgICAgICAgICAgICAgIGNvZGUuaWFkZCgpOworICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kCisgICAgICAgICAgICAgICAgICAgIChnZXRGaWVsZFN1cHBsaWVyTWV0aG9kKHR5cGUpKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQgbWV0YSBkYXRhIGlzCisgICAgICAgICAgICAgICAgLy8gbm9uLXByaW1pdGl2ZSBhbmQgbm9uLXN0cmluZywgYmUgc3VyZSB0byBjYXN0CisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisgICAgICAgICAgICAgICAgaWYgKCFyZWZsZWN0ICYmICF0eXBlLmlzUHJpbWl0aXZlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXR5cGUuZ2V0TmFtZSgpLmVxdWFscyhTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKHR5cGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhZGRHZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIGZtZHNbaV0pOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IGlkL3BrIGZyb20gcGMgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgICAgICAgICBhZGRFeHRyYWN0T2JqZWN0SWRGaWVsZFZhbHVlQ29kZShjb2RlLCBmbWRzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlZmxlY3QgJiYgZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3RhdGljKCkuc2V0TWV0aG9kKFJlZmxlY3Rpb24uY2xhc3MsICJzZXQiLCAKKyAgICAgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIEZpZWxkLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAodHlwZS5pc1ByaW1pdGl2ZSgpKSA/IHR5cGUgOiBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZmxlY3QpIHsgCisgICAgICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoUmVmbGVjdGlvbi5jbGFzcywgInNldCIsIAorICAgICAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcywgTWV0aG9kLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAodHlwZS5pc1ByaW1pdGl2ZSgpKSA/IHR5cGUgOiBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29kZS5wdXRmaWVsZCgpLnNldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2Qoc2V0dGVyKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGNvZGUgdG8gZXh0cmFjdCB0aGUgaWQgb2YgdGhlIGdpdmVuIHByaW1hcnkga2V5IHJlbGF0aW9uIGZpZWxkIGZvcgorICAgICAqIHNldHRpbmcgaW50byBhbiBvYmplY3RpZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkRXh0cmFjdE9iamVjdElkRmllbGRWYWx1ZUNvZGUoQ29kZSBjb2RlLCBGaWVsZE1ldGFEYXRhIHBrKSB7CisgICAgICAgIC8vIGlmICh2YWwgIT0gbnVsbCkgCisgICAgICAgIC8vICB2YWwgPSAoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdmFsKS5wY0ZldGNoT2JqZWN0SWQoKTsKKyAgICAgICAgaW50IHBjID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgY29kZS5hc3RvcmUoKS5zZXRMb2NhbChwYyk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChwYyk7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZm51bGwxID0gY29kZS5pZm51bGwoKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKHBjKTsKKyAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKFBlcnNpc3RlbmNlQ2FwYWJsZS5jbGFzcyk7IAorICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MsCisgICAgICAgICAgICBQUkUgKyAiRmV0Y2hPYmplY3RJZCIsIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgIGludCBvaWQgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKG9pZCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZudWxsMiA9IGNvZGUuaWZudWxsKCk7IAorCisgICAgICAgIC8vIGZvciBkYXRhc3RvcmUgLyBzaW5nbGUtZmllbGQgaWRlbnRpdHk6CisgICAgICAgIC8vIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgLy8gICB2YWwgPSAoKE9wZW5KUEFJZCkgdmFsKS5nZXRJZCgpOworICAgICAgICBDbGFzc01ldGFEYXRhIHBrbWV0YSA9IHBrLmdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgICAgIGludCBwa2NvZGUgPSBway5nZXRPYmplY3RJZEZpZWxkVHlwZUNvZGUoKTsKKyAgICAgICAgQ2xhc3MgcGt0eXBlID0gcGsuZ2V0T2JqZWN0SWRGaWVsZFR5cGUoKTsKKyAgICAgICAgaWYgKHBrbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRSAKKyAgICAgICAgICAgICYmIHBrY29kZSA9PSBKYXZhVHlwZXMuTE9ORykgeworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKG9pZCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoSWQuY2xhc3MpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKElkLmNsYXNzLCAiZ2V0SWQiLCAKKyAgICAgICAgICAgICAgICBsb25nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIGlmIChwa21ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5JRF9EQVRBU1RPUkUpIHsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICB9IGVsc2UgaWYgKHBrbWV0YS5pc09wZW5KUEFJZGVudGl0eSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBrY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKEJ5dGUuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoQnl0ZUlkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEJ5dGVJZC5jbGFzcywgImdldElkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAocGtjb2RlID09IEphdmFUeXBlcy5CWVRFX09CSikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChCeXRlLmNsYXNzLCAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXSB7Ynl0ZS5jbGFzc30pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgICAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShDaGFyYWN0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoQ2hhcklkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKENoYXJJZC5jbGFzcywgImdldElkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAocGtjb2RlID09IEphdmFUeXBlcy5DSEFSX09CSikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChDaGFyYWN0ZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8aW5pdD4iLCB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXSB7Y2hhci5jbGFzc30pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEVfT0JKOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKERvdWJsZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2lkKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKERvdWJsZUlkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKERvdWJsZUlkLmNsYXNzLCAiZ2V0SWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrY29kZSA9PSBKYXZhVHlwZXMuRE9VQkxFX09CSikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChEb3VibGUuY2xhc3MsICI8aW5pdD4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXtkb3VibGUuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVRfT0JKOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKEZsb2F0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKG9pZCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShGbG9hdElkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEZsb2F0SWQuY2xhc3MsICJnZXRJZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwa2NvZGUgPT0gSmF2YVR5cGVzLkZMT0FUX09CSikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChGbG9hdC5jbGFzcywgIjxpbml0PiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tde2Zsb2F0LmNsYXNzfSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVF9PQko6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoSW50ZWdlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2lkKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKEludElkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKEludElkLmNsYXNzLCAiZ2V0SWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrY29kZSA9PSBKYXZhVHlwZXMuSU5UX09CSikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChJbnRlZ2VyLmNsYXNzLCAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzfSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkdfT0JKOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKExvbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoTG9uZ0lkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKExvbmdJZC5jbGFzcywgImdldElkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAocGtjb2RlID09IEphdmFUeXBlcy5MT05HX09CSikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChMb25nLmNsYXNzLCAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXSB7bG9uZy5jbGFzc30pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoU2hvcnQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2lkKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKFNob3J0SWQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoU2hvcnRJZC5jbGFzcywgImdldElkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0LmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrY29kZSA9PSBKYXZhVHlwZXMuU0hPUlRfT0JKKQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKFNob3J0LmNsYXNzLCAiPGluaXQ+IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW117c2hvcnQuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKG9pZCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShEYXRlSWQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoRGF0ZUlkLmNsYXNzLCAiZ2V0SWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKG9pZCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShTdHJpbmdJZC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChTdHJpbmdJZC5jbGFzcywgImdldElkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoT2JqZWN0SWQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoT2JqZWN0SWQuY2xhc3MsICJnZXRJZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBrbWV0YS5nZXRPYmplY3RJZFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwob2lkKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShwa3R5cGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChvaWQpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gZ28yID0gY29kZS5nbzIoKTsKKworICAgICAgICAvLyBpZiAodmFsID09IG51bGwpCisgICAgICAgIC8vICAgdmFsID0gPGRlZmF1bHQ+OworICAgICAgICBJbnN0cnVjdGlvbiBkZWY7CisgICAgICAgIHN3aXRjaCAocGtjb2RlKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgIGRlZiA9IGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIGRlZiA9IGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgoYnl0ZSkgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIGRlZiA9IGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgoY2hhcikgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgZGVmID0gY29kZS5jb25zdGFudCgpLnNldFZhbHVlKDBEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIGRlZiA9IGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgwRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICAgICAgZGVmID0gY29kZS5jb25zdGFudCgpLnNldFZhbHVlKDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgICAgICBkZWYgPSBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgZGVmID0gY29kZS5jb25zdGFudCgpLnNldFZhbHVlKChzaG9ydCkgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRlZiA9IGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgaWZudWxsMS5zZXRUYXJnZXQoZGVmKTsKKyAgICAgICAgaWZudWxsMi5zZXRUYXJnZXQoZGVmKTsKKyAgICAgICAgZ28yLnNldFRhcmdldChjb2RlLm5vcCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSA8Y29kZT5wY0NvcHlLZXlGaWVsZHNGcm9tT2JqZWN0SWQ8L2NvZGU+IG1ldGhvZHMKKyAgICAgKiB0byBjbGFzc2VzIHVzaW5nIGFwcGxpY2F0aW9uIGlkZW50aXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRDb3B5S2V5RmllbGRzRnJvbU9iamVjdElkTWV0aG9kKGJvb2xlYW4gZmllbGRNYW5hZ2VyKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgcGNDb3B5S2V5RmllbGRzRnJvbU9iamVjdElkIChPYmplY3RJZEZpZWxkQ29uc3VtZXIgZmMsCisgICAgICAgIC8vCU9iamVjdCBvaWQpCisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSAoZmllbGRNYW5hZ2VyKSAKKyAgICAgICAgICAgID8gIG5ldyBTdHJpbmdbXXsgT0lERkNUWVBFLmdldE5hbWUoKSwgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSB9CisgICAgICAgICAgICA6IG5ldyBTdHJpbmdbXXsgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSB9OworICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZCIsCisgICAgICAgICAgICB2b2lkLmNsYXNzLmdldE5hbWUoKSwgYXJncyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGNhbGwgc3VwZXJjbGFzcyBtZXRob2QKKyAgICAgICAgaWYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbShpKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChnZXRUeXBlKF9tZXRhLgorICAgICAgICAgICAgICAgIGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBQUkUgKyAiQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZCIsIHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWVsZE1hbmFnZXIpCisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKworICAgICAgICBpZiAoIV9tZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkgJiYgX21ldGEuaXNPYmplY3RJZFR5cGVTaGFyZWQoKSkgeworICAgICAgICAgICAgLy8gb2lkID0gKChPYmplY3RJZCkgaWQpLmdldElkICgpOworICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKE9iamVjdElkLmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChPYmplY3RJZC5jbGFzcywgImdldElkIiwKKyAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gPG9pZCB0eXBlPiBjYXN0ID0gKDxvaWQgdHlwZT4pIG9pZDsKKyAgICAgICAgaW50IGlkID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgQ2xhc3Mgb2lkVHlwZSA9IF9tZXRhLmdldE9iamVjdElkVHlwZSgpOworICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUob2lkVHlwZSk7CisgICAgICAgIGNvZGUuYXN0b3JlKCkuc2V0TG9jYWwoaWQpOworCisgICAgICAgIC8vIGZzLnN0b3JlPHR5cGU+RmllbGQgKDxpbmRleD4sIGlkLjxmaWVsZD4pOyBvci4uLgorICAgICAgICAvLyB0aGlzLjxmaWVsZD4gPSBpZC48ZmllbGQ+CisgICAgICAgIC8vIG9yIGZvciBzaW5nbGUgZmllbGQgaWRlbnRpdHk6IGlkLmdldElkICgpCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIENsYXNzIHR5cGU7CisgICAgICAgIENsYXNzIHVud3JhcHBlZDsKKyAgICAgICAgRmllbGQgZmllbGQ7CisgICAgICAgIE1ldGhvZCBnZXR0ZXI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFmbWRzW2ldLmlzUHJpbWFyeUtleSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBuYW1lID0gZm1kc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICB0eXBlID0gZm1kc1tpXS5nZXRPYmplY3RJZEZpZWxkVHlwZSgpOworICAgICAgICAgICAgaWYgKCFmaWVsZE1hbmFnZXIgCisgICAgICAgICAgICAgICAgJiYgZm1kc1tpXS5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKSB7CisgICAgICAgICAgICAgICAgLy8gc20uZ2V0UENQcmltYXJ5S2V5KG9pZCwgaSArIHBjSW5oZXJpdGVkRmllbGRDb3VudCk7IAorICAgICAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvZGUuZHVwKCk7IC8vIGxlYXZlIG9yaWcgb24gc3RhY2sgdG8gc2V0IHZhbHVlIGludG8KKyAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKGlkKTsKKyAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgY29kZS5nZXRzdGF0aWMoKS5zZXRGaWVsZChJTkhFUklULCBpbnQuY2xhc3MpOworICAgICAgICAgICAgICAgIGNvZGUuaWFkZCgpOworICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKFN0YXRlTWFuYWdlci5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICJnZXRQQ1ByaW1hcnlLZXkiLCBPYmplY3QuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcywgaW50LmNsYXNzIH0pOworICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIHVud3JhcHBlZCA9IChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMpIAorICAgICAgICAgICAgICAgICAgICA/IHR5cGUgOiB1bndyYXBTaW5nbGVGaWVsZElkZW50aXR5KGZtZHNbaV0pOworICAgICAgICAgICAgICAgIGlmIChmaWVsZE1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoSU5IRVJJVCwgaW50LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZS5pYWRkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgaWYgKHVud3JhcHBlZCAhPSB0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUodHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChpZCk7CisgICAgICAgICAgICAgICAgaWYgKF9tZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9pZFR5cGUgPT0gT2JqZWN0SWQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChvaWRUeXBlLCAiZ2V0SWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkTWFuYWdlciAmJiB0eXBlICE9IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2lkVHlwZSA9PSBEYXRlSWQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChvaWRUeXBlLCAiZ2V0SWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZE1hbmFnZXIgJiYgdHlwZSAhPSBEYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChvaWRUeXBlLCAiZ2V0SWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVud3JhcHBlZCAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZCh0eXBlLCAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW117IHVud3JhcHBlZCB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX21ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKXsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBSZWZsZWN0aW9uLmZpbmRGaWVsZChvaWRUeXBlLCBuYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVmbGVjdGlvbi5nZXRYWFgob2lkLCBSZWZsZWN0aW9uLmZpbmRGaWVsZCguLi4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY2xhc3Njb25zdGFudCgpLnNldENsYXNzKG9pZFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoUmVmbGVjdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZEZpZWxkIiwgRmllbGQuY2xhc3MsIG5ldyBDbGFzc1tdIHsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuY2xhc3MsIFN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzcyB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlc3RhdGljKCkuc2V0TWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFJlZmxlY3Rpb25HZXR0ZXJNZXRob2QodHlwZSwgRmllbGQuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc1ByaW1pdGl2ZSgpICYmIHR5cGUgIT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldHRlciA9IFJlZmxlY3Rpb24uZmluZEdldHRlcihvaWRUeXBlLCBuYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKGdldHRlci5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoZ2V0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWZsZWN0aW9uLmdldFhYWChvaWQsIFJlZmxlY3Rpb24uZmluZEdldHRlciguLi4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY2xhc3Njb25zdGFudCgpLnNldENsYXNzKG9pZFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoUmVmbGVjdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZEdldHRlciIsIE1ldGhvZC5jbGFzcywgbmV3IENsYXNzW10geyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0UmVmbGVjdGlvbkdldHRlck1ldGhvZCh0eXBlLCBNZXRob2QuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc1ByaW1pdGl2ZSgpICYmIHR5cGUgIT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkTWFuYWdlcikKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChnZXRGaWVsZENvbnN1bWVyTWV0aG9kKHR5cGUpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGRTZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIGZtZHNbaV0pOworICAgICAgICB9CisgICAgICAgIGNvZGUudnJldHVybigpOworCisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaWYgdGhlIGNsYXNzIHVzZXMgdGhlIENsYXNzL1N0cmluZyBjb25zdHJ1Y3RvcgorICAgICAqIGluc3RlYWQgb2YganVzdCBTdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBCb29sZWFuIHVzZXNDbGFzc1N0cmluZ0lkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIGlmIChfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSAhPSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisKKyAgICAgICAgaWYgKF9tZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpIHsKKyAgICAgICAgICAgIGlmIChfbWV0YS5nZXRPYmplY3RJZFR5cGUoKSA9PSBPYmplY3RJZC5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgIH0KKworICAgICAgICBDbGFzcyBvaWRUeXBlID0gX21ldGEuZ2V0T2JqZWN0SWRUeXBlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvaWRUeXBlLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdeyBDbGFzcy5jbGFzcywgU3RyaW5nLmNsYXNzIH0pOworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb2lkVHlwZS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXsgU3RyaW5nLmNsYXNzIH0pOworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGdpdmVuIGZpZWxkIGlzIGEgd3JhcHBlci10eXBlIHNpbmdsZSBmaWVsZCBpZGVudGl0eSBwcmltYXJ5IGtleSwKKyAgICAgKiByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgcHJpbWl0aXZlIGNsYXNzLiBFbHNlIHJldHVybiB0aGUgZmllbGQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIHVud3JhcFNpbmdsZUZpZWxkSWRlbnRpdHkoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaWYgKCFmbWQuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLmlzT3BlbkpQQUlkZW50aXR5KCkpCisgICAgICAgICAgICByZXR1cm4gZm1kLmdldERlY2xhcmVkVHlwZSgpOworCisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGUuY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhci5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5jbGFzczsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQuY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0LmNsYXNzOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcuY2xhc3M7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmbWQuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlciBnZXR0ZXIgbWV0aG9kIG9mIHRoZSB7QGxpbmsgUmVmbGVjdGlvbn0gaGVscGVyIGZvcgorICAgICAqIGEgZmllbGQgb3IgZ2V0dGVyIG1ldGhvZCBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBnZXRSZWZsZWN0aW9uR2V0dGVyTWV0aG9kKENsYXNzIHR5cGUsIENsYXNzIGFyZ1R5cGUpCisgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9ICJnZXQiOworICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgbmFtZSArPSBTdHJpbmdVdGlscy5jYXBpdGFsaXplKHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb24uY2xhc3MuZ2V0TWV0aG9kKG5hbWUsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLCAKKyAgICAgICAgICAgIGFyZ1R5cGUgfSk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvcGVyIGZldGNoIG1ldGhvZCBvZiB0aGUgT2JqZWN0SWRGaWVsZFN1cHBsaWVyIGZvcgorICAgICAqIGEgZmllbGQgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0RmllbGRTdXBwbGllck1ldGhvZChDbGFzcyB0eXBlKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGhvZChPSURGU1RZUEUsIHR5cGUsICJmZXRjaCIsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXIgZmV0Y2ggbWV0aG9kIG9mIHRoZSBPYmplY3RJZEZpZWxkQ29uc3VtZXIgZm9yCisgICAgICogYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBnZXRGaWVsZENvbnN1bWVyTWV0aG9kKENsYXNzIHR5cGUpCisgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKE9JREZDVFlQRSwgdHlwZSwgInN0b3JlIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgcGNOZXdPYmplY3RJZEluc3RhbmNlIG1ldGhvZCB0byBjbGFzc2VzIHVzaW5nCisgICAgICogYXBwbGljYXRpb24gaWRlbnRpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZE5ld09iamVjdElkSW5zdGFuY2VNZXRob2QoYm9vbGVhbiBvYmopCisgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICAvLyBwdWJsaWMgT2JqZWN0IHBjTmV3T2JqZWN0SWRJbnN0YW5jZSAoKQorICAgICAgICBDbGFzc1tdIGFyZ3MgPSAob2JqKSA/IG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MgfSA6IG51bGw7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJOZXdPYmplY3RJZEluc3RhbmNlIiwKKyAgICAgICAgICAgIE9iamVjdC5jbGFzcywgYXJncyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIEJvb2xlYW4gdXNlc0Nsc1N0cmluZyA9IHVzZXNDbGFzc1N0cmluZ0lkQ29uc3RydWN0b3IoKTsKKyAgICAgICAgQ2xhc3Mgb2lkVHlwZSA9IF9tZXRhLmdldE9iamVjdElkVHlwZSgpOworICAgICAgICBpZiAob2JqICYmIHVzZXNDbHNTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAoLi4uKTsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBfbG9jLmdldCgic3RyLWNvbnMiLCBvaWRUeXBlLAorICAgICAgICAgICAgICAgIF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKSkuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShtc2cpOworICAgICAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAiPGluaXQ+Iiwgdm9pZC5jbGFzcywgbmV3IENsYXNzW117IFN0cmluZy5jbGFzcyB9KTsKKyAgICAgICAgICAgIGNvZGUuYXRocm93KCk7CisgICAgICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKworICAgICAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghX21ldGEuaXNPcGVuSlBBSWRlbnRpdHkoKSAmJiBfbWV0YS5pc09iamVjdElkVHlwZVNoYXJlZCgpKSB7CisgICAgICAgICAgICAvLyBuZXcgT2JqZWN0SWQgKGNscywgb2lkKQorICAgICAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShPYmplY3RJZC5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5jbGFzc2NvbnN0YW50KCkuc2V0Q2xhc3MoZ2V0VHlwZShfbWV0YSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbmV3IDxvaWQgY2xhc3M+ICgpOworICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKG9pZFR5cGUpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBpZiAoX21ldGEuaXNPcGVuSlBBSWRlbnRpdHkoKSB8fCAob2JqICYmIHVzZXNDbHNTdHJpbmcgPT0gQm9vbGVhbi5UUlVFKSkKKyAgICAgICAgICAgIGNvZGUuY2xhc3Njb25zdGFudCgpLnNldENsYXNzKGdldFR5cGUoX21ldGEpKTsKKyAgICAgICAgaWYgKG9iaikgeworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBpZiAodXNlc0Nsc1N0cmluZyA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1tdeyBDbGFzcy5jbGFzcywgU3RyaW5nLmNsYXNzIH07CisgICAgICAgICAgICBlbHNlIGlmICh1c2VzQ2xzU3RyaW5nID09IEJvb2xlYW4uRkFMU0UpCisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1tdeyBTdHJpbmcuY2xhc3MgfTsKKyAgICAgICAgfSBlbHNlIGlmIChfbWV0YS5pc09wZW5KUEFJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAvLyBuZXcgPHR5cGU+SWRlbnRpdHkgKFhYWC5jbGFzcywgPHBrPik7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgcGsgPSBfbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKClbMF07CisgICAgICAgICAgICBhZGRHZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIHBrKTsKKyAgICAgICAgICAgIGlmIChway5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgICAgIGFkZEV4dHJhY3RPYmplY3RJZEZpZWxkVmFsdWVDb2RlKGNvZGUsIHBrKTsKKyAgICAgICAgICAgIGlmIChfbWV0YS5nZXRPYmplY3RJZFR5cGUoKSA9PSBPYmplY3RJZC5jbGFzcykKKyAgICAgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzW117IENsYXNzLmNsYXNzLCBPYmplY3QuY2xhc3MgfTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF9tZXRhLmdldE9iamVjdElkVHlwZSgpID09IERhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1tdeyBDbGFzcy5jbGFzcywgRGF0ZS5jbGFzcyB9OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbXXsgQ2xhc3MuY2xhc3MsIHBrLmdldE9iamVjdElkRmllbGRUeXBlKCkgfTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChvaWRUeXBlLCAiPGluaXQ+Iiwgdm9pZC5jbGFzcywgYXJncyk7CisgICAgICAgIGlmICghX21ldGEuaXNPcGVuSlBBSWRlbnRpdHkoKSAmJiBfbWV0YS5pc09iamVjdElkVHlwZVNoYXJlZCgpKQorICAgICAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKE9iamVjdElkLmNsYXNzLCAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgQ2xhc3MuY2xhc3MsIE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHRoZSBTdGF0ZU1hbmFnZXIsIG1hbnkgbWV0aG9kcyBhcmUgdXNlZAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2Ygc3RhdGUgYmVpbmcgcGFzc2VkLiBUaGlzIG1ldGhvZCwKKyAgICAgKiBnaXZlbiB0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiBiZWluZyBwYXNzZWQgYW5kIHRoZSBwcmVmaXgKKyAgICAgKiAoJ3Byb3ZpZGVkJywgJ3JlcGxhY2UnLCBldGMpIG9mIHRoZSBtZXRob2QgdG8KKyAgICAgKiBjYWxsLCByZXR1cm5zIHRoZSBTdGF0ZU1hbmFnZXIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBzdGF0ZSBiZWluZyBwYXNzZWQKKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggb2YgdGhlIG1ldGhvZCB0byBjYWxsOyBhbGwgbWV0aG9kcworICAgICAqIGVuZCBpbiAnW3N0YXRlIHR5cGVdRmllbGQnOyBvbmx5IHRoZSBwcmVmaXggdmFyaWVzCisgICAgICogQHBhcmFtIGdldCB0cnVlIGlmIHJlY2VpdmluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgICAqIFN0YXRlTWFuYWdlciwgZmFsc2UgaWYgcGFzc2luZyBpdCB0byB0aGUgU00KKyAgICAgKiBAcGFyYW0gY3VyVmFsdWUgdHJ1ZSBpZiB0aGUgY3VycmVudCBzdGF0ZSB2YWx1ZSBpcyBwYXNzZWQgdG8KKyAgICAgKiB0aGUgU3RhdGVNYW5hZ2VyIGFzIGFuIGV4dHJhIGFyZ3VtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0U3RhdGVNYW5hZ2VyTWV0aG9kKENsYXNzIHR5cGUsIFN0cmluZyBwcmVmaXgsCisgICAgICAgIGJvb2xlYW4gZ2V0LCBib29sZWFuIGN1clZhbHVlKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGhvZChTTVRZUEUsIHR5cGUsIHByZWZpeCwgZ2V0LCB0cnVlLCBjdXJWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXRob2Qgb2YgdGhlIGdpdmVuIG93bmVyIHR5cGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNyaXRlcmlhLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2Ygc3RhdGUgYmVpbmcgcGFzc2VkCisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IG9mIHRoZSBtZXRob2QgdG8gY2FsbDsgYWxsIG1ldGhvZHMKKyAgICAgKiBlbmQgaW4gJ1tzdGF0ZSB0eXBlXUZpZWxkJzsgb25seSB0aGUgcHJlZml4IHZhcmllcworICAgICAqIEBwYXJhbSBnZXQgdHJ1ZSBpZiByZWNlaXZpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAgKiBvd25lciwgZmFsc2UgaWYgcGFzc2luZyBpdCB0byB0aGUgb3duZXIKKyAgICAgKiBAcGFyYW0gaGFzcGMgdHJ1ZSBpZiB0aGUgcGMgaXMgcGFzc2VkIGFzIGFuIGV4dHJhIGFyZ3VtZW50CisgICAgICogQHBhcmFtIGN1clZhbHVlIHRydWUgaWYgdGhlIGN1cnJlbnQgc3RhdGUgdmFsdWUgaXMgcGFzc2VkIHRvCisgICAgICogdGhlIG93bmVyIGFzIGFuIGV4dHJhIGFyZ3VtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIG93bmVyLCBDbGFzcyB0eXBlLCBTdHJpbmcgcHJlZml4LAorICAgICAgICBib29sZWFuIGdldCwgYm9vbGVhbiBoYXNwYywgYm9vbGVhbiBjdXJWYWx1ZSkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGFsbCBtZXRob2RzIGVuZCBpbiBbZmllbGQgdHlwZV1GaWVsZCwgd2hlcmUgdGhlIGZpZWxkIHR5cGUKKyAgICAgICAgLy8gY2FuIGJlIGFueSBvZiB0aGUgcHJpbWl0dmUgdHlwZXMgKGJ1dCBjYXBpdGFsaXplZCksICdTdHJpbmcnLAorICAgICAgICAvLyBvciAnT2JqZWN0JzsgZmlndXJlIG91dCB3aGF0IHR5cGUgdG8gdXNlCisgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKQorICAgICAgICAgICAgICAgICsgdHlwZU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKQorICAgICAgICAgICAgdHlwZU5hbWUgPSAiU3RyaW5nIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0eXBlTmFtZSA9ICJPYmplY3QiOworICAgICAgICAgICAgdHlwZSA9IE9iamVjdC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBmaWVsZCBpbmRleCBpcyBhbHdheXMgcGFzc2VkIGFzIGFuIGFyZzsgdGhlIHBjIGluc3RhbmNlIGFuZAorICAgICAgICAvLyB0aGUgY3VycmVudCB2YWx1ZSBtYXkgYmUgcGFzc2VkOyBpZiBzZXR0aW5nIHRoZSBuZXcgdmFsdWUgaXMKKyAgICAgICAgLy8gYWxzbyBwYXNzZWQKKyAgICAgICAgTGlzdCBwbGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CisgICAgICAgIGlmIChoYXNwYykKKyAgICAgICAgICAgIHBsaXN0LmFkZChQQ1RZUEUpOworICAgICAgICBwbGlzdC5hZGQoaW50LmNsYXNzKTsKKyAgICAgICAgaWYgKCFnZXQgfHwgY3VyVmFsdWUpCisgICAgICAgICAgICBwbGlzdC5hZGQodHlwZSk7CisgICAgICAgIGlmICghZ2V0ICYmIGN1clZhbHVlKSB7CisgICAgICAgICAgICBwbGlzdC5hZGQodHlwZSk7CisgICAgICAgICAgICBwbGlzdC5hZGQoaW50LmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSByZWZsZWN0aW9uIHRvIHJldHVybiB0aGUgcmlnaHQgbWV0aG9kCisgICAgICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICsgdHlwZU5hbWUgKyAiRmllbGQiOworICAgICAgICBDbGFzc1tdIHBhcmFtcyA9IChDbGFzc1tdKSBwbGlzdC50b0FycmF5KG5ldyBDbGFzc1twbGlzdC5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIG93bmVyLmdldERlY2xhcmVkTWV0aG9kKG5hbWUsIHBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIHRocm93IHRoZSBnaXZlbgorICAgICAqIGV4Y2VwdGlvbiB0eXBlLCBzYW5zIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnN0cnVjdGlvbiB0aHJvd0V4Y2VwdGlvbihDb2RlIGNvZGUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgSW5zdHJ1Y3Rpb24gaW5zID0gY29kZS5hbmV3KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKHR5cGUsICI8aW5pdD4iLCB2b2lkLmNsYXNzLCBudWxsKTsKKyAgICAgICAgY29kZS5hdGhyb3coKTsKKyAgICAgICAgcmV0dXJuIGluczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBQZXJzaXN0ZW5jZUNhcGFibGUgaW50ZXJmYWNlIHRvIHRoZSBjbGFzcyBiZWluZyBlbmhhbmNlZCwgYW5kCisgICAgICogYWRkcyBhIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHVzZSBieSBPcGVuSlBBIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuaGFuY2VDbGFzcygpIHsKKyAgICAgICAgLy8gbWFrZSB0aGUgY2xhc3MgaW1wbGVtZW50IFBlcnNpc3RlbmNlQ2FwYWJsZQorICAgICAgICBfcGMuZGVjbGFyZUludGVyZmFjZShQQ1RZUEUpOworCisgICAgICAgIC8vIGFkZCBhIHZlcnNpb24gc3RhbXAKKyAgICAgICAgYWRkR2V0RW5oYW5jZW1lbnRDb250cmFjdFZlcnNpb25NZXRob2QoKTsKKworICAgICAgICAvLyBmaW5kIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IF9wYy5nZXREZWNsYXJlZE1ldGhvZCgiPGluaXQ+IiwgKFN0cmluZ1tdKSBudWxsKTsKKworICAgICAgICAvLyBhIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICBDbGFzcyB0eXBlID0gX3BjLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmICghX2RlZkNvbnMpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImVuaGFuY2UtZGVmYXVsdGNvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSkpOworCisgICAgICAgICAgICBtZXRob2QgPSBfcGMuYWRkRGVmYXVsdENvbnN0cnVjdG9yKCk7CisgICAgICAgICAgICBTdHJpbmcgYWNjZXNzOworICAgICAgICAgICAgaWYgKF9tZXRhLmlzRGV0YWNoYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWxpemFibGUgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAvLyBiZSBwdWJsaWMsIHNvIG1ha2UgdGhlIGFkZGVkIGNvbnN0cnVjdG9yIHB1YmxpYworICAgICAgICAgICAgICAgIG1ldGhvZC5tYWtlUHVibGljKCk7CisgICAgICAgICAgICAgICAgYWNjZXNzID0gInB1YmxpYyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9wYy5pc0ZpbmFsKCkpIHsKKyAgICAgICAgICAgICAgICBtZXRob2QubWFrZVByaXZhdGUoKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSAicHJpdmF0ZSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1ldGhvZC5tYWtlUHJvdGVjdGVkKCk7CisgICAgICAgICAgICAgICAgYWNjZXNzID0gInByb3RlY3RlZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIV9tZXRhLmdldERlc2NyaWJlZFR5cGUoKS5pc0ludGVyZmFjZSgpICYmIF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZW5oYW5jZS1hZGRkZWZhdWx0Y29uc3QiLCB0eXBlLCBhY2Nlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGZvbGxvd2luZyBmaWVsZHMgdG8gdGhlIFBlcnNpc3RlbmNlQ2FwYWJsZSBpbnN0YW5jZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPnByaXZhdGUgc3RhdGljIGludCBwY0luaGVyaXRlZEZpZWxkQ291bnQ8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cHJpdmF0ZSBzdGF0aWMgQ2xhc3MgcGNQQ1N1cGVyY2xhc3M8L2NvZGU+CisgICAgICogPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcGNGaWVsZE5hbWVzPC9jb2RlPjwvbGk+CisgICAgICogPGxpPjxjb2RlPnByaXZhdGUgc3RhdGljIENsYXNzW10gcGNGaWVsZFR5cGVzPC9jb2RlPjwvbGk+CisgICAgICogPGxpPjxjb2RlPnByaXZhdGUgc3RhdGljIGJ5dGVbXSBwY0ZpZWxkRmxhZ3M8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+PGNvZGU+cHJvdGVjdGVkIHRyYW5zaWVudCBTdGF0ZU1hbmFnZXIgcGNTdGF0ZU1hbmFnZXI8L2NvZGU+CisgICAgICogaWYgbm8gUGVyc2lzdGVuY2VDYXBhYmxlIHN1cGVyY2xhc3MgcHJlc2VudCk8L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEZpZWxkcygpIHsKKyAgICAgICAgX3BjLmRlY2xhcmVGaWVsZChJTkhFUklULCBpbnQuY2xhc3MpLnNldFN0YXRpYyh0cnVlKTsKKyAgICAgICAgX3BjLmRlY2xhcmVGaWVsZChQUkUgKyAiRmllbGROYW1lcyIsIFN0cmluZ1tdLmNsYXNzKS5zZXRTdGF0aWModHJ1ZSk7CisgICAgICAgIF9wYy5kZWNsYXJlRmllbGQoUFJFICsgIkZpZWxkVHlwZXMiLCBDbGFzc1tdLmNsYXNzKS5zZXRTdGF0aWModHJ1ZSk7CisgICAgICAgIF9wYy5kZWNsYXJlRmllbGQoUFJFICsgIkZpZWxkRmxhZ3MiLCBieXRlW10uY2xhc3MpLnNldFN0YXRpYyh0cnVlKTsKKyAgICAgICAgX3BjLmRlY2xhcmVGaWVsZChTVVBFUiwgQ2xhc3MuY2xhc3MpLnNldFN0YXRpYyh0cnVlKTsKKworICAgICAgICBpZiAoX21ldGEuZ2V0UENTdXBlcmNsYXNzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQkNGaWVsZCBmaWVsZCA9IF9wYy5kZWNsYXJlRmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgICAgICBmaWVsZC5tYWtlUHJvdGVjdGVkKCk7CisgICAgICAgICAgICBmaWVsZC5zZXRUcmFuc2llbnQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgY2xhc3MgaW5pdGlhbGl6YXRpb24gbWV0aG9kIChjcmVhdGluZyBvbmUgaWYgbmVjZXNzYXJ5KQorICAgICAqIHRvIGluaXRpYWxpemUgdGhlIHN0YXRpYyBmaWVsZHMgb2YgdGhlIFBlcnNpc3RlbmNlQ2FwYWJsZSBpbnN0YW5jZSBhbmQKKyAgICAgKiB0byByZWdpc3RlciBpdCB3aXRoIHRoZSBpbXBsIGhlbHBlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU3RhdGljSW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIENvZGUgY29kZSA9IGdldE9yQ3JlYXRlQ2xhc3NJbml0Q29kZSh0cnVlKTsKKyAgICAgICAgaWYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBjSW5oZXJpdGVkRmllbGRDb3VudCA9IDxzdXBlckNsYXNzPi5wY0dldE1hbmFnZWRGaWVsZENvdW50KCkKKyAgICAgICAgICAgIGNvZGUuaW52b2tlc3RhdGljKCkuc2V0TWV0aG9kKGdldFR5cGUoX21ldGEuCisgICAgICAgICAgICAgICAgZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKSkuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICBQUkUgKyAiR2V0TWFuYWdlZEZpZWxkQ291bnQiLCBpbnQuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKKyAgICAgICAgICAgIGNvZGUucHV0c3RhdGljKCkuc2V0RmllbGQoSU5IRVJJVCwgaW50LmNsYXNzKTsKKworICAgICAgICAgICAgLy8gcGNQQ1N1cGVyY2xhc3MgPSA8c3VwZXJDbGFzcz47CisgICAgICAgICAgICBjb2RlLmNsYXNzY29uc3RhbnQoKS5zZXRDbGFzcyhnZXRUeXBlKF9tZXRhLgorICAgICAgICAgICAgICAgIGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkpKTsKKyAgICAgICAgICAgIGNvZGUucHV0c3RhdGljKCkuc2V0RmllbGQoU1VQRVIsIENsYXNzLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBjRmllbGROYW1lcyA9IG5ldyBTdHJpbmdbXSB7ICI8bmFtZTE+IiwgIjxuYW1lMj4iLCAuLi4gfTsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoZm1kcy5sZW5ndGgpOworICAgICAgICBjb2RlLmFuZXdhcnJheSgpLnNldFR5cGUoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGZtZHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNvZGUuYWFzdG9yZSgpOworICAgICAgICB9CisgICAgICAgIGNvZGUucHV0c3RhdGljKCkuc2V0RmllbGQoUFJFICsgIkZpZWxkTmFtZXMiLCBTdHJpbmdbXS5jbGFzcyk7CisKKyAgICAgICAgLy8gcGNGaWVsZFR5cGVzID0gbmV3IENsYXNzW10geyA8dHlwZTE+LmNsYXNzLCA8dHlwZTI+LmNsYXNzLCAuLi4gfTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGZtZHMubGVuZ3RoKTsKKyAgICAgICAgY29kZS5hbmV3YXJyYXkoKS5zZXRUeXBlKENsYXNzLmNsYXNzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgY29kZS5jbGFzc2NvbnN0YW50KCkuc2V0Q2xhc3MoZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKSk7CisgICAgICAgICAgICBjb2RlLmFhc3RvcmUoKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLnB1dHN0YXRpYygpLnNldEZpZWxkKFBSRSArICJGaWVsZFR5cGVzIiwgQ2xhc3NbXS5jbGFzcyk7CisKKyAgICAgICAgLy8gcGNGaWVsZEZsYWdzID0gbmV3IGJ5dGVbXSB7IDxmbGFnMT4sIDxmbGFnMj4sIC4uLiB9OworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoZm1kcy5sZW5ndGgpOworICAgICAgICBjb2RlLm5ld2FycmF5KCkuc2V0VHlwZShieXRlLmNsYXNzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGkpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGdldEZpZWxkRmxhZyhmbWRzW2ldKSk7CisgICAgICAgICAgICBjb2RlLmJhc3RvcmUoKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLnB1dHN0YXRpYygpLnNldEZpZWxkKFBSRSArICJGaWVsZEZsYWdzIiwgYnl0ZVtdLmNsYXNzKTsKKworICAgICAgICAvLyBQQ1JlZ2lzdHJ5LnJlZ2lzdGVyIChjbHMsCisgICAgICAgIC8vCXBjRmllbGROYW1lcywgcGNGaWVsZFR5cGVzLCBwY0ZpZWxkRmxhZ3MsCisgICAgICAgIC8vICBwY1BDU3VwZXJjbGFzcywgYWxpYXMsIG5ldyBYWFggKCkpOworICAgICAgICBjb2RlLmNsYXNzY29uc3RhbnQoKS5zZXRDbGFzcyhfcGMpOworICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKFBSRSArICJGaWVsZE5hbWVzIiwgU3RyaW5nW10uY2xhc3MpOworICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKFBSRSArICJGaWVsZFR5cGVzIiwgQ2xhc3NbXS5jbGFzcyk7CisgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoUFJFICsgIkZpZWxkRmxhZ3MiLCBieXRlW10uY2xhc3MpOworICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKFNVUEVSLCBDbGFzcy5jbGFzcyk7CisgICAgICAgIAorICAgICAgICBpZiAoX21ldGEuaXNNYXBwZWQoKSkKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShfbWV0YS5nZXRUeXBlQWxpYXMoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7CisKKyAgICAgICAgaWYgKF9wYy5pc0Fic3RyYWN0KCkpCisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoX3BjKTsKKyAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoIjxpbml0PiIsIHZvaWQuY2xhc3MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoSEVMUEVSVFlQRSwgInJlZ2lzdGVyIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBDbGFzcy5jbGFzcywgU3RyaW5nW10uY2xhc3MsIENsYXNzW10uY2xhc3MsCisgICAgICAgICAgICAgICAgYnl0ZVtdLmNsYXNzLCBDbGFzcy5jbGFzcywgU3RyaW5nLmNsYXNzLCBQQ1RZUEUgfSk7CisKKyAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZsYWcgZm9yIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlIGdldEZpZWxkRmxhZyhGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBpZiAoZm1kLmdldE1hbmFnZW1lbnQoKSA9PSBGaWVsZE1ldGFEYXRhLk1BTkFHRV9OT05FKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGJ5dGUgZmxhZ3MgPSAwOworICAgICAgICBpZiAoZm1kLmdldERlY2xhcmVkVHlwZSgpLmlzUHJpbWl0aXZlKCkKKyAgICAgICAgICAgIHx8IFNlcmlhbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZtZC5nZXREZWNsYXJlZFR5cGUoKSkpCisgICAgICAgICAgICBmbGFncyA9IFBlcnNpc3RlbmNlQ2FwYWJsZS5TRVJJQUxJWkFCTEU7CisKKyAgICAgICAgaWYgKGZtZC5nZXRNYW5hZ2VtZW50KCkgPT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfVFJBTlNBQ1RJT05BTCkKKyAgICAgICAgICAgIGZsYWdzIHw9IFBlcnNpc3RlbmNlQ2FwYWJsZS5DSEVDS19XUklURTsKKyAgICAgICAgZWxzZSBpZiAoIWZtZC5pc1ByaW1hcnlLZXkoKSAmJiAhZm1kLmlzSW5EZWZhdWx0RmV0Y2hHcm91cCgpKQorICAgICAgICAgICAgZmxhZ3MgfD0gUGVyc2lzdGVuY2VDYXBhYmxlLkNIRUNLX1dSSVRFCisgICAgICAgICAgICAgICAgfCBQZXJzaXN0ZW5jZUNhcGFibGUuQ0hFQ0tfUkVBRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MgfD0gUGVyc2lzdGVuY2VDYXBhYmxlLk1FRElBVEVfV1JJVEUKKyAgICAgICAgICAgICAgICB8IFBlcnNpc3RlbmNlQ2FwYWJsZS5NRURJQVRFX1JFQUQ7CisgICAgICAgIHJldHVybiBmbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBjb2RlIHRvIHByb3Blcmx5IGhhbmRsZSBQZXJzaXN0ZW5jZUNhcGFibGUgc2VyaWFsaXphdGlvbgorICAgICAqIHRvIHRoZSBieXRlY29kZS4gVGhpcyBpbmNsdWRlcyBjcmVhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZQorICAgICAqIHN0YXRpYyA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPiBjb25zdGFudCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLAorICAgICAqIGFzIHdlbGwgYXMgY3JlYXRpbmcgYSBjdXN0b20gPGNvZGU+d3JpdGVPYmplY3Q8L2NvZGU+IG1ldGhvZCBpZiB0aGUKKyAgICAgKiBjbGFzcyBpcyBTZXJpYWxpemFibGUgYW5kIGRvZXMgbm90IGRlZmluZSB0aGVtLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTZXJpYWxpemF0aW9uQ29kZSgpIHsKKyAgICAgICAgaWYgKGV4dGVybmFsaXplRGV0YWNoZWQoKQorICAgICAgICAgICAgfHwgIVNlcmlhbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gaWYgbm90IGFscmVhZHkgcHJlc2VudCwgYWRkIGEgc2VyaWFsVmVyc2lvblVJRCBmaWVsZDsgaWYgdGhlIGluc3RhbmNlCisgICAgICAgIC8vIGlzIGRldGFjaGFibGUgYW5kIHVzZXMgZGV0YWNoZWQgc3RhdGUgd2l0aG91dCBhIGRlY2xhcmVkIGZpZWxkLAorICAgICAgICAvLyBjYW4ndCBhZGQgYSBzZXJpYWwgdmVyc2lvbiBVSUQgYmVjYXVzZSB3ZSdsbCBiZSBhZGRpbmcgZXh0cmEgZmllbGRzCisgICAgICAgIC8vIHRvIHRoZSBlbmhhbmNlZCB2ZXJzaW9uCisgICAgICAgIEJDRmllbGQgZmllbGQgPSBfcGMuZ2V0RGVjbGFyZWRGaWVsZCgic2VyaWFsVmVyc2lvblVJRCIpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9uZyB1aWQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1aWQgPSBOdW1iZXJzLnZhbHVlT2YoT2JqZWN0U3RyZWFtQ2xhc3MubG9va3VwCisgICAgICAgICAgICAgICAgICAgIChfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkpLmdldFNlcmlhbFZlcnNpb25VSUQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIC8vIGxhc3QtY2hhbmNlIGNhdGNoIGZvciBidWcgIzI4MyAod2hpY2ggY2FuIGhhcHBlbgorICAgICAgICAgICAgICAgIC8vIGluIGEgdmFyaWV0eSBvZiBDbGFzc0xvYWRpbmcgZW52aXJvbm1lbnRzKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZW5oYW5jZS11aWQtYWNjZXNzIiwgX21ldGEpLCB0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgd2UgY291bGRuJ3QgYWNjZXNzIHRoZSBzZXJpYWxWZXJzaW9uVUlELCB3ZSB3aWxsIGhhdmUgdG8KKyAgICAgICAgICAgIC8vIHNraXAgdGhlIG92ZXJyaWRlIG9mIHRoYXQgZmllbGQgYW5kIG5vdCBiZSBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggbm9uLWVuaGFuY2VkIGNsYXNzZXMKKyAgICAgICAgICAgIGlmICh1aWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpZWxkID0gX3BjLmRlY2xhcmVGaWVsZCgic2VyaWFsVmVyc2lvblVJRCIsIGxvbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIGZpZWxkLm1ha2VQcml2YXRlKCk7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0U3RhdGljKHRydWUpOworICAgICAgICAgICAgICAgIGZpZWxkLnNldEZpbmFsKHRydWUpOworCisgICAgICAgICAgICAgICAgQ29kZSBjb2RlID0gZ2V0T3JDcmVhdGVDbGFzc0luaXRDb2RlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjb2RlLmJlZm9yZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKHVpZC5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgY29kZS5wdXRzdGF0aWMoKS5zZXRGaWVsZChmaWVsZCk7CisKKyAgICAgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgd3JpdGUgb2JqZWN0IG1ldGhvZAorICAgICAgICBCQ01ldGhvZCB3cml0ZSA9IF9wYy5nZXREZWNsYXJlZE1ldGhvZCgid3JpdGVPYmplY3QiLAorICAgICAgICAgICAgbmV3IENsYXNzW117IE9iamVjdE91dHB1dFN0cmVhbS5jbGFzcyB9KTsKKyAgICAgICAgYm9vbGVhbiBmdWxsID0gd3JpdGUgPT0gbnVsbDsKKyAgICAgICAgaWYgKGZ1bGwpIHsKKyAgICAgICAgICAgIC8vIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCAoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHdyaXRlID0gX3BjLmRlY2xhcmVNZXRob2QoIndyaXRlT2JqZWN0Iiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT2JqZWN0T3V0cHV0U3RyZWFtLmNsYXNzIH0pOworICAgICAgICAgICAgd3JpdGUuZ2V0RXhjZXB0aW9ucyh0cnVlKS5hZGRFeGNlcHRpb24oSU9FeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgICAgd3JpdGUubWFrZVByaXZhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBtb2RpZnlXcml0ZU9iamVjdE1ldGhvZCh3cml0ZSwgZnVsbCk7CisKKyAgICAgICAgLy8gYW5kIHJlYWQgb2JqZWN0CisgICAgICAgIEJDTWV0aG9kIHJlYWQgPSBfcGMuZ2V0RGVjbGFyZWRNZXRob2QoInJlYWRPYmplY3QiLAorICAgICAgICAgICAgbmV3IENsYXNzW117IE9iamVjdElucHV0U3RyZWFtLmNsYXNzIH0pOworICAgICAgICBmdWxsID0gcmVhZCA9PSBudWxsOworICAgICAgICBpZiAoZnVsbCkgeworICAgICAgICAgICAgLy8gcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QgKE9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgcmVhZCA9IF9wYy5kZWNsYXJlTWV0aG9kKCJyZWFkT2JqZWN0Iiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgT2JqZWN0SW5wdXRTdHJlYW0uY2xhc3MgfSk7CisgICAgICAgICAgICByZWFkLmdldEV4Y2VwdGlvbnModHJ1ZSkuYWRkRXhjZXB0aW9uKElPRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgIHJlYWQuZ2V0RXhjZXB0aW9ucyh0cnVlKS5hZGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICByZWFkLm1ha2VQcml2YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbW9kaWZ5UmVhZE9iamVjdE1ldGhvZChyZWFkLCBmdWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBjbGFzcyBiZWluZyBlbmhhbmNlZCBzaG91bGQgZXh0ZXJuYWxpemUgdG8gYSBkZXRhY2hlZAorICAgICAqIGluc3RhbmNlIHJhdGhlciB0aGFuIHNlcmlhbGl6ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZXJuYWxpemVEZXRhY2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIENsYXNzTWV0YURhdGEuU1lOVEhFVElDLmVxdWFscyhfbWV0YS5nZXREZXRhY2hlZFN0YXRlKCkpCisgICAgICAgICAgICAmJiBTZXJpYWxpemFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkpCisgICAgICAgICAgICAmJiAhX3JlcG9zLmdldENvbmZpZ3VyYXRpb24oKS5nZXREZXRhY2hTdGF0ZUluc3RhbmNlKCkuCisgICAgICAgICAgICBpc0RldGFjaGVkU3RhdGVUcmFuc2llbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY3VzdG9tIHdyaXRlT2JqZWN0IG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byB0aGUKKyAgICAgKiB7QGxpbmsgT2JqZWN0T3V0cHV0U3RyZWFtI2RlZmF1bHRXcml0ZU9iamVjdH0gbWV0aG9kLAorICAgICAqIGJ1dCBvbmx5IGFmdGVyIGNhbGxpbmcgdGhlIGludGVybmFsIDxjb2RlPnBjU2VyaWFsaXppbmc8L2NvZGU+IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbW9kaWZ5V3JpdGVPYmplY3RNZXRob2QoQkNNZXRob2QgbWV0aG9kLCBib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYmVmb3JlRmlyc3QoKTsKKworICAgICAgICAvLyBib29sIGNsZWFyID0gcGNTZXJpYWxpemluZyAoKTsKKyAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChQUkUgKyAiU2VyaWFsaXppbmciLAorICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbnVsbCk7CisgICAgICAgIGludCBjbGVhciA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgIGNvZGUuaXN0b3JlKCkuc2V0TG9jYWwoY2xlYXIpOworCisgICAgICAgIGlmIChmdWxsKSB7CisgICAgICAgICAgICAvLyBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0ICgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKE9iamVjdE91dHB1dFN0cmVhbS5jbGFzcywKKyAgICAgICAgICAgICAgICAiZGVmYXVsdFdyaXRlT2JqZWN0Iiwgdm9pZC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEluc3RydWN0aW9uIHRtcGxhdGUgPSBuZXcgQ29kZSgpLnZyZXR1cm4oKTsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIHRvcmV0OworICAgICAgICBJbnN0cnVjdGlvbiByZXQ7CisgICAgICAgIGNvZGUuYmVmb3JlRmlyc3QoKTsKKyAgICAgICAgd2hpbGUgKGNvZGUuc2VhcmNoRm9yd2FyZCh0bXBsYXRlKSkgeworICAgICAgICAgICAgcmV0ID0gY29kZS5wcmV2aW91cygpOworICAgICAgICAgICAgLy8gaWYgKGNsZWFyKSBwY1NldERldGFjaGVkU3RhdGUgKG51bGwpOworICAgICAgICAgICAgY29kZS5pbG9hZCgpLnNldExvY2FsKGNsZWFyKTsKKyAgICAgICAgICAgIHRvcmV0ID0gY29kZS5pZmVxKCk7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXROdWxsKCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoUFJFICsgIlNldERldGFjaGVkU3RhdGUiLAorICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgICAgICB0b3JldC5zZXRUYXJnZXQocmV0KTsKKyAgICAgICAgICAgIGNvZGUubmV4dCgpOyAvLyBqdW1wIG92ZXIgcmV0dXJuCisgICAgICAgIH0KKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjdXN0b20gcmVhZE9iamVjdCBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlCisgICAgICoge0BsaW5rIE9iamVjdElucHV0U3RyZWFtI3JlYWRPYmplY3R9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbW9kaWZ5UmVhZE9iamVjdE1ldGhvZChCQ01ldGhvZCBtZXRob2QsIGJvb2xlYW4gZnVsbCkgeworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5iZWZvcmVGaXJzdCgpOworCisgICAgICAgIC8vIGlmIHRoaXMgaW5zdGFuY2UgdXNlcyBzeW50aGV0aWMgZGV0YWNoZWQgc3RhdGUsIG5vdGUgdGhhdCBpdCBoYXMKKyAgICAgICAgLy8gYmVlbiBkZXNlcmlhbGl6ZWQKKyAgICAgICAgaWYgKENsYXNzTWV0YURhdGEuU1lOVEhFVElDLmVxdWFscyhfbWV0YS5nZXREZXRhY2hlZFN0YXRlKCkpKSB7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlLmNsYXNzLAorICAgICAgICAgICAgICAgICJERVNFUklBTElaRUQiLCBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKFBSRSArICJTZXREZXRhY2hlZFN0YXRlIiwKKyAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgT2JqZWN0LmNsYXNzIH0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZ1bGwpIHsKKyAgICAgICAgICAgIC8vIGluLmRlZmF1bHRSZWFkT2JqZWN0ICgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKE9iamVjdElucHV0U3RyZWFtLmNsYXNzLAorICAgICAgICAgICAgICAgICJkZWZhdWx0UmVhZE9iamVjdCIsIHZvaWQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIH0KKworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgcGNJc0RldGFjaGVkKCkgbWV0aG9kIHRvIGRldGVybWluZSBpZiBhbiBpbnN0YW5jZQorICAgICAqIGlzIGRldGFjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRJc0RldGFjaGVkTWV0aG9kKCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHB1YmxpYyBib29sZWFuIHBjSXNEZXRhY2hlZCAoKQorICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiSXNEZXRhY2hlZCIsCisgICAgICAgICAgICBCb29sZWFuLmNsYXNzLCBudWxsKTsKKyAgICAgICAgbWV0aG9kLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aG9kLmdldENvZGUodHJ1ZSk7CisgICAgICAgIHdyaXRlSXNEZXRhY2hlZE1ldGhvZChjb2RlKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGJvZHkgb2YgdGhlIHBjSXNEZXRhY2hlZCgpIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYW4KKyAgICAgKiBpbnN0YW5jZSBpcyBkZXRhY2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVJc0RldGFjaGVkTWV0aG9kKENvZGUgY29kZSkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG5vdCBkZXRhY2hhYmxlOiByZXR1cm4gQm9vbGVhbi5GQUxTRQorICAgICAgICBpZiAoIV9tZXRhLmlzRGV0YWNoYWJsZSgpKSB7CisgICAgICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKEJvb2xlYW4uY2xhc3MsICJGQUxTRSIsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiAoc20gIT0gbnVsbCkKKyAgICAgICAgLy8JCXJldHVybiAoc20uaXNEZXRhY2hlZCAoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbnVsbCgpOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChTTVRZUEUsICJpc0RldGFjaGVkIiwKKyAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MsIG51bGwpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZmYWxzZSA9IGNvZGUuaWZlcSgpOworICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKEJvb2xlYW4uY2xhc3MsICJUUlVFIiwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICBpZmZhbHNlLnNldFRhcmdldChjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKEJvb2xlYW4uY2xhc3MsICJGQUxTRSIsCisgICAgICAgICAgICBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworCisgICAgICAgIC8vIGlmIHdlIHVzZSBkZXRhY2hlZCBzdGF0ZToKKyAgICAgICAgLy8gaWYgKHBjR2V0RGV0YWNoZWRTdGF0ZSAoKSAhPSBudWxsCisgICAgICAgIC8vICAgICAmJiBwY0dldERldGFjaGVkU3RhdGUgIT0gREVTRVJJQUxJWkVEKQorICAgICAgICAvLyAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgQm9vbGVhbiBzdGF0ZSA9IF9tZXRhLnVzZXNEZXRhY2hlZFN0YXRlKCk7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBub3RkZXNlciA9IG51bGw7CisgICAgICAgIEluc3RydWN0aW9uIHRhcmdldDsKKyAgICAgICAgaWYgKHN0YXRlICE9IEJvb2xlYW4uRkFMU0UpIHsKKyAgICAgICAgICAgIGlmaW5zLnNldFRhcmdldChsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoUFJFICsgIkdldERldGFjaGVkU3RhdGUiLAorICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBpZmlucyA9IGNvZGUuaWZudWxsKCk7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChQUkUgKyAiR2V0RGV0YWNoZWRTdGF0ZSIsCisgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlLmNsYXNzLAorICAgICAgICAgICAgICAgICJERVNFUklBTElaRUQiLCBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgbm90ZGVzZXIgPSBjb2RlLmlmYWNtcGVxKCk7CisgICAgICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKEJvb2xlYW4uY2xhc3MsICJUUlVFIiwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKworICAgICAgICAgICAgaWYgKHN0YXRlID09IEJvb2xlYW4uVFJVRSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdG8gdXNlIGRldGFjaGVkIHN0YXRlOgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoQm9vbGVhbi5jbGFzcywgIkZBTFNFIiwKKyAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICAgICAgbm90ZGVzZXIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGFydGlmaWNpYWwgdGFyZ2V0IHRvIHNpbXBsaWZ5CisgICAgICAgIHRhcmdldCA9IGNvZGUubm9wKCk7CisgICAgICAgIGlmaW5zLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICBpZiAobm90ZGVzZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG5vdGRlc2VyLnNldFRhcmdldCh0YXJnZXQpOworCisgICAgICAgIC8vIGFsbG93IHVzZXJzIHdpdGggdmVyc2lvbiBmaWVsZHMgdG8gbWFudWFsbHkgY29uc3RydWN0IGEgImRldGFjaGVkIgorICAgICAgICAvLyBpbnN0YW5jZSwgc28gY2hlY2sgdmVyc2lvbiBiZWZvcmUgdGFraW5nIGludG8gYWNjb3VudCBub24tZXhpc3RlbnQKKyAgICAgICAgLy8gZGV0YWNoZWQgc3RhdGUKKworICAgICAgICAvLyBjb25zaWRlciBkZXRhY2hlZCBpZiB2ZXJzaW9uIGlzIG5vbi1kZWZhdWx0CisgICAgICAgIEZpZWxkTWV0YURhdGEgdmVyc2lvbiA9IF9tZXRhLmdldFZlcnNpb25GaWVsZCgpOworICAgICAgICBpZiAoc3RhdGUgIT0gQm9vbGVhbi5UUlVFICYmIHZlcnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgKDx2ZXJzaW9uPiAhPSA8ZGVmYXVsdD4pCisgICAgICAgICAgICAvLwkJcmV0dXJuIHRydWU7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGFkZEdldE1hbmFnZWRWYWx1ZUNvZGUoY29kZSwgdmVyc2lvbik7CisgICAgICAgICAgICBpZmlucyA9IGlmRGVmYXVsdFZhbHVlKGNvZGUsIHZlcnNpb24pOworICAgICAgICAgICAgY29kZS5nZXRzdGF0aWMoKS5zZXRGaWVsZChCb29sZWFuLmNsYXNzLCAiVFJVRSIsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5nZXRzdGF0aWMoKS5zZXRGaWVsZChCb29sZWFuLmNsYXNzLCAiRkFMU0UiLAorICAgICAgICAgICAgICAgIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gZGV0YWNoZWQgc3RhdGU6IGlmIGluc3RhbmNlIHVzZXMgZGV0YWNoZWQgc3RhdGUgYW5kIGl0J3Mgbm90CisgICAgICAgIC8vIHN5bnRoZXRpYyBvciB0aGUgaW5zdGFuY2UgaXMgbm90IHNlcmlhbGl6YWJsZSBvciB0aGUgc3RhdGUgaXNuJ3QKKyAgICAgICAgLy8gdHJhbnNpZW50LCBtdXN0IG5vdCBiZSBkZXRhY2hlZAorICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbAorICAgICAgICAgICAgJiYgKCFDbGFzc01ldGFEYXRhLlNZTlRIRVRJQy5lcXVhbHMoX21ldGEuZ2V0RGV0YWNoZWRTdGF0ZSgpKQorICAgICAgICAgICAgfHwgIVNlcmlhbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKSkKKyAgICAgICAgICAgIHx8ICFfcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLmdldERldGFjaFN0YXRlSW5zdGFuY2UoKS4KKyAgICAgICAgICAgIGlzRGV0YWNoZWRTdGF0ZVRyYW5zaWVudCgpKSkgeworICAgICAgICAgICAgLy8gcmV0dXJuIEJvb2xlYW4uRkFMU0UKKyAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoQm9vbGVhbi5jbGFzcywgIkZBTFNFIiwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vIGRldGFjaGVkIHN0YXRlOiBpZiBpbnN0YW5jZSB1c2VzIGRldGFjaGVkIHN0YXRlIChhbmQgbXVzdCBiZQorICAgICAgICAvLyBzeW50aGV0aWMgYW5kIHRyYW5zaWVudCBpbiBzZXJpYWxpemFibGUgaW5zdGFuY2UgYXQgdGhpcyBwb2ludCksCisgICAgICAgIC8vIG5vdCBkZXRhY2hlZCBpZiBzdGF0ZSBub3Qgc2V0IHRvIERFU0VSSUFMSVpFRAorICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgKHBjR2V0RGV0YWNoZWRTdGF0ZSAoKSA9PSBudWxsKSAvLyBpbnN0ZWFkIG9mIERFU0VSSUFMSVpFRAorICAgICAgICAgICAgLy8gICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoUFJFICsgIkdldERldGFjaGVkU3RhdGUiLAorICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBpZmlucyA9IGNvZGUuaWZub25udWxsKCk7CisgICAgICAgICAgICBjb2RlLmdldHN0YXRpYygpLnNldEZpZWxkKEJvb2xlYW4uY2xhc3MsICJGQUxTRSIsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5ub3AoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zaWRlciBkZXRhY2hlZCBpZiBhdXRvLWdlbm5lZCBwcmltYXJ5IGtleXMgYXJlIG5vbi1kZWZhdWx0CisgICAgICAgIGlmaW5zID0gbnVsbDsKKyAgICAgICAgSnVtcEluc3RydWN0aW9uIGlmaW5zMiA9IG51bGw7CisgICAgICAgIGlmIChzdGF0ZSAhPSBCb29sZWFuLlRSVUUKKyAgICAgICAgICAgICYmIF9tZXRhLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWV0YURhdGEuSURfQVBQTElDQVRJT04pIHsKKyAgICAgICAgICAgIC8vIGZvciBlYWNoIHBrIGZpZWxkOgorICAgICAgICAgICAgLy8gaWYgKDxwaz4gIT0gPGRlZmF1bHQ+IFsmJiAhIiIuZXF1YWxzICg8cGs+KV0pCisgICAgICAgICAgICAvLwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBwa3MgPSBfbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwa3NbaV0uZ2V0VmFsdWVTdHJhdGVneSgpID09IFZhbHVlU3RyYXRlZ2llcy5OT05FKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHRhcmdldCA9IGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChpZmlucyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBpZmlucy5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoaWZpbnMyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGlmaW5zMi5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBpZmluczIgPSBudWxsOworCisgICAgICAgICAgICAgICAgYWRkR2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBwa3NbaV0pOworICAgICAgICAgICAgICAgIGlmaW5zID0gaWZEZWZhdWx0VmFsdWUoY29kZSwgcGtzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAocGtzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgiIik7CisgICAgICAgICAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBhZGRHZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIHBrc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChTdHJpbmcuY2xhc3MsICJlcXVhbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbmV3IENsYXNzW117IE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgICAgICAgICAgICAgaWZpbnMyID0gY29kZS5pZm5lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoQm9vbGVhbi5jbGFzcywgIlRSVUUiLAorICAgICAgICAgICAgICAgICAgICBCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGdpdmUgdXA7IHdlIGp1c3QgZG9uJ3Qga25vdworICAgICAgICB0YXJnZXQgPSBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBpZiAoaWZpbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIGlmaW5zLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICBpZiAoaWZpbnMyICE9IG51bGwpCisgICAgICAgICAgICBpZmluczIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhlIGdpdmVuIGZpZWxkIHRvIGl0cyBKYXZhIGRlZmF1bHQsIHJldHVybmluZyB0aGUKKyAgICAgKiBjb21wYXJpc29uIGluc3RydWN0aW9uLiBUaGUgZmllbGQgdmFsdWUgd2lsbCBhbHJlYWR5IGJlIG9uIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBKdW1wSW5zdHJ1Y3Rpb24gaWZEZWZhdWx0VmFsdWUoQ29kZSBjb2RlLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmlmZXEoKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMEQpOworICAgICAgICAgICAgICAgIGNvZGUuZGNtcGwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5pZmVxKCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMEYpOworICAgICAgICAgICAgICAgIGNvZGUuZmNtcGwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5pZmVxKCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgwTCk7CisgICAgICAgICAgICAgICAgY29kZS5sY21wKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuaWZlcSgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5pZm51bGwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBjb2RlIGZvciB0aGUgY2xhc3MgaW5pdGlhbGl6ZXIgbWV0aG9kLAorICAgICAqIGNyZWF0aW5nIHRoZSBtZXRob2QgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvZGUgZ2V0T3JDcmVhdGVDbGFzc0luaXRDb2RlKGJvb2xlYW4gcmVwbGFjZUxhc3QpIHsKKyAgICAgICAgQkNNZXRob2QgY2xpbml0ID0gX3BjLmdldERlY2xhcmVkTWV0aG9kKCI8Y2xpbml0PiIpOworICAgICAgICBDb2RlIGNvZGU7CisgICAgICAgIGlmIChjbGluaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29kZSA9IGNsaW5pdC5nZXRDb2RlKHRydWUpOworICAgICAgICAgICAgaWYgKHJlcGxhY2VMYXN0KSB7CisgICAgICAgICAgICAgICAgQ29kZSB0ZW1wbGF0ZSA9IG5ldyBDb2RlKCk7CisgICAgICAgICAgICAgICAgY29kZS5zZWFyY2hGb3J3YXJkKHRlbXBsYXRlLnZyZXR1cm4oKSk7CisgICAgICAgICAgICAgICAgY29kZS5wcmV2aW91cygpOworICAgICAgICAgICAgICAgIGNvZGUuc2V0KHRlbXBsYXRlLm5vcCgpKTsKKyAgICAgICAgICAgICAgICBjb2RlLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb2RlOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHN0YXRpYyBpbml0aWFsaXplciBtZXRob2QgaWYgbm9uIGV4aXN0cworICAgICAgICBjbGluaXQgPSBfcGMuZGVjbGFyZU1ldGhvZCgiPGNsaW5pdD4iLCB2b2lkLmNsYXNzLCBudWxsKTsKKyAgICAgICAgY2xpbml0Lm1ha2VQYWNrYWdlKCk7CisgICAgICAgIGNsaW5pdC5zZXRTdGF0aWModHJ1ZSk7CisgICAgICAgIGNsaW5pdC5zZXRGaW5hbCh0cnVlKTsKKworICAgICAgICBjb2RlID0gY2xpbml0LmdldENvZGUodHJ1ZSk7CisgICAgICAgIGlmICghcmVwbGFjZUxhc3QpIHsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICAgICAgY29kZS5wcmV2aW91cygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYnl0ZWNvZGUgbW9kaWZ5aW5nIHRoZSBjbG9uaW5nIGJlaGF2aW9yIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGVuaGFuY2VkIHRvIGNvcnJlY3RseSByZXBsYWNlIHRoZSA8Y29kZT5wY1N0YXRlTWFuYWdlcjwvY29kZT4gCisgICAgICogaW5zdGFuY2UgZmllbGRzIG9mIGFueSBjbG9uZSBjcmVhdGVkIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIAorICAgICAqIEFsc28sIGlmIHRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgUEMgdHlwZSBhbmQgZG9lcyBub3QgZGVjbGFyZWQgCisgICAgICogYSBjbG9uZSBtZXRob2QsIG9uZSB3aWxsIGJlIGFkZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRDbG9uaW5nQ29kZSgpIHsKKyAgICAgICAgaWYgKF9tZXRhLmdldFBDU3VwZXJjbGFzcygpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gYWRkIHRoZSBjbG9uZSBtZXRob2QgaWYgbmVjZXNzYXJ5CisgICAgICAgIEJDTWV0aG9kIGNsb25lID0gX3BjLmdldERlY2xhcmVkTWV0aG9kKCJjbG9uZSIsIChTdHJpbmdbXSkgbnVsbCk7CisgICAgICAgIFN0cmluZyBzdXBlck5hbWUgPSBfcGMuZ2V0U3VwZXJjbGFzc05hbWUoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbnVsbDsKKyAgICAgICAgaWYgKGNsb25lID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGFkZCBjbG9uZSBzdXBwb3J0IGZvciBiYXNlIGNsYXNzZXMKKyAgICAgICAgICAgIC8vIHdoaWNoIGFsc28gaW1wbGVtZW50IGNsb25lYWJsZQorICAgICAgICAgICAgaWYgKCFfcGMuaXNJbnN0YW5jZU9mKENsb25lYWJsZS5jbGFzcykKKyAgICAgICAgICAgICAgICB8fCAhc3VwZXJOYW1lLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiZW5oYW5jZS1jbG9uZWFibGUiLCBfcGMuZ2V0VHlwZSgpKSk7CisKKyAgICAgICAgICAgIC8vIGFkZCBjbG9uZSBtZXRob2QKKyAgICAgICAgICAgIC8vIHByb3RlY3RlZCBPYmplY3QgY2xvbmUgKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgICAgICAgICAgICBjbG9uZSA9IF9wYy5kZWNsYXJlTWV0aG9kKCJjbG9uZSIsIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjbG9uZS5tYWtlUHJvdGVjdGVkKCk7CisgICAgICAgICAgICBjbG9uZS5nZXRFeGNlcHRpb25zKHRydWUpLmFkZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBjb2RlID0gY2xvbmUuZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHN1cGVyLmNsb25lICgpOworICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoX3BjLmdldFN1cGVyY2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgImNsb25lIiwgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7CisgICAgICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGdldCB0aGUgY2xvbmUgbWV0aG9kIGNvZGUKKyAgICAgICAgICAgIGNvZGUgPSBjbG9uZS5nZXRDb2RlKGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRlbXBsYXRlIHN1cGVyLmNsb25lICgpIGluc3RydWN0aW9uIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgICAgSW5zdHJ1Y3Rpb24gdGVtcGxhdGUgPSBuZXcgQ29kZSgpLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QKKyAgICAgICAgICAgIChzdXBlck5hbWUsICJjbG9uZSIsIE9iamVjdC5jbGFzcy5nZXROYW1lKCksIG51bGwpOworCisgICAgICAgIC8vIGZpbmQgY2FsbHMgdG8gdGhlIHRlbXBsYXRlIGluc3RydWN0aW9uOyBvbiBtYXRjaAorICAgICAgICAvLyBjbG9uZSB3aWxsIGJlIG9uIHN0YWNrCisgICAgICAgIGNvZGUuYmVmb3JlRmlyc3QoKTsKKyAgICAgICAgaWYgKGNvZGUuc2VhcmNoRm9yd2FyZCh0ZW1wbGF0ZSkpIHsKKyAgICAgICAgICAgIC8vICgoPHR5cGU+KSBjbG9uZSkucGNTdGF0ZU1hbmFnZXIgPSBudWxsOworICAgICAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShfcGMpOworICAgICAgICAgICAgY29kZS5jb25zdGFudCgpLnNldE51bGwoKTsKKyAgICAgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChTTSwgU01UWVBFKTsKKworICAgICAgICAgICAgLy8gaWYgbW9kaWZpZWQsIGluY3JlYXNlIHN0YWNrCisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXV4aWxpYXJ5IGVuaGFuY2VycyByZWdpc3RlcmVkIGFzIHtAbGluayBTZXJ2aWNlcyBzZXJ2aWNlc30uCisgICAgICovCisgICAgcHVibGljIEF1eGlsaWFyeUVuaGFuY2VyW10gZ2V0QXV4aWxpYXJ5RW5oYW5jZXJzKCkgeworCQlyZXR1cm4gX2F1eEVuaGFuY2VyczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQWxsb3cgYW55IHJlZ2lzdGVyZWQgYXV4aWxpYXJ5IGNvZGUgZ2VuZXJhdG9ycyB0byBydW4uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkF1eGlsaWFyeUVuaGFuY2VycygpIHsKKyAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBfYXV4RW5oYW5jZXJzLmxlbmd0aDsgaSsrKQorICAgIAkJX2F1eEVuaGFuY2Vyc1tpXS5ydW4oX3BjLCBfbWV0YSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFmZmlybXMgaWYgdGhlIGdpdmVuIG1ldGhvZCBiZSBza2lwcGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIHRvIGJlIHNraXBwZWQgb3Igbm90CisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgYXV4aWxpYXJ5IGVuaGFuY2VycyBza2lwcyB0aGUgZ2l2ZW4gbWV0aG9kCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNraXBFbmhhbmNlKEJDTWV0aG9kIG1ldGhvZCkgeworICAgIAlmb3IgKGludCBpID0gMDsgaSA8IF9hdXhFbmhhbmNlcnMubGVuZ3RoOyBpKyspCisgICAgCQlpZiAoX2F1eEVuaGFuY2Vyc1tpXS5za2lwRW5oYW5jZShtZXRob2QpKQorICAgIAkJCXJldHVybiB0cnVlOworICAgIAlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzeW50aGV0aWMgZmllbGQgYWNjZXNzIG1ldGhvZHMgdGhhdCB3aWxsIHJlcGxhY2UgYWxsIGRpcmVjdAorICAgICAqIGZpZWxkIGFjY2Vzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRBY2Nlc3NvcnMoKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEdldE1ldGhvZChpLCBmbWRzW2ldKTsKKyAgICAgICAgICAgIGFkZFNldE1ldGhvZChpLCBmbWRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzdGF0aWMgZ2V0dGVyIG1ldGhvZCBmb3IgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqIFRoZSBnZW5lcmF0ZWQgbWV0aG9kIGludGVyYWN0cyB3aXRoIHRoZSBpbnN0YW5jZSBzdGF0ZSBhbmQgdGhlCisgICAgICogU3RhdGVNYW5hZ2VyIHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSByZWxhdGl2ZSBudW1iZXIgb2YgdGhlIGZpZWxkCisgICAgICogQHBhcmFtIGZtZCBtZXRhZGF0YSBhYm91dCB0aGUgZmllbGQgdG8gZ2V0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEdldE1ldGhvZChpbnQgaW5kZXgsIEZpZWxkTWV0YURhdGEgZm1kKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgQkNNZXRob2QgbWV0aG9kID0gY3JlYXRlR2V0TWV0aG9kKGZtZCk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIGlmIHJlYWRzIGFyZSBub3QgY2hlY2tlZCwganVzdCByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgIGJ5dGUgZmllbGRGbGFnID0gZ2V0RmllbGRGbGFnKGZtZCk7CisgICAgICAgIGlmICgoZmllbGRGbGFnICYgUGVyc2lzdGVuY2VDYXBhYmxlLkNIRUNLX1JFQUQpID09IDAKKyAgICAgICAgICAgICYmIChmaWVsZEZsYWcgJiBQZXJzaXN0ZW5jZUNhcGFibGUuTUVESUFURV9SRUFEKSA9PSAwKSB7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIHRydWUpOworICAgICAgICAgICAgYWRkR2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBmbWQpOworICAgICAgICAgICAgY29kZS54cmV0dXJuKCkuc2V0VHlwZShmbWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworCisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgKGluc3QucGNTdGF0ZU1hbmFnZXIgPT0gbnVsbCkgcmV0dXJuIGluc3QuPGZpZWxkPjsKKyAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCB0cnVlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBKdW1wSW5zdHJ1Y3Rpb24gaWZpbnMgPSBjb2RlLmlmbm9ubnVsbCgpOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIHRydWUpOworICAgICAgICBhZGRHZXRNYW5hZ2VkVmFsdWVDb2RlKGNvZGUsIGZtZCk7CisgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUoZm1kLmdldERlY2xhcmVkVHlwZSgpKTsKKworICAgICAgICAvLyBpbnQgZmllbGQgPSBwY0luaGVyaXRlZEZpZWxkQ291bnQgKyA8ZmllbGRpbmRleD47CisgICAgICAgIGludCBmaWVsZExvY2FsID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoSU5IRVJJVCwgaW50LmNsYXNzKSk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShpbmRleCk7CisgICAgICAgIGNvZGUuaWFkZCgpOworICAgICAgICBjb2RlLmlzdG9yZSgpLnNldExvY2FsKGZpZWxkTG9jYWwpOworCisgICAgICAgIC8vIGluc3QucGNTdGF0ZU1hbmFnZXIuYWNjZXNzaW5nRmllbGQgKGZpZWxkKTsKKyAgICAgICAgLy8gcmV0dXJuIGluc3QuPGZpZWxkPjsKKyAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCB0cnVlKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICBjb2RlLmlsb2FkKCkuc2V0TG9jYWwoZmllbGRMb2NhbCk7CisgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKFNNVFlQRSwgImFjY2Vzc2luZ0ZpZWxkIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgdHJ1ZSk7CisgICAgICAgIGFkZEdldE1hbmFnZWRWYWx1ZUNvZGUoY29kZSwgZm1kKTsKKyAgICAgICAgY29kZS54cmV0dXJuKCkuc2V0VHlwZShmbWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworCisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc3RhdGljIHNldHRlciBtZXRob2QgZm9yIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKiBUaGUgZ2VuZXJhdGVkIG1ldGhvZCBpbnRlcmFjdHMgd2l0aCB0aGUgaW5zdGFuY2Ugc3RhdGUgYW5kIHRoZQorICAgICAqIFN0YXRlTWFuYWdlciB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgcmVsYXRpdmUgbnVtYmVyIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBmbWQgbWV0YWRhdGEgYWJvdXQgdGhlIGZpZWxkIHRvIHNldAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTZXRNZXRob2QoaW50IGluZGV4LCBGaWVsZE1ldGFEYXRhIGZtZCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIEJDTWV0aG9kIG1ldGhvZCA9IGNyZWF0ZVNldE1ldGhvZChmbWQpOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyBQQ0VuaGFuY2VyIHVzZXMgc3RhdGljIG1ldGhvZHM7IFBDU3ViY2xhc3NlciBkb2VzIG5vdC4KKyAgICAgICAgaW50IGZpcnN0UGFyYW1PZmZzZXQgPSBnZXRBY2Nlc3NvclBhcmFtZXRlck9mZnNldCgpOworCisgICAgICAgIC8vIGlmIChpbnN0LnBjU3RhdGVNYW5hZ2VyID09IG51bGwpIGluc3QuPGZpZWxkPiA9IHZhbHVlOworICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIHRydWUpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZub25udWxsKCk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgdHJ1ZSk7CisgICAgICAgIGNvZGUueGxvYWQoKS5zZXRQYXJhbShmaXJzdFBhcmFtT2Zmc2V0KTsKKyAgICAgICAgYWRkU2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBmbWQpOworICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKworICAgICAgICAvLyBpbnN0LnBjU3RhdGVNYW5hZ2VyLnNldHRpbmc8ZmllbGRUeXBlPkZpZWxkIChpbnN0LAorICAgICAgICAvLwlwY0luaGVyaXRlZEZpZWxkQ291bnQgKyA8aW5kZXg+LCBpbnN0LjxmaWVsZD4sIHZhbHVlLCAwKTsKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgdHJ1ZSkpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgdHJ1ZSk7CisgICAgICAgIGNvZGUuZ2V0c3RhdGljKCkuc2V0RmllbGQoSU5IRVJJVCwgaW50LmNsYXNzKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGluZGV4KTsKKyAgICAgICAgY29kZS5pYWRkKCk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgdHJ1ZSk7CisgICAgICAgIGFkZEdldE1hbmFnZWRWYWx1ZUNvZGUoY29kZSwgZm1kKTsKKyAgICAgICAgY29kZS54bG9hZCgpLnNldFBhcmFtKGZpcnN0UGFyYW1PZmZzZXQpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoMCk7CisgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKGdldFN0YXRlTWFuYWdlck1ldGhvZAorICAgICAgICAgICAgKGZtZC5nZXREZWNsYXJlZFR5cGUoKSwgInNldHRpbmciLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGljaCBhdHRhY2ggLyBkZXRhY2ggbWV0aG9kcyB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEF0dGFjaERldGFjaENvZGUoKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2VlIGlmIGFueSBzdXBlcmNsYXNzZXMgYXJlIGRldGFjaGFibGUKKyAgICAgICAgYm9vbGVhbiBwYXJlbnREZXRhY2hhYmxlID0gZmFsc2U7CisgICAgICAgIGZvciAoQ2xhc3NNZXRhRGF0YSBwYXJlbnQgPSBfbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICAgICAgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpKSB7CisgICAgICAgICAgICBpZiAocGFyZW50LmlzRGV0YWNoYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgcGFyZW50RGV0YWNoYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBwYXJlbnQgbm90IGRldGFjaGFibGUsIHdlIG5lZWQgdG8gYWRkIHRoZSBkZXRhY2ggc3RhdGUgZmllbGRzIGFuZAorICAgICAgICAvLyBhY2Nlc3NvciBtZXRob2RzCisgICAgICAgIGlmIChfbWV0YS5nZXRQQ1N1cGVyY2xhc3MoKSA9PSBudWxsCisgICAgICAgICAgICB8fCBwYXJlbnREZXRhY2hhYmxlICE9IF9tZXRhLmlzRGV0YWNoYWJsZSgpKSB7CisgICAgICAgICAgICBhZGRJc0RldGFjaGVkTWV0aG9kKCk7CisgICAgICAgICAgICBhZGREZXRhY2hlZFN0YXRlTWV0aG9kcyhfbWV0YS51c2VzRGV0YWNoZWRTdGF0ZSgpCisgICAgICAgICAgICAgICAgIT0gQm9vbGVhbi5GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBkZXRhY2ggb24gc2VyaWFsaXplLCB3ZSBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoZQorICAgICAgICAvLyBleHRlcm5hbGl6YWJsZSBpbnRlcmZhY2UgdG8gd3JpdGUganVzdCB0aGUgc3RhdGUgZm9yIHRoZSBmaWVsZHMKKyAgICAgICAgLy8gYmVpbmcgZGV0YWNoZWQKKyAgICAgICAgaWYgKGV4dGVybmFsaXplRGV0YWNoZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhZGREZXRhY2hFeHRlcm5hbGl6ZShwYXJlbnREZXRhY2hhYmxlLAorICAgICAgICAgICAgICAgICAgICBfbWV0YS51c2VzRGV0YWNoZWRTdGF0ZSgpICE9IEJvb2xlYW4uRkFMU0UpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihuc21lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZmllbGRzIHRvIGhvbGQgZGV0YWNoZWQgc3RhdGUgYW5kIHRoZWlyIGFjY2Vzc29yIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1wbCB3aGV0aGVyIHRvIGZ1bGx5IGltcGxlbWVudCBkZXRhY2ggc3RhdGUgZnVuY3Rpb25hbGl0eQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGREZXRhY2hlZFN0YXRlTWV0aG9kcyhib29sZWFuIGltcGwpIHsKKyAgICAgICAgRmllbGQgZGV0YWNoRmllbGQgPSBfbWV0YS5nZXREZXRhY2hlZFN0YXRlRmllbGQoKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgZGVjbGFyZXIgPSBudWxsOworICAgICAgICBpZiAoaW1wbCAmJiBkZXRhY2hGaWVsZCA9PSBudWxsKSB7CisgICAgICAgICAgICBuYW1lID0gUFJFICsgIkRldGFjaGVkU3RhdGUiOworICAgICAgICAgICAgZGVjbGFyZXIgPSBfcGMuZ2V0TmFtZSgpOworICAgICAgICAgICAgQkNGaWVsZCBmaWVsZCA9IF9wYy5kZWNsYXJlRmllbGQobmFtZSwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgIGZpZWxkLm1ha2VQcml2YXRlKCk7CisgICAgICAgICAgICBmaWVsZC5zZXRUcmFuc2llbnQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoaW1wbCkgeworICAgICAgICAgICAgbmFtZSA9IGRldGFjaEZpZWxkLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGRlY2xhcmVyID0gZGV0YWNoRmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdWJsaWMgT2JqZWN0IHBjR2V0RGV0YWNoZWRTdGF0ZSAoKQorICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiR2V0RGV0YWNoZWRTdGF0ZSIsCisgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICBtZXRob2Quc2V0U3RhdGljKGZhbHNlKTsKKyAgICAgICAgbWV0aG9kLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgaW50IGFjY2VzcyA9IG1ldGhvZC5nZXRBY2Nlc3NGbGFncygpOworCisgICAgICAgIENvZGUgY29kZSA9IG1ldGhvZC5nZXRDb2RlKHRydWUpOworICAgICAgICBpZiAoaW1wbCkgeworICAgICAgICAgICAgLy8gcmV0dXJuIHBjRGV0YWNoZWRTdGF0ZTsKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGRlY2xhcmVyLCBuYW1lLCBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworCisgICAgICAgIC8vIHB1YmxpYyB2b2lkIHBjU2V0RGV0YWNoZWRTdGF0ZSAoT2JqZWN0IHN0YXRlKQorICAgICAgICBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAiU2V0RGV0YWNoZWRTdGF0ZSIsCisgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3MgW117IE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgbWV0aG9kLnNldEFjY2Vzc0ZsYWdzKGFjY2Vzcyk7CisgICAgICAgIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgaWYgKGltcGwpIHsKKyAgICAgICAgICAgIC8vIHBjRGV0YWNoZWRTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoZGVjbGFyZXIsIG5hbWUsCisgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIGV4dGVybmFsaXphYmxlIGludGVyZmFjZSB0byBkZXRhY2ggb24gc2VyaWFsaXplLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGREZXRhY2hFeHRlcm5hbGl6ZShib29sZWFuIHBhcmVudERldGFjaGFibGUsCisgICAgICAgIGJvb2xlYW4gZGV0YWNoZWRTdGF0ZSkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBkZWNsYXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHB1YmxpYyAKKyAgICAgICAgLy8gZm9yIGV4dGVybmFsaXphdGlvbgorICAgICAgICBCQ01ldGhvZCBtZXRoID0gX3BjLmdldERlY2xhcmVkTWV0aG9kKCI8aW5pdD4iLCAoU3RyaW5nW10pIG51bGwpOworICAgICAgICBpZiAoIW1ldGguaXNQdWJsaWMoKSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZW5oYW5jZS1kZWZjb25zLWV4dGVybiIsIAorICAgICAgICAgICAgICAgICAgX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKSk7CisgICAgICAgICAgICBtZXRoLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBkZWNsYXJlIGV4dGVybmFsaXphYmxlIGludGVyZmFjZQorICAgICAgICBpZiAoIUV4dGVybmFsaXphYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKSkKKyAgICAgICAgICAgIF9wYy5kZWNsYXJlSW50ZXJmYWNlKEV4dGVybmFsaXphYmxlLmNsYXNzKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHVzZXIgZG9lc24ndCBhbHJlYWR5IGhhdmUgY3VzdG9tIGV4dGVybmFsaXphdGlvbiBvcgorICAgICAgICAvLyBzZXJpYWxpemF0aW9uIG1ldGhvZHMKKyAgICAgICAgQ2xhc3NbXSBpbnB1dCA9IG5ldyBDbGFzc1tdeyBPYmplY3RJbnB1dFN0cmVhbS5jbGFzcyB9OworICAgICAgICBDbGFzc1tdIG91dHB1dCA9IG5ldyBDbGFzc1tdeyBPYmplY3RPdXRwdXRTdHJlYW0uY2xhc3MgfTsKKyAgICAgICAgaWYgKF9wYy5nZXREZWNsYXJlZE1ldGhvZCgicmVhZE9iamVjdCIsIGlucHV0KSAhPSBudWxsCisgICAgICAgICAgICB8fCBfcGMuZ2V0RGVjbGFyZWRNZXRob2QoIndyaXRlT2JqZWN0Iiwgb3V0cHV0KSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImRldGFjaC1jdXN0b20tc2VyIiwgX21ldGEpKTsKKyAgICAgICAgaW5wdXRbMF0gPSBPYmplY3RJbnB1dC5jbGFzczsKKyAgICAgICAgb3V0cHV0WzBdID0gT2JqZWN0T3V0cHV0LmNsYXNzOworICAgICAgICBpZiAoX3BjLmdldERlY2xhcmVkTWV0aG9kKCJyZWFkRXh0ZXJuYWwiLCBpbnB1dCkgIT0gbnVsbAorICAgICAgICAgICAgfHwgX3BjLmdldERlY2xhcmVkTWV0aG9kKCJ3cml0ZUV4dGVybmFsIiwgb3V0cHV0KSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImRldGFjaC1jdXN0b20tZXh0ZXJuIiwgX21ldGEpKTsKKworICAgICAgICAvLyBjcmVhdGUgbGlzdCBvZiBhbGwgdW5tYW5hZ2VkIHNlcmlhbGl6YWJsZSBmaWVsZHMKKyAgICAgICAgQkNGaWVsZFtdIGZpZWxkcyA9IF9wYy5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBDb2xsZWN0aW9uIHVubWdkID0gbmV3IEFycmF5TGlzdChmaWVsZHMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZmllbGRzW2ldLmlzVHJhbnNpZW50KCkgJiYgIWZpZWxkc1tpXS5pc1N0YXRpYygpCisgICAgICAgICAgICAgICAgJiYgIWZpZWxkc1tpXS5pc0ZpbmFsKCkKKyAgICAgICAgICAgICAgICAmJiAhZmllbGRzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKFBSRSkKKyAgICAgICAgICAgICAgICAmJiBfbWV0YS5nZXREZWNsYXJlZEZpZWxkKGZpZWxkc1tpXS5nZXROYW1lKCkpID09IG51bGwpCisgICAgICAgICAgICAgICAgdW5tZ2QuYWRkKGZpZWxkc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRSZWFkRXh0ZXJuYWwocGFyZW50RGV0YWNoYWJsZSwgZGV0YWNoZWRTdGF0ZSk7CisgICAgICAgIGFkZFJlYWRVbm1hbmFnZWQodW5tZ2QsIHBhcmVudERldGFjaGFibGUpOworICAgICAgICBhZGRXcml0ZUV4dGVybmFsKHBhcmVudERldGFjaGFibGUsIGRldGFjaGVkU3RhdGUpOworICAgICAgICBhZGRXcml0ZVVubWFuYWdlZCh1bm1nZCwgcGFyZW50RGV0YWNoYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGN1c3RvbSByZWFkRXh0ZXJuYWwgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRSZWFkRXh0ZXJuYWwoYm9vbGVhbiBwYXJlbnREZXRhY2hhYmxlLAorICAgICAgICBib29sZWFuIGRldGFjaGVkU3RhdGUpCisgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBDbGFzc1tdIGluYXJncyA9IG5ldyBDbGFzc1tdeyBPYmplY3RJbnB1dC5jbGFzcyB9OworICAgICAgICBCQ01ldGhvZCBtZXRoID0gX3BjLmRlY2xhcmVNZXRob2QoInJlYWRFeHRlcm5hbCIsIHZvaWQuY2xhc3MsIGluYXJncyk7CisgICAgICAgIEV4Y2VwdGlvbnMgZXhjZXBzID0gbWV0aC5nZXRFeGNlcHRpb25zKHRydWUpOworICAgICAgICBleGNlcHMuYWRkRXhjZXB0aW9uKElPRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgZXhjZXBzLmFkZEV4Y2VwdGlvbihDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIHN1cGVyLnJlYWRFeHRlcm5hbCAoaW4pOworICAgICAgICBDbGFzcyBzdXAgPSBfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBpZiAoIXBhcmVudERldGFjaGFibGUgJiYgRXh0ZXJuYWxpemFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdXApKSB7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChzdXAsICJyZWFkRXh0ZXJuYWwiLAorICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MsIGluYXJncyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkVW5tYW5hZ2VkIChpbik7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChnZXRUeXBlKF9tZXRhKSwKKyAgICAgICAgICAgIFBSRSArICJSZWFkVW5tYW5hZ2VkIiwgdm9pZC5jbGFzcywgaW5hcmdzKTsKKworICAgICAgICBpZiAoZGV0YWNoZWRTdGF0ZSkgeworICAgICAgICAgICAgLy8gcGNTZXREZXRhY2hlZFN0YXRlIChpbi5yZWFkT2JqZWN0ICgpKTsKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT2JqZWN0SW5wdXQuY2xhc3MsICJyZWFkT2JqZWN0IiwKKyAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKFBSRSArICJTZXREZXRhY2hlZFN0YXRlIiwKKyAgICAgICAgICAgICAgICB2b2lkLmNsYXNzLCBuZXcgQ2xhc3NbXXsgT2JqZWN0LmNsYXNzIH0pOworCisgICAgICAgICAgICAvLyBwY1JlcGxhY2VTdGF0ZU1hbmFnZXIgKChTdGF0ZU1hbmFnZXIpIGluLnJlYWRPYmplY3QgKCkpOworICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChPYmplY3RJbnB1dC5jbGFzcywgInJlYWRPYmplY3QiLAorICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoU3RhdGVNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChQUkUgKyAiUmVwbGFjZVN0YXRlTWFuYWdlciIsCisgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW117IFN0YXRlTWFuYWdlci5jbGFzcyB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlYWQgbWFuYWdlZCBmaWVsZHMKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFmbWRzW2ldLmlzVHJhbnNpZW50KCkpCisgICAgICAgICAgICAgICAgcmVhZEV4dGVybmFsKGNvZGUsIGZtZHNbaV0uZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpLCBmbWRzW2ldKTsKKworICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdW5tYW5hZ2VkIGZpZWxkcyBmcm9tIHRoZSBzdHJlYW0gKHBjUmVhZFVubWFuYWdlZCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlYWRVbm1hbmFnZWQoQ29sbGVjdGlvbiB1bm1nZCwgYm9vbGVhbiBwYXJlbnREZXRhY2hhYmxlKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NbXSBpbmFyZ3MgPSBuZXcgQ2xhc3NbXXsgT2JqZWN0SW5wdXQuY2xhc3MgfTsKKyAgICAgICAgQkNNZXRob2QgbWV0aCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJSZWFkVW5tYW5hZ2VkIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIGluYXJncyk7CisgICAgICAgIG1ldGgubWFrZVByb3RlY3RlZCgpOworICAgICAgICBFeGNlcHRpb25zIGV4Y2VwcyA9IG1ldGguZ2V0RXhjZXB0aW9ucyh0cnVlKTsKKyAgICAgICAgZXhjZXBzLmFkZEV4Y2VwdGlvbihJT0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGV4Y2Vwcy5hZGRFeGNlcHRpb24oQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyBzdXBlci5yZWFkVW5tYW5hZ2VkIChpbik7CisgICAgICAgIGlmIChwYXJlbnREZXRhY2hhYmxlKSB7CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChnZXRUeXBlKF9tZXRhLgorICAgICAgICAgICAgICAgIGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkpLCBQUkUgKyAiUmVhZFVubWFuYWdlZCIsIHZvaWQuY2xhc3MsIAorICAgICAgICAgICAgICAgIGluYXJncyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkIGRlY2xhcmVkIHVubWFuYWdlZCBzZXJpYWxpemFibGUgZmllbGRzCisgICAgICAgIEJDRmllbGQgZmllbGQ7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdW5tZ2QuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGZpZWxkID0gKEJDRmllbGQpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICByZWFkRXh0ZXJuYWwoY29kZSwgZmllbGQuZ2V0TmFtZSgpLCBmaWVsZC5nZXRUeXBlKCksIG51bGwpOworICAgICAgICB9CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byByZWFkIGEgZmllbGQgZnJvbSBhbiBleHRlcm5hbGl6YXRpb24gaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWFkRXh0ZXJuYWwoQ29kZSBjb2RlLCBTdHJpbmcgZmllbGROYW1lLCBDbGFzcyB0eXBlLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBtZXRoTmFtZTsKKyAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgbWV0aE5hbWUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1ldGhOYW1lID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG1ldGhOYW1lLmNoYXJBdCgwKSkKKyAgICAgICAgICAgICAgICArIG1ldGhOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIG1ldGhOYW1lID0gInJlYWQiICsgbWV0aE5hbWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbWV0aE5hbWUgPSAicmVhZE9iamVjdCI7CisKKyAgICAgICAgLy8gPGZpZWxkPiA9IGluLnJlYWQ8dHlwZT4gKCk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIENsYXNzIHJldCA9ICh0eXBlLmlzUHJpbWl0aXZlKCkpID8gdHlwZSA6IE9iamVjdC5jbGFzczsKKyAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT2JqZWN0SW5wdXQuY2xhc3MsIG1ldGhOYW1lLAorICAgICAgICAgICAgcmV0LCBudWxsKTsKKyAgICAgICAgaWYgKCF0eXBlLmlzUHJpbWl0aXZlKCkgJiYgdHlwZSAhPSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUodHlwZSk7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChmaWVsZE5hbWUsIHR5cGUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFkZFNldE1hbmFnZWRWYWx1ZUNvZGUoY29kZSwgZm1kKTsKKyAgICAgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNBTEVOREFSOgorICAgICAgICAgICAgICAgICAgICAvLyBpZiAoc20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLy8gICBzbS5wcm94eURldGFjaGVkRGVzZXJpYWxpemVkICg8aW5kZXg+KTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChTTSwgU01UWVBFKTsKKyAgICAgICAgICAgICAgICAgICAgSWZJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZudWxsKCk7CisgICAgICAgICAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoU00sIFNNVFlQRSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZShmbWQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKFNNVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm94eURldGFjaGVkRGVzZXJpYWxpemVkIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBpbnQuY2xhc3MgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmaW5zLnNldFRhcmdldChjb2RlLm5vcCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBjdXN0b20gd3JpdGVFeHRlcm5hbCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFdyaXRlRXh0ZXJuYWwoYm9vbGVhbiBwYXJlbnREZXRhY2hhYmxlLAorICAgICAgICBib29sZWFuIGRldGFjaGVkU3RhdGUpCisgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBDbGFzc1tdIG91dGFyZ3MgPSBuZXcgQ2xhc3NbXXsgT2JqZWN0T3V0cHV0LmNsYXNzIH07CisgICAgICAgIEJDTWV0aG9kIG1ldGggPSBfcGMuZGVjbGFyZU1ldGhvZCgid3JpdGVFeHRlcm5hbCIsIHZvaWQuY2xhc3MsIG91dGFyZ3MpOworICAgICAgICBFeGNlcHRpb25zIGV4Y2VwcyA9IG1ldGguZ2V0RXhjZXB0aW9ucyh0cnVlKTsKKyAgICAgICAgZXhjZXBzLmFkZEV4Y2VwdGlvbihJT0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIENvZGUgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICAvLyBzdXBlci53cml0ZUV4dGVybmFsIChvdXQpOworICAgICAgICBDbGFzcyBzdXAgPSBnZXRUeXBlKF9tZXRhKS5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmICghcGFyZW50RGV0YWNoYWJsZSAmJiBFeHRlcm5hbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHN1cCkpIHsKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKHN1cCwgIndyaXRlRXh0ZXJuYWwiLAorICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MsIG91dGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGVVbm1hbmFnZWQgKG91dCk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChnZXRUeXBlKF9tZXRhKSwKKyAgICAgICAgICAgIFBSRSArICJXcml0ZVVubWFuYWdlZCIsIHZvaWQuY2xhc3MsIG91dGFyZ3MpOworCisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBnbzIgPSBudWxsOworICAgICAgICBpZiAoZGV0YWNoZWRTdGF0ZSkgeworICAgICAgICAgICAgLy8gaWYgKHNtICE9IG51bGwpCisgICAgICAgICAgICAvLyAgIGlmIChzbS53cml0ZURldGFjaGVkIChvdXQpKQorICAgICAgICAgICAgLy8gICAgICByZXR1cm47CisgICAgICAgICAgICBsb2FkTWFuYWdlZEluc3RhbmNlKGNvZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChTTSwgU01UWVBFKTsKKyAgICAgICAgICAgIElmSW5zdHJ1Y3Rpb24gaWZudWxsID0gY29kZS5pZm51bGwoKTsKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKFNNLCBTTVRZUEUpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoU01UWVBFLCAid3JpdGVEZXRhY2hlZCIsCisgICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgb3V0YXJncyk7CisgICAgICAgICAgICBnbzIgPSBjb2RlLmlmZXEoKTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworCisgICAgICAgICAgICAvLyBlbHNlCisgICAgICAgICAgICAvLyAgIG91dC53cml0ZU9iamVjdCAocGNHZXREZXRhY2hlZFN0YXRlICgpKTsKKyAgICAgICAgICAgIENsYXNzW10gb2JqYXJncyA9IG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MgfTsKKyAgICAgICAgICAgIGlmbnVsbC5zZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldFBhcmFtKDApKTsKKyAgICAgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKFBSRSArICJHZXREZXRhY2hlZFN0YXRlIiwKKyAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoT2JqZWN0T3V0cHV0LmNsYXNzLAorICAgICAgICAgICAgICAgICJ3cml0ZU9iamVjdCIsIHZvaWQuY2xhc3MsIG9iamFyZ3MpOworICAgICAgICAgICAgLy8gICAgb3V0LndyaXRlT2JqZWN0IChudWxsKSAvLyBTdGF0ZU1hbmFnZXIKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSgoT2JqZWN0KSBudWxsKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9iamVjdE91dHB1dC5jbGFzcywKKyAgICAgICAgICAgICAgICAid3JpdGVPYmplY3QiLCB2b2lkLmNsYXNzLCBvYmphcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ28yICE9IG51bGwpCisgICAgICAgICAgICBnbzIuc2V0VGFyZ2V0KGNvZGUubm9wKCkpOworCisgICAgICAgIC8vIHdyaXRlIG1hbmFnZWQgZmllbGRzCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmICghZm1kc1tpXS5pc1RyYW5zaWVudCgpKQorICAgICAgICAgICAgICAgIHdyaXRlRXh0ZXJuYWwoY29kZSwgZm1kc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCksIGZtZHNbaV0pOworCisgICAgICAgIC8vIHJldHVybgorICAgICAgICBjb2RlLnZyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHVubWFuYWdlZCBmaWVsZHMgdG8gdGhlIHN0cmVhbSAocGNXcml0ZVVubWFuYWdlZCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFdyaXRlVW5tYW5hZ2VkKENvbGxlY3Rpb24gdW5tZ2QsIGJvb2xlYW4gcGFyZW50RGV0YWNoYWJsZSkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzW10gb3V0YXJncyA9IG5ldyBDbGFzc1tdeyBPYmplY3RPdXRwdXQuY2xhc3MgfTsKKyAgICAgICAgQkNNZXRob2QgbWV0aCA9IF9wYy5kZWNsYXJlTWV0aG9kKFBSRSArICJXcml0ZVVubWFuYWdlZCIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICBvdXRhcmdzKTsKKyAgICAgICAgbWV0aC5tYWtlUHJvdGVjdGVkKCk7CisgICAgICAgIEV4Y2VwdGlvbnMgZXhjZXBzID0gbWV0aC5nZXRFeGNlcHRpb25zKHRydWUpOworICAgICAgICBleGNlcHMuYWRkRXhjZXB0aW9uKElPRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworCisgICAgICAgIC8vIHN1cGVyLndyaXRlVW5tYW5hZ2VkIChvdXQpOworICAgICAgICBpZiAocGFyZW50RGV0YWNoYWJsZSkgeworICAgICAgICAgICAgbG9hZE1hbmFnZWRJbnN0YW5jZShjb2RlLCBmYWxzZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoZ2V0VHlwZShfbWV0YS4KKyAgICAgICAgICAgICAgICBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpKSwgUFJFICsgIldyaXRlVW5tYW5hZ2VkIiwgdm9pZC5jbGFzcywgCisgICAgICAgICAgICAgICAgb3V0YXJncyk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBkZWNsYXJlZCB1bm1hbmFnZWQgc2VyaWFsaXphYmxlIGZpZWxkcworICAgICAgICBCQ0ZpZWxkIGZpZWxkOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHVubWdkLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBmaWVsZCA9IChCQ0ZpZWxkKSBpdHIubmV4dCgpOworICAgICAgICAgICAgd3JpdGVFeHRlcm5hbChjb2RlLCBmaWVsZC5nZXROYW1lKCksIGZpZWxkLmdldFR5cGUoKSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS52cmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHdyaXRlIGEgZmllbGQgdG8gYW4gZXh0ZXJuYWxpemF0aW9uIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRXh0ZXJuYWwoQ29kZSBjb2RlLCBTdHJpbmcgZmllbGROYW1lLCBDbGFzcyB0eXBlLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCkKKyAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBtZXRoTmFtZTsKKyAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgbWV0aE5hbWUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1ldGhOYW1lID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG1ldGhOYW1lLmNoYXJBdCgwKSkKKyAgICAgICAgICAgICAgICArIG1ldGhOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIG1ldGhOYW1lID0gIndyaXRlIiArIG1ldGhOYW1lOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1ldGhOYW1lID0gIndyaXRlT2JqZWN0IjsKKworICAgICAgICAvLyBvdXQud3JpdGU8dHlwZT4gKDxmaWVsZD4pOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgIGxvYWRNYW5hZ2VkSW5zdGFuY2UoY29kZSwgZmFsc2UpOworICAgICAgICBpZiAoZm1kID09IG51bGwpCisgICAgICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoZmllbGROYW1lLCB0eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkR2V0TWFuYWdlZFZhbHVlQ29kZShjb2RlLCBmbWQpOworICAgICAgICBDbGFzc1tdIGFyZ3MgPSBuZXcgQ2xhc3NbXXsgdHlwZSB9OworICAgICAgICBpZiAodHlwZSA9PSBieXRlLmNsYXNzIHx8IHR5cGUgPT0gY2hhci5jbGFzcyB8fCB0eXBlID09IHNob3J0LmNsYXNzKQorICAgICAgICAgICAgYXJnc1swXSA9IGludC5jbGFzczsKKyAgICAgICAgZWxzZSBpZiAoIXR5cGUuaXNQcmltaXRpdmUoKSkKKyAgICAgICAgICAgIGFyZ3NbMF0gPSBPYmplY3QuY2xhc3M7CisgICAgICAgIGNvZGUuaW52b2tlaW50ZXJmYWNlKCkuc2V0TWV0aG9kKE9iamVjdE91dHB1dC5jbGFzcywgbWV0aE5hbWUsCisgICAgICAgICAgICB2b2lkLmNsYXNzLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBmaWVsZCB2YWx1ZSBzcGVjaWZpZWQgYnkgPGNvZGU+Zm1kPC9jb2RlPiBvbnRvIHRoZSBzdGFjay4KKyAgICAgKiBCZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgb2JqZWN0IHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIGxvYWRlZAorICAgICAqIGZyb20gd2lsbCBiZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkR2V0TWFuYWdlZFZhbHVlQ29kZShDb2RlIGNvZGUsIEZpZWxkTWV0YURhdGEgZm1kKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9tZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCkKKyAgICAgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChmbWQuZ2V0TmFtZSgpLCBmbWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworICAgICAgICBlbHNlIC8vIHByb3BlcnR5CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRoID0gKE1ldGhvZCkgZm1kLmdldEJhY2tpbmdNZW1iZXIoKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChQUkUgKyBtZXRoLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtZXRoLmdldFJldHVyblR5cGUoKSwgbWV0aC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBpbnRvIHRoZSBmaWVsZCB2YWx1ZSBzcGVjaWZpZWQKKyAgICAgKiBieSA8Y29kZT5mbWQ8L2NvZGU+LiBCZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgZGF0YSB0byBsb2FkIHdpbGwKKyAgICAgKiBiZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgdGhlIG9iamVjdCB0aGF0IHRoZSBkYXRhIHNob3VsZCBiZSBsb2FkZWQKKyAgICAgKiBpbnRvIHdpbGwgYmUgc2Vjb25kIGluIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU2V0TWFuYWdlZFZhbHVlQ29kZShDb2RlIGNvZGUsIEZpZWxkTWV0YURhdGEgZm1kKQorICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9tZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCkKKyAgICAgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChmbWQuZ2V0TmFtZSgpLCBmbWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworICAgICAgICBlbHNlIC8vIHByb3BlcnR5CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoUFJFICsgZ2V0U2V0dGVyTmFtZShmbWQpLAorICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdeyBmbWQuZ2V0RGVjbGFyZWRUeXBlKCkgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvZmZzZXQgdGhhdCB0aGUgZmlyc3QgbWVhbmluZ2Z1bCBhY2Nlc3NvciBwYXJhbWV0ZXIgaXMgYXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0QWNjZXNzb3JQYXJhbWV0ZXJPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiAoX21ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKSA/IDEgOiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUge0BsaW5rIEluc3RydWN0aW9ufXMgdG8gbG9hZCB0aGUgaW5zdGFuY2UgdG8gbW9kaWZ5IG9udG8gdGhlCisgICAgICogc3RhY2ssIGFuZCByZXR1cm4gaXQuIElmIDxjb2RlPnVzZXJPYmplY3Q8L2NvZGU+IGlzIHNldCwKKyAgICAgKiB0aGVuIDxjb2RlPmNvZGU8L2NvZGU+IHdpbGwgYmUgYWNjZXNzaW5nIGRhdGEgaW4gdGhlIHVzZXItdmlzaWJsZQorICAgICAqIG9iamVjdCAod2hpY2ggbWlnaHQgbm90IGJlICd0aGlzJyBpbiBwcm94eWluZyBjb250ZXh0cyksCisgICAgICogYW5kIHRoZSBsb2FkIGNvZGUgc2hvdWxkIGJlaGF2ZSBhY2NvcmRpbmdseS4gT3RoZXJ3aXNlLAorICAgICAqIDxjb2RlPmNvZGU8L2NvZGU+IHdpbGwgYmUgYWNjZXNzaW5nIFBDLWNvbnRyYWN0IGRhdGEsIHdoaWNoIG11c3QgYWx3YXlzCisgICAgICogYmUgaW4gJ3RoaXMnLiBJZiA8Y29kZT5mb3JBY2Nlc29yPC9jb2RlPiBpcyBzZXQsIHRoZW4gPGNvZGU+Y29kZTwvY29kZT4KKyAgICAgKiBpcyBpbiBhbiBhY2Nlc3NvciBtZXRob2Q7IG90aGVyd2lzZSwgaXQgaXMgaW4gb25lIG9mIHRoZSBQQy1zcGVjaWZpZWQKKyAgICAgKiBtZXRob2RzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYWRkZWQgdG8gPGNvZGU+Y29kZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBJbnN0cnVjdGlvbiBsb2FkTWFuYWdlZEluc3RhbmNlKENvZGUgY29kZSwKKyAgICAgICAgYm9vbGVhbiBmb3JBY2Nlc3NvcikgeworICAgICAgICBpZiAoX21ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEICYmIGZvckFjY2Vzc29yKQorICAgICAgICAgICAgcmV0dXJuIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgcmV0dXJuIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBnZW5lcmF0ZWQgZ2V0dGVyIHtAbGluayBCQ01ldGhvZH0gZm9yIDxjb2RlPmZtZDwvY29kZT4uIFRoZQorICAgICAqIGNhbGxpbmcgZW52aXJvbm1lbnQgd2lsbCB0aGVuIHBvcHVsYXRlIHRoaXMgbWV0aG9kJ3MgY29kZSBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJDTWV0aG9kIGNyZWF0ZUdldE1ldGhvZChGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBCQ01ldGhvZCBnZXR0ZXI7CisgICAgICAgIGlmIChfbWV0YS5nZXRBY2Nlc3NUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQpIHsKKyAgICAgICAgICAgIC8vIHN0YXRpYyA8ZmllbGR0eXBlPiBwY0dldDxmaWVsZD4gKFhYWCBpbnN0KQorICAgICAgICAgICAgQkNGaWVsZCBmaWVsZCA9IF9wYy5nZXREZWNsYXJlZEZpZWxkKGZtZC5nZXROYW1lKCkpOworICAgICAgICAgICAgZ2V0dGVyID0gX3BjLmRlY2xhcmVNZXRob2QoUFJFICsgIkdldCIgKyBmbWQuZ2V0TmFtZSgpLCBmbWQuCisgICAgICAgICAgICAgICAgZ2V0RGVjbGFyZWRUeXBlKCkuZ2V0TmFtZSgpLCBuZXcgU3RyaW5nW117IF9wYy5nZXROYW1lKCkgfSk7CisgICAgICAgICAgICBnZXR0ZXIuc2V0QWNjZXNzRmxhZ3MoZmllbGQuZ2V0QWNjZXNzRmxhZ3MoKQorICAgICAgICAgICAgICAgICYgfkNvbnN0YW50cy5BQ0NFU1NfVFJBTlNJRU5UICYgfkNvbnN0YW50cy5BQ0NFU1NfVk9MQVRJTEUpOworICAgICAgICAgICAgZ2V0dGVyLnNldFN0YXRpYyh0cnVlKTsKKyAgICAgICAgICAgIGdldHRlci5zZXRGaW5hbCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBnZXR0ZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9wZXJ0eSBhY2Nlc3M6CisgICAgICAgIC8vIGNvcHkgdGhlIHVzZXIncyBnZXR0ZXIgbWV0aG9kIHRvIGEgbmV3IG5hbWU7IHdlIGNhbid0IGp1c3QgcmVzZXQKKyAgICAgICAgLy8gdGhlIG5hbWUsIGJlY2F1c2UgdGhhdCB3aWxsIGFsc28gcmVzZXQgYWxsIGNhbGxzIHRvIHRoZSBtZXRob2QKKyAgICAgICAgTWV0aG9kIG1ldGggPSAoTWV0aG9kKSBmbWQuZ2V0QmFja2luZ01lbWJlcigpOworICAgICAgICBnZXR0ZXIgPSBfcGMuZ2V0RGVjbGFyZWRNZXRob2QobWV0aC5nZXROYW1lKCksCisgICAgICAgICAgICBtZXRoLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICBCQ01ldGhvZCBuZXdnZXR0ZXIgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyBtZXRoLmdldE5hbWUoKSwKKyAgICAgICAgICAgIG1ldGguZ2V0UmV0dXJuVHlwZSgpLCBtZXRoLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICBuZXdnZXR0ZXIuc2V0QWNjZXNzRmxhZ3MoZ2V0dGVyLmdldEFjY2Vzc0ZsYWdzKCkpOworICAgICAgICBuZXdnZXR0ZXIubWFrZVByaXZhdGUoKTsKKyAgICAgICAgdHJhbnNmZXJDb2RlQXR0cmlidXRlcyhnZXR0ZXIsIG5ld2dldHRlcik7CisgICAgICAgIHJldHVybiBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBnZW5lcmF0ZWQgc2V0dGVyIHtAbGluayBCQ01ldGhvZH0gZm9yIDxjb2RlPmZtZDwvY29kZT4uIFRoZQorICAgICAqIGNhbGxpbmcgZW52aXJvbm1lbnQgd2lsbCB0aGVuIHBvcHVsYXRlIHRoaXMgbWV0aG9kJ3MgY29kZSBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJDTWV0aG9kIGNyZWF0ZVNldE1ldGhvZChGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBCQ01ldGhvZCBzZXR0ZXI7CisgICAgICAgIGlmIChfbWV0YS5nZXRBY2Nlc3NUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQpIHsKKyAgICAgICAgICAgIC8vIHN0YXRpYyB2b2lkIHBjU2V0PGZpZWxkPiAoWFhYIGluc3QsIDxmaWVsZHR5cGU+IHZhbHVlKQorICAgICAgICAgICAgQkNGaWVsZCBmaWVsZCA9IF9wYy5nZXREZWNsYXJlZEZpZWxkKGZtZC5nZXROYW1lKCkpOworICAgICAgICAgICAgc2V0dGVyID0gX3BjLmRlY2xhcmVNZXRob2QoUFJFICsgIlNldCIgKyBmbWQuZ2V0TmFtZSgpLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBnZXRUeXBlKF9tZXRhKSwgZm1kLmdldERlY2xhcmVkVHlwZSgpIH0pOworICAgICAgICAgICAgc2V0dGVyLnNldEFjY2Vzc0ZsYWdzKGZpZWxkLmdldEFjY2Vzc0ZsYWdzKCkKKyAgICAgICAgICAgICAgICAmIH5Db25zdGFudHMuQUNDRVNTX1RSQU5TSUVOVCAmIH5Db25zdGFudHMuQUNDRVNTX1ZPTEFUSUxFKTsKKyAgICAgICAgICAgIHNldHRlci5zZXRTdGF0aWModHJ1ZSk7CisgICAgICAgICAgICBzZXR0ZXIuc2V0RmluYWwodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gc2V0dGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvcGVydHkgYWNjZXNzOgorICAgICAgICAvLyBjb3B5IHRoZSB1c2VyJ3MgZ2V0dGVyIG1ldGhvZCB0byBhIG5ldyBuYW1lOyB3ZSBjYW4ndCBqdXN0IHJlc2V0CisgICAgICAgIC8vIHRoZSBuYW1lLCBiZWNhdXNlIHRoYXQgd2lsbCBhbHNvIHJlc2V0IGFsbCBjYWxscyB0byB0aGUgbWV0aG9kCisgICAgICAgIHNldHRlciA9IF9wYy5nZXREZWNsYXJlZE1ldGhvZChnZXRTZXR0ZXJOYW1lKGZtZCksCisgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgZm1kLmdldERlY2xhcmVkVHlwZSgpIH0pOworICAgICAgICBCQ01ldGhvZCBuZXdzZXR0ZXIgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyBzZXR0ZXIuZ2V0TmFtZSgpLAorICAgICAgICAgICAgc2V0dGVyLmdldFJldHVybk5hbWUoKSwgc2V0dGVyLmdldFBhcmFtTmFtZXMoKSk7CisgICAgICAgIG5ld3NldHRlci5zZXRBY2Nlc3NGbGFncyhzZXR0ZXIuZ2V0QWNjZXNzRmxhZ3MoKSk7CisgICAgICAgIG5ld3NldHRlci5tYWtlUHJpdmF0ZSgpOworICAgICAgICB0cmFuc2ZlckNvZGVBdHRyaWJ1dGVzKHNldHRlciwgbmV3c2V0dGVyKTsKKyAgICAgICAgcmV0dXJuIHNldHRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkR2V0RW5oYW5jZW1lbnRDb250cmFjdFZlcnNpb25NZXRob2QoKSB7CisgICAgICAgIC8vIHB1YmxpYyBpbnQgZ2V0RW5oYW5jZW1lbnRDb250cmFjdFZlcnNpb24oKQorICAgICAgICBCQ01ldGhvZCBtZXRob2QgPSBfcGMuZGVjbGFyZU1ldGhvZChQUkUgKyAKKyAgICAgICAgICAgICAgICAiR2V0RW5oYW5jZW1lbnRDb250cmFjdFZlcnNpb24iLCBpbnQuY2xhc3MsIG51bGwpOworICAgICAgICBtZXRob2QubWFrZVB1YmxpYygpOworICAgICAgICBDb2RlIGNvZGUgPSBtZXRob2QuZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKEVOSEFOQ0VSX1ZFUlNJT04pOworICAgICAgICBjb2RlLmlyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25jcmV0ZSB0eXBlIGZvciB0aGUgZ2l2ZW4gY2xhc3MsIGkuZS4gaW1wbCBmb3IgbWFuYWdlZAorICAgICAqIGludGVyZmFjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEuZ2V0SW50ZXJmYWNlSW1wbCgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbWV0YS5nZXRJbnRlcmZhY2VJbXBsKCk7CisgICAgICAgIHJldHVybiBtZXRhLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb3ZlIGNvZGUtcmVsYXRlZCBhdHRyaWJ1dGVzIGZyb20gb25lIG1ldGhvZCB0byBhbm90aGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJhbnNmZXJDb2RlQXR0cmlidXRlcyhCQ01ldGhvZCBmcm9tLCBCQ01ldGhvZCB0bykgeworICAgICAgICBDb2RlIGNvZGUgPSBmcm9tLmdldENvZGUoZmFsc2UpOworICAgICAgICBpZiAoY29kZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0by5hZGRBdHRyaWJ1dGUoY29kZSk7CisgICAgICAgICAgICBmcm9tLnJlbW92ZUNvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEV4Y2VwdGlvbnMgZXhjZXBzID0gZnJvbS5nZXRFeGNlcHRpb25zKGZhbHNlKTsKKyAgICAgICAgaWYgKGV4Y2VwcyAhPSBudWxsKQorICAgICAgICAgICAgdG8uYWRkQXR0cmlidXRlKGV4Y2Vwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENFbmhhbmNlciBbb3B0aW9uXSoKKyAgICAgKiAmbHQ7Y2xhc3MgbmFtZSB8IC5qYXZhIGZpbGUgfCAuY2xhc3MgZmlsZSB8IC5qZG8gZmlsZSZndDsrCisgICAgICogIFdoZXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZC4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxpPi1wcm9wZXJ0aWVzLy1wICZsdDtwcm9wZXJ0aWVzIGZpbGUmZ3Q7PC9pPjogVGhlIHBhdGggdG8gYSBPcGVuSlBBCisgICAgICogcHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYXMgb3V0bGluZWQgaW4KKyAgICAgKiB7QGxpbmsgQ29uZmlndXJhdGlvbn07IG9wdGlvbmFsLjwvbGk+CisgICAgICogPGxpPjxpPi0mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvaT46IEFsbCBiZWFuCisgICAgICogcHJvcGVydGllcyBvZiB0aGUgc3RhbmRhcmQgT3BlbkpQQSB7QGxpbmsgT3BlbkpQQUNvbmZpZ3VyYXRpb259IGNhbiBiZQorICAgICAqIHNldCBieSB1c2luZyB0aGVpciBuYW1lcyBhbmQgc3VwcGx5aW5nIGEgdmFsdWU7IGZvciBleGFtcGxlOgorICAgICAqIDxsaT48aT4tZGlyZWN0b3J5Ly1kICZsdDtidWlsZCBkaXJlY3RvcnkmZ3Q7PC9pPjogVGhlIHBhdGggdG8gdGhlIGJhc2UKKyAgICAgKiBkaXJlY3Rvcnkgd2hlcmUgZW5oYW5jZWQgY2xhc3NlcyBhcmUgc3RvcmVkLiBCeSBkZWZhdWx0LCB0aGUKKyAgICAgKiBlbmhhbmNlciBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCAuY2xhc3MgZmlsZSB3aXRoIHRoZSBlbmhhbmNlZAorICAgICAqIHZlcnNpb24uIFVzZSB0aGlzIG9wdGlvbiB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIC5jbGFzcyBmaWxlIGluCisgICAgICogYW5vdGhlciBkaXJlY3RvcnkuIFRoZSBwYWNrYWdlIHN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYmVuZWF0aAorICAgICAqIHRoZSBnaXZlbiBkaXJlY3RvcnkuPC9saT4KKyAgICAgKiA8bGk+PGk+LWFkZERlZmF1bHRDb25zdHJ1Y3Rvci8tYWRjIFt0cnVlL3QgfCBmYWxzZS9mXTwvaT46IFdoZXRoZXIgdG8KKyAgICAgKiBhZGQgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIHRvIHBlcnNpc3RlbnQgY2xhc3NlcyBtaXNzaW5nIG9uZSwgYXMKKyAgICAgKiBvcHBvc2VkIHRvIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gRGVmYXVsdHMgdG8gdHJ1ZS48L2xpPgorICAgICAqIDxsaT48aT4tdG1wQ2xhc3NMb2FkZXIvLXRjbCBbdHJ1ZS90IHwgZmFsc2UvZl08L2k+OiBXaGV0aGVyIHRvCisgICAgICogbG9hZCB0aGUgcHJlLWVuaGFuY2VkIGNsYXNzZXMgdXNpbmcgYSB0ZW1wb3JhcnkgY2xhc3MgbG9hZGVyLgorICAgICAqIERlZmF1bHRzIHRvIHRydWUuIFNldCB0aGlzIHRvIGZhbHNlIHdoZW4gYXR0ZW1wdGluZyB0byBkZWJ1ZworICAgICAqIGNsYXNzIGxvYWRpbmcgZXJyb3JzLjwvbGk+CisgICAgICogPGxpPjxpPi1lbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMvLWVwciBbdHJ1ZS90IHwgZmFsc2UvZl08L2k+OgorICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgUFJPUEVSVFkgYWNjZXNzIGVudGl0eSBhcHBlYXJzCisgICAgICogdG8gYmUgdmlvbGF0aW5nIHN0YW5kYXJkIHByb3BlcnR5IHJlc3RyaWN0aW9ucy4gRGVmYXVsdHMgdG8gZmFsc2UuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqICBFYWNoIGFkZGl0aW9uYWwgYXJndW1lbnQgY2FuIGJlIGVpdGhlciB0aGUgZnVsbCBjbGFzcyBuYW1lIG9mIHRoZQorICAgICAqIHR5cGUgdG8gZW5oYW5jZSwgdGhlIHBhdGggdG8gdGhlIC5qYXZhIGZpbGUgZm9yIHRoZSB0eXBlLCB0aGUgcGF0aCB0bworICAgICAqIHRoZSAuY2xhc3MgZmlsZSBmb3IgdGhlIHR5cGUsIG9yIHRoZSBwYXRoIHRvIGEgLmpkbyBmaWxlIGxpc3Rpbmcgb25lCisgICAgICogb3IgbW9yZSB0eXBlcyB0byBlbmhhbmNlLgorICAgICAqIElmIHRoZSB0eXBlIGJlaW5nIGVuaGFuY2VkIGhhcyBtZXRhZGF0YSwgaXQgd2lsbCBiZSBlbmhhbmNlZCBhcyBhCisgICAgICogcGVyc2lzdGVuY2UgY2FwYWJsZSBjbGFzcy4gSWYgbm90LCBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYSBwZXJzaXN0ZW5jZQorICAgICAqIGF3YXJlIGNsYXNzLCBhbmQgYWxsIGFjY2VzcyB0byBmaWVsZHMgb2YgcGVyc2lzdGVuY2UgY2FwYWJsZSBjbGFzc2VzCisgICAgICogd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYXBwcm9wcmlhdGUJZ2V0L3NldCBtZXRob2QuIElmIHRoZSB0eXBlCisgICAgICogZXhwbGljaXRseSBkZWNsYXJlcyB0aGUgcGVyc2lzdGVuY2UtY2FwYWJsZSBpbnRlcmZhY2UsIGl0IHdpbGwKKyAgICAgKiBub3QgYmUgZW5oYW5jZWQuIFRodXMsIGl0IGlzIHNhZmUgdG8gaW52b2tlIHRoZSBlbmhhbmNlciBvbiBjbGFzc2VzCisgICAgICogdGhhdCBhcmUgYWxyZWFkeSBlbmhhbmNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBhcmdzID0gb3B0cy5zZXRGcm9tQ21kTGluZShhcmdzKTsKKyAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghcnVuKGNvbmYsIGFyZ3MsIG9wdHMpKQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihfbG9jLmdldCgiZW5oYW5jZS11c2FnZSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbmYuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdG9vbC4gUmV0dXJucyBmYWxzZSBpZiBpbnZhbGlkIG9wdGlvbnMgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBPcHRpb25zIG9wdHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcHRzLmNvbnRhaW5zS2V5KCJoZWxwIikgfHwgb3B0cy5jb250YWluc0tleSgiLWhlbHAiKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBGbGFncyBmbGFncyA9IG5ldyBGbGFncygpOworICAgICAgICBmbGFncy5kaXJlY3RvcnkgPSBGaWxlcy5nZXRGaWxlKG9wdHMucmVtb3ZlUHJvcGVydHkoImRpcmVjdG9yeSIsICJkIiwKKyAgICAgICAgICAgIG51bGwpLCBudWxsKTsKKyAgICAgICAgZmxhZ3MuYWRkRGVmYXVsdENvbnN0cnVjdG9yID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgiYWRkRGVmYXVsdENvbnN0cnVjdG9yIiwgImFkYyIsIGZsYWdzLmFkZERlZmF1bHRDb25zdHJ1Y3Rvcik7CisgICAgICAgIGZsYWdzLnRtcENsYXNzTG9hZGVyID0gb3B0cy5yZW1vdmVCb29sZWFuUHJvcGVydHkKKyAgICAgICAgICAgICgidG1wQ2xhc3NMb2FkZXIiLCAidGNsIiwgZmxhZ3MudG1wQ2xhc3NMb2FkZXIpOworICAgICAgICBmbGFncy5lbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMgPSBvcHRzLnJlbW92ZUJvb2xlYW5Qcm9wZXJ0eQorICAgICAgICAgICAgKCJlbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMiLCAiZXByIiwKKyAgICAgICAgICAgICAgICBmbGFncy5lbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMpOworCisgICAgICAgIENvbmZpZ3VyYXRpb25zLnBvcHVsYXRlQ29uZmlndXJhdGlvbihjb25mLCBvcHRzKTsKKyAgICAgICAgcmV0dXJuIHJ1bihjb25mLCBhcmdzLCBmbGFncywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5oYW5jZSB0aGUgZ2l2ZW4gY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcnVuKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgIEZsYWdzIGZsYWdzLCBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MsIEJ5dGVjb2RlV3JpdGVyIHdyaXRlciwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2FkZXIgPSBjb25mLmdldENsYXNzUmVzb2x2ZXJJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKFBDRW5oYW5jZXIuY2xhc3MsIG51bGwpOworICAgICAgICBpZiAoZmxhZ3MudG1wQ2xhc3NMb2FkZXIpCisgICAgICAgICAgICBsb2FkZXIgPSBuZXcgVGVtcG9yYXJ5Q2xhc3NMb2FkZXIobG9hZGVyKTsKKworICAgICAgICBpZiAocmVwb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVwb3MgPSBjb25mLm5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICByZXBvcy5zZXRTb3VyY2VNb2RlKE1ldGFEYXRhUmVwb3NpdG9yeS5NT0RFX01FVEEpOworICAgICAgICB9CisKKyAgICAgICAgTG9nIGxvZyA9IGNvbmYuZ2V0TG9nKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19UT09MKTsKKyAgICAgICAgQ29sbGVjdGlvbiBjbGFzc2VzOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInJ1bm5pbmctYWxsLWNsYXNzZXMiKSk7CisgICAgICAgICAgICBjbGFzc2VzID0gcmVwb3MuZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyh0cnVlLCBsb2FkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3NBcmdQYXJzZXIgY2FwID0gY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhRmFjdG9yeSgpLm5ld0NsYXNzQXJnUGFyc2VyKCk7CisgICAgICAgICAgICBjYXAuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgICAgIGNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2FwLnBhcnNlVHlwZXMoYXJnc1tpXSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIEJDQ2xhc3MgYmM7CisgICAgICAgIFBDRW5oYW5jZXIgZW5oYW5jZXI7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIENsYXNzIGNsczsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjbGFzc2VzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmhhbmNlLXJ1bm5pbmciLCBvKSk7CisKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgIGJjID0gcHJvamVjdC5sb2FkQ2xhc3MoKFN0cmluZykgbyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmMgPSBwcm9qZWN0LmxvYWRDbGFzcygoQ2xhc3MpIG8pOworICAgICAgICAgICAgZW5oYW5jZXIgPSBuZXcgUENFbmhhbmNlcihjb25mLCBiYywgcmVwb3MsIGxvYWRlcik7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW5oYW5jZXIuc2V0Qnl0ZWNvZGVXcml0ZXIod3JpdGVyKTsKKyAgICAgICAgICAgIGVuaGFuY2VyLnNldERpcmVjdG9yeShmbGFncy5kaXJlY3RvcnkpOworICAgICAgICAgICAgZW5oYW5jZXIuc2V0QWRkRGVmYXVsdENvbnN0cnVjdG9yKGZsYWdzLmFkZERlZmF1bHRDb25zdHJ1Y3Rvcik7CisgICAgICAgICAgICBzdGF0dXMgPSBlbmhhbmNlci5ydW4oKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRU5IQU5DRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoImVuaGFuY2Utbm9ydW4iKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBFTkhBTkNFX0lOVEVSRkFDRSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmhhbmNlLWludGVyZmFjZSIpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEVOSEFOQ0VfQVdBUkUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgiZW5oYW5jZS1hd2FyZSIpKTsKKyAgICAgICAgICAgICAgICBlbmhhbmNlci5yZWNvcmQoKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGVuaGFuY2VyLnJlY29yZCgpOworICAgICAgICAgICAgcHJvamVjdC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biBmbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsYWdzIHsKKworICAgICAgICBwdWJsaWMgRmlsZSBkaXJlY3RvcnkgPSBudWxsOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGREZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0bXBDbGFzc0xvYWRlciA9IHRydWU7CisJCXB1YmxpYyBib29sZWFuIGVuZm9yY2VQcm9wZXJ0eVJlc3RyaWN0aW9ucyA9IGZhbHNlOworCX0KKworCS8qKgorIAkgKiBQbHVnaW4gaW50ZXJmYWNlIGZvciBhZGRpdGlvbmFsIGVuaGFuY2VtZW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEF1eGlsaWFyeUVuaGFuY2VyCisJeworCQlwdWJsaWMgdm9pZCBydW4gKEJDQ2xhc3MgYmMsIENsYXNzTWV0YURhdGEgbWV0YSk7CisJCXB1YmxpYyBib29sZWFuIHNraXBFbmhhbmNlKEJDTWV0aG9kIG0pOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9QQ1JlZ2lzdHJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDNlZDIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUENSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuUmVmZXJlbmNlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogVHJhY2tzIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UtY2FwYWJsZSBjbGFzc2VzLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFBDUmVnaXN0cnkgeworICAgIC8vIERPIE5PVCBBREQgQURESVRJT05BTCBERVBFTkRFTkNJRVMgVE8gVEhJUyBDTEFTUworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUENSZWdpc3RyeS5jbGFzcyk7CisKKyAgICAvLyBtYXAgb2YgcGMgY2xhc3NlcyB0byBtZXRhIHN0cnVjdHM7IHdlYWsgc28gdGhlIFZNIGNhbiBHQyBjbGFzc2VzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9tZXRhcyA9IG5ldyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcAorICAgICAgICAoUmVmZXJlbmNlTWFwLldFQUssIFJlZmVyZW5jZU1hcC5IQVJEKTsKKworICAgIC8vIHJlZ2lzdGVyIGNsYXNzIGxpc3RlbmVycworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gX2xpc3RlbmVycyA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIHtAbGluayBSZWdpc3RlckNsYXNzTGlzdGVuZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWdpc3RlckNsYXNzTGlzdGVuZXIoUmVnaXN0ZXJDbGFzc0xpc3RlbmVyIHJjbCkgeworICAgICAgICBpZiAocmNsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gd2UgaGF2ZSB0byBiZSBwb3NpdGl2ZSB0aGF0IGV2ZXJ5IGxpc3RlbmVyIGdldHMgbm90aWZpZWQgZm9yCisgICAgICAgIC8vIGV2ZXJ5IGNsYXNzLCBzbyBsb3RzIG9mIGxvY2tpbmcKKyAgICAgICAgc3luY2hyb25pemVkIChfbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBfbGlzdGVuZXJzLmFkZChyY2wpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAoX21ldGFzKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9tZXRhcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICByY2wucmVnaXN0ZXIoKENsYXNzKSBpdHIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSB7QGxpbmsgUmVnaXN0ZXJDbGFzc0xpc3RlbmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUmVnaXN0ZXJDbGFzc0xpc3RlbmVyKFJlZ2lzdGVyQ2xhc3NMaXN0ZW5lciByY2wpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChfbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBfbGlzdGVuZXJzLnJlbW92ZShyY2wpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWVsZCBuYW1lcyBmb3IgYSA8Y29kZT5QZXJzaXN0ZW5jZUNhcGFibGU8L2NvZGU+IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RmllbGROYW1lcyhDbGFzcyBwY0NsYXNzKSB7CisgICAgICAgIE1ldGEgbWV0YSA9IGdldE1ldGEocGNDbGFzcyk7CisgICAgICAgIHJldHVybiBtZXRhLmZpZWxkTmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWVsZCB0eXBlcyBmb3IgYSA8Y29kZT5QZXJzaXN0ZW5jZUNhcGFibGU8L2NvZGU+IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NbXSBnZXRGaWVsZFR5cGVzKENsYXNzIHBjQ2xhc3MpIHsKKyAgICAgICAgTWV0YSBtZXRhID0gZ2V0TWV0YShwY0NsYXNzKTsKKyAgICAgICAgcmV0dXJuIG1ldGEuZmllbGRUeXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgc3VwZXJjbGFzcyBmb3IgYSA8Y29kZT5QZXJzaXN0ZW5jZUNhcGFibGU8L2NvZGU+CisgICAgICogY2xhc3MsIG9yIG51bGwgaWYgbm9uZS4gVGhlIHN1cGVyY2xhc3MgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50CisgICAgICoge0BsaW5rIFBlcnNpc3RlbmNlQ2FwYWJsZX0sIGRlcGVuZGluZyBvbiB0aGUgYWNjZXNzIHR5cGUgb2YgdGhlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UGVyc2lzdGVudFN1cGVyY2xhc3MoQ2xhc3MgcGNDbGFzcykgeworICAgICAgICBNZXRhIG1ldGEgPSBnZXRNZXRhKHBjQ2xhc3MpOworICAgICAgICByZXR1cm4gbWV0YS5wY1N1cGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYW5kIGFzc2lnbiBpdHMgc3RhdGUgbWFuYWdlci4KKyAgICAgKiBUaGUgbmV3IGluc3RhbmNlIGhhcyBpdHMgZmxhZ3Mgc2V0IHRvIDxjb2RlPkxPQURfUkVRVUlSRUQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VDYXBhYmxlIG5ld0luc3RhbmNlKENsYXNzIHBjQ2xhc3MsCisgICAgICAgIFN0YXRlTWFuYWdlciBzbSwgYm9vbGVhbiBjbGVhcikgeworICAgICAgICBNZXRhIG1ldGEgPSBnZXRNZXRhKHBjQ2xhc3MpOworICAgICAgICByZXR1cm4gKG1ldGEucGMgPT0gbnVsbCkgPyBudWxsIDogbWV0YS5wYy5wY05ld0luc3RhbmNlKHNtLCBjbGVhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBhbmQgYXNzaWduIGl0cyBzdGF0ZSBtYW5hZ2VyIGFuZCBvaWQuCisgICAgICogVGhlIG5ldyBpbnN0YW5jZSBoYXMgaXRzIGZsYWdzIHNldCB0byA8Y29kZT5MT0FEX1JFUVVJUkVEPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlQ2FwYWJsZSBuZXdJbnN0YW5jZShDbGFzcyBwY0NsYXNzLAorICAgICAgICBTdGF0ZU1hbmFnZXIgc20sIE9iamVjdCBvaWQsIGJvb2xlYW4gY2xlYXIpIHsKKyAgICAgICAgTWV0YSBtZXRhID0gZ2V0TWV0YShwY0NsYXNzKTsKKyAgICAgICAgcmV0dXJuIChtZXRhLnBjID09IG51bGwpID8gbnVsbCA6IG1ldGEucGMucGNOZXdJbnN0YW5jZShzbSwgb2lkLCBjbGVhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGlkZW50aXR5IG9iamVjdCBmb3IgdGhlIGdpdmVuCisgICAgICogPGNvZGU+UGVyc2lzdGVuY2VDYXBhYmxlPC9jb2RlPiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdPYmplY3RJZChDbGFzcyBwY0NsYXNzKSB7CisgICAgICAgIE1ldGEgbWV0YSA9IGdldE1ldGEocGNDbGFzcyk7CisgICAgICAgIHJldHVybiAobWV0YS5wYyA9PSBudWxsKSA/IG51bGwgOiBtZXRhLnBjLnBjTmV3T2JqZWN0SWRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpZGVudGl0eSBvYmplY3QgZm9yIHRoZSBnaXZlbgorICAgICAqIDxjb2RlPlBlcnNpc3RlbmNlQ2FwYWJsZTwvY29kZT4gY2xhc3MsIHVzaW5nIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICogZm9ybSBvZiB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbmV3T2JqZWN0SWQoQ2xhc3MgcGNDbGFzcywgU3RyaW5nIHN0cikgeworICAgICAgICBNZXRhIG1ldGEgPSBnZXRNZXRhKHBjQ2xhc3MpOworICAgICAgICByZXR1cm4gKG1ldGEucGMgPT0gbnVsbCkgPyBudWxsIDogbWV0YS5wYy5wY05ld09iamVjdElkSW5zdGFuY2Uoc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlQWxpYXMoQ2xhc3MgcGNDbGFzcykgeworICAgICAgICByZXR1cm4gZ2V0TWV0YShwY0NsYXNzKS5hbGlhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGZpZWxkcyBmcm9tIGFuIG91dHNpZGUgc291cmNlIHRvIHRoZSBrZXkgZmllbGRzIGluIHRoZSBpZGVudGl0eQorICAgICAqIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUtleUZpZWxkc1RvT2JqZWN0SWQoQ2xhc3MgcGNDbGFzcywgRmllbGRTdXBwbGllciBmbSwKKyAgICAgICAgT2JqZWN0IG9pZCkgeworICAgICAgICBNZXRhIG1ldGEgPSBnZXRNZXRhKHBjQ2xhc3MpOworICAgICAgICBpZiAobWV0YS5wYyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNvcHktbm8taWQiLCBwY0NsYXNzKSk7CisKKyAgICAgICAgbWV0YS5wYy5wY0NvcHlLZXlGaWVsZHNUb09iamVjdElkKGZtLCBvaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgZmllbGRzIHRvIGFuIG91dHNpZGUgc291cmNlIGZyb20gdGhlIGtleSBmaWVsZHMgaW4gdGhlIGlkZW50aXR5CisgICAgICogb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5S2V5RmllbGRzRnJvbU9iamVjdElkKENsYXNzIHBjQ2xhc3MsCisgICAgICAgIEZpZWxkQ29uc3VtZXIgZm0sIE9iamVjdCBvaWQpIHsKKyAgICAgICAgTWV0YSBtZXRhID0gZ2V0TWV0YShwY0NsYXNzKTsKKyAgICAgICAgaWYgKG1ldGEucGMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb3B5LW5vLWlkIiwgcGNDbGFzcykpOworCisgICAgICAgIG1ldGEucGMucGNDb3B5S2V5RmllbGRzRnJvbU9iamVjdElkKGZtLCBvaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIG1ldGFkYXRhIGJ5IGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkVHlwZXMgbWFuYWdlZCBmaWVsZCB0eXBlcworICAgICAqIEBwYXJhbSBmaWVsZEZsYWdzIG1hbmFnZWQgZmllbGQgZmxhZ3MKKyAgICAgKiBAcGFyYW0gc3VwIHRoZSBtb3N0IGltbWVkaWF0ZSBwZXJzaXN0ZW50IHN1cGVyY2xhc3MKKyAgICAgKiBAcGFyYW0gcGNDbGFzcyB0aGUgPGNvZGU+UGVyc2lzdGVuY2VDYXBhYmxlPC9jb2RlPiBjbGFzcworICAgICAqIEBwYXJhbSBmaWVsZE5hbWVzIG1hbmFnZWQgZmllbGQgbmFtZXMKKyAgICAgKiBAcGFyYW0gYWxpYXMgdGhlIGNsYXNzIGFsaWFzCisgICAgICogQHBhcmFtIHBjIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcywgaWYgbm90IGFic3RyYWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKENsYXNzIHBjQ2xhc3MsIFN0cmluZ1tdIGZpZWxkTmFtZXMsCisgICAgICAgIENsYXNzW10gZmllbGRUeXBlcywgYnl0ZVtdIGZpZWxkRmxhZ3MsIENsYXNzIHN1cCwgU3RyaW5nIGFsaWFzLAorICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMpIHsKKyAgICAgICAgaWYgKHBjQ2xhc3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCisgICAgICAgIC8vIHdlIGhhdmUgdG8gYmUgcG9zaXRpdmUgdGhhdCBldmVyeSBsaXN0ZW5lciBnZXRzIG5vdGlmaWVkIGZvcgorICAgICAgICAvLyBldmVyeSBjbGFzcywgc28gbG90cyBvZiBsb2NraW5nCisgICAgICAgIE1ldGEgbWV0YSA9IG5ldyBNZXRhKHBjLCBmaWVsZE5hbWVzLCBmaWVsZFR5cGVzLCBzdXAsIGFsaWFzKTsKKyAgICAgICAgc3luY2hyb25pemVkIChfbWV0YXMpIHsKKyAgICAgICAgICAgIF9tZXRhcy5wdXQocGNDbGFzcywgbWV0YSk7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChfbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAoKFJlZ2lzdGVyQ2xhc3NMaXN0ZW5lcikgaS5uZXh0KCkpLnJlZ2lzdGVyKHBjQ2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgY2xhc3Mgb2JqZWN0cyBvZiB0aGUgcmVnaXN0ZXJlZAorICAgICAqIHBlcnNpc3RlbmNlLWNhcGFibGUgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UmVnaXN0ZXJlZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihfbWV0YXMua2V5U2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+Y2xzPC9jb2RlPiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChDbGFzcyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhcy5jb250YWluc0tleShjbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2sgdXAgdGhlIG1ldGFkYXRhIGZvciBhIDxjb2RlPlBlcnNpc3RlbmNlQ2FwYWJsZTwvY29kZT4gY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0YSBnZXRNZXRhKENsYXNzIHBjQ2xhc3MpIHsKKyAgICAgICAgTWV0YSByZXQgPSAoTWV0YSkgX21ldGFzLmdldChwY0NsYXNzKTsKKyAgICAgICAgaWYgKHJldCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibm8tbWV0YSIsIHBjQ2xhc3MpLgorICAgICAgICAgICAgICAgIGdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgZm9yIHBlcnNpc3RlbnQgY2xhc3MgcmVnaXN0cmF0aW9uIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBSZWdpc3RlckNsYXNzTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKENsYXNzIGNscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBtYW5hZ2UgbWV0YWRhdGEgcGVyIHBlcnNpc3RlbmNlLWNhcGFibGUgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0YSB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFBlcnNpc3RlbmNlQ2FwYWJsZSBwYzsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGZpZWxkTmFtZXM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBDbGFzc1tdIGZpZWxkVHlwZXM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBDbGFzcyBwY1N1cGVyOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGFsaWFzOworCisgICAgICAgIHB1YmxpYyBNZXRhKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgU3RyaW5nW10gZmllbGROYW1lcywKKyAgICAgICAgICAgIENsYXNzW10gZmllbGRUeXBlcywgQ2xhc3MgcGNTdXBlciwgU3RyaW5nIGFsaWFzKSB7CisgICAgICAgICAgICB0aGlzLnBjID0gcGM7CisgICAgICAgICAgICB0aGlzLmZpZWxkTmFtZXMgPSBmaWVsZE5hbWVzOworICAgICAgICAgICAgdGhpcy5maWVsZFR5cGVzID0gZmllbGRUeXBlczsKKyAgICAgICAgICAgIHRoaXMucGNTdXBlciA9IHBjU3VwZXI7CisJCQl0aGlzLmFsaWFzID0gYWxpYXM7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUGVyc2lzdGVuY2VDYXBhYmxlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUGVyc2lzdGVuY2VDYXBhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1YTY4MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9QZXJzaXN0ZW5jZUNhcGFibGUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgdGhhdCBwZXJzaXN0ZW50IGluc3RhbmNlcyB3aWxsIGltcGxlbWVudC4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlQ2FwYWJsZSB7CisgICAgLy8gRE8gTk9UIEFERCBBRERJVElPTkFMIERFUEVOREVOQ0lFUyBUTyBUSElTIENMQVNTCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUkVBRF9XUklURV9PSyA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExPQURfUkVRVUlSRUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRUFEX09LID0gLTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENIRUNLX1JFQUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNRURJQVRFX1JFQUQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDSEVDS19XUklURSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1FRElBVEVfV1JJVEUgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVJJQUxJWkFCTEUgPSAxNjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERFU0VSSUFMSVpFRCA9IG5ldyBPYmplY3QoKTsKKworICAgIGludCBwY0dldEVuaGFuY2VtZW50Q29udHJhY3RWZXJzaW9uKCk7CisKKyAgICBPYmplY3QgcGNHZXRHZW5lcmljQ29udGV4dCgpOworCisgICAgU3RhdGVNYW5hZ2VyIHBjR2V0U3RhdGVNYW5hZ2VyKCk7CisKKyAgICB2b2lkIHBjUmVwbGFjZVN0YXRlTWFuYWdlcihTdGF0ZU1hbmFnZXIgc20pOworCisgICAgdm9pZCBwY1Byb3ZpZGVGaWVsZChpbnQgZmllbGRJbmRleCk7CisKKyAgICB2b2lkIHBjUHJvdmlkZUZpZWxkcyhpbnRbXSBmaWVsZEluZGljZXMpOworCisgICAgdm9pZCBwY1JlcGxhY2VGaWVsZChpbnQgZmllbGRJbmRleCk7CisKKyAgICB2b2lkIHBjUmVwbGFjZUZpZWxkcyhpbnRbXSBmaWVsZEluZGV4KTsKKworICAgIHZvaWQgcGNDb3B5RmllbGRzKE9iamVjdCBmcm9tT2JqZWN0LCBpbnRbXSBmaWVsZHMpOworCisgICAgdm9pZCBwY0RpcnR5KFN0cmluZyBmaWVsZE5hbWUpOworCisgICAgT2JqZWN0IHBjRmV0Y2hPYmplY3RJZCgpOworCisgICAgT2JqZWN0IHBjR2V0VmVyc2lvbigpOworCisgICAgYm9vbGVhbiBwY0lzRGlydHkoKTsKKworICAgIGJvb2xlYW4gcGNJc1RyYW5zYWN0aW9uYWwoKTsKKworICAgIGJvb2xlYW4gcGNJc1BlcnNpc3RlbnQoKTsKKworICAgIGJvb2xlYW4gcGNJc05ldygpOworCisgICAgYm9vbGVhbiBwY0lzRGVsZXRlZCgpOworCisgICAgQm9vbGVhbiBwY0lzRGV0YWNoZWQoKTsgLy8gbnVsbCA9PSB1bmtub3duCisKKyAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGNOZXdJbnN0YW5jZShTdGF0ZU1hbmFnZXIgc20sIGJvb2xlYW4gY2xlYXIpOworCisgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjTmV3SW5zdGFuY2UoU3RhdGVNYW5hZ2VyIHNtLCBPYmplY3Qgb2JqLAorICAgICAgICBib29sZWFuIGNsZWFyKTsKKworICAgIE9iamVjdCBwY05ld09iamVjdElkSW5zdGFuY2UoKTsKKworICAgIE9iamVjdCBwY05ld09iamVjdElkSW5zdGFuY2UoT2JqZWN0IG9iaik7CisKKyAgICB2b2lkIHBjQ29weUtleUZpZWxkc1RvT2JqZWN0SWQoT2JqZWN0IG9iaik7CisKKyAgICB2b2lkIHBjQ29weUtleUZpZWxkc1RvT2JqZWN0SWQoRmllbGRTdXBwbGllciBzdXBwbGllciwgT2JqZWN0IG9iaik7CisKKyAgICB2b2lkIHBjQ29weUtleUZpZWxkc0Zyb21PYmplY3RJZChGaWVsZENvbnN1bWVyIGNvbnN1bWVyLCBPYmplY3Qgb2JqKTsKKworICAgIE9iamVjdCBwY0dldERldGFjaGVkU3RhdGUoKTsKKworICAgIHZvaWQgcGNTZXREZXRhY2hlZFN0YXRlKE9iamVjdCBzdGF0ZSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvUmVmbGVjdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL1JlZmxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRlNDUzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL1JlZmxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDU5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247IAoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247IAorCisvKioKKyAqIFJlZmxlY3Rpb24gdXRpbGl0aWVzIHVzZWQgdG8gc3VwcG9ydCBhbmQgYXVnbWVudCBlbmhhbmNlbWVudC4gIFVzZWQgYm90aAorICogYXQgZW5oYW5jZW1lbnQgdGltZSBhbmQgYXQgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChSZWZsZWN0aW9uLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZ2V0dGVyIG1ldGhvZCBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSwgb3B0aW9uYWxseQorICAgICAqIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpbmRHZXR0ZXIoQ2xhc3MgY2xzLCBTdHJpbmcgcHJvcCwgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgcHJvcCA9IFN0cmluZ1V0aWxzLmNhcGl0YWxpemUocHJvcCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gImdldCIgKyBwcm9wOworICAgICAgICBNZXRob2QgbTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRoaXMgYWxnb3JpdGhtIHNlYXJjaGVzIGZvciBhIGdldDxwcm9wPiBvciBpczxwcm9wPiBtZXRob2QgaW4KKyAgICAgICAgICAgIC8vIGEgYnJlYWR0aC1maXJzdCBtYW5uZXIuCisgICAgICAgICAgICBmb3IgKENsYXNzIGMgPSBjbHM7IGMgIT0gbnVsbCAmJiBjICE9IE9iamVjdC5jbGFzczsKKyAgICAgICAgICAgICAgICBjID0gYy5nZXRTdXBlcmNsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICBtID0gZ2V0RGVjbGFyZWRNZXRob2QoYywgbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtID0gZ2V0RGVjbGFyZWRNZXRob2QoYywgImlzIiArIHByb3AsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAobSAhPSBudWxsICYmIChtLmdldFJldHVyblR5cGUoKSA9PSBib29sZWFuLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtLmdldFJldHVyblR5cGUoKSA9PSBCb29sZWFuLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG11c3RFeGlzdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZ2V0dGVyIiwgY2xzLCBwcm9wKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0dGVyIG1ldGhvZCBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSwgb3B0aW9uYWxseQorICAgICAqIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiBub25lLiAgVGhlIHByb3BlcnR5IG11c3QgYWxzbyBoYXZlIGEgZ2V0dGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpbmRTZXR0ZXIoQ2xhc3MgY2xzLCBTdHJpbmcgcHJvcCwgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgTWV0aG9kIGdldHRlciA9IGZpbmRHZXR0ZXIoY2xzLCBwcm9wLCBtdXN0RXhpc3QpOworICAgICAgICByZXR1cm4gKGdldHRlciA9PSBudWxsKSA/IG51bGwgCisgICAgICAgICAgICA6IGZpbmRTZXR0ZXIoY2xzLCBwcm9wLCBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpLCBtdXN0RXhpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0dGVyIG1ldGhvZCBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSwgb3B0aW9uYWxseQorICAgICAqIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpbmRTZXR0ZXIoQ2xhc3MgY2xzLCBTdHJpbmcgcHJvcCwgQ2xhc3MgcGFyYW0sCisgICAgICAgIGJvb2xlYW4gbXVzdEV4aXN0KSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gInNldCIgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKHByb3ApOworICAgICAgICBNZXRob2QgbTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoQ2xhc3MgYyA9IGNsczsgYyAhPSBudWxsICYmIGMgIT0gT2JqZWN0LmNsYXNzOworICAgICAgICAgICAgICAgIGMgPSBjLmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICAgICAgIG0gPSBnZXREZWNsYXJlZE1ldGhvZChjLCBuYW1lLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtdXN0RXhpc3QpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXNldHRlciIsIGNscywgcHJvcCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIDxjb2RlPmNscy5nZXREZWNsYXJlZE1ldGhvZHMoKTwvY29kZT4sIGFuZCByZXR1cm5zIHRoZSBtZXRob2QKKyAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGFuZCA8Y29kZT5wYXJhbTwvY29kZT4gYXJndW1lbnRzLgorICAgICAqIEF2b2lkcyB0aGUgZXhjZXB0aW9uIHRocm93biBieSA8Y29kZT5DbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgpPC9jb2RlPgorICAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiA8Y29kZT5wYXJhbTwvY29kZT4gbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC45LjgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0RGVjbGFyZWRNZXRob2QoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgQ2xhc3MgcGFyYW0pIHsKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNscy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgIAkgICAgaWYgKG5hbWUuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIENsYXNzW10gbWV0aG9kUGFyYW1zID0gbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbSA9PSBudWxsICYmIG1ldGhvZFBhcmFtcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV07CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwgJiYgbWV0aG9kUGFyYW1zLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHBhcmFtLmVxdWFscyhtZXRob2RQYXJhbXNbMF0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvcHRpb25hbGx5IHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWVsZCBmaW5kRmllbGQoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpZWxkIGY7CisgICAgICAgICAgICBmb3IgKENsYXNzIGMgPSBjbHM7IGMgIT0gbnVsbCAmJiBjICE9IE9iamVjdC5jbGFzczsKKyAgICAgICAgICAgICAgICBjID0gYy5nZXRTdXBlcmNsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICBmID0gZ2V0RGVjbGFyZWRGaWVsZChjLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG11c3RFeGlzdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZmllbGQiLCBjbHMsIG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyA8Y29kZT5jbHMuZ2V0RGVjbGFyZWRGaWVsZHMoKTwvY29kZT4sIGFuZCByZXR1cm5zIHRoZSBmaWVsZAorICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgPGNvZGU+bmFtZTwvY29kZT4gYXJndW1lbnQuICBBdm9pZHMgdGhlIGV4Y2VwdGlvbgorICAgICAqIHRocm93biBieSA8Y29kZT5DbGFzcy5nZXREZWNsYXJlZEZpZWxkKCk8L2NvZGU+IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICAgICAqCisgICAgICogQHNpbmNlIDAuOS44CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIEZpZWxkW10gZmllbGRzID0gY2xzLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgIAkgICAgaWYgKG5hbWUuZXF1YWxzKGZpZWxkc1tpXS5nZXROYW1lKCkpKQorCQkgICAgICAgIHJldHVybiBmaWVsZHNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXQoT2JqZWN0IHRhcmdldCwgRmllbGQgZmllbGQpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXQodGFyZ2V0KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgZ2l2ZW4gbWVtYmVyIGFjY2Vzc2libGUgaWYgaXQgaXNuJ3QgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VBY2Nlc3NpYmxlKEFjY2Vzc2libGVPYmplY3QgYW8sIGludCBtb2RzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1vZHMpICYmICFhby5pc0FjY2Vzc2libGUoKSkKKyAgICAgICAgICAgICAgICBhby5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoInJlZmxlY3Qtc2VjdXJpdHkiLCBhbykpLgorICAgICAgICAgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcCB0aGUgZ2l2ZW4gcmVmbGVjdGlvbiBleGNlcHRpb24gYXMgYSBydW50aW1lIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHQgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHQpLmdldFRhcmdldEV4Y2VwdGlvbigpOyAgICAKKyAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuIChSdW50aW1lRXhjZXB0aW9uKSB0OworICAgICAgICByZXR1cm4gbmV3IEdlbmVyYWxFeGNlcHRpb24odCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihPYmplY3QgdGFyZ2V0LCBGaWVsZCBmaWVsZCkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRCb29sZWFuKHRhcmdldCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyB3cmFwUmVmbGVjdGlvbkV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlIGdldEJ5dGUoT2JqZWN0IHRhcmdldCwgRmllbGQgZmllbGQpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGJ5dGUpIDA7CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0Qnl0ZSh0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgd3JhcFJlZmxlY3Rpb25FeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2hhciBnZXRDaGFyKE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChjaGFyKSAwOworICAgICAgICBtYWtlQWNjZXNzaWJsZShmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldENoYXIodGFyZ2V0KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IHRhcmdldCwgRmllbGQgZmllbGQpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMEQ7CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0RG91YmxlKHRhcmdldCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyB3cmFwUmVmbGVjdGlvbkV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmbG9hdCBnZXRGbG9hdChPYmplY3QgdGFyZ2V0LCBGaWVsZCBmaWVsZCkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwRjsKKyAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRGbG9hdCh0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgd3JhcFJlZmxlY3Rpb25FeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEludChPYmplY3QgdGFyZ2V0LCBGaWVsZCBmaWVsZCkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBtYWtlQWNjZXNzaWJsZShmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldEludCh0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgd3JhcFJlZmxlY3Rpb25FeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nKE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDBMOworICAgICAgICBtYWtlQWNjZXNzaWJsZShmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldExvbmcodGFyZ2V0KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHNob3J0IGdldFNob3J0KE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgMDsKKyAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRTaG9ydCh0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgd3JhcFJlZmxlY3Rpb25FeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZ2V0dGVyIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGdldHRlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGdldHRlciwgZ2V0dGVyLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXR0ZXIuaW52b2tlKHRhcmdldCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIGdldHRlciBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgT2JqZWN0IG8gPSBnZXQodGFyZ2V0LCBnZXR0ZXIpOworICAgICAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyBmYWxzZSA6ICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIGdldHRlciBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBnZXRCeXRlKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgT2JqZWN0IG8gPSBnZXQodGFyZ2V0LCBnZXR0ZXIpOworICAgICAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyAoYnl0ZSkgMCA6ICgoTnVtYmVyKSBvKS5ieXRlVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZ2V0dGVyIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjaGFyIGdldENoYXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGdldHRlcikgeworICAgICAgICBPYmplY3QgbyA9IGdldCh0YXJnZXQsIGdldHRlcik7CisgICAgICAgIHJldHVybiAobyA9PSBudWxsKSA/IChjaGFyKSAwIDogKChDaGFyYWN0ZXIpIG8pLmNoYXJWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBnaXZlbiBnZXR0ZXIgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGdldHRlcikgeworICAgICAgICBPYmplY3QgbyA9IGdldCh0YXJnZXQsIGdldHRlcik7CisgICAgICAgIHJldHVybiAobyA9PSBudWxsKSA/IDBEIDogKChOdW1iZXIpIG8pLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIGdldHRlciBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RmxvYXQoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGdldHRlcikgeworICAgICAgICBPYmplY3QgbyA9IGdldCh0YXJnZXQsIGdldHRlcik7CisgICAgICAgIHJldHVybiAobyA9PSBudWxsKSA/IDBGIDogKChOdW1iZXIpIG8pLmZsb2F0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZ2V0dGVyIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgT2JqZWN0IG8gPSBnZXQodGFyZ2V0LCBnZXR0ZXIpOworICAgICAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogKChOdW1iZXIpIG8pLmludFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIGdldHRlciBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgT2JqZWN0IG8gPSBnZXQodGFyZ2V0LCBnZXR0ZXIpOworICAgICAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyAwTCA6ICgoTnVtYmVyKSBvKS5sb25nVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZ2V0dGVyIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzaG9ydCBnZXRTaG9ydChPYmplY3QgdGFyZ2V0LCBNZXRob2QgZ2V0dGVyKSB7CisgICAgICAgIE9iamVjdCBvID0gZ2V0KHRhcmdldCwgZ2V0dGVyKTsKKyAgICAgICAgcmV0dXJuIChvID09IG51bGwpID8gKHNob3J0KSAwIDogKChOdW1iZXIpIG8pLnNob3J0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoT2JqZWN0IHRhcmdldCwgRmllbGQgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpZWxkLnNldCh0YXJnZXQsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtYWtlQWNjZXNzaWJsZShmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmllbGQuc2V0Qm9vbGVhbih0YXJnZXQsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkLCBieXRlIHZhbHVlKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtYWtlQWNjZXNzaWJsZShmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmllbGQuc2V0Qnl0ZSh0YXJnZXQsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkLCBjaGFyIHZhbHVlKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtYWtlQWNjZXNzaWJsZShmaWVsZCwgZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmllbGQuc2V0Q2hhcih0YXJnZXQsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkLCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWVsZC5zZXREb3VibGUodGFyZ2V0LCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyB3cmFwUmVmbGVjdGlvbkV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0LCBGaWVsZCBmaWVsZCwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWVsZC5zZXRGbG9hdCh0YXJnZXQsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIEZpZWxkIGZpZWxkLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWVsZC5zZXRJbnQodGFyZ2V0LCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyB3cmFwUmVmbGVjdGlvbkV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0LCBGaWVsZCBmaWVsZCwgbG9uZyB2YWx1ZSkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpZWxkLnNldExvbmcodGFyZ2V0LCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyB3cmFwUmVmbGVjdGlvbkV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0LCBGaWVsZCBmaWVsZCwgc2hvcnQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWVsZC5zZXRTaG9ydCh0YXJnZXQsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBzZXR0ZXIsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgc2V0dGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1ha2VBY2Nlc3NpYmxlKHNldHRlciwgc2V0dGVyLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldHRlci5pbnZva2UodGFyZ2V0LCBuZXcgT2JqZWN0W10geyB2YWx1ZSB9KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBSZWZsZWN0aW9uRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBzZXR0ZXIsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgc2V0KHRhcmdldCwgc2V0dGVyLCAodmFsdWUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBzZXR0ZXIsIGJ5dGUgdmFsdWUpIHsKKyAgICAgICAgc2V0KHRhcmdldCwgc2V0dGVyLCBuZXcgQnl0ZSh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgZ2l2ZW4gc2V0dGVyIG9uIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0LCBNZXRob2Qgc2V0dGVyLCBjaGFyIHZhbHVlKSB7CisgICAgICAgIHNldCh0YXJnZXQsIHNldHRlciwgbmV3IENoYXJhY3Rlcih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgZ2l2ZW4gc2V0dGVyIG9uIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0LCBNZXRob2Qgc2V0dGVyLCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgc2V0KHRhcmdldCwgc2V0dGVyLCBuZXcgRG91YmxlKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBzZXR0ZXIsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHNldCh0YXJnZXQsIHNldHRlciwgbmV3IEZsb2F0KHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBzZXR0ZXIsIGludCB2YWx1ZSkgeworICAgICAgICBzZXQodGFyZ2V0LCBzZXR0ZXIsIG5ldyBJbnRlZ2VyKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBnaXZlbiBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KE9iamVjdCB0YXJnZXQsIE1ldGhvZCBzZXR0ZXIsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgc2V0KHRhcmdldCwgc2V0dGVyLCBuZXcgTG9uZyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgZ2l2ZW4gc2V0dGVyIG9uIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0LCBNZXRob2Qgc2V0dGVyLCBzaG9ydCB2YWx1ZSkgeworICAgICAgICBzZXQodGFyZ2V0LCBzZXR0ZXIsIG5ldyBTaG9ydCh2YWx1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9TdGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9TdGF0ZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU0NTFhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL1N0YXRlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKKworLyoqCisgKiBJbnRlcm5hbCBzdGF0ZSBtYW5hZ2VyIGZvciBtYW5hZ2VkIGluc3RhbmNlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBTdGF0ZU1hbmFnZXIgeworICAgIC8vIERPIE5PVCBBREQgQURESVRJT05BTCBERVBFTkRFTkNJRVMgVE8gVEhJUyBDTEFTUworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1VTRVIgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVF9SRU1PVEUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVF9BVFRBQ0ggPSAyOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVuY2UgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEdlbmVyaWNDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlLWNhcGFibGUgcHJpbWFyeSBrZXkgb2JqZWN0IGJ5IGV4dHJhY3RpbmcgdGhlIAorICAgICAqIGlkZW50aXR5IHZhbHVlIG9mIHRoZSByZWxhdGVkIGluc3RhbmNlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gZmllbGQgZnJvbSAKKyAgICAgKiB0aGUgZ2l2ZW4gb2JqZWN0IGlkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UENQcmltYXJ5S2V5KE9iamVjdCBvaWQsIGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2Ugc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhdGVNYW5hZ2VyIHJlcGxhY2VTdGF0ZU1hbmFnZXIoU3RhdGVNYW5hZ2VyIHNtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9wdGltaXN0aWMgdmVyc2lvbiBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZlcnNpb24oKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoaXMgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgaW5zdGFuY2UgaXMgdHJhbnNhY3Rpb25hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGluc3RhbmNlIGlzIHBlcnNpc3RlbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBpbnN0YW5jZSBpcyBuZXdseS1wZXJzaXN0ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ldygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgaW5zdGFuY2UgaXMgZGVsZXRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgaW5zdGFuY2UgaXMgZGV0YWNoZWQgKGkuZS4gdGhpcyBtYW5hZ2VyIGlzIGEgZGV0YWNoZWQKKyAgICAgKiBzdGF0ZSBtYW5hZ2VyKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQoKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgbmFtZWQgZmllbGQgZGlydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlydHkoU3RyaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IGlkLCBhc3NpZ25pbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3RJZCgpOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdG8gcHJlcGFyZSBpbnN0YW5jZSBmb3Igc2VyaWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSB0byBudWxsIGRldGFjaGVkIHN0YXRlIGFmdGVyIHNlcmlhbGl6ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlcmlhbGl6aW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBkZXRhY2hlZCBzdGF0ZSBvYmplY3QgYW5kIGRldGFjaGVkIHN0YXRlIG1hbmFnZXIgdG8gdGhlCisgICAgICogZ2l2ZW4gc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIG1hbmFnZWQgZmllbGRzIGFsc28gd3JpdHRlbiB0byBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZURldGFjaGVkKE9iamVjdE91dHB1dCBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByb3h5IHRoZSBnaXZlbiBkZXRhY2hlZCBmaWVsZCBhZnRlciBkZXNlcmlhbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJveHlEZXRhY2hlZERlc2VyaWFsaXplZChpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIEZpZWxkIGFjY2VzcyBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3NpbmdGaWVsZChpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIFNldHRpbmcgc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0Jvb2xlYW5GaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsCisgICAgICAgIGJvb2xlYW4gY3VyLCBib29sZWFuIG5leHQsIGludCBzZXQpOworCisgICAgLyoqCisgICAgICogU2V0dGluZyBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgY2hhciBjdXIsCisgICAgICAgIGNoYXIgbmV4dCwgaW50IHNldCk7CisKKyAgICAvKioKKyAgICAgKiBTZXR0aW5nIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBieXRlIGN1ciwKKyAgICAgICAgYnl0ZSBuZXh0LCBpbnQgc2V0KTsKKworICAgIC8qKgorICAgICAqIFNldHRpbmcgc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0dGluZ1Nob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBzaG9ydCBjdXIsCisgICAgICAgIHNob3J0IG5leHQsIGludCBzZXQpOworCisgICAgLyoqCisgICAgICogU2V0dGluZyBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBpbnQgY3VyLAorICAgICAgICBpbnQgbmV4dCwgaW50IHNldCk7CisKKyAgICAvKioKKyAgICAgKiBTZXR0aW5nIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBsb25nIGN1ciwKKyAgICAgICAgbG9uZyBuZXh0LCBpbnQgc2V0KTsKKworICAgIC8qKgorICAgICAqIFNldHRpbmcgc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0Zsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBmbG9hdCBjdXIsCisgICAgICAgIGZsb2F0IG5leHQsIGludCBzZXQpOworCisgICAgLyoqCisgICAgICogU2V0dGluZyBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nRG91YmxlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBkb3VibGUgY3VyLAorICAgICAgICBkb3VibGUgbmV4dCwgaW50IHNldCk7CisKKyAgICAvKioKKyAgICAgKiBTZXR0aW5nIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIFN0cmluZyBjdXIsCisgICAgICAgIFN0cmluZyBuZXh0LCBpbnQgc2V0KTsKKworICAgIC8qKgorICAgICAqIFNldHRpbmcgc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0dGluZ09iamVjdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgT2JqZWN0IGN1ciwKKyAgICAgICAgT2JqZWN0IG5leHQsIGludCBzZXQpOworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEJvb2xlYW5GaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsCisgICAgICAgIGJvb2xlYW4gY3VyKTsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRDaGFyRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBjaGFyIGN1cik7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgYnl0ZSBjdXIpOworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZFNob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBzaG9ydCBjdXIpOworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgaW50IGN1cik7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgbG9uZyBjdXIpOworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBmbG9hdCBjdXIpOworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZERvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgZG91YmxlIGN1cik7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LAorICAgICAgICBTdHJpbmcgY3VyKTsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRPYmplY3RGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsCisgICAgICAgIE9iamVjdCBjdXIpOworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCk7CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHN0YXRlIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBjaGFyIHJlcGxhY2VDaGFyRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIGJ5dGUgcmVwbGFjZUJ5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpOworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgcmVwbGFjZVNob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIGludCByZXBsYWNlSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIGxvbmcgcmVwbGFjZUxvbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpOworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBzdGF0ZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgcmVwbGFjZUZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSByZXBsYWNlRG91YmxlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KTsKKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugc3RhdGUgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZXBsYWNlU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KTsKKworCS8qKgorCSAqIFJlcGxhY2Ugc3RhdGUgY2FsbGJhY2suCisJICovCisgICAgcHVibGljIE9iamVjdCByZXBsYWNlT2JqZWN0RmllbGQgKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VuaGFuY2UvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU5YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDMwIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQSBFbmhhbmNlcjwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgYnl0ZWNvZGUgZW5oYW5jZXIgdXNlZCB0bworICAgIHBvc3QtcHJvY2VzcyBjbGFzc2VzIGZvciB1c2UgaW4gYSBPcGVuSlBBIHJ1bnRpbWUuCisgICAgQSB0b29sIGZvciBnZW5lcmF0aW5nIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzIHNvdXJjZWNvZGUgaXMgYWxzbworICAgIHByb3ZpZGVkLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9BYnN0cmFjdExpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0Fic3RyYWN0TGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZmNDUwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9BYnN0cmFjdExpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKKy8qKgorICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBMaWZlY3ljbGVMaXN0ZW5lcn0gaW50ZXJmYWNlCisgKiB3aGljaCBkZWxlZ2F0ZXMgZXZlbnRzIHRvIGEgc2luZ2xlIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlmZWN5Y2xlTGlzdGVuZXIKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBoYW5kbGUgdGhlIHNwZWNpZmljIGxpZmVjeWNsZSBldmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBldmVudE9jY3VycmVkKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJQZXJzaXN0KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNsZWFyKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ2xlYXIoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnRPY2N1cnJlZChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJMb2FkKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlbGV0ZShMaWZlY3ljbGVFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckRlbGV0ZShMaWZlY3ljbGVFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVTdG9yZShMaWZlY3ljbGVFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlclN0b3JlKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZURpcnR5KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyRGlydHkoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnRPY2N1cnJlZChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVmb3JlRGlydHlGbHVzaGVkKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyRGlydHlGbHVzaGVkKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQWJzdHJhY3RSZW1vdGVDb21taXRQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9BYnN0cmFjdFJlbW90ZUNvbW1pdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5OGU1NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQWJzdHJhY3RSZW1vdGVDb21taXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CisKKy8qKgorICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJlbW90ZUNvbW1pdFByb3ZpZGVyfS4gT2J0YWlucyBoYW5kbGVzCisgKiB0byB0aGUgZXZlbnQgbWFuYWdlciBhbmQgbG9nLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAc2luY2UgMC4yLjUuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW1vdGVDb21taXRQcm92aWRlcgorICAgIGltcGxlbWVudHMgUmVtb3RlQ29tbWl0UHJvdmlkZXIsIENvbmZpZ3VyYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBYnN0cmFjdFJlbW90ZUNvbW1pdFByb3ZpZGVyLmNsYXNzKTsKKworICAgIHByb3RlY3RlZCBSZW1vdGVDb21taXRFdmVudE1hbmFnZXIgZXZlbnRNYW5hZ2VyOworICAgIHByb3RlY3RlZCBMb2cgbG9nOworCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICB0aGlzLmxvZyA9IGNvbmZpZy5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcihSZW1vdGVDb21taXRFdmVudE1hbmFnZXIgbWdyKSB7CisgICAgICAgIGV2ZW50TWFuYWdlciA9IG1ncjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIGEgcmVtb3RlIGNvbW1pdCBldmVudCB2aWEgdGhlIGNhY2hlZCBldmVudCBtYW5hZ2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVFdmVudChSZW1vdGVDb21taXRFdmVudCBldmVudCkgeworICAgICAgICBFeGNlcHRpb25bXSBlcyA9IGV2ZW50TWFuYWdlci5maXJlRXZlbnQoZXZlbnQpOworICAgICAgICBpZiAoZXMubGVuZ3RoID4gMCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoInJlbW90ZS1saXN0ZW5lci1leCIsIEFycmF5cy5hc0xpc3QoZXMpKSk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGVzW2ldKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0Fic3RyYWN0VHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9BYnN0cmFjdFRyYW5zYWN0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmMzOThhZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQWJzdHJhY3RUcmFuc2FjdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKKy8qKgorICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBUcmFuc2FjdGlvbkxpc3RlbmVyfSBpbnRlcmZhY2UKKyAqIHRoYXQgcHJvdmlkZXMgbm8tb3AgaW1wbGVtZW50YXRpb25zIG9mIGFsbCBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJhbnNhY3Rpb25MaXN0ZW5lcgorICAgIGltcGxlbWVudHMgVHJhbnNhY3Rpb25MaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBDYXRjaC1hbGwgZm9yIHVuaGFuZGxlZCBldmVudHMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBhbGwgb3RoZXIKKyAgICAgKiBldmVudCBtZXRob2RzIGlmIHlvdSBkbyBub3Qgb3ZlcnJpZGUgdGhlbS4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXZlbnRPY2N1cnJlZChUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJCZWdpbihUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUZsdXNoKFRyYW5zYWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnRPY2N1cnJlZChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJGbHVzaChUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbW1pdChUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ29tbWl0KFRyYW5zYWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnRPY2N1cnJlZChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJSb2xsYmFjayhUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyU3RhdGVUcmFuc2l0aW9ucyhUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ29tbWl0Q29tcGxldGUoVHJhbnNhY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlclJvbGxiYWNrQ29tcGxldGUoVHJhbnNhY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0F0dGFjaExpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0F0dGFjaExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxMWJiMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQXR0YWNoTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworLyoqCisgKiBMaXN0ZW5lciBmb3Igd2hlbiBhIGRldGFjaGVkIGluc3RhbmNlIGlzIGF0dGFjaGVkLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXR0YWNoTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBiZWZvcmUgdGhlIGluc3RhbmNlIGlzIGF0dGFjaGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUF0dGFjaChMaWZlY3ljbGVFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckF0dGFjaChMaWZlY3ljbGVFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0JlYW5MaWZlY3ljbGVDYWxsYmFja3MuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQmVhbkxpZmVjeWNsZUNhbGxiYWNrcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTI3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0JlYW5MaWZlY3ljbGVDYWxsYmFja3MuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogUGVyZm9ybXMgYSBjYWxsYmFjayBtZXRob2Qgb24gYSBjYWNoZWQgYmVhbiBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICovCitwdWJsaWMgY2xhc3MgQmVhbkxpZmVjeWNsZUNhbGxiYWNrcworICAgIGV4dGVuZHMgTWV0aG9kTGlmZWN5Y2xlQ2FsbGJhY2tzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEJlYW5MaWZlY3ljbGVDYWxsYmFja3MuY2xhc3MpOworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IF9saXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBNYWtlIHRoZSBjYWxsYmFjayBvbiBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIEBhcmcgd2hldGhlciBhbm90aGVyIGFyZ3VuZW50IGlzIGV4cGVjdGVkIHN1Y2ggYXMgQWZ0ZXJEZXRhY2gKKyAgICAgKi8KKyAgICBwdWJsaWMgQmVhbkxpZmVjeWNsZUNhbGxiYWNrcyhDbGFzcyBjbHMsIFN0cmluZyBtZXRob2QsIGJvb2xlYW4gYXJnLAorICAgICAgICBDbGFzcyB0eXBlKSB7CisgICAgICAgIHRoaXMoY2xzLCBnZXRNZXRob2QoY2xzLCBtZXRob2QsIGFyZyA/IG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MsCisgICAgICAgICAgICB0eXBlIH0gOiBuZXcgQ2xhc3NbXXsgdHlwZSB9KSwgYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gTWFrZSB0aGUgY2FsbGJhY2sgb24gYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHVibGljIEJlYW5MaWZlY3ljbGVDYWxsYmFja3MoQ2xhc3MgY2xzLCBNZXRob2QgbWV0aG9kLCBib29sZWFuIGFyZykgeworICAgICAgICBzdXBlcihtZXRob2QsIGFyZyk7CisgICAgICAgIF9saXN0ZW5lciA9IG5ld0xpc3RlbmVyKGNscyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgT2JqZWN0IG5ld0xpc3RlbmVyKENsYXNzIGNscykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNscy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJlYW4tY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIGNscy5nZXROYW1lKCkpLCB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1ha2VDYWxsYmFjayhPYmplY3Qgb2JqLCBPYmplY3QgcmVsLCBpbnQgZXZlbnRUeXBlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2tNZXRob2QoKTsKKyAgICAgICAgaWYgKCFjYWxsYmFjay5pc0FjY2Vzc2libGUoKSkKKyAgICAgICAgICAgIGNhbGxiYWNrLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIGlmIChyZXF1aXJlc0FyZ3VtZW50KCkpCisgICAgICAgICAgICBjYWxsYmFjay5pbnZva2UoX2xpc3RlbmVyLCBuZXcgT2JqZWN0W117IG9iaiwgcmVsIH0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjYWxsYmFjay5pbnZva2UoX2xpc3RlbmVyLCBuZXcgT2JqZWN0W117IG9iaiB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnJlYWRFeHRlcm5hbChpbik7CisgICAgICAgIENsYXNzIGNscyA9IChDbGFzcykgaW4ucmVhZE9iamVjdCgpOworICAgICAgICBfbGlzdGVuZXIgPSBuZXdMaXN0ZW5lcihjbHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIud3JpdGVFeHRlcm5hbChvdXQpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoX2xpc3RlbmVyLmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQmVnaW5UcmFuc2FjdGlvbkxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0JlZ2luVHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0JlZ2luVHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIE5vdGlmaWVkIHdoZW4gdHJhbnNhY3Rpb25zIGJlZ2luLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMi41LjAKKyAqLworcHVibGljIGludGVyZmFjZSBCZWdpblRyYW5zYWN0aW9uTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSB0cmFuc2FjdGlvbiBoYXMgYmVndW4uCisgICAgICoKKyAgICAgKiBAc2VlIFRyYW5zYWN0aW9uRXZlbnQjQUZURVJfQkVHSU4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckJlZ2luKFRyYW5zYWN0aW9uRXZlbnQgZXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9DYWxsYmFja01vZGVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0NhbGxiYWNrTW9kZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzU3YjkyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9DYWxsYmFja01vZGVzLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKKy8qKgorICogQ2FsbGJhY2sgaGFuZGxpbmcgY29uc3RhbnRzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGludGVyZmFjZSBDYWxsYmFja01vZGVzIHsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gc3RvcCBleGVjdXRpbmcgY2FsbGJhY2tzIG9uIGV4Y2VwdGlvbiBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GQUlMX0ZBU1QgPSAyIDw8IDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGlnbm9yZSBleGNlcHRpb25zIG1hZGUgZHVyaW5nIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0lHTk9SRSA9IDIgPDwgMTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gbG9nIGV4Y2VwdGlvbnMgbWFkZSBkdXJpbmcgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfTE9HID0gMiA8PCAyOworCisgICAgLyoqCisgICAgICogRmxhZyB0byByZS10aHJvdyBleGNlcHRpb25zIG1hZGUgZHVyaW5nIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX1JFVEhST1cgPSAyIDw8IDM7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGFsd2F5cyByb2xsYmFjayBvbiBhIGNhbGxiYWNrIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19ST0xMQkFDSyA9IDIgPDwgNDsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQ2xlYXJMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9DbGVhckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMWE4MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvQ2xlYXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIExpc3RlbmVyIGZvciB3aGVuIHBlcnNpc3RlbnQgc3RhdGUgaXMgY2xlYXJlZCBmcm9tIGFuIGluc3RhbmNlLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIENsZWFyTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBiZWZvcmUgc3RhdGUgaXMgY2xlYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVDbGVhcihMaWZlY3ljbGVFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGFmdGVyIHN0YXRlIGlzIGNsZWFyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDbGVhcihMaWZlY3ljbGVFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0RlbGV0ZUxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0RlbGV0ZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkNjc2MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvRGVsZXRlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworLyoqCisgKiBMaXN0ZW5lciBmb3Igd2hlbiBhIHBlcnNpc3RlbnQgaW5zdGFuY2UgaXMgZGVsZXRlZC4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBEZWxldGVMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJlZm9yZSB0aGUgaW5zdGFuY2UgdHJhbnNmZXJyZWQgdG8gYSBkZWxldGVkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlbGV0ZShMaWZlY3ljbGVFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGFmdGVyIHRoZSBpbnN0YW5jZSB0cmFuc2ZlcnJlZCB0byBhIGRlbGV0ZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJEZWxldGUoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9EZXRhY2hMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9EZXRhY2hMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmIyNWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0RldGFjaExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKKy8qKgorICogTGlzdGVuZXIgZm9yIHdoZW4gYSBwZXJzaXN0ZW50IGluc3RhbmNlIGlzIGRldGFjaGVkLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGV0YWNoTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBiZWZvcmUgdGhlIGluc3RhbmNlIGlzIGRldGFjaGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZURldGFjaChMaWZlY3ljbGVFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBkZXRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckRldGFjaChMaWZlY3ljbGVFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0RpcnR5TGlzdGVuZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvRGlydHlMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDgwMDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0RpcnR5TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworLyoqCisgKiBMaXN0ZW5lciBmb3Igd2hlbiBhIHBlcnNpc3RlbnQgaW5zdGFuY2UgYmVjb21lcyBkaXJ0eS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBEaXJ0eUxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBmaXJzdCBjaGFuZ2UgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVEaXJ0eShMaWZlY3ljbGVFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGFmdGVyIHRoZSBmaXJzdCBjaGFuZ2UgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckRpcnR5KExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBmaXJzdCBjaGFuZ2UgaXMgYXBwbGllZCB0byBhIGZsdXNoZWQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVmb3JlRGlydHlGbHVzaGVkKExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYWZ0ZXIgdGhlIGZpcnN0IGNoYW5nZSBpcyBhcHBsaWVkIHRvIGEgZmx1c2hlZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckRpcnR5Rmx1c2hlZChMaWZlY3ljbGVFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0VuZFRyYW5zYWN0aW9uTGlzdGVuZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvRW5kVHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzJlZjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0VuZFRyYW5zYWN0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworLyoqCisgKiBOb3RpZmllZCB3aGVuIHRyYW5zYWN0aW9ucyBlbmQuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4yLjUuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIG5leHQgZmx1c2ggaXMgZm9yIHRoZSB0cmFuc2FjdGlvbiBjb21taXQuCisgICAgICoKKyAgICAgKiBAc2VlIFRyYW5zYWN0aW9uRXZlbnQjQkVGT1JFX0NPTU1JVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbW1pdChUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IGEgdHJhbnNhY3Rpb24gaGFzIHN1Y2Nlc3NmdWxseSBjb21taXR0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIFRyYW5zYWN0aW9uRXZlbnQjQUZURVJfQ09NTUlUCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXQoVHJhbnNhY3Rpb25FdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHJvbGxlZCBiYWNrLgorICAgICAqCisgICAgICogQHNlZSBUcmFuc2FjdGlvbkV2ZW50I0FGVEVSX1JPTExCQUNLCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJSb2xsYmFjayhUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IHN0YXRlIHRyYW5zaXRpb25zIGFyZSBjb21wbGV0ZS4KKyAgICAgKgorICAgICAqIEBzZWUgVHJhbnNhY3Rpb25FdmVudCNBRlRFUl9TVEFURV9UUkFOU0lUSU9OUworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyU3RhdGVUcmFuc2l0aW9ucyhUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IGEgdHJhbnNhY3Rpb24gaGFzIHN1Y2Nlc3NmdWxseSBjb21taXR0ZWQgYW5kCisgICAgICogdGhlIHRyYW5zYWN0aW9uIGlzIG5vIGxvbmdlciBhY3RpdmUuCisgICAgICoKKyAgICAgKiBAc2VlIFRyYW5zYWN0aW9uRXZlbnQjQUZURVJfQ09NTUlUX0NPTVBMRVRFCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXRDb21wbGV0ZShUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IGEgdHJhbnNhY3Rpb24gaGFzIGJlZW4gcm9sbGVkIGJhY2sgYW5kCisgICAgICogdGhlIHRyYW5zYWN0aW9uIGlzIG5vIGxvbmdlciBhY3RpdmUuCisgICAgICoKKyAgICAgKiBAc2VlIFRyYW5zYWN0aW9uRXZlbnQjQUZURVJfUk9MTEJBQ0tfQ09NUExFVEUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlclJvbGxiYWNrQ29tcGxldGUoVHJhbnNhY3Rpb25FdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0V4Y2VwdGlvbk9ycGhhbmVkS2V5QWN0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0V4Y2VwdGlvbk9ycGhhbmVkS2V5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NTZjOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvRXhjZXB0aW9uT3JwaGFuZWRLZXlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CisKKy8qKgorICogVGhyb3cgYSB7QGxpbmsgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb259IHdoZW4gYW4gb3JwaGFuZWQga2V5IGlzIGRpc2NvdmVyZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjMuMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25PcnBoYW5lZEtleUFjdGlvbgorICAgIGltcGxlbWVudHMgT3JwaGFuZWRLZXlBY3Rpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRXhjZXB0aW9uT3JwaGFuZWRLZXlBY3Rpb24uY2xhc3MpOworCisgICAgcHVibGljIE9iamVjdCBvcnBoYW4oT2JqZWN0IG9pZCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKF9sb2MuZ2V0KCJvcnBoYW5lZC1rZXkiLCBvaWQsIHZtZCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvRmx1c2hUcmFuc2FjdGlvbkxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0ZsdXNoVHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTcwMGUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0ZsdXNoVHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIE5vdGlmaWVkIG9uIHRyYW5zYWN0aW9uIGZsdXNoLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMi41LjAKKyAqLworcHVibGljIGludGVyZmFjZSBGbHVzaFRyYW5zYWN0aW9uTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBmbHVzaCBhbGwgb2JqZWN0IGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAc2VlIFRyYW5zYWN0aW9uRXZlbnQjQkVGT1JFX0ZMVVNICisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVmb3JlRmx1c2goVHJhbnNhY3Rpb25FdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhIHRyYW5zYWN0aW9uIGhhcyBmbHVzaGVkIGFsbCBvYmplY3QgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBzZWUgVHJhbnNhY3Rpb25FdmVudCNBRlRFUl9GTFVTSAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyRmx1c2goVHJhbnNhY3Rpb25FdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0pNU1JlbW90ZUNvbW1pdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0pNU1JlbW90ZUNvbW1pdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNDc3NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvSk1TUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZheC5qbXMuRXhjZXB0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguam1zLkpNU0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5qbXMuTWVzc2FnZTsKK2ltcG9ydCBqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyOworaW1wb3J0IGphdmF4Lmptcy5PYmplY3RNZXNzYWdlOworaW1wb3J0IGphdmF4Lmptcy5TZXNzaW9uOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpYzsKK2ltcG9ydCBqYXZheC5qbXMuVG9waWNDb25uZWN0aW9uOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpY0Nvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IGphdmF4Lmptcy5Ub3BpY1B1Ymxpc2hlcjsKK2ltcG9ydCBqYXZheC5qbXMuVG9waWNTZXNzaW9uOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpY1N1YnNjcmliZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5HZW5lcmljQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEpNUy1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUmVtb3RlQ29tbWl0UHJvdmlkZXJ9IHRoYXQKKyAqIGxpc3RlbnMgZm9yIG9iamVjdCBtb2RpZmljYXRpb25zIGFuZCBwcm9wYWdhdGVzIHRob3NlIGNoYW5nZXMgdG8KKyAqIG90aGVyIFJlbW90ZUNvbW1pdFByb3ZpZGVycyBvdmVyIGEgSk1TIHRvcGljLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAc2luY2UgMC4yLjUuMAorICovCitwdWJsaWMgY2xhc3MgSk1TUmVtb3RlQ29tbWl0UHJvdmlkZXIKKyAgICBleHRlbmRzIEFic3RyYWN0UmVtb3RlQ29tbWl0UHJvdmlkZXIKKyAgICBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZSwgR2VuZXJpY0NvbmZpZ3VyYWJsZSwgRXhjZXB0aW9uTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxpemVyIHNfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEpNU1JlbW90ZUNvbW1pdFByb3ZpZGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RyaW5nIF90b3BpY05hbWUgPSAidG9waWMvT3BlbkpQQUNvbW1pdFByb3ZpZGVyVG9waWMiOworICAgIHByaXZhdGUgU3RyaW5nIF90Y2ZOYW1lID0gImphdmE6L0Nvbm5lY3Rpb25GYWN0b3J5IjsKKyAgICBwcml2YXRlIFByb3BlcnRpZXMgX2N0eFByb3BzID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfcmVjb25uZWN0QXR0ZW1wdHMgPSAwOworICAgIHByaXZhdGUgVG9waWNDb25uZWN0aW9uIF9jb25uZWN0aW9uOworICAgIHByaXZhdGUgVG9waWNTZXNzaW9uIF9zZXNzaW9uOworICAgIHByaXZhdGUgVG9waWNQdWJsaXNoZXIgX3B1Ymxpc2hlcjsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEpNUyBUb3BpYyBuYW1lLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPnRvcGljL09wZW5KUEFDb21taXRQcm92aWRlclRvcGljPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3BpYyhTdHJpbmcgbmFtZSkgeworICAgICAgICBfdG9waWNOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBKTVMgVG9waWNDb25uZWN0aW9uRmFjdG9yeSBuYW1lLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPmphdmE6L0Nvbm5lY3Rpb25GYWN0b3J5PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIF90Y2ZOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGF0dGVtcHQgdG8gcmVjb25uZWN0IGFmdGVyIGEgSk1TIHNlbmQgZXhjZXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuIERlZmF1bHRzIHRvIDAsIG1lYW5pbmcgbm8gYXR0ZW1wdCB0byByZWNvbm5lY3QgaXMgbWFkZTsKKyAgICAgKiB0aGUgZXhjZXB0aW9uIGlzIGxvZ2dlZCBhbmQgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25SZWNvbm5lY3RBdHRlbXB0cyhpbnQgYXR0ZW1wdHMpIHsKKyAgICAgICAgX3JlY29ubmVjdEF0dGVtcHRzID0gYXR0ZW1wdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUge0BsaW5rIEluaXRpYWxDb250ZXh0fQorICAgICAqIGNvbnN0cnVjdG9yIGZvciBKTkRJIGxvb2t1cHMuIEltcGxlbWVudGF0aW9uIG9mCisgICAgICoge0BsaW5rIEdlbmVyaWNDb25maWd1cmFibGV9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludG8oT3B0aW9ucyBvcHRzKSB7CisgICAgICAgIGlmIChvcHRzICE9IG51bGwgJiYgIW9wdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBfY3R4UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgX2N0eFByb3BzLnB1dEFsbChvcHRzKTsKKyAgICAgICAgICAgIG9wdHMuY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfY3R4UHJvcHMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIENvbnRleHR9IG9iamVjdCBmb3IgdXNlIGJ5IHRoaXMgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRleHQgbmV3Q29udGV4dCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAoX2N0eFByb3BzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgIHJldHVybiBuZXcgSW5pdGlhbENvbnRleHQoX2N0eFByb3BzKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tIFJlbW90ZUNvbW1pdFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIGJyb2FkY2FzdChSZW1vdGVDb21taXRFdmVudCBldmVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3B1Ymxpc2hlci5wdWJsaXNoKGNyZWF0ZU1lc3NhZ2UoZXZlbnQpKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJqbXMtc2VudC11cGRhdGUiLCBfdG9waWNOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEpNU0V4Y2VwdGlvbiBqbXNlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihzX2xvYy5nZXQoImptcy1zZW5kLWVycm9yIiwgX3RvcGljTmFtZSksIGptc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX2Nvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9jb25uZWN0aW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNfbG9jLmdldCgiam1zLWNsb3NlLWxpc3RlbmVyIiwgX3RvcGljTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChKTVNFeGNlcHRpb24gam1zZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJqbXMtY2xvc2UtZXJyb3IiLCBfdG9waWNOYW1lKSwgam1zZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfY29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tIENvbmZpZ3VyYWJsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBwZXJmb3JtIGFjdGlvbnMgaW4KKyAgICAgKiB7QGxpbmsgQ29uZmlndXJhYmxlI2VuZENvbmZpZ3VyYXRpb259IG11c3QgaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHN1cGVyLmVuZENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29ubmVjdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25uZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjdHggPSBuZXdDb250ZXh0KCk7CisgICAgICAgICAgICBUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IHRjZiA9CisgICAgICAgICAgICAgICAgKFRvcGljQ29ubmVjdGlvbkZhY3RvcnkpIGN0eC5sb29rdXAoX3RjZk5hbWUpOworICAgICAgICAgICAgVG9waWMgdG9waWMgPSAoVG9waWMpIGN0eC5sb29rdXAoX3RvcGljTmFtZSk7CisgICAgICAgICAgICBjdHguY2xvc2UoKTsKKworICAgICAgICAgICAgX2Nvbm5lY3Rpb24gPSB0Y2YuY3JlYXRlVG9waWNDb25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIGZhbHNlID09IG5vdCB0cmFuc2FjdGVkLgorICAgICAgICAgICAgX3Nlc3Npb24gPSBfY29ubmVjdGlvbi5jcmVhdGVUb3BpY1Nlc3Npb24KKyAgICAgICAgICAgICAgICAoZmFsc2UsIFNlc3Npb24uQVVUT19BQ0tOT1dMRURHRSk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHB1Ymxpc2hlcgorICAgICAgICAgICAgX3B1Ymxpc2hlciA9IF9zZXNzaW9uLmNyZWF0ZVB1Ymxpc2hlcih0b3BpYyk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHN1YnNjcmliZXIuCisgICAgICAgICAgICBUb3BpY1N1YnNjcmliZXIgcyA9IF9zZXNzaW9uLmNyZWF0ZVN1YnNjcmliZXIodG9waWMsIG51bGwsCisgICAgICAgICAgICAgICAgLyogbm9Mb2NhbDogKi8gdHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1lc3NhZ2VMaXN0ZW5lciBsID0gZ2V0TWVzc2FnZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBzLnNldE1lc3NhZ2VMaXN0ZW5lcihsKTsKKyAgICAgICAgICAgIF9jb25uZWN0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICBfY29ubmVjdGlvbi5zZXRFeGNlcHRpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNfbG9jLmdldCgiam1zLXN0YXJ0LWxpc3RlbmVyIiwgX3RvcGljTmFtZSkpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKHNfbG9jLmdldCgiam1zLXByb3ZpZGVyLWNvbmZpZyIsCisgICAgICAgICAgICAgICAgX3RvcGljTmFtZSwgX3RjZk5hbWUpLCBlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICoKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXJ9IGNhcGFibGUgb2YKKyAgICAgKiB1bmRlcnN0YW5kaW5nIGFuZCBwcm9jZXNzaW5nIG1lc3NhZ2VzIGNyZWF0ZWQgYnkge0BsaW5rICNjcmVhdGVNZXNzYWdlfS4KKyAgICAgKiAgVGhlIGxpc3RlbmVyIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqIG5vdGlmeWluZyB0aGUgcHJvdmlkZXIgdGhhdCBhIHJlbW90ZSBldmVudCBoYXMgYmVlbiByZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVzc2FnZUxpc3RlbmVyIGdldE1lc3NhZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobSBpbnN0YW5jZW9mIE9iamVjdE1lc3NhZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJqbXMtcmVjZWl2ZS1lcnJvci0zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9waWNOYW1lLCBtLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBPYmplY3RNZXNzYWdlIG9tID0gKE9iamVjdE1lc3NhZ2UpIG07CisgICAgICAgICAgICAgICAgT2JqZWN0IG87CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbyA9IG9tLmdldE9iamVjdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpNU0V4Y2VwdGlvbiBqbXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJqbXMtcmVjZWl2ZS1lcnJvci0xIiksIGptc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZW1vdGVDb21taXRFdmVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJqbXMtcmVjZWl2ZWQtdXBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9waWNOYW1lKSk7CisKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlQ29tbWl0RXZlbnQgcmNlID0gKFJlbW90ZUNvbW1pdEV2ZW50KSBvOworICAgICAgICAgICAgICAgICAgICBmaXJlRXZlbnQocmNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNfbG9jLmdldCgiam1zLXJlY2VpdmUtZXJyb3ItMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5nZXRDbGFzcygpLmdldE5hbWUoKSwgX3RvcGljTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBNZXNzYWdlfSB0byBzZW5kIHRvIHRoZSB0b3BpYy4gVGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYW4ge0BsaW5rIE9iamVjdE1lc3NhZ2V9LgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoUmVtb3RlQ29tbWl0RXZlbnQgZXZlbnQpCisgICAgICAgIHRocm93cyBKTVNFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3Nlc3Npb24uY3JlYXRlT2JqZWN0TWVzc2FnZShldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25FeGNlcHRpb24oSk1TRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJqbXMtbGlzdGVuZXItZXJyb3IiLCBfdG9waWNOYW1lKSwgZXgpOworICAgICAgICBpZiAoX3JlY29ubmVjdEF0dGVtcHRzIDw9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFjb25uZWN0ZWQgJiYgaSA8IF9yZWNvbm5lY3RBdHRlbXB0czsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzX2xvYy5nZXQoImptcy1yZWNvbm5lY3QtYXR0ZW1wdCIsIF90b3BpY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihpICsgMSkpKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNfbG9jLmdldCgiam1zLXJlY29ubmVjdC1mYWlsIiwgX3RvcGljTmFtZSksIGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNvbm5lY3RlZCAmJiBsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5lcnJvcihzX2xvYy5nZXQoImptcy1jYW50LXJlY29ubmVjdCIsIF90b3BpY05hbWUsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoX3JlY29ubmVjdEF0dGVtcHRzKSkpOworICAgICAgICBlbHNlIGlmIChjb25uZWN0ZWQgJiYgbG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKHNfbG9jLmdldCgiam1zLXJlY29ubmVjdGVkIiwgX3RvcGljTmFtZSkpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlQ2FsbGJhY2tzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0xpZmVjeWNsZUNhbGxiYWNrcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWFlYmYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0xpZmVjeWNsZUNhbGxiYWNrcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBsaWZlY3ljbGUgbGlzdGVuZXIgdGhhdCByZXNwb25kcyB0byBjYWxsYmFja3MgcmF0aGVyIHRoYW4gZXZlbnRzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGlmZWN5Y2xlQ2FsbGJhY2tzCisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGluc3RhbmNlIGhhcyBhIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBldmVudCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0NhbGxiYWNrKE9iamVjdCBvYmosIGludCBldmVudFR5cGUpOworCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUgb24gdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1ha2VDYWxsYmFjayhPYmplY3Qgb2JqLCBPYmplY3QgcmVsYXRlZCwgaW50IGV2ZW50VHlwZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlRXZlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU1ZmMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9MaWZlY3ljbGVFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqCisgKiBMaWZlY3ljbGUgZXZlbnQgb24gYSBwZXJzaXN0ZW50IGluc3RhbmNlLiBUaGUgZXZlbnQgc291cmNlCisgKiBpcyB0aGUgcGVyc2lzdGVudCBpbnN0YW5jZSB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjMuMworICovCitwdWJsaWMgY2xhc3MgTGlmZWN5Y2xlRXZlbnQKKyAgICBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgYmVmb3JlIGFuIGluc3RhbmNlIGlzIG1hZGUgcGVyc2lzdGVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9QRVJTSVNUID0gMDsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBtYWRlIHBlcnNpc3RlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9QRVJTSVNUID0gMTsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBsb2FkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVJfTE9BRCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgc3RvcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9TVE9SRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgc3RvcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFGVEVSX1NUT1JFID0gNDsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBjbGVhcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9DTEVBUiA9IDU7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgY2xlYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9DTEVBUiA9IDY7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUZPUkVfREVMRVRFID0gNzsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBkZWxldGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFGVEVSX0RFTEVURSA9IDg7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgZGlydGllZCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVGT1JFX0RJUlRZID0gOTsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBkaXJ0aWVkIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9ESVJUWSA9IDEwOworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB3aGVuIGFuIGluc3RhbmNlIGlzIGRpcnRpZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIGZsdXNoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9ESVJUWV9GTFVTSEVEID0gMTE7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgZGlydGllZCBmb3IgdGhlIGZpcnN0IHRpbWUgYWZ0ZXIgZmx1c2guCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVJfRElSVFlfRkxVU0hFRCA9IDEyOworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB3aGVuIGFuIGluc3RhbmNlIGlzIGRldGFjaGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9ERVRBQ0ggPSAxMzsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBkZXRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9ERVRBQ0ggPSAxNDsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgd2hlbiBhbiBpbnN0YW5jZSBpcyBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUZPUkVfQVRUQUNIID0gMTU7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2UgaXMgYXR0YWNoZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVJfQVRUQUNIID0gMTY7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHdoZW4gYW4gaW5zdGFuY2VzIGlzIHJlZnJlc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9SRUZSRVNIID0gMTc7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBhcnJheSBvZiBhbGwgZXZlbnQgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfRVZFTlRTID0gbmV3IGludFtdeworICAgICAgICBCRUZPUkVfUEVSU0lTVCwKKyAgICAgICAgQUZURVJfUEVSU0lTVCwKKyAgICAgICAgQUZURVJfTE9BRCwKKyAgICAgICAgQkVGT1JFX1NUT1JFLAorICAgICAgICBBRlRFUl9TVE9SRSwKKyAgICAgICAgQkVGT1JFX0NMRUFSLAorICAgICAgICBBRlRFUl9DTEVBUiwKKyAgICAgICAgQkVGT1JFX0RFTEVURSwKKyAgICAgICAgQUZURVJfREVMRVRFLAorICAgICAgICBCRUZPUkVfRElSVFksCisgICAgICAgIEFGVEVSX0RJUlRZLAorICAgICAgICBCRUZPUkVfRElSVFlfRkxVU0hFRCwKKyAgICAgICAgQUZURVJfRElSVFlfRkxVU0hFRCwKKyAgICAgICAgQkVGT1JFX0RFVEFDSCwKKyAgICAgICAgQUZURVJfREVUQUNILAorICAgICAgICBCRUZPUkVfQVRUQUNILAorICAgICAgICBBRlRFUl9BVFRBQ0gsCisgICAgICAgIEFGVEVSX1JFRlJFU0gsCisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IF90eXBlOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IF9yZWxhdGVkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgdGhlIHBlcnNpc3RlbnQgaW5zdGFuY2UgdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50CisgICAgICogQHBhcmFtIHR5cGUgdGhlIGV2ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlRXZlbnQoT2JqZWN0IHBjLCBpbnQgdHlwZSkgeworICAgICAgICB0aGlzKHBjLCBudWxsLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYyB0aGUgcGVyc2lzdGVudCBpbnN0YW5jZSB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSByZWxhdGVkIHRoZSByZWxhdGVkIGluc3RhbmNlIHN1Y2ggYXMgdGhlIGRldGFjaGVkIGNvcHkuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV2ZW50KE9iamVjdCBwYywgT2JqZWN0IHJlbGF0ZWQsIGludCB0eXBlKSB7CisgICAgICAgIHN1cGVyKHBjKTsKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgICAgICBfcmVsYXRlZCA9IHJlbGF0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBldmVudCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF90eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVsYXRlZCBvYmplY3QuCisJICovCisJcHVibGljIE9iamVjdCBnZXRSZWxhdGVkICgpCisJeworCQlyZXR1cm4gX3JlbGF0ZWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9MaWZlY3ljbGVFdmVudE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzMTRlYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1OTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFEZWZhdWx0czsKKworLyoqCisgKiBNYW5hZ2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgYW5kIG5vdGlmeSBsaXN0ZW5lcnMgb24gbGlmZWN5Y2xlIGV2ZW50cy4KKyAqICBUaGlzIGNsYXNzIGlzIG9wdGltaXplZCBmb3IgZXZlbnQgZmlyaW5nIHJhdGhlciB0aGFuIGZvciBhZGRpbmcgYW5kCisgKiByZW1vdmluZyBsaXN0ZW5lcnMsIHdoaWNoIGFyZSBPKG4pIG9wZXJhdGlvbnMuIFRoaXMgY2xhc3MgYWxzbyBkb2VzIG5vdAorICogbWFpbnRhaW4gcGVyZmVjdCBzZXQgc2VtYW50aWNzIGZvciBsaXN0ZW5lcnM7IGl0IGlzIHBvc3NpYmxlIHRvIHdpbmQgdXAKKyAqIGhhdmluZyB0aGUgc2FtZSBsaXN0ZW5lciBpbnZva2VkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNpbmdsZSBldmVudCBpZiBpdAorICogaXMgYWRkZWQgdG8gdGhpcyBtYW5hZ2VyIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGNsYXNzZXMsIG9yIHdpdGgKKyAqIGEgYmFzZSBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMy4zCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVFdmVudE1hbmFnZXIKKyAgICBpbXBsZW1lbnRzIENhbGxiYWNrTW9kZXMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhjZXB0aW9uW10gRU1QVFlfRVhDRVBUSU9OUyA9IG5ldyBFeGNlcHRpb25bMF07CisKKyAgICBwcml2YXRlIE1hcCBfY2xhc3NMaXN0ZW5lcnMgPSBudWxsOyAvLyBjbGFzcyAtPiBsaXN0ZW5lciBsaXN0CisgICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgX2xpc3RlbmVycyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaXN0IF9hZGRMaXN0ZW5lcnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIHByaXZhdGUgTGlzdCBfcmVtTGlzdGVuZXJzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBwcml2YXRlIExpc3QgX2V4Y2VwcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIF9maXJpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZhaWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZhaWxGYXN0ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZhaWwgYWZ0ZXIgZmlyc3QgZXhjZXB0aW9uIHdoZW4gZmlyaW5nIGV2ZW50cyB0byBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsRmFzdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsRmFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZhaWwgYWZ0ZXIgZmlyc3QgZXhjZXB0aW9uIHdoZW4gZmlyaW5nIGV2ZW50cyB0byBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbEZhc3QoYm9vbGVhbiBmYWlsRmFzdCkgeworICAgICAgICBfZmFpbEZhc3QgPSBmYWlsRmFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGxpZmVjeWNsZSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGNsYXNzZXMuIElmIHRoZSBjbGFzc2VzCisgICAgICogYXJyYXkgaXMgbnVsbCwgcmVnaXN0ZXIgZm9yIGFsbCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIsIENsYXNzW10gY2xhc3NlcykgeworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGNsYXNzZXMgIT0gbnVsbCAmJiBjbGFzc2VzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoX2ZpcmluZykgeworICAgICAgICAgICAgX2FkZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICAgICAgX2FkZExpc3RlbmVycy5hZGQoY2xhc3Nlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xhc3NlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX2xpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9saXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KDUpOworICAgICAgICAgICAgX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9jbGFzc0xpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgX2NsYXNzTGlzdGVuZXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgTGlzdGVuZXJMaXN0IGxpc3RlbmVyczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSAoTGlzdGVuZXJMaXN0KSBfY2xhc3NMaXN0ZW5lcnMuZ2V0KGNsYXNzZXNbaV0pOworICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgzKTsKKyAgICAgICAgICAgICAgICBfY2xhc3NMaXN0ZW5lcnMucHV0KGNsYXNzZXNbaV0sIGxpc3RlbmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBpZiAoX2ZpcmluZykgeworICAgICAgICAgICAgX3JlbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9saXN0ZW5lcnMgIT0gbnVsbCAmJiBfbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChfY2xhc3NMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgTGlzdGVuZXJMaXN0IGxpc3RlbmVyczsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2NsYXNzTGlzdGVuZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSAoTGlzdGVuZXJMaXN0KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGxpc3RlbmVycyBvciBjYWxsYmFja3MgZm9yIHRoZSBnaXZlbiBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGVyc2lzdExpc3RlbmVycyhPYmplY3Qgc291cmNlLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9QRVJTSVNUKQorICAgICAgICAgICAgfHwgaGFzQ2FsbGJhY2tzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfUEVSU0lTVCkKKyAgICAgICAgICAgIHx8IGhhc0xpc3RlbmVycyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkFGVEVSX1BFUlNJU1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBsaXN0ZW5lcnMgb3IgY2FsbGJhY2tzIGZvciB0aGUgZ2l2ZW4gc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0RlbGV0ZUxpc3RlbmVycyhPYmplY3Qgc291cmNlLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ERUxFVEUpCisgICAgICAgICAgICB8fCBoYXNDYWxsYmFja3Moc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9ERUxFVEUpCisgICAgICAgICAgICB8fCBoYXNMaXN0ZW5lcnMoc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9ERUxFVEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBsaXN0ZW5lcnMgb3IgY2FsbGJhY2tzIGZvciB0aGUgZ2l2ZW4gc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0NsZWFyTGlzdGVuZXJzKE9iamVjdCBzb3VyY2UsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gaGFzQ2FsbGJhY2tzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0NMRUFSKQorICAgICAgICAgICAgfHwgaGFzQ2FsbGJhY2tzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfQ0xFQVIpCisgICAgICAgICAgICB8fCBoYXNMaXN0ZW5lcnMoc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9DTEVBUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGxpc3RlbmVycyBvciBjYWxsYmFja3MgZm9yIHRoZSBnaXZlbiBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTG9hZExpc3RlbmVycyhPYmplY3Qgc291cmNlLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkFGVEVSX0xPQUQpCisgICAgICAgICAgICB8fCBoYXNMaXN0ZW5lcnMoc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9MT0FEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbGlzdGVuZXJzIG9yIGNhbGxiYWNrcyBmb3IgdGhlIGdpdmVuIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdG9yZUxpc3RlbmVycyhPYmplY3Qgc291cmNlLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9TVE9SRSkKKyAgICAgICAgICAgIHx8IGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkFGVEVSX1NUT1JFKQorICAgICAgICAgICAgfHwgaGFzTGlzdGVuZXJzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfU1RPUkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBsaXN0ZW5lcnMgb3IgY2FsbGJhY2tzIGZvciB0aGUgZ2l2ZW4gc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0RpcnR5TGlzdGVuZXJzKE9iamVjdCBzb3VyY2UsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gaGFzQ2FsbGJhY2tzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RJUlRZKQorICAgICAgICAgICAgfHwgaGFzQ2FsbGJhY2tzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfRElSVFkpCisgICAgICAgICAgICB8fCBoYXNDYWxsYmFja3Moc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5CRUZPUkVfRElSVFlfRkxVU0hFRCkKKyAgICAgICAgICAgIHx8IGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RJUlRZX0ZMVVNIRUQpCisgICAgICAgICAgICB8fCBoYXNMaXN0ZW5lcnMoc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9ESVJUWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGxpc3RlbmVycyBvciBjYWxsYmFja3MgZm9yIHRoZSBnaXZlbiBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGV0YWNoTGlzdGVuZXJzKE9iamVjdCBzb3VyY2UsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gaGFzQ2FsbGJhY2tzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RFVEFDSCkKKyAgICAgICAgICAgIHx8IGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RFVEFDSCkKKyAgICAgICAgICAgIHx8IGhhc0xpc3RlbmVycyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ERVRBQ0gpCisgICAgICAgICAgICB8fCBoYXNMaXN0ZW5lcnMoc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9ERVRBQ0gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBsaXN0ZW5lcnMgb3IgY2FsbGJhY2tzIGZvciB0aGUgZ2l2ZW4gc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0F0dGFjaExpc3RlbmVycyhPYmplY3Qgc291cmNlLCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NhbGxiYWNrcyhzb3VyY2UsIG1ldGEsIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9BVFRBQ0gpCisgICAgICAgICAgICB8fCBoYXNDYWxsYmFja3Moc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5BRlRFUl9BVFRBQ0gpCisgICAgICAgICAgICB8fCBoYXNMaXN0ZW5lcnMoc291cmNlLCBtZXRhLCBMaWZlY3ljbGVFdmVudC5CRUZPUkVfQVRUQUNIKQorICAgICAgICAgICAgfHwgaGFzTGlzdGVuZXJzKHNvdXJjZSwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfQVRUQUNIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgY2FsbGJhY2tzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZAorICAgICAqIGV2ZW50IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0NhbGxiYWNrcyhPYmplY3Qgc291cmNlLCBDbGFzc01ldGFEYXRhIG1ldGEsIGludCB0eXBlKSB7CisgICAgICAgIExpZmVjeWNsZUNhbGxiYWNrc1tdIGNhbGxiYWNrcyA9IG1ldGEuZ2V0TGlmZWN5Y2xlTWV0YURhdGEoKS4KKyAgICAgICAgICAgIGdldENhbGxiYWNrcyh0eXBlKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoY2FsbGJhY2tzW2ldLmhhc0NhbGxiYWNrKHNvdXJjZSwgdHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZAorICAgICAqIGV2ZW50IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoT2JqZWN0IHNvdXJjZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhLCBpbnQgdHlwZSkgeworICAgICAgICBpZiAobWV0YS5nZXRMaWZlY3ljbGVNZXRhRGF0YSgpLmdldElnbm9yZVN5c3RlbUxpc3RlbmVycygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZmlyZUV2ZW50KG51bGwsIHNvdXJjZSwgbnVsbCwgdHlwZSwgX2xpc3RlbmVycywgdHJ1ZSwgbnVsbCkgCisgICAgICAgICAgICA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgTGlzdGVuZXJMaXN0IHN5c3RlbSA9IG1ldGEuZ2V0UmVwb3NpdG9yeSgpLmdldFN5c3RlbUxpc3RlbmVycygpOworICAgICAgICBpZiAoIXN5c3RlbS5pc0VtcHR5KCkgJiYgZmlyZUV2ZW50KG51bGwsIHNvdXJjZSwgbnVsbCwgdHlwZSwgc3lzdGVtLAorICAgICAgICAgICAgdHJ1ZSwgbnVsbCkgPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChfY2xhc3NMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IHNvdXJjZSA9PSBudWxsID8gbWV0YS5nZXREZXNjcmliZWRUeXBlKCkgOgorICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRDbGFzcygpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChmaXJlRXZlbnQobnVsbCwgc291cmNlLCBudWxsLCB0eXBlLCAoTGlzdGVuZXJMaXN0KQorICAgICAgICAgICAgICAgICAgICBfY2xhc3NMaXN0ZW5lcnMuZ2V0KGMpLCB0cnVlLCBudWxsKSA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGMgPSBjLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGMgIT0gbnVsbCAmJiBjICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmUgbGlmZWN5Y2xlIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyB3aXRob3V0IGFuIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb25bXSBmaXJlRXZlbnQoT2JqZWN0IHNvdXJjZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhLCBpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gZmlyZUV2ZW50KHNvdXJjZSwgbnVsbCwgbWV0YSwgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZSBsaWZlY3ljbGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRXhjZXB0aW9uW10gZmlyZUV2ZW50KE9iamVjdCBzb3VyY2UsIE9iamVjdCByZWxhdGVkLAorICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEsIGludCB0eXBlKSB7CisgICAgICAgIGJvb2xlYW4gcmVlbnRyYW50ID0gX2ZpcmluZzsKKyAgICAgICAgX2ZpcmluZyA9IHRydWU7CisgICAgICAgIExpc3QgZXhjZXB0aW9ucyA9IChyZWVudHJhbnQpID8gbmV3IExpbmtlZExpc3QoKSA6IF9leGNlcHM7CisgICAgICAgIE1ldGFEYXRhRGVmYXVsdHMgZGVmID0gbWV0YS5nZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGFGYWN0b3J5KCkuCisgICAgICAgICAgICBnZXREZWZhdWx0cygpOworCisgICAgICAgIGJvb2xlYW4gY2FsbGJhY2tzID0gZGVmLmdldENhbGxiYWNrc0JlZm9yZUxpc3RlbmVycyh0eXBlKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrcykKKyAgICAgICAgICAgIG1ha2VDYWxsYmFja3Moc291cmNlLCByZWxhdGVkLCBtZXRhLCB0eXBlLCBleGNlcHRpb25zKTsKKworICAgICAgICBMaWZlY3ljbGVFdmVudCBldiA9IChMaWZlY3ljbGVFdmVudCkgZmlyZUV2ZW50KG51bGwsIHNvdXJjZSwgcmVsYXRlZCwKKyAgICAgICAgICAgIHR5cGUsIF9saXN0ZW5lcnMsIGZhbHNlLCBleGNlcHRpb25zKTsKKworICAgICAgICBpZiAoX2NsYXNzTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzIGMgPSBzb3VyY2UgPT0gbnVsbCA/IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpIDoKKyAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBldiA9IChMaWZlY3ljbGVFdmVudCkgZmlyZUV2ZW50KGV2LCBzb3VyY2UsIHJlbGF0ZWQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIChMaXN0ZW5lckxpc3QpIF9jbGFzc0xpc3RlbmVycy5nZXQoYyksIGZhbHNlLCBleGNlcHRpb25zKTsKKyAgICAgICAgICAgICAgICBjID0gYy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICB9IHdoaWxlIChjICE9IG51bGwgJiYgYyAhPSBPYmplY3QuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzeXN0ZW0gbGlzdGVuZXJzCisgICAgICAgIGlmICghbWV0YS5nZXRMaWZlY3ljbGVNZXRhRGF0YSgpLmdldElnbm9yZVN5c3RlbUxpc3RlbmVycygpKSB7CisgICAgICAgICAgICBMaXN0ZW5lckxpc3Qgc3lzdGVtID0gbWV0YS5nZXRSZXBvc2l0b3J5KCkuZ2V0U3lzdGVtTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBmaXJlRXZlbnQoZXYsIHNvdXJjZSwgcmVsYXRlZCwgdHlwZSwgc3lzdGVtLCBmYWxzZSwgZXhjZXB0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNhbGxiYWNrcykKKyAgICAgICAgICAgIG1ha2VDYWxsYmFja3Moc291cmNlLCByZWxhdGVkLCBtZXRhLCB0eXBlLCBleGNlcHRpb25zKTsKKworICAgICAgICAvLyBjcmVhdGUgcmV0dXJuIGFycmF5IGJlZm9yZSBjbGVhcmluZyBleGNlcHRpb25zCisgICAgICAgIEV4Y2VwdGlvbltdIHJldDsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0ID0gRU1QVFlfRVhDRVBUSU9OUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gKEV4Y2VwdGlvbltdKSBleGNlcHRpb25zLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IEV4Y2VwdGlvbltleGNlcHRpb25zLnNpemUoKV0pOworCisgICAgICAgIC8vIGlmIHRoaXMgd2Fzbid0IGEgcmVlbnRyYW50IGNhbGwsIGNhdGNoIHVwIHdpdGggY2FsbHMgdG8gYWRkCisgICAgICAgIC8vIGFuZCByZW1vdmUgbGlzdGVuZXJzIG1hZGUgd2hpbGUgZmlyaW5nCisgICAgICAgIGlmICghcmVlbnRyYW50KSB7CisgICAgICAgICAgICBfZmlyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBfZmFpbCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFfYWRkTGlzdGVuZXJzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9hZGRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGl0ci5uZXh0KCksIChDbGFzc1tdKSBpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIGlmICghX3JlbUxpc3RlbmVycy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfcmVtTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIF9hZGRMaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIF9yZW1MaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIF9leGNlcHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgY2FsbGJhY2tzLCByZWNvcmRpbmcgYW55IGV4Y2VwdGlvbnMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VDYWxsYmFja3MoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHJlbGF0ZWQsCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSwgaW50IHR5cGUsIENvbGxlY3Rpb24gZXhjZXB0aW9ucykgeworICAgICAgICAvLyBtYWtlIGxpZmVjeWNsZSBjYWxsYmFja3MKKyAgICAgICAgTGlmZWN5Y2xlQ2FsbGJhY2tzW10gY2FsbGJhY2tzID0gbWV0YS5nZXRMaWZlY3ljbGVNZXRhRGF0YSgpLgorICAgICAgICAgICAgZ2V0Q2FsbGJhY2tzKHR5cGUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgIV9mYWlsICYmIGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2ldLm1ha2VDYWxsYmFjayhzb3VyY2UsIHJlbGF0ZWQsIHR5cGUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zLmFkZChlKTsKKyAgICAgICAgICAgICAgICBpZiAoX2ZhaWxGYXN0KQorICAgICAgICAgICAgICAgICAgICBfZmFpbCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIHNvdXJjZSBhbmQgdHlwZSB0byB0aGUgZ2l2ZW4gbGlzdCBvZgorICAgICAqIGxpc3RlbmVycy4gVGhlIGV2ZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiBjb25zdHJ1Y3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBmaXJlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgZXYsIE9iamVjdCBzb3VyY2UsIE9iamVjdCByZWwsCisgICAgICAgIGludCB0eXBlLCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzLCBib29sZWFuIG1vY2ssIExpc3QgZXhjZXB0aW9ucykgeworICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwgfHwgIWxpc3RlbmVycy5oYXNMaXN0ZW5lcnModHlwZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBPYmplY3QgbGlzdGVuZXI7CisgICAgICAgIGJvb2xlYW4gcmVzcG9uZHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsgIV9mYWlsICYmIGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDEpCisgICAgICAgICAgICAgICAgcmVzcG9uZHMgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBMaXN0ZW5lckFkYXB0ZXIpIHsKKyAgICAgICAgICAgICAgICByZXNwb25kcyA9ICgoTGlzdGVuZXJBZGFwdGVyKSBsaXN0ZW5lcikucmVzcG9uZHNUbyh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmRzKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJlc3BvbmRzID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkFGVEVSX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbmRzIHx8IGxpc3RlbmVyIGluc3RhbmNlb2YgQ2xlYXJMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2NrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldiA9IG5ldyBMaWZlY3ljbGVFdmVudChzb3VyY2UsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9DTEVBUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDbGVhckxpc3RlbmVyKSBsaXN0ZW5lcikuYmVmb3JlQ2xlYXIoZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDbGVhckxpc3RlbmVyKSBsaXN0ZW5lcikuYWZ0ZXJDbGVhcihldik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaWZlY3ljbGVFdmVudC5CRUZPUkVfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaWZlY3ljbGVFdmVudC5BRlRFUl9QRVJTSVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbmRzIHx8IGxpc3RlbmVyIGluc3RhbmNlb2YgUGVyc2lzdExpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gbmV3IExpZmVjeWNsZUV2ZW50KHNvdXJjZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX1BFUlNJU1QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUGVyc2lzdExpc3RlbmVyKSBsaXN0ZW5lcikuYmVmb3JlUGVyc2lzdChldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBlcnNpc3RMaXN0ZW5lcikgbGlzdGVuZXIpLmFmdGVyUGVyc2lzdChldik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaWZlY3ljbGVFdmVudC5CRUZPUkVfREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RFTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25kcyB8fCBsaXN0ZW5lciBpbnN0YW5jZW9mIERlbGV0ZUxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gbmV3IExpZmVjeWNsZUV2ZW50KHNvdXJjZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RFTEVURSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEZWxldGVMaXN0ZW5lcikgbGlzdGVuZXIpLmJlZm9yZURlbGV0ZShldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERlbGV0ZUxpc3RlbmVyKSBsaXN0ZW5lcikuYWZ0ZXJEZWxldGUoZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RJUlRZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RJUlRZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ESVJUWV9GTFVTSEVEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RJUlRZX0ZMVVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uZHMgfHwgbGlzdGVuZXIgaW5zdGFuY2VvZiBEaXJ0eUxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gbmV3IExpZmVjeWNsZUV2ZW50KHNvdXJjZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RJUlRZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEaXJ0eUxpc3RlbmVyKSBsaXN0ZW5lcikuYmVmb3JlRGlydHkoZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQUZURVJfRElSVFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERpcnR5TGlzdGVuZXIpIGxpc3RlbmVyKS5hZnRlckRpcnR5KGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ESVJUWV9GTFVTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEaXJ0eUxpc3RlbmVyKSBsaXN0ZW5lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmVmb3JlRGlydHlGbHVzaGVkKGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RJUlRZX0ZMVVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERpcnR5TGlzdGVuZXIpIGxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZnRlckRpcnR5Rmx1c2hlZChldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaWZlY3ljbGVFdmVudC5BRlRFUl9MT0FEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkFGVEVSX1JFRlJFU0g6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uZHMgfHwgbGlzdGVuZXIgaW5zdGFuY2VvZiBMb2FkTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9jaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYgPSBuZXcgTGlmZWN5Y2xlRXZlbnQoc291cmNlLCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBMaWZlY3ljbGVFdmVudC5BRlRFUl9MT0FEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExvYWRMaXN0ZW5lcikgbGlzdGVuZXIpLmFmdGVyTG9hZChldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExvYWRMaXN0ZW5lcikgbGlzdGVuZXIpLmFmdGVyUmVmcmVzaChldik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMaWZlY3ljbGVFdmVudC5CRUZPUkVfU1RPUkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQUZURVJfU1RPUkU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uZHMgfHwgbGlzdGVuZXIgaW5zdGFuY2VvZiBTdG9yZUxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gbmV3IExpZmVjeWNsZUV2ZW50KHNvdXJjZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX1NUT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0b3JlTGlzdGVuZXIpIGxpc3RlbmVyKS5iZWZvcmVTdG9yZShldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0b3JlTGlzdGVuZXIpIGxpc3RlbmVyKS5hZnRlclN0b3JlKGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ERVRBQ0g6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQUZURVJfREVUQUNIOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbmRzIHx8IGxpc3RlbmVyIGluc3RhbmNlb2YgRGV0YWNoTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9jaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYgPSBuZXcgTGlmZWN5Y2xlRXZlbnQoc291cmNlLCByZWwsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ERVRBQ0gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRGV0YWNoTGlzdGVuZXIpIGxpc3RlbmVyKS5iZWZvcmVEZXRhY2goZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEZXRhY2hMaXN0ZW5lcikgbGlzdGVuZXIpLmFmdGVyRGV0YWNoKGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExpZmVjeWNsZUV2ZW50LkJFRk9SRV9BVFRBQ0g6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlRXZlbnQuQUZURVJfQVRUQUNIOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbmRzIHx8IGxpc3RlbmVyIGluc3RhbmNlb2YgQXR0YWNoTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9jaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYgPSBuZXcgTGlmZWN5Y2xlRXZlbnQoc291cmNlLCByZWwsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9BVFRBQ0gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXR0YWNoTGlzdGVuZXIpIGxpc3RlbmVyKS5iZWZvcmVBdHRhY2goZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBdHRhY2hMaXN0ZW5lcikgbGlzdGVuZXIpLmFmdGVyQXR0YWNoKGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKGUpOworICAgICAgICAgICAgICAgIGlmIChfZmFpbEZhc3QpCisgICAgICAgICAgICAgICAgICAgIF9mYWlsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXY7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRoYXQgZmFjYWRlcyB0byBvdGhlciBsaWZlY3ljbGUgbGlzdGVuZXIgaW50ZXJmYWNlcyBjYW4KKyAgICAgKiBpbXBsZW1lbnQgdG8gY2hvb3NlIHdoaWNoIGV2ZW50cyB0byByZXNwb25kIHRvIGJhc2VkIG9uIHRoZWlyIGRlbGVnYXRlLgorICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiByZWdpc3RlcmluZyBhcyBhIGxpc3RlbmVyIGZvciBhbGwgZXZlbnRzCisgICAgICogYnV0IG9ubHkgcmVzcG9uZGluZyB0byBzb21lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExpc3RlbmVyQWRhcHRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgcmVzcG9uZHMgdG8gdGhlIGdpdmVuIGV2ZW50IHR5cGUgZnJvbQorICAgICAgICAgKiB7QGxpbmsgTGlmZWN5Y2xlRXZlbnR9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVzcG9uZHNUbyhpbnQgZXZlbnRUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRlbmRlZCBsaXN0IHRoYXQgdHJhY2tzIHdoYXQgZXZlbnQgdHlwZXMgaXRzIGVsZW1lbnRzIGNhcmUgYWJvdXQuCisgICAgICogTWFpbnRhaW5zIHNldCBzZW1hbnRpY3MgYXMgd2VsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RlbmVyTGlzdAorICAgICAgICBleHRlbmRzIEFycmF5TGlzdCB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3R5cGVzID0gMDsKKworICAgICAgICBwdWJsaWMgTGlzdGVuZXJMaXN0KGludCBzaXplKSB7CisgICAgICAgICAgICBzdXBlcihzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0IGNvcHkpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvcHkpOworICAgICAgICAgICAgX3R5cGVzID0gY29weS5fdHlwZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoaW50IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoX3R5cGVzICYgKDIgPDwgdHlwZSkpID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGlmIChjb250YWlucyhsaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgc3VwZXIuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIF90eXBlcyB8PSBnZXRFdmVudFR5cGVzKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICAgICAgaWYgKCFzdXBlci5yZW1vdmUobGlzdGVuZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgLy8gcmVjb21wdXRlIHR5cGVzIG1hc2sKKyAgICAgICAgICAgIF90eXBlcyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgIF90eXBlcyB8PSBnZXRFdmVudFR5cGVzKGdldChpKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBtYXNrIG9mIHRoZSBldmVudCB0eXBlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgcHJvY2Vzc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEV2ZW50VHlwZXMoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgICAgICBpbnQgdHlwZXMgPSAwOworICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgTGlzdGVuZXJBZGFwdGVyKSB7CisgICAgICAgICAgICAgICAgTGlzdGVuZXJBZGFwdGVyIGFkYXB0ZXIgPSAoTGlzdGVuZXJBZGFwdGVyKSBsaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChhZGFwdGVyLnJlc3BvbmRzVG8oTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UU1tpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFNbaV07CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBQZXJzaXN0TGlzdGVuZXIpCisgICAgICAgICAgICAgICAgdHlwZXMgfD0gMiA8PCBMaWZlY3ljbGVFdmVudC5BRlRFUl9QRVJTSVNUOworICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgQ2xlYXJMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIHR5cGVzIHw9IDIgPDwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0NMRUFSOworICAgICAgICAgICAgICAgIHR5cGVzIHw9IDIgPDwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfQ0xFQVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBEZWxldGVMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIHR5cGVzIHw9IDIgPDwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RFTEVURTsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkFGVEVSX0RFTEVURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIERpcnR5TGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ESVJUWTsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkFGVEVSX0RJUlRZOworICAgICAgICAgICAgICAgIHR5cGVzIHw9IDIgPDwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RJUlRZX0ZMVVNIRUQ7CisgICAgICAgICAgICAgICAgdHlwZXMgfD0gMiA8PCBMaWZlY3ljbGVFdmVudC5BRlRFUl9ESVJUWV9GTFVTSEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgTG9hZExpc3RlbmVyKQorICAgICAgICAgICAgICAgIHR5cGVzIHw9IDIgPDwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfTE9BRDsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0b3JlTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9TVE9SRTsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkFGVEVSX1NUT1JFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRGV0YWNoTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ERVRBQ0g7CisgICAgICAgICAgICAgICAgdHlwZXMgfD0gMiA8PCBMaWZlY3ljbGVFdmVudC5BRlRFUl9ERVRBQ0g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBBdHRhY2hMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIHR5cGVzIHw9IDIgPDwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0FUVEFDSDsKKyAgICAgICAgICAgICAgICB0eXBlcyB8PSAyIDw8IExpZmVjeWNsZUV2ZW50LkFGVEVSX0FUVEFDSDsKKwkJCX0KKwkJCXJldHVybiB0eXBlczsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NlYzYzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9MaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgbGlzdGVuaW5nIHRvIGFsbCB7QGxpbmsgTGlmZWN5Y2xlRXZlbnR9cy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBMaWZlY3ljbGVMaXN0ZW5lcgorICAgIGV4dGVuZHMgUGVyc2lzdExpc3RlbmVyLCBMb2FkTGlzdGVuZXIsIFN0b3JlTGlzdGVuZXIsIENsZWFyTGlzdGVuZXIsCisgICAgRGVsZXRlTGlzdGVuZXIsIERpcnR5TGlzdGVuZXIsIERldGFjaExpc3RlbmVyLCBBdHRhY2hMaXN0ZW5lciB7CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTG9hZExpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0xvYWRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmYyODMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0xvYWRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIExpc3RlbmVyIGZvciB3aGVuIHN0YXRlIGlzIGxvYWRlZCBpbnRvIGEgcGVyc2lzdGVudCBpbnN0bmFjZS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBMb2FkTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBhZnRlciBzdGF0ZSBoYXMgYmVlbiBsb2FkZWQgaW50byB0aGUgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJMb2FkKExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYWZ0ZXIgc3RhdGUgaGFzIGJlZW4gcmVmcmVzaGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyUmVmcmVzaChMaWZlY3ljbGVFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0xvZ09ycGhhbmVkS2V5QWN0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0xvZ09ycGhhbmVkS2V5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjY2UxZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTG9nT3JwaGFuZWRLZXlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZ0ZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHdoZW4gYW4gb3JwaGFuZWQga2V5IGlzIGRpc2NvdmVyZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjMuMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dPcnBoYW5lZEtleUFjdGlvbgorICAgIGltcGxlbWVudHMgT3JwaGFuZWRLZXlBY3Rpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoTG9nT3JwaGFuZWRLZXlBY3Rpb24uY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX2NoYW5uZWwgPSBPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfUlVOVElNRTsKKyAgICBwcml2YXRlIHNob3J0IF9sZXZlbCA9IExvZy5XQVJOOworCisgICAgLyoqCisgICAgICogVGhlIGNoYW5uZWwgdG8gbG9nIHRvLiBEZWZhdWx0cyB0byA8Y29kZT5vcmcuYXBhY2hlLm9wZW5qcGEuUnVudGltZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFubmVsKCkgeworICAgICAgICByZXR1cm4gX2NoYW5uZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNoYW5uZWwgdG8gbG9nIHRvLiBEZWZhdWx0cyB0byA8Y29kZT5vcmcuYXBhY2hlLm9wZW5qcGEuUnVudGltZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbm5lbChTdHJpbmcgY2hhbm5lbCkgeworICAgICAgICBfY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxldmVsIHRvIGxvZyBhdC4gRGVmYXVsdHMgdG8gPGNvZGU+V0FSTjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldExldmVsKCkgeworICAgICAgICByZXR1cm4gX2xldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsZXZlbCB0byBsb2cgYXQuIERlZmF1bHRzIHRvIDxjb2RlPldBUk48L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExldmVsKHNob3J0IGxldmVsKSB7CisgICAgICAgIF9sZXZlbCA9IGxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsZXZlbCB0byBsb2cgYXQuIERlZmF1bHRzIHRvIDxjb2RlPldBUk48L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExldmVsKFN0cmluZyBsZXZlbCkgeworICAgICAgICBfbGV2ZWwgPSBMb2dGYWN0b3J5SW1wbC5nZXRMZXZlbChsZXZlbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBvcnBoYW4oT2JqZWN0IG9pZCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQpIHsKKyAgICAgICAgTG9nIGxvZyA9IHZtZC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldExvZyhfY2hhbm5lbCk7CisgICAgICAgIE9iamVjdCBvd25lciA9IChzbSA9PSBudWxsKSA/IG51bGwgOiBzbS5nZXRJZCgpOworICAgICAgICBTdHJpbmcgbXNnID0gKG93bmVyID09IG51bGwpID8gIm9ycGhhbmVkLWtleSIgOiAib3JwaGFuZWQta2V5LW93bmVyIjsKKyAgICAgICAgc3dpdGNoIChfbGV2ZWwpIHsKKyAgICAgICAgICAgIGNhc2UgTG9nLlRSQUNFOgorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KG1zZywgb2lkLCB2bWQsIG93bmVyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvZy5JTkZPOgorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhfbG9jLmdldChtc2csIG9pZCwgdm1kLCBvd25lcikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMb2cuV0FSTjoKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQobXNnLCBvaWQsIHZtZCwgb3duZXIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9nLkVSUk9SOgorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKF9sb2MuZ2V0KG1zZywgb2lkLCB2bWQsIG93bmVyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvZy5GQVRBTDoKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRmF0YWxFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5mYXRhbChfbG9jLmdldChtc2csIG9pZCwgdm1kLCBvd25lcikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTWV0aG9kTGlmZWN5Y2xlQ2FsbGJhY2tzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L01ldGhvZExpZmVjeWNsZUNhbGxiYWNrcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTNkMWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L01ldGhvZExpZmVjeWNsZUNhbGxiYWNrcy5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIENhbGxiYWNrIGFkYXB0ZXIgdGhhdCBpbnZva2VzIGEgY2FsbGJhY2sgbWV0aG9kIHZpYSByZWZsZWN0aW9uLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RMaWZlY3ljbGVDYWxsYmFja3MKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZUNhbGxiYWNrcywgRXh0ZXJuYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoTWV0aG9kTGlmZWN5Y2xlQ2FsbGJhY2tzLmNsYXNzKTsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGhvZCBfY2FsbGJhY2s7CisgICAgcHJpdmF0ZSBib29sZWFuIF9hcmc7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNhbGxiYWNrIGNsYXNzIGFuZCBpdHMgY2FsbGJhY2sgbWV0aG9kIG5hbWUuCisgICAgICoKKyAgICAgKiBAYXJnIFdoZXRoZXIgd2UgZXhwZWN0IGEgZnVydGhlciBhcmd1bWVudCBzdWNoIGFzIGluIEFmdGVyRGV0YWNoCisgICAgICovCisgICAgcHVibGljIE1ldGhvZExpZmVjeWNsZUNhbGxiYWNrcyhDbGFzcyBjbHMsIFN0cmluZyBtZXRob2QsIGJvb2xlYW4gYXJnKSB7CisgICAgICAgIENsYXNzW10gYXJncyA9IGFyZyA/IG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MgfSA6IG51bGw7CisgICAgICAgIF9jYWxsYmFjayA9IGdldE1ldGhvZChjbHMsIG1ldGhvZCwgYXJncyk7CisgICAgICAgIF9hcmcgPSBhcmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBjYWxsYmFjayBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZExpZmVjeWNsZUNhbGxiYWNrcyhNZXRob2QgbWV0aG9kLCBib29sZWFuIGFyZykgeworICAgICAgICBfY2FsbGJhY2sgPSBtZXRob2Q7CisgICAgICAgIF9hcmcgPSBhcmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNhbGxiYWNrIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldENhbGxiYWNrTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gX2NhbGxiYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhpcyBjYWxsYmFjayBleHBlY3RzIGFub3RoZXIgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0FyZ3VtZW50KCkgeworICAgICAgICByZXR1cm4gX2FyZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWxsYmFjayhPYmplY3Qgb2JqLCBpbnQgZXZlbnRUeXBlKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1ha2VDYWxsYmFjayhPYmplY3Qgb2JqLCBPYmplY3QgYXJnLCBpbnQgZXZlbnRUeXBlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFfY2FsbGJhY2suaXNBY2Nlc3NpYmxlKCkpCisgICAgICAgICAgICBfY2FsbGJhY2suc2V0QWNjZXNzaWJsZSh0cnVlKTsKKworICAgICAgICBpZiAoX2FyZykKKyAgICAgICAgICAgIF9jYWxsYmFjay5pbnZva2Uob2JqLCBuZXcgT2JqZWN0W117IGFyZyB9KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2NhbGxiYWNrLmludm9rZShvYmosIChPYmplY3RbXSkgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICsgX2NhbGxiYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0dXJuIHRoZSBuYW1lZCBtZXRob2Qgb2YgdGhlIGdpdmVuIGNsYXNzLCB0aHJvd2luZworICAgICAqIHRoZSBwcm9wZXIgZXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyBjbHMsIFN0cmluZyBtZXRob2QsIENsYXNzW10gYXJncykgeworICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBjbHM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZC5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChpc0Fzc2lnbmFibGUobWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLCBhcmdzKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKChjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpKSAhPSBudWxsKTsKKworICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgbm8gc3VpdGFibGUgbWV0aG9kIHdhcyBmb3VuZAorICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibWV0aG9kLW5vdGZvdW5kIiwgY2xzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtZXRob2QsIGFyZ3MgPT0gbnVsbCA/IG51bGwgOiBBcnJheXMuYXNMaXN0KGFyZ3MpKSk7CisJfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBpbiB0aGUgZnJvbSBhcnJheSBhcmUgYXNzaWduYWJsZQorICAgICAqIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycyBvZiB0aGUgdG8gYXJyYXkuIAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlKENsYXNzW10gZnJvbSwgQ2xhc3NbXSB0bykgeworICAgICAgICBpZiAoZnJvbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRvID09IG51bGwgfHwgdG8ubGVuZ3RoID09IDA7CisgICAgICAgIGlmICh0byA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZyb20gPT0gbnVsbCB8fCBmcm9tLmxlbmd0aCA9PSAwOworCisgICAgICAgIGlmIChmcm9tLmxlbmd0aCAhPSB0by5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnJvbVtpXSAhPSBudWxsICYmICFmcm9tW2ldLmlzQXNzaWduYWJsZUZyb20odG9baV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgY2xzID0gKENsYXNzKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIFN0cmluZyBtZXRoTmFtZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgX2FyZyA9IGluLnJlYWRCb29sZWFuKCk7CisKKyAgICAgICAgQ2xhc3NbXSBhcmdzID0gX2FyZyA/IG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MgfSA6IG51bGw7CisgICAgICAgIF9jYWxsYmFjayA9IGdldE1ldGhvZChjbHMsIG1ldGhOYW1lLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZU9iamVjdChfY2FsbGJhY2suZ2V0Q2xhc3MoKSk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChfY2FsbGJhY2suZ2V0TmFtZSgpKTsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihfYXJnKTsKKyAgICB9IAorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9Ob25lT3JwaGFuZWRLZXlBY3Rpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTm9uZU9ycGhhbmVkS2V5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmN2M4NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTm9uZU9ycGhhbmVkS2V5QWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKKworLyoqCisgKiBEb2VzIG5vdGhpbmcgd2hlbiBhbiBvcnBoYW5lZCBrZXkgaXMgZGlzY292ZXJlZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuMy4yLjIKKyAqLworcHVibGljIGNsYXNzIE5vbmVPcnBoYW5lZEtleUFjdGlvbgorICAgIGltcGxlbWVudHMgT3JwaGFuZWRLZXlBY3Rpb24geworCisgICAgcHVibGljIE9iamVjdCBvcnBoYW4oT2JqZWN0IG9pZCwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9PcnBoYW5lZEtleUFjdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9PcnBoYW5lZEtleUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTRhOWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L09ycGhhbmVkS2V5QWN0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKKworLyoqCisgKiBQZXJmb3JtIGFuIGFjdGlvbiB3aGVuIE9wZW5KUEEgZGV0ZWN0cyBhbiBvcnBoYW5lZCBrZXkgaW4gdGhlIGRhdGFiYXNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjIuMgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ycGhhbmVkS2V5QWN0aW9uIHsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIHJlY2VpdmVkIHdoZW4gT3BlbkpQQSBkaXNjb3ZlcnMgYW4gb3JwaGFuZWQga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIG9pZCB0aGUgb3JwaGFuZWQga2V5CisgICAgICogQHBhcmFtIHNtIHRoZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIHJlY29yZCBpbiB3aGljaCB0aGUKKyAgICAgKiBrZXkgd2FzIGRpc2NvdmVyZWQ7IG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIHZtZCB0aGUgdmFsdWUgaW4gd2hpY2ggdGhlIGtleSB3YXMgZGlzY292ZXJlZAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIGxvYWQgaW50byBmaWVsZCA8Y29kZT5mbWQ8L2NvZGU+OyB0eXBpY2FsbHkKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3Qgb3JwaGFuKE9iamVjdCBvaWQsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFZhbHVlTWV0YURhdGEgdm1kKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvUGVyc2lzdExpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1BlcnNpc3RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjVhM2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1BlcnNpc3RMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIExpc3RlbmVyIGZvciBuZXdseS1wZXJzaXN0ZWQgaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdExpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYmVmb3JlIGFuIGluc3RhbmNlIGlzIHBlcnNpc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVQZXJzaXN0KExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhbiBpbnN0YW5jZSBpcyBwZXJzaXN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJQZXJzaXN0KExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvUmVtb3RlQ29tbWl0RXZlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvUmVtb3RlQ29tbWl0RXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDkxNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9SZW1vdGVDb21taXRFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBFdmVudCB0eXBlIHRvIGhvbGQgdGhlIElEcyBvZiBhZGRpdGlvbnMsIHVwZGF0ZXMsIGFuZAorICogZGVsZXRlcy4gVGhpcyBldmVudCB0eXBlIGlzIGFsc28gZnVsbHkgc2VyaWFsaXphYmxlIGZvciByZW1vdGUgY29tbXVuaWNhdGlvbi4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlQ29tbWl0RXZlbnQKKyAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIE5hbWVzIG9mIGFkZGVkIGNsYXNzZXMsIHVwYXRlZCBhbmQgZGVsZXRlZCBPYmplY3QgSURzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBWUxPQURfT0lEUyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBOYW1lcyBvZiBhZGRlZCBjbGFzc2VzLCBhZGRlZCwgdXBhdGVkIGFuZCBkZWxldGVkIE9iamVjdCBJRHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFZTE9BRF9PSURTX1dJVEhfQUREUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBOYW1lcyBvZiBhZGRlZCwgdXBkYXRlZCwgYW5kIGRlbGV0ZWQgY2xhc3NlcyBvbmx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBWUxPQURfRVhURU5UUyA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgc19sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmVtb3RlQ29tbWl0RXZlbnQuY2xhc3MpOworCisgICAgcHJpdmF0ZSBpbnQgX3BheWxvYWQgPSBQQVlMT0FEX09JRFM7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9hZGRJZHMgPSBudWxsOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfYWRkQ2xhc3NlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF91cGRhdGVzID0gbnVsbDsKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gX2RlbGV0ZXMgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCBkdXJpbmcgZXh0ZXJuYWxpemF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZW1vdGVDb21taXRFdmVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gQWxsIGNvbGxlY3Rpb25zIHdpbGwgYmUgcHJveGllZCB3aXRoIHVubW9kaWZpYWJsZSB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXlsb2FkVHlwZSBQQVlMT0FEIGNvbnN0YW50IGZvciB0eXBlIG9mIGRhdGEgaW4gdGhpcyBldmVudAorICAgICAqIEBwYXJhbSBhZGRJZHMgc2V0IG9mIG9iamVjdCBJRHMgZm9yIGFkZGVkIGluc3RhbmNlcywgb3IgbnVsbAorICAgICAqIEBwYXJhbSBhZGRDbGFzc2VzIHNldCBvZiBjbGFzcyBuYW1lcyBmb3IgYWRkZWQgaW5zdGFuY2VzCisgICAgICogQHBhcmFtIHVwZGF0ZXMgc2V0IG9mIGNsYXNzIG5hbWVzIG9yIG9iamVjdCBJRHMgZm9yIHVwZGF0ZWQgaW5zdGFuY2VzCisgICAgICogQHBhcmFtIGRlbGV0ZXMgc2V0IG9mIGNsYXNzIG5hbWVzIG9yIG9iamVjdCBJRHMgZm9yIGRlbGV0ZWQgaW5zdGFuY2VzCisgICAgICovCisgICAgcHVibGljIFJlbW90ZUNvbW1pdEV2ZW50KGludCBwYXlsb2FkVHlwZSwgQ29sbGVjdGlvbiBhZGRJZHMsCisgICAgICAgIENvbGxlY3Rpb24gYWRkQ2xhc3NlcywgQ29sbGVjdGlvbiB1cGRhdGVzLCBDb2xsZWN0aW9uIGRlbGV0ZXMpIHsKKyAgICAgICAgX3BheWxvYWQgPSBwYXlsb2FkVHlwZTsKKyAgICAgICAgaWYgKGFkZElkcyAhPSBudWxsKQorICAgICAgICAgICAgX2FkZElkcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oYWRkSWRzKTsKKyAgICAgICAgaWYgKGFkZENsYXNzZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9hZGRDbGFzc2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihhZGRDbGFzc2VzKTsKKyAgICAgICAgaWYgKHVwZGF0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIF91cGRhdGVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih1cGRhdGVzKTsKKyAgICAgICAgaWYgKGRlbGV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWxldGVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihkZWxldGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgUEFZTE9BRCBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBheWxvYWRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3BheWxvYWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB0aGUgZXZlbnQgdHlwZSBpcyBQQVlMT0FEX09JRFNfV0lUSF9BRERTLCByZXR1cm4gdGhlIHNldCBvZgorICAgICAqIG9iamVjdCBJRHMgZm9yIGFkZGVkIG9iamVjdHMuIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxhYmxlIHdoZW4gdGhlCisgICAgICogYmFja3dhcmQgY29tcGF0YWJpbGl0eSBwcm9wZXJ0eSB0cmFuc21pdEFkZE9iamVjdElkcyBpcyB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBlcnNpc3RlZE9iamVjdElkcygpIHsKKyAgICAgICAgaWYgKF9wYXlsb2FkICE9IFBBWUxPQURfT0lEU19XSVRIX0FERFMpIHsKKyAgICAgICAgICAgIGlmIChfcGF5bG9hZCA9PSBQQVlMT0FEX09JRFMpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oc19sb2MuZ2V0KCJuby1hZGRlZC1vaWRzIikpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oc19sb2MuZ2V0KCJleHRlbnQtb25seS1ldmVudCIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKF9hZGRJZHMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX2FkZElkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoZSBldmVudCB0eXBlIGlzIG5vdCBQQVlMT0FEX0VYVEVOVFMsIHJldHVybiB0aGUgc2V0IG9mCisgICAgICogb2JqZWN0IElEcyBmb3IgdXBkYXRlZCBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFVwZGF0ZWRPYmplY3RJZHMoKSB7CisgICAgICAgIGlmIChfcGF5bG9hZCA9PSBQQVlMT0FEX0VYVEVOVFMpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihzX2xvYy5nZXQoImV4dGVudC1vbmx5LWV2ZW50IikpOworICAgICAgICByZXR1cm4gKF91cGRhdGVzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IF91cGRhdGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGV2ZW50IHR5cGUgaXMgbm90IFBBWUxPQURfRVhURU5UUywgcmV0dXJuIHRoZSBzZXQgb2YKKyAgICAgKiBvYmplY3QgSURzIGZvciBkZWxldGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGVsZXRlZE9iamVjdElkcygpIHsKKyAgICAgICAgaWYgKF9wYXlsb2FkID09IFBBWUxPQURfRVhURU5UUykKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKHNfbG9jLmdldCgiZXh0ZW50LW9ubHktZXZlbnQiKSk7CisgICAgICAgIHJldHVybiAoX2RlbGV0ZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX2RlbGV0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIGFsbCBldmVudCB0eXBlcywgcmV0dXJuIHRoZSBzZXQgb2YgY2xhc3MgbmFtZXMgZm9yCisgICAgICogdGhlIGNsYXNzZXMgb2YgaW5zZXJ0ZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQZXJzaXN0ZWRUeXBlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiAoX2FkZENsYXNzZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX2FkZENsYXNzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB0aGUgZXZlbnQgdHlwZSBpcyBQQVlMT0FEX0VYVEVOVFMsIHJldHVybiB0aGUgc2V0IG9mIGNsYXNzCisgICAgICogbmFtZXMgZm9yIHRoZSBjbGFzc2VzIG9mIHVwZGF0ZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRVcGRhdGVkVHlwZU5hbWVzKCkgeworICAgICAgICBpZiAoX3BheWxvYWQgIT0gUEFZTE9BRF9FWFRFTlRTKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oc19sb2MuZ2V0KCJub25leHRlbnQtZXZlbnQiKSk7CisgICAgICAgIHJldHVybiAoX3VwZGF0ZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX3VwZGF0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB0aGUgZXZlbnQgdHlwZSBpcyBQQVlMT0FEX0VYVEVOVFMsIHJldHVybiB0aGUgc2V0IG9mIGNsYXNzCisgICAgICogbmFtZXMgZm9yIHRoZSBjbGFzc2VzIG9mIGRlbGV0ZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXREZWxldGVkVHlwZU5hbWVzKCkgeworICAgICAgICBpZiAoX3BheWxvYWQgIT0gUEFZTE9BRF9FWFRFTlRTKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oc19sb2MuZ2V0KCJub25leHRlbnQtZXZlbnQiKSk7CisgICAgICAgIHJldHVybiAoX2RlbGV0ZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX2RlbGV0ZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVJbnQoX3BheWxvYWQpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoX2FkZENsYXNzZXMpOworICAgICAgICBpZiAoX3BheWxvYWQgPT0gUEFZTE9BRF9PSURTX1dJVEhfQUREUykKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChfYWRkSWRzKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KF91cGRhdGVzKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KF9kZWxldGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcGF5bG9hZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIF9hZGRDbGFzc2VzID0gKENvbGxlY3Rpb24pIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGlmIChfcGF5bG9hZCA9PSBQQVlMT0FEX09JRFNfV0lUSF9BRERTKQorICAgICAgICAgICAgICAgIF9hZGRJZHMgPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgX3VwZGF0ZXMgPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgX2RlbGV0ZXMgPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIC8vICMjIyBkbyBzb21ldGhpbmcKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1JlbW90ZUNvbW1pdEV2ZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkY2E1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1JlbW90ZUNvbW1pdEV2ZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdENvbmN1cnJlbnRFdmVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBNYW5hZ2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgYW5kIG5vdGlmeQorICoge0BsaW5rIFJlbW90ZUNvbW1pdExpc3RlbmVyfXMgb24gcmVtb3RlIGNvbW1pdCBldmVudHMuIElmIHJlbW90ZSBldmVudHMKKyAqIGFyZSBlbmFibGVkLCB0aGlzIG1hbmFnZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBhcyBhIHRyYW5zYWN0aW9uIGxpc3RlbmVyIG9uCisgKiBhbGwgYnJva2VycyBzbyB0aGF0IGl0IGtub3dzIHdoZW4gY29tbWl0cyBhcmUgbWFkZS4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjMuMAorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyCisgICAgZXh0ZW5kcyBBYnN0cmFjdENvbmN1cnJlbnRFdmVudE1hbmFnZXIKKyAgICBpbXBsZW1lbnRzIEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIsIENsb3NlYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChSZW1vdGVDb21taXRFdmVudE1hbmFnZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVDb21taXRQcm92aWRlciBfcHJvdmlkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIF90cmFuc21pdFBlcnNJZHMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgX3Byb3ZpZGVyID0gY29uZi5uZXdSZW1vdGVDb21taXRQcm92aWRlckluc3RhbmNlKCk7CisgICAgICAgIGlmIChfcHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgX3Byb3ZpZGVyLnNldFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcih0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHJlbW90ZSBldmVudHMgYXJlIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYXJlUmVtb3RlRXZlbnRzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9wcm92aWRlciAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFJlbW90ZUNvbW1pdFByb3ZpZGVyfSB0aGF0IHRoaXMgbWFuYWdlciB1c2VzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIFJlbW90ZUNvbW1pdFByb3ZpZGVyIGdldFJlbW90ZUNvbW1pdFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gX3Byb3ZpZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIG9pZHMgb2YgYWRkZWQgaW5zdGFuY2VzIHdpbGwgYmUgdHJhbnNtaXR0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNtaXRQZXJzaXN0ZWRPYmplY3RJZHMoKSB7CisgICAgICAgIHJldHVybiBfdHJhbnNtaXRQZXJzSWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIG9pZHMgb2YgYWRkZWQgaW5zdGFuY2VzIHdpbGwgYmUgdHJhbnNtaXR0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNtaXRQZXJzaXN0ZWRPYmplY3RJZHMoYm9vbGVhbiB0cmFuc21pdCkgeworICAgICAgICBfdHJhbnNtaXRQZXJzSWRzID0gdHJhbnNtaXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoUmVtb3RlQ29tbWl0TGlzdGVuZXIgbGlzdGVuKSB7CisgICAgICAgIGlmIChfcHJvdmlkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1wcm92aWRlciIpKTsKKyAgICAgICAgc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGlzIG1hbmFnZXIgYW5kIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKF9wcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBfcHJvdmlkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAoKFJlbW90ZUNvbW1pdExpc3RlbmVyKSBpdHIubmV4dCgpKS5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZmlyZUV2ZW50KE9iamVjdCBldmVudCwgT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIFJlbW90ZUNvbW1pdExpc3RlbmVyIGxpc3RlbiA9IChSZW1vdGVDb21taXRMaXN0ZW5lcikgbGlzdGVuZXI7CisgICAgICAgIFJlbW90ZUNvbW1pdEV2ZW50IGV2ID0gKFJlbW90ZUNvbW1pdEV2ZW50KSBldmVudDsKKyAgICAgICAgbGlzdGVuLmFmdGVyQ29tbWl0KGV2KTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRyYW5zYWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXQoVHJhbnNhY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoX3Byb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlbW90ZUNvbW1pdEV2ZW50IHJjZSA9IGNyZWF0ZVJlbW90ZUNvbW1pdEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfcHJvdmlkZXIuYnJvYWRjYXN0KHJjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSByZW1vdGUgY29tbWl0IGV2ZW50IGZyb20gdGhlIGdpdmVuIHRyYW5zYWN0aW9uIGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgUmVtb3RlQ29tbWl0RXZlbnQgY3JlYXRlUmVtb3RlQ29tbWl0RXZlbnQoVHJhbnNhY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBCcm9rZXIgYnJva2VyID0gKEJyb2tlcikgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGludCBwYXlsb2FkOworICAgICAgICBDb2xsZWN0aW9uIHBlcnNJZHMgPSBudWxsOworICAgICAgICBDb2xsZWN0aW9uIGFkZENsYXNzTmFtZXMgPSBudWxsOworICAgICAgICBDb2xsZWN0aW9uIHVwZGF0ZXMgPSBudWxsOworICAgICAgICBDb2xsZWN0aW9uIGRlbGV0ZXMgPSBudWxsOworCisgICAgICAgIGlmIChicm9rZXIuaXNMYXJnZVRyYW5zYWN0aW9uKCkpIHsKKyAgICAgICAgICAgIHBheWxvYWQgPSBSZW1vdGVDb21taXRFdmVudC5QQVlMT0FEX0VYVEVOVFM7CisgICAgICAgICAgICBhZGRDbGFzc05hbWVzID0gdG9DbGFzc05hbWVzKGV2ZW50LmdldFBlcnNpc3RlZFR5cGVzKCkpOworICAgICAgICAgICAgdXBkYXRlcyA9IHRvQ2xhc3NOYW1lcyhldmVudC5nZXRVcGRhdGVkVHlwZXMoKSk7CisgICAgICAgICAgICBkZWxldGVzID0gdG9DbGFzc05hbWVzKGV2ZW50LmdldERlbGV0ZWRUeXBlcygpKTsKKyAgICAgICAgICAgIGlmIChhZGRDbGFzc05hbWVzID09IG51bGwgJiYgdXBkYXRlcyA9PSBudWxsICYmIGRlbGV0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gdHJhbnMgPSBldmVudC5nZXRUcmFuc2FjdGlvbmFsT2JqZWN0cygpOworICAgICAgICAgICAgaWYgKHRyYW5zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcGF5bG9hZCA9IChfdHJhbnNtaXRQZXJzSWRzKQorICAgICAgICAgICAgICAgID8gUmVtb3RlQ29tbWl0RXZlbnQuUEFZTE9BRF9PSURTX1dJVEhfQUREUworICAgICAgICAgICAgICAgIDogUmVtb3RlQ29tbWl0RXZlbnQuUEFZTE9BRF9PSURTOworICAgICAgICAgICAgT2JqZWN0IG9pZDsKKyAgICAgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSB0cmFucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIG9iaiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgc20gPSBicm9rZXIuZ2V0U3RhdGVNYW5hZ2VyKG9iaik7CisKKyAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCB8fCAhc20uaXNQZXJzaXN0ZW50KCkgfHwgIXNtLmlzRGlydHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHNtLmlzTmV3KCkgJiYgc20uaXNEZWxldGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgb2lkID0gc20uZmV0Y2hPYmplY3RJZCgpOworICAgICAgICAgICAgICAgIGlmIChzbS5pc05ldygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdHJhbnNtaXRQZXJzSWRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyc0lkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNJZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJzSWRzLmFkZChvaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGRDbGFzc05hbWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lcy5hZGQob2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzRGVsZXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICBkZWxldGVzLmFkZChvaWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmFkZChvaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRDbGFzc05hbWVzID09IG51bGwgJiYgdXBkYXRlcyA9PSBudWxsICYmIGRlbGV0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJlbW90ZUNvbW1pdEV2ZW50KHBheWxvYWQsIHBlcnNJZHMsIGFkZENsYXNzTmFtZXMsIHVwZGF0ZXMsCisgICAgICAgICAgICBkZWxldGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gYSBjb2xsZWN0aW9uIG9mIGNsYXNzZXMgdG8gY2xhc3MgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiB0b0NsYXNzTmFtZXMoQ29sbGVjdGlvbiBjbHNzKSB7CisgICAgICAgIGlmIChjbHNzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIExpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KGNsc3MpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgbmFtZXMuc2V0KGksICgoQ2xhc3MpIG5hbWVzLmdldChpKSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbW1pdChUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJSb2xsYmFjayhUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXRDb21wbGV0ZShUcmFuc2FjdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJSb2xsYmFja0NvbXBsZXRlKFRyYW5zYWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlclN0YXRlVHJhbnNpdGlvbnMoVHJhbnNhY3Rpb25FdmVudCBldmVudCkKKwl7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9SZW1vdGVDb21taXRMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9SZW1vdGVDb21taXRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWU4NWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1JlbW90ZUNvbW1pdExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEFuIGVudGl0eSB0aGF0IHdpc2hlcyB0byBiZSBub3RpZmllZCB3aGVuIEJyb2tlcnMKKyAqIGFzc29jaWF0ZWQgd2l0aCByZW1vdGUgQnJva2VyRmFjdG9yaWVzIGNvbW1pdC4KKyAqICBBIFJlbW90ZUNvbW1pdExpc3RlbmVyIDxiPmlzIG5vdDwvYj4gbm90aWZpZWQgb2YgY29tbWl0cyB0aGF0IG9yaWdpbmF0ZWQKKyAqIHdpdGggYSBCcm9rZXIgY3JlYXRlZCBmcm9tIHRoZSBCcm9rZXJGYWN0b3J5IHRoYXQgaXQgaXMKKyAqIHJlZ2lzdGVyZWQgd2l0aC4gKE9mIGNvdXJzZSwgaWYgYSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIHdpdGggbXVsdGlwbGUKKyAqIGZhY3RvcmllcywgdGhpcyBzaXR1YXRpb24gbWlnaHQgYmUgY29tcGxpY2F0ZWQgYSBiaXQuKQorICogIFVzYWdlOgorICogPGNvZGU+PHByZT4gaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC4qOworICogaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLio7CisgKiAKKyAqIHtAbGluayBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbn0gY29uZiA9IGZhY3RvcnkuZ2V0Q29uZmlndXJhaXRvbiAoKTsKKyAqICBSZW1vdGVDb21taXRMaXN0ZW5lciBsID0gbmV3IFJlbW90ZUNvbW1pdExpc3RlbmVyICgpIHsKKyAqIHB1YmxpYyB2b2lkIGFmdGVyQ29tbWl0ICh7QGxpbmsgUmVtb3RlQ29tbWl0RXZlbnR9IGUpIHsKKyAqIC8vIHVwZGF0ZSBhIFN3aW5nIHdpZGdldCB3aGVuIHJlbW90ZSBicm9rZXJzIG1ha2UKKyAqIC8vIGNoYW5nZXMgdG8gcmVmZXJlbmNlIGRhdGEgfQorICogIHB1YmxpYyB2b2lkIGNsb3NlICgpIHsgfSB9OworICogIGNvbmYuZ2V0UmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyICgpLmFkZExpc3RlbmVyIChsKTsKKyAqIDwvcHJlPjwvY29kZT4KKyAqIAorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAc2luY2UgMC4yLjUuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZUNvbW1pdExpc3RlbmVyCisgICAgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgKiBCcm9rZXJGYWN0b3J5IGhhcyBzdWNjZXNzZnVsbHkgY29tbWl0dGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ29tbWl0KFJlbW90ZUNvbW1pdEV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWEyZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9SZW1vdGVDb21taXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsKKworLyoqCisgKiBBbiBlbnRpdHkgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgY29tbXVuaWNhdGluZyBjb21taXQKKyAqIG5vdGlmaWNhdGlvbiB0byBvdGhlciB7QGxpbmsgUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyfXMuIEVhY2gKKyAqIGV2ZW50IG1hbmFnZXIgY3JlYXRlcyBhIHJlbW90ZSBjb21taXQgcHJvdmlkZXIsIGJhc2VkIG9uCisgKiB0aGUgdmFsdWVzIG9mIHRoZSA8Y29kZT5vcGVuanBhLlJlbW90ZUNvbW1pdFByb3ZpZGVyPC9jb2RlPgorICogY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KKyAqICBBbiBhZGFwdGVyIHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgVHJhbnNhY3Rpb25MaXN0ZW5lcn0gaXMKKyAqIHJlZ2lzdGVyZWQgd2l0aCBlYWNoIHtAbGluayBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlcn0uIFRoaXMgYWRhcHRlcgorICogaW52b2tlcyA8Y29kZT5icm9hZGNhc3Q8L2NvZGU+LCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IKKyAqIG5vdGlmeWluZyBvdGhlciByZW1vdGUgY29tbWl0IHByb3ZpZGVyIG9iamVjdHMgb2YgdGhlIGNvbW1pdCBjaGFuZ2VzLgorICogIFVwb24gcmVjZWl2aW5nIGEgbm90aWZpY2F0aW9uIGZyb20gYSBkaWZmZXJlbnQgcmVtb3RlIGNvbW1pdCBwcm92aWRlciwKKyAqIGEgcHJvdmlkZXIgbXVzdCBub3RpZnkgYWxsIGxvY2FsIHJlbW90ZSBjb21taXQgbGlzdGVuZXJzIHZpYSB0aGUKKyAqIHtAbGluayBSZW1vdGVDb21taXRFdmVudE1hbmFnZXIjZmlyZUV2ZW50fSBtZXRob2QuCisgKiAgQSByZW1vdGUgY29tbWl0IHByb3ZpZGVyIDxiPm11c3Qgbm90PC9iPiBmaXJlIHJlbW90ZSBldmVudHMgZm9yCisgKiBjb21taXRzIHRoYXQgb3JpZ2luYXRlZCB3aXRoIGEgbG9jYWwgYnJva2VyLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAc2luY2UgMC4yLjUuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZUNvbW1pdFByb3ZpZGVyCisgICAgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogU2V0IHRoZSAib3duaW5nIiByZW1vdGUgZXZlbnQgbWFuYWdlciB0byBub3RpZnkgd2hlbiByZW1vdGUgZXZlbnRzCisgICAgICogYXJlIHJlY2VpdmVkIGZyb20gcmVtb3RlIHNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyKFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlciBtZ3IpOworCisgICAgLyoqCisgICAgICogTm90aWZpZXMgb3RoZXIgcmVtb3RlIGV2ZW50IG1hbmFnZXJzIGluIHRoaXMgSlZNIGFuZCBvbiBvdGhlciBtYWNoaW5lcworICAgICAqIG9mIGNoYW5nZXMgdG8gdGhlIGNhY2hlLiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBub3RpZnkgdGhlCisgICAgICogZXZlbnQgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJyb2tlciB0aGF0IG9yaWdpbmF0ZWQgdGhpcyBjb21taXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYnJvYWRjYXN0KFJlbW90ZUNvbW1pdEV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvU2luZ2xlSlZNUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvU2luZ2xlSlZNUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI2NWZhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9TaW5nbGVKVk1SZW1vdGVDb21taXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaFNldDsKKworLyoqCisgKiBTaW5nbGUtSlZNLW9ubHkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJlbW90ZUNvbW1pdFByb3ZpZGVyfQorICogdGhhdCBsaXN0ZW5zIGZvciBvYmplY3QgbW9kaWZpY2F0aW9ucyBhbmQgcHJvcGFnYXRlcyB0aG9zZSBjaGFuZ2VzCisgKiB0byBvdGhlciBTaW5nbGVKVk1SZW1vdGVDb21taXRQcm92aWRlcnMgaW4gdGhlIHNhbWUgSlZNLiBUaGlzIGlzCisgKiBvbmx5IHVzZWZ1bCBmb3IgbGlua2luZyB0b2dldGhlciBtdWx0aXBsZSBmYWN0b3JpZXMgaW4gdGhlIHNhbWUKKyAqIEpWTSB0aGF0IGFyZSBhbGwgbG9hZGVkIGluIHRoZSBzYW1lIGNsYXNzbG9hZGVyLCB3aGljaCBpcyBhIHJhcmUKKyAqIGNpcmN1bXN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQHNpbmNlIDAuMi41LjAKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUpWTVJlbW90ZUNvbW1pdFByb3ZpZGVyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZUNvbW1pdFByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIFNldCBzX3Byb3ZpZGVycyA9IG5ldyBDb25jdXJyZW50SGFzaFNldCgpOworCisgICAgcHVibGljIFNpbmdsZUpWTVJlbW90ZUNvbW1pdFByb3ZpZGVyKCkgeworICAgICAgICBzX3Byb3ZpZGVycy5hZGQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYnJvYWRjYXN0KFJlbW90ZUNvbW1pdEV2ZW50IGV2ZW50KSB7CisgICAgICAgIFNpbmdsZUpWTVJlbW90ZUNvbW1pdFByb3ZpZGVyIHByb3ZpZGVyOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzX3Byb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHByb3ZpZGVyID0gKFNpbmdsZUpWTVJlbW90ZUNvbW1pdFByb3ZpZGVyKSBpdGVyLm5leHQoKTsKKworICAgICAgICAgICAgLy8gZG9uJ3Qgbm90aWZ5IHRoaXMgb2JqZWN0IC0tIHRoaXMgcHJvdmlkZXIncyBmYWN0b3J5CisgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIG5vdGlmaWVkIG9mIGNvbW1pdHMgdGhhdCBvcmlnaW5hdGVkCisgICAgICAgICAgICAvLyB3aXRoIG9uZSBvZiBpdHMgYnJva2VycworICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IHRoaXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHByb3ZpZGVyLmZpcmVFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc19wcm92aWRlcnMucmVtb3ZlKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvU3RvcmVMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9TdG9yZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyM2I3OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvU3RvcmVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50OworCisvKioKKyAqIExpc3RlbmVyIGZvciB3aGVuIHBlcnNpc3RlbnQgaW5zdGFuY2VzIGFyZSBzdG9yZWQgdG8gdGhlIGRhdGFiYXNlLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b3JlTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBqdXN0IHByaW9yIHRvIHN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZVN0b3JlKExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQganVzdCBhZnRlciBzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlclN0b3JlKExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ4NWEyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9UQ1BSZW1vdGVDb21taXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMucG9vbC5Qb29sYWJsZU9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLnBvb2wuaW1wbC5HZW5lcmljT2JqZWN0UG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU2VyaWFsaXphdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5SZWVudHJhbnRMb2NrOworCitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogVENQLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBSZW1vdGVDb21taXRQcm92aWRlcn0gdGhhdAorICogbGlzdGVucyBmb3Igb2JqZWN0IG1vZGlmaWNhdGlvbnMgYW5kIHByb3BhZ2F0ZXMgdGhvc2UgY2hhbmdlcyB0bworICogb3RoZXIgUmVtb3RlQ29tbWl0UHJvdmlkZXJzIG92ZXIgVENQIHNvY2tldHMuCisgKgorICogQGF1dGhvciBCcmlhbiBMZWFpcgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBzaW5jZSAwLjIuNS4wCisgKi8KK3B1YmxpYyBjbGFzcyBUQ1BSZW1vdGVDb21taXRQcm92aWRlcgorICAgIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVDb21taXRQcm92aWRlcgorICAgIGltcGxlbWVudHMgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPUlQgPSA1NjM2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIHNfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFRDUFJlbW90ZUNvbW1pdFByb3ZpZGVyLmNsYXNzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNfaWRTZXF1ZW5jZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgLy8JQSBtYXAgb2YgbGlzdGVuIHBvcnRzIHRvIGxpc3RlbmVycyBpbiB0aGlzIEpWTS4gV2UgbWlnaHQKKyAgICAvLwl3YW50IHRvIGxvb2sgaW50byBhbGxvd2luZyBzYW1lIHBvcnQsIGRpZmZlcmVudCBpbnRlcmZhY2UgLS0KKyAgICAvLwl0aGF0IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUgaW4gYSBzaW5nbGUgSlZNLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBzX3BvcnRMaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBwcml2YXRlIGxvbmcgX2lkOworICAgIHByaXZhdGUgYnl0ZVtdIF9sb2NhbGhvc3Q7CisgICAgcHJpdmF0ZSBpbnQgX3BvcnQgPSBERUZBVUxUX1BPUlQ7CisgICAgcHJpdmF0ZSBpbnQgX21heEFjdGl2ZSA9IDI7CisgICAgcHJpdmF0ZSBpbnQgX21heElkbGUgPSAyOworICAgIHByaXZhdGUgaW50IF9yZWNvdmVyeVRpbWVNaWxsaXMgPSAxNTAwMDsKKyAgICBwcml2YXRlIFRDUFBvcnRMaXN0ZW5lciBfbGlzdGVuZXI7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RRdWV1ZSBfYnJvYWRjYXN0UXVldWUgPSBuZXcgQnJvYWRjYXN0UXVldWUoKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX2Jyb2FkY2FzdFRocmVhZHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KAorICAgICAgICBuZXcgTGlua2VkTGlzdCgpKTsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0IF9hZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBSZWVudHJhbnRMb2NrIF9hZGRyZXNzZXNMb2NrOworCisgICAgcHVibGljIFRDUFJlbW90ZUNvbW1pdFByb3ZpZGVyKCkKKyAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gb2J0YWluIGEgdW5pcXVlIElELgorICAgICAgICBzeW5jaHJvbml6ZWQgKFRDUFJlbW90ZUNvbW1pdFByb3ZpZGVyLmNsYXNzKSB7CisgICAgICAgICAgICBfaWQgPSBzX2lkU2VxdWVuY2UrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhY2hlIHRoZSBsb2NhbCBJUCBhZGRyZXNzLgorICAgICAgICBfbG9jYWxob3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0QWRkcmVzcygpOworICAgICAgICBfYWRkcmVzc2VzTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIHNldE51bUJyb2FkY2FzdFRocmVhZHMoMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdGhhdCB0aGlzIHByb3ZpZGVyIHNob3VsZCBsaXN0ZW4gb24uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgICAgICByZXR1cm4gX3BvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdGhhdCB0aGlzIHByb3ZpZGVyIHNob3VsZCBsaXN0ZW4gb24uIFNldCBvbmNlIG9ubHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcKKyAgICAgKiB0byByZWNvbm5lY3QgdG8gYSBwZWVyIGFmdGVyIGl0IGJlY29tZXMgdW5yZWFjaGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjb3ZlcnlUaW1lTWlsbGlzKGludCByZWNvdmVyeXRpbWUpIHsKKyAgICAgICAgX3JlY292ZXJ5VGltZU1pbGxpcyA9IHJlY292ZXJ5dGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXRyeWluZworICAgICAqIHRvIHJlY29ubmVjdCB0byBhIHBlZXIgYWZ0ZXIgaXQgYmVjb21lcyB1bnJlYWNoYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlY292ZXJ5VGltZU1pbGxpcygpIHsKKyAgICAgICAgcmV0dXJuIF9yZWNvdmVyeVRpbWVNaWxsaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNvY2tldHMgdGhhdCB0aGlzIHByb3ZpZGVyIGNhbgorICAgICAqIHNpbWV0YW5lb3VzbHkgb3BlbiB0byBlYWNoIHBlZXIgaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4QWN0aXZlKGludCBtYXhBY3RpdmUpIHsKKyAgICAgICAgX21heEFjdGl2ZSA9IG1heEFjdGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc29ja2V0cyB0aGF0IHRoaXMgcHJvdmlkZXIgY2FuCisgICAgICogc2ltZXRhbmVvdXNseSBvcGVuIHRvIGVhY2ggcGVlciBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEFjdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9tYXhBY3RpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBpZGxlIHNvY2tldHMgdGhhdCB0aGlzIHByb3ZpZGVyIGNhbiBrZWVwIG9wZW4KKyAgICAgKiB0byBlYWNoIHBlZXIgaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4SWRsZShpbnQgbWF4SWRsZSkgeworICAgICAgICBfbWF4SWRsZSA9IG1heElkbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBpZGxlIHNvY2tldHMgdGhhdCB0aGlzIHByb3ZpZGVyIGNhbiBrZWVwIG9wZW4KKyAgICAgKiB0byBlYWNoIHBlZXIgaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhJZGxlKCkgeworICAgICAgICByZXR1cm4gX21heElkbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IGFyZSB1c2VkIGZvcgorICAgICAqIHRyYW5zbWl0dGluZyBwYWNrZXRzIHRvIHBlZXJzIGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUJyb2FkY2FzdFRocmVhZHMoaW50IG51bUJyb2FkY2FzdFRocmVhZHMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChfYnJvYWRjYXN0VGhyZWFkcykgeworICAgICAgICAgICAgaW50IGN1ciA9IF9icm9hZGNhc3RUaHJlYWRzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChjdXIgPiBudW1Ccm9hZGNhc3RUaHJlYWRzKSB7CisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBleHRyYSB3b3JrZXIgdGhyZWFkcyBzbyB0aGV5IHN0b3AgdGhlbXNlbHZlcworICAgICAgICAgICAgICAgIC8vIFRocmVhZHMgd2lsbCBub3QgZW5kIHVudGlsIHRoZXkgc2VuZCBhbm90aGVyIHBrLgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBudW1Ccm9hZGNhc3RUaHJlYWRzOyBpIDwgY3VyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0V29ya2VyVGhyZWFkIHdvcmtlciA9IChCcm9hZGNhc3RXb3JrZXJUaHJlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICBfYnJvYWRjYXN0VGhyZWFkcy5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtlci5zZXRSdW5uaW5nKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ciA8IG51bUJyb2FkY2FzdFRocmVhZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYWRkaXRpb25hbCB3b3JrZXIgdGhyZWFkcworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjdXI7IGkgPCBudW1Ccm9hZGNhc3RUaHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0V29ya2VyVGhyZWFkIHd0ID0gbmV3IEJyb2FkY2FzdFdvcmtlclRocmVhZCgpOworICAgICAgICAgICAgICAgICAgICB3dC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHd0LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIF9icm9hZGNhc3RUaHJlYWRzLmFkZCh3dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IGFyZSB1c2VkIGZvcgorICAgICAqIHRyYW5zbWl0dGluZyBwYWNrZXRzIHRvIHBlZXJzIGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtQnJvYWRjYXN0VGhyZWFkcygpIHsKKyAgICAgICAgcmV0dXJuIF9icm9hZGNhc3RUaHJlYWRzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBvZiBwZWVycyB0byB3aGljaCB0aGlzIHByb3ZpZGVyIHdpbGwKKyAgICAgKiBzZW5kIGV2ZW50cyB0by4gVGhlIHBlZXJzIGFyZSBzZW1pY29sb24tc2VwYXJhdGVkIDxjb2RlPm5hbWVzPC9jb2RlPgorICAgICAqIGxpc3QgaW4gdGhlIGZvcm0gb2YgIm15aG9zdDE6cG9ydEE7bXlob3N0Mjpwb3J0QiIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc2VzKFN0cmluZyBuYW1lcykKKyAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTllJLiBDb3VsZCBsb29rIGZvciBlcXVpdmFsZW5jZSBvZiBhZGRyZXNzZXMgYW5kIGF2b2lkCisgICAgICAgIC8vIGNoYW5naW5nIHRob3NlIHRoYXQgZGlkbid0IGNoYW5nZS4KKworICAgICAgICBfYWRkcmVzc2VzTG9jay5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfYWRkcmVzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICgoSG9zdEFkZHJlc3MpIGl0ZXIubmV4dCgpKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gdG9rcyA9IFN0cmluZ3Muc3BsaXQobmFtZXMsICI7IiwgMCk7CisgICAgICAgICAgICBfYWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdCh0b2tzLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsaG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgICAgICAgICAgU3RyaW5nIGxvY2FsaG9zdE5hbWUgPSBsb2NhbGhvc3QuZ2V0SG9zdE5hbWUoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSB0b2tzW2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0bmFtZTsKKyAgICAgICAgICAgICAgICBpbnQgdG1wUG9ydDsKKyAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBob3N0LmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0LnN1YnN0cmluZygwLCBjb2xvbik7CisgICAgICAgICAgICAgICAgICAgIHRtcFBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKGNvbG9uICsgMSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdDsKKyAgICAgICAgICAgICAgICAgICAgdG1wUG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgdG1wQWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBibGVhaXI6IEZvciBlYWNoIGFkZHJlc3Mgd2Ugd291bGQgcmF0aGVyIG1ha2UgdXNlIG9mCisgICAgICAgICAgICAgICAgLy8gdGhlIGpkazEuNCBpc0xpbmtMb2NhbEFkZHJlc3MgKCkgfHwgaXNMb29wYmFja0FkZHJlc3MgKCkuCisgICAgICAgICAgICAgICAgLy8gKFRob3VnaCBpbiBwcmFjdGljZSBvbiB3aW4zMiB0aGV5IGRvbid0IHdvcmsgYW55d2F5cyEpCisgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSB3aWxsIGNoZWNrIGhvc3RuYW1lLiBOb3QgcGVyZmVjdCwgYnV0CisgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBtYXRjaCBvZnRlbiBlbm91Z2ggKHBlb3BsZSB3aWxsIHR5cGljYWxseQorICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgRE5TIG1hY2hpbmUgbmFtZXMgYW5kIGJlIGN1dHRpbmcvcGFzdGluZy4pCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsaG9zdE5hbWUuZXF1YWxzKGhvc3RuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmluZyBtYXRjaGVzIHRoZSBob3N0bmFtZSBmb3IgZm9yIG91cnNlbHZlcywgd2UKKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBzZW5kIG91cnNlbHZlcyBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJ0Y3AtYWRkcmVzcy1hc3NlbGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEFkZHJlc3MuZ2V0SG9zdE5hbWUoKSArICI6IiArIHRtcFBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEhvc3RBZGRyZXNzIG5ld0FkZHJlc3MgPSBuZXcgSG9zdEFkZHJlc3MoaG9zdCk7CisgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzZXMuYWRkKG5ld0FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShzX2xvYy5nZXQoInRjcC1hZGRyZXNzLXNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkcmVzcy5fYWRkcmVzcy5nZXRIb3N0TmFtZSgpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3QWRkcmVzcy5fcG9ydCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX2FkZHJlc3Nlc0xvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tIENvbmZpZ3VyYWJsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBwZXJmb3JtIGFjdGlvbnMgaW4KKyAgICAgKiB7QGxpbmsgQ29uZmlndXJhYmxlI2VuZENvbmZpZ3VyYXRpb259IG11c3QgaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHN1cGVyLmVuZENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzX3BvcnRMaXN0ZW5lck1hcCkgeworICAgICAgICAgICAgLy8gc2VlIGlmIGEgbGlzdGVuZXIgZXhpc3RzIGZvciB0aGlzIHBvcnQuCisgICAgICAgICAgICBfbGlzdGVuZXIgPSAoVENQUG9ydExpc3RlbmVyKSBzX3BvcnRMaXN0ZW5lck1hcC5nZXQKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YoX3BvcnQpKTsKKworICAgICAgICAgICAgaWYgKF9saXN0ZW5lciA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgKCFfbGlzdGVuZXIuaXNSdW5uaW5nKCkgJiYgX2xpc3RlbmVyLl9wb3J0ID09IF9wb3J0KSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0ZW5lciA9IG5ldyBUQ1BQb3J0TGlzdGVuZXIoX3BvcnQsIGxvZyk7CisgICAgICAgICAgICAgICAgICAgIF9saXN0ZW5lci5saXN0ZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgc19wb3J0TGlzdGVuZXJNYXAucHV0KFN0cmluZy52YWx1ZU9mKF9wb3J0KSwgX2xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihzX2xvYy5nZXQoInRjcC1pbml0LWV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihfcG9ydCkpLCBlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9saXN0ZW5lci5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIGlmIChfbGlzdGVuZXIuX3BvcnQgIT0gX3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIGFibGUgdG8gaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihzX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICgidGNwLW5vdC1lcXVhbCIsIFN0cmluZy52YWx1ZU9mKF9wb3J0KSkpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHNfbG9jLmdldCgidGNwLWxpc3RlbmVyLWJyb2tlbiIpKTsKKyAgICAgICAgICAgIF9saXN0ZW5lci5hZGRQcm92aWRlcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIF9hZGRyZXNzZXNMb2NrLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEhvc3RBZGRyZXNzIGN1ckFkZHJlc3M7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfYWRkcmVzc2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgY3VyQWRkcmVzcyA9IChIb3N0QWRkcmVzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgY3VyQWRkcmVzcy5zZXRNYXhBY3RpdmUoX21heEFjdGl2ZSk7CisgICAgICAgICAgICAgICAgY3VyQWRkcmVzcy5zZXRNYXhJZGxlKF9tYXhJZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9hZGRyZXNzZXNMb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLSBSZW1vdGVDb21taXRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKKyAgICAvLyBwcmUgMy4zLjQJPSA8bm8gdmVyc2lvbiBudW1iZXIgdHJhbnNtaXR0ZWQ+CisgICAgLy8gMy4zIFByZXZpZXcgCT0gMHgxNDI4YWNmZDsKKyAgICAvLyAzLjQgCQkJPSAweDE0MjhhY2ZmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUFJPVE9DT0xfVkVSU0lPTiA9IDB4MTQyOGFjZmY7CisKKyAgICBwdWJsaWMgdm9pZCBicm9hZGNhc3QoUmVtb3RlQ29tbWl0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJ1aWxkIGEgcGFja2V0IG5vdGlmeWluZyBvdGhlciBKVk1zIG9mIG9iamVjdCBjaGFuZ2VzLgorICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKworICAgICAgICAgICAgb29zLndyaXRlTG9uZyhQUk9UT0NPTF9WRVJTSU9OKTsKKyAgICAgICAgICAgIG9vcy53cml0ZUxvbmcoX2lkKTsKKyAgICAgICAgICAgIG9vcy53cml0ZUludChfcG9ydCk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QoX2xvY2FsaG9zdCk7CisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QoZXZlbnQpOworICAgICAgICAgICAgb29zLmZsdXNoKCk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChfYnJvYWRjYXN0VGhyZWFkcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2VuZFVwZGF0ZVBhY2tldChieXRlcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2Jyb2FkY2FzdFF1ZXVlLmFkZFBhY2tldChieXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJ0Y3AtcGF5bG9hZC1jcmVhdGUtZXJyb3IiKSwgaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBwYWNrZXQgdG8gb3RoZXIgbWFjaGluZXMgaW4gdGhpcworICAgICAqIHByb3ZpZGVyIGNsdXN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRVcGRhdGVQYWNrZXQoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIF9hZGRyZXNzZXNMb2NrLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF9hZGRyZXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICgoSG9zdEFkZHJlc3MpIGl0ZXIubmV4dCgpKS5zZW5kVXBkYXRlUGFja2V0KGJ5dGVzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9hZGRyZXNzZXNMb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChfbGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF9saXN0ZW5lci5yZW1vdmVQcm92aWRlcih0aGlzKTsKKworICAgICAgICAvLyBSZW1vdmUgQnJvYWRjYXN0IFRocmVhZHMgdGhlbiBjbG9zZSBzb2NrZXRzLgorICAgICAgICBfYnJvYWRjYXN0UXVldWUuY2xvc2UoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBfYnJvYWRjYXN0VGhyZWFkcyB0byBnZXQgY2xlYW5lZCB1cC4KKyAgICAgICAgd2hpbGUoIV9icm9hZGNhc3RUaHJlYWRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBfYWRkcmVzc2VzTG9jay5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfYWRkcmVzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAoKEhvc3RBZGRyZXNzKSBpdGVyLm5leHQoKSkuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9hZGRyZXNzZXNMb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBjbGFzcyB0byBob2xkIG1lc3NhZ2VzIHRvIGJlIHNlbnQuIFRoaXMKKyAgICAgKiBhbGxvd3MgY2FsbHMgdG8gYnJvYWRjYXN0ICgpIHRvIHJldHVybiB3aXRob3V0CisgICAgICogd2FpdGluZyBmb3IgdGhlIHNlbmQgdG8gY29tcGxldGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnJvYWRjYXN0UXVldWUgeworCisgICAgICAgIHByaXZhdGUgTGlua2VkTGlzdCBfcGFja2V0UXVldWUgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2Nsb3NlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIF9jbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2Nsb3NlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQYWNrZXQoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgICAgICBfcGFja2V0UXVldWUuYWRkTGFzdChieXRlcyk7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBieXRlcyBkZWZpbmluZyB0aGUgcGFja2V0IHRvIHByb2Nlc3MsIG9yCisgICAgICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYnl0ZVtdIHJlbW92ZVBhY2tldCgpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgLy8gb25seSB3YWl0IGlmIHRoZSBxdWV1ZSBpcyBzdGlsbCBvcGVuLiBUaGlzIGFsbG93cyBwcm9jZXNzaW5nCisgICAgICAgICAgICAvLyBvZiBldmVudHMgaW4gdGhlIHF1ZXVlIHRvIGNvbnRpbnVlLCB3aGlsZSBhdm9pZGluZyBzbGVlcGluZworICAgICAgICAgICAgLy8gZHVyaW5nIHNodXRkb3duLgorICAgICAgICAgICAgd2hpbGUgKCFfY2xvc2VkICYmIF9wYWNrZXRRdWV1ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgaWYgKF9wYWNrZXRRdWV1ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIF9wYWNrZXRRdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyZWFkcyB0byBicm9hZGNhc3QgcGFja2V0cyBwbGFjZWQgaW4gdGhlIHtAbGluayBCcm9hZGNhc3RRdWV1ZX0uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBCcm9hZGNhc3RXb3JrZXJUaHJlYWQKKyAgICAgICAgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfa2VlcFJ1bm5pbmcgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHdoaWxlIChfa2VlcFJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmxvY2sgdW50aWwgdGhlcmUgaXMgYSBwYWNrZXQgdG8gc2VuZCwgb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gdW50aWwgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gX2Jyb2FkY2FzdFF1ZXVlLnJlbW92ZVBhY2tldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRVcGRhdGVQYWNrZXQoYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfYnJvYWRjYXN0UXVldWUuaXNDbG9zZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9rZWVwUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5kIHRoZSB0aHJlYWQuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UnVubmluZyhib29sZWFuIGtlZXBSdW5uaW5nKSB7CisgICAgICAgICAgICBfa2VlcFJ1bm5pbmcgPSBrZWVwUnVubmluZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIF9icm9hZGNhc3RUaHJlYWRzLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3BvbnNpYmxlIGZvciBsaXN0ZW5pbmcgZm9yIGluY29taW5nIHBhY2tldHMgYW5kIHByb2Nlc3NpbmcgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUQ1BQb3J0TGlzdGVuZXIKKyAgICAgICAgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2cgX2xvZzsKKyAgICAgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgX3JlY2VpdmVTb2NrZXQ7CisgICAgICAgIHByaXZhdGUgVGhyZWFkIF9hY2NlcHRUaHJlYWQ7CisgICAgICAgIHByaXZhdGUgU2V0IF9yZWNlaXZlclRocmVhZHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFNldCBfcHJvdmlkZXJzID0gbmV3IEhhc2hTZXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FjaGUgdGhlIGxvY2FsIElQIGFkZHJlc3MKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9sb2NhbGhvc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb3J0IHRoYXQgdGhpcyBsaXN0ZW5lciBzaG91bGQgbGlzdGVuIG9uLiBDb25maWd1cmVkCisgICAgICAgICAqIGJ5IFRDUFJlbW90ZUNvbW1pdFByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgX3BvcnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNob3VsZCBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gb25jZSB0aGUgbGlzdGVuZXIgaXMgbGlzdGVuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9pc1J1bm5pbmcgPSBmYWxzZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgbmV3IFRDUFBvcnRMaXN0ZW5lciBjb25maWd1cmVkIHRvIHVzZSB0aGUgc3BlY2lmaWVkIHBvcnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFRDUFBvcnRMaXN0ZW5lcihpbnQgcG9ydCwgTG9nIGxvZykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfbG9nID0gbG9nOworICAgICAgICAgICAgX3JlY2VpdmVTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KF9wb3J0KTsKKyAgICAgICAgICAgIF9sb2NhbGhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRBZGRyZXNzKCk7CisKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy5pbmZvKHNfbG9jLmdldCgidGNwLXN0YXJ0LWxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoX3BvcnQpKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbGlzdGVuKCkgeworICAgICAgICAgICAgX2FjY2VwdFRocmVhZCA9IG5ldyBUaHJlYWQodGhpcyk7CisgICAgICAgICAgICBfYWNjZXB0VGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIF9hY2NlcHRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbGwgcHJvdmlkZXJzIGFkZGVkIGhlcmUgd2lsbCBiZSBub3RpZmllZCBvZiBhbnkgaW5jb21pbmcKKyAgICAgICAgICogcHJvdmlkZXIgbWVzc2FnZXMuIFRoZXJlIHdpbGwgYmUgb25lIG9mIHRoZXNlIHBlcgorICAgICAgICAgKiBCcm9rZXJGYWN0b3J5IGluIGEgZ2l2ZW4gSlZNLgorICAgICAgICAgKiB7QGxpbmsgVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIjZW5kQ29uZmlndXJhdGlvbn0gaW52b2tlcworICAgICAgICAgKiA8Y29kZT5hZGRQcm92aWRlcjwvY29kZT4gd2l0aCA8Y29kZT50aGlzPC9jb2RlPiB1cG9uCisgICAgICAgICAqIGNvbXBsZXRpb24gb2YgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhZGRQcm92aWRlcihUQ1BSZW1vdGVDb21taXRQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChfcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgX3Byb3ZpZGVycy5hZGQocHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBhIHByb3ZpZGVyIGZyb20gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRvIG5vdGlmeSBvZgorICAgICAgICAgKiBjb21taXQgZXZlbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm92aWRlcgorICAgICAgICAgICAgKFRDUFJlbW90ZUNvbW1pdFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKF9wcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICBfcHJvdmlkZXJzLnJlbW92ZShwcm92aWRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcHJvdmlkZXIgbGlzdCBpcyBlbXB0eSwgc2h1dCBkb3duIHRoZSB0aHJlYWQuCisgICAgICAgICAgICAgICAgaWYgKF9wcm92aWRlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgX2lzUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgX3JlY2VpdmVTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKHNfbG9jLmdldCgidGNwLWNsb3NlLWVycm9yIiksIGlvZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX2FjY2VwdFRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChfcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pc1J1bm5pbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKF9wcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICBfaXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU29ja2V0IHMgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKF9pc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgLy8gQmxvY2ssIHdhaXRpbmcgdG8gYWNjZXB0IG5ldyBjb25uZWN0aW9uIGZyb20gYSBwZWVyCisgICAgICAgICAgICAgICAgICAgIHMgPSBfcmVjZWl2ZVNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy50cmFjZShzX2xvYy5nZXQoInRjcC1yZWNlaXZlZC1jb25uZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IiArIHMuZ2V0UG9ydCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZVNvY2tldEhhbmRsZXIgc2ggPSBuZXcgUmVjZWl2ZVNvY2tldEhhbmRsZXIocyk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZCByZWNlaXZlclRocmVhZCA9IG5ldyBUaHJlYWQoc2gpOworICAgICAgICAgICAgICAgICAgICByZWNlaXZlclRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIF9yZWNlaXZlclRocmVhZHMuYWRkKHJlY2VpdmVyVGhyZWFkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgU29ja2V0RXhjZXB0aW9uKSB8fCBfaXNSdW5uaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihzX2xvYy5nZXQoInRjcC1hY2NlcHQtZXJyb3IiKSwgZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm9taW5hbCBjYXNlIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbikgYmVjYXVzZSBjbG9zZSAoKQorICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyBfYWNjZXB0VGhyZWFkLmludGVycnVwdCAoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oc19sb2MuZ2V0KCJ0Y3AtY2xvc2UtZXJyb3IiKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIGxpc3RlbmluZy4gSW50ZXJydXB0IGFueSB3b3JrZXIgdGhyZWFkcy4KKyAgICAgICAgICAgIFRocmVhZCB3b3JrZXI7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfcmVjZWl2ZXJUaHJlYWRzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgd29ya2VyID0gKFRocmVhZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgLy8gRllJLCB0aGUgd29ya2VyIHRocmVhZHMgYXJlIGJsb2NrZWQKKyAgICAgICAgICAgICAgICAvLyByZWFkaW5nIGZyb20gdGhlIHNvY2tldCdzIElucHV0U3RyZWFtLiBJbnB1dFN0cmVhbXMKKyAgICAgICAgICAgICAgICAvLyBhcmVuJ3QgaW50ZXJydXB0YWJsZSwgc28gdGhpcyBpbnRlcnJ1cHQgaXNuJ3QKKyAgICAgICAgICAgICAgICAvLyByZWFsbHkgZ29pbmcgdG8gYmUgZGVsaXZlcmVkIHVudGlsIHNvbWV0aGluZyBicmVha3MKKyAgICAgICAgICAgICAgICAvLyB0aGUgSW5wdXRTdHJlYW0uCisgICAgICAgICAgICAgICAgd29ya2VyLmludGVycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChfcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc1J1bm5pbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBfcmVjZWl2ZVNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihzX2xvYy5nZXQoInRjcC1jbG9zZS1lcnJvciIpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2lzUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2cudHJhY2Uoc19sb2MuZ2V0KCJ0Y3AtY2xvc2UtbGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgX3BvcnQgKyAiIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFV0aWxpdHkgY2xhc3MgdGhhdCBhY3RzIGFzIGEgd29ya2VyIHRocmVhZCB0byByZWNlaXZlIEV2ZW50cworICAgICAgICAgKiBmcm9tIGJyb2FkY2FzdGVycy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgUmVjZWl2ZVNvY2tldEhhbmRsZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIF9pbjsKKyAgICAgICAgICAgIHByaXZhdGUgU29ja2V0IF9zOworCisgICAgICAgICAgICBwcml2YXRlIFJlY2VpdmVTb2NrZXRIYW5kbGVyKFNvY2tldCBzKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHRoZSByZWNlaXZpbmcgZW5kIGFuZCB3ZSBkb24ndCBzZW5kIGFueSBtZXNzYWdlcworICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gdGhlIGJyb2FkY2FzdGVyLiBUdXJuIG9mZiBOYWdsZSdzIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIHNlbmQgYWNrIHBhY2tldHMgd2l0aG91dCB3YWl0aW5nLgorICAgICAgICAgICAgICAgIF9zID0gczsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBfcy5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgICAgICAgICAgICAgICAgICBfaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLmluZm8oc19sb2MuZ2V0KCJ0Y3Atc29ja2V0LW9wdGlvbi1lcnJvciIpLCBpb2UpOworICAgICAgICAgICAgICAgICAgICBfcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKHNfbG9jLmdldCgidGNwLXJlY2VpdmUtZXJyb3IiKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIF9zID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpZiAoX3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHdoaWxlIChfaXNSdW5uaW5nICYmIF9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBibG9jayBvdXIgdGhyZWFkLCB3YWl0aW5nIHRvIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IEV2ZW50LW9iamVjdC1tZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKF9pbik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlb2YpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVPRkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBwZWVyIGlzIHByb3Blcmx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIGl0cyBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvZy50cmFjZShzX2xvYy5nZXQoInRjcC1jbG9zZS1zb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcy5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjoiICsgX3MuZ2V0UG9ydCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oc19sb2MuZ2V0KCJ0Y3AtcmVjZWl2ZS1lcnJvciIpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIHJlY2VpdmluZyBvbiB0aGlzIHNvY2tldCBhbmQgdGhpcyB3b3JrZXIKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWQgaXMgdGVybWluYXRpbmcuCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgX2luLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgX3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihzX2xvYy5nZXQoInRjcC1jbG9zZS1zb2NrZXQtZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgX3MuZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfcy5nZXRQb3J0KCkpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUHJvY2VzcyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19IGNvbnRhaW5pbmcgb2JqZWN0cyB3cml0dGVuCisgICAgICAgICAgICAgKiBieSB7QGxpbmsgVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIjYnJvYWRjYXN0KFJlbW90ZUNvbW1pdEV2ZW50KX0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGUoSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgdGhlIG5leHQKKyAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSAKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlcmlhbGl6YXRpb24uQ2xhc3NSZXNvbHZpbmdPYmplY3RJbnB1dFN0cmVhbShpbik7CisKKyAgICAgICAgICAgICAgICBsb25nIHByb3RvY29sVmVyc2lvbiA9IG9pcy5yZWFkTG9uZygpOworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbFZlcnNpb24gIT0gUFJPVE9DT0xfVkVSU0lPTikgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihzX2xvYy5nZXQoInRjcC13cm9uZy12ZXJzaW9uLWVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcy5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfcy5nZXRQb3J0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxvbmcgc2VuZGVySWQgPSBvaXMucmVhZExvbmcoKTsKKyAgICAgICAgICAgICAgICBpbnQgc2VuZGVyUG9ydCA9IG9pcy5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbmRlckFkZHJlc3MgPSAoYnl0ZVtdKSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1pdEV2ZW50IHJjZSA9IChSZW1vdGVDb21taXRFdmVudCkgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIF9sb2cudHJhY2Uoc19sb2MuZ2V0KCJ0Y3AtcmVjZWl2ZWQtZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX3MuZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfcy5nZXRQb3J0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGZyb21TZWxmID0gc2VuZGVyUG9ydCA9PSBfcG9ydCAmJgorICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHNlbmRlckFkZHJlc3MsIF9sb2NhbGhvc3QpOworICAgICAgICAgICAgICAgIFRDUFJlbW90ZUNvbW1pdFByb3ZpZGVyIHByb3ZpZGVyOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoX3Byb3ZpZGVycykgeworICAgICAgICAgICAgICAgICAgICAvLyBibGVhaXI6IFdlJ3JlIGl0ZXJhdGluZywgYnV0IGN1cnJlbmx0eSB0aGVyZSBjYW4gcmVhbGx5CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYmUgYSBzaW5nbGUgcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF9wcm92aWRlcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSAoVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbmRlcklkICE9IHByb3ZpZGVyLl9pZCB8fCAhZnJvbVNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuZXZlbnRNYW5hZ2VyLmZpcmVFdmVudChyY2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBjbGFzcyB0byBzdG9yZSBhbiBJbmV0QWRkcmVzcyBhbmQgYW4gaW50LiBOb3QgdXNpbmcKKyAgICAgKiBJbmV0U29ja2V0QWRkcmVzcyBiZWNhdXNlIGl0J3MgYSBKREsxLjQgQVBJLiBUaGlzIGFsc28KKyAgICAgKiBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBzb2NrZXQocykgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEhvc3RBZGRyZXNzIHsKKworICAgICAgICBwcml2YXRlIEluZXRBZGRyZXNzIF9hZGRyZXNzOworICAgICAgICBwcml2YXRlIGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIF90aW1lTGFzdEVycm9yOyAvLyBtaWxsaXMKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9pc0F2YWlsYWJsZTsgLy8gaXMgcGVlciB0aG91Z2h0IHRvIGJlIHVwCisgICAgICAgIHByaXZhdGUgaW50IF9pbmZvc0lzc3VlZCA9IDA7IC8vIGxpbWl0IGxvZyBlbnRyaWVzCisKKyAgICAgICAgcHJpdmF0ZSBHZW5lcmljT2JqZWN0UG9vbCBfc29ja2V0UG9vbDsgLy8gcmV1c2FibGUgb3BlbiBzb2NrZXRzCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhIG5ldyBob3N0IGFkZHJlc3MgZnJvbSBhIHN0cmluZyBvZiB0aGUgZm9ybQorICAgICAgICAgKiAiaG9zdDpwb3J0IiBvciBvZiB0aGUgZm9ybSAiaG9zdCIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEhvc3RBZGRyZXNzKFN0cmluZyBob3N0KQorICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjb2xvbiA9IGhvc3QuaW5kZXhPZignOicpOworICAgICAgICAgICAgaWYgKGNvbG9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdC5zdWJzdHJpbmcoMCwgY29sb24pKTsKKyAgICAgICAgICAgICAgICBfcG9ydCA9IEludGVnZXIucGFyc2VJbnQoaG9zdC5zdWJzdHJpbmcoY29sb24gKyAxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGhvc3QpOworICAgICAgICAgICAgICAgIF9wb3J0ID0gREVGQVVMVF9QT1JUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLTEgbWF4IHdhaXQgPT0gYXMgbG9uZyBhcyBpdCB0YWtlcworICAgICAgICAgICAgX3NvY2tldFBvb2wgPSBuZXcgR2VuZXJpY09iamVjdFBvb2wKKyAgICAgICAgICAgICAgICAobmV3IFNvY2tldFBvb2xhYmxlT2JqZWN0RmFjdG9yeSgpLCBfbWF4QWN0aXZlLAorICAgICAgICAgICAgICAgICAgICBHZW5lcmljT2JqZWN0UG9vbC5XSEVOX0VYSEFVU1RFRF9CTE9DSywgLTEpOworICAgICAgICAgICAgX2lzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRNYXhBY3RpdmUoaW50IG1heEFjdGl2ZSkgeworICAgICAgICAgICAgX3NvY2tldFBvb2wuc2V0TWF4QWN0aXZlKG1heEFjdGl2ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0TWF4SWRsZShpbnQgbWF4SWRsZSkgeworICAgICAgICAgICAgX3NvY2tldFBvb2wuc2V0TWF4SWRsZShtYXhJZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHBvb2wgb2Ygc29ja2V0cyB0byB0aGlzIHBlZXIuIFRoaXMKKyAgICAgICAgICAgIC8vIHdpbGwgY2xvc2UgYWxsIHNvY2tldHMgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9zb2NrZXRQb29sLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNfbG9jLmdldCgidGNwLWNsb3NlLXBvb2wtZXJyb3IiKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRVcGRhdGVQYWNrZXQoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgICAgICBpZiAoIV9pc0F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaWYgKG5vdyAtIF90aW1lTGFzdEVycm9yIDwgX3JlY292ZXJ5VGltZU1pbGxpcykKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU29ja2V0IHMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzID0gZ2V0U29ja2V0KCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBvcy53cml0ZShieXRlcyk7CisgICAgICAgICAgICAgICAgb3MuZmx1c2goKTsKKworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJ0Y3Atc2VudC11cGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSArICI6IiArIF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yocy5nZXRMb2NhbFBvcnQoKSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2lzQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfaW5mb3NJc3N1ZWQgPSAwOworICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgc29ja2V0IHRvIHRoZSBwb29sOyB0aGUgc29ja2V0IGlzCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgZ29vZC4KKyAgICAgICAgICAgICAgICByZXR1cm5Tb2NrZXQocyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBzZW5kaW5nIHRvIHRoZSBwZWVyLgorICAgICAgICAgICAgICAgIC8vIFRoZSBPUyBzb2NrZXQgdGhhdCB3YXMgYmVpbmcgdXNlZCBpcyBjYW4gbm8gbG9uZ2VyCisgICAgICAgICAgICAgICAgLy8gYmUgdXNlZC4KKyAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KHMpOworICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJBbGxTb2NrZXRzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2lzQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBhIHdhcm5pbmcsIHRoZSBwZWVyIHdhcyB1cCBhbmQgaGFzIG5vdyBnb25lIGRvd24KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNfbG9jLmdldCgidGNwLXNlbmQtZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIgKyBfcG9ydCksIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9pc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAvLyBPbmNlIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgd2Ugd2lsbCBsb2cgYW5vdGhlciB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgIF90aW1lTGFzdEVycm9yID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIF90aW1lTGFzdEVycm9yID4gX3JlY292ZXJ5VGltZU1pbGxpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbmZvc0lzc3VlZCA8IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbm91Z2ggdGltZSBoYXMgcGFzc2VkLCBhbmQgcGVlciBpcyBzdGlsbCBkb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpbWVMYXN0RXJyb3IgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3ZXJlIHRyeWluZyB0byByZWVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgZmFpbGVkIGFnYWluLiBMb2cgYSBtZXNzYWdlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3dlciBzZXZlcml0eS4gVGhpcyBsb2cgd2lsbCBvY2N1ciBwZXJpb2RpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgNSB0aW1lcyB1bnRpbCB0aGUgcGVlciBjb21lcyBiYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNfbG9jLmdldCgidGNwLXNlbmQtc3RpbGwtZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSArICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX3BvcnQpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm9zSXNzdWVkKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNvY2tldCBnZXRTb2NrZXQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gKFNvY2tldCkgX3NvY2tldFBvb2wuYm9ycm93T2JqZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmV0dXJuU29ja2V0KFNvY2tldCBzKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfc29ja2V0UG9vbC5yZXR1cm5PYmplY3Qocyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJBbGxTb2NrZXRzKCkgeworICAgICAgICAgICAgX3NvY2tldFBvb2wuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjbG9zZVNvY2tldChTb2NrZXQgcykgeworICAgICAgICAgICAgLy8gQWxsIHNvY2tldHMgY29tZSBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAgLy8gVGhpcyBzb2NrZXQgaXMgbm8gbG9uZ2VyIHVzYWJsZSwgc28gZGVsZXRlIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLyBwb29sLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfc29ja2V0UG9vbC5pbnZhbGlkYXRlT2JqZWN0KHMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGYWN0b3J5IGZvciBwb29sZWQgc29ja2V0cy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgU29ja2V0UG9vbGFibGVPYmplY3RGYWN0b3J5CisgICAgICAgICAgICBpbXBsZW1lbnRzIFBvb2xhYmxlT2JqZWN0RmFjdG9yeSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbWFrZU9iamVjdCgpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoX2FkZHJlc3MsIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKHNfbG9jLmdldCgidGNwLW9wZW4tY29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzcyArICI6IiArIF9wb3J0LCAiIiArIHMuZ2V0TG9jYWxQb3J0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIC8vIHNpbGVudENsb3NlICgpLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFNvY2tldCBzID0gKFNvY2tldCkgb2JqOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2Uoc19sb2MuZ2V0KCJ0Y3AtY2xvc2Utc2VuZGluZy1zb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzICsgIjoiICsgX3BvcnQsICIiICsgcy5nZXRMb2NhbFBvcnQoKSkpOworICAgICAgICAgICAgICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc19sb2MuZ2V0KCJ0Y3AtY2xvc2Utc29ja2V0LWVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIgKyBfcG9ydCksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZU9iamVjdCAoT2JqZWN0IHZhbHVlKQorCQkJeworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBwYXNzaXZhdGVPYmplY3QgKE9iamVjdCB2YWx1ZSkKKwkJCXsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVHJhbnNhY3Rpb25FdmVudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9UcmFuc2FjdGlvbkV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ZWI3YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVHJhbnNhY3Rpb25FdmVudC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlcjsKKworLyoqCisgKiBBIHRyYW5zYWN0aW9uYWwgZXZlbnQuIFRoZSBldmVudCBzb3VyY2UgaXMgdGhlIHtAbGluayBCcm9rZXJ9IHdob3NlCisgKiB0cmFuc2FjdGlvbiBzdGF0ZSBjaGFuZ2VkLgorICoKKyAqIEBzaW5jZSAwLjMuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uRXZlbnQKKyAgICBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgc2lnbmlmeWluZyB0aGF0IGEgdHJhbnNhY3Rpb24gaGFzIGp1c3QgYmVndW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVJfQkVHSU4gPSAwOworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSBzaWduaWZ5aW5nIHRoYXQgY2hhbmdlcyBhcmUgYWJvdXQgdG8gYmUgZmx1c2hlZCB0byB0aGUKKyAgICAgKiBkYXRhc3RvcmUuIFRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IGEgY29tbWl0IGlzIHRha2luZyBwbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUZPUkVfRkxVU0ggPSAxOworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSBzaWduaWZ5aW5nIHRoYXQgY2hhbmdlcyBoYXZlIGJlZW4gZmx1c2hlZCB0byB0aGUgZGF0YXN0b3JlLgorICAgICAqIFRoaXMgZXZlbnQgaXMgb25seSBmaXJlZCBpZiBmbHVzaGluZyBpcyBzdWNjZXNzZnVsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFGVEVSX0ZMVVNIID0gMjsKKworICAgIC8qKgorICAgICAqIEV2ZW50IHR5cGUgc2lnbmlmeWluZyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQuCisgICAgICogVGhpcyB3aWxsIGJlIGZpcmVkIGJlZm9yZSB0aGUge0BsaW5rICNCRUZPUkVfRkxVU0h9IGV2ZW50IGZvciB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiwgc28gdGhhdCB5b3UgY2FuIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBmbHVzaGVzIGZvciBjb21taXRzCisgICAgICogYW5kIG90aGVyIGZsdXNoZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVGT1JFX0NPTU1JVCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHNpZ25pZnlpbmcgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9DT01NSVQgPSA0OworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSBzaWduaWZ5aW5nIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9ST0xMQkFDSyA9IDU7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHNpZ25pZnlpbmcgdGhhdCBhbGwgc3RhdGUgdHJhbnNpdGlvbnMgaGF2ZSBiZWVuIG1hZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVJfU1RBVEVfVFJBTlNJVElPTlMgPSA2OworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSBzaWduaWZ5aW5nIHRoYXQgdGhlIGNvbW1pdCBoYXMgY29tcGxldGV5IGVuZGVkIGFuZCB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiBpcyBubyBsb25nZXIgYWN0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFGVEVSX0NPTU1JVF9DT01QTEVURSA9IDc7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHNpZ25pZnlpbmcgdGhhdCB0aGUgcm9sbGJhY2sgaGFzIGNvbXBsZXRleSBlbmRlZCBhbmQgdGhlCisgICAgICogdHJhbnNhY3Rpb24gaXMgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRlRFUl9ST0xMQkFDS19DT01QTEVURSA9IDg7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBfdHlwZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBmaW5hbCBDb2xsZWN0aW9uIF9vYmpzOworICAgIHByaXZhdGUgdHJhbnNpZW50IGZpbmFsIENvbGxlY3Rpb24gX2FkZENsc3M7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgZmluYWwgQ29sbGVjdGlvbiBfdXBkYXRlQ2xzczsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBmaW5hbCBDb2xsZWN0aW9uIF9kZWxldGVDbHNzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnJva2VyIHRoZSBldmVudCBzb3VyY2UKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBvYmpzIHRyYW5zYWN0aW9uYWwgb2JqZWN0cworICAgICAqIEBwYXJhbSBhZGRDbHNzIGNsYXNzZXMgb2YgYWRkZWQgaW5zdGFuY2VzCisgICAgICogQHBhcmFtIHVwZGF0ZUNsc3MgY2xhc3NlcyBvZiB1cGRhdGVkIGluc3RhbmNlcworICAgICAqIEBwYXJhbSBkZWxldGVDbHNzIGNsYXNzZXMgb2YgZGVsZXRlZCBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJhbnNhY3Rpb25FdmVudChCcm9rZXIgYnJva2VyLCBpbnQgdHlwZSwKKyAgICAgICAgQ29sbGVjdGlvbiBvYmpzLCBDb2xsZWN0aW9uIGFkZENsc3MsIENvbGxlY3Rpb24gdXBkYXRlQ2xzcywKKyAgICAgICAgQ29sbGVjdGlvbiBkZWxldGVDbHNzKSB7CisgICAgICAgIHN1cGVyKGJyb2tlcik7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICAgICAgX29ianMgPSAob2JqcyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBvYmpzOworICAgICAgICBfYWRkQ2xzcyA9IChhZGRDbHNzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogYWRkQ2xzczsKKyAgICAgICAgX3VwZGF0ZUNsc3MgPSAodXBkYXRlQ2xzcyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IHVwZGF0ZUNsc3M7CisgICAgICAgIF9kZWxldGVDbHNzID0gKGRlbGV0ZUNsc3MgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBkZWxldGVDbHNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVubW9kaWZpYWJsZSBzZXQgb2YgcGVyc2lzdGVuY2UgY2FwYWJsZSBvYmplY3RzCisgICAgICogcGFydGljaXBhdGluZyBpbiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgc2V0IHdpbGwgY29udGFpbiBhbGwgZGlydHkKKyAgICAgKiBvYmplY3RzLCBidXQgbWF5IG5vdCBjb250YWluIGNsZWFuIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VHJhbnNhY3Rpb25hbE9iamVjdHMoKSB7CisgICAgICAgIHJldHVybiBfb2JqczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVubW9kaWZpYWJsZSB0aGUgc2V0IG9mIGNsYXNzZXMgb2YKKyAgICAgKiBwZXJzaXN0ZW5jZSBjYXBhYmxlIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBlcnNpc3RlZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gX2FkZENsc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bm1vZGlmaWFibGUgdGhlIHNldCBvZiBjbGFzc2VzIG9mCisgICAgICogcGVyc2lzdGVuY2UgY2FwYWJsZSBvYmplY3RzIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGUgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VXBkYXRlZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gX3VwZGF0ZUNsc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bm1vZGlmaWFibGUgdGhlIHNldCBvZiBjbGFzc2VzIG9mCisgICAgICogcGVyc2lzdGVuY2UgY2FwYWJsZSBvYmplY3RzIHRoYXQgd2VyZSBkZWxldGVkIGluIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXREZWxldGVkVHlwZXMgKCkKKwl7CisJCXJldHVybiBfZGVsZXRlQ2xzczsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1RyYW5zYWN0aW9uRXZlbnRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1RyYW5zYWN0aW9uRXZlbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNjIzNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVHJhbnNhY3Rpb25FdmVudE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdENvbmN1cnJlbnRFdmVudE1hbmFnZXI7CisKKy8qKgorICogTWFuYWdlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGFuZCBub3RpZnkgdHJhbnNhY3Rpb24gbGlzdGVuZXJzCisgKiBvZiB0cmFuc2FjdGlvbi1yZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjMuMAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25FdmVudE1hbmFnZXIKKyAgICBleHRlbmRzIEFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlciB7CisKKyAgICBwcml2YXRlIGludCBfYmVnaW4gPSAwOworICAgIHByaXZhdGUgaW50IF9mbHVzaCA9IDA7CisgICAgcHJpdmF0ZSBpbnQgX2VuZCA9IDA7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBCZWdpblRyYW5zYWN0aW9uTGlzdGVuZXIpCisgICAgICAgICAgICBfYmVnaW4rKzsKKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRmx1c2hUcmFuc2FjdGlvbkxpc3RlbmVyKQorICAgICAgICAgICAgX2ZsdXNoKys7CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIpCisgICAgICAgICAgICBfZW5kKys7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIGlmICghc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIEJlZ2luVHJhbnNhY3Rpb25MaXN0ZW5lcikKKyAgICAgICAgICAgIF9iZWdpbi0tOworICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBGbHVzaFRyYW5zYWN0aW9uTGlzdGVuZXIpCisgICAgICAgICAgICBfZmx1c2gtLTsKKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRW5kVHJhbnNhY3Rpb25MaXN0ZW5lcikKKyAgICAgICAgICAgIF9lbmQtLTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IGJlZ2luIHRyYW5zYWN0aW9uIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNCZWdpbkxpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIF9iZWdpbiA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IGZsdXNoIHRyYW5zYWN0aW9uIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGbHVzaExpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIF9mbHVzaCA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGVyZSBhcmUgYW55IGVuZCB0cmFuc2FjdGlvbiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRW5kTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gX2VuZCA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZSB0aGUgZ2l2ZW4gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVFdmVudChPYmplY3QgZXZlbnQsIE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBUcmFuc2FjdGlvbkV2ZW50IGV2ID0gKFRyYW5zYWN0aW9uRXZlbnQpIGV2ZW50OworICAgICAgICBzd2l0Y2ggKGV2LmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkV2ZW50LkFGVEVSX0JFR0lOOgorICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIEJlZ2luVHJhbnNhY3Rpb25MaXN0ZW5lcikKKyAgICAgICAgICAgICAgICAgICAgKChCZWdpblRyYW5zYWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKS5hZnRlckJlZ2luKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25FdmVudC5CRUZPUkVfRkxVU0g6CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRmx1c2hUcmFuc2FjdGlvbkxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAoKEZsdXNoVHJhbnNhY3Rpb25MaXN0ZW5lcikgbGlzdGVuZXIpLmJlZm9yZUZsdXNoKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25FdmVudC5BRlRFUl9GTFVTSDoKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBGbHVzaFRyYW5zYWN0aW9uTGlzdGVuZXIpCisgICAgICAgICAgICAgICAgICAgICgoRmx1c2hUcmFuc2FjdGlvbkxpc3RlbmVyKSBsaXN0ZW5lcikuYWZ0ZXJGbHVzaChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uRXZlbnQuQkVGT1JFX0NPTU1JVDoKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBFbmRUcmFuc2FjdGlvbkxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAoKEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKS5iZWZvcmVDb21taXQoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkV2ZW50LkFGVEVSX0NPTU1JVDoKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBFbmRUcmFuc2FjdGlvbkxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAoKEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKS5hZnRlckNvbW1pdChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uRXZlbnQuQUZURVJfUk9MTEJBQ0s6CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRW5kVHJhbnNhY3Rpb25MaXN0ZW5lcikKKyAgICAgICAgICAgICAgICAgICAgKChFbmRUcmFuc2FjdGlvbkxpc3RlbmVyKSBsaXN0ZW5lcikuYWZ0ZXJSb2xsYmFjayhldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uRXZlbnQuQUZURVJfU1RBVEVfVFJBTlNJVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRW5kVHJhbnNhY3Rpb25MaXN0ZW5lcikKKyAgICAgICAgICAgICAgICAgICAgKChFbmRUcmFuc2FjdGlvbkxpc3RlbmVyKSBsaXN0ZW5lcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZnRlclN0YXRlVHJhbnNpdGlvbnMoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkV2ZW50LkFGVEVSX0NPTU1JVF9DT01QTEVURToKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBFbmRUcmFuc2FjdGlvbkxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAoKEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKS5hZnRlckNvbW1pdENvbXBsZXRlKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25FdmVudC5BRlRFUl9ST0xMQkFDS19DT01QTEVURToKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBFbmRUcmFuc2FjdGlvbkxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAoKEVuZFRyYW5zYWN0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFmdGVyUm9sbGJhY2tDb21wbGV0ZShldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1RyYW5zYWN0aW9uTGlzdGVuZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVHJhbnNhY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzVkOTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1RyYW5zYWN0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGxpc3RlbmluZyB0byBhbGwge0BsaW5rIFRyYW5zYWN0aW9uRXZlbnR9cy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjIuNS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHJhbnNhY3Rpb25MaXN0ZW5lcgorICAgIGV4dGVuZHMgQmVnaW5UcmFuc2FjdGlvbkxpc3RlbmVyLCBGbHVzaFRyYW5zYWN0aW9uTGlzdGVuZXIsCisgICAgRW5kVHJhbnNhY3Rpb25MaXN0ZW5lciB7CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMzNhMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBIEV2ZW50czwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHNvbWUgaW50ZXJmYWNlcyBhbmQgdXNlZnVsIGltcGxlbWVudGF0aW9ucworICAgIGZvciBPcGVuSlBBJ3MgZXZlbnQgbm90aWZpY2F0aW9uIGZyYW1ld29yay4gVGhpcyBmcmFtZXdvcmsKKyAgICBhbGxvd3MgZWZmaWNpZW50IG5vdGlmaWNhdGlvbiBvZiBvYmplY3QgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICB0cmFuc2FjdGlvbiBjaGFuZ2VzLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RCcm9rZXJGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdEJyb2tlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBkMzUxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RCcm9rZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlN0YXR1czsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5TeW5jaHJvbml6YXRpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25NYW5hZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQVZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5EYXRhQ2FjaGVTdG9yZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuUmVtb3RlQ29tbWl0RXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VIYXNoU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRSZWZlcmVuY2VIYXNoU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LlJlZW50cmFudExvY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEJyb2tlckZhY3Rvcnl9CisgKiB0aGF0IG11c3QgYmUgc3ViY2xhc3NlZCBmb3IgYSBzcGVjaWZpYyBydW50aW1lLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJyb2tlckZhY3RvcnkKKyAgICBpbXBsZW1lbnRzIEJyb2tlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQWJzdHJhY3RCcm9rZXJGYWN0b3J5LmNsYXNzKTsKKworICAgIC8vIHN0YXRpYyBtYXBwaW5nIG9mIGNvbmZpZ3VyYXRpb25zIHRvIHBvb2xlZCBicm9rZXIgZmFjdG9yaWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9wb29sID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworCisgICAgLy8gY29uZmlndXJhdGlvbgorICAgIHByaXZhdGUgZmluYWwgT3BlbkpQQUNvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfcmVhZE9ubHkgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIF9jbG9zZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBSdW50aW1lRXhjZXB0aW9uIF9jbG9zZWRFeGNlcHRpb24gPSBudWxsOworICAgIHByaXZhdGUgTWFwIF91c2VyT2JqZWN0cyA9IG51bGw7CisKKyAgICAvLyBpbnRlcm5hbCBsb2NrOiBzcGVjIGZvcmJpZHMgc3luY2hyb25pemF0aW9uIG9uIHRoaXMgb2JqZWN0CisgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIF9sb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKworICAgIC8vIG1hcHMgZ2xvYmFsIHRyYW5zYWN0aW9ucyB0byBhc3NvY2lhdGVkIGJyb2tlcnMKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDb25jdXJyZW50SGFzaE1hcCBfdHJhbnNhY3Rpb25hbAorICAgICAgICA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCgpOworCisgICAgLy8gd2Vhay1yZWYgdHJhY2tpbmcgb2Ygb3BlbiBicm9rZXJzCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29sbGVjdGlvbiBfYnJva2VycyA9IG5ldyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaFNldAorICAgICAgICAoQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisKKyAgICAvLyBjYWNoZSB0aGUgY2xhc3MgbmFtZXMgbG9hZGVkIGZyb20gdGhlIHBlcnNpc3RlbnQgY2xhc3NlcyBwcm9wZXJ0eSBzbworICAgIC8vIHRoYXQgd2UgY2FuIHJlLWxvYWQgdGhlbSBmb3IgZWFjaCBuZXcgYnJva2VyCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29sbGVjdGlvbiBfcGNDbGFzc05hbWVzID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDb2xsZWN0aW9uIF9wY0NsYXNzTG9hZGVycyA9IG51bGw7CisKKyAgICAvLyBsaWZlY3ljbGUgbGlzdGVuZXJzIHRvIHBhc3MgdG8gZWFjaCBicm9rZXIKKyAgICBwcml2YXRlIHRyYW5zaWVudCBNYXAgX2xpZmVjeWNsZUxpc3RlbmVycyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvb2xlZCBmYWN0b3J5IG1hdGNoaW5nIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLCBvciBudWxsCisgICAgICogaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0QnJva2VyRmFjdG9yeSBnZXRQb29sZWRGYWN0b3J5KAorICAgICAgICBPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHJldHVybiAoQWJzdHJhY3RCcm9rZXJGYWN0b3J5KSBfcG9vbC5nZXQodG9Qb29sS2V5KGNvbmYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gaW50ZXJuYWwgZmFjdG9yeSBwb29sIGtleSBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCisgICAgICogV2UgdXNlIHRoZSBjb25mIHByb3BlcnRpZXMgYXMgZ2l2ZW4gYnkgdGhlIHVzZXIgYmVjYXVzZSB0aGF0IGlzIHdoYXQncworICAgICAqIHBhc3NlZCB0byB7QGxpbmsgI2dldFBvb2xlZEZhY3Rvcnl9IHdoZW4gbG9va2luZyBmb3IgYW4gZXhpc3RpbmcgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgdG9Qb29sS2V5KE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgcmV0dXJuIGNvbmYudG9Qcm9wZXJ0aWVzKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvb2xlZCBmYWN0b3J5IG1hdGNoaW5nIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGRhdGEsIG9yIG51bGwKKyAgICAgKiBpZiBub25lLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQWJzdHJhY3RCcm9rZXJGYWN0b3J5IGdldFBvb2xlZEZhY3RvcnkoTWFwIG1hcCkgeworICAgICAgICByZXR1cm4gKEFic3RyYWN0QnJva2VyRmFjdG9yeSkgX3Bvb2wuZ2V0KG1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIENvbmZpZ3VyYXRpb24gbXVzdCBiZSBwcm92aWRlZCBvbiBjb25zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0QnJva2VyRmFjdG9yeShPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgX2NvbmYgPSBjb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfY29uZjsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VyIG5ld0Jyb2tlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ld0Jyb2tlcihfY29uZi5nZXRDb25uZWN0aW9uVXNlck5hbWUoKSwKKyAgICAgICAgICAgIF9jb25mLmdldENvbm5lY3Rpb25QYXNzd29yZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VyIG5ld0Jyb2tlcihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3MpIHsKKyAgICAgICAgcmV0dXJuIG5ld0Jyb2tlcih1c2VyLCBwYXNzLCBfY29uZi5pc1RyYW5zYWN0aW9uTW9kZU1hbmFnZWQoKSwKKyAgICAgICAgICAgIF9jb25mLmdldENvbm5lY3Rpb25SZXRhaW5Nb2RlQ29uc3RhbnQoKSk7CisgICAgfQorCisgICAgcHVibGljIEJyb2tlciBuZXdCcm9rZXIoYm9vbGVhbiBtYW5hZ2VkLCBpbnQgY29ublJldGFpbk1vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5ld0Jyb2tlcihfY29uZi5nZXRDb25uZWN0aW9uVXNlck5hbWUoKSwKKyAgICAgICAgICAgIF9jb25mLmdldENvbm5lY3Rpb25QYXNzd29yZCgpLCBtYW5hZ2VkLCBjb25uUmV0YWluTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIEJyb2tlciBuZXdCcm9rZXIoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzLCBib29sZWFuIG1hbmFnZWQsCisgICAgICAgIGludCBjb25uUmV0YWluTW9kZSkgeworICAgICAgICByZXR1cm4gbmV3QnJva2VyKHVzZXIsIHBhc3MsIG1hbmFnZWQsIGNvbm5SZXRhaW5Nb2RlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VyIG5ld0Jyb2tlcihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3MsIGJvb2xlYW4gbWFuYWdlZCwKKyAgICAgICAgaW50IGNvbm5SZXRhaW5Nb2RlLCBib29sZWFuIGZpbmRFeGlzdGluZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgbWFrZVJlYWRPbmx5KCk7CisKKyAgICAgICAgICAgIEJyb2tlckltcGwgYnJva2VyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChmaW5kRXhpc3RpbmcpCisgICAgICAgICAgICAgICAgYnJva2VyID0gZmluZEJyb2tlcih1c2VyLCBwYXNzLCBtYW5hZ2VkKTsKKyAgICAgICAgICAgIGlmIChicm9rZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGRlY29yYXRlIHRoZSBzdG9yZSBtYW5hZ2VyIGZvciBkYXRhIGNhY2hpbmcgYW5kIGN1c3RvbQorICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBvYmplY3QgcHJvdmlkZXJzOyBhbHdheXMgbWFrZSBzdXJlIGl0J3MgYSBkZWxlZ2F0aW5nCisgICAgICAgICAgICAgICAgLy8gc3RvcmUgbWFuYWdlciwgYmVjYXVzZSBpdCdzIGVhc2llciBmb3IgdXNlcnMgdG8gZGVhbCB3aXRoCisgICAgICAgICAgICAgICAgLy8gdGhhdCB3YXkKKyAgICAgICAgICAgICAgICBTdG9yZU1hbmFnZXIgc20gPSBuZXdTdG9yZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyIGRzbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKF9jb25mLmdldERhdGFDYWNoZU1hbmFnZXJJbnN0YW5jZSgpLmdldFN5c3RlbURhdGFDYWNoZSgpCisgICAgICAgICAgICAgICAgICAgICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGRzbSA9IG5ldyBEYXRhQ2FjaGVTdG9yZU1hbmFnZXIoc20pOworICAgICAgICAgICAgICAgIGRzbSA9IG5ldyBST1BTdG9yZU1hbmFnZXIoKGRzbSA9PSBudWxsKSA/IHNtIDogZHNtKTsKKworICAgICAgICAgICAgICAgIGJyb2tlciA9IG5ld0Jyb2tlckltcGwodXNlciwgcGFzcyk7CisgICAgICAgICAgICAgICAgYnJva2VyLmluaXRpYWxpemUodGhpcywgZHNtLCBtYW5hZ2VkLCBjb25uUmV0YWluTW9kZSk7CisgICAgICAgICAgICAgICAgYWRkTGlmZWN5Y2xlTGlzdGVuZXJzKGJyb2tlcik7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSB1c2luZyByZW1vdGUgZXZlbnRzLCByZWdpc3RlciB0aGUgZXZlbnQgbWFuYWdlciBzbworICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuIGJyb2FkY2FzdCBjb21taXQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBicm9rZXIKKyAgICAgICAgICAgICAgICBSZW1vdGVDb21taXRFdmVudE1hbmFnZXIgcmVtb3RlID0gX2NvbmYuCisgICAgICAgICAgICAgICAgICAgIGdldFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcigpOworICAgICAgICAgICAgICAgIGlmIChyZW1vdGUuYXJlUmVtb3RlRXZlbnRzRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBicm9rZXIuYWRkVHJhbnNhY3Rpb25MaXN0ZW5lcihyZW1vdGUpOworCisgICAgICAgICAgICAgICAgbG9hZFBlcnNpc3RlbnRUeXBlcyhicm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYnJva2Vycy5hZGQoYnJva2VyKTsKKworICAgICAgICAgICAgcmV0dXJuIGJyb2tlcjsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBmYWN0b3J5LXJlZ2lzdGVyZWQgbGlmZWN5Y2xlIGxpc3RlbmVycyB0byB0aGUgYnJva2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVycyhCcm9rZXJJbXBsIGJyb2tlcikgeworICAgICAgICBpZiAoX2xpZmVjeWNsZUxpc3RlbmVycyA9PSBudWxsIHx8IF9saWZlY3ljbGVMaXN0ZW5lcnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfbGlmZWN5Y2xlTGlzdGVuZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBicm9rZXIuYWRkTGlmZWN5Y2xlTGlzdGVuZXIoZW50cnkuZ2V0S2V5KCksIChDbGFzc1tdKQorICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgY29uZmlndXJlZCBwZXJzaXN0ZW50IGNsYXNzZXMgbGlzdC4gUGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAgICAgKiB3aGVuZXZlciBhIGJyb2tlciBpcyBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkUGVyc2lzdGVudFR5cGVzKENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICAvLyBubyBsaXN0ZWQgcGVyc2lzdGVudCB0eXBlcz8KKyAgICAgICAgaWYgKF9wY0NsYXNzTmFtZXMgIT0gbnVsbCAmJiBfcGNDbGFzc05hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBjYWNoZSBwZXJzaXN0ZW50IHR5cGUgbmFtZXMgaWYgbm90IGFscmVhZHkKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gX2NvbmYuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihnZXRDbGFzcygpLCBlbnZMb2FkZXIpOworICAgICAgICBpZiAoX3BjQ2xhc3NOYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGNsc3MgPSBfY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGxvYWRQZXJzaXN0ZW50VHlwZXMoZmFsc2UsIGxvYWRlcik7CisgICAgICAgICAgICBpZiAoY2xzcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgX3BjQ2xhc3NOYW1lcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9wY0NsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0KGNsc3Muc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNsc3MuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgIF9wY0NsYXNzTmFtZXMuYWRkKCgoQ2xhc3MpIGl0ci5uZXh0KCkpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgX3BjQ2xhc3NMb2FkZXJzID0gbmV3IFJlZmVyZW5jZUhhc2hTZXQoUmVmZXJlbmNlSGFzaFNldC5XRUFLKTsKKyAgICAgICAgICAgICAgICBfcGNDbGFzc0xvYWRlcnMuYWRkKGxvYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyByZWxvYWQgd2l0aCB0aGlzIGxvYWRlcgorICAgICAgICBpZiAoX3BjQ2xhc3NMb2FkZXJzLmFkZChsb2FkZXIpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9wY0NsYXNzTmFtZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKChTdHJpbmcpIGl0ci5uZXh0KCksIHRydWUsIGxvYWRlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgX2NvbmYuZ2V0TG9nKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19SVU5USU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgLndhcm4obnVsbCwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyLCBDbGFzc1tdIGNsYXNzZXMpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgaWYgKF9saWZlY3ljbGVMaXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfbGlmZWN5Y2xlTGlzdGVuZXJzID0gbmV3IEhhc2hNYXAoNyk7CisgICAgICAgICAgICBfbGlmZWN5Y2xlTGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgY2xhc3Nlcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBpZiAoX2xpZmVjeWNsZUxpc3RlbmVycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9saWZlY3ljbGVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnJva2VyIGZhY3RvcnkgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gX2Nsb3NlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgYXNzZXJ0Tm9BY3RpdmVUcmFuc2FjdGlvbigpOworCisgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmYWN0b3J5IHBvb2wKKyAgICAgICAgICAgIE1hcCBtYXAgPSB0b1Bvb2xLZXkoX2NvbmYpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChfcG9vbCkgeworICAgICAgICAgICAgICAgIGlmIChfcG9vbC5nZXQobWFwKSA9PSB0aGlzKQorICAgICAgICAgICAgICAgICAgICBfcG9vbC5yZW1vdmUobWFwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xvc2UgYWxsIGJyb2tlcnMKKyAgICAgICAgICAgIEJyb2tlciBicm9rZXI7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9icm9rZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgYnJva2VyID0gKEJyb2tlcikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBiZWNhdXNlIF9icm9rZXJzIGNvbnRhaW5zIHdlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIGlmICgoYnJva2VyICE9IG51bGwpICYmICghYnJva2VyLmlzQ2xvc2VkKCkpKQorICAgICAgICAgICAgICAgICAgICBicm9rZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVtb3ZlIG1ldGFkYXRhIHJlcG9zaXRvcnkgZnJvbSBsaXN0ZW5lciBsaXN0CisgICAgICAgICAgICBQQ1JlZ2lzdHJ5LnJlbW92ZVJlZ2lzdGVyQ2xhc3NMaXN0ZW5lcgorICAgICAgICAgICAgICAgIChfY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpKTsKKworICAgICAgICAgICAgX2NvbmYuY2xvc2UoKTsKKyAgICAgICAgICAgIF9jbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgTG9nIGxvZyA9IF9jb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfUlVOVElNRSk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2Nsb3NlZEV4Y2VwdGlvbiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIGEgPGNvZGU+UGxhdGZvcm08L2NvZGU+CisgICAgICogcHJvcGVydHkgbGlzdGluZyB0aGUgcnVudGltZSBwbGF0Zm9ybSwgc3VjaCBhczoKKyAgICAgKiA8Y29kZT5PcGVuSlBBIEpEQkMgRWRpdGlvbjogT3JhY2xlIERhdGFiYXNlPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIC8vIHJlcXVpcmVkIHByb3BzIGFyZSBWZW5kb3JOYW1lIGFuZCBWZXJzaW9uTnVtYmVyCisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eSgiVmVuZG9yTmFtZSIsIE9wZW5KUEFWZXJzaW9uLlZFTkRPUl9OQU1FKTsKKyAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoIlZlcnNpb25OdW1iZXIiLCBPcGVuSlBBVmVyc2lvbi5WRVJTSU9OX05VTUJFUik7CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJWZXJzaW9uSWQiLCBPcGVuSlBBVmVyc2lvbi5WRVJTSU9OX0lEKTsKKyAgICAgICAgcmV0dXJuIHByb3BzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlck9iamVjdChPYmplY3Qga2V5KSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIHJldHVybiAoX3VzZXJPYmplY3RzID09IG51bGwpID8gbnVsbCA6IF91c2VyT2JqZWN0cy5nZXQoa2V5KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBwdXRVc2VyT2JqZWN0KE9iamVjdCBrZXksIE9iamVjdCB2YWwpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoX3VzZXJPYmplY3RzID09IG51bGwpID8gbnVsbCA6IF91c2VyT2JqZWN0cy5yZW1vdmUoa2V5KTsKKworICAgICAgICAgICAgaWYgKF91c2VyT2JqZWN0cyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF91c2VyT2JqZWN0cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICByZXR1cm4gX3VzZXJPYmplY3RzLnB1dChrZXksIHZhbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvY2soKSB7CisgICAgICAgIF9sb2NrLmxvY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIF9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIHRoZSBmYWN0b3J5IHdpdGggdGhpcyBKVk1zIHBvb2xlZCB2ZXJzaW9uIGlmIGl0IGV4aXN0cy4gQWxzbworICAgICAqIGZyZWV6ZXMgdGhlIGZhY3RvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpCisgICAgICAgIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICBBYnN0cmFjdEJyb2tlckZhY3RvcnkgZmFjdG9yeSA9IGdldFBvb2xlZEZhY3RvcnkoX2NvbmYpOworICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlc2UgdHJhbnNpZW50IGZpZWxkcyB0byBlbXB0eSB2YWx1ZXMKKyAgICAgICAgX3RyYW5zYWN0aW9uYWwgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsKKyAgICAgICAgX2Jyb2tlcnMgPSBuZXcgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQoCisgICAgICAgICAgICAgICAgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisKKyAgICAgICAgbWFrZVJlYWRPbmx5KCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE1ldGhvZHMgZm9yIE92ZXJyaWRlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgU3RvcmVNYW5hZ2VyIGZvciB0aGlzIHJ1bnRpbWUuIE5vdGUgdGhhdCB0aGUgaW5zdGFuY2UKKyAgICAgKiByZXR1cm5lZCBoZXJlIG1heSBiZSB3cmFwcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gdGhlCisgICAgICoge0BsaW5rICNuZXdCcm9rZXJ9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RvcmVNYW5hZ2VyIG5ld1N0b3JlTWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogRmluZCBhIHBvb2xlZCBicm9rZXIsIG9yIHJldHVybiBudWxsIGlmIG5vbmUuIElmIHVzaW5nCisgICAgICogbWFuYWdlZCB0cmFuc2FjdGlvbnMsIGxvb2tzIGZvciBhIHRyYW5zYWN0aW9uYWwgYnJva2VyOworICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwgYnkgZGVmYXVsdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICoge0BsaW5rICNuZXdTdG9yZU1hbmFnZXJ9IHNvIHRoYXQgZmFjdG9yeSBzdWJjbGFzc2VzIGltcGxlbWVudGluZworICAgICAqIHBvb2xpbmcgY2FuIHJldHVybiBhIG1hdGNoaW5nIG1hbmFnZXIgYmVmb3JlIGEgbmV3IHtAbGluayBTdG9yZU1hbmFnZXJ9CisgICAgICogaXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQnJva2VySW1wbCBmaW5kQnJva2VyKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcywgYm9vbGVhbiBtYW5hZ2VkKSB7CisgICAgICAgIGlmIChtYW5hZ2VkKQorICAgICAgICAgICAgcmV0dXJuIGZpbmRUcmFuc2FjdGlvbmFsQnJva2VyKHVzZXIsIHBhc3MpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBicm9rZXIgY29uZmlndXJlZCB3aXRoIHRoZSBwcm9wZXIgc2V0dGluZ3MuCisgICAgICogQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgY29uc3RydWN0cyBhIG5ldworICAgICAqIEJyb2tlckltcGwgb2YgdGhlIGNsYXNzIHNldCBmb3IgdGhpcyBmYWN0b3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBCcm9rZXJJbXBsIG5ld0Jyb2tlckltcGwoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKSB7CisgICAgICAgIEJyb2tlckltcGwgYnJva2VyID0gX2NvbmYubmV3QnJva2VySW5zdGFuY2UodXNlciwgcGFzcyk7CisgICAgICAgIGlmIChicm9rZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1icm9rZXItY2xhc3MiLAorICAgICAgICAgICAgICAgIF9jb25mLmdldEJyb2tlckltcGwoKSkpOworCisgICAgICAgIHJldHVybiBicm9rZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgdHJhbnNpZW50IHN0YXRlIHVzZWQgYnkgdGhpcyBmYWN0b3J5IGJhc2VkIG9uIHRoZQorICAgICAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgd2hpY2ggd2lsbCBzdWJzZXF1ZW50bHkgYmUgbG9ja2VkIGRvd24uIFRoaXMKKyAgICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBicm9rZXIgaXMgcmVxdWVzdGVkLAorICAgICAqIGFuZCB3aWxsIGJlIHJlLWNhbGxlZCBlYWNoIHRpbWUgdGhlIGZhY3RvcnkgaXMgZGVzZXJpYWxpemVkIGludG8gYSBKVk0KKyAgICAgKiB0aGF0IGhhcyBubyBjb25maWd1cmF0aW9uIGZvciB0aGlzIGRhdGEgc3RvcmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoKSB7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLworICAgIC8vIFV0aWxpdGllcworICAgIC8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBtYW5hZ2VkIHJ1bnRpbWUgYnJva2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uLCBvciByZXR1cm5zIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQnJva2VySW1wbCBmaW5kVHJhbnNhY3Rpb25hbEJyb2tlcihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3MpIHsKKyAgICAgICAgVHJhbnNhY3Rpb24gdHJhbnMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnMgPSBfY29uZi5nZXRNYW5hZ2VkUnVudGltZUluc3RhbmNlKCkuZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkuCisgICAgICAgICAgICAgICAgZ2V0VHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCB0cmFucy5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuU1RBVFVTX05PX1RSQU5TQUNUSU9OCisgICAgICAgICAgICAgICAgfHwgdHJhbnMuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLlNUQVRVU19VTktOT1dOKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbiBicm9rZXJzID0gKENvbGxlY3Rpb24pIF90cmFuc2FjdGlvbmFsLmdldCh0cmFucyk7CisgICAgICAgIGlmIChicm9rZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3luY2hyb25pemUgb24gYnJva2VycyBzaW5jZSBvbmUgSlRBIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAvLyBjYW4gbmV2ZXIgYmUgYWN0aXZlIG9uIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcy4KKyAgICAgICAgICAgIEJyb2tlckltcGwgYnJva2VyOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBicm9rZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgYnJva2VyID0gKEJyb2tlckltcGwpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhicm9rZXIuZ2V0Q29ubmVjdGlvblVzZXJOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHVzZXIpICYmIFN0cmluZ1V0aWxzLmVxdWFscworICAgICAgICAgICAgICAgICAgICAoYnJva2VyLmdldENvbm5lY3Rpb25QYXNzd29yZCgpLCBwYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyb2tlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSBnaXZlbiBicm9rZXIgd2l0aCB0aGUgY3VycmVudCBmYWN0b3J5IG9wdGlvbiBzZXR0aW5ncy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVCcm9rZXIoQnJva2VySW1wbCBicm9rZXIpIHsKKyAgICAgICAgYnJva2VyLnNldE9wdGltaXN0aWMoX2NvbmYuZ2V0T3B0aW1pc3RpYygpKTsKKyAgICAgICAgYnJva2VyLnNldE5vbnRyYW5zYWN0aW9uYWxSZWFkKF9jb25mLmdldE5vbnRyYW5zYWN0aW9uYWxSZWFkKCkpOworICAgICAgICBicm9rZXIuc2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKF9jb25mLmdldE5vbnRyYW5zYWN0aW9uYWxXcml0ZSgpKTsKKyAgICAgICAgYnJva2VyLnNldFJldGFpblN0YXRlKF9jb25mLmdldFJldGFpblN0YXRlKCkpOworICAgICAgICBicm9rZXIuc2V0UmVzdG9yZVN0YXRlKF9jb25mLmdldFJlc3RvcmVTdGF0ZUNvbnN0YW50KCkpOworICAgICAgICBicm9rZXIuc2V0QXV0b0NsZWFyKF9jb25mLmdldEF1dG9DbGVhckNvbnN0YW50KCkpOworICAgICAgICBicm9rZXIuc2V0SWdub3JlQ2hhbmdlcyhfY29uZi5nZXRJZ25vcmVDaGFuZ2VzKCkpOworICAgICAgICBicm9rZXIuc2V0TXVsdGl0aHJlYWRlZChfY29uZi5nZXRNdWx0aXRocmVhZGVkKCkpOworICAgICAgICBicm9rZXIuc2V0QXV0b0RldGFjaChfY29uZi5nZXRBdXRvRGV0YWNoQ29uc3RhbnQoKSk7CisgICAgICAgIGJyb2tlci5zZXREZXRhY2hTdGF0ZShfY29uZi5nZXREZXRhY2hTdGF0ZUluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXREZXRhY2hTdGF0ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGZhY3RvcnkgdG8gdGhlIHBvb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcG9vbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChfcG9vbCkgeworICAgICAgICAgICAgX3Bvb2wucHV0KHRvUG9vbEtleShfY29uZiksIHRoaXMpOworICAgICAgICAgICAgbWFrZVJlYWRPbmx5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcmVlemVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoKSB7CisgICAgICAgIGlmIChfcmVhZE9ubHkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4KKyAgICAgICAgICAgIGlmIChfcmVhZE9ubHkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgX3JlYWRPbmx5ID0gdHJ1ZTsKKworICAgICAgICAgICAgTG9nIGxvZyA9IF9jb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfUlVOVElNRSk7CisgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhnZXRGYWN0b3J5SW5pdGlhbGl6YXRpb25CYW5uZXIoKSk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBfY29uZi50b1Byb3BlcnRpZXModHJ1ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZVNlcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgiZmFjdG9yeS1wcm9wZXJ0aWVzIiwgYnVmLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2V0dXAgdHJhbnNpZW50IHN0YXRlCisgICAgICAgICAgICBzZXR1cCgpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgbWV0ZGF0YSByZXBvc2l0b3J5IHRvIGF1dG8tbG9hZCBwZXJzaXN0ZW50IHR5cGVzCisgICAgICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHR5cGVzIGFyZSBlbmhhbmNlZAorICAgICAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gX2NvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJlcG9zLnNldFZhbGlkYXRlKHJlcG9zLlZBTElEQVRFX1JVTlRJTUUsIHRydWUpOworICAgICAgICAgICAgcmVwb3Muc2V0UmVzb2x2ZShyZXBvcy5NT0RFX01BUFBJTkdfSU5JVCwgdHJ1ZSk7CisgICAgICAgICAgICBQQ1JlZ2lzdHJ5LmFkZFJlZ2lzdGVyQ2xhc3NMaXN0ZW5lcihyZXBvcyk7CisKKyAgICAgICAgICAgIC8vIGZyZWV6ZSB1bmRlcmx5aW5nIGNvbmZpZ3VyYXRpb24gYW5kIGVhZ2VybHkgaW5pdGlhbGl6ZSB0bworICAgICAgICAgICAgLy8gYXZvaWQgc3luY2hyb25pemF0aW9uCisgICAgICAgICAgICBfY29uZi5zZXRSZWFkT25seSh0cnVlKTsKKyAgICAgICAgICAgIF9jb25mLmluc3RhbnRpYXRlQWxsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBvYmplY3QgdG8gYmUgd3JpdHRlbiB0byB0aGUgbG9nIHdoZW4gdGhpcyBicm9rZXIgZmFjdG9yeQorICAgICAqIGluaXRpYWxpemVzLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZnVsbHkgbG9hZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RmFjdG9yeUluaXRpYWxpemF0aW9uQmFubmVyKCkgeworICAgICAgICByZXR1cm4gX2xvYy5nZXQoImZhY3RvcnktaW5pdCIsIE9wZW5KUEFWZXJzaW9uLlZFUlNJT05fTlVNQkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZhY3RvcnkgaXMgY2xvc2VkLiAgVGhlIGV4YWN0IG1lc3NhZ2UgYW5kCisgICAgICogY29udGVudCBvZiB0aGUgZXhjZXB0aW9uIHZhcmllcyB3aGV0aGVyIFRSQUNFIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRPcGVuKCkgeworICAgICAgICBpZiAoX2Nsb3NlZCkgeworICAgICAgICAgICAgaWYgKF9jbG9zZWRFeGNlcHRpb24gPT0gbnVsbCkgIC8vIFRSQUNFIG5vdCBlbmFibGVkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJjbG9zZWQtZmFjdG9yeS1ub3RyYWNlIikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImNsb3NlZC1mYWN0b3J5IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2F1c2UoX2Nsb3NlZEV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEJyb2tlciB1dGlsaXRpZXMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVGhyb3dzIGEge0BsaW5rIFVzZXJFeGNlcHRpb259IGlmIGEgdHJhbnNhY3Rpb24gaXMgYWN0aXZlLiBUaGUgdGhyb3duCisgICAgICogZXhjZXB0aW9uIHdpbGwgY29udGFpbiBhbGwgdGhlIEJyb2tlcnMgd2l0aCBhY3RpdmUgdHJhbnNhY3Rpb25zIGFzCisgICAgICogZmFpbGVkIG9iamVjdHMgaW4gdGhlIG5lc3RlZCBleGNlcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb0FjdGl2ZVRyYW5zYWN0aW9uKCkgeworICAgICAgICBDb2xsZWN0aW9uIGV4Y3MgPSBudWxsOworICAgICAgICBpZiAoX3RyYW5zYWN0aW9uYWwuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGV4Y3MgPSBuZXcgQXJyYXlMaXN0KF90cmFuc2FjdGlvbmFsLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgdHJhbnMgPSBfdHJhbnNhY3Rpb25hbC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgdHJhbnMuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBicm9rZXJzID0gKENvbGxlY3Rpb24pIHRyYW5zLm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYnJva2Vycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGV4Y3MuYWRkKG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImFjdGl2ZSIpKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KGl0ci5uZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXhjcy5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJuZXN0ZWQtZXhjZXBzIikpLgorICAgICAgICAgICAgICAgIHNldE5lc3RlZFRocm93YWJsZXMoKFRocm93YWJsZVtdKSBleGNzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBUaHJvd2FibGVbZXhjcy5zaXplKCldKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3luY2hyb25pemUgdGhlIGdpdmVuIGJyb2tlciB3aXRoIGEgbWFuYWdlZCB0cmFuc2FjdGlvbiwKKyAgICAgKiBvcHRpb25hbGx5IHN0YXJ0aW5nIG9uZSBpZiBub25lIGlzIGluIHByb2dyZXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHN5bmNoZWQgd2l0aCB0cmFuc2FjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBzeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbihCcm9rZXJJbXBsIGJyb2tlciwgYm9vbGVhbiBiZWdpbikgeworICAgICAgICBUcmFuc2FjdGlvbiB0cmFucyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbk1hbmFnZXIgdG0gPSBicm9rZXIuZ2V0TWFuYWdlZFJ1bnRpbWUoKS4KKyAgICAgICAgICAgICAgICBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgICAgIHRyYW5zID0gdG0uZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGlmICh0cmFucyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKHRyYW5zLmdldFN0YXR1cygpID09IFN0YXR1cy5TVEFUVVNfTk9fVFJBTlNBQ1RJT04KKyAgICAgICAgICAgICAgICB8fCB0cmFucy5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuU1RBVFVTX1VOS05PV04pKQorICAgICAgICAgICAgICAgIHRyYW5zID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHRyYW5zID09IG51bGwgJiYgYmVnaW4pIHsKKyAgICAgICAgICAgICAgICB0bS5iZWdpbigpOworICAgICAgICAgICAgICAgIHRyYW5zID0gdG0uZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIHN5bmNoIGJyb2tlciBhbmQgdHJhbnMKKyAgICAgICAgICAgIHRyYW5zLnJlZ2lzdGVyU3luY2hyb25pemF0aW9uKGJyb2tlcik7CisKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3luY2hyb25pemUgb24gYnJva2VycyBvciBndWFyZCBhZ2FpbnN0IG11bHRpcGxlCisgICAgICAgICAgICAvLyB0aHJlYWRzIHVzaW5nIHRoZSBzYW1lIHRyYW5zIHNpbmNlIG9uZSBKVEEgdHJhbnNhY3Rpb24gY2FuIG5ldmVyCisgICAgICAgICAgICAvLyBiZSBhY3RpdmUgb24gbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzLgorICAgICAgICAgICAgQ29sbGVjdGlvbiBicm9rZXJzID0gKENvbGxlY3Rpb24pIF90cmFuc2FjdGlvbmFsLmdldCh0cmFucyk7CisgICAgICAgICAgICBpZiAoYnJva2VycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnJva2VycyA9IG5ldyBBcnJheUxpc3QoMik7CisgICAgICAgICAgICAgICAgX3RyYW5zYWN0aW9uYWwucHV0KHRyYW5zLCBicm9rZXJzKTsKKyAgICAgICAgICAgICAgICB0cmFucy5yZWdpc3RlclN5bmNocm9uaXphdGlvbihuZXcgUmVtb3ZlVHJhbnNhY3Rpb25TeW5jKHRyYW5zKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicm9rZXJzLmFkZChicm9rZXIpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgYWxsIHRoZSBvcGVuIGJyb2tlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdG9yeS4gVGhlCisgICAgICogcmV0dXJuZWQgc2V0IGlzIHVubW9kaWZpYWJsZSwgYW5kIG1heSBjb250YWluIG51bGwgcmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRPcGVuQnJva2VycygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oX2Jyb2tlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBzeW5jaHJvbml6YXRpb24gbGlzdGVuZXIgdG8gcmVtb3ZlIGNvbXBsZXRlZCB0cmFuc2FjdGlvbnMKKyAgICAgKiBmcm9tIG91ciBjYWNoZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW92ZVRyYW5zYWN0aW9uU3luYworICAgICAgICBpbXBsZW1lbnRzIFN5bmNocm9uaXphdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2FjdGlvbiBfdHJhbnM7CisKKyAgICAgICAgcHVibGljIFJlbW92ZVRyYW5zYWN0aW9uU3luYyhUcmFuc2FjdGlvbiB0cmFucykgeworICAgICAgICAgICAgX3RyYW5zID0gdHJhbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVDb21wbGV0aW9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21wbGV0aW9uKGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgIF90cmFuc2FjdGlvbmFsLnJlbW92ZSAoX3RyYW5zKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Fic3RyYWN0RmllbGRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdEZpZWxkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzcwNDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdEZpZWxkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5GaWVsZE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CisKKy8qKgorICogQWJzdHJhY3Qge0BsaW5rIEZpZWxkTWFuYWdlcn0gZm9yIGVhc3kgc3ViY2xhc3NpbmcuIFRocm93cyBleGNlcHRpb25zCisgKiBmb3IgYWxsIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGaWVsZE1hbmFnZXIKKyAgICBpbXBsZW1lbnRzIEZpZWxkTWFuYWdlciB7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBmZXRjaEJvb2xlYW5GaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZmV0Y2hCeXRlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGZldGNoQ2hhckZpZWxkKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGZldGNoRG91YmxlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBmZXRjaEZsb2F0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnRGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZmV0Y2hMb25nRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3RGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGZldGNoU2hvcnRGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBmZXRjaFN0cmluZ0ZpZWxkKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUJvb2xlYW5GaWVsZChpbnQgZmllbGQsIGJvb2xlYW4gY3VyVmFsKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQnl0ZUZpZWxkKGludCBmaWVsZCwgYnl0ZSBjdXJWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGFyRmllbGQoaW50IGZpZWxkLCBjaGFyIGN1clZhbCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZURvdWJsZUZpZWxkKGludCBmaWVsZCwgZG91YmxlIGN1clZhbCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZsb2F0RmllbGQoaW50IGZpZWxkLCBmbG9hdCBjdXJWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVJbnRGaWVsZChpbnQgZmllbGQsIGludCBjdXJWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVMb25nRmllbGQoaW50IGZpZWxkLCBsb25nIGN1clZhbCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdEZpZWxkKGludCBmaWVsZCwgT2JqZWN0IGN1clZhbCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVNob3J0RmllbGQoaW50IGZpZWxkLCBzaG9ydCBjdXJWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVTdHJpbmdGaWVsZChpbnQgZmllbGQsIFN0cmluZyBjdXJWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RMb2NrTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RMb2NrTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTRmYzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdExvY2tNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworCisvKioKKyAqIEFic3RyYWN0IHtAbGluayBMb2NrTWFuYWdlcn0gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9ja01hbmFnZXIKKyAgICBpbXBsZW1lbnRzIExvY2tNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IGFnYWluc3Qgd2hpY2ggdGhpcyBMb2NrTWFuYWdlciBpcyBvcGVyYXRpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0b3JlQ29udGV4dCBjdHg7CisKKyAgICAvKioKKyAgICAgKiBSdW50aW1lIGxvZyB0byB3cml0ZSBsb2NraW5nIG1lc3NhZ2VzIHRvLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2cgbG9nOworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMuY3R4ID0gY3R4OworICAgICAgICB0aGlzLmxvZyA9IGN0eC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9nCisgICAgICAgICAgICAoT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpOworICAgIH0KKworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGN0eDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIExvY2tNYW5hZ2VyI2xvY2t9IHdpdGggZWFjaCBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9ja0FsbChDb2xsZWN0aW9uIHNtcywgaW50IGxldmVsLCBpbnQgdGltZW91dCwKKyAgICAgICAgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBsb2NrKChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBpdHIubmV4dCgpLCBsZXZlbCwgdGltZW91dCwgY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRUcmFuc2FjdGlvbigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSAoKQorCXsKKwl9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Fic3RyYWN0UENEYXRhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdFBDRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTM4NDAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdFBDRGF0YS5qYXZhCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuT3JwaGFuZWRLZXlBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DaGFuZ2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5OworCisvKioKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBjb3JlIFBDRGF0YSBiZWhhdmlvci4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UENEYXRhCisgICAgaW1wbGVtZW50cyBQQ0RhdGEgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTCA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvYWRlZCBmaWVsZCBtYXNrLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCaXRTZXQgZ2V0TG9hZGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgcGNkYXRhIGZvciBob2xkaW5nIHRoZSBzdGF0ZSBvZiBhbiBlbWJlZGRlZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQWJzdHJhY3RQQ0RhdGEgbmV3RW1iZWRkZWRQQ0RhdGEoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGdldExvYWRlZCgpLmdldChmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIHRoZSBnaXZlbiBkYXRhIHZhbHVlIGludG8gaXRzIGZpZWxkIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9GaWVsZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgT2JqZWN0IGRhdGEsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBQcm94eURhdGFMaXN0IGMgPSAoUHJveHlEYXRhTGlzdCkgZGF0YTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGMyID0gKENvbGxlY3Rpb24pIHNtLm5ld0ZpZWxkUHJveHkoZm1kLmdldEluZGV4KCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYzIuYWRkKHRvTmVzdGVkRmllbGQoc20sIGZtZC5nZXRFbGVtZW50KCksIGMuZ2V0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gsIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBpZiAoYzIgaW5zdGFuY2VvZiBQcm94eSkgeworICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUcmFja2VyIGN0ID0gKChQcm94eSkgYzIpLmdldENoYW5nZVRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjdC5zZXROZXh0U2VxdWVuY2UoYy5uZXh0U2VxdWVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgTWFwIG0gPSAoTWFwKSBkYXRhOworICAgICAgICAgICAgICAgIE1hcCBtMiA9IChNYXApIHNtLm5ld0ZpZWxkUHJveHkoZm1kLmdldEluZGV4KCkpOworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlOworICAgICAgICAgICAgICAgIE9iamVjdCBrZXk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbWkgPSBtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgbWkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBlID0gKE1hcC5FbnRyeSkgbWkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBrZXkgPSB0b05lc3RlZEZpZWxkKHNtLCBmbWQuZ2V0S2V5KCksIGUuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaCwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9OZXN0ZWRGaWVsZChzbSwgZm1kLmdldEVsZW1lbnQoKSwgZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtMi5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtMjsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgoZGF0YSk7CisgICAgICAgICAgICAgICAgT2JqZWN0IGEgPSBBcnJheS5uZXdJbnN0YW5jZShmbWQuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNJbW11dGFibGVUeXBlKGZtZC5nZXRFbGVtZW50KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgYSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQoYSwgaSwgdG9OZXN0ZWRGaWVsZChzbSwgZm1kLmdldEVsZW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5nZXQoZGF0YSwgaSksIGZldGNoLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiB0b05lc3RlZEZpZWxkKHNtLCBmbWQsIGRhdGEsIGZldGNoLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gZGF0YSB2YWx1ZSB0byBpdHMgZmllbGQgdmFsdWUuIFRoZSBkYXRhIHZhbHVlCisgICAgICogbWF5IGJlIGEga2V5LCB2YWx1ZSwgb3IgZWxlbWVudCBvZiBhIG1hcCBvciBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9OZXN0ZWRGaWVsZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBWYWx1ZU1ldGFEYXRhIHZtZCwKKyAgICAgICAgT2JqZWN0IGRhdGEsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHN3aXRjaCAodm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gKChEYXRlKSBkYXRhKS5jbG9uZSgpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9DQUxFOgorICAgICAgICAgICAgICAgIHJldHVybiAoTG9jYWxlKSBkYXRhOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgaWYgKHZtZC5pc0VtYmVkZGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0VtYmVkZGVkRmllbGQoc20sIHZtZCwgZGF0YSwgZmV0Y2gsIGNvbnRleHQpOworICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIE9iamVjdCByZXQgPQorICAgICAgICAgICAgICAgICAgICB0b1JlbGF0aW9uRmllbGQoc20sIHZtZCwgZGF0YSwgZmV0Y2gsIGNvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBPcnBoYW5lZEtleUFjdGlvbiBhY3Rpb24gPSBzbS5nZXRDb250ZXh0KCkuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgICAgICAgICBnZXRPcnBoYW5lZEtleUFjdGlvbkluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5vcnBoYW4oZGF0YSwgc20sIHZtZCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIHRoZSBnaXZlbiBkYXRhIGludG8gYSByZWxhdGlvbiBmaWVsZCB2YWx1ZS4gRGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhlIGRhdGEgaXMgYW4gb2lkLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9SZWxhdGlvbkZpZWxkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFZhbHVlTWV0YURhdGEgdm1kLAorICAgICAgICBPYmplY3QgZGF0YSwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICByZXR1cm4gc20uZ2V0Q29udGV4dCgpLmZpbmQoZGF0YSwgZmV0Y2gsIG51bGwsIG51bGwsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gZGF0YSBpbnRvIGFuIGVtYmVkZGVkIFBDIGZpZWxkIHZhbHVlLiBEZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGUgZGF0YSBpcyBhbiB7QGxpbmsgQWJzdHJhY3RQQ0RhdGF9LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9FbWJlZGRlZEZpZWxkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFZhbHVlTWV0YURhdGEgdm1kLAorICAgICAgICBPYmplY3QgZGF0YSwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICBBYnN0cmFjdFBDRGF0YSBwY2RhdGEgPSAoQWJzdHJhY3RQQ0RhdGEpIGRhdGE7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW1iZWRkZWQgPSBzbS5nZXRDb250ZXh0KCkuZW1iZWQobnVsbCwKKyAgICAgICAgICAgIHBjZGF0YS5nZXRJZCgpLCBzbSwgdm1kKTsKKyAgICAgICAgcGNkYXRhLmxvYWQoZW1iZWRkZWQsIChCaXRTZXQpIHBjZGF0YS5nZXRMb2FkZWQoKS5jbG9uZSgpLAorICAgICAgICAgICAgZmV0Y2gsIGNvbnRleHQpOworICAgICAgICByZXR1cm4gZW1iZWRkZWQuZ2V0TWFuYWdlZEluc3RhbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIHRoZSBnaXZlbiBmaWVsZCB2YWx1ZSB0byBhIGRhdGEgdmFsdWUgZm9yIGNhY2hpbmcuIFJldHVybgorICAgICAqIHtAbGluayAjTlVMTH0gaWYgdW5hYmxlIHRvIGNhY2hlLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9EYXRhKEZpZWxkTWV0YURhdGEgZm1kLCBPYmplY3QgdmFsLCBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGMgPSAoQ29sbGVjdGlvbikgdmFsOworICAgICAgICAgICAgICAgIGlmIChjLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb3h5RGF0YUxpc3QuRU1QVFlfTElTVDsKKyAgICAgICAgICAgICAgICBQcm94eURhdGFMaXN0IGMyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGNpID0gYy5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRvTmVzdGVkRGF0YShmbWQuZ2V0RWxlbWVudCgpLCBjaS5uZXh0KCksIGN0eCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICBpZiAoYzIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBuZXcgUHJveHlEYXRhTGlzdChzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUcmFja2VyIGN0ID0gKChQcm94eSkgYykuZ2V0Q2hhbmdlVHJhY2tlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMi5uZXh0U2VxdWVuY2UgPSBjdC5nZXROZXh0U2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyLm5leHRTZXF1ZW5jZSA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYzIuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICBNYXAgbSA9IChNYXApIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAobS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgICAgICAgICAgICAgICAgTWFwIG0yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsMjsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1pID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IG1pLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgZSA9IChNYXAuRW50cnkpIG1pLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gdG9OZXN0ZWREYXRhKGZtZC5nZXRLZXkoKSwgZS5nZXRLZXkoKSwgY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHZhbDIgPSB0b05lc3RlZERhdGEoZm1kLmdldEVsZW1lbnQoKSwgZS5nZXRWYWx1ZSgpLCBjdHgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsMiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtMiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbTIgPSBuZXcgSGFzaE1hcChtLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIG0yLnB1dCh2YWwsIHZhbDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbTI7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHZhbCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQVJSQVk7CisKKyAgICAgICAgICAgICAgICBPYmplY3QgYTsKKyAgICAgICAgICAgICAgICBpZiAoaXNJbW11dGFibGVUeXBlKGZtZC5nZXRFbGVtZW50KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGEgPSBBcnJheS5uZXdJbnN0YW5jZShmbWQuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsLCAwLCBhLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W2xlbmd0aF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0gPSB0b05lc3RlZERhdGEoZm1kLmdldEVsZW1lbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuZ2V0KHZhbCwgaSksIGN0eCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYSA9IGRhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9OZXN0ZWREYXRhKGZtZCwgdmFsLCBjdHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhlIGdpdmVuIHZhbHVlIGlzIGltbXV0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbW11dGFibGVUeXBlKFZhbHVlTWV0YURhdGEgZWxlbWVudCkgeworICAgICAgICBzd2l0Y2ggKGVsZW1lbnQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk5VTUJFUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdERUNJTUFMOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIHRoZSBnaXZlbiBuZXN0ZWQgdmFsdWUgdG8gYSBjYWNoYWJsZSB2YWx1ZS4gUmV0dXJuCisgICAgICoge0BsaW5rICNOVUxMfSBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGNhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHRvTmVzdGVkRGF0YShWYWx1ZU1ldGFEYXRhIHZtZCwgT2JqZWN0IHZhbCwKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgICAgIGlmICh2bWQuaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9FbWJlZGRlZERhdGEodmFsLCBjdHgpOworICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIHJldHVybiB0b1JlbGF0aW9uRGF0YSh2YWwsIGN0eCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBQcm94eSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoUHJveHkpIHZhbCkuY29weSh2YWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRGF0ZSkgdmFsKS5jbG9uZSgpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9DQUxFOgorICAgICAgICAgICAgICAgIHJldHVybiAoTG9jYWxlKSB2YWw7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChQcm94eSkgdmFsKS5jb3B5KHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSB0byBjYWNoZSBmb3IgdGhlIGdpdmVuIG9iamVjdC4gQ2FjaGVzIGl0cyBvaWQgYnkKKyAgICAgKiBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9SZWxhdGlvbkRhdGEoT2JqZWN0IHZhbCwgU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICByZXR1cm4gY3R4LmdldE9iamVjdElkKHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSB0byBjYWNoZSBmb3IgdGhlIGdpdmVuIGVtYmVkZGVkIFBDLiBDYWNoZXMgYQorICAgICAqIHtAbGluayBQQ0RhdGF9IGZyb20ge0BsaW5rICNuZXdFbWJlZGRlZFBDRGF0YX0gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHRvRW1iZWRkZWREYXRhKE9iamVjdCB2YWwsIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgaWYgKGN0eCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IGN0eC5nZXRTdGF0ZU1hbmFnZXIodmFsKTsKKyAgICAgICAgaWYgKHNtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAvLyBoYXZlIHRvIGNhY2hlIGFsbCBkYXRhLCBzbyBtYWtlIHN1cmUgaXQncyBhbGwgbG9hZGVkCisgICAgICAgIC8vICMjIyBwcmV2ZW50IGxvYWRpbmcgb2YgdGhpbmdzIHRoYXQgYXJlbid0IGNhY2hlZCAobG9icywgbHJzLCBldGMpCisgICAgICAgIGN0eC5yZXRyaWV2ZSh2YWwsIGZhbHNlLCBudWxsKTsKKworICAgICAgICBQQ0RhdGEgcGNkYXRhID0gbmV3RW1iZWRkZWRQQ0RhdGEoc20pOworICAgICAgICBwY2RhdGEuc3RvcmUoc20pOworICAgICAgICByZXR1cm4gcGNkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYWNrcyBwcm94eSBkYXRhIGFsb25nIHdpdGggbGlzdCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eURhdGFMaXN0CisgICAgICAgIGV4dGVuZHMgQXJyYXlMaXN0IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByb3h5RGF0YUxpc3QgRU1QVFlfTElTVCA9IG5ldyBQcm94eURhdGFMaXN0KDApOworCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dFNlcXVlbmNlID0gMDsKKworICAgICAgICBwdWJsaWMgUHJveHlEYXRhTGlzdChpbnQgc2l6ZSkgeworCQkJc3VwZXIgKHNpemUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RQQ1Jlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BYnN0cmFjdFBDUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzM4ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RQQ1Jlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQQ1Jlc3VsdE9iamVjdFByb3ZpZGVyfQorICogdGhhdCBpbXBsZW1lbnRzIHtAbGluayBSZXN1bHRPYmplY3RQcm92aWRlciNnZXRSZXN1bHRPYmplY3R9CisgKiBieSBhc3NlbWJsaW5nIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCB0byBiZSBsb2FkZWQuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UENSZXN1bHRPYmplY3RQcm92aWRlcgorICAgIGltcGxlbWVudHMgUENSZXN1bHRPYmplY3RQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFN0b3JlQ29udGV4dH0gdGhhdCB0aGlzIHJlc3VsdCBvYmplY3QKKyAgICAgKiBwcm92aWRlciB3aWxsIGxvYWQgb2JqZWN0cyBpbnRvLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdG9yZUNvbnRleHQgY3R4OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHByb3ZpZGVyIGZvciBsb2FkaW5nIFBDIG9iamVjdHMgZnJvbSB0aGUgaW5wdXQKKyAgICAgKiBpbnRvIDxjb2RlPmN0eDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0UENSZXN1bHRPYmplY3RQcm92aWRlcihTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMuY3R4ID0gY3R4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dCB0aGlzIHByb3ZpZGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGN0eDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFBDU3RhdGUgc3RhdGUsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNtLmluaXRpYWxpemUoZ2V0UENUeXBlKCksIHN0YXRlKTsKKyAgICAgICAgbG9hZChzbSwgZmV0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0T2JqZWN0KCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIHR5cGUgPSBnZXRQQ1R5cGUoKTsKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gY3R4LmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IHJlcG9zLmdldE1ldGFEYXRhCisgICAgICAgICAgICAodHlwZSwgY3R4LmdldENsYXNzTG9hZGVyKCksIHRydWUpOworCisgICAgICAgIE9iamVjdCBvaWQgPSBnZXRPYmplY3RJZChtZXRhKTsKKyAgICAgICAgT2JqZWN0IHJlcyA9IGN0eC5maW5kKG9pZCwgbnVsbCwgbnVsbCwgdGhpcywgMCk7CisgICAgICAgIGlmIChyZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihvaWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBleHRyYWN0IHRoZSBvYmplY3QgaWQgdmFsdWUgZnJvbSB0aGUKKyAgICAgKiBjdXJyZW50IHJlY29yZCBvZiB0aGUgaW5wdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRPYmplY3RJZChDbGFzc01ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZXh0cmFjdCB0aGUgdHlwZSBvZiB0aGUgcGMgc3RvcmVkCisgICAgICogaW4gdGhlIGN1cnJlbnQgcmVjb3JkIG9mIHRoZSBpbnB1dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3MgZ2V0UENUeXBlKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIExvYWQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHJlY29yZCBpbnRvIHRoZSBnaXZlbiBzdGF0ZQorICAgICAqIG1hbmFnZXIuIFJlbWVtYmVyIHRvIGNhbGwge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXIjc2V0VmVyc2lvbn0gdG8gc2V0CisgICAgICogdGhlIG9wdGltaXN0aWMgdmVyc2lvbmluZyBpbmZvcm1hdGlvbiwgaWYgaXQgaGFzIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBpZiBkZXNpcmVkLiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgaWYgZGVzaXJlZC4gUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHNlZSBSZXN1bHRPYmplY3RQcm92aWRlciNzdXBwb3J0c1JhbmRvbUFjY2VzcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkdmFuY2UgdGhlIGlucHV0LgorICAgICAqCisgICAgICogQHNlZSBSZXN1bHRPYmplY3RQcm92aWRlciNuZXh0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbmV4dCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBpZiBkZXNpcmVkLiBUaHJvd3MgYW4gZXhjZXB0aW9uIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAc2VlIFJlc3VsdE9iamVjdFByb3ZpZGVyI2Fic29sdXRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIGlmIGRlc2lyZWQuIFJldHVybnMge0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfSBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHNlZSBSZXN1bHRPYmplY3RQcm92aWRlciNzaXplCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBpZiBkZXNpcmVkLiBUaHJvd3MgYW4gZXhjZXB0aW9uIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAc2VlIFJlc3VsdE9iamVjdFByb3ZpZGVyI3Jlc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgaWYgZGVzaXJlZC4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAc2VlIFJlc3VsdE9iamVjdFByb3ZpZGVyI2Nsb3NlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYSB7QGxpbmsgU3RvcmVFeGNlcHRpb259IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24gKGUpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Fic3RyYWN0U3RvcmVRdWVyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQWJzdHJhY3RTdG9yZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3NmQ5MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Fic3RyYWN0U3RvcmVRdWVyeS5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MaW5rZWRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFnZ3JlZ2F0ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5GaWx0ZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworCisvKioKKyAqIEFic3RyYWN0IHtAbGluayBTdG9yZVF1ZXJ5fSB0aGF0IGltcGxlbWVudHMgbW9zdCBtZXRob2RzIGFzIG5vLW9wcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JlUXVlcnkKKyAgICBpbXBsZW1lbnRzIFN0b3JlUXVlcnkgeworCisgICAgcHJvdGVjdGVkIFF1ZXJ5Q29udGV4dCBjdHggPSBudWxsOworICAgCisgICAgcHVibGljIFF1ZXJ5Q29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY3R4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoUXVlcnlDb250ZXh0IGN0eCkgeworICAgICAgICB0aGlzLmN0eCA9IGN0eDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRRdWVyeShPYmplY3QgcXVlcnkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBGaWx0ZXJMaXN0ZW5lciBnZXRGaWx0ZXJMaXN0ZW5lcihTdHJpbmcgdGFnKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBBZ2dyZWdhdGVMaXN0ZW5lciBnZXRBZ2dyZWdhdGVMaXN0ZW5lcihTdHJpbmcgdGFnKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3Q29tcGlsYXRpb25LZXkoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3Q29tcGlsYXRpb24oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRnJvbUNvbXBpbGF0aW9uKE9iamVjdCBjb21wKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZUNvbXBpbGF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGF0YVN0b3JlRXhlY3V0aW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNJbk1lbW9yeUV4ZWN1dGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBFeGVjdXRvciBuZXdJbk1lbW9yeUV4ZWN1dG9yKENsYXNzTWV0YURhdGEgbWV0YSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBFeGVjdXRvciBuZXdEYXRhU3RvcmVFeGVjdXRvcihDbGFzc01ldGFEYXRhIG1ldGEsIGJvb2xlYW4gc3VicykgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Fic3RyYWN0RXhlY3V0b3JzKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDYW5kaWRhdGVUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1BhcmFtZXRlckRlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQYXJhbWV0ZXJEZWNsYXJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFic3RyYWN0IHtAbGluayBFeGVjdXRvcn0gdGhhdCBpbXBsZW1lbnRzIG1vc3QgbWV0aG9kcyBhcyBuby1vcHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4ZWN1dG9yCisgICAgICAgIGltcGxlbWVudHMgRXhlY3V0b3IgeworCisgICAgICAgIHB1YmxpYyBOdW1iZXIgZXhlY3V0ZURlbGV0ZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuIHEuZ2V0Q29udGV4dCgpLmRlbGV0ZUluTWVtb3J5KHEsIHRoaXMsIHBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTnVtYmVyIGV4ZWN1dGVVcGRhdGUoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgICAgIHJldHVybiBxLmdldENvbnRleHQoKS51cGRhdGVJbk1lbW9yeShxLCB0aGlzLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldERhdGFTdG9yZUFjdGlvbnMoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMsCisgICAgICAgICAgICBSYW5nZSByYW5nZSkgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR1M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdldFJhbmdlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLCBSYW5nZSByYW5nZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgT2JqZWN0IHJlc3VsdE9iamVjdCwgaW50IG9yZGVySW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW5bXSBnZXRBc2NlbmRpbmcoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQk9PTEVBTlM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2tpbmcoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvamVjdGlvbkFsaWFzZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RSSU5HUzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc1tdIGdldFByb2plY3Rpb25UeXBlcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9DTEFTU0VTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzTWV0YURhdGFbXSBnZXRBY2Nlc3NQYXRoTWV0YURhdGFzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01FVEFTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRPcGVyYXRpb24oU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gT1BfU0VMRUNUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZ2dyZWdhdGUoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNHcm91cGluZyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaW5rZWRNYXAgZ2V0UGFyYW1ldGVyVHlwZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfUEFSQU1TOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGdldFJlc3VsdENsYXNzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwIGdldFVwZGF0ZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0F0dGFjaE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0F0dGFjaE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM1MzNjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQXR0YWNoTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuSWRlbnRpdHlNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5DYWxsYmFja01vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DYWxsYmFja0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3B0aW1pc3RpY0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBIYW5kbGVzIGF0dGFjaGluZyBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgQXR0YWNoTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBdHRhY2hNYW5hZ2VyLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgQnJva2VySW1wbCBfYnJva2VyOworICAgIHByaXZhdGUgZmluYWwgUHJveHlNYW5hZ2VyIF9wcm94eTsKKyAgICBwcml2YXRlIGZpbmFsIE9wQ2FsbGJhY2tzIF9jYWxsOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfY29weU5ldzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2ZhaWxGYXN0OworICAgIHByaXZhdGUgZmluYWwgSWRlbnRpdHlNYXAgX2F0dGFjaGVkID0gbmV3IElkZW50aXR5TWFwKCk7CisKKyAgICAvLyByZXVzYWJsZSBzdHJhdGVnaWVzCisgICAgcHJpdmF0ZSBBdHRhY2hTdHJhdGVneSBfdmVyc2lvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBBdHRhY2hTdHJhdGVneSBfZGV0YWNoID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgYnJva2VyIGF0dGFjaGluZyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0YWNoTWFuYWdlcihCcm9rZXJJbXBsIGJyb2tlciwgYm9vbGVhbiBjb3B5TmV3LCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIF9icm9rZXIgPSBicm9rZXI7CisgICAgICAgIF9wcm94eSA9IGJyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJveHlNYW5hZ2VySW5zdGFuY2UoKTsKKyAgICAgICAgX2NhbGwgPSBjYWxsOworICAgICAgICBfY29weU5ldyA9IGNvcHlOZXc7CisgICAgICAgIF9mYWlsRmFzdCA9IChicm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YUZhY3RvcnkoKS5nZXREZWZhdWx0cygpLmdldENhbGxiYWNrTW9kZSgpCisgICAgICAgICAgICAmIENhbGxiYWNrTW9kZXMuQ0FMTEJBQ0tfRkFJTF9GQVNUKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmVoYXZpb3Igc3VwcGxpZWQgb24gY29uc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPcENhbGxiYWNrcyBnZXRCZWhhdmlvcigpIHsKKyAgICAgICAgcmV0dXJuIF9jYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRvIGNvcHkgbmV3IGluc3RhbmNlcyBiZWluZyBwZXJzaXN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29weU5ldygpIHsKKyAgICAgICAgcmV0dXJuIF9jb3B5TmV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhdHRhY2hlZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGF0dGFjaChPYmplY3QgcGMpIHsKKyAgICAgICAgaWYgKHBjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDYWxsYmFja0V4Y2VwdGlvbiBleGNlcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gYXR0YWNoKHBjLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FsbGJhY2tFeGNlcHRpb24gY2UpIHsKKyAgICAgICAgICAgIGV4Y2VwID0gY2U7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gd29uJ3QgYmUgcmVhY2hlZCBhcyB0aGUgZXhjZXBzIHdpbGwgYmUgcmV0aHJvd24KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIExpc3QgZXhjZXBzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChleGNlcCA9PSBudWxsIHx8ICFfZmFpbEZhc3QpCisgICAgICAgICAgICAgICAgZXhjZXBzID0gaW52b2tlQWZ0ZXJBdHRhY2gobnVsbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXhjZXBzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChleGNlcCk7CisgICAgICAgICAgICBfYXR0YWNoZWQuY2xlYXIoKTsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9ucyhleGNlcHMsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhdHRhY2hlZCB2ZXJzaW9ucyBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBhdHRhY2hBbGwoQ29sbGVjdGlvbiBpbnN0YW5jZXMpIHsKKyAgICAgICAgT2JqZWN0W10gYXR0YWNoZWQgPSBuZXcgT2JqZWN0W2luc3RhbmNlcy5zaXplKCldOworICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisgICAgICAgIExpc3QgZmFpbGVkID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBvcHQgPSB0cnVlOworICAgICAgICBib29sZWFuIGZhaWxGYXN0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGluc3RhbmNlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZFtpXSA9IGF0dGFjaChpdHIubmV4dCgpLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIGV4Y2VwdGlvbnMgYW5kIG9wdGltaXN0aWMgZmFpbGVkIG9iamVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wdCAmJiAhKGtlIGluc3RhbmNlb2YgT3B0aW1pc3RpY0V4Y2VwdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wdCAmJiBrZS5nZXRGYWlsZWRPYmplY3QoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gYWRkKGZhaWxlZCwga2UuZ2V0RmFpbGVkT2JqZWN0KCkpOworICAgICAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGQoZXhjZXBzLCBrZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtlIGluc3RhbmNlb2YgQ2FsbGJhY2tFeGNlcHRpb24gJiYgX2ZhaWxGYXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRmFzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGQoZXhjZXBzLCByZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gaW52b2tlIHBvc3QgY2FsbGJhY2tzIHVubGVzcyBhbGwgZmFpbGVkCisgICAgICAgICAgICBpZiAoIWZhaWxGYXN0ICYmIChleGNlcHMgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGV4Y2Vwcy5zaXplKCkgPCBpbnN0YW5jZXMuc2l6ZSgpKSkKKyAgICAgICAgICAgICAgICBleGNlcHMgPSBpbnZva2VBZnRlckF0dGFjaChleGNlcHMpOworICAgICAgICAgICAgX2F0dGFjaGVkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3dFeGNlcHRpb25zKGV4Y2VwcywgZmFpbGVkLCBvcHQpOworICAgICAgICByZXR1cm4gYXR0YWNoZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIHBvc3RBdHRhY2goKSBvbiBhbnkgYXR0YWNoZWQgaW5zdGFuY2VzIHRoYXQgaW1wbGVtZW50CisgICAgICogUG9zdEF0dGFjaENhbGxiYWNrLiBUaGlzIHdpbGwgYmUgZG9uZSBhZnRlciB0aGUgZW50aXJlIGdyYXBoIGhhcworICAgICAqIGJlZW4gYXR0YWNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IGludm9rZUFmdGVyQXR0YWNoKExpc3QgZXhjZXBzKSB7CisgICAgICAgIFNldCBlbnRyaWVzID0gX2F0dGFjaGVkLmVudHJ5U2V0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudHJpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCBhdHRhY2hlZCA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gX2Jyb2tlci5nZXRTdGF0ZU1hbmFnZXJJbXBsKGF0dGFjaGVkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChzbS5pc05ldygpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfYnJva2VyLmZpcmVMaWZlY3ljbGVFdmVudChhdHRhY2hlZCwgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIHNtLmdldE1ldGFEYXRhKCksIExpZmVjeWNsZUV2ZW50LkFGVEVSX0FUVEFDSCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgcmUpOworICAgICAgICAgICAgICAgIGlmIChfZmFpbEZhc3QgJiYgcmUgaW5zdGFuY2VvZiBDYWxsYmFja0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4Y2VwczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gb2JqZWN0IHRvIHRoZSBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBhZGQoTGlzdCBsaXN0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpCisgICAgICAgICAgICBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQob2JqKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3cgZXhjZXB0aW9uIGZvciBmYWlsdXJlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGhyb3dFeGNlcHRpb25zKExpc3QgZXhjZXBzLCBMaXN0IGZhaWxlZCwgYm9vbGVhbiBvcHQpIHsKKyAgICAgICAgaWYgKGV4Y2VwcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZXhjZXBzLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGV4Y2Vwcy5nZXQoMCk7CisKKyAgICAgICAgVGhyb3dhYmxlW10gdCA9IChUaHJvd2FibGVbXSkgZXhjZXBzLnRvQXJyYXkKKyAgICAgICAgICAgIChuZXcgVGhyb3dhYmxlW2V4Y2Vwcy5zaXplKCldKTsKKyAgICAgICAgaWYgKG9wdCAmJiBmYWlsZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljRXhjZXB0aW9uKGZhaWxlZCwgdCk7CisgICAgICAgIGlmIChvcHQpCisgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0V4Y2VwdGlvbih0KTsKKyAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5lc3RlZC1leGNlcHMiKSkuCisgICAgICAgICAgICBzZXROZXN0ZWRUaHJvd2FibGVzKHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b0F0dGFjaCB0aGUgZGV0YWNoZWQgb2JqZWN0CisgICAgICogQHBhcmFtIGludG8gdGhlIGluc3RhbmNlIHdlJ3JlIGF0dGFjaGluZyBpbnRvCisgICAgICogQHBhcmFtIG93bmVyIHN0YXRlIG1hbmFnZXIgZm9yIDxjb2RlPmludG88L2NvZGU+CisgICAgICogQHBhcmFtIG93bmVyTWV0YSB0aGUgZmllbGQgd2UgdHJhdmVyc2VkIHRvIGZpbmQgPGNvZGU+dG9BdHRhY2g8L2NvZGU+CisgICAgICogQHBhcmFtIGV4cGxpY2l0IHdoZXRoZXIgdG8gbWFrZSBuZXcgaW5zdGFuY2VzIGV4cGxpY2l0bHkgcGVyc2lzdGVudAorICAgICAqLworICAgIE9iamVjdCBhdHRhY2goT2JqZWN0IHRvQXR0YWNoLCBQZXJzaXN0ZW5jZUNhcGFibGUgaW50bywKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwgVmFsdWVNZXRhRGF0YSBvd25lck1ldGEsIGJvb2xlYW4gZXhwbGljaXQpIHsKKyAgICAgICAgaWYgKHRvQXR0YWNoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IGF0dGFjaGVkCisgICAgICAgIE9iamVjdCBhdHRhY2hlZCA9IF9hdHRhY2hlZC5nZXQodG9BdHRhY2gpOworICAgICAgICBpZiAoYXR0YWNoZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhdHRhY2hlZDsKKworICAgICAgICAvLyMjIyBuZWVkIHRvIGhhbmRsZSBBQ1RfQ0FTQ0FERQorICAgICAgICBpbnQgYWN0aW9uID0gcHJvY2Vzc0FyZ3VtZW50KHRvQXR0YWNoKTsKKyAgICAgICAgaWYgKChhY3Rpb24gJiBPcENhbGxiYWNrcy5BQ1RfUlVOKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRvQXR0YWNoOworCisgICAgICAgIC8vIyMjIG5lZWQgdG8gaGFuZGxlIEFDVF9SVU4gd2l0aG91dCBhbHNvIEFDVF9DQVNDQURFCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IF9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS5nZXRNZXRhRGF0YSh0b0F0dGFjaC5nZXRDbGFzcygpLAorICAgICAgICAgICAgX2Jyb2tlci5nZXRDbGFzc0xvYWRlcigpLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIGdldFN0cmF0ZWd5KHRvQXR0YWNoKS5hdHRhY2godGhpcywgdG9BdHRhY2gsIG1ldGEsIGludG8sCisgICAgICAgICAgICBvd25lciwgb3duZXJNZXRhLCBleHBsaWNpdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBhY3Rpb24gdG8gdGFrZSBvbiB0aGUgZ2l2ZW4gYXJndW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcHJvY2Vzc0FyZ3VtZW50KE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKF9jYWxsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gT3BDYWxsYmFja3MuQUNUX1JVTjsKKyAgICAgICAgcmV0dXJuIF9jYWxsLnByb2Nlc3NBcmd1bWVudChPcENhbGxiYWNrcy5PUF9BVFRBQ0gsIG9iaiwKKyAgICAgICAgICAgIF9icm9rZXIuZ2V0U3RhdGVNYW5hZ2VyKG9iaikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSBwcm9wZXIgYXR0YWNoIHN0cmF0ZWd5IGZvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEF0dGFjaFN0cmF0ZWd5IGdldFN0cmF0ZWd5KE9iamVjdCB0b0F0dGFjaCkgeworICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSB0b0F0dGFjaDsKKyAgICAgICAgaWYgKHBjLnBjR2V0U3RhdGVNYW5hZ2VyKCkgaW5zdGFuY2VvZiBBdHRhY2hTdHJhdGVneSkKKyAgICAgICAgICAgIHJldHVybiAoQXR0YWNoU3RyYXRlZ3kpIHBjLnBjR2V0U3RhdGVNYW5hZ2VyKCk7CisKKyAgICAgICAgT2JqZWN0IG9iaiA9IHBjLnBjR2V0RGV0YWNoZWRTdGF0ZSgpOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXR0YWNoU3RyYXRlZ3kpCisgICAgICAgICAgICByZXR1cm4gKEF0dGFjaFN0cmF0ZWd5KSBvYmo7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gUGVyc2lzdGVuY2VDYXBhYmxlLkRFU0VSSUFMSVpFRCkgeworICAgICAgICAgICAgLy8gbmV3IG9yIGRldGFjaGVkIHdpdGhvdXQgc3RhdGUKKyAgICAgICAgICAgIGlmIChfdmVyc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gbmV3IFZlcnNpb25BdHRhY2hTdHJhdGVneSgpOworICAgICAgICAgICAgcmV0dXJuIF92ZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGV0YWNoZWQgc3RhdGUKKyAgICAgICAgaWYgKF9kZXRhY2ggPT0gbnVsbCkKKyAgICAgICAgICAgIF9kZXRhY2ggPSBuZXcgRGV0YWNoZWRTdGF0ZUF0dGFjaFN0cmF0ZWd5KCk7CisgICAgICAgIHJldHVybiBfZGV0YWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIE93bmluZyBicm9rZXIuCisgICAgICovCisgICAgQnJva2VySW1wbCBnZXRCcm9rZXIoKSB7CisgICAgICAgIHJldHVybiBfYnJva2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5c3RlbSBwcm94eSBtYW5hZ2VyLgorICAgICAqLworICAgIFByb3h5TWFuYWdlciBnZXRQcm94eU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBfcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHBhc3NlZCBpbiBhcmd1bWVudCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkLCByZXR1cm4KKyAgICAgKiB0aGUgKGNhY2hlZCkgYXR0YWNoZWQgY29weS4KKyAgICAgKi8KKyAgICBQZXJzaXN0ZW5jZUNhcGFibGUgZ2V0QXR0YWNoZWRDb3B5KE9iamVjdCBwYykgeworICAgICAgICByZXR1cm4gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgX2F0dGFjaGVkLmdldChwYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBhdHRhY2hlZCBjb3B5IGluIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEF0dGFjaGVkQ29weShPYmplY3QgZnJvbSwgUGVyc2lzdGVuY2VDYXBhYmxlIGludG8pIHsKKyAgICAgICAgX2F0dGFjaGVkLnB1dChmcm9tLCBpbnRvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIGJlZm9yZS1hdHRhY2ggZXZlbnQuCisgICAgICovCisgICAgdm9pZCBmaXJlQmVmb3JlQXR0YWNoKE9iamVjdCBwYywgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9icm9rZXIuZmlyZUxpZmVjeWNsZUV2ZW50KHBjLCBudWxsLCBtZXRhLAorICAgICAgICAgICAgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0FUVEFDSCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXRhY2hlZCBvaWQgb2YgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIE9iamVjdCBnZXREZXRhY2hlZE9iamVjdElkKE9iamVjdCBwYykgeworICAgICAgICBpZiAocGMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0U3RyYXRlZ3kocGMpLmdldERldGFjaGVkT2JqZWN0SWQodGhpcywgcGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBtYW5hZ2VkOyBvdGhlcndpc2UKKyAgICAgKiByZXR1cm4gaXRzIHN0YXRlIG1hbmFnZXIuCisgICAgICovCisgICAgU3RhdGVNYW5hZ2VySW1wbCBhc3NlcnRNYW5hZ2VkKE9iamVjdCBvYmopIHsKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IF9icm9rZXIuZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIHRydWUpOworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtbWFuYWdlZCIsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhvYmopKSkuc2V0RmFpbGVkT2JqZWN0IChvYmopOworCQlyZXR1cm4gc207CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQXR0YWNoU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0F0dGFjaFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkYTAxNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0F0dGFjaFN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBTdHJhdGVneSBmb3IgYXR0YWNoaW5nIG9iamVjdHMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAbm9qYXZhZG9jCisgKi8KK2Fic3RyYWN0IGNsYXNzIEF0dGFjaFN0cmF0ZWd5CisgICAgZXh0ZW5kcyBUcmFuc2ZlckZpZWxkTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBdHRhY2hTdHJhdGVneS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBtYW5hZ2VyIGhvbGRpbmcgY2FjaGUgb2YgYXR0YWNoZWQgaW5zdGFuY2VzCisgICAgICogQHBhcmFtIHRvQXR0YWNoIGRldGFjaGVkIGluc3RhbmNlCisgICAgICogQHBhcmFtIG1ldGEgbWV0YWRhdGEgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBhdHRhY2hlZAorICAgICAqIEBwYXJhbSBpbnRvIGluc3RhbmNlIHdlJ3JlIGF0dGFjaGluZyBpbnRvCisgICAgICogQHBhcmFtIG93bmVyIHN0YXRlIG1hbmFnZXIgZm9yIDxjb2RlPmludG88L2NvZGU+CisgICAgICogQHBhcmFtIG93bmVyTWV0YSBmaWVsZCB3ZSB0cmF2ZXJzZWQgdG8gZmluZCA8Y29kZT50b0F0dGFjaDwvY29kZT4KKyAgICAgKiBAcGFyYW0gZXhwbGljaXQgd2hldGhlciB0byBtYWtlIG5ldyBpbnN0YW5jZXMgZXhwbGljaXRseSBwZXJzaXN0ZW50CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBhdHRhY2goQXR0YWNoTWFuYWdlciBtYW5hZ2VyLAorICAgICAgICBPYmplY3QgdG9BdHRhY2gsIENsYXNzTWV0YURhdGEgbWV0YSwgUGVyc2lzdGVuY2VDYXBhYmxlIGludG8sCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgb3duZXIsIFZhbHVlTWV0YURhdGEgb3duZXJNZXRhLCBib29sZWFuIGV4cGxpY2l0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaWRlbnRpdHkgb2YgdGhlIGdpdmVuIGRldGFjaGVkIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0RGV0YWNoZWRPYmplY3RJZChBdHRhY2hNYW5hZ2VyIG1hbmFnZXIsCisgICAgICAgIE9iamVjdCB0b0F0dGFjaCk7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBnaXZlbiBmaWVsZCBpbnRvIHRoaXMgZmllbGQgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm92aWRlRmllbGQoT2JqZWN0IHRvQXR0YWNoLCBTdGF0ZU1hbmFnZXJJbXBsIHNtLAorICAgICAgICBpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUE5ldy9QTmV3UHJvdmlzaW9uYWwgbWFuYWdlZCBvYmplY3QgZm9yIHRoZSBnaXZlbiBkZXRhY2hlZCAKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RhdGVNYW5hZ2VySW1wbCBwZXJzaXN0KEF0dGFjaE1hbmFnZXIgbWFuYWdlciwKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBDbGFzc01ldGFEYXRhIG1ldGEsIE9iamVjdCBhcHBJZCwgCisgICAgICAgIGJvb2xlYW4gZXhwbGljaXQpIHsKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIG5ld0luc3RhbmNlOworICAgICAgICBpZiAoIW1hbmFnZXIuZ2V0Q29weU5ldygpKQorICAgICAgICAgICAgbmV3SW5zdGFuY2UgPSBwYzsKKyAgICAgICAgZWxzZSBpZiAoYXBwSWQgPT0gbnVsbCkgLy8gZGF0YXN0b3JlIGlkZW50aXR5CisgICAgICAgICAgICBuZXdJbnN0YW5jZSA9IHBjLnBjTmV3SW5zdGFuY2UobnVsbCwgZmFsc2UpOworICAgICAgICBlbHNlIC8vIGFwcGxpY2F0aW9uIGlkZW50aXR5OiB1c2UgZXhpc3RpbmcgZmllbGRzCisgICAgICAgICAgICBuZXdJbnN0YW5jZSA9IHBjLnBjTmV3SW5zdGFuY2UobnVsbCwgYXBwSWQsIGZhbHNlKTsKKworICAgICAgICByZXR1cm4gKFN0YXRlTWFuYWdlckltcGwpIG1hbmFnZXIuZ2V0QnJva2VyKCkucGVyc2lzdAorICAgICAgICAgICAgKG5ld0luc3RhbmNlLCBhcHBJZCwgZXhwbGljaXQsIG1hbmFnZXIuZ2V0QmVoYXZpb3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBnaXZlbiBmaWVsZCBpbnRvIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b0F0dGFjaCB0aGUgZGV0YWNoZWQgcGVyc2lzdGVudCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBzbSBzdGF0ZSBtYW5hZ2VyIGZvciB0aGUgbWFuYWdlZCBpbnN0YW5jZSB3ZSdyZSBjb3B5aW5nCisgICAgICogaW50bzsgPGNvZGU+dG9BdHRhY2g8L2NvZGU+IGFsc28gdXNlcyB0aGlzIHN0YXRlIG1hbmFnZXIKKyAgICAgKiBAcGFyYW0gZm1kIG1ldGFkYXRhIG9uIHRoZSBmaWVsZCB3ZSdyZSBjb3B5aW5nCisgICAgICogQHBhcmFtIG51bGxMb2FkZWQgaWYgZmFsc2UsIG51bGxzIHdpbGwgYmUgY29uc2lkZXJlZCB1bmxvYWRlZCBhbmQgd2lsbAorICAgICAqIG5vdCBiZSBhdHRhY2hlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGF0dGFjaEZpZWxkKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwgT2JqZWN0IHRvQXR0YWNoLAorICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtLCBGaWVsZE1ldGFEYXRhIGZtZCwgYm9vbGVhbiBudWxsTG9hZGVkKSB7CisgICAgICAgIGlmIChmbWQuaXNWZXJzaW9uKCkKKyAgICAgICAgICAgIHx8IGZtZC5nZXRNYW5hZ2VtZW50KCkgIT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgaW50byA9IHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpOworICAgICAgICBpbnQgaSA9IGZtZC5nZXRJbmRleCgpOworICAgICAgICBwcm92aWRlRmllbGQodG9BdHRhY2gsIHNtLCBpKTsKKworICAgICAgICBpbnQgc2V0ID0gU3RhdGVNYW5hZ2VyLlNFVF9BVFRBQ0g7CisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICBzbS5zZXR0aW5nQm9vbGVhbkZpZWxkKGludG8sIGksIHNtLmZldGNoQm9vbGVhbkZpZWxkKGkpLAorICAgICAgICAgICAgICAgICAgICBmZXRjaEJvb2xlYW5GaWVsZChpKSwgc2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgc20uc2V0dGluZ0J5dGVGaWVsZChpbnRvLCBpLCBzbS5mZXRjaEJ5dGVGaWVsZChpKSwKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2hCeXRlRmllbGQoaSksIHNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIHNtLnNldHRpbmdDaGFyRmllbGQoaW50bywgaSwgc20uZmV0Y2hDaGFyRmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgIGZldGNoQ2hhckZpZWxkKGkpLCBzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHNtLnNldHRpbmdEb3VibGVGaWVsZChpbnRvLCBpLCBzbS5mZXRjaERvdWJsZUZpZWxkKGkpLAorICAgICAgICAgICAgICAgICAgICBmZXRjaERvdWJsZUZpZWxkKGkpLCBzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgc20uc2V0dGluZ0Zsb2F0RmllbGQoaW50bywgaSwgc20uZmV0Y2hGbG9hdEZpZWxkKGkpLAorICAgICAgICAgICAgICAgICAgICBmZXRjaEZsb2F0RmllbGQoaSksIHNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICAgICAgc20uc2V0dGluZ0ludEZpZWxkKGludG8sIGksIHNtLmZldGNoSW50RmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgIGZldGNoSW50RmllbGQoaSksIHNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgIHNtLnNldHRpbmdMb25nRmllbGQoaW50bywgaSwgc20uZmV0Y2hMb25nRmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgIGZldGNoTG9uZ0ZpZWxkKGkpLCBzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgc20uc2V0dGluZ1Nob3J0RmllbGQoaW50bywgaSwgc20uZmV0Y2hTaG9ydEZpZWxkKGkpLAorICAgICAgICAgICAgICAgICAgICBmZXRjaFNob3J0RmllbGQoaSksIHNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgU3RyaW5nIHN2YWwgPSBmZXRjaFN0cmluZ0ZpZWxkKGkpOworICAgICAgICAgICAgICAgIGlmIChzdmFsID09IG51bGwgJiYgIW51bGxMb2FkZWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBzbS5zZXR0aW5nU3RyaW5nRmllbGQoaW50bywgaSwgc20uZmV0Y2hTdHJpbmdGaWVsZChpKSwgc3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgc2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DQUxFTkRBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk5VTUJFUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdERUNJTUFMOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHSU5URUdFUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPQ0FMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9JRDoKKyAgICAgICAgICAgICAgICB2YWwgPSBmZXRjaE9iamVjdEZpZWxkKGkpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiAhbnVsbExvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChpbnRvLCBpLCBzbS5mZXRjaE9iamVjdEZpZWxkKGkpLCB2YWwsCisgICAgICAgICAgICAgICAgICAgIHNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDX1VOVFlQRUQ6CisgICAgICAgICAgICAgICAgT2JqZWN0IGZybXBjID0gZmV0Y2hPYmplY3RGaWVsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJtcGMgPT0gbnVsbCAmJiAhbnVsbExvYWRlZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgdG9zbSA9IG1hbmFnZXIuZ2V0QnJva2VyKCkuZ2V0U3RhdGVNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIChzbS5mZXRjaE9iamVjdEZpZWxkKGkpKTsKKyAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgdG9wYyA9ICh0b3NtID09IG51bGwpID8gbnVsbAorICAgICAgICAgICAgICAgICAgICA6IHRvc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZybXBjICE9IG51bGwgfHwgdG9wYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0Q2FzY2FkZUF0dGFjaCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJtcGMgPSBnZXRSZWZlcmVuY2UobWFuYWdlciwgZnJtcGMsIHNtLCBmbWQpOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbmNlQ2FwYWJsZSBpbnRvcGMgPSB0b3BjOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmbWQuaXNFbWJlZGRlZFBDKCkgJiYgZnJtcGMgIT0gbnVsbCAmJiB0b3BjICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhT2JqZWN0VXRpbHMuZXF1YWxzKHRvcGMucGNGZXRjaE9iamVjdElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXREZXRhY2hlZE9iamVjdElkKGZybXBjKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvcGMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnJtcGMgPSBtYW5hZ2VyLmF0dGFjaChmcm1wYywgaW50b3BjLCBzbSwgZm1kLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZybXBjICE9IHRvcGMpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nT2JqZWN0RmllbGQoaW50bywgaSwgdG9wYywgZnJtcGMsIHNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGZybWMgPSAoQ29sbGVjdGlvbikgZmV0Y2hPYmplY3RGaWVsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJtYyA9PSBudWxsICYmICFudWxsTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiB0b2MgPSAoQ29sbGVjdGlvbikgc20uZmV0Y2hPYmplY3RGaWVsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRvYyAhPSBudWxsICYmICF0b2MuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICB8fCBmcm1jICE9IG51bGwgJiYgIWZybWMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcm1jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nT2JqZWN0RmllbGQoaW50bywgaSwgdG9jLCBudWxsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ09iamVjdEZpZWxkKGludG8sIGksIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoQ29sbGVjdGlvbihtYW5hZ2VyLCBmcm1jLCBzbSwgZm1kKSwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2MgaW5zdGFuY2VvZiBTZXQgJiYgZnJtYyBpbnN0YW5jZW9mIFNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VDb2xsZWN0aW9uKG1hbmFnZXIsIGZybWMsIHRvYywgc20sIGZtZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ09iamVjdEZpZWxkKGludG8sIGksIHRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlTGlzdChtYW5hZ2VyLCBmcm1jLCB0b2MsIHNtLCBmbWQpLCBzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIE1hcCBmcm1tID0gKE1hcCkgZmV0Y2hPYmplY3RGaWVsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJtbSA9PSBudWxsICYmICFudWxsTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgTWFwIHRvbSA9IChNYXApIHNtLmZldGNoT2JqZWN0RmllbGQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCh0b20gIT0gbnVsbCAmJiAhdG9tLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGZybW0gIT0gbnVsbCAmJiAhZnJtbS5pc0VtcHR5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcm1tID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nT2JqZWN0RmllbGQoaW50bywgaSwgdG9tLCBudWxsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChpbnRvLCBpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaE1hcChtYW5hZ2VyLCBmcm1tLCBzbSwgZm1kKSwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZU1hcChtYW5hZ2VyLCBmcm1tLCB0b20sIHNtLCBmbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIE9iamVjdCBmcm1hID0gZmV0Y2hPYmplY3RGaWVsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJtYSA9PSBudWxsICYmICFudWxsTG9hZGVkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgT2JqZWN0IHRvYSA9IHNtLmZldGNoT2JqZWN0RmllbGQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCh0b2EgIT0gbnVsbCAmJiBBcnJheS5nZXRMZW5ndGgodG9hKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHx8IChmcm1hICE9IG51bGwgJiYgQXJyYXkuZ2V0TGVuZ3RoKGZybWEpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZybWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChpbnRvLCBpLCB0b2EsIG51bGwsIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChpbnRvLCBpLCB0b2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUFycmF5KG1hbmFnZXIsIGZybWEsIHRvYSwgc20sIGZtZCksIHNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oZm1kLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hbmFnZWQsIHBvc3NpYmx5IGhvbGxvdyByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiBkZXRhY2hlZAorICAgICAqIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJlZmVyZW5jZShBdHRhY2hNYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCB0b0F0dGFjaCwKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgVmFsdWVNZXRhRGF0YSB2bWQpIHsKKyAgICAgICAgaWYgKHRvQXR0YWNoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0QnJva2VyKCkuaXNEZXRhY2hlZCh0b0F0dGFjaCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBvaWQgPSBtYW5hZ2VyLmdldERldGFjaGVkT2JqZWN0SWQodG9BdHRhY2gpOworICAgICAgICAgICAgaWYgKG9pZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLmdldEJyb2tlcigpLmZpbmQob2lkLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtY2FzY2FkZS1hdHRhY2giLAorICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyh0b0F0dGFjaCksIHZtZCwKKyAgICAgICAgICAgIEV4Y2VwdGlvbnMudG9TdHJpbmcoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpKSkuCisgICAgICAgICAgICBzZXRGYWlsZWRPYmplY3QodG9BdHRhY2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIDxjb2RlPnRvYzwvY29kZT4gd2l0aCB0aGUgY29udGVudHMgb2YKKyAgICAgKiA8Y29kZT5mcm1jPC9jb2RlPi4gTmVpdGhlciBjb2xsZWN0aW9uIGlzIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VDb2xsZWN0aW9uKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbiBmcm1jLAorICAgICAgICBDb2xsZWN0aW9uIHRvYywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgLy8gaWYgZnJtYyBjb2xsZWN0aW9uIGlzIGVtcHR5LCBqdXN0IGNsZWFyIHRvYworICAgICAgICBpZiAoZnJtYy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghdG9jLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB0b2MuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBwYyBjb2xsZWN0aW9uLCBhdHRhY2ggYWxsIGluc3RhbmNlcworICAgICAgICBib29sZWFuIHBjID0gZm1kLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCk7CisgICAgICAgIGlmIChwYykKKyAgICAgICAgICAgIGZybWMgPSBhdHRhY2hDb2xsZWN0aW9uKG1hbmFnZXIsIGZybWMsIHNtLCBmbWQpOworCisgICAgICAgIC8vIHJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgdG9jIGNvbGxlY3Rpb24gdGhhdCBhcmVuJ3QgaW4gZnJtYworICAgICAgICB0b2MucmV0YWluQWxsKGZybWMpOworCisgICAgICAgIC8vIG5vdyBhZGQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGZybWMgYnV0IG5vdCB0b2MKKyAgICAgICAgaWYgKGZybWMuc2l6ZSgpICE9IHRvYy5zaXplKCkpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZybWMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCF0b2MuY29udGFpbnMob2IpKQorICAgICAgICAgICAgICAgICAgICB0b2MuYWRkKG9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBjb2xsZWN0aW9uIHdpdGggdGhlIGF0dGFjaGVkIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBvbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gYXR0YWNoQ29sbGVjdGlvbihBdHRhY2hNYW5hZ2VyIG1hbmFnZXIsCisgICAgICAgIENvbGxlY3Rpb24gb3JpZywgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gY29weUNvbGxlY3Rpb24obWFuYWdlciwgb3JpZywgZm1kKTsKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQgPSBmbWQuZ2V0RWxlbWVudCgpOworICAgICAgICBpZiAoIXZtZC5pc0RlY2xhcmVkVHlwZVBDKCkpCisgICAgICAgICAgICByZXR1cm4gY29sbDsKKworICAgICAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gY2xlYXIgdGhlIG9yaWdpbmFsIGFuZCByZS1hZGQKKyAgICAgICAgY29sbC5jbGVhcigpOworICAgICAgICBPYmplY3QgZWxlbTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvcmlnLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAodm1kLmdldENhc2NhZGVBdHRhY2goKSA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfTk9ORSkKKyAgICAgICAgICAgICAgICBlbGVtID0gZ2V0UmVmZXJlbmNlKG1hbmFnZXIsIGl0ci5uZXh0KCksIHNtLCB2bWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVsZW0gPSBtYW5hZ2VyLmF0dGFjaChpdHIubmV4dCgpLCBudWxsLCBzbSwgdm1kLCBmYWxzZSk7CisgICAgICAgICAgICBjb2xsLmFkZChlbGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGNvcHlDb2xsZWN0aW9uKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbiBvcmlnLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBtYW5hZ2VyLmdldFByb3h5TWFuYWdlcigpLmNvcHlDb2xsZWN0aW9uKG9yaWcpOworICAgICAgICBpZiAoY29sbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1jb3B5YWJsZSIsIGZtZCkpOworICAgICAgICByZXR1cm4gY29sbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGF0dGFjaGVkIHZlcnNpb24gb2YgdGhlIDxjb2RlPmZybWw8L2NvZGU+CisgICAgICogbGlzdCBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiA8Y29kZT50b2w8L2NvZGU+LiBJZiB0aGUgbGlzdHMKKyAgICAgKiB3aWxsIGJlIGlkZW50aWNhbCwgcmV0dXJucyA8Y29kZT50b2w8L2NvZGU+LiBOZWl0aGVyIGxpc3QgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbGxlY3Rpb24gcmVwbGFjZUxpc3QoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uIGZybWwsCisgICAgICAgIENvbGxlY3Rpb24gdG9sLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBib29sZWFuIHBjID0gZm1kLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCk7CisgICAgICAgIGlmIChwYykKKyAgICAgICAgICAgIGZybWwgPSBhdHRhY2hDb2xsZWN0aW9uKG1hbmFnZXIsIGZybWwsIHNtLCBmbWQpOworCisgICAgICAgIC8vIGlmIHRoZSBvbmx5IGRpZmYgYmV0d2VlbiBmcm1sIGFuZCB0b2wgaXMgc29tZSBhZGRlZCBlbGVtZW50cyBhdAorICAgICAgICAvLyB0aGUgZW5kLCBtYWtlIHRoZSBjaGFuZ2VzIGRpcmVjdGx5IGluIHRvbAorICAgICAgICBpZiAoZnJtbC5zaXplKCkgPj0gdG9sLnNpemUoKSkgeworICAgICAgICAgICAgSXRlcmF0b3IgZnJtaSA9IGZybWwuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdG9pID0gdG9sLml0ZXJhdG9yKCk7IHRvaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhbiBpbmNvbXBhdGliaWxpdHksIGp1c3QgcmV0dXJuIGEgY29weSBvZiBmcm1sCisgICAgICAgICAgICAgICAgLy8gKGl0J3MgYWxyZWFkeSBjb3BpZWQgaWYgd2UgYXR0YWNoZWQgaXQpCisgICAgICAgICAgICAgICAgaWYgKCFlcXVhbHMoZnJtaS5uZXh0KCksIHRvaS5uZXh0KCksIHBjKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYykgPyBmcm1sIDogY29weUNvbGxlY3Rpb24obWFuYWdlciwgZnJtbCwgZm1kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8ganVzdCBhZGQgdGhlIGV4dHJhIGVsZW1lbnRzIGluIGZybWwgdG8gdG9sIGFuZCByZXR1cm4gdG9sCisgICAgICAgICAgICB3aGlsZSAoZnJtaS5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgdG9sLmFkZChmcm1pLm5leHQoKSk7CisgICAgICAgICAgICByZXR1cm4gdG9sOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQ7IGp1c3QgbWFrZSBzdXJlIGZybWwgaXMgY29waWVkIGFuZCByZXR1cm4gaXQKKyAgICAgICAgcmV0dXJuIChwYykgPyBmcm1sIDogY29weUNvbGxlY3Rpb24obWFuYWdlciwgZnJtbCwgZm1kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiA8Y29kZT50b208L2NvZGU+IHdpdGggdGhlIGNvbnRlbnRzIG9mCisgICAgICogPGNvZGU+ZnJtbTwvY29kZT4uIE5laXRoZXIgbWFwIGlzIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNYXAoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBNYXAgZnJtbSwgTWFwIHRvbSwKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaWYgKGZybW0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoIXRvbS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgdG9tLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcGMgbWFwLCBhdHRhY2ggYWxsIGluc3RhbmNlcworICAgICAgICBib29sZWFuIGtleVBDID0gZm1kLmdldEtleSgpLmlzRGVjbGFyZWRUeXBlUEMoKTsKKyAgICAgICAgYm9vbGVhbiB2YWxQQyA9IGZtZC5nZXRFbGVtZW50KCkuaXNEZWNsYXJlZFR5cGVQQygpOworICAgICAgICBpZiAoa2V5UEMgfHwgdmFsUEMpCisgICAgICAgICAgICBmcm1tID0gYXR0YWNoTWFwKG1hbmFnZXIsIGZybW0sIHNtLCBmbWQpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSBhbGwgdGhlIGtleXMgaW4gdGhlIGZyb20gbWFwIGFyZSBpbiB0aGUgdHdvIG1hcCwgYW5kCisgICAgICAgIC8vIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlcworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmcm1tLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghdG9tLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKQorICAgICAgICAgICAgICAgIHx8ICFlcXVhbHModG9tLmdldChlbnRyeS5nZXRLZXkoKSksIGVudHJ5LmdldFZhbHVlKCksIHZhbFBDKSkgeworICAgICAgICAgICAgICAgIHRvbS5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIGFueSBrZXlzIGluIHRoZSB0byBtYXAgdGhhdCBhcmVuJ3QgaW4gdGhlIGZyb20gbWFwCisgICAgICAgIGlmICh0b20uc2l6ZSgpICE9IGZybW0uc2l6ZSgpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0b20ua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgaWYgKCEoZnJtbS5jb250YWluc0tleShpLm5leHQoKSkpKQorICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBzdXJlIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBnaXZlbiBtYXAgYXJlIGF0dGFjaGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgYXR0YWNoTWFwKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwgTWFwIG9yaWcsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIE1hcCBtYXAgPSBtYW5hZ2VyLmdldFByb3h5TWFuYWdlcigpLmNvcHlNYXAob3JpZyk7CisgICAgICAgIGlmIChtYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtY29weWFibGUiLCBmbWQpKTsKKworICAgICAgICBWYWx1ZU1ldGFEYXRhIGtleW1kID0gZm1kLmdldEtleSgpOworICAgICAgICBWYWx1ZU1ldGFEYXRhIHZhbG1kID0gZm1kLmdldEVsZW1lbnQoKTsKKyAgICAgICAgaWYgKCFrZXltZC5pc0RlY2xhcmVkVHlwZVBDKCkgJiYgIXZhbG1kLmlzRGVjbGFyZWRUeXBlUEMoKSkKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisKKyAgICAgICAgLy8gaWYgd2UgaGF2ZSB0byByZXBsYWNlIGtleXMsIGp1c3QgY2xlYXIgYW5kIHJlLWFkZDsgb3RoZXJ3aXNlCisgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVudHJ5IHNldCB0byByZXNldCB0aGUgdmFsdWVzIG9ubHkKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBpZiAoa2V5bWQuaXNEZWNsYXJlZFR5cGVQQygpKSB7CisgICAgICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgICAgIE9iamVjdCBrZXksIHZhbDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb3JpZy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGtleSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmIChrZXltZC5nZXRDYXNjYWRlQXR0YWNoKCkgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX05PTkUpCisgICAgICAgICAgICAgICAgICAgIGtleSA9IGdldFJlZmVyZW5jZShtYW5hZ2VyLCBrZXksIHNtLCBrZXltZCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBrZXkgPSBtYW5hZ2VyLmF0dGFjaChrZXksIG51bGwsIHNtLCBrZXltZCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbG1kLmlzRGVjbGFyZWRUeXBlUEMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsbWQuZ2V0Q2FzY2FkZUF0dGFjaCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0UmVmZXJlbmNlKG1hbmFnZXIsIHZhbCwgc20sIHZhbG1kKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbWFuYWdlci5hdHRhY2godmFsLCBudWxsLCBzbSwgdmFsbWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPYmplY3QgdmFsOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsbWQuZ2V0Q2FzY2FkZUF0dGFjaCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRSZWZlcmVuY2UobWFuYWdlciwgZW50cnkuZ2V0VmFsdWUoKSwgc20sIHZhbG1kKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IG1hbmFnZXIuYXR0YWNoKGVudHJ5LmdldFZhbHVlKCksIG51bGwsIHNtLCB2YWxtZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUodmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXR0YWNoZWQgdmVyc2lvbiBvZiB0aGUgPGNvZGU+ZnJtYTwvY29kZT4KKyAgICAgKiBhcnJheSBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiA8Y29kZT50b2E8L2NvZGU+LiBJZiB0aGUgYXJyYXlzCisgICAgICogd2lsbCBiZSBpZGVudGljYWwsIHJldHVybnMgPGNvZGU+dG9hPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCByZXBsYWNlQXJyYXkoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBPYmplY3QgZnJtYSwKKyAgICAgICAgT2JqZWN0IHRvYSwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaW50IGxlbiA9IEFycmF5LmdldExlbmd0aChmcm1hKTsKKyAgICAgICAgYm9vbGVhbiBkaWZmID0gdG9hID09IG51bGwgfHwgbGVuICE9IEFycmF5LmdldExlbmd0aCh0b2EpOworCisgICAgICAgIC8vIHBvcHVsYXRlIGFuIGFycmF5IGNvcHkgb24gdGhlIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IHRoZSBhcnJheQorICAgICAgICAvLyBpcyBkaXJ0eQorICAgICAgICBPYmplY3QgbmV3YSA9IEFycmF5Lm5ld0luc3RhbmNlKGZtZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlKCksCisgICAgICAgICAgICBsZW4pOworICAgICAgICBWYWx1ZU1ldGFEYXRhIHZtZCA9IGZtZC5nZXRFbGVtZW50KCk7CisgICAgICAgIGJvb2xlYW4gcGMgPSB2bWQuaXNEZWNsYXJlZFR5cGVQQygpOworICAgICAgICBPYmplY3QgZWxlbTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgZWxlbSA9IEFycmF5LmdldChmcm1hLCBpKTsKKyAgICAgICAgICAgIGlmIChwYykgeworICAgICAgICAgICAgICAgIGlmICh2bWQuZ2V0Q2FzY2FkZUF0dGFjaCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FKQorICAgICAgICAgICAgICAgICAgICBlbGVtID0gZ2V0UmVmZXJlbmNlKG1hbmFnZXIsIGVsZW0sIHNtLCB2bWQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IG1hbmFnZXIuYXR0YWNoKGVsZW0sIG51bGwsIHNtLCB2bWQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZmYgPSBkaWZmIHx8ICFlcXVhbHMoZWxlbSwgQXJyYXkuZ2V0KHRvYSwgaSksIHBjKTsKKyAgICAgICAgICAgIEFycmF5LnNldChuZXdhLCBpLCBlbGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGRpZmYpID8gbmV3YSA6IHRvYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0cyBhcmUgZXF1YWwuIFBDcyBhcmUgY29tcGFyZWQgZm9yCisgICAgICogb24gSlZNIGlkZW50aXR5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhLCBPYmplY3QgYiwgYm9vbGVhbiBwYykgeworICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChwYyB8fCBhID09IG51bGwgfHwgYiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gYS5lcXVhbHMgKGIpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0F1dG9DbGVhci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQXV0b0NsZWFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxNjllMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0F1dG9DbGVhci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBTdGF0ZSBjbGVhcmluZyBjb25zdGFudHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEF1dG9DbGVhciB7CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBzdGF0ZSB3aGVuIGVudGVyaW5nIGEgZGF0YXN0b3JlIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMRUFSX0RBVEFTVE9SRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBzdGF0ZSB3aGVuIGVudGVyaW5nIGFueSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEVBUl9BTEwgPSAxOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQXV0b0RldGFjaC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQXV0b0RldGFjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzkwZDcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9BdXRvRGV0YWNoLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIEJpdCBmbGFncyBmb3Igd2hlbiB0byBhdXRvbWF0aWNhbGx5IGRldGFjaCB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIGNvbnRleHQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXV0b0RldGFjaCB7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggY29udGV4dCBvbiBjbG9zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfQ0xPU0UgPSAyIDw8IDA7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggY29udGV4dCBvbiB0cmFuc2FjdGlvbiBjb21taXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUNIX0NPTU1JVCA9IDIgPDwgMTsKKworICAgIC8qKgorICAgICAqIERldGFjaCBjb250ZXh0IG9uIGFueSBub250cmFuc2N0aW9uYWwgcmVhZCwgc3VjaCB0aGF0IGVhY2gKKyAgICAgKiBub250cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiB1c2VzIGEgbmV3IHBlcnNpc3RlbmNlIGNvbnRleHQgaW4gZXNzZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfTk9OVFhSRUFEID0gMiA8PCAyOworCisgICAgLyoqCisgICAgICogRGV0YWNoIGNvbnRleHQgb24gZmFpbGVkIHRyYW5zYWN0aW9uIGNvbW1pdCAvIHJvbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFDSF9ST0xMQkFDSyA9IDIgPDwgMzsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jvb3RzdHJhcC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQm9vdHN0cmFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwYzM3ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jvb3RzdHJhcC5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLkJyb2tlckZhY3RvcnlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5NYXBDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyBmb3IgYWNxdWlyaW5nIHtAbGluayBCcm9rZXJGYWN0b3J5fSBvYmplY3RzCisgKgorICogQHNpbmNlIDAuNC4wLjAKKyAqLworcHVibGljIGNsYXNzIEJvb3RzdHJhcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEZBQ1RPUllfQVJHUyA9CisgICAgICAgIG5ldyBDbGFzc1tdeyBDb25maWd1cmF0aW9uUHJvdmlkZXIuY2xhc3MgfTsKKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsaXplciBzX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKEJvb3RzdHJhcC5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgZmFjdG9yeSBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJyb2tlckZhY3RvcnkgbmV3QnJva2VyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIEJvb3RzdHJhcC5uZXdCcm9rZXJGYWN0b3J5KG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBmYWN0b3J5IGZvciB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gVGhlIGNsYXNzbG9hZGVyCisgICAgICogd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIGZhY3RvcnkgY2xhc3MuIElmIG5vIGNsYXNzbG9hZGVyIGlzIGdpdmVuLAorICAgICAqIHRoZSB0aHJlYWQncyBjb250ZXh0IGNsYXNzbG9hZGVyIGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCcm9rZXJGYWN0b3J5IG5ld0Jyb2tlckZhY3RvcnkoQ29uZmlndXJhdGlvblByb3ZpZGVyIGNvbmYsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZUZhY3RvcnkoY29uZiwgbG9hZGVyLCAibmV3SW5zdGFuY2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIE9wZW5KUEFFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKE9wZW5KUEFFeGNlcHRpb24pIGNhdXNlOworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHNfbG9jLmdldCgibmV3LWJyb2tlcmZhY3RvcnktZXhjZXAiLAorICAgICAgICAgICAgICAgIGdldEZhY3RvcnlDbGFzc05hbWUoY29uZiwgbG9hZGVyKSksIGNhdXNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKHNfbG9jLmdldCgiYmFkLW5ldy1icm9rZXJmYWN0b3J5IiwKKyAgICAgICAgICAgICAgICBnZXRGYWN0b3J5Q2xhc3NOYW1lKGNvbmYsIGxvYWRlcikpLCBlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHBvb2xlZCBmYWN0b3J5IGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnJva2VyRmFjdG9yeSBnZXRCcm9rZXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gQm9vdHN0cmFwLmdldEJyb2tlckZhY3RvcnkobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcG9vbGVkIGZhY3RvcnkgZm9yIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBUaGUgY2xhc3Nsb2FkZXIKKyAgICAgKiB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUgZmFjdG9yeSBjbGFzcy4gSWYgbm8gY2xhc3Nsb2FkZXIgaXMgZ2l2ZW4sCisgICAgICogdGhlIHRocmVhZCdzIGNvbnRleHQgY2xhc3Nsb2FkZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJyb2tlckZhY3RvcnkgZ2V0QnJva2VyRmFjdG9yeShDb25maWd1cmF0aW9uUHJvdmlkZXIgY29uZiwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaW52b2tlRmFjdG9yeShjb25mLCBsb2FkZXIsICJnZXRJbnN0YW5jZSIpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgT3BlbkpQQUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoT3BlbkpQQUV4Y2VwdGlvbikgY2F1c2U7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oc19sb2MuZ2V0KCJicm9rZXJmYWN0b3J5LWV4Y2VwIiwKKyAgICAgICAgICAgICAgICBnZXRGYWN0b3J5Q2xhc3NOYW1lKGNvbmYsIGxvYWRlcikpLCBjYXVzZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihzX2xvYy5nZXQoImJhZC1icm9rZXJmYWN0b3J5IiwKKyAgICAgICAgICAgICAgICBnZXRGYWN0b3J5Q2xhc3NOYW1lKGNvbmYsIGxvYWRlcikpLCBlKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJyb2tlckZhY3RvcnkgaW52b2tlRmFjdG9yeShDb25maWd1cmF0aW9uUHJvdmlkZXIgY29uZiwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgbWV0aG9kTmFtZSkKKyAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBpZiAoY29uZiA9PSBudWxsKQorICAgICAgICAgICAgY29uZiA9IG5ldyBNYXBDb25maWd1cmF0aW9uUHJvdmlkZXIoKTsKKyAgICAgICAgUHJvZHVjdERlcml2YXRpb25zLmJlZm9yZUNvbmZpZ3VyYXRpb25Db25zdHJ1Y3QoY29uZik7CisKKyAgICAgICAgQ2xhc3MgY2xzID0gZ2V0RmFjdG9yeUNsYXNzKGNvbmYsIGxvYWRlcik7CisgICAgICAgIE1ldGhvZCBtZXRoOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0aCA9IGNscy5nZXRNZXRob2QobWV0aG9kTmFtZSwgRkFDVE9SWV9BUkdTKTsgCisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlcmUgaXMgYSBtaXNtYXRjaCBiZXR3ZWVuIGxvYWRlcnMgYnkgZmFsbGluZworICAgICAgICAgICAgLy8gYmFjayB0byB0aGUgY29uZmlndXJhdGlvbidzIGNsYXNzIGxvYWRlciBmb3IgYnJva2VyIHJlc29sdXRpb24KKyAgICAgICAgICAgIGNscyA9IGdldEZhY3RvcnlDbGFzcyhjb25mLCBjb25mLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBtZXRoID0gY2xzLmdldE1ldGhvZChtZXRob2ROYW1lLCBGQUNUT1JZX0FSR1MpOyAKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoQnJva2VyRmFjdG9yeSkgbWV0aC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdeyBjb25mIH0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKENvbmZpZ3VyYXRpb25Qcm92aWRlciBjb25mLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRGYWN0b3J5Q2xhc3MoY29uZiwgbG9hZGVyKS5nZXROYW1lKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gIjwiICsgZS50b1N0cmluZygpICsgIj4iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgY2xhc3MgZGVzaWduYXRlZCBpbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGdldEZhY3RvcnlDbGFzcyhDb25maWd1cmF0aW9uUHJvdmlkZXIgY29uZiwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgT2JqZWN0IGNscyA9IEJyb2tlckZhY3RvcnlWYWx1ZS5nZXQoY29uZik7CisgICAgICAgIGlmIChjbHMgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIGNsczsKKworICAgICAgICBCcm9rZXJGYWN0b3J5VmFsdWUgdmFsdWUgPSBuZXcgQnJva2VyRmFjdG9yeVZhbHVlKCk7CisgICAgICAgIHZhbHVlLnNldFN0cmluZygoU3RyaW5nKSBjbHMpOworICAgICAgICBTdHJpbmcgY2xzTmFtZSA9IHZhbHVlLmdldENsYXNzTmFtZSgpOworICAgICAgICBpZiAoY2xzTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oc19sb2MuZ2V0KCJuby1icm9rZXJmYWN0b3J5IiwgCisgICAgICAgICAgICAgICAgY29uZi5nZXRQcm9wZXJ0aWVzKCkpKS5zZXRGYXRhbCh0cnVlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xzTmFtZSwgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKHNfbG9jLmdldCgiYmFkLWJyb2tlcmZhY3RvcnktY2xhc3MiLAorICAgICAgICAgICAgICAgIGNsc05hbWUpLCBlKS5zZXRGYXRhbCh0cnVlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jyb2tlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQnJva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmMjE1YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jyb2tlci5qYXZhCkBAIC0wLDAgKzEsNzE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuTG9jYWxUcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5TeW5jaHJvbml6YXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZWUuTWFuYWdlZFJ1bnRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkNhbGxiYWNrTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxpZmVjeWNsZUV2ZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yOworCisvKioKKyAqIFRoZSBicm9rZXIgaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gdGhlIE9wZW5KUEEgcnVudGltZS4gRWFjaCBicm9rZXIKKyAqIG1haW50YWlucyBhbiBpbmRlcGVuZGVudCBvYmplY3QgY2FjaGUgYW5kIGFuIGluZGVwZW5kZW50IHRyYW5zYWN0aW9uYWwKKyAqIGNvbnRleHQuCisgKgorICogQHNpbmNlIDAuNC4wCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEJyb2tlcgorICAgIGV4dGVuZHMgU3luY2hyb25pemF0aW9uLCBDb25uZWN0aW9uLCBMb2NhbFRyYW5zYWN0aW9uLAorICAgIGphdmF4LnJlc291cmNlLnNwaS5Mb2NhbFRyYW5zYWN0aW9uLCBDbG9zZWFibGUsIFN0b3JlQ29udGV4dCwKKyAgICBDb25uZWN0aW9uUmV0YWluTW9kZXMsIERldGFjaFN0YXRlLCBMb2NrTGV2ZWxzLAorICAgIFJlc3RvcmVTdGF0ZSwgQXV0b0NsZWFyLCBBdXRvRGV0YWNoLCBDYWxsYmFja01vZGVzIHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYnJva2VyJ3MgYmVoYXZpb3IgZm9yIGltcGxpY2l0IGFjdGlvbnMgc3VjaCBhcyBmbHVzaGluZywKKyAgICAgKiBhdXRvbWF0aWMgZGV0YWNobWVudCwgYW5kIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IG1hbmFnZWQgaW5zdGFuY2VzIG91dHNpZGUKKyAgICAgKiBhIGJyb2tlciBvcGVyYXRpb24uIEEgYnJva2VyJ3MgaW1wbGljaXQgYmVoYXZpb3IgY2FuIG9ubHkgYmUgc2V0IG9uY2U7CisgICAgICogYWZ0ZXIgdGhlIGZpcnN0IGludm9jYXRpb24gd2l0aCBub24tbnVsbCBhcmd1bWVudHMsCisgICAgICogc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiB0aGlzIG1ldGhvZCBhcmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdEJlaGF2aW9yKE9wQ2FsbGJhY2tzIGNhbGwsCisgICAgICAgIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmFjdG9yeSB0aGF0IHByb2R1Y2VkIHRoaXMgYnJva2VyLgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXJGYWN0b3J5IGdldEJyb2tlckZhY3RvcnkoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiByZXRhaW4gbW9kZSBmb3IgdGhpcyBicm9rZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUmV0YWluTW9kZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYW5hZ2VkIHJ1bnRpbWUgaW4gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VkUnVudGltZSBnZXRNYW5hZ2VkUnVudGltZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbnZlcnNlIG1hbmFnZXIgaW4gdXNlLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4yCisgICAgICovCisgICAgcHVibGljIEludmVyc2VNYW5hZ2VyIGdldEludmVyc2VNYW5hZ2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBicm9rZXIgb3IgaXRzIG1hbmFnZWQgaW5zdGFuY2VzIGFyZSB1c2VkIGluIGEgbXVsdGl0aHJlYWRlZAorICAgICAqIGVudmlyb25tZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE11bHRpdGhyZWFkZWQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGJyb2tlciBvciBpdHMgbWFuYWdlZCBpbnN0YW5jZXMgYXJlIHVzZWQgaW4gYSBtdWx0aXRocmVhZGVkCisgICAgICogZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGl0aHJlYWRlZChib29sZWFuIG11bHRpKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdGFrZSBpbnRvIGFjY291bnQgY2hhbmdlcyBpbiB0aGUgdHJhbnNhY3Rpb24gd2hlbiBleGVjdXRpbmcKKyAgICAgKiBhIHF1ZXJ5IG9yIGl0ZXJhdGluZyBhbiBleHRlbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlQ2hhbmdlcygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB0YWtlIGludG8gYWNjb3VudCBjaGFuZ2VzIGluIHRoZSB0cmFuc2FjdGlvbiB3aGVuIGV4ZWN1dGluZworICAgICAqIGEgcXVlcnkgb3IgaXRlcmF0aW5nIGFuIGV4dGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVDaGFuZ2VzKGJvb2xlYW4gaWdub3JlKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9udHJhbnNhY3Rpb25hbCBhY2Nlc3MgdG8gcGVyc2lzdGVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb250cmFuc2FjdGlvbmFsUmVhZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbGxvdyBub250cmFuc2FjdGlvbmFsIGFjY2VzcyB0byBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vbnRyYW5zYWN0aW9uYWxSZWFkKGJvb2xlYW4gcmVhZCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbnRyYW5zYWN0aW9uYWwgY2hhbmdlcyB0byBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vbnRyYW5zYWN0aW9uYWxXcml0ZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbGxvdyBub250cmFuc2FjdGlvbmFsIGNoYW5nZXMgdG8gcGVyc2lzdGVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsV3JpdGUoYm9vbGVhbiB3cml0ZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJlc3RvcmUgYW4gb2JqZWN0J3Mgb3JpZ2luYWwgc3RhdGUgb24gcm9sbGJhY2suCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXN0b3JlU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcmVzdG9yZSBhbiBvYmplY3QncyBvcmlnaW5hbCBzdGF0ZSBvbiByb2xsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN0b3JlU3RhdGUoaW50IHJlc3RvcmUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB1c2Ugb3B0aW1pc3RpYyB0cmFuc2FjdGlvbmFsIHNlbWFudGljcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcHRpbWlzdGljKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBvcHRpbWlzdGljIHRyYW5zYWN0aW9uYWwgc2VtYW50aWNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWMoYm9vbGVhbiBvcHQpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvYmplY3RzIHJldGFpbiB0aGVpciBwZXJzaXN0ZW50IHN0YXRlIG9uIHRyYW5zYWN0aW9uIGNvbW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5TdGF0ZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvYmplY3RzIHJldGFpbiB0aGVpciBwZXJzaXN0ZW50IHN0YXRlIG9uIHRyYW5zYWN0aW9uIGNvbW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXRhaW5TdGF0ZShib29sZWFuIHJldGFpbik7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9iamVjdHMgY2xlYXIgd2hlbiBlbnRlcmluZyB0cmFuc2FjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBdXRvQ2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb2JqZWN0cyBjbGVhciB3aGVuIGVudGVyaW5nIHRyYW5zYWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ2xlYXIoaW50IGNsZWFyKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGEgZ2xvYmFsIHRyYW5zYWN0aW9uIHVwb24gZXZlcnkgbWFuYWdlZCwKKyAgICAgKiBub24tdHJhbnNhY3Rpb25hbCBvcGVyYXRpb24uIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBjaGVjayBmb3IgYSBnbG9iYWwgdHJhbnNhY3Rpb24gdXBvbiBldmVyeSBtYW5hZ2VkLAorICAgICAqIG5vbi10cmFuc2FjdGlvbmFsIG9wZXJhdGlvbi4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb25zKGJvb2xlYW4gcmVzeW5jKTsKKworICAgIC8qKgorICAgICAqIEJpdCBmbGFncyBtYXJrZWQgaW4ge0BsaW5rIEF1dG9EZXRhY2h9IHdoaWNoIGluZGljYXRlIHdoZW4gcGVyc2lzdGVudAorICAgICAqIG1hbmFnZWQgb2JqZWN0cyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRhY2hlZCBpbi1wbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEF1dG9EZXRhY2goKTsKKworICAgIC8qKgorICAgICAqIEJpdCBmbGFncyBtYXJrZWQgaW4ge0BsaW5rIEF1dG9EZXRhY2h9IHdoaWNoIGluZGljYXRlIHdoZW4gcGVyc2lzdGVudAorICAgICAqIG1hbmFnZWQgb2JqZWN0cyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRhY2hlZCBpbi1wbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGV0YWNoKGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBCaXQgZmxhZ3MgbWFya2VkIGluIHtAbGluayBBdXRvRGV0YWNofSB3aGljaCBpbmRpY2F0ZSB3aGVuIHBlcnNpc3RlbnQKKyAgICAgKiBtYW5hZ2VkIG9iamVjdHMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGV0YWNoZWQgaW4tcGxhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0RldGFjaChpbnQgZmxhZywgYm9vbGVhbiBvbik7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHRyZWF0IHJlbGF0aW9ucyB0byBkZXRhY2hlZCBpbnN0YW5jZXMgZHVyaW5nIHBlcnNpc3QKKyAgICAgKiBvcGVyYXRpb25zIGFzIG5ldyBvciBhcyBwc2V1ZG8taG9sbG93IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RldGFjaGVkTmV3KCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHRyZWF0IHJlbGF0aW9ucyB0byBkZXRhY2hlZCBpbnN0YW5jZXMgYXMgbmV3LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERldGFjaGVkTmV3KGJvb2xlYW4gaXNOZXcpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbHNvIGV2aWN0IGFuIG9iamVjdCBmcm9tIHRoZSBzdG9yZSBjYWNoZSB3aGVuIGl0IGlzCisgICAgICogZXZpY3RlZCB0aHJvdWdoIHRoaXMgYnJva2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEV2aWN0RnJvbURhdGFDYWNoZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbHNvIGV2aWN0IGFuIG9iamVjdCBmcm9tIHRoZSBzdG9yZSBjYWNoZSB3aGVuIGl0IGlzCisgICAgICogZXZpY3RlZCB0aHJvdWdoIHRoaXMgYnJva2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV2aWN0RnJvbURhdGFDYWNoZShib29sZWFuIGV2aWN0KTsKKworICAgIC8qKgorICAgICAqIFB1dCB0aGUgc3BlY2lmaWVkIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIG1hcCBvZiB1c2VyIG9iamVjdHMuIFVzZQorICAgICAqIGEgdmFsdWUgb2YgbnVsbCB0byByZW1vdmUgdGhlIGtleS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIG1hcCBvZiB1c2VyIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciB0cmFuc2FjdGlvbi1yZWxhdGVkIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zYWN0aW9uTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciB0cmFuc2FjdGlvbi1yZWxhdGVkIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zYWN0aW9uTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjYWxsYmFjayBtb2RlIGZvciBoYW5kbGluZyBleGNlcHRpb25zIGZyb20gdHJhbnNhY3Rpb24gZXZlbnQKKyAgICAgKiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FsbGJhY2sgbW9kZSBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucyBmcm9tIHRyYW5zYWN0aW9uIGV2ZW50CisgICAgICogbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uTGlzdGVuZXJDYWxsYmFja01vZGUoaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgbGlmZWN5Y2xlLXJlbGF0ZWQgZXZlbnRzIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjbGFzc2VzLiBJZiB0aGUgY2xhc3NlcyBhcmUgbnVsbCwgYWxsIGV2ZW50cyB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8KKyAgICAgKiB0aGUgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIsIENsYXNzW10gY2xhc3Nlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGlmZWN5Y2xlLXJlbGF0ZWQgZXZlbnRzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlmZWN5Y2xlIGV2ZW50IG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBicm9rZXIuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV2ZW50TWFuYWdlciBnZXRMaWZlY3ljbGVFdmVudE1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjYWxsYmFjayBtb2RlIGZvciBoYW5kbGluZyBleGNlcHRpb25zIGZyb20gbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExpZmVjeWNsZUxpc3RlbmVyQ2FsbGJhY2tNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FsbGJhY2sgbW9kZSBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucyBmcm9tIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogQmVnaW4gYSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbigpOworCisgICAgLyoqCisgICAgICogQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpOworCisgICAgLyoqCisgICAgICogUm9sbGJhY2sgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKTsKKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gc3luY2hyb25pemUgd2l0aCBhIGN1cnJlbnQgbWFuYWdlZCB0cmFuc2FjdGlvbiwgcmV0dXJuaW5nCisgICAgICogdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiBubyBtYW5hZ2VkIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbigpOworCisgICAgLyoqCisgICAgICogSXNzdWUgYSBjb21taXQgYW5kIHRoZW4gc3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24uIFRoaXMgaXMgaWRlbnRpY2FsIHRvOgorICAgICAqIDxwcmU+IGJyb2tlci5jb21taXQgKCk7IGJyb2tlci5iZWdpbiAoKTsKKyAgICAgKiA8L3ByZT4gZXhjZXB0IHRoYXQgdGhlIGJyb2tlcidzIGludGVybmFsIGF0b21pYyBsb2NrIGlzIHV0aWxpemVkLAorICAgICAqIHNvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqCisgICAgICogQHNlZSAjY29tbWl0KCkKKyAgICAgKiBAc2VlICNiZWdpbigpCisgICAgICogQHNpbmNlIDAuMi40CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tbWl0QW5kUmVzdW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBJc3N1ZSBhIHJvbGxiYWNrIGFuZCB0aGVuIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uLiBUaGlzIGlzIGlkZW50aWNhbCB0bzoKKyAgICAgKiA8cHJlPiBicm9rZXIucm9sbGJhY2sgKCk7IGJyb2tlci5iZWdpbiAoKTsKKyAgICAgKiA8L3ByZT4gZXhjZXB0IHRoYXQgdGhlIGJyb2tlcidzIGludGVybmFsIGF0b21pYyBsb2NrIGlzIHV0aWxpemVkLAorICAgICAqIHNvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqCisgICAgICogQHNlZSAjcm9sbGJhY2soKQorICAgICAqIEBzZWUgI2JlZ2luKCkKKyAgICAgKiBAc2luY2UgMC4yLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByb2xsYmFja0FuZFJlc3VtZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaGFzIGJlZW4gbWFya2VkIGZvciByb2xsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSb2xsYmFja09ubHkoKTsKKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gZm9yIHJvbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGxiYWNrT25seSgpOworCisgICAgLyoqCisgICAgICogTWFyayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBmb3Igcm9sbGJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGNhdXNlCisgICAgICogb2YgdGhlIHJvbGxiYWNrLgorICAgICAqCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sbGJhY2tPbmx5KFRocm93YWJsZSBjYXVzZSk7CisKKyAgICAvKiogCisgICAgICogUmV0dXJucyB0aGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSB0cmFuc2FjdGlvbiB0byBiZQorICAgICAqIG1hcmtlZCBmb3Igcm9sbGJhY2suIAorICAgICAqICAKKyAgICAgKiBAcmV0dXJuIHRoZSBUaHJvd2FibGUsIG9yIG51bGwgaWYgbm9uZSB3YXMgZ2l2ZW4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjkuNworICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9sbGJhY2tDYXVzZSgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgdHJhbnNhY3Rpb25hbCBzYXZlcG9pbnQgd2hlcmUgb3BlcmF0aW9ucyBhZnRlciB0aGlzIHNhdmVwb2ludAorICAgICAqIHdpbGwgYmUgcm9sbGVkIGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2F2ZXBvaW50KFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJvbGxiYWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIHRoZSBsYXN0IHNhdmVwb2ludC4KKyAgICAgKiBTYXZlcG9pbnRzIHNldCBhZnRlciB0aGlzIG9uZSB3aWxsIGJlY29tZSBpbnZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrVG9TYXZlcG9pbnQoKTsKKworICAgIC8qKgorICAgICAqIFJvbGxiYWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIHRoZSBnaXZlbiBzYXZlcG9pbnQgbmFtZS4KKyAgICAgKiBTYXZlcG9pbnRzIHNldCBhZnRlciB0aGlzIG9uZSB3aWxsIGJlY29tZSBpbnZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrVG9TYXZlcG9pbnQoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgbGFzdCBzZXQgc2F2ZXBvaW50IGFuZCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKiBUaGUgZ2l2ZW4gc2F2ZXBvaW50IGFuZCBhbnkgc2V0IGFmdGVyIGl0IHdpbGwgYmVjb21lIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludCgpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2F2ZXBvaW50IGFuZCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKiBUaGUgZ2l2ZW4gc2F2ZXBvaW50IGFuZCBhbnkgc2V0IGFmdGVyIGl0IHdpbGwgYmVjb21lIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludChTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBhbGwgdHJhbnNhY3Rpb25hbCBpbnN0YW5jZXMgdG8gdGhlIGRhdGEgc3RvcmUuIFRoaXMgbWV0aG9kIG1heQorICAgICAqIHNldCB0aGUgcm9sbGJhY2sgb25seSBmbGFnIG9uIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlmIGl0IGVuY291bnRlcnMKKyAgICAgKiBhbiBlcnJvci4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBSdW4gcHJlLWZsdXNoIGFjdGlvbnMgb24gdHJhbnNhY3Rpb25hbCBvYmplY3RzLCBpbmNsdWRpbmcKKyAgICAgKiBwZXJzaXN0ZW5jZS1ieS1yZWFjaGFiaWxpdHksIGludmVyc2UgcmVsYXRpb25zaGlwIG1hbmFnZW1lbnQsCisgICAgICogZGVsZXRpb24gb2YgZGVwZW5kZW50IGluc3RhbmNlcywgYW5kIGluc3RhbmNlIGNhbGxiYWNrcy4KKyAgICAgKiBUcmFuc2FjdGlvbiBsaXN0ZW5lcnMgYXJlIG5vdCBpbnZva2VkLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJlRmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyB0cmFuc2FjdGlvbiwgcmVwb3J0aW5nIGFueSBvcHRpbWlzdGljCisgICAgICogdmlvbGF0aW9ucywgY29uc3RyYWludCB2aW9sYXRpb25zLCBldGMuIEluIGEgZGF0YXN0b3JlIHRyYW5zYWN0aW9uIG9yCisgICAgICogYSBmbHVzaGVkIG9wdGltaXN0aWMgdHJhbnNhY3Rpb24sIHRoaXMgbWV0aG9kIHdpbGwgYWN0IGp1c3QgbGlrZQorICAgICAqIHtAbGluayAjZmx1c2h9LiBJbiBhbiBvcHRpbWlzdGljIHRyYW5zYWN0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVndW4gYQorICAgICAqIGRhdGFzdG9yZS1sZXZlbCB0cmFuc2FjdGlvbiwgaG93ZXZlciwgaXQgd2lsbCBvbmx5IHJlcG9ydCBleGNlcHRpb25zCisgICAgICogdGhhdCB3b3VsZCBvY2N1ciBvbiBmbHVzaCwgd2l0aG91dCByZXRhaW5pbmcgYW55IGRhdGFzdG9yZSByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDaGFuZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0IHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGVyc2lzdChPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3QgdGhlIGdpdmVuIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGVyc2lzdEFsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgZ2l2ZW4gaW5zdGFuY2UgcGVyc2lzdGVudC4gVW5saWtlIG90aGVyIHBlcnNpc3Qgb3BlcmF0aW9ucywKKyAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIDxiPm5vdDwvYj4gaW1tZWRpYXRlbHkgY2FzY2FkZSB0byBmaWVsZHMgbWFya2VkCisgICAgICoge0BsaW5rIFZhbHVlTWV0YURhdGEjQ0FTQ0FERV9JTU1FRElBVEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBjIHRoZSBpbnN0YW5jZSB0byBwZXJzaXN0CisgICAgICogQHBhcmFtIGlkIHRoZSBpZCB0byBnaXZlIHRoZSBzdGF0ZSBtYW5hZ2VyOyBtYXkgYmUgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEByZXR1cm4gdGhlIHN0YXRlIG1hbmFnZXIgZm9yIHRoZSBuZXdseSBwZXJzaXN0ZW50IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgcGVyc2lzdChPYmplY3QgcGMsIE9iamVjdCBpZCwgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0IHBjLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgZ2l2ZW4gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxldGVBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGdpdmVuIG9iamVjdCBmcm9tIG1hbmFnZW1lbnQuIFRoaXMgb3BlcmF0aW9uIGlzIG5vdAorICAgICAqIHJlY3Vyc2l2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKE9iamVjdCBwYywgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBnaXZlbiBvYmplY3RzIGZyb20gbWFuYWdlbWVudC4gVGhpcyBvcGVyYXRpb24gaXMgbm90CisgICAgICogcmVjdXJzaXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIFJlZnJlc2ggdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgcGMsIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogUmVmcmVzaCB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmcmVzaEFsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogRXZpY3QgdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBldmljdChPYmplY3QgcGMsIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogRXZpY3QgdGhlIGdpdmVuIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0IGFsbCBjbGVhbiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogRXZpY3QgYWxsIHBlcnNpc3RlbnQtY2xlYW4gYW5kIHBlcnNpc3RlbnQtbm9udHJhbnNhY3Rpb25hbAorICAgICAqIGluc3RhbmNlcyBpbiB0aGUgZ2l2ZW4ge0BsaW5rIEV4dGVudH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoRXh0ZW50IGV4dGVudCwgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggYWxsIG9iamVjdHMgaW4gcGxhY2UuICBBIGZsdXNoIHdpbGwgYmUgcGVyZm9ybWVkIGJlZm9yZQorICAgICAqIGRldGFjaGluZyB0aGUgZW50aXRpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGV0YWNoQWxsKE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogRGV0YWNoIGFsbCBvYmplY3RzIGluIHBsYWNlLCB3aXRoIHRoZSBvcHRpb24gb2YgcGVyZm9ybWluZyBhCisgICAgICogZmx1c2ggYmVmb3JlIGRvaW5nIHRoZSBkZXRhY2htZW50LgorICAgICAqIEBwYXJhbSBjYWxsIFBlcnNpc3RlbmNlIG9wZXJhdGlvbiBjYWxsYmFja3MKKyAgICAgKiBAcGFyYW0gZmx1c2ggYm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHBlcmZvcm0gYQorICAgICAqIGZsdXNoIGJlZm9yZSBkZXRhY2hpbmcgdGhlIGVudGl0aWVzICh0cnVlLCBkbyB0aGUgZmx1c2g7CisgICAgICogZmFsc2UsIGRvbid0IGRvIHRoZSBmbHVzaCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXRhY2hBbGwoT3BDYWxsYmFja3MgY2FsbCwgYm9vbGVhbiBmbHVzaCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgYnJva2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIHRoZSBpbnN0YW5jZSB0byBkZXRhY2gKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXRhY2hlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZGV0YWNoKE9iamVjdCBwYywgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGJyb2tlci4gVGhlIG9iamVjdHMgcmV0dXJuZWQgY2FuCisgICAgICogYmUgbWFuaXB1bGF0ZWQgYW5kIHJlLWF0dGFjaGVkIHdpdGgge0BsaW5rICNhdHRhY2hBbGx9LiBUaGUKKyAgICAgKiBkZXRhY2hlZCBpbnN0YW5jZXMgd2lsbCBiZSB1bm1hbmFnZWQgY29waWVzIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycywKKyAgICAgKiBhbmQgYXJlIHN1aXRhYmxlIGZvciBzZXJpYWxpemF0aW9uIGFuZCBtYW5pcHVsYXRpb24gb3V0c2lkZQorICAgICAqIG9mIGEgT3BlbkpQQSBlbnZpcm9ubWVudC4gV2hlbiBkZXRhY2hpbmcgaW5zdGFuY2VzLCBvbmx5IGZpZWxkcworICAgICAqIGluIHRoZSBjdXJyZW50IHtAbGluayBGZXRjaENvbmZpZ3VyYXRpb259IHdpbGwgYmUgdHJhdmVyc2VkLiBUaHVzLAorICAgICAqIHRvIGRldGFjaCBhIGdyYXBoIG9mIG9iamVjdHMsIHJlbGF0aW9ucyB0byBvdGhlciBwZXJzaXN0ZW50CisgICAgICogaW5zdGFuY2VzIG11c3QgZWl0aGVyIGJlIGluIHRoZSA8Y29kZT5kZWZhdWx0LWZldGNoLWdyb3VwPC9jb2RlPiwKKyAgICAgKiBvciBpbiB0aGUgY3VycmVudCBjdXN0b20ge0BsaW5rIEZldGNoQ29uZmlndXJhdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqcyB0aGUgaW5zdGFuY2VzIHRvIGRldGFjaAorICAgICAqIEByZXR1cm4gdGhlIGRldGFjaGVkIGluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBkZXRhY2hBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIEltcG9ydCB0aGUgc3BlY2lmaWVkIGRldGFjaGVkIG9iamVjdCBpbnRvIHRoZSBicm9rZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgaW5zdGFuY2UgdG8gaW1wb3J0CisgICAgICogQHJldHVybiB0aGUgcmUtYXR0YWNoZWQgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gY29weU5ldyB3aGV0aGVyIHRvIGNvcHkgbmV3IGluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYXR0YWNoKE9iamVjdCBwYywgYm9vbGVhbiBjb3B5TmV3LCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIEltcG9ydCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgaW50byB0aGUgYnJva2VyLiBJbnN0YW5jZXMgdGhhdCB3ZXJlCisgICAgICogcHJldmlvdXNseSBkZXRhY2hlZCBmcm9tIHRoaXMgb3IgYW5vdGhlciBicm9rZXIgd2lsbCBoYXZlIHRoZWlyCisgICAgICogY2hhbmdlZCBtZXJnZWQgaW50byB0aGUgcGVyc2lzdGVudCBpbnN0YW5jZXMuIEluc3RhbmNlcyB0aGF0CisgICAgICogYXJlIG5ldyB3aWxsIGJlIHBlcnNpc3RlZCBhcyBuZXcgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG9ianMgYXJyYXkgb2YgaW5zdGFuY2VzIHRvIGltcG9ydAorICAgICAqIEByZXR1cm4gdGhlIHJlLWF0dGFjaGVkIGluc3RhbmNlcworICAgICAqIEBwYXJhbSBjb3B5TmV3IHdoZXRoZXIgdG8gY29weSBuZXcgaW5zdGFuY2VzCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGF0dGFjaEFsbChDb2xsZWN0aW9uIG9ianMsIGJvb2xlYW4gY29weU5ldywKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdHlwZSA8Y29kZT5jbHM8L2NvZGU+LiBJZiA8Y29kZT5jbHM8L2NvZGU+IGlzCisgICAgICogYW4gaW50ZXJmYWNlIG9yIGFuIGFic3RyYWN0IGNsYXNzIHdob3NlIGFic3RyYWN0IG1ldGhvZHMgZm9sbG93IHRoZQorICAgICAqIEphdmFCZWFucyBjb252ZW50aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBtZXRhZGF0YSB0aGF0IGRlZmluZXMgdGhlIGNsYXNzLgorICAgICAqIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhIGRldGFjaGVkIG9iamVjdAorICAgICAqIChvbmUgdGhhdCBjYW4gYmUgcmVhdHRhY2hlZCB0byBhIHtAbGluayBCcm9rZXJ9IHZpYSBhIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgQnJva2VyI2F0dGFjaH0pOyBvdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZXRhY2hlZChPYmplY3Qgb2JqKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBleHRlbnQgb2YgdGhlIGdpdmVuIGNsYXNzLCBvcHRpb25hbGx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbnQgbmV3RXh0ZW50KENsYXNzIGNscywgYm9vbGVhbiBzdWJzKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBxdWVyeSBmcm9tIHRoZSBnaXZlbiBkYXRhLCB3aXRoIHRoZSBnaXZlbiBjYW5kaWRhdGUgY2xhc3MKKyAgICAgKiBhbmQgbGFuZ3VhZ2UuCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5IG5ld1F1ZXJ5KFN0cmluZyBsYW5ndWFnZSwgQ2xhc3MgY2xzLCBPYmplY3QgcXVlcnkpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHF1ZXJ5IGluIHRoZSBnaXZlbiBsYW5ndWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnkgbmV3UXVlcnkoU3RyaW5nIGxhbmd1YWdlLCBPYmplY3QgcXVlcnkpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBTZXF9IGZvciB0aGUgZGF0YXN0b3JlIGlkZW50aXR5IHZhbHVlcyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcGVyc2lzdGVudCBjbGFzcywgb3IgbnVsbCBpZiB0aGUgY2xhc3MnIGlkZW50aXR5IGNhbm5vdCBiZQorICAgICAqIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIFNlcSBnZXRJZGVudGl0eVNlcXVlbmNlKENsYXNzTWV0YURhdGEgbWV0YSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcX0gZm9yIHRoZSBnZW5lcmF0ZWQgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBmaWVsZCwgb3IgbnVsbCBpZiB0aGUgZmllbGQgaXMgbm90IGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxIGdldFZhbHVlU2VxdWVuY2UoRmllbGRNZXRhRGF0YSBmbWQpOworCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgdGhlIGdpdmVuIGluc3RhbmNlIGlzIGxvY2tlZCBhdCB0aGUgZ2l2ZW4gbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYyB0aGUgb2JqZWN0IHRvIGxvY2sKKyAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxvY2sgbGV2ZWwgdG8gdXNlCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2sgYmVmb3JlCisgICAgICogZ2l2aW5nIHVwLCBvciAtMSBmb3Igbm8gbGltaXQKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2NrKE9iamVjdCBwYywgaW50IGxldmVsLCBpbnQgdGltZW91dCwgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2UgaXMgbG9ja2VkIGF0IHRoZSBjdXJyZW50IGxvY2sgbGV2ZWwsIGFzCisgICAgICogc2V0IGluIHRoZSB7QGxpbmsgRmV0Y2hDb25maWd1cmF0aW9ufSBmb3IgdGhlIGJyb2tlci4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IHBjLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBpbnN0YW5jZXMgYXJlIGxvY2tlZCBhdCB0aGUgZ2l2ZW4gbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpzIHRoZSBvYmplY3RzIHRvIGxvY2sKKyAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxvY2sgbGV2ZWwgdG8gdXNlCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2sgYmVmb3JlCisgICAgICogZ2l2aW5nIHVwLCBvciAtMSBmb3Igbm8gbGltaXQKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2NrQWxsKENvbGxlY3Rpb24gb2JqcywgaW50IGxldmVsLCBpbnQgdGltZW91dCwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2VzIGFyZSBsb2NrZWQgYXQgdGhlIGN1cnJlbnQgbG9jayBsZXZlbCwgYXMKKyAgICAgKiBzZXQgaW4gdGhlIHtAbGluayBGZXRjaENvbmZpZ3VyYXRpb259IGZvciB0aGUgYnJva2VyLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9ja0FsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogQ2FuY2VsIGFsbCBwZW5kaW5nIGRhdGEgc3RvcmUgc3RhdGVtZW50cy4gSWYgc3RhdGVtZW50cyBhcmUgY2FuY2VsbGVkCisgICAgICogd2hpbGUgYSBmbHVzaCBpcyBpbiBwcm9ncmVzcywgdGhlIHRyYW5zYWN0aW9uIHJvbGxiYWNrIG9ubHkgZmxhZyB3aWxsCisgICAgICogYmUgc2V0LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBzdGF0ZW1lbnRzIHdlcmUgY2FuY2VsbGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxBbGwoKTsKKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIGdpdmVuIGNsYXNzIGFzIGRpcnR5IHdpdGhpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpcnR5VHlwZShDbGFzcyBjbHMpOworCisgICAgLyoqCisgICAgICogQmVnaW4gYSBsb2dpY2FsIG9wZXJhdGlvbi4gVGhpcyBpbmRpY2F0ZXMgdG8gdGhlIGJyb2tlciB0aGUKKyAgICAgKiBncmFudWxhcml0eSBvZiBhbiBvcGVyYXRpb24gd2hpY2ggbWF5IHJlcXVpcmUgcHJlL3Bvc3Qgb3BlcmF0aW9uCisgICAgICogc2lkZS1lZmZlY3RzLCBzdWNoIGFzIG5vbi10eCBkZXRhY2guCisgICAgICogV2lsbCBsb2NrIHRoZSBicm9rZXIgdW50aWwgdGhlIHtAbGluayAjZW5kT3BlcmF0aW9ufSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3luY1RyYW5zIHdoZXRoZXIgaW5zdGFuY2VzIG1heSBiZSBsb2FkZWQvbW9kaWZpZWQgZHVyaW5nCisgICAgICogdGhpcyBvcGVyYXRpb24gcmVxdWlyaW5nIGEgcmUtY2hlY2sgb2YgZ2xvYmFsIHR4CisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgdGhlIG91dGVybW9zdCBvcGVyYXRpb24gb24gdGhlIHN0YWNrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYmVnaW5PcGVyYXRpb24oYm9vbGVhbiBzeW5jVHJhbnMpOworCisgICAgLyoqCisgICAgICogRW5kIGEgbG9naWNhbCBvcGVyYXRpb24uIFRoaXMgaW5kaWNhdGVzIHRvIHRoZSBicm9rZXIgdGhlCisgICAgICogZ3JhbnVsYXJpdHkgb2YgYW4gb3BlcmF0aW9uIHdoaWNoIG1heSByZXF1aXJlIHByZS9wb3N0IG9wZXJhdGlvbgorICAgICAqIHNpZGUtZWZmZWN0cywgc3VjaCBhcyBub24tdHggZGV0YWNoLiBVbmxvY2tzIHRoZSBnaXZlbiBicm9rZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG9wZXJhdGlvbiBvbiB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmRPcGVyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGJyb2tlciBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIge0BsaW5rICNjbG9zZX0gaGFzIGJlZW4gaW52b2tlZCwgdGhvdWdoIHRoZSBicm9rZXIgbWlnaHQgCisgICAgICogcmVtYWluIG9wZW4gdW50aWwgdGhlIGN1cnJlbnQgbWFuYWdlZCB0cmFuc2FjdGlvbiBjb21wbGV0ZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZUludm9rZWQoKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBicm9rZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGlzIGJyb2tlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0T3BlbigpOworCisgICAgLyoqCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIHRyYW5zYWN0aW9uIGFjdGl2ZSBhbmQKKyAgICAgKiBub250cmFuc2FjdGlvbmFsIHJlYWRpbmcgaXMgbm90IGVuYWJsZWQuCisJICovCisJcHVibGljIHZvaWQgYXNzZXJ0Tm9udHJhbnNhY3Rpb25hbFJlYWQgKCk7CisKKwkvKioKKwkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgYSB3cml0ZSBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCAodGhlcmUgaXMKKwkgKiBubyBhY3RpdmUgdHJhbnNhY3Rpb24gYW5kIG5vbnRyYW5zYWN0aW9uYWwgd3JpdGluZyBpcyBub3QgZW5hYmxlZCkuCisJICovCisJcHVibGljIHZvaWQgYXNzZXJ0V3JpdGVPcGVyYXRpb24gKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ccm9rZXJGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ccm9rZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0MGJhMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jyb2tlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHtAbGluayBCcm9rZXJ9IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQnJva2VyRmFjdG9yeQorICAgIGV4dGVuZHMgU2VyaWFsaXphYmxlLCBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBwcm9wZXJ0aWVzIGRlc2NyaWJpbmcgdGhpcyBydW50aW1lLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFB1dCB0aGUgc3BlY2lmaWVkIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIG1hcCBvZiB1c2VyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXRVc2VyT2JqZWN0KE9iamVjdCBrZXksIE9iamVjdCB2YWwpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgbWFwIG9mIHVzZXIgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBicm9rZXIgd2l0aCBkZWZhdWx0IHNldHRpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXIgbmV3QnJva2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBicm9rZXIgdXNpbmcgdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGFuZCBpbiB0aGUgZ2l2ZW4KKyAgICAgKiB0cmFuc2FjdGlvbiBhbmQgY29ubmVjdGlvbiByZXRhaW4gbW9kZSwgb3B0aW9uYWxseSBmaW5kaW5nCisgICAgICogZXhpc3RpbmcgYnJva2VyIGluIHRoZSBnbG9iYWwgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIEJyb2tlciBuZXdCcm9rZXIoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzLCBib29sZWFuIG1hbmFnZWQsCisgICAgICAgIGludCBjb25uUmV0YWluTW9kZSwgYm9vbGVhbiBmaW5kRXhpc3RpbmcpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgbGlmZWN5Y2xlLXJlbGF0ZWQgZXZlbnRzIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjbGFzc2VzLiBJZiB0aGUgY2xhc3NlcyBhcmUgbnVsbCwgYWxsIGV2ZW50cyB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8KKyAgICAgKiB0aGUgbGlzdGVuZXIuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIHBhc3NlZCBvbiB0byBhbGwgbmV3IGJyb2tlcnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIsIENsYXNzW10gY2xhc3Nlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGlmZWN5Y2xlLXJlbGF0ZWQgZXZlbnRzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBicm9rZXIgZmFjdG9yeSBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKTsKKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplcyBvbiBhbiBpbnRlcm5hbCBsb2NrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvY2soKTsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGludGVybmFsIGxvY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2NrICgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQnJva2VySW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQnJva2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDEwMzkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ccm9rZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0OTUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXgucmVzb3VyY2UuUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25NZXRhRGF0YTsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuSW50ZXJhY3Rpb247CitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLkludGVyYWN0aW9uU3BlYzsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuTG9jYWxUcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuUmVjb3JkOworaW1wb3J0IGphdmF4LnJlc291cmNlLmNjaS5SZXNvdXJjZVdhcm5pbmc7CitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLlJlc3VsdFNldEluZm87CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uU3RhdHVzOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlN5bmNocm9uaXphdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuSXRlcmF0b3JDaGFpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLklkZW50aXR5TWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGlua2VkTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuTWFwQmFja2VkU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLkNvbXBhdGliaWxpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5EYXRhQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVlLk1hbmFnZWRSdW50aW1lOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRFdmVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlRyYW5zYWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlRyYW5zYWN0aW9uRXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VIYXNoU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuUmVlbnRyYW50TG9jazsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlNlcXVlbmNlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXBwbGljYXRpb25JZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQ2FsbGJhY2tFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5HZW5lcmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk5vVHJhbnNhY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0RXhpc3RzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9iamVjdElkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3B0aW1pc3RpY0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5SdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIENvbmNyZXRlIHtAbGluayBCcm9rZXJ9LiBUaGUgYnJva2VyIGhhbmRsZXMgb2JqZWN0LWxldmVsIGJlaGF2aW9yLAorICogYnV0IGxlYXZlcyBhbGwgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZGF0YSBzdG9yZSB0byBhIHtAbGluayBTdG9yZU1hbmFnZXJ9CisgKiB0aGF0IG11c3QgYmUgc3VwcGxpZWQgYXQgaW5pdGlhbGl6YXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIEJyb2tlckltcGwKKyAgICBpbXBsZW1lbnRzIEJyb2tlciwgRmluZENhbGxiYWNrcywgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIEluY3JlbWVudGFsIGZsdXNoLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZMVVNIX0lOQyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBpbiBwcmVwYXJhdGlvbiBvZiBjb21taXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxVU0hfQ09NTUlUID0gMTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRvIGNoZWNrIGNvbnNpc3RlbmN5IG9mIGNhY2hlLCB0aGVuIGltbWVkaWF0ZWx5IHJvbGxiYWNrIGNoYW5nZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxVU0hfUk9MTEJBQ0sgPSAyOworCisgICAgLyoqCisgICAgICogUnVuIHBlcnNpc3RlbmNlLWJ5LXJlYWNoYWJpbGl0eSBhbmQgb3RoZXIgZmx1c2gtdGltZSBvcGVyYXRpb25zIHdpdGhvdXQKKyAgICAgKiBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZMVVNIX0xPR0lDQUwgPSAzOworCisgICAgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5JVCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVFJBTlNJRU5UID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PSURfQVNTSUdOID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT01NSVRfTkVXID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0FDVElWRSA9IDIgPDwgMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVE9SRV9BQ1RJVkUgPSAyIDw8IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0xPU0VfSU5WT0tFRCA9IDIgPDwgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUkVTVE9SSU5HID0gMiA8PCAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0RFUkVGREVMRVRJTkcgPSAyIDw8IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRkxVU0hJTkcgPSAyIDw8IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1RPUkVfRkxVU0hJTkcgPSAyIDw8IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRkxVU0hFRCA9IDIgPDwgNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GTFVTSF9SRVFVSVJFRCA9IDIgPDwgODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRU1PVEVfTElTVEVORVIgPSAyIDw8IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVUQUlORURfQ09OTiA9IDIgPDwgMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVFJBTlNfRU5ESU5HID0gMiA8PCAxMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0KKyAgICAgICAgTG9jYWxpemVyLmZvclBhY2thZ2UoQnJva2VySW1wbC5jbGFzcyk7CisKKyAgICAvLwl0aGUgc3RvcmUgbWFuYWdlciBpbiB1c2U7IHRoaXMgbWF5IGJlIGEgZGVjb3JhdG9yIHN1Y2ggYXMgYQorICAgIC8vCWRhdGEgY2FjaGUgc3RvcmUgbWFuYWdlciBhcm91bmQgdGhlIG5hdGl2ZSBzdG9yZSBtYW5hZ2VyCisgICAgcHJpdmF0ZSBEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyIF9zdG9yZSA9IG51bGw7CisKKyAgICAvLyByZWYgdG8gcHJvZHVjaW5nIGZhY3RvcnkgYW5kIGNvbmZpZ3VyYXRpb24KKyAgICBwcml2YXRlIEFic3RyYWN0QnJva2VyRmFjdG9yeSBfZmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSBPcGVuSlBBQ29uZmlndXJhdGlvbiBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5IF9jb21wYXQgPSBudWxsOworICAgIHByaXZhdGUgRmV0Y2hDb25maWd1cmF0aW9uIF9mYyA9IG51bGw7CisgICAgcHJpdmF0ZSBMb2cgX2xvZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3VzZXIgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9wYXNzID0gbnVsbDsKKyAgICBwcml2YXRlIE1hbmFnZWRSdW50aW1lIF9ydW50aW1lID0gbnVsbDsKKyAgICBwcml2YXRlIExvY2tNYW5hZ2VyIF9sbSA9IG51bGw7CisgICAgcHJpdmF0ZSBJbnZlcnNlTWFuYWdlciBfaW0gPSBudWxsOworICAgIHByaXZhdGUgSkNBSGVscGVyIF9qY2EgPSBudWxsOworICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBfbG9jayA9IG51bGw7CisgICAgcHJpdmF0ZSBPcENhbGxiYWNrcyBfY2FsbCA9IG51bGw7CisgICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciBfZXh0cmFucyA9IG51bGw7CisKKyAgICAvLyBjYWNoZSBjbGFzcyBsb2FkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBicm9rZXIKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIF9sb2FkZXIgPSBudWxsOworCisgICAgLy8gdXNlciBzdGF0ZQorICAgIHByaXZhdGUgU3luY2hyb25pemF0aW9uIF9zeW5jID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcCBfdXNlck9iamVjdHMgPSBudWxsOworCisgICAgLy8gbWFuYWdlZCBvYmplY3QgY2FjaGVzCisgICAgcHJpdmF0ZSBNYW5hZ2VkQ2FjaGUgX2NhY2hlID0gbnVsbDsKKyAgICBwcml2YXRlIFRyYW5zYWN0aW9uYWxDYWNoZSBfdHJhbnNDYWNoZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXQgX3RyYW5zQWRkaXRpb25zID0gbnVsbDsKKyAgICBwcml2YXRlIFNldCBfZGVyZWZDYWNoZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXQgX2RlcmVmQWRkaXRpb25zID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcCBfbG9hZGluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXQgX29wZXJhdGluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXQgX3BlcnNpc3RlZENsc3MgPSBudWxsOworICAgIHByaXZhdGUgU2V0IF91cGRhdGVkQ2xzcyA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXQgX2RlbGV0ZWRDbHNzID0gbnVsbDsKKyAgICBwcml2YXRlIFNldCBfcGVuZGluZyA9IG51bGw7CisKKyAgICAvLyB0cmFjayBpbnN0YW5jZXMgdGhhdCBiZWNvbWUgdHJhbnNhY3Rpb25hbCBhZnRlciB0aGUgZmlyc3Qgc2F2ZXBvaW50CisgICAgLy8gKHRoZSBmaXJzdCB1c2VzIHRoZSB0cmFuc2FjdGlvbmFsIGNhY2hlKQorICAgIHByaXZhdGUgU2V0IF9zYXZlcG9pbnRDYWNoZSA9IG51bGw7CisgICAgcHJpdmF0ZSBMaW5rZWRNYXAgX3NhdmVwb2ludHMgPSBudWxsOworICAgIHByaXZhdGUgU2F2ZXBvaW50TWFuYWdlciBfc3BtID0gbnVsbDsKKworICAgIC8vIHRyYWNrIG9wZW4gcXVlcmllcyBhbmQgZXh0ZW50cyBzbyB3ZSBjYW4gZnJlZSB0aGVpciByZXNvdXJjZXMgb24gY2xvc2UKKyAgICBwcml2YXRlIFJlZmVyZW5jZUhhc2hTZXQgX3F1ZXJpZXMgPSBudWxsOworICAgIHByaXZhdGUgUmVmZXJlbmNlSGFzaFNldCBfZXh0ZW50cyA9IG51bGw7CisKKyAgICAvLyB0cmFjayBvcGVyYXRpb24gc3RhY2sgZGVwdGgKKyAgICBwcml2YXRlIGludCBfb3BlcmF0aW9uQ291bnQgPSAwOworCisgICAgLy8gb3B0aW9ucworICAgIHByaXZhdGUgYm9vbGVhbiBfbm9udHJhbnNSZWFkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ub250cmFuc1dyaXRlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9yZXRhaW5TdGF0ZSA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF9hdXRvQ2xlYXIgPSBDTEVBUl9EQVRBU1RPUkU7CisgICAgcHJpdmF0ZSBpbnQgX3Jlc3RvcmVTdGF0ZSA9IFJFU1RPUkVfSU1NVVRBQkxFOworICAgIHByaXZhdGUgYm9vbGVhbiBfb3B0aW1pc3RpYyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaWdub3JlQ2hhbmdlcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfbXVsdGl0aHJlYWRlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfbWFuYWdlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3luY01hbmFnZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBfY29ublJldGFpbk1vZGUgPSBDT05OX1JFVEFJTl9ERU1BTkQ7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ldmljdERhdGFDYWNoZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfcG9wdWxhdGVEYXRhQ2FjaGUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfbGFyZ2VUcmFuc2FjdGlvbiA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF9hdXRvRGV0YWNoID0gMDsKKyAgICBwcml2YXRlIGludCBfZGV0YWNoU3RhdGUgPSBERVRBQ0hfTE9BREVEOworICAgIHByaXZhdGUgYm9vbGVhbiBfZGV0YWNoZWROZXcgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfb3JkZXJEaXJ0eSA9IGZhbHNlOworCisgICAgLy8gc3RhdHVzCisgICAgcHJpdmF0ZSBpbnQgX2ZsYWdzID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Nsb3NlZCA9IGZhbHNlOworICAgIHByaXZhdGUgUnVudGltZUV4Y2VwdGlvbiBfY2xvc2VkRXhjZXB0aW9uID0gbnVsbDsKKworICAgIC8vIGV2ZW50IG1hbmFnZXJzCisgICAgcHJpdmF0ZSBUcmFuc2FjdGlvbkV2ZW50TWFuYWdlciBfdHJhbnNFdmVudE1hbmFnZXIgPSBudWxsOworICAgIHByaXZhdGUgaW50IF90cmFuc0NhbGxiYWNrTW9kZSA9IDA7CisgICAgcHJpdmF0ZSBMaWZlY3ljbGVFdmVudE1hbmFnZXIgX2xpZmVFdmVudE1hbmFnZXIgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9saWZlQ2FsbGJhY2tNb2RlID0gMDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfaW5pdGlhbGl6ZVdhc0ludm9rZWQgPSBmYWxzZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBlcnNpc3RlbmNlIG1hbmFnZXIncyBhdXRoZW50aWNhdGlvbi4gVGhpcyBpcyB0aGUgZmlyc3QKKyAgICAgKiBtZXRob2QgY2FsbGVkIGFmdGVyIGNvbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIHRoZSB1c2VybmFtZSB0aGlzIGJyb2tlciByZXByZXNlbnRzOyB1c2VkIHdoZW4gcG9vbGluZworICAgICAqIGJyb2tlcnMgdG8gbWFrZSBzdXJlIHRoYXQgYSByZXF1ZXN0IHRvIHRoZSBmYWN0b3J5IGZvcgorICAgICAqIGEgY29ubmVjdGlvbiB3aXRoIGFuIGV4cGxpY2l0IHVzZXIgaXMgZGVsZWdhdGVkIHRvIGEgc3VpdGFibGUgYnJva2VyCisgICAgICogQHBhcmFtIHBhc3MgdGhlIHBhc3N3b3JkIGZvciB0aGUgYWJvdmUgdXNlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzcykgeworICAgICAgICBfdXNlciA9IHVzZXI7CisgICAgICAgIF9wYXNzID0gcGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBwZXJzaXN0ZW5jZSBtYW5hZ2VyLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBmYWN0b3J5IGJlZm9yZSB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB0aGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGlzIGJyb2tlcgorICAgICAqIEBwYXJhbSBzbSBhIGNvbmNyZXRlIFN0b3JlTWFuYWdlciBpbXBsZW1lbnRhdGlvbiB0bworICAgICAqIGhhbmRsZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBkYXRhIHN0b3JlCisgICAgICogQHBhcmFtIG1hbmFnZWQgdGhlIHRyYW5zYWN0aW9uIG1vZGUKKyAgICAgKiBAcGFyYW0gY29ubk1vZGUgdGhlIGNvbm5lY3Rpb24gcmV0YWluIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEFic3RyYWN0QnJva2VyRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICBEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyIHNtLCBib29sZWFuIG1hbmFnZWQsIGludCBjb25uTW9kZSkgeworICAgICAgICBfaW5pdGlhbGl6ZVdhc0ludm9rZWQgPSB0cnVlOworICAgICAgICBfbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgX2pjYSA9IG5ldyBKQ0FIZWxwZXIoKTsKKyAgICAgICAgX2NvbmYgPSBmYWN0b3J5LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgX2NvbXBhdCA9IF9jb25mLmdldENvbXBhdGliaWxpdHlJbnN0YW5jZSgpOworICAgICAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIF9sb2cgPSBfY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpOworICAgICAgICBfY2FjaGUgPSBuZXcgTWFuYWdlZENhY2hlKG5ld01hbmFnZWRPYmplY3RDYWNoZSgpKTsKKyAgICAgICAgX29wZXJhdGluZyA9IE1hcEJhY2tlZFNldC5kZWNvcmF0ZShuZXcgSWRlbnRpdHlNYXAoKSk7CisgICAgICAgIF9jb25uUmV0YWluTW9kZSA9IGNvbm5Nb2RlOworICAgICAgICBfbWFuYWdlZCA9IG1hbmFnZWQ7CisgICAgICAgIGlmIChtYW5hZ2VkKQorICAgICAgICAgICAgX3J1bnRpbWUgPSBfY29uZi5nZXRNYW5hZ2VkUnVudGltZUluc3RhbmNlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9ydW50aW1lID0gbmV3IExvY2FsTWFuYWdlZFJ1bnRpbWUodGhpcyk7CisKKyAgICAgICAgX2xpZmVFdmVudE1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyKCk7CisgICAgICAgIF90cmFuc0V2ZW50TWFuYWdlciA9IG5ldyBUcmFuc2FjdGlvbkV2ZW50TWFuYWdlcigpOworICAgICAgICBpbnQgY21vZGUgPSBfY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGFGYWN0b3J5KCkuZ2V0RGVmYXVsdHMoKS5nZXRDYWxsYmFja01vZGUoKTsKKyAgICAgICAgc2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoY21vZGUpOworICAgICAgICBzZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKGNtb2RlKTsKKworICAgICAgICAvLyBzZXR1cCBkZWZhdWx0IG9wdGlvbnMKKyAgICAgICAgX2ZhY3RvcnkuY29uZmlndXJlQnJva2VyKHRoaXMpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBkbyB0aGlzIGFmdGVyIGNvbmZpZ3VyaW5nIGJyb2tlciBzbyB0aGF0IHN0b3JlIG1hbmFnZXIKKyAgICAgICAgLy8gY2FuIGxvb2sgdG8gYnJva2VyIGNvbmZpZ3VyYXRpb247IHdlIHNldCBib3RoIHN0b3JlIGFuZCBsb2NrIG1hbmFnZXJzCisgICAgICAgIC8vIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlbSBiZWNhdXNlIHRoZXkgbWF5IGVhY2ggdHJ5IHRvIGFjY2VzcyB0aGUKKyAgICAgICAgLy8gb3RoZXIgaW4gdGhpZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgX3N0b3JlID0gc207CisgICAgICAgIF9sbSA9IF9jb25mLm5ld0xvY2tNYW5hZ2VySW5zdGFuY2UoKTsKKyAgICAgICAgX2ltID0gX2NvbmYubmV3SW52ZXJzZU1hbmFnZXJJbnN0YW5jZSgpOworICAgICAgICBfc3BtID0gX2NvbmYuZ2V0U2F2ZXBvaW50TWFuYWdlckluc3RhbmNlKCk7CisgICAgICAgIF9zdG9yZS5zZXRDb250ZXh0KHRoaXMpOworICAgICAgICBfbG0uc2V0Q29udGV4dCh0aGlzKTsKKworICAgICAgICBpZiAoX2Nvbm5SZXRhaW5Nb2RlID09IENPTk5fUkVUQUlOX0FMV0FZUykKKyAgICAgICAgICAgIHJldGFpbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgX2ZjID0gX3N0b3JlLm5ld0ZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBfZmMuc2V0Q29udGV4dCh0aGlzKTsKKworICAgICAgICAvLyBzeW5jaCB3aXRoIHRoZSBnbG9iYWwgdHJhbnNhY3Rpb24gaW4gcHJvZ3Jlc3MsIGlmIGFueQorICAgICAgICBpZiAoX2ZhY3Rvcnkuc3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb24odGhpcywgZmFsc2UpKQorICAgICAgICAgICAgYmVnaW5JbnRlcm5hbCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKQorICAgICAgICB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAoX2luaXRpYWxpemVXYXNJbnZva2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgTWFwfSB0byBiZSB1c2VkIGZvciB0aGUgcHJpbWFyeSBtYW5hZ2VkIG9iamVjdCBjYWNoZS4KKyAgICAgKiBNYXBzIG9pZHMgdG8gc3RhdGUgbWFuYWdlcnMuIEJ5IGRlZmF1bHQsIHRoaXMgY3JlYXRlcyBhCisgICAgICoge0BsaW5rIFJlZmVyZW5jZU1hcH0gd2l0aCBzb2Z0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIG5ld01hbmFnZWRPYmplY3RDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VIYXNoTWFwKFJlZmVyZW5jZU1hcC5IQVJELCBSZWZlcmVuY2VNYXAuU09GVCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgQ29ubmVjdGlvbiBpbnRlcmZhY2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBDb25uZWN0aW9uTWV0YURhdGEgZ2V0TWV0YURhdGEoKQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2pjYTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZXJhY3Rpb24gY3JlYXRlSW50ZXJhY3Rpb24oKQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2pjYTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYWxUcmFuc2FjdGlvbiBnZXRMb2NhbFRyYW5zYWN0aW9uKCkKKyAgICAgICAgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFNldEluZm8gZ2V0UmVzdWx0U2V0SW5mbygpCisgICAgICAgIHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfamNhOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBTdG9yZUNvbnRleHQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgQnJva2VyIGdldEJyb2tlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQcm9wZXJ0aWVzCisgICAgLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0QmVoYXZpb3IoT3BDYWxsYmFja3MgY2FsbCwKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgZXgpIHsKKyAgICAgICAgaWYgKF9jYWxsID09IG51bGwpCisgICAgICAgICAgICBfY2FsbCA9IGNhbGw7CisgICAgICAgIGlmIChfZXh0cmFucyA9PSBudWxsKQorICAgICAgICAgICAgX2V4dHJhbnMgPSBleDsKKyAgICB9CisKKyAgICBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciBnZXRJbnN0YW5jZUV4Y2VwdGlvblRyYW5zbGF0b3IoKSB7CisgICAgICAgIHJldHVybiAoX29wZXJhdGlvbkNvdW50ID09IDApID8gX2V4dHJhbnMgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBCcm9rZXJGYWN0b3J5IGdldEJyb2tlckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBfZmFjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9jb25mOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2ZjOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblJldGFpbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBfY29ublJldGFpbk1vZGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkKCkgeworICAgICAgICByZXR1cm4gX21hbmFnZWQ7CisgICAgfQorCisgICAgcHVibGljIE1hbmFnZWRSdW50aW1lIGdldE1hbmFnZWRSdW50aW1lKCkgeworICAgICAgICByZXR1cm4gX3J1bnRpbWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gX2xvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVsZWdhdGluZ1N0b3JlTWFuYWdlciBnZXRTdG9yZU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmU7CisgICAgfQorCisgICAgcHVibGljIExvY2tNYW5hZ2VyIGdldExvY2tNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gX2xtOworICAgIH0KKworICAgIHB1YmxpYyBJbnZlcnNlTWFuYWdlciBnZXRJbnZlcnNlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIF9pbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF91c2VyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gX3Bhc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TXVsdGl0aHJlYWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9tdWx0aXRocmVhZGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE11bHRpdGhyZWFkZWQoYm9vbGVhbiBtdWx0aXRocmVhZGVkKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgX211bHRpdGhyZWFkZWQgPSBtdWx0aXRocmVhZGVkOworICAgICAgICBpZiAobXVsdGl0aHJlYWRlZCAmJiBfbG9jayA9PSBudWxsKQorICAgICAgICAgICAgX2xvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBlbHNlIGlmICghbXVsdGl0aHJlYWRlZCkKKyAgICAgICAgICAgIF9sb2NrID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCkgeworICAgICAgICByZXR1cm4gX2lnbm9yZUNoYW5nZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hhbmdlcyhib29sZWFuIHZhbCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIF9pZ25vcmVDaGFuZ2VzID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldE5vbnRyYW5zYWN0aW9uYWxSZWFkKCkgeworICAgICAgICByZXR1cm4gX25vbnRyYW5zUmVhZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsUmVhZChib29sZWFuIHZhbCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19QUkVTVE9SSU5HKSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImlsbGVnYWwtb3AtaW4tcHJlc3RvcmUiKSk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBydW50aW1lIHN1cHBvcnRzIGl0CisgICAgICAgIGlmICh2YWwgJiYgIV9jb25mLnN1cHBvcnRlZE9wdGlvbnMoKS5jb250YWlucworICAgICAgICAgICAgKF9jb25mLk9QVElPTl9OT05UUkFOU19SRUFEKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICgibm9udHJhbnMtcmVhZC1ub3Qtc3VwcG9ydGVkIikpOworCisgICAgICAgIF9ub250cmFuc1JlYWQgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKCkgeworICAgICAgICByZXR1cm4gX25vbnRyYW5zV3JpdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKGJvb2xlYW4gdmFsKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1BSRVNUT1JJTkcpICE9IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiaWxsZWdhbC1vcC1pbi1wcmVzdG9yZSIpKTsKKworICAgICAgICBfbm9udHJhbnNXcml0ZSA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcHRpbWlzdGljKCkgeworICAgICAgICByZXR1cm4gX29wdGltaXN0aWM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pc3RpYyhib29sZWFuIHZhbCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpICE9IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ0cmFucy1hY3RpdmUiLAorICAgICAgICAgICAgICAgICJPcHRpbWlzdGljIikpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcnVudGltZSBzdXBwb3J0cyBpdAorICAgICAgICBpZiAodmFsICYmICFfY29uZi5zdXBwb3J0ZWRPcHRpb25zKCkuY29udGFpbnMoX2NvbmYuT1BUSU9OX09QVElNSVNUSUMpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgKCJvcHRpbWlzdGljLW5vdC1zdXBwb3J0ZWQiKSk7CisKKyAgICAgICAgX29wdGltaXN0aWMgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXN0b3JlU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBfcmVzdG9yZVN0YXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3RvcmVTdGF0ZShpbnQgdmFsKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgIT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoInRyYW5zLWFjdGl2ZSIsCisgICAgICAgICAgICAgICAgIlJlc3RvcmUiKSk7CisKKyAgICAgICAgX3Jlc3RvcmVTdGF0ZSA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9yZXRhaW5TdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXRhaW5TdGF0ZShib29sZWFuIHZhbCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19QUkVTVE9SSU5HKSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImlsbGVnYWwtb3AtaW4tcHJlc3RvcmUiKSk7CisgICAgICAgIF9yZXRhaW5TdGF0ZSA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEF1dG9DbGVhcigpIHsKKyAgICAgICAgcmV0dXJuIF9hdXRvQ2xlYXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0NsZWFyKGludCB2YWwpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBfYXV0b0NsZWFyID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXV0b0RldGFjaCgpIHsKKyAgICAgICAgcmV0dXJuIF9hdXRvRGV0YWNoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXRhY2goaW50IGRldGFjaEZsYWdzKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgX2F1dG9EZXRhY2ggPSBkZXRhY2hGbGFnczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGV0YWNoKGludCBkZXRhY2hGbGFnLCBib29sZWFuIG9uKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaWYgKG9uKQorICAgICAgICAgICAgX2F1dG9EZXRhY2ggfD0gZGV0YWNoRmxhZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2F1dG9EZXRhY2ggJj0gfmRldGFjaEZsYWc7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZXRhY2hTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9kZXRhY2hTdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hTdGF0ZShpbnQgbW9kZSkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIF9kZXRhY2hTdGF0ZSA9IG1vZGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZXRhY2hlZE5ldygpIHsKKyAgICAgICAgcmV0dXJuIF9kZXRhY2hlZE5ldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hlZE5ldyhib29sZWFuIGlzTmV3KSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgX2RldGFjaGVkTmV3ID0gaXNOZXc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb25zKCkgeworICAgICAgICByZXR1cm4gX3N5bmNNYW5hZ2VkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucyhib29sZWFuIHN5bmMpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBfc3luY01hbmFnZWQgPSBzeW5jOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEV2aWN0RnJvbURhdGFDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIF9ldmljdERhdGFDYWNoZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFdmljdEZyb21EYXRhQ2FjaGUoYm9vbGVhbiBldmljdCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIF9ldmljdERhdGFDYWNoZSA9IGV2aWN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFBvcHVsYXRlRGF0YUNhY2hlKCkgeworICAgICAgICByZXR1cm4gX3BvcHVsYXRlRGF0YUNhY2hlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBvcHVsYXRlRGF0YUNhY2hlKGJvb2xlYW4gY2FjaGUpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBfcG9wdWxhdGVEYXRhQ2FjaGUgPSBjYWNoZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhcmdlVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBfbGFyZ2VUcmFuc2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYXJnZVRyYW5zYWN0aW9uKGJvb2xlYW4gbGFyZ2VUcmFuc2FjdGlvbikgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIF9sYXJnZVRyYW5zYWN0aW9uID0gbGFyZ2VUcmFuc2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKF91c2VyT2JqZWN0cyA9PSBudWxsKSA/IG51bGwgOiBfdXNlck9iamVjdHMuZ2V0KGtleSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKF91c2VyT2JqZWN0cyA9PSBudWxsKSA/IG51bGwgOiBfdXNlck9iamVjdHMucmVtb3ZlKGtleSk7CisKKyAgICAgICAgICAgIGlmIChfdXNlck9iamVjdHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfdXNlck9iamVjdHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgcmV0dXJuIF91c2VyT2JqZWN0cy5wdXQoa2V5LCB2YWwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vCisgICAgLy8gRXZlbnRzCisgICAgLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyLCBDbGFzc1tdIGNsYXNzZXMpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2xpZmVFdmVudE1hbmFnZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIsIGNsYXNzZXMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2xpZmVFdmVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExpZmVjeWNsZUxpc3RlbmVyQ2FsbGJhY2tNb2RlKCkgeworICAgICAgICByZXR1cm4gX2xpZmVDYWxsYmFja01vZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2xpZmVDYWxsYmFja01vZGUgPSBtb2RlOworICAgICAgICAgICAgX2xpZmVFdmVudE1hbmFnZXIuc2V0RmFpbEZhc3QoKG1vZGUgJiBDQUxMQkFDS19GQUlMX0ZBU1QpICE9IDApOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlIHN0YXRlIG1hbmFnZXJzIGFjY2VzcyB0byB0aGUgbGlmZWN5Y2xlIGV2ZW50IG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV2ZW50TWFuYWdlciBnZXRMaWZlY3ljbGVFdmVudE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBfbGlmZUV2ZW50TWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIGdpdmVuIGxpZmVjeWNsZSBldmVudCwgaGFuZGxpbmcgYW55IGV4Y2VwdGlvbnMgYXBwcm9wcmlhdGVseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBldmVudHMgYXJlIGJlaW5nIHByb2Nlc3NlZCBhdCB0aGlzIHRpbWUKKyAgICAgKi8KKyAgICBib29sZWFuIGZpcmVMaWZlY3ljbGVFdmVudChPYmplY3Qgc3JjLCBPYmplY3QgcmVsYXRlZCwgQ2xhc3NNZXRhRGF0YSBtZXRhLAorICAgICAgICBpbnQgZXZlbnRUeXBlKSB7CisgICAgICAgIGlmIChfbGlmZUV2ZW50TWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBoYW5kbGVDYWxsYmFja0V4Y2VwdGlvbnMoX2xpZmVFdmVudE1hbmFnZXIuZmlyZUV2ZW50KHNyYywgcmVsYXRlZCwgCisgICAgICAgICAgICBtZXRhLCBldmVudFR5cGUpLCBfbGlmZUNhbGxiYWNrTW9kZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYWN0aW9ucyBvbiBjYWxsYmFjayBleGNlcHRpb25zIGRlcGVuZGluZyBvbiBjYWxsYmFjayBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDYWxsYmFja0V4Y2VwdGlvbnMoRXhjZXB0aW9uW10gZXhjZXBzLCBpbnQgbW9kZSkgeworICAgICAgICBpZiAoZXhjZXBzLmxlbmd0aCA9PSAwIHx8IChtb2RlICYgQ0FMTEJBQ0tfSUdOT1JFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9wZW5KUEFFeGNlcHRpb24gY2U7CisgICAgICAgIGlmIChleGNlcHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICBjZSA9IG5ldyBDYWxsYmFja0V4Y2VwdGlvbihleGNlcHNbMF0pOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgY2UgPSBuZXcgQ2FsbGJhY2tFeGNlcHRpb24oX2xvYy5nZXQoImNhbGxiYWNrLWVyciIpKS4KKyAgICAgICAgICAgICAgICBzZXROZXN0ZWRUaHJvd2FibGVzKGV4Y2Vwcyk7CisgICAgICAgIGlmICgobW9kZSAmIENBTExCQUNLX1JPTExCQUNLKSAhPSAwICYmIChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgIT0gMCkgeworICAgICAgICAgICAgY2Uuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICBzZXRSb2xsYmFja09ubHlJbnRlcm5hbChjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RlICYgQ0FMTEJBQ0tfTE9HKSAhPSAwICYmIF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy53YXJuKGNlKTsKKyAgICAgICAgaWYgKChtb2RlICYgQ0FMTEJBQ0tfUkVUSFJPVykgIT0gMCkKKyAgICAgICAgICAgIHRocm93IGNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zYWN0aW9uTGlzdGVuZXIoT2JqZWN0IHRsKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF90cmFuc0V2ZW50TWFuYWdlci5hZGRMaXN0ZW5lcih0bCk7CisgICAgICAgICAgICBpZiAodGwgaW5zdGFuY2VvZiBSZW1vdGVDb21taXRFdmVudE1hbmFnZXIpCisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfUkVNT1RFX0xJU1RFTkVSOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmFuc2FjdGlvbkxpc3RlbmVyKE9iamVjdCB0bCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3RyYW5zRXZlbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRsKQorICAgICAgICAgICAgICAgICYmICh0bCBpbnN0YW5jZW9mIFJlbW90ZUNvbW1pdEV2ZW50TWFuYWdlcikpCisgICAgICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1JFTU9URV9MSVNURU5FUjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKCkgeworICAgICAgICByZXR1cm4gX3RyYW5zQ2FsbGJhY2tNb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uTGlzdGVuZXJDYWxsYmFja01vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3RyYW5zQ2FsbGJhY2tNb2RlID0gbW9kZTsKKyAgICAgICAgICAgIF90cmFuc0V2ZW50TWFuYWdlci5zZXRGYWlsRmFzdCgobW9kZSAmIENBTExCQUNLX0ZBSUxfRkFTVCkgIT0gMCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmUgZ2l2ZW4gdHJhbnNhY3Rpb24gZXZlbnQsIGhhbmRsaW5nIGFueSBleGNlcHRpb25zIGFwcHJvcHJpYXRlbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZXZlbnRzIGFyZSBiZWluZyBwcm9jZXNzZWQgYXQgdGhpcyB0aW1lCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVUcmFuc2FjdGlvbkV2ZW50KFRyYW5zYWN0aW9uRXZlbnQgdHJhbnMpIHsKKyAgICAgICAgaWYgKF90cmFuc0V2ZW50TWFuYWdlciAhPSBudWxsKQorICAgICAgICAgICAgaGFuZGxlQ2FsbGJhY2tFeGNlcHRpb25zKF90cmFuc0V2ZW50TWFuYWdlci5maXJlRXZlbnQodHJhbnMpLAorICAgICAgICAgICAgICAgIF90cmFuc0NhbGxiYWNrTW9kZSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8KKyAgICAvLyBMb29rdXBzCisgICAgLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBPYmplY3QgZmluZChPYmplY3Qgb2lkLCBib29sZWFuIHZhbGlkYXRlLCBGaW5kQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaW50IGZsYWdzID0gT0lEX0NPUFkgfCBPSURfQUxMT1dfTkVXIHwgT0lEX05PREVMRVRFRDsKKyAgICAgICAgaWYgKCF2YWxpZGF0ZSkKKyAgICAgICAgICAgIGZsYWdzIHw9IE9JRF9OT1ZBTElEQVRFOworICAgICAgICByZXR1cm4gZmluZChvaWQsIF9mYywgbnVsbCwgbnVsbCwgZmxhZ3MsIGNhbGwpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmluZChPYmplY3Qgb2lkLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEJpdFNldCBleGNsdWRlLAorICAgICAgICBPYmplY3QgZWRhdGEsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gZmluZChvaWQsIGZldGNoLCBleGNsdWRlLCBlZGF0YSwgZmxhZ3MsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZpbmRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGZpbmQoT2JqZWN0IG9pZCwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBCaXRTZXQgZXhjbHVkZSwKKyAgICAgICAgT2JqZWN0IGVkYXRhLCBpbnQgZmxhZ3MsIEZpbmRDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAoY2FsbCA9PSBudWxsKQorICAgICAgICAgICAgY2FsbCA9IHRoaXM7CisgICAgICAgIG9pZCA9IGNhbGwucHJvY2Vzc0FyZ3VtZW50KG9pZCk7CisgICAgICAgIGlmIChvaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChmbGFncyAmIE9JRF9OT1ZBTElEQVRFKSA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC1vaWQiKSk7CisgICAgICAgICAgICByZXR1cm4gY2FsbC5wcm9jZXNzUmV0dXJuKG9pZCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZldGNoID09IG51bGwpCisgICAgICAgICAgICBmZXRjaCA9IF9mYzsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE5vbnRyYW5zYWN0aW9uYWxSZWFkKCk7CisKKyAgICAgICAgICAgIC8vIGNhY2hlZCBpbnN0YW5jZT8KKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsQnlJZChvaWQsCisgICAgICAgICAgICAgICAgKGZsYWdzICYgT0lEX0FMTE9XX05FVykgIT0gMCB8fCAoX2ZsYWdzICYgRkxBR19GTFVTSEVEKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlc0xvYWQoc20sIHRydWUsIGZldGNoLCBlZGF0YSwgZmxhZ3MpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbC5wcm9jZXNzUmV0dXJuKG9pZCwgc20pOworCisgICAgICAgICAgICAgICAgaWYgKCFzbS5pc0xvYWRpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIHRoZSBjb25maWd1cmVkIGZpZWxkcyBhcmUgbG9hZGVkOyBkbyB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIG1ha2luZyBpbnN0YW5jZSB0cmFuc2FjdGlvbmFsIGZvciBsb2NraW5nCisgICAgICAgICAgICAgICAgICAgIGlmICghc20uaXNUcmFuc2FjdGlvbmFsKCkgJiYgdXNlVHJhbnNhY3Rpb25hbFN0YXRlKGZldGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnRyYW5zYWN0aW9uYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCA9IHNtLmxvYWQoZmV0Y2gsIFN0YXRlTWFuYWdlckltcGwuTE9BRF9GR1MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGUsIGVkYXRhLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIG9uZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBPSURfTk9ERUxFVEVEKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZsYWdzICYgT0lEX05PVkFMSURBVEUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb25mZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsLnByb2Nlc3NSZXR1cm4ob2lkLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGRhdGEgbmVlZGVkIHRvIGJlIGxvYWRlZCBhbmQgdGhlIHVzZXIgd2FudHMgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUsIGp1c3QgbWFrZSBzdXJlIHRoZSBvYmplY3QgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgIGlmICghbG9hZGVkICYmIChmbGFncyAmIE9JRF9OT1ZBTElEQVRFKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBfY29tcGF0LmdldFZhbGlkYXRlVHJ1ZUNoZWNrc1N0b3JlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbS5pc1RyYW5zYWN0aW9uYWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIV9zdG9yZS5leGlzdHMoc20sIGVkYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIE9JRF9OT0RFTEVURUQpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwucHJvY2Vzc1JldHVybihvaWQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkZWwtaW5zdGFuY2UiLCBzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwgb2lkKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGNhY2hlZCwgd2UgbWF5IG5lZWQgdG8gdXBncmFkZSBsb2NrCisgICAgICAgICAgICAgICAgLy8gaWYgY3VycmVudCBsZXZlbCBpcyBoaWdoZXIgdGhhbiBsZXZlbCBvZiBpbml0aWFsIGxvYWQKKyAgICAgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQUNUSVZFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IGZldGNoLmdldFJlYWRMb2NrTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgX2xtLmxvY2soc20sIGxldmVsLCBmZXRjaC5nZXRMb2NrVGltZW91dCgpLCBlZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHNtLnJlYWRMb2NrZWQobGV2ZWwsIGZldGNoLmdldFdyaXRlTG9ja0xldmVsKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsbC5wcm9jZXNzUmV0dXJuKG9pZCwgc20pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGNhY2hlZCBzbSBmb3IgYSBuZXcvdHJhbnNpZW50IGlkIHR5cGUsIHdlCisgICAgICAgICAgICAvLyBpdCBkZWZpbml0ZWx5IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgICAgIGlmIChvaWQgaW5zdGFuY2VvZiBTdGF0ZU1hbmFnZXJJZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsbC5wcm9jZXNzUmV0dXJuKG9pZCwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYSBuZXcgc3RhdGUgbWFuYWdlciBmb3IgdGhlIGRhdGFzdG9yZSBpbnN0YW5jZQorICAgICAgICAgICAgc20gPSBuZXdTdGF0ZU1hbmFnZXJJbXBsKG9pZCwgKGZsYWdzICYgT0lEX0NPUFkpICE9IDApOworICAgICAgICAgICAgYm9vbGVhbiBsb2FkID0gcmVxdWlyZXNMb2FkKHNtLCBmYWxzZSwgZmV0Y2gsIGVkYXRhLCBmbGFncyk7CisgICAgICAgICAgICBzbSA9IGluaXRpYWxpemUoc20sIGxvYWQsIGZldGNoLCBlZGF0YSk7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBPSURfTk9WQUxJREFURSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKG9pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwucHJvY2Vzc1JldHVybihvaWQsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIGNvbmZpZ3VyZWQgZmllbGRzIHdlcmUgbG9hZGVkCisgICAgICAgICAgICBpZiAobG9hZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNtLmxvYWQoZmV0Y2gsIFN0YXRlTWFuYWdlckltcGwuTE9BRF9GR1MsIGV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZGF0YSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIG9uZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIE9JRF9OT0RFTEVURUQpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChmbGFncyAmIE9JRF9OT1ZBTElEQVRFKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb25mZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwucHJvY2Vzc1JldHVybihvaWQsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWxsLnByb2Nlc3NSZXR1cm4ob2lkLCBzbSk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYSBuZXdseS1jb25zdHJ1Y3RlZCBzdGF0ZSBtYW5hZ2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdGF0ZU1hbmFnZXJJbXBsIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBzbSwgYm9vbGVhbiBsb2FkLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBlZGF0YSkgeworICAgICAgICBpZiAoIWxvYWQpIHsKKyAgICAgICAgICAgIHNtLmluaXRpYWxpemUoc20uZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgUENTdGF0ZS5IT0xMT1cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUENTdGF0ZSBzdGF0ZSA9ICh1c2VUcmFuc2FjdGlvbmFsU3RhdGUoZmV0Y2gpKQorICAgICAgICAgICAgICAgID8gUENTdGF0ZS5QQ0xFQU4gOiBQQ1N0YXRlLlBOT05UUkFOUzsKKyAgICAgICAgICAgIHNtLnNldExvYWRpbmcodHJ1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghX3N0b3JlLmluaXRpYWxpemUoc20sIHN0YXRlLCBmZXRjaCwgZWRhdGEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc20uc2V0TG9hZGluZyhmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNtOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSBmaW5kQWxsKENvbGxlY3Rpb24gb2lkcywgYm9vbGVhbiB2YWxpZGF0ZSwKKyAgICAgICAgRmluZENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGludCBmbGFncyA9IE9JRF9DT1BZIHwgT0lEX0FMTE9XX05FVyB8IE9JRF9OT0RFTEVURUQ7CisgICAgICAgIGlmICghdmFsaWRhdGUpCisgICAgICAgICAgICBmbGFncyB8PSBPSURfTk9WQUxJREFURTsKKyAgICAgICAgcmV0dXJuIGZpbmRBbGwob2lkcywgX2ZjLCBudWxsLCBudWxsLCBmbGFncywgY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIGZpbmRBbGwoQ29sbGVjdGlvbiBvaWRzLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIEJpdFNldCBleGNsdWRlLCBPYmplY3QgZWRhdGEsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gZmluZEFsbChvaWRzLCBmZXRjaCwgZXhjbHVkZSwgZWRhdGEsIGZsYWdzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmaW5kZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGZpbmRBbGwoQ29sbGVjdGlvbiBvaWRzLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsCisgICAgICAgIEJpdFNldCBleGNsdWRlLCBPYmplY3QgZWRhdGEsIGludCBmbGFncywgRmluZENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIC8vIHRocm93IGFueSBleGNlcHRpb25zIGZvciBudWxsIG9pZHMgdXAgaW1tZWRpYXRlbHkKKyAgICAgICAgaWYgKG9pZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib2lkcyA9PSBudWxsIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBPSURfTk9WQUxJREFURSkgIT0gMCAmJiBvaWRzLmNvbnRhaW5zKG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm51bGwtb2lkcyIpKTsKKworICAgICAgICAvLyB3ZSBoYXZlIHRvIHVzZSBhIG1hcCBvZiBvaWQtPnNtIHJhdGhlciB0aGFuIGEgc2ltcGxlCisgICAgICAgIC8vIGFycmF5LCBzbyB0aGF0IHdlIG1ha2Ugc3VyZSBub3QgdG8gY3JlYXRlIG11bHRpcGxlIHNtcyBmb3IgZXF1aXZhbGVudAorICAgICAgICAvLyBvaWRzIGlmIHRoZSB1c2VyIGhhcyBkdXBsaWNhdGVzIGluIHRoZSBnaXZlbiBhcnJheQorICAgICAgICBfbG9hZGluZyA9IG5ldyBIYXNoTWFwKChpbnQpIChvaWRzLnNpemUoKSAqIDEuMzMgKyAxKSk7CisgICAgICAgIGlmIChjYWxsID09IG51bGwpCisgICAgICAgICAgICBjYWxsID0gdGhpczsKKyAgICAgICAgaWYgKGZldGNoID09IG51bGwpCisgICAgICAgICAgICBmZXRjaCA9IF9mYzsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE5vbnRyYW5zYWN0aW9uYWxSZWFkKCk7CisKKyAgICAgICAgICAgIC8vIGNvbGxlY3Rpb24gb2Ygc3RhdGUgbWFuYWdlcnMgdG8gcGFzcyB0byBzdG9yZSBtYW5hZ2VyCisgICAgICAgICAgICBMaXN0IGxvYWQgPSBudWxsOworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7CisgICAgICAgICAgICBib29sZWFuIHRyYW5zU3RhdGUgPSB1c2VUcmFuc2FjdGlvbmFsU3RhdGUoZmV0Y2gpOworICAgICAgICAgICAgT2JqZWN0IG9iaiwgb2lkOworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9pZHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBvaWQsIHNraXAgcmVwZWF0cworICAgICAgICAgICAgICAgIG9iaiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgb2lkID0gY2FsbC5wcm9jZXNzQXJndW1lbnQob2JqKTsKKyAgICAgICAgICAgICAgICBpZiAob2lkID09IG51bGwgfHwgX2xvYWRpbmcuY29udGFpbnNLZXkob2JqKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgY2FjaGVkIGluc3RhbmNlIG9yIGl0IGlzIG5vdCB0cmFuc2FjdGlvbmFsCisgICAgICAgICAgICAgICAgLy8gYW5kIGlzIGhvbGxvdyBvciB3ZSBuZWVkIHRvIHZhbGlkYXRlLCBsb2FkIGl0CisgICAgICAgICAgICAgICAgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsQnlJZChvaWQsIChmbGFncyAmIE9JRF9BTExPV19ORVcpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgKF9mbGFncyAmIEZMQUdfRkxVU0hFRCkgIT0gMCk7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSBzbSAhPSBudWxsOworICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgICAgICAgICAgICAgIHNtID0gbmV3U3RhdGVNYW5hZ2VySW1wbChvaWQsIChmbGFncyAmIE9JRF9DT1BZKSAhPSAwKTsKKworICAgICAgICAgICAgICAgIF9sb2FkaW5nLnB1dChvYmosIHNtKTsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWlyZXNMb2FkKHNtLCBpbml0aWFsaXplZCwgZmV0Y2gsIGVkYXRhLCBmbGFncykpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNTdGF0ZSA9IHRyYW5zU3RhdGUgfHwgdXNlVHJhbnNhY3Rpb25hbFN0YXRlKGZldGNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkICYmICFzbS5pc1RyYW5zYWN0aW9uYWwoKSAmJiB0cmFuc1N0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgc20udHJhbnNhY3Rpb25hbCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9hZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCA9IG5ldyBBcnJheUxpc3Qob2lkcy5zaXplKCkgLSBpZHgpOworICAgICAgICAgICAgICAgICAgICBsb2FkLmFkZChzbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgICAgICAgICAgICAgIHNtLmluaXRpYWxpemUoc20uZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQQ1N0YXRlLkhPTExPVyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBhc3MgYWxsIHN0YXRlIG1hbmFnZXJzIGluIG5lZWQgb2YgbG9hZGluZyBvciB2YWxpZGF0aW9uIHRvIHRoZQorICAgICAgICAgICAgLy8gc3RvcmUgbWFuYWdlcgorICAgICAgICAgICAgaWYgKGxvYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFBDU3RhdGUgc3RhdGUgPSAodHJhbnNTdGF0ZSkgPyBQQ1N0YXRlLlBDTEVBTgorICAgICAgICAgICAgICAgICAgICA6IFBDU3RhdGUuUE5PTlRSQU5TOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gZmFpbGVkID0gX3N0b3JlLmxvYWRBbGwobG9hZCwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIFN0b3JlTWFuYWdlci5GT1JDRV9MT0FEX05PTkUsIGZldGNoLCBlZGF0YSk7CisKKyAgICAgICAgICAgICAgICAvLyBzZXQgZmFpbGVkIGluc3RhbmNlcyB0byBudWxsCisgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCAhPSBudWxsICYmICFmYWlsZWQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBPSURfTk9WQUxJREFURSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGZhaWxlZCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZmFpbGVkLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRpbmcucHV0KGl0ci5uZXh0KCksIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY3JlYXRlIHJlc3VsdHMgYXJyYXk7IG1ha2Ugc3VyZSBhbGwgY29uZmlndXJlZCBmaWVsZHMgYXJlCisgICAgICAgICAgICAvLyBsb2FkZWQgaW4gZWFjaCBpbnN0YW5jZQorICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0cyA9IG5ldyBPYmplY3Rbb2lkcy5zaXplKCldOworICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmUgPSAoX2ZsYWdzICYgRkxBR19BQ1RJVkUpICE9IDA7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSBmZXRjaC5nZXRSZWFkTG9ja0xldmVsKCk7CisgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvaWRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgb2lkID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBfbG9hZGluZy5nZXQob2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiByZXF1aXJlc0xvYWQoc20sIHRydWUsIGZldGNoLCBlZGF0YSwgZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbS5sb2FkKGZldGNoLCBTdGF0ZU1hbmFnZXJJbXBsLkxPQURfRkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgCWV4Y2x1ZGUsIGVkYXRhLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xtLmxvY2soc20sIGxldmVsLCBmZXRjaC5nZXRMb2NrVGltZW91dCgpLCBlZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20ucmVhZExvY2tlZChsZXZlbCwgZmV0Y2guZ2V0V3JpdGVMb2NrTGV2ZWwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIG9uZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBPSURfTk9ERUxFVEVEKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZsYWdzICYgT0lEX05PVkFMSURBVEUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb25mZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHRzW2lkeF0gPSBjYWxsLnByb2Nlc3NSZXR1cm4ob2lkLCBzbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9sb2FkaW5nID0gbnVsbDsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGluc3RhbmNlIG5lZWRzIGxvYWRpbmcgYmVmb3JlIGJlaW5nIHJldHVybmVkCisgICAgICogdG8gdGhlIHVzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzTG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBib29sZWFuIGluaXRpYWxpemVkLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBlZGF0YSwgaW50IGZsYWdzKSB7CisgICAgICAgIGlmICghZmV0Y2gucmVxdWlyZXNMb2FkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICgoZmxhZ3MgJiBPSURfTk9WQUxJREFURSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoZWRhdGEgIT0gbnVsbCkgLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgZXhpc3RpbmcgcmVzdWx0CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkICYmIHNtLmdldFBDU3RhdGUoKSAhPSBQQ1N0YXRlLkhPTExPVykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCAmJiBzbS5nZXRNZXRhRGF0YSgpLmdldFBDU3ViY2xhc3NlcygpLmxlbmd0aCA+IDApCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuICFfY29tcGF0LmdldFZhbGlkYXRlRmFsc2VSZXR1cm5zSG9sbG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdG8gdXNlIGEgdHJhbnNhY3Rpb25hbCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlVHJhbnNhY3Rpb25hbFN0YXRlKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfQUNUSVZFKSAhPSAwICYmICghX29wdGltaXN0aWMKKyAgICAgICAgICAgIHx8IF9hdXRvQ2xlYXIgPT0gQ0xFQVJfQUxMCisgICAgICAgICAgICB8fCBmZXRjaC5nZXRSZWFkTG9ja0xldmVsKCkgIT0gTE9DS19OT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZpbmRDYWNoZWQoT2JqZWN0IG9pZCwgRmluZENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChjYWxsID09IG51bGwpCisgICAgICAgICAgICBjYWxsID0gdGhpczsKKyAgICAgICAgb2lkID0gY2FsbC5wcm9jZXNzQXJndW1lbnQob2lkKTsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNhbGwucHJvY2Vzc1JldHVybihvaWQsIG51bGwpOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IGdldFN0YXRlTWFuYWdlckltcGxCeUlkKG9pZCwgdHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gY2FsbC5wcm9jZXNzUmV0dXJuKG9pZCwgc20pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0T2JqZWN0SWRUeXBlKENsYXNzIGNscykgeworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhKGNscywgX2xvYWRlciwgZmFsc2UpOworICAgICAgICAgICAgaWYgKG1ldGEgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IG1ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5JRF9VTktOT1dOKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKG1ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5JRF9BUFBMSUNBVElPTikKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0YS5nZXRPYmplY3RJZFR5cGUoKTsKKworICAgICAgICAgICAgcmV0dXJuIF9zdG9yZS5nZXREYXRhU3RvcmVJZFR5cGUobWV0YSk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3T2JqZWN0SWQoQ2xhc3MgY2xzLCBPYmplY3QgdmFsKSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IF9jb25mLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEoY2xzLCBfbG9hZGVyLCB0cnVlKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWV0YS5nZXRJZGVudGl0eVR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRToKKyAgICAgICAgICAgICAgICAvLyBkZWxlZ2F0ZSB0byBzdG9yZSBtYW5hZ2VyIGZvciBkYXRhc3RvcmUgaWRzCisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZworICAgICAgICAgICAgICAgICAgICAmJiAoKFN0cmluZykgdmFsKS5zdGFydHNXaXRoKFN0YXRlTWFuYWdlcklkLlNUUklOR19QUkVGSVgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlTWFuYWdlcklkKChTdHJpbmcpIHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdG9yZS5uZXdEYXRhU3RvcmVJZCh2YWwsIG1ldGEpOworICAgICAgICAgICAgY2FzZSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGlmIChJbXBsSGVscGVyLmlzQXNzaWduYWJsZShtZXRhLmdldE9iamVjdElkVHlwZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgdmFsLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWV0YS5pc09wZW5KUEFJZGVudGl0eSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0YS5pc09iamVjdElkVHlwZVNoYXJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RJZChjbHMsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RyaW5naWZpZWQgYXBwIGlkPworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcgCisgICAgICAgICAgICAgICAgICAgICYmICFfY29uZi5nZXRDb21wYXRpYmlsaXR5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmljdElkZW50aXR5VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIU1vZGlmaWVyLmlzQWJzdHJhY3QoY2xzLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBDUmVnaXN0cnkubmV3T2JqZWN0SWQoY2xzLCAoU3RyaW5nKSB2YWwpOworCisgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJyID0gKHZhbCBpbnN0YW5jZW9mIE9iamVjdFtdKSA/IChPYmplY3RbXSkgdmFsCisgICAgICAgICAgICAgICAgICAgIDogbmV3IE9iamVjdFtdeyB2YWwgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXBwbGljYXRpb25JZHMuZnJvbVBLVmFsdWVzKGFyciwgbWV0YSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJtZXRhLXVua25vd25pZCIsIGNscykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1pZC12YWx1ZSIsIHZhbCwKKyAgICAgICAgICAgICAgICB2YWwuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGNscykpLnNldENhdXNlKGNjZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHN0YXRlIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiBvaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdGF0ZU1hbmFnZXJJbXBsIG5ld1N0YXRlTWFuYWdlckltcGwoT2JqZWN0IG9pZCwgYm9vbGVhbiBjb3B5KSB7CisgICAgICAgIC8vIHNlZSBpZiB3ZSdyZSBpbiB0aGUgcHJvY2VzcyBvZiBsb2FkaW5nIHRoaXMgb2lkIGluIGEgbG9hZEFsbCBjYWxsCisgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc207CisgICAgICAgIGlmIChfbG9hZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBfbG9hZGluZy5nZXQob2lkKTsKKyAgICAgICAgICAgIGlmIChzbSAhPSBudWxsICYmIHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluZCBtZXRhZGF0YSBmb3IgdGhlIG9pZAorICAgICAgICBDbGFzcyBwY1R5cGUgPSBfc3RvcmUuZ2V0TWFuYWdlZFR5cGUob2lkKTsKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gX2NvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhOworICAgICAgICBpZiAocGNUeXBlICE9IG51bGwpCisgICAgICAgICAgICBtZXRhID0gcmVwb3MuZ2V0TWV0YURhdGEocGNUeXBlLCBfbG9hZGVyLCB0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWV0YSA9IHJlcG9zLmdldE1ldGFEYXRhKG9pZCwgX2xvYWRlciwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29weSB0aGUgb2lkIGlmIG5lZWRlZAorICAgICAgICBpZiAoY29weSAmJiBfY29tcGF0LmdldENvcHlPYmplY3RJZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5JRF9BUFBMSUNBVElPTikKKyAgICAgICAgICAgICAgICBvaWQgPSBBcHBsaWNhdGlvbklkcy5jb3B5KG9pZCwgbWV0YSk7CisgICAgICAgICAgICBlbHNlIGlmIChtZXRhLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWV0YURhdGEuSURfVU5LTk9XTikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibWV0YS11bmtub3duaWQiLCBtZXRhKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb2lkID0gX3N0b3JlLmNvcHlEYXRhU3RvcmVJZChvaWQsIG1ldGEpOworICAgICAgICB9CisKKyAgICAgICAgc20gPSBuZXdTdGF0ZU1hbmFnZXJJbXBsKG9pZCwgbWV0YSk7CisgICAgICAgIHNtLnNldE9iamVjdElkKG9pZCk7CisgICAgICAgIHJldHVybiBzbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzdGF0ZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gb2lkIGFuZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RhdGVNYW5hZ2VySW1wbCBuZXdTdGF0ZU1hbmFnZXJJbXBsKE9iamVjdCBvaWQsCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gbmV3IFN0YXRlTWFuYWdlckltcGwob2lkLCBtZXRhLCB0aGlzKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmFuc2FjdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgYmVnaW4oKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgIT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJhY3RpdmUiKSk7CisgICAgICAgICAgICBfZmFjdG9yeS5zeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbih0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIGJlZ2luSW50ZXJuYWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBzdG9yZSBtYW5hZ2VyIG9mIGEgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luSW50ZXJuYWwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiZWdpblN0b3JlTWFuYWdlclRyYW5zYWN0aW9uKF9vcHRpbWlzdGljKTsKKyAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0FDVElWRTsKKworICAgICAgICAgICAgLy8gc3RhcnQgbG9ja2luZworICAgICAgICAgICAgaWYgKCFfb3B0aW1pc3RpYykgeworICAgICAgICAgICAgICAgIF9mYy5zZXRSZWFkTG9ja0xldmVsKF9jb25mLmdldFJlYWRMb2NrTGV2ZWxDb25zdGFudCgpKTsKKyAgICAgICAgICAgICAgICBfZmMuc2V0V3JpdGVMb2NrTGV2ZWwoX2NvbmYuZ2V0V3JpdGVMb2NrTGV2ZWxDb25zdGFudCgpKTsKKyAgICAgICAgICAgICAgICBfZmMuc2V0TG9ja1RpbWVvdXQoX2NvbmYuZ2V0TG9ja1RpbWVvdXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbG0uYmVnaW5UcmFuc2FjdGlvbigpOworCisgICAgICAgICAgICBpZiAoX3RyYW5zRXZlbnRNYW5hZ2VyLmhhc0JlZ2luTGlzdGVuZXJzKCkpCisgICAgICAgICAgICAgICAgZmlyZVRyYW5zYWN0aW9uRXZlbnQobmV3IFRyYW5zYWN0aW9uRXZlbnQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25FdmVudC5BRlRFUl9CRUdJTiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIHRyYW5zYWN0aW9uLCBkb24ndCBsZXQgaXQgY29tbWl0CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQUNUSVZFKSAhPSAwKQorICAgICAgICAgICAgICAgIHNldFJvbGxiYWNrT25seUludGVybmFsKGtlKTsKKyAgICAgICAgICAgIHRocm93IGtlLnNldEZhdGFsKHRydWUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIHRyYW5zYWN0aW9uLCBkb24ndCBsZXQgaXQgY29tbWl0CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQUNUSVZFKSAhPSAwKQorICAgICAgICAgICAgICAgIHNldFJvbGxiYWNrT25seUludGVybmFsKHJlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihyZSkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3BlbmRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfcGVuZGluZy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgc20gPSAoU3RhdGVNYW5hZ2VySW1wbCkgaXQubmV4dCgpOworICAgICAgICAgICAgICAgIHNtLnRyYW5zYWN0aW9uYWwoKTsKKyAgICAgICAgICAgICAgICBpZiAoc20uaXNEaXJ0eSgpKQorICAgICAgICAgICAgICAgICAgICBzZXREaXJ0eShzbSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcGVuZGluZyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpblN0b3JlKCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRyYW5zYWN0aW9uT3BlcmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkVfQUNUSVZFKSA9PSAwKQorICAgICAgICAgICAgICAgIGJlZ2luU3RvcmVNYW5hZ2VyVHJhbnNhY3Rpb24oZmFsc2UpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW4gYSBzdG9yZSBtYW5hZ2VyIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWdpblN0b3JlTWFuYWdlclRyYW5zYWN0aW9uKGJvb2xlYW4gb3B0aW1pc3RpYykgeworICAgICAgICBpZiAoIW9wdGltaXN0aWMpIHsKKyAgICAgICAgICAgIHJldGFpbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIF9zdG9yZS5iZWdpbigpOworICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfU1RPUkVfQUNUSVZFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKF9jb25uUmV0YWluTW9kZSA9PSBDT05OX1JFVEFJTl9UUkFOUykKKyAgICAgICAgICAgICAgICByZXRhaW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBfc3RvcmUuYmVnaW5PcHRpbWlzdGljKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGN1cnJlbnQgc3RvcmUgbWFuYWdlciB0cmFuc2FjdGlvbi4gVGhyb3dzIGFuCisgICAgICogZXhjZXB0aW9uIHRvIHNpZ25hbCBhIGZvcmNlZCByb2xsYmFjayBhZnRlciBmYWlsZWQgY29tbWl0LCBvdGhlcndpc2UKKyAgICAgKiByZXR1cm5zIGFueSBleGNlcHRpb24gZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBlbmQgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bnRpbWVFeGNlcHRpb24gZW5kU3RvcmVNYW5hZ2VyVHJhbnNhY3Rpb24oYm9vbGVhbiByb2xsYmFjaykgeworICAgICAgICBib29sZWFuIGZvcmNlZFJvbGxiYWNrID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gcmVsZWFzZUNvbm4gPSBmYWxzZTsKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBlcnIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFX0FDVElWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VDb25uID0gX2Nvbm5SZXRhaW5Nb2RlICE9IENPTk5fUkVUQUlOX0FMV0FZUzsKKyAgICAgICAgICAgICAgICBpZiAocm9sbGJhY2spCisgICAgICAgICAgICAgICAgICAgIF9zdG9yZS5yb2xsYmFjaygpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX3N0b3JlLmNvbW1pdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQ29ubiA9IF9jb25uUmV0YWluTW9kZSA9PSBDT05OX1JFVEFJTl9UUkFOUzsKKyAgICAgICAgICAgICAgICBfc3RvcmUucm9sbGJhY2tPcHRpbWlzdGljKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGlmICghcm9sbGJhY2spIHsKKyAgICAgICAgICAgICAgICBmb3JjZWRSb2xsYmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsgX3N0b3JlLnJvbGxiYWNrKCk7IH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUyKSB7fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gcmU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfU1RPUkVfQUNUSVZFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbGVhc2VDb25uKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JjZWRSb2xsYmFjaykKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRyYW5zYWN0aW9uT3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uIHRyYW5zID0KKyAgICAgICAgICAgICAgICBfcnVudGltZS5nZXRUcmFuc2FjdGlvbk1hbmFnZXIoKS5nZXRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgaWYgKHRyYW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC10cmFucyIpKTsKKworICAgICAgICAgICAgLy8gdGhpcyBjb21taXQgb24gdGhlIHRyYW5zYWN0aW9uIHdpbGwgY2F1c2Ugb3VyCisgICAgICAgICAgICAvLyBiZWZvcmVDb21wbGV0aW9uIG1ldGhvZCB0byBiZSBpbnZva2VkCisgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmQtdHJhbnMtZXJyb3IiKSwga2UpOworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImVuZC10cmFucy1lcnJvciIpLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRyYW5zYWN0aW9uT3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uIHRyYW5zID0KKyAgICAgICAgICAgICAgICBfcnVudGltZS5nZXRUcmFuc2FjdGlvbk1hbmFnZXIoKS5nZXRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgaWYgKHRyYW5zICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJhbnMucm9sbGJhY2soKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmQtdHJhbnMtZXJyb3IiKSwga2UpOworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImVuZC10cmFucy1lcnJvciIpLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghX21hbmFnZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidHJhbnMtbm90LW1hbmFnZWQiKSk7CisgICAgICAgICAgICBpZiAoX2ZhY3Rvcnkuc3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb24odGhpcywgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgYmVnaW5JbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXRBbmRSZXN1bWUoKSB7CisgICAgICAgIGVuZEFuZFJlc3VtZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByb2xsYmFja0FuZFJlc3VtZSgpIHsKKyAgICAgICAgZW5kQW5kUmVzdW1lKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kQW5kUmVzdW1lKGJvb2xlYW4gY29tbWl0KSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb21taXQpCisgICAgICAgICAgICAgICAgY29tbWl0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcm9sbGJhY2soKTsKKyAgICAgICAgICAgIGJlZ2luKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFJvbGxiYWNrT25seSgpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQUNUSVZFKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb24gdHJhbnMgPQorICAgICAgICAgICAgICAgIF9ydW50aW1lLmdldFRyYW5zYWN0aW9uTWFuYWdlcigpLmdldFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBpZiAodHJhbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJhbnMuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLlNUQVRVU19NQVJLRURfUk9MTEJBQ0s7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9sbGJhY2tDYXVzZSgpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQUNUSVZFKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbiB0cmFucyA9CisgICAgICAgICAgICAgICAgX3J1bnRpbWUuZ2V0VHJhbnNhY3Rpb25NYW5hZ2VyKCkuZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGlmICh0cmFucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKHRyYW5zLmdldFN0YXR1cygpID09IFN0YXR1cy5TVEFUVVNfTUFSS0VEX1JPTExCQUNLKQorICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5nZXRSb2xsYmFja0NhdXNlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoKSB7CisgICAgICAgIHNldFJvbGxiYWNrT25seShuZXcgVXNlckV4Y2VwdGlvbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJhbnNhY3Rpb25PcGVyYXRpb24oKTsKKyAgICAgICAgICAgIHNldFJvbGxiYWNrT25seUludGVybmFsKGNhdXNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFyayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhcyByb2xsYmFjay1vbmx5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRSb2xsYmFja09ubHlJbnRlcm5hbChUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uIHRyYW5zID0KKyAgICAgICAgICAgICAgICBfcnVudGltZS5nZXRUcmFuc2FjdGlvbk1hbmFnZXIoKS5nZXRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgaWYgKHRyYW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC10cmFucyIpKTsKKyAgICAgICAgICAgIF9ydW50aW1lLnNldFJvbGxiYWNrT25seShjYXVzZSk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlcG9pbnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgaWYgKF9zYXZlcG9pbnRzICE9IG51bGwgJiYgX3NhdmVwb2ludHMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoInNhdmVwb2ludC1leGlzdHMiLCBuYW1lKSk7CisKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19GTFVTSEVEKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgIV9zcG0uc3VwcG9ydHNJbmNyZW1lbnRhbEZsdXNoKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgic2F2ZXBvaW50LWZsdXNoLW5vdC1zdXBwb3J0ZWQiKSk7CisKKyAgICAgICAgICAgIE9wZW5KUEFTYXZlcG9pbnQgc2F2ZSA9IF9zcG0ubmV3U2F2ZXBvaW50KG5hbWUsIHRoaXMpOworICAgICAgICAgICAgaWYgKF9zYXZlcG9pbnRzID09IG51bGwgfHwgX3NhdmVwb2ludHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2F2ZS5zYXZlKGdldFRyYW5zYWN0aW9uYWxTdGF0ZXMoKSk7CisgICAgICAgICAgICAgICAgX3NhdmVwb2ludHMgPSBuZXcgTGlua2VkTWFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChfc2F2ZXBvaW50Q2FjaGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2F2ZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYXZlLnNhdmUoX3NhdmVwb2ludENhY2hlKTsKKyAgICAgICAgICAgICAgICAgICAgX3NhdmVwb2ludENhY2hlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX3NhdmVwb2ludHMucHV0KG5hbWUsIHNhdmUpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlU2F2ZXBvaW50KCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3NhdmVwb2ludHMgPT0gbnVsbCB8fCBfc2F2ZXBvaW50cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWxhc3RzYXZlcG9pbnQiKSk7CisgICAgICAgICAgICByZWxlYXNlU2F2ZXBvaW50KChTdHJpbmcpIF9zYXZlcG9pbnRzLmdldAorICAgICAgICAgICAgICAgIChfc2F2ZXBvaW50cy5zaXplKCkgLSAxKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VTYXZlcG9pbnQoU3RyaW5nIHNhdmVwb2ludCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAoX3NhdmVwb2ludHMgPT0gbnVsbCkgPyAtMQorICAgICAgICAgICAgICAgIDogX3NhdmVwb2ludHMuaW5kZXhPZihzYXZlcG9pbnQpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm8tc2F2ZXBvaW50Iiwgc2F2ZXBvaW50KSk7CisKKyAgICAgICAgICAgIC8vIGNsZWFyIG9sZCBpbiByZXZlcnNlCisgICAgICAgICAgICBPcGVuSlBBU2F2ZXBvaW50IHNhdmU7CisgICAgICAgICAgICB3aGlsZSAoX3NhdmVwb2ludHMuc2l6ZSgpID4gaW5kZXggKyAxKSB7CisgICAgICAgICAgICAgICAgc2F2ZSA9IChPcGVuSlBBU2F2ZXBvaW50KSBfc2F2ZXBvaW50cy5yZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgKF9zYXZlcG9pbnRzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIHNhdmUucmVsZWFzZShmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNhdmUgPSAoT3BlbkpQQVNhdmVwb2ludCkgX3NhdmVwb2ludHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIHNhdmUucmVsZWFzZSh0cnVlKTsKKyAgICAgICAgICAgIGlmIChfc2F2ZXBvaW50Q2FjaGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc2F2ZXBvaW50Q2FjaGUuY2xlYXIoKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludCgpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zYXZlcG9pbnRzID09IG51bGwgfHwgX3NhdmVwb2ludHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1sYXN0c2F2ZXBvaW50IikpOworICAgICAgICAgICAgcm9sbGJhY2tUb1NhdmVwb2ludCgoU3RyaW5nKSBfc2F2ZXBvaW50cy5nZXQKKyAgICAgICAgICAgICAgICAoX3NhdmVwb2ludHMuc2l6ZSgpIC0gMSkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByb2xsYmFja1RvU2F2ZXBvaW50KFN0cmluZyBzYXZlcG9pbnQpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0QWN0aXZlVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gKF9zYXZlcG9pbnRzID09IG51bGwpID8gLTEKKyAgICAgICAgICAgICAgICA6IF9zYXZlcG9pbnRzLmluZGV4T2Yoc2F2ZXBvaW50KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXNhdmVwb2ludCIsIHNhdmVwb2ludCkpOworCisgICAgICAgICAgICAvLyBjbGVhciBvbGQgaW4gcmV2ZXJzZQorICAgICAgICAgICAgT3BlbkpQQVNhdmVwb2ludCBzYXZlOworICAgICAgICAgICAgd2hpbGUgKF9zYXZlcG9pbnRzLnNpemUoKSA+IGluZGV4ICsgMSkgeworICAgICAgICAgICAgICAgIHNhdmUgPSAoT3BlbkpQQVNhdmVwb2ludCkgX3NhdmVwb2ludHMucmVtb3ZlCisgICAgICAgICAgICAgICAgICAgIChfc2F2ZXBvaW50cy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBzYXZlLnJlbGVhc2UoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYXZlID0gKE9wZW5KUEFTYXZlcG9pbnQpIF9zYXZlcG9pbnRzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHNhdmVkID0gc2F2ZS5yb2xsYmFjayhfc2F2ZXBvaW50cy52YWx1ZXMoKSk7CisgICAgICAgICAgICBpZiAoX3NhdmVwb2ludENhY2hlICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3NhdmVwb2ludENhY2hlLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoX3RyYW5zQ2FjaGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHVwIGEgbmV3IGNvbGxlY3Rpb24gb2Ygc3RhdGVzCisgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25hbENhY2hlIG9sZFRyYW5zQ2FjaGUgPSBfdHJhbnNDYWNoZTsKKyAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbmFsQ2FjaGUgbmV3VHJhbnNDYWNoZSA9IG5ldyBUcmFuc2FjdGlvbmFsQ2FjaGUKKyAgICAgICAgICAgICAgICAgICAgKF9vcmRlckRpcnR5KTsKKyAgICAgICAgICAgICAgICBfdHJhbnNDYWNoZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdGhlcmUgaXMgdGhlIGFzc3VtcHRpb24gdGhhdCBpbmNyZW1lbnRhbAorICAgICAgICAgICAgICAgIC8vIGZsdXNoIGlzIGVpdGhlciBhKSBub3QgYWxsb3dlZCwgb3IgYikgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAvLyBwcmUtc2F2ZXBvaW50LiAgdGhpcyBzb2x2ZXMgYSBudW1iZXIgb2YgaXNzdWVzIGluY2x1ZGluZworICAgICAgICAgICAgICAgIC8vIHN0b3JpbmcgZmx1c2hlZCBzdGF0ZXMgYXMgd2VsbCBhcyBPSUQgaGFuZGxpbmcuCisgICAgICAgICAgICAgICAgLy8gaWYgZnV0dXJlIHBsdWdpbnMgZG8gbm90IGZvbGxvdyB0aGlzLCB3ZSBuZWVkIHRvIGNhY2hlCisgICAgICAgICAgICAgICAgLy8gbW9yZSBpbmZvIHBlciBzdGF0ZQorICAgICAgICAgICAgICAgIFNhdmVwb2ludEZpZWxkTWFuYWdlciBmbTsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gc2F2ZWQuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgZm0gPSAoU2F2ZXBvaW50RmllbGRNYW5hZ2VyKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBzbSA9IGZtLmdldFN0YXRlTWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBzbS5yb2xsYmFja1RvU2F2ZXBvaW50KGZtKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkVHJhbnNDYWNoZS5yZW1vdmUoc20pOworICAgICAgICAgICAgICAgICAgICBpZiAoc20uaXNEaXJ0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHJhbnNDYWNoZS5hZGREaXJ0eShzbSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RyYW5zQ2FjaGUuYWRkQ2xlYW4oc20pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9sZFRyYW5zQ2FjaGUuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgc20gPSAoU3RhdGVNYW5hZ2VySW1wbCkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc20ucm9sbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRnJvbVRyYW5zYWN0aW9uKHNtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2xkVHJhbnNDYWNoZS5jbGVhcigpOworICAgICAgICAgICAgICAgIF90cmFuc0NhY2hlID0gbmV3VHJhbnNDYWNoZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcmV0dXJuIHNpbGVudGx5IGlmIG5vIHRyYW5zIGlzIGFjdGl2ZSwgb3IgaWYgdGhpcyBpcyBhIHJlZW50cmFudAorICAgICAgICAgICAgLy8gY2FsbCwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgc3RvcmUgbWFuYWdlciB0cmllcyB0byBnZXQgYW4KKyAgICAgICAgICAgIC8vIGF1dG8taW5jIG9pZCBkdXJpbmcgZmx1c2gKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpID09IDAKKyAgICAgICAgICAgICAgICB8fCAoX2ZsYWdzICYgRkxBR19TVE9SRV9GTFVTSElORykgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcnVudGltZSBzdXBwb3J0cyBpdAorICAgICAgICAgICAgaWYgKCFfY29uZi5zdXBwb3J0ZWRPcHRpb25zKCkuY29udGFpbnMoX2NvbmYuT1BUSU9OX0lOQ19GTFVTSCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgiaW5jcmVtZW50YWwtZmx1c2gtbm90LXN1cHBvcnRlZCIpKTsKKyAgICAgICAgICAgIGlmIChfc2F2ZXBvaW50cyAhPSBudWxsICYmICFfc2F2ZXBvaW50cy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiAhX3NwbS5zdXBwb3J0c0luY3JlbWVudGFsRmx1c2goKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgKCJzYXZlcG9pbnQtZmx1c2gtbm90LXN1cHBvcnRlZCIpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmbHVzaFNhZmUoRkxVU0hfSU5DKTsKKyAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19GTFVTSEVEOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgIC8vIHJvbGxiYWNrIG9uIGZsdXNoIGVycm9yOyBvYmplY3RzIG1heSBiZSBpbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgICAgICAgICBzZXRSb2xsYmFja09ubHkoa2UpOworICAgICAgICAgICAgICAgIHRocm93IGtlLnNldEZhdGFsKHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIC8vIHJvbGxiYWNrIG9uIGZsdXNoIGVycm9yOyBvYmplY3RzIG1heSBiZSBpbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgICAgICAgICBzZXRSb2xsYmFja09ubHkocmUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihyZSkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZUZsdXNoKCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpICE9IDApCisgICAgICAgICAgICAgICAgZmx1c2hTYWZlKEZMVVNIX0xPR0lDQUwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNoYW5nZXMoKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaWYgbm8gdHJhbnMsIGp1c3QgcmV0dXJuOyBpZiBhY3RpdmUgZGF0YXN0b3JlIHRyYW5zLCBmbHVzaAorICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkVfQUNUSVZFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcnVudGltZSBzdXBwb3J0cyBpbmMgZmx1c2gKKyAgICAgICAgICAgIGlmICghX2NvbmYuc3VwcG9ydGVkT3B0aW9ucygpLmNvbnRhaW5zKF9jb25mLk9QVElPTl9JTkNfRkxVU0gpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAoImluY3JlbWVudGFsLWZsdXNoLW5vdC1zdXBwb3J0ZWQiKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmx1c2hTYWZlKEZMVVNIX1JPTExCQUNLKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24ocmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfQUNUSVZFKSAhPSAwOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0b3JlQWN0aXZlKCkgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIGxvY2sgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mIGFuCisgICAgICAgIC8vIGF0b21pYyB0cmFuc2FjdGlvbiBwcm9jZXNzIChlLmcuLCBjb21taXRBbmRSZXN1bWUpCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX1NUT1JFX0FDVElWRSkgIT0gMDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgZW5kaW5nLCBpLmUuIGluIHRoZSAybmQgcGhhc2UKKyAgICAgKiBvZiBhIGNvbW1pdCBvciByb2xsYmFjaworICAgICAqLworICAgIGJvb2xlYW4gaXNUcmFuc2FjdGlvbkVuZGluZygpIHsKKyAgICAgICAgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX1RSQU5TX0VORElORykgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiZWdpbk9wZXJhdGlvbihib29sZWFuIHN5bmNUcmFucykgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisKKyAgICAgICAgICAgIGlmIChzeW5jVHJhbnMgJiYgX29wZXJhdGlvbkNvdW50ID09IDAgJiYgX3N5bmNNYW5hZ2VkCisgICAgICAgICAgICAgICAgJiYgKF9mbGFncyAmIEZMQUdfQUNUSVZFKSA9PSAwKQorICAgICAgICAgICAgICAgIHN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gX29wZXJhdGlvbkNvdW50KysgPT0gMTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBvcGVyYXRpb24gb3Zlci4gSWYgb3V0ZXJtb3N0IGNhbGxlciBvZiBzdGFjaywgcmV0dXJucyB0cnVlCisgICAgICogYW5kIHdpbGwgZGV0YWNoIG1hbmFnZWQgaW5zdGFuY2VzIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmRPcGVyYXRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX29wZXJhdGlvbkNvdW50ID09IDEgJiYgKF9hdXRvRGV0YWNoICYgREVUQUNIX05PTlRYUkVBRCkgIT0gMAorICAgICAgICAgICAgICAgICYmIChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRldGFjaEFsbEludGVybmFsKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9vcGVyYXRpb25Db3VudCA8IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gX29wZXJhdGlvbkNvdW50ID09IDE7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfb3BlcmF0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChfb3BlcmF0aW9uQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBfb3BlcmF0aW5nLmNsZWFyKCk7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTeW5jaHJvbml6YXRpb24gZ2V0U3luY2hyb25pemF0aW9uKCkgeworICAgICAgICByZXR1cm4gX3N5bmM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3luY2hyb25pemF0aW9uKFN5bmNocm9uaXphdGlvbiBzeW5jKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgX3N5bmMgPSBzeW5jOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgU3luY2hyb25pemF0aW9uIGludGVyZmFjZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVDb21wbGV0aW9uKCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2VyLXN1cHBsaWVkIHN5bmNocm9uaXphdGlvbgorICAgICAgICAgICAgaWYgKF9zeW5jICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3N5bmMuYmVmb3JlQ29tcGxldGlvbigpOworCisgICAgICAgICAgICBmbHVzaFNhZmUoRkxVU0hfQ09NTUlUKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmQtdHJhbnMtZXJyb3IiKSwga2UpOworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlTWFuYWdlZENvbXBsZXRpb25FeGNlcHRpb24oa2UpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImVuZC10cmFucy1lcnJvciIpLCByZSk7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGVNYW5hZ2VkQ29tcGxldGlvbkV4Y2VwdGlvbihuZXcgU3RvcmVFeGNlcHRpb24ocmUpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21wbGV0aW9uKGludCBzdGF0dXMpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0QWN0aXZlVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVFJBTlNfRU5ESU5HOworICAgICAgICAgICAgZW5kVHJhbnNhY3Rpb24oc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChfc3luYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zeW5jLmFmdGVyQ29tcGxldGlvbihzdGF0dXMpOworCisgICAgICAgICAgICBpZiAoKF9hdXRvRGV0YWNoICYgREVUQUNIX0NPTU1JVCkgIT0gMCkKKyAgICAgICAgICAgICAgICBkZXRhY2hBbGxJbnRlcm5hbChudWxsKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBTdGF0dXMuU1RBVFVTX1JPTExFREJBQ0sgCisgICAgICAgICAgICAgICAgJiYgKF9hdXRvRGV0YWNoICYgREVUQUNIX1JPTExCQUNLKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGV0YWNoQWxsSW50ZXJuYWwobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluIGFuIGVlIGNvbnRleHQsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdXNlciB0cmllZCB0byBjbG9zZQorICAgICAgICAgICAgLy8gdXMgYnV0IHdlIGRpZG4ndCBhY3R1YWxseSBjbG9zZSBiZWNhdXNlIHdlIHdlcmUgd2FpdGluZyBvbiB0aGlzCisgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbjsgaWYgdGhhdCdzIHRydWUsIHRoZW4gY2xvc2Ugbm93CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQ0xPU0VfSU5WT0tFRCkgIT0gMAorICAgICAgICAgICAgICAgICYmIF9jb21wYXQuZ2V0Q2xvc2VPbk1hbmFnZWRDb21taXQoKSkKKyAgICAgICAgICAgICAgICBmcmVlKCk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiZW5kLXRyYW5zLWVycm9yIiksIGtlKTsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZU1hbmFnZWRDb21wbGV0aW9uRXhjZXB0aW9uKGtlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmQtdHJhbnMtZXJyb3IiKSwgcmUpOworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlTWFuYWdlZENvbXBsZXRpb25FeGNlcHRpb24obmV3IFN0b3JlRXhjZXB0aW9uKHJlKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfQUNUSVZFOworICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0ZMVVNIRUQ7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfVFJBTlNfRU5ESU5HOworCisgICAgICAgICAgICAvLyBldmVudCBtYW5hZ2VyIG51bGxlZCBpZiBmcmVlZCBicm9rZXIKKyAgICAgICAgICAgIGlmIChfdHJhbnNFdmVudE1hbmFnZXIgIT0gbnVsbCAKKyAgICAgICAgICAgICAgICAmJiBfdHJhbnNFdmVudE1hbmFnZXIuaGFzRW5kTGlzdGVuZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBmaXJlVHJhbnNhY3Rpb25FdmVudChuZXcgVHJhbnNhY3Rpb25FdmVudCh0aGlzLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gU3RhdHVzLlNUQVRVU19DT01NSVRURUQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gVHJhbnNhY3Rpb25FdmVudC5BRlRFUl9DT01NSVRfQ09NUExFVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIDogVHJhbnNhY3Rpb25FdmVudC5BRlRFUl9ST0xMQkFDS19DT01QTEVURSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHdlJ3JlIGluIGEgbWFuYWdlZCB0cmFuc2FjdGlvbiwgdXNlIG91ciBpbXBsaWNpdCBiZWhhdmlvciBleGNlcHRpb24KKyAgICAgKiB0cmFuc2xhdG9yIHRvIHRyYW5zbGF0ZSBiZWZvcmUvYWZ0ZXJDb21wbGV0aW9uIGNhbGxiYWNrIGVycm9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bnRpbWVFeGNlcHRpb24gdHJhbnNsYXRlTWFuYWdlZENvbXBsZXRpb25FeGNlcHRpb24KKyAgICAgICAgKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgcmV0dXJuICghX21hbmFnZWQgfHwgX2V4dHJhbnMgPT0gbnVsbCkgPyByZSA6IF9leHRyYW5zLnRyYW5zbGF0ZShyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggc2FmZWx5LCBjYXRjaGluZyByZWVudHJhbnQgY2FsbHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZsdXNoU2FmZShpbnQgcmVhc29uKSB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19GTFVTSElORykgIT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoInJlZW50cmFudC1mbHVzaCIpKTsKKworICAgICAgICBfZmxhZ3MgfD0gRkxBR19GTFVTSElORzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsdXNoKHJlYXNvbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfRkxVU0hJTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgdHJhbnNhY3Rpb25hbCBzdGF0ZSB0byB0aGUgZGF0YSBzdG9yZS4gU3ViY2xhc3NlcyB0aGF0CisgICAgICogY3VzdG9taXplIGNvbW1pdCBiZWhhdmlvciBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIFRoZSBtZXRob2QKKyAgICAgKiBhc3N1bWVzIHRoYXQgdGhlIHBlcnNpc3RlbmNlIG1hbmFnZXIgaXMgbG9ja2VkLCBpcyBub3QgY2xvc2VkLAorICAgICAqIGFuZCBoYXMgYW4gYWN0aXZlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYXNvbiBvbmUgb2Yge0BsaW5rICNGTFVTSF9JTkN9LCB7QGxpbmsgI0ZMVVNIX0NPTU1JVH0sCisgICAgICoge0BsaW5rICNGTFVTSF9ST0xMQkFDS30sIG9yIHtAbGluayAjRkxVU0hfTE9HSUNBTH0KKyAgICAgKiBAc2luY2UgMC4yLjUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmbHVzaChpbnQgcmVhc29uKSB7CisgICAgICAgIC8vIHRoaXMgd2lsbCBlbmxpc3QgcHJveGllZCBzdGF0ZXMgYXMgbmVjZXNzYXJ5IHNvIHdlIGtub3cgd2hldGhlciB3ZQorICAgICAgICAvLyBoYXZlIGFueXRoaW5nIHRvIGZsdXNoCisgICAgICAgIENvbGxlY3Rpb24gdHJhbnNhY3Rpb25hbCA9IGdldFRyYW5zYWN0aW9uYWxTdGF0ZXMoKTsKKworICAgICAgICAvLyBkbyB3ZSBhY3R1YWxseSBoYXZlIHRvIGZsdXNoPyAgb25seSBpZiBvdXIgZmxhZ3Mgc2F5IHNvLCBvciBpZgorICAgICAgICAvLyB3ZSBoYXZlIHRyYW5zYWN0aW9uIGxpc3RlbmVycyB0aGF0IG5lZWQgdG8gYmUgaW52b2tlZCBmb3IgY29tbWl0CisgICAgICAgIC8vIChubyBuZWVkIHRvIGludm9rZSB0aGVtIG9uIGluYyBmbHVzaCBpZiBub3RoaW5nIGlzIGRpcnR5KS4gIHdlCisgICAgICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgcmVtb3RlIGNvbW1pdCBsaXN0ZW5lciB1c2VkIGJ5IHRoZSBkYXRhY2FjaGUgY2F1c2UKKyAgICAgICAgLy8gd2Uga25vdyBpdCBkb2Vzbid0IHJlcXVpcmUgdGhlIGNvbW1pdCBldmVudCB3aGVuIG5vdGhpbmcgY2hhbmdlcworICAgICAgICBib29sZWFuIGZsdXNoID0gKF9mbGFncyAmIEZMQUdfRkxVU0hfUkVRVUlSRUQpICE9IDA7CisgICAgICAgIGJvb2xlYW4gbGlzdGVuZXJzID0gKF90cmFuc0V2ZW50TWFuYWdlci5oYXNGbHVzaExpc3RlbmVycygpCisgICAgICAgICAgICB8fCBfdHJhbnNFdmVudE1hbmFnZXIuaGFzRW5kTGlzdGVuZXJzKCkpCisgICAgICAgICAgICAmJiAoKF9mbGFncyAmIEZMQUdfUkVNT1RFX0xJU1RFTkVSKSA9PSAwCisgICAgICAgICAgICB8fCBfdHJhbnNFdmVudE1hbmFnZXIuZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpID4gMSk7CisgICAgICAgIGlmICghZmx1c2ggJiYgKHJlYXNvbiAhPSBGTFVTSF9DT01NSVQgfHwgIWxpc3RlbmVycykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ29sbGVjdGlvbiBtb2JqcyA9IG51bGw7CisgICAgICAgIF9mbGFncyB8PSBGTEFHX1BSRVNUT1JJTkc7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgICAgICAgICAvLyBjYWxsIHByZSBzdG9yZSBvbiBhbGwgY3VycmVudGx5IHRyYW5zYWN0aW9uYWwgb2JqcworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdHJhbnNhY3Rpb25hbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAgICAgKChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpKS5iZWZvcmVGbHVzaChyZWFzb24sIF9jYWxsKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFkZGl0aW9ucyh0cmFuc2FjdGlvbmFsLCByZWFzb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBob3BlZnVsbHkgbm93IGFsbCBkZXBlbmRlbnQgaW5zdGFuY2VzIHRoYXQgYXJlIGdvaW5nIHRvIGVuZAorICAgICAgICAgICAgLy8gdXAgcmVmZXJlbmNlZCBoYXZlIGJlZW4gbWFya2VkIGFzIHN1Y2g7IGRlbGV0ZSB1bnJlZmVkCisgICAgICAgICAgICAvLyBkZXBlbmRlbnRzCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19ERVJFRkRFTEVUSU5HOworICAgICAgICAgICAgaWYgKGZsdXNoICYmIF9kZXJlZkNhY2hlICE9IG51bGwgJiYgIV9kZXJlZkNhY2hlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2RlcmVmQ2FjaGUuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZURlcmVmKChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFkZGl0aW9ucyh0cmFuc2FjdGlvbmFsLCByZWFzb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVhc29uICE9IEZMVVNIX0xPR0lDQUwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBubyBkYXRhc3RvcmUgdHJhbnNhY3Rpb24sIHN0YXJ0IG9uZTsgZXZlbiBpZiB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIHRoaW5rIHdlJ2xsIG5lZWQgdG8gZmx1c2ggYXQgdGhpcyBwb2ludCwgb3VyIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgLy8gbGlzdGVuZXJzIG1pZ2h0IGludHJvZHVjZSBzb21lIGRpcnR5IG9iamVjdHMgb3IgaW50ZXJhY3QKKyAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSB3aXRoIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRV9BQ1RJVkUpID09IDApCisgICAgICAgICAgICAgICAgICAgIGJlZ2luU3RvcmVNYW5hZ2VyVHJhbnNhY3Rpb24oZmFsc2UpOworCisgICAgICAgICAgICAgICAgaWYgKChfdHJhbnNFdmVudE1hbmFnZXIuaGFzRmx1c2hMaXN0ZW5lcnMoKQorICAgICAgICAgICAgICAgICAgICB8fCBfdHJhbnNFdmVudE1hbmFnZXIuaGFzRW5kTGlzdGVuZXJzKCkpCisgICAgICAgICAgICAgICAgICAgICYmIChmbHVzaCB8fCByZWFzb24gPT0gRkxVU0hfQ09NTUlUKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGV2ZW50cworICAgICAgICAgICAgICAgICAgICBtb2JqcyA9IG5ldyBNYW5hZ2VkT2JqZWN0Q29sbGVjdGlvbih0cmFuc2FjdGlvbmFsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBGTFVTSF9DT01NSVQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIF90cmFuc0V2ZW50TWFuYWdlci5oYXNFbmRMaXN0ZW5lcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZVRyYW5zYWN0aW9uRXZlbnQobmV3IFRyYW5zYWN0aW9uRXZlbnQodGhpcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25FdmVudC5CRUZPUkVfQ09NTUlULCBtb2JqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGVyc2lzdGVkQ2xzcywgX3VwZGF0ZWRDbHNzLCBfZGVsZXRlZENsc3MpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBZGRpdGlvbnModHJhbnNhY3Rpb25hbCwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoID0gKF9mbGFncyAmIEZMQUdfRkxVU0hfUkVRVUlSRUQpICE9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2ggJiYgX3RyYW5zRXZlbnRNYW5hZ2VyLmhhc0ZsdXNoTGlzdGVuZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVUcmFuc2FjdGlvbkV2ZW50KG5ldyBUcmFuc2FjdGlvbkV2ZW50KHRoaXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uRXZlbnQuQkVGT1JFX0ZMVVNILCBtb2JqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGVyc2lzdGVkQ2xzcywgX3VwZGF0ZWRDbHNzLCBfZGVsZXRlZENsc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQWRkaXRpb25zKHRyYW5zYWN0aW9uYWwsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfUFJFU1RPUklORzsKKyAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19ERVJFRkRFTEVUSU5HOworICAgICAgICAgICAgX3RyYW5zQWRkaXRpb25zID0gbnVsbDsKKyAgICAgICAgICAgIF9kZXJlZkFkZGl0aW9ucyA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIGFsc28gY2xlYXIgZGVyZWZlZCBzZXQ7IHRoZSBkZWxldGVzIGhhdmUgYmVlbiByZWNvcmRlZAorICAgICAgICAgICAgaWYgKF9kZXJlZkNhY2hlICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2RlcmVmQ2FjaGUuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZsdXNoIHRvIHN0b3JlIG1hbmFnZXIKKyAgICAgICAgTGlzdCBleGNlcHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZsdXNoICYmIHJlYXNvbiAhPSBGTFVTSF9MT0dJQ0FMKSB7CisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfU1RPUkVfRkxVU0hJTkc7CisgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywKKyAgICAgICAgICAgICAgICAgICAgbmV3Rmx1c2hFeGNlcHRpb24oX3N0b3JlLmZsdXNoKHRyYW5zYWN0aW9uYWwpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfU1RPUkVfRkxVU0hJTkc7CisKKyAgICAgICAgICAgIGlmIChyZWFzb24gPT0gRkxVU0hfUk9MTEJBQ0spCisgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgZW5kU3RvcmVNYW5hZ2VyVHJhbnNhY3Rpb24odHJ1ZSkpOworICAgICAgICAgICAgZWxzZSBpZiAocmVhc29uICE9IEZMVVNIX0xPR0lDQUwpCisgICAgICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0ZMVVNIX1JFUVVJUkVEOworCisgICAgICAgICAgICAvLyBtYXJrIHN0YXRlcyBhcyBmbHVzaGVkCisgICAgICAgICAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdHJhbnNhY3Rpb25hbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIG1heSBoYXZlIGJlY29tZSB0cmFuc2llbnQsIHN1Y2ggYXMgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGVtYmVkZGVkIGFuZCB0aGUgb3duZXIgaGFzIGJlZW4gZGVsZXRlZCBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZmx1c2ggcHJvY2VzczsgYnVnICMxMTAwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuVFJBTlNJRU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5hZnRlckZsdXNoKHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhc29uID09IEZMVVNIX0lOQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBhYm91dCB0byBjbGVhciB0cmFucyBjYWNoZSBmb3IgY29tbWl0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXdheSwgcmUtY2FjaGUgZGlydHkgb2JqZWN0cyB3aXRoIGRlZmF1bHQgc29mdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnM7IHdlIGRvbid0IG5lZWQgaGFyZCByZWZzIG5vdyB0aGF0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGhhdmUgYmVlbiBmbHVzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20ucHJveHlGaWVsZHModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90cmFuc0NhY2hlLmZsdXNoZWQoc20pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aHJvdyBhbnkgZXhjZXB0aW9ucyB0byBzaG9ydGN1dCBsaXN0ZW5lcnMgb24gZmFpbAorICAgICAgICB0aHJvd05lc3RlZEV4Y2VwdGlvbnMoZXhjZXBzLCB0cnVlKTsKKworICAgICAgICBpZiAoZmx1c2ggJiYgcmVhc29uICE9IEZMVVNIX1JPTExCQUNLICYmIHJlYXNvbiAhPSBGTFVTSF9MT0dJQ0FMCisgICAgICAgICAgICAmJiBfdHJhbnNFdmVudE1hbmFnZXIuaGFzRmx1c2hMaXN0ZW5lcnMoKSkgeworICAgICAgICAgICAgZmlyZVRyYW5zYWN0aW9uRXZlbnQobmV3IFRyYW5zYWN0aW9uRXZlbnQodGhpcywKKyAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkV2ZW50LkFGVEVSX0ZMVVNILCBtb2JqcywgX3BlcnNpc3RlZENsc3MsCisgICAgICAgICAgICAgICAgX3VwZGF0ZWRDbHNzLCBfZGVsZXRlZENsc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIG5ld2x5LXRyYW5zYWN0aW9uYWwgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmx1c2hBZGRpdGlvbnMoQ29sbGVjdGlvbiB0cmFuc2FjdGlvbmFsLCBpbnQgcmVhc29uKSB7CisgICAgICAgIGJvb2xlYW4gbG9vcDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLy8gZmx1c2ggbmV3IHRyYW5zYWN0aW9uYWwgaW5zdGFuY2VzOyBub3RlIGxvZ2ljYWwgb3IKKyAgICAgICAgICAgIGxvb3AgPSBmbHVzaFRyYW5zQWRkaXRpb25zKHRyYW5zYWN0aW9uYWwsIHJlYXNvbikKKyAgICAgICAgICAgICAgICB8IGRlbGV0ZURlcmVmQWRkaXRpb25zKF9kZXJlZkNhY2hlKTsKKyAgICAgICAgfSB3aGlsZSAobG9vcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdHJhbnNhY3Rpb25hbCBhZGRpdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZsdXNoVHJhbnNBZGRpdGlvbnMoQ29sbGVjdGlvbiB0cmFuc2FjdGlvbmFsLCBpbnQgcmVhc29uKSB7CisgICAgICAgIGlmIChfdHJhbnNBZGRpdGlvbnMgPT0gbnVsbCB8fCBfdHJhbnNBZGRpdGlvbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIGtlZXAgbG9jYWwgdHJhbnNhY3Rpb25hbCBsaXN0IGNvcHkgdXAgdG8gZGF0ZQorICAgICAgICB0cmFuc2FjdGlvbmFsLmFkZEFsbChfdHJhbnNBZGRpdGlvbnMpOworCisgICAgICAgIC8vIGNvcHkgdGhlIGNoYW5nZSBzZXQsIHRoZW4gY2xlYXIgaXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsW10gc3RhdGVzID0gKFN0YXRlTWFuYWdlckltcGxbXSkgX3RyYW5zQWRkaXRpb25zLgorICAgICAgICAgICAgdG9BcnJheShuZXcgU3RhdGVNYW5hZ2VySW1wbFtfdHJhbnNBZGRpdGlvbnMuc2l6ZSgpXSk7CisgICAgICAgIF90cmFuc0FkZGl0aW9ucy5jbGVhcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc3RhdGVzW2ldLmJlZm9yZUZsdXNoKHJlYXNvbiwgX2NhbGwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgbmV3IGRlcmVmZXJlbmNlZCBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVEZXJlZkFkZGl0aW9ucyhDb2xsZWN0aW9uIGRlcmVmcykgeworICAgICAgICBpZiAoX2RlcmVmQWRkaXRpb25zID09IG51bGwgfHwgX2RlcmVmQWRkaXRpb25zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyByZW1lbWJlciB0aGVzZSBhZGRpdGlvbnMgaW4gY2FzZSBvbmUgYmVjb21lcyBkZXJlZmVkIGFnYWluIGxhdGVyCisgICAgICAgIGRlcmVmcy5hZGRBbGwoX2RlcmVmQWRkaXRpb25zKTsKKworICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsW10gc3RhdGVzID0gKFN0YXRlTWFuYWdlckltcGxbXSkgX2RlcmVmQWRkaXRpb25zLgorICAgICAgICAgICAgdG9BcnJheShuZXcgU3RhdGVNYW5hZ2VySW1wbFtfZGVyZWZBZGRpdGlvbnMuc2l6ZSgpXSk7CisgICAgICAgIF9kZXJlZkFkZGl0aW9ucy5jbGVhcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZGVsZXRlRGVyZWYoc3RhdGVzW2ldKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgZGVyZWZlcmVuY2VkIGRlcGVuZGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGVyZWYoU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICBpbnQgYWN0aW9uID0gcHJvY2Vzc0FyZ3VtZW50KE9wQ2FsbGJhY2tzLk9QX0RFTEVURSwKKyAgICAgICAgICAgIHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpLCBzbSwgbnVsbCk7CisgICAgICAgIGlmICgoYWN0aW9uICYgT3BDYWxsYmFja3MuQUNUX1JVTikgIT0gMCkKKyAgICAgICAgICAgIHNtLmRlbGV0ZSgpOworICAgICAgICBpZiAoKGFjdGlvbiAmIE9wQ2FsbGJhY2tzLkFDVF9DQVNDQURFKSAhPSAwKQorICAgICAgICAgICAgc20uY2FzY2FkZURlbGV0ZShfY2FsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBhY3Rpb24gdG8gdGFrZSBiYXNlZCBvbiB0aGUgdXNlcidzIGdpdmVuIGNhbGxiYWNrcyBhbmQKKyAgICAgKiBvdXIgaW1wbGljaXQgYmVoYXZpb3IuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcHJvY2Vzc0FyZ3VtZW50KGludCBvcCwgT2JqZWN0IG9iaiwgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAoY2FsbCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNhbGwucHJvY2Vzc0FyZ3VtZW50KG9wLCBvYmosIHNtKTsKKyAgICAgICAgaWYgKF9jYWxsICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2NhbGwucHJvY2Vzc0FyZ3VtZW50KG9wLCBvYmosIHNtKTsKKyAgICAgICAgcmV0dXJuIE9wQ2FsbGJhY2tzLkFDVF9SVU4gfCBPcENhbGxiYWNrcy5BQ1RfQ0FTQ0FERTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyB0aGUgcHJvcGVyIGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2V0IG9mIGZsdXNoIGVycm9ycywgb3IKKyAgICAgKiBkbyBub3RoaW5nIGlmIG5vIGVycm9ycyBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9wZW5KUEFFeGNlcHRpb24gbmV3Rmx1c2hFeGNlcHRpb24oQ29sbGVjdGlvbiBleGNlcHMpIHsKKyAgICAgICAgaWYgKGV4Y2VwcyA9PSBudWxsIHx8IGV4Y2Vwcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBUaHJvd2FibGVbXSB0ID0gKFRocm93YWJsZVtdKSBleGNlcHMudG9BcnJheQorICAgICAgICAgICAgKG5ldyBUaHJvd2FibGVbZXhjZXBzLnNpemUoKV0pOworICAgICAgICBMaXN0IGZhaWxlZCA9IG5ldyBBcnJheUxpc3QodC5sZW5ndGgpOworCisgICAgICAgIC8vIGNyZWF0ZSBmYXRhbCBleGNlcHRpb24gd2l0aCBuZXN0ZWQgZXhjZXB0aW9ucyBmb3IgYWxsIHRoZSBmYWlsZWQKKyAgICAgICAgLy8gb2JqZWN0czsgaWYgYWxsIE9MIGV4Y2VwdGlvbnMsIHRocm93IGEgdG9wLWxldmVsIE9MIGV4Y2VwdGlvbgorICAgICAgICBib29sZWFuIG9wdCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBvcHQgJiYgaSA8IHQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG9wdCA9IHRbaV0gaW5zdGFuY2VvZiBPcHRpbWlzdGljRXhjZXB0aW9uOworICAgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgICAgIE9iamVjdCBmID0gKChPcHRpbWlzdGljRXhjZXB0aW9uKSB0W2ldKS5nZXRGYWlsZWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvcHQgJiYgIWZhaWxlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IE9wdGltaXN0aWNFeGNlcHRpb24oZmFpbGVkLCB0KTsKKyAgICAgICAgaWYgKG9wdCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgT3B0aW1pc3RpY0V4Y2VwdGlvbih0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdG9yZUV4Y2VwdGlvbihfbG9jLmdldCgicm9sbGVkLWJhY2siKSkuCisgICAgICAgICAgICBzZXROZXN0ZWRUaHJvd2FibGVzKHQpLnNldEZhdGFsKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgbWFraW5nIGFwcHJvcHJpYXRlIHN0YXRlIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGVuZFRyYW5zYWN0aW9uKGludCBzdGF0dXMpIHsKKyAgICAgICAgLy8gaWYgYSBkYXRhIHN0b3JlIHRyYW5zYWN0aW9uIHdhcyBpbiBwcm9ncmVzcywgZG8gdGhlCisgICAgICAgIC8vIGFwcHJvcHJpYXRlIHRyYW5zYWN0aW9uIGNoYW5nZQorICAgICAgICBib29sZWFuIHJvbGxiYWNrID0gc3RhdHVzICE9IFN0YXR1cy5TVEFUVVNfQ09NTUlUVEVEOworICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIGVuZFN0b3JlTWFuYWdlclRyYW5zYWN0aW9uKHJvbGxiYWNrKSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIHJlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdvIGJhY2sgdG8gZGVmYXVsdCBub25lIGxvY2sgbGV2ZWwKKyAgICAgICAgX2ZjLnNldFJlYWRMb2NrTGV2ZWwoTE9DS19OT05FKTsKKyAgICAgICAgX2ZjLnNldFdyaXRlTG9ja0xldmVsKExPQ0tfTk9ORSk7CisgICAgICAgIF9mYy5zZXRMb2NrVGltZW91dCgtMSk7CisKKyAgICAgICAgQ29sbGVjdGlvbiB0cmFuc1N0YXRlcyA9IF90cmFuc0NhY2hlOworICAgICAgICBpZiAodHJhbnNTdGF0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRyYW5zU3RhdGVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKworICAgICAgICAvLyBmaXJlIGFmdGVyIHJvbGxiYWNrL2NvbW1pdCBldmVudAorICAgICAgICBDb2xsZWN0aW9uIG1vYmpzID0gbnVsbDsKKyAgICAgICAgaWYgKF90cmFuc0V2ZW50TWFuYWdlci5oYXNFbmRMaXN0ZW5lcnMoKSkgeworICAgICAgICAgICAgbW9ianMgPSBuZXcgTWFuYWdlZE9iamVjdENvbGxlY3Rpb24odHJhbnNTdGF0ZXMpOworICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IChyb2xsYmFjaykgPyBUcmFuc2FjdGlvbkV2ZW50LkFGVEVSX1JPTExCQUNLCisgICAgICAgICAgICAgICAgOiBUcmFuc2FjdGlvbkV2ZW50LkFGVEVSX0NPTU1JVDsKKyAgICAgICAgICAgIGZpcmVUcmFuc2FjdGlvbkV2ZW50KG5ldyBUcmFuc2FjdGlvbkV2ZW50KHRoaXMsIGV2ZW50VHlwZSwgbW9ianMsIAorICAgICAgICAgICAgICAgIF9wZXJzaXN0ZWRDbHNzLCBfdXBkYXRlZENsc3MsIF9kZWxldGVkQ2xzcykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbnVsbCB0cmFuc2FjdGlvbmFsIGNhY2hlcyBub3cgc28gdGhhdCBhbGwgdGhlIHJlbW92ZUZyb21UcmFuc2FjdGlvbgorICAgICAgICAvLyBjYWxscyBhcyB3ZSB0cmFuc2l0aW9uIGVhY2ggb2JqZWN0IGRvbid0IGhhdmUgdG8gZG8gYW55IHdvcms7IGRvbid0CisgICAgICAgIC8vIGNsZWFyIHRyYW5zIGNhY2hlIG9iamVjdCBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdGhlIHRyYW5zU3RhdGVzCisgICAgICAgIC8vIHJlZmVyZW5jZSB0byBpdCBiZWxvdworICAgICAgICBfdHJhbnNDYWNoZSA9IG51bGw7CisgICAgICAgIGlmIChfcGVyc2lzdGVkQ2xzcyAhPSBudWxsKQorICAgICAgICAgICAgX3BlcnNpc3RlZENsc3MuY2xlYXIoKTsKKyAgICAgICAgaWYgKF91cGRhdGVkQ2xzcyAhPSBudWxsKQorICAgICAgICAgICAgX3VwZGF0ZWRDbHNzLmNsZWFyKCk7CisgICAgICAgIGlmIChfZGVsZXRlZENsc3MgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWxldGVkQ2xzcy5jbGVhcigpOworCisgICAgICAgIC8vIG5ldyBjYWNoZSB3b3VsZCBnZXQgY2xlYXJlZCBhbnl3YXkgZHVyaW5nIHRyYW5zaXRpb25zLCBidXQgZG9pbmcgc28KKyAgICAgICAgLy8gaW1tZWRpYXRlbHkgc2F2ZXMgdXMgc29tZSBsb29rdXBzCisgICAgICAgIF9jYWNoZS5jbGVhck5ldygpOworCisgICAgICAgIC8vIHRlbGwgYWxsIGRlcmVmZWQgaW5zdGFuY2VzIHRoZXkncmUgbm8gbG9uZ2VyIGRlcmVmZWQ7IHdlIGNhbid0CisgICAgICAgIC8vIHJlbHkgb24gcm9sbGJhY2sgYW5kIGNvbW1pdCBjYWxscyBiZWxvdyBjYXVzZSBzb21lIGluc3RhbmNlcyBtaWdodAorICAgICAgICAvLyBub3QgYmUgdHJhbnNhY3Rpb25hbAorICAgICAgICBpZiAoX2RlcmVmQ2FjaGUgIT0gbnVsbCAmJiAhX2RlcmVmQ2FjaGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9kZXJlZkNhY2hlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICgoU3RhdGVNYW5hZ2VySW1wbCkgaXRyLm5leHQoKSkuc2V0RGVyZWZlcmVuY2VkRGVwZW5kZW50CisgICAgICAgICAgICAgICAgICAgIChmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgX2RlcmVmQ2FjaGUuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBlZm9ybSBjb21taXQgb3Igcm9sbGJhY2sgc3RhdGUgdHJhbnNpdGlvbnMgb24gZWFjaCBpbnN0YW5jZQorICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHRyYW5zU3RhdGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocm9sbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBvYmplY3RzIHRoYXQgbWF5IGhhdmUgYmVlbiBkZXJlZmVkIHRoZW4gZmx1c2hlZAorICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIHRoZXJlZm9yZSBkZWxldGVkKSB0byB1bi1kZXJlZgorICAgICAgICAgICAgICAgICAgICBzbS5zZXREZXJlZmVyZW5jZWREZXBlbmRlbnQoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgc20ucm9sbGJhY2soKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc20uY29tbWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbm90aWZ5IHRoZSBsb2NrIG1hbmFnZXIgdG8gY2xlYW4gdXAgYW5kIHJlbGVhc2UgcmVtYWluaW5nIGxvY2tzCisgICAgICAgIF9sbS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgIC8vIGNsZWFyIG9sZCBzYXZlcG9pbnRzIGluIHJldmVyc2UKKyAgICAgICAgT3BlbkpQQVNhdmVwb2ludCBzYXZlOworICAgICAgICB3aGlsZSAoX3NhdmVwb2ludHMgIT0gbnVsbCAmJiBfc2F2ZXBvaW50cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBzYXZlID0KKyAgICAgICAgICAgICAgICAoT3BlbkpQQVNhdmVwb2ludCkgX3NhdmVwb2ludHMucmVtb3ZlKF9zYXZlcG9pbnRzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgc2F2ZS5yZWxlYXNlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBfc2F2ZXBvaW50cyA9IG51bGw7CisgICAgICAgIF9zYXZlcG9pbnRDYWNoZSA9IG51bGw7CisKKyAgICAgICAgLy8gZmlyZSBhZnRlciBzdGF0ZSBjaGFuZ2UgZXZlbnQKKyAgICAgICAgaWYgKF90cmFuc0V2ZW50TWFuYWdlci5oYXNFbmRMaXN0ZW5lcnMoKSkKKyAgICAgICAgICAgIGZpcmVUcmFuc2FjdGlvbkV2ZW50KG5ldyBUcmFuc2FjdGlvbkV2ZW50KHRoaXMsIFRyYW5zYWN0aW9uRXZlbnQuCisgICAgICAgICAgICAgICAgQUZURVJfU1RBVEVfVFJBTlNJVElPTlMsIG1vYmpzLCBudWxsLCBudWxsLCBudWxsKSk7CisKKyAgICAgICAgLy8gbm93IGNsZWFyIHRyYW5zIGNhY2hlOyBrZWVwIGNsZWFyZWQgdmVyc2lvbiByYXRoZXIgdGhhbgorICAgICAgICAvLyBudWxsIHRvIGF2b2lkIGhhdmluZyB0byByZS1jcmVhdGUgdGhlIHNldCBsYXRlcjsgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgaWYgKHRyYW5zU3RhdGVzICE9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsKKyAgICAgICAgICAgIF90cmFuc0NhY2hlID0gKFRyYW5zYWN0aW9uYWxDYWNoZSkgdHJhbnNTdGF0ZXM7CisgICAgICAgICAgICBfdHJhbnNDYWNoZS5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3dOZXN0ZWRFeGNlcHRpb25zKGV4Y2VwcywgdHJ1ZSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBPYmplY3QgbGlmZWN5Y2xlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIHBlcnNpc3QoT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBwZXJzaXN0KG9iaiwgbnVsbCwgdHJ1ZSwgY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgcGVyc2lzdChPYmplY3Qgb2JqLCBPYmplY3QgaWQsCisgICAgICAgIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgcmV0dXJuIHBlcnNpc3Qob2JqLCBpZCwgdHJ1ZSwgY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGVyc2lzdEFsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgcGVyc2lzdEFsbChvYmpzLCB0cnVlLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0IHRoZSBnaXZlbiBvYmplY3RzLiAgSW5kaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhbiBleHBsaWNpdCBwZXJzaXN0CisgICAgICogKFBORVcpIG9yIGEgcHJvdmlzb25hbCBwZXJzaXN0IChQTkVXUFJPVklTSU9OQUwpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBlcnNpc3RBbGwoQ29sbGVjdGlvbiBvYmpzLCBib29sZWFuIGV4cGxpY2l0LCAKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2Jqcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIExpc3QgZXhjZXBzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFdyaXRlT3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2Jqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3QoaXRyLm5leHQoKSwgZXhwbGljaXQsIGNhbGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVzZXJFeGNlcHRpb24gdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRocm93TmVzdGVkRXhjZXB0aW9ucyhleGNlcHMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBub3QgbnVsbCwgYWRkIGl0IHRvIHRoZSBnaXZlbiBsaXN0LAorICAgICAqIGNyZWF0aW5nIHRoZSBsaXN0IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgYWRkKExpc3QgbCwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICBpZiAobCA9PSBudWxsKQorICAgICAgICAgICAgbCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGwuYWRkKG8pOworICAgICAgICByZXR1cm4gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gd3JhcHBpbmcgdGhlIGdpdmVuIG5lc3RlZCBleGNlcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0aHJvd05lc3RlZEV4Y2VwdGlvbnMoTGlzdCBleGNlcHMsIGJvb2xlYW4gZGF0YXN0b3JlKSB7CisgICAgICAgIGlmIChleGNlcHMgPT0gbnVsbCB8fCBleGNlcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZGF0YXN0b3JlICYmIGV4Y2Vwcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBleGNlcHMuZ2V0KDApOworCisgICAgICAgIGJvb2xlYW4gZmF0YWwgPSBmYWxzZTsKKyAgICAgICAgVGhyb3dhYmxlW10gdCA9IChUaHJvd2FibGVbXSkgZXhjZXBzLnRvQXJyYXkKKyAgICAgICAgICAgIChuZXcgVGhyb3dhYmxlW2V4Y2Vwcy5zaXplKCldKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodFtpXSBpbnN0YW5jZW9mIE9wZW5KUEFFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAmJiAoKE9wZW5KUEFFeGNlcHRpb24pIHRbaV0pLmlzRmF0YWwoKSkKKyAgICAgICAgICAgICAgICBmYXRhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgT3BlbkpQQUV4Y2VwdGlvbiBlcnI7CisgICAgICAgIGlmIChkYXRhc3RvcmUpCisgICAgICAgICAgICBlcnIgPSBuZXcgU3RvcmVFeGNlcHRpb24oX2xvYy5nZXQoIm5lc3RlZC1leGNlcHMiKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuZXN0ZWQtZXhjZXBzIikpOworICAgICAgICB0aHJvdyBlcnIuc2V0TmVzdGVkVGhyb3dhYmxlcyh0KS5zZXRGYXRhbChmYXRhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyc2lzdCB0aGUgZ2l2ZW4gb2JqZWN0LiAgSW5kaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhbiBleHBsaWNpdCBwZXJzaXN0CisgICAgICogKFBORVcpIG9yIGEgcHJvdmlzb25hbCBwZXJzaXN0IChQTkVXUFJPVklTSU9OQUwpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGVyc2lzdChPYmplY3Qgb2JqLCBib29sZWFuIGV4cGxpY2l0LCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHBlcnNpc3Qob2JqLCBudWxsLCBleHBsaWNpdCwgY2FsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyc2lzdCB0aGUgZ2l2ZW4gb2JqZWN0LiAgSW5kaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhbiBleHBsaWNpdCBwZXJzaXN0CisgICAgICogKFBORVcpIG9yIGEgcHJvdmlzb25hbCBwZXJzaXN0IChQTkVXUFJPVklTSU9OQUwpLgorICAgICAqIFNlZSB7QGxpbmsgQnJva2VyfSBmb3IgZGV0YWlscyBvbiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBwZXJzaXN0KE9iamVjdCBvYmosIE9iamVjdCBpZCwgYm9vbGVhbiBleHBsaWNpdCwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFdyaXRlT3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIV9vcGVyYXRpbmcuYWRkKG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNtOworCisgICAgICAgICAgICBpbnQgYWN0aW9uID0gcHJvY2Vzc0FyZ3VtZW50KE9wQ2FsbGJhY2tzLk9QX1BFUlNJU1QsIG9iaiwgc20sIGNhbGwpOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBPcENhbGxiYWNrcy5BQ1RfTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc207CisKKyAgICAgICAgICAgIC8vIEFDVF9DQVNDQURFCisgICAgICAgICAgICBpZiAoKGFjdGlvbiAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc20uY2FzY2FkZVBlcnNpc3QoY2FsbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjYXNjYWRlVHJhbnNpZW50KE9wQ2FsbGJhY2tzLk9QX1BFUlNJU1QsIG9iaiwgY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwZXJzaXN0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBQ1RfUlVOCisgICAgICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGM7CisgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChzbS5pc0RldGFjaGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RFeGlzdHNFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICgicGVyc2lzdC1kZXRhY2hlZCIsIEV4Y2VwdGlvbnMudG9TdHJpbmcob2JqKSkpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KG9iaik7CisKKyAgICAgICAgICAgICAgICBpZiAoIXNtLmlzRW1iZWRkZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBzbS5wZXJzaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9jYWNoZS5wZXJzaXN0KHNtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhY3Rpb24gJiBPcENhbGxiYWNrcy5BQ1RfQ0FTQ0FERSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmNhc2NhZGVQZXJzaXN0KGNhbGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gYW4gZW1iZWRkZWQgZmllbGQ7IG5vdGlmeSB0aGUgb3duZXIgdGhhdCB0aGUgdmFsdWUgaGFzCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBieSBiZWNvbWluZyBpbmRlcGVuZGVudGx5IHBlcnNpc3RlbnQKKyAgICAgICAgICAgICAgICBzbS5nZXRPd25lcigpLmRpcnR5KHNtLmdldE93bmVyTWV0YURhdGEoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRNZXRhRGF0YSgpLmdldEluZGV4KCkpOworICAgICAgICAgICAgICAgIF9jYWNoZS5wZXJzaXN0KHNtKTsKKyAgICAgICAgICAgICAgICBwYyA9IHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYyA9IGFzc2VydFBlcnNpc3RlbmNlQ2FwYWJsZShvYmopOworICAgICAgICAgICAgICAgIGlmIChwYy5wY0lzRGV0YWNoZWQoKSA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RFeGlzdHNFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICgicGVyc2lzdC1kZXRhY2hlZCIsIEV4Y2VwdGlvbnMudG9TdHJpbmcob2JqKSkpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KG9iaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IF9jb25mLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEob2JqLmdldENsYXNzKCksIF9sb2FkZXIsIHRydWUpOworICAgICAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KG9iaiwgbnVsbCwgbWV0YSwgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX1BFUlNJU1QpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgaWQgZm9yIGluc3RhbmNlCisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtZXRhLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWV0YURhdGEuSURfQVBQTElDQVRJT04pCisgICAgICAgICAgICAgICAgICAgIGlkID0gQXBwbGljYXRpb25JZHMuY3JlYXRlKHBjLCBtZXRhKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhLmdldElkZW50aXR5VHlwZSgpID09IENsYXNzTWV0YURhdGEuSURfVU5LTk9XTikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm1ldGEtdW5rbm93bmlkIiwgbWV0YSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBTdGF0ZU1hbmFnZXJJZC5uZXdJbnN0YW5jZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGUgaW5zdGFuY2UgY2FjaGVkCisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIG90aGVyID0gZ2V0U3RhdGVNYW5hZ2VySW1wbEJ5SWQoaWQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmICFvdGhlci5pc0RlbGV0ZWQoKSAmJiAhb3RoZXIuaXNOZXcoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RXhpc3RzRXhjZXB0aW9uKF9sb2MuZ2V0KCJjYWNoZS1leGlzdHMiLAorICAgICAgICAgICAgICAgICAgICBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGlkKSkuc2V0RmFpbGVkT2JqZWN0KG9iaik7CisKKyAgICAgICAgICAgIC8vIGlmIGhhZCBlbWJlZGRlZCBzbSwgbnVsbCBpdAorICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpCisgICAgICAgICAgICAgICAgcGMucGNSZXBsYWNlU3RhdGVNYW5hZ2VyKG51bGwpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHNtCisgICAgICAgICAgICBzbSA9IG5ldyBTdGF0ZU1hbmFnZXJJbXBsKGlkLCBtZXRhLCB0aGlzKTsKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhwbGljaXQpCisgICAgICAgICAgICAgICAgICAgIHNtLmluaXRpYWxpemUocGMsIFBDU3RhdGUuUE5FVyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbS5pbml0aWFsaXplKHBjLCBQQ1N0YXRlLlBORVdQUk9WSVNJT05BTCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzbS5pbml0aWFsaXplKHBjLCBQQ1N0YXRlLlBOT05UUkFOU05FVyk7CisgICAgICAgICAgICBpZiAoKGFjdGlvbiAmIE9wQ2FsbGJhY2tzLkFDVF9DQVNDQURFKSAhPSAwKQorICAgICAgICAgICAgICAgIHNtLmNhc2NhZGVQZXJzaXN0KGNhbGwpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZW1wb3JhcmlseSBtYW5hZ2UgdGhlIGdpdmVuIGluc3RhbmNlIGluIG9yZGVyIHRvIGNhc2NhZGUgdGhlIGdpdmVuCisgICAgICogb3BlcmF0aW9uIHRocm91Z2ggaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhc2NhZGVUcmFuc2llbnQoaW50IG9wLCBPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsLAorICAgICAgICBTdHJpbmcgZXJyT3ApIHsKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjID0gYXNzZXJ0UGVyc2lzdGVuY2VDYXBhYmxlKG9iaik7CisKKyAgICAgICAgLy8gaWYgdXNpbmcgZGV0YWNoZWQgc3RhdGUgbWFuYWdlciwgZG9uJ3QgcmVwbGFjZQorICAgICAgICBpZiAocGMucGNHZXRTdGF0ZU1hbmFnZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3RGV0YWNoZWRFeGNlcHRpb24ob2JqLCBlcnJPcCk7CisKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gX2NvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgIGdldE1ldGFEYXRhKG9iai5nZXRDbGFzcygpLCBfbG9hZGVyLCB0cnVlKTsKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IG5ldyBTdGF0ZU1hbmFnZXJJbXBsKFN0YXRlTWFuYWdlcklkLgorICAgICAgICAgICAgbmV3SW5zdGFuY2UodGhpcyksIG1ldGEsIHRoaXMpOworICAgICAgICBzbS5pbml0aWFsaXplKHBjLCBQQ1N0YXRlLlRMT0FERUQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgIGNhc2UgT3BDYWxsYmFja3MuT1BfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICAgICAgc20uY2FzY2FkZVBlcnNpc3QoY2FsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT3BDYWxsYmFja3MuT1BfREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBzbS5jYXNjYWRlRGVsZXRlKGNhbGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9wQ2FsbGJhY2tzLk9QX1JFRlJFU0g6CisgICAgICAgICAgICAgICAgICAgIHNtLmdhdGhlckNhc2NhZGVSZWZyZXNoKGNhbGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2Yob3ApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNtLnJlbGVhc2UodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0V3JpdGVPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgTGlzdCBleGNlcHMgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2Jqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9iaiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZShvYmosIGdldFN0YXRlTWFuYWdlckltcGwob2JqLCB0cnVlKSwgY2FsbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVXNlckV4Y2VwdGlvbiB1ZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGQoZXhjZXBzLCB1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3dOZXN0ZWRFeGNlcHRpb25zKGV4Y2VwcywgZmFsc2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRXcml0ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgZGVsZXRlKG9iaiwgZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIHRydWUpLCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZGVsZXRlLgorICAgICAqLworICAgIHZvaWQgZGVsZXRlKE9iamVjdCBvYmosIFN0YXRlTWFuYWdlckltcGwgc20sIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKCFfb3BlcmF0aW5nLmFkZChvYmopKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGludCBhY3Rpb24gPSBwcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfREVMRVRFLCBvYmosIHNtLCBjYWxsKTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBPcENhbGxiYWNrcy5BQ1RfTk9ORSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBBQ1RfQ0FTQ0FERQorICAgICAgICBpZiAoKGFjdGlvbiAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApIHsKKyAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNtLmNhc2NhZGVEZWxldGUoY2FsbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FzY2FkZVRyYW5zaWVudChPcENhbGxiYWNrcy5PUF9ERUxFVEUsIG9iaiwgY2FsbCwgImRlbGV0ZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQUNUX1JVTgorICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNtLmlzRGV0YWNoZWQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXdEZXRhY2hlZEV4Y2VwdGlvbihvYmosICJkZWxldGUiKTsKKyAgICAgICAgICAgIGlmICgoYWN0aW9uICYgT3BDYWxsYmFja3MuQUNUX0NBU0NBREUpICE9IDApCisgICAgICAgICAgICAgICAgc20uY2FzY2FkZURlbGV0ZShjYWxsKTsKKyAgICAgICAgICAgIHNtLmRlbGV0ZSgpOworICAgICAgICB9IGVsc2UgaWYgKGFzc2VydFBlcnNpc3RlbmNlQ2FwYWJsZShvYmopLnBjSXNEZXRhY2hlZCgpID09IEJvb2xlYW4uVFJVRSkKKyAgICAgICAgICAgIHRocm93IG5ld0RldGFjaGVkRXhjZXB0aW9uKG9iaiwgImRlbGV0ZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgYWN0aW9uIGNhbid0IGJlCisgICAgICogcGVyZm9ybWVkIG9uIGEgZGV0YWNoZWQgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgT3BlbkpQQUV4Y2VwdGlvbiBuZXdEZXRhY2hlZEV4Y2VwdGlvbihPYmplY3Qgb2JqLAorICAgICAgICBTdHJpbmcgb3BlcmF0aW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZGV0YWNoZWQtb3AiLCBvcGVyYXRpb24sCisgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKG9iaikpKS5zZXRGYWlsZWRPYmplY3Qob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlKGl0ci5uZXh0KCksIGNhbGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVzZXJFeGNlcHRpb24gdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93TmVzdGVkRXhjZXB0aW9ucyhleGNlcHMsIGZhbHNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZShPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIHRydWUpOworICAgICAgICAgICAgaW50IGFjdGlvbiA9IHByb2Nlc3NBcmd1bWVudChPcENhbGxiYWNrcy5PUF9SRUxFQVNFLCBvYmosIHNtLCBjYWxsKTsKKworICAgICAgICAgICAgaWYgKHNtID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKChhY3Rpb24gJiBPcENhbGxiYWNrcy5BQ1RfUlVOKSAhPSAwICYmIHNtLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBwZW5kaW5nID0gc20uaXNQZW5kaW5nVHJhbnNhY3Rpb25hbCgpOworICAgICAgICAgICAgICAgIHNtLnJlbGVhc2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmcpCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUZyb21QZW5kaW5nVHJhbnNhY3Rpb24oc20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBlbWJlZChPYmplY3Qgb2JqLCBPYmplY3QgaWQsCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgb3duZXIsIFZhbHVlTWV0YURhdGEgb3duZXJNZXRhKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBvcmlnID0gZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIHRydWUpOworICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlmIGFscmVhZHkgZW1iZWRkZWQsIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICBpZiAob3JpZy5nZXRPd25lcigpID09IG93bmVyICYmIG9yaWcuZ2V0TWV0YURhdGEoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSA9PSBvd25lck1ldGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnOworCisgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIG1ha2Ugc3VyZSBwYyBpcyBmdWxseSBsb2FkZWQgZm9yIHdoZW4gd2UgY29weSBpdHMKKyAgICAgICAgICAgICAgICAvLyBkYXRhIGJlbG93CisgICAgICAgICAgICAgICAgb3JpZy5sb2FkKF9mYywgU3RhdGVNYW5hZ2VySW1wbC5MT0FEX0FMTCwgbnVsbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHN0YXRlIG1hbmFnZXIgd2l0aCBlbWJlZGRlZCBtZXRhZGF0YQorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gb3duZXJNZXRhLmdldEVtYmVkZGVkTWV0YURhdGEoKTsKKyAgICAgICAgICAgIGlmIChtZXRhID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZW1iZWQiLCBvd25lck1ldGEpKTsKKworICAgICAgICAgICAgaWYgKGlkID09IG51bGwpCisgICAgICAgICAgICAgICAgaWQgPSBTdGF0ZU1hbmFnZXJJZC5uZXdJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IG5ldyBTdGF0ZU1hbmFnZXJJbXBsKGlkLCBtZXRhLCB0aGlzKTsKKyAgICAgICAgICAgIHNtLnNldE93bmVyKChTdGF0ZU1hbmFnZXJJbXBsKSBvd25lciwgb3duZXJNZXRhKTsKKworICAgICAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIGNvcHk7CisgICAgICAgICAgICBQQ1N0YXRlIHN0YXRlOworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgICAgICB0eXBlID0gbWV0YS5nZXRJbnRlcmZhY2VJbXBsKCk7CisgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGNvcHkgYW5kIHRoZSBvcmlnaW5hbCBpbnN0YW5jZSB0aGUgc2FtZSBzdGF0ZSBtYW5hZ2VyCisgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gY29weSBmaWVsZHMgZnJvbSBvbmUgdG8gdGhlIG90aGVyCisgICAgICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBjb3B5U007CisgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjOworICAgICAgICAgICAgICAgIGlmIChvcmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weVNNID0gc207CisgICAgICAgICAgICAgICAgICAgIHBjID0gYXNzZXJ0UGVyc2lzdGVuY2VDYXBhYmxlKG9iaik7CisgICAgICAgICAgICAgICAgICAgIHBjLnBjUmVwbGFjZVN0YXRlTWFuYWdlcihzbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29weVNNID0gb3JpZzsKKyAgICAgICAgICAgICAgICAgICAgcGMgPSBvcmlnLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIGluc3RhbmNlLiAgd2UgZG8gdGhpcyBldmVuIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGEgc3RhdGUgbWFuYWdlciBpbiBjYXNlIGl0IGlzIGxhdGVyIGFzc2lnbmVkIHRvIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gUEMgZmllbGQ7IGF0IHRoYXQgcG9pbnQgaXQncyB0b28gbGF0ZSB0byBjb3B5CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBQQ1JlZ2lzdHJ5Lm5ld0luc3RhbmNlKHR5cGUsIGNvcHlTTSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpbnRbXSBmaWVsZHMgPSBuZXcgaW50W21ldGEuZ2V0RmllbGRzKCkubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbaV0gPSBpOworICAgICAgICAgICAgICAgICAgICBjb3B5LnBjQ29weUZpZWxkcyhwYywgZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBQQ1N0YXRlLkVDT1BZOworICAgICAgICAgICAgICAgICAgICBjb3B5LnBjUmVwbGFjZVN0YXRlTWFuYWdlcihudWxsKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaW5zdGFuY2UgZGlkbid0IGhhdmUgYSBzdGF0ZSBtYW5hZ2VyIHRvIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnQgaXQgdG8gYmVpbmcgdHJhbnNpZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwYy5wY1JlcGxhY2VTdGF0ZU1hbmFnZXIobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3B5ID0gUENSZWdpc3RyeS5uZXdJbnN0YW5jZSh0eXBlLCBzbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpICE9IDAgJiYgIV9vcHRpbWlzdGljKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFBDU3RhdGUuRUNMRUFOOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBQQ1N0YXRlLkVOT05UUkFOUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc20uaW5pdGlhbGl6ZShjb3B5LCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIG5vdCBhbHJlYWR5IGNhY2hlZCwgY3JlYXRlIGFuIGVtcHR5IGNvcHkgb2YgdGhlIGdpdmVuIHN0YXRlCisgICAgICogbWFuYWdlciBpbiB0aGUgZ2l2ZW4gc3RhdGUuCisgICAgICovCisgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBjb3B5KE9wZW5KUEFTdGF0ZU1hbmFnZXIgY29weSwgUENTdGF0ZSBzdGF0ZSkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIE9iamVjdCBvaWQgPSBjb3B5LmZldGNoT2JqZWN0SWQoKTsKKyAgICAgICAgICAgIENsYXNzIHR5cGUgPSBjb3B5LmdldE1hbmFnZWRJbnN0YW5jZSgpLmdldENsYXNzKCk7CisgICAgICAgICAgICBpZiAob2lkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBjYWNoZWQgaW5zdGFuY2U/CisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghY29weS5pc0VtYmVkZGVkKCkpCisgICAgICAgICAgICAgICAgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsQnlJZChvaWQsIHRydWUpOworICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MgPSBfY29uZi4KKyAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSByZXBvcy5nZXRNZXRhRGF0YSh0eXBlLCBfbG9hZGVyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgc3RhdGUgbWFuYWdlciB3aXRoIGFsbCBpbmZvIGtub3duCisgICAgICAgICAgICAgICAgc20gPSBuZXcgU3RhdGVNYW5hZ2VySW1wbChvaWQsIG1ldGEsIHRoaXMpOworICAgICAgICAgICAgICAgIHNtLnNldE9iamVjdElkKG9pZCk7CisgICAgICAgICAgICAgICAgc20uaW5pdGlhbGl6ZShzbS5nZXRNZXRhRGF0YSgpLmdldERlc2NyaWJlZFR5cGUoKSwgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoQWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2Jqcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROb250cmFuc2FjdGlvbmFsUmVhZCgpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgZ2F0aGVyQ2FzY2FkZVJlZnJlc2goaXRyLm5leHQoKSwgY2FsbCk7CisgICAgICAgICAgICBpZiAoX29wZXJhdGluZy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKF9vcGVyYXRpbmcuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgcmVmcmVzaEludGVybmFsKF9vcGVyYXRpbmcuaXRlcmF0b3IoKS5uZXh0KCksIGNhbGwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlZnJlc2hJbnRlcm5hbChfb3BlcmF0aW5nLCBjYWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE5vbnRyYW5zYWN0aW9uYWxSZWFkKCk7CisKKyAgICAgICAgICAgIGdhdGhlckNhc2NhZGVSZWZyZXNoKG9iaiwgY2FsbCk7CisgICAgICAgICAgICBpZiAoX29wZXJhdGluZy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKF9vcGVyYXRpbmcuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgcmVmcmVzaEludGVybmFsKF9vcGVyYXRpbmcuaXRlcmF0b3IoKS5uZXh0KCksIGNhbGwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlZnJlc2hJbnRlcm5hbChfb3BlcmF0aW5nLCBjYWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2F0aGVycyBhbGwgb2JqZWN0cyByZWFjaGFibGUgdGhyb3VnaCBjYXNjYWRlLXJlZnJlc2ggcmVsYXRpb25zCisgICAgICogaW50byB0aGUgb3BlcmF0aW5nIHNldC4KKyAgICAgKi8KKyAgICB2b2lkIGdhdGhlckNhc2NhZGVSZWZyZXNoKE9iamVjdCBvYmosIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoIV9vcGVyYXRpbmcuYWRkKG9iaikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IGdldFN0YXRlTWFuYWdlckltcGwob2JqLCBmYWxzZSk7CisgICAgICAgIGludCBhY3Rpb24gPSBwcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfUkVGUkVTSCwgb2JqLCBzbSwgY2FsbCk7CisgICAgICAgIGlmICgoYWN0aW9uICYgT3BDYWxsYmFja3MuQUNUX0NBU0NBREUpID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHNtICE9IG51bGwpCisgICAgICAgICAgICBzbS5nYXRoZXJDYXNjYWRlUmVmcmVzaChjYWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2FzY2FkZVRyYW5zaWVudChPcENhbGxiYWNrcy5PUF9SRUZSRVNILCBvYmosIGNhbGwsICJyZWZyZXNoIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGZ1bGwgc2V0IG9mIG9iamVjdHMgcmVhY2hhYmxlIHZpYQorICAgICAqIGNhc2NhZGUtcmVmcmVzaCByZWxhdGlvbnMgZnJvbSB0aGUgdXNlci1naXZlbiBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEludGVybmFsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjb2xsZWN0IGluc3RhbmNlcyB0aGF0IG5lZWQgYSByZWZyZXNoCisgICAgICAgICAgICBDb2xsZWN0aW9uIGxvYWQgPSBudWxsOworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBvYmogPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzbSA9IGdldFN0YXRlTWFuYWdlckltcGwob2JqLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfUkVGUkVTSCwgb2JqLCBzbSwgY2FsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgT3BDYWxsYmFja3MuQUNUX1JVTikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20uaXNEZXRhY2hlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0RldGFjaGVkRXhjZXB0aW9uKG9iaiwgInJlZnJlc2giKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNtLmJlZm9yZVJlZnJlc2godHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkID0gbmV3IEFycmF5TGlzdChvYmpzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC5hZGQoc20pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFzc2VydFBlcnNpc3RlbmNlQ2FwYWJsZShvYmopLnBjSXNEZXRhY2hlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdEZXRhY2hlZEV4Y2VwdGlvbihvYmosICJyZWZyZXNoIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGQoZXhjZXBzLCBrZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWZyZXNoIGFsbAorICAgICAgICAgICAgaWYgKGxvYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gZmFpbGVkID0gX3N0b3JlLmxvYWRBbGwobG9hZCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgU3RvcmVNYW5hZ2VyLkZPUkNFX0xPQURfUkVGUkVTSCwgX2ZjLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGVkICE9IG51bGwgJiYgIWZhaWxlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIG5ld09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGZhaWxlZCkpOworCisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSBwb3N0LXJlZnJlc2ggdHJhbnNpdGlvbnMgYW5kIG1ha2Ugc3VyZSBhbGwgZmV0Y2gKKyAgICAgICAgICAgICAgICAvLyBncm91cCBmaWVsZHMgYXJlIGxvYWRlZAorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbG9hZC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkICE9IG51bGwgJiYgZmFpbGVkLmNvbnRhaW5zKHNtLmdldElkKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmFmdGVyUmVmcmVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc20ubG9hZChfZmMsIFN0YXRlTWFuYWdlckltcGwuTE9BRF9GR1MsIG51bGwsIG51bGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2Vwcywga2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3cgaW52b2tlIHBvc3RSZWZyZXNoIG9uIGFsbCB0aGUgaW5zdGFuY2VzCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzbSA9IGdldFN0YXRlTWFuYWdlckltcGwoaXRyLm5leHQoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsICYmICFzbS5pc0RldGFjaGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlTGlmZWN5Y2xlRXZlbnQoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCksIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0TWV0YURhdGEoKSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfUkVGUkVTSCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgICAgICBleGNlcHMgPSBhZGQoZXhjZXBzLCBrZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9CisgICAgICAgIHRocm93TmVzdGVkRXhjZXB0aW9ucyhleGNlcHMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpbWl6YXRpb24gZm9yIHNpbmdsZS1vYmplY3QgcmVmcmVzaC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoSW50ZXJuYWwoT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IGdldFN0YXRlTWFuYWdlckltcGwob2JqLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICgocHJvY2Vzc0FyZ3VtZW50KE9wQ2FsbGJhY2tzLk9QX1JFRlJFU0gsIG9iaiwgc20sIGNhbGwpCisgICAgICAgICAgICAgICAgJiBPcENhbGxiYWNrcy5BQ1RfUlVOKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc20uaXNEZXRhY2hlZCgpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdEZXRhY2hlZEV4Y2VwdGlvbihvYmosICJyZWZyZXNoIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc20uYmVmb3JlUmVmcmVzaChmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc20ubG9hZChfZmMsIFN0YXRlTWFuYWdlckltcGwuTE9BRF9GR1MsIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgc20uYWZ0ZXJSZWZyZXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcmVMaWZlY3ljbGVFdmVudChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0TWV0YURhdGEoKSwgTGlmZWN5Y2xlRXZlbnQuQUZURVJfUkVGUkVTSCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFzc2VydFBlcnNpc3RlbmNlQ2FwYWJsZShvYmopLnBjSXNEZXRhY2hlZCgpCisgICAgICAgICAgICAgICAgPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgICAgIHRocm93IG5ld0RldGFjaGVkRXhjZXB0aW9uKG9iaiwgInJlZnJlc2giKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlQWxsKENvbGxlY3Rpb24gb2JqcywgYm9vbGVhbiBkZmdPbmx5LAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmpzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKG9ianMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHJpZXZlKG9ianMuaXRlcmF0b3IoKS5uZXh0KCksIGRmZ09ubHksIGNhbGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdCBleGNlcHMgPSBudWxsOworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIGFzc2VydE5vbnRyYW5zYWN0aW9uYWxSZWFkKCk7CisKKyAgICAgICAgICAgIC8vIGNvbGxlY3QgYWxsIGhvbGxvdyBpbnN0YW5jZXMgZm9yIGxvYWQKKyAgICAgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGxvYWQgPSBudWxsOworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gc21zID0gbmV3IEFycmF5TGlzdChvYmpzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBvYmogPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzbSA9IGdldFN0YXRlTWFuYWdlckltcGwob2JqLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfUkVUUklFVkUsIG9iaiwgc20sIGNhbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtLmlzRGV0YWNoZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdEZXRhY2hlZEV4Y2VwdGlvbihvYmosICJyZXRyaWV2ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21zLmFkZChzbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtLmdldFBDU3RhdGUoKSA9PSBQQ1N0YXRlLkhPTExPVykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC5hZGQoc20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhc3NlcnRQZXJzaXN0ZW5jZUNhcGFibGUob2JqKS5wY0lzRGV0YWNoZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RGV0YWNoZWRFeGNlcHRpb24ob2JqLCAicmV0cmlldmUiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVc2VyRXhjZXB0aW9uIHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvYWQgYWxsIGhvbGxvdyBpbnN0YW5jZXMKKyAgICAgICAgICAgIENvbGxlY3Rpb24gZmFpbGVkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChsb2FkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IChkZmdPbmx5KSA/IF9zdG9yZS5GT1JDRV9MT0FEX0RGRworICAgICAgICAgICAgICAgICAgICA6IF9zdG9yZS5GT1JDRV9MT0FEX0FMTDsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSBfc3RvcmUubG9hZEFsbChsb2FkLCBudWxsLCBtb2RlLCBfZmMsIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgIT0gbnVsbCAmJiAhZmFpbGVkLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgbmV3T2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZmFpbGVkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJldHJpZXZlIGFsbCBub24tZmFpbGVkIGluc3RhbmNlcworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgIT0gbnVsbCAmJiBmYWlsZWQuY29udGFpbnMoc20uZ2V0SWQoKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaW50IG1vZGUgPSAoZGZnT25seSkgPyBTdGF0ZU1hbmFnZXJJbXBsLkxPQURfRkdTCisgICAgICAgICAgICAgICAgICAgIDogU3RhdGVNYW5hZ2VySW1wbC5MT0FEX0FMTDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzbS5iZWZvcmVSZWFkKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgc20ubG9hZChfZmMsIG1vZGUsIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIGtlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvd05lc3RlZEV4Y2VwdGlvbnMoZXhjZXBzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmV0cmlldmUoT2JqZWN0IG9iaiwgYm9vbGVhbiBkZmdPbmx5LCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIGFzc2VydE5vbnRyYW5zYWN0aW9uYWxSZWFkKCk7CisKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoKHByb2Nlc3NBcmd1bWVudChPcENhbGxiYWNrcy5PUF9SRVRSSUVWRSwgb2JqLCBzbSwgY2FsbCkKKyAgICAgICAgICAgICAgICAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChzbS5pc0RldGFjaGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0RldGFjaGVkRXhjZXB0aW9uKG9iaiwgInJldHJpZXZlIik7CisgICAgICAgICAgICAgICAgaWYgKHNtLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtb2RlID0gKGRmZ09ubHkpID8gU3RhdGVNYW5hZ2VySW1wbC5MT0FEX0ZHUworICAgICAgICAgICAgICAgICAgICAgICAgOiBTdGF0ZU1hbmFnZXJJbXBsLkxPQURfQUxMOworICAgICAgICAgICAgICAgICAgICBzbS5iZWZvcmVSZWFkKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgc20ubG9hZChfZmMsIG1vZGUsIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFzc2VydFBlcnNpc3RlbmNlQ2FwYWJsZShvYmopLnBjSXNEZXRhY2hlZCgpCisgICAgICAgICAgICAgICAgPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgICAgIHRocm93IG5ld0RldGFjaGVkRXhjZXB0aW9uKG9iaiwgInJldHJpZXZlIik7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZXZpY3QgYWxsIFBDbGVhbiBhbmQgUE5vblRyYW5zIG9iamVjdHMKKyAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IGdldE1hbmFnZWRTdGF0ZXMoKTsKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc207CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChzbS5pc1BlcnNpc3RlbnQoKSAmJiAhc20uaXNEaXJ0eSgpKQorICAgICAgICAgICAgICAgICAgICBldmljdChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwgY2FsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2Jqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGV2aWN0KGl0ci5uZXh0KCksIGNhbGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVzZXJFeGNlcHRpb24gdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRocm93TmVzdGVkRXhjZXB0aW9ucyhleGNlcHMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdEFsbChFeHRlbnQgZXh0ZW50LCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChleHRlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbihmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBldmljdCBhbGwgUENsZWFuIGFuZCBQTm9uVHJhbnMgb2JqZWN0cyBpbiBleHRlbnQKKyAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IGdldE1hbmFnZWRTdGF0ZXMoKTsKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc207CisgICAgICAgICAgICBDbGFzcyBjbHM7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChzbS5pc1BlcnNpc3RlbnQoKSAmJiAhc20uaXNEaXJ0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNscyA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xzID09IGV4dGVudC5nZXRFbGVtZW50VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXh0ZW50Lmhhc1N1YmNsYXNzZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXh0ZW50LmdldEVsZW1lbnRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2aWN0KHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpLCBjYWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2aWN0KE9iamVjdCBvYmosIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoKHByb2Nlc3NBcmd1bWVudChPcENhbGxiYWNrcy5PUF9FVklDVCwgb2JqLCBzbSwgY2FsbCkKKyAgICAgICAgICAgICAgICAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKHNtID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBzbS5ldmljdCgpOworICAgICAgICAgICAgaWYgKF9ldmljdERhdGFDYWNoZSAmJiBzbS5nZXRPYmplY3RJZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBEYXRhQ2FjaGUgY2FjaGUgPSBzbS5nZXRNZXRhRGF0YSgpLmdldERhdGFDYWNoZSgpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjYWNoZS5yZW1vdmUoc20uZ2V0T2JqZWN0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZGV0YWNoKE9iamVjdCBvYmosIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChjYWxsID09IG51bGwpCisgICAgICAgICAgICBjYWxsID0gX2NhbGw7CisKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERldGFjaE1hbmFnZXIodGhpcywgZmFsc2UsIGNhbGwpLmRldGFjaChvYmopOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZGV0YWNoQWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChvYmpzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgICAgICBpZiAoY2FsbCA9PSBudWxsKQorICAgICAgICAgICAgY2FsbCA9IF9jYWxsOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXRhY2hNYW5hZ2VyKHRoaXMsIGZhbHNlLCBjYWxsKS5kZXRhY2hBbGwob2Jqcyk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRldGFjaEFsbChPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGRldGFjaEFsbChjYWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXRhY2hBbGwoT3BDYWxsYmFja3MgY2FsbCwgYm9vbGVhbiBmbHVzaCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIGEgZmx1c2ggaXMgZGVzaXJlZCAoYmFzZWQgb24gaW5wdXQgcGFybSksIHRoZW4gY2hlY2sgaWYgdGhlCisgICAgICAgICAgICAvLyAgICJkaXJ0eSIgZmxhZyBpcyBzZXQgYmVmb3JlIGNhbGxpbmcgZmx1c2goKS4KKyAgICAgICAgICAgIGlmICgoZmx1c2gpICYmICgoX2ZsYWdzICYgRkxBR19GTFVTSF9SRVFVSVJFRCkgIT0gMCkpCisgICAgICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIGRldGFjaEFsbEludGVybmFsKGNhbGwpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGV0YWNoQWxsSW50ZXJuYWwoT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBDb2xsZWN0aW9uIHN0YXRlcyA9IGdldE1hbmFnZWRTdGF0ZXMoKTsKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzdGF0ZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNtID0gKFN0YXRlTWFuYWdlckltcGwpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIXNtLmlzUGVyc2lzdGVudCgpKQorICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzbS5nZXRNZXRhRGF0YSgpLmlzRGV0YWNoYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgc20ucmVsZWFzZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGNhbGwgPT0gbnVsbCkKKyAgICAgICAgICAgIGNhbGwgPSBfY2FsbDsKKyAgICAgICAgbmV3IERldGFjaE1hbmFnZXIodGhpcywgdHJ1ZSwgY2FsbCkuZGV0YWNoQWxsCisgICAgICAgICAgICAobmV3IE1hbmFnZWRPYmplY3RDb2xsZWN0aW9uKHN0YXRlcykpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgYXR0YWNoKE9iamVjdCBvYmosIGJvb2xlYW4gY29weU5ldywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBub3QgdG8gdHJ5IHRvIHNldCByb2xsYmFjayBvbmx5IGlmIHRoaXMgZmFpbHMKKyAgICAgICAgICAgIGFzc2VydFdyaXRlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXR0YWNoTWFuYWdlcih0aGlzLCBjb3B5TmV3LCBjYWxsKS5hdHRhY2gob2JqKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wdGltaXN0aWNFeGNlcHRpb24gb2UpIHsKKyAgICAgICAgICAgICAgICBzZXRSb2xsYmFja09ubHkob2UpOworICAgICAgICAgICAgICAgIHRocm93IG9lLnNldEZhdGFsKHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIGF0dGFjaEFsbChDb2xsZWN0aW9uIG9ianMsIGJvb2xlYW4gY29weU5ldywKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChvYmpzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG5vdCB0byB0cnkgdG8gc2V0IHJvbGxiYWNrIG9ubHkgaWYgdGhpcyBmYWlscworICAgICAgICAgICAgYXNzZXJ0V3JpdGVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2hNYW5hZ2VyKHRoaXMsIGNvcHlOZXcsIGNhbGwpLmF0dGFjaEFsbChvYmpzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wdGltaXN0aWNFeGNlcHRpb24gb2UpIHsKKyAgICAgICAgICAgICAgICBzZXRSb2xsYmFja09ubHkob2UpOworICAgICAgICAgICAgICAgIHRocm93IG9lLnNldEZhdGFsKHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm9udHJhbnNhY3Rpb25hbEFsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBub250cmFuc2FjdGlvbmFsKGl0ci5uZXh0KCksIGNhbGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVzZXJFeGNlcHRpb24gdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywgdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93TmVzdGVkRXhjZXB0aW9ucyhleGNlcHMsIGZhbHNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm9udHJhbnNhY3Rpb25hbChPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoKHByb2Nlc3NBcmd1bWVudChPcENhbGxiYWNrcy5PUF9OT05UUkFOU0FDVElPTkFMLCBvYmosIHNtLCBjYWxsKQorICAgICAgICAgICAgICAgICYgT3BDYWxsYmFja3MuQUNUX1JVTikgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzbS5ub250cmFuc2FjdGlvbmFsKCk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIGluc3RhbmNlcyB0cmFuc2FjdGlvbmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0aW9uYWxBbGwoQ29sbGVjdGlvbiBvYmpzLCBib29sZWFuIHVwZGF0ZVZlcnNpb24sCisgICAgICAgIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKG9ianMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAob2Jqcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgdHJhbnNhY3Rpb25hbChvYmpzLml0ZXJhdG9yKCkubmV4dCgpLCB1cGRhdGVWZXJzaW9uLCBjYWxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgaG9sbG93IGluc3RhbmNlcyBmb3IgbG9hZCwgYW5kIG1ha2UgdW5tYW5hbmdlZAorICAgICAgICAgICAgLy8gaW5zdGFuY2VzIHRyYW5zaWVudC10cmFuc2FjdGlvbmFsCisgICAgICAgICAgICBDb2xsZWN0aW9uIGxvYWQgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc207CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHNtcyA9IG5ldyBBcnJheUxpc3Qob2Jqcy5zaXplKCkpOworICAgICAgICAgICAgTGlzdCBleGNlcHMgPSBudWxsOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvYmpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgb2JqID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzc0FyZ3VtZW50KE9wQ2FsbGJhY2tzLk9QX1RSQU5TQUNUSU9OQUwsIG9iaiwgc20sCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsKSAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFuYWdlIHRyYW5zaWVudCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSA9IF9jb25mLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEob2JqLmdldENsYXNzKCksIF9sb2FkZXIsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzbSA9IG5ldyBTdGF0ZU1hbmFnZXJJbXBsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0YXRlTWFuYWdlcklkLm5ld0luc3RhbmNlKHRoaXMpLCBtZXRhLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmluaXRpYWxpemUoYXNzZXJ0UGVyc2lzdGVuY2VDYXBhYmxlKG9iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENTdGF0ZS5UQ0xFQU4pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgc21zLmFkZChzbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuSE9MTE9XKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLmFkZChzbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldENoZWNrVmVyc2lvbih0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldFVwZGF0ZVZlcnNpb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19GTFVTSF9SRVFVSVJFRDsgLy8gdmVyc2lvbiBjaGVjay91cAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChVc2VyRXhjZXB0aW9uIHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvYWQgYWxsIGhvbGxvdyBpbnN0YW5jZXMKKyAgICAgICAgICAgIENvbGxlY3Rpb24gZmFpbGVkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChsb2FkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSBfc3RvcmUubG9hZEFsbChsb2FkLCBudWxsLCBfc3RvcmUuRk9SQ0VfTE9BRF9OT05FLAorICAgICAgICAgICAgICAgICAgICBfZmMsIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgIT0gbnVsbCAmJiAhZmFpbGVkLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzID0gYWRkKGV4Y2VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGZhaWxlZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc2FjdGlvbmFsU3RhdGVzQWxsKHNtcywgZmFpbGVkLCBleGNlcHMpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBnaXZlbiBpbnN0YW5jZXMgdHJhbnNhY3Rpb25hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsKE9iamVjdCBvYmosIGJvb2xlYW4gdXBkYXRlVmVyc2lvbiwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIHRydWUpOworICAgICAgICAgICAgaWYgKChwcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfVFJBTlNBQ1RJT05BTCwgb2JqLCBzbSwgY2FsbCkKKyAgICAgICAgICAgICAgICAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiBzbS5pc1BlcnNpc3RlbnQoKSkgeworICAgICAgICAgICAgICAgIGFzc2VydEFjdGl2ZVRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc20udHJhbnNhY3Rpb25hbCgpOworICAgICAgICAgICAgICAgIHNtLmxvYWQoX2ZjLCBTdGF0ZU1hbmFnZXJJbXBsLkxPQURfRkdTLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc20uc2V0Q2hlY2tWZXJzaW9uKHRydWUpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICBzbS5zZXRVcGRhdGVWZXJzaW9uKHRydWUpOworICAgICAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0ZMVVNIX1JFUVVJUkVEOyAvLyB2ZXJzaW9uIGNoZWNrL3VwCisgICAgICAgICAgICB9IGVsc2UgaWYgKHNtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBtYW5hZ2UgdHJhbnNpZW50IGluc3RhbmNlCisgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gX2NvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEob2JqLmdldENsYXNzKCksIF9sb2FkZXIsIHRydWUpOworICAgICAgICAgICAgICAgIE9iamVjdCBpZCA9IFN0YXRlTWFuYWdlcklkLm5ld0luc3RhbmNlKHRoaXMpOworICAgICAgICAgICAgICAgIHNtID0gbmV3IFN0YXRlTWFuYWdlckltcGwoaWQsIG1ldGEsIHRoaXMpOworICAgICAgICAgICAgICAgIHNtLmluaXRpYWxpemUoYXNzZXJ0UGVyc2lzdGVuY2VDYXBhYmxlKG9iaiksCisgICAgICAgICAgICAgICAgICAgIFBDU3RhdGUuVENMRUFOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNpdGlvbiB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlcnMgdG8gdHJhbnNhY3Rpb25hbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdHJhbnNhY3Rpb25hbFN0YXRlc0FsbChDb2xsZWN0aW9uIHNtcywgQ29sbGVjdGlvbiBmYWlsZWQsCisgICAgICAgIExpc3QgZXhjZXBzKSB7CisgICAgICAgIC8vIG1ha2UgaW5zdGFuY2VzIHRyYW5zYWN0aW9uYWwgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBsb2FkZWQKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNtID0gKFN0YXRlTWFuYWdlckltcGwpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZmFpbGVkICE9IG51bGwgJiYgZmFpbGVkLmNvbnRhaW5zKHNtLmdldElkKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNtLnRyYW5zYWN0aW9uYWwoKTsKKyAgICAgICAgICAgICAgICBzbS5sb2FkKF9mYywgU3RhdGVNYW5hZ2VySW1wbC5MT0FEX0ZHUywgbnVsbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIGtlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvd05lc3RlZEV4Y2VwdGlvbnMoZXhjZXBzLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBFeHRlbnQsIFF1ZXJ5CisgICAgLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBFeHRlbnQgbmV3RXh0ZW50KENsYXNzIHR5cGUsIGJvb2xlYW4gc3ViY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3RXh0ZW50KHR5cGUsIHN1YmNsYXNzZXMsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgRXh0ZW50IG5ld0V4dGVudChDbGFzcyB0eXBlLCBib29sZWFuIHN1YmNsYXNzZXMsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4dGVudEltcGwgZXh0ZW50ID0gbmV3IEV4dGVudEltcGwodGhpcywgdHlwZSwgc3ViY2xhc3NlcywgZmV0Y2gpOworICAgICAgICAgICAgaWYgKF9leHRlbnRzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2V4dGVudHMgPSBuZXcgUmVmZXJlbmNlSGFzaFNldChSZWZlcmVuY2VIYXNoU2V0LldFQUspOworICAgICAgICAgICAgX2V4dGVudHMuYWRkKGV4dGVudCk7CisKKyAgICAgICAgICAgIHJldHVybiBleHRlbnQ7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBleHRlbnRJdGVyYXRvcihDbGFzcyB0eXBlLCBib29sZWFuIHN1YmNsYXNzZXMsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgYm9vbGVhbiBpZ25vcmVDaGFuZ2VzKSB7CisgICAgICAgIEV4dGVudCBleHRlbnQgPSBuZXdFeHRlbnQodHlwZSwgc3ViY2xhc3NlcywgZmV0Y2gpOworICAgICAgICBleHRlbnQuc2V0SWdub3JlQ2hhbmdlcyhpZ25vcmVDaGFuZ2VzKTsKKyAgICAgICAgcmV0dXJuIGV4dGVudC5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZywgQ2xhc3MgY2xzLCBPYmplY3QgcXVlcnkpIHsKKyAgICAgICAgUXVlcnkgcSA9IG5ld1F1ZXJ5KGxhbmcsIHF1ZXJ5KTsKKyAgICAgICAgcS5zZXRDYW5kaWRhdGVUeXBlKGNscywgdHJ1ZSk7CisgICAgICAgIHJldHVybiBxOworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZywgT2JqZWN0IHF1ZXJ5KSB7CisgICAgICAgIC8vIGNvbW1vbiBtaXN0YWtlcworICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBFeHRlbnQgfHwgcXVlcnkgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbmV3LXF1ZXJ5IikpOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0b3JlUXVlcnkgc3EgPSBfc3RvcmUubmV3UXVlcnkobGFuZyk7CisgICAgICAgICAgICBpZiAoc3EgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEV4cHJlc3Npb25QYXJzZXIgZXAgPSBRdWVyeUxhbmd1YWdlcy5wYXJzZXJGb3JMYW5ndWFnZShsYW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoZXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3EgPSBuZXcgRXhwcmVzc2lvblN0b3JlUXVlcnkoZXApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFF1ZXJ5TGFuZ3VhZ2VzLkxBTkdfTUVUSE9EUUwuZXF1YWxzKGxhbmcpKQorICAgICAgICAgICAgICAgICAgICBzcSA9IG5ldyBNZXRob2RTdG9yZVF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24obGFuZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFF1ZXJ5IHEgPSBuZXdRdWVyeUltcGwobGFuZywgc3EpOworICAgICAgICAgICAgcS5zZXRJZ25vcmVDaGFuZ2VzKF9pZ25vcmVDaGFuZ2VzKTsKKyAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHEuc2V0UXVlcnkocXVlcnkpOworCisgICAgICAgICAgICAvLyB0cmFjayBxdWVyaWVzCisgICAgICAgICAgICBpZiAoX3F1ZXJpZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfcXVlcmllcyA9IG5ldyBSZWZlcmVuY2VIYXNoU2V0KFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisgICAgICAgICAgICBfcXVlcmllcy5hZGQocSk7CisgICAgICAgICAgICByZXR1cm4gcTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHF1ZXJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBRdWVyeUltcGwgbmV3UXVlcnlJbXBsKFN0cmluZyBsYW5nLCBTdG9yZVF1ZXJ5IHNxKSB7CisgICAgICAgIHJldHVybiBuZXcgUXVlcnlJbXBsKHRoaXMsIGxhbmcsIHNxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VxIGdldElkZW50aXR5U2VxdWVuY2UoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGlmIChtZXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGdldFNlcXVlbmNlKG1ldGEsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTZXEgZ2V0VmFsdWVTZXF1ZW5jZShGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBpZiAoZm1kID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGdldFNlcXVlbmNlKGZtZC5nZXREZWZpbmluZ01ldGFEYXRhKCksIGZtZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2VxdWVuY2UgZm9yIHRoZSBnaXZlbiBjbGFzcyBhbmQgb3B0aW9uYWwgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXEgZ2V0U2VxdWVuY2UoQ2xhc3NNZXRhRGF0YSBtZXRhLCBGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICAvLyBnZXQgc2VxdWVuY2Ugc3RyYXRlZ3kgZnJvbSBtZXRhZGF0YQorICAgICAgICBpbnQgc3RyYXRlZ3k7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gbWV0YS5nZXRJZGVudGl0eVN0cmF0ZWd5KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gZm1kLmdldFZhbHVlU3RyYXRlZ3koKTsKKworICAgICAgICAvLyB3ZSBjYW4gaGFuZGxlIG5vbi1uYXRpdmUgc3RyYXRlZ2llcyB3aXRob3V0IHRoZSBzdG9yZSBtYW5hZ2VyCisgICAgICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIGNhc2UgVmFsdWVTdHJhdGVnaWVzLlVVSURfSEVYOgorICAgICAgICAgICAgICAgIHJldHVybiBVVUlESGV4U2VxLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBjYXNlIFZhbHVlU3RyYXRlZ2llcy5VVUlEX1NUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVVVJRFN0cmluZ1NlcS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgY2FzZSBWYWx1ZVN0cmF0ZWdpZXMuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgU2VxdWVuY2VNZXRhRGF0YSBzbWQgPSAoZm1kID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgID8gbWV0YS5nZXRJZGVudGl0eVNlcXVlbmNlTWV0YURhdGEoKQorICAgICAgICAgICAgICAgICAgICA6IGZtZC5nZXRWYWx1ZVNlcXVlbmNlTWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc21kLmdldEluc3RhbmNlKF9sb2FkZXIpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyB1c2Ugc3RvcmUgbWFuYWdlciBmb3IgbmF0aXZlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgaWYgKGZtZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXR1cm4gYSBzZXF1ZW5jZSBldmVuIGZvciBhcHAgaWQgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCB3ZSB3YW50IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0b3JlLmdldERhdGFTdG9yZUlkU2VxdWVuY2UobWV0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfc3RvcmUuZ2V0VmFsdWVTZXF1ZW5jZShmbWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8KKyAgICAvLyBMb2NraW5nCisgICAgLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYmVnaW5PcGVyYXRpb24odHJ1ZSk7IC8vIGhhdmUgdG8gc3luYyBvciBsb2NrIGxldmVsIGFsd2F5cyBOT05FCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrKG9iaiwgX2ZjLmdldFdyaXRlTG9ja0xldmVsKCksIF9mYy5nZXRMb2NrVGltZW91dCgpLCBjYWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9jayhPYmplY3Qgb2JqLCBpbnQgbGV2ZWwsIGludCB0aW1lb3V0LCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEFjdGl2ZVRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoKHByb2Nlc3NBcmd1bWVudChPcENhbGxiYWNrcy5PUF9MT0NLLCBvYmosIHNtLCBjYWxsKQorICAgICAgICAgICAgICAgICYgT3BDYWxsYmFja3MuQUNUX1JVTikgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCB8fCAhc20uaXNQZXJzaXN0ZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBfbG0ubG9jayhzbSwgbGV2ZWwsIHRpbWVvdXQsIG51bGwpOworICAgICAgICAgICAgc20ucmVhZExvY2tlZChsZXZlbCwgbGV2ZWwpOyAvLyB1c2Ugc2FtZSBsZXZlbCBmb3IgZnV0dXJlIHdyaXRlCisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvY2tBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmpzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZWdpbk9wZXJhdGlvbih0cnVlKTsgLy8gaGF2ZSB0byBzeW5jIG9yIGxvY2sgbGV2ZWwgYWx3YXlzIE5PTkUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2tBbGwob2JqcywgX2ZjLmdldFdyaXRlTG9ja0xldmVsKCksIF9mYy5nZXRMb2NrVGltZW91dCgpLAorICAgICAgICAgICAgICAgIGNhbGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2NrQWxsKENvbGxlY3Rpb24gb2JqcywgaW50IGxldmVsLCBpbnQgdGltZW91dCwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2Jqcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChvYmpzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICBsb2NrKG9ianMuaXRlcmF0b3IoKS5uZXh0KCksIGxldmVsLCB0aW1lb3V0LCBjYWxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0QWN0aXZlVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgQ29sbGVjdGlvbiBzbXMgPSBuZXcgQXJyYXlMaXN0KG9ianMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvYmpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgb2JqID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgc20gPSBnZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfTE9DSywgb2JqLCBzbSwgY2FsbCkKKyAgICAgICAgICAgICAgICAgICAgJiBPcENhbGxiYWNrcy5BQ1RfUlVOKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiBzbS5pc1BlcnNpc3RlbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgc21zLmFkZChzbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sbS5sb2NrQWxsKHNtcywgbGV2ZWwsIHRpbWVvdXQsIG51bGwpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgKChTdGF0ZU1hbmFnZXJJbXBsKSBpdHIubmV4dCgpKS5yZWFkTG9ja2VkKGxldmVsLCBsZXZlbCk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29ubmVjdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxBbGwoKSB7CisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXMgbm90IGxvY2ssIHNpbmNlIHdlIHdhbnQgdG8gYWxsb3cgYSBkaWZmZXJlbnQKKyAgICAgICAgLy8gdGhyZWFkIHRvIGJlIGFibGUgdG8gY2FuY2VsIG9uIGEgbG9ja2VkLXVwIHBlcnNpc3RlbmNlIG1hbmFnZXIKKworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBpZiB3ZSdyZSBmbHVzaGluZywgaGF2ZSB0byBzZXQgcm9sbGJhY2sgb25seSAtLSBkbyB0aGlzIGJlZm9yZSB3ZQorICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjYW5jZWwgbWlnaHQgY2FzZSB0aGUKKyAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIHNldCB0aGUKKyAgICAgICAgICAgIC8vIHJvbGxiYWNrIG9ubHkgZmxhZworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFX0ZMVVNISU5HKSAhPSAwKQorICAgICAgICAgICAgICAgIHNldFJvbGxiYWNrT25seUludGVybmFsKG5ldyBVc2VyRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIF9zdG9yZS5jYW5jZWxBbGwoKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldENvbm5lY3Rpb24oKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaWYgKCFfY29uZi5zdXBwb3J0ZWRPcHRpb25zKCkuY29udGFpbnMKKyAgICAgICAgICAgIChfY29uZi5PUFRJT05fREFUQVNUT1JFX0NPTk5FQ1RJT04pKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJjb25uLW5vdC1zdXBwb3J0ZWQiKSk7CisKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5nZXRDbGllbnRDb25uZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ29ubmVjdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gKF9mbGFncyAmIEZMQUdfUkVUQUlORURfQ09OTikgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxsIHN0b3JlIHRvIHJldGFpbiBjb25uZWN0aW9uIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmV0YWluQ29ubmVjdGlvbigpIHsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1JFVEFJTkVEX0NPTk4pID09IDApIHsKKyAgICAgICAgICAgIF9zdG9yZS5yZXRhaW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19SRVRBSU5FRF9DT05OOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbCBzdG9yZSB0byByZWxlYXNlIGNvbm5lY3Rpb24gaWYgd2UgaGF2ZSByZXRhaW5lZCBvbmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb25uZWN0aW9uKCkgeworICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfUkVUQUlORURfQ09OTikgIT0gMCkgeworICAgICAgICAgICAgX3N0b3JlLnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfUkVUQUlORURfQ09OTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLworICAgIC8vIENhY2hlCisgICAgLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNYW5hZ2VkT2JqZWN0cygpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5hZ2VkT2JqZWN0Q29sbGVjdGlvbihnZXRNYW5hZ2VkU3RhdGVzKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRUcmFuc2FjdGlvbmFsT2JqZWN0cygpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5hZ2VkT2JqZWN0Q29sbGVjdGlvbihnZXRUcmFuc2FjdGlvbmFsU3RhdGVzKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQZW5kaW5nVHJhbnNhY3Rpb25hbE9iamVjdHMoKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFuYWdlZE9iamVjdENvbGxlY3Rpb24KKyAgICAgICAgICAgICAgICAoZ2V0UGVuZGluZ1RyYW5zYWN0aW9uYWxTdGF0ZXMoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBlbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldERpcnR5T2JqZWN0cygpIHsKKyAgICAgICAgYmVnaW5PcGVyYXRpb24oZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5hZ2VkT2JqZWN0Q29sbGVjdGlvbihnZXREaXJ0eVN0YXRlcygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3JkZXJEaXJ0eU9iamVjdHMoKSB7CisgICAgICAgIHJldHVybiBfb3JkZXJEaXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckRpcnR5T2JqZWN0cyhib29sZWFuIG9yZGVyKSB7CisgICAgICAgIF9vcmRlckRpcnR5ID0gb3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiBhbGwgbWFuYWdlZCBzdGF0ZSBtYW5hZ2Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRNYW5hZ2VkU3RhdGVzKCkgeworICAgICAgICByZXR1cm4gX2NhY2hlLmNvcHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIGFsbCB0cmFuc2FjdGlvbmFsIHN0YXRlIG1hbmFnZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldFRyYW5zYWN0aW9uYWxTdGF0ZXMoKSB7CisgICAgICAgIGlmIChfdHJhbnNDYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIHJldHVybiBfdHJhbnNDYWNoZS5jb3B5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiBhbGwgZGlydHkgc3RhdGUgbWFuYWdlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RGlydHlTdGF0ZXMoKSB7CisgICAgICAgIGlmIChfdHJhbnNDYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICAgICAgcmV0dXJuIF90cmFuc0NhY2hlLmNvcHlEaXJ0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgYWxsIHN0YXRlIG1hbmFnZXJzIHdoaWNoIHdpbGwgYmVjb21lCisgICAgICogdHJhbnNhY3Rpb25hbCB1cG9uIHRoZSBuZXh0IHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldFBlbmRpbmdUcmFuc2FjdGlvbmFsU3RhdGVzKCkgeworICAgICAgICBpZiAoX3BlbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChfcGVuZGluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWNoZWQgU3RhdGVNYW5hZ2VyIGZvciB0aGUgaW5zdGFuY2UgdGhhdCBoYWQgdGhlIGdpdmVuIG9pZC4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIG5ldyBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIHByZXZpb3VzbHkgdXNlZCBieSB0aGUgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gc20gdGhlIHN0YXRlIG1hbmFnZXIgZm9yIHRoZSBpbnN0YW5jZTsgaWYgdGhlIHN0YXRlCisgICAgICogbWFuYWdlciBpcyB0cmFuc2llbnQsIHdlJ2xsIHN0b3AgbWFuYWdpbmcgdGhlIGluc3RhbmNlOworICAgICAqIGlmIGl0IGhhcyB1cGRhdGVkIGl0cyBvaWQsIHdlJ2xsIHJlLWNhY2hlIHVuZGVyIHRoZSBuZXcgb2lkCisgICAgICogQHBhcmFtIHN0YXR1cyBvbmUgb2Ygb3VyIFNUQVRVUyBjb25zdGFudHMgZGVzY3JpYmluZyB3aHkgd2UncmUKKyAgICAgKiBzZXR0aW5nIHRoZSBzdGF0ZSBtYW5hZ2VyCisgICAgICovCisgICAgdm9pZCBzZXRTdGF0ZU1hbmFnZXIoT2JqZWN0IGlkLCBTdGF0ZU1hbmFnZXJJbXBsIHNtLCBpbnQgc3RhdHVzKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFUVVNfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgX2NhY2hlLmFkZChzbSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVFVTX1RSQU5TSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgX2NhY2hlLnJlbW92ZShpZCwgc20pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRVU19PSURfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICBfY2FjaGUuYXNzaWduT2JqZWN0SWQoaWQsIHNtKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFUVVNfQ09NTUlUX05FVzoKKyAgICAgICAgICAgICAgICAgICAgX2NhY2hlLmNvbW1pdE5ldyhpZCwgc20pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBicm9rZXIgdGhhdCB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciBzaG91bGQKKyAgICAgKiBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIGluc3RhbmNlcyBpbnZvbHZlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFRvVHJhbnNhY3Rpb24oU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICAvLyB3ZSBvbmx5IGFkZCBjbGVhbiBpbnN0YW5jZXMgbm93OyBkaXJ0eSBpbnN0YW5jZXMgYXJlIGFkZGVkIGluCisgICAgICAgIC8vIHRoZSBzZXREaXJ0eSBjYWxsYmFjaworICAgICAgICBpZiAoc20uaXNEaXJ0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfdHJhbnNDYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF90cmFuc0NhY2hlID0gbmV3IFRyYW5zYWN0aW9uYWxDYWNoZShfb3JkZXJEaXJ0eSk7CisgICAgICAgICAgICBfdHJhbnNDYWNoZS5hZGRDbGVhbihzbSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgcGVyc2lzdGVuY2UgbWFuYWdlciB0aGF0IHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyIHNob3VsZAorICAgICAqIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2V0IG9mIGluc3RhbmNlcyBpbnZvbHZlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUZyb21UcmFuc2FjdGlvbihTdGF0ZU1hbmFnZXJJbXBsIHNtKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfdHJhbnNDYWNoZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIF90cmFuc0NhY2hlLnJlbW92ZShzbSk7CisgICAgICAgICAgICBpZiAoX2RlcmVmQ2FjaGUgIT0gbnVsbCAmJiAhc20uaXNQZXJzaXN0ZW50KCkpCisgICAgICAgICAgICAgICAgX2RlcmVmQ2FjaGUucmVtb3ZlKHNtKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIGluc3RhbmNlIGhhcyBiZWVuIGRpcnRpZWQuIFRoaXMKKyAgICAgKiBub3RpZmljYXRpb24gaXMgZ2l2ZW4gd2hlbiBhbiBvYmplY3QgZmlyc3QgdHJhbnNpdGlvbnMgdG8gYSBkaXJ0eSBzdGF0ZSwKKyAgICAgKiBhbmQgZXZlcnkgdGltZSB0aGUgb2JqZWN0IGlzIG1vZGlmaWVkIGJ5IHRoZSB1c2VyIHRoZXJlYWZ0ZXIuCisgICAgICovCisgICAgdm9pZCBzZXREaXJ0eShTdGF0ZU1hbmFnZXJJbXBsIHNtLCBib29sZWFuIGZpcnN0RGlydHkpIHsKKyAgICAgICAgaWYgKHNtLmlzUGVyc2lzdGVudCgpKQorICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfRkxVU0hfUkVRVUlSRUQ7CisKKyAgICAgICAgaWYgKF9zYXZlcG9pbnRzICE9IG51bGwgJiYgIV9zYXZlcG9pbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKF9zYXZlcG9pbnRDYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zYXZlcG9pbnRDYWNoZSA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBfc2F2ZXBvaW50Q2FjaGUuYWRkKHNtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaXJzdERpcnR5ICYmIHNtLmlzVHJhbnNhY3Rpb25hbCgpKSB7CisgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGNhY2hlIGRpcnR5IGluc3RhbmNlCisgICAgICAgICAgICAgICAgaWYgKF90cmFuc0NhY2hlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF90cmFuc0NhY2hlID0gbmV3IFRyYW5zYWN0aW9uYWxDYWNoZShfb3JkZXJEaXJ0eSk7CisgICAgICAgICAgICAgICAgX3RyYW5zQ2FjaGUuYWRkRGlydHkoc20pOworCisgICAgICAgICAgICAgICAgLy8gYWxzbyByZWNvcmQgdGhhdCB0aGUgY2xhc3MgaXMgZGlydHkKKyAgICAgICAgICAgICAgICBpZiAoc20uaXNOZXcoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3BlcnNpc3RlZENsc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9wZXJzaXN0ZWRDbHNzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgX3BlcnNpc3RlZENsc3MuYWRkKHNtLmdldE1ldGFEYXRhKCkuZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzRGVsZXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZGVsZXRlZENsc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWxldGVkQ2xzcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIF9kZWxldGVkQ2xzcy5hZGQoc20uZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdXBkYXRlZENsc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVkQ2xzcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIF91cGRhdGVkQ2xzcy5hZGQoc20uZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHRyYWNraW5nIGNoYW5nZXMgYW5kIHRoaXMgaW5zdGFuY2Ugd2Fzbid0IGFscmVhZHkgZGlydHksCisgICAgICAgICAgICAgICAgLy8gYWRkIHRvIGNoYW5nZWQgc2V0OyB3ZSB1c2UgdGhpcyBmb3IgZGV0ZWN0aW5nIGluc3RhbmNlcyB0aGF0CisgICAgICAgICAgICAgICAgLy8gZW50ZXIgdGhlIHRyYW5zYWN0aW9uIGR1cmluZyBwcmUgc3RvcmUKKyAgICAgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfUFJFU1RPUklORykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3RyYW5zQWRkaXRpb25zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBfdHJhbnNBZGRpdGlvbnMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgICAgICBfdHJhbnNBZGRpdGlvbnMuYWRkKHNtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBicm9rZXIgdGhhdCB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciBzaG91bGQKKyAgICAgKiBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIGluc3RhbmNlcyB0aGF0IHdpbGwgYmVjb21lIHRyYW5zYWN0aW9uYWwKKyAgICAgKiBvbiB0aGUgbmV4dCB0cmFuc2FjdGlvbgorICAgICAqLworICAgIHZvaWQgYWRkVG9QZW5kaW5nVHJhbnNhY3Rpb24oU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3BlbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfcGVuZGluZyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBfcGVuZGluZy5hZGQoc20pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIHBlcnNpc3RlbmNlIG1hbmFnZXIgdGhhdCB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciBzaG91bGQKKyAgICAgKiBiZSByZW1vdmVkIGZyb20gdGhlIHNldCBvZiBpbnN0YW5jZXMgaW52b2x2ZWQgaW4gdGhlIG5leHQgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmVGcm9tUGVuZGluZ1RyYW5zYWN0aW9uKFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9wZW5kaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3BlbmRpbmcucmVtb3ZlKHNtKTsKKyAgICAgICAgICAgIGlmIChfZGVyZWZDYWNoZSAhPSBudWxsICYmICFzbS5pc1BlcnNpc3RlbnQoKSkKKyAgICAgICAgICAgICAgICBfZGVyZWZDYWNoZS5yZW1vdmUoc20pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBkZXJlZmVyZW5jZWQgZGVwZW5kZW50IG9iamVjdCB0byB0aGUgcGVyc2lzdGVuY2UgbWFuYWdlcidzIGNhY2hlLgorICAgICAqIE9uIGZsdXNoLCB0aGVzZSBvYmplY3RzIHdpbGwgYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZERlcmVmZXJlbmNlZERlcGVuZGVudChTdGF0ZU1hbmFnZXJJbXBsIHNtKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgZmx1c2ggYW5kIGludHJvZHVjaW5nIG1vcmUgZGVyZWZzCisgICAgICAgICAgICAvLyB2aWEgaW5zdGFuY2UgY2FsbGJhY2tzLCBhZGQgdGhlbSB0byB0aGUgc3BlY2lhbCBhZGRpdGlvbnMgc2V0CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfREVSRUZERUxFVElORykgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChfZGVyZWZBZGRpdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2RlcmVmQWRkaXRpb25zID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBfZGVyZWZBZGRpdGlvbnMuYWRkKHNtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKF9kZXJlZkNhY2hlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9kZXJlZkNhY2hlID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBfZGVyZWZDYWNoZS5hZGQoc20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHByZXZpb3VzbHkgZGVyZWZlcmVuY2VkIGRlcGVuZGVudCBvYmplY3QgZnJvbSB0aGUKKyAgICAgKiBjYWNoZS4gSXQgaXMgbm93IHJlZmVyZW5jZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmVEZXJlZmVyZW5jZWREZXBlbmRlbnQoU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChfZGVyZWZBZGRpdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZW1vdmVkID0gX2RlcmVmQWRkaXRpb25zLnJlbW92ZShzbSk7CisgICAgICAgICAgICBpZiAoIXJlbW92ZWQgJiYgKF9kZXJlZkNhY2hlID09IG51bGwgfHwgIV9kZXJlZkNhY2hlLnJlbW92ZShzbSkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1kZXJlZmVkIiwKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSkpKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpcnR5VHlwZShDbGFzcyBjbHMpIHsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfdXBkYXRlZENsc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfdXBkYXRlZENsc3MgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgX3VwZGF0ZWRDbHNzLmFkZChjbHMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kT3BlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQZXJzaXN0ZWRUeXBlcygpIHsKKyAgICAgICAgaWYgKF9wZXJzaXN0ZWRDbHNzID09IG51bGwgfHwgX3BlcnNpc3RlZENsc3MuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKF9wZXJzaXN0ZWRDbHNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRVcGRhdGVkVHlwZXMoKSB7CisgICAgICAgIGlmIChfdXBkYXRlZENsc3MgPT0gbnVsbCB8fCBfdXBkYXRlZENsc3MuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKF91cGRhdGVkQ2xzcyk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGVsZXRlZFR5cGVzKCkgeworICAgICAgICBpZiAoX2RlbGV0ZWRDbHNzID09IG51bGwgfHwgX2RlbGV0ZWRDbHNzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihfZGVsZXRlZENsc3MpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vCisgICAgLy8gQ2xvc2luZworICAgIC8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9jbG9zZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZUludm9rZWQoKSB7CisgICAgICAgIHJldHVybiBfY2xvc2VkIHx8IChfZmxhZ3MgJiBGTEFHX0NMT1NFX0lOVk9LRUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGJlZ2luT3BlcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBjbG9zaW5nIGluIGFuIGFjdGl2ZSBsb2NhbCB0cmFucworICAgICAgICAgICAgaWYgKCFfbWFuYWdlZCAmJiAoX2ZsYWdzICYgRkxBR19BQ1RJVkUpICE9IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiYWN0aXZlIikpOworCisgICAgICAgICAgICAvLyBvbmx5IGNsb3NlIGlmIG5vdCBhY3RpdmU7IGlmIGFjdGl2ZSBtYW5hZ2VkIHRyYW5zIHdhaXQKKyAgICAgICAgICAgIC8vIGZvciBjb21wbGV0aW9uCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19DTE9TRV9JTlZPS0VEOworCisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQUNUSVZFKSA9PSAwKQorICAgICAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZE9wZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRnJlZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSBtYW5hZ2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZyZWUoKSB7CisgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gZXJyID0gbnVsbDsKKyAgICAgICAgaWYgKChfYXV0b0RldGFjaCAmIERFVEFDSF9DTE9TRSkgIT0gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXRhY2hBbGxJbnRlcm5hbChfY2FsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgZXJyID0gcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfc3luYyA9IG51bGw7CisgICAgICAgIF91c2VyT2JqZWN0cyA9IG51bGw7CisgICAgICAgIF9jYWNoZS5jbGVhcigpOworICAgICAgICBfdHJhbnNDYWNoZSA9IG51bGw7CisgICAgICAgIF9wZXJzaXN0ZWRDbHNzID0gbnVsbDsKKyAgICAgICAgX3VwZGF0ZWRDbHNzID0gbnVsbDsKKyAgICAgICAgX2RlbGV0ZWRDbHNzID0gbnVsbDsKKyAgICAgICAgX2RlcmVmQ2FjaGUgPSBudWxsOworICAgICAgICBfcGVuZGluZyA9IG51bGw7CisgICAgICAgIF9sb2FkZXIgPSBudWxsOworICAgICAgICBfdHJhbnNFdmVudE1hbmFnZXIgPSBudWxsOworICAgICAgICBfbGlmZUV2ZW50TWFuYWdlciA9IG51bGw7CisKKyAgICAgICAgT3BlbkpQQVNhdmVwb2ludCBzYXZlOworICAgICAgICB3aGlsZSAoX3NhdmVwb2ludHMgIT0gbnVsbCAmJiAhX3NhdmVwb2ludHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzYXZlID0KKyAgICAgICAgICAgICAgICAoT3BlbkpQQVNhdmVwb2ludCkgX3NhdmVwb2ludHMucmVtb3ZlKF9zYXZlcG9pbnRzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgc2F2ZS5yZWxlYXNlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBfc2F2ZXBvaW50cyA9IG51bGw7CisgICAgICAgIF9zYXZlcG9pbnRDYWNoZSA9IG51bGw7CisKKyAgICAgICAgaWYgKF9xdWVyaWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX3F1ZXJpZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKFF1ZXJ5KSBpdHIubmV4dCgpKS5jbG9zZVJlc291cmNlcygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcXVlcmllcyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2V4dGVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgRXh0ZW50IGU7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9leHRlbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZSA9IChFeHRlbnQpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZS5jbG9zZUFsbCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZXh0ZW50cyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeyByZWxlYXNlQ29ubmVjdGlvbigpOyB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7fQorCisgICAgICAgIF9sbS5jbG9zZSgpOworICAgICAgICBfc3RvcmUuY2xvc2UoKTsKKyAgICAgICAgX2ZsYWdzID0gMDsKKyAgICAgICAgX2Nsb3NlZCA9IHRydWU7CisgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfY2xvc2VkRXhjZXB0aW9uID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChlcnIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU3luY2hyb25pemF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgbG9jaygpIHsKKyAgICAgICAgaWYgKF9sb2NrICE9IG51bGwpCisgICAgICAgICAgICBfbG9jay5sb2NrKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5sb2NrKCkgeworICAgICAgICBpZiAoX2xvY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIF9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU3RhdGUgbWFuYWdlbWVudAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGNscykgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisKKyAgICAgICAgaWYgKGNscy5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhKGNscywgX2xvYWRlciwgdHJ1ZSk7CisgICAgICAgICAgICBjbHMgPSBtZXRhLmdldEludGVyZmFjZUltcGwoKTsKKyAgICAgICAgfSBlbHNlIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KGNscy5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAoIm5ldy1hYnN0cmFjdCIsIGNscykuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICAvLyAxLjUgZG9lc24ndCBpbml0aWFsaXplIGNsYXNzZXMgd2l0aG91dCBhIHRydWUgQ2xhc3MuZm9yTmFtZQorICAgICAgICBpZiAoIVBDUmVnaXN0cnkuaXNSZWdpc3RlcmVkKGNscykpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjbHMuZ2V0TmFtZSgpLCB0cnVlLCBjbHMuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBQQ1JlZ2lzdHJ5Lm5ld0luc3RhbmNlKGNscywgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SWQoT2JqZWN0IG9iaikgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICByZXR1cm4gKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iaikucGNGZXRjaE9iamVjdElkKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TG9ja0xldmVsKE9iamVjdCBvKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBMb2NrTGV2ZWxzLkxPQ0tfTk9ORTsKKworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gZ2V0U3RhdGVNYW5hZ2VyKG8pOworICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBMb2NrTGV2ZWxzLkxPQ0tfTk9ORTsKKyAgICAgICAgcmV0dXJuIGdldExvY2tNYW5hZ2VyKCkuZ2V0TG9ja0xldmVsKHNtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZlcnNpb24oT2JqZWN0IG9iaikgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICByZXR1cm4gKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iaikucGNHZXRWZXJzaW9uKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoT2JqZWN0IG9iaikgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICByZXR1cm4gKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iaikucGNJc0RpcnR5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoT2JqZWN0IG9iaikgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICByZXR1cm4gKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iaikucGNJc1RyYW5zYWN0aW9uYWwoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudChPYmplY3Qgb2JqKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlQ2FwYWJsZSkKKyAgICAgICAgICAgIHJldHVybiAoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgb2JqKS5wY0lzUGVyc2lzdGVudCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXcoT2JqZWN0IG9iaikgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICByZXR1cm4gKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iaikucGNJc05ldygpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmopIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlKQorICAgICAgICAgICAgcmV0dXJuICgoUGVyc2lzdGVuY2VDYXBhYmxlKSBvYmopLnBjSXNEZWxldGVkKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RldGFjaGVkKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSBvYmo7CisgICAgICAgIEJvb2xlYW4gZGV0YWNoZWQgPSBwYy5wY0lzRGV0YWNoZWQoKTsKKyAgICAgICAgaWYgKGRldGFjaGVkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZGV0YWNoZWQuYm9vbGVhblZhbHVlKCk7CisKKyAgICAgICAgLy8gbGFzdCByZXNvcnQ6IGluc3RhbmNlIGlzIGRldGFjaGVkIGlmIGl0IGhhcyBhIHN0b3JlIHJlY29yZAorICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGEocGMuZ2V0Q2xhc3MoKSwgX2xvYWRlciwgdHJ1ZSk7CisgICAgICAgIE9iamVjdCBvaWQgPSBBcHBsaWNhdGlvbklkcy5jcmVhdGUocGMsIG1ldGEpOworICAgICAgICBpZiAob2lkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBmaW5kKG9pZCwgbnVsbCwgRVhDTFVERV9BTEwsIG51bGwsIDApICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZ2V0U3RhdGVNYW5hZ2VyKE9iamVjdCBvYmopIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN0YXRlIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZSwgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhc3NlcnRUaGlzQ29udGV4dCBpZiB0cnVlLCB0aG93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4KKyAgICAgKiBvYmplY3QgaXMgbWFuYWdlZCBieSBhbm90aGVyIGJyb2tlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdGF0ZU1hbmFnZXJJbXBsIGdldFN0YXRlTWFuYWdlckltcGwoT2JqZWN0IG9iaiwKKyAgICAgICAgYm9vbGVhbiBhc3NlcnRUaGlzQ29udGV4dCkgeworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlKSB7CisgICAgICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSBvYmo7CisgICAgICAgICAgICBpZiAocGMucGNHZXRHZW5lcmljQ29udGV4dCgpID09IHRoaXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIChTdGF0ZU1hbmFnZXJJbXBsKSBwYy5wY0dldFN0YXRlTWFuYWdlcigpOworICAgICAgICAgICAgaWYgKGFzc2VydFRoaXNDb250ZXh0ICYmIHBjLnBjR2V0R2VuZXJpY0NvbnRleHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtbWFuYWdlZCIsCisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbnMudG9TdHJpbmcob2JqKSkpLnNldEZhaWxlZE9iamVjdChvYmopOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhdGUgbWFuYWdlciBmb3IgdGhlIGdpdmVuIG9pZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvd05ldyBpZiB0cnVlLCBvYmplY3RzIG1hZGUgcGVyc2lzdGVudCBpbiB0aGUgY3VycmVudAorICAgICAqIHRyYW5zYWN0aW9uIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaDsgaWYKKyAgICAgKiBtdWx0aXBsZSBuZXcgb2JqZWN0cyBtYXRjaCB0aGUgZ2l2ZW4gb2lkLCBpdCBpcworICAgICAqIHVuZGVmaW5lZCB3aGljaCB3aWxsIGJlIHJldHVybmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0YXRlTWFuYWdlckltcGwgZ2V0U3RhdGVNYW5hZ2VySW1wbEJ5SWQoT2JqZWN0IG9pZCwKKyAgICAgICAgYm9vbGVhbiBhbGxvd05ldykgeworICAgICAgICByZXR1cm4gX2NhY2hlLmdldEJ5SWQob2lkLCBhbGxvd05ldyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiBpbnN0YW5jZSBhcyBhIHtAbGluayBQZXJzaXN0ZW5jZUNhcGFibGV9LgorICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgbWFuYWdlYWJsZSB0aHJvdyB0aGUgcHJvcGVyIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGVyc2lzdGVuY2VDYXBhYmxlIGFzc2VydFBlcnNpc3RlbmNlQ2FwYWJsZShPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlKQorICAgICAgICAgICAgcmV0dXJuIChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iajsKKworICAgICAgICAvLyBjaGVjayBmb3IgZGlmZmVyZW5jZSBpbnN0YW5jZXMgb2YgdGhlIFBlcnNpc3RlbmNlQ2FwYWJsZSBpbnRlcmZhY2UKKyAgICAgICAgLy8gYW5kIHRocm93IGEgYmV0dGVyIGVycm9yIHRoYXQgbWVudGlvbnMgdGhlIGNsYXNzIGxvYWRlcnMKKyAgICAgICAgQ2xhc3NbXSBpbnRmcyA9IG9iai5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGludGZzICE9IG51bGwgJiYgaSA8IGludGZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW50ZnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYy1sb2FkZXItZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhvYmopLAorICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgaW50ZnNbaV0uZ2V0Q2xhc3NMb2FkZXIoKSkpLnNldEZhaWxlZE9iamVjdChvYmopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbm90IGVuaGFuY2VkCisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYy1jYXN0IiwKKyAgICAgICAgICAgIEV4Y2VwdGlvbnMudG9TdHJpbmcob2JqKSkpLnNldEZhaWxlZE9iamVjdChvYmopOworICAgIH0KKworICAgIC8vLy8vLy8vLworICAgIC8vIFV0aWxzCisgICAgLy8vLy8vLy8vCisgICAgLyoqCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb250ZXh0IGlzIGNsb3NlZC4gIFRoZSBleGFjdCBtZXNzYWdlIGFuZAorICAgICAqIGNvbnRlbnQgb2YgdGhlIGV4Y2VwdGlvbiB2YXJpZXMgd2hldGhlciBUUkFDRSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRPcGVuKCkgeworICAgICAgICBpZiAoX2Nsb3NlZCkgeworICAgICAgICAgICAgaWYgKF9jbG9zZWRFeGNlcHRpb24gPT0gbnVsbCkgIC8vIFRSQUNFIG5vdCBlbmFibGVkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiY2xvc2VkLW5vdHJhY2UiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJjbG9zZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jbG9zZWRFeGNlcHRpb24pLnNldEZhdGFsKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0QWN0aXZlVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpID09IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9UcmFuc2FjdGlvbkV4Y2VwdGlvbihfbG9jLmdldCgibm90LWFjdGl2ZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBleGNlcHRpb24gaWYgYSB0cmFuc2FjdGlvbi1yZWxhdGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgYW5kCisgICAgICogbm8gdHJhbnNhY3Rpb24gaXMgYWN0aXZlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUcmFuc2FjdGlvbk9wZXJhdGlvbigpIHsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1hY3RpdmUiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKSB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19BQ1RJVkUpID09IDAgJiYgIV9ub250cmFuc1JlYWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJub24tdHJhbnMtcmVhZCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRXcml0ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0FDVElWRSkgPT0gMCAmJiAoIV9ub250cmFuc1dyaXRlCisgICAgICAgICAgICB8fCAoX2F1dG9EZXRhY2ggJiBERVRBQ0hfTk9OVFhSRUFEKSAhPSAwKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1RyYW5zYWN0aW9uRXhjZXB0aW9uKF9sb2MuZ2V0KCJ3cml0ZS1vcGVyYXRpb24iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIG9iamVjdCBub3QgZm91bmQgZXhjZXB0aW9uIGNvbnRhaW5pbmcgbmVzdGVkIGV4Y2VwdGlvbnMKKyAgICAgKiBmb3IgYWxsIG9mIHRoZSBnaXZlbiBmYWlsZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBuZXdPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAoQ29sbGVjdGlvbiBmYWlsZWQpIHsKKyAgICAgICAgVGhyb3dhYmxlW10gdCA9IG5ldyBUaHJvd2FibGVbZmFpbGVkLnNpemUoKV07CisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGZhaWxlZC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyBpZHgrKykKKyAgICAgICAgICAgIHRbaWR4XSA9IG5ldyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihpdHIubmV4dCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihmYWlsZWQsIHQpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRmluZENhbGxiYWNrcyBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgT2JqZWN0IHByb2Nlc3NBcmd1bWVudChPYmplY3Qgb2lkKSB7CisgICAgICAgIHJldHVybiBvaWQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBwcm9jZXNzUmV0dXJuKE9iamVjdCBvaWQsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIChzbSA9PSBudWxsKSA/IG51bGwgOiBzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBvZiBtYW5hZ2VkIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFuYWdlZENhY2hlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcCBfbWFpbjsgLy8gb2lkIC0+IHNtCisgICAgICAgIHByaXZhdGUgTWFwIF9jb25mbGljdHMgPSBudWxsOyAvLyBjb25mbGljdCBvaWQgLT4gbmV3IHNtCisgICAgICAgIHByaXZhdGUgTWFwIF9uZXdzID0gbnVsbDsgLy8gdG1wIGlkIC0+IG5ldyBzbQorICAgICAgICBwcml2YXRlIENvbGxlY3Rpb24gX2VtYmVkcyA9IG51bGw7IC8vIGVtYmVkZGVkL25vbi1wZXJzaXN0ZW50IHNtcworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IHByaW1hcnkgY2FjaGUgbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1hbmFnZWRDYWNoZShNYXAgY2FjaGUpIHsKKyAgICAgICAgICAgIF9tYWluID0gY2FjaGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG9pZCwgb3B0aW9uYWxseSBhbGxvd2luZworICAgICAgICAgKiBuZXcgaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0YXRlTWFuYWdlckltcGwgZ2V0QnlJZChPYmplY3Qgb2lkLCBib29sZWFuIGFsbG93TmV3KSB7CisgICAgICAgICAgICBpZiAob2lkID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIG1haW4gY2FjaGUgZm9yIG9pZAorICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBfbWFpbi5nZXQob2lkKTsKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20yOworICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGEgbmV3IGluc3RhbmNlLCB3ZSBrbm93IGl0J3MgdGhlIG9ubHkgbWF0Y2gsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBvdGhlciBwZXJzIGluc3RhbmNlcyBvdmVycmlkZSBuZXcgaW5zdGFuY2VzIGluIF9jYWNoZQorICAgICAgICAgICAgICAgIGlmIChzbS5pc05ldygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFsbG93TmV3KSA/IHNtIDogbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoIWFsbG93TmV3IHx8ICFzbS5pc0RlbGV0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNtOworCisgICAgICAgICAgICAgICAgLy8gc20gaXMgZGVsZXRlZDsgY2hlY2sgY29uZmxpY3QgY2FjaGUKKyAgICAgICAgICAgICAgICBpZiAoX2NvbmZsaWN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNtMiA9IChTdGF0ZU1hbmFnZXJJbXBsKSBfY29uZmxpY3RzLmdldChvaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc20yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc20yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCBzbSBpcyBudWxsIG9yIGRlbGV0ZWQ7IGNoZWNrIHRoZSBuZXcgY2FjaGUgZm9yCisgICAgICAgICAgICAvLyBhbnkgbWF0Y2hlcy4gdGhpcyBhbGxvd3MgdXMgdG8gbWF0Y2ggYXBwIGlkIG9iamVjdHMgdG8gbmV3CisgICAgICAgICAgICAvLyBpbnN0YW5jZXMgd2l0aG91dCBwZXJtYW5hbnQgb2lkcworICAgICAgICAgICAgaWYgKGFsbG93TmV3ICYmIF9uZXdzICE9IG51bGwgJiYgIV9uZXdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNtMiA9IChTdGF0ZU1hbmFnZXJJbXBsKSBfbmV3cy5nZXQob2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoc20yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIGEgbmV3IHN0YXRlIG1hbmFnZXIgaW5pdGlhbGl6ZXMgaXRzZWxmLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkKFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIGlmICghc20uaXNQZXJzaXN0ZW50KCkgfHwgc20uaXNFbWJlZGRlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKF9lbWJlZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2VtYmVkcyA9IG5ldyBSZWZlcmVuY2VIYXNoU2V0KFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisgICAgICAgICAgICAgICAgX2VtYmVkcy5hZGQoc20pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6aW5nIG5ldyBpbnN0YW5jZTsgcHV0IGluIG5ldyBjYWNoZSBiZWNhdXNlIHdvbid0IGhhdmUKKyAgICAgICAgICAgIC8vIHBlcm1hbmVudCBvaWQgeWV0CisgICAgICAgICAgICBpZiAoc20uaXNOZXcoKSkgeworICAgICAgICAgICAgICAgIGlmIChfbmV3cyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfbmV3cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgX25ld3MucHV0KHNtLmdldElkKCksIHNtKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyBwZXJzaXN0ZW50IGluc3RhbmNlOyBwdXQgaW4gbWFpbiBjYWNoZQorICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBvcmlnID0gKFN0YXRlTWFuYWdlckltcGwpIF9tYWluLnB1dAorICAgICAgICAgICAgICAgIChzbS5nZXRPYmplY3RJZCgpLCBzbSk7CisgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX21haW4ucHV0KHNtLmdldE9iamVjdElkKCksIG9yaWcpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJkdXAtbG9hZCIsCisgICAgICAgICAgICAgICAgICAgIHNtLmdldE9iamVjdElkKCksIEV4Y2VwdGlvbnMudG9TdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKG9yaWcuZ2V0TWFuYWdlZEluc3RhbmNlKCkpKSkuCisgICAgICAgICAgICAgICAgICAgIHNldEZhaWxlZE9iamVjdChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyIGZyb20gdGhlIGNhY2hlIHdoZW4gaXQgdHJhbnNpdGlvbnMKKyAgICAgICAgICogdG8gdHJhbnNpZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBpZCwgU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICAgICAgLy8gaWYgaXQgaGFzIGEgcGVybWFuZW50IG9pZCwgcmVtb3ZlIGZyb20gbWFpbiAvIGNvbmZsaWN0IGNhY2hlLAorICAgICAgICAgICAgLy8gZWxzZSByZW1vdmUgZnJvbSBlbWJlZGRlZC9ub250cmFucyBjYWNoZSwgYW5kIGlmIG5vdCB0aGVyZQorICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gbmV3IGNhY2hlCisgICAgICAgICAgICBPYmplY3Qgb3JpZzsKKyAgICAgICAgICAgIGlmIChzbS5nZXRPYmplY3RJZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcmlnID0gX21haW4ucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAob3JpZyAhPSBzbSkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgX21haW4ucHV0KGlkLCBvcmlnKTsgLy8gcHV0IGJhY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb25mbGljdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IF9jb25mbGljdHMucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnICE9IG51bGwgJiYgb3JpZyAhPSBzbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmxpY3RzLnB1dChpZCwgb3JpZyk7IC8vIHB1dCBiYWNrCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmICgoX2VtYmVkcyA9PSBudWxsIHx8ICFfZW1iZWRzLnJlbW92ZShzbSkpICYmIF9uZXdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcmlnID0gX25ld3MucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsICYmIG9yaWcgIT0gc20pCisgICAgICAgICAgICAgICAgICAgIF9uZXdzLnB1dChpZCwgb3JpZyk7IC8vIHB1dCBiYWNrCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gZW1iZWRkZWQgb3Igbm9ucGVyc2lzdGVudCBtYW5hZ2VkIGluc3RhbmNlIGhhcyBiZWVuIHBlcnNpc3RlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBlcnNpc3QoU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICAgICAgaWYgKF9lbWJlZHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZW1iZWRzLnJlbW92ZShzbSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQSBuZXcgaW5zdGFuY2UgaGFzIGp1c3QgYmVlbiBhc3NpZ25lZCBhIHBlcm1hbmVudCBvaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhc3NpZ25PYmplY3RJZChPYmplY3QgaWQsIFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIC8vIGlmIGFzc2lnbmluZyBvaWQsIHJlbW92ZSBmcm9tIG5ldyBjYWNoZSBhbmQgcHV0IGluIHByaW1hcnk7IG1heQorICAgICAgICAgICAgLy8gbm90IGJlIGluIG5ldyBjYWNoZSBpZiBhbm90aGVyIG5ldyBpbnN0YW5jZSBoYWQgc2FtZSBpZAorICAgICAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBvcmlnID0gKFN0YXRlTWFuYWdlckltcGwpIF9uZXdzLnJlbW92ZShpZCk7CisgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsICYmIG9yaWcgIT0gc20pCisgICAgICAgICAgICAgICAgX25ld3MucHV0KGlkLCBvcmlnKTsgLy8gcHV0IGJhY2sKKworICAgICAgICAgICAgLy8gcHV0IGluIG1haW4gY2FjaGUsIGJ1dCBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVwbGFjZSBhbm90aGVyCisgICAgICAgICAgICAvLyBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIG9pZAorICAgICAgICAgICAgb3JpZyA9IChTdGF0ZU1hbmFnZXJJbXBsKSBfbWFpbi5wdXQoc20uZ2V0T2JqZWN0SWQoKSwgc20pOworICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9tYWluLnB1dChzbS5nZXRPYmplY3RJZCgpLCBvcmlnKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9yaWcuaXNEZWxldGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJkdXAtb2lkLWFzc2lnbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRPYmplY3RJZCgpLCBFeGNlcHRpb25zLnRvU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGYWlsZWRPYmplY3Qoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworCisgICAgICAgICAgICAgICAgLy8gc2FtZSBvaWQgYXMgZGVsZXRlZCBpbnN0YW5jZTsgcHV0IGluIGNvbmZsaWN0IGNhY2hlCisgICAgICAgICAgICAgICAgaWYgKF9jb25mbGljdHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2NvbmZsaWN0cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgX2NvbmZsaWN0cy5wdXQoc20uZ2V0T2JqZWN0SWQoKSwgc20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbmV3IGluc3RhbmNlIGhhcyBjb21taXR0ZWQ7IHJlY2FjaGUgdW5kZXIgcGVybWFuZW50IG9pZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdE5ldyhPYmplY3QgaWQsIFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBpZCBkaWRuJ3QgY2hhbmdlLCB0aGUgaW5zdGFuY2Ugd2FzIGFscmVhZHkgYXNzaWduZWQgYW4KKyAgICAgICAgICAgIC8vIGlkLCBidXQgaXQgY291bGQgaGF2ZSBiZWVuIGluIGNvbmZsaWN0IGNhY2hlCisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIG9yaWc7CisgICAgICAgICAgICBpZiAoc20uZ2V0T2JqZWN0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgICAgIG9yaWcgPSAoX2NvbmZsaWN0cyA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgOiAoU3RhdGVNYW5hZ2VySW1wbCkgX2NvbmZsaWN0cy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIGlmIChvcmlnID09IHNtKSB7CisgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAoU3RhdGVNYW5hZ2VySW1wbCkgX21haW4ucHV0KGlkLCBzbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnICE9IG51bGwgJiYgIW9yaWcuaXNEZWxldGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tYWluLnB1dChzbS5nZXRPYmplY3RJZCgpLCBvcmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJkdXAtb2lkLWFzc2lnbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0T2JqZWN0SWQoKSwgRXhjZXB0aW9ucy50b1N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSkpKS5zZXRGYWlsZWRPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpLnNldEZhdGFsKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb2lkIGNoYW5nZWQsIHNvIGl0IG11c3QgcHJldmlvdXNseSBoYXZlIGJlZW4gYSBuZXcgaW5zdGFuY2UKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgYW4gYXNzaWduZWQgb2lkLiAgcmVtb3ZlIGl0IGZyb20gdGhlIG5ldyBjYWNoZTsgb2sgaWYKKyAgICAgICAgICAgIC8vIHdlIGVuZCB1cCByZW1vdmluZyBhbm90aGVyIGluc3RhbmNlIHdpdGggc2FtZSBpZAorICAgICAgICAgICAgaWYgKF9uZXdzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX25ld3MucmVtb3ZlKGlkKTsKKworICAgICAgICAgICAgLy8gYW5kIHB1dCBpbnRvIG1haW4gY2FjaGUgbm93IHRoYXQgaWQgaXMgYXNzc2lnbmVkCisgICAgICAgICAgICBvcmlnID0gKFN0YXRlTWFuYWdlckltcGwpIF9tYWluLnB1dChzbS5nZXRPYmplY3RJZCgpLCBzbSk7CisgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsICYmIG9yaWcgIT0gc20gJiYgIW9yaWcuaXNEZWxldGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBwdXQgYmFjayBvcmlnIGFuZCB0aHJvdyBlcnJvcgorICAgICAgICAgICAgICAgIF9tYWluLnB1dChzbS5nZXRPYmplY3RJZCgpLCBvcmlnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiZHVwLW9pZC1hc3NpZ24iLAorICAgICAgICAgICAgICAgICAgICBzbS5nZXRPYmplY3RJZCgpLCBFeGNlcHRpb25zLnRvU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSkpKS5zZXRGYWlsZWRPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIGFsbCBjYWNoZWQgcGVyc2lzdGVudCBvYmplY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gY29weSgpIHsKKyAgICAgICAgICAgIC8vIHByb3hpZXMgbm90IGluY2x1ZGVkIGhlcmUgYmVjYXVzZSB0aGUgc3RhdGUgbWFuYWdlciBpcyBhbHdheXMKKyAgICAgICAgICAgIC8vIHByZXNlbnQgaW4gb3RoZXIgY2FjaGVzIHRvbworCisgICAgICAgICAgICBpbnQgc2l6ZSA9IF9tYWluLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChfY29uZmxpY3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2l6ZSArPSBfY29uZmxpY3RzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChfbmV3cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNpemUgKz0gX25ld3Muc2l6ZSgpOworICAgICAgICAgICAgaWYgKF9lbWJlZHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzaXplICs9IF9lbWJlZHMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKworICAgICAgICAgICAgTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdChzaXplKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX21haW4udmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgY29weS5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgICAgICBpZiAoX2NvbmZsaWN0cyAhPSBudWxsICYmICFfY29uZmxpY3RzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9jb25mbGljdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgIGNvcHkuYWRkKGl0ci5uZXh0KCkpOworICAgICAgICAgICAgaWYgKF9uZXdzICE9IG51bGwgJiYgIV9uZXdzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9uZXdzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICAgICBjb3B5LmFkZChpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIGlmIChfZW1iZWRzICE9IG51bGwgJiYgIV9lbWJlZHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2VtYmVkcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAgICAgY29weS5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgICAgICByZXR1cm4gY29weTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciB0aGUgY2FjaGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIF9tYWluLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoX2NvbmZsaWN0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9jb25mbGljdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChfbmV3cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9uZXdzLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoX2VtYmVkcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9lbWJlZHMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciBuZXcgaW5zdGFuY2VzIHdpdGhvdXQgcGVybWFuZW50IG9pZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhck5ldygpIHsKKyAgICAgICAgICAgIGlmIChfbmV3cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9uZXdzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2FjdGlvbmFsIGNhY2hlIHRoYXQgaG9sZHMgc29mdCByZWZzIHRvIGNsZWFuIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUcmFuc2FjdGlvbmFsQ2FjaGUKKyAgICAgICAgaW1wbGVtZW50cyBTZXQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfb3JkZXJEaXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBTZXQgX2RpcnR5ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTZXQgX2NsZWFuID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVHJhbnNhY3Rpb25hbENhY2hlKGJvb2xlYW4gb3JkZXJEaXJ0eSkgeworICAgICAgICAgICAgX29yZGVyRGlydHkgPSBvcmRlckRpcnR5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBhIGNvcHkgb2YgYWxsIHRyYW5zYWN0aW9uYWwgc3RhdGUgbWFuYWdlcnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBjb3B5KCkgeworICAgICAgICAgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKworICAgICAgICAgICAgLy8gc2l6ZSBtYXkgbm90IGJlIGVudGlyZWx5IGFjY3VyYXRlIGR1ZSB0byByZWZzIGV4cGlyaW5nLCBzbworICAgICAgICAgICAgLy8gbWFudWFsbHkgY29weSBlYWNoIG9iamVjdDsgZG9lc24ndCBtYXR0ZXIgdGhpcyB3YXkgaWYgc2l6ZSB0b28KKyAgICAgICAgICAgIC8vIGJpZyBieSBzb21lCisgICAgICAgICAgICBMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KHNpemUoKSk7CisgICAgICAgICAgICBpZiAoX2RpcnR5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfZGlydHkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgIGNvcHkuYWRkKGl0ci5uZXh0KCkpOworICAgICAgICAgICAgaWYgKF9jbGVhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2NsZWFuLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICAgICBjb3B5LmFkZChpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBjb3B5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBhIGNvcHkgb2YgYWxsIGRpcnR5IHN0YXRlIG1hbmFnZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gY29weURpcnR5KCkgeworICAgICAgICAgICAgaWYgKF9kaXJ0eSA9PSBudWxsIHx8IF9kaXJ0eS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChfZGlydHkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zZmVyIHRoZSBnaXZlbiBpbnN0YW5jZSBmcm9tIHRoZSBkaXJ0eSBjYWNoZSB0byB0aGUgY2xlYW4gY2FjaGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaGVkKFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIGlmIChzbS5pc0RpcnR5KCkgJiYgX2RpcnR5ICE9IG51bGwgJiYgX2RpcnR5LnJlbW92ZShzbSkpCisgICAgICAgICAgICAgICAgYWRkQ2xlYW5JbnRlcm5hbChzbSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIHRoZSBnaXZlbiBpbnN0YW5jZSB0byB0aGUgY2xlYW4gY2FjaGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRDbGVhbihTdGF0ZU1hbmFnZXJJbXBsIHNtKSB7CisgICAgICAgICAgICBpZiAoYWRkQ2xlYW5JbnRlcm5hbChzbSkgJiYgX2RpcnR5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2RpcnR5LnJlbW92ZShzbSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkQ2xlYW5JbnRlcm5hbChTdGF0ZU1hbmFnZXJJbXBsIHNtKSB7CisgICAgICAgICAgICBpZiAoX2NsZWFuID09IG51bGwpCisgICAgICAgICAgICAgICAgX2NsZWFuID0gbmV3IFJlZmVyZW5jZUhhc2hTZXQoUmVmZXJlbmNlSGFzaFNldC5TT0ZUKTsKKyAgICAgICAgICAgIHJldHVybiBfY2xlYW4uYWRkKHNtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgdGhlIGdpdmVuIGluc3RhbmNlIHRvIHRoZSBkaXJ0eSBjYWNoZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERpcnR5KFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIGlmIChfZGlydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChfb3JkZXJEaXJ0eSkKKyAgICAgICAgICAgICAgICAgICAgX2RpcnR5ID0gTWFwQmFja2VkU2V0LmRlY29yYXRlKG5ldyBMaW5rZWRNYXAoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfZGlydHkgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9kaXJ0eS5hZGQoc20pKQorICAgICAgICAgICAgICAgIHJlbW92ZUNsZWFuSW50ZXJuYWwoc20pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gaW5zdGFuY2UgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUNsZWFuSW50ZXJuYWwoc20pCisgICAgICAgICAgICAgICAgfHwgKF9kaXJ0eSAhPSBudWxsICYmIF9kaXJ0eS5yZW1vdmUoc20pKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVDbGVhbkludGVybmFsKFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIHJldHVybiBfY2xlYW4gIT0gbnVsbCAmJiBfY2xlYW4ucmVtb3ZlKHNtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yQ2hhaW4gY2hhaW4gPSBuZXcgSXRlcmF0b3JDaGFpbigpOworICAgICAgICAgICAgaWYgKF9kaXJ0eSAhPSBudWxsICYmICFfZGlydHkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNoYWluLmFkZEl0ZXJhdG9yKF9kaXJ0eS5pdGVyYXRvcigpKTsKKyAgICAgICAgICAgIGlmIChfY2xlYW4gIT0gbnVsbCAmJiAhX2NsZWFuLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjaGFpbi5hZGRJdGVyYXRvcihfY2xlYW4uaXRlcmF0b3IoKSk7CisgICAgICAgICAgICByZXR1cm4gY2hhaW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKF9kaXJ0eSAhPSBudWxsICYmIF9kaXJ0eS5jb250YWlucyhvYmopKQorICAgICAgICAgICAgICAgIHx8IChfY2xlYW4gIT0gbnVsbCAmJiBfY2xlYW4uY29udGFpbnMob2JqKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY29sbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGl0ci5uZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgaWYgKF9kaXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9kaXJ0eS5jbGVhcigpOworICAgICAgICAgICAgaWYgKF9jbGVhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9jbGVhbi5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoX2RpcnR5ID09IG51bGwgfHwgX2RpcnR5LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAmJiAoX2NsZWFuID09IG51bGwgfHwgX2NsZWFuLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoX2RpcnR5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2l6ZSArPSBfZGlydHkuc2l6ZSgpOworICAgICAgICAgICAgaWYgKF9jbGVhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNpemUgKz0gX2NsZWFuLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmlxdWUgaWQgZm9yIHN0YXRlIG1hbmFnZXJzIG9mIG5ldyBkYXRhc3RvcmUgaW5zdGFuY2VzIHdpdGhvdXQgYXNzaWduZWQKKyAgICAgKiBvYmplY3QgaWRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRlTWFuYWdlcklkCisgICAgICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfUFJFRklYID0gIm9wZW5qcGFzbToiOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgX2dlbmVyYXRvciA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX2JoYXNoOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgX2lkOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RhdGVNYW5hZ2VySWQgbmV3SW5zdGFuY2UoQnJva2VyIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVNYW5hZ2VySWQoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoYiksIF9nZW5lcmF0b3IrKyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0YXRlTWFuYWdlcklkKGludCBiaGFzaCwgbG9uZyBpZCkgeworICAgICAgICAgICAgX2JoYXNoID0gYmhhc2g7CisgICAgICAgICAgICBfaWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdGF0ZU1hbmFnZXJJZChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKFNUUklOR19QUkVGSVgubGVuZ3RoKCkpOworICAgICAgICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICBfYmhhc2ggPSBJbnRlZ2VyLnBhcnNlSW50KHN0ci5zdWJzdHJpbmcoMCwgaWR4KSk7CisgICAgICAgICAgICBfaWQgPSBMb25nLnBhcnNlTG9uZyhzdHIuc3Vic3RyaW5nKGlkeCArIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTdGF0ZU1hbmFnZXJJZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgU3RhdGVNYW5hZ2VySWQgc2lkID0gKFN0YXRlTWFuYWdlcklkKSBvdGhlcjsKKyAgICAgICAgICAgIHJldHVybiBfYmhhc2ggPT0gc2lkLl9iaGFzaCAmJiBfaWQgPT0gc2lkLl9pZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgKF9pZCBeIChfaWQgPj4+IDMyKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFNUUklOR19QUkVGSVggKyBfYmhhc2ggKyAiOiIgKyBfaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIHR5cGUgdGhhdCBob2xkcyBzdGF0ZSBtYW5hZ2VycyBidXQgd2hvc2UgaW50ZXJmYWNlIGRlYWxzCisgICAgICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtYW5hZ2VkIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFuYWdlZE9iamVjdENvbGxlY3Rpb24KKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24geworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBfc3RhdGVzOworCisgICAgICAgIHB1YmxpYyBNYW5hZ2VkT2JqZWN0Q29sbGVjdGlvbihDb2xsZWN0aW9uIHN0YXRlcykgeworICAgICAgICAgICAgX3N0YXRlcyA9IHN0YXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFN0YXRlTWFuYWdlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gX3N0YXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfc3RhdGVzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBfaXRyID0gX3N0YXRlcy5pdGVyYXRvcigpOworCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9pdHIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoT3BlbkpQQVN0YXRlTWFuYWdlcikgX2l0ci5uZXh0KCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBKQ0EgaW50ZXJmYWNlcy4gVGhpcyBpcyBwbGFjZWQgaW4gYQorICAgICAqIHNlcGFyYXRlIGNsYXNzIHNvIHRoYXQgaXRzIG1ldGhvZHMgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgICAqIHBlcnNpc3RlbmNlIG1hbmFnZXIgQVBJcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEpDQUhlbHBlcgorICAgICAgICBpbXBsZW1lbnRzIEludGVyYWN0aW9uLCBSZXN1bHRTZXRJbmZvLCBDb25uZWN0aW9uTWV0YURhdGEgeworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEludGVyYWN0aW9uIGludGVyZmFjZQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXJXYXJuaW5ncygpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWNvcmQgZXhlY3V0ZShJbnRlcmFjdGlvblNwZWMgc3BlYywgUmVjb3JkIGlucHV0KQorICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oImV4ZWN1dGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSW50ZXJhY3Rpb25TcGVjIHNwZWMsIFJlY29yZCBpbnB1dCwKKyAgICAgICAgICAgIFJlY29yZCBvdXRwdXQpCisgICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiZXhlY3V0ZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBCcm9rZXJJbXBsLnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzb3VyY2VXYXJuaW5nIGdldFdhcm5pbmdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBSZXN1bHRTZXRJbmZvIGludGVyZmFjZQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVzQXJlRGV0ZWN0ZWQoaW50IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW5zZXJ0c0FyZURldGVjdGVkKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG90aGVyc0RlbGV0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG90aGVyc0luc2VydHNBcmVWaXNpYmxlKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG90aGVyc1VwZGF0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG93bkRlbGV0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG93bkluc2VydHNBcmVWaXNpYmxlKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG93blVwZGF0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVzdWx0U2V0VHlwZShpbnQgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc3VsdFR5cGVDb25jdXJyZW5jeShpbnQgdHlwZSwKKyAgICAgICAgICAgIGludCBjb25jdXJyZW5jeSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVzQXJlRGV0ZWN0ZWQoaW50IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIENvbm5lY3Rpb25NZXRhRGF0YSBpbnRlcmZhY2UKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFSVNQcm9kdWN0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfY29uZi5nZXRDb25uZWN0aW9uRHJpdmVyTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFSVNQcm9kdWN0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3VzZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9DbGVhckZpZWxkTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQ2xlYXJGaWVsZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTU3ODViCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQ2xlYXJGaWVsZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogRmllbGRNYW5hZ2VyIHRoYXQgcmVzcG9uZHMgdG8gYWxsIGZldGNoIG1ldGhvZHMgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZQorICogZm9yIHRoYXQgZmllbGQ7IHVzZWQgdG8gY2xlYXIgdGhlIHN0YXRlIG9mIG1hbmFnZWQgaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIENsZWFyRmllbGRNYW5hZ2VyCisgICAgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGVhckZpZWxkTWFuYWdlciBfc2luZ2xlID0gbmV3IENsZWFyRmllbGRNYW5hZ2VyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIENsZWFyRmllbGRNYW5hZ2VyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gX3NpbmdsZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xlYXJGaWVsZE1hbmFnZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZmV0Y2hCb29sZWFuRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBmZXRjaEJ5dGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgZmV0Y2hDaGFyRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIDBEOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBmZXRjaEZsb2F0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAwRjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGZldGNoSW50RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGZldGNoTG9uZ0ZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gMEw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZmV0Y2hTaG9ydEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGZldGNoU3RyaW5nRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Nvbm5lY3Rpb25SZXRhaW5Nb2Rlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQ29ubmVjdGlvblJldGFpbk1vZGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwZjZlMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Nvbm5lY3Rpb25SZXRhaW5Nb2Rlcy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBDb25uZWN0aW9uIHJldGFpbiBtb2RlIGNvbnN0YW50cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblJldGFpbk1vZGVzIHsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCBjb25uZWN0aW9ucyB3aWxsIGJlIG9idGFpbmVkIGFzIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05OX1JFVEFJTl9ERU1BTkQgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGNvbm5lY3Rpb25zIHdpbGwgYmUgcmV0YWluZWQgZm9yIHRoZSBsaWZlCisgICAgICogb2YgZWFjaCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05OX1JFVEFJTl9UUkFOUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgZWFjaCBicm9rZXIgd2lsbCByZXRhaW4gYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAqIHRoYXQgaXQgd2lsbCB1c2UgZm9yIGl0cyBsaWZlc3Bhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05OX1JFVEFJTl9BTFdBWVMgPSAyOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ0Jyb2tlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ0Jyb2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTczMTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nQnJva2VyLmphdmEKQEAgLTAsMCArMSwxNDEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5SZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbk1ldGFEYXRhOworaW1wb3J0IGphdmF4LnJlc291cmNlLmNjaS5JbnRlcmFjdGlvbjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuTG9jYWxUcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuUmVzdWx0U2V0SW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lZS5NYW5hZ2VkUnVudGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgcHVibGljIEFQSSBtZXRob2QsIGJlIHN1cmUgdG8gYWRkIGl0IHRvIAorLy8gSkRPIGFuZCBKUEEgZmFjYWRlcyEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIERlbGVnYXRpbmcgYnJva2VyIHRoYXQgY2FuIGFsc28gcGVyZm9ybSBleGNlcHRpb24gdHJhbnNsYXRpb24KKyAqIGZvciB1c2UgaW4gZmFjYWRlcy4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nQnJva2VyCisgICAgaW1wbGVtZW50cyBCcm9rZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9rZXIgX2Jyb2tlcjsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdCcm9rZXIgX2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIF90cmFuczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdCcm9rZXIoQnJva2VyIGJyb2tlcikgeworICAgICAgICB0aGlzKGJyb2tlciwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZSBhbmQgZXhjZXB0aW9uIHRyYW5zbGF0b3IuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdCcm9rZXIoQnJva2VyIGJyb2tlciwgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgdHJhbnMpIHsKKyAgICAgICAgX2Jyb2tlciA9IGJyb2tlcjsKKyAgICAgICAgaWYgKGJyb2tlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdCcm9rZXIpCisgICAgICAgICAgICBfZGVsID0gKERlbGVnYXRpbmdCcm9rZXIpIGJyb2tlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RlbCA9IG51bGw7CisgICAgICAgIF90cmFucyA9IHRyYW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXIgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfYnJva2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmF0aXZlIGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXIgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiAoX2RlbCA9PSBudWxsKSA/IF9icm9rZXIgOiBfZGVsLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdCcm9rZXIpCisgICAgICAgICAgICBvdGhlciA9ICgoRGVsZWdhdGluZ0Jyb2tlcikgb3RoZXIpLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBPcGVuSlBBIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiB0cmFuc2xhdGUoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICByZXR1cm4gKF90cmFucyA9PSBudWxsKSA/IHJlIDogX3RyYW5zLnRyYW5zbGF0ZShyZSk7CisgICAgfQorCisgICAgcHVibGljIEJyb2tlciBnZXRCcm9rZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBnZXRGZXRjaENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTG9ja01hbmFnZXIgZ2V0TG9ja01hbmFnZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRMb2NrTWFuYWdlcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERlbGVnYXRpbmdTdG9yZU1hbmFnZXIgZ2V0U3RvcmVNYW5hZ2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0U3RvcmVNYW5hZ2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldENvbm5lY3Rpb25Vc2VyTmFtZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUGFzc3dvcmQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRDb25uZWN0aW9uUGFzc3dvcmQoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmluZChPYmplY3Qgb2lkLCBib29sZWFuIHZhbGlkYXRlLCBGaW5kQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmZpbmQob2lkLCB2YWxpZGF0ZSwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZmluZEFsbChDb2xsZWN0aW9uIG9pZHMsIGJvb2xlYW4gdmFsaWRhdGUsCisgICAgICAgIEZpbmRDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZmluZEFsbChvaWRzLCB2YWxpZGF0ZSwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZpbmRDYWNoZWQoT2JqZWN0IG9pZCwgRmluZENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5maW5kQ2FjaGVkKG9pZCwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZpbmQoT2JqZWN0IG9pZCwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBCaXRTZXQgZXhjbHVkZSwKKyAgICAgICAgT2JqZWN0IGVkYXRhLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmZpbmQob2lkLCBmZXRjaCwgZXhjbHVkZSwgZWRhdGEsIGZsYWdzKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSBmaW5kQWxsKENvbGxlY3Rpb24gb2lkcywgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBCaXRTZXQgZXhjbHVkZSwgT2JqZWN0IGVkYXRhLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmZpbmRBbGwob2lkcywgZmV0Y2gsIGV4Y2x1ZGUsIGVkYXRhLCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW50SXRlcmF0b3IoQ2xhc3MgY2xzLCBib29sZWFuIHN1YnMsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgYm9vbGVhbiBpZ25vcmVDaGFuZ2VzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5leHRlbnRJdGVyYXRvcihjbHMsIHN1YnMsIGZldGNoLCBpZ25vcmVDaGFuZ2VzKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlKE9iamVjdCBvYmosIGJvb2xlYW4gZmdPbmx5LCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJldHJpZXZlKG9iaiwgZmdPbmx5LCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlQWxsKENvbGxlY3Rpb24gb2JqcywgYm9vbGVhbiBmZ09ubHksIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIucmV0cmlldmVBbGwob2JqcywgZmdPbmx5LCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGVtYmVkKE9iamVjdCBvYmosIE9iamVjdCBpZCwKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwgVmFsdWVNZXRhRGF0YSBvd25lck1ldGEpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmVtYmVkKG9iaiwgaWQsIG93bmVyLCBvd25lck1ldGEpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldE9iamVjdElkVHlwZShDbGFzcyBjbHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldE9iamVjdElkVHlwZShjbHMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdPYmplY3RJZChDbGFzcyBjbHMsIE9iamVjdCB2YWwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLm5ld09iamVjdElkKGNscywgdmFsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1hbmFnZWRPYmplY3RzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0TWFuYWdlZE9iamVjdHMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFRyYW5zYWN0aW9uYWxPYmplY3RzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0VHJhbnNhY3Rpb25hbE9iamVjdHMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBlbmRpbmdUcmFuc2FjdGlvbmFsT2JqZWN0cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldFBlbmRpbmdUcmFuc2FjdGlvbmFsT2JqZWN0cygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGlydHlPYmplY3RzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0RGlydHlPYmplY3RzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcmRlckRpcnR5T2JqZWN0cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldE9yZGVyRGlydHlPYmplY3RzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckRpcnR5T2JqZWN0cyhib29sZWFuIG9yZGVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldE9yZGVyRGlydHlPYmplY3RzKG9yZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBlcnNpc3RlZFR5cGVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0UGVyc2lzdGVkVHlwZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFVwZGF0ZWRUeXBlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldFVwZGF0ZWRUeXBlcygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGVsZXRlZFR5cGVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0RGVsZXRlZFR5cGVzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRTdGF0ZU1hbmFnZXIoT2JqZWN0IG9iaikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0U3RhdGVNYW5hZ2VyKG9iaik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExvY2tMZXZlbChPYmplY3Qgb2JqKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRMb2NrTGV2ZWwob2JqKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbihPYmplY3Qgb2JqKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRWZXJzaW9uKG9iaik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KE9iamVjdCBvYmopIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmlzRGlydHkob2JqKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbChPYmplY3Qgb2JqKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc1RyYW5zYWN0aW9uYWwob2JqKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudChPYmplY3Qgb2JqKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc1BlcnNpc3RlbnQob2JqKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KE9iamVjdCBvYmopIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmlzTmV3KG9iaik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iaikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuaXNEZWxldGVkKG9iaik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdElkKE9iamVjdCBvYmopIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldE9iamVjdElkKG9iaik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc01hbmFnZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuaXNBY3RpdmUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RvcmVBY3RpdmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc1N0b3JlQWN0aXZlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb25uZWN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuaGFzQ29ubmVjdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRDb25uZWN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9jaygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIubG9jaygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5sb2NrKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci51bmxvY2soKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJlZ2luT3BlcmF0aW9uKGJvb2xlYW4gcmVhZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuYmVnaW5PcGVyYXRpb24ocmVhZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmRPcGVyYXRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5lbmRPcGVyYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0QmVoYXZpb3IoT3BDYWxsYmFja3MgY2FsbCwKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgZXgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0SW1wbGljaXRCZWhhdmlvcihjYWxsLCBleCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VyRmFjdG9yeSBnZXRCcm9rZXJGYWN0b3J5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0QnJva2VyRmFjdG9yeSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUmV0YWluTW9kZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldENvbm5lY3Rpb25SZXRhaW5Nb2RlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTWFuYWdlZFJ1bnRpbWUgZ2V0TWFuYWdlZFJ1bnRpbWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRNYW5hZ2VkUnVudGltZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEludmVyc2VNYW5hZ2VyIGdldEludmVyc2VNYW5hZ2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0SW52ZXJzZU1hbmFnZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldE11bHRpdGhyZWFkZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRNdWx0aXRocmVhZGVkKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aXRocmVhZGVkKGJvb2xlYW4gbXVsdGkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0TXVsdGl0aHJlYWRlZChtdWx0aSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0SWdub3JlQ2hhbmdlcygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hhbmdlcyhib29sZWFuIGlnbm9yZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5zZXRJZ25vcmVDaGFuZ2VzKGlnbm9yZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb250cmFuc2FjdGlvbmFsUmVhZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldE5vbnRyYW5zYWN0aW9uYWxSZWFkKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsUmVhZChib29sZWFuIHJlYWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0Tm9udHJhbnNhY3Rpb25hbFJlYWQocmVhZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb250cmFuc2FjdGlvbmFsV3JpdGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXROb250cmFuc2FjdGlvbmFsV3JpdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vbnRyYW5zYWN0aW9uYWxXcml0ZShib29sZWFuIHdyaXRlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldE5vbnRyYW5zYWN0aW9uYWxXcml0ZSh3cml0ZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3RvcmVTdGF0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldFJlc3RvcmVTdGF0ZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzdG9yZVN0YXRlKGludCByZXN0b3JlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldFJlc3RvcmVTdGF0ZShyZXN0b3JlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXN0aWMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRPcHRpbWlzdGljKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpbWlzdGljKGJvb2xlYW4gb3B0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldE9wdGltaXN0aWMob3B0KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFJldGFpblN0YXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0UmV0YWluU3RhdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJldGFpblN0YXRlKGJvb2xlYW4gcmV0YWluKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldFJldGFpblN0YXRlKHJldGFpbik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEF1dG9DbGVhcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldEF1dG9DbGVhcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0NsZWFyKGludCBjbGVhcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5zZXRBdXRvQ2xlYXIoY2xlYXIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBdXRvRGV0YWNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0QXV0b0RldGFjaCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0RldGFjaChpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0QXV0b0RldGFjaChmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGV0YWNoKGludCBmbGFnLCBib29sZWFuIG9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldEF1dG9EZXRhY2goZmxhZywgb24pOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZXRhY2hTdGF0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldERldGFjaFN0YXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hTdGF0ZShpbnQgbW9kZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5zZXREZXRhY2hTdGF0ZShtb2RlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWROZXcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc0RldGFjaGVkTmV3KCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hlZE5ldyhib29sZWFuIGlzTmV3KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldERldGFjaGVkTmV3KGlzTmV3KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb25zKGJvb2xlYW4gc3luYykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5zZXRTeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbnMoc3luYyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFdmljdEZyb21EYXRhQ2FjaGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRFdmljdEZyb21EYXRhQ2FjaGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV2aWN0RnJvbURhdGFDYWNoZShib29sZWFuIGV2aWN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldEV2aWN0RnJvbURhdGFDYWNoZShldmljdCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQb3B1bGF0ZURhdGFDYWNoZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldFBvcHVsYXRlRGF0YUNhY2hlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3B1bGF0ZURhdGFDYWNoZShib29sZWFuIGNhY2hlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldFBvcHVsYXRlRGF0YUNhY2hlKGNhY2hlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGFyZ2VUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmlzTGFyZ2VUcmFuc2FjdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGFyZ2VUcmFuc2FjdGlvbihib29sZWFuIGxhcmdlVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0TGFyZ2VUcmFuc2FjdGlvbihsYXJnZVRyYW5zYWN0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5wdXRVc2VyT2JqZWN0KGtleSwgdmFsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlck9iamVjdChPYmplY3Qga2V5KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRVc2VyT2JqZWN0KGtleSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2FjdGlvbkxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5hZGRUcmFuc2FjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zYWN0aW9uTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJlbW92ZVRyYW5zYWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0VHJhbnNhY3Rpb25MaXN0ZW5lckNhbGxiYWNrTW9kZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25MaXN0ZW5lckNhbGxiYWNrTW9kZShpbnQgbW9kZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5zZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKG1vZGUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyLCBDbGFzc1tdIGNsYXNzZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIsIGNsYXNzZXMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRMaWZlY3ljbGVMaXN0ZW5lckNhbGxiYWNrTW9kZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUobW9kZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyIGdldExpZmVjeWNsZUV2ZW50TWFuYWdlcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldExpZmVjeWNsZUV2ZW50TWFuYWdlcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVnaW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmJlZ2luKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmNvbW1pdCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJvbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLnN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXRBbmRSZXN1bWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmNvbW1pdEFuZFJlc3VtZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tBbmRSZXN1bWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJvbGxiYWNrQW5kUmVzdW1lKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnNldFJvbGxiYWNrT25seSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sbGJhY2tPbmx5KFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5zZXRSb2xsYmFja09ubHkoY2F1c2UpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRSb2xsYmFja0NhdXNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Um9sbGJhY2tDYXVzZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Um9sbGJhY2tPbmx5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Um9sbGJhY2tPbmx5KCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlcG9pbnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuc2V0U2F2ZXBvaW50KG5hbWUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIucm9sbGJhY2tUb1NhdmVwb2ludCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludChTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5yb2xsYmFja1RvU2F2ZXBvaW50KG5hbWUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIucmVsZWFzZVNhdmVwb2ludCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludChTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5yZWxlYXNlU2F2ZXBvaW50KG5hbWUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVGbHVzaCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIucHJlRmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ2hhbmdlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIudmFsaWRhdGVDaGFuZ2VzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpblN0b3JlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5iZWdpblN0b3JlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwZXJzaXN0KE9iamVjdCBvYmosIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIucGVyc2lzdChvYmosIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGVyc2lzdEFsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIucGVyc2lzdEFsbChvYmpzLCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIHBlcnNpc3QoT2JqZWN0IG9iaiwgT2JqZWN0IGlkLAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5wZXJzaXN0KG9iaiwgaWQsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCBvYmosIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuZGVsZXRlKG9iaiwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmRlbGV0ZUFsbChvYmpzLCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5yZWxlYXNlKG9iaiwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5yZWxlYXNlQWxsKG9ianMsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJlZnJlc2gob2JqLCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnJlZnJlc2hBbGwob2JqcywgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdChPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmV2aWN0KG9iaiwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdEFsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuZXZpY3RBbGwob2JqcywgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdEFsbChPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmV2aWN0QWxsKGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoRXh0ZW50IGV4dGVudCwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5ldmljdEFsbChleHRlbnQsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBkZXRhY2goT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZGV0YWNoKG9iaiwgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZGV0YWNoQWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZGV0YWNoQWxsKG9ianMsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGV0YWNoQWxsKE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuZGV0YWNoQWxsKGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGV0YWNoQWxsKE9wQ2FsbGJhY2tzIGNhbGwsIGJvb2xlYW4gZmx1c2gpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuZGV0YWNoQWxsKGNhbGwsIGZsdXNoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgYXR0YWNoKE9iamVjdCBvYmosIGJvb2xlYW4gY29weU5ldywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuYXR0YWNoKG9iaiwgY29weU5ldywgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gYXR0YWNoQWxsKENvbGxlY3Rpb24gb2JqcywgYm9vbGVhbiBjb3B5TmV3LAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5hdHRhY2hBbGwob2JqcywgY29weU5ldywgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsKE9iamVjdCBwYywgYm9vbGVhbiB1cGRhdGVWZXJzaW9uLCBPcENhbGxiYWNrcworICAgICAgICBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLnRyYW5zYWN0aW9uYWwocGMsIHVwZGF0ZVZlcnNpb24sIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdHJhbnNhY3Rpb25hbEFsbChDb2xsZWN0aW9uIG9ianMsIGJvb2xlYW4gdXBkYXRlVmVyc2lvbiwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci50cmFuc2FjdGlvbmFsQWxsKG9ianMsIHVwZGF0ZVZlcnNpb24sIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm9udHJhbnNhY3Rpb25hbChPYmplY3QgcGMsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIubm9udHJhbnNhY3Rpb25hbChwYywgY2FsbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub250cmFuc2FjdGlvbmFsQWxsKENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5ub250cmFuc2FjdGlvbmFsQWxsKG9ianMsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEV4dGVudCBuZXdFeHRlbnQoQ2xhc3MgY2xzLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLm5ld0V4dGVudChjbHMsIHN1YnMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFF1ZXJ5IG5ld1F1ZXJ5KFN0cmluZyBsYW5ndWFnZSwgQ2xhc3MgY2xzLCBPYmplY3QgcXVlcnkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLm5ld1F1ZXJ5KGxhbmd1YWdlLCBjbHMsIHF1ZXJ5KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZ3VhZ2UsIE9iamVjdCBxdWVyeSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIubmV3UXVlcnkobGFuZ3VhZ2UsIHF1ZXJ5KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXEgZ2V0SWRlbnRpdHlTZXF1ZW5jZShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldElkZW50aXR5U2VxdWVuY2UobWV0YSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2VxIGdldFZhbHVlU2VxdWVuY2UoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmdldFZhbHVlU2VxdWVuY2UoZm1kKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IG9iaiwgaW50IGxldmVsLCBpbnQgdGltZW91dCwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5sb2NrKG9iaiwgbGV2ZWwsIHRpbWVvdXQsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9jayhPYmplY3Qgb2JqLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmxvY2sob2JqLCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvY2tBbGwoQ29sbGVjdGlvbiBvYmpzLCBpbnQgbGV2ZWwsIGludCB0aW1lb3V0LAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmxvY2tBbGwob2JqcywgbGV2ZWwsIHRpbWVvdXQsIGNhbGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9ja0FsbChDb2xsZWN0aW9uIG9ianMsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIubG9ja0FsbChvYmpzLCBjYWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbEFsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmNhbmNlbEFsbCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlydHlUeXBlKENsYXNzIGNscykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5kaXJ0eVR5cGUoY2xzKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc0Nsb3NlZCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZUludm9rZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5pc0Nsb3NlSW52b2tlZCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0T3BlbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuYXNzZXJ0T3BlbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0QWN0aXZlVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmFzc2VydEFjdGl2ZVRyYW5zYWN0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnROb250cmFuc2FjdGlvbmFsUmVhZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9icm9rZXIuYXNzZXJ0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydFdyaXRlT3BlcmF0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5hc3NlcnRXcml0ZU9wZXJhdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBTeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbXBsZXRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmJlZm9yZUNvbXBsZXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ29tcGxldGlvbihpbnQgc3RhdHVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmFmdGVyQ29tcGxldGlvbihzdGF0dXMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgQ29ubmVjdGlvbiBpbnRlcmZhY2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBDb25uZWN0aW9uTWV0YURhdGEgZ2V0TWV0YURhdGEoKQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJbnRlcmFjdGlvbiBjcmVhdGVJbnRlcmFjdGlvbigpCisgICAgICAgIHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5jcmVhdGVJbnRlcmFjdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExvY2FsVHJhbnNhY3Rpb24gZ2V0TG9jYWxUcmFuc2FjdGlvbigpCisgICAgICAgIHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXRJbmZvIGdldFJlc3VsdFNldEluZm8oKQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0UmVzdWx0U2V0SW5mbygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyBjbHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLm5ld0luc3RhbmNlKGNscyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RldGFjaGVkKE9iamVjdCBvYmopIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfYnJva2VyLmlzRGV0YWNoZWQob2JqKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RlbGVnYXRpbmdCcm9rZXJGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nQnJva2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDRkNDcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nQnJva2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgcHVibGljIEFQSSBtZXRob2QsIGJlIHN1cmUgdG8gYWRkIGl0IHRvIAorLy8gSkRPIGFuZCBKUEEgZmFjYWRlcyEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIERlbGVnYXRpbmcgYnJva2VyIGZhY3RvcnkgdGhhdCBjYW4gYWxzbyBwZXJmb3JtIGV4Y2VwdGlvbiB0cmFuc2xhdGlvbgorICogZm9yIHVzZSBpbiBmYWNhZGVzLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdCcm9rZXJGYWN0b3J5CisgICAgaW1wbGVtZW50cyBCcm9rZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgZmluYWwgQnJva2VyRmFjdG9yeSBfZmFjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdCcm9rZXJGYWN0b3J5IF9kZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciBfdHJhbnM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nQnJva2VyRmFjdG9yeShCcm9rZXJGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgdGhpcyhmYWN0b3J5LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlIGFuZCBleGNlcHRpb24gdHJhbnNsYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ0Jyb2tlckZhY3RvcnkoQnJva2VyRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciB0cmFucykgeworICAgICAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIGlmIChmYWN0b3J5IGluc3RhbmNlb2YgRGVsZWdhdGluZ0Jyb2tlckZhY3RvcnkpCisgICAgICAgICAgICBfZGVsID0gKERlbGVnYXRpbmdCcm9rZXJGYWN0b3J5KSBmYWN0b3J5OworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGVsID0gbnVsbDsKKyAgICAgICAgX3RyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3QgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIEJyb2tlckZhY3RvcnkgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnJva2VyRmFjdG9yeSBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX2ZhY3RvcnkgOiBfZGVsLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdCcm9rZXJGYWN0b3J5KQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdCcm9rZXJGYWN0b3J5KSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuZXF1YWxzKG90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIE9wZW5KUEEgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBSdW50aW1lRXhjZXB0aW9uIHRyYW5zbGF0ZShSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIHJldHVybiAoX3RyYW5zID09IG51bGwpID8gcmUgOiBfdHJhbnMudHJhbnNsYXRlKHJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnkucHV0VXNlck9iamVjdChrZXksIHZhbCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmdldFVzZXJPYmplY3Qoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCcm9rZXIgbmV3QnJva2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5Lm5ld0Jyb2tlcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJyb2tlciBuZXdCcm9rZXIoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzLCBib29sZWFuIG1hbmFnZWQsCisgICAgICAgIGludCBjb25uUmV0YWluTW9kZSwgYm9vbGVhbiBmaW5kRXhpc3RpbmcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeS5uZXdCcm9rZXIodXNlciwgcGFzcywgbWFuYWdlZCwgY29ublJldGFpbk1vZGUsCisgICAgICAgICAgICAgICAgZmluZEV4aXN0aW5nKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lciwgQ2xhc3NbXSBjbGFzc2VzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmFjdG9yeS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lciwgY2xhc3Nlcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mYWN0b3J5LnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZhY3RvcnkuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmlzQ2xvc2VkKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZhY3RvcnkubG9jaygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5sb2NrKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZhY3RvcnkudW5sb2NrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nRXh0ZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nRXh0ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjNjdhNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RlbGVnYXRpbmdFeHRlbnQuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3I7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogd2hlbiBhZGRpbmcgYSBwdWJsaWMgQVBJIG1ldGhvZCwgYmUgc3VyZSB0byBhZGQgaXQgdG8gCisvLyBKRE8gYW5kIEpQQSBmYWNhZGVzIQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRGVsZWdhdGluZyBleHRlbnQgdGhhdCBhbHNvIGNhbiBwZXJmb3JtIGV4Y2VwdGlvbiB0cmFuc2xhdGlvbiBmb3IgdXNlCisgKiBpbiBmYWNhZGVzLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdFeHRlbnQKKyAgICBpbXBsZW1lbnRzIEV4dGVudCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4dGVudCBfZXh0ZW50OworICAgIHByaXZhdGUgZmluYWwgRGVsZWdhdGluZ0V4dGVudCBfZGVsOworICAgIHByaXZhdGUgZmluYWwgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgX3RyYW5zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ0V4dGVudChFeHRlbnQgZXh0ZW50KSB7CisgICAgICAgIHRoaXMoZXh0ZW50LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlIGFuZCBleGNlcHRpb24gdHJhbnNsYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ0V4dGVudChFeHRlbnQgZXh0ZW50LCBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciB0cmFucykgeworICAgICAgICBfZXh0ZW50ID0gZXh0ZW50OworICAgICAgICBpZiAoZXh0ZW50IGluc3RhbmNlb2YgRGVsZWdhdGluZ0V4dGVudCkKKyAgICAgICAgICAgIF9kZWwgPSAoRGVsZWdhdGluZ0V4dGVudCkgZXh0ZW50OworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGVsID0gbnVsbDsKKyAgICAgICAgX3RyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3QgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIEV4dGVudCBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9leHRlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYXRpdmUgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIEV4dGVudCBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX2V4dGVudCA6IF9kZWwuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ0V4dGVudCkKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nRXh0ZW50KSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuZXF1YWxzKG90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIE9wZW5KUEEgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBSdW50aW1lRXhjZXB0aW9uIHRyYW5zbGF0ZShSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIHJldHVybiAoX3RyYW5zID09IG51bGwpID8gcmUgOiBfdHJhbnMudHJhbnNsYXRlKHJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RWxlbWVudFR5cGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2V4dGVudC5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViY2xhc3NlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZXh0ZW50Lmhhc1N1YmNsYXNzZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCcm9rZXIgZ2V0QnJva2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9leHRlbnQuZ2V0QnJva2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGdldEZldGNoQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZXh0ZW50LmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlQ2hhbmdlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZXh0ZW50LmdldElnbm9yZUNoYW5nZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBpZ25vcmVDYWNoZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2V4dGVudC5zZXRJZ25vcmVDaGFuZ2VzKGlnbm9yZUNhY2hlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGxpc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2V4dGVudC5saXN0KCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2V4dGVudC5pdGVyYXRvcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZXh0ZW50LmNsb3NlQWxsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2V4dGVudC5sb2NrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZXh0ZW50LnVubG9jaygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTcyY2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nRmV0Y2hDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3I7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogd2hlbiBhZGRpbmcgYSBwdWJsaWMgQVBJIG1ldGhvZCwgYmUgc3VyZSB0byBhZGQgaXQgdG8gCisvLyBKRE8gYW5kIEpQQSBmYWNhZGVzIQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRGVsZWdhdGluZyBmZXRjaCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGFsc28gcGVyZm9ybSBleGNlcHRpb24KKyAqIHRyYW5zbGF0aW9uIGZvciB1c2UgaW4gZmFjYWRlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbgorICAgIGltcGxlbWVudHMgRmV0Y2hDb25maWd1cmF0aW9uIHsKKworICAgIHByaXZhdGUgZmluYWwgRmV0Y2hDb25maWd1cmF0aW9uIF9mZXRjaDsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24gX2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIF90cmFuczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24oRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHRoaXMoZmV0Y2gsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUgYW5kIGV4Y2VwdGlvbiB0cmFuc2xhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nRmV0Y2hDb25maWd1cmF0aW9uKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgdHJhbnMpIHsKKyAgICAgICAgX2ZldGNoID0gZmV0Y2g7CisgICAgICAgIGlmIChmZXRjaCBpbnN0YW5jZW9mIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICBfZGVsID0gKERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24pIGZldGNoOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGVsID0gbnVsbDsKKyAgICAgICAgX3RyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3QgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGdldElubmVybW9zdERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gKF9kZWwgPT0gbnVsbCkgPyBfZmV0Y2ggOiBfZGVsLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICBvdGhlciA9ICgoRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbikgb3RoZXIpLgorICAgICAgICAgICAgICAgIGdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBPcGVuSlBBIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiB0cmFuc2xhdGUoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICByZXR1cm4gKF90cmFucyA9PSBudWxsKSA/IHJlIDogX3RyYW5zLnRyYW5zbGF0ZShyZSk7CisgICAgfQorCisgICAgcHVibGljIFN0b3JlQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRDb250ZXh0KCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5zZXRDb250ZXh0KGN0eCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoQmF0Y2hTaXplKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRGZXRjaEJhdGNoU2l6ZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRGZXRjaEJhdGNoU2l6ZShpbnQgZmV0Y2hCYXRjaFNpemUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5zZXRGZXRjaEJhdGNoU2l6ZShmZXRjaEJhdGNoU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4RmV0Y2hEZXB0aCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZmV0Y2guZ2V0TWF4RmV0Y2hEZXB0aCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRNYXhGZXRjaERlcHRoKGludCBkZXB0aCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZldGNoLnNldE1heEZldGNoRGVwdGgoZGVwdGgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGdldFJvb3RJbnN0YW5jZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLmdldFJvb3RJbnN0YW5jZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0Um9vdEluc3RhbmNlcyhDb2xsZWN0aW9uIHJvb3RzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmV0Y2guc2V0Um9vdEluc3RhbmNlcyhyb290cyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0Um9vdENsYXNzZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLmdldFJvb3RDbGFzc2VzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldFJvb3RDbGFzc2VzKENvbGxlY3Rpb24gcm9vdHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5zZXRSb290Q2xhc3Nlcyhyb290cyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFF1ZXJ5Q2FjaGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLmdldFF1ZXJ5Q2FjaGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0UXVlcnlDYWNoZShib29sZWFuIGNhY2hlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmV0Y2guc2V0UXVlcnlDYWNoZShjYWNoZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRGbHVzaEJlZm9yZVF1ZXJpZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0Rmx1c2hCZWZvcmVRdWVyaWVzKGludCBmbHVzaCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZldGNoLnNldEZsdXNoQmVmb3JlUXVlcmllcyhmbHVzaCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0RmV0Y2hHcm91cHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLmdldEZldGNoR3JvdXBzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGZXRjaEdyb3VwKFN0cmluZyBncm91cCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5oYXNGZXRjaEdyb3VwKGdyb3VwKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gYWRkRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5hZGRGZXRjaEdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBhZGRGZXRjaEdyb3VwcyhDb2xsZWN0aW9uIGdyb3VwcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZldGNoLmFkZEZldGNoR3JvdXBzKGdyb3Vwcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gcmVtb3ZlRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5yZW1vdmVGZXRjaEdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiByZW1vdmVGZXRjaEdyb3VwcyhDb2xsZWN0aW9uIGdyb3VwcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZldGNoLnJlbW92ZUZldGNoR3JvdXBzKGdyb3Vwcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gY2xlYXJGZXRjaEdyb3VwcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5jbGVhckZldGNoR3JvdXBzKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gcmVzZXRGZXRjaEdyb3VwcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5yZXNldEZldGNoR3JvdXBzKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0RmllbGRzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRGaWVsZHMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKFN0cmluZyBmaWVsZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5oYXNGaWVsZChmaWVsZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGFkZEZpZWxkKFN0cmluZyBmaWVsZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZldGNoLmFkZEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBhZGRGaWVsZHMoQ29sbGVjdGlvbiBmaWVsZHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5hZGRGaWVsZHMoZmllbGRzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiByZW1vdmVGaWVsZChTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5yZW1vdmVGaWVsZChmaWVsZCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gcmVtb3ZlRmllbGRzKENvbGxlY3Rpb24gZmllbGRzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmV0Y2gucmVtb3ZlRmllbGRzKGZpZWxkcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gY2xlYXJGaWVsZHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmV0Y2guY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMb2NrVGltZW91dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZmV0Y2guZ2V0TG9ja1RpbWVvdXQoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0TG9ja1RpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5zZXRMb2NrVGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZWFkTG9ja0xldmVsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRSZWFkTG9ja0xldmVsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldFJlYWRMb2NrTGV2ZWwoaW50IGxldmVsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmV0Y2guc2V0UmVhZExvY2tMZXZlbChsZXZlbCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V3JpdGVMb2NrTGV2ZWwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLmdldFdyaXRlTG9ja0xldmVsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldFdyaXRlTG9ja0xldmVsKGludCBsZXZlbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZldGNoLnNldFdyaXRlTG9ja0xldmVsKGxldmVsKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdExpc3QgbmV3UmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciByb3ApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZmV0Y2gubmV3UmVzdWx0TGlzdChyb3ApOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weShGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5jb3B5KGZldGNoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLmNsb25lKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaW50KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5zZXRIaW50KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SGludChTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRIaW50KG5hbWUpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworCQl9CisJfQorCisgICAgcHVibGljIGludCByZXF1aXJlc0ZldGNoKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLnJlcXVpcmVzRmV0Y2goZm1kKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzTG9hZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZmV0Y2gucmVxdWlyZXNMb2FkKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHRyYXZlcnNlKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2ZldGNoLnRyYXZlcnNlKGZtZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0gCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9jaygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9mZXRjaC5sb2NrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisJCX0KKwl9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZmV0Y2gudW5sb2NrKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nUXVlcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RlbGVnYXRpbmdRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTlhMzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nUXVlcnkuamF2YQpAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGlua2VkTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5SdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvcjsKKworLyoqCisgKiBEZWxlZ2F0aW5nIHF1ZXJ5IHRoYXQgY2FuIGFsc28gcGVyZm9ybSBleGNlcHRpb24gdHJhbnNsYXRpb24KKyAqIGZvciB1c2UgaW4gZmFjYWRlcy4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nUXVlcnkKKyAgICBpbXBsZW1lbnRzIFF1ZXJ5IHsKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBOT1RFOiB3aGVuIGFkZGluZyBhIHB1YmxpYyBBUEkgbWV0aG9kLCBiZSBzdXJlIHRvIGFkZCBpdCB0bworICAgIC8vIEpETyBhbmQgSlBBIGZhY2FkZXMhCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIGZpbmFsIFF1ZXJ5IF9xdWVyeTsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdRdWVyeSBfZGVsOworICAgIHByaXZhdGUgZmluYWwgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgX3RyYW5zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ1F1ZXJ5KFF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHRoaXMocXVlcnksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUgYW5kIGV4Y2VwdGlvbiB0cmFuc2xhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nUXVlcnkoUXVlcnkgcXVlcnksIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIHRyYW5zKSB7CisgICAgICAgIF9xdWVyeSA9IHF1ZXJ5OworICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nUXVlcnkpCisgICAgICAgICAgICBfZGVsID0gKERlbGVnYXRpbmdRdWVyeSkgcXVlcnk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kZWwgPSBudWxsOworICAgICAgICBfdHJhbnMgPSB0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpcmVjdCBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnkgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYXRpdmUgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5IGdldElubmVybW9zdERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gKF9kZWwgPT0gbnVsbCkgPyBfcXVlcnkgOiBfZGVsLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdRdWVyeSkKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nUXVlcnkpIG90aGVyKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5lcXVhbHMob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgT3BlbkpQQSBleGNlcHRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFJ1bnRpbWVFeGNlcHRpb24gdHJhbnNsYXRlKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgcmV0dXJuIChfdHJhbnMgPT0gbnVsbCkgPyByZSA6IF90cmFucy50cmFuc2xhdGUocmUpOworICAgIH0KKworICAgIHB1YmxpYyBCcm9rZXIgZ2V0QnJva2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRCcm9rZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBRdWVyeSBnZXRRdWVyeSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0b3JlQ29udGV4dCBnZXRTdG9yZUNvbnRleHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldFN0b3JlQ29udGV4dCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPcGVyYXRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldE9wZXJhdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0TGFuZ3VhZ2UoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRJZ25vcmVDaGFuZ2VzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldENvbXBpbGF0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRDb21waWxhdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0QWxpYXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9qZWN0aW9uQWxpYXNlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0UHJvamVjdGlvbkFsaWFzZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzc1tdIGdldFByb2plY3Rpb25UeXBlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0UHJvamVjdGlvblR5cGVzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuaXNBZ2dyZWdhdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0dyb3VwaW5nKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5oYXNHcm91cGluZygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGFbXSBnZXRBY2Nlc3NQYXRoTWV0YURhdGFzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRBY2Nlc3NQYXRoTWV0YURhdGFzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRmlsdGVyTGlzdGVuZXIgZ2V0RmlsdGVyTGlzdGVuZXIoU3RyaW5nIHRhZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRGaWx0ZXJMaXN0ZW5lcih0YWcpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEFnZ3JlZ2F0ZUxpc3RlbmVyIGdldEFnZ3JlZ2F0ZUxpc3RlbmVyKFN0cmluZyB0YWcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0QWdncmVnYXRlTGlzdGVuZXIodGFnKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEZpbHRlckxpc3RlbmVycygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0RmlsdGVyTGlzdGVuZXJzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZ2dyZWdhdGVMaXN0ZW5lcnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldEFnZ3JlZ2F0ZUxpc3RlbmVycygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2FuZGlkYXRlQ29sbGVjdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0Q2FuZGlkYXRlQ29sbGVjdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldENhbmRpZGF0ZVR5cGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldENhbmRpZGF0ZVR5cGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N1YmNsYXNzZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5Lmhhc1N1YmNsYXNzZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbmRpZGF0ZVR5cGUoQ2xhc3MgY2xzLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS5zZXRDYW5kaWRhdGVUeXBlKGNscywgc3Vicyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5pc1JlYWRPbmx5KCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuc2V0UmVhZE9ubHkocmVhZE9ubHkpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFJlc3VsdE1hcHBpbmdTY29wZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0UmVzdWx0TWFwcGluZ1Njb3BlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdE1hcHBpbmdOYW1lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRSZXN1bHRNYXBwaW5nTmFtZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0TWFwcGluZyhDbGFzcyBzY29wZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS5zZXRSZXN1bHRNYXBwaW5nKHNjb3BlLCBuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVW5pcXVlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5pc1VuaXF1ZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlKGJvb2xlYW4gdW5pcXVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuc2V0VW5pcXVlKHVuaXF1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0VHlwZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0UmVzdWx0VHlwZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0VHlwZShDbGFzcyBjbHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS5zZXRSZXN1bHRUeXBlKGNscyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFJhbmdlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRTdGFydFJhbmdlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRFbmRSYW5nZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0RW5kUmFuZ2UoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJhbmdlKGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuc2V0UmFuZ2Uoc3RhcnQsIGVuZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlckRlY2xhcmF0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRQYXJhbWV0ZXJEZWNsYXJhdGlvbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExpbmtlZE1hcCBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0VXBkYXRlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0VXBkYXRlcygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVjbGFyZVBhcmFtZXRlcnMoU3RyaW5nIHBhcmFtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3F1ZXJ5LmRlY2xhcmVQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTnVtYmVyIGRlbGV0ZUluTWVtb3J5KFN0b3JlUXVlcnkgcSwgU3RvcmVRdWVyeS5FeGVjdXRvciBleCwgCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5kZWxldGVJbk1lbW9yeShxLCBleCwgcGFyYW1zKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXIgdXBkYXRlSW5NZW1vcnkoU3RvcmVRdWVyeSBxLCBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4LCAKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LnVwZGF0ZUluTWVtb3J5KHEsIGV4LCBwYXJhbXMpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nW10gaW1wb3J0cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5jbGFzc0Zvck5hbWUobmFtZSwgaW1wb3J0cyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3F1ZXJ5LmxvY2soKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVubG9jaygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS51bmxvY2soKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlckxpc3RlbmVyKEZpbHRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuYWRkRmlsdGVyTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyTGlzdGVuZXIoRmlsdGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS5yZW1vdmVGaWx0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBZ2dyZWdhdGVMaXN0ZW5lcihBZ2dyZWdhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3F1ZXJ5LmFkZEFnZ3JlZ2F0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFnZ3JlZ2F0ZUxpc3RlbmVyKEFnZ3JlZ2F0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkucmVtb3ZlQWdncmVnYXRlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEV4dGVudCBnZXRDYW5kaWRhdGVFeHRlbnQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldENhbmRpZGF0ZUV4dGVudCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuZGlkYXRlRXh0ZW50KEV4dGVudCBleHRlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS5zZXRDYW5kaWRhdGVFeHRlbnQoZXh0ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbmRpZGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuc2V0Q2FuZGlkYXRlQ29sbGVjdGlvbihjb2xsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuY29tcGlsZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBleGVjdXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFwIHBhcmFtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5leGVjdXRlKHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmV4ZWN1dGUocGFyYW1zKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBsb25nIGRlbGV0ZUFsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZGVsZXRlQWxsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBkZWxldGVBbGwoT2JqZWN0W10gcGFyYW1ldGVycykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5kZWxldGVBbGwocGFyYW1ldGVycyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBkZWxldGVBbGwoTWFwIHBhcmFtZXRlck1hcCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5kZWxldGVBbGwocGFyYW1ldGVyTWFwKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBsb25nIHVwZGF0ZUFsbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkudXBkYXRlQWxsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB1cGRhdGVBbGwoT2JqZWN0W10gcGFyYW1ldGVycykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS51cGRhdGVBbGwocGFyYW1ldGVycyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB1cGRhdGVBbGwoTWFwIHBhcmFtZXRlck1hcCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS51cGRhdGVBbGwocGFyYW1ldGVyTWFwKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlQWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3F1ZXJ5LmNsb3NlQWxsKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZVJlc291cmNlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9xdWVyeS5jbG9zZVJlc291cmNlcygpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldERhdGFTdG9yZUFjdGlvbnMoTWFwIHBhcmFtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXREYXRhU3RvcmVBY3Rpb25zKHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRRdWVyeShPYmplY3QgcXVlcnkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuc2V0UXVlcnkocXVlcnkpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hhbmdlcyhib29sZWFuIGlnbm9yZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3F1ZXJ5LnNldElnbm9yZUNoYW5nZXMoaWdub3JlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE9wZW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuYXNzZXJ0T3BlbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm90UmVhZE9ubHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdFNlcmlhbGl6ZWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcXVlcnkuYXNzZXJ0Tm90U2VyaWFsaXplZCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ1Jlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJhMjVkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ1Jlc3VsdExpc3QuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yOworCisvKioKKyAqIERlbGVnYXRpbmcgcmVzdWx0IGxpc3QgdGhhdCBjYW4gYWxzbyBwZXJmb3JtIGV4Y2VwdGlvbiB0cmFuc2xhdGlvbgorICogZm9yIHVzZSBpbiBmYWNhZGVzLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdSZXN1bHRMaXN0CisgICAgaW1wbGVtZW50cyBSZXN1bHRMaXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgUmVzdWx0TGlzdCBfZGVsOworICAgIHByaXZhdGUgZmluYWwgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgX3RyYW5zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ1Jlc3VsdExpc3QoUmVzdWx0TGlzdCBsaXN0KSB7CisgICAgICAgIHRoaXMobGlzdCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZSBhbmQgZXhjZXB0aW9uIHRyYW5zbGF0b3IuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdSZXN1bHRMaXN0KFJlc3VsdExpc3QgbGlzdCwKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgdHJhbnMpIHsKKyAgICAgICAgX2RlbCA9IGxpc3Q7CisgICAgICAgIF90cmFucyA9IHRyYW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBSZXN1bHRMaXN0IGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX2RlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0TGlzdCBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWwgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nUmVzdWx0TGlzdAorICAgICAgICAgICAgPyAoKERlbGVnYXRpbmdSZXN1bHRMaXN0KSBfZGVsKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIDogX2RlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgZGVsZWdhdGUsIHdoaWNoIG1heSBpbiB0dXJuIHdyaXRlIGEgbm9ybWFsIGxpc3QuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKQorICAgICAgICB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kZWw7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdSZXN1bHRMaXN0KQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdSZXN1bHRMaXN0KSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIE9wZW5KUEEgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBSdW50aW1lRXhjZXB0aW9uIHRyYW5zbGF0ZShSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIHJldHVybiAoX3RyYW5zID09IG51bGwpID8gcmUgOiBfdHJhbnMudHJhbnNsYXRlKHJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyT3BlbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLmlzUHJvdmlkZXJPcGVuKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9kZWwuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWwuaXNDbG9zZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnNpemUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbC5pc0VtcHR5KCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWwuY29udGFpbnMobyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnRvQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnRvQXJyYXkoYSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLmFkZChvKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWwucmVtb3ZlKG8pOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbC5jb250YWluc0FsbChjKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLmFkZEFsbChjKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWwuYWRkQWxsKGluZGV4LCBjKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnJlbW92ZUFsbChjKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnJldGFpbkFsbChjKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RlbC5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbC5nZXQoaW5kZXgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWwuc2V0KGluZGV4LCBlbGVtZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGVsLmFkZChpbmRleCwgZWxlbWVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnJlbW92ZShpbmRleCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLmluZGV4T2Yobyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbC5sYXN0SW5kZXhPZihvKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWxlZ2F0aW5nTGlzdEl0ZXJhdG9yKF9kZWwubGlzdEl0ZXJhdG9yKCkpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERlbGVnYXRpbmdMaXN0SXRlcmF0b3IoX2RlbC5saXN0SXRlcmF0b3IoaW5kZXgpKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRpbmcgaXRlcmF0b3IgdGhhdCBhbHNvIHBlcmZvcm1zIGV4Y2VwdGlvbiB0cmFuc2xhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0xpc3RJdGVyYXRvcgorICAgICAgICBpbXBsZW1lbnRzIExpc3RJdGVyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3IgX2RlbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEZWxlZ2F0aW5nTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvciBpdCkgeworICAgICAgICAgICAgX2RlbCA9IGl0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgZGlyZWN0IGRlbGVnYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgbmF0aXZlIGRlbGVnYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsIGluc3RhbmNlb2YgRGVsZWdhdGluZ0xpc3RJdGVyYXRvcgorICAgICAgICAgICAgICAgID8gKChEZWxlZ2F0aW5nTGlzdEl0ZXJhdG9yKSBfZGVsKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIDogX2RlbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ0xpc3RJdGVyYXRvcikKKyAgICAgICAgICAgICAgICBvdGhlciA9ICgoRGVsZWdhdGluZ0xpc3RJdGVyYXRvcikgb3RoZXIpLgorICAgICAgICAgICAgICAgICAgICBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5lcXVhbHMob3RoZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RlbC5oYXNOZXh0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWwubmV4dCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWwuaGFzUHJldmlvdXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWwucHJldmlvdXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBfZGVsLm5leHRJbmRleCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBfZGVsLnByZXZpb3VzSW5kZXgoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfZGVsLnJlbW92ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX2RlbC5zZXQobyk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfZGVsLmFkZChvKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUgKHJlKTsKKwkJCX0KKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ1NlcS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ1NlcS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWQwZmIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZWxlZ2F0aW5nU2VxLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3I7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogd2hlbiBhZGRpbmcgYSBwdWJsaWMgQVBJIG1ldGhvZCwgYmUgc3VyZSB0byBhZGQgaXQgdG8gCisvLyBKRE8gYW5kIEpQQSBmYWNhZGVzIQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRGVsZWdhdGluZyBzZXF1ZW5jZSB0aGF0IGNhbiBhbHNvIHBlcmZvcm0gZXhjZXB0aW9uIHRyYW5zbGF0aW9uIGZvciB1c2UKKyAqIGluIGZhY2FkZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdTZXEKKyAgICBpbXBsZW1lbnRzIFNlcSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlcSBfc2VxOworICAgIHByaXZhdGUgZmluYWwgRGVsZWdhdGluZ1NlcSBfZGVsOworICAgIHByaXZhdGUgZmluYWwgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgX3RyYW5zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ1NlcShTZXEgc2VxKSB7CisgICAgICAgIHRoaXMoc2VxLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlIGFuZCBleGNlcHRpb24gdHJhbnNsYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ1NlcShTZXEgc2VxLCBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciB0cmFucykgeworICAgICAgICBfc2VxID0gc2VxOworICAgICAgICBpZiAoc2VxIGluc3RhbmNlb2YgRGVsZWdhdGluZ1NlcSkKKyAgICAgICAgICAgIF9kZWwgPSAoRGVsZWdhdGluZ1NlcSkgc2VxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGVsID0gbnVsbDsKKyAgICAgICAgX3RyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3QgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIFNlcSBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zZXE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYXRpdmUgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIFNlcSBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX3NlcSA6IF9kZWwuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1NlcSkKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nU2VxKSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuZXF1YWxzKG90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIE9wZW5KUEEgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBSdW50aW1lRXhjZXB0aW9uIHRyYW5zbGF0ZShSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIHJldHVybiAoX3RyYW5zID09IG51bGwpID8gcmUgOiBfdHJhbnMudHJhbnNsYXRlKHJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc2VxLnNldFR5cGUodHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoU3RvcmVDb250ZXh0IGN0eCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3NlcS5uZXh0KGN0eCwgbWV0YSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGN1cnJlbnQoU3RvcmVDb250ZXh0IGN0eCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3NlcS5jdXJyZW50KGN0eCwgbWV0YSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbGxvY2F0ZShpbnQgYWRkaXRpb25hbCwgU3RvcmVDb250ZXh0IGN0eCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc2VxLmFsbG9jYXRlKGFkZGl0aW9uYWwsIGN0eCwgbWV0YSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zZXEuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RlbGVnYXRpbmdTdG9yZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RlbGVnYXRpbmdTdG9yZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGFhMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGVsZWdhdGluZ1N0b3JlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHN0b3JlIG1hbmFnZXIgZGVjb3JhdG9ycyB0aGF0IGRlbGVnYXRlIHRvIGFub3RoZXIKKyAqIHN0b3JlIG1hbmFnZXIgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGluZ1N0b3JlTWFuYWdlcgorICAgIGltcGxlbWVudHMgU3RvcmVNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RvcmVNYW5hZ2VyIF9zdG9yZTsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdTdG9yZU1hbmFnZXIgX2RlbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRpbmdTdG9yZU1hbmFnZXIoU3RvcmVNYW5hZ2VyIHN0b3JlKSB7CisgICAgICAgIF9zdG9yZSA9IHN0b3JlOworICAgICAgICBpZiAoc3RvcmUgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyKQorICAgICAgICAgICAgX2RlbCA9IChEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyKSBfc3RvcmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kZWwgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd3JhcHBlZCBzdG9yZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZU1hbmFnZXIgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlIHVuZGVybHlpbmcgbmF0aXZlIHN0b3JlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIFN0b3JlTWFuYWdlciBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX3N0b3JlIDogX2RlbC5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyKQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdTdG9yZU1hbmFnZXIpIG90aGVyKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5lcXVhbHMob3RoZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICBfc3RvcmUuc2V0Q29udGV4dChjdHgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luT3B0aW1pc3RpYygpIHsKKyAgICAgICAgX3N0b3JlLmJlZ2luT3B0aW1pc3RpYygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrT3B0aW1pc3RpYygpIHsKKyAgICAgICAgX3N0b3JlLnJvbGxiYWNrT3B0aW1pc3RpYygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZ2luKCkgeworICAgICAgICBfc3RvcmUuYmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIF9zdG9yZS5jb21taXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpIHsKKyAgICAgICAgX3N0b3JlLnJvbGxiYWNrKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBfc3RvcmUuZXhpc3RzKHNtLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICByZXR1cm4gX3N0b3JlLnN5bmNWZXJzaW9uKHNtLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFBDU3RhdGUgc3RhdGUsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5pbml0aWFsaXplKHNtLCBzdGF0ZSwgZmV0Y2gsIGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICByZXR1cm4gX3N0b3JlLmxvYWQoc20sIGZpZWxkcywgZmV0Y2gsIGxvY2tMZXZlbCwgY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gbG9hZEFsbChDb2xsZWN0aW9uIHNtcywgUENTdGF0ZSBzdGF0ZSwgaW50IGxvYWQsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5sb2FkQWxsKHNtcywgc3RhdGUsIGxvYWQsIGZldGNoLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVTdGF0ZUNoYW5nZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBQQ1N0YXRlIGZyb21TdGF0ZSwKKyAgICAgICAgUENTdGF0ZSB0b1N0YXRlKSB7CisgICAgICAgIF9zdG9yZS5iZWZvcmVTdGF0ZUNoYW5nZShzbSwgZnJvbVN0YXRlLCB0b1N0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBmbHVzaChDb2xsZWN0aW9uIHNtcykgeworICAgICAgICByZXR1cm4gX3N0b3JlLmZsdXNoKHNtcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduT2JqZWN0SWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgYm9vbGVhbiBwcmVGbHVzaCkgeworICAgICAgICByZXR1cm4gX3N0b3JlLmFzc2lnbk9iamVjdElkKHNtLCBwcmVGbHVzaCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduRmllbGQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IGZpZWxkLAorICAgICAgICBib29sZWFuIHByZUZsdXNoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmUuYXNzaWduRmllbGQoc20sIGZpZWxkLCBwcmVGbHVzaCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldE1hbmFnZWRUeXBlKE9iamVjdCBvaWQpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5nZXRNYW5hZ2VkVHlwZShvaWQpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXREYXRhU3RvcmVJZFR5cGUoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHJldHVybiBfc3RvcmUuZ2V0RGF0YVN0b3JlSWRUeXBlKG1ldGEpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY29weURhdGFTdG9yZUlkKE9iamVjdCBvaWQsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gX3N0b3JlLmNvcHlEYXRhU3RvcmVJZChvaWQsIG1ldGEpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3RGF0YVN0b3JlSWQoT2JqZWN0IG9pZFZhbCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHJldHVybiBfc3RvcmUubmV3RGF0YVN0b3JlSWQob2lkVmFsLCBtZXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldENsaWVudENvbm5lY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBfc3RvcmUuZ2V0Q2xpZW50Q29ubmVjdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJldGFpbkNvbm5lY3Rpb24oKSB7CisgICAgICAgIF9zdG9yZS5yZXRhaW5Db25uZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZUNvbm5lY3Rpb24oKSB7CisgICAgICAgIF9zdG9yZS5yZWxlYXNlQ29ubmVjdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRPYmplY3RQcm92aWRlciBleGVjdXRlRXh0ZW50KENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgYm9vbGVhbiBzdWJjbGFzc2VzLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5leGVjdXRlRXh0ZW50KG1ldGEsIHN1YmNsYXNzZXMsIGZldGNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5uZXdRdWVyeShsYW5ndWFnZSk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBuZXdGZXRjaENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfc3RvcmUubmV3RmV0Y2hDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIF9zdG9yZS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzdGF0ZSwgT2JqZWN0IHYxLCBPYmplY3QgdjIpIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yZS5jb21wYXJlVmVyc2lvbihzdGF0ZSwgdjEsIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VxIGdldERhdGFTdG9yZUlkU2VxdWVuY2UoQ2xhc3NNZXRhRGF0YSBmb3JDbGFzcykgeworICAgICAgICByZXR1cm4gX3N0b3JlLmdldERhdGFTdG9yZUlkU2VxdWVuY2UoZm9yQ2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBTZXEgZ2V0VmFsdWVTZXF1ZW5jZShGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICByZXR1cm4gX3N0b3JlLmdldFZhbHVlU2VxdWVuY2UoZm1kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxBbGwoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmUuY2FuY2VsQWxsKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGV0YWNoTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGV0YWNoTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZjhiZGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw4MjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLklkZW50aXR5TWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLkRldGFjaE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5DYWxsYmFja01vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQ2FsbGJhY2tFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogSGFuZGxlcyBkZXRhY2hpbmcgaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBEZXRhY2hNYW5hZ2VyCisgICAgaW1wbGVtZW50cyBEZXRhY2hTdGF0ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKERldGFjaE1hbmFnZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9rZXJJbXBsIF9icm9rZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9jb3B5OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfZnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIFByb3h5TWFuYWdlciBfcHJveHk7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXRhY2hPcHRpb25zIF9vcHRzOworICAgIHByaXZhdGUgZmluYWwgT3BDYWxsYmFja3MgX2NhbGw7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9mYWlsRmFzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZsdXNoZWQgPSBmYWxzZTsKKworICAgIC8vIGlmIHdlJ3JlIG5vdCBkZXRhY2hpbmcgZnVsbCwgd2UgbmVlZCB0byB0cmFjayBhbGwgZGV0YWNoZWQgb2JqZWN0czsKKyAgICAvLyBpZiB3ZSBhcmUsIHRoZW4gd2UgdXNlIGEgc3BlY2lhbCBmaWVsZCBtYW5hZ2VyIGZvciBtb3JlIGVmZmljaWVudAorICAgIC8vIGRldGFjaG1lbnQgdGhhbiB0aGUgc3RhbmRhcmQgb25lCisgICAgcHJpdmF0ZSBmaW5hbCBJZGVudGl0eU1hcCBfZGV0YWNoZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXRhY2hGaWVsZE1hbmFnZXIgX2Z1bGxGTTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcHJlcGFyZSBhIGRldGFjaGFibGUgaW5zdGFuY2UgdGhhdCBkb2VzIG5vdCBleHRlcm5hbGl6ZQorICAgICAqIGRldGFjaGVkIHN0YXRlLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHByZVNlcmlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIHNtKSB7CisgICAgICAgIGlmICghc20uaXNQZXJzaXN0ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZmx1c2hEaXJ0eShzbSk7CisKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgYm9vbGVhbiBzZXRTdGF0ZSA9IG1ldGEuZ2V0RGV0YWNoZWRTdGF0ZSgpICE9IG51bGwKKyAgICAgICAgICAgICYmICFDbGFzc01ldGFEYXRhLlNZTlRIRVRJQy5lcXVhbHMobWV0YS5nZXREZXRhY2hlZFN0YXRlKCkpOworICAgICAgICBCaXRTZXQgaWR4cyA9IChzZXRTdGF0ZSkgPyBuZXcgQml0U2V0KG1ldGEuZ2V0RmllbGRzKCkubGVuZ3RoKSA6IG51bGw7CisgICAgICAgIHByZURldGFjaChzbS5nZXRCcm9rZXIoKSwgc20sIGlkeHMpOworCisgICAgICAgIGlmIChzZXRTdGF0ZSkgeworICAgICAgICAgICAgc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCkucGNTZXREZXRhY2hlZFN0YXRlKGdldERldGFjaGVkU3RhdGUKKyAgICAgICAgICAgICAgICAoc20sIGlkeHMpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbnVsbCBzdGF0ZQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgY2xhc3NlcyB0aGF0IGV4dGVybmFsaXplIGRldGFjaGVkIHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRvIHVzZSBhIGRldGFjaGVkIHN0YXRlIG1hbmFnZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiB3cml0ZURldGFjaGVkU3RhdGUoU3RhdGVNYW5hZ2VySW1wbCBzbSwgT2JqZWN0T3V0cHV0IG91dCwKKyAgICAgICAgQml0U2V0IGlkeHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc20uaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChudWxsKTsgLy8gc3RhdGUKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChudWxsKTsgLy8gc20KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpcnR5IHN0YXRlIGNhdXNlcyBmbHVzaAorICAgICAgICBmbHVzaERpcnR5KHNtKTsKKworICAgICAgICBCcm9rZXIgYnJva2VyID0gc20uZ2V0QnJva2VyKCk7CisgICAgICAgIHByZURldGFjaChicm9rZXIsIHNtLCBpZHhzKTsKKworICAgICAgICAvLyB3cml0ZSBkZXRhY2hlZCBzdGF0ZSBvYmplY3QgYW5kIHN0YXRlIG1hbmFnZXIKKyAgICAgICAgRGV0YWNoT3B0aW9ucyBvcHRzID0gYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgIGdldERldGFjaFN0YXRlSW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKCFvcHRzLmdldERldGFjaGVkU3RhdGVNYW5hZ2VyKCkKKyAgICAgICAgICAgIHx8ICF1c2VEZXRhY2hlZFN0YXRlTWFuYWdlcihzbSwgb3B0cykpIHsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChnZXREZXRhY2hlZFN0YXRlKHNtLCBpZHhzKSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KG51bGwpOworICAgICAgICBvdXQud3JpdGVPYmplY3QobmV3IERldGFjaGVkU3RhdGVNYW5hZ2VyKHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpLAorICAgICAgICAgICAgc20sIGlkeHMsIG9wdHMuZ2V0QWNjZXNzVW5sb2FkZWQoKSwgYnJva2VyLmdldE11bHRpdGhyZWFkZWQoKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkeSB0aGUgb2JqZWN0IGZvciBkZXRhY2htZW50LCBpbmNsdWRpbmcgbG9hZGluZyB0aGUgZmllbGRzIHRvIGJlCisgICAgICogZGV0YWNoZWQgYW5kIHVwZGF0aW5nIHZlcnNpb24gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWR4cyB0aGUgaW5kZXhlcyBvZiBmaWVsZHMgdG8gZGV0YWNoIHdpbGwgYmUgc2V0IGFzIGEgc2lkZQorICAgICAqIGVmZmVjdCBvZiB0aGlzIG1ldGhvZAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJlRGV0YWNoKEJyb2tlciBicm9rZXIsIFN0YXRlTWFuYWdlckltcGwgc20sCisgICAgICAgIEJpdFNldCBpZHhzKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGhhcyB0aGUgcmlnaHQgZmllbGRzIGZldGNoZWQ7IGNhbGwKKyAgICAgICAgLy8gZXZlbiBpZiB1c2luZyBjdXJyZW50bHktbG9hZGVkIGZpZWxkcyBmb3IgZGV0YWNoIHRvIG1ha2Ugc3VyZQorICAgICAgICAvLyB2ZXJzaW9uIGlzIHNldAorICAgICAgICBpbnQgZGV0YWNoTW9kZSA9IGJyb2tlci5nZXREZXRhY2hTdGF0ZSgpOworICAgICAgICBpbnQgbG9hZE1vZGUgPSBTdGF0ZU1hbmFnZXJJbXBsLkxPQURfRkdTOworICAgICAgICBCaXRTZXQgZXhjbHVkZSA9IG51bGw7CisgICAgICAgIGlmIChkZXRhY2hNb2RlID09IERFVEFDSF9MT0FERUQpCisgICAgICAgICAgICBleGNsdWRlID0gU3RvcmVDb250ZXh0LkVYQ0xVREVfQUxMOworICAgICAgICBlbHNlIGlmIChkZXRhY2hNb2RlID09IERFVEFDSF9BTEwpCisgICAgICAgICAgICBsb2FkTW9kZSA9IFN0YXRlTWFuYWdlckltcGwuTE9BRF9BTEw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzbS5sb2FkKGJyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKSwgbG9hZE1vZGUsIGV4Y2x1ZGUsIG51bGwsIAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gb25mZSkgeworICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgZXhjZXB0aW9uCisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYml0c2V0IG9mIGZpZWxkcyB0byBkZXRhY2g7IGlmIG1vZGUgaXMgYWxsIHdlIGNhbiB1c2UKKyAgICAgICAgLy8gY3VycmVudGx5IGxvYWRlZCBiaXRzZXQgY2xvbmUsIHNpbmNlIHdlIGtub3cgYWxsIGZpZWxkcyBhcmUgbG9hZGVkCisgICAgICAgIGlmIChpZHhzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkZXRhY2hNb2RlID09IERFVEFDSF9GRVRDSF9HUk9VUFMpCisgICAgICAgICAgICAgICAgc2V0RmV0Y2hHcm91cEZpZWxkcyhicm9rZXIsIHNtLCBpZHhzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZHhzLm9yKHNtLmdldExvYWRlZCgpKTsKKworICAgICAgICAgICAgLy8gY2xlYXIgbHJzIGZpZWxkcworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChmbWRzW2ldLmlzTFJTKCkpCisgICAgICAgICAgICAgICAgICAgIGlkeHMuY2xlYXIoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZGV0YWNoZWQgc3RhdGUgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0RGV0YWNoZWRTdGF0ZShTdGF0ZU1hbmFnZXJJbXBsIHNtLCBCaXRTZXQgZmllbGRzKSB7CisgICAgICAgIC8vIGlmIGRhdGFzdG9yZSwgc3RvcmUgaWQgaW4gZmlyc3QgZWxlbWVudAorICAgICAgICBpbnQgb2Zmc2V0ID0gKHNtLmdldE1ldGFEYXRhKCkuZ2V0SWRlbnRpdHlUeXBlKCkgPT0KKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEuSURfREFUQVNUT1JFKSA/IDEgOiAwOworCisgICAgICAgIC8vIG1ha2UgdmVyc2lvbiBzdGF0ZSBhcnJheSBvbmUgbGFyZ2VyIGZvciBuZXcgaW5zdGFuY2VzOyBtYXJrcyBuZXcKKyAgICAgICAgLy8gaW5zdGFuY2VzIHdpdGhvdXQgYWZmZWN0aW5nIHNlcmlhbGl6YXRpb24gc2l6ZSBtdWNoCisgICAgICAgIE9iamVjdFtdIHN0YXRlOworICAgICAgICBpZiAoc20uaXNOZXcoKSkKKyAgICAgICAgICAgIHN0YXRlID0gbmV3IE9iamVjdFszICsgb2Zmc2V0XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdGUgPSBuZXcgT2JqZWN0WzIgKyBvZmZzZXRdOworCisgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICBPYmplY3QgaWQ7CisgICAgICAgICAgICBpZiAoc20uaXNFbWJlZGRlZCgpIHx8IHNtLmdldE9iamVjdElkKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZCA9IHNtLmdldElkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWQgPSBzbS5nZXRPYmplY3RJZCgpOworICAgICAgICAgICAgc3RhdGVbMF0gPSBpZC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHN0YXRlW29mZnNldF0gPSBzbS5nZXRWZXJzaW9uKCk7CisgICAgICAgIHN0YXRlW29mZnNldCArIDFdID0gZmllbGRzOworICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggb3IgaW52b2tlIHByZS1zdG9yZSBjYWxsYmFja3Mgb24gdGhlIGdpdmVuIGJyb2tlciBpZgorICAgICAqIG5lZWRlZC4gUmV0dXJuIHRydWUgaWYgZmx1c2hlZC9zdG9yZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGZsdXNoRGlydHkoU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICBpZiAoIXNtLmlzRGlydHkoKSB8fCAhc20uZ2V0QnJva2VyKCkuaXNBY3RpdmUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBvbmx5IGZsdXNoIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBhbnkgZGlydHkgbm9uLWZsdXNoZWQgZmllbGRzCisgICAgICAgIEJpdFNldCBkaXJ0eUZpZWxkcyA9IHNtLmdldERpcnR5KCk7CisgICAgICAgIEJpdFNldCBmbHVzaGVkRmllbGRzID0gc20uZ2V0Rmx1c2hlZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnR5RmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGlydHlGaWVsZHMuZ2V0KGkpICYmICFmbHVzaGVkRmllbGRzLmdldChpKSkgeworICAgICAgICAgICAgICAgIGlmIChzbS5nZXRCcm9rZXIoKS5nZXRSb2xsYmFja09ubHkoKSkKKyAgICAgICAgICAgICAgICAgICAgc20uZ2V0QnJva2VyKCkucHJlRmx1c2goKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNtLmdldEJyb2tlcigpLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGJpdCBzZXQgZm9yIHRoZSBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgZmV0Y2ggZ3JvdXBzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmV0Y2hHcm91cEZpZWxkcyhCcm9rZXIgYnJva2VyLAorICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtLCBCaXRTZXQgaWR4cykgeworICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSBicm9rZXIuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1kc1tpXS5pc1ByaW1hcnlLZXkoKSB8fCBmZXRjaC5yZXF1aXJlc0ZldGNoKGZtZHNbaV0pCisgICAgICAgICAgICAgICAgIT0gRmV0Y2hDb25maWd1cmF0aW9uLkZFVENIX05PTkUpCisgICAgICAgICAgICAgICAgaWR4cy5zZXQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBicm9rZXIgb3duaW5nIGJyb2tlcgorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdGhlIGVudGlyZSBicm9rZXIgY2FjaGUgaXMgYmVpbmcgZGV0YWNoZWQ7IGlmCisgICAgICogdGhpcyBpcyB0aGUgY2FzZSwgd2UgYXNzdW1lIHRoZSBicm9rZXIgaGFzIGFscmVhZHkKKyAgICAgKiBmbHVzaGVkIGlmIG5lZWRlZCwgYW5kIHRoYXQgd2UncmUgZGV0YWNoaW5nIGluLXBsYWNlCisgICAgICovCisgICAgcHVibGljIERldGFjaE1hbmFnZXIoQnJva2VySW1wbCBicm9rZXIsIGJvb2xlYW4gZnVsbCwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBfYnJva2VyID0gYnJva2VyOworICAgICAgICBfcHJveHkgPSBicm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3h5TWFuYWdlckluc3RhbmNlKCk7CisgICAgICAgIF9vcHRzID0gYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXREZXRhY2hTdGF0ZUluc3RhbmNlKCk7CisgICAgICAgIF9jb3B5ID0gIWZ1bGw7CisgICAgICAgIF9mbHVzaGVkID0gZnVsbDsKKyAgICAgICAgX2NhbGwgPSBjYWxsOworICAgICAgICBfZmFpbEZhc3QgPSAoYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGFGYWN0b3J5KCkuZ2V0RGVmYXVsdHMoKS5nZXRDYWxsYmFja01vZGUoKQorICAgICAgICAgICAgJiBDYWxsYmFja01vZGVzLkNBTExCQUNLX0ZBSUxfRkFTVCkgIT0gMDsKKworICAgICAgICAvLyB3ZSBjYW4gb25seSByZWx5IG9uIG91ciAiYWxsIiBzaG9ydGN1dHMgaWYgd2Uga25vdyB3ZSB3b24ndCBiZQorICAgICAgICAvLyBsb2FkaW5nIGFueSBtb3JlIGRhdGEKKyAgICAgICAgX2Z1bGwgPSBmdWxsICYmIGJyb2tlci5nZXREZXRhY2hTdGF0ZSgpID09IERldGFjaFN0YXRlLkRFVEFDSF9MT0FERUQ7CisgICAgICAgIGlmIChfZnVsbCkgeworICAgICAgICAgICAgX2RldGFjaGVkID0gbnVsbDsKKyAgICAgICAgICAgIF9mdWxsRk0gPSBuZXcgRGV0YWNoRmllbGRNYW5hZ2VyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfZGV0YWNoZWQgPSBuZXcgSWRlbnRpdHlNYXAoKTsKKyAgICAgICAgICAgIF9mdWxsRk0gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgZGV0YWNoZWQgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBkZXRhY2goT2JqZWN0IHRvRGV0YWNoKSB7CisgICAgICAgIExpc3QgZXhjZXBzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBkZXRhY2hJbnRlcm5hbCh0b0RldGFjaCk7CisgICAgICAgIH0gY2F0Y2ggKENhbGxiYWNrRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICBleGNlcHMgPSBuZXcgQXJyYXlMaXN0KDEpOworICAgICAgICAgICAgZXhjZXBzLmFkZChjZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gd29uJ3QgYmUgcmVhY2hlZCBhcyBleGNlcHRpb24gd2lsbCBiZSByZXRocm93bgorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGV4Y2VwcyA9PSBudWxsIHx8ICFfZmFpbEZhc3QpCisgICAgICAgICAgICAgICAgZXhjZXBzID0gaW52b2tlQWZ0ZXJEZXRhY2goQ29sbGVjdGlvbnMuc2luZ2xldG9uKHRvRGV0YWNoKSwKKyAgICAgICAgICAgICAgICAgICAgZXhjZXBzKTsKKyAgICAgICAgICAgIGlmIChfZGV0YWNoZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZGV0YWNoZWQuY2xlYXIoKTsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9ucyhleGNlcHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRldGFjaGVkIHZlcnNpb25zIG9mIGFsbCB0aGUgZ2l2ZW4gaW5zdGFuY2VzLiBJZiBub3QgY29weWluZywKKyAgICAgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGRldGFjaEFsbChDb2xsZWN0aW9uIGluc3RhbmNlcykgeworICAgICAgICBMaXN0IGV4Y2VwcyA9IG51bGw7CisgICAgICAgIExpc3QgZGV0YWNoZWQgPSBudWxsOworICAgICAgICBpZiAoX2NvcHkpCisgICAgICAgICAgICBkZXRhY2hlZCA9IG5ldyBBcnJheUxpc3QoaW5zdGFuY2VzLnNpemUoKSk7CisKKyAgICAgICAgYm9vbGVhbiBmYWlsRmFzdCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IGRldGFjaDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaW5zdGFuY2VzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZGV0YWNoID0gZGV0YWNoSW50ZXJuYWwoaXRyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKF9jb3B5KQorICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZC5hZGQoZGV0YWNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgaWYgKHJlIGluc3RhbmNlb2YgQ2FsbGJhY2tFeGNlcHRpb24gJiYgX2ZhaWxGYXN0KQorICAgICAgICAgICAgICAgIGZhaWxGYXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghZmFpbEZhc3QpCisgICAgICAgICAgICAgICAgZXhjZXBzID0gaW52b2tlQWZ0ZXJEZXRhY2goaW5zdGFuY2VzLCBleGNlcHMpOworICAgICAgICAgICAgaWYgKF9kZXRhY2hlZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9kZXRhY2hlZC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRocm93RXhjZXB0aW9ucyhleGNlcHMpOworCisgICAgICAgIGlmIChfY29weSkKKyAgICAgICAgICAgIHJldHVybiBkZXRhY2hlZC50b0FycmF5KCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZSBwb3N0RGV0YWNoKCkgb24gYW55IGRldGFjaGVkIGluc3RhbmNlcyB0aGF0IGltcGxlbWVudAorICAgICAqIFBvc3REZXRhY2hDYWxsYmFjay4gVGhpcyB3aWxsIGJlIGRvbmUgYWZ0ZXIgdGhlIGVudGlyZSBncmFwaCBoYXMKKyAgICAgKiBiZWVuIGRldGFjaGVkLiBUaGlzIG1ldGhvZCBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGFsc28gY2xlYXJpbmcKKyAgICAgKiBvdXQgdGhlIG1hcCBvZiBhbGwgZGV0YWNoZWQgaW5zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBpbnZva2VBZnRlckRldGFjaChDb2xsZWN0aW9uIG9ianMsIExpc3QgZXhjZXBzKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IChfZnVsbCkgPyBvYmpzLml0ZXJhdG9yKCkKKyAgICAgICAgICAgIDogX2RldGFjaGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKworICAgICAgICBPYmplY3Qgb3JpZywgZGV0YWNoZWQ7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChfZnVsbCkgeworICAgICAgICAgICAgICAgIG9yaWcgPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGRldGFjaGVkID0gb3JpZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIG9yaWcgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBkZXRhY2hlZCA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBfYnJva2VyLmdldFN0YXRlTWFuYWdlckltcGwob3JpZywgdHJ1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfYnJva2VyLmZpcmVMaWZlY3ljbGVFdmVudChkZXRhY2hlZCwgb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldE1ldGFEYXRhKCksIExpZmVjeWNsZUV2ZW50LkFGVEVSX0RFVEFDSCk7CisgICAgICAgICAgICB9IGNhdGNoIChDYWxsYmFja0V4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwcyA9IGFkZChleGNlcHMsIGNlKTsKKyAgICAgICAgICAgICAgICBpZiAoX2ZhaWxGYXN0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZG9uJ3QgY29udGludWUgcHJvY2Vzc2luZworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleGNlcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGV4Y2VwdGlvbiB0byB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgYWRkKExpc3QgZXhjZXBzLCBSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIGlmIChleGNlcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIGV4Y2VwcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGV4Y2Vwcy5hZGQocmUpOworICAgICAgICByZXR1cm4gZXhjZXBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93IGFsbCBnYXRoZXJlZCBleGNlcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0aHJvd0V4Y2VwdGlvbnMoTGlzdCBleGNlcHMpIHsKKyAgICAgICAgaWYgKGV4Y2VwcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChleGNlcHMuc2l6ZSgpID09IDEpCisgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZXhjZXBzLmdldCgwKTsKKyAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5lc3RlZC1leGNlcHMiKSkuCisgICAgICAgICAgICBzZXROZXN0ZWRUaHJvd2FibGVzKChUaHJvd2FibGVbXSkgZXhjZXBzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IFRocm93YWJsZVtleGNlcHMuc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBkZXRhY2hJbnRlcm5hbChPYmplY3QgdG9EZXRhY2gpIHsKKyAgICAgICAgaWYgKHRvRGV0YWNoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBhbHJlYWR5IGRldGFjaGVkPworICAgICAgICBpZiAoX2RldGFjaGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdCBkZXRhY2hlZCA9IF9kZXRhY2hlZC5nZXQodG9EZXRhY2gpOworICAgICAgICAgICAgaWYgKGRldGFjaGVkICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRldGFjaGVkOworICAgICAgICB9CisKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IF9icm9rZXIuZ2V0U3RhdGVNYW5hZ2VySW1wbCh0b0RldGFjaCwgdHJ1ZSk7CisgICAgICAgIGlmIChfY2FsbCAhPSBudWxsICYmIChfY2FsbC5wcm9jZXNzQXJndW1lbnQoT3BDYWxsYmFja3MuT1BfREVUQUNILAorICAgICAgICAgICAgdG9EZXRhY2gsIHNtKSAmIE9wQ2FsbGJhY2tzLkFDVF9SVU4pID09IDApCisgICAgICAgICAgICByZXR1cm4gdG9EZXRhY2g7CisgICAgICAgIGlmIChzbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRvRGV0YWNoOworCisgICAgICAgIC8vIENhbGwgUHJlRGV0YWNoIGZpcnN0IGFzIHdlIGNhbid0IHRlbGwgaWYgdGhlIG5ldyBzeXN0ZW0KKyAgICAgICAgLy8gZmlyZWQgYW4gZXZlbnQgb3IganVzdCBkaWQgbm90IGZhaWwuCisgICAgICAgIF9icm9rZXIuZmlyZUxpZmVjeWNsZUV2ZW50KHRvRGV0YWNoLCBudWxsLCBzbS5nZXRNZXRhRGF0YSgpLAorICAgICAgICAgICAgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RFVEFDSCk7CisKKyAgICAgICAgLy8gYW55IGRpcnR5IGluc3RhbmNlcyBjYXVzZSBhIGZsdXNoIHRvIG9jY3VyCisgICAgICAgIF9mbHVzaGVkID0gX2ZsdXNoZWQgfHwgZmx1c2hEaXJ0eShzbSk7CisgICAgICAgIEJpdFNldCBmaWVsZHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIHByZURldGFjaChfYnJva2VyLCBzbSwgZmllbGRzKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHN0b3JlIG5ldyBvYmplY3QgYmVmb3JlIGNvcHkgdG8gYXZvaWQgZW5kbGVzcyByZWN1cnNpb24KKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjID0gc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisgICAgICAgIFBlcnNpc3RlbmNlQ2FwYWJsZSBkZXRhY2hlZFBDOworICAgICAgICBpZiAoX2NvcHkpCisgICAgICAgICAgICBkZXRhY2hlZFBDID0gcGMucGNOZXdJbnN0YW5jZShudWxsLCB0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGV0YWNoZWRQQyA9IHBjOworICAgICAgICBpZiAoX2RldGFjaGVkICE9IG51bGwpCisgICAgICAgICAgICBfZGV0YWNoZWQucHV0KHRvRGV0YWNoLCBkZXRhY2hlZFBDKTsKKworICAgICAgICAvLyBkZXRhY2ggZmllbGRzIGFuZCBzZXQgZGV0YWNoZWQgdmFyaWFibGVzCisgICAgICAgIERldGFjaGVkU3RhdGVNYW5hZ2VyIGRldFNNID0gbnVsbDsKKyAgICAgICAgaWYgKF9vcHRzLmdldERldGFjaGVkU3RhdGVNYW5hZ2VyKCkKKyAgICAgICAgICAgICYmIHVzZURldGFjaGVkU3RhdGVNYW5hZ2VyKHNtLCBfb3B0cykpCisgICAgICAgICAgICBkZXRTTSA9IG5ldyBEZXRhY2hlZFN0YXRlTWFuYWdlcihkZXRhY2hlZFBDLCBzbSwgZmllbGRzLAorICAgICAgICAgICAgICAgIF9vcHRzLmdldEFjY2Vzc1VubG9hZGVkKCksIF9icm9rZXIuZ2V0TXVsdGl0aHJlYWRlZCgpKTsKKyAgICAgICAgaWYgKF9mdWxsKSB7CisgICAgICAgICAgICBfZnVsbEZNLnNldFN0YXRlTWFuYWdlcihzbSk7CisgICAgICAgICAgICBfZnVsbEZNLmRldGFjaFZlcnNpb24oKTsKKyAgICAgICAgICAgIF9mdWxsRk0ucmVwcm94eShkZXRTTSk7CisgICAgICAgICAgICBfZnVsbEZNLnNldFN0YXRlTWFuYWdlcihudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEluc3RhbmNlRGV0YWNoRmllbGRNYW5hZ2VyIGZtID0gbmV3IEluc3RhbmNlRGV0YWNoRmllbGRNYW5hZ2VyCisgICAgICAgICAgICAgICAgKGRldGFjaGVkUEMsIGRldFNNKTsKKyAgICAgICAgICAgIGZtLnNldFN0YXRlTWFuYWdlcihzbSk7CisgICAgICAgICAgICBmbS5kZXRhY2hGaWVsZHMoZmllbGRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQm9vbGVhbi5GQUxTRS5lcXVhbHMoc20uZ2V0TWV0YURhdGEoKS51c2VzRGV0YWNoZWRTdGF0ZSgpKSkKKyAgICAgICAgICAgIGRldGFjaGVkUEMucGNTZXREZXRhY2hlZFN0YXRlKGdldERldGFjaGVkU3RhdGUoc20sIGZpZWxkcykpOworICAgICAgICBpZiAoIV9jb3B5KQorICAgICAgICAgICAgc20ucmVsZWFzZShmYWxzZSwgIV9jb3B5KTsKKyAgICAgICAgaWYgKGRldFNNICE9IG51bGwpCisgICAgICAgICAgICBkZXRhY2hlZFBDLnBjUmVwbGFjZVN0YXRlTWFuYWdlcihkZXRTTSk7CisgICAgICAgIHJldHVybiBkZXRhY2hlZFBDOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlRGV0YWNoZWRTdGF0ZU1hbmFnZXIoU3RhdGVNYW5hZ2VySW1wbCBzbSwKKyAgICAgICAgRGV0YWNoT3B0aW9ucyBvcHRzKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IHNtLmdldE1ldGFEYXRhKCk7CisgICAgICAgIHJldHVybiAhQm9vbGVhbi5GQUxTRS5lcXVhbHMobWV0YS51c2VzRGV0YWNoZWRTdGF0ZSgpKSAmJgorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YS5TWU5USEVUSUMuZXF1YWxzKG1ldGEuZ2V0RGV0YWNoZWRTdGF0ZSgpKSAmJgorICAgICAgICAgICAgb3B0cy5nZXREZXRhY2hlZFN0YXRlTWFuYWdlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2UgZGV0YWNoIGZpZWxkIG1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGV0YWNoRmllbGRNYW5hZ2VyCisgICAgICAgIGV4dGVuZHMgVHJhbnNmZXJGaWVsZE1hbmFnZXIgeworCisgICAgICAgIHByb3RlY3RlZCBTdGF0ZU1hbmFnZXJJbXBsIHNtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNvdXJjZSBzdGF0ZSBtYW5hZ2VyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RhdGVNYW5hZ2VyKFN0YXRlTWFuYWdlckltcGwgc20pIHsKKyAgICAgICAgICAgIHRoaXMuc20gPSBzbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2ZlciB0aGUgY3VycmVudCB2ZXJzaW9uIG9iamVjdCBmcm9tIHRoZSBzdGF0ZSBtYW5hZ2VyIHRvIHRoZQorICAgICAgICAgKiBkZXRhY2hlZCBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaFZlcnNpb24oKSB7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0VmVyc2lvbkZpZWxkKCk7CisgICAgICAgICAgICBpZiAoZm1kID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBPYmplY3QgdmFsID0gSmF2YVR5cGVzLmNvbnZlcnQoc20uZ2V0VmVyc2lvbigpLAorICAgICAgICAgICAgICAgIGZtZC5nZXRUeXBlQ29kZSgpKTsKKyAgICAgICAgICAgIHZhbCA9IGZtZC5nZXRGaWVsZFZhbHVlKHZhbCwgc20uZ2V0QnJva2VyKCkpOworICAgICAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIGxvbmd2YWwgPSAodmFsID09IG51bGwpID8gMEwgOiAoKE51bWJlcikgdmFsKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIGRibHZhbCA9ICh2YWwgPT0gbnVsbCkgPyAwRCA6ICgoTnVtYmVyKSB2YWwpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG9ianZhbCA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChnZXREZXRhY2hlZFBlcnNpc3RlbmNlQ2FwYWJsZSgpLCB0aGlzLAorICAgICAgICAgICAgICAgIGZtZC5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbnByb3hpZXMgc2Vjb25kIGNsYXNzIG9iamVjdCBmaWVsZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZXByb3h5KERldGFjaGVkU3RhdGVNYW5hZ2VyIGRzbSkgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICAvLyBscnMgcHJveGllcyBub3QgZGV0YWNoZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZtZHNbaV0uaXNMUlMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2JqdmFsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChnZXREZXRhY2hlZFBlcnNpc3RlbmNlQ2FwYWJsZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgICAgIHNtLnByb3ZpZGVGaWVsZChnZXREZXRhY2hlZFBlcnNpc3RlbmNlQ2FwYWJsZSgpLCB0aGlzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9ianZhbCBpbnN0YW5jZW9mIFByb3h5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcm94eSBwcm94eSA9IChQcm94eSkgb2JqdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5LmdldENoYW5nZVRyYWNrZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LmdldENoYW5nZVRyYWNrZXIoKS5zdG9wVHJhY2tpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldE93bmVyKGRzbSwgKGRzbSA9PSBudWxsKSA/IC0xIDogaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgaW5zdGFuY2UgYmVpbmcgZGV0YWNoZWQuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgUGVyc2lzdGVuY2VDYXBhYmxlIGdldERldGFjaGVkUGVyc2lzdGVuY2VDYXBhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmllbGRNYW5hZ2VyIHRoYXQgY2FuIGNvcHkgYWxsIHRoZSBmaWVsZHMgZnJvbSBvbmUKKyAgICAgKiBQZXJzaXN0ZW5jZUNhcGFibGUgaW5zdGFuY2UgdG8gYW5vdGhlci4gT25lIG9mIHRoZQorICAgICAqIGluc3RhbmNlcyBtdXN0IGJlIG1hbmFnZWQgYnkgYSBTdGF0ZU1hbmFnZXIsIGFuZCB0aGUKKyAgICAgKiBvdGhlciBtdXN0IGJlIHVubWFuYWdlZC4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBJbnN0YW5jZURldGFjaEZpZWxkTWFuYWdlcgorICAgICAgICBleHRlbmRzIERldGFjaEZpZWxkTWFuYWdlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZUNhcGFibGUgX3RvOworICAgICAgICBwcml2YXRlIGZpbmFsIERldGFjaGVkU3RhdGVNYW5hZ2VyIF9kZXRTTTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBpbnN0YW5jZSB0byB0byBjb3B5IHRvLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEluc3RhbmNlRGV0YWNoRmllbGRNYW5hZ2VyKFBlcnNpc3RlbmNlQ2FwYWJsZSB0bywKKyAgICAgICAgICAgIERldGFjaGVkU3RhdGVNYW5hZ2VyIGRldFNNKSB7CisgICAgICAgICAgICBfdG8gPSB0bzsKKyAgICAgICAgICAgIF9kZXRTTSA9IGRldFNNOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFBlcnNpc3RlbmNlQ2FwYWJsZSBnZXREZXRhY2hlZFBlcnNpc3RlbmNlQ2FwYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfdG87CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0YWNoIHRoZSBmaWVsZHMgb2YgdGhlIHN0YXRlIG1hbmFnZXIgZ2l2ZW4gb24gY29uc3RydWN0aW9uIHRvCisgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBjYXBhYmxlIGdpdmVuIG9uIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgICogT25seSB0aGUgZmllbGRzIGluIHRoZSBnaXZlbiBiaXQgc2V0IHdpbGwgYmUgY29waWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoRmllbGRzKEJpdFNldCBmZ2ZpZWxkcykgeworICAgICAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIGZyb20gPSBzbS5nZXRQZXJzaXN0ZW5jZUNhcGFibGUoKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBwa3MgPSBzbS5nZXRNZXRhRGF0YSgpLmdldFByaW1hcnlLZXlGaWVsZHMoKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZHMoKTsKKworICAgICAgICAgICAgaWYgKF9jb3B5KQorICAgICAgICAgICAgICAgIF90by5wY1JlcGxhY2VTdGF0ZU1hbmFnZXIoc20pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBzdGFydCB3aXRoIHBrIGZpZWxkczogb2JqZWN0cyBtaWdodCByZWx5IG9uIHBrIGZpZWxkcyBmb3IKKyAgICAgICAgICAgICAgICAvLyBlcXVhbHMgYW5kIGhhc2hDb2RlIG1ldGhvZHMsIGFuZCB0aGlzIGVuc3VyZXMgdGhhdCBwayBmaWVsZHMKKyAgICAgICAgICAgICAgICAvLyBhcmUgc2V0IHByb3Blcmx5IGlmIHdlIHJldHVybiBhbnkgcGFydGlhbGx5LWRldGFjaGVkIG9iamVjdHMKKyAgICAgICAgICAgICAgICAvLyBkdWUgdG8gcmVlbnRyYW50IGNhbGxzIHdoZW4gdHJhdmVyc2luZyByZWxhdGlvbnMKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBrcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZGV0YWNoRmllbGQoZnJvbSwgcGtzW2ldLmdldEluZGV4KCksIHRydWUpOworICAgICAgICAgICAgICAgIGRldGFjaFZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmICghZm1kc1tpXS5pc1ByaW1hcnlLZXkoKSAmJiAhZm1kc1tpXS5pc1ZlcnNpb24oKSkgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hGaWVsZChmcm9tLCBpLCBmZ2ZpZWxkcy5nZXQoaSkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgU3RhdGVNYW5hZ2VyIGZyb20gdGhlIHRhcmdldCBvYmplY3QKKyAgICAgICAgICAgICAgICBpZiAoX2NvcHkpCisgICAgICAgICAgICAgICAgICAgIF90by5wY1JlcGxhY2VTdGF0ZU1hbmFnZXIobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0YWNoIChvciBjbGVhcikgdGhlIGdpdmVuIGZpZWxkIGluZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRldGFjaEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBmcm9tLCBpbnQgaSwgYm9vbGVhbiBmZykgeworICAgICAgICAgICAgLy8gdGVsbCB0aGUgc3RhdGUgbWFuYWdlciB0byBwcm92aWRlIHRoZSBmaWVsZHMgZnJvbSB0aGUgc291cmNlIHRvCisgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIG1hbmFnZXIsIHdoaWNoIHdpbGwgdGhlbiByZXBsYWNlIHRoZSBmaWVsZCB3aXRoIGEKKyAgICAgICAgICAgIC8vIGRldGFjaGVkIHZlcnNpb24KKyAgICAgICAgICAgIGlmIChmZykKKyAgICAgICAgICAgICAgICBzbS5wcm92aWRlRmllbGQoZnJvbSwgdGhpcywgaSk7CisgICAgICAgICAgICBlbHNlIGlmICghX2NvcHkpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBub3QgY29weWluZyBhbmQgZmllbGQgc2hvdWxkIG5vdCBiZSBkZXRhY2hlZCwgY2xlYXIgaXQKKyAgICAgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChfdG8sIHRoaXMsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCb29sZWFuRmllbGQoaW50IGZpZWxkLCBib29sZWFuIGN1clZhbCkgeworICAgICAgICAgICAgc3VwZXIuc3RvcmVCb29sZWFuRmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgICAgICAgICBzbS5yZXBsYWNlRmllbGQoX3RvLCB0aGlzLCBmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUJ5dGVGaWVsZChpbnQgZmllbGQsIGJ5dGUgY3VyVmFsKSB7CisgICAgICAgICAgICBzdXBlci5zdG9yZUJ5dGVGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChfdG8sIHRoaXMsIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hhckZpZWxkKGludCBmaWVsZCwgY2hhciBjdXJWYWwpIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlQ2hhckZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgc20ucmVwbGFjZUZpZWxkKF90bywgdGhpcywgZmllbGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVEb3VibGVGaWVsZChpbnQgZmllbGQsIGRvdWJsZSBjdXJWYWwpIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlRG91YmxlRmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgICAgICAgICBzbS5yZXBsYWNlRmllbGQoX3RvLCB0aGlzLCBmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUZsb2F0RmllbGQoaW50IGZpZWxkLCBmbG9hdCBjdXJWYWwpIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlRmxvYXRGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChfdG8sIHRoaXMsIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlSW50RmllbGQoaW50IGZpZWxkLCBpbnQgY3VyVmFsKSB7CisgICAgICAgICAgICBzdXBlci5zdG9yZUludEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgc20ucmVwbGFjZUZpZWxkKF90bywgdGhpcywgZmllbGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVMb25nRmllbGQoaW50IGZpZWxkLCBsb25nIGN1clZhbCkgeworICAgICAgICAgICAgc3VwZXIuc3RvcmVMb25nRmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgICAgICAgICBzbS5yZXBsYWNlRmllbGQoX3RvLCB0aGlzLCBmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZVNob3J0RmllbGQoaW50IGZpZWxkLCBzaG9ydCBjdXJWYWwpIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlU2hvcnRGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChfdG8sIHRoaXMsIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlU3RyaW5nRmllbGQoaW50IGZpZWxkLCBTdHJpbmcgY3VyVmFsKSB7CisgICAgICAgICAgICBzdXBlci5zdG9yZVN0cmluZ0ZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgc20ucmVwbGFjZUZpZWxkKF90bywgdGhpcywgZmllbGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVPYmplY3RGaWVsZChpbnQgZmllbGQsIE9iamVjdCBjdXJWYWwpIHsKKyAgICAgICAgICAgIHN1cGVyLnN0b3JlT2JqZWN0RmllbGQoZmllbGQsIGRldGFjaEZpZWxkKGN1clZhbCwgZmllbGQpKTsKKyAgICAgICAgICAgIHNtLnJlcGxhY2VGaWVsZChfdG8sIHRoaXMsIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIG93bmVyIG9mIHRoZSBmaWVsZCdzIHByb3h5IHRvIHRoZSBkZXRhY2hlZCBzdGF0ZSBtYW5hZ2VyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgcmVwcm94eShPYmplY3Qgb2JqLCBpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBfZGV0U00gIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBQcm94eSkKKyAgICAgICAgICAgICAgICAoKFByb3h5KSBvYmopLnNldE93bmVyKF9kZXRTTSwgZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXRhY2ggdGhlIGdpdmVuIHZhbHVlIGlmIG5lZWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGRldGFjaEZpZWxkKE9iamVjdCBjdXJWYWwsIGludCBmaWVsZCkgeworICAgICAgICAgICAgaWYgKGN1clZhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbCA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIGlmIChfY29weSkKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gX3Byb3h5LmNvcHlBcnJheShjdXJWYWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gY3VyVmFsOworICAgICAgICAgICAgICAgIGRldGFjaEFycmF5KG5ld1ZhbCwgZm1kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoX2NvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kZXRTTSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWwgPSBfcHJveHkubmV3Q29sbGVjdGlvblByb3h5KGZtZC5nZXRQcm94eVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbWQuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRJbml0aWFsaXplcigpIGluc3RhbmNlb2YgQ29tcGFyYXRvciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbXBhcmF0b3IpIGZtZC5nZXRJbml0aWFsaXplcigpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKENvbGxlY3Rpb24pIG5ld1ZhbCkuYWRkQWxsKChDb2xsZWN0aW9uKSBjdXJWYWwpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbCA9IF9wcm94eS5jb3B5Q29sbGVjdGlvbigoQ29sbGVjdGlvbikgY3VyVmFsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gY3VyVmFsOworICAgICAgICAgICAgICAgIGRldGFjaENvbGxlY3Rpb24oKENvbGxlY3Rpb24pIG5ld1ZhbCwgKENvbGxlY3Rpb24pIGN1clZhbCwgZm1kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcm94eShuZXdWYWwsIGZpZWxkKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICBpZiAoX2NvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kZXRTTSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWwgPSBfcHJveHkubmV3TWFwUHJveHkoZm1kLmdldFByb3h5VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRLZXkoKS5nZXREZWNsYXJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbWQuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRJbml0aWFsaXplcigpIGluc3RhbmNlb2YgQ29tcGFyYXRvciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21wYXJhdG9yKSBmbWQuZ2V0SW5pdGlhbGl6ZXIoKSA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgKChNYXApIG5ld1ZhbCkucHV0QWxsKChNYXApIGN1clZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gX3Byb3h5LmNvcHlNYXAoKE1hcCkgY3VyVmFsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gY3VyVmFsOworICAgICAgICAgICAgICAgIGRldGFjaE1hcCgoTWFwKSBuZXdWYWwsIChNYXApIGN1clZhbCwgZm1kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcm94eShuZXdWYWwsIGZpZWxkKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNBTEVOREFSOgorICAgICAgICAgICAgICAgIG5ld1ZhbCA9IChfY29weSkgPyBfcHJveHkuY29weUNhbGVuZGFyKChDYWxlbmRhcikgY3VyVmFsKSA6CisgICAgICAgICAgICAgICAgICAgIGN1clZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcm94eShuZXdWYWwsIGZpZWxkKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgbmV3VmFsID0gKF9jb3B5KSA/IF9wcm94eS5jb3B5RGF0ZSgoRGF0ZSkgY3VyVmFsKSA6IGN1clZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcm94eShuZXdWYWwsIGZpZWxkKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICBpZiAoX2NvcHkpCisgICAgICAgICAgICAgICAgICAgIG5ld1ZhbCA9IF9wcm94eS5jb3B5Q3VzdG9tKGN1clZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcHJveHkoKG5ld1ZhbCA9PSBudWxsKSA/IGN1clZhbCA6IG5ld1ZhbCwgZmllbGQpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBkZXRhY2hJbnRlcm5hbChjdXJWYWwpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VyVmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2Ugc3VyZSBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkgYXJlIGRldGFjaGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRldGFjaEFycmF5KE9iamVjdCBhcnJheSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgICAgIGlmICghZm1kLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgbGVuID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCBpLCBkZXRhY2hJbnRlcm5hbChBcnJheS5nZXQoYXJyYXksIGkpKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFrZSBzdXJlIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGFyZSBkZXRhY2hlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb2xsZWN0aW9uKENvbGxlY3Rpb24gY29sbCwgQ29sbGVjdGlvbiBvcmlnLAorICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgICAgIC8vIGNvbGwgY2FuIGJlIG51bGwgaWYgbm90IGNvcHlhYmxlCisgICAgICAgICAgICBpZiAoX2NvcHkgJiYgY29sbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtY29weWFibGUiLCBmbWQpKTsKKyAgICAgICAgICAgIGlmICghZm1kLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gY2xlYXIgdGhlIG9yaWdpbmFsIGFuZCByZS1hZGQgdG8gY29weQorICAgICAgICAgICAgaWYgKF9jb3B5KQorICAgICAgICAgICAgICAgIGNvbGwuY2xlYXIoKTsKKyAgICAgICAgICAgIE9iamVjdCBkZXRhY2hlZDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb3JpZy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGRldGFjaGVkID0gZGV0YWNoSW50ZXJuYWwoaXRyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKF9jb3B5KQorICAgICAgICAgICAgICAgICAgICBjb2xsLmFkZChkZXRhY2hlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFrZSBzdXJlIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBnaXZlbiBtYXAgYXJlIGRldGFjaGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRldGFjaE1hcChNYXAgbWFwLCBNYXAgb3JpZywgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgICAgIC8vIG1hcCBjYW4gYmUgbnVsbCBpZiBub3QgY29weWFibGUKKyAgICAgICAgICAgIGlmIChfY29weSAmJiBtYXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm90LWNvcHlhYmxlIiwgZm1kKSk7CisgICAgICAgICAgICBib29sZWFuIGtleVBDID0gZm1kLmdldEtleSgpLmlzRGVjbGFyZWRUeXBlUEMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsUEMgPSBmbWQuZ2V0RWxlbWVudCgpLmlzRGVjbGFyZWRUeXBlUEMoKTsKKyAgICAgICAgICAgIGlmICgha2V5UEMgJiYgIXZhbFBDKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSB0byBjb3B5IGtleXMsIGp1c3QgY2xlYXIgYW5kIHJlLWFkZDsgb3RoZXJ3aXNlCisgICAgICAgICAgICAvLyB3ZSBjYW4gdXNlIHRoZSBlbnRyeSBzZXQgdG8gcmVzZXQgdGhlIHZhbHVlcyBvbmx5CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgICAgICBpZiAoIV9jb3B5IHx8IGtleVBDKSB7CisgICAgICAgICAgICAgICAgaWYgKF9jb3B5KQorICAgICAgICAgICAgICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBPYmplY3Qga2V5LCB2YWw7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvcmlnLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5UEMpCisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBkZXRhY2hJbnRlcm5hbChrZXkpOworICAgICAgICAgICAgICAgICAgICB2YWwgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsUEMpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBkZXRhY2hJbnRlcm5hbCh2YWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoX2NvcHkpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCAoKTsKKwkJCQkJZW50cnkuc2V0VmFsdWUgKGRldGFjaEludGVybmFsIChlbnRyeS5nZXRWYWx1ZSAoKSkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RldGFjaFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmQwOWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIHdoaWNoIGZpZWxkcyB0byBpbmNsdWRlIGluIHRoZSBkZXRhY2ggZ3JhcGguCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIERldGFjaFN0YXRlIHsKKworICAgIC8qKgorICAgICAqIE1vZGUgdG8gZGV0YWNoIGFsbCBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgZmV0Y2ggZ3JvdXBzLgorICAgICAqIAorICAgICAqIEBzaW5jZSAwLjkuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFDSF9GRVRDSF9HUk9VUFMgPSAwOworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfRkdTID0gMDsKKworICAgIC8qKgorICAgICAqIE1vZGUgdG8gZGV0YWNoIGFsbCBjdXJyZW50bHktbG9hZGVkIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfTE9BREVEID0gMTsKKworICAgIC8qKgorICAgICAqIE1vZGUgdG8gZGV0YWNoIGFsbCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUNIX0FMTCA9IDI7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hlZFN0YXRlQXR0YWNoU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RldGFjaGVkU3RhdGVBdHRhY2hTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWY2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hlZFN0YXRlQXR0YWNoU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkFwcGxpY2F0aW9uSWRzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wdGltaXN0aWNFeGNlcHRpb247CisKKy8qKgorICogSGFuZGxlcyBhdHRhY2hpbmcgaW5zdGFuY2VzIHdpdGggZGV0YWNoZWQgc3RhdGUuCisgKgorICogQG5vamF2YWRvYworICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgRGV0YWNoZWRTdGF0ZUF0dGFjaFN0cmF0ZWd5CisgICAgZXh0ZW5kcyBBdHRhY2hTdHJhdGVneSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChEZXRhY2hlZFN0YXRlQXR0YWNoU3RyYXRlZ3kuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZXRhY2hlZE9iamVjdElkKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwKKyAgICAgICAgT2JqZWN0IHRvQXR0YWNoKSB7CisgICAgICAgIGlmICh0b0F0dGFjaCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjID0gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdG9BdHRhY2g7CisgICAgICAgIEJyb2tlciBicm9rZXIgPSBtYW5hZ2VyLmdldEJyb2tlcigpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBicm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS5nZXRNZXRhRGF0YSh0b0F0dGFjaC5nZXRDbGFzcygpLAorICAgICAgICAgICAgYnJva2VyLmdldENsYXNzTG9hZGVyKCksIHRydWUpOworCisgICAgICAgIHN3aXRjaCAobWV0YS5nZXRJZGVudGl0eVR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRToKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBzdGF0ZSA9IChPYmplY3RbXSkgcGMucGNHZXREZXRhY2hlZFN0YXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBicm9rZXIKKyAgICAgICAgICAgICAgICAgICAgLm5ld09iamVjdElkKHRvQXR0YWNoLmdldENsYXNzKCksIChTdHJpbmcpIHN0YXRlWzBdKTsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NNZXRhRGF0YS5JRF9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQXBwbGljYXRpb25JZHMuY3JlYXRlKHBjLCBtZXRhKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm92aWRlRmllbGQoT2JqZWN0IHRvQXR0YWNoLCBTdGF0ZU1hbmFnZXJJbXBsIHNtLAorICAgICAgICBpbnQgZmllbGQpIHsKKyAgICAgICAgc20ucHJvdmlkZUZpZWxkKChQZXJzaXN0ZW5jZUNhcGFibGUpIHRvQXR0YWNoLCB0aGlzLCBmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBhdHRhY2goQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBPYmplY3QgdG9BdHRhY2gsCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSwgUGVyc2lzdGVuY2VDYXBhYmxlIGludG8sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgb3duZXIsCisgICAgICAgIFZhbHVlTWV0YURhdGEgb3duZXJNZXRhLCBib29sZWFuIGV4cGxpY2l0KSB7CisgICAgICAgIEJyb2tlckltcGwgYnJva2VyID0gbWFuYWdlci5nZXRCcm9rZXIoKTsKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjID0gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdG9BdHRhY2g7CisKKyAgICAgICAgT2JqZWN0W10gc3RhdGUgPSAoT2JqZWN0W10pIHBjLnBjR2V0RGV0YWNoZWRTdGF0ZSgpOworICAgICAgICBib29sZWFuIGVtYmVkZGVkID0gb3duZXJNZXRhICE9IG51bGwgJiYgb3duZXJNZXRhLmlzRW1iZWRkZWRQQygpOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtOworCisgICAgICAgIC8vIHN0YXRlID09IG51bGwgbWVhbnMgdGhpcyBpcyBhIG5ldyBpbnN0YW5jZTsgYWxzbywgaWYgdGhlCisgICAgICAgIC8vIHN0YXRlIG1hbmFnZXIgZm9yIHRoZSBlbWJlZGRlZCBpbnN0YW5jZSBpcyBudWxsLCB0aGVuCisgICAgICAgIC8vIGl0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbmV3IGluc3RhbmNlIChzaW5jZSB0aGUKKyAgICAgICAgLy8gbmV3bHkgcGVyc2lzdGVkIG93bmVyIG1heSBjcmVhdGUgYSBuZXcgZW1iZWRkZWQgaW5zdGFuY2UKKyAgICAgICAgLy8gaW4gdGhlIGNvbnN0cnVjdG9yKTsgZml4ZWQgYnVnICMxMDc1LgorICAgICAgICAvLyBhbHNvLCBpZiB0aGUgdXNlciBoYXMgYXR0YWNoZWQgYSBkZXRhY2hlZCBvYmogZnJvbSBzb21ld2hlcmUKKyAgICAgICAgLy8gZWxzZSBpbiB0aGUgZ3JhcGggdG8gYW4gZW1iZWRkZWQgZmllbGQgdGhhdCB3YXMgcHJldmlvdXNseSBudWxsLAorICAgICAgICAvLyBjb3B5IGludG8gYSBuZXcgZW1iZWRkZWQgaW5zdGFuY2UKKyAgICAgICAgaWYgKGVtYmVkZGVkICYmIChzdGF0ZSA9PSBudWxsIHx8IGludG8gPT0gbnVsbAorICAgICAgICAgICAgfHwgYnJva2VyLmdldFN0YXRlTWFuYWdlcihpbnRvKSA9PSBudWxsKSkgeworICAgICAgICAgICAgaWYgKGludG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpbnRvID0gcGMucGNOZXdJbnN0YW5jZShudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBicm9rZXIuZW1iZWQoaW50bywgbnVsbCwgb3duZXIsIG93bmVyTWV0YSk7CisgICAgICAgICAgICBpbnRvID0gc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgc20gPSBwZXJzaXN0KG1hbmFnZXIsIHBjLCBtZXRhLCBBcHBsaWNhdGlvbklkcy5jcmVhdGUocGMsIG1ldGEpLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0KTsKKyAgICAgICAgICAgIGludG8gPSBzbS5nZXRQZXJzaXN0ZW5jZUNhcGFibGUoKTsKKyAgICAgICAgfSBlbHNlIGlmICghZW1iZWRkZWQgJiYgaW50byA9PSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgaWQgPSBnZXREZXRhY2hlZE9iamVjdElkKG1hbmFnZXIsIHBjKTsKKyAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGludG8gPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSBicm9rZXIuZmluZChpZCwgdHJ1ZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoaW50byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgbWFyayBvYmplY3RzIHRoYXQgd2VyZSBuZXcgb24gZGV0YWNoIGJ5IHB1dHRpbmcgYW4gZW1wdHkKKyAgICAgICAgICAgICAgICAvLyBleHRyYSBlbGVtZW50IGluIHRoZWlyIGRldGFjaGVkIHN0YXRlIGFycmF5CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBtZXRhLklEX0RBVEFTVE9SRSA/IDEgOiAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNOZXcgPSBzdGF0ZS5sZW5ndGggPT0gMyArIG9mZnNldDsKKworICAgICAgICAgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGFuIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGVsZXRlZAorICAgICAgICAgICAgICAgIC8vIHdpbGwgdGhyb3cgYW4gT1ZFIGlmIGl0IHdhcyBub3QgUE5FVyB3aGVuIGl0IHdhcyBkZXRhY2hlZAorICAgICAgICAgICAgICAgIGlmICghaXNOZXcpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljRXhjZXB0aW9uKF9sb2MuZ2V0KCJhdHRhY2gtZGVsZXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYy5nZXRDbGFzcygpLCBpZCkpLnNldEZhaWxlZE9iamVjdChpZCk7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QsIHdlIGFzc3VtZSB0aGF0IGl0IHdhcworICAgICAgICAgICAgICAgIC8vIG1hZGUgcGVyc2lzdGVudCBpbiBhIG5ldyB0cmFuc2FjdGlvbiwgZGV0YWNoZWQsIGFuZCB0aGVuCisgICAgICAgICAgICAgICAgLy8gdGhlIHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjazsgdGhlIGRhbmdlciBpcyB0aGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIGluc3RhbmNlIHdhcyBtYWRlIHBlcnNpc3RlbnQsIGRldGFjaGVkLCBjb21taXR0ZWQsCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gZGVsZXRlZCwgYnV0IHRoaXMgaXMgYW4gdW5jb21tb24gY2FzZQorICAgICAgICAgICAgICAgIHNtID0gcGVyc2lzdChtYW5hZ2VyLCBwYywgbWV0YSwgaWQsIGV4cGxpY2l0KTsKKyAgICAgICAgICAgICAgICBpbnRvID0gc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBudWxsaWZ5IHRoZSBzdGF0ZSwgc2luY2UgdGhlIG5ldyBpbnN0YW5jZSB3b24ndCBoYXZlIG9uZQorICAgICAgICAgICAgICAgIHN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHNtID0gbWFuYWdlci5hc3NlcnRNYW5hZ2VkKGludG8pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNtID0gbWFuYWdlci5hc3NlcnRNYW5hZ2VkKGludG8pOworCisgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhdHRhY2hlZCB0aGUgaW5zdGFuY2UgKmJlZm9yZSogd2UKKyAgICAgICAgLy8gZmlsbCBpbiB2YWx1ZXMgdG8gYXZvaWQgZW5kbGVzcyByZWN1cnNpb24KKyAgICAgICAgbWFuYWdlci5zZXRBdHRhY2hlZENvcHkocGMsIGludG8pOworICAgICAgICBtZXRhID0gc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgbWFuYWdlci5maXJlQmVmb3JlQXR0YWNoKHBjLCBtZXRhKTsKKyAgICAgICAgb2Zmc2V0ID0gbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBtZXRhLklEX0RBVEFTVE9SRSA/IDEgOiAwOworCisgICAgICAgIC8vIGFzc2lnbiB0aGUgZGV0YWNoZWQgcGMgdGhlIHNhbWUgc3RhdGUgbWFuYWdlciBhcyB0aGUgb2JqZWN0IHdlJ3JlCisgICAgICAgIC8vIGNvcHlpbmcgaW50byBkdXJpbmcgdGhlIGF0dGFjaCBwcm9jZXNzCisgICAgICAgIHBjLnBjUmVwbGFjZVN0YXRlTWFuYWdlcihzbSk7CisgICAgICAgIEJpdFNldCBmaWVsZHMgPSBzdGF0ZSA9PSBudWxsID8gbnVsbCA6IChCaXRTZXQpIHN0YXRlWzEgKyBvZmZzZXRdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBtZXRhLmdldEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBhdHRhY2ggZmllbGRzIGluIHRoZSBGRyBvZiB0aGUgZGV0YWNoZWQgaW5zdGFuY2U7IG5ldworICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlcyBnZXQgYWxsIHRoZWlyIGZpZWxkcyBhdHRhY2hlZAorICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCB8fCBmaWVsZHMuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICBhdHRhY2hGaWVsZChtYW5hZ2VyLCBwYywgc20sIGZtZHNbaV0sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcGMucGNSZXBsYWNlU3RhdGVNYW5hZ2VyKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IHRoZSBuZXh0IHZlcnNpb24gZm9yIG5vbi1uZXcgaW5zdGFuY2VzIHRoYXQgYXJlIG5vdCBlbWJlZGRlZAorICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCAmJiAhZW1iZWRkZWQpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZmllbGRzIGluIHRoZSBvcmlnaW5hbCBGRyBhcmUgbG9hZGVkCisgICAgICAgICAgICAvLyBiZWZvcmUgd2UgdHJ5IHRvIGNvbXBhcmUgdmVyc2lvbgorICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsICYmICFmaWVsZHMuZXF1YWxzKHNtLmdldExvYWRlZCgpKSkgeworICAgICAgICAgICAgICAgIEJpdFNldCB0b0xvYWQgPSAoQml0U2V0KSBmaWVsZHMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICB0b0xvYWQuYW5kTm90KHNtLmdldExvYWRlZCgpKTsgLy8gc2tpcCBhbHJlYWR5IGxvYWRlZCBmaWVsZHMKKyAgICAgICAgICAgICAgICBpZiAodG9Mb2FkLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgc20ubG9hZEZpZWxkcyh0b0xvYWQsIG51bGwsIExvY2tMZXZlbHMuTE9DS19OT05FLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIC8vIyMjIHdlIHNob3VsZCBjYWxjdWxhdGUgbG9jayBsZXZlbCBhYm92ZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBzdGF0ZVtvZmZzZXRdOworCisgICAgICAgICAgICBTdG9yZU1hbmFnZXIgc3RvcmUgPSBicm9rZXIuZ2V0U3RvcmVNYW5hZ2VyKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0b3JlLmNvbXBhcmVWZXJzaW9uKHNtLCB2ZXJzaW9uLCBzbS5nZXRWZXJzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTdG9yZU1hbmFnZXIuVkVSU0lPTl9MQVRFUjoKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGxhdGVyIHZlcnNpb246IHNldCBpdCBpbnRvIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgIC8vIGxvY2sgdmFsaWRhdGlvbiB3aWxsIG9jY3VyIGF0IGNvbW1pdCB0aW1lCisgICAgICAgICAgICAgICAgICAgIHNtLnNldFZlcnNpb24odmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU3RvcmVNYW5hZ2VyLlZFUlNJT05fRUFSTElFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFN0b3JlTWFuYWdlci5WRVJTSU9OX0RJRkZFUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgc20uc2V0VmVyc2lvbih2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNFeGNlcHRpb24oaW50byk7CisgICAgICAgICAgICAgICAgY2FzZSBTdG9yZU1hbmFnZXIuVkVSU0lPTl9TQU1FOgorICAgICAgICAgICAgICAgICAgICAvLyBubyBhY3Rpb24gcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludG87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRGV0YWNoZWRTdGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RldGFjaGVkU3RhdGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0MGFhNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RldGFjaGVkU3RhdGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LlJlZW50cmFudExvY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVW5zdXBwb3J0ZWRFeGNlcHRpb247CisKKy8qKgorICogSW50ZXJuYWwgc3RhdGUgbWFuYWdlciBmb3IgZGV0YWNoZWQgaW5zdGFuY2VzLiBEb2VzIG5vdCBmdWxseQorICogaW1wbGVtZW50IHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfSBjb250cmFjdCB0byBhbGxvdyBmb3Igc2VyaWFsaXphdGlvbi4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRGV0YWNoZWRTdGF0ZU1hbmFnZXIKKyAgICBleHRlbmRzIEF0dGFjaFN0cmF0ZWd5CisgICAgaW1wbGVtZW50cyBPcGVuSlBBU3RhdGVNYW5hZ2VyLCBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRGV0YWNoZWRTdGF0ZU1hbmFnZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZUNhcGFibGUgX3BjOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfZW1iZWRkZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9hY2Nlc3M7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRTZXQgX2xvYWRlZDsKKyAgICBwcml2YXRlIGZpbmFsIEJpdFNldCBfZGlydHk7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX29pZDsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBfdmVyc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgX2xvY2s7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYyB0aGUgbWFuYWdlZCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBzbSB0aGUgaW5zdGFuY2UncyBzdGF0ZSBtYW5hZ2VyCisgICAgICogQHBhcmFtIGxvYWQgdGhlIHNldCBvZiBkZXRhY2hlZCBmaWVsZCBpbmRleGVzCisgICAgICogQHBhcmFtIGFjY2VzcyB3aGV0aGVyIHRvIGFsbG93IGFjY2VzcyB0byB1bmxvYWRlZCBmaWVsZHMKKyAgICAgKiBAcGFyYW0gbXVsdGl0aHJlYWRlZCB3aGV0aGVyIHRoZSBpbnN0YW5jZSB3aWxsIGJlIHVzZWQgY29uY3VycmVudGx5CisgICAgICogYnkgbXVsdGlwbGUgdGhyZWFkcworICAgICAqLworICAgIHB1YmxpYyBEZXRhY2hlZFN0YXRlTWFuYWdlcihQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEJpdFNldCBsb2FkLCBib29sZWFuIGFjY2VzcywgYm9vbGVhbiBtdWx0aXRocmVhZGVkKSB7CisgICAgICAgIF9wYyA9IHBjOworICAgICAgICBfZW1iZWRkZWQgPSBzbS5pc0VtYmVkZGVkKCk7CisgICAgICAgIF9sb2FkZWQgPSBsb2FkOworICAgICAgICBfYWNjZXNzID0gYWNjZXNzOworICAgICAgICBfZGlydHkgPSBuZXcgQml0U2V0KF9sb2FkZWQubGVuZ3RoKCkpOworICAgICAgICBfb2lkID0gc20uZmV0Y2hPYmplY3RJZCgpOworICAgICAgICBfdmVyc2lvbiA9IHNtLmdldFZlcnNpb24oKTsKKyAgICAgICAgaWYgKG11bHRpdGhyZWFkZWQpCisgICAgICAgICAgICBfbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9sb2NrID0gbnVsbDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBdHRhY2hTdHJhdGVneSBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIE9iamVjdCBhdHRhY2goQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBPYmplY3QgdG9BdHRhY2gsCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSwgUGVyc2lzdGVuY2VDYXBhYmxlIGludG8sIE9wZW5KUEFTdGF0ZU1hbmFnZXIgb3duZXIsCisgICAgICAgIFZhbHVlTWV0YURhdGEgb3duZXJNZXRhLCBib29sZWFuIGV4cGxpY2l0KSB7CisgICAgICAgIEJyb2tlckltcGwgYnJva2VyID0gbWFuYWdlci5nZXRCcm9rZXIoKTsKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IG51bGw7CisgICAgICAgIGlmIChfZW1iZWRkZWQpIHsKKyAgICAgICAgICAgIGlmIChfZGlydHkubGVuZ3RoICgpID4gMCkKKyAgICAgICAgICAgICAgICBvd25lci5kaXJ0eShvd25lck1ldGEuZ2V0RmllbGRNZXRhRGF0YSgpLmdldEluZGV4KCkpOworICAgICAgICAgICAgc20gPSAoU3RhdGVNYW5hZ2VySW1wbCkgYnJva2VyLmVtYmVkKF9wYywgX29pZCwgb3duZXIsIG93bmVyTWV0YSk7CisgICAgICAgICAgICAoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdG9BdHRhY2gpLnBjUmVwbGFjZVN0YXRlTWFuYWdlcih0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBDU3RhdGUgc3RhdGUgPSAoX2RpcnR5Lmxlbmd0aCgpID4gMCkgPyBQQ1N0YXRlLlBESVJUWQorICAgICAgICAgICAgICAgIDogUENTdGF0ZS5QQ0xFQU47CisgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBicm9rZXIuY29weSh0aGlzLCBzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjID0gc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisgICAgICAgIG1hbmFnZXIuc2V0QXR0YWNoZWRDb3B5KHRvQXR0YWNoLCBwYyk7CisKKyAgICAgICAgbWFuYWdlci5maXJlQmVmb3JlQXR0YWNoKHRvQXR0YWNoLCBtZXRhKTsKKworICAgICAgICAvLyBwcmUtbG9hZCBmb3IgZWZmaWNpZW5jeTogY3VycmVudCBmaWVsZCB2YWx1ZXMgZm9yIHJlc3RvcmUsIGRlcGVuZGVudAorICAgICAgICAvLyBmb3IgZGVsZXRlCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBtZXRhLmdldEZpZWxkcygpOworICAgICAgICBpbnQgcmVzdG9yZSA9IGJyb2tlci5nZXRSZXN0b3JlU3RhdGUoKTsKKyAgICAgICAgaWYgKF9kaXJ0eS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIEJpdFNldCBsb2FkID0gbmV3IEJpdFNldChmaWVsZHMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFfZGlydHkuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlID09IFJlc3RvcmVTdGF0ZS5SRVNUT1JFX0FMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkc1tpXS5nZXRFbGVtZW50KCkuZ2V0Q2FzY2FkZURlbGV0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0FVVE8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC5zZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RvcmUgPT0gUmVzdG9yZVN0YXRlLlJFU1RPUkVfQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmllbGRzW2ldLmdldEVsZW1lbnQoKS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkc1tpXS5nZXRLZXkoKS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLnNldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RvcmUgIT0gUmVzdG9yZVN0YXRlLlJFU1RPUkVfTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkc1tpXS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLnNldChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmMgPSBicm9rZXIuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBzbS5sb2FkRmllbGRzKGxvYWQsIGZjLCBmYy5nZXRXcml0ZUxvY2tMZXZlbCgpLCBudWxsLCB0cnVlKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIE9iamVjdCBvcmlnVmVyc2lvbiA9IHNtLmdldFZlcnNpb24oKTsKKyAgICAgICAgc20uc2V0VmVyc2lvbihfdmVyc2lvbik7CisKKyAgICAgICAgQml0U2V0IGxvYWRlZCA9IHNtLmdldExvYWRlZCgpOworICAgICAgICBpbnQgc2V0ID0gU3RhdGVNYW5hZ2VyLlNFVF9BVFRBQ0g7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gZG9uJ3QgcmVsb2FkIGFscmVhZHkgbG9hZGVkIG5vbi1tdXRhYmxlIG9iamVjdHMKKyAgICAgICAgICAgIGlmICghX2RpcnR5LmdldChpKSAmJiBsb2FkZWQuZ2V0KGkpICYmIGlnbm9yZUxvYWRlZChmaWVsZHNbaV0pKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBwcm92aWRlRmllbGQoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkc1tpXS5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICBpZiAoX2RpcnR5LmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdCb29sZWFuRmllbGQocGMsIGksICghbG9hZGVkLmdldChpKSkgPyBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc20uZmV0Y2hCb29sZWFuRmllbGQoaSksIGxvbmd2YWwgPT0gMSwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVCb29sZWFuRmllbGQoaSwgbG9uZ3ZhbCA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kaXJ0eS5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nQnl0ZUZpZWxkKHBjLCBpLCAoIWxvYWRlZC5nZXQoaSkpID8gKGJ5dGUpIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNtLmZldGNoQnl0ZUZpZWxkKGkpLCAoYnl0ZSkgbG9uZ3ZhbCwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVCeXRlRmllbGQoaSwgKGJ5dGUpIGxvbmd2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgICAgICBpZiAoX2RpcnR5LmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdDaGFyRmllbGQocGMsIGksICghbG9hZGVkLmdldChpKSkgPyAoY2hhcikgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc20uZmV0Y2hDaGFyRmllbGQoaSksIChjaGFyKSBsb25ndmFsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUNoYXJGaWVsZChpLCAoY2hhcikgbG9uZ3ZhbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kaXJ0eS5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nSW50RmllbGQocGMsIGksICghbG9hZGVkLmdldChpKSkgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzbS5mZXRjaEludEZpZWxkKGkpLCAoaW50KSBsb25ndmFsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUludEZpZWxkKGksIChpbnQpIGxvbmd2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgICAgICBpZiAoX2RpcnR5LmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdMb25nRmllbGQocGMsIGksICghbG9hZGVkLmdldChpKSkgPyAwTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc20uZmV0Y2hMb25nRmllbGQoaSksIGxvbmd2YWwsIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlTG9uZ0ZpZWxkKGksIGxvbmd2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kaXJ0eS5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nU2hvcnRGaWVsZChwYywgaSwgKCFsb2FkZWQuZ2V0KGkpKSA/IChzaG9ydCkgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc20uZmV0Y2hTaG9ydEZpZWxkKGkpLCAoc2hvcnQpIGxvbmd2YWwsIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnN0b3JlU2hvcnRGaWVsZChpLCAoc2hvcnQpIGxvbmd2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kaXJ0eS5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nRmxvYXRGaWVsZChwYywgaSwgKCFsb2FkZWQuZ2V0KGkpKSA/IDBGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzbS5mZXRjaEZsb2F0RmllbGQoaSksIChmbG9hdCkgZGJsdmFsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZUZsb2F0RmllbGQoaSwgKGZsb2F0KSBkYmx2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChfZGlydHkuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ0RvdWJsZUZpZWxkKHBjLCBpLCAoIWxvYWRlZC5nZXQoaSkpID8gMEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNtLmZldGNoRG91YmxlRmllbGQoaSksIGRibHZhbCwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVEb3VibGVGaWVsZChpLCBkYmx2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChfZGlydHkuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ1N0cmluZ0ZpZWxkKHBjLCBpLCAoIWxvYWRlZC5nZXQoaSkpID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc20uZmV0Y2hTdHJpbmdGaWVsZChpKSwgKFN0cmluZykgb2JqdmFsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZVN0cmluZ0ZpZWxkKGksIChTdHJpbmcpIG9ianZhbCk7CisgICAgICAgICAgICAgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDX1VOVFlQRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0Q2FzY2FkZUF0dGFjaCgpID09IFZhbHVlTWV0YURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC5DQVNDQURFX05PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBvYmp2YWwgPSBnZXRSZWZlcmVuY2UobWFuYWdlciwgb2JqdmFsLCBzbSwgZmllbGRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgdG9QQyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqdmFsICE9IG51bGwgJiYgZmllbGRzW2ldLmlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUEMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSBvYmp2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmp2YWwgPSBtYW5hZ2VyLmF0dGFjaChvYmp2YWwsIHRvUEMsIHNtLCBmaWVsZHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChfZGlydHkuZ2V0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ09iamVjdEZpZWxkKHBjLCBpLCAoIWxvYWRlZC5nZXQoaSkpID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc20uZmV0Y2hPYmplY3RGaWVsZChpKSwgb2JqdmFsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZU9iamVjdEZpZWxkKGksIG9ianZhbCk7CisgICAgICAgICAgICAgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBvYmp2YWw7CisgICAgICAgICAgICAgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xsID0gYXR0YWNoQ29sbGVjdGlvbihtYW5hZ2VyLCBjb2xsLCBzbSwgZmllbGRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9kaXJ0eS5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nT2JqZWN0RmllbGQocGMsIGksICghbG9hZGVkLmdldChpKSkgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzbS5mZXRjaE9iamVjdEZpZWxkKGkpLCBjb2xsLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5zdG9yZU9iamVjdEZpZWxkKGksIGNvbGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBvYmp2YWw7CisgICAgICAgICAgICAgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IGF0dGFjaE1hcChtYW5hZ2VyLCBtYXAsIHNtLCBmaWVsZHNbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoX2RpcnR5LmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChwYywgaSwgKCFsb2FkZWQuZ2V0KGkpKSA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNtLmZldGNoT2JqZWN0RmllbGQoaSksIG1hcCwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVPYmplY3RGaWVsZChpLCBtYXApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoX2RpcnR5LmdldChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChwYywgaSwgKCFsb2FkZWQuZ2V0KGkpKSA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNtLmZldGNoT2JqZWN0RmllbGQoaSksIG9ianZhbCwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc20uc3RvcmVPYmplY3RGaWVsZChpLCBvYmp2YWwpOworICAgICAgICAgICAgICAgICAgICBvYmp2YWwgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBjLnBjUmVwbGFjZVN0YXRlTWFuYWdlcihzbSk7CisKKyAgICAgICAgLy8gaWYgd2Ugd2VyZSBjbGVhbiBhdCBsZWFzdCBtYWtlIHN1cmUgYSB2ZXJzaW9uIGNoZWNrIGlzIGRvbmUgdG8KKyAgICAgICAgLy8gcHJldmVudCB1c2luZyBvbGQgc3RhdGUKKyAgICAgICAgaWYgKCFzbS5pc1ZlcnNpb25DaGVja1JlcXVpcmVkKCkgJiYgYnJva2VyLmlzQWN0aXZlKCkKKyAgICAgICAgICAgICYmIF92ZXJzaW9uICE9IG9yaWdWZXJzaW9uICYmIChvcmlnVmVyc2lvbiA9PSBudWxsIAorICAgICAgICAgICAgfHwgYnJva2VyLmdldFN0b3JlTWFuYWdlcigpLmNvbXBhcmVWZXJzaW9uKHNtLCBfdmVyc2lvbiwgCisgICAgICAgICAgICBvcmlnVmVyc2lvbikgIT0gU3RvcmVNYW5hZ2VyLlZFUlNJT05fU0FNRSkpIHsKKyAgICAgICAgICAgIGJyb2tlci50cmFuc2FjdGlvbmFsKHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpLCBmYWxzZSwgCisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRCZWhhdmlvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERldGFjaGVkT2JqZWN0SWQoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLAorICAgICAgICBPYmplY3QgdG9BdHRhY2gpIHsKKyAgICAgICAgcmV0dXJuIF9vaWQ7CisgICAgfQorCisgICAgdm9pZCBwcm92aWRlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIF9wYy5wY1Byb3ZpZGVGaWVsZChmaWVsZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvdmlkZUZpZWxkKE9iamVjdCB0b0F0dGFjaCwgU3RhdGVNYW5hZ2VySW1wbCBzbSwKKyAgICAgICAgaW50IGZpZWxkKSB7CisgICAgICAgIHByb3ZpZGVGaWVsZChmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JlIGlmIHRoZSBmaWVsZCBpcyBub3QgZGlydHkgYnV0IGxvYWRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpZ25vcmVMb2FkZWQoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU5fT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVRfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVJfT0JKOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIE9iamVjdCBnZXRHZW5lcmljQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQQ1ByaW1hcnlLZXkoT2JqZWN0IG9pZCwgaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZU1hbmFnZXIgcmVwbGFjZVN0YXRlTWFuYWdlcihTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIHNtOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIF92ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oT2JqZWN0IHZlcnNpb24pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIF9kaXJ0eS5sZW5ndGgoKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZXRhY2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uVXBkYXRlUmVxdWlyZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25DaGVja1JlcXVpcmVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlydHkoU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIC8vIHNob3VsZCB3ZSBzdG9yZSBDbGFzc01ldGFEYXRhPworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoT2JqZWN0SWQoKSB7CisgICAgICAgIHJldHVybiBfb2lkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2Vzc2luZ0ZpZWxkKGludCBpZHgpIHsKKyAgICAgICAgaWYgKCFfYWNjZXNzICYmICFfbG9hZGVkLmdldChpZHgpKQorICAgICAgICAJLy8gZG8gbm90IGFjY2VzcyB0aGUgcGMgZmllbGRzIGJ5IGltcGxpY3RseSBpbnZva2luZyBfcGMudG9TdHJpbmcoKQorICAgICAgICAJLy8gbWF5IGNhdXNlIGluZmluaXRlIGxvb3AgaWYgYWdhaW4gdHJpZXMgdG8gYWNjZXNzIHVubG9hZGVkIGZpZWxkIAorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidW5sb2FkZWQtZGV0YWNoZWQiLAorICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhfcGMpKS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlcmlhbGl6aW5nKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGVEZXRhY2hlZChPYmplY3RPdXRwdXQgb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVPYmplY3QoX3BjLnBjR2V0RGV0YWNoZWRTdGF0ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KHRoaXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJveHlEZXRhY2hlZERlc2VyaWFsaXplZChpbnQgaWR4KSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9wYy5wY1Byb3ZpZGVGaWVsZChpZHgpOworICAgICAgICAgICAgaWYgKG9ianZhbCBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgICAgICgoUHJveHkpIG9ianZhbCkuc2V0T3duZXIodGhpcywgaWR4KTsKKyAgICAgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdCb29sZWFuRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LAorICAgICAgICBib29sZWFuIGN1ciwgYm9vbGVhbiBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIGFjY2Vzc2luZ0ZpZWxkKGlkeCk7CisgICAgICAgIGlmIChjdXIgPT0gbmV4dCB8fCAhX2xvYWRlZC5nZXQoaWR4KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RpcnR5LnNldChpZHgpOworICAgICAgICAgICAgbG9uZ3ZhbCA9IG5leHQgPyAxIDogMDsKKyAgICAgICAgICAgIHBjLnBjUmVwbGFjZUZpZWxkKGlkeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdDaGFyRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBjaGFyIGN1ciwKKyAgICAgICAgY2hhciBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIGFjY2Vzc2luZ0ZpZWxkKGlkeCk7CisgICAgICAgIGlmIChjdXIgPT0gbmV4dCB8fCAhX2xvYWRlZC5nZXQoaWR4KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RpcnR5LnNldChpZHgpOworICAgICAgICAgICAgbG9uZ3ZhbCA9IG5leHQ7CisgICAgICAgICAgICBwYy5wY1JlcGxhY2VGaWVsZChpZHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgYnl0ZSBjdXIsCisgICAgICAgIGJ5dGUgbmV4dCwgaW50IHNldCkgeworICAgICAgICBhY2Nlc3NpbmdGaWVsZChpZHgpOworICAgICAgICBpZiAoY3VyID09IG5leHQgfHwgIV9sb2FkZWQuZ2V0KGlkeCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9kaXJ0eS5zZXQoaWR4KTsKKyAgICAgICAgICAgIGxvbmd2YWwgPSBuZXh0OworICAgICAgICAgICAgcGMucGNSZXBsYWNlRmllbGQoaWR4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ1Nob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBzaG9ydCBjdXIsCisgICAgICAgIHNob3J0IG5leHQsIGludCBzZXQpIHsKKyAgICAgICAgYWNjZXNzaW5nRmllbGQoaWR4KTsKKyAgICAgICAgaWYgKGN1ciA9PSBuZXh0IHx8ICFfbG9hZGVkLmdldChpZHgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGlydHkuc2V0KGlkeCk7CisgICAgICAgICAgICBsb25ndmFsID0gbmV4dDsKKyAgICAgICAgICAgIHBjLnBjUmVwbGFjZUZpZWxkKGlkeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdJbnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGludCBjdXIsCisgICAgICAgIGludCBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIGFjY2Vzc2luZ0ZpZWxkKGlkeCk7CisgICAgICAgIGlmIChjdXIgPT0gbmV4dCB8fCAhX2xvYWRlZC5nZXQoaWR4KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RpcnR5LnNldChpZHgpOworICAgICAgICAgICAgbG9uZ3ZhbCA9IG5leHQ7CisgICAgICAgICAgICBwYy5wY1JlcGxhY2VGaWVsZChpZHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgbG9uZyBjdXIsCisgICAgICAgIGxvbmcgbmV4dCwgaW50IHNldCkgeworICAgICAgICBhY2Nlc3NpbmdGaWVsZChpZHgpOworICAgICAgICBpZiAoY3VyID09IG5leHQgfHwgIV9sb2FkZWQuZ2V0KGlkeCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9kaXJ0eS5zZXQoaWR4KTsKKyAgICAgICAgICAgIGxvbmd2YWwgPSBuZXh0OworICAgICAgICAgICAgcGMucGNSZXBsYWNlRmllbGQoaWR4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0Zsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBmbG9hdCBjdXIsCisgICAgICAgIGZsb2F0IG5leHQsIGludCBzZXQpIHsKKyAgICAgICAgYWNjZXNzaW5nRmllbGQoaWR4KTsKKyAgICAgICAgaWYgKGN1ciA9PSBuZXh0IHx8ICFfbG9hZGVkLmdldChpZHgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGlydHkuc2V0KGlkeCk7CisgICAgICAgICAgICBkYmx2YWwgPSBuZXh0OworICAgICAgICAgICAgcGMucGNSZXBsYWNlRmllbGQoaWR4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0RvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgZG91YmxlIGN1ciwKKyAgICAgICAgZG91YmxlIG5leHQsIGludCBzZXQpIHsKKyAgICAgICAgYWNjZXNzaW5nRmllbGQoaWR4KTsKKyAgICAgICAgaWYgKGN1ciA9PSBuZXh0IHx8ICFfbG9hZGVkLmdldChpZHgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGlydHkuc2V0KGlkeCk7CisgICAgICAgICAgICBkYmx2YWwgPSBuZXh0OworICAgICAgICAgICAgcGMucGNSZXBsYWNlRmllbGQoaWR4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ1N0cmluZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgU3RyaW5nIGN1ciwKKyAgICAgICAgU3RyaW5nIG5leHQsIGludCBzZXQpIHsKKyAgICAgICAgYWNjZXNzaW5nRmllbGQoaWR4KTsKKyAgICAgICAgaWYgKGN1ciA9PSBuZXh0IHx8ICFfbG9hZGVkLmdldChpZHgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGlydHkuc2V0KGlkeCk7CisgICAgICAgICAgICBvYmp2YWwgPSBuZXh0OworICAgICAgICAgICAgcGMucGNSZXBsYWNlRmllbGQoaWR4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgb2JqdmFsID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdPYmplY3RGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIE9iamVjdCBjdXIsCisgICAgICAgIE9iamVjdCBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIGFjY2Vzc2luZ0ZpZWxkKGlkeCk7CisgICAgICAgIGlmIChjdXIgPT0gbmV4dCB8fCAhX2xvYWRlZC5nZXQoaWR4KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RpcnR5LnNldChpZHgpOworICAgICAgICAgICAgb2JqdmFsID0gbmV4dDsKKyAgICAgICAgICAgIHBjLnBjUmVwbGFjZUZpZWxkKGlkeCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEJvb2xlYW5GaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsCisgICAgICAgIGJvb2xlYW4gY3VyKSB7CisgICAgICAgIGxvbmd2YWwgPSBjdXIgPyAxIDogMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZENoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGNoYXIgY3VyKSB7CisgICAgICAgIGxvbmd2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBieXRlIGN1cikgeworICAgICAgICBsb25ndmFsID0gY3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIHNob3J0IGN1cikgeworICAgICAgICBsb25ndmFsID0gY3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBpbnQgY3VyKSB7CisgICAgICAgIGxvbmd2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBsb25nIGN1cikgeworICAgICAgICBsb25ndmFsID0gY3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGZsb2F0IGN1cikgeworICAgICAgICBkYmx2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWREb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsCisgICAgICAgIGRvdWJsZSBjdXIpIHsKKyAgICAgICAgZGJsdmFsID0gY3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LAorICAgICAgICBTdHJpbmcgY3VyKSB7CisgICAgICAgIG9ianZhbCA9IGN1cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZE9iamVjdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgT2JqZWN0IGN1cikgeworICAgICAgICBvYmp2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZUJvb2xlYW5GaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIGxvbmd2YWwgPT0gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciByZXBsYWNlQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICByZXR1cm4gKGNoYXIpIGxvbmd2YWw7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgcmVwbGFjZUJ5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIChieXRlKSBsb25ndmFsOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCByZXBsYWNlU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIChzaG9ydCkgbG9uZ3ZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlcGxhY2VJbnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIGxvbmd2YWw7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgcmVwbGFjZUxvbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIGxvbmd2YWw7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHJlcGxhY2VGbG9hdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICByZXR1cm4gKGZsb2F0KSBkYmx2YWw7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSByZXBsYWNlRG91YmxlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHJldHVybiBkYmx2YWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyByZXBsYWNlU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKSBvYmp2YWw7CisgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZXBsYWNlT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIE9iamVjdCByZXQgPSBvYmp2YWw7CisgICAgICAgIG9ianZhbCA9IG51bGw7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ2xhc3MgZm9yVHlwZSwgUENTdGF0ZSBzdGF0ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1hbmFnZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYzsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VDYXBhYmxlIGdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZ2V0T3duZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZU1ldGFEYXRhIGdldE93bmVyTWV0YURhdGEoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWQoKSB7CisgICAgICAgIHJldHVybiBfZW1iZWRkZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGbHVzaGVkKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZsdXNoZWREaXJ0eSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aXNpb25hbCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCBnZXRMb2FkZWQoKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVkOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0RGlydHkoKSB7CisgICAgICAgIHJldHVybiBfZGlydHk7CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCBnZXRGbHVzaGVkKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IGdldFVubG9hZGVkKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld1Byb3h5KGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0ZpZWxkUHJveHkoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFZhbHVlKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBQQ1N0YXRlIGdldFBDU3RhdGUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SWQoKSB7CisgICAgICAgIHJldHVybiBfb2lkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdElkKE9iamVjdCBvaWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduT2JqZWN0SWQoYm9vbGVhbiBmbHVzaCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgeworICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldExvY2soKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2soT2JqZWN0IGxvY2spIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmV4dFZlcnNpb24oT2JqZWN0IHZlcnNpb24pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbXBsRGF0YSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXRJbXBsRGF0YShPYmplY3QgZGF0YSwgYm9vbGVhbiBjYWNoZWFibGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbXBsRGF0YUNhY2hlYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW1wbERhdGEoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3Qgc2V0SW1wbERhdGEoaW50IGZpZWxkLCBPYmplY3QgZGF0YSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltcGxEYXRhQ2FjaGVhYmxlKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEludGVybWVkaWF0ZShpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJtZWRpYXRlKGludCBmaWVsZCwgT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlZChpbnQgZmllbGQsIE9iamVjdCByZW1vdmVkLCBib29sZWFuIGtleSkgeworICAgICAgICBkaXJ0eShmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlUmVmcmVzaChib29sZWFuIGFsbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShpbnQgZmllbGQpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RpcnR5LnNldChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbihpbnQgZmllbGQsIGJvb2xlYW4gZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQnl0ZShpbnQgZmllbGQsIGJ5dGUgZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hhcihpbnQgZmllbGQsIGNoYXIgZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlSW50KGludCBmaWVsZCwgaW50IGV4dFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVNob3J0KGludCBmaWVsZCwgc2hvcnQgZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlTG9uZyhpbnQgZmllbGQsIGxvbmcgZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXQoaW50IGZpZWxkLCBmbG9hdCBleHRWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVEb3VibGUoaW50IGZpZWxkLCBkb3VibGUgZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU3RyaW5nKGludCBmaWVsZCwgU3RyaW5nIGV4dFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdChpbnQgZmllbGQsIE9iamVjdCBleHRWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmUoaW50IGZpZWxkLCBPYmplY3QgZXh0VmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmllbGQoaW50IGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZmV0Y2hCb29sZWFuKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBmZXRjaEJ5dGUoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGZldGNoQ2hhcihpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGZldGNoU2hvcnQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGZldGNoTG9uZyhpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGZldGNoRmxvYXQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGUoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmcoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3QoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2goaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hGaWVsZChpbnQgZmllbGQsIGJvb2xlYW4gdHJhbnNpdGlvbnMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaEluaXRpYWxGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlKGludCBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvY2soKSB7CisgICAgICAgIGlmIChfbG9jayAhPSBudWxsKQorICAgICAgICAgICAgX2xvY2subG9jaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVubG9jaygpIHsKKyAgICAgICAgaWYgKF9sb2NrICE9IG51bGwpCisgICAgICAgICAgICBfbG9jay51bmxvY2soKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hlZFZhbHVlU3RhdGVNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9EZXRhY2hlZFZhbHVlU3RhdGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4MGYyZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0RldGFjaGVkVmFsdWVTdGF0ZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDU5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkZpZWxkTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfSBkZXNpZ25lZCB0byByZXRyaWV2ZQorICogdmFsdWVzIGZyb20gYSBkZXRhY2hlZCBpbnN0YW5jZSwgaW5jbHVkaW5nIHdoZW4gbWFuYWdlZCBieSBhCisgKiB7QGxpbmsgRGV0YWNoZWRTdGF0ZU1hbmFnZXJ9LgorICovCitwdWJsaWMgY2xhc3MgRGV0YWNoZWRWYWx1ZVN0YXRlTWFuYWdlcgorICAgIGV4dGVuZHMgVHJhbnNmZXJGaWVsZE1hbmFnZXIKKyAgICBpbXBsZW1lbnRzIE9wZW5KUEFTdGF0ZU1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRGV0YWNoZWRWYWx1ZVN0YXRlTWFuYWdlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIFBlcnNpc3RlbmNlQ2FwYWJsZSBfcGM7CisgICAgcHJpdmF0ZSBTdG9yZUNvbnRleHQgX2N0eDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGE7CisKKyAgICBwdWJsaWMgRGV0YWNoZWRWYWx1ZVN0YXRlTWFuYWdlcihPYmplY3QgcGMsIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdGhpcygoUGVyc2lzdGVuY2VDYXBhYmxlKSBwYywgY3R4LmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuZ2V0TWV0YURhdGEocGMuZ2V0Q2xhc3MoKSwKKyAgICAgICAgICAgIGN0eC5nZXRDbGFzc0xvYWRlcigpLCB0cnVlKSwgY3R4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGV0YWNoZWRWYWx1ZVN0YXRlTWFuYWdlcihQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICBfcGMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSBwYzsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgICAgICBfY3R4ID0gY3R4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ2xhc3MgZm9yVHlwZSwgUENTdGF0ZSBzdGF0ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1hbmFnZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYzsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VDYXBhYmxlIGdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWVNZXRhRGF0YSBnZXRPd25lck1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGbHVzaGVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGbHVzaGVkRGlydHkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3Zpc2lvbmFsKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCBnZXRMb2FkZWQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0RGlydHkoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0Rmx1c2hlZCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCBnZXRVbmxvYWRlZChGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdQcm94eShpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdGaWVsZFByb3h5KGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZShpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFN0b3JlQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gX2N0eDsKKyAgICB9CisKKyAgICBwdWJsaWMgUENTdGF0ZSBnZXRQQ1N0YXRlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgeworICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdElkKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChPYmplY3Qgb2lkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFzc2lnbk9iamVjdElkKGJvb2xlYW4gZmx1c2gpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRMb2NrKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrKE9iamVjdCBsb2NrKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihPYmplY3QgdmVyc2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0VmVyc2lvbihPYmplY3QgdmVyc2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25VcGRhdGVSZXF1aXJlZCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbXBsRGF0YSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXRJbXBsRGF0YShPYmplY3QgZGF0YSwgYm9vbGVhbiBjYWNoZWFibGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbXBsRGF0YUNhY2hlYWJsZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbXBsRGF0YShpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXRJbXBsRGF0YShpbnQgZmllbGQsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW50ZXJtZWRpYXRlKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcm1lZGlhdGUoaW50IGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgdm9pZCBwcm92aWRlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGlmIChfcGMucGNHZXRTdGF0ZU1hbmFnZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKF9sb2MuZ2V0KCJkZXRhY2gtdmFsLW1pc21hdGNoIiwgX3BjKSk7CisgICAgICAgIF9wYy5wY1JlcGxhY2VTdGF0ZU1hbmFnZXIodGhpcyk7CisgICAgICAgIF9wYy5wY1Byb3ZpZGVGaWVsZChmaWVsZCk7CisgICAgICAgIF9wYy5wY1JlcGxhY2VTdGF0ZU1hbmFnZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZmV0Y2hCb29sZWFuKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBmZXRjaEJ5dGUoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGZldGNoQ2hhcihpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBmZXRjaERvdWJsZShpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGZldGNoRmxvYXQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGZldGNoTG9uZyhpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdChpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGZldGNoU2hvcnQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmcoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hGcm9tRGV0YWNoZWRTTShEZXRhY2hlZFN0YXRlTWFuYWdlciBzbSwgaW50IGZpZWxkKSB7CisgICAgICAgIHNtLmxvY2soKTsKKyAgICAgICAgc20ucHJvdmlkZUZpZWxkKGZpZWxkKTsKKyAgICAgICAgT2JqZWN0IHZhbCA9IGZldGNoRmllbGQoc20sIGZpZWxkKTsKKyAgICAgICAgc20uY2xlYXIoKTsKKyAgICAgICAgc20udW5sb2NrKCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaChpbnQgZmllbGQpIHsKKyAgICAgICAgU3RhdGVNYW5hZ2VyIHNtID0gX3BjLnBjR2V0U3RhdGVNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc20gaW5zdGFuY2VvZiBEZXRhY2hlZFN0YXRlTWFuYWdlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hGcm9tRGV0YWNoZWRTTSgoRGV0YWNoZWRTdGF0ZU1hbmFnZXIpIHNtLCBmaWVsZCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoImRldGFjaC12YWwtYmFkc20iLCBfcGMpKTsKKyAgICAgICAgfQorICAgICAgICBwcm92aWRlRmllbGQoZmllbGQpOworICAgICAgICBPYmplY3QgdmFsID0gZmV0Y2hGaWVsZChmaWVsZCwgZmFsc2UpOworICAgICAgICBjbGVhcigpOworICAgICAgICByZXR1cm4gX21ldGEuZ2V0RmllbGQoZmllbGQpLmdldEV4dGVybmFsVmFsdWUodmFsLCBfY3R4LmdldEJyb2tlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoRmllbGQoaW50IGZpZWxkLCBib29sZWFuIHRyYW5zaXRpb25zKSB7CisgICAgICAgIGlmICh0cmFuc2l0aW9ucykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIGZldGNoRmllbGQodGhpcywgZmllbGQpOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGZldGNoRmllbGQoRmllbGRNYW5hZ2VyIGZtLCBpbnQgZmllbGQpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBmbS5mZXRjaFN0cmluZ0ZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZm0uZmV0Y2hPYmplY3RGaWVsZChmaWVsZCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiAoZm0uZmV0Y2hCb29sZWFuRmllbGQoZmllbGQpKSA/IEJvb2xlYW4uVFJVRQorICAgICAgICAgICAgICAgICAgICA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZShmbS5mZXRjaEJ5dGVGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihmbS5mZXRjaENoYXJGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKGZtLmZldGNoRG91YmxlRmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQoZm0uZmV0Y2hGbG9hdEZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihmbS5mZXRjaEludEZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoZm0uZmV0Y2hMb25nRmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQoZm0uZmV0Y2hTaG9ydEZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmbS5mZXRjaE9iamVjdEZpZWxkKGZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hJbml0aWFsRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbihpbnQgZmllbGQsIGJvb2xlYW4gZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVCeXRlKGludCBmaWVsZCwgYnl0ZSBleHRlcm5hbFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoYXIoaW50IGZpZWxkLCBjaGFyIGV4dGVybmFsVmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRG91YmxlKGludCBmaWVsZCwgZG91YmxlIGV4dGVybmFsVmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXQoaW50IGZpZWxkLCBmbG9hdCBleHRlcm5hbFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUludChpbnQgZmllbGQsIGludCBleHRlcm5hbFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUxvbmcoaW50IGZpZWxkLCBsb25nIGV4dGVybmFsVmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlT2JqZWN0KGludCBmaWVsZCwgT2JqZWN0IGV4dGVybmFsVmFsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU2hvcnQoaW50IGZpZWxkLCBzaG9ydCBleHRlcm5hbFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVN0cmluZyhpbnQgZmllbGQsIFN0cmluZyBleHRlcm5hbFZhbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZShpbnQgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZpZWxkKGludCBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpcnR5KGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVkKGludCBmaWVsZCwgT2JqZWN0IHJlbW92ZWQsIGJvb2xlYW4ga2V5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVJlZnJlc2goYm9vbGVhbiByZWZyZXNoQWxsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZShpbnQgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIE9iamVjdCBnZXRHZW5lcmljQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9jdHg7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQQ1ByaW1hcnlLZXkoT2JqZWN0IG9pZCwgaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZU1hbmFnZXIgcmVwbGFjZVN0YXRlTWFuYWdlcihTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIHNtOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RldGFjaGVkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdElkKCkgeworICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXJpYWxpemluZygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGVEZXRhY2hlZChPYmplY3RPdXRwdXQgb3V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3h5RGV0YWNoZWREZXNlcmlhbGl6ZWQoaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3NpbmdGaWVsZChpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgYm9vbGVhbiBjdXIpIHsKKyAgICAgICAgbG9uZ3ZhbCA9IGN1ciA/IDEgOiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgY2hhciBjdXIpIHsKKyAgICAgICAgbG9uZ3ZhbCA9IGN1cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEJ5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGJ5dGUgY3VyKSB7CisgICAgICAgIGxvbmd2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRTaG9ydEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgc2hvcnQgY3VyKSB7CisgICAgICAgIGxvbmd2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRJbnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGludCBjdXIpIHsKKyAgICAgICAgbG9uZ3ZhbCA9IGN1cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZExvbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGxvbmcgY3VyKSB7CisgICAgICAgIGxvbmd2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRGbG9hdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgZmxvYXQgY3VyKSB7CisgICAgICAgIGRibHZhbCA9IGN1cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZERvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgZG91YmxlIGN1cikgeworICAgICAgICBkYmx2YWwgPSBjdXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsCisgICAgICAgIFN0cmluZyBjdXIpIHsKKyAgICAgICAgb2JqdmFsID0gY3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LAorICAgICAgICBPYmplY3QgY3VyKSB7CisgICAgICAgIG9ianZhbCA9IGN1cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgYm9vbGVhbiBjdXIsIGJvb2xlYW4gbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgY2hhciBjdXIsCisgICAgICAgIGNoYXIgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgYnl0ZSBjdXIsCisgICAgICAgIGJ5dGUgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIHNob3J0IGN1ciwKKyAgICAgICAgc2hvcnQgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBpbnQgY3VyLAorICAgICAgICBpbnQgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgbG9uZyBjdXIsCisgICAgICAgIGxvbmcgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGZsb2F0IGN1ciwKKyAgICAgICAgZmxvYXQgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nRG91YmxlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBkb3VibGUgY3VyLAorICAgICAgICBkb3VibGUgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBTdHJpbmcgY3VyLAorICAgICAgICBTdHJpbmcgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBPYmplY3QgY3VyLAorICAgICAgICBPYmplY3QgbmV4dCwgaW50IHNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciByZXBsYWNlQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSByZXBsYWNlQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgcmVwbGFjZVNob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVwbGFjZUludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyByZXBsYWNlTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgcmVwbGFjZUZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgcmVwbGFjZURvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2VTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZXBsYWNlT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRUNsZWFuU3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0VDbGVhblN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0MjcwMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0VDbGVhblN0YXRlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYW4gZW1iZWRkZWQgaW5zdGFuY2UgdGhhdCBpcyBtYW5hZ2VkIGJ5IGEgU3RhdGVNYW5hZ2VyIGFuZAorICogbWF5IGJlIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGN1cnJlbnQJdHJhbnNhY3Rpb24sIGJ1dCBoYXMgbm90IHlldCBiZWVuCisgKiBtb2RpZmllZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFQ2xlYW5TdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuc2V0RGlydHkoZmFsc2UpOworICAgIH0KKworICAgIFBDU3RhdGUgY29tbWl0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgY29tbWl0UmV0YWluKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gRU5PTlRSQU5TOworICAgIH0KKworICAgIFBDU3RhdGUgcm9sbGJhY2soU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFja1Jlc3RvcmUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBFTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSBkZWxldGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucHJlRGVsZXRlKCk7CisgICAgICAgIHJldHVybiBFREVMRVRFRDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIG5vbnRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBFTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgZXZpY3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIEVESVJUWTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIEVESVJUWTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRUNvcHlTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRUNvcHlTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYWU0MzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9FQ29weVN0YXRlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2UgdGhhdCB3YXMgY29waWVkIGFuZCBtYWRlIGVtYmVkZGVkIHdpdGhpbiB0aGUKKyAqIGN1cnJlbnQJdHJhbnNhY3Rpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgRUNvcHlTdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gc2F2ZSBmaWVsZHMsIGJlY2F1c2UgdGhpcyB0cmFuc2l0aW9uIGRvZXNuJ3QgaGFwcGVuCisgICAgICAgIC8vIHVudGlsIHRoZSBmbHVzaCBwcm9jZXNzIGJlZ2lucworICAgICAgICBjb250ZXh0LnNldExvYWRlZCh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eSh0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGJlZm9yZUZsdXNoKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgYm9vbGVhbiBsb2dpY2FsLAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGNvbnRleHQucHJlRmx1c2gobG9naWNhbCwgY2FsbCk7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBFTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFjayhTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrUmVzdG9yZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEVOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGRlbGV0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5wcmVEZWxldGUoKTsKKyAgICAgICAgcmV0dXJuIEVERUxFVEVEOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkaXJ0eSIsIGNvbnRleHQpOworICAgIH0KKworICAgIFBDU3RhdGUgcmVsZWFzZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRURlbGV0ZWRTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRURlbGV0ZWRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTMyYTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9FRGVsZXRlZFN0YXRlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYW4gZW1iZWRkZWQgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkZWxldGVkIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFRGVsZXRlZFN0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIFBDU3RhdGUgY29tbWl0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcm9sbGJhY2tSZXN0b3JlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlc3RvcmVGaWVsZHMoKTsKKyAgICAgICAgcmV0dXJuIEVOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIG5vbnRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBlcnJvcigiZGlydHkiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJlbGVhc2UoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9FRGlydHlTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRURpcnR5U3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNiNTIwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRURpcnR5U3RhdGUuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhbiBlbWJlZGRlZCBpbnN0YW5jZSB0aGF0IGlzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uLCBhbmQgaGFzIGJlZW4gbW9kaWZpZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgRURpcnR5U3RhdGUKKyAgICBleHRlbmRzIFBDU3RhdGUgeworCisgICAgdm9pZCBpbml0aWFsaXplKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnNhdmVGaWVsZHMoZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgYmVmb3JlRmx1c2goU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBib29sZWFuIGxvZ2ljYWwsCisgICAgICAgIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgY29udGV4dC5wcmVGbHVzaChsb2dpY2FsLCBjYWxsKTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGNvbW1pdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGNvbW1pdFJldGFpbihTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEVOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcm9sbGJhY2tSZXN0b3JlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlc3RvcmVGaWVsZHMoKTsKKyAgICAgICAgcmV0dXJuIEVOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGRlbGV0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5wcmVEZWxldGUoKTsKKyAgICAgICAgcmV0dXJuIEVERUxFVEVEOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkaXJ0eSIsIGNvbnRleHQpOworICAgIH0KKworICAgIFBDU3RhdGUgcmVsZWFzZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGFmdGVyUmVmcmVzaCgpIHsKKyAgICAgICAgcmV0dXJuIEVDTEVBTjsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGFmdGVyT3B0aW1pc3RpY1JlZnJlc2goKSB7CisgICAgICAgIHJldHVybiBFTk9OVFJBTlM7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0VOb25UcmFuc1N0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9FTm9uVHJhbnNTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjBmZDUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9FTm9uVHJhbnNTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBMaWZlY3ljbGUgc3RhdGUuCisgKiBSZXByZXNlbnRzIGFuIGVtYmVkZGVkIGluc3RhbmNlIHRoYXQgaXMgbm90IHRyYW5zYWN0aW9uYWwsIGJ1dCB0aGF0CisgKiBhbGxvd3MgYWNjZXNzIHRvIHBlcnNpc3RlbnQgZGF0YS4gVGhpcyBzdGF0ZSBpcyByZWFjaGFibGUgb25seSBpZiB0aGUKKyAqIHJldGFpblZhbHVlcyBmbGFnIG9mIHRoZSBicm9rZXIgaXMgc2V0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEVOb25UcmFuc1N0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eShmYWxzZSk7CisgICAgICAgIGNvbnRleHQuY2xlYXJTYXZlZEZpZWxkcygpOworCisgICAgICAgIC8vIHNwZWMgc2F5cyBhbGwgcHJveGllcyB0byBzZWNvbmQgY2xhc3Mgb2JqZWN0cyBzaG91bGQgYmUgcmVzZXQKKyAgICAgICAgY29udGV4dC5wcm94eUZpZWxkcyh0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGRlbGV0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5wcmVEZWxldGUoKTsKKyAgICAgICAgcmV0dXJuIEVERUxFVEVEOworICAgIH0KKworICAgIFBDU3RhdGUgdHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgLy8gc3RhdGUgaXMgZGlzY2FyZGVkIHdoZW4gZW50ZXJpbmcgdGhlIHRyYW5zYWN0aW9uCisgICAgICAgIGlmICghY29udGV4dC5nZXRCcm9rZXIoKS5nZXRPcHRpbWlzdGljKCkpCisgICAgICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgIHJldHVybiBFQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgZXZpY3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVSZWFkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBlcnJvcigiZW1iZWQtcmVmIiwgY29udGV4dCk7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJlbWJlZC1yZWYiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIEVESVJUWTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9FeHByZXNzaW9uU3RvcmVRdWVyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRXhwcmVzc2lvblN0b3JlUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVhYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRXhwcmVzc2lvblN0b3JlUXVlcnkuamF2YQpAQCAtMCwwICsxLDczNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MaW5rZWRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFic3RyYWN0RXhwcmVzc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFnZ3JlZ2F0ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5Db25zdGFudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkZpbHRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5Jbk1lbW9yeUV4cHJlc3Npb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5RdWVyeUV4cHJlc3Npb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5SZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuU3RyaW5nQ29udGFpbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlZhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLldpbGRjYXJkTWF0Y2g7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbi1iYXNlZCBxdWVyeSwgd2hpY2ggY2FuIGhhbmRsZQorICogU3RyaW5nLWJhc2VkIHF1ZXJ5IGV4cHJlc3Npb25zIHN1Y2ggYXMgSlBRTCBhbmQgSkRPUUwuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN1aXRhYmxlIGZvciBpbi1tZW1vcnkgb3BlcmF0aW9uLgorICogT3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIGFsc28gc3VwcG9ydCBkYXRhc3RvcmUgb3BlcmF0aW9uOgorICogPHVsPgorICogPGxpPk92ZXJyaWRlIHtAbGluayAjc3VwcG9ydHNEYXRhU3RvcmVFeGVjdXRpb259IHRvIHJldHVybgorICogPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKyAqIDxsaT5PdmVycmlkZSB7QGxpbmsgI2V4ZWN1dGVRdWVyeX0sIHtAbGluayAjZXhlY3V0ZURlbGV0ZX0sIGFuZAorICoge0BsaW5rICNleGVjdXRlVXBkYXRlfSB0byBleGVjdXRlIHRoZSBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhIHN0b3JlLgorICogS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG1pZ2h0IGJlIGluIHVzZQorICogYnkgc2V2ZXJhbCB0aHJlYWRzIGluIGRpZmZlcmVudCBxdWVyeSBpbnN0YW5jZXMuIFRodXMgY29tcG9uZW50cyBsaWtlCisgKiB0aGUgZXhwcmVzc2lvbiBmYWN0b3J5IG11c3QgZWl0aGVyIGJlIHRocmVhZCBzYWZlLCBvciB0aGlzIG1ldGhvZCBtdXN0CisgKiBzeW5jaHJvbml6ZSBvbiB0aGVtLjwvbGk+CisgKiA8bGk+T3ZlcnJpZGUge0BsaW5rICNnZXREYXRhU3RvcmVBY3Rpb25zfSB0byByZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZgorICogdGhlIGFjdGlvbnMgdGhhdCB3aWxsIGJlIHRha2VuIG9uIHRoZSBkYXRhIHN0b3JlLiBGb3IgdXNlIGluIHZpc3VhbAorICogdG9vbHMuPC9saT4KKyAqIDxsaT5PdmVycmlkZSB7QGxpbmsgI2dldEV4cHJlc3Npb25GYWN0b3J5fSB0byByZXR1cm4gYSBmYWN0b3J5IGZvciBjcmVhdGluZworICogZXhwcmVzc2lvbnMgaW4gdGhlIGRhdGFzdG9yZSdzIGxhbmd1YWdlLiBUaGUgZmFjdG9yeSBtdXN0IGJlIGNhY2hhYmxlLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uU3RvcmVRdWVyeQorICAgIGV4dGVuZHMgQWJzdHJhY3RTdG9yZVF1ZXJ5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEV4cHJlc3Npb25TdG9yZVF1ZXJ5LmNsYXNzKTsKKworICAgIC8vIG1haW50YWluIHN1cHBvcnQgZm9yIGEgY291cGxlIG9mIGRlcHJlY2F0ZWQgZXh0ZW5zaW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbHRlckxpc3RlbmVyW10gX2xpc3RlbmVycyA9IG5ldyBGaWx0ZXJMaXN0ZW5lcltdeworICAgICAgICBuZXcgU3RyaW5nQ29udGFpbnMoKSwgbmV3IFdpbGRjYXJkTWF0Y2goKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uUGFyc2VyIF9wYXJzZXI7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IF9wYXJzZWQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBxdWVyeSB3aXRoIGEgcGFyc2VyIGZvciB0aGUgbGFuZ3VhZ2UuCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb25TdG9yZVF1ZXJ5KEV4cHJlc3Npb25QYXJzZXIgcGFyc2VyKSB7CisgICAgICAgIF9wYXJzZXIgPSBwYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZXIgdXNlZCBpbiBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvbHZlciBnZXRSZXNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGltcG9ydHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmNsYXNzRm9yTmFtZShuYW1lLCBpbXBvcnRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZpbHRlckxpc3RlbmVyIGdldEZpbHRlckxpc3RlbmVyKFN0cmluZyB0YWcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmdldEZpbHRlckxpc3RlbmVyKHRhZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGVMaXN0ZW5lciBnZXRBZ2dyZWdhdGVMaXN0ZW5lcihTdHJpbmcgdGFnKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5nZXRBZ2dyZWdhdGVMaXN0ZW5lcih0YWcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmdldFN0b3JlQ29udGV4dCgpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBkaXJlY3Qgc2V0dGluZyBvZiBwYXJzZWQgc3RhdGUgZm9yIGZhY2FkZXMgdGhhdCBkbyBwYXJzaW5nLgorICAgICAqIFRoZSBmYWNhZGUgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdHdpY2U6IG9uY2Ugd2l0aCB0aGUgcXVlcnkgc3RyaW5nLAorICAgICAqIGFuZCBhZ2FpbiB3aXRoIHRoZSBwYXJzZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0UXVlcnkoT2JqZWN0IHF1ZXJ5KSB7CisgICAgICAgIF9wYXJzZWQgPSBxdWVyeTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIEZpbHRlckxpc3RlbmVyIGdldEZpbHRlckxpc3RlbmVyKFN0cmluZyB0YWcpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKF9saXN0ZW5lcnNbaV0uZ2V0VGFnKCkuZXF1YWxzKHRhZykpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0ZW5lcnNbaV07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3Q29tcGlsYXRpb24oKSB7CisgICAgICAgIGlmIChfcGFyc2VkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX3BhcnNlZDsKKyAgICAgICAgcmV0dXJuIF9wYXJzZXIucGFyc2UoY3R4LmdldFF1ZXJ5U3RyaW5nKCksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRnJvbUNvbXBpbGF0aW9uKE9iamVjdCBjb21wKSB7CisgICAgICAgIF9wYXJzZXIucG9wdWxhdGUoY29tcCwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZUNvbXBpbGF0aW9uKCkgeworICAgICAgICBfcGFyc2VkID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0luTWVtb3J5RXhlY3V0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhlY3V0b3IgbmV3SW5NZW1vcnlFeGVjdXRvcihDbGFzc01ldGFEYXRhIG1ldGEsIGJvb2xlYW4gc3VicykgeworICAgICAgICByZXR1cm4gbmV3IEluTWVtb3J5RXhlY3V0b3IodGhpcywgbWV0YSwgc3VicywgX3BhcnNlciwKKyAgICAgICAgICAgIGN0eC5nZXRDb21waWxhdGlvbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhlY3V0b3IgbmV3RGF0YVN0b3JlRXhlY3V0b3IoQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU3RvcmVFeGVjdXRvcih0aGlzLCBtZXRhLCBzdWJzLCBfcGFyc2VyLAorICAgICAgICAgICAgY3R4LmdldENvbXBpbGF0aW9uKCkpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE1ldGhvZHMgZm9yIE92ZXJyaWRlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIGFnYWluc3QgdGhlIGdpdmVuIGNhbmRpZGF0ZSBleHRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXggY3VycmVudCBleGVjdXRvcgorICAgICAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIHR5cGUgdGhlIHF1ZXJ5IHNob3VsZCBtYXRjaAorICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgaW5kZXBlbmRlbnQgY2FuZGlkYXRlIHR5cGVzCisgICAgICogQHBhcmFtIHN1YmNsYXNzZXMgdHJ1ZSBpZiBzdWJjbGFzc2VzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cworICAgICAqIEBwYXJhbSBmYWN0cyB0aGUgZXhwcmVzc2lvbiBmYWN0b3J5IHVzZWQgdG8gYnVpbGQgdGhlIHF1ZXJ5IGZvcgorICAgICAqIGVhY2ggYmFzZSB0eXBlCisgICAgICogQHBhcmFtIHBhcnNlZCB0aGUgcGFyc2VkIHF1ZXJ5IHZhbHVlcworICAgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVyIHZhbHVlcywgb3IgZW1wdHkgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgcmVzdWx0IHJhbmdlCisgICAgICogQHJldHVybiBhIHByb3ZpZGVyIGZvciBtYXRjaGluZyBvYmplY3RzCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVRdWVyeShFeGVjdXRvciBleCwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBiYXNlLCBDbGFzc01ldGFEYXRhW10gdHlwZXMsIGJvb2xlYW4gc3ViY2xhc3NlcywKKyAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnlbXSBmYWN0cywgUXVlcnlFeHByZXNzaW9uc1tdIHBhcnNlZCwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICBSYW5nZSByYW5nZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIGFnYWluc3QgdGhlIGdpdmVuIGNhbmRpZGF0ZSBleHRlbnQKKyAgICAgKiBhbmQgZGVsZXRlIHRoZSBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXggY3VycmVudCBleGVjdXRvcgorICAgICAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIHR5cGUgdGhlIHF1ZXJ5IHNob3VsZCBtYXRjaAorICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgaW5kZXBlbmRlbnQgY2FuZGlkYXRlIHR5cGVzCisgICAgICogQHBhcmFtIHN1YmNsYXNzZXMgdHJ1ZSBpZiBzdWJjbGFzc2VzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cworICAgICAqIEBwYXJhbSBmYWN0cyB0aGUgZXhwcmVzc2lvbiBmYWN0b3J5IHVzZWQgdG8gYnVpbGQgdGhlIHF1ZXJ5IGZvcgorICAgICAqIGVhY2ggYmFzZSB0eXBlCisgICAgICogQHBhcmFtIHBhcnNlZCB0aGUgcGFyc2VkIHF1ZXJ5IHZhbHVlcworICAgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVyIHZhbHVlcywgb3IgZW1wdHkgYXJyYXkKKyAgICAgKiBAcmV0dXJuIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgZGVsZXRlZCwKKyAgICAgKiBvciBudWxsIHRvIGV4ZWN1dGUgdGhlIGRlbGV0ZSBpbiBtZW1vcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGV4ZWN1dGVEZWxldGUoRXhlY3V0b3IgZXgsIENsYXNzTWV0YURhdGEgYmFzZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIHR5cGVzLCBib29sZWFuIHN1YmNsYXNzZXMsIEV4cHJlc3Npb25GYWN0b3J5W10gZmFjdHMsCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNbXSBwYXJzZWQsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIGFnYWluc3QgdGhlIGdpdmVuIGNhbmRpZGF0ZSBleHRlbnQKKyAgICAgKiBhbmQgdXBkYXRlcyB0aGUgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGV4IGN1cnJlbnQgZXhlY3V0b3IKKyAgICAgKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSB0eXBlIHRoZSBxdWVyeSBzaG91bGQgbWF0Y2gKKyAgICAgKiBAcGFyYW0gdHlwZXMgdGhlIGluZGVwZW5kZW50IGNhbmRpZGF0ZSB0eXBlcworICAgICAqIEBwYXJhbSBzdWJjbGFzc2VzIHRydWUgaWYgc3ViY2xhc3NlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMKKyAgICAgKiBAcGFyYW0gZmFjdHMgdGhlIGV4cHJlc3Npb24gZmFjdG9yeSB1c2VkIHRvIGJ1aWxkIHRoZSBxdWVyeSBmb3IKKyAgICAgKiBlYWNoIGJhc2UgdHlwZQorICAgICAqIEBwYXJhbSBwYXJzZWQgdGhlIHBhcnNlZCBxdWVyeSB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlciB2YWx1ZXMsIG9yIGVtcHR5IGFycmF5CisgICAgICogQHJldHVybiBhIG51bWJlciBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHVwZGF0ZWQsCisgICAgICogb3IgbnVsbCB0byBleGVjdXRlIHRoZSB1cGRhdGUgaW4gbWVtb3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBOdW1iZXIgZXhlY3V0ZVVwZGF0ZShFeGVjdXRvciBleCwgQ2xhc3NNZXRhRGF0YSBiYXNlLAorICAgICAgICBDbGFzc01ldGFEYXRhW10gdHlwZXMsIGJvb2xlYW4gc3ViY2xhc3NlcywgRXhwcmVzc2lvbkZhY3RvcnlbXSBmYWN0cywKKyAgICAgICAgUXVlcnlFeHByZXNzaW9uc1tdIHBhcnNlZCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29tbWFuZHMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGRhdGFzdG9yZSBpbiBvcmRlcgorICAgICAqIHRvIGV4ZWN1dGUgdGhlIHF1ZXJ5LCB0eXBpY2FsbHkgaW4gdGhlIGRhdGFiYXNlJ3MgbmF0aXZlIGxhbmd1YWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4IGN1cnJlbnQgZXhlY3V0b3IKKyAgICAgKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSB0eXBlIHRoZSBxdWVyeSBzaG91bGQgbWF0Y2gKKyAgICAgKiBAcGFyYW0gdHlwZXMgdGhlIGluZGVwZW5kZW50IGNhbmRpZGF0ZSB0eXBlcworICAgICAqIEBwYXJhbSBzdWJjbGFzc2VzIHRydWUgaWYgc3ViY2xhc3NlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMKKyAgICAgKiBAcGFyYW0gZmFjdHMgdGhlIGV4cHJlc3Npb24gZmFjdG9yeSB1c2VkIHRvIGJ1aWxkIHRoZSBxdWVyeSBmb3IKKyAgICAgKiBlYWNoIGJhc2UgdHlwZQorICAgICAqIEBwYXJhbSBwYXJzZWQgdGhlIHBhcnNlZCBxdWVyeSB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlciB2YWx1ZXMsIG9yIGVtcHR5IGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIHJlc3VsdCByYW5nZQorICAgICAqIEByZXR1cm4gYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeSB0byBleGVjdXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERhdGFTdG9yZUFjdGlvbnMoRXhlY3V0b3IgZXgsIENsYXNzTWV0YURhdGEgYmFzZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIHR5cGVzLCBib29sZWFuIHN1YmNsYXNzZXMsIEV4cHJlc3Npb25GYWN0b3J5W10gZmFjdHMsCisgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNbXSBwYXJzZWQsIE9iamVjdFtdIHBhcmFtcywgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIFN0b3JlUXVlcnkuRU1QVFlfU1RSSU5HUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFzc2lnbmFibGUgdHlwZXMgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSB3aG9zZSBleHByZXNzaW9uCisgICAgICogdHJlZXMgbXVzdCBiZSBjb21waWxlZCBpbmRlcGVuZGVudGx5LgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhW10gZ2V0SW5kZXBlbmRlbnRFeHByZXNzaW9uQ2FuZGlkYXRlcworICAgICAgICAoQ2xhc3NNZXRhRGF0YSB0eXBlLCBib29sZWFuIHN1YmNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGFzc01ldGFEYXRhW117IHR5cGUgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4ge0BsaW5rIEV4cHJlc3Npb25GYWN0b3J5fSB0byB1c2UgdG8gY3JlYXRlIGFuIGV4cHJlc3Npb24gdG8KKyAgICAgKiBiZSBleGVjdXRlZCBhZ2FpbnN0IGFuIGV4dGVudC4gRWFjaCBmYWN0b3J5IHdpbGwgYmUgdXNlZCB0byBjb21waWxlCisgICAgICogb25lIGZpbHRlciBvbmx5LiBUaGUgZmFjdG9yeSBtdXN0IGJlIGNhY2hhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uRmFjdG9yeSBnZXRFeHByZXNzaW9uRmFjdG9yeShDbGFzc01ldGFEYXRhIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgcXVlcmllcyB0aGF0IGhvbGQgcXVlcnkgaW5mb3JtYXRpb24KKyAgICAgKiBpbiBhIHtAbGluayBRdWVyeUV4cHJlc3Npb25zfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeHByZXNzaW9uRXhlY3V0b3IKKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEV4ZWN1dG9yCisgICAgICAgIGltcGxlbWVudHMgRXhlY3V0b3IgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHBhcnNlZCBxdWVyeSBleHByZXNzaW9ucyBmb3Igb3VyIGNhbmRpZGF0ZSB0eXBlcy4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBRdWVyeUV4cHJlc3Npb25zW10gZ2V0UXVlcnlFeHByZXNzaW9ucygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHF1ZXJ5IGV4cHJlc3Npb25zIGZvciBvbmUgY2FuZGlkYXRlIHR5cGUsIG9yIGRpZSBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBRdWVyeUV4cHJlc3Npb25zIGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpIHsKKyAgICAgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnNbXSBleHAgPSBnZXRRdWVyeUV4cHJlc3Npb25zKCk7CisgICAgICAgICAgICBpZiAoZXhwID09IG51bGwgfHwgZXhwLmxlbmd0aCA8IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibm8tZXhwcmVzc2lvbnMiKSk7CisKKyAgICAgICAgICAgIHJldHVybiBleHBbMF07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhyb3cgcHJvcGVyIGV4Y2VwdGlvbiBpZiBnaXZlbiB2YWx1ZSBpcyBhIGNvbGxlY3Rpb24vbWFwL2FycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Tm90Q29udGFpbmVyKFZhbHVlIHZhbCwgU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICAvLyB2YXJpYWJsZXMgcmVwcmVzZW50IGNvbnRhaW5lciBlbGVtZW50cywgbm90IHRoZSBjb250YWluZXIgaXRzZWxmCisgICAgICAgICAgICBpZiAodmFsLmlzVmFyaWFibGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIENsYXNzIHR5cGU7CisgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUGF0aCkgeworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gKChQYXRoKSB2YWwpLmxhc3QoKTsKKyAgICAgICAgICAgICAgICB0eXBlID0gKGZtZCA9PSBudWxsKSA/IHZhbC5nZXRUeXBlKCkgOiBmbWQuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0eXBlID0gdmFsLmdldFR5cGUoKTsKKworICAgICAgICAgICAgc3dpdGNoIChKYXZhVHlwZXMuZ2V0VHlwZUNvZGUodHlwZSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNvbnRhaW5lci1wcm9qZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHEuZ2V0Q29udGV4dCgpLmdldFF1ZXJ5U3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgUXVlcnlFeHByZXNzaW9ucyBleHBzID0gYXNzZXJ0UXVlcnlFeHByZXNzaW9uKCk7ICAgIAorICAgICAgICAgICAgVmFsaWRhdGVHcm91cGluZ0V4cHJlc3Npb25WaXNpdG9yLnZhbGlkYXRlKHEuZ2V0Q29udGV4dCgpLCBleHBzKTsgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnZXRSYW5nZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcywgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcyA9IGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpOworICAgICAgICAgICAgaWYgKGV4cHMucmFuZ2UubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoZXhwcy5yYW5nZS5sZW5ndGggPT0gMiAKKyAgICAgICAgICAgICAgICAmJiBleHBzLnJhbmdlWzBdIGluc3RhbmNlb2YgQ29uc3RhbnQKKyAgICAgICAgICAgICAgICAmJiBleHBzLnJhbmdlWzFdIGluc3RhbmNlb2YgQ29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydCA9ICgoTnVtYmVyKSAoKENvbnN0YW50KSBleHBzLnJhbmdlWzBdKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKHBhcmFtcykpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQgPSAoKE51bWJlcikgKChDb25zdGFudCkgZXhwcy5yYW5nZVsxXSkuCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZShwYXJhbXMpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGV4Y2VwdGlvbiBiZWxvdworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZXhjZXB0aW9uIGJlbG93CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm9ubHktcmFuZ2UtY29uc3RhbnRzIiwKKyAgICAgICAgICAgICAgICBxLmdldENvbnRleHQoKS5nZXRRdWVyeVN0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgQ2xhc3MgZ2V0UmVzdWx0Q2xhc3MoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gYXNzZXJ0UXVlcnlFeHByZXNzaW9uKCkucmVzdWx0Q2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbltdIGdldEFzY2VuZGluZyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBhc3NlcnRRdWVyeUV4cHJlc3Npb24oKS5hc2NlbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsaWFzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpLmFsaWFzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFByb2plY3Rpb25BbGlhc2VzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpLnByb2plY3Rpb25BbGlhc2VzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRPcGVyYXRpb24oU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gYXNzZXJ0UXVlcnlFeHByZXNzaW9uKCkub3BlcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBZ2dyZWdhdGUoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gYXNzZXJ0UXVlcnlFeHByZXNzaW9uKCkuaXNBZ2dyZWdhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0dyb3VwaW5nKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpLmdyb3VwaW5nLmxlbmd0aCA+IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgTGlua2VkTWFwIGdldFBhcmFtZXRlclR5cGVzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpLnBhcmFtZXRlclR5cGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIE1hcCBnZXRVcGRhdGVzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIGFzc2VydFF1ZXJ5RXhwcmVzc2lvbigpLnVwZGF0ZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgQ2xhc3NNZXRhRGF0YVtdIGdldEFjY2Vzc1BhdGhNZXRhRGF0YXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICBRdWVyeUV4cHJlc3Npb25zW10gZXhwcyA9IGdldFF1ZXJ5RXhwcmVzc2lvbnMoKTsKKyAgICAgICAgICAgIGlmIChleHBzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBleHBzWzBdLmFjY2Vzc1BhdGg7CisKKyAgICAgICAgICAgIExpc3QgbWV0YXMgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIG1ldGFzID0gRmlsdGVycy5hZGRBY2Nlc3NQYXRoTWV0YURhdGFzKG1ldGFzLAorICAgICAgICAgICAgICAgICAgICBleHBzW2ldLmFjY2Vzc1BhdGgpOworICAgICAgICAgICAgaWYgKG1ldGFzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0b3JlUXVlcnkuRU1QVFlfTUVUQVM7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzTWV0YURhdGFbXSkgbWV0YXMudG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgQ2xhc3NNZXRhRGF0YVttZXRhcy5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2luZyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHNlbGVjdCBvciBoYXZpbmcgY2xhdXNlcyBjb250YWluIAorICAgICAgICAgKiBub24tYWdncmVnYXRlLCBub24tZ3JvdXBlZCBwYXRocy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbGlkYXRlR3JvdXBpbmdFeHByZXNzaW9uVmlzaXRvciAKKyAgICAgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uVmlzaXRvciB7CisKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUXVlcnlDb250ZXh0IF9jdHg7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2dyb3VwaW5nID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIFNldCBfZ3JvdXBlZCA9IG51bGw7CisgICAgICAgICAgICBwcml2YXRlIFZhbHVlIF9hZ2cgPSBudWxsOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRocm93IHByb3BlciBleGNlcHRpb24gaWYgcXVlcnkgZG9lcyBub3QgbWVldCB2YWxpZGF0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGUoUXVlcnlDb250ZXh0IGN0eCwgCisgICAgICAgICAgICAgICAgUXVlcnlFeHByZXNzaW9ucyBleHBzKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4cHMuZ3JvdXBpbmcubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIFZhbGlkYXRlR3JvdXBpbmdFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yID0gCisgICAgICAgICAgICAgICAgICAgIG5ldyBWYWxpZGF0ZUdyb3VwaW5nRXhwcmVzc2lvblZpc2l0b3IoY3R4KTsKKyAgICAgICAgICAgICAgICB2aXNpdG9yLl9ncm91cGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLmdyb3VwaW5nLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBleHBzLmdyb3VwaW5nW2ldLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICAgICAgICAgIHZpc2l0b3IuX2dyb3VwaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGV4cHMuaGF2aW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGV4cHMuaGF2aW5nLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZXhwcy5wcm9qZWN0aW9uc1tpXS5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFZhbGlkYXRlR3JvdXBpbmdFeHByZXNzaW9uVmlzaXRvcihRdWVyeUNvbnRleHQgY3R4KSB7CisgICAgICAgICAgICAgICAgX2N0eCA9IGN0eDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoVmFsdWUgdmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9ncm91cGluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUGF0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9ncm91cGVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dyb3VwZWQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgX2dyb3VwZWQuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9hZ2cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmlzQWdncmVnYXRlKCkpIAorICAgICAgICAgICAgICAgICAgICAgICAgX2FnZyA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgUGF0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChfZ3JvdXBlZCA9PSBudWxsIHx8ICFfZ3JvdXBlZC5jb250YWlucyh2YWwpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1ncm91cGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N0eC5nZXRDYW5kaWRhdGVUeXBlKCksIF9jdHguZ2V0UXVlcnlTdHJpbmcoKSkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IF9hZ2cpCisgICAgICAgICAgICAgICAgICAgIF9hZ2cgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUgZXhwcmVzc2lvbiBxdWVyeSBpbiBtZW1vcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5NZW1vcnlFeGVjdXRvcgorICAgICAgICBleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkV4ZWN1dG9yCisgICAgICAgIGltcGxlbWVudHMgRXhlY3V0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3NNZXRhRGF0YSBfbWV0YTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9zdWJzOworICAgICAgICBwcml2YXRlIGZpbmFsIEluTWVtb3J5RXhwcmVzc2lvbkZhY3RvcnkgX2ZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUXVlcnlFeHByZXNzaW9uc1tdIF9leHBzOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gX3Byb2pUeXBlczsKKworICAgICAgICBwdWJsaWMgSW5NZW1vcnlFeGVjdXRvcihFeHByZXNzaW9uU3RvcmVRdWVyeSBxLAorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBjYW5kaWRhdGUsIGJvb2xlYW4gc3ViY2xhc3NlcywKKyAgICAgICAgICAgIEV4cHJlc3Npb25QYXJzZXIgcGFyc2VyLCBPYmplY3QgcGFyc2VkKSB7CisgICAgICAgICAgICBfbWV0YSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIF9zdWJzID0gc3ViY2xhc3NlczsKKyAgICAgICAgICAgIF9mYWN0b3J5ID0gbmV3IEluTWVtb3J5RXhwcmVzc2lvbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgX2V4cHMgPSBuZXcgUXVlcnlFeHByZXNzaW9uc1tdIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIuZXZhbChwYXJzZWQsIHEsIF9mYWN0b3J5LCBfbWV0YSkKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoX2V4cHNbMF0ucHJvamVjdGlvbnMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgX3Byb2pUeXBlcyA9IFN0b3JlUXVlcnkuRU1QVFlfQ0xBU1NFUzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEFzc2VydE5vVmFyaWFibGVzRXhwcmVzc2lvblZpc2l0b3Igbm92YXJzID0gbmV3CisgICAgICAgICAgICAgICAgICAgIEFzc2VydE5vVmFyaWFibGVzRXhwcmVzc2lvblZpc2l0b3IocS5nZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIF9wcm9qVHlwZXMgPSBuZXcgQ2xhc3NbX2V4cHNbMF0ucHJvamVjdGlvbnMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leHBzWzBdLnByb2plY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIF9wcm9qVHlwZXNbaV0gPSBfZXhwc1swXS5wcm9qZWN0aW9uc1tpXS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdENvbnRhaW5lcihfZXhwc1swXS5wcm9qZWN0aW9uc1tpXSwgcSk7CisgICAgICAgICAgICAgICAgICAgIF9leHBzWzBdLnByb2plY3Rpb25zW2ldLmFjY2VwdFZpc2l0KG5vdmFycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2V4cHNbMF0uZ3JvdXBpbmcubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIF9leHBzWzBdLmdyb3VwaW5nW2ldLmFjY2VwdFZpc2l0KG5vdmFycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUXVlcnlFeHByZXNzaW9uc1tdIGdldFF1ZXJ5RXhwcmVzc2lvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4cHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgZXhlY3V0ZVF1ZXJ5KFN0b3JlUXVlcnkgcSwKKyAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcywgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIC8vIGV4ZWN1dGUgaW4gbWVtb3J5IGZvciBjYW5kaWRhdGUgY29sbGVjdGlvbjsKKyAgICAgICAgICAgIC8vIGFsc28gZXhlY3V0ZSBpbiBtZW1vcnkgZm9yIHRyYW5zYWN0aW9uYWwgZXh0ZW50cworICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gcS5nZXRDb250ZXh0KCkuZ2V0Q2FuZGlkYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgSXRlcmF0b3IgaXRyOworICAgICAgICAgICAgaWYgKGNvbGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaXRyID0gcS5nZXRDb250ZXh0KCkuZ2V0U3RvcmVDb250ZXh0KCkuCisgICAgICAgICAgICAgICAgICAgIGV4dGVudEl0ZXJhdG9yKF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKSwgX3N1YnMsCisgICAgICAgICAgICAgICAgICAgICAgICBxLmdldENvbnRleHQoKS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHEuZ2V0Q29udGV4dCgpLmdldElnbm9yZUNoYW5nZXMoKSk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgbWF0Y2hpbmcgb2JqZWN0cworICAgICAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgU3RvcmVDb250ZXh0IGN0eCA9IHEuZ2V0Q29udGV4dCgpLmdldFN0b3JlQ29udGV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG9iaiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZmFjdG9yeS5tYXRjaGVzKF9leHBzWzBdLCBfbWV0YSwgX3N1YnMsIG9iaiwgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgSW1wbEhlbHBlci5jbG9zZShpdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBncm91cCByZXN1bHRzCisgICAgICAgICAgICByZXN1bHRzID0gX2ZhY3RvcnkuZ3JvdXAoX2V4cHNbMF0sIHJlc3VsdHMsIGN0eCwgcGFyYW1zKTsKKworICAgICAgICAgICAgLy8gYXBwbHkgaGF2aW5nIHRvIGZpbHRlciBncm91cHMKKyAgICAgICAgICAgIGlmIChfZXhwc1swXS5oYXZpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QocmVzdWx0cy5zaXplKCkpOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gYzsKKyAgICAgICAgICAgICAgICBpdHIgPSByZXN1bHRzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IChDb2xsZWN0aW9uKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoX2ZhY3RvcnkubWF0Y2hlcyhfZXhwc1swXSwgYywgY3R4LCBwYXJhbXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtYXRjaGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhcHBseSBwcm9qZWN0aW9ucywgb3JkZXIgcmVzdWx0cywgYW5kIGZpbHRlciBkdXBsaWNhdGVzCisgICAgICAgICAgICByZXN1bHRzID0gX2ZhY3RvcnkucHJvamVjdChfZXhwc1swXSwgcmVzdWx0cywgY3R4LCBwYXJhbXMpOworICAgICAgICAgICAgcmVzdWx0cyA9IF9mYWN0b3J5Lm9yZGVyKF9leHBzWzBdLCByZXN1bHRzLCBjdHgsIHBhcmFtcyk7CisgICAgICAgICAgICByZXN1bHRzID0gX2ZhY3RvcnkuZGlzdGluY3QoX2V4cHNbMF0sIGNvbGwgPT0gbnVsbCwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCA9IG5ldyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIocmVzdWx0cyk7CisgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgIT0gMCB8fCByYW5nZS5lbmQgIT0gTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgcm9wID0gbmV3IFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIocm9wLCByYW5nZS5zdGFydCxyYW5nZS5lbmQpOworICAgICAgICAgICAgcmV0dXJuIHJvcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIC8vIGluIG1lbW9yeSBxdWVyaWVzIGhhdmUgbm8gZGF0YXN0b3JlIGFjdGlvbnMgdG8gcGVyZm9ybQorICAgICAgICAgICAgcmV0dXJuIFN0b3JlUXVlcnkuRU1QVFlfU1RSSU5HUzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0T3JkZXJpbmdWYWx1ZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcywKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHRPYmplY3QsIGludCBvcmRlckluZGV4KSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcHJvamVjdGlvbiwgdGhlbiB3ZSBoYXZlIHRvIG9yZGVyIG9uIHNvbWV0aGluZworICAgICAgICAgICAgLy8gd2Ugc2VsZWN0ZWQKKyAgICAgICAgICAgIGlmIChfZXhwc1swXS5wcm9qZWN0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9yZGVyaW5nID0gX2V4cHNbMF0ub3JkZXJpbmdDbGF1c2VzW29yZGVySW5kZXhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2V4cHNbMF0ucHJvamVjdGlvbkNsYXVzZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcmluZy5lcXVhbHMoX2V4cHNbMF0ucHJvamVjdGlvbkNsYXVzZXNbaV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoT2JqZWN0W10pIHJlc3VsdE9iamVjdClbaV07CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgibWVyZ2VkLW9yZGVyLXdpdGgtcmVzdWx0IiwgcS5nZXRDb250ZXh0KCkuZ2V0TGFuZ3VhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHEuZ2V0Q29udGV4dCgpLmdldFF1ZXJ5U3RyaW5nKCksIG9yZGVyaW5nKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgcGFyc2VkIG9yZGVyaW5nIGV4cHJlc3Npb24gdG8gZXh0cmFjdCB0aGUgb3JkZXJpbmcgdmFsdWUKKyAgICAgICAgICAgIFZhbCB2YWwgPSAoVmFsKSBfZXhwc1swXS5vcmRlcmluZ1tvcmRlckluZGV4XTsKKyAgICAgICAgICAgIHJldHVybiB2YWwuZXZhbHVhdGUocmVzdWx0T2JqZWN0LCByZXN1bHRPYmplY3QsIHEuZ2V0Q29udGV4dCgpLgorICAgICAgICAgICAgICAgIGdldFN0b3JlQ29udGV4dCgpLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzW10gZ2V0UHJvamVjdGlvblR5cGVzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9wcm9qVHlwZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBhIHZhcmlhYmxlIGlzIGZvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXNzZXJ0Tm9WYXJpYWJsZXNFeHByZXNzaW9uVmlzaXRvciAKKyAgICAgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uVmlzaXRvciB7CisKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUXVlcnlDb250ZXh0IF9jdHg7CisKKyAgICAgICAgICAgIHB1YmxpYyBBc3NlcnROb1ZhcmlhYmxlc0V4cHJlc3Npb25WaXNpdG9yKFF1ZXJ5Q29udGV4dCBjdHgpIHsKKyAgICAgICAgICAgICAgICBfY3R4ID0gY3R4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcihWYWx1ZSB2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXZhbC5pc1ZhcmlhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoImlubWVtLWFnZy1wcm9qLXZhciIsIAorICAgICAgICAgICAgICAgICAgICBfY3R4LmdldENhbmRpZGF0ZVR5cGUoKSwgX2N0eC5nZXRRdWVyeVN0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgRGF0YVN0b3JlRXhlY3V0b3IgZXhlY3V0ZXMgdGhlIHF1ZXJ5IGFnYWluc3QgdGhlCisgICAgICogaW1wbGVtZW50YXRpb24ncyBvdmVycmlkZGVuIHtAbGluayAjZXhlY3V0ZVF1ZXJ5fSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGFTdG9yZUV4ZWN1dG9yCisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uRXhlY3V0b3IKKyAgICAgICAgaW1wbGVtZW50cyBFeGVjdXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01ldGFEYXRhIF9tZXRhOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzTWV0YURhdGFbXSBfbWV0YXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfc3ViczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uUGFyc2VyIF9wYXJzZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkZhY3RvcnlbXSBfZmFjdHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUXVlcnlFeHByZXNzaW9uc1tdIF9leHBzOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gX3Byb2pUeXBlczsKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZVtdIF9pbk1lbU9yZGVyaW5nOworCisgICAgICAgIHB1YmxpYyBEYXRhU3RvcmVFeGVjdXRvcihFeHByZXNzaW9uU3RvcmVRdWVyeSBxLAorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIHN1YmNsYXNzZXMsCisgICAgICAgICAgICBFeHByZXNzaW9uUGFyc2VyIHBhcnNlciwgT2JqZWN0IHBhcnNlZCkgeworICAgICAgICAgICAgX21ldGFzID0gcS5nZXRJbmRlcGVuZGVudEV4cHJlc3Npb25DYW5kaWRhdGVzKG1ldGEsIHN1YmNsYXNzZXMpOworICAgICAgICAgICAgaWYgKF9tZXRhcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgicXVlcnktdW5tYXBwZWQiLCBtZXRhKSk7CisgICAgICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgICAgICAgICBfc3VicyA9IHN1YmNsYXNzZXM7CisgICAgICAgICAgICBfcGFyc2VyID0gcGFyc2VyOworCisgICAgICAgICAgICBfZmFjdHMgPSBuZXcgRXhwcmVzc2lvbkZhY3RvcnlbX21ldGFzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9mYWN0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBfZmFjdHNbaV0gPSBxLmdldEV4cHJlc3Npb25GYWN0b3J5KF9tZXRhc1tpXSk7CisKKyAgICAgICAgICAgIF9leHBzID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbnNbX21ldGFzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leHBzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIF9leHBzW2ldID0gcGFyc2VyLmV2YWwocGFyc2VkLCBxLCBfZmFjdHNbaV0sIF9tZXRhc1tpXSk7CisKKyAgICAgICAgICAgIGlmIChfZXhwc1swXS5wcm9qZWN0aW9ucy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBfcHJvalR5cGVzID0gU3RvcmVRdWVyeS5FTVBUWV9DTEFTU0VTOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX3Byb2pUeXBlcyA9IG5ldyBDbGFzc1tfZXhwc1swXS5wcm9qZWN0aW9ucy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2V4cHNbMF0ucHJvamVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90Q29udGFpbmVyKF9leHBzWzBdLnByb2plY3Rpb25zW2ldLCBxKTsKKyAgICAgICAgICAgICAgICAgICAgX3Byb2pUeXBlc1tpXSA9IF9leHBzWzBdLnByb2plY3Rpb25zW2ldLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUXVlcnlFeHByZXNzaW9uc1tdIGdldFF1ZXJ5RXhwcmVzc2lvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4cHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgZXhlY3V0ZVF1ZXJ5KFN0b3JlUXVlcnkgcSwKKyAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcywgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIHJhbmdlLmxycyAmPSAhaXNBZ2dyZWdhdGUocSkgJiYgIWhhc0dyb3VwaW5nKHEpOworICAgICAgICAgICAgcmV0dXJuICgoRXhwcmVzc2lvblN0b3JlUXVlcnkpIHEpLmV4ZWN1dGVRdWVyeSh0aGlzLCBfbWV0YSwgX21ldGFzLAorICAgICAgICAgICAgICAgIF9zdWJzLCBfZmFjdHMsIF9leHBzLCBwYXJhbXMsIHJhbmdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOdW1iZXIgZXhlY3V0ZURlbGV0ZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAgICAgTnVtYmVyIG51bSA9ICgoRXhwcmVzc2lvblN0b3JlUXVlcnkpIHEpLmV4ZWN1dGVEZWxldGUodGhpcywgX21ldGEsCisgICAgICAgICAgICAgICAgX21ldGFzLCBfc3VicywgX2ZhY3RzLCBfZXhwcywgcGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcS5nZXRDb250ZXh0KCkuZGVsZXRlSW5NZW1vcnkocSwgdGhpcywgcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTnVtYmVyIGV4ZWN1dGVVcGRhdGUoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgICAgIE51bWJlciBudW0gPSAoKEV4cHJlc3Npb25TdG9yZVF1ZXJ5KSBxKS5leGVjdXRlVXBkYXRlKHRoaXMsIF9tZXRhLAorICAgICAgICAgICAgICAgIF9tZXRhcywgX3N1YnMsIF9mYWN0cywgX2V4cHMsIHBhcmFtcyk7CisgICAgICAgICAgICBpZiAobnVtID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHEuZ2V0Q29udGV4dCgpLnVwZGF0ZUluTWVtb3J5KHEsIHRoaXMsIHBhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldERhdGFTdG9yZUFjdGlvbnMoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMsCisgICAgICAgICAgICBSYW5nZSByYW5nZSkgeworICAgICAgICAgICAgcmV0dXJuICgoRXhwcmVzc2lvblN0b3JlUXVlcnkpIHEpLmdldERhdGFTdG9yZUFjdGlvbnModGhpcywgX21ldGEsCisgICAgICAgICAgICAgICAgX21ldGFzLCBfc3VicywgX2ZhY3RzLCBfZXhwcywgcGFyYW1zLCByYW5nZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE9yZGVyaW5nVmFsdWUoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMsCisgICAgICAgICAgICBPYmplY3QgcmVzdWx0T2JqZWN0LCBpbnQgb3JkZXJJbmRleCkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByb2plY3Rpb24sIHRoZW4gd2UgaGF2ZSB0byBvcmRlciBvbiBzb21ldGhpbmcKKyAgICAgICAgICAgIC8vIHdlIHNlbGVjdGVkCisgICAgICAgICAgICBpZiAoX2V4cHNbMF0ucHJvamVjdGlvbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvcmRlcmluZyA9IF9leHBzWzBdLm9yZGVyaW5nQ2xhdXNlc1tvcmRlckluZGV4XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leHBzWzBdLnByb2plY3Rpb25DbGF1c2VzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAob3JkZXJpbmcuZXF1YWxzKF9leHBzWzBdLnByb2plY3Rpb25DbGF1c2VzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKE9iamVjdFtdKSByZXN1bHRPYmplY3QpW2ldOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAoIm1lcmdlZC1vcmRlci13aXRoLXJlc3VsdCIsIHEuZ2V0Q29udGV4dCgpLmdldExhbmd1YWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBxLmdldENvbnRleHQoKS5nZXRRdWVyeVN0cmluZygpLCBvcmRlcmluZykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBuZWVkIHRvIHBhcnNlIG9yZGVyaW5ncz8KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChfaW5NZW1PcmRlcmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgSW5NZW1vcnlFeHByZXNzaW9uRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBfaW5NZW1PcmRlcmluZyA9IF9wYXJzZXIuZXZhbChfZXhwc1swXS5vcmRlcmluZ0NsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAoRXhwcmVzc2lvblN0b3JlUXVlcnkpIHEsIGZhY3RvcnksIF9tZXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgcGFyc2VkIG9yZGVyaW5nIGV4cHJlc3Npb24gdG8gZXh0cmFjdCB0aGUgb3JkZXJpbmcgdmFsdWUKKyAgICAgICAgICAgIFZhbCB2YWwgPSAoVmFsKSBfaW5NZW1PcmRlcmluZ1tvcmRlckluZGV4XTsKKyAgICAgICAgICAgIHJldHVybiB2YWwuZXZhbHVhdGUocmVzdWx0T2JqZWN0LCByZXN1bHRPYmplY3QsCisgICAgICAgICAgICAgICAgcS5nZXRDb250ZXh0KCkuZ2V0U3RvcmVDb250ZXh0KCksIHBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRQcm9qZWN0aW9uVHlwZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX3Byb2pUeXBlczsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0V4dGVudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRXh0ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhNmM4MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0V4dGVudC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhbGwgbWVtYmVycyBvZiBhIHBlcnNpc3RlbnQgY2xhc3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZW50IHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgKG11dGFibGUpIGZldGNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgZXh0ZW50LgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZXh0ZW50IHdpbGwgaWdub3JlIGNoYW5nZXMgbWFkZSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZXh0ZW50IHdpbGwgaWdub3JlIGNoYW5nZXMgbWFkZSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVDaGFuZ2VzKGJvb2xlYW4gaWdub3JlQ2hhbmdlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgb2JqZWN0cyByZXByZXNlbnRlZCBieSB0aGlzIGV4dGVudC4gVGhpcyBtZXRob2QKKyAgICAgKiBjcmVhdGVzIGEge0BsaW5rIExpc3R9IGJ5IHRyYXZlcnNpbmcgdGhlIGVudGlyZSBpdGVyYXRvciByZXR1cm5lZCBieSBhCisgICAgICogY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yfS4gVGhpcyBtZWFucyB0aGF0IHtAbGluayBDb2xsZWN0aW9uI3NpemV9IHdpbGwKKyAgICAgKiB3b3JrIGNvcnJlY3RseSwgYnV0IGlmIHRoZSBleHRlbnQgcmVwcmVzZW50cyBhIGxhcmdlIGRhdGEgc2V0LCB0aGlzCisgICAgICogbWV0aG9kIG1heSBiZSBxdWl0ZSBzbG93IGFuZCBtYXkgY29uc3VtZSBxdWl0ZSBhIGJpdCBvZiBtZW1vcnkuCisgICAgICovCisgICAgcHVibGljIExpc3QgbGlzdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGV4dGVudCBtZW1iZXJzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpOworCisgICAgLyoqCisgICAgICogVGhlIGJyb2tlciB0aGF0IGdlbmVyYXRlZCB0aGUgZXh0ZW50LgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXIgZ2V0QnJva2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3Mgb2YgZXh0ZW50IGVsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZXh0ZW50IGluY2x1ZGVzIHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViY2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYWxsIG9wZW4gaXRlcmF0b3JzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZXMgb24gYW4gaW50ZXJuYWwgbG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2NrKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBpbnRlcm5hbCBsb2NrLgorICAgICAqLworCXB1YmxpYyB2b2lkIHVubG9jayAoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0V4dGVudEltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0V4dGVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdiNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRXh0ZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5GaWx0ZXJJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkl0ZXJhdG9yQ2hhaW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXJJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VIYXNoU2V0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LlJlZW50cmFudExvY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuR2VuZXJhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYWxsIG1lbWJlcnMgb2YgYSBwZXJzaXN0ZW50IGNsYXNzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRXh0ZW50SW1wbAorICAgIGltcGxlbWVudHMgRXh0ZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzTWV0YURhdGFbXSBFTVBUWV9NRVRBUyA9IG5ldyBDbGFzc01ldGFEYXRhWzBdOworCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9rZXIgX2Jyb2tlcjsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzIF90eXBlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfc3ViczsKKyAgICBwcml2YXRlIGZpbmFsIEZldGNoQ29uZmlndXJhdGlvbiBfZmM7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIF9sb2NrOworICAgIHByaXZhdGUgYm9vbGVhbiBfaWdub3JlID0gZmFsc2U7CisKKyAgICAvLyBzZXQgb2Ygb3BlbiBpdGVyYXRvcnMKKyAgICBwcml2YXRlIFJlZmVyZW5jZUhhc2hTZXQgX29wZW5JdHJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGJyb2tlciB0aGUgb3duaW5nIGJyb2tlcgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBjYW5kaWRhdGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gc3VicyB3aGV0aGVyIHN1YmNsYXNzZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBleHRlbnQKKyAgICAgKi8KKyAgICBFeHRlbnRJbXBsKEJyb2tlciBicm9rZXIsIENsYXNzIHR5cGUsIGJvb2xlYW4gc3VicywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIF9icm9rZXIgPSBicm9rZXI7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICAgICAgX3N1YnMgPSBzdWJzOworICAgICAgICBpZiAoZmV0Y2ggIT0gbnVsbCkKKyAgICAgICAgICAgIF9mYyA9IGZldGNoOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZmMgPSAoRmV0Y2hDb25maWd1cmF0aW9uKSBicm9rZXIuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkuY2xvbmUoKTsKKyAgICAgICAgX2lnbm9yZSA9IGJyb2tlci5nZXRJZ25vcmVDaGFuZ2VzKCk7CisgICAgICAgIGlmIChicm9rZXIuZ2V0TXVsdGl0aHJlYWRlZCgpKQorICAgICAgICAgICAgX2xvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfbG9jayA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBnZXRGZXRjaENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfZmM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlQ2hhbmdlcygpIHsKKyAgICAgICAgcmV0dXJuIF9pZ25vcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hhbmdlcyhib29sZWFuIGlnbm9yZUNoYW5nZXMpIHsKKyAgICAgICAgX2Jyb2tlci5hc3NlcnRPcGVuKCk7CisgICAgICAgIF9pZ25vcmUgPSBpZ25vcmVDaGFuZ2VzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGxpc3QoKSB7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRlcmF0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ci5uZXh0KCkpOworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBJbXBsSGVscGVyLmNsb3NlKGl0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIF9icm9rZXIuYXNzZXJ0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKTsKKyAgICAgICAgQ2xvc2VhYmxlSXRlcmF0b3IgY2l0ciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYW4gaXRlcmF0b3IgY2hhaW47IGFkZCBwbmV3IG9iamVjdHMgaWYgdHJhbnNhY3Rpb25hbAorICAgICAgICAgICAgQ2xvc2VhYmxlSXRlcmF0b3JDaGFpbiBjaGFpbiA9IG5ldyBDbG9zZWFibGVJdGVyYXRvckNoYWluKCk7CisgICAgICAgICAgICBib29sZWFuIHRyYW5zID0gIV9pZ25vcmUgJiYgX2Jyb2tlci5pc0FjdGl2ZSgpOworICAgICAgICAgICAgaWYgKHRyYW5zKQorICAgICAgICAgICAgICAgIGNoYWluLmFkZEl0ZXJhdG9yKG5ldyBGaWx0ZXJOZXdJdGVyYXRvcigpKTsKKworICAgICAgICAgICAgLy8gYWRkIGRhdGFiYXNlIGl0ZXJhdG9ycyBmb3IgZWFjaCBpbXBsZW1lbnRpbmcgY2xhc3MKKyAgICAgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcyA9IF9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSByZXBvcy5nZXRNZXRhRGF0YShfdHlwZSwKKyAgICAgICAgICAgICAgICBfYnJva2VyLmdldENsYXNzTG9hZGVyKCksIGZhbHNlKTsKKworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCAmJiAoIV9zdWJzIHx8ICFtZXRhLmlzTWFuYWdlZEludGVyZmFjZSgpKQorICAgICAgICAgICAgICAgICYmIChtZXRhLmlzTWFwcGVkKCkgfHwgKF9zdWJzCisgICAgICAgICAgICAgICAgJiYgbWV0YS5nZXRNYXBwZWRQQ1N1YmNsYXNzTWV0YURhdGFzKCkubGVuZ3RoID4gMCkpKQorICAgICAgICAgICAgICAgIG1ldGFzID0gbmV3IENsYXNzTWV0YURhdGFbXXsgbWV0YSB9OworICAgICAgICAgICAgZWxzZSBpZiAoX3N1YnMgJiYgKG1ldGEgPT0gbnVsbCB8fCBtZXRhLmlzTWFuYWdlZEludGVyZmFjZSgpKSkKKyAgICAgICAgICAgICAgICBtZXRhcyA9IHJlcG9zLmdldEltcGxlbWVudG9yTWV0YURhdGFzKF90eXBlLAorICAgICAgICAgICAgICAgICAgICBfYnJva2VyLmdldENsYXNzTG9hZGVyKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRhcyA9IEVNUFRZX01FVEFTOworCisgICAgICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlciByb3A7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcm9wID0gX2Jyb2tlci5nZXRTdG9yZU1hbmFnZXIoKS5leGVjdXRlRXh0ZW50KG1ldGFzW2ldLAorICAgICAgICAgICAgICAgICAgICBfc3VicywgX2ZjKTsKKyAgICAgICAgICAgICAgICBpZiAocm9wICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNoYWluLmFkZEl0ZXJhdG9yKG5ldyBSZXN1bHRPYmplY3RQcm92aWRlckl0ZXJhdG9yKHJvcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaWx0ZXIgZGVsZXRlZCBvYmplY3RzIGlmIHRyYW5zYWN0aW9uYWwKKyAgICAgICAgICAgIGlmICh0cmFucykKKyAgICAgICAgICAgICAgICBjaXRyID0gbmV3IEZpbHRlckRlbGV0ZWRJdGVyYXRvcihjaGFpbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2l0ciA9IGNoYWluOworICAgICAgICAgICAgY2l0ci5zZXRSZW1vdmVPbkNsb3NlKHRoaXMpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9CisKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9vcGVuSXRycyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9vcGVuSXRycyA9IG5ldyBSZWZlcmVuY2VIYXNoU2V0KFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisgICAgICAgICAgICBfb3Blbkl0cnMuYWRkKGNpdHIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNpdHI7CisgICAgfQorCisgICAgcHVibGljIEJyb2tlciBnZXRCcm9rZXIoKSB7CisgICAgICAgIHJldHVybiBfYnJva2VyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF90eXBlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N1YmNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBfc3ViczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZUFsbCgpIHsKKyAgICAgICAgaWYgKF9vcGVuSXRycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsb3NlYWJsZUl0ZXJhdG9yIGNpdHI7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9vcGVuSXRycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGNpdHIgPSAoQ2xvc2VhYmxlSXRlcmF0b3IpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgY2l0ci5zZXRSZW1vdmVPbkNsb3NlKG51bGwpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNpdHIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9vcGVuSXRycy5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgICAgICBpZiAoX2xvY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIF9sb2NrLmxvY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIGlmIChfbG9jayAhPSBudWxsKQorICAgICAgICAgICAgX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VhYmxlIGl0ZXJhdG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBDbG9zZWFibGVJdGVyYXRvcgorICAgICAgICBleHRlbmRzIENsb3NlYWJsZSwgSXRlcmF0b3IgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGV4dGVudCB0byByZW1vdmUgc2VsZiBmcm9tIG9uIGNsb3NlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlT25DbG9zZShFeHRlbnRJbXBsIGV4dGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VhYmxlIHtAbGluayBJdGVyYXRvckNoYWlufS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbG9zZWFibGVJdGVyYXRvckNoYWluCisgICAgICAgIGV4dGVuZHMgSXRlcmF0b3JDaGFpbgorICAgICAgICBpbXBsZW1lbnRzIENsb3NlYWJsZUl0ZXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIEV4dGVudEltcGwgX2V4dGVudCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoX2Nsb3NlZCkgPyBmYWxzZSA6IHN1cGVyLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChfY2xvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVPbkNsb3NlKEV4dGVudEltcGwgZXh0ZW50KSB7CisgICAgICAgICAgICBfZXh0ZW50ID0gZXh0ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoX2V4dGVudCAhPSBudWxsICYmIF9leHRlbnQuX29wZW5JdHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfZXh0ZW50LmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBfZXh0ZW50Ll9vcGVuSXRycy5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgX2V4dGVudC51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9jbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBnZXRJdGVyYXRvcnMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAoKENsb3NlYWJsZSkgaXRyLm5leHQoKSkuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBGaWx0ZXJJdGVyYXRvcn0gdGhhdCBza2lwcyBkZWxldGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsdGVyRGVsZXRlZEl0ZXJhdG9yCisgICAgICAgIGV4dGVuZHMgRmlsdGVySXRlcmF0b3IKKyAgICAgICAgaW1wbGVtZW50cyBDbG9zZWFibGVJdGVyYXRvciwgUHJlZGljYXRlIHsKKworICAgICAgICBwcml2YXRlIEV4dGVudEltcGwgX2V4dGVudCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIEZpbHRlckRlbGV0ZWRJdGVyYXRvcihJdGVyYXRvciBpdHIpIHsKKyAgICAgICAgICAgIHN1cGVyKGl0cik7CisgICAgICAgICAgICBzZXRQcmVkaWNhdGUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIChfY2xvc2VkKSA/IGZhbHNlIDogc3VwZXIuaGFzTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKF9jbG9zZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZU9uQ2xvc2UoRXh0ZW50SW1wbCBleHRlbnQpIHsKKyAgICAgICAgICAgIF9leHRlbnQgPSBleHRlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfZXh0ZW50ICE9IG51bGwgJiYgX2V4dGVudC5fb3Blbkl0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9leHRlbnQubG9jaygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIF9leHRlbnQuX29wZW5JdHJzLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBfZXh0ZW50LnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICAoKENsb3NlYWJsZSkgZ2V0SXRlcmF0b3IoKSkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gIV9leHRlbnQuX2Jyb2tlci5pc0RlbGV0ZWQobyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBvdmVyIGFsbCBuZXcgb2JqZWN0cyBpbiB0aGlzIGV4dGVudC4gVGhpcyBpdGVyYXRvciBpcyBhbHdheXMKKyAgICAgKiB3cmFwcGVkLCBzbyBpdCBkb2Vzbid0IG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0J3MgY2xvc2VkLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgRmlsdGVyTmV3SXRlcmF0b3IKKyAgICAgICAgZXh0ZW5kcyBGaWx0ZXJJdGVyYXRvcgorICAgICAgICBpbXBsZW1lbnRzIENsb3NlYWJsZSwgUHJlZGljYXRlIHsKKworICAgICAgICBwdWJsaWMgRmlsdGVyTmV3SXRlcmF0b3IoKSB7CisgICAgICAgICAgICBzdXBlcihfYnJva2VyLmdldFRyYW5zYWN0aW9uYWxPYmplY3RzKCkuaXRlcmF0b3IoKSk7CisgICAgICAgICAgICBzZXRQcmVkaWNhdGUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIV9icm9rZXIuaXNOZXcobykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBDbGFzcyB0eXBlID0gby5nZXRDbGFzcygpOworICAgICAgICAgICAgaWYgKCFfc3VicyAmJiB0eXBlICE9IF90eXBlKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChfc3VicyAmJiAhX3R5cGUuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0ZldGNoQ29uZmlndXJhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmV0Y2hDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiNWRkYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0ZldGNoQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworCisvKioKKyAqIEFsbG93cyBjb25maWd1cmF0aW9uIGFuZCBvcHRpbWl6YXRpb24gb2YgaG93IG9iamVjdHMgYXJlIGxvYWRlZCBmcm9tCisgKiB0aGUgZGF0YSBzdG9yZS4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFBpbmFraSBQb2RkYXIKKyAqLworcHVibGljIGludGVyZmFjZSBGZXRjaENvbmZpZ3VyYXRpb24KKyAgICBleHRlbmRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBMb2NrTGV2ZWxzLCBRdWVyeUZsdXNoTW9kZXMgeworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdG8gcmV2ZXJ0IGFueSBzZXR0aW5nIGJhY2sgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVCA9IC05OTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIGZpZWxkIGRvZXMgbm90IHJlcXVpcmUgZmV0Y2hpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNyZXF1aXJlc0ZldGNoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVUQ0hfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBmaWVsZCByZXF1aXJlcyBhIGZldGNoIGFuZCBsb2FkIG9mIGZldGNoZWQKKyAgICAgKiBkYXRhLgorICAgICAqCisgICAgICogQHNlZSAjcmVxdWlyZXNGZXRjaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFVENIX0xPQUQgPSAxOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCdzIHZhbHVlIG11c3QgYmUKKyAgICAgKiBmZXRjaGVkLCBidXQgbG9hZGluZyBkYXRhIGlzIG5vdCBuZWNlc3NhcnkuICBVc2VkIHdoZW4gd2Uga25vdyB0aGUKKyAgICAgKiBkYXRhIHdpbGwgYmUgbG9hZGVkIGFueXdheSwgc3VjaCBhcyB3aGVuIHRyYXZlcnNpbmcgdGhlIGJhY2stcHRyIG9mCisgICAgICogYSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uIHdoZXJlIHRoZSBvdGhlciBzaWRlIGlzIGFsc28gYmVpbmcgZmV0Y2hlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI3JlcXVpcmVzRmV0Y2gKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRVRDSF9SRUYgPSAyOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQgYXNzaWNpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbjsKKyAgICAgKiBtYXkgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0IG9yIHRoaXMgb2JqZWN0IGhhcyBiZWVuIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIFN0b3JlQ29udGV4dCBnZXRDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgc3lzdGVtIHRvIGFzc29jaWF0ZSB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbgorICAgICAqIHdpdGggYSBjb250ZXh0IGJlZm9yZSB1c2UuIFRoZSBmZXRjaCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgc2hvdWxkCisgICAgICogYmUgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnRleHQncyBjb25maWd1cmF0aW9uIG9iamVjdC4gU3ViY2xhc3NlcworICAgICAqIGZvciBzcGVjaWZpYyBiYWNrIGVuZHMgY2Fubm90IHJlbHkgb24gdGhlIGNvbnRleHQncyBjb25maWd1cmF0aW9uCisgICAgICogaW1wbGVtZW50aW5nIHRoZWlyIGJhY2sgZW5kJ3MgY29uZmlndXJhdGlvbiBzdWItaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RvcmVDb250ZXh0IGN0eCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIHN0YXRlIGZyb20gdGhlIGdpdmVuIGZldGNoIGNvbmZpZ3VyYXRpb24gdG8gdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weShGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmZXRjaCBiYXRjaCBzaXplIGZvciBsYXJnZSByZXN1bHQgc2V0IHN1cHBvcnQuCisgICAgICogRGVmYXVsdHMgdG8gdGhlCTxjb2RlPm9wZW5qcGEuRmV0Y2hCYXRjaFNpemU8L2NvZGU+IHNldHRpbmcuIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkIHVuZGVyIHNvbWUgZGF0YSBzdG9yZXMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRGZXRjaEJhdGNoU2l6ZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmZXRjaCBiYXRjaCBzaXplIGZvciBsYXJnZSByZXN1bHQgc2V0IHN1cHBvcnQuCisgICAgICogRGVmYXVsdHMgdG8gdGhlCTxjb2RlPm9wZW5qcGEuRmV0Y2hCYXRjaFNpemU8L2NvZGU+IHNldHRpbmcuIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkIHVuZGVyIHNvbWUgZGF0YSBzdG9yZXMuCisgICAgICovCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRGZXRjaEJhdGNoU2l6ZShpbnQgZmV0Y2hCYXRjaFNpemUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIGRlcHRoIG9mIGZldGNoZWQgaW5zdGFuY2UgZ3JhcGguCisgICAgICogRGVmYXVsdHMgdG8gPGNvZGU+MTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEZldGNoRGVwdGgoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZmV0Y2hlZCBpbnN0YW5jZSBncmFwaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXggZGVub3RlcyBsaW1pdGluZyBsZW5ndGggb2YgdHJhdmVyc2FsIHBhdGggZnJvbSBhIHJvb3QKKyAgICAgKiBpbnN0YW5jZS4gPGNvZGU+LTE8L2NvZGU+IGltcGxpZXMgbm8gbGltaXQuIDxjb2RlPjA8L2NvZGU+IGlzIG5vdAorICAgICAqIHBlcm1pc3NpYmxlLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0TWF4RmV0Y2hEZXB0aChpbnQgbWF4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBxdWVyeSBjYWNoaW5nIGlzIGVuYWJsZWQuIElmIHRoaXMgcmV0dXJucworICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGJ1dCB0aGUgZGF0YWNhY2hlIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkLCBjYWNoaW5nCisgICAgICogd2lsbCBub3QgYmUgZW5hYmxlZC4gSWYgdGhpcworICAgICAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBxdWVyeSBjYWNoaW5nIHdpbGwgbm90IGJlIHVzZWQKKyAgICAgKiBldmVuIGlmIHRoZSBkYXRhY2FjaGUgcGx1Z2luIGlzIGluc3RhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRRdWVyeUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgb3Igbm90IHF1ZXJ5IGNhY2hpbmcgaXMgZW5hYmxlZC4gVGhpcyBoYXMgbm8gZWZmZWN0CisgICAgICogaWYgdGhlIGRhdGFjYWNoZSBwbHVnaW4gaXMgbm90IGluc3RhbGxlZCwgb3IgaWYgdGhlIHF1ZXJ5IGNhY2hlIHNpemUKKyAgICAgKiBpcyBzZXQgdG8gemVyby4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldFF1ZXJ5Q2FjaGUoYm9vbGVhbiBjYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVlcnkgYXV0b21hdGljIGZsdXNoIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRGbHVzaEJlZm9yZVF1ZXJpZXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBhdXRvbWF0aWMgZmx1c2ggY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldEZsdXNoQmVmb3JlUXVlcmllcyhpbnQgZmx1c2gpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbW11dGFibGUgc2V0IG9mIG5hbWVzIG9mIHRoZSBmZXRjaCBncm91cHMgdGhhdCB0aGlzIGNvbXBvbmVudAorICAgICAqIHdpbGwgdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLiBEZWZhdWx0cyB0byB0aGUKKyAgICAgKiA8Y29kZT5vcGVuanBhLkZldGNoR3JvdXBzPC9jb2RlPiBzZXR0aW5nLiAgVGhpcyBzZXQgaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHB1YmxpYyBTZXQgZ2V0RmV0Y2hHcm91cHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBmZXRjaCBncm91cCBoYXMgYmVlbiBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGZXRjaEdyb3VwKFN0cmluZyBncm91cCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIDxjb2RlPmdyb3VwPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZldGNoIGdyb3VwIG5hbWVzIHRvCisgICAgICogdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gYWRkRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApOworCisgICAgLyoqCisgICAgICogQWRkcyA8Y29kZT5ncm91cHM8L2NvZGU+IHRvIHRoZSBzZXQgb2YgZmV0Y2ggZ3JvdXAgbmFtZXMgdG8KKyAgICAgKiB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBhZGRGZXRjaEdyb3VwcyhDb2xsZWN0aW9uIGdyb3Vwcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGZldGNoIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gcmVtb3ZlRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyA8Y29kZT5ncm91cHM8L2NvZGU+IGZyb20gdGhlIHNldCBvZiBmZXRjaCBncm91cCBuYW1lcworICAgICAqIHRvIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUZldGNoR3JvdXBzKENvbGxlY3Rpb24gZ3JvdXBzKTsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgc2V0IG9mIGZldGNoIGdyb3VwIG5hbWVzIHRvIHVzZSB3aGVuIGxvYWRpbmcKKyAgICAgKiBkYXRhLiBBZnRlciB0aGlzIG9wZXJhdGlvbiBpcyBpbnZva2VkLCBvbmx5IHRob3NlIGZpZWxkcyBpbgorICAgICAqIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIChhbmQgYW55IHJlcXVlc3RlZCBmaWVsZCkgd2lsbCBiZQorICAgICAqIGxvYWRlZCB3aGVuIGxvYWRpbmcgYW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gY2xlYXJGZXRjaEdyb3VwcygpOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBzZXQgb2YgZmV0Y2ggZ3JvdXBzIHRvIHRoZSBsaXN0IGluIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHJlc2V0RmV0Y2hHcm91cHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMgdGhhdCB0aGlzIGNvbXBvbmVudAorICAgICAqIHdpbGwgdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLiBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc2V0LiAgVGhpcyBzZXQgaXMKKyAgICAgKiBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgcHVibGljIFNldCBnZXRGaWVsZHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgZmllbGQgaGFzIGJlZW4gYWRkZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoU3RyaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgPGNvZGU+ZmllbGQ8L2NvZGU+IHRvIHRoZSBzZXQgb2YgZnVsbHktcXVhbGlmaWVkIGZpZWxkIG5hbWVzIHRvCisgICAgICogdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gYWRkRmllbGQoU3RyaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgPGNvZGU+ZmllbGRzPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lcyB0bworICAgICAqIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGFkZEZpZWxkcyhDb2xsZWN0aW9uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUZpZWxkKFN0cmluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIDxjb2RlPmZpZWxkczwvY29kZT4gZnJvbSB0aGUgc2V0IG9mIGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lcworICAgICAqIHRvIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUZpZWxkcyhDb2xsZWN0aW9uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIHNldCBvZiBmaWVsZCBuYW1lcyB0byB1c2Ugd2hlbiBsb2FkaW5nCisgICAgICogZGF0YS4gQWZ0ZXIgdGhpcyBvcGVyYXRpb24gaXMgaW52b2tlZCwgb25seSB0aG9zZSBmaWVsZHMgaW4KKyAgICAgKiB0aGUgY29uZmlndXJlZCBmZXRjaCBncm91cHMgd2lsbCBiZSBsb2FkZWQgd2hlbiBsb2FkaW5nIGFuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGNsZWFyRmllbGRzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhbiBvYmplY3QgbG9jaywgb3IgLTEgZm9yIG5vCisgICAgICogbGltaXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2tUaW1lb3V0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhbiBvYmplY3QgbG9jaywgb3IgLTEgZm9yIG5vCisgICAgICogbGltaXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldExvY2tUaW1lb3V0KGludCB0aW1lb3V0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2NrIGxldmVsIHRvIHVzZSBmb3IgbG9ja2luZyBsb2FkZWQgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVhZExvY2tMZXZlbCgpOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2sgbGV2ZWwgdG8gdXNlIGZvciBsb2NraW5nIGxvYWRlZCBvYmplY3RzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRSZWFkTG9ja0xldmVsKGludCBsZXZlbCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jayBsZXZlbCB0byB1c2UgZm9yIGxvY2tpbmcgZGlydGllZCBvYmplY3RzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXcml0ZUxvY2tMZXZlbCgpOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2sgbGV2ZWwgdG8gdXNlIGZvciBsb2NraW5nIGRpcnRpZWQgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0V3JpdGVMb2NrTGV2ZWwoaW50IGxldmVsKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyByZXN1bHQgbGlzdCBmb3IgdGhlIGN1cnJlbnQgZmV0Y2ggY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0TGlzdCBuZXdSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGFyYml0cmFyeSBxdWVyeSBoaW50IHRoYXQgbWF5IGJlIHV0aWxpemVkIGR1cmluZworICAgICAqIGV4ZWN1dGlvbi4gVGhlIGhpbnQgbWF5IGJlIGRhdGFzdG9yZS1zcGVjaWZpYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBoaW50CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgaGludAorICAgICAqIEBzaW5jZSAwLjQuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhpbnQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoaW50IGZvciB0aGUgc3BlY2lmaWMga2V5LCBvciBudWxsIGlmIHRoZSBoaW50CisgICAgICogaXMgbm90IHNwZWNpZmllZC4KKyAgICAgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBoaW50IG5hbWUKKwkgKiBAc2luY2UgMC40LjAKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEhpbnQgKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJvb3QgY2xhc3NlcyBmb3IgcmVjdXJzaXZlIG9wZXJhdGlvbnMuIFRoaXMgc2V0IGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0IGdldFJvb3RDbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSb290IGNsYXNzZXMgZm9yIHJlY3Vyc2l2ZSBvcGVyYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0Um9vdENsYXNzZXMoQ29sbGVjdGlvbiBjbGFzc2VzKTsKKworICAgIC8qKgorICAgICAqIFJvb3QgaW5zdGFuY2VzIGZvciByZWN1cnNpdmUgb3BlcmF0aW9ucy4gVGhpcyBzZXQgaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHB1YmxpYyBTZXQgZ2V0Um9vdEluc3RhbmNlcygpOworCisgICAgLyoqCisgICAgICogUm9vdCBpbnN0YW5jZXMgZm9yIHJlY3Vyc2l2ZSBvcGVyYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0Um9vdEluc3RhbmNlcyhDb2xsZWN0aW9uIHJvb3RzKTsKKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplIG9uIGludGVybmFsIGxvY2sgaWYgbXVsdGl0aHJlYWRlZCBpcyB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvY2soKTsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgaW50ZXJuYWwgbG9jayBpZiBtdWx0aXRocmVhZGVkIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvKioKKyAgICAgKiBBZmZpcm1zIGlmIHRoZSBnaXZlbiBmaWVsZCByZXF1aXJlcyB0byBiZSBmZXRjaGVkIGluIHRoZSBjb250ZXh0CisgICAgICogb2YgY3VycmVudCBmZXRjaCBvcGVyYXRpb24uICBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI0ZFVENIX05PTkV9LAorICAgICAqIHtAbGluayAjRkVUQ0hfTE9BRH0sIHtAbGluayBGRVRDSF9SRUZ9LgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4xCisgICAgICovCisgICAgcHVibGljIGludCByZXF1aXJlc0ZldGNoKEZpZWxkTWV0YURhdGEgZm0pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGZhbHNlIGlmIHdlIGtub3cgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGZldGNoZWQgd2l0aCB0aGlzCisgICAgICogY29uZmlndXJhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGEgbG9hZCwgYmVjYXVzZSB0aGlzIGNvbmZpZ3VyYXRpb24gY2FtZQorICAgICAqIGZyb20gYSB0cmF2ZXJzYWwgb2YgYSB7QGxpbmsgI0ZFVENIX1JFRn0gZmllbGQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNMb2FkKCk7CisgICAgCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgdGhlIGdpdmVuIGZpZWxkIHRvIGdlbmVyYXRlIChwb3NzaWJseSkgYSBuZXcgY29uZmlndXJhdGlvbiAKKyAgICAgKiBzdGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGNvbmZpZ3VyYXRpb24gc3RhdGUgcmVzdWx0aW5nIG91dCBvZiB0cmF2ZXJzYWwKKyAgICAgKiBAc2luY2UgMC40LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHRyYXZlcnNlKEZpZWxkTWV0YURhdGEgZm0pOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmV0Y2hDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmV0Y2hDb25maWd1cmF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODA3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9GZXRjaENvbmZpZ3VyYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSw3MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLkVhZ2VyUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5MaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5TaW1wbGVSZXN1bHRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLldpbmRvd1Jlc3VsdExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZldGNoR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Ob1RyYW5zYWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogQWxsb3dzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGltaXphdGlvbiBvZiBob3cgb2JqZWN0cyBhcmUgbG9hZGVkIGZyb20KKyAqIHRoZSBkYXRhIHN0b3JlLgorICoKKyAqIEBzaW5jZSAwLjMuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBhdXRob3IgUGluYWtpIFBvZGRhcgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRmV0Y2hDb25maWd1cmF0aW9uSW1wbAorICAgIGltcGxlbWVudHMgRmV0Y2hDb25maWd1cmF0aW9uLCBDbG9uZWFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRmV0Y2hDb25maWd1cmF0aW9uSW1wbC5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmFibGUgc3RhdGUgc2hhcmVkIHRocm91Z2hvdXQgYSB0cmF2ZXJzYWwgY2hhaW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uU3RhdGUKKyAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyB0cmFuc2llbnQgU3RvcmVDb250ZXh0IGN0eCA9IG51bGw7CisgICAgICAgIHB1YmxpYyBpbnQgZmV0Y2hCYXRjaFNpemUgPSAwOworICAgICAgICBwdWJsaWMgaW50IG1heEZldGNoRGVwdGggPSAxOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBxdWVyeUNhY2hlID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGludCBmbHVzaFF1ZXJ5ID0gMDsKKyAgICAgICAgcHVibGljIGludCBsb2NrVGltZW91dCA9IC0xOworICAgICAgICBwdWJsaWMgaW50IHJlYWRMb2NrTGV2ZWwgPSBMT0NLX05PTkU7CisgICAgICAgIHB1YmxpYyBpbnQgd3JpdGVMb2NrTGV2ZWwgPSBMT0NLX05PTkU7CisgICAgICAgIHB1YmxpYyBTZXQgZmV0Y2hHcm91cHMgPSBudWxsOworICAgICAgICBwdWJsaWMgU2V0IGZpZWxkcyA9IG51bGw7CisgICAgICAgIHB1YmxpYyBTZXQgcm9vdENsYXNzZXM7CisgICAgICAgIHB1YmxpYyBTZXQgcm9vdEluc3RhbmNlczsKKyAgICAgICAgcHVibGljIE1hcCBoaW50cyA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uU3RhdGUgX3N0YXRlOworICAgIHByaXZhdGUgRmV0Y2hDb25maWd1cmF0aW9uSW1wbCBfcGFyZW50OworICAgIHByaXZhdGUgU3RyaW5nIF9mcm9tRmllbGQ7CisgICAgcHJpdmF0ZSBDbGFzcyBfZnJvbVR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2RpcmVjdFJlbGF0aW9uT3duZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIF9sb2FkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGludCBfYXZhaWxhYmxlUmVjdXJzaW9uOworICAgIHByaXZhdGUgaW50IF9hdmFpbGFibGVEZXB0aDsKKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb25JbXBsKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGZXRjaENvbmZpZ3VyYXRpb25JbXBsKENvbmZpZ3VyYXRpb25TdGF0ZSBzdGF0ZSkgeworICAgICAgICBfc3RhdGUgPSAoc3RhdGUgPT0gbnVsbCkgPyBuZXcgQ29uZmlndXJhdGlvblN0YXRlKCkgOiBzdGF0ZTsKKyAgICAgICAgX2F2YWlsYWJsZURlcHRoID0gX3N0YXRlLm1heEZldGNoRGVwdGg7CisgICAgfSAKKworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5jdHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIC8vIGNhbid0IHJlc2V0IG5vbi1udWxsIGNvbnRleHQgdG8gYW5vdGhlciBjb250ZXh0CisgICAgICAgIGlmIChjdHggIT0gbnVsbCAmJiBfc3RhdGUuY3R4ICE9IG51bGwgJiYgY3R4ICE9IF9zdGF0ZS5jdHgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgX3N0YXRlLmN0eCA9IGN0eDsKKyAgICAgICAgaWYgKGN0eCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGluaXRpYWxpemUgdG8gY29uZiBpbmZvCisgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBjdHguZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBzZXRGZXRjaEJhdGNoU2l6ZShjb25mLmdldEZldGNoQmF0Y2hTaXplKCkpOworICAgICAgICBzZXRGbHVzaEJlZm9yZVF1ZXJpZXMoY29uZi5nZXRGbHVzaEJlZm9yZVF1ZXJpZXNDb25zdGFudCgpKTsKKyAgICAgICAgY2xlYXJGZXRjaEdyb3VwcygpOworICAgICAgICBhZGRGZXRjaEdyb3VwcyhBcnJheXMuYXNMaXN0KGNvbmYuZ2V0RmV0Y2hHcm91cHNMaXN0KCkpKTsKKyAgICAgICAgc2V0TWF4RmV0Y2hEZXB0aChjb25mLmdldE1heEZldGNoRGVwdGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvbmUgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb25JbXBsIGNsb25lID0gbmV3SW5zdGFuY2UobnVsbCk7CisgICAgICAgIGNsb25lLl9zdGF0ZS5jdHggPSBfc3RhdGUuY3R4OworICAgICAgICBjbG9uZS5fcGFyZW50ID0gX3BhcmVudDsKKyAgICAgICAgY2xvbmUuX2Zyb21GaWVsZCA9IF9mcm9tRmllbGQ7CisgICAgICAgIGNsb25lLl9mcm9tVHlwZSA9IF9mcm9tVHlwZTsKKyAgICAgICAgY2xvbmUuX2RpcmVjdFJlbGF0aW9uT3duZXIgPSBfZGlyZWN0UmVsYXRpb25Pd25lcjsKKyAgICAgICAgY2xvbmUuX2xvYWQgPSBfbG9hZDsKKyAgICAgICAgY2xvbmUuX2F2YWlsYWJsZVJlY3Vyc2lvbiA9IF9hdmFpbGFibGVSZWN1cnNpb247CisgICAgICAgIGNsb25lLl9hdmFpbGFibGVEZXB0aCA9IF9hdmFpbGFibGVEZXB0aDsKKyAgICAgICAgY2xvbmUuY29weSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBob2xsb3cgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZldGNoQ29uZmlndXJhdGlvbkltcGwgbmV3SW5zdGFuY2UoQ29uZmlndXJhdGlvblN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgRmV0Y2hDb25maWd1cmF0aW9uSW1wbChzdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weShGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgc2V0RmV0Y2hCYXRjaFNpemUoZmV0Y2guZ2V0RmV0Y2hCYXRjaFNpemUoKSk7CisgICAgICAgIHNldE1heEZldGNoRGVwdGgoZmV0Y2guZ2V0TWF4RmV0Y2hEZXB0aCgpKTsKKyAgICAgICAgc2V0UXVlcnlDYWNoZShmZXRjaC5nZXRRdWVyeUNhY2hlKCkpOworICAgICAgICBzZXRGbHVzaEJlZm9yZVF1ZXJpZXMoZmV0Y2guZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzKCkpOworICAgICAgICBzZXRMb2NrVGltZW91dChmZXRjaC5nZXRMb2NrVGltZW91dCgpKTsKKyAgICAgICAgY2xlYXJGZXRjaEdyb3VwcygpOworICAgICAgICBhZGRGZXRjaEdyb3VwcyhmZXRjaC5nZXRGZXRjaEdyb3VwcygpKTsKKyAgICAgICAgY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgYWRkRmllbGRzKGZldGNoLmdldEZpZWxkcygpKTsKKworICAgICAgICAvLyBkb24ndCB1c2Ugc2V0dGVycyBiZWNhdXNlIHJlcXVpcmUgYWN0aXZlIHRyYW5zYWN0aW9uCisgICAgICAgIF9zdGF0ZS5yZWFkTG9ja0xldmVsID0gZmV0Y2guZ2V0UmVhZExvY2tMZXZlbCgpOworICAgICAgICBfc3RhdGUud3JpdGVMb2NrTGV2ZWwgPSBmZXRjaC5nZXRXcml0ZUxvY2tMZXZlbCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hCYXRjaFNpemUoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUuZmV0Y2hCYXRjaFNpemU7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRGZXRjaEJhdGNoU2l6ZShpbnQgZmV0Y2hCYXRjaFNpemUpIHsKKyAgICAgICAgaWYgKGZldGNoQmF0Y2hTaXplID09IERFRkFVTFQgJiYgX3N0YXRlLmN0eCAhPSBudWxsKQorICAgICAgICAgICAgZmV0Y2hCYXRjaFNpemUgPSBfc3RhdGUuY3R4LmdldENvbmZpZ3VyYXRpb24oKS5nZXRGZXRjaEJhdGNoU2l6ZSgpOworICAgICAgICBpZiAoZmV0Y2hCYXRjaFNpemUgIT0gREVGQVVMVCkKKyAgICAgICAgICAgIF9zdGF0ZS5mZXRjaEJhdGNoU2l6ZSA9IGZldGNoQmF0Y2hTaXplOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heEZldGNoRGVwdGgoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUubWF4RmV0Y2hEZXB0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldE1heEZldGNoRGVwdGgoaW50IGRlcHRoKSB7CisgICAgICAgIGlmIChkZXB0aCA9PSBERUZBVUxUICYmIF9zdGF0ZS5jdHggIT0gbnVsbCkKKyAgICAgICAgICAgIGRlcHRoID0gX3N0YXRlLmN0eC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TWF4RmV0Y2hEZXB0aCgpOworICAgICAgICBpZiAoZGVwdGggIT0gREVGQVVMVCkKKyAgICAgICAgeworICAgICAgICAgICAgX3N0YXRlLm1heEZldGNoRGVwdGggPSBkZXB0aDsKKyAgICAgICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgX2F2YWlsYWJsZURlcHRoID0gZGVwdGg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UXVlcnlDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5xdWVyeUNhY2hlOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0UXVlcnlDYWNoZShib29sZWFuIGNhY2hlKSB7CisgICAgICAgIF9zdGF0ZS5xdWVyeUNhY2hlID0gY2FjaGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzKCkgeworICAgICAgICByZXR1cm4gX3N0YXRlLmZsdXNoUXVlcnk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRGbHVzaEJlZm9yZVF1ZXJpZXMoaW50IGZsdXNoKSB7CisgICAgICAgIGlmIChmbHVzaCA9PSBERUZBVUxUICYmIF9zdGF0ZS5jdHggIT0gbnVsbCkKKyAgICAgICAgICAgIF9zdGF0ZS5mbHVzaFF1ZXJ5ID0gX3N0YXRlLmN0eC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICAgICAgZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzQ29uc3RhbnQoKTsKKyAgICAgICAgZWxzZSBpZiAoZmx1c2ggIT0gREVGQVVMVCkKKyAgICAgICAgICAgIF9zdGF0ZS5mbHVzaFF1ZXJ5ID0gZmx1c2g7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0RmV0Y2hHcm91cHMoKSB7CisgICAgICAgIHJldHVybiAoX3N0YXRlLmZldGNoR3JvdXBzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIAorICAgICAgICAgICAgOiBfc3RhdGUuZmV0Y2hHcm91cHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5mZXRjaEdyb3VwcyAhPSBudWxsCisgICAgICAgICAgICAmJiAoX3N0YXRlLmZldGNoR3JvdXBzLmNvbnRhaW5zKGdyb3VwKQorICAgICAgICAgICAgfHwgX3N0YXRlLmZldGNoR3JvdXBzLmNvbnRhaW5zKEZldGNoR3JvdXAuTkFNRV9BTEwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGFkZEZldGNoR3JvdXAoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC1mZyIpKTsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlLmZldGNoR3JvdXBzID09IG51bGwpCisgICAgICAgICAgICAgICAgX3N0YXRlLmZldGNoR3JvdXBzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIF9zdGF0ZS5mZXRjaEdyb3Vwcy5hZGQobmFtZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGFkZEZldGNoR3JvdXBzKENvbGxlY3Rpb24gZ3JvdXBzKSB7CisgICAgICAgIGlmIChncm91cHMgPT0gbnVsbCB8fCBncm91cHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZ3JvdXBzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgYWRkRmV0Y2hHcm91cCgoU3RyaW5nKSBpdHIubmV4dCgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiByZW1vdmVGZXRjaEdyb3VwKFN0cmluZyBncm91cCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlLmZldGNoR3JvdXBzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3N0YXRlLmZldGNoR3JvdXBzLnJlbW92ZShncm91cCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHJlbW92ZUZldGNoR3JvdXBzKENvbGxlY3Rpb24gZ3JvdXBzKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUuZmV0Y2hHcm91cHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUuZmV0Y2hHcm91cHMucmVtb3ZlQWxsKGdyb3Vwcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGNsZWFyRmV0Y2hHcm91cHMoKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUuZmV0Y2hHcm91cHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUuZmV0Y2hHcm91cHMuY2xlYXIoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gcmVzZXRGZXRjaEdyb3VwcygpIHsKKyAgICAgICAgY2xlYXJGZXRjaEdyb3VwcygpOworICAgICAgICBpZiAoX3N0YXRlLmN0eCAhPSBudWxsKQorICAgICAgICAgICAgYWRkRmV0Y2hHcm91cHMoQXJyYXlzLmFzTGlzdChfc3RhdGUuY3R4LmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgICAgICBnZXRGZXRjaEdyb3Vwc0xpc3QoKSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGdldEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIChfc3RhdGUuZmllbGRzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogX3N0YXRlLmZpZWxkczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5maWVsZHMgIT0gbnVsbCAmJiBfc3RhdGUuZmllbGRzLmNvbnRhaW5zKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGFkZEZpZWxkKFN0cmluZyBmaWVsZCkgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShmaWVsZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC1maWVsZCIpKTsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlLmZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5maWVsZHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgX3N0YXRlLmZpZWxkcy5hZGQoZmllbGQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBhZGRGaWVsZHMoQ29sbGVjdGlvbiBmaWVsZHMpIHsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsIHx8IGZpZWxkcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlLmZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5maWVsZHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgX3N0YXRlLmZpZWxkcy5hZGRBbGwoZmllbGRzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gcmVtb3ZlRmllbGQoU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUuZmllbGRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3N0YXRlLmZpZWxkcy5yZW1vdmUoZmllbGQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiByZW1vdmVGaWVsZHMoQ29sbGVjdGlvbiBmaWVsZHMpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZS5maWVsZHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUuZmllbGRzLnJlbW92ZUFsbChmaWVsZHMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBjbGVhckZpZWxkcygpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZS5maWVsZHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUuZmllbGRzLmNsZWFyKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExvY2tUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gX3N0YXRlLmxvY2tUaW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0TG9ja1RpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gREVGQVVMVCAmJiBfc3RhdGUuY3R4ICE9IG51bGwpCisgICAgICAgICAgICBfc3RhdGUubG9ja1RpbWVvdXQgPSBfc3RhdGUuY3R4LmdldENvbmZpZ3VyYXRpb24oKS5nZXRMb2NrVGltZW91dCgpOworICAgICAgICBlbHNlIGlmICh0aW1lb3V0ICE9IERFRkFVTFQpCisgICAgICAgICAgICBfc3RhdGUubG9ja1RpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlYWRMb2NrTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUucmVhZExvY2tMZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIHNldFJlYWRMb2NrTGV2ZWwoaW50IGxldmVsKSB7CisgICAgICAgIGlmIChfc3RhdGUuY3R4ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgaWYgKGxldmVsID09IERFRkFVTFQpCisgICAgICAgICAgICAgICAgX3N0YXRlLnJlYWRMb2NrTGV2ZWwgPSBfc3RhdGUuY3R4LmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVhZExvY2tMZXZlbENvbnN0YW50KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX3N0YXRlLnJlYWRMb2NrTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V3JpdGVMb2NrTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUud3JpdGVMb2NrTGV2ZWw7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRXcml0ZUxvY2tMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgaWYgKF9zdGF0ZS5jdHggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEFjdGl2ZVRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gREVGQVVMVCkKKyAgICAgICAgICAgICAgICBfc3RhdGUud3JpdGVMb2NrTGV2ZWwgPSBfc3RhdGUuY3R4LmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0V3JpdGVMb2NrTGV2ZWxDb25zdGFudCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9zdGF0ZS53cml0ZUxvY2tMZXZlbCA9IGxldmVsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdExpc3QgbmV3UmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciByb3ApIHsKKyAgICAgICAgaWYgKHJvcCBpbnN0YW5jZW9mIExpc3RSZXN1bHRPYmplY3RQcm92aWRlcikKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVzdWx0TGlzdChyb3ApOworICAgICAgICBpZiAoX3N0YXRlLmZldGNoQmF0Y2hTaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgRWFnZXJSZXN1bHRMaXN0KHJvcCk7CisgICAgICAgIGlmIChyb3Auc3VwcG9ydHNSYW5kb21BY2Nlc3MoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVzdWx0TGlzdChyb3ApOworICAgICAgICByZXR1cm4gbmV3IFdpbmRvd1Jlc3VsdExpc3Qocm9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgbm8gdHJhbnNhY3Rpb24gaXMgYWN0aXZlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgaWYgKF9zdGF0ZS5jdHggIT0gbnVsbCAmJiAhX3N0YXRlLmN0eC5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vVHJhbnNhY3Rpb25FeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1hY3RpdmUiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGludChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUuaGludHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUuaGludHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgX3N0YXRlLmhpbnRzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SGludChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKF9zdGF0ZS5oaW50cyA9PSBudWxsKSA/IG51bGwgOiBfc3RhdGUuaGludHMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0Um9vdENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiAoX3N0YXRlLnJvb3RDbGFzc2VzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIAorICAgICAgICAgICAgOiBfc3RhdGUucm9vdENsYXNzZXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBzZXRSb290Q2xhc3NlcyhDb2xsZWN0aW9uIGNsYXNzZXMpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZS5yb290Q2xhc3NlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zdGF0ZS5yb290Q2xhc3Nlcy5jbGVhcigpOworICAgICAgICAgICAgaWYgKGNsYXNzZXMgIT0gbnVsbCAmJiAhY2xhc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0YXRlLnJvb3RDbGFzc2VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5yb290Q2xhc3NlcyA9IG5ldyBIYXNoU2V0KGNsYXNzZXMpOworICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5yb290Q2xhc3Nlcy5hZGRBbGwoY2xhc3Nlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGdldFJvb3RJbnN0YW5jZXMoKSB7CisgICAgICAgIHJldHVybiAoX3N0YXRlLnJvb3RJbnN0YW5jZXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgCisgICAgICAgICAgICA6IF9zdGF0ZS5yb290SW5zdGFuY2VzOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gc2V0Um9vdEluc3RhbmNlcyhDb2xsZWN0aW9uIGluc3RhbmNlcykgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlLnJvb3RJbnN0YW5jZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3RhdGUucm9vdEluc3RhbmNlcy5jbGVhcigpOworICAgICAgICAgICAgaWYgKGluc3RhbmNlcyAhPSBudWxsICYmICFpbnN0YW5jZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKF9zdGF0ZS5yb290SW5zdGFuY2VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9zdGF0ZS5yb290SW5zdGFuY2VzID0gbmV3IEhhc2hTZXQoaW5zdGFuY2VzKTsKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICBfc3RhdGUucm9vdEluc3RhbmNlcy5hZGRBbGwoaW5zdGFuY2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvY2soKSB7CisgICAgICAgIGlmIChfc3RhdGUuY3R4ICE9IG51bGwpCisgICAgICAgICAgICBfc3RhdGUuY3R4LmxvY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIGlmIChfc3RhdGUuY3R4ICE9IG51bGwpCisgICAgICAgICAgICBfc3RhdGUuY3R4LnVubG9jaygpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmF2ZXJzYWwKKyAgICAvLy8vLy8vLy8vLy8vCisgICAgCisgICAgcHVibGljIGludCByZXF1aXJlc0ZldGNoKEZpZWxkTWV0YURhdGEgZm0pIHsKKyAgICAgICAgaWYgKCFpbmNsdWRlcyhmbSkpCisgICAgICAgICAgICByZXR1cm4gRkVUQ0hfTk9ORTsKKyAgICAgICAgCisgICAgICAgIENsYXNzIHR5cGUgPSBnZXRSZWxhdGlvblR5cGUoZm0pOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEZFVENIX0xPQUQ7CisgICAgICAgIGlmIChfYXZhaWxhYmxlRGVwdGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGRVRDSF9OT05FOworCisgICAgICAgIC8vIHdlIGNhbiBza2lwIGNhbGN1bGF0aW5nIHJlY3Vyc2lvbiBkZXB0aCBpZiB0aGlzIGlzIGEgdG9wLWxldmVsIGNvbmY6CisgICAgICAgIC8vIHRoZSBmaWVsZCBpcyBpbiBvdXIgZmV0Y2ggZ3JvdXBzLCBzbyBjYW4ndCBwb3NzaWJseSBub3Qgc2VsZWN0CisgICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpIAorICAgICAgICAgICAgcmV0dXJuIEZFVENIX0xPQUQ7CisKKyAgICAgICAgaW50IHJkZXB0aCA9IGdldEF2YWlsYWJsZVJlY3Vyc2lvbkRlcHRoKGZtLCB0eXBlLCBmYWxzZSk7CisgICAgICAgIGlmIChyZGVwdGggIT0gRmV0Y2hHcm91cC5ERVBUSF9JTkZJTklURSAmJiByZGVwdGggPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBGRVRDSF9OT05FOworCisgICAgICAgIGlmIChTdHJpbmdVdGlscy5lcXVhbHMoX2RpcmVjdFJlbGF0aW9uT3duZXIsIGZtLmdldEZ1bGxOYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIEZFVENIX1JFRjsKKyAgICAgICAgcmV0dXJuIEZFVENIX0xPQUQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNMb2FkKCkgeworICAgICAgICByZXR1cm4gX2xvYWQ7CisgICAgfQorCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiB0cmF2ZXJzZShGaWVsZE1ldGFEYXRhIGZtKSB7CisgICAgICAgIENsYXNzIHR5cGUgPSBnZXRSZWxhdGlvblR5cGUoZm0pOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uSW1wbCBjbG9uZSA9IG5ld0luc3RhbmNlKF9zdGF0ZSk7CisgICAgICAgIGNsb25lLl9wYXJlbnQgPSB0aGlzOworICAgICAgICBjbG9uZS5fYXZhaWxhYmxlRGVwdGggPSByZWR1Y2UoX2F2YWlsYWJsZURlcHRoKTsKKyAgICAgICAgY2xvbmUuX2Zyb21GaWVsZCA9IGZtLmdldEZ1bGxOYW1lKGZhbHNlKTsKKyAgICAgICAgY2xvbmUuX2Zyb21UeXBlID0gdHlwZTsKKyAgICAgICAgY2xvbmUuX2F2YWlsYWJsZVJlY3Vyc2lvbiA9IGdldEF2YWlsYWJsZVJlY3Vyc2lvbkRlcHRoKGZtLCB0eXBlLCB0cnVlKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhfZGlyZWN0UmVsYXRpb25Pd25lciwgZm0uZ2V0RnVsbE5hbWUoKSkpCisgICAgICAgICAgICBjbG9uZS5fbG9hZCA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbG9uZS5fbG9hZCA9IF9sb2FkOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgb3duZXIgPSBmbS5nZXRNYXBwZWRCeU1ldGFEYXRhKCk7CisgICAgICAgIGlmIChvd25lciAhPSBudWxsICYmIG93bmVyLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgY2xvbmUuX2RpcmVjdFJlbGF0aW9uT3duZXIgPSBvd25lci5nZXRGdWxsTmFtZSgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3VyIGNvbmZpZ3VyYXRpb24gc3RhdGUgaW5jbHVkZXMgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlcyhGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBpZiAoKGZtZC5pc0luRGVmYXVsdEZldGNoR3JvdXAoKSAKKyAgICAgICAgICAgICYmIGhhc0ZldGNoR3JvdXAoRmV0Y2hHcm91cC5OQU1FX0RFRkFVTFQpKQorICAgICAgICAgICAgfHwgaGFzRmV0Y2hHcm91cChGZXRjaEdyb3VwLk5BTUVfQUxMKQorICAgICAgICAgICAgfHwgaGFzRmllbGQoZm1kLmdldEZ1bGxOYW1lKGZhbHNlKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgU3RyaW5nW10gZmdzID0gZm1kLmdldEN1c3RvbUZldGNoR3JvdXBzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGhhc0ZldGNoR3JvdXAoZmdzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF2YWlsYWJsZSByZWN1cnNpb24gZGVwdGggdmlhIHRoZSBnaXZlbiBmaWVsZCBmb3IgdGhlCisgICAgICogZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmF2ZXJzZSB3aGV0aGVyIHdlJ3JlIHRyYXZlcnNpbmcgdGhlIGZpZWxkCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0QXZhaWxhYmxlUmVjdXJzaW9uRGVwdGgoRmllbGRNZXRhRGF0YSBmbSwgQ2xhc3MgdHlwZSwgCisgICAgICAgIGJvb2xlYW4gdHJhdmVyc2UpIHsKKyAgICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYSBwcmV2aW91cyBsaW1pdAorICAgICAgICBpbnQgYXZhaWwgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICAgICAgZm9yIChGZXRjaENvbmZpZ3VyYXRpb25JbXBsIGYgPSB0aGlzOyBmICE9IG51bGw7IGYgPSBmLl9wYXJlbnQpIHsKKyAgICAgICAgICAgIGlmIChJbXBsSGVscGVyLmlzQXNzaWduYWJsZShmLl9mcm9tVHlwZSwgdHlwZSkpIHsKKyAgICAgICAgICAgICAgICBhdmFpbCA9IGYuX2F2YWlsYWJsZVJlY3Vyc2lvbjsKKyAgICAgICAgICAgICAgICBpZiAodHJhdmVyc2UpCisgICAgICAgICAgICAgICAgICAgIGF2YWlsID0gcmVkdWNlKGF2YWlsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXZhaWwgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAKKyAgICAgICAgLy8gY2FsY3VsYXRlIGZldGNoIGdyb3VwcyBtYXgKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gZm0uZ2V0RGVmaW5pbmdNZXRhRGF0YSgpOworICAgICAgICBpbnQgbWF4ID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgICAgIGlmIChmbS5pc0luRGVmYXVsdEZldGNoR3JvdXAoKSkKKyAgICAgICAgICAgIG1heCA9IG1ldGEuZ2V0RmV0Y2hHcm91cChGZXRjaEdyb3VwLk5BTUVfREVGQVVMVCkuCisgICAgICAgICAgICAgICAgZ2V0UmVjdXJzaW9uRGVwdGgoZm0pOworICAgICAgICBTdHJpbmdbXSBncm91cHMgPSBmbS5nZXRDdXN0b21GZXRjaEdyb3VwcygpOworICAgICAgICBpbnQgY3VyOworICAgICAgICBmb3IgKGludCBpID0gMDsgbWF4ICE9IEZldGNoR3JvdXAuREVQVEhfSU5GSU5JVEUgCisgICAgICAgICAgICAmJiBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjdXIgPSBtZXRhLmdldEZldGNoR3JvdXAoZ3JvdXBzW2ldKS5nZXRSZWN1cnNpb25EZXB0aChmbSk7CisgICAgICAgICAgICBpZiAoY3VyID09IEZldGNoR3JvdXAuREVQVEhfSU5GSU5JVEUgfHwgY3VyID4gbWF4KSAKKyAgICAgICAgICAgICAgICBtYXggPSBjdXI7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVkdWNlIG1heCBpZiB3ZSdyZSB0cmF2ZXJzaW5nIGEgc2VsZi10eXBlIHJlbGF0aW9uCisgICAgICAgIGlmICh0cmF2ZXJzZSAmJiBtYXggIT0gSW50ZWdlci5NSU5fVkFMVUUKKyAgICAgICAgICAgICYmIEltcGxIZWxwZXIuaXNBc3NpZ25hYmxlKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCB0eXBlKSkKKyAgICAgICAgICAgIG1heCA9IHJlZHVjZShtYXgpOworCisgICAgICAgIC8vIHRha2UgbWluL2RlZmluZWQgb2YgcHJldmlvdXMgYXZhaWwgYW5kIGZldGNoIGdyb3VwIG1heAorICAgICAgICBpZiAoYXZhaWwgPT0gSW50ZWdlci5NSU5fVkFMVUUgJiYgbWF4ID09IEludGVnZXIuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgICBpbnQgZGVmID0gRmV0Y2hHcm91cC5SRUNVUlNJT05fREVQVEhfREVGQVVMVDsKKyAgICAgICAgICAgIHJldHVybiAodHJhdmVyc2UgJiYgSW1wbEhlbHBlci5pc0Fzc2lnbmFibGUoCisgICAgICAgICAgICAgICAgICAgIG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCB0eXBlKSkgPyBkZWYgLSAxIDogZGVmOworICAgICAgICB9CisgICAgICAgIGlmIChhdmFpbCA9PSBJbnRlZ2VyLk1JTl9WQUxVRSB8fCBhdmFpbCA9PSBGZXRjaEdyb3VwLkRFUFRIX0lORklOSVRFKQorICAgICAgICAgICAgcmV0dXJuIG1heDsKKyAgICAgICAgaWYgKG1heCA9PSBJbnRlZ2VyLk1JTl9WQUxVRSB8fCBtYXggPT0gRmV0Y2hHcm91cC5ERVBUSF9JTkZJTklURSkKKyAgICAgICAgICAgIHJldHVybiBhdmFpbDsKKyAgICAgICAgcmV0dXJuIE1hdGgubWluKG1heCwgYXZhaWwpOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbGF0aW9uIHR5cGUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGdldFJlbGF0aW9uVHlwZShGaWVsZE1ldGFEYXRhIGZtKSB7CisgICAgICAgIGlmIChmbS5pc0RlY2xhcmVkVHlwZVBDKCkpCisgICAgICAgICAgICByZXR1cm4gZm0uZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgIGlmIChmbS5nZXRFbGVtZW50KCkuaXNEZWNsYXJlZFR5cGVQQygpKQorICAgICAgICAgICAgcmV0dXJuIGZtLmdldEVsZW1lbnQoKS5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgaWYgKGZtLmdldEtleSgpLmlzRGVjbGFyZWRUeXBlUEMoKSkKKyAgICAgICAgICAgIHJldHVybiBmbS5nZXRLZXkoKS5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVkdWNlIHRoZSBnaXZlbiBsb2dpY2FsIGRlcHRoIGJ5IDEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlZHVjZShpbnQgZCkgeworICAgICAgICBpZiAoZCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChkICE9IEZldGNoR3JvdXAuREVQVEhfSU5GSU5JVEUpCisgICAgICAgICAgICBkLS07CisgICAgICAgIHJldHVybiBkOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRGVidWcgbWV0aG9kcworICAgIC8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBGZXRjaENvbmZpZ3VyYXRpb24gZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gX3BhcmVudDsKKyAgICB9CisgICAgCisgICAgYm9vbGVhbiBpc1Jvb3QoKSB7CisgICAgICAgIHJldHVybiBfcGFyZW50ID09IG51bGw7CisgICAgfQorICAgIAorICAgIEZldGNoQ29uZmlndXJhdGlvbiBnZXRSb290KCkgeworICAgICAgICByZXR1cm4gKGlzUm9vdCgpKSA/IHRoaXMgOiBfcGFyZW50LmdldFJvb3QoKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0QXZhaWxhYmxlRmV0Y2hEZXB0aCgpIHsKKyAgICAgICAgcmV0dXJuIF9hdmFpbGFibGVEZXB0aDsKKyAgICB9CisKKyAgICBpbnQgZ2V0QXZhaWxhYmxlUmVjdXJzaW9uRGVwdGgoKSB7CisgICAgICAgIHJldHVybiBfYXZhaWxhYmxlUmVjdXJzaW9uOworICAgIH0KKworICAgIFN0cmluZyBnZXRUcmF2ZXJzZWRGcm9tRmllbGQoKSB7CisgICAgICAgIHJldHVybiBfZnJvbUZpZWxkOworICAgIH0KKworICAgIENsYXNzIGdldFRyYXZlcnNlZEZyb21UeXBlKCkgeworICAgICAgICByZXR1cm4gX2Zyb21UeXBlOworICAgIH0KKworICAgIExpc3QgZ2V0UGF0aCgpIHsKKyAgICAgICAgaWYgKGlzUm9vdCgpKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIHJldHVybiB0cmFja1BhdGgobmV3IEFycmF5TGlzdCgpKTsKKyAgICB9CisgICAgCisgICAgTGlzdCB0cmFja1BhdGgoTGlzdCBwYXRoKSB7CisgICAgICAgIGlmIChfcGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICBfcGFyZW50LnRyYWNrUGF0aChwYXRoKTsKKyAgICAgICAgcGF0aC5hZGQodGhpcyk7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKyAgICAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkZldGNoQ29uZmlndXJhdGlvbkAiICsgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykgCisgICAgICAgICAgICArICIgKCIgKyBfYXZhaWxhYmxlRGVwdGggKyAiKSIgKyBnZXRQYXRoU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGdldFBhdGhTdHJpbmcoKQorICAgIHsKKyAgICAgICAgTGlzdCBwYXRoID0gZ2V0UGF0aCgpOworICAgICAgICBpZiAocGF0aC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kICgiOiAiKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwYXRoLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCgoRmV0Y2hDb25maWd1cmF0aW9uSW1wbCkgaXRyLm5leHQoKSkuCisgICAgICAgICAgICAgICAgZ2V0VHJhdmVyc2VkRnJvbUZpZWxkKCkpOworICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLT4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmlsdGVycy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmlsdGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzU5M2UKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9GaWx0ZXJzLmphdmEKQEAgLTAsMCArMSw4OTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUmVmbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuQWdncmVnYXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkZpbHRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggcXVlcnkgZmlsdGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRmlsdGVycyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFpFUk9fQklHREVDSU1BTCA9IG5ldyBCaWdEZWNpbWFsKDBEKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFpFUk9fQklHSU5URUdFUiA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1BfU1VCVFJBQ1QgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUF9NVUxUSVBMWSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QX0RJVklERSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QX01PRCA9IDQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKEZpbHRlcnMuY2xhc3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb3JyZWN0IHdyYXBwZXIgdHlwZSBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3Mgd3JhcChDbGFzcyBjKSB7CisgICAgICAgIGlmICghYy5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIGlmIChjID09IGludC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNsYXNzOworICAgICAgICBpZiAoYyA9PSBmbG9hdC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC5jbGFzczsKKyAgICAgICAgaWYgKGMgPT0gZG91YmxlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5jbGFzczsKKyAgICAgICAgaWYgKGMgPT0gbG9uZy5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBMb25nLmNsYXNzOworICAgICAgICBpZiAoYyA9PSBib29sZWFuLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY2xhc3M7CisgICAgICAgIGlmIChjID09IHNob3J0LmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIFNob3J0LmNsYXNzOworICAgICAgICBpZiAoYyA9PSBieXRlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIEJ5dGUuY2xhc3M7CisgICAgICAgIGlmIChjID09IGNoYXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLmNsYXNzOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvcnJlY3QgcHJpbWl0aXZlIHR5cGUgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYQorICAgICAqIHdyYXBwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzcyB1bndyYXAoQ2xhc3MgYykgeworICAgICAgICBpZiAoYy5pc1ByaW1pdGl2ZSgpIHx8IGMgPT0gU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIGlmIChjID09IEludGVnZXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgICAgICBpZiAoYyA9PSBGbG9hdC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBmbG9hdC5jbGFzczsKKyAgICAgICAgaWYgKGMgPT0gRG91YmxlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5jbGFzczsKKyAgICAgICAgaWYgKGMgPT0gTG9uZy5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBsb25nLmNsYXNzOworICAgICAgICBpZiAoYyA9PSBCb29sZWFuLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGJvb2xlYW4uY2xhc3M7CisgICAgICAgIGlmIChjID09IFNob3J0LmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIHNob3J0LmNsYXNzOworICAgICAgICBpZiAoYyA9PSBCeXRlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGJ5dGUuY2xhc3M7CisgICAgICAgIGlmIChjID09IENoYXJhY3Rlci5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBjaGFyLmNsYXNzOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiB0d28gdHlwZXMsIHJldHVybiB0eXBlIHRoZXkgc2hvdWxkIGJvdGggYmUgY29udmVydGVkCisgICAgICogdG8gYmVmb3JlIHBlcmZvcm1pbmcgYW55IG9wZXJhdGlvbnMgYmV0d2VlbiB0aGVtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgcHJvbW90ZShDbGFzcyBjMSwgQ2xhc3MgYzIpIHsKKyAgICAgICAgaWYgKGMxID09IGMyKQorICAgICAgICAgICAgcmV0dXJuIHVud3JhcChjMSk7CisgICAgICAgIENsYXNzIHcxID0gd3JhcChjMSk7CisgICAgICAgIENsYXNzIHcyID0gd3JhcChjMik7CisgICAgICAgIGlmICh3MSA9PSB3MikKKyAgICAgICAgICAgIHJldHVybiB1bndyYXAoYzEpOworCisgICAgICAgIC8vIG5vdCBudW1iZXJzPworICAgICAgICBib29sZWFuIHcxTnVtYmVyID0gTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odzEpOworICAgICAgICBib29sZWFuIHcyTnVtYmVyID0gTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odzIpOworICAgICAgICBpZiAoIXcxTnVtYmVyIHx8ICF3Mk51bWJlcikgeworICAgICAgICAgICAgLy8gdGhlIG9ubHkgbm9uLW51bWVyaWMgcHJvbW90aW9uIHdlIGRvIGlzIHN0cmluZyB0byBjaGFyLAorICAgICAgICAgICAgLy8gb3IgZnJvbSBjaGFyL3N0cmluZyB0byBudW1iZXIKKyAgICAgICAgICAgIGlmICghdzFOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAodzJOdW1iZXIgJiYgKHcxID09IENoYXJhY3Rlci5jbGFzcyB8fCB3MSA9PSBTdHJpbmcuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHcyID09IEJ5dGUuY2xhc3MgfHwgdzIgPT0gU2hvcnQuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICA/IEludGVnZXIuY2xhc3MgOiB1bndyYXAoYzIpOworICAgICAgICAgICAgICAgIGlmICghdzJOdW1iZXIgJiYgdzEgPT0gQ2hhcmFjdGVyLmNsYXNzICYmIHcyID09IFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKKyAgICAgICAgICAgICAgICBpZiAodzJOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXAoYzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF3Mk51bWJlcikgeworICAgICAgICAgICAgICAgIGlmICh3MU51bWJlciAmJiAodzIgPT0gQ2hhcmFjdGVyLmNsYXNzIHx8IHcyID09IFN0cmluZy5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodzEgPT0gQnl0ZS5jbGFzcyB8fCB3MSA9PSBTaG9ydC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgID8gSW50ZWdlci5jbGFzcyA6IHVud3JhcChjMSk7CisgICAgICAgICAgICAgICAgaWYgKCF3MU51bWJlciAmJiB3MiA9PSBDaGFyYWN0ZXIuY2xhc3MgJiYgdzEgPT0gU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzOworICAgICAgICAgICAgICAgIGlmICh3MU51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcChjMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG5laXRoZXIgYXJlIG51bWJlcnMsIHVzZSBsZWFzdC1kZXJpdmVkIG9mIHRoZSB0d28uICBpZiBuZWl0aGVyCisgICAgICAgICAgICAvLyBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIG90aGVyIGJ1dCBvbmUgaXMgYSBzdGFuZGFyZCB0eXBlLCBhc3N1bWUKKyAgICAgICAgICAgIC8vIHRoZSBvdGhlciBjYW4gYmUgY29udmVydGVkIHRvIHRoYXQgc3RhbmRhcmQgdHlwZQorICAgICAgICAgICAgaWYgKCF3MU51bWJlciAmJiAhdzJOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAodzEgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwKGMyKTsKKyAgICAgICAgICAgICAgICBpZiAodzIgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwKGMxKTsKKyAgICAgICAgICAgICAgICBpZiAodzEuaXNBc3NpZ25hYmxlRnJvbSh3MikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXAoYzEpOworICAgICAgICAgICAgICAgIGlmICh3Mi5pc0Fzc2lnbmFibGVGcm9tKHcxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcChjMik7CisgICAgICAgICAgICAgICAgaWYgKGlzTm9uc3RhbmRhcmRUeXBlKHcxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpc05vbnN0YW5kYXJkVHlwZSh3MikpID8gT2JqZWN0LmNsYXNzIDogdW53cmFwKGMyKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNOb25zdGFuZGFyZFR5cGUodzIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGlzTm9uc3RhbmRhcmRUeXBlKHcxKSkgPyBPYmplY3QuY2xhc3MgOiB1bndyYXAoYzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3MSA9PSBCaWdEZWNpbWFsLmNsYXNzIHx8IHcyID09IEJpZ0RlY2ltYWwuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gQmlnRGVjaW1hbC5jbGFzczsKKyAgICAgICAgaWYgKHcxID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmICh3MiA9PSBGbG9hdC5jbGFzcyB8fCB3MiA9PSBEb3VibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0RlY2ltYWwuY2xhc3M7CisgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5jbGFzczsKKyAgICAgICAgfQorICAgICAgICBpZiAodzIgPT0gQmlnSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgaWYgKHcxID09IEZsb2F0LmNsYXNzIHx8IHcxID09IERvdWJsZS5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gQmlnRGVjaW1hbC5jbGFzczsKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLmNsYXNzOworICAgICAgICB9CisgICAgICAgIGlmICh3MSA9PSBEb3VibGUuY2xhc3MgfHwgdzIgPT0gRG91YmxlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5jbGFzczsKKyAgICAgICAgaWYgKHcxID09IEZsb2F0LmNsYXNzIHx8IHcyID09IEZsb2F0LmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0LmNsYXNzOworICAgICAgICBpZiAodzEgPT0gTG9uZy5jbGFzcyB8fCB3MiA9PSBMb25nLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGxvbmcuY2xhc3M7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgbm90IGEgc3RhbmRhcmQgcGVyc2lzdGVudCB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb25zdGFuZGFyZFR5cGUoQ2xhc3MgYykgeworICAgICAgICBzd2l0Y2ggKEphdmFUeXBlcy5nZXRUeXBlQ29kZShjKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOgorICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIGFuIGluc3RhbmNlIG9mIHRoZSBmaXJzdCBjbGFzcyBjYW4gYmUgY29udmVydGVkIHRvCisgICAgICogYW4gaW5zdGFuY2Ugb2YgdGhlIHNlY29uZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ29udmVydChDbGFzcyBjMSwgQ2xhc3MgYzIsIGJvb2xlYW4gc3RyaWN0KSB7CisgICAgICAgIGMxID0gd3JhcChjMSk7CisgICAgICAgIGMyID0gd3JhcChjMik7CisgICAgICAgIGlmIChjMi5pc0Fzc2lnbmFibGVGcm9tKGMxKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGJvb2xlYW4gYzFOdW1iZXIgPSBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjMSk7CisgICAgICAgIGJvb2xlYW4gYzJOdW1iZXIgPSBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjMik7CisgICAgICAgIGlmIChjMU51bWJlciAmJiBjMk51bWJlcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoKGMxTnVtYmVyICYmIChjMiA9PSBDaGFyYWN0ZXIuY2xhc3MKKyAgICAgICAgICAgIHx8ICghc3RyaWN0ICYmIGMyID09IFN0cmluZy5jbGFzcykpKQorICAgICAgICAgICAgfHwgKGMyTnVtYmVyICYmIChjMSA9PSBDaGFyYWN0ZXIuY2xhc3MKKyAgICAgICAgICAgIHx8ICghc3RyaWN0ICYmIGMxID09IFN0cmluZy5jbGFzcykpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoYzEgPT0gU3RyaW5nLmNsYXNzICYmIGMyID09IENoYXJhY3Rlci5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoYzIgPT0gU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuICFzdHJpY3Q7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCBvLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIGlmIChvID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG8uZ2V0Q2xhc3MoKSA9PSB0eXBlKQorICAgICAgICAgICAgcmV0dXJuIG87CisKKyAgICAgICAgdHlwZSA9IHdyYXAodHlwZSk7CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oby5nZXRDbGFzcygpKSkKKyAgICAgICAgICAgIHJldHVybiBvOworCisgICAgICAgIC8vIHRoZSBvbmx5IG5vbi1udW1lcmljIGNvbnZlcnNpb25zIHdlIGRvIGFyZSB0byBzdHJpbmcsIG9yIGZyb20KKyAgICAgICAgLy8gc3RyaW5nL2NoYXIgdG8gbnVtYmVyLCBvciBjYWxlbmRhci9kYXRlCisgICAgICAgIGJvb2xlYW4gbnVtID0gbyBpbnN0YW5jZW9mIE51bWJlcjsKKyAgICAgICAgaWYgKCFudW0pIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gby50b1N0cmluZygpOworICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gby50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoc3RyLmNoYXJBdCgwKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKENhbGVuZGFyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgJiYKKyAgICAgICAgICAgICAgICBvIGluc3RhbmNlb2YgRGF0ZSkgeworICAgICAgICAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgY2FsLnNldFRpbWUoKERhdGUpIG8pOworICAgICAgICAgICAgICAgIHJldHVybiBjYWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKERhdGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSAmJgorICAgICAgICAgICAgICAgIG8gaW5zdGFuY2VvZiBDYWxlbmRhcikgeworICAgICAgICAgICAgICAgIHJldHVybiAoKENhbGVuZGFyKSBvKS5nZXRUaW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBpID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJhY3RlcikKKyAgICAgICAgICAgICAgICAgICAgaSA9IE51bWJlcnMudmFsdWVPZigoKENoYXJhY3RlcikgbykuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpIG8pLmxlbmd0aCgpID09IDEpCisgICAgICAgICAgICAgICAgICAgIGkgPSBOdW1iZXJzLnZhbHVlT2YoKChTdHJpbmcpIG8pLmNoYXJBdCgwKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEludGVnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgbnVtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFudW0pCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKF9sb2MuZ2V0KCJjYW50LWNvbnZlcnQiLCBvLAorICAgICAgICAgICAgICAgIG8uZ2V0Q2xhc3MoKSwgdHlwZSkuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICBpZiAodHlwZSA9PSBJbnRlZ2VyLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKCgoTnVtYmVyKSBvKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KCgoTnVtYmVyKSBvKS5mbG9hdFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSgoKE51bWJlcikgbykuZG91YmxlVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBMb25nLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKCgoTnVtYmVyKSBvKS5sb25nVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBCaWdEZWNpbWFsLmNsYXNzKSB7CisgICAgICAgICAgICAvLyB0aGUgQmlnRGVjaW1hbCBjb25zdHJ1Y3RvciBkb2Vzbid0IGhhbmRsZSB0aGUKKyAgICAgICAgICAgIC8vICJOYU4iIHN0cmluZyB2ZXJzaW9uIG9mIERvdWJsZS5OYU4gYW5kIEZsb2F0Lk5hTiwgbm9yCisgICAgICAgICAgICAvLyBkb2VzIGl0IGhhbmRsZSBpbmZpbml0eTsgd2UgbmVlZCB0byBpbnN0ZWFkIHVzZSB0aGUgRG91YmxlCisgICAgICAgICAgICAvLyBhbmQgRmxvYXQgdmVyc2lvbnMsIGRlc3BpdGUgd2FudGluZyB0byBjYXN0IGl0IHRvIEJpZ0RlY2ltYWwKKyAgICAgICAgICAgIGRvdWJsZSBkdmFsID0gKChOdW1iZXIpIG8pLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBpZiAoRG91YmxlLmlzTmFOKGR2YWwpIHx8IERvdWJsZS5pc0luZmluaXRlKGR2YWwpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKGR2YWwpOworCisgICAgICAgICAgICBmbG9hdCBmdmFsID0gKChOdW1iZXIpIG8pLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChGbG9hdC5pc05hTihmdmFsKSB8fCBGbG9hdC5pc0luZmluaXRlKGZ2YWwpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQoZnZhbCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbChvLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQmlnSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG8udG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBTaG9ydC5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCgoKE51bWJlcikgbykuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZSgoKE51bWJlcikgbykuYnl0ZVZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigoKE51bWJlcikgbykuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhZGQoT2JqZWN0IG8xLCBDbGFzcyBjMSwgT2JqZWN0IG8yLCBDbGFzcyBjMikgeworICAgICAgICByZXR1cm4gb3AobzEsIGMxLCBvMiwgYzIsIE9QX0FERCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VidHJhY3QgdGhlIGdpdmVuIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBzdWJ0cmFjdChPYmplY3QgbzEsIENsYXNzIGMxLCBPYmplY3QgbzIsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBvcChvMSwgYzEsIG8yLCBjMiwgT1BfU1VCVFJBQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11bHRpcGx5IHRoZSBnaXZlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbXVsdGlwbHkoT2JqZWN0IG8xLCBDbGFzcyBjMSwgT2JqZWN0IG8yLCBDbGFzcyBjMikgeworICAgICAgICByZXR1cm4gb3AobzEsIGMxLCBvMiwgYzIsIE9QX01VTFRJUExZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXZpZGUgdGhlIGdpdmVuIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBkaXZpZGUoT2JqZWN0IG8xLCBDbGFzcyBjMSwgT2JqZWN0IG8yLCBDbGFzcyBjMikgeworICAgICAgICByZXR1cm4gb3AobzEsIGMxLCBvMiwgYzIsIE9QX0RJVklERSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kIHRoZSBnaXZlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbW9kKE9iamVjdCBvMSwgQ2xhc3MgYzEsIE9iamVjdCBvMiwgQ2xhc3MgYzIpIHsKKyAgICAgICAgcmV0dXJuIG9wKG8xLCBjMSwgbzIsIGMyLCBPUF9NT0QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGdpdmVuIG9wZXJhdGlvbiBvbiB0d28gbnVtYmVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgb3AoT2JqZWN0IG8xLCBDbGFzcyBjMSwgT2JqZWN0IG8yLCBDbGFzcyBjMiwgaW50IG9wKSB7CisgICAgICAgIENsYXNzIHByb21vdGUgPSBwcm9tb3RlKGMxLCBjMik7CisgICAgICAgIGlmIChwcm9tb3RlID09IGludC5jbGFzcykgeworICAgICAgICAgICAgaW50IG4xID0gKG8xID09IG51bGwpID8gMCA6ICgoTnVtYmVyKSBvMSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGludCBuMiA9IChvMiA9PSBudWxsKSA/IDAgOiAoKE51bWJlcikgbzIpLmludFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gb3AobjEsIG4yLCBvcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb21vdGUgPT0gZmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgIGZsb2F0IG4xID0gKG8xID09IG51bGwpID8gMEYgOiAoKE51bWJlcikgbzEpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgICAgIGZsb2F0IG4yID0gKG8yID09IG51bGwpID8gMEYgOiAoKE51bWJlcikgbzIpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBvcChuMSwgbjIsIG9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvbW90ZSA9PSBkb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgIGRvdWJsZSBuMSA9IChvMSA9PSBudWxsKSA/IDBEIDogKChOdW1iZXIpIG8xKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIG4yID0gKG8yID09IG51bGwpID8gMEQgOiAoKE51bWJlcikgbzIpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gb3AobjEsIG4yLCBvcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb21vdGUgPT0gbG9uZy5jbGFzcykgeworICAgICAgICAgICAgbG9uZyBuMSA9IChvMSA9PSBudWxsKSA/IDBMIDogKChOdW1iZXIpIG8xKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIGxvbmcgbjIgPSAobzIgPT0gbnVsbCkgPyAwTCA6ICgoTnVtYmVyKSBvMikubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gb3AobjEsIG4yLCBvcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb21vdGUgPT0gQmlnRGVjaW1hbC5jbGFzcykgeworICAgICAgICAgICAgQmlnRGVjaW1hbCBuMSA9IChvMSA9PSBudWxsKSA/IFpFUk9fQklHREVDSU1BTAorICAgICAgICAgICAgICAgIDogKEJpZ0RlY2ltYWwpIGNvbnZlcnQobzEsIHByb21vdGUpOworICAgICAgICAgICAgQmlnRGVjaW1hbCBuMiA9IChvMiA9PSBudWxsKSA/IFpFUk9fQklHREVDSU1BTAorICAgICAgICAgICAgICAgIDogKEJpZ0RlY2ltYWwpIGNvbnZlcnQobzIsIHByb21vdGUpOworICAgICAgICAgICAgcmV0dXJuIG9wKG4xLCBuMiwgb3ApOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9tb3RlID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgbjEgPSAobzEgPT0gbnVsbCkgPyBaRVJPX0JJR0lOVEVHRVIKKyAgICAgICAgICAgICAgICA6IChCaWdJbnRlZ2VyKSBjb252ZXJ0KG8xLCBwcm9tb3RlKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgbjIgPSAobzIgPT0gbnVsbCkgPyBaRVJPX0JJR0lOVEVHRVIKKyAgICAgICAgICAgICAgICA6IChCaWdJbnRlZ2VyKSBjb252ZXJ0KG8yLCBwcm9tb3RlKTsKKyAgICAgICAgICAgIHJldHVybiBvcChuMSwgbjIsIG9wKTsKKyAgICAgICAgfQorICAgICAgICAvLyBkZWZhdWx0IHRvIGludAorICAgICAgICBpbnQgbjEgPSAobzEgPT0gbnVsbCkgPyAwIDogKChOdW1iZXIpIG8xKS5pbnRWYWx1ZSgpOworICAgICAgICBpbnQgbjIgPSAobzIgPT0gbnVsbCkgPyAwIDogKChOdW1iZXIpIG8yKS5pbnRWYWx1ZSgpOworICAgICAgICByZXR1cm4gb3AobjEsIG4yLCBvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXN1bHQgb2YgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBvcChpbnQgbjEsIGludCBuMiwgaW50IG9wKSB7CisgICAgICAgIGludCB0b3Q7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgT1BfQUREOgorICAgICAgICAgICAgICAgIHRvdCA9IG4xICsgbjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX1NVQlRSQUNUOgorICAgICAgICAgICAgICAgIHRvdCA9IG4xIC0gbjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX01VTFRJUExZOgorICAgICAgICAgICAgICAgIHRvdCA9IG4xICogbjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX0RJVklERToKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSAvIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9NT0Q6CisgICAgICAgICAgICAgICAgdG90ID0gbjEgJSBuMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZih0b3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgb3AoZmxvYXQgbjEsIGZsb2F0IG4yLCBpbnQgb3ApIHsKKyAgICAgICAgZmxvYXQgdG90OworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIE9QX0FERDoKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSArIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSAtIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9NVUxUSVBMWToKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSAqIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9ESVZJREU6CisgICAgICAgICAgICAgICAgdG90ID0gbjEgLyBuMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfTU9EOgorICAgICAgICAgICAgICAgIHRvdCA9IG4xICUgbjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmxvYXQodG90KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBhIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG9wKGRvdWJsZSBuMSwgZG91YmxlIG4yLCBpbnQgb3ApIHsKKyAgICAgICAgZG91YmxlIHRvdDsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBPUF9BREQ6CisgICAgICAgICAgICAgICAgdG90ID0gbjEgKyBuMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfU1VCVFJBQ1Q6CisgICAgICAgICAgICAgICAgdG90ID0gbjEgLSBuMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfTVVMVElQTFk6CisgICAgICAgICAgICAgICAgdG90ID0gbjEgKiBuMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfRElWSURFOgorICAgICAgICAgICAgICAgIHRvdCA9IG4xIC8gbjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX01PRDoKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSAlIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERvdWJsZSh0b3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgb3AobG9uZyBuMSwgbG9uZyBuMiwgaW50IG9wKSB7CisgICAgICAgIGxvbmcgdG90OworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIE9QX0FERDoKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSArIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSAtIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9NVUxUSVBMWToKKyAgICAgICAgICAgICAgICB0b3QgPSBuMSAqIG4yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9ESVZJREU6CisgICAgICAgICAgICAgICAgdG90ID0gbjEgLyBuMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfTU9EOgorICAgICAgICAgICAgICAgIHRvdCA9IG4xICUgbjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YodG90KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBhIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG9wKEJpZ0RlY2ltYWwgbjEsIEJpZ0RlY2ltYWwgbjIsIGludCBvcCkgeworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIE9QX0FERDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbjEuYWRkKG4yKTsKKyAgICAgICAgICAgIGNhc2UgT1BfU1VCVFJBQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIG4xLnN1YnRyYWN0KG4yKTsKKyAgICAgICAgICAgIGNhc2UgT1BfTVVMVElQTFk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG4xLm11bHRpcGx5KG4yKTsKKyAgICAgICAgICAgIGNhc2UgT1BfRElWSURFOgorICAgICAgICAgICAgICAgIGludCBzY2FsZSA9IE1hdGgubWF4KG4xLnNjYWxlKCksIG4yLnNjYWxlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBuMS5kaXZpZGUobjIsIHNjYWxlLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApOworICAgICAgICAgICAgY2FzZSBPUF9NT0Q6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm1vZC1iaWdkZWNpbWFsIikpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgb3AoQmlnSW50ZWdlciBuMSwgQmlnSW50ZWdlciBuMiwgaW50IG9wKSB7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgT1BfQUREOgorICAgICAgICAgICAgICAgIHJldHVybiBuMS5hZGQobjIpOworICAgICAgICAgICAgY2FzZSBPUF9TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbjEuc3VidHJhY3QobjIpOworICAgICAgICAgICAgY2FzZSBPUF9NVUxUSVBMWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbjEubXVsdGlwbHkobjIpOworICAgICAgICAgICAgY2FzZSBPUF9ESVZJREU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG4xLmRpdmlkZShuMik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBkZWNsYXJhdGlvbnMgaW50byBhIGxpc3Qgb2YgdHlwZSwgbmFtZSwgdHlwZSwgbmFtZS4uLgorICAgICAqIFJldHVybnMgbnVsbCBpZiBubyBkZWNsYXJhdGlvbnMuIEFzc3VtZXMgZGVjbGFyYXRpb24gaXMgbm90IGFuIGVtcHR5CisgICAgICogc3RyaW5nIGFuZCBpcyBhbHJlYWR5IHRyaW1tZWQgKHZhbGlkIGFzc3VtcHRpb25zIGdpdmVuIHRoZSBjaGVja3MgbWFkZQorICAgICAqIGluIG91ciBzZXR0ZXJzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNUeXBlIHRoZSB0eXBlIG9mIGRlY2xhcmF0aW9uIGJlaW5nIHBhcnNlZCwgZm9yIHVzZSBpbgorICAgICAqIGVycm9yIG1lc3NhZ2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHBhcnNlRGVjbGFyYXRpb24oU3RyaW5nIGRlYywgY2hhciBzcGxpdCwKKyAgICAgICAgU3RyaW5nIGRlY1R5cGUpIHsKKyAgICAgICAgaWYgKGRlYyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gd2F0Y2ggZm9yIGNvbW1vbiBtaXh1cHMgYmV0d2VlbiBjb21tYXMgYW5kIHNlbWlzCisgICAgICAgIGNoYXIgYmFkID0gKGNoYXIpIDA7CisgICAgICAgIGlmIChzcGxpdCA9PSAnLCcpCisgICAgICAgICAgICBiYWQgPSAnOyc7CisgICAgICAgIGVsc2UgaWYgKHNwbGl0ID09ICc7JykKKyAgICAgICAgICAgIGJhZCA9ICcsJzsKKworICAgICAgICBjaGFyIHNlbnRpbmFsID0gJyAnOworICAgICAgICBjaGFyIGN1cjsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgYm9vbGVhbiBza2lwU3BhY2UgPSBmYWxzZTsKKyAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCg2KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY3VyID0gZGVjLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gYmFkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZGVjIiwgZGVjLCBkZWNUeXBlKSk7CisgICAgICAgICAgICBpZiAoY3VyID09ICcgJyAmJiBza2lwU3BhY2UpIHsKKyAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwU3BhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjdXIgIT0gc2VudGluYWwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGlmIGxvb2tpbmcgZm9yIHNwYWNlcywgbG9vayBmb3Igc3BsaXQgY2hhciwgb3IgdmljZSB2ZXJzYQorICAgICAgICAgICAgc2VudGluYWwgPSAoc2VudGluYWwgPT0gJyAnKSA/IHNwbGl0IDogJyAnOworICAgICAgICAgICAgcmVzdWx0cy5hZGQoZGVjLnN1YnN0cmluZyhzdGFydCwgaSkudHJpbSgpKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7CisgICAgICAgICAgICBza2lwU3BhY2UgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGxhc3QgdG9rZW4sIGlmIGFueQorICAgICAgICBpZiAoc3RhcnQgPCBkZWMubGVuZ3RoKCkpCisgICAgICAgICAgICByZXN1bHRzLmFkZChkZWMuc3Vic3RyaW5nKHN0YXJ0KSk7CisKKyAgICAgICAgLy8gaWYgbm90IGFuIGV2ZW4gbnVtYmVyIG9mIGVsZW1lbnRzLCBzb21ldGhpbmcgaXMgd3JvbmcKKyAgICAgICAgaWYgKHJlc3VsdHMuaXNFbXB0eSgpIHx8IHJlc3VsdHMuc2l6ZSgpICUgMiAhPSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1kZWMiLCBkZWMsIGRlY1R5cGUpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGxpdCB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBsaXN0IGludG8gZGlzdGluY3QgZXhwcmVzc2lvbnMuIEFzc3VtZXMgdGhlCisgICAgICogZ2l2ZW4gc3RyaW5nIGlzIG5vdCBudWxsIG9yIG9mIHplcm8gbGVuZ3RoIGFuZCBpcyBhbHJlYWR5IHRyaW1tZWQKKyAgICAgKiAodmFsaWQgYXNzdW1wdGlvbnMgZ2l2ZW4gdGhlIGNoZWNrcyBpbiBvdXIgc2V0dGVycyBhbmQgYmVmb3JlCisgICAgICogdGhpcyBtZXRob2QgY2FsbCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHNwbGl0RXhwcmVzc2lvbnMoU3RyaW5nIHN0ciwgY2hhciBzcGxpdCwgaW50IGV4cGVjdGVkKSB7CisgICAgICAgIGlmIChzdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIExpc3QgZXhwcyA9IG51bGw7CisgICAgICAgIGludCBwYXJlbkRlcHRoID0gMDsKKyAgICAgICAgaW50IGJlZ2luID0gMCwgcG9zID0gMDsKKyAgICAgICAgYm9vbGVhbiBlc2NhcGUgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzdHJpbmcgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBub25zcGFjZSA9IGZhbHNlOworICAgICAgICBjaGFyIHF1b3RlID0gMDsKKyAgICAgICAgZm9yIChjaGFyIGM7IHBvcyA8IHN0ci5sZW5ndGgoKTsgcG9zKyspIHsKKyAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KHBvcyk7CisgICAgICAgICAgICBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgZXNjYXBlID0gIWVzY2FwZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlc2NhcGUpIHsKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nICYmIHF1b3RlID09IGMpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub25zcGFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVuRGVwdGgrKzsKKyAgICAgICAgICAgICAgICAgICAgbm9uc3BhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbkRlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIG5vbnNwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IHNwbGl0ICYmICFzdHJpbmcgJiYgcGFyZW5EZXB0aCA9PSAwICYmIG5vbnNwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHMgPSBuZXcgQXJyYXlMaXN0KGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHMuYWRkKHN0ci5zdWJzdHJpbmcoYmVnaW4sIHBvcykudHJpbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNwYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gc3BsaXQgJiYgIXN0cmluZyAmJiBwYXJlbkRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcyA9IG5ldyBBcnJheUxpc3QoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcy5hZGQoc3RyLnN1YnN0cmluZyhiZWdpbiwgcG9zKS50cmltKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSBwb3MgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vbnNwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVzY2FwZSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4cHMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCB3YXNuJ3QgYWRkZWQgdW50aWwgMS4zCisgICAgICAgICAgICBleHBzID0gbmV3IEFycmF5TGlzdCgxKTsKKyAgICAgICAgICAgIGV4cHMuYWRkKHN0cik7CisgICAgICAgICAgICByZXR1cm4gZXhwczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBsYXN0IGV4cCBhbmQgcmV0dXJuIGFycmF5CisgICAgICAgIFN0cmluZyBsYXN0ID0gc3RyLnN1YnN0cmluZyhiZWdpbikudHJpbSgpOworICAgICAgICBpZiAobGFzdC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBleHBzLmFkZChsYXN0KTsKKyAgICAgICAgcmV0dXJuIGV4cHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBhY2Nlc3MgcGF0aCBtZXRhZGF0YXMgdG8gdGhlIGZ1bGwgcGF0aCBsaXN0LCBtYWtpbmcgc3VyZQorICAgICAqIHRvIG1haW50YWluIG9ubHkgYmFzZSBtZXRhZGF0YXMgaW4gdGhlIGxpc3QuIFRoZSBnaXZlbiBsaXN0IG1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBhZGRBY2Nlc3NQYXRoTWV0YURhdGFzKExpc3QgbWV0YXMsCisgICAgICAgIENsYXNzTWV0YURhdGFbXSBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBtZXRhczsKKworICAgICAgICAvLyBjcmVhdGUgc2V0IG9mIGJhc2UgY2xhc3MgbWV0YWRhdGFzIGluIGFjY2VzcyBwYXRoCisgICAgICAgIGlmIChtZXRhcyA9PSBudWxsKQorICAgICAgICAgICAgbWV0YXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludCBsYXN0ID0gbWV0YXMuc2l6ZSgpOworCisgICAgICAgIC8vIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBwYXRoIG9mIHRoaXMgZXhlY3V0b3IsIGNvbXBhcmUgaXQKKyAgICAgICAgLy8gdG8gYWxyZWFkeS1nYXRoZXJlZCBlbGVtZW50cyB0byBzZWUgaWYgaXQgc2hvdWxkIHJlcGxhY2UKKyAgICAgICAgLy8gYSBzdWJjbGFzcyBpbiB0aGUgbGlzdCBvciBzaG91bGQgYmUgYWRkZWQgYXMgYSBuZXcgYmFzZTsKKyAgICAgICAgLy8gYXQgbGVhc3QgaXQncyBuXjIgb2YgYSBzbWFsbCBuLi4uCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YTsKKyAgICAgICAgYm9vbGVhbiBhZGQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBhZGQgJiYgaiA8IGxhc3Q7IGorKykgeworICAgICAgICAgICAgICAgIG1ldGEgPSAoQ2xhc3NNZXRhRGF0YSkgbWV0YXMuZ2V0KGopOworCisgICAgICAgICAgICAgICAgaWYgKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmlzQXNzaWduYWJsZUZyb20KKyAgICAgICAgICAgICAgICAgICAgKHBhdGhbaV0uZ2V0RGVzY3JpYmVkVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IGFscmVhZHkgY29udGFpbnMgYmFzZSBjbGFzcworICAgICAgICAgICAgICAgICAgICBhZGQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhbaV0uZ2V0RGVzY3JpYmVkVHlwZSgpLmlzQXNzaWduYWJsZUZyb20KKyAgICAgICAgICAgICAgICAgICAgKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVsZW1lbnQgcmVwbGFjZXMgaXRzIHN1YmNsYXNzCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtZXRhcy5zZXQoaiwgcGF0aFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBubyBiYXNlIGNsYXNzIG9mIGN1cnJlbnQgcGF0aCBlbGVtZW50IGFscmVhZHkgaW4KKyAgICAgICAgICAgIC8vIGxpc3QgYW5kIHBhdGggZWxlbWVudCBkaWRuJ3QgcmVwbGFjZSBhIHN1YmNsYXNzIGluIHRoZQorICAgICAgICAgICAgLy8gbGlzdCwgdGhlbiBhZGQgaXQgbm93IGFzIGEgbmV3IGJhc2UKKyAgICAgICAgICAgIGlmIChhZGQpCisgICAgICAgICAgICAgICAgbWV0YXMuYWRkKHBhdGhbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSB1c2VyLWdpdmVuIGhpbnQgdmFsdWUgdG8gYW4gYWdncmVnYXRlIGxpc3RlbmVyLgorICAgICAqIFRoZSBoaW50IGNhbiBiZSBhbiBhZ2dyZWdhdGUgbGlzdGVuZXIgaW5zdGFuY2Ugb3IgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZUxpc3RlbmVyIGhpbnRUb0FnZ3JlZ2F0ZUxpc3RlbmVyKE9iamVjdCBoaW50LAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgaWYgKGhpbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZUxpc3RlbmVyKQorICAgICAgICAgICAgcmV0dXJuIChBZ2dyZWdhdGVMaXN0ZW5lcikgaGludDsKKworICAgICAgICBFeGNlcHRpb24gY2F1c2UgPSBudWxsOworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEFnZ3JlZ2F0ZUxpc3RlbmVyKSBDbGFzcy5mb3JOYW1lKChTdHJpbmcpIGhpbnQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgIGxvYWRlcikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2F1c2UgPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtYWdnLWxpc3RlbmVyLWhpbnQiLCBoaW50LAorICAgICAgICAgICAgaGludC5nZXRDbGFzcygpKSkuc2V0Q2F1c2UoY2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHVzZXItZ2l2ZW4gaGludCB2YWx1ZSB0byBhbiBhcnJheSBvZiBhZ2dyZWdhdGUgbGlzdGVuZXJzLgorICAgICAqIFRoZSBoaW50IGNhbiBiZSBhbiBhZ2dyZWdhdGUgbGlzdGVuZXIsIGFnZ3JlZ2F0ZSBsaXN0ZW5lciBhcnJheSwKKyAgICAgKiBjb2xsZWN0aW9uLCBvciBjb21tYS1zZXBhcmF0ZWQgY2xhc3MgbmFtZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVMaXN0ZW5lcltdIGhpbnRUb0FnZ3JlZ2F0ZUxpc3RlbmVycyhPYmplY3QgaGludCwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIGlmIChoaW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGhpbnQgaW5zdGFuY2VvZiBBZ2dyZWdhdGVMaXN0ZW5lcltdKQorICAgICAgICAgICAgcmV0dXJuIChBZ2dyZWdhdGVMaXN0ZW5lcltdKSBoaW50OworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZUxpc3RlbmVyKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVMaXN0ZW5lcltdeyAoQWdncmVnYXRlTGlzdGVuZXIpIGhpbnQgfTsKKyAgICAgICAgaWYgKGhpbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGMgPSAoQ29sbGVjdGlvbikgaGludDsKKyAgICAgICAgICAgIHJldHVybiAoQWdncmVnYXRlTGlzdGVuZXJbXSkgYy50b0FycmF5CisgICAgICAgICAgICAgICAgKG5ldyBBZ2dyZWdhdGVMaXN0ZW5lcltjLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgRXhjZXB0aW9uIGNhdXNlID0gbnVsbDsKKyAgICAgICAgaWYgKGhpbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGNsc3MgPSBTdHJpbmdzLnNwbGl0KChTdHJpbmcpIGhpbnQsICIsIiwgMCk7CisgICAgICAgICAgICBBZ2dyZWdhdGVMaXN0ZW5lcltdIGFnZ3MgPSBuZXcgQWdncmVnYXRlTGlzdGVuZXJbY2xzcy5sZW5ndGhdOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsc3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGFnZ3NbaV0gPSAoQWdncmVnYXRlTGlzdGVuZXIpIENsYXNzLmZvck5hbWUoY2xzc1tpXSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWdnczsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2F1c2UgPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtYWdnLWxpc3RlbmVyLWhpbnQiLCBoaW50LAorICAgICAgICAgICAgaGludC5nZXRDbGFzcygpKSkuc2V0Q2F1c2UoY2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHVzZXItZ2l2ZW4gaGludCB2YWx1ZSB0byBhIGZpbHRlciBsaXN0ZW5lci4KKyAgICAgKiBUaGUgaGludCBjYW4gYmUgYSBmaWx0ZXIgbGlzdGVuZXIgaW5zdGFuY2Ugb3IgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbHRlckxpc3RlbmVyIGhpbnRUb0ZpbHRlckxpc3RlbmVyKE9iamVjdCBoaW50LAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgaWYgKGhpbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIEZpbHRlckxpc3RlbmVyKQorICAgICAgICAgICAgcmV0dXJuIChGaWx0ZXJMaXN0ZW5lcikgaGludDsKKworICAgICAgICBFeGNlcHRpb24gY2F1c2UgPSBudWxsOworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZpbHRlckxpc3RlbmVyKSBDbGFzcy5mb3JOYW1lKChTdHJpbmcpIGhpbnQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgIGxvYWRlcikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2F1c2UgPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZmlsdGVyLWxpc3RlbmVyLWhpbnQiLCBoaW50LAorICAgICAgICAgICAgaGludC5nZXRDbGFzcygpKSkuc2V0Q2F1c2UoY2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIHVzZXItZ2l2ZW4gaGludCB2YWx1ZSB0byBhbiBhcnJheSBvZiBmaWx0ZXIgbGlzdGVuZXJzLgorICAgICAqIFRoZSBoaW50IGNhbiBiZSBhIGZpbHRlciBsaXN0ZW5lciwgZmlsdGVyIGxpc3RlbmVyIGFycmF5LAorICAgICAqIGNvbGxlY3Rpb24sIG9yIGNvbW1hLXNlcGFyYXRlZCBjbGFzcyBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbHRlckxpc3RlbmVyW10gaGludFRvRmlsdGVyTGlzdGVuZXJzKE9iamVjdCBoaW50LAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgaWYgKGhpbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIEZpbHRlckxpc3RlbmVyW10pCisgICAgICAgICAgICByZXR1cm4gKEZpbHRlckxpc3RlbmVyW10pIGhpbnQ7CisgICAgICAgIGlmIChoaW50IGluc3RhbmNlb2YgRmlsdGVyTGlzdGVuZXIpCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlckxpc3RlbmVyW117IChGaWx0ZXJMaXN0ZW5lcikgaGludCB9OworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSBoaW50OworICAgICAgICAgICAgcmV0dXJuIChGaWx0ZXJMaXN0ZW5lcltdKSBjLnRvQXJyYXkobmV3IEZpbHRlckxpc3RlbmVyW2Muc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICBFeGNlcHRpb24gY2F1c2UgPSBudWxsOworICAgICAgICBpZiAoaGludCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgU3RyaW5nW10gY2xzcyA9IFN0cmluZ3Muc3BsaXQoKFN0cmluZykgaGludCwgIiwiLCAwKTsKKyAgICAgICAgICAgIEZpbHRlckxpc3RlbmVyW10gZmlsdHMgPSBuZXcgRmlsdGVyTGlzdGVuZXJbY2xzcy5sZW5ndGhdOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsc3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGZpbHRzW2ldID0gKEZpbHRlckxpc3RlbmVyKSBDbGFzcy5mb3JOYW1lKGNsc3NbaV0sIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRzOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjYXVzZSA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1maWx0ZXItbGlzdGVuZXItaGludCIsIGhpbnQsCisgICAgICAgICAgICBoaW50LmdldENsYXNzKCkpKS5zZXRDYXVzZShjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbmFtZWQgYnkgdGhlIGhpbnQga2V5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGhpbnRUb0dldHRlcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgaGludEtleSkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgaGludEtleSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgTWV0aG9kIGdldHRlciA9IFJlZmxlY3Rpb24uZmluZEdldHRlcih0YXJnZXQuZ2V0Q2xhc3MoKSwgaGludEtleSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBSZWZsZWN0aW9uLmdldCh0YXJnZXQsIGdldHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbmFtZWQgYnkgdGhlIGhpbnQga2V5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoaW50VG9TZXR0ZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGhpbnRLZXksCisgICAgICAgIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgaGludEtleSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE1ldGhvZCBzZXR0ZXIgPSBSZWZsZWN0aW9uLmZpbmRTZXR0ZXIodGFyZ2V0LmdldENsYXNzKCksIGhpbnRLZXksIHRydWUpOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGlmICgibnVsbCIuZXF1YWxzKHZhbHVlKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZ3MucGFyc2UoKFN0cmluZykgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXIuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1zZXR0ZXItaGludC1hcmciLAorICAgICAgICAgICAgICAgICAgICAgICAgaGludEtleSwgdmFsdWUsIHNldHRlci5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUmVmbGVjdGlvbi5zZXQodGFyZ2V0LCBzZXR0ZXIsIHZhbHVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9GaW5hbGl6aW5nQnJva2VySW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmluYWxpemluZ0Jyb2tlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTM2ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmluYWxpemluZ0Jyb2tlckltcGwuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogU3VidHlwZSBvZiB7QGxpbmsgQnJva2VySW1wbH0gdGhhdCBhdXRvbWF0aWNhbGx5IGNsb3NlcyBpdHNlbGYgZHVyaW5nCisgKiBmaW5hbGl6YXRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gZ3VhcmRzIGFnYWluc3QgcG90ZW50aWFsIHJlc291cmNlIGxlYWtzLAorICogYnV0IGFsc28gaW5jdXJzIGEgc2NhbGFiaWxpdHkgYm90dGxlbmVjayBhcyBpbnN0YW5jZXMgYXJlIGVubGlzdGVkIGluIHRoZQorICogZmluYWxpemF0aW9uIHF1ZXVlIGFuZCBzdWJzZXF1ZW50bHkgY2xlYW5lZCB1cC4KKyAqCisgKiBAc2luY2UgMC45LjcKKyAqLworcHVibGljIGNsYXNzIEZpbmFsaXppbmdCcm9rZXJJbXBsCisgICAgZXh0ZW5kcyBCcm9rZXJJbXBsIHsKKworICAgIC8qKgorICAgICAqIENsb3NlIG9uIGZpbmFsaXplLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKKyAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIGlmICghaXNDbG9zZWQoKSkKKyAgICAgICAgICAgIGZyZWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9GaW5kQ2FsbGJhY2tzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9GaW5kQ2FsbGJhY2tzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2OWIzMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0ZpbmRDYWxsYmFja3MuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogQWxsb3dzIGZhY2FkZXMgdG8gY29udHJvbCB0aGUgcGFydGljdWxhcnMgb2YgdGhlIGZpbmQgb3BlcmF0aW9uCisgKiB0aHJvdWdoIGNhbGxiYWNrcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEZpbmRDYWxsYmFja3MgeworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBmaW5kIGFyZ3VtZW50LiBUaHJvdyBwcm9wZXIgCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb259IGZvciBpbGxlZ2FsIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaWQgdG8gbG9vayB1cCwgb3IgbnVsbCB0byBpZ25vcmUgdGhpcyBhcmd1bWVudAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcHJvY2Vzc0FyZ3VtZW50KE9iamVjdCBvaWQpOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBvcGVyYXRpb24gcmV0dXJuIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcHJvY2Vzc1JldHVybihPYmplY3Qgb2lkLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0hvbGxvd1N0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ib2xsb3dTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODVhNzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ib2xsb3dTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBMaWZlY3ljbGUgc3RhdGUuCisgKiBSZXByZXNlbnRzIGEgaG9sbG93IGluc3RhbmNlIHRoYXQgZXhpc3RzIGluIHRoZSBkYXRhIHN0b3JlLCBidXQgd2hvc2UKKyAqIHN0YXRlIGhhcyBub3QgYmVlbiBsb2FkZWQgYW5kIHdobyBpcyBub3QgYWN0aXZlIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisgKiAoaWYgYW55KS4gVGhpcyBtYXkgYmUgdGhlIHN0YXRlIG9mIGluc3RhbmNlcyByZXR1cm5lZCBvbiBJRCBsb29rdXBzIG9yIGJ5CisgKiB0cmF2ZXJzaW5nIHJlbGF0aW9ucywgYW5kIHRoZSBzdGF0ZSBvZiBwZXJzaXN0ZW50IGluc3RhbmNlcyBvdXRzaWRlIG9mCisgKiB0cmFuc2FjdGlvbnMgKHVubGVzcyB0aGUgcmV0YWluVmFsdWVzIGZsYWcgaXMgc2V0IGluIHRoZSBCcm9rZXIpLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEhvbGxvd1N0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5jbGVhckZpZWxkcygpOworICAgICAgICBjb250ZXh0LmNsZWFyU2F2ZWRGaWVsZHMoKTsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eShmYWxzZSk7CisgICAgfQorCisgICAgUENTdGF0ZSBkZWxldGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucHJlRGVsZXRlKCk7CisgICAgICAgIHJldHVybiBQREVMRVRFRDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgYmVmb3JlUmVhZChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gUENMRUFOOworICAgIH0KKworICAgIFBDU3RhdGUgYmVmb3JlT3B0aW1pc3RpY1JlYWQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIFBOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU5vbnRyYW5zYWN0aW9uYWxSZWFkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIFBESVJUWTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIFBESVJUWTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU5vbnRyYW5zYWN0aW9uYWxXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIFBOT05UUkFOUzsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Jbk1lbW9yeVNhdmVwb2ludE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0luTWVtb3J5U2F2ZXBvaW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTI1MWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Jbk1lbW9yeVNhdmVwb2ludE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogQSB7QGxpbmsgU2F2ZXBvaW50TWFuYWdlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIGFsbCBkYXRhIGluIG1lbW9yeS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQHNpbmNlIDAuMy40CisgKi8KK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVNhdmVwb2ludE1hbmFnZXIKKyAgICBpbXBsZW1lbnRzIFNhdmVwb2ludE1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBib29sZWFuIF9wcmVGbHVzaCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0byBjYWxsIHtAbGluayBCcm9rZXIjcHJlRmx1c2h9CisgICAgICogd2hlbiBhIHNhdmVwb2ludCBpcyBzZXQuIFdoaWxlIHRoaXMgd2lsbCBhbGxvdyBmb3IgdHJhY2tpbmcgb2YKKyAgICAgKiBuZXdseSBlbWJlZGRlZCBmaWVsZHMsIGl0IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZ29pbmcgdGhyb3VnaAorICAgICAqIHByZS1mbHVzaCBvcGVyYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByZUZsdXNoKCkgeworICAgICAgICByZXR1cm4gX3ByZUZsdXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGNhbGwge0BsaW5rIEJyb2tlciNwcmVGbHVzaH0KKyAgICAgKiB3aGVuIGEgc2F2ZXBvaW50IGlzIHNldC4gV2hpbGUgdGhpcyB3aWxsIGFsbG93IGZvciB0cmFja2luZyBvZgorICAgICAqIG5ld2x5IGVtYmVkZGVkIGZpZWxkcywgaXQgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBnb2luZyB0aHJvdWdoCisgICAgICogcHJlLWZsdXNoIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlRmx1c2goYm9vbGVhbiBwcmVGbHVzaCkgeworICAgICAgICBfcHJlRmx1c2ggPSBwcmVGbHVzaDsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVNhdmVwb2ludCBuZXdTYXZlcG9pbnQoU3RyaW5nIG5hbWUsIEJyb2tlciBicm9rZXIpIHsKKyAgICAgICAgLy8gcHJlLWZsdXNoIGFmdGVyIGNyZWF0aW5nIHNhdmVwb2ludCBiL2MgcHJlLWZsdXNoIG1heSBhZGQvY2hhbmdlCisgICAgICAgIC8vIHN0YXRlcworICAgICAgICBPcGVuSlBBU2F2ZXBvaW50IHNhdmUgPSBuZXcgT3BlbkpQQVNhdmVwb2ludChicm9rZXIsIG5hbWUsIHRydWUpOworICAgICAgICBpZiAoX3ByZUZsdXNoKQorICAgICAgICAgICAgYnJva2VyLnByZUZsdXNoKCk7CisgICAgICAgIHJldHVybiBzYXZlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5jcmVtZW50YWxGbHVzaCgpIHsKKyAgICAgICAgLy8JY2Fubm90IGluY3JlbWVudGFsbHkgZmx1c2ggYXMgc2F2ZWQgZmllbGRzIG1heSBiZWNvbWUgb3V0IG9mIHN5bmNoLgorICAgICAgICByZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvSW52ZXJzZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0ludmVyc2VNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4OWUwNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0ludmVyc2VNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5EYXRhQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKKworLyoqCisgKiBDbGFzcyB3aGljaCBtYW5hZ2VzIGludmVyc2UgcmVsYXRpb25zIGJlZm9yZSBmbHVzaGluZworICogdG8gdGhlIGRhdGFzdG9yZS4gRW5zdXJlcyB0aGF0IGludmVyc2UgZmllbGRzIGFyZSBzZXQuCisgKiAgQ3VycmVudGx5IGxpbWl0ZWQgdG8gbWFuYWdpbmcgUEMgYW5kIENvbGxlY3Rpb24tdHlwZSByZWxhdGlvbnMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGNsYXNzIEludmVyc2VNYW5hZ2VyIGltcGxlbWVudHMgQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEludmVyc2VNYW5hZ2VyLmNsYXNzKTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE5PTkUgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHtAbGluayAjQUNUSU9OX01BTkFHRX0gYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX01BTkFHRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHtAbGluayAjQUNUSU9OX1dBUk59IGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9XQVJOID0gMTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHJlcHJlc2VudGluZyB0aGUge0BsaW5rICNBQ1RJT05fRVhDRVBUSU9OfSBhY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRVhDRVBUSU9OID0gMjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfbWFuYWdlTFJTID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgX2FjdGlvbiA9IEFDVElPTl9NQU5BR0U7CisgICAgcHJpdmF0ZSBMb2cgX2xvZzsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRvIG1hbmFnZSBMUlMgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE1hbmFnZUxSUygpIHsKKyAgICAgICAgcmV0dXJuIF9tYW5hZ2VMUlM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gZmFsc2UgTFJTIHJlbGF0aW9ucy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlTFJTKGJvb2xlYW4gbWFuYWdlKSB7CisgICAgICAgIF9tYW5hZ2VMUlMgPSBtYW5hZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhY3Rpb24gY29uc3RhbnQgdG8gdXNlIGR1cmluZyByZWxhdGlvbnNoaXAgY2hlY2tpbmcuCisgICAgICogRGVmYXVsdHMgdG8ge0BsaW5rICNBQ1RJT05fTUFOQUdFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9hY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gY29uc3RhbnQgdG8gdXNlIGR1cmluZyByZWxhdGlvbnNoaXAgY2hlY2tpbmcuCisgICAgICogRGVmYXVsdHMgdG8ge0BsaW5rICNBQ1RJT05fTUFOQUdFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oaW50IGFjdGlvbikgeworICAgICAgICBfYWN0aW9uID0gYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIHN0cmluZyB0byB1c2UgZHVyaW5nIHJlbGF0aW9uc2hpcCBjaGVja2luZy4KKyAgICAgKiBPcHRpb25zIGluY2x1ZGUgPGNvZGU+bWFuYWdlLCBleGNlcHRpb24sIHdhcm48L2NvZGU+LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHByaW1hcmlseSBmb3Igc3RyaW5nLWJhc2VkIGF1dG9tYXRlZCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIGlmICgiZXhjZXB0aW9uIi5lcXVhbHMoYWN0aW9uKSkKKyAgICAgICAgICAgIF9hY3Rpb24gPSBBQ1RJT05fRVhDRVBUSU9OOworICAgICAgICBlbHNlIGlmICgid2FybiIuZXF1YWxzKGFjdGlvbikpCisgICAgICAgICAgICBfYWN0aW9uID0gQUNUSU9OX1dBUk47CisgICAgICAgIGVsc2UgaWYgKCJtYW5hZ2UiLmVxdWFscyhhY3Rpb24pKQorICAgICAgICAgICAgX2FjdGlvbiA9IEFDVElPTl9NQU5BR0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYWN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfbG9nID0gY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcnJlY3QgcmVsYXRpb25zIGZyb20gdGhlIGdpdmVuIGRpcnR5IGZpZWxkIHRvIGludmVyc2UgaW5zdGFuY2VzLgorICAgICAqIEZpZWxkIDxjb2RlPmZtZDwvY29kZT4gb2YgdGhlIGluc3RhbmNlIG1hbmFnZWQgYnkgPGNvZGU+c208L2NvZGU+IGhhcworICAgICAqIHZhbHVlIDxjb2RlPnZhbHVlPC9jb2RlPi4gRW5zdXJlIHRoYXQgYWxsIGludmVyc2VzIHJlbGF0aW9ucyBmcm9tCisgICAgICogPGNvZGU+dmFsdWU8L2NvZGU+IGFyZSBjb25zaXN0ZW50IHdpdGggdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3JyZWN0UmVsYXRpb25zKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlBDICYmCisgICAgICAgICAgICAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuQ09MTEVDVElPTiB8fAorICAgICAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5QQykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gaWdub3JlIExSUyBmaWVsZHMKKyAgICAgICAgaWYgKCFnZXRNYW5hZ2VMUlMoKSAmJiBmbWQuaXNMUlMoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gaW52ZXJzZXMgPSBmbWQuZ2V0SW52ZXJzZU1ldGFEYXRhcygpOworICAgICAgICBpZiAoaW52ZXJzZXMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gY2xlYXIgYW55IHJlc3RvcmFibGUgcmVsYXRpb25zCisgICAgICAgIGNsZWFySW52ZXJzZVJlbGF0aW9ucyhzbSwgZm1kLCBpbnZlcnNlcywgdmFsdWUpOworCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdG9yZUNvbnRleHQgY3R4ID0gc20uZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludmVyc2VSZWxhdGlvbnMoY3R4LCBzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBmbWQsIGludmVyc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSAoKENvbGxlY3Rpb24pIHZhbHVlKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnZlcnNlUmVsYXRpb25zKGN0eCwgc20uZ2V0TWFuYWdlZEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRyLm5leHQoKSwgZm1kLCBpbnZlcnNlcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBpbnZlcnNlIHJlbGF0aW9ucyBmb3IgYWxsIHRoZSBnaXZlbiBpbnZlcnNlIGZpZWxkcy4KKyAgICAgKiBBIHJlbGF0aW9uIGV4aXN0cyBmcm9tIDxjb2RlPmZyb21SZWY8L2NvZGU+IHRvIDxjb2RlPnRvUmVmPC9jb2RlPjsgdGhpcworICAgICAqIG1ldGhvZCBjcmVhdGVzIHRoZSBpbnZlcnNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbnZlcnNlUmVsYXRpb25zKFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdCBmcm9tUmVmLCBPYmplY3QgdG9SZWYsIEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBGaWVsZE1ldGFEYXRhW10gaW52ZXJzZXMpIHsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBvdGhlciA9IGN0eC5nZXRTdGF0ZU1hbmFnZXIodG9SZWYpOworICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCB8fCBvdGhlci5pc0RlbGV0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBib29sZWFuIG93bmVkOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmVyc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWdldE1hbmFnZUxSUygpICYmIGludmVyc2VzW2ldLmlzTFJTKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIG93bmVkIHNpZGUgb2YgdGhlIHJlbGF0aW9uIGFuZCBoYXMgbm90IHlldCBiZWVuCisgICAgICAgICAgICAvLyBsb2FkZWQsIG5vIHBvaW50IGluIHNldHRpbmcgaXQgbm93LCBjYXVzZSBpdCdsbCBoYXZlIHRoZSBjb3JyZWN0CisgICAgICAgICAgICAvLyB2YWx1ZSB0aGUgbmV4dCB0aW1lIGl0IGlzIGxvYWRlZCBhZnRlciB0aGUgZmx1c2gKKyAgICAgICAgICAgIG93bmVkID0gZm1kID09IGludmVyc2VzW2ldLmdldE1hcHBlZEJ5TWV0YURhdGEoKQorICAgICAgICAgICAgICAgICYmIF9hY3Rpb24gPT0gQUNUSU9OX01BTkFHRQorICAgICAgICAgICAgICAgICYmICFpc0xvYWRlZChvdGhlciwgaW52ZXJzZXNbaV0uZ2V0SW5kZXgoKSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaW52ZXJzZXNbaV0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgICAgIGlmICghb3duZWQgfHwgaW52ZXJzZXNbaV0uZ2V0Q2FzY2FkZURlbGV0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlRmllbGQob3RoZXIsIGludmVyc2VzW2ldLCBOT05FLCBmcm9tUmVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvd25lZCB8fCBpbnZlcnNlc1tpXS5nZXRFbGVtZW50KCkuZ2V0Q2FzY2FkZURlbGV0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvQ29sbGVjdGlvbihvdGhlciwgaW52ZXJzZXNbaV0sIGZyb21SZWYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBmaWVsZCBpcyBsb2FkZWQgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2FkZWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IGZpZWxkKSB7CisgICAgICAgIGlmIChzbS5nZXRMb2FkZWQoKS5nZXQoZmllbGQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzbid0IGxvYWRlZCBpbiB0aGUgc3RhdGUgbWFuYWdlciwgaXQgc3RpbGwgbWlnaHQgYmUKKyAgICAgICAgLy8gbG9hZGVkIGluIHRoZSBkYXRhIGNhY2hlLCBpbiB3aGljaCBjYXNlIHdlIHN0aWxsIGhhdmUgdG8gY29ycmVjdAorICAgICAgICAvLyBpdCB0byBrZWVwIHRoZSBjYWNoZSBpbiBzeW5jCisgICAgICAgIERhdGFDYWNoZSBjYWNoZSA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RGF0YUNhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIGNhbid0IHJldHJpZXZlIGFuIGVtYmVkZGVkIG9iamVjdCBkaXJlY3RseSwgc28gYWx3YXlzIGFzc3VtZSB0aGUKKyAgICAgICAgLy8gZmllbGQgaXMgbG9hZGVkIGFuZCBuZWVkcyB0byBiZSBjb3JyZWN0ZWQKKyAgICAgICAgaWYgKHNtLmlzRW1iZWRkZWQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIFBDRGF0YSBwYyA9IGNhY2hlLmdldChzbS5nZXRPYmplY3RJZCgpKTsKKyAgICAgICAgaWYgKHBjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBwYy5pc0xvYWRlZChmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCByZWxhdGlvbnMgYmV0d2VlbiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5mbWQ8L2NvZGU+IGZvcgorICAgICAqIHRoZSBpbnN0YW5jZSBtYW5hZ2VkIGJ5IDxjb2RlPnNtPC9jb2RlPiBhbmQgaXRzIGludmVyc2VzLiBSZWxhdGlvbnMKKyAgICAgKiBzaGFyZWQgd2l0aCA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gY2FuIGJlIGxlZnQgaW50YWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFySW52ZXJzZVJlbGF0aW9ucyhPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCwgRmllbGRNZXRhRGF0YVtdIGludmVyc2VzLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGNsZWFyaW5nIHVuZmx1c2hlZCBuZXcgaW5zdGFuY2VzCisgICAgICAgIGlmIChzbS5pc05ldygpICYmICFzbS5nZXRGbHVzaGVkKCkuZ2V0KGZtZC5nZXRJbmRleCgpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKSB7CisgICAgICAgICAgICBPYmplY3QgaW5pdGlhbCA9IHNtLmZldGNoSW5pdGlhbEZpZWxkKGZtZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIGNsZWFySW52ZXJzZVJlbGF0aW9ucyhzbSwgaW5pdGlhbCwgZm1kLCBpbnZlcnNlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGluaXRpYWwgPSAoQ29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICBzbS5mZXRjaEluaXRpYWxGaWVsZChmbWQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gY2xlYXIgYWxsIHJlbGF0aW9ucyBub3QgYWxzbyBpbiB0aGUgbmV3IHZhbHVlCisgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSAoQ29sbGVjdGlvbikgbmV3VmFsdWU7CisgICAgICAgICAgICBPYmplY3QgZWxlbTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaW5pdGlhbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGVsZW0gPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjb2xsID09IG51bGwgfHwgIWNvbGwuY29udGFpbnMoZWxlbSkpCisgICAgICAgICAgICAgICAgICAgIGNsZWFySW52ZXJzZVJlbGF0aW9ucyhzbSwgZWxlbSwgZm1kLCBpbnZlcnNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbGwgaW52ZXJzZSB0aGUgcmVsYXRpb25zIGZyb20gPGNvZGU+dmFsPC9jb2RlPiB0byB0aGUgaW5zdGFuY2UKKyAgICAgKiBtYW5hZ2VkIGJ5IDxjb2RlPnNtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhckludmVyc2VSZWxhdGlvbnMoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgT2JqZWN0IHZhbCwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQsIEZpZWxkTWV0YURhdGFbXSBpbnZlcnNlcykgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgb3RoZXIgPSBzbS5nZXRDb250ZXh0KCkuZ2V0U3RhdGVNYW5hZ2VyKHZhbCk7CisgICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8IG90aGVyLmlzRGVsZXRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJvb2xlYW4gb3duZWQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52ZXJzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZ2V0TWFuYWdlTFJTKCkgJiYgaW52ZXJzZXNbaV0uaXNMUlMoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgb3duZWQgc2lkZSBvZiB0aGUgcmVsYXRpb24gYW5kIGhhcyBub3QgeWV0IGJlZW4KKyAgICAgICAgICAgIC8vIGxvYWRlZCwgbm8gcG9pbnQgaW4gc2V0dGluZyBpdCBub3csIGNhdXNlIGl0J2xsIGhhdmUgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgIC8vIHZhbHVlIHRoZSBuZXh0IHRpbWUgaXQgaXMgbG9hZGVkIGFmdGVyIHRoZSBmbHVzaAorICAgICAgICAgICAgb3duZWQgPSBmbWQgPT0gaW52ZXJzZXNbaV0uZ2V0TWFwcGVkQnlNZXRhRGF0YSgpCisgICAgICAgICAgICAgICAgJiYgX2FjdGlvbiA9PSBBQ1RJT05fTUFOQUdFCisgICAgICAgICAgICAgICAgJiYgIWlzTG9hZGVkKG90aGVyLCBpbnZlcnNlc1tpXS5nZXRJbmRleCgpKTsKKworICAgICAgICAgICAgc3dpdGNoIChpbnZlcnNlc1tpXS5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvd25lZCB8fCBpbnZlcnNlc1tpXS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9BVVRPKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVOdWxsKG90aGVyLCBpbnZlcnNlc1tpXSwgc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBpZiAoIW93bmVkIHx8IGludmVyc2VzW2ldLmdldEVsZW1lbnQoKS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9BVVRPKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRnJvbUNvbGxlY3Rpb24ob3RoZXIsIGludmVyc2VzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBudWxsIHZhbHVlIGF0IHRoZSBnaXZlbiBmaWVsZC4gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGNvbXBhcmUKKyAgICAgKiB2YWx1ZSBpcyB0aGUgdmFsdWUgYmVpbmcgbnVsbGVkLiBQYXNzIE5PTkUgZm9yIG5vIGNvbXBhcmlzb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVOdWxsKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBPYmplY3QgY29tcGFyZSkgeworICAgICAgICBzdG9yZUZpZWxkKHNtLCBmbWQsIGNvbXBhcmUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIGEgZ2l2ZW4gdmFsdWUgYXQgdGhlIGdpdmVuIGZpZWxkLiBDb21wYXJlIHRoZSBnaXZlbgorICAgICAqIGFyZ3VtZW50IGlmIG5vdCBOT05FLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlRmllbGQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmllbGRNZXRhRGF0YSBmbWQsCisgICAgICAgIE9iamVjdCBjb21wYXJlLCBPYmplY3QgdmFsKSB7CisgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IHNtLmZldGNoT2JqZWN0RmllbGQoZm1kLmdldEluZGV4KCkpOworICAgICAgICBpZiAob2xkVmFsdWUgPT0gdmFsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoY29tcGFyZSAhPSBOT05FICYmIG9sZFZhbHVlICE9IGNvbXBhcmUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc3dpdGNoIChfYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9NQU5BR0U6CisgICAgICAgICAgICAgICAgc20uc2V0dGluZ09iamVjdEZpZWxkKHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICBmbWQuZ2V0SW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUsIHZhbCwgT3BlbkpQQVN0YXRlTWFuYWdlci5TRVRfVVNFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9XQVJOOgorICAgICAgICAgICAgICAgIHdhcm5Db25zaXN0ZW5jeShzbSwgZm1kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0VYQ0VQVElPTjoKKyAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihzbSwgZm1kKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBpbnN0YW5jZSBmcm9tIHRoZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21Db2xsZWN0aW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBzbS5mZXRjaE9iamVjdEZpZWxkKGZtZC5nZXRJbmRleCgpKTsKKyAgICAgICAgaWYgKGNvbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChfYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fTUFOQUdFOgorICAgICAgICAgICAgICAgICAgICByZW1vdmU6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBjb2xsLnJlbW92ZSh2YWwpOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwICYmIGNvbGwgaW5zdGFuY2VvZiBTZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVtb3ZlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9XQVJOOgorICAgICAgICAgICAgICAgICAgICBpZiAoY29sbC5jb250YWlucyh2YWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgd2FybkNvbnNpc3RlbmN5KHNtLCBmbWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9FWENFUFRJT046CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbnRhaW5zKHZhbCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihzbSwgZm1kKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc2VsZWN0ZWQgZmllbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9Db2xsZWN0aW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBzbS5mZXRjaE9iamVjdEZpZWxkKGZtZC5nZXRJbmRleCgpKTsKKyAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCkgeworICAgICAgICAgICAgY29sbCA9IChDb2xsZWN0aW9uKSBzbS5uZXdGaWVsZFByb3h5KGZtZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIHNtLnN0b3JlT2JqZWN0RmllbGQoZm1kLmdldEluZGV4KCksIGNvbGwpOworICAgICAgICB9CisgICAgICAgIGlmICghY29sbC5jb250YWlucyh2YWwpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9NQU5BR0U6CisgICAgICAgICAgICAgICAgICAgIGNvbGwuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1dBUk46CisgICAgICAgICAgICAgICAgICAgIHdhcm5Db25zaXN0ZW5jeShzbSwgZm1kKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fRVhDRVBUSU9OOgorICAgICAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihzbSwgZm1kKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYW4gaW5jb25zaXN0ZW5jeSB3YXJuaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd2FybkNvbnNpc3RlbmN5KE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiaW52ZXJzZS1jb25zaXN0ZW5jeSIsIGZtZCwgc20uZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICBzbS5nZXRDb250ZXh0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhbiBpbmNvbnNpc3RlbmN5IGV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRocm93RXhjZXB0aW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImludmVyc2UtY29uc2lzdGVuY3kiLAorICAgICAgICAgICAgZm1kLCBzbS5nZXRJZCgpLCBzbS5nZXRDb250ZXh0KCkpKS5zZXRGYWlsZWRPYmplY3QKKyAgICAgICAgICAgIChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSkuc2V0RmF0YWwodHJ1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTG9jYWxNYW5hZ2VkUnVudGltZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTG9jYWxNYW5hZ2VkUnVudGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTA2NWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Mb2NhbE1hbmFnZWRSdW50aW1lLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5TdGF0dXM7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uU3luY2hyb25pemF0aW9uOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlN5c3RlbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1hbmFnZXI7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24ueGEuWEFSZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lZS5NYW5hZ2VkUnVudGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIFVzZXMgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRyYW5zYWN0aW9uTWFuYWdlcn0gaW50ZXJmYWNlLgorICogVGhpcyBtYW5hZ2VyIGlzIHZhbGlkIG9ubHkgZm9yIGEgc2luZ2xlIHtAbGluayBCcm9rZXJ9LgorICogSXQgZHVwbGljYXRlcyBub24tbWFuYWdlZCB0cmFuc2FjdGlvbiBjb250cm9sLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIExvY2FsTWFuYWdlZFJ1bnRpbWUKKyAgICBpbXBsZW1lbnRzIE1hbmFnZWRSdW50aW1lLCBUcmFuc2FjdGlvbk1hbmFnZXIsIFRyYW5zYWN0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKExvY2FsTWFuYWdlZFJ1bnRpbWUuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTeW5jaHJvbml6YXRpb24gX2Jyb2tlciA9IG51bGw7CisgICAgcHJpdmF0ZSBTeW5jaHJvbml6YXRpb24gX2ZhY3RvcnlTeW5jID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2FjdGl2ZSA9IGZhbHNlOworICAgIHByaXZhdGUgVGhyb3dhYmxlIF9yb2xsYmFja09ubHkgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgYnJva2VyIHRoYXQgd2lsbCBiZSByZXF1ZXN0aW5nIG1hbmFnZWQKKyAgICAgKiB0cmFuc2FjdGlvbiBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhbE1hbmFnZWRSdW50aW1lKEJyb2tlciBicm9rZXIpIHsKKyAgICAgICAgX2Jyb2tlciA9IGJyb2tlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJhbnNhY3Rpb25NYW5hZ2VyIGdldFRyYW5zYWN0aW9uTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGJlZ2luKCkgeworICAgICAgICBpZiAoX2FjdGl2ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImFjdGl2ZSIpKTsKKyAgICAgICAgX2FjdGl2ZSA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbW1pdCgpIHsKKyAgICAgICAgaWYgKCFfYWN0aXZlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWFjdGl2ZSIpKTsKKworICAgICAgICAvLyB0cnkgdG8gaW52b2tlIGJlZm9yZSBjb21wbGV0aW9uIGluIHByZXBhcmF0aW9uIGZvciBjb21taXQKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBlcnIgPSBudWxsOworICAgICAgICBpZiAoX3JvbGxiYWNrT25seSA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9icm9rZXIuYmVmb3JlQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgIGlmIChfZmFjdG9yeVN5bmMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2ZhY3RvcnlTeW5jLmJlZm9yZUNvbXBsZXRpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICBfcm9sbGJhY2tPbmx5ID0gcmU7CisgICAgICAgICAgICAgICAgZXJyID0gcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvLyBwcmV2aW91c2x5IG1hcmtlZCByb2xsYmFjayBvbmx5CisgICAgICAgICAgICBlcnIgPSBuZXcgU3RvcmVFeGNlcHRpb24oX2xvYy5nZXQoIm1hcmtlZC1yb2xsYmFjayIpKS4KKyAgICAgICAgICAgICAgICBzZXRDYXVzZShfcm9sbGJhY2tPbmx5KS5zZXRGYXRhbCh0cnVlKTsKKworICAgICAgICBpZiAoX3JvbGxiYWNrT25seSA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9icm9rZXIuYWZ0ZXJDb21wbGV0aW9uKFN0YXR1cy5TVEFUVVNfQ09NTUlUVEVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlBZnRlckNvbXBsZXRpb24oU3RhdHVzLlNUQVRVU19DT01NSVRURUQpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IG1hbmFnZWQgdG8gY29tbWl0LCByb2xsYmFjaworICAgICAgICBpZiAoX2FjdGl2ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByb2xsYmFjaygpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aHJvdyB0aGUgZmlyc3QgZXhjZXB0aW9uIHdlIGVuY291bnRlcmVkLCBpZiBhbnkKKyAgICAgICAgaWYgKGVyciAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXJyOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByb2xsYmFjaygpIHsKKyAgICAgICAgaWYgKCFfYWN0aXZlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWFjdGl2ZSIpKTsKKworICAgICAgICAvLyByb2xsYmFjayBicm9rZXIKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBlcnIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX2Jyb2tlci5hZnRlckNvbXBsZXRpb24oU3RhdHVzLlNUQVRVU19ST0xMRURCQUNLKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgZXJyID0gcmU7CisgICAgICAgIH0KKworICAgICAgICAvLyByb2xsYmFjayBzeW5jaCwgZXZlbiBpZiBicm9rZXIgdGhyb3dzIGV4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbm90aWZ5QWZ0ZXJDb21wbGV0aW9uKFN0YXR1cy5TVEFUVVNfUk9MTEVEQkFDSyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlcnIgPSByZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgZmFjdG9yeSBzeW5jIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGhhcyBlbmRlZCB3aXRoCisgICAgICogdGhlIGdpdmVuIHN0YXR1cy4gQ2xlYXJzIGFsbCB0cmFuc2FjdGlvbiBzdGF0ZSByZWdhcmRsZXNzCisgICAgICogb2YgYW55IGV4Y2VwdGlvbnMgZHVyaW5nIHRoZSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWZ0ZXJDb21wbGV0aW9uKGludCBzdGF0dXMpIHsKKyAgICAgICAgX2FjdGl2ZSA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX2ZhY3RvcnlTeW5jICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2ZhY3RvcnlTeW5jLmFmdGVyQ29tcGxldGlvbihzdGF0dXMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX3JvbGxiYWNrT25seSA9IG51bGw7CisgICAgICAgICAgICBfZmFjdG9yeVN5bmMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJvbGxiYWNrT25seSgpIHsKKyAgICAgICAgc2V0Um9sbGJhY2tPbmx5KG5ldyBVc2VyRXhjZXB0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGxiYWNrT25seShUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgX3JvbGxiYWNrT25seSA9IGNhdXNlOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9sbGJhY2tDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIF9yb2xsYmFja09ubHk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICBpZiAoX3JvbGxiYWNrT25seSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5TVEFUVVNfTUFSS0VEX1JPTExCQUNLOworICAgICAgICBpZiAoX2FjdGl2ZSkKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU1RBVFVTX0FDVElWRTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5TVEFUVVNfTk9fVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgcHVibGljIFRyYW5zYWN0aW9uIGdldFRyYW5zYWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoVHJhbnNhY3Rpb24gdG9iaikKKyAgICAgICAgdGhyb3dzIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBTeXN0ZW1FeGNlcHRpb24oTm90U3VwcG9ydGVkRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UaW1lb3V0KGludCBzZWMpCisgICAgICAgIHRocm93cyBTeXN0ZW1FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBUcmFuc2FjdGlvbiBzdXNwZW5kKCkKKyAgICAgICAgdGhyb3dzIFN5c3RlbUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBTeXN0ZW1FeGNlcHRpb24oTm90U3VwcG9ydGVkRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGVsaXN0UmVzb3VyY2UoWEFSZXNvdXJjZSB4YVJlcywgaW50IGZsYWcpCisgICAgICAgIHRocm93cyBTeXN0ZW1FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVubGlzdFJlc291cmNlKFhBUmVzb3VyY2UgeGFSZXMpCisgICAgICAgIHRocm93cyBTeXN0ZW1FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlclN5bmNocm9uaXphdGlvbihTeW5jaHJvbml6YXRpb24gc3luYykgeworICAgICAgICBpZiAoc3luYyA9PSBfYnJva2VyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoX2ZhY3RvcnlTeW5jICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgX2ZhY3RvcnlTeW5jID0gc3luYzsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0xvY2tMZXZlbHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0xvY2tMZXZlbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE4ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTG9ja0xldmVscy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBTdGFuZGFyZCBvYmplY3QgbG9jayBsZXZlbHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIExvY2tMZXZlbHMgeworCisgICAgLyoqCisgICAgICogTm8gbG9jay4gVmFsdWUgb2YgMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NLX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogR2VuZXJpYyByZWFkIGxvY2sgbGV2ZWwuIFZhbHVlIG9mIDEwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0tfUkVBRCA9IDEwOworCisgICAgLyoqCisgICAgICogR2VuZXJpYyB3cml0ZSBsb2NrIGxldmVsLiBWYWx1ZSBvZiAyMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NLX1dSSVRFID0gMjA7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Mb2NrTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTG9ja01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE4OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTG9ja01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEhhbmRsZXMgb2J0YWluaW5nIGFuZCByZWxlYXNpbmcgbG9ja3Mgb24gb2JqZWN0cy4gVGhlIGxvY2sgbWFuYWdlcgorICogZ2VuZXJhbGx5IGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc3luY2hyb25pemF0aW9uLCBhcyB0aGUgY29udGV4dCBpcworICogcmVzcG9uc2libGUgZm9yIHN5bmNocm9uaXppbmcgdGhlIGNhbGxzIGl0IG1ha2VzIHRvIHRoZSBsb2NrIG1hbmFnZXIuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGludGVyZmFjZSBMb2NrTWFuYWdlcgorICAgIGV4dGVuZHMgQ2xvc2VhYmxlLCBMb2NrTGV2ZWxzIHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dCB0aGlzIGxvY2sgbWFuYWdlciBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgICogVGhpcyB3aWxsIGJlIGludm9rZWQgaW4gdGhlIGxvY2sgbWFuYWdlciBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgYXJlCisgICAgICogY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RvcmVDb250ZXh0IGN0eCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2sgbGV2ZWwgb2YgdGhlIHNwZWNpZmllZCBpbnN0YW5jZSwgb3IKKyAgICAgKiB7QGxpbmsgTG9ja0xldmVscyNMT0NLX05PTkV9IGlmIG5vdCBsb2NrZWQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMb2NrTGV2ZWwoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSk7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYSBsb2NrIG9uIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHdoZW4KKyAgICAgKiBhIHVzZXIgZXhwbGljaXRseSBsb2NrcyBhbiBvYmplY3QsIGFuZCBpcyBhbHNvIGNhbGxlZCBhdXRvbWF0aWNhbGx5CisgICAgICogZm9yIGV2ZXJ5IG9iamVjdCBhY2Nlc3NlZCBkdXJpbmcgYSB0cmFuc2FjdGlvbi4gVGhlIGltcGxlbWVudGF0aW9uCisgICAgICogbXVzdCB0cmFjayBhbHJlYWR5LWxvY2tlZCBvYmplY3RzLCBhbmQgbXVzdCBiZSBvcHRpbWl6ZWQgdG8gcmV0dXJuCisgICAgICogcXVpY2tseSB3aGVuIHRoZSBnaXZlbiBvYmplY3QgZG9lcyBub3QgbmVlZCBhZGRpdGlvbmFsIGxvY2tpbmcuCisgICAgICogVGhlIGxvY2sgbWFuYWdlciBtaWdodCB1c2UgdGhlIHN0YXRlIG1hbmFnZXIncyBsb2NrIG9iamVjdCBmb3IKKyAgICAgKiBib29ra2VlcGluZyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzbSB0aGUgb2JqZWN0IHRvIGxvY2sKKyAgICAgKiBAcGFyYW0gbGV2ZWwgb25lIG9mIHRoZSBsb2NrIGNvbnN0YW50cyBkZWZpbmVkIGluIHtAbGluayBMb2NrTGV2ZWxzfSwKKyAgICAgKiBvciBhIGN1c3RvbSBsZXZlbAorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgYSBuZWdhdGl2ZSBudW1iZXIgZm9yCisgICAgICogbm8gdGltZW91dAorICAgICAqIEBwYXJhbSBzZGF0YSB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBwYXNzZWQgZnJvbSB0aGUgc3RvcmUgbWFuYWdlcgorICAgICAqIHRvIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LCBpZiBhbnk7IGxvY2sgbWFuYWdlcnMKKyAgICAgKiBzcGVjaWZpYyB0byBhIGNlcnRhaW4gYmFjayBlbmQgbWF5IGJlIGFibGUgdG8gdGFrZQorICAgICAqIGFkdmFudGFnZSBvZiB0aGlzOyBvdGhlcnMgc2hvdWxkIGlnbm9yZSBpdAorICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTG9ja0V4Y2VwdGlvbiBpZiBhIGxvY2sgY2Fubm90IGJlIAorICAgICAqIG9idGFpbmVkIGluIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgICAgICogQHNlZSBPcGVuSlBBU3RhdGVNYW5hZ2VyI3NldExvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2NrKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBsZXZlbCwgaW50IHRpbWVvdXQsCisgICAgICAgIE9iamVjdCBzZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBvYmplY3RzLgorICAgICAqCisgICAgICogQHNlZSAjbG9jaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvY2tBbGwoQ29sbGVjdGlvbiBzbXMsIGludCBsZXZlbCwgaW50IHRpbWVvdXQsCisgICAgICAgIE9iamVjdCBzZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBnaXZlbiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCisgICAgICogYXV0b21hdGljYWxseSBmb3IgZWFjaCBzdGF0ZSBtYW5hZ2VyIHdpdGggYSBsb2NrIG9iamVjdCBzZXQgb24KKyAgICAgKiB0cmFuc2FjdGlvbiBjb21wbGV0aW9uLCBqdXN0IGJlZm9yZSB0aGUgY2FsbCB0byB7QGxpbmsgI2VuZFRyYW5zYWN0aW9ufS4KKyAgICAgKiBUaGUgbG9jayBtYW5hZ2VyIHNob3VsZCBudWxsIHRoZSBzdGF0ZSBtYW5hZ2VyJ3MgbG9jayBvYmplY3QuIE5vdGUKKyAgICAgKiB0aGF0IHNvbWUgc3RhdGUgbWFuYWdlciBtYXkgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb247CisgICAgICogdGh1cyBsb2NrIG1hbmFnZXJzIGNhbm5vdCByZWx5IG9uIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZCBmb3IgZXZlcnkKKyAgICAgKiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHNlZSBPcGVuSlBBU3RhdGVNYW5hZ2VyI3NldExvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pOworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSB0cmFuc2FjdGlvbiBpcyBiZWdpbm5pbmcuIExvY2tzIGFyZSBvbmx5IG9idGFpbmVkCisgICAgICogd2l0aGluIHRyYW5zYWN0aW9ucywgc28gYW4gaW1wbGVtZW50YXRpb24gbWlnaHQgdXNlIHRoaXMgbWV0aG9kIHRvCisgICAgICogaW5pdGlhbGl6ZSBib29ra2VlcGluZyBkYXRhc3RydWN0dXJlcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcyBlbmRlZC4gQ2xlYXIgYWxsCisgICAgICogZGF0YXN0cnVjdHVyZXMsIHJlbGVhc2UgYW55IGxlZnQgb3ZlciBsb2NrcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFRyYW5zYWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBGcmVlIGFueSByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UgKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9NZXRob2RTdG9yZVF1ZXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9NZXRob2RTdG9yZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5YmUyZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL01ldGhvZFN0b3JlUXVlcnkuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxpbmtlZE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5MaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHF1ZXJ5IHRoYXQgaXMgZXhlY3V0ZWQgYnkgYSB1c2VyLWRlZmluZWQgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RTdG9yZVF1ZXJ5CisgICAgZXh0ZW5kcyBBYnN0cmFjdFN0b3JlUXVlcnkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR1VBR0UgPSBRdWVyeUxhbmd1YWdlcy5MQU5HX01FVEhPRFFMOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBUkdTX0RBVEFTVE9SRSA9IG5ldyBDbGFzc1tdeworICAgICAgICBTdG9yZUNvbnRleHQuY2xhc3MsIENsYXNzTWV0YURhdGEuY2xhc3MsIGJvb2xlYW4uY2xhc3MsIE1hcC5jbGFzcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uLmNsYXNzCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFSR1NfSU5NRU0gPSBuZXcgQ2xhc3NbXXsKKyAgICAgICAgU3RvcmVDb250ZXh0LmNsYXNzLCBDbGFzc01ldGFEYXRhLmNsYXNzLCBib29sZWFuLmNsYXNzLAorICAgICAgICBPYmplY3QuY2xhc3MsIE1hcC5jbGFzcywgRmV0Y2hDb25maWd1cmF0aW9uLmNsYXNzCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKX0lOREVYID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE1ldGhvZFN0b3JlUXVlcnkuY2xhc3MpOworCisgICAgcHJpdmF0ZSBMaW5rZWRNYXAgX3BhcmFtcyA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlQ29tcGlsYXRpb24oKSB7CisgICAgICAgIGlmIChfcGFyYW1zICE9IG51bGwpCisgICAgICAgICAgICBfcGFyYW1zLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIEV4ZWN1dG9yIG5ld0luTWVtb3J5RXhlY3V0b3IoQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RFeGVjdXRvcih0aGlzLCBtZXRhLCBzdWJzLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhlY3V0b3IgbmV3RGF0YVN0b3JlRXhlY3V0b3IoQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RFeGVjdXRvcih0aGlzLCBtZXRhLCBzdWJzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNJbk1lbW9yeUV4ZWN1dGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEYXRhU3RvcmVFeGVjdXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTWFwIGJpbmRQYXJhbWV0ZXJUeXBlcygpIHsKKyAgICAgICAgY3R4LmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfcGFyYW1zICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJhbXM7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1zID0gY3R4LmdldFBhcmFtZXRlckRlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1BBUkFNUzsKKworICAgICAgICAgICAgTGlzdCBkZWNzID0gRmlsdGVycy5wYXJzZURlY2xhcmF0aW9uKHBhcmFtcywgJywnLCAicGFyYW1ldGVycyIpOworICAgICAgICAgICAgaWYgKF9wYXJhbXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfcGFyYW1zID0gbmV3IExpbmtlZE1hcCgoaW50KSAoZGVjcy5zaXplKCkgLyAyICogMS4zMyArIDEpKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICAgICAgQ2xhc3MgY2xzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNzLnNpemUoKTsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IChTdHJpbmcpIGRlY3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIGNscyA9IGN0eC5jbGFzc0Zvck5hbWUobmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXBhcmFtLXR5cGUiLCBuYW1lKSk7CisgICAgICAgICAgICAgICAgX3BhcmFtcy5wdXQoZGVjcy5nZXQoaSArIDEpLCBjbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9wYXJhbXM7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdHgudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VzIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBuYW1lZCBieSB0aGUgZmlsdGVyIHN0cmluZyB0byBleGVjdXRlIHRoZQorICAgICAqIHF1ZXJ5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZEV4ZWN1dG9yCisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RFeGVjdXRvcgorICAgICAgICBpbXBsZW1lbnRzIEV4ZWN1dG9yIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzTWV0YURhdGEgX21ldGE7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfc3ViczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9pbk1lbTsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgX21ldGggPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNZXRob2RFeGVjdXRvcihNZXRob2RTdG9yZVF1ZXJ5IHEsIENsYXNzTWV0YURhdGEgY2FuZGlkYXRlLAorICAgICAgICAgICAgYm9vbGVhbiBzdWJjbGFzc2VzLCBib29sZWFuIGluTWVtKSB7CisgICAgICAgICAgICBfbWV0YSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIF9zdWJzID0gc3ViY2xhc3NlczsKKyAgICAgICAgICAgIF9pbk1lbSA9IGluTWVtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVRdWVyeShTdG9yZVF1ZXJ5IHEsCisgICAgICAgICAgICBPYmplY3RbXSBwYXJhbXMsIFJhbmdlIHJhbmdlKSB7CisgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBtYXAKKyAgICAgICAgICAgIE1hcCBwYXJhbU1hcDsKKyAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcGFyYW1NYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNYXAgcGFyYW1UeXBlcyA9IHEuZ2V0Q29udGV4dCgpLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgcGFyYW1NYXAgPSBuZXcgSGFzaE1hcCgoaW50KSAocGFyYW1zLmxlbmd0aCAqIDEuMzMgKyAxKSk7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwYXJhbVR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7IGlkeCsrKQorICAgICAgICAgICAgICAgICAgICBwYXJhbU1hcC5wdXQoaXRyLm5leHQoKSwgcGFyYW1zW2lkeF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSBxLmdldENvbnRleHQoKS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIFN0b3JlQ29udGV4dCBzY3R4ID0gcS5nZXRDb250ZXh0KCkuZ2V0U3RvcmVDb250ZXh0KCk7CisgICAgICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlciByb3A7CisgICAgICAgICAgICBPYmplY3RbXSBhcmdzOworICAgICAgICAgICAgaWYgKF9pbk1lbSkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0W117IHNjdHgsIF9tZXRhLCAoX3N1YnMpID8gQm9vbGVhbi5UUlVFCisgICAgICAgICAgICAgICAgICAgIDogQm9vbGVhbi5GQUxTRSwgbnVsbCwgcGFyYW1NYXAsIGZldGNoIH07CisKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSBudWxsOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IHEuZ2V0Q29udGV4dCgpLmdldENhbmRpZGF0ZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEV4dGVudCBleHQgPSBxLmdldENvbnRleHQoKS5nZXRRdWVyeSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FuZGlkYXRlRXh0ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGl0ciA9IGV4dC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgICAgICBMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmlzSW5zdGFuY2Uob2JqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tPQkpfSU5ERVhdID0gb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbikgaW52b2tlKHEsIGFyZ3MpKS5ib29sZWFuVmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBJbXBsSGVscGVyLmNsb3NlKGl0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvcCA9IG5ldyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIocmVzdWx0cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRhdGFzdG9yZQorICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0W117IHNjdHgsIF9tZXRhLCAoX3N1YnMpID8gQm9vbGVhbi5UUlVFCisgICAgICAgICAgICAgICAgICAgIDogQm9vbGVhbi5GQUxTRSwgcGFyYW1NYXAsIGZldGNoIH07CisgICAgICAgICAgICAgICAgcm9wID0gKFJlc3VsdE9iamVjdFByb3ZpZGVyKSBpbnZva2UocSwgYXJncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydCAhPSAwIHx8IHJhbmdlLmVuZCAhPSBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICByb3AgPSBuZXcgUmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlcihyb3AsIHJhbmdlLnN0YXJ0LHJhbmdlLmVuZCk7CisgICAgICAgICAgICByZXR1cm4gcm9wOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZSB0aGUgaW50ZXJuYWwgbWV0aG9kIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cywgcmV0dXJuaW5nIHRoZQorICAgICAgICAgKiByZXN1bHQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE9iamVjdCBpbnZva2UoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICB2YWxpZGF0ZShxKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9tZXRoLmludm9rZShudWxsLCBhcmdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm1ldGhvZC1lcnJvciIsIF9tZXRoLAorICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKEFycmF5cy5hc0xpc3QoYXJncykpKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIGlmIChfbWV0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgU3RyaW5nIG1ldGhOYW1lID0gcS5nZXRDb250ZXh0KCkuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG1ldGhOYW1lKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm8tbWV0aG9kIikpOworCisgICAgICAgICAgICBpbnQgZG90SWR4ID0gbWV0aE5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIENsYXNzIGNsczsKKyAgICAgICAgICAgIGlmIChkb3RJZHggPT0gLTEpCisgICAgICAgICAgICAgICAgY2xzID0gX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2xzID0gcS5nZXRDb250ZXh0KCkuY2xhc3NGb3JOYW1lKG1ldGhOYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0aG9kLWNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhOYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpLCBtZXRoTmFtZSkpOworICAgICAgICAgICAgICAgIG1ldGhOYW1lID0gbWV0aE5hbWUuc3Vic3RyaW5nKGRvdElkeCArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZXRob2QgbWV0aDsKKyAgICAgICAgICAgIENsYXNzW10gdHlwZXMgPSAoX2luTWVtKSA/IEFSR1NfSU5NRU0gOiBBUkdTX0RBVEFTVE9SRTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aCA9IGNscy5nZXRNZXRob2QobWV0aE5hbWUsIHR5cGVzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IChfaW5NZW0pID8gImJhZC1pbm1lbS1tZXRob2QiCisgICAgICAgICAgICAgICAgICAgIDogImJhZC1kYXRhc3RvcmUtbWV0aG9kIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldChtc2csIG1ldGhOYW1lLCBjbHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMobWV0aC5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm1ldGhvZC1ub3Qtc3RhdGljIiwgbWV0aCkpOworICAgICAgICAgICAgX21ldGggPSBtZXRoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpbmtlZE1hcCBnZXRQYXJhbWV0ZXJUeXBlcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1ldGhvZFN0b3JlUXVlcnkpIHEpLmJpbmRQYXJhbWV0ZXJUeXBlcygpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTm9uZUxvY2tNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ob25lTG9ja01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWViNzdkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTm9uZUxvY2tNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIEEgbG9jayBtYW5hZ2VyIHRoYXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgbG9ja2luZy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgTm9uZUxvY2tNYW5hZ2VyCisgICAgZXh0ZW5kcyBBYnN0cmFjdExvY2tNYW5hZ2VyIHsKKworICAgIHB1YmxpYyB2b2lkIGxvY2soT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IGxldmVsLCBpbnQgdGltZW91dCwKKyAgICAgICAgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgc20uc2V0TG9jayhCb29sZWFuLlRSVUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBzbS5zZXRMb2NrKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TG9ja0xldmVsKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIExPQ0tfTk9ORTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9PYmplY3RJZFN0YXRlTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvT2JqZWN0SWRTdGF0ZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjJkMjkzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvT2JqZWN0SWRTdGF0ZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDczMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5TdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUmVmbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuR2VuZXJhbEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBTdGF0ZSBtYW5hZ2VyIHVzZWQgdG8gYWNjZXNzIHN0YXRlIG9mIGVtYmVkZGVkIG9iamVjdCBpZCBwcmltYXJ5IGtleSBmaWVsZHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE9iamVjdElkU3RhdGVNYW5hZ2VyCisgICAgaW1wbGVtZW50cyBPcGVuSlBBU3RhdGVNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGUgWkVST19CWVRFID0gbmV3IEJ5dGUoKGJ5dGUpIDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJhY3RlciBaRVJPX0NIQVIgPSBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEb3VibGUgWkVST19ET1VCTEUgPSBuZXcgRG91YmxlKDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZsb2F0IFpFUk9fRkxPQVQgPSBuZXcgRmxvYXQoMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2hvcnQgWkVST19TSE9SVCA9IG5ldyBTaG9ydCgoc2hvcnQpIDApOworCisgICAgcHJpdmF0ZSBPYmplY3QgX29pZDsKKyAgICBwcml2YXRlIGZpbmFsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgX293bmVyOworICAgIHByaXZhdGUgZmluYWwgVmFsdWVNZXRhRGF0YSBfdm1kOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBlbWJlZGRlZCBvYmplY3QgaWQgYW5kIGl0cyBvd25lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciBtYXkgYmUgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RJZFN0YXRlTWFuYWdlcihPYmplY3Qgb2lkLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIG93bmVyLAorICAgICAgICBWYWx1ZU1ldGFEYXRhIG93bmVyVmFsKSB7CisgICAgICAgIF9vaWQgPSBvaWQ7CisgICAgICAgIF9vd25lciA9IG93bmVyOworICAgICAgICBfdm1kID0gb3duZXJWYWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRHZW5lcmljQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIChfb3duZXIgPT0gbnVsbCkgPyBudWxsIDogX293bmVyLmdldEdlbmVyaWNDb250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQQ1ByaW1hcnlLZXkoT2JqZWN0IG9pZCwgaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZU1hbmFnZXIgcmVwbGFjZVN0YXRlTWFuYWdlcihTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvblVwZGF0ZVJlcXVpcmVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpcnR5KFN0cmluZyBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoT2JqZWN0SWQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2Vzc2luZ0ZpZWxkKGludCBpZHgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VyaWFsaXppbmcoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdyaXRlRGV0YWNoZWQoT2JqZWN0T3V0cHV0IG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJveHlEZXRhY2hlZERlc2VyaWFsaXplZChpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdCb29sZWFuRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LAorICAgICAgICBib29sZWFuIGN1ciwgYm9vbGVhbiBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdDaGFyRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBjaGFyIGN1ciwKKyAgICAgICAgY2hhciBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBieXRlIGN1ciwKKyAgICAgICAgYnl0ZSBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdTaG9ydEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgc2hvcnQgY3VyLAorICAgICAgICBzaG9ydCBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdJbnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGludCBjdXIsCisgICAgICAgIGludCBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBsb25nIGN1ciwKKyAgICAgICAgbG9uZyBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdGbG9hdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgZmxvYXQgY3VyLAorICAgICAgICBmbG9hdCBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdEb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGRvdWJsZSBjdXIsCisgICAgICAgIGRvdWJsZSBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIFN0cmluZyBjdXIsCisgICAgICAgIFN0cmluZyBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdPYmplY3RGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIE9iamVjdCBjdXIsCisgICAgICAgIE9iamVjdCBuZXh0LCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgYm9vbGVhbiBjdXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRDaGFyRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4LCBjaGFyIGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEJ5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGJ5dGUgY3VyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIHNob3J0IGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwgaW50IGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZExvbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGxvbmcgY3VyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgsIGZsb2F0IGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZERvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgZG91YmxlIGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZFN0cmluZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgU3RyaW5nIGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZE9iamVjdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCwKKyAgICAgICAgT2JqZWN0IGN1cikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciByZXBsYWNlQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSByZXBsYWNlQnl0ZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgcmVwbGFjZVNob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVwbGFjZUludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyByZXBsYWNlTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgcmVwbGFjZUZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgcmVwbGFjZURvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGlkeCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2VTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpZHgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZXBsYWNlT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaWR4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gT3BlbkpQQVN0YXRlTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzIGZvclR5cGUsIFBDU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRNYW5hZ2VkSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBfb2lkOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzaXN0ZW5jZUNhcGFibGUgZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCkgeworICAgICAgICByZXR1cm4gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgX29pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF92bWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gX293bmVyOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZU1ldGFEYXRhIGdldE93bmVyTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfdm1kOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmx1c2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmx1c2hlZERpcnR5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aXNpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0TG9hZGVkKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IGdldERpcnR5KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IGdldEZsdXNoZWQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0VW5sb2FkZWQoRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3UHJveHkoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV3RmllbGRQcm94eShpbnQgZmllbGQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VmFsdWUoaW50IGZpZWxkKSB7CisgICAgICAgIE9iamVjdCB2YWwgPSBnZXRWYWx1ZShmaWVsZCk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gZ2V0TWV0YURhdGEoKS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRS5lcXVhbHModmFsKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoQ2hhcmFjdGVyKSB2YWwpLmNoYXJWYWx1ZSgpID09IDA7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSB2YWwpLmludFZhbHVlKCkgPT0gMDsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIuZXF1YWxzKHZhbCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIChfb3duZXIgPT0gbnVsbCkgPyBudWxsIDogX293bmVyLmdldENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUENTdGF0ZSBnZXRQQ1N0YXRlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdElkKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChPYmplY3Qgb2lkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFzc2lnbk9iamVjdElkKGJvb2xlYW4gZmx1c2gpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRMb2NrKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrKE9iamVjdCBsb2NrKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5leHRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW1wbERhdGEoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3Qgc2V0SW1wbERhdGEoT2JqZWN0IGRhdGEsIGJvb2xlYW4gY2FjaGVhYmxlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEltcGxEYXRhKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHNldEltcGxEYXRhKGludCBmaWVsZCwgT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbXBsRGF0YUNhY2hlYWJsZShpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW50ZXJtZWRpYXRlKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcm1lZGlhdGUoaW50IGZpZWxkLCBPYmplY3QgZGF0YSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVkKGludCBmaWVsZCwgT2JqZWN0IHJlbW92ZWQsIGJvb2xlYW4ga2V5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVJlZnJlc2goYm9vbGVhbiBhbGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlydHkoaW50IGZpZWxkKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbihpbnQgZmllbGQsIGJvb2xlYW4gZXh0VmFsKSB7CisgICAgICAgIHNldFZhbHVlKGZpZWxkLCAoZXh0VmFsKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQnl0ZShpbnQgZmllbGQsIGJ5dGUgZXh0VmFsKSB7CisgICAgICAgIHNldFZhbHVlKGZpZWxkLCBuZXcgQnl0ZShleHRWYWwpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoYXIoaW50IGZpZWxkLCBjaGFyIGV4dFZhbCkgeworICAgICAgICBzZXRWYWx1ZShmaWVsZCwgbmV3IENoYXJhY3RlcihleHRWYWwpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUludChpbnQgZmllbGQsIGludCBleHRWYWwpIHsKKyAgICAgICAgc2V0VmFsdWUoZmllbGQsIE51bWJlcnMudmFsdWVPZihleHRWYWwpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVNob3J0KGludCBmaWVsZCwgc2hvcnQgZXh0VmFsKSB7CisgICAgICAgIHNldFZhbHVlKGZpZWxkLCBuZXcgU2hvcnQoZXh0VmFsKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVMb25nKGludCBmaWVsZCwgbG9uZyBleHRWYWwpIHsKKyAgICAgICAgc2V0VmFsdWUoZmllbGQsIE51bWJlcnMudmFsdWVPZihleHRWYWwpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZsb2F0KGludCBmaWVsZCwgZmxvYXQgZXh0VmFsKSB7CisgICAgICAgIHNldFZhbHVlKGZpZWxkLCBuZXcgRmxvYXQoZXh0VmFsKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVEb3VibGUoaW50IGZpZWxkLCBkb3VibGUgZXh0VmFsKSB7CisgICAgICAgIHNldFZhbHVlKGZpZWxkLCBuZXcgRG91YmxlKGV4dFZhbCksIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU3RyaW5nKGludCBmaWVsZCwgU3RyaW5nIGV4dFZhbCkgeworICAgICAgICBzZXRWYWx1ZShmaWVsZCwgZXh0VmFsLCBleHRWYWwgIT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVPYmplY3QoaW50IGZpZWxkLCBPYmplY3QgZXh0VmFsKSB7CisgICAgICAgIHNldFZhbHVlKGZpZWxkLCBleHRWYWwsIGV4dFZhbCAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZShpbnQgZmllbGQsIE9iamVjdCBleHRWYWwpIHsKKyAgICAgICAgYm9vbGVhbiBmb3JjZUluc3QgPSB0cnVlOworICAgICAgICBpZiAoZXh0VmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIGV4dFZhbCA9IGdldERlZmF1bHRWYWx1ZShmaWVsZCk7CisgICAgICAgICAgICBmb3JjZUluc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzZXRWYWx1ZShmaWVsZCwgZXh0VmFsLCBmb3JjZUluc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbkZpZWxkKGludCBmaWVsZCwgYm9vbGVhbiBleHRWYWwpIHsKKyAgICAgICAgc3RvcmVCb29sZWFuKGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQnl0ZUZpZWxkKGludCBmaWVsZCwgYnl0ZSBleHRWYWwpIHsKKyAgICAgICAgc3RvcmVCeXRlKGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hhckZpZWxkKGludCBmaWVsZCwgY2hhciBleHRWYWwpIHsKKyAgICAgICAgc3RvcmVDaGFyKGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlSW50RmllbGQoaW50IGZpZWxkLCBpbnQgZXh0VmFsKSB7CisgICAgICAgIHN0b3JlSW50KGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU2hvcnRGaWVsZChpbnQgZmllbGQsIHNob3J0IGV4dFZhbCkgeworICAgICAgICBzdG9yZVNob3J0KGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlTG9uZ0ZpZWxkKGludCBmaWVsZCwgbG9uZyBleHRWYWwpIHsKKyAgICAgICAgc3RvcmVMb25nKGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXRGaWVsZChpbnQgZmllbGQsIGZsb2F0IGV4dFZhbCkgeworICAgICAgICBzdG9yZUZsb2F0KGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRG91YmxlRmllbGQoaW50IGZpZWxkLCBkb3VibGUgZXh0VmFsKSB7CisgICAgICAgIHN0b3JlRG91YmxlKGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU3RyaW5nRmllbGQoaW50IGZpZWxkLCBTdHJpbmcgZXh0VmFsKSB7CisgICAgICAgIHN0b3JlU3RyaW5nKGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlT2JqZWN0RmllbGQoaW50IGZpZWxkLCBPYmplY3QgZXh0VmFsKSB7CisgICAgICAgIHN0b3JlT2JqZWN0KGZpZWxkLCBleHRWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmllbGQoaW50IGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3RvcmUoZmllbGQsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBmZXRjaEJvb2xlYW4oaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGdldFZhbHVlKGZpZWxkKSkuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZmV0Y2hCeXRlKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gKChOdW1iZXIpIGdldFZhbHVlKGZpZWxkKSkuYnl0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgZmV0Y2hDaGFyKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gKChDaGFyYWN0ZXIpIGdldFZhbHVlKGZpZWxkKSkuY2hhclZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGZldGNoU2hvcnQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAoKE51bWJlcikgZ2V0VmFsdWUoZmllbGQpKS5zaG9ydFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBmZXRjaEludChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBnZXRWYWx1ZShmaWVsZCkpLmludFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZmV0Y2hMb25nKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gKChOdW1iZXIpIGdldFZhbHVlKGZpZWxkKSkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGZldGNoRmxvYXQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAoKE51bWJlcikgZ2V0VmFsdWUoZmllbGQpKS5mbG9hdFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBmZXRjaERvdWJsZShpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBnZXRWYWx1ZShmaWVsZCkpLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBmZXRjaFN0cmluZyhpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldFZhbHVlKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoT2JqZWN0KGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2goaW50IGZpZWxkKSB7CisgICAgICAgIE9iamVjdCByZXQgPSBnZXRWYWx1ZShmaWVsZCk7CisgICAgICAgIGlmIChyZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldCA9IGdldERlZmF1bHRWYWx1ZShmaWVsZCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZmV0Y2hCb29sZWFuRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBmZXRjaEJvb2xlYW4oZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGZldGNoQnl0ZUZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gZmV0Y2hCeXRlKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBmZXRjaENoYXJGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoQ2hhcihmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGZldGNoU2hvcnRGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoU2hvcnQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnRGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoSW50KGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBmZXRjaExvbmdGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoTG9uZyhmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGZldGNoRmxvYXRGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoRmxvYXQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoRG91YmxlKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGZldGNoU3RyaW5nRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBmZXRjaFN0cmluZyhmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gZmV0Y2goZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hGaWVsZChpbnQgZmllbGQsIGJvb2xlYW4gdHJhbnNpdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIGZldGNoKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoSW5pdGlhbEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGUoaW50IGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3RvcmUoZmllbGQsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVubG9jaygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkIGJhc2VkIG9uIGl0cyB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShpbnQgZmllbGQpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBnZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gWkVST19CWVRFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gWkVST19DSEFSOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBaRVJPX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBaRVJPX0ZMT0FUOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoMCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoMEwpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFpFUk9fU0hPUlQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgdXNpbmcgcmVmbGVjdGlvbi4KKyAgICAgKiBSZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBhbGwgb2lkIGZpZWxkcy9wcm9wZXJ0aWVzIGFyZSBtYWRlIHB1YmxpYworICAgICAqIGR1cmluZyBlbmhhbmNlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZShpbnQgZmllbGQpIHsKKyAgICAgICAgaWYgKF9vaWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gZ2V0TWV0YURhdGEoKS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQuZ2V0QmFja2luZ01lbWJlcigpIGluc3RhbmNlb2YgRmllbGQpCisgICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbi5nZXQoX29pZCwgKEZpZWxkKSBmbWQuZ2V0QmFja2luZ01lbWJlcigpKTsKKyAgICAgICAgaWYgKGZtZC5nZXRCYWNraW5nTWVtYmVyKCkgaW5zdGFuY2VvZiBNZXRob2QpCisgICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbi5nZXQoX29pZCwgKE1ldGhvZCkgZm1kLmdldEJhY2tpbmdNZW1iZXIoKSk7CisKKyAgICAgICAgaWYgKGZtZC5nZXREZWZpbmluZ01ldGFEYXRhKCkuZ2V0QWNjZXNzVHlwZSgpCisgICAgICAgICAgICA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCkKKyAgICAgICAgICAgIHJldHVybiBSZWZsZWN0aW9uLmdldChfb2lkLCBSZWZsZWN0aW9uLmZpbmRGaWVsZChfb2lkLmdldENsYXNzKCksIAorICAgICAgICAgICAgICAgIGZtZC5nZXROYW1lKCksIHRydWUpKTsKKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0KF9vaWQsIFJlZmxlY3Rpb24uZmluZEdldHRlcihfb2lkLmdldENsYXNzKCksCisgICAgICAgICAgICBmbWQuZ2V0TmFtZSgpLCB0cnVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgdXNpbmcgcmVmbGVjdGlvbi4KKyAgICAgKiBSZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBhbGwgb2lkIGZpZWxkcy9wcm9wZXJ0aWVzIGFyZSBtYWRlIHB1YmxpYworICAgICAqIGR1cmluZyBlbmhhbmNlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWUoaW50IGZpZWxkLCBPYmplY3QgdmFsLCBib29sZWFuIGZvcmNlSW5zdCkgeworICAgICAgICBpZiAoX29pZCA9PSBudWxsICYmIGZvcmNlSW5zdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfb2lkID0gZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoX29pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gZ2V0TWV0YURhdGEoKS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQuZ2V0QmFja2luZ01lbWJlcigpIGluc3RhbmNlb2YgRmllbGQpCisgICAgICAgICAgICBSZWZsZWN0aW9uLnNldChfb2lkLCAoRmllbGQpIGZtZC5nZXRCYWNraW5nTWVtYmVyKCksIHZhbCk7CisgICAgICAgIGVsc2UgaWYgKGZtZC5nZXREZWZpbmluZ01ldGFEYXRhKCkuZ2V0QWNjZXNzVHlwZSgpCisgICAgICAgICAgICA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCkgeworICAgICAgICAgICAgUmVmbGVjdGlvbi5zZXQoX29pZCwgUmVmbGVjdGlvbi5maW5kRmllbGQoX29pZC5nZXRDbGFzcygpLCAKKyAgICAgICAgICAgICAgICBmbWQuZ2V0TmFtZSgpLCB0cnVlKSwgdmFsKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBSZWZsZWN0aW9uLnNldChfb2lkLCBSZWZsZWN0aW9uLmZpbmRTZXR0ZXIoX29pZC5nZXRDbGFzcygpLAorICAgICAgICAgICAgICAgIGZtZC5nZXROYW1lKCksIGZtZC5nZXREZWNsYXJlZFR5cGUoKSwgdHJ1ZSksIHZhbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvT3BDYWxsYmFja3MuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL09wQ2FsbGJhY2tzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmY2FmZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL09wQ2FsbGJhY2tzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIEFsbG93cyBmYWNhZGVzIHRvIGNvbnRyb2wgdGhlIHBhcnRpY3VsYXJzIG9mIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMKKyAqIHRocm91Z2ggY2FsbGJhY2tzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3BDYWxsYmFja3MgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUEVSU0lTVCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfREVMRVRFID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9SRUZSRVNIID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9SRVRSSUVWRSA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVMRUFTRSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRVZJQ1QgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FUVEFDSCA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfREVUQUNIID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9OT05UUkFOU0FDVElPTkFMID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9UUkFOU0FDVElPTkFMID0gOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9MT0NLID0gMTA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RfTk9ORSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUX0NBU0NBREUgPSAyIDw8IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUX1JVTiA9IDIgPDwgMTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3Mgb3BlcmF0aW9uIGFyZ3VtZW50LiBUaHJvdyBwcm9wZXIgCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wZW5KUEFFeGNlcHRpb259IGZvciBpbGxlZ2FsIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG9wIHRoZSBvcGVyYXRpb24gY29uc3RhbnQKKyAgICAgKiBAcGFyYW0gYXJnIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSBvcGVyYXRpb24KKyAgICAgKiBAcGFyYW0gc20gdGhlIGFyZ3VtZW50J3Mgc3RhdGUgbWFuYWdlciwgb3IgbnVsbCBpZiBub25lCisgICAgICogQHJldHVybiB0aGUgYWN0aW9uIHRvIHRha2Ugb24gdGhlIGFyZ3VtZW50CisgICAgICovCisgICAgcHVibGljIGludCBwcm9jZXNzQXJndW1lbnQoaW50IG9wLCBPYmplY3QgYXJnLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL09wZW5KUEFTYXZlcG9pbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL09wZW5KUEFTYXZlcG9pbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzY1OTRiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvT3BlbkpQQVNhdmVwb2ludC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2F2ZXBvaW50IHdoZXJlIG9wZXJhdGlvbnMgYWZ0ZXJ3YXJkcyBjYW4gYmUgcm9sbGVkCisgKiBiYWNrIGFuZCByZXN0b3JlZCB0byB0aGlzIHBvaW50CisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqIEBzaW5jZSAwLjMuNAorICovCitwdWJsaWMgY2xhc3MgT3BlbkpQQVNhdmVwb2ludCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEJyb2tlciBfYnJva2VyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfY29weTsKKworICAgIC8vIDxTdGF0ZU1hbmFnZXJJbXBsLCBTYXZlcG9pbnRGaWVsZE1hbmFnZXI+CisgICAgcHJpdmF0ZSBNYXAgX3NhdmVkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIEluZGljYXRlIHdoZXRoZXIgdG8gY29weSBmaWVsZCBkYXRhIGludG8gbWVtb3J5LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBU2F2ZXBvaW50KEJyb2tlciBicm9rZXIsIFN0cmluZyBuYW1lLCBib29sZWFuIGNvcHkpIHsKKyAgICAgICAgX2Jyb2tlciA9IGJyb2tlcjsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgICAgICBfY29weSA9IGNvcHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBCcm9rZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2F2ZXBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXIgZ2V0QnJva2VyKCkgeworICAgICAgICByZXR1cm4gX2Jyb2tlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgc2F2ZXBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBzYXZlcG9pbnQgY29waWVzIHRoZSBmaWVsZCB2YWx1ZXMgb2YgcmV0YWluZWQgaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENvcHlGaWVsZFN0YXRlKCkgeworICAgICAgICByZXR1cm4gX2NvcHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXAgb2Ygc3RhdGVzIHRvIHNhdmVwb2ludCBkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgZ2V0U3RhdGVzKCkgeworICAgICAgICByZXR1cm4gX3NhdmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHNhdmVwb2ludCwgc2F2aW5nIGFueSBzdGF0ZSBmb3IgdGhlIHBhc3NlZC1pbgorICAgICAqIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfXMgYXMgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29sbGVjdGlvbiBzdGF0ZXMpIHsKKyAgICAgICAgaWYgKF9zYXZlZCAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIF9zYXZlZCA9IG5ldyBIYXNoTWFwKChpbnQpIChzdGF0ZXMuc2l6ZSgpICogMS4zMyArIDEpKTsKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3RhdGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgc20gPSAoU3RhdGVNYW5hZ2VySW1wbCkgaS5uZXh0KCk7CisgICAgICAgICAgICBfc2F2ZWQucHV0KHNtLCBuZXcgU2F2ZXBvaW50RmllbGRNYW5hZ2VyKHNtLCBfY29weSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGlzIHNhdmVwb2ludCBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLiBSZWxlYXNlcworICAgICAqIHdpbGwgaGFwcGVuIGluIHJldmVyc2Ugb3JkZXIgb2YgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBpZiB0cnVlLCB1c2VyIGluaXRpYXRlZCwgb3RoZXJ3aXNlIGEgc2lkZSBlZmZlY3Qgb2YKKyAgICAgKiBhbm90aGVyIHNhdmVwb2ludCdzIHJlbGVhc2Uvcm9sbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGJvb2xlYW4gdXNlcikgeworICAgICAgICBfc2F2ZWQgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSB0aGUgcm9sbGVkIGJhY2sgc3RhdGUsIHJldHVybmluZyBzYXZlZCBkYXRhLgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHJldHVybiB0aGUgY29sbGVjdGlvbiByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHByZXZpb3VzIHByZXZpb3VzIHNhdmVwb2ludHMgc2V0IGluIHRoZSB0cmFuc2FjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHJvbGxiYWNrKENvbGxlY3Rpb24gcHJldmlvdXMpIHsKKyAgICAgICAgTWFwIHNhdmVkOworICAgICAgICBpZiAocHJldmlvdXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgc2F2ZWQgPSBfc2F2ZWQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNoYW5nZXMgaW50byBvbmUgY29sbGVjdGlvbiwgYWxsb3dpbmcgZm9yIGxhdGVyCisgICAgICAgICAgICAvLyBTYXZlcG9pbnRGaWVsZE1hbmFnZXJzIHRvIHJlcGxhY2UgcHJldmlvdXMgb25lcy4KKyAgICAgICAgICAgIHNhdmVkID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByZXZpb3VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICBzYXZlZC5wdXRBbGwoKChPcGVuSlBBU2F2ZXBvaW50KSBpLm5leHQoKSkuZ2V0U3RhdGVzKCkpOworICAgICAgICAgICAgc2F2ZWQucHV0QWxsKF9zYXZlZCk7CisgICAgICAgIH0KKyAgICAgICAgX3NhdmVkID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHNhdmVkLnZhbHVlcyAoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9PcGVuSlBBU3RhdGVNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9PcGVuSlBBU3RhdGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxYjFjYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL09wZW5KUEFTdGF0ZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkZpZWxkTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5OworCisvKioKKyAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBPcGVuSlBBIHN0YXRlIG1hbmFnZXJzLiBFYWNoIHN0YXRlIG1hbmFnZXIKKyAqIG1hbmFnZXMgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIHBlcnNpc3RlbmNlIGNhcGFibGUgaW5zdGFuY2UuIFRoZQorICogc3RhdGUgbWFuYWdlciBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBhbGwgY29tbXVuaWNhdGlvbnMgYWJvdXQgdGhlCisgKiBpbnN0YW5jZSB0byB0aGUge0BsaW5rIFN0b3JlTWFuYWdlcn0uCisgKiAgVGhlIDxjb2RlPmZldGNoWFhYRmllbGQ8L2NvZGU+IGFuZCA8Y29kZT5zdG9yZVhYWEZpZWxkPC9jb2RlPgorICogbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBnZXQgYW5kIHNldCBmaWVsZHMgb2YgdGhlIG1hbmFnZWQgcGVyc2lzdGVudCBvYmplY3QuCisgKiBNb3N0IGJhY2stZW5kIGNvZGUsIGhvd2V2ZXIsIHNob3VsZCB1c2UgdGhlIHNpbWlsYXIKKyAqIDxjb2RlPmZldGNoWFhYPC9jb2RlPiBhbmQgPGNvZGU+c3RvcmVYWFg8L2NvZGU+IG1ldGhvZHMgaW4gcGxhY2Ugb2YKKyAqIHRoZSBmaWVsZCBtZXRob2RzLiBUaGVzZSBtZXRob2RzIGZ1bmN0aW9uIGp1c3QgbGlrZSB0aGUgZmllbGQgbWV0aG9kcywgYnV0CisgKiBhbHNvIHBhc3MgdGhlIHZhbHVlIHRocm91Z2ggdGhlIGV4dGVybmFsaXplciBhbmQgZmFjdG9yeSB0aGUgZmllbGQgbWF5IGhhdmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBPcGVuSlBBU3RhdGVNYW5hZ2VyCisgICAgZXh0ZW5kcyBTdGF0ZU1hbmFnZXIsIEZpZWxkTWFuYWdlciB7CisKKyAgICAvKioKKyAgICAgKiBBIHVzZXIgaXMgc2V0dGluZyB0aGUgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1VTRVIgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHJlbW90ZSBicm9rZXIgZnJhbWV3b3JrIGlzIHNldHRpbmcgdGhlIGZpZWxkIG9uIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1JFTU9URSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGQgaXMgYmVpbmcgYXR0YWNoZWQgYnkgYSBkZXRhY2hlZCBzdGF0ZSBtYW5hZ2VyOyB0aGUgdmFsdWUgaXMKKyAgICAgKiBmcm9tIHRoZSBkZXRhY2hlZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVRfQVRUQUNIID0gMjsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hbmFnZXIgd2l0aCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4KKyAgICAgKiBwZXJzaXN0ZW5jZSBjYXBhYmxlIHR5cGUgYW5kIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlLgorICAgICAqIEludm9raW5nIHRoaXMgbWV0aG9kIG1heSBjaGFuZ2UgdGhlIG9iamVjdCBpZCBhbmQgbWV0YWRhdGEgZm9yIHRoZQorICAgICAqIHN0YXRlIG1hbmFnZXIsIGFzIHRoZSBjb25jcmV0ZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVyIG1heSBiZQorICAgICAqIGEgc3ViY2xhc3Mgb2YgdGhlIGV4cGVjdGVkIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yVHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBpbml0aWFsIHN0YXRlIHRvIHdoaWNoIHRvIHNldCB0aGUgaW5zdGFuY2UKKyAgICAgKiBAc2luY2UgMC4zLjEuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ2xhc3MgZm9yVHlwZSwgUENTdGF0ZSBzdGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGZldGNoIGdyb3VwIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hbmFnZWQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRNYW5hZ2VkSW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFBlcnNpc3RlbmNlQ2FwYWJsZX0gaW5zdGFuY2UgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8KKyAgICAgKiB0aGUgaW5zdGFuY2UgbWFuYWdlZCBieSB0aGlzIHN0YXRlIG1hbmFnZXIuIE1heSBiZSBhIHByb3h5IGFyb3VuZAorICAgICAqIHRoZSBhY3R1YWwgbWFuYWdlZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VDYXBhYmxlIGdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvd25pbmcgc3RhdGUgaWYgdGhpcyBpcyBhbiBlbWJlZGRlZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRPd25lcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvd25pbmcgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlTWV0YURhdGEgZ2V0T3duZXJNZXRhRGF0YSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBoYXMgYW4gb3duZXIsIG1lYW5pbmcgaXQgaXMgYW4gZW1iZWRkZWQKKyAgICAgKiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIG9iamVjdCBoYXMgYmVlbiBmbHVzaGVkIHRvIHRoZSBkYXRhc3RvcmUgaW4gdGhpcworICAgICAqIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmx1c2hlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBvYmplY3QgaGFzIGJlZW4gZmx1c2hlZCwgdGhlbiBkaXJ0aWVkIGFnYWluLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmx1c2hlZERpcnR5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIG9iamVjdCBpcyBwcm92aXNpb25hbGx5IHBlcnNpc3RlbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aXNpb25hbCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVhZC1vbmx5IG1hc2sgb2YgdGhlIGluZGV4ZXMgb2YgYWxsIGxvYWRlZCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIEJpdFNldCBnZXRMb2FkZWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJlYWQtb25seSBtYXNrIG9mIHRoZSBpbmRleGVzIG9mIGFsbCBkaXJ0eSBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIEJpdFNldCBnZXREaXJ0eSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVhZC1vbmx5IG1hc2sgb2YgdGhlIGluZGV4ZXMgb2YgYWxsIGZpZWxkcyB0aGF0IGhhdmUgYmVlbgorICAgICAqIGZsdXNoZWQgc2luY2UgdGhleSB3ZXJlIGxhc3QgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQml0U2V0IGdldEZsdXNoZWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG11dGFibGUgbWFzayBvZiB0aGUgdW5sb2FkZWQgZmllbGRzIHRoYXQgbmVlZCBsb2FkaW5nIGJhc2VkCisgICAgICogb24gdGhlIGdpdmVuIGZldGNoIGNvbmZpZ3VyYXRpb24uIFBhc3MgaW4gbnVsbCB0byByZXRyaWV2ZSBhbGwKKyAgICAgKiB1bmxvYWRlZCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIEJpdFNldCBnZXRVbmxvYWRlZChGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGhvbGxvdyBwcm94eSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGZpZWxkLiBJbiBjYXNlcyB3aGVyZQorICAgICAqIHRoZSBmaWVsZCBleHRlcm5hbGl6ZXMgdG8gYW4gU0NPIGJ1dCBpcyBkZWNsYXJlZCBzb21ldGhpbmcgZWxzZSwgdGhlCisgICAgICogcmV0dXJuZWQgb2JqZWN0IG1heSBub3QgaW1wbGVtZW50IHtAbGluayBQcm94eX0uIEluIGFsbCBvdGhlciBjYXNlcywKKyAgICAgKiB0aGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIHN5c3RlbSAKKyAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHlNYW5hZ2VyfQorICAgICAqIHdpdGggdGhlIGNvcnJlY3QgZmllbGQgaW5mb3JtYXRpb24uIFRoZSByZXR1cm5lZCBwcm94eSdzIG93bmVyIGlzCisgICAgICogdW5zZXQgc28gdGhhdCBtb2RpZmljYXRpb25zIHRvIHRoZSBwcm94eSB3aWxsIG5vdCBiZSB0cmFja2VkIHdoaWxlIGl0cworICAgICAqIHN0YXRlIGlzIGluaXRpYWxpemVkLiBDYWxsaW5nIHtAbGluayAjc3RvcmVGaWVsZH0gb3Ige0BsaW5rICNzdG9yZX0KKyAgICAgKiB3aWxsIHNldCB0aGUgcHJveHkncyBvd25lciBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV3UHJveHkoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBob2xsb3cgcHJveHkgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBmaWVsZC4gVGhpcyBtZXRob2QKKyAgICAgKiBkaWZmZXJzIGZyb20ge0BsaW5rICNuZXdQcm94eX0gaW4gdGhhdCBpdCByZXR1cm5zIGEgcHJveHkgZm9yIHRoZQorICAgICAqIGZpZWxkJ3MgZGVjbGFyZWQgdHlwZSwgbm90IGl0cyBleHRlcm5hbGl6ZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBzZWUgI25ld1Byb3h5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXdGaWVsZFByb3h5KGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmllbGQgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZShpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYW5hZ2luZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0Q29udGV4dCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGluLgorICAgICAqLworICAgIHB1YmxpYyBQQ1N0YXRlIGdldFBDU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaWRlbnRpZmllciBmb3IgdGhpcyBzdGF0ZSBtYW5hZ2VyLiBUaGlzIG1heSByZXR1cm4gYQorICAgICAqIHRlbXBvcmFyeSBpZGVudGlmaWVyIGZvciBuZXcgdW5mbHVzaGVkIGluc3RhbmNlcyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgICAgKiBhc3NpZ25lZCBhbiBvYmplY3QgaWQsIG9yIGZvciBub24tcGVyc2lzdGVudCBvciBlbWJlZGRlZCBpbnN0YW5jZXMuCisgICAgICogRm9yIGFsbCBvdGhlciBpbnN0YW5jZXMgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMge0BsaW5rICNnZXRPYmplY3RJZH0uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRJZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbnN0YW5jZSdzIG9iamVjdCBpZC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiBubworICAgICAqIG9pZCBoYXMgYmVlbiBhc3NpZ25lZC4gT2lkcyBhcmUgYXNzaWduZWQgdG8gbmV3bHktcGVyc2lzdGVkIGluc3RhbmNlcworICAgICAqIHdoZW4gdGhlIHVzZXIgZmlyc3QgYXNrcyBmb3IgaXQsIG9yIG9uIGZsdXNoLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SWQoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IGlkIGZvciB0aGUgbWFuYWdlZCBpbnN0YW5jZS4gU29tZSBiYWNrIGVuZHMgbWF5IG5vdCBiZQorICAgICAqIGFibGUgdG8gYXNzaWduIGEgcGVybWFuZW50IG9pZCB1bnRpbCBmbHVzaC4gRG8gbm90IGNhbGwgdGhpcyBtZXRob2Qgb24KKyAgICAgKiBhcHBsaWNhdGlvbiBpZGVudGl0eSBpbnN0YW5jZXM7IGNoYW5naW5nIHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgb2YKKyAgICAgKiBhcHBsaWNhdGlvbiBpZGVudGl0eSBvYmplY3RzIHRocm91Z2ggdGhlIDxjb2RlPnN0b3JlWFhYRmllbGQ8L2NvZGU+CisgICAgICogbWV0aG9kcyB3aWxsIGF1dG9tYXRpY2FsbHkgY2hhbmdlIHRoZSBvaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0SWQoT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBBc2sgdGhlIHN0b3JlIG1hbmFnZXIgdG8gYXNzaWduIGEgcGVybWFuZW50IG9pZCB0byB0aGlzIG5ldyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbHVzaCBpZiB0cnVlLCBmbHVzaCBpZiBuZWNlc3NhcnkgdG8gZ2V0IGEgcGVybWFuZW50IG9pZDsgaWYKKyAgICAgKiBmYWxzZSwgdGhlIG9pZCBtYXkgYmUgbGVmdCB1bmFzc2lnbmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIGFuIG9pZCBhc3NpZ25lZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduT2JqZWN0SWQoYm9vbGVhbiBmbHVzaCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jayBvYmplY3Qgc2V0IGZvciB0aGlzIGluc3RhbmNlLiBUaGlzIG9iamVjdCBpcyBnZW5lcmFsbHkKKyAgICAgKiBtYW5hZ2VkIGJ5IHRoZSBzeXN0ZW0gbG9jayBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0TG9jaygpOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2sgb2JqZWN0IHNldCBmb3IgdGhpcyBpbnN0YW5jZS4gVGhpcyBvYmplY3QgaXMgZ2VuZXJhbGx5CisgICAgICogbWFuYWdlZCBieSB0aGUgc3lzdGVtIGxvY2sgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrKE9iamVjdCBsb2NrKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2ZXJzaW9uIGluZGljYXRvciBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZlcnNpb24oKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVyc2lvbiBpbmRpY2F0b3IgZm9yIHRoaXMgaW5zdGFuY2UsIGFzIGxvYWRlZCBmcm9tIHRoZQorICAgICAqIGRhdGEgc3RvcmUuIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHtAbGluayBTdG9yZU1hbmFnZXJ9IHdoZW4KKyAgICAgKiBsb2FkaW5nIGluc3RhbmNlIGRhdGEuIE9uIHJvbGxiYWNrLCB0aGUgdmVyc2lvbiB3aWxsIGJlIHJvbGxlZCBiYWNrCisgICAgICogdG8gdGhpcyB2YWx1ZS4gVmVyc2lvbiBvYmplY3RzIHNob3VsZCBiZSBzZXJpYWxpemFibGUgYW5kIHNob3VsZCBub3QKKyAgICAgKiByZXF1aXJlIHZlbmRvci1zcGVjaWZpYyBjbGFzc2VzLCBiZWNhdXNlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvCisgICAgICogZGV0YWNoZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmV4dCB2ZXJzaW9uIGluZGljYXRvciBpbiB0aGUgZGF0YXN0b3JlIHBlbmRpbmcgYSBzdWNjZXNzZnVsCisgICAgICogZmx1c2guIFRoZSB7QGxpbmsgU3RvcmVNYW5hZ2VyfSB1c2VzIHRoaXMgbWV0aG9kIGR1cmluZyBmbHVzaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0VmVyc2lvbihPYmplY3QgdmVyc2lvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGF0ZSBuZWVkcyB0byBpc3N1ZSBhIHZlcnNpb24gdXBkYXRlLCBwb3NzaWJseQorICAgICAqIGFzIGEgcmVzdWx0IG9mIGJlaW5nIGxvY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25VcGRhdGVSZXF1aXJlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RhdGUgbmVlZHMgdG8gaXNzdWUgYSB2ZXJzaW9uIGNoZWNrIGF0IGZsdXNoIHRpbWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCgpOworCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHRoYXQgY29uY3JldGUgYmFjayBlbmRzIGNhbiBhc3NvY2lhdGUgd2l0aCBlYWNoIGluc3RhbmNlLgorICAgICAqIFRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIG9yIG1vZGlmaWVkIGluIGFueSB3YXkgYnkgdGhlIGdlbmVyaWMKKyAgICAgKiBwZXJzaXN0ZW5jZSBsYXllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEltcGxEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgdGhhdCBjb25jcmV0ZSBiYWNrIGVuZHMgY2FuIGFzc29jaWF0ZSB3aXRoIGVhY2ggaW5zdGFuY2UuCisgICAgICogVGhpcyBvYmplY3QgaXMgbm90IHVzZWQgb3IgbW9kaWZpZWQgaW4gYW55IHdheSBieSB0aGUgZ2VuZXJpYworICAgICAqIHBlcnNpc3RlbmNlIGxheWVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNhY2hlYWJsZSB3aGV0aGVyIHRoZSBpbXBsIGRhdGEgY2FuIGJlIHNoYXJlZCBhbW9uZyBpbnN0YW5jZXMKKyAgICAgKiBpbiBkaWZmZXJlbnQgY29udGV4dHMgaWYgTDIgY2FjaGluZyBpcyBlbmFibGVkCisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgaW1wbCBkYXRhIHZhbHVlLCBpZiBhbnkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHNldEltcGxEYXRhKE9iamVjdCBkYXRhLCBib29sZWFuIGNhY2hlYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBpbnN0YW5jZS1sZXZlbCBpbXBsIGRhdGEgY2FuIGJlIHNoYXJlZCBhbW9uZyBpbnN0YW5jZXMKKyAgICAgKiBpbiBkaWZmZXJlbnQgY29udGV4dHMgaWYgTDIgY2FjaGluZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoKTsKKworICAgIC8qKgorICAgICAqIEZpZWxkLWxldmVsIGltcGwgZGF0YS4gRmllbGQtbGV2ZWwgZGF0YSBvbmx5IGFwcGxpZXMgdG8gbG9hZGVkIGZpZWxkcywKKyAgICAgKiBhbmQgaXMgY2xlYXJlZCB3aGVuIHRoZSBmaWVsZCBpcyBjbGVhcmVkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW1wbERhdGEoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEZpZWxkLWxldmVsIGltcGwgZGF0YS4gRmllbGQtbGV2ZWwgZGF0YSBvbmx5IGFwcGxpZXMgdG8gbG9hZGVkIGZpZWxkcywKKyAgICAgKiBhbmQgaXMgY2xlYXJlZCB3aGVuIHRoZSBmaWVsZCBpcyBjbGVhcmVkLiBXaGV0aGVyIHRoZSBkYXRhIGlzIGNhY2hlZAorICAgICAqIGFjcm9zcyBpbnN0YW5jZXMgZGVwZW5kcyBvbiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBtZXRhZGF0YSdzIHJlc3BvbnNlCisgICAgICogdG8ge0BsaW5rIEZpZWxkTWV0YURhdGEjdXNlc0ltcGxEYXRhfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGltcGwgZGF0YSB2YWx1ZSwgaWYgYW55CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBzZXRJbXBsRGF0YShpbnQgZmllbGQsIE9iamVjdCBkYXRhKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGZpZWxkJ3MgaW1wbCBkYXRhIGlzIGxvYWRlZCBhbmQgY2FuIGJlIHNoYXJlZCBhbW9uZworICAgICAqIGluc3RhbmNlcyBpbiBkaWZmZXJlbnQgY29udGV4dHMgaWYgTDIgY2FjaGluZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFVzZSBpbnRlcm1lZGlhdGUgZmllbGQgZGF0YSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgaW5mb3JtYXRpb24gdGhhdAorICAgICAqIG1pZ2h0IGJlIGF2YWlsYWJsZSBiZWZvcmUgdGhlIGZpZWxkIGlzIGZ1bGx5IGxvYWRlZC4gVGhlIHN5c3RlbQorICAgICAqIHdpbGwgYXV0b21hdGljYWxseSBjbGVhciB0aGlzIGRhdGEgd2hlbiB0aGUgZmllbGQgZ2V0cyBsb2FkZWQuCisgICAgICogVGhpcyBkYXRhIHNob3VsZCBiZSBjYWNoZWFibGU7IHRoZSBkYXRhc3RvcmUgY2FjaGUgd2lsbCBhdHRlbXB0IHRvCisgICAgICogY2FjaGUgaXQgaWYgdGhlIGZpZWxkIHZhbHVlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRJbnRlcm1lZGlhdGUoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFVzZSBpbnRlcm1lZGlhdGUgZmllbGQgZGF0YSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgaW5mb3JtYXRpb24gdGhhdAorICAgICAqIG1pZ2h0IGJlIGF2YWlsYWJsZSBiZWZvcmUgdGhlIGZpZWxkIGlzIGZ1bGx5IGxvYWRlZC4gVGhlIHN5c3RlbQorICAgICAqIHdpbGwgYXV0b21hdGljYWxseSBjbGVhciB0aGlzIGRhdGEgd2hlbiB0aGUgZmllbGQgZ2V0cyBsb2FkZWQuCisgICAgICogVGhpcyBkYXRhIHNob3VsZCBiZSBjYWNoZWFibGU7IHRoZSBkYXRhc3RvcmUgY2FjaGUgd2lsbCBhdHRlbXB0IHRvCisgICAgICogY2FjaGUgaXQgaWYgdGhlIGZpZWxkIHZhbHVlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJtZWRpYXRlKGludCBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0ZXJuYWwgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZldGNoQm9vbGVhbihpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRlcm5hbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIGJ5dGUgZmV0Y2hCeXRlKGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dGVybmFsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2hhciBmZXRjaENoYXIoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0ZXJuYWwgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGUoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0ZXJuYWwgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBmZXRjaEZsb2F0KGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dGVybmFsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZldGNoSW50KGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dGVybmFsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBmZXRjaExvbmcoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0ZXJuYWwgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3QoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0ZXJuYWwgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBmZXRjaFNob3J0KGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dGVybmFsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZldGNoU3RyaW5nKGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dGVybmFsaXplZCB2YWx1ZSBvZiB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggYXMgYW4KKyAgICAgKiBvYmplY3QuIElmIHRoZXJlIGlzIG5vIGV4dGVybmFsaXplciwgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgICoge0BsaW5rICNmZXRjaEZpZWxkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoKGludCBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBpbmRleCBhcyBhbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbnMgaWYgdHJ1ZSwgdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSBzdGF0ZSB0cmFuc2l0aW9ucworICAgICAqIHRvIG9jY3VyIGFzIGlmIHRoZSBmaWVsZCB3ZXJlIGFjY2Vzc2VkIG5vcm1hbGx5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBmZXRjaEZpZWxkKGludCBmaWVsZCwgYm9vbGVhbiB0cmFuc2l0aW9ucyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFzIG9mIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjEuMQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hJbml0aWFsRmllbGQoaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gZXh0ZXJuYWwgdmFsdWUgYmFjayBpbnRvIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUJvb2xlYW4oaW50IGZpZWxkLCBib29sZWFuIGV4dGVybmFsVmFsKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gZXh0ZXJuYWwgdmFsdWUgYmFjayBpbnRvIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUJ5dGUoaW50IGZpZWxkLCBieXRlIGV4dGVybmFsVmFsKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gZXh0ZXJuYWwgdmFsdWUgYmFjayBpbnRvIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoYXIoaW50IGZpZWxkLCBjaGFyIGV4dGVybmFsVmFsKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gZXh0ZXJuYWwgdmFsdWUgYmFjayBpbnRvIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZURvdWJsZShpbnQgZmllbGQsIGRvdWJsZSBleHRlcm5hbFZhbCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGV4dGVybmFsIHZhbHVlIGJhY2sgaW50byB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVGbG9hdChpbnQgZmllbGQsIGZsb2F0IGV4dGVybmFsVmFsKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gZXh0ZXJuYWwgdmFsdWUgYmFjayBpbnRvIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUludChpbnQgZmllbGQsIGludCBleHRlcm5hbFZhbCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGV4dGVybmFsIHZhbHVlIGJhY2sgaW50byB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVMb25nKGludCBmaWVsZCwgbG9uZyBleHRlcm5hbFZhbCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGV4dGVybmFsIHZhbHVlIGJhY2sgaW50byB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVPYmplY3QoaW50IGZpZWxkLCBPYmplY3QgZXh0ZXJuYWxWYWwpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiBleHRlcm5hbCB2YWx1ZSBiYWNrIGludG8gdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlU2hvcnQoaW50IGZpZWxkLCBzaG9ydCBleHRlcm5hbFZhbCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGV4dGVybmFsIHZhbHVlIGJhY2sgaW50byB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVTdHJpbmcoaW50IGZpZWxkLCBTdHJpbmcgZXh0ZXJuYWxWYWwpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggYXMgZnJvbSB0aGUgZXh0ZXJuYWwKKyAgICAgKiBvYmplY3QgdmFsdWUuIElmIHRoZXJlIGlzIG5vIGV4dGVybmFsaXplciwgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgICoge0BsaW5rICNzdG9yZUZpZWxkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZShpbnQgZmllbGQsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBpbmRleCBhcyBhbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVGaWVsZChpbnQgZmllbGQsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBnaXZlbiBmaWVsZCBhcyBkaXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShpbnQgZmllbGQpOworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYW4gZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZWQoaW50IGZpZWxkLCBPYmplY3QgcmVtb3ZlZCwgYm9vbGVhbiBrZXkpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZSB0aGUgaW5zdGFuY2UgZm9yIHJlZnJlc2gKKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZyZXNoQWxsIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBvbmUgb2YgYSBjb2xsZWN0aW9uIG9mCisgICAgICogb2JqZWN0cyBiZWluZyByZWZyZXNoZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBuZWVkcyBhIHJlZnJlc2gsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBzZWUgQnJva2VyI3JlZnJlc2gKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVSZWZyZXNoKGJvb2xlYW4gcmVmcmVzaEFsbCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4gTWFrZSB0aGUgZmllbGQgZGlydHkgYXMKKyAgICAgKiBpZiB1c2VyIGNvZGUgc2V0IGl0LiBEbyBub3QgZGVsZXRlIGRlcGVuZGVudCBvYmplY3RzIGluIHRoZSBmaWVsZCdzCisgICAgICogY3VycmVudCB2YWx1ZS4gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgcmVtb3RlIHBhY2thZ2UgdG8KKyAgICAgKiBzeW5jaCBhIHNlcnZlci1zaWRlIHN0YXRlIG1hbmFnZXIgd2l0aCByZW1vdGUgY2hhbmdlcy4gV2UgZG8gbm90CisgICAgICogbmVlZCB0byBkZWxldGUgZGVwZW5kZW50IGluc3RhbmNlcyBiZWNhdXNlIHRoZXkgd2lsbCBoYXZlIGJlZW4KKyAgICAgKiBkZWxldGVkIHdoZW4gdGhlIGZpZWxkIGNoYW5nZWQgb24gdGhlIGNsaWVudCBzaWRlLCBhbmQgdGhvc2UKKyAgICAgKiBjbGllbnQtc2lkZSBkZWxldGVzIHdpbGwgYmUgdHJhbnNtaXR0ZWQgaW5kZXBlbmRlbnRseS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZSAoaW50IGZpZWxkLCBPYmplY3QgdmFsdWUpOworfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9PcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9PcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwYmM2ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL09yZGVyaW5nTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5NZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKKworLyoqCisgKiBNZXJnZWQgcmVzdWx0IG9iamVjdCBwcm92aWRlciBzcGVjaWFsaXphdGlvbiB0aGF0IGV4dHJhY3RzIG9yZGVyaW5nCisgKiB2YWx1ZXMgZnJvbSByZXN1bHRzIGZvciBjb21wYXJpc29uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBPcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgZXh0ZW5kcyBNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0b3JlUXVlcnkuRXhlY3V0b3JbXSBfZXhlY3M7CisgICAgcHJpdmF0ZSBmaW5hbCBTdG9yZVF1ZXJ5IF9xdWVyeTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9wYXJhbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX29yZGVyaW5nczsKKworICAgIHB1YmxpYyBPcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyKFJlc3VsdE9iamVjdFByb3ZpZGVyW10gcm9wcywKKyAgICAgICAgYm9vbGVhbltdIGFzYywgU3RvcmVRdWVyeS5FeGVjdXRvciBleGVjLCBTdG9yZVF1ZXJ5IHEsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICB0aGlzKHJvcHMsIGFzYywgbmV3IFN0b3JlUXVlcnkuRXhlY3V0b3JbXXsgZXhlYyB9LCBxLCBwYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyBPcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyKFJlc3VsdE9iamVjdFByb3ZpZGVyW10gcm9wcywKKyAgICAgICAgYm9vbGVhbltdIGFzYywgU3RvcmVRdWVyeS5FeGVjdXRvcltdIGV4ZWNzLCBTdG9yZVF1ZXJ5IHEsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBzdXBlcihyb3BzLCBuZXcgT3JkZXJpbmdDb21wYXJhdG9yKGFzYykpOworICAgICAgICBfb3JkZXJpbmdzID0gYXNjLmxlbmd0aDsKKyAgICAgICAgX2V4ZWNzID0gZXhlY3M7CisgICAgICAgIF9xdWVyeSA9IHE7CisgICAgICAgIF9wYXJhbXMgPSBwYXJhbXM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKE9iamVjdCB2YWwsIGludCBpZHgsCisgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCkgeworICAgICAgICBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4ZWMgPSAoX2V4ZWNzLmxlbmd0aCA9PSAxKSA/IF9leGVjc1swXQorICAgICAgICAgICAgOiBfZXhlY3NbaWR4XTsKKyAgICAgICAgaWYgKF9vcmRlcmluZ3MgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBleGVjLmdldE9yZGVyaW5nVmFsdWUoX3F1ZXJ5LCBfcGFyYW1zLCB2YWwsIDApOworCisgICAgICAgIE9iamVjdFtdIHJldCA9IG5ldyBPYmplY3RbX29yZGVyaW5nc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX29yZGVyaW5nczsgaSsrKQorICAgICAgICAgICAgcmV0W2ldID0gZXhlYy5nZXRPcmRlcmluZ1ZhbHVlKF9xdWVyeSwgX3BhcmFtcywgdmFsLCBpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJhdG9yIHRoYXQgd29ya3Mgb24gbXVsdGlwbGUgb3JkZXJpbmcgY3JpdGVyaWEgZ2l2ZW4gaW4gYW4gYXJyYXkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3JkZXJpbmdDb21wYXJhdG9yCisgICAgICAgIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuW10gX2FzYzsKKworICAgICAgICBwdWJsaWMgT3JkZXJpbmdDb21wYXJhdG9yKGJvb2xlYW5bXSBhc2MpIHsKKyAgICAgICAgICAgIF9hc2MgPSBhc2M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgIGlmIChfYXNjLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXAobzEsIG8yLCBfYXNjWzBdKTsKKworICAgICAgICAgICAgT2JqZWN0W10gYXJyMSA9IChPYmplY3RbXSkgbzE7CisgICAgICAgICAgICBPYmplY3RbXSBhcnIyID0gKE9iamVjdFtdKSBvMjsKKyAgICAgICAgICAgIGludCBjbXA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hc2MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjbXAgPSBjbXAoYXJyMVtpXSwgYXJyMltpXSwgX2FzY1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY21wKE9iamVjdCBvMSwgT2JqZWN0IG8yLCBib29sZWFuIGFzYykgeworICAgICAgICAgICAgaWYgKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChvMSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoYXNjKSA/IDEgOiAtMTsKKyAgICAgICAgICAgIGlmIChvMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoYXNjKSA/IC0xIDogMTsKKyAgICAgICAgICAgIGludCBjbXAgPSAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8obzIpOworICAgICAgICAgICAgaWYgKCFhc2MpCisgICAgICAgICAgICAgICAgY21wICo9IC0xOworICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENEYXRhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QQ0RhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMxYmRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENEYXRhLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKKy8qKgorICogSG9sZHMgZGF0YSBhYm91dCBhIHNpbmdsZSBwZXJzaXN0ZW5jZSBjYXBhYmxlIGluc3RhbmNlLiBUaGlzIGludGVyZmFjZSBpcworICogdXNlZCBpbiB0aGUgY2FjaGluZyBmcmFtZXdvcmssIGFuZCBtYXkgYWxzbyBiZSB1c2VkIGJ5IHNpbXBsZSBzdG9yZSBtYW5hZ2VyCisgKiBiYWNrLWVuZHMgdG8gaG9sZCBwZXJzaXN0ZW50IHN0YXRlLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUENEYXRhCisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZCBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0SWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZS1sZXZlbCBpbXBsIGRhdGEsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEltcGxEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdG9yZWQgaW5zdGFuY2UtbGV2ZWwgaW1wbCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltcGxEYXRhKE9iamVjdCB2YWwpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2ZXJzaW9uIG9iamVjdCB0aGF0IHRoaXMgZGF0YSB3YXMgbG9hZGVkIGZyb20uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWZXJzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2JqZWN0IHRoYXQgdGhpcyBkYXRhIHdhcyBsb2FkZWQgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKTsKKworICAgIC8qKgorICAgICAqIExvYWRzIGFsbCBmaWVsZHMgdGhhdCBhcmUgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAgICAgKiBpbnRvIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNtIHRoZSBzdGF0ZSBtYW5hZ2VyIHRvIGxvYWQKKyAgICAgKiBAcGFyYW0gZmV0Y2ggdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBsb2FkaW5nIHJlbGF0ZWQgb2JqZWN0cworICAgICAqIEBwYXJhbSBjb250ZXh0IGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBPYmplY3QgY29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBzb21lIG9yIGFsbCBvZiB0aGUgbWFya2VkIGZpZWxkcyBmcm9tIHRoZSBjYWNoZSBpbnRvIHRoZQorICAgICAqIGdpdmVuIHN0YXRlIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc20gdGhlIHN0YXRlIG1hbmFnZXIgdG8gbG9hZAorICAgICAqIEBwYXJhbSBmaWVsZHMgdGhlIGZpZWxkcyB0byBsb2FkOyBjbGVhciB0aGUgYml0cyBmb3IgdGhlIGZpZWxkcworICAgICAqIHRoYXQgYXJlIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgKiBAcGFyYW0gZmV0Y2ggdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBsb2FkaW5nIHJlbGF0ZWQgb2JqZWN0cworICAgICAqIEBwYXJhbSBjb250ZXh0IGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBhbGwgbG9hZGVkIGZpZWxkcyBvZiB0aGUgc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKTsKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBnaXZlbiBmaWVsZHMgZnJvbSB0aGUgc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIGdpdmVuIGZpZWxkIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YShpbnQgaSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBnaXZlbiBmaWVsZCBpbmRleCBoYXMgc3RvcmVkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoaW50IGkpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENEYXRhSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENEYXRhSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGY2OGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QQ0RhdGFJbXBsLmphdmEKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgUENEYXRhfSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFBDRGF0YUltcGwKKyAgICBleHRlbmRzIEFic3RyYWN0UENEYXRhIHsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IF9vaWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBfdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9kYXRhOworICAgIHByaXZhdGUgZmluYWwgQml0U2V0IF9sb2FkZWQ7CisgICAgcHJpdmF0ZSBPYmplY3QgX3ZlcnNpb24gPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0IF9pbXBsID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdFtdIF9maWVsZEltcGwgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFBDRGF0YUltcGwoT2JqZWN0IG9pZCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9vaWQgPSBvaWQ7CisgICAgICAgIF90eXBlID0gbWV0YS5nZXREZXNjcmliZWRUeXBlKCk7CisKKyAgICAgICAgaW50IGxlbiA9IG1ldGEuZ2V0RmllbGRzKCkubGVuZ3RoOworICAgICAgICBfZGF0YSA9IG5ldyBPYmplY3RbbGVuXTsKKyAgICAgICAgX2xvYWRlZCA9IG5ldyBCaXRTZXQobGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgeworICAgICAgICByZXR1cm4gX29pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF90eXBlOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0TG9hZGVkKCkgeworICAgICAgICByZXR1cm4gX2xvYWRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldERhdGEoaW50IGluZGV4KSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBpbmRleCBpcyBhY3R1YWxseSBsb2FkZWQgdG8gYXZvaWQgcmV0dXJuaW5nIGFuCisgICAgICAgIC8vIGludGVybWVkaWF0ZSB2YWx1ZQorICAgICAgICByZXR1cm4gKF9sb2FkZWQuZ2V0KGluZGV4KSkgPyBfZGF0YVtpbmRleF0gOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGEoaW50IGluZGV4LCBPYmplY3QgdmFsKSB7CisgICAgICAgIF9sb2FkZWQuc2V0KGluZGV4KTsKKyAgICAgICAgX2RhdGFbaW5kZXhdID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyRGF0YShpbnQgaW5kZXgpIHsKKyAgICAgICAgX2xvYWRlZC5jbGVhcihpbmRleCk7CisgICAgICAgIF9kYXRhW2luZGV4XSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbXBsRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbXBsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxEYXRhKE9iamVjdCB2YWwpIHsKKyAgICAgICAgX2ltcGwgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbXBsRGF0YShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChfZmllbGRJbXBsICE9IG51bGwpID8gX2ZpZWxkSW1wbFtpbmRleF0gOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxEYXRhKGludCBpbmRleCwgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfZmllbGRJbXBsID09IG51bGwpCisgICAgICAgICAgICAgICAgX2ZpZWxkSW1wbCA9IG5ldyBPYmplY3RbX2RhdGEubGVuZ3RoXTsKKyAgICAgICAgICAgIF9maWVsZEltcGxbaW5kZXhdID0gdmFsOworICAgICAgICB9IGVsc2UgaWYgKF9maWVsZEltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgIF9maWVsZEltcGxbaW5kZXhdID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEludGVybWVkaWF0ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuICghX2xvYWRlZC5nZXQoaW5kZXgpKSA/IF9kYXRhW2luZGV4XSA6IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJtZWRpYXRlKGludCBpbmRleCwgT2JqZWN0IHZhbCkgeworICAgICAgICBfbG9hZGVkLmNsZWFyKGluZGV4KTsKKyAgICAgICAgX2RhdGFbaW5kZXhdID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZGVkKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gX2xvYWRlZC5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvYWRlZChpbnQgaW5kZXgsIGJvb2xlYW4gbG9hZGVkKSB7CisgICAgICAgIGlmIChsb2FkZWQpCisgICAgICAgICAgICBfbG9hZGVkLnNldChpbmRleCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9sb2FkZWQuY2xlYXIoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIF92ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oT2JqZWN0IHZlcnNpb24pIHsKKyAgICAgICAgX3ZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLAorICAgICAgICBPYmplY3QgY29udGV4dCkgeworICAgICAgICBsb2FkVmVyc2lvbihzbSk7CisgICAgICAgIGxvYWRJbXBsRGF0YShzbSk7CisKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGxvYWQgaW50ZXJtZWRpYXRlIGRhdGEgZm9yIGFsbCB1bmxvYWRlZCBmaWVsZHMgYW5kIGRhdGEgZm9yCisgICAgICAgICAgICAvLyBmaWVsZHMgaW4gY29uZmlndXJlZCBmZXRjaCBncm91cHMKKyAgICAgICAgICAgIGlmICghaXNMb2FkZWQoaSkpCisgICAgICAgICAgICAgICAgbG9hZEludGVybWVkaWF0ZShzbSwgZm1kc1tpXSk7CisgICAgICAgICAgICBlbHNlIGlmICghc20uZ2V0TG9hZGVkKCkuZ2V0KGkpICYmIGZldGNoLnJlcXVpcmVzRmV0Y2goZm1kc1tpXSkgCisgICAgICAgICAgICAgICAgIT0gRmV0Y2hDb25maWd1cmF0aW9uLkZFVENIX05PTkUpCisgICAgICAgICAgICAgICAgbG9hZEZpZWxkKHNtLCBmbWRzW2ldLCBmZXRjaCwgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEJpdFNldCBmaWVsZHMsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgbG9hZFZlcnNpb24oc20pOworICAgICAgICBsb2FkSW1wbERhdGEoc20pOworCisgICAgICAgIC8vIGF0dGVtcHQgdG8gbG9hZCBnaXZlbiBmaWVsZHMKKyAgICAgICAgaW50IGxlbiA9IChmaWVsZHMgPT0gbnVsbCkgPyAwIDogZmllbGRzLmxlbmd0aCgpOworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKCFmaWVsZHMuZ2V0KGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBmbWQgPSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGkpOworICAgICAgICAgICAgaWYgKCFpc0xvYWRlZChpKSkKKyAgICAgICAgICAgICAgICBsb2FkSW50ZXJtZWRpYXRlKHNtLCBmbWQpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbG9hZEZpZWxkKHNtLCBmbWQsIGZldGNoLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBsb2FkSW1wbERhdGEoc20sIGZtZCk7CisgICAgICAgICAgICAgICAgZmllbGRzLmNsZWFyKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHZlcnNpb24gaW5mb3JtYXRpb24gaW50byB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIGlmIChzbS5nZXRWZXJzaW9uKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHNtLnNldFZlcnNpb24oZ2V0VmVyc2lvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaW1wbCBkYXRhIGluZm9ybWF0aW9uIGludG8gdGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZEltcGxEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgT2JqZWN0IGltcGwgPSBnZXRJbXBsRGF0YSgpOworICAgICAgICBpZiAoc20uZ2V0SW1wbERhdGEoKSA9PSBudWxsICYmIGltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgIHNtLnNldEltcGxEYXRhKGltcGwsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBmaWVsZC1sZXZlbCBpbmZvcm1hdGlvbiBpbnRvIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvYWRGaWVsZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICBpbnQgaW5kZXggPSBmbWQuZ2V0SW5kZXgoKTsKKyAgICAgICAgT2JqZWN0IHZhbCA9IHRvRmllbGQoc20sIGZtZCwgZ2V0RGF0YShpbmRleCksIGZldGNoLCBjb250ZXh0KTsKKyAgICAgICAgc20uc3RvcmVGaWVsZChpbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgZmllbGQtbGV2ZWwgaW1wbCBkYXRhIGludG8gdGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZEltcGxEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGludCBpbmRleCA9IGZtZC5nZXRJbmRleCgpOworICAgICAgICBPYmplY3QgaW1wbCA9IGdldEltcGxEYXRhKGluZGV4KTsKKyAgICAgICAgaWYgKGltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgIHNtLnNldEltcGxEYXRhKGluZGV4LCBpbXBsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaW50ZXJtZWRpYXRlIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gZmllbGQgaW50byB0aGUgc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkSW50ZXJtZWRpYXRlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGludCBpbmRleCA9IGZtZC5nZXRJbmRleCgpOworICAgICAgICBPYmplY3QgaW50ZXIgPSBnZXRJbnRlcm1lZGlhdGUoaW5kZXgpOworICAgICAgICBpZiAoaW50ZXIgIT0gbnVsbCAmJiAhc20uZ2V0TG9hZGVkKCkuZ2V0KGluZGV4KSkKKyAgICAgICAgICAgIHNtLnNldEludGVybWVkaWF0ZShpbmRleCwgaW50ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgc3RvcmVWZXJzaW9uKHNtKTsKKyAgICAgICAgc3RvcmVJbXBsRGF0YShzbSk7CisKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBzbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzbS5nZXRMb2FkZWQoKS5nZXQoaSkpIHsKKyAgICAgICAgICAgICAgICBzdG9yZUZpZWxkKHNtLCBmbWRzW2ldKTsKKyAgICAgICAgICAgICAgICBzdG9yZUltcGxEYXRhKHNtLCBmbWRzW2ldLCBpc0xvYWRlZChpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0xvYWRlZChpKSkKKyAgICAgICAgICAgICAgICBzdG9yZUludGVybWVkaWF0ZShzbSwgZm1kc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzKSB7CisgICAgICAgIHN0b3JlVmVyc2lvbihzbSk7CisgICAgICAgIHN0b3JlSW1wbERhdGEoc20pOworCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmllbGRzICE9IG51bGwgJiYgZmllbGRzLmdldChpKSkgeworICAgICAgICAgICAgICAgIHN0b3JlRmllbGQoc20sIGZtZHNbaV0pOworICAgICAgICAgICAgICAgIHN0b3JlSW1wbERhdGEoc20sIGZtZHNbaV0sIGlzTG9hZGVkKGkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTG9hZGVkKGkpKQorICAgICAgICAgICAgICAgIHN0b3JlSW50ZXJtZWRpYXRlKHNtLCBmbWRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZVZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBzZXRWZXJzaW9uKHNtLmdldFZlcnNpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgaW1wbCBkYXRhIGZyb20gdGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVJbXBsRGF0YShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIGlmIChzbS5pc0ltcGxEYXRhQ2FjaGVhYmxlKCkpCisgICAgICAgICAgICBzZXRJbXBsRGF0YShzbS5nZXRJbXBsRGF0YSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBmaWVsZC1sZXZlbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlRmllbGQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaWYgKGZtZC5nZXRNYW5hZ2VtZW50KCkgIT0gZm1kLk1BTkFHRV9QRVJTSVNURU5UKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGludCBpbmRleCA9IGZtZC5nZXRJbmRleCgpOworICAgICAgICBPYmplY3QgdmFsID0gdG9EYXRhKGZtZCwgc20uZmV0Y2hGaWVsZChpbmRleCwgZmFsc2UpLAorICAgICAgICAgICAgc20uZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgaWYgKHZhbCAhPSBOVUxMKQorICAgICAgICAgICAgc2V0RGF0YShpbmRleCwgdmFsKTsKKyAgICAgICAgZWxzZSAvLyB1bmFibGUgdG8gc3RvcmUgZmllbGQgdmFsdWU7IGNsZWFyIG91dCBhbnkgb2xkIHZhbHVlcworICAgICAgICAgICAgY2xlYXJEYXRhKGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgaW50ZXJtZWRpYXRlIGZpZWxkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVJbnRlcm1lZGlhdGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZm1kLmdldEluZGV4KCk7CisgICAgICAgIE9iamVjdCB2YWwgPSBzbS5nZXRJbnRlcm1lZGlhdGUoaW5kZXgpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBzZXRJbnRlcm1lZGlhdGUoaW5kZXgsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgaW1wbCBkYXRhIGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVJbXBsRGF0YShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgYm9vbGVhbiBmaWVsZExvYWRlZCkgeworICAgICAgICBpbnQgaW5kZXggPSBmbWQuZ2V0SW5kZXgoKTsKKyAgICAgICAgaWYgKGZpZWxkTG9hZGVkKSB7CisgICAgICAgICAgICAvLyBpcyB0aGVyZSBpbXBsIGRhdGEgdG8gc3RvcmU/CisgICAgICAgICAgICBPYmplY3QgaW1wbCA9IHNtLmdldEltcGxEYXRhKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgc20uaXNJbXBsRGF0YUNhY2hlYWJsZShpbmRleCkpCisgICAgICAgICAgICAgICAgc2V0SW1wbERhdGEoaW5kZXgsIGltcGwpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNldEltcGxEYXRhKGluZGV4LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcge0BsaW5rIFBDRGF0YX0gaW1wbGVtZW50YXRpb24gb2YgdGhlIHJpZ2h0IHR5cGUgZm9yCisgICAgICogZW1iZWRkZWQgaW5zdGFuY2VzLiBSZXR1cm5zIGEge0BsaW5rIFBDRGF0YUltcGx9IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0UENEYXRhIG5ld0VtYmVkZGVkUENEYXRhKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQQ0RhdGFJbXBsKHNtLmdldElkICgpLCBzbS5nZXRNZXRhRGF0YSAoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjI2N2UKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QQ1Jlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CisKKy8qKgorICogVmFyaWFudCBvZiB7QGxpbmsgUmVzdWx0T2JqZWN0UHJvdmlkZXJ9IHRoYXQgcG9wdWxhdGVzIGEKKyAqIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfSBvYmplY3QgaW4gYW4gYXBwbGljYXRpb24tZGVmaW5lZCBtYW5uZXIuCisgKiAgSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBkYXRhIGxvYWRpbmcuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBzZWUgQWJzdHJhY3RQQ1Jlc3VsdE9iamVjdFByb3ZpZGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUENSZXN1bHRPYmplY3RQcm92aWRlcgorICAgIGV4dGVuZHMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAc2VlIFN0b3JlTWFuYWdlciNpbml0aWFsaXplCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBQQ1N0YXRlIHN0YXRlLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QQ1N0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QQ1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllZmQ3NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BDU3RhdGUuamF2YQpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgbGlmZWN5Y2xlIHN0YXRlcy4gRWFjaCBpbnN0YW5jZSBpcyBtYW5hZ2VkIGJ5CisgKiBhIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfSwgd2hpY2ggaW4gdHVybiBrZWVwcyBhIHJlZmVyZW5jZSB0byBpdHMgY3VycmVudAorICogc3RhdGUuCisgKiAgVGhlIHN0YXRlIGdvdmVybnMgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnN0YW5jZSBkdXJpbmcgYWxsIGxpZmVjeWNsZQorICogZXZlbnRzLiBUaGUgY2xhc3MgaXRzZWxmIGlzIHN0YXRlbGVzcywgYW5kIGlzIHByb3ZpZGVkIGl0cyBjb250ZXh0CisgKiBvbiBlYWNoIG1ldGhvZCBjYWxsLiBUaGlzIGJhc2UgY2xhc3MgcHJvdmlkZXMgbm8tb3AgaW1wbGVtZW50YXRpb25zCisgKiBvZiBhbGwgbWV0aG9kcyBhbmQgbWFpbnRhaW5zIHN0YXRpYyBzaW5nZWx0b24gc2hhcmVkIHJlZmVyZW5jZXMgdG8gZWFjaAorICogcG9zc2libGUgc3RhdGUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFBDU3RhdGUKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50LU5ldworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQTkVXID0gbmV3IFBOZXdTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVudC1DbGVhbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQQ0xFQU4gPSBuZXcgUENsZWFuU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQtRGlydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgUERJUlRZID0gbmV3IFBEaXJ0eVN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50LURlbGV0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgUERFTEVURUQgPSBuZXcgUERlbGV0ZWRTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVudC1OZXctRGVsZXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQTkVXREVMRVRFRCA9IG5ldyBQTmV3RGVsZXRlZFN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50LU5ldy1Qcm92aXNpb25hbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQTkVXUFJPVklTSU9OQUwgPSBuZXcgUE5ld1Byb3Zpc2lvbmFsU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQtTm9udHJhbnNhY3Rpbm9hbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQTk9OVFJBTlMgPSBuZXcgUE5vblRyYW5zU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQtRGlydHktTm9udHJhbnNhY3Rpbm9hbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQTk9OVFJBTlNESVJUWSA9IG5ldyBQTm9uVHJhbnNEaXJ0eVN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50LU5ldy1Ob250cmFuc2FjdGlvbmFsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQQ1N0YXRlIFBOT05UUkFOU05FVyA9IG5ldyBQTm9uVHJhbnNOZXdTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVudC1EZWxldGVkLU5vbnRyYW5zYWN0aW9uYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgUE5PTlRSQU5TREVMRVRFRCA9IG5ldyBQTm9uVHJhbnNEZWxldGVkU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEhvbGxvdzsgZXhpc3RzIGluIGRhdGEgc3RvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgSE9MTE9XID0gbmV3IEhvbGxvd1N0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2llbnQ7IHVubWFuYWdlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBUUkFOU0lFTlQgPSBuZXcgVHJhbnNpZW50U3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zaWVudC1DbGVhbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBUQ0xFQU4gPSBuZXcgVENsZWFuU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zaWVudC1EaXJ0eQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBURElSVFkgPSBuZXcgVERpcnR5U3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zaWVudC1Mb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgVExPQURFRCA9IG5ldyBUTG9hZGVkU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEVtYmVkZGVkLUNvcHkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgRUNPUFkgPSBuZXcgRUNvcHlTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogRW1iZWRkZWQtQ2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgRUNMRUFOID0gbmV3IEVDbGVhblN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBFbWJlZGRlZC1EaXJ0eQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBFRElSVFkgPSBuZXcgRURpcnR5U3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEVtYmVkZGVkLURlbGV0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBDU3RhdGUgRURFTEVURUQgPSBuZXcgRURlbGV0ZWRTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogRW1iZWRkZWQtTm9udHJhbnNhY3Rpb25hbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBFTk9OVFJBTlMgPSBuZXcgRU5vblRyYW5zU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQtTmV3LUZsdXNoZWQtRGVsZXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQTkVXRkxVU0hFRERFTEVURUQgPQorICAgICAgICBuZXcgUE5ld0ZsdXNoZWREZWxldGVkU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQtTmV3LUZsdXNoZWQtRGVsZXRlZC1GbHVzaGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQQ1N0YXRlIFBORVdGTFVTSEVEREVMRVRFREZMVVNIRUQgPQorICAgICAgICBuZXcgUE5ld0ZsdXNoZWREZWxldGVkRmx1c2hlZFN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50LURlbGV0ZWQtRmx1c2hlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUENTdGF0ZSBQREVMRVRFREZMVVNIRUQgPQorICAgICAgICBuZXcgUERlbGV0ZWRGbHVzaGVkU3RhdGUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoUENTdGF0ZS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGlzIHN0YXRlIGlzIGZpcnN0IGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzdGF0ZSBpcyBmbHVzaGVkLgorICAgICAqLworICAgIHZvaWQgYmVmb3JlRmx1c2goU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBib29sZWFuIGxvZ2ljYWwsCisgICAgICAgIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlCisgICAgICogc3RhdGUgb24gZnVzaC4gUmV0dXJucyB0aGUgPGNvZGU+dGhpczwvY29kZT4gcG9pbnRlciBieSBkZWZhdWx0LgorICAgICAqLworICAgIFBDU3RhdGUgZmx1c2goU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogb24gdHJhbnNhY3Rpb24gY29tbWl0LiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogb24gdHJhbnNhY3Rpb24gY29tbWl0IHdpdGggdGhlIHJldGFpblZhbHVlcyBmbGFnIHNldC4KKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogb24gdHJhbnNhY3Rpb24gcm9sbGJhY2suCisgICAgICogUmV0dXJucyB0aGUgPGNvZGU+dGhpczwvY29kZT4gcG9pbnRlciBieSBkZWZhdWx0LgorICAgICAqLworICAgIFBDU3RhdGUgcm9sbGJhY2soU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogb24gdHJhbnNhY3Rpb24gcm9sbGJhY2sgd2l0aCB0aGUgcmVzdG9yZVZhbHVlcyBmbGFnIHNldC4KKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSByb2xsYmFja1Jlc3RvcmUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogb24gYSBjYWxsIHRvIHtAbGluayBCcm9rZXIjcGVyc2lzdH0gd2l0aCB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICogUmV0dXJucyB0aGUgPGNvZGU+dGhpczwvY29kZT4gcG9pbnRlciBieSBkZWZhdWx0LiBOb3RlOiB0aGlzIG1ldGhvZAorICAgICAqIGlzIDxiPm5vdDwvYj4gY2FsbGVkIGZvciBlbWJlZGRlZCBzdGF0ZXMsIGFuZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGFuCisgICAgICogZXhpc3RpbmcgbWFuYWdlZCBpbnN0YW5jZSBpcyB0aGUgdGFyZ2V0IG9mIGEgcGVyc2lzdCBjYWxsLgorICAgICAqLworICAgIFBDU3RhdGUgcGVyc2lzdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbnkgYWN0aW9ucyBuZWNlc3NzYXJ5IGFuZCByZXR1cm4gdGhlIHByb3BlciBsaWZlY3ljbGUgc3RhdGUKKyAgICAgKiBvbiBhIGNhbGwgdG8ge0BsaW5rIEJyb2tlciNkZWxldGV9IHdpdGggdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPnRoaXM8L2NvZGU+IHBvaW50ZXIgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBQQ1N0YXRlIGRlbGV0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSB0byB0cmFuc2l0aW9uIHRvIGFmdGVyIG1ha2luZyBubyBsb25nZXIgcHJvdmlzaW9uYWwuIAorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPnRoaXM8L2NvZGU+IHBvaW50ZXIgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBQQ1N0YXRlIG5vbnByb3Zpc2lvbmFsKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgYm9vbGVhbiBsb2dpY2FsLCAKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc3NhcnkgYW5kIHJldHVybiB0aGUgcHJvcGVyIGxpZmVjeWNsZSBzdGF0ZQorICAgICAqIG9uIGEgY2FsbCB0byB7QGxpbmsgU3RvcmVDb250ZXh0I25vbnRyYW5zYWN0aW9uYWx9IHdpdGggdGhlIGdpdmVuCisgICAgICogaW5zdGFuY2UuIFJldHVybnMgdGhlIDxjb2RlPnRoaXM8L2NvZGU+IHBvaW50ZXIgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBQQ1N0YXRlIG5vbnRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogb24gYSBjYWxsIHRvIHtAbGluayBTdG9yZUNvbnRleHQjbm9udHJhbnNhY3Rpb25hbH0gd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZS4gUmV0dXJucyB0aGUgPGNvZGU+dGhpczwvY29kZT4gcG9pbnRlciBieSBkZWZhdWx0LgorICAgICAqLworICAgIFBDU3RhdGUgdHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbnkgYWN0aW9ucyBuZWNlc3NzYXJ5IGFuZCByZXR1cm4gdGhlIHByb3BlciBsaWZlY3ljbGUgc3RhdGUKKyAgICAgKiBvbiBhIGNhbGwgdG8ge0BsaW5rIEJyb2tlciNtYWtlVHJhbnNpZW50fSB3aXRoIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc3NhcnkgYW5kIHJldHVybiB0aGUgcHJvcGVyIGxpZmVjeWNsZSBzdGF0ZQorICAgICAqIG9uIGEgY2FsbCB0byB7QGxpbmsgQnJva2VyI2V2aWN0fSB3aXRoIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBldmljdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSB0byB0cmFuc2l0aW9uIHRvIGFmdGVyIHJlZnJlc2guIFRoZSBjb250ZXh0IGlzCisgICAgICogbm90IGdpdmVuIGJlY2F1c2Ugbm8gYWN0aW9ucyBzaG91bGQgYmUgdGFrZW4uCisgICAgICovCisgICAgUENTdGF0ZSBhZnRlclJlZnJlc2goKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhdGUgdG8gdHJhbnNpdGlvbiB0byBhZnRlciByZWZyZXNoLiBUaGUgY29udGV4dCBpcworICAgICAqIG5vdCBnaXZlbiBiZWNhdXNlIG5vIGFjdGlvbnMgc2hvdWxkIGJlIHRha2VuLgorICAgICAqLworICAgIFBDU3RhdGUgYWZ0ZXJPcHRpbWlzdGljUmVmcmVzaCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSB0byB0cmFuc2l0aW9uIHRvIGFmdGVyIHJlZnJlc2guIFRoZSBjb250ZXh0IGlzCisgICAgICogbm90IGdpdmVuIGJlY2F1c2Ugbm8gYWN0aW9ucyBzaG91bGQgYmUgdGFrZW4uCisgICAgICovCisgICAgUENTdGF0ZSBhZnRlck5vbnRyYW5zYWN0aW9uYWxSZWZyZXNoKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc3NhcnkgYW5kIHJldHVybiB0aGUgcHJvcGVyIGxpZmVjeWNsZSBzdGF0ZQorICAgICAqIHByaW9yIHRvIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UgYmVpbmcgcmVhZCB3aXRoaW4KKyAgICAgKiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uIFRoZSBnaXZlbiBmaWVsZCBudW1iZXIgY2FuIGJlIC0xIGlmIGl0IGlzCisgICAgICogYSBnZW5lcmFsIG9iamVjdCByZWFkLiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBiZWZvcmVSZWFkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogcHJpb3IgdG8gdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBpbnN0YW5jZSBiZWluZyByZWFkIG91dHNpZGUgb2YKKyAgICAgKiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uIFRoZSBnaXZlbiBmaWVsZCBudW1iZXIgY2FuIGJlIC0xIGlmIGl0IGlzCisgICAgICogYSBnZW5lcmFsIG9iamVjdCByZWFkLiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBiZWZvcmVOb250cmFuc2FjdGlvbmFsUmVhZChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc3NhcnkgYW5kIHJldHVybiB0aGUgcHJvcGVyIGxpZmVjeWNsZSBzdGF0ZQorICAgICAqIHByaW9yIHRvIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UgYmVpbmcgcmVhZCBpbiBhbiBvcHRpbWlzdGljCisgICAgICogdHJhbnNhY3Rpb24uIFRoZSBnaXZlbiBmaWVsZCBudW1iZXIgY2FuIGJlIC0xIGlmIGl0IGlzCisgICAgICogYSBnZW5lcmFsIG9iamVjdCByZWFkLiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBiZWZvcmVPcHRpbWlzdGljUmVhZChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc3NhcnkgYW5kIHJldHVybiB0aGUgcHJvcGVyIGxpZmVjeWNsZSBzdGF0ZQorICAgICAqIHByaW9yIHRvIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UgYmVpbmcgd3JpdHRlbiB3aXRoaW4KKyAgICAgKiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uIFRoZSBtdXRhdGUgcGFyYW1ldGVyIHRlbGxzIGlmIGl0IGlzIGEKKyAgICAgKiBkaXJlY3QgbXV0YXRpb24gb24gYW4gU0NPIGZpZWxkLgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPnRoaXM8L2NvZGU+IHBvaW50ZXIgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc3NhcnkgYW5kIHJldHVybiB0aGUgcHJvcGVyIGxpZmVjeWNsZSBzdGF0ZQorICAgICAqIHByaW9yIHRvIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UgYmVpbmcgd3JpdHRlbiB3aXRoaW4KKyAgICAgKiBhbiBvcHRpbWlzdGljIHRyYW5zYWN0aW9uLiBUaGUgbXV0YXRlIHBhcmFtZXRlciB0ZWxscyBpZiBpdCBpcyBhCisgICAgICogZGlyZWN0IG11dGF0aW9uIG9uIGFuIFNDTyBmaWVsZC4KKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBwb2ludGVyIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgUENTdGF0ZSBiZWZvcmVPcHRpbWlzdGljV3JpdGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBpbnQgZmllbGQsCisgICAgICAgIGJvb2xlYW4gbXV0YXRlKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzc2FyeSBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgbGlmZWN5Y2xlIHN0YXRlCisgICAgICogcHJpb3IgdG8gdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBpbnN0YW5jZSBiZWluZyB3cml0dGVuIG91dHNpZGUgb2YKKyAgICAgKiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uIFRoZSBtdXRhdGUgcGFyYW1ldGVyIHRlbGxzIGlmIGl0IGlzIGEKKyAgICAgKiBkaXJlY3QgbXV0YXRpb24gb24gYW4gU0NPIGZpZWxkLgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPnRoaXM8L2NvZGU+IHBvaW50ZXIgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBQQ1N0YXRlIGJlZm9yZU5vbnRyYW5zYWN0aW9uYWxXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHRyYW5zYWN0aW9uYWwgc3RhdGUuCisgICAgICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgbmV3IHN0YXRlLgorICAgICAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgYm9vbGVhbiBpc05ldygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBkZWxldGVkIHN0YXRlLgorICAgICAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgZGlydHkgc3RhdGUuCisgICAgICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgc3RhdGUgdGhhdCB3aWxsIGJlY29tZSB0cmFuc2FjdGlvbmFsCisgICAgICogdXBvbiB0aGUgYmVnaW4gb2YgdGhlIG5leHQgdHJhbnNhY3Rpb24uCisgICAgICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUGVuZGluZ1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgc3RhdGUgdGhhdCB3aWxsIGJlY29tZSB0cmFuc2llbnQKKyAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IHRyYW5zYWN0aW9uLgorICAgICAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgYm9vbGVhbiBpc1Byb3Zpc2lvbmFsKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHN0YXRlIHJlcXVpcmVzIGEgdmVyc2lvbiBjaGVjayB3aGVuIGJlaW5nIGZsdXNoZWQsIAorICAgICAqIGFzc3VtaW5nIHRoZSBzeXN0ZW0gaXMgY29uZmlndXJlZCBmb3IgdmVyc2lvbiBjaGVja3MuCisgICAgICovCisgICAgYm9vbGVhbiBpc1ZlcnNpb25DaGVja1JlcXVpcmVkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3cgYW4gZXJyb3Igd2l0aCBhIGxvY2FsaXplZCBtZXNzYWdlIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleS4KKyAgICAgKi8KKyAgICBQQ1N0YXRlIGVycm9yKFN0cmluZyBrZXksIFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KGtleSkpLgorICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KGNvbnRleHQuZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKQorICAgICAgICB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBQTmV3U3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUE5FVzsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBQQ2xlYW5TdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBQQ0xFQU47CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUERpcnR5U3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUERJUlRZOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBEZWxldGVkU3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUERFTEVURUQ7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUE5ld0RlbGV0ZWRTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBQTkVXREVMRVRFRDsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBQTmV3UHJvdmlzaW9uYWxTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBQTkVXUFJPVklTSU9OQUw7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUE5vblRyYW5zU3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUE5PTlRSQU5TOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBOb25UcmFuc0RpcnR5U3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUE5PTlRSQU5TRElSVFk7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUE5vblRyYW5zTmV3U3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUE5PTlRSQU5TTkVXOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBOb25UcmFuc0RlbGV0ZWRTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBQTk9OVFJBTlNERUxFVEVEOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEhvbGxvd1N0YXRlKQorICAgICAgICAgICAgcmV0dXJuIEhPTExPVzsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2llbnRTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgVENsZWFuU3RhdGUpCisgICAgICAgICAgICByZXR1cm4gVENMRUFOOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFREaXJ0eVN0YXRlKQorICAgICAgICAgICAgcmV0dXJuIFRESVJUWTsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBFQ29weVN0YXRlKQorICAgICAgICAgICAgcmV0dXJuIEVDT1BZOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEVDbGVhblN0YXRlKQorICAgICAgICAgICAgcmV0dXJuIEVDTEVBTjsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBFRGlydHlTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBFRElSVFk7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRURlbGV0ZWRTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBFREVMRVRFRDsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBFTm9uVHJhbnNTdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBFTk9OVFJBTlM7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUE5ld0ZsdXNoZWREZWxldGVkU3RhdGUpCisgICAgICAgICAgICByZXR1cm4gUE5FV0ZMVVNIRURERUxFVEVEOworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBOZXdGbHVzaGVkRGVsZXRlZEZsdXNoZWRTdGF0ZSkKKwkJCXJldHVybiBQTkVXRkxVU0hFRERFTEVURURGTFVTSEVEOworCQlpZiAodGhpcyBpbnN0YW5jZW9mIFBEZWxldGVkRmx1c2hlZFN0YXRlKQorCQkJcmV0dXJuIFBERUxFVEVERkxVU0hFRDsKKwkJdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uICgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUENsZWFuU3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BDbGVhblN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3NWMzYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BDbGVhblN0YXRlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYSBwZXJzaXN0ZW50IGluc3RhbmNlIHRoYXQgaXMgcGFydGljaXBhdGluZyBpbiB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24sIGJ1dCBoYXMgbm90IHlldCBiZWVuIG1vZGlmaWVkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFBDbGVhblN0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eShmYWxzZSk7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBIT0xMT1c7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFjayhTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEhPTExPVzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrUmVzdG9yZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFBOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGRlbGV0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5wcmVEZWxldGUoKTsKKyAgICAgICAgcmV0dXJuIFBERUxFVEVEOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFBOT05UUkFOUzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJlbGVhc2UoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBldmljdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEhPTExPVzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gUERJUlRZOworICAgIH0KKworICAgIFBDU3RhdGUgYmVmb3JlT3B0aW1pc3RpY1dyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLAorICAgICAgICBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gUERJUlRZOworICAgIH0KKworICAgIGJvb2xlYW4gaXNUcmFuc2FjdGlvbmFsKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QRGVsZXRlZEZsdXNoZWRTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUERlbGV0ZWRGbHVzaGVkU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdiNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUERlbGV0ZWRGbHVzaGVkU3RhdGUuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhIHBlcnNpc3RlbnQgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkZWxldGVkIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiwgYW5kIHRoYXQgaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgZGF0YWJhc2UuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworY2xhc3MgUERlbGV0ZWRGbHVzaGVkU3RhdGUKKyAgICBleHRlbmRzIFBEZWxldGVkU3RhdGUgeworCisgICAgUENTdGF0ZSBmbHVzaChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgUENTdGF0ZSBwZXJzaXN0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LmVyYXNlRmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFBORVc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUERlbGV0ZWRTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUERlbGV0ZWRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWM2MzUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QRGVsZXRlZFN0YXRlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYSBwZXJzaXN0ZW50IGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGVsZXRlZCBpbiB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgUERlbGV0ZWRTdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuc2F2ZUZpZWxkcyhmYWxzZSk7CisgICAgfQorCisgICAgUENTdGF0ZSBmbHVzaChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFBERUxFVEVERkxVU0hFRDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGNvbW1pdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5jbGVhckZpZWxkcygpOworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgY29tbWl0UmV0YWluKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFjayhTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEhPTExPVzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrUmVzdG9yZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZXN0b3JlRmllbGRzKCk7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSBub250cmFuc2FjdGlvbmFsKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHBlcnNpc3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiAoY29udGV4dC5nZXREaXJ0eSgpLmxlbmd0aCgpID4gMCkgPyBQRElSVFkgOiBQQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzRGVsZXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QRGlydHlTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUERpcnR5U3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI1Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUERpcnR5U3RhdGUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhIHBlcnNpc3RlbnQgaW5zdGFuY2UgdGhhdCBpcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiwgYW5kIGhhcyBiZWVuIG1vZGlmaWVkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFBEaXJ0eVN0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5zYXZlRmllbGRzKGZhbHNlKTsKKyAgICB9CisKKyAgICB2b2lkIGJlZm9yZUZsdXNoKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgYm9vbGVhbiBsb2dpY2FsLAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGNvbnRleHQucHJlRmx1c2gobG9naWNhbCwgY2FsbCk7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBIT0xMT1c7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFjayhTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEhPTExPVzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrUmVzdG9yZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZXN0b3JlRmllbGRzKCk7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSBkZWxldGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucHJlRGVsZXRlKCk7CisgICAgICAgIHJldHVybiBQREVMRVRFRDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIG5vbnRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBlcnJvcigiZGlydHkiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJlbGVhc2UoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBlcnJvcigiZGlydHkiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVmVyc2lvbkNoZWNrUmVxdWlyZWQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiAhY29udGV4dC5pc0ZsdXNoZWQoKSB8fCBjb250ZXh0LmlzRmx1c2hlZERpcnR5KCk7IAorICAgIH0KKworICAgIFBDU3RhdGUgYWZ0ZXJSZWZyZXNoKCkgeworICAgICAgICByZXR1cm4gUENMRUFOOworICAgIH0KKworICAgIFBDU3RhdGUgYWZ0ZXJPcHRpbWlzdGljUmVmcmVzaCgpIHsKKyAgICAgICAgcmV0dXJuIFBOT05UUkFOUzsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTmV3RGVsZXRlZFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTmV3RGVsZXRlZFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxZmVlOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOZXdEZWxldGVkU3RhdGUuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhbiBpbnN0YW5jZSB0aGF0IHdhcyBtYWRlIHBlcnNpc3RlbnQsIHRoZW4gZGVsZXRlZCB3aXRoaW4gdGhlCisgKiBjdXJyZW50CXRyYW5zYWN0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFBOZXdEZWxldGVkU3RhdGUKKyAgICBleHRlbmRzIFBDU3RhdGUgeworCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGNvbW1pdFJldGFpbihTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5jbGVhckZpZWxkcygpOworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcm9sbGJhY2soU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFja1Jlc3RvcmUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucmVzdG9yZUZpZWxkcygpOworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcGVyc2lzdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5lcmFzZUZsdXNoKCk7CisgICAgICAgIHJldHVybiBQTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzRGVsZXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOZXdGbHVzaGVkRGVsZXRlZEZsdXNoZWRTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5ld0ZsdXNoZWREZWxldGVkRmx1c2hlZFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMGM3MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOZXdGbHVzaGVkRGVsZXRlZEZsdXNoZWRTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBMaWZlY3ljbGUgc3RhdGUuCisgKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIHRoYXQgd2FzIG1hZGUgcGVyc2lzdGVudCB3aXRoaW4gdGhlCisgKiBjdXJyZW50CXRyYW5zYWN0aW9uLCBmbHVzaGVkLCBkZWxldGVkLCBhbmQgZmx1c2hlZC4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICovCitjbGFzcyBQTmV3Rmx1c2hlZERlbGV0ZWRGbHVzaGVkU3RhdGUKKyAgICBleHRlbmRzIFBOZXdGbHVzaGVkRGVsZXRlZFN0YXRlIHsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHBlcnNpc3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuZXJhc2VGbHVzaCgpOworICAgICAgICByZXR1cm4gUE5FVzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTmV3Rmx1c2hlZERlbGV0ZWRTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5ld0ZsdXNoZWREZWxldGVkU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjcyY2UwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5ld0ZsdXNoZWREZWxldGVkU3RhdGUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhbiBpbnN0YW5jZSB0aGF0IHdhcyBtYWRlIHBlcnNpc3RlbnQgd2l0aGluIHRoZQorICogY3VycmVudAl0cmFuc2FjdGlvbiwgZmx1c2hlZCwgYW5kIHN1YnNlcXVlbnRseSBkZWxldGVkLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK2NsYXNzIFBOZXdGbHVzaGVkRGVsZXRlZFN0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIFBDU3RhdGUgZmx1c2goU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTkVXRkxVU0hFRERFTEVURURGTFVTSEVEOworICAgIH0KKworICAgIFBDU3RhdGUgY29tbWl0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcm9sbGJhY2tSZXN0b3JlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlc3RvcmVGaWVsZHMoKTsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHBlcnNpc3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzRGVsZXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTmV3UHJvdmlzaW9uYWxTdGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5ld1Byb3Zpc2lvbmFsU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjcxOGZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5ld1Byb3Zpc2lvbmFsU3RhdGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhbiBpbnN0YW5jZSB0aGF0IHdhcyBtYWRlIHBlcnNpc3RlbnQgdmlhIHJlYWNoYWJpbGl0eSB3aXRoaW4gdGhlCisgKiBjdXJyZW50CXRyYW5zYWN0aW9uLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAYXV0aG9yOiBBYmUgV2hpdGUKKyAqLworY2xhc3MgUE5ld1Byb3Zpc2lvbmFsU3RhdGUKKyAgICBleHRlbmRzIFBDU3RhdGUgeworCisgICAgdm9pZCBpbml0aWFsaXplKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnNldExvYWRlZCh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eSh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zYXZlRmllbGRzKGZhbHNlKTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHBlcnNpc3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgbm9ucHJvdmlzaW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBib29sZWFuIGxvZ2ljYWwsIAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGNvbnRleHQucHJlRmx1c2gobG9naWNhbCwgY2FsbCk7CisgICAgICAgIHJldHVybiBQTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgY29tbWl0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgY29tbWl0UmV0YWluKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcm9sbGJhY2soU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFja1Jlc3RvcmUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucmVzdG9yZUZpZWxkcygpOworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgZGVsZXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnByZURlbGV0ZSgpOworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgcmVsZWFzZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNOZXcoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1Byb3Zpc2lvbmFsKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTmV3U3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOZXdTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjJmYjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTmV3U3RhdGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogTGlmZWN5Y2xlIHN0YXRlLgorICogUmVwcmVzZW50cyBhbiBpbnN0YW5jZSB0aGF0IHdhcyBtYWRlIHBlcnNpc3RlbnQgd2l0aGluIHRoZQorICogY3VycmVudAl0cmFuc2FjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBQTmV3U3RhdGUKKyAgICBleHRlbmRzIFBDU3RhdGUgeworCisgICAgdm9pZCBpbml0aWFsaXplKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnNldExvYWRlZCh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eSh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zYXZlRmllbGRzKGZhbHNlKTsKKyAgICB9CisKKyAgICB2b2lkIGJlZm9yZUZsdXNoKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgYm9vbGVhbiBsb2dpY2FsLAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGNvbnRleHQucHJlRmx1c2gobG9naWNhbCwgY2FsbCk7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBIT0xMT1c7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFjayhTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrUmVzdG9yZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZXN0b3JlRmllbGRzKCk7CisgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgfQorCisgICAgUENTdGF0ZSBkZWxldGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucHJlRGVsZXRlKCk7CisgICAgICAgIGlmIChjb250ZXh0LmlzRmx1c2hlZCgpKQorICAgICAgICAgICAgcmV0dXJuIFBORVdGTFVTSEVEREVMRVRFRDsKKyAgICAgICAgcmV0dXJuIFBORVdERUxFVEVEOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJuZXciLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJlbGVhc2UoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBlcnJvcigibmV3IiwgY29udGV4dCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1ZlcnNpb25DaGVja1JlcXVpcmVkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5pc0ZsdXNoZWREaXJ0eSgpOyAKKyAgICB9CisKKyAgICBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNOZXcoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5vblRyYW5zRGVsZXRlZFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTm9uVHJhbnNEZWxldGVkU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjY4NjM2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5vblRyYW5zRGVsZXRlZFN0YXRlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2UgdGhhdCB3YXMgZGVsZXRlZCBvdXRzaWRlIGEgdHJhbnNhY3Rpb24uCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGNsYXNzIFBOb25UcmFuc0RlbGV0ZWRTdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICBQQ1N0YXRlIHBlcnNpc3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgUENTdGF0ZSB0cmFuc2FjdGlvbmFsKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gUERFTEVURUQ7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVSZWFkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBlcnJvcigiZGVsZXRlZCIsIGNvbnRleHQpOworICAgIH0KKworICAgIFBDU3RhdGUgYmVmb3JlTm9udHJhbnNhY3Rpb25hbFJlYWQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVPcHRpbWlzdGljUmVhZChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRlbGV0ZWQiLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkZWxldGVkIiwgY29udGV4dCk7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVOb250cmFuc2FjdGlvbmFsV3JpdGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBpbnQgZmllbGQsCisgICAgICAgIGJvb2xlYW4gbXV0YXRlKSB7CisgICAgICAgIHJldHVybiBlcnJvcigiZGVsZXRlZCIsIGNvbnRleHQpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNQZW5kaW5nVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEZWxldGVkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOb25UcmFuc0RpcnR5U3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOb25UcmFuc0RpcnR5U3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Y1MDIxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5vblRyYW5zRGlydHlTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBMaWZlY3ljbGUgc3RhdGUuCisgKiBSZXByZXNlbnRzIGEgcGVyc2lzdGVudCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGRpcnRpZWQgb3V0c2lkZSBvZgorICogdHJhbnNhY3Rpb24uIFRoaXMgc3RhdGUgaXMgb25seSByZWFjaGFibGUgb25seSBpZiB0aGUKKyAqIFJldGFpbk5vbnRyYW5zYWN0aW9uYWwgcHJvcGVydHkgaXMgc2V0LgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK2NsYXNzIFBOb25UcmFuc0RpcnR5U3RhdGUKKyAgICBleHRlbmRzIFBDU3RhdGUgeworCisgICAgdm9pZCBpbml0aWFsaXplKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnNhdmVGaWVsZHMoZmFsc2UpOworICAgIH0KKworICAgIFBDU3RhdGUgZGVsZXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnByZURlbGV0ZSgpOworICAgICAgICByZXR1cm4gUE5PTlRSQU5TREVMRVRFRDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQRElSVFk7CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoImRpcnR5IiwgY29udGV4dCk7CisgICAgfQorCisgICAgUENTdGF0ZSBldmljdChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIEhPTExPVzsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGFmdGVyTm9udHJhbnNhY3Rpb25hbFJlZnJlc2goKSB7CisgICAgICAgIHJldHVybiBQTk9OVFJBTlM7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BlbmRpbmdUcmFuc2FjdGlvbmFsKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOb25UcmFuc05ld1N0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTm9uVHJhbnNOZXdTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzEzY2UKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9QTm9uVHJhbnNOZXdTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBMaWZlY3ljbGUgc3RhdGUuCisgKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIHRoYXQgd2FzIHBlcnNpc3RlZCBvdXRzaWRlIGEgdHJhbnNhY3Rpb24uCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworY2xhc3MgUE5vblRyYW5zTmV3U3RhdGUKKyAgICBleHRlbmRzIFBDU3RhdGUgeworCisgICAgdm9pZCBpbml0aWFsaXplKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnNldExvYWRlZCh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eSh0cnVlKTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGRlbGV0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgcmVsZWFzZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc05ldygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RpcnR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUGVuZGluZ1RyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUE5vblRyYW5zU3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOb25UcmFuc1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyOWE4YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1BOb25UcmFuc1N0YXRlLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYSBwZXJzaXN0ZW50IGluc3RhbmNlIHRoYXQgaXMgbm90IHRyYW5zYWN0aW9uYWwsIGJ1dCB0aGF0CisgKiBhbGxvd3MgYWNjZXNzIHRvIHBlcnNpc3RlbnQgZGF0YS4gVGhpcyBzdGF0ZSBpcyByZWFjaGFibGUgb25seSBpZiB0aGUKKyAqIFJldGFpblN0YXRlIHByb3BlcnR5IGlzIHNldC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBQTm9uVHJhbnNTdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChQTm9uVHJhbnNTdGF0ZS5jbGFzcyk7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuc2V0RGlydHkoZmFsc2UpOworICAgICAgICBjb250ZXh0LmNsZWFyU2F2ZWRGaWVsZHMoKTsKKworICAgICAgICAvLyBzcGVjIHNheXMgYWxsIHByb3hpZXMgdG8gc2Vjb25kIGNsYXNzIG9iamVjdHMgc2hvdWxkIGJlIHJlc2V0CisgICAgICAgIGNvbnRleHQucHJveHlGaWVsZHModHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgUENTdGF0ZSBkZWxldGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucHJlRGVsZXRlKCk7CisgICAgICAgIGlmICghY29udGV4dC5nZXRCcm9rZXIoKS5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIFBOT05UUkFOU0RFTEVURUQ7CisgICAgICAgIHJldHVybiBQREVMRVRFRDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHRyYW5zYWN0aW9uYWwoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIC8vIHN0YXRlIGlzIGRpc2NhcmRlZCB3aGVuIGVudGVyaW5nIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICBpZiAoIWNvbnRleHQuZ2V0QnJva2VyKCkuZ2V0T3B0aW1pc3RpYygpCisgICAgICAgICAgICB8fCBjb250ZXh0LmdldEJyb2tlcigpLmdldEF1dG9DbGVhcigpID09IEF1dG9DbGVhci5DTEVBUl9BTEwpCisgICAgICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgIHJldHVybiBQQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSByZWxlYXNlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gVFJBTlNJRU5UOworICAgIH0KKworICAgIFBDU3RhdGUgZXZpY3QoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBIT0xMT1c7CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVSZWFkKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkKSB7CisgICAgICAgIC8vIHN0YXRlIGlzIGRpc2NhcmRlZCB3aGVuIGVudGVyaW5nIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgIHJldHVybiBQQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSBiZWZvcmVXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGJlZm9yZVdyaXRlKGNvbnRleHQsIGZpZWxkLCBtdXRhdGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU9wdGltaXN0aWNXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0QnJva2VyKCkuZ2V0QXV0b0NsZWFyKCkgPT0gQXV0b0NsZWFyLkNMRUFSX0FMTCkKKyAgICAgICAgICAgIHJldHVybiBiZWZvcmVXcml0ZShjb250ZXh0LCBmaWVsZCwgbXV0YXRlLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIFBESVJUWTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBDU3RhdGUgYmVmb3JlV3JpdGUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0LCBpbnQgZmllbGQsCisgICAgICAgIGJvb2xlYW4gbXV0YXRlLCBib29sZWFuIG9wdGltaXN0aWMpIHsKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGRpcmVjdCBtdXRhdGlvbiBvbiBhbiBTQ08gZmllbGQsIHdlIGNhbid0IGNsZWFyIG91cgorICAgICAgICAvLyBmaWVsZHMgYmVjYXVzZSB0aGF0IHdvdWxkIGFsc28gbnVsbCB0aGUgU0NPOyBkZXBlbmRpbmcgb24gd2hldGhlcgorICAgICAgICAvLyB0aGUgdXNlciB3YXMgZGlyZWN0bHkgbWFuaXB1bGF0aW5nIHRoZSBmaWVsZCBvciB3YXMgdXNpbmcgYSBtZXRob2QsCisgICAgICAgIC8vIHRoYXQgd2lsbCByZXN1bHQgaW4gZWl0aGVyIGFuIE5QRSBvciBoYXZpbmcgdGhlIFNDTyBiZSBkZXRhY2hlZAorICAgICAgICAvLyBmcm9tIGl0cyBvd25pbmcgb2JqZWN0LCBtYWtpbmcgdGhlIHVzZXIncyBjaGFuZ2UgaGF2ZSBubyBhZmZlY3QKKworICAgICAgICBpZiAobXV0YXRlICYmICFvcHRpbWlzdGljKSB7CisgICAgICAgICAgICBMb2cgbG9nID0gY29udGV4dC5nZXRCcm9rZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9nCisgICAgICAgICAgICAgICAgKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19SVU5USU1FKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoInBlc3NpbWlzdGljLW11dGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWV0YURhdGEoKS5nZXRGaWVsZChmaWVsZCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWFuYWdlZEluc3RhbmNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbXV0YXRlKSB7CisgICAgICAgICAgICAvLyBzdGF0ZSBpcyBzdG9yZWQgZm9yIHJvbGxiYWNrIGFuZCBmaWVsZHMgYXJlIHJlbG9hZGVkCisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXREaXJ0eSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNhdmVGaWVsZHModHJ1ZSk7CisgICAgICAgICAgICBjb250ZXh0LmNsZWFyRmllbGRzKCk7CisgICAgICAgICAgICBjb250ZXh0LmxvYWQobnVsbCwgY29udGV4dC5MT0FEX0ZHUywgbnVsbCwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBESVJUWTsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZU5vbnRyYW5zYWN0aW9uYWxXcml0ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBtdXRhdGUpIHsKKyAgICAgICAgcmV0dXJuIFBOT05UUkFOU0RJUlRZOworICAgIH0KKworICAgIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2VmNGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeS5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFnZ3JlZ2F0ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5GaWx0ZXJMaXN0ZW5lcjsKKworLyoqCisgKiBPcGVuSlBBIHF1ZXJ5IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5CisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUsIFF1ZXJ5Q29udGV4dCwgUXVlcnlPcGVyYXRpb25zLCBRdWVyeUZsdXNoTW9kZXMgeworCisgICAgLyoqCisgICAgICogVGhlIGJyb2tlciB0aGF0IGdlbmVyYXRlZCB0aGlzIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBCcm9rZXIgZ2V0QnJva2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVlcnkgc3RyaW5nIG9yIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFF1ZXJ5KE9iamVjdCBxdWVyeSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGlnbm9yZSBjaGFuZ2VzIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBpZ25vcmUpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBmaWx0ZXIgbGlzdGVuZXIgZm9yIHRoZSBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJMaXN0ZW5lcihGaWx0ZXJMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBmaWx0ZXIgbGlzdGVuZXIgZnJvbSB0aGUgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyTGlzdGVuZXIoRmlsdGVyTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gYWdncmVnYXRlIGxpc3RlbmVyIGZvciB0aGUgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWdncmVnYXRlTGlzdGVuZXIoQWdncmVnYXRlTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGFnZ3JlZ2F0ZSBsaXN0ZW5lciBmcm9tIHRoZSBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBZ2dyZWdhdGVMaXN0ZW5lcihBZ2dyZWdhdGVMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhbmRpZGF0ZSBleHRlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEKKyAgICAgKiBjb2xsZWN0aW9uIHdhcyBzcGVjaWZpZWQgaW5zdGVhZCBvZiBhbiBleHRlbnQuCisgICAgICovCisgICAgcHVibGljIEV4dGVudCBnZXRDYW5kaWRhdGVFeHRlbnQoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FuZGlkYXRlIGV4dGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5kaWRhdGVFeHRlbnQoRXh0ZW50IGV4dGVudCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuZGlkYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uIGNvbGwpOworCisgICAgLyoqCisgICAgICogQ29tcGlsZSB0aGUgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGlsZSgpOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoKTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgd2l0aCBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShNYXAgcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgd2l0aCBwYXJhbWV0ZXIgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBleGVjdXRlKE9iamVjdFtdIHBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIGFsbCBvZiB0aGUgaW5zdGFuY2VzIHRoYXQgYXJlIHNhdGlzZmllZCBieSB0aGUgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHRoYXQgd2VyZSBkZWxldGVkCisgICAgICovCisgICAgcHVibGljIGxvbmcgZGVsZXRlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIGFsbCBvZiB0aGUgaW5zdGFuY2VzIHRoYXQgYXJlIHNhdGlzZmllZCBieSB0aGUgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgcG9pdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBxdWVyeQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgdGhhdCB3ZXJlIGRlbGV0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBkZWxldGVBbGwoT2JqZWN0W10gcGFyYW1ldGVycyk7CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIGFsbCBvZiB0aGUgaW5zdGFuY2VzIHRoYXQgYXJlIHNhdGlzZmllZCBieSB0aGUgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTWFwIHRoZSBuYW1lZCBwYXJhbWV0ZXIgbWFwCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGluc3RhbmNlcyB0aGF0IHdlcmUgZGVsZXRlZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGRlbGV0ZUFsbChNYXAgcGFyYW1ldGVyTWFwKTsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGFuIHVwZGF0ZSBvZiB0aGUgaW5zdGFuY2VzIHRoYXQgYXJlIHNhdGlzZmllZCBieSB0aGUgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHRoYXQgd2VyZSB1cGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyB1cGRhdGVBbGwoKTsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGFuIHVwZGF0ZSBvZiB0aGUgaW5zdGFuY2VzIHRoYXQgYXJlIHNhdGlzZmllZCBieSB0aGUgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXIgYXJyYXkKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHRoYXQgd2VyZSB1cGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyB1cGRhdGVBbGwoT2JqZWN0W10gcGFyYW1ldGVycyk7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhbiB1cGRhdGUgb2YgdGhlIGluc3RhbmNlcyB0aGF0IGFyZSBzYXRpc2ZpZWQgYnkgdGhlIHF1ZXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlck1hcCB0aGUgbmFtZWQgcGFyYW1ldGVyIG1hcAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgdGhhdCB3ZXJlIHVwZGF0ZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIHVwZGF0ZUFsbChNYXAgcGFyYW1ldGVyTWFwKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIGFsbCBvcGVuIHF1ZXJ5IHJlc3VsdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHF1ZXJ5IHJlc3VsdHMgdGhhdCBhcmUgY29uc3VtaW5nIHJlc291cmNlcy4gQWxsb3cgcmVzdWx0cyB0aGF0CisgICAgICogYXJlIG5vdCBjb25zdW1pbmcgcmVzb3VyY2VzIHRvIHJlbWFpbiBvcGVuIHNvIHRoYXQgdGhleSBjb250aW51ZSB0bworICAgICAqIGZ1bmN0aW9uIG5vcm1hbGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlUmVzb3VyY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmRzIHRoYXQgd2lsbCBiZSBzZW50IHRvCisgICAgICogdGhlIGRhdGFzdG9yZSBpbiBvcmRlciB0byBleGVjdXRlIHRoaXMgcXVlcnkuIFRoaXMgd2lsbAorICAgICAqIHR5cGljYWxseSBiZSBpbiB0aGUgbmF0aXZlIHF1ZXJ5IGxhbmd1YWdlIG9mIHRoZSBkYXRhYmFzZSAoZS5nLiwgU1FMKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIG5hbWVkIHBhcmFtZXRlciBtYXAgZm9yIHRoZSBxdWVyeSBpbnZvY2F0aW9uCisgICAgICogQHNpbmNlIDAuMy4yCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERhdGFTdG9yZUFjdGlvbnMoTWFwIHBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgcXVlcnkncyBicm9rZXIgaXMgc3RpbGwgb3Blbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRPcGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgcXVlcnkgaXMgbm90IHJlYWQtb25seS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnROb3RSZWFkT25seSgpOworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCB0aGUgcXVlcnkgaGFzIG5vdCBiZWVuIHNlcmlhbGl6ZWQsIHdoaWNoIGNhdXNlcyBpdCB0byBsb3NlCisgICAgICogaXRzIGFzc29jaWF0aW9uIHdpdGggaXRzIEJyb2tlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhc3NlcnROb3RTZXJpYWxpemVkICgpOworfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeUNvbnRleHQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTNmZmEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGlua2VkTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkZpbHRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKKworLyoqCisgKiBBIHF1ZXJ5IGV4ZWN1dGlvbiBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGludGVyZmFjZSBRdWVyeUNvbnRleHQgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBxdWVyeSBmb3IgdGhpcyBjb250ZXh0LiBOb3RlIHRoYXQgdGhlIHF1ZXJ5IHdpbGwgYmUKKyAgICAgKiB1bmF2YWlsYWJsZSBpbiByZW1vdGUgY29udGV4dHMsIGFuZCB0aGlzIG1ldGhvZCBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogdG8gdGhhdCBlZmZlY3QuCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5IGdldFF1ZXJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGVyc2lzdGVuY2UgY29udGV4dCBmb3IgdGhlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUNvbnRleHQgZ2V0U3RvcmVDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIEZldGNoQ29uZmlndXJhdGlvbiBnZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgcXVlcnkgd2lsbCBiZSBleHBlY3RlZCB0byBwZXJmb3JtLgorICAgICAqCisgICAgICogQHNlZSBRdWVyeU9wZXJhdGlvbnMKKyAgICAgKiBAc2luY2UgMC40LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IGxhbmd1YWdlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYW5kaWRhdGUgY29sbGVjdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4KKyAgICAgKiBleHRlbnQgd2FzIHNwZWNpZmllZCBpbnN0ZWFkIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDYW5kaWRhdGVDb2xsZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBvYmplY3RzIHRoYXQgdGhpcyBxdWVyeSB3aWxsIHJldHVybiwKKyAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgLyBub3QgcmVsZXZhbnQuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldENhbmRpZGF0ZVR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgcXVlcnkgcmVzdWx0cyB3aWxsIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiB0aGUgY2FuZGlkYXRlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1N1YmNsYXNzZXMoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FuZGlkYXRlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuZGlkYXRlVHlwZShDbGFzcyBjbHMsIGJvb2xlYW4gc3Vicyk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBxdWVyeSBoYXMgYmVlbiBtYXJrZWQgcmVhZC1vbmx5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHF1ZXJ5IGhhcyBiZWVuIG1hcmtlZCByZWFkLW9ubHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5pcXVlIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhhdCB0aGUgcXVlcnkgd2lsbCByZXR1cm4gb25seSAxCisgICAgICogcmVzdWx0LCByYXRoZXIgdGhhbiBhIGNvbGxlY3Rpb24uIFRoZSBleGVjdXRlIG1ldGhvZCB3aWxsIHJldHVybiBudWxsCisgICAgICogaWYgdGhlIHF1ZXJ5IHJlc3VsdCBzaXplIGlzIDAuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWUoYm9vbGVhbiB1bmlxdWUpOworCisgICAgLyoqCisgICAgICogU2NvcGUgb2YgYSBtYXBwaW5nIGZyb20gdGhlIHJlc3VsdCBkYXRhIHRvIGl0cyBvYmplY3QgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFJlc3VsdE1hcHBpbmdTY29wZSgpOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBhIG1hcHBpbmcgZnJvbSB0aGUgcmVzdWx0IGRhdGEgdG8gaXRzIG9iamVjdCByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdE1hcHBpbmdOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIGFuZCBzY29wZSBvZiBhIG1hcHBpbmcgZnJvbSB0aGUgcmVzdWx0IGRhdGEgdG8gaXRzIG9iamVjdAorICAgICAqIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdE1hcHBpbmcoQ2xhc3Mgc2NvcGUsIFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBjbGFzcyB0aGF0IGhhcyBiZWVuIHNldCB0aHJvdWdoCisgICAgICoge0BsaW5rICNzZXRSZXN1bHRUeXBlfSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSB0eXBlIG9mIG9iamVjdCBpbiB3aGljaCB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhpcyBxdWVyeS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdFR5cGUoQ2xhc3MgY2xzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgMC1iYXNlZCBzdGFydCBpbmRleCBmb3IgdGhlIHJldHVybmVkIHJlc3VsdHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRSYW5nZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAwLWJhc2VkIGV4Y2x1c2l2ZSBlbmQgaW5kZXggZm9yIHRoZSByZXR1cm5lZCByZXN1bHRzLAorICAgICAqIG9yIHtAbGluayBMb25nI01BWF9WQUxVRX0gZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEVuZFJhbmdlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJhbmdlIG9mIHJlc3VsdHMgdG8gcmV0dXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IDAtYmFzZWQgaW5jbHVzaXZlIHN0YXJ0IGluZGV4CisgICAgICogQHBhcmFtIGVuZCAwLWJhc2VkIGV4Y2x1c2l2ZSBlbmQgaW5kZXgsIG9yCisgICAgICoge0BsaW5rIExvbmcjTUFYX1ZBTFVFfSBmb3Igbm8gbGltaXQKKyAgICAgKiBAc2luY2UgMC4zLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYW5nZShsb25nIHN0YXJ0LCBsb25nIGVuZCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyRGVjbGFyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIERlY2xhcmVkIHBhcmFtZXRlcnMsIGZvciBxdWVyeSBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWNsYXJlUGFyYW1ldGVycyhTdHJpbmcgcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hcCBvZiBwYXJhbWV0ZXIgbmFtZSB0byB0eXBlIGZvciB0aGlzIHF1ZXJ5LiBUaGUgcmV0dXJuZWQKKyAgICAgKiBtYXAgd2lsbCBpdGVyYXRlIGluIHRoZSBvcmRlciB0aGF0IHRoZSBwYXJhbWV0ZXJzIHdlcmUgZGVjbGFyZWQgb3IsCisgICAgICogaWYgdGhleSdyZSBpbXBsaWNpdCwgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua2VkTWFwIGdldFBhcmFtZXRlclR5cGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHF1ZXJ5IGlzIGEgYnVsayB1cGRhdGUsIHJldHVybiBhIG1hcCBvZiB0aGUKKyAgICAgKiB7QGxpbmsgRmllbGRNZXRhRGF0YX1zIHRvIHtAbGluayBDb25zdGFudH1zLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0VXBkYXRlcygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBpZ25vcmUgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHF1ZXJ5J3MgY29tcGlsYXRpb24gc3RhdGUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb21waWxhdGlvbigpOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBxdWVyeSBpcyBub3QgYSBwcm9qZWN0aW9uIGJ1dCBwbGFjZXMgY2FuZGlkYXRlIHJlc3VsdHMgaW50byBhCisgICAgICogcmVzdWx0IGNsYXNzIHVuZGVyIGFuIGFsaWFzLCByZXR1cm4gdGhhdCBhbGlhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHF1ZXJ5IGlzIGEgcHJvamVjdGlvbiwgcmV0dXJuIHRoZSBwcm9qZWN0aW9uIGFsaWFzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFByb2plY3Rpb25BbGlhc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHF1ZXJ5IGlzIGEgcHJvamVjdGlvbiwgcmV0dXJuIHRoZSBwcm9qZWN0aW9uIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1tdIGdldFByb2plY3Rpb25UeXBlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHF1ZXJ5IGlzIGFuIGFnZ3JlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHF1ZXJ5IHVzZXMgZ3JvdXBpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzR3JvdXBpbmcoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2xhc3NlcyB0aGF0IGFmZmVjdCB0aGlzIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhW10gZ2V0QWNjZXNzUGF0aE1ldGFEYXRhcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiB0YWcsIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEZpbHRlckxpc3RlbmVyIGdldEZpbHRlckxpc3RlbmVyKFN0cmluZyB0YWcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiB0YWcsIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEFnZ3JlZ2F0ZUxpc3RlbmVyIGdldEFnZ3JlZ2F0ZUxpc3RlbmVyKFN0cmluZyB0YWcpOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBmaWx0ZXIgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEZpbHRlckxpc3RlbmVycygpOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBhZ2dyZWdhdGUgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEFnZ3JlZ2F0ZUxpc3RlbmVycygpOworCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBkZWxldGUgdGhlIG9iamVjdHMgZm91bmQgYnkgZXhlY3V0aW5nIGEgcXVlcnkgb24KKyAgICAgKiB0aGUgZ2l2ZW4gZXhlY3V0b3IuCisgICAgICovCisgICAgcHVibGljIE51bWJlciBkZWxldGVJbk1lbW9yeShTdG9yZVF1ZXJ5IHEsIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXgsIAorICAgICAgICBPYmplY3RbXSBwYXJhbXMpOworCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgdGhlIG9iamVjdHMgZm91bmQgYnkgZXhlY3V0aW5nIGEgcXVlcnkgb24KKyAgICAgKiB0aGUgZ2l2ZW4gZXhlY3V0b3IuCisgICAgICovCisgICAgcHVibGljIE51bWJlciB1cGRhdGVJbk1lbW9yeShTdG9yZVF1ZXJ5IHEsIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXgsIAorICAgICAgICBPYmplY3RbXSBwYXJhbXMpOworCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGFraW5nCisgICAgICogaW50byBhY2NvdW50IHRoZSBxdWVyeSdzIGNhbmRpZGF0ZSBwYWNrYWdlLCBhdXRvbWF0aWMgaW1wb3J0cywgYW5kCisgICAgICogdGhlIGdpdmVuIGltcG9ydHMgKGlmIGFueSkuIFJldHVybnMgbnVsbCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nW10gaW1wb3J0cyk7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSBvbiB0aGUgcXVlcnkncyBpbnRlcm5hbCBsb2NrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvY2sgKCk7IAorCisgICAgLyoqCisgICAgICogVW5sb2NrIHRoZSBxdWVyeSdzIGludGVybmFsIGxvY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2NrKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeUZsdXNoTW9kZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5Rmx1c2hNb2Rlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDk0NTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeUZsdXNoTW9kZXMuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIGRldGVybWluaW5nIHdoZW4gdG8gZmx1c2ggYmVmb3JlIHF1ZXJpZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5Rmx1c2hNb2RlcyB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBkZW5vdGluZyB0aGF0IHF1ZXJpZXMgc2hvdWxkIGZsdXNoIGRhdGEgdG8gdGhlCisgICAgICogZGF0YWJhc2UgYXV0b21hdGljYWxseSB3aGVuZXZlciBPcGVuSlBBIGRldGVybWluZXMgdGhhdCByZWxldmFudAorICAgICAqIG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIG1hZGUgYW5kIElnbm9yZUNhY2hlIGlzCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBTZWUgCisgICAgICoge0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9uI2dldEZsdXNoQmVmb3JlUXVlcmllc30KKyAgICAgKiBmb3IgbW9yZSBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMVVNIX1RSVUUgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZGVub3RpbmcgdGhhdCBxdWVyaWVzIHNob3VsZCBuZXZlciBmbHVzaCBkYXRhCisgICAgICogdG8gdGhlIGRhdGFiYXNlIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGV4ZWN1dGluZyBhIHF1ZXJ5LCBidXQKKyAgICAgKiBzaG91bGQgaW5zdGVhZCBleGVjdXRlIHF1ZXJpZXMgaW4tbWVtb3J5IGlmIG5lY2Vzc2FyeS4gU2VlCisgICAgICoge0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9uI2dldEZsdXNoQmVmb3JlUXVlcmllc30gZm9yIG1vcmUgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTFVTSF9GQUxTRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBkZW5vdGluZyB0aGF0IHF1ZXJpZXMgc2hvdWxkIGZsdXNoIGRhdGEgdG8gdGhlCisgICAgICogZGF0YWJhc2UgYXV0b21hdGljYWxseSB3aGVuIE9wZW5KUEEgZGV0ZXJtaW5lcyB0aGF0IHJlbGV2YW50CisgICAgICogbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gbWFkZSBhbmQgdGhlIGN1cnJlbnQKKyAgICAgKiBjb250ZXh0IGFscmVhZHkgaGFzIGEgZGVkaWNhdGVkIGNvbm5lY3Rpb24uIFNlZQorICAgICAqIHtAbGluayBPcGVuSlBBQ29uZmlndXJhdGlvbiNnZXRGbHVzaEJlZm9yZVF1ZXJpZXN9IGZvciBtb3JlIGluZm8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxVU0hfV0lUSF9DT05ORUNUSU9OID0gMjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5SGludHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5SGludHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2UxZTBmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUXVlcnlIaW50cy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBTdGFuZGFyZCBxdWVyeSBoaW50IGtleXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlIaW50cyB7CisgICAgCisgICAgLyoqIAorICAgICAqIEhpbnQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gb3B0aW1pemUgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJTlRfUkVTVUxUX0NPVU5UID0KKyAgICAgICAgIm9wZW5qcGEuaGludC5PcHRpbWl6ZVJlc3VsdENvdW50IjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5SW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUXVlcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlZDU2MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MaW5rZWRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuT2JqZWN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkNvbnN0YW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5MaXRlcmFsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5WYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLkVhZ2VyUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5NZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SYW5nZVJlc3VsdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLlJlc3VsdExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuUmVmZXJlbmNlSGFzaFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5SZWVudHJhbnRMb2NrOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk5vblVuaXF1ZVJlc3VsdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Ob1Jlc3VsdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBRdWVyeX0gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeUltcGwKKyAgICBpbXBsZW1lbnRzIFF1ZXJ5IHsKKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoUXVlcnlJbXBsLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9sYW5ndWFnZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0b3JlUXVlcnkgX3N0b3JlUXVlcnk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgZmluYWwgQnJva2VySW1wbCBfYnJva2VyOworICAgIHByaXZhdGUgdHJhbnNpZW50IGZpbmFsIExvZyBfbG9nOworICAgIHByaXZhdGUgdHJhbnNpZW50IENsYXNzTG9hZGVyIF9sb2FkZXIgPSBudWxsOworCisgICAgLy8gcXVlcnkgaGFzIGl0cyBvd24gaW50ZXJuYWwgbG9jaworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBfbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisKKyAgICAvLyB1bnBhcnNlZCBzdGF0ZQorICAgIHByaXZhdGUgQ2xhc3MgX2NsYXNzID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3N1YmNsYXNzZXMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfcmVhZE9ubHkgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBfcXVlcnkgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9wYXJhbXMgPSBudWxsOworCisgICAgLy8gcGFyc2VkIHN0YXRlCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29tcGlsYXRpb24gX2NvbXBpbGVkID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIF9jb21waWxpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBSZXN1bHRQYWNrZXIgX3BhY2tlciA9IG51bGw7CisKKyAgICAvLyBjYW5kaWRhdGVzCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29sbGVjdGlvbiBfY29sbGVjdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRXh0ZW50IF9leHRlbnQgPSBudWxsOworCisgICAgLy8gbGlzdGVuZXJzCisgICAgcHJpdmF0ZSBNYXAgX2ZpbHRMaXN0ZW5lcnMgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF9hZ2dMaXN0ZW5lcnMgPSBudWxsOworCisgICAgLy8gY29uZmlndXJhdGlvbiBmb3IgbG9hZGluZyBvYmplY3RzCisgICAgcHJpdmF0ZSBGZXRjaENvbmZpZ3VyYXRpb24gX2ZjID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lnbm9yZUNoYW5nZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIENsYXNzIF9yZXN1bHRNYXBwaW5nU2NvcGUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9yZXN1bHRNYXBwaW5nTmFtZSA9IG51bGw7CisKKyAgICAvLyB0aGVzZSBmaWVsZHMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkaXJlY3RseSBhZnRlciB3ZSBoYXZlIGEgY29tcGlsYXRpb24sCisgICAgLy8gYmVjYXVzZSB0aGVpciB2YWx1ZXMgbWF5IGJlIGVuY29kZWQgaW4gdGhlIHF1ZXJ5IHN0cmluZworICAgIHByaXZhdGUgQm9vbGVhbiBfdW5pcXVlID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzIF9yZXN1bHRDbGFzcyA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBfc3RhcnRJZHggPSAwOworICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgX2VuZElkeCA9IExvbmcuTUFYX1ZBTFVFOworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gX3JhbmdlU2V0ID0gZmFsc2U7CisKKyAgICAvLyByZW1lbWJlciB0aGUgbGlzdCBvZiBhbGwgdGhlIHJlc3VsdHMgd2UgaGF2ZSByZXR1cm5lZCBzbyB3ZQorICAgIC8vIGNhbiBmcmVlIHRoZWlyIHJlc291cmNlcyB3aGVuIGNsb3NlIG9yIGNsb3NlQWxsIGlzIGNhbGxlZAorICAgIHByaXZhdGUgdHJhbnNpZW50IGZpbmFsIENvbGxlY3Rpb24gX3Jlc3VsdExpc3RzID0gbmV3IFJlZmVyZW5jZUhhc2hTZXQKKyAgICAgICAgKFJlZmVyZW5jZUhhc2hTZXQuV0VBSyk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBxdWVyeSBtYW5hZ2VkIGJ5IHRoZSBnaXZlbiBicm9rZXIuCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5SW1wbChCcm9rZXIgYnJva2VyLCBTdHJpbmcgbGFuZ3VhZ2UsIFN0b3JlUXVlcnkgc3RvcmVRdWVyeSkgeworICAgICAgICBfYnJva2VyID0gKEJyb2tlckltcGwpIGJyb2tlcjsKKyAgICAgICAgX2xhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgICAgIF9zdG9yZVF1ZXJ5ID0gc3RvcmVRdWVyeTsKKyAgICAgICAgX2ZjID0gKEZldGNoQ29uZmlndXJhdGlvbikgYnJva2VyLmdldEZldGNoQ29uZmlndXJhdGlvbigpLmNsb25lKCk7CisgICAgICAgIF9sb2cgPSBicm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfUVVFUlkpOworICAgICAgICBfc3RvcmVRdWVyeS5zZXRDb250ZXh0KHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIHN0b3JlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZVF1ZXJ5IGdldFN0b3JlUXVlcnkoKSB7CisgICAgICAgIHJldHVybiBfc3RvcmVRdWVyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJva2VyIGdldEJyb2tlcigpIHsKKyAgICAgICAgcmV0dXJuIF9icm9rZXI7CisgICAgfQorCisgICAgcHVibGljIFF1ZXJ5IGdldFF1ZXJ5KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVDb250ZXh0IGdldFN0b3JlQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9icm9rZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIF9sYW5ndWFnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGdldEZldGNoQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9mYzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldElnbm9yZUNoYW5nZXMoKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9pZ25vcmVDaGFuZ2VzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIC8vIGFsbG93ZWQgbW9kaWZpY2F0aW9uOiBubyByZWFkLW9ubHkgY2hlY2sKKyAgICAgICAgICAgIF9pZ25vcmVDaGFuZ2VzID0gZmxhZzsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gX3JlYWRPbmx5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gZmxhZykgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBfcmVhZE9ubHkgPSBmbGFnOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJMaXN0ZW5lcihGaWx0ZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICAgICAgaWYgKF9maWx0TGlzdGVuZXJzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2ZpbHRMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcCg1KTsKKyAgICAgICAgICAgIF9maWx0TGlzdGVuZXJzLnB1dChsaXN0ZW5lci5nZXRUYWcoKSwgbGlzdGVuZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXJMaXN0ZW5lcihGaWx0ZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICAgICAgaWYgKF9maWx0TGlzdGVuZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2ZpbHRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyLmdldFRhZygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RmlsdGVyTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gKF9maWx0TGlzdGVuZXJzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVAorICAgICAgICAgICAgOiBfZmlsdExpc3RlbmVycy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsdGVyTGlzdGVuZXIgZ2V0RmlsdGVyTGlzdGVuZXIoU3RyaW5nIHRhZykgeworICAgICAgICAvLyBmaXJzdCBjaGVjayBsaXN0ZW5lcnMgZm9yIHRoaXMgcXVlcnkKKyAgICAgICAgaWYgKF9maWx0TGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbHRlckxpc3RlbmVyIGxpc3RlbiA9IChGaWx0ZXJMaXN0ZW5lcikgX2ZpbHRMaXN0ZW5lcnMuZ2V0KHRhZyk7CisgICAgICAgICAgICBpZiAobGlzdGVuICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHVzZXItZGVmaW5lZCBsaXN0ZW5lcnMgZnJvbSBjb25maWd1cmF0aW9uCisgICAgICAgIEZpbHRlckxpc3RlbmVyW10gY29uZkxpc3RlbmVycyA9IF9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0RmlsdGVyTGlzdGVuZXJJbnN0YW5jZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25mTGlzdGVuZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGNvbmZMaXN0ZW5lcnNbaV0uZ2V0VGFnKCkuZXF1YWxzKHRhZykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZMaXN0ZW5lcnNbaV07CisKKyAgICAgICAgLy8gY2hlY2sgc3RvcmUgbGlzdGVuZXJzCisgICAgICAgIHJldHVybiBfc3RvcmVRdWVyeS5nZXRGaWx0ZXJMaXN0ZW5lcih0YWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFnZ3JlZ2F0ZUxpc3RlbmVyKEFnZ3JlZ2F0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgICAgICBpZiAoX2FnZ0xpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9hZ2dMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcCg1KTsKKyAgICAgICAgICAgIF9hZ2dMaXN0ZW5lcnMucHV0KGxpc3RlbmVyLmdldFRhZygpLCBsaXN0ZW5lcik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFnZ3JlZ2F0ZUxpc3RlbmVyKEFnZ3JlZ2F0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgICAgICBpZiAoX2FnZ0xpc3RlbmVycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9hZ2dMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyLmdldFRhZygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QWdncmVnYXRlTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gKF9hZ2dMaXN0ZW5lcnMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUCisgICAgICAgICAgICA6IF9hZ2dMaXN0ZW5lcnMudmFsdWVzKCk7CisgICAgfQorCisgICAgcHVibGljIEFnZ3JlZ2F0ZUxpc3RlbmVyIGdldEFnZ3JlZ2F0ZUxpc3RlbmVyKFN0cmluZyB0YWcpIHsKKyAgICAgICAgLy8gZmlyc3QgY2hlY2sgbGlzdGVuZXJzIGZvciB0aGlzIHF1ZXJ5CisgICAgICAgIGlmIChfYWdnTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFnZ3JlZ2F0ZUxpc3RlbmVyIGxpc3RlbiA9IChBZ2dyZWdhdGVMaXN0ZW5lcikgX2FnZ0xpc3RlbmVycy4KKyAgICAgICAgICAgICAgICBnZXQodGFnKTsKKyAgICAgICAgICAgIGlmIChsaXN0ZW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdGVuOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgdXNlci1kZWZpbmVkIGxpc3RlbmVycyBmcm9tIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgQWdncmVnYXRlTGlzdGVuZXJbXSBjb25mTGlzdGVuZXJzID0gX2Jyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRBZ2dyZWdhdGVMaXN0ZW5lckluc3RhbmNlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZMaXN0ZW5lcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoY29uZkxpc3RlbmVyc1tpXS5nZXRUYWcoKS5lcXVhbHModGFnKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZkxpc3RlbmVyc1tpXTsKKworICAgICAgICAvLyBjaGVjayBzdG9yZSBsaXN0ZW5lcnMKKyAgICAgICAgcmV0dXJuIF9zdG9yZVF1ZXJ5LmdldEFnZ3JlZ2F0ZUxpc3RlbmVyKHRhZyk7CisgICAgfQorCisgICAgcHVibGljIEV4dGVudCBnZXRDYW5kaWRhdGVFeHRlbnQoKSB7CisgICAgICAgIC8vIGlmIGp1c3QgdGhlIGNsYXNzIGlzIHNldCwgZmV0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW50OyBpZiB0aGUKKyAgICAgICAgLy8gZXh0ZW50IGlzIGFscmVhZHkgc2V0IGJ1dCBpdHMgaWdub3JlIGNhY2hlIHNldHRpbmcgaXMgd3JvbmcsCisgICAgICAgIC8vIGdldCBhIG5ldyBleHRlbnQgd2l0aCB0aGUgY29ycmVjdCBzZXR0aW5nIChkb24ndCBtb2RpZnkgb3JpZyBleHRlbnQKKyAgICAgICAgLy8gaW4gY2FzZSB0aGUgdXNlciBoYXMgYSByZWZlcmVuY2UgdG8gaXQgYW5kIG1pZ2h0IHVzZSBpdCkKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xzID0gZ2V0Q2FuZGlkYXRlVHlwZSgpOworICAgICAgICAgICAgaWYgKF9leHRlbnQgPT0gbnVsbCAmJiBfY29sbGVjdGlvbiA9PSBudWxsICYmIF9icm9rZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNscyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX2V4dGVudCA9IF9icm9rZXIubmV3RXh0ZW50KGNscywgX3N1YmNsYXNzZXMpOworICAgICAgICAgICAgICAgIF9leHRlbnQuc2V0SWdub3JlQ2hhbmdlcyhfaWdub3JlQ2hhbmdlcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9leHRlbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIF9leHRlbnQuZ2V0SWdub3JlQ2hhbmdlcygpICE9IF9pZ25vcmVDaGFuZ2VzICYmIGNscyAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBfZXh0ZW50ID0gX2Jyb2tlci5uZXdFeHRlbnQoY2xzLCBfZXh0ZW50Lmhhc1N1YmNsYXNzZXMoKSk7CisgICAgICAgICAgICAgICAgX2V4dGVudC5zZXRJZ25vcmVDaGFuZ2VzKF9pZ25vcmVDaGFuZ2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfZXh0ZW50OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5kaWRhdGVFeHRlbnQoRXh0ZW50IGNhbmRpZGF0ZUV4dGVudCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworCisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlRXh0ZW50ID09IF9leHRlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZUV4dGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgX2V4dGVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBleHRlbnQgdGhlbiBub3QgY29sbGVjdGlvbgorICAgICAgICAgICAgX2V4dGVudCA9IGNhbmRpZGF0ZUV4dGVudDsKKyAgICAgICAgICAgIF9jb2xsZWN0aW9uID0gbnVsbDsKKworICAgICAgICAgICAgYm9vbGVhbiBpbnZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoX2V4dGVudC5nZXRFbGVtZW50VHlwZSgpICE9IF9jbGFzcykgeworICAgICAgICAgICAgICAgIF9jbGFzcyA9IF9leHRlbnQuZ2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICBfbG9hZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfZXh0ZW50Lmhhc1N1YmNsYXNzZXMoKSAhPSBfc3ViY2xhc3NlcykgeworICAgICAgICAgICAgICAgIF9zdWJjbGFzc2VzID0gX2V4dGVudC5oYXNTdWJjbGFzc2VzKCk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZSkKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29tcGlsYXRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2FuZGlkYXRlQ29sbGVjdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gX2NvbGxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuZGlkYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uIGNhbmRpZGF0ZUNvbGxlY3Rpb24pIHsKKyAgICAgICAgaWYgKCFfc3RvcmVRdWVyeS5zdXBwb3J0c0luTWVtb3J5RXhlY3V0aW9uKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoInF1ZXJ5LW5vc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgX2xhbmd1YWdlKSk7CisKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworCisgICAgICAgICAgICAvLyBpZiBjb2xsZWN0aW9uIHRoZW4gbm90IGV4dGVudAorICAgICAgICAgICAgX2NvbGxlY3Rpb24gPSBjYW5kaWRhdGVDb2xsZWN0aW9uOworICAgICAgICAgICAgaWYgKF9jb2xsZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2V4dGVudCA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRDYW5kaWRhdGVUeXBlKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBpZiAoX2NsYXNzICE9IG51bGwgfHwgX2NvbXBpbGVkICE9IG51bGwgfHwgX3F1ZXJ5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBfYnJva2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jbGFzczsKKworICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY29tcGlsYXRpb247IG1heWJlIGVuY29kZWQgaW4gc3RyaW5nCisgICAgICAgICAgICBjb21waWxlRm9yQ29tcGlsYXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBfY2xhc3M7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbmRpZGF0ZVR5cGUoQ2xhc3MgY2FuZGlkYXRlQ2xhc3MsIGJvb2xlYW4gc3VicykgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICAgICAgX2NsYXNzID0gY2FuZGlkYXRlQ2xhc3M7CisgICAgICAgICAgICBfc3ViY2xhc3NlcyA9IHN1YnM7CisgICAgICAgICAgICBfbG9hZGVyID0gbnVsbDsKKyAgICAgICAgICAgIGludmFsaWRhdGVDb21waWxhdGlvbigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJjbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gX3N1YmNsYXNzZXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHRNYXBwaW5nTmFtZSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gX3Jlc3VsdE1hcHBpbmdOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRNYXBwaW5nU2NvcGUoKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9yZXN1bHRNYXBwaW5nU2NvcGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0TWFwcGluZyhDbGFzcyBzY29wZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgX3Jlc3VsdE1hcHBpbmdTY29wZSA9IHNjb3BlOworICAgICAgICAgICAgX3Jlc3VsdE1hcHBpbmdOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIF9wYWNrZXIgPSBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgaWYgKF91bmlxdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX3VuaXF1ZS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChfcXVlcnkgPT0gbnVsbCB8fCBfY29tcGlsaW5nIHx8IF9icm9rZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNvbXBpbGF0aW9uOyBtYXliZSBlbmNvZGVkIGluIHN0cmluZworICAgICAgICAgICAgaWYgKF9jb21waWxlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tcGlsZUZvckNvbXBpbGF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKF91bmlxdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF91bmlxdWUuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vIGV4cGxpY2l0IHNldHRpbmc7IGRlZmF1bHQKKyAgICAgICAgICAgIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXggPSBjb21waWxlRm9yRXhlY3V0b3IoKTsKKyAgICAgICAgICAgIGlmICghZXguaXNBZ2dyZWdhdGUoX3N0b3JlUXVlcnkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAhZXguaGFzR3JvdXBpbmcoX3N0b3JlUXVlcnkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWUoYm9vbGVhbiB1bmlxdWUpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgICAgIF91bmlxdWUgPSAodW5pcXVlKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRUeXBlKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBpZiAoX3Jlc3VsdENsYXNzICE9IG51bGwgfHwgX2NvbXBpbGVkICE9IG51bGwgfHwgX3F1ZXJ5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBfYnJva2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHRDbGFzczsKKworICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY29tcGlsYXRpb247IG1heWJlIGVuY29kZWQgaW4gc3RyaW5nCisgICAgICAgICAgICBjb21waWxlRm9yQ29tcGlsYXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBfcmVzdWx0Q2xhc3M7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdFR5cGUoQ2xhc3MgY2xzKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgICAgIC8vIGFsbG93ZWQgbW9kaWZpY2F0aW9uOiBubyByZWFkLW9ubHkgY2hlY2sKKyAgICAgICAgICAgIF9yZXN1bHRDbGFzcyA9IGNsczsKKyAgICAgICAgICAgIF9wYWNrZXIgPSBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFJhbmdlKCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIHJldHVybiBfc3RhcnRJZHg7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RW5kUmFuZ2UoKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9lbmRJZHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmFuZ2UobG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImludmFsaWQtcmFuZ2UiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0YXJ0KSwgU3RyaW5nLnZhbHVlT2YoZW5kKSkpOworCisgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IEludGVnZXIuTUFYX1ZBTFVFICYmIGVuZCAhPSBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJyYW5nZS10b28tYmlnIiwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdGFydCksIFN0cmluZy52YWx1ZU9mKGVuZCkpKTsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICAvLyBhbGxvd2VkIG1vZGlmaWNhdGlvbjogbm8gcmVhZC1vbmx5IGNoZWNrCisgICAgICAgICAgICBfc3RhcnRJZHggPSBzdGFydDsKKyAgICAgICAgICAgIF9lbmRJZHggPSBlbmQ7CisgICAgICAgICAgICBfcmFuZ2VTZXQgPSB0cnVlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlckRlY2xhcmF0aW9uKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBpZiAoX3BhcmFtcyAhPSBudWxsIHx8IF9jb21waWxlZCAhPSBudWxsIHx8IF9jb21waWxpbmcKKyAgICAgICAgICAgICAgICB8fCBfYnJva2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJhbXM7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNvbXBpbGF0aW9uOyBtYXliZSBlbmNvZGVkIGluIHN0cmluZworICAgICAgICAgICAgY29tcGlsZUZvckNvbXBpbGF0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gX3BhcmFtczsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVjbGFyZVBhcmFtZXRlcnMoU3RyaW5nIHBhcmFtcykgeworICAgICAgICBpZiAoIV9zdG9yZVF1ZXJ5LnN1cHBvcnRzUGFyYW1ldGVyRGVjbGFyYXRpb25zKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoInF1ZXJ5LW5vc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgX2xhbmd1YWdlKSk7CisKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgICAgIF9wYXJhbXMgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKHBhcmFtcyk7CisgICAgICAgICAgICBpbnZhbGlkYXRlQ29tcGlsYXRpb24oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tcGlsZSgpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgU3RvcmVRdWVyeS5FeGVjdXRvciBleCA9IGNvbXBpbGVGb3JFeGVjdXRvcigpOworICAgICAgICAgICAgZ2V0UmVzdWx0UGFja2VyKF9zdG9yZVF1ZXJ5LCBleCk7CisgICAgICAgICAgICBleC52YWxpZGF0ZShfc3RvcmVRdWVyeSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29tcGlsYXRpb24oKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlRm9yQ29tcGlsYXRpb24oKS5zdG9yZURhdGE7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBpbGUgcXVlcnkgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBpbGF0aW9uIGNvbXBpbGVGb3JDb21waWxhdGlvbigpIHsKKyAgICAgICAgaWYgKF9jb21waWxlZCAhPSBudWxsIHx8IF9jb21waWxpbmcpCisgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVkOworCisgICAgICAgIGFzc2VydE5vdFNlcmlhbGl6ZWQoKTsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworCisgICAgICAgIGJvb2xlYW4gcmVhZE9ubHkgPSBfcmVhZE9ubHk7CisgICAgICAgIF9yZWFkT25seSA9IGZhbHNlOworICAgICAgICBfY29tcGlsaW5nID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jb21waWxlZCA9IGNvbXBpbGF0aW9uRnJvbUNhY2hlKCk7CisgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVkOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24ocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2NvbXBpbGluZyA9IGZhbHNlOworICAgICAgICAgICAgX3JlYWRPbmx5ID0gcmVhZE9ubHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBjYWNoZWQgY29tcGlsYXRpb24gZm9yIHRoZSBjdXJyZW50IHF1ZXJ5LCBjcmVhdGluZyBvbmUgaWYgaXQKKyAgICAgKiBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcGlsYXRpb24gY29tcGlsYXRpb25Gcm9tQ2FjaGUoKSB7CisgICAgICAgIE1hcCBjb21wQ2FjaGUgPQorICAgICAgICAgICAgX2Jyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UXVlcnlDb21waWxhdGlvbkNhY2hlSW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKGNvbXBDYWNoZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcGlsYXRpb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENvbXBpbGF0aW9uS2V5IGtleSA9IG5ldyBDb21waWxhdGlvbktleSgpOworICAgICAgICAgICAga2V5LnF1ZXJ5VHlwZSA9IF9zdG9yZVF1ZXJ5LmdldENsYXNzKCk7CisgICAgICAgICAgICBrZXkuY2FuZGlkYXRlVHlwZSA9IGdldENhbmRpZGF0ZVR5cGUoKTsKKyAgICAgICAgICAgIGtleS5zdWJjbGFzc2VzID0gaGFzU3ViY2xhc3NlcygpOworICAgICAgICAgICAga2V5LnF1ZXJ5ID0gZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgIGtleS5sYW5ndWFnZSA9IGdldExhbmd1YWdlKCk7CisgICAgICAgICAgICBrZXkuc3RvcmVLZXkgPSBfc3RvcmVRdWVyeS5uZXdDb21waWxhdGlvbktleSgpOworICAgICAgICAgICAgQ29tcGlsYXRpb24gY29tcCA9IChDb21waWxhdGlvbikgY29tcENhY2hlLmdldChrZXkpOworCisgICAgICAgICAgICAvLyBwYXJzZSBkZWNsYXJhdGlvbnMgaWYgbmVlZGVkCisgICAgICAgICAgICBib29sZWFuIGNhY2hlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoY29tcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tcCA9IG5ld0NvbXBpbGF0aW9uKCk7CisgICAgICAgICAgICAgICAgLy8gb25seSBjYWNoZSB0aG9zZSBxdWVyaWVzIHRoYXQgY2FuIGJlIGNvbXBpbGVkCisgICAgICAgICAgICAgICAgY2FjaGUgPSBjb21wLnN0b3JlRGF0YSAhPSBudWxsOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX3N0b3JlUXVlcnkucG9wdWxhdGVGcm9tQ29tcGlsYXRpb24oY29tcC5zdG9yZURhdGEpOworCisgICAgICAgICAgICAvLyBjYWNoZSBwYXJzZWQgc3RhdGUgaWYgbmVlZGVkCisgICAgICAgICAgICBpZiAoY2FjaGUpCisgICAgICAgICAgICAgICAgY29tcENhY2hlLnB1dChrZXksIGNvbXApOworICAgICAgICAgICAgcmV0dXJuIGNvbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBwb3B1bGF0ZSBhIG5ldyBjb21waWxhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBpbGF0aW9uIG5ld0NvbXBpbGF0aW9uKCkgeworICAgICAgICBDb21waWxhdGlvbiBjb21wID0gbmV3IENvbXBpbGF0aW9uKCk7CisgICAgICAgIGNvbXAuc3RvcmVEYXRhID0gX3N0b3JlUXVlcnkubmV3Q29tcGlsYXRpb24oKTsKKyAgICAgICAgX3N0b3JlUXVlcnkucG9wdWxhdGVGcm9tQ29tcGlsYXRpb24oY29tcC5zdG9yZURhdGEpOworICAgICAgICByZXR1cm4gY29tcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlIGZvciBleGVjdXRpb24sIGNob29zaW5nIGJldHdlZW4gZGF0YXN0b3JlIGFuZCBpbi1tZW0KKyAgICAgKiBjb21waWxhdGlvbiBiYXNlZCBvbiB3aGF0IHdlIHN1cHBvcnQgYW5kIG91ciBzZXR0aW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0b3JlUXVlcnkuRXhlY3V0b3IgY29tcGlsZUZvckV4ZWN1dG9yKCkgeworICAgICAgICBDb21waWxhdGlvbiBjb21wID0gY29tcGlsZUZvckNvbXBpbGF0aW9uKCk7CisgICAgICAgIGlmIChfY29sbGVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcC5kYXRhc3RvcmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcC5kYXRhc3RvcmU7CisgICAgICAgICAgICBpZiAoY29tcC5tZW1vcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcC5tZW1vcnk7CisgICAgICAgICAgICBpZiAoX3N0b3JlUXVlcnkuc3VwcG9ydHNEYXRhU3RvcmVFeGVjdXRpb24oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZUZvckRhdGFTdG9yZShjb21wKTsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlRm9ySW5NZW1vcnkoY29tcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcC5tZW1vcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjb21wLm1lbW9yeTsKKyAgICAgICAgaWYgKGNvbXAuZGF0YXN0b3JlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY29tcC5kYXRhc3RvcmU7CisgICAgICAgIGlmIChfc3RvcmVRdWVyeS5zdXBwb3J0c0luTWVtb3J5RXhlY3V0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZUZvckluTWVtb3J5KGNvbXApOworICAgICAgICByZXR1cm4gY29tcGlsZUZvckRhdGFTdG9yZShjb21wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gZXhwcmVzc2lvbiB0cmVlIGZvciBkYXRhc3RvcmUgZXhlY3V0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RvcmVRdWVyeS5FeGVjdXRvciBjb21waWxlRm9yRGF0YVN0b3JlKENvbXBpbGF0aW9uIGNvbXApIHsKKyAgICAgICAgaWYgKGNvbXAuZGF0YXN0b3JlID09IG51bGwpCisgICAgICAgICAgICBjb21wLmRhdGFzdG9yZSA9IGNyZWF0ZUV4ZWN1dG9yKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGNvbXAuZGF0YXN0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBleHByZXNzaW9uIHRyZWUgZm9yIGluLW1lbW9yeSBleGVjdXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGNvbXBpbGVGb3JJbk1lbW9yeShDb21waWxhdGlvbiBjb21wKSB7CisgICAgICAgIGlmIChjb21wLm1lbW9yeSA9PSBudWxsKQorICAgICAgICAgICAgY29tcC5tZW1vcnkgPSBjcmVhdGVFeGVjdXRvcih0cnVlKTsKKyAgICAgICAgcmV0dXJuIGNvbXAubWVtb3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHF1ZXJ5IGV4ZWN1dG9yIG9mIHRoZSBwcm9wZXIgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0b3JlUXVlcnkuRXhlY3V0b3IgY3JlYXRlRXhlY3V0b3IoYm9vbGVhbiBpbk1lbSkgeworICAgICAgICBhc3NlcnRDYW5kaWRhdGVUeXBlKCk7CisKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gX2Jyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSByZXBvcy5nZXRNZXRhRGF0YShfY2xhc3MsCisgICAgICAgICAgICBfYnJva2VyLmdldENsYXNzTG9hZGVyKCksIGZhbHNlKTsKKworICAgICAgICBDbGFzc01ldGFEYXRhW10gbWV0YXM7CisgICAgICAgIGlmIChfY2xhc3MgPT0gbnVsbCB8fCBfc3RvcmVRdWVyeS5zdXBwb3J0c0Fic3RyYWN0RXhlY3V0b3JzKCkpCisgICAgICAgICAgICBtZXRhcyA9IG5ldyBDbGFzc01ldGFEYXRhW117IG1ldGEgfTsKKyAgICAgICAgZWxzZSBpZiAoX3N1YmNsYXNzZXMgJiYgKG1ldGEgPT0gbnVsbCB8fCBtZXRhLmlzTWFuYWdlZEludGVyZmFjZSgpKSkKKyAgICAgICAgICAgIG1ldGFzID0gcmVwb3MuZ2V0SW1wbGVtZW50b3JNZXRhRGF0YXMoX2NsYXNzLAorICAgICAgICAgICAgICAgIF9icm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSk7CisgICAgICAgIGVsc2UgaWYgKG1ldGEgIT0gbnVsbCAmJiAoX3N1YmNsYXNzZXMgfHwgbWV0YS5pc01hcHBlZCgpKSkKKyAgICAgICAgICAgIG1ldGFzID0gbmV3IENsYXNzTWV0YURhdGFbXXsgbWV0YSB9OworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZXRhcyA9IFN0b3JlUXVlcnkuRU1QVFlfTUVUQVM7CisKKyAgICAgICAgaWYgKG1ldGFzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWltcGxzIiwgX2NsYXNzKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobWV0YXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5NZW0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3RvcmVRdWVyeS5uZXdJbk1lbW9yeUV4ZWN1dG9yKG1ldGFzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgX3N1YmNsYXNzZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBfc3RvcmVRdWVyeS5uZXdEYXRhU3RvcmVFeGVjdXRvcihtZXRhc1swXSwgX3N1YmNsYXNzZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtdWx0aXBsZSBpbXBsZW1lbnRvcnMKKyAgICAgICAgICAgIFN0b3JlUXVlcnkuRXhlY3V0b3JbXSBlcyA9IG5ldyBTdG9yZVF1ZXJ5LkV4ZWN1dG9yW21ldGFzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluTWVtKQorICAgICAgICAgICAgICAgICAgICBlc1tpXSA9IF9zdG9yZVF1ZXJ5Lm5ld0luTWVtb3J5RXhlY3V0b3IobWV0YXNbaV0sIHRydWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXNbaV0gPSBfc3RvcmVRdWVyeS5uZXdEYXRhU3RvcmVFeGVjdXRvcihtZXRhc1tpXSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lcmdlZEV4ZWN1dG9yKGVzKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFueSBjb21waWxhdGlvbiwgZm9yY2luZyB0aGlzIHF1ZXJ5IHRvIGJlIHJlY29tcGlsZWQKKyAgICAgKiBuZXh0IHRpbWUgaXQncyBleGVjdXRlZC4gVGhpcyBzaG91bGQgYmUgaW52b2tlZCB3aGVuZXZlciBhbnkKKyAgICAgKiBzdGF0ZSBjaGFuZ2VzIHRoYXQgd291bGQgY2F1c2UgdGhlIHVuZGVybHlpbmcgcXVlcnkKKyAgICAgKiByZXByZXNlbnRhdGlvbiB0byBjaGFuZ2UuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW52YWxpZGF0ZUNvbXBpbGF0aW9uKCkgeworICAgICAgICBpZiAoX2NvbXBpbGluZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgX3N0b3JlUXVlcnkuaW52YWxpZGF0ZUNvbXBpbGF0aW9uKCk7CisgICAgICAgIF9jb21waWxlZCA9IG51bGw7CisgICAgICAgIF9wYWNrZXIgPSBudWxsOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoKSB7CisgICAgICAgIHJldHVybiBleGVjdXRlKChPYmplY3RbXSkgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBleGVjdXRlKE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gZXhlY3V0ZShPUF9TRUxFQ1QsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBleGVjdXRlKE1hcCBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGUoT1BfU0VMRUNULCBwYXJhbXMpOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGV4ZWN1dGUoaW50IG9wZXJhdGlvbiwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHBhcmFtcyA9IFN0b3JlUXVlcnkuRU1QVFlfT0JKRUNUUzsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnROb3RTZXJpYWxpemVkKCk7CisgICAgICAgICAgICBfYnJva2VyLmJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICAgICAgX2Jyb2tlci5hc3NlcnROb250cmFuc2FjdGlvbmFsUmVhZCgpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0IGV4ZWN1dG9yCisgICAgICAgICAgICAgICAgQ29tcGlsYXRpb24gY29tcCA9IGNvbXBpbGVGb3JDb21waWxhdGlvbigpOworICAgICAgICAgICAgICAgIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXggPSAoaXNJbk1lbW9yeShvcGVyYXRpb24pKQorICAgICAgICAgICAgICAgICAgICA/IGNvbXBpbGVGb3JJbk1lbW9yeShjb21wKSA6IGNvbXBpbGVGb3JEYXRhU3RvcmUoY29tcCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXJzKF9zdG9yZVF1ZXJ5LCBleCwgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2dFeGVjdXRpb24ob3BlcmF0aW9uLCBleC5nZXRQYXJhbWV0ZXJUeXBlcyhfc3RvcmVRdWVyeSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworCisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBPUF9TRUxFQ1QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlKF9zdG9yZVF1ZXJ5LCBleCwgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IE9QX0RFTEVURSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZShfc3RvcmVRdWVyeSwgZXgsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBPUF9VUERBVEUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGUoX3N0b3JlUXVlcnksIGV4LCBwYXJhbXMpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX2Jyb2tlci5lbmRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZXhlY3V0ZShpbnQgb3BlcmF0aW9uLCBNYXAgcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHBhcmFtcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfYnJva2VyLmJlZ2luT3BlcmF0aW9uKHRydWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTZXJpYWxpemVkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICAgICAgICAgIF9icm9rZXIuYXNzZXJ0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKTsKKworICAgICAgICAgICAgICAgIC8vIGdldCBleGVjdXRvcgorICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uIGNvbXAgPSBjb21waWxlRm9yQ29tcGlsYXRpb24oKTsKKyAgICAgICAgICAgICAgICBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4ID0gKGlzSW5NZW1vcnkob3BlcmF0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgPyBjb21waWxlRm9ySW5NZW1vcnkoY29tcCkgOiBjb21waWxlRm9yRGF0YVN0b3JlKGNvbXApOworCisgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJyID0gKHBhcmFtcy5pc0VtcHR5KCkpID8gU3RvcmVRdWVyeS5FTVBUWV9PQkpFQ1RTIDoKKyAgICAgICAgICAgICAgICAgICAgdG9QYXJhbWV0ZXJBcnJheShleC5nZXRQYXJhbWV0ZXJUeXBlcyhfc3RvcmVRdWVyeSksIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0UGFyYW1ldGVycyhfc3RvcmVRdWVyeSwgZXgsIGFycik7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nRXhlY3V0aW9uKG9wZXJhdGlvbiwgcGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gT1BfU0VMRUNUKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZShfc3RvcmVRdWVyeSwgZXgsIGFycik7CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBPUF9ERUxFVEUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxldGUoX3N0b3JlUXVlcnksIGV4LCBhcnIpOworICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gT1BfVVBEQVRFKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlKF9zdG9yZVF1ZXJ5LCBleCwgYXJyKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9icm9rZXIuZW5kT3BlcmF0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBsb25nIGRlbGV0ZUFsbCgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZUFsbCgoT2JqZWN0W10pIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGRlbGV0ZUFsbChPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBleGVjdXRlKE9QX0RFTEVURSwgcGFyYW1zKSkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZGVsZXRlQWxsKE1hcCBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBleGVjdXRlKE9QX0RFTEVURSwgcGFyYW1zKSkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgdXBkYXRlQWxsKCkgeworICAgICAgICByZXR1cm4gdXBkYXRlQWxsKChPYmplY3RbXSkgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgdXBkYXRlQWxsKE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gKChOdW1iZXIpIGV4ZWN1dGUoT1BfVVBEQVRFLCBwYXJhbXMpKS5sb25nVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB1cGRhdGVBbGwoTWFwIHBhcmFtcykgeworICAgICAgICByZXR1cm4gKChOdW1iZXIpIGV4ZWN1dGUoT1BfVVBEQVRFLCBwYXJhbXMpKS5sb25nVmFsdWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdFtdIHRvUGFyYW1ldGVyQXJyYXkoTGlua2VkTWFwIHBhcmFtVHlwZXMsIE1hcCBwYXJhbXMpIHsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsIHx8IHBhcmFtcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gU3RvcmVRdWVyeS5FTVBUWV9PQkpFQ1RTOworCisgICAgICAgIE9iamVjdFtdIGFyciA9IG5ldyBPYmplY3RbcGFyYW1zLnNpemUoKV07CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgT2JqZWN0IGtleTsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgaW50IGJhc2UgPSAtMTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwYXJhbXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZHggPSAocGFyYW1UeXBlcyA9PSBudWxsKSA/IC0xIDogcGFyYW1UeXBlcy5pbmRleE9mKGtleSk7CisKKyAgICAgICAgICAgIC8vIGFsbG93IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhbmQgbmF0dXJhbCBvcmRlciBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKQorICAgICAgICAgICAgICAgIGFycltpZHhdID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgIGlmIChiYXNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICBiYXNlID0gcG9zaXRpb25hbFBhcmFtZXRlckJhc2UocGFyYW1zLmtleVNldCgpKTsKKyAgICAgICAgICAgICAgICBhcnJbKChOdW1iZXIpIGtleSkuaW50VmFsdWUoKSAtIGJhc2VdID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtcGFyYW0tbmFtZSIsIGtleSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlIChnZW5lcmFsbHkgMCBvciAxKSB0byB1c2UgZm9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcG9zaXRpb25hbFBhcmFtZXRlckJhc2UoQ29sbGVjdGlvbiBwYXJhbXMpIHsKKyAgICAgICAgaW50IGxvdyA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICBpbnQgdmFsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHBhcmFtcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgb2JqID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE51bWJlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIHVzZSAwIGJhc2Ugd2hlbiBwYXJhbXMgYXJlIG1peGVkIHR5cGVzCisKKyAgICAgICAgICAgIHZhbCA9ICgoTnVtYmVyKSBvYmopLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIGlmICh2YWwgPCBsb3cpCisgICAgICAgICAgICAgICAgbG93ID0gdmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsb3c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGV4ZWN1dGUgdGhpcyBxdWVyeSBpbiBtZW1vcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5NZW1vcnkoaW50IG9wZXJhdGlvbikgeworICAgICAgICAvLyBpZiBubyBjYW5kaWRhdGVzLCBjcmVhdGUgY2FuZGlkYXRlIGV4dGVudAorICAgICAgICBpZiAoX2NvbGxlY3Rpb24gPT0gbnVsbCAmJiBfZXh0ZW50ID09IG51bGwgJiYgX2NsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9leHRlbnQgPSBfYnJva2VyLm5ld0V4dGVudChfY2xhc3MsIF9zdWJjbGFzc2VzKTsKKyAgICAgICAgICAgIF9leHRlbnQuc2V0SWdub3JlQ2hhbmdlcyhfaWdub3JlQ2hhbmdlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGVyZSBhcmUgYW55IGRpcnR5IGluc3RhbmNlcyBpbiB0aGUgY3VycmVudCB0cmFucyB0aGF0IGFyZQorICAgICAgICAvLyBpbnZvbHZlZCBpbiB0aGlzIHF1ZXJ5LCB3ZSBoYXZlIHRvIGV4ZWN1dGUgaW4gbWVtb3J5IG9yIGZsdXNoCisgICAgICAgIGJvb2xlYW4gaW5NZW0gPSAhX3N0b3JlUXVlcnkuc3VwcG9ydHNEYXRhU3RvcmVFeGVjdXRpb24oKQorICAgICAgICAgICAgfHwgX2NvbGxlY3Rpb24gIT0gbnVsbDsKKyAgICAgICAgaWYgKCFpbk1lbSAmJiAoIV9pZ25vcmVDaGFuZ2VzIHx8IG9wZXJhdGlvbiAhPSBPUF9TRUxFQ1QpCisgICAgICAgICAgICAmJiBfYnJva2VyLmlzQWN0aXZlKCkgJiYgaXNBY2Nlc3NQYXRoRGlydHkoKSkgeworICAgICAgICAgICAgaW50IGZsdXNoID0gX2ZjLmdldEZsdXNoQmVmb3JlUXVlcmllcygpOworICAgICAgICAgICAgaWYgKChmbHVzaCA9PSBGTFVTSF9UUlVFCisgICAgICAgICAgICAgICAgfHwgKGZsdXNoID09IEZMVVNIX1dJVEhfQ09OTkVDVElPTiAmJiBfYnJva2VyLmhhc0Nvbm5lY3Rpb24oKSkKKyAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gIT0gT1BfU0VMRUNUCisgICAgICAgICAgICAgICAgfHwgIV9zdG9yZVF1ZXJ5LnN1cHBvcnRzSW5NZW1vcnlFeGVjdXRpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS5zdXBwb3J0ZWRPcHRpb25zKCkuCisgICAgICAgICAgICAgICAgY29udGFpbnMoT3BlbkpQQUNvbmZpZ3VyYXRpb24uT1BUSU9OX0lOQ19GTFVTSCkpIHsKKyAgICAgICAgICAgICAgICBfYnJva2VyLmZsdXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZy5pbmZvKF9sb2MuZ2V0KCJmb3JjZS1pbi1tZW0iLCBfY2xhc3MpKTsKKyAgICAgICAgICAgICAgICBpbk1lbSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5NZW0gJiYgIV9zdG9yZVF1ZXJ5LnN1cHBvcnRzSW5NZW1vcnlFeGVjdXRpb24oKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtZXhlYy1pbm1lbSIsCisgICAgICAgICAgICAgICAgX2xhbmd1YWdlKSk7CisgICAgICAgIHJldHVybiBpbk1lbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBxdWVyeSB1c2luZyB0aGUgZ2l2ZW4gY29tcGlsYXRpb24sIGV4ZWN1dG9yLCBhbmQgcGFyYW1ldGVyCisgICAgICogdmFsdWVzLiBBbGwgb3RoZXIgZXhlY3V0ZSBtZXRob2RzIGRlbGVnYXRlIHRvIHRoaXMgb25lIG9yIHRvCisgICAgICoge0BsaW5rICNleGVjdXRlKFN0b3JlUXVlcnkuRXhlY3V0b3IsTWFwKX0gYWZ0ZXIgdmFsaWRhdGlvbiBhbmQgbG9ja2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBleGVjdXRlKFN0b3JlUXVlcnkgcSwgU3RvcmVRdWVyeS5FeGVjdXRvciBleCwgCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW1wb3NzaWJsZSByZXN1bHQgcmFuZ2UsIHJldHVybiBudWxsIC8gZW1wdHkgbGlzdAorICAgICAgICBTdG9yZVF1ZXJ5LlJhbmdlIHJhbmdlID0gbmV3IFN0b3JlUXVlcnkuUmFuZ2UoX3N0YXJ0SWR4LCBfZW5kSWR4KTsKKyAgICAgICAgaWYgKCFfcmFuZ2VTZXQpCisgICAgICAgICAgICBleC5nZXRSYW5nZShxLCBwYXJhbXMsIHJhbmdlKTsKKyAgICAgICAgaWYgKHJhbmdlLnN0YXJ0ID49IHJhbmdlLmVuZCkKKyAgICAgICAgICAgIHJldHVybiBlbXB0eVJlc3VsdChxLCBleCk7CisKKyAgICAgICAgLy8gZXhlY3V0ZTsgaWYgd2UgaGF2ZSBhIHJlc3VsdCBjbGFzcyBvciB3ZSBoYXZlIG9ubHkgb25lIHJlc3VsdAorICAgICAgICAvLyBhbmQgc28gbmVlZCB0byByZW1vdmUgaXQgZnJvbSBpdHMgYXJyYXksIHdyYXAgaW4gYSBwYWNraW5nIHJvcAorICAgICAgICByYW5nZS5scnMgPSBpc0xSUyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKKyAgICAgICAgUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wID0gZXguZXhlY3V0ZVF1ZXJ5KHEsIHBhcmFtcywgcmFuZ2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRvUmVzdWx0KHEsIGV4LCByb3AsIHJhbmdlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChyb3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeyByb3AuY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7fQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgcXVlcnkgdXNpbmcgdGhlIGdpdmVuIGV4ZWN1dG9yLCBhbmQgcGFyYW1ldGVyCisgICAgICogdmFsdWVzLiBBbGwgb3RoZXIgZXhlY3V0ZSBtZXRob2RzIGRlbGVnYXRlIHRvIHRoaXMgb25lIG9yIHRvCisgICAgICoge0BsaW5rICNkZWxldGUoU3RvcmVRdWVyeS5FeGVjdXRvcixNYXApfSBhZnRlciB2YWxpZGF0aW9uIGFuZCBsb2NraW5nLgorICAgICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhIE51bWJlciBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YKKyAgICAgKiBpbnN0YW5jZXMgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE51bWJlciBkZWxldGUoU3RvcmVRdWVyeSBxLCBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4LCBPYmplY3RbXSBwYXJhbXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRCdWxrTW9kaWZ5KHEsIGV4LCBwYXJhbXMpOworICAgICAgICByZXR1cm4gZXguZXhlY3V0ZURlbGV0ZShxLCBwYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXIgZGVsZXRlSW5NZW1vcnkoU3RvcmVRdWVyeSBxLCBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4ZWN1dG9yLAorICAgICAgICBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gZXhlY3V0ZShxLCBleGVjdXRvciwgcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSkKKyAgICAgICAgICAgICAgICBvID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG8pOworCisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKENvbGxlY3Rpb24pIG8pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBzaXplKyspCisgICAgICAgICAgICAgICAgX2Jyb2tlci5kZWxldGUoaS5uZXh0KCksIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihzaXplKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgcXVlcnkgdXNpbmcgdGhlIGdpdmVuIGNvbXBpbGF0aW9uLCBleGVjdXRvciwgYW5kIHBhcmFtZXRlcgorICAgICAqIHZhbHVlcy4gQWxsIG90aGVyIGV4ZWN1dGUgbWV0aG9kcyBkZWxlZ2F0ZSB0byB0aGlzIG9uZSBvciB0bworICAgICAqIHtAbGluayAjdXBkYXRlKFN0b3JlUXVlcnkuRXhlY3V0b3IsTWFwKX0gYWZ0ZXIgdmFsaWRhdGlvbiBhbmQgbG9ja2luZy4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYSBOdW1iZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mCisgICAgICogaW5zdGFuY2VzIHVwZGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBOdW1iZXIgdXBkYXRlKFN0b3JlUXVlcnkgcSwgU3RvcmVRdWVyeS5FeGVjdXRvciBleCwgT2JqZWN0W10gcGFyYW1zKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0QnVsa01vZGlmeShxLCBleCwgcGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIGV4LmV4ZWN1dGVVcGRhdGUocSwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTnVtYmVyIHVwZGF0ZUluTWVtb3J5KFN0b3JlUXVlcnkgcSwgU3RvcmVRdWVyeS5FeGVjdXRvciBleGVjdXRvciwKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGV4ZWN1dGUocSwgZXhlY3V0b3IsIHBhcmFtcyk7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sbGVjdGlvbikpCisgICAgICAgICAgICAgICAgbyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihvKTsKKworICAgICAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChDb2xsZWN0aW9uKSBvKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgc2l6ZSsrKQorICAgICAgICAgICAgICAgIHVwZGF0ZUluTWVtb3J5KGkubmV4dCgpLCBwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihzaXplKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWVzIGZvciB0aGUgdXBkYXRlcyBpbiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2IgdGhlIHBlcnNpc3RlbnQgaW5zdGFuY2UgdG8gY2hhbmdlCisgICAgICogQHBhcmFtIHBhcmFtcyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIHF1ZXJ5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUluTWVtb3J5KE9iamVjdCBvYiwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBnZXRVcGRhdGVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IChGaWVsZE1ldGFEYXRhKSBlLmdldEtleSgpOworCisgICAgICAgICAgICBPYmplY3QgdmFsOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVmFsKSB7CisgICAgICAgICAgICAgICAgdmFsID0gKChWYWwpIHZhbHVlKS4KKyAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGUob2IsIG51bGwsIGdldFN0b3JlQ29udGV4dCgpLCBwYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKKyAgICAgICAgICAgICAgICB2YWwgPSAoKExpdGVyYWwpIHZhbHVlKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgdmFsID0gKChDb25zdGFudCkgdmFsdWUpLmdldFZhbHVlKHBhcmFtcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJvbmx5LXVwZGF0ZS1wcmltaXRpdmVzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gX2Jyb2tlci5nZXRTdGF0ZU1hbmFnZXIob2IpOworICAgICAgICAgICAgaW50IGkgPSBmbWQuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlQ2FwYWJsZSBpbnRvID0gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgb2I7CisKKyAgICAgICAgICAgIC8vIHNldCB0aGUgYWN0dWFsIGZpZWxkIGluIHRoZSBpbnN0YW5jZQorICAgICAgICAgICAgaW50IHNldCA9IE9wZW5KUEFTdGF0ZU1hbmFnZXIuU0VUX1VTRVI7CisgICAgICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nQm9vbGVhbkZpZWxkKGludG8sIGksIHNtLmZldGNoQm9vbGVhbkZpZWxkKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID09IG51bGwgPyBmYWxzZSA6ICgoQm9vbGVhbikgdmFsKS5ib29sZWFuVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgICAgIHNtLnNldHRpbmdCeXRlRmllbGQoaW50bywgaSwgc20uZmV0Y2hCeXRlRmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPT0gbnVsbCA/IDAgOiAoKE51bWJlcikgdmFsKS5ieXRlVmFsdWUoKSwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ0NoYXJGaWVsZChpbnRvLCBpLCBzbS5mZXRjaENoYXJGaWVsZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9PSBudWxsID8gMCA6IHZhbC50b1N0cmluZygpLmNoYXJBdCgwKSwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nRG91YmxlRmllbGQoaW50bywgaSwgc20uZmV0Y2hEb3VibGVGaWVsZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9PSBudWxsID8gMCA6ICgoTnVtYmVyKSB2YWwpLmRvdWJsZVZhbHVlKCksIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nRmxvYXRGaWVsZChpbnRvLCBpLCBzbS5mZXRjaEZsb2F0RmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPT0gbnVsbCA/IDAgOiAoKE51bWJlcikgdmFsKS5mbG9hdFZhbHVlKCksIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ0ludEZpZWxkKGludG8sIGksIHNtLmZldGNoSW50RmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPT0gbnVsbCA/IDAgOiAoKE51bWJlcikgdmFsKS5pbnRWYWx1ZSgpLCBzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nTG9uZ0ZpZWxkKGludG8sIGksIHNtLmZldGNoTG9uZ0ZpZWxkKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID09IG51bGwgPyAwIDogKChOdW1iZXIpIHZhbCkubG9uZ1ZhbHVlKCksIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nU2hvcnRGaWVsZChpbnRvLCBpLCBzbS5mZXRjaFNob3J0RmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPT0gbnVsbCA/IDAgOiAoKE51bWJlcikgdmFsKS5zaG9ydFZhbHVlKCksIHNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgc20uc2V0dGluZ1N0cmluZ0ZpZWxkKGludG8sIGksIHNtLmZldGNoU3RyaW5nRmllbGQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPT0gbnVsbCA/IG51bGwgOiB2YWwudG9TdHJpbmcoKSwgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5OVU1CRVI6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTl9PQko6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFX09CSjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UX09CSjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HX09CSjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQklHREVDSU1BTDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdJTlRFR0VSOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPQ0FMRToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOgorICAgICAgICAgICAgICAgICAgICBzbS5zZXR0aW5nT2JqZWN0RmllbGQoaW50bywgaSwgc20uZmV0Y2hPYmplY3RGaWVsZChpKSwgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm9ubHktdXBkYXRlLXByaW1pdGl2ZXMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFjZSBsb2cgdGhhdCB0aGUgcXVlcnkgaXMgZXhlY3V0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2dFeGVjdXRpb24oaW50IG9wLCBMaW5rZWRNYXAgdHlwZXMsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBNYXAgcG1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBwbWFwID0gbmV3IEhhc2hNYXAoKGludCkgKHBhcmFtcy5sZW5ndGggKiAxLjMzICsgMSkpOworICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMuc2l6ZSgpID09IHBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSB0eXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAgICAgcG1hcC5wdXQoaXRyLm5leHQoKSwgcGFyYW1zW2krK10pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcG1hcC5wdXQoU3RyaW5nLnZhbHVlT2YoaSksIHBhcmFtc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nRXhlY3V0aW9uKG9wLCBwbWFwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFjZSBsb2cgdGhhdCB0aGUgcXVlcnkgaXMgZXhlY3V0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2dFeGVjdXRpb24oaW50IG9wLCBNYXAgcGFyYW1zKSB7CisgICAgICAgIFN0cmluZyBzID0gX3F1ZXJ5OworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShzKSkKKyAgICAgICAgICAgIHMgPSB0b1N0cmluZygpOworCisgICAgICAgIFN0cmluZyBtc2cgPSAiZXhlY3V0aW5nLXF1ZXJ5IjsKKyAgICAgICAgaWYgKCFwYXJhbXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgbXNnICs9ICItd2l0aC1wYXJhbXMiOworCisgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQobXNnLCBzLCBwYXJhbXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgcG90ZW50aWFsIGxhcmdlIHJlc3VsdCBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTFJTKGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIGxvbmcgcmFuZ2UgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgcmV0dXJuIF9mYy5nZXRGZXRjaEJhdGNoU2l6ZSgpID49IDAKKyAgICAgICAgICAgICYmICEocmFuZ2UgPD0gX2ZjLmdldEZldGNoQmF0Y2hTaXplKCkKKyAgICAgICAgICAgIHx8IChfZmMuZ2V0RmV0Y2hCYXRjaFNpemUoKSA9PSAwICYmIHJhbmdlIDw9IDUwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBxdWVyeSByZXN1bHQgZm9yIHRoZSBnaXZlbiByZXN1bHQgb2JqZWN0IHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgdG9SZXN1bHQoU3RvcmVRdWVyeSBxLCBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4LCAKKyAgICAgICAgUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wLCBTdG9yZVF1ZXJ5LlJhbmdlIHJhbmdlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcGFjayBwcm9qZWN0aW9ucyBpZiBuZWNlc3NhcnkKKyAgICAgICAgU3RyaW5nW10gYWxpYXNlcyA9IGV4LmdldFByb2plY3Rpb25BbGlhc2VzKHEpOworICAgICAgICBpZiAoIWV4LmlzUGFja2luZyhxKSkgeworICAgICAgICAgICAgUmVzdWx0UGFja2VyIHBhY2tlciA9IGdldFJlc3VsdFBhY2tlcihxLCBleCk7CisgICAgICAgICAgICBpZiAocGFja2VyICE9IG51bGwgfHwgYWxpYXNlcy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICByb3AgPSBuZXcgUGFja2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyKHJvcCwgcGFja2VyLAorICAgICAgICAgICAgICAgICAgICBhbGlhc2VzLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBzaW5nbGUgcmVzdWx0LCBleHRyYWN0IGl0CisgICAgICAgIGlmIChfdW5pcXVlID09IEJvb2xlYW4uVFJVRSB8fCAoYWxpYXNlcy5sZW5ndGggPiAwCisgICAgICAgICAgICAmJiAhZXguaGFzR3JvdXBpbmcocSkgJiYgZXguaXNBZ2dyZWdhdGUocSkpKQorICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVJlc3VsdChyb3AsIHJhbmdlKTsKKworICAgICAgICAvLyBub3cgdGhhdCB3ZSd2ZSBleGVjdXRlZCB0aGUgcXVlcnksIHdlIGNhbiBjYWxsIGlzQWdncmVnYXRlIGFuZAorICAgICAgICAvLyBoYXNHcm91cGluZyBlZmZpY2llbnRseQorICAgICAgICBib29sZWFuIGRldGFjaCA9IChfYnJva2VyLmdldEF1dG9EZXRhY2goKSAmCisgICAgICAgICAgICBBdXRvRGV0YWNoLkRFVEFDSF9OT05UWFJFQUQpID4gMCAmJiAhX2Jyb2tlci5pc0FjdGl2ZSgpOworICAgICAgICBib29sZWFuIGxycyA9IHJhbmdlLmxycyAmJiAhZXguaXNBZ2dyZWdhdGUocSkgJiYgIWV4Lmhhc0dyb3VwaW5nKHEpOworICAgICAgICBSZXN1bHRMaXN0IHJlcyA9ICghZGV0YWNoICYmIGxycykgPyBfZmMubmV3UmVzdWx0TGlzdChyb3ApCisgICAgICAgICAgICA6IG5ldyBFYWdlclJlc3VsdExpc3Qocm9wKTsKKworICAgICAgICBfcmVzdWx0TGlzdHMuYWRkKGRlY29yYXRlUmVzdWx0TGlzdChyZXMpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpb25hbGx5IGRlY29yYXRlIHRoZSBuYXRpdmUgcmVzdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXN1bHRMaXN0IGRlY29yYXRlUmVzdWx0TGlzdChSZXN1bHRMaXN0IHJlcykgeworICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU9uQ2xvc2VSZXN1bHRMaXN0KHJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVzdWx0IHBhY2tlciBmb3IgdGhpcyBwcm9qZWN0aW9uLCBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgUmVzdWx0UGFja2VyIGdldFJlc3VsdFBhY2tlcihTdG9yZVF1ZXJ5IHEsIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXgpIHsKKyAgICAgICAgaWYgKF9wYWNrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfcGFja2VyOworCisgICAgICAgIENsYXNzIHJlc3VsdENsYXNzID0gKF9yZXN1bHRDbGFzcyAhPSBudWxsKSA/IF9yZXN1bHRDbGFzcworICAgICAgICAgICAgOiBleC5nZXRSZXN1bHRDbGFzcyhxKTsKKyAgICAgICAgaWYgKHJlc3VsdENsYXNzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmdbXSBhbGlhc2VzID0gZXguZ2V0UHJvamVjdGlvbkFsaWFzZXMocSk7CisgICAgICAgIGlmIChhbGlhc2VzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyByZXN1bHQgY2xhc3MgYnV0IG5vIHJlc3VsdDsgbWVhbnMgY2FuZGlkYXRlIGlzIGJlaW5nIHNldAorICAgICAgICAgICAgLy8gaW50byBzb21lIHJlc3VsdCBjbGFzcworICAgICAgICAgICAgX3BhY2tlciA9IG5ldyBSZXN1bHRQYWNrZXIoX2NsYXNzLCBnZXRBbGlhcygpLCByZXN1bHRDbGFzcyk7CisgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcHJvamVjdGlvbgorICAgICAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IGV4LmdldFByb2plY3Rpb25UeXBlcyhxKTsKKyAgICAgICAgICAgIF9wYWNrZXIgPSBuZXcgUmVzdWx0UGFja2VyKHR5cGVzLCBhbGlhc2VzLCByZXN1bHRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9wYWNrZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IHJlc3VsdCBmb3IgdGhpcyBxdWVyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBlbXB0eVJlc3VsdChTdG9yZVF1ZXJ5IHEsIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXgpIHsKKyAgICAgICAgaWYgKF91bmlxdWUgPT0gQm9vbGVhbi5UUlVFIHx8IChfdW5pcXVlID09IG51bGwKKyAgICAgICAgICAgICYmICFleC5oYXNHcm91cGluZyhxKSAmJiBleC5pc0FnZ3JlZ2F0ZShxKSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbiBleHBlY3RlZCBzaW5nbGUgcmVzdWx0IGZyb20gdGhlIGdpdmVuIHByb3ZpZGVyLiBVc2VkIHdoZW4KKyAgICAgKiB0aGUgcmVzdWx0IGlzIGFuIHVuZ3JvdXBlZCBhZ2dyZWdhdGUgb3IgdGhlIHVuaXF1ZSBmbGFnIGlzIHNldCB0byB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IHNpbmdsZVJlc3VsdChSZXN1bHRPYmplY3RQcm92aWRlciByb3AsIAorICAgICAgICBTdG9yZVF1ZXJ5LlJhbmdlIHJhbmdlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcm9wLm9wZW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIG1vdmUgdG8gZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgICAgICBib29sZWFuIG5leHQgPSByb3AubmV4dCgpOworCisgICAgICAgICAgICAvLyBleHRyYWN0IHNpbmdsZSByZXN1bHQ7IHRocm93IGFuIGV4Y2VwdGlvbiBpZiBtdWx0aXBsZSByZXN1bHRzCisgICAgICAgICAgICAvLyBtYXRjaCBhbmQgbm90IGNvbnN0cmFpbnRlZCBieSByYW5nZSwgb3IgaWYgYSB1bmlxdWUgcXVlcnkgd2l0aAorICAgICAgICAgICAgLy8gbm8gcmVzdWx0cworICAgICAgICAgICAgT2JqZWN0IHNpbmdsZSA9IG51bGw7CisgICAgICAgICAgICBpZiAobmV4dCkgeworICAgICAgICAgICAgICAgIHNpbmdsZSA9IHJvcC5nZXRSZXN1bHRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kICE9IHJhbmdlLnN0YXJ0ICsgMSAmJiByb3AubmV4dCgpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtdW5pcXVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jbGFzcywgX3F1ZXJ5KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF91bmlxdWUgPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEV4Y2VwdGlvbihfbG9jLmdldCgibm8tcmVzdWx0IiwgCisgICAgICAgICAgICAgICAgICAgIF9jbGFzcywgX3F1ZXJ5KSk7CisKKyAgICAgICAgICAgIC8vIGlmIHVuaXF1ZSBzZXQgdG8gZmFsc2UsIHVzZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBpZiAoX3VuaXF1ZSA9PSBCb29sZWFuLkZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuZXh0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKyAgICAgICAgICAgICAgICAvLyBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0IGlzIEpESyAxLjMsIHNvLi4uCisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdeyBzaW5nbGUgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHJldHVybiBzaW5nbGUgcmVzdWx0CisgICAgICAgICAgICByZXR1cm4gc2luZ2xlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcm9wLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgdGhlIGFjY2VzcyBwYXRoIG9mIHRoaXMgcXVlcnkgaW50ZXJzZWN0cyB3aXRoCisgICAgICogYW55IGRpcnR5IG9iamVjdHMgaW4gdGhlIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FjY2Vzc1BhdGhEaXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIGlzQWNjZXNzUGF0aERpcnR5KF9icm9rZXIsIGdldEFjY2Vzc1BhdGhNZXRhRGF0YXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWNjZXNzUGF0aERpcnR5KEJyb2tlciBicm9rZXIsCisgICAgICAgIENsYXNzTWV0YURhdGFbXSBhY2Nlc3NNZXRhcykgeworICAgICAgICBDb2xsZWN0aW9uIHBlcnNpc3RlZCA9IGJyb2tlci5nZXRQZXJzaXN0ZWRUeXBlcygpOworICAgICAgICBDb2xsZWN0aW9uIHVwZGF0ZWQgPSBicm9rZXIuZ2V0VXBkYXRlZFR5cGVzKCk7CisgICAgICAgIENvbGxlY3Rpb24gZGVsZXRlZCA9IGJyb2tlci5nZXREZWxldGVkVHlwZXMoKTsKKyAgICAgICAgaWYgKHBlcnNpc3RlZC5pc0VtcHR5KCkgJiYgdXBkYXRlZC5pc0VtcHR5KCkgJiYgZGVsZXRlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gaWYgbm8gYWNjZXNzIG1ldGFzLCBhc3N1bWUgZXZlcnkgZGlydHkgb2JqZWN0IGFmZmVjdHMgcGF0aCBqdXN0CisgICAgICAgIC8vIHRvIGJlIHNhZmUKKyAgICAgICAgaWYgKGFjY2Vzc01ldGFzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gY29tcGFyZSBkaXJ0eSBjbGFzc2VzIHRvIHRoZSBhY2Nlc3MgcGF0aCBjbGFzc2VzCisgICAgICAgIENsYXNzIGFjY0NsYXNzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjY2Vzc01ldGFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBzaG9ydGN1dCBpZiBhY3R1YWwgY2xhc3MgaXMgZGlydHkKKyAgICAgICAgICAgIGFjY0NsYXNzID0gYWNjZXNzTWV0YXNbaV0uZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgaWYgKHBlcnNpc3RlZC5jb250YWlucyhhY2NDbGFzcykgfHwgdXBkYXRlZC5jb250YWlucyhhY2NDbGFzcykKKyAgICAgICAgICAgICAgICB8fCBkZWxldGVkLmNvbnRhaW5zKGFjY0NsYXNzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGRpcnR5IHN1YmNsYXNzCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGRpcnR5ID0gcGVyc2lzdGVkLml0ZXJhdG9yKCk7IGRpcnR5Lmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgaWYgKGFjY0NsYXNzLmlzQXNzaWduYWJsZUZyb20oKENsYXNzKSBkaXJ0eS5uZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZGlydHkgPSB1cGRhdGVkLml0ZXJhdG9yKCk7IGRpcnR5Lmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgaWYgKGFjY0NsYXNzLmlzQXNzaWduYWJsZUZyb20oKENsYXNzKSBkaXJ0eS5uZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZGlydHkgPSBkZWxldGVkLml0ZXJhdG9yKCk7IGRpcnR5Lmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgaWYgKGFjY0NsYXNzLmlzQXNzaWduYWJsZUZyb20oKENsYXNzKSBkaXJ0eS5uZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vIGludGVyc2VjdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoKSB7CisgICAgICAgIGNsb3NlUmVzdWx0cyh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZVJlc291cmNlcygpIHsKKyAgICAgICAgY2xvc2VSZXN1bHRzKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBvcGVuIHJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlUmVzdWx0cyhib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKworICAgICAgICAgICAgUmVtb3ZlT25DbG9zZVJlc3VsdExpc3QgcmVzOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfcmVzdWx0TGlzdHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICByZXMgPSAoUmVtb3ZlT25DbG9zZVJlc3VsdExpc3QpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZvcmNlIHx8IHJlcy5pc1Byb3ZpZGVyT3BlbigpKQorICAgICAgICAgICAgICAgICAgICByZXMuY2xvc2UoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3Jlc3VsdExpc3RzLmNsZWFyKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKE1hcCBwYXJhbXMpIHsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgcGFyYW1zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydE5vdFNlcmlhbGl6ZWQoKTsKKyAgICAgICAgICAgIGFzc2VydE9wZW4oKTsKKworICAgICAgICAgICAgU3RvcmVRdWVyeS5FeGVjdXRvciBleCA9IGNvbXBpbGVGb3JFeGVjdXRvcigpOworICAgICAgICAgICAgT2JqZWN0W10gYXJyID0gdG9QYXJhbWV0ZXJBcnJheShleC5nZXRQYXJhbWV0ZXJUeXBlcyhfc3RvcmVRdWVyeSksCisgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcnMoX3N0b3JlUXVlcnksIGV4LCBhcnIpOworICAgICAgICAgICAgU3RvcmVRdWVyeS5SYW5nZSByYW5nZSA9IG5ldyBTdG9yZVF1ZXJ5LlJhbmdlKF9zdGFydElkeCwgX2VuZElkeCk7CisgICAgICAgICAgICBpZiAoIV9yYW5nZVNldCkKKyAgICAgICAgICAgICAgICBleC5nZXRSYW5nZShfc3RvcmVRdWVyeSwgYXJyLCByYW5nZSk7CisgICAgICAgICAgICByZXR1cm4gZXguZ2V0RGF0YVN0b3JlQWN0aW9ucyhfc3RvcmVRdWVyeSwgYXJyLCByYW5nZSk7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNldFF1ZXJ5KE9iamVjdCBxdWVyeSkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworCisgICAgICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCB8fCBxdWVyeSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGVDb21waWxhdGlvbigpOworICAgICAgICAgICAgICAgIF9xdWVyeSA9IChTdHJpbmcpIHF1ZXJ5OworICAgICAgICAgICAgICAgIGlmIChfcXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX3F1ZXJ5ID0gX3F1ZXJ5LnRyaW0oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHF1ZXJ5IGluc3RhbmNlb2YgUXVlcnlJbXBsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0b3JlUXVlcnkuc2V0UXVlcnkocXVlcnkpOworCisgICAgICAgICAgICAvLyBjb3B5IGFsbCBub24tdHJhbnNpZW50IHN0YXRlIGZyb20gdGhlIGdpdmVuIHF1ZXJ5CisgICAgICAgICAgICBpbnZhbGlkYXRlQ29tcGlsYXRpb24oKTsKKyAgICAgICAgICAgIFF1ZXJ5SW1wbCBxID0gKFF1ZXJ5SW1wbCkgcXVlcnk7CisgICAgICAgICAgICBfY2xhc3MgPSBxLl9jbGFzczsKKyAgICAgICAgICAgIF9zdWJjbGFzc2VzID0gcS5fc3ViY2xhc3NlczsKKyAgICAgICAgICAgIF9xdWVyeSA9IHEuX3F1ZXJ5OworICAgICAgICAgICAgX2lnbm9yZUNoYW5nZXMgPSBxLl9pZ25vcmVDaGFuZ2VzOworICAgICAgICAgICAgX3VuaXF1ZSA9IHEuX3VuaXF1ZTsKKyAgICAgICAgICAgIF9yZXN1bHRDbGFzcyA9IHEuX3Jlc3VsdENsYXNzOworICAgICAgICAgICAgX3BhcmFtcyA9IHEuX3BhcmFtczsKKyAgICAgICAgICAgIF9yZXN1bHRNYXBwaW5nU2NvcGUgPSBxLl9yZXN1bHRNYXBwaW5nU2NvcGU7CisgICAgICAgICAgICBfcmVzdWx0TWFwcGluZ05hbWUgPSBxLl9yZXN1bHRNYXBwaW5nTmFtZTsKKyAgICAgICAgICAgIF9yZWFkT25seSA9IHEuX3JlYWRPbmx5OworCisgICAgICAgICAgICAvLyBkb24ndCBzaGFyZSBtdXRhYmxlIG9iamVjdHMKKyAgICAgICAgICAgIF9mYy5jb3B5KHEuX2ZjKTsKKyAgICAgICAgICAgIGlmIChxLl9maWx0TGlzdGVuZXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2ZpbHRMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcChxLl9maWx0TGlzdGVuZXJzKTsKKyAgICAgICAgICAgIGlmIChxLl9hZ2dMaXN0ZW5lcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfYWdnTGlzdGVuZXJzID0gbmV3IEhhc2hNYXAocS5fYWdnTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSBjb21waWxlRm9yRXhlY3V0b3IoKS5nZXRBbGlhcyhfc3RvcmVRdWVyeSk7CisgICAgICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhbGlhcyA9IFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKF9jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9qZWN0aW9uQWxpYXNlcygpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVGb3JFeGVjdXRvcigpLmdldFByb2plY3Rpb25BbGlhc2VzKF9zdG9yZVF1ZXJ5KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENsYXNzW10gZ2V0UHJvamVjdGlvblR5cGVzKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZUZvckV4ZWN1dG9yKCkuZ2V0UHJvamVjdGlvblR5cGVzKF9zdG9yZVF1ZXJ5KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPcGVyYXRpb24oKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlRm9yRXhlY3V0b3IoKS5nZXRPcGVyYXRpb24oX3N0b3JlUXVlcnkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVGb3JFeGVjdXRvcigpLmlzQWdncmVnYXRlKF9zdG9yZVF1ZXJ5KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzR3JvdXBpbmcoKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlRm9yRXhlY3V0b3IoKS5oYXNHcm91cGluZyhfc3RvcmVRdWVyeSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhW10gZ2V0QWNjZXNzUGF0aE1ldGFEYXRhcygpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzID0gY29tcGlsZUZvckV4ZWN1dG9yKCkuCisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzUGF0aE1ldGFEYXRhcyhfc3RvcmVRdWVyeSk7CisgICAgICAgICAgICByZXR1cm4gKG1ldGFzID09IG51bGwpID8gU3RvcmVRdWVyeS5FTVBUWV9NRVRBUyA6IG1ldGFzOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlua2VkTWFwIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZUZvckV4ZWN1dG9yKCkuZ2V0UGFyYW1ldGVyVHlwZXMoX3N0b3JlUXVlcnkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTWFwIGdldFVwZGF0ZXMoKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlRm9yRXhlY3V0b3IoKS5nZXRVcGRhdGVzKF9zdG9yZVF1ZXJ5KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9jaygpIHsKKyAgICAgICAgaWYgKF9icm9rZXIgPT0gbnVsbCB8fCBfYnJva2VyLmdldE11bHRpdGhyZWFkZWQoKSkKKyAgICAgICAgICAgIF9sb2NrLmxvY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIGlmIChfbG9jay5pc0xvY2tlZCgpKQorICAgICAgICAgICAgX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vCisgICAgLy8gVXRpbHMKKyAgICAvLy8vLy8vLy8KKworICAgIHB1YmxpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGltcG9ydHMpIHsKKyAgICAgICAgLy8gZnVsbCBjbGFzcyBuYW1lIG9yIHByaW1pdGl2ZSB0eXBlPworICAgICAgICBDbGFzcyB0eXBlID0gdG9DbGFzcyhuYW1lKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworCisgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRoZSBhbGlhc2VzIG1hcCBpbiB0aGUgTWV0YURhdGFSZXBvc2l0b3J5CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IChfY2xhc3MgPT0gbnVsbCkgPyBfbG9hZGVyCisgICAgICAgICAgICA6IF9jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuZ2V0TWV0YURhdGEobmFtZSwgbG9hZGVyLCBmYWxzZSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbWV0YS5nZXREZXNjcmliZWRUeXBlKCk7CisKKyAgICAgICAgLy8gdHJ5IHRoZSBuYW1lIGluIHRoZSBwYWNrYWdlIG9mIHRoZSBjYW5kaWRhdGUgY2xhc3MKKyAgICAgICAgaWYgKF9jbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBfY2xhc3MuZ2V0TmFtZSgpLnN1YnN0cmluZworICAgICAgICAgICAgICAgICgwLCBfY2xhc3MuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCcuJykgKyAxKSArIG5hbWU7CisgICAgICAgICAgICB0eXBlID0gdG9DbGFzcyhmdWxsTmFtZSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJ5IGphdmEubGFuZworICAgICAgICB0eXBlID0gdG9DbGFzcygiamF2YS5sYW5nLiIgKyBuYW1lKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworCisgICAgICAgIC8vIHRyeSBlYWNoIGltcG9ydAorICAgICAgICBpZiAoaW1wb3J0cyAhPSBudWxsICYmIGltcG9ydHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgU3RyaW5nIGRvdE5hbWUgPSAiLiIgKyBuYW1lOworICAgICAgICAgICAgU3RyaW5nIGltcG9ydE5hbWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbXBvcnROYW1lID0gaW1wb3J0c1tpXTsKKworICAgICAgICAgICAgICAgIC8vIGZ1bGwgY2xhc3MgbmFtZSBpbXBvcnQKKyAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZS5lbmRzV2l0aChkb3ROYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRvQ2xhc3MoaW1wb3J0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkOyBzdHJpcCB0byBwYWNrYWdlCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0TmFtZS5lbmRzV2l0aCgiLioiKSkgeworICAgICAgICAgICAgICAgICAgICBpbXBvcnROYW1lID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICgwLCBpbXBvcnROYW1lLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0b0NsYXNzKGltcG9ydE5hbWUgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgQ2xhc3N9IGZvciB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBuYW1lIG5vdCB2YWxpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIHRvQ2xhc3MoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKF9sb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIF9sb2FkZXIgPSBfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihfY2xhc3MsIF9icm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5ncy50b0NsYXNzKG5hbWUsIF9sb2FkZXIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0T3BlbigpIHsKKyAgICAgICAgaWYgKF9icm9rZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF9icm9rZXIuYXNzZXJ0T3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdFJlYWRPbmx5KCkgeworICAgICAgICBpZiAoX3JlYWRPbmx5KQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgicmVhZC1vbmx5IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdFNlcmlhbGl6ZWQoKSB7CisgICAgICAgIGlmIChfYnJva2VyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJzZXJpYWxpemVkIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgYSBjYW5kaWRhdGUgY2xhc3MgaGFzIGJlZW4gc2V0IGZvciB0aGUgcXVlcnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENhbmRpZGF0ZVR5cGUoKSB7CisgICAgICAgIGlmIChfY2xhc3MgPT0gbnVsbCAmJiBfc3RvcmVRdWVyeS5yZXF1aXJlc0NhbmRpZGF0ZVR5cGUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWNsYXNzIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgd2UgYXJlIGluIGEgc3RhdGUgdG8gYmUgYWJsZSB0byBwZXJmb3JtIGEgYnVsayBvcGVyYXRpb247CisgICAgICogYWxzbyBmbHVzaCB0aGUgY3VycmVudCBtb2RmaWNhdGlvbnMgaWYgYW55IGVsZW1lbnRzIGFyZSBjdXJyZW50bHkgZGlydHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEJ1bGtNb2RpZnkoU3RvcmVRdWVyeSBxLCBTdG9yZVF1ZXJ5LkV4ZWN1dG9yIGV4LCAKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIF9icm9rZXIuYXNzZXJ0QWN0aXZlVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKF9zdGFydElkeCAhPSAwIHx8IF9lbmRJZHggIT0gTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm8tbW9kaWZ5LXJhbmdlIikpOworICAgICAgICBpZiAoX3Jlc3VsdENsYXNzICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm8tbW9kaWZ5LXJlc3VsdGNsYXNzIikpOworICAgICAgICBTdG9yZVF1ZXJ5LlJhbmdlIHJhbmdlID0gbmV3IFN0b3JlUXVlcnkuUmFuZ2UoKTsKKyAgICAgICAgZXguZ2V0UmFuZ2UocSwgcGFyYW1zLCByYW5nZSk7CisgICAgICAgIGlmIChyYW5nZS5zdGFydCAhPSAwIHx8IHJhbmdlLmVuZCAhPSBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1tb2RpZnktcmFuZ2UiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzIG1hdGNoIHRoZSBkZWNsYXJhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UGFyYW1ldGVycyhTdG9yZVF1ZXJ5IHEsIFN0b3JlUXVlcnkuRXhlY3V0b3IgZXgsIAorICAgICAgICBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFxLnJlcXVpcmVzUGFyYW1ldGVyRGVjbGFyYXRpb25zKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTGlua2VkTWFwIHBhcmFtVHlwZXMgPSBleC5nZXRQYXJhbWV0ZXJUeXBlcyhxKTsKKyAgICAgICAgaW50IHR5cGVDb3VudCA9IHBhcmFtVHlwZXMuc2l6ZSgpOworICAgICAgICBpZiAodHlwZUNvdW50ID4gcGFyYW1zLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bmJvdW5kLXBhcmFtcyIsCisgICAgICAgICAgICAgICAgcGFyYW1UeXBlcy5rZXlTZXQoKSkpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHBhcmFtVHlwZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpdHIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICgoKENsYXNzKSBlbnRyeS5nZXRWYWx1ZSgpKS5pc1ByaW1pdGl2ZSgpICYmIHBhcmFtc1tpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJudWxsLXByaW1pdGl2ZS1wYXJhbSIsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcig2NCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlF1ZXJ5OiAiKS5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIjsgY2FuZGlkYXRlIGNsYXNzOiAiKS5hcHBlbmQoX2NsYXNzKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiOyBxdWVyeTogIikuYXBwZW5kKF9xdWVyeSk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJ1Y3Qgb2YgY29tcGlsZWQgcXVlcnkgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbXBpbGF0aW9uIHsKKworICAgICAgICBwdWJsaWMgU3RvcmVRdWVyeS5FeGVjdXRvciBtZW1vcnkgPSBudWxsOworICAgICAgICBwdWJsaWMgU3RvcmVRdWVyeS5FeGVjdXRvciBkYXRhc3RvcmUgPSBudWxsOworICAgICAgICBwdWJsaWMgT2JqZWN0IHN0b3JlRGF0YSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RydWN0IHRvIGhvbGQgdGhlIHVucGFyc2VkIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcGlsYXRpb25LZXkKKyAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgICAgIHB1YmxpYyBDbGFzcyBxdWVyeVR5cGUgPSBudWxsOworICAgICAgICBwdWJsaWMgQ2xhc3MgY2FuZGlkYXRlVHlwZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1YmNsYXNzZXMgPSB0cnVlOworICAgICAgICBwdWJsaWMgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgcHVibGljIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7CisgICAgICAgIHB1YmxpYyBPYmplY3Qgc3RvcmVLZXkgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcnMgPSAxNzsKKyAgICAgICAgICAgIHJzID0gMzcgKiBycyArICgocXVlcnlUeXBlID09IG51bGwpID8gMCA6IHF1ZXJ5VHlwZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIHJzID0gMzcgKiBycyArICgocXVlcnkgPT0gbnVsbCkgPyAwIDogcXVlcnkuaGFzaENvZGUoKSk7CisgICAgICAgICAgICBycyA9IDM3ICogcnMgKyAoKGxhbmd1YWdlID09IG51bGwpID8gMCA6IGxhbmd1YWdlLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgcnMgPSAzNyAqIHJzICsgKChzdG9yZUtleSA9PSBudWxsKSA/IDAgOiBzdG9yZUtleS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG90aGVyID09IG51bGwgfHwgb3RoZXIuZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgQ29tcGlsYXRpb25LZXkga2V5ID0gKENvbXBpbGF0aW9uS2V5KSBvdGhlcjsKKyAgICAgICAgICAgIGlmIChrZXkucXVlcnlUeXBlICE9IHF1ZXJ5VHlwZQorICAgICAgICAgICAgICAgIHx8ICFTdHJpbmdVdGlscy5lcXVhbHMoa2V5LnF1ZXJ5LCBxdWVyeSkKKyAgICAgICAgICAgICAgICB8fCAhU3RyaW5nVXRpbHMuZXF1YWxzKGtleS5sYW5ndWFnZSwgbGFuZ3VhZ2UpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCFPYmplY3RVdGlscy5lcXVhbHMoa2V5LnN0b3JlS2V5LCBzdG9yZUtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAvLyBhbGxvdyBlaXRoZXIgY2FuZGlkYXRlIHR5cGUgdG8gYmUgbnVsbCBiZWNhdXNlIGl0IG1pZ2h0IGJlCisgICAgICAgICAgICAvLyBlbmNvZGVkIGluIHRoZSBxdWVyeSBzdHJpbmcsIGJ1dCBpZiBib3RoIGFyZSBzZXQgdGhlbiB0aGV5CisgICAgICAgICAgICAvLyBtdXN0IGJlIGVxdWFsCisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPSBudWxsICYmIGtleS5jYW5kaWRhdGVUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVR5cGUgPT0ga2V5LmNhbmRpZGF0ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiYgc3ViY2xhc3NlcyA9PSBrZXkuc3ViY2xhc3NlczsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1lcmdlZCBleGVjdXRvciBleGVjdXRlcyBtdWx0aXBsZSBRdWVyaWVzIGFuZCByZXR1cm5zCisgICAgICogYSBtZXJnZWQgcmVzdWx0IGxpc3Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3JkZXJpbmcgKGlmIG1vcmUgdGhhbgorICAgICAqIG9uZSBxdWVyeSBuZWVkcyB0byBiZSBleGVjdXRlZCkuIFRoaXMgZXhlY3V0b3IgaGFzIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBsaW1pdGF0aW9uczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGNhbm5vdCBjb21iaW5lIGFnZ3JlZ2F0ZXMuCisgICAgICogPGxpPkl0IGNhbm5vdCBjb2xsYXRlIHRoZSByZXN1bHQgbGlzdHMgaWYgb3JkZXJpbmcgaXMgc3BlY2lmaWVkIGFuZAorICAgICAqIGEgcmVzdWx0IHN0cmluZyBpcyBnaXZlbiwgYnV0IGRvZXMgbm90IGluY2x1ZGUgdGhlIG9yZGVyaW5nCisgICAgICogY3JpdGVyaWEuPC9saT4KKyAgICAgKiA8bGk+SXQgY2Fubm90IGZpbHRlciBkdXBsaWNhdGUgcmVzdWx0cyBmcm9tIGRpZmZlcmVudCByZXN1bHQgbGlzdHMgaWYKKyAgICAgKiB0aGUgcmVzdWx0IGlzIG1hcmtlZCBkaXN0aW5jdC4gVGhpcyB3b3VsZCByZXF1aXJlIHRyYWNraW5nIGFsbAorICAgICAqIHByZXZpb3VzIHJlc3VsdHMsIHdoaWNoIHdvdWxkIGludGVyZmVyZSB3aXRoIGxhcmdlIHJlc3VsdCBzZXQKKyAgICAgKiBoYW5kbGluZy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICAgICAqIEBub2phdmFkb2MKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXJnZWRFeGVjdXRvcgorICAgICAgICBpbXBsZW1lbnRzIFN0b3JlUXVlcnkuRXhlY3V0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RvcmVRdWVyeS5FeGVjdXRvcltdIF9leGVjdXRvcnM7CisKKyAgICAgICAgcHVibGljIE1lcmdlZEV4ZWN1dG9yKFN0b3JlUXVlcnkuRXhlY3V0b3JbXSBleGVjdXRvcnMpIHsKKyAgICAgICAgICAgIF9leGVjdXRvcnMgPSBleGVjdXRvcnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgZXhlY3V0ZVF1ZXJ5KFN0b3JlUXVlcnkgcSwKKyAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcywgU3RvcmVRdWVyeS5SYW5nZSByYW5nZSkgeworICAgICAgICAgICAgaWYgKF9leGVjdXRvcnMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRvcnNbMF0uZXhlY3V0ZVF1ZXJ5KHEsIHBhcmFtcywgcmFuZ2UpOworCisgICAgICAgICAgICAvLyB1c2UgbHJzIHNldHRpbmdzIGlmIHdlIGNvdWxkbid0IHRha2UgYWR2YW50YWdlIG9mIHRoZSBzdGFydCBpbmRleAorICAgICAgICAgICAgLy8gc28gdGhhdCBob3BlZnVsbHkgdGhlIHNraXAgdG8gdGhlIHN0YXJ0IHdpbGwgYmUgZWZmaWNpZW50CisgICAgICAgICAgICBTdG9yZVF1ZXJ5LlJhbmdlIHJvcFJhbmdlID0gbmV3IFN0b3JlUXVlcnkuUmFuZ2UoMCwgcmFuZ2UuZW5kKTsKKyAgICAgICAgICAgIHJvcFJhbmdlLmxycyA9IHJhbmdlLmxycyB8fCAocmFuZ2Uuc3RhcnQgPiAwICYmIHEuZ2V0Q29udGV4dCgpLgorICAgICAgICAgICAgICAgIGdldEZldGNoQ29uZmlndXJhdGlvbigpLmdldEZldGNoQmF0Y2hTaXplKCkgPj0gMCk7CisKKyAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHF1ZXJ5OyB3ZSBjYW5ub3QgdXNlIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmVzdWx0CisgICAgICAgICAgICAvLyByYW5nZSwgYnV0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgdXBwZXIgYm91bmQKKyAgICAgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyW10gcm9wcyA9CisgICAgICAgICAgICAgICAgbmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyW19leGVjdXRvcnMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2V4ZWN1dG9ycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByb3BzW2ldID0gX2V4ZWN1dG9yc1tpXS5leGVjdXRlUXVlcnkocSwgcGFyYW1zLCByb3BSYW5nZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW5bXSBhc2MgPSBfZXhlY3V0b3JzWzBdLmdldEFzY2VuZGluZyhxKTsKKyAgICAgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcDsKKyAgICAgICAgICAgIGlmIChhc2MubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcm9wID0gbmV3IE1lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyKHJvcHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJvcCA9IG5ldyBPcmRlcmluZ01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyKHJvcHMsIGFzYywKKyAgICAgICAgICAgICAgICAgICAgX2V4ZWN1dG9ycywgcSwgcGFyYW1zKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBsb3dlciBib3VuZCwgd3JhcCBpbiByYW5nZSByb3AKKyAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydCAhPSAwKQorICAgICAgICAgICAgICAgIHJvcCA9IG5ldyBSYW5nZVJlc3VsdE9iamVjdFByb3ZpZGVyKHJvcCwgcmFuZ2Uuc3RhcnQsIAorICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQpOworICAgICAgICAgICAgcmV0dXJuIHJvcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOdW1iZXIgZXhlY3V0ZURlbGV0ZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAgICAgbG9uZyBudW0gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXhlY3V0b3JzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIG51bSArPSBfZXhlY3V0b3JzW2ldLmV4ZWN1dGVEZWxldGUocSwgcGFyYW1zKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YobnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOdW1iZXIgZXhlY3V0ZVVwZGF0ZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAgICAgbG9uZyBudW0gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXhlY3V0b3JzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIG51bSArPSBfZXhlY3V0b3JzW2ldLmV4ZWN1dGVVcGRhdGUocSwgcGFyYW1zKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YobnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgU3RvcmVRdWVyeS5SYW5nZSByYW5nZSkgeworICAgICAgICAgICAgaWYgKF9leGVjdXRvcnMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRvcnNbMF0uZ2V0RGF0YVN0b3JlQWN0aW9ucyhxLCBwYXJhbXMsIHJhbmdlKTsKKworICAgICAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdChfZXhlY3V0b3JzLmxlbmd0aCk7CisgICAgICAgICAgICBTdG9yZVF1ZXJ5LlJhbmdlIHJvcFJhbmdlID0gbmV3IFN0b3JlUXVlcnkuUmFuZ2UoMEwsIHJhbmdlLmVuZCk7CisgICAgICAgICAgICBTdHJpbmdbXSBhY3Rpb25zOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXhlY3V0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWN0aW9ucyA9IF9leGVjdXRvcnNbaV0uZ2V0RGF0YVN0b3JlQWN0aW9ucyhxLCBwYXJhbXMscm9wUmFuZ2UpOworICAgICAgICAgICAgICAgIGlmIChhY3Rpb25zICE9IG51bGwgJiYgYWN0aW9ucy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGFjdGlvbnMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIF9leGVjdXRvcnNbMF0udmFsaWRhdGUocSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnZXRSYW5nZShTdG9yZVF1ZXJ5IHEsIE9iamVjdFtdIHBhcmFtcywgCisgICAgICAgICAgICBTdG9yZVF1ZXJ5LlJhbmdlIHJhbmdlKSB7CisgICAgICAgICAgICBfZXhlY3V0b3JzWzBdLmdldFJhbmdlKHEsIHBhcmFtcywgcmFuZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPcmRlcmluZ1ZhbHVlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgT2JqZWN0IHJlc3VsdE9iamVjdCwgaW50IGlkeCkgeworICAgICAgICAgICAgLy8gdW5mb3J0dW5hdGVseSwgYXQgdGhpcyBwb2ludCAobXVzdCBiZSBhIG1lcmdlZCByb3AgY29udGFpbmluZworICAgICAgICAgICAgLy8gb3RoZXIgbWVyZ2VkIHJvcHMpIHdlIGhhdmUgbm8gaWRlYSB3aGljaCBleGVjdXRvciB0byBleHRyYWN0CisgICAgICAgICAgICAvLyB0aGUgdmFsdWUgZnJvbQorICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRvcnNbMF0uZ2V0T3JkZXJpbmdWYWx1ZShxLCBwYXJhbXMsIHJlc3VsdE9iamVjdCwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuW10gZ2V0QXNjZW5kaW5nKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRvcnNbMF0uZ2V0QXNjZW5kaW5nKHEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXhlY3V0b3JzWzBdLmdldEFsaWFzKHEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFByb2plY3Rpb25BbGlhc2VzKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRvcnNbMF0uZ2V0UHJvamVjdGlvbkFsaWFzZXMocSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0Q2xhc3MoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4ZWN1dG9yc1swXS5nZXRSZXN1bHRDbGFzcyhxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc1tdIGdldFByb2plY3Rpb25UeXBlcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXhlY3V0b3JzWzBdLmdldFByb2plY3Rpb25UeXBlcyhxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2luZyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXhlY3V0b3JzWzBdLmlzUGFja2luZyhxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhW10gZ2V0QWNjZXNzUGF0aE1ldGFEYXRhcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIGlmIChfZXhlY3V0b3JzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBfZXhlY3V0b3JzWzBdLmdldEFjY2Vzc1BhdGhNZXRhRGF0YXMocSk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBzZXQgb2YgYmFzZSBjbGFzcyBtZXRhZGF0YXMgaW4gYWNjZXNzIHBhdGgKKyAgICAgICAgICAgIExpc3QgbWV0YXMgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXhlY3V0b3JzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIG1ldGFzID0gRmlsdGVycy5hZGRBY2Nlc3NQYXRoTWV0YURhdGFzKG1ldGFzLCBfZXhlY3V0b3JzW2ldLgorICAgICAgICAgICAgICAgICAgICBnZXRBY2Nlc3NQYXRoTWV0YURhdGFzKHEpKTsKKyAgICAgICAgICAgIGlmIChtZXRhcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBTdG9yZVF1ZXJ5LkVNUFRZX01FVEFTOworICAgICAgICAgICAgcmV0dXJuIChDbGFzc01ldGFEYXRhW10pIG1ldGFzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IENsYXNzTWV0YURhdGFbbWV0YXMuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZShTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIGlmICghX2V4ZWN1dG9yc1swXS5pc0FnZ3JlZ2F0ZShxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIHdlIGNhbid0IG1lcmdlIGFnZ3JlZ2F0ZXMKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgibWVyZ2VkLWFnZ3JlZ2F0ZSIsCisgICAgICAgICAgICAgICAgcS5nZXRDb250ZXh0KCkuZ2V0Q2FuZGlkYXRlVHlwZSgpLAorICAgICAgICAgICAgICAgIHEuZ2V0Q29udGV4dCgpLmdldFF1ZXJ5U3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKFN0b3JlUXVlcnkgcSkgeworICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRvcnNbMF0uZ2V0T3BlcmF0aW9uKHEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzR3JvdXBpbmcoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4ZWN1dG9yc1swXS5oYXNHcm91cGluZyhxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaW5rZWRNYXAgZ2V0UGFyYW1ldGVyVHlwZXMoU3RvcmVRdWVyeSBxKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4ZWN1dG9yc1swXS5nZXRQYXJhbWV0ZXJUeXBlcyhxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXAgZ2V0VXBkYXRlcyhTdG9yZVF1ZXJ5IHEpIHsKKyAgICAgICAgICAgIHJldHVybiBfZXhlY3V0b3JzWzBdLmdldFVwZGF0ZXMocSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgb2JqZWN0IHByb3ZpZGVyIHRoYXQgcGFja3MgcmVzdWx0cyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFja2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgICAgIGltcGxlbWVudHMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzdWx0T2JqZWN0UHJvdmlkZXIgX2RlbGVnYXRlOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3VsdFBhY2tlciBfcGFja2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBfbGVuOworCisgICAgICAgIHB1YmxpYyBQYWNraW5nUmVzdWx0T2JqZWN0UHJvdmlkZXIoUmVzdWx0T2JqZWN0UHJvdmlkZXIgZGVsZWdhdGUsCisgICAgICAgICAgICBSZXN1bHRQYWNrZXIgcGFja2VyLCBpbnQgcmVzdWx0TGVuZ3RoKSB7CisgICAgICAgICAgICBfZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgICAgIF9wYWNrZXIgPSBwYWNrZXI7CisgICAgICAgICAgICBfbGVuID0gcmVzdWx0TGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbGVnYXRlLnN1cHBvcnRzUmFuZG9tQWNjZXNzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvcGVuKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX2RlbGVnYXRlLm9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0T2JqZWN0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0IG9iID0gX2RlbGVnYXRlLmdldFJlc3VsdE9iamVjdCgpOworICAgICAgICAgICAgaWYgKF9wYWNrZXIgPT0gbnVsbCAmJiBfbGVuID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuICgoT2JqZWN0W10pIG9iKVswXTsKKyAgICAgICAgICAgIGlmIChfcGFja2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iOworICAgICAgICAgICAgaWYgKF9sZW4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX3BhY2tlci5wYWNrKG9iKTsKKyAgICAgICAgICAgIHJldHVybiBfcGFja2VyLnBhY2soKE9iamVjdFtdKSBvYik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhYnNvbHV0ZShpbnQgcG9zKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFic29sdXRlKHBvcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gX2RlbGVnYXRlLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX2RlbGVnYXRlLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgX2RlbGVnYXRlLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgbGlzdCB0aGF0IHJlbW92ZXMgaXRzZWxmIGZyb20gdGhlIHF1ZXJ5J3Mgb3BlbiByZXN1bHQgbGlzdAorICAgICAqIHdoZW4gaXQgaXMgY2xvc2VkLiBQdWJsaWMgZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlbW92ZU9uQ2xvc2VSZXN1bHRMaXN0CisgICAgICAgIGltcGxlbWVudHMgUmVzdWx0TGlzdCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRMaXN0IF9yZXM7CisKKyAgICAgICAgcHVibGljIFJlbW92ZU9uQ2xvc2VSZXN1bHRMaXN0KFJlc3VsdExpc3QgcmVzKSB7CisgICAgICAgICAgICBfcmVzID0gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlc3VsdExpc3QgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdmlkZXJPcGVuKCkgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuaXNQcm92aWRlck9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuaXNDbG9zZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgY2xvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShib29sZWFuIHJlbW92ZSkgeworICAgICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBfcmVzLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoIXJlbW92ZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHN0YW5kYXJkIF9yZXN1bHRMaXN0cy5yZW1vdmUgbWV0aG9kIGIvYyByZWxpZXMgb24KKyAgICAgICAgICAgICAgICAvLyBjb2xsZWN0aW9uIGVxdWFsaXR5LCB3aGljaCByZWxpZXMgb24gZWxlbWVudCBlcXVhbGl0eSwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBtZWFucyB3ZSBlbmQgdXAgdHJhdmVyc2luZyBlbnRpcmUgcmVzdWx0IGxpc3RzIQorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX3Jlc3VsdExpc3RzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdHIubmV4dCgpID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuY29udGFpbnMobyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy50b0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy50b0FycmF5KGEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5hZGQobyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLnJlbW92ZShvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuY29udGFpbnNBbGwoYyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5hZGRBbGwoYyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGlkeCwgQ29sbGVjdGlvbiBjKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5hZGRBbGwoaWR4LCBjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLnJlbW92ZUFsbChjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLnJldGFpbkFsbChjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgX3Jlcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGlkeCkgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuZ2V0KGlkeCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaWR4LCBPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuc2V0KGlkeCwgbyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGlkeCwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIF9yZXMuYWRkKGlkeCwgbyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaWR4KSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5yZW1vdmUoaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIF9yZXMuaW5kZXhPZihvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmxhc3RJbmRleE9mKG8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBpZHgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmxpc3RJdGVyYXRvcihpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLnN1Ykxpc3Qoc3RhcnQsIGVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVzLmVxdWFscyhvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlcy5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQorCQl7CisJCQlyZXR1cm4gX3Jlcy50b1N0cmluZyAoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlICgpCisJCXsKKwkJCXJldHVybiBfcmVzOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUXVlcnlMYW5ndWFnZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5TGFuZ3VhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzZDlkMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1F1ZXJ5TGFuZ3VhZ2VzLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5FeHByZXNzaW9uUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5TZXJ2aWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb25zdGFudHMgYW5kIHV0aWxpdGllcyBmb3IgcXVlcnkgbGFuZ3VhZ2VzLgorICovCitwdWJsaWMgY2xhc3MgUXVlcnlMYW5ndWFnZXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19TUUwgPSAib3BlbmpwYS5TUUwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfTUVUSE9EUUwgPSAib3BlbmpwYS5NZXRob2RRTCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgX2V4cHJlc3Npb25QYXJzZXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBMb2FkIGFuZCBjYWNoZSBhbGwgdGhlIHF1ZXJ5IGxhbmd1YWdlcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4KKyAgICAgICAgQ2xhc3NbXSBjbGFzc2VzID0gU2VydmljZXMuZ2V0SW1wbGVtZW50b3JDbGFzc2VzKAorICAgICAgICAgICAgRXhwcmVzc2lvblBhcnNlci5jbGFzcywgRXhwcmVzc2lvblBhcnNlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uUGFyc2VyIGVwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBlcCA9IChFeHByZXNzaW9uUGFyc2VyKSBjbGFzc2VzW2ldLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZXhwcmVzc2lvblBhcnNlcnMucHV0KGVwLmdldExhbmd1YWdlKCksIGVwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIEV4cHJlc3Npb25QYXJzZXJ9IGZvciA8Y29kZT5sYW5ndWFnZTwvY29kZT4sIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZXhwcmVzc2lvbiBwYXJzZXIgZXhpc3RzIGluIHRoZSBzeXN0ZW0gZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBsYW5ndWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25QYXJzZXIgcGFyc2VyRm9yTGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgICAgIHJldHVybiAoRXhwcmVzc2lvblBhcnNlcikgX2V4cHJlc3Npb25QYXJzZXJzLmdldChsYW5ndWFnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUXVlcnlPcGVyYXRpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9RdWVyeU9wZXJhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjk2YzIwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUXVlcnlPcGVyYXRpb25zLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIFF1ZXJ5IG9wZXJhdGlvbiBjb25zdGFudHMuCisgKgorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlPcGVyYXRpb25zIHsKKworICAgIC8qKgorICAgICAqIFN5bWJvbGljIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBxdWVyeSB3aWxsIGJlCisgICAgICogcGVyZm9ybWluZyBhIHNlbGVjdCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlIFF1ZXJ5Q29udGV4dCNnZXRPcGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TRUxFQ1QgPSAxOworCisgICAgLyoqCisgICAgICogU3ltYm9saWMgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHF1ZXJ5IHdpbGwgYmUKKyAgICAgKiBwZXJmb3JtaW5nIGEgZGVsZXRlIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgUXVlcnlDb250ZXh0I2dldE9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0RFTEVURSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTeW1ib2xpYyBjb25zdGFudCB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMgcXVlcnkgd2lsbCBiZQorICAgICAqIHBlcmZvcm1pbmcgYSB1cGRhdGUgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHNlZSBRdWVyeUNvbnRleHQjZ2V0T3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVVBEQVRFID0gMzsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1JPUFN0b3JlTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUk9QU3RvcmVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjNDgyMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1JPUFN0b3JlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworCisvKioKKyAqIFdyYXBzIHRoZSBuYXRpdmUgc3RvcmUgbWFuYWdlciB0byBoYW5kbGUgY2FsbHMgdXNpbmcgY3VzdG9tCisgKiB7QGxpbmsgUENSZXN1bHRPYmplY3RQcm92aWRlcn1zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFJPUFN0b3JlTWFuYWdlcgorICAgIGV4dGVuZHMgRGVsZWdhdGluZ1N0b3JlTWFuYWdlciB7CisKKyAgICBwdWJsaWMgUk9QU3RvcmVNYW5hZ2VyKFN0b3JlTWFuYWdlciBkZWxlZ2F0ZSkgeworICAgICAgICBzdXBlcihkZWxlZ2F0ZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgUENSZXN1bHRPYmplY3RQcm92aWRlcikKKyAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICByZXR1cm4gc3VwZXIuZXhpc3RzKHNtLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIFBDU3RhdGUgc3RhdGUsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBQQ1Jlc3VsdE9iamVjdFByb3ZpZGVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoUENSZXN1bHRPYmplY3RQcm92aWRlcikgY29udGV4dCkuaW5pdGlhbGl6ZShzbSwgc3RhdGUsIGZldGNoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmluaXRpYWxpemUoc20sIHN0YXRlLCBmZXRjaCwgY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3luY1ZlcnNpb24oT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gdGhlIG9ubHkgd2F5IHRoaXMgZ2V0cyBjYWxsZWQgd2l0aCBhIHJvcCBjb250ZXh0IGlzIGlmIHRoZQorICAgICAgICAvLyByb3AgZGlkbid0IGxvYWQgYW55IHZlcnNpb24gaW5mbyBvbiBpbml0aWFsaXplLCBzbyBqdXN0IG51bGwKKyAgICAgICAgLy8gaXQgb3V0IHNvIHdlIGRvbid0IGdldCB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBvdXIgZGVsZWdhdGUKKyAgICAgICAgLy8gZXhwZWN0ZXMgYSBkaWZmZXJlbnQgY29udGV4dCB0eXBlCisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgUENSZXN1bHRPYmplY3RQcm92aWRlcikKKyAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICByZXR1cm4gc3VwZXIuc3luY1ZlcnNpb24oc20sIGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyB0aGUgb25seSB3YXkgdGhpcyBnZXRzIGNhbGxlZCB3aXRoIGEgcm9wIGNvbnRleHQgaXMgaWYgdGhlCisgICAgICAgIC8vIHJvcCBkaWRuJ3QgbG9hZCB0aGUgZmllbGQgb24gaW5pdGlhbGl6ZSwgc28ganVzdCBudWxsCisgICAgICAgIC8vIGl0IG91dCBzbyB3ZSBkb24ndCBnZXQgdW5leHBlY3RlZCByZXN1bHRzIHdoZW4gb3VyIGRlbGVnYXRlCisgICAgICAgIC8vIGV4cGVjdGVzIGEgZGlmZmVyZW50IGNvbnRleHQgdHlwZQorICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFBDUmVzdWx0T2JqZWN0UHJvdmlkZXIpCisgICAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWQoc20sIGZpZWxkcywgZmV0Y2gsIGxvY2tMZXZlbCwgY29udGV4dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUmVzdG9yZVN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9SZXN0b3JlU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQyZTUwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvUmVzdG9yZVN0YXRlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIFN0YXRlIHJlc3RvcmUgY29uc3RhbnRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGludGVyZmFjZSBSZXN0b3JlU3RhdGUgeworCisgICAgLyoqCisgICAgICogRG8gbm90IHJlc3RvcmUgYW55IHN0YXRlIG9uIHJvbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlIGltbXV0YWJsZSBzdGF0ZSBvbiByb2xsYmFjazsgY2xlYXIgbXV0YWJsZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUT1JFX0lNTVVUQUJMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlIGFsbCBzdGF0ZSBvbiByb2xsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUT1JFX0FMTCA9IDI7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9SZXN1bHRQYWNrZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1Jlc3VsdFBhY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTY0YzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9SZXN1bHRQYWNrZXIuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHBhY2sgcmVzdWx0cyBpbnRvIHRoZSByZXN1bHQgY2xhc3Mgc2V0IG9uIHRoZSBxdWVyeS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFJlc3VsdFBhY2tlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChSZXN1bHRQYWNrZXIuY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBfc3RkVHlwZXMgPSBuZXcgSGFzaFNldCgpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgX3N0ZFR5cGVzLmFkZChPYmplY3RbXS5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgX3N0ZFR5cGVzLmFkZChNYXAuY2xhc3MpOworICAgICAgICBfc3RkVHlwZXMuYWRkKEhhc2hNYXAuY2xhc3MpOworICAgICAgICBfc3RkVHlwZXMuYWRkKENoYXJhY3Rlci5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoQm9vbGVhbi5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoQnl0ZS5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoU2hvcnQuY2xhc3MpOworICAgICAgICBfc3RkVHlwZXMuYWRkKEludGVnZXIuY2xhc3MpOworICAgICAgICBfc3RkVHlwZXMuYWRkKExvbmcuY2xhc3MpOworICAgICAgICBfc3RkVHlwZXMuYWRkKEZsb2F0LmNsYXNzKTsKKyAgICAgICAgX3N0ZFR5cGVzLmFkZChEb3VibGUuY2xhc3MpOworICAgICAgICBfc3RkVHlwZXMuYWRkKFN0cmluZy5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoQmlnSW50ZWdlci5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoQmlnRGVjaW1hbC5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoRGF0ZS5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoamF2YS5zcWwuRGF0ZS5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoamF2YS5zcWwuVGltZS5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzKTsKKyAgICAgICAgX3N0ZFR5cGVzLmFkZChDYWxlbmRhci5jbGFzcyk7CisgICAgICAgIF9zdGRUeXBlcy5hZGQoR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgX3Jlc3VsdENsYXNzOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX2FsaWFzZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBNZW1iZXJbXSBfc2V0czsKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBfcHV0OworICAgIHByaXZhdGUgZmluYWwgQ29uc3RydWN0b3IgX2NvbnN0cnVjdG9yOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHJlc3VsdCBjbGFzcyB3aXRob3V0IGEgcHJvamVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0UGFja2VyKENsYXNzIGNhbmRpZGF0ZSwgU3RyaW5nIGFsaWFzLCBDbGFzcyByZXN1bHRDbGFzcykgeworICAgICAgICB0aGlzKGNhbmRpZGF0ZSwgbnVsbCwgbmV3IFN0cmluZ1tdeyBhbGlhcyB9LCByZXN1bHRDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHN0YW5kYXJkIHByb2plY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZXMgdGhlIHByb2plY3Rpb24gdmFsdWUgdHlwZXMKKyAgICAgKiBAcGFyYW0gYWxpYXNlcyB0aGUgYWxpYXMgZm9yIGVhY2ggcHJvamVjdGlvbiB2YWx1ZQorICAgICAqIEBwYXJhbSByZXN1bHRDbGFzcyB0aGUgY2xhc3MgdG8gcGFjayBpbnRvCisgICAgICovCisgICAgcHVibGljIFJlc3VsdFBhY2tlcihDbGFzc1tdIHR5cGVzLCBTdHJpbmdbXSBhbGlhc2VzLCBDbGFzcyByZXN1bHRDbGFzcykgeworICAgICAgICB0aGlzKG51bGwsIHR5cGVzLCBhbGlhc2VzLCByZXN1bHRDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXN1bHRQYWNrZXIoQ2xhc3MgY2FuZGlkYXRlLCBDbGFzc1tdIHR5cGVzLCBTdHJpbmdbXSBhbGlhc2VzLAorICAgICAgICBDbGFzcyByZXN1bHRDbGFzcykgeworICAgICAgICBfYWxpYXNlcyA9IGFsaWFzZXM7CisgICAgICAgIGlmIChyZXN1bHRDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBhc3NlcnRDb252ZXJ0YWJsZShjYW5kaWRhdGUsIHR5cGVzLCByZXN1bHRDbGFzcyk7CisgICAgICAgICAgICBfcmVzdWx0Q2xhc3MgPSBGaWx0ZXJzLndyYXAocmVzdWx0Q2xhc3MpOworICAgICAgICAgICAgX3NldHMgPSBudWxsOworICAgICAgICAgICAgX3B1dCA9IG51bGw7CisgICAgICAgICAgICBfY29uc3RydWN0b3IgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKCFfc3RkVHlwZXMuY29udGFpbnMoX3Jlc3VsdENsYXNzID0gcmVzdWx0Q2xhc3MpKSB7CisgICAgICAgICAgICAvLyBjaGVjayBmb3IgYSBjb25zdHJ1Y3RvciB0aGF0IG1hdGNoZXMgdGhlIHByb2plY3Rpb24gdHlwZXMKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPSBudWxsOworICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnMgPSBfcmVzdWx0Q2xhc3MuZ2V0Q29uc3RydWN0b3IodHlwZXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2NvbnN0cnVjdG9yID0gY29uczsKKworICAgICAgICAgICAgaWYgKGNvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBfcmVzdWx0Q2xhc3MuZ2V0TWV0aG9kcygpOworICAgICAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gX3Jlc3VsdENsYXNzLmdldEZpZWxkcygpOworICAgICAgICAgICAgICAgIF9wdXQgPSBmaW5kUHV0KG1ldGhvZHMpOworICAgICAgICAgICAgICAgIF9zZXRzID0gbmV3IE1lbWJlclthbGlhc2VzLmxlbmd0aF07CisKKyAgICAgICAgICAgICAgICBDbGFzcyB0eXBlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICh0eXBlcyA9PSBudWxsKSA/IGNhbmRpZGF0ZSA6IHR5cGVzW2ldOworICAgICAgICAgICAgICAgICAgICBfc2V0c1tpXSA9IGZpbmRTZXQoYWxpYXNlc1tpXSwgdHlwZSwgZmllbGRzLCBtZXRob2RzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9zZXRzW2ldID09IG51bGwgJiYgX3B1dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDbGFzcywgYWxpYXNlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyA9PSBudWxsID8gbnVsbCA6IEFycmF5cy5hc0xpc3QodHlwZXMpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfc2V0cyA9IG51bGw7CisgICAgICAgICAgICAgICAgX3B1dCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MgIT0gTWFwLmNsYXNzICYmIHJlc3VsdENsYXNzICE9IEhhc2hNYXAuY2xhc3MKKyAgICAgICAgICAgICAgICAmJiByZXN1bHRDbGFzcyAhPSBPYmplY3RbXS5jbGFzcykKKyAgICAgICAgICAgICAgICBhc3NlcnRDb252ZXJ0YWJsZShjYW5kaWRhdGUsIHR5cGVzLCByZXN1bHRDbGFzcyk7CisgICAgICAgICAgICBfc2V0cyA9IG51bGw7CisgICAgICAgICAgICBfcHV0ID0gbnVsbDsKKyAgICAgICAgICAgIF9jb25zdHJ1Y3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDb252ZXJ0YWJsZShDbGFzcyBjYW5kaWRhdGUsIENsYXNzW10gdHlwZXMsCisgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKSB7CisgICAgICAgIENsYXNzIGMgPSAodHlwZXMgPT0gbnVsbCkgPyBjYW5kaWRhdGUgOiB0eXBlc1swXTsKKyAgICAgICAgaWYgKCh0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCAhPSAxKSB8fCAoYyAhPSBudWxsCisgICAgICAgICAgICAmJiBjICE9IE9iamVjdC5jbGFzcyAmJiAhRmlsdGVycy5jYW5Db252ZXJ0KGMsIHJlc3VsdENsYXNzLCB0cnVlKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1jb252ZXJ0LXJlc3VsdCIsCisgICAgICAgICAgICAgICAgYywgcmVzdWx0Q2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWNrIHRoZSBnaXZlbiBvYmplY3QgaW50byBhbiBpbnN0YW5jZSBvZiB0aGUgcXVlcnkncyByZXN1bHQgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwYWNrKE9iamVjdCByZXN1bHQpIHsKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlcyBmb3IgZWZmaWNpZW50IGJhc2ljIHR5cGVzIHdoZXJlIHdlIHdhbnQgdG8gYXZvaWQKKyAgICAgICAgLy8gY3JlYXRpbmcgYW4gYXJyYXkgZm9yIGNhbGwgdG8gZ2VuZXJhbCBwYWNrIG1ldGhvZCBiZWxvdworICAgICAgICBpZiAoX3Jlc3VsdENsYXNzID09IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGlmIChfcmVzdWx0Q2xhc3MgPT0gT2JqZWN0W10uY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdeyByZXN1bHQgfTsKKyAgICAgICAgaWYgKF9yZXN1bHRDbGFzcyA9PSBIYXNoTWFwLmNsYXNzIHx8IF9yZXN1bHRDbGFzcyA9PSBNYXAuY2xhc3MpIHsKKyAgICAgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoMSwgMUYpOworICAgICAgICAgICAgbWFwLnB1dChfYWxpYXNlc1swXSwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmltaXRpdmUgb3Igc2ltcGxlIHR5cGU/CisgICAgICAgIGlmIChfY29uc3RydWN0b3IgPT0gbnVsbCAmJiBfc2V0cyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEZpbHRlcnMuY29udmVydChyZXN1bHQsIF9yZXN1bHRDbGFzcyk7CisKKyAgICAgICAgLy8gdGhpcyBpcyBzb21lIGNvbXBsZXggY2FzZSwgc28gd29ydGggaXQgdG8gY3JlYXRlIHRoZSBhcnJheSBhbmQKKyAgICAgICAgLy8gdXNlIHRoZSBnZW5lcmFsIHBhY2sgbWV0aG9kCisgICAgICAgIHJldHVybiBwYWNrVXNlclR5cGUobmV3IE9iamVjdFtdeyByZXN1bHQgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFjayB0aGUgZ2l2ZW4gYXJyYXkgaW50byBhbiBpbnN0YW5jZSBvZiB0aGUgcXVlcnkncyByZXN1bHQgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwYWNrKE9iamVjdFtdIHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlcyBmb3Igb2JqZWN0IGFycmF5cyBhbmQgbWFwcworICAgICAgICBpZiAoX3Jlc3VsdENsYXNzID09IE9iamVjdFtdLmNsYXNzKSB7CisgICAgICAgICAgICAvLyB0aGUgcmVzdWx0IG1pZ2h0IGNvbnRhaW4gZXh0cmEgZGF0YSBhdCB0aGUgZW5kCisgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IF9hbGlhc2VzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIE9iamVjdFtdIHRyaW0gPSBuZXcgT2JqZWN0W19hbGlhc2VzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHRyaW0sIDAsIHRyaW0ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJpbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9yZXN1bHRDbGFzcyA9PSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0WzBdOworICAgICAgICBpZiAoX3Jlc3VsdENsYXNzID09IEhhc2hNYXAuY2xhc3MgfHwgX3Jlc3VsdENsYXNzID09IE1hcC5jbGFzcykgeworICAgICAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKHJlc3VsdC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYWxpYXNlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBtYXAucHV0KF9hbGlhc2VzW2ldLCByZXN1bHRbaV0pOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaW1pdGl2ZSBvciBzaW1wbGUgdHlwZT8KKyAgICAgICAgaWYgKF9zZXRzID09IG51bGwgJiYgX2NvbnN0cnVjdG9yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gRmlsdGVycy5jb252ZXJ0KHJlc3VsdFswXSwgX3Jlc3VsdENsYXNzKTsKKworICAgICAgICAvLyBtdXN0IGJlIGEgdXNlci1kZWZpbmVkIHR5cGUKKyAgICAgICAgcmV0dXJuIHBhY2tVc2VyVHlwZShyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhY2sgdGhlIGdpdmVuIHJlc3VsdCBpbnRvIHRoZSB1c2VyLWRlZmluZWQgcmVzdWx0IGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IHBhY2tVc2VyVHlwZShPYmplY3RbXSByZXN1bHQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgY29uc3RydWN0b3IgZmlyc3QsIGlmIHdlIGhhdmUgb25lCisgICAgICAgICAgICBpZiAoX2NvbnN0cnVjdG9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShyZXN1bHQpOworCisgICAgICAgICAgICBPYmplY3QgdXNlciA9IF9yZXN1bHRDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYWxpYXNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChfc2V0c1tpXSBpbnN0YW5jZW9mIE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aCA9IChNZXRob2QpIF9zZXRzW2ldOworICAgICAgICAgICAgICAgICAgICBtZXRoLmludm9rZSh1c2VyLCBuZXcgT2JqZWN0W117IEZpbHRlcnMuY29udmVydAorICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdFtpXSwgbWV0aC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdKSB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9zZXRzW2ldIGluc3RhbmNlb2YgRmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgRmllbGQgZmllbGQgPSAoRmllbGQpIF9zZXRzW2ldOworICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXQodXNlciwgRmlsdGVycy5jb252ZXJ0KHJlc3VsdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldFR5cGUoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX3B1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIF9wdXQuaW52b2tlKHVzZXIsIG5ldyBPYmplY3RbXXsgX2FsaWFzZXNbaV0sIHJlc3VsdFtpXSB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdXNlcjsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYWNrLWluc3RhbnRpYXRpb24tZXJyIiwKKyAgICAgICAgICAgICAgICBfcmVzdWx0Q2xhc3MpLCBpZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgicGFjay1lcnIiLCBfcmVzdWx0Q2xhc3MpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1lbWJlciBmaW5kU2V0KFN0cmluZyBhbGlhcywgQ2xhc3MgdHlwZSwgRmllbGRbXSBmaWVsZHMsCisgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoYWxpYXMpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh0eXBlID09IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgIHR5cGUgPSBudWxsOworCisgICAgICAgIC8vIGNoZWNrIHB1YmxpYyBmaWVsZHMgZmlyc3QKKyAgICAgICAgRmllbGQgZmllbGQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBhIGZpZWxkIHdpdGggdGhlIGV4YWN0IG5hbWUsIGVpdGhlciByZXR1cm4gaXQKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgdGhlIHJpZ2h0IHR5cGUgb3IgZ2l2ZSB1cCBpZiBpdCdzIG5vdAorICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuZXF1YWxzKGFsaWFzKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgRmlsdGVycy5jYW5Db252ZXJ0KHR5cGUsIGZpZWxkc1tpXS5nZXRUeXBlKCksIHRydWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgaWYgd2UgZmluZCBhIGZpZWxkIHdpdGggdGhlIHJpZ2h0IG5hbWUgYnV0IHRoZQorICAgICAgICAgICAgLy8gd3JvbmcgY2FzZSwgcmVjb3JkIGl0IGFuZCBpZiB3ZSBkb24ndCBmaW5kIGFuIGV4YWN0IG1hdGNoCisgICAgICAgICAgICAvLyBmb3IgYSBmaWVsZCBvciBzZXR0ZXIgd2UnbGwgdXNlIGl0CisgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCAmJiBmaWVsZHNbaV0uZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYWxpYXMpCisgICAgICAgICAgICAgICAgJiYgKHR5cGUgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IEZpbHRlcnMuY2FuQ29udmVydCh0eXBlLCBmaWVsZHNbaV0uZ2V0VHlwZSgpLCB0cnVlKSkpCisgICAgICAgICAgICAgICAgZmllbGQgPSBmaWVsZHNbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBzZXR0ZXIgbWV0aG9kcworICAgICAgICBTdHJpbmcgc2V0TmFtZSA9ICJzZXQiICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShhbGlhcyk7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOworICAgICAgICBib29sZWFuIGVxTmFtZSA9IGZhbHNlOworICAgICAgICBDbGFzc1tdIHBhcmFtczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIW1ldGhvZHNbaV0uZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uoc2V0TmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwYXJhbXMgPSBtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIHBhcmFtc1swXSA9PSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBmb3VuZCBhIGdlbmVyaWMgb2JqZWN0IHNldHRlcjsgbm93IHNlZSBpZiB0aGUgbmFtZQorICAgICAgICAgICAgICAgIC8vIGlzIGFuIGV4YWN0IG1hdGNoLCBhbmQgaWYgc28gcmVjb3JkIHRoaXMgc2V0dGVyLiAgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBmaW5kIGFuIGV4YWN0IHR5cGUgbWF0Y2ggbGF0ZXIsIHdlJ2xsIHVzZSBpdC4gIGlmCisgICAgICAgICAgICAgICAgLy8gdGhlIG5hbWVzIGFyZSBub3QgYW4gZXhhY3QgbWF0Y2gsIG9ubHkgcmVjb3JkIHRoaXMgc2V0dGVyCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhbnkgb3RoZXJzIHRoYXQgbWF0Y2ggYXQgYWxsCisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhzZXROYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBlcU5hbWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2RzW2ldOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZHNbaV07CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgRmlsdGVycy5jYW5Db252ZXJ0KHR5cGUsIHBhcmFtc1swXSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBmb3VuZCBhIHNldHRlciB3aXRoIHRoZSByaWdodCB0eXBlOyBub3cgc2VlIGlmIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgLy8gaXMgYW4gZXhhY3QgbWF0Y2guICBpZiBzbywgcmV0dXJuIHRoZSBzZXR0ZXIuICBpZiBub3QsCisgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBzZXR0ZXIgb25seSBpZiB3ZSBoYXZlbid0IGZvdW5kIGEgZ2VuZXJpYyBvbmUKKyAgICAgICAgICAgICAgICAvLyB3aXRoIGFuIGV4YWN0IG5hbWUgbWF0Y2gKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKHNldE5hbWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwgfHwgIWVxTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXhhY3QgbWV0aG9kIG5hbWUgbWF0Y2gsIHJldHVybiBpdDsgb3RoZXJ3aXNlIGZhdm9yCisgICAgICAgIC8vIGFuIGluZXhhY3QgZmllbGQgdG8gYW4gaW5leGFjdCBtZXRob2QKKyAgICAgICAgaWYgKGVxTmFtZSB8fCBmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHV0IG1ldGhvZCBpZiBvbmUgZXhpc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kUHV0KE1ldGhvZFtdIG1ldGhvZHMpIHsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbXM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMoInB1dCIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBwYXJhbXMgPSBtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgJiYgcGFyYW1zWzBdID09IE9iamVjdC5jbGFzcworICAgICAgICAgICAgICAgICYmIHBhcmFtc1sxXSA9PSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV07CisgICAgICAgIH0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2F2ZUZpZWxkTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2F2ZUZpZWxkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzJkODAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TYXZlRmllbGRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eU1hbmFnZXI7CisKKy8qKgorICogRmllbGRNYW5hZ2VyIHR5cGUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBmb3Igcm9sbGJhY2suCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU2F2ZUZpZWxkTWFuYWdlcgorICAgIGV4dGVuZHMgQ2xlYXJGaWVsZE1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdGF0ZU1hbmFnZXJJbXBsIF9zbTsKKyAgICBwcml2YXRlIGZpbmFsIEJpdFNldCBfdW5sb2FkZWQ7CisgICAgcHJpdmF0ZSBCaXRTZXQgX3NhdmVkID0gbnVsbDsKKyAgICBwcml2YXRlIGludFtdIF9jb3B5RmllbGQgPSBudWxsOworICAgIHByaXZhdGUgUGVyc2lzdGVuY2VDYXBhYmxlIF9zdGF0ZSA9IG51bGw7CisKKyAgICAvLyB1c2VkIHRvIHRyYWNrIGZpZWxkIHZhbHVlIGR1cmluZyBzdG9yZS9mZXRjaCBjeWNsZQorICAgIHByaXZhdGUgT2JqZWN0IF9maWVsZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB7QGxpbmsgU3RhdGVNYW5hZ2VySW1wbH0gb2YgaW5zdGFuY2UgdG8gc2F2ZS4KKyAgICAgKi8KKyAgICBTYXZlRmllbGRNYW5hZ2VyKFN0YXRlTWFuYWdlckltcGwgc20sIFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgQml0U2V0IGRpcnR5KSB7CisgICAgICAgIF9zbSA9IHNtOworICAgICAgICBfc3RhdGUgPSBwYzsKKworICAgICAgICAvLyBpZiBpbnN0YW5jZSBpcyBuZXcgb3IgdHJhbnNpZW50IGFsbCBmaWVsZHMgd2lsbCBiZSBtYXJrZWQgZGlydHkgZXZlbgorICAgICAgICAvLyB0aG91Z2ggdGhleSBoYXZlIHRoZWlyIG9yaWdpbmFsIHZhbHVlcywgc28gd2UgY2FuIHJlc3RvcmUgdGhlbTsKKyAgICAgICAgLy8gb3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIHJlY29yZCBhbHJlYWR5LWRpcnR5IHBlcnNpc3RlbnQgZmllbGRzIGFzCisgICAgICAgIC8vIG9uZXMgd2Ugd29uJ3QgYmUgYWJsZSB0byByZXN0b3JlCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBfc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZHMoKTsKKyAgICAgICAgaWYgKF9zbS5pc05ldygpIHx8ICFfc20uaXNQZXJzaXN0ZW50KCkgfHwgZGlydHkgPT0gbnVsbCkKKyAgICAgICAgICAgIF91bmxvYWRlZCA9IG5ldyBCaXRTZXQoZmllbGRzLmxlbmd0aCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX3VubG9hZGVkID0gKEJpdFNldCkgZGlydHkuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TWFuYWdlbWVudCgpICE9IGZpZWxkc1tpXS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgX3VubG9hZGVkLmNsZWFyKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSBjYXBhYmxlIGNvcHkgaG9sZGluZyB0aGUgcm9sbGJhY2sgZmllbGQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBQZXJzaXN0ZW5jZUNhcGFibGUgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50bHktbG9hZGVkIGZpZWxkcyB0aGF0IHdpbGwgYmUgdW5sb2FkZWQgYWZ0ZXIgcm9sbGJhY2suCisgICAgICovCisgICAgcHVibGljIEJpdFNldCBnZXRVbmxvYWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIF91bmxvYWRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBnaXZlbiBmaWVsZC4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCB0aGVuIHlvdSBuZWVkCisgICAgICogdG8gdXNlIHRoaXMgZmllbGQgbWFuYWdlciB0byByZXBsYWNlIHRoZSBnaXZlbiBmaWVsZCBpbiB0aGUgaW5zdGFuY2UKKyAgICAgKiByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN0YXRlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzYXZlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIC8vIGlmIG5vdCBsb2FkZWQgd2UgY2FuJ3Qgc2F2ZSBvcmlnIHZhbHVlOyBtYXJrIGFzIHVubG9hZGVkIG9uIHJvbGxiYWNrCisgICAgICAgIGlmICghX3NtLmdldExvYWRlZCgpLmdldChmaWVsZCkpIHsKKyAgICAgICAgICAgIF91bmxvYWRlZC5zZXQoZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWxyZWFkeSBzYXZlZD8KKyAgICAgICAgaWYgKF9zYXZlZCAhPSBudWxsICYmIF9zYXZlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX3NtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBib29sZWFuIG11dGFibGUgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgIG11dGFibGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW52ZXJzZSBmaWVsZCBhbmQgdGhlIHByb3BlciByZXN0b3JlIGZsYWcgaXMKKyAgICAgICAgLy8gbm90IHNldCwgc2tpcCBpdAorCisgICAgICAgIGlmIChfc20uZ2V0QnJva2VyKCkuZ2V0SW52ZXJzZU1hbmFnZXIoKSA9PSBudWxsCisgICAgICAgICAgICB8fCBmbWQuZ2V0SW52ZXJzZU1ldGFEYXRhcygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyB1c2Ugc20ncyByZXN0b3JlIGRpcmVjdGl2ZSwgbm90IGJyb2tlcidzCisgICAgICAgICAgICBpbnQgcmVzdG9yZSA9IF9zbS5nZXRCcm9rZXIoKS5nZXRSZXN0b3JlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChyZXN0b3JlID09IFJlc3RvcmVTdGF0ZS5SRVNUT1JFX05PTkUKKyAgICAgICAgICAgICAgICB8fCAobXV0YWJsZSAmJiByZXN0b3JlID09IFJlc3RvcmVTdGF0ZS5SRVNUT1JFX0lNTVVUQUJMRSkpIHsKKyAgICAgICAgICAgICAgICBfdW5sb2FkZWQuc2V0KGZpZWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmVwYXJlIHRvIHNhdmUgdGhlIGZpZWxkCisgICAgICAgIGlmIChfc3RhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zdGF0ZSA9IF9zbS5nZXRQZXJzaXN0ZW5jZUNhcGFibGUoKS5wY05ld0luc3RhbmNlKF9zbSwgdHJ1ZSk7CisgICAgICAgIGlmIChfc2F2ZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zYXZlZCA9IG5ldyBCaXRTZXQoX3NtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGRzKCkubGVuZ3RoKTsKKworICAgICAgICBfc2F2ZWQuc2V0KGZpZWxkKTsKKworICAgICAgICAvLyBpZiBtdXRhYmxlLCByZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaWVsZCBuZWVkcyB0byBiZQorICAgICAgICAvLyBjb3BpZWQgYnkgcHJvdmlkaW5nIGFuZCByZXBsYWNpbmcgaXQgdXNpbmcgdGhpcyBmaWVsZCBtYW5hZ2VyCisgICAgICAgIGlmIChtdXRhYmxlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gaW1tdXRhYmxlIGZpZWxkcyBjYW4ganVzdCBiZSBjb3BpZWQgb3ZlcgorICAgICAgICBpZiAoX2NvcHlGaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgX2NvcHlGaWVsZCA9IG5ldyBpbnRbMV07CisgICAgICAgIF9jb3B5RmllbGRbMF0gPSBmaWVsZDsKKyAgICAgICAgX3N0YXRlLnBjQ29weUZpZWxkcyhfc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCksIF9jb3B5RmllbGQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdG9yZSB0aGUgZ2l2ZW4gZmllbGQuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgdGhlbiB5b3UgbmVlZAorICAgICAqIHRvIHVzZSB0aGlzIGZpZWxkIG1hbmFnZXIgdG8gcmVwbGFjZSB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIHN0YXRlCisgICAgICogbWFuYWdlcidzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc3RvcmVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgLy8gaWYgdGhlIGdpdmVuIGZpZWxkIG5lZWRzIHRvIGJlIHVubG9hZGVkLCByZXR1cm4gdHJ1ZSBzbyB0aGF0IGl0IGdldHMKKyAgICAgICAgLy8gcmVwbGFjZWQgd2l0aCBhIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgaWYgKF91bmxvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyBub3Qgc2F2ZWQsIGl0IG11c3Qgbm90IGhhdmUgZ290dGVuIGRpcnR5OyBqdXN0CisgICAgICAgIC8vIHJldHVybiBmYWxzZSBzbyB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIGlzIGtlcHQKKyAgICAgICAgaWYgKF9zYXZlZCA9PSBudWxsIHx8ICFfc2F2ZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBjb3B5IHRoZSBzYXZlZCBmaWVsZCBvdmVyCisgICAgICAgIGlmIChfY29weUZpZWxkID09IG51bGwpCisgICAgICAgICAgICBfY29weUZpZWxkID0gbmV3IGludFsxXTsKKyAgICAgICAgX2NvcHlGaWVsZFswXSA9IGZpZWxkOworICAgICAgICBfc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCkucGNDb3B5RmllbGRzKF9zdGF0ZSwgX2NvcHlGaWVsZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoT2JqZWN0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIC8vIHJldHVybiB0aGUgY29waWVkIGZpZWxkIGR1cmluZyBzYXZlLCBvciBhIG51bGwgdmFsdWUgZHVyaW5nIHJlc3RvcmUKKyAgICAgICAgT2JqZWN0IHZhbCA9IF9maWVsZDsKKyAgICAgICAgX2ZpZWxkID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdEZpZWxkKGludCBmaWVsZCwgT2JqZWN0IGN1clZhbCkgeworICAgICAgICAvLyBjb3B5IG11dGFibGUgZmllbGRzCisgICAgICAgIFByb3h5TWFuYWdlciBwcm94eSA9IF9zbS5nZXRCcm9rZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRQcm94eU1hbmFnZXJJbnN0YW5jZSgpOworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9zbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBfZmllbGQgPSBwcm94eS5jb3B5QXJyYXkoY3VyVmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgX2ZpZWxkID0gcHJveHkuY29weUNvbGxlY3Rpb24oKENvbGxlY3Rpb24pIGN1clZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgX2ZpZWxkID0gcHJveHkuY29weU1hcCgoTWFwKSBjdXJWYWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICBfZmllbGQgPSBwcm94eS5jb3B5RGF0ZSgoRGF0ZSkgY3VyVmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICBfZmllbGQgPSBwcm94eS5jb3B5Q3VzdG9tKGN1clZhbCk7CisgICAgICAgICAgICAgICAgaWYgKF9maWVsZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfZmllbGQgPSBjdXJWYWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIF9maWVsZCA9IGN1clZhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGNvdWxkbid0IGdldCBhIGNvcHkgb2YgdGhlIHNjbywgYWN0IGxpa2UgaXQgd2Fzbid0IHNhdmVkCisgICAgICAgIGlmIChjdXJWYWwgIT0gbnVsbCAmJiBfZmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgX3VubG9hZGVkLnNldChmaWVsZCk7CisgICAgICAgICAgICBfc2F2ZWQuY2xlYXIoZmllbGQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2F2ZXBvaW50RmllbGRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TYXZlcG9pbnRGaWVsZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgwYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2F2ZXBvaW50RmllbGRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5TWFuYWdlcjsKKworLyoqCisgKiBGaWVsZE1hbmFnZXIgdHlwZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGZvciBzYXZlcG9pbnQgcm9sbGJhY2suCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqIEBzaW5jZSAwLjMuNAorICovCitjbGFzcyBTYXZlcG9pbnRGaWVsZE1hbmFnZXIKKyAgICBleHRlbmRzIENsZWFyRmllbGRNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFNhdmVwb2ludEZpZWxkTWFuYWdlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlTWFuYWdlckltcGwgX3NtOworICAgIHByaXZhdGUgZmluYWwgQml0U2V0IF9sb2FkZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRTZXQgX2RpcnR5OworICAgIHByaXZhdGUgZmluYWwgQml0U2V0IF9mbHVzaDsKKyAgICBwcml2YXRlIGZpbmFsIFBDU3RhdGUgX3N0YXRlOworICAgIHByaXZhdGUgUGVyc2lzdGVuY2VDYXBhYmxlIF9jb3B5OworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX3ZlcnNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX2xvYWRWZXJzaW9uOworCisgICAgLy8gdXNlZCB0byB0cmFjayBmaWVsZCB2YWx1ZSBkdXJpbmcgc3RvcmUvZmV0Y2ggY3ljbGUKKyAgICBwcml2YXRlIE9iamVjdCBfZmllbGQgPSBudWxsOworICAgIHByaXZhdGUgaW50W10gX2NvcHlGaWVsZCA9IG51bGw7CisgICAgcHJpdmF0ZSBCaXRTZXQgX211dGFibGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSBpbnN0YW5jZSB0byBzYXZlIGFuZCBpbmRpY2F0ZSB3aGV0aGVyCisgICAgICogdG8gY29weSBwZXJzaXN0ZW50IGZpZWxkcy4gVHJhbnNhY3Rpb25hbCBmaWVsZHMgd2lsbCBiZQorICAgICAqIGNvcGllZCByZWdhcmRsZXNzIG9mIGNvcHkgc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2F2ZXBvaW50RmllbGRNYW5hZ2VyKFN0YXRlTWFuYWdlckltcGwgc20sIGJvb2xlYW4gY29weSkgeworICAgICAgICBfc20gPSBzbTsKKyAgICAgICAgX3N0YXRlID0gX3NtLmdldFBDU3RhdGUoKTsKKworICAgICAgICBfZGlydHkgPSAoQml0U2V0KSBfc20uZ2V0RGlydHkoKS5jbG9uZSgpOworICAgICAgICBfZmx1c2ggPSAoQml0U2V0KSBfc20uZ2V0Rmx1c2hlZCgpLmNsb25lKCk7CisgICAgICAgIF9sb2FkZWQgPSAoQml0U2V0KSBfc20uZ2V0TG9hZGVkKCkuY2xvbmUoKTsKKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZmllbGRzID0gX3NtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xvYWRlZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGNvcHkgfHwgZmllbGRzW2ldLmdldE1hbmFnZW1lbnQoKSA9PQorICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGEuTUFOQUdFX1RSQU5TQUNUSU9OQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NvcHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2NvcHkgPSBfc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCkucGNOZXdJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKF9zbSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RvcmVGaWVsZChmaWVsZHNbaV0pOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX2xvYWRlZC5jbGVhcihpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIG5lZWQgdG8gcHJveHkgdGhlIGZpZWxkcyBzbyB0aGF0IHdlIGNhbiB0cmFjayBmdXR1cmUgY2hhbmdlcworICAgICAgICAvLyBmcm9tIHRoaXMgc2F2ZXBvaW50IGZvcndhcmQgZm9yIFBOZXcgaW5zdGFuY2VzJyBtdXRhYmxlIGZpZWxkcworICAgICAgICBfc20ucHJveHlGaWVsZHMoZmFsc2UsIGZhbHNlKTsKKworICAgICAgICBfdmVyc2lvbiA9IF9zbS5nZXRWZXJzaW9uICgpOworICAgICAgICBfbG9hZFZlcnNpb24gPSBfc20uZ2V0TG9hZFZlcnNpb24gKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSBtYW5hZ2VyIHRoYXQgdGhpcyBtYW5hZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhdGVNYW5hZ2VySW1wbCBnZXRTdGF0ZU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBfc207CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gX3ZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRMb2FkVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIF9sb2FkVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIGNhcGFibGUgY29weSBob2xkaW5nIHRoZSBzYXZlcG9pbnQgZmllbGQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBQZXJzaXN0ZW5jZUNhcGFibGUgZ2V0Q29weSgpIHsKKyAgICAgICAgcmV0dXJuIF9jb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2F2ZWQge0BsaW5rIFBDU3RhdGV9CisgICAgICovCisgICAgcHVibGljIFBDU3RhdGUgZ2V0UENTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpZWxkcyBzdG9yZWQgaW4gdGhpcyBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBCaXRTZXQgZ2V0TG9hZGVkKCkgeworICAgICAgICByZXR1cm4gX2xvYWRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpcnR5IGZpZWxkcyBkdXJpbmcgdGhlIHNhdmVkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBCaXRTZXQgZ2V0RGlydHkoKSB7CisgICAgICAgIHJldHVybiBfZGlydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmbHVzaGVkIGZpZWxkcyBkdXJpbmcgdGhlIHNhdmVkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBCaXRTZXQgZ2V0Rmx1c2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9mbHVzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmllbGQoRmllbGRNZXRhRGF0YSBmaWVsZCkgeworICAgICAgICBzd2l0Y2ggKGZpZWxkLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICBpZiAoX211dGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX211dGFibGUgPSBuZXcgQml0U2V0KF9zbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkcygpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgX211dGFibGUuc2V0KGZpZWxkLmdldEluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChfbXV0YWJsZSA9PSBudWxsIHx8ICFfbXV0YWJsZS5nZXQoZmllbGQuZ2V0SW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGltbXV0YWJsZSBmaWVsZHMgY2FuIGp1c3QgYmUgY29waWVkIG92ZXIKKyAgICAgICAgICAgIGlmIChfY29weUZpZWxkID09IG51bGwpCisgICAgICAgICAgICAgICAgX2NvcHlGaWVsZCA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBfY29weUZpZWxkWzBdID0gZmllbGQuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgIF9jb3B5LnBjQ29weUZpZWxkcyhfc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCksIF9jb3B5RmllbGQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3NtLnByb3ZpZGVGaWVsZChfc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCksIHRoaXMsCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBfc20ucmVwbGFjZUZpZWxkKF9jb3B5LCB0aGlzLCBmaWVsZC5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RvcmUgdGhlIGdpdmVuIGZpZWxkLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUsIHRoZW4geW91IG5lZWQKKyAgICAgKiB0byB1c2UgdGhpcyBmaWVsZCBtYW5hZ2VyIHRvIHJlcGxhY2UgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBzdGF0ZQorICAgICAqIG1hbmFnZXIncyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXN0b3JlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGlmICghX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX211dGFibGUgIT0gbnVsbCAmJiBfbXV0YWJsZS5nZXQoZmllbGQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gY29weSB0aGUgc2F2ZWQgZmllbGQgb3ZlcgorICAgICAgICBpZiAoX2NvcHlGaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgX2NvcHlGaWVsZCA9IG5ldyBpbnRbMV07CisgICAgICAgIF9jb3B5RmllbGRbMF0gPSBmaWVsZDsKKyAgICAgICAgX3NtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpLnBjQ29weUZpZWxkcyhfY29weSwgX2NvcHlGaWVsZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoT2JqZWN0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIC8vIHJldHVybiB0aGUgY29waWVkIGZpZWxkIGR1cmluZyBzYXZlLCBvciBhIG51bGwgdmFsdWUgZHVyaW5nIHJlc3RvcmUKKyAgICAgICAgT2JqZWN0IHZhbCA9IF9maWVsZDsKKyAgICAgICAgX2ZpZWxkID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdEZpZWxkKGludCBmaWVsZCwgT2JqZWN0IGN1clZhbCkgeworICAgICAgICAvLyBjb3B5IG11dGFibGUgZmllbGRzCisgICAgICAgIFByb3h5TWFuYWdlciBwcm94eSA9IF9zbS5nZXRDb250ZXh0KCkuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0UHJveHlNYW5hZ2VySW5zdGFuY2UoKTsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgX2ZpZWxkID0gcHJveHkuY29weUFycmF5KGN1clZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIF9maWVsZCA9IHByb3h5LmNvcHlDb2xsZWN0aW9uKChDb2xsZWN0aW9uKSBjdXJWYWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIF9maWVsZCA9IHByb3h5LmNvcHlNYXAoKE1hcCkgY3VyVmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgX2ZpZWxkID0gcHJveHkuY29weURhdGUoKERhdGUpIGN1clZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgX2ZpZWxkID0gcHJveHkuY29weUN1c3RvbShjdXJWYWwpOworICAgICAgICAgICAgICAgIGlmIChfZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2ZpZWxkID0gY3VyVmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfZmllbGQgPSBjdXJWYWw7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBjb3VsZG4ndCBnZXQgYSBjb3B5IG9mIHRoZSBzY28sIGFjdCBsaWtlIGl0IHdhc24ndCBzYXZlZAorICAgICAgICAvLyBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgIGlmIChjdXJWYWwgIT0gbnVsbCAmJiBfZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihfbG9jLmdldCgibm8tc2F2ZXBvaW50LWNvcHkiLCBmbWQpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TYXZlcG9pbnRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TYXZlcG9pbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1YTM5YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1NhdmVwb2ludE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKKy8qKgorICogQSBtYW5hZ2VyIGZvciBoYW5kbGluZyBzYXZlcG9pbnRzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAc2luY2UgMC4zLjQKKyAqLworcHVibGljIGludGVyZmFjZSBTYXZlcG9pbnRNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzYXZlcG9pbnRzIGdlbmVyYXRlZCBieSB0aGlzIG1hbmFnZXIKKyAgICAgKiBjYW4gaGFuZGxlIGluY3JlbWVudGFsIGZsdXNoZXMgdG8gdGhlIGRhdGFzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0luY3JlbWVudGFsRmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBzYXZlcG9pbnQgZm9yIHRoZSBnaXZlbiBuYW1lLCB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVNhdmVwb2ludCBuZXdTYXZlcG9pbnQoU3RyaW5nIG5hbWUsIEJyb2tlciBicm9rZXIpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2VxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TZXEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzM2NTI0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2VxLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIEludGVybmFsIE9wZW5KUEEgc2VxdWVuY2UgaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VxCisgICAgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ERUZBVUxUID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PTlRSQU5TQUNUSU9OQUwgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVFJBTlNBQ1RJT05BTCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DT05USUdVT1VTID0gMzsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBvZiBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4IHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY2xzIGlmIHRoaXMgaXMgYSBkYXRhc3RvcmUgaWRlbnRpdHkgc2VxdWVuY2UsIHRoZQorICAgICAqIHBlcnNpc3RlbnQgY2xhc3MgdGhlIGlkZW50aXR5IHZhbHVlIGlzIGZvcjsgZWxzZSBudWxsCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgY2xzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHggdGhlIGN1cnJlbnQgY29udGV4dAorICAgICAqIEBwYXJhbSBjbHMgaWYgdGhpcyBpcyBhIGRhdGFzdG9yZSBpZGVudGl0eSBzZXF1ZW5jZSwgdGhlCisgICAgICogcGVyc2lzdGVudCBjbGFzcyB0aGUgaWRlbnRpdHkgdmFsdWUgaXMgZm9yOyBlbHNlIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGN1cnJlbnQoU3RvcmVDb250ZXh0IGN0eCwgQ2xhc3NNZXRhRGF0YSBjbHMpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYWRkaXRpb25hbCB2YWx1ZXMgZWZmaWNpZW50bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4IHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY2xzIGlmIHRoaXMgaXMgYSBkYXRhc3RvcmUgaWRlbnRpdHkgc2VxdWVuY2UsIHRoZQorICAgICAqIHBlcnNpc3RlbnQgY2xhc3MgdGhlIGlkZW50aXR5IHZhbHVlIGlzIGZvcjsgZWxzZSBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWxsb2NhdGUoaW50IGFkZGl0aW9uYWwsIFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgY2xzKTsKKworICAgIC8qKgorICAgICAqIEZyZWUgcmVzb3VyY2VzIHVzZWQgYnkgdGhpcyBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSAoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1NpbmdsZUZpZWxkTWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2luZ2xlRmllbGRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhZmM0MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1NpbmdsZUZpZWxkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsODU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DaGFuZ2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW52YWxpZFN0YXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1hcENoYW5nZVRyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBGaWVsZE1hbmFnZXIgdHlwZSB1c2VkIHRvIGhvbGQgb250byBhIHNpbmdsZSBmaWVsZCB2YWx1ZSBhbmQgdGhlbgorICogZGlzcGVuc2UgaXQgdmlhIHRoZSBmZXRjaCBtZXRob2RzLiBUaGUgbWFuYWdlciBjYW4gYWxzbyBwZXJmb3JtIGFjdGlvbnMKKyAqIG9uIHRoZSBoZWxkIGZpZWxkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFNpbmdsZUZpZWxkTWFuYWdlcgorICAgIGV4dGVuZHMgVHJhbnNmZXJGaWVsZE1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU2luZ2xlRmllbGRNYW5hZ2VyLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RhdGVNYW5hZ2VySW1wbCBfc207CisgICAgcHJpdmF0ZSBmaW5hbCBCcm9rZXJJbXBsIF9icm9rZXI7CisKKyAgICBwdWJsaWMgU2luZ2xlRmllbGRNYW5hZ2VyKFN0YXRlTWFuYWdlckltcGwgc20sIEJyb2tlckltcGwgYnJva2VyKSB7CisgICAgICAgIF9zbSA9IHNtOworICAgICAgICBfYnJva2VyID0gYnJva2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3h5IHRoZSBoZWxkIGZpZWxkIGlmIG5lZWRlZC4gUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIG5lZWRzIHRvCisgICAgICogYmUgcmVwbGFjZWQgd2l0aCB0aGUgbm93LXByb3hpZWQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJveHkoYm9vbGVhbiByZXNldCwgYm9vbGVhbiByZXBsYWNlTnVsbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9zbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgUHJveHkgcHJveHkgPSBudWxsOworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgaWYgKG9ianZhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJveHkgPSBjaGVja1Byb3h5KCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJveHkgPSAoUHJveHkpIF9zbS5uZXdGaWVsZFByb3h5KGZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgKChEYXRlKSBwcm94eSkuc2V0VGltZSgoKERhdGUpIG9ianZhbCkuZ2V0VGltZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5IGluc3RhbmNlb2YgVGltZXN0YW1wIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgb2JqdmFsIGluc3RhbmNlb2YgVGltZXN0YW1wKQorICAgICAgICAgICAgICAgICAgICAgICAgKChUaW1lc3RhbXApIHByb3h5KS5zZXROYW5vcygoKFRpbWVzdGFtcCkgb2JqdmFsKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW5vcygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DQUxFTkRBUjoKKyAgICAgICAgICAgICAgICBpZiAob2JqdmFsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBwcm94eSA9IGNoZWNrUHJveHkoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm94eSA9IChQcm94eSkgX3NtLm5ld0ZpZWxkUHJveHkoZmllbGQpOworICAgICAgICAgICAgICAgICAgICAoKENhbGVuZGFyKSBwcm94eSkuc2V0VGltZSgoKENhbGVuZGFyKSBvYmp2YWwpLmdldFRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBpZiAob2JqdmFsID09IG51bGwgJiYgIXJlcGxhY2VOdWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJveHkgPSBjaGVja1Byb3h5KCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJveHkgPSAoUHJveHkpIF9zbS5uZXdGaWVsZFByb3h5KGZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9ianZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgKChDb2xsZWN0aW9uKSBwcm94eSkuYWRkQWxsKChDb2xsZWN0aW9uKSBvYmp2YWwpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICBpZiAob2JqdmFsID09IG51bGwgJiYgIXJlcGxhY2VOdWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJveHkgPSBjaGVja1Byb3h5KCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJveHkgPSAoUHJveHkpIF9zbS5uZXdGaWVsZFByb3h5KGZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9ianZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgKChNYXApIHByb3h5KS5wdXRBbGwoKE1hcCkgb2JqdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgaWYgKG9ianZhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJveHkgPSBjaGVja1Byb3h5KCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJveHkgPSBnZXRQcm94eU1hbmFnZXIoKS5uZXdDdXN0b21Qcm94eShvYmp2YWwpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBwcm94eSAhPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcm94eS5zZXRPd25lcihfc20sIGZpZWxkKTsKKyAgICAgICAgICAgIENoYW5nZVRyYWNrZXIgdHJhY2tlciA9IHByb3h5LmdldENoYW5nZVRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmIChyZXNldCAmJiB0cmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuTUFQKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIHZhbHVlcyBpZiBrZXkgaXMgZGVyaXZlZCBmcm9tIHZhbHVlLCBlbHNlIGtleXMKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBrZXlzID0gZm1kLmdldEtleSgpLmdldFZhbHVlTWFwcGVkQnkoKSA9PSBudWxsOworICAgICAgICAgICAgICAgICAgICAoKE1hcENoYW5nZVRyYWNrZXIpIHRyYWNrZXIpLnNldFRyYWNrS2V5cyhrZXlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2tlci5zdGFydFRyYWNraW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmp2YWwgPSBwcm94eTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEgdXNhYmxlIHByb3h5LCByZXR1cm4gaXQ7IGVsc2UgcmV0dXJuIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm94eSBjaGVja1Byb3h5KCkgeworICAgICAgICBpZiAoIShvYmp2YWwgaW5zdGFuY2VvZiBQcm94eSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBQcm94eSBwcm94eSA9IChQcm94eSkgb2JqdmFsOworICAgICAgICBpZiAocHJveHkuZ2V0T3duZXIoKSA9PSBudWxsIHx8IFByb3hpZXMuaXNPd25lcihwcm94eSwgX3NtLCBmaWVsZCkpCisgICAgICAgICAgICByZXR1cm4gcHJveHk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVucHJveGllcyB0aGUgY3VycmVudCBmaWVsZCBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5wcm94eSgpIHsKKyAgICAgICAgaWYgKG9ianZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX3NtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgIGlmIChvYmp2YWwgaW5zdGFuY2VvZiBQcm94eSkgeworICAgICAgICAgICAgICAgICAgICBQcm94eSBwcm94eSA9IChQcm94eSkgb2JqdmFsOworICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRPd25lcihudWxsLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm94eS5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LmdldENoYW5nZVRyYWNrZXIoKS5zdG9wVHJhY2tpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50bHkgZW1iZWRkZWQgZmllbGQgKG1ha2UgaXQgdHJhbnNpZW50KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlRW1iZWRkZWQoKSB7CisgICAgICAgIGlmIChvYmp2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9zbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgICAgICAgICByZWxlYXNlRW1iZWRkZWQoZm1kLCBvYmp2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRFbGVtZW50KCkuaXNFbWJlZGRlZFBDKCkpCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VFbWJlZGRlZChmbWQuZ2V0RWxlbWVudCgpLCAoT2JqZWN0W10pIG9ianZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0RWxlbWVudCgpLmlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgICAgICAgICByZWxlYXNlRW1iZWRkZWQoZm1kLmdldEVsZW1lbnQoKSwgKENvbGxlY3Rpb24pIG9ianZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRLZXkoKS5pc0VtYmVkZGVkUEMoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUVtYmVkZGVkKGZtZC5nZXRLZXkoKSwgKChNYXApIG9ianZhbCkua2V5U2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0RWxlbWVudCgpLmlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgICAgICAgICByZWxlYXNlRW1iZWRkZWQoZm1kLmdldEVsZW1lbnQoKSwgKChNYXApIG9ianZhbCkudmFsdWVzKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgZ2l2ZW4gZW1iZWRkZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUVtYmVkZGVkKFZhbHVlTWV0YURhdGEgdm1kLCBPYmplY3RbXSBvYmpzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlbGVhc2VFbWJlZGRlZCh2bWQsIG9ianNbaV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGdpdmVuIGVtYmVkZGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VFbWJlZGRlZChWYWx1ZU1ldGFEYXRhIHZtZCwgQ29sbGVjdGlvbiBvYmpzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2Jqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHJlbGVhc2VFbWJlZGRlZCh2bWQsIGl0ci5uZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGdpdmVuIGVtYmVkZCBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VFbWJlZGRlZChWYWx1ZU1ldGFEYXRhIHZtZCwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSA9IF9icm9rZXIuZ2V0U3RhdGVNYW5hZ2VySW1wbChvYmosIGZhbHNlKTsKKyAgICAgICAgaWYgKHNtICE9IG51bGwgJiYgc20uZ2V0T3duZXIoKSA9PSBfc20KKyAgICAgICAgICAgICYmIHNtLmdldE93bmVyTWV0YURhdGEoKSA9PSB2bWQpCisgICAgICAgICAgICBzbS5yZWxlYXNlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcnNpc3QgdGhlIHN0b3JlZCBmaWVsZCBzYWZlbHksIHByZXZlbnRpbmcgaW5maW5pdGUgcmVjdXJzaW9uIHVzaW5nCisgICAgICogdGhlIGdpdmVuIHNldCBvZiBhbHJlYWR5LXBlcnNpc3RlZCBvYmplY3RzLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZAorICAgICAqIGZvciBmaWVsZHMgdGhhdCB3ZSBrbm93IGhhdmUgY2FzY2FkZS1pbW1lZGlhdGUgc2V0dGluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGVyc2lzdChPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGlmIChvYmp2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9zbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDX1VOVFlQRUQ6CisgICAgICAgICAgICAgICAgaWYgKCFfYnJva2VyLmlzRGV0YWNoZWROZXcoKSAmJiBfYnJva2VyLmlzRGV0YWNoZWQob2JqdmFsKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhbGxvdyBidXQgaWdub3JlCisgICAgICAgICAgICAgICAgX2Jyb2tlci5wZXJzaXN0KG9ianZhbCwgdHJ1ZSwgY2FsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBfYnJva2VyLnBlcnNpc3RBbGwoQXJyYXlzLmFzTGlzdCgoT2JqZWN0W10pIG9ianZhbCksIHRydWUsIAorICAgICAgICAgICAgICAgICAgICBjYWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgX2Jyb2tlci5wZXJzaXN0QWxsKChDb2xsZWN0aW9uKSBvYmp2YWwsIHRydWUsIGNhbGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0S2V5KCkuZ2V0Q2FzY2FkZVBlcnNpc3QoKQorICAgICAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKQorICAgICAgICAgICAgICAgICAgICBfYnJva2VyLnBlcnNpc3RBbGwoKChNYXApIG9ianZhbCkua2V5U2V0KCksIHRydWUsIGNhbGwpOworICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0RWxlbWVudCgpLmdldENhc2NhZGVQZXJzaXN0KCkKKyAgICAgICAgICAgICAgICAgICAgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSkKKyAgICAgICAgICAgICAgICAgICAgX2Jyb2tlci5wZXJzaXN0QWxsKCgoTWFwKSBvYmp2YWwpLnZhbHVlcygpLCB0cnVlLCBjYWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhbmQvb3IgZGVyZWZlcmVuY2UgZmllbGQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGRlbGV0ZSh0cnVlLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXJlZmVyZW5jZSBmaWVsZCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVyZWZlcmVuY2VEZXBlbmRlbnQoKSB7CisgICAgICAgIGRlbGV0ZShmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIG9yIGRlcmVmZXJlbmNlIHRoZSBzdG9yZWQgZmllbGQgYXMgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWxldGUoYm9vbGVhbiBpbW1lZGlhdGUsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKG9ianZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX3NtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoZm1kLmdldENhc2NhZGVEZWxldGUoKSAhPSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfTk9ORSkgeworICAgICAgICAgICAgLy8gaW1tZWRpYXRlIGNhc2NhZGUgd29ya3Mgb24gZmllbGQgdmFsdWU7IGRlcGVuZGVudCBkZXJlZgorICAgICAgICAgICAgLy8gd29ya3Mgb24gZXh0ZXJuYWwgdmFsdWUKKyAgICAgICAgICAgIGlmICgoaW1tZWRpYXRlIHx8IGZtZC5pc0VtYmVkZGVkUEMoKSkKKyAgICAgICAgICAgICAgICAmJiBmbWQuZ2V0Q2FzY2FkZURlbGV0ZSgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUpCisgICAgICAgICAgICAgICAgZGVsZXRlKGZtZCwgb2JqdmFsLCBjYWxsKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZtZC5nZXRDYXNjYWRlRGVsZXRlKCkgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0FVVE8pCisgICAgICAgICAgICAgICAgZGVyZWZlcmVuY2VEZXBlbmRlbnQoZm1kLmdldEV4dGVybmFsVmFsdWUob2JqdmFsLCBfYnJva2VyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgZXh0ZXJuYWwgPSBudWxsOworICAgICAgICBWYWx1ZU1ldGFEYXRhIHZtZCA9IGZtZC5nZXRLZXkoKTsKKyAgICAgICAgaWYgKChpbW1lZGlhdGUgfHwgdm1kLmlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgJiYgdm1kLmdldENhc2NhZGVEZWxldGUoKSA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKQorICAgICAgICAgICAgZGVsZXRlKHZtZCwgKChNYXApIG9ianZhbCkua2V5U2V0KCksIGNhbGwpOworICAgICAgICBlbHNlIGlmICh2bWQuZ2V0Q2FzY2FkZURlbGV0ZSgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9BVVRPKSB7CisgICAgICAgICAgICBleHRlcm5hbCA9IGZtZC5nZXRFeHRlcm5hbFZhbHVlKG9ianZhbCwgX2Jyb2tlcik7CisgICAgICAgICAgICBpZiAoZXh0ZXJuYWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBkZXJlZmVyZW5jZURlcGVuZGVudCgoKE1hcCkgZXh0ZXJuYWwpLmtleVNldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZtZCA9IGZtZC5nZXRFbGVtZW50KCk7CisgICAgICAgIGlmICgoaW1tZWRpYXRlIHx8IHZtZC5pc0VtYmVkZGVkUEMoKSkKKyAgICAgICAgICAgICYmIHZtZC5nZXRDYXNjYWRlRGVsZXRlKCkgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSkgeworICAgICAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlKHZtZCwgKENvbGxlY3Rpb24pIG9ianZhbCwgY2FsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBkZWxldGUodm1kLCAoT2JqZWN0W10pIG9ianZhbCwgY2FsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlKHZtZCwgKChNYXApIG9ianZhbCkudmFsdWVzKCksIGNhbGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2bWQuZ2V0Q2FzY2FkZURlbGV0ZSgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9BVVRPKSB7CisgICAgICAgICAgICBpZiAoZXh0ZXJuYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4dGVybmFsID0gZm1kLmdldEV4dGVybmFsVmFsdWUob2JqdmFsLCBfYnJva2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0ZXJuYWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGZtZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgZGVyZWZlcmVuY2VEZXBlbmRlbnQoKENvbGxlY3Rpb24pIGV4dGVybmFsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlRGVwZW5kZW50KChPYmplY3RbXSkgZXh0ZXJuYWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlRGVwZW5kZW50KCgoTWFwKSBleHRlcm5hbCkudmFsdWVzKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZShWYWx1ZU1ldGFEYXRhIHZtZCwgT2JqZWN0W10gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBkZWxldGUodm1kLCBvYmpzW2ldLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIG9iamVjdHMgZW1iZWRkZWQgaW4gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWxldGUoVmFsdWVNZXRhRGF0YSB2bWQsIENvbGxlY3Rpb24gb2JqcywgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBkZWxldGUodm1kLCBpdHIubmV4dCgpLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgYW4gb2JqZWN0IGVtYmVkZGVkIGluIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKi8KKyAgICB2b2lkIGRlbGV0ZShWYWx1ZU1ldGFEYXRhIHZtZCwgT2JqZWN0IG9iaiwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gZGVsZXRlIGlmIHVua25vd25lZCBvciB0aGlzIGlzbid0IGFuIGVtYmVkZGVkIGZpZWxkIG9yIGlmIG93bmVkIGJ5IHVzCisgICAgICAgIFN0YXRlTWFuYWdlckltcGwgc20gPSBfYnJva2VyLmdldFN0YXRlTWFuYWdlckltcGwob2JqLCBmYWxzZSk7CisgICAgICAgIGlmIChzbSAhPSBudWxsICYmIChzbS5nZXRPd25lcigpID09IG51bGwgfHwgIXZtZC5pc0VtYmVkZGVkUEMoKQorICAgICAgICAgICAgfHwgKHNtLmdldE93bmVyKCkgPT0gX3NtICYmIHNtLmdldE93bmVyTWV0YURhdGEoKSA9PSB2bWQpKSkKKyAgICAgICAgICAgIF9icm9rZXIuZGVsZXRlKHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpLCBzbSwgY2FsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVyZWZlcmVuY2UgYWxsIHZhbGlkIHBlcnNpc3RlbnQgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVyZWZlcmVuY2VEZXBlbmRlbnQoT2JqZWN0W10gb2JqcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBkZXJlZmVyZW5jZURlcGVuZGVudChvYmpzW2ldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXJlZmVyZW5jZSBhbGwgdmFsaWQgcGVyc2lzdGVudCBvYmplY3RzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZXJlZmVyZW5jZURlcGVuZGVudChDb2xsZWN0aW9uIG9ianMpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvYmpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgZGVyZWZlcmVuY2VEZXBlbmRlbnQoaXRyLm5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVyZWZlcmVuY2UgdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGRlcmVmZXJlbmNlRGVwZW5kZW50KE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gX2Jyb2tlci5nZXRTdGF0ZU1hbmFnZXJJbXBsKG9iaiwgZmFsc2UpOworICAgICAgICBpZiAoc20gIT0gbnVsbCkKKyAgICAgICAgICAgIHNtLnNldERlcmVmZXJlbmNlZERlcGVuZGVudCh0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmVseSBpbnZva2UgdGhlIGJyb2tlciB0byBnYXRoZXIgY2FzY2FkZS1yZWZyZXNoIG9iamVjdHMgaW4KKyAgICAgKiB0aGUgY3VycmVudCBmaWVsZCBpbnRvIHRoZSBnaXZlbiBzZXQuIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkCisgICAgICogZm9yIGZpZWxkcyB0aGF0IHdlIGtub3cgaGF2ZSBjYXNjYWRlLXJlZnJlc2ggc2V0dGluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2F0aGVyQ2FzY2FkZVJlZnJlc2goT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqdmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfc20uZ2V0TWV0YURhdGEoKS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIF9icm9rZXIuZ2F0aGVyQ2FzY2FkZVJlZnJlc2gob2JqdmFsLCBjYWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIGdhdGhlckNhc2NhZGVSZWZyZXNoKChPYmplY3RbXSkgb2JqdmFsLCBjYWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgZ2F0aGVyQ2FzY2FkZVJlZnJlc2goKENvbGxlY3Rpb24pIG9ianZhbCwgY2FsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRLZXkoKS5nZXRDYXNjYWRlUmVmcmVzaCgpCisgICAgICAgICAgICAgICAgICAgID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUpCisgICAgICAgICAgICAgICAgICAgIGdhdGhlckNhc2NhZGVSZWZyZXNoKCgoTWFwKSBvYmp2YWwpLmtleVNldCgpLCBjYWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldEVsZW1lbnQoKS5nZXRDYXNjYWRlUmVmcmVzaCgpCisgICAgICAgICAgICAgICAgICAgID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUpCisgICAgICAgICAgICAgICAgICAgIGdhdGhlckNhc2NhZGVSZWZyZXNoKCgoTWFwKSBvYmp2YWwpLnZhbHVlcygpLCBjYWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdhdGhlciBlYWNoIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdhdGhlckNhc2NhZGVSZWZyZXNoKE9iamVjdFtdIGFyciwgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIF9icm9rZXIuZ2F0aGVyQ2FzY2FkZVJlZnJlc2goYXJyW2ldLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHYXRoZXIgZWFjaCBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnYXRoZXJDYXNjYWRlUmVmcmVzaChDb2xsZWN0aW9uIGNvbGwsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgX2Jyb2tlci5nYXRoZXJDYXNjYWRlUmVmcmVzaChpdHIubmV4dCgpLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHByZS1mbHVzaCB0YXNrcyBvbiB0aGUgY3VycmVudCBmaWVsZC4gVGhpcyBpbmNsdWRlcyBjaGVja2luZworICAgICAqIGZvciBudWxscywgcGVyc2lzdGluZyBwY3MsIGVtYmVkZGluZyBlbWJlZGRlZCBmaWVsZHMsIGFuZCByZWYnaW5nCisgICAgICogcGMgZmllbGRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUKKyAgICAgKiBuZXcgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJlRmx1c2goYm9vbGVhbiBsb2dpY2FsLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIC8vIG9ubHkgY2FyZSBhYm91dCBvYmplY3QgZmllbGRzCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX3NtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSA8IEphdmFUeXBlcy5PQkpFQ1QpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gcGVyZm9ybSBwZXJzLWJ5LXJlYWNoIGFuZCBkZXBlbmRlbnQgcmVmcworICAgICAgICBib29sZWFuIHJldCA9IHByZUZsdXNoKGZtZCwgbG9naWNhbCwgY2FsbCk7CisKKyAgICAgICAgLy8gbWFuYWdlIGludmVyc2VzCisgICAgICAgIEludmVyc2VNYW5hZ2VyIG1hbmFnZXIgPSBfYnJva2VyLmdldEludmVyc2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCisgICAgICAgICAgICBtYW5hZ2VyLmNvcnJlY3RSZWxhdGlvbnMoX3NtLCBmbWQsIG9ianZhbCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGxhc3QtcHJvdmlkZWQgZmllbGQgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRibHZhbCA9PSAwICYmIGxvbmd2YWwgPT0gMAorICAgICAgICAgICAgJiYgKG9ianZhbCA9PSBudWxsIHx8ICIiLmVxdWFscyhvYmp2YWwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgc3RvcmVkIGZpZWxkIG9yIGl0cyBkZWZhdWx0IHZhbHVlIHRvIHRoZSBnaXZlbiBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE9iamVjdE91dHB1dCBvdXQsIGJvb2xlYW4gZGVmKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9zbS5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOOgorICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oIWRlZiAmJiBsb25ndmFsID09IDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVCeXRlKChkZWYpID8gKGJ5dGUpIDAgOiAoYnl0ZSkgbG9uZ3ZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIG91dC53cml0ZUNoYXIoKGRlZikgPyAoY2hhcikgMCA6IChjaGFyKSBsb25ndmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVEb3VibGUoKGRlZikgPyAwRCA6IGRibHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVGbG9hdCgoZGVmKSA/IDBGIDogKGZsb2F0KSBkYmx2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgICAgIG91dC53cml0ZUludCgoZGVmKSA/IDAgOiAoaW50KSBsb25ndmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgb3V0LndyaXRlTG9uZygoZGVmKSA/IDBMIDogbG9uZ3ZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVTaG9ydCgoZGVmKSA/IChzaG9ydCkgMCA6IChzaG9ydCkgbG9uZ3ZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCgoZGVmKSA/IG51bGwgOiBvYmp2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBwZXJmb3JtIHByZSBmbHVzaCBhY3Rpb25zIG9uIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHJlRmx1c2goRmllbGRNZXRhRGF0YSBmbWQsIGJvb2xlYW4gbG9naWNhbCwgCisgICAgICAgIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgbnVsbHMKKyAgICAgICAgaWYgKG9ianZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZm1kLmdldE51bGxWYWx1ZSgpID09IEZpZWxkTWV0YURhdGEuTlVMTF9FWENFUFRJT04KKyAgICAgICAgICAgICAgICB8fCBmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PSUQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIGZtZC5nZXROYW1lKCksIF9zbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSkpLgorICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBkbyBmb3Igbm9uLXBlcnNpc3RlbnQKKyAgICAgICAgaWYgKGZtZC5nZXRNYW5hZ2VtZW50KCkgIT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBkb24ndCBhbGxvdyBtYW5hZ2VkIG9iamVjdGlkIGZpZWxkIHZhbHVlCisgICAgICAgIGlmIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PSUQpIHsKKyAgICAgICAgICAgIF9zbS5hc3NlcnROb3RNYW5hZ2VkT2JqZWN0SWQob2JqdmFsKTsKKyAgICAgICAgICAgIGlmIChfc20uZ2V0T2JqZWN0SWQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgIW9ianZhbC5lcXVhbHMoKChPYmplY3RJZCkgX3NtLmdldE9iamVjdElkKCkpLmdldElkKCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoImNoYW5nZWQtb2lkIiwKKyAgICAgICAgICAgICAgICAgICAgX3NtLmdldE9iamVjdElkKCksIG9ianZhbCwKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhfc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpKSkuCisgICAgICAgICAgICAgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIHBjcyBpbiBmaWVsZCB2YWx1ZQorICAgICAgICBpZiAocHJlRmx1c2goZm1kLCBmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpLAorICAgICAgICAgICAgZm1kLmdldEtleSgpLmdldERlY2xhcmVkVHlwZUNvZGUoKSwKKyAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpLCBmYWxzZSwgbG9naWNhbCwgY2FsbCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBhbHNvIGNoZWNrIGZvciBwY3MgaW4gZXh0ZXJuYWxpemVkIHZhbHVlcworICAgICAgICBpZiAoZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICBwcmVGbHVzaChmbWQsIGZtZC5nZXRUeXBlQ29kZSgpLCBmbWQuZ2V0S2V5KCkuZ2V0VHlwZUNvZGUoKSwKKyAgICAgICAgICAgICAgICBmbWQuZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCksIHRydWUsIGxvZ2ljYWwsIGNhbGwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBuZXcgb2JqZWN0cyBwZXJzaXN0ZW50IGFuZCByZWYgb3RoZXIgb2JqZWN0cyBzbyByZWZlcmVuY2VkCisgICAgICogZGVwZW5kZW50IG9iamVjdHMgd29uJ3QgYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHJlRmx1c2goRmllbGRNZXRhRGF0YSBmbWQsIGludCB0eXBlLCBpbnQga2V5VHlwZSwKKyAgICAgICAgaW50IGVsZW1UeXBlLCBib29sZWFuIGV4dGVybmFsLCBib29sZWFuIGxvZ2ljYWwsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IG9ianZhbDsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGJvb2xlYW4gY29weSA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgICAgIGlmIChmbWQuaXNFbWJlZGRlZFBDKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqdmFsID0gZW1iZWQoZm1kLCB2YWwpOworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZXJuYWwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmbWQuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVGbHVzaFBDKGZtZCwgdmFsLCBsb2dpY2FsLCBjYWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIGlmIChleHRlcm5hbCkKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUEMoZm1kLCB2YWwsIGxvZ2ljYWwsIGNhbGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRFbGVtZW50KCkuaXNFbWJlZGRlZFBDKCkpCisgICAgICAgICAgICAgICAgICAgIGVtYmVkKGZtZC5nZXRFbGVtZW50KCksIChPYmplY3RbXSkgdmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtVHlwZSA9PSBKYXZhVHlwZXMuUEMKKyAgICAgICAgICAgICAgICAgICAgfHwgZWxlbVR5cGUgPT0gSmF2YVR5cGVzLlBDX1VOVFlQRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlRmx1c2hQQ3MoZm1kLmdldEVsZW1lbnQoKSwgKE9iamVjdFtdKSB2YWwsIGxvZ2ljYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRFbGVtZW50KCkuaXNFbWJlZGRlZFBDKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqdmFsID0gZW1iZWQoZm1kLmdldEVsZW1lbnQoKSwgKENvbGxlY3Rpb24pIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUgPT0gSmF2YVR5cGVzLlBDCisgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1UeXBlID09IEphdmFUeXBlcy5QQ19VTlRZUEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmx1c2hlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZXJuYWwpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmbWQuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBQcm94eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnRjdXQgY2hhbmdlIHRyYWNrZXJzOyBhbHNvIGVuc3VyZXMgd2UgZG9uJ3QgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIGxycyBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRyYWNrZXIgY3QgPSAoKFByb3h5KSB2YWwpLmdldENoYW5nZVRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdCAhPSBudWxsICYmIGN0LmlzVHJhY2tpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRFbGVtZW50KCksIGN0LmdldEFkZGVkKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsLCBjYWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVGbHVzaFBDcyhmbWQuZ2V0RWxlbWVudCgpLCBjdC5nZXRDaGFuZ2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWwsIGNhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZmx1c2hlZCAmJiB2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRFbGVtZW50KCksIChDb2xsZWN0aW9uKSB2YWwsIGxvZ2ljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIGJvb2xlYW4ga2V5RW1iZWQgPSBmbWQuZ2V0S2V5KCkuaXNFbWJlZGRlZFBDKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxFbWJlZCA9IGZtZC5nZXRFbGVtZW50KCkuaXNFbWJlZGRlZFBDKCk7CisgICAgICAgICAgICAgICAgaWYgKGtleUVtYmVkIHx8IHZhbEVtYmVkKSB7CisgICAgICAgICAgICAgICAgICAgIG9ianZhbCA9IGVtYmVkKGZtZCwgKE1hcCkgdmFsLCBrZXlFbWJlZCwgdmFsRW1iZWQpOworICAgICAgICAgICAgICAgICAgICBjb3B5ID0ga2V5RW1iZWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFrZXlFbWJlZCAmJiAoa2V5VHlwZSA9PSBKYXZhVHlwZXMuUEMKKyAgICAgICAgICAgICAgICAgICAgfHwga2V5VHlwZSA9PSBKYXZhVHlwZXMuUENfVU5UWVBFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRlcm5hbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0Y3V0IGNoYW5nZSB0cmFja2VyczsgYWxzbyBlbnN1cmVzIHdlIGRvbid0IAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBscnMgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICBNYXBDaGFuZ2VUcmFja2VyIGN0ID0gKE1hcENoYW5nZVRyYWNrZXIpICgoUHJveHkpIHZhbCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbmdlVHJhY2tlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwgJiYgY3QuaXNUcmFja2luZygpICYmIGN0LmdldFRyYWNrS2V5cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRLZXkoKSwgY3QuZ2V0QWRkZWQoKSwgbG9naWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlRmx1c2hQQ3MoZm1kLmdldEtleSgpLCBjdC5nZXRDaGFuZ2VkKCksIGxvZ2ljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZmx1c2hlZCAmJiB2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRLZXkoKSwgKChNYXApIHZhbCkua2V5U2V0KCksIGxvZ2ljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCF2YWxFbWJlZCAmJiAoZWxlbVR5cGUgPT0gSmF2YVR5cGVzLlBDCisgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1UeXBlID09IEphdmFUeXBlcy5QQ19VTlRZUEVEKSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0Y3V0IGNoYW5nZSB0cmFja2VyczsgYWxzbyBlbnN1cmVzIHdlIGRvbid0IAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBscnMgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICBNYXBDaGFuZ2VUcmFja2VyIGN0ID0gKE1hcENoYW5nZVRyYWNrZXIpICgoUHJveHkpIHZhbCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbmdlVHJhY2tlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwgJiYgY3QuaXNUcmFja2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0LmdldFRyYWNrS2V5cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRFbGVtZW50KCksIGN0LmdldEFkZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwKSB2YWwsIGxvZ2ljYWwsIGNhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVGbHVzaFBDcyhmbWQuZ2V0RWxlbWVudCgpLCBjdC5nZXRDaGFuZ2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwKSB2YWwsIGxvZ2ljYWwsIGNhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRFbGVtZW50KCksIGN0LmdldEFkZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsLCBjYWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlRmx1c2hQQ3MoZm1kLmdldEVsZW1lbnQoKSwgY3QuZ2V0Q2hhbmdlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbCwgY2FsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZmx1c2hlZCAmJiB2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZUZsdXNoUENzKGZtZC5nZXRFbGVtZW50KCksICgoTWFwKSB2YWwpLnZhbHVlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWwsIGNhbGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIG5ldyBvYmplY3RzIHBlcnNpc3RlbnQgYW5kIHJlZiBhbGwgdmFsaWQgcGVyc2lzdGVudCBvYmplY3RzIGZvcgorICAgICAqIHRoZSBnaXZlbiBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVGbHVzaFBDcyhWYWx1ZU1ldGFEYXRhIHZtZCwgQ29sbGVjdGlvbiBrZXlzLCBNYXAgbWFwLAorICAgICAgICBib29sZWFuIGxvZ2ljYWwsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgcHJlRmx1c2hQQyh2bWQsIG1hcC5nZXQoaXRyLm5leHQoKSksIGxvZ2ljYWwsIGNhbGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgbmV3IG9iamVjdHMgcGVyc2lzdGVudCBhbmQgcmVmIGFsbCB2YWxpZCBwZXJzaXN0ZW50IG9iamVjdHMgaW4KKyAgICAgKiB0aGUgZ2l2ZW4gYXJyYXkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZUZsdXNoUENzKFZhbHVlTWV0YURhdGEgdm1kLCBPYmplY3RbXSBvYmpzLAorICAgICAgICBib29sZWFuIGxvZ2ljYWwsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcHJlRmx1c2hQQyh2bWQsIG9ianNbaV0sIGxvZ2ljYWwsIGNhbGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgbmV3IG9iamVjdHMgcGVyc2lzdGVudCBhbmQgcmVmIGFsbCB2YWxpZCBwZXJzaXN0ZW50IG9iamVjdHMgaW4KKyAgICAgKiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJlRmx1c2hQQ3MoVmFsdWVNZXRhRGF0YSB2bWQsIENvbGxlY3Rpb24gb2JqcywKKyAgICAgICAgYm9vbGVhbiBsb2dpY2FsLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb2Jqcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHByZUZsdXNoUEModm1kLCBpdHIubmV4dCgpLCBsb2dpY2FsLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHByZSBmbHVzaCBvcGVyYXRpb25zIG9uIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZUZsdXNoUEMoVmFsdWVNZXRhRGF0YSB2bWQsIE9iamVjdCBvYmosIGJvb2xlYW4gbG9naWNhbCwKKyAgICAgICAgT3BDYWxsYmFja3MgY2FsbCkgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTsKKyAgICAgICAgaWYgKHZtZC5nZXRDYXNjYWRlUGVyc2lzdCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FKSB7CisgICAgICAgICAgICBpZiAoIV9icm9rZXIuaXNEZXRhY2hlZE5ldygpICYmIF9icm9rZXIuaXNEZXRhY2hlZChvYmopKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWxsb3cgYnV0IGlnbm9yZQorCisgICAgICAgICAgICBzbSA9IF9icm9rZXIuZ2V0U3RhdGVNYW5hZ2VyKG9iaik7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCB8fCAhc20uaXNQZXJzaXN0ZW50KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1jYXNjYWRlLXBlcnNpc3QiLAorICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKG9iaiksIHZtZCwKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhfc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpKSkuCisgICAgICAgICAgICAgICAgICAgIHNldEZhaWxlZE9iamVjdChvYmopOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc20gPSBfYnJva2VyLmdldFN0YXRlTWFuYWdlcihvYmopOworICAgICAgICAgICAgaWYgKHNtID09IG51bGwgfHwgIXNtLmlzUHJvdmlzaW9uYWwoKSkKKyAgICAgICAgICAgICAgICBzbSA9IF9icm9rZXIucGVyc2lzdChvYmosIG51bGwsIHRydWUsIGNhbGwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGlmIGRlbGV0ZWQgYW5kIG5vdCBtYW5hZ2VkIGludmVyc2UsIGRpZQorICAgICAgICAgICAgaWYgKHNtLmlzRGVsZXRlZCgpICYmIChfYnJva2VyLmdldEludmVyc2VNYW5hZ2VyKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IHZtZC5nZXRGaWVsZE1ldGFEYXRhKCkuZ2V0SW52ZXJzZU1ldGFEYXRhcygpLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgicmVmLXRvLWRlbGV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKG9iaiksIHZtZCwKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhfc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpKSkuCisgICAgICAgICAgICAgICAgICAgIHNldEZhaWxlZE9iamVjdChvYmopOworCisgICAgICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtaW1wbCA9IChTdGF0ZU1hbmFnZXJJbXBsKSBzbTsKKyAgICAgICAgICAgIHNtaW1wbC5ub25wcm92aXNpb25hbChsb2dpY2FsLCBjYWxsKTsKKyAgICAgICAgICAgIHNtaW1wbC5zZXREZXJlZmVyZW5jZWREZXBlbmRlbnQoZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhbGwgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5IGVtYmVkZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbWJlZChWYWx1ZU1ldGFEYXRhIHZtZCwgT2JqZWN0W10gYXJyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXJyW2ldID0gZW1iZWQodm1kLCBhcnJbaV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24gY29udGFpbmluZyBlbWJlZGRlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbGxlY3Rpb24gZW1iZWQoVmFsdWVNZXRhRGF0YSB2bWQsIENvbGxlY3Rpb24gb3JpZykgeworICAgICAgICAvLyB3ZSBoYXZlIHRvIGNvcHkgdG8gZ2V0IGEgY29sbGVjdGlvbiBvZiB0aGUgcmlnaHQgdHlwZSBhbmQgc2l6ZSwKKyAgICAgICAgLy8gdGhvdWdoIHdlIGltbWVkaWF0ZWx5IGNsZWFyIGl0CisgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IGdldFByb3h5TWFuYWdlcigpLmNvcHlDb2xsZWN0aW9uKG9yaWcpOworICAgICAgICBpZiAoY29sbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1jb3B5YWJsZSIsCisgICAgICAgICAgICAgICAgdm1kLmdldEZpZWxkTWV0YURhdGEoKSkpOworCisgICAgICAgIGNvbGwuY2xlYXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvcmlnLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgY29sbC5hZGQoZW1iZWQodm1kLCBpdHIubmV4dCgpKSk7CisgICAgICAgIHJldHVybiBjb2xsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtYmVkIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbWFwLgorICAgICAqLworICAgIHByaXZhdGUgTWFwIGVtYmVkKEZpZWxkTWV0YURhdGEgZm1kLCBNYXAgb3JpZywgYm9vbGVhbiBrZXlFbWJlZCwKKyAgICAgICAgYm9vbGVhbiB2YWxFbWJlZCkgeworICAgICAgICBNYXAgbWFwOworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisKKyAgICAgICAgLy8gaWYgd2UgaGF2ZSB0byByZXBsYWNlIGtleXMsIHdlIG5lZWQgdG8gY29weSB0aGUgbWFwOyBvdGhlcndpc2UKKyAgICAgICAgLy8gd2UgY2FuIG11dGF0ZSB0aGUgdmFsdWVzIGRpcmVjdGx5CisgICAgICAgIGlmIChrZXlFbWJlZCkgeworICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjb3B5IHRvIGdldCBhIGNvbGxlY3Rpb24gb2YgdGhlIHJpZ2h0IHR5cGUgYW5kIHNpemUsCisgICAgICAgICAgICAvLyB0aG91Z2ggd2UgaW1tZWRpYXRlbHkgY2xlYXIgaXQKKyAgICAgICAgICAgIG1hcCA9IGdldFByb3h5TWFuYWdlcigpLmNvcHlNYXAob3JpZyk7CisgICAgICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1jb3B5YWJsZSIsIGZtZCkpOworCisgICAgICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgICAgIE9iamVjdCBrZXksIHZhbDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb3JpZy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGtleSA9IGVtYmVkKGZtZC5nZXRLZXkoKSwgZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbEVtYmVkKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBlbWJlZChmbWQuZ2V0RWxlbWVudCgpLCB2YWwpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFwID0gb3JpZzsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoZW1iZWQoZm1kLmdldEVsZW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgZ2l2ZW4gb2JqZWN0IGVtYmVkZGVkLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGVtYmVkKFZhbHVlTWV0YURhdGEgdm1kLCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gX2Jyb2tlci5lbWJlZChvYmosIG51bGwsIF9zbSwgdm1kKS5nZXRNYW5hZ2VkSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IG1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm94eU1hbmFnZXIgZ2V0UHJveHlNYW5hZ2VyICgpCisJeworCQlyZXR1cm4gX2Jyb2tlci5nZXRDb25maWd1cmF0aW9uICgpLmdldFByb3h5TWFuYWdlckluc3RhbmNlICgpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1N0YXRlTWFuYWdlckltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1N0YXRlTWFuYWdlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcwNDIwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RhdGVNYW5hZ2VySW1wbC5qYXZhCkBAIC0wLDAgKzEsMzA0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkZpZWxkTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5TdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVFdmVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZldGNoR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVXBkYXRlU3RyYXRlZ2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlU3RyYXRlZ2llczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5BcHBsaWNhdGlvbklkczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludmFsaWRTdGF0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfSBpbnRlcmZhY2UgZm9yIHVzZQorICogd2l0aCB0aGlzIHJ1bnRpbWUuIEVhY2ggc3RhdGUgbWFuYWdlciBtYW5hZ2VzIHRoZSBzdGF0ZSBvZiBhIHNpbmdsZQorICogcGVyc2lzdGVuY2UgY2FwYWJsZSBpbnN0YW5jZS4gVGhlIHN0YXRlIG1hbmFnZXIgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IKKyAqIGFsbCBjb21tdW5pY2F0aW9ucyBhYm91dCB0aGUgaW5zdGFuY2UgdG8gdGhlIHtAbGluayBTdG9yZU1hbmFnZXJ9LgorICogIFRoZSBzdGF0ZSBtYW5hZ2VyIHVzZXMgdGhlIFN0YXRlIHBhdHRlcm4gaW4gYm90aCBpdHMgaW50ZXJhY3Rpb24gd2l0aAorICogdGhlIGdvdmVybmVkIGluc3RhbmNlIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCB0aGUgYnJva2VyLgorICogSW4gaXRzIGludGVyYWN0aW9ucyB3aXRoIHRoZSBwZXJzaXN0ZW5jZSBjYXBhYmxlIGluc3RhbmNlLCBpdCB1c2VzIHRoZQorICoge0BsaW5rIEZpZWxkTWFuYWdlcn0gaW50ZXJmYWNlLiBTaW1pbGFybHksIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUKKyAqIGJyb2tlciwgaXQgdXNlcyB0aGUge0BsaW5rIFBDU3RhdGV9IHNpbmdsZXRvbiB0aGF0IHJlcHJlc2VudHMKKyAqIHRoZSBjdXJyZW50IGxpZmVjeWNsZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFN0YXRlTWFuYWdlckltcGwKKyAgICBpbXBsZW1lbnRzIE9wZW5KUEFTdGF0ZU1hbmFnZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9GR1MgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfQUxMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX1NFUklBTElaRSA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TQVZFID0gMiA8PCAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0RFUkVGID0gMiA8PCAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0xPQURFRCA9IDIgPDwgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUFEX0xPQ0tFRCA9IDIgPDwgMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19XUklURV9MT0NLRUQgPSAyIDw8IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfT0lEX0FTU0lHTkVEID0gMiA8PCA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0xPQURJTkcgPSAyIDw8IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJFX0RFTEVUSU5HID0gMiA8PCA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZMVVNIRUQgPSAyIDw8IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJFX0ZMVVNIRUQgPSAyIDw8IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRkxVU0hFRF9ESVJUWSA9IDIgPDwgMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU1QTF9DQUNIRSA9IDIgPDwgMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5WRVJTRVMgPSAyIDw8IDEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX05PX1VOUFJPWFkgPSAyIDw8IDEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1ZFUlNJT05fQ0hFQ0sgPSAyIDw8IDE0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1ZFUlNJT05fVVBEQVRFID0gMiA8PCAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ERVRBQ0hJTkcgPSAyIDw8IDE2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU3RhdGVNYW5hZ2VySW1wbC5jbGFzcyk7CisKKyAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGFuY2UKKyAgICBwcml2YXRlIFBlcnNpc3RlbmNlQ2FwYWJsZSBfcGMgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBCaXRTZXQgX2xvYWRlZCA9IG51bGw7CisgICAgcHJpdmF0ZSBCaXRTZXQgX2RpcnR5ID0gbnVsbDsKKyAgICBwcml2YXRlIEJpdFNldCBfZmx1c2ggPSBudWxsOworICAgIHByaXZhdGUgaW50IF9mbGFncyA9IDA7CisKKyAgICAvLyBpZCBpcyB0aGUgc3RhdGUgbWFuYWdlciBpZGVudGl0eTsgb2lkIGlzIHRoZSBwZXJzaXN0ZW50IGlkZW50aXR5LiAgb2lkCisgICAgLy8gbWF5IGJlIG51bGwgZm9yIGVtYmVkZGVkIGFuZCB0cmFuc2llbnQtdHJhbnNhY3Rpb25hbCBvYmplY3RzIG9yIG5ldworICAgIC8vIGluc3RhbmNlcyB0aGF0IGhhdmVuJ3QgYmVlbiBhc3NpZ25lZCBhbiBvaWQuICBpZCBpcyByZWFzc2lnbmVkIHRvIG9pZAorICAgIC8vIG9uIHN1Y2Nlc3NmdWwgb2lkIGFzc2lnbm1lbnQgKG9yIGZsdXNoIGNvbXBsZXRpb24gaWYgYXNzaWdubWVudCBpcworICAgIC8vIGR1cmluZyBmbHVzaCkKKyAgICBwcml2YXRlIE9iamVjdCBfaWQgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0IF9vaWQgPSBudWxsOworCisgICAgLy8gdGhlIG1hbmFnaW5nIHBlcnNpc3RlbmNlIG1hbmFnZXIgYW5kIGxpZmVjeWNsZSBzdGF0ZQorICAgIHByaXZhdGUgZmluYWwgQnJva2VySW1wbCBfYnJva2VyOworICAgIHByaXZhdGUgUENTdGF0ZSBfc3RhdGUgPSBQQ1N0YXRlLlRSQU5TSUVOVDsKKworICAgIC8vIHRoZSBjdXJyZW50IGFuZCBsYXN0IGxvYWRlZCB2ZXJzaW9uIGluZGljYXRvcnMsIGFuZCB0aGUgbG9jayBvYmplY3QKKyAgICBwcml2YXRlIE9iamVjdCBfdmVyc2lvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3QgX2xvYWRWZXJzaW9uID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdCBfbG9jayA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX3JlYWRMb2NrTGV2ZWwgPSAtMTsKKyAgICBwcml2YXRlIGludCBfd3JpdGVMb2NrTGV2ZWwgPSAtMTsKKworICAgIC8vIGRlbGVnYXRlcyB3aGVuIHByb3ZpZGluZy9yZXBsYWNpbmcgaW5zdGFuY2UgZGF0YQorICAgIHByaXZhdGUgU2luZ2xlRmllbGRNYW5hZ2VyIF9zaW5nbGUgPSBudWxsOworICAgIHByaXZhdGUgU2F2ZUZpZWxkTWFuYWdlciBfc2F2ZWQgPSBudWxsOworICAgIHByaXZhdGUgRmllbGRNYW5hZ2VyIF9mbSA9IG51bGw7CisKKyAgICAvLyBpbXBsZGF0YTsgZmllbGQgaW1wbGRhdGEgYW5kIGludGVybWVkaWF0ZSBkYXRhIHNoYXJlIHRoZSBzYW1lIGFycmF5CisgICAgcHJpdmF0ZSBPYmplY3QgX2ltcGwgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0W10gX2ZpZWxkSW1wbCA9IG51bGw7CisKKyAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3duZXIgb2YgdGhpcyBpbnN0YW5jZSwgaWYgaXQgaXMgZW1iZWRkZWQKKyAgICBwcml2YXRlIFN0YXRlTWFuYWdlckltcGwgX293bmVyID0gbnVsbDsKKyAgICBwcml2YXRlIFZhbHVlTWV0YURhdGEgX293bmVyTWV0YSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGlkLCB0eXBlIG1ldGFkYXRhLCBhbmQgb3duaW5nIHBlcnNpc3RlbmNlIG1hbmFnZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0YXRlTWFuYWdlckltcGwoT2JqZWN0IGlkLCBDbGFzc01ldGFEYXRhIG1ldGEsIAorICAgICAgICBCcm9rZXJJbXBsIGJyb2tlcikgeworICAgICAgICBfaWQgPSBpZDsKKyAgICAgICAgX21ldGEgPSBtZXRhOworICAgICAgICBfYnJva2VyID0gYnJva2VyOworICAgICAgICBfc2luZ2xlID0gbmV3IFNpbmdsZUZpZWxkTWFuYWdlcih0aGlzLCBicm9rZXIpOworCisgICAgICAgIGlmIChfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX1VOS05PV04pCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibWV0YS11bmtub3duaWQiLCBfbWV0YSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3duaW5nIHN0YXRlIGFuZCBmaWVsZCBpZiB0aGlzIGlzIGFuIGVtYmVkZGVkIGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgc2V0T3duZXIoU3RhdGVNYW5hZ2VySW1wbCBvd25lciwgVmFsdWVNZXRhRGF0YSBvd25lck1ldGEpIHsKKyAgICAgICAgX293bmVyID0gb3duZXI7CisgICAgICAgIF9vd25lck1ldGEgPSBvd25lck1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHN0YXRlIG1hbmFnZXIgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGxvYWQuCisgICAgICovCisgICAgYm9vbGVhbiBpc0xvYWRpbmcoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19MT0FESU5HKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHN0YXRlIG1hbmFnZXIgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGxvYWQgaW5pdGlhdGVkCisgICAgICogYnkgb3V0c2lkZSBjb2RlOyBmb3IgYW55IGludGVybmFsIG1ldGhvZHMgdGhhdCBjYXVzZSBsb2FkaW5nLCB0aGUKKyAgICAgKiBsb2FkaW5nIGZsYWcgaXMgc2V0IGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgdm9pZCBzZXRMb2FkaW5nKGJvb2xlYW4gbG9hZGluZykgeworICAgICAgICBpZiAobG9hZGluZykKKyAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0xPQURJTkc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19MT0FESU5HOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBvciByZXNldCB0aGUgbGlmZWN5Y2xlIHN0YXRlIG9mIHRoZSBtYW5hZ2VkIGluc3RhbmNlLiBJZiB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbmFsIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGVubGlzdGVkLworICAgICAqIGRlbGlzdGVkIGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYXMgbmVjZXNzYXJ5LiBUaGUgZ2l2ZW4KKyAgICAgKiBzdGF0ZSB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIGJlaW5nIHNldC4gSWYgdGhlIGdpdmVuIHN0YXRlCisgICAgICogaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGUsIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFBDU3RhdGUoUENTdGF0ZSBzdGF0ZSkgeworICAgICAgICBpZiAoX3N0YXRlID09IHN0YXRlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgc3RvcmUgbWFuYWdlciB0aGF0IHdlJ3JlIGNoYW5naW5nIHN0YXRlczsgY2FuIHZldG8KKyAgICAgICAgICAgIF9icm9rZXIuZ2V0U3RvcmVNYW5hZ2VyKCkuYmVmb3JlU3RhdGVDaGFuZ2UodGhpcywgX3N0YXRlLCBzdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIHJlcGxhY2Ugc3RhdGUKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzRGVsZXRlZCA9IF9zdGF0ZS5pc0RlbGV0ZWQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzRGlydHkgPSBfc3RhdGUuaXNEaXJ0eSgpOworICAgICAgICAgICAgYm9vbGVhbiB3YXNQZW5kaW5nID0gX3N0YXRlLmlzUGVuZGluZ1RyYW5zYWN0aW9uYWwoKTsKKyAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworCisgICAgICAgICAgICAvLyBlbmxpc3QvZGVsaXN0IGZyb20gdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIGlmIChfc3RhdGUuaXNUcmFuc2FjdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICBfYnJva2VyLmFkZFRvVHJhbnNhY3Rpb24odGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKF9zdGF0ZS5pc0RlbGV0ZWQoKSAhPSB3YXNEZWxldGVkKQorICAgICAgICAgICAgICAgICAgICBfYnJva2VyLnNldERpcnR5KHRoaXMsICF3YXNEaXJ0eSB8fCBpc0ZsdXNoZWQoKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3N0YXRlLmlzRGlydHkoKSAmJiAhd2FzRGlydHkpCisgICAgICAgICAgICAgICAgICAgIF9icm9rZXIuc2V0RGlydHkodGhpcywgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCF3YXNQZW5kaW5nICYmIF9zdGF0ZS5pc1BlbmRpbmdUcmFuc2FjdGlvbmFsKCkpCisgICAgICAgICAgICAgICAgX2Jyb2tlci5hZGRUb1BlbmRpbmdUcmFuc2FjdGlvbih0aGlzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHdhc1BlbmRpbmcgJiYgIV9zdGF0ZS5pc1BlbmRpbmdUcmFuc2FjdGlvbmFsKCkpCisgICAgICAgICAgICAgICAgX2Jyb2tlci5yZW1vdmVGcm9tUGVuZGluZ1RyYW5zYWN0aW9uKHRoaXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9icm9rZXIucmVtb3ZlRnJvbVRyYW5zYWN0aW9uKHRoaXMpOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplCisgICAgICAgICAgICBfc3RhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKKyAgICAgICAgICAgIGlmIChfc3RhdGUuaXNEZWxldGVkKCkgJiYgIXdhc0RlbGV0ZWQpCisgICAgICAgICAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkFGVEVSX0RFTEVURSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gT3BlbkpQQVN0YXRlTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzIGNscywgUENTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgb3VyIGN1cnJlbnQgb2JqZWN0IGlkIGluc3RhbmNlIGlzIHRoZQorICAgICAgICAvLyBjb3JyZWN0IGlkIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3M7IHRoaXMgaXMgZm9yIGNhc2VzCisgICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBhbiBhcHBsaWNhdGlvbiBpZCBoaWVyYXJjaHkgYW5kIHdlIGhhZCBzZXQgdGhlCisgICAgICAgIC8vIG1ldGFkYXRhIHRvIGEgc3VwZXJjbGFzcyBpZCAtLSB0aGUgc3ViY2xhc3MnIGlkIG1heSBiZSBhCisgICAgICAgIC8vIGRpZmZlcmVudCBjbGFzcywgc28gd2UgbmVlZCB0byByZXNldCBpdAorICAgICAgICBpZiAoX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpICE9IGNscykgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdWIgPSBfbWV0YS5nZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGEKKyAgICAgICAgICAgICAgICAoY2xzLCBfYnJva2VyLmdldENsYXNzTG9hZGVyKCksIHRydWUpOworICAgICAgICAgICAgaWYgKF9vaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgICAgICAgICAgX29pZCA9IF9icm9rZXIuZ2V0U3RvcmVNYW5hZ2VyKCkuY29weURhdGFTdG9yZUlkKF9vaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9tZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpCisgICAgICAgICAgICAgICAgICAgIF9vaWQgPSBBcHBsaWNhdGlvbklkcy5jb3B5KF9vaWQsIHN1Yik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ViLmdldE9iamVjdElkVHlwZSgpICE9IF9tZXRhLmdldE9iamVjdElkVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHBrRmllbGRzID0gQXBwbGljYXRpb25JZHMudG9QS1ZhbHVlcyhfb2lkLCBfbWV0YSk7CisgICAgICAgICAgICAgICAgICAgIF9vaWQgPSBBcHBsaWNhdGlvbklkcy5mcm9tUEtWYWx1ZXMocGtGaWVsZHMsIHN1Yik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX21ldGEgPSBzdWI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNscy5pc0ludGVyZmFjZSgpKQorICAgICAgICAgICAgY2xzID0gX21ldGEuZ2V0SW50ZXJmYWNlSW1wbCgpOworCisgICAgICAgIFBlcnNpc3RlbmNlQ2FwYWJsZSBpbnN0ID0gUENSZWdpc3RyeS5uZXdJbnN0YW5jZShjbHMsIHRoaXMsIF9vaWQsIHRydWUpOworICAgICAgICBpZiAoaW5zdCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyB0aGUgaW5zdGFuY2Ugd2FzIG51bGw6IGNoZWNrIHRvIHNlZSBpZiB0aGUgaW5zdGFuY2UgaXMKKyAgICAgICAgICAgIC8vIGFic3RyYWN0IChhcyBjYW4gc29tZXRpbWVzIGJlIHRoZSBjYXNlIHdoZW4gdGhlCisgICAgICAgICAgICAvLyBjbGFzcyBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5IGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseSkKKyAgICAgICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KGNscy5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoImluc3RhbnRpYXRlLWFic3RyYWN0IiwKKyAgICAgICAgICAgICAgICAgICAgY2xzLmdldE5hbWUoKSwgX29pZCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpbml0aWFsaXplKGluc3QsIHN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHdpdGggdGhlIGdpdmVuIGluc3RhbmNlIGFuZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgUENTdGF0ZSBzdGF0ZSkgeworICAgICAgICBpZiAocGMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbml0LW51bGwtcGMiLCBfbWV0YSkpOworICAgICAgICBpZiAocGMucGNHZXRTdGF0ZU1hbmFnZXIoKSAhPSBudWxsICYmIHBjLnBjR2V0U3RhdGVNYW5hZ2VyKCkgIT0gdGhpcykKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbml0LXNtLXBjIiwKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKHBjKSkpLnNldEZhaWxlZE9iamVjdChwYyk7CisgICAgICAgIHBjLnBjUmVwbGFjZVN0YXRlTWFuYWdlcih0aGlzKTsKKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICBfbG9hZGVkID0gbmV3IEJpdFNldChmbWRzLmxlbmd0aCk7CisgICAgICAgIF9mbHVzaCA9IG5ldyBCaXRTZXQoZm1kcy5sZW5ndGgpOworICAgICAgICBfZGlydHkgPSBuZXcgQml0U2V0KGZtZHMubGVuZ3RoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIG1hcmsgcHJpbWFyeSBrZXkgYW5kIG5vbi1wZXJzaXN0ZW50IGZpZWxkcyBhcyBsb2FkZWQKKyAgICAgICAgICAgIGlmIChmbWRzW2ldLmlzUHJpbWFyeUtleSgpCisgICAgICAgICAgICAgICAgfHwgZm1kc1tpXS5nZXRNYW5hZ2VtZW50KCkgIT0gZm1kc1tpXS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICBfbG9hZGVkLnNldChpKTsKKworICAgICAgICAgICAgLy8gcmVjb3JkIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtYW5hZ2VkIGludmVyc2UgZmllbGRzCisgICAgICAgICAgICBpZiAoX2Jyb2tlci5nZXRJbnZlcnNlTWFuYWdlcigpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBmbWRzW2ldLmdldEludmVyc2VNZXRhRGF0YXMoKS5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0lOVkVSU0VTOworICAgICAgICB9CisKKyAgICAgICAgcGMucGNTZXREZXRhY2hlZFN0YXRlKG51bGwpOworICAgICAgICBfcGMgPSBwYzsKKworICAgICAgICBpZiAoX29pZCBpbnN0YW5jZW9mIE9wZW5KUEFJZCkKKyAgICAgICAgICAgICgoT3BlbkpQQUlkKSBfb2lkKS5zZXRNYW5hZ2VkSW5zdGFuY2VUeXBlKF9tZXRhLmdldERlc2NyaWJlZFR5cGUoKSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBvdXIgc3RhdGUgYW5kIGFkZCBvdXJzZWx2ZXMgdG8gdGhlIGJyb2tlcidzIGNhY2hlCisgICAgICAgIHNldFBDU3RhdGUoc3RhdGUpOworICAgICAgICBfYnJva2VyLnNldFN0YXRlTWFuYWdlcihfaWQsIHRoaXMsIEJyb2tlckltcGwuU1RBVFVTX0lOSVQpOworICAgICAgICBpZiAoc3RhdGUgPT0gUENTdGF0ZS5QTkVXKQorICAgICAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkFGVEVSX1BFUlNJU1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmUgdGhlIGdpdmVuIGxpZmVjeWNsZSBldmVudCB0byBhbGwgbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmaXJlTGlmZWN5Y2xlRXZlbnQoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZmlyZUxpZmVjeWNsZUV2ZW50KGdldE1hbmFnZWRJbnN0YW5jZSgpLCBudWxsLAorICAgICAgICAgICAgX21ldGEsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIGxvYWQoZmV0Y2gsIExPQURfRkdTLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgc3RhdGUgb2YgdGhpcyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmV0Y2ggY29uZmlndXJhdGlvbgorICAgICAqIGFuZCBsb2FkIG1vZGUuIFJldHVybiB0cnVlIGlmIGFueSBkYXRhIHdhcyBsb2FkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IGxvYWRNb2RlLAorICAgICAgICBCaXRTZXQgZXhjbHVkZSwgT2JqZWN0IHNkYXRhLCBib29sZWFuIGZvcldyaXRlKSB7CisgICAgICAgIGlmICghZm9yV3JpdGUgJiYgKCFpc1BlcnNpc3RlbnQoKSB8fCBpc05ldygpIHx8IGlzRGVsZXRlZCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBpZiBhbnkgZmllbGRzIGJlaW5nIGxvYWRlZCwgZG8gc3RhdGUgdHJhbnNpdGlvbnMgZm9yIHJlYWQKKyAgICAgICAgQml0U2V0IGZpZWxkcyA9IGdldFVubG9hZGVkSW50ZXJuYWwoZmV0Y2gsIGxvYWRNb2RlLCBleGNsdWRlKTsKKyAgICAgICAgYm9vbGVhbiBhY3RpdmUgPSBfYnJva2VyLmlzQWN0aXZlKCk7CisgICAgICAgIGlmICghZm9yV3JpdGUgJiYgZmllbGRzICE9IG51bGwpCisgICAgICAgICAgICBiZWZvcmVSZWFkKC0xKTsKKworICAgICAgICAvLyBjYWxsIGxvYWQgZXZlbiBpZiBubyBmaWVsZHMgYXJlIGJlaW5nIGxvYWRlZCwgYmVjYXVzZSBpdCB0YWtlcworICAgICAgICAvLyBjYXJlIG9mIGNoZWNraW5nIGlmIHRoZSBERkcgaXMgbG9hZGVkLCBtYWtpbmcgc3VyZSB2ZXJzaW9uIGluZm8KKyAgICAgICAgLy8gaXMgbG9hZGVkLCBldGMKKyAgICAgICAgaW50IGxvY2tMZXZlbCA9IGNhbGN1bGF0ZUxvY2tMZXZlbChhY3RpdmUsIGZvcldyaXRlLCBmZXRjaCk7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gbG9hZEZpZWxkcyhmaWVsZHMsIGZldGNoLCBsb2NrTGV2ZWwsIHNkYXRhLCBmb3JXcml0ZSk7CisgICAgICAgIG9idGFpbkxvY2tzKGFjdGl2ZSwgZm9yV3JpdGUsIGxvY2tMZXZlbCwgZmV0Y2gsIHNkYXRhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1hbmFnZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYzsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VDYXBhYmxlIGdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gX293bmVyOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZU1ldGFEYXRhIGdldE93bmVyTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfb3duZXJNZXRhOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWQoKSB7CisgICAgICAgIHJldHVybiBfb3duZXIgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZsdXNoZWQoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19GTFVTSEVEKSA+IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGbHVzaGVkRGlydHkoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19GTFVTSEVEX0RJUlRZKSA+IDA7CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCBnZXRMb2FkZWQoKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVkOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0Rmx1c2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9mbHVzaDsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0U2V0IGdldERpcnR5KCkgeworICAgICAgICByZXR1cm4gX2RpcnR5OworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0VW5sb2FkZWQoRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIHRvIGxvYWQgZnJvbSBkYXRhIHN0b3JlIGJhc2VkIG9uIGZldGNoIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgQml0U2V0IGZpZWxkcyA9IGdldFVubG9hZGVkSW50ZXJuYWwoZmV0Y2gsIExPQURfRkdTLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIChmaWVsZHMgPT0gbnVsbCkgPyBuZXcgQml0U2V0KDApIDogZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIHZlcnNpb24gb2Yge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXIjZ2V0VW5sb2FkZWR9IHRoYXQgYXZvaWRzCisgICAgICogY3JlYXRpbmcgYW4gZW1wdHkgYml0IHNldCBieSByZXR1cm5pbmcgbnVsbCB3aGVuIHRoZXJlIGFyZSBubyB1bmxvYWRlZAorICAgICAqIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJpdFNldCBnZXRVbmxvYWRlZEludGVybmFsKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgaW50IG1vZGUsCisgICAgICAgIEJpdFNldCBleGNsdWRlKSB7CisgICAgICAgIGlmIChleGNsdWRlID09IFN0b3JlQ29udGV4dC5FWENMVURFX0FMTCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEJpdFNldCBmaWVsZHMgPSBudWxsOworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICBib29sZWFuIGxvYWQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKF9sb2FkZWQuZ2V0KGkpIHx8IChleGNsdWRlICE9IG51bGwgJiYgZXhjbHVkZS5nZXQoaSkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIExPQURfU0VSSUFMSVpFOgorICAgICAgICAgICAgICAgICAgICBsb2FkID0gIWZtZHNbaV0uaXNUcmFuc2llbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMT0FEX0ZHUzoKKyAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGZldGNoID09IG51bGwgfHwgZmV0Y2gucmVxdWlyZXNGZXRjaChmbWRzW2ldKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IEZldGNoQ29uZmlndXJhdGlvbi5GRVRDSF9OT05FOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBMT0FEX0FMTAorICAgICAgICAgICAgICAgICAgICBsb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvYWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBCaXRTZXQoZm1kcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZpZWxkcy5zZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBfYnJva2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbmFnaW5nIGJyb2tlci4KKyAgICAgKi8KKyAgICBCcm9rZXJJbXBsIGdldEJyb2tlcigpIHsKKyAgICAgICAgcmV0dXJuIF9icm9rZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdElkKCkgeworICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gdGhpczsKKyAgICAgICAgd2hpbGUgKHNtLmdldE93bmVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNtID0gKFN0YXRlTWFuYWdlckltcGwpIHNtLmdldE93bmVyKCk7CisgICAgICAgIHJldHVybiBzbS5fb2lkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdElkKE9iamVjdCBvaWQpIHsKKyAgICAgICAgX29pZCA9IG9pZDsKKyAgICAgICAgaWYgKF9wYyAhPSBudWxsICYmIG9pZCBpbnN0YW5jZW9mIE9wZW5KUEFJZCkKKyAgICAgICAgICAgICgoT3BlbkpQQUlkKSBvaWQpLnNldE1hbmFnZWRJbnN0YW5jZVR5cGUoX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25PYmplY3RJZChib29sZWFuIGZsdXNoKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBhc3NpZ25PYmplY3RJZChmbHVzaCwgZmFsc2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc2sgc3RvcmUgbWFuYWdlciB0byBhc3NpZ24gb3VyIG9pZCwgb3B0aW9uYWxseSBmbHVzaGluZyBhbmQKKyAgICAgKiBvcHRpb25hbGx5IHJlY2FjaGluZyBvbiB0aGUgbmV3IG9pZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXNzaWduT2JqZWN0SWQoYm9vbGVhbiBmbHVzaCwgYm9vbGVhbiBwcmVGbHVzaGluZykgeworICAgICAgICBpZiAoX29pZCAhPSBudWxsIHx8IGlzRW1iZWRkZWQoKSB8fCAhaXNQZXJzaXN0ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAoX2Jyb2tlci5nZXRTdG9yZU1hbmFnZXIoKS5hc3NpZ25PYmplY3RJZCh0aGlzLCBwcmVGbHVzaGluZykpIHsKKyAgICAgICAgICAgIGlmICghcHJlRmx1c2hpbmcpCisgICAgICAgICAgICAgICAgYXNzZXJ0T2JqZWN0SWRBc3NpZ25lZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbHVzaCkKKyAgICAgICAgICAgIF9icm9rZXIuZmx1c2goKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgd2Ugd2VyZSBhc3NpZ25lZCBhbiBvaWQsIGFuZCBwZXJmb3JtIGFjdGlvbnMgdG8gbWFrZSBpdAorICAgICAqIHBlcm1hbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNhY2hlIHdoZXRoZXIgdG8gcmVjYWNoZSBvdXJzZWxmIG9uIHRoZSBuZXcgb2lkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9iamVjdElkQXNzaWduZWQoYm9vbGVhbiByZWNhY2hlKSB7CisgICAgICAgIGlmICghaXNOZXcoKSB8fCBpc0RlbGV0ZWQoKSB8fCBpc1Byb3Zpc2lvbmFsKCkgCisgICAgICAgICAgICB8fCAoX2ZsYWdzICYgRkxBR19PSURfQVNTSUdORUQpICE9IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChfb2lkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oRXhjZXB0aW9ucy50b1N0cmluZworICAgICAgICAgICAgICAgICAgICAoZ2V0TWFuYWdlZEluc3RhbmNlKCkpKTsKKyAgICAgICAgICAgIF9vaWQgPSBBcHBsaWNhdGlvbklkcy5jcmVhdGUoX3BjLCBfbWV0YSk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3Qgb3JpZyA9IF9pZDsKKyAgICAgICAgX2lkID0gX29pZDsKKyAgICAgICAgaWYgKHJlY2FjaGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX2Jyb2tlci5zZXRTdGF0ZU1hbmFnZXIob3JpZywgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgQnJva2VySW1wbC5TVEFUVVNfT0lEX0FTU0lHTik7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgX2lkID0gb3JpZzsKKyAgICAgICAgICAgICAgICBfb2lkID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfZmxhZ3MgfD0gRkxBR19PSURfQVNTSUdORUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzaWduIHRoZSBwcm9wZXIgZ2VuZXJhdGVkIHZhbHVlIHRvIHRoZSBnaXZlbiBmaWVsZCBiYXNlZCBvbiBpdHMKKyAgICAgKiB2YWx1ZS1zdHJhdGVneS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXNzaWduRmllbGQoaW50IGZpZWxkLCBib29sZWFuIHByZUZsdXNoaW5nKSB7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSB0aGlzOworICAgICAgICB3aGlsZSAoc20uaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgc20gPSBzbS5nZXRPd25lcigpOworICAgICAgICBpZiAoIXNtLmlzTmV3KCkgfHwgc20uaXNGbHVzaGVkKCkgfHwgc20uaXNEZWxldGVkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gc3BlY2lhbC1jYXNlIG9pZCBmaWVsZHMsIHdoaWNoIHJlcXVpcmUgdXMgdG8gbG9vayBpbnNpZGUgdGhlIG9pZAorICAgICAgICAvLyBvYmplY3QKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PSUQpIHsKKyAgICAgICAgICAgIC8vIHRyeSB0byBzaG9ydGN1dCBpZiBwb3NzaWJsZQorICAgICAgICAgICAgaWYgKF9vaWQgIT0gbnVsbCB8fCBpc0VtYmVkZGVkKCkgfHwgIWlzUGVyc2lzdGVudCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBjaGVjayBlbWJlZGRlZCBmaWVsZHMgb2Ygb2lkIGZvciB2YWx1ZSBzdHJhdGVneSArIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBwa3MgPSBmbWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpLmdldEZpZWxkcygpOworICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBvaWRzbSA9IG51bGw7CisgICAgICAgICAgICBib29sZWFuIGFzc2lnbiA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFhc3NpZ24gJiYgaSA8IHBrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwa3NbaV0uZ2V0VmFsdWVTdHJhdGVneSgpID09IFZhbHVlU3RyYXRlZ2llcy5OT05FKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAob2lkc20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb2lkc20gPSBuZXcgT2JqZWN0SWRTdGF0ZU1hbmFnZXIoZmV0Y2hPYmplY3RGaWVsZChmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBmbWQpOworICAgICAgICAgICAgICAgIGFzc2lnbiA9IG9pZHNtLmlzRGVmYXVsdFZhbHVlKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFzc2lnbiAmJiBhc3NpZ25PYmplY3RJZCghcHJlRmx1c2hpbmcsIHByZUZsdXNoaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbid0IGFzc2lnbiB2YWx1ZXMgdG8gZmllbGRzIHdpdGggbm9uLWRlZmF1bHQgdmFsdWVzIGFscmVhZHkKKyAgICAgICAgaWYgKGZtZC5nZXRWYWx1ZVN0cmF0ZWd5KCkgPT0gVmFsdWVTdHJhdGVnaWVzLk5PTkUKKyAgICAgICAgICAgIHx8ICFpc0RlZmF1bHRWYWx1ZShmaWVsZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gZm9yIHByaW1hcnkga2V5IGZpZWxkcywgYXNzaWduIHRoZSBvYmplY3QgaWQgYW5kIHJlY2FjaGUgc28gdGhhdAorICAgICAgICAvLyB0byB0aGUgdXNlciwgc28gaXQgbG9va3MgbGlrZSB0aGUgb2lkIGFsd2F5cyBtYXRjaGVzIHRoZSBwayBmaWVsZHMKKyAgICAgICAgaWYgKGZtZC5pc1ByaW1hcnlLZXkoKSAmJiAhaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGFzc2lnbk9iamVjdElkKCFwcmVGbHVzaGluZywgcHJlRmx1c2hpbmcpOworCisgICAgICAgIC8vIGZvciBvdGhlciBmaWVsZHMganVzdCBhc3NpZ24gdGhlIGZpZWxkIG9yIGZsdXNoIGlmIG5lZWRlZAorICAgICAgICBpZiAoX2Jyb2tlci5nZXRTdG9yZU1hbmFnZXIoKS5hc3NpZ25GaWVsZCh0aGlzLCBmaWVsZCwgcHJlRmx1c2hpbmcpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghcHJlRmx1c2hpbmcpCisgICAgICAgICAgICBfYnJva2VyLmZsdXNoKCk7CisgICAgICAgIHJldHVybiAhcHJlRmx1c2hpbmc7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRMb2NrKCkgeworICAgICAgICByZXR1cm4gX2xvY2s7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9jayhPYmplY3QgbG9jaykgeworICAgICAgICBfbG9jayA9IGxvY2s7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gX3ZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihPYmplY3QgdmVyc2lvbikgeworICAgICAgICBfbG9hZFZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICBhc3NpZ25WZXJzaW9uRmllbGQodmVyc2lvbik7CisgICAgfQorCisgICAgT2JqZWN0IGdldExvYWRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gX2xvYWRWZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5leHRWZXJzaW9uKE9iamVjdCB2ZXJzaW9uKSB7CisgICAgICAgIGFzc2lnblZlcnNpb25GaWVsZCh2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzaWduVmVyc2lvbkZpZWxkKE9iamVjdCB2ZXJzaW9uKSB7CisgICAgICAgIF92ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgRmllbGRNZXRhRGF0YSB2ZmllbGQgPSBfbWV0YS5nZXRWZXJzaW9uRmllbGQoKTsKKyAgICAgICAgaWYgKHZmaWVsZCAhPSBudWxsKQorICAgICAgICAgICAgc3RvcmUodmZpZWxkLmdldEluZGV4KCksIEphdmFUeXBlcy5jb252ZXJ0KHZlcnNpb24sCisgICAgICAgICAgICAgICAgdmZpZWxkLmdldFR5cGVDb2RlKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUENTdGF0ZSBnZXRQQ1N0YXRlKCkgeworICAgICAgICByZXR1cm4gX3N0YXRlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldEltcGxEYXRhKCkgeworICAgICAgICByZXR1cm4gX2ltcGw7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2V0SW1wbERhdGEoT2JqZWN0IGRhdGEsIGJvb2xlYW4gY2FjaGVhYmxlKSB7CisgICAgICAgIE9iamVjdCBvbGQgPSBfaW1wbDsKKyAgICAgICAgX2ltcGwgPSBkYXRhOworICAgICAgICBpZiAoY2FjaGVhYmxlICYmIGRhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0lNUExfQ0FDSEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19JTVBMX0NBQ0hFOworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19JTVBMX0NBQ0hFKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW1wbERhdGEoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBnZXRFeHRyYUZpZWxkRGF0YShmaWVsZCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXRJbXBsRGF0YShpbnQgZmllbGQsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIHJldHVybiBzZXRFeHRyYUZpZWxkRGF0YShmaWVsZCwgZGF0YSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzSW1wbERhdGFDYWNoZWFibGUoaW50IGZpZWxkKSB7CisgICAgICAgIGlmIChfZmllbGRJbXBsID09IG51bGwgfHwgIV9sb2FkZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9tZXRhLmdldEZpZWxkKGZpZWxkKS51c2VzSW1wbERhdGEoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpbnQgaWR4ID0gX21ldGEuZ2V0RXh0cmFGaWVsZERhdGFJbmRleChmaWVsZCk7CisgICAgICAgIHJldHVybiBpZHggIT0gLTEgJiYgX2ZpZWxkSW1wbFtpZHhdICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbnRlcm1lZGlhdGUoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBnZXRFeHRyYUZpZWxkRGF0YShmaWVsZCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludGVybWVkaWF0ZShpbnQgZmllbGQsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIHNldEV4dHJhRmllbGREYXRhKGZpZWxkLCBkYXRhLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkYXRhIGZyb20gdGhlIHByb3BlciBpbmRleCBvZiB0aGUgZXh0cmEgZmllbGQgZGF0YSBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0RXh0cmFGaWVsZERhdGEoaW50IGZpZWxkLCBib29sZWFuIGlzTG9hZGVkKSB7CisgICAgICAgIC8vIG9ubHkgcmV0dXJuIHRoZSBmaWVsZCBkYXRhIGlmIHRoZSBmaWVsZCBpcyBpbiB0aGUgcmlnaHQgbG9hZGVkCisgICAgICAgIC8vIHN0YXRlOyBvdGhlcndpc2Ugd2UgbWlnaHQgcmV0dXJuIGludGVybWVkaWF0ZSBmb3IgaW1wbCBkYXRhIG9yCisgICAgICAgIC8vIHZpY2UgdmVyc2EKKyAgICAgICAgaWYgKF9maWVsZEltcGwgPT0gbnVsbCB8fCBfbG9hZGVkLmdldChmaWVsZCkgIT0gaXNMb2FkZWQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaW50IGlkeCA9IF9tZXRhLmdldEV4dHJhRmllbGREYXRhSW5kZXgoZmllbGQpOworICAgICAgICByZXR1cm4gKGlkeCA9PSAtMSkgPyBudWxsIDogX2ZpZWxkSW1wbFtpZHhdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGF0YSBmcm9tIHRvIHByb3BlciBpbmRleCBvZiB0aGUgZXh0cmEgZmllbGQgZGF0YSBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3Qgc2V0RXh0cmFGaWVsZERhdGEoaW50IGZpZWxkLCBPYmplY3QgZGF0YSwKKyAgICAgICAgYm9vbGVhbiBsb2FkZWQpIHsKKyAgICAgICAgaW50IGlkeCA9IF9tZXRhLmdldEV4dHJhRmllbGREYXRhSW5kZXgoZmllbGQpOworICAgICAgICBpZiAoaWR4ID09IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKF9tZXRhLmdldEZpZWxkKGZpZWxkKSkpOworCisgICAgICAgIE9iamVjdCBvbGQgPSAoX2ZpZWxkSW1wbCA9PSBudWxsKSA/IG51bGwgOiBfZmllbGRJbXBsW2lkeF07CisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNhbm5vdCBzZXQgaWYgZmllbGQgaW4gd3JvbmcgbG9hZGVkIHN0YXRlCisgICAgICAgICAgICBpZiAoX2xvYWRlZC5nZXQoZmllbGQpICE9IGxvYWRlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoX21ldGEuZ2V0RmllbGQKKyAgICAgICAgICAgICAgICAgICAgKGZpZWxkKSkpOworCisgICAgICAgICAgICAvLyBzZXQgZGF0YQorICAgICAgICAgICAgaWYgKF9maWVsZEltcGwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZmllbGRJbXBsID0gbmV3IE9iamVjdFtfbWV0YS5nZXRFeHRyYUZpZWxkRGF0YUxlbmd0aCgpXTsKKyAgICAgICAgICAgIF9maWVsZEltcGxbaWR4XSA9IGRhdGE7CisgICAgICAgIH0gZWxzZSBpZiAoX2ZpZWxkSW1wbCAhPSBudWxsICYmIF9sb2FkZWQuZ2V0KGZpZWxkKSA9PSBsb2FkZWQpCisgICAgICAgICAgICBfZmllbGRJbXBsW2lkeF0gPSBudWxsOworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2goaW50IGZpZWxkKSB7CisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBfbWV0YS5nZXRGaWVsZChmaWVsZCkuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hGaWVsZChpbnQgZmllbGQsIGJvb2xlYW4gdHJhbnNpdGlvbnMpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1maWVsZCIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoZmllbGQpLCBnZXRNYW5hZ2VkSW5zdGFuY2UoKS5nZXRDbGFzcygpKSkuCisgICAgICAgICAgICAgICAgc2V0RmFpbGVkT2JqZWN0KGdldE1hbmFnZWRJbnN0YW5jZSgpKTsKKworICAgICAgICAvLyBkbyBub3JtYWwgc3RhdGUgdHJhbnNpdGlvbnMKKyAgICAgICAgaWYgKCFmbWQuaXNQcmltYXJ5S2V5KCkgJiYgdHJhbnNpdGlvbnMpCisgICAgICAgICAgICBhY2Nlc3NpbmdGaWVsZChmaWVsZCk7CisKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoU3RyaW5nRmllbGQoZmllbGQpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaE9iamVjdEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICAgICAgcmV0dXJuIChmZXRjaEJvb2xlYW5GaWVsZChmaWVsZCkpID8gQm9vbGVhbi5UUlVFCisgICAgICAgICAgICAgICAgICAgIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGZldGNoQnl0ZUZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKGZldGNoQ2hhckZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoZmV0Y2hEb3VibGVGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChmZXRjaEZsb2F0RmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGZldGNoSW50RmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihmZXRjaExvbmdGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChmZXRjaFNob3J0RmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoT2JqZWN0RmllbGQoZmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmUoaW50IGZpZWxkLCBPYmplY3QgdmFsKSB7CisgICAgICAgIHZhbCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKS5nZXRGaWVsZFZhbHVlKHZhbCwgX2Jyb2tlcik7CisgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVGaWVsZChpbnQgZmllbGQsIE9iamVjdCB2YWwpIHsKKyAgICAgICAgc3RvcmVGaWVsZChmaWVsZCwgdmFsLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoSW5pdGlhbEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKF9icm9rZXIuZ2V0UmVzdG9yZVN0YXRlKCkgPT0gUmVzdG9yZVN0YXRlLlJFU1RPUkVfTk9ORQorICAgICAgICAgICAgJiYgKChfZmxhZ3MgJiBGTEFHX0lOVkVSU0VTKSA9PSAwCisgICAgICAgICAgICB8fCBmbWQuZ2V0SW52ZXJzZU1ldGFEYXRhcygpLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoInJlc3RvcmUtdW5zZXQiKSk7CisKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0FMRU5EQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHNhdmluZyBtdXRhYmxlIHR5cGVzLCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBpZiAoX2Jyb2tlci5nZXRSZXN0b3JlU3RhdGUoKSAhPSBSZXN0b3JlU3RhdGUuUkVTVE9SRV9BTEwKKyAgICAgICAgICAgICAgICAgICAgJiYgKChfZmxhZ3MgJiBGTEFHX0lOVkVSU0VTKSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IGZtZC5nZXRJbnZlcnNlTWV0YURhdGFzKCkubGVuZ3RoID09IDApKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAoIm11dGFibGUtcmVzdG9yZS11bnNldCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc2F2ZWQgPT0gbnVsbCB8fCAhX2xvYWRlZC5nZXQoZmllbGQpIHx8ICFfZGlydHkuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hGaWVsZChmaWVsZCwgZmFsc2UpOworCisgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgZGlydHkgYnV0IHdlIG5ldmVyIGxvYWRlZCBpdCwgd2UgY2FuJ3QgcmVzdG9yZSBpdAorICAgICAgICAgICAgaWYgKF9zYXZlZC5nZXRVbmxvYWRlZCgpLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiaW5pdGlhbC11bmxvYWRlZCIsCisgICAgICAgICAgICAgICAgICAgIGZtZCkpOworCisgICAgICAgICAgICBwcm92aWRlRmllbGQoX3NhdmVkLmdldFN0YXRlKCksIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBmZXRjaEZpZWxkKF9zaW5nbGUsIGZtZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoIHRoZSBzcGVjaWZpZWQgZmllbGQgZnJvbSB0aGUgc3BlY2lmaWVkIGZpZWxkIG1hbmFnZXIsIHdyYXBwaW5nIGl0CisgICAgICogaW4gYW4gb2JqZWN0IGlmIGl0J3MgYSBwcmltaXRpdmUuIEEgZmllbGQgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZQorICAgICAqIGZpZWxkIG1hbmFnZXIgYmVmb3JlIHRoaXMgY2FsbCBpcyBtYWRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBmZXRjaEZpZWxkKEZpZWxkTWFuYWdlciBmbSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaW50IGZpZWxkID0gZm1kLmdldEluZGV4KCk7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZtLmZldGNoQm9vbGVhbkZpZWxkKGZpZWxkKSkgPyBCb29sZWFuLlRSVUUKKyAgICAgICAgICAgICAgICAgICAgOiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUoZm0uZmV0Y2hCeXRlRmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoZm0uZmV0Y2hDaGFyRmllbGQoZmllbGQpKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZShmbS5mZXRjaERvdWJsZUZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KGZtLmZldGNoRmxvYXRGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoZm0uZmV0Y2hJbnRGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGZtLmZldGNoTG9uZ0ZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KGZtLmZldGNoU2hvcnRGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBmbS5mZXRjaFN0cmluZ0ZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZtLmZldGNoT2JqZWN0RmllbGQoZmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlKGludCBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gc3RhdCA9IGRpcnR5KGZpZWxkLCBCb29sZWFuLkZBTFNFLCBmYWxzZSk7CisgICAgICAgICAgICBzdG9yZUZpZWxkKGZpZWxkLCB2YWx1ZSwgX3NpbmdsZSk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQoX3BjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICBwb3N0RGlydHkoc3RhdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIExpZmVjeWNsZSBvcGVyYXRpb25zCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgb2JqZWN0IGlzIGFib3V0IHRvIGJlIGFjY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCBudW1iZXIgYmVpbmcgcmVhZCwgb3IgLTEgaWYgbm90IGEgc2luZ2xlCisgICAgICogZmllbGQgcmVhZAorICAgICAqLworICAgIHZvaWQgYmVmb3JlUmVhZChpbnQgZmllbGQpIHsKKyAgICAgICAgLy8gYWxsb3cgdW5tZWRpYXRlZCByZWFkcyBvZiBwcmltYXJ5IGtleSBmaWVsZHMKKyAgICAgICAgaWYgKGZpZWxkICE9IC0xICYmIF9tZXRhLmdldEZpZWxkKGZpZWxkKS5pc1ByaW1hcnlLZXkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoX2Jyb2tlci5pc0FjdGl2ZSgpICYmICFfYnJva2VyLmlzVHJhbnNhY3Rpb25FbmRpbmcoKSkgeworICAgICAgICAgICAgaWYgKF9icm9rZXIuZ2V0T3B0aW1pc3RpYygpKQorICAgICAgICAgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLmJlZm9yZU9wdGltaXN0aWNSZWFkKHRoaXMsIGZpZWxkKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0UENTdGF0ZShfc3RhdGUuYmVmb3JlUmVhZCh0aGlzLCBmaWVsZCkpOworICAgICAgICB9IGVsc2UgaWYgKF9icm9rZXIuZ2V0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKSkKKyAgICAgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLmJlZm9yZU5vbnRyYW5zYWN0aW9uYWxSZWFkKHRoaXMsIGZpZWxkKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIm5vbi10cmFucy1yZWFkIikpLgorICAgICAgICAgICAgICAgIHNldEZhaWxlZE9iamVjdChnZXRNYW5hZ2VkSW5zdGFuY2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqCisgICAgICogQHNlZSBQQ1N0YXRlI2JlZm9yZUZsdXNoCisgICAgICovCisgICAgdm9pZCBiZWZvcmVGbHVzaChpbnQgcmVhc29uLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIF9zdGF0ZS5iZWZvcmVGbHVzaCh0aGlzLCByZWFzb24gPT0gQnJva2VySW1wbC5GTFVTSF9MT0dJQ0FMLCBjYWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFBDU3RhdGUjZmx1c2gKKyAgICAgKi8KKyAgICB2b2lkIGFmdGVyRmx1c2goaW50IHJlYXNvbikgeworICAgICAgICAvLyBub3RoaW5nIGhhcHBlbnMgd2hlbiB3ZSBmbHVzaCBub24tcGVyc2lzdGVudCBzdGF0ZXMKKyAgICAgICAgaWYgKCFpc1BlcnNpc3RlbnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAocmVhc29uICE9IEJyb2tlckltcGwuRkxVU0hfUk9MTEJBQ0sKKyAgICAgICAgICAgICYmIHJlYXNvbiAhPSBCcm9rZXJJbXBsLkZMVVNIX0xPR0lDQUwpIHsKKyAgICAgICAgICAgIC8vIGFsbCBkaXJ0eSBmaWVsZHMgd2VyZSBmbHVzaGVkCisgICAgICAgICAgICBfZmx1c2gub3IoX2RpcnR5KTsKKworICAgICAgICAgICAgLy8gaW1wb3J0YW50IHRvIHNldCBmbHVzaGVkIGJpdCBhZnRlciBjYWxsaW5nIF9zdGF0ZS5mbHVzaCBzbworICAgICAgICAgICAgLy8gdGhhdCB0aGUgc3RhdGUgY2FuIHRlbGwgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCBmbHVzaAorICAgICAgICAgICAgc2V0UENTdGF0ZShfc3RhdGUuZmx1c2godGhpcykpOworICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfRkxVU0hFRDsKKyAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19GTFVTSEVEX0RJUlRZOworCisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfVkVSU0lPTl9DSEVDSzsKKyAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19WRVJTSU9OX1VQREFURTsKKworICAgICAgICAgICAgLy8gaWYgdGhpcyB3YXMgYW4gaW5jIGZsdXNoIGR1cmluZyB3aGljaCB3ZSBoYWQgb3VyIGlkZW50aXR5CisgICAgICAgICAgICAvLyBhc3NpZ25lZCwgdGVsbCB0aGUgYnJva2VyIHRvIGNhY2hlIHVzIHVuZGVyIG91ciBmaW5hbCBvaWQKKyAgICAgICAgICAgIGlmIChyZWFzb24gPT0gQnJva2VySW1wbC5GTFVTSF9JTkMpCisgICAgICAgICAgICAgICAgYXNzZXJ0T2JqZWN0SWRBc3NpZ25lZCh0cnVlKTsKKworICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3Qgd2FzIHN0b3JlZCB3aXRoIHByZUZsdXNoLCBkbyBwb3N0LXN0b3JlIGNhbGxiYWNrCisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfUFJFX0ZMVVNIRUQpID4gMCkKKyAgICAgICAgICAgICAgICBmaXJlTGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQuQUZURVJfU1RPUkUpOworICAgICAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PSBCcm9rZXJJbXBsLkZMVVNIX1JPTExCQUNLKSB7CisgICAgICAgICAgICAvLyByZXZlcnQgdG8gbGFzdCBsb2FkZWQgdmVyc2lvbiBhbmQgb3JpZ2luYWwgb2lkCisgICAgICAgICAgICBhc3NpZ25WZXJzaW9uRmllbGQoX2xvYWRWZXJzaW9uKTsKKyAgICAgICAgICAgIGlmIChpc05ldygpICYmIChfZmxhZ3MgJiBGTEFHX09JRF9BU1NJR05FRCkgPT0gMCkKKyAgICAgICAgICAgICAgICBfb2lkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfUFJFX0ZMVVNIRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IHN0YXRlIGFmdGVyIGNoZWNraW5nIHRoZSB2YWx1ZQorICAgICAqIG9mIHRoZSBSZXRhaW5TdGF0ZSBmbGFnLgorICAgICAqCisgICAgICogQHNlZSBQQ1N0YXRlI2NvbW1pdAorICAgICAqIEBzZWUgUENTdGF0ZSNjb21taXRSZXRhaW4KKyAgICAgKi8KKyAgICB2b2lkIGNvbW1pdCgpIHsKKyAgICAgICAgLy8gcmVsZWFzZSBsb2NrcyBiZWZvcmUgb2lkIHVwZGF0ZWQKKyAgICAgICAgcmVsZWFzZUxvY2tzKCk7CisKKyAgICAgICAgLy8gdXBkYXRlIHZlcnNpb24gYW5kIG9pZCBpbmZvcm1hdGlvbgorICAgICAgICBzZXRWZXJzaW9uKF92ZXJzaW9uKTsKKyAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0ZMVVNIRUQ7CisgICAgICAgIF9mbGFncyAmPSB+RkxBR19GTFVTSEVEX0RJUlRZOworCisgICAgICAgIE9iamVjdCBvcmlnID0gX2lkOworICAgICAgICBhc3NlcnRPYmplY3RJZEFzc2lnbmVkKGZhbHNlKTsKKworICAgICAgICBib29sZWFuIHdhc05ldyA9IGlzTmV3KCkgJiYgIWlzRGVsZXRlZCgpICYmICFpc1Byb3Zpc2lvbmFsKCk7CisgICAgICAgIGlmIChfYnJva2VyLmdldFJldGFpblN0YXRlKCkpCisgICAgICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5jb21taXRSZXRhaW4odGhpcykpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5jb21taXQodGhpcykpOworCisgICAgICAgIC8vIGFzayB0aGUgYnJva2VyIHRvIHJlLWNhY2hlIHVzIGlmIHdlIHdlcmUgbmV3IHByZXZpb3VzbHkKKyAgICAgICAgaWYgKHdhc05ldykKKyAgICAgICAgICAgIF9icm9rZXIuc2V0U3RhdGVNYW5hZ2VyKG9yaWcsIHRoaXMsIEJyb2tlckltcGwuU1RBVFVTX0NPTU1JVF9ORVcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlcyB0byB0aGUgY3VycmVudCBzdGF0ZSBhZnRlciBjaGVja2luZyB0aGUgdmFsdWUKKyAgICAgKiBvZiB0aGUgUmV0YWluU3RhdGUgZmxhZy4KKyAgICAgKgorICAgICAqIEBzZWUgUENTdGF0ZSNyb2xsYmFjaworICAgICAqIEBzZWUgUENTdGF0ZSNyb2xsYmFja1Jlc3RvcmUKKyAgICAgKi8KKyAgICB2b2lkIHJvbGxiYWNrKCkgeworICAgICAgICAvLyByZWxlYXNlIGxvY2tzCisgICAgICAgIHJlbGVhc2VMb2NrcygpOworICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfRkxVU0hFRDsKKyAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0ZMVVNIRURfRElSVFk7CisgICAgICAgIGFmdGVyRmx1c2goQnJva2VySW1wbC5GTFVTSF9ST0xMQkFDSyk7CisKKyAgICAgICAgaWYgKF9icm9rZXIuZ2V0UmVzdG9yZVN0YXRlKCkgIT0gUmVzdG9yZVN0YXRlLlJFU1RPUkVfTk9ORSkKKyAgICAgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLnJvbGxiYWNrUmVzdG9yZSh0aGlzKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLnJvbGxiYWNrKHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSb2xsYmFjayBzdGF0ZSBvZiB0aGUgbWFuYWdlZCBpbnN0YW5jZSB0byB0aGUgZ2l2ZW4gc2F2ZXBvaW50LgorICAgICAqLworICAgIHZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludChTYXZlcG9pbnRGaWVsZE1hbmFnZXIgc2F2ZXBvaW50KSB7CisgICAgICAgIF9zdGF0ZSA9IHNhdmVwb2ludC5nZXRQQ1N0YXRlKCk7CisgICAgICAgIEJpdFNldCBsb2FkZWQgPSBzYXZlcG9pbnQuZ2V0TG9hZGVkKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBsb2FkZWQubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKGxvYWRlZC5nZXQoaSkgJiYgc2F2ZXBvaW50LnJlc3RvcmVGaWVsZChpKSkgeworICAgICAgICAgICAgICAgIHByb3ZpZGVGaWVsZChzYXZlcG9pbnQuZ2V0Q29weSgpLCBzYXZlcG9pbnQsIGkpOworICAgICAgICAgICAgICAgIHJlcGxhY2VGaWVsZChfcGMsIHNhdmVwb2ludCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2xvYWRlZCA9IGxvYWRlZDsKKyAgICAgICAgX2RpcnR5ID0gc2F2ZXBvaW50LmdldERpcnR5KCk7CisgICAgICAgIF9mbHVzaCA9IHNhdmVwb2ludC5nZXRGbHVzaGVkKCk7CisgICAgICAgIF92ZXJzaW9uID0gc2F2ZXBvaW50LmdldFZlcnNpb24oKTsKKyAgICAgICAgX2xvYWRWZXJzaW9uID0gc2F2ZXBvaW50LmdldExvYWRWZXJzaW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqCisgICAgICogQHNlZSBQQ1N0YXRlI3BlcnNpc3QKKyAgICAgKiBAc2VlIEJyb2tlciNwZXJzaXN0CisgICAgICovCisgICAgdm9pZCBwZXJzaXN0KCkgeworICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5wZXJzaXN0KHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFBDU3RhdGUjZGVsZXRlCisgICAgICogQHNlZSBCcm9rZXIjZGVsZXRlCisgICAgICovCisgICAgdm9pZCBkZWxldGUoKSB7CisgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLmRlbGV0ZSh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqCisgICAgICogQHNlZSBQQ1N0YXRlI25vbnRyYW5zYWN0aW9uYWwKKyAgICAgKiBAc2VlIEJyb2tlciNub250cmFuc2FjdGlvbmFsCisgICAgICovCisgICAgdm9pZCBub250cmFuc2FjdGlvbmFsKCkgeworICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5ub250cmFuc2FjdGlvbmFsKHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFBDU3RhdGUjdHJhbnNhY3Rpb25hbAorICAgICAqIEBzZWUgQnJva2VyI3RyYW5zYWN0aW9uYWwKKyAgICAgKi8KKyAgICB2b2lkIHRyYW5zYWN0aW9uYWwoKSB7CisgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLnRyYW5zYWN0aW9uYWwodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlcyB0byB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBzZWUgUENTdGF0ZSNub25wcm92aXNpb25hbAorICAgICAqLworICAgIHZvaWQgbm9ucHJvdmlzaW9uYWwoYm9vbGVhbiBsb2dpY2FsLCBPcENhbGxiYWNrcyBjYWxsKSB7CisgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLm5vbnByb3Zpc2lvbmFsKHRoaXMsIGxvZ2ljYWwsIGNhbGwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFBDU3RhdGUjcmVsZWFzZQorICAgICAqIEBzZWUgQnJva2VyI3JlbGVhc2UKKyAgICAgKi8KKyAgICB2b2lkIHJlbGVhc2UoYm9vbGVhbiB1bnByb3h5KSB7CisgICAgICAgIHJlbGVhc2UodW5wcm94eSwgZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgcmVsZWFzZShib29sZWFuIHVucHJveHksIGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgLy8gb3B0aW1pemF0aW9uIGZvciBkZXRhY2gtaW4tcGxhY2Ugc3BlY2lhbCBjYXNlIHdoZW4gZmllbGRzIGFyZQorICAgICAgICAvLyBhbHJlYWR5ICh1bilwcm94aWVkIGNvcnJlY3RseQorICAgICAgICBpZiAoIXVucHJveHkpCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19OT19VTlBST1hZOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZvcmNlKQorICAgICAgICAgICAgICAgIHNldFBDU3RhdGUoUENTdGF0ZS5UUkFOU0lFTlQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLnJlbGVhc2UodGhpcykpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX05PX1VOUFJPWFk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFBDU3RhdGUjZXZpY3QKKyAgICAgKiBAc2VlIEJyb2tlciNldmljdAorICAgICAqLworICAgIHZvaWQgZXZpY3QoKSB7CisgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLmV2aWN0KHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHYXRoZXIgcmVsYXRpb25zIHJlYWNoYWJsZSBmcm9tIHZhbHVlcyB1c2luZworICAgICAqIHtAbGluayBWYWx1ZU1ldGFEYXRhI0NBU0NBREVfSU1NRURJQVRFfS4KKyAgICAgKi8KKyAgICB2b2lkIGdhdGhlckNhc2NhZGVSZWZyZXNoKE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXRDYXNjYWRlUmVmcmVzaCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUKKyAgICAgICAgICAgICAgICB8fCBmbWRzW2ldLmdldEtleSgpLmdldENhc2NhZGVSZWZyZXNoKCkKKyAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFCisgICAgICAgICAgICAgICAgfHwgZm1kc1tpXS5nZXRFbGVtZW50KCkuZ2V0Q2FzY2FkZVJlZnJlc2goKQorICAgICAgICAgICAgICAgID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUpIHsKKyAgICAgICAgICAgICAgICBfc2luZ2xlLnN0b3JlT2JqZWN0RmllbGQoaSwgZmV0Y2hGaWVsZChpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIF9zaW5nbGUuZ2F0aGVyQ2FzY2FkZVJlZnJlc2goY2FsbCk7CisgICAgICAgICAgICAgICAgX3NpbmdsZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlUmVmcmVzaChib29sZWFuIHJlZnJlc2hBbGwpIHsKKyAgICAgICAgLy8gbm90ZTogYWxsIGxvZ2ljIHBsYWNlZCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBzdGF0ZXMgZm9yCisgICAgICAgIC8vIG9wdGltaXphdGlvbjsgdGhpcyBtZXRob2QgcHVibGljIGIvYyB1c2VkIGJ5IHJlbW90ZSBwYWNrYWdlCisKKyAgICAgICAgLy8gbm90aGluZyB0byBkbyBmb3Igbm9uIHBlcnNpc3RlbnQgb3IgbmV3IHVuZmx1c2hlZCBpbnN0YW5jZXMKKyAgICAgICAgaWYgKCFpc1BlcnNpc3RlbnQoKSB8fCAoaXNOZXcoKSAmJiAhaXNGbHVzaGVkKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGlmIGRpcnR5IG5lZWQgdG8gY2xlYXIgZmllbGRzCisgICAgICAgICAgICBpZiAoaXNEaXJ0eSgpKSB7CisgICAgICAgICAgICAgICAgY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgc29tZSBmaWVsZHMgaGF2ZSBiZWVuIGxvYWRlZCBidXQgdGhlIGluc3RhbmNlIGlzIG91dCBvZgorICAgICAgICAgICAgLy8gZGF0ZSBvciB0aGlzIGlzIHBhcnQgb2YgYSByZWZyZXNoQWxsKCkgYW5kIHdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgICAgIC8vIHRha2UgdGhlIGV4dHJhIGhpdCB0byBzZWUgaWYgdGhlIGluc3RhbmNlIGlzIG91dCBvZiBkYXRlLCBjbGVhcgorICAgICAgICAgICAgaWYgKF9sb2FkZWQubGVuZ3RoKCkgPiAwICYmIChyZWZyZXNoQWxsIHx8IGlzRW1iZWRkZWQoKQorICAgICAgICAgICAgICAgIHx8ICFzeW5jVmVyc2lvbihudWxsKSkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmVyc2lvbiA9IF92ZXJzaW9uOworICAgICAgICAgICAgICAgIGNsZWFyRmllbGRzKCk7CisKKyAgICAgICAgICAgICAgICAvLyBpZiBzeW5jVmVyc2lvbiBqdXN0IHJlcGxhY2VkIHRoZSB2ZXJzaW9uLCByZXNldCBpdAorICAgICAgICAgICAgICAgIGlmICghcmVmcmVzaEFsbCAmJiAhaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgICAgICAgICBzZXRWZXJzaW9uKHZlcnNpb24pOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHN0YXRlIHRyYW5zaXRpb25zIGFmdGVyIHJlZnJlc2guIFRoaXMgbWV0aG9kIGlzIG9ubHkKKyAgICAgKiBjYWxsZWQgaWYge0BsaW5rICNiZWZvcmVSZWZyZXNofSByZXR1cm5zIHRydWUuCisgICAgICovCisgICAgdm9pZCBhZnRlclJlZnJlc2goKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gdG8gY2xlYW4gb3Igbm9udHJhbnNhY3Rpb25hbCBkZXBlbmRpbmcgb24gdHJhbnMgc3RhdHVzCisgICAgICAgICAgICBpZiAoIV9icm9rZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5hZnRlck5vbnRyYW5zYWN0aW9uYWxSZWZyZXNoKCkpOworICAgICAgICAgICAgZWxzZSBpZiAoX2Jyb2tlci5nZXRPcHRpbWlzdGljKCkpCisgICAgICAgICAgICAgICAgc2V0UENTdGF0ZShfc3RhdGUuYWZ0ZXJPcHRpbWlzdGljUmVmcmVzaCgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5hZnRlclJlZnJlc2goKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmsgdGhpcyBvYmplY3QgYXMgYSBkZXJlZmVyZW5jZWQgZGVwZW5kZW50IG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIHNldERlcmVmZXJlbmNlZERlcGVuZGVudChib29sZWFuIGRlcmVmLCBib29sZWFuIG5vdGlmeSkgeworICAgICAgICBpZiAoIWRlcmVmICYmIChfZmxhZ3MgJiBGTEFHX0RFUkVGKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICAgICAgX2Jyb2tlci5yZW1vdmVEZXJlZmVyZW5jZWREZXBlbmRlbnQodGhpcyk7CisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfREVSRUY7CisgICAgICAgIH0gZWxzZSBpZiAoZGVyZWYgJiYgKF9mbGFncyAmIEZMQUdfREVSRUYpID09IDApIHsKKyAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX0RFUkVGOworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBfYnJva2VyLmFkZERlcmVmZXJlbmNlZERlcGVuZGVudCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vCisgICAgLy8gTG9ja2luZworICAgIC8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCB3ZSd2ZSBiZWVuIHJlYWQtbG9ja2VkLiBQYXNzIGluIHRoZSBsZXZlbCBhdCB3aGljaAorICAgICAqIHdlIHdlcmUgbG9ja2VkIGFuZCB0aGUgbGV2ZWwgYXQgd2hpY2ggd2Ugc2hvdWxkIHdyaXRlIGxvY2sgb3Vyc2VsdmVzCisgICAgICogb24gZGlydHkuCisgICAgICovCisgICAgdm9pZCByZWFkTG9ja2VkKGludCByZWFkTG9ja0xldmVsLCBpbnQgd3JpdGVMb2NrTGV2ZWwpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIG9iamVjdCBpcyBhZGRlZCB0byB0cmFuc2FjdGlvbiBzbyBsb2NrIHdpbGwgZ2V0CisgICAgICAgIC8vIGNsZWFyZWQgb24gY29tbWl0L3JvbGxiYWNrCisgICAgICAgIGlmIChyZWFkTG9ja0xldmVsICE9IExvY2tMZXZlbHMuTE9DS19OT05FKQorICAgICAgICAgICAgdHJhbnNhY3Rpb25hbCgpOworCisgICAgICAgIF9yZWFkTG9ja0xldmVsID0gcmVhZExvY2tMZXZlbDsKKyAgICAgICAgX3dyaXRlTG9ja0xldmVsID0gd3JpdGVMb2NrTGV2ZWw7CisgICAgICAgIF9mbGFncyB8PSBGTEFHX1JFQURfTE9DS0VEOworICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfV1JJVEVfTE9DS0VEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jayBsZXZlbCB0byB1c2Ugd2hlbiBsb2FkaW5nIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZUxvY2tMZXZlbChib29sZWFuIGFjdGl2ZSwgYm9vbGVhbiBmb3JXcml0ZSwKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIGlmICghYWN0aXZlKQorICAgICAgICAgICAgcmV0dXJuIExvY2tMZXZlbHMuTE9DS19OT05FOworICAgICAgICBpZiAoZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIGZldGNoID0gX2Jyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoX3JlYWRMb2NrTGV2ZWwgPT0gLTEpCisgICAgICAgICAgICBfcmVhZExvY2tMZXZlbCA9IGZldGNoLmdldFJlYWRMb2NrTGV2ZWwoKTsKKyAgICAgICAgaWYgKF93cml0ZUxvY2tMZXZlbCA9PSAtMSkKKyAgICAgICAgICAgIF93cml0ZUxvY2tMZXZlbCA9IGZldGNoLmdldFdyaXRlTG9ja0xldmVsKCk7CisgICAgICAgIHJldHVybiAoZm9yV3JpdGUpID8gX3dyaXRlTG9ja0xldmVsIDogX3JlYWRMb2NrTGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBzdXJlIHdlJ3JlIGxvY2tlZCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9idGFpbkxvY2tzKGJvb2xlYW4gYWN0aXZlLCBib29sZWFuIGZvcldyaXRlLCBpbnQgbG9ja0xldmVsLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBzZGF0YSkgeworICAgICAgICBpZiAoIWFjdGl2ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IGJlZW4gbG9ja2VkIHlldCwgbG9jayBub3cgYXQgdGhlIGdpdmVuIGxldmVsCisgICAgICAgIGludCBmbGFnID0gKGZvcldyaXRlKSA/IEZMQUdfV1JJVEVfTE9DS0VEIDogRkxBR19SRUFEX0xPQ0tFRDsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBmbGFnKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgb2JqZWN0IGlzIGFkZGVkIHRvIHRyYW5zYWN0aW9uIHNvIGxvY2sgd2lsbCBnZXQKKyAgICAgICAgICAgIC8vIGNsZWFyZWQgb24gY29tbWl0L3JvbGxiYWNrCisgICAgICAgICAgICBpZiAobG9ja0xldmVsICE9IExvY2tMZXZlbHMuTE9DS19OT05FKQorICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uYWwoKTsKKworICAgICAgICAgICAgaWYgKGZldGNoID09IG51bGwpCisgICAgICAgICAgICAgICAgZmV0Y2ggPSBfYnJva2VyLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgX2Jyb2tlci5nZXRMb2NrTWFuYWdlcigpLmxvY2sodGhpcywgbG9ja0xldmVsLAorICAgICAgICAgICAgICAgIGZldGNoLmdldExvY2tUaW1lb3V0KCksIHNkYXRhKTsKKyAgICAgICAgICAgIF9mbGFncyB8PSBGTEFHX1JFQURfTE9DS0VEOworICAgICAgICAgICAgX2ZsYWdzIHw9IGZsYWc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGxvY2tzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlTG9ja3MoKSB7CisgICAgICAgIGlmIChfbG9jayAhPSBudWxsKQorICAgICAgICAgICAgX2Jyb2tlci5nZXRMb2NrTWFuYWdlcigpLnJlbGVhc2UodGhpcyk7CisgICAgICAgIF9yZWFkTG9ja0xldmVsID0gLTE7CisgICAgICAgIF93cml0ZUxvY2tMZXZlbCA9IC0xOworICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfUkVBRF9MT0NLRUQ7CisgICAgICAgIF9mbGFncyAmPSB+RkxBR19XUklURV9MT0NLRUQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBTdGF0ZU1hbmFnZXIgaW50ZXJmYWNlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBib29sZWFuIHNlcmlhbGl6aW5nKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9tZXRhLmlzRGV0YWNoYWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBEZXRhY2hNYW5hZ2VyLnByZVNlcmlhbGl6ZSh0aGlzKTsKKworICAgICAgICAgICAgbG9hZChfYnJva2VyLmdldEZldGNoQ29uZmlndXJhdGlvbigpLCBMT0FEX1NFUklBTElaRSwgbnVsbCwgbnVsbCwgCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGVEZXRhY2hlZChPYmplY3RPdXRwdXQgb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCaXRTZXQgaWR4cyA9IG5ldyBCaXRTZXQoX21ldGEuZ2V0RmllbGRzKCkubGVuZ3RoKTsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiBkZXRzbSA9IERldGFjaE1hbmFnZXIud3JpdGVEZXRhY2hlZFN0YXRlKHRoaXMsIG91dCwgaWR4cyk7CisgICAgICAgICAgICBpZiAoZGV0c20pCisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfREVUQUNISU5HOworCisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZtZHNbaV0uaXNUcmFuc2llbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgaSk7CisgICAgICAgICAgICAgICAgX3NpbmdsZS5zZXJpYWxpemUob3V0LCAhaWR4cy5nZXQoaSkpOworICAgICAgICAgICAgICAgIF9zaW5nbGUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0RFVEFDSElORzsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJveHlEZXRhY2hlZERlc2VyaWFsaXplZChpbnQgaWR4KSB7CisgICAgICAgIC8vIHdlIGRvbid0IHNlcmlhbGl6ZSBzdGF0ZSBtYW5hZ2VyIGltcGxzCisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBUQ0xFQU4sIHdoaWNoIHdlIHdhbnQgdG8gYXBwZWFyIG5vbi10cmFucyB0bworICAgICAgICAvLyBpbnRlcm5hbCBjb2RlLCBidXQgd2hpY2ggcHVibGljbHkgc2hvdWxkIGJlIHRyYW5zYWN0aW9uYWwKKyAgICAgICAgcmV0dXJuIF9zdGF0ZSA9PSBQQ1N0YXRlLlRDTEVBTiB8fCBfc3RhdGUuaXNUcmFuc2FjdGlvbmFsKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQZW5kaW5nVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5pc1BlbmRpbmdUcmFuc2FjdGlvbmFsKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aXNpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZS5pc1Byb3Zpc2lvbmFsKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworICAgICAgICByZXR1cm4gX3N0YXRlLmlzUGVyc2lzdGVudCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gX3N0YXRlLmlzTmV3KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgeworICAgICAgICByZXR1cm4gX3N0YXRlLmlzRGVsZXRlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUuaXNEaXJ0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQoKSB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19ERVRBQ0hJTkcpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRHZW5lcmljQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9icm9rZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdElkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzaWduT2JqZWN0SWQodHJ1ZSk7CisgICAgICAgICAgICBpZiAoX29pZCA9PSBudWxsIHx8ICFfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgICAgICBnZXRDb21wYXRpYmlsaXR5SW5zdGFuY2UoKS5nZXRDb3B5T2JqZWN0SWRzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9vaWQ7CisKKyAgICAgICAgICAgIGlmIChfbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRTdG9yZU1hbmFnZXIoKS5jb3B5RGF0YVN0b3JlSWQoX29pZCwgX21ldGEpOworICAgICAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uSWRzLmNvcHkoX29pZCwgX21ldGEpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQQ1ByaW1hcnlLZXkoT2JqZWN0IG9pZCwgaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBPYmplY3QgcGsgPSBBcHBsaWNhdGlvbklkcy5nZXQob2lkLCBmbWQpOworICAgICAgICBpZiAocGsgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENsYXNzTWV0YURhdGEgcmVsbWV0YSA9IGZtZC5nZXREZWNsYXJlZFR5cGVNZXRhRGF0YSgpOworICAgICAgICBpZiAocmVsbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRQorICAgICAgICAgICAgJiYgZm1kLmdldE9iamVjdElkRmllbGRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5MT05HKQorICAgICAgICAgICAgcGsgPSBfYnJva2VyLmdldFN0b3JlTWFuYWdlcigpLm5ld0RhdGFTdG9yZUlkKHBrLCByZWxtZXRhKTsKKyAgICAgICAgZWxzZSBpZiAocmVsbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OIAorICAgICAgICAgICAgJiYgZm1kLmdldE9iamVjdElkRmllbGRUeXBlKCkgIT0gcmVsbWV0YS5nZXRPYmplY3RJZFR5cGUoKSkKKyAgICAgICAgICAgIHBrID0gQXBwbGljYXRpb25JZHMuZnJvbVBLVmFsdWVzKG5ldyBPYmplY3RbXSB7IHBrIH0sIHJlbG1ldGEpOworICAgICAgICByZXR1cm4gX2Jyb2tlci5maW5kKHBrLCBmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgcmVwbGFjZUZsYWdzKCkgeworICAgICAgICAvLyB3ZSBhbHdheXMgdXNlIGxvYWQgcmVxdWlyZWQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHdoZW4gb2JqZWN0cworICAgICAgICAvLyBhcmUgdG91Y2hlZCBmb3IgbG9ja2luZyBvciBtYWtpbmcgdHJhbnNhY3Rpb25hbAorICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VDYXBhYmxlLkxPQURfUkVRVUlSRUQ7CisgICAgfQorCisgICAgcHVibGljIFN0YXRlTWFuYWdlciByZXBsYWNlU3RhdGVNYW5hZ2VyKFN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICByZXR1cm4gc207CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXNzaW5nRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIC8vIHBvc3NpYmx5IGNoYW5nZSBzdGF0ZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYmVmb3JlUmVhZChmaWVsZCk7CisgICAgICAgICAgICBiZWZvcmVBY2Nlc3NGaWVsZChmaWVsZCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBmaWVsZCBiZWZvcmUgYWNjZXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZUFjY2Vzc0ZpZWxkKGludCBmaWVsZCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib29sZWFuIGFjdGl2ZSA9IF9icm9rZXIuaXNBY3RpdmUoKTsKKyAgICAgICAgICAgIGludCBsb2NrTGV2ZWwgPSBjYWxjdWxhdGVMb2NrTGV2ZWwoYWN0aXZlLCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgICAgICBsb2FkRmllbGQoZmllbGQsIGxvY2tMZXZlbCwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2lnbkZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgICAgICBvYnRhaW5Mb2NrcyhhY3RpdmUsIGZhbHNlLCBsb2NrTGV2ZWwsIG51bGwsIG51bGwpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgibm8tZmllbGQiLCBmaWVsZCwKKyAgICAgICAgICAgICAgICBfcGMuZ2V0Q2xhc3MoKSkpLnNldEZhaWxlZE9iamVjdChnZXRNYW5hZ2VkSW5zdGFuY2UoKSkpOworCisgICAgICAgIGRpcnR5KGZtZC5nZXRJbmRleCgpLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShpbnQgZmllbGQpIHsKKyAgICAgICAgZGlydHkoZmllbGQsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIGZpZWxkIGRpcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIG11dGF0ZSBpZiBudWxsLCBtYXkgYmUgYW4gU0NPIG11dGF0aW9uOyBpZiB0cnVlLCBpcyBjZXJ0YWlubHkKKyAgICAgKiBhIG11dGF0aW9uIChvciBhdCBsZWFzdCB0cmVhdCBhcyBvbmUpCisgICAgICogQHJldHVybiB7QGxpbmsgQm9vbGVhbiNGQUxTRX0gaWYgdGhpcyBpbnN0YW5jZSB3YXMgYWxyZWFkeSBkaXJ0eSwKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCB3YXMgZGlydHkgYnV0IG5vdCBzaW5jZSBmbHVzaCwgYW5kCisgICAgICoge0BsaW5rIEJvb2xlYW4jVFJVRX0gaWYgaXQgd2FzIG5vdCBkaXJ0eQorICAgICAqLworICAgIHByaXZhdGUgQm9vbGVhbiBkaXJ0eShpbnQgZmllbGQsIEJvb2xlYW4gbXV0YXRlLCBib29sZWFuIGxvYWRGZXRjaEdyb3VwKSB7CisgICAgICAgIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gbmV3Rmx1c2ggPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBjbGVhbiA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICBpZiAoIWlzTmV3KCkgfHwgaXNGbHVzaGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldFVwZGF0ZVN0cmF0ZWd5KCkgPT0gVXBkYXRlU3RyYXRlZ2llcy5SRVNUUklDVCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ1cGRhdGUtcmVzdHJpY3QiLCBmbWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldFVwZGF0ZVN0cmF0ZWd5KCkgPT0gVXBkYXRlU3RyYXRlZ2llcy5JR05PUkUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNFbWJlZGRlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG93bmVyIG9mIGNoYW5nZQorICAgICAgICAgICAgICAgIF9vd25lci5kaXJ0eShfb3duZXJNZXRhLmdldEZpZWxkTWV0YURhdGEoKS5nZXRJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUsIGxvYWRGZXRjaEdyb3VwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaXMgdGhpcyBhIGRpcmVjdCBtdXRhdGlvbiBvZiBhbiBzY28gZmllbGQ/CisgICAgICAgICAgICBpZiAobXV0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0FMRU5EQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9CSkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSA9IEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtZC5pc0VtYmVkZGVkKCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlID0gQm9vbGVhbi5GQUxTRTsgLy8gbm90IHNjbworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcG9zc2libHkgY2hhbmdlIHN0YXRlCisgICAgICAgICAgICBib29sZWFuIGFjdGl2ZSA9IF9icm9rZXIuaXNBY3RpdmUoKTsKKyAgICAgICAgICAgIGNsZWFuID0gIV9zdGF0ZS5pc0RpcnR5KCk7IC8vIGludGVudGlvbmFsIGRpcmVjdCBhY2Nlc3MKKworICAgICAgICAgICAgLy8gZmlyZSBldmVudCBmYXN0IGJlZm9yZSBzdGF0ZSBjaGFuZ2UuCisgICAgICAgICAgICBpZiAoY2xlYW4pCisgICAgICAgICAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ESVJUWSk7CisgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKF9icm9rZXIuZ2V0T3B0aW1pc3RpYygpKQorICAgICAgICAgICAgICAgICAgICBzZXRQQ1N0YXRlKF9zdGF0ZS5iZWZvcmVPcHRpbWlzdGljV3JpdGUodGhpcywgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUuYm9vbGVhblZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNldFBDU3RhdGUoX3N0YXRlLmJlZm9yZVdyaXRlKHRoaXMsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlLmJvb2xlYW5WYWx1ZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZtZC5nZXRNYW5hZ2VtZW50KCkgPT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfUEVSU0lTVEVOVCkgeworICAgICAgICAgICAgICAgIGlmIChpc1BlcnNpc3RlbnQoKSAmJiAhX2Jyb2tlci5nZXROb250cmFuc2FjdGlvbmFsV3JpdGUoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAgICAgKCJub24tdHJhbnMtd3JpdGUiKSkuc2V0RmFpbGVkT2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworCisgICAgICAgICAgICAgICAgc2V0UENTdGF0ZShfc3RhdGUuYmVmb3JlTm9udHJhbnNhY3Rpb25hbFdyaXRlKHRoaXMsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICBtdXRhdGUuYm9vbGVhblZhbHVlKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0ZMVVNIRUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBuZXdGbHVzaCA9IChfZmxhZ3MgJiBGTEFHX0ZMVVNIRURfRElSVFkpID09IDA7CisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfRkxVU0hFRF9ESVJUWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBmaWVsZCBpcyBpbiBuZWVkIG9mIGZsdXNoaW5nIGFnYWluLCBhbmQgdGVsbCB0aGUKKyAgICAgICAgICAgIC8vIGJyb2tlciB0b28KKyAgICAgICAgICAgIF9mbHVzaC5jbGVhcihmaWVsZCk7CisgICAgICAgICAgICBfYnJva2VyLnNldERpcnR5KHRoaXMsIG5ld0ZsdXNoICYmICFjbGVhbik7CisKKyAgICAgICAgICAgIC8vIHNhdmUgdGhlIGZpZWxkIGZvciByb2xsYmFjayBpZiBuZWVkZWQKKyAgICAgICAgICAgIHNhdmVGaWVsZChmaWVsZCk7CisKKyAgICAgICAgICAgIC8vIGRpcnR5IHRoZSBmaWVsZCBhbmQgbWFyayBsb2FkZWQ7IGxvYWQgZmV0Y2ggZ3JvdXAgaWYgbmVlZGVkCisgICAgICAgICAgICBpbnQgbG9ja0xldmVsID0gY2FsY3VsYXRlTG9ja0xldmVsKGFjdGl2ZSwgdHJ1ZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoIV9kaXJ0eS5nZXQoZmllbGQpKSB7CisgICAgICAgICAgICAgICAgc2V0TG9hZGVkKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBfZGlydHkuc2V0KGZpZWxkKTsKKworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZmllbGQncyBmZXRjaCBncm91cCBpcyBsb2FkZWQKKyAgICAgICAgICAgICAgICBpZiAobG9hZEZldGNoR3JvdXAgJiYgaXNQZXJzaXN0ZW50KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgZm1kLmdldE1hbmFnZW1lbnQoKSA9PSBmbWQuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgICAgIGxvYWRGaWVsZChmaWVsZCwgbG9ja0xldmVsLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9idGFpbkxvY2tzKGFjdGl2ZSwgdHJ1ZSwgbG9ja0xldmVsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKHJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChsb2NrZWQpCisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xlYW4pCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICBpZiAobmV3Rmx1c2gpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgY2FuIGJlIGZpcmVkIGxhdGVyIGNhdXNlIHdlJ3JlIGFscmVhZHkgZGlydHkuCisgICAgICAgICAgICBmaXJlTGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RJUlRZX0ZMVVNIRUQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZSBwb3N0LWRpcnR5IGV2ZW50cyBhZnRlciBmaWVsZCB2YWx1ZSBjaGFuZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyByZXR1cm4gdmFsdWUgZnJvbSB7QGxpbmsgI2RpcnR5KGludCxib29sZWFuLGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3N0RGlydHkoQm9vbGVhbiBzdGF0dXMpIHsKKyAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoc3RhdHVzKSkKKyAgICAgICAgICAgIGZpcmVMaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudC5BRlRFUl9ESVJUWSk7CisgICAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBudWxsKQorICAgICAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkFGVEVSX0RJUlRZX0ZMVVNIRUQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZWQoaW50IGZpZWxkLCBPYmplY3QgcmVtb3ZlZCwgYm9vbGVhbiBrZXkpIHsKKyAgICAgICAgaWYgKHJlbW92ZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZGVyZWZlcmVuY2UgZGVwZW5kZW50IGZpZWxkcywgZGVsZXRlIGVtYmVkZGVkCisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIFZhbHVlTWV0YURhdGEgdm1kID0gKGtleSkgPyBmbWQuZ2V0S2V5KCkgOiBmbWQuZ2V0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHZtZC5pc0VtYmVkZGVkUEMoKSkKKyAgICAgICAgICAgICAgICBfc2luZ2xlLmRlbGV0ZSh2bWQsIHJlbW92ZWQsIG51bGwpOworICAgICAgICAgICAgZWxzZSBpZiAodm1kLmdldENhc2NhZGVEZWxldGUoKSA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTykKKyAgICAgICAgICAgICAgICBfc2luZ2xlLmRlcmVmZXJlbmNlRGVwZW5kZW50KHJlbW92ZWQpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyB0cmFuc2xhdGUocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdQcm94eShpbnQgZmllbGQpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3RmllbGRQcm94eShmaWVsZCk7CisKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldERlY2xhcmVkVHlwZSgpID09IGphdmEuc3FsLkRhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgamF2YS5zcWwuRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgamF2YS5zcWwuVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldERlY2xhcmVkVHlwZSgpID09IGphdmEuc3FsLlRpbWUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgamF2YS5zcWwuVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DQUxFTkRBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0ZpZWxkUHJveHkoaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBQcm94eU1hbmFnZXIgbWdyID0gX2Jyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRQcm94eU1hbmFnZXJJbnN0YW5jZSgpOworICAgICAgICBPYmplY3QgaW5pdCA9IGZtZC5nZXRJbml0aWFsaXplcigpOworCisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWdyLm5ld0RhdGVQcm94eShmbWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0FMRU5EQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1nci5uZXdDYWxlbmRhclByb3h5KGZtZC5nZXREZWNsYXJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5pdCBpbnN0YW5jZW9mIFRpbWVab25lID8gKFRpbWVab25lKSBpbml0IDogbnVsbCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiBtZ3IubmV3Q29sbGVjdGlvblByb3h5KGZtZC5nZXRQcm94eVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgZm1kLmdldEVsZW1lbnQoKS5nZXREZWNsYXJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5pdCBpbnN0YW5jZW9mIENvbXBhcmF0b3IgPyAoQ29tcGFyYXRvcikgaW5pdCA6IG51bGwpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBtZ3IubmV3TWFwUHJveHkoZm1kLmdldFByb3h5VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBmbWQuZ2V0S2V5KCkuZ2V0RGVjbGFyZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuZ2V0RGVjbGFyZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIGluaXQgaW5zdGFuY2VvZiBDb21wYXJhdG9yID8gKENvbXBhcmF0b3IpIGluaXQgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZShpbnQgZmllbGQpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3NpbmdsZS5jbGVhcigpOworICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgYm9vbGVhbiByZXQgPSBfc2luZ2xlLmlzRGVmYXVsdFZhbHVlKCk7CisgICAgICAgICAgICBfc2luZ2xlLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBSZWNvcmQgdGhhdCB0aGUgZmllbGQgaXMgZGlydHkgKHdoaWNoIG1pZ2h0IGxvYWQgREZHKQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0Jvb2xlYW5GaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgYm9vbGVhbiBjdXJWYWwsIGJvb2xlYW4gbmV3VmFsLCBpbnQgc2V0KSB7CisgICAgICAgIGlmIChzZXQgIT0gU0VUX1JFTU9URSkgeworICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PSBjdXJWYWwgJiYgX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFzc2VydE5vUHJpbWFyeUtleUNoYW5nZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIHN0YXQgPSBkaXJ0eShmaWVsZCwgQm9vbGVhbi5GQUxTRSwgc2V0ID09IFNFVF9VU0VSKTsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVCb29sZWFuRmllbGQoZmllbGQsIG5ld1ZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQocGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHBvc3REaXJ0eShzdGF0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0J5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgYnl0ZSBjdXJWYWwsIGJ5dGUgbmV3VmFsLCBpbnQgc2V0KSB7CisgICAgICAgIGlmIChzZXQgIT0gU0VUX1JFTU9URSkgeworICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PSBjdXJWYWwgJiYgX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFzc2VydE5vUHJpbWFyeUtleUNoYW5nZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIHN0YXQgPSBkaXJ0eShmaWVsZCwgQm9vbGVhbi5GQUxTRSwgc2V0ID09IFNFVF9VU0VSKTsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVCeXRlRmllbGQoZmllbGQsIG5ld1ZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQocGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHBvc3REaXJ0eShzdGF0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0NoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgY2hhciBjdXJWYWwsIGNoYXIgbmV3VmFsLCBpbnQgc2V0KSB7CisgICAgICAgIGlmIChzZXQgIT0gU0VUX1JFTU9URSkgeworICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PSBjdXJWYWwgJiYgX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFzc2VydE5vUHJpbWFyeUtleUNoYW5nZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIHN0YXQgPSBkaXJ0eShmaWVsZCwgQm9vbGVhbi5GQUxTRSwgc2V0ID09IFNFVF9VU0VSKTsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVDaGFyRmllbGQoZmllbGQsIG5ld1ZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQocGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHBvc3REaXJ0eShzdGF0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0RvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICBkb3VibGUgY3VyVmFsLCBkb3VibGUgbmV3VmFsLCBpbnQgc2V0KSB7CisgICAgICAgIGlmIChzZXQgIT0gU0VUX1JFTU9URSkgeworICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PSBjdXJWYWwgJiYgX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFzc2VydE5vUHJpbWFyeUtleUNoYW5nZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIHN0YXQgPSBkaXJ0eShmaWVsZCwgQm9vbGVhbi5GQUxTRSwgc2V0ID09IFNFVF9VU0VSKTsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVEb3VibGVGaWVsZChmaWVsZCwgbmV3VmFsKTsKKyAgICAgICAgICAgIHJlcGxhY2VGaWVsZChwYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcG9zdERpcnR5KHN0YXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgZmxvYXQgY3VyVmFsLCBmbG9hdCBuZXdWYWwsIGludCBzZXQpIHsKKyAgICAgICAgaWYgKHNldCAhPSBTRVRfUkVNT1RFKSB7CisgICAgICAgICAgICBpZiAobmV3VmFsID09IGN1clZhbCAmJiBfbG9hZGVkLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYXNzZXJ0Tm9QcmltYXJ5S2V5Q2hhbmdlKGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gc3RhdCA9IGRpcnR5KGZpZWxkLCBCb29sZWFuLkZBTFNFLCBzZXQgPT0gU0VUX1VTRVIpOworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZUZsb2F0RmllbGQoZmllbGQsIG5ld1ZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQocGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHBvc3REaXJ0eShzdGF0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0ludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICBpbnQgY3VyVmFsLCBpbnQgbmV3VmFsLCBpbnQgc2V0KSB7CisgICAgICAgIGlmIChzZXQgIT0gU0VUX1JFTU9URSkgeworICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PSBjdXJWYWwgJiYgX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFzc2VydE5vUHJpbWFyeUtleUNoYW5nZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIHN0YXQgPSBkaXJ0eShmaWVsZCwgQm9vbGVhbi5GQUxTRSwgc2V0ID09IFNFVF9VU0VSKTsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVJbnRGaWVsZChmaWVsZCwgbmV3VmFsKTsKKyAgICAgICAgICAgIHJlcGxhY2VGaWVsZChwYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcG9zdERpcnR5KHN0YXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICBsb25nIGN1clZhbCwgbG9uZyBuZXdWYWwsIGludCBzZXQpIHsKKyAgICAgICAgaWYgKHNldCAhPSBTRVRfUkVNT1RFKSB7CisgICAgICAgICAgICBpZiAobmV3VmFsID09IGN1clZhbCAmJiBfbG9hZGVkLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYXNzZXJ0Tm9QcmltYXJ5S2V5Q2hhbmdlKGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gc3RhdCA9IGRpcnR5KGZpZWxkLCBCb29sZWFuLkZBTFNFLCBzZXQgPT0gU0VUX1VTRVIpOworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZUxvbmdGaWVsZChmaWVsZCwgbmV3VmFsKTsKKyAgICAgICAgICAgIHJlcGxhY2VGaWVsZChwYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcG9zdERpcnR5KHN0YXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgIE9iamVjdCBjdXJWYWwsIE9iamVjdCBuZXdWYWwsIGludCBzZXQpIHsKKyAgICAgICAgaWYgKHNldCAhPSBTRVRfUkVNT1RFKSB7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChfbG9hZGVkLmdldChmaWVsZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsID09IGN1clZhbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gb25seSBjb21wYXJlIG5ldyB0byBvbGQgdmFsdWVzIGlmIHRoZSBjb21wYXJpc29uIGlzIGdvaW5nIHRvCisgICAgICAgICAgICAgICAgLy8gYmUgY2hlYXAgLS0gZG9uJ3QgY29tcGFyZSBjb2xsZWN0aW9ucywgbWFwcywgVURUcworICAgICAgICAgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsICYmIG5ld1ZhbC5lcXVhbHMoY3VyVmFsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZGVwZW5kZW50IHVubG9hZGVkIGZpZWxkLCBtYWtlIHN1cmUgdG8gbG9hZAorICAgICAgICAgICAgICAgIC8vIGl0IG5vdworICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0Q2FzY2FkZURlbGV0ZSgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9BVVRPCisgICAgICAgICAgICAgICAgICAgIHx8IGZtZC5nZXRLZXkoKS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgfHwgZm1kLmdldEVsZW1lbnQoKS5nZXRDYXNjYWRlRGVsZXRlKCkKKyAgICAgICAgICAgICAgICAgICAgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0FVVE8pCisgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IGZldGNoT2JqZWN0RmllbGQoZmllbGQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnROb1ByaW1hcnlLZXlDaGFuZ2UoZmllbGQpOworICAgICAgICAgICAgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLk9JRCkKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RNYW5hZ2VkT2JqZWN0SWQobmV3VmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gc3RhdCA9IGRpcnR5KGZpZWxkLCBCb29sZWFuLkZBTFNFLCBzZXQgPT0gU0VUX1VTRVIpOworICAgICAgICAgICAgaWYgKHNldCAhPSBTRVRfUkVNT1RFKSB7CisgICAgICAgICAgICAgICAgX3NpbmdsZS5zdG9yZU9iamVjdEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgICAgIF9zaW5nbGUudW5wcm94eSgpOworICAgICAgICAgICAgICAgIF9zaW5nbGUuZGVyZWZlcmVuY2VEZXBlbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBfc2luZ2xlLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc2luZ2xlLnN0b3JlT2JqZWN0RmllbGQoZmllbGQsIG5ld1ZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQocGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHBvc3REaXJ0eShzdGF0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ1Nob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgIHNob3J0IGN1clZhbCwgc2hvcnQgbmV3VmFsLCBpbnQgc2V0KSB7CisgICAgICAgIGlmIChzZXQgIT0gU0VUX1JFTU9URSkgeworICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PSBjdXJWYWwgJiYgX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFzc2VydE5vUHJpbWFyeUtleUNoYW5nZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb29sZWFuIHN0YXQgPSBkaXJ0eShmaWVsZCwgQm9vbGVhbi5GQUxTRSwgc2V0ID09IFNFVF9VU0VSKTsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVTaG9ydEZpZWxkKGZpZWxkLCBuZXdWYWwpOworICAgICAgICAgICAgcmVwbGFjZUZpZWxkKHBjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICBwb3N0RGlydHkoc3RhdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgU3RyaW5nIGN1clZhbCwgU3RyaW5nIG5ld1ZhbCwgaW50IHNldCkgeworICAgICAgICBpZiAoc2V0ICE9IFNFVF9SRU1PVEUpIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5lcXVhbHMobmV3VmFsLCBjdXJWYWwpICYmIF9sb2FkZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBhc3NlcnROb1ByaW1hcnlLZXlDaGFuZ2UoZmllbGQpOworICAgICAgICB9CisKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQm9vbGVhbiBzdGF0ID0gZGlydHkoZmllbGQsIEJvb2xlYW4uRkFMU0UsIHNldCA9PSBTRVRfVVNFUik7CisgICAgICAgICAgICBfc2luZ2xlLnN0b3JlU3RyaW5nRmllbGQoZmllbGQsIG5ld1ZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQocGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHBvc3REaXJ0eShzdGF0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWxsb3dzIGNoYW5naW5nIHByaW1hcnkga2V5IGZpZWxkcyBmb3IgaW5zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb1ByaW1hcnlLZXlDaGFuZ2UoaW50IGZpZWxkKSB7CisgICAgICAgIGlmIChfb2lkICE9IG51bGwgJiYgX21ldGEuZ2V0RmllbGQoZmllbGQpLmlzUHJpbWFyeUtleSgpKQorICAgICAgICAgICAgdGhyb3cgdHJhbnNsYXRlKG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAoImNoYW5nZS1pZGVudGl0eSIpKS5zZXRGYWlsZWRPYmplY3QoZ2V0TWFuYWdlZEluc3RhbmNlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvd3Mgc2V0dGluZyBhbiBvYmplY3QgaWQgZmllbGQgdG8gYSBtYW5hZ2VkIGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgYXNzZXJ0Tm90TWFuYWdlZE9iamVjdElkKE9iamVjdCB2YWwpIHsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsCisgICAgICAgICAgICAmJiAoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdmFsKS5wY0dldEdlbmVyaWNDb250ZXh0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IHRyYW5zbGF0ZShuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgKCJtYW5hZ2VkLW9pZCIsIEV4Y2VwdGlvbnMudG9TdHJpbmcodmFsKSwKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhnZXRNYW5hZ2VkSW5zdGFuY2UoKSkpKS4KKyAgICAgICAgICAgICAgICBzZXRGYWlsZWRPYmplY3QoZ2V0TWFuYWdlZEluc3RhbmNlKCkpKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRGVsZWdhdGUgdG8gRmllbGRNYW5hZ2VyCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRCb29sZWFuRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgIGJvb2xlYW4gY3VyVmFsKSB7CisgICAgICAgIF9mbS5zdG9yZUJvb2xlYW5GaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEJ5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgYnl0ZSBjdXJWYWwpIHsKKyAgICAgICAgX2ZtLnN0b3JlQnl0ZUZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQ2hhckZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICBjaGFyIGN1clZhbCkgeworICAgICAgICBfZm0uc3RvcmVDaGFyRmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWREb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgZG91YmxlIGN1clZhbCkgeworICAgICAgICBfZm0uc3RvcmVEb3VibGVGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgIGZsb2F0IGN1clZhbCkgeworICAgICAgICBfZm0uc3RvcmVGbG9hdEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgIGludCBjdXJWYWwpIHsKKyAgICAgICAgX2ZtLnN0b3JlSW50RmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQsCisgICAgICAgIGxvbmcgY3VyVmFsKSB7CisgICAgICAgIF9mbS5zdG9yZUxvbmdGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZE9iamVjdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkLAorICAgICAgICBPYmplY3QgY3VyVmFsKSB7CisgICAgICAgIF9mbS5zdG9yZU9iamVjdEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgc2hvcnQgY3VyVmFsKSB7CisgICAgICAgIF9mbS5zdG9yZVNob3J0RmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCwKKyAgICAgICAgU3RyaW5nIGN1clZhbCkgeworICAgICAgICBfZm0uc3RvcmVTdHJpbmdGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBfZm0uZmV0Y2hCb29sZWFuRmllbGQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHJlcGxhY2VCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIF9mbS5mZXRjaEJ5dGVGaWVsZChmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgcmVwbGFjZUNoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gX2ZtLmZldGNoQ2hhckZpZWxkKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIHJlcGxhY2VEb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gX2ZtLmZldGNoRG91YmxlRmllbGQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCByZXBsYWNlRmxvYXRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gX2ZtLmZldGNoRmxvYXRGaWVsZChmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZXBsYWNlSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIF9mbS5mZXRjaEludEZpZWxkKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyByZXBsYWNlTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBfZm0uZmV0Y2hMb25nRmllbGQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcmVwbGFjZU9iamVjdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBfZm0uZmV0Y2hPYmplY3RGaWVsZChmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHJlcGxhY2VTaG9ydEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBfZm0uZmV0Y2hTaG9ydEZpZWxkKGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2VTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gX2ZtLmZldGNoU3RyaW5nRmllbGQoZmllbGQpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBGaWVsZE1hbmFnZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgYm9vbGVhbiBmZXRjaEJvb2xlYW4oaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIWZtZC5pc0V4dGVybmFsaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZldGNoQm9vbGVhbkZpZWxkKGZpZWxkKTsKKworICAgICAgICBPYmplY3QgdmFsID0gZmV0Y2hGaWVsZChmaWVsZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gKChCb29sZWFuKSBmbWQuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBmZXRjaEJvb2xlYW5GaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFfbG9hZGVkLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgbG9hZEZpZWxkKGZpZWxkLCBMb2NrTGV2ZWxzLkxPQ0tfTk9ORSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIF9zaW5nbGUuZmV0Y2hCb29sZWFuRmllbGQoZmllbGQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBmZXRjaEJ5dGUoaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIWZtZC5pc0V4dGVybmFsaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZldGNoQnl0ZUZpZWxkKGZpZWxkKTsKKworICAgICAgICBPYmplY3QgdmFsID0gZmV0Y2hGaWVsZChmaWVsZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gKChOdW1iZXIpIGZtZC5nZXRFeHRlcm5hbFZhbHVlKHZhbCwgX2Jyb2tlcikpLmJ5dGVWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGZldGNoQnl0ZUZpZWxkKGludCBmaWVsZCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgICAgICBsb2FkRmllbGQoZmllbGQsIExvY2tMZXZlbHMuTE9DS19OT05FLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBwcm92aWRlRmllbGQoX3BjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICByZXR1cm4gX3NpbmdsZS5mZXRjaEJ5dGVGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGZldGNoQ2hhcihpbnQgZmllbGQpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICByZXR1cm4gZmV0Y2hDaGFyRmllbGQoZmllbGQpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAoKENoYXJhY3RlcikgZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKSkuY2hhclZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgZmV0Y2hDaGFyRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIGxvYWRGaWVsZChmaWVsZCwgTG9ja0xldmVscy5MT0NLX05PTkUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIHByb3ZpZGVGaWVsZChfcGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBfc2luZ2xlLmZldGNoQ2hhckZpZWxkKGZpZWxkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBmZXRjaERvdWJsZShpbnQgZmllbGQpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICByZXR1cm4gZmV0Y2hEb3VibGVGaWVsZChmaWVsZCk7CisKKyAgICAgICAgT2JqZWN0IHZhbCA9IGZldGNoRmllbGQoZmllbGQsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBmbWQuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpKS5kb3VibGVWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFfbG9hZGVkLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgbG9hZEZpZWxkKGZpZWxkLCBMb2NrTGV2ZWxzLkxPQ0tfTk9ORSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIF9zaW5nbGUuZmV0Y2hEb3VibGVGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBmZXRjaEZsb2F0KGludCBmaWVsZCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmZXRjaEZsb2F0RmllbGQoZmllbGQpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAoKE51bWJlcikgZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKSkuZmxvYXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBmZXRjaEZsb2F0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIGxvYWRGaWVsZChmaWVsZCwgTG9ja0xldmVscy5MT0NLX05PTkUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIHByb3ZpZGVGaWVsZChfcGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBfc2luZ2xlLmZldGNoRmxvYXRGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnQoaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIWZtZC5pc0V4dGVybmFsaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZldGNoSW50RmllbGQoZmllbGQpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAoKE51bWJlcikgZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKSkuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGZldGNoSW50RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIGxvYWRGaWVsZChmaWVsZCwgTG9ja0xldmVscy5MT0NLX05PTkUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIHByb3ZpZGVGaWVsZChfcGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBfc2luZ2xlLmZldGNoSW50RmllbGQoZmllbGQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBmZXRjaExvbmcoaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIWZtZC5pc0V4dGVybmFsaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZldGNoTG9uZ0ZpZWxkKGZpZWxkKTsKKworICAgICAgICBPYmplY3QgdmFsID0gZmV0Y2hGaWVsZChmaWVsZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gKChOdW1iZXIpIGZtZC5nZXRFeHRlcm5hbFZhbHVlKHZhbCwgX2Jyb2tlcikpLmxvbmdWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGZldGNoTG9uZ0ZpZWxkKGludCBmaWVsZCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgICAgICBsb2FkRmllbGQoZmllbGQsIExvY2tMZXZlbHMuTE9DS19OT05FLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBwcm92aWRlRmllbGQoX3BjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICByZXR1cm4gX3NpbmdsZS5mZXRjaExvbmdGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3QoaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIWZtZC5pc0V4dGVybmFsaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZldGNoT2JqZWN0RmllbGQoZmllbGQpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBmbWQuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3RGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFfbG9hZGVkLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgbG9hZEZpZWxkKGZpZWxkLCBMb2NrTGV2ZWxzLkxPQ0tfTk9ORSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIF9zaW5nbGUuZmV0Y2hPYmplY3RGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBmZXRjaFNob3J0KGludCBmaWVsZCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmZXRjaFNob3J0RmllbGQoZmllbGQpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAoKE51bWJlcikgZm1kLmdldEV4dGVybmFsVmFsdWUodmFsLCBfYnJva2VyKSkuc2hvcnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBmZXRjaFNob3J0RmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX2xvYWRlZC5nZXQoZmllbGQpKQorICAgICAgICAgICAgICAgIGxvYWRGaWVsZChmaWVsZCwgTG9ja0xldmVscy5MT0NLX05PTkUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIHByb3ZpZGVGaWVsZChfcGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBfc2luZ2xlLmZldGNoU2hvcnRGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmcoaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAoIWZtZC5pc0V4dGVybmFsaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZldGNoU3RyaW5nRmllbGQoZmllbGQpOworCisgICAgICAgIE9iamVjdCB2YWwgPSBmZXRjaEZpZWxkKGZpZWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBmbWQuZ2V0RXh0ZXJuYWxWYWx1ZSh2YWwsIF9icm9rZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmdGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFfbG9hZGVkLmdldChmaWVsZCkpCisgICAgICAgICAgICAgICAgbG9hZEZpZWxkKGZpZWxkLCBMb2NrTGV2ZWxzLkxPQ0tfTk9ORSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIF9zaW5nbGUuZmV0Y2hTdHJpbmdGaWVsZChmaWVsZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbihpbnQgZmllbGQsIGJvb2xlYW4gZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICBzdG9yZUJvb2xlYW5GaWVsZChmaWVsZCwgZXh0ZXJuYWxWYWwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWwgPSAoZXh0ZXJuYWxWYWwpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIGZtZC5nZXRGaWVsZFZhbHVlKHZhbCwgX2Jyb2tlcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVCb29sZWFuRmllbGQoaW50IGZpZWxkLCBib29sZWFuIGN1clZhbCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc2luZ2xlLnN0b3JlQm9vbGVhbkZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgcmVwbGFjZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgc2V0TG9hZGVkKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgIHBvc3RMb2FkKGZpZWxkLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVCeXRlKGludCBmaWVsZCwgYnl0ZSBleHRlcm5hbFZhbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHN0b3JlQnl0ZUZpZWxkKGZpZWxkLCBleHRlcm5hbFZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIGZtZC5nZXRGaWVsZFZhbHVlKG5ldyBCeXRlKGV4dGVybmFsVmFsKSwKKyAgICAgICAgICAgICAgICBfYnJva2VyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVCeXRlRmllbGQoaW50IGZpZWxkLCBieXRlIGN1clZhbCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc2luZ2xlLnN0b3JlQnl0ZUZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgcmVwbGFjZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgc2V0TG9hZGVkKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgIHBvc3RMb2FkKGZpZWxkLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGFyKGludCBmaWVsZCwgY2hhciBleHRlcm5hbFZhbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHN0b3JlQ2hhckZpZWxkKGZpZWxkLCBleHRlcm5hbFZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIGZtZC5nZXRGaWVsZFZhbHVlKG5ldyBDaGFyYWN0ZXIoZXh0ZXJuYWxWYWwpLAorICAgICAgICAgICAgICAgIF9icm9rZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUNoYXJGaWVsZChpbnQgZmllbGQsIGNoYXIgY3VyVmFsKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVDaGFyRmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQoX3BjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICBzZXRMb2FkZWQoZmllbGQsIHRydWUpOworICAgICAgICAgICAgcG9zdExvYWQoZmllbGQsIG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZURvdWJsZShpbnQgZmllbGQsIGRvdWJsZSBleHRlcm5hbFZhbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHN0b3JlRG91YmxlRmllbGQoZmllbGQsIGV4dGVybmFsVmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RvcmVGaWVsZChmaWVsZCwgZm1kLmdldEZpZWxkVmFsdWUobmV3IERvdWJsZShleHRlcm5hbFZhbCksCisgICAgICAgICAgICAgICAgX2Jyb2tlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRG91YmxlRmllbGQoaW50IGZpZWxkLCBkb3VibGUgY3VyVmFsKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVEb3VibGVGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICAgICAgICAgIHJlcGxhY2VGaWVsZChfcGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHNldExvYWRlZChmaWVsZCwgdHJ1ZSk7CisgICAgICAgICAgICBwb3N0TG9hZChmaWVsZCwgbnVsbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXQoaW50IGZpZWxkLCBmbG9hdCBleHRlcm5hbFZhbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHN0b3JlRmxvYXRGaWVsZChmaWVsZCwgZXh0ZXJuYWxWYWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG9yZUZpZWxkKGZpZWxkLCBmbWQuZ2V0RmllbGRWYWx1ZShuZXcgRmxvYXQoZXh0ZXJuYWxWYWwpLAorICAgICAgICAgICAgICAgIF9icm9rZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZsb2F0RmllbGQoaW50IGZpZWxkLCBmbG9hdCBjdXJWYWwpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZUZsb2F0RmllbGQoZmllbGQsIGN1clZhbCk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQoX3BjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICBzZXRMb2FkZWQoZmllbGQsIHRydWUpOworICAgICAgICAgICAgcG9zdExvYWQoZmllbGQsIG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUludChpbnQgZmllbGQsIGludCBleHRlcm5hbFZhbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHN0b3JlSW50RmllbGQoZmllbGQsIGV4dGVybmFsVmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RvcmVGaWVsZChmaWVsZCwgZm1kLmdldEZpZWxkVmFsdWUoTnVtYmVycy52YWx1ZU9mKGV4dGVybmFsVmFsKSwKKyAgICAgICAgICAgICAgICBfYnJva2VyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVJbnRGaWVsZChpbnQgZmllbGQsIGludCBjdXJWYWwpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZUludEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgcmVwbGFjZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgc2V0TG9hZGVkKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgIHBvc3RMb2FkKGZpZWxkLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVMb25nKGludCBmaWVsZCwgbG9uZyBleHRlcm5hbFZhbCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgaWYgKCFmbWQuaXNFeHRlcm5hbGl6ZWQoKSkKKyAgICAgICAgICAgIHN0b3JlTG9uZ0ZpZWxkKGZpZWxkLCBleHRlcm5hbFZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIGZtZC5nZXRGaWVsZFZhbHVlKE51bWJlcnMudmFsdWVPZihleHRlcm5hbFZhbCksCisgICAgICAgICAgICAgICAgX2Jyb2tlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlTG9uZ0ZpZWxkKGludCBmaWVsZCwgbG9uZyBjdXJWYWwpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZUxvbmdGaWVsZChmaWVsZCwgY3VyVmFsKTsKKyAgICAgICAgICAgIHJlcGxhY2VGaWVsZChfcGMsIF9zaW5nbGUsIGZpZWxkKTsKKyAgICAgICAgICAgIHNldExvYWRlZChmaWVsZCwgdHJ1ZSk7CisgICAgICAgICAgICBwb3N0TG9hZChmaWVsZCwgbnVsbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlT2JqZWN0KGludCBmaWVsZCwgT2JqZWN0IGV4dGVybmFsVmFsKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBleHRlcm5hbFZhbCA9IGZtZC5vcmRlcihleHRlcm5hbFZhbCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICBzdG9yZU9iamVjdEZpZWxkKGZpZWxkLCBleHRlcm5hbFZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIGZtZC5nZXRGaWVsZFZhbHVlKGV4dGVybmFsVmFsLCBfYnJva2VyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVPYmplY3RGaWVsZChpbnQgZmllbGQsIE9iamVjdCBjdXJWYWwpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZU9iamVjdEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgX3NpbmdsZS5wcm94eSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICByZXBsYWNlRmllbGQoX3BjLCBfc2luZ2xlLCBmaWVsZCk7CisgICAgICAgICAgICBzZXRMb2FkZWQoZmllbGQsIHRydWUpOworICAgICAgICAgICAgcG9zdExvYWQoZmllbGQsIG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVNob3J0KGludCBmaWVsZCwgc2hvcnQgZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICBzdG9yZVNob3J0RmllbGQoZmllbGQsIGV4dGVybmFsVmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RvcmVGaWVsZChmaWVsZCwgZm1kLmdldEZpZWxkVmFsdWUobmV3IFNob3J0KGV4dGVybmFsVmFsKSwKKyAgICAgICAgICAgICAgICBfYnJva2VyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVTaG9ydEZpZWxkKGludCBmaWVsZCwgc2hvcnQgY3VyVmFsKSB7CisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zaW5nbGUuc3RvcmVTaG9ydEZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgcmVwbGFjZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgc2V0TG9hZGVkKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgIHBvc3RMb2FkKGZpZWxkLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVTdHJpbmcoaW50IGZpZWxkLCBTdHJpbmcgZXh0ZXJuYWxWYWwpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghZm1kLmlzRXh0ZXJuYWxpemVkKCkpCisgICAgICAgICAgICBzdG9yZVN0cmluZ0ZpZWxkKGZpZWxkLCBleHRlcm5hbFZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlRmllbGQoZmllbGQsIGZtZC5nZXRGaWVsZFZhbHVlKGV4dGVybmFsVmFsLCBfYnJva2VyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVTdHJpbmdGaWVsZChpbnQgZmllbGQsIFN0cmluZyBjdXJWYWwpIHsKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3NpbmdsZS5zdG9yZVN0cmluZ0ZpZWxkKGZpZWxkLCBjdXJWYWwpOworICAgICAgICAgICAgcmVwbGFjZUZpZWxkKF9wYywgX3NpbmdsZSwgZmllbGQpOworICAgICAgICAgICAgc2V0TG9hZGVkKGZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgIHBvc3RMb2FkKGZpZWxkLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIGdpdmVuIGZpZWxkIHZhbHVlIGludG8gdGhlIGdpdmVuIGZpZWxkIG1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlRmllbGQoaW50IGZpZWxkLCBPYmplY3QgdmFsLCBGaWVsZE1hbmFnZXIgZm0pIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBfbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1maWVsZC1pbmRleCIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoZmllbGQpLCBfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkpKS4KKyAgICAgICAgICAgICAgICBzZXRGYWlsZWRPYmplY3QoZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworCisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICBib29sZWFuIGJvb2wgPSB2YWwgIT0gbnVsbCAmJiAoKEJvb2xlYW4pIHZhbCkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgZm0uc3RvcmVCb29sZWFuRmllbGQoZmllbGQsIGJvb2wpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICBieXRlIGIgPSAodmFsID09IG51bGwpID8gMCA6ICgoTnVtYmVyKSB2YWwpLmJ5dGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGZtLnN0b3JlQnl0ZUZpZWxkKGZpZWxkLCBiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgY2hhciBjID0gKHZhbCA9PSBudWxsKSA/IDAgOiAoKENoYXJhY3RlcikgdmFsKS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBmbS5zdG9yZUNoYXJGaWVsZChmaWVsZCwgYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSAodmFsID09IG51bGwpID8gMCA6ICgoTnVtYmVyKSB2YWwpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgZm0uc3RvcmVEb3VibGVGaWVsZChmaWVsZCwgZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmID0gKHZhbCA9PSBudWxsKSA/IDAgOiAoKE51bWJlcikgdmFsKS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgZm0uc3RvcmVGbG9hdEZpZWxkKGZpZWxkLCBmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICBpbnQgaSA9ICh2YWwgPT0gbnVsbCkgPyAwIDogKChOdW1iZXIpIHZhbCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBmbS5zdG9yZUludEZpZWxkKGZpZWxkLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgbG9uZyBsID0gKHZhbCA9PSBudWxsKSA/IDAgOiAoKE51bWJlcikgdmFsKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBmbS5zdG9yZUxvbmdGaWVsZChmaWVsZCwgbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzID0gKHZhbCA9PSBudWxsKSA/IDAgOiAoKE51bWJlcikgdmFsKS5zaG9ydFZhbHVlKCk7CisgICAgICAgICAgICAgICAgZm0uc3RvcmVTaG9ydEZpZWxkKGZpZWxkLCBzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICBmbS5zdG9yZVN0cmluZ0ZpZWxkKGZpZWxkLCAoU3RyaW5nKSB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmbS5zdG9yZU9iamVjdEZpZWxkKGZpZWxkLCB2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLworICAgIC8vIFV0aWxpdGllcworICAgIC8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIEVyYXNlIHRoZSBmYWN0IHRoYXQgdGhpcyBpbnN0YW5jZSBoYXMgYmVlbiBmbHVzaGVkLgorICAgICAqLworICAgIHZvaWQgZXJhc2VGbHVzaCgpIHsKKyAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0ZMVVNIRUQ7CisgICAgICAgIF9mbGFncyAmPSB+RkxBR19GTFVTSEVEX0RJUlRZOworCisgICAgICAgIGludCBmbWRzID0gX21ldGEuZ2V0RmllbGRzKCkubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHM7IGkrKykKKyAgICAgICAgICAgIF9mbHVzaC5jbGVhcihpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmRzIHRoYXQgYWxsIGluc3RhbmNlIGZpZWxkcyBhcmUvYXJlIG5vdCBsb2FkZWQuCisgICAgICogUHJpbWFyeSBrZXkgYW5kIG5vbi1wZXJzaXN0ZW50IGZpZWxkcyBhcmUgbm90IGFmZmVjdGVkLgorICAgICAqLworICAgIHZvaWQgc2V0TG9hZGVkKGJvb2xlYW4gdmFsKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFmbWRzW2ldLmlzUHJpbWFyeUtleSgpCisgICAgICAgICAgICAgICAgJiYgZm1kc1tpXS5nZXRNYW5hZ2VtZW50KCkgPT0gZm1kc1tpXS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICBzZXRMb2FkZWQoaSwgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXZhbCkgeworICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX0xPQURFRDsKKyAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19MT0FERUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkcyB0aGF0IGFsbCBpbnN0YW5jZSBmaWVsZHMgYXJlL2FyZSBub3QgZGlydHksCisgICAgICogYW5kIGNoYW5nZXMgdGhlIGZsYWdzIG9mIHRoZSBpbnN0YW5jZSBhY2NvcmRpbmdseS4KKyAgICAgKi8KKyAgICB2b2lkIHNldERpcnR5KGJvb2xlYW4gdmFsKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIGJvb2xlYW4gdXBkYXRlID0gIWlzTmV3KCkgfHwgaXNGbHVzaGVkKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhbCAmJiAoIXVwZGF0ZQorICAgICAgICAgICAgICAgIHx8IGZtZHNbaV0uZ2V0VXBkYXRlU3RyYXRlZ3koKSAhPSBVcGRhdGVTdHJhdGVnaWVzLklHTk9SRSkpCisgICAgICAgICAgICAgICAgX2RpcnR5LnNldChpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCF2YWwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZXZlciBjb25zaWRlciBjbGVhbiBmaWVsZHMgZmx1c2hlZDsgdGhpcyBhbHNvIHRha2VzCisgICAgICAgICAgICAgICAgLy8gY2FyZSBvZiBjbGVhcmluZyB0aGUgZmx1c2hlZCBmaWVsZHMgb24gY29tbWl0L3JvbGxiYWNrCisgICAgICAgICAgICAgICAgX2ZsdXNoLmNsZWFyKGkpOworICAgICAgICAgICAgICAgIF9kaXJ0eS5jbGVhcihpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19MT0FERUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgcHJlLWNsZWFyIGNhbGxiYWNrcywgY2xlYXJzIGFsbCBtYW5hZ2VkIGZpZWxkcywgYW5kIGNhbGxzIHRoZQorICAgICAqIHtAbGluayAjc2V0TG9hZGVkfSBtZXRob2Qgd2l0aCBhIHZhbHVlIG9mIGZhbHNlLiBQcmltYXJ5IGtleSBmaWVsZHMKKyAgICAgKiBhcmUgbm90IGNsZWFyZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhckZpZWxkcygpIHsKKyAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkJFRk9SRV9DTEVBUik7CisKKyAgICAgICAgLy8gdW5wcm94eSBhbGwgZmllbGRzCisgICAgICAgIHVucHJveHlGaWVsZHMoKTsKKworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjbGVhciBub24tcGsgZmllbGRzCisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmbWRzW2ldLmlzUHJpbWFyeUtleSgpICYmIGZtZHNbaV0uZ2V0TWFuYWdlbWVudCgpCisgICAgICAgICAgICAgICAgICAgID09IEZpZWxkTWV0YURhdGEuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGaWVsZChfcGMsIENsZWFyRmllbGRNYW5hZ2VyLmdldEluc3RhbmNlKCksIGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmb3JnZXQgdmVyc2lvbiBpbmZvIGFuZCBpbXBsIGRhdGEgc28gd2UgcmUtcmVhZCBuZXh0IHRpbWUKKyAgICAgICAgICAgIHNldExvYWRlZChmYWxzZSk7CisgICAgICAgICAgICBfdmVyc2lvbiA9IG51bGw7CisgICAgICAgICAgICBfbG9hZFZlcnNpb24gPSBudWxsOworICAgICAgICAgICAgaWYgKF9maWVsZEltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChfZmllbGRJbXBsLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkFGVEVSX0NMRUFSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhhdCB3ZSBzaG91bGQgc2F2ZSBhbnkgZmllbGRzIHRoYXQgY2hhbmdlIGZyb20gdGhpcyBwb2ludAorICAgICAqIGZvcndhcmQuCisgICAgICovCisgICAgdm9pZCBzYXZlRmllbGRzKGJvb2xlYW4gaW1tZWRpYXRlKSB7CisgICAgICAgIGlmIChfYnJva2VyLmdldFJlc3RvcmVTdGF0ZSgpID09IFJlc3RvcmVTdGF0ZS5SRVNUT1JFX05PTkUKKyAgICAgICAgICAgICYmIChfZmxhZ3MgJiBGTEFHX0lOVkVSU0VTKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIF9mbGFncyB8PSBGTEFHX1NBVkU7CisgICAgICAgIGlmIChpbW1lZGlhdGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBfbG9hZGVkLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgc2F2ZUZpZWxkKGkpOworICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1NBVkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZmllbGQgaXNuJ3QgYWxyZWFkeSBzYXZlZCwgc2F2ZXMgdGhlIGN1cnJlbnRseSBsb2FkZWQgZmllbGQKKyAgICAgKiBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UuIFRoZSBzYXZlZCB2YWx1ZXMgY2FuIGFsbCBiZSByZXN0b3JlZCB2aWEKKyAgICAgKiB7QGxpbmsgI3Jlc3RvcmVGaWVsZHN9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzYXZlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TQVZFKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBtYW5hZ2VkIGludmVyc2UgZmllbGQsIGxvYWQgaXQgc28gd2UncmUgc3VyZSB0byBoYXZlCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGZpZWxkKSAmJiAoKF9mbGFncyAmIEZMQUdfSU5WRVJTRVMpICE9IDAKKyAgICAgICAgICAgICYmIF9tZXRhLmdldEZpZWxkKGZpZWxkKS5nZXRJbnZlcnNlTWV0YURhdGFzKCkubGVuZ3RoID4gMCkpCisgICAgICAgICAgICBsb2FkRmllbGQoZmllbGQsIExvY2tMZXZlbHMuTE9DS19OT05FLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgIC8vIGRvbid0IGJvdGhlciBjcmVhdGluZyB0aGUgc2F2ZSBmaWVsZCBtYW5hZ2VyIGlmIHdlJ3JlIG5vdCBnb2luZyB0bworICAgICAgICAvLyBzYXZlIHRoZSBvbGQgZmllbGQgdmFsdWUgYW55d2F5CisgICAgICAgIGlmIChfc2F2ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9sb2FkZWQuZ2V0KGZpZWxkKSkKKyAgICAgICAgICAgICAgICBfc2F2ZWQgPSBuZXcgU2F2ZUZpZWxkTWFuYWdlcih0aGlzLCBudWxsLCBfZGlydHkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvcHkgdGhlIGZpZWxkIHRvIHNhdmUgZmllbGQgbWFuYWdlcjsgaWYgdGhlIGZpZWxkIGlzIG5vdCBkaXJlY3RseQorICAgICAgICAvLyBjb3B5YWJsZSwgaW1tZWRpYXRlbHkgcHJvdmlkZSBhbmQgcmVwbGFjZSBpdCB2aWEgdGhlIHNhdmUgZmllbGQKKyAgICAgICAgLy8gbWFuYWdlciwgd2hpY2ggd2lsbCBjb3B5IHRoZSBtdXRhYmxlIHZhbHVlIHRvIHByZXZlbnQgYnktcmVmIG1vZHMKKyAgICAgICAgaWYgKF9zYXZlZC5zYXZlRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgICBwcm92aWRlRmllbGQoX3BjLCBfc2F2ZWQsIGZpZWxkKTsKKyAgICAgICAgICAgIHJlcGxhY2VGaWVsZChfc2F2ZWQuZ2V0U3RhdGUoKSwgX3NhdmVkLCBmaWVsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgd2lsbCBub3QgbmVlZCB0byBiZSByb2xsZWQgYmFjaworICAgICAqIHRvIHRoYXQgb2YgdGhlIGxhc3QgY2FsbCB0byB7QGxpbmsgI3NhdmVGaWVsZHN9LgorICAgICAqLworICAgIHZvaWQgY2xlYXJTYXZlZEZpZWxkcygpIHsKKyAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1NBVkU7CisgICAgICAgIF9zYXZlZCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUm9sbGJhY2sgdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSB0byB0aGUgc2F2ZWQgc3RhdGUgZnJvbSB0aGUKKyAgICAgKiBsYXN0IGNhbGwgdG8ge0BsaW5rICNzYXZlRmllbGRzfSwgb3IgdG8gZGVmYXVsdCB2YWx1ZXMgaWYgbmV2ZXIgc2F2ZWQuCisgICAgICovCisgICAgdm9pZCByZXN0b3JlRmllbGRzKCkgeworICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3NhdmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU0FWRSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJGaWVsZHMoKTsKKyAgICAgICAgICAgICAgICBlbHNlIC8vIG9ubHkgdW5sb2FkZWQgZmllbGRzIHdlcmUgZGlydGllZAorICAgICAgICAgICAgICAgICAgICBfbG9hZGVkLmFuZE5vdChfbG9hZGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlIGRpcmVjdCBzdGF0ZSB0cmFuc2l0aW9ucyBiYXNlZCBvbiBvdXIgb3duIGdldFJlc3RvcmVTdGF0ZQorICAgICAgICAgICAgLy8gbWV0aG9kLCBidXQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gYWN0dWFsbHkgcm9sbGJhY2sgZmllbGQKKyAgICAgICAgICAgIC8vIHZhbHVlcywgd2UgY29uc3VsdCB0aGUgYnJva2VyIGZvciB0aGUgdXNlcidzIHNldHRpbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKF9icm9rZXIuZ2V0UmVzdG9yZVN0YXRlKCkgIT0gUmVzdG9yZVN0YXRlLlJFU1RPUkVfTk9ORSkgeworICAgICAgICAgICAgICAgIC8vIHJvbGxiYWNrIGFsbCBjdXJyZW50bHktbG9hZGVkIGZpZWxkcworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBfbG9hZGVkLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChfbG9hZGVkLmdldChpKSAmJiBfc2F2ZWQucmVzdG9yZUZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUZpZWxkKF9wYywgX3NhdmVkLCBpKTsKKworICAgICAgICAgICAgICAgIC8vIHJvbGxiYWNrIGxvYWRlZCBzZXQKKyAgICAgICAgICAgICAgICBfbG9hZGVkLmFuZE5vdChfc2F2ZWQuZ2V0VW5sb2FkZWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIGFsbCBzZWNvbmQgY2xhc3Mgb2JqZWN0IGZpZWxkcyB3aXRoIGZyZXNoIHByb3hpZWQgaW5zdGFuY2VzCisgICAgICogY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgb3JpZ2luYWxzLgorICAgICAqLworICAgIHZvaWQgcHJveHlGaWVsZHMoYm9vbGVhbiByZXNldCwgYm9vbGVhbiByZXBsYWNlTnVsbCkgeworICAgICAgICAvLyB3ZSBvbmx5IHJlcGxhY2UgbnVsbHMgaWYgdGhlIHJ1bnRpbWUgY2FuJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCisgICAgICAgIC8vIG51bGwgYW5kIGVtcHR5IGNvbnRhaW5lcnMuICB3ZSByZXBsYWNlIG51bGxzIGluIHRoaXMgY2FzZSB0bworICAgICAgICAvLyBtYWludGFpbiBjb25zaXN0ZW5jeSB3aGV0aGVyIHZhbHVlcyBhcmUgYmVpbmcgcmV0YWluZWQgb3Igbm90CisgICAgICAgIGlmIChyZXBsYWNlTnVsbCkKKyAgICAgICAgICAgIHJlcGxhY2VOdWxsID0gIV9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLnN1cHBvcnRlZE9wdGlvbnMoKS4KKyAgICAgICAgICAgICAgICBjb250YWlucyhPcGVuSlBBQ29uZmlndXJhdGlvbi5PUFRJT05fTlVMTF9DT05UQUlORVIpOworCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBfbG9hZGVkLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvYWRlZC5nZXQoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZUZpZWxkKF9wYywgX3NpbmdsZSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfc2luZ2xlLnByb3h5KHJlc2V0LCByZXBsYWNlTnVsbCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmllbGQoX3BjLCBfc2luZ2xlLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX3NpbmdsZS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5wcm94eSBhbGwgZmllbGRzLgorICAgICAqLworICAgIHZvaWQgdW5wcm94eUZpZWxkcygpIHsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05PX1VOUFJPWFkpICE9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IF9sb2FkZWQubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIHByb3ZpZGVGaWVsZChfcGMsIF9zaW5nbGUsIGkpOworICAgICAgICAgICAgICAgIF9zaW5nbGUudW5wcm94eSgpOworICAgICAgICAgICAgICAgIF9zaW5nbGUucmVsZWFzZUVtYmVkZGVkKCk7CisgICAgICAgICAgICAgICAgX3NpbmdsZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVhZHkgZm9yIGEgZmx1c2guIFBlcnNpc3RzIGFsbCBwZXJzaXN0ZW5jZS1jYXBhYmxlIG9iamVjdCBmaWVsZHMsCisgICAgICogYW5kIGNoZWNrcyBmb3IgaWxsZWdhbCBudWxsIHZhbHVlcy4gQWxzbyBhc3NpZ25zIG9pZHMgYW5kIGZpZWxkIHZhbHVlcworICAgICAqIGZvciBhbGwgc3RyYXRlZ2llcyB0aGF0IGRvbid0IHJlcXVpcmUgZmx1c2hpbmcuCisgICAgICovCisgICAgdm9pZCBwcmVGbHVzaChib29sZWFuIGxvZ2ljYWwsIE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1BSRV9GTFVTSEVEKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChpc1BlcnNpc3RlbnQoKSkgeworICAgICAgICAgICAgZmlyZUxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50LkJFRk9SRV9TVE9SRSk7CisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19QUkVfRkxVU0hFRDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghbG9naWNhbCkKKyAgICAgICAgICAgICAgICBhc3NpZ25PYmplY3RJZChmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuID0gX21ldGEuZ2V0RmllbGRzKCkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGxvZ2ljYWwgfHwgIWFzc2lnbkZpZWxkKGksIHRydWUpKSAmJiAhX2ZsdXNoLmdldChpKQorICAgICAgICAgICAgICAgICAgICAmJiBfZGlydHkuZ2V0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVGaWVsZChfcGMsIF9zaW5nbGUsIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoX3NpbmdsZS5wcmVGbHVzaChsb2dpY2FsLCBjYWxsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGaWVsZChfcGMsIF9zaW5nbGUsIGkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfc2luZ2xlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGNhbGxiYWNrcyBmb3IgZGVsZXRpb24uCisgICAgICovCisgICAgdm9pZCBwcmVEZWxldGUoKSB7CisgICAgICAgIC8vIHNldCBhIGZsYWcgd2hpbGUgY2FsbCBwcmUgZGVsZXRlIGNhbGxiYWNrIHNvIHRoYXQgdXNlciBjYW4ndAorICAgICAgICAvLyBnZXQgaW50byBpbmZpbml0ZSByZWN1cnNpb24gYnkgY2FsbGluZyBkZWxldGUodGhpcykKKyAgICAgICAgLy8gd2l0aGluIGhpcyBjYWxsYmFjayBtZXRob2QKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1BSRV9ERUxFVElORykgPT0gMCkgeworICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfUFJFX0RFTEVUSU5HOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXJlTGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX0RFTEVURSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19QUkVfREVMRVRJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYXNjYWRlIGRlbGV0ZXMgYW5kIGRlcmVmZXJlbmNlIGRlcGVuZGVudCBmaWVsZHMuCisgICAgICovCisgICAgdm9pZCBjYXNjYWRlRGVsZXRlKE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXRDYXNjYWRlRGVsZXRlKCkgIT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX05PTkUKKyAgICAgICAgICAgICAgICB8fCBmbWRzW2ldLmdldEtleSgpLmdldENhc2NhZGVEZWxldGUoKQorICAgICAgICAgICAgICAgICE9IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FCisgICAgICAgICAgICAgICAgfHwgZm1kc1tpXS5nZXRFbGVtZW50KCkuZ2V0Q2FzY2FkZURlbGV0ZSgpCisgICAgICAgICAgICAgICAgIT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBfc2luZ2xlLnN0b3JlT2JqZWN0RmllbGQoaSwgZmV0Y2hGaWVsZChpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIF9zaW5nbGUuZGVsZXRlKGNhbGwpOworICAgICAgICAgICAgICAgIF9zaW5nbGUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBhZnRlciBhbiBpbnN0YW5jZSBpcyBwZXJzaXN0ZWQgYnkgYSB1c2VyIHRocm91Z2ggdGhlIGJyb2tlci4KKyAgICAgKiBDYXNjYWRlcyB0aGUgcGVyc2lzdCBvcGVyYXRpb24gdG8gZmllbGRzIG1hcmtlZAorICAgICAqIHtAbGluayBWYWx1ZU1ldGFEYXRhI0NBU0NBREVfSU1NRURJQVRFfS4KKyAgICAgKi8KKyAgICB2b2lkIGNhc2NhZGVQZXJzaXN0KE9wQ2FsbGJhY2tzIGNhbGwpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXRDYXNjYWRlUGVyc2lzdCgpID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUKKyAgICAgICAgICAgICAgICB8fCBmbWRzW2ldLmdldEtleSgpLmdldENhc2NhZGVQZXJzaXN0KCkKKyAgICAgICAgICAgICAgICA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFCisgICAgICAgICAgICAgICAgfHwgZm1kc1tpXS5nZXRFbGVtZW50KCkuZ2V0Q2FzY2FkZVBlcnNpc3QoKQorICAgICAgICAgICAgICAgID09IFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUpIHsKKyAgICAgICAgICAgICAgICBfc2luZ2xlLnN0b3JlT2JqZWN0RmllbGQoaSwgZmV0Y2hGaWVsZChpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIF9zaW5nbGUucGVyc2lzdChjYWxsKTsKKyAgICAgICAgICAgICAgICBfc2luZ2xlLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBmaWVsZCBzZXQgZnJvbSB0aGUgZGF0YSBzdG9yZSBpbnRvIHRoZSBpbnN0YW5jZS4KKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgZGF0YSBpcyBsb2FkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGxvYWRGaWVsZHMoQml0U2V0IGZpZWxkcywgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLAorICAgICAgICBPYmplY3Qgc2RhdGEsIGJvb2xlYW4gZm9yV3JpdGUpIHsKKyAgICAgICAgLy8gY2FuJ3QgbG9hZCB2ZXJzaW9uIGZpZWxkIGZyb20gc3RvcmUKKyAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIHZmaWVsZCA9IF9tZXRhLmdldFZlcnNpb25GaWVsZCgpOworICAgICAgICAgICAgaWYgKHZmaWVsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpZWxkcy5jbGVhcih2ZmllbGQuZ2V0SW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBzZXRMb2FkaW5nKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaWYgYW55IGZpZWxkcyBnaXZlbiwgbG9hZCB0aGVtCisgICAgICAgICAgICBpbnQgbGVuID0gKGZpZWxkcyA9PSBudWxsKSA/IDAgOiBmaWVsZHMubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChmZXRjaCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmZXRjaCA9IF9icm9rZXIuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKCFfYnJva2VyLmdldFN0b3JlTWFuYWdlcigpLmxvYWQodGhpcywgZmllbGRzLCBmZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgbG9ja0xldmVsLCBzZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKF9sb2MuZ2V0KCJkZWwtaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgX21ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCBfb2lkKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGYWlsZWRPYmplY3QoZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBoYXMgYmVlbiBzZXQ7IHZlcnNpb24gaW5mbyBtdXN0CisgICAgICAgICAgICAvLyBhbHdheXMgYmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBzdGF0ZSBsb2FkIG9yIHNldCAod2hpY2ggaXMgd2h5CisgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGV2ZW4gaWYgbm8gZmllbGRzIHdlcmUgbG9hZGVkIC0tIGNvdWxkIGJlIHRoYXQgdGhpcworICAgICAgICAgICAgLy8gbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBhZnRlciBhIGZpZWxkIGlzIHNldCkuLi4gc29tZSBpbnN0YW5jZXMKKyAgICAgICAgICAgIC8vIG1pZ2h0IG5vdCBoYXZlIHZlcnNpb24gaW5mbywgaW4gd2hpY2ggY2FzZSB0aGlzIGdldHMgY2FsbGVkCisgICAgICAgICAgICAvLyBtdXRpcGxlIHRpbWVzOyB0aGF0IHNob3VsZCBiZSBvayB0b28KKyAgICAgICAgICAgIGlmIChfbG9hZFZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN5bmNWZXJzaW9uKHNkYXRhKTsKKyAgICAgICAgICAgICAgICByZXQgPSByZXQgfHwgX2xvYWRWZXJzaW9uICE9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlZSBpZiB0aGUgZGZnIGlzIG5vdyBsb2FkZWQ7IGRvIHRoaXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlCisgICAgICAgIC8vIGxvYWRlZCBhbnkgZmllbGRzLCBjYXVzZSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gbG9hZGVkIGJ5CisgICAgICAgIC8vIFN0b3JlTWFuYWdlciBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgcG9zdExvYWQoLTEsIGZldGNoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBmaWVsZCdzIGZldGNoIGdyb3VwOyB0aGUgZmllbGQgaXRzZWxmIG1heSBhbHJlYWR5IGJlCisgICAgICogbG9hZGVkIGlmIGl0IGlzIGJlaW5nIHNldCBieSB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkRmllbGQoaW50IGZpZWxkLCBpbnQgbG9ja0xldmVsLCBib29sZWFuIGZvcldyaXRlLAorICAgICAgICBib29sZWFuIGZncykgeworICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2ggPSBfYnJva2VyLmdldEZldGNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgQml0U2V0IGZpZWxkcyA9IG51bGw7CisKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGRmZyBmaWVsZCBvciB3ZSBuZWVkIHRvIGxvYWQgb3VyIGRmZywgZG8gc28KKyAgICAgICAgaWYgKGZncyAmJiAoX2ZsYWdzICYgRkxBR19MT0FERUQpID09IDApCisgICAgICAgICAgICBmaWVsZHMgPSBnZXRVbmxvYWRlZEludGVybmFsKGZldGNoLCBMT0FEX0ZHUywgbnVsbCk7CisgICAgICAgIAorICAgICAgICAvLyBjaGVjayBmb3IgbG9hZCBmZXRjaCBncm91cAorICAgICAgICBTdHJpbmcgbGZnID0gZm1kLmdldExvYWRGZXRjaEdyb3VwKCk7CisgICAgICAgIGJvb2xlYW4gbGZnQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGxmZyAhPSBudWxsKSB7ICAKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGkpICYmIChpID09IGZpZWxkCisgICAgICAgICAgICAgICAgICAgIHx8IGZtZHNbaV0uaXNJbkZldGNoR3JvdXAobGZnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzID0gbmV3IEJpdFNldChmbWRzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5zZXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWxhdGlvbiBmaWVsZCBpcyBsb2FkZWQgd2l0aCB0aGUgbG9hZC1mZXRjaC1ncm91cAorICAgICAgICAgICAgLy8gYnV0IHRoaXMgYWRkaXRpb24gbXVzdCBiZSByZXZlcnRlZCBvbmNlIHRoZSBsb2FkIGlzIG92ZXIKKyAgICAgICAgICAgIGlmICghZmV0Y2guaGFzRmV0Y2hHcm91cChsZmcpKSB7CisgICAgICAgICAgICAgICAgZmV0Y2guYWRkRmV0Y2hHcm91cChsZmcpOworICAgICAgICAgICAgICAgIGxmZ0FkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmbWQuaXNJbkRlZmF1bHRGZXRjaEdyb3VwKCkgJiYgZmllbGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vIGxvYWQgZ3JvdXAgYnV0IGRmZzogYWRkIGRmZyBmaWVsZHMgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5CisgICAgICAgICAgICBmaWVsZHMgPSBnZXRVbmxvYWRlZEludGVybmFsKGZldGNoLCBMT0FEX0ZHUywgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAoIV9sb2FkZWQuZ2V0KGZtZC5nZXRJbmRleCgpKSkgeworICAgICAgICAgICAgLy8gbm8gbG9hZCBncm91cCBvciBkZmc6IGxvYWQgaW5kaXZpZHVhbCBmaWVsZAorICAgICAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgIGZpZWxkcy5zZXQoZm1kLmdldEluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2FsbCB0aGlzIG1ldGhvZCBldmVuIGlmIHRoZXJlIGFyZSBubyB1bmxvYWRlZCBmaWVsZHM7IGxvYWRGaWVsZHMKKyAgICAgICAgLy8gdGFrZXMgY2FyZSBvZiB0aGluZ3MgbGlrZSBsb2FkaW5nIHZlcnNpb24gaW5mbyBhbmQgc2V0dGluZyBQQyBmbGFncworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9hZEZpZWxkcyhmaWVsZHMsIGZldGNoLCBsb2NrTGV2ZWwsIG51bGwsIGZvcldyaXRlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChsZmdBZGRlZCkKKyAgICAgICAgICAgICAgICBmZXRjaC5yZW1vdmVGZXRjaEdyb3VwKGxmZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGdpdmVuIGZpZWxkIG51bWJlciB0byB0aGUgZ2l2ZW4KKyAgICAgKiBmaWVsZCBtYW5hZ2VyLgorICAgICAqLworICAgIHZvaWQgcHJvdmlkZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgRmllbGRNYW5hZ2VyIHN0b3JlLCBpbnQgZmllbGQpIHsKKyAgICAgICAgRmllbGRNYW5hZ2VyIGJlZm9yZUZNID0gX2ZtOworICAgICAgICBfZm0gPSBzdG9yZTsKKyAgICAgICAgcGMucGNQcm92aWRlRmllbGQoZmllbGQpOworICAgICAgICAvLyBSZXRhaW5pbmcgb3JpZ2luYWwgRk0gYmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YgcmVlbnRyYW50IGNhbGxzCisgICAgICAgIF9mbSA9IGJlZm9yZUZNOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVwbGFjZSB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIHRvIHRoZSBnaXZlbgorICAgICAqIGZpZWxkIG1hbmFnZXIuCisgICAgICovCisgICAgdm9pZCByZXBsYWNlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBGaWVsZE1hbmFnZXIgbG9hZCwgaW50IGZpZWxkKSB7CisgICAgICAgIEZpZWxkTWFuYWdlciBiZWZvcmVGTSA9IF9mbTsKKyAgICAgICAgX2ZtID0gbG9hZDsKKyAgICAgICAgcGMucGNSZXBsYWNlRmllbGQoZmllbGQpOworICAgICAgICAvLyBSZXRhaW5pbmcgb3JpZ2luYWwgRk0gYmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YgcmVlbnRyYW50IGNhbGxzCisgICAgICAgIF9mbSA9IGJlZm9yZUZNOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIGZpZWxkIGFzIGxvYWRlZCBvciB1bmxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TG9hZGVkKGludCBmaWVsZCwgYm9vbGVhbiBpc0xvYWRlZCkgeworICAgICAgICAvLyBkb24ndCBjb250aW51ZSBpZiBsb2FkZWQgc3RhdGUgaXMgYWxyZWFkeSBjb3JyZWN0OyBvdGhlcndpc2Ugd2UKKyAgICAgICAgLy8gY2FuIGVuZCB1cCBjbGVhcmluZyBfZmllbGRJbXBsIHdoZW4gd2Ugc2hvdWxkbid0CisgICAgICAgIGlmIChfbG9hZGVkLmdldChmaWVsZCkgPT0gaXNMb2FkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gaWYgbG9hZGluZywgY2xlYXIgaW50ZXJtZWRpYXRlIGRhdGE7IGlmIHVubG9hZGluZywgY2xlYXIgaW1wbCBkYXRhCisgICAgICAgIGlmIChfZmllbGRJbXBsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBfbWV0YS5nZXRFeHRyYUZpZWxkRGF0YUluZGV4KGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChpZHggIT0gLTEpCisgICAgICAgICAgICAgICAgX2ZpZWxkSW1wbFtpZHhdID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvYWRlZCkKKyAgICAgICAgICAgIF9sb2FkZWQuc2V0KGZpZWxkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2xvYWRlZC5jbGVhcihmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBwb3N0LWxvYWQgc3RlcHMsIGluY2x1ZGluZyB0aGUgcG9zdCBsb2FkIGNhbGxiYWNrLgorICAgICAqIFdlIGhhdmUgdG8gY2hlY2sgdGhlIGRmZyBhZnRlciBhbGwgZmllbGQgbG9hZHMgYmVjYXVzZSBpdCBtaWdodCBiZQorICAgICAqIGxvYWRlZCBpbiBtdWx0aXBsZSBzdGVwcyB3aGVuIHBhZ2luZyBpcyBpbnZvbHZlZDsgdGhlIGluaXRpYWwgbG9hZAorICAgICAqIG1pZ2h0IGV4Y2x1ZGUgc29tZSBmaWVsZHMgd2hpY2ggYXJlIHRoZW4gaW1tZWRpYXRlbHkgbG9hZGVkIGluIGEKKyAgICAgKiBzZXBhcmF0ZSBzdGVwIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGUgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgaW5kZXggdGhhdCB3YXMgbG9hZGVkLCBvciAtMSB0byBpbmRpY2F0ZQorICAgICAqIHRoYXQgYSBncm91cCBvZiBwb3NzaWJseSB1bmtub3duIGZpZWxkcyB3YXMgbG9hZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvc3RMb2FkKGludCBmaWVsZCwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIC8vIG5vIG5lZWQgZm9yIHBvc3RMb2FkIGNhbGxiYWNrPworICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfTE9BREVEKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYSBncm91cCBsb2FkLCBhZnRlciB3aGljaCB0aGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICAgIC8vIGNhbGxlZCBhZ2Fpbj8KKyAgICAgICAgaWYgKGZpZWxkICE9IC0xICYmIGlzTG9hZGluZygpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIG5vIGxpc3RlbmVycz8KKyAgICAgICAgTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyIG1nciA9IF9icm9rZXIuZ2V0TGlmZWN5Y2xlRXZlbnRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChtZ3IgPT0gbnVsbCB8fCAhbWdyLmhhc0xvYWRMaXN0ZW5lcnMoZ2V0TWFuYWdlZEluc3RhbmNlKCksIF9tZXRhKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIGZldGNoID0gX2Jyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgLy8gaXMgdGhpcyBmaWVsZCBhIHBvc3QtbG9hZCBmaWVsZD8KKyAgICAgICAgaWYgKGZpZWxkICE9IC0xKSB7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9tZXRhLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChmbWQuaXNJbkRlZmF1bHRGZXRjaEdyb3VwKCkgCisgICAgICAgICAgICAgICAgJiYgZmV0Y2guaGFzRmV0Y2hHcm91cChGZXRjaEdyb3VwLk5BTUVfREVGQVVMVCkKKyAgICAgICAgICAgICAgICAmJiBwb3N0TG9hZChGZXRjaEdyb3VwLk5BTUVfREVGQVVMVCwgZmV0Y2gpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFN0cmluZ1tdIGZncyA9IGZtZC5nZXRDdXN0b21GZXRjaEdyb3VwcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGZldGNoLmhhc0ZldGNoR3JvdXAoZmdzW2ldKSAmJiBwb3N0TG9hZChmZ3NbaV0sIGZldGNoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBmZXRjaC5nZXRGZXRjaEdyb3VwcygpLml0ZXJhdG9yKCk7IAorICAgICAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgaWYgKHBvc3RMb2FkKChTdHJpbmcpIGl0ci5uZXh0KCksIGZldGNoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBwb3N0LWxvYWQgYWN0aW9ucyBpZiB0aGUgZ2l2ZW4gZmV0Y2ggZ3JvdXAgaXMgYSBwb3N0LWxvYWQgZ3JvdXAKKyAgICAgKiBhbmQgaXMgZnVsbHkgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwb3N0TG9hZChTdHJpbmcgZmdOYW1lLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgRmV0Y2hHcm91cCBmZyA9IF9tZXRhLmdldEZldGNoR3JvdXAoZmdOYW1lKTsKKyAgICAgICAgaWYgKGZnID09IG51bGwgfHwgIWZnLmlzUG9zdExvYWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIV9sb2FkZWQuZ2V0KGkpICYmIGZtZHNbaV0uaXNJbkZldGNoR3JvdXAoZmdOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgX2ZsYWdzIHw9IEZMQUdfTE9BREVEOworICAgICAgICBfYnJva2VyLmZpcmVMaWZlY3ljbGVFdmVudChnZXRNYW5hZ2VkSW5zdGFuY2UoKSwgZmV0Y2gsIF9tZXRhLCAKKyAgICAgICAgCUxpZmVjeWNsZUV2ZW50LkFGVEVSX0xPQUQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSBvdXIgdmVyc2lvbiBvYmplY3Qgd2l0aCB0aGUgZGF0YXN0b3JlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzeW5jVmVyc2lvbihPYmplY3Qgc2RhdGEpIHsKKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0U3RvcmVNYW5hZ2VyKCkuc3luY1ZlcnNpb24odGhpcywgc2RhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGluc3RhbmNlIG5lZWRzIGEgdmVyc2lvbiBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25DaGVja1JlcXVpcmVkKCkgeworICAgICAgICAvLyBleHBsaWNpdCBmbGFnIGZvciB2ZXJzaW9uIGNoZWNrCisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19WRVJTSU9OX0NIRUNLKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKCFfYnJva2VyLmdldE9wdGltaXN0aWMoKSAmJiAhX2Jyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRDb21wYXRpYmlsaXR5SW5zdGFuY2UoKS5nZXROb25PcHRpbWlzdGljVmVyc2lvbkNoZWNrKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfc3RhdGUuaXNWZXJzaW9uQ2hlY2tSZXF1aXJlZCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGluc3RhbmNlIHJlcXVpcmVzIGEgdmVyc2lvbiBjaGVjayBvbiB0aGUgbmV4dCBmbHVzaC4KKyAgICAgKi8KKyAgICB2b2lkIHNldENoZWNrVmVyc2lvbihib29sZWFuIHZlcnNpb25DaGVjaykgeworICAgICAgICBpZiAodmVyc2lvbkNoZWNrKQorICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkVSU0lPTl9DSEVDSzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1ZFUlNJT05fQ0hFQ0s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgbmVlZHMgYSB2ZXJzaW9uIHVwZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25VcGRhdGVSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX1ZFUlNJT05fVVBEQVRFKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyBpbnN0YW5jZSByZXF1aXJlcyBhIHZlcnNpb24gdXBkYXRlIG9uIHRoZSBuZXh0IGZsdXNoLgorICAgICAqLworICAgIHZvaWQgc2V0VXBkYXRlVmVyc2lvbihib29sZWFuIHZlcnNpb25VcGRhdGUpIHsKKyAgICAgICAgaWYgKHZlcnNpb25VcGRhdGUpCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19WRVJTSU9OX1VQREFURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1ZFUlNJT05fVVBEQVRFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGJhc2VkIG9uIHRoZSBicm9rZXIncyBpbXBsaWNpdCBiZWhhdmlvci4KKyAgICAgKiBUcmFuc2xhdGlvbiBvbmx5IG9jY3VycyBpZiB0aGUgZXhjZXB0aW9uIGlzIGluaXRpYXRlZCBieSBhIHVzZXIgYWN0aW9uCisgICAgICogb24gYW4gaW5zdGFuY2UsIGFuZCB0aGVyZWZvcmUgd2lsbCBub3QgYmUgY2F1Z2h0IGFuZCB0cmFuc2xhdGVkIGJ5IHRoZQorICAgICAqIGJyb2tlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiB0cmFuc2xhdGUoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvciB0cmFucyA9IF9icm9rZXIuCisgICAgICAgICAgICBnZXRJbnN0YW5jZUV4Y2VwdGlvblRyYW5zbGF0b3IoKTsKKyAgICAgICAgcmV0dXJuICh0cmFucyA9PSBudWxsKSA/IHJlIDogdHJhbnMudHJhbnNsYXRlKHJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NrIHRoZSBzdGF0ZSBtYW5hZ2VyIGlmIHRoZSBtdWx0aXRocmVhZGVkIG9wdGlvbiBpcyBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9jaygpIHsKKyAgICAgICAgLy8gdXNlIGJyb2tlci1sZXZlbCBsb2NrIHRvIGF2b2lkIGRlYWRsb2NrIHNpdHVhdGlvbnMgd2l0aCB0aGUgc3RhdGUKKyAgICAgICAgLy8gbWFuYWdlciBsb2NrIGFuZCBicm9rZXIgbG9jayBiZWluZyBvYnRhaW5lZCBpbiBkaWZmZXJlbnQgb3JkZXJzCisgICAgICAgIF9icm9rZXIubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVubG9jayB0aGUgc3RhdGUgbWFuYWdlci4KKyAgICAgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1bmxvY2sgKCkKKwl7CisJCS8vIHVzZSBicm9rZXItbGV2ZWwgbG9jayB0byBhdm9pZCBkZWFkbG9jayBzaXR1YXRpb25zIHdpdGggdGhlIHN0YXRlIAorCQkvLyBtYW5hZ2VyIGxvY2sgYW5kIGJyb2tlciBsb2NrIGJlaW5nIG9idGFpbmVkIGluIGRpZmZlcmVudCBvcmRlcnMKKwkJX2Jyb2tlci51bmxvY2sgKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RvcmVDb250ZXh0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TdG9yZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODZiZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RvcmVDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2V0IG9mIG1hbmFnZWQgb2JqZWN0cyBhbmQgdGhlaXIgZW52aXJvbm1lbnQuCisgKgorICogQHNpbmNlIDAuNC4wCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b3JlQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBNYXJrZXIgYml0c2V0IHRvIGluZGljYXRlIHRoYXQgYWxsIGZpZWxkIGxvYWRzIHNob3VsZCBiZSBleGNsdWRlZCBpbgorICAgICAqIHRoZSA8Y29kZT5maW5kPC9jb2RlPiBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEVYQ0xVREVfQUxMID0gbmV3IEJpdFNldCgwKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9JRF9OT1ZBTElEQVRFID0gMiA8PCAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9JRF9OT0RFTEVURUQgPSAyIDw8IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0lEX0NPUFkgPSAyIDw8IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0lEX0FMTE9XX05FVyA9IDIgPDwgMzsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnJva2VyIGZvciB0aGlzIGNvbnRleHQsIGlmIHBvc3NpYmxlLiBOb3RlIHRoYXQgYSBicm9rZXIKKyAgICAgKiB3aWxsIGJlIHVuYXZhaWxhYmxlIGluIHJlbW90ZSBjb250ZXh0cywgYW5kIHRoaXMgbWV0aG9kIG1heSB0aHJvdworICAgICAqIGFuIGV4Y2VwdGlvbiB0byB0aGF0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnJva2VyIGdldEJyb2tlcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgKG11dGFibGUpIGZldGNoIGNvbmZpZ3VyYXRpb24gZm9yIGxvYWRpbmcgb2JqZWN0cyBmcm9tIHRoaXMKKyAgICAgKiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaENvbmZpZ3VyYXRpb24gZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY2xhc3MgbG9hZGVyIGF0IHRoZSB0aW1lIHRoaXMgY29udGV4dAorICAgICAqIHdhcyBvYnRhaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jayBtYW5hZ2VyIGluIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9ja01hbmFnZXIgZ2V0TG9ja01hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RvcmUgbWFuYWdlciBpbiB1c2UuIFRoaXMgd2lsbCBiZSBhIHdyYXBwZXIgYXJvdW5kIHRoZQorICAgICAqIG5hdGl2ZSBzdG9yZSBtYW5hZ2VyLCB3aGljaCB5b3UgY2FuIHJldHJpZXZlIHZpYQorICAgICAqIHtAbGluayBEZWxlZ2F0aW5nU3RvcmVNYW5hZ2VyI2dldElubmVybW9zdERlbGVnYXRlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ1N0b3JlTWFuYWdlciBnZXRTdG9yZU1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVXNlck5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBvaWQvb2JqZWN0LCBvciBudWxsIGlmIG5vdAorICAgICAqIGNhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvaWQgdGhlIG9iamVjdCdzIGlkCisgICAgICogQHJldHVybiB0aGUgY2FjaGVkIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgY2FjaGVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBmaW5kQ2FjaGVkKE9iamVjdCBvaWQsIEZpbmRDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBwZXJzaXN0ZW5jZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2lkLiBJZgorICAgICAqIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiBpcyB0cnVlLCB0aGUgYnJva2VyIHdpbGwgY2hlY2sgdGhlIHN0b3JlCisgICAgICogZm9yIHRoZSBvYmplY3QsIGFuZCByZXR1cm4gbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC4gSWYKKyAgICAgKiA8Y29kZT52YWxpZGF0ZTwvY29kZT4gaXMgZmFsc2UsIHRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbC4gVGhlCisgICAgICogYnJva2VyIHdpbGwgZWl0aGVyIHJldHVybiBpdHMgY2FjaGVkIGluc3RhbmNlLCBhdHRlbXB0IHRvIGNyZWF0ZSBhCisgICAgICogaG9sbG93IGluc3RhbmNlLCBvciB0aHJvdyBhbiA8Y29kZT5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjwvY29kZT4gaWYKKyAgICAgKiB1bmFibGUgdG8gcmV0dXJuIGEgaG9sbG93IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbGlkYXRlIGlmIHRydWUsIHZhbGlkYXRlIHRoYXQgdGhlIGluc3RhbmNlIGV4aXN0cyBpbiB0aGUKKyAgICAgKiBzdG9yZSBhbmQgbG9hZCBmZXRjaCBncm91cCBmaWVsZHMsIG90aGVyd2lzZSByZXR1cm4KKyAgICAgKiBhbnkgY2FjaGVkIG9yIGhvbGxvdyBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZmluZChPYmplY3Qgb2lkLCBib29sZWFuIHZhbGlkYXRlLCBGaW5kQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3RzIHdpdGggdGhlIGdpdmVuIG9pZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2lkcyB0aGUgb2lkcyBvZiB0aGUgb2JqZWN0cyB0byByZXR1cm4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3RzIHRoYXQgd2VyZSBsb29rZWQgdXAsIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBvaWRzCisgICAgICogcGFyYW1ldGVyCisgICAgICogQHNlZSAjZmluZChPYmplY3QsYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZmluZEFsbChDb2xsZWN0aW9uIG9pZHMsIGJvb2xlYW4gdmFsaWRhdGUsCisgICAgICAgIEZpbmRDYWxsYmFja3MgY2FsbCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBvaWQuIElmIHByZXNlbnQsIHRoZQorICAgICAqIGNhY2hlZCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBpbnN0YW5jZSB3aWxsIGJlCisgICAgICogaW5pdGlhbGl6ZWQgdGhyb3VnaCB0aGUgc3RvcmUgYXMgdXN1YWw7IGhvd2V2ZXIsIGluIHRoaXMgY2FzZQorICAgICAqIHRoZSBzdG9yZSB3aWxsIGJlIHBhc3NlZCB0aGUgZ2l2ZW4gZXhlY3V0aW9uIGRhdGEsIGFuZCB0aGUKKyAgICAgKiBzeXN0ZW0gd2lsbCBsb2FkIHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBmZXRjaCBjb25maWd1cmF0aWlvbgorICAgICAqIChvciB0aGUgY29udGV4dCdzIGNvbmZpZ3VyYXRpb24sIGlmIHRoZSBnaXZlbiBvbmUgaXMgbnVsbCkuCisgICAgICogRmllbGRzIGNhbiBvcHRpb25hbGx5IGJlIGV4Y2x1ZGVkIGZyb20gcmVxdWlyZWQgbG9hZGluZyB1c2luZyB0aGUKKyAgICAgKiA8Y29kZT5leGNsdWRlPC9jb2RlPiBtYXNrLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGZpbmQgbmV3CisgICAgICogdW5mbHVzaGVkIGluc3RhbmNlcywgdmFsaWRhdGVzLCBhbmQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogaWYgYSBjYWNoZWQgaW5zdGFuY2UgaGFzIGJlZW4gZGVsZXRlZCBjb25jdXJyZW50bHkuIFRoZXNlIG9wdGlvbnMKKyAgICAgKiBhcmUgY29udHJvbGxhYmxlIHRocm91Z2ggdGhlIGdpdmVuIDxjb2RlPk9JRF9YWFg8L2NvZGU+IGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZmluZChPYmplY3Qgb2lkLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIEJpdFNldCBleGNsdWRlLAorICAgICAgICBPYmplY3QgZWRhdGEsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdHMgd2l0aCB0aGUgZ2l2ZW4gb2lkcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2ZpbmQoT2JqZWN0LEZldGNoQ29uZmlndXJhdGlvbixCaXRTZXQsT2JqZWN0LGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZmluZEFsbChDb2xsZWN0aW9uIG9pZHMsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwKKyAgICAgICAgQml0U2V0IGV4Y2x1ZGUsIE9iamVjdCBlZGF0YSwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGdpdmVuIHR5cGUuIFRoZSBpdGVyYXRvcgorICAgICAqIHNob3VsZCBiZSBjbG9zZWQgd2l0aCB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlciNjbG9zZX0gCisgICAgICogd2hlbiBubyBsb25nZXIgbmVlZGVkLiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gCisgICAgICoge0BsaW5rIFN0b3JlTWFuYWdlciNleGVjdXRlRXh0ZW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW50SXRlcmF0b3IoQ2xhc3MgY2xzLCBib29sZWFuIHN1YnMsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgYm9vbGVhbiBpZ25vcmVDaGFuZ2VzKTsKKworICAgIC8qKgorICAgICAqIEltbWVkaWF0ZWx5IGxvYWQgdGhlIGdpdmVuIG9iamVjdCdzIHBlcnNpc3RlbnQgZmllbGRzLiBPbmUgbWlnaHQKKyAgICAgKiB1c2UgdGhpcyBhY3Rpb24gdG8gbWFrZSBzdXJlIHRoYXQgYW4gaW5zdGFuY2UncyBmaWVsZHMgYXJlIGxvYWRlZAorICAgICAqIGJlZm9yZSB0cmFuc2l0aW9uaW5nIGl0IHRvIHRyYW5zaWVudC4gTm90ZSB0aGF0IHRoaXMgYWN0aW9uIGlzIG5vdAorICAgICAqIHJlY3Vyc2l2ZS4gQW55IHJlbGF0ZWQgb2JqZWN0cyB0aGF0IGFyZSBsb2FkZWQgd2lsbCBub3QgbmVjZXNzYXJpbHkKKyAgICAgKiBoYXZlIHRoZWlyIGZpZWxkcyBsb2FkZWQuIFVubWFuYWdlZCB0YXJnZXQgaXMgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZ09ubHkgaW5kaWNhdG9yIGFzIHRvIHdoZXRoZXIgdG8gcmV0cmlldmUgb25seSBmaWVsZHMKKyAgICAgKiBpbiB0aGUgY3VycmVudCBmZXRjaCBncm91cHMsIG9yIGFsbCBmaWVsZHMKKyAgICAgKiBAc2VlICNyZXRyaWV2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlKE9iamVjdCBwYywgYm9vbGVhbiBmZ09ubHksIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGdpdmVuIG9iamVjdHMnIHBlcnNpc3RlbnQgc3RhdGUuIFVubWFuYWdlZCB0YXJnZXRzIGFyZQorICAgICAqIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmdPbmx5IGluZGljYXRvciBhcyB0byB3aGV0aGVyIHRvIHJldHJpZXZlIG9ubHkgZmllbGRzCisgICAgICogQHNlZSAjcmV0cmlldmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXRyaWV2ZUFsbChDb2xsZWN0aW9uIG9ianMsIGJvb2xlYW4gZmdPbmx5LCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIGluc3RhbmNlIGVtYmVkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiB0aGUgaW5zdGFuY2UgdG8gZW1iZWQ7IG1heSBiZSBudWxsIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gZ2l2ZSB0aGUgZW1iZWRkZWQgc3RhdGUgbWFuYWdlcjsgbWF5IGJlCisgICAgICogbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duaW5nIHN0YXRlIG1hbmFnZXIKKyAgICAgKiBAcGFyYW0gb3duZXJNZXRhIHRoZSB2YWx1ZSBpbiB3aGljaCB0aGUgb2JqZWN0IGlzIGVtYmVkZGVkCisgICAgICogQHJldHVybiB0aGUgc3RhdGUgbWFuYWdlciBmb3IgdGhlIGVtYmVkZGVkIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFTdGF0ZU1hbmFnZXIgZW1iZWQoT2JqZWN0IG9iaiwgT2JqZWN0IGlkLAorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIG93bmVyLCBWYWx1ZU1ldGFEYXRhIG93bmVyTWV0YSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2F0aW9uIG9yIGRhdGFzdG9yZSBpZGVudGl0eSBjbGFzcyB0aGUgZ2l2ZW4gcGVyc2lzdGVudAorICAgICAqIGNsYXNzIHVzZXMgZm9yIG9iamVjdCBpZHMuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldE9iamVjdElkVHlwZShDbGFzcyBjbHMpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IG9iamVjdCBpZCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHMgdGhlIHBlcnNpdGVudCBjbGFzcyB0aGF0IHVzZXMgdGhpcyBpZGVudGl0eSB2YWx1ZQorICAgICAqIEBwYXJhbSB2YWwgYW4gb2JqZWN0IGlkIGluc3RhbmNlLCBzdHJpbmdpZmllZCBvYmplY3QgaWQsIG9yIHByaW1hcnkKKyAgICAgKiBrZXkgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IG5ld09iamVjdElkKENsYXNzIGNscywgT2JqZWN0IHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgcGVyc2lzdGVudCBpbiB0aGUgY3VycmVudAorICAgICAqIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy40CisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UGVyc2lzdGVkVHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCBpbiB0aGUgY3VycmVudAorICAgICAqIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy40CisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGVsZXRlZFR5cGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjbGFzc2VzIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkCisgICAgICogaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRVcGRhdGVkVHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIG1hbmFnZWQgaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1hbmFnZWRPYmplY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGN1cnJlbnQgdHJhbnNhY3Rpb24gaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFRyYW5zYWN0aW9uYWxPYmplY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGluc3RhbmNlcyB3aGljaCB3aWxsIGJlY29tZSB0cmFuc2FjdGlvbmFsIHVwb24KKyAgICAgKiB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQZW5kaW5nVHJhbnNhY3Rpb25hbE9iamVjdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgY3VycmVudCBkaXJ0eSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGlydHlPYmplY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIG1haW50YWluIHRoZSBvcmRlciBpbiB3aGljaCBvYmplY3RzIGFyZSBkaXJ0aWVkIGZvcgorICAgICAqIHtAbGluayAjZ2V0RGlydHlPYmplY3RzfS4gRGVmYXVsdCBpcyB0aGUgc3RvcmUgbWFuYWdlcidzIGRlY2lzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9yZGVyRGlydHlPYmplY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIG1haW50YWluIHRoZSBvcmRlciBpbiB3aGljaCBvYmplY3RzIGFyZSBkaXJ0aWVkIGZvcgorICAgICAqIHtAbGluayAjZ2V0RGlydHlPYmplY3RzfS4gRGVmYXVsdCBpcyB0aGUgc3RvcmUgbWFuYWdlcidzIGRlY2lzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyRGlydHlPYmplY3RzKGJvb2xlYW4gb3JkZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0ZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuIEluY2x1ZGVzIG9iamVjdHMKKyAgICAgKiBtYWRlIHBlcnNpc3RlbnQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIElmIDxjb2RlPm9iajwvY29kZT4gaXMgbm90CisgICAgICogYSBtYW5hZ2VkIHR5cGUgb3IgaXMgbWFuYWdlZCBieSBhbm90aGVyIGNvbnRleHQsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRTdGF0ZU1hbmFnZXIoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2sgbGV2ZWwgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMb2NrTGV2ZWwoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZlcnNpb24gaW5kaWNhdG9yIGZvciA8Y29kZT5vPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZlcnNpb24oT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGRpcnR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIHRyYW5zYWN0aW9uYWwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2FjdGlvbmFsKE9iamVjdCBvYmopOworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgZ2l2ZW4gb2JqZWN0IHRyYW5zYWN0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgaW5zdGFuY2UgdG8gbWFrZSB0cmFuc2FjdGlvbmFsCisgICAgICogQHBhcmFtIHVwZGF0ZVZlcnNpb24gaWYgdHJ1ZSwgdGhlIGluc3RhbmNlJ3MgdmVyc2lvbiB3aWxsIGJlCisgICAgICogaW5jcmVtZW50ZWQgYXQgdGhlIG5leHQgZmx1c2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsKE9iamVjdCBwYywgYm9vbGVhbiB1cGRhdGVWZXJzaW9uLAorICAgICAgICBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIG9iamVjdHMgdHJhbnNhY3Rpb25hbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpzIGluc3RhbmNlcyB0byBtYWtlIHRyYW5zYWN0aW9uYWwKKyAgICAgKiBAcGFyYW0gdXBkYXRlVmVyc2lvbiBpZiB0cnVlLCB0aGUgaW5zdGFuY2UncyB2ZXJzaW9uIHdpbGwgYmUKKyAgICAgKiBpbmNyZW1lbnRlZCBhdCB0aGUgbmV4dCBmbHVzaAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0aW9uYWxBbGwoQ29sbGVjdGlvbiBvYmpzLCBib29sZWFuIHVwZGF0ZVZlcnNpb24sCisgICAgICAgIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgZ2l2ZW4gb2JqZWN0IG5vbnRyYW5zYWN0aW9uYWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm9udHJhbnNhY3Rpb25hbChPYmplY3QgcGMsIE9wQ2FsbGJhY2tzIGNhbGwpOworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgZ2l2ZW4gb2JqZWN0cyBub250cmFuc2FjdGlvbmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vbnRyYW5zYWN0aW9uYWxBbGwoQ29sbGVjdGlvbiBvYmpzLCBPcENhbGxiYWNrcyBjYWxsKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgcGVyc2lzdGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSByZWdpc3RlcmVkCisgICAgICogd2l0aCA8Y29kZT5icm9rZXI8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KE9iamVjdCBvYmopOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBkZWxldGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2lkIG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdElkKE9iamVjdCBvYmopOworCisgICAgLyoqCisgICAgICogRGV0YWNoIG1vZGUgY29uc3RhbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyBhcmUgcGFydCBvZiB0aGUKKyAgICAgKiBkZXRhY2hlZCBncmFwaC4gRGVmYXVsdHMgdG8ge0BsaW5rIERldGFjaFN0YXRlI0RFVEFDSF9MT0FERUR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGV0YWNoU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIERldGFjaCBtb2RlIGNvbnN0YW50IHRvIGRldGVybWluZSB3aGljaCBmaWVsZHMgYXJlIHBhcnQgb2YgdGhlCisgICAgICogZGV0YWNoZWQgZ3JhcGguIERlZmF1bHRzIHRvIHtAbGluayBEZXRhY2hTdGF0ZSNERVRBQ0hfTE9BREVEfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hTdGF0ZShpbnQgbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9iamVjdHMgYWNjZXNzZWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiBzdG9yZSBjYWNoZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuNAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFBvcHVsYXRlRGF0YUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBvcHVsYXRlIHRoZSBzdG9yZSBjYWNoZSB3aXRoIG9iamVjdHMgdXNlZCBieSB0aGlzCisgICAgICogdHJhbnNhY3Rpb24uIERlZmF1bHRzIHRvIHRydWUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3B1bGF0ZURhdGFDYWNoZShib29sZWFuIGNhY2hlKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgbWVtb3J5IHVzYWdlIGlzIHJlZHVjZWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24gYXQgdGhlIGV4cGVuc2UKKyAgICAgKiBvZiBwb3NzaWJseSBtb3JlIGFnZ3Jlc3NpdmUgZGF0YSBjYWNoZSBldmljdGlvbnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhcmdlVHJhbnNhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIElmIGEgbGFyZ2UgbnVtYmVyIG9mIG9iamVjdHMgd2lsbCBiZSBjcmVhdGVkLCBtb2RpZmllZCwgb3IgZGVsZXRlZAorICAgICAqIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gdHJ1ZSB3aWxsIHJlZHVjZSBtZW1vcnkKKyAgICAgKiB1c2FnZSBpZiB5b3UgcGVyZm9ybSBwZXJpb2RpYyBmbHVzaGVzLiBVcG9uIHRyYW5zYWN0aW9uIGNvbW1pdCB0aGUKKyAgICAgKiBkYXRhIGNhY2hlIHdpbGwgaGF2ZSB0byBtb3JlIGFnZ3Jlc3NpdmVseSBmbHVzaCBvYmplY3RzLiBUaGUgc3RvcmUgY2FjaGUKKyAgICAgKiB3aWxsIGhhdmUgdG8gZmx1c2ggaW5zdGFuY2VzIG9mIG9iamVjdHMgZm9yIGVhY2ggY2xhc3Mgb2Ygb2JqZWN0CisgICAgICogbW9kaWZpZWQgZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi4gQSBzaWRlIGJlbmVmaXQgb2YgbGFyZ2UgdHJhbnNhY3Rpb24KKyAgICAgKiBtb2RlIGlzIHRoYXQgc21hbGxlciB1cGRhdGUgbWVzc2FnZXMgY2FuIGJlIHVzZWQgZm9yCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRFdmVudH1zLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuNAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhcmdlVHJhbnNhY3Rpb24oYm9vbGVhbiBsYXJnZVRyYW5zYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBjb250ZXh0IGlzIHVzaW5nIG1hbmFnZWQgdHJhbnNhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWFuYWdlZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBhIGxvZ2ljYWwgdHJhbnNhY3Rpb24gaXMgYWN0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGEgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdG9yZUFjdGl2ZSgpOworCisgICAgLyoqCisgICAgICogQmVnaW4gYSBkYXRhIHN0b3JlIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luU3RvcmUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGJyb2tlciBoYXMgYSBkZWRpY2F0ZWQgY29ubmVjdGlvbiBiYXNlZCBvbiB0aGUgY29uZmlndXJlZAorICAgICAqIGNvbm5lY3Rpb24gcmV0YWluIG1vZGUgYW5kIHRyYW5zYWN0aW9uIHN0YXR1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gaW4gdXNlIGJ5IHRoZSBjb250ZXh0LCBvciBhIG5ldyBjb25uZWN0aW9uIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZXMgb24gYW4gaW50ZXJuYWwgbG9jayBpZiB0aGUKKyAgICAgKiA8Y29kZT5NdWx0aXRocmVhZGVkPC9jb2RlPiBmbGFnIGlzIHNldCB0byB0cnVlLiBNYWtlIHN1cmUgdG8gY2FsbAorCSAqIHtAbGluayAjdW5sb2NrfSBpbiBhIGZpbmFsbHkgY2xhdXNlIG9mIHRoZSBzYW1lIG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2NrICgpOworCisJLyoqCisJICogUmVsZWFzZXMgdGhlIGludGVybmFsIGxvY2suCisJICovCisJcHVibGljIHZvaWQgdW5sb2NrICgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RvcmVNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TdG9yZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmIwMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RvcmVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGRhdGEgc3RvcmUgbWVjaGFuaXNtcyB0byBpbnRlcmFjdCB3aXRoCisgKiB0aGlzIHJ1bnRpbWUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBTdG9yZU1hbmFnZXIKKyAgICBleHRlbmRzIENsb3NlYWJsZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0xBVEVSID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0VBUkxJRVIgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU0FNRSA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9ESUZGRVJFTlQgPSA0OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SQ0VfTE9BRF9OT05FID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JDRV9MT0FEX0RGRyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SQ0VfTE9BRF9SRUZSRVNIID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JDRV9MT0FEX0FMTCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGV4dC4gVGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHN0b3JlIG1hbmFnZXIgaXMgdXNlZC4gVGhlIHN0b3JlIG1hbmFnZXIKKyAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgcHVsbGluZyBhbnkgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZQorICAgICAqIGNvbnRleHQsIGluY2x1ZGluZyB0aGUgdHJhbnNhY3Rpb24gbW9kZSBhbmQgY29ubmVjdGlvbiByZXRhaW4gbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0b3JlQ29udGV4dCBjdHgpOworCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHRoYXQgYW4gb3B0aW1pc3RpYyB0cmFuc2FjdGlvbiBoYXMgc3RhcnRlZC4gVGhpcyBtZXRob2QKKyAgICAgKiBkb2VzIG5vdCByZXBsYWNlIHRoZSB7QGxpbmsgI2JlZ2lufSBtZXRob2QsIHdoaWNoIHdpbGwgc3RpbGwgYmUgY2FsbGVkCisgICAgICogd2hlbiBhIHRydWUgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbiBzaG91bGQgYmVnaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5PcHRpbWlzdGljKCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBvcHRpbWlzdGljIHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjayBiZWZvcmUKKyAgICAgKiBhIGRhdGEgc3RvcmUgdHJhbnNhY3Rpb24gZXZlciBiZWdhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByb2xsYmFja09wdGltaXN0aWMoKTsKKworICAgIC8qKgorICAgICAqIEJlZ2luIGEgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbi4gQWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLAorICAgICAqIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgZnVydGhlciBvcGVyYXRpb25zIGFyZSBvcGVyYXRpbmcgaW4gYSBzaW5nbGUKKyAgICAgKiB0cmFuc2FjdGlvbiB0aGF0IGNhbiBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIElmIG9wdGltaXN0aWMKKyAgICAgKiB0cmFuc2FjdGlvbnMgYXJlIGluIHVzZSwgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZQorICAgICAqIHN5c3RlbSByZXF1aXJlcyBhIHRyYW5zYWN0aW9uYWxseSBjb25zaXN0ZW50IGNvbm5lY3Rpb24gZHVlIHRvIGEKKyAgICAgKiB1c2VyIHJlcXVlc3QgdG8gZmx1c2ggb3IgY29tbWl0IHRoZSB0cmFuc2FjdGlvbi4gSW4gdGhpcyBjYXNlLCBpdAorICAgICAqIGlzIHBvc3NpYmxlIHRoYXQgdGhlIG9wdGltaXN0aWMgdHJhbnNhY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgbGF0ZXN0CisgICAgICogdmVyc2lvbnMgb2YgYWxsIGluc3RhbmNlcyAoaS5lLiBhbm90aGVyIHRyYW5zYWN0aW9uIGhhcyBtb2RpZmllZCB0aGUKKyAgICAgKiBzYW1lIGluc3RhbmNlcyBhbmQgY29tbWl0dGVkIHNpbmNlIHRoZSBvcHRpbWlzdGljIHRyYW5zYWN0aW9uIHN0YXJ0ZWQpLgorICAgICAqIE9uIGNvbW1pdCwgYW4gZXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIG9uIGFueSBhdHRlbXB0IHRvIG92ZXJ3cml0ZQorICAgICAqIGRhdGEgZm9yIGFuIGluc3RhbmNlIHdpdGggYW4gb2xkZXIgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjIuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luKCk7CisKKyAgICAvKioKKyAgICAgKiBDb21taXQgdGhlIGN1cnJlbnQgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKTsKKworICAgIC8qKgorICAgICAqIFJvbGxiYWNrIHRoZSBjdXJyZW50IGRhdGEgc3RvcmUgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKTsKKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBpbnN0YW5jZSBleGlzdHMgaW4gdGhlIGRhdGEgc3RvcmU7IHJldHVybiBmYWxzZQorICAgICAqIGlmIGl0IGRvZXMgbm90LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cyhPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBPYmplY3QgZWRhdGEpOworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyIHRvIHRoZQorICAgICAqIHZlcnNpb24gc3RvcmVkIGluIHRoZSBkYXRhIHN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHNtIHRoZSBpbnN0YW5jZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBlZGF0YSB0aGUgY3VycmVudCBleGVjdXRpb24gZGF0YSwgb3IgbnVsbCBpZiBub3QKKyAgICAgKiBnaXZlbiB0byB0aGUgY2FsbGluZyBtZXRob2Qgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGluc3RhbmNlIHN0aWxsIGV4aXN0cyBpbiB0aGUKKyAgICAgKiBkYXRhc3RvcmUgYW5kIGlzIHVwLXRvLWRhdGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNWZXJzaW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIE9iamVjdCBlZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLiBUaGUgb2JqZWN0IGlkIG9mIHRoZQorICAgICAqIHN0YXRlIG1hbmFnZXIgd2lsbCBiZSBzZXQsIGFuZCB0aGUgc3RhdGUgbWFuYWdlcidzIG1ldGFkYXRhIGJlIHNldCB0bworICAgICAqIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2UgdG8gbG9hZCwgb3IgcG9zc2libHkgb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCisgICAgICogSW5pdGlhbGl6YXRpb24gaW52b2x2ZXMgZmlyc3QgY2FsbGluZyB0aGUKKyAgICAgKiB7QGxpbmsgT3BlbkpQQVN0YXRlTWFuYWdlciNpbml0aWFsaXplfSBtZXRob2Qgd2l0aAorICAgICAqIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb3JyZWN0IHR5cGUgY29uc3RydWN0ZWQgd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENSZWdpc3RyeSNuZXdJbnN0YW5jZShDbGFzcywKKyAgICAgKiBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5TdGF0ZU1hbmFnZXIsIGJvb2xlYW4pfSBtZXRob2QKKyAgICAgKiAodGhpcyB3aWxsIHJlc2V0IHRoZSBzdGF0ZSBtYW5hZ2VyJ3MgbWV0YWRhdGEgaWYgdGhlIGFjdHVhbCB0eXBlIHdhcyBhCisgICAgICogc3ViY2xhc3MpLiBBZnRlciBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiwgbG9hZCBhbnkgdGhlIGZpZWxkcyBmb3IgdGhlCisgICAgICogZ2l2ZW4gZmV0Y2ggY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSByZXRyaWV2ZWQuIElmIGFueSBvZgorICAgICAqIHRoZSBjb25maWd1cmVkIGZpZWxkcyBhcmUgbm90IGxvYWRlZCBpbiB0aGlzIG1ldGhvZCwgdGhleSB3aWxsIGJlCisgICAgICogbG9hZGVkIHdpdGggYSBzdWJzZXF1ZW50IGNhbGwgdG8ge0BsaW5rICNsb2FkfS4gSWYgdGhpcyBtZXRob2QgaXMKKyAgICAgKiBjYWxsZWQgZHVyaW5nIGEgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbiwgdGhlIGluc3RhbmNlJ3MgZGF0YWJhc2UgcmVjb3JkCisgICAgICogc2hvdWxkIGJlIGxvY2tlZC4gVmVyc2lvbiBpbmZvcm1hdGlvbiBjYW4gYmUgbG9hZGVkIGlmIGRlc2lyZWQgdGhyb3VnaAorICAgICAqIHRoZSB7QGxpbmsgT3BlbkpQQVN0YXRlTWFuYWdlciNzZXRWZXJzaW9ufSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc20gdGhlIGluc3RhbmNlIHRvIGluaXRpYWxpemUKKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIGxpZmVjeWNsZSBzdGF0ZSB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSBtYW5hZ2VyIHdpdGgKKyAgICAgKiBAcGFyYW0gZmV0Y2ggY29uZmlndXJhdGlvbiBmb3IgaG93IHRvIGxvYWQgdGhlIGluc3RhbmNlCisgICAgICogQHBhcmFtIGVkYXRhIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBkYXRhLCBvciBudWxsIGlmIG5vdAorICAgICAqIGdpdmVuIHRvIHRoZSBjYWxsaW5nIG1ldGhvZCBvZiB0aGUgYnJva2VyCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXRjaGluZyBpbnN0YW5jZSBleGlzdHMgaW4gdGhlIGRhdGEKKyAgICAgKiBzdG9yZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaW5pdGlhbGl6ZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBQQ1N0YXRlIHN0YXRlLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIE9iamVjdCBlZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqIE5vdGUgdGhhdCBhbnkgY29sbGVjdGlvbiBvciBtYXAgdHlwZXMgbG9hZGVkIGludG8gdGhlIHN0YXRlIG1hbmFnZXIKKyAgICAgKiB3aWxsIGJlIHByb3hpZWQgd2l0aCB0aGUgY29ycmVjdCB0eXBlOyB0aGVyZWZvcmUgdGhlIHN0b3JlIG1hbmFnZXIKKyAgICAgKiBkb2VzIG5vdCBoYXZlIHRvIGxvYWQgdGhlIHNhbWUgY29uY3JldGUgY29sbGVjdGlvbi9tYXAgdHlwZXMgYXMgdGhlCisgICAgICogaW5zdGFuY2UgZGVjbGFyZXMuIEhvd2V2ZXIsIGFycmF5IHR5cGVzIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZQorICAgICAqIGFycmF5IHR5cGUgc3RvcmVkIGJ5IHRoZSBwZXJzaXN0ZW5jZSBjYXBhYmxlIGluc3RhbmNlLiBJZiB0aGlzIG1ldGhvZAorICAgICAqIGlzIGNhbGxlZCBkdXJpbmcgYSBkYXRhIHN0b3JlIHRyYW5zYWN0aW9uLCB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCisgICAgICogbG9ja2VkLiBJZiB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlciBkb2VzIG5vdCBoYXZlIGl0cyB2ZXJzaW9uIHNldAorICAgICAqIGFscmVhZHksIHZlcnNpb24gaW5mb3JtYXRpb24gY2FuIGJlIGxvYWRlZCBpZiBkZXNpcmVkIHRocm91Z2ggdGhlCisgICAgICoge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXIjc2V0VmVyc2lvbn0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHNtIHRoZSBpbnN0YW5jZSB0byBsb2FkCisgICAgICogQHBhcmFtIGZpZWxkcyBzZXQgb2YgZmllbGRzIHRvIGxvYWQ7IGFsbCBmaWVsZCBpbmRleGVzIGluIHRoaXMKKyAgICAgKiBzZXQgbXVzdCBiZSBsb2FkZWQ7IHRoaXMgc2V0IGlzIG11dGFibGUKKyAgICAgKiBAcGFyYW0gZmV0Y2ggdGhlIGZldGNoIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gbG9hZGluZworICAgICAqIHJlbGF0ZWQgb2JqZWN0cworICAgICAqIEBwYXJhbSBsb2NrTGV2ZWwgYXR0ZW1wdCB0byBsb2FkIHNpbXBsZSBmaWVsZHMgYXQgdGhpcyBsb2NrIGxldmVsOworICAgICAqIHJlbGF0aW9ucyBzaG91bGQgYmUgbG9hZGVkIGF0IHRoZSByZWFkIGxvY2sgbGV2ZWwKKyAgICAgKiBvZiB0aGUgZmV0Y2ggY29uZmlndXJhdGlvbgorICAgICAqIEBwYXJhbSBlZGF0YSB0aGUgY3VycmVudCBleGVjdXRpb24gZGF0YSwgb3IgbnVsbCBpZiBub3QKKyAgICAgKiBnaXZlbiB0byB0aGUgY2FsbGluZyBtZXRob2Qgb2YgdGhlIGJyb2tlcgorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIG9iamVjdCBubyBsb25nZXIgZXhpc3RzIGluIHRoZQorICAgICAqIGRhdGFiYXNlLCB0cnVlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGxvYWQoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgQml0U2V0IGZpZWxkcywKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBpbnQgbG9ja0xldmVsLCBPYmplY3QgZWRhdGEpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSwgbG9hZCwgb3IgdmFsaWRhdGUgdGhlIGV4aXN0YW5jZSBvZiBhbGwgb2YgdGhlIGdpdmVuCisgICAgICogb2JqZWN0cy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gdmFyaW91cyBicm9rZXIgbWV0aG9kcyB0aGF0IGFjdAorICAgICAqIG9uIG11bHRpcGxlIG9iamVjdHMsIHN1Y2ggYXMge0BsaW5rIFN0b3JlQ29udGV4dCNyZXRyaWV2ZUFsbH0uIEl0IGdpdmVzCisgICAgICogdGhlIHN0b3JlIG1hbmFnZXIgYW4gb3Bwb3J0dW5pdHkgdG8gZWZmaWNpZW50bHkgYmF0Y2gtbG9hZCBkYXRhIGZvcgorICAgICAqIHNldmVyYWwgb2JqZWN0cy4gRWFjaCBvZiB0aGUgZ2l2ZW4gc3RhdGUgbWFuYWdlcnMgd2lsbCBiZSBpbiBvbmUgb2YKKyAgICAgKiB0aHJlZSBzdGF0ZXMsIGVhY2ggcmVxdWlyaW5nIGEgZGlmZmVyZW50IGFjdGlvbjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPnN0YXRlTWFuYWdlci5nZXRNYW5hZ2VkSW5zdGFuY2UgKCkgPT0gbnVsbDwvY29kZT46IEFuCisgICAgICogdW5pbml0aWFsaXplZCBzdGF0ZSBtYW5hZ2VyLiBQZXJmb3JtIHRoZSBzYW1lIGFjdGlvbnMgYXMgaW4KKyAgICAgKiB7QGxpbmsgI2luaXRpYWxpemV9LgorICAgICAqIDxsaT48Y29kZT5sb2FkICE9IEZPUkNFX0xPQURfTk9ORSB8fCBzdGF0ZU1hbmFnZXIuZ2V0UENTdGF0ZSAoKQorICAgICAqID09IFBDU3RhdGUuSE9MTE9XPC9jb2RlPjogQSBob2xsb3cgc3RhdGUgbWFuYWdlciwgb3Igb25lIHdob3NlCisgICAgICogZmllbGRzIG11c3QgYmUgbG9hZGVkIGJlY2F1c2UgdGhpcyBpcyBhIHJlZnJlc2ggb3IgcmV0cmlldmUgYWN0aW9uLgorICAgICAqIFBlZm9ybSB0aGUgc2FtZSBhY3Rpb25zIGFzIGluIHtAbGluayAjbG9hZH0sIGNob29zaW5nIHRoZSBmaWVsZHMKKyAgICAgKiB0byBsb2FkIGJhc2VkIG9uIHRoZSBmZXRjaCBjb25maWd1cmF0aW9uLCBvciBsb2FkaW5nIGFsbCBmaWVsZHMKKyAgICAgKiBpZiA8Y29kZT5sb2FkID09IEZPUkNFX0xPQURfQUxMPC9jb2RlPi4gQW55IHJlcXVpcmVkIGZpZWxkcyBsZWZ0CisgICAgICogdW5sb2FkZWQgd2lsbCBjYXVzZSBhIHN1YnNlcXVlbnQgaW52b2NhdGlvbiBvZiB7QGxpbmsgI2xvYWR9IG9uCisgICAgICogdGhlIGluZGl2aWR1YWwgb2JqZWN0IGluIHF1ZXN0aW9uLjwvbGk+CisgICAgICogPGxpPjxjb2RlPmxvYWQgPT0gRk9SQ0VfTE9BRF9OT05FICZhbXA7JmFtcDsKKyAgICAgKiBzdGF0ZU1hbmFnZXIuZ2V0UENTdGF0ZSAoKSAhPSBQQ1N0YXRlLkhPTExPVzwvY29kZT46IEEgbm9uLWhvbGxvdworICAgICAqIHN0YXRlIG1hbmFnZXIuIFBlcmZvcm0gdGhlIHNhbWUgYWN0aW9ucyBhcyBpbiB7QGxpbmsgI2V4aXN0c30sCisgICAgICogYW5kIGxvYWQgYWRkaXRpb25hbCBzdGF0ZSBpZiBkZXNpcmVkLiBOb24taG9sbG93IG9iamVjdHMgd2lsbCBvbmx5CisgICAgICogYmUgaW5jbHVkZWQgb3V0c2lkZSBvZiByZWZyZXNoIGludm9jYXRpb25zIGlmIGEgdXNlciBjYWxscworICAgICAqIDxjb2RlPmZpbmRBbGw8L2NvZGU+IHdpdGggdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPgorICAgICAqIHBhcmFtZXRlciBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKyAgICAgKiA8L3VsPiAKKyAgICAgKiBTdG9yZSBtYW5hZ2VycyB0aGF0IGNhbm5vdCBlZmZpY2llbnRseSBiYXRjaCBsb2FkIGNhbiBzaW1wbHkgdGVzdAorICAgICAqIGZvciB0aGVzZSBjb25kaXRpb25zIGFuZCBkZWxlZ2F0ZSB0byB0aGUgcHJvcGVyIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc21zIHRoZSBzdGF0ZSBtYW5hZ2VyIGluc3RhbmNlcyB0byBsb2FkCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBsaWZlY3ljbGUgc3RhdGUgdG8gaW5pdGlhbGl6ZSB1bmluaXRpYWxpemVkCisgICAgICogc3RhdGUgbWFuYWdlcnMgd2l0aDsgbWF5IGJlIG51bGwgaWYgbm8gdW5pbml0aWFsaXplZAorICAgICAqIGluc3RhbmNlcyBhcmUgaW5jbHVkZWQgaW4gPGNvZGU+c21zPC9jb2RlPgorICAgICAqIEBwYXJhbSBsb2FkIG9uZSBvZiB0aGUgRk9SQ0VfTE9BRF8qIGNvbnN0YW50cyBkZXNjcmliaW5nIHRoZQorICAgICAqIGZpZWxkcyB0byBmb3JjZS1sb2FkIGlmIHRoaXMgaXMgYSByZWZyZXNoIG9yIHJldHJpZXZlIGFjdGlvbgorICAgICAqIEBwYXJhbSBmZXRjaCB0aGUgY3VycmVudCBmZXRjaCBjb25maWd1cmF0aW9uIHRvIHVzZSB3aGVuIGxvYWRpbmcKKyAgICAgKiByZWxhdGVkIG9iamVjdHMKKyAgICAgKiBAcGFyYW0gZWRhdGEgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGRhdGEsIG9yIG51bGwgaWYgbm90CisgICAgICogZ2l2ZW4gdG8gdGhlIGNhbGxpbmcgbWV0aG9kIG9mIHRoZSBicm9rZXIKKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgc3RhdGUgbWFuYWdlciBpZGVudGl0aWVzIGZvcgorICAgICAqIHdoaWNoIG5vIGRhdGEgc3RvcmUgcmVjb3JkIGV4aXN0cworICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlciNsb2FkQWxsCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gbG9hZEFsbChDb2xsZWN0aW9uIHNtcywgUENTdGF0ZSBzdGF0ZSwgaW50IGxvYWQsCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCwgT2JqZWN0IGVkYXRhKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyIGlzIGFib3V0IHRvIGNoYW5nZSBpdHMKKyAgICAgKiBsaWZlY3ljbGUgc3RhdGUuIFRoZSBzdG9yZSBtYW5hZ2VyIGlzIG5vdCByZXF1aXJlZCB0byBkbyBhbnl0aGluZyBpbgorICAgICAqIHRoaXMgbWV0aG9kLCBidXQgc29tZSBiYWNrIGVuZHMgbWF5IG5lZWQgdG8uCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVTdGF0ZUNoYW5nZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBQQ1N0YXRlIGZyb21TdGF0ZSwKKyAgICAgICAgUENTdGF0ZSB0b1N0YXRlKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyIGNvbGxlY3Rpb24gdG8gdGhlIGRhdGFzdG9yZSwgcmV0dXJuaW5nCisgICAgICogYSBjb2xsZWN0aW9uIG9mIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQgZHVyaW5nIGZsdXNoaW5nLgorICAgICAqIFRoZSBnaXZlbiBjb2xsZWN0aW9uIG1heSBpbmNsdWRlIHN0YXRlcyB0aGF0IGRvIG5vdCByZXF1aXJlIGRhdGEKKyAgICAgKiBzdG9yZSBhY3Rpb24sIHN1Y2ggYXMgcGVyc2lzdGVudC1jbGVhbiBpbnN0YW5jZXMgb3IgcGVyc2lzdGVudC1kaXJ0eQorICAgICAqIGluc3RhbmNlcyB0aGF0IGhhdmUgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhleSB3ZXJlIGxhc3QgZmx1c2hlZC4KKyAgICAgKiBGb3IgZGF0YXN0b3JlIHVwZGF0ZXMgYW5kIGluc2VydHMsIHRoZSBkaXJ0eSwgbm9uLWZsdXNoZWQgZmllbGRzIG9mCisgICAgICogZWFjaCBzdGF0ZSBzaG91bGQgYmUgZmx1c2hlZC4gTmV3IGluc3RhbmNlcyB3aXRob3V0IGFuIGFzc2lnbmVkIG9iamVjdAorICAgICAqIGlkIHNob3VsZCBiZSBnaXZlbiBvbmUgdmlhIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyI3NldE9iamVjdElkfS4gTmV3CisgICAgICogaW5zdGFuY2VzIHdpdGggdmFsdWUtc3RyYXRlZ3kgZmllbGRzIHRoYXQgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCB5ZXQKKyAgICAgKiBzaG91bGQgaGF2ZSB0aGVpciBmaWVsZHMgc2V0LiBEYXRhc3RvcmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBzaG91bGQgYmUKKyAgICAgKiB1cGRhdGVkIGR1cmluZyBmbHVzaCwgYW5kIHRoZSBzdGF0ZSBtYW5hZ2VyJ3MgdmVyc2lvbiBpbmRpY2F0b3IKKyAgICAgKiB1cGRhdGVkIHRocm91Z2ggdGhlIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyI3NldE5leHRWZXJzaW9ufSBtZXRob2QuCisgICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIHJvbGwgb3ZlciB0byB0aGlzIG5leHQgdmVyc2lvbiB1cG9uIHN1Y2Nlc3NmdWwKKyAgICAgKiBjb21taXQuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkFwcGxpY2F0aW9uSWRzI2Fzc2lnbigpCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZmx1c2goQ29sbGVjdGlvbiBzbXMpOworCisgICAgLyoqCisgICAgICogQXNzaWduIGFuIG9iamVjdCBpZCB0byB0aGUgZ2l2ZW4gbmV3IGluc3RhbmNlLiBSZXR1cm4gZmFsc2UgaWYgdGhlCisgICAgICogaW5zdGFuY2UgY2Fubm90IGJlIGFzc2lnbmVkIGFuIGlkZW50aXR5IGJlY2F1c2UgYSBmbHVzaCBpcyByZXF1aXJlZAorICAgICAqIChmb3IgZXhhbXBsZSwgdGhlIGlkZW50aXR5IGlzIGRldGVybWluZWQgYnkgdGhlIGRhdGFzdG9yZSBvbiBpbnNlcnQpLgorICAgICAqIEZvciBhcHBsaWNhdGlvbiBpZGVudGl0eSBpbnN0YW5jZXMsIHRoZSBhc3NpZ25lZCBvYmplY3QgaWQgc2hvdWxkIGJlCisgICAgICogYmFzZWQgb24gZmllbGQgc3RhdGUuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdXNpbmcgdGhlCisgICAgICogcHJvcGVyIHZhbHVlIHN0cmF0ZWd5IGFjY29yZGluZyB0byB0aGUgaW5zdGFuY2UgbWV0YWRhdGEuIFRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIGEgdXNlciByZXF1ZXN0cyB0aGUgb2lkIG9mIGEgbmV3IGluc3RhbmNlCisgICAgICogYmVmb3JlIGZsdXNoLgorICAgICAqCisgICAgICogQHBhcmFtIHByZUZsdXNoIHdoZXRoZXIgdGhpcyBhc3NpZ25tZW50IGlzIGJlaW5nIHJlcXVlc3RlZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gYXMgcGFydCBvZiBwcmUtZmx1c2ggYWN0aXZpdGllcywgYW5kIGNhbgorICAgICAqIGJlIGlnbm9yZWQgaWYgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gYXNzaWduIHdpdGhpbiB7QGxpbmsgI2ZsdXNofQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlciNnZW5lcmF0ZUZpZWxkVmFsdWUKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkltcGxIZWxwZXIjZ2VuZXJhdGVJZGVudGl0eVZhbHVlCisgICAgICogQHNlZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5BcHBsaWNhdGlvbklkcyNhc3NpZ24oKQorICAgICAqIEBzaW5jZSAwLjMuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFzc2lnbk9iamVjdElkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGJvb2xlYW4gcHJlRmx1c2gpOworCisgICAgLyoqCisgICAgICogQXNzaWduIGEgdmFsdWUgdG8gdGhlIGdpdmVuIGZpZWxkLiBSZXR1cm4gZmFsc2UgaWYgdGhlIHZhbHVlIGNhbm5vdAorICAgICAqIGJlIGFzc2lnbmVkIGJlY2F1c2UgYSBmbHVzaCBpcyByZXF1aXJlZCAoZm9yIGV4YW1wbGUsIHRoZSBmaWVsZCB2YWx1ZQorICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIGRhdGFzdG9yZSBvbiBpbnNlcnQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlCisgICAgICogZmlyc3QgdGltZSBhIHVzZXIgcmVxdWVzdHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgd2l0aCBhIHZhbHVlLXN0cmF0ZWd5CisgICAgICogb24gYSBuZXcgaW5zdGFuY2UgYmVmb3JlIGZsdXNoLgorICAgICAqCisgICAgICogQHBhcmFtIHByZUZsdXNoIHdoZXRoZXIgdGhpcyBhc3NpZ25tZW50IGlzIGJlaW5nIHJlcXVlc3RlZCBieSB0aGUKKyAgICAgKiBzeXN0ZW0gYXMgcGFydCBvZiBwcmUtZmx1c2ggYWN0aXZpdGllcywgYW5kIGNhbgorICAgICAqIGJlIGlnbm9yZWQgaWYgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gYXNzaWduIHdpdGhpbiB7QGxpbmsgI2ZsdXNofQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlciNnZW5lcmF0ZUZpZWxkVmFsdWUKKyAgICAgKiBAc2luY2UgMC40LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25GaWVsZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBpbnQgZmllbGQsCisgICAgICAgIGJvb2xlYW4gcHJlRmx1c2gpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gZGF0YSBzdG9yZSBpZGVudGl0eSB2YWx1ZS4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgbm90IGEgZGF0YXN0b3JlIGlkZW50aXR5IG9iamVjdCwgcmV0dXJuIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0TWFuYWdlZFR5cGUoT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIHVzZWQgYnkgdGhpcyBTdG9yZU1hbmFnZXIgZm9yIGRhdGFzdG9yZSBpZGVudGl0eQorICAgICAqIHZhbHVlcy4gVGhlIGdpdmVuIG1ldGFkYXRhIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm4KKyAgICAgKiB2YWx1ZSBzaG91bGQgdGhlIGNvbW1vbiBkYXRhc3RvcmUgaWRlbnRpdHkgY2xhc3MgZm9yIGFsbCBjbGFzc2VzLCBvcgorICAgICAqIG51bGwgaWYgdGhpcyBzdG9yZSBtYW5hZ2VyIGRvZXMgbm90IHVzZSBhIGNvbW1vbiBpZGVudGl0eSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGF0YVN0b3JlSWRUeXBlKENsYXNzTWV0YURhdGEgbWV0YSk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBnaXZlbiBvYmplY3QgaWQgdmFsdWUuIFVzZSB0aGUgZGVzY3JpYmVkIHR5cGUgb2YgdGhlIGdpdmVuCisgICAgICogbWV0YWRhdGEsIHdoaWNoIG1heSBiZSBhIHN1YmNsYXNzIG9mIHRoZSBnaXZlbiBvaWQncyBkZXNjcmliZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNvcHlEYXRhU3RvcmVJZChPYmplY3Qgb2lkLCBDbGFzc01ldGFEYXRhIG1ldGEpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHVuaXF1ZSBkYXRhc3RvcmUgaWRlbnRpdHkgZm9yIHRoZSBnaXZlbiB0eXBlIGZyb20KKyAgICAgKiB0aGUgZ2l2ZW4gb2lkIHZhbHVlIChwcmVzdW1hYmx5IHBrLCBzdHJpbmdpZmllZCBvaWQsIG9yIG9pZCBpbnN0YW5jZSkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXdEYXRhU3RvcmVJZChPYmplY3Qgb2lkVmFsLCBDbGFzc01ldGFEYXRhIG1ldGEpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBzdG9yZSBzdWl0YWJsZSBmb3IgY2xpZW50IHVzZS4gSWYKKyAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGEgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbiwgdGhpZSBjb25uZWN0aW9uCisgICAgICogbXVzdCBiZSB0cmFuc2FjdGlvbmFsLiBJZiBubyBjb25uZWN0aW9uIGlzIGluIHVzZSwgdGhpcyBtZXRob2Qgc2hvdWxkCisgICAgICogY3JlYXRlIG9uZSB0byByZXR1cm4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDbGllbnRDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnN0cnVjdCB0aGUgc3RvcmUgdG8gcmV0YWluIGEgY29ubmVjdGlvbiBmb3IgY29udGludWVkIHVzZS4gVGhpcworICAgICAqIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBjb25uZWN0aW9uCisgICAgICogcmV0YWluIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV0YWluQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5zdHJ1Y3QgdGhlIHN0b3JlIHRvIHJlbGVhc2UgYSByZXRhaW5lZCBjb25uZWN0aW9uLiBUaGlzCisgICAgICogd2lsbCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHVzZXIncyBjb25maWd1cmVkIGNvbm5lY3Rpb24KKyAgICAgKiByZXRhaW4gbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogQ2FuY2VsIGFsbCBwZW5kaW5nIGRhdGEgc3RvcmUgc3RhdGVtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgc3RhdGVtZW50cyBjYW5jZWxsZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBzaW5jZSAwLjMuMQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbEFsbCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcHJvdmlkZXIgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGdpdmVuIGNhbmRpZGF0ZSBjbGFzcywKKyAgICAgKiBvcHRpb25hbGx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLiBUaGUgZ2l2ZW4gY2FuZGlkYXRlIG1heSBiZSBhbgorICAgICAqIHVubWFwcGVkIHR5cGUgd2l0aCBtYXBwZWQgc3ViY2xhc3Nlcy4gSWYgdGhlIHByb3ZpZGVyIGlzIGl0ZXJhdGVkCisgICAgICogd2l0aGluIGEgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbiwgcmV0dXJuZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBsb2NrZWQuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdE9iamVjdFByb3ZpZGVyIGV4ZWN1dGVFeHRlbnQoQ2xhc3NNZXRhRGF0YSBtZXRhLAorICAgICAgICBib29sZWFuIHN1YmNsYXNzZXMsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBxdWVyeSBpbXBsZW1lbnRhdGlvbiBzdWl0YWJsZSBmb3IgdGhpcyBzdG9yZS4gSWYgdGhlIHF1ZXJ5CisgICAgICogaXMgaXRlcmF0ZWQgd2l0aGluIGEgZGF0YSBzdG9yZSB0cmFuc2FjdGlvbiwgcmV0dXJuZWQgaW5zdGFuY2VzIHNob3VsZAorICAgICAqIGJlIGxvY2tlZC4gUmV0dXJuIG51bGwgaWYgdGhpcyBzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBleGVjdXRpb24KKyAgICAgKiBvZiB0aGUgZ2l2ZW4gbGFuZ3VhZ2UuIE9wZW5KUEEgY2FuIGV4ZWN1dGUgSlBRTCBpbiBtZW1vcnkgZXZlbiB3aXRob3V0CisgICAgICogYmFjayBlbmQgc3VwcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYW5ndWFnZSB0aGUgcXVlcnkgbGFuZ3VhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVRdWVyeSBuZXdRdWVyeShTdHJpbmcgbGFuZ3VhZ2UpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgZmV0Y2ggY29uZmlndXJhdGlvbiBzdWl0YWJsZSBmb3IgdGhpcyBydW50aW1lLiBUeXBpY2FsbHkKKyAgICAgKiB3aWxsIGJlIG9yIGV4dGVuZCA8Y29kZT5GZXRjaENvbmZpZ3VyYXRpb25JbXBsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIG5ld0ZldGNoQ29uZmlndXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgdHdvIHZlcnNpb24gb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgbWFuYWdlciBmb3IgdGhlIG9iamVjdAorICAgICAqIEBwYXJhbSB2MSB0aGUgZmlyc3QgdmVyc2lvbiBvYmplY3QgdG8gY29tcGFyZQorICAgICAqIEBwYXJhbSB2MiB0aGUgc2Vjb25kIHZlcnNpb24gb2JqZWN0IHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNWRVJTSU9OX0xBVEVSfSBpZiA8Y29kZT52MTwvY29kZT4KKyAgICAgKiBpcyBsYXRlciB0aGFuIDxjb2RlPnYyPC9jb2RlPjwvbGk+CisgICAgICogPGxpPntAbGluayAjVkVSU0lPTl9FQVJMSUVSfSBpZiA8Y29kZT52MTwvY29kZT4KKyAgICAgKiBpcyBlYXJsaWVyIHRoYW4gPGNvZGU+djI8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNWRVJTSU9OX1NBTUV9IGlmIDxjb2RlPnYxPC9jb2RlPgorICAgICAqIGlzIHRoZSBzYW1lIGFzIDxjb2RlPnYyPC9jb2RlPjwvbGk+CisgICAgICogPGxpPntAbGluayAjVkVSU0lPTl9ESUZGRVJFTlR9IGlmIDxjb2RlPnYxPC9jb2RlPgorICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIDxjb2RlPnYyPC9jb2RlPiwgYnV0IHRoZSB0aW1lCisgICAgICogZGlmZmVyZW5jZSBvZiB0aGUgdmVyc2lvbnMgY2Fubm90IGJlIGRldGVybWluZWQ8L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXJlVmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHN0YXRlLCBPYmplY3QgdjEsIE9iamVjdCB2Mik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzZXF1ZW5jZSB0aGF0IGdlbmVyYXRlcyBkYXRhc3RvcmUgaWRlbnRpdHkgdmFsdWVzIGZvciB0aGUKKyAgICAgKiBnaXZlbiBjbGFzcy4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBpZGVudGl0eSBzdHJhdGVneQorICAgICAqIGZvciB0aGUgY2xhc3MgaXMgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIFZhbHVlU3RyYXRlZ2llcyNOQVRJVkV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFZhbHVlU3RyYXRlZ2llcyNBVVRPQVNTSUdOfTwvbGk+CisgICAgICogPGxpPntAbGluayBWYWx1ZVN0cmF0ZWdpZXMjSU5DUkVNRU5UfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBJZiB0aGUgaWRlbnRpdHkgc3RyYXRlZ3kgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2UsIHJldHVybgorICAgICAqIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC40LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxIGdldERhdGFTdG9yZUlkU2VxdWVuY2UoQ2xhc3NNZXRhRGF0YSBmb3JDbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzZXF1ZW5jZSB0aGF0IGdlbmVyYXRlcyB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBmaWVsZC4gVGhpcworICAgICAqIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIHN0cmF0ZWd5IGZvciB0aGUgZmllbGQKKyAgICAgKiBpcyBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgVmFsdWVTdHJhdGVnaWVzI05BVElWRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgVmFsdWVTdHJhdGVnaWVzI0FVVE9BU1NJR059PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFZhbHVlU3RyYXRlZ2llcyNJTkNSRU1FTlR9PC9saT4KKyAgICAgKiA8L3VsPiBJZiB0aGUgdmFsdWUgc3RyYXRlZ3kgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2UsIHJldHVybgorICAgICAqIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC40LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxIGdldFZhbHVlU2VxdWVuY2UoRmllbGRNZXRhRGF0YSBmb3JGaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBGcmVlIGFueSByZXNvdXJjZXMgdGhpcyBzdG9yZSBtYW5hZ2VyIGlzIHVzaW5nLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UgKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TdG9yZVF1ZXJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TdG9yZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTI2YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1N0b3JlUXVlcnkuamF2YQpAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxpbmtlZE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuQWdncmVnYXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkNvbnN0YW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5GaWx0ZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CisKKy8qKgorICogQ29tcG9uZW50IHRoYXQgZXhlY3V0ZXMgcXVlcmllcyBhZ2FpbnN0IHRoZSBkYXRhc3RvcmUuIEZvcgorICogZXhwcmVzc2lvbi1iYXNlZCBxdWVyaWVzLCBjb25zaWRlciBzdWJjbGFzc2luZworICoge0BsaW5rIEV4cHJlc3Npb25TdG9yZU1hbmFnZXJRdWVyeX0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b3JlUXVlcnkKKyAgICBleHRlbmRzIFF1ZXJ5T3BlcmF0aW9ucywgU2VyaWFsaXphYmxlIHsKKworICAgIC8vIGxpbmtlZG1hcCBkb2Vzbid0IGFsbG93IGEgc2l6ZSBvZiAwLCBzbyB1c2UgMQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlua2VkTWFwIEVNUFRZX1BBUkFNUyA9IG5ldyBMaW5rZWRNYXAoMSwgMUYpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NNZXRhRGF0YVtdIEVNUFRZX01FVEFTID0gbmV3IENsYXNzTWV0YURhdGFbMF07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdTID0gbmV3IFN0cmluZ1swXTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVFMgPSBuZXcgT2JqZWN0WzBdOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NbXSBFTVBUWV9DTEFTU0VTID0gbmV3IENsYXNzWzBdOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbltdIEVNUFRZX0JPT0xFQU5TID0gbmV3IGJvb2xlYW5bMF07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHF1ZXJ5IGNvbnRleHQgdGhhdCBoYXMgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFF1ZXJ5Q29udGV4dCBnZXRDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcXVlcnkgY29udGV4dC4gVGhpcyB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoUXVlcnlDb250ZXh0IGN0eCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGludm9rZWQgd2hlbiB0aGUgdXNlciBvciBhIGZhY2FkZSBjcmVhdGVzIGEgbmV3IHF1ZXJ5IHdpdGgKKyAgICAgKiBhbiBvYmplY3QgdGhhdCB0aGUgc3lzdGVtIGRvZXMgbm90IHJlY29nbml6ZS4gUmV0dXJuIHRydWUgaWYKKyAgICAgKiB0aGUgb2JqZWN0IGlzIHJlY29nbml6ZWQgYnkgdGhlIHN0b3JlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0UXVlcnkoT2JqZWN0IHF1ZXJ5KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhbmRhcmQgZmlsdGVyIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gdGFnLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJMaXN0ZW5lciBnZXRGaWx0ZXJMaXN0ZW5lcihTdHJpbmcgdGFnKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhbmRhcmQgZmlsdGVyIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gdGFnLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBBZ2dyZWdhdGVMaXN0ZW5lciBnZXRBZ2dyZWdhdGVMaXN0ZW5lcihTdHJpbmcgdGFnKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBrZXkgZm9yIGNhY2hpbmcgY29tcGlsZWQgcXVlcnkgaW5mb3JtYXRpb24uIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV3Q29tcGlsYXRpb25LZXkoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjb21waWxhdGlvbiBmb3IgdGhpcyBxdWVyeS4gTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXdDb21waWxhdGlvbigpOworCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgaW50ZXJuYWwgZGF0YSBmcm9tIGNvbXBpbGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRnJvbUNvbXBpbGF0aW9uKE9iamVjdCBjb21wKTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGUgYW55IGludGVybmFsIGNvbXBpbGF0aW9uIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVDb21waWxhdGlvbigpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHF1ZXJ5IHN1cHBvcnRzIGRhdGFzdG9yZSBleGVjdXRpb24sIGZhbHNlIGlmIGl0CisgICAgICogY2FuIG9ubHkgcnVuIGluIG1lbW9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RhdGFTdG9yZUV4ZWN1dGlvbigpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHF1ZXJ5IHN1cHBvcnRzIGluLW1lbW9yeSBleGVjdXRpb24sIGZhbHNlIGlmIGl0CisgICAgICogY2FuIG9ubHkgcnVuIGFnYWluc3QgdGhlIGRhdGFzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0luTWVtb3J5RXhlY3V0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhlY3V0b3IgZm9yIGluLW1lbW9yeSBleGVjdXRpb24gb2YgdGhpcyBxdWVyeS4KKyAgICAgKiBFeGVjdXRvcnMgbXVzdCBiZSBjYWNoYWJsZSBhbmQgdGhyZWFkIHNhZmUuIElmIHRoaXMgY2xhc3MgcmV0dXJucworICAgICAqIHRydWUgZnJvbSB7QGxpbmsgI3N1cHBvcnRzQWJzdHJhY3RFeGVjdXRvcnN9LCB0aGUgZ2l2ZW4gbWV0YWRhdGEKKyAgICAgKiB3aWxsIGFsd2F5cyBiZSBmb3IgdGhlIGNhbmRpZGF0ZSBjbGFzcyBvZiB0aGlzIHF1ZXJ5LCBvciBwb3NzaWJseQorICAgICAqIG51bGwgaWYgdGhlIGNhbmRpZGF0ZSBjbGFzcyBpcyBub3QgaXRzZWxmIHBlcnNpc3RlbmNlIGNhcGFibGUgKGxpa2UKKyAgICAgKiBhbiBpbnRlcmZhY2Ugb3IgYWJzdHJhY3QgYmFzZSBjbGFzcykuIE90aGVyd2lzZSwgdGhlIGdpdmVuIHR5cGUgd2lsbAorICAgICAqIGJlIGEgbWFwcGVkIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnMgd2hldGhlciB0byBpbmNsdWRlIGRlcGVuZGVudCBtYXBwZWQgc3ViY2xhc3NlcyBpbiB0aGUKKyAgICAgKiByZXN1bHRzOyBpbmRlcGVuZGVudCBzdWJjbGFzc2VzIHNob3VsZCBuZXZlciBiZSBpbmNsdWRlZAorICAgICAqLworICAgIHB1YmxpYyBFeGVjdXRvciBuZXdJbk1lbW9yeUV4ZWN1dG9yKENsYXNzTWV0YURhdGEgbWV0YSwgYm9vbGVhbiBzdWJzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBleGVjdXRvciBmb3IgZGF0YXN0b3JlIGV4ZWN1dGlvbiBvZiB0aGlzIHF1ZXJ5LgorICAgICAqIEV4ZWN1dG9ycyBtdXN0IGJlIGNhY2hhYmxlIGFuZCB0aHJlYWQgc2FmZS4gSWYgdGhpcyBjbGFzcyByZXR1cm5zCisgICAgICogdHJ1ZSBmcm9tIHtAbGluayAjc3VwcG9ydHNBYnN0cmFjdEV4ZWN1dG9yc30sIHRoZSBnaXZlbiBtZXRhZGF0YQorICAgICAqIHdpbGwgYWx3YXlzIGJlIGZvciB0aGUgY2FuZGlkYXRlIGNsYXNzIG9mIHRoaXMgcXVlcnksIG9yIHBvc3NpYmx5CisgICAgICogbnVsbCBpZiB0aGUgY2FuZGlkYXRlIGNsYXNzIGlzIG5vdCBpdHNlbGYgcGVyc2lzdGVuY2UgY2FwYWJsZSAobGlrZQorICAgICAqIGFuIGludGVyZmFjZSBvciBhYnN0cmFjdCBiYXNlIGNsYXNzKS4gT3RoZXJ3aXNlLCB0aGUgZ2l2ZW4gdHlwZSB3aWxsCisgICAgICogYmUgYSBtYXBwZWQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VicyB3aGV0aGVyIHRvIGluY2x1ZGUgZGVwZW5kZW50IG1hcHBlZCBzdWJjbGFzc2VzIGluIHRoZQorICAgICAqIHJlc3VsdHM7IGluZGVwZW5kZW50IHN1YmNsYXNzZXMgc2hvdWxkIG5ldmVyIGJlIGluY2x1ZGVkCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dG9yIG5ld0RhdGFTdG9yZUV4ZWN1dG9yKENsYXNzTWV0YURhdGEgbWV0YSwgYm9vbGVhbiBzdWJzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgcXVlcnkgc3VwcG9ydHMgZXhlY3V0aW9uIGFnYWluc3QgYWJzdHJhY3Qgb3IKKyAgICAgKiBpbnRlcmZhY2UgdHlwZXMuIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdCwgbWVhbmluZyB3ZSB3aWxsIG9ubHkKKyAgICAgKiByZXF1ZXN0IGV4ZWN1dG9ycyBmb3IgcGVyc2lzdGVudCBjbGFzc2VzLiBJbiB0aGlzIGNhc2UsIHdlIHdpbGwKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGNvbWJpbmUgdGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dG9ycyBmb3IgYWxsCisgICAgICogaW1wbGVtZW50aW5nIGNsYXNzZXMgaWYgd2UgZXhlY3V0ZSBhIHF1ZXJ5IGZvciBhbiBpbnRlcmZhY2UgZm9yCisgICAgICogYWJzdHJhY3QgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Fic3RyYWN0RXhlY3V0b3JzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgcXVlcnkgcmVxdWlyZXMgYSBjYW5kaWRhdGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDYW5kaWRhdGVUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgcXVlcnkgcmVxdWlyZXMgcGFyYW1ldGVycyB0byBiZSBkZWNsYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1BhcmFtZXRlckRlY2xhcmF0aW9ucygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHF1ZXJ5IHN1cHBvcnRzIGRlY2xhcmVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQYXJhbWV0ZXJEZWNsYXJhdGlvbnMoKTsKKworICAgIC8qKgorICAgICAqIEEgcXVlcnkgcmVzdWx0IHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmFuZ2UgeworICAgICAgICBwdWJsaWMgbG9uZyBzdGFydCA9IDBMOworICAgICAgICBwdWJsaWMgbG9uZyBlbmQgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbHJzID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFJhbmdlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJhbmdlKGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgICAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4ZWN1dG9yIHByb3ZpZGVzIGEgdW5pZm9ybSBpbnRlcmZhY2UgdG8gdGhlIG1lY2hhbmlzbSBmb3IgZXhlY3V0aW5nCisgICAgICogZWl0aGVyIGFuIGluLW1lbW9yeSBvciBkYXRhc3RvcmUgcXVlcnkuIEluIHRoZSBjb21tb24gY2FzZSwgdGhlCisgICAgICoge0BsaW5rICNleGVjdXRlUXVlcnl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgbWV0aG9kcywKKyAgICAgKiB0aG91Z2ggdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRXhlY3V0b3IgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhpcyBxdWVyeSB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXIKKyAgICAgICAgICogdmFsdWVzLiBJZiB0aGlzIHF1ZXJ5IGlzIGEgcHJvamVjdGlvbiBhbmQgdGhpcyBleGVjdXRvciBkb2VzIG5vdAorICAgICAgICAgKiBwYWNrIHJlc3VsdHMgaXRzZWxmLCBlYWNoIGVsZW1lbnQgb2YgdGhlIHJldHVybmVkIHJlc3VsdCBvYmplY3QKKyAgICAgICAgICogcHJvdmlkZXIgc2hvdWxkIGJlIGFuIG9iamVjdCBhcnJheSBjb250YWluaW5nIHRoZSBwcm9qZWN0aW9uIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGxycyB0cnVlIGlmIHRoZSBxdWVyeSByZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYQorICAgICAgICAgKiBsYXJnZSByZXN1bHQgc2V0LCBhc3N1bWluZyB0aGUgcXVlcnkgaXMgbm90IGFuCisgICAgICAgICAqIGFnZ3JlZ2F0ZSBhbmQgZG9lcyBub3QgaGF2ZSBncm91cGluZworICAgICAgICAgKiBAc2VlICNpc1BhY2tpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXN1bHRPYmplY3RQcm92aWRlciBleGVjdXRlUXVlcnkoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMsCisgICAgICAgICAgICBSYW5nZSByYW5nZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlbGV0ZWQgdGhlIG9iamVjdHMgdGhhdCByZXN1bHQgZnJvbSB0aGUgZXhlY3V0aW9uIG9mIHRoZQorICAgICAgICAgKiBxdWVyeSwgcmV0dW5pbmcgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoYXQgd2VyZSBkZWxldGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE51bWJlciBleGVjdXRlRGVsZXRlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXBkYXRlcyB0aGUgb2JqZWN0cyB0aGF0IHJlc3VsdCBmcm9tIHRoZSBleGVjdXRpb24gb2YgdGhlCisgICAgICAgICAqIHF1ZXJ5LCByZXR1bmluZyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCB3ZXJlIHVwZGF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTnVtYmVyIGV4ZWN1dGVVcGRhdGUoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZHMgdGhhdCB3aWxsIGJlIHNlbnQgdG8KKyAgICAgICAgICogdGhlIGRhdGFzdG9yZSBpbiBvcmRlciB0byBleGVjdXRlIHRoZSBxdWVyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU3RvcmVBY3Rpb25zKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLAorICAgICAgICAgICAgUmFuZ2UgcmFuZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWYWxpZGF0ZSBjb21wb25lbnRzIG9mIHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoU3RvcmVRdWVyeSBxKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTXV0YXRlIHRoZSBnaXZlbiByYW5nZSB0byBzZXQgYW55IHJhbmdlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiAKKyAgICAgICAgICogdGhlIHF1ZXJ5IHN0cmluZyBhbmQvb3IgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGdldFJhbmdlKFN0b3JlUXVlcnkgcSwgT2JqZWN0W10gcGFyYW1zLCBSYW5nZSByYW5nZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4dHJhY3QgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5vcmRlckluZGV4PC9jb2RlPnRoIG9yZGVyaW5nCisgICAgICAgICAqIGV4cHJlc3Npb24gaW4ge0BsaW5rIFF1ZXJ5I2dldE9yZGVyaW5nQ2xhdXNlc30gZnJvbSB0aGUKKyAgICAgICAgICogZ2l2ZW4gcmVzdWx0IG9iamVjdC4gVGhlIHJlc3VsdCBvYmplY3Qgd2lsbCBiZSBhbiBvYmplY3QgZnJvbQorICAgICAgICAgKiB0aGUgcmVzdWx0IG9iamVjdCBwcm92aWRlciByZXR1cm5lZCBmcm9tIHtAbGluayAjZXhlY3V0ZVF1ZXJ5fS4KKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIHNldmVyYWwgcmVzdWx0IGxpc3RzIGhhdmUgdG8gYmUgbWVyZ2VkCisgICAgICAgICAqIGluIG1lbW9yeS4gSWYgdGhpcyBleGV1Y3RvcidzIHBhcmVudCBxdWVyeSBzdXBwb3J0cyBleGVjdXRvcnMgb24KKyAgICAgICAgICogYWJzdHJhY3Qgb3IgaW50ZXJmYWNlIGNsYXNzZXMsIHRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIHVzZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgU3RvcmVRdWVyeSNzdXBwb3J0c0Fic3RyYWN0RXhlY3V0b3JzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE9yZGVyaW5nVmFsdWUoU3RvcmVRdWVyeSBxLCBPYmplY3RbXSBwYXJhbXMsCisgICAgICAgICAgICBPYmplY3QgcmVzdWx0T2JqZWN0LCBpbnQgb3JkZXJJbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgb3JkZXJpbmcgZGlyZWN0aW9uIGZvciBhbGwgb3JkZXJpbmcgY2xhdXNlcywgb3IgZW1wdHkKKyAgICAgICAgICogYXJyYXkgaWYgbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuW10gZ2V0QXNjZW5kaW5nKFN0b3JlUXVlcnkgcSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZXhlY3V0b3IgcGFja3MgcHJvamVjdGlvbnMgaW50byB0aGUgcmVzdWx0CisgICAgICAgICAqIGNsYXNzIGl0c2VsZi4gRXhlY3V0b3JzIGZvciBxdWVyeSBsYW5ndWFnZXMgdGhhdCBhbGxvdyBwcm9qZWN0aW9ucworICAgICAgICAgKiB3aXRob3V0IHJlc3VsdCBjbGF1c2VzIG11c3QgcmV0dXJuIHRydWUgYW5kIHBlcmZvcm0gdGhlIHJlc3VsdAorICAgICAgICAgKiBwYWNraW5nIHRoZW1zZWx2ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2tpbmcoU3RvcmVRdWVyeSBxKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgdGhpcyBpcyBub3QgYSBwcm9qZWN0aW9uIGJ1dCB0aGUgY2FuZGlkYXRlIHJlc3VsdHMgYXJlIHBsYWNlZAorICAgICAgICAgKiBpbnRvIGEgcmVzdWx0IGNsYXNzIHdpdGggYW4gYWxpYXMsIHJldHVybiB0aGF0IGFsaWFzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcyhTdG9yZVF1ZXJ5IHEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGFsaWFzIGZvciBlYWNoIHByb2plY3Rpb24gZWxlbWVudCwgb3IgZW1wdHkgYXJyYXkKKyAgICAgICAgICogaWYgbm90IGEgcHJvamVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9qZWN0aW9uQWxpYXNlcyhTdG9yZVF1ZXJ5IHEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGV4cGVjdGVkIHR5cGVzIG9mIHRoZSBwcm9qZWN0aW9ucyB1c2VkIGJ5IHRoaXMgcXVlcnksCisgICAgICAgICAqIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vdCBhIHByb2plY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRQcm9qZWN0aW9uVHlwZXMoU3RvcmVRdWVyeSBxKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgdXNlZCBpbiB0aGlzIHF1ZXJ5LCBvcgorICAgICAgICAgKiBlbXB0eSBhcnJheSBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENsYXNzTWV0YURhdGFbXSBnZXRBY2Nlc3NQYXRoTWV0YURhdGFzKFN0b3JlUXVlcnkgcSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbiB0aGlzIGV4ZWN1dG9yIGlzIG1lYW50IHRvIGV4ZWN1dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgUXVlcnlPcGVyYXRpb25zCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbihTdG9yZVF1ZXJ5IHEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZWQgcXVlcnkgaXMgYW4gYWdncmVnYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZ2dyZWdhdGUoU3RvcmVRdWVyeSBxKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGUgY29tcGlsZWQgcXVlcnkgaGFzIGdyb3VwaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzR3JvdXBpbmcoU3RvcmVRdWVyeSBxKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgbWFwIG9mIHBhcmFtZXRlciBuYW1lcyB0byB0eXBlcy4gVGhlIHJldHVybmVkCisgICAgICAgICAqIHtAbGluayBNYXAjZW50cnlTZXR9J3Mge0BsaW5rIEl0ZXJhdG9yfSBtdXN0IHJldHVybiB2YWx1ZXMgaW4gdGhlCisgICAgICAgICAqIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBkZWNsYXJlZCBvciB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpbmtlZE1hcCBnZXRQYXJhbWV0ZXJUeXBlcyhTdG9yZVF1ZXJ5IHEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgY2xhc3MsIGlmIGFueS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRDbGFzcyhTdG9yZVF1ZXJ5IHEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBtYXAgb2Yge0BsaW5rIEZpZWxkTWV0YURhdGF9IHRvIHVwZGF0ZQorCQkgKiB7QGxpbmsgQ29uc3RhbnR9cywgaW4gY2FzZXMgd2hlcmUgdGhpcyBxdWVyeSBpcyBmb3IgYSBidWxrIHVwZGF0ZS4KKwkgCSAqLworCQlwdWJsaWMgTWFwIGdldFVwZGF0ZXMgKFN0b3JlUXVlcnkgcSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvVENsZWFuU3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1RDbGVhblN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkYWJmZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1RDbGVhblN0YXRlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYSB0cmFuc2llbnQgaW5zdGFuY2UgdGhhdCBpcyBtYW5hZ2VkIGJ5IGEgU3RhdGVNYW5hZ2VyIGFuZAorICogbWF5IGJlIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGN1cnJlbnQJdHJhbnNhY3Rpb24sIGJ1dCBoYXMgbm90IHlldCBiZWVuCisgKiBtb2RpZmllZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBUQ2xlYW5TdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuY2xlYXJTYXZlZEZpZWxkcygpOworICAgICAgICBjb250ZXh0LnNldExvYWRlZCh0cnVlKTsKKyAgICAgICAgY29udGV4dC5zZXREaXJ0eShmYWxzZSk7CisKKyAgICAgICAgLy8gbmVlZCB0byByZXBsYWNlIHRoZSBzZWNvbmQgY2xhc3Mgb2JqZWN0cyB3aXRoIHByb3hpZXMgdGhhdAorICAgICAgICAvLyBsaXN0ZW4gZm9yIGRpcnR5aW5nIHNvIHdlIGNhbiB0cmFjayBjaGFuZ2VzIHRvIHRoZXNlIG9iamVjdHMKKyAgICAgICAgY29udGV4dC5wcm94eUZpZWxkcyh0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgUENTdGF0ZSBwZXJzaXN0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0QnJva2VyKCkuaXNBY3RpdmUoKSkgPyBQTkVXIDogUE5PTlRSQU5TTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgZGVsZXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoInRyYW5zaWVudCIsIGNvbnRleHQpOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9CisKKyAgICBQQ1N0YXRlIGJlZm9yZVdyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLCBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gVERJUlRZOworICAgIH0KKworICAgIFBDU3RhdGUgYmVmb3JlT3B0aW1pc3RpY1dyaXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCwgaW50IGZpZWxkLAorICAgICAgICBib29sZWFuIG11dGF0ZSkgeworICAgICAgICByZXR1cm4gVERJUlRZOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvVERpcnR5U3RhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1REaXJ0eVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiZDVkMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1REaXJ0eVN0YXRlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYSB0cmFuc2llbnQgaW5zdGFuY2UgdGhhdCBpcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiwgYW5kIGhhcyBiZWVuIG1vZGlmaWVkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFREaXJ0eVN0YXRlCisgICAgZXh0ZW5kcyBQQ1N0YXRlIHsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5zYXZlRmllbGRzKGZhbHNlKTsKKyAgICAgICAgY29udGV4dC5zZXRMb2FkZWQodHJ1ZSk7CisgICAgICAgIGNvbnRleHQuc2V0RGlydHkodHJ1ZSk7CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXQoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSBjb21taXRSZXRhaW4oU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBUQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSByb2xsYmFjayhTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRDTEVBTjsKKyAgICB9CisKKyAgICBQQ1N0YXRlIHJvbGxiYWNrUmVzdG9yZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZXN0b3JlRmllbGRzKCk7CisgICAgICAgIHJldHVybiBUQ0xFQU47CisgICAgfQorCisgICAgUENTdGF0ZSBwZXJzaXN0KFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0QnJva2VyKCkuaXNBY3RpdmUoKSkgPyBQTkVXIDogUE5PTlRSQU5TTkVXOworICAgIH0KKworICAgIFBDU3RhdGUgZGVsZXRlKFN0YXRlTWFuYWdlckltcGwgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZXJyb3IoInRyYW5zaWVudCIsIGNvbnRleHQpOworICAgIH0KKworICAgIFBDU3RhdGUgbm9udHJhbnNhY3Rpb25hbChTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yKCJkaXJ0eSIsIGNvbnRleHQpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNUcmFuc2FjdGlvbmFsKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvVExvYWRlZFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UTG9hZGVkU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZkYWVmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvVExvYWRlZFN0YXRlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCisvKioKKyAqIExpZmVjeWNsZSBzdGF0ZS4KKyAqIFJlcHJlc2VudHMgYSB0ZW1wb3JhcmlseSBtYW5hZ2VkIHRyYW5zaWVudCBpbnN0YW5jZSB3aG9zZSBmaWVsZHMKKyAqIGFyZSBsb2FkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGZpZWxkIGluc3BlY3Rpb24gc3VjaAorICogYXMgZm9yIGNhc2NhZGVzLiBUaGlzIHN0YXRlIHNob3VsZCBiZSByZWxlYXNlZCBhcyBzb29uIGFzIGluc3BlY3Rpb24KKyAqIGlzIGNvbXBsZXRlLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK2NsYXNzIFRMb2FkZWRTdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuc2V0TG9hZGVkKHRydWUpOworICAgIH0KKworICAgIFBDU3RhdGUgcmVsZWFzZShTdGF0ZU1hbmFnZXJJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UaW1lU2VlZGVkU2VxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UaW1lU2VlZGVkU2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5ZWIwYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1RpbWVTZWVkZWRTZXEuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PVEU6IERvIG5vdCBjaGFuZ2UgcHJvcGVydHkgbmFtZXM7IHNlZSBTZXF1ZW5jZU1ldGFEYXRhIAorLy8gZm9yIHN0YW5kYXJkIHByb3BlcnR5IG5hbWVzLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQSBzaW1wbGlzdGljIGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIFNlcX0gdXNlZAorICogdG8gcHJvdmlkZSBkYXRhc3RvcmUgaWRzLiBTdGFydHMgd2l0aCBhbiBpZCBlcXVhbCB0byB0aGUgc3lzdGVtJ3MKKyAqIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMgYW5kIGluY3JlbWVudHMgZnJvbSB0aGVyZS4KKyAqCisgKiBAYXV0aG9yIEdyZWcgQ2FtcGJlbGwKKyAqLworcHVibGljIGNsYXNzIFRpbWVTZWVkZWRTZXEKKyAgICBpbXBsZW1lbnRzIFNlcSB7CisKKyAgICBwcml2YXRlIGxvbmcgX2lkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgcHJpdmF0ZSBpbnQgX2luY3JlbWVudCA9IDE7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbmNyZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBfaW5jcmVtZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluY3JlbWVudChpbnQgaW5jcmVtZW50KSB7CisgICAgICAgIF9pbmNyZW1lbnQgPSBpbmNyZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbmV4dChTdG9yZUNvbnRleHQgY3R4LCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgX2lkICs9IF9pbmNyZW1lbnQ7CisgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoX2lkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBjdXJyZW50KFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKF9pZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWxsb2NhdGUoaW50IGFkZGl0aW9uYWwsIFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1RyYW5zZmVyRmllbGRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UcmFuc2ZlckZpZWxkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjRjOTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UcmFuc2ZlckZpZWxkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5GaWVsZE1hbmFnZXI7CisKKy8qKgorICogRmllbGRNYW5hZ2VyIHR5cGUgdXNlZCB0byB0cmFuc2ZlciBhIHNpbmdsZSBmaWVsZCB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBUcmFuc2ZlckZpZWxkTWFuYWdlcgorICAgIGltcGxlbWVudHMgRmllbGRNYW5hZ2VyIHsKKworICAgIHByb3RlY3RlZCBkb3VibGUgZGJsdmFsID0gMDsKKyAgICBwcm90ZWN0ZWQgbG9uZyBsb25ndmFsID0gMDsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9ianZhbCA9IG51bGw7CisgICAgcHJvdGVjdGVkIGludCBmaWVsZCA9IC0xOworCisgICAgcHVibGljIGJvb2xlYW4gZmV0Y2hCb29sZWFuRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiBsb25ndmFsID09IDE7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZmV0Y2hCeXRlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgIHJldHVybiAoYnl0ZSkgbG9uZ3ZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBmZXRjaENoYXJGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIChjaGFyKSBsb25ndmFsOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGRibHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZmV0Y2hGbG9hdEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gKGZsb2F0KSBkYmx2YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBmZXRjaEludEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gKGludCkgbG9uZ3ZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBmZXRjaExvbmdGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGxvbmd2YWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmZXRjaE9iamVjdEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAvLyBkb24ndCBob2xkIG9udG8gc3Ryb25nIHJlZiB0byBvYmplY3QKKyAgICAgICAgT2JqZWN0IHZhbCA9IG9ianZhbDsKKyAgICAgICAgb2JqdmFsID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZmV0Y2hTaG9ydEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gKHNob3J0KSBsb25ndmFsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hTdHJpbmdGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIG9ianZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUJvb2xlYW5GaWVsZChpbnQgZmllbGQsIGJvb2xlYW4gY3VyVmFsKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgbG9uZ3ZhbCA9IChjdXJWYWwpID8gMSA6IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVCeXRlRmllbGQoaW50IGZpZWxkLCBieXRlIGN1clZhbCkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIGxvbmd2YWwgPSBjdXJWYWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVDaGFyRmllbGQoaW50IGZpZWxkLCBjaGFyIGN1clZhbCkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIGxvbmd2YWwgPSAobG9uZykgY3VyVmFsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRG91YmxlRmllbGQoaW50IGZpZWxkLCBkb3VibGUgY3VyVmFsKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgZGJsdmFsID0gY3VyVmFsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmxvYXRGaWVsZChpbnQgZmllbGQsIGZsb2F0IGN1clZhbCkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIGRibHZhbCA9IGN1clZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUludEZpZWxkKGludCBmaWVsZCwgaW50IGN1clZhbCkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIGxvbmd2YWwgPSBjdXJWYWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVMb25nRmllbGQoaW50IGZpZWxkLCBsb25nIGN1clZhbCkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIGxvbmd2YWwgPSBjdXJWYWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVPYmplY3RGaWVsZChpbnQgZmllbGQsIE9iamVjdCBjdXJWYWwpIHsKKyAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgICAgICBvYmp2YWwgPSBjdXJWYWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVTaG9ydEZpZWxkKGludCBmaWVsZCwgc2hvcnQgY3VyVmFsKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgbG9uZ3ZhbCA9IGN1clZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVN0cmluZ0ZpZWxkKGludCBmaWVsZCwgU3RyaW5nIGN1clZhbCkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIG9ianZhbCA9IGN1clZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbnkgaGVsZCBzdGF0ZS4gRmllbGRzIGFyZSBhbHNvIGNsZWFyZWQgYXV0b21hdGljYWxseSB3aGVuIGZldGNoZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGRibHZhbCA9IDA7CisgICAgICAgIGxvbmd2YWwgPSAwOworICAgICAgICBvYmp2YWwgPSBudWxsOworICAgICAgICBmaWVsZCA9IC0xOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1RyYW5zaWVudFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UcmFuc2llbnRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTJhMGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UcmFuc2llbnRTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbDsKKworLyoqCisgKiBMaWZlY3ljbGUgc3RhdGUuCisgKiBSZXByZXNlbnRzIGEgdHJhbnNpZW50IGluc3RhbmNlOyB0aGlzIHN0YXRlIGxhc3RzIG9ubHkgdGhyb3VnaAorICogdGhlIHtAbGluayAjaW5pdGlhbGl6ZX0gbWV0aG9kLCB3aGljaCBpbW1lZGlhdGVseSByZW1vdmVzIHRoZQorICogcGVyc2lzdGVuY2UgY2FwYWJsZSBpbnN0YW5jZSBmcm9tIG1hbmFnZW1lbnQgYnkgdGhlIE9wZW5KUEEgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBUcmFuc2llbnRTdGF0ZQorICAgIGV4dGVuZHMgUENTdGF0ZSB7CisKKyAgICB2b2lkIGluaXRpYWxpemUoU3RhdGVNYW5hZ2VySW1wbCBjb250ZXh0KSB7CisgICAgICAgIC8vIG1hcmsgci93IG9rLCByZW1vdmUgZnJvbSBtYW5hZ2VtZW50CisgICAgICAgIGNvbnRleHQudW5wcm94eUZpZWxkcygpOworICAgICAgICBjb250ZXh0LmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpLnBjUmVwbGFjZVN0YXRlTWFuYWdlcihudWxsKTsKKyAgICAgICAgY29udGV4dC5nZXRCcm9rZXIoKS5zZXRTdGF0ZU1hbmFnZXIoY29udGV4dC5nZXRJZCgpLAorICAgICAgICAgICAgY29udGV4dCwgQnJva2VySW1wbC5TVEFUVVNfVFJBTlNJRU5UKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9VVUlESGV4U2VxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9VVUlESGV4U2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyNTg2YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1VVSURIZXhTZXEuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuVVVJREdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIDMyLWNoYXJhY3RlciBoZXggVVVJRCBzdHJpbmdzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBVVUlESGV4U2VxCisgICAgaW1wbGVtZW50cyBTZXEgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJREhleFNlcSBfaW5zdGFuY2UgPSBuZXcgVVVJREhleFNlcSgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX2xhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVVUlESGV4U2VxIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gX2luc3RhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhpZGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBVVUlESGV4U2VxKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBuZXh0KFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbGFzdCA9IFVVSURHZW5lcmF0b3IubmV4dEhleCgpOworICAgICAgICByZXR1cm4gX2xhc3Q7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY3VycmVudChTdG9yZUNvbnRleHQgY3R4LCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIF9sYXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFsbG9jYXRlKGludCBhZGRpdGlvbmFsLCBTdG9yZUNvbnRleHQgY3R4LCBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9VVUlEU3RyaW5nU2VxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9VVUlEU3RyaW5nU2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlODU1NAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1VVSURTdHJpbmdTZXEuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuVVVJREdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIDE2LWNoYXJhY3RlciBVVUlEIHN0cmluZ3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFVVSURTdHJpbmdTZXEKKyAgICBpbXBsZW1lbnRzIFNlcSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEU3RyaW5nU2VxIF9pbnN0YW5jZSA9IG5ldyBVVUlEU3RyaW5nU2VxKCk7CisKKyAgICBwcml2YXRlIFN0cmluZyBfbGFzdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVVSURTdHJpbmdTZXEgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGlkZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVVSURTdHJpbmdTZXEoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgeworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG5leHQoU3RvcmVDb250ZXh0IGN0eCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9sYXN0ID0gVVVJREdlbmVyYXRvci5uZXh0U3RyaW5nKCk7CisgICAgICAgIHJldHVybiBfbGFzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBjdXJyZW50KFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gX2xhc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWxsb2NhdGUoaW50IGFkZGl0aW9uYWwsIFN0b3JlQ29udGV4dCBjdHgsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1ZlcnNpb25BdHRhY2hTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvVmVyc2lvbkF0dGFjaFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyYWI2YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1ZlcnNpb25BdHRhY2hTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5TdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXBwbGljYXRpb25JZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3B0aW1pc3RpY0V4Y2VwdGlvbjsKKworLyoqCisgKiBIYW5kbGVzIGF0dGFjaGluZyBpbnN0YW5jZXMgdXNpbmcgdmVyc2lvbiBhbmQgcHJpbWFyeSBrZXkgZmllbGRzLgorICoKKyAqIEBub2phdmFkb2MKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKi8KK2NsYXNzIFZlcnNpb25BdHRhY2hTdHJhdGVneQorICAgIGV4dGVuZHMgQXR0YWNoU3RyYXRlZ3kKKyAgICBpbXBsZW1lbnRzIERldGFjaFN0YXRlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFZlcnNpb25BdHRhY2hTdHJhdGVneS5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERldGFjaGVkT2JqZWN0SWQoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLAorICAgICAgICBPYmplY3QgdG9BdHRhY2gpIHsKKyAgICAgICAgQnJva2VyIGJyb2tlciA9IG1hbmFnZXIuZ2V0QnJva2VyKCk7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IGJyb2tlci5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLmdldE1ldGFEYXRhKHRvQXR0YWNoLmdldENsYXNzKCksCisgICAgICAgICAgICBicm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBBcHBsaWNhdGlvbklkcy5jcmVhdGUoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdG9BdHRhY2gsIG1ldGEpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByb3ZpZGVGaWVsZChPYmplY3QgdG9BdHRhY2gsIFN0YXRlTWFuYWdlckltcGwgc20sCisgICAgICAgIGludCBmaWVsZCkgeworICAgICAgICBzbS5wcm92aWRlRmllbGQoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgdG9BdHRhY2gsIHRoaXMsIGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGF0dGFjaChBdHRhY2hNYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCB0b0F0dGFjaCwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhLCBQZXJzaXN0ZW5jZUNhcGFibGUgaW50bywgT3BlbkpQQVN0YXRlTWFuYWdlciBvd25lciwKKyAgICAgICAgVmFsdWVNZXRhRGF0YSBvd25lck1ldGEsIGJvb2xlYW4gZXhwbGljaXQpIHsKKyAgICAgICAgQnJva2VySW1wbCBicm9rZXIgPSBtYW5hZ2VyLmdldEJyb2tlcigpOworICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSB0b0F0dGFjaDsKKworICAgICAgICBib29sZWFuIGVtYmVkZGVkID0gb3duZXJNZXRhICE9IG51bGwgJiYgb3duZXJNZXRhLmlzRW1iZWRkZWRQQygpOworICAgICAgICBib29sZWFuIGlzTmV3ID0gIWJyb2tlci5pc0RldGFjaGVkKHBjKTsKKyAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBudWxsOworICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtID0gbnVsbDsKKworICAgICAgICAvLyBpZiB0aGUgc3RhdGUgbWFuYWdlciBmb3IgdGhlIGVtYmVkZGVkIGluc3RhbmNlIGlzIG51bGwsIHRoZW4KKyAgICAgICAgLy8gaXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBuZXcgaW5zdGFuY2UgKHNpbmNlIHRoZQorICAgICAgICAvLyBuZXdseSBwZXJzaXN0ZWQgb3duZXIgbWF5IGNyZWF0ZSBhIG5ldyBlbWJlZGRlZCBpbnN0YW5jZQorICAgICAgICAvLyBpbiB0aGUgY29uc3RydWN0b3IpOyBmaXhlZCBidWcgIzEwNzUuCisgICAgICAgIC8vIGFsc28sIGlmIHRoZSB1c2VyIGhhcyBhdHRhY2hlZCBhIGRldGFjaGVkIG9iaiBmcm9tIHNvbWV3aGVyZQorICAgICAgICAvLyBlbHNlIGluIHRoZSBncmFwaCB0byBhbiBlbWJlZGRlZCBmaWVsZCB0aGF0IHdhcyBwcmV2aW91c2x5IG51bGwsCisgICAgICAgIC8vIGNvcHkgaW50byBhIG5ldyBlbWJlZGRlZCBpbnN0YW5jZQorICAgICAgICBpZiAoZW1iZWRkZWQgJiYgKGlzTmV3IHx8IGludG8gPT0gbnVsbAorICAgICAgICAgICAgfHwgYnJva2VyLmdldFN0YXRlTWFuYWdlcihpbnRvKSA9PSBudWxsKSkgeworICAgICAgICAgICAgaWYgKGludG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpbnRvID0gcGMucGNOZXdJbnN0YW5jZShudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBzbSA9IChTdGF0ZU1hbmFnZXJJbXBsKSBicm9rZXIuZW1iZWQoaW50bywgbnVsbCwgb3duZXIsIG93bmVyTWV0YSk7CisgICAgICAgICAgICBpbnRvID0gc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXcpIHsKKyAgICAgICAgICAgIHNtID0gcGVyc2lzdChtYW5hZ2VyLCBwYywgbWV0YSwgQXBwbGljYXRpb25JZHMuY3JlYXRlKHBjLCBtZXRhKSwKKyAgICAgICAgICAgICAgICBleHBsaWNpdCk7CisgICAgICAgICAgICBpbnRvID0gc20uZ2V0UGVyc2lzdGVuY2VDYXBhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoIWVtYmVkZGVkICYmIGludG8gPT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IGlkID0gZ2V0RGV0YWNoZWRPYmplY3RJZChtYW5hZ2VyLCB0b0F0dGFjaCk7CisgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpbnRvID0gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgYnJva2VyLmZpbmQoaWQsIHRydWUsIG51bGwpOworICAgICAgICAgICAgaWYgKGludG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0V4Y2VwdGlvbihfbG9jLmdldCgiYXR0YWNoLXZlcnNpb24tZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgcGMuZ2V0Q2xhc3MoKSwgaWQsIHZlcnNpb24pKS5zZXRGYWlsZWRPYmplY3QodG9BdHRhY2gpOworCisgICAgICAgICAgICBzbSA9IG1hbmFnZXIuYXNzZXJ0TWFuYWdlZChpbnRvKTsKKyAgICAgICAgICAgIGlmIChtZXRhLmdldERlc2NyaWJlZFR5cGUoKQorICAgICAgICAgICAgICAgICE9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RGVzY3JpYmVkVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgiYXR0YWNoLXdyb25nY2xhc3MiLCBpZCwgdG9BdHRhY2guZ2V0Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldE1ldGFEYXRhKCkuZ2V0RGVzY3JpYmVkVHlwZSgpKSkuCisgICAgICAgICAgICAgICAgICAgIHNldEZhaWxlZE9iamVjdCh0b0F0dGFjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc20gPSBtYW5hZ2VyLmFzc2VydE1hbmFnZWQoaW50byk7CisKKyAgICAgICAgLy8gbWFyayB0aGF0IHdlIGF0dGFjaGVkIHRoZSBpbnN0YW5jZSAqYmVmb3JlKiB3ZQorICAgICAgICAvLyBmaWxsIGluIHZhbHVlcyB0byBhdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbgorICAgICAgICBtYW5hZ2VyLnNldEF0dGFjaGVkQ29weSh0b0F0dGFjaCwgaW50byk7CisKKyAgICAgICAgLy8gaWYgcGVyc2lzdGluZyBpbiBwbGFjZSwganVzdCBhdHRhY2ggZmllbGQgdmFsdWVzCisgICAgICAgIGlmIChwYyA9PSBpbnRvKSB7CisgICAgICAgICAgICBhdHRhY2hGaWVsZHNJblBsYWNlKG1hbmFnZXIsIHNtKTsKKyAgICAgICAgICAgIHJldHVybiBpbnRvOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW52b2tlIGFueSBwcmVBdHRhY2ggb24gdGhlIGRldGFjaGVkIGluc3RhbmNlCisgICAgICAgIG1hbmFnZXIuZmlyZUJlZm9yZUF0dGFjaCh0b0F0dGFjaCwgbWV0YSk7CisKKyAgICAgICAgLy8gYXNzaWduIHRoZSBkZXRhY2hlZCBwYyB0aGUgc2FtZSBzdGF0ZSBtYW5hZ2VyIGFzIHRoZSBvYmplY3Qgd2UncmUKKyAgICAgICAgLy8gY29weWluZyBpbnRvIGR1cmluZyB0aGUgYXR0YWNoIHByb2Nlc3MKKyAgICAgICAgU3RhdGVNYW5hZ2VyIHNtQmVmb3JlID0gcGMucGNHZXRTdGF0ZU1hbmFnZXIoKTsKKyAgICAgICAgcGMucGNSZXBsYWNlU3RhdGVNYW5hZ2VyKHNtKTsKKyAgICAgICAgaW50IGRldGFjaCA9IChpc05ldykgPyBERVRBQ0hfQUxMIDogYnJva2VyLmdldERldGFjaFN0YXRlKCk7CisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCA9IGJyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoZGV0YWNoKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgREVUQUNIX0FMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEZpZWxkKG1hbmFnZXIsIHRvQXR0YWNoLCBzbSwgZm1kc1tpXSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBERVRBQ0hfRkVUQ0hfR1JPVVBTOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoLnJlcXVpcmVzRmV0Y2goZm1kc1tpXSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gRmV0Y2hDb25maWd1cmF0aW9uLkZFVENIX05PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoRmllbGQobWFuYWdlciwgdG9BdHRhY2gsIHNtLCBmbWRzW2ldLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERFVEFDSF9MT0FERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hGaWVsZChtYW5hZ2VyLCB0b0F0dGFjaCwgc20sIGZtZHNbaV0sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHBjLnBjUmVwbGFjZVN0YXRlTWFuYWdlcihzbUJlZm9yZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlbWJlZGRlZCAmJiAhaXNOZXcpCisgICAgICAgICAgICBjb21wYXJlVmVyc2lvbihzbSwgcGMpOworICAgICAgICByZXR1cm4gaW50bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgY29ycmVjdCBpbiB0aGUgZGV0YWNoZWQgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb21wYXJlVmVyc2lvbihTdGF0ZU1hbmFnZXJJbXBsIHNtLCBQZXJzaXN0ZW5jZUNhcGFibGUgcGMpIHsKKyAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBwYy5wY0dldFZlcnNpb24oKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGxvYWQgdW5sb2FkZWQgZmllbGRzIHNpbmNlIGl0cyBpbXBsaWNpdGx5CisgICAgICAgIC8vIGEgc2luZ2xlIGZpZWxkIHZhbHVlCisgICAgICAgIFN0b3JlTWFuYWdlciBzdG9yZSA9IHNtLmdldEJyb2tlcigpLmdldFN0b3JlTWFuYWdlcigpOworICAgICAgICBzd2l0Y2ggKHN0b3JlLmNvbXBhcmVWZXJzaW9uKHNtLCB2ZXJzaW9uLCBzbS5nZXRWZXJzaW9uKCkpKSB7CisgICAgICAgICAgICBjYXNlIFN0b3JlTWFuYWdlci5WRVJTSU9OX0xBVEVSOgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBsYXRlciB2ZXJzaW9uOiBzZXQgaXQgaW50byB0aGUgb2JqZWN0LgorICAgICAgICAgICAgICAgIC8vIGxvY2sgdmFsaWRhdGlvbiB3aWxsIG9jY3VyIGF0IGNvbW1pdCB0aW1lCisgICAgICAgICAgICAgICAgc20uc2V0VmVyc2lvbih2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RvcmVNYW5hZ2VyLlZFUlNJT05fRUFSTElFUjoKKyAgICAgICAgICAgIGNhc2UgU3RvcmVNYW5hZ2VyLlZFUlNJT05fRElGRkVSRU5UOgorICAgICAgICAgICAgICAgIHNtLnNldFZlcnNpb24odmVyc2lvbik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNFeGNlcHRpb24oc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkpOworICAgICAgICAgICAgY2FzZSBTdG9yZU1hbmFnZXIuVkVSU0lPTl9TQU1FOgorICAgICAgICAgICAgICAgIC8vIG5vIGFjdGlvbiByZXF1aXJlZAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBmaWVsZHMgb2YgYW4gaW4tcGxhY2UgcGVyc2lzdGVkIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhdHRhY2hGaWVsZHNJblBsYWNlKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwKKyAgICAgICAgU3RhdGVNYW5hZ2VySW1wbCBzbSkgeworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IHNtLmdldE1ldGFEYXRhKCkuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZtZHNbaV0uZ2V0TWFuYWdlbWVudCgpICE9IEZpZWxkTWV0YURhdGEuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIE9iamVjdCBjdXIsIGF0dGFjaGVkOworICAgICAgICAgICAgc3dpdGNoIChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDX1VOVFlQRUQ6CisgICAgICAgICAgICAgICAgICAgIGN1ciA9IHNtLmZldGNoT2JqZWN0RmllbGQoaSk7CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkID0gYXR0YWNoSW5QbGFjZShtYW5hZ2VyLCBzbSwgZm1kc1tpXSwgY3VyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgICAgIGlmICghZm1kc1tpXS5nZXRFbGVtZW50KCkuaXNEZWNsYXJlZFR5cGVQQygpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGN1ciA9IHNtLmZldGNoT2JqZWN0RmllbGQoaSk7CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEluUGxhY2UobWFuYWdlciwgc20sIGZtZHNbaV0sIChPYmplY3RbXSkgY3VyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmbWRzW2ldLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgY3VyID0gc20uZmV0Y2hPYmplY3RGaWVsZChpKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWQgPSBhdHRhY2hJblBsYWNlKG1hbmFnZXIsIHNtLCBmbWRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgKENvbGxlY3Rpb24pIGN1cik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmbWRzW2ldLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFmbWRzW2ldLmdldEtleSgpLmlzRGVjbGFyZWRUeXBlUEMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBjdXIgPSBzbS5mZXRjaE9iamVjdEZpZWxkKGkpOworICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZCA9IGF0dGFjaEluUGxhY2UobWFuYWdlciwgc20sIGZtZHNbaV0sIChNYXApIGN1cik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3VyICE9IGF0dGFjaGVkKQorICAgICAgICAgICAgICAgIHNtLnNldHRpbmdPYmplY3RGaWVsZChzbS5nZXRQZXJzaXN0ZW5jZUNhcGFibGUoKSwgaSwKKyAgICAgICAgICAgICAgICAgICAgY3VyLCBhdHRhY2hlZCwgU3RhdGVNYW5hZ2VyLlNFVF9SRU1PVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBnaXZlbiBwYy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBhdHRhY2hJblBsYWNlKEF0dGFjaE1hbmFnZXIgbWFuYWdlciwgU3RhdGVNYW5hZ2VySW1wbCBzbSwKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQsIE9iamVjdCBwYykgeworICAgICAgICBpZiAocGMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBPYmplY3QgYXR0YWNoZWQgPSBtYW5hZ2VyLmdldEF0dGFjaGVkQ29weShwYyk7CisgICAgICAgIGlmIChhdHRhY2hlZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGF0dGFjaGVkOworCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgaW50byA9IG1hbmFnZXIuZ2V0QnJva2VyKCkuZ2V0U3RhdGVNYW5hZ2VyKHBjKTsKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIGludG9QQyA9IChpbnRvID09IG51bGwpID8gbnVsbAorICAgICAgICAgICAgOiBpbnRvLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpOworICAgICAgICBpZiAodm1kLmlzRW1iZWRkZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLmF0dGFjaChwYywgaW50b1BDLCBzbSwgdm1kLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBtYW5hZ2VyLmF0dGFjaChwYywgaW50b1BDLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBnaXZlbiBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdFtdIGF0dGFjaEluUGxhY2UoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBTdGF0ZU1hbmFnZXJJbXBsIHNtLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCwgT2JqZWN0W10gYXJyKSB7CisgICAgICAgIGlmIChhcnIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXJyW2ldID0gYXR0YWNoSW5QbGFjZShtYW5hZ2VyLCBzbSwgZm1kLmdldEVsZW1lbnQoKSwgYXJyW2ldKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggdGhlIGdpdmVuIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGF0dGFjaEluUGxhY2UoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLAorICAgICAgICBTdGF0ZU1hbmFnZXJJbXBsIHNtLCBGaWVsZE1ldGFEYXRhIGZtZCwgQ29sbGVjdGlvbiBjb2xsKSB7CisgICAgICAgIGlmIChjb2xsID09IG51bGwgfHwgY29sbC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gY29sbDsKKworICAgICAgICAvLyBjb3B5IGlmIGVsZW1lbnRzIGVtYmVkZGVkIG9yIGNvbnRhaW5zIGRldGFjaGVkLCB3aGljaCB3aWxsIG1lYW4KKyAgICAgICAgLy8gd2UnbGwgaGF2ZSB0byBjb3B5IHRoZSBleGlzdGluZyBlbGVtZW50cworICAgICAgICBDb2xsZWN0aW9uIGNvcHkgPSBudWxsOworICAgICAgICBpZiAoZm1kLmdldEVsZW1lbnQoKS5pc0VtYmVkZGVkKCkpCisgICAgICAgICAgICBjb3B5ID0gKENvbGxlY3Rpb24pIHNtLm5ld0ZpZWxkUHJveHkoZm1kLmdldEluZGV4KCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY29sbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VyLmdldEJyb2tlcigpLmlzRGV0YWNoZWQoaXRyLm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IChDb2xsZWN0aW9uKSBzbS5uZXdGaWVsZFByb3h5KGZtZC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IGF0dGFjaGVkOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbGwuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkID0gYXR0YWNoSW5QbGFjZShtYW5hZ2VyLCBzbSwgZm1kLmdldEVsZW1lbnQoKSwKKyAgICAgICAgICAgICAgICBpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIGlmIChjb3B5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29weS5hZGQoYXR0YWNoZWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY29weSA9PSBudWxsKSA/IGNvbGwgOiBjb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCB0aGUgZ2l2ZW4gbWFwLgorICAgICAqLworICAgIHByaXZhdGUgTWFwIGF0dGFjaEluUGxhY2UoQXR0YWNoTWFuYWdlciBtYW5hZ2VyLCBTdGF0ZU1hbmFnZXJJbXBsIHNtLAorICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCwgTWFwIG1hcCkgeworICAgICAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisKKyAgICAgICAgTWFwIGNvcHkgPSBudWxsOworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGJvb2xlYW4ga2V5UEMgPSBmbWQuZ2V0S2V5KCkuaXNEZWNsYXJlZFR5cGVQQygpOworICAgICAgICBib29sZWFuIHZhbFBDID0gZm1kLmdldEVsZW1lbnQoKS5pc0RlY2xhcmVkVHlwZVBDKCk7CisKKyAgICAgICAgLy8gY29weSBpZiBlbWJlZGRlZCBwY3Mgb3IgZGV0YWNoZWQgcGNzLCB3aGljaCB3aWxsIHJlcXVpcmUgdXMgdG8KKyAgICAgICAgLy8gY29weSBlbGVtZW50cworICAgICAgICBpZiAoZm1kLmdldEtleSgpLmlzRW1iZWRkZWRQQygpIHx8IGZtZC5nZXRFbGVtZW50KCkuaXNFbWJlZGRlZFBDKCkpCisgICAgICAgICAgICBjb3B5ID0gKE1hcCkgc20ubmV3RmllbGRQcm94eShmbWQuZ2V0SW5kZXgoKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGtleVBDICYmIG1hbmFnZXIuZ2V0QnJva2VyKCkuaXNEZXRhY2hlZChlbnRyeS5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgICAgIHx8ICh2YWxQQyAmJiBtYW5hZ2VyLmdldEJyb2tlcigpLmlzRGV0YWNoZWQKKyAgICAgICAgICAgICAgICAgICAgKGVudHJ5LmdldFZhbHVlKCkpKSkgeworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gKE1hcCkgc20ubmV3RmllbGRQcm94eShmbWQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBrZXksIHZhbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAoa2V5UEMpCisgICAgICAgICAgICAgICAga2V5ID0gYXR0YWNoSW5QbGFjZShtYW5hZ2VyLCBzbSwgZm1kLmdldEtleSgpLCBrZXkpOworICAgICAgICAgICAgdmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICh2YWxQQykKKyAgICAgICAgICAgICAgICB2YWwgPSBhdHRhY2hJblBsYWNlKG1hbmFnZXIsIHNtLCBmbWQuZ2V0RWxlbWVudCgpLCB2YWwpOworICAgICAgICAgICAgaWYgKGNvcHkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb3B5LnB1dChrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjb3B5ID09IG51bGwpID8gbWFwIDogY29weTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9WZXJzaW9uTG9ja01hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1ZlcnNpb25Mb2NrTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWQxNWMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9WZXJzaW9uTG9ja01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICoge0BsaW5rIExvY2tNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHByb3ZpZGVzIHN1cHBvcnQKKyAqIGZvciB2ZXJzaW9uIGNoZWNraW5nIGFuZCB2ZXJzaW9uIHVwZGF0aW5nIHdoZW4gbG9ja3MgYXJlIGFjcXVpcmVkLgorICogVGhpcyBsb2NrIG1hbmFnZXIgbWF5IGJlIHVzZWQgc3RhbmRhbG9uZSBvciBleHRlbmRlZCBmb3IgYWRkaXRpb25hbCBsb2NraW5nLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK3B1YmxpYyBjbGFzcyBWZXJzaW9uTG9ja01hbmFnZXIKKyAgICBleHRlbmRzIEFic3RyYWN0TG9ja01hbmFnZXIgeworCisgICAgcHJpdmF0ZSBib29sZWFuIF92ZXJzaW9uQ2hlY2tPblJlYWRMb2NrID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3ZlcnNpb25VcGRhdGVPbldyaXRlTG9jayA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBpbnN0YW5jZSdzIGxvY2sgbGV2ZWwsIGFzc3VtaW5nIHRoYXQgdGhlIHN0YXRlJ3MKKyAgICAgKiBsb2NrIG9iamVjdCBpcyBhIG51bWJlci4gSWYgdGhlIGdpdmVuIGluc3RhbmNlIGlzIGVtYmVkZGVkLCB0cmF2ZXJzZXMKKyAgICAgKiB0byBpdHMgb3duZXIuIE92ZXJyaWRlIGlmIGxvY2sgaXMgbm90IHN0b3JlZCBhcyBhIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2tMZXZlbChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIHdoaWxlIChzbS5nZXRPd25lcigpICE9IG51bGwpCisgICAgICAgICAgICBzbSA9IHNtLmdldE93bmVyKCk7CisgICAgICAgIE51bWJlciBsZXZlbCA9IChOdW1iZXIpIHNtLmdldExvY2soKTsKKyAgICAgICAgcmV0dXJuIChsZXZlbCA9PSBudWxsKSA/IExPQ0tfTk9ORSA6IGxldmVsLmludFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZ2l2ZW4gaW5zdGFuY2UncyBsb2NrIGxldmVsIHRvIHRoZSBnaXZlbiBudW1iZXIuIE92ZXJyaWRlCisgICAgICogdG8gc3RvcmUgc29tZXRoaW5nIGVsc2UgYXMgdGhlIGxvY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0TG9ja0xldmVsKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBsZXZlbCkgeworICAgICAgICBzbS5zZXRMb2NrKE51bWJlcnMudmFsdWVPZihsZXZlbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE51bGxzIGdpdmVuIGluc3RhbmNlJ3MgbG9jayBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZShPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIHNtLnNldExvY2sobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHtAbGluayAjbG9ja0ludGVybmFsfSBhZnRlciB0cmF2ZXJzaW5nIHRvIG93bmluZworICAgICAqIGluc3RhbmNlIChpZiBlbWJlZGRlZCkgYW5kIGFzc3VyaW5nIHRoYXQgdGhlIGluc3RhbmNlIGlzIHBlcnNpc3RlbnQsCisgICAgICogaXMgbm90IG5ldywgYW5kIGlzIG5vdCBhbHJlYWR5IGxvY2tlZCBhdCBhIGhpZ2hlciBsZXZlbC4gQWZ0ZXIKKyAgICAgKiBsb2NraW5nLCBjYWxscyB7QGxpbmsgI3NldExvY2tMZXZlbH0gd2l0aCB0aGUgZ2l2ZW4gbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9jayhPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBpbnQgbGV2ZWwsIGludCB0aW1lb3V0LAorICAgICAgICBPYmplY3Qgc2RhdGEpIHsKKyAgICAgICAgaWYgKGxldmVsID09IExPQ0tfTk9ORSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgd2hpbGUgKHNtLmdldE93bmVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNtID0gc20uZ2V0T3duZXIoKTsKKyAgICAgICAgaW50IG9sZExldmVsID0gZ2V0TG9ja0xldmVsKHNtKTsKKyAgICAgICAgaWYgKCFzbS5pc1BlcnNpc3RlbnQoKSB8fCBzbS5pc05ldygpIHx8IGxldmVsIDw9IG9sZExldmVsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrSW50ZXJuYWwoc20sIGxldmVsLCB0aW1lb3V0LCBzZGF0YSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIC8vIHJldmVydCBsb2NrCisgICAgICAgICAgICBzZXRMb2NrTGV2ZWwoc20sIG9sZExldmVsKTsKKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhlIGluc3RhbmNlJ3MgdHJhbnNhY3Rpb25hbCBzdGF0dXMgaW4gYWNjb3JkYW5jZSB3aXRoCisgICAgICogdGhlIHNldHRpbmdzIG9mIHtAbGluayAjZ2V0VmVyc2lvbkNoZWNrT25SZWFkTG9ja30KKyAgICAgKiBhbmQge0BsaW5rICNnZXRWZXJzaW9uVXBkYXRlT25Xcml0ZUxvY2t9LiBPdmVycmlkZSB0byBwZXJmb3JtCisgICAgICogYWRkaXRpb25hbCBsb2NraW5nLgorICAgICAqCisgICAgICogQHNlZSBTdG9yZUNvbnRleHQjdHJhbnNhY3Rpb25hbAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvY2tJbnRlcm5hbChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBpbnQgbGV2ZWwsIGludCB0aW1lb3V0LAorICAgICAgICBPYmplY3Qgc2RhdGEpIHsKKyAgICAgICAgLy8gU2V0IGxvY2sgbGV2ZWwgZmlyc3QgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gd2l0aAorICAgICAgICAvLyB0cmFuc2FjdGlvbmFsKC4uKSBjYWxsCisgICAgICAgIHNldExvY2tMZXZlbChzbSwgbGV2ZWwpOworICAgICAgICBpZiAobGV2ZWwgPj0gTG9ja0xldmVscy5MT0NLX1dSSVRFICYmIF92ZXJzaW9uVXBkYXRlT25Xcml0ZUxvY2spCisgICAgICAgICAgICBnZXRDb250ZXh0KCkudHJhbnNhY3Rpb25hbChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwgdHJ1ZSwgbnVsbCk7CisgICAgICAgIGVsc2UgaWYgKGxldmVsID49IExvY2tMZXZlbHMuTE9DS19SRUFEICYmIF92ZXJzaW9uQ2hlY2tPblJlYWRMb2NrKQorICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnRyYW5zYWN0aW9uYWwoc20uZ2V0TWFuYWdlZEluc3RhbmNlKCksIGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgZm9yY2UgYSB2ZXJzaW9uIGNoZWNrIGF0IGNvbW1pdAorICAgICAqIHRpbWUgd2hlbiBhIHJlYWQgbG9jayBpcyByZXF1ZXN0ZWQgaW4gb3JkZXIgdG8gdmVyaWZ5IHJlYWQKKyAgICAgKiBjb25zaXN0ZW5jeS4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uQ2hlY2tPblJlYWRMb2NrKGJvb2xlYW4gdmVyc2lvbkNoZWNrT25SZWFkTG9jaykgeworICAgICAgICBfdmVyc2lvbkNoZWNrT25SZWFkTG9jayA9IHZlcnNpb25DaGVja09uUmVhZExvY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGZvcmNlIGEgdmVyc2lvbiBjaGVjayBhdCBjb21taXQKKyAgICAgKiB0aW1lIHdoZW4gYSByZWFkIGxvY2sgaXMgcmVxdWVzdGVkIGluIG9yZGVyIHRvIHZlcmlmeSByZWFkCisgICAgICogY29uc2lzdGVuY3kuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VmVyc2lvbkNoZWNrT25SZWFkTG9jaygpIHsKKyAgICAgICAgcmV0dXJuIF92ZXJzaW9uQ2hlY2tPblJlYWRMb2NrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBmb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHZlcnNpb24gYXQgY29tbWl0CisgICAgICogdGltZSB3aGVuIGEgd3JpdGUgbG9jayBpcyByZXF1ZXN0ZWQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvblVwZGF0ZU9uV3JpdGVMb2NrKGJvb2xlYW4gdmVyc2lvblVwZGF0ZU9uV3JpdGVMb2NrKSB7CisgICAgICAgIF92ZXJzaW9uVXBkYXRlT25Xcml0ZUxvY2sgPSB2ZXJzaW9uVXBkYXRlT25Xcml0ZUxvY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgdmVyc2lvbiBhdCBjb21taXQKKyAgICAgKiB0aW1lIHdoZW4gYSB3cml0ZSBsb2NrIGlzIHJlcXVlc3RlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJzaW9uVXBkYXRlT25Xcml0ZUxvY2soKSB7CisgICAgICAgIHJldHVybiBfdmVyc2lvblVwZGF0ZU9uV3JpdGVMb2NrOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWJzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0Ficy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTEyMDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0Ficy5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogVGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBudW1iZXIuCisgKi8KK2NsYXNzIEFicworICAgIGV4dGVuZHMgVW5hcnlNYXRoVmFsIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSBudW1iZXIgd2hvc2UgYWJzb2x1dGUgdmFsdWUgdG8gY2FsY3VsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBBYnMoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgQ2xhc3Mgd3JhcCA9IEZpbHRlcnMud3JhcChjKTsKKyAgICAgICAgaWYgKHdyYXAgPT0gSW50ZWdlci5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBGbG9hdC5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBEb3VibGUuY2xhc3MKKyAgICAgICAgICAgIHx8IHdyYXAgPT0gTG9uZy5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgICAgICB8fCB3cmFwID09IEJpZ0ludGVnZXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gRmlsdGVycy51bndyYXAoYyk7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBvcGVyYXRlKE9iamVjdCBvLCBDbGFzcyBjKSB7CisgICAgICAgIGMgPSBGaWx0ZXJzLndyYXAoYyk7CisgICAgICAgIGlmIChjID09IEludGVnZXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKE1hdGguYWJzKCgoTnVtYmVyKSBvKS5pbnRWYWx1ZSgpKSk7CisgICAgICAgIGlmIChjID09IEZsb2F0LmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChNYXRoLmFicygoKE51bWJlcikgbykuZmxvYXRWYWx1ZSgpKSk7CisgICAgICAgIGlmIChjID09IERvdWJsZS5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKE1hdGguYWJzKCgoTnVtYmVyKSBvKS5kb3VibGVWYWx1ZSgpKSk7CisgICAgICAgIGlmIChjID09IExvbmcuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKE1hdGguYWJzKCgoTnVtYmVyKSBvKS5sb25nVmFsdWUoKSkpOworICAgICAgICBpZiAoYyA9PSBCaWdEZWNpbWFsLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuICgoQmlnRGVjaW1hbCkgbykuYWJzKCk7CisgICAgICAgIGlmIChjID09IEJpZ0ludGVnZXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gKChCaWdJbnRlZ2VyKSBvKS5hYnMoKTsKKworICAgICAgICAvLyBkZWZhdWx0IHRvIGludAorICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKE1hdGguYWJzKCgoTnVtYmVyKSBvKS5pbnRWYWx1ZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BYnN0cmFjdEV4cHJlc3Npb25CdWlsZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0Fic3RyYWN0RXhwcmVzc2lvbkJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzgzNmFiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BYnN0cmFjdEV4cHJlc3Npb25CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdG8gaGVscCBidWlsZCBleHByZXNzaW9ucy4gUHJvdmlkZXMKKyAqIGdlbmVyaWMgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc3VwcG9ydCBmb3IgdmFyaWFibGUgcmVzb2x1dGlvbiwKKyAqIHBhdGggdHJhdmVyc2FsLCBhbmQgZXJyb3IgbWVzc2FnZXMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhwcmVzc2lvbkJ1aWxkZXIgeworCisgICAgLy8gdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFWF9VU0VSID0gMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFWF9GQVRBTCA9IDE7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVhfVU5TVVBQT1JURUQgPSAyOworCisgICAgLy8gY29tbW9uIGltcGxpY2l0IHR5cGUgc2V0dGluZ3MKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIFRZUEVfT0JKRUNUID0gT2JqZWN0LmNsYXNzOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgVFlQRV9TVFJJTkcgPSBTdHJpbmcuY2xhc3M7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBUWVBFX0NIQVJfT0JKID0gQ2hhcmFjdGVyLmNsYXNzOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgVFlQRV9OVU1CRVIgPSBOdW1iZXIuY2xhc3M7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBUWVBFX0NPTExFQ1RJT04gPSBDb2xsZWN0aW9uLmNsYXNzOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgVFlQRV9NQVAgPSBNYXAuY2xhc3M7CisKKyAgICAvLyBjb250YWlucyB0eXBlcyBmb3Igc2V0SW1wbGljaXRUeXBlcworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5TX1RZUEVfRUxFTUVOVCA9IDE7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTlNfVFlQRV9LRVkgPSAyOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5TX1RZUEVfVkFMVUUgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQWJzdHJhY3RFeHByZXNzaW9uQnVpbGRlci5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVzb2x2ZXIgcmVzb2x2ZXI7CisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb25GYWN0b3J5IGZhY3Rvcnk7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldCBfYWNjZXNzUGF0aCA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBNYXAgX3NlZW5WYXJzID0gbnVsbDsKKyAgICBwcml2YXRlIFNldCBfYm91bmRWYXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgdGhlIGV4cHJlc3Npb24gZmFjdG9yeSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgdXNlZCB0byByZXNvbHZlIHZhcmlhYmxlcywgcGFyYW1ldGVycywgYW5kIGNsYXNzCisgICAgICogbmFtZXMgdXNlZCBpbiB0aGUgcXVlcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RFeHByZXNzaW9uQnVpbGRlcihFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICBSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlc29sdmluZworICAgICAqIGNsYXNzIG5hbWVzIChpbiBhZGRpdGlvbiB0byB0aGUgcmVzb2x2ZXIgaW4gdGhlIHF1ZXJ5KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHByb3BlciBwYXJzZSBleGNlcHRpb24gZm9yIHRoZSBnaXZlbiByZWFzb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIE9wZW5KUEFFeGNlcHRpb24gcGFyc2VFeGNlcHRpb24oaW50IGUsIFN0cmluZyB0b2tlbiwKKyAgICAgICAgT2JqZWN0W10gYXJncywKKyAgICAgICAgRXhjZXB0aW9uIG5lc3QpIHsKKyAgICAgICAgU3RyaW5nIGFyZ1N0cjsKKyAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkKKyAgICAgICAgICAgIGFyZ1N0ciA9IGdldExvY2FsaXplcigpLmdldCh0b2tlbikuZ2V0TWVzc2FnZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcmdTdHIgPSBnZXRMb2NhbGl6ZXIoKS5nZXQodG9rZW4sIGFyZ3MpLmdldE1lc3NhZ2UoKTsKKworICAgICAgICBNZXNzYWdlIG1zZyA9IF9sb2MuZ2V0KCJwYXJzZS1lcnJvciIsIGFyZ1N0ciwgY3VycmVudFF1ZXJ5KCkpOworCisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICAgICAgY2FzZSBFWF9GQVRBTDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24obXNnLCBuZXN0KTsKKyAgICAgICAgICAgIGNhc2UgRVhfVU5TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKG1zZywgbmVzdCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKG1zZywgbmVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgc3BlY2lmaWVkIG1ldGFkYXRhIGFzIGJlaW5nIGluIHRoZSBxdWVyeSdzIGFjY2VzcyBwYXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIGFkZEFjY2Vzc1BhdGgoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIF9hY2Nlc3NQYXRoLmFkZChtZXRhKTsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWNvcmRlZCBxdWVyeSBhY2Nlc3MgcGF0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NNZXRhRGF0YVtdIGdldEFjY2Vzc1BhdGgoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NNZXRhRGF0YVtdKSBfYWNjZXNzUGF0aC50b0FycmF5CisgICAgICAgICAgICAobmV3IENsYXNzTWV0YURhdGFbX2FjY2Vzc1BhdGguc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhcmlhYmxlIGhhcyBiZWVuIGJvdW5kLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQm91bmQoVmFsdWUgdmFyKSB7CisgICAgICAgIHJldHVybiBfYm91bmRWYXJzICE9IG51bGwgJiYgX2JvdW5kVmFycy5jb250YWlucyh2YXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGF0IHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBib3VuZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kKFZhbHVlIHZhcikgeworICAgICAgICBpZiAoX2JvdW5kVmFycyA9PSBudWxsKQorICAgICAgICAgICAgX2JvdW5kVmFycyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIF9ib3VuZFZhcnMuYWRkKHZhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4gaWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlIGdldFZhcmlhYmxlKFN0cmluZyBpZCwgYm9vbGVhbiBiaW5kKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBhbHJlYWR5IGNvbnN0cnVjdGVkIHZhcgorICAgICAgICBpZiAoaXNTZWVuVmFyaWFibGUoaWQpKQorICAgICAgICAgICAgcmV0dXJuIChWYWx1ZSkgX3NlZW5WYXJzLmdldChpZCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBjYWNoZSB2YXIKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGdldERlY2xhcmVkVmFyaWFibGVUeXBlKGlkKTsKKworICAgICAgICAvLyBhZGQgdGhpcyB0eXBlIHRvIHRoZSBzZXQgb2YgY2xhc3NlcyBpbiB0aGUgZmlsdGVyJ3MgYWNjZXNzIHBhdGgKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gbnVsbDsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHR5cGUgPSBUWVBFX09CSkVDVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWV0YSA9IGdldE1ldGFEYXRhKHR5cGUsIGZhbHNlKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkKKyAgICAgICAgICAgIF9hY2Nlc3NQYXRoLmFkZChtZXRhKTsKKworICAgICAgICBWYWx1ZSB2YXI7CisgICAgICAgIGlmIChiaW5kKQorICAgICAgICAgICAgdmFyID0gZmFjdG9yeS5uZXdCb3VuZFZhcmlhYmxlKGlkLCB0eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFyID0gZmFjdG9yeS5uZXdVbmJvdW5kVmFyaWFibGUoaWQsIHR5cGUpOworICAgICAgICB2YXIuc2V0TWV0YURhdGEobWV0YSk7CisKKyAgICAgICAgaWYgKF9zZWVuVmFycyA9PSBudWxsKQorICAgICAgICAgICAgX3NlZW5WYXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgX3NlZW5WYXJzLnB1dChpZCwgdmFyKTsKKyAgICAgICAgcmV0dXJuIHZhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGF0IGFsbCB1bmJvdW5kIHZhcmlhYmxlcyBhcmUgb2YgYSBQQyB0eXBlLiBJZiBub3QsIGFzc3VtZQorICAgICAqIHRoYXQgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSBhIHR5cG8gdGhhdCB3ZSB0b29rIGZvciBhbiBpbXBsaWNpdAorICAgICAqIHVuYm91bmQgdmFyaWFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VW5ib3VuZFZhcmlhYmxlc1ZhbGlkKCkgeworICAgICAgICBpZiAoX3NlZW5WYXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBWYWx1ZSB2YXI7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX3NlZW5WYXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIHZhciA9IChWYWx1ZSkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICh2YXIuZ2V0TWV0YURhdGEoKSA9PSBudWxsICYmICFpc0JvdW5kKHZhcikKKyAgICAgICAgICAgICAgICAmJiAhaXNEZWNsYXJlZFZhcmlhYmxlKChTdHJpbmcpIGVudHJ5LmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKEVYX1VTRVIsICJub3QtdW5ib3VuZC12YXIiLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGVudHJ5LmdldEtleSgpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUgbmFtZSBoYXMgYmVlbiBleHBsaWNpdGx5CisgICAgICogZGVjbGFyZWQuIE5vdGUgYWxsIHF1ZXJ5IGxhbmd1YWdlcyBuZWNlc3NhcmlseSBzdXBwb3J0IGRlY2xhcmluZworICAgICAqIHZhcmlhYmxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCB0aGUgdmFyaWFibGUgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhcmlhYmUgaGFzIGJlZW4gZXhwbGljaXRlbHkgZGVjbGFyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0RlY2xhcmVkVmFyaWFibGUoU3RyaW5nIGlkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBpZCBoYXMgYmVlbiB1c2VkIGFzIGEgdmFyaWFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWVuVmFyaWFibGUoU3RyaW5nIGlkKSB7CisgICAgICAgIHJldHVybiBfc2VlblZhcnMgIT0gbnVsbCAmJiBfc2VlblZhcnMuY29udGFpbnNLZXkoaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKENsYXNzIGMsIGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhKGMsIHJlcXVpcmVkLCBnZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YShDbGFzcyBjLCBib29sZWFuIHJlcXVpcmVkLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0TWV0YURhdGEoYywgbG9hZGVyLCByZXF1aXJlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBnaXZlbiBwYXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBWYWx1ZSB0cmF2ZXJzZVBhdGgoUGF0aCBwYXRoLCBTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIHRyYXZlcnNlUGF0aChwYXRoLCBmaWVsZCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmF2ZXJzZSB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIGdpdmVuIHBhdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlIHRyYXZlcnNlUGF0aChQYXRoIHBhdGgsIFN0cmluZyBmaWVsZCwgYm9vbGVhbiBwY09ubHksCisgICAgICAgIGJvb2xlYW4gYWxsb3dOdWxsKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IHBhdGguZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKEVYX1VTRVIsICJwYXRoLW5vLW1ldGEiLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgZmllbGQsIHBhdGguZ2V0VHlwZSgpIH0sIG51bGwpOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gbWV0YS5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHRyYXZlcnNlU3RhdGljRmllbGQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksIGZpZWxkKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAibm8tZmllbGQiLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCBmaWVsZCB9LCBudWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubmV3TGl0ZXJhbCh2YWwsIExpdGVyYWwuVFlQRV9VTktOT1dOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbWQuaXNFbWJlZGRlZCgpKQorICAgICAgICAgICAgbWV0YSA9IGZtZC5nZXRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1ldGEgPSBmbWQuZ2V0RGVjbGFyZWRUeXBlTWV0YURhdGEoKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkQWNjZXNzUGF0aChtZXRhKTsKKyAgICAgICAgICAgIHBhdGguc2V0TWV0YURhdGEobWV0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSAhPSBudWxsIHx8ICFwY09ubHkpCisgICAgICAgICAgICBwYXRoLmdldChmbWQsIGFsbG93TnVsbCk7CisKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29uc3RhbnQgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHN0YXRpYyBmaWVsZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYXZlcnNlU3RhdGljRmllbGQoQ2xhc3MgY2xzLCBTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0RmllbGQoZmllbGQpLmdldChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNvdW50IG5vdCBsb2NhdGUgdGhlIGZpZWxkOiByZXR1cm4gbnVsbAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBuYW1lZCB2YXJpYWJlIGlmIGl0IGhhcyBiZWVuIGRlY2xhcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDbGFzcyBnZXREZWNsYXJlZFZhcmlhYmxlVHlwZShTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGltcGxpY2l0IHR5cGVzIG9mIHRoZSBnaXZlbiB2YWx1ZXMgYmFzZWQgb24gdGhlIGZhY3QgdGhhdAorICAgICAqIHRoZXkncmUgdXNlZCB0b2dldGhlciwgYW5kIGJhc2VkIG9uIHRoZSBvcGVyYXRvciB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEltcGxpY2l0VHlwZXMoVmFsdWUgdmFsMSwgVmFsdWUgdmFsMiwKKyAgICAgICAgQ2xhc3MgZXhwZWN0ZWQpIHsKKyAgICAgICAgQ2xhc3MgYzEgPSB2YWwxLmdldFR5cGUoKTsKKyAgICAgICAgQ2xhc3MgYzIgPSB2YWwyLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBvMSA9IGMxID09IFRZUEVfT0JKRUNUOworICAgICAgICBib29sZWFuIG8yID0gYzIgPT0gVFlQRV9PQkpFQ1Q7CisKKyAgICAgICAgaWYgKG8xICYmICFvMikgeworICAgICAgICAgICAgdmFsMS5zZXRJbXBsaWNpdFR5cGUoYzIpOworICAgICAgICAgICAgaWYgKHZhbDEuZ2V0TWV0YURhdGEoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHZhbDEuc2V0TWV0YURhdGEodmFsMi5nZXRNZXRhRGF0YSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICghbzEgJiYgbzIpIHsKKyAgICAgICAgICAgIHZhbDIuc2V0SW1wbGljaXRUeXBlKGMxKTsKKyAgICAgICAgICAgIGlmICh2YWwyLmdldE1ldGFEYXRhKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWwyLnNldE1ldGFEYXRhKHZhbDEuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobzEgJiYgbzIgJiYgZXhwZWN0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gd2UgbmV2ZXIgZXhwZWN0IGEgcGMgdHlwZSwgc28gZG9uJ3QgYm90aGVyIHdpdGggbWV0YWRhdGEKKyAgICAgICAgICAgIHZhbDEuc2V0SW1wbGljaXRUeXBlKGV4cGVjdGVkKTsKKyAgICAgICAgICAgIHZhbDIuc2V0SW1wbGljaXRUeXBlKGV4cGVjdGVkKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc051bWVyaWModmFsMS5nZXRUeXBlKCkpICE9IGlzTnVtZXJpYyh2YWwyLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29tcGF0aWJpbGl0eUluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgZ2V0UXVvdGVkTnVtYmVyc0luUXVlcmllcygpKQorICAgICAgICAgICAgICAgIGNvbnZlcnRUeXBlc1F1b3RlZE51bWJlcnModmFsMSwgdmFsMik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udmVydFR5cGVzKHZhbDEsIHZhbDIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBjb252ZXJzaW9ucyB0byBtYWtlIHZhbHVlcyBjb21wYXRpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb252ZXJ0VHlwZXMoVmFsdWUgdmFsMSwgVmFsdWUgdmFsMikgeworICAgICAgICBDbGFzcyB0MSA9IHZhbDEuZ2V0VHlwZSgpOworICAgICAgICBDbGFzcyB0MiA9IHZhbDIuZ2V0VHlwZSgpOworCisgICAgICAgIC8vIGFsbG93IHN0cmluZy10by1jaGFyIGNvbnZlcnNpb25zCisgICAgICAgIGlmICh0MSA9PSBUWVBFX1NUUklORyAmJiAoRmlsdGVycy53cmFwKHQyKSA9PSBUWVBFX0NIQVJfT0JKCisgICAgICAgICAgICAmJiAhKHZhbDIgaW5zdGFuY2VvZiBQYXRoKSkpIHsKKyAgICAgICAgICAgIHZhbDIuc2V0SW1wbGljaXRUeXBlKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHQyID09IFRZUEVfU1RSSU5HICYmIChGaWx0ZXJzLndyYXAodDEpID09IFRZUEVfQ0hBUl9PQkopCisgICAgICAgICAgICAmJiAhKHZhbDEgaW5zdGFuY2VvZiBQYXRoKSkgeworICAgICAgICAgICAgdmFsMS5zZXRJbXBsaWNpdFR5cGUoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBub24tbnVtZXJpYyBzaWRlIGlzIGEgc3RyaW5nIG9mIGxlbmd0aCAxLCBjYXN0IGl0CisgICAgICAgIC8vIHRvIGEgY2hhcmFjdGVyCisgICAgICAgIGlmICh0MSA9PSBUWVBFX1NUUklORyAmJiB2YWwxIGluc3RhbmNlb2YgTGl0ZXJhbAorICAgICAgICAgICAgJiYgKChTdHJpbmcpICgoTGl0ZXJhbCkgdmFsMSkuZ2V0VmFsdWUoKSkubGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgdmFsMS5zZXRJbXBsaWNpdFR5cGUoQ2hhcmFjdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodDIgPT0gVFlQRV9TVFJJTkcgJiYgdmFsMiBpbnN0YW5jZW9mIExpdGVyYWwKKyAgICAgICAgICAgICYmICgoU3RyaW5nKSAoKExpdGVyYWwpIHZhbDIpLmdldFZhbHVlKCkpLmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgIHZhbDIuc2V0SW1wbGljaXRUeXBlKENoYXJhY3Rlci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBlcnJvcgorICAgICAgICBTdHJpbmcgbGVmdDsKKyAgICAgICAgU3RyaW5nIHJpZ2h0OworICAgICAgICBpZiAodmFsMSBpbnN0YW5jZW9mIFBhdGggJiYgKChQYXRoKSB2YWwxKS5sYXN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGxlZnQgPSBfbG9jLmdldCgibm9uLW51bWVyaWMtcGF0aCIsICgoUGF0aCkgdmFsMSkubGFzdCgpLgorICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgdDEuZ2V0TmFtZSgpKS5nZXRNZXNzYWdlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlZnQgPSBfbG9jLmdldCgibm9uLW51bWVyaWMtdmFsdWUiLCB0MS5nZXROYW1lKCkpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKHZhbDIgaW5zdGFuY2VvZiBQYXRoICYmICgoUGF0aCkgdmFsMikubGFzdCgpICE9IG51bGwpCisgICAgICAgICAgICByaWdodCA9IF9sb2MuZ2V0KCJub24tbnVtZXJpYy1wYXRoIiwgKChQYXRoKSB2YWwyKS5sYXN0KCkuCisgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLCB0Mi5nZXROYW1lKCkpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmlnaHQgPSBfbG9jLmdldCgibm9uLW51bWVyaWMtdmFsdWUiLCB0Mi5nZXROYW1lKCkpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vbi1udW1lcmljLWNvbXBhcmlzb24iLAorICAgICAgICAgICAgbGVmdCwgcmlnaHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGNvbnZlcnNpb25zIHRvIG1ha2UgdmFsdWVzIGNvbXBhdGlibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbnZlcnRUeXBlc1F1b3RlZE51bWJlcnMoVmFsdWUgdmFsMSwgVmFsdWUgdmFsMikgeworICAgICAgICBDbGFzcyB0MSA9IHZhbDEuZ2V0VHlwZSgpOworICAgICAgICBDbGFzcyB0MiA9IHZhbDIuZ2V0VHlwZSgpOworCisgICAgICAgIC8vIGlmIHdlJ3JlIGNvbXBhcmluZyB0byBhIHNpbmdsZS1xdW90ZWQgc3RyaW5nLCBjb252ZXJ0CisgICAgICAgIC8vIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIDMuMSBydWxlcy4KKyAgICAgICAgaWYgKHQxID09IFRZUEVfU1RSSU5HICYmIHZhbDEgaW5zdGFuY2VvZiBMaXRlcmFsCisgICAgICAgICAgICAmJiAoKExpdGVyYWwpIHZhbDEpLmdldFBhcnNlVHlwZSgpID09IExpdGVyYWwuVFlQRV9TUV9TVFJJTkcpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgKChMaXRlcmFsKSB2YWwxKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgKChMaXRlcmFsKSB2YWwxKS5zZXRWYWx1ZShzLnN1YnN0cmluZygwLCAxKSk7CisgICAgICAgICAgICAgICAgdmFsMS5zZXRJbXBsaWNpdFR5cGUoQ2hhcmFjdGVyLlRZUEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0MiA9PSBUWVBFX1NUUklORyAmJiB2YWwyIGluc3RhbmNlb2YgTGl0ZXJhbAorICAgICAgICAgICAgJiYgKChMaXRlcmFsKSB2YWwyKS5nZXRQYXJzZVR5cGUoKSA9PSBMaXRlcmFsLlRZUEVfU1FfU1RSSU5HKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpICgoTGl0ZXJhbCkgdmFsMikuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICgoTGl0ZXJhbCkgdmFsMikuc2V0VmFsdWUocy5zdWJzdHJpbmcoMCwgMSkpOworICAgICAgICAgICAgICAgIHZhbDIuc2V0SW1wbGljaXRUeXBlKENoYXJhY3Rlci5UWVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlJ3JlIGNvbXBhcmluZyB0byBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nLCBjb252ZXJ0IHRoZQorICAgICAgICAvLyB2YWx1ZSBkaXJlY3RseSB0byBhIG51bWJlcgorICAgICAgICBpZiAodDEgPT0gVFlQRV9TVFJJTkcgJiYgdmFsMSBpbnN0YW5jZW9mIExpdGVyYWwKKyAgICAgICAgICAgICYmICgoTGl0ZXJhbCkgdmFsMSkuZ2V0UGFyc2VUeXBlKCkgPT0gTGl0ZXJhbC5UWVBFX1NUUklORykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSAoKExpdGVyYWwpIHZhbDEpLmdldFZhbHVlKCk7CisgICAgICAgICAgICAoKExpdGVyYWwpIHZhbDEpLnNldFZhbHVlKFN0cmluZ3MucGFyc2UocywgRmlsdGVycy53cmFwKHQyKSkpOworICAgICAgICAgICAgdmFsMS5zZXRJbXBsaWNpdFR5cGUodDIpOworICAgICAgICB9CisgICAgICAgIGlmICh0MiA9PSBUWVBFX1NUUklORyAmJiB2YWwyIGluc3RhbmNlb2YgTGl0ZXJhbAorICAgICAgICAgICAgJiYgKChMaXRlcmFsKSB2YWwyKS5nZXRQYXJzZVR5cGUoKSA9PSBMaXRlcmFsLlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpICgoTGl0ZXJhbCkgdmFsMikuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICgoTGl0ZXJhbCkgdmFsMikuc2V0VmFsdWUoU3RyaW5ncy5wYXJzZShzLCBGaWx0ZXJzLndyYXAodDEpKSk7CisgICAgICAgICAgICB2YWwyLnNldEltcGxpY2l0VHlwZSh0MSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBjbGFzcyBjYW4gYmUgdXNlZCBhcyBhIG51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTnVtZXJpYyhDbGFzcyB0eXBlKSB7CisgICAgICAgIHR5cGUgPSBGaWx0ZXJzLndyYXAodHlwZSk7CisgICAgICAgIHJldHVybiBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKQorICAgICAgICAgICAgfHwgdHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSB8fCB0eXBlID09IFRZUEVfQ0hBUl9PQko7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbXBsaWNpdCB0eXBlcyBvZiB0aGUgZ2l2ZW4gdmFsdWVzIGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQKKyAgICAgKiB0aGUgZmlyc3QgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgc2Vjb25kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEltcGxpY2l0Q29udGFpbnNUeXBlcyhWYWx1ZSB2YWwxLCBWYWx1ZSB2YWwyLCBpbnQgb3ApIHsKKyAgICAgICAgaWYgKHZhbDEuZ2V0VHlwZSgpID09IFRZUEVfT0JKRUNUKSB7CisgICAgICAgICAgICBpZiAob3AgPT0gQ09OVEFJTlNfVFlQRV9FTEVNRU5UKQorICAgICAgICAgICAgICAgIHZhbDEuc2V0SW1wbGljaXRUeXBlKENvbGxlY3Rpb24uY2xhc3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbDEuc2V0SW1wbGljaXRUeXBlKE1hcC5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsMi5nZXRUeXBlKCkgPT0gVFlQRV9PQkpFQ1QgJiYgdmFsMSBpbnN0YW5jZW9mIFBhdGgpIHsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gKChQYXRoKSB2YWwxKS5sYXN0KCk7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgICAgICBpZiAoZm1kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAob3AgPT0gQ09OVEFJTlNfVFlQRV9FTEVNRU5UIHx8IG9wID09IENPTlRBSU5TX1RZUEVfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsMi5zZXRJbXBsaWNpdFR5cGUoZm1kLmdldEVsZW1lbnQoKS5nZXREZWNsYXJlZFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBmbWQuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbDIuc2V0TWV0YURhdGEobWV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRBY2Nlc3NQYXRoKG1ldGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsMi5zZXRJbXBsaWNpdFR5cGUoZm1kLmdldEtleSgpLmdldERlY2xhcmVkVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YSA9IGZtZC5nZXRLZXkoKS5nZXREZWNsYXJlZFR5cGVNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwyLnNldE1ldGFEYXRhKG1ldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWNjZXNzUGF0aChtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW1wbGljaXQgdHlwZSBvZiB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoVmFsdWUgdmFsLCBDbGFzcyBleHBlY3RlZCkgeworICAgICAgICAvLyB3ZSBuZXZlciBleHBlY3QgYSBwYyB0eXBlLCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG1ldGFkYXRhCisgICAgICAgIGlmICh2YWwuZ2V0VHlwZSgpID09IFRZUEVfT0JKRUNUKQorICAgICAgICAgICAgdmFsLnNldEltcGxpY2l0VHlwZShleHBlY3RlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBmb3Igb2J0YWluaW5nIHRoZSB7QGxpbmsgTG9jYWxpemVyfSB0byB1c2UgZm9yIHRyYW5zbGF0aW5nCisgICAgICogZXJyb3IgbWVzc2FnZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExvY2FsaXplciBnZXRMb2NhbGl6ZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RyaW5nIGJlaW5nIHBhcnNlZDsgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjdXJyZW50UXVlcnkgKCk7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWJzdHJhY3RFeHByZXNzaW9uVmlzaXRvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BYnN0cmFjdEV4cHJlc3Npb25WaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNDUwYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWJzdHJhY3RFeHByZXNzaW9uVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCisKKy8qKgorICogTm8tb3AgYWJzdHJhY3QgdmlzaXRvciBtZWFudCBmb3IgZWFzeSBleHRlbnNpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhwcmVzc2lvblZpc2l0b3IgCisgICAgaW1wbGVtZW50cyBFeHByZXNzaW9uVmlzaXRvciB7CisKKyAgICBwdWJsaWMgdm9pZCBlbnRlcihFeHByZXNzaW9uIGV4cCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4aXQoRXhwcmVzc2lvbiBleHApIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbnRlcihWYWx1ZSB2YWwpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGl0KFZhbHVlIHZhbCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWRkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FkZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTVhYTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FkZC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworCisvKioKKyAqIFZhbHVlIHByb2R1Y2VkIGJ5IHR3byB2YWx1ZXMgYmVpbmcgYWRkZWQgdG9nZXRoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQWRkCisgICAgZXh0ZW5kcyBNYXRoVmFsIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZXMgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyBBZGQoVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlcmF0ZShPYmplY3QgbzEsIENsYXNzIGMxLCBPYmplY3QgbzIsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmFkZChvMSwgYzEsIG8yLCBjMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BZ2dyZWdhdGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWdncmVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZmI4MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWdncmVnYXRlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogQSB2YWx1ZSBwcm9kdWNlZCBmcm9tIGV2YWx1YXRpbmcgYSByZXN1bHQgYWdncmVnYXRlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEFnZ3JlZ2F0ZQorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoQWdncmVnYXRlLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgQWdncmVnYXRlTGlzdGVuZXIgX2xpc3RlbmVyOworICAgIHByaXZhdGUgZmluYWwgVmFsIF9hcmc7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGFnZ3JlZ2F0ZSBsaXN0ZW5lciBhbmQgaXRzIGFyZ3VtZW50IHZhbHVlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIEFnZ3JlZ2F0ZShBZ2dyZWdhdGVMaXN0ZW5lciBsaXN0ZW5lciwgVmFsIGFyZykgeworICAgICAgICBfbGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgX2FyZyA9IGFyZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfbGlzdGVuZXIuZ2V0VHlwZShnZXRBcmdUeXBlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGNhbmRpZGF0ZSA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICAgICAgLy8gYWxsb3cgYWdncmVnYXRlcyB0byBiZSB1c2VkIGluIGZpbHRlciBleHByZXNzaW9ucyBzbyBsb25nIGFzIGEKKyAgICAgICAgLy8gY29sbGVjdGlvbiBpcyBwYXNzZWQgaW4KKyAgICAgICAgaWYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gZXZhbCgoQ29sbGVjdGlvbikgY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcykuCisgICAgICAgICAgICAgICAgaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJhZ2ctaW4tZmlsdGVyIikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGV2YWwoQ29sbGVjdGlvbiBjYW5kaWRhdGVzLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIENvbGxlY3Rpb24gYXJncyA9IG51bGw7CisgICAgICAgIGlmIChfYXJnICE9IG51bGwpCisgICAgICAgICAgICBhcmdzID0gX2FyZy5ldmFsKGNhbmRpZGF0ZXMsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgT2JqZWN0IGFnZyA9IF9saXN0ZW5lci5ldmFsdWF0ZShhcmdzLCBnZXRBcmdUeXBlcygpLCBjYW5kaWRhdGVzLAorICAgICAgICAgICAgY3R4KTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZ2cpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3NbXSBnZXRBcmdUeXBlcygpIHsKKyAgICAgICAgaWYgKF9hcmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoX2FyZyBpbnN0YW5jZW9mIEFyZ3MpCisgICAgICAgICAgICByZXR1cm4gKChBcmdzKSBfYXJnKS5nZXRUeXBlcygpOworICAgICAgICByZXR1cm4gbmV3IENsYXNzW117IF9hcmcuZ2V0VHlwZSgpIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBpZiAoX2FyZyAhPSBudWxsKQorICAgICAgICAgICAgX2FyZy5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWdncmVnYXRlTGlzdGVuZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWdncmVnYXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA1MWRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BZ2dyZWdhdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBBbiBhZ2dyZWdhdGUgbGlzdGVuZXIgYWdncmVnYXRlcyBkYXRhIHByb2R1Y2VkIGJ5IGFuIEV4cHJlc3Npb25RdWVyeS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGludGVyZmFjZSBBZ2dyZWdhdGVMaXN0ZW5lcgorICAgIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFnIHRoYXQgdGhpcyBsaXN0ZW5lciBsaXN0ZW5zIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBleHBlY3RzIHRvIGFjdCBvbiBhcmd1bWVudHMuIFNvbWUKKyAgICAgKiBmdW5jdGlvbiBtYXkgbm90IG5lZWQgYXJndW1lbnRzOyBmb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiB0byBjb3VudCB0aGUKKyAgICAgKiBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IG1hdGNoIGEgZ2l2ZW4gZmlsdGVyIG1pZ2h0IGJlIG9mIHRoZSBmb3JtOgorICAgICAqIDxjb2RlPmNvdW50KCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4cGVjdHNBcmd1bWVudHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBhZ2dyZWdhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBmb3IgZWFjaCBjYW5kaWRhdGUsIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnRzIHRvCisgICAgICogdGhlIGZ1bmN0aW9uOyB3aWxsIGJlIG51bGwgaWYgdGhpcyBhZ2dyZWdhdGUgZG9lcworICAgICAqIG5vdCBleHBlY3QgYW4gYXJndW1lbnQ7IGlmIHRoaXMgZnVuY3Rpb24gaGFzCisgICAgICogbXVsdGlwbGUgYXJndW1lbnRzLCBlYWNoIGVsZW1lbnQgd2lsbCBiZSBhbiBhcnJheQorICAgICAqIEBwYXJhbSBhcmdDbGFzc2VzIHRoZSBleHBlY3RlZCBjbGFzcyBvZiBlYWNoIGFyZ3VtZW50IGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gY2FuZGlkYXRlcyB0aGUgY2FuZGlkYXRlIG9iamVjdHMgYmVpbmcgZXZhbHVhdGVkCisgICAgICogQHBhcmFtIGN0eCB0aGUgcGVyc2lzdGVuY2UgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhZ2dyZWdhdGUKKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb24gaWYgdGhpcyBhZ2dyZWdhdGUgZG9lcyBub3QgCisgICAgICogc3VwcG9ydCBpbi1tZW1vcnkgb3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShDb2xsZWN0aW9uIGFyZ3MsIENsYXNzW10gYXJnQ2xhc3NlcywKKyAgICAgICAgQ29sbGVjdGlvbiBjYW5kaWRhdGVzLCBTdG9yZUNvbnRleHQgY3R4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHRoaXMgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJnQ2xhc3NlcyB0aGUgZXhwZWN0ZWQgY2xhc3NlcyBvZiB0aGUgYXJndW1lbnQsIG9yIG51bGwgaWYKKyAgICAgKiBubyBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShDbGFzc1tdIGFyZ0NsYXNzZXMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BZ2dyZWdhdGVWYWwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWdncmVnYXRlVmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzZGI0ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWdncmVnYXRlVmFsLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogQW4gYWdncmVnYXRlIG9mIHNvbWUgdmFsdWUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworYWJzdHJhY3QgY2xhc3MgQWdncmVnYXRlVmFsCisgICAgZXh0ZW5kcyBWYWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQWdncmVnYXRlVmFsLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlIHRvIGFnZ3JlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWdncmVnYXRlVmFsKFZhbCB2YWwpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKF92YWwuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGNhbmRpZGF0ZSA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICAgICAgLy8gYWxsb3cgYWdncmVnYXRlcyB0byBiZSB1c2VkIGluIGZpbHRlciBleHByZXNzaW9ucyBzbyBsb25nIGFzIGEKKyAgICAgICAgLy8gY29sbGVjdGlvbiBpcyBwYXNzZWQgaW4KKyAgICAgICAgaWYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gZXZhbCgoQ29sbGVjdGlvbikgY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcykuCisgICAgICAgICAgICAgICAgaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJhZ2ctaW4tZmlsdGVyIikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGV2YWwoQ29sbGVjdGlvbiBjYW5kaWRhdGVzLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIENvbGxlY3Rpb24gYXJncyA9IF92YWwuZXZhbChjYW5kaWRhdGVzLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob3BlcmF0ZShhcmdzLCBfdmFsLmdldFR5cGUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGFnZ3JlZ2F0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKTsKKworICAgIC8qKgorICAgICAqIEFnZ3JlZ2F0ZSB0aGUgZ2l2ZW4gdmFsdWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3Qgb3BlcmF0ZShDb2xsZWN0aW9uIG9zLCBDbGFzcyBjKTsKKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQWxsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzk5NGYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FsbC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBJbi1tZW1vcnkgQWxsIGltcGxlbWVudGF0aW9uLiBDdXJyZW50bHkgdW5zdXBwb3J0ZWQgc2luY2UKKyAqIGluLW1lbW9yeSBzdWJxdWVyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIEFsbAorICAgIGV4dGVuZHMgVW5hcnlNYXRoVmFsIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoQWxsLmNsYXNzKTsKKworICAgIHB1YmxpYyBBbGwoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgQ2xhc3Mgd3JhcCA9IEZpbHRlcnMud3JhcChjKTsKKyAgICAgICAgaWYgKHdyYXAgPT0gSW50ZWdlci5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBGbG9hdC5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBEb3VibGUuY2xhc3MKKyAgICAgICAgICAgIHx8IHdyYXAgPT0gTG9uZy5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgICAgICB8fCB3cmFwID09IEJpZ0ludGVnZXIuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgcmV0dXJuIGludC5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZXJhdGUoT2JqZWN0IG8sIENsYXNzIGMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbi1tZW0tc3VicXVlcnkiKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FuZEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQW5kRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOThkYjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FuZEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogQW4gZXhwcmVzc2lvbiB0aGF0IEFORCdzIHR3byBvdGhlcnMgdG9nZXRoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQW5kRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgRXhwIF9leHAxOworICAgIHByaXZhdGUgZmluYWwgRXhwIF9leHAyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBleHByZXNzaW9ucyB0byBjb21iaW5lLgorICAgICAqLworICAgIHB1YmxpYyBBbmRFeHByZXNzaW9uKEV4cCBleHAxLCBFeHAgZXhwMikgeworICAgICAgICBfZXhwMSA9IGV4cDE7CisgICAgICAgIF9leHAyID0gZXhwMjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwIGdldEV4cHJlc3Npb24xKCkgeworICAgICAgICByZXR1cm4gX2V4cDE7CisgICAgfQorCisgICAgcHVibGljIEV4cCBnZXRFeHByZXNzaW9uMigpIHsKKyAgICAgICAgcmV0dXJuIF9leHAyOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gX2V4cDEuZXZhbHVhdGUoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcykKKyAgICAgICAgICAgICYmIF9leHAyLmV2YWx1YXRlKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGV2YWwoQ29sbGVjdGlvbiBjYW5kaWRhdGVzLCBTdG9yZUNvbnRleHQgY3R4LAorICAgICAgICBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIF9leHAxLmV2YWx1YXRlKGNhbmRpZGF0ZXMsIGN0eCwgcGFyYW1zKQorICAgICAgICAgICAgJiYgX2V4cDIuZXZhbHVhdGUoY2FuZGlkYXRlcywgY3R4LCBwYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX2V4cDEuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF9leHAyLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0FueS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BbnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdmMDVmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BbnkuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVW5zdXBwb3J0ZWRFeGNlcHRpb247CisKKy8qKgorICogSW4tbWVtb3J5IEFueSBpbXBsZW1lbnRhdGlvbi4gQ3VycmVudGx5IHVuc3VwcG9ydGVkIHNpbmNlCisgKiBpbi1tZW1vcnkgc3VicXVlcmllcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitjbGFzcyBBbnkKKyAgICBleHRlbmRzIFVuYXJ5TWF0aFZhbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKEFueS5jbGFzcyk7CisKKyAgICBwdWJsaWMgQW55KFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIENsYXNzIHdyYXAgPSBGaWx0ZXJzLndyYXAoYyk7CisgICAgICAgIGlmICh3cmFwID09IEludGVnZXIuY2xhc3MKKyAgICAgICAgICAgIHx8IHdyYXAgPT0gRmxvYXQuY2xhc3MKKyAgICAgICAgICAgIHx8IHdyYXAgPT0gRG91YmxlLmNsYXNzCisgICAgICAgICAgICB8fCB3cmFwID09IExvbmcuY2xhc3MKKyAgICAgICAgICAgIHx8IHdyYXAgPT0gQmlnRGVjaW1hbC5jbGFzcworICAgICAgICAgICAgfHwgd3JhcCA9PSBCaWdJbnRlZ2VyLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBvcGVyYXRlKE9iamVjdCBvLCBDbGFzcyBjKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgiaW4tbWVtLXN1YnF1ZXJ5IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQXJncy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BcmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3NThiNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQXJncy5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYSBtdWx0aS1hcmd1bWVudCBmdW5jdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBBcmdzCisgICAgZXh0ZW5kcyBWYWwKKyAgICBpbXBsZW1lbnRzIEFyZ3VtZW50cyB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX2FyZ3MgPSBuZXcgQXJyYXlMaXN0KDMpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgYmVpbmcgY29tYmluZWQuCisgICAgICovCisgICAgcHVibGljIEFyZ3MoVmFsdWUgdmFsMSwgVmFsdWUgdmFsMikgeworICAgICAgICBpZiAodmFsMSBpbnN0YW5jZW9mIEFyZ3MpCisgICAgICAgICAgICBfYXJncy5hZGRBbGwoKChBcmdzKSB2YWwxKS5fYXJncyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9hcmdzLmFkZCh2YWwxKTsKKyAgICAgICAgaWYgKHZhbDIgaW5zdGFuY2VvZiBBcmdzKQorICAgICAgICAgICAgX2FyZ3MuYWRkQWxsKCgoQXJncykgdmFsMikuX2FyZ3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfYXJncy5hZGQodmFsMik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlW10gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gKFZhbHVlW10pIF9hcmdzLnRvQXJyYXkobmV3IFZhbHVlW19hcmdzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0W10uY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIENsYXNzW10gZ2V0VHlwZXMoKSB7CisgICAgICAgIENsYXNzW10gYyA9IG5ldyBDbGFzc1tfYXJncy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hcmdzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgY1tpXSA9ICgoVmFsKSBfYXJncy5nZXQoaSkpLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBPYmplY3RbXSB2YWxzID0gbmV3IE9iamVjdFtfYXJncy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hcmdzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgdmFsc1tpXSA9ICgoVmFsKSBfYXJncy5nZXQoaSkpLmV2YWwoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIHJldHVybiB2YWxzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXJncy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICgoVmFsKSBfYXJncy5nZXQoaSkpLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Bcmd1bWVudHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQXJndW1lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1YzA2NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQXJndW1lbnRzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKKy8qKgorICogTXVsdGlwbGUgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFyZ3VtZW50cworICAgIGV4dGVuZHMgVmFsdWUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIFZhbHVlW10gZ2V0VmFsdWVzKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0F2Zy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BdmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDllNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9BdmcuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBBdmVyYWdlIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBBdmcKKyAgICBleHRlbmRzIEFnZ3JlZ2F0ZVZhbCB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgdmFsdWUgdG8gYXZlcmFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXZnKFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlcmF0ZShDb2xsZWN0aW9uIG9zLCBDbGFzcyBjKSB7CisgICAgICAgIGlmIChvcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBPYmplY3Qgc3VtID0gRmlsdGVycy5jb252ZXJ0KE51bWJlcnMudmFsdWVPZigwKSwgYyk7CisgICAgICAgIE9iamVjdCBjdXI7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY3VyID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgc3VtID0gRmlsdGVycy5hZGQoc3VtLCBjLCBjdXIsIGMpOworICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIEZpbHRlcnMuZGl2aWRlKHN1bSwgYywgTnVtYmVycy52YWx1ZU9mKHNpemUpLCBpbnQuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQmluZEtleVZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9CaW5kS2V5VmFyaWFibGVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5YmQ4YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQmluZEtleVZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiB7QGxpbmsgQmluZFZhcmlhYmxlRXhwcmVzc2lvbn0gZm9yIG1hcCBrZXkgc2V0cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBCaW5kS2V5VmFyaWFibGVFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBCaW5kVmFyaWFibGVFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHZhciB0aGUgYm91bmQgdmFyaWFibGUKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0aGUgdmFyaWFibGUgaXMgYm91bmQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgQmluZEtleVZhcmlhYmxlRXhwcmVzc2lvbihCb3VuZFZhcmlhYmxlIHZhciwgVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YXIsIHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbihPYmplY3QgdmFsdWVzKSB7CisgICAgICAgIE1hcCBtYXAgPSAoTWFwKSB2YWx1ZXM7CisgICAgICAgIHJldHVybiAobWFwID09IG51bGwpID8gbnVsbCA6IG1hcC5rZXlTZXQoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQmluZFZhbHVlVmFyaWFibGVFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0JpbmRWYWx1ZVZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2ZlMGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0JpbmRWYWx1ZVZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiB7QGxpbmsgQmluZFZhcmlhYmxlRXhwcmVzc2lvbn0gZm9yIG1hcCB2YWx1ZSBjb2xsZWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBCaW5kVmFsdWVWYXJpYWJsZUV4cHJlc3Npb24KKyAgICBleHRlbmRzIEJpbmRWYXJpYWJsZUV4cHJlc3Npb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyIHRoZSBib3VuZCB2YXJpYWJsZQorICAgICAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRoZSB2YXJpYWJsZSBpcyBib3VuZCB0bworICAgICAqLworICAgIHB1YmxpYyBCaW5kVmFsdWVWYXJpYWJsZUV4cHJlc3Npb24oQm91bmRWYXJpYWJsZSB2YXIsIFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFyLCB2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oT2JqZWN0IHZhbHVlcykgeworICAgICAgICBNYXAgbWFwID0gKE1hcCkgdmFsdWVzOworICAgICAgICByZXR1cm4gKG1hcCA9PSBudWxsKSA/IG51bGwgOiBtYXAudmFsdWVzKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0JpbmRWYXJpYWJsZUFuZEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlQW5kRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTg4YjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0JpbmRWYXJpYWJsZUFuZEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEFueSBjb250YWlucyh2YXIpIGV4cHJlc3Npb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUKKyAqIEFORCBjbGF1c2UgdXNpbmcgdGhlIHZhcmlhYmxlICd2YXInLiBUaGlzIGV4cHJlc3Npb24gdHlwZSByZXByZXNlbnRzCisgKiBvbmUgb2YgdGhvc2UgYW5kIEFORCBjbGF1c2VzLiBJdCBpcyByZXNwb25zaWJsZSBmb3IgZXZhbHVhdGluZyB0aGUKKyAqIHJpZ2h0IHN1YmV4cHJlc3Npb24gZm9yIGV2ZXJ5IHBvc3NpYmxlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBCaW5kVmFyaWFibGVBbmRFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBBbmRFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIGV4cHJlc3Npb24gYmluZGluZyB0aGUgdmFyaWFibGUgYW5kIHRoZQorICAgICAqIGV4cHJlc3Npb24gaXQgaXMgQU5EJ2Qgd2l0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmluZFZhcmlhYmxlQW5kRXhwcmVzc2lvbihCaW5kVmFyaWFibGVFeHByZXNzaW9uIHZhciwgRXhwIGV4cCkgeworICAgICAgICBzdXBlcih2YXIsIGV4cCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRyZWUgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHZhcmlhYmxlJ3MgY29sbGVjdGlvbjsKKyAgICAgICAgLy8gdGhlIHZhcmlhYmxlIGlzIGFsaWFzZWQgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBiZWZvcmUgZWFjaAorICAgICAgICAvLyBpdGVyYXRpb24gc28gdGhhdCB2YXJpYWJsZSBwYXRocyB3aXRoaW4gdGhlIHRyZWUgY2FuCisgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCB2YWx1ZTsgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZSBpZiB0cnVlIGZvciBhbnkKKyAgICAgICAgLy8gdmFsdWUgb2YgdGhlIGNvbGxlY3Rpb24KKworICAgICAgICAvLyBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSBpdCBjYW5ub3QgY29udGFpbiBhbnkgdmFyaWFibGUKKyAgICAgICAgQmluZFZhcmlhYmxlRXhwcmVzc2lvbiBiaW5kID0gKEJpbmRWYXJpYWJsZUV4cHJlc3Npb24pCisgICAgICAgICAgICBnZXRFeHByZXNzaW9uMSgpOworICAgICAgICBDb2xsZWN0aW9uIHZhbHMgPSBiaW5kLmdldFZhcmlhYmxlVmFsdWVzKGNhbmRpZGF0ZSwgb3JpZywgY3R4LAorICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgaWYgKHZhbHMgPT0gbnVsbCB8fCB2YWxzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyB0aGUgc3VidHJlZSBpcyB0cnVlIGlmIHRydWUgZm9yIGFueSB2YXJpYWJsZSBpbiB0aGUgY29sbGVjdGlvbgorICAgICAgICBCb3VuZFZhcmlhYmxlIHZhciA9IGJpbmQuZ2V0VmFyaWFibGUoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSB2YWxzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoIXZhci5zZXRWYWx1ZShpdHIubmV4dCgpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChnZXRFeHByZXNzaW9uMigpLmV2YWx1YXRlKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBldmFsKENvbGxlY3Rpb24gY2FuZGlkYXRlcywgU3RvcmVDb250ZXh0IGN0eCwKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGlmIChjYW5kaWRhdGVzID09IG51bGwgfHwgY2FuZGlkYXRlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIE9iamVjdCBvYmogPSBjYW5kaWRhdGVzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICByZXR1cm4gZXZhbChvYmosIG9iaiwgY3R4LCBwYXJhbXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9CaW5kVmFyaWFibGVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiOWY0YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQmluZFZhcmlhYmxlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBCaW5kcyBhIHZhcmlhYmxlIHRvIGEgY29sbGVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBCaW5kVmFyaWFibGVFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBCb3VuZFZhcmlhYmxlIF92YXI7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHZhciB0aGUgYm91bmQgdmFyaWFibGUKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0aGUgdmFyaWFibGUgaXMgYm91bmQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgQmluZFZhcmlhYmxlRXhwcmVzc2lvbihCb3VuZFZhcmlhYmxlIHZhciwgVmFsIHZhbCkgeworICAgICAgICBfdmFyID0gdmFyOworICAgICAgICBfdmFsID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBCb3VuZFZhcmlhYmxlIGdldFZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gX3ZhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvc3NpYmxlIHZhbHVlcyB0aGF0IHZhcmlhYmxlIGNhbiB0YWtlLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFZhcmlhYmxlVmFsdWVzKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlcyA9IF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIGdldENvbGxlY3Rpb24odmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LCBwcm9kdWNlZCBieQorICAgICAqIDxjb2RlPmV2YWw8L2NvZGU+J2luZyB0aGUgdmFsdWUgb2YgdGhpcyBleHByZXNzaW9uLiBTaW1wbHkgY2FzdHMKKyAgICAgKiB0aGUgb2JqZWN0IHRvIGEgY29sbGVjdGlvbiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oT2JqZWN0IHZhbHVlcykgeworICAgICAgICByZXR1cm4gKENvbGxlY3Rpb24pIHZhbHVlczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgLy8gaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkgbm8gcG9zc2libGUgdmFyaWFibGUgZXZhbHMgdG8gdHJ1ZQorICAgICAgICBDb2xsZWN0aW9uIHZhbHMgPSBnZXRWYXJpYWJsZVZhbHVlcyhjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgaWYgKHZhbHMgPT0gbnVsbCB8fCB2YWxzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBpZiAoY2FuZGlkYXRlcyA9PSBudWxsIHx8IGNhbmRpZGF0ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBPYmplY3Qgb2JqID0gY2FuZGlkYXRlcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIGV2YWwob2JqLCBvYmosIGN0eCwgcGFyYW1zKTsKKwl9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YXIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQm91bmRWYXJpYWJsZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Cb3VuZFZhcmlhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3YmI3YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQm91bmRWYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGJvdW5kIHZhcmlhYmxlLiBWYXJpYWJsZXMgYXJlIGFsaWFzZWQgdG8gdGhlCisgKiBjb2xsZWN0aW9uIHRoYXQgaXMgc3RhdGVkIHRvIGNvbnRhaW4gdGhlbSBpbiB0aGUgcXVlcnkuCisgKiBXaGVuIHRoZSBxdWVyeSBpcyBldmFsdWF0ZWQsIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgdmFyaWFibGVzIHdpbGwgYmUKKyAqIGV4ZWN1dGVkIG9uY2UgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQm91bmRWYXJpYWJsZQorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgQ2xhc3MgX3R5cGUgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0IF92YWwgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdmFyaWFibGUgbmFtZSBhbmQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm91bmRWYXJpYWJsZShDbGFzcyB0eXBlKSB7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIHRoaXMgdmFyaWFibGUgc2hvdWxkIHRha2UgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHZhcmlhYmxlJ3MKKyAgICAgKiBkZWNsYXJlZCB0eXBlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICFfdHlwZS5pc0Fzc2lnbmFibGVGcm9tKHZhbHVlLmdldENsYXNzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBfdmFsID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhc3QgdGhpcyB2YWx1ZSB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYXN0VG8oQ2xhc3MgdHlwZSkgeworICAgICAgICAvLyBpbmNvbXBhdGlibGUgdHlwZXM/CisgICAgICAgIGlmICghX3R5cGUuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKQorICAgICAgICAgICAgJiYgIXR5cGUuaXNBc3NpZ25hYmxlRnJvbShfdHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKF90eXBlLmdldE5hbWUoKSk7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gX3ZhbDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ2FuZGlkYXRlUGF0aC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9DYW5kaWRhdGVQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzNTUxYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ2FuZGlkYXRlUGF0aC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuT2JqZWN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworCisvKioKKyAqIEEgcGF0aCByZXByZXNlbnRzIGEgdHJhdmVyc2FsIGludG8gZmllbGRzIG9mIGEgY2FuZGlkYXRlIG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBDYW5kaWRhdGVQYXRoCisgICAgZXh0ZW5kcyBWYWwKKyAgICBpbXBsZW1lbnRzIFBhdGggeworCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IF9hY3Rpb25zID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRyYXZlcnNlIGludG8gdGhlIGdpdmVuIGZpZWxkIG9mIHRoZSBjdXJyZW50IG9iamVjdCwgYW5kIHVwZGF0ZQorICAgICAqIHRoZSBjdXJyZW50IG9iamVjdCB0byB0aGF0IGZpZWxkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldChGaWVsZE1ldGFEYXRhIGZpZWxkLCBib29sZWFuIG51bGxUcmF2ZXJzYWwpIHsKKyAgICAgICAgaWYgKF9hY3Rpb25zID09IG51bGwpCisgICAgICAgICAgICBfYWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIF9hY3Rpb25zLmFkZChuZXcgVHJhdmVyc2FsKGZpZWxkLCBudWxsVHJhdmVyc2FsKSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChfYWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGdldENhbmRpZGF0ZVR5cGUoKTsKKworICAgICAgICBPYmplY3QgbGFzdCA9IF9hY3Rpb25zLmdldExhc3QoKTsKKyAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIGxhc3Q7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gKChUcmF2ZXJzYWwpIGxhc3QpLmZpZWxkOworICAgICAgICByZXR1cm4gZm1kLmdldERlY2xhcmVkVHlwZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRDYW5kaWRhdGVUeXBlKCkgeworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBnZXRNZXRhRGF0YSgpOworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICAgICAgcmV0dXJuIG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgbGFzdCgpIHsKKyAgICAgICAgaWYgKF9hY3Rpb25zID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBMaXN0SXRlcmF0b3IgaXRyID0gX2FjdGlvbnMubGlzdEl0ZXJhdG9yKF9hY3Rpb25zLnNpemUoKSk7CisgICAgICAgIE9iamVjdCBwcmV2OworICAgICAgICB3aGlsZSAoaXRyLmhhc1ByZXZpb3VzKCkpIHsKKyAgICAgICAgICAgIHByZXYgPSBpdHIucHJldmlvdXMoKTsKKyAgICAgICAgICAgIGlmIChwcmV2IGluc3RhbmNlb2YgVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgIHJldHVybiAoKFRyYXZlcnNhbCkgcHJldikuZmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FzdCB0aGlzIHBhdGggdG8gdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FzdFRvKENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKF9hY3Rpb25zID09IG51bGwpCisgICAgICAgICAgICBfYWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIF9hY3Rpb25zLmFkZCh0eXBlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBpZiAoX2FjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7CisKKyAgICAgICAgT2JqZWN0IGFjdGlvbjsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTsKKyAgICAgICAgQnJva2VyIHRtcEJyb2tlciA9IG51bGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2FjdGlvbnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFjdGlvbiA9IGl0ci5uZXh0KCk7CisKKyAgICAgICAgICAgIC8vIGZhaWwgb24gbnVsbCB2YWx1ZQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICAmJiAoKFRyYXZlcnNhbCkgYWN0aW9uKS5udWxsVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgY2FzdCBpcyB2YWxpZAorICAgICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gRmlsdGVycy5jb252ZXJ0KGNhbmRpZGF0ZSwgKENsYXNzKSBhY3Rpb24pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2FuIGFjY2VzcyB0aGUgaW5zdGFuY2U7IGV2ZW4gbm9uLXBjIHZhbHMgbWlnaHQKKyAgICAgICAgICAgIC8vIGJlIHByb3h5YWJsZQorICAgICAgICAgICAgc20gPSBudWxsOworICAgICAgICAgICAgdG1wQnJva2VyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICAgICAgc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgKChQZXJzaXN0ZW5jZUNhcGFibGUpIGNhbmRpZGF0ZSkuCisgICAgICAgICAgICAgICAgICAgIHBjR2V0U3RhdGVNYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRtcEJyb2tlciA9IGN0eC5nZXRCcm9rZXIoKTsKKyAgICAgICAgICAgICAgICB0bXBCcm9rZXIudHJhbnNhY3Rpb25hbChjYW5kaWRhdGUsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICBzbSA9IHRtcEJyb2tlci5nZXRTdGF0ZU1hbmFnZXIoY2FuZGlkYXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHNwZWNpZmllZCBmaWVsZCB2YWx1ZSBhbmQgc3dpdGNoIGNhbmRpZGF0ZQorICAgICAgICAgICAgICAgIFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSAoVHJhdmVyc2FsKSBhY3Rpb247CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gc20uZmV0Y2hGaWVsZCh0cmF2ZXJzYWwuZmllbGQuZ2V0SW5kZXgoKSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uYWwgZG9lcyBub3QgY2xlYXIgdGhlIHN0YXRlLCB3aGljaCBpcworICAgICAgICAgICAgICAgIC8vIGltcG9ydGFudCBzaW5jZSB0bXBDYW5kaWRhdGUgbWlnaHQgYmUgYWxzbyBtYW5hZ2VkIGJ5CisgICAgICAgICAgICAgICAgLy8gYW5vdGhlciBicm9rZXIgaWYgaXQncyBhIHByb3hpZWQgbm9uLXBjIGluc3RhbmNlCisgICAgICAgICAgICAgICAgaWYgKHRtcEJyb2tlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0bXBCcm9rZXIubm9udHJhbnNhY3Rpb25hbChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gKF9hY3Rpb25zID09IG51bGwpID8gMCA6IF9hY3Rpb25zLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIENhbmRpZGF0ZVBhdGgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuZXF1YWxzKF9hY3Rpb25zLCAoKENhbmRpZGF0ZVBhdGgpIG90aGVyKS5fYWN0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHRyYXZlcnNhbCB0aHJvdWdoIGEgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHJhdmVyc2FsIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgRmllbGRNZXRhRGF0YSBmaWVsZDsKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbnVsbFRyYXZlcnNhbDsKKworICAgICAgICBwcml2YXRlIFRyYXZlcnNhbChGaWVsZE1ldGFEYXRhIGZpZWxkLCBib29sZWFuIG51bGxUcmF2ZXJzYWwpIHsKKyAgICAgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgIHRoaXMubnVsbFRyYXZlcnNhbCA9IG51bGxUcmF2ZXJzYWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAoKFRyYXZlcnNhbCkgb3RoZXIpLmZpZWxkLmVxdWFscyhmaWVsZCk7CisgICAgICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0Nhc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ2FzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDYwMGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0Nhc3QuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjYXN0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIENhc3QKKyAgICBleHRlbmRzIFZhbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgX2Nhc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB2YWx1ZSB0byBjYXN0IGFuZCB0eXBlIHRvIGNhc3QgdG8uCisgICAgICovCisgICAgcHVibGljIENhc3QoVmFsIHZhbCwgQ2xhc3MgY2FzdCkgeworICAgICAgICBfdmFsID0gdmFsOworICAgICAgICBfY2FzdCA9IGNhc3Q7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfY2FzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmNvbnZlcnQoX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpLCBfY2FzdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgQ29sbGVjdGlvbiByZXMgPSBfdmFsLmV2YWwoY2FuZGlkYXRlcywgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBpZiAocmVzID09IG51bGwgfHwgcmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgQ29sbGVjdGlvbiBjYXN0cyA9IG5ldyBBcnJheUxpc3QocmVzLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcmVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgY2FzdHMuYWRkKEZpbHRlcnMuY29udmVydChpdHIubmV4dCgpLCBfY2FzdCkpOworICAgICAgICByZXR1cm4gY2FzdHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db21wYXJlRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db21wYXJlRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTJjMDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0NvbXBhcmVFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBFeHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdHdvIG90aGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCithYnN0cmFjdCBjbGFzcyBDb21wYXJlRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgRXhwIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwxOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgdG8gY29tcGFyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGFyZUV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIF92YWwxID0gdmFsMTsKKyAgICAgICAgX3ZhbDIgPSB2YWwyOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBPYmplY3QgbzEgPSBfdmFsMS5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBPYmplY3QgbzIgPSBfdmFsMi5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBpZiAobzEgIT0gbnVsbCAmJiBvMiAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzcyBjID0gRmlsdGVycy5wcm9tb3RlKG8xLmdldENsYXNzKCksIG8yLmdldENsYXNzKCkpOworICAgICAgICAgICAgbzEgPSBGaWx0ZXJzLmNvbnZlcnQobzEsIGMpOworICAgICAgICAgICAgbzIgPSBGaWx0ZXJzLmNvbnZlcnQobzIsIGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wYXJlKG8xLCBvMik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBDb2xsZWN0aW9uIGMxID0gX3ZhbDEuZXZhbChjYW5kaWRhdGVzLCBudWxsLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIENvbGxlY3Rpb24gYzIgPSBfdmFsMi5ldmFsKGNhbmRpZGF0ZXMsIG51bGwsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgT2JqZWN0IG8xID0gKGMxID09IG51bGwgfHwgYzEuaXNFbXB0eSgpKSA/IG51bGwKKyAgICAgICAgICAgIDogYzEuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIE9iamVjdCBvMiA9IChjMiA9PSBudWxsIHx8IGMyLmlzRW1wdHkoKSkgPyBudWxsCisgICAgICAgICAgICA6IGMyLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIGlmIChvMSAhPSBudWxsICYmIG8yICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzIGMgPSBGaWx0ZXJzLnByb21vdGUobzEuZ2V0Q2xhc3MoKSwgbzIuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBvMSA9IEZpbHRlcnMuY29udmVydChvMSwgYyk7CisgICAgICAgICAgICBvMiA9IEZpbHRlcnMuY29udmVydChvMiwgYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBhcmUobzEsIG8yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSB0d28gdmFsdWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpOworCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsMS5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX3ZhbDIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0NvbmNhdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db25jYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJhYTVjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db25jYXQuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIENvbmNhdGVuYXRlIHR3byBzdHJpbmdzIHRvZ2V0aGVyLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIENvbmNhdAorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX2FyZ3M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0YXJnZXQgc3RyaW5nIGFuZCB0aGUgYXJndW1lbnRzIHRvIHRoZQorICAgICAqIGluZGV4T2YgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBDb25jYXQoVmFsIHZhbCwgVmFsIGFyZ3MpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX2FyZ3MgPSBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IHN0ciA9IF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNhdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLnRvU3RyaW5nKCkpOworCisgICAgICAgIE9iamVjdCBhcmcgPSBfYXJncy5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKChPYmplY3RbXSkgYXJnKS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjYXQuYXBwZW5kKCgoKE9iamVjdFtdKSBhcmcpW2ldKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjYXQuYXBwZW5kKGFyZy50b1N0cmluZygpKTsKKworICAgICAgICByZXR1cm4gY2F0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfYXJncy5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db25zdGFudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTgyMDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0NvbnN0YW50LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBhbnkgcXVlcnkgY29uc3RhbnQgdmFsdWUuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGludGVyZmFjZSBDb25zdGFudCB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGlzIGNvbnN0YW50IGdpdmVuIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdFtdIHBhcmFtZXRlcnMpOworfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0NvbnRhaW5zRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db250YWluc0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWNlMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db250YWluc0V4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIFRlc3RzIHRoYXQgYSBDb2xsZWN0aW9uIGNvbnRhaW5zIGEgdmFsdWUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQ29udGFpbnNFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDE7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWwxIHRoZSBjb250YWluZXIgdmFsdWUKKyAgICAgKiBAcGFyYW0gdmFsMiB0aGUgY29udGFpbmVlIHRvIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbnNFeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBfdmFsMSA9IHZhbDE7CisgICAgICAgIF92YWwyID0gdmFsMjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IG9iaiA9IF92YWwxLmV2YWwoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IGdldENvbGxlY3Rpb24ob2JqKTsKKyAgICAgICAgcmV0dXJuIGNvbGwgIT0gbnVsbCAmJiAhY29sbC5pc0VtcHR5KCkKKyAgICAgICAgICAgICYmIGNvbGwuY29udGFpbnMoX3ZhbDIuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBfdmFsMS5ldmFsKGNhbmRpZGF0ZXMsIG51bGwsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCB8fCBjb2xsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29sbCA9IGdldENvbGxlY3Rpb24oY29sbC5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgICAgIGlmIChjb2xsID09IG51bGwgfHwgY29sbC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsMiA9IF92YWwyLmV2YWwoY2FuZGlkYXRlcywgbnVsbCwgY3R4LCBwYXJhbXMpOworICAgICAgICBpZiAoY29sbDIgPT0gbnVsbCB8fCBjb2xsMi5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBjb2xsLmNvbnRhaW5zKGNvbGwyLml0ZXJhdG9yKCkubmV4dCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRhaW5lciBjb2xsZWN0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbihPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uID8KKyAgICAgICAgICAgIChDb2xsZWN0aW9uKSBvYmogOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwxLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfdmFsMi5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db250YWluc0tleUV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ29udGFpbnNLZXlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkNjIzMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ29udGFpbnNLZXlFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRlc3RzIHRoYXQgYSBNYXAga2V5IHNldCBjb250YWlucyBhIHZhbHVlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIENvbnRhaW5zS2V5RXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29udGFpbnNFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbDEgdGhlIGNvbnRhaW5lciB2YWx1ZQorICAgICAqIEBwYXJhbSB2YWwyIHRoZSBjb250YWluZWUgdG8gdGVzdAorICAgICAqLworICAgIHB1YmxpYyBDb250YWluc0tleUV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IG51bGwgOiAoKE1hcCkgb2JqKS5rZXlTZXQoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ29udGFpbnNWYWx1ZUV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ29udGFpbnNWYWx1ZUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTgwNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db250YWluc1ZhbHVlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUZXN0cyB0aGF0IGEgTWFwIHZhbHVlIGNvbGxlY3Rpb24gY29udGFpbnMgYSB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBDb250YWluc1ZhbHVlRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29udGFpbnNFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbDEgdGhlIGNvbnRhaW5lciB2YWx1ZQorICAgICAqIEBwYXJhbSB2YWwyIHRoZSBjb250YWluZWUgdG8gdGVzdAorICAgICAqLworICAgIHB1YmxpYyBDb250YWluc1ZhbHVlRXhwcmVzc2lvbihWYWwgdmFsMSwgVmFsIHZhbDIpIHsKKyAgICAgICAgc3VwZXIodmFsMSwgdmFsMik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbihPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gbnVsbCA6ICgoTWFwKSBvYmopLnZhbHVlcygpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db3VudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Db3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNDdmY2EKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0NvdW50LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBDb3VudCBub24tbnVsbCB2YWx1ZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgQ291bnQKKyAgICBleHRlbmRzIEFnZ3JlZ2F0ZVZhbCB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgdmFsdWUgdG8gY291bnQuCisgICAgICovCisgICAgcHVibGljIENvdW50KFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBsb25nLmNsYXNzOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlcmF0ZShDb2xsZWN0aW9uIG9zLCBDbGFzcyBjKSB7CisgICAgICAgIGxvbmcgY291bnQgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9zLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgaWYgKGl0ci5uZXh0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGNvdW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0N1cnJlbnREYXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0N1cnJlbnREYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0N2M0ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvQ3VycmVudERhdGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgY3VycmVudCBkYXRlLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK2NsYXNzIEN1cnJlbnREYXRlCisgICAgZXh0ZW5kcyBWYWwgeworCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBEYXRlLmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9EaXN0aW5jdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9EaXN0aW5jdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTNhN2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0Rpc3RpbmN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBBIGRpc3RpbmN0IHNldCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitjbGFzcyBEaXN0aW5jdAorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlIHRvIGFnZ3JlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlzdGluY3QoVmFsIHZhbCkgeworICAgICAgICBfdmFsID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbi5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGNhbmRpZGF0ZSA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIENvbGxlY3Rpb24gYXJnID0gY2FuZGlkYXRlIGluc3RhbmNlb2YgQ29sbGVjdGlvbgorICAgICAgICAgICAgPyAoQ29sbGVjdGlvbikgY2FuZGlkYXRlIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNhbmRpZGF0ZSk7CisgICAgICAgIHJldHVybiBldmFsKGFyZywgb3JpZywgY3R4LCBwYXJhbXMpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGV2YWwoQ29sbGVjdGlvbiBjYW5kaWRhdGVzLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIENvbGxlY3Rpb24gYXJncyA9IF92YWwuZXZhbChjYW5kaWRhdGVzLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldChhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRGl2aWRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0RpdmlkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTU4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0RpdmlkZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworCisvKioKKyAqIFZhbHVlIHByb2R1Y2VkIGJ5IG9uZSB2YWx1ZSBiZWluZyBkaXZpZGVkIGJ5IGFub3RoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgRGl2aWRlCisgICAgZXh0ZW5kcyBNYXRoVmFsIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZXMgdG8gZGl2aWRlLgorICAgICAqLworICAgIHB1YmxpYyBEaXZpZGUoVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlcmF0ZShPYmplY3QgbzEsIENsYXNzIGMxLCBPYmplY3QgbzIsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLmRpdmlkZShvMSwgYzEsIG8yLCBjMik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0VuZHNXaXRoRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FbmRzV2l0aEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY3YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FbmRzV2l0aEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBFeHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdHdvIG90aGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFbmRzV2l0aEV4cHJlc3Npb24KKyAgICBleHRlbmRzIENvbXBhcmVFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdmFsdWVzIHRvIGNvbXBhcmUuCisgICAgICovCisgICAgcHVibGljIEVuZHNXaXRoRXhwcmVzc2lvbihWYWwgdmFsMSwgVmFsIHZhbDIpIHsKKyAgICAgICAgc3VwZXIodmFsMSwgdmFsMik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAobzEgPT0gbnVsbCB8fCBvMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gbzEudG9TdHJpbmcoKS5lbmRzV2l0aChvMi50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0VxdWFsRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FcXVhbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJkMzExCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FcXVhbEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBFeHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdHdvIG90aGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBFcXVhbEV4cHJlc3Npb24KKyAgICBleHRlbmRzIENvbXBhcmVFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdmFsdWVzIHRvIGNvbXBhcmUuCisgICAgICovCisgICAgcHVibGljIEVxdWFsRXhwcmVzc2lvbihWYWwgdmFsMSwgVmFsIHZhbDIpIHsKKyAgICAgICAgc3VwZXIodmFsMSwgdmFsMik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICByZXR1cm4gKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkKKyAgICAgICAgICAgIHx8IChvMSAhPSBudWxsICYmIG8xLmVxdWFscyhvMikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FeHAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRXhwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhMTM0ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRXhwLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEFuIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBhbiB7QGxpbmsgRXhwcmVzc2lvbn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgRXhwCisgICAgaW1wbGVtZW50cyBFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZ2l2ZW4gY2FuZGlkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBldmFsKGNhbmRpZGF0ZSwgY2FuZGlkYXRlLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIGNhbmRpZGF0ZSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBldmFsdWF0ZShDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGV2YWwoY2FuZGlkYXRlcywgY3R4LCBwYXJhbXMpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBnaXZlbiBjb250ZXh0IGNhbmRpZGF0ZSBhbmQgb3JpZ2luYWwKKyAgICAgKiBjYW5kaWRhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZ2l2ZW4gZ3JvdXAuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWI1MzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGEgc2V0IG9mIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHF1ZXJ5CisgKiB0byBiZSB0cnVlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgYSB2aXNpdCBmcm9tIGEgdHJlZSB2aXNpdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9FeHByZXNzaW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWE2MDgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBUaGUgRXhwcmVzc2lvbkZhY3RvcnkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHBhcnRpY3VsYXIgcnVudGltZQorICogdG8gZm9ybSB7QGxpbmsgRXhwcmVzc2lvbn1zIGluIGl0cyBuYXRpdmUgcXVlcnkgbGFuZ3VhZ2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGludGVyZmFjZSBFeHByZXNzaW9uRmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibGFuayBleHByZXNzaW9uOyB0aGlzIGlzIHVzZWQgd2hlbiB0aGUgZmlsdGVyIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVtcHR5RXhwcmVzc2lvbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiB2YWx1ZSBhcyBhbiBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIGFzRXhwcmVzc2lvbihWYWx1ZSBib29sKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVxdWFsKFZhbHVlIHYxLCBWYWx1ZSB2Mik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBub3RFcXVhbChWYWx1ZSB2MSwgVmFsdWUgdjIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBjb25kaXRpb24uCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gbGVzc1RoYW4oVmFsdWUgdjEsIFZhbHVlIHYyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdyZWF0ZXJUaGFuKFZhbHVlIHYxLCBWYWx1ZSB2Mik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBsZXNzVGhhbkVxdWFsKFZhbHVlIHYxLCBWYWx1ZSB2Mik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBncmVhdGVyVGhhbkVxdWFsKFZhbHVlIHYxLCBWYWx1ZSB2Mik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBpc0VtcHR5KFZhbHVlIHRhcmdldCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBpc05vdEVtcHR5KFZhbHVlIHRhcmdldCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBjb250YWlucyhWYWx1ZSBjb2xsLCBWYWx1ZSBhcmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBjb25kaXRpb24uCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gY29udGFpbnNLZXkoVmFsdWUgbWFwLCBWYWx1ZSBhcmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBjb25kaXRpb24uCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gY29udGFpbnNWYWx1ZShWYWx1ZSBtYXAsIFZhbHVlIGFyZyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgZ2V0TWFwVmFsdWUoVmFsdWUgbWFwLCBWYWx1ZSBhcmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGZpcnN0IHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBpc0luc3RhbmNlKFZhbHVlIG9iaiwgQ2xhc3MgYyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR3byBleHByZXNzaW9ucyBBTkQnZCB0b2dldGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBhbmQoRXhwcmVzc2lvbiBleHAxLCBFeHByZXNzaW9uIGV4cDIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0d28gZXhwcmVzc2lvbnMgT1InZCB0b2dldGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBvcihFeHByZXNzaW9uIGV4cDEsIEV4cHJlc3Npb24gZXhwMik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhpcyBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIG5vdChFeHByZXNzaW9uIGV4cCk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kIHRoZSBnaXZlbiB2YXJpYWJsZSB0byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBiaW5kVmFyaWFibGUoVmFsdWUgdmFyLCBWYWx1ZSBjb2xsKTsKKworICAgIC8qKgorICAgICAqIEJpbmQgdGhlIGdpdmVuIHZhcmlhYmxlIHRvIHRoZSBrZXkgc2V0IG9mIHRoZSBnaXZlbiBtYXAgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gYmluZEtleVZhcmlhYmxlKFZhbHVlIHZhciwgVmFsdWUgbWFwKTsKKworICAgIC8qKgorICAgICAqIEJpbmQgdGhlIGdpdmVuIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBzZXQgb2YgdGhlIGdpdmVuIG1hcCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBiaW5kVmFsdWVWYXJpYWJsZShWYWx1ZSB2YXIsIFZhbHVlIG1hcCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZmlyc3Qgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc2Vjb25kLgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVuZHNXaXRoKFZhbHVlIHN0cjEsIFZhbHVlIHN0cjIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBtYXRjaGluZyBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciB0aGUgdmFsdWUgdG8gY29tcGFyZQorICAgICAqIEBwYXJhbSByZWdleHAgdGhlIHBhdHRlcm4gYWdhaW5zdCB3aGljaCB0byBjb21wYXJlCisgICAgICogQHBhcmFtIHNpbmdsZSB0aGUgdG9rZW4gdGhhdCBzaWduaWZpZXMgYSBzaW5nbGUtY2hhcmFjdGVyIG1hdGNoCisgICAgICogQHBhcmFtIG11bHRpIHRoZSB0b2tlbiB0aGF0IHNpZ25pZmllcyBhIG11bHRpLWNoYXJhY3RlciBtYXRjaAorICAgICAqIEBwYXJhbSBlc2NhcGUgdGhlIGVzY2FwZSB0b2tlbiB0aGF0IGVzY2FwZXMgdGhlIG1hdGNoaW5nIHRva2VucworICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIG1hdGNoZXMoVmFsdWUgc3RyLCBWYWx1ZSByZWdleHAsCisgICAgICAgIFN0cmluZyBzaW5nbGUsIFN0cmluZyBtdWx0aSwgU3RyaW5nIGVzY2FwZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciB0aGUgdmFsdWUgdG8gY29tcGFyZQorICAgICAqIEBwYXJhbSByZWdleHAgdGhlIHBhdHRlcm4gYWdhaW5zdCB3aGljaCB0byBjb21wYXJlCisgICAgICogQHBhcmFtIHNpbmdsZSB0aGUgdG9rZW4gdGhhdCBzaWduaWZpZXMgYSBzaW5nbGUtY2hhcmFjdGVyIG1hdGNoCisgICAgICogQHBhcmFtIG11bHRpIHRoZSB0b2tlbiB0aGF0IHNpZ25pZmllcyBhIG11bHRpLWNoYXJhY3RlciBtYXRjaAorICAgICAqIEBwYXJhbSBlc2NhcGUgdGhlIGVzY2FwZSB0b2tlbiB0aGF0IGVzY2FwZXMgdGhlIG1hdGNoaW5nIHRva2VucworICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uIG5vdE1hdGNoZXMoVmFsdWUgc3RyLCBWYWx1ZSByZWdleHAsIFN0cmluZyBzaW5nbGUsCisgICAgICAgIFN0cmluZyBtdWx0aSwgU3RyaW5nIGVzY2FwZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZmlyc3Qgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzZWNvbmQuCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gc3RhcnRzV2l0aChWYWx1ZSBzdHIxLCBWYWx1ZSBzdHIyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBTdHJpbmcgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIHN0cmluZ0xlbmd0aChWYWx1ZSBzdHIpOworCisgICAgLyoqCisgICAgICogVHJpbXMgdGhlIHNwZWNpZmllZCBzcGVjaWZpZWQgdHJpbUNoYXIgZnJvbSB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciB0aGUgdmFsdWUgZnJvbSB3aGljaCB0byB0cmltCisgICAgICogQHBhcmFtIHRyaW1DaGFyIHRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0gb2ZmCisgICAgICogQHBhcmFtIHdoZXJlIHdoaWNoIHNpZGUgb2YgdGhlIFN0cmluZyB0byB0cmltOiBudWxsCisgICAgICogaW5kaWNhdGVzIGJvdGggc2lkZXMsIHRydWUgaW5kaWNhdGVzCisgICAgICogbGVhZGluZywgYW5kIGZhbHNlIGluZGljYXRlcyB0cmFpbGluZworICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSB0cmltKFZhbHVlIHN0ciwgVmFsdWUgdHJpbUNoYXIsIEJvb2xlYW4gd2hlcmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3VicXVlcnkuIFBhdGhzIGZvciB0aGUgY2FuZGlkYXRlcyBvZiB0aGUgc3VicXVlcnkgYXJlCisgICAgICogY3JlYXRlZCB3aXRoIHtAbGluayAjbmV3UGF0aChWYWx1ZSl9LCBwYXNzaW5nIGluIHRoZSBzdWJxdWVyeSBhcyB0aGUKKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYW5kaWRhdGUgdGhlIGNhbmRpZGF0ZSBjbGFzcyBvZiB0aGUgc3VicXVlcnkKKyAgICAgKiBAcGFyYW0gc3VicyB3aGV0aGVyIHRoZSBxdWVyeSBpbmNsdWRlcyBzdWJjbGFzc2VzCisgICAgICogQHBhcmFtIGFsaWFzIHRoZSBhbGlhcyBnaXZlbiB0byB0aGUgcXVlcnkgY2FuZGlkYXRlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIFN1YnF1ZXJ5IG5ld1N1YnF1ZXJ5KENsYXNzTWV0YURhdGEgY2FuZGlkYXRlLCBib29sZWFuIHN1YnMsCisgICAgICAgIFN0cmluZyBhbGlhcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgYSBwYXRoIHdoaWNoIHdpbGwgY29uc2lzdAorICAgICAqIG9mIGEgY2hhaW4gb2YgMSBvciBtb3JlIGZpZWxkIG5hbWVzIHN0YXJ0aW5nIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlCisgICAgICogY2FuZGlkYXRlIGNsYXNzLjxiciAvPiBFeGFtcGxlOiA8Y29kZT5wYXJlbnQuYWRkcmVzcy5jaXR5PC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIG5ld1BhdGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyBhIHBhdGggd2hpY2ggd2lsbCBjb25zaXN0CisgICAgICogb2YgYSBjaGFpbiBvZiAxIG9yIG1vcmUgZmllbGQgbmFtZXMgc3RhcnRpbmcgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGUKKyAgICAgKiBnaXZlbiB2YWx1ZS48YnIgLz4gRXhhbXBsZTogPGNvZGU+dmFyLmFkZHJlc3MuY2l0eTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBuZXdQYXRoKFZhbHVlIHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbnN0YW50LCB3aGljaCB3aWxsIGJlCisgICAgICogYSB7QGxpbmsgTnVtYmVyfSwge0BsaW5rIFN0cmluZ30sIG9yIHtAbGluayBCb29sZWFufSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGl0ZXJhbCBuZXdMaXRlcmFsKE9iamVjdCB2YWwsIGludCBwYXJzZVR5cGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmFsdWUgcmVwcmVzZW50aW5nIDxjb2RlPnRoaXM8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBnZXRUaGlzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgZ2V0TnVsbCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGRhdGUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGdldEN1cnJlbnREYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgZ2V0Q3VycmVudFRpbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGdldEN1cnJlbnRUaW1lc3RhbXAoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyBhIHBhcmFtZXRlciBmb3IgdGhlIGdpdmVuIHZhbHVlLiBUaGUKKyAgICAgKiB0eXBlIG1heSBiZSA8Y29kZT5PYmplY3Q8L2NvZGU+IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlY2xhcmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXIgbmV3UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgbmV3RXh0ZW5zaW9uKEZpbHRlckxpc3RlbmVyIGxpc3RlbmVyLCBWYWx1ZSB0YXJnZXQsCisgICAgICAgIFZhbHVlIGFyZ3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFZhbHVlIG5ld0FnZ3JlZ2F0ZShBZ2dyZWdhdGVMaXN0ZW5lciBsaXN0ZW5lciwgVmFsdWUgYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiBhcmd1bWVudCBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIGdpdmVuIHZhbHVlcywgZWl0aGVyCisgICAgICogb2Ygd2hpY2ggbWF5IGl0c2VsZiBiZSBhbiBhcmd1bWVudCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBBcmd1bWVudHMgbmV3QXJndW1lbnRMaXN0KFZhbHVlIGFyZzEsIFZhbHVlIGFyZzIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIHVuYm91bmQgdmFyaWFibGUuIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgb25jZSBmb3IKKyAgICAgKiBhIGdpdmVuIG5hbWVkIHVuYm91bmQgdmFyaWFibGUuIFRoZSB0eXBlIG1heSBiZSA8Y29kZT5PYmplY3Q8L2NvZGU+CisgICAgICogaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgbmV3VW5ib3VuZFZhcmlhYmxlKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgdmFyaWFibGUgYm91bmQgaW4gYQorICAgICAqIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBjbGF1c2UsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSByZXVzZWQKKyAgICAgKiBmb3IgYW55IGZ1cnRoZXIgaW5zdGFuY2VzIG9mIHRoZSB2YXJpYWJsZSBpbiBzdWJleHByZXNzaW9uIG9mIHRoZQorICAgICAqIGZpbHRlciBzdHJpbmcuIFRoZSB0eXBlIG1heSBiZSA8Y29kZT5PYmplY3Q8L2NvZGU+IGlmIHRoZSB2YXJpYWJsZSBpcworICAgICAqIG5vdCBkZWNsYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgbmV3Qm91bmRWYXJpYWJsZShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBDYXN0IHRoZSB2YWx1ZSB0byB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGNhc3QoVmFsdWUgb2JqLCBDbGFzcyBjbHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB0d28gdmFsdWVzIGFkZGVkIHRvZ2V0aGVyLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBhZGQoVmFsdWUgbnVtMSwgVmFsdWUgbnVtMik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHNlY29uZCB2YWx1ZSBzdWJ0cmFjdGVkIGZyb20gdGhlIGZpcnN0LgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBzdWJ0cmFjdChWYWx1ZSBudW0xLCBWYWx1ZSBudW0yKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgdHdvIHZhbHVlcyBtdWx0aXBsaWVkIHRvZ2V0aGVyLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBtdWx0aXBseShWYWx1ZSBudW0xLCBWYWx1ZSBudW0yKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZmlyc3QgdmFsdWUgZGl2aWRlZCBieSB0aGUgZmlyc3Qgb25lLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBkaXZpZGUoVmFsdWUgbnVtMSwgVmFsdWUgbnVtMik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGZpcnN0IHZhbHVlIG1vZCdkIGJ5IHRoZSBzZWNvbmQgb25lLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBtb2QoVmFsdWUgbnVtMSwgVmFsdWUgbnVtMik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnaXZlbiBvbmUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGFicyhWYWx1ZSBudW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB7QGxpbmsgU3RyaW5nI2luZGV4T2Z9IGZ1bmN0aW9uIG9uCisgICAgICogdGhlIGdpdmVuIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBhcmdzLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBpbmRleE9mKFZhbHVlIHN0ciwgVmFsdWUgYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGNvbmNhdGVuYXRpb24gb2YKKyAgICAgKiB0aGUgZ2l2ZW4gdGFyZ2V0IHdpdGggdGhlIGdpdmVuIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGNvbmNhdChWYWx1ZSBzdHIsIFZhbHVlIGFyZ3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIHNxcnQoVmFsdWUgbnVtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUge0BsaW5rIFN0cmluZyNzdWJzdHJpbmd9IGZ1bmN0aW9uIG9uCisgICAgICogdGhlIGdpdmVuIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBhcmdzLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBzdWJzdHJpbmcoVmFsdWUgc3RyLCBWYWx1ZSBhcmdzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXBwZXIgY2FzZSBvZiB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIHRvVXBwZXJDYXNlKFZhbHVlIHN0cik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVwcGVyIGNhc2Ugb2YgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSB0b0xvd2VyQ2FzZShWYWx1ZSBzdHIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdmVyYWdlIG9mIHRoZSBnaXZlbiB2YWx1ZSBmb3IgYWxsIG1hdGNoZXMuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGF2ZyhWYWx1ZSBudW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb3VudCBvZiB0aGUgZ2l2ZW4gdmFsdWUgZm9yIGFsbCBtYXRjaGVzLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBjb3VudChWYWx1ZSBvYmopOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXggb2YgdGhlIGdpdmVuIHZhbHVlIGZvciBhbGwgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgbWF4KFZhbHVlIG51bSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heCBvZiB0aGUgZ2l2ZW4gdmFsdWUgZm9yIGFsbCBtYXRjaGVzLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBtaW4oVmFsdWUgbnVtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4IG9mIHRoZSBnaXZlbiB2YWx1ZSBmb3IgYWxsIG1hdGNoZXMuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIHN1bShWYWx1ZSBudW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBjb25kaXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgMC40LjAuMAorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZSBhbnkoVmFsdWUgdGFyZ2V0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHNpbmNlIDAuNC4wLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgYWxsKFZhbHVlIHRhcmdldCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjQuMC4wCisgICAgICovCisgICAgcHVibGljIFZhbHVlIHNpemUoVmFsdWUgdGFyZ2V0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBkaXN0aW5jdCB2YWx1ZXMgb2YgdGhlIGdpdmVuIHZhbHVlLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkCisgICAgICogd2l0aGluIGFnZ3JlZ2F0ZXMsIGZvciBleGFtcGxlOiBtYXgoZGlzdGluY3QocGF0aCkpCisJICoKKwkgKiBAc2luY2UgMC40LjAuMAorCSAqLworCXB1YmxpYyBWYWx1ZSBkaXN0aW5jdCAoVmFsdWUgb2JqKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgb2JqZWN0IGlkIG9mIHRoZSBnaXZlbiB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgVmFsdWUgZ2V0T2JqZWN0SWQgKFZhbHVlIHZhbCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb25QYXJzZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRXhwcmVzc2lvblBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWExY2IKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb25QYXJzZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5FeHByZXNzaW9uU3RvcmVRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFBhcnNlciBmb3IgcXVlcnkgbGFuZ3VhZ2VzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGEge0BsaW5rIEV4cHJlc3Npb25RdWVyeX0uCisgKiBBIFF1ZXJ5UGFyc2VyIGlzIHJlc3BvbnNpYmxlIGZvciB0cmFuc2xhdGluZyBmcm9tIHNvbWUgc3RyaW5nLWJhc2VkIHF1ZXJ5CisgKiBsYW5ndWFnZSBpbnRvIHtAbGluayBFeHByZXNzaW9ufXMuIFBhcnNlcnMgc2hvdWxkIGJlIHN0YXRlbGVzcy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgaW50ZXJmYWNlIEV4cHJlc3Npb25QYXJzZXIKKyAgICBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcga2V5IGRlc2NyaWJpbmcgdGhlIGxhbmd1YWdlIHRoYXQgdGhpcyBpbnN0YW5jZSBwYXJzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcGFyc2VkIGludGVybWVkaWF0ZSBmb3JtIG9mIHRoZSBnaXZlbiBxdWVyeSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwYXJzZShTdHJpbmcgcWwsIEV4cHJlc3Npb25TdG9yZVF1ZXJ5IHF1ZXJ5KTsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgcGFyc2VkIHF1ZXJ5IGZvcm0gdG8gc2V0IGluZm9ybWF0aW9uIHN1Y2ggYXMgY2FuZGlkYXRlIHR5cGUsCisgICAgICogcmVzdWx0IHR5cGUsIGV0YyB0aGF0IHdhcyBlbmNvZGVkIGluIHRoZSBxdWVyeSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGUoT2JqZWN0IHBhcnNlZCwgRXhwcmVzc2lvblN0b3JlUXVlcnkgcXVlcnkpOworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGdpdmVuIHF1ZXJ5IHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlFeHByZXNzaW9ucyBldmFsKE9iamVjdCBwYXJzZWQsIEV4cHJlc3Npb25TdG9yZVF1ZXJ5IHF1ZXJ5LAorICAgICAgICBFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5LCBDbGFzc01ldGFEYXRhIGNhbmRpZGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gdmFsdWUgY2xhdXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVbXSBldmFsKFN0cmluZ1tdIHZhbHMsIEV4cHJlc3Npb25TdG9yZVF1ZXJ5IHF1ZXJ5LAorICAgICAgICBFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5LCBDbGFzc01ldGFEYXRhIGNhbmRpZGF0ZSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb25WaXNpdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4cHJlc3Npb25WaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxMTQ5NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRXhwcmVzc2lvblZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworCisvKioKKyAqIFZpc2l0cyBub2RlcyBvZiBhIHF1ZXJ5IGV4cHJlc3Npb24gdHJlZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4cHJlc3Npb25WaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIEVudGVyIGFuIGV4cHJlc3Npb24uICBUaGUgZXhwcmVzc2lvbiB3aWxsIHRoZW4gaW52b2tlIHZpc2l0cyBvbiBpdHMKKyAgICAgKiBjb21wb25lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVudGVyKEV4cHJlc3Npb24gZXhwKTsKKworICAgIC8qKgorICAgICAqIExlYXZlIGFuIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhpdChFeHByZXNzaW9uIGV4cCk7CisKKyAgICAvKioKKyAgICAgKiBFbnRlciBhIHZhbHVlLiAgVGhlIHZhbHVlIHdpbGwgdGhlbiBpbnZva2UgdmlzaXRzIG9uIGl0cyBjb21wb25lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVudGVyKFZhbHVlIHZhbCk7CisKKyAgICAvKioKKyAgICAgKiBMZWF2ZSBhIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4aXQoVmFsdWUgdmFsKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvRXh0ZW5zaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDA1ODcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0V4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogQSB2YWx1ZSBwcm9kdWNlZCBmcm9tIGV2YWx1YXRpbmcgYSBjdXN0b20gZXh0ZW5zaW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEV4dGVuc2lvbgorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgRmlsdGVyTGlzdGVuZXIgX2xpc3RlbmVyOworICAgIHByaXZhdGUgZmluYWwgVmFsIF90YXJnZXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX2FyZzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgZmlsdGVyIGxpc3RlbmVyLCBpdHMgdGFyZ2V0IHZhbHVlLCBhbmQKKyAgICAgKiBpdHMgYXJndW1lbnQgdmFsdWUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0ZW5zaW9uKEZpbHRlckxpc3RlbmVyIGxpc3RlbmVyLCBWYWwgdGFyZ2V0LCBWYWwgYXJnKSB7CisgICAgICAgIF9saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBfdGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBfYXJnID0gYXJnOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IChfdGFyZ2V0ID09IG51bGwpID8gbnVsbCA6IF90YXJnZXQuZ2V0VHlwZSgpOworICAgICAgICByZXR1cm4gX2xpc3RlbmVyLmdldFR5cGUodGFyZ2V0Q2xhc3MsIGdldEFyZ1R5cGVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IHRhcmdldCA9IG51bGw7CisgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbnVsbDsKKyAgICAgICAgaWYgKF90YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGFyZ2V0ID0gX3RhcmdldC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICAgICAgdGFyZ2V0Q2xhc3MgPSBfdGFyZ2V0LmdldFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgYXJnID0gbnVsbDsKKyAgICAgICAgaWYgKF9hcmcgIT0gbnVsbCkKKyAgICAgICAgICAgIGFyZyA9IF9hcmcuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIF9saXN0ZW5lci5ldmFsdWF0ZSh0YXJnZXQsIHRhcmdldENsYXNzLCBnZXRBcmdzKGFyZyksCisgICAgICAgICAgICBnZXRBcmdUeXBlcygpLCBjYW5kaWRhdGUsIGN0eCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzc1tdIGdldEFyZ1R5cGVzKCkgeworICAgICAgICBpZiAoX2FyZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChfYXJnIGluc3RhbmNlb2YgQXJncykKKyAgICAgICAgICAgIHJldHVybiAoKEFyZ3MpIF9hcmcpLmdldFR5cGVzKCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXXsgX2FyZy5nZXRUeXBlKCkgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdFtdIGdldEFyZ3MoT2JqZWN0IGFyZykgeworICAgICAgICBpZiAoYXJnID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKF9hcmcgaW5zdGFuY2VvZiBBcmdzKQorICAgICAgICAgICAgcmV0dXJuIChPYmplY3RbXSkgYXJnOworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdeyBhcmcgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIGlmIChfdGFyZ2V0ICE9IG51bGwpCisgICAgICAgICAgICBfdGFyZ2V0LmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBpZiAoX2FyZyAhPSBudWxsKQorICAgICAgICAgICAgX2FyZy5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9GaWx0ZXJMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9GaWx0ZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMWVmMmQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0ZpbHRlckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEEgZmlsdGVyIGxpc3RlbmVyIGV4dGVuZHMgZXhwcmVzc2lvbiBmaWx0ZXJzIHdpdGggY3VzdG9tIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmlsdGVyTGlzdGVuZXIKKyAgICBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhZyB0aGF0IHRoaXMgZXh0ZW5zaW9uIGxpc3RlbnMgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGV4dGVuc2lvbiBleHBlY3RzIGFyZ3VtZW50cyB0byBhY3Qgb24uIFNvbWUKKyAgICAgKiBleHRlbnNpb25zIG1heSBub3QgbmVlZCBhcmd1bWVudHM7IGZvciBleGFtcGxlLCBhbiBleHRlbnNpb24gdG8KKyAgICAgKiBzd2l0Y2ggYSBzdHJpbmcgdG8gdXBwZXIgY2FzZSBtaWdodCBiZSBvZiB0aGUgZm9ybToKKyAgICAgKiA8Y29kZT5maWVsZC5leHQ6dG9VcHBlckNhc2UgKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4cGVjdHNBcmd1bWVudHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZXh0ZW5zaW9uIGV4cGVjdHMgYSB0YXJnZXQgdG8gYWN0IG9uLiBTb21lCisgICAgICogZXh0ZW5zaW9ucyBhY3Qgb24gYSBmaWVsZCBvciBvYmplY3QgdmFsdWU7IG90aGVycyBzdGFuZCBhbG9uZS4KKyAgICAgKiA8Y29kZT5maWVsZC5leHQ6dG9VcHBlckNhc2UgKCk8L2NvZGU+IGFjdHMgb24gdGhlIHRhcmdldAorICAgICAqIDxjb2RlPmZpZWxkPC9jb2RlPiBidXQgaGFzIG5vIGFyZ3VtZW50cywgd2hpbGUgYW5vdGhlciBwb3NzaWJsZSBmb3JtLAorICAgICAqIDxjb2RlPmV4dDp0b1VwcGVyQ2FzZSAoZmllbGQpPC9jb2RlPiBoYXMgbm8gdGFyZ2V0IGJ1dCBkb2VzIGhhdmUgYW4KKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleHBlY3RzVGFyZ2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4gVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuCisgICAgICogZXZhbHVhdGluZyBpbi1tZW1vcnkgZXhwcmVzc2lvbnMuIFRoZSBtZXRob2QgdXNlZCB3aGVuIGV2YWx1YXRpbmcKKyAgICAgKiBkYXRhIHN0b3JlIGV4cHJlc3Npb25zIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgZGF0YSBzdG9yZSBpbiB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgb2JqZWN0IC8gZmllbGQgdmFsdWUgdG8gYWN0IG9uOyB3aWxsIGJlCisgICAgICogbnVsbCBpZiB0aGlzIGV4dGVuc2lvbiBkb2VzIG5vdCBleHBlY3QgYSB0YXJnZXQKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgdGhlIGV4cGVjdGVkIGNsYXNzIG9mIHRoZSB0YXJnZXQ7IGdpdmVuIGluIGNhc2UKKyAgICAgKiB0aGUgdGFyZ2V0IGV2YWx1YXRlcyB0byBudWxsIGFuZCB0eXBpbmcgaXMgbmVlZGVkCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHZhbHVlcyBvZiB0aGUgYXJndW1lbnRzIGdpdmVuIGluIHRoZSBmaWx0ZXI7CisgICAgICogd2lsbCBiZSBudWxsIGlmIHRoaXMgZXh0ZW5zaW9uIGRvZXMgbm90IGV4cGVjdCBhbiBhcmd1bWVudAorICAgICAqIEBwYXJhbSBhcmdDbGFzc2VzIHRoZSBleHBlY3RlZCBjbGFzc2VzIG9mIHRoZSBhcmd1bWVudHM7IGdpdmVuIGluIGNhc2UKKyAgICAgKiBhbiBhcmd1bWVudCBldmFsdWF0ZXMgdG8gbnVsbCBhbmQgdHlwaW5nIGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBjYW5kaWRhdGUgdGhlIGNhbmRpZGF0ZSBvYmplY3QgYmVpbmcgZXZhbHVhdGVkCisgICAgICogQHBhcmFtIGN0eCB0aGUgcGVyc2lzdGVuY2UgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBleHRlbnNpb24gZm9yIHRoaXMgY2FuZGlkYXRlOyBpZgorICAgICAqIHRoaXMgZXh0ZW5zaW9uIGlzIGFuIGV4cHJlc3Npb24sIHRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIHJldHVybiB7QGxpbmsgQm9vbGVhbiNUUlVFfSBvciB7QGxpbmsgQm9vbGVhbiNGQUxTRX0KKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb24gaWYgdGhpcyBleHRlbnNpb24gZG9lcyBub3QgCisgICAgICogc3VwcG9ydCBpbi1tZW1vcnkgb3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgdGFyZ2V0LCBDbGFzcyB0YXJnZXRDbGFzcywgT2JqZWN0W10gYXJncywKKyAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzLCBPYmplY3QgY2FuZGlkYXRlLCBTdG9yZUNvbnRleHQgY3R4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHRoaXMgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgdGhlIGV4cGVjdGVkIGNsYXNzIG9mIHRoZSB0YXJnZXQsIG9yIG51bGwgaWYgbm8gdGFyZ2V0CisgICAgICogQHBhcmFtIGFyZ0NsYXNzZXMgdGhlIGV4cGVjdGVkIGNsYXNzZXMgb2YgdGhlIGFyZ3VtZW50cywgb3IgbnVsbCBpZgorICAgICAqIG5vIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKENsYXNzIHRhcmdldENsYXNzLCBDbGFzc1tdIGFyZ0NsYXNzZXMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9HZXRNYXBWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9HZXRNYXBWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDg2MzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0dldE1hcFZhbHVlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBrZXkgaW4gYSBNYXAuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgR2V0TWFwVmFsdWUKKyAgICBleHRlbmRzIFZhbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfbWFwOworICAgIHByaXZhdGUgZmluYWwgVmFsIF9hcmc7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB2YWx1ZSB0byB1cHBlci1jYXNlLgorICAgICAqLworICAgIHB1YmxpYyBHZXRNYXBWYWx1ZShWYWwgbWFwLCBWYWwgYXJnKSB7CisgICAgICAgIF9tYXAgPSBtYXA7CisgICAgICAgIF9hcmcgPSBhcmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuICgoTWFwKSBfbWFwLmV2YWwoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcykpLgorICAgICAgICAgICAgZ2V0KF9hcmcuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9HZXRPYmplY3RJZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9HZXRPYmplY3RJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTVjY2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0dldE9iamVjdElkLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBHZXQgdGhlIG9pZCBvZiBhbiBvYmplY3QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgR2V0T2JqZWN0SWQKKyAgICBleHRlbmRzIFZhbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdmFsdWUgd2hvc2Ugb2lkIHRvIGV4dHJhY3QuCisgICAgICovCisgICAgcHVibGljIEdldE9iamVjdElkKFZhbCB2YWwpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBjdHguZ2V0T2JqZWN0SWQoX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0dyZWF0ZXJUaGFuRXF1YWxFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0dyZWF0ZXJUaGFuRXF1YWxFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlMDNhMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvR3JlYXRlclRoYW5FcXVhbEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBFeHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdHdvIG90aGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBHcmVhdGVyVGhhbkVxdWFsRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29tcGFyZUV4cHJlc3Npb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgdG8gY29tcGFyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3JlYXRlclRoYW5FcXVhbEV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgaWYgKCEobzEgaW5zdGFuY2VvZiBDb21wYXJhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSkgbzEpLmNvbXBhcmVUbyhvMikgPj0gMDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvR3JlYXRlclRoYW5FeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0dyZWF0ZXJUaGFuRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTBhMTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0dyZWF0ZXJUaGFuRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCisvKioKKyAqIEV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0d28gb3RoZXJzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEdyZWF0ZXJUaGFuRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29tcGFyZUV4cHJlc3Npb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgdG8gY29tcGFyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3JlYXRlclRoYW5FeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBzdXBlcih2YWwxLCB2YWwyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIGlmICghKG8xIGluc3RhbmNlb2YgQ29tcGFyYWJsZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8obzIpID4gMDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSW5NZW1vcnlFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Jbk1lbW9yeUV4cHJlc3Npb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmZGI1ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSW5NZW1vcnlFeHByZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk9iamVjdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRXh0ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogRXhwcmVzc2lvbiBmYWN0b3J5IGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBxdWVyaWVzCisgKiBpbiBtZW1vcnkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5RXhwcmVzc2lvbkZhY3RvcnkKKyAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25GYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbHVlIE5VTEwgPSBuZXcgTnVsbCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbHVlIENVUlJFTlRfREFURSA9IG5ldyBDdXJyZW50RGF0ZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBVTklRVUUgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBsaXN0IG9mIHVuYm91bmQgdmFyaWFibGVzIGluIHRoaXMgcXVlcnkKKyAgICBwcml2YXRlIExpc3QgX3VuYm91bmRzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIGNhbmRpZGF0ZSBtYXRjaGVzIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGlzCisgICAgICogZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgQ2xhc3NNZXRhRGF0YSB0eXBlLAorICAgICAgICBib29sZWFuIHN1YnMsIE9iamVjdCBjYW5kaWRhdGUsIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAvLyBpZ25vcmUgY2FuZGlkYXRlcyBvZiB0aGUgd3JvbmcgdHlwZQorICAgICAgICBpZiAoY2FuZGlkYXRlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghc3VicyAmJiBjYW5kaWRhdGUuZ2V0Q2xhc3MoKSAhPSB0eXBlLmdldERlc2NyaWJlZFR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHN1YnMgJiYgIXR5cGUuZ2V0RGVzY3JpYmVkVHlwZSgpLmlzQXNzaWduYWJsZUZyb20KKyAgICAgICAgICAgIChjYW5kaWRhdGUuZ2V0Q2xhc3MoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gZm9yIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdmFsdWVzCisgICAgICAgIC8vIG9mIHRoZSB1bmJvdW5kIHZhcmlhYmxlczsgdGhlIGNhbmRpZGF0ZSBtYXRjaGVzIGlmIGFueSBjb21iaW5hdGlvbgorICAgICAgICAvLyBtYXRjaGVzCisgICAgICAgIHJldHVybiBtYXRjaGVzKChFeHApIGV4cHMuZmlsdGVyLCBjYW5kaWRhdGUsIGN0eCwgcGFyYW1zLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmUgbWV0aG9kIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGZvciBhbGwgcG9zc2libGUKKyAgICAgKiBjb21iaW5hdGlvbnMgb2YgdW5ib3VuZCB2YXJpYWJsZXMuIFRoaXMgbWV0aG9kIHNpbXVsYXRlcyBhIHNlcXVlbmNlCisgICAgICogb2YgZW1iZWRkZWQgcHJvY2VkdXJhbCBsb29wcyBvdmVyIHRoZSBleHRlbnRzIG9mIGFsbCB2YXJpYWJsZXMgaW4gdGhlCisgICAgICogdW5ib3VuZHMgbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhFeHAgZXhwLCBPYmplY3QgY2FuZGlkYXRlLCBTdG9yZUNvbnRleHQgY3R4LAorICAgICAgICBPYmplY3RbXSBwYXJhbXMsIGludCBpKSB7CisgICAgICAgIC8vIGJhc2UgY2FzZTogYWxsIHZhcmlhYmxlcyBoYXZlIGJlZW4gYWxpYXNlZDsgZXZhbHVhdGUgZm9yIGN1cnJlbnQKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIGlmIChfdW5ib3VuZHMgPT0gbnVsbCB8fCBpID09IF91bmJvdW5kcy5zaXplKCkpCisgICAgICAgICAgICByZXR1cm4gZXhwLmV2YWx1YXRlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlLCBjdHgsIHBhcmFtcyk7CisKKyAgICAgICAgLy8gZ3JhYiB0aGUgZXh0ZW50IGZvciB0aGlzIHZhcmlhYmxlCisgICAgICAgIFVuYm91bmRWYXJpYWJsZSB2YXIgPSAoVW5ib3VuZFZhcmlhYmxlKSBfdW5ib3VuZHMuZ2V0KGkpOworICAgICAgICBJdGVyYXRvciBpdHIgPSBjdHguZXh0ZW50SXRlcmF0b3IodmFyLmdldFR5cGUoKSwgdHJ1ZSwgbnVsbCwgZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaWYgdGhlIGV4dGVudCB3YXMgZW1wdHksIHRoZW4gYWxpYXMgdGhlIHZhcmlhYmxlIHRvIG51bGwKKyAgICAgICAgICAgIGlmICghaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHZhci5zZXRWYWx1ZShudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcyhleHAsIGNhbmRpZGF0ZSwgY3R4LCBwYXJhbXMsIGkgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdHJ5IGV2ZXJ5IHZhbHVlLCBzaG9ydC1jaXJjdWl0aW5nIG9uIG1hdGNoCisgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdmFyaWFibGUgdG8gZWFjaCBleHRlbnQgdmFsdWUgYW5kIHJlY3Vyc2UKKyAgICAgICAgICAgICAgICB2YXIuc2V0VmFsdWUoaXRyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoZXhwLCBjYW5kaWRhdGUsIGN0eCwgcGFyYW1zLCBpICsgMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBubyBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgSW1wbEhlbHBlci5jbG9zZShpdHIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JvdXAgdGhlIGxpc3Qgb2YgbWF0Y2hlcyBpbnRvIGEgbGlzdCBvZiBsaXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBncm91cChRdWVyeUV4cHJlc3Npb25zIGV4cHMsIExpc3QgbWF0Y2hlcywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgbWF0Y2hlcy5pc0VtcHR5KCkgfHwgZXhwcy5ncm91cGluZy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworCisgICAgICAgIC8vIHRvIGZvcm0gZ3JvdXBzIHdlIGZpcnN0IG9yZGVyIG9uIHRoZSBncm91cGluZyBjcml0ZXJpYQorICAgICAgICBtYXRjaGVzID0gb3JkZXIoZXhwcywgZXhwcy5ncm91cGluZywgZmFsc2UsIG1hdGNoZXMsIGN0eCwgcGFyYW1zKTsKKworICAgICAgICAvLyBub3cgd2UgY29tYmluZSBhbGwgcmVzdWx0cyB3aG9zZSB2YWx1ZXMgZm9yIGVhY2ggZ3JvdXBpbmcgY2xhdXNlCisgICAgICAgIC8vIGFyZSB0aGUgc2FtZSwgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IHRoZXNlIHZhbHVlcyB3aWxsIGFscmVhZHkgYmUKKyAgICAgICAgLy8gdG9nZXRoZXIgZHVlIHRvIHRoZSBzb3J0aW5nCisgICAgICAgIE9iamVjdFtdIHByZXZzID0gbmV3IE9iamVjdFtleHBzLmdyb3VwaW5nLmxlbmd0aF07CisgICAgICAgIEFycmF5cy5maWxsKHByZXZzLCBVTklRVUUpOworICAgICAgICBPYmplY3RbXSBjdXJzID0gbmV3IE9iamVjdFtleHBzLmdyb3VwaW5nLmxlbmd0aF07CisgICAgICAgIExpc3QgZ3JvdXBlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdCBncm91cCA9IG51bGw7CisgICAgICAgIE9iamVjdCBwYzsKKyAgICAgICAgYm9vbGVhbiBlcTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBwYyA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBlcSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cHMuZ3JvdXBpbmcubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjdXJzW2ldID0gKChWYWwpIGV4cHMuZ3JvdXBpbmdbaV0pLmV2YWx1YXRlKHBjLCBwYywgY3R4LAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICAgICAgICAgIGVxID0gZXEgJiYgT2JqZWN0VXRpbHMuZXF1YWxzKHByZXZzW2ldLCBjdXJzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QncyBncm91cGluZyB2YWx1ZXMgZGlmZmVyIGZyb20gdGhlIHByZXYsCisgICAgICAgICAgICAvLyBzdGFydCBhIG5ldyBncm91cAorICAgICAgICAgICAgaWYgKCFlcSkgeworICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBncm91cGVkLmFkZChncm91cCk7CisgICAgICAgICAgICAgICAgZ3JvdXAgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cC5hZGQocGMpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJzLCAwLCBwcmV2cywgMCwgY3Vycy5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB0aGUgbGFzdCBncm91cCBmb3JtZWQKKyAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpCisgICAgICAgICAgICBncm91cGVkLmFkZChncm91cCk7CisKKyAgICAgICAgcmV0dXJuIGdyb3VwZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGdyb3VwIG1hdGNoZXMgdGhlIGhhdmluZyBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoUXVlcnlFeHByZXNzaW9ucyBleHBzLCBDb2xsZWN0aW9uIGdyb3VwLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwgfHwgZ3JvdXAuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZXhwcy5oYXZpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGZvciBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHZhbHVlcworICAgICAgICAvLyBvZiB0aGUgdW5ib3VuZCB2YXJpYWJsZXM7IHRoZSBncm91cCBtYXRjaGVzIGlmIGFueSBjb21iaW5hdGlvbgorICAgICAgICAvLyBtYXRjaGVzCisgICAgICAgIHJldHVybiBtYXRjaGVzKChFeHApIGV4cHMuaGF2aW5nLCBncm91cCwgY3R4LCBwYXJhbXMsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gZm9yIGFsbCBwb3NzaWJsZQorICAgICAqIGNvbWJpbmF0aW9ucyBvZiB1bmJvdW5kIHZhcmlhYmxlcy4gVGhpcyBtZXRob2Qgc2ltdWxhdGVzIGEgc2VxdWVuY2UKKyAgICAgKiBvZiBlbWJlZGRlZCBwcm9jZWR1cmFsIGxvb3BzIG92ZXIgdGhlIGV4dGVudHMgb2YgYWxsIHZhcmlhYmxlcyBpbiB0aGUKKyAgICAgKiB1bmJvdW5kcyBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKEV4cCBleHAsIENvbGxlY3Rpb24gZ3JvdXAsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcywgaW50IGkpIHsKKyAgICAgICAgLy8gYmFzZSBjYXNlOiBhbGwgdmFyaWFibGVzIGhhdmUgYmVlbiBhbGlhc2VkOyBldmFsdWF0ZSBmb3IgY3VycmVudAorICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgaWYgKF91bmJvdW5kcyA9PSBudWxsIHx8IGkgPT0gX3VuYm91bmRzLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBleHAuZXZhbHVhdGUoZ3JvdXAsIGN0eCwgcGFyYW1zKTsKKworICAgICAgICAvLyBncmFiIHRoZSBleHRlbnQgZm9yIHRoaXMgdmFyaWFibGUKKyAgICAgICAgVW5ib3VuZFZhcmlhYmxlIHZhciA9IChVbmJvdW5kVmFyaWFibGUpIF91bmJvdW5kcy5nZXQoaSk7CisgICAgICAgIEV4dGVudCBleHRlbnQgPSBjdHguZ2V0QnJva2VyKCkubmV3RXh0ZW50KHZhci5nZXRUeXBlKCksIHRydWUpOworICAgICAgICBJdGVyYXRvciBpdHIgPSBleHRlbnQuaXRlcmF0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBleHRlbnQgd2FzIGVtcHR5LCB0aGVuIGFsaWFzIHRoZSB2YXJpYWJsZSB0byBudWxsCisgICAgICAgICAgICBpZiAoIWl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB2YXIuc2V0VmFsdWUobnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMoZXhwLCBncm91cCwgY3R4LCBwYXJhbXMsIGkgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdHJ5IGV2ZXJ5IHZhbHVlLCBzaG9ydC1jaXJjdWl0aW5nIG9uIG1hdGNoCisgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdmFyaWFibGUgdG8gZWFjaCBleHRlbnQgdmFsdWUgYW5kIHJlY3Vyc2UKKyAgICAgICAgICAgICAgICB2YXIuc2V0VmFsdWUoaXRyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoZXhwLCBncm91cCwgY3R4LCBwYXJhbXMsIGkgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vIG1hdGNoCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBJbXBsSGVscGVyLmNsb3NlKGl0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIHByb2plY3Rpb25zIGZvciB0aGUgZ2l2ZW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBwcm9qZWN0KFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgTGlzdCBtYXRjaGVzLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgaWYgKGV4cHMucHJvamVjdGlvbnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKworICAgICAgICAvLyBpZiBhbiB1bmdyb3VwZWQgYWdncmVnYXRlLCBldmFsdWF0ZSB0aGUgd2hvbGUgbWF0Y2hlcyBsaXN0CisgICAgICAgIGlmIChleHBzLmdyb3VwaW5nLmxlbmd0aCA9PSAwICYmIGV4cHMuaXNBZ2dyZWdhdGUoKSkgeworICAgICAgICAgICAgT2JqZWN0W10gcHJvamVjdGlvbiA9IHByb2plY3QobWF0Y2hlcywgZXhwcywgdHJ1ZSwgY3R4LCBwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdeyBwcm9qZWN0aW9uIH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXZhbHVhdGUgZWFjaCBjYW5kaWRhdGUKKyAgICAgICAgTGlzdCBwcm9qZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KG1hdGNoZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgcHJvamVjdGVkLmFkZChwcm9qZWN0KGl0ci5uZXh0KCksIGV4cHMsIGV4cHMuZ3JvdXBpbmcubGVuZ3RoID4gMCwKKyAgICAgICAgICAgICAgICBjdHgsIHBhcmFtcykpOworICAgICAgICByZXR1cm4gcHJvamVjdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgcHJvamVjdGlvbiBvbiB0aGUgZ2l2ZW4gY2FuZGlkYXRlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0W10gcHJvamVjdChPYmplY3QgY2FuZGlkYXRlLCBRdWVyeUV4cHJlc3Npb25zIGV4cHMsCisgICAgICAgIGJvb2xlYW4gYWdnLCBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0W10gcHJvamVjdGlvbiA9IG5ldyBPYmplY3RbZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGgKKyAgICAgICAgICAgICsgZXhwcy5vcmRlcmluZy5sZW5ndGhdOworCisgICAgICAgIC8vIGNhbGN1YWx0ZSByZXN1bHQgdmFsdWVzCisgICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cHMucHJvamVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhZ2cpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChWYWwpIGV4cHMucHJvamVjdGlvbnNbaV0pLmV2YWx1YXRlKChDb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUsIG51bGwsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoKFZhbCkgZXhwcy5wcm9qZWN0aW9uc1tpXSkuZXZhbHVhdGUoY2FuZGlkYXRlLAorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgICAgIHByb2plY3Rpb25baV0gPSByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyB0YWNrIG9uIG9yZGVyaW5nIHZhbHVlcworICAgICAgICBib29sZWFuIHJlcGVhdDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBzLm9yZGVyaW5nLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBhbHJlYWR5IHNlbGVjdGVkIGFzIGEgcmVzdWx0PworICAgICAgICAgICAgcmVwZWF0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgIXJlcGVhdCAmJiBqIDwgZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChleHBzLm9yZGVyaW5nQ2xhdXNlc1tpXS5lcXVhbHMoZXhwcy5wcm9qZWN0aW9uQ2xhdXNlc1tqXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJvamVjdGlvbltqXTsKKyAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vdCBzZWxlY3RlZCBhcyByZXN1bHQ7IGNhbGN1bGF0ZSB2YWx1ZQorICAgICAgICAgICAgaWYgKCFyZXBlYXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWdnKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKFZhbCkgZXhwcy5vcmRlcmluZ1tpXSkuZXZhbHVhdGUoKENvbGxlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUsIG51bGwsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoVmFsKSBleHBzLm9yZGVyaW5nW2ldKS5ldmFsdWF0ZShjYW5kaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvamVjdGlvbltpICsgZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGhdID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9qZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9yZGVyIHRoZSBnaXZlbiBsaXN0IG9mIG1hdGNoZXMgb24gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IG9yZGVyKFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgTGlzdCBtYXRjaGVzLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVyKGV4cHMsIGV4cHMub3JkZXJpbmcsIHRydWUsIG1hdGNoZXMsIGN0eCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlciB0aGUgZ2l2ZW4gbGlzdCBvZiBtYXRjaGVzIG9uIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0ZWQgd2hldGhlciBwcm9qZWN0aW9ucyBoYXZlIGJlZW4gYXBwbGllZCB0byB0aGUgbWF0Y2hlcyB5ZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Qgb3JkZXIoUXVlcnlFeHByZXNzaW9ucyBleHBzLCBWYWx1ZVtdIG9yZGVyVmFsdWVzLAorICAgICAgICBib29sZWFuIHByb2plY3RlZCwgTGlzdCBtYXRjaGVzLCBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCBtYXRjaGVzLmlzRW1wdHkoKQorICAgICAgICAgICAgfHwgb3JkZXJWYWx1ZXMgPT0gbnVsbCB8fCBvcmRlclZhbHVlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworCisgICAgICAgIGludCByZXN1bHRzID0gKHByb2plY3RlZCkgPyBleHBzLnByb2plY3Rpb25zLmxlbmd0aCA6IDA7CisgICAgICAgIGJvb2xlYW5bXSBhc2MgPSAocHJvamVjdGVkKSA/IGV4cHMuYXNjZW5kaW5nIDogbnVsbDsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9yZGVyVmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcHJvamVjdGlvbiwgdGhlbiBpbiBwcm9qZWN0KCkgd2UgbXVzdCBoYXZlIHNlbGVjdGVkCisgICAgICAgICAgICAvLyB0aGUgb3JkZXJpbmcgdmFsdWUgYWxyZWFkeSBhZnRlciB0aGUgcHJvamVjdGlvbiB2YWx1ZXMKKyAgICAgICAgICAgIGlkeCA9IChyZXN1bHRzID4gMCkgPyByZXN1bHRzICsgaSA6IC0xOworICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLAorICAgICAgICAgICAgICAgIG5ldyBPcmRlclZhbHVlQ29tcGFyYXRvcigoVmFsKSBvcmRlclZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgYXNjID09IG51bGwgfHwgYXNjW2ldLCBpZHgsIGN0eCwgcGFyYW1zKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBnaXZlbiBsaXN0IG9mIG1hdGNoZXMsIHJlbW92aW5nIGR1cGxpY2F0ZSBlbnRyaWVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGRpc3RpbmN0KFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcywgYm9vbGVhbiBmcm9tRXh0ZW50LAorICAgICAgICBMaXN0IG1hdGNoZXMpIHsKKyAgICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCBtYXRjaGVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworCisgICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gZGlzdGluY3QgaWYgbm90IGluc3RydWN0ZWQgdG8sIG9yIGlmIHRoZXNlIGFyZQorICAgICAgICAvLyBjYW5kaWRhdGUgb2JqZWN0cyBmcm9tIGFuIGV4dGVudAorICAgICAgICBpbnQgbGVuID0gZXhwcy5wcm9qZWN0aW9ucy5sZW5ndGg7CisgICAgICAgIGlmICgoZXhwcy5kaXN0aW5jdCAmIGV4cHMuRElTVElOQ1RfVFJVRSkgPT0gMAorICAgICAgICAgICAgfHwgKGZyb21FeHRlbnQgJiYgbGVuID09IDApKQorICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisKKyAgICAgICAgU2V0IHNlZW4gPSBuZXcgSGFzaFNldChtYXRjaGVzLnNpemUoKSk7CisgICAgICAgIExpc3QgZGlzdGluY3QgPSBudWxsOworICAgICAgICBPYmplY3QgY3VyOworICAgICAgICBPYmplY3Qga2V5OworICAgICAgICBmb3IgKExpc3RJdGVyYXRvciBsaSA9IG1hdGNoZXMubGlzdEl0ZXJhdG9yKCk7IGxpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGN1ciA9IGxpLm5leHQoKTsKKyAgICAgICAgICAgIGtleSA9IChsZW4gPiAwICYmIGN1ciAhPSBudWxsKSA/IG5ldyBBcnJheUtleSgoT2JqZWN0W10pIGN1cikgOiBjdXI7CisKKyAgICAgICAgICAgIGlmIChzZWVuLmFkZChrZXkpKSB7CisgICAgICAgICAgICAgICAgLy8ga2V5IGhhc24ndCBiZWVuIHNlZW4gYmVmb3JlOyBpZiB3ZSd2ZSBjcmVhdGVkIGEgZGlzdGluY3QKKyAgICAgICAgICAgICAgICAvLyBsaXN0LCBrZWVwIGFkZGluZyB0byBpdAorICAgICAgICAgICAgICAgIGlmIChkaXN0aW5jdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdC5hZGQoY3VyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGluY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY29weSB0aGUgbWF0Y2hlcyBsaXN0IGJlY2F1c2UgdGhlIGRpc3RpbmN0IGxpc3QKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGRpZmZlcmVudCAod2UndmUgY29tZSBhY3Jvc3MgYSBub24tdW5pcXVlIGtleSk7IGFkZAorICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgZWxlbWVudHMgd2UndmUgc2tpcHBlZCBvdmVyIHNvIGZhcgorICAgICAgICAgICAgICAgIGRpc3RpbmN0ID0gbmV3IEFycmF5TGlzdChtYXRjaGVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZGlzdGluY3QuYWRkQWxsKG1hdGNoZXMuc3ViTGlzdCgwLCBsaS5wcmV2aW91c0luZGV4KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGRpc3RpbmN0ID09IG51bGwpID8gbWF0Y2hlcyA6IGRpc3RpbmN0OworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVtcHR5RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24oVmFsdWUgdikgeworICAgICAgICByZXR1cm4gbmV3IFZhbEV4cHJlc3Npb24oKFZhbCkgdik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZXF1YWwoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgRXF1YWxFeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gbm90RXF1YWwoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgTm90RXF1YWxFeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gbGVzc1RoYW4oVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgTGVzc1RoYW5FeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ3JlYXRlclRoYW4oVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JlYXRlclRoYW5FeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gbGVzc1RoYW5FcXVhbChWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMZXNzVGhhbkVxdWFsRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdyZWF0ZXJUaGFuRXF1YWwoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JlYXRlclRoYW5FcXVhbEV4cHJlc3Npb24oKFZhbCkgdjEsIChWYWwpIHYyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBpc0VtcHR5KFZhbHVlIHYxKSB7CisgICAgICAgIHJldHVybiBuZXcgSXNFbXB0eUV4cHJlc3Npb24oKFZhbCkgdjEpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGlzTm90RW1wdHkoVmFsdWUgdjEpIHsKKyAgICAgICAgcmV0dXJuIG5vdChpc0VtcHR5KHYxKSk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gY29udGFpbnMoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGFpbnNFeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gY29udGFpbnNLZXkoVmFsdWUgdjEsIFZhbHVlIHYyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGFpbnNLZXlFeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gY29udGFpbnNWYWx1ZShWYWx1ZSB2MSwgVmFsdWUgdjIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb250YWluc1ZhbHVlRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBnZXRNYXBWYWx1ZShWYWx1ZSBtYXAsIFZhbHVlIGFyZykgeworICAgICAgICByZXR1cm4gbmV3IEdldE1hcFZhbHVlKChWYWwpIG1hcCwgKFZhbCkgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBpc0luc3RhbmNlKFZhbHVlIHYxLCBDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VvZkV4cHJlc3Npb24oKFZhbCkgdjEsIGMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGFuZChFeHByZXNzaW9uIGV4cDEsIEV4cHJlc3Npb24gZXhwMikgeworICAgICAgICBpZiAoZXhwMSBpbnN0YW5jZW9mIEJpbmRWYXJpYWJsZUV4cHJlc3Npb24pCisgICAgICAgICAgICByZXR1cm4gbmV3IEJpbmRWYXJpYWJsZUFuZEV4cHJlc3Npb24oKEJpbmRWYXJpYWJsZUV4cHJlc3Npb24pIGV4cDEsCisgICAgICAgICAgICAgICAgKEV4cCkgZXhwMik7CisgICAgICAgIHJldHVybiBuZXcgQW5kRXhwcmVzc2lvbigoRXhwKSBleHAxLCAoRXhwKSBleHAyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBvcihFeHByZXNzaW9uIGV4cDEsIEV4cHJlc3Npb24gZXhwMikgeworICAgICAgICByZXR1cm4gbmV3IE9yRXhwcmVzc2lvbigoRXhwKSBleHAxLCAoRXhwKSBleHAyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBub3QoRXhwcmVzc2lvbiBleHApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb3RFeHByZXNzaW9uKChFeHApIGV4cCk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gYmluZFZhcmlhYmxlKFZhbHVlIHZhciwgVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgQmluZFZhcmlhYmxlRXhwcmVzc2lvbigoQm91bmRWYXJpYWJsZSkgdmFyLCAoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGJpbmRLZXlWYXJpYWJsZShWYWx1ZSB2YXIsIFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IEJpbmRLZXlWYXJpYWJsZUV4cHJlc3Npb24oKEJvdW5kVmFyaWFibGUpIHZhciwgKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBiaW5kVmFsdWVWYXJpYWJsZShWYWx1ZSB2YXIsIFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IEJpbmRWYWx1ZVZhcmlhYmxlRXhwcmVzc2lvbigoQm91bmRWYXJpYWJsZSkgdmFyLCAoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGVuZHNXaXRoKFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IEVuZHNXaXRoRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIG1hdGNoZXMoVmFsdWUgdjEsIFZhbHVlIHYyLAorICAgICAgICBTdHJpbmcgc2luZ2xlLCBTdHJpbmcgbXVsdGksIFN0cmluZyBlc2MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGVzRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIsIHNpbmdsZSwgbXVsdGksIGVzYywKKyAgICAgICAgICAgIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIG5vdE1hdGNoZXMoVmFsdWUgdjEsIFZhbHVlIHYyLAorICAgICAgICBTdHJpbmcgc2luZ2xlLCBTdHJpbmcgbXVsdGksIFN0cmluZyBlc2MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGVzRXhwcmVzc2lvbigoVmFsKSB2MSwgKFZhbCkgdjIsIHNpbmdsZSwgbXVsdGksIGVzYywKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBzdGFydHNXaXRoKFZhbHVlIHYxLCBWYWx1ZSB2MikgeworICAgICAgICByZXR1cm4gbmV3IFN0YXJ0c1dpdGhFeHByZXNzaW9uKChWYWwpIHYxLCAoVmFsKSB2Mik7CisgICAgfQorCisgICAgcHVibGljIFN1YnF1ZXJ5IG5ld1N1YnF1ZXJ5KENsYXNzTWV0YURhdGEgY2FuZGlkYXRlLCBib29sZWFuIHN1YnMsCisgICAgICAgIFN0cmluZyBhbGlhcykgeworICAgICAgICByZXR1cm4gbmV3IFN1YlEoYWxpYXMpOworICAgIH0KKworICAgIHB1YmxpYyBQYXRoIG5ld1BhdGgoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2FuZGlkYXRlUGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBQYXRoIG5ld1BhdGgoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgVmFsdWVQYXRoKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIExpdGVyYWwgbmV3TGl0ZXJhbChPYmplY3QgdmFsLCBpbnQgcGFyc2VUeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgTGl0KHZhbCwgcGFyc2VUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZ2V0VGhpcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUaGlzKCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGdldE51bGwoKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBnZXRDdXJyZW50RGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIENVUlJFTlRfREFURTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZ2V0Q3VycmVudFRpbWUoKSB7CisgICAgICAgIHJldHVybiBDVVJSRU5UX0RBVEU7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGdldEN1cnJlbnRUaW1lc3RhbXAoKSB7CisgICAgICAgIHJldHVybiBDVVJSRU5UX0RBVEU7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlciBuZXdQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJhbShuYW1lLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbmV3RXh0ZW5zaW9uKEZpbHRlckxpc3RlbmVyIGxpc3RlbmVyLCBWYWx1ZSB0YXJnZXQsCisgICAgICAgIFZhbHVlIGFyZykgeworICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbihsaXN0ZW5lciwgKFZhbCkgdGFyZ2V0LCAoVmFsKSBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBuZXdBZ2dyZWdhdGUoQWdncmVnYXRlTGlzdGVuZXIgbGlzdGVuZXIsIFZhbHVlIGFyZykgeworICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZShsaXN0ZW5lciwgKFZhbCkgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJndW1lbnRzIG5ld0FyZ3VtZW50TGlzdChWYWx1ZSB2YWwxLCBWYWx1ZSB2YWwyKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJncyh2YWwxLCB2YWwyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbmV3VW5ib3VuZFZhcmlhYmxlKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIFVuYm91bmRWYXJpYWJsZSB2YXIgPSBuZXcgVW5ib3VuZFZhcmlhYmxlKHR5cGUpOworICAgICAgICBpZiAoX3VuYm91bmRzID09IG51bGwpCisgICAgICAgICAgICBfdW5ib3VuZHMgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgICAgICBfdW5ib3VuZHMuYWRkKHZhcik7CisgICAgICAgIHJldHVybiB2YXI7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIG5ld0JvdW5kVmFyaWFibGUoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCb3VuZFZhcmlhYmxlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBjYXN0KFZhbHVlIHZhbCwgQ2xhc3MgY2xzKSB7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBDYW5kaWRhdGVQYXRoKQorICAgICAgICAgICAgKChDYW5kaWRhdGVQYXRoKSB2YWwpLmNhc3RUbyhjbHMpOworICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBCb3VuZFZhcmlhYmxlKQorICAgICAgICAgICAgKChCb3VuZFZhcmlhYmxlKSB2YWwpLmNhc3RUbyhjbHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWwgPSBuZXcgQ2FzdCgoVmFsKSB2YWwsIGNscyk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGFkZChWYWx1ZSB2YWwxLCBWYWx1ZSB2YWwyKSB7CisgICAgICAgIHJldHVybiBuZXcgQWRkKChWYWwpIHZhbDEsIChWYWwpIHZhbDIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBzdWJ0cmFjdChWYWx1ZSB2YWwxLCBWYWx1ZSB2YWwyKSB7CisgICAgICAgIHJldHVybiBuZXcgU3VidHJhY3QoKFZhbCkgdmFsMSwgKFZhbCkgdmFsMik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIG11bHRpcGx5KFZhbHVlIHZhbDEsIFZhbHVlIHZhbDIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXBseSgoVmFsKSB2YWwxLCAoVmFsKSB2YWwyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZGl2aWRlKFZhbHVlIHZhbDEsIFZhbHVlIHZhbDIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXZpZGUoKFZhbCkgdmFsMSwgKFZhbCkgdmFsMik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIG1vZChWYWx1ZSB2YWwxLCBWYWx1ZSB2YWwyKSB7CisgICAgICAgIHJldHVybiBuZXcgTW9kKChWYWwpIHZhbDEsIChWYWwpIHZhbDIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBhYnMoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJzKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGluZGV4T2YoVmFsdWUgdmFsMSwgVmFsdWUgdmFsMikgeworICAgICAgICByZXR1cm4gbmV3IEluZGV4T2YoKFZhbCkgdmFsMSwgKFZhbCkgdmFsMik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGNvbmNhdChWYWx1ZSB2YWwxLCBWYWx1ZSB2YWwyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29uY2F0KChWYWwpIHZhbDEsIChWYWwpIHZhbDIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBzdHJpbmdMZW5ndGgoVmFsdWUgc3RyKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nTGVuZ3RoKChWYWwpIHN0cik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHRyaW0oVmFsdWUgc3RyLCBWYWx1ZSB0cmltQ2hhciwgQm9vbGVhbiB3aGVyZSkgeworICAgICAgICByZXR1cm4gbmV3IFRyaW0oKFZhbCkgc3RyLCAoVmFsKSB0cmltQ2hhciwgd2hlcmUpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBzcXJ0KFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IFNxcnQoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgc3Vic3RyaW5nKFZhbHVlIHZhbDEsIFZhbHVlIHZhbDIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJzdHJpbmcoKFZhbCkgdmFsMSwgKFZhbCkgdmFsMik7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHRvVXBwZXJDYXNlKFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IFRvVXBwZXJDYXNlKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHRvTG93ZXJDYXNlKFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IFRvTG93ZXJDYXNlKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIGF2ZyhWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBdmcoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgY291bnQoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgQ291bnQoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZGlzdGluY3QoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlzdGluY3QoKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgbWF4KFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IE1heCgoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBtaW4oVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgTWluKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHN1bShWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdW0oKFZhbCkgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgYW55KFZhbHVlIHZhbCkgeworICAgICAgICByZXR1cm4gbmV3IEFueSgoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBhbGwoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgQWxsKChWYWwpIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlIHNpemUoVmFsdWUgdmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgU2l6ZSgoVmFsKSB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZSBnZXRPYmplY3RJZChWYWx1ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZXRPYmplY3RJZCgoVmFsKSB2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEtleSB0aGF0IGltcGxlbWVudHMgaGFzaENvZGUgYW5kIGVxdWFscyBtZXRob2RzIGZvciBvYmplY3QgYXJyYXlzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFycmF5S2V5IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9hcnI7CisKKyAgICAgICAgcHVibGljIEFycmF5S2V5KE9iamVjdFtdIGFycikgeworICAgICAgICAgICAgX2FyciA9IGFycjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcnMgPSAxNzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2Fyci5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBycyA9IDM3ICogcnMgKyAoKF9hcnJbaV0gPT0gbnVsbCkgPyAwIDogX2FycltpXS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG90aGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBPYmplY3RbXSBhcnIgPSAoKEFycmF5S2V5KSBvdGhlcikuX2FycjsKKyAgICAgICAgICAgIGlmIChfYXJyLmxlbmd0aCAhPSBhcnIubGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2Fyci5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhfYXJyW2ldLCBhcnJbaV0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmF0b3IgdGhhdCB1c2VzIHRoZSByZXN1bHQgb2YgZXZhbCdpbmcgYSBWYWx1ZSB0byBzb3J0IG9uLiBOdWxsCisgICAgICogdmFsdWVzIGFyZSBwbGFjZWQgbGFzdCBpZiBzb3J0aW5nIGluIGFzY2VuZGluZyBvcmRlciwgZmlyc3QgaWYKKyAgICAgKiBkZXNjZW5kaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9yZGVyVmFsdWVDb21wYXJhdG9yCisgICAgICAgIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdG9yZUNvbnRleHQgX2N0eDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9hc2M7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IF9pZHg7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gX3BhcmFtczsKKworICAgICAgICBwcml2YXRlIE9yZGVyVmFsdWVDb21wYXJhdG9yKFZhbCB2YWwsIGJvb2xlYW4gYXNjLCBpbnQgaWR4LAorICAgICAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgICAgICBfY3R4ID0gY3R4OworICAgICAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgICAgIF9hc2MgPSBhc2M7CisgICAgICAgICAgICBfaWR4ID0gaWR4OworICAgICAgICAgICAgX3BhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgaWYgKF9pZHggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBvMSA9ICgoT2JqZWN0W10pIG8xKVtfaWR4XTsKKyAgICAgICAgICAgICAgICBvMiA9ICgoT2JqZWN0W10pIG8yKVtfaWR4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbzEgPSBfdmFsLmV2YWx1YXRlKG8xLCBvMSwgX2N0eCwgX3BhcmFtcyk7CisgICAgICAgICAgICAgICAgbzIgPSBfdmFsLmV2YWx1YXRlKG8yLCBvMiwgX2N0eCwgX3BhcmFtcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvMSA9PSBudWxsICYmIG8yID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAobzEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9hc2MpID8gMSA6IC0xOworICAgICAgICAgICAgaWYgKG8yID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChfYXNjKSA/IC0xIDogMTsKKworICAgICAgICAgICAgaWYgKG8xIGluc3RhbmNlb2YgQm9vbGVhbiAmJiBvMiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICBpbnQgaTEgPSAoKEJvb2xlYW4pIG8xKS5ib29sZWFuVmFsdWUoKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIGludCBpMiA9ICgoQm9vbGVhbikgbzIpLmJvb2xlYW5WYWx1ZSgpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkxIC0gaTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKF9hc2MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8obzIpOworICAgICAgICAgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIG8yKS5jb21wYXJlVG8obzEpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgICAgICAgICAgIExvY2FsaXplciBsb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAgICAgICAgICAgICAoSW5NZW1vcnlFeHByZXNzaW9uRmFjdG9yeS5jbGFzcyk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24obG9jLmdldCgibm90LWNvbXAiLCBvMSwgbzIpKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSW5kZXhPZi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9JbmRleE9mLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhM2RiYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSW5kZXhPZi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogRmluZCB0aGUgaW5kZXggb2Ygb25lIHN0cmluZyB3aXRoaW4gYW5vdGhlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBJbmRleE9mCisgICAgZXh0ZW5kcyBWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfYXJnczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRhcmdldCBzdHJpbmcgYW5kIHRoZSBhcmd1bWVudHMgdG8gdGhlCisgICAgICogaW5kZXhPZiBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIEluZGV4T2YoVmFsIHZhbCwgVmFsIGFyZ3MpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX2FyZ3MgPSBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IHN0ciA9IF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgT2JqZWN0IGFyZyA9IF9hcmdzLmV2YWwoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IChPYmplY3RbXSkgYXJnOworICAgICAgICAgICAgaWR4ID0gc3RyLnRvU3RyaW5nKCkuaW5kZXhPZihhcmdzWzBdLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgKChOdW1iZXIpIGFyZ3NbMV0pLmludFZhbHVlKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlkeCA9IHN0ci50b1N0cmluZygpLmluZGV4T2YoYXJnLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGlkeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICBfYXJncy5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgyMmFlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSW5zdGFuY2VvZkV4cHJlc3Npb24KKyAgICBleHRlbmRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgX2NsczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgdmFsdWUgYW5kIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZW9mRXhwcmVzc2lvbihWYWwgdmFsLCBDbGFzcyBjbHMpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX2NscyA9IEZpbHRlcnMud3JhcChjbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBjYW5kaWRhdGUgYW5kIG9yaWdpbmFsCisgICAgICogY2FuZGlkYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gX2Nscy5pc0luc3RhbmNlKF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBnaXZlbiBncm91cC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBldmFsKENvbGxlY3Rpb24gY2FuZGlkYXRlcywgU3RvcmVDb250ZXh0IGN0eCwKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIENvbGxlY3Rpb24gYyA9IF92YWwuZXZhbChjYW5kaWRhdGVzLCBudWxsLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIE9iamVjdCBvID0gKGMgPT0gbnVsbCB8fCBjLmlzRW1wdHkoKSkgPyBudWxsIDogYy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIF9jbHMuaXNJbnN0YW5jZShvKTsKKwl9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0lzRW1wdHlFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0lzRW1wdHlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkM2Y5OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvSXNFbXB0eUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBFeHByZXNzaW9uIHRvIHRlc3QgZm9yIGFuIGVtcHR5IENvbGxlY3Rpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgSXNFbXB0eUV4cHJlc3Npb24KKyAgICBleHRlbmRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgY29sbGVjdGlvbi9tYXAgdmFsdWUgdG8gdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXNFbXB0eUV4cHJlc3Npb24oVmFsIHZhbCkgeworICAgICAgICBfdmFsID0gdmFsOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBPYmplY3Qgb2JqID0gX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gKChDb2xsZWN0aW9uKSBvYmopLmlzRW1wdHkoKTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkKKyAgICAgICAgICAgIHJldHVybiAoKE1hcCkgb2JqKS5pc0VtcHR5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBldmFsKENvbGxlY3Rpb24gY2FuZGlkYXRlcywgU3RvcmVDb250ZXh0IGN0eCwKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIENvbGxlY3Rpb24gYyA9IF92YWwuZXZhbChjYW5kaWRhdGVzLCBudWxsLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIGlmIChjID09IG51bGwgfHwgYy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIE9iamVjdCBvYmogPSBjLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gKChDb2xsZWN0aW9uKSBvYmopLmlzRW1wdHkoKTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkKKyAgICAgICAgICAgIHJldHVybiAoKE1hcCkgb2JqKS5pc0VtcHR5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGVzc1RoYW5FcXVhbEV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGVzc1RoYW5FcXVhbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIwOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9MZXNzVGhhbkVxdWFsRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCisvKioKKyAqIEV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0d28gb3RoZXJzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIExlc3NUaGFuRXF1YWxFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBDb21wYXJlRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBMZXNzVGhhbkVxdWFsRXhwcmVzc2lvbihWYWwgdmFsMSwgVmFsIHZhbDIpIHsKKyAgICAgICAgc3VwZXIodmFsMSwgdmFsMik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIENvbXBhcmFibGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSBvMSkuY29tcGFyZVRvKG8yKSA8PSAwOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9MZXNzVGhhbkV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGVzc1RoYW5FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMzk5OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGVzc1RoYW5FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKKy8qKgorICogRXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHR3byBvdGhlcnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTGVzc1RoYW5FeHByZXNzaW9uCisgICAgZXh0ZW5kcyBDb21wYXJlRXhwcmVzc2lvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBMZXNzVGhhbkV4cHJlc3Npb24oVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgaWYgKCEobzEgaW5zdGFuY2VvZiBDb21wYXJhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSkgbzEpLmNvbXBhcmVUbyhvMikgPCAwOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9MaXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhN2E4NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGl0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpdGVyYWwuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTGl0CisgICAgZXh0ZW5kcyBWYWwKKyAgICBpbXBsZW1lbnRzIExpdGVyYWwgeworCisgICAgcHJpdmF0ZSBPYmplY3QgX3ZhbDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBfcHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSBjb25zdGFudCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGl0KE9iamVjdCB2YWwsIGludCBwdHlwZSkgeworICAgICAgICBfdmFsID0gdmFsOworICAgICAgICBfcHR5cGUgPSBwdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gX3ZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXJzZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfcHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBfdmFsOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKF92YWwgPT0gbnVsbCkgPyBPYmplY3QuY2xhc3MgOiBfdmFsLmdldENsYXNzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX3ZhbCA9IEZpbHRlcnMuY29udmVydChfdmFsLCB0eXBlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gX3ZhbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0xpdGVyYWwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGYxZTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL0xpdGVyYWwuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGFueSBsaXRlcmFsIHZhbHVlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbAorICAgIGV4dGVuZHMgVmFsdWUsIENvbnN0YW50IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5LTk9XTiA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OVU1CRVIgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQk9PTEVBTiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TVFJJTkcgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1FfU1RSSU5HID0gNDsgLy8gc2luZ2xlLXF1b3RlZCBzdHJpbmcKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGxpdGVyYWwuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIHRoZSBsaXRlcmFsIHdhcyBwYXJzZWQgYXMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXJzZVR5cGUoKTsKK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9NYXRjaGVzRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9NYXRjaGVzRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzU0OWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL01hdGNoZXNFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5TaW1wbGVSZWdleDsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBFeHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdHdvIG90aGVycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBNYXRjaGVzRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29tcGFyZUV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZSgKKyAgICAgICAgTWF0Y2hlc0V4cHJlc3Npb24uY2xhc3MpOworICAgIAorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9zaW5nbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX211bHRpOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfYWZmaXJtYXRpb247CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IHZhbHVlcyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBNYXRjaGVzRXhwcmVzc2lvbihWYWwgdmFsMSwgVmFsIHZhbDIsCisgICAgICAgIFN0cmluZyBzaW5nbGUsIFN0cmluZyBtdWx0aSwgU3RyaW5nIGVzY2FwZSwgYm9vbGVhbiBhZmZpcm1hdGlvbikgeworICAgICAgICBzdXBlcih2YWwxLCB2YWwyKTsKKyAgICAgICAgX3NpbmdsZSA9IHNpbmdsZTsKKyAgICAgICAgX211bHRpID0gbXVsdGk7CisgICAgICAgIGlmIChlc2NhcGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oX2xvYy5nZXQoCisgICAgICAgICAgICAgICAgImVzY2FwZS1mb3ItaW5tZW0tcXVlcnktbm90LXN1cHBvcnRlZCIpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIF9hZmZpcm1hdGlvbiA9IGFmZmlybWF0aW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgaWYgKG8xID09IG51bGwgfHwgbzIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBjYXNlIGluc2Vuc2l0aXZlPworICAgICAgICBTdHJpbmcgc3RyID0gbzIudG9TdHJpbmcoKTsKKyAgICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCIoP2kpIik7CisgICAgICAgIGJvb2xlYW4gdW5jYXNlID0gZmFsc2U7CisgICAgICAgIGlmIChpZHggIT0gLTEpIHsKKyAgICAgICAgICAgIHVuY2FzZSA9IHRydWU7CisgICAgICAgICAgICBpZiAoaWR4ICsgNCA8IHN0ci5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGlkeCkgKyBzdHIuc3Vic3RyaW5nKGlkeCArIDQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB0cmFuc2xhdGUgZnJvbSB0aGUgc2luZ2xlIGFuZCBtdWx0aSBjaGFyYWN0ZXIgZXNjYXBlCisgICAgICAgIC8vIHNlcXVlbmNlcyBpbnRvIGFuIGVzY2FwZSB0aGF0IGNvbmZvcm1zIHRvIHRoZSByZWdleHAgc3ludGF4CisgICAgICAgIHN0ciA9IFN0cmluZ3MucmVwbGFjZShzdHIsIF9tdWx0aSwgIi4qIik7CisgICAgICAgIHN0ciA9IFN0cmluZ3MucmVwbGFjZShzdHIsIF9zaW5nbGUsICIuIik7CisKKyAgICAgICAgU2ltcGxlUmVnZXggcmUgPSBuZXcgU2ltcGxlUmVnZXgoc3RyLCB1bmNhc2UpOworICAgICAgICBib29sZWFuIG1hdGNoZXMgPSByZS5tYXRjaGVzKG8xLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gX2FmZmlybWF0aW9uID8gbWF0Y2hlcyA6ICFtYXRjaGVzOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9NYXRoVmFsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL01hdGhWYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDQ0NzVmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9NYXRoVmFsLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogVmFsdWUgcHJvZHVjZWQgYnkgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworYWJzdHJhY3QgY2xhc3MgTWF0aFZhbAorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwxOworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWwyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlcyB0byBvcGVyYXRlIG9uLgorICAgICAqLworICAgIHB1YmxpYyBNYXRoVmFsKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBfdmFsMSA9IHZhbDE7CisgICAgICAgIF92YWwyID0gdmFsMjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgQ2xhc3MgYzEgPSBfdmFsMS5nZXRUeXBlKCk7CisgICAgICAgIENsYXNzIGMyID0gX3ZhbDIuZ2V0VHlwZSgpOworICAgICAgICByZXR1cm4gRmlsdGVycy5wcm9tb3RlKGMxLCBjMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBPYmplY3QgbzEgPSBfdmFsMS5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBPYmplY3QgbzIgPSBfdmFsMi5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICByZXR1cm4gb3BlcmF0ZShvMSwgX3ZhbDEuZ2V0VHlwZSgpLCBvMiwgX3ZhbDIuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGlzIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb24gdGhlIHR3byB2YWx1ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBvcGVyYXRlKE9iamVjdCBvMSwgQ2xhc3MgYzEsIE9iamVjdCBvMiwKKyAgICAgICAgQ2xhc3MgYzIpOworCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsMS5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX3ZhbDIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL01heC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9NYXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThkMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9NYXguamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBGaW5kIHRoZSBtYXguCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTWF4CisgICAgZXh0ZW5kcyBBZ2dyZWdhdGVWYWwgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlIHRvIG1heGltaXplLgorICAgICAqLworICAgIHB1YmxpYyBNYXgoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBvcGVyYXRlKENvbGxlY3Rpb24gb3MsIENsYXNzIGMpIHsKKyAgICAgICAgQ29tcGFyYWJsZSBtYXggPSBudWxsOworICAgICAgICBDb21wYXJhYmxlIGN1cjsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY3VyID0gKENvbXBhcmFibGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoY3VyICE9IG51bGwgJiYgKG1heCA9PSBudWxsIHx8IG1heC5jb21wYXJlVG8oY3VyKSA8IDApKQorICAgICAgICAgICAgICAgIG1heCA9IGN1cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF4OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTWluLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL01pbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTRkOTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL01pbi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEZpbmQgdGhlIG1pbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBNaW4KKyAgICBleHRlbmRzIEFnZ3JlZ2F0ZVZhbCB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgdmFsdWUgdG8gbWluaW1pemUuCisgICAgICovCisgICAgcHVibGljIE1pbihWYWwgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGdldFR5cGUoQ2xhc3MgYykgeworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZXJhdGUoQ29sbGVjdGlvbiBvcywgQ2xhc3MgYykgeworICAgICAgICBDb21wYXJhYmxlIG1pbiA9IG51bGw7CisgICAgICAgIENvbXBhcmFibGUgY3VyOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9zLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjdXIgPSAoQ29tcGFyYWJsZSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChjdXIgIT0gbnVsbCAmJiAobWluID09IG51bGwgfHwgbWluLmNvbXBhcmVUbyhjdXIpID4gMCkpCisgICAgICAgICAgICAgICAgbWluID0gY3VyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtaW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Nb2QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTW9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5YjRkNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTW9kLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CisKKy8qKgorICogVmFsdWUgcHJvZHVjZWQgYnkgb25lIHZhbHVlIGJlaW5nIG1vZCdkIGJ5IGFub3RoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTW9kCisgICAgZXh0ZW5kcyBNYXRoVmFsIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZXMgdG8gbW9kLgorICAgICAqLworICAgIHB1YmxpYyBNb2QoVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlcmF0ZShPYmplY3QgbzEsIENsYXNzIGMxLCBPYmplY3QgbzIsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLm1vZChvMSwgYzEsIG8yLCBjMik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL011bHRpcGx5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL011bHRpcGx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkMDQ4OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTXVsdGlwbHkuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKKworLyoqCisgKiBWYWx1ZSBwcm9kdWNlZCBieSB0d28gdmFsdWVzIGJlaW5nIG11bHRpcGxpZWQgdG9nZXRoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTXVsdGlwbHkKKyAgICBleHRlbmRzIE1hdGhWYWwgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIHZhbHVlcyB0byBtdWx0aXBseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlwbHkoVmFsIHZhbDEsIFZhbCB2YWwyKSB7CisgICAgICAgIHN1cGVyKHZhbDEsIHZhbDIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlcmF0ZShPYmplY3QgbzEsIENsYXNzIGMxLCBPYmplY3QgbzIsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBGaWx0ZXJzLm11bHRpcGx5KG8xLCBjMSwgbzIsIGMyKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTm90RXF1YWxFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL05vdEVxdWFsRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjY3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL05vdEVxdWFsRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCisvKioKKyAqIEV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0d28gb3RoZXJzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIE5vdEVxdWFsRXhwcmVzc2lvbgorICAgIGV4dGVuZHMgQ29tcGFyZUV4cHJlc3Npb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZXMgdG8gY29tcGFyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm90RXF1YWxFeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBzdXBlcih2YWwxLCB2YWwyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIHJldHVybiAobzEgPT0gbnVsbCAmJiBvMiAhPSBudWxsKQorICAgICAgICAgICAgfHwgKG8xICE9IG51bGwgJiYgIW8xLmVxdWFscyhvMikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Ob3RFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL05vdEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQ5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Ob3RFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEFuIGV4cHJlc3Npb24gdGhhdCBOT1QncyBhbm90aGVyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIE5vdEV4cHJlc3Npb24KKyAgICBleHRlbmRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4cCBfZXhwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBleHByZXNzaW9uIHRvIG5lZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm90RXhwcmVzc2lvbihFeHAgZXhwKSB7CisgICAgICAgIF9leHAgPSBleHA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiAhX2V4cC5ldmFsdWF0ZShjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBldmFsKENvbGxlY3Rpb24gY2FuZGlkYXRlcywgU3RvcmVDb250ZXh0IGN0eCwKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiAhX2V4cC5ldmFsdWF0ZShjYW5kaWRhdGVzLCBjdHgsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfZXhwLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL051bGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvTnVsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGIzYTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL051bGwuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIG51bGwgY29uc3RhbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTnVsbAorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9PckV4cHJlc3Npb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvT3JFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNTI3NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvT3JFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEFuIGV4cHJlc3Npb24gdGhhdCBPUidzIHR3byBvdGhlcnMgdG9nZXRoZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgT3JFeHByZXNzaW9uCisgICAgZXh0ZW5kcyBFeHAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBFeHAgX2V4cDE7CisgICAgcHJpdmF0ZSBmaW5hbCBFeHAgX2V4cDI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGV4cHJlc3Npb25zIHRvIGNvbWJpbmUuCisgICAgICovCisgICAgcHVibGljIE9yRXhwcmVzc2lvbihFeHAgZXhwMSwgRXhwIGV4cDIpIHsKKyAgICAgICAgX2V4cDEgPSBleHAxOworICAgICAgICBfZXhwMiA9IGV4cDI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBfZXhwMS5ldmFsdWF0ZShjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKQorICAgICAgICAgICAgfHwgX2V4cDIuZXZhbHVhdGUoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gX2V4cDEuZXZhbHVhdGUoY2FuZGlkYXRlcywgY3R4LCBwYXJhbXMpCisgICAgICAgICAgICB8fCBfZXhwMi5ldmFsdWF0ZShjYW5kaWRhdGVzLCBjdHgsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfZXhwMS5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgX2V4cDIuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvUGFyYW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvUGFyYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ5YzlmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9QYXJhbS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBQYXJhbQorICAgIGV4dGVuZHMgVmFsCisgICAgaW1wbGVtZW50cyBQYXJhbWV0ZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWUgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX3R5cGUgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9pbmRleCA9IC0xOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgcGFyYW1ldGVyIG5hbWUgYW5kIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFBhcmFtKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgeworICAgICAgICBfaW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcGFyYW1zW19pbmRleF07CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKHBhcmFtcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1BhcmFtZXRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9QYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYxNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBBIHF1ZXJ5IHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgaW50ZXJmYWNlIFBhcmFtZXRlcgorICAgIGV4dGVuZHMgVmFsdWUsIENvbnN0YW50IHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvUGF0aC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9QYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhNDBlNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvUGF0aC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKKworLyoqCisgKiBBIHBhdGggcmVwcmVzZW50cyBhIHRyYXZlcnNhbCBpbnRvIGZpZWxkcyBvZiBhIGNhbmRpZGF0ZSBvYmplY3QuCisgKiBFcXVpdmFsZW50IHBhdGhzIHNob3VsZCBjb21wYXJlIGVxdWFsLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGF0aAorICAgIGV4dGVuZHMgVmFsdWUgeworCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgaW50byB0aGUgZ2l2ZW4gZmllbGQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LCBhbmQgdXBkYXRlCisgICAgICogdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHRoYXQgZmllbGQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVsbFRyYXZlcnNhbCBpZiB0cnVlLCBhbGxvdyB0cmF2ZXJzYWwgdGhyb3VnaCBhIG51bGwgZmllbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXQoRmllbGRNZXRhRGF0YSBmaWVsZCwgYm9vbGVhbiBudWxsVHJhdmVyc2FsKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgcGF0aCwgb3IgbnVsbCBpZiB0aGUgcGF0aCBkb2VzIG5vdAorICAgICAqIG5vdCBjb250YWluIGEgZmluYWwgZmllbGQuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgbGFzdCgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9RdWVyeUV4cHJlc3Npb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1F1ZXJ5RXhwcmVzc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA5ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9RdWVyeUV4cHJlc3Npb25zLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxpbmtlZE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5T3BlcmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworCisvKioKKyAqIFN0cnVjdCB0byBob2xkIHRoZSBzdGF0ZSBvZiBhIHBhcnNlZCBleHByZXNzaW9uIHF1ZXJ5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjIKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5RXhwcmVzc2lvbnMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTVElOQ1RfQVVUTyA9IDIgPDwgMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNUSU5DVF9UUlVFID0gMiA8PCAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1RJTkNUX0ZBTFNFID0gMiA8PCAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVbXSBFTVBUWV9WQUxVRVMgPSBuZXcgVmFsdWVbMF07CisKKyAgICAvKioKKyAgICAgKiBNYXAgb2Yge0BsaW5rIEZpZWxkTWV0YURhdGF9LHtAbGluayBWYWx1ZX0gZm9yIHVwZGF0ZSBzdGF0ZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgdXBkYXRlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICBwdWJsaWMgaW50IGRpc3RpbmN0ID0gRElTVElOQ1RfQVVUTzsKKyAgICBwdWJsaWMgU3RyaW5nIGFsaWFzID0gbnVsbDsKKyAgICBwdWJsaWMgVmFsdWVbXSBwcm9qZWN0aW9ucyA9IEVNUFRZX1ZBTFVFUzsKKyAgICBwdWJsaWMgU3RyaW5nW10gcHJvamVjdGlvbkNsYXVzZXMgPSBTdG9yZVF1ZXJ5LkVNUFRZX1NUUklOR1M7CisgICAgcHVibGljIFN0cmluZ1tdIHByb2plY3Rpb25BbGlhc2VzID0gU3RvcmVRdWVyeS5FTVBUWV9TVFJJTkdTOworICAgIHB1YmxpYyBDbGFzcyByZXN1bHRDbGFzcyA9IG51bGw7CisgICAgcHVibGljIEV4cHJlc3Npb24gZmlsdGVyID0gbnVsbDsKKyAgICBwdWJsaWMgVmFsdWVbXSBncm91cGluZyA9IEVNUFRZX1ZBTFVFUzsKKyAgICBwdWJsaWMgU3RyaW5nW10gZ3JvdXBpbmdDbGF1c2VzID0gU3RvcmVRdWVyeS5FTVBUWV9TVFJJTkdTOworICAgIHB1YmxpYyBFeHByZXNzaW9uIGhhdmluZyA9IG51bGw7CisgICAgcHVibGljIFZhbHVlW10gb3JkZXJpbmcgPSBFTVBUWV9WQUxVRVM7CisgICAgcHVibGljIGJvb2xlYW5bXSBhc2NlbmRpbmcgPSBTdG9yZVF1ZXJ5LkVNUFRZX0JPT0xFQU5TOworICAgIHB1YmxpYyBTdHJpbmdbXSBvcmRlcmluZ0NsYXVzZXMgPSBTdG9yZVF1ZXJ5LkVNUFRZX1NUUklOR1M7CisgICAgcHVibGljIExpbmtlZE1hcCBwYXJhbWV0ZXJUeXBlcyA9IFN0b3JlUXVlcnkuRU1QVFlfUEFSQU1TOworICAgIHB1YmxpYyBpbnQgb3BlcmF0aW9uID0gUXVlcnlPcGVyYXRpb25zLk9QX1NFTEVDVDsKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YVtdIGFjY2Vzc1BhdGggPSBTdG9yZVF1ZXJ5LkVNUFRZX01FVEFTOworICAgIHB1YmxpYyBTdHJpbmdbXSBmZXRjaFBhdGhzID0gU3RvcmVRdWVyeS5FTVBUWV9TVFJJTkdTOworICAgIHB1YmxpYyBWYWx1ZVtdIHJhbmdlID0gRU1QVFlfVkFMVUVTOworICAgIHByaXZhdGUgQm9vbGVhbiBfYWdncmVnYXRlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhbiBhZ2dyZWdhdGUgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FnZ3JlZ2F0ZSgpIHsKKyAgICAgICAgaWYgKHByb2plY3Rpb25zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgaWYgKF9hZ2dyZWdhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIF9hZ2dyZWdhdGUgPSAoQWdncmVnYXRlRXhwcmVzc2lvblZpc2l0b3IuaXNBZ2dyZWdhdGUocHJvamVjdGlvbnMpKQorICAgICAgICAgICAgICAgID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgcmV0dXJuIF9hZ2dyZWdhdGUuYm9vbGVhblZhbHVlKCk7ICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiB1cGRhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0VXBkYXRlKEZpZWxkTWV0YURhdGEgZm1kLCBWYWx1ZSB2YWwpIHsKKyAgICAgICAgaWYgKHVwZGF0ZXMgPT0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQKQorICAgICAgICAgICAgdXBkYXRlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHVwZGF0ZXMucHV0KGZtZCwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdG9yIHRvIGRldGVybWluZSB3aGV0aGVyIG91ciBwcm9qZWN0aW9ucyBhcmUgYWdncmVnYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBZ2dyZWdhdGVFeHByZXNzaW9uVmlzaXRvcgorICAgICAgICBleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvblZpc2l0b3IgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZSBfc3ViID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9hZ2cgPSBmYWxzZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlcyBpbmNsdWRlIHByb2plY3Rpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWdncmVnYXRlKFZhbHVlW10gdmFscykgeworICAgICAgICAgICAgaWYgKHZhbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgQWdncmVnYXRlRXhwcmVzc2lvblZpc2l0b3IgdiA9IG5ldyBBZ2dyZWdhdGVFeHByZXNzaW9uVmlzaXRvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aCAmJiAhdi5fYWdnOyBpKyspCisgICAgICAgICAgICAgICAgdmFsc1tpXS5hY2NlcHRWaXNpdCh2KTsKKyAgICAgICAgICAgIHJldHVybiB2Ll9hZ2c7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcihWYWx1ZSB2YWwpIHsKKyAgICAgICAgICAgIGlmIChfYWdnKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmIChfc3ViID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlzQWdncmVnYXRlKCkpCisgICAgICAgICAgICAgICAgICAgIF9hZ2cgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdWJxdWVyeSkKKyAgICAgICAgICAgICAgICBfc3ViID0gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXhpdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gX3N1YikKKyAgICAgICAgICAgICAgICBfc3ViID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvUmVzb2x2ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDViOTQyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9SZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CisKKy8qKgorICogQSBSZXNvbHZlciBpcyB1c2VkIHRvIHJlc29sdmUgbGlzdGVuZXJzIGFuZCBjbGFzcyBvciBlbnRpdHkgbmFtZXMKKyAqIHRoYXQgYXBwZWFyIGluIGEgcXVlcnkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlciB7CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBjbGFzcyBuYW1lLiBUaGlzIHdpbGwKKyAgICAgKiB0ZXN0IHRoZSB0eXBlIGFnYWluc3QgdGhlIG5hbWVzcGFjZSBvZiB0aGUgUXVlcnkgYW5kIHRoZSBkZWNsYXJlZAorICAgICAqIGltcG9ydHMsIGFuZCB3aWxsIHByb3Blcmx5IGhhbmRsZSBwcmltaXRpdmVzIGFuZCBqYXZhLmxhbmcgdHlwZXMKKyAgICAgKiBhcyB3ZWxsLiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgZG9lcyBub3QgbWF0Y2ggYSBrbm93biB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGltcG9ydHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWx0ZXIgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiB0YWcsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyTGlzdGVuZXIgZ2V0RmlsdGVyTGlzdGVuZXIoU3RyaW5nIHRhZyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZ1bmN0aW9uIGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gdGFnLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIEFnZ3JlZ2F0ZUxpc3RlbmVyIGdldEFnZ3JlZ2F0ZUxpc3RlbmVyKFN0cmluZyB0YWcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBPcGVuSlBBIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24gKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1NpemUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvU2l6ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjQ4OWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1NpemUuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBhIGNvbGxlY3Rpb24uCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgU2l6ZQorICAgIGV4dGVuZHMgVW5hcnlNYXRoVmFsIHsKKworICAgIHB1YmxpYyBTaXplKFZhbCB2YWwpIHsKKyAgICAgICAgc3VwZXIodmFsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBvcGVyYXRlKE9iamVjdCBvLCBDbGFzcyBjKSB7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoKChDb2xsZWN0aW9uKSBvKS5zaXplKCkpOworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkKKyAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoKChNYXApIG8pLnNpemUoKSk7CisgICAgICAgIHJldHVybiAobyA9PSBudWxsKSA/IE51bWJlcnMudmFsdWVPZigwKSA6IE51bWJlcnMudmFsdWVPZigxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1NxcnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvU3FydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGEwNjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1NxcnQuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworLyoqCisgKiBUYWtlIHRoZSBzcXVhcmUgcm9vdCBvZiBhIG51bWJlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBTcXJ0CisgICAgZXh0ZW5kcyBVbmFyeU1hdGhWYWwgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdGhlIG51bWJlciB3aG9zZSBzcXVhcmUgcm9vdCB0byBjYWxjdWxhdGUuCisgICAgICovCisgICAgcHVibGljIFNxcnQoVmFsIHZhbCkgeworICAgICAgICBzdXBlcih2YWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgcmV0dXJuIGRvdWJsZS5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZXJhdGUoT2JqZWN0IG8sIENsYXNzIGMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoTWF0aC5zcXJ0KCgoTnVtYmVyKSBvKS5kb3VibGVWYWx1ZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdGFydHNXaXRoRXhwcmVzc2lvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdGFydHNXaXRoRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzBmOTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N0YXJ0c1dpdGhFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKKy8qKgorICogRXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHR3byBvdGhlcnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU3RhcnRzV2l0aEV4cHJlc3Npb24KKyAgICBleHRlbmRzIENvbXBhcmVFeHByZXNzaW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdmFsdWVzIHRvIGNvbXBhcmUuCisgICAgICovCisgICAgcHVibGljIFN0YXJ0c1dpdGhFeHByZXNzaW9uKFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBzdXBlcih2YWwxLCB2YWwyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIGlmIChvMSA9PSBudWxsIHx8IG8yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBvMS50b1N0cmluZygpLnN0YXJ0c1dpdGgobzIudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdHJpbmdDb250YWlucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdHJpbmdDb250YWlucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N0cmluZ0NvbnRhaW5zLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBUZXN0cyBpZiB0aGUgdGFyZ2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBhcmd1bWVudC4gVGhlIGFyZ3VtZW50IG11c3QgYmUKKyAqIGEgY29uc3RhbnQuCisgKiAgRXhhbXBsZXM6PGJyIC8+CisgKiA8Y29kZT4gImFkZHJlc3Muc3RyZWV0LmV4dDpzdHJpbmdDb250YWlucyAoXCJtYWluXCIpIgorICogPC9jb2RlPgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSA8Y29kZT5tYXRjaGVzKCk8L2NvZGU+IGluc3RlYWQuCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdDb250YWlucworICAgIGltcGxlbWVudHMgRmlsdGVyTGlzdGVuZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gInN0cmluZ0NvbnRhaW5zIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gVEFHOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4cGVjdHNBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4cGVjdHNUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoT2JqZWN0IHRhcmdldCwgQ2xhc3MgdGFyZ2V0Q2xhc3MsIE9iamVjdFtdIGFyZ3MsCisgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcywgT2JqZWN0IGNhbmRpZGF0ZSwgU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgYXJnc1swXSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIGlmICh0YXJnZXQudG9TdHJpbmcoKS5pbmRleE9mKGFyZ3NbMF0udG9TdHJpbmcoKSkgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShDbGFzcyB0YXJnZXRDbGFzcywgQ2xhc3NbXSBhcmdDbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBib29sZWFuLmNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvU3RyaW5nTGVuZ3RoLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N0cmluZ0xlbmd0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYTU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N0cmluZ0xlbmd0aC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIFN0cmluZy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitjbGFzcyBTdHJpbmdMZW5ndGgKKyAgICBleHRlbmRzIFZhbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworICAgIHByaXZhdGUgQ2xhc3MgX2Nhc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFByb3ZpZGUgdmFsdWUgdG8gdXBwZXItY2FzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nTGVuZ3RoKFZhbCB2YWwpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgaWYgKF9jYXN0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2Nhc3Q7CisgICAgICAgIHJldHVybiBpbnQuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX2Nhc3QgPSB0eXBlOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIE9iamVjdCBldmFsID0gX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICBpZiAoZXZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigwKTsKKworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGV2YWwudG9TdHJpbmcoKS5sZW5ndGgoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICBfdmFsLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N1YlEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvU3ViUS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Yzk5NWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N1YlEuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVW5zdXBwb3J0ZWRFeGNlcHRpb247CisKKy8qKgorICogQW4gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFN1YnF1ZXJ5fS4gQ3VycmVudGx5CisgKiBzdWJxdWVyaWVzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIGluLW1lbW9yeSB1c2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU3ViUQorICAgIGV4dGVuZHMgVmFsCisgICAgaW1wbGVtZW50cyBTdWJxdWVyeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKFN1YnF1ZXJ5LmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9hbGlhczsKKyAgICBwcml2YXRlIENsYXNzIF90eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdWJRKFN0cmluZyBhbGlhcykgeworICAgICAgICBfYWxpYXMgPSBhbGlhczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENhbmRpZGF0ZUFsaWFzKCkgeworICAgICAgICByZXR1cm4gX2FsaWFzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5RXhwcmVzc2lvbnMoUXVlcnlFeHByZXNzaW9ucyBxKSB7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbi1tZW0tc3VicXVlcnkiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdWJxdWVyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdWJxdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjY1NGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N1YnF1ZXJ5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKKy8qKgorICogUXVlcnkgdmFsdWUgcmVwcmVzZW50aW5nIGEgc3VicXVlcnkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjMuMgorICovCitwdWJsaWMgaW50ZXJmYWNlIFN1YnF1ZXJ5CisgICAgZXh0ZW5kcyBWYWx1ZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhbmRpZGF0ZSBhbGlhcyBmb3IgdGhpcyBzdWJxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENhbmRpZGF0ZUFsaWFzKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcnNlZCBzdWJxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUV4cHJlc3Npb25zKFF1ZXJ5RXhwcmVzc2lvbnMgcXVlcnkpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdWJzdHJpbmcuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvU3Vic3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwNmY4MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvU3Vic3RyaW5nLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBUYWtlIHRoZSBzdWJzdHJpbmcgb2YgYSBzdHJpbmcuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU3Vic3RyaW5nCisgICAgZXh0ZW5kcyBWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfYXJnczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHZhbHVlIHRvIHRha2Ugc3Vic3RyaW5nIG9mIGFuZCBhcmd1bWVudHMgdG8KKyAgICAgKiBzdWJzdHJpbmcgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBTdWJzdHJpbmcoVmFsIHZhbCwgVmFsIGFyZ3MpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICAgICAgX2FyZ3MgPSBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IHN0ciA9IF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgT2JqZWN0IGFyZyA9IF9hcmdzLmV2YWwoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IChPYmplY3RbXSkgYXJnOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gKChOdW1iZXIpIGFyZ3NbMF0pLmludFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgZW5kID0gKChOdW1iZXIpIGFyZ3NbMV0pLmludFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gc3RyID09IG51bGwgPyAiIiA6IHN0ci50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIE1hdGgubWluKGVuZCwgc3RyaW5nLmxlbmd0aCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpLnN1YnN0cmluZygoKE51bWJlcikgYXJnKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF9hcmdzLmFjY2VwdFZpc2l0KHZpc2l0b3IpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdWJ0cmFjdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdWJ0cmFjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjdjNGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N1YnRyYWN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlcnM7CisKKy8qKgorICogVmFsdWUgcHJvZHVjZWQgYnkgb25lIHZhbHVlIGJlaW5nIHN1YnRyYWN0ZWQgZnJvbSBhbm90aGVyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFN1YnRyYWN0CisgICAgZXh0ZW5kcyBNYXRoVmFsIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZXMgdG8gc3VidHJhY3QuCisgICAgICovCisgICAgcHVibGljIFN1YnRyYWN0KFZhbCB2YWwxLCBWYWwgdmFsMikgeworICAgICAgICBzdXBlcih2YWwxLCB2YWwyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZXJhdGUoT2JqZWN0IG8xLCBDbGFzcyBjMSwgT2JqZWN0IG8yLCBDbGFzcyBjMikgeworICAgICAgICByZXR1cm4gRmlsdGVycy5zdWJ0cmFjdChvMSwgYzEsIG8yLCBjMik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1N1bS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmNiYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9TdW0uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmlsdGVyczsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBTdW0gdmFsdWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFN1bQorICAgIGV4dGVuZHMgQWdncmVnYXRlVmFsIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHRoZSB2YWx1ZSB0byBzdW0uCisgICAgICovCisgICAgcHVibGljIFN1bShWYWwgdmFsKSB7CisgICAgICAgIHN1cGVyKHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGdldFR5cGUoQ2xhc3MgYykgeworICAgICAgICBDbGFzcyB3cmFwID0gRmlsdGVycy53cmFwKGMpOworICAgICAgICBpZiAod3JhcCA9PSBJbnRlZ2VyLmNsYXNzCisgICAgICAgICAgICB8fCB3cmFwID09IFNob3J0LmNsYXNzCisgICAgICAgICAgICB8fCB3cmFwID09IEJ5dGUuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gbG9uZy5jbGFzczsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBvcGVyYXRlKENvbGxlY3Rpb24gb3MsIENsYXNzIGMpIHsKKyAgICAgICAgaWYgKG9zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENsYXNzIHR5cGUgPSBnZXRUeXBlKGMpOworICAgICAgICBPYmplY3Qgc3VtID0gRmlsdGVycy5jb252ZXJ0KE51bWJlcnMudmFsdWVPZigwKSwgdHlwZSk7CisgICAgICAgIE9iamVjdCBjdXI7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gb3MuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGN1ciA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoY3VyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3VtID0gRmlsdGVycy5hZGQoc3VtLCB0eXBlLCBjdXIsIGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9UaGlzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1RoaXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQ4ZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9UaGlzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSAndGhpcycgcHRyIGluIGEgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFRoaXMKKyAgICBleHRlbmRzIFZhbCB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBvcmlnOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Ub0xvd2VyQ2FzZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Ub0xvd2VyQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmM4MTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1RvTG93ZXJDYXNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBMb3dlci1jYXNlIGEgc3RyaW5nLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFRvTG93ZXJDYXNlCisgICAgZXh0ZW5kcyBWYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3ZhbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIHZhbHVlIHRvIHVwcGVyLWNhc2UuCisgICAgICovCisgICAgcHVibGljIFRvTG93ZXJDYXNlKFZhbCB2YWwpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBfdmFsLmV2YWwoY2FuZGlkYXRlLCBvcmlnLCBjdHgsIHBhcmFtcykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVG9VcHBlckNhc2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVG9VcHBlckNhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMwZWIwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9Ub1VwcGVyQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogVXBwZXItY2FzZSBhIHN0cmluZy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitjbGFzcyBUb1VwcGVyQ2FzZQorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB2YWx1ZSB0byB1cHBlci1jYXNlLgorICAgICAqLworICAgIHB1YmxpYyBUb1VwcGVyQ2FzZShWYWwgdmFsKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpLnRvU3RyaW5nKCkuCisgICAgICAgICAgICB0b1VwcGVyQ2FzZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVHJpbS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9UcmltLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3M2YyOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVHJpbS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogVHJpbXMgbGVhZGluZywgdHJhaWxpbmcsIG9yIGJvdGggY2hhcmFjdGVzIGZyb20gYSBTdHJpbmcuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworY2xhc3MgVHJpbQorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWwgX3RyaW1DaGFyOworICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBfd2hlcmU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB2YWx1ZSB0byB1cHBlci1jYXNlLgorICAgICAqLworICAgIHB1YmxpYyBUcmltKFZhbCB2YWwsIFZhbCB0cmltQ2hhciwgQm9vbGVhbiB3aGVyZSkgeworICAgICAgICBfdmFsID0gdmFsOworICAgICAgICBfdHJpbUNoYXIgPSB0cmltQ2hhcjsKKyAgICAgICAgX3doZXJlID0gd2hlcmU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBPYmplY3QgZXZhbCA9IF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKTsKKyAgICAgICAgaWYgKGV2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZyB0b1RyaW0gPSBfdHJpbUNoYXIuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKS4KKyAgICAgICAgICAgIHRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBzdHIgPSBldmFsLnRvU3RyaW5nKCk7CisKKyAgICAgICAgLy8gbnVsbCBpbmRpY2F0ZXMgYm90aCwgVFJVRSBpbmRpY2F0ZXMgbGVhZGluZworICAgICAgICBpZiAoX3doZXJlID09IG51bGwgfHwgQm9vbGVhbi5UUlVFLmVxdWFscyhfd2hlcmUpKSB7CisgICAgICAgICAgICB3aGlsZSAoc3RyLnN0YXJ0c1dpdGgodG9UcmltKSkKKyAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKHRvVHJpbS5sZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBudWxsIGluZGljYXRlcyBib3RoLCBGQUxTRSBpbmRpY2F0ZXMgdHJhaWxpbmcKKyAgICAgICAgaWYgKF93aGVyZSA9PSBudWxsIHx8IEJvb2xlYW4uRkFMU0UuZXF1YWxzKF93aGVyZSkpIHsKKyAgICAgICAgICAgIHdoaWxlIChzdHIuZW5kc1dpdGgodG9UcmltKSkKKyAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGgoKSAtIHRvVHJpbS5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIF90cmltQ2hhci5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9VbmFyeU1hdGhWYWwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVW5hcnlNYXRoVmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNzFkMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVW5hcnlNYXRoVmFsLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKKworLyoqCisgKiBWYWx1ZSBwcm9kdWNlZCBieSBhIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb24gb25lIHZhbHVlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2Fic3RyYWN0IGNsYXNzIFVuYXJ5TWF0aFZhbAorICAgIGV4dGVuZHMgVmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB0aGUgdmFsdWUgdG8gb3BlcmF0ZSBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5hcnlNYXRoVmFsKFZhbCB2YWwpIHsKKyAgICAgICAgX3ZhbCA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoX3ZhbC5nZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgT2JqZWN0IG8xID0gX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICByZXR1cm4gb3BlcmF0ZShvMSwgX3ZhbC5nZXRUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBudW1lcmljIHR5cGUgYmVpbmcgb3BlcmF0ZWQKKyAgICAgKiBvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0IG9mIHRoaXMgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBvcGVyYXRlKE9iamVjdCBvLCBDbGFzcyBjKTsKKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFZpc2l0KEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci5lbnRlcih0aGlzKTsKKyAgICAgICAgX3ZhbC5hY2NlcHRWaXNpdCh2aXNpdG9yKTsKKyAgICAgICAgdmlzaXRvci5leGl0KHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVW5ib3VuZFZhcmlhYmxlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1VuYm91bmRWYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YjhlNzkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1VuYm91bmRWYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiB1bmJvdW5kIHZhcmlhYmxlLiBXaGVuIHRoZSBxdWVyeSBpcyBldmFsdWF0ZWQsCisgKiBleHByZXNzaW9ucyBjb250YWluaW5nIHVuYm91bmQgdmFyaWFibGVzIHdpbGwgYmUKKyAqIGV4ZWN1dGVkIG9uY2UgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHR5cGUncyBleHRlbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgVW5ib3VuZFZhcmlhYmxlCisgICAgZXh0ZW5kcyBWYWwgeworCisgICAgcHJpdmF0ZSBDbGFzcyBfdHlwZSA9IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3QgX3ZhbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSB2YXJpYWJsZSBuYW1lIGFuZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBVbmJvdW5kVmFyaWFibGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YXJpYWJsZSdzIGN1cnJlbnQgdmFsdWUuIEV4cHJlc3Npb25zIGNhbiBiZSBldmFsdWF0ZWQKKyAgICAgKiBmb3IgZXZlcnkgcG9zc2libGUgb2JqZWN0IGluIHRoZSBleHRlbnQgb2YgZWFjaCB1bmJvdW5kIHZhcmlhYmxlCisgICAgICogd2hlbiBsb29raW5nIGZvciBhIG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBfdmFsID0gdmFsdWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBldmFsKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIF92YWw7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1ZhbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9WYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc2YWQzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9WYWwuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBBbiBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgVmFsdWV9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWwKKyAgICBpbXBsZW1lbnRzIFZhbHVlIHsKKworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyB2YWx1ZSBhcyBhIHByb2plY3Rpb24gb24gdGhlIGdpdmVuIGNhbmRpZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjYW5kaWRhdGUsIE9iamVjdCBvcmlnLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4LCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBldmFsKGNhbmRpZGF0ZSwgY2FuZGlkYXRlLCBjdHgsIHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgdmFsdWUgYXMgYW4gYWdncmVnYXRlIHByb2plY3Rpb24gb24gdGhlIGdpdmVuIGdyb3VwCisgICAgICogb2YgY2FuZGlkYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGV2YWx1YXRlKENvbGxlY3Rpb24gY2FuZGlkYXRlcywgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBjID0gZXZhbChjYW5kaWRhdGVzLCBvcmlnLCBjdHgsIHBhcmFtcyk7CisgICAgICAgICAgICBpZiAoYy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gYy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNhbmRpZGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIHZhbHVlcyByZXN1bHRpbmcgZnJvbSBldmFsdWF0aW5nIGVhY2ggZ2l2ZW4KKyAgICAgKiBjYW5kaWRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcworICAgICAqIHtAbGluayAjZXZhbChPYmplY3QsT2JqZWN0LFN0b3JlQ29udGV4dCxNYXApfSBmb3IKKyAgICAgKiBlYWNoIGluc3RhbmNlIGFuZCBwYWNrcyB0aGUgcmV0dXJuIHZhbHVlIGludG8gYSBuZXcgbGlzdC4gQWdncmVnYXRlcworICAgICAqIHNob3VsZCBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBldmFsKENvbGxlY3Rpb24gY2FuZGlkYXRlcywgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBDb2xsZWN0aW9uIHJldCA9IG5ldyBBcnJheUxpc3QoY2FuZGlkYXRlcy5zaXplKCkpOworICAgICAgICBPYmplY3QgY2FuZGlkYXRlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICByZXQuYWRkKGV2YWx1YXRlKGNhbmRpZGF0ZSwgKG9yaWcgPT0gbnVsbCkgPyBjYW5kaWRhdGUgOiBvcmlnLAorICAgICAgICAgICAgICAgIGN0eCwgcGFyYW1zKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9tZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisJfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWdncmVnYXRlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLmVudGVyKHRoaXMpOworICAgICAgICB2aXNpdG9yLmV4aXQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9WYWxFeHByZXNzaW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1ZhbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJlOTQyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9WYWxFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIEJvb2xlYW4gdmFsdWUgdXNlZCBhcyBhbiBleHByZXNzaW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIFZhbEV4cHJlc3Npb24KKyAgICBleHRlbmRzIEV4cCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbCBfdmFsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsRXhwcmVzc2lvbihWYWwgdmFsKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChPYmplY3QgY2FuZGlkYXRlLCBPYmplY3Qgb3JpZywKKyAgICAgICAgU3RvcmVDb250ZXh0IGN0eCwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIE9iamVjdCBvID0gX3ZhbC5ldmFsKGNhbmRpZGF0ZSwgb3JpZywgY3R4LCBwYXJhbXMpOworICAgICAgICByZXR1cm4gbyAhPSBudWxsICYmICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZhbChDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICBDb2xsZWN0aW9uIGMgPSBfdmFsLmV2YWwoY2FuZGlkYXRlcywgbnVsbCwgY3R4LCBwYXJhbXMpOworICAgICAgICBPYmplY3QgbyA9IChjID09IG51bGwgfHwgYy5pc0VtcHR5KCkpID8gbnVsbCA6IGMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIHJldHVybiBvICE9IG51bGwgJiYgKChCb29sZWFuKSBvKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1ZhbHVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1ZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwODQ0YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvVmFsdWUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBhbnkgbm9uLW9wZXJhdG9yIGluIGEgcXVlcnkgZmlsdGVyLCBpbmNsdWRpbmcKKyAqIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQgb2JqZWN0IGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhbHVlIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSBmb3IgdGhpcyB2YWx1ZSwgb3IgPGNvZGU+T2JqZWN0PC9jb2RlPiBpZgorICAgICAqIHRoZSB0eXBlIGlzIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW1wbGljaXQgdHlwZSBvZiB0aGUgdmFsdWUsIGJhc2VkIG9uIGhvdyBpdCBpcyB1c2VkIGluIHRoZQorICAgICAqIGZpbHRlci4gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgb24gdmFsdWVzIHdobyByZXR1cm4KKyAgICAgKiA8Y29kZT5PYmplY3Q8L2NvZGU+IGZyb20ge0BsaW5rICNnZXRUeXBlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFR5cGUoQ2xhc3MgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIGEgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBhbiBhZ2dyZWdhdGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBZ2dyZWdhdGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbnkgYXNzb2NpYXRlZCBwZXJzaXN0ZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKTsKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZSBhIHBlcnNpc3RlbnQgdHlwZSB3aXRoIHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKTsKKworICAgIC8qKgorICAgICAqIEFjY2VwdCBhIHZpc2l0IGZyb20gYSB0cmVlIHZpc2l0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0VmlzaXQoRXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvcik7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL1ZhbHVlUGF0aC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9WYWx1ZVBhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzBmMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9WYWx1ZVBhdGguamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVDb250ZXh0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBwYXRoIHRoYXQgYmVnaW5zIHdpdGggYSB2YXJpYWJsZSBvciBwYXJhbWV0ZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgVmFsdWVQYXRoCisgICAgZXh0ZW5kcyBDYW5kaWRhdGVQYXRoIHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsIF92YWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbnRleHQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlUGF0aChWYWwgdmFsKSB7CisgICAgICAgIF92YWwgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldENhbmRpZGF0ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWwoT2JqZWN0IGNhbmRpZGF0ZSwgT2JqZWN0IG9yaWcsCisgICAgICAgIFN0b3JlQ29udGV4dCBjdHgsIE9iamVjdFtdIHBhcmFtcykgeworICAgICAgICAvLyBldmFsdWF0ZSB3aXRoIHRoZSB2YWx1ZSdzIHZhbHVlCisgICAgICAgIHJldHVybiBzdXBlci5ldmFsKF92YWwuZXZhbChjYW5kaWRhdGUsIG9yaWcsIGN0eCwgcGFyYW1zKSwgb3JpZywKKyAgICAgICAgICAgIGN0eCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRWaXNpdChFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IuZW50ZXIodGhpcyk7CisgICAgICAgIF92YWwuYWNjZXB0VmlzaXQodmlzaXRvcik7CisgICAgICAgIHZpc2l0b3IuZXhpdCh0aGlzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvV2lsZGNhcmRNYXRjaC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9XaWxkY2FyZE1hdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4YTgwMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvV2lsZGNhcmRNYXRjaC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlNpbXBsZVJlZ2V4OworCisvKioKKyAqIFRlc3RzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgd2lsZGNhcmQgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUKKyAqIGFyZ3VtZW50LiBUaGUgd2lsZGNhcmQgJz8nIGlzIHVzZWQgdG8gcmVwcmVzZW50IGFueSBzaW5nbGUgY2hhcmFjdGVyLAorICogd2hpbGUgJyonIGlzIHVzZWQgdG8gcmVwcmVzZW50IGFueSBzZXJpZXMgb2YgMCBvciBtb3JlIGNoYXJhY3RlcnMuCisgKiAgRXhhbXBsZXM6PGJyIC8+CisgKiA8Y29kZT4gImFkZHJlc3Muc3RyZWV0LmV4dDp3aWxkY2FyZE1hdGNoIChcIj9haW4qcmVldFwiKSIKKyAqIDwvY29kZT4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgPGNvZGU+bWF0Y2hlcygpPC9jb2RlPiBpbnN0ZWFkLgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgV2lsZGNhcmRNYXRjaAorICAgIGltcGxlbWVudHMgRmlsdGVyTGlzdGVuZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIndpbGRjYXJkTWF0Y2giOworCisgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBUQUc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhwZWN0c0FyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhwZWN0c1RhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgdGFyZ2V0LCBDbGFzcyB0YXJnZXRDbGFzcywgT2JqZWN0W10gYXJncywKKyAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzLCBPYmplY3QgY2FuZGlkYXRlLCBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBhcmdzWzBdID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKworICAgICAgICAvLyBjcmVhdGUgYSByZWdleHAgZm9yIHRoZSB3aWxkY2FyZCBleHByZXNzaW9uIGJ5IHN1YmJpbmcgJy4nIGZvciAnPycKKyAgICAgICAgLy8gYW5kICcuKicgZm9yICcqJworICAgICAgICBTdHJpbmcgd2lsZCA9IGFyZ3NbMF0udG9TdHJpbmcoKS5yZXBsYWNlKCc/JywgJy4nKTsKKyAgICAgICAgZm9yIChpbnQgc3QgPSAwLCBpOyAoaSA9IHdpbGQuaW5kZXhPZigiKiIsIHN0KSkgIT0gLTE7IHN0ID0gaSArIDMpCisgICAgICAgICAgICB3aWxkID0gd2lsZC5zdWJzdHJpbmcoMCwgaSkgKyAiLiIgKyB3aWxkLnN1YnN0cmluZyhpKTsKKworICAgICAgICBTaW1wbGVSZWdleCByZSA9IG5ldyBTaW1wbGVSZWdleCh3aWxkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiAocmUubWF0Y2hlcyh0YXJnZXQudG9TdHJpbmcoKSkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShDbGFzcyB0YXJnZXRDbGFzcywgQ2xhc3NbXSBhcmdDbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBib29sZWFuLmNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvZXhwcy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjY2ZmMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBIEV4cHJlc3Npb24gVHJlZTwvc3Ryb25nPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWwvSlBRTEV4cHJlc3Npb25CdWlsZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL0pQUUxFeHByZXNzaW9uQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTg1MzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL0pQUUxFeHByZXNzaW9uQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTY5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmpwcWw7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MaW5rZWRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5FeHByZXNzaW9uU3RvcmVRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5Q29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5T3BlcmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuQWJzdHJhY3RFeHByZXNzaW9uQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkxpdGVyYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuUXVlcnlFeHByZXNzaW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuU3VicXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogQnVpbGRlciBmb3IgSlBRTCBleHByZXNzaW9ucy4gVGhpcyBjbGFzcyB0YWtlcyB0aGUgcXVlcnkgcGFyc2VkCisgKiBpbiB7QGxpbmsgSlBRTH0gYW5kIGNvbnZlcnRzIGl0IHRvIGFuIGV4cHJlc3Npb24gdHJlZSB1c2luZworICogYW4ge0BsaW5rIEV4cHJlc3Npb25GYWN0b3J5fS4gUHVibGljIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBKUFFMRXhwcmVzc2lvbkJ1aWxkZXIKKyAgICBleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkJ1aWxkZXIKKyAgICBpbXBsZW1lbnRzIEpQUUxUcmVlQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQVJfUEFUSCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBUl9FUlJPUiA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChKUFFMRXhwcmVzc2lvbkJ1aWxkZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdGFjayBjb250ZXh0cyA9IG5ldyBTdGFjaygpOworICAgIHByaXZhdGUgTGlua2VkTWFwIHBhcmFtZXRlclR5cGVzOworICAgIHByaXZhdGUgaW50IGFsaWFzQ291bnQgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB0aGUgZXhwcmVzc2lvbiBmYWN0b3J5IHRvIHVzZQorICAgICAqIEBwYXJhbSBxdWVyeSB1c2VkIHRvIHJlc29sdmUgdmFyaWFibGVzLCBwYXJhbWV0ZXJzLAorICAgICAqIGFuZCBjbGFzcyBuYW1lcyB1c2VkIGluIHRoZSBxdWVyeQorICAgICAqIEBwYXJhbSBwYXJzZWRRdWVyeSB0aGUgcGFyc2VkIHF1ZXJ5CisgICAgICovCisgICAgcHVibGljIEpQUUxFeHByZXNzaW9uQnVpbGRlcihFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICBFeHByZXNzaW9uU3RvcmVRdWVyeSBxdWVyeSwgT2JqZWN0IHBhcnNlZFF1ZXJ5KSB7CisgICAgICAgIHN1cGVyKGZhY3RvcnksIHF1ZXJ5LmdldFJlc29sdmVyKCkpOworCisgICAgICAgIGNvbnRleHRzLnB1c2gobmV3IENvbnRleHQocGFyc2VkUXVlcnkgaW5zdGFuY2VvZiBQYXJzZWRKUFFMCisgICAgICAgICAgICA/IChQYXJzZWRKUFFMKSBwYXJzZWRRdWVyeQorICAgICAgICAgICAgOiBwYXJzZWRRdWVyeSBpbnN0YW5jZW9mIFN0cmluZworICAgICAgICAgICAgPyBnZXRQYXJzZWRRdWVyeSgoU3RyaW5nKSBwYXJzZWRRdWVyeSkKKyAgICAgICAgICAgIDogbnVsbCwgbnVsbCkpOworCisgICAgICAgIGlmIChjdHgoKS5wYXJzZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihwYXJzZWRRdWVyeSArICIiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTG9jYWxpemVyIGdldExvY2FsaXplcigpIHsKKyAgICAgICAgcmV0dXJuIF9sb2M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICAvLyB3ZSBkb24ndCByZXNvbHZlIGluIHRoZSBjb250ZXh0IG9mIGFueXRoaW5nIGJ1dCBvdXJzZWx2ZXMKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGFyc2VkSlBRTCBnZXRQYXJzZWRRdWVyeSgpIHsKKyAgICAgICAgcmV0dXJuIGN0eCgpLnBhcnNlZDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGFyc2VkSlBRTCBnZXRQYXJzZWRRdWVyeShTdHJpbmcganBxbCkgeworICAgICAgICByZXR1cm4gbmV3IFBhcnNlZEpQUUwoanBxbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldENhbmRpZGF0ZShDbGFzc01ldGFEYXRhIGNtZCwgU3RyaW5nIHNjaGVtYUFsaWFzKSB7CisgICAgICAgIGFkZEFjY2Vzc1BhdGgoY21kKTsKKworICAgICAgICBpZiAoY21kICE9IG51bGwpCisgICAgICAgICAgICBjdHgoKS5tZXRhID0gY21kOworCisgICAgICAgIGlmIChzY2hlbWFBbGlhcyAhPSBudWxsKQorICAgICAgICAgICAgY3R4KCkuc2NoZW1hQWxpYXMgPSBzY2hlbWFBbGlhczsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBuZXh0QWxpYXMoKSB7CisgICAgICAgIHJldHVybiAianBxbGFsaWFzIiArICgrK2FsaWFzQ291bnQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIHJlc29sdmVDbGFzc01ldGFEYXRhKEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgLy8gaGFuZGxlIGxvb2tpbmcgdXAgYWxpYXMgbmFtZXMKKyAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUgPSBhc3NlcnRTY2hlbWFOYW1lKG5vZGUpOworICAgICAgICBDbGFzc01ldGFEYXRhIGNtZCA9IGdldENsYXNzTWV0YURhdGEoc2NoZW1hTmFtZSwgZmFsc2UpOworICAgICAgICBpZiAoY21kICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY21kOworCisgICAgICAgIC8vIHdlIG1pZ2h0IGJlIHJlZmVyZW5jaW5nIGEgY29sbGVjdGlvbiBmaWVsZCBvZiBhIHN1YnF1ZXJ5J3MgcGFyZW50CisgICAgICAgIGlmIChpc1BhdGgobm9kZSkpIHsKKyAgICAgICAgICAgIFBhdGggcGF0aCA9IGdldFBhdGgobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0RmllbGRUeXBlKHBhdGgubGFzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBydW4gYWdhaW4gdG8gdGhyb3cgdGhlIGNvcnJlY3QgZXhjZXB0aW9uCisgICAgICAgIHJldHVybiBnZXRDbGFzc01ldGFEYXRhKHNjaGVtYU5hbWUsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBnZXRDbGFzc01ldGFEYXRhKFN0cmluZyBhbGlhcywgYm9vbGVhbiBhc3NlcnRWYWxpZCkgeworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MgPSByZXNvbHZlci5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworCisgICAgICAgIC8vIGZpcnN0IGNoZWNrIGZvciB0aGUgYWxpYXMKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBjbWQgPSByZXBvcy5nZXRNZXRhRGF0YShhbGlhcywgbG9hZGVyLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKGNtZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNtZDsKKworICAgICAgICAvLyBub3cgY2hlY2sgZm9yIHRoZSBjbGFzcyBuYW1lOyB0aGlzIGlzIG5vdCB0ZWNobmljYWxseSBwZXJtaXR0ZWQKKyAgICAgICAgLy8gYnkgdGhlIEpQQSBzcGVjLCBidXQgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBleGVjdXRlCisgICAgICAgIC8vIEpQUUwgcXVlcmllcyBmcm9tIG90aGVyIGZhY2FkZXMgKGxpa2UgSkRPKSB0aGF0IGRvIG5vdCBoYXZlCisgICAgICAgIC8vIHRoZSBjb25jZXB0IG9mIGVudGl0eSBuYW1lcyBvciBhbGlhc2VzCisgICAgICAgIENsYXNzIGMgPSByZXNvbHZlci5jbGFzc0Zvck5hbWUoYWxpYXMsIG51bGwpOworICAgICAgICBpZiAoYyAhPSBudWxsKQorICAgICAgICAgICAgY21kID0gcmVwb3MuZ2V0TWV0YURhdGEoYywgbG9hZGVyLCBhc3NlcnRWYWxpZCk7CisgICAgICAgIGVsc2UgaWYgKGFzc2VydFZhbGlkKQorICAgICAgICAgICAgY21kID0gcmVwb3MuZ2V0TWV0YURhdGEoYWxpYXMsIGxvYWRlciwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKGNtZCA9PSBudWxsICYmIGFzc2VydFZhbGlkKQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgIm5vdC1zY2hlbWEtbmFtZSIsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBhbGlhcyB9LCBudWxsKTsKKworICAgICAgICByZXR1cm4gY21kOworICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3MgZ2V0Q2FuZGlkYXRlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldENhbmRpZGF0ZU1ldGFEYXRhKCkuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBnZXRDYW5kaWRhdGVNZXRhRGF0YSgpIHsKKyAgICAgICAgaWYgKGN0eCgpLm1ldGEgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjdHgoKS5tZXRhOworCisgICAgICAgIENsYXNzTWV0YURhdGEgY2xzID0gZ2V0Q2FuZGlkYXRlTWV0YURhdGEocm9vdCgpKTsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgIm5vdC1zY2hlbWEtbmFtZSIsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyByb290KCkgfSwgbnVsbCk7CisKKyAgICAgICAgc2V0Q2FuZGlkYXRlKGNscywgbnVsbCk7CisgICAgICAgIHJldHVybiBjbHM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzTWV0YURhdGEgZ2V0Q2FuZGlkYXRlTWV0YURhdGEoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICAvLyBleGFtaW5nIHRoZSBub2RlIHRvIGZpbmQgdGhlIGNhbmRpZGF0ZSBxdWVyeQorICAgICAgICAvLyAjIyMgdGhpcyBzaG91bGQgYWN0dWFsbHkgYmUgdGhlIHByaW1hcnkgU0VMRUNUIGluc3RhbmNlCisgICAgICAgIC8vIHJlc29sdmVkIGFnYWluc3QgdGhlIGZyb20gdmFyaWFibGUgZGVjbGFyYXRpb25zCisgICAgICAgIEpQUUxOb2RlIGZyb20gPSBub2RlLmZpbmRDaGlsZEJ5SUQoSkpURlJPTUlURU0sIHRydWUpOworICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBPUEVOSlBBLTE1IGFsbG93IHN1YnF1ZXJ5IHdpdGhvdXQgYSBGUk9NSVRFTQorICAgICAgICAgICAgaWYgKG5vZGUuaWQgPT0gSkpUU1VCU0VMRUNUKSB7IAorICAgICAgICAgICAgICAgIGZyb20gPSBub2RlLmZpbmRDaGlsZEJ5SUQoSkpURlJPTSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAibm8tZnJvbS1jbGF1c2UiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJvbS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSlBRTE5vZGUgbiA9IGZyb20uY2hpbGRyZW5baV07CisKKyAgICAgICAgICAgIGlmIChuLmlkID09IEpKVEFCU1RSQUNUU0NIRU1BTkFNRSkgeworICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSByZXR1cm4gdGhlIGZpcnN0IGFic3RyYWN0IHNjaGVtYSBjaGlsZAorICAgICAgICAgICAgICAgIC8vIGFzIHJlc29sdmVkIGludG8gYSBjbGFzcworICAgICAgICAgICAgICAgIENsYXNzTWV0YURhdGEgY21kID0gcmVzb2x2ZUNsYXNzTWV0YURhdGEobik7CisKKyAgICAgICAgICAgICAgICBpZiAoY21kICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbWQ7CisKKyAgICAgICAgICAgICAgICAvLyBub3QgYSBzY2hlbWE6IHRyZWF0IGl0IGFzIGEgY2xhc3MKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xzID0gYXNzZXJ0U2NoZW1hTmFtZShuKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKEVYX1VTRVIsICJub3Qtc2NoZW1hLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyByb290KCkgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NNZXRhRGF0YShjbHMsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT1BFTkpQQS0xNSBzdXBwb3J0IHN1YnF1ZXJ5J3MgZnJvbSBjbGF1c2UgZG8gbm90IHN0YXJ0IHdpdGggCisgICAgICAgICAgICAvLyBpZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbigpCisgICAgICAgICAgICBpZiAobm9kZS5pZCA9PSBKSlRTVUJTRUxFQ1QpIHsKKyAgICAgICAgICAgICAgICBpZiAobi5pZCA9PSBKSlRJTk5FUkpPSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IG4uZ2V0Q2hpbGQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuLmlkID09IEpKVFBBVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgUGF0aCBwYXRoID0gZ2V0UGF0aChuKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBjbWQgPSBnZXRGaWVsZFR5cGUocGF0aC5sYXN0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY21kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAibm8tYWxpYXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBuIH0sIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRRdWVyeSgpIHsKKyAgICAgICAgcmV0dXJuIGN0eCgpLnBhcnNlZCA9PSBudWxsIHx8IHJvb3QoKS5wYXJzZXIgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgIDogcm9vdCgpLnBhcnNlci5qcHFsOworICAgIH0KKworICAgIFF1ZXJ5RXhwcmVzc2lvbnMgZ2V0UXVlcnlFeHByZXNzaW9ucygpIHsKKyAgICAgICAgUXVlcnlFeHByZXNzaW9ucyBleHBzID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbnMoKTsKKworICAgICAgICBldmFsUXVlcnlPcGVyYXRpb24oZXhwcyk7CisKKyAgICAgICAgRXhwcmVzc2lvbiBmaWx0ZXIgPSBudWxsOworICAgICAgICBmaWx0ZXIgPSBhbmQoZXZhbEZyb21DbGF1c2Uocm9vdCgpLmlkID09IEpKVFNFTEVDVCksIGZpbHRlcik7CisgICAgICAgIGZpbHRlciA9IGFuZChldmFsV2hlcmVDbGF1c2UoZXhwcyksIGZpbHRlcik7CisgICAgICAgIGZpbHRlciA9IGFuZChldmFsU2VsZWN0Q2xhdXNlKGV4cHMpLCBmaWx0ZXIpOworCisgICAgICAgIGV4cHMuZmlsdGVyID0gZmlsdGVyID09IG51bGwgPyBmYWN0b3J5LmVtcHR5RXhwcmVzc2lvbigpIDogZmlsdGVyOworCisgICAgICAgIGV2YWxHcm91cGluZ0NsYXVzZShleHBzKTsKKyAgICAgICAgZXZhbEhhdmluZ0NsYXVzZShleHBzKTsKKyAgICAgICAgZXZhbEZldGNoSm9pbnMoZXhwcyk7CisgICAgICAgIGV2YWxTZXRDbGF1c2UoZXhwcyk7CisgICAgICAgIGV2YWxPcmRlcmluZ0NsYXVzZXMoZXhwcyk7CisKKyAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpCisgICAgICAgICAgICBleHBzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7CisKKyAgICAgICAgZXhwcy5hY2Nlc3NQYXRoID0gZ2V0QWNjZXNzUGF0aCgpOworCisgICAgICAgIHJldHVybiBleHBzOworICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBhbmQoRXhwcmVzc2lvbiBlMSwgRXhwcmVzc2lvbiBlMikgeworICAgICAgICByZXR1cm4gZTEgPT0gbnVsbCA/IGUyIDogZTIgPT0gbnVsbCA/IGUxIDogZmFjdG9yeS5hbmQoZTEsIGUyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXNzZW1ibGUoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gYXNzZW1ibGUobm9kZSwgIi4iLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlbWJsZSB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmljIG5vZGUgYnkgYXBwZW5kaW5nIGVhY2gKKyAgICAgKiBjaGlsZCwgc2VwYXJhdGVkIGJ5IHRoZSBkZWxpbWl0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFzc2VtYmxlKEpQUUxOb2RlIG5vZGUsIFN0cmluZyBkZWxpbWl0ZXIsIGludCBsYXN0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEpQUUxOb2RlW10gcGFydHMgPSBub2RlLmNoaWxkcmVuOworICAgICAgICBmb3IgKGludCBpID0gMDsgcGFydHMgIT0gbnVsbCAmJiBpIDwgcGFydHMubGVuZ3RoIC0gbGFzdDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXN1bHQubGVuZ3RoKCkgPiAwID8gZGVsaW1pdGVyIDogIiIpLgorICAgICAgICAgICAgICAgIGFwcGVuZChwYXJ0c1tpXS50ZXh0KTsKKworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGFzc2lnblByb2plY3Rpb25zKEpQUUxOb2RlIHBhcmFtZXRlcnNOb2RlLAorICAgICAgICBRdWVyeUV4cHJlc3Npb25zIGV4cHMpIHsKKyAgICAgICAgaW50IGNvdW50ID0gcGFyYW1ldGVyc05vZGUuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBleHBzLnByb2plY3Rpb25zID0gbmV3IFZhbHVlW2NvdW50XTsKKyAgICAgICAgZXhwcy5wcm9qZWN0aW9uQ2xhdXNlcyA9IG5ldyBTdHJpbmdbY291bnRdOworICAgICAgICBleHBzLnByb2plY3Rpb25BbGlhc2VzID0gbmV3IFN0cmluZ1tjb3VudF07CisKKyAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEpQUUxOb2RlIHBhcmVudCA9IHBhcmFtZXRlcnNOb2RlLmdldENoaWxkKGkpOworICAgICAgICAgICAgSlBRTE5vZGUgbm9kZSA9IG9ubHlDaGlsZChwYXJlbnQpOworICAgICAgICAgICAgVmFsdWUgcHJvaiA9IGdldFZhbHVlKG5vZGUpOworICAgICAgICAgICAgZXhwcy5wcm9qZWN0aW9uc1tpXSA9IHByb2o7CisgICAgICAgICAgICBleHBzLnByb2plY3Rpb25BbGlhc2VzW2ldID0gbmV4dEFsaWFzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXZhbFF1ZXJ5T3BlcmF0aW9uKFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcykgeworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB3ZSB3YW50IHRvIHNlbGVjdCwgZGVsZXRlLCBvciB1cGRhdGUKKyAgICAgICAgaWYgKHJvb3QoKS5pZCA9PSBKSlRTRUxFQ1QgfHwgcm9vdCgpLmlkID09IEpKVFNVQlNFTEVDVCkKKyAgICAgICAgICAgIGV4cHMub3BlcmF0aW9uID0gUXVlcnlPcGVyYXRpb25zLk9QX1NFTEVDVDsKKyAgICAgICAgZWxzZSBpZiAocm9vdCgpLmlkID09IEpKVERFTEVURSkKKyAgICAgICAgICAgIGV4cHMub3BlcmF0aW9uID0gUXVlcnlPcGVyYXRpb25zLk9QX0RFTEVURTsKKyAgICAgICAgZWxzZSBpZiAocm9vdCgpLmlkID09IEpKVFVQREFURSkKKyAgICAgICAgICAgIGV4cHMub3BlcmF0aW9uID0gUXVlcnlPcGVyYXRpb25zLk9QX1VQREFURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVU5TVVBQT1JURUQsICJ1bnJlY29nbml6ZWQtb3BlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IHJvb3QoKSB9LCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXZhbEdyb3VwaW5nQ2xhdXNlKFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcykgeworICAgICAgICAvLyBoYW5kbGUgR1JPVVAgQlkgY2xhdXNlcworICAgICAgICBKUFFMTm9kZSBncm91cEJ5Tm9kZSA9IHJvb3QoKS5maW5kQ2hpbGRCeUlEKEpKVEdST1VQQlksIHRydWUpOworCisgICAgICAgIGlmIChncm91cEJ5Tm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGludCBncm91cEJ5Q291bnQgPSBncm91cEJ5Tm9kZS5nZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgZXhwcy5ncm91cGluZyA9IG5ldyBWYWx1ZVtncm91cEJ5Q291bnRdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBCeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEpQUUxOb2RlIG5vZGUgPSBncm91cEJ5Tm9kZS5nZXRDaGlsZChpKTsKKyAgICAgICAgICAgIGV4cHMuZ3JvdXBpbmdbaV0gPSBnZXRWYWx1ZShub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBldmFsSGF2aW5nQ2xhdXNlKFF1ZXJ5RXhwcmVzc2lvbnMgZXhwcykgeworICAgICAgICAvLyBoYW5kbGUgSEFWSU5HIGNsYXVzZXMKKyAgICAgICAgSlBRTE5vZGUgaGF2aW5nTm9kZSA9IHJvb3QoKS5maW5kQ2hpbGRCeUlEKEpKVEhBVklORywgdHJ1ZSk7CisKKyAgICAgICAgaWYgKGhhdmluZ05vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBleHBzLmhhdmluZyA9IGdldEV4cHJlc3Npb24ob25seUNoaWxkKGhhdmluZ05vZGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXZhbE9yZGVyaW5nQ2xhdXNlcyhRdWVyeUV4cHJlc3Npb25zIGV4cHMpIHsKKyAgICAgICAgLy8gaGFuZGxlIE9SREVSIEJZIGNsYXVzZXMKKyAgICAgICAgSlBRTE5vZGUgb3JkZXJieSA9IHJvb3QoKS5maW5kQ2hpbGRCeUlEKEpKVE9SREVSQlksIGZhbHNlKTsKKyAgICAgICAgaWYgKG9yZGVyYnkgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG9yZGVyY291bnQgPSBvcmRlcmJ5LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGV4cHMub3JkZXJpbmcgPSBuZXcgVmFsdWVbb3JkZXJjb3VudF07CisgICAgICAgICAgICBleHBzLmFzY2VuZGluZyA9IG5ldyBib29sZWFuW29yZGVyY291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBKUFFMTm9kZSBub2RlID0gb3JkZXJieS5nZXRDaGlsZChpKTsKKyAgICAgICAgICAgICAgICBleHBzLm9yZGVyaW5nW2ldID0gZ2V0VmFsdWUoZmlyc3RDaGlsZChub2RlKSk7CisgICAgICAgICAgICAgICAgLy8gb21taXNzaW9uIG9mIEFTQy9ERVNDIHRva2VuIGltcGxpZXMgYXNjZW5kaW5nCisgICAgICAgICAgICAgICAgZXhwcy5hc2NlbmRpbmdbaV0gPSBub2RlLmdldENoaWxkQ291bnQoKSA8PSAxIHx8CisgICAgICAgICAgICAgICAgICAgIGxhc3RDaGlsZChub2RlKS5pZCA9PSBKSlRBU0NFTkRJTkcgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXZhbFNlbGVjdENsYXVzZShRdWVyeUV4cHJlc3Npb25zIGV4cHMpIHsKKyAgICAgICAgaWYgKGV4cHMub3BlcmF0aW9uICE9IFF1ZXJ5T3BlcmF0aW9ucy5PUF9TRUxFQ1QpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBKUFFMTm9kZSBzZWxlY3ROb2RlID0gcm9vdCgpOworCisgICAgICAgIEpQUUxOb2RlIGNvbnN0cnVjdG9yID0gc2VsZWN0Tm9kZS5maW5kQ2hpbGRCeUlEKEpKVENPTlNUUlVDVE9SLCB0cnVlKTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGJ1aWxkIHVwIHRoZSBmdWxseS1xdWFsaWZpZWQgcmVzdWx0IGNsYXNzIG5hbWUgYnkKKyAgICAgICAgICAgIC8vIGFwcGVuZGluZyB0b2dldGhlciB0aGUgY29tcG9uZW50cyBvZiB0aGUgY2hpbGRyZW4KKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRDbGFzc05hbWUgPSBhc3NlbWJsZShsZWZ0KGNvbnN0cnVjdG9yKSk7CisgICAgICAgICAgICBleHBzLnJlc3VsdENsYXNzID0gcmVzb2x2ZXIuY2xhc3NGb3JOYW1lKHJlc3VsdENsYXNzTmFtZSwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIG5vdyBhc3NpZ24gdGhlIGFyZ3VtZW50cyB0byB0aGUgc2VsZWN0IGNsYXVzZSBhcyB0aGUgcHJvamVjdGlvbnMKKyAgICAgICAgICAgIGV4cHMuZGlzdGluY3QgPSBleHBzLkRJU1RJTkNUX0ZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGFzc2lnblByb2plY3Rpb25zKHJpZ2h0KGNvbnN0cnVjdG9yKSwgZXhwcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBKUFFMTm9kZSBzZWxlY3RDbGF1c2UgPSBzZWxlY3ROb2RlLgorICAgICAgICAgICAgICAgIGZpbmRDaGlsZEJ5SUQoSkpUU0VMRUNUQ0xBVVNFLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoc2VsZWN0Q2xhdXNlICE9IG51bGwgJiYgc2VsZWN0Q2xhdXNlLmhhc0NoaWxkSUQoSkpURElTVElOQ1QpKQorICAgICAgICAgICAgICAgIGV4cHMuZGlzdGluY3QgPSBleHBzLkRJU1RJTkNUX1RSVUUgfCBleHBzLkRJU1RJTkNUX0FVVE87CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXhwcy5kaXN0aW5jdCA9IGV4cHMuRElTVElOQ1RfRkFMU0U7CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBTRUxFQ1QgY2xhdXNlcworICAgICAgICAgICAgSlBRTE5vZGUgZXhwTm9kZSA9IHNlbGVjdE5vZGUuCisgICAgICAgICAgICAgICAgZmluZENoaWxkQnlJRChKSlRTRUxFQ1RFWFBSRVNTSU9OUywgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoZXhwTm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpbnQgc2VsZWN0Q291bnQgPSBleHBOb2RlLmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIEpQUUxOb2RlIHNlbGVjdENoaWxkID0gZmlyc3RDaGlsZChleHBOb2RlKTsKKworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHNlbGVjdGluZyBqdXN0IG9uZSB0aGluZyBhbmQgdGhhdCB0aGluZyBpcyB0aGUKKyAgICAgICAgICAgIC8vIHNjaGVtYSdzIGFsaWFzLCB0aGVuIGRvIG5vdCB0cmVhdCBpdCBhcyBhIHByb2plY3Rpb24KKyAgICAgICAgICAgIGlmIChzZWxlY3RDb3VudCA9PSAxICYmIHNlbGVjdENoaWxkICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBzZWxlY3RDaGlsZC5nZXRDaGlsZENvdW50KCkgPT0gMSAmJgorICAgICAgICAgICAgICAgIG9ubHlDaGlsZChzZWxlY3RDaGlsZCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIGFzc2VydFNjaGVtYUFsaWFzKCkuCisgICAgICAgICAgICAgICAgICAgIGVxdWFsc0lnbm9yZUNhc2Uob25seUNoaWxkKHNlbGVjdENoaWxkKS50ZXh0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBKUFFMIGRvZXMgbm90IGZpbHRlciByZWxhdGlvbmFsIGpvaW5zIGZvciBwcm9qZWN0aW9ucworICAgICAgICAgICAgICAgIGV4cHMuZGlzdGluY3QgJj0gfmV4cHMuRElTVElOQ1RfQVVUTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNzaWduUHJvamVjdGlvbnMoZXhwTm9kZSwgZXhwcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBhc3NlcnRTY2hlbWFBbGlhcygpIHsKKyAgICAgICAgU3RyaW5nIGFsaWFzID0gY3R4KCkuc2NoZW1hQWxpYXM7CisKKyAgICAgICAgaWYgKGFsaWFzID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAiYWxpYXMtcmVxdWlyZWQiLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgY3R4KCkubWV0YSB9LCBudWxsKTsKKworICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gZXZhbEZldGNoSm9pbnMoUXVlcnlFeHByZXNzaW9ucyBleHBzKSB7CisgICAgICAgIEV4cHJlc3Npb24gZmlsdGVyID0gbnVsbDsKKworICAgICAgICAvLyBoYW5kbGUgSk9JTiBGRVRDSAorICAgICAgICBTZXQgam9pbnMgPSBudWxsOworCisgICAgICAgIEpQUUxOb2RlW10gb3V0ZXJzID0gcm9vdCgpLmZpbmRDaGlsZHJlbkJ5SUQoSkpUT1VURVJGRVRDSEpPSU4pOworICAgICAgICBmb3IgKGludCBpID0gMDsgb3V0ZXJzICE9IG51bGwgJiYgaSA8IG91dGVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIChqb2lucyA9PSBudWxsID8gam9pbnMgPSBuZXcgVHJlZVNldCgpIDogam9pbnMpLgorICAgICAgICAgICAgICAgIGFkZChnZXRQYXRoKG9ubHlDaGlsZChvdXRlcnNbaV0pKS5sYXN0KCkuZ2V0RnVsbE5hbWUoZmFsc2UpKTsKKworICAgICAgICBKUFFMTm9kZVtdIGlubmVycyA9IHJvb3QoKS5maW5kQ2hpbGRyZW5CeUlEKEpKVElOTkVSRkVUQ0hKT0lOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGlubmVycyAhPSBudWxsICYmIGkgPCBpbm5lcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAoam9pbnMgPT0gbnVsbCA/IGpvaW5zID0gbmV3IFRyZWVTZXQoKSA6IGpvaW5zKS4KKyAgICAgICAgICAgICAgICBhZGQoZ2V0UGF0aChvbmx5Q2hpbGQoaW5uZXJzW2ldKSkubGFzdCgpLmdldEZ1bGxOYW1lKGZhbHNlKSk7CisKKyAgICAgICAgaWYgKGpvaW5zICE9IG51bGwpCisgICAgICAgICAgICBleHBzLmZldGNoUGF0aHMgPSAoU3RyaW5nW10pIGpvaW5zLgorICAgICAgICAgICAgICAgIHRvQXJyYXkobmV3IFN0cmluZ1tqb2lucy5zaXplKCldKTsKKworICAgICAgICByZXR1cm4gZmlsdGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV2YWxTZXRDbGF1c2UoUXVlcnlFeHByZXNzaW9ucyBleHBzKSB7CisgICAgICAgIC8vIGhhbmRsZSBTRVQgZmllbGQgPSB2YWx1ZQorICAgICAgICBKUFFMTm9kZVtdIG5vZGVzID0gcm9vdCgpLmZpbmRDaGlsZHJlbkJ5SUQoSkpUVVBEQVRFSVRFTSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBub2RlcyAhPSBudWxsICYmIGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmaWVsZCA9IGdldFBhdGgoZmlyc3RDaGlsZChub2Rlc1tpXSkpLmxhc3QoKTsKKyAgICAgICAgICAgIFZhbHVlIHZhbCA9IGdldFZhbHVlKG9ubHlDaGlsZChsYXN0Q2hpbGQobm9kZXNbaV0pKSk7CisgICAgICAgICAgICBleHBzLnB1dFVwZGF0ZShmaWVsZCwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBldmFsV2hlcmVDbGF1c2UoUXVlcnlFeHByZXNzaW9ucyBleHBzKSB7CisgICAgICAgIC8vIGV2YWx1YXRlIHRoZSBXSEVSRSBjbGF1c2UKKyAgICAgICAgSlBRTE5vZGUgd2hlcmVOb2RlID0gcm9vdCgpLmZpbmRDaGlsZEJ5SUQoSkpUV0hFUkUsIGZhbHNlKTsKKyAgICAgICAgaWYgKHdoZXJlTm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiAoRXhwcmVzc2lvbikgZXZhbCh3aGVyZU5vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBldmFsRnJvbUNsYXVzZShib29sZWFuIG5lZWRzQWxpYXMpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBudWxsOworCisgICAgICAgIC8vIGJ1aWxkIHVwIHRoZSBhbGlhcyBtYXAgaW4gdGhlIEZST00gY2xhdXNlCisgICAgICAgIEpQUUxOb2RlIGZyb20gPSByb290KCkuZmluZENoaWxkQnlJRChKSlRGUk9NLCBmYWxzZSk7CisgICAgICAgIGlmIChmcm9tID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAibm8tZnJvbS1jbGF1c2UiLCBudWxsLCBudWxsKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyb20uY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEpQUUxOb2RlIG5vZGUgPSBmcm9tLmNoaWxkcmVuW2ldOworCisgICAgICAgICAgICBpZiAobm9kZS5pZCA9PSBKSlRGUk9NSVRFTSkKKyAgICAgICAgICAgICAgICBleHAgPSBldmFsRnJvbUl0ZW0oZXhwLCBub2RlLCBuZWVkc0FsaWFzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUuaWQgPT0gSkpUT1VURVJKT0lOKQorICAgICAgICAgICAgICAgIGV4cCA9IGFkZEpvaW4obm9kZSwgZmFsc2UsIGV4cCk7CisgICAgICAgICAgICBlbHNlIGlmIChub2RlLmlkID09IEpKVElOTkVSSk9JTikKKyAgICAgICAgICAgICAgICBleHAgPSBhZGRKb2luKG5vZGUsIHRydWUsIGV4cCk7CisgICAgICAgICAgICBlbHNlIGlmIChub2RlLmlkID09IEpKVElOTkVSRkVUQ0hKT0lOKQorICAgICAgICAgICAgICAgIGV4cCA9IGFkZEpvaW4obm9kZSwgdHJ1ZSwgZXhwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUuaWQgPT0gSkpUT1VURVJGRVRDSEpPSU4pCisgICAgICAgICAgICAgICAgOyAvLyB3ZSBoYW5kbGUgb3V0ZXIgZmV0Y2ggam9pbnMgaW4gdGhlIGV2YWxGZXRjaEpvaW5zKCkgbWV0aG9kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgIm5vdC1zY2hlbWEtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgbm9kZSB9LCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBleHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGpvaW4gY29uZGl0aW9uIHRvIHRoZSBnaXZlbiBleHByZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gaW5uZXIgd2hldGhlciBvciBub3QgdGhlIGpvaW4gc2hvdWxkIGJlIGFuIGlubmVyIGpvaW4KKyAgICAgKiBAcGFyYW0gZXhwIGFuIGV4aXN0aW5nIGV4cHJlc3Npb24gdG8gQU5ELCBvciBudWxsIGlmIG5vbmUKKyAgICAgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uIHdpdGggdGhlIGpvaW4gY29uZGl0aW9uIGFkZGVkCisgICAgICovCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGFkZEpvaW4oSlBRTE5vZGUgbm9kZSwgYm9vbGVhbiBpbm5lciwgRXhwcmVzc2lvbiBleHApIHsKKyAgICAgICAgLy8gdGhlIHR5cGUgd2lsbCBiZSB0aGUgZGVjbGFyZWQgdHlwZSBmb3IgdGhlIGZpZWxkCisgICAgICAgIFBhdGggcGF0aCA9IGdldFBhdGgoZmlyc3RDaGlsZChub2RlKSwgZmFsc2UsIGlubmVyKTsKKworICAgICAgICBKUFFMTm9kZSBhbGlhcyA9IG5vZGUuZ2V0Q2hpbGRDb3VudCgpID49IDIgPyByaWdodChub2RlKSA6IG51bGw7CisgICAgICAgIC8vIE9QRU5KUEEtMTUgc3VwcG9ydCBzdWJxdWVyeSdzIGZyb20gY2xhdXNlIGRvIG5vdCBzdGFydCB3aXRoIAorICAgICAgICAvLyBpZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbigpCisgICAgICAgIGlmIChpbm5lciAmJiBjdHgoKS5zdWJxdWVyeSAhPSBudWxsICYmIGN0eCgpLnNjaGVtYUFsaWFzID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldENhbmRpZGF0ZShnZXRGaWVsZFR5cGUocGF0aC5sYXN0KCkpLCBhbGlhcy50ZXh0KTsKKworICAgICAgICAgICAgUGF0aCBzdWJwYXRoID0gZmFjdG9yeS5uZXdQYXRoKGN0eCgpLnN1YnF1ZXJ5KTsKKyAgICAgICAgICAgIHN1YnBhdGguc2V0TWV0YURhdGEoY3R4KCkuc3VicXVlcnkuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgICAgICBleHAgPSAgYW5kKGV4cCwgZmFjdG9yeS5lcXVhbChwYXRoLCBzdWJwYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRkSm9pbihwYXRoLCBhbGlhcywgaW5uZXIsIGV4cCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGFkZEpvaW4oUGF0aCBwYXRoLCBKUFFMTm9kZSBhbGlhc05vZGUsIGJvb2xlYW4gaW5uZXIsCisgICAgICAgIEV4cHJlc3Npb24gZXhwKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gcGF0aC5sYXN0KCk7CisKKyAgICAgICAgaWYgKGZtZCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgInBhdGgtbm8tbWV0YSIsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBwYXRoLCBudWxsIH0sIG51bGwpOworCisgICAgICAgIFN0cmluZyBhbGlhcyA9IGFsaWFzTm9kZSAhPSBudWxsID8gYWxpYXNOb2RlLnRleHQgOiBuZXh0QWxpYXMoKTsKKworICAgICAgICBWYWx1ZSB2YXIgPSBnZXRWYXJpYWJsZShhbGlhcywgdHJ1ZSk7CisgICAgICAgIHZhci5zZXRNZXRhRGF0YShnZXRGaWVsZFR5cGUoZm1kKSk7CisKKyAgICAgICAgRXhwcmVzc2lvbiBqb2luID0gbnVsbDsKKworICAgICAgICAvLyBpZiB0aGUgdmFyaWFibGUgaXMgYWxyZWFkeSBib3VuZCwgZ2V0IHRoZSB2YXIncyB2YWx1ZSBhbmQKKyAgICAgICAgLy8gZG8gYSByZWd1bGFyIGNvbnRhaW5zIHdpdGggdGhhdAorICAgICAgICBib29sZWFuIGJvdW5kID0gaXNCb3VuZCh2YXIpOworICAgICAgICBpZiAoYm91bmQpIHsKKyAgICAgICAgICAgIHZhciA9IGdldFZhbHVlKGFsaWFzTm9kZSwgVkFSX1BBVEgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmluZCh2YXIpOworICAgICAgICAgICAgam9pbiA9IGFuZChqb2luLCBmYWN0b3J5LmJpbmRWYXJpYWJsZSh2YXIsIHBhdGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm1kLmlzVHlwZVBDKCkpIC8vIG11bHRpLXZhbHVlZCByZWxhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYm91bmQpCisgICAgICAgICAgICAgICAgam9pbiA9IGFuZChqb2luLCBmYWN0b3J5LmNvbnRhaW5zKHBhdGgsIHZhcikpOworCisgICAgICAgICAgICBzZXRJbXBsaWNpdENvbnRhaW5zVHlwZXMocGF0aCwgdmFyLCBDT05UQUlOU19UWVBFX0VMRU1FTlQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFuZChleHAsIGpvaW4pOworICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBldmFsRnJvbUl0ZW0oRXhwcmVzc2lvbiBleHAsIEpQUUxOb2RlIG5vZGUsCisgICAgICAgIGJvb2xlYW4gbmVlZHNBbGlhcykgeworICAgICAgICBDbGFzc01ldGFEYXRhIGNtZCA9IHJlc29sdmVDbGFzc01ldGFEYXRhKGZpcnN0Q2hpbGQobm9kZSkpOworCisgICAgICAgIFN0cmluZyBhbGlhcyA9IG51bGw7CisKKyAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpIDwgMikgeworICAgICAgICAgICAgaWYgKG5lZWRzQWxpYXMpCisgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgImFsaWFzLXJlcXVpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBjbWQgfSwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGlhcyA9IHJpZ2h0KG5vZGUpLnRleHQ7CisgICAgICAgICAgICBKUFFMTm9kZSBsZWZ0ID0gbGVmdChub2RlKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSB3ZSBhcmUgcmVmZXJyaW5nIHRvIGEgcGF0aCBpbiB0aGUgZnJvbQorICAgICAgICAgICAgLy8gY2xhdXNlLCBzaW5jZSB3ZSBtaWdodCBiZSBpbiBhIHN1YnF1ZXJ5IGFnYWluc3QgYSBjb2xsZWN0aW9uCisgICAgICAgICAgICBpZiAoaXNQYXRoKGxlZnQpKSB7CisgICAgICAgICAgICAgICAgUGF0aCBwYXRoID0gZ2V0UGF0aChsZWZ0KTsKKyAgICAgICAgICAgICAgICBzZXRDYW5kaWRhdGUoZ2V0RmllbGRUeXBlKHBhdGgubGFzdCgpKSwgYWxpYXMpOworCisgICAgICAgICAgICAgICAgUGF0aCBzdWJwYXRoID0gZmFjdG9yeS5uZXdQYXRoKGN0eCgpLnN1YnF1ZXJ5KTsKKyAgICAgICAgICAgICAgICBzdWJwYXRoLnNldE1ldGFEYXRhKGN0eCgpLnN1YnF1ZXJ5LmdldE1ldGFEYXRhKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBhbmQoZXhwLCBmYWN0b3J5LmVxdWFsKHBhdGgsIHN1YnBhdGgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbiBhbGlhczogYmluZCBpdCBhcyBhIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgVmFsdWUgdmFyID0gZ2V0VmFyaWFibGUoYWxpYXMsIHRydWUpOworICAgICAgICAgICAgICAgIHZhci5zZXRNZXRhRGF0YShjbWQpOworICAgICAgICAgICAgICAgIGJpbmQodmFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyB3ZSBhc3NpZ24gdGhlIGZpcnN0IEZST01JVEVNIGluc3RhbmNlIHdlIHNlZSBhcworICAgICAgICAvLyB0aGUgZ2xvYmFsIGNhbmRpZGF0ZSwgd2hpY2ggaXMgaW5jb3JyZWN0OiB3ZSBzaG91bGQKKyAgICAgICAgLy8gaW5zdGVhZCBiZSBtYXBwaW5nIHRoaXMgdG8gdGhlIFNFTEVDVElURU0gdG8gc2VlCisgICAgICAgIC8vIHdoaWNoIGlzIHRoZSBkZXNpcmVkIGNhbmRpZGF0ZQorICAgICAgICBpZiAoY3R4KCkuc2NoZW1hQWxpYXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHNldENhbmRpZGF0ZShjbWQsIGFsaWFzKTsKKworICAgICAgICByZXR1cm4gZXhwOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVjbGFyZWRWYXJpYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvLyBKUFFMIGRvZXNuJ3Qgc3VwcG9ydCBkZWNsYXJpbmcgdmFyaWFibGVzCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmljIG5vZGUgaXMgYSBwYXRoICh2cy4gYSBzY2hlbWEgbmFtZSkKKyAgICAgKi8KKyAgICBib29sZWFuIGlzUGF0aChKUFFMTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBmaXJzdENoaWxkKG5vZGUpLnRleHQ7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjbGFzcyBuYW1lIGlzIHRoZSBhbGlhcworICAgICAgICAvLyBmb3IgdGhlIGNhbmRpZGF0ZSAod2UgZG9uJ3QgdXNlIHZhcmlhYmxlcyBmb3IgdGhpcykKKyAgICAgICAgaWYgKGdldE1ldGFEYXRhRm9yQWxpYXMobmFtZSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICghaXNTZWVuVmFyaWFibGUobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZmluYWwgVmFsdWUgdmFyID0gZ2V0VmFyaWFibGUobmFtZSwgZmFsc2UpOworCisgICAgICAgIGlmICh2YXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBpc0JvdW5kKHZhcik7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWV0YURhdGEgZ2V0RmllbGRUeXBlKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENsYXNzTWV0YURhdGEgY21kID0gbnVsbDsKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQ7CisKKyAgICAgICAgaWYgKCh2bWQgPSBmbWQuZ2V0RWxlbWVudCgpKSAhPSBudWxsKQorICAgICAgICAgICAgY21kID0gdm1kLmdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgICAgIGVsc2UgaWYgKCh2bWQgPSBmbWQuZ2V0S2V5KCkpICE9IG51bGwpCisgICAgICAgICAgICBjbWQgPSB2bWQuZ2V0RGVjbGFyZWRUeXBlTWV0YURhdGEoKTsKKyAgICAgICAgZWxzZSBpZiAoKHZtZCA9IGZtZC5nZXRWYWx1ZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgY21kID0gdm1kLmdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisKKyAgICAgICAgaWYgKGNtZCA9PSBudWxsIHx8IGNtZC5nZXREZXNjcmliZWRUeXBlKCkgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgY21kID0gZm1kLmdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisKKyAgICAgICAgcmV0dXJuIGNtZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMgaW4gSlBRTCBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgc28gbG93ZXItY2FzZQorICAgICAqIGFsbCB2YXJpYWJsZXMgd2UgYXJlIGdvaW5nIHRvIGJpbmQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlIGdldFZhcmlhYmxlKFN0cmluZyBpZCwgYm9vbGVhbiBiaW5kKSB7CisgICAgICAgIGlmIChpZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZhcmlhYmxlKGlkLnRvTG93ZXJDYXNlKCksIGJpbmQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2VlbmRWYXJpYWJsZShTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIGlkICE9IG51bGwgJiYgc3VwZXIuaXNTZWVuVmFyaWFibGUoaWQudG9Mb3dlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZSB1c2luZyB0aGUgY2hpbGRyZW4gb2YgdGhlIEpQUUxOb2RlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFzc2VydFNjaGVtYU5hbWUoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZS5pZCAhPSBKSlRBQlNUUkFDVFNDSEVNQU5BTUUpCisgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAibm90LWlkZW50aWZlciIsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBub2RlIH0sIG51bGwpOworCisgICAgICAgIHJldHVybiBhc3NlbWJsZShub2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmUgaGVscGVyIG1ldGhvZCB0byBldmFsdWF0ZSB0aGUgZ2l2ZW4gbm9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBldmFsKEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgVmFsdWUgdmFsMSA9IG51bGw7CisgICAgICAgIFZhbHVlIHZhbDIgPSBudWxsOworICAgICAgICBWYWx1ZSB2YWwzID0gbnVsbDsKKworICAgICAgICBib29sZWFuIG5vdCA9IG5vZGUubm90OworCisgICAgICAgIHN3aXRjaCAobm9kZS5pZCkgeworICAgICAgICAgICAgY2FzZSBKSlRXSEVSRTogLy8gdG9wLWxldmVsIFdIRVJFIGNsYXVzZQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uKG9ubHlDaGlsZChub2RlKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUQk9PTEVBTkxJVEVSQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubmV3TGl0ZXJhbCgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZQorICAgICAgICAgICAgICAgICAgICAobm9kZS50ZXh0KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIExpdGVyYWwuVFlQRV9CT09MRUFOKTsKKworICAgICAgICAgICAgY2FzZSBKSlRJTlRFR0VSTElURVJBTDoKKyAgICAgICAgICAgICAgICAvLyB1c2UgQmlnRGVjaW1hbCBiZWNhdXNlIGl0IGNhbiBoYW5kbGUgcGFyc2luZyBleHBvbmVudHMKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIGludGxpdCA9IG5ldyBCaWdEZWNpbWFsCisgICAgICAgICAgICAgICAgICAgIChub2RlLnRleHQuZW5kc1dpdGgoImwiKSB8fCBub2RlLnRleHQuZW5kc1dpdGgoIkwiKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBub2RlLnRleHQuc3Vic3RyaW5nKDAsIG5vZGUudGV4dC5sZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGUudGV4dCkuCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGx5KG5ldyBCaWdEZWNpbWFsKG5lZ2F0aXZlKG5vZGUpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubmV3TGl0ZXJhbChuZXcgTG9uZyhpbnRsaXQubG9uZ1ZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICBMaXRlcmFsLlRZUEVfTlVNQkVSKTsKKworICAgICAgICAgICAgY2FzZSBKSlRERUNJTUFMTElURVJBTDoKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIGRlY2xpdCA9IG5ldyBCaWdEZWNpbWFsCisgICAgICAgICAgICAgICAgICAgIChub2RlLnRleHQuZW5kc1dpdGgoImQiKSB8fCBub2RlLnRleHQuZW5kc1dpdGgoIkQiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50ZXh0LmVuZHNXaXRoKCJmIikgfHwgbm9kZS50ZXh0LmVuZHNXaXRoKCJGIikKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbm9kZS50ZXh0LnN1YnN0cmluZygwLCBub2RlLnRleHQubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBub2RlLnRleHQpLgorICAgICAgICAgICAgICAgICAgICBtdWx0aXBseShuZXcgQmlnRGVjaW1hbChuZWdhdGl2ZShub2RlKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm5ld0xpdGVyYWwoZGVjbGl0LCBMaXRlcmFsLlRZUEVfTlVNQkVSKTsKKworICAgICAgICAgICAgY2FzZSBKSlRTVFJJTkdMSVRFUkFMOgorICAgICAgICAgICAgY2FzZSBKSlRUUklNQ0hBUkFDVEVSOgorICAgICAgICAgICAgY2FzZSBKSlRFU0NBUEVDSEFSQUNURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubmV3TGl0ZXJhbCh0cmltUXVvdGVzKG5vZGUudGV4dCksCisgICAgICAgICAgICAgICAgICAgIExpdGVyYWwuVFlQRV9TUV9TVFJJTkcpOworCisgICAgICAgICAgICBjYXNlIEpKVFBBVFRFUk5WQUxVRToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChmaXJzdENoaWxkKG5vZGUpKTsKKworICAgICAgICAgICAgY2FzZSBKSlROQU1FRElOUFVUUEFSQU1FVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXIobm9kZS50ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUUE9TSVRJT05BTElOUFVUUEFSQU1FVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXIobm9kZS50ZXh0LCB0cnVlKTsKKworICAgICAgICAgICAgY2FzZSBKSlRPUjogLy8geCBPUiB5CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkub3IoZ2V0RXhwcmVzc2lvbihsZWZ0KG5vZGUpKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RXhwcmVzc2lvbihyaWdodChub2RlKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVEFORDogLy8geCBBTkQgeQorICAgICAgICAgICAgICAgIHJldHVybiBhbmQoZ2V0RXhwcmVzc2lvbihsZWZ0KG5vZGUpKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RXhwcmVzc2lvbihyaWdodChub2RlKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVEVRVUFMUzogLy8geCA9IHkKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUobGVmdChub2RlKSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGdldFZhbHVlKHJpZ2h0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGVzKHZhbDEsIHZhbDIsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmVxdWFsKHZhbDEsIHZhbDIpOworCisgICAgICAgICAgICBjYXNlIEpKVE5PVEVRVUFMUzogLy8geCA8PiB5CisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKGxlZnQobm9kZSkpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShyaWdodChub2RlKSk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlcyh2YWwxLCB2YWwyLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ub3RFcXVhbCh2YWwxLCB2YWwyKTsKKworICAgICAgICAgICAgY2FzZSBKSlRMRVNTVEhBTjogLy8geCA8IHkKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUobGVmdChub2RlKSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGdldFZhbHVlKHJpZ2h0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGVzKHZhbDEsIHZhbDIsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lmxlc3NUaGFuKHZhbDEsIHZhbDIpOworCisgICAgICAgICAgICBjYXNlIEpKVExFU1NPUkVRVUFMOiAvLyB4IDw9IHkKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUobGVmdChub2RlKSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGdldFZhbHVlKHJpZ2h0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGVzKHZhbDEsIHZhbDIsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lmxlc3NUaGFuRXF1YWwodmFsMSwgdmFsMik7CisKKyAgICAgICAgICAgIGNhc2UgSkpUR1JFQVRFUlRIQU46IC8vIHggPiB5CisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKGxlZnQobm9kZSkpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShyaWdodChub2RlKSk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlcyh2YWwxLCB2YWwyLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ncmVhdGVyVGhhbih2YWwxLCB2YWwyKTsKKworICAgICAgICAgICAgY2FzZSBKSlRHUkVBVEVST1JFUVVBTDogLy8geCA+PSB5CisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKGxlZnQobm9kZSkpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShyaWdodChub2RlKSk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlcyh2YWwxLCB2YWwyLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ncmVhdGVyVGhhbkVxdWFsKHZhbDEsIHZhbDIpOworCisgICAgICAgICAgICBjYXNlIEpKVEFERDogLy8geCArIHkKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUobGVmdChub2RlKSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGdldFZhbHVlKHJpZ2h0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGVzKHZhbDEsIHZhbDIsIFRZUEVfTlVNQkVSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5hZGQodmFsMSwgdmFsMik7CisKKyAgICAgICAgICAgIGNhc2UgSkpUU1VCVFJBQ1Q6IC8vIHggLSB5CisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKGxlZnQobm9kZSkpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShyaWdodChub2RlKSk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlcyh2YWwxLCB2YWwyLCBUWVBFX05VTUJFUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkuc3VidHJhY3QodmFsMSwgdmFsMik7CisKKyAgICAgICAgICAgIGNhc2UgSkpUTVVMVElQTFk6IC8vIHggKiB5CisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKGxlZnQobm9kZSkpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShyaWdodChub2RlKSk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlcyh2YWwxLCB2YWwyLCBUWVBFX05VTUJFUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubXVsdGlwbHkodmFsMSwgdmFsMik7CisKKyAgICAgICAgICAgIGNhc2UgSkpURElWSURFOiAvLyB4IC8geQorICAgICAgICAgICAgICAgIHZhbDEgPSBnZXRWYWx1ZShsZWZ0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICB2YWwyID0gZ2V0VmFsdWUocmlnaHQobm9kZSkpOworICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZXModmFsMSwgdmFsMiwgVFlQRV9OVU1CRVIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmRpdmlkZSh2YWwxLCB2YWwyKTsKKworICAgICAgICAgICAgY2FzZSBKSlRCRVRXRUVOOiAvLyB4LmZpZWxkIFtOT1RdIEJFVFdFRU4gNSBBTkQgMTAKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUoY2hpbGQobm9kZSwgMCwgMykpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShjaGlsZChub2RlLCAxLCAzKSk7CisgICAgICAgICAgICAgICAgdmFsMyA9IGdldFZhbHVlKGNoaWxkKG5vZGUsIDIsIDMpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGVzKHZhbDEsIHZhbDIsIG51bGwpOworICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZXModmFsMSwgdmFsMywgbnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWxOb3Qobm90LCBhbmQoZmFjdG9yeS5ncmVhdGVyVGhhbkVxdWFsKHZhbDEsIHZhbDIpLAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lmxlc3NUaGFuRXF1YWwodmFsMSwgdmFsMykpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRJTjogLy8geC5maWVsZCBbTk9UXSBJTiAoJ2EnLCAnYicsICdjJykKKworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gaW5FeHAgPSBudWxsOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGluSXRlcmF0b3IgPSBub2RlLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGNoaWxkIGlzIHRoZSBwYXRoCisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKChKUFFMTm9kZSkgaW5JdGVyYXRvci5uZXh0KCkpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGluSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZSgoSlBRTE5vZGUpIGluSXRlcmF0b3IubmV4dCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIDx2YWx1ZT4gSU4gKDxzdWJxdWVyeT4pIG9yCisgICAgICAgICAgICAgICAgICAgIC8vIDx2YWx1ZT4gSU4gKDxzaW5nbGUgdmFsdWU+KQorICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWwyIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgbm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsTm90KG5vdCwgZmFjdG9yeS5jb250YWlucyh2YWwyLCB2YWwxKSk7IAorCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgY3VycmVudGx5IGEgc2VxdWVuY2Ugb2YgT1IgZXhwcmVzc2lvbnMsIHNpbmNlIHdlCisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBoYXZlIHN1cHBvcnQgZm9yIElOIGV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZXModmFsMSwgdmFsMiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbkV4cCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5FeHAgPSBmYWN0b3J5LmVxdWFsKHZhbDEsIHZhbDIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpbkV4cCA9IGZhY3Rvcnkub3IoaW5FeHAsIGZhY3RvcnkuZXF1YWwodmFsMSwgdmFsMikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdlIGFkZGl0aW9uYWxseSBuZWVkIHRvIGFkZCBpbiBhICJOT1QgTlVMTCIgY2xhdXNlLCBzaW5jZQorICAgICAgICAgICAgICAgIC8vIHRoZSBJTiBiZWhhdmlvciB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBDVFMgYWxzbyBleHBlY3RzCisgICAgICAgICAgICAgICAgLy8gdG8gZmlsdGVyIG91ciBOVUxMcworICAgICAgICAgICAgICAgIHJldHVybiBhbmQoZXZhbE5vdChub3QsIGluRXhwKSwKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5ub3RFcXVhbCh2YWwxLCBmYWN0b3J5LmdldE51bGwoKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVElTTlVMTDogLy8geC5maWVsZCBJUyBbTk9UXSBOVUxMCisgICAgICAgICAgICAgICAgaWYgKG5vdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkubm90RXF1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgIChnZXRWYWx1ZShvbmx5Q2hpbGQobm9kZSkpLCBmYWN0b3J5LmdldE51bGwoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5lcXVhbAorICAgICAgICAgICAgICAgICAgICAgICAgKGdldFZhbHVlKG9ubHlDaGlsZChub2RlKSksIGZhY3RvcnkuZ2V0TnVsbCgpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRQQVRIOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXRoT3JDb25zdGFudChub2RlKTsKKworICAgICAgICAgICAgY2FzZSBKSlRJREVOVElGSUVSOgorICAgICAgICAgICAgY2FzZSBKSlRJREVOVElGSUNBVElPTlZBUklBQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRJZGVudGlmaWVyKG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEpKVE5PVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ub3QoZ2V0RXhwcmVzc2lvbihvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRMSUtFOiAvLyBmaWVsZCBMSUtFICclc29tZXZhbCUnCisgICAgICAgICAgICAgICAgdmFsMSA9IGdldFZhbHVlKGxlZnQobm9kZSkpOworICAgICAgICAgICAgICAgIHZhbDIgPSBnZXRWYWx1ZShyaWdodChub2RlKSk7CisKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGUodmFsMSwgVFlQRV9TVFJJTkcpOworICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZSh2YWwyLCBUWVBFX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhbiBlc2NhcGUgY2hhcmFjdGVyIGJlbmVhdGggdGhlIG5vZGUKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXNjYXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBKUFFMTm9kZSBlc2NhcGVOb2RlID0gcmlnaHQobm9kZSkuCisgICAgICAgICAgICAgICAgICAgIGZpbmRDaGlsZEJ5SUQoSkpURVNDQVBFQ0hBUkFDVEVSLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAoZXNjYXBlTm9kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSB0cmltUXVvdGVzKG9ubHlDaGlsZChlc2NhcGVOb2RlKS50ZXh0KTsKKworICAgICAgICAgICAgICAgIGlmIChub3QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm5vdE1hdGNoZXModmFsMSwgdmFsMiwgIl8iLCAiJSIsIGVzY2FwZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5tYXRjaGVzKHZhbDEsIHZhbDIsICJfIiwgIiUiLCBlc2NhcGUpOworCisgICAgICAgICAgICBjYXNlIEpKVElTRU1QVFk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWxOb3Qobm90LAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmlzRW1wdHkoZ2V0VmFsdWUob25seUNoaWxkKG5vZGUpKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVFNJWkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkuc2l6ZShnZXRWYWx1ZShvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRVUFBFUjoKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUob25seUNoaWxkKG5vZGUpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGUodmFsMSwgVFlQRV9TVFJJTkcpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRvVXBwZXJDYXNlKHZhbDEpOworCisgICAgICAgICAgICBjYXNlIEpKVExPV0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRvTG93ZXJDYXNlKGdldFN0cmluZ1ZhbHVlKG9ubHlDaGlsZChub2RlKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVExFTkdUSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5zdHJpbmdMZW5ndGgoZ2V0U3RyaW5nVmFsdWUob25seUNoaWxkKG5vZGUpKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUQUJTOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmFicyhnZXROdW1iZXJWYWx1ZShvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRTUVJUOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnNxcnQoZ2V0TnVtYmVyVmFsdWUob25seUNoaWxkKG5vZGUpKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUTU9EOgorICAgICAgICAgICAgICAgIHZhbDEgPSBnZXRWYWx1ZShsZWZ0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICB2YWwyID0gZ2V0VmFsdWUocmlnaHQobm9kZSkpOworICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZXModmFsMSwgdmFsMiwgVFlQRV9OVU1CRVIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm1vZCh2YWwxLCB2YWwyKTsKKworICAgICAgICAgICAgY2FzZSBKSlRUUklNOiAvLyBUUklNKFtbd2hlcmVdIFtjaGFyXSBGUk9NXSBmaWVsZCkKKyAgICAgICAgICAgICAgICB2YWwxID0gZ2V0VmFsdWUobGFzdENoaWxkKG5vZGUpKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGUodmFsMSwgVFlQRV9TVFJJTkcpOworCisgICAgICAgICAgICAgICAgQm9vbGVhbiB0cmltV2hlcmUgPSBudWxsOworCisgICAgICAgICAgICAgICAgSlBRTE5vZGUgZmlyc3RUcmltQ2hpbGQgPSBmaXJzdENoaWxkKG5vZGUpOworCisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICB0cmltV2hlcmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUcmltQ2hpbGQuaWQgPT0gSkpUVFJJTUxFQURJTkcgPyBCb29sZWFuLlRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUcmltQ2hpbGQuaWQgPT0gSkpUVFJJTVRSQUlMSU5HID8gQm9vbGVhbi5GQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVmFsdWUgdHJpbUNoYXI7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgMyBjaGlsZHJlbiwgdGhlbiB3ZSBrbm93IHRoZSB0cmltCisgICAgICAgICAgICAgICAgLy8gY2hhciBpcyB0aGUgc2Vjb25kIG5vZGUKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgdHJpbUNoYXIgPSBnZXRWYWx1ZShzZWNvbmRDaGlsZChub2RlKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSB0d28gY2hpbGRyZW4sIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0byBzZWUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpcnN0IGNoaWxkIGlzIGEgbGVhZGluZy90cmFpbGluZy9ib3RoIG5vZGUsCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSB0cmltIGNoYXJhY3RlciBub2RlCisgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMgorICAgICAgICAgICAgICAgICAgICAmJiBmaXJzdFRyaW1DaGlsZC5pZCAhPSBKSlRUUklNTEVBRElORworICAgICAgICAgICAgICAgICAgICAmJiBmaXJzdFRyaW1DaGlsZC5pZCAhPSBKSlRUUklNVFJBSUxJTkcKKyAgICAgICAgICAgICAgICAgICAgJiYgZmlyc3RUcmltQ2hpbGQuaWQgIT0gSkpUVFJJTUJPVEgpCisgICAgICAgICAgICAgICAgICAgIHRyaW1DaGFyID0gZ2V0VmFsdWUoZmlyc3RDaGlsZChub2RlKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIG90aHdlcndpc2UsIHdlIGRlZmF1bHQgdG8gdHJpbW1pbmcgdGhlIHNwYWNlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHJpbUNoYXIgPSBmYWN0b3J5Lm5ld0xpdGVyYWwoIiAiLCBMaXRlcmFsLlRZUEVfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnRyaW0odmFsMSwgdHJpbUNoYXIsIHRyaW1XaGVyZSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUQ09OQ0FUOgorICAgICAgICAgICAgICAgIHZhbDEgPSBnZXRWYWx1ZShsZWZ0KG5vZGUpKTsKKyAgICAgICAgICAgICAgICB2YWwyID0gZ2V0VmFsdWUocmlnaHQobm9kZSkpOworICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZSh2YWwxLCBUWVBFX1NUUklORyk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlKHZhbDIsIFRZUEVfU1RSSU5HKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jb25jYXQodmFsMSwgdmFsMik7CisKKyAgICAgICAgICAgIGNhc2UgSkpUU1VCU1RSSU5HOgorICAgICAgICAgICAgICAgIHZhbDEgPSBnZXRWYWx1ZShjaGlsZChub2RlLCAwLCAzKSk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGdldFZhbHVlKGNoaWxkKG5vZGUsIDEsIDMpKTsKKyAgICAgICAgICAgICAgICB2YWwzID0gZ2V0VmFsdWUoY2hpbGQobm9kZSwgMiwgMykpOworICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZSh2YWwxLCBUWVBFX1NUUklORyk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlKHZhbDIsIEludGVnZXIuVFlQRSk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlKHZhbDMsIEludGVnZXIuVFlQRSk7CisKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2VtYW50aWNzIG9mIHRoZSBKUFFMIHN1YnN0cmluZygpIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgLy8gYXJlIHRoYXQgYXJnMiBpcyB0aGUgMS1iYXNlZCBzdGFydCBpbmRleCwgYW5kIGFyZzMgaXMKKyAgICAgICAgICAgICAgICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdG8gYmUgcmV0dXJuOyB0aGlzIGlzIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhlIHNlbWFudGljcyBvZiB0aGUgRXhwcmVzc2lvbkZhY3RvcnkncyBzdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWF0Y2hlcyB0aGUgSmF2YSBsYW5ndWFnZSAoMC1iYXNlZCBzdGFydCBpbmRleCwKKyAgICAgICAgICAgICAgICAvLyBhcmcyIGlzIHRoZSBlbmQgaW5kZXgpOiB3ZSBwZXJmb3JtIHRoZSB0cmFuc2xhdGlvbiBieQorICAgICAgICAgICAgICAgIC8vIGFkZGluZyBvbmUgdG8gdGhlIGZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlbiBhZGRpbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gZmlyc3QgYXJndW1lbnQgdG8gdGhlIHNlY29uZCBhcmd1bWVudCB0byBnZXQgdGhlIGVuZEluZGV4CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAjIyMgd2UgY291bGQgZ2V0IHJpZCBvZiBzb21lIG1lc3N5IGV4cHJlc3Npb25zIGJ5IGNoZWNraW5nIGZvcgorICAgICAgICAgICAgICAgIC8vIHRoZSBjb21tb24gY2FzZSB3aGVyZSB0aGUgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgYXMKKyAgICAgICAgICAgICAgICAvLyBhIGxpdGVyYWwsIGluIHdoaWNoIGNhc2Ugd2UgY291bGQganVzdCBkbyB0aGUgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgICAgLy8gaW4gbWVtb3J5OyBvdGhlcndpc2Ugd2Ugd2luZCB1cCB3aXRoIHVnbHkgbG9va2luZyBTUUwgbGlrZToKKyAgICAgICAgICAgICAgICAvLyBTRUxFQ1QgLi4uIEZST00gLi4uIHQxCisgICAgICAgICAgICAgICAgLy8gKFNVQlNUUklORyh0MS5BU1RSLCAoPyAtID8pICsgMSwgKD8gKyAoPyAtID8pKSAtICgoPyAtID8pKSkgPSA/KQorICAgICAgICAgICAgICAgIC8vIFtwYXJhbXM9KGxvbmcpIDIsIChpbnQpIDEsIChsb25nKSAyLCAobG9uZykgMiwgKGludCkgMSwKKyAgICAgICAgICAgICAgICAvLyAobG9uZykgMiwgKGludCkgMSwgKFN0cmluZykgb28KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5zdWJzdHJpbmcodmFsMSwgZmFjdG9yeS5uZXdBcmd1bWVudExpc3QKKyAgICAgICAgICAgICAgICAgICAgKGZhY3Rvcnkuc3VidHJhY3QodmFsMiwgZmFjdG9yeS5uZXdMaXRlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVycy52YWx1ZU9mKDEpLCBMaXRlcmFsLlRZUEVfTlVNQkVSKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoZmFjdG9yeS5hZGQodmFsMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmFjdG9yeS5zdWJ0cmFjdCh2YWwyLCBmYWN0b3J5Lm5ld0xpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWJlcnMudmFsdWVPZigxKSwgTGl0ZXJhbC5UWVBFX05VTUJFUikpKSkpKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUTE9DQVRFOgorICAgICAgICAgICAgICAgIC8vIGFzIHdpdGggU1VCU1RSSU5HIChhYm92ZSksIHRoZSBzZW1hbnRpY3MgZm9yIExPQ0FURSBkaWZmZXIKKyAgICAgICAgICAgICAgICAvLyBmcm9tIEV4cHJlc3Npb25GYWN0b3J5LmluZGV4T2YgaW4gdGhhdCBMT0NBVEUgdXNlcyBhCisgICAgICAgICAgICAgICAgLy8gMC1iYXNlZCBpbmRleCwgYW5kIGluZGV4T2YgdXNlcyBhIDEtYmFzZWQgaW5kZXgKKyAgICAgICAgICAgICAgICBWYWx1ZSBsb2NhdGVQYXRoID0gZ2V0VmFsdWUoZmlyc3RDaGlsZChub2RlKSk7CisgICAgICAgICAgICAgICAgVmFsdWUgbG9jYXRlU2VhcmNoID0gZ2V0VmFsdWUoc2Vjb25kQ2hpbGQobm9kZSkpOworICAgICAgICAgICAgICAgIFZhbHVlIGxvY2F0ZUZyb21JbmRleCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID4gMikgLy8gb3B0aW9uYWwgc3RhcnQgaW5kZXggYXJnCisgICAgICAgICAgICAgICAgICAgIGxvY2F0ZUZyb21JbmRleCA9IGdldFZhbHVlKHRoaXJkQ2hpbGQobm9kZSkpOworCisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRUeXBlKGxvY2F0ZVBhdGgsIFRZUEVfU1RSSU5HKTsKKyAgICAgICAgICAgICAgICBzZXRJbXBsaWNpdFR5cGUobG9jYXRlU2VhcmNoLCBUWVBFX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRlRnJvbUluZGV4ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNldEltcGxpY2l0VHlwZShsb2NhdGVGcm9tSW5kZXgsIFRZUEVfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmFkZChmYWN0b3J5LmluZGV4T2YobG9jYXRlU2VhcmNoLAorICAgICAgICAgICAgICAgICAgICBsb2NhdGVGcm9tSW5kZXggPT0gbnVsbCA/IGxvY2F0ZVBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIDogZmFjdG9yeS5uZXdBcmd1bWVudExpc3QobG9jYXRlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnkuc3VidHJhY3QobG9jYXRlRnJvbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkubmV3TGl0ZXJhbChOdW1iZXJzLnZhbHVlT2YoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdGVyYWwuVFlQRV9OVU1CRVIpKSkpLAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm5ld0xpdGVyYWwoTnVtYmVycy52YWx1ZU9mKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgTGl0ZXJhbC5UWVBFX05VTUJFUikpOworCisgICAgICAgICAgICBjYXNlIEpKVEFHR1JFR0FURToKKyAgICAgICAgICAgICAgICAvLyBzaW1wbHkgcGFzcy10aHJvdWdoIHdoaWxlIGFzc2VydGluZyBhIHNpbmdsZSBjaGlsZAorICAgICAgICAgICAgICAgIHJldHVybiBldmFsKG9ubHlDaGlsZChub2RlKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUQ09VTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY291bnQoZ2V0VmFsdWUobGFzdENoaWxkKG5vZGUpKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUTUFYOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm1heChnZXROdW1iZXJWYWx1ZShvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRNSU46CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubWluKGdldE51bWJlclZhbHVlKG9ubHlDaGlsZChub2RlKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVFNVTToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5zdW0oZ2V0TnVtYmVyVmFsdWUob25seUNoaWxkKG5vZGUpKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUQVZFUkFHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5hdmcoZ2V0TnVtYmVyVmFsdWUob25seUNoaWxkKG5vZGUpKSk7CisKKyAgICAgICAgICAgIGNhc2UgSkpURElTVElOQ1RQQVRIOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmRpc3RpbmN0KGdldFZhbHVlKG9ubHlDaGlsZChub2RlKSkpOworCisgICAgICAgICAgICBjYXNlIEpKVEVYSVNUUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5pc05vdEVtcHR5KChWYWx1ZSkgZXZhbChvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRBTlk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuYW55KChWYWx1ZSkgZXZhbChvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRBTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuYWxsKChWYWx1ZSkgZXZhbChvbmx5Q2hpbGQobm9kZSkpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRTVUJTRUxFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFN1YnF1ZXJ5KG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEpKVE1FTUJFUk9GOgorICAgICAgICAgICAgICAgIHZhbDEgPSBnZXRWYWx1ZShsZWZ0KG5vZGUpLCBWQVJfUEFUSCk7CisgICAgICAgICAgICAgICAgdmFsMiA9IGdldFZhbHVlKHJpZ2h0KG5vZGUpLCBWQVJfUEFUSCk7CisgICAgICAgICAgICAgICAgc2V0SW1wbGljaXRDb250YWluc1R5cGVzKHZhbDIsIHZhbDEsIENPTlRBSU5TX1RZUEVfRUxFTUVOVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWxOb3Qobm90LCBmYWN0b3J5LmNvbnRhaW5zKHZhbDIsIHZhbDEpKTsKKworICAgICAgICAgICAgY2FzZSBKSlRDVVJSRU5UREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRDdXJyZW50RGF0ZSgpOworCisgICAgICAgICAgICBjYXNlIEpKVENVUlJFTlRUSU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldEN1cnJlbnRUaW1lKCk7CisKKyAgICAgICAgICAgIGNhc2UgSkpUQ1VSUkVOVFRJTUVTVEFNUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRDdXJyZW50VGltZXN0YW1wKCk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfRkFUQUwsICJiYWQtdHJlZSIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgbm9kZSB9LCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEltcGxpY2l0VHlwZXMoVmFsdWUgdmFsMSwgVmFsdWUgdmFsMiwgQ2xhc3MgZXhwZWN0ZWQpIHsKKyAgICAgICAgc3VwZXIuc2V0SW1wbGljaXRUeXBlcyh2YWwxLCB2YWwyLCBleHBlY3RlZCk7CisKKyAgICAgICAgLy8gYXMgd2VsbCBhcyBzZXR0aW5nIHRoZSB0eXBlcyBmb3IgY29udmVyc2lvbnMsIHdlIGFsc28gbmVlZCB0bworICAgICAgICAvLyBlbnN1cmUgdGhhdCBhbnkgcGFyYW1ldGVycyBhcmUgZGVjbGFyZWQgd2l0aCB0aGUgY29ycmVjdCB0eXBlLAorICAgICAgICAvLyBzaW5jZSB0aGUgSlBBIHNwZWMgZXhwZWN0cyB0aGF0IHRoZXNlIHdpbGwgYmUgdmFsaWRhdGVkCisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IHZhbDEgaW5zdGFuY2VvZiBQYXJhbWV0ZXIgPyAoUGFyYW1ldGVyKSB2YWwxCisgICAgICAgICAgICA6IHZhbDIgaW5zdGFuY2VvZiBQYXJhbWV0ZXIgPyAoUGFyYW1ldGVyKSB2YWwyIDogbnVsbDsKKyAgICAgICAgUGF0aCBwYXRoID0gdmFsMSBpbnN0YW5jZW9mIFBhdGggPyAoUGF0aCkgdmFsMQorICAgICAgICAgICAgOiB2YWwyIGluc3RhbmNlb2YgUGF0aCA/IChQYXRoKSB2YWwyIDogbnVsbDsKKworICAgICAgICAvLyB3ZSBvbmx5IGNoZWNrIGZvciBwYXJhbWV0ZXItdG8tcGF0aCBjb21wYXJpc29ucworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCB8fCBwYXRoID09IG51bGwgfHwgcGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IHBhdGgubGFzdCgpOworICAgICAgICBpZiAoZm1kID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGZtZC5nZXRUeXBlKCk7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtLmdldFBhcmFtZXRlck5hbWUoKTsKKyAgICAgICAgaWYgKHBhcmFtTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFscmVhZHkgZGVjbGFyZWQgdGhlIHBhcmFtZXRlcgorICAgICAgICBpZiAocGFyYW1ldGVyVHlwZXMuY29udGFpbnNLZXkocGFyYW1OYW1lKSkKKyAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzLnB1dChwYXJhbU5hbWUsIHR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgVmFsdWUgZ2V0U3RyaW5nVmFsdWUoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZVZhbHVlKG5vZGUsIFRZUEVfU1RSSU5HKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFZhbHVlIGdldE51bWJlclZhbHVlKEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGVWYWx1ZShub2RlLCBUWVBFX05VTUJFUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBWYWx1ZSBnZXRUeXBlVmFsdWUoSlBRTE5vZGUgbm9kZSwgQ2xhc3MgaW1wbGljaXRUeXBlKSB7CisgICAgICAgIFZhbHVlIHZhbCA9IGdldFZhbHVlKG5vZGUpOworICAgICAgICBzZXRJbXBsaWNpdFR5cGUodmFsLCBpbXBsaWNpdFR5cGUpOworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHByaXZhdGUgVmFsdWUgZ2V0U3VicXVlcnkoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICBmaW5hbCBib29sZWFuIHN1YmNsYXNzZXMgPSB0cnVlOworICAgICAgICBTdHJpbmcgYWxpYXMgPSBuZXh0QWxpYXMoKTsKKworICAgICAgICAvLyBwYXJzZSB0aGUgc3VicXVlcnkKKyAgICAgICAgUGFyc2VkSlBRTCBwYXJzZWQgPSBuZXcgUGFyc2VkSlBRTChub2RlLnBhcnNlci5qcHFsLCBub2RlKTsKKworICAgICAgICBDbGFzc01ldGFEYXRhIGNhbmRpZGF0ZSA9IGdldENhbmRpZGF0ZU1ldGFEYXRhKG5vZGUpOworICAgICAgICBTdWJxdWVyeSBzdWJxID0gZmFjdG9yeS5uZXdTdWJxdWVyeShjYW5kaWRhdGUsIHN1YmNsYXNzZXMsIGFsaWFzKTsKKyAgICAgICAgc3VicS5zZXRNZXRhRGF0YShjYW5kaWRhdGUpOworCisgICAgICAgIGNvbnRleHRzLnB1c2gobmV3IENvbnRleHQocGFyc2VkLCBzdWJxKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFF1ZXJ5RXhwcmVzc2lvbnMgc3ViZXhwID0gZ2V0UXVlcnlFeHByZXNzaW9ucygpOworICAgICAgICAgICAgc3VicS5zZXRRdWVyeUV4cHJlc3Npb25zKHN1YmV4cCk7CisgICAgICAgICAgICByZXR1cm4gc3VicTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc3VicXVlcnkgcGFyc2UgY29udGV4dAorICAgICAgICAgICAgY29udGV4dHMucG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIG5hbWVzIGFuZCBvcmRlciBvZiBpbXBsaWNpdCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgaWQsIGJvb2xlYW4gcG9zaXRpb25hbCkgeworICAgICAgICBpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzID0gbmV3IExpbmtlZE1hcCg2KTsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJUeXBlcy5jb250YWluc0tleShpZCkpCisgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlcy5wdXQoaWQsIFRZUEVfT0JKRUNUKTsKKworICAgICAgICBDbGFzcyB0eXBlID0gT2JqZWN0LmNsYXNzOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBudWxsOworICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgaWYgKHBvc2l0aW9uYWwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gaW5kZXhlcyBpbiBKUFFMIGFyZSAxLWJhc2VkLCBhcyBvcHBvc2VkIHRvIDAtYmFzZWQgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgY29yZSBFeHByZXNzaW9uRmFjdG9yeQorICAgICAgICAgICAgICAgIGluZGV4ID0gSW50ZWdlci5wYXJzZUludChpZCkgLSAxOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAiYmFkLXBvc2l0aW9uYWwtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBpZCB9LCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAiYmFkLXBvc2l0aW9uYWwtcGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBpZCB9LCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgaW5kZXggaXMganVzdCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBwYXJhbXMKKyAgICAgICAgICAgIGluZGV4ID0gcGFyYW1ldGVyVHlwZXMuaW5kZXhPZihpZCk7CisgICAgICAgIH0KKworICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBmYWN0b3J5Lm5ld1BhcmFtZXRlcihpZCwgdHlwZSk7CisgICAgICAgIHBhcmFtLnNldE1ldGFEYXRhKG1ldGEpOworICAgICAgICBwYXJhbS5zZXRJbmRleChpbmRleCk7CisKKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgd2Ugc2hvdWxkIGV2YWx1YXRlIGZvciBhIE5PVCBleHByZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBldmFsTm90KGJvb2xlYW4gbm90LCBFeHByZXNzaW9uIGV4cCkgeworICAgICAgICByZXR1cm4gbm90ID8gZmFjdG9yeS5ub3QoZXhwKSA6IGV4cDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmltIG9mZiBsZWFkaW5nIGFuZCB0cmFpbGluZyBzaW5nbGUtcXVvdGVzLCBhbmQgdGhlbgorICAgICAqIHJlcGxhY2UgYW55IGludGVybmFsICcnIGluc3RhbmNlcyB3aXRoICcgKHNpbmNlIHJlcGVhdGluZyB0aGUKKyAgICAgKiBxdW90ZSBpcyB0aGUgSlBRTCBtZWNoYW5pc20gb2YgZXNjYXBpbmcgYSBzaW5nbGUgcXVvdGUpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRyaW1RdW90ZXMoU3RyaW5nIHN0cikgeworICAgICAgICBpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpIDw9IDEpCisgICAgICAgICAgICByZXR1cm4gc3RyOworCisgICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aCgiJyIpICYmIHN0ci5lbmRzV2l0aCgiJyIpKQorICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygxLCBzdHIubGVuZ3RoKCkgLSAxKTsKKworICAgICAgICBpbnQgaW5kZXggPSAtMTsKKworICAgICAgICB3aGlsZSAoKGluZGV4ID0gc3RyLmluZGV4T2YoIicnIiwgaW5kZXggKyAxKSkgIT0gLTEpCisgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSkgKyBzdHIuc3Vic3RyaW5nKGluZGV4ICsgMik7CisKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBJbnRlZ2VyTGl0ZXJhbCBhbmQgRGVjaW1hbExpdGVyYWwgbm9kZSB3aWxsCisgICAgICogaGF2ZSBhIGNoaWxkIG5vZGUgb2YgTmVnYXRpdmUgaWYgaXQgaXMgbmVnYXRpdmU6CisgICAgICogaWYgc28sIHRoaXMgbWV0aG9kIHJldHVybnMgLTEsIGVsc2UgaXQgcmV0dXJucyAxLgorICAgICAqLworICAgIHByaXZhdGUgc2hvcnQgbmVnYXRpdmUoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAhPSBudWxsICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09IDEKKyAgICAgICAgICAgICYmIGZpcnN0Q2hpbGQobm9kZSkuaWQgPT0gSkpUTkVHQVRJVkUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHByaXZhdGUgVmFsdWUgZ2V0SWRlbnRpZmllcihKUFFMTm9kZSBub2RlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbm9kZS50ZXh0OworICAgICAgICBmaW5hbCBWYWx1ZSB2YWwgPSBnZXRWYXJpYWJsZShuYW1lLCBmYWxzZSk7CisKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBjbWQgPSBnZXRNZXRhRGF0YUZvckFsaWFzKG5hbWUpOworCisgICAgICAgIGlmIChjbWQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjbGFzcyBuYW1lIGlzIHRoZSBhbGlhcworICAgICAgICAgICAgLy8gZm9yIHRoZSBjYW5kaWRhdGUgKHdlIGRvbid0IHVzZSB2YXJpYWJsZXMgZm9yIHRoaXMpCisgICAgICAgICAgICBWYWx1ZSB0aGl6ID0gZmFjdG9yeS5nZXRUaGlzKCk7CisgICAgICAgICAgICB0aGl6LnNldE1ldGFEYXRhKGNtZCk7CisgICAgICAgICAgICByZXR1cm4gdGhpejsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBQYXRoKSB7CisgICAgICAgICAgICByZXR1cm4gKFBhdGgpIHZhbDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBWYWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIChWYWx1ZSkgdmFsOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgInVua25vd24taWRlbnRpZmllciIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117IG5hbWUgfSwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBWYWx1ZSBnZXRQYXRoT3JDb25zdGFudChKUFFMTm9kZSBub2RlKSB7CisgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgcGF0aCBpcyBhbiBlbnVtIG9yIHN0YXRpYyBmaWVsZCwgYW5kCisgICAgICAgIC8vIGlmIHNvLCBsb2FkIGl0CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBhc3NlbWJsZShub2RlLCAiLiIsIDEpOworICAgICAgICBDbGFzcyBjID0gcmVzb2x2ZXIuY2xhc3NGb3JOYW1lKGNsYXNzTmFtZSwgbnVsbCk7CisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSBsYXN0Q2hpbGQobm9kZSkudGV4dDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IGMuZ2V0RmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZC5nZXQobnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubmV3TGl0ZXJhbCh2YWx1ZSwgTGl0ZXJhbC5UWVBFX1VOS05PV04pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgeworICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKEVYX1VTRVIsICJuby1maWVsZCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgY2xhc3NOYW1lLCBmaWVsZE5hbWUgfSwgbnNmZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKEVYX1VTRVIsICJ1bmFjY2Vzc2libGUtZmllbGQiLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGNsYXNzTmFtZSwgZmllbGROYW1lIH0sIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhdGgobm9kZSwgZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXRoIGdldFBhdGgoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gZ2V0UGF0aChub2RlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXRoIGdldFBhdGgoSlBRTE5vZGUgbm9kZSwgYm9vbGVhbiBwY09ubHksIGJvb2xlYW4gaW5uZXIpIHsKKyAgICAgICAgLy8gcmVzb2x2ZSB0aGUgZmlyc3QgZWxlbWVudCBhZ2FpbnN0IHRoZSBhbGlhc2VzIG1hcCAuLi4KKyAgICAgICAgLy8gaS5lLiwgdGhlIHBhdGggIlNFTEVDVCB4LmlkIEZST00gU29tZUNsYXNzIHggd2hlcmUgeC5pZCA+IDEwIgorICAgICAgICAvLyB3aWxsIG5lZWQgdG8gaGF2ZSAieCIgaW4gdGhlIGFsaWFzIG1hcCBpbiBvcmRlciB0byByZXNvbHZlCisgICAgICAgIFBhdGggcGF0aDsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZpcnN0Q2hpbGQobm9kZSkudGV4dDsKKyAgICAgICAgZmluYWwgVmFsdWUgdmFsID0gZ2V0VmFyaWFibGUobmFtZSwgZmFsc2UpOworCisgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY2xhc3MgbmFtZSBpcyB0aGUgYWxpYXMKKyAgICAgICAgLy8gZm9yIHRoZSBjYW5kaWRhdGUgKHdlIGRvbid0IHVzZSB2YXJpYWJsZXMgZm9yIHRoaXMpCisgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY3R4KCkuc2NoZW1hQWxpYXMpKSB7CisgICAgICAgICAgICBpZiAoY3R4KCkuc3VicXVlcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhdGggPSBmYWN0b3J5Lm5ld1BhdGgoY3R4KCkuc3VicXVlcnkpOworICAgICAgICAgICAgICAgIHBhdGguc2V0TWV0YURhdGEoY3R4KCkuc3VicXVlcnkuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhdGggPSBmYWN0b3J5Lm5ld1BhdGgoKTsKKyAgICAgICAgICAgICAgICBwYXRoLnNldE1ldGFEYXRhKGN0eCgpLm1ldGEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdldE1ldGFEYXRhRm9yQWxpYXMobmFtZSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSBuZXdQYXRoKG51bGwsIGdldE1ldGFEYXRhRm9yQWxpYXMobmFtZSkpOworICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBQYXRoKQorICAgICAgICAgICAgcGF0aCA9IChQYXRoKSB2YWw7CisgICAgICAgIGVsc2UgaWYgKHZhbC5nZXRNZXRhRGF0YSgpICE9IG51bGwpCisgICAgICAgICAgICBwYXRoID0gbmV3UGF0aCh2YWwsIHZhbC5nZXRNZXRhRGF0YSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgInBhdGgtbm8tbWV0YSIsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBhc3NlbWJsZShub2RlKSwgbnVsbCB9LCBudWxsKTsKKworICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGNoaWxkcmVuIGFuZCBhc3NlbWJsZSB0aGUgcGF0aAorICAgICAgICBib29sZWFuIGFsbG93TnVsbCA9ICFpbm5lcjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBwYXRoID0gKFBhdGgpIHRyYXZlcnNlUGF0aChwYXRoLCBub2RlLmNoaWxkcmVuW2ldLnRleHQsIHBjT25seSwKKyAgICAgICAgICAgICAgICBhbGxvd051bGwpOworCisgICAgICAgICAgICAvLyBhbGwgdHJhdmVyc2FscyBidXQgdGhlIGZpcnN0IG9uZSB3aWxsIGFsd2F5cyBiZSBpbm5lciBqb2lucworICAgICAgICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGVjbGFyZWRWYXJpYWJsZVR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBjbWQgPSBnZXRNZXRhRGF0YUZvckFsaWFzKG5hbWUpOworICAgICAgICBpZiAoY21kICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY21kLmdldERlc2NyaWJlZFR5cGUoKTsKKworICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKGN0eCgpLnNjaGVtYUFsaWFzKSkKKyAgICAgICAgICAgIHJldHVybiBnZXRDYW5kaWRhdGVUeXBlKCk7CisKKyAgICAgICAgLy8gSlBRTCBoYXMgbm8gZGVjbGFyZWQgdmFyaWFibGVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gRXhwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIG5vZGUgYnkgZXZhbCdpbmcgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oSlBRTE5vZGUgbm9kZSkgeworICAgICAgICBPYmplY3QgZXhwID0gZXZhbChub2RlKTsKKworICAgICAgICAvLyBjaGVjayBmb3IgYm9vbGVhbiB2YWx1ZXMgdXNlZCBhcyBleHByZXNzaW9ucworICAgICAgICBpZiAoIShleHAgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSkKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmFzRXhwcmVzc2lvbigoVmFsdWUpIGV4cCk7CisgICAgICAgIHJldHVybiAoRXhwcmVzc2lvbikgZXhwOworICAgIH0KKworICAgIHByaXZhdGUgVmFsdWUgZ2V0VmFsdWUoSlBRTE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobm9kZSwgVkFSX1BBVEgpOworICAgIH0KKworICAgIHByaXZhdGUgUGF0aCBuZXdQYXRoKFZhbHVlIHZhbCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIFBhdGggcGF0aCA9IHZhbCA9PSBudWxsID8gZmFjdG9yeS5uZXdQYXRoKCkgOiBmYWN0b3J5Lm5ld1BhdGgodmFsKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGguc2V0TWV0YURhdGEobWV0YSk7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBWYWx1ZSBmb3IgdGhlIGdpdmVuIG5vZGUgYnkgZXZhbCdpbmcgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBWYWx1ZSBnZXRWYWx1ZShKUFFMTm9kZSBub2RlLCBpbnQgaGFuZGxlVmFyKSB7CisgICAgICAgIFZhbHVlIHZhbCA9IChWYWx1ZSkgZXZhbChub2RlKTsKKworICAgICAgICAvLyBkZXRlcm1pbmQgaG93IHRvIGV2YXVhdGUgYSB2YXJpYWJlCisgICAgICAgIGlmICghdmFsLmlzVmFyaWFibGUoKSkKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIGVsc2UgaWYgKGhhbmRsZVZhciA9PSBWQVJfUEFUSCAmJiAhKHZhbCBpbnN0YW5jZW9mIFBhdGgpKQorICAgICAgICAgICAgcmV0dXJuIG5ld1BhdGgodmFsLCB2YWwuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgIGVsc2UgaWYgKGhhbmRsZVZhciA9PSBWQVJfRVJST1IpCisgICAgICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihFWF9VU0VSLCAidW5leHBlY3RlZC12YXIiLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgbm9kZS50ZXh0IH0sIG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQYXJzZSBDb250ZXh0IE1hbmFnZW1lbnQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIENvbnRleHQgY3R4KCkgeworICAgICAgICByZXR1cm4gKENvbnRleHQpIGNvbnRleHRzLnBlZWsoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpQUUxOb2RlIHJvb3QoKSB7CisgICAgICAgIHJldHVybiBjdHgoKS5wYXJzZWQucm9vdDsKKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGFGb3JBbGlhcyhTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGNvbnRleHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgY29udGV4dHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGFsaWFzLmVxdWFsc0lnbm9yZUNhc2UoY29udGV4dC5zY2hlbWFBbGlhcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubWV0YTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ29udGV4dCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJzZWRKUFFMIHBhcnNlZDsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUFsaWFzOworICAgICAgICBwcml2YXRlIFN1YnF1ZXJ5IHN1YnF1ZXJ5OworCisgICAgICAgIENvbnRleHQoUGFyc2VkSlBRTCBwYXJzZWQsIFN1YnF1ZXJ5IHN1YnF1ZXJ5KSB7CisgICAgICAgICAgICB0aGlzLnBhcnNlZCA9IHBhcnNlZDsKKyAgICAgICAgICAgIHRoaXMuc3VicXVlcnkgPSBzdWJxdWVyeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBOb2RlIHRyYXZlcnNhbCB1dGlsaXRpZXMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIEpQUUxOb2RlIG9ubHlDaGlsZChKUFFMTm9kZSBub2RlKQorICAgICAgICB0aHJvd3MgVXNlckV4Y2VwdGlvbiB7CisgICAgICAgIEpQUUxOb2RlIGNoaWxkID0gZmlyc3RDaGlsZChub2RlKTsKKworICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAxKQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgIm11bHRpLWNoaWxkcmVuIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IG5vZGUsIEFycmF5cy5hc0xpc3Qobm9kZS5jaGlsZHJlbikgfSwgbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxlZnQgbm9kZSAodGhlIGZpcnN0IG9mIHRoZSBjaGlsZHJlbiksIGFuZCBhc3NlcnRzCisgICAgICogdGhhdCB0aGVyZSBhcmUgZXhhY3RseSB0d28gY2hpbGRyZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBKUFFMTm9kZSBsZWZ0KEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkKG5vZGUsIDAsIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJpZ2h0IG5vZGUgKHRoZSBzZWNvbmQgb2YgdGhlIGNoaWxkcmVuKSwgYW5kIGFzc2VydHMKKyAgICAgKiB0aGF0IHRoZXJlIGFyZSBleGFjdGx5IHR3byBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpQUUxOb2RlIHJpZ2h0KEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkKG5vZGUsIDEsIDIpOworICAgIH0KKworICAgIHByaXZhdGUgSlBRTE5vZGUgY2hpbGQoSlBRTE5vZGUgbm9kZSwgaW50IGNoaWxkTnVtLCBpbnQgYXNzZXJ0Q291bnQpIHsKKyAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoICE9IGFzc2VydENvdW50KQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgIndyb25nLWNoaWxkLWNvdW50IiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IG5ldyBJbnRlZ2VyKGFzc2VydENvdW50KSwgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChub2RlLmNoaWxkcmVuKSB9LCBudWxsKTsKKworICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbltjaGlsZE51bV07CisgICAgfQorCisgICAgcHJpdmF0ZSBKUFFMTm9kZSBmaXJzdENoaWxkKEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gPT0gbnVsbCB8fCBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oRVhfVVNFUiwgIm5vLWNoaWxkcmVuIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IG5vZGUgfSwgbnVsbCk7CisgICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuWzBdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEpQUUxOb2RlIHNlY29uZENoaWxkKEpQUUxOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5bMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSlBRTE5vZGUgdGhpcmRDaGlsZChKUFFMTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuWzJdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEpQUUxOb2RlIGxhc3RDaGlsZChKUFFMTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBsYXN0Q2hpbGQobm9kZSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIE50aCBmcm9tIHRoZSBsYXN0IGNoaWxkLiBFLmcuLAorICAgICAqIGxhc3RDaGlsZCgxKSB3aWxsIHJldHVybiB0aGUgc2Vjb25kLXRvLXRoZS1sYXN0IGNoaWxkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEpQUUxOb2RlIGxhc3RDaGlsZChKUFFMTm9kZSBub2RlLCBpbnQgZnJvbUxhc3QpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5bbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAoMSArIGZyb21MYXN0KV07CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZSBub2RlIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgdGhlIEpQUUxFeHByZXNzaW9uQnVpbGRlcjsgYmFzZQorICAgICAqIGNsYXNzIG9mIHRoZSB7QGxpbmsgU2ltcGxlTm9kZX0gdGhhdCBpcyB1c2VkIGJ5IHtAbGluayBKUFFMfS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgICAgICogQHNlZSBOb2RlCisgICAgICogQHNlZSBTaW1wbGVOb2RlCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBKUFFMTm9kZQorICAgICAgICBpbXBsZW1lbnRzIE5vZGUsIFNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgZmluYWwgaW50IGlkOworICAgICAgICBmaW5hbCBKUFFMIHBhcnNlcjsKKyAgICAgICAgSlBRTE5vZGUgcGFyZW50OworICAgICAgICBKUFFMTm9kZVtdIGNoaWxkcmVuOworICAgICAgICBTdHJpbmcgdGV4dDsKKyAgICAgICAgYm9vbGVhbiBub3QgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgSlBRTE5vZGUoSlBRTCBwYXJzZXIsIGludCBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBqanRPcGVuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgamp0Q2xvc2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBKUFFMTm9kZVtdIGZpbmRDaGlsZHJlbkJ5SUQoaW50IGlkKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIHNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBmaW5kQ2hpbGRyZW5CeUlEKGlkLCBzZXQpOworICAgICAgICAgICAgcmV0dXJuIChKUFFMTm9kZVtdKSBzZXQudG9BcnJheShuZXcgSlBRTE5vZGVbc2V0LnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRDaGlsZHJlbkJ5SUQoaW50IGlkLCBDb2xsZWN0aW9uIHNldCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNoaWxkcmVuICE9IG51bGwgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLmlkID09IGlkKQorICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGNoaWxkcmVuW2ldKTsKKworICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmZpbmRDaGlsZHJlbkJ5SUQoaWQsIHNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc0NoaWxkSUQoaW50IGlkKSB7CisgICAgICAgICAgICByZXR1cm4gZmluZENoaWxkQnlJRChpZCwgZmFsc2UpICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBKUFFMTm9kZSBmaW5kQ2hpbGRCeUlEKGludCBpZCwgYm9vbGVhbiByZWN1cnNlKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgY2hpbGRyZW4gIT0gbnVsbCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBKUFFMTm9kZSBjaGlsZCA9IGNoaWxkcmVuW2ldOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlkID09IGlkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07CisKKyAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkgeworICAgICAgICAgICAgICAgICAgICBKUFFMTm9kZSBmb3VuZCA9IGNoaWxkLmZpbmRDaGlsZEJ5SUQoaWQsIHJlY3Vyc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vdCBmb3VuZAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gKEpQUUxOb2RlKSBwYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKSB7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEpQUUxOb2RlW2kgKyAxXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+PSBjaGlsZHJlbi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBKUFFMTm9kZSBjW10gPSBuZXcgSlBRTE5vZGVbaSArIDFdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIGMsIDAsIGNoaWxkcmVuLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGlsZHJlbltpXSA9IChKUFFMTm9kZSkgbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gamp0R2V0TnVtQ2hpbGRyZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKUFFMTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoSlBRTE5vZGUpIGpqdEdldENoaWxkKGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGNoaWxkcmVuKS5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hpbGRyZW4gPT0gbnVsbCkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRUb2tlbihUb2tlbiB0KSB7CisgICAgICAgICAgICBzZXRUZXh0KHQuaW1hZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBKUFFMVHJlZUNvbnN0YW50cy5qanROb2RlTmFtZVt0aGlzLmlkXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIHByZWZpeCkgeworICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVidWdnaW5nIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZHVtcChqYXZhLmlvLlByaW50U3RyZWFtLFN0cmluZykKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCkgeworICAgICAgICAgICAgZHVtcChTeXN0ZW0ub3V0LCBwcmVmaXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcCgpIHsKKyAgICAgICAgICAgIGR1bXAoIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWJ1Z2dpbmcgbWV0aG9kIHRvIG91dHB1dCBhIHBhcnNlIHRyZWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdXQgdGhlIHN0cmVhbSB0byB3aGljaCB0byB3cml0ZSB0aGUgZGVidWdnaW5nIGluZm8KKyAgICAgICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRvIHdyaXRlIG91dCBiZWZvcmUgbGluZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRTdHJlYW0gb3V0LCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBkdW1wKG91dCwgcHJlZml4LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkdW1wKFByaW50U3RyZWFtIG91dCwgU3RyaW5nIHByZWZpeCwgYm9vbGVhbiB0ZXh0KSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbih0b1N0cmluZyhwcmVmaXgpCisgICAgICAgICAgICAgICAgKyAodGV4dCAmJiB0aGlzLnRleHQgIT0gbnVsbCA/ICIgWyIgKyB0aGlzLnRleHQgKyAiXSIgOiAiIikpOworICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIEpQUUxOb2RlIG4gPSAoSlBRTE5vZGUpIGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuLmR1bXAob3V0LCBwcmVmaXggKyAiICIsIHRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVibGljIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuCisgICAgICogQG5vamF2YWRvYworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VkSlBRTAorICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEpQUUxOb2RlIHJvb3Q7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcXVlcnk7CisgICAgICAgIAorICAgICAgICAvLyBjYWNoZSBvZiBjYW5kaWRhdGUgdHlwZSBkYXRhLiBUaGlzIGlzIHN0b3JlZCBoZXJlIGluIGNhc2UgdGhpcyAgCisgICAgICAgIC8vIHBhcnNlIHRyZWUgaXMgcmV1c2VkIGluIGEgY29udGV4dCB0aGF0IGRvZXMgbm90IGtub3cgd2hhdCB0aGUgCisgICAgICAgIC8vIGNhbmRpZGF0ZSB0eXBlIGlzIGFscmVhZHkuIAorICAgICAgICBwcml2YXRlIENsYXNzIF9jYW5kaWRhdGVUeXBlOworCisgICAgICAgIFBhcnNlZEpQUUwoU3RyaW5nIGpwcWwpIHsKKyAgICAgICAgICAgIHRoaXMoanBxbCwgcGFyc2UoanBxbCkpOworICAgICAgICB9CisKKyAgICAgICAgUGFyc2VkSlBRTChTdHJpbmcgcXVlcnksIEpQUUxOb2RlIHJvb3QpIHsKKyAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKUFFMTm9kZSBwYXJzZShTdHJpbmcganBxbCkgeworICAgICAgICAgICAgaWYgKGpwcWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBqcHFsID0gIiI7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChKUFFMTm9kZSkgbmV3IEpQUUwoanBxbCkucGFyc2VRdWVyeSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEVycm9yIHN1YmNsYXNzZXMsIHdoaWNoIHRoZQorICAgICAgICAgICAgICAgIC8vIHBhcnNlciBtYXkgc29tZXRpbWVzICh1bmZvcnR1bmF0ZWx5KSB0aHJvdworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYXJzZS1lcnJvciIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgZS50b1N0cmluZygpLCBqcHFsIH0pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgicGFyc2UtZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGUudG9TdHJpbmcoKSwganBxbCB9KSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHBvcHVsYXRlKEV4cHJlc3Npb25TdG9yZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgICAgICBRdWVyeUNvbnRleHQgY3R4ID0gcXVlcnkuZ2V0Q29udGV4dCgpOworCisgICAgICAgICAgICAvLyBpZiB0aGUgb3duaW5nIHF1ZXJ5J3MgY29udGV4dCBkb2VzIG5vdCBoYXZlCisgICAgICAgICAgICAvLyBhbnkgY2FuZGlkYXRlIGNsYXNzLCB0aGVuIHNldCBpdCBoZXJlCisgICAgICAgICAgICBpZiAoY3R4LmdldENhbmRpZGF0ZVR5cGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9jYW5kaWRhdGVUeXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9jYW5kaWRhdGVUeXBlID0gbmV3IEpQUUxFeHByZXNzaW9uQnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsIHF1ZXJ5LCB0aGlzKS5nZXRDYW5kaWRhdGVUeXBlKCk7CisgICAgICAgICAgICAgICAgY3R4LnNldENhbmRpZGF0ZVR5cGUoX2NhbmRpZGF0ZVR5cGUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogUHVibGljIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0Q2FuZGlkYXRlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfY2FuZGlkYXRlVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkKKwkJeworCQkJcmV0dXJuIHRoaXMucXVlcnk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWwvSlBRTFBhcnNlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvanBxbC9KUFFMUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyZDEyNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWwvSlBRTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5qcHFsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5FeHByZXNzaW9uU3RvcmVRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlF1ZXJ5RXhwcmVzc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLlZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogUGFyc2VyIGZvciBKUFFMIHF1ZXJpZXMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEpQUUxQYXJzZXIKKyAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25QYXJzZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZShKUFFMUGFyc2VyLmNsYXNzKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX0pQUUwgPSAiamF2YXgucGVyc2lzdGVuY2UuSlBRTCI7CisKKyAgICBwdWJsaWMgT2JqZWN0IHBhcnNlKFN0cmluZyBxbCwgRXhwcmVzc2lvblN0b3JlUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgaWYgKHF1ZXJ5LmdldENvbnRleHQoKS5nZXRQYXJhbWV0ZXJEZWNsYXJhdGlvbigpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgicGFyYW0tZGVjcy1pbnZhbGlkIikpOworCisgICAgICAgIHJldHVybiBuZXcgSlBRTEV4cHJlc3Npb25CdWlsZGVyLlBhcnNlZEpQUUwocWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlKE9iamVjdCBwYXJzZWQsIEV4cHJlc3Npb25TdG9yZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIEpQUUxFeHByZXNzaW9uQnVpbGRlci5QYXJzZWRKUFFMKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24ocGFyc2VkID09IG51bGwgPyBudWxsICsgIiIKKyAgICAgICAgICAgICAgICA6IHBhcnNlZC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAgICAgKChKUFFMRXhwcmVzc2lvbkJ1aWxkZXIuUGFyc2VkSlBRTCkgcGFyc2VkKS5wb3B1bGF0ZShxdWVyeSk7CisgICAgfQorCisgICAgcHVibGljIFF1ZXJ5RXhwcmVzc2lvbnMgZXZhbChPYmplY3QgcGFyc2VkLCBFeHByZXNzaW9uU3RvcmVRdWVyeSBxdWVyeSwKKyAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSwgQ2xhc3NNZXRhRGF0YSBjYW5kaWRhdGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSlBRTEV4cHJlc3Npb25CdWlsZGVyKGZhY3RvcnksIHF1ZXJ5LCBwYXJzZWQpLgorICAgICAgICAgICAgICAgIGdldFF1ZXJ5RXhwcmVzc2lvbnMoKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWpwcWwiLCBwYXJzZWQpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZVtdIGV2YWwoU3RyaW5nW10gdmFscywgRXhwcmVzc2lvblN0b3JlUXVlcnkgcXVlcnksCisgICAgICAgIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnksIENsYXNzTWV0YURhdGEgY2FuZGlkYXRlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgICAgIHJldHVybiBKUFFMUGFyc2VyLkxBTkdfSlBRTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL1BhcnNlRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL1BhcnNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiNTk5NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWwvUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmpwcWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogU2lnbmlmaWVzIHRoYXQgYSBsZXhpY2FsIGVycm9yIG9jY3VycmVkIHdoZW4gcGFyc2luZyB0aGUgSlBRTCBzdGF0ZW1lbnQuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0KKyAgICAgICAgTG9jYWxpemVyLmZvclBhY2thZ2UoUGFyc2VFeGNlcHRpb24uY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKKyAgICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZworICAgICAqIHRvIGZvcmNlIHRoZSAidG9TdHJpbmciIG1ldGhvZCBvZiBwYXJlbnQgY2xhc3MgIlRocm93YWJsZSIgdG8KKyAgICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKKyAgICAgKiBQYXJzZUV4Y2VwdGlvbjogPHJlc3VsdCBvZiBnZXRNZXNzYWdlPgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgIGludFtdW11leHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLCBTdHJpbmdbXXRva2VuSW1hZ2VWYWwpIHsKKyAgICAgICAgc3VwZXIoaW5pdE1lc3NhZ2UoY3VycmVudFRva2VuVmFsLAorICAgICAgICAgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbCwgdG9rZW5JbWFnZVZhbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKKyAgICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKKyAgICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcworICAgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKKyAgICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KKyAgICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKKyAgICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgorICAgICAqIGNyZWF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9ycy4gT3RoZXJ3aXNlLCBpdCB1c2VzCisgICAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCisgICAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICAgICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KKyAgICAgKiBmcm9tIHRoZSBwYXJzZXIpLCB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByaW50aW5nCisgICAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorICAgICAqIGdldHMgZGlzcGxheWVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UgaW5pdE1lc3NhZ2UoVG9rZW4gY3VycmVudFRva2VuLAorICAgICAgICBpbnRbXVtdZXhwZWN0ZWRUb2tlblNlcXVlbmNlcywgU3RyaW5nW110b2tlbkltYWdlKSB7CisgICAgICAgIFRyZWVTZXQgZXhwZWN0ZWQgPSBuZXcgVHJlZVNldCgpOworCisgICAgICAgIGludCBtYXhTaXplID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpCisgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQuYWRkKHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0pOworICAgICAgICB9CisKKyAgICAgICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7CisKKyAgICAgICAgU3RyaW5nIGN1cnRvayA9ICIiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgICAgICBjdXJ0b2sgKz0gIiAiOworICAgICAgICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgICAgICAgICBjdXJ0b2sgKz0gdG9rZW5JbWFnZVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VydG9rICs9IGVzY2FwZSh0b2suaW1hZ2UpOworICAgICAgICAgICAgdG9rID0gdG9rLm5leHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX2xvYy5nZXQoImJhZC1wYXJzZSIsIG5ldyBPYmplY3RbXXsgY3VydG9rLAorICAgICAgICAgICAgbmV3IEludGVnZXIoY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW4pLCBleHBlY3RlZCB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCisgICAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJIHN0cmluZyBsaXRlcmFsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBjaGFyIGNoOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvanBxbC9TaW1wbGVOb2RlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL1NpbXBsZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzViODNhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvanBxbC9TaW1wbGVOb2RlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmpwcWw7CisKKy8qKgorICogQmFzZSBub2RlIGltcGxlbWVudGF0aW9uIGZvciBhbGwgSlBRTCBub2Rlcy4gU3ViY2xhc3NlcyB3aWxsIGJlCisgKiBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGUgSmF2YUNDIHByb2Nlc3MuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZU5vZGUKKyAgICBleHRlbmRzIEpQUUxFeHByZXNzaW9uQnVpbGRlci5KUFFMTm9kZSB7CisKKyAgICBTaW1wbGVOb2RlKEpQUUwgcGFyc2VyLCBpbnQgaWQpIHsKKyAgICAgICAgc3VwZXIocGFyc2VyLCBpZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvanBxbC9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE4ODkxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvanBxbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxodG1sPgorPGJvZHk+Cis8cD48c3Ryb25nPkpQQSBRdWVyeSBMYW5ndWFnZSBTdXBwb3J0PC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBBbGxvdyBhbnkgc3BlYyBvciBzdG9yZSB0byB1c2UgSlBRTC4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY2OGRiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBIFJ1bnRpbWUgS2VybmVsPC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBjb21tb24gT3BlbkpQQSBydW50aW1lIGVudmlyb25tZW50IHRoYXQgY2FuIGJlCisgICAgYWRhcHRlZCBmb3IgdXNlIHdpdGggdmFyaW91cyBkYXRhIHN0b3JlIG1lY2hhbmlzbXMuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQWJzdHJhY3RDRk1ldGFEYXRhRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0Fic3RyYWN0Q0ZNZXRhRGF0YUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZhNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0Fic3RyYWN0Q0ZNZXRhRGF0YUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuQ2xhc3NBcmdQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNsYXNzcGF0aE1ldGFEYXRhSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkZpbGVNZXRhRGF0YUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5NZXRhRGF0YUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuTWV0YURhdGFJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuTWV0YURhdGFQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLk1ldGFEYXRhU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuUmVzb3VyY2VNZXRhRGF0YUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5VUkxNZXRhRGF0YUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5aaXBGaWxlTWV0YURhdGFJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuWmlwU3RyZWFtTWV0YURhdGFJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5HZW5lcmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnMgYnVpbHQgYXJvdW5kIFhNTCBtZXRhZGF0YSBmaWxlcworICogaW4gdGhlIGNvbW1vbiBmb21hdC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENGTWV0YURhdGFGYWN0b3J5CisgICAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBYnN0cmFjdE1ldGFEYXRhRmFjdG9yeS5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBmaWxlcyA9IG51bGw7CisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gdXJscyA9IG51bGw7CisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gcnNyY3MgPSBudWxsOworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGNwYXRoID0gbnVsbDsKKworICAgIHByaXZhdGUgU2V0IF90eXBlTmFtZXMgPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IG9mIHtAbGluayBGaWxlfXMgb2YgbWV0YWRhdGEgZmlsZXMgb3IgZGlyZWN0b3JpZXMgc3VwcGxpZWQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlcyhDb2xsZWN0aW9uIGZpbGVzKSB7CisgICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCB7QGxpbmsgRmlsZX1zIG9mIG1ldGFkYXRhIGZpbGVzIG9yCisgICAgICogZGlyZWN0b3JpZXMgc3VwcGxpZWQgYnkgdXNlciB2aWEgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzKFN0cmluZyBmaWxlcykgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShmaWxlcykpCisgICAgICAgICAgICB0aGlzLmZpbGVzID0gbnVsbDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJzID0gU3RyaW5ncy5zcGxpdChmaWxlcywgIjsiLCAwKTsKKyAgICAgICAgICAgIHRoaXMuZmlsZXMgPSBuZXcgSGFzaFNldCgoaW50KSAoc3Rycy5sZW5ndGggKiAxLjMzICsgMSkpOworCisgICAgICAgICAgICBGaWxlIGZpbGU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoc3Ryc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMuYWRkKGZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG9mIHtAbGluayBVUkx9cyBvZiBtZXRhZGF0YSBmaWxlcyBvciBqYXJzIHN1cHBsaWVkIGJ5IHVzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VVJMcyhDb2xsZWN0aW9uIHVybHMpIHsKKyAgICAgICAgdGhpcy51cmxzID0gdXJsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCB7QGxpbmsgVVJMfXMgb2YgbWV0YWRhdGEgZmlsZXMgb3IgamFycworICAgICAqIHN1cHBsaWVkIGJ5IHVzZXIgdmlhIGF1dG8tY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVUkxzKFN0cmluZyB1cmxzKSB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHVybHMpKQorICAgICAgICAgICAgdGhpcy51cmxzID0gbnVsbDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJzID0gU3RyaW5ncy5zcGxpdCh1cmxzLCAiOyIsIDApOworICAgICAgICAgICAgdGhpcy51cmxzID0gbmV3IEhhc2hTZXQoKGludCkgKHN0cnMubGVuZ3RoICogMS4zMyArIDEpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB0aGlzLnVybHMuYWRkKG5ldyBVUkwoc3Ryc1tpXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKG11ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgcmVzb3VyY2UgcGF0aHMgb2YgbWV0YWRhdGEgZmlsZXMgb3IgamFycyBzdXBwbGllZCBieSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhDb2xsZWN0aW9uIHJzcmNzKSB7CisgICAgICAgIHRoaXMucnNyY3MgPSByc3JjczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCByZXNvdXJjZSBwYXRocyBvZiBtZXRhZGF0YSBmaWxlcyBvciBqYXJzCisgICAgICogc3VwcGxpZWQgYnkgdXNlciB2aWEgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhTdHJpbmcgcnNyY3MpIHsKKyAgICAgICAgLy8ga2VlcCBsaXN0IG11dGFibGUgc28gc3ViY2xhc3NlcyBjYW4gYWRkIGltcGxpY2l0IGxvY2F0aW9ucworICAgICAgICB0aGlzLnJzcmNzID0gKFN0cmluZ1V0aWxzLmlzRW1wdHkocnNyY3MpKSA/IG51bGwKKyAgICAgICAgICAgIDogbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KFN0cmluZ3Muc3BsaXQocnNyY3MsICI7IiwgMCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgY2xhc3NwYXRoIGRpcmVjdG9yaWVzIG9yIGphcnMgdG8gc2NhbiBmb3IgbWV0YWRhdGEgc3VwcGxpZWQKKyAgICAgKiBieSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFNjYW4oQ29sbGVjdGlvbiBjcGF0aCkgeworICAgICAgICB0aGlzLmNwYXRoID0gY3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG9mIGNsYXNzcGF0aCBkaXJlY3RvcmllcyBvciBqYXJzIHRvIHNjYW4gZm9yIG1ldGFkYXRhIHN1cHBsaWVkCisgICAgICogYnkgdXNlciB2aWEgYXV0by1jb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFNjYW4oU3RyaW5nIGNwYXRoKSB7CisgICAgICAgIC8vIGtlZXAgbGlzdCBtdXRhYmxlIHNvIHN1YmNsYXNzZXMgY2FuIGFkZCBpbXBsaWNpdCBsb2NhdGlvbnMKKyAgICAgICAgdGhpcy5jcGF0aCA9IChTdHJpbmdVdGlscy5pc0VtcHR5KGNwYXRoKSkgPyBudWxsCisgICAgICAgICAgICA6IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChTdHJpbmdzLnNwbGl0KGNwYXRoLCAiOyIsIDApKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RvcmUoQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBRdWVyeU1ldGFEYXRhW10gcXVlcmllcywKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YVtdIHNlcXMsIGludCBtb2RlLCBNYXAgb3V0cHV0KSB7CisgICAgICAgIGlmIChtb2RlID09IE1PREVfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaXNNYXBwaW5nT25seUZhY3RvcnkoKSAmJiAobW9kZSAmIE1PREVfTUFQUElORykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICghc3RyaWN0ICYmIChtb2RlICYgTU9ERV9NRVRBKSAhPSAwKQorICAgICAgICAgICAgbW9kZSB8PSBNT0RFX01BUFBJTkc7CisgICAgICAgIENsYXNzIGNscyA9IChtZXRhcy5sZW5ndGggPT0gMCkgPyBudWxsIDogbWV0YXNbMF0uZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSByZXBvcy5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS5nZXRDbGFzc0xvYWRlcihjbHMsIG51bGwpOworICAgICAgICBNYXAgY2xzTmFtZXMgPSBuZXcgSGFzaE1hcCgoaW50KSAobWV0YXMubGVuZ3RoICogMS4zMyArIDEpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNsc05hbWVzLnB1dChtZXRhc1tpXS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpLCBtZXRhc1tpXSk7CisKKyAgICAgICAgLy8gYXNzaWduIGRlZmF1bHQgZmlsZXMgaWYgaW4gbWV0YWRhdGEgbW9kZSAoaW4gb3RoZXIgbW9kZXMgd2UgYXNzdW1lCisgICAgICAgIC8vIHRoZSBmaWxlcyB3b3VsZCBoYXZlIHRvIGJlIHJlYWQgYWxyZWFkeSB0byBjcmVhdGUgdGhlIG1ldGFkYXRhcykKKyAgICAgICAgU2V0IG1ldGFGaWxlcyA9IG51bGw7CisgICAgICAgIFNldCBxdWVyeUZpbGVzID0gbnVsbDsKKyAgICAgICAgaWYgKGlzTWFwcGluZ09ubHlGYWN0b3J5KCkgfHwgKG1vZGUgJiBNT0RFX01FVEEpICE9IDApCisgICAgICAgICAgICBtZXRhRmlsZXMgPSBhc3NpZ25EZWZhdWx0TWV0YURhdGFGaWxlcyhtZXRhcywgcXVlcmllcywgc2VxcywgbW9kZSwKKyAgICAgICAgICAgICAgICBjbHNOYW1lcyk7CisgICAgICAgIGlmICghaXNNYXBwaW5nT25seUZhY3RvcnkoKSAmJiAobW9kZSAmIE1PREVfUVVFUlkpICE9IDApCisgICAgICAgICAgICBxdWVyeUZpbGVzID0gYXNzaWduRGVmYXVsdFF1ZXJ5RmlsZXMocXVlcmllcywgY2xzTmFtZXMpOworCisgICAgICAgIC8vIHBhcnNlIGFsbCBmaWxlcyB0byBiZSBzdXJlIHdlIGRvbid0IGRlbGV0ZSBleGlzdGluZyBtZXRhZGF0YSB3aGVuCisgICAgICAgIC8vIHdyaXRpbmcgb3V0IG5ldyBtZXRhZGF0YSwgdGhlbiBzZXJpYWxpemUKKyAgICAgICAgU2VyaWFsaXplciBzZXI7CisgICAgICAgIFBhcnNlciBwYXJzZXI7CisgICAgICAgIGlmIChtb2RlICE9IE1PREVfUVVFUlkpIHsKKyAgICAgICAgICAgIGludCBzZXJtb2RlID0gKGlzTWFwcGluZ09ubHlGYWN0b3J5KCkpID8gbW9kZSA6IG1vZGUgfCBNT0RFX01FVEE7CisgICAgICAgICAgICBzZXIgPSBuZXdTZXJpYWxpemVyKCk7CisgICAgICAgICAgICBzZXIuc2V0TW9kZShzZXJtb2RlKTsKKyAgICAgICAgICAgIGlmIChtZXRhRmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ld1BhcnNlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgcGFyc2VyLnNldE1vZGUoc2VybW9kZSk7CisgICAgICAgICAgICAgICAgcGFyc2VyLnNldENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICAgICAgcGFyc2UocGFyc2VyLCBtZXRhRmlsZXMpOworCisgICAgICAgICAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHByID0gcGFyc2VyLmdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgICAgICAgICBwci5zZXRTb3VyY2VNb2RlKG1vZGUpOworICAgICAgICAgICAgICAgIGlmIChpc01hcHBpbmdPbmx5RmFjdG9yeSgpKQorICAgICAgICAgICAgICAgICAgICBwci5zZXRSZXNvbHZlKE1PREVfTk9ORSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwci5zZXRSZXNvbHZlKE1PREVfTUFQUElORywgZmFsc2UpOworICAgICAgICAgICAgICAgIHNlci5hZGRBbGwocHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHNlci5hZGRNZXRhRGF0YShtZXRhc1tpXSk7CisgICAgICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01BUFBJTkcpICE9IDApCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzZXIuYWRkU2VxdWVuY2VNZXRhRGF0YShzZXFzW2ldKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocXVlcmllc1tpXS5nZXRTb3VyY2VNb2RlKCkgIT0gTU9ERV9RVUVSWQorICAgICAgICAgICAgICAgICAgICAmJiAocXVlcmllc1tpXS5nZXRTb3VyY2VNb2RlKCkgJiBtb2RlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBzZXIuYWRkUXVlcnlNZXRhRGF0YShxdWVyaWVzW2ldKTsKKworICAgICAgICAgICAgaW50IGZsYWdzID0gc2VyLlBSRVRUWTsKKyAgICAgICAgICAgIGlmICgoc3RvcmUgJiBTVE9SRV9WRVJCT1NFKSAhPSAwKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IHNlci5WRVJCT1NFOworICAgICAgICAgICAgc2VyaWFsaXplKHNlciwgb3V0cHV0LCBmbGFncyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkbyB3ZSBoYXZlIGFueSBxdWVyaWVzIHN0b3JlZCBpbiBxdWVyeSBmaWxlcz8KKyAgICAgICAgaWYgKCFpc01hcHBpbmdPbmx5RmFjdG9yeSgpKSB7CisgICAgICAgICAgICBib29sZWFuIHFGaWxlcyA9IHF1ZXJ5RmlsZXMgIT0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAhcUZpbGVzICYmIGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHFGaWxlcyA9IHF1ZXJpZXNbaV0uZ2V0U291cmNlTW9kZSgpID09IE1PREVfUVVFUlk7CisgICAgICAgICAgICBpZiAocUZpbGVzKSB7CisgICAgICAgICAgICAgICAgc2VyID0gbmV3U2VyaWFsaXplcigpOworICAgICAgICAgICAgICAgIHNlci5zZXRNb2RlKE1PREVfUVVFUlkpOworICAgICAgICAgICAgICAgIGlmIChxdWVyeUZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyID0gbmV3UGFyc2VyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnNldE1vZGUoTU9ERV9RVUVSWSk7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRDbGFzc0xvYWRlcihsb2FkZXIpOworICAgICAgICAgICAgICAgICAgICBwYXJzZShwYXJzZXIsIHF1ZXJ5RmlsZXMpOworICAgICAgICAgICAgICAgICAgICBzZXIuYWRkQWxsKHBhcnNlci5nZXRSZXBvc2l0b3J5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyaWVzW2ldLmdldFNvdXJjZU1vZGUoKSA9PSBNT0RFX1FVRVJZKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VyLmFkZFF1ZXJ5TWV0YURhdGEocXVlcmllc1tpXSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplKHNlciwgb3V0cHV0LCBzZXIuUFJFVFRZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkcm9wKENsYXNzW10gY2xzLCBpbnQgbW9kZSwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmIChtb2RlID09IE1PREVfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaXNNYXBwaW5nT25seUZhY3RvcnkoKSAmJiAobW9kZSAmIE1PREVfTUFQUElORykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoZmFsc2UpOworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcHIgPSBwYXJzZXIuZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBwci5zZXRTb3VyY2VNb2RlKE1PREVfTUFQUElORywgZmFsc2UpOworICAgICAgICBwci5zZXRSZXNvbHZlKE1PREVfTUFQUElORywgZmFsc2UpOworCisgICAgICAgIC8vIHBhcnNlIG1ldGFkYXRhIGZvciBhbGwgdGhlc2UgY2xhc3NlcworICAgICAgICBpZiAoKG1vZGUgJiAoTU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HKSkgIT0gMCkgeworICAgICAgICAgICAgcGFyc2VyLnNldE1vZGUoKGlzTWFwcGluZ09ubHlGYWN0b3J5KCkpID8gbW9kZQorICAgICAgICAgICAgICAgIDogTU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HIHwgTU9ERV9RVUVSWSk7CisgICAgICAgICAgICBwYXJzZShwYXJzZXIsIGNscyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc01hcHBpbmdPbmx5RmFjdG9yeSgpICYmIChtb2RlICYgTU9ERV9RVUVSWSkgIT0gMCkgeworICAgICAgICAgICAgcGFyc2VyLnNldE1vZGUoTU9ERV9RVUVSWSk7CisgICAgICAgICAgICBwYXJzZShwYXJzZXIsIGNscyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgbWV0YWRhdGFzIGZyb20gcmVwb3NpdG9yeSBvciBjbGVhciB0aGVpciBtYXBwaW5ncworICAgICAgICBTZXQgZmlsZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTZXQgY2xzTmFtZXMgPSBudWxsOworICAgICAgICBpZiAoKG1vZGUgJiAoTU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HKSkgIT0gMCkgeworICAgICAgICAgICAgY2xzTmFtZXMgPSBuZXcgSGFzaFNldCgoaW50KSAoY2xzLmxlbmd0aCAqIDEuMzMgKyAxKSk7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjbHNbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY2xzTmFtZXMuYWRkKG51bGwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2xzTmFtZXMuYWRkKGNsc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG1ldGEgPSBwci5nZXRNZXRhRGF0YShjbHNbaV0sIGVudkxvYWRlciwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNvdXJjZUZpbGUobWV0YSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZChnZXRTb3VyY2VGaWxlKG1ldGEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NRVRBKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHIucmVtb3ZlTWV0YURhdGEobWV0YSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc01hcHBpbmdPbmx5RmFjdG9yeSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNYXBwaW5nKG1ldGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSBxdWVyeSBtb2RlIG1ldGFkYXRhcyBzbyB3ZSBjYW4gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5CisgICAgICAgIFF1ZXJ5TWV0YURhdGFbXSBxdWVyaWVzID0gcHIuZ2V0UXVlcnlNZXRhRGF0YXMoKTsKKyAgICAgICAgTGlzdCBxcXMgPSAoIWlzTWFwcGluZ09ubHlGYWN0b3J5KCkgJiYgKG1vZGUgJiBNT0RFX1FVRVJZKSA9PSAwKQorICAgICAgICAgICAgPyBudWxsIDogbmV3IEFycmF5TGlzdCgpOworICAgICAgICBib29sZWFuIHJlbTsKKyAgICAgICAgQ2xhc3MgZGVmOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaXNNYXBwaW5nT25seUZhY3RvcnkoKSAmJiBxdWVyaWVzW2ldLmdldFNvdXJjZUZpbGUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGVzLmFkZChxdWVyaWVzW2ldLmdldFNvdXJjZUZpbGUoKSk7CisgICAgICAgICAgICBkZWYgPSBxdWVyaWVzW2ldLmdldERlZmluaW5nVHlwZSgpOworICAgICAgICAgICAgcmVtID0gKHF1ZXJpZXNbaV0uZ2V0U291cmNlTW9kZSgpICYgbW9kZSkgIT0gMAorICAgICAgICAgICAgICAgICYmIGNsc05hbWVzLmNvbnRhaW5zKChkZWYgPT0gbnVsbCkgPyBudWxsIDogZGVmLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAocmVtIHx8ICghaXNNYXBwaW5nT25seUZhY3RvcnkoKQorICAgICAgICAgICAgICAgICYmIHF1ZXJpZXNbaV0uZ2V0U291cmNlTW9kZSgpID09IE1PREVfUVVFUlkpKQorICAgICAgICAgICAgICAgIHByLnJlbW92ZVF1ZXJ5TWV0YURhdGEocXVlcmllc1tpXSk7CisgICAgICAgICAgICBpZiAocXFzICE9IG51bGwgJiYgcXVlcmllc1tpXS5nZXRTb3VyY2VNb2RlKCkgPT0gTU9ERV9RVUVSWSAmJiAhcmVtKQorICAgICAgICAgICAgICAgIHFxcy5hZGQocXVlcmllc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBuZXcgbWV0YWRhdGEgd2l0aG91dCByZW1vdmVkIGluc3RhbmNlcworICAgICAgICBiYWNrdXBBbmREZWxldGUoZmlsZXMpOworICAgICAgICBTZXJpYWxpemVyIHNlcjsKKyAgICAgICAgaWYgKChtb2RlICYgKE1PREVfTUVUQSB8IE1PREVfTUFQUElORykpICE9IDApIHsKKyAgICAgICAgICAgIHNlciA9IG5ld1NlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIHNlci5zZXRNb2RlKChpc01hcHBpbmdPbmx5RmFjdG9yeSgpKSA/IG1vZGUgOiBtb2RlIHwgTU9ERV9NRVRBKTsKKyAgICAgICAgICAgIHNlci5hZGRBbGwocHIpOworICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gc2VyaWFsaXplciByYXRoZXIgdGhhbiBmcm9tIHJlcG9zaXRvcnkgYWJvdmUgc28gdGhhdAorICAgICAgICAgICAgLy8gY2FsbGluZyBjb2RlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBtZXRhZGF0YSBzdGlsbCBpbiByZXBvcworICAgICAgICAgICAgaWYgKGlzTWFwcGluZ09ubHlGYWN0b3J5KCkpCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNlci5yZW1vdmVNZXRhRGF0YShwci5nZXRNZXRhRGF0YShjbHNbaV0sIGVudkxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgICAgICAgICAgICBzZXJpYWxpemUoc2VyLCBudWxsLCBzZXIuUFJFVFRZKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocXFzICE9IG51bGwgJiYgIXFxcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNlciA9IG5ld1NlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIHNlci5zZXRNb2RlKE1PREVfUVVFUlkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxcXMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgc2VyLmFkZFF1ZXJ5TWV0YURhdGEoKFF1ZXJ5TWV0YURhdGEpIHFxcy5nZXQoaSkpOworICAgICAgICAgICAgc2VyaWFsaXplKHNlciwgbnVsbCwgc2VyLlBSRVRUWSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzaWduIGRlZmF1bHQgc291cmNlIGZpbGVzIHRvIHRoZSBnaXZlbiBtZXRhZGF0YXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xzTmFtZXMgbWFwIG9mIGNsYXNzIG5hbWVzIHRvIG1ldGFkYXRhcworICAgICAqIEByZXR1cm4gc2V0IG9mIGV4aXN0aW5nIGZpbGVzIHVzZWQgYnkgdGhlc2UgbWV0YWRhdGFzLCBvcgorICAgICAqIG51bGwgaWYgbm8gZXhpc3RpbmcgZmlsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBhc3NpZ25EZWZhdWx0TWV0YURhdGFGaWxlcyhDbGFzc01ldGFEYXRhW10gbWV0YXMsCisgICAgICAgIFF1ZXJ5TWV0YURhdGFbXSBxdWVyaWVzLCBTZXF1ZW5jZU1ldGFEYXRhW10gc2VxcywgaW50IG1vZGUsCisgICAgICAgIE1hcCBjbHNOYW1lcykgeworICAgICAgICBTZXQgZmlsZXMgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0U291cmNlRmlsZShtZXRhc1tpXSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXRTb3VyY2VGaWxlKG1ldGFzW2ldLCBkZWZhdWx0U291cmNlRmlsZShtZXRhc1tpXSkpOworICAgICAgICAgICAgaWYgKGdldFNvdXJjZUZpbGUobWV0YXNbaV0pLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZpbGVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBmaWxlcy5hZGQoZ2V0U291cmNlRmlsZShtZXRhc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHF1ZXJpZXNbaV0uZ2V0U291cmNlTW9kZSgpID09IE1PREVfUVVFUlkKKyAgICAgICAgICAgICAgICB8fCAobW9kZSAmIHF1ZXJpZXNbaV0uZ2V0U291cmNlTW9kZSgpKSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHF1ZXJpZXNbaV0uZ2V0U291cmNlRmlsZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgcXVlcmllc1tpXS5zZXRTb3VyY2UoZGVmYXVsdFNvdXJjZUZpbGUocXVlcmllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgY2xzTmFtZXMpLCBxdWVyaWVzW2ldLmdldFNvdXJjZVNjb3BlKCksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJpZXNbaV0uZ2V0U291cmNlVHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChxdWVyaWVzW2ldLmdldFNvdXJjZUZpbGUoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgZmlsZXMuYWRkKHF1ZXJpZXNbaV0uZ2V0U291cmNlRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01BUFBJTkcpICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vxcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChnZXRTb3VyY2VGaWxlKHNlcXNbaV0pID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNldFNvdXJjZUZpbGUoc2Vxc1tpXSwgZGVmYXVsdFNvdXJjZUZpbGUoc2Vxc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsc05hbWVzKSk7CisgICAgICAgICAgICAgICAgaWYgKGdldFNvdXJjZUZpbGUoc2Vxc1tpXSkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZChnZXRTb3VyY2VGaWxlKHNlcXNbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbiBkZWZhdWx0IHNvdXJjZSBmaWxlcyB0byB0aGUgZ2l2ZW4gcXVlcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHNOYW1lcyBtYXAgb2YgY2xhc3MgbmFtZXMgdG8gbWV0YWRhdGFzCisgICAgICogQHJldHVybiBzZXQgb2YgZXhpc3RpbmcgZmlsZXMgdXNlZCBieSB0aGVzZSBtZXRhZGF0YXMsIG9yCisgICAgICogbnVsbCBpZiBubyBleGlzdGluZyBmaWxlcworICAgICAqLworICAgIHByaXZhdGUgU2V0IGFzc2lnbkRlZmF1bHRRdWVyeUZpbGVzKFF1ZXJ5TWV0YURhdGFbXSBxdWVyaWVzLAorICAgICAgICBNYXAgY2xzTmFtZXMpIHsKKyAgICAgICAgU2V0IGZpbGVzID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocXVlcmllc1tpXS5nZXRTb3VyY2VNb2RlKCkgIT0gTU9ERV9RVUVSWSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChxdWVyaWVzW2ldLmdldFNvdXJjZUZpbGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHF1ZXJpZXNbaV0uc2V0U291cmNlKGRlZmF1bHRTb3VyY2VGaWxlKHF1ZXJpZXNbaV0sIGNsc05hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgcXVlcmllc1tpXS5nZXRTb3VyY2VTY29wZSgpLCBxdWVyaWVzW2ldLmdldFNvdXJjZVR5cGUoKSk7CisgICAgICAgICAgICBpZiAocXVlcmllc1tpXS5nZXRTb3VyY2VGaWxlKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgIGZpbGVzLmFkZChxdWVyaWVzW2ldLmdldFNvdXJjZUZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmFjdG9yeSBkZWFscyBvbmx5IHdpdGggbWFwcGluZyBkYXRhLCBhbmQgcmVsaWVzCisgICAgICogb24gYSBzZXBhcmF0ZSBmYWN0b3J5IGZvciBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcHBpbmdPbmx5RmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGFsbCBnaXZlbiBmaWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZShNZXRhRGF0YVBhcnNlciBwYXJzZXIsIENvbGxlY3Rpb24gZmlsZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZmlsZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKChGaWxlKSBpdHIubmV4dCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYWxsIGdpdmVuIGNsYXNzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlKE1ldGFEYXRhUGFyc2VyIHBhcnNlciwgQ2xhc3NbXSBjbHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShjbHNbaV0sIGlzUGFyc2VUb3BEb3duKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBhcnNlIGNsYXNzZXMgdG9wIGRvd24uIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGFyc2VUb3BEb3duKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgZ2l2ZW4gc2VyaWFsaWVyIHRvIHdyaXRlIGl0cyBtZXRhZGF0YXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKE1ldGFEYXRhU2VyaWFsaXplciBzZXIsIE1hcCBvdXRwdXQsIGludCBmbGFncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHNlci5zZXJpYWxpemUoZmxhZ3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNlci5zZXJpYWxpemUob3V0cHV0LCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJhY2t1cCBhbmQgZGVsZXRlIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYmFja3VwQW5kRGVsZXRlKENvbGxlY3Rpb24gZmlsZXMpIHsKKyAgICAgICAgRmlsZSBmaWxlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGZpbGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBmaWxlID0gKEZpbGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoRmlsZXMuYmFja3VwKGZpbGUsIGZhbHNlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBtYXBwaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIG1ldGFkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyTWFwcGluZyhDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgbWV0YS5zZXRTb3VyY2VNb2RlKE1PREVfTUFQUElORywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBvZiB0aGUgZ2l2ZW4gbWV0YWRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRmlsZShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIG1ldGEuZ2V0U291cmNlRmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBvZiB0aGUgZ2l2ZW4gbWV0YWRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlRmlsZShDbGFzc01ldGFEYXRhIG1ldGEsIEZpbGUgc291cmNlRmlsZSkgeworICAgICAgICBtZXRhLnNldFNvdXJjZShzb3VyY2VGaWxlLCBtZXRhLmdldFNvdXJjZVR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIG9mIHRoZSBnaXZlbiBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VGaWxlKFNlcXVlbmNlTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gbWV0YS5nZXRTb3VyY2VGaWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIG9mIHRoZSBnaXZlbiBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VGaWxlKFNlcXVlbmNlTWV0YURhdGEgbWV0YSwgRmlsZSBzb3VyY2VGaWxlKSB7CisgICAgICAgIG1ldGEuc2V0U291cmNlKHNvdXJjZUZpbGUsIG1ldGEuZ2V0U291cmNlU2NvcGUoKSwKKyAgICAgICAgICAgIG1ldGEuZ2V0U291cmNlVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgZmlsZSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGRlZmF1bHRTb3VyY2VGaWxlKENsYXNzTWV0YURhdGEgbWV0YSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZWZhdWx0IGZpbGUgZm9yIHRoZSBnaXZlbiBxdWVyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBkZWZhdWx0U291cmNlRmlsZShRdWVyeU1ldGFEYXRhIHF1ZXJ5LAorICAgICAgICBNYXAgY2xzTmFtZXMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgZGVmYXVsdCBmaWxlIGZvciB0aGUgZ2l2ZW4gc2VxdWVuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZGVmYXVsdFNvdXJjZUZpbGUoU2VxdWVuY2VNZXRhRGF0YSBzZXEsCisgICAgICAgIE1hcCBjbHNOYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWV0YWRhdGEgcGFyc2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRpbmcgaWYgdHJ1ZSwgdGhpcyB3aWxsIGJlIHRoZSBjYWNoZWQgcGFyc2VyIHVzZWQgZm9yCisgICAgICogbG9hZGluZyBtZXRhZGF0YQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQYXJzZXIgbmV3UGFyc2VyKGJvb2xlYW4gbG9hZGluZyk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWV0YWRhdGEgc2VyaWFsaXplci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2VyaWFsaXplciBuZXdTZXJpYWxpemVyKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIHRoYXQgZGVmaW5lcyB0aGUgZ2l2ZW4gcXVlcnksIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHNOYW1lcyBtYXAgb2YgY2xhc3MgbmFtZXMgdG8gbWV0YWRhdGFzCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTWV0YURhdGEgZ2V0RGVmaW5pbmdNZXRhRGF0YShRdWVyeU1ldGFEYXRhIHF1ZXJ5LAorICAgICAgICBNYXAgY2xzTmFtZXMpIHsKKyAgICAgICAgQ2xhc3MgZGVmID0gcXVlcnkuZ2V0RGVmaW5pbmdUeXBlKCk7CisgICAgICAgIGlmIChkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NNZXRhRGF0YSkgY2xzTmFtZXMuZ2V0KGRlZi5nZXROYW1lKCkpOworCisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgU3RyaW5nIHBrZzsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjbHNOYW1lcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBwa2cgPSBTdHJpbmdzLmdldFBhY2thZ2VOYW1lKChTdHJpbmcpIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChwa2cubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzTWV0YURhdGEpIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFNldCBnZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGJvb2xlYW4gZGV2cGF0aCwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIC8vIHNvbWUgY29uZmlndXJlZCBsb2NhdGlvbnMgbWlnaHQgYmUgaW1wbGljaXQgaW4gc3BlYywgc28gcmV0dXJuCisgICAgICAgIC8vIG51bGwgaWYgd2UgZG9uJ3QgZmluZCBhbnkgY2xhc3NlcywgcmF0aGVyIHRoYW4gaWYgd2UgZG9uJ3QgaGF2ZQorICAgICAgICAvLyBhbnkgbG9jYXRpb25zCisgICAgICAgIGlmIChfdHlwZU5hbWVzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKF90eXBlTmFtZXMuaXNFbXB0eSgpKSA/IG51bGwgOiBfdHlwZU5hbWVzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSByZXBvcy5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICBlbnZMb2FkZXIpOworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICBTZXQgbmFtZXMgPSBwYXJzZVBlcnNpc3RlbnRUeXBlTmFtZXMobG9hZGVyKTsKKyAgICAgICAgICAgIGlmIChuYW1lcy5pc0VtcHR5KCkgJiYgZGV2cGF0aCkKKyAgICAgICAgICAgICAgICBzY2FuKG5ldyBDbGFzc3BhdGhNZXRhRGF0YUl0ZXJhdG9yKG51bGwsIG5ld01ldGFEYXRhRmlsdGVyKCkpLAorICAgICAgICAgICAgICAgICAgICBuZXdDbGFzc0FyZ1BhcnNlcigpLCBuYW1lcywgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgZWxzZSAvLyB3ZSBkb24ndCBjYWNoZSBhIGZ1bGwgZGV2IGNwIHNjYW4KKyAgICAgICAgICAgICAgICBfdHlwZU5hbWVzID0gbmFtZXM7CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoImZvdW5kLXBjcyIsIFN0cmluZy52YWx1ZU9mKG5hbWVzLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpKSk7CisgICAgICAgICAgICByZXR1cm4gKG5hbWVzLmlzRW1wdHkoKSkgPyBudWxsIDogbmFtZXM7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHBlcnNpc3RlbnQgdHlwZSBuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBwYXJzZVBlcnNpc3RlbnRUeXBlTmFtZXMoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc0FyZ1BhcnNlciBjcGFyc2VyID0gbmV3Q2xhc3NBcmdQYXJzZXIoKTsKKyAgICAgICAgU3RyaW5nW10gY2xzczsKKyAgICAgICAgU2V0IG5hbWVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgZmlsZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZmlsZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gKEZpbGUpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInNjYW5uaW5nLWRpcmVjdG9yeSIsIGZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbihuZXcgRmlsZU1ldGFEYXRhSXRlcmF0b3IoZmlsZSwgbmV3TWV0YURhdGFGaWx0ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBjcGFyc2VyLCBuYW1lcywgdHJ1ZSwgZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgic2Nhbm5pbmctamFyIiwgZmlsZSkpOworICAgICAgICAgICAgICAgICAgICBzY2FuKG5ldyBaaXBGaWxlTWV0YURhdGFJdGVyYXRvcihuZXcgWmlwRmlsZShmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGFEYXRhRmlsdGVyKCkpLCBjcGFyc2VyLCBuYW1lcywgdHJ1ZSwgZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzY2FubmluZy1maWxlIiwgZmlsZSkpOworICAgICAgICAgICAgICAgICAgICBjbHNzID0gY3BhcnNlci5wYXJzZVR5cGVOYW1lcyhuZXcgRmlsZU1ldGFEYXRhSXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgic2Nhbi1mb3VuZC1uYW1lcyIsIGNsc3MsIGZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2xzcykpOworICAgICAgICAgICAgICAgICAgICBtYXBQZXJzaXN0ZW50VHlwZU5hbWVzKGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBVUkwgdXJsOworICAgICAgICBpZiAodXJscyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHVybHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICB1cmwgPSAoVVJMKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMuY29udGFpbnMoZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgic2Nhbm5pbmctZGlyZWN0b3J5IiwgZmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbihuZXcgRmlsZU1ldGFEYXRhSXRlcmF0b3IoZmlsZSwgbmV3TWV0YURhdGFGaWx0ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwYXJzZXIsIG5hbWVzLCB0cnVlLCBmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgiamFyIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpCisgICAgICAgICAgICAgICAgICAgICYmIHVybC5nZXRQYXRoKCkuZW5kc1dpdGgoIiEvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzY2FubmluZy1qYXItdXJsIiwgdXJsKSk7CisgICAgICAgICAgICAgICAgICAgIHNjYW4obmV3IFppcEZpbGVNZXRhRGF0YUl0ZXJhdG9yKHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGFEYXRhRmlsdGVyKCkpLCBjcGFyc2VyLCBuYW1lcywgdHJ1ZSwgdXJsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5nZXRQYXRoKCkuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInNjYW5uaW5nLWphci1hdC11cmwiLCB1cmwpKTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbihuZXcgWmlwU3RyZWFtTWV0YURhdGFJdGVyYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBaaXBJbnB1dFN0cmVhbSh1cmwub3BlblN0cmVhbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGFEYXRhRmlsdGVyKCkpLCBjcGFyc2VyLCBuYW1lcywgdHJ1ZSwgdXJsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInNjYW5uaW5nLXVybCIsIHVybCkpOworICAgICAgICAgICAgICAgICAgICBjbHNzID0gY3BhcnNlci5wYXJzZVR5cGVOYW1lcyhuZXcgVVJMTWV0YURhdGFJdGVyYXRvcih1cmwpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzY2FuLWZvdW5kLW5hbWVzIiwgY2xzcywgdXJsKSk7CisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgbWFwUGVyc2lzdGVudFR5cGVOYW1lcyh1cmwsIGNsc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocnNyY3MgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHJzcmM7CisgICAgICAgICAgICBNZXRhRGF0YUl0ZXJhdG9yIG1pdHI7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHJzcmNzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgcnNyYyA9IChTdHJpbmcpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJzcmMuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgICAgICB1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UocnNyYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgic2Nhbm5pbmctamFyLXN0cmVhbS11cmwiLCB1cmwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4obmV3IFppcFN0cmVhbU1ldGFEYXRhSXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IFppcElucHV0U3RyZWFtKHVybC5vcGVuU3RyZWFtKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRhRGF0YUZpbHRlcigpKSwgY3BhcnNlciwgbmFtZXMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInNjYW5uaW5nLXJlc291cmNlIiwgcnNyYykpOworICAgICAgICAgICAgICAgICAgICBtaXRyID0gbmV3IFJlc291cmNlTWV0YURhdGFJdGVyYXRvcihyc3JjLCBsb2FkZXIpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IChVUkwpIG1pdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xzcyA9IGNwYXJzZXIucGFyc2VUeXBlTmFtZXMobmV3IFVSTE1ldGFEYXRhSXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXJsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJzY2FuLWZvdW5kLW5hbWVzIiwgY2xzcywgcnNyYykpOworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2xzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgbWFwUGVyc2lzdGVudFR5cGVOYW1lcyh1cmwsIGNsc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1pdHIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGRpcnMgPSAoU3RyaW5nW10pIGNwYXRoLnRvQXJyYXkobmV3IFN0cmluZ1tjcGF0aC5zaXplKCldKTsKKyAgICAgICAgICAgIHNjYW4obmV3IENsYXNzcGF0aE1ldGFEYXRhSXRlcmF0b3IoZGlycywgbmV3TWV0YURhdGFGaWx0ZXIoKSksCisgICAgICAgICAgICAgICAgY3BhcnNlciwgbmFtZXMsIHRydWUsIGRpcnMpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQorICAgICAgICAgICAgbmFtZXMuYWRkQWxsKHR5cGVzKTsKKworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInBhcnNlLWZvdW5kLW5hbWVzIiwgbmFtZXMpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FuIGZvciBwZXJzaXN0ZW50IHR5cGUgbmFtZXMgdXNpbmcgdGhlIGdpdmVuIG1ldGFkYXRhIGl0ZXJhdG9yLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzY2FuKE1ldGFEYXRhSXRlcmF0b3IgbWl0ciwgQ2xhc3NBcmdQYXJzZXIgY3BhcnNlciwgU2V0IG5hbWVzLAorICAgICAgICBib29sZWFuIG1hcE5hbWVzLCBPYmplY3QgZGVidWdDb250ZXh0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNYXAgbWFwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwID0gY3BhcnNlci5tYXBUeXBlTmFtZXMobWl0cik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtaXRyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChtYXBOYW1lcykKKyAgICAgICAgICAgICAgICBtYXBQZXJzaXN0ZW50VHlwZU5hbWVzKGVudHJ5LmdldEtleSgpLCAoU3RyaW5nW10pCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgTGlzdCBuZXdOYW1lcyA9IEFycmF5cy5hc0xpc3QoKFN0cmluZ1tdKSBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInNjYW4tZm91bmQtbmFtZXMiLCBuZXdOYW1lcywgZGVidWdDb250ZXh0KSk7CisgICAgICAgICAgICBuYW1lcy5hZGRBbGwobmV3TmFtZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIG1hcCBtZXRhZGF0YSByZXNvdXJjZXMgdG8gdGhlIHBlcnNpc3RlbnQKKyAgICAgKiB0eXBlcyBjb250YWluZWQgd2l0aGluIHRoZW0uIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbgorICAgICAqIHtAbGluayAjZ2V0UGVyc2lzdGVudFR5cGVOYW1lc30gaXMgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBtYXBQZXJzaXN0ZW50VHlwZU5hbWVzKE9iamVjdCByc3JjLCBTdHJpbmdbXSBuYW1lcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1ldGFkYXRhIGZpbHRlciB0aGF0IGlkZW50aWZpZXMgbWV0YWRhdGEgcmVzb3VyY2VzIHdoZW4KKyAgICAgKiBwZXJmb3JtaW5nIGphciBhbmQgY2xhc3NwYXRoIHNjYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUZpbHRlciBuZXdNZXRhRGF0YUZpbHRlcigpOworCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHN1cGVyLmNsZWFyKCk7CisgICAgICAgIF90eXBlTmFtZXMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIHBhcnNlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUGFyc2VyCisgICAgICAgIGV4dGVuZHMgTWV0YURhdGFQYXJzZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IGZvciB0aGlzIHBhcnNlci4gSWYgbm9uZSBoYXMgYmVlbiBzZXQsCisgICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgcmVwb3NpdG9yeSBhbmQgc2V0cyBpdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGFyc2UgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIGV4cGVjdGVkIGRvY3VtZW50IHR5cGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBzZXJpYWxpemVyIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTZXJpYWxpemVyCisgICAgICAgIGV4dGVuZHMgTWV0YURhdGFTZXJpYWxpemVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcmlhbGl6YXRpb24gbW9kZSBhY2NvcmRpbmcgdG8gdGhlIGV4cGVjdGVkIGRvY3VtZW50IHR5cGUuIFRoZQorICAgICAgICAgKiBtb2RlIGNvbnN0YW50cyBhY3QgYXMgYml0IGZsYWdzLCBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjb21iaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IG1vZGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBjbGFzcyBtZXRhIGRhdGEgdG8gdGhlIHNldCB0byBiZSBzZXJpYWxpemVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGEgY2xhc3MgbWV0YSBkYXRhIGZyb20gdGhlIHNldCB0byBiZSBzZXJpYWxpemVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgc2VxdWVuY2UgbWV0YSBkYXRhIHRvIHRoZSBzZXQgdG8gYmUgc2VyaWFsaXplZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFNlcXVlbmNlTWV0YURhdGEoU2VxdWVuY2VNZXRhRGF0YSBtZXRhKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgcXVlcnkgbWV0YSBkYXRhIHRvIHRoZSBzZXQgdG8gYmUgc2VyaWFsaXplZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFF1ZXJ5TWV0YURhdGEoUXVlcnlNZXRhRGF0YSBtZXRhKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGFsbCBjb21wb25lbnRzIGluIHRoZSBnaXZlbiByZXBvc2l0b3J5IHRvIHRoZSBzZXQgdG8gYmUKKyAgICAgICAgICogc2VyaWFsaXplZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbCAoTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQWJzdHJhY3RNZXRhRGF0YURlZmF1bHRzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQWJzdHJhY3RNZXRhRGF0YURlZmF1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZGQzYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9BYnN0cmFjdE1ldGFEYXRhRGVmYXVsdHMuamF2YQpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlJlZmxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIEFic3RyYWN0IG1ldGFkYXRhIGRlZmF1bHRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhRGVmYXVsdHMKKyAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRGVmYXVsdHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQWJzdHJhY3RNZXRhRGF0YURlZmF1bHRzLmNsYXNzKTsKKworICAgIHByaXZhdGUgaW50IF9hY2Nlc3MgPSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRDsKKyAgICBwcml2YXRlIGludCBfaWRlbnRpdHkgPSBDbGFzc01ldGFEYXRhLklEX1VOS05PV047CisgICAgcHJpdmF0ZSBib29sZWFuIF9pZ25vcmUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaW50ZXJmYWNlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3BjUmVnaXN0cnkgPSB0cnVlOworICAgIHByaXZhdGUgaW50IF9jYWxsYmFjayA9IENBTExCQUNLX1JFVEhST1c7CisgICAgcHJpdmF0ZSBib29sZWFuIF91bndyYXBwZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYXR0ZW1wdCB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gcmVnaXN0ZXJlZCBjbGFzc2VzCisgICAgICogdG8gcG9wdWxhdGUgbWV0YWRhdGEgZGVmYXVsdHMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlUENSZWdpc3RyeSgpIHsKKyAgICAgICAgcmV0dXJuIF9wY1JlZ2lzdHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYXR0ZW1wdCB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gcmVnaXN0ZXJlZCBjbGFzc2VzCisgICAgICogdG8gcG9wdWxhdGUgbWV0YWRhdGEgZGVmYXVsdHMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlUENSZWdpc3RyeShib29sZWFuIHBjUmVnaXN0cnkpIHsKKyAgICAgICAgX3BjUmVnaXN0cnkgPSBwY1JlZ2lzdHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGFjY2VzcyB0eXBlIGZvciBiYXNlIGNsYXNzZXMgd2l0aCBBQ0NFU1NfVU5LTk9XTi4KKyAgICAgKiBBQ0NFU1NfRklFTEQgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRBY2Nlc3NUeXBlKCkgeworICAgICAgICByZXR1cm4gX2FjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBhY2Nlc3MgdHlwZSBmb3IgYmFzZSBjbGFzc2VzIHdpdGggQUNDRVNTX1VOS05PV04uCisgICAgICogQUNDRVNTX0ZJRUxEIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjY2Vzc1R5cGUoaW50IGFjY2VzcykgeworICAgICAgICBfYWNjZXNzID0gYWNjZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGlkZW50aXR5IHR5cGUgZm9yIHVubWFwcGVkIGNsYXNzZXMgd2l0aG91dCBwcmltYXJ5IAorICAgICAqIGtleSBmaWVsZHMuIElEX1VOS05PV04gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRJZGVudGl0eVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfaWRlbnRpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaWRlbnRpdHkgdHlwZSBmb3IgdW5tYXBwZWQgY2xhc3NlcyB3aXRob3V0IHByaW1hcnkgCisgICAgICoga2V5IGZpZWxkcy4gSURfVU5LTk9XTiBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRJZGVudGl0eVR5cGUoaW50IGlkZW50aXR5KSB7CisgICAgICAgIF9pZGVudGl0eSA9IGlkZW50aXR5OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q2FsbGJhY2tNb2RlKCkgeworICAgICAgICByZXR1cm4gX2NhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrTW9kZShpbnQgbW9kZSkgeworICAgICAgICBfY2FsbGJhY2sgPSBtb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrTW9kZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAob24pCisgICAgICAgICAgICBfY2FsbGJhY2sgfD0gbW9kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2NhbGxiYWNrICY9IH5tb2RlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldENhbGxiYWNrc0JlZm9yZUxpc3RlbmVycyhpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWNsYXJlZEludGVyZmFjZVBlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiBfaW50ZXJmYWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmVkSW50ZXJmYWNlUGVyc2lzdGVudChib29sZWFuIHBlcnMpIHsKKyAgICAgICAgX2ludGVyZmFjZSA9IHBlcnM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhU3RvcmVPYmplY3RJZEZpZWxkVW53cmFwcGVkKCkgeworICAgICAgICByZXR1cm4gX3Vud3JhcHBlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhU3RvcmVPYmplY3RJZEZpZWxkVW53cmFwcGVkKGJvb2xlYW4gdW53cmFwcGVkKSB7CisgICAgICAgIF91bndyYXBwZWQgPSB1bndyYXBwZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlTm9uUGVyc2lzdGVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZ25vcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlTm9uUGVyc2lzdGVudChib29sZWFuIGlnbm9yZSkgeworICAgICAgICBfaWdub3JlID0gaWdub3JlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlKENsYXNzTWV0YURhdGEgbWV0YSwgaW50IGFjY2VzcykgeworICAgICAgICBpZiAobWV0YS5nZXREZXNjcmliZWRUeXBlKCkgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChhY2Nlc3MgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfVU5LTk9XTikgeworICAgICAgICAgICAgLy8gd2UgZG8gbm90IGFsbG93IHVzaW5nIGJvdGggZmllbGQgYW5kIG1ldGhvZCBhY2Nlc3MgYXQKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIHRpbWUKKyAgICAgICAgICAgIGFjY2VzcyA9IGdldEFjY2Vzc1R5cGUobWV0YSk7CisgICAgICAgICAgICBpZiAoKGFjY2VzcyAmIENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgKGFjY2VzcyAmIENsYXNzTWV0YURhdGEuQUNDRVNTX1BST1BFUlRZKSAhPSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJhY2Nlc3MtZmllbGQtYW5kLXByb3AiLAorICAgICAgICAgICAgICAgICAgICBtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICBtZXRhLnNldEFjY2Vzc1R5cGUoYWNjZXNzKTsKKworICAgICAgICBMb2cgbG9nID0gbWV0YS5nZXRSZXBvc2l0b3J5KCkuZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgiZ2VuLW1ldGEiLCBtZXRhKSk7CisgICAgICAgIGlmICghX3BjUmVnaXN0cnkgfHwgIXBvcHVsYXRlRnJvbVBDUmVnaXN0cnkobWV0YSkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoIm1ldGEtcmVmbGVjdCIpKTsKKyAgICAgICAgICAgIHBvcHVsYXRlRnJvbVJlZmxlY3Rpb24obWV0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSBpbml0aWFsIGZpZWxkIGRhdGEuIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgdGhlIGdpdmVuIG1ldGFkYXRhIHVzaW5nIHRoZSB7QGxpbmsgUENSZWdpc3RyeX0uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRlRnJvbVBDUmVnaXN0cnkoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIENsYXNzIGNscyA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gZmllbGROYW1lcyA9IFBDUmVnaXN0cnkuZ2V0RmllbGROYW1lcyhjbHMpOworICAgICAgICAgICAgQ2xhc3NbXSBmaWVsZFR5cGVzID0gUENSZWdpc3RyeS5nZXRGaWVsZFR5cGVzKGNscyk7CisgICAgICAgICAgICBNZW1iZXIgbWVtYmVyOworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkTmFtZXMubGVuZ3RoOyBpICsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKQorICAgICAgICAgICAgICAgICAgICBtZW1iZXIgPSBjbHMuZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1lbWJlciA9IFJlZmxlY3Rpb24uZmluZEdldHRlcihtZXRhLmdldERlc2NyaWJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZXNbaV0sIHRydWUpOworICAgICAgICAgICAgICAgIGZtZCA9IG1ldGEuYWRkRGVjbGFyZWRGaWVsZChmaWVsZE5hbWVzW2ldLCBmaWVsZFR5cGVzW2ldKTsKKyAgICAgICAgICAgICAgICBmbWQuYmFja2luZ01lbWJlcihtZW1iZXIpOworICAgICAgICAgICAgICAgIHBvcHVsYXRlKGZtZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgLy8gdGhyb3duIGJ5IHJlZ2lzdHJ5IHdoZW4gbm8gbWV0YWRhdGEgYXZhaWxhYmxlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgIHRocm93IGtlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZ2l2ZW4gbWV0YWRhdGEgdXNpbmcgcmVmbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVGcm9tUmVmbGVjdGlvbihDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgTWVtYmVyW10gbWVtYmVyczsKKyAgICAgICAgYm9vbGVhbiBpZmFjZSA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmlzSW50ZXJmYWNlKCk7CisgICAgICAgIGlmIChtZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCAmJiAhaWZhY2UpCisgICAgICAgICAgICBtZW1iZXJzID0gbWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWVtYmVycyA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldERlY2xhcmVkTWV0aG9kcygpOworCisgICAgICAgIGludCBtb2RzOworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgYm9vbGVhbiBkZWY7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1vZHMgPSBtZW1iZXJzW2ldLmdldE1vZGlmaWVycygpOworICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZHMpIHx8IE1vZGlmaWVyLmlzRmluYWwobW9kcykpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIG5hbWUgPSBnZXRGaWVsZE5hbWUobWVtYmVyc1tpXSk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IGlzUmVzZXJ2ZWRGaWVsZE5hbWUobmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGRlZiA9IGlzRGVmYXVsdFBlcnNpc3RlbnQobWV0YSwgbWVtYmVyc1tpXSwgbmFtZSk7CisgICAgICAgICAgICBpZiAoIWRlZiAmJiBfaWdub3JlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBwYXNzZWQgdGhlIHRlc3RzOyBwZXJzaXN0ZW50IHR5cGUgLS0gd2UgY29uc3RydWN0IHdpdGgKKyAgICAgICAgICAgIC8vIE9iamVjdC5jbGFzcyBiZWNhdXNlIHNldHRpbmcgYmFja2luZyBtZW1iZXIgd2lsbCBzZXQgcHJvcGVyCisgICAgICAgICAgICAvLyB0eXBlIGFueXdheQorICAgICAgICAgICAgZm1kID0gbWV0YS5hZGREZWNsYXJlZEZpZWxkKG5hbWUsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBmbWQuYmFja2luZ01lbWJlcihtZW1iZXJzW2ldKTsKKyAgICAgICAgICAgIGlmICghZGVmKSB7CisgICAgICAgICAgICAgICAgZm1kLnNldEV4cGxpY2l0KHRydWUpOworICAgICAgICAgICAgICAgIGZtZC5zZXRNYW5hZ2VtZW50KEZpZWxkTWV0YURhdGEuTUFOQUdFX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9wdWxhdGUoZm1kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWNjZXNzIHR5cGUgb2YgdGhlIGdpdmVuIG1ldGFkYXRhLiBNYXkgYmUgYSBiaXR3aXNlCisgICAgICogY29tYmluYXRpb24gb2YgZmllbGQgYW5kIHByb3BlcnR5IGFjY2VzcyBjb25zdGFudHMsIG9yIEFDQ0VTU19VTktOT1dOLgorICAgICAqIFJldHVybnMgQUNDRVNTX0ZJRUxEIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRBY2Nlc3NUeXBlKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWVsZCBuYW1lIGZvciB0aGUgZ2l2ZW4gbWVtYmVyLiBUaGlzIHdpbGwgb25seSBiZSBpbnZva2VkCisgICAgICogb24gbWVtYmVycyBvZiB0aGUgcmlnaHQgdHlwZSAoZmllbGQgdnMuIG1ldGhvZCkuIFJldHVybiBudWxsIGlmIHRoZQorICAgICAqIG1lbWJlciBjYW5ub3QgYmUgbWFuYWdlZC4gRGVmYXVsdCBiZWhhdmlvcjogRm9yIGZpZWxkcywgcmV0dXJucyB0aGUKKyAgICAgKiBmaWVsZCBuYW1lLiBGb3IgZ2V0dGVyIG1ldGhvZHMsIHJldHVybnMgdGhlIG1pbnVzICJnZXQiIG9yICJpcyIgd2l0aAorICAgICAqIHRoZSBuZXh0IGxldHRlciBsb3dlci1jYXNlZC4gRm9yIG90aGVyIG1ldGhvZHMsIHJldHVybnMgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkTmFtZShNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBGaWVsZCkKKyAgICAgICAgICAgIHJldHVybiBtZW1iZXIuZ2V0TmFtZSgpOworCisgICAgICAgIE1ldGhvZCBtZXRoID0gKE1ldGhvZCkgbWVtYmVyOworICAgICAgICBpZiAobWV0aC5nZXRSZXR1cm5UeXBlKCkgPT0gdm9pZC5jbGFzcworICAgICAgICAgICAgfHwgbWV0aC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRoLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikgJiYgbmFtZS5sZW5ndGgoKSA+IDMpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMyk7CisgICAgICAgIGVsc2UgaWYgKChtZXRoLmdldFJldHVyblR5cGUoKSA9PSBib29sZWFuLmNsYXNzCisgICAgICAgICAgICB8fCBtZXRoLmdldFJldHVyblR5cGUoKSA9PSBCb29sZWFuLmNsYXNzKQorICAgICAgICAgICAgJiYgbmFtZS5zdGFydHNXaXRoKCJpcyIpICYmIG5hbWUubGVuZ3RoKCkgPiAyKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lLmNoYXJBdCgwKSkgKyBuYW1lLnN1YnN0cmluZygxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZpZWxkIG5hbWUgaXMgcmVzZXJ2ZWQgZm9yIHVubWFuYWdlZCBmaWVsZHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNlcnZlZEZpZWxkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvLyBuYW1lcyB1c2VkIGJ5IGVuaGFuY2VycworICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCJvcGVuanBhIikgfHwgbmFtZS5zdGFydHNXaXRoKCJqZG8iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWVtYmVyIGlzIHBlcnNpc3RlbnQgYnkgZGVmYXVsdC4gVGhpcyB3aWxsCisgICAgICogb25seSBiZSBpbnZva2VkIG9uIG1lbWJlcnMgb2YgdGhlIHJpZ2h0IHR5cGUgKGZpZWxkIHZzLiBtZXRob2QpLgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgbWVtYmVyIGlzIHN0YXRpYyBvciBmaW5hbCBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpZWxkIG5hbWUgZnJvbSB7QGxpbmsgI2dldEZpZWxkTmFtZX0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0RlZmF1bHRQZXJzaXN0ZW50KENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgTWVtYmVyIG1lbWJlciwgU3RyaW5nIG5hbWUpOworCisgICAgcHVibGljIE1lbWJlciBnZXRCYWNraW5nTWVtYmVyKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGlmIChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8jIyMgbm90ZSB0aGF0IHdlIG1pZ2h0IG5vdCBoYXZlIGFjY2VzcyB0byBkZWNsYXJpbmcgbWV0YWRhdGEgeWV0CisgICAgICAgICAgICAvLyMjIyAodGhpcyBjb3VsZCBiZSB1c2VkIGR1cmluZyBwYXJzZSksIHNvIHdlIGhhdmUgdG8gc2V0dGxlIGZvcgorICAgICAgICAgICAgLy8jIyMgZGVmaW5pbmcuICBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZiBtYXBzIGEgc3VwZXJjbGFzcyBmaWVsZAorICAgICAgICAgICAgLy8jIyMgd2hlcmUgdGhlIHN1cGVyY2xhc3MgdXNlcyBhIGRpZmZlcmVudCBhY2Nlc3MgdHlwZQorICAgICAgICAgICAgaWYgKGZtZC5nZXREZWZpbmluZ01ldGFEYXRhKCkuZ2V0QWNjZXNzVHlwZSgpID09CisgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZtZC5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0RGVjbGFyZWRGaWVsZChmbWQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBSZWZsZWN0aW9uLmZpbmRHZXR0ZXIoZm1kLmdldERlY2xhcmluZ1R5cGUoKSwgZm1kLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VW5pbXBsZW1lbnRlZEV4Y2VwdGlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kOyByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIGFwcGVhcnMgdG8gYmUKKyAgICAgKiB1c2VyLWRlZmluZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVXNlckRlZmluZWQoQ2xhc3MgY2xzKSB7CisgICAgICAgIHJldHVybiBjbHMgIT0gbnVsbCAmJiAhY2xzLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLiIpCisgICAgICAgICAgICAmJiAhY2xzLmdldE5hbWUoKS5zdGFydHNXaXRoICgiamF2YXguIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0Fic3RyYWN0TWV0YURhdGFGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQWJzdHJhY3RNZXRhRGF0YUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdlOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0Fic3RyYWN0TWV0YURhdGFGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNsYXNzQXJnUGFyc2VyOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEFic3RyYWN0IHtAbGluayBNZXRhRGF0YUZhY3Rvcnl9IHRoYXQgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMKKyAqIG9mIG1hbnkgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRhRGF0YUZhY3RvcnkKKyAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRmFjdG9yeSB7CisKKyAgICBwcm90ZWN0ZWQgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IExvZyBsb2cgPSBudWxsOworICAgIHByb3RlY3RlZCBGaWxlIGRpciA9IG51bGw7CisgICAgcHJvdGVjdGVkIGludCBzdG9yZSA9IFNUT1JFX0RFRkFVTFQ7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIFNldCB0eXBlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFNldCBvZiBwZXJzaXN0ZW50IHR5cGUgbmFtZXMgc3VwcGxpZWQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhTZXQgdHlwZXMpIHsKKyAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBvZiBzZW1pY29sb24tc2VwYXJhdGVkIHBlcnNpc3RlbnQgdHlwZSBuYW1lcyBzdXBwbGllZCBieSB1c2VyIHZpYQorICAgICAqIGF1dG8tY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhTdHJpbmcgdHlwZXMpIHsKKyAgICAgICAgdGhpcy50eXBlcyA9IChTdHJpbmdVdGlscy5pc0VtcHR5KHR5cGVzKSkgPyBudWxsCisgICAgICAgICAgICA6IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoU3RyaW5ncy5zcGxpdCh0eXBlcywgIjsiLCAwKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnkoTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zKSB7CisgICAgICAgIHRoaXMucmVwb3MgPSByZXBvczsKKyAgICAgICAgaWYgKHJlcG9zICE9IG51bGwpCisgICAgICAgICAgICBsb2cgPSByZXBvcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9nCisgICAgICAgICAgICAgICAgKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19NRVRBREFUQSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVEaXJlY3RvcnkoRmlsZSBkaXIpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVNb2RlKGludCBzdG9yZSkgeworICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaWN0KGJvb2xlYW4gc3RyaWN0KSB7CisgICAgICAgIHRoaXMuc3RyaWN0ID0gc3RyaWN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN0b3JlKENsYXNzTWV0YURhdGFbXSBtZXRhcywgUXVlcnlNZXRhRGF0YVtdIHF1ZXJpZXMsCisgICAgICAgIFNlcXVlbmNlTWV0YURhdGFbXSBzZXFzLCBpbnQgbW9kZSwgTWFwIG91dHB1dCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZHJvcChDbGFzc1tdIGNscywgaW50IG1vZGUsIENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFNldCBnZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGJvb2xlYW4gZGV2cGF0aCwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UXVlcnlTY29wZShTdHJpbmcgcXVlcnlOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFJlc3VsdFNldE1hcHBpbmdTY29wZShTdHJpbmcgcmVzdWx0U2V0TWFwcGluZ05hbWUsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NBcmdQYXJzZXIgbmV3Q2xhc3NBcmdQYXJzZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NBcmdQYXJzZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0V4dGVuc2lvbktleXMoQ29sbGVjdGlvbiBleHRzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmllbGRFeHRlbnNpb25LZXlzKENvbGxlY3Rpb24gZXh0cykgeworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9DbGFzc01ldGFEYXRhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQ2xhc3NNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNmRkMTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQ2xhc3NNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsMjMxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5SZWZsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuU291cmNlVHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sLkNvbW1lbnRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkJ5dGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DaGFySWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRGF0ZUlkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkRvdWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkZsb2F0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuR2VuZXJhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Mb25nSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUlkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlNob3J0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RyaW5nSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVW5zdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogQ29udGFpbnMgbWV0YWRhdGEgYWJvdXQgYSBwZXJzaXN0ZW50IHR5cGUuCisgKiBUaGlzIG1ldGFkYXRhIGlzIGF2YWlsYWJsZSBib3RoIGF0IGVuaGFuY2VtZW50IHRpbWUgYW5kIHJ1bnRpbWUuCisgKiAgTm90ZSB0aGF0IHRoaXMgY2xhc3MgZW1wbG95cyBhZ2dyZXNzaXZlIGNhY2hpbmcsIGFuZCB0aGVyZWZvcmUgaXQgaXMKKyAqIGltcG9ydGFudCB0byBmaW5hbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBvZiBmaWVsZCBtZXRhZGF0YXMgYmVmb3JlIGludm9raW5nCisgKiBtZXRob2RzIHRoYXQgZGVwZW5kIG9uIHRoYXQgY29uZmlndXJhdGlvbiwgc3VjaCBhcworICoge0BsaW5rICNnZXRQcmltYXJ5S2V5RmllbGRzfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NNZXRhRGF0YQorICAgIGV4dGVuZHMgRXh0ZW5zaW9ucworICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZSwgU291cmNlVHJhY2tlciwgTWV0YURhdGFDb250ZXh0LCBNZXRhRGF0YU1vZGVzLAorICAgIENvbW1lbnRhYmxlIHsKKworICAgIC8qKgorICAgICAqIFVua29ud24gaWRlbnRpdHkgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTktOT1dOID0gMDsKKworICAgIC8qKgorICAgICAqIERhdGFzdG9yZSBpZGVudGl0eSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBVEFTVE9SRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWNhdGlvbiBpZGVudGl0eSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FQUExJQ0FUSU9OID0gMjsKKworICAgIC8qKgorICAgICAqIFVua25vd24gYWNjZXNzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX1VOS05PV04gPSAwOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVudCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCB2aWEgZGlyZWN0IGZpZWxkIGFjY2Vzcy4gQml0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX0ZJRUxEID0gMiA8PCAwOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVudCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCB2aWEgc2V0dGVycyBhbmQgZ2V0dGVycy4gQml0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX1BST1BFUlRZID0gMiA8PCAxOworCisgICAgLyoqCisgICAgICogVmFsdWUgZm9yIHVzaW5nIGEgc3ludGhldGljIGRldGFjaGVkIHN0YXRlIGZpZWxkLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5USEVUSUMgPSAiYHN5biI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NUUklORyA9ICJgIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKENsYXNzTWV0YURhdGEuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmV0Y2hHcm91cFtdIEVNUFRZX0ZFVENIX0dST1VQX0FSUkFZCisgICAgICAgID0gbmV3IEZldGNoR3JvdXBbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKKworICAgIHByaXZhdGUgTWV0YURhdGFSZXBvc2l0b3J5IF9yZXBvczsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDbGFzc0xvYWRlciBfbG9hZGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgZmluYWwgVmFsdWVNZXRhRGF0YSBfb3duZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBMaWZlY3ljbGVNZXRhRGF0YSBfbGlmZU1ldGEgPSBuZXcgTGlmZWN5Y2xlTWV0YURhdGEodGhpcyk7CisgICAgcHJpdmF0ZSBGaWxlIF9zcmNGaWxlID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc3JjVHlwZSA9IFNSQ19PVEhFUjsKKyAgICBwcml2YXRlIFN0cmluZ1tdIF9jb21tZW50cyA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2xpc3RJbmRleCA9IC0xOworICAgIHByaXZhdGUgaW50IF9zcmNNb2RlID0gTU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HOworICAgIHByaXZhdGUgaW50IF9yZXNNb2RlID0gTU9ERV9OT05FOworCisgICAgcHJpdmF0ZSBDbGFzcyBfdHlwZSA9IE9iamVjdC5jbGFzczsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfZmllbGRNYXAgPSBuZXcgVHJlZU1hcCgpOworICAgIHByaXZhdGUgTWFwIF9zdXBGaWVsZE1hcCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9kZWZTdXBGaWVsZHMgPSBmYWxzZTsKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gX3N0YXRpY0ZpZWxkcyA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnRbXSBfZmllbGREYXRhVGFibGUgPSBudWxsOworICAgIHByaXZhdGUgTWFwIF9mZ01hcCA9IG51bGw7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE5vdGU6IGlmIHlvdSBhZGQgYWRkaXRpb25hbCBzdGF0ZSwgbWFrZSBzdXJlIHRvIGFkZCBpdCB0byBjb3B5KCkKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHJpdmF0ZSBDbGFzcyBfb2JqZWN0SWQgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBfb2JqZWN0SWRTaGFyZWQgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBfb3BlbmpwYUlkID0gbnVsbDsKKyAgICBwcml2YXRlIEJvb2xlYW4gX2V4dGVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBCb29sZWFuIF9lbWJlZGRlZCA9IG51bGw7CisgICAgcHJpdmF0ZSBCb29sZWFuIF9pbnRlcmZhY2UgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3MgX2ltcGwgPSBudWxsOworICAgIHByaXZhdGUgTGlzdCBfaW50ZXJmYWNlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX2lmYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGludCBfaWRlbnRpdHkgPSBJRF9VTktOT1dOOworICAgIHByaXZhdGUgaW50IF9pZFN0cmF0ZWd5ID0gVmFsdWVTdHJhdGVnaWVzLk5PTkU7CisgICAgcHJpdmF0ZSBpbnQgX2FjY2Vzc1R5cGUgPSBBQ0NFU1NfVU5LTk9XTjsKKworICAgIHByaXZhdGUgU3RyaW5nIF9zZXFOYW1lID0gREVGQVVMVF9TVFJJTkc7CisgICAgcHJpdmF0ZSBTZXF1ZW5jZU1ldGFEYXRhIF9zZXFNZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfY2FjaGVOYW1lID0gREVGQVVMVF9TVFJJTkc7CisgICAgcHJpdmF0ZSBpbnQgX2NhY2hlVGltZW91dCA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgIHByaXZhdGUgQm9vbGVhbiBfZGV0YWNoYWJsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2RldGFjaFN0YXRlID0gREVGQVVMVF9TVFJJTkc7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2FsaWFzID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfdmVyc2lvbklkeCA9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgcHJpdmF0ZSBDbGFzcyBfc3VwZXIgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfc3VwZXJNZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzW10gX3N1YnMgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YVtdIF9zdWJNZXRhcyA9IG51bGw7CisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhW10gX21hcFN1Yk1ldGFzID0gbnVsbDsKKworICAgIHByaXZhdGUgRmllbGRNZXRhRGF0YVtdIF9maWVsZHMgPSBudWxsOworICAgIHByaXZhdGUgRmllbGRNZXRhRGF0YVtdIF91bm1nZEZpZWxkcyA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWVsZE1ldGFEYXRhW10gX2FsbEZpZWxkcyA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWVsZE1ldGFEYXRhW10gX2FsbFBLRmllbGRzID0gbnVsbDsKKyAgICBwcml2YXRlIEZpZWxkTWV0YURhdGFbXSBfYWxsREZHRmllbGRzID0gbnVsbDsKKyAgICBwcml2YXRlIEZpZWxkTWV0YURhdGFbXSBfZGVmaW5lZEZpZWxkcyA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWVsZE1ldGFEYXRhW10gX2xpc3RpbmdGaWVsZHMgPSBudWxsOworICAgIHByaXZhdGUgRmllbGRNZXRhRGF0YVtdIF9hbGxMaXN0aW5nRmllbGRzID0gbnVsbDsKKyAgICBwcml2YXRlIEZldGNoR3JvdXBbXSBfZmdzID0gbnVsbDsKKyAgICBwcml2YXRlIEZldGNoR3JvdXBbXSBfY3VzdG9tRkdzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgZGVzY3JpYmVkIHR5cGUgYW5kIHJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTWV0YURhdGEoQ2xhc3MgdHlwZSwgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zKSB7CisgICAgICAgIF9yZXBvcyA9IHJlcG9zOworICAgICAgICBfb3duZXIgPSBudWxsOworICAgICAgICBzZXREZXNjcmliZWRUeXBlKHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtYmVkZGVkIGNvbnN0cnVjdG9yLiBTdXBwbHkgZW1iZWRkaW5nIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhKFZhbHVlTWV0YURhdGEgb3duZXIpIHsKKyAgICAgICAgX293bmVyID0gb3duZXI7CisgICAgICAgIF9yZXBvcyA9IG93bmVyLmdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgc2V0RW52Q2xhc3NMb2FkZXIob3duZXIuZ2V0RmllbGRNZXRhRGF0YSgpLmdldERlZmluaW5nTWV0YURhdGEoKS4KKyAgICAgICAgICAgIGdldEVudkNsYXNzTG9hZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3duaW5nIHJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHVibGljIE1ldGFEYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgeworICAgICAgICByZXR1cm4gX3JlcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgbWV0YWRhdGEgaXMgZm9yIGFuIGVtYmVkZGVkIG9iamVjdCwgcmV0dXJuaW5nIHRoZSBvd25pbmcgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlTWV0YURhdGEgZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfb3duZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBlcnNpc3RlbmNlIGNhcGFibGUgY2xhc3MgZGVzY3JpYmVkIGJ5IHRoaXMgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldERlc2NyaWJlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzIGRlc2NpYmVkIGJ5IHRoaXMgbWV0YWRhdGEuIFRoZSB0eXBlIG1heSBiZSByZXNldCB3aGVuCisgICAgICogYW4gZW1iZWRkZWQgdmFsdWUgY2hhbmdlcyBpdHMgZGVjbGFyZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXNjcmliZWRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0U3VwZXJjbGFzcygpICE9IG51bGwgJiYgImphdmEubGFuZy5FbnVtIi5lcXVhbHMKKyAgICAgICAgICAgICh0eXBlLmdldFN1cGVyY2xhc3MoKS5nZXROYW1lKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJlbnVtIiwgdHlwZSkpOworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVudmlyb25tZW50YWwgbG9hZGVyIHVzZWQgd2hlbiBsb2FkaW5nIHRoaXMgbWV0YWRhdGEuCisgICAgICogVGhlIGNsYXNzIG1ldGFkYXRhIHNob3VsZCB1c2UgdGhpcyBsb2FkZXIgd2hlbiBsb2FkaW5nIG1ldGFkYXRhIGZvcgorICAgICAqIGl0cyBzdXBlcmNsYXNzIGFuZCBmaWVsZCB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0RW52Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyBlbnZpcm9ubWVudGFsIGxvYWRlciB1c2VkIHdoZW4gbG9hZGluZyB0aGlzIG1ldGFkYXRhLgorICAgICAqIFRoZSBjbGFzcyBtZXRhZGF0YSBzaG91bGQgdXNlIHRoaXMgbG9hZGVyIHdoZW4gbG9hZGluZyBtZXRhZGF0YSBmb3IKKyAgICAgKiBpdHMgc3VwZXJjbGFzcyBhbmQgZmllbGQgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW52Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIF9sb2FkZXIgPSBsb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBlcnNpc3RlbmNlIGNhcGFibGUgc3VwZXJjbGFzcyBvZiB0aGUgZGVzY3JpYmVkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFBDU3VwZXJjbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIF9zdXBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGVyc2lzdGVuY2UgY2FwYWJsZSBzdXBlcmNsYXNzIG9mIHRoZSBkZXNjcmliZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQQ1N1cGVyY2xhc3MoQ2xhc3MgcGMpIHsKKyAgICAgICAgY2xlYXJBbGxGaWVsZENhY2hlKCk7CisgICAgICAgIF9zdXBlciA9IHBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhZGF0YSBmb3IgdGhpcyBjbGFzcycgc3VwZXJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpIHsKKyAgICAgICAgaWYgKF9zdXBlck1ldGEgPT0gbnVsbCAmJiBfc3VwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9vd25lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3N1cGVyTWV0YSA9IF9yZXBvcy5uZXdFbWJlZGRlZENsYXNzTWV0YURhdGEoX293bmVyKTsKKyAgICAgICAgICAgICAgICBfc3VwZXJNZXRhLnNldERlc2NyaWJlZFR5cGUoX3N1cGVyKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9zdXBlck1ldGEgPSBfcmVwb3MuZ2V0TWV0YURhdGEoX3N1cGVyLCBfbG9hZGVyLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3N1cGVyTWV0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YWRhdGEgZm9yIHRoaXMgY2xhc3MnIHN1cGVyY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UENTdXBlcmNsYXNzTWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGNsZWFyQWxsRmllbGRDYWNoZSgpOworICAgICAgICBfc3VwZXJNZXRhID0gbWV0YTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFBDU3VwZXJjbGFzcyhtZXRhLmdldERlc2NyaWJlZFR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGNsYXNzIGlzIG1hcHBlZCB0byB0aGUgZGF0YXN0b3JlLiBCeSBkZWZhdWx0LCBvbmx5CisgICAgICogcmV0dXJucyBmYWxzZSBpZiBjbGFzcyBpcyBlbWJlZGRlZC1vbmx5LCBidXQgc3ViY2xhc3NlcyBtaWdodCBvdmVycmlkZQorICAgICAqIHRvIGFsbG93IHVubWFwcGVkIG90aGVyIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgeworICAgICAgICByZXR1cm4gX2VtYmVkZGVkICE9IEJvb2xlYW4uVFJVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsb3Nlc3QgbWFwcGVkIHN1cGVyY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWFwcGVkUENTdXBlcmNsYXNzTWV0YURhdGEoKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgaWYgKHN1cCA9PSBudWxsIHx8IHN1cC5pc01hcHBlZCgpKQorICAgICAgICAgICAgcmV0dXJuIHN1cDsKKyAgICAgICAgcmV0dXJuIHN1cC5nZXRNYXBwZWRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUga25vd24gcGVyc2lzdGVuY2UgY2FwYWJsZSBzdWJjbGFzc2VzIG9mIHRoZSBkZXNjcmliZWQgdHlwZSwKKyAgICAgKiBvciBlbXB0eSBhcnJheSBpZiBub25lIG9yIGlmIHRoaXMgaXMgZW1iZWRkZWQgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIENsYXNzW10gZ2V0UENTdWJjbGFzc2VzKCkgeworICAgICAgICBpZiAoX293bmVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX3JlcG9zLkVNUFRZX0NMQVNTRVM7CisKKyAgICAgICAgX3JlcG9zLnByb2Nlc3NSZWdpc3RlcmVkQ2xhc3NlcyhfbG9hZGVyKTsKKyAgICAgICAgaWYgKF9zdWJzID09IG51bGwpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gc3VicyA9IF9yZXBvcy5nZXRQQ1N1YmNsYXNzZXMoX3R5cGUpOworICAgICAgICAgICAgX3N1YnMgPSAoQ2xhc3NbXSkgc3Vicy50b0FycmF5KG5ldyBDbGFzc1tzdWJzLnNpemUoKV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfc3ViczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGUga25vd24gcGVyc2lzdGVuY2UgY2FwYWJsZSBzdWJjbGFzc2VzIG9mCisgICAgICogdGhlIGRlc2NyaWJlZCB0eXBlLCBvciBlbXB0eSBhcnJheSBpZiBub25lIG9yIGlmIHRoaXMgaXMgZW1iZWRkZWQKKyAgICAgKiBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YVtdIGdldFBDU3ViY2xhc3NNZXRhRGF0YXMoKSB7CisgICAgICAgIGlmIChfb3duZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfcmVwb3MuRU1QVFlfTUVUQVM7CisKKyAgICAgICAgQ2xhc3NbXSBzdWJzID0gZ2V0UENTdWJjbGFzc2VzKCk7IC8vIGNoZWNrcyBmb3IgbmV3CisgICAgICAgIGlmIChfc3ViTWV0YXMgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHN1YnMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgX3N1Yk1ldGFzID0gX3JlcG9zLkVNUFRZX01FVEFTOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzID0gX3JlcG9zLm5ld0NsYXNzTWV0YURhdGFBcnJheQorICAgICAgICAgICAgICAgICAgICAoc3Vicy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbWV0YXNbaV0gPSBfcmVwb3MuZ2V0TWV0YURhdGEoc3Vic1tpXSwgX2xvYWRlciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgX3N1Yk1ldGFzID0gbWV0YXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9zdWJNZXRhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIG1hcHBlZCBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhW10gZ2V0TWFwcGVkUENTdWJjbGFzc01ldGFEYXRhcygpIHsKKyAgICAgICAgaWYgKF9vd25lciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9yZXBvcy5FTVBUWV9NRVRBUzsKKworICAgICAgICBDbGFzc01ldGFEYXRhW10gc3VicyA9IGdldFBDU3ViY2xhc3NNZXRhRGF0YXMoKTsgLy8gY2hlY2tzIGZvciBuZXcKKyAgICAgICAgaWYgKF9tYXBTdWJNZXRhcyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc3Vicy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBfbWFwU3ViTWV0YXMgPSBzdWJzOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTGlzdCBtYXBwZWQgPSBuZXcgQXJyYXlMaXN0KHN1YnMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzW2ldLmlzTWFwcGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWQuYWRkKHN1YnNbaV0pOworICAgICAgICAgICAgICAgIF9tYXBTdWJNZXRhcyA9IChDbGFzc01ldGFEYXRhW10pIG1hcHBlZC50b0FycmF5CisgICAgICAgICAgICAgICAgICAgIChfcmVwb3MubmV3Q2xhc3NNZXRhRGF0YUFycmF5KG1hcHBlZC5zaXplKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX21hcFN1Yk1ldGFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGlkZW50aXR5IGJlaW5nIHVzZWQuIFRoaXMgd2lsbCBiZSBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0lEX1VOS05PV059OiB1bmtub3duIGlkZW50aXR5IHR5cGU8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0lEX0RBVEFTVE9SRX06IGlkZW50aXR5IG1hbmFnZWQgYnkgdGhlIGRhdGEgc3RvcmUgYW5kCisgICAgICogaW5kZXBlbmRlbnQJb2YgdGhlIGZpZWxkcyBvZiB0aGUgaW5zdGFuY2U8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0lEX0FQUExJQ0FUSU9OfTogaWRlbnRpdHkgbWFuYWdlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kCisgICAgICogZGVmaW5lZCBieSBvbmUgb3IgbW9yZSBmaWVsZHMgb2YgdGhlIGluc3RhbmNlPC9saT4KKyAgICAgKiA8L3VsPiBJZiB1bnNwZWNpZmllZCwgZGVmYXVsdHMgdG8ge0BsaW5rICNJRF9EQVRBU1RPUkV9IGlmIHRoZXJlIGFyZSBubworICAgICAqIHByaW1hcnkga2V5IGZpZWxkcywgYW5kIHtAbGluayAjSURfQVBQTElDQVRJT059IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElkZW50aXR5VHlwZSgpIHsKKyAgICAgICAgaWYgKF9pZGVudGl0eSA9PSBJRF9VTktOT1dOKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIHN1cCA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgc3VwLmdldElkZW50aXR5VHlwZSgpICE9IElEX1VOS05PV04pCisgICAgICAgICAgICAgICAgX2lkZW50aXR5ID0gc3VwLmdldElkZW50aXR5VHlwZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoZ2V0UHJpbWFyeUtleUZpZWxkcygpLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgX2lkZW50aXR5ID0gSURfQVBQTElDQVRJT047CisgICAgICAgICAgICBlbHNlIGlmIChpc01hcHBlZCgpKQorICAgICAgICAgICAgICAgIF9pZGVudGl0eSA9IElEX0RBVEFTVE9SRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfaWRlbnRpdHkgPSBfcmVwb3MuZ2V0TWV0YURhdGFGYWN0b3J5KCkuZ2V0RGVmYXVsdHMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdElkZW50aXR5VHlwZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfaWRlbnRpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgaWRlbnRpdHkgYmVpbmcgdXNlZC4gVGhpcyB3aWxsIGJlIG9uZSBvZjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjSURfVU5LTk9XTn06IHVua25vd24gaWRlbnRpdHkgdHlwZTwvbGk+CisgICAgICogPGxpPntAbGluayAjSURfREFUQVNUT1JFfTogaWRlbnRpdHkgbWFuYWdlZCBieSB0aGUgZGF0YSBzdG9yZSBhbmQKKyAgICAgKiBpbmRlcGVuZGVudAlvZiB0aGUgZmllbGRzIG9mIHRoZSBpbnN0YW5jZTwvbGk+CisgICAgICogPGxpPntAbGluayAjSURfQVBQTElDQVRJT059OiBpZGVudGl0eSBtYW5hZ2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQKKyAgICAgKiBkZWZpbmVkIGJ5IG9uZSBvciBtb3JlIGZpZWxkcyBvZiB0aGUgaW5zdGFuY2U8L2xpPgorICAgICAqIDwvdWw+IElmIHVuc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB7QGxpbmsgI0lEX0RBVEFTVE9SRX0gaWYgdGhlcmUgYXJlIG5vCisgICAgICogcHJpbWFyeSBrZXkgZmllbGRzLCBhbmQge0BsaW5rICNJRF9BUFBMSUNBVElPTn0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkZW50aXR5VHlwZShpbnQgdHlwZSkgeworICAgICAgICBfaWRlbnRpdHkgPSB0eXBlOworICAgICAgICBpZiAodHlwZSAhPSBJRF9BUFBMSUNBVElPTikgeworICAgICAgICAgICAgX29iamVjdElkID0gbnVsbDsKKyAgICAgICAgICAgIF9vcGVuanBhSWQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhLXNwZWNpZmllZCBjbGFzcyB0byB1c2UgZm9yIHRoZSBvYmplY3QgSUQuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldE9iamVjdElkVHlwZSgpIHsKKyAgICAgICAgaWYgKF9vYmplY3RJZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RJZDsKKyAgICAgICAgaWYgKGdldElkZW50aXR5VHlwZSgpICE9IElEX0FQUExJQ0FUSU9OKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgaWYgKHN1cCAhPSBudWxsICYmIHN1cC5nZXRJZGVudGl0eVR5cGUoKSAhPSBJRF9VTktOT1dOKSB7CisgICAgICAgICAgICBfb2JqZWN0SWQgPSBzdXAuZ2V0T2JqZWN0SWRUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gX29iamVjdElkOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmlndXJlIG91dCBvcGVuanBhIGlkZW50aXR5IHR5cGUgYmFzZWQgb24gcHJpbWFyeSBrZXkgZmllbGQKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIHBrcyA9IGdldFByaW1hcnlLZXlGaWVsZHMoKTsKKyAgICAgICAgaWYgKHBrcy5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBzd2l0Y2ggKHBrc1swXS5nZXRPYmplY3RJZEZpZWxkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEVfT0JKOgorICAgICAgICAgICAgICAgIF9vYmplY3RJZCA9IEJ5dGVJZC5jbGFzczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgICAgICBfb2JqZWN0SWQgPSBDaGFySWQuY2xhc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEVfT0JKOgorICAgICAgICAgICAgICAgIF9vYmplY3RJZCA9IERvdWJsZUlkLmNsYXNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgX29iamVjdElkID0gRmxvYXRJZC5jbGFzczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVF9PQko6CisgICAgICAgICAgICAgICAgX29iamVjdElkID0gSW50SWQuY2xhc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICAgICAgX29iamVjdElkID0gTG9uZ0lkLmNsYXNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgX29iamVjdElkID0gU2hvcnRJZC5jbGFzczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICBfb2JqZWN0SWQgPSBTdHJpbmdJZC5jbGFzczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgX29iamVjdElkID0gRGF0ZUlkLmNsYXNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgIF9vYmplY3RJZCA9IE9iamVjdElkLmNsYXNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfb2JqZWN0SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhLXNwZWNpZmllZCBjbGFzcyB0byB1c2UgZm9yIHRoZSBvYmplY3QgSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0SWRUeXBlKENsYXNzIGNscywgYm9vbGVhbiBzaGFyZWQpIHsKKyAgICAgICAgX29iamVjdElkID0gbnVsbDsKKyAgICAgICAgX29wZW5qcGFJZCA9IG51bGw7CisgICAgICAgIF9vYmplY3RJZFNoYXJlZCA9IG51bGw7CisgICAgICAgIGlmIChjbHMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZG9uJ3QgbGV0IHBlb3BsZSBhc3NpZ24gT3BlbkpQQUlkIHR5cGVzOyBzYWZlciB0byBjYWxjdWxhdGUgaXQKKyAgICAgICAgICAgIC8vIG91cnNlbHZlcworICAgICAgICAgICAgc2V0SWRlbnRpdHlUeXBlKElEX0FQUExJQ0FUSU9OKTsKKyAgICAgICAgICAgIGlmICghT3BlbkpQQUlkLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgeworICAgICAgICAgICAgICAgIF9vYmplY3RJZCA9IGNsczsKKyAgICAgICAgICAgICAgICBfb2JqZWN0SWRTaGFyZWQgPSAoc2hhcmVkKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHlwZSB1c2VzIGFuIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzIHRoYXQgaXMgc2hhcmVkCisgICAgICogd2l0aCBvdGhlciBjbGFzc2VzLCBhbmQgaXMgdGhlcmVmb3JlIHdyYXBwZWQgaW4gYW4ge0BsaW5rIE9iamVjdElkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdElkVHlwZVNoYXJlZCgpIHsKKyAgICAgICAgaWYgKF9vYmplY3RJZFNoYXJlZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RJZFNoYXJlZC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgaWYgKF9zdXBlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkuaXNPYmplY3RJZFR5cGVTaGFyZWQoKTsKKyAgICAgICAgcmV0dXJuIGlzT3BlbkpQQUlkZW50aXR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHR5cGUgdXNlcyBPcGVuSlBBIGlkZW50aXR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbkpQQUlkZW50aXR5KCkgeworICAgICAgICBpZiAoX29wZW5qcGFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICBDbGFzcyBjbHMgPSBnZXRPYmplY3RJZFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBfb3BlbmpwYUlkID0gKE9wZW5KUEFJZC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpID8gQm9vbGVhbi5UUlVFCisgICAgICAgICAgICAgICAgOiBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfb3BlbmpwYUlkLmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJhdGVneSB0byB1c2UgZm9yIGRhdGFzdG9yZSBpZGVudGl0eSBnZW5lcmF0aW9uLgorICAgICAqIE9uZSBvZiB0aGUgY29uc3RhbnRzIGZyb20ge0BsaW5rIFZhbHVlU3RyYXRlZ2llc30uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJZGVudGl0eVN0cmF0ZWd5KCkgeworICAgICAgICBpZiAoZ2V0SWRlbnRpdHlUeXBlKCkgPT0gSURfREFUQVNUT1JFCisgICAgICAgICAgICAmJiBfaWRTdHJhdGVneSA9PSBWYWx1ZVN0cmF0ZWdpZXMuTk9ORSkgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsICYmIHN1cC5nZXRJZGVudGl0eVR5cGUoKSAhPSBJRF9VTktOT1dOKQorICAgICAgICAgICAgICAgIF9pZFN0cmF0ZWd5ID0gc3VwLmdldElkZW50aXR5U3RyYXRlZ3koKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfaWRTdHJhdGVneSA9IFZhbHVlU3RyYXRlZ2llcy5OQVRJVkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9pZFN0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJhdGVneSB0byB1c2UgZm9yIGRhdGFzdG9yZSBpZGVudGl0eSBnZW5lcmF0aW9uLgorICAgICAqIE9uZSBvZiB0aGUgY29uc3RhbnRzIGZyb20ge0BsaW5rIFZhbHVlU3RyYXRlZ2llc30uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWRlbnRpdHlTdHJhdGVneShpbnQgc3RyYXRlZ3kpIHsKKyAgICAgICAgX2lkU3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IFZhbHVlU3RyYXRlZ2llcy5TRVFVRU5DRSkKKyAgICAgICAgICAgIHNldElkZW50aXR5U2VxdWVuY2VOYW1lKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhc3RvcmUgaWRlbnRpdHkgc2VxdWVuY2UgbmFtZSwgb3IgbnVsbCBmb3Igbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5U2VxdWVuY2VOYW1lKCkgeworICAgICAgICBpZiAoREVGQVVMVF9TVFJJTkcuZXF1YWxzKF9zZXFOYW1lKSkgeworICAgICAgICAgICAgaWYgKF9zdXBlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9zZXFOYW1lID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKS5nZXRJZGVudGl0eVNlcXVlbmNlTmFtZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9zZXFOYW1lID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3NlcU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRhdGFzdG9yZSBpZGVudGl0eSBzZXF1ZW5jZSBuYW1lLCBvciBudWxsIGZvciBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkZW50aXR5U2VxdWVuY2VOYW1lKFN0cmluZyBzZXFOYW1lKSB7CisgICAgICAgIF9zZXFOYW1lID0gc2VxTmFtZTsKKyAgICAgICAgX3NlcU1ldGEgPSBudWxsOworICAgICAgICBpZiAoc2VxTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgc2V0SWRlbnRpdHlTdHJhdGVneShWYWx1ZVN0cmF0ZWdpZXMuU0VRVUVOQ0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGFkYXRhIGZvciB0aGUgZGF0YXN0b3JlIGlkZW50aXR5IHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTZXF1ZW5jZU1ldGFEYXRhIGdldElkZW50aXR5U2VxdWVuY2VNZXRhRGF0YSgpIHsKKyAgICAgICAgaWYgKF9zZXFNZXRhID09IG51bGwgJiYgZ2V0SWRlbnRpdHlTZXF1ZW5jZU5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgX3NlcU1ldGEgPSBfcmVwb3MuZ2V0U2VxdWVuY2VNZXRhRGF0YSh0aGlzLAorICAgICAgICAgICAgICAgIGdldElkZW50aXR5U2VxdWVuY2VOYW1lKCksIHRydWUpOworICAgICAgICByZXR1cm4gX3NlcU1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgbGlmZWN5Y2xlIGNhbGxiYWNrcyBmb3IgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTWV0YURhdGEgZ2V0TGlmZWN5Y2xlTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbGlmZU1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxpYXMgZm9yIHRoZSBkZXNjcmliZWQgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqIGhhcyBiZWVuIHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRUeXBlQWxpYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVBbGlhcygpIHsKKyAgICAgICAgaWYgKF9hbGlhcyA9PSBudWxsKQorICAgICAgICAgICAgX2FsaWFzID0gU3RyaW5ncy5nZXRDbGFzc05hbWUoX3R5cGUpOworICAgICAgICByZXR1cm4gX2FsaWFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFsaWFzIGZvciB0aGUgZGVzY3JpYmVkIHR5cGUuIFRoZSBhbGlhcyBjYW4gYmUKKyAgICAgKiBhbnkgYXJiaXRyYXJ5IHN0cmluZyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gbGF0ZXIgdXNlIHRvCisgICAgICogcmVmZXIgdG8gdGhlIGNsYXNzLiBOb3RlIHRoYXQgYXQgcnVudGltZSwgb25seSB0aGUgYWxpYXMKKyAgICAgKiBjb21wdXRlZCB3aGVuIHRoZSBwZXJzaXN0ZW50IHR5cGUgd2FzIGVuaGFuY2VkIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgdGhlIGFsaWFzIG5hbWUgdG8gYXBwbHkgdG8gdGhlIGRlc2NyaWJlZCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZUFsaWFzKFN0cmluZyBhbGlhcykgeworICAgICAgICBfYWxpYXMgPSBhbGlhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNjZXNzIHR5cGUgdXNlZCBieSB0aGlzIGNsYXNzLiBFaXRoZXIge0BsaW5rICNBQ0NFU1NfRklFTER9CisgICAgICogb3Ige0BsaW5rICNBQ0NFU1NfUFJPUEVSVFl9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzVHlwZSgpIHsKKyAgICAgICAgaWYgKF9hY2Nlc3NUeXBlID09IEFDQ0VTU19VTktOT1dOKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIHN1cCA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cC5nZXRBY2Nlc3NUeXBlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeSgpLmdldE1ldGFEYXRhRmFjdG9yeSgpLgorICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0cygpLmdldERlZmF1bHRBY2Nlc3NUeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9hY2Nlc3NUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY2Nlc3MgdHlwZSB1c2VkIGJ5IHRoaXMgY2xhc3MuIE11c3QgYmUgZWl0aGVyCisgICAgICoge0BsaW5rICNBQ0NFU1NfRklFTER9IG9yIHtAbGluayAjQUNDRVNTX1BST1BFUlRZfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NUeXBlKGludCB0eXBlKSB7CisgICAgICAgIF9hY2Nlc3NUeXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSB0eXBlIHJlcXVpcmVzIGV4dGVudCBtYW5hZ2VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlcXVpcmVzRXh0ZW50KCkgeworICAgICAgICBpZiAoX293bmVyICE9IG51bGwgfHwgaXNFbWJlZGRlZE9ubHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoX2V4dGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIHN1cCA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2V4dGVudCA9IChzdXAuZ2V0UmVxdWlyZXNFeHRlbnQoKSkgPyBCb29sZWFuLlRSVUUKKyAgICAgICAgICAgICAgICAgICAgOiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9leHRlbnQgPSBCb29sZWFuLlRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9leHRlbnQuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdHlwZSByZXF1aXJlcyBleHRlbnQgbWFuYWdlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlc0V4dGVudChib29sZWFuIHJlcSkgeworICAgICAgICBfZXh0ZW50ID0gKHJlcSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHR5cGUgY2FuIG9ubHkgYmUgdXNlZCBhcyBhbiBlbWJlZGRlZCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZE9ubHkoKSB7CisgICAgICAgIGlmIChfZW1iZWRkZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9lbWJlZGRlZCA9IChzdXAuaXNFbWJlZGRlZE9ubHkoKSkgPyBCb29sZWFuLlRSVUUKKyAgICAgICAgICAgICAgICAgICAgOiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9lbWJlZGRlZCA9IEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9lbWJlZGRlZC5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSB0eXBlIGNhbiBvbmx5IGJlIHVzZWQgYXMgYW4gZW1iZWRkZWQgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtYmVkZGVkT25seShib29sZWFuIGVtYmVkKSB7CisgICAgICAgIF9lbWJlZGRlZCA9IChlbWJlZCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHR5cGUgaXMgYSBtYW5hZ2VkIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRJbnRlcmZhY2UoKSB7CisgICAgICAgIGlmICghX3R5cGUuaXNJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9pbnRlcmZhY2UgPT0gbnVsbCA/IGZhbHNlIDogX2ludGVyZmFjZS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSB0eXBlIGlzIGEgbWFuYWdlZCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VkSW50ZXJmYWNlKGJvb2xlYW4gbWFuYWdlZEludGVyZmFjZSkgeworICAgICAgICBpZiAoIV90eXBlLmlzSW50ZXJmYWNlKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1pbnRlcmZhY2UiLCBfdHlwZSkpOworICAgICAgICBfaW50ZXJmYWNlID0gbWFuYWdlZEludGVyZmFjZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYW5hZ2VkIGludGVyZmFjZSBpbXBsZW1lbnRvciBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldEludGVyZmFjZUltcGwoKSB7CisgICAgICAgIHJldHVybiBfaW1wbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1hbmFnZWQgaW50ZXJmYWNlIGltcGxlbWVudG9yIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludGVyZmFjZUltcGwoQ2xhc3MgaW1wbCkgeworICAgICAgICBfaW1wbCA9IGltcGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBleHBsaWNpdGx5IGRlY2xhcmVkIGludGVyZmFjZXMgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1tdIGdldERlY2xhcmVkSW50ZXJmYWNlcygpIHsKKyAgICAgICAgaWYgKF9pbnRlcmZhY2VzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gTWV0YURhdGFSZXBvc2l0b3J5LkVNUFRZX0NMQVNTRVM7CisgICAgICAgIHJldHVybiAoQ2xhc3NbXSkgX2ludGVyZmFjZXMudG9BcnJheShuZXcgQ2xhc3NbX2ludGVyZmFjZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwbGljaXRseSBkZWNsYXJlIHRoZSBnaXZlbiBpbnRlcmZhY2UgYW1vbmcgdGhlIG9uZXMgdGhpcworICAgICAqIGNsYXNzIGltcGxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVjbGFyZWRJbnRlcmZhY2UoQ2xhc3MgaWZhY2UpIHsKKyAgICAgICAgaWYgKGlmYWNlID09IG51bGwgfHwgIWlmYWNlLmlzSW50ZXJmYWNlKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImRlY2xhcmUtbm9uLWludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgdGhpcywgaWZhY2UpKTsKKyAgICAgICAgaWYgKF9pbnRlcmZhY2VzID09IG51bGwpCisgICAgICAgICAgICBfaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgX2ludGVyZmFjZXMuYWRkKGlmYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGludGVyZmFjZSBmcm9tIHRoZSBkZWNsYXJlZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZURlY2xhcmVkSW50ZXJmYWNlKENsYXNzIGlmYWNlKSB7CisgICAgICAgIGlmIChfaW50ZXJmYWNlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX2ludGVyZmFjZXMucmVtb3ZlKGlmYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGlhcyBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIGludGVyZmFjZSBkdXJpbmcgIHF1ZXJpZXMgdG8KKyAgICAgKiB0aGUgbG9jYWwgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlUHJvcGVydHlBbGlhcyhDbGFzcyBpZmFjZSwgU3RyaW5nIG9yaWcsIAorICAgICAgICBTdHJpbmcgbG9jYWwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChfaWZhY2VNYXApIHsKKyAgICAgICAgICAgIE1hcCBmaWVsZHMgPSAoTWFwKSBfaWZhY2VNYXAuZ2V0KGlmYWNlKTsKKyAgICAgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgX2lmYWNlTWFwLnB1dChpZmFjZSwgZmllbGRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWVsZHMuY29udGFpbnNLZXkob3JpZykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJkdXBsaWNhdGUtaWZhY2UtYWxpYXMiLCAKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgb3JpZywgbG9jYWwpKTsKKyAgICAgICAgICAgIGZpZWxkcy5wdXQob3JpZywgbG9jYWwpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCBsb2NhbCBmaWVsZCBhbGlhcyBmb3IgdGhlIGdpdmVuIGludGVyZmFjZSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZVByb3BlcnR5QWxpYXMoQ2xhc3MgaWZhY2UsIFN0cmluZyBvcmlnKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoX2lmYWNlTWFwKSB7CisgICAgICAgICAgICBNYXAgZmllbGRzID0gKE1hcCkgX2lmYWNlTWFwLmdldChpZmFjZSk7CisgICAgICAgICAgICBpZiAoZmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgZmllbGRzLmdldChvcmlnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIGFsaWFzZXMgcHJvcGVydHkgbmFtZWQgZm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEludGVyZmFjZUFsaWFzZWRQcm9wZXJ0aWVzKENsYXNzIGlmYWNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoX2lmYWNlTWFwKSB7CisgICAgICAgICAgICBNYXAgZmllbGRzID0gKE1hcCkgX2lmYWNlTWFwLmdldChpZmFjZSk7CisgICAgICAgICAgICBpZiAoZmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIGZpZWxkcy5rZXlTZXQoKS50b0FycmF5KAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbZmllbGRzLnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpZWxkcyB0aGF0IHVzZSBpbXBsIG9yIGludGVybWVkaWF0ZSBkYXRhLCBpbgorICAgICAqIG9yZGVyIHRvIGNyZWF0ZSBhIGNvbXBhY3RlZCBhcnJheSBmb3Igc3RvcmFnZSBvZiBzYWlkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFeHRyYUZpZWxkRGF0YUxlbmd0aCgpIHsKKyAgICAgICAgaW50W10gdGFibGUgPSBnZXRFeHRyYUZpZWxkRGF0YVRhYmxlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSB0YWJsZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIGlmICh0YWJsZVtpXSAhPSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVbaV0gKyAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGltcGwgLyBpbnRlcm1lZGlhdGUgZmllbGQgZGF0YSBpbmRleCBvZiB0aGUgZ2l2ZW4gZmllbGQKKyAgICAgKiBpbiB0aGUgY29tcGFjdGVkIGFycmF5LCBvciAtMSBpZiB0aGUgZmllbGQgZG9lcyBub3QgdXNlIGV4dHJhIGRhdGEuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRFeHRyYUZpZWxkRGF0YUxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXh0cmFGaWVsZERhdGFJbmRleChpbnQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGdldEV4dHJhRmllbGREYXRhVGFibGUoKVtmaWVsZF07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHRhYmxlIG1hcHBpbmcgZWFjaCBmaWVsZCBpbmRleCB0byBpdHMgZXh0cmEgZGF0YSBpbmRleC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFtdIGdldEV4dHJhRmllbGREYXRhVGFibGUoKSB7CisgICAgICAgIGlmIChfZmllbGREYXRhVGFibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBnZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGludFtdIHRhYmxlID0gbmV3IGludFtmbWRzLmxlbmd0aF07CisgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmbWRzW2ldLnVzZXNJbnRlcm1lZGlhdGUoKQorICAgICAgICAgICAgICAgICAgICB8fCBmbWRzW2ldLnVzZXNJbXBsRGF0YSgpICE9IEJvb2xlYW4uRkFMU0UpCisgICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldID0gaWR4Kys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2ZpZWxkRGF0YVRhYmxlID0gdGFibGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9maWVsZERhdGFUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSByZXByZXNlbnRzIGEgbWFuYWdlZCBvciBzdGF0aWMgZmllbGQgb2YKKyAgICAgKiB0aGlzIGNsYXNzLCBpbmNsdWRpbmcgc3VwZXJjbGFzcyBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlRmllbGQoU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIGlmIChnZXREZWNsYXJlZEZpZWxkKGZpZWxkKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChfc3RhdGljRmllbGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gX3R5cGUuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgICAgIFNldCBuYW1lcyA9IG5ldyBIYXNoU2V0KChpbnQpIChmaWVsZHMubGVuZ3RoICogMS4zMyArIDEpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1N0YXRpYyhmaWVsZHNbaV0uZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoZmllbGRzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICBfc3RhdGljRmllbGRzID0gbmFtZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9zdGF0aWNGaWVsZHMuY29udGFpbnMoZmllbGQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChfc3VwZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmlzQWNjZXNzaWJsZUZpZWxkKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgZmllbGQgbWV0YWRhdGFzLCBpbmNsdWRpbmcgc3VwZXJjbGFzcyBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGFbXSBnZXRGaWVsZHMoKSB7CisgICAgICAgIGlmIChfYWxsRmllbGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfc3VwZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfYWxsRmllbGRzID0gZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBnZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBzdXBGaWVsZHMgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLgorICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZHMoKTsKKworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBhbGxGaWVsZHMgPSBfcmVwb3MubmV3RmllbGRNZXRhRGF0YUFycmF5CisgICAgICAgICAgICAgICAgICAgIChmaWVsZHMubGVuZ3RoICsgc3VwRmllbGRzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzdXBGaWVsZHMsIDAsIGFsbEZpZWxkcywgMCwgc3VwRmllbGRzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmVwbGFjZURlZmluZWRTdXBlcmNsYXNzRmllbGRzKGFsbEZpZWxkcywgc3VwRmllbGRzLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaWVsZHNbaV0uc2V0SW5kZXgoc3VwRmllbGRzLmxlbmd0aCArIGkpOworICAgICAgICAgICAgICAgICAgICBhbGxGaWVsZHNbc3VwRmllbGRzLmxlbmd0aCArIGldID0gZmllbGRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfYWxsRmllbGRzID0gYWxsRmllbGRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBfYWxsRmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugc3VwZXJjbGFzcyBmaWVsZHMgdGhhdCB3ZSBkZWZpbmUgd2l0aCBvdXIgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZURlZmluZWRTdXBlcmNsYXNzRmllbGRzKEZpZWxkTWV0YURhdGFbXSBmaWVsZHMsCisgICAgICAgIGludCBsZW4pIHsKKyAgICAgICAgaWYgKF9zdXBGaWVsZE1hcCA9PSBudWxsIHx8ICFfZGVmU3VwRmllbGRzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGRvbid0IGFzc3VtZSBmaWVsZHMgYXJlIGluIG9yZGVyOyB0aGlzIG1ldGhvZCBpcyB1c2VkIGZvcgorICAgICAgICAvLyBsaXN0aW5nIG9yZGVyIGFzIHdlbGwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBzdXBGaWVsZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgc3VwRmllbGQgPSAoRmllbGRNZXRhRGF0YSkgX3N1cEZpZWxkTWFwLmdldChmaWVsZHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChzdXBGaWVsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmllbGRzW2ldID0gc3VwRmllbGQ7CisgICAgICAgICAgICAgICAgc3VwRmllbGQuc2V0SW5kZXgoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN1cGVyY2xhc3MgY29weSBvZiB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkTWV0YURhdGEgZ2V0U3VwZXJjbGFzc0ZpZWxkKEZpZWxkTWV0YURhdGEgc3VwRmllbGQpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBzbSA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gc20gPT0gbnVsbCA/IG51bGwgOiBzbS5nZXRGaWVsZChzdXBGaWVsZC5nZXROYW1lKCkpOworICAgICAgICBpZiAoZm1kID09IG51bGwgfHwgZm1kLmdldE1hbmFnZW1lbnQoKSAhPSBmbWQuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoInVubWFuYWdlZC1zdXAtZmllbGQiLAorICAgICAgICAgICAgICAgIHN1cEZpZWxkLCB0aGlzKSk7CisgICAgICAgIHJldHVybiBmbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG9ubHkgdGhlIGZpZWxkcyBmb3IgdGhpcyBjbGFzcywgd2l0aG91dCBzdXBlcmNsYXNzIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNZXRhRGF0YVtdIGdldERlY2xhcmVkRmllbGRzKCkgeworICAgICAgICBpZiAoX2ZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBMaXN0IGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoX2ZpZWxkTWFwLnNpemUoKSk7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2ZpZWxkTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZm1kID0gKEZpZWxkTWV0YURhdGEpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRNYW5hZ2VtZW50KCkgIT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBmbWQuc2V0RGVjbGFyZWRJbmRleChmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZtZC5nZXRJbmRleCgpID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgZm1kLnNldEluZGV4KGZtZC5nZXREZWNsYXJlZEluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICBmaWVsZHMuYWRkKGZtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2ZpZWxkcyA9IChGaWVsZE1ldGFEYXRhW10pIGZpZWxkcy50b0FycmF5CisgICAgICAgICAgICAgICAgKF9yZXBvcy5uZXdGaWVsZE1ldGFEYXRhQXJyYXkoZmllbGRzLnNpemUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBwcmltYXJ5IGtleSBmaWVsZHMsIG9yIGVtcHR5IGFycmF5IGlmIG5vbmUuIFRoZSBvcmRlcgorICAgICAqIGluIHdoaWNoIHRoZSBrZXlzIGFyZSByZXR1cm5lZCB3aWxsIGJlIHRoZSBvcmRlciBpbiB3aGljaAorICAgICAqIHRoZSBmaWVsZHMgYXJlIGRlY2xhcmVkLCBzdGFydGluZyBhdCB0aGUgbGVhc3QtZGVyaXZlZCBzdXBlcmNsYXNzCisgICAgICogYW5kIGVuZGluZyB3aXRoIHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgb2YgdGhlIG1vc3QtZGVyaXZlZCBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNZXRhRGF0YVtdIGdldFByaW1hcnlLZXlGaWVsZHMoKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBwayBmaWVsZHMgZXZlbiBpZiBub3Qgc2V0IHRvIElEX0FQUExJQ0FUSU9OIHNvIHRoYXQKKyAgICAgICAgLy8gYXBwIGlkIHRvb2wgc2VlcyB0aGVtIGV2ZW4gd2hlbiB1c2VyIGRvZXNuJ3QgZGVjbGFyZSBhcHAgaWQKKyAgICAgICAgaWYgKF9hbGxQS0ZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZmllbGRzID0gZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBpbnQgbnVtID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICAgICAgICAgIG51bSsrOworCisgICAgICAgICAgICBpZiAobnVtID09IDApCisgICAgICAgICAgICAgICAgX2FsbFBLRmllbGRzID0gX3JlcG9zLkVNUFRZX0ZJRUxEUzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBwa3MgPSBfcmVwb3MubmV3RmllbGRNZXRhRGF0YUFycmF5KG51bSk7CisgICAgICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2ldLmlzUHJpbWFyeUtleSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbaV0uc2V0UHJpbWFyeUtleUluZGV4KG51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3NbbnVtXSA9IGZpZWxkc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9hbGxQS0ZpZWxkcyA9IHBrczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2FsbFBLRmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBmaWVsZHMgaW4gdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAsCisgICAgICogaW5jbHVkaW5nIHN1cGVyY2xhc3MgZmllbGRzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhW10gZ2V0RGVmYXVsdEZldGNoR3JvdXBGaWVsZHMoKSB7CisgICAgICAgIGlmIChfYWxsREZHRmllbGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGludCBudW0gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5pc0luRGVmYXVsdEZldGNoR3JvdXAoKSkKKyAgICAgICAgICAgICAgICAgICAgbnVtKys7CisKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBkZmdzID0gX3JlcG9zLm5ld0ZpZWxkTWV0YURhdGFBcnJheShudW0pOworICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uaXNJbkRlZmF1bHRGZXRjaEdyb3VwKCkpCisgICAgICAgICAgICAgICAgICAgIGRmZ3NbbnVtKytdID0gZmllbGRzW2ldOworICAgICAgICAgICAgX2FsbERGR0ZpZWxkcyA9IGRmZ3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9hbGxERkdGaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2ZXJzaW9uIGZpZWxkIGZvciB0aGlzIGNsYXNzLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0VmVyc2lvbkZpZWxkKCkgeworICAgICAgICBpZiAoX3ZlcnNpb25JZHggPT0gSW50ZWdlci5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGludCBpZHggPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5pc1ZlcnNpb24oKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtdWx0LXZlcnMtZmllbGRzIiwgdGhpcywgZmllbGRzW2lkeF0sIGZpZWxkc1tpXSkpOworICAgICAgICAgICAgICAgICAgICBpZHggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF92ZXJzaW9uSWR4ID0gaWR4OworICAgICAgICB9CisgICAgICAgIGlmIChfdmVyc2lvbklkeCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0RmllbGRzKClbX3ZlcnNpb25JZHhdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW50IG9yIHRyYW5zYWN0aW9uYWwgZmllbGQgd2l0aAorICAgICAqIHRoZSBnaXZlbiBhYnNvbHV0ZSBpbmRleC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkJ3MgbWV0YWRhdGEsIG9yIG51bGwgaWYgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0RmllbGQoaW50IGluZGV4KSB7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmaWVsZHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBmaWVsZHNbaW5kZXhdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW50IG9yIHRyYW5zYWN0aW9uYWwgZmllbGQgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWxhdGl2ZSBpbmRleC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkJ3MgbWV0YWRhdGEsIG9yIG51bGwgaWYgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0RGVjbGFyZWRGaWVsZChpbnQgaW5kZXgpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IGdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZmllbGRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZmllbGRzW2luZGV4XTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVudCBvciB0cmFuc2FjdGlvbmFsIGZpZWxkIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkJ3MgbWV0YWRhdGEsIG9yIG51bGwgaWYgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0RmllbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBnZXREZWNsYXJlZEZpZWxkKG5hbWUpOworICAgICAgICBpZiAoZm1kICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZm1kOworICAgICAgICBpZiAoX3N1cEZpZWxkTWFwICE9IG51bGwgJiYgX2RlZlN1cEZpZWxkcykgeworICAgICAgICAgICAgZm1kID0gKEZpZWxkTWV0YURhdGEpIF9zdXBGaWVsZE1hcC5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAoZm1kICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZtZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX3N1cGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbnQgb3IgdHJhbnNhY3Rpb25hbCBmaWVsZCB3aXRoCisgICAgICogdGhlIGdpdmVuIG5hbWUsIHdpdGhvdXQgaW5jbHVkaW5nIHN1cGVyY2xhc3MgZmllbGRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmllbGQncyBtZXRhZGF0YSwgb3IgbnVsbCBpZiBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNZXRhRGF0YSBnZXREZWNsYXJlZEZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZmllbGQgPSAoRmllbGRNZXRhRGF0YSkgX2ZpZWxkTWFwLmdldChuYW1lKTsKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGwgfHwgZmllbGQuZ2V0TWFuYWdlbWVudCgpID09IGZpZWxkLk1BTkFHRV9OT05FKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW55IGZpZWxkcyB0aGF0IHdlcmUgYWRkZWQgYXMgbm9uLW1hbmFnZWQuCisgICAgICogQWxsIG90aGVyIG1ldGhvZHMgdG8gZ2V0IGZpZWxkcyByZXR1cm4gb25seSB0aG9zZSB0aGF0IGFyZSBtYW5hZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhW10gZ2V0RGVjbGFyZWRVbm1hbmFnZWRGaWVsZHMoKSB7CisgICAgICAgIGlmIChfdW5tZ2RGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbiB1bm1hbmFnZWQgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmaWVsZDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2ZpZWxkTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgZmllbGQgPSAoRmllbGRNZXRhRGF0YSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TWFuYWdlbWVudCgpID09IEZpZWxkTWV0YURhdGEuTUFOQUdFX05PTkUpCisgICAgICAgICAgICAgICAgICAgIHVubWFuYWdlZC5hZGQoZmllbGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3VubWdkRmllbGRzID0gKEZpZWxkTWV0YURhdGFbXSkgdW5tYW5hZ2VkLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAoX3JlcG9zLm5ld0ZpZWxkTWV0YURhdGFBcnJheSh1bm1hbmFnZWQuc2l6ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF91bm1nZEZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgZmllbGQgbWV0YWRhdGEgdG8gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNZXRhRGF0YSBhZGREZWNsYXJlZEZpZWxkKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX3JlcG9zLm5ld0ZpZWxkTWV0YURhdGEobmFtZSwgdHlwZSwgdGhpcyk7CisgICAgICAgIGNsZWFyRmllbGRDYWNoZSgpOworICAgICAgICBfZmllbGRNYXAucHV0KG5hbWUsIGZtZCk7CisgICAgICAgIHJldHVybiBmbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBmaWVsZCBmcm9tIG1hbmFnZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVEZWNsYXJlZEZpZWxkKEZpZWxkTWV0YURhdGEgZmllbGQpIHsKKyAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgX2ZpZWxkTWFwLnJlbW92ZShmaWVsZC5nZXROYW1lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsZWFyRmllbGRDYWNoZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCBzdXBlcmNsYXNzIGZpZWxkIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGRNZXRhRGF0YSBnZXREZWZpbmVkU3VwZXJjbGFzc0ZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChfc3VwRmllbGRNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKEZpZWxkTWV0YURhdGEpIF9zdXBGaWVsZE1hcC5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGRlZmluZWQgc3VwZXJjbGFzcyBmaWVsZCBtZXRhZGF0YSB0byB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhIGFkZERlZmluZWRTdXBlcmNsYXNzRmllbGQoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUsCisgICAgICAgIENsYXNzIHN1cCkgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IF9yZXBvcy5uZXdGaWVsZE1ldGFEYXRhKG5hbWUsIHR5cGUsIHRoaXMpOworICAgICAgICBmbWQuc2V0RGVjbGFyaW5nVHlwZShzdXApOworICAgICAgICBjbGVhckFsbEZpZWxkQ2FjaGUoKTsKKyAgICAgICAgX2RlZlN1cEZpZWxkcyA9IGZhbHNlOworICAgICAgICBpZiAoX3N1cEZpZWxkTWFwID09IG51bGwpCisgICAgICAgICAgICBfc3VwRmllbGRNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBfc3VwRmllbGRNYXAucHV0KG5hbWUsIGZtZCk7CisgICAgICAgIHJldHVybiBmbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBmaWVsZCBmcm9tIG1hbmFnZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVEZWZpbmVkU3VwZXJjbGFzc0ZpZWxkKEZpZWxkTWV0YURhdGEgZmllbGQpIHsKKyAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgX3N1cEZpZWxkTWFwICE9IG51bGwKKyAgICAgICAgICAgICYmIF9zdXBGaWVsZE1hcC5yZW1vdmUoZmllbGQuZ2V0TmFtZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGVhckFsbEZpZWxkQ2FjaGUoKTsKKyAgICAgICAgICAgIF9kZWZTdXBGaWVsZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNvcnBvcmF0ZSBzdXBlcmNsYXNzIGZpZWxkcyByZWRlZmluZWQgaW4gdGhpcyBzdWJjbGFzcyBpbnRvIHRoaXMKKyAgICAgKiBtZXRhZGF0YS4gVGhpcyBtZXRob2QgaXMgZ2VuZXJhbGx5IGNhbGxlZCBhZnRlciBtZXRhZGF0YSBpcyByZXNvbHZlZAorICAgICAqIGFuZCBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIGxvYWRlZCwgYnV0IGJlZm9yZSBtYXBwaW5nIHJlc29sdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yY2Ugd2hldGhlciB0byBmb3JjZSByZS1tYXBwaW5nIG9mIGV2ZW4gbWFwcGVkIHN1cGVyY2xhc3MgZmllbGRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmaW5lU3VwZXJjbGFzc0ZpZWxkcyhib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGlmIChfZGVmU3VwRmllbGRzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgaWYgKGlzTWFwcGVkKCkgJiYgc3VwICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHJlZGVmaW5lIGFsbCB1bm1hcHBlZCBzdXBlcmNsYXNzIGZpZWxkcworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIHN1cHMgPSBzdXAuZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZvcmNlIHx8ICFzdXBzW2ldLmdldERlZmluaW5nTWV0YURhdGEoKS5pc01hcHBlZCgpKQorICAgICAgICAgICAgICAgICAgICAmJiBnZXREZWZpbmVkU3VwZXJjbGFzc0ZpZWxkKHN1cHNbaV0uZ2V0TmFtZSgpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZERlZmluZWRTdXBlcmNsYXNzRmllbGQoc3Vwc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdXBzW2ldLmdldERlY2xhcmVkVHlwZSgpLCBzdXBzW2ldLmdldERlY2xhcmluZ1R5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc29sdmVEZWZpbmVkU3VwZXJjbGFzc0ZpZWxkcygpOworCisgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IGFsbCBmaWVsZCBpbmRleGVzIGdldCBzZXQgd2hlbiBmaWVsZHMgYXJlIGNhY2hlZC4KKyAgICAgICAgLy8gSSBkb24ndCBsaWtlIGRvaW5nIHRoaXMgdHdpY2UgKGl0J3MgYWxzbyBkb25lIGluIHJlc29sdmVNZXRhKSwgYnV0CisgICAgICAgIC8vIHdlIGhhdmUgdG8gcmUtY2FjaGUgaW4gY2FzZSB0aGlzIGNsYXNzIG9yIGFueSBzdXBlcmNsYXNzIHJlcGxhY2VkCisgICAgICAgIC8vIHNvbWUgZmllbGRzIHdpdGggcmVkZWZpbmVkIHZlcnNpb25zLCBhbmQgSSBkb24ndCB3YW50IG91dHNpZGUgY29kZQorICAgICAgICAvLyB0byBoYXZlIHRvIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgcmVzb2x2ZSBqdXN0IHRvIGdldCBmaWVsZCBpbmRleGVzLAorICAgICAgICAvLyBldGMgc2V0IGNvcnJlY3RseQorICAgICAgICBjbGVhckFsbEZpZWxkQ2FjaGUoKTsKKyAgICAgICAgY2FjaGVGaWVsZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHN1cGVyY2xhc3MgZmllbGRzIHdlJ3ZlIHJlZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZURlZmluZWRTdXBlcmNsYXNzRmllbGRzKCkgeworICAgICAgICBfZGVmU3VwRmllbGRzID0gdHJ1ZTsKKyAgICAgICAgaWYgKF9zdXBGaWVsZE1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kOworICAgICAgICBGaWVsZE1ldGFEYXRhIHN1cDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfc3VwRmllbGRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGZtZCA9IChGaWVsZE1ldGFEYXRhKSBpdHIubmV4dCgpOworICAgICAgICAgICAgc3VwID0gZ2V0U3VwZXJjbGFzc0ZpZWxkKGZtZCk7CisKKyAgICAgICAgICAgIC8vIGpwYSBtZXRhZGF0YSBkb2Vzbid0IHF1YWxpZnkgc3VwZXJjbGFzcyBmaWVsZCBuYW1lcywgc28gd2UKKyAgICAgICAgICAgIC8vIG1pZ2h0IG5vdCBrbm93IHRoZSBkZWNsYXJpbmcgdHlwZSB1bnRpbCBub3cKKyAgICAgICAgICAgIGlmIChmbWQuZ2V0RGVjbGFyaW5nVHlwZSgpID09IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIGZtZC5zZXREZWNsYXJpbmdUeXBlKHN1cC5nZXREZWNsYXJpbmdUeXBlKCkpOworICAgICAgICAgICAgICAgIGZtZC5iYWNraW5nTWVtYmVyKGdldFJlcG9zaXRvcnkoKS5nZXRNZXRhRGF0YUZhY3RvcnkoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdHMoKS5nZXRCYWNraW5nTWVtYmVyKGZtZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm1kLmNvcHkoc3VwKTsKKyAgICAgICAgICAgIGZtZC5yZXNvbHZlKE1PREVfTUVUQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgZmllbGRzIGRlZmluZWQgYnkgdGhpcyBjbGFzcy4KKyAgICAgKiBUaGlzIGluY2x1ZGVzIG1hcHBlZCBkZWNsYXJlZCBmaWVsZHMgYW5kIGFueSBjb25jcmV0ZSBtYXBwaW5nIG9mCisgICAgICogdW5tYXBwZWQgc3VwZXJjbGFzcyBmaWVsZHMgcGVyZm9ybWVkIGJ5IHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGFbXSBnZXREZWZpbmVkRmllbGRzKCkgeworICAgICAgICBpZiAoX2RlZmluZWRGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IGdldEZpZWxkcygpOworICAgICAgICAgICAgTGlzdCBkZWZpbmVkID0gbmV3IEFycmF5TGlzdChmaWVsZHMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5pc01hcHBlZCgpCisgICAgICAgICAgICAgICAgICAgICYmIGZpZWxkc1tpXS5nZXREZWZpbmluZ01ldGFEYXRhKCkgPT0gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lZC5hZGQoZmllbGRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9kZWZpbmVkRmllbGRzID0gKEZpZWxkTWV0YURhdGFbXSkgZGVmaW5lZC50b0FycmF5CisgICAgICAgICAgICAgICAgKF9yZXBvcy5uZXdGaWVsZE1ldGFEYXRhQXJyYXkoZGVmaW5lZC5zaXplKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2RlZmluZWRGaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgZmllbGRzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIG1ldGFkYXRhCisgICAgICogZmlsZS4gVW5saXN0ZWQgZmllbGRzIGFyZSBwbGFjZWQgYWZ0ZXIgbGlzdGVkIG9uZXMuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGFbXSBnZXRGaWVsZHNJbkxpc3RpbmdPcmRlcigpIHsKKyAgICAgICAgaWYgKF9hbGxMaXN0aW5nRmllbGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNvbWJpbmUgZGVjbGFyZWQgYW5kIHVubWFuYWdlZCBmaWVsZHMgaW50byBsaXN0aW5nIG9yZGVyIGFycmF5CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZGVjID0gZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSB1bm1nZCA9IGdldERlY2xhcmVkVW5tYW5hZ2VkRmllbGRzKCk7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZGVjTGlzdGluZyA9IF9yZXBvcy5uZXdGaWVsZE1ldGFEYXRhQXJyYXkKKyAgICAgICAgICAgICAgICAoZGVjLmxlbmd0aCArIHVubWdkLmxlbmd0aCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRlYywgMCwgZGVjTGlzdGluZywgMCwgZGVjLmxlbmd0aCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHVubWdkLCAwLCBkZWNMaXN0aW5nLCBkZWMubGVuZ3RoLCB1bm1nZC5sZW5ndGgpOworICAgICAgICAgICAgQXJyYXlzLnNvcnQoZGVjTGlzdGluZywgTGlzdGluZ09yZGVyQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpKTsKKworICAgICAgICAgICAgaWYgKF9zdXBlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9hbGxMaXN0aW5nRmllbGRzID0gZGVjTGlzdGluZzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHBsYWNlIHN1cGVyY2xhc3MgZmllbGRzIGluIGxpc3Rpbmcgb3JkZXIgYmVmb3JlIG91cgorICAgICAgICAgICAgICAgIC8vIGxpc3Rpbmctb3JkZXIgZGVjbGFyZWQgZmllbGRzCisgICAgICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIHN1cCA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkuCisgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkc0luTGlzdGluZ09yZGVyKCk7CisgICAgICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGxpc3RpbmcgPSBfcmVwb3MubmV3RmllbGRNZXRhRGF0YUFycmF5CisgICAgICAgICAgICAgICAgICAgIChzdXAubGVuZ3RoICsgZGVjTGlzdGluZy5sZW5ndGgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3VwLCAwLCBsaXN0aW5nLCAwLCBzdXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXBsYWNlRGVmaW5lZFN1cGVyY2xhc3NGaWVsZHMobGlzdGluZywgc3VwLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkZWNMaXN0aW5nLCAwLCBsaXN0aW5nLCBzdXAubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBkZWNMaXN0aW5nLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgX2FsbExpc3RpbmdGaWVsZHMgPSBsaXN0aW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBfYWxsTGlzdGluZ0ZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBmaWVsZHMgZGVmaW5lZCBieSB0aGlzIGNsYXNzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBsaXN0ZWQKKyAgICAgKiBpbiB0aGUgbWV0YWRhdGEgZmlsZS4gVW5saXN0ZWQgZmllbGRzIGFyZSBwbGFjZWQgYWZ0ZXIgbGlzdGVkIG9uZXMuCisgICAgICogVGhpcyBhcnJheSBpbmNsdWRlcyBkZWNsYXJlZCB0cmFuc2FjdGlvbmFsIGFuZCB1bm1hbmFnZWQgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhW10gZ2V0RGVmaW5lZEZpZWxkc0luTGlzdGluZ09yZGVyKCkgeworICAgICAgICBpZiAoX2xpc3RpbmdGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IGdldEZpZWxkcygpOworICAgICAgICAgICAgTGlzdCBkZWZpbmVkID0gbmV3IEFycmF5TGlzdChmaWVsZHMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0RGVmaW5pbmdNZXRhRGF0YSgpID09IHRoaXMpCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuYWRkKGZpZWxkc1tpXSk7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gdW5tZ2QgPSBnZXREZWNsYXJlZFVubWFuYWdlZEZpZWxkcygpOworICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIGxpc3RpbmcgPSBfcmVwb3MubmV3RmllbGRNZXRhRGF0YUFycmF5CisgICAgICAgICAgICAgICAgKGRlZmluZWQuc2l6ZSgpICsgdW5tZ2QubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5lZC5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBsaXN0aW5nW2ldID0gKEZpZWxkTWV0YURhdGEpIGRlZmluZWQuZ2V0KGkpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh1bm1nZCwgMCwgbGlzdGluZywgZGVmaW5lZC5zaXplKCksIHVubWdkLmxlbmd0aCk7CisgICAgICAgICAgICBBcnJheXMuc29ydChsaXN0aW5nLCBMaXN0aW5nT3JkZXJDb21wYXJhdG9yLmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgX2xpc3RpbmdGaWVsZHMgPSBsaXN0aW5nOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbGlzdGluZ0ZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGF0YWNhY2hlIHRvIHVzZSBmb3IgdGhpcyBjbGFzcywgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YUNhY2hlTmFtZSgpIHsKKyAgICAgICAgaWYgKERFRkFVTFRfU1RSSU5HLmVxdWFscyhfY2FjaGVOYW1lKSkgeworICAgICAgICAgICAgaWYgKF9zdXBlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9jYWNoZU5hbWUgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmdldERhdGFDYWNoZU5hbWUoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfY2FjaGVOYW1lID0gRGF0YUNhY2hlLk5BTUVfREVGQVVMVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NhY2hlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhY2hlIG5hbWUgZm9yIHRoaXMgY2xhc3MuIFNldCB0byBudWxsIHRvIGRpc2FibGUgY2FjaGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhQ2FjaGVOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIF9jYWNoZU5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZSB0aW1lb3V0IGZvciB0aGlzIGNsYXNzLiAtMSBpbmRpY2F0ZXMgbm8gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERhdGFDYWNoZVRpbWVvdXQoKSB7CisgICAgICAgIGlmIChfY2FjaGVUaW1lb3V0ID09IEludGVnZXIuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAoX3N1cGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2NhY2hlVGltZW91dCA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkuCisgICAgICAgICAgICAgICAgICAgIGdldERhdGFDYWNoZVRpbWVvdXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfY2FjaGVUaW1lb3V0ID0gX3JlcG9zLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUNhY2hlVGltZW91dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfY2FjaGVUaW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZSB0aW1lb3V0IGZvciB0aGlzIGNsYXNzLiAtMSBpbmRpY2F0ZXMgbm8gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhQ2FjaGVUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgICAgIF9jYWNoZVRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGF0YSBjYWNoZSBmb3IgdGhpcyBjbGFzcywgb3IgbnVsbCBpZiBpdCBpcyBub3QgY2FjaGFibGUuCisgICAgICovCisgICAgcHVibGljIERhdGFDYWNoZSBnZXREYXRhQ2FjaGUoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0RGF0YUNhY2hlTmFtZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBfcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLmdldERhdGFDYWNoZU1hbmFnZXJJbnN0YW5jZSgpLgorICAgICAgICAgICAgZ2V0RGF0YUNhY2hlKG5hbWUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgaW5zdGFuY2VzIGFyZSBkZXRhY2hhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoYWJsZSgpIHsKKyAgICAgICAgaWYgKF9kZXRhY2hhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfc3VwZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZGV0YWNoYWJsZSA9IChnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmlzRGV0YWNoYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2RldGFjaGFibGUgPSBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZGV0YWNoYWJsZS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGluc3RhbmNlcyBhcmUgZGV0YWNoYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hhYmxlKGJvb2xlYW4gZGV0YWNoYWJsZSkgeworICAgICAgICBfZGV0YWNoYWJsZSA9IChkZXRhY2hhYmxlKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGRldGFjaCBzdGF0ZSBmaWVsZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWNoZWRTdGF0ZSgpIHsKKyAgICAgICAgaWYgKERFRkFVTFRfU1RSSU5HLmVxdWFscyhfZGV0YWNoU3RhdGUpKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIHN1cCA9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgc3VwLmlzRGV0YWNoYWJsZSgpID09IGlzRGV0YWNoYWJsZSgpKQorICAgICAgICAgICAgICAgIF9kZXRhY2hTdGF0ZSA9IHN1cC5nZXREZXRhY2hlZFN0YXRlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBCb29sZWFuIHVzZSA9IHVzZXNEZXRhY2hlZFN0YXRlKFNZTlRIRVRJQywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgX2RldGFjaFN0YXRlID0gKEJvb2xlYW4uRkFMU0UuZXF1YWxzKHVzZSkpID8gbnVsbCA6IFNZTlRIRVRJQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2RldGFjaFN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkZXRhY2ggc3RhdGUgZmllbGQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hlZFN0YXRlKFN0cmluZyBmaWVsZCkgeworICAgICAgICBfZGV0YWNoU3RhdGUgPSBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRldGFjaCBzdGF0ZSBmaWVsZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZCBnZXREZXRhY2hlZFN0YXRlRmllbGQoKSB7CisgICAgICAgIC8vIG5vIGNhY2hpbmc7IG9ubHkgdXNlZCBhdCBlbmhhbmNlbWVudAorICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gZ2V0RGV0YWNoZWRTdGF0ZSgpOworICAgICAgICBpZiAoZmllbGROYW1lID09IG51bGwgfHwgU1lOVEhFVElDLmVxdWFscyhmaWVsZE5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgRmllbGQgZiA9IFJlZmxlY3Rpb24uZmluZEZpZWxkKF90eXBlLCBmaWVsZE5hbWUsIGZhbHNlKTsKKyAgICAgICAgaWYgKGYgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgX2xvYy5nZXQoIm5vLWRldGFjaC1zdGF0ZSIsIGZpZWxkTmFtZSwgX3R5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBoYXMgZGV0YWNoZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBkZXRhY2hlZCBpbnN0YW5jZSBtdXN0IGhhdmUgZGV0YWNoZWQgc3RhdGUsIGZhbHNlCisgICAgICogaWYgaXQgZG9lcyBub3QsIGFuZCBudWxsIGlmIGl0IG1heSB1c2UgYQorICAgICAqIG1hbnVhbGx5LWNvbnN0cnVjdGVkIGluc3RhbmNlIHdpdGhvdXQgZGV0YWNoZWQgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhbiB1c2VzRGV0YWNoZWRTdGF0ZSgpIHsKKyAgICAgICAgLy8gbm8gbmVlZCB0byBsZXQgY29uZiBkaXNhbGxvdyBiZWNhdXNlIGl0J3MgdGFrZW4gaW50byBhY2NvdW50IGluCisgICAgICAgIC8vIGdldERldGFjaGVkU3RhdGUoKSBjYWxsCisgICAgICAgIHJldHVybiB1c2VzRGV0YWNoZWRTdGF0ZShnZXREZXRhY2hlZFN0YXRlKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBoYXMgZGV0YWNoZWQgc3RhdGUsIGFzc3VtaW5nIHRoZSBnaXZlbgorICAgICAqIGRldGFjaGVkIHN0YXRlIGZpZWxkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgZGV0YWNoZWQgaW5zdGFuY2UgbXVzdCBoYXZlIGRldGFjaGVkIHN0YXRlLCBmYWxzZQorICAgICAqIGlmIGl0IGRvZXMgbm90LCBhbmQgbnVsbCBpZiBpdCBtYXkgdXNlIGEKKyAgICAgKiBtYW51YWxseS1jb25zdHJ1Y3RlZCBpbnN0YW5jZSB3aXRob3V0IGRldGFjaGVkIHN0YXRlCisgICAgICovCisgICAgcHJpdmF0ZSBCb29sZWFuIHVzZXNEZXRhY2hlZFN0YXRlKFN0cmluZyBkZXRhY2hlZEZpZWxkLAorICAgICAgICBib29sZWFuIGNvbmZEaXNhbGxvd3MpIHsKKyAgICAgICAgaWYgKCFpc0RldGFjaGFibGUoKSkKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworCisgICAgICAgIC8vIGlmIHdlIGRlY2xhcmUgYSBkZXRhY2hlZCBzdGF0ZSBmaWVsZCwgaGF2ZSB0byB1c2UgaXQKKyAgICAgICAgaWYgKGRldGFjaGVkRmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICBpZiAoIVNZTlRIRVRJQy5lcXVhbHMoZGV0YWNoZWRGaWVsZCkpCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworCisgICAgICAgIC8vIGFsbG93IGNvbmYgdG8gZGlzYWxsb3cKKyAgICAgICAgaWYgKGNvbmZEaXNhbGxvd3MgJiYgIV9yZXBvcy5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXREZXRhY2hTdGF0ZUluc3RhbmNlKCkuZ2V0RGV0YWNoZWRTdGF0ZUZpZWxkKCkpCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKworICAgICAgICAvLyBoYXZlIHRvIHVzZSBkZXRhY2hlZCBzdGF0ZSB0byBzdG9yZSBkYXRhc3RvcmUgaWQKKyAgICAgICAgaWYgKGdldElkZW50aXR5VHlwZSgpID09IElEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisKKyAgICAgICAgLy8gYWxsb3cgZGV0YWNoZWQgc3RhdGUgdXNlLCBidXQgZG9uJ3QgcmVxdWlyZQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBjYWNoZWQgZmllbGQgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhckFsbEZpZWxkQ2FjaGUoKSB7CisgICAgICAgIF9hbGxGaWVsZHMgPSBudWxsOworICAgICAgICBfYWxsREZHRmllbGRzID0gbnVsbDsKKyAgICAgICAgX2FsbFBLRmllbGRzID0gbnVsbDsKKyAgICAgICAgX2RlZmluZWRGaWVsZHMgPSBudWxsOworICAgICAgICBfbGlzdGluZ0ZpZWxkcyA9IG51bGw7CisgICAgICAgIF9hbGxMaXN0aW5nRmllbGRzID0gbnVsbDsKKyAgICAgICAgX2ZpZWxkRGF0YVRhYmxlID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBkZWZpbmVkIGZpZWxkIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJEZWZpbmVkRmllbGRDYWNoZSgpIHsKKyAgICAgICAgX2RlZmluZWRGaWVsZHMgPSBudWxsOworICAgICAgICBfbGlzdGluZ0ZpZWxkcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgY2FjaGVkIGZpZWxkIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJGaWVsZENhY2hlKCkgeworICAgICAgICBjbGVhckFsbEZpZWxkQ2FjaGUoKTsKKyAgICAgICAgX2ZpZWxkcyA9IG51bGw7CisgICAgICAgIF91bm1nZEZpZWxkcyA9IG51bGw7CisgICAgICAgIF92ZXJzaW9uSWR4ID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgY2FjaGVkIHN1YmNsYXNzIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJTdWJjbGFzc0NhY2hlKCkgeworICAgICAgICBfc3VicyA9IG51bGw7CisgICAgICAgIF9zdWJNZXRhcyA9IG51bGw7CisgICAgICAgIF9tYXBTdWJNZXRhcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgaW1wbCBkYXRhIGFuZCBpbnRlcm1lZGlhdGUgZGF0YSB0YWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyRXh0cmFGaWVsZERhdGFUYWJsZSgpIHsKKyAgICAgICAgX2ZpZWxkRGF0YVRhYmxlID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBmaWVsZCBhcnJheXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhY2hlRmllbGRzKCkgeworICAgICAgICBnZXRGaWVsZHMoKTsKKyAgICAgICAgZ2V0UHJpbWFyeUtleUZpZWxkcygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZS5nZXROYW1lKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgQ2xhc3NNZXRhRGF0YSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfdHlwZSA9PSAoKENsYXNzTWV0YURhdGEpIG90aGVyKS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBfdHlwZS5nZXROYW1lKCkuY29tcGFyZVRvKCgoQ2xhc3NNZXRhRGF0YSkgb3RoZXIpLgorICAgICAgICAgICAgZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gUmVzb2x2ZSBhbmQgdmFsaWRhdGUKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFRoZSByZXNvbHZlIG1vZGUgZm9yIHRoaXMgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gX3Jlc01vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlc29sdmUgbW9kZSBmb3IgdGhpcyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlKGludCBtb2RlKSB7CisgICAgICAgIF9yZXNNb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb2x2ZSBtb2RlIGZvciB0aGlzIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmUoaW50IG1vZGUsIGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9OT05FKQorICAgICAgICAgICAgX3Jlc01vZGUgPSBtb2RlOworICAgICAgICBlbHNlIGlmIChvbikKKyAgICAgICAgICAgIF9yZXNNb2RlIHw9IG1vZGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9yZXNNb2RlICY9IH5tb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYW5kIHZhbGlkYXRlIG1ldGFkYXRhLiBSZXR1cm4gdHJ1ZSBpZiBhbHJlYWR5IHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc29sdmUoaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKChfcmVzTW9kZSAmIG1vZGUpID09IG1vZGUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaW50IGN1ciA9IF9yZXNNb2RlOworICAgICAgICBfcmVzTW9kZSB8PSBtb2RlOworCisgICAgICAgIGludCB2YWwgPSBfcmVwb3MuZ2V0VmFsaWRhdGUoKTsKKyAgICAgICAgYm9vbGVhbiBydW50aW1lID0gKHZhbCAmIF9yZXBvcy5WQUxJREFURV9SVU5USU1FKSAhPSAwOworICAgICAgICBib29sZWFuIHZhbGlkYXRlID0gIVBlcnNpc3RlbmNlQ2FwYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKF90eXBlKQorICAgICAgICAgICAgfHwgKHZhbCAmIE1ldGFEYXRhUmVwb3NpdG9yeS5WQUxJREFURV9VTkVOSEFOQ0VEKSA9PSAwOworCisgICAgICAgIC8vIHdlIG9ubHkgZG8gYW55IGFjdGlvbnMgZm9yIG1ldGFkYXRhIG1vZGUKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NRVRBKSAhPSAwICYmIChjdXIgJiBNT0RFX01FVEEpID09IDApIHsKKyAgICAgICAgICAgIHJlc29sdmVNZXRhKHJ1bnRpbWUpOworICAgICAgICAgICAgaWYgKHZhbGlkYXRlICYmICh2YWwgJiBfcmVwb3MuVkFMSURBVEVfTUVUQSkgIT0gMCkKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZU1ldGEocnVudGltZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwICYmIChjdXIgJiBNT0RFX01BUFBJTkcpID09IDApIHsKKyAgICAgICAgICAgIHJlc29sdmVNYXBwaW5nKHJ1bnRpbWUpOworICAgICAgICAgICAgaWYgKHZhbGlkYXRlICYmICh2YWwgJiBfcmVwb3MuVkFMSURBVEVfTUFQUElORykgIT0gMCkKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZU1hcHBpbmcocnVudGltZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NQVBQSU5HX0lOSVQpICE9IDAgJiYgKGN1ciAmIE1PREVfTUFQUElOR19JTklUKSA9PSAwKQorICAgICAgICAgICAgaW5pdGlhbGl6ZU1hcHBpbmcoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbWV0YWRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZU1ldGEoYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIGJvb2xlYW4gZW1iZWQgPSBfb3duZXIgIT0gbnVsbCAmJiBfb3duZXIuZ2V0RGVjbGFyZWRUeXBlKCkgPT0gX3R5cGU7CisgICAgICAgIExvZyBsb2cgPSBfcmVwb3MuZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgoZW1iZWQpID8gInJlc29sdmUtZW1iZWQtbWV0YSIgOiAicmVzb2x2ZS1tZXRhIiwKKyAgICAgICAgICAgICAgICB0aGlzICsgIkAiICsgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpKTsKKworICAgICAgICBpZiAocnVudGltZSAmJiAhX3R5cGUuaXNJbnRlcmZhY2UoKSAmJiAKKyAgICAgICAgICAgICFQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShfdHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1lbmhhbmNlZCIsIF90eXBlKSk7CisKKyAgICAgICAgLy8gYXJlIHdlIHRoZSB0YXJnZXQgb2YgYW4gZW1iZWRkZWQgdmFsdWU/CisgICAgICAgIGlmIChlbWJlZCkgeworICAgICAgICAgICAgaWYgKF9vd25lci5nZXRGaWVsZE1ldGFEYXRhKCkuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLgorICAgICAgICAgICAgICAgIGdldERlc2NyaWJlZFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKF90eXBlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoInJlY3Vyc2UtZW1iZWQiLCBfb3duZXIpKTsKKworICAgICAgICAgICAgLy8gY29weSBpbmZvIGZyb20gdGhlICJyZWFsIiBtZXRhZGF0YSBmb3IgdGhpcyB0eXBlCisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfcmVwb3MuZ2V0TWV0YURhdGEoX3R5cGUsIF9sb2FkZXIsIHRydWUpOworICAgICAgICAgICAgbWV0YS5yZXNvbHZlKE1PREVfTUVUQSk7CisgICAgICAgICAgICBjb3B5KHRoaXMsIG1ldGEpOworICAgICAgICAgICAgX2VtYmVkZGVkID0gQm9vbGVhbi5GQUxTRTsgLy8gZW1iZWRkZWQgaW5zdGFuY2UgaXNuJ3QgZW1iZWRkZWQtb25seQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHN1cGVyY2xhc3MgaXMgcmVzb2x2ZWQKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICBpZiAoc3VwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1cC5yZXNvbHZlKE1PREVfTUVUQSk7CisgICAgICAgICAgICBpZiAoZW1iZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBlbWJlZGRlZCBpbnN0YW5jZSBhbHdheXMgcmVkZWZpbmUgYWxsIHN1cGVyY2xhc3MgZmllbGRzCisgICAgICAgICAgICAgICAgRmllbGRNZXRhRGF0YVtdIHN1cHMgPSBzdXAuZ2V0RmllbGRzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfc3VwRmllbGRNYXAgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIV9zdXBGaWVsZE1hcC5jb250YWluc0tleShzdXBzW2ldLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlZmluZWRTdXBlcmNsYXNzRmllbGQoc3Vwc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vwc1tpXS5nZXREZWNsYXJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBzW2ldLmdldERlY2xhcmluZ1R5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXNvbHZlIGZpZWxkcyBhbmQgcmVtb3ZlIGludmFsaWRzCisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9maWVsZE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgLy8gb25seSBwYXNzIG9uIG1ldGFkYXRhIHJlc29sdmUgbW9kZSBzbyB0aGF0IG1ldGFkYXRhIGlzIGFsd2F5cworICAgICAgICAgICAgLy8gcmVzb2x2ZWQgYmVmb3JlIGFueSBvdGhlciByZXNvbHZlIG1vZGVzIG91ciBzdWJjbGFzc2VzIHBhc3MgYWxvbmcKKyAgICAgICAgICAgIGZtZCA9IChGaWVsZE1ldGFEYXRhKSBpdHIubmV4dCgpOworICAgICAgICAgICAgZm1kLnJlc29sdmUoTU9ERV9NRVRBKTsKKworICAgICAgICAgICAgaWYgKCFmbWQuaXNFeHBsaWNpdCgpCisgICAgICAgICAgICAgICAgJiYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLk9CSkVDVAorICAgICAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDX1VOVFlQRUQKKyAgICAgICAgICAgICAgICB8fCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuQVJSQVkKKyAgICAgICAgICAgICAgICAmJiBmbWQuZ2V0RWxlbWVudCgpLmdldERlY2xhcmVkVHlwZUNvZGUoKQorICAgICAgICAgICAgICAgID09IEphdmFUeXBlcy5PQkpFQ1QpKSkgeworICAgICAgICAgICAgICAgIF9yZXBvcy5nZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJybS1maWVsZCIsIGZtZCkpOworICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0TGlzdGluZ0luZGV4KCkgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGZtZC5zZXRNYW5hZ2VtZW50KGZtZC5NQU5BR0VfTk9ORSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgY2xlYXJGaWVsZENhY2hlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBlbWJlZGRlZCBpbnN0YW5jZXMgbXVzdCBlbWJlZCBhbGwgc3VwZXJjbGFzcyBmaWVsZHMgdG9vCisgICAgICAgIGlmIChlbWJlZCkgeworICAgICAgICAgICAgY2xlYXJBbGxGaWVsZENhY2hlKCk7CisgICAgICAgICAgICByZXNvbHZlRGVmaW5lZFN1cGVyY2xhc3NGaWVsZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IGFsbCBmaWVsZCBpbmRleGVzIGdldCBzZXQgd2hlbiBmaWVsZHMgYXJlIGNhY2hlZAorICAgICAgICBjYWNoZUZpZWxkcygpOworCisgICAgICAgIC8vIHJlc29sdmUgbGlmZWN5Y2xlIG1ldGFkYXRhIG5vdyB0byBwcmV2ZW50IGxhenkgdGhyZWFkaW5nIHByb2JsZW1zCisgICAgICAgIF9saWZlTWV0YS5yZXNvbHZlKCk7CisKKyAgICAgICAgLy8gcmVjb3JkIGltcGxlbWVudHMgaW4gdGhlIHJlcG9zaXRvcnkKKyAgICAgICAgaWYgKF9pbnRlcmZhY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfaW50ZXJmYWNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgIF9yZXBvcy5hZGREZWNsYXJlZEludGVyZmFjZUltcGwodGhpcywgKENsYXNzKSBpdC5uZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzb2x2ZSBmZXRjaCBncm91cHMKKyAgICAgICAgaWYgKF9mZ01hcCAhPSBudWxsKQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfZmdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgKChGZXRjaEdyb3VwKSBpdHIubmV4dCgpKS5yZXNvbHZlKCk7CisKKyAgICAgICAgaWYgKCFlbWJlZCAmJiBfdHlwZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBpZiAoX2ludGVyZmFjZSAhPSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbnRlcmZhY2UiLCBfdHlwZSkpOworCisgICAgICAgICAgICBpZiAocnVudGltZSkgeworICAgICAgICAgICAgICAgIF9pbXBsID0gX3JlcG9zLmdldEltcGxHZW5lcmF0b3IoKS5jcmVhdGVJbXBsKHRoaXMpOworICAgICAgICAgICAgICAgIF9yZXBvcy5zZXRJbnRlcmZhY2VJbXBsKHRoaXMsIF9pbXBsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoaXMgaXMgcnVudGltZSwgY3JlYXRlIGEgcGMgaW5zdGFuY2UgYW5kIHNjYW4gaXQgZm9yIGNvbXBhcmF0b3JzCisgICAgICAgIGlmIChydW50aW1lICYmICFNb2RpZmllci5pc0Fic3RyYWN0KF90eXBlLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgUHJveHlTZXR1cFN0YXRlTWFuYWdlciBzbSA9IG5ldyBQcm94eVNldHVwU3RhdGVNYW5hZ2VyKCk7CisgICAgICAgICAgICBzbS5zZXRQcm94eURhdGEoUENSZWdpc3RyeS5uZXdJbnN0YW5jZShfdHlwZSwgc20sIGZhbHNlKSwgdGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSByZXNvbHZlZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGEoYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIHZhbGlkYXRlRGF0YUNhY2hlKCk7CisgICAgICAgIHZhbGlkYXRlRGV0YWNoYWJsZSgpOworICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvbktleXMoKTsKKyAgICAgICAgdmFsaWRhdGVJZGVudGl0eShydW50aW1lKTsKKyAgICAgICAgdmFsaWRhdGVBY2Nlc3NUeXBlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBtYXBwaW5nIGRhdGEuIExvZ3MgcmVzb2x2ZSBtZXNzYWdlIGFuZCByZXNvbHZlcyBzdXBlciBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlc29sdmVNYXBwaW5nKGJvb2xlYW4gcnVudGltZSkgeworICAgICAgICBMb2cgbG9nID0gX3JlcG9zLmdldExvZygpOworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInJlc29sdmUtbWFwcGluZyIsIHRoaXMgKyAiQCIKKyAgICAgICAgICAgICAgICArIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHN1cGVyY2xhc3MgaXMgcmVzb2x2ZWQgZmlyc3QKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICBpZiAoc3VwICE9IG51bGwpCisgICAgICAgICAgICBzdXAucmVzb2x2ZShNT0RFX01BUFBJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIG1hcHBpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHBpbmcoYm9vbGVhbiBydW50aW1lKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBtYXBwaW5nLiBMb2dzIGluaXQgbWVzc2FnZSBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwaW5nKCkgeworICAgICAgICBMb2cgbG9nID0gX3JlcG9zLmdldExvZygpOworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoImluaXQtbWFwcGluZyIsIHRoaXMgKyAiQCIKKyAgICAgICAgICAgICAgICArIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgZGF0YSBjYWNoZSBzZXR0aW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVEYXRhQ2FjaGUoKSB7CisgICAgICAgIGludCB0aW1lb3V0ID0gZ2V0RGF0YUNhY2hlVGltZW91dCgpOworICAgICAgICBpZiAodGltZW91dCA8IC0xIHx8IHRpbWVvdXQgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiY2FjaGUtdGltZW91dC1pbnZhbGlkIiwKKyAgICAgICAgICAgICAgICBfdHlwZSwgU3RyaW5nLnZhbHVlT2YodGltZW91dCkpKTsKKworICAgICAgICBpZiAoX3N1cGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBjYWNoZSA9IGdldERhdGFDYWNoZU5hbWUoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHN1cGVyQ2FjaGUgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmdldERhdGFDYWNoZU5hbWUoKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5lcXVhbHMoY2FjaGUsIHN1cGVyQ2FjaGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJjYWNoZS1uYW1lcyIsIG5ldyBPYmplY3RbXQorICAgICAgICAgICAgICAgIHsgX3R5cGUsIGNhY2hlLCBfc3VwZXIsIHN1cGVyQ2FjaGUgfSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBpZGVudGl0eSBoYW5kbGluZyBmb3IgdGhpcyBjbGFzcyBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVJZGVudGl0eShib29sZWFuIHJ1bnRpbWUpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGlkZW50aXR5IHR5cGVzIGFyZSBjb25zaXN0ZW50CisgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgaW50IGlkID0gZ2V0SWRlbnRpdHlUeXBlKCk7CisgICAgICAgIGlmIChzdXAgIT0gbnVsbCAmJiBzdXAuZ2V0SWRlbnRpdHlUeXBlKCkgIT0gSURfVU5LTk9XTgorICAgICAgICAgICAgJiYgc3VwLmdldElkZW50aXR5VHlwZSgpICE9IGlkKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJpZC10eXBlcyIsIF90eXBlKSk7CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIHRoaW5ncyB0aGUgZGF0YSBzdG9yZSBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgQ29sbGVjdGlvbiBvcHRzID0gX3JlcG9zLmdldENvbmZpZ3VyYXRpb24oKS5zdXBwb3J0ZWRPcHRpb25zKCk7CisgICAgICAgIGlmIChpZCA9PSBJRF9BUFBMSUNBVElPTgorICAgICAgICAgICAgJiYgIW9wdHMuY29udGFpbnMoT3BlbkpQQUNvbmZpZ3VyYXRpb24uT1BUSU9OX0lEX0FQUExJQ0FUSU9OKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJhcHBpZC1ub3Qtc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICBfdHlwZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpZCA9PSBJRF9EQVRBU1RPUkUKKyAgICAgICAgICAgICYmICFvcHRzLmNvbnRhaW5zKE9wZW5KUEFDb25maWd1cmF0aW9uLk9QVElPTl9JRF9EQVRBU1RPUkUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAoImRhdGFzdG9yZWlkLW5vdC1zdXBwb3J0ZWQiLCBfdHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlkID09IElEX0FQUExJQ0FUSU9OKSB7CisgICAgICAgICAgICBpZiAoX2lkU3RyYXRlZ3kgIT0gVmFsdWVTdHJhdGVnaWVzLk5PTkUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJhcHBpZC1zdHJhdGVneSIsIF90eXBlKSk7CisgICAgICAgICAgICB2YWxpZGF0ZUFwcElkQ2xhc3MocnVudGltZSk7CisgICAgICAgIH0gZWxzZSBpZiAoaWQgIT0gSURfVU5LTk9XTikKKyAgICAgICAgICAgIHZhbGlkYXRlTm9QS0ZpZWxkcygpOworCisgICAgICAgIGludCBzdHJhdGVneSA9IGdldElkZW50aXR5U3RyYXRlZ3koKTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFZhbHVlU3RyYXRlZ2llcy5TRVFVRU5DRQorICAgICAgICAgICAgJiYgZ2V0SWRlbnRpdHlTZXF1ZW5jZU5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1zZXEtbmFtZSIsIF90eXBlKSk7CisKKyAgICAgICAgVmFsdWVTdHJhdGVnaWVzLmFzc2VydFN1cHBvcnRlZChzdHJhdGVneSwgdGhpcywKKyAgICAgICAgICAgICJkYXRhc3RvcmUgaWRlbnRpdHkgc3RyYXRlZ3kiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzIGlzIHZhbGlkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUFwcElkQ2xhc3MoYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIC8vIGJhc2UgdHlwZXMgbXVzdCBkZWNsYXJlIGFuIG9pZCBjbGFzcyBpZiBub3Qgc2luZ2xlLWZpZWxkIGlkZW50aXR5CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBwa3MgPSBnZXRQcmltYXJ5S2V5RmllbGRzKCk7CisgICAgICAgIGlmIChnZXRPYmplY3RJZFR5cGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGtzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgidW5zdXBwb3J0ZWQtaWQtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIF90eXBlLCBwa3NbMF0uZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBwa3NbMF0uZ2V0RGVjbGFyZWRUeXBlKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWlkLWNsYXNzIiwgX3R5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX29iamVjdElkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGlzT3BlbkpQQUlkZW50aXR5KCkpIHsKKyAgICAgICAgICAgIGlmIChwa3NbMF0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PSUQpIHsKKyAgICAgICAgICAgICAgICBDbGFzc01ldGFEYXRhIGVtYmVkID0gcGtzWzBdLmdldEVtYmVkZGVkTWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUFwcElkQ2xhc3NNZXRob2RzKGVtYmVkLmdldERlc2NyaWJlZFR5cGUoKSk7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVBcHBJZENsYXNzUEtzKGVtYmVkLCBlbWJlZC5nZXRGaWVsZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgZW1iZWQuZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfc3VwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY29uY3JldGUgc3VwZXJjbGFzcyBvaWRzIG11c3QgbWF0Y2ggb3IgYmUgcGFyZW50IG9mIG91cnMKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgICAgIGlmICghc3VwLmdldE9iamVjdElkVHlwZSgpLmlzQXNzaWduYWJsZUZyb20oX29iamVjdElkKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImlkLWNsYXNzZXMiLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IF90eXBlLCBfb2JqZWN0SWQsIF9zdXBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cC5nZXRPYmplY3RJZFR5cGUoKSB9KSk7CisKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgbm8gb3RoZXIgcGtzIGFyZSBkZWNsYXJlZCBpZiB3ZSBoYXZlIGEKKyAgICAgICAgICAgIC8vIGNvbmNyZXRlIFBDIHN1cGVyY2xhc3MKKyAgICAgICAgICAgIGlmIChoYXNDb25jcmV0ZVBDU3VwZXJjbGFzcygpKQorICAgICAgICAgICAgICAgIHZhbGlkYXRlTm9QS0ZpZWxkcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhpcyBjbGFzcyBoYXMgaXRzIG93biBvaWQgY2xhc3MsIGRvIHNvbWUgbW9yZSB2YWxpZGF0aW9uCisgICAgICAgIGlmIChfc3VwZXIgPT0gbnVsbAorICAgICAgICAgICAgfHwgX29iamVjdElkICE9IGdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCkuZ2V0T2JqZWN0SWRUeXBlKCkpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBub24tYWJzdHJhY3Qgb2lkIGNsYXNzZXMgb3ZlcnJpZGUgdGhlIHByb3BlciBtZXRob2RzCisgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QoX29iamVjdElkLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUFwcElkQ2xhc3NNZXRob2RzKF9vYmplY3RJZCk7CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYXBwIGlkIGNsYXNzIGhhcyBhbGwgcGsgZmllbGRzCisgICAgICAgICAgICB2YWxpZGF0ZUFwcElkQ2xhc3NQS3ModGhpcywgcGtzLCBfb2JqZWN0SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBjbGFzcyBoYXMgYSBjb25jcmV0ZSBwZXJzaXN0ZW50IHN1cGVyY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbmNyZXRlUENTdXBlcmNsYXNzKCkgeworICAgICAgICBpZiAoX3N1cGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChfc3VwZXIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmhhc0NvbmNyZXRlUENTdXBlcmNsYXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgdGhlIHVzZXIgaGFzIG92ZXJyaWRkZW4gdGhlIGVxdWFscyBhbmQgaGFzaENvZGUgbWV0aG9kcywKKyAgICAgKiBhbmQgaGFzIHRoZSBwcm9wZXIgY29uc3RydWN0b3JzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUFwcElkQ2xhc3NNZXRob2RzKENsYXNzIG9pZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2lkLmdldENvbnN0cnVjdG9yKChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibnVsbC1jb25zIiwgX3R5cGUpKS4KKyAgICAgICAgICAgICAgICBzZXRDYXVzZShlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBlcXVhbHMgYW5kIGhhc2hjb2RlIG92ZXJyaWRlczsgZG9uJ3QgZW5mb3JjZSBpdAorICAgICAgICAvLyBmb3IgYWJzdHJhY3QgYXBwIGlkIGNsYXNzZXMsIHNpbmNlIHRoZXkgbWF5IG5vdCBuZWNlc3NhcmlseQorICAgICAgICAvLyBkZWNsYXJlIHByaW1hcnkga2V5IGZpZWxkcworICAgICAgICBNZXRob2QgbWV0aG9kOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0aG9kID0gb2lkLmdldE1ldGhvZCgiZXF1YWxzIiwgbmV3IENsYXNzW117IE9iamVjdC5jbGFzcyB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpLnNldEZhdGFsKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBhYnMgPSBNb2RpZmllci5pc0Fic3RyYWN0KF90eXBlLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgaWYgKCFhYnMgJiYgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJlcS1tZXRob2QiLCBfdHlwZSkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtZXRob2QgPSBvaWQuZ2V0TWV0aG9kKCJoYXNoQ29kZSIsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpLnNldEZhdGFsKHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmICghYWJzICYmIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiaGMtbWV0aG9kIiwgX3R5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBwcmltYXJ5IGtleSBjbGFzcyBoYXMgYWxsIHBrIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVBcHBJZENsYXNzUEtzKENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMsIENsYXNzIG9pZCkgeworICAgICAgICBpZiAoZm1kcy5sZW5ndGggPT0gMCAmJiAhTW9kaWZpZXIuaXNBYnN0cmFjdChtZXRhLmdldERlc2NyaWJlZFR5cGUoKS4KKyAgICAgICAgICAgIGdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tcGsiLCBfdHlwZSkpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIG9pZCB0eXBlIGNvbnRhaW5zIGFsbCBwayBmaWVsZHMKKyAgICAgICAgRmllbGQgZjsKKyAgICAgICAgTWV0aG9kIG07CisgICAgICAgIENsYXNzIGM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBjID0gZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IGJ5dGUuY2xhc3MgfHwgYyA9PSBCeXRlLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBjID09IGNoYXIuY2xhc3MgfHwgYyA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBubyBicmVhaworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDX1VOVFlQRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOiAvLyB3ZSdyZSB2YWxpZGF0aW5nIGVtYmVkZGVkIGZpZWxkcworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1way10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0pKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjID0gZm1kc1tpXS5nZXRPYmplY3RJZEZpZWxkVHlwZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWV0YS5nZXRBY2Nlc3NUeXBlKCkgPT0gQUNDRVNTX0ZJRUxEKSB7CisgICAgICAgICAgICAgICAgZiA9IFJlZmxlY3Rpb24uZmluZEZpZWxkKG9pZCwgZm1kc1tpXS5nZXROYW1lKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSBudWxsIHx8ICFmLmdldFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKGMpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImludmFsaWQtaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX3R5cGUsIGZtZHNbaV0uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGEuZ2V0QWNjZXNzVHlwZSgpID09IEFDQ0VTU19QUk9QRVJUWSkgeworICAgICAgICAgICAgICAgIG0gPSBSZWZsZWN0aW9uLmZpbmRHZXR0ZXIob2lkLCBmbWRzW2ldLmdldE5hbWUoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwgfHwgIW0uZ2V0UmV0dXJuVHlwZSgpLmlzQXNzaWduYWJsZUZyb20oYykpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiaW52YWxpZC1pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZSwgZm1kc1tpXS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBtID0gUmVmbGVjdGlvbi5maW5kU2V0dGVyKG9pZCwgZm1kc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0uZ2V0T2JqZWN0SWRGaWVsZFR5cGUoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwgfHwgbS5nZXRSZXR1cm5UeXBlKCkgIT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbnZhbGlkLWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlLCBmbWRzW2ldLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhhdCB0aGlzIGNsYXNzIGRvZXNuJ3QgZGVjbGFyZSBhbnkgcHJpbWFyeSBrZXkgZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU5vUEtGaWVsZHMoKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmaWVsZHMgPSBnZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtcGsiLCBmaWVsZHNbaV0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGlzIGNsYXNzJyBhY2Nlc3MgdHlwZSBpcyBhbGxvd2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUFjY2Vzc1R5cGUoKSB7CisgICAgICAgIGlmIChfYWNjZXNzVHlwZSA9PSBBQ0NFU1NfVU5LTk9XTikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICBpZiAoc3VwICE9IG51bGwgJiYgc3VwLmdldEFjY2Vzc1R5cGUoKSAhPSBBQ0NFU1NfVU5LTk9XTgorICAgICAgICAgICAgJiYgc3VwLmdldEFjY2Vzc1R5cGUoKSAhPSBfYWNjZXNzVHlwZSAmJgorICAgICAgICAgICAgZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKS5nZXRGaWVsZHMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImluY29uc2lzdGVudC1hY2Nlc3MiLAorICAgICAgICAgICAgICAgIHRoaXMsIHN1cCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgZGV0YWNobWVudCBjb25maWd1cmF0aW9uIGlzIHZhbGlkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZURldGFjaGFibGUoKSB7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKENsYXNzTWV0YURhdGEgcGFyZW50ID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgICAgIGZpcnN0ICYmIHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcmVudC5pc0RldGFjaGFibGUoKSkKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgRmllbGQgZmllbGQgPSBnZXREZXRhY2hlZFN0YXRlRmllbGQoKTsKKyAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYXJlbnQtZGV0YWNoLXN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgX3R5cGUpKTsKKyAgICAgICAgICAgIGlmIChnZXRGaWVsZChmaWVsZC5nZXROYW1lKCkpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJtYW5hZ2VkLWRldGFjaC1zdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldE5hbWUoKSwgX3R5cGUpKTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgIT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWRldGFjaC1zdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldE5hbWUoKSwgX3R5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZldGNoIEdyb3VwCisgICAgLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZldGNoIGdyb3VwcyBkZWNsYXJlZCBleHBsaWNpdGx5IGluIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hHcm91cFtdIGdldERlY2xhcmVkRmV0Y2hHcm91cHMoKSB7CisgICAgICAgIGlmIChfZmdzID09IG51bGwpCisgICAgICAgICAgICBfZmdzID0gKF9mZ01hcCA9PSBudWxsKSA/IEVNUFRZX0ZFVENIX0dST1VQX0FSUkFZIDogKEZldGNoR3JvdXBbXSkKKyAgICAgICAgICAgICAgICBfZmdNYXAudmFsdWVzKCkudG9BcnJheShuZXcgRmV0Y2hHcm91cFtfZmdNYXAuc2l6ZSgpXSk7IAorICAgICAgICByZXR1cm4gX2ZnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIGZldGNoIGdyb3VwcyBmb3IgdGhpcyB0eXBlLCBpbmNsdWRpbmcgc3VwZXJjbGFzcyBncm91cHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoR3JvdXBbXSBnZXRDdXN0b21GZXRjaEdyb3VwcygpIHsKKyAgICAgICAgaWYgKF9jdXN0b21GR3MgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbWFwIGZncyB0byBuYW1lcywgYWxsb3dpbmcgb3VyIGZncyB0byBvdmVycmlkZSBzdXBlcnMKKyAgICAgICAgICAgIE1hcCBmZ3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBnZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZldGNoR3JvdXBbXSBzdXBGR3MgPSBzdXAuZ2V0Q3VzdG9tRmV0Y2hHcm91cHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cEZHcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZmdzLnB1dChzdXBGR3NbaV0uZ2V0TmFtZSgpLCBzdXBGR3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmV0Y2hHcm91cFtdIGRlY3MgPSBnZXREZWNsYXJlZEZldGNoR3JvdXBzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZmdzLnB1dChkZWNzW2ldLmdldE5hbWUoKSwgZGVjc1tpXSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHJlbW92ZSBzdGQgZ3JvdXBzCisgICAgICAgICAgICBmZ3MucmVtb3ZlKEZldGNoR3JvdXAuTkFNRV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGZncy5yZW1vdmUoRmV0Y2hHcm91cC5OQU1FX0FMTCk7CisKKyAgICAgICAgICAgIF9jdXN0b21GR3MgPSAoRmV0Y2hHcm91cFtdKSBmZ3MudmFsdWVzKCkudG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgRmV0Y2hHcm91cFtmZ3Muc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9jdXN0b21GR3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIG5hbWVkIGZlY3RoIGdyb3VwLiBJZiBub3QgYXZhaWxhYmxlIGluIHRoaXMgcmVjZWl2ZXIgdGhlbiBsb29rcworICAgICAqIHVwIHRoZSBpbmhlcml0ZW5jZSBoaWVyYXJjaHkuIAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiBhIGZldGNoIGdyb3VwLgorICAgICAqIEByZXR1cm4gYW4gZXhpc3RpbmcgZmVjdGggZ3JvdXAgb2YgdGhlIGdpdmVuIG5hbWUgaWYga25vd24gdG8gdGhpcyAKKyAgICAgKiByZWNlaXZlciBvciBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4gT3RoZXJ3aXNlIG51bGwuCisgICAgICovCisgICAgcHVibGljIEZldGNoR3JvdXAgZ2V0RmV0Y2hHcm91cChTdHJpbmcgbmFtZSkgeworICAgICAgICBGZXRjaEdyb3VwIGZnID0gKF9mZ01hcCA9PSBudWxsKSA/IG51bGwgOiAoRmV0Y2hHcm91cCkgX2ZnTWFwLmdldChuYW1lKTsKKyAgICAgICAgaWYgKGZnICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmc7CisgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgaWYgKHN1cCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHN1cC5nZXRGZXRjaEdyb3VwKG5hbWUpOworICAgICAgICBpZiAoRmV0Y2hHcm91cC5OQU1FX0RFRkFVTFQuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIEZldGNoR3JvdXAuREVGQVVMVDsKKyAgICAgICAgaWYgKEZldGNoR3JvdXAuTkFNRV9BTEwuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIEZldGNoR3JvdXAuQUxMOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZldGNoIGdyb3VwIG9mIHRoZSBnaXZlbiBuYW1lLCBvciByZXR1cm5zIGV4aXN0aW5nIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSBub24tbnVsbCwgbm9uLWVtcHR5IG5hbWUuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGlzCisgICAgICogcmVjZWl2ZXIncyBzY29wZS4gVGhlIHN1cGVyIGNsYXNzIDxlbT5tYXk8L2VtPiBoYXZlIGEgZ3JvdXAgd2l0aAorICAgICAqIHRoZSBzYW1lIG5hbWUuCisgICAgICovCisgICAgcHVibGljIEZldGNoR3JvdXAgYWRkRGVjbGFyZWRGZXRjaEdyb3VwKFN0cmluZyBuYW1lKSB7CisgICAgCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG5hbWUpKQorICAgIAkJdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJlbXB0eS1mZy1uYW1lIiwgdGhpcykpOworICAgICAgICBpZiAoX2ZnTWFwID09IG51bGwpCisgICAgICAgICAgICBfZmdNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBGZXRjaEdyb3VwIGZnID0gKEZldGNoR3JvdXApIF9mZ01hcC5nZXQobmFtZSk7CisgICAgICAgIGlmIChmZyA9PSBudWxsKSB7CisgICAgICAgIAlmZyA9IG5ldyBGZXRjaEdyb3VwKHRoaXMsIG5hbWUpOworICAgICAgICAJX2ZnTWFwLnB1dChuYW1lLCBmZyk7CisgICAgICAgICAgICBfZmdzID0gbnVsbDsKKyAgICAgICAgICAgIF9jdXN0b21GR3MgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBkZWNsYXJlZCBmZXRjaCBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVEZWNsYXJlZEZldGNoR3JvdXAoRmV0Y2hHcm91cCBmZykgeworICAgICAgICBpZiAoZmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9mZ01hcC5yZW1vdmUoZmcuZ2V0TmFtZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBfZmdzID0gbnVsbDsKKyAgICAgICAgICAgIF9jdXN0b21GR3MgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU291cmNlVHJhY2tlcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKCkgeworICAgICAgICByZXR1cm4gX3NyY0ZpbGU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2VTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTb3VyY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gX3NyY1R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlKEZpbGUgZmlsZSwgaW50IHNyY1R5cGUpIHsKKyAgICAgICAgX3NyY0ZpbGUgPSBmaWxlOworICAgICAgICBfc3JjVHlwZSA9IHNyY1R5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBtb2RlIHRoaXMgbWV0YWRhdGEgaGFzIGJlZW4gbG9hZGVkIHVuZGVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zcmNNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgbW9kZSB0aGlzIG1ldGFkYXRhIGhhcyBiZWVuIGxvYWRlZCB1bmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VNb2RlKGludCBtb2RlKSB7CisgICAgICAgIF9zcmNNb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIG1vZGUgdGhpcyBtZXRhZGF0YSBoYXMgYmVlbiBsb2FkZWQgdW5kZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlTW9kZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAobW9kZSA9PSBNT0RFX05PTkUpCisgICAgICAgICAgICBfc3JjTW9kZSA9IG1vZGU7CisgICAgICAgIGVsc2UgaWYgKG9uKQorICAgICAgICAgICAgX3NyY01vZGUgfD0gbW9kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3NyY01vZGUgJj0gfm1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IGluIHdoaWNoIHRoaXMgY2xhc3Mgd2FzIGxpc3RlZCBpbiB0aGUgbWV0YWRhdGEuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+LTE8L2NvZGU+IGlmIHRoaXMgY2xhc3Mgd2FzIG5vdCBsaXN0ZWQgaW4gdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGlzdGluZ0luZGV4KCkgeworICAgICAgICByZXR1cm4gX2xpc3RJbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggaW4gd2hpY2ggdGhpcyBmaWVsZCB3YXMgbGlzdGVkIGluIHRoZSBtZXRhZGF0YS4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT4tMTwvY29kZT4gaWYgdGhpcyBjbGFzcyB3YXMgbm90IGxpc3RlZCBpbiB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGluZ0luZGV4KGludCBpbmRleCkgeworICAgICAgICBfbGlzdEluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29tbWVudGFibGUKKyAgICAvLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIChfY29tbWVudHMgPT0gbnVsbCkgPyBFTVBUWV9DT01NRU5UUyA6IF9jb21tZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50cyhTdHJpbmdbXSBjb21tZW50cykgeworICAgICAgICBfY29tbWVudHMgPSBjb21tZW50czsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLworICAgIC8vIFN0YXRlIGNvcHkKKyAgICAvLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgZ2l2ZW4gaW5zdGFuY2UgdG8gdGhpcyBvbmUuIERvIG5vdAorICAgICAqIGNvcHkgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5KENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAobWV0YS5nZXREZXNjcmliZWRUeXBlKCkgIT0gX3R5cGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgc3VwZXIuY29weShtZXRhKTsKKworICAgICAgICAvLyBjb3B5IGNsYXNzLWxldmVsIGluZm87IHVzZSBnZXQgbWV0aG9kcyB0byBmb3JjZSByZXNvbHV0aW9uIG9mCisgICAgICAgIC8vIGxhenkgZGF0YQorICAgICAgICBfc3VwZXIgPSBtZXRhLmdldFBDU3VwZXJjbGFzcygpOworICAgICAgICBfb2JqZWN0SWQgPSBtZXRhLmdldE9iamVjdElkVHlwZSgpOworICAgICAgICBfZXh0ZW50ID0gKG1ldGEuZ2V0UmVxdWlyZXNFeHRlbnQoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgICAgICBfZW1iZWRkZWQgPSAobWV0YS5pc0VtYmVkZGVkT25seSgpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgIF9pbnRlcmZhY2UgPSAobWV0YS5pc01hbmFnZWRJbnRlcmZhY2UoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgICAgICBfaW1wbCA9IG1ldGEuZ2V0SW50ZXJmYWNlSW1wbCgpOworICAgICAgICBfaWRlbnRpdHkgPSBtZXRhLmdldElkZW50aXR5VHlwZSgpOworICAgICAgICBfaWRTdHJhdGVneSA9IG1ldGEuZ2V0SWRlbnRpdHlTdHJhdGVneSgpOworICAgICAgICBfc2VxTmFtZSA9IG1ldGEuZ2V0SWRlbnRpdHlTZXF1ZW5jZU5hbWUoKTsKKyAgICAgICAgX3NlcU1ldGEgPSBudWxsOworICAgICAgICBfYWxpYXMgPSBtZXRhLmdldFR5cGVBbGlhcygpOworICAgICAgICBfYWNjZXNzVHlwZSA9IG1ldGEuZ2V0QWNjZXNzVHlwZSgpOworCisgICAgICAgIC8vIG9ubHkgY29weSB0aGlzIGluZm9ybWF0aW9uIGlmIGl0IHdhc24ndCBzZXQgZXhwbGljaXRseSBmb3IgdGhpcworICAgICAgICAvLyBpbnN0YW5jZQorICAgICAgICBpZiAoREVGQVVMVF9TVFJJTkcuZXF1YWxzKF9jYWNoZU5hbWUpKQorICAgICAgICAgICAgX2NhY2hlTmFtZSA9IG1ldGEuZ2V0RGF0YUNhY2hlTmFtZSgpOworICAgICAgICBpZiAoX2NhY2hlVGltZW91dCA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkKKyAgICAgICAgICAgIF9jYWNoZVRpbWVvdXQgPSBtZXRhLmdldERhdGFDYWNoZVRpbWVvdXQoKTsKKyAgICAgICAgaWYgKF9kZXRhY2hhYmxlID09IG51bGwpCisgICAgICAgICAgICBfZGV0YWNoYWJsZSA9IG1ldGEuX2RldGFjaGFibGU7CisgICAgICAgIGlmIChERUZBVUxUX1NUUklORy5lcXVhbHMoX2RldGFjaFN0YXRlKSkKKyAgICAgICAgICAgIF9kZXRhY2hTdGF0ZSA9IG1ldGEuZ2V0RGV0YWNoZWRTdGF0ZSgpOworCisgICAgICAgIC8vIHN5bmNoIGZpZWxkIGluZm9ybWF0aW9uOyBmaXJzdCByZW1vdmUgZXh0cmEgZmllbGRzCisgICAgICAgIGNsZWFyRmllbGRDYWNoZSgpOworICAgICAgICBfZmllbGRNYXAua2V5U2V0KCkucmV0YWluQWxsKG1ldGEuX2ZpZWxkTWFwLmtleVNldCgpKTsKKworICAgICAgICAvLyBhZGQgY29waWVzIG9mIGRlY2xhcmVkIGZpZWxkczsgb3RoZXIgZGVmaW5lZCBmaWVsZHMgYWxyZWFkeSBjb3BpZWQKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZpZWxkcyA9IG1ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmaWVsZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpZWxkID0gZ2V0RGVjbGFyZWRGaWVsZChmaWVsZHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZpZWxkID0gYWRkRGVjbGFyZWRGaWVsZChmaWVsZHNbaV0uZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBmaWVsZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkpOworICAgICAgICAgICAgZmllbGQuc2V0RGVjbGFyZWRJbmRleCgtMSk7CisgICAgICAgICAgICBmaWVsZC5zZXRJbmRleCgtMSk7CisgICAgICAgICAgICBmaWVsZC5jb3B5KGZpZWxkc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb3B5IGZldGNoIGdyb3VwcworICAgICAgICBGZXRjaEdyb3VwW10gZmdzID0gbWV0YS5nZXREZWNsYXJlZEZldGNoR3JvdXBzKCk7CisgICAgICAgIEZldGNoR3JvdXAgZmc7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmZyA9IGFkZERlY2xhcmVkRmV0Y2hHcm91cChmZ3NbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGZnLmNvcHkoZmdzW2ldKTsgCisgICAgICAgIH0KKworICAgICAgICAvLyBjb3B5IGlmYWNlIHJlLW1hcHBpbmcKKyAgICAgICAgX2lmYWNlTWFwLmNsZWFyKCk7CisgICAgICAgIF9pZmFjZU1hcC5wdXRBbGwobWV0YS5faWZhY2VNYXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZSBoZWxwZXIgdG8gY29weSBlbWJlZGRlZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHkoQ2xhc3NNZXRhRGF0YSBlbWJlZCwgQ2xhc3NNZXRhRGF0YSBkZWMpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBkZWMuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgaWYgKHN1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBlbWJlZC5zZXRQQ1N1cGVyY2xhc3Moc3VwLmdldERlc2NyaWJlZFR5cGUoKSk7CisgICAgICAgICAgICBjb3B5KGVtYmVkLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCksIHN1cCk7CisgICAgICAgIH0KKyAgICAgICAgZW1iZWQuY29weShkZWMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvbktleXMoQ29sbGVjdGlvbiBleHRzKSB7CisgICAgICAgIF9yZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKS5hZGRDbGFzc0V4dGVuc2lvbktleXMoZXh0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyYXRvciB1c2VkIHRvIHB1dCBmaWVsZCBtZXRhZGF0YXMgaW50byBsaXN0aW5nIG9yZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RpbmdPcmRlckNvbXBhcmF0b3IKKyAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0aW5nT3JkZXJDb21wYXJhdG9yIF9pbnN0YW5jZQorICAgICAgICAgICAgPSBuZXcgTGlzdGluZ09yZGVyQ29tcGFyYXRvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBY2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0aW5nT3JkZXJDb21wYXJhdG9yIGdldEluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgaWYgKG8xID09IG8yKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKG8xID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBpZiAobzIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZjEgPSAoRmllbGRNZXRhRGF0YSkgbzE7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGYyID0gKEZpZWxkTWV0YURhdGEpIG8yOworICAgICAgICAgICAgaWYgKGYxLmdldExpc3RpbmdJbmRleCgpID09IGYyLmdldExpc3RpbmdJbmRleCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGYxLmdldEluZGV4KCkgPT0gZjIuZ2V0SW5kZXgoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYxLmdldEZ1bGxOYW1lKGZhbHNlKS5jb21wYXJlVG8KKyAgICAgICAgICAgICAgICAgICAgICAgIChmMi5nZXRGdWxsTmFtZShmYWxzZSkpOworCQkJCWlmIChmMS5nZXRJbmRleCAoKSA9PSAtMSkKKwkJCQkJcmV0dXJuIDE7CisJCQkJaWYgKGYyLmdldEluZGV4ICgpID09IC0xKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIGYxLmdldEluZGV4ICgpIC0gZjIuZ2V0SW5kZXggKCk7CisJCQl9CQorCQkJaWYgKGYxLmdldExpc3RpbmdJbmRleCAoKSA9PSAtMSkKKwkJCQlyZXR1cm4gMTsKKwkJCWlmIChmMi5nZXRMaXN0aW5nSW5kZXggKCkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIGYxLmdldExpc3RpbmdJbmRleCAoKSAtIGYyLmdldExpc3RpbmdJbmRleCAoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9EZWxlZ2F0aW5nTWV0YURhdGFGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjJkYzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5DbGFzc0FyZ1BhcnNlcjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBmYWN0b3J5IGluc3RhbmNlcyB0aGF0IHVzZSBhIGRlbGVnYXRlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nTWV0YURhdGFGYWN0b3J5CisgICAgaW1wbGVtZW50cyBNZXRhRGF0YUZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YUZhY3RvcnkgX2RlbGVnYXRlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeShNZXRhRGF0YUZhY3RvcnkgZGVsZWdhdGUpIHsKKyAgICAgICAgX2RlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFGYWN0b3J5IGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElubmVybW9zdCBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFGYWN0b3J5IGdldElubmVybW9zdERlbGVnYXRlKCkgeworICAgICAgICBpZiAoX2RlbGVnYXRlIGluc3RhbmNlb2YgRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeSkKKyAgICAgICAgICAgIHJldHVybiAoKERlbGVnYXRpbmdNZXRhRGF0YUZhY3RvcnkpIF9kZWxlZ2F0ZSkuCisgICAgICAgICAgICAgICAgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5KE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBfZGVsZWdhdGUuc2V0UmVwb3NpdG9yeShyZXBvcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVEaXJlY3RvcnkoRmlsZSBkaXIpIHsKKyAgICAgICAgX2RlbGVnYXRlLnNldFN0b3JlRGlyZWN0b3J5KGRpcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVNb2RlKGludCBzdG9yZSkgeworICAgICAgICBfZGVsZWdhdGUuc2V0U3RvcmVNb2RlKHN0b3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3QoYm9vbGVhbiBzdHJpY3QpIHsKKyAgICAgICAgX2RlbGVnYXRlLnNldFN0cmljdCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKENsYXNzIGNscywgaW50IG1vZGUsIENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICBfZGVsZWdhdGUubG9hZChjbHMsIG1vZGUsIGVudkxvYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RvcmUoQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBRdWVyeU1ldGFEYXRhW10gcXVlcmllcywKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YVtdIHNlcXMsIGludCBtb2RlLCBNYXAgb3V0cHV0KSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuc3RvcmUobWV0YXMsIHF1ZXJpZXMsIHNlcXMsIG1vZGUsIG91dHB1dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZHJvcChDbGFzc1tdIGNscywgaW50IG1vZGUsIENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmRyb3AoY2xzLCBtb2RlLCBlbnZMb2FkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRGF0YURlZmF1bHRzIGdldERlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmdldERlZmF1bHRzKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzQXJnUGFyc2VyIG5ld0NsYXNzQXJnUGFyc2VyKCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLm5ld0NsYXNzQXJnUGFyc2VyKCk7CisgICAgfQorCisgICAgcHVibGljIFNldCBnZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGJvb2xlYW4gY2xhc3NwYXRoLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5nZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGNsYXNzcGF0aCwgZW52TG9hZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UXVlcnlTY29wZShTdHJpbmcgcXVlcnlOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5nZXRRdWVyeVNjb3BlKHF1ZXJ5TmFtZSwgbG9hZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0U2V0TWFwcGluZ1Njb3BlKFN0cmluZyByZXN1bHRTZXRNYXBwaW5nTmFtZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuZ2V0UmVzdWx0U2V0TWFwcGluZ1Njb3BlKHJlc3VsdFNldE1hcHBpbmdOYW1lLCBsb2FkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfZGVsZWdhdGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0V4dGVuc2lvbktleXMoQ29sbGVjdGlvbiBleHRzKSB7CisgICAgICAgIF9kZWxlZ2F0ZS5hZGRDbGFzc0V4dGVuc2lvbktleXMoZXh0cyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmllbGRFeHRlbnNpb25LZXlzKENvbGxlY3Rpb24gZXh0cykgeworICAgICAgICBfZGVsZWdhdGUuYWRkRmllbGRFeHRlbnNpb25LZXlzKGV4dHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9FeHRlbnNpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMWZjZmEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvRXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5TdHJpbmdEaXN0YW5jZTsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBWZW5kb3IgZXh0ZW5zaW9ucy4gVGhpcyBjbGFzcyBpcyB0aHJlYWQgc2FmZSBmb3IgcmVhZHMsIGJ1dCBub3QgZm9yCisgKiBtdXRhdGlvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVuc2lvbnMKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOSlBBID0gIm9wZW5qcGEiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRXh0ZW5zaW9ucy5jbGFzcyk7CisKKyAgICBwcml2YXRlIE1hcCBfZXh0cyA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXAgX2VtYmVkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBrZXlzIGZvciBhbnkgdmVuZG9yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiAoX2V4dHMgPT0gbnVsbCB8fCBfZXh0cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAmJiAoX2VtYmVkID09IG51bGwgfHwgX2VtYmVkLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB2ZW5kb3JzIHdobyBoYXZlIGV4dGVuc2lvbiBrZXlzIGF0IHRoaXMgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEV4dGVuc2lvblZlbmRvcnMoKSB7CisgICAgICAgIGlmIChfZXh0cyA9PSBudWxsIHx8IF9leHRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworCisgICAgICAgIFNldCB2ZW5kb3JzID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfZXh0cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHZlbmRvcnMuYWRkKGdldFZlbmRvcihpdHIubmV4dCgpKSk7CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHZlbmRvcnMudG9BcnJheShuZXcgU3RyaW5nW3ZlbmRvcnMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBleHRlbnNpb24ga2V5cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uS2V5cygpIHsKKyAgICAgICAgcmV0dXJuIGdldEV4dGVuc2lvbktleXMoT1BFTkpQQSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBleHRlbnNpb24ga2V5cyBmb3IgdGhlIGdpdmVuIHZlbmRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uS2V5cyhTdHJpbmcgdmVuZG9yKSB7CisgICAgICAgIGlmIChfZXh0cyA9PSBudWxsIHx8IF9leHRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworCisgICAgICAgIENvbGxlY3Rpb24ga2V5cyA9IG5ldyBUcmVlU2V0KCk7CisgICAgICAgIE9iamVjdCBrZXk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2V4dHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGtleSA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAodmVuZG9yLmVxdWFscyhnZXRWZW5kb3Ioa2V5KSkpCisgICAgICAgICAgICAgICAga2V5cy5hZGQoZ2V0S2V5KGtleSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIGtleXMudG9BcnJheShuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGV4dGVuc2lvbiB3aXRoIHRoZSBnaXZlbiBrZXkgZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbihTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBoYXNFeHRlbnNpb24oT1BFTkpQQSwga2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXh0ZW5zaW9uIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyB2ZW5kb3IsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIF9leHRzICE9IG51bGwgJiYgX2V4dHMuY29udGFpbnNLZXkoZ2V0SGFzaEtleSh2ZW5kb3IsIGtleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHZlbmRvciBleHRlbnNpb24gdG8gdGhpcyBlbnRpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBhZGRFeHRlbnNpb24oT1BFTkpQQSwga2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdmVuZG9yIGV4dGVuc2lvbiB0byB0aGlzIGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oU3RyaW5nIHZlbmRvciwgU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChfZXh0cyA9PSBudWxsKQorICAgICAgICAgICAgX2V4dHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBfZXh0cy5wdXQoZ2V0SGFzaEtleSh2ZW5kb3IsIGtleSksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB2ZW5kb3IgZXh0ZW5zaW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUV4dGVuc2lvbihTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiByZW1vdmVFeHRlbnNpb24oT1BFTkpQQSwga2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB2ZW5kb3IgZXh0ZW5zaW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUV4dGVuc2lvbihTdHJpbmcgdmVuZG9yLCBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChfZXh0cyAhPSBudWxsICYmIF9leHRzLnJlbW92ZShnZXRIYXNoS2V5KHZlbmRvciwga2V5KSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlRW1iZWRkZWRFeHRlbnNpb25zKGtleSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RFeHRlbnNpb24oU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0T2JqZWN0RXh0ZW5zaW9uKE9QRU5KUEEsIGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RFeHRlbnNpb24oU3RyaW5nIHZlbmRvciwgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoX2V4dHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gX2V4dHMuZ2V0KGdldEhhc2hLZXkodmVuZG9yLCBrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nRXh0ZW5zaW9uKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZ0V4dGVuc2lvbihPUEVOSlBBLCBrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdFeHRlbnNpb24oU3RyaW5nIHZlbmRvciwgU3RyaW5nIGtleSkgeworICAgICAgICBPYmplY3QgdmFsID0gZ2V0T2JqZWN0RXh0ZW5zaW9uKHZlbmRvciwga2V5KTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBudWxsIDogdmFsLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhbiBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnRFeHRlbnNpb24oU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0SW50RXh0ZW5zaW9uKE9QRU5KUEEsIGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhbiBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnRFeHRlbnNpb24oU3RyaW5nIHZlbmRvciwgU3RyaW5nIGtleSkgeworICAgICAgICBTdHJpbmcgc3RyID0gZ2V0U3RyaW5nRXh0ZW5zaW9uKHZlbmRvciwga2V5KTsKKyAgICAgICAgcmV0dXJuIChzdHIgPT0gbnVsbCkgPyAwIDogSW50ZWdlci5wYXJzZUludChzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgYXMgYSBkb3VibGUuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVFeHRlbnNpb24oU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0RG91YmxlRXh0ZW5zaW9uKE9QRU5KUEEsIGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhIGRvdWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZUV4dGVuc2lvbihTdHJpbmcgdmVuZG9yLCBTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSBnZXRTdHJpbmdFeHRlbnNpb24odmVuZG9yLCBrZXkpOworICAgICAgICByZXR1cm4gKHN0ciA9PSBudWxsKSA/IDBEIDogRG91YmxlLnBhcnNlRG91YmxlKHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkV4dGVuc2lvbihTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuRXh0ZW5zaW9uKE9QRU5KUEEsIGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkV4dGVuc2lvbihTdHJpbmcgdmVuZG9yLCBTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSBnZXRTdHJpbmdFeHRlbnNpb24odmVuZG9yLCBrZXkpOworICAgICAgICByZXR1cm4gKHN0ciA9PSBudWxsKSA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKHN0cikuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbWJlZGRlZCBleHRlbnNpb25zIHVuZGVyIHRoZSBnaXZlbiBrZXkuCisgICAgICovCisgICAgcHVibGljIEV4dGVuc2lvbnMgZ2V0RW1iZWRkZWRFeHRlbnNpb25zKFN0cmluZyBrZXksIGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIHJldHVybiBnZXRFbWJlZGRlZEV4dGVuc2lvbnMoT1BFTkpQQSwga2V5LCBjcmVhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW1iZWRkZWQgZXh0ZW5zaW9ucyB1bmRlciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbnNpb25zIGdldEVtYmVkZGVkRXh0ZW5zaW9ucyhTdHJpbmcgdmVuZG9yLCBTdHJpbmcga2V5LAorICAgICAgICBib29sZWFuIGNyZWF0ZSkgeworICAgICAgICBpZiAoX2VtYmVkID09IG51bGwgJiYgIWNyZWF0ZSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoX2VtYmVkID09IG51bGwpCisgICAgICAgICAgICBfZW1iZWQgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIE9iamVjdCBoayA9IGdldEhhc2hLZXkodmVuZG9yLCBrZXkpOworICAgICAgICBFeHRlbnNpb25zIGV4dHMgPSAoRXh0ZW5zaW9ucykgX2VtYmVkLmdldChoayk7CisgICAgICAgIGlmIChleHRzID09IG51bGwgJiYgIWNyZWF0ZSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoZXh0cyA9PSBudWxsKSB7CisgICAgICAgICAgICBleHRzID0gbmV3IEVtYmVkZGVkRXh0ZW5zaW9ucyh0aGlzKTsKKyAgICAgICAgICAgIF9lbWJlZC5wdXQoaGssIGV4dHMpOworCisgICAgICAgICAgICAvLyByZXF1aXJlZCB0byByZWNvZ25pemUgZW1iZWRkZWQgZXh0ZW5zaW9ucyB3aXRob3V0IHZhbHVlcworICAgICAgICAgICAgaWYgKF9leHRzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2V4dHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgaWYgKCFfZXh0cy5jb250YWluc0tleShoaykpCisgICAgICAgICAgICAgICAgX2V4dHMucHV0KGhrLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXh0czsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbWJlZGRlZEV4dGVuc2lvbnMoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gcmVtb3ZlRW1iZWRkZWRFeHRlbnNpb25zKE9QRU5KUEEsIGtleSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRW1iZWRkZWRFeHRlbnNpb25zKFN0cmluZyB2ZW5kb3IsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlZCAhPSBudWxsCisgICAgICAgICAgICAmJiBfZW1iZWQucmVtb3ZlKGdldEhhc2hLZXkodmVuZG9yLCBrZXkpKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGV4dGVuc2lvbnMgbm90IHByZXNlbnQgaW4gdGhpcyBpbnN0YW5jZSBidXQgcHJlc2VudCBpbiB0aGUKKyAgICAgKiBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5KEV4dGVuc2lvbnMgZXh0cykgeworICAgICAgICBpZiAoZXh0cy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGV4dHMuX2V4dHMgIT0gbnVsbCAmJiAhZXh0cy5fZXh0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChfZXh0cyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9leHRzID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBleHRzLl9leHRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIV9leHRzLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICAgICAgX2V4dHMucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHRzLl9lbWJlZCAhPSBudWxsICYmICFleHRzLl9lbWJlZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChfZW1iZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZW1iZWQgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgICAgICBFeHRlbnNpb25zIGVtYmVkZGVkOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBleHRzLl9lbWJlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZW1iZWRkZWQgPSAoRXh0ZW5zaW9ucykgX2VtYmVkLmdldChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgaWYgKGVtYmVkZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWQgPSBuZXcgRW1iZWRkZWRFeHRlbnNpb25zKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBfZW1iZWQucHV0KGVudHJ5LmdldEtleSgpLCBlbWJlZGRlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVtYmVkZGVkLmNvcHkoKEV4dGVuc2lvbnMpIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBpc3N1ZSB3YXJuaW5ncyBmb3IgYW55IGV4dGVuc2lvbnMgdGhhdCB3ZQorICAgICAqIHJlY29nbml6ZSBidXQgZG8gbm90IHVzZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMS4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVFeHRlbnNpb25LZXlzKCkgeworICAgICAgICBpZiAoX2V4dHMgPT0gbnVsbCB8fCBfZXh0cy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiA9IGdldFJlcG9zaXRvcnkoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIExvZyBsb2cgPSBjb25mLmdldExvZyhjb25mLkxPR19NRVRBREFUQSk7CisgICAgICAgIGlmICghbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDb2xsZWN0aW9uIHZhbGlkTmFtZXMgPSBuZXcgVHJlZVNldCgpOworICAgICAgICBhZGRFeHRlbnNpb25LZXlzKHZhbGlkTmFtZXMpOworCisgICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgd2Ugc3RvcmUgdGhpbmdzIGxpa2UgImpkYmMtIiBmb3IgYQorICAgICAgICAvLyBwcmVmaXggZm9yIGFuIGV4dGVuc2lvbiBuYW1lIHRoYXQgd2Ugd29uJ3QgdmFsaWRhdGU7IHRoYXQKKyAgICAgICAgLy8gd2F5IGEgbmV3IHZlbmRvciBjb3VsZCB0aGVvcmV0aWNhbGx5IGFkZCBpbiB0aGVpcgorICAgICAgICAvLyBvd24gcHJlZml4IGludG8gdGhlIGxvY2FsaXplci5wcm9wZXJ0aWVzIGZpbGUgYW5kCisgICAgICAgIC8vIG5vdCBoYXZlIHRvIGlzc3VlIHdhcm5pbmdzIGZvciB0aGVpciBleHRlbnNpb25zCisgICAgICAgIFN0cmluZyBwcmVmaXhlcyA9IF9sb2MuZ2V0KCJleHRlbnNpb24tZGF0YXN0b3JlLXByZWZpeCIpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgU3RyaW5nW10gYWxsb3dlZFByZWZpeGVzID0gbnVsbDsKKyAgICAgICAgaWYgKHByZWZpeGVzICE9IG51bGwpCisgICAgICAgICAgICBhbGxvd2VkUHJlZml4ZXMgPSBTdHJpbmdzLnNwbGl0KHByZWZpeGVzLCAiLCIsIDApOworCisgICAgICAgIE9iamVjdCBuZXh0OworICAgICAgICBTdHJpbmcga2V5OworICAgICAgICBvdXRlcjoKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfZXh0cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgbmV4dCA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIU9QRU5KUEEuZXF1YWxzKGdldFZlbmRvcihuZXh0KSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBrZXkgPSBnZXRLZXkobmV4dCk7CisgICAgICAgICAgICBpZiAodmFsaWROYW1lcy5jb250YWlucyhrZXkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYWxsb3dlZFByZWZpeGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFsbG93ZWRQcmVmaXhlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYWxsb3dlZFByZWZpeGVzW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXZhbGlkYXRlRGF0YVN0b3JlRXh0ZW5zaW9uUHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb3dlZFByZWZpeGVzW2pdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIG5hbWVzIHRoYXQgYXJlCisgICAgICAgICAgICAvLyBzaW1pbGlhciB0byB0aGlzIG9uZSwgc28gd2UgY2FuIGFkZCBpbiBhIGhpbnQKKyAgICAgICAgICAgIFN0cmluZyBjbG9zZXN0TmFtZSA9IFN0cmluZ0Rpc3RhbmNlLmdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlCisgICAgICAgICAgICAgICAgKGtleSwgdmFsaWROYW1lcywgMC41Zik7CisKKyAgICAgICAgICAgIGlmIChjbG9zZXN0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJ1bnJlY29nbml6ZWQtZXh0ZW5zaW9uIiwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAga2V5LCB2YWxpZE5hbWVzKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoInVucmVjb2duaXplZC1leHRlbnNpb24taGludCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgdGhpcywga2V5LCB2YWxpZE5hbWVzLCBjbG9zZXN0TmFtZSB9KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYWxsIHRoZSBrbm93biBleHRlbnNpb24ga2V5cyB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb247IGFueQorICAgICAqIGltcGxlbWVudGF0aW9uIHRoYXQgdXRpbGl6ZWQgbmV3IGV4dGVuc2lvbnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKKyAgICAgKiBtZXRob2QgdG8gaW5jbHVkZSBib3RoIHRoZSBrbm93biBleHRlbnNpb25zIG9mIGl0cyBzdXBlcmNsYXNzIGFzIHdlbGwKKyAgICAgKiBhcyBpdHMgb3duIGV4dGVuc2lvbiBrZXlzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4xLjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb25LZXlzKENvbGxlY3Rpb24gZXh0cykgeworICAgICAgICAvLyBubyBleHRlbnNpb25zIGJ5IGRlZmF1bHQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb25zIHN0YXJ0aW5nIHdpdGggdGhlIGdpdmVuIG9mZmljaWFsIGRhdGFzdG9yZQorICAgICAqIHByZWZpeCBzaG91bGQgYmUgdmFsaWRhdGVkIGZvciB0aGlzIHJ1bnRpbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEYXRhU3RvcmVFeHRlbnNpb25QcmVmaXgoU3RyaW5nIHByZWZpeCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXRhZGF0YSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaGFzaCBrZXkgZm9yIHRoZSBnaXZlbiB2ZW5kb3Iva2V5IGNvbWJvLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldEhhc2hLZXkoU3RyaW5nIHZlbmRvciwgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoT1BFTkpQQS5lcXVhbHModmVuZG9yKSkKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIHJldHVybiBuZXcgSGFzaEtleSh2ZW5kb3IsIGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgdmVuZG9yIGZyb20gdGhlIGdpdmVuIGhhc2gga2V5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFZlbmRvcihPYmplY3QgaGFzaEtleSkgeworICAgICAgICByZXR1cm4gKGhhc2hLZXkgaW5zdGFuY2VvZiBTdHJpbmcpID8gT1BFTkpQQSA6CisgICAgICAgICAgICAoKEhhc2hLZXkpIGhhc2hLZXkpLnZlbmRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHRoZSBrZXkgZnJvbSB0aGUgZ2l2ZW4gaGFzaCBrZXkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KE9iamVjdCBoYXNoS2V5KSB7CisgICAgICAgIHJldHVybiAoaGFzaEtleSBpbnN0YW5jZW9mIFN0cmluZykgPyAoU3RyaW5nKSBoYXNoS2V5CisgICAgICAgICAgICA6ICgoSGFzaEtleSkgaGFzaEtleSkua2V5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEtleSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIYXNoS2V5IAorICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyB2ZW5kb3I7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcga2V5OworCisgICAgICAgIHB1YmxpYyBIYXNoS2V5KFN0cmluZyB2ZW5kb3IsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgICAgIHRoaXMudmVuZG9yID0gdmVuZG9yOworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgaWYgKHZlbmRvciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGkgPSB2ZW5kb3IuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpICs9IDE3ICoga2V5Lmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgSGFzaEtleSBoayA9IChIYXNoS2V5KSBvdGhlcjsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5lcXVhbHModmVuZG9yLCBoay52ZW5kb3IpCisgICAgICAgICAgICAgICAgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKGtleSwgaGsua2V5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVtYmVkZGVkIGV4dGVuc2lvbnMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1iZWRkZWRFeHRlbnNpb25zCisgICAgICAgIGV4dGVuZHMgRXh0ZW5zaW9ucyB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHRlbnNpb25zIF9wYXJlbnQ7CisKKyAgICAgICAgcHVibGljIEVtYmVkZGVkRXh0ZW5zaW9ucyhFeHRlbnNpb25zIHBhcmVudCkgeworICAgICAgICAgICAgX3BhcmVudCA9IHBhcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSAoKQorCQl7CisJCQlyZXR1cm4gX3BhcmVudC5nZXRSZXBvc2l0b3J5ICgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0ZldGNoR3JvdXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9GZXRjaEdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYjNjOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9GZXRjaEdyb3VwLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7DQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk9iamVjdFV0aWxzOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsNCitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7DQorDQorLyoqDQorICogQ2FwdHVyZXMgZmV0Y2ggZ3JvdXAgbWV0YWRhdGEuDQorICovDQorcHVibGljIGNsYXNzIEZldGNoR3JvdXAgDQorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsNCisNCisgICAgLyoqDQorICAgICAqIE5hbWUgb2YgdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0RFRkFVTFQgPSAiZGVmYXVsdCI7DQorDQorICAgIC8qKg0KKyAgICAgKiBOYW1lIG9mIHRoZSAiYWxsIiBmZXRjaCBncm91cC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQUxMID0gImFsbCI7DQorDQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IGZpZWxkIHJlY3Vyc2lvbiBkZXB0aC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQ1VSU0lPTl9ERVBUSF9ERUZBVUxUID0gMTsNCisNCisgICAgLyoqDQorICAgICAqIEluZmluaXRlIGRlcHRoLg0KKyAgICAgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfSU5GSU5JVEUgPSAtMTsNCisNCisgICAgLyoqDQorICAgICAqICBTdGFuZGFyZCBkZWZhdWx0IGZldGNoIGdyb3VwLg0KKyAgICAgKi8NCisgICAgc3RhdGljIGZpbmFsIEZldGNoR3JvdXAgREVGQVVMVCA9IG5ldyBGZXRjaEdyb3VwKE5BTUVfREVGQVVMVCwgdHJ1ZSk7DQorDQorICAgIC8qKg0KKyAgICAgKiAgU3RhbmRhcmQgImFsbCIgZmV0Y2ggZ3JvdXAuDQorICAgICAqLw0KKyAgICBzdGF0aWMgZmluYWwgRmV0Y2hHcm91cCBBTEwgPSBuZXcgRmV0Y2hHcm91cChOQU1FX0FMTCwgZmFsc2UpOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlDQorICAgICAgICAoRmV0Y2hHcm91cC5jbGFzcyk7DQorDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lOw0KKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWV0YURhdGEgX21ldGE7DQorICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcmVhZE9ubHk7DQorICAgIHByaXZhdGUgTGlzdCBfaW5jbHVkZXM7DQorICAgIHByaXZhdGUgTWFwIF9kZXB0aHM7DQorICAgIHByaXZhdGUgQm9vbGVhbiBfcG9zdExvYWQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGltbXV0YWJsZSBuYW1lLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbmFtZSBtdXN0IG5vdCBieSBudWxsIG9yIGVtcHR5Lg0KKyAgICAgKi8NCisgICAgRmV0Y2hHcm91cChDbGFzc01ldGFEYXRhIGNtLCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgX21ldGEgPSBjbTsNCisgICAgICAgIF9uYW1lID0gbmFtZTsNCisgICAgICAgIF9yZWFkT25seSA9IGZhbHNlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmb3IgYnVpbHRpbiBmZXRjaCBncm91cHMuDQorICAgICAqLw0KKyAgICBwcml2YXRlIEZldGNoR3JvdXAoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcG9zdExvYWQpIHsNCisgICAgICAgIF9tZXRhID0gbnVsbDsNCisgICAgICAgIF9uYW1lID0gbmFtZTsNCisgICAgICAgIF9wb3N0TG9hZCA9IChwb3N0TG9hZCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOw0KKyAgICAgICAgX3JlYWRPbmx5ID0gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29weSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBmZXRjaCBncm91cC4NCisgICAgICovDQorICAgIHZvaWQgY29weShGZXRjaEdyb3VwIGZnKSB7DQorICAgICAgICBpZiAoZmcuX2luY2x1ZGVzICE9IG51bGwpDQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBmZy5faW5jbHVkZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspDQorICAgICAgICAgICAgICAgIGFkZERlY2xhcmVkSW5jbHVkZSgoU3RyaW5nKSBpdHIubmV4dCgpKTsNCisgICAgICAgIGlmIChmZy5fZGVwdGhzICE9IG51bGwpIHsNCisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBmZy5fZGVwdGhzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgDQorICAgICAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsNCisgICAgICAgICAgICAgICAgc2V0UmVjdXJzaW9uRGVwdGgoKEZpZWxkTWV0YURhdGEpIGVudHJ5LmdldEtleSgpLCAoKE51bWJlcikgDQorICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZmcuX3Bvc3RMb2FkICE9IG51bGwpDQorICAgICAgICAgICAgX3Bvc3RMb2FkID0gZmcuX3Bvc3RMb2FkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGZXRjaCBncm91cCBuYW1lLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIF9uYW1lOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBJbmNsdWRlcyBnaXZlbiBmZXRjaCBncm91cCB3aXRoaW4gdGhpcyByZWNlaXZlci4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZERlY2xhcmVkSW5jbHVkZShTdHJpbmcgZmdOYW1lKSB7DQorICAgICAgICBpZiAoX3JlYWRPbmx5KQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZmdOYW1lKSkNCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm51bGwtaW5jbHVkZS1mZyIsIHRoaXMpKTsNCisgICAgICAgIGlmIChfaW5jbHVkZXMgPT0gbnVsbCkNCisgICAgICAgICAgICBfaW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgICBpZiAoIV9pbmNsdWRlcy5jb250YWlucyhmZ05hbWUpKQ0KKyAgICAgICAgICAgIF9pbmNsdWRlcy5hZGQoZmdOYW1lKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWZmaXJtcyBpZiBnaXZlbiBmZXRjaCBncm91cCBpcyBpbmNsdWRlZCBieSB0aGlzIHJlY2VpdmVyLiAgSW5jbHVkZXMNCisgICAgICogc3VwZXJjbGFzcyBkZWZpbml0aW9uIG9mIGZldGNoIGdyb3VwIGFuZCBvcHRpb25hbGx5IG90aGVyIGluY2x1ZGVkIA0KKyAgICAgKiBncm91cHMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSByZWN1cnNlIGlmIHRydWUgdGhlbiByZWN1cnNpdmVseSBjaGVja3Mgd2l0aGluIHRoZSBpbmNsdWRlZA0KKyAgICAgKiBmZWN0aCBncm91cHMNCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVzKFN0cmluZyBmZ05hbWUsIGJvb2xlYW4gcmVjdXJzZSkgew0KKyAgICAgICAgLy8gY2hlY2sgb3VyIGluY2x1ZGVzDQorICAgICAgICBpZiAoX2luY2x1ZGVzICE9IG51bGwpIHsNCisgICAgICAgICAgICBpZiAoX2luY2x1ZGVzLmNvbnRhaW5zKGZnTmFtZSkpDQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7DQorICAgICAgICAgICAgICAgIEZldGNoR3JvdXAgZmc7DQorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgICAgIGZnID0gX21ldGEuZ2V0RmV0Y2hHcm91cCgoU3RyaW5nKSBpLm5leHQoKSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZmcgIT0gbnVsbCAmJiBmZy5pbmNsdWRlcyhmZ05hbWUsIHRydWUpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKF9tZXRhICE9IG51bGwpIHsNCisgICAgICAgICAgICAvLyBjaGVjayBzdXBlcmNsYXNzIGluY2x1ZGVzDQorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBfbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOw0KKyAgICAgICAgICAgIGlmIChzdXAgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBGZXRjaEdyb3VwIHN1cEZHID0gc3VwLmdldEZldGNoR3JvdXAoX25hbWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoc3VwRkcgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBGRy5pbmNsdWRlcyhmZ05hbWUsIHJlY3Vyc2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSBmZXRjaCBncm91cCBuYW1lcyBkZWNsYXJlZCBpbmNsdWRlZCBieSB0aGlzIGdyb3VwLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZ1tdIGdldERlY2xhcmVkSW5jbHVkZXMoKSB7DQorICAgICAgICAvLyBvbmx5IHVzZWQgZHVyaW5nIHNlcmlhbGl6YXRpb247IG5vIG5lZWQgdG8gY2FjaGUNCisgICAgICAgIHJldHVybiAoX2luY2x1ZGVzID09IG51bGwpID8gbmV3IFN0cmluZ1swXQ0KKyAgICAgICAgICAgIDogKFN0cmluZ1tdKSBfaW5jbHVkZXMudG9BcnJheShuZXcgU3RyaW5nW19pbmNsdWRlcy5zaXplKCldKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVjdXJzaW9uIGRlcHRoIGZvciB0aGUgZ2l2ZW4gZmllbGQuICBUaGlzIGlzIHRoZSBkZXB0aCBvZiByZWxhdGlvbnMgb2YNCisgICAgICogdGhlIHNhbWUgY2xhc3MgYXMgdGhpcyBvbmUgd2UgY2FuIGZldGNoIHRocm91Z2ggdGhlIGdpdmVuIGZpZWxkLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaW9uRGVwdGgoRmllbGRNZXRhRGF0YSBmbSwgaW50IGRlcHRoKSB7DQorICAgICAgICBpZiAoX3JlYWRPbmx5KQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgaWYgKGRlcHRoIDwgLTEpDQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJpbnZhbGlkLWZnLWRlcHRoIiwgX25hbWUsIGZtLCANCisgICAgICAgICAgICAgICAgTnVtYmVycy52YWx1ZU9mKGRlcHRoKSkpOw0KKyAgICAgICAgaWYgKF9kZXB0aHMgPT0gbnVsbCkNCisgICAgICAgICAgICBfZGVwdGhzID0gbmV3IEhhc2hNYXAoKTsNCisgICAgICAgIF9kZXB0aHMucHV0KGZtLCBOdW1iZXJzLnZhbHVlT2YoZGVwdGgpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVjdXJzaW9uIGRlcHRoIGZvciB0aGUgZ2l2ZW4gZmllbGQuICBUaGlzIGlzIHRoZSBkZXB0aCBvZiByZWxhdGlvbnMgb2YNCisgICAgICogdGhlIHNhbWUgY2xhc3MgYXMgdGhpcyBvbmUgd2UgY2FuIGZldGNoIHRocm91Z2ggdGhlIGdpdmVuIGZpZWxkLg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRSZWN1cnNpb25EZXB0aChGaWVsZE1ldGFEYXRhIGZtKSB7DQorICAgICAgICBOdW1iZXIgZGVwdGggPSBmaW5kUmVjdXJzaW9uRGVwdGgoZm0pOw0KKyAgICAgICAgcmV0dXJuIChkZXB0aCA9PSBudWxsKSA/IFJFQ1VSU0lPTl9ERVBUSF9ERUZBVUxUIDogZGVwdGguaW50VmFsdWUoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSByZWN1cnNpb24gZGVwdGggZGVjbGFyZWQgZm9yIHRoZSBnaXZlbiBmaWVsZCwgb3IgDQorICAgICAqIDAgaWYgbm9uZS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRSZWN1cnNpb25EZXB0aChGaWVsZE1ldGFEYXRhIGZtKSB7DQorICAgICAgICBOdW1iZXIgZGVwdGggPSAoX2RlcHRocyA9PSBudWxsKSA/IG51bGwgOiAoTnVtYmVyKSBfZGVwdGhzLmdldChmbSk7DQorICAgICAgICByZXR1cm4gKGRlcHRoID09IG51bGwpID8gMCA6IGRlcHRoLmludFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEhlbHBlciB0byBmaW5kIHJlY3Vyc2lvbiBkZXB0aCByZWN1cnNpdmVseSBpbiBvdXIgaW5jbHVkZXMuDQorICAgICAqLw0KKyAgICBwcml2YXRlIE51bWJlciBmaW5kUmVjdXJzaW9uRGVwdGgoRmllbGRNZXRhRGF0YSBmbSkgeyANCisgICAgICAgIE51bWJlciBkZXB0aCA9IChfZGVwdGhzID09IG51bGwpID8gbnVsbCA6IChOdW1iZXIpIF9kZXB0aHMuZ2V0KGZtKTsNCisgICAgICAgIGlmIChkZXB0aCAhPSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybiBkZXB0aDsNCisNCisgICAgICAgIC8vIGNoZWNrIGZvciBzdXBlcmNsYXNzIGRlY2xhcmF0aW9uIG9mIGRlcHRoDQorICAgICAgICBOdW1iZXIgbWF4ID0gbnVsbDsNCisgICAgICAgIGlmIChfbWV0YSAhPSBudWxsICYmIGZtLmdldERlY2xhcmluZ01ldGFEYXRhKCkgIT0gX21ldGEpIHsNCisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIHN1cCA9IF9tZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7DQorICAgICAgICAgICAgaWYgKHN1cCAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIEZldGNoR3JvdXAgc3VwRkcgPSBzdXAuZ2V0RmV0Y2hHcm91cChfbmFtZSk7DQorICAgICAgICAgICAgICAgIGlmIChzdXBGRyAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gc3VwRkcuZmluZFJlY3Vyc2lvbkRlcHRoKGZtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoX2luY2x1ZGVzID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIG1heDsNCisNCisgICAgICAgIC8vIGZpbmQgbGFyZ2VzdCBpbmNsdWRlZCBkZXB0aA0KKyAgICAgICAgRmV0Y2hHcm91cCBmZzsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2luY2x1ZGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgZmcgPSBfbWV0YS5nZXRGZXRjaEdyb3VwKChTdHJpbmcpIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgICAgIGRlcHRoID0gKGZnID09IG51bGwpID8gbnVsbCA6IGZnLmZpbmRSZWN1cnNpb25EZXB0aChmbSk7DQorICAgICAgICAgICAgaWYgKGRlcHRoICE9IG51bGwgJiYgKG1heCA9PSBudWxsIA0KKyAgICAgICAgICAgICAgICB8fCBkZXB0aC5pbnRWYWx1ZSgpID4gbWF4LmludFZhbHVlKCkpKQ0KKyAgICAgICAgICAgICAgICBtYXggPSBkZXB0aDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtYXg7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiB0aGUgZmllbGRzIHdpdGggZGVjbGFyZWQgcmVjdXJzaW9uIGRlcHRocyBpbiB0aGlzIGdyb3VwLg0KKyAgICAgKi8NCisgICAgcHVibGljIEZpZWxkTWV0YURhdGFbXSBnZXREZWNsYXJlZFJlY3Vyc2lvbkRlcHRoRmllbGRzKCkgew0KKyAgICAgICAgLy8gdXNlZCBpbiBzZXJpYWxpemF0aW9uIG9ubHk7IG5vIG5lZWQgdG8gY2FjaGUNCisgICAgICAgIGlmIChfZGVwdGhzID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZE1ldGFEYXRhWzBdOw0KKyAgICAgICAgIHJldHVybiAoRmllbGRNZXRhRGF0YVtdKSBfZGVwdGhzLmtleVNldCgpLnRvQXJyYXkNCisgICAgICAgICAgICAobmV3IEZpZWxkTWV0YURhdGFbX2RlcHRocy5zaXplKCldKTsNCisgICAgfSANCisNCisgICAgLyoqDQorICAgICAqIFdoZXRoZXIgbG9hZGluZyB0aGlzIGZldGNoIGdyb3VwIGNhdXNlcyBhIHBvc3QtbG9hZCBjYWxsYmFjayBvbiB0aGUNCisgICAgICogbG9hZGVkIGluc3RhbmNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UG9zdExvYWQgKGJvb2xlYW4gZmxhZykgew0KKyAgICAgICAgaWYgKF9yZWFkT25seSAmJiBmbGFnICE9IGlzUG9zdExvYWQoKSkNCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgCV9wb3N0TG9hZCA9IChmbGFnKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFdoZXRoZXIgbG9hZGluZyB0aGlzIGZldGNoIGdyb3VwIGNhdXNlcyBhIHBvc3QtbG9hZCBjYWxsYmFjayBvbiB0aGUNCisgICAgICogbG9hZGVkIGluc3RhbmNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gaXNQb3N0TG9hZCAoKSB7DQorICAgIAlpZiAoX3Bvc3RMb2FkICE9IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIF9wb3N0TG9hZC5ib29sZWFuVmFsdWUoKTsNCisNCisgICAgICAgIGlmIChfbWV0YSAhPSBudWxsKSB7DQorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBfbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOw0KKyAgICAgICAgICAgIGlmIChzdXAgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBGZXRjaEdyb3VwIHN1cEZHID0gc3VwLmdldEZldGNoR3JvdXAoX25hbWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoc3VwRkcgIT0gbnVsbCAmJiBzdXBGRy5pc1Bvc3RMb2FkKCkpDQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoX2luY2x1ZGVzID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgRmV0Y2hHcm91cCBmZzsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2luY2x1ZGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgZmcgPSBfbWV0YS5nZXRGZXRjaEdyb3VwKChTdHJpbmcpIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgICAgIGlmIChmZyAhPSBudWxsICYmIGZnLmlzUG9zdExvYWQoKSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFdoZXRoZXIgdGhlIHBvc3QtbG9hZCB2YWx1ZSBpcyBkZWNsYXJlZCBmb3IgdGhpcyBncm91cC4gIA0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gaXNQb3N0TG9hZEV4cGxpY2l0KCkgew0KKyAgICAgICAgcmV0dXJuIF9wb3N0TG9hZCAhPSBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBmZXRjaCBncm91cCBtZXRhZGF0YS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoKSB7DQorICAgICAgICBpZiAoX2luY2x1ZGVzID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgLy8gdmFsaWRhdGUgaW5jbHVkZXMNCisgICAgICAgIFN0cmluZyBuYW1lOw0KKyAgICAgICAgRmV0Y2hHcm91cCBmZzsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2luY2x1ZGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgbmFtZSA9IChTdHJpbmcpIGl0ci5uZXh0KCk7DQorICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKF9uYW1lKSkNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJjeWNsaWMtZmciLCB0aGlzLCBuYW1lKSk7DQorICAgICAgICAgICAgZmcgPSBfbWV0YS5nZXRGZXRjaEdyb3VwKG5hbWUpOw0KKyAgICAgICAgICAgIGlmIChmZyA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1mZy1pbmNsdWRlIiwgdGhpcywNCisgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsNCisgICAgICAgICAgICBpZiAoZmcuaW5jbHVkZXMoX25hbWUsIHRydWUpKQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImN5Y2xpYy1mZyIsIHRoaXMsIG5hbWUpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEFmZmlybXMgZXF1YWxpdHkgaWYgdGhlIG90aGVyIGhhcyB0aGUgc2FtZSBuYW1lIGFuZCBkZWNsYXJpbmcgdHlwZS4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGZXRjaEdyb3VwKSkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBGZXRjaEdyb3VwIHRoYXQgPSAoRmV0Y2hHcm91cCkgb3RoZXI7DQorICAgICAgICByZXR1cm4gX25hbWUuZXF1YWxzKHRoYXQuX25hbWUpDQorICAgICAgICAgICAgJiYgT2JqZWN0VXRpbHMuZXF1YWxzKF9tZXRhLCB0aGF0Ll9tZXRhKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIF9uYW1lLmhhc2hDb2RlKCkgKyAoKF9tZXRhID09IG51bGwpID8gMCA6IF9tZXRhLmhhc2hDb2RlKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICByZXR1cm4gKChfbWV0YSA9PSBudWxsKSA/ICJCdWlsdGluIiA6IF9tZXRhLnRvU3RyaW5nICgpKSArICIuIiArIF9uYW1lOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9GaWVsZE1ldGFEYXRhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvRmllbGRNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2U1N2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvRmllbGRNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTk4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29tcGFyYXRvcnMuQ29tcGFyYXRvckNoYWluOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuSmF2YVZlcnNpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuQ29tbWVudGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIE1ldGFkYXRhIGZvciBhIG1hbmFnZWQgY2xhc3MgZmllbGQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIEZpZWxkTWV0YURhdGEKKyAgICBleHRlbmRzIEV4dGVuc2lvbnMKKyAgICBpbXBsZW1lbnRzIFZhbHVlTWV0YURhdGEsIE1ldGFEYXRhQ29udGV4dCwgTWV0YURhdGFNb2RlcywgQ29tbWVudGFibGUgeworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0YW50IHNwZWNpZnlpbmcgdGhhdCBubyBudWxsLXZhbHVlIHdhcyBnaXZlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMX1VOU0VUID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBzcGVjaWZ5aW5nIHRvIHVzZSBhIGRhdGFzdG9yZSBudWxsIHRvIHBlcnNpc3QgbnVsbCB2YWx1ZXMKKyAgICAgKiBpbiBvYmplY3QgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBzcGVjaWZ5aW5nIHRvIHVzZSBhIGRhdGFzdG9yZSBkZWZhdWx0IHZhbHVlIHRvIHBlcnNpc3QgbnVsbAorICAgICAqIHZhbHVlcyBpbiBvYmplY3QgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfREVGQVVMVCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBzcGVjaWZ5aW5nIHRvIHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gcGVyc2lzdAorICAgICAqIG51bGwgdmFsdWVzIGluIG9iamVjdCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9FWENFUFRJT04gPSAyOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgc3BlY2lmeWluZyB0aGUgbWFuYWdlbWVudCBsZXZlbCBvZiBhIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTkFHRV9QRVJTSVNURU5UID0gMzsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHNwZWNpZnlpbmcgdGhlIG1hbmFnZW1lbnQgbGV2ZWwgb2YgYSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5BR0VfVFJBTlNBQ1RJT05BTCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBzcGVjaWZ5aW5nIHRoZSBtYW5hZ2VtZW50IGxldmVsIG9mIGEgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOQUdFX05PTkUgPSAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRmllbGRNZXRhRGF0YS5jbGFzcyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREZHX0ZBTFNFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREZHX1RSVUUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERkdfRVhQTElDSVQgPSA0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIERFRkFVTFRfTUVUSE9EOworICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBERUZBVUxUX01FVEhPRCA9IE9iamVjdC5jbGFzcy5nZXRNZXRob2QoIndhaXQiLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgZXZlciBoYXBwZW4KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5hbWUgYW5kIHR5cGUKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlTWV0YURhdGEgX3ZhbDsKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlTWV0YURhdGEgX2tleTsKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlTWV0YURhdGEgX2VsZW07CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc01ldGFEYXRhIF9vd25lcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfbmFtZTsKKyAgICBwcml2YXRlIENsYXNzIF9kZWMgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfZGVjTWV0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfZW1iZWRGdWxsTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX3Jlc01vZGUgPSBNT0RFX05PTkU7CisKKyAgICAvLyBsb2FkL3N0b3JlIGluZm8KKyAgICBwcml2YXRlIFN0cmluZ1tdIF9jb21tZW50cyA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2xpc3RJbmRleCA9IC0xOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBOb3RlOiBpZiB5b3UgYWRkIGFkZGl0aW9uYWwgc3RhdGUsIG1ha2Ugc3VyZSB0byBhZGQgaXQgdG8gY29weSgpCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vIG1pc2MgaW5mbworICAgIHByaXZhdGUgQ2xhc3MgX3Byb3h5Q2xhc3MgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0IF9pbml0aWFsaXplciA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF90cmFuc2llbnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3ByaW1LZXkgPSBmYWxzZTsKKyAgICBwcml2YXRlIEJvb2xlYW4gX3ZlcnNpb24gPSBudWxsOworICAgIHByaXZhdGUgaW50IF9udWxsVmFsdWUgPSBOVUxMX1VOU0VUOworICAgIHByaXZhdGUgaW50IF9tYW5hZ2UgPSBNQU5BR0VfUEVSU0lTVEVOVDsKKyAgICBwcml2YXRlIGludCBfaW5kZXggPSAtMTsKKyAgICBwcml2YXRlIGludCBfZGVjSW5kZXggPSAtMTsKKyAgICBwcml2YXRlIGludCBfcGtJbmRleCA9IC0xOworICAgIHByaXZhdGUgYm9vbGVhbiBfZXhwbGljaXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBfZGZnID0gMDsKKyAgICBwcml2YXRlIFNldCBfZmdTZXQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nW10gX2ZncyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgICBfbGZnID0gbnVsbDsKKyAgICBwcml2YXRlIEJvb2xlYW4gX2xycyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2V4dE5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9mYWN0TmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2V4dFN0cmluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXAgX2V4dFZhbHVlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICBwcml2YXRlIE1hcCBfZmllbGRWYWx1ZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisKKyAgICAvLyBNZW1iZXJzIGFyZW4ndCBzZXJpYWxpemFibGUuIFVzZSBhIHByb3h5IHRoYXQgY2FuIHByb3ZpZGUgYSBNZW1iZXIKKyAgICAvLyB0byBhdm9pZCB3cml0aW5nIHRoZSBmdWxsIEV4dGVybmFsaXphYmxlIGltcGxlbWVudGF0aW9uLgorICAgIHByaXZhdGUgdHJhbnNpZW50IE1lbWJlclByb3ZpZGVyIF9iYWNraW5nTWVtYmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyBNZW1iZXJzIGFyZW4ndCBzZXJpYWxpemFibGUuIEluaXRpYWxpemluZyBfZXh0TWV0aG9kIGFuZCBfZmFjdE1ldGhvZCB0byAKKyAgICAvLyBERUZBVUxUX01FVEhPRCBpcyBzdWZmaWNpZW50IHRvIHRyaWdnZXIgbGF6eSBwb3B1bGF0aW9uIG9mIHRoZXNlIGZpZWxkcy4KKyAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRob2QgX2V4dE1ldGhvZCA9IERFRkFVTFRfTUVUSE9EOworICAgIHByaXZhdGUgdHJhbnNpZW50IE1lbWJlciBfZmFjdE1ldGhvZCA9IERFRkFVTFRfTUVUSE9EOworCisgICAgLy8gaW50ZXJtZWRpYXRlIGFuZCBpbXBsIGRhdGEKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ludGVybWVkaWF0ZSA9IHRydWU7CisgICAgcHJpdmF0ZSBCb29sZWFuIF9pbXBsRGF0YSA9IEJvb2xlYW4uVFJVRTsKKworICAgIC8vIHZhbHVlIGdlbmVyYXRpb24KKyAgICBwcml2YXRlIGludCBfdmFsU3RyYXRlZ3kgPSAtMTsKKyAgICBwcml2YXRlIGludCBfdXBTdHJhdGVneSA9IC0xOworICAgIHByaXZhdGUgU3RyaW5nIF9zZXFOYW1lID0gQ2xhc3NNZXRhRGF0YS5ERUZBVUxUX1NUUklORzsKKyAgICBwcml2YXRlIFNlcXVlbmNlTWV0YURhdGEgX3NlcU1ldGEgPSBudWxsOworCisgICAgLy8gaW52ZXJzZXMKKyAgICBwcml2YXRlIFN0cmluZyBfbWFwcGVkQnkgPSBudWxsOworICAgIHByaXZhdGUgRmllbGRNZXRhRGF0YSBfbWFwcGVkQnlNZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIEZpZWxkTWV0YURhdGFbXSBfaW52ZXJzZXMgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9pbnZlcnNlID0gQ2xhc3NNZXRhRGF0YS5ERUZBVUxUX1NUUklORzsKKworICAgIC8vIG9yZGVyaW5nIG9uIGxvYWQKKyAgICBwcml2YXRlIE9yZGVyW10gX29yZGVycyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX29yZGVyRGVjID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpZWxkIG5hbWUKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZmllbGQgdHlwZQorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duaW5nIGNsYXNzIG1ldGFkYXRhCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkTWV0YURhdGEoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUsIENsYXNzTWV0YURhdGEgb3duZXIpIHsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgICAgICBfb3duZXIgPSBvd25lcjsKKyAgICAgICAgX2RlYyA9IG51bGw7CisgICAgICAgIF9kZWNNZXRhID0gbnVsbDsKKyAgICAgICAgX3ZhbCA9IG93bmVyLmdldFJlcG9zaXRvcnkoKS5uZXdWYWx1ZU1ldGFEYXRhKHRoaXMpOworICAgICAgICBfa2V5ID0gb3duZXIuZ2V0UmVwb3NpdG9yeSgpLm5ld1ZhbHVlTWV0YURhdGEodGhpcyk7CisgICAgICAgIF9lbGVtID0gb3duZXIuZ2V0UmVwb3NpdG9yeSgpLm5ld1ZhbHVlTWV0YURhdGEodGhpcyk7CisKKyAgICAgICAgc2V0RGVjbGFyZWRUeXBlKHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBseSB0aGUgYmFja2luZyBtZW1iZXIgb2JqZWN0OyB0aGlzIGFsbG93cyB1cyB0byB1dGlsaXplCisgICAgICogcGFyYW1ldGVyaXplZCB0eXBlIGluZm9ybWF0aW9uIGlmIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiYWNraW5nTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaWYgKG1lbWJlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoTW9kaWZpZXIuaXNUcmFuc2llbnQobWVtYmVyLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIF90cmFuc2llbnQgPSB0cnVlOworCisgICAgICAgIF9iYWNraW5nTWVtYmVyID0gbmV3IE1lbWJlclByb3ZpZGVyKG1lbWJlcik7CisKKyAgICAgICAgQ2xhc3MgdHlwZTsKKyAgICAgICAgQ2xhc3NbXSB0eXBlczsKKyAgICAgICAgaWYgKG1lbWJlciBpbnN0YW5jZW9mIEZpZWxkKSB7CisgICAgICAgICAgICBGaWVsZCBmID0gKEZpZWxkKSBtZW1iZXI7CisgICAgICAgICAgICB0eXBlID0gZi5nZXRUeXBlKCk7CisgICAgICAgICAgICB0eXBlcyA9IEphdmFWZXJzaW9ucy5nZXRQYXJhbWV0ZXJpemVkVHlwZXMoZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aCA9IChNZXRob2QpIG1lbWJlcjsKKyAgICAgICAgICAgIHR5cGUgPSBtZXRoLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgICAgIHR5cGVzID0gSmF2YVZlcnNpb25zLmdldFBhcmFtZXRlcml6ZWRUeXBlcyhtZXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldERlY2xhcmVkVHlwZSh0eXBlKTsKKyAgICAgICAgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKQorICAgICAgICAgICAgJiYgX2VsZW0uZ2V0RGVjbGFyZWRUeXBlKCkgPT0gT2JqZWN0LmNsYXNzCisgICAgICAgICAgICAmJiB0eXBlcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgX2VsZW0uc2V0RGVjbGFyZWRUeXBlKHR5cGVzWzBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKQorICAgICAgICAgICAgJiYgdHlwZXMubGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgIGlmIChfa2V5LmdldERlY2xhcmVkVHlwZSgpID09IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgICAgICBfa2V5LnNldERlY2xhcmVkVHlwZSh0eXBlc1swXSk7CisgICAgICAgICAgICBpZiAoX2VsZW0uZ2V0RGVjbGFyZWRUeXBlKCkgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgIF9lbGVtLnNldERlY2xhcmVkVHlwZSh0eXBlc1sxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJhY2tpbmcgbWVtYmVyIHN1cHBsaWVkIGluIHtAbGluayAjYmFja2luZ01lbWJlcn0uCisgICAgICovCisgICAgcHVibGljIE1lbWJlciBnZXRCYWNraW5nTWVtYmVyKCkgeworICAgICAgICByZXR1cm4gKF9iYWNraW5nTWVtYmVyID09IG51bGwpID8gbnVsbCA6IF9iYWNraW5nTWVtYmVyLmdldE1lbWJlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhZGF0YSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIF9vd25lci5nZXRSZXBvc2l0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHRoYXQgZGVmaW5lcyB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0RGVmaW5pbmdNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF9vd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVjbGFyaW5nIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXREZWNsYXJpbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gKF9kZWMgPT0gbnVsbCkgPyBfb3duZXIuZ2V0RGVzY3JpYmVkVHlwZSgpIDogX2RlYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVjbGFyaW5nIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmluZ1R5cGUoQ2xhc3MgY2xzKSB7CisgICAgICAgIF9kZWMgPSBjbHM7CisgICAgICAgIF9kZWNNZXRhID0gbnVsbDsKKyAgICAgICAgX2Z1bGxOYW1lID0gbnVsbDsKKyAgICAgICAgX2VtYmVkRnVsbE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWNsYXJpbmcgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0RGVjbGFyaW5nTWV0YURhdGEoKSB7CisgICAgICAgIGlmIChfZGVjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX293bmVyOworICAgICAgICBpZiAoX2RlY01ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWNNZXRhID0gZ2V0UmVwb3NpdG9yeSgpLmdldE1ldGFEYXRhKF9kZWMsCisgICAgICAgICAgICAgICAgX293bmVyLmdldEVudkNsYXNzTG9hZGVyKCksIHRydWUpOworICAgICAgICByZXR1cm4gX2RlY01ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkIG5hbWUsIHF1YWxpZmllZCBieSB0aGUgb3duaW5nIGNsYXNzLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRGdWxsTmFtZShib29sZWFuKSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRGdWxsTmFtZShmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkIG5hbWUsIHF1YWxpZmllZCBieSB0aGUgb3duaW5nIGNsYXNzIGFuZCBvcHRpb25hbGx5IHRoZQorICAgICAqIGVtYmVkZGluZyBvd25lcidzIG5hbWUgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZShib29sZWFuIGVtYmVkT3duZXIpIHsKKyAgICAgICAgaWYgKF9mdWxsTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgX2Z1bGxOYW1lID0gZ2V0RGVjbGFyaW5nVHlwZSgpLmdldE5hbWUoKSArICIuIiArIF9uYW1lOworICAgICAgICBpZiAoZW1iZWRPd25lciAmJiBfZW1iZWRGdWxsTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX293bmVyLmdldEVtYmVkZGluZ01ldGFEYXRhKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZW1iZWRGdWxsTmFtZSA9IF9mdWxsTmFtZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZW1iZWRGdWxsTmFtZSA9IF9vd25lci5nZXRFbWJlZGRpbmdNZXRhRGF0YSgpLgorICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZE1ldGFEYXRhKCkuZ2V0RnVsbE5hbWUodHJ1ZSkgKyAiLiIgKyBfZnVsbE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChlbWJlZE93bmVyKSA/IF9lbWJlZEZ1bGxOYW1lIDogX2Z1bGxOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGFEYXRhIGFib3V0IHRoZSBmaWVsZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVNZXRhRGF0YSBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0YWRhdGEgYWJvdXQgdGhlIGtleSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVNZXRhRGF0YSBnZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBfa2V5OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGFkYXRhIGFib3V0IHRoZSBlbGVtZW50IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZU1ldGFEYXRhIGdldEVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBfZWxlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGZpZWxkIGlzIG1hcHBlZCB0byB0aGUgZGF0YXN0b3JlLiBCeSBkZWZhdWx0LAorICAgICAqIHJldHVybnMgdHJ1ZSBmb3IgYWxsIHBlcnNpc3RlbnQgZmllbGRzIHdob3NlIGRlZmluaW5nIGNsYXNzIGlzIG1hcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9tYW5hZ2UgPT0gTUFOQUdFX1BFUlNJU1RFTlQgJiYgX293bmVyLmlzTWFwcGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgdGhpcyBmaWVsZCB3YXMgaW5pdGlhbGl6ZWQgd2l0aCwgYW5kIHRoZXJlZm9yZSB0aGUKKyAgICAgKiB0eXBlIHRvIHVzZSBmb3IgcHJveGllcyB3aGVuIGxvYWRpbmcgZGF0YSBpbnRvIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFByb3h5VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChfcHJveHlDbGFzcyA9PSBudWxsKSA/IGdldERlY2xhcmVkVHlwZSgpIDogX3Byb3h5Q2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgdGhpcyBmaWVsZCB3YXMgaW5pdGlhbGl6ZWQgd2l0aCwgYW5kIHRoZXJlZm9yZSB0aGUKKyAgICAgKiB0eXBlIHRvIHVzZSBmb3IgcHJveGllcyB3aGVuIGxvYWRpbmcgZGF0YSBpbnRvIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgX3Byb3h5Q2xhc3MgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbml0aWFsaXplciB1c2VkIGJ5IHRoZSBmaWVsZCwgb3IgbnVsbCBpZiBub25lLiBUaGlzCisgICAgICogaXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIHRoZSBmaWVsZCwgc3VjaCBhcworICAgICAqIGEgY3VzdG9tIHtAbGluayBDb21wYXJhdG9yfSB1c2VkIGJ5IGEge0BsaW5rIFNldH0gb3IKKyAgICAgKiBhIHtAbGluayBUaW1lWm9uZX0gdXNlZCBieSBhIHtAbGluayBDYWxlbmRhcn0uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRJbml0aWFsaXplcigpIHsKKyAgICAgICAgcmV0dXJuIF9pbml0aWFsaXplcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5pdGlhbGl6ZXIgdXNlZCBieSB0aGUgZmllbGQsIG9yIG51bGwgaWYgbm9uZS4gVGhpcworICAgICAqIGlzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyB0aGUgZmllbGQsIHN1Y2ggYXMKKyAgICAgKiBhIGN1c3RvbSB7QGxpbmsgQ29tcGFyYXRvcn0gdXNlZCBieSBhIHtAbGluayBTZXR9IG9yCisgICAgICogYSB7QGxpbmsgVGltZVpvbmV9IHVzZWQgYnkgYSB7QGxpbmsgQ2FsZW5kYXJ9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxpemVyKE9iamVjdCBpbml0aWFsaXplcikgeworICAgICAgICBfaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgeworICAgICAgICByZXR1cm4gX3RyYW5zaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIHRyYW5zKSB7CisgICAgICAgIF90cmFuc2llbnQgPSB0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWJzb2x1dGUgaW5kZXggb2YgdGhpcyBwZXJzaXN0ZW50L3RyYW5zYWN0aW9uYWwgZmllbGQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWJzb2x1dGUgaW5kZXggb2YgdGhpcyBwZXJzaXN0ZW50L3RyYW5zYWN0aW9uYWwgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIF9pbmRleCA9IGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWxhdGl2ZSBpbmRleCBvZiB0aGlzIHBlcnNpc3RlbnQvdHJhbnNhY3Rpb25hbCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlY2xhcmVkSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfZGVjSW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlbGF0aXZlIGluZGV4IG9mIHRoaXMgcGVyc2lzdGVudC90cmFuc2FjdGlvbmFsIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmVkSW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIF9kZWNJbmRleCA9IGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBpbiB3aGljaCB0aGlzIGZpZWxkIHdhcyBsaXN0ZWQgaW4gdGhlIG1ldGFkYXRhLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPi0xPC9jb2RlPiBpZiB0aGlzIGZpZWxkIHdhcyBub3QgbGlzdGVkIGluIHRoZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExpc3RpbmdJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9saXN0SW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IGluIHdoaWNoIHRoaXMgZmllbGQgd2FzIGxpc3RlZCBpbiB0aGUgbWV0YWRhdGEuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+LTE8L2NvZGU+IGlmIHRoaXMgZmllbGQgd2FzIG5vdCBsaXN0ZWQgaW4gdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RpbmdJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgX2xpc3RJbmRleCA9IGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhYnNvbHV0ZSBwcmltYXJ5IGtleSBpbmRleCBmb3IgdGhpcyBmaWVsZCwgb3IgLTEgaWYgbm90IGEgcHJpbWFyeQorICAgICAqIGtleS4gVGhlIGZpcnN0IHByaW1hcnkga2V5IGZpZWxkIGhhcyBpbmRleCAwLCB0aGUgc2Vjb25kIGluZGV4IDEsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByaW1hcnlLZXlJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9wa0luZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhYnNvbHV0ZSBwcmltYXJ5IGtleSBpbmRleCBmb3IgdGhpcyBmaWVsZCwgb3IgLTEgaWYgbm90IGEgcHJpbWFyeQorICAgICAqIGtleS4gVGhlIGZpcnN0IHByaW1hcnkga2V5IGZpZWxkIGhhcyBpbmRleCAwLCB0aGUgc2Vjb25kIGluZGV4IDEsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIF9wa0luZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYW5hZ2VtZW50IGxldmVsIGZvciB0aGUgZmllbGQuIFdpbGwgYmUgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNNQU5BR0VfUEVSU0lTVEVOVH06IHRoZSBmaWVsZCBpcyBwZXJzaXN0ZW50PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNNQU5BR0VfVFJBTlNBQ1RJT05BTH06IHRoZSBmaWVsZCBpcyB0cmFuc2FjdGlvbmFsIGJ1dCBub3QKKyAgICAgKiBwZXJzaXN0ZW50PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNNQU5BR0VfTk9ORX06IHRoZSBmaWVsZCBpcyBub3QgbWFuYWdlZDwvbGk+CisgICAgICogPC91bD4gRGVmYXVsdHMgdG8ge0BsaW5rICNNQU5BR0VfUEVSU0lTVEVOVH0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYW5hZ2VtZW50KCkgeworICAgICAgICByZXR1cm4gX21hbmFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hbmFnZW1lbnQgbGV2ZWwgZm9yIHRoZSBmaWVsZC4gV2lsbCBiZSBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI01BTkFHRV9QRVJTSVNURU5UfTogdGhlIGZpZWxkIGlzIHBlcnNpc3RlbnQ8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI01BTkFHRV9UUkFOU0FDVElPTkFMfTogdGhlIGZpZWxkIGlzIHRyYW5zYWN0aW9uYWwgYnV0IG5vdAorICAgICAqIHBlcnNpc3RlbnQ8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI01BTkFHRV9OT05FfTogdGhlIGZpZWxkIGlzIG5vdCBtYW5hZ2VkPC9saT4KKyAgICAgKiA8L3VsPiAKKyAgICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgI01BTkFHRV9QRVJTSVNURU5UfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VtZW50KGludCBtYW5hZ2UpIHsKKyAgICAgICAgaWYgKChfbWFuYWdlID09IE1BTkFHRV9OT05FKSAhPSAobWFuYWdlID09IE1BTkFHRV9OT05FKSkKKyAgICAgICAgICAgIF9vd25lci5jbGVhckZpZWxkQ2FjaGUoKTsKKyAgICAgICAgX21hbmFnZSA9IG1hbmFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcmltYXJ5IGtleSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXkoKSB7CisgICAgICAgIHJldHVybiBfcHJpbUtleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcmltYXJ5IGtleSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5KGJvb2xlYW4gcHJpbUtleSkgeworICAgICAgICBfcHJpbUtleSA9IHByaW1LZXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIGEgcHJpbWFyeSBrZXkgZmllbGQsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgaWQgCisgICAgICogY2xhc3MgZmllbGQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPYmplY3RJZEZpZWxkVHlwZUNvZGUoKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgcmVsbWV0YSA9IGdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgICAgIGlmIChyZWxtZXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0RGVjbGFyZWRUeXBlQ29kZSgpOworICAgICAgICBpZiAocmVsbWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRSkgeworICAgICAgICAgICAgYm9vbGVhbiB1bndyYXAgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGFGYWN0b3J5KCkuZ2V0RGVmYXVsdHMoKS4KKyAgICAgICAgICAgICAgICBpc0RhdGFTdG9yZU9iamVjdElkRmllbGRVbndyYXBwZWQoKTsKKyAgICAgICAgICAgIHJldHVybiAodW53cmFwKSA/IEphdmFUeXBlcy5MT05HIDogSmF2YVR5cGVzLk9CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVsbWV0YS5pc09wZW5KUEFJZGVudGl0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHJlbG1ldGEuZ2V0UHJpbWFyeUtleUZpZWxkcygpWzBdLmdldE9iamVjdElkRmllbGRUeXBlQ29kZSgpOworICAgICAgICByZXR1cm4gSmF2YVR5cGVzLk9CSkVDVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgYSBwcmltYXJ5IGtleSBmaWVsZCwgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCBpZCAKKyAgICAgKiBjbGFzcyBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0T2JqZWN0SWRGaWVsZFR5cGUoKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgcmVsbWV0YSA9IGdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgICAgIGlmIChyZWxtZXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgIHN3aXRjaCAocmVsbWV0YS5nZXRJZGVudGl0eVR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRToKKyAgICAgICAgICAgICAgICBib29sZWFuIHVud3JhcCA9IGdldFJlcG9zaXRvcnkoKS5nZXRNZXRhRGF0YUZhY3RvcnkoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdHMoKS5pc0RhdGFTdG9yZU9iamVjdElkRmllbGRVbndyYXBwZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVud3JhcCkgPyBsb25nLmNsYXNzIDogT2JqZWN0LmNsYXNzOworICAgICAgICAgICAgY2FzZSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGlmIChyZWxtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxtZXRhLmdldFByaW1hcnlLZXlGaWVsZHMoKVswXS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdElkRmllbGRUeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZWxtZXRhLmdldE9iamVjdElkVHlwZSgpID09IG51bGwpID8gT2JqZWN0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgIDogcmVsbWV0YS5nZXRPYmplY3RJZFR5cGUoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICAgICAgfSAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgaG9sZHMgb3B0aW1pc3RpYyB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIF92ZXJzaW9uID09IEJvb2xlYW4uVFJVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgaG9sZHMgb3B0aW1pc3RpYyB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oYm9vbGVhbiB2ZXJzaW9uKSB7CisgICAgICAgIF92ZXJzaW9uID0gKHZlcnNpb24pID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgaW4gdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbkRlZmF1bHRGZXRjaEdyb3VwKCkgeworICAgICAgICBpZiAoX2RmZyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX21hbmFnZSAhPSBNQU5BR0VfUEVSU0lTVEVOVCB8fCBpc1ByaW1hcnlLZXkoKSB8fCBpc1ZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICBfZGZnID0gREZHX0ZBTFNFOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmllbGQgbGVmdCBhcyBkZWZhdWx0OyBkZmcgc2V0dGluZyBkZXBlbmRzIG9uIHR5cGUKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZmcgPSBERkdfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZmcgPSBERkdfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChfZGZnICYgREZHX1RSVUUpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgaW4gdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5EZWZhdWx0RmV0Y2hHcm91cChib29sZWFuIGRmZykgeworICAgICAgICBpZiAoZGZnKQorICAgICAgICAgICAgX2RmZyA9IERGR19UUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGZnID0gREZHX0ZBTFNFOworICAgICAgICBfZGZnIHw9IERGR19FWFBMSUNJVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIHNldHRpbmcgaXMgZXhwbGljaXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0RmV0Y2hHcm91cEV4cGxpY2l0KCkgeworICAgICAgICByZXR1cm4gKF9kZmcgJiBERkdfRVhQTElDSVQpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIHNldHRpbmcgaXMgZXhwbGljaXQuIEFsbG93IHNldHRpbmcKKyAgICAgKiBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmV0Y2hHcm91cEV4cGxpY2l0KGJvb2xlYW4gZXhwbGljaXQpIHsKKyAgICAgICAgaWYgKGV4cGxpY2l0KQorICAgICAgICAgICAgX2RmZyB8PSBERkdfRVhQTElDSVQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kZmcgJj0gfkRGR19FWFBMSUNJVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZmV0Y2ggZ3JvdXBzIHRob3NlIGFyZSBhc3NvY2lhdGVkIHRvIHRoaXMgCisgICAgICogcmVjZWl2ZXIuICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlICJkZWZhdWx0IiBhbmQgImFsbCIgZmV0Y2ggZ3JvdXBzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGZldGNoIGdyb3VwIG5hbWVzLCBub3QgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IGFuZAorICAgICAqIGFsbCBmZXRjaCBncm91cHMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEN1c3RvbUZldGNoR3JvdXBzKCkgeworICAgICAgICBpZiAoX2ZncyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoX2ZnU2V0ID09IG51bGwgfHwgX21hbmFnZSAhPSBNQU5BR0VfUEVSU0lTVEVOVCAKKyAgICAgICAgICAgICAgICB8fCBpc1ByaW1hcnlLZXkoKSB8fCBpc1ZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICBfZmdzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZmdzID0gKFN0cmluZ1tdKSBfZmdTZXQudG9BcnJheShuZXcgU3RyaW5nW19mZ1NldC5zaXplKCldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2ZnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmV0Y2ggZ3JvdXAgdGhhdCBpcyB0byBiZSBsb2FkZWQgd2hlbiB0aGlzIHJlY2VpdmVyIGlzIGxvYWRlZCwgb3IKKyAgICAgKiBudWxsIGlmIG5vbmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9hZEZldGNoR3JvdXAgKCkgeworICAgIAlyZXR1cm4gX2xmZzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGZldGNoIGdyb3VwIHRoYXQgaXMgdG8gYmUgbG9hZGVkIHdoZW4gdGhpcyByZWNlaXZlciBpcyBsb2FkZWQsIG9yCisgICAgICogbnVsbCBpZiBub25lIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRmV0Y2hHcm91cCAoU3RyaW5nIGxmZykgeworICAgICAgICBpZiAoIiIuZXF1YWxzKGxmZykpCisgICAgICAgICAgICBsZmcgPSBudWxsOworICAgIAlfbGZnID0gbGZnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBpbiB0aGUgZ2l2ZW4gZmV0Y2ggZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbkZldGNoR3JvdXAoU3RyaW5nIGZnKSB7CisgICAgICAgIGlmIChfbWFuYWdlICE9IE1BTkFHRV9QRVJTSVNURU5UIHx8IGlzUHJpbWFyeUtleSgpIHx8IGlzVmVyc2lvbigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmV0Y2hHcm91cC5OQU1FX0FMTC5lcXVhbHMoZmcpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChGZXRjaEdyb3VwLk5BTUVfREVGQVVMVC5lcXVhbHMoZmcpKQorICAgICAgICAgICAgcmV0dXJuIGlzSW5EZWZhdWx0RmV0Y2hHcm91cCgpOworICAgICAgICByZXR1cm4gX2ZnU2V0ICE9IG51bGwgJiYgX2ZnU2V0LmNvbnRhaW5zKGZnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGZpZWxkIGlzIGluIHRoZSBnaXZlbiBmZXRjaCBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZyBpcyB0aGUgbmFtZSBvZiBhIGZldGNoIGdyb3VwIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQorICAgICAqIGNsYXNzIHRoYXQgZGVjbGFyZWQgdGhpcyBmaWVsZCBvciBhbnkgb2YgaXRzIHBlcnNpc3RlbnQgc3VwZXJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluRmV0Y2hHcm91cChTdHJpbmcgZmcsIGJvb2xlYW4gaW4pIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZmcpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJlbXB0eS1mZy1uYW1lIiwgdGhpcykpOworICAgICAgICBpZiAoZmcuZXF1YWxzKEZldGNoR3JvdXAuTkFNRV9BTEwpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZmcuZXF1YWxzKEZldGNoR3JvdXAuTkFNRV9ERUZBVUxUKSkgeworICAgICAgICAgICAgc2V0SW5EZWZhdWx0RmV0Y2hHcm91cChpbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9vd25lci5nZXRGZXRjaEdyb3VwKGZnKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bmtub3duLWZnIiwgZmcsIHRoaXMpKTsKKyAgICAgICAgaWYgKGluICYmIF9mZ1NldCA9PSBudWxsKQorICAgICAgICAgICAgX2ZnU2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgaWYgKChpbiAmJiBfZmdTZXQuYWRkKGZnKSkKKyAgICAgICAgICAgIHx8ICghaW4gJiYgX2ZnU2V0ICE9IG51bGwgJiYgX2ZnU2V0LnJlbW92ZShmZykpKQorICAgICAgICAgICAgX2ZncyA9IG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEhvdyB0aGUgZGF0YSBzdG9yZSBzaG91bGQgdHJlYXQgbnVsbCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI05VTExfVU5TRVR9OiBubyB2YWx1ZSBzdXBwbGllZDwvbGk+CisgICAgICogPGxpPntAbGluayAjTlVMTF9OT05FfTogbGVhdmUgbnVsbCB2YWx1ZXMgYXMgbnVsbCBpbiB0aGUgZGF0YSBzdG9yZTwvbGk+CisgICAgICogPGxpPntAbGluayAjTlVMTF9FWENFUFRJT059OiB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhpcyBmaWVsZCBpcyBudWxsCisgICAgICogYXQgY29tbWl0PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOVUxMX0RFRkFVTFR9OiB1c2UgdGhlIGRhdGFiYXNlIGRlZmF1bHQgaWYgdGhpcyBmaWVsZCBpcworICAgICAqIG51bGwgYXQgY29tbWl0PC9saT4KKyAgICAgKiA8L3VsPiBEZWZhdWx0cyB0byB7QGxpbmsgI05VTExfVU5TRVR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVsbFZhbHVlKCkgeworICAgICAgICByZXR1cm4gX251bGxWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb3cgdGhlIGRhdGEgc3RvcmUgc2hvdWxkIHRyZWF0IG51bGwgdmFsdWVzIGZvciB0aGlzIGZpZWxkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNOVUxMX1VOU0VUfTogbm8gdmFsdWUgc3VwcGxpZWQ8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05VTExfTk9ORX06IGxlYXZlIG51bGwgdmFsdWVzIGFzIG51bGwgaW4gdGhlIGRhdGEgc3RvcmU8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05VTExfRVhDRVBUSU9OfTogdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoaXMgZmllbGQgaXMgbnVsbAorICAgICAqIGF0IGNvbW1pdDwvbGk+CisgICAgICogPGxpPntAbGluayAjTlVMTF9ERUZBVUxUfTogdXNlIHRoZSBkYXRhYmFzZSBkZWZhdWx0IGlmIHRoaXMgZmllbGQgaXMKKyAgICAgKiBudWxsIGF0IGNvbW1pdDwvbGk+CisgICAgICogPC91bD4gRGVmYXVsdHMgdG8ge0BsaW5rICNOVUxMX1VOU0VUfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsVmFsdWUoaW50IG51bGxWYWx1ZSkgeworICAgICAgICBfbnVsbFZhbHVlID0gbnVsbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIGluIHRoZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGxpY2l0KCkgeworICAgICAgICByZXR1cm4gX2V4cGxpY2l0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIGluIHRoZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBsaWNpdChib29sZWFuIGV4cGxpY2l0KSB7CisgICAgICAgIF9leHBsaWNpdCA9IGV4cGxpY2l0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCB0aGF0IHRoaXMgZmllbGQgc2hhcmVzIGEgbWFwcGluZyB3aXRoLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7CisgICAgICAgIHJldHVybiBfbWFwcGVkQnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkIHRoYXQgdGhpcyBmaWVsZCBzaGFyZXMgYSBtYXBwaW5nIHdpdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZCkgeworICAgICAgICBfbWFwcGVkQnkgPSBtYXBwZWQ7CisgICAgICAgIF9tYXBwZWRCeU1ldGEgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCB0aGF0IHRoaXMgZmllbGQgc2hhcmVzIGEgbWFwcGluZyB3aXRoLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhIGdldE1hcHBlZEJ5TWV0YURhdGEoKSB7CisgICAgICAgIGlmIChfbWFwcGVkQnkgIT0gbnVsbCAmJiBfbWFwcGVkQnlNZXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICAgICAgbWV0YSA9IGdldFR5cGVNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgbWV0YSA9IF9lbGVtLmdldFR5cGVNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmaWVsZCA9IChtZXRhID09IG51bGwpID8gbnVsbAorICAgICAgICAgICAgICAgIDogbWV0YS5nZXRGaWVsZChfbWFwcGVkQnkpOworICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1tYXBwZWQtYnkiLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBfbWFwcGVkQnkpKTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJjaXJjLW1hcHBlZC1ieSIsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIF9tYXBwZWRCeSkpOworICAgICAgICAgICAgX21hcHBlZEJ5TWV0YSA9IGZpZWxkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbWFwcGVkQnlNZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ2ljYWwgaW52ZXJzZSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludmVyc2UoKSB7CisgICAgICAgIGlmIChDbGFzc01ldGFEYXRhLkRFRkFVTFRfU1RSSU5HLmVxdWFscyhfaW52ZXJzZSkpCisgICAgICAgICAgICBfaW52ZXJzZSA9IG51bGw7CisgICAgICAgIHJldHVybiBfaW52ZXJzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dpY2FsIGludmVyc2UgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW52ZXJzZShTdHJpbmcgaW52ZXJzZSkgeworICAgICAgICBfaW52ZXJzZXMgPSBudWxsOworICAgICAgICBfaW52ZXJzZSA9IGludmVyc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBpbnZlcnNlcyBvZiB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhW10gZ2V0SW52ZXJzZU1ldGFEYXRhcygpIHsKKyAgICAgICAgaWYgKF9pbnZlcnNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBjYW4ndCBkZWNsYXJlIGJvdGggYW4gaW52ZXJzZSBvd25lciBhbmQgYSBsb2dpY2FsIGludmVyc2UKKyAgICAgICAgICAgIFN0cmluZyBpbnYgPSBnZXRJbnZlcnNlKCk7CisgICAgICAgICAgICBpZiAoX21hcHBlZEJ5ICE9IG51bGwgJiYgaW52ICE9IG51bGwgJiYgIV9tYXBwZWRCeS5lcXVhbHMoaW52KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm1hcHBlZC1ub3QtaW52ZXJzZSIsCisgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKKworICAgICAgICAgICAgLy8gZ2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIHR5cGUgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhpcyByZWxhdGlvbgorICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gbnVsbDsKKyAgICAgICAgICAgIHN3aXRjaCAoZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgICAgICAgICBtZXRhID0gZ2V0VHlwZU1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBfZWxlbS5nZXRUeXBlTWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbGxlY3Rpb24gaW52ZXJzZXMgPSBudWxsOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBtYXBwZWQgYnkgYW5kIG5hbWVkIGludmVyc2UsIGlmIGFueQorICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZmllbGQgPSBnZXRNYXBwZWRCeU1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFwcGVkIGJ5IGZpZWxkIGlzbid0IG5lY2Vzc2FyaWx5IGEgcGMgdHlwZSwgYnV0IGFsbAorICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnNlcyBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5QQworICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmllbGQuZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlcyA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlcy5hZGQoZmllbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IG1ldGEuZ2V0RmllbGQoaW52KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWludmVyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGludikpOworICAgICAgICAgICAgICAgICAgICBpbnZlcnNlcyA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgICAgICAgICAgICAgIGludmVyc2VzLmFkZChmaWVsZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2NhbiByZWwgdHlwZSBmb3IgZmllbGRzIHRoYXQgbmFtZSB0aGlzIGZpZWxkIGFzIGFuIGludmVyc2UKKyAgICAgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZmllbGRzID0gbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gZ2V0RGVjbGFyaW5nTWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBmaWVsZHMgdGhhdCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIG91ciBvd25pbmcgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZHNbaV0uZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzQXNzaWduYWJsZUZyb20oZmllbGRzW2ldLmdldFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGZpZWxkc1tpXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudCgpLmdldFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWVsZCBkZWNsYXJlcyB1cyBhcyBpdHMgaW52ZXJzZSBhbmQgd2UgaGF2ZW4ndAorICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGFkZGVkIGl0ICh3ZSBtaWdodCBoYXZlIGlmIHdlIGFsc28gZGVjbGFyZWQgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gYXMgb3VyIGludmVyc2UpLCBhZGQgaXQgbm93CisgICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZS5lcXVhbHMoZmllbGRzW2ldLmdldE1hcHBlZEJ5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBfbmFtZS5lcXVhbHMoZmllbGRzW2ldLmdldEludmVyc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnNlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VzID0gbmV3IEFycmF5TGlzdCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW52ZXJzZXMuY29udGFpbnMoZmllbGRzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlcy5hZGQoZmllbGRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICAgICAgaWYgKGludmVyc2VzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2ludmVyc2VzID0gcmVwb3MuRU1QVFlfRklFTERTOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9pbnZlcnNlcyA9IChGaWVsZE1ldGFEYXRhW10pIGludmVyc2VzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgKHJlcG9zLm5ld0ZpZWxkTWV0YURhdGFBcnJheShpbnZlcnNlcy5zaXplKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2ludmVyc2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJhdGVneSB0byB1c2UgZm9yIGluc2VydCB2YWx1ZSBnZW5lcmF0aW9uLgorICAgICAqIE9uZSBvZiB0aGUgY29uc3RhbnRzIGZyb20ge0BsaW5rIFZhbHVlU3RyYXRlZ2llc30uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWYWx1ZVN0cmF0ZWd5KCkgeworICAgICAgICBpZiAoX3ZhbFN0cmF0ZWd5ID09IC0xKQorICAgICAgICAgICAgX3ZhbFN0cmF0ZWd5ID0gVmFsdWVTdHJhdGVnaWVzLk5PTkU7CisgICAgICAgIHJldHVybiBfdmFsU3RyYXRlZ3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmF0ZWd5IHRvIHVzZSBmb3IgaW5zZXJ0IHZhbHVlIGdlbmVyYXRpb24uCisgICAgICogT25lIG9mIHRoZSBjb25zdGFudHMgZnJvbSB7QGxpbmsgVmFsdWVTdHJhdGVnaWVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVN0cmF0ZWd5KGludCBzdHJhdGVneSkgeworICAgICAgICBfdmFsU3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IFZhbHVlU3RyYXRlZ2llcy5TRVFVRU5DRSkKKyAgICAgICAgICAgIHNldFZhbHVlU2VxdWVuY2VOYW1lKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBzZXF1ZW5jZSBuYW1lLCBvciBudWxsIGZvciBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTZXF1ZW5jZU5hbWUoKSB7CisgICAgICAgIGlmIChDbGFzc01ldGFEYXRhLkRFRkFVTFRfU1RSSU5HLmVxdWFscyhfc2VxTmFtZSkpCisgICAgICAgICAgICBfc2VxTmFtZSA9IG51bGw7CisgICAgICAgIHJldHVybiBfc2VxTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgc2VxdWVuY2UgbmFtZSwgb3IgbnVsbCBmb3Igbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVNlcXVlbmNlTmFtZShTdHJpbmcgc2VxTmFtZSkgeworICAgICAgICBfc2VxTmFtZSA9IHNlcU5hbWU7CisgICAgICAgIF9zZXFNZXRhID0gbnVsbDsKKyAgICAgICAgaWYgKHNlcU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFZhbHVlU3RyYXRlZ3koVmFsdWVTdHJhdGVnaWVzLlNFUVVFTkNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRhZGF0YSBmb3IgdGhlIHZhbHVlIHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTZXF1ZW5jZU1ldGFEYXRhIGdldFZhbHVlU2VxdWVuY2VNZXRhRGF0YSgpIHsKKyAgICAgICAgaWYgKF9zZXFNZXRhID09IG51bGwgJiYgZ2V0VmFsdWVTZXF1ZW5jZU5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgX3NlcU1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0U2VxdWVuY2VNZXRhRGF0YShfb3duZXIsCisgICAgICAgICAgICAgICAgZ2V0VmFsdWVTZXF1ZW5jZU5hbWUoKSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBfc2VxTWV0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gdXBkYXRpbmcgdGhlIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VXBkYXRlU3RyYXRlZ3koKSB7CisgICAgICAgIGlmIChpc1ZlcnNpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBVcGRhdGVTdHJhdGVnaWVzLlJFU1RSSUNUOworICAgICAgICBpZiAoX3VwU3RyYXRlZ3kgPT0gLTEpCisgICAgICAgICAgICBfdXBTdHJhdGVneSA9IFVwZGF0ZVN0cmF0ZWdpZXMuTk9ORTsKKyAgICAgICAgcmV0dXJuIF91cFN0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXBkYXRlIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZVN0cmF0ZWd5KGludCBzdHJhdGVneSkgeworICAgICAgICBfdXBTdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBiYWNrZWQgYnkgYSBsYXJnZSByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTFJTKCkgeworICAgICAgICByZXR1cm4gX2xycyA9PSBCb29sZWFuLlRSVUUgJiYgX21hbmFnZSA9PSBNQU5BR0VfUEVSU0lTVEVOVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgaXMgYmFja2VkIGJ5IGEgbGFyZ2UgcmVzdWx0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMUlMoYm9vbGVhbiBscnMpIHsKKyAgICAgICAgX2xycyA9IChscnMpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgZmllbGQgdXNlcyBpbnRlcm1lZGlhdGUgZGF0YSB3aGVuIGxvYWRpbmcvc3RvcmluZworICAgICAqIGluZm9ybWF0aW9uIHRocm91Z2ggYSB7QGxpbmsgT3BlbkpQQVN0YXRlTWFuYWdlcn0uIERlZmF1bHRzIHRvIHRydWUuCisgICAgICoKKyAgICAgKiBAc2VlIE9wZW5KUEFTdGF0ZU1hbmFnZXIjc2V0SW50ZXJtZWRpYXRlKGludCxPYmplY3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdXNlc0ludGVybWVkaWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnRlcm1lZGlhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGZpZWxkIHVzZXMgaW50ZXJtZWRpYXRlIGRhdGEgd2hlbiBsb2FkaW5nL3N0b3JpbmcKKyAgICAgKiBpbmZvcm1hdGlvbiB0aHJvdWdoIGEge0BsaW5rIE9wZW5KUEFTdGF0ZU1hbmFnZXJ9LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqCisgICAgICogQHNlZSBPcGVuSlBBU3RhdGVNYW5hZ2VyI3NldEludGVybWVkaWF0ZShpbnQsT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXNJbnRlcm1lZGlhdGUoYm9vbGVhbiBpbnRlcm1lZGlhdGUpIHsKKyAgICAgICAgX2ludGVybWVkaWF0ZSA9IGludGVybWVkaWF0ZTsKKyAgICAgICAgX293bmVyLmNsZWFyRXh0cmFGaWVsZERhdGFUYWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCB1c2VzIGltcGwgZGF0YSBpbiBjb25qdW5jdGlvbiB3aXRoIHN0YW5kYXJkCisgICAgICogZmllbGQgZGF0YSB3aGVuIGFjdGluZyBvbiBhIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfS4KKyAgICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgQm9vbGVhbiNUUlVFfSAobm9uLWNhY2hhYmxlIGltcGwgZGF0YSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayBCb29sZWFuI0ZBTFNFfSBpZiB0aGlzIGZpZWxkIGRvZXMgbm90IHVzZSBpbXBsIGRhdGEsCisgICAgICoge0BsaW5rIEJvb2xlYW4jVFJVRX0gaWYgdGhpcyBmaWVsZCB1c2VzIG5vbi1jYWNoYWJsZSBpbXBsCisgICAgICogZGF0YSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBmaWVsZCB1c2VzIGltcGwgZGF0YSB0aGF0CisgICAgICogc2hvdWxkIGJlIGNhY2hlZCBhY3Jvc3MgaW5zdGFuY2VzCisgICAgICogQHNlZSBPcGVuSlBBU3RhdGVNYW5hZ2VyI3NldEltcGxEYXRhKGludCxPYmplY3QpCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gdXNlc0ltcGxEYXRhKCkgeworICAgICAgICByZXR1cm4gX2ltcGxEYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBmaWVsZCB1c2VzIGltcGwgZGF0YSBpbiBjb25qdW5jdGlvbiB3aXRoIHN0YW5kYXJkCisgICAgICogZmllbGQgZGF0YSB3aGVuIGFjdGluZyBvbiBhIHtAbGluayBPcGVuSlBBU3RhdGVNYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBzZWUgT3BlbkpQQVN0YXRlTWFuYWdlciNzZXRJbXBsRGF0YShpbnQsT2JqZWN0KQorICAgICAqIEBzZWUgI3VzZXNJbXBsRGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXNJbXBsRGF0YShCb29sZWFuIGltcGxEYXRhKSB7CisgICAgICAgIF9pbXBsRGF0YSA9IGltcGxEYXRhOworICAgICAgICBfb3duZXIuY2xlYXJFeHRyYUZpZWxkRGF0YVRhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9yZGVyaW5ncyBmb3IgdGhpcyBmaWVsZCB0byBiZSBhcHBsaWVkIG9uIGxvYWQsIG9yIGVtcHR5IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBPcmRlcltdIGdldE9yZGVycygpIHsKKyAgICAgICAgaWYgKF9vcmRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9vcmRlckRlYyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9vcmRlcnMgPSBnZXRSZXBvc2l0b3J5KCkuRU1QVFlfT1JERVJTOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gZGVjcyA9IFN0cmluZ3Muc3BsaXQoX29yZGVyRGVjLCAiLCIsIDApOworICAgICAgICAgICAgICAgIE9yZGVyW10gb3JkZXJzID0gZ2V0UmVwb3NpdG9yeSgpLm5ld09yZGVyQXJyYXkoZGVjcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGludCBzcGM7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBhc2M7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY3NbaV0gPSBkZWNzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgc3BjID0gZGVjc1tpXS5pbmRleE9mKCcgJyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYyA9IGRlY3NbaV0uc3Vic3RyaW5nKHNwYyArIDEpLnRyaW0oKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFzYyIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVjc1tpXSA9IGRlY3NbaV0uc3Vic3RyaW5nKDAsIHNwYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3JkZXJzW2ldID0gZ2V0UmVwb3NpdG9yeSgpLm5ld09yZGVyKHRoaXMsIGRlY3NbaV0sIGFzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9vcmRlcnMgPSBvcmRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9vcmRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9yZGVyaW5ncyBmb3IgdGhpcyBmaWVsZCB0byBiZSBhcHBsaWVkIG9uIGxvYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJzKE9yZGVyW10gb3JkZXJzKSB7CisgICAgICAgIF9vcmRlckRlYyA9IG51bGw7CisgICAgICAgIF9vcmRlcnMgPSBvcmRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5nIGRlY2xhcmluZyB0aGUgb3JkZXJpbmdzIGZvciB0aGlzIGZpZWxkIHRvIGJlIGFwcGxpZWQgb24gbG9hZCwKKyAgICAgKiBvciBudWxsLiBUaGUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtOjxiciAvPgorICAgICAqIDxjb2RlPm9yZGVyYWJsZVsgYXNjfGRlc2NdWywgLi4uXTwvY29kZT48YnIgLz4KKyAgICAgKiBUaGUgb3JkZXJhYmxlIDxjb2RlPiNlbGVtZW50PC9jb2RlPiBpcyB1c2VkIHRvIGRlbm90ZSB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgZmllbGQncyBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9yZGVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIGlmIChfb3JkZXJEZWMgPT0gbnVsbCAmJiBfb3JkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9vcmRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChfb3JkZXJzW2ldLmdldE5hbWUoKSkuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoX29yZGVyc1tpXS5pc0FzY2VuZGluZygpKSA/ICJhc2MiIDogImRlc2MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9vcmRlckRlYyA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfb3JkZXJEZWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5nIGRlY2xhcmluZyB0aGUgb3JkZXJpbmdzIGZvciB0aGlzIGZpZWxkIHRvIGJlIGFwcGxpZWQgb24gbG9hZCwKKyAgICAgKiBvciBudWxsLiBUaGUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtOjxiciAvPgorICAgICAqIDxjb2RlPm9yZGVyYWJsZVsgYXNjfGRlc2NdWywgLi4uXTwvY29kZT48YnIgLz4KKyAgICAgKiBUaGUgb3JkZXJhYmxlIDxjb2RlPiNlbGVtZW50PC9jb2RlPiBpcyB1c2VkIHRvIGRlbm90ZSB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgZmllbGQncyBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckRlY2xhcmF0aW9uKFN0cmluZyBkZWMpIHsKKyAgICAgICAgX29yZGVyRGVjID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChkZWMpOworICAgICAgICBfb3JkZXJzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlciB0aGlzIGZpZWxkIHZhbHVlIHdoZW4gaXQgaXMgbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3Qgb3JkZXIoT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBPcmRlcltdIG9yZGVycyA9IGdldE9yZGVycygpOworICAgICAgICBpZiAob3JkZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKworICAgICAgICAvLyBjcmVhdGUgYSBjb21wYXJhdG9yIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIHZhbHVlCisgICAgICAgIENvbXBhcmF0b3IgY29tcDsKKyAgICAgICAgaWYgKG9yZGVycy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGNvbXAgPSBvcmRlcnNbMF0uZ2V0Q29tcGFyYXRvcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgY29tcHMgPSBudWxsOworICAgICAgICAgICAgQ29tcGFyYXRvciBjdXJDb21wOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjdXJDb21wID0gb3JkZXJzW2ldLmdldENvbXBhcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyQ29tcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHMgPSBuZXcgQXJyYXlMaXN0KG9yZGVycy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBjb21wcy5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1peGVkLWlubWVtLW9yZGVyaW5nIiwgdGhpcykpOworICAgICAgICAgICAgICAgICAgICBjb21wcy5hZGQoY3VyQ29tcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbXBzID09IG51bGwpCisgICAgICAgICAgICAgICAgY29tcCA9IG51bGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcCA9IG5ldyBDb21wYXJhdG9yQ2hhaW4oY29tcHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisKKyAgICAgICAgLy8gc29ydAorICAgICAgICBzd2l0Y2ggKGdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgIExpc3QgbCA9IEphdmFUeXBlcy50b0xpc3QodmFsLCBfZWxlbS5nZXRUeXBlKCksIHRydWUpOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobCwgY29tcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFUeXBlcy50b0FycmF5KGwsIF9lbGVtLmdldFR5cGUoKSk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBMaXN0KQorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KChMaXN0KSB2YWwsIGNvbXApOworICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1vcmRlciIsIHRoaXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGV4dGVybmFsaXplZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsaXplZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEV4dGVybmFsaXplck1ldGhvZCgpICE9IG51bGwKKyAgICAgICAgICAgIHx8IGdldEV4dGVybmFsVmFsdWVNYXAoKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIGZpZWxkIHZhbHVlIHRvIGl0cyBleHRlcm5hbCB2YWx1ZSB0aHJvdWdoIHRoZQorICAgICAqIHByb3ZpZGVkIGV4dGVybmFsaXplciwgb3IgcmV0dXJuIHRoZSB2YWx1ZSBhcy1pcyBpZiBubyBleHRlcm5hbGl6ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRFeHRlcm5hbFZhbHVlKE9iamVjdCB2YWwsIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgTWFwIGV4dFZhbHVlcyA9IGdldEV4dGVybmFsVmFsdWVNYXAoKTsKKyAgICAgICAgaWYgKGV4dFZhbHVlcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGV4dFZhbHVlcy5nZXQodmFsKTsKKworICAgICAgICBNZXRob2QgZXh0ZXJuYWxpemVyID0gZ2V0RXh0ZXJuYWxpemVyTWV0aG9kKCk7CisgICAgICAgIGlmIChleHRlcm5hbGl6ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBxdWVyaWVzOiBhbGxvdyB0aGUgZ2l2ZW4gdmFsdWUgdG8gcGFzcyB0aHJvdWdoCisgICAgICAgIC8vIGFzLWlzIGlmIGl0IGlzIGFscmVhZHkgaW4gZXh0ZXJuYWxpemVkIGZvcm0KKyAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIGdldFR5cGUoKS5pc0luc3RhbmNlKHZhbCkKKyAgICAgICAgICAgICYmICghZ2V0RGVjbGFyZWRUeXBlKCkuaXNJbnN0YW5jZSh2YWwpCisgICAgICAgICAgICB8fCBnZXREZWNsYXJlZFR5cGUoKSA9PSBPYmplY3QuY2xhc3MpKQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZWl0aGVyIGludm9rZSB0aGUgc3RhdGljIHRvRXh0ZXJuYWwodmFsWywgY3R4XSkgbWV0aG9kLCBvciB0aGUKKyAgICAgICAgICAgIC8vIG5vbi1zdGF0aWMgdmFsLnRvRXh0ZXJuYWwoW2N0eF0pIG1ldGhvZAorICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzU3RhdGljKGV4dGVybmFsaXplci5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXh0ZXJuYWxpemVyLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbGl6ZXIuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXsgdmFsIH0pOworICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbGl6ZXIuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXsgdmFsLCBjdHggfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoZXh0ZXJuYWxpemVyLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsaXplci5pbnZva2UodmFsLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsaXplci5pbnZva2UodmFsLCBuZXcgT2JqZWN0W117IGN0eCB9KTsKKyAgICAgICAgfSBjYXRjaCAoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImV4dGVybmFsaXplci1lcnIiLCB0aGlzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbnMudG9TdHJpbmcodmFsKSwgZS50b1N0cmluZygpKSkuc2V0Q2F1c2UoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBwYXNzaW5nIHRoZSBnaXZlbiBleHRlcm5hbCB2YWx1ZSB0aHJvdWdoIHRoZQorICAgICAqIGZhY3RvcnkgdG8gZ2V0IHRoZSBmaWVsZCB2YWx1ZS4gSWYgbm8gZmFjdG9yeSBpcyBwcmVzZW50LAorICAgICAqIHRoZSBnaXZlbiB2YWx1ZSBpcyByZXR1cm5lZCBhcy1pcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoT2JqZWN0IHZhbCwgU3RvcmVDb250ZXh0IGN0eCkgeworICAgICAgICBNYXAgZmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlTWFwKCk7CisgICAgICAgIGlmIChmaWVsZFZhbHVlcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWVzLmdldCh2YWwpOworCisgICAgICAgIE1lbWJlciBmYWN0b3J5ID0gZ2V0RmFjdG9yeU1ldGhvZCgpOworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsICYmIGdldE51bGxWYWx1ZSgpID09IE5VTExfREVGQVVMVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVjbGFyZWRUeXBlKCkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgLy8gaW52b2tlIGVpdGhlciB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBmaWVsZCB0eXBlLAorICAgICAgICAgICAgLy8gb3IgdGhlIHN0YXRpYyB0eXBlLnRvRmllbGQodmFsWywgY3R4XSkgbWV0aG9kCisgICAgICAgICAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChDb25zdHJ1Y3RvcikgZmFjdG9yeSkubmV3SW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBPYmplY3RbXXsgdmFsIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZXRob2QgbWV0aCA9IChNZXRob2QpIGZhY3Rvcnk7CisgICAgICAgICAgICBpZiAobWV0aC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBtZXRoLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117IHZhbCB9KTsKKyAgICAgICAgICAgIHJldHVybiBtZXRoLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117IHZhbCwgY3R4IH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdW53cmFwIGNhdXNlCisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuCisgICAgICAgICAgICAgICAgICAgIGdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRXJyb3IpCisgICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcikgdDsKKyAgICAgICAgICAgICAgICBlID0gKEV4Y2VwdGlvbikgdDsKKworICAgICAgICAgICAgICAgIC8vIGFsbG93IG51bGwgdmFsdWVzIHRvIGNhdXNlIE5QRXMgYW5kIGlsbGVnYWwgYXJnIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGVycm9yCisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsICYmIChlIGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfHwgZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE9wZW5KUEFFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKE9wZW5KUEFFeGNlcHRpb24pIGU7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImZhY3RvcnktZXJyIiwgdGhpcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKHZhbCksIGUudG9TdHJpbmcoKSkpLnNldENhdXNlKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBmaWVsZCdzIGV4dGVybmFsaXplciwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVyKCkgeworICAgICAgICByZXR1cm4gX2V4dE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBmaWVsZCdzIGV4dGVybmFsaXplciwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsaXplcihTdHJpbmcgZXh0ZXJuYWxpemVyKSB7CisgICAgICAgIF9leHROYW1lID0gZXh0ZXJuYWxpemVyOworICAgICAgICBfZXh0TWV0aG9kID0gREVGQVVMVF9NRVRIT0Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBmaWVsZCdzIGZhY3RvcnksIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBfZmFjdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBmaWVsZCdzIGZhY3RvcnksIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5KFN0cmluZyBmYWN0b3J5KSB7CisgICAgICAgIF9mYWN0TmFtZSA9IGZhY3Rvcnk7CisgICAgICAgIF9mYWN0TWV0aG9kID0gREVGQVVMVF9NRVRIT0Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvcGVydGllcyBzdHJpbmcgbWFwcGluZyBmaWVsZCB2YWx1ZXMgdG8gZXh0ZXJuYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBfZXh0U3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3BlcnRpZXMgc3RyaW5nIG1hcHBpbmcgZmllbGQgdmFsdWVzIHRvIGV4dGVybmFsIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbFZhbHVlcyhTdHJpbmcgdmFsdWVzKSB7CisgICAgICAgIF9leHRTdHJpbmcgPSB2YWx1ZXM7CisgICAgICAgIF9leHRWYWx1ZXMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwcGluZyBvZiBmaWVsZCB2YWx1ZXMgdG8gZXh0ZXJuYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0RXh0ZXJuYWxWYWx1ZU1hcCgpIHsKKyAgICAgICAgcGFyc2VFeHRlcm5hbFZhbHVlcygpOworICAgICAgICByZXR1cm4gX2V4dFZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hcHBpbmcgb2YgZXh0ZXJuYWwgdmFsdWVzIHRvIGZpZWxkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIGdldEZpZWxkVmFsdWVNYXAoKSB7CisgICAgICAgIHBhcnNlRXh0ZXJuYWxWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIF9maWVsZFZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBleHRlcm5hbCB2YWx1ZXMgaW50byBtYXBzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUV4dGVybmFsVmFsdWVzKCkgeworICAgICAgICBpZiAoX2V4dFZhbHVlcyAhPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVAKKyAgICAgICAgICAgICYmIF9maWVsZFZhbHVlcyAhPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKF9leHRTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgX2V4dFZhbHVlcyA9IG51bGw7CisgICAgICAgICAgICBfZmllbGRWYWx1ZXMgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGFyc2Ugc3RyaW5nIGludG8gb3B0aW9uczsgdGhpcyB0YWtlcyBjYXJlIG9mIHByb3BlciB0cmltbWluZyBldGMKKyAgICAgICAgT3B0aW9ucyB2YWx1ZXMgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXMoX2V4dFN0cmluZyk7CisgICAgICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1leHRlcm5hbC12YWx1ZXMiLCB0aGlzLAorICAgICAgICAgICAgICAgIF9leHRTdHJpbmcpKTsKKworICAgICAgICBNYXAgZXh0VmFsdWVzID0gbmV3IEhhc2hNYXAoKGludCkgKHZhbHVlcy5zaXplKCkgKiAxLjMzICsgMSkpOworICAgICAgICBNYXAgZmllbGRWYWx1ZXMgPSBuZXcgSGFzaE1hcCgoaW50KSAodmFsdWVzLnNpemUoKSAqIDEuMzMgKyAxKSk7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgT2JqZWN0IGV4dFZhbHVlLCBmaWVsZFZhbHVlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBmaWVsZFZhbHVlID0gdHJhbnNmb3JtKChTdHJpbmcpIGVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgIGdldERlY2xhcmVkVHlwZUNvZGUoKSk7CisgICAgICAgICAgICBleHRWYWx1ZSA9IHRyYW5zZm9ybSgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpLCBnZXRUeXBlQ29kZSgpKTsKKworICAgICAgICAgICAgZXh0VmFsdWVzLnB1dChmaWVsZFZhbHVlLCBleHRWYWx1ZSk7CisgICAgICAgICAgICBmaWVsZFZhbHVlcy5wdXQoZXh0VmFsdWUsIGZpZWxkVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgX2V4dFZhbHVlcyA9IGV4dFZhbHVlczsKKyAgICAgICAgX2ZpZWxkVmFsdWVzID0gZmllbGRWYWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0eXBlIGNvZGUuIFRoZSBzdHJpbmcKKyAgICAgKiBtdXN0IGJlIG5vbi1udWxsIGFuZCB0cmltbWVkLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IHRyYW5zZm9ybShTdHJpbmcgdmFsLCBpbnQgdHlwZUNvZGUpIHsKKyAgICAgICAgaWYgKCJudWxsIi5lcXVhbHModmFsKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHN3aXRjaCAodHlwZUNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGUudmFsdWVPZih2YWwpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKHZhbCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcudmFsdWVPZih2YWwpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU0hPUlQ6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNob3J0LnZhbHVlT2YodmFsKTsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHZhbCk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmxvYXQudmFsdWVPZih2YWwpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVJfT0JKOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKHZhbC5jaGFyQXQoMCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZXh0ZXJuYWwtdHlwZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXh0ZXJuYWxpemVyIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEV4dGVybmFsaXplck1ldGhvZCgpIHsKKyAgICAgICAgaWYgKF9tYW5hZ2UgIT0gTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKF9leHRNZXRob2QgPT0gREVGQVVMVF9NRVRIT0QpIHsKKyAgICAgICAgICAgIGlmIChfZXh0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX2V4dE1ldGhvZCA9IGZpbmRNZXRob2QoX2V4dE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChfZXh0TWV0aG9kID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWV4dGVybmFsaXplciIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBfZXh0TmFtZSkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX2V4dE1ldGhvZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9leHRNZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZhY3RvcnkgbWV0aG9kIG9yIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0RmFjdG9yeU1ldGhvZCgpIHsKKyAgICAgICAgaWYgKF9tYW5hZ2UgIT0gTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKF9mYWN0TWV0aG9kID09IERFRkFVTFRfTUVUSE9EKSB7CisgICAgICAgICAgICBpZiAoZ2V0RXh0ZXJuYWxpemVyTWV0aG9kKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZmFjdE1ldGhvZCA9IG51bGw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2ZhY3ROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBfZmFjdE1ldGhvZCA9IGdldERlY2xhcmVkVHlwZSgpLmdldENvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBDbGFzc1tdeyBnZXRUeXBlKCkgfSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9mYWN0TWV0aG9kID0gZmluZE1ldGhvZChfZmFjdE5hbWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cga2U7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIShfZmFjdE1ldGhvZCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKQorICAgICAgICAgICAgICAgICAgICAmJiAhKF9mYWN0TWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZmFjdG9yeSIsIHRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2ZhY3RNZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUuIFBvc3NpYmxlIGZvcm1zIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPnRvRXh0ZXJuYWxTdHJpbmc8L2xpPgorICAgICAqIDxsaT5NeUZhY3RvcnlDbGFzcy50b0V4dGVybmFsU3RyaW5nPC9saT4KKyAgICAgKiA8bGk+Y29tLmNvbXBhbnkuTXlGYWN0b3J5Q2xhc3MudG9FeHRlcm5hbFN0cmluZzwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBsb2NhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgZm9yIGludm9jYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBmaW5kTWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobWV0aG9kKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGdldCBjbGFzcyBuYW1lIGFuZCBnZXQgcGFja2FnZSBuYW1lIGRpdmlkZSBvbiB0aGUgbGFzdCAnLicsIHNvIHRoZQorICAgICAgICAvLyBuYW1lcyBkb24ndCBhcHBseSBpbiB0aGlzIGNhc2UsIGJ1dCB0aGUgbWV0aG9kcyBkbyB3aGF0IHdlIHdhbnQKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBTdHJpbmdzLmdldENsYXNzTmFtZShtZXRob2QpOworICAgICAgICBTdHJpbmcgY2xzTmFtZSA9IFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUobWV0aG9kKTsKKworICAgICAgICBDbGFzcyBjbHMgPSBudWxsOworICAgICAgICBDbGFzcyBvd25lciA9IF9vd25lci5nZXREZXNjcmliZWRUeXBlKCk7CisKKyAgICAgICAgaWYgKGNsc05hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIGNscyA9IGdldERlY2xhcmVkVHlwZSgpOworICAgICAgICBlbHNlIGlmIChjbHNOYW1lLmVxdWFscyhvd25lci5nZXROYW1lKCkpCisgICAgICAgICAgICB8fCBjbHNOYW1lLmVxdWFscyhTdHJpbmdzLmdldENsYXNzTmFtZShvd25lcikpKQorICAgICAgICAgICAgY2xzID0gb3duZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNscyA9IEphdmFUeXBlcy5jbGFzc0Zvck5hbWUoY2xzTmFtZSwgdGhpcyk7CisKKyAgICAgICAgLy8gZmluZCB0aGUgbmFtZWQgbWV0aG9kCisgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjbHMuZ2V0TWV0aG9kcygpOworICAgICAgICBDbGFzc1tdIHBhcmFtczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zID0gbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOworCisgICAgICAgICAgICAgICAgLy8gc3RhdGljIGZhY3RvcnkgbWV0aG9kcyByZXF1aXJlIG9uZSBhcmd1bWVudCBvciBvbmUgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAvLyBwbHVzIGEgY3R4OyBub24tc3RhdGljIG1ldGhvZHMgcmVxdWlyZSB6ZXJvIGFyZ3VtZW50cyBvcgorICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBjdHgKKyAgICAgICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kc1tpXS5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhcmFtcy5sZW5ndGggPT0gMSB8fCAocGFyYW1zLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgICAgICYmIGlzU3RvcmVDb250ZXh0UGFyYW1ldGVyKHBhcmFtc1sxXSkpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV07CisgICAgICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1N0YXRpYyhtZXRob2RzW2ldLmdldE1vZGlmaWVycygpKQorICAgICAgICAgICAgICAgICAgICAmJiAocGFyYW1zLmxlbmd0aCA9PSAwIHx8IChwYXJhbXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaXNTdG9yZUNvbnRleHRQYXJhbWV0ZXIocGFyYW1zWzBdKSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIGlzIGEgc3RvcmUgY29udGV4dCB0eXBlOyB3ZSBjYW4ndAorICAgICAqIHVzZSB0aGUgc3RhbmRhcmQgPGNvZGU+aXNBc3NpZ25hYmxlRnJvbTwvY29kZT4gYmVjYXVzZSBvZiBjbGFzc2xvYWRlcgorICAgICAqIG9kZG5lc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N0b3JlQ29udGV4dFBhcmFtZXRlcihDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiBTdG9yZUNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0eXBlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZpZWxkTWV0YURhdGEpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gZ2V0RnVsbE5hbWUodHJ1ZSkuZXF1YWxzKCgoRmllbGRNZXRhRGF0YSkgb3RoZXIpLgorICAgICAgICAgICAgZ2V0RnVsbE5hbWUodHJ1ZSkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gZ2V0RnVsbE5hbWUodHJ1ZSkuY29tcGFyZVRvKCgoRmllbGRNZXRhRGF0YSkgb3RoZXIpLgorICAgICAgICAgICAgZ2V0RnVsbE5hbWUodHJ1ZSkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRGdWxsTmFtZSh0cnVlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBSZXNvbHZlIGFuZCB2YWxpZGF0ZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBtb2RlIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbW9kZSBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlKGludCBtb2RlKSB7CisgICAgICAgIF9yZXNNb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIG1vZGUgZm9yIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAobW9kZSA9PSBNT0RFX05PTkUpCisgICAgICAgICAgICBfcmVzTW9kZSA9IG1vZGU7CisgICAgICAgIGVsc2UgaWYgKG9uKQorICAgICAgICAgICAgX3Jlc01vZGUgfD0gbW9kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3Jlc01vZGUgJj0gfm1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBhbmQgdmFsaWRhdGUgbWV0YWRhdGEuIFJldHVybiB0cnVlIGlmIGFscmVhZHkgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVzb2x2ZShpbnQgbW9kZSkgeworICAgICAgICBpZiAoKF9yZXNNb2RlICYgbW9kZSkgPT0gbW9kZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpbnQgY3VyID0gX3Jlc01vZGU7CisgICAgICAgIF9yZXNNb2RlIHw9IG1vZGU7CisKKyAgICAgICAgTG9nIGxvZyA9IGdldFJlcG9zaXRvcnkoKS5nZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJyZXNvbHZlLWZpZWxkIiwgX293bmVyICsgIkAiCisgICAgICAgICAgICAgICAgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShfb3duZXIpICsgIi4iICsgX25hbWUpKTsKKworICAgICAgICAvLyB3ZSBvbmx5IHBlcmZvcm0gYWN0aW9ucyBmb3IgbWV0YWRhdGEgbW9kZQorICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01FVEEpID09IDAgfHwgKGN1ciAmIE1PREVfTUVUQSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBNZXRob2QgZXh0ZXJuYWxpemVyID0gZ2V0RXh0ZXJuYWxpemVyTWV0aG9kKCk7CisgICAgICAgIGlmIChleHRlcm5hbGl6ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFR5cGUoZXh0ZXJuYWxpemVyLmdldFJldHVyblR5cGUoKSk7CisKKyAgICAgICAgLy8gb25seSBwYXNzIG9uIG1ldGFkYXRhIHJlc29sdmUgbW9kZSBzbyB0aGF0IG1ldGFkYXRhIGlzIGFsd2F5cworICAgICAgICAvLyByZXNvbHZlZCBiZWZvcmUgYW55IG90aGVyIHJlc29sdmUgbW9kZXMgb3VyIHN1YmNsYXNzZXMgcGFzcyBhbG9uZworICAgICAgICBfdmFsLnJlc29sdmUoTU9ERV9NRVRBKTsKKyAgICAgICAgX2tleS5yZXNvbHZlKE1PREVfTUVUQSk7CisgICAgICAgIF9lbGVtLnJlc29sdmUoTU9ERV9NRVRBKTsKKworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MgPSBnZXRSZXBvc2l0b3J5KCk7CisgICAgICAgIGludCB2YWxpZGF0ZSA9IHJlcG9zLmdldFZhbGlkYXRlKCk7CisgICAgICAgIGlmICgodmFsaWRhdGUgJiBNZXRhRGF0YVJlcG9zaXRvcnkuVkFMSURBVEVfTUVUQSkgIT0gMAorICAgICAgICAgICAgJiYgKCFQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbQorICAgICAgICAgICAgKF9vd25lci5nZXREZXNjcmliZWRUeXBlKCkpCisgICAgICAgICAgICB8fCAodmFsaWRhdGUgJiBNZXRhRGF0YVJlcG9zaXRvcnkuVkFMSURBVEVfVU5FTkhBTkNFRCkgPT0gMCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTFJTKCk7CisgICAgICAgICAgICBpZiAoKHZhbGlkYXRlICYgcmVwb3MuVkFMSURBVEVfUlVOVElNRSkgPT0gMCkKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVN1cHBvcnRlZFR5cGUoKTsKKyAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUoKTsKKyAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaW9uS2V5cygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGF0IHRoaXMgZmllbGQgY2FuIGJlIHVzZWQgZm9yIExSUy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVMUlMoKSB7CisgICAgICAgIGlmICghaXNMUlMoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBjYW4ndCB1c2UgbHJzIGZvciBhcnJheXMKKyAgICAgICAgaWYgKGdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLkFSUkFZKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbHJzLWFycmF5IiwgdGhpcykpOworCisgICAgICAgIC8vIGNhbid0IHVzZSBscnMgZm9yIGV4dHJhbmFsaXplZCB2YWxzCisgICAgICAgIGlmIChnZXRFeHRlcm5hbGl6ZXJNZXRob2QoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbHJzLWV4dGVybiIsIHRoaXMpKTsKKworICAgICAgICAvLyBjYW4ndCB1c2UgbHJzIGZvciBjb25jcmV0ZSB0eXBlcworICAgICAgICBpZiAoZ2V0VHlwZSgpICE9IENvbGxlY3Rpb24uY2xhc3MgJiYgZ2V0VHlwZSgpICE9IE1hcC5jbGFzcworICAgICAgICAgICAgJiYgZ2V0VHlwZSgpICE9IFNldC5jbGFzcykKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWxycy1jb25jcmV0ZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGF0IHRoaXMgZmllbGQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVN1cHBvcnRlZFR5cGUoKSB7CisgICAgICAgIC8vIGxvZyB3YXJuaW5ncyBhYm91dCB0aGluZ3Mgd2UgZG9uJ3QgaGFuZGxlCisgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBDb2xsZWN0aW9uIG9wdHMgPSBjb25mLnN1cHBvcnRlZE9wdGlvbnMoKTsKKyAgICAgICAgTG9nIGxvZyA9IGNvbmYuZ2V0TG9nKGNvbmYuTE9HX01FVEFEQVRBKTsKKyAgICAgICAgc3dpdGNoIChnZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICBpZiAoaXNFbWJlZGRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICFvcHRzLmNvbnRhaW5zKGNvbmYuT1BUSU9OX0VNQkVEREVEX1JFTEFUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRFbWJlZGRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImNhbnQtZW1iZWQiLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaWYgKGlzRW1iZWRkZWQoKSAmJiBnZXREZWNsYXJlZFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlBDKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVtYmVkZGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgiY2FudC1lbWJlZC1leHRlcm4iLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoIW9wdHMuY29udGFpbnMoY29uZi5PUFRJT05fVFlQRV9DT0xMRUNUSU9OKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgX2xvYy5nZXQoInR5cGUtbm90LXN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbGxlY3Rpb24iLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgaWYgKF9lbGVtLmlzRW1iZWRkZWRQQygpCisgICAgICAgICAgICAgICAgICAgICYmICFvcHRzLmNvbnRhaW5zKGNvbmYuT1BUSU9OX0VNQkVEREVEX0NPTExFQ1RJT05fUkVMQVRJT04pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2VsZW0uc2V0RW1iZWRkZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJjYW50LWVtYmVkLWVsZW1lbnQiLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgaWYgKCFvcHRzLmNvbnRhaW5zKGNvbmYuT1BUSU9OX1RZUEVfQVJSQVkpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBfbG9jLmdldCgidHlwZS1ub3Qtc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkiLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgaWYgKF9lbGVtLmlzRW1iZWRkZWRQQygpCisgICAgICAgICAgICAgICAgICAgICYmICFvcHRzLmNvbnRhaW5zKGNvbmYuT1BUSU9OX0VNQkVEREVEX0NPTExFQ1RJT05fUkVMQVRJT04pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2VsZW0uc2V0RW1iZWRkZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJjYW50LWVtYmVkLWVsZW1lbnQiLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIGlmICghb3B0cy5jb250YWlucyhjb25mLk9QVElPTl9UWVBFX01BUCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIF9sb2MuZ2V0KCJ0eXBlLW5vdC1zdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXAiLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgaWYgKF9lbGVtLmlzRW1iZWRkZWRQQygpCisgICAgICAgICAgICAgICAgICAgICYmICFvcHRzLmNvbnRhaW5zKGNvbmYuT1BUSU9OX0VNQkVEREVEX01BUF9SRUxBVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgX2VsZW0uc2V0RW1iZWRkZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJjYW50LWVtYmVkLWVsZW1lbnQiLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfa2V5LmlzRW1iZWRkZWRQQygpCisgICAgICAgICAgICAgICAgICAgICYmICFvcHRzLmNvbnRhaW5zKGNvbmYuT1BUSU9OX0VNQkVEREVEX01BUF9SRUxBVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgX2tleS5zZXRFbWJlZGRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImNhbnQtZW1iZWQta2V5IiwgdGhpcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIG91ciB2YWx1ZSBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVWYWx1ZSgpIHsKKyAgICAgICAgaWYgKGdldEV4dGVybmFsaXplck1ldGhvZCgpICE9IG51bGwgJiYgZ2V0RXh0ZXJuYWxWYWx1ZU1hcCgpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImV4dGVybi1leHRlcm52YWx1ZXMiLCB0aGlzKSk7CisgICAgICAgIGlmIChnZXRWYWx1ZVN0cmF0ZWd5KCkgPT0gVmFsdWVTdHJhdGVnaWVzLlNFUVVFTkNFCisgICAgICAgICAgICAmJiBnZXRWYWx1ZVNlcXVlbmNlTmFtZSgpID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXNlcS1uYW1lIiwgdGhpcykpOworICAgICAgICBWYWx1ZVN0cmF0ZWdpZXMuYXNzZXJ0U3VwcG9ydGVkKGdldFZhbHVlU3RyYXRlZ3koKSwgdGhpcywKKyAgICAgICAgICAgICJ2YWx1ZSBzdHJhdGVneSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgc3RhdGUgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgdG8gdGhpcyBvbmUuIERvIG5vdCBjb3B5IG1hcHBpbmcKKyAgICAgKiBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5KEZpZWxkTWV0YURhdGEgZmllbGQpIHsKKyAgICAgICAgc3VwZXIuY29weShmaWVsZCk7CisKKyAgICAgICAgX2ludGVybWVkaWF0ZSA9IGZpZWxkLnVzZXNJbnRlcm1lZGlhdGUoKTsKKyAgICAgICAgX2ltcGxEYXRhID0gZmllbGQudXNlc0ltcGxEYXRhKCk7CisKKyAgICAgICAgLy8gY29weSBmaWVsZC1sZXZlbCBpbmZvOyB1c2UgZ2V0IG1ldGhvZHMgdG8gZm9yY2UgcmVzb2x1dGlvbiBvZgorICAgICAgICAvLyBsYXp5IGRhdGEKKyAgICAgICAgX3Byb3h5Q2xhc3MgPSBmaWVsZC5nZXRQcm94eVR5cGUoKTsKKyAgICAgICAgX2luaXRpYWxpemVyID0gZmllbGQuZ2V0SW5pdGlhbGl6ZXIoKTsKKyAgICAgICAgX3RyYW5zaWVudCA9IGZpZWxkLmlzVHJhbnNpZW50KCk7CisgICAgICAgIF9udWxsVmFsdWUgPSBmaWVsZC5nZXROdWxsVmFsdWUoKTsKKyAgICAgICAgX21hbmFnZSA9IGZpZWxkLmdldE1hbmFnZW1lbnQoKTsKKyAgICAgICAgX2V4cGxpY2l0ID0gZmllbGQuaXNFeHBsaWNpdCgpOworICAgICAgICBfZXh0TmFtZSA9IGZpZWxkLmdldEV4dGVybmFsaXplcigpOworICAgICAgICBfZXh0TWV0aG9kID0gREVGQVVMVF9NRVRIT0Q7CisgICAgICAgIF9mYWN0TmFtZSA9IGZpZWxkLmdldEZhY3RvcnkoKTsKKyAgICAgICAgX2ZhY3RNZXRob2QgPSBERUZBVUxUX01FVEhPRDsKKyAgICAgICAgX2V4dFN0cmluZyA9IGZpZWxkLmdldEV4dGVybmFsVmFsdWVzKCk7CisgICAgICAgIF9leHRWYWx1ZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgICAgICAgIF9maWVsZFZhbHVlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgX3ByaW1LZXkgPSBmaWVsZC5pc1ByaW1hcnlLZXkoKTsKKyAgICAgICAgX2JhY2tpbmdNZW1iZXIgPSBmaWVsZC5fYmFja2luZ01lbWJlcjsKKworICAgICAgICAvLyBlbWJlZGRlZCBmaWVsZHMgY2FuJ3QgYmUgdmVyc2lvbnMKKyAgICAgICAgaWYgKF9vd25lci5nZXRFbWJlZGRpbmdNZXRhRGF0YSgpID09IG51bGwgJiYgX3ZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIF92ZXJzaW9uID0gKGZpZWxkLmlzVmVyc2lvbigpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisKKyAgICAgICAgLy8gb25seSBjb3B5IHRoaXMgZGF0YSBpZiBub3QgYWxyZWFkeSBzZXQgZXhwbGljaXRseSBpbiB0aGlzIGluc3RhbmNlCisgICAgICAgIGlmIChfZGZnID09IDApIHsKKyAgICAgICAgICAgIF9kZmcgPSAoZmllbGQuaXNJbkRlZmF1bHRGZXRjaEdyb3VwKCkpID8gREZHX1RSVUUgOiBERkdfRkFMU0U7CisgICAgICAgICAgICBpZiAoZmllbGQuaXNEZWZhdWx0RmV0Y2hHcm91cEV4cGxpY2l0KCkpCisgICAgICAgICAgICAgICAgX2RmZyB8PSBERkdfRVhQTElDSVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9mZ1NldCA9PSBudWxsICYmIGZpZWxkLl9mZ1NldCAhPSBudWxsKQorICAgICAgICAgICAgX2ZnU2V0ID0gbmV3IEhhc2hTZXQoZmllbGQuX2ZnU2V0KTsKKyAgICAgICAgaWYgKF9sZmcgPT0gbnVsbCkKKyAgICAgICAgICAgIF9sZmcgPSBmaWVsZC5nZXRMb2FkRmV0Y2hHcm91cCgpOworICAgICAgICBpZiAoX2xycyA9PSBudWxsKQorICAgICAgICAgICAgX2xycyA9IChmaWVsZC5pc0xSUygpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgIGlmIChfdmFsU3RyYXRlZ3kgPT0gLTEpCisgICAgICAgICAgICBfdmFsU3RyYXRlZ3kgPSBmaWVsZC5nZXRWYWx1ZVN0cmF0ZWd5KCk7CisgICAgICAgIGlmIChfdXBTdHJhdGVneSA9PSAtMSkKKyAgICAgICAgICAgIF91cFN0cmF0ZWd5ID0gZmllbGQuZ2V0VXBkYXRlU3RyYXRlZ3koKTsKKyAgICAgICAgaWYgKENsYXNzTWV0YURhdGEuREVGQVVMVF9TVFJJTkcuZXF1YWxzKF9zZXFOYW1lKSkgeworICAgICAgICAgICAgX3NlcU5hbWUgPSBmaWVsZC5nZXRWYWx1ZVNlcXVlbmNlTmFtZSgpOworICAgICAgICAgICAgX3NlcU1ldGEgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc01ldGFEYXRhLkRFRkFVTFRfU1RSSU5HLmVxdWFscyhfaW52ZXJzZSkpCisgICAgICAgICAgICBfaW52ZXJzZSA9IGZpZWxkLmdldEludmVyc2UoKTsKKworICAgICAgICAvLyBjb3B5IHZhbHVlIG1ldGFkYXRhCisgICAgICAgIF92YWwuY29weShmaWVsZCk7CisgICAgICAgIF9rZXkuY29weShmaWVsZC5nZXRLZXkoKSk7CisgICAgICAgIF9lbGVtLmNvcHkoZmllbGQuZ2V0RWxlbWVudCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb25LZXlzKENvbGxlY3Rpb24gZXh0cykgeworICAgICAgICBnZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGFGYWN0b3J5KCkuYWRkRmllbGRFeHRlbnNpb25LZXlzKGV4dHMpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbW1lbnRhYmxlCisgICAgLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiAoX2NvbW1lbnRzID09IG51bGwpID8gRU1QVFlfQ09NTUVOVFMgOiBfY29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudHMoU3RyaW5nW10gY29tbWVudHMpIHsKKyAgICAgICAgX2NvbW1lbnRzID0gY29tbWVudHM7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBWYWx1ZU1ldGFEYXRhIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhIGdldEZpZWxkTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIF92YWwuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKQorICAgICAgICAgICAgX2VsZW0uc2V0VHlwZSh0eXBlLmdldENvbXBvbmVudFR5cGUoKSk7CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gUHJvcGVydGllcy5jbGFzcykgeworICAgICAgICAgICAgX2tleS5zZXRUeXBlKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBfZWxlbS5zZXRUeXBlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGVDb2RlKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRUeXBlQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVDb2RlKGludCBjb2RlKSB7CisgICAgICAgIF92YWwuc2V0VHlwZUNvZGUoY29kZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUEMoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmlzVHlwZVBDKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0VHlwZU1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRUeXBlTWV0YURhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGVjbGFyZWRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWNsYXJlZFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfdmFsLnNldERlY2xhcmVkVHlwZSh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKQorICAgICAgICAgICAgX2VsZW0uc2V0RGVjbGFyZWRUeXBlKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBQcm9wZXJ0aWVzLmNsYXNzKSB7CisgICAgICAgICAgICBfa2V5LnNldERlY2xhcmVkVHlwZShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgX2VsZW0uc2V0RGVjbGFyZWRUeXBlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlY2xhcmVkVHlwZUNvZGUoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldERlY2xhcmVkVHlwZUNvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWNsYXJlZFR5cGVDb2RlKGludCB0eXBlKSB7CisgICAgICAgIF92YWwuc2V0RGVjbGFyZWRUeXBlQ29kZSh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY2xhcmVkVHlwZVBDKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5pc0RlY2xhcmVkVHlwZVBDKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0RGVjbGFyZWRUeXBlTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZCgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuaXNFbWJlZGRlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVtYmVkZGVkKGJvb2xlYW4gZW1iZWRkZWQpIHsKKyAgICAgICAgX3ZhbC5zZXRFbWJlZGRlZChlbWJlZGRlZCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZFBDKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5pc0VtYmVkZGVkUEMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRFbWJlZGRlZE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgYWRkRW1iZWRkZWRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuYWRkRW1iZWRkZWRNZXRhRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q2FzY2FkZURlbGV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF92YWwuZ2V0Q2FzY2FkZURlbGV0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhc2NhZGVEZWxldGUoaW50IGRlbGV0ZSkgeworICAgICAgICBfdmFsLnNldENhc2NhZGVEZWxldGUoZGVsZXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENhc2NhZGVQZXJzaXN0KCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRDYXNjYWRlUGVyc2lzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGludCBwZXJzaXN0KSB7CisgICAgICAgIF92YWwuc2V0Q2FzY2FkZVBlcnNpc3QocGVyc2lzdCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDYXNjYWRlQXR0YWNoKCkgeworICAgICAgICByZXR1cm4gX3ZhbC5nZXRDYXNjYWRlQXR0YWNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FzY2FkZUF0dGFjaChpbnQgYXR0YWNoKSB7CisgICAgICAgIF92YWwuc2V0Q2FzY2FkZUF0dGFjaChhdHRhY2gpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q2FzY2FkZVJlZnJlc2goKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldENhc2NhZGVSZWZyZXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goaW50IHJlZnJlc2gpIHsKKyAgICAgICAgX3ZhbC5zZXRDYXNjYWRlUmVmcmVzaChyZWZyZXNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcmlhbGl6ZWQoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmlzU2VyaWFsaXplZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcmlhbGl6ZWQoYm9vbGVhbiBzZXJpYWxpemVkKSB7CisgICAgICAgIF92YWwuc2V0U2VyaWFsaXplZChzZXJpYWxpemVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlTWFwcGVkQnkoKSB7CisgICAgICAgIHJldHVybiBfdmFsLmdldFZhbHVlTWFwcGVkQnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZU1hcHBlZEJ5KFN0cmluZyBtYXBwZWQpIHsKKyAgICAgICAgX3ZhbC5zZXRWYWx1ZU1hcHBlZEJ5KG1hcHBlZCk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0VmFsdWVNYXBwZWRCeU1ldGFEYXRhICgpCisJeworCQlyZXR1cm4gX3ZhbC5nZXRWYWx1ZU1hcHBlZEJ5TWV0YURhdGEgKCk7CisJfQorCisJcHVibGljIENsYXNzIGdldFR5cGVPdmVycmlkZSAoKQorCXsKKwkJcmV0dXJuIF92YWwuZ2V0VHlwZU92ZXJyaWRlICgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGVPdmVycmlkZSAoQ2xhc3MgdHlwZSkKKwl7CisJCV92YWwuc2V0VHlwZU92ZXJyaWRlICh0eXBlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb3B5IChWYWx1ZU1ldGFEYXRhIHZtZCkKKwl7CisJCV92YWwuY29weSAodm1kKTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemFibGUgd3JhcHBlciBhcm91bmQgYSB7QGxpbmsgTWV0aG9kfSBvciB7QGxpbmsgRmllbGR9LiBGb3IgCisgICAgICogc3BhY2UgY29uc2lkZXJhdGlvbnMsIHRoaXMgZG9lcyBub3Qgc3VwcG9ydCB7QGxpbmsgQ29uc3RydWN0b3J9cy4KKyAgICAgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNZW1iZXJQcm92aWRlciAKKyAgICAgICAgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWVtYmVyIF9tZW1iZXI7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIE1lbWJlclByb3ZpZGVyKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgICAgIGlmIChfbWVtYmVyIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBfbWVtYmVyID0gbWVtYmVyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBfbWVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNGaWVsZCA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgICBDbGFzcyBjbHMgPSBfbWVtYmVyLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRmllbGQpCisgICAgICAgICAgICAgICAgICAgIF9tZW1iZXIgPSBjbHMuZ2V0RGVjbGFyZWRGaWVsZChtZW1iZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IChDbGFzc1tdKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9tZW1iZXIgPSBjbHMuZ2V0RGVjbGFyZWRNZXRob2QobWVtYmVyTmFtZSwgcGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGlvZS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaW9lOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgaW9lLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgaW9lLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiBpc0ZpZWxkID0gX21lbWJlciBpbnN0YW5jZW9mIEZpZWxkOworICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihpc0ZpZWxkKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChfbWVtYmVyLmdldERlY2xhcmluZ0NsYXNzKCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KF9tZW1iZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmICghaXNGaWVsZCkKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoKChNZXRob2QpIF9tZW1iZXIpLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0luTWVtb3J5UmVsYXRlZEZpZWxkT3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9Jbk1lbW9yeVJlbGF0ZWRGaWVsZE9yZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNzgwNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9Jbk1lbW9yeVJlbGF0ZWRGaWVsZE9yZGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBPcmRlciBieSBhIGZpZWxkIGluIHRoZSByZWxhdGVkIHR5cGUgaW4gbWVtb3J5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEluTWVtb3J5UmVsYXRlZEZpZWxkT3JkZXIKKyAgICBpbXBsZW1lbnRzIE9yZGVyLCBDb21wYXJhdG9yIHsKKworICAgIHByaXZhdGUgZmluYWwgRmllbGRNZXRhRGF0YSBfcmVsOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfYXNjOworCisgICAgcHVibGljIEluTWVtb3J5UmVsYXRlZEZpZWxkT3JkZXIoRmllbGRNZXRhRGF0YSByZWwsIGJvb2xlYW4gYXNjKSB7CisgICAgICAgIF9yZWwgPSByZWw7CisgICAgICAgIF9hc2MgPSBhc2M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX3JlbC5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBc2NlbmRpbmcoKSB7CisgICAgICAgIHJldHVybiBfYXNjOworICAgIH0KKworICAgIHB1YmxpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAobzEgPT0gbzIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCEobzEgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpCisgICAgICAgICAgICB8fCAhKG8yIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIFBlcnNpc3RlbmNlQ2FwYWJsZSBwYzEgPSAoUGVyc2lzdGVuY2VDYXBhYmxlKSBvMTsKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjMiA9IChQZXJzaXN0ZW5jZUNhcGFibGUpIG8yOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtMSA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBwYzEucGNHZXRTdGF0ZU1hbmFnZXIoKTsKKyAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbTIgPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgcGMyLnBjR2V0U3RhdGVNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbTEgPT0gbnVsbCB8fCBzbTIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIE9iamVjdCB2MSA9IHNtMS5mZXRjaEZpZWxkKF9yZWwuZ2V0SW5kZXgoKSwgZmFsc2UpOworICAgICAgICBPYmplY3QgdjIgPSBzbTIuZmV0Y2hGaWVsZChfcmVsLmdldEluZGV4KCksIGZhbHNlKTsKKyAgICAgICAgaWYgKHYxID09IHYyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICh2MSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChfYXNjKSA/IC0xIDogMTsKKyAgICAgICAgaWYgKHYyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKF9hc2MpID8gMSA6IC0xOworICAgICAgICBpbnQgY21wID0gKChDb21wYXJhYmxlKSB2MSkuY29tcGFyZVRvKHYyKTsKKyAgICAgICAgcmV0dXJuIChfYXNjKSA/IGNtcCA6IC1jbXA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0luTWVtb3J5VmFsdWVPcmRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0luTWVtb3J5VmFsdWVPcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDBlOTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSW5NZW1vcnlWYWx1ZU9yZGVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQXBwbGljYXRpb25JZHM7CisKKy8qKgorICogT3JkZXIgYnkgdGhlIGZpZWxkIHZhbHVlIGluIG1lbW9yeS4gSWYgdGhlIGZpZWxkIGNvbnRhaW5zCisgKiB7QGxpbmsgUGVyc2lzdGVuY2VDYXBhYmxlfSBvYmplY3RzLCBvcmRlciBvbiB0aGVpciBwcmltYXJ5IGtleSB2YWx1ZXMuCisgKiBSZWxpZXMgb24gcHJpbWFyeSBrZXkgdmFsdWVzLCBpbmNsdWRpbmcgZGF0YXN0b3JlIG9pZCBvYmplY3RzLCBiZWluZworICoge0BsaW5rIENvbXBhcmFibGV9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK2NsYXNzIEluTWVtb3J5VmFsdWVPcmRlcgorICAgIGltcGxlbWVudHMgT3JkZXIsIENvbXBhcmF0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9hc2M7CisKKyAgICBwdWJsaWMgSW5NZW1vcnlWYWx1ZU9yZGVyKGJvb2xlYW4gYXNjKSB7CisgICAgICAgIF9hc2MgPSBhc2M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gT3JkZXIuRUxFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FzY2VuZGluZygpIHsKKyAgICAgICAgcmV0dXJuIF9hc2M7CisgICAgfQorCisgICAgcHVibGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIGlmIChvMSA9PSBvMikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobzEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoX2FzYykgPyAtMSA6IDE7CisgICAgICAgIGlmIChvMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChfYXNjKSA/IDEgOiAtMTsKKworICAgICAgICAvLyBub24tcGMgdmFsdWVzIG11c3QgYmUgY29tcGFyYWJsZQorICAgICAgICBpbnQgY21wOworICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlQ2FwYWJsZSkKKyAgICAgICAgICAgIHx8ICEobzIgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZUNhcGFibGUpKSB7CisgICAgICAgICAgICBjbXAgPSAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8obzIpOworICAgICAgICAgICAgcmV0dXJuIChfYXNjKSA/IGNtcCA6IC1jbXA7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcmRlciBvbiBwcmltYXJ5IGtleSB2YWx1ZXMKKyAgICAgICAgUGVyc2lzdGVuY2VDYXBhYmxlIHBjMSA9IChQZXJzaXN0ZW5jZUNhcGFibGUpIG8xOworICAgICAgICBQZXJzaXN0ZW5jZUNhcGFibGUgcGMyID0gKFBlcnNpc3RlbmNlQ2FwYWJsZSkgbzI7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20xID0gKE9wZW5KUEFTdGF0ZU1hbmFnZXIpIHBjMS5wY0dldFN0YXRlTWFuYWdlcigpOworICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtMiA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBwYzIucGNHZXRTdGF0ZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHNtMSA9PSBudWxsIHx8IHNtMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgT2JqZWN0W10gcGsxID0gdG9QS1ZhbHVlcyhzbTEpOworICAgICAgICBPYmplY3RbXSBwazIgPSB0b1BLVmFsdWVzKHNtMik7CisgICAgICAgIGludCBsZW4gPSBNYXRoLm1pbihwazEubGVuZ3RoLCBwazIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKHBrMVtpXSA9PSBwazJbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAocGsxW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChfYXNjKSA/IC0xIDogMTsKKyAgICAgICAgICAgIGlmIChwazJbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9hc2MpID8gMSA6IC0xOworICAgICAgICAgICAgY21wID0gKChDb21wYXJhYmxlKSBwazFbaV0pLmNvbXBhcmVUbyhwazJbaV0pOworICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAoX2FzYykgPyBjbXAgOiAtY21wOworICAgICAgICB9CisKKyAgICAgICAgY21wID0gcGsxLmxlbmd0aCAtIHBrMi5sZW5ndGg7CisgICAgICAgIHJldHVybiAoX2FzYykgPyBjbXAgOiAtY21wOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIHN0YXRlIG1hbmFnZXIncyBvaWQgdG8gYW4gYXJyYXkgb2YgKHBvc3NpYmx5IG51bGwpCisgICAgICogcHJpbWFyeSBrZXkgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIHRvUEtWYWx1ZXMoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBpZiAoc20uZ2V0TWV0YURhdGEoKS5nZXRJZGVudGl0eVR5cGUoKSAhPSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXXsgc20uZ2V0T2JqZWN0SWQoKSB9OworCisgICAgICAgIE9iamVjdFtdIHBrcyA9IEFwcGxpY2F0aW9uSWRzLnRvUEtWYWx1ZXMoc20uZ2V0T2JqZWN0SWQoKSwKKyAgICAgICAgICAgIHNtLmdldE1ldGFEYXRhKCkpOworICAgICAgICBpZiAocGtzID09IG51bGwpCisgICAgICAgICAgICBwa3MgPSBuZXcgT2JqZWN0W117IG51bGwgfTsKKyAgICAgICAgcmV0dXJuIHBrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSW5oZXJpdGFuY2VDb21wYXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSW5oZXJpdGFuY2VDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1OTVmNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9Jbmhlcml0YW5jZUNvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKKy8qKgorICogQ29tcGFyYXRvciB0aGF0IGtlZXBzIGNsYXNzZXMgaW4gaW5oZXJpdGFuY2Ugb3JkZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEluaGVyaXRhbmNlQ29tcGFyYXRvcgorICAgIGltcGxlbWVudHMgQ29tcGFyYXRvciwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgQ2xhc3MgX2Jhc2UgPSBPYmplY3QuY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxlYXN0LWRlcml2ZWQgdHlwZSBwb3NzaWJsZTsgZGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5PYmplY3QuY2xhc3M8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2UoQ2xhc3MgYmFzZSkgeworICAgICAgICBfYmFzZSA9IGJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZXh0cmFjdCB0aGUgY2xhc3MgdG8gY29tcGFyZQorICAgICAqIG9uIGZyb20gdGhlIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyB0b0NsYXNzKE9iamVjdCBlbGVtKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3MpIGVsZW07CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIGlmIChvMSA9PSBvMikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobzEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG8yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBDbGFzcyBjMSA9IHRvQ2xhc3MobzEpOworICAgICAgICBDbGFzcyBjMiA9IHRvQ2xhc3MobzIpOworICAgICAgICBpZiAoYzEgPT0gYzIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGMxID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChjMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaW50IGkxID0gbGV2ZWxzKGMxKTsKKyAgICAgICAgaW50IGkyID0gbGV2ZWxzKGMyKTsKKyAgICAgICAgaWYgKGkxID09IGkyKSB7CisgICAgICAgICAgICAvLyBzb3J0IHNpbXBsZSBpbnRlcmZhY2VzIGFzIHdlbGwgYXMgc2ltcGxlIG9yZGVyIHRlc3Qgd2lsbCBmYWlsLgorICAgICAgICAgICAgaWYgKGMxLmlzQXNzaWduYWJsZUZyb20oYzIpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChjMi5pc0Fzc2lnbmFibGVGcm9tKGMxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiBjMS5nZXROYW1lKCkuY29tcGFyZVRvKGMyLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGkxIC0gaTI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bnQgdGhlIGxldmVscyBvZiBpbmhlcml0YW5jZSBiZXR3ZWVuIHRoaXMgY2xhc3MgYW5kIG91ciBiYXNlIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGxldmVscyhDbGFzcyB0bykgeworICAgICAgICBpZiAodG8uaXNJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiB0by5nZXRJbnRlcmZhY2VzKCkubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgdG8gIT0gbnVsbDsgaSsrLCB0byA9IHRvLmdldFN1cGVyY2xhc3MoKSkKKyAgICAgICAgICAgIGlmICh0byA9PSBfYmFzZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9JbnRlcmZhY2VJbXBsR2VuZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSW50ZXJmYWNlSW1wbEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2NhMWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSW50ZXJmYWNlSW1wbEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRW5oYW5jZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0NsYXNzTG9hZGVyOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNGaWVsZDsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDTWV0aG9kOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQ29kZTsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkNvbnN0YW50czsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLlByb2plY3Q7CisKKy8qKgorICogQ3JlYXRlcyBpbXBsZW1lbnRhdGlvbnMgb2YgbWFuYWdlZCBpbnRlcmZhY2VzLiAgV2lsbCB0aHJvdyBleGNlcHRpb25zCisgKiBvbiB1bmtub3duIHByb3BlcnRpZXMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworY2xhc3MgSW50ZXJmYWNlSW1wbEdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoSW50ZXJmYWNlSW1wbEdlbmVyYXRvci5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RGSVggPSAib3BlbmpwYWltcGwiOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YVJlcG9zaXRvcnkgX3JlcG9zOworICAgIHByaXZhdGUgZmluYWwgTWFwIF9pbXBscyA9IG5ldyBXZWFrSGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgUHJvamVjdCBfcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgCisgICAgLy8gZGlzdGluY3QgcHJvamVjdCAvIGxvYWRlciBmb3IgZW5oYW5jZWQgdmVyc2lvbiBvZiBjbGFzcworICAgIHByaXZhdGUgZmluYWwgUHJvamVjdCBfZW5oUHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gIFN1cHBseSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBJbnRlcmZhY2VJbXBsR2VuZXJhdG9yKE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBfcmVwb3MgPSByZXBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZSwgcG9zc2libHkKKyAgICAgKiByZXR1cm5pbmcgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBDbGFzcyBjcmVhdGVJbXBsKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBDbGFzcyBpZmFjZSA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworCisgICAgICAgIC8vIGNoZWNrIGNhY2hlLgorICAgICAgICBDbGFzcyBpbXBsID0gKENsYXNzKSBfaW1wbHMuZ2V0KGlmYWNlKTsKKyAgICAgICAgaWYgKGltcGwgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBpbXBsOworCisgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudExvYWRlciA9IGlmYWNlLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIEJDQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IEJDQ2xhc3NMb2FkZXIoX3Byb2plY3QsIHBhcmVudExvYWRlcik7CisgICAgICAgIEJDQ2xhc3NMb2FkZXIgZW5oTG9hZGVyID0gbmV3IEJDQ2xhc3NMb2FkZXIoX2VuaFByb2plY3QsIHBhcmVudExvYWRlcik7CisgICAgICAgIEJDQ2xhc3MgYmMgPSBfcHJvamVjdC5sb2FkQ2xhc3MoZ2V0Q2xhc3NOYW1lKG1ldGEpKTsKKyAgICAgICAgYmMuZGVjbGFyZUludGVyZmFjZShpZmFjZSk7CisgICAgICAgIENsYXNzTWV0YURhdGEgc3VwID0gbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpOworICAgICAgICBpZiAoc3VwICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJjLnNldFN1cGVyY2xhc3Moc3VwLmdldEludGVyZmFjZUltcGwoKSk7CisgICAgICAgICAgICBlbmhMb2FkZXIgPSBuZXcgQkNDbGFzc0xvYWRlcihfZW5oUHJvamVjdCwgCisgICAgICAgICAgICAJCXN1cC5nZXRJbnRlcmZhY2VJbXBsKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZmllbGRzID0gbWV0YS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBTZXQgbWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSAKKyAgICAgICAgICAgIGFkZEZpZWxkKGJjLCBpZmFjZSwgZmllbGRzW2ldLCBtZXRob2RzKTsKKyAgICAgICAgaW52YWxpZGF0ZU5vbkJlYW5NZXRob2RzKGJjLCBpZmFjZSwgbWV0aG9kcyk7CisKKyAgICAgICAgLy8gZmlyc3QgbG9hZCB0aGUgYmFzZSBjbGFzcyBhcyB0aGUgZW5oYW5jZXIgcmVxdWlyZXMgdGhlIGNsYXNzCisgICAgICAgIC8vIHRvIGJlIGF2YWlsYWJsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnRlcmZhY2VJbXBsKENsYXNzLmZvck5hbWUoYmMuZ2V0TmFtZSgpLCB0cnVlLCBsb2FkZXIpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbihfbG9jLmdldCgiaW50ZXJmYWNlLWxvYWQiLCBpZmFjZSwgCisgICAgICAgICAgICAgICAgbG9hZGVyKSwgdCkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29weSB0aGUgQkNDbGFzcyBpbnRvIHRoZSBlbmhhbmNlciBwcm9qZWN0LgorICAgICAgICBiYyA9IF9lbmhQcm9qZWN0LmxvYWRDbGFzcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmMudG9CeXRlQXJyYXkoKSksIAorICAgICAgICAgICAgbG9hZGVyKTsKKyAgICAgICAgUENFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBQQ0VuaGFuY2VyKF9yZXBvcy5nZXRDb25maWd1cmF0aW9uKCksIGJjLCAKKyAgICAgICAgICAgIG1ldGEpOworCisgICAgICAgIGludCByZXN1bHQgPSBlbmhhbmNlci5ydW4oKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBQQ0VuaGFuY2VyLkVOSEFOQ0VfUEMpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oX2xvYy5nZXQoImludGVyZmFjZS1iYWRlbmhhbmNlIiwgCisgICAgICAgICAgICAgICAgaWZhY2UpKS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgLy8gbG9hZCB0aGUgY2xhc3MgZm9yIHJlYWwuCisgICAgICAgICAgICBpbXBsID0gQ2xhc3MuZm9yTmFtZShiYy5nZXROYW1lKCksIHRydWUsIGVuaExvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oX2xvYy5nZXQoImludGVyZmFjZS1sb2FkMiIsIGlmYWNlLCAKKyAgICAgICAgICAgICAgICBlbmhMb2FkZXIpLCB0KS5zZXRGYXRhbCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWNoZSB0aGUgZ2VuZXJhdGVkIGltcGwuCisgICAgICAgIF9pbXBscy5wdXQoaWZhY2UsIGltcGwpOworICAgICAgICByZXR1cm4gaW1wbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYmVhbiBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCBhbHNvIHJlY29yZGluZyBzZWVuIG1ldGhvZHMKKyAgICAgKiBpbnRvIHRoZSBnaXZlbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEZpZWxkIChCQ0NsYXNzIGJjLCBDbGFzcyBpZmFjZSwgRmllbGRNZXRhRGF0YSBmbWQsIAorICAgICAgICBTZXQgbWV0aG9kcykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGZtZC5nZXROYW1lKCk7CisgICAgICAgIENsYXNzIHR5cGUgPSBmbWQuZ2V0RGVjbGFyZWRUeXBlKCk7CisgICAgICAgIEJDRmllbGQgZmllbGQgPSBiYy5kZWNsYXJlRmllbGQobmFtZSwgdHlwZSk7CisgICAgICAgIGZpZWxkLnNldEFjY2Vzc0ZsYWdzKENvbnN0YW50cy5BQ0NFU1NfUFJJVkFURSk7CisKKyAgICAgICAgLy8gZ2V0dGVyCisgICAgICAgIG5hbWUgPSBTdHJpbmdVdGlscy5jYXBpdGFsaXplKG5hbWUpOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gaXNHZXR0ZXIoaWZhY2UsIGZtZCkgPyAiZ2V0IiA6ICJpcyI7CisgICAgICAgIEJDTWV0aG9kIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKHByZWZpeCArIG5hbWUsIHR5cGUsIG51bGwpOworICAgICAgICBtZXRoLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbWV0aC5nZXRDb2RlKHRydWUpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoZmllbGQpOworICAgICAgICBjb2RlLnhyZXR1cm4oKS5zZXRUeXBlKHR5cGUpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgIG1ldGhvZHMuYWRkKGdldE1ldGhvZFNhZmUoaWZhY2UsIG1ldGguZ2V0TmFtZSgpLCBudWxsKSk7CisKKyAgICAgICAgLy8gc2V0dGVyCisgICAgICAgIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKCJzZXQiICsgbmFtZSwgdm9pZC5jbGFzcywgbmV3IENsYXNzW117dHlwZX0pOworICAgICAgICBtZXRoLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS54bG9hZCgpLnNldFBhcmFtKDApLnNldFR5cGUodHlwZSk7CisgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgIG1ldGhvZHMuYWRkKGdldE1ldGhvZFNhZmUoaWZhY2UsIG1ldGguZ2V0TmFtZSgpLCB0eXBlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSBtZXRob2RzIG9uIHRoZSBpbnRlcmZhY2Ugd2hpY2ggYXJlIG5vdCBtYW5hZ2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlTm9uQmVhbk1ldGhvZHMoQkNDbGFzcyBiYywgQ2xhc3MgaWZhY2UsIAorICAgICAgICBTZXQgbWV0aG9kcykgeworICAgICAgICBNZXRob2RbXSBtZXRocyA9IGlmYWNlLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgICAgICBCQ01ldGhvZCBtZXRoOworICAgICAgICBDb2RlIGNvZGU7CisgICAgICAgIENsYXNzIHR5cGUgPSBfcmVwb3MuZ2V0TWV0YURhdGFGYWN0b3J5KCkuZ2V0RGVmYXVsdHMoKS4KKyAgICAgICAgICAgIGdldFVuaW1wbGVtZW50ZWRFeGNlcHRpb25UeXBlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtZXRob2RzLmNvbnRhaW5zKG1ldGhzW2ldKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG1ldGggPSBiYy5kZWNsYXJlTWV0aG9kKG1ldGhzW2ldLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgbWV0aHNbaV0uZ2V0UmV0dXJuVHlwZSgpLCBtZXRoc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICAgICAgICAgIG1ldGgubWFrZVB1YmxpYygpOworICAgICAgICAgICAgY29kZSA9IG1ldGguZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUodHlwZSk7CisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKHR5cGUsICI8aW5pdD4iLCB2b2lkLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgIGNvZGUuYXRocm93KCk7CisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdW5pcXVlIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIENsYXNzIGlmYWNlID0gbWV0YS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgIHJldHVybiBpZmFjZS5nZXROYW1lKCkgKyAiJCIgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShpZmFjZSkgKyBQT1NURklYOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIGdpdmVuIG1ldGhvZCAvIGFyZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kU2FmZShDbGFzcyBpZmFjZSwgU3RyaW5nIG5hbWUsIENsYXNzIGFyZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGlmYWNlLmdldERlY2xhcmVkTWV0aG9kKG5hbWUsIGFyZyA9PSBudWxsID8gbnVsbCA6CisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117YXJnfSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24gKF9sb2MuZ2V0ICgiaW50ZXJmYWNlLW1pc21hdGNoIiwgbmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0dldHRlcihDbGFzcyBpZmFjZSwgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaWYgKGZtZC5nZXRUeXBlKCkgIT0gYm9vbGVhbi5jbGFzcyAmJiBmbWQuZ2V0VHlwZSgpICE9IEJvb2xlYW4uY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRoID0gaWZhY2UuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUKKyAgICAgICAgICAgICAgICAoZm1kLmdldE5hbWUoKSksIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBtZXRoID09IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSmF2YVR5cGVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvSmF2YVR5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyNjZmOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9KYXZhVHlwZXMuamF2YQpAQCAtMCwwICsxLDQyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuQ0ZNZXRhRGF0YVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIFR5cGUgY29uc3RhbnRzIGZvciBtYW5hZ2VkIGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgSmF2YVR5cGVzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVIgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRSA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9ORyA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlQgPSA3OworICAgIC8vIGtlZXAgT0JKRUNUIGFzIGZpcnN0IG5vbi1wcmltaXRpdmUgdHlwZSBjb2RlOyBvdGhlciBjb2RlIHJlbGllcyBvbiBpdAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HID0gOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVIgPSAxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWSA9IDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTExFQ1RJT04gPSAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVAgPSAxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEMgPSAxNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOX09CSiA9IDE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEVfT0JKID0gMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9PQkogPSAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEVfT0JKID0gMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVRfT0JKID0gMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX09CSiA9IDIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkdfT0JKID0gMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfT0JKID0gMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklHREVDSU1BTCA9IDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJR0lOVEVHRVIgPSAyNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTEUgPSAyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQ19VTlRZUEVEID0gMjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVIgPSAyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSUQgPSAyOTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoSmF2YVR5cGVzLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBfdHlwZUNvZGVzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIF90eXBlQ29kZXMucHV0KFN0cmluZy5jbGFzcywgTnVtYmVycy52YWx1ZU9mKFNUUklORykpOworICAgICAgICBfdHlwZUNvZGVzLnB1dChCb29sZWFuLmNsYXNzLCBOdW1iZXJzLnZhbHVlT2YoQk9PTEVBTl9PQkopKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoQnl0ZS5jbGFzcywgTnVtYmVycy52YWx1ZU9mKEJZVEVfT0JKKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KENoYXJhY3Rlci5jbGFzcywgTnVtYmVycy52YWx1ZU9mKENIQVJfT0JKKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KERvdWJsZS5jbGFzcywgTnVtYmVycy52YWx1ZU9mKERPVUJMRV9PQkopKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoRmxvYXQuY2xhc3MsIE51bWJlcnMudmFsdWVPZihGTE9BVF9PQkopKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoSW50ZWdlci5jbGFzcywgTnVtYmVycy52YWx1ZU9mKElOVF9PQkopKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoTG9uZy5jbGFzcywgTnVtYmVycy52YWx1ZU9mKExPTkdfT0JKKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KFNob3J0LmNsYXNzLCBOdW1iZXJzLnZhbHVlT2YoU0hPUlRfT0JKKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KERhdGUuY2xhc3MsIE51bWJlcnMudmFsdWVPZihEQVRFKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KGphdmEuc3FsLkRhdGUuY2xhc3MsIE51bWJlcnMudmFsdWVPZihEQVRFKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KGphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcywgTnVtYmVycy52YWx1ZU9mKERBVEUpKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoamF2YS5zcWwuVGltZS5jbGFzcywgTnVtYmVycy52YWx1ZU9mKERBVEUpKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoQmlnSW50ZWdlci5jbGFzcywgTnVtYmVycy52YWx1ZU9mKEJJR0lOVEVHRVIpKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoQmlnRGVjaW1hbC5jbGFzcywgTnVtYmVycy52YWx1ZU9mKEJJR0RFQ0lNQUwpKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoTnVtYmVyLmNsYXNzLCBOdW1iZXJzLnZhbHVlT2YoTlVNQkVSKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KExvY2FsZS5jbGFzcywgTnVtYmVycy52YWx1ZU9mKExPQ0FMRSkpOworICAgICAgICBfdHlwZUNvZGVzLnB1dChPYmplY3QuY2xhc3MsIE51bWJlcnMudmFsdWVPZihPQkpFQ1QpKTsKKyAgICAgICAgX3R5cGVDb2Rlcy5wdXQoUGVyc2lzdGVuY2VDYXBhYmxlLmNsYXNzLCBOdW1iZXJzLnZhbHVlT2YoUENfVU5UWVBFRCkpOworICAgICAgICBfdHlwZUNvZGVzLnB1dChQcm9wZXJ0aWVzLmNsYXNzLCBOdW1iZXJzLnZhbHVlT2YoTUFQKSk7CisgICAgICAgIF90eXBlQ29kZXMucHV0KENhbGVuZGFyLmNsYXNzLCBOdW1iZXJzLnZhbHVlT2YoQ0FMRU5EQVIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpZWxkIG1ldGFkYXRhIHR5cGUgY29kZSBmb3IgdGhlIGdpdmVuIGNsYXNzLiBGaXJzdCBjbGFzcworICAgICAqIG9iamVjdHMgYXJlIG5vdCByZWNvZ25pemVkIGluIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGVDb2RlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1Q7CisKKyAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldE5hbWUoKS5jaGFyQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGJvb2xlYW4uY2xhc3MpID8gQk9PTEVBTiA6IEJZVEU7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDSEFSOworICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFOworICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkxPQVQ7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlQ7CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMT05HOworICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0hPUlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJbnRlZ2VyIGNvZGUgPSAoSW50ZWdlcikgX3R5cGVDb2Rlcy5nZXQodHlwZSk7CisgICAgICAgIGlmIChjb2RlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY29kZS5pbnRWYWx1ZSgpOworCisgICAgICAgIC8vIGhhdmUgdG8gZG8gdGhpcyBmaXJzdCB0byBjYXRjaCBjdXN0b20gY29sbGVjdGlvbiBhbmQgbWFwIHR5cGVzOworICAgICAgICAvLyBvbiByZXNvbHZlIHdlIGZpZ3VyZSBvdXQgaWYgdGhlc2UgY3VzdG9tIHR5cGVzIGFyZQorICAgICAgICAvLyBwZXJzaXN0ZW5jZS1jYXBhYmxlCisgICAgICAgIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpCisgICAgICAgICAgICByZXR1cm4gQ09MTEVDVElPTjsKKyAgICAgICAgaWYgKE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIE1BUDsKKyAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKQorICAgICAgICAgICAgcmV0dXJuIEFSUkFZOworICAgICAgICBpZiAoQ2FsZW5kYXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBDQUxFTkRBUjsKKworICAgICAgICBpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBTZXJpYWxpemFibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIE9CSkVDVDsKKyAgICAgICAgICAgIHJldHVybiBQQ19VTlRZUEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPQkpFQ1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGdpdmVuIG5hbWUgYWdhaW5zdCB0aGUgc2FtZSBzZXQgb2Ygc3RhbmRhcmQgcGFja2FnZXMgdXNlZAorICAgICAqIHdoZW4gcGFyc2luZyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSwgQ2xhc3NNZXRhRGF0YSBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjbGFzc0Zvck5hbWUobmFtZSwgY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGdpdmVuIG5hbWUgYWdhaW5zdCB0aGUgc2FtZSBzZXQgb2Ygc3RhbmRhcmQgcGFja2FnZXMgdXNlZAorICAgICAqIHdoZW4gcGFyc2luZyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSwgQ2xhc3NNZXRhRGF0YSBjb250ZXh0LAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzRm9yTmFtZShuYW1lLCBjb250ZXh0LCBjb250ZXh0LmdldERlc2NyaWJlZFR5cGUoKSwgbnVsbCwKKyAgICAgICAgICAgIGxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGdpdmVuIG5hbWUgYWdhaW5zdCB0aGUgc2FtZSBzZXQgb2Ygc3RhbmRhcmQgcGFja2FnZXMgdXNlZAorICAgICAqIHdoZW4gcGFyc2luZyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSwgVmFsdWVNZXRhRGF0YSBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjbGFzc0Zvck5hbWUobmFtZSwgY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGdpdmVuIG5hbWUgYWdhaW5zdCB0aGUgc2FtZSBzZXQgb2Ygc3RhbmRhcmQgcGFja2FnZXMgdXNlZAorICAgICAqIHdoZW4gcGFyc2luZyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSwgVmFsdWVNZXRhRGF0YSBjb250ZXh0LAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzRm9yTmFtZShuYW1lLAorICAgICAgICAgICAgY29udGV4dC5nZXRGaWVsZE1ldGFEYXRhKCkuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLAorICAgICAgICAgICAgY29udGV4dC5nZXRGaWVsZE1ldGFEYXRhKCkuZ2V0RGVjbGFyaW5nVHlwZSgpLCBjb250ZXh0LCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBnaXZlbiBuYW1lIGFnYWluc3QgdGhlIHNhbWUgc2V0IG9mIHN0YW5kYXJkIHBhY2thZ2VzIHVzZWQKKyAgICAgKiB3aGVuIHBhcnNpbmcgbWV0YWRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lLCBDbGFzc01ldGFEYXRhIG1ldGEsCisgICAgICAgIENsYXNzIGRlYywgVmFsdWVNZXRhRGF0YSB2bWQsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIFBlcnNpc3RlbmNlQ2FwYWJsZSBhbmQgT2JqZWN0CisgICAgICAgIGlmICgiUGVyc2lzdGVuY2VDYXBhYmxlIi5lcXVhbHMobmFtZSkKKyAgICAgICAgICAgIHx8ICJqYXZheC5qZG8uUGVyc2lzdGVuY2VDYXBhYmxlIi5lcXVhbHMobmFtZSkpIC8vIGJhY2t3YXJkcyBjb21wYXQKKyAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3M7CisgICAgICAgIGlmICgiT2JqZWN0Ii5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworCisgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSByZXAgPSBtZXRhLmdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgYm9vbGVhbiBydW50aW1lID0gKHJlcC5nZXRWYWxpZGF0ZSgpICYgcmVwLlZBTElEQVRFX1JVTlRJTUUpICE9IDA7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IHJlcC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIoZGVjLCBtZXRhLmdldEVudkNsYXNzTG9hZGVyKCkpOworCisgICAgICAgIC8vIHRyeSB0aGUgb3duZXIncyBwYWNrYWdlCisgICAgICAgIFN0cmluZyBwa2cgPSBTdHJpbmdzLmdldFBhY2thZ2VOYW1lKGRlYyk7CisgICAgICAgIENsYXNzIGNscyA9IENGTWV0YURhdGFQYXJzZXIuY2xhc3NGb3JOYW1lKG5hbWUsIHBrZywgcnVudGltZSwgbG9hZGVyKTsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsICYmIHZtZCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW5zdCB0aGlzIHZhbHVlIHR5cGUncyBwYWNrYWdlIHRvbworICAgICAgICAgICAgcGtnID0gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZSh2bWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworICAgICAgICAgICAgY2xzID0gQ0ZNZXRhRGF0YVBhcnNlci5jbGFzc0Zvck5hbWUobmFtZSwgcGtnLCBydW50aW1lLCBsb2FkZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWNsYXNzIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAodm1kID09IG51bGwpID8gKE9iamVjdCkgbWV0YSA6IChPYmplY3QpIHZtZCkpOworICAgICAgICByZXR1cm4gY2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4gdHlwZSBpZiBwb3NzaWJsZS4gSWYgdGhlIHR5cGUgaXMKKyAgICAgKiBhIG51bWVyaWMgcHJpbWl0aXZlLCB0aGlzIG1ldGhvZCBvbmx5IGd1YXJhbnRlZXMgdGhhdCB0aGUgcmV0dXJuIHZhbHVlCisgICAgICogaXMgYSB7QGxpbmsgTnVtYmVyfS4gSWYgbm8ga25vd24gY29udmVyc2lvbiBvciB0aGUgdmFsdWUgaXMgbnVsbCwKKyAgICAgKiByZXR1cm5zIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCB2YWwsIGludCB0eXBlQ29kZSkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHR5cGVDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEJJR0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKCgoTnVtYmVyKSB2YWwpLmRvdWJsZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCh2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIGNhc2UgQklHSU5URUdFUjoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQmlnSW50ZWdlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgTnVtYmVyIHx8IHZhbCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICAgICAgY2FzZSBCT09MRUFOX09CSjoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgY2FzZSBCWVRFX09CSjoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbCkuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgY2FzZSBDSEFSX09CSjoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKHZhbC50b1N0cmluZygpLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoKGNoYXIpICgoTnVtYmVyKSB2YWwpLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICBjYXNlIERBVEU6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgY2FzZSBET1VCTEVfT0JKOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEb3VibGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoKChOdW1iZXIpIHZhbCkuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgY2FzZSBGTE9BVF9PQko6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZsb2F0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQoKChOdW1iZXIpIHZhbCkuZmxvYXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgY2FzZSBJTlRfT0JKOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBJbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJzLnZhbHVlT2YoKChOdW1iZXIpIHZhbCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIGNhc2UgTE9OR19PQko6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExvbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZigoKE51bWJlcikgdmFsKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcodmFsLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCh2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIGNhc2UgU0hPUlRfT0JKOgorICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KCgoTnVtYmVyKSB2YWwpLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCh2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWwudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSAocG9zc2libHkgdW5yZXNvbHZlZCkgZmllbGQgb3IgaXRzIGVsZW1lbnRzIG1pZ2h0IGJlCisgICAgICogcGVyc2lzdGVuY2UgY2FwYWJsZSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXliZVBDKEZpZWxkTWV0YURhdGEgZmllbGQpIHsKKyAgICAgICAgc3dpdGNoIChmaWVsZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF5YmVQQyhmaWVsZC5nZXRFbGVtZW50KCkpOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXliZVBDKGZpZWxkLmdldEtleSgpKSB8fCBtYXliZVBDKGZpZWxkLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBtYXliZVBDKChWYWx1ZU1ldGFEYXRhKSBmaWVsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgKHBvc3NpYmx5IHVucmVzb2x2ZWQpIHZhbHVlIG1pZ2h0IGJlIGEgZmlyc3QgY2xhc3MKKyAgICAgKiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1heWJlUEMoVmFsdWVNZXRhRGF0YSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIG1heWJlUEModmFsLmdldERlY2xhcmVkVHlwZUNvZGUoKSwgdmFsLmdldERlY2xhcmVkVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdW5yZXNvbHZlZCB0eXBlY29kZS90eXBlIHBhaXIgbWF5IHJlcHJlc2VudCBhCisgICAgICogcGVyc2lzdGVudCBvYmplY3QuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gbWF5YmVQQyhpbnQgdHlwZUNvZGUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3dpdGNoICh0eXBlQ29kZSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIXR5cGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEudXRpbC4iKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byByZXR1cm4gdGhlIGdpdmVuIGFycmF5IHZhbHVlIGFzIGEgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgdG9MaXN0KE9iamVjdCB2YWwsIENsYXNzIGVsZW0sIGJvb2xlYW4gbXV0YWJsZSkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBMaXN0IGw7CisgICAgICAgIGlmICghZWxlbS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAvLyBpZiBhbiBvYmplY3QgYXJyYXksIHVzZSBidWlsdC1pbiBsaXN0IGZ1bmN0aW9uCisgICAgICAgICAgICBsID0gQXJyYXlzLmFzTGlzdCgoT2JqZWN0W10pIHZhbCk7CisgICAgICAgICAgICBpZiAobXV0YWJsZSkKKyAgICAgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdChsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gbGlzdCBvZiB3cmFwcGVyIG9iamVjdHMKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgodmFsKTsKKyAgICAgICAgICAgIGwgPSBuZXcgQXJyYXlMaXN0KGxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGwuYWRkKEFycmF5LmdldCh2YWwsIGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJldHVybiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBhcyBhbiBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0b0FycmF5KENvbGxlY3Rpb24gY29sbCwgQ2xhc3MgZWxlbSkgeworICAgICAgICBpZiAoY29sbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoZWxlbSwgY29sbC5zaXplKCkpOworICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IGlkeCsrKQorICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCBpZHgsIGl0ci5uZXh0ICgpKTsKKwkJcmV0dXJuIGFycmF5OworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9MaWZlY3ljbGVNZXRhRGF0YS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL0xpZmVjeWNsZU1ldGFEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4MDA1ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9MaWZlY3ljbGVNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVDYWxsYmFja3M7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgYSBtYW5hZ2VkIHR5cGUuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVNZXRhRGF0YQorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9OT05FID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkVfSElHSCA9IDIgPDwgMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkVfTE9XID0gMiA8PCAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlmZWN5Y2xlQ2FsbGJhY2tzW10gRU1QVFlfQ0FMTEJBQ0tTID0KKyAgICAgICAgbmV3IExpZmVjeWNsZUNhbGxiYWNrc1swXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChMaWZlY3ljbGVNZXRhRGF0YS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWV0YURhdGEgX21ldGE7CisgICAgcHJpdmF0ZSBMaWZlY3ljbGVDYWxsYmFja3NbXVtdIF9kZWNsYXJlZCA9IG51bGw7CisgICAgcHJpdmF0ZSBMaWZlY3ljbGVDYWxsYmFja3NbXVtdIF9zdXBlciA9IG51bGw7CisgICAgcHJpdmF0ZSBMaWZlY3ljbGVDYWxsYmFja3NbXVtdIF9hbGwgPSBudWxsOworICAgIHByaXZhdGUgaW50W10gX2hpZ2ggPSBudWxsOworICAgIHByaXZhdGUgaW50W10gX3N1cGVySGlnaCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9yZXNvbHZlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaWdub3JlU3lzdGVtID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgX2lnbm9yZVN1cHMgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggb3duaW5nIG1ldGFkYXRhLgorICAgICAqLworICAgIExpZmVjeWNsZU1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBleGNsdWRlIHN5c3RlbSBsaXN0ZW5lcnMgZnJvbSBldmVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlU3lzdGVtTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gX2lnbm9yZVN5c3RlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGV4Y2x1ZGUgc3lzdGVtIGxpc3RlbmVycyBmcm9tIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVTeXN0ZW1MaXN0ZW5lcnMoYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgX2lnbm9yZVN5c3RlbSA9IGlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGV4Y2x1ZGUgc3VwZXJjbGFzcyBjYWxsYmFja3MgZnJvbSBldmVudHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJZ25vcmVTdXBlcmNsYXNzQ2FsbGJhY2tzKCkgeworICAgICAgICByZXR1cm4gX2lnbm9yZVN1cHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBleGNsdWRlIHN1cGVyY2xhc3MgY2FsbGJhY2tzIGZyb20gZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZVN1cGVyY2xhc3NDYWxsYmFja3MoaW50IGlnbm9yZSkgeworICAgICAgICBfaWdub3JlU3VwcyA9IGlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGNhbGxiYWNrcyBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUNhbGxiYWNrc1tdIGdldERlY2xhcmVkQ2FsbGJhY2tzKGludCBldmVudFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIChfZGVjbGFyZWQgPT0gbnVsbCB8fCBfZGVjbGFyZWRbZXZlbnRUeXBlXSA9PSBudWxsKQorICAgICAgICAgICAgPyBFTVBUWV9DQUxMQkFDS1MgOiBfZGVjbGFyZWRbZXZlbnRUeXBlXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIGNhbGxiYWNrcyBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUsIGluY2x1ZGluZyBzdXBlcmNsYXNzCisgICAgICogY2FsbGJhY2tzIGlmIGFwcHJvcHJpYXRlLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVDYWxsYmFja3NbXSBnZXRDYWxsYmFja3MoaW50IGV2ZW50VHlwZSkgeworICAgICAgICByZXNvbHZlKCk7CisgICAgICAgIHJldHVybiAoX2FsbCA9PSBudWxsIHx8IF9hbGxbZXZlbnRUeXBlXSA9PSBudWxsKQorICAgICAgICAgICAgPyBFTVBUWV9DQUxMQkFDS1MgOiBfYWxsW2V2ZW50VHlwZV07CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFja3MgZm9yIHRoZSBnaXZlbiBldmVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGhpZ2hQcmlvcml0eSB0aGUgZmlyc3QgTiBnaXZlbiBjYWxsYmFja3MgYXJlIGhpZ2ggcHJpb3JpdHk7CisgICAgICogaGlnaCBwcmlvcml0eSBjYWxsYmFja3Mgd2lsbCBiZSByZXR1cm5lZCBiZWZvcmUKKyAgICAgKiBub24taGlnaC1wcmlvcml0eSBzdXBlcmNsYXNzIGNhbGxiYWNrcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmVkQ2FsbGJhY2tzKGludCBldmVudFR5cGUsCisgICAgICAgIExpZmVjeWNsZUNhbGxiYWNrc1tdIGNhbGxiYWNrcywgaW50IGhpZ2hQcmlvcml0eSkgeworICAgICAgICBpZiAoX3Jlc29sdmVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKF9sb2MuZ2V0KCJsaWZlY3ljbGUtcmVzb2x2ZWQiLAorICAgICAgICAgICAgICAgIF9tZXRhLCBBcnJheXMuYXNMaXN0KGNhbGxiYWNrcykpKTsKKworICAgICAgICBpZiAoX2RlY2xhcmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIF9kZWNsYXJlZCA9IG5ldyBMaWZlY3ljbGVDYWxsYmFja3MKKyAgICAgICAgICAgICAgICBbTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGhdW107CisgICAgICAgICAgICBfaGlnaCA9IG5ldyBpbnRbTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGhdOworICAgICAgICB9CisgICAgICAgIF9kZWNsYXJlZFtldmVudFR5cGVdID0gY2FsbGJhY2tzOworICAgICAgICBfaGlnaFtldmVudFR5cGVdID0gaGlnaFByaW9yaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2FsbGJhY2tzIGZvciB0aGUgbm9uLVBDIHN1cGVyY2xhc3MuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUNhbGxiYWNrc1tdIGdldE5vblBDU3VwZXJjbGFzc0NhbGxiYWNrcworICAgICAgICAoaW50IGV2ZW50VHlwZSkgeworICAgICAgICByZXR1cm4gKF9zdXBlciA9PSBudWxsIHx8IF9zdXBlcltldmVudFR5cGVdID09IG51bGwpCisgICAgICAgICAgICA/IEVNUFRZX0NBTExCQUNLUyA6IF9zdXBlcltldmVudFR5cGVdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FsbGJhY2tzIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZSBmb3Igbm9uLXBlcnNpc3RlbnQKKyAgICAgKiBzdXBlcmNsYXNzLiBOb3RlIHRoZXNlIGNhbGxiYWNrcyB3aWxsIG9ubHkgYmUgdXNlZCB3aGVyZSB0aGUKKyAgICAgKiBub24tcGVyc2lzdGVudCBzdXBlcmNsYXNzIGlzIHRoZSBkaXJlY3QgYW5jZXN0b3Igb2YgdGhlIGRlc2NyaWJlZCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoaWdoUHJpb3JpdHkgdGhlIGZpcnN0IE4gZ2l2ZW4gY2FsbGJhY2tzIGFyZSBoaWdoIHByaW9yaXR5OworICAgICAqIGhpZ2ggcHJpb3JpdHkgY2FsbGJhY2tzIHdpbGwgYmUgcmV0dXJuZWQgYmVmb3JlCisgICAgICogbm9uLWhpZ2gtcHJpb3JpdHkgc3VwZXJjbGFzcyBjYWxsYmFja3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb25QQ1N1cGVyY2xhc3NDYWxsYmFja3MoaW50IGV2ZW50VHlwZSwKKyAgICAgICAgTGlmZWN5Y2xlQ2FsbGJhY2tzW10gY2FsbGJhY2tzLCBpbnQgaGlnaFByaW9yaXR5KSB7CisgICAgICAgIGlmIChfcmVzb2x2ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oX2xvYy5nZXQoImxpZmVjeWNsZS1yZXNvbHZlZCIsCisgICAgICAgICAgICAgICAgX21ldGEsIEFycmF5cy5hc0xpc3QoY2FsbGJhY2tzKSkpOworCisgICAgICAgIGlmIChfc3VwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgX3N1cGVyID0gbmV3IExpZmVjeWNsZUNhbGxiYWNrcworICAgICAgICAgICAgICAgIFtMaWZlY3ljbGVFdmVudC5BTExfRVZFTlRTLmxlbmd0aF1bXTsKKyAgICAgICAgICAgIF9zdXBlckhpZ2ggPSBuZXcgaW50W0xpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFMubGVuZ3RoXTsKKyAgICAgICAgfQorICAgICAgICBfc3VwZXJbZXZlbnRUeXBlXSA9IGNhbGxiYWNrczsKKyAgICAgICAgX3N1cGVySGlnaFtldmVudFR5cGVdID0gaGlnaFByaW9yaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYWxsIGNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlc29sdmUoKSB7CisgICAgICAgIGlmICghX3Jlc29sdmVkKSB7CisgICAgICAgICAgICBfYWxsID0gY29tYmluZUNhbGxiYWNrcygpOworICAgICAgICAgICAgX3Jlc29sdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmUgb3VyIGNhbGxiYWNrcyB3aXRoIHN1cGVyY2xhc3MgY2FsbGJhY2tzIGFzIG5lY2Vzc2FyeS4KKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIG1hbmlwdWxhdGluZyB0aGUgX2hpZ2ggYXJyYXkgdG8KKyAgICAgKiByZWZsZWN0IHRoZSBjb21iaW5lZCBjYWxsYmFja3MgcmF0aGVyIHRoYW4gdGhlIGRlY2xhcmVkIG9uZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaWZlY3ljbGVDYWxsYmFja3NbXVtdIGNvbWJpbmVDYWxsYmFja3MoKSB7CisgICAgICAgIGlmIChfaWdub3JlU3VwcyA9PSAoSUdOT1JFX0hJR0ggfCBJR05PUkVfTE9XKSkKKyAgICAgICAgICAgIHJldHVybiBfZGVjbGFyZWQ7CisKKyAgICAgICAgTGlmZWN5Y2xlTWV0YURhdGEgc3VwTWV0YSA9IChfbWV0YS5nZXRQQ1N1cGVyY2xhc3MoKSA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogX21ldGEuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKS5nZXRMaWZlY3ljbGVNZXRhRGF0YSgpOworICAgICAgICBpZiAoc3VwTWV0YSA9PSBudWxsICYmIF9zdXBlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9kZWNsYXJlZDsKKworICAgICAgICBpZiAoc3VwTWV0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBNZXRhLnJlc29sdmUoKTsKKyAgICAgICAgICAgIGlmIChzdXBNZXRhLl9hbGwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RlY2xhcmVkOworICAgICAgICAgICAgaWYgKF9kZWNsYXJlZCA9PSBudWxsICYmIF9pZ25vcmVTdXBzID09IDApIHsKKyAgICAgICAgICAgICAgICBfaGlnaCA9IHN1cE1ldGEuX2hpZ2g7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cE1ldGEuX2FsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRvbid0IGhvbGQgc3Ryb25nIHJlZnMgb250byByZWR1bmRhbnQgaW5mbworICAgICAgICAgICAgX3N1cGVyID0gbnVsbDsKKyAgICAgICAgICAgIF9zdXBlckhpZ2ggPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgTGlmZWN5Y2xlQ2FsbGJhY2tzW11bXSBhbGwgPSBuZXcgTGlmZWN5Y2xlQ2FsbGJhY2tzCisgICAgICAgICAgICBbTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGhdW107CisgICAgICAgIExpZmVjeWNsZUNhbGxiYWNrc1tdIGRlY3MsIHN1cHM7CisgICAgICAgIGludCBzdXBTdGFydCwgc3VwRW5kLCBzdXBIaWdoOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZWNzID0gZ2V0RGVjbGFyZWRDYWxsYmFja3MoaSk7CisgICAgICAgICAgICBpZiAoc3VwTWV0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3VwcyA9IChfc3VwZXJbaV0gPT0gbnVsbCkgPyBFTVBUWV9DQUxMQkFDS1MgOiBfc3VwZXJbaV07CisgICAgICAgICAgICAgICAgc3VwSGlnaCA9IChfc3VwZXJIaWdoID09IG51bGwpID8gMCA6IF9zdXBlckhpZ2hbaV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cHMgPSBzdXBNZXRhLmdldENhbGxiYWNrcyhpKTsKKyAgICAgICAgICAgICAgICBzdXBIaWdoID0gKHN1cE1ldGEuX2hpZ2ggPT0gbnVsbCkgPyAwIDogc3VwTWV0YS5faGlnaFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cFN0YXJ0ID0gKChfaWdub3JlU3VwcyAmIElHTk9SRV9ISUdIKSAhPSAwKSA/IHN1cEhpZ2ggOiAwOworICAgICAgICAgICAgc3VwRW5kID0gKChfaWdub3JlU3VwcyAmIElHTk9SRV9MT1cpICE9IDApID8gc3VwSGlnaCA6IHN1cHMubGVuZ3RoOworCisgICAgICAgICAgICBpZiAoc3VwRW5kIC0gc3VwU3RhcnQgPT0gMCkKKyAgICAgICAgICAgICAgICBhbGxbaV0gPSBkZWNzOworICAgICAgICAgICAgZWxzZSBpZiAoZGVjcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzdXBFbmQgLSBzdXBTdGFydCA9PSBzdXBzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgYWxsW2ldID0gc3VwczsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsW2ldID0gbmV3IExpZmVjeWNsZUNhbGxiYWNrc1tzdXBFbmQgLSBzdXBTdGFydF07CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3Vwcywgc3VwU3RhcnQsIGFsbFtpXSwgMCwgYWxsW2ldLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfaGlnaCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfaGlnaCA9IG5ldyBpbnRbYWxsLmxlbmd0aF07CisgICAgICAgICAgICAgICAgX2hpZ2hbaV0gPSBzdXBIaWdoIC0gc3VwU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbFtpXSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBMaWZlY3ljbGVDYWxsYmFja3NbZGVjcy5sZW5ndGggKyBzdXBFbmQgLSBzdXBTdGFydF07CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworCisgICAgICAgICAgICAgICAgLy8gYWRkIHN1cGVyY2xhc3MgaGlnaCBwcmlvcml0eSBjYWxsYmFja3MgZmlyc3QKKyAgICAgICAgICAgICAgICBpZiAoKF9pZ25vcmVTdXBzICYgSUdOT1JFX0hJR0gpID09IDApCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3VwSGlnaDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgYWxsW2ldW2NvdW50KytdID0gc3Vwc1tqXTsKKyAgICAgICAgICAgICAgICAvLyB0aGVuIG91ciBoaWdoIHByaW9yaXR5CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfaGlnaFtpXTsgaisrKQorICAgICAgICAgICAgICAgICAgICBhbGxbaV1bY291bnQrK10gPSBkZWNzW2pdOworICAgICAgICAgICAgICAgIC8vIHRoZW4gc3VwZXJjbGFzcyBsb3cgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICBpZiAoKF9pZ25vcmVTdXBzICYgSUdOT1JFX0xPVykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHN1cEhpZ2g7IGogPCBzdXBzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgYWxsW2ldW2NvdW50KytdID0gc3Vwc1tqXTsKKyAgICAgICAgICAgICAgICAvLyB0aGVuIG91ciBsb3cgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gX2hpZ2hbaV07IGogPCBkZWNzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBhbGxbaV1bY291bnQrK10gPSBkZWNzW2pdOworCisgICAgICAgICAgICAgICAgaWYgKChfaWdub3JlU3VwcyAmIElHTk9SRV9ISUdIKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBfaGlnaFtpXSArPSBzdXBIaWdoOworCQkJfQorCQl9CisJCXJldHVybiBhbGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhQ29udGV4dC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmNhNDAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworLyoqCisgKiBBbGxvd3MgdXMgdG8gYWNjZXNzIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCBtZXRhZGF0YSBpbiBhIGdlbmVyaWMgd2F5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFDb250ZXh0IHsKKworICAgIC8qKgorICAgICAqIEFjY2VzcyBtZXRhZGF0YSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhRGVmYXVsdHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9NZXRhRGF0YURlZmF1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhZWMwYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9NZXRhRGF0YURlZmF1bHRzLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5DYWxsYmFja01vZGVzOworCisvKioKKyAqIFBvcHVsYXRlcyBuZXcgbWV0YWRhdGEgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRGVmYXVsdHMKKyAgICBleHRlbmRzIENhbGxiYWNrTW9kZXMgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IGFjY2VzcyB0eXBlIGZvciBhIGJhc2UgcGVyc2lzdGVudCBjbGFzcyB3aXRoCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjQUNDRVNTX1VOS05PV059IGFjY2VzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBpZGVudGl0eSB0eXBlIGZvciB1bm1hcHBlZCBjbGFzc2VzIHdpdGhvdXQgcHJpbWFyeQorICAgICAqIGtleSBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWZhdWx0SWRlbnRpdHlUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGF0IHRvIGRvIG9uIGxpZmVjeWNsZSBjYWxsYmFjayBleGNlcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2FsbGJhY2tNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiBjYWxsYmFja3MgYXJlIGZpcmVkIGJlZm9yZSBsaXN0ZW5lcnMgZm9yIHRoZSBnaXZlbgorICAgICAqIGV2ZW50IHR5cGUuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhbGxiYWNrc0JlZm9yZUxpc3RlbmVycyhpbnQgdHlwZSk7CisgICAKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGRlY2xhcmVkIGludGVyZmFjZXMgb2YgYSBjbGFzcyBhcmUgdHJlYXRlZCBhcyBwZXJzaXN0ZW50CisgICAgICogdHlwZXMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWNsYXJlZEludGVyZmFjZVBlcnNpc3RlbnQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGZpZWxkIGluIHRoZSBvYmplY3QgaWQgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhIAorICAgICAqIGRhdGFzdG9yZSBpZCBwZXJzaXN0ZW5jZS1jYXBhYmxlIHByaW1hcnkga2V5IGZpZWxkIGlzIHRoZSBzaW1wbGUgCisgICAgICogZGF0YXN0b3JlIGlkIHZhbHVlIG9mIHRoZSByZWxhdGVkIGluc3RhbmNlLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhU3RvcmVPYmplY3RJZEZpZWxkVW53cmFwcGVkKCk7CisgCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBpZ25vcmUgbWVtYmVycyB3aGljaCBhcmUgbm90IHBlcnNpc3RlbnQgYnkgZGVmYXVsdAorICAgICAqIGR1cmluZyBtZXRhZGF0YSBwb3B1bGF0aW9uLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZU5vblBlcnNpc3RlbnQoYm9vbGVhbiBpZ25vcmUpOworCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgdGhlIGdpdmVuIG1ldGFkYXRhIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3MgYWNjZXNzIHR5cGUgY29uc3RhbnQgZnJvbSB7QGxpbmsgQ2xhc3NNZXRhRGF0YX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShDbGFzc01ldGFEYXRhIG1ldGEsIGludCBhY2Nlc3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYWNraW5nIG1lbWJlciBmb3IgdGhlIGdpdmVuIGZpZWxkIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0QmFja2luZ01lbWJlcihGaWVsZE1ldGFEYXRhIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIGNsYXNzIHRvIHRocm93IGZvciB1bi1pbXBsZW1lbnRlZAorICAgICAqIG1hbmFnZWQgaW50ZXJmYWNlIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFVuaW1wbGVtZW50ZWRFeGNlcHRpb25UeXBlKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ODA2ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9NZXRhRGF0YUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuQ2xhc3NBcmdQYXJzZXI7CisKKy8qKgorICogVGhlIHtAbGluayBNZXRhRGF0YVJlcG9zaXRvcnl9IHVzZXMgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlCisgKiB0byBsb2FkIGFuZCBzdG9yZSBtZXRhZGF0YS4gSW1wbGVtZW50YXRpb25zIG5lZWQgbm90IGJlIHRocmVhZHNhZmUuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFGYWN0b3J5CisgICAgZXh0ZW5kcyBNZXRhRGF0YU1vZGVzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX0RFRkFVTFQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1BFUl9DTEFTUyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVfVkVSQk9TRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcG9zaXRvcnkgdG8gbG9hZCBtZXRhZGF0YSBpbnRvLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MpOworCisgICAgLyoqCisgICAgICogQmFzZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgbWV0YWRhdGEuIE1heSBub3QgYmUgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlRGlyZWN0b3J5KEZpbGUgZGlyKTsKKworICAgIC8qKgorICAgICAqIFN0b3JhZ2UgbW9kZS4gTWF5IG5vdCBiZSBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVNb2RlKGludCBzdG9yZSk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBJL08ncyBtdXN0IGV4YWN0bHkgb2JleSB0aGUgbW9kZSBkaXJlY3RpdmVzIGdpdmVuLCBhbmQgbWF5CisgICAgICogbm90IGxvYWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3QoYm9vbGVhbiBzdHJpY3QpOworCisgICAgLyoqCisgICAgICogTG9hZCBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGNsYXNzIGluIHRoZSBnaXZlbiBtb2RlKHMpLiBJZiBsb2FkaW5nCisgICAgICogaW4ge0BsaW5rIE1ldGFEYXRhTW9kZXMjTU9ERV9RVUVSWX0sIHRoZSBjbGFzcyBtYXkgYmUgbnVsbC4gTG9hZGVkCisgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSByZXBvc2l0b3J5LiBJdCBzaG91bGQgaGF2ZQorICAgICAqIGl0cyBzb3VyY2UgbW9kZSBzZXQgYXBwcm9wcmlhdGVseSB2aWEKKyAgICAgKiB7QGxpbmsgQ2xhc3NNZXRhRGF0YSNzZXRTb3VyY2VNb2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIHRvIGxvYWQgbWV0YWRhdGEgaW46IGlmIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMKKyAgICAgKiBzdG9yZWQgdG9nZXRoZXIgd2l0aCBtZXRhZGF0YSwgdGhlbiB5b3UgY2FuIGxvYWQgbWFwcGluZworICAgICAqIGRhdGEgZXZlbiBpZiB0aGlzIG1vZGUgb25seSBpbmNsdWRlcworICAgICAqIHtAbGluayBNZXRhRGF0YU1vZGVzI01PREVfTUVUQSBNT0RFX01FVEF9LCBzbyBsb25nIGFzCisgICAgICogdGhlIDxjb2RlPnN0cmljdDwvY29kZT4gcHJvcGVydHkgaGFzbid0IGJlZW4gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZChDbGFzcyBjbHMsIGludCBtb2RlLCBDbGFzc0xvYWRlciBlbnZMb2FkZXIpOworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIGdpdmVuIG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUgaGludCBhYm91dCB3aGF0IGFzcGVjdHMgb2YgdGhlIG1ldGFkYXRhIGhhdmUgY2hhbmdlZAorICAgICAqIEBwYXJhbSBvdXRwdXQgaWYgbm9uLW51bGwsIHJhdGhlciB0aGFuIHN0b3JpbmcgbWV0YWRhdGEgZGlyZWN0bHksCisgICAgICogYWRkIGVudHJpZXMgbWFwcGluZyBlYWNoIG91dHB1dCBkZXN0aW5hdGlvbiBzdWNoCisgICAgICogYXMgYSA8Y29kZT5GaWxlPC9jb2RlPiB0byB0aGUgcGxhbm5lZCBvdXRwdXQgZm9yIHRoYXQKKyAgICAgKiBkZXN0aW5hdGlvbiBpbiBzdHJpbmcgZm9ybQorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhpcyBmYWN0b3J5IGlzIHVuYWJsZSB0byBzdG9yZSBtZXRhZGF0YQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3JlKENsYXNzTWV0YURhdGFbXSBtZXRhcywgUXVlcnlNZXRhRGF0YVtdIHF1ZXJpZXMsCisgICAgICAgIFNlcXVlbmNlTWV0YURhdGFbXSBzZXFzLCBpbnQgbW9kZSwgTWFwIG91dHB1dCk7CisKKyAgICAvKioKKyAgICAgKiBEcm9wIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGNsYXNzZXMgaW4gdGhlIGdpdmVuIG1vZGUocykuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIGFueSBtZXRhZGF0YSBjb3VsZCBub3QgYmUgZHJvcHBlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRyb3AoQ2xhc3NbXSBjbHMsIGludCBtb2RlLCBDbGFzc0xvYWRlciBlbnZMb2FkZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXRhZGF0YSBkZWZhdWx0cyBmb3IgdGhpcyBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YURlZmF1bHRzIGdldERlZmF1bHRzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIHBlcnNpc3RlbnQgY2xhc3MgbmFtZXMsIHVzaW5nIHRoZSBtZXRhZGF0YSBsb2NhdGlvbnMgc3VwcGxpZWQKKyAgICAgKiBpbiBjb25maWd1cmF0aW9uLCBvcHRpb25hbGx5IHNjYW5uaW5nIHRoZSBjbGFzc3BhdGguCisgICAgICogUmV0dXJuIG51bGwgaWYgbm8gdHlwZXMgYXJlIHN1cHBsaWVkIGFuZCB0aGlzIGZhY3RvcnkgaXMgdW5hYmxlIHRvIHNjYW4KKyAgICAgKiB0aGUgY2xhc3NwYXRoLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgb3V0c2lkZQorICAgICAqIGNvZGU7IHVzZSB7QGxpbmsgTWV0YURhdGFSZXBvc2l0b3J5I2dldFBlcnNpc3RlbnRUeXBlTmFtZXN9IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAc2VlIE1ldGFEYXRhUmVwb3NpdG9yeSNnZXRQZXJzaXN0ZW50VHlwZU5hbWVzCisgICAgICogQHNlZSBNZXRhRGF0YVJlcG9zaXRvcnkjbG9hZFBlcnNpc3RlbnRUeXBlcworICAgICAqLworICAgIHB1YmxpYyBTZXQgZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhib29sZWFuIGRldnBhdGgsIENsYXNzTG9hZGVyIGVudkxvYWRlcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR5cGUgZGVmaW5pbmcgdGhlIGdpdmVuIHF1ZXJ5IG5hbWUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UXVlcnlTY29wZShTdHJpbmcgcXVlcnlOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0eXBlIGRlZmluaW5nIHRoZSBnaXZlbiByZXN1bHQgc2V0IG1hcHBpbmcgbmFtZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRTZXRNYXBwaW5nU2NvcGUoU3RyaW5nIHJlc3VsdFNldE1hcHBpbmdOYW1lLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIHByb3Blcmx5LWNvbmZpZ3VyZWQgY2xhc3MgYXJnIHBhcnNlciBmb3Igb3VyIGV4cGVjdGVkCisgICAgICogbWV0YWRhdGEgZm9ybWF0LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0FyZ1BhcnNlciBuZXdDbGFzc0FyZ1BhcnNlcigpOworCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGludGVybmFsIGNhY2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogQWRkIGFueSBleHRlbnNpb24ga2V5cyB1c2VkIGJ5IHRoaXMgaW5zdGFuY2UgdG8gdGhlIGdpdmVuIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0V4dGVuc2lvbktleXMoQ29sbGVjdGlvbiBleHRzKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbnkgZXh0ZW5zaW9uIGtleXMgdXNlZCBieSB0aGlzIGluc3RhbmNlIHRvIHRoZSBnaXZlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmllbGRFeHRlbnNpb25LZXlzIChDb2xsZWN0aW9uIGV4dHMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhSW5oZXJpdGFuY2VDb21wYXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFJbmhlcml0YW5jZUNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U3MmRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhSW5oZXJpdGFuY2VDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworLyoqCisgKiBDb21wYXJhdG9yIHRoYXQga2VlcHMgbWV0YWRhdGFzIGluIGluaGVyaXRhbmNlIG9yZGVyLiAgQWxzbyBwbGFjZXMgcmVsYXRpb24KKyAqIHR5cGVzIHVzZWQgYXMgcHJpbWFyeSBrZXlzIGJlZm9yZSB0aGUgcHJpbWFyeSBrZXkgZmllbGQgb3duZXIgdHlwZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE1ldGFEYXRhSW5oZXJpdGFuY2VDb21wYXJhdG9yCisgICAgZXh0ZW5kcyBJbmhlcml0YW5jZUNvbXBhcmF0b3IgeworCisgICAgcHJvdGVjdGVkIENsYXNzIHRvQ2xhc3MoT2JqZWN0IGVsZW0pIHsKKyAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKChDbGFzc01ldGFEYXRhKSBlbGVtKS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIGlmIChvMSA9PSBvMikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobzEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG8yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBDbGFzc01ldGFEYXRhIG0xID0gKENsYXNzTWV0YURhdGEpIG8xOworICAgICAgICBDbGFzc01ldGFEYXRhIG0yID0gKENsYXNzTWV0YURhdGEpIG8yOworCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gbTEuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1kc1tpXS5pc1ByaW1hcnlLZXkoKSAmJiBtMi5nZXREZXNjcmliZWRUeXBlKCkuCisgICAgICAgICAgICAgICAgaXNBc3NpZ25hYmxlRnJvbShmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBmbWRzID0gbTIuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1kc1tpXS5pc1ByaW1hcnlLZXkoKSAmJiBtMS5nZXREZXNjcmliZWRUeXBlKCkuCisgICAgICAgICAgICAgICAgaXNBc3NpZ25hYmxlRnJvbShmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmUobzEsIG8yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFNb2Rlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhTW9kZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY4ZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhTW9kZXMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCisvKioKKyAqIE1vZGUgY29uc3RhbnRzIHVzZWQgdG8gdHJhY2sgdGhlIGluaXRpYWxpemF0aW9uIHN0YXR1cyBvZiBtZXRhZGF0YS4KKyAqIFRoZXNlIGNvbnN0YW50cyBjYW4gYmUgdXNlZCBhcyBiaXQgZmxhZ3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhTW9kZXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9OT05FID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX01FVEEgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfTUFQUElORyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9RVUVSWSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9NQVBQSU5HX0lOSVQgPSA4OworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhUmVwb3NpdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL01ldGFEYXRhUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTA3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxODQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDUmVnaXN0cnkuUmVnaXN0ZXJDbGFzc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBSWQ7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogUmVwb3NpdG9yeSBvZiBhbmQgZmFjdG9yeSBmb3IgcGVyc2lzdGVudCBtZXRhZGF0YS4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFN0ZXZlIEtpbSAocXVlcnkgbWV0YWRhdGEpCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhRGF0YVJlcG9zaXRvcnkKKyAgICBpbXBsZW1lbnRzIFBDUmVnaXN0cnkuUmVnaXN0ZXJDbGFzc0xpc3RlbmVyLCBDb25maWd1cmFibGUsIENsb3NlYWJsZSwgCisgICAgTWV0YURhdGFNb2RlcywgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHRvIG5vdCB2YWxpZGF0ZSBhbnkgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURBVEVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgZmxhZyB0byB2YWxpZGF0ZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJREFURV9NRVRBID0gMTsKKworICAgIC8qKgorICAgICAqIEJpdCBmbGFnIHRvIHZhbGlkYXRlIG1hcHBpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEQVRFX01BUFBJTkcgPSAyOworCisgICAgLyoqCisgICAgICogQml0IGZsYWcgdG8gdmFsaWRhdGUgdW5lbmhhbmNlZCBtZXRhZGF0YSBvbmx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEQVRFX1VORU5IQU5DRUQgPSA0OworCisgICAgLyoqCisgICAgICogQml0IGZsYWcgZm9yIHJ1bnRpbWUgdmFsaWRhdGlvbi4gUmVxdWlyZXMgdGhhdCBhbGwgY2xhc3NlcyBhcmUKKyAgICAgKiBlbmhhbmNlZCwgYW5kIHBlcmZvcm1zIGV4dHJhIGZpZWxkIHJlc29sdXRpb24gc3RlcHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURBVEVfUlVOVElNRSA9IDg7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzW10gRU1QVFlfQ0xBU1NFUyA9IG5ldyBDbGFzc1swXTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE5vblBlcnNpc3RlbnRNZXRhRGF0YVtdIEVNUFRZX05PTl9QRVJTSVNURU5UID0gCisgICAgCW5ldyBOb25QZXJzaXN0ZW50TWV0YURhdGFbMF07CisgICAgcHJvdGVjdGVkIGZpbmFsIENsYXNzTWV0YURhdGFbXSBFTVBUWV9NRVRBUzsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRmllbGRNZXRhRGF0YVtdIEVNUFRZX0ZJRUxEUzsKKyAgICBwcm90ZWN0ZWQgZmluYWwgT3JkZXJbXSBFTVBUWV9PUkRFUlM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChNZXRhRGF0YVJlcG9zaXRvcnkuY2xhc3MpOworCisgICAgLy8gc3lzdGVtIHNlcXVlbmNlCisgICAgcHJpdmF0ZSBTZXF1ZW5jZU1ldGFEYXRhIF9zeXNTZXEgPSBudWxsOworCisgICAgLy8gY2FjaGUgb2YgcGFyc2VkIG1ldGFkYXRhLCBvaWQgY2xhc3MgdG8gY2xhc3MsIGFuZCBpbnRlcmZhY2UgY2xhc3MKKyAgICAvLyB0byBtZXRhZGF0YXMKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfbWV0YXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgTWFwIF9vaWRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgIHByaXZhdGUgZmluYWwgTWFwIF9pbXBscyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfaWZhY2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgIHByaXZhdGUgZmluYWwgTWFwIF9xdWVyaWVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfc2VxcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX2FsaWFzZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX3Bhd2FyZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX25vbk1hcHBlZCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKKyAgICAKKyAgICAvLyBtYXAgb2YgY2xhc3NlcyB0byBsaXN0cyBvZiB0aGVpciBzdWJjbGFzc2VzCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX3N1YnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPcGVuSlBBQ29uZmlndXJhdGlvbiBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTG9nIF9sb2cgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IEludGVyZmFjZUltcGxHZW5lcmF0b3IgX2ltcGxHZW4gPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGFEYXRhRmFjdG9yeSBfZmFjdG9yeSA9IG51bGw7CisKKyAgICBwcml2YXRlIGludCBfcmVzTW9kZSA9IE1PREVfTUVUQSB8IE1PREVfTUFQUElORzsKKyAgICBwcml2YXRlIGludCBfc291cmNlTW9kZSA9IE1PREVfTUVUQSB8IE1PREVfTUFQUElORyB8IE1PREVfUVVFUlk7CisgICAgcHJpdmF0ZSBpbnQgX3ZhbGlkYXRlID0gVkFMSURBVEVfTUVUQSB8IFZBTElEQVRFX1VORU5IQU5DRUQ7CisKKyAgICAvLyB3ZSBidWZmZXIgdXAgYW55IGNsYXNzZXMgdGhhdCByZWdpc3RlciB0aGVtc2VsdmVzIHRvIHByZXZlbnQKKyAgICAvLyByZWVudHJhbmN5IGVycm9ycyBpZiBjbGFzc2VzIHJlZ2lzdGVyIGR1cmluZyBhIGN1cnJlbnQgcGFyc2UgKGNvbW1vbikKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gX3JlZ2lzdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvLyBzZXQgb2YgbWV0YWRhdGFzIHdlJ3JlIGluIHRoZSBwcm9jZXNzIG9mIHJlc29sdmluZworICAgIHByaXZhdGUgZmluYWwgU29ydGVkU2V0IF9yZXNvbHZpbmcgPSBuZXcgVHJlZVNldAorICAgICAgICAobmV3IE1ldGFEYXRhSW5oZXJpdGFuY2VDb21wYXJhdG9yKCkpOworICAgIHByaXZhdGUgZmluYWwgU29ydGVkU2V0IF9tYXBwaW5nID0gbmV3IFRyZWVTZXQKKyAgICAgICAgKG5ldyBNZXRhRGF0YUluaGVyaXRhbmNlQ29tcGFyYXRvcigpKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX2VycnMgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgLy8gc3lzdGVtIGxpc3RlbmVycworICAgIHByaXZhdGUgTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyLkxpc3RlbmVyTGlzdCBfbGlzdGVuZXJzID0KKyAgICAgICAgbmV3IExpZmVjeWNsZUV2ZW50TWFuYWdlci5MaXN0ZW5lckxpc3QoMyk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ29uZmlndXJlIHZpYSB7QGxpbmsgQ29uZmlndXJhYmxlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFSZXBvc2l0b3J5KCkgeworICAgICAgICBFTVBUWV9NRVRBUyA9IG5ld0NsYXNzTWV0YURhdGFBcnJheSgwKTsKKyAgICAgICAgRU1QVFlfRklFTERTID0gbmV3RmllbGRNZXRhRGF0YUFycmF5KDApOworICAgICAgICBFTVBUWV9PUkRFUlMgPSBuZXdPcmRlckFycmF5KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfY29uZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIGxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nIGdldExvZygpIHsKKyAgICAgICAgcmV0dXJuIF9sb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEkvTyB1c2VkIHRvIGxvYWQgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIE1ldGFEYXRhRmFjdG9yeSBnZXRNZXRhRGF0YUZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBfZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSS9PIHVzZWQgdG8gbG9hZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUZhY3RvcnkoTWV0YURhdGFGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgZmFjdG9yeS5zZXRSZXBvc2l0b3J5KHRoaXMpOworICAgICAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhIHZhbGlkYXRpb24gbGV2ZWwuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+VkFMSURBVEVfTUVUQSB8IFZBTElEQVRFX1VORU5IQU5DRUQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGUoKSB7CisgICAgICAgIHJldHVybiBfdmFsaWRhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhIHZhbGlkYXRpb24gbGV2ZWwuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+VkFMSURBVEVfTUVUQSB8IFZBTElEQVRFX1VORU5IQU5DRUQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGludCB2YWxpZGF0ZSkgeworICAgICAgICBfdmFsaWRhdGUgPSB2YWxpZGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YWRhdGEgdmFsaWRhdGlvbiBsZXZlbC4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5WQUxJREFURV9NRVRBIHwgVkFMSURBVEVfTUFQUElORyB8IFZBTElEQVRFX1VORU5IQU5DRUQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGludCB2YWxpZGF0ZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAodmFsaWRhdGUgPT0gVkFMSURBVEVfTk9ORSkKKyAgICAgICAgICAgIF92YWxpZGF0ZSA9IHZhbGlkYXRlOworICAgICAgICBlbHNlIGlmIChvbikKKyAgICAgICAgICAgIF92YWxpZGF0ZSB8PSB2YWxpZGF0ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3ZhbGlkYXRlICY9IH52YWxpZGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YWRhdGEgcmVzb2x1dGlvbiBtb2RlLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPk1PREVfTUVUQSB8IE1PREVfTUFQUElORzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gX3Jlc01vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhIHJlc29sdXRpb24gbW9kZS4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5NT0RFX01FVEEgfCBNT0RFX01BUFBJTkc8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmUoaW50IG1vZGUpIHsKKyAgICAgICAgX3Jlc01vZGUgPSBtb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhZGF0YSByZXNvbHV0aW9uIG1vZGUuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+TU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlKGludCBtb2RlLCBib29sZWFuIG9uKSB7CisgICAgICAgIGlmIChtb2RlID09IE1PREVfTk9ORSkKKyAgICAgICAgICAgIF9yZXNNb2RlID0gbW9kZTsKKyAgICAgICAgZWxzZSBpZiAob24pCisgICAgICAgICAgICBfcmVzTW9kZSB8PSBtb2RlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfcmVzTW9kZSAmPSB+bW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIG1vZGUgZGV0ZXJtaW5pbmcgd2hhdCBtZXRhZGF0YSB0byBsb2FkLiBEZWZhdWx0cyB0bworICAgICAqIDxjb2RlPk1PREVfTUVUQSB8IE1PREVfTUFQUElORyB8IE1PREVfUVVFUlk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zb3VyY2VNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgbW9kZSBkZXRlcm1pbmluZyB3aGF0IG1ldGFkYXRhIHRvIGxvYWQuIERlZmF1bHRzIHRvCisgICAgICogPGNvZGU+TU9ERV9NRVRBIHwgTU9ERV9NQVBQSU5HIHwgTU9ERV9RVUVSWTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBfc291cmNlTW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBtb2RlIGRldGVybWluaW5nIHdoYXQgbWV0YWRhdGEgdG8gbG9hZC4gRGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT5NT0RFX01FVEEgfCBNT0RFX01BUFBJTkcgfCBNT0RFX1FVRVJZPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VNb2RlKGludCBtb2RlLCBib29sZWFuIG9uKSB7CisgICAgICAgIGlmIChtb2RlID09IE1PREVfTk9ORSkKKyAgICAgICAgICAgIF9zb3VyY2VNb2RlID0gbW9kZTsKKyAgICAgICAgZWxzZSBpZiAob24pCisgICAgICAgICAgICBfc291cmNlTW9kZSB8PSBtb2RlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfc291cmNlTW9kZSAmPSB+bW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xzIHRoZSBjbGFzcyB0byByZXRyaWV2ZSBtZXRhZGF0YSBmb3IKKyAgICAgKiBAcGFyYW0gZW52TG9hZGVyIHRoZSBlbnZpcm9ubWVudGFsIGNsYXNzIGxvYWRlciwgaWYgYW55CisgICAgICogQHBhcmFtIG11c3RFeGlzdCBpZiB0cnVlLCB0aHJvd3MgYSB7QGxpbmsgTWV0YURhdGFFeGNlcHRpb259CisgICAgICogaWYgbm8gbWV0YWRhdGEgaXMgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoQ2xhc3MgY2xzLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIsIGJvb2xlYW4gbXVzdEV4aXN0KSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IGdldE1ldGFEYXRhSW50ZXJuYWwoY2xzLCBlbnZMb2FkZXIpOworICAgICAgICBpZiAobWV0YSA9PSBudWxsICYmIG11c3RFeGlzdCkgeworICAgICAgICAgICAgaWYgKGNscyAhPSBudWxsICYmICFQZXJzaXN0ZW5jZUNhcGFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tbWV0YS1ub3RwYyIsIGNscykpLgorICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbChmYWxzZSk7CisKKyAgICAgICAgICAgIFNldCBwY05hbWVzID0gZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhmYWxzZSwgZW52TG9hZGVyKTsKKyAgICAgICAgICAgIGlmIChwY05hbWVzICE9IG51bGwgJiYgcGNOYW1lcy5zaXplKCkgPiAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tbWV0YS10eXBlcyIsCisgICAgICAgICAgICAgICAgICAgIGNscywgcGNOYW1lcykpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLW1ldGEiLCBjbHMpKTsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlKG1ldGEpOworICAgICAgICByZXR1cm4gbWV0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gYWxpYXMgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGlhcyB0aGUgYWxpYXMgdG8gY2xhc3MgdG8gcmV0cmlldmUgbWV0YWRhdGEgZm9yCisgICAgICogQHBhcmFtIGVudkxvYWRlciB0aGUgZW52aXJvbm1lbnRhbCBjbGFzcyBsb2FkZXIsIGlmIGFueQorICAgICAqIEBwYXJhbSBtdXN0RXhpc3QgaWYgdHJ1ZSwgdGhyb3dzIGEge0BsaW5rIE1ldGFEYXRhRXhjZXB0aW9ufQorICAgICAqIGlmIG5vIG1ldGFkYXRhIGlzIGZvdW5kCisgICAgICogQHNlZSBDbGFzc01ldGFEYXRhI2dldFR5cGVBbGlhcworICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKFN0cmluZyBhbGlhcywgQ2xhc3NMb2FkZXIgZW52TG9hZGVyLAorICAgICAgICBib29sZWFuIG11c3RFeGlzdCkgeworICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCAmJiBtdXN0RXhpc3QpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWFsaWFzLW1ldGEiLCBhbGlhcywKKyAgICAgICAgICAgICAgICBfYWxpYXNlcykpOworICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGNoZWNrIGNhY2hlCisgICAgICAgIHByb2Nlc3NSZWdpc3RlcmVkQ2xhc3NlcyhlbnZMb2FkZXIpOworICAgICAgICBMaXN0IGNsYXNzTGlzdCA9IChMaXN0KSBfYWxpYXNlcy5nZXQoYWxpYXMpOworCisgICAgICAgIC8vIG11bHRpcGxlIGNsYXNzZXMgbWF5IGhhdmUgYmVlbiBkZWZpbmVkIHdpdGggdGhlIHNhbWUgYWxpYXM6IHdlCisgICAgICAgIC8vIHdpbGwgZmlsdGVyIGJ5IGNoZWNraW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgbGlzdCBvZiB0aGUKKyAgICAgICAgLy8gcGVyc2lzdGVudCB0eXBlcyBhbmQgZmlsdGVyIGJhc2VkIG9uIHdoaWNoIGNsYXNzZXMgYXJlIGxvYWRhYmxlCisgICAgICAgIC8vIHZpYSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCdzIENsYXNzTG9hZGVyCisgICAgICAgIFNldCBwY05hbWVzID0gZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhmYWxzZSwgZW52TG9hZGVyKTsKKyAgICAgICAgQ2xhc3MgY2xzID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNsYXNzTGlzdCAhPSBudWxsICYmIGkgPCBjbGFzc0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIENsYXNzIGMgPSAoQ2xhc3MpIGNsYXNzTGlzdC5nZXQoaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHJlLWxvYWQgdGhlIGNsYXNzIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGxvYWRlciBzbworICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgY2FuIGhhbmRsZSByZWRlcGxveW1lbnQgb2YgdGhlIHNhbWUgY2xhc3MgbmFtZQorICAgICAgICAgICAgICAgIENsYXNzIG5jID0gQ2xhc3MuZm9yTmFtZShjLmdldE5hbWUoKSwgZmFsc2UsIGVudkxvYWRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHNwZWNpZmllZCBhIGxpc3Qgb2YgcGVyc2lzdGVudCBjbGFzZXMsCisgICAgICAgICAgICAgICAgLy8gYWxzbyBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgY2xhc3MgaXMgaW4gdGhhdCBsaXN0CisgICAgICAgICAgICAgICAgaWYgKHBjTmFtZXMgPT0gbnVsbCB8fCBwY05hbWVzLnNpemUoKSA9PSAwIAorICAgICAgICAgICAgICAgICAgICB8fCBwY05hbWVzLmNvbnRhaW5zKG5jLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xzID0gbmM7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2xhc3NMaXN0LmNvbnRhaW5zKGNscykpCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKGNscyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIGNsYXNzIGlzIG5vdCBsb2FkYWJsZSBieQorICAgICAgICAgICAgICAgIC8vIHRoZSBlbnZpcm9ubWVudCBjbGFzcyBsb2FkZXIsIHNvIGl0IHdhcyBwcm9iYWJseQorICAgICAgICAgICAgICAgIC8vIGxpc3RlZCBlbHNld2hlcmU7IGFsc28gaWdub3JlIGxpbmthZ2UgZmFpbHVyZXMgYW5kCisgICAgICAgICAgICAgICAgLy8gb3RoZXIgY2xhc3MgbG9hZGluZyBwcm9ibGVtcworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRNZXRhRGF0YShjbHMsIGVudkxvYWRlciwgbXVzdEV4aXN0KTsKKworICAgICAgICAvLyBtYXliZSB0aGlzIGlzIHNvbWUgdHlwZSB3ZSd2ZSBzZWVuIGJ1dCBqdXN0IGlzbid0IHZhbGlkCisgICAgICAgIGlmIChfYWxpYXNlcy5jb250YWluc0tleShhbGlhcykpIHsKKyAgICAgICAgICAgIGlmIChtdXN0RXhpc3QpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1hbGlhcy1tZXRhIiwgYWxpYXMsCisgICAgICAgICAgICAgICAgICAgIF9hbGlhc2VzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVjb3JkIHRoYXQgdGhpcyBpcyBhbiBpbnZhbGlkIHR5cGUKKyAgICAgICAgX2FsaWFzZXMucHV0KGFsaWFzLCBudWxsKTsKKworICAgICAgICBpZiAoIW11c3RFeGlzdCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWFsaWFzLW1ldGEiLCBhbGlhcywgX2FsaWFzZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gZ2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGNsYXNzLCB3aXRob3V0CisgICAgICogcmVzb2x2aW5nIGl0LgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YUludGVybmFsKENsYXNzIGNscywKKyAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGNoZWNrIGNhY2hlIGZvciBleGlzdGluZyBtZXRhZGF0YSwgb3IgZ2l2ZSB1cCBpZiBubyBtZXRhZGF0YSBhbmQKKyAgICAgICAgLy8gb3VyIGxpc3Qgb2YgY29uZmlndXJlZCBwZXJzaXN0ZW50IHR5cGVzIGRvZXNuJ3QgaW5jbHVkZSB0aGUgY2xhc3MKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gKENsYXNzTWV0YURhdGEpIF9tZXRhcy5nZXQoY2xzKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCAmJiAoKG1ldGEuZ2V0U291cmNlTW9kZSgpICYgTU9ERV9NRVRBKSAhPSAwCisgICAgICAgICAgICB8fCAoX3NvdXJjZU1vZGUgJiBNT0RFX01FVEEpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIG1ldGE7CisKKyAgICAgICAgLy8gaWYgcnVudGltZSwgY3V0IG9mZiBzZWFyY2ggaWYgbm90IGluIHBjIGxpc3QuICB3ZSBkb24ndCBkbyB0aGlzIGF0CisgICAgICAgIC8vIGRldiB0aW1lIHNvIHRoYXQgdXNlciBjYW4gbWFuaXB1bGF0ZSBwZXJzaXN0ZW50IGNsYXNzZXMgaGUncyB3cml0aW5nCisgICAgICAgIC8vIGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUgbGlzdAorICAgICAgICBpZiAoKF92YWxpZGF0ZSAmIFZBTElEQVRFX1JVTlRJTUUpICE9IDApIHsKKyAgICAgICAgICAgIFNldCBwY05hbWVzID0gZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhmYWxzZSwgZW52TG9hZGVyKTsKKyAgICAgICAgICAgIGlmIChwY05hbWVzICE9IG51bGwgJiYgIXBjTmFtZXMuY29udGFpbnMoY2xzLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgbWF5YmUgd2Uga25vdyB0aGlzIGNsYXNzIGhhcyBubyBtZXRhZGF0YQorICAgICAgICAgICAgaWYgKF9tZXRhcy5jb250YWluc0tleShjbHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBpc24ndCBhbiBvYnZpb3VzbHkgYmFkIGNsYXNzCisgICAgICAgICAgICBpZiAoY2xzLmlzUHJpbWl0aXZlKCkgfHwgY2xzLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLiIpCisgICAgICAgICAgICAgICAgfHwgY2xzID09IFBlcnNpc3RlbmNlQ2FwYWJsZS5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgLy8gZGVzaWduZWQgdG8gZ2V0IGFyb3VuZCBqaWtlcyAxLjE3IC8gSkRLMS41IGlzc3VlIHdoZXJlIHN0YXRpYworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXJzIGFyZSBub3QgaW52b2tlZCB3aGVuIGEgY2xhc3MgaXMgcmVmZXJlbmNlZCwgc28gdGhlCisgICAgICAgICAgICAvLyBjbGFzcyBuZXZlciByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIHN5c3RlbQorICAgICAgICAgICAgaWYgKChfdmFsaWRhdGUgJiBWQUxJREFURV9SVU5USU1FKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjbHMuZ2V0TmFtZSgpLCB0cnVlLCBjbHMuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3QgaW4gY2FjaGU6IGxvYWQgbWV0YWRhdGEgb3IgbWFwcGluZ3MgZGVwZW5kaW5nIG9uIHNvdXJjZSBtb2RlLgorICAgICAgICAvLyBsb2FkaW5nIG1ldGFkYXRhIG1pZ2h0IGFsc28gbG9hZCBtYXBwaW5ncywgYnV0IGRvZXNuJ3QgaGF2ZSB0bworICAgICAgICBpbnQgbW9kZSA9IDA7CisgICAgICAgIGlmICgoX3NvdXJjZU1vZGUgJiBNT0RFX01FVEEpICE9IDApCisgICAgICAgICAgICBtb2RlID0gX3NvdXJjZU1vZGUgJiB+TU9ERV9NQVBQSU5HOworICAgICAgICBlbHNlIGlmICgoX3NvdXJjZU1vZGUgJiBNT0RFX01BUFBJTkcpID09IDApCisgICAgICAgICAgICBtb2RlID0gX3NvdXJjZU1vZGU7CisgICAgICAgIGlmIChtb2RlICE9IE1PREVfTk9ORSkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJsb2FkLWNscyIsIGNscywgdG9Nb2RlU3RyaW5nKG1vZGUpKSk7CisgICAgICAgICAgICBfZmFjdG9yeS5sb2FkKGNscywgbW9kZSwgZW52TG9hZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGNhY2hlIGFnYWluCisgICAgICAgIGlmIChtZXRhID09IG51bGwpCisgICAgICAgICAgICBtZXRhID0gKENsYXNzTWV0YURhdGEpIF9tZXRhcy5nZXQoY2xzKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCAmJiAoKG1ldGEuZ2V0U291cmNlTW9kZSgpICYgTU9ERV9NRVRBKSAhPSAwCisgICAgICAgICAgICB8fCAoX3NvdXJjZU1vZGUgJiBNT0RFX01FVEEpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIG1ldGE7CisKKyAgICAgICAgLy8gcmVjb3JkIHRoYXQgdGhpcyBjbGFzcyBoYXMgbm8gbWV0YWRhdGE7IGNoZWNraW5nIGZvciB0aGlzIGxhdGVyCisgICAgICAgIC8vIHNwZWVkcyB0aGluZ3MgdXAgaW4gZW52aXJvbm1lbnRzIHdpdGggc2xvdyBjbGFzcyBsb2FkaW5nCisgICAgICAgIC8vIGxpa2UgYXBwc2VydmVycworICAgICAgICBpZiAobWV0YSAhPSBudWxsKQorICAgICAgICAgICAgcmVtb3ZlTWV0YURhdGEobWV0YSk7CisgICAgICAgIF9tZXRhcy5wdXQoY2xzLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtb2RlIGZsYWdzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b01vZGVTdHJpbmcoaW50IG1vZGUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMzEpOworICAgICAgICBpZiAoKG1vZGUgJiBNT0RFX01FVEEpICE9IDApCisgICAgICAgICAgICBidWYuYXBwZW5kKCJbTUVUQV0iKTsKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9RVUVSWSkgIT0gMCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIltRVUVSWV0iKTsKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiW01BUFBJTkddIik7CisgICAgICAgIGlmICgobW9kZSAmIE1PREVfTUFQUElOR19JTklUKSAhPSAwKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiW01BUFBJTkdfSU5JVF0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgbWV0YWRhdGEgZm9yIG1hcHBpbmcgcmVzb2x1dGlvbi4gVGhpcyBtZXRob2QgbWlnaHQgbWFwIHBhcnRzCisgICAgICogb2YgdGhlIG1ldGFkYXRhIHRoYXQgZG9uJ3QgcmVseSBvbiBvdGhlciBjbGFzc2VzIGJlaW5nIG1hcHBlZCwgYnV0IHRoYXQKKyAgICAgKiBvdGhlciBjbGFzc2VzIG1pZ2h0IHJlbHkgb24gZHVyaW5nIHRoZWlyIG93biBtYXBwaW5nIChmb3IgZXhhbXBsZSwKKyAgICAgKiBwcmltYXJ5IGtleSBmaWVsZHMpLiBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBvbmx5IGNhbGxzCisgICAgICoge0BsaW5rIENsYXNzTWV0YURhdGEjZGVmaW5lU3VwZXJjbGFzc0ZpZWxkc30uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZU1hcHBpbmcoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIG1ldGEuZGVmaW5lU3VwZXJjbGFzc0ZpZWxkcyhmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGUgZ2l2ZW4gbWV0YWRhdGEgaWYgbmVlZGVkLiBUaGVyZSBhcmUgdGhyZWUgZ29hbHM6CisgICAgICogPG9sPgorICAgICAqIDxsaT5NYWtlIHN1cmUgbm8gdW5yZXNvbHZlZCBtZXRhZGF0YSBnZXRzIGJhY2sgdG8gdGhlIGNsaWVudC48L2xpPgorICAgICAqIDxsaT5Bdm9pZCBpbmZpbml0ZSByZWVudHJhbnQgY2FsbHMgZm9yIG11dHVhbGx5LWRlcGVuZGVudCBtZXRhZGF0YXMgYnkKKyAgICAgKiBhbGxvd2luZyB1bnJlc29sdmVkIG1ldGFkYXRhIHRvIGJlIHJldHVybmVkIHRvIG90aGVyIG1ldGFkYXRhcy48L2xpPgorICAgICAqIDxsaT5BbHdheXMgbWFrZSBzdXJlIHRoZSBzdXBlcmNsYXNzIG1ldGFkYXRhIGlzIHJlc29sdmVkIGJlZm9yZSB0aGUKKyAgICAgKiBzdWJjbGFzcyBtZXRhZGF0YSBzbyB0aGF0IHRoZSBzdWJjbGFzcyBjYW4gYWNjZXNzIHRoZSBzdXBlcidzIGxpc3QKKyAgICAgKiBvZiBmaWVsZHMuPC9saT4KKyAgICAgKiA8L29sPiBOb3RlIHRoYXQgdGhlIGNvZGUgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBzeW5jaHJvbml6ZWQsIHNvIHRoaXMKKyAgICAgKiBtZXRob2QgZG9lc24ndCBoYXZlIHRvIGJlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICAvLyByZXR1cm4gYW55dGhpbmcgdGhhdCBoYXMgaXRzIG1ldGFkYXRhIHJlc29sdmVkLCBiZWNhdXNlIHRoYXQgbWVhbnMKKyAgICAgICAgLy8gaXQgaXMgZWl0aGVyIGZ1bGx5IHJlc29sdmVkIG9yIG11c3QgYXQgbGVhc3QgYmUgaW4gdGhlIHByb2Nlc3Mgb2YKKyAgICAgICAgLy8gcmVzb2x2aW5nIG1hcHBpbmcsIGV0YyBzaW5jZSB3ZSBkbyB0aGF0IHJpZ2h0IGFmdGVyIG1ldGEgcmVzb2x2ZQorICAgICAgICBpZiAobWV0YSA9PSBudWxsIHx8IF9yZXNNb2RlID09IE1PREVfTk9ORQorICAgICAgICAgICAgfHwgKG1ldGEuZ2V0UmVzb2x2ZSgpICYgTU9ERV9NRVRBKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHJlc29sdmUgbWV0YWRhdGEKKyAgICAgICAgTGlzdCByZXNvbHZlZCA9IHJlc29sdmVNZXRhKG1ldGEpOworICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBsb2FkIG1hcHBpbmcgZGF0YQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc29sdmVkLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgbG9hZE1hcHBpbmcoKENsYXNzTWV0YURhdGEpIHJlc29sdmVkLmdldChpKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb2x2ZWQuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBwcmVNYXBwaW5nKChDbGFzc01ldGFEYXRhKSByZXNvbHZlZC5nZXQoaSkpOworCisgICAgICAgIC8vIHJlc29sdmUgbWFwcGluZ3MKKyAgICAgICAgYm9vbGVhbiBlcnIgPSB0cnVlOworICAgICAgICBpZiAoKF9yZXNNb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvbHZlZC5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBlcnIgJj0gcmVzb2x2ZU1hcHBpbmcoKENsYXNzTWV0YURhdGEpIHJlc29sdmVkLmdldChpKSk7CisKKyAgICAgICAgLy8gdGhyb3cgZXJyb3JzIGVuY291bnRlcmVkCisgICAgICAgIGlmIChlcnIgJiYgIV9lcnJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiByZTsKKyAgICAgICAgICAgIGlmIChfZXJycy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICByZSA9IChSdW50aW1lRXhjZXB0aW9uKSBfZXJycy5nZXQoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmUgPSBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoInJlc29sdmUtZXJycyIpKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0TmVzdGVkVGhyb3dhYmxlcygoVGhyb3dhYmxlW10pIF9lcnJzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgRXhjZXB0aW9uW19lcnJzLnNpemUoKV0pKTsKKyAgICAgICAgICAgIF9lcnJzLmNsZWFyKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbWV0YWRhdGEgbW9kZSwgcmV0dXJuaW5nIGxpc3Qgb2YgcHJvY2Vzc2VkIG1ldGFkYWRhdGFzLCBvciBudWxsCisgICAgICogaWYgd2UncmUgc3RpbGwgaW4gdGhlIHByb2Nlc3Mgb2YgcmVzb2x2aW5nIG90aGVyIG1ldGFkYXRhcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgcmVzb2x2ZU1ldGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGlmIChtZXRhLmdldFBDU3VwZXJjbGFzcygpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHNldCBzdXBlcmNsYXNzCisgICAgICAgICAgICBDbGFzcyBzdXAgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIHN1cE1ldGE7CisgICAgICAgICAgICB3aGlsZSAoc3VwICE9IG51bGwgJiYgc3VwICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIHN1cE1ldGEgPSBnZXRNZXRhRGF0YShzdXAsIG1ldGEuZ2V0RW52Q2xhc3NMb2FkZXIoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChzdXBNZXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRQQ1N1cGVyY2xhc3Moc3VwKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YShzdXBNZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN1cCA9IHN1cC5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWV0YS5nZXREZXNjcmliZWRUeXBlKCkuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIENsYXNzW10gc3VwcyA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwTWV0YSA9IGdldE1ldGFEYXRhKHN1cHNbaV0sIG1ldGEuZ2V0RW52Q2xhc3NMb2FkZXIoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXBNZXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0UENTdXBlcmNsYXNzKHN1cCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldFBDU3VwZXJjbGFzc01ldGFEYXRhKHN1cE1ldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImFzc2lnbmVkLXN1cCIsIG1ldGEsCisgICAgICAgICAgICAgICAgICAgIG1ldGEuZ2V0UENTdXBlcmNsYXNzKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc29sdmUgcmVsYXRpb24gcHJpbWFyeSBrZXkgZmllbGRzIGZvciBtYXBwaW5nIGRlcGVuZGVuY2llcworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGZtZHNbaV0uaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEoZm1kc1tpXS5nZXREZWNsYXJlZFR5cGUoKSwgCisgICAgICAgICAgICAgICAgICAgIG1ldGEuZ2V0RW52Q2xhc3NMb2FkZXIoKSwgZmFsc2UpOworCisgICAgICAgIC8vIHJlc29sdmUgbWV0YWRhdGE7IGlmIHdlJ3JlIG5vdCBpbiB0aGUgcHJvY2VzcyBvZiByZXNvbHZpbmcKKyAgICAgICAgLy8gb3RoZXJzLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzZXQgb2YgaW50ZXJyZWxhdGVkIG1ldGFzIHRoYXQKKyAgICAgICAgLy8gcmVzb2x2ZWQKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NCdWZmZXIobWV0YSwgX3Jlc29sdmluZywgTU9ERV9NRVRBKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZE1hcHBpbmcoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGlmICgobWV0YS5nZXRSZXNvbHZlKCkgJiBNT0RFX01BUFBJTkcpICE9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gbG9hZCBtYXBwaW5nIGluZm9ybWF0aW9uCisgICAgICAgIGlmICgobWV0YS5nZXRTb3VyY2VNb2RlKCkgJiBNT0RFX01BUFBJTkcpID09IDAKKyAgICAgICAgICAgICYmIChfc291cmNlTW9kZSAmIE1PREVfTUFQUElORykgIT0gMCkgeworICAgICAgICAgICAgLy8gZW1iZWRkZWQtb25seSBtZXRhZGF0YSBkb2Vzbid0IGhhdmUgbWFwcGluZywgc28gYWx3YXlzIGxvYWRlZAorICAgICAgICAgICAgaWYgKG1ldGEuaXNFbWJlZGRlZE9ubHkoKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoTU9ERV9NQVBQSU5HLCB0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGxvYWQgbWFwcGluZyBkYXRhCisgICAgICAgICAgICAgICAgaW50IG1vZGUgPSBfc291cmNlTW9kZSAmIH5NT0RFX01FVEE7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgibG9hZC1tYXBwaW5nIiwgbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvTW9kZVN0cmluZyhtb2RlKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIF9mYWN0b3J5LmxvYWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLmdldEVudkNsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTWV0YURhdGEobWV0YSk7CisgICAgICAgICAgICAgICAgICAgIF9lcnJzLmFkZChyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlLW1hcHBpbmcgcHJlcGFyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZU1hcHBpbmcoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGlmICgobWV0YS5nZXRSZXNvbHZlKCkgJiBNT0RFX01BUFBJTkcpICE9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gcHJlcGFyZSBtYXBwaW5ncyBmb3IgcmVzb2x2ZTsgaWYgbm90IHJlc29sdmluZyBtYXBwaW5ncywgdGhlbgorICAgICAgICAvLyBtYWtlIHN1cmUgYW55IHN1cGVyY2xhc3MgZmllbGRzIGRlZmluZWQgaW4gbWV0YWRhdGEgYXJlIHJlc29sdmVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoKF9yZXNNb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicHJlcC1tYXBwaW5nIiwgbWV0YSkpOworICAgICAgICAgICAgICAgIHByZXBhcmVNYXBwaW5nKG1ldGEpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWV0YS5kZWZpbmVTdXBlcmNsYXNzRmllbGRzKGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVtb3ZlTWV0YURhdGEobWV0YSk7CisgICAgICAgICAgICBfZXJycy5hZGQocmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBhbmQgaW5pdGlhbGl6ZSBtYXBwaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBmYWxzZSBpZiB3ZSdyZSBzdGlsbCBpbiB0aGUgcHJvY2VzcyBvZiByZXNvbHZpbmcgbWFwcGluZ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZU1hcHBpbmcoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIExpc3QgbWFwcGVkID0gcHJvY2Vzc0J1ZmZlcihtZXRhLCBfbWFwcGluZywgTU9ERV9NQVBQSU5HKTsKKyAgICAgICAgaWYgKG1hcHBlZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIGluaXRpYWxpemUgbWFwcGluZyBmb3IgcnVudGltZSB1c2UKKyAgICAgICAgaWYgKChfcmVzTW9kZSAmIE1PREVfTUFQUElOR19JTklUKSAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1ldGEgPSAoQ2xhc3NNZXRhRGF0YSkgbWFwcGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLnJlc29sdmUoTU9ERV9NQVBQSU5HX0lOSVQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTWV0YURhdGEobWV0YSk7CisgICAgICAgICAgICAgICAgICAgIF9lcnJzLmFkZChyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIG1ldGFkYXRhIGFuZCB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IHByb2Nlc3NCdWZmZXIoQ2xhc3NNZXRhRGF0YSBtZXRhLCBTb3J0ZWRTZXQgYnVmZmVyLCBpbnQgbW9kZSkgeworICAgICAgICAvLyBpZiB3ZSdyZSBhbHJlYWR5IHByb2Nlc3NpbmcgYSBtZXRhZGF0YSwganVzdCBidWZmZXIgdGhpcyBvbmU7IHdoZW4KKyAgICAgICAgLy8gdGhlIGluaXRpYWwgbWV0YWRhdGEgZmluaXNoZXMgcHJvY2Vzc2luZywgd2UgdHJhdmVyc2UgdGhlIGJ1ZmZlcgorICAgICAgICAvLyBhbmQgcHJvY2VzcyBhbGwgdGhlIG90aGVycyB0aGF0IHdlcmUgaW50cm9kdWNlZCBkdXJpbmcgcmVlbnRyYW50CisgICAgICAgIC8vIGNhbGxzCisgICAgICAgIGlmICghYnVmZmVyLmFkZChtZXRhKSB8fCBidWZmZXIuc2l6ZSgpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBjb250aW51YWxseSBwb3AgYSBtZXRhZGF0YSBhbmQgcHJvY2VzcyBpdCB1bnRpbCB3ZSBydW4gb3V0OyBub3RlCisgICAgICAgIC8vIHRoYXQgZWFjaCBwcm9jZXNzaW5nIGNhbGwgbWlnaHQgcGxhY2UgbW9yZSBtZXRhcyBpbiB0aGUgYnVmZmVyIGFzCisgICAgICAgIC8vIG9uZSBjbGFzcyB0cmllcyB0byBhY2Nlc3MgbWV0YWRhdGEgZm9yIGFub3RoZXI7IGFsc28gbm90ZSB0aGF0IHRoZQorICAgICAgICAvLyBidWZmZXIgb3JkZXJzIGl0c2VsZiBmcm9tIGxlYXN0IHRvIG1vc3QgZGVyaXZlZAorICAgICAgICBDbGFzc01ldGFEYXRhIGJ1ZmZlcmVkOworICAgICAgICBMaXN0IHByb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoNSk7CisgICAgICAgIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYnVmZmVyZWQgPSAoQ2xhc3NNZXRhRGF0YSkgYnVmZmVyLmZpcnN0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkLnJlc29sdmUobW9kZSk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZChidWZmZXJlZCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlbW92ZShidWZmZXJlZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgX2VycnMuYWRkKHJlKTsKKworICAgICAgICAgICAgICAgIC8vIGFueSBleGNlcHRpb24gZHVyaW5nIHJlc29sdXRpb24gb2Ygb25lIHR5cGUgbWVhbnMgd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAvLyByZXNvbHZlIGFueSBvZiB0aGUgcmVsYXRlZCB0eXBlcywgc28gY2xlYXIgYnVmZmVyLiAgdGhpcyBhbHNvCisgICAgICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IGlmIHR3byB0eXBlcyByZWxhdGUgdG8gZWFjaCBvdGhlciBhbmQgb25lCisgICAgICAgICAgICAgICAgLy8gZGllcywgd2UgZG9uJ3QgZ2V0IGludG8gaW5maW5pdGUgY3ljbGVzCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBidWZmZXIuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YSA9IChDbGFzc01ldGFEYXRhKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXRhRGF0YShtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgIT0gYnVmZmVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJzLmFkZChuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInByZXYtZXJycyIsIG1ldGEsIGJ1ZmZlcmVkKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9jZXNzZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB0aGUgbWV0YWRhdGEgaW5zdGFuY2VzIGN1cnJlbnRseSBpbiB0aGUgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENsYXNzTWV0YURhdGFbXSBnZXRNZXRhRGF0YXMoKSB7CisgICAgICAgIC8vIHByZXZlbnQgY29uY3VycmVudCBtb2QgZXJyb3JzIHdoZW4gcmVzb2x2aW5nIG9uZSBtZXRhZGF0YQorICAgICAgICAvLyBpbnRyb2R1Y2VzIG90aGVycworICAgICAgICBDbGFzc01ldGFEYXRhW10gbWV0YXMgPSAoQ2xhc3NNZXRhRGF0YVtdKSBfbWV0YXMudmFsdWVzKCkuCisgICAgICAgICAgICB0b0FycmF5KG5ldyBDbGFzc01ldGFEYXRhW19tZXRhcy5zaXplKCldKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChtZXRhc1tpXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhKG1ldGFzW2ldLmdldERlc2NyaWJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgbWV0YXNbaV0uZ2V0RW52Q2xhc3NMb2FkZXIoKSwgdHJ1ZSk7CisKKyAgICAgICAgTGlzdCByZXNvbHZlZCA9IG5ldyBBcnJheUxpc3QoX21ldGFzLnNpemUoKSk7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfbWV0YXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIG1ldGEgPSAoQ2xhc3NNZXRhRGF0YSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzb2x2ZWQuYWRkKG1ldGEpOworICAgICAgICB9CisgICAgICAgIG1ldGFzID0gKENsYXNzTWV0YURhdGFbXSkgcmVzb2x2ZWQudG9BcnJheQorICAgICAgICAgICAgKG5ld0NsYXNzTWV0YURhdGFBcnJheShyZXNvbHZlZC5zaXplKCkpKTsKKyAgICAgICAgQXJyYXlzLnNvcnQobWV0YXMpOworICAgICAgICByZXR1cm4gbWV0YXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBjbGFzcywgd2l0aG91dCBhbnkgcmVzb2x1dGlvbi4KKyAgICAgKiBSZXR1cm4gbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldENhY2hlZE1ldGFEYXRhKENsYXNzIGNscykgeworICAgICAgICByZXR1cm4gKENsYXNzTWV0YURhdGEpIF9tZXRhcy5nZXQoY2xzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IG1ldGFkYXRhLCBwb3B1bGF0ZSBpdCB3aXRoIGRlZmF1bHQgaW5mb3JtYXRpb24sIGFkZCBpdCB0bworICAgICAqIHRoZSByZXBvc2l0b3J5LCBhbmQgcmV0dXJuIGl0LiBVc2UgdGhlIGRlZmF1bHQgYWNjZXNzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgYWRkTWV0YURhdGEoQ2xhc3MgY2xzKSB7CisgICAgICAgIHJldHVybiBhZGRNZXRhRGF0YShjbHMsIENsYXNzTWV0YURhdGEuQUNDRVNTX1VOS05PV04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtZXRhZGF0YSwgcG9wdWxhdGUgaXQgd2l0aCBkZWZhdWx0IGluZm9ybWF0aW9uLCBhZGQgaXQgdG8KKyAgICAgKiB0aGUgcmVwb3NpdG9yeSwgYW5kIHJldHVybiBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIGFjY2VzcyB0eXBlIHRvIHVzZSBpbiBwb3B1bGF0aW5nIG1ldGFkYXRhCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgYWRkTWV0YURhdGEoQ2xhc3MgY2xzLCBpbnQgYWNjZXNzKSB7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCB8fCBjbHMuaXNQcmltaXRpdmUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IG5ld0NsYXNzTWV0YURhdGEoY2xzKTsKKyAgICAgICAgX2ZhY3RvcnkuZ2V0RGVmYXVsdHMoKS5wb3B1bGF0ZShtZXRhLCBhY2Nlc3MpOworCisgICAgICAgIC8vIHN5bmNocm9uaXplIG9uIHRoaXMgcmF0aGVyIHRoYW4gdGhlIG1hcCwgYmVjYXVzZSBhbGwgb3RoZXIgbWV0aG9kcworICAgICAgICAvLyB0aGF0IGFjY2VzcyBfbWV0YXMgYXJlIHN5bmNocm9uaXplZCBvbiB0aGlzCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKF9wYXdhcmVzLmNvbnRhaW5zS2V5KGNscykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYy1hbmQtYXdhcmUiLCBjbHMpKTsKKyAgICAgICAgICAgIF9tZXRhcy5wdXQoY2xzLCBtZXRhKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0YTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsYXNzIG1ldGFkYXRhIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIG5ld0NsYXNzTWV0YURhdGEoQ2xhc3MgdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzTWV0YURhdGEodHlwZSwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGFycmF5IG9mIHRoZSBwcm9wZXIgY2xhc3MgbWV0YWRhdGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTWV0YURhdGFbXSBuZXdDbGFzc01ldGFEYXRhQXJyYXkoaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzTWV0YURhdGFbbGVuZ3RoXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmllbGQgbWV0YWRhdGEgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpZWxkTWV0YURhdGEgbmV3RmllbGRNZXRhRGF0YShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBvd25lcikgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkTWV0YURhdGEobmFtZSwgdHlwZSwgb3duZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBhcnJheSBvZiB0aGUgcHJvcGVyIGZpZWxkIG1ldGFkYXRhIHN1YmNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWVsZE1ldGFEYXRhW10gbmV3RmllbGRNZXRhRGF0YUFycmF5KGludCBsZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZE1ldGFEYXRhW2xlbmd0aF07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGVtYmVkZGVkIGNsYXNzIG1ldGFkYXRhIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc01ldGFEYXRhIG5ld0VtYmVkZGVkQ2xhc3NNZXRhRGF0YShWYWx1ZU1ldGFEYXRhIG93bmVyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NNZXRhRGF0YShvd25lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHZhbHVlIG1ldGFkYXRhIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBWYWx1ZU1ldGFEYXRhIG5ld1ZhbHVlTWV0YURhdGEoRmllbGRNZXRhRGF0YSBvd25lcikgeworICAgICAgICByZXR1cm4gbmV3IFZhbHVlTWV0YURhdGFJbXBsKG93bmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4ge0BsaW5rIE9yZGVyfSBmb3IgdGhlIGdpdmVuIGZpZWxkIGFuZCBkZWNsYXJhdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNuZXdSZWxhdGVkRmllbGRPcmRlcn0gYW5kCisgICAgICoge0BsaW5rICNuZXdWYWx1ZUZpZWxkT3JkZXJ9IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9yZGVyIG5ld09yZGVyKEZpZWxkTWV0YURhdGEgb3duZXIsIFN0cmluZyBuYW1lLCBib29sZWFuIGFzYykgeworICAgICAgICAvLyBwYXRocyBjYW4gc3RhcnQgd2l0aCAob3IgZXF1YWwpICcjZWxlbWVudCcKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChPcmRlci5FTEVNRU5UKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhPcmRlci5FTEVNRU5ULmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZU9yZGVyKG93bmVyLCBhc2MpOworCisgICAgICAgIC8vIG5leHQgdG9rZW4gc2hvdWxkIGJlICcuJworICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gJy4nKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworCisgICAgICAgIC8vIHJlbGF0ZWQgZmllbGQKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gb3duZXIuZ2V0RWxlbWVudCgpLmdldFR5cGVNZXRhRGF0YSgpOworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub25wYy1maWVsZC1vcmRlcmFibGUiLAorICAgICAgICAgICAgICAgIG93bmVyLCBuYW1lKSk7CisgICAgICAgIEZpZWxkTWV0YURhdGEgcmVsID0gbWV0YS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgaWYgKHJlbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZmllbGQtb3JkZXJhYmxlIiwKKyAgICAgICAgICAgICAgICBvd25lciwgbmFtZSkpOworICAgICAgICByZXR1cm4gbmV3UmVsYXRlZEZpZWxkT3JkZXIob3duZXIsIHJlbCwgYXNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlciBieSB0aGUgZmllbGQgdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9yZGVyIG5ld1ZhbHVlT3JkZXIoRmllbGRNZXRhRGF0YSBvd25lciwgYm9vbGVhbiBhc2MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbk1lbW9yeVZhbHVlT3JkZXIoYXNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlciBieSBhIGZpZWxkIG9mIHRoZSByZWxhdGVkIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9yZGVyIG5ld1JlbGF0ZWRGaWVsZE9yZGVyKEZpZWxkTWV0YURhdGEgb3duZXIsCisgICAgICAgIEZpZWxkTWV0YURhdGEgcmVsLCBib29sZWFuIGFzYykgeworICAgICAgICByZXR1cm4gbmV3IEluTWVtb3J5UmVsYXRlZEZpZWxkT3JkZXIocmVsLCBhc2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBhcnJheSBvZiBvcmRlcnMgb2YgdGhlIGdpdmVuIHNpemUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9yZGVyW10gbmV3T3JkZXJBcnJheShpbnQgc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IE9yZGVyW3NpemVdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIG1ldGFkYXRhIGluc3RhbmNlIGZyb20gdGhlIHJlcG9zaXRvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoaXMgcmVwb3NpdG9yeQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVtb3ZlTWV0YURhdGEobWV0YS5nZXREZXNjcmliZWRUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIG1ldGFkYXRhIGluc3RhbmNlIGZyb20gdGhlIHJlcG9zaXRvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoaXMgcmVwb3NpdG9yeQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVNZXRhRGF0YShDbGFzcyBjbHMpIHsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX21ldGFzLnJlbW92ZShjbHMpICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzIGltcGwgPSAoQ2xhc3MpIF9pZmFjZXMucmVtb3ZlKGNscyk7CisgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9tZXRhcy5yZW1vdmUoaW1wbCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBtZXRhZGF0YSBhcyBkZWNsYXJlZCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgdm9pZCBhZGREZWNsYXJlZEludGVyZmFjZUltcGwoQ2xhc3NNZXRhRGF0YSBtZXRhLCBDbGFzcyBpZmFjZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKF9pbXBscykgeworICAgICAgICAgICAgQ29sbGVjdGlvbiB2YWxzID0gKENvbGxlY3Rpb24pIF9pbXBscy5nZXQoaWZhY2UpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHN1cGVyY2xhc3MgYWxyZWFkeSBkZWNsYXJlcyB0byBhdm9pZCBkdXBzCisgICAgICAgICAgICBpZiAodmFscyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBtZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgZm9yICg7IHN1cCAhPSBudWxsOyBzdXAgPSBzdXAuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHMuY29udGFpbnMoc3VwLmdldERlc2NyaWJlZFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRUb0NvbGxlY3Rpb24oX2ltcGxzLCBpZmFjZSwgbWV0YS5nZXREZXNjcmliZWRUeXBlKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnaXZlbiBtYW5hZ2VkIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbnRlcmZhY2VJbXBsKENsYXNzTWV0YURhdGEgbWV0YSwgQ2xhc3MgaW1wbCkgeworICAgICAgICBpZiAoIW1ldGEuaXNNYW5hZ2VkSW50ZXJmYWNlKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1tYW5hZ2VkLWludGVyZmFjZSIsIAorICAgICAgICAgICAgICAgIG1ldGEsIGltcGwpKTsKKyAgICAgICAgX2lmYWNlcy5wdXQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksIGltcGwpOworICAgICAgICBfbWV0YXMucHV0KGltcGwsIG1ldGEpOworICAgICAgICBhZGREZWNsYXJlZEludGVyZmFjZUltcGwobWV0YSwgbWV0YS5nZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICBDbGFzc01ldGFEYXRhIHN1cCA9IG1ldGEuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgd2hpbGUgKHN1cCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyByZWNvcmQgc3VwZXJjbGFzcyBpbnRlcmZhY2UgaW5mbyB3aGlsZSB3ZSBjYW4gYXMgd2VsbCBhcyB3ZQorICAgICAgICAgICAgLy8gd2lsbCBvbmx5IHJlZ2lzdGVyIGNvbmNyZXRlIHN1cGVyY2xhc3MgaW4gUENSZWdpc3RyeQorICAgICAgICAgICAgc3VwLmNsZWFyU3ViY2xhc3NDYWNoZSgpOworICAgICAgICAgICAgYWRkVG9Db2xsZWN0aW9uKF9zdWJzLCBzdXAuZ2V0RGVzY3JpYmVkVHlwZSgpLCBpbXBsLCB0cnVlKTsKKyAgICAgICAgICAgIHN1cCA9IChDbGFzc01ldGFEYXRhKSBzdXAuZ2V0UENTdXBlcmNsYXNzTWV0YURhdGEoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzeW5jaHJvbml6ZWQgSW50ZXJmYWNlSW1wbEdlbmVyYXRvciBnZXRJbXBsR2VuZXJhdG9yKCkgeworICAgICAgICBpZiAoX2ltcGxHZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIF9pbXBsR2VuID0gbmV3IEludGVyZmFjZUltcGxHZW5lcmF0b3IodGhpcyk7CisgICAgICAgIHJldHVybiBfaW1wbEdlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxlYXN0LWRlcml2ZWQgY2xhc3MgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBhcHBsaWNhdGlvbgorICAgICAqIGlkZW50aXR5IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvaWQgdGhlIG9pZCB0byBnZXQgdGhlIG1ldGFkYXRhIGZvcgorICAgICAqIEBwYXJhbSBlbnZMb2FkZXIgdGhlIGVudmlyb25tZW50YWwgY2xhc3MgbG9hZGVyLCBpZiBhbnkKKyAgICAgKiBAcGFyYW0gbXVzdEV4aXN0IGlmIHRydWUsIHRocm93cyBhIHtAbGluayBNZXRhRGF0YUV4Y2VwdGlvbn0KKyAgICAgKiBpZiBubyBtZXRhZGF0YSBpcyBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKE9iamVjdCBvaWQsIENsYXNzTG9hZGVyIGVudkxvYWRlciwKKyAgICAgICAgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsICYmIG11c3RFeGlzdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tb2lkLW1ldGEiLCBvaWQsICI/IiwKKyAgICAgICAgICAgICAgICBfb2lkcy50b1N0cmluZygpKSk7CisgICAgICAgIGlmIChvaWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGlmIChvaWQgaW5zdGFuY2VvZiBPcGVuSlBBSWQpIHsKKyAgICAgICAgICAgIENsYXNzIGNscyA9ICgoT3BlbkpQQUlkKSBvaWQpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRNZXRhRGF0YShjbHMsIGVudkxvYWRlciwgbXVzdEV4aXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGNhY2hlCisgICAgICAgIHByb2Nlc3NSZWdpc3RlcmVkQ2xhc3NlcyhlbnZMb2FkZXIpOworICAgICAgICBDbGFzcyBjbHMgPSAoQ2xhc3MpIF9vaWRzLmdldChvaWQuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGlmIChjbHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRNZXRhRGF0YShjbHMsIGVudkxvYWRlciwgbXVzdEV4aXN0KTsKKworICAgICAgICAvLyBtYXliZSB0aGlzIGlzIHNvbWUgdHlwZSB3ZSd2ZSBzZWVuIGJ1dCBqdXN0IGlzbid0IHZhbGlkCisgICAgICAgIGlmIChfb2lkcy5jb250YWluc0tleShvaWQuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIGlmIChtdXN0RXhpc3QpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1vaWQtbWV0YSIsIG9pZCwKKyAgICAgICAgICAgICAgICAgICAgb2lkLmdldENsYXNzKCksIF9vaWRzKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHN0aWxsIG5vdCBtYXRjaCwgcmVnaXN0ZXIgYW55IGNsYXNzZXMgdGhhdCBsb29rIHNpbWlsYXIgdG8gdGhlCisgICAgICAgIC8vIG9pZCBjbGFzcyBhbmQgY2hlY2sgYWdhaW4KKyAgICAgICAgcmVzb2x2ZUlkZW50aXR5Q2xhc3Mob2lkKTsKKyAgICAgICAgaWYgKHByb2Nlc3NSZWdpc3RlcmVkQ2xhc3NlcyhlbnZMb2FkZXIpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGNscyA9IChDbGFzcykgX29pZHMuZ2V0KG9pZC5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGlmIChjbHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGEoY2xzLCBlbnZMb2FkZXIsIG11c3RFeGlzdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWNvcmQgdGhhdCB0aGlzIGlzIGFuIGludmFsaWQgdHlwZQorICAgICAgICBfb2lkcy5wdXQob2lkLmdldENsYXNzKCksIG51bGwpOworCisgICAgICAgIGlmICghbXVzdEV4aXN0KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tb2lkLW1ldGEiLCBvaWQsCisgICAgICAgICAgICBvaWQuZ2V0Q2xhc3MoKSwgX29pZHMpKS5zZXRGYWlsZWRPYmplY3Qob2lkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHNvbWUgZ3Vlc3NlcyBhYm91dCB0aGUgbmFtZSBvZiBhIHRhcmdldCBjbGFzcyBmb3IgYW4KKyAgICAgKiB1bmtub3duIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlSWRlbnRpdHlDbGFzcyhPYmplY3Qgb2lkKSB7CisgICAgICAgIGlmIChvaWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDbGFzcyBvaWRDbGFzcyA9IG9pZC5nZXRDbGFzcygpOworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicmVzb2x2ZS1pZGVudGl0eSIsIG9pZENsYXNzKSk7CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBvaWRDbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lOworICAgICAgICB3aGlsZSAob2lkQ2xhc3MgIT0gbnVsbCAmJiBvaWRDbGFzcyAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IG9pZENsYXNzLmdldE5hbWUoKTsKKworICAgICAgICAgICAgLy8gd2UgdGFrZSBhIGJydXRlLWZvcmNlIGFwcHJvYWNoOiB0cnkgdG8gbG9hZCBhbGwgdGhlIGNsYXNzJworICAgICAgICAgICAgLy8gc3Vic3RyaW5ncy4gdGhpcyB3aWxsIGhhbmRsZSB0aGUgZm9sbG93aW5nIGNvbW1vbiBuYW1pbmcgY2FzZXM6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICBjb20uY29tcGFueS5NeUNsYXNzJElECS0+IGNvbS5jb21wYW55Lk15Q2xhc3MKKyAgICAgICAgICAgIC8vICAgY29tLmNvbXBhbnkuTXlDbGFzc0lkCS0+IGNvbS5jb21wYW55Lk15Q2xhc3MKKyAgICAgICAgICAgIC8vICAgY29tLmNvbXBhbnkuTXlDbGFzc09pZAktPiBjb20uY29tcGFueS5NeUNsYXNzCisgICAgICAgICAgICAvLyAgIGNvbS5jb21wYW55Lk15Q2xhc3NQSwktPiBjb20uY29tcGFueS5NeUNsYXNzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gdGhpcyBpc24ndCB0aGUgZmFzdGVzdCB0aGluZyBwb3NzaWJsZSwgYnV0IHRoaXMgbWV0aG9kIHdpbGwKKyAgICAgICAgICAgIC8vIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIEpWTSBwZXIgdW5rbm93biBhcHAgaWQgY2xhc3MKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjbGFzc05hbWUubGVuZ3RoKCk7IGkgPiAxOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmNoYXJBdChpIC0gMSkgPT0gJy4nKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpKSwgdHJ1ZSwgY2wpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfSAvLyBjb25zdW1lIGFsbCBleGNlcHRpb25zCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1vdmUgdXAgdGhlIE9JRCBoaWVyYXJjaHkKKyAgICAgICAgICAgIG9pZENsYXNzID0gb2lkQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBsZWFzdC1kZXJpdmVkIG1ldGFkYXRhcyB3aXRoIHNvbWUgbWFwcGVkIGFzc2lnbmFibGUgdHlwZSB0aGF0CisgICAgICogaW1wbGVtZW50IHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHMgdGhlIGNsYXNzIG9yIGludGVyZmFjZSB0byByZXRyaWV2ZSBpbXBsZW1lbnRvcnMgZm9yCisgICAgICogQHBhcmFtIGVudkxvYWRlciB0aGUgZW52aXJvbm1lbnRhbCBjbGFzcyBsb2FkZXIsIGlmIGFueQorICAgICAqIEBwYXJhbSBtdXN0RXhpc3QgaWYgdHJ1ZSwgdGhyb3dzIGEge0BsaW5rIE1ldGFEYXRhRXhjZXB0aW9ufQorICAgICAqIGlmIG5vIG1ldGFkYXRhIGlzIGZvdW5kCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGFbXSBnZXRJbXBsZW1lbnRvck1ldGFEYXRhcyhDbGFzcyBjbHMsCisgICAgICAgIENsYXNzTG9hZGVyIGVudkxvYWRlciwgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsICYmIG11c3RFeGlzdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tbWV0YSIsIGNscykpOworICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfTUVUQVM7CisKKyAgICAgICAgLy8gZ2V0IGltcGxzIG9mIGdpdmVuIGludGVyZmFjZSAvIGFic3RyYWN0IGNsYXNzCisgICAgICAgIGxvYWRSZWdpc3RlcmVkQ2xhc3NNZXRhRGF0YShlbnZMb2FkZXIpOworICAgICAgICBDb2xsZWN0aW9uIHZhbHMgPSAoQ29sbGVjdGlvbikgX2ltcGxzLmdldChjbHMpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgIENvbGxlY3Rpb24gbWFwcGVkID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh2YWxzKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSB2YWxzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBnZXRNZXRhRGF0YSgoQ2xhc3MpIGl0ci5uZXh0KCksIGVudkxvYWRlciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLmlzTWFwcGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1ldGEuZ2V0TWFwcGVkUENTdWJjbGFzc01ldGFEYXRhcygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWQgPSBuZXcgQXJyYXlMaXN0KHZhbHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZC5hZGQobWV0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFwcGVkID09IG51bGwgJiYgbXVzdEV4aXN0KQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1tZXRhIiwgY2xzKSk7CisgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9NRVRBUzsKKyAgICAgICAgcmV0dXJuIChDbGFzc01ldGFEYXRhW10pIG1hcHBlZC50b0FycmF5KG5ld0NsYXNzTWV0YURhdGFBcnJheQorICAgICAgICAgICAgKG1hcHBlZC5zaXplKCkpKTsKKyAgICB9CisgICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBlcnNpc3RlbmNlLWF3YXJlIGNsYXNzLiAKKyAgICAgKiBSZXR1cm5zIG51bGwsIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCBhcyAKKyAgICAgKiBwZXJzaXN0ZW5jZS1hd2FyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9uUGVyc2lzdGVudE1ldGFEYXRhIGdldFBlcnNpc3RlbmNlQXdhcmUoQ2xhc3MgY2xzKSB7CisgICAgCXJldHVybiAoTm9uUGVyc2lzdGVudE1ldGFEYXRhKV9wYXdhcmVzLmdldChjbHMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCB0aGUgbWV0YWRhdGFzIGZvciBwZXJzaXN0ZW5jZS1hd2FyZSBjbGFzc2VzCisgICAgICogCisgICAgICogQHJldHVybiBlbXB0eSBhcnJheSBpZiBubyBjbGFzcyBoYXMgYmVlbiByZWdpc3RlcmVkIGFzIHBlcnMtYXdhcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgTm9uUGVyc2lzdGVudE1ldGFEYXRhW10gZ2V0UGVyc2lzdGVuY2VBd2FyZXMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoX3Bhd2FyZXMpIHsKKyAgICAgICAgICAgIGlmIChfcGF3YXJlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX05PTl9QRVJTSVNURU5UOworICAgICAgICAgICAgcmV0dXJuIChOb25QZXJzaXN0ZW50TWV0YURhdGFbXSlfcGF3YXJlcy52YWx1ZXMoKS50b0FycmF5CisgICAgICAgICAgICAgICAgKG5ldyBOb25QZXJzaXN0ZW50TWV0YURhdGFbX3Bhd2FyZXMuc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIGNsYXNzIGFzIHBlcnNpc3RlbmNlLWF3YXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbHMgbm9uLW51bGwgYW5kIG11c3Qgbm90IGFscmVhZGR5IGJlIGFkZGVkIGFzIHBlcnNpdGVuY2UtY2FwYWJsZQorICAgICAqLworICAgIHB1YmxpYyBOb25QZXJzaXN0ZW50TWV0YURhdGEgYWRkUGVyc2lzdGVuY2VBd2FyZShDbGFzcyBjbHMpIHsKKyAgICAJaWYgKGNscyA9PSBudWxsKQorICAgIAkJcmV0dXJuIG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAoX3Bhd2FyZXMuY29udGFpbnNLZXkoY2xzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5vblBlcnNpc3RlbnRNZXRhRGF0YSlfcGF3YXJlcy5nZXQoY2xzKTsKKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWRNZXRhRGF0YShjbHMpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJwYy1hbmQtYXdhcmUiLCBjbHMpKTsKKyAgICAgICAgICAgIE5vblBlcnNpc3RlbnRNZXRhRGF0YSBtZXRhID0gbmV3IE5vblBlcnNpc3RlbnRNZXRhRGF0YShjbHMsIHRoaXMsCisgICAgICAgICAgICAgICAgTm9uUGVyc2lzdGVudE1ldGFEYXRhLlRZUEVfUEVSU0lTVEVOQ0VfQVdBUkUpOworICAgICAgICAgICAgX3Bhd2FyZXMucHV0KGNscywgbWV0YSk7CisgICAgICAgICAgICByZXR1cm4gbWV0YTsKKyAgICAJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHBlcnNpdGVuY2UtYXdhcmUgY2xhc3MgZnJvbSB0aGUgcmVwb3NpdG9yeQorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUGVyc2lzdGVuY2VBd2FyZShDbGFzcyBjbHMpIHsKKyAgICAJcmV0dXJuIF9wYXdhcmVzLnJlbW92ZShjbHMpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbm9uLW1hcHBlZCBpbnRlcmZhY2UuCisgICAgICogUmV0dXJucyBudWxsLCBpZiB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGlzIG5vdCByZWdpc3RlcmVkIGFzIAorICAgICAqIHBlcnNpc3RlbmNlLWF3YXJlLgorICAgICAqLworICAgIHB1YmxpYyBOb25QZXJzaXN0ZW50TWV0YURhdGEgZ2V0Tm9uTWFwcGVkSW50ZXJmYWNlKENsYXNzIGlmYWNlKSB7CisgICAgCXJldHVybiAoTm9uUGVyc2lzdGVudE1ldGFEYXRhKV9ub25NYXBwZWQuZ2V0KGlmYWNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29ycmVzcG9uZGluZyBtZXRhZGF0YXMgZm9yIGFsbCByZWdpc3RlcmVkLCBub24tbWFwcGVkCisgICAgICogaW50ZXJmYWNlcworICAgICAqIAorICAgICAqIEByZXR1cm4gZW1wdHkgYXJyYXkgaWYgbm8gbm9uLW1hcHBlZCBpbnRlcmZhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9uUGVyc2lzdGVudE1ldGFEYXRhW10gZ2V0Tm9uTWFwcGVkSW50ZXJmYWNlcygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChfbm9uTWFwcGVkKSB7CisgICAgICAgICAgICBpZiAoX25vbk1hcHBlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX05PTl9QRVJTSVNURU5UOworICAgICAgICAgICAgcmV0dXJuIChOb25QZXJzaXN0ZW50TWV0YURhdGFbXSlfbm9uTWFwcGVkLnZhbHVlcygpLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IE5vblBlcnNpc3RlbnRNZXRhRGF0YVtfbm9uTWFwcGVkLnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBub24tbWFwcGVkIGludGVyZmFjZSB0byB0aGUgcmVwb3NpdG9yeS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWZhY2UgdGhlIG5vbi1tYXBwZWQgaW50ZXJmYWNlCisgICAgICovCisgICAgcHVibGljIE5vblBlcnNpc3RlbnRNZXRhRGF0YSBhZGROb25NYXBwZWRJbnRlcmZhY2UoQ2xhc3MgaWZhY2UpIHsKKyAgICAJaWYgKGlmYWNlID09IG51bGwpCisgICAgCQlyZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCFpZmFjZS5pc0ludGVyZmFjZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3Qtbm9uLW1hcHBlZCIsIGlmYWNlKSk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAoX25vbk1hcHBlZC5jb250YWluc0tleShpZmFjZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChOb25QZXJzaXN0ZW50TWV0YURhdGEpX25vbk1hcHBlZC5nZXQoaWZhY2UpOworICAgICAgICAgICAgaWYgKGdldENhY2hlZE1ldGFEYXRhKGlmYWNlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm9uLW1hcHBlZC1wYyIsIGlmYWNlKSk7CisgICAgICAgICAgICBOb25QZXJzaXN0ZW50TWV0YURhdGEgbWV0YSA9IG5ldyBOb25QZXJzaXN0ZW50TWV0YURhdGEoaWZhY2UsIHRoaXMsCisgICAgICAgICAgICAgICAgTm9uUGVyc2lzdGVudE1ldGFEYXRhLlRZUEVfTk9OX01BUFBFRF9JTlRFUkZBQ0UpOworICAgICAgICAgICAgX25vbk1hcHBlZC5wdXQoaWZhY2UsIG1ldGEpOworICAgICAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBub24tbWFwcGVkIGludGVyZmFjZSBmcm9tIHRoZSByZXBvc2l0b3J5CisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOb25NYXBwZWRJbnRlcmZhY2UoQ2xhc3MgaWZhY2UpIHsKKyAgICAJcmV0dXJuIF9ub25NYXBwZWQucmVtb3ZlKGlmYWNlKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBjYWNoZSBvZiBwYXJzZWQgbWV0YWRhdGEuIFRoaXMgbWV0aG9kIGFsc28gY2xlYXJzIHRoZQorICAgICAqIGludGVybmFsIHtAbGluayBNZXRhRGF0YUZhY3RvcnkgTWV0YURhdGFGYWN0b3J5fSdzIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoImNsZWFyLXJlcG9zIiwgdGhpcykpOworCisgICAgICAgIF9tZXRhcy5jbGVhcigpOworICAgICAgICBfb2lkcy5jbGVhcigpOworICAgICAgICBfc3Vicy5jbGVhcigpOworICAgICAgICBfaW1wbHMuY2xlYXIoKTsKKyAgICAgICAgX3F1ZXJpZXMuY2xlYXIoKTsKKyAgICAgICAgX3NlcXMuY2xlYXIoKTsKKyAgICAgICAgX3JlZ2lzdGVyZWQuY2xlYXIoKTsKKyAgICAgICAgX2ZhY3RvcnkuY2xlYXIoKTsKKyAgICAgICAgX2FsaWFzZXMuY2xlYXIoKTsKKyAgICAgICAgX3Bhd2FyZXMuY2xlYXIoKTsKKyAgICAgICAgX25vbk1hcHBlZC5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGNvbmZpZ3VyZWQgcGVyc2lzdGVudCBjbGFzc2VzLCBvciBudWxsIGlmIHRoZSB1c2VyCisgICAgICogZGlkIG5vdCBjb25maWd1cmUgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGRldnBhdGggaWYgdHJ1ZSwgc2VhcmNoIGZvciBtZXRhZGF0YSBmaWxlcyBpbiBkaXJlY3RvcmllcworICAgICAqIGluIHRoZSBjbGFzc3BhdGggaWYgbm8gY2xhc3NlcyBhcmUgY29uZmlndXJlZCBleHBsaWNpdGx5CisgICAgICogQHBhcmFtIGVudkxvYWRlciB0aGUgY2xhc3MgbG9hZGVyIHRvIHVzZSwgb3IgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0IGdldFBlcnNpc3RlbnRUeXBlTmFtZXMoYm9vbGVhbiBkZXZwYXRoLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlTmFtZXMoZGV2cGF0aCwgZW52TG9hZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBwZXJzaXN0ZW50IGNsYXNzZXMgbmFtZWQgaW4gY29uZmlndXJhdGlvbi4KKyAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgc3ViY2xhc3NlcyBhbmQgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3NlcyBvZgorICAgICAqIGVhY2ggdHlwZSBhcmUga25vd24gaW4gYWR2YW5jZSwgd2l0aG91dCBoYXZpbmcgdG8gcmVseSBvbiB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBsb2FkaW5nIHRoZSBjbGFzc2VzIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdAorICAgICAqIG1pZ2h0IGludm9sdmUgdGhlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZwYXRoIGlmIHRydWUsIHNlYXJjaCBmb3IgbWV0YWRhdGEgZmlsZXMgaW4gZGlyZWN0b3JpZXMKKyAgICAgKiBpbiB0aGUgY2xhc3NwYXRoIGlmIHRoZSBubyBjbGFzc2VzIGFyZSBjb25maWd1cmVkIGV4cGxpY2l0bHkKKyAgICAgKiBAcGFyYW0gZW52TG9hZGVyIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIGNsYXNzZXMsIG9yIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiBsb2FkUGVyc2lzdGVudFR5cGVzKGJvb2xlYW4gZGV2cGF0aCwKKyAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIFNldCBuYW1lcyA9IGdldFBlcnNpc3RlbnRUeXBlTmFtZXMoZGV2cGF0aCwgZW52TG9hZGVyKTsKKyAgICAgICAgaWYgKG5hbWVzID09IG51bGwgfHwgbmFtZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICAgICAgLy8gYXR0ZW1wdCB0byBsb2FkIGNsYXNzZXMgc28gdGhhdCB0aGV5IGdldCBwcm9jZXNzZWQKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xzTG9hZGVyID0gX2NvbmYuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihnZXRDbGFzcygpLCBlbnZMb2FkZXIpOworICAgICAgICBMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KG5hbWVzLnNpemUoKSk7CisgICAgICAgIENsYXNzIGNsczsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBuYW1lcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY2xzID0gY2xhc3NGb3JOYW1lKChTdHJpbmcpIGl0ci5uZXh0KCksIGNsc0xvYWRlcik7CisgICAgICAgICAgICBpZiAoY2xzICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub3QgbG9hZGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICgoX3ZhbGlkYXRlICYgVkFMSURBVEVfUlVOVElNRSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChfbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJiYWQtZGlzY292ZXItY2xhc3MiLCBuYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9sb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cuaW5mbyhfbG9jLmdldCgiYmFkLWRpc2NvdmVyLWNsYXNzIiwgbmFtZSkpOworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKGUpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBuc21lKSB7CisgICAgICAgICAgICBpZiAobnNtZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiLnBjIikgPT0gLTEpCisgICAgICAgICAgICAgICAgdGhyb3cgbnNtZTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIGVycm9yIGlzIGFib3V0IGEgbWV0aG9kIHRoYXQgdXNlcyB0aGUgUGVyc2lzdGVuY2VDYXBhYmxlCisgICAgICAgICAgICAvLyAncGMnIG1ldGhvZCBwcmVmaXgsIHBlcmZvcm0gc29tZSBsb2dnaW5nIGFuZCBjb250aW51ZS4gVGhpcworICAgICAgICAgICAgLy8gcHJvYmFibHkganVzdCBtZWFucyB0aGF0IHRoZSBjbGFzcyBpcyBub3QgeWV0IGVuaGFuY2VkLgorICAgICAgICAgICAgaWYgKChfdmFsaWRhdGUgJiBWQUxJREFURV9SVU5USU1FKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImJhZC1kaXNjb3Zlci1jbGFzcyIsIG5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xvZy5pc0luZm9FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy5pbmZvKF9sb2MuZ2V0KCJiYWQtZGlzY292ZXItY2xhc3MiLCBuYW1lKSk7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cudHJhY2UobnNtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBrbm93biBzdWJjbGFzc2VzIGZvciB0aGUgZ2l2ZW4gY2xhc3MgbWFwcGluZy4gTm90ZQorICAgICAqIHRoYXQgdGhpcyBtZXRob2Qgb25seSB3b3JrcyBkdXJpbmcgcnVudGltZSB3aGVuIHRoZSByZXBvc2l0b3J5IGlzCisgICAgICogcmVnaXN0ZXJlZCBhcyBhIHtAbGluayBSZWdpc3RlckNsYXNzTGlzdGVuZXJ9LgorICAgICAqLworICAgIENvbGxlY3Rpb24gZ2V0UENTdWJjbGFzc2VzKENsYXNzIGNscykgeworICAgICAgICBDb2xsZWN0aW9uIHN1YnMgPSAoQ29sbGVjdGlvbikgX3N1YnMuZ2V0KGNscyk7CisgICAgICAgIGlmIChzdWJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKyAgICAgICAgcmV0dXJuIHN1YnM7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFJlZ2lzdGVyQ2xhc3NMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKENsYXNzIGNscykgeworICAgICAgICAvLyBidWZmZXIgcmVnaXN0ZXJlZCBjbGFzc2VzIHVudGlsIGFuIG9pZCBtZXRhZGF0YSByZXF1ZXN0IGlzIG1hZGUsCisgICAgICAgIC8vIGF0IHdoaWNoIHBvaW50IHdlJ2xsIHBhcnNlIGV2ZXJ5dGhpbmcgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBzeW5jaHJvbml6ZWQgKF9yZWdpc3RlcmVkKSB7CisgICAgICAgICAgICBfcmVnaXN0ZXJlZC5hZGQoY2xzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGFsbCByZWdpc3RlcmVkIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRSZWdpc3RlcmVkQ2xhc3NNZXRhRGF0YShDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgQ2xhc3NbXSByZWcgPSBwcm9jZXNzUmVnaXN0ZXJlZENsYXNzZXMoZW52TG9hZGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWcubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEocmVnW2ldLCBlbnZMb2FkZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIG1lKSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4obWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyBvdXIgZGF0YXN0cnVjdHVyZXMgd2l0aCB0aGUgbGF0ZXN0IHJlZ2lzdGVyZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBDbGFzc1tdIHByb2Nlc3NSZWdpc3RlcmVkQ2xhc3NlcyhDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgaWYgKF9yZWdpc3RlcmVkLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9DTEFTU0VTOworCisgICAgICAgIC8vIGNvcHkgaW50byBuZXcgY29sbGVjdGlvbiB0byBhdm9pZCBjb25jdXJyZW50IG1vZCBlcnJvcnMgb24gcmVlbnRyYW50CisgICAgICAgIC8vIHJlZ2lzdHJhdGlvbnMKKyAgICAgICAgQ2xhc3NbXSByZWc7CisgICAgICAgIHN5bmNocm9uaXplZCAoX3JlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJlZyA9IChDbGFzc1tdKSBfcmVnaXN0ZXJlZC50b0FycmF5KG5ldyBDbGFzc1tfcmVnaXN0ZXJlZC5zaXplKCldKTsKKyAgICAgICAgICAgIF9yZWdpc3RlcmVkLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9uIHBjTmFtZXMgPSBnZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGZhbHNlLCBlbnZMb2FkZXIpOworICAgICAgICBDb2xsZWN0aW9uIGZhaWxlZCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVnLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBkb24ndCBwcm9jZXNzIHR5cGVzIHRoYXQgYXJlbid0IGxpc3RlZCBieSB0aGUgdXNlcjsgbWF5IGJlbG9uZworICAgICAgICAgICAgLy8gdG8gYSBkaWZmZXJlbnQgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICAgICAgaWYgKHBjTmFtZXMgIT0gbnVsbCAmJiAhcGNOYW1lcy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiAhcGNOYW1lcy5jb250YWlucyhyZWdbaV0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzUmVnaXN0ZXJlZENsYXNzKHJlZ1tpXSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmICghX2NvbmYuZ2V0UmV0cnlDbGFzc1JlZ2lzdHJhdGlvbigpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImVycm9yLXJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVnW2ldKSwgdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZmFpbGVkLXJlZ2lzdGVyZWQiLCByZWdbaV0pLCB0KTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmYWlsZWQuYWRkKHJlZ1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhaWxlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKF9yZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgX3JlZ2lzdGVyZWQuYWRkQWxsKGZhaWxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIG91ciBkYXRhc3RydWN0dXJlcyB3aXRoIHRoZSBnaXZlbiByZWdpc3RlcmVkIGNsYXNzLgorICAgICAqIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGEgY2hpbGQgY2xhc3MgY2Fubm90IHJlZ2lzdGVyIGl0c2VsZiB3aXRob3V0CisgICAgICogYWxzbyByZWdpc3RlcmluZyBpdHMgcGFyZW50IGNsYXNzIGJ5IHNwZWNpZnlpbmcgaXRzIHBlcnNpc3RlbmNlCisgICAgICogY2FwYWJsZSBzdXBlcmNsYXNzIGluIHRoZSByZWdpc3RyYXRpb24gZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZWdpc3RlcmVkQ2xhc3MoQ2xhc3MgY2xzKSB7CisgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJwcm9jZXNzLXJlZ2lzdGVyZWQiLCBjbHMpKTsKKworICAgICAgICAvLyB1cGRhdGUgc3ViY2xhc3MgbGlzdHM7IHN5bmNocm9uaXplIG9uIHRoaXMgYmVjYXVzZSBhY2Nlc3NpbmcgX21ldGFzCisgICAgICAgIC8vIHJlcXVpcmVzIGl0CisgICAgICAgIENsYXNzIGxlYXN0RGVyaXZlZCA9IGNsczsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGE7CisgICAgICAgICAgICBmb3IgKENsYXNzIGFuYyA9IGNsczsKKyAgICAgICAgICAgICAgICAoYW5jID0gUENSZWdpc3RyeS5nZXRQZXJzaXN0ZW50U3VwZXJjbGFzcyhhbmMpKSAhPSBudWxsOykgeworICAgICAgICAgICAgICAgIGFkZFRvQ29sbGVjdGlvbihfc3VicywgYW5jLCBjbHMsIHRydWUpOworICAgICAgICAgICAgICAgIG1ldGEgPSAoQ2xhc3NNZXRhRGF0YSkgX21ldGFzLmdldChhbmMpOworICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG1ldGEuY2xlYXJTdWJjbGFzc0NhY2hlKCk7CisgICAgICAgICAgICAgICAgbGVhc3REZXJpdmVkID0gYW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG9pZCBtYXBwaW5ncyBpZiB0aGlzIGlzIGEgYmFzZSBjb25jcmV0ZSBjbGFzcworICAgICAgICBPYmplY3Qgb2lkID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9pZCA9IFBDUmVnaXN0cnkubmV3T2JqZWN0SWQoY2xzKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJuYWxFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIC8vIHRocm93biBmb3Igc2luZ2xlIGZpZWxkIGlkZW50aXR5IHdpdGggbnVsbCBwayBmaWVsZCB2YWx1ZQorICAgICAgICB9CisgICAgICAgIGlmIChvaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3MgZXhpc3RpbmcgPSAoQ2xhc3MpIF9vaWRzLmdldChvaWQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBjbGFzcyBmb3IgdGhpcyBPSUQsIHRoZW4gd2Uga25vdworICAgICAgICAgICAgICAgIC8vIHRoYXQgbXVsdGlwbGUgY2xhc3NlcyBhcmUgdXNpbmcgdGhlIHNhbWUgT0lEOiB0aGVyZWZvcmUsCisgICAgICAgICAgICAgICAgLy8gcHV0IHRoZSBsZWFzdCBkZXJpdmVkIFBDIHN1cGVyY2xhc3MgaW50byB0aGUgbWFwLiBUaGlzCisgICAgICAgICAgICAgICAgLy8gZ2V0cyBhcm91bmQgdGhlIHByb2JsZW0gb2YgYW4gYWJzdHJhY3QgUEMgc3VwZXJjbGFzcworICAgICAgICAgICAgICAgIC8vIHVzaW5nIGFwcGxpY2F0aW9uIGlkZW50aXR5IChzaW5jZSBuZXdPYmplY3RJZAorICAgICAgICAgICAgICAgIC8vIHdpbGwgcmV0dXJuIG51bGwgZm9yIGFic3RyYWN0IGNsYXNzZXMpLgorICAgICAgICAgICAgICAgIENsYXNzIHN1cCA9IGNsczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoUENSZWdpc3RyeS5nZXRQZXJzaXN0ZW50U3VwZXJjbGFzcyhzdXApICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1cCA9IFBDUmVnaXN0cnkuZ2V0UGVyc2lzdGVudFN1cGVyY2xhc3Moc3VwKTsKKworICAgICAgICAgICAgICAgIF9vaWRzLnB1dChvaWQuZ2V0Q2xhc3MoKSwgc3VwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmcgPT0gbnVsbCB8fCBjbHMuaXNBc3NpZ25hYmxlRnJvbShleGlzdGluZykpCisgICAgICAgICAgICAgICAgX29pZHMucHV0KG9pZC5nZXRDbGFzcygpLCBjbHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG1hcHBpbmdzIGZyb20gaW50ZXJmYWNlcyBhbmQgbm9uLXBjIHN1cGVyY2xhc3NlcyB0bworICAgICAgICAvLyBwYyBpbXBsZW1lbnRpbmcgdHlwZXMKKyAgICAgICAgc3luY2hyb25pemVkIChfaW1wbHMpIHsKKyAgICAgICAgICAgIHVwZGF0ZUltcGxzKGNscywgbGVhc3REZXJpdmVkLCBjbHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGFsaWFzIGZvciBjbGFzcworICAgICAgICBTdHJpbmcgYWxpYXMgPSBQQ1JlZ2lzdHJ5LmdldFR5cGVBbGlhcyhjbHMpOworICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChfYWxpYXNlcykgeworICAgICAgICAgICAgICAgIExpc3QgY2xhc3NMaXN0ID0gKExpc3QpIF9hbGlhc2VzLmdldChhbGlhcyk7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzTGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgICAgICAgICAgICAgIF9hbGlhc2VzLnB1dChhbGlhcywgY2xhc3NMaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFjbGFzc0xpc3QuY29udGFpbnMoY2xzKSkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChjbHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBsaXN0IG9mIGltcGxlbWVudGF0aW9ucyBvZiBiYXNlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUltcGxzKENsYXNzIGNscywgQ2xhc3MgbGVhc3REZXJpdmVkLCBDbGFzcyBjaGVjaykgeworICAgICAgICAvLyBhbGxvdyB1c2VycyB0byBxdWVyeSBvbiBjb21tb24gbm9uLXBjIHN1cGVyY2xhc3NlcworICAgICAgICBDbGFzcyBzdXAgPSBjaGVjay5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmIChsZWFzdERlcml2ZWQgPT0gY2xzICYmIHN1cCAhPSBudWxsICYmIHN1cCAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIGFkZFRvQ29sbGVjdGlvbihfaW1wbHMsIHN1cCwgY2xzLCBmYWxzZSk7CisgICAgICAgICAgICB1cGRhdGVJbXBscyhjbHMsIGxlYXN0RGVyaXZlZCwgc3VwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbG93IHVzZXJzIHRvIHF1ZXJ5IG9uIGFueSBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzIHVubGVzcyBkZWZhdWx0cyAKKyAgICAgICAgLy8gc2F5IHRoZSB1c2VyIG11c3QgaW1wbGVtZW50IHBlcnNpc3RlbnQgaW50ZXJmYWNlcyBleHBsaWNpdGx5IGluIG1ldGEKKyAgICAgICAgaWYgKCFfZmFjdG9yeS5nZXREZWZhdWx0cygpLmlzRGVjbGFyZWRJbnRlcmZhY2VQZXJzaXN0ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIENsYXNzW10gaW50cyA9IGNoZWNrLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBkb24ndCBtYXAgamF2YS1zdGFuZGFyZCBpbnRlcmZhY2VzCisgICAgICAgICAgICBpZiAoaW50c1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YS4iKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gb25seSBtYXAgbGVhc3QtZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGVtZW50b3JzCisgICAgICAgICAgICBpZiAobGVhc3REZXJpdmVkID09IGNscyB8fCBpc0xlYXN0RGVyaXZlZEltcGwoaW50c1tpXSwgY2xzKSkgeworICAgICAgICAgICAgICAgIGFkZFRvQ29sbGVjdGlvbihfaW1wbHMsIGludHNbaV0sIGNscywgZmFsc2UpOworICAgICAgICAgICAgICAgIHVwZGF0ZUltcGxzKGNscywgbGVhc3REZXJpdmVkLCBpbnRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyB0aGUgbGVhc3QtZGVyaXZlZCBwZXJzaXN0ZW50CisgICAgICogaW1wbGVtZW50b3Igb2YgdGhlIGdpdmVuIGludGVyZmFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xlYXN0RGVyaXZlZEltcGwoQ2xhc3MgaW50ZXIsIENsYXNzIGNscykgeworICAgICAgICBDbGFzcyBwYXJlbnQgPSBQQ1JlZ2lzdHJ5LmdldFBlcnNpc3RlbnRTdXBlcmNsYXNzKGNscyk7CisgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QocGFyZW50LmdldEludGVyZmFjZXMoKSkuY29udGFpbnMoaW50ZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHBhcmVudCA9IFBDUmVnaXN0cnkuZ2V0UGVyc2lzdGVudFN1cGVyY2xhc3MocGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uIGNhY2hlZCBpbiB0aGUgZ2l2ZW4gbWFwIHVuZGVyCisgICAgICogdGhlIGdpdmVuIGtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uKE1hcCBtYXAsIENsYXNzIGtleSwgQ2xhc3MgdmFsdWUsCisgICAgICAgIGJvb2xlYW4gaW5oZXJpdGFuY2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBtYXAuZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGluaGVyaXRhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIEluaGVyaXRhbmNlQ29tcGFyYXRvciBjb21wID0gbmV3IEluaGVyaXRhbmNlQ29tcGFyYXRvcigpOworICAgICAgICAgICAgICAgICAgICBjb21wLnNldEJhc2Uoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgY29sbCA9IG5ldyBUcmVlU2V0KGNvbXApOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBjb2xsID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgY29sbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2xsLmFkZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uZmlndXJhYmxlIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgX2NvbmYgPSAoT3BlbkpQQUNvbmZpZ3VyYXRpb24pIGNvbmY7CisgICAgICAgIF9sb2cgPSBfY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX01FVEFEQVRBKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgaW5pdGlhbGl6ZU1ldGFEYXRhRmFjdG9yeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTWV0YURhdGFGYWN0b3J5KCkgeworICAgICAgICBpZiAoX2ZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgTWV0YURhdGFGYWN0b3J5IG1kZiA9IF9jb25mLm5ld01ldGFEYXRhRmFjdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAobWRmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1tZXRhZGF0YWZhY3RvcnkiKSk7CisgICAgICAgICAgICBzZXRNZXRhRGF0YUZhY3RvcnkobWRmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFF1ZXJ5IG1ldGFkYXRhCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gcXVlcnkgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBjbGFzcywgbmFtZSwgYW5kIGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUXVlcnlNZXRhRGF0YSBnZXRRdWVyeU1ldGFEYXRhKENsYXNzIGNscywgU3RyaW5nIG5hbWUsCisgICAgICAgIENsYXNzTG9hZGVyIGVudkxvYWRlciwgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgUXVlcnlNZXRhRGF0YSBtZXRhID0gZ2V0UXVlcnlNZXRhRGF0YUludGVybmFsKGNscywgbmFtZSwgZW52TG9hZGVyKTsKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbG9hZCBhbGwgdGhlIG1ldGFkYXRhcyBmb3IgYWxsIHRoZSBrbm93biBjbGFzc2VzIHNvIHRoYXQKKyAgICAgICAgICAgIC8vIHF1ZXJ5IG5hbWVzIGFyZSBzZWVuIGFuZCByZWdpc3RlcmVkCisgICAgICAgICAgICByZXNvbHZlQWxsKGVudkxvYWRlcik7CisgICAgICAgICAgICBtZXRhID0gZ2V0UXVlcnlNZXRhRGF0YUludGVybmFsKGNscywgbmFtZSwgZW52TG9hZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhID09IG51bGwgJiYgbXVzdEV4aXN0KSB7CisgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgKCJuby1uYW1lZC1xdWVyeS1udWxsLWNsYXNzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGZhbHNlLCBlbnZMb2FkZXIpLCBuYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tbmFtZWQtcXVlcnkiLAorICAgICAgICAgICAgICAgICAgICBjbHMsIG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXNvbHZlIGFsbCBrbm93biBtZXRhZGF0YSBjbGFzc2VzLiAKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUFsbChDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgQ29sbGVjdGlvbiB0eXBlcyA9IGxvYWRQZXJzaXN0ZW50VHlwZXMoZmFsc2UsIGVudkxvYWRlcik7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIENsYXNzIGMgPSAoQ2xhc3MpIGkubmV4dCgpOworICAgICAgICAgICAgZ2V0TWV0YURhdGEoYywgZW52TG9hZGVyLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gcXVlcnkgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBjbGFzcywgbmFtZSwgYW5kIGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgUXVlcnlNZXRhRGF0YSBnZXRRdWVyeU1ldGFEYXRhSW50ZXJuYWwoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBjaGVjayBjYWNoZQorICAgICAgICBPYmplY3Qga2V5ID0gZ2V0UXVlcnlLZXkoY2xzLCBuYW1lKTsKKyAgICAgICAgUXVlcnlNZXRhRGF0YSBxbSA9IChRdWVyeU1ldGFEYXRhKSBfcXVlcmllcy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKHFtICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcW07CisKKyAgICAgICAgLy8gZ2V0IG1ldGFkYXRhIGZvciBjbGFzcywgd2hpY2ggd2lsbCBmaW5kIHF1ZXJpZXMgaW4gbWV0YWRhdGEgZmlsZQorICAgICAgICBpZiAoY2xzICE9IG51bGwgJiYgZ2V0TWV0YURhdGEoY2xzLCBlbnZMb2FkZXIsIGZhbHNlKSAhPSBudWxsKSB7CisgICAgICAgICAgICBxbSA9IChRdWVyeU1ldGFEYXRhKSBfcXVlcmllcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChxbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBxbTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKF9zb3VyY2VNb2RlICYgTU9ERV9RVUVSWSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHNlZSBpZiBmYWN0b3J5IGNhbiBmaWd1cmUgb3V0IGEgc2NvcGUgZm9yIHRoaXMgcXVlcnkKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgY2xzID0gX2ZhY3RvcnkuZ2V0UXVlcnlTY29wZShuYW1lLCBlbnZMb2FkZXIpOworCisgICAgICAgIC8vIG5vdCBpbiBjYWNoZTsgbG9hZAorICAgICAgICBfZmFjdG9yeS5sb2FkKGNscywgTU9ERV9RVUVSWSwgZW52TG9hZGVyKTsKKyAgICAgICAgcmV0dXJuIChRdWVyeU1ldGFEYXRhKSBfcXVlcmllcy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBxdWVyeSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFF1ZXJ5TWV0YURhdGFbXSBnZXRRdWVyeU1ldGFEYXRhcygpIHsKKyAgICAgICAgcmV0dXJuIChRdWVyeU1ldGFEYXRhW10pIF9xdWVyaWVzLnZhbHVlcygpLnRvQXJyYXkKKyAgICAgICAgICAgIChuZXcgUXVlcnlNZXRhRGF0YVtfcXVlcmllcy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBxdWVyeSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBRdWVyeU1ldGFEYXRhIGdldENhY2hlZFF1ZXJ5TWV0YURhdGEoQ2xhc3MgY2xzLAorICAgICAgICBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKFF1ZXJ5TWV0YURhdGEpIF9xdWVyaWVzLmdldChnZXRRdWVyeUtleShjbHMsIG5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgcXVlcnkgbWV0YWRhdGEgdG8gdGhlIHJlcG9zaXRvcnkgYW5kIHJldHVybiBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFF1ZXJ5TWV0YURhdGEgYWRkUXVlcnlNZXRhRGF0YShDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIFF1ZXJ5TWV0YURhdGEgbWV0YSA9IG5ld1F1ZXJ5TWV0YURhdGEoY2xzLCBuYW1lKTsKKyAgICAgICAgX3F1ZXJpZXMucHV0KGdldFF1ZXJ5S2V5KG1ldGEpLCBtZXRhKTsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHF1ZXJ5IG1ldGFkYXRhIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBRdWVyeU1ldGFEYXRhIG5ld1F1ZXJ5TWV0YURhdGEoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBRdWVyeU1ldGFEYXRhIG1ldGEgPSBuZXcgUXVlcnlNZXRhRGF0YShuYW1lKTsKKyAgICAgICAgbWV0YS5zZXREZWZpbmluZ1R5cGUoY2xzKTsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBxdWVyeSBtZXRhZGF0YSBmcm9tIHRoZSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVRdWVyeU1ldGFEYXRhKFF1ZXJ5TWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX3F1ZXJpZXMucmVtb3ZlKGdldFF1ZXJ5S2V5KG1ldGEpKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBxdWVyeSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUgaWYgaW4gdGhlIHJlcG9zaXRvcnkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZVF1ZXJ5TWV0YURhdGEoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX3F1ZXJpZXMucmVtb3ZlKGdldFF1ZXJ5S2V5KGNscywgbmFtZSkpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgYSBnaXZlbiBRdWVyeU1ldGFEYXRhLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRRdWVyeUtleShRdWVyeU1ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0UXVlcnlLZXkobWV0YS5nZXREZWZpbmluZ1R5cGUoKSwgbWV0YS5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHVuaXF1ZSBrZXkgZm9yIGEgZ2l2ZW4gY2xhc3MgLyBuYW1lLiBUaGUgY2xhc3MKKyAgICAgKiBhcmd1bWVudCBjYW4gYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZXRRdWVyeUtleShDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICBRdWVyeUtleSBrZXkgPSBuZXcgUXVlcnlLZXkoKTsKKyAgICAgICAga2V5LmNsc05hbWUgPSBjbHMuZ2V0TmFtZSgpOworICAgICAgICBrZXkubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2VxdWVuY2UgbWV0YWRhdGEKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiBzZXF1ZW5jZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIG5hbWUgYW5kIGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2VxdWVuY2VNZXRhRGF0YSBnZXRTZXF1ZW5jZU1ldGFEYXRhKFN0cmluZyBuYW1lLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIsIGJvb2xlYW4gbXVzdEV4aXN0KSB7CisgICAgICAgIFNlcXVlbmNlTWV0YURhdGEgbWV0YSA9IGdldFNlcXVlbmNlTWV0YURhdGFJbnRlcm5hbChuYW1lLCBlbnZMb2FkZXIpOworICAgICAgICBpZiAobWV0YSA9PSBudWxsICYmIFNlcXVlbmNlTWV0YURhdGEuTkFNRV9TWVNURU0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoX3N5c1NlcSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9zeXNTZXEgPSBuZXdTZXF1ZW5jZU1ldGFEYXRhKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIF9zeXNTZXE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCAmJiBtdXN0RXhpc3QpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLW5hbWVkLXNlcXVlbmNlIiwgbmFtZSkpOworICAgICAgICByZXR1cm4gbWV0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgbWV0YWRhdGEgdG8gcmV0cmlldmUgc2VxdWVuY2UgbWV0YWRhdGFzIGJhc2VkIG9uCisgICAgICogcG9zc2libHktdW5xdWFsaWZpZWQgc2VxdWVuY2UgbmFtZS4KKyAgICAgKi8KKyAgICBTZXF1ZW5jZU1ldGFEYXRhIGdldFNlcXVlbmNlTWV0YURhdGEoQ2xhc3NNZXRhRGF0YSBjb250ZXh0LCBTdHJpbmcgbmFtZSwKKyAgICAgICAgYm9vbGVhbiBtdXN0RXhpc3QpIHsKKyAgICAgICAgLy8gdHJ5IHdpdGggZ2l2ZW4gbmFtZQorICAgICAgICBNZXRhRGF0YUV4Y2VwdGlvbiBlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcXVlbmNlTWV0YURhdGEgc2VxID0gZ2V0U2VxdWVuY2VNZXRhRGF0YShuYW1lLAorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RW52Q2xhc3NMb2FkZXIoKSwgbXVzdEV4aXN0KTsKKyAgICAgICAgICAgIGlmIChzZXEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VxOworICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBtZGUpIHsKKyAgICAgICAgICAgIGUgPSBtZGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBnaXZlbiBuYW1lIGFscmVhZHkgZnVsbHkgcXVhbGlmaWVkLCBnaXZlIHVwCisgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgeworICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnkgd2l0aCBxdWFsaWZpZWQgbmFtZQorICAgICAgICBuYW1lID0gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShjb250ZXh0LmdldERlc2NyaWJlZFR5cGUoKSkKKyAgICAgICAgICAgICsgIi4iICsgbmFtZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXF1ZW5jZU1ldGFEYXRhKG5hbWUsIGNvbnRleHQuZ2V0RW52Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICBtdXN0RXhpc3QpOworICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBtZGUpIHsKKyAgICAgICAgICAgIC8vIHRocm93IG9yaWdpbmFsIGV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgdGhyb3cgbWRlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHNlcXVlbmNlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgY2xhc3Nsb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXF1ZW5jZU1ldGFEYXRhIGdldFNlcXVlbmNlTWV0YURhdGFJbnRlcm5hbChTdHJpbmcgbmFtZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBjaGVjayBjYWNoZQorICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhIG1ldGEgPSAoU2VxdWVuY2VNZXRhRGF0YSkgX3NlcXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAobWV0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBsb2FkIG1ldGFkYXRhIGZvciByZWdpc3RlcmVkIGNsYXNzZXMgdG8gaG9wZWZ1bGx5IGZpbmQgc2VxdWVuY2UKKyAgICAgICAgICAgIC8vIGRlZmluaXRpb24KKyAgICAgICAgICAgIGxvYWRSZWdpc3RlcmVkQ2xhc3NNZXRhRGF0YShlbnZMb2FkZXIpOworICAgICAgICAgICAgbWV0YSA9IChTZXF1ZW5jZU1ldGFEYXRhKSBfc2Vxcy5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgc2VxdWVuY2UgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXF1ZW5jZU1ldGFEYXRhW10gZ2V0U2VxdWVuY2VNZXRhRGF0YXMoKSB7CisgICAgICAgIHJldHVybiAoU2VxdWVuY2VNZXRhRGF0YVtdKSBfc2Vxcy52YWx1ZXMoKS50b0FycmF5CisgICAgICAgICAgICAobmV3IFNlcXVlbmNlTWV0YURhdGFbX3NlcXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgYSBzZXF1ZW5jZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXF1ZW5jZU1ldGFEYXRhIGdldENhY2hlZFNlcXVlbmNlTWV0YURhdGEoCisgICAgICAgIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoU2VxdWVuY2VNZXRhRGF0YSkgX3NlcXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBzZXF1ZW5jZSBtZXRhZGF0YSB0byB0aGUgcmVwb3NpdG9yeSBhbmQgcmV0dXJuIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2VxdWVuY2VNZXRhRGF0YSBhZGRTZXF1ZW5jZU1ldGFEYXRhKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFNlcXVlbmNlTWV0YURhdGEgbWV0YSA9IG5ld1NlcXVlbmNlTWV0YURhdGEobmFtZSk7CisgICAgICAgIF9zZXFzLnB1dChuYW1lLCBtZXRhKTsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHNlcXVlbmNlIG1ldGFkYXRhIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXF1ZW5jZU1ldGFEYXRhIG5ld1NlcXVlbmNlTWV0YURhdGEoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW5jZU1ldGFEYXRhKG5hbWUsIHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gc2VxdWVuY2UgbWV0YWRhdGEgZnJvbSB0aGUgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlU2VxdWVuY2VNZXRhRGF0YShTZXF1ZW5jZU1ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9zZXFzLnJlbW92ZShtZXRhLmdldE5hbWUoKSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgc2VxdWVuY2UgbWV0YWRhdGEgZm9yIHRoZSBuYW1lIGlmIGluIHRoZSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVTZXF1ZW5jZU1ldGFEYXRhKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfc2Vxcy5yZW1vdmUobmFtZSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHN5c3RlbSBsaWZlY3ljbGUgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN5c3RlbUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICAvLyBjb3B5IHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpc3RlbmVyTGlzdCBhbmQgYXZvaWQgdW5uY2Vzc2FyeQorICAgICAgICAvLyBsb2NraW5nIG9uIHRoZSBsaXN0IGR1cmluZyBydW50aW1lCisgICAgICAgIExpZmVjeWNsZUV2ZW50TWFuYWdlci5MaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3CisgICAgICAgICAgICBMaWZlY3ljbGVFdmVudE1hbmFnZXIuTGlzdGVuZXJMaXN0KF9saXN0ZW5lcnMpOworICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgX2xpc3RlbmVycyA9IGxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHN5c3RlbSBsaWZlY3ljbGUgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZVN5c3RlbUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBpZiAoIV9saXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIGNvcHkgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGlzdGVuZXJMaXN0IGFuZCBhdm9pZCB1bm5jZXNzYXJ5CisgICAgICAgIC8vIGxvY2tpbmcgb24gdGhlIGxpc3QgZHVyaW5nIHJ1bnRpbWUKKyAgICAgICAgTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyLkxpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcKKyAgICAgICAgICAgIExpZmVjeWNsZUV2ZW50TWFuYWdlci5MaXN0ZW5lckxpc3QoX2xpc3RlbmVycyk7CisgICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICBfbGlzdGVuZXJzID0gbGlzdGVuZXJzOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBsaWZlY3ljbGUgbGlzdGVuZXJzCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV2ZW50TWFuYWdlci5MaXN0ZW5lckxpc3QgZ2V0U3lzdGVtTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gX2xpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIHJlcG9zaXRvcnkuIENsb3NlcyBhbGwgdXNlciBzZXF1ZW5jZXMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhW10gc21kcyA9IGdldFNlcXVlbmNlTWV0YURhdGFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc21kcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHNtZHNbaV0uY2xvc2UoKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBrZXkgc3RydWN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXJ5S2V5CisgICAgICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGNsc05hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IGNsc0hhc2ggPSAoY2xzTmFtZSA9PSBudWxsKSA/IDAgOiBjbHNOYW1lLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBpbnQgbmFtZUhhc2ggPSAobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gY2xzSGFzaCArIG5hbWVIYXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCisJCXsKKwkJCWlmIChvYmogPT0gdGhpcykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFF1ZXJ5S2V5KSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkJUXVlcnlLZXkgcWsgPSAoUXVlcnlLZXkpIG9iajsKKwkJCXJldHVybiBTdHJpbmdVdGlscy5lcXVhbHMgKGNsc05hbWUsIHFrLmNsc05hbWUpCisJCQkJJiYgU3RyaW5nVXRpbHMuZXF1YWxzIChuYW1lLCBxay5uYW1lKTsJCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFUb29sLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyMTcwYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9NZXRhRGF0YVRvb2wuamF2YQpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5DbGFzc0FyZ1BhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBUb29sIGZvciBnZW5lcmF0aW5nIGRlZmF1bHQgbWV0YWRhdGEuCisgKgorICogQHNpbmNlIDAuMy4wCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgTWV0YURhdGFUb29sCisgICAgaW1wbGVtZW50cyBNZXRhRGF0YU1vZGVzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BREQgPSAiYWRkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRFJPUCA9ICJkcm9wIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUNUSU9OUyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgQUNUSU9OX0FERCwKKyAgICAgICAgQUNUSU9OX0RST1AsCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoTWV0YURhdGFUb29sLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgT3BlbkpQQUNvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2FjdGlvbjsKKworICAgIHByaXZhdGUgZmluYWwgU2V0IF9kcm9wOworICAgIHByaXZhdGUgTWV0YURhdGFSZXBvc2l0b3J5IF9yZXBvcyA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIF9maWxlID0gbnVsbDsKKyAgICBwcml2YXRlIFdyaXRlciBfd3JpdGVyID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZsdXNoID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGNvbmZpZ3VyYXRpb24gYW5kIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFUb29sKE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgX2NvbmYgPSBjb25mOworICAgICAgICBfYWN0aW9uID0gKGFjdGlvbiA9PSBudWxsKSA/IEFDVElPTl9BREQgOiBhY3Rpb247CisKKyAgICAgICAgaWYgKEFDVElPTl9EUk9QLmVxdWFscyhfYWN0aW9uKSkKKyAgICAgICAgICAgIF9kcm9wID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2Ryb3AgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gc3VwcGxpZWQgb24gY29uc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBnZW5lcmF0ZSBtZXRhZGF0YSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworICAgICAgICByZXR1cm4gX2ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgdG8gZ2VuZXJhdGUgbWV0YWRhdGEgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgX2ZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZXIgdG8gZ2VuZXJhdGUgbWV0YWRhdGEgdG8uCisgICAgICovCisgICAgcHVibGljIFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiBfd3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZXIgdG8gZ2VuZXJhdGUgbWV0YWRhdGEgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgX3dyaXRlciA9IHdyaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVwb3NpdG9yeSB0byB1c2UgdG8gaG9sZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CisgICAgICAgIGlmIChfcmVwb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgX3JlcG9zID0gbmV3UmVwb3NpdG9yeSgpOworICAgICAgICAgICAgX3JlcG9zLnNldFJlc29sdmUoTU9ERV9NQVBQSU5HLCBmYWxzZSk7CisgICAgICAgICAgICBNZXRhRGF0YUZhY3RvcnkgZmFjdG9yeSA9IF9yZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKTsKKyAgICAgICAgICAgIGZhY3RvcnkuZ2V0RGVmYXVsdHMoKS5zZXRJZ25vcmVOb25QZXJzaXN0ZW50KGZhbHNlKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0U3RvcmVNb2RlKE1ldGFEYXRhRmFjdG9yeS5TVE9SRV9WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3JlcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtZXRhZGF0YSByZXBvc2l0b3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXRhRGF0YVJlcG9zaXRvcnkgbmV3UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIF9jb25mLm5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlcG9zaXRvcnkgdG8gdXNlIHRvIGhvbGQgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgX3JlcG9zID0gcmVwb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgc3RhdGUuIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgZXZlcnkge0BsaW5rICNyZWNvcmR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfcmVwb3MgPSBudWxsOworICAgICAgICBpZiAoX2Ryb3AgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kcm9wLmNsZWFyKCk7CisgICAgICAgIF9mbHVzaCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIG5ldyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bihDbGFzcyBjbHMpIHsKKyAgICAgICAgaWYgKGNscyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoQUNUSU9OX0RST1AuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgX2Ryb3AuYWRkKGNscyk7CisgICAgICAgIGVsc2UgaWYgKEFDVElPTl9BREQuZXF1YWxzKF9hY3Rpb24pKQorICAgICAgICAgICAgYWRkKGNscyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiA9PSAiICsgX2FjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZChDbGFzcyBjbHMpIHsKKyAgICAgICAgLy8gYXNzdW1lIGFsbCB1c2VyLWRlZmluZWQgdHlwZXMgYXJlIFBDcworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuYWRkTWV0YURhdGEoY2xzKTsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBtZXRhLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5PQkpFQ1QKKyAgICAgICAgICAgICAgICAmJiBmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpICE9IE9iamVjdC5jbGFzcykKKyAgICAgICAgICAgICAgICBmbWRzW2ldLnNldERlY2xhcmVkVHlwZUNvZGUoSmF2YVR5cGVzLlBDKTsKKyAgICAgICAgfQorICAgICAgICBtZXRhLnNldFNvdXJjZShfZmlsZSwgbWV0YS5nZXRTb3VyY2VUeXBlKCkpOworICAgICAgICBfZmx1c2ggPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCBtZXRhZGF0YSBjaGFuZ2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY29yZCgpIHsKKyAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBNZXRhRGF0YUZhY3RvcnkgbWRmID0gcmVwb3MuZ2V0TWV0YURhdGFGYWN0b3J5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX2Ryb3AgIT0gbnVsbCAmJiAhX2Ryb3AuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgIW1kZi5kcm9wKChDbGFzc1tdKSBfZHJvcC50b0FycmF5KG5ldyBDbGFzc1tfZHJvcC5zaXplKCldKSwKKyAgICAgICAgICAgICAgICBNT0RFX01FVEEgfCBNT0RFX01BUFBJTkcgfCBNT0RFX1FVRVJZLCBudWxsKSkgeworICAgICAgICAgICAgICAgIExvZyBsb2cgPSBfY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX01FVEFEQVRBKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImJhZC1kcm9wIiwgX2Ryb3ApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghX2ZsdXNoKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzID0gcmVwb3MuZ2V0TWV0YURhdGFzKCk7CisgICAgICAgICAgICBNYXAgb3V0cHV0ID0gbnVsbDsKKworICAgICAgICAgICAgLy8gaWYgd2UncmUgb3V0cHV0dGluZyB0byBzdHJlYW0sIHNldCBhbGwgbWV0YXMgdG8gc2FtZSBmaWxlIHNvCisgICAgICAgICAgICAvLyB0aGV5IGdldCBwbGFjZWQgaW4gc2luZ2xlIHN0cmluZworICAgICAgICAgICAgaWYgKF93cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgRmlsZSB0bXAgPSBuZXcgRmlsZSgib3BlbmpwYXRtcCIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIG1ldGFzW2ldLnNldFNvdXJjZSh0bXAsIG1ldGFzW2ldLmdldFNvdXJjZVR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1kZi5zdG9yZShtZXRhcywgbmV3IFF1ZXJ5TWV0YURhdGFbMF0sCisgICAgICAgICAgICAgICAgbmV3IFNlcXVlbmNlTWV0YURhdGFbMF0sIE1PREVfTUVUQSwgb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1zdG9yZSIpKTsKKyAgICAgICAgICAgIGlmIChfd3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoX3dyaXRlcik7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvdXRwdXQudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKChTdHJpbmcpIGl0ci5uZXh0KCkpOworICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzYWdlOiBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhVG9vbCBbb3B0aW9uXSoKKyAgICAgKiBbLWFjdGlvbi8tYSAmbHQ7YWRkIHwgZHJvcCZndDtdCisgICAgICogJmx0O2NsYXNzIG5hbWUgfCAuamF2YSBmaWxlIHwgLmNsYXNzIGZpbGUmZ3Q7KworICAgICAqICBXaGVyZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQuCisgICAgICogPHVsPgorICAgICAqIDxsaT48aT4tcHJvcGVydGllcy8tcCAmbHQ7cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlJmd0OzwvaT46IFRoZSBwYXRoCisgICAgICogb3IgcmVzb3VyY2UgbmFtZSBvZiBhIE9wZW5KUEEgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24KKyAgICAgKiBhcyBvdXRsaW5lZCBpbiB7QGxpbmsgT3BlbkpQQUNvbmZpZ3VyYXRpb259LiBPcHRpb25hbC48L2xpPgorICAgICAqIDxsaT48aT4tJmx0O3Byb3BlcnR5IG5hbWUmZ3Q7ICZsdDtwcm9wZXJ0eSB2YWx1ZSZndDs8L2k+OiBBbGwgYmVhbgorICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIE9wZW5KUEEge0BsaW5rIE9wZW5KUEFDb25maWd1cmF0aW9ufSBjYW4gYmUgc2V0IGJ5CisgICAgICogdXNpbmcgdGhlaXIgbmFtZXMgYW5kIHN1cHBseWluZyBhIHZhbHVlLjwvbGk+CisgICAgICogPGxpPjxpPi1maWxlLy1mICZsdDtzdGRvdXQgfCBvdXRwdXQgZmlsZSBvciByZXNvdXJjZSZndDs8L2k+OiBUaGUgcGF0aAorICAgICAqIG9yIHJlc291cmNlIG5hbWUgb2YgYSBmaWxlIHRoZSBtZXRhZGF0YSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvLgorICAgICAqIElmIHRoZSBnaXZlbiBmaWxlIGFscmVhZHkgY29udGFpbnMgbWV0YWRhdGEsIHRoZSBnZW5lcmF0ZWQKKyAgICAgKiBtZXRhZGF0YSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBleGlzdGluZyBkb2N1bWVudC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogIFRoZSBhdmFpbGFibGUgYWN0aW9ucyBhcmU6CisgICAgICogPHVsPgorICAgICAqIDxsaT48aT5hZGQ8L2k+OiBHZW5lcmF0ZSBkZWZhdWx0IG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY2xhc3Nlcy4gVGhpcworICAgICAqIGlzIHRoZSBkZWZhdWx0IGFjdGlvbi48L2xpPgorICAgICAqIDxsaT48aT5kcm9wPC9pPjogUmVtb3ZlIGV4aXN0aW5nIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gY2xhc3Nlcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgYXJncyA9IG9wdHMuc2V0RnJvbUNtZExpbmUoYXJncyk7CisgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXJ1bihjb25mLCBhcmdzLCBvcHRzKSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oX2xvYy5nZXQoInRvb2wtdXNhZ2UiKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjb25mLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRvb2wuIFJldHVybnMgZmFsc2UgaWYgYW55IGludmFsaWQgb3B0aW9ucyB3ZXJlIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW4oT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nW10gYXJncywKKyAgICAgICAgT3B0aW9ucyBvcHRzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCB8fCBvcHRzLmNvbnRhaW5zS2V5KCJoZWxwIikKKyAgICAgICAgICAgIHx8IG9wdHMuY29udGFpbnNLZXkoIi1oZWxwIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgRmxhZ3MgZmxhZ3MgPSBuZXcgRmxhZ3MoKTsKKyAgICAgICAgZmxhZ3MuYWN0aW9uID0gb3B0cy5yZW1vdmVQcm9wZXJ0eSgiYWN0aW9uIiwgImEiLCBmbGFncy5hY3Rpb24pOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBvcHRzLnJlbW92ZVByb3BlcnR5KCJmaWxlIiwgImYiLCBudWxsKTsKKyAgICAgICAgaWYgKCJzdGRvdXQiLmVxdWFscyhmaWxlTmFtZSkpIHsKKyAgICAgICAgICAgIGZsYWdzLndyaXRlciA9IG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmICgic3RkZXJyIi5lcXVhbHMoZmlsZU5hbWUpKSB7CisgICAgICAgICAgICBmbGFncy53cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVycik7CisgICAgICAgICAgICBmaWxlTmFtZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBDb25maWd1cmF0aW9ucy5wb3B1bGF0ZUNvbmZpZ3VyYXRpb24oY29uZiwgb3B0cyk7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGNvbmYuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcihNZXRhRGF0YVRvb2wuY2xhc3MsIG51bGwpOworCisgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgZmxhZ3MuZmlsZSA9IEZpbGVzLmdldEZpbGUoZmlsZU5hbWUsIGxvYWRlcik7CisgICAgICAgIHJldHVybiBydW4oY29uZiwgYXJncywgZmxhZ3MsIG51bGwsIGxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0b29sLiBSZXR1cm4gZmFsc2UgaWYgaW52YWxpZCBvcHRpb25zIHdlcmUgZ2l2ZW4uIFRoZSBnaXZlbgorICAgICAqIHJlcG9zaXRvcnkgbWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmdbXSBhcmdzLAorICAgICAgICBGbGFncyBmbGFncywgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zLCBDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZmxhZ3MuYWN0aW9uID09IG51bGwpCisgICAgICAgICAgICBmbGFncy5hY3Rpb24gPSBBQ1RJT05fQUREOworCisgICAgICAgIE1ldGFEYXRhVG9vbCB0b29sID0gbmV3IE1ldGFEYXRhVG9vbChjb25mLCBmbGFncy5hY3Rpb24pOworICAgICAgICBpZiAocmVwb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgTWV0YURhdGFGYWN0b3J5IGZhY3RvcnkgPSByZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKTsKKyAgICAgICAgICAgIGZhY3RvcnkuZ2V0RGVmYXVsdHMoKS5zZXRJZ25vcmVOb25QZXJzaXN0ZW50KGZhbHNlKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0U3RvcmVNb2RlKE1ldGFEYXRhRmFjdG9yeS5TVE9SRV9WRVJCT1NFKTsKKyAgICAgICAgICAgIHRvb2wuc2V0UmVwb3NpdG9yeShyZXBvcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzLmZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRvb2wuc2V0RmlsZShmbGFncy5maWxlKTsKKyAgICAgICAgaWYgKGZsYWdzLndyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgdG9vbC5zZXRXcml0ZXIoZmxhZ3Mud3JpdGVyKTsKKworICAgICAgICBMb2cgbG9nID0gY29uZi5nZXRMb2coT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1RPT0wpOworICAgICAgICBDbGFzc0FyZ1BhcnNlciBjYXAgPSBjb25mLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YUZhY3RvcnkoKS5uZXdDbGFzc0FyZ1BhcnNlcigpOworICAgICAgICBjYXAuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgQ2xhc3NbXSBjbGFzc2VzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNsYXNzZXMgPSBjYXAucGFyc2VUeXBlcyhhcmdzW2ldKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2xhc3Nlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKF9sb2MuZ2V0KCJ0b29sLXJ1bm5pbmciLCBjbGFzc2VzW2pdLCBmbGFncy5hY3Rpb24pKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0b29sLnJ1bihjbGFzc2VzW2pdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2cuaW5mbyhfbG9jLmdldCgidG9vbC1yZWNvcmQiKSk7CisgICAgICAgIHRvb2wucmVjb3JkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biBmbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsYWdzIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGFjdGlvbiA9IEFDVElPTl9BREQ7CisgICAgICAgIHB1YmxpYyBGaWxlIGZpbGUgPSBudWxsOworCQlwdWJsaWMgV3JpdGVyIHdyaXRlciA9IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL05vblBlcnNpc3RlbnRNZXRhRGF0YS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL05vblBlcnNpc3RlbnRNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTMwODkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTm9uUGVyc2lzdGVudE1ldGFEYXRhLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7DQorDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5Tb3VyY2VUcmFja2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbC5Db21tZW50YWJsZTsNCisNCisvKioNCisgKiBNZXRhZGF0YSBhYm91dCBhIHBlcnNpc3RlbmNlLWF3YXJlIHR5cGUuDQorICoNCisgKiBAYXV0aG9yIFBpbmFraSBQb2RkYXINCisgKi8NCitwdWJsaWMgY2xhc3MgTm9uUGVyc2lzdGVudE1ldGFEYXRhIA0KKwlpbXBsZW1lbnRzIENvbXBhcmFibGUsIFNvdXJjZVRyYWNrZXIsIENvbW1lbnRhYmxlLCBNZXRhRGF0YUNvbnRleHQsDQorICAgICAgICBTZXJpYWxpemFibGUgew0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BFUlNJU1RFTkNFX0FXQVJFID0gMTsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT05fTUFQUEVEX0lOVEVSRkFDRSA9IDI7DQorDQorICAgIHByaXZhdGUgZmluYWwgTWV0YURhdGFSZXBvc2l0b3J5IF9yZXBvczsNCisJcHJpdmF0ZSBmaW5hbCBDbGFzcyBfY2xhc3M7DQorICAgIHByaXZhdGUgZmluYWwgaW50IF90eXBlOw0KKwkNCisgICAgcHJpdmF0ZSBGaWxlIF9zcmNGaWxlID0gbnVsbDsNCisgICAgcHJpdmF0ZSBpbnQgX3NyY1R5cGUgPSBTUkNfT1RIRVI7DQorICAgIHByaXZhdGUgU3RyaW5nW10gX2NvbW1lbnRzID0gbnVsbDsNCisgICAgcHJpdmF0ZSBpbnQgX2xpc3RJbmRleCA9IC0xOw0KKwkNCisJcHJvdGVjdGVkIE5vblBlcnNpc3RlbnRNZXRhRGF0YShDbGFzcyBjbHMsIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcywgDQorICAgICAgICBpbnQgdHlwZSkgew0KKwkJX3JlcG9zID0gcmVwb3M7DQorCQlfY2xhc3MgPSBjbHM7DQorICAgICAgICBfdHlwZSA9IHR5cGU7DQorCX0NCisJDQorICAgIC8qKg0KKyAgICAgKiBPd25pbmcgcmVwb3NpdG9yeS4NCisgICAgICovDQorCXB1YmxpYyBNZXRhRGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHsNCisJCXJldHVybiBfcmVwb3M7DQorCX0NCisJDQorICAgIC8qKg0KKyAgICAgKiBQZXJzaXN0ZW5jZS1hd2FyZSB0eXBlLg0KKyAgICAgKi8NCisJcHVibGljIENsYXNzIGdldERlc2NyaWJlZFR5cGUoKSB7DQorCQlyZXR1cm4gX2NsYXNzOw0KKwl9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgdHlwZSBvZiBtZXRhZGF0YS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBfdHlwZTsNCisgICAgfQ0KKwkNCisgICAgLyoqDQorICAgICAqIFRoZSBpbmRleCBpbiB3aGljaCB0aGlzIGNsYXNzIHdhcyBsaXN0ZWQgaW4gdGhlIG1ldGFkYXRhLiBEZWZhdWx0cyB0bw0KKyAgICAgKiA8Y29kZT4tMTwvY29kZT4gaWYgdGhpcyBjbGFzcyB3YXMgbm90IGxpc3RlZCBpbiB0aGUgbWV0YWRhdGEuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldExpc3RpbmdJbmRleCgpIHsNCisgICAgICAgIHJldHVybiBfbGlzdEluZGV4Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgaW5kZXggaW4gd2hpY2ggdGhpcyBmaWVsZCB3YXMgbGlzdGVkIGluIHRoZSBtZXRhZGF0YS4gRGVmYXVsdHMgdG8NCisgICAgICogPGNvZGU+LTE8L2NvZGU+IGlmIHRoaXMgY2xhc3Mgd2FzIG5vdCBsaXN0ZWQgaW4gdGhlIG1ldGFkYXRhLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGluZ0luZGV4KGludCBpbmRleCkgew0KKyAgICAgICAgX2xpc3RJbmRleCA9IGluZGV4Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUZpbGUoKSB7DQorICAgICAgICByZXR1cm4gX3NyY0ZpbGU7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2VTY29wZSgpIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpIHsNCisgICAgICAgIHJldHVybiBfc3JjVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoRmlsZSBmaWxlLCBpbnQgc3JjVHlwZSkgew0KKyAgICAgICAgX3NyY0ZpbGUgPSBmaWxlOw0KKyAgICAgICAgX3NyY1R5cGUgPSBzcmNUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIF9jbGFzcy5nZXROYW1lKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbW1lbnRzKCkgew0KKyAgICAgICAgcmV0dXJuIChfY29tbWVudHMgPT0gbnVsbCkgPyBDbGFzc01ldGFEYXRhLkVNUFRZX0NPTU1FTlRTIDogX2NvbW1lbnRzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRzKFN0cmluZ1tdIGNvbW1lbnRzKSB7DQorICAgICAgICBfY29tbWVudHMgPSBjb21tZW50czsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsNCisgICAgICAgIGlmIChvID09IHRoaXMpDQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTm9uUGVyc2lzdGVudE1ldGFEYXRhKSkNCisgICAgICAgIAlyZXR1cm4gMTsNCisgICAgICAgIE5vblBlcnNpc3RlbnRNZXRhRGF0YSBvdGhlciA9IChOb25QZXJzaXN0ZW50TWV0YURhdGEpIG87DQorICAgICAgICBpZiAoX3R5cGUgIT0gb3RoZXIuZ2V0VHlwZSgpKQ0KKyAgICAgICAgICAgIHJldHVybiBfdHlwZSAtIG90aGVyLmdldFR5cGUoKTsNCisgICAgICAgIHJldHVybiBfY2xhc3MuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTm9uZU1ldGFEYXRhRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL05vbmVNZXRhRGF0YUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWJmNmIyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL05vbmVNZXRhRGF0YUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNsYXNzQXJnUGFyc2VyOworCisvKioKKyAqIE5vLW9wIG1ldGFkYXRhIEkvTyB0byBwcmV2ZW50IGF0dGVtcHRzIHRvIGxvYWQgb3RoZXIgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgTm9uZU1ldGFEYXRhRmFjdG9yeQorICAgIGltcGxlbWVudHMgTWV0YURhdGFGYWN0b3J5LCBNZXRhRGF0YURlZmF1bHRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vbmVNZXRhRGF0YUZhY3RvcnkgX2luc3RhbmNlID0KKyAgICAgICAgbmV3IE5vbmVNZXRhRGF0YUZhY3RvcnkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTm9uZU1ldGFEYXRhRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5KE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlRGlyZWN0b3J5KEZpbGUgZGlyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmVNb2RlKGludCBzdG9yZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdChib29sZWFuIHN0cmljdCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoQ2xhc3MgY2xzLCBpbnQgbW9kZSwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RvcmUoQ2xhc3NNZXRhRGF0YVtdIG1ldGFzLCBRdWVyeU1ldGFEYXRhW10gcXVlcmllcywKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YVtdIHNlcXMsIGludCBtb2RlLCBNYXAgb3V0cHV0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkcm9wKENsYXNzW10gY2xzLCBpbnQgbW9kZSwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YURhdGFEZWZhdWx0cyBnZXREZWZhdWx0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFNldCBnZXRQZXJzaXN0ZW50VHlwZU5hbWVzKGJvb2xlYW4gY2xhc3NwYXRoLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFF1ZXJ5U2NvcGUoU3RyaW5nIHF1ZXJ5TmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRTZXRNYXBwaW5nU2NvcGUoU3RyaW5nIHJlc3VsdFNldE1hcHBpbmdOYW1lLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzQXJnUGFyc2VyIG5ld0NsYXNzQXJnUGFyc2VyKCkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzQXJnUGFyc2VyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2xhc3NFeHRlbnNpb25LZXlzKENvbGxlY3Rpb24gZXh0cykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEZpZWxkRXh0ZW5zaW9uS2V5cyhDb2xsZWN0aW9uIGV4dHMpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRBY2Nlc3NUeXBlKCkgeworICAgICAgICByZXR1cm4gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfVU5LTk9XTjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRJZGVudGl0eVR5cGUoKSB7CisgICAgICAgIHJldHVybiBDbGFzc01ldGFEYXRhLklEX1VOS05PV047CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDYWxsYmFja01vZGUoKSB7CisgICAgICAgIHJldHVybiBDQUxMQkFDS19JR05PUkU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FsbGJhY2tzQmVmb3JlTGlzdGVuZXJzKGludCB0eXBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVOb25QZXJzaXN0ZW50KGJvb2xlYW4gaWdub3JlKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWNsYXJlZEludGVyZmFjZVBlcnNpc3RlbnQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFTdG9yZU9iamVjdElkRmllbGRVbndyYXBwZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShDbGFzc01ldGFEYXRhIG1ldGEsIGludCBhY2Nlc3MpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyIGdldEJhY2tpbmdNZW1iZXIoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGdldFVuaW1wbGVtZW50ZWRFeGNlcHRpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvT3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9PcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzkyN2MKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvT3JkZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKKy8qKgorICogT3JkZXIgYSBmaWVsZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIE9yZGVyCisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogVG9rZW4gZGVub3RpbmcgdG8gb3JkZXIgYnkgdGhlIGVsZW1lbnQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVCA9ICIjZWxlbWVudCI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG9yZGVyYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIE9yZGVyIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FzY2VuZGluZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29tcGFyYXRvciBmb3Igb3JkZXJpbmcgYnkgdGhpcyBlbGVtZW50LCBvciBudWxsIGlmCisgICAgICogdGhlIG9yZGVyaW5nIGlzIGRvbmUgaW4gdGhlIGRhdGFzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yICgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1Byb3h5U2V0dXBTdGF0ZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9Qcm94eVNldHVwU3RhdGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNGI4MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9Qcm94eVNldHVwU3RhdGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKKworLyoqCisgKiBNb3N0bHktdW5pbXBsZW1lbnRlZCBzdGF0ZSBtYW5hZ2VyIHR5cGUgd2hvc2Ugc29sZSBwdXJwb3NlIGlzIHRvCisgKiBjaGVjayB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhbGwgU0NPIGNvbnRhaW5lciBmaWVsZHMgZm9yIHRoZWlyIGluaXRpYWxpemVkCisgKiB0eXBlcyBhbmQgY29tcGFyYXRvcnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgUHJveHlTZXR1cFN0YXRlTWFuYWdlcgorICAgIGltcGxlbWVudHMgU3RhdGVNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgT2JqZWN0IF9vYmplY3QgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlEYXRhKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXREZWZpbmluZ01ldGFEYXRhKCkgIT0gbWV0YSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgc3dpdGNoIChmbWRzW2ldLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNBTEVOREFSOgorICAgICAgICAgICAgICAgICAgICBwYy5wY1Byb3ZpZGVGaWVsZChmbWRzW2ldLmdldEluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoX29iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgdGltZXpvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbGl6ZXIoKChDYWxlbmRhcikgX29iamVjdCkuZ2V0VGltZVpvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcGMucGNQcm92aWRlRmllbGQoZm1kc1tpXS5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9vYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBzcGVjaWZpYyB0eXBlPworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9vYmplY3QuZ2V0Q2xhc3MoKSAhPSBmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0uc2V0UHJveHlUeXBlKF9vYmplY3QuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBjb21wYXJhdG9yPworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9vYmplY3QgaW5zdGFuY2VvZiBTb3J0ZWRTZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1kc1tpXS5zZXRJbml0aWFsaXplcigoKFNvcnRlZFNldCkgX29iamVjdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICBwYy5wY1Byb3ZpZGVGaWVsZChmbWRzW2ldLmdldEluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoX29iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIHR5cGU/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX29iamVjdC5nZXRDbGFzcygpICE9IGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1kc1tpXS5zZXRQcm94eVR5cGUoX29iamVjdC5nZXRDbGFzcygpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNvbXBhcmF0b3I/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX29iamVjdCBpbnN0YW5jZW9mIFNvcnRlZE1hcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbWRzW2ldLnNldEluaXRpYWxpemVyKCgoU29ydGVkTWFwKSBfb2JqZWN0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UENQcmltYXJ5S2V5KE9iamVjdCBvaWQsIGludCBmaWVsZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhdGVNYW5hZ2VyIHJlcGxhY2VTdGF0ZU1hbmFnZXIoU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RldGFjaGVkKCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEdlbmVyaWNDb250ZXh0KCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShTdHJpbmcgcykgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGZldGNoT2JqZWN0SWQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXNzaW5nRmllbGQoaW50IGkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2VyaWFsaXppbmcoKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdyaXRlRGV0YWNoZWQoT2JqZWN0T3V0cHV0IG91dCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm94eURldGFjaGVkRGVzZXJpYWxpemVkKGludCBpZHgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0Jvb2xlYW5GaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBib29sZWFuIGIsCisgICAgICAgIGJvb2xlYW4gYjIsIGludCBzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0NoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBjaGFyIGMsIGNoYXIgYzIsCisgICAgICAgIGludCBzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0J5dGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBieXRlIGIsIGJ5dGUgYjIsCisgICAgICAgIGludCBzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ1Nob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSwgc2hvcnQgcywKKyAgICAgICAgc2hvcnQgczIsIGludCBzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dGluZ0ludEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGksIGludCBpMiwgaW50IGkzLAorICAgICAgICBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSwgbG9uZyBsLCBsb25nIGwyLAorICAgICAgICBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdGbG9hdEZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGksIGZsb2F0IGYsCisgICAgICAgIGZsb2F0IGYyLCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdEb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBkb3VibGUgZCwKKyAgICAgICAgZG91YmxlIGQyLCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdTdHJpbmdGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBTdHJpbmcgcywKKyAgICAgICAgU3RyaW5nIHMyLCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHRpbmdPYmplY3RGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBPYmplY3QgbywKKyAgICAgICAgT2JqZWN0IG8yLCBpbnQgc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGksIGJvb2xlYW4gYikgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZENoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBjaGFyIGMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSwgYnl0ZSBiKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU2hvcnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBzaG9ydCBzKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkSW50RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSwgaW50IGkyKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkTG9uZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGksIGxvbmcgbCkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZEZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSwgZmxvYXQgZikgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZERvdWJsZUZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGksIGRvdWJsZSBkKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVkU3RyaW5nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSwgU3RyaW5nIHMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvdmlkZWRPYmplY3RGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpLCBPYmplY3QgbykgeworICAgICAgICBfb2JqZWN0ID0gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlQm9vbGVhbkZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgcmVwbGFjZUNoYXJGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHJlcGxhY2VCeXRlRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgcmVwbGFjZVNob3J0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlcGxhY2VJbnRGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHJlcGxhY2VMb25nRmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgcmVwbGFjZUZsb2F0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIHJlcGxhY2VEb3VibGVGaWVsZChQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIGludCBpKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcmVwbGFjZVN0cmluZ0ZpZWxkKFBlcnNpc3RlbmNlQ2FwYWJsZSBwYywgaW50IGkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZXBsYWNlT2JqZWN0RmllbGQoUGVyc2lzdGVuY2VDYXBhYmxlIHBjLCBpbnQgaSkgeworICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvUXVlcnlNZXRhRGF0YS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1F1ZXJ5TWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTI3MDI5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1F1ZXJ5TWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLlNvdXJjZVRyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuQ29tbWVudGFibGU7CisKKy8qKgorICogSG9sZHMgbWV0YWRhdGEgYWJvdXQgbmFtZWQgcXVlcmllcy4KKyAqICBJbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhpcyBpbnN0YW5jZSBnZXRzIHRyYW5zZmVyZWQgdG8KKyAqIG5ldyB7QGxpbmsgUXVlcnl9IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlNZXRhRGF0YQorICAgIGltcGxlbWVudHMgTWV0YURhdGFNb2RlcywgU291cmNlVHJhY2tlciwgQ29tbWVudGFibGUsIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9LRVlTID0gbmV3IFN0cmluZ1swXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9WQUxTID0gbmV3IE9iamVjdFswXTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lOworICAgIHByaXZhdGUgQm9vbGVhbiBfcmVhZE9ubHk7CisgICAgcHJpdmF0ZSBGaWxlIF9maWxlOworICAgIHByaXZhdGUgT2JqZWN0IF9zY29wZTsKKyAgICBwcml2YXRlIGludCBfc3JjVHlwZTsKKyAgICBwcml2YXRlIGludCBfbW9kZSA9IE1PREVfUVVFUlk7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2xhbmd1YWdlOworICAgIHByaXZhdGUgQ2xhc3MgX2NsYXNzOworICAgIHByaXZhdGUgQ2xhc3MgX2NhbmRpZGF0ZTsKKyAgICBwcml2YXRlIENsYXNzIF9yZXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3F1ZXJ5OworICAgIHByaXZhdGUgU3RyaW5nW10gX2NvbW1lbnRzOworICAgIHByaXZhdGUgTGlzdCBfaGludEtleXM7CisgICAgcHJpdmF0ZSBMaXN0IF9oaW50VmFsczsKKyAgICBwcml2YXRlIFN0cmluZyBfcmVzdWx0U2V0TWFwcGluZ05hbWU7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFF1ZXJ5TWV0YURhdGEoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBmb3IgdGhpcyBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdGhhdCBkZWZpbmVzIHRoaXMgcXVlcnksIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGVmaW5pbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gX2NsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0aGF0IGRlZmluZXMgdGhpcyBxdWVyeSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmluaW5nVHlwZShDbGFzcyBjbHMpIHsKKyAgICAgICAgX2NsYXNzID0gY2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHF1ZXJ5IGhhcyBiZWVuIG1hcmtlZCByZWFkLW9ubHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkT25seSAhPSBudWxsICYmIF9yZWFkT25seS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBxdWVyeSBoYXMgYmVlbiBtYXJrZWQgcmVhZC1vbmx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKKyAgICAgICAgX3JlYWRPbmx5ID0gKHJlYWRPbmx5KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IGNhbmRpZGF0ZSBjbGFzcywgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRDYW5kaWRhdGVUeXBlKCkgeworICAgICAgICByZXR1cm4gX2NhbmRpZGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVlcnkgcmVzdWx0IGNsYXNzLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuZGlkYXRlVHlwZShDbGFzcyBjbHMpIHsKKyAgICAgICAgX2NhbmRpZGF0ZSA9IGNsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVlcnkgcmVzdWx0IGNsYXNzLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFJlc3VsdFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfcmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSByZXN1bHQgY2xhc3MsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHRUeXBlKENsYXNzIGNscykgeworICAgICAgICBfcmVzID0gY2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcXVlcnkgbGFuZ3VhZ2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIF9sYW5ndWFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxhbmd1YWdlIGZvciB0aGlzIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICBfbGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZnVsbCBxdWVyeSBzdHJpbmcsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmdWxsIHF1ZXJ5IHN0cmluZywgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSkgeworICAgICAgICBfcXVlcnkgPSBxdWVyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBoaW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGludEtleXMoKSB7CisgICAgICAgIHJldHVybiAoX2hpbnRLZXlzID09IG51bGwpID8gRU1QVFlfS0VZUworICAgICAgICAgICAgOiAoU3RyaW5nW10pIF9oaW50S2V5cy50b0FycmF5KG5ldyBTdHJpbmdbX2hpbnRLZXlzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGhpbnRzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRIaW50VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gKF9oaW50VmFscyA9PSBudWxsKSA/IEVNUFRZX1ZBTFMgOiBfaGludFZhbHMudG9BcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHF1ZXJ5IGhpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSGludChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKF9oaW50S2V5cyA9PSBudWxsKSB7CisgICAgICAgICAgICBfaGludEtleXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgX2hpbnRWYWxzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgfQorICAgICAgICBfaGludEtleXMuYWRkKGtleSk7CisgICAgICAgIF9oaW50VmFscy5hZGQodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZ05hbWUoKSB7CisgICAgICAgIHJldHVybiBfcmVzdWx0U2V0TWFwcGluZ05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZ05hbWUoU3RyaW5nIHNldE1hcHBpbmdOYW1lKSB7CisgICAgICAgIF9yZXN1bHRTZXRNYXBwaW5nTmFtZSA9IHNldE1hcHBpbmdOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgcXVlcnkgdGVtcGxhdGUgaW5mb3JtYXRpb24gaW50byB0aGUgZ2l2ZW4gY29uY3JldGUKKyAgICAgKiBxdWVyeSBpbnN0YW5jZS4gSG93ZXZlciwgdGhlIGxhbmd1YWdlLCBxdWVyeSBzdHJpbmcsIGFuZAorICAgICAqIGNhbmRpZGF0ZSBjbGFzcyBhcmUgYXNzdW1lZCB0byBiZSBkZWNsYXJlZCBpbiB0aGUgcXVlcnkKKyAgICAgKiBpbnN0YW50aWF0aW9uLCBhbmQgaGludHMgYXJlIG5vdCB0cmFuc2ZlcnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRvKFF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIGlmIChfY2FuZGlkYXRlICE9IG51bGwpCisgICAgICAgICAgICBxdWVyeS5zZXRDYW5kaWRhdGVUeXBlKF9jYW5kaWRhdGUsIHRydWUpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoX3F1ZXJ5KSkKKyAgICAgICAgICAgIHF1ZXJ5LnNldFF1ZXJ5KF9xdWVyeSk7CisgICAgICAgIGlmIChfcmVzICE9IG51bGwpCisgICAgICAgICAgICBxdWVyeS5zZXRSZXN1bHRUeXBlKF9yZXMpOworICAgICAgICBpZiAoX3JlYWRPbmx5ICE9IG51bGwpCisgICAgICAgICAgICBxdWVyeS5zZXRSZWFkT25seShfcmVhZE9ubHkuYm9vbGVhblZhbHVlKCkpOworICAgICAgICBpZiAoX3Jlc3VsdFNldE1hcHBpbmdOYW1lICE9IG51bGwpCisgICAgICAgICAgICBxdWVyeS5zZXRSZXN1bHRNYXBwaW5nKG51bGwsIF9yZXN1bHRTZXRNYXBwaW5nTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlIGZyb20gdGhlIHZhbHVlcyBoZWxkIGluIHRoZQorICAgICAqIHNwZWNpZmllZCB7QGxpbmsgUXVlcnl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgX2xhbmd1YWdlID0gcXVlcnkuZ2V0TGFuZ3VhZ2UoKTsKKyAgICAgICAgX2NhbmRpZGF0ZSA9IHF1ZXJ5LmdldENhbmRpZGF0ZVR5cGUoKTsKKyAgICAgICAgX3JlcyA9IHF1ZXJ5LmdldFJlc3VsdFR5cGUoKTsKKyAgICAgICAgX3F1ZXJ5ID0gcXVlcnkuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIG1vZGUgb2YgdGhpcyBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvdXJjZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBfbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIG1vZGUgb2YgdGhpcyBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VNb2RlKGludCBtb2RlKSB7CisgICAgICAgIF9tb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29tbWVudGFibGUKKyAgICAvLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIChfY29tbWVudHMgPT0gbnVsbCkgPyBFTVBUWV9DT01NRU5UUyA6IF9jb21tZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50cyhTdHJpbmdbXSBjb21tZW50cykgeworICAgICAgICBfY29tbWVudHMgPSBjb21tZW50czsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNvdXJjZVRyYWNrZXIgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWxlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBfc2NvcGU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTb3VyY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gX3NyY1R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlKEZpbGUgZmlsZSwgT2JqZWN0IHNjb3BlLCBpbnQgc3JjVHlwZSkgeworICAgICAgICBfZmlsZSA9IGZpbGU7CisgICAgICAgIF9zY29wZSA9IHNjb3BlOworICAgICAgICBfc3JjVHlwZSA9IHNyY1R5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAoX2NsYXNzID09IG51bGwpID8gX25hbWUgOiBfY2xhc3MuZ2V0TmFtZSAoKSArICI6IiArIF9uYW1lOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9TZXF1ZW5jZU1ldGFEYXRhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvU2VxdWVuY2VNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2NmZWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvU2VxdWVuY2VNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuU2VxVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5QbHVnaW5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuU291cmNlVHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuQ29tbWVudGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKKworLyoqCisgKiBNZXRhZGF0YSBhYm91dCBhIG5hbWVkIHNlcXVlbmNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbmNlTWV0YURhdGEKKyAgICBpbXBsZW1lbnRzIFNvdXJjZVRyYWNrZXIsIE1ldGFEYXRhQ29udGV4dCwgQ2xvc2VhYmxlLCBDb21tZW50YWJsZSwKKyAgICBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogU2VxdWVuY2UgbmFtZSB0aGF0IG1lYW5zIHRvIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TWVNURU0gPSAic3lzdGVtIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcGx1Z2luIGFsaWFzIG5hbWU7IGV2ZXJ5IGJhY2sgZW5kIHNob3VsZCBoYXZlIHNvbWUgJ25hdGl2ZScKKyAgICAgKiBzZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMX05BVElWRSA9ICJuYXRpdmUiOworCisgICAgLyoqCisgICAgICogVGltZS1iYXNlZCBzZXF1ZW5jZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTF9USU1FID0gInRpbWUiOworCisgICAgLy8gcGx1Z2luIHByb3BlcnR5IG5hbWVzIGZvciBzdGFuZGFyZCBwcm9wcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NFUVVFTkNFID0gIlNlcXVlbmNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTklUSUFMX1ZBTFVFID0gIkluaXRpYWxWYWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQUxMT0NBVEUgPSAiQWxsb2NhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOQ1JFTUVOVCA9ICJJbmNyZW1lbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU2VxdWVuY2VNZXRhRGF0YS5jbGFzcyk7CisKKyAgICBwcml2YXRlIE1ldGFEYXRhUmVwb3NpdG9yeSBfcmVwb3M7CisgICAgcHJpdmF0ZSBTZXF1ZW5jZUZhY3RvcnkgX2ZhY3RvcnkgPSBudWxsOworICAgIAorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lOworICAgIHByaXZhdGUgaW50IF90eXBlID0gU2VxLlRZUEVfREVGQVVMVDsKKyAgICBwcml2YXRlIFN0cmluZyBfcGx1Z2luID0gSU1QTF9OQVRJVkU7CisgICAgcHJpdmF0ZSBGaWxlIF9zb3VyY2UgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0IF9zY29wZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX3NyY1R5cGUgPSBTUkNfT1RIRVI7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBfY29tbWVudHMgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9zZXF1ZW5jZSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2luY3JlbWVudCA9IC0xOworICAgIHByaXZhdGUgaW50IF9hbGxvY2F0ZSA9IC0xOworICAgIHByaXZhdGUgaW50IF9pbml0aWFsID0gLTE7CisKKyAgICAvLyBpbnN0YW50aWF0ZWQgbGF6aWx5CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VxIF9pbnN0YW5jZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IHNlcXVlbmNlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFNlcXVlbmNlTWV0YURhdGEoU3RyaW5nIG5hbWUsIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgIF9yZXBvcyA9IHJlcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvd25pbmcgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiBfcmVwb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcXVlbmNlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2VTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNvdXJjZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfc3JjVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoRmlsZSBmaWxlLCBPYmplY3Qgc2NvcGUsIGludCBzcmNUeXBlKSB7CisgICAgICAgIF9zb3VyY2UgPSBmaWxlOworICAgICAgICBfc2NvcGUgPSBzY29wZTsKKyAgICAgICAgX3NyY1R5cGUgPSBzcmNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcXVlbmNlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gX3R5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcXVlbmNlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmF0aXZlIHNlcXVlbmNlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zZXF1ZW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYXRpdmUgc2VxdWVuY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZShTdHJpbmcgc2VxdWVuY2UpIHsKKyAgICAgICAgX3NlcXVlbmNlID0gc2VxdWVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VxdWVuY2UgaW5jcmVtZW50LCBvciAtMSBmb3IgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluY3JlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9pbmNyZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VxdWVuY2UgaW5jcmVtZW50LCBvciAtMSBmb3IgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnQoaW50IGluY3JlbWVudCkgeworICAgICAgICBfaW5jcmVtZW50ID0gaW5jcmVtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcXVlbmNlIHZhbHVlcyB0byBhbGxvY2F0ZSwgb3IgLTEgZm9yIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBbGxvY2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9hbGxvY2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXF1ZW5jZSB2YWx1ZXMgdG8gYWxsb2NhdGUsIG9yIC0xIGZvciBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsbG9jYXRlKGludCBhbGxvY2F0ZSkgeworICAgICAgICBfYWxsb2NhdGUgPSBhbGxvY2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsIHNlcXVlbmNlIHZhbHVlLCBvciAtMSBmb3IgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluaXRpYWxWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9pbml0aWFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWwgc2VxdWVuY2UgdmFsdWUsIG9yIC0xIGZvciBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShpbnQgaW5pdGlhbCkgeworICAgICAgICBfaW5pdGlhbCA9IGluaXRpYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGx1Z2luIHN0cmluZyBkZXNjcmliaW5nIHRoZSB7QGxpbmsgU2VxfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlUGx1Z2luKCkgeworICAgICAgICByZXR1cm4gX3BsdWdpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQbHVnaW4gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHtAbGluayBTZXF9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcXVlbmNlUGx1Z2luKFN0cmluZyBwbHVnaW4pIHsKKyAgICAgICAgX3BsdWdpbiA9IHBsdWdpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGZhY3RvcnkgdG8gdHJhbnNmb3JtIHNwZWMgc2VxdWVuY2VzIHByb2R1Y2VkIGJ5IHVzZXIgZmFjdG9yaWVzIGludG8KKyAgICAgKiB0aGUgT3BlbkpQQSBzZXF1ZW5jZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTZXF1ZW5jZUZhY3RvcnkgZ2V0U2VxdWVuY2VGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gX2ZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYWN0b3J5IHRvIHRyYW5zZm9ybSBzcGVjIHNlcXVlbmNlcyBwcm9kdWNlZCBieSB1c2VyIGZhY3RvcmllcyBpbnRvCisgICAgICogdGhlIE9wZW5KUEEgc2VxdWVuY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUZhY3RvcnkoU2VxdWVuY2VGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgX2ZhY3RvcnkgPSBmYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5pdGlhbGl6ZWQgc2VxdWVuY2UgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXEgZ2V0SW5zdGFuY2UoQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKKyAgICAgICAgICAgIF9pbnN0YW5jZSA9IGluc3RhbnRpYXRlKGVudkxvYWRlcik7CisgICAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHVuaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgdGhpcyBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VxIGluc3RhbnRpYXRlKENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICBpZiAoTkFNRV9TWVNURU0uZXF1YWxzKF9uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBfcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNlcXVlbmNlSW5zdGFuY2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGx1Z2luVmFsdWUgcGx1Z2luID0gbmV3UGx1Z2luVmFsdWUoInNlcXVlbmNlLXBsdWdpbiIpOworICAgICAgICAgICAgcGx1Z2luLnNldFN0cmluZyhfcGx1Z2luKTsKKyAgICAgICAgICAgIFN0cmluZyBjbHNOYW1lID0gcGx1Z2luLmdldENsYXNzTmFtZSgpOworCisgICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsc05hbWUsIHRydWUsCisgICAgICAgICAgICAgICAgU2VxLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHByb3BzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaWYgKHBsdWdpbi5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm9wcy5hcHBlbmQocGx1Z2luLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgICAgICBhZGRTdGFuZGFyZFByb3BlcnRpZXMocHJvcHMpOworCisgICAgICAgICAgICAvLyBhbGxvdyB1c2VyLWNsYXNzIHNwZWNpZmljYXRpb24gb2YgZWl0aGVyIG91ciBzZXF1ZW5jZQorICAgICAgICAgICAgLy8gaW50ZXJmYWNlIG9yIGEgZmFjdG9yeSBjbGFzcworICAgICAgICAgICAgU2VxIHNlcTsKKyAgICAgICAgICAgIGlmIChTZXEuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7CisgICAgICAgICAgICAgICAgc2VxID0gKFNlcSkgY2xzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2Uoc2VxLAorICAgICAgICAgICAgICAgICAgICBfcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLCBwcm9wcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzZXEuc2V0VHlwZShfdHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9mYWN0b3J5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VxID0gX2ZhY3RvcnkudG9TZXF1ZW5jZShjbHMsIHByb3BzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LXNlcS1jbHMiLCBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY2xzKSk7CisgICAgICAgICAgICByZXR1cm4gc2VxOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1pbml0LXNlcSIsIF9uYW1lKSkuCisgICAgICAgICAgICAgICAgc2V0Q2F1c2UoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIHZhbHVlIGZvciBzZXF1ZW5jZXMuIFJldHVybnMgYSBzdGFuZGFyZAorICAgICAqIHtAbGluayBTZXFWYWx1ZX0gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGx1Z2luVmFsdWUgbmV3UGx1Z2luVmFsdWUoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBuZXcgU2VxVmFsdWUocHJvcGVydHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBzdGFuZGFyZCBwcm9wZXJ0aWVzIHRvIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGFuZGFyZFByb3BlcnRpZXMoU3RyaW5nQnVmZmVyIHByb3BzKSB7CisgICAgICAgIGFwcGVuZFByb3BlcnR5KHByb3BzLCBQUk9QX1NFUVVFTkNFLCBfc2VxdWVuY2UpOworICAgICAgICBhcHBlbmRQcm9wZXJ0eShwcm9wcywgUFJPUF9JTklUSUFMX1ZBTFVFLCBfaW5pdGlhbCk7CisgICAgICAgIGFwcGVuZFByb3BlcnR5KHByb3BzLCBQUk9QX0FMTE9DQVRFLCBfYWxsb2NhdGUpOworICAgICAgICBhcHBlbmRQcm9wZXJ0eShwcm9wcywgUFJPUF9JTkNSRU1FTlQsIF9pbmNyZW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHN0cmluZyBwcm9wZXJ0eSB0byB0aGUgYnVmZmVyLiBOb3RoaW5nIHdpbGwgYmUgYWRkZWQgaWYgdmFsdWUKKyAgICAgKiBpcyBudWxsIG9yIGVtcHR5IHN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRQcm9wZXJ0eShTdHJpbmdCdWZmZXIgcHJvcHMsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsKSB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcm9wcy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIiwiKTsKKyAgICAgICAgcHJvcHMuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPSIpLmFwcGVuZCh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbnQgcHJvcGVydHkgdG8gdGhlIGJ1ZmZlci4gTm90aGluZyB3aWxsIGJlIGFkZGVkIGlmIHZhbHVlIGlzIC0xLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFByb3BlcnR5KFN0cmluZ0J1ZmZlciBwcm9wcywgU3RyaW5nIG5hbWUsIGludCB2YWwpIHsKKyAgICAgICAgaWYgKHZhbCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHByb3BzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZCgiLCIpOworICAgICAgICBwcm9wcy5hcHBlbmQobmFtZSkuYXBwZW5kKCI9IikuYXBwZW5kKHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdXNlciBzZXF1ZW5jZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKF9pbnN0YW5jZSAhPSBudWxsICYmICFOQU1FX1NZU1RFTS5lcXVhbHMoX25hbWUpKQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfaW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbW1lbnRhYmxlCisgICAgLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiAoX2NvbW1lbnRzID09IG51bGwpID8gRU1QVFlfQ09NTUVOVFMgOiBfY29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudHMoU3RyaW5nW10gY29tbWVudHMpIHsKKyAgICAgICAgX2NvbW1lbnRzID0gY29tbWVudHM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFsbG93IGZhY2FkZXMgdG8gc3VwcGx5IGFkYXB0ZXJzIGZyb20gYSBzcGVjIHNlcXVlbmNlIHR5cGUgdG8gdGhlCisgICAgICogT3BlbkpQQSBzZXF1ZW5jZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFNlcXVlbmNlRmFjdG9yeSAKKyAgICAgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2Zvcm0gdGhlIGdpdmVuIGNsYXNzIG5hbWVkIGluIG1ldGFkYXRhIGludG8gYSBzZXF1ZW5jZS4KKyAgICAgICAgICovCisJCXB1YmxpYyBTZXEgdG9TZXF1ZW5jZSAoQ2xhc3MgY2xzLCBTdHJpbmcgcHJvcHMpCisJCQl0aHJvd3MgRXhjZXB0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9VcGRhdGVTdHJhdGVnaWVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvVXBkYXRlU3RyYXRlZ2llcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDA3ODIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvVXBkYXRlU3RyYXRlZ2llcy5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuU3RyaW5nRGlzdGFuY2U7CisKKy8qKgorICogU3RyYXRlZ2llcyBmb3IgcGVyc2lzdGVudCB2YWx1ZSB1cGRhdGVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIFVwZGF0ZVN0cmF0ZWdpZXMgeworCisgICAgLyoqCisgICAgICogTm8gdXBkYXRlIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOworCisgICAgLyoqCisgICAgICogSWdub3JlIHVwZGF0ZXM7IGZpZWxkIGlzIGFsd2F5cyBjb25zaWRlcmVkIGNsZWFuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElHTk9SRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gb24gYXR0ZW1wdCB0byB1cGRhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVFJJQ1QgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoVXBkYXRlU3RyYXRlZ2llcy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBzdHJhdGVneSB0byBhIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShpbnQgc3RyYXRlZ3kpIHsKKyAgICAgICAgc3dpdGNoIChzdHJhdGVneSkgeworICAgICAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgICAgIHJldHVybiAibm9uZSI7CisgICAgICAgICAgICBjYXNlIElHTk9SRToKKyAgICAgICAgICAgICAgICByZXR1cm4gImlnbm9yZSI7CisgICAgICAgICAgICBjYXNlIFJFU1RSSUNUOgorICAgICAgICAgICAgICAgIHJldHVybiAicmVzdHJpY3QiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKHN0cmF0ZWd5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBzdHJhdGVneSBuYW1lIHRvIGl0cyBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDb2RlKFN0cmluZyB2YWwsIE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIGlmICgibm9uZSIuZXF1YWxzKHZhbCkpCisgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgaWYgKCJpZ25vcmUiLmVxdWFscyh2YWwpKQorICAgICAgICAgICAgcmV0dXJuIElHTk9SRTsKKyAgICAgICAgaWYgKCJyZXN0cmljdCIuZXF1YWxzKHZhbCkpCisgICAgICAgICAgICByZXR1cm4gUkVTVFJJQ1Q7CisKKyAgICAgICAgTGlzdCBvcHRzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117ICJub25lIiwgImlnbm9yZSIsICJyZXN0cmljdCIgfSk7CisgICAgICAgIFN0cmluZyBjbG9zZXN0ID0gU3RyaW5nRGlzdGFuY2UuZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2UodmFsLAorICAgICAgICAgICAgb3B0cywgLjVGKTsKKyAgICAgICAgU3RyaW5nIG1zZzsKKyAgICAgICAgaWYgKGNsb3Nlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIG1zZyA9IF9sb2MuZ2V0KCJiYWQtdXBkYXRlLXN0cmF0ZWd5LWhpbnQiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgY29udGV4dCwgdmFsLCBjbG9zZXN0LCBvcHRzIH0pLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXNnID0gX2xvYy5nZXQoImJhZC11cGRhdGUtc3RyYXRlZ3kiLCBjb250ZXh0LCB2YWwsIG9wdHMpCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9WYWx1ZU1ldGFEYXRhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvVmFsdWVNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTdlZjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvVmFsdWVNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogSG9sZHMgbWV0YWRhdGEgb24gYSB2YWx1ZTsgdGhpcyBjb3VsZCBiZSBhIGZpZWxkIHZhbHVlLCBrZXkgdmFsdWUsIG9yCisgKiBlbGVtZW50IHZhbHVlLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBWYWx1ZU1ldGFEYXRhCisgICAgZXh0ZW5kcyBNZXRhRGF0YUNvbnRleHQsIE1ldGFEYXRhTW9kZXMsIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBjYXNjYWRlZCB0byB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgQ0FTQ0FERV9OT05FID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVyYXRpb24gaXMgaW1tZWRpYXRlbHkgY2FzY2FkZWQgdG8gdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IENBU0NBREVfSU1NRURJQVRFID0gMTsKKworICAgIC8qKgorICAgICAqIFVzZSBhdXRvbWF0aWMgY2FzY2FkZSBiZWhhdmlvci4gUGVyc2lzdGVuY2UtYnktcmVhY2hhYmlsaXR5LAorICAgICAqIGRlbGV0ZS1kZXBlbmRlbnQsIGF0dGFjaC1pZi1kZXRhY2hlZCwgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgQ0FTQ0FERV9BVVRPID0gMjsKKworICAgIC8qKgorICAgICAqIE1hcmtlciB0byBzZXQgb24ge0BsaW5rICNzZXRWYWx1ZU1hcHBlZEJ5fSB0byBkZW5vdGUgdGhhdCB0aGUgbWFwIGtleQorICAgICAqIGlzIG1hcHBlZCBieSB0aGUgcHJpbWFyeSBrZXkgZmllbGQgb2YgdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9QSyA9ICJgcGtgIjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3duaW5nIGZpZWxkIGZvciB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhIGdldEZpZWxkTWV0YURhdGEoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3MgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBjb2RlIG9mIHRoZSB2YWx1ZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGVDb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBjb2RlIG9mIHRoZSB2YWx1ZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlQ29kZShpbnQgY29kZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSB0eXBlIGlzIGEgcGVyc2lzdGVuY2UgY2FwYWJsZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVQQygpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhIGZvciB0aGUgdmFsdWUgY2xhc3MsIGlmIHRoZSB0eXBlIGlzIHBlcnNpc3RlbnQuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0VHlwZU1ldGFEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGNsYXNzIG9mIHRoZSB2YWx1ZS4gVGhpcyBjYW4gZGlmZmVyCisgICAgICogZnJvbSB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayAjZ2V0VHlwZX0gaWYgdGhlIHVzZXIgaW5kaWNhdGVzCisgICAgICogYSBkaWZmZXJlbnQgdHlwZSBvciB0aGUgdmFsdWUgaGFzIGFuIGV4dGVybmFsaXplci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGVjbGFyZWRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlY2xhcmVkIGNsYXNzIG9mIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWNsYXJlZFR5cGUoQ2xhc3MgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIHR5cGUgY29kZSBvZiB0aGUgdmFsdWUuIFRoaXMgY2FuIGRpZmZlcgorICAgICAqIGZyb20gdGhlIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgI2dldFR5cGVDb2RlfSBpZiB0aGUgdXNlciBpbmRpY2F0ZXMKKyAgICAgKiBhIGRpZmZlcmVudCB0eXBlIG9yIHRoZSB2YWx1ZSBoYXMgYW4gZXh0ZXJuYWxpemVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRUeXBlQ29kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0eXBlIGNvZGUgZm9yIHRoZSB2YWx1ZS4gVGhlIHR5cGUgY29kZSBpcyB1c3VhbGx5CisgICAgICogY29tcHV0ZWQgYXV0b21hdGljYWxseSwgYnV0IGl0IGNhbiBiZSB1c2VmdWwgdG8gc2V0IGl0IGV4cGxpY2l0bHkKKyAgICAgKiB3aGVuIGNyZWF0aW5nIG1ldGFkYXRhcyBmcm9tIHNjcmF0Y2guCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVjbGFyZWRUeXBlQ29kZShpbnQgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSB0eXBlIGlzIGEgcGVyc2lzdGVuY2UgY2FwYWJsZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY2xhcmVkVHlwZVBDKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbWV0YWRhdGEgZm9yIHRoZSB2YWx1ZSdzIGNsYXNzLCBpZiB0aGUgdHlwZSBpcyBwZXJzaXN0ZW50LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldERlY2xhcmVkVHlwZU1ldGFEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBhIGhpbnQgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvIHN0b3JlIHRoaXMgdmFsdWUKKyAgICAgKiBpbiB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIGNsYXNzLCByYXRoZXIgdGhhbiBhcyBhIHNlcGFyYXRlIGRhdGFzdG9yZQorICAgICAqIHN0cnVjdHVyZS4gRGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgbm90IGEgY29sbGVjdGlvbiBvciBtYXAKKyAgICAgKiBvciBwZXJzaXN0ZW5jZS1jYXBhYmxlIG9iamVjdDsgZGVmYXVsdHMgdG8gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEltcGxlbWVudGF0aW9ucyBhcmUgcGVybWl0dGVkIHRvIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBhIGhpbnQgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvIHN0b3JlIHRoaXMgdmFsdWUKKyAgICAgKiBpbiB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIGNsYXNzLCByYXRoZXIgdGhhbiBhcyBhIHNlcGFyYXRlIGRhdGFzdG9yZQorICAgICAqIHN0cnVjdHVyZS4gRGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgbm90IGEgY29sbGVjdGlvbiBvciBtYXAKKyAgICAgKiBvciBwZXJzaXN0ZW5jZS1jYXBhYmxlIG9iamVjdHM7IGRlZmF1bHRzIHRvIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIHBlcm1pdHRlZCB0byBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1iZWRkZWQoYm9vbGVhbiBlbWJlZGRlZCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYW4gZW1iZWRkZWQgcGVyc2lzdGVuY2UgY2FwYWJsZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkUEMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBlbWJlZGRlZCBjbGFzcyBtZXRhZGF0YSBmb3IgdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhIGdldEVtYmVkZGVkTWV0YURhdGEoKTsKKworICAgIC8qKgorICAgICAqIEFkZCBlbWJlZGRlZCBtZXRhZGF0YSBmb3IgdGhpcyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBhZGRFbWJlZGRlZE1ldGFEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBDYXNjYWRlIGJlaGF2aW9yIGZvciBkZWxldGUgb3BlcmF0aW9uLiBPbmx5IGFwcGxpZXMgdG8KKyAgICAgKiBwZXJzaXN0ZW5jZS1jYXBhYmxlIHZhbHVlcy4gT3B0aW9ucyBhcmU6PGJyIC8+CisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5DQVNDQURFX05PTkU8L2NvZGU+OiBObyBjYXNjYWRlcy48L2xpPgorICAgICAqIDxsaT48Y29kZT5DQVNDQURFX0lNTUVESUFURTwvY29kZT46IFZhbHVlIGlzIGRlbGV0ZWQgaW1tZWRpYXRlbHkgd2hlbgorICAgICAqIHRoZSBvd25pbmcgb2JqZWN0IGlzIGRlbGV0ZWQuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+Q0FTQ0FERV9BVVRPPC9jb2RlPjogVmFsdWUgd2lsbCBiZSBkZWxldGVkIG9uIGZsdXNoCisgICAgICogaWYgdGhlIG93bmluZyBvYmplY3QgaXMgZGVsZXRlZCBvciBpZiB0aGUgdmFsdWUgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAqIG93bmluZyBvYmplY3QsIGFuZCBpZiB0aGUgdmFsdWUgaXMgbm90IGFzc2lnbmVkIHRvIGFub3RoZXIgcmVsYXRpb24gaW4KKyAgICAgKiB0aGUgc2FtZSB0cmFuc2FjdGlvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYXNjYWRlRGVsZXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDYXNjYWRlIGJlaGF2aW9yIGZvciBkZWxldGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldENhc2NhZGVEZWxldGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNjYWRlRGVsZXRlKGludCBjYXNjYWRlKTsKKworICAgIC8qKgorICAgICAqIENhc2NhZGUgYmVoYXZpb3IgZm9yIHBlcnNpc3Qgb3BlcmF0aW9uLiBPbmx5IGFwcGxpZXMgdG8KKyAgICAgKiBwZXJzaXN0ZW5jZS1jYXBhYmxlIHZhbHVlcy4gT3B0aW9ucyBhcmU6PGJyIC8+CisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5DQVNDQURFX05PTkU8L2NvZGU+OiBObyBjYXNjYWRlcy4gSWYgYSB0cmFuc2llbnQgcmVsYXRpb24KKyAgICAgKiBpcyBoZWxkIGF0IGZsdXNoLCBhbiBlcnJvciBpcyB0aHJvd24uPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+Q0FTQ0FERV9JTU1FRElBVEU8L2NvZGU+OiBWYWx1ZSBpcyBwZXJzaXN0ZWQgaW1tZWRpYXRlbHkgd2hlbgorICAgICAqIHRoZSBvd25pbmcgb2JqZWN0IGlzIHBlcnNpc3RlZC48L2xpPgorICAgICAqIDxsaT48Y29kZT5DQVNDQURFX0FVVE88L2NvZGU+OiBWYWx1ZSB3aWxsIGJlIHBlcnNpc3RlZCBvbiBmbHVzaC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYXNjYWRlUGVyc2lzdCgpOworCisgICAgLyoqCisgICAgICogQ2FzY2FkZSBiZWhhdmlvciBmb3IgcGVyc2lzdCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDYXNjYWRlUGVyc2lzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGludCBjYXNjYWRlKTsKKworICAgIC8qKgorICAgICAqIENhc2NhZGUgYmVoYXZpb3IgZm9yIGF0dGFjaCBvcGVyYXRpb24uIE9ubHkgYXBwbGllcyB0bworICAgICAqIHBlcnNpc3RlbmNlLWNhcGFibGUgdmFsdWVzLiBPcHRpb25zIGFyZTo8YnIgLz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPkNBU0NBREVfTk9ORTwvY29kZT46IE5vIGNhc2NhZGVzIG9mIGF0dGFjaC4gUmVsYXRpb24KKyAgICAgKiByZW1haW5zIGRldGFjaGVkLjwvbGk+CisgICAgICogPGxpPjxjb2RlPkNBU0NBREVfSU1NRURJQVRFPC9jb2RlPjogVmFsdWUgaXMgYXR0YWNoZWQgaW1tZWRpYXRlbHkuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2FzY2FkZUF0dGFjaCgpOworCisgICAgLyoqCisgICAgICogQ2FzY2FkZSBiZWhhdmlvciBmb3IgYXR0YWNoIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldENhc2NhZGVBdHRhY2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNjYWRlQXR0YWNoKGludCBjYXNjYWRlKTsKKworICAgIC8qKgorICAgICAqIENhc2NhZGUgYmVoYXZpb3IgZm9yIHJlZnJlc2ggb3BlcmF0aW9uLiBPbmx5IGFwcGxpZXMgdG8KKyAgICAgKiBwZXJzaXN0ZW5jZS1jYXBhYmxlIHZhbHVlcy4gT3B0aW9ucyBhcmU6PGJyIC8+CisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5DQVNDQURFX05PTkU8L2NvZGU+OiBObyBjYXNjYWRlcyBvZiByZWZyZXNoLjwvbGk+CisgICAgICogPGxpPjxjb2RlPkNBU0NBREVfSU1NRURJQVRFPC9jb2RlPjogUGVyc2lzdGVudCB2YWx1ZSBvYmplY3QgaXMgYWxzbworICAgICAqIHJlZnJlc2hlZC48L2xpPgorICAgICAqIDxsaT48Y29kZT5DQVNDQURFX0FVVE88L2NvZGU+OiBWYWx1ZSB3aWxsIGJlIHJlZnJlc2hlZCBpZiBpdCBpcworICAgICAqIGluIHRoZSBjdXJyZW50IGZldGNoIGdyb3Vwcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYXNjYWRlUmVmcmVzaCgpOworCisgICAgLyoqCisgICAgICogQ2FzY2FkZSBiZWhhdmlvciBmb3IgcmVmcmVzaCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDYXNjYWRlUmVmcmVzaAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2NhZGVSZWZyZXNoKGludCBjYXNjYWRlKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBzZXJpYWxpemVkIHdoZW4gc3RvcmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VyaWFsaXplZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHZhbHVlIGlzIHNlcmlhbGl6ZWQgd2hlbiBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VyaWFsaXplZChib29sZWFuIHNlcmlhbGl6ZWQpOworCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkIHRoYXQgdGhpcyB2YWx1ZSBzaGFyZXMgYSBtYXBwaW5nIHdpdGguIEN1cnJlbnRseSB0aGUgb25seQorICAgICAqIHN1cHBvcnRlZCB1c2UgZm9yIGEgbWFwcGVkLWJ5IHZhbHVlIGlzIHdoZW4gYSBtYXAgZmllbGQga2V5IGlzCisgICAgICogZGV0ZXJtaW5lZCBieSBhIGZpZWxkIG9mIHRoZSBwZXJzaXN0ZW5jZS1jYXBhYmxlIG1hcCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlTWFwcGVkQnkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCB0aGF0IHRoaXMgdmFsdWUgc2hhcmVzIGEgbWFwcGluZyB3aXRoLiBDdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiBzdXBwb3J0ZWQgdXNlIGZvciBhIG1hcHBlZC1ieSB2YWx1ZSBpcyB3aGVuIGEgbWFwIGZpZWxkIGtleSBpcworICAgICAqIGRldGVybWluZWQgYnkgYSBmaWVsZCBvZiB0aGUgcGVyc2lzdGVuY2UtY2FwYWJsZSBtYXAgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVNYXBwZWRCeShTdHJpbmcgbWFwcGVkKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCB0aGF0IHRoaXMgdmFsdWUgc2hhcmVzIGEgbWFwcGluZyB3aXRoLiBDdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiBzdXBwb3J0ZWQgdXNlIGZvciBhIG1hcHBlZC1ieSB2YWx1ZSBpcyB3aGVuIGEgbWFwIGZpZWxkIGtleSBpcworICAgICAqIGRldGVybWluZWQgYnkgYSBmaWVsZCBvZiB0aGUgcGVyc2lzdGVuY2UtY2FwYWJsZSBtYXAgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0VmFsdWVNYXBwZWRCeU1ldGFEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VyLXN1cHBsaWVkIHR5cGUgb3ZlcnJpZGluZyBhc3N1bWVkIHR5cGUgYmFzZWQgb24gZmllbGQuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGVPdmVycmlkZSgpOworCisgICAgLyoqCisgICAgICogVXNlci1zdXBwbGllZCB0eXBlIG92ZXJyaWRpbmcgYXNzdW1lZCB0eXBlIGJhc2VkIG9uIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVPdmVycmlkZShDbGFzcyB0eXBlKTsKKworICAgIC8qKgorICAgICAqIFJlc29sdmUgbW9kZSBmb3IgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNvbHZlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIG1vZGUgZm9yIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmUoaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBtb2RlIGZvciBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlKGludCBtb2RlLCBib29sZWFuIG9uKTsKKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYW5kIHZhbGlkYXRlIG1ldGFkYXRhLiBSZXR1cm4gdHJ1ZSBpZiBhbHJlYWR5IHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc29sdmUoaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogQ29weSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGlzIG9uZS4gRG8gbm90IGNvcHkgbWFwcGluZworICAgICAqIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHkoVmFsdWVNZXRhRGF0YSB2bWQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1ZhbHVlTWV0YURhdGFJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvVmFsdWVNZXRhRGF0YUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNmZTJlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1ZhbHVlTWV0YURhdGFJbXBsLmphdmEKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk1ldGFEYXRhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgVmFsdWVNZXRhRGF0YX0gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFZhbHVlTWV0YURhdGFJbXBsCisgICAgaW1wbGVtZW50cyBWYWx1ZU1ldGFEYXRhIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFZhbHVlTWV0YURhdGFJbXBsLmNsYXNzKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE5vdGU6IGlmIHlvdSBhZGQgYWRkaXRpb25hbCBzdGF0ZSB0aGF0IHNob3VsZCBiZSBjb3BpZWQgdG8KKyAgICAvLyBlbWJlZGRlZCBtZXRhZGF0YSwgbWFrZSBzdXJlIHRvIGFkZCBpdCB0byB0aGUgY29weSgpIG1ldGhvZAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHJpdmF0ZSBGaWVsZE1ldGFEYXRhIF9vd25lcjsKKyAgICBwcml2YXRlIENsYXNzIF9kZWNUeXBlID0gT2JqZWN0LmNsYXNzOworICAgIHByaXZhdGUgaW50IF9kZWNDb2RlID0gSmF2YVR5cGVzLk9CSkVDVDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX2RlY1R5cGVNZXRhID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzIF90eXBlID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfY29kZSA9IEphdmFUeXBlcy5PQkpFQ1Q7CisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIF90eXBlTWV0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBDbGFzcyBfdHlwZU92ZXJyaWRlID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfZGVsZXRlID0gQ0FTQ0FERV9OT05FOworICAgIHByaXZhdGUgaW50IF9wZXJzaXN0ID0gQ0FTQ0FERV9BVVRPOworICAgIHByaXZhdGUgaW50IF9hdHRhY2ggPSBDQVNDQURFX0lNTUVESUFURTsKKyAgICBwcml2YXRlIGludCBfcmVmcmVzaCA9IENBU0NBREVfQVVUTzsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3NlcmlhbGl6ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIEJvb2xlYW4gX2VtYmVkZGVkID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX2VtYmVkZGVkTWV0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX3Jlc01vZGUgPSBNT0RFX05PTkU7CisgICAgcHJpdmF0ZSBTdHJpbmcgX21hcHBlZEJ5ID0gbnVsbDsKKyAgICBwcml2YXRlIEZpZWxkTWV0YURhdGEgX21hcHBlZEJ5TWV0YSA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgVmFsdWVNZXRhRGF0YUltcGwoRmllbGRNZXRhRGF0YSBvd25lcikgeworICAgICAgICBfb3duZXIgPSBvd25lcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHNlcmlhbGl6YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHVlTWV0YURhdGFJbXBsKCkgeworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE1ldGFEYXRhIGdldEZpZWxkTWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfb3duZXI7CisgICAgfQorCisgICAgcHVibGljIE1ldGFEYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgeworICAgICAgICByZXR1cm4gX293bmVyLmdldFJlcG9zaXRvcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChfdHlwZSA9PSBudWxsKSA/IF9kZWNUeXBlIDogX3R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICAgICAgX3R5cGVNZXRhID0gbnVsbDsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFR5cGVDb2RlKEphdmFUeXBlcy5nZXRUeXBlQ29kZSh0eXBlKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIChfdHlwZSA9PSBudWxsKSA/IF9kZWNDb2RlIDogX2NvZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZUNvZGUoaW50IGNvZGUpIHsKKyAgICAgICAgX2NvZGUgPSBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVBDKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuUEMKKyAgICAgICAgICAgIHx8IGdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDX1VOVFlQRUQ7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0VHlwZU1ldGFEYXRhKCkgeworICAgICAgICBpZiAoX3R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXREZWNsYXJlZFR5cGVNZXRhRGF0YSgpOworICAgICAgICBpZiAoX3R5cGVNZXRhID09IG51bGwgJiYgX2NvZGUgPT0gSmF2YVR5cGVzLlBDKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfb3duZXIuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpOworICAgICAgICAgICAgX3R5cGVNZXRhID0gbWV0YS5nZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGEoX3R5cGUsCisgICAgICAgICAgICAgICAgbWV0YS5nZXRFbnZDbGFzc0xvYWRlcigpLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3R5cGVNZXRhOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXREZWNsYXJlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfZGVjVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWNsYXJlZFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBfZGVjVHlwZSA9IHR5cGU7CisgICAgICAgIF9kZWNUeXBlTWV0YSA9IG51bGw7CisgICAgICAgIF9kZWNDb2RlID0gSmF2YVR5cGVzLmdldFR5cGVDb2RlKHR5cGUpOworICAgICAgICBpZiAoX2VtYmVkZGVkTWV0YSAhPSBudWxsKQorICAgICAgICAgICAgX2VtYmVkZGVkTWV0YS5zZXREZXNjcmliZWRUeXBlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRUeXBlQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWNDb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmVkVHlwZUNvZGUoaW50IGNvZGUpIHsKKyAgICAgICAgX2RlY0NvZGUgPSBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVjbGFyZWRUeXBlUEMoKSB7CisgICAgICAgIHJldHVybiBfZGVjQ29kZSA9PSBKYXZhVHlwZXMuUEMgfHwgX2RlY0NvZGUgPT0gSmF2YVR5cGVzLlBDX1VOVFlQRUQ7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0RGVjbGFyZWRUeXBlTWV0YURhdGEoKSB7CisgICAgICAgIGlmIChfZGVjVHlwZU1ldGEgPT0gbnVsbCAmJiBfZGVjQ29kZSA9PSBKYXZhVHlwZXMuUEMpIHsKKyAgICAgICAgICAgIGlmIChpc0VtYmVkZGVkKCkpCisgICAgICAgICAgICAgICAgX2RlY1R5cGVNZXRhID0gZ2V0RW1iZWRkZWRNZXRhRGF0YSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gX293bmVyLmdldERlZmluaW5nTWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICBfZGVjVHlwZU1ldGEgPSBtZXRhLmdldFJlcG9zaXRvcnkoKS5nZXRNZXRhRGF0YShfZGVjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5nZXRFbnZDbGFzc0xvYWRlcigpLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2RlY1R5cGVNZXRhOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWQoKSB7CisgICAgICAgIGlmIChfb3duZXIuZ2V0TWFuYWdlbWVudCgpICE9IF9vd25lci5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9lbWJlZGRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBmaWVsZCBsZWZ0IGFzIGRlZmF1bHQ7IGVtYmVkZGVkIHNldHRpbmcgZGVwZW5kcyBvbiB0eXBlCisgICAgICAgICAgICBzd2l0Y2ggKF9kZWNDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICAgICAgX2VtYmVkZGVkID0gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgX2VtYmVkZGVkID0gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBfZW1iZWRkZWQuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW1iZWRkZWQoYm9vbGVhbiBlbWJlZGRlZCkgeworICAgICAgICBpZiAoZW1iZWRkZWQgJiYgX2VtYmVkZGVkICE9IEJvb2xlYW4uVFJVRSkgeworICAgICAgICAgICAgX2RlY1R5cGVNZXRhID0gbnVsbDsKKyAgICAgICAgICAgIF90eXBlTWV0YSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgX2VtYmVkZGVkID0gKGVtYmVkZGVkKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZFBDKCkgeworICAgICAgICByZXR1cm4gX2RlY0NvZGUgPT0gSmF2YVR5cGVzLlBDICYmIGlzRW1iZWRkZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBnZXRFbWJlZGRlZE1ldGFEYXRhKCkgeworICAgICAgICBpZiAoX2VtYmVkZGVkTWV0YSA9PSBudWxsICYmIGlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgYWRkRW1iZWRkZWRNZXRhRGF0YSgpOworICAgICAgICByZXR1cm4gX2VtYmVkZGVkTWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NNZXRhRGF0YSBhZGRFbWJlZGRlZE1ldGFEYXRhKCkgeworICAgICAgICBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MgPSBfb3duZXIuZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBfZW1iZWRkZWRNZXRhID0gcmVwb3MubmV3RW1iZWRkZWRDbGFzc01ldGFEYXRhKHRoaXMpOworICAgICAgICBfZW1iZWRkZWRNZXRhLnNldERlc2NyaWJlZFR5cGUoX2RlY1R5cGUpOworICAgICAgICByZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKS5nZXREZWZhdWx0cygpLnBvcHVsYXRlKF9lbWJlZGRlZE1ldGEsCisgICAgICAgICAgICBDbGFzc01ldGFEYXRhLkFDQ0VTU19VTktOT1dOKTsKKworICAgICAgICBzZXRFbWJlZGRlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIF9lbWJlZGRlZE1ldGE7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDYXNjYWRlRGVsZXRlKCkgeworICAgICAgICBpZiAoX293bmVyLmdldE1hbmFnZW1lbnQoKSAhPSBGaWVsZE1ldGFEYXRhLk1BTkFHRV9QRVJTSVNURU5UKQorICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfTk9ORTsKKyAgICAgICAgaWYgKGlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfSU1NRURJQVRFOworCisgICAgICAgIHN3aXRjaCAoX2RlbGV0ZSkgeworICAgICAgICAgICAgY2FzZSBDQVNDQURFX05PTkU6CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXIgbWFya3MgdGhlIG93bmluZyBmaWVsZCBkZXBlbmRlbnQgYW5kIHdlIAorICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsaXplIHRvIGEgcGMgdHlwZSwgdGhlbiBiZWNvbWUgZGVwZW5kZW50CisgICAgICAgICAgICAgICAgaWYgKHRoaXMgIT0gX293bmVyLmdldFZhbHVlKCkgJiYgaXNUeXBlUEMoKQorICAgICAgICAgICAgICAgICAgICAmJiAoKFZhbHVlTWV0YURhdGFJbXBsKSBfb3duZXIuZ2V0VmFsdWUoKSkuX2RlbGV0ZQorICAgICAgICAgICAgICAgICAgICA9PSBDQVNDQURFX0FVVE8pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDQVNDQURFX0FVVE87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBU0NBREVfQVVUTzoKKyAgICAgICAgICAgICAgICBpZiAoaXNUeXBlUEMoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfQVVUTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FTQ0FERV9JTU1FRElBVEU6CisgICAgICAgICAgICAgICAgaWYgKGlzRGVjbGFyZWRUeXBlUEMoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfSU1NRURJQVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDQVNDQURFX05PTkU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FzY2FkZURlbGV0ZShpbnQgZGVsZXRlKSB7CisgICAgICAgIF9kZWxldGUgPSBkZWxldGU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDYXNjYWRlUGVyc2lzdCgpIHsKKyAgICAgICAgaWYgKF9vd25lci5nZXRNYW5hZ2VtZW50KCkgIT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgIHJldHVybiBDQVNDQURFX05PTkU7CisgICAgICAgIGlmIChpc0RlY2xhcmVkVHlwZVBDKCkpCisgICAgICAgICAgICByZXR1cm4gX3BlcnNpc3Q7CisgICAgICAgIGlmICghaXNUeXBlUEMoKSkKKyAgICAgICAgICAgIHJldHVybiBDQVNDQURFX05PTkU7CisgICAgICAgIC8vIGlmIG9ubHkgZXh0ZXJuYWxpemVkIHR5cGUgaXMgcGMsIGNhbid0IGNhc2NhZGUgaW1tZWRpYXRlCisgICAgICAgIHJldHVybiAoX3BlcnNpc3QgPT0gQ0FTQ0FERV9JTU1FRElBVEUpID8gQ0FTQ0FERV9BVVRPIDogX3BlcnNpc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoaW50IHBlcnNpc3QpIHsKKyAgICAgICAgX3BlcnNpc3QgPSBwZXJzaXN0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q2FzY2FkZUF0dGFjaCgpIHsKKyAgICAgICAgaWYgKF9vd25lci5nZXRNYW5hZ2VtZW50KCkgIT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfUEVSU0lTVEVOVAorICAgICAgICAgICAgfHwgIWlzRGVjbGFyZWRUeXBlUEMoKSkgLy8gYXR0YWNoIGFjdHMgb24gZGVjbGFyZWQgdHlwZQorICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfTk9ORTsKKyAgICAgICAgaWYgKGlzRW1iZWRkZWRQQygpKQorICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfSU1NRURJQVRFOworICAgICAgICByZXR1cm4gX2F0dGFjaDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNjYWRlQXR0YWNoKGludCBhdHRhY2gpIHsKKyAgICAgICAgaWYgKGF0dGFjaCA9PSBDQVNDQURFX0FVVE8pCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDQVNDQURFX0FVVE8iKTsKKyAgICAgICAgX2F0dGFjaCA9IGF0dGFjaDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENhc2NhZGVSZWZyZXNoKCkgeworICAgICAgICBpZiAoX293bmVyLmdldE1hbmFnZW1lbnQoKSAhPSBGaWVsZE1ldGFEYXRhLk1BTkFHRV9QRVJTSVNURU5UCisgICAgICAgICAgICB8fCAhaXNEZWNsYXJlZFR5cGVQQygpKSAvLyByZWZyZXNoIGFjdHMgb24gZGVjbGFyZWQgdHlwZQorICAgICAgICAgICAgcmV0dXJuIENBU0NBREVfTk9ORTsKKyAgICAgICAgcmV0dXJuIF9yZWZyZXNoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhc2NhZGVSZWZyZXNoKGludCByZWZyZXNoKSB7CisgICAgICAgIF9yZWZyZXNoID0gcmVmcmVzaDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcmlhbGl6ZWQoKSB7CisgICAgICAgIHJldHVybiBfc2VyaWFsaXplZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJpYWxpemVkKGJvb2xlYW4gc2VyaWFsaXplZCkgeworICAgICAgICBfc2VyaWFsaXplZCA9IHNlcmlhbGl6ZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZU1hcHBlZEJ5KCkgeworICAgICAgICBpZiAoX21hcHBlZEJ5ID09IE1BUFBFRF9CWV9QSykgeworICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW5zdGVhZCBvZiBnZXR0aW5nIG1ldGEgZnJvbSBlbGVtZW50IGIvYyB0aGF0CisgICAgICAgICAgICAvLyByZXF1aXJlcyBlbGVtZW50IHRvIGJlIHJlc29sdmVkCisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGEKKyAgICAgICAgICAgICAgICAoX293bmVyLmdldEVsZW1lbnQoKS5nZXRUeXBlKCksIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChtZXRhID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJ2YWwtbm90LXBjIiwgX293bmVyKSk7CisgICAgICAgICAgICBpZiAobWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKCkubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJ2YWwtbm90LW9uZS1wayIsCisgICAgICAgICAgICAgICAgICAgIF9vd25lcikpOworICAgICAgICAgICAgX21hcHBlZEJ5TWV0YSA9IG1ldGEuZ2V0UHJpbWFyeUtleUZpZWxkcygpWzBdOworICAgICAgICAgICAgX21hcHBlZEJ5ID0gX21hcHBlZEJ5TWV0YS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9tYXBwZWRCeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZU1hcHBlZEJ5KFN0cmluZyBtYXBwZWQpIHsKKyAgICAgICAgaWYgKF9vd25lci5nZXRLZXkoKSAhPSB0aGlzICYmIG1hcHBlZCAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm1hcHBlZC1ieS1ub3Qta2V5IiwgdGhpcykpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9tYXBwZWRCeSA9IG1hcHBlZDsKKyAgICAgICAgICAgIF9tYXBwZWRCeU1ldGEgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTWV0YURhdGEgZ2V0VmFsdWVNYXBwZWRCeU1ldGFEYXRhKCkgeworICAgICAgICBpZiAoZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGwgJiYgX21hcHBlZEJ5TWV0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBfb3duZXIuZ2V0RWxlbWVudCgpLmdldFR5cGVNZXRhRGF0YSgpOworICAgICAgICAgICAgRmllbGRNZXRhRGF0YSBmaWVsZCA9IChtZXRhID09IG51bGwpID8gbnVsbAorICAgICAgICAgICAgICAgIDogbWV0YS5nZXRGaWVsZChnZXRWYWx1ZU1hcHBlZEJ5KCkpOworICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1tYXBwZWQtYnkiLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZU1hcHBlZEJ5KCkpKTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJjaXJjLW1hcHBlZC1ieSIsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlTWFwcGVkQnkoKSkpOworICAgICAgICAgICAgX21hcHBlZEJ5TWV0YSA9IGZpZWxkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbWFwcGVkQnlNZXRhOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT3ZlcnJpZGUoKSB7CisgICAgICAgIHJldHVybiBfdHlwZU92ZXJyaWRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVPdmVycmlkZShDbGFzcyB2YWwpIHsKKyAgICAgICAgX3R5cGVPdmVycmlkZSA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgcmV0ID0gX293bmVyLmdldEZ1bGxOYW1lKHRydWUpOworICAgICAgICBpZiAodGhpcyA9PSBfb3duZXIuZ2V0S2V5KCkpCisgICAgICAgICAgICByZXR1cm4gcmV0ICsgIjxrZXk6IiArIF9kZWNUeXBlICsgIj4iOworICAgICAgICBpZiAodGhpcyA9PSBfb3duZXIuZ2V0RWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoX293bmVyLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLk1BUCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0ICsgIjx2YWx1ZToiICsgX2RlY1R5cGUgKyAiPiI7CisgICAgICAgICAgICByZXR1cm4gcmV0ICsgIjxlbGVtZW50OiIgKyBfZGVjVHlwZSArICI+IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0ICsgIjwiICsgX2RlY1R5cGUgKyAiPiI7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gUmVzb2x2ZSBhbmQgdmFsaWRhdGUKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9yZXNNb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmUoaW50IG1vZGUpIHsKKyAgICAgICAgX3Jlc01vZGUgPSBtb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmUoaW50IG1vZGUsIGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9OT05FKQorICAgICAgICAgICAgX3Jlc01vZGUgPSBtb2RlOworICAgICAgICBlbHNlIGlmIChvbikKKyAgICAgICAgICAgIF9yZXNNb2RlIHw9IG1vZGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9yZXNNb2RlICY9IH5tb2RlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlc29sdmUoaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKChfcmVzTW9kZSAmIG1vZGUpID09IG1vZGUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaW50IGN1ciA9IF9yZXNNb2RlOworICAgICAgICBfcmVzTW9kZSB8PSBtb2RlOworCisgICAgICAgIC8vIHdlIG9ubHkgcGVyZm9ybSBhY3Rpb25zIGZvciBtZXRhIG1vZGUKKyAgICAgICAgaWYgKChtb2RlICYgTU9ERV9NRVRBKSA9PSAwIHx8IChjdXIgJiBNT0RFX01FVEEpICE9IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIHR5cGUgZXh0ZW5zaW9uCisgICAgICAgIGludCBjb2RlT3ZlcnJpZGUgPSBKYXZhVHlwZXMuT0JKRUNUOworICAgICAgICBpZiAoX3R5cGVPdmVycmlkZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb2RlT3ZlcnJpZGUgPSBKYXZhVHlwZXMuZ2V0VHlwZUNvZGUoX3R5cGVPdmVycmlkZSk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGV4dGVybmFsaXplciBtZXRob2Qgb3IgdGhpcyB2YWx1ZSBpcyBhIGtleSBvcgorICAgICAgICAgICAgLy8gZWxlbWVudCwgc2V0IG91ciB0eXBlIHRvIHRoZSB0eXBlIGV4dGVuc2lvbjsgb3RoZXJ3aXNlLCB1c2UgdGhlCisgICAgICAgICAgICAvLyB0eXBlIGV4dGVuc2lvbiBhcyBhIGhpbnQgdG8gdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBkZWNsYXJlZAorICAgICAgICAgICAgLy8gdmFsdWUgKGUuZy4gbWFya2luZyBhbiBpbnRlcmZhY2UgYXMgbm9uLXBjKQorICAgICAgICAgICAgaWYgKF9vd25lci5nZXRFeHRlcm5hbGl6ZXJNZXRob2QoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgX293bmVyLmdldFZhbHVlKCkgIT0gdGhpcykgeworICAgICAgICAgICAgICAgIF90eXBlID0gX3R5cGVPdmVycmlkZTsKKyAgICAgICAgICAgICAgICBfY29kZSA9IGNvZGVPdmVycmlkZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX2RlY0NvZGUgPSBjb2RlT3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgaWYgKEphdmFUeXBlcy5tYXliZVBDKGNvZGVPdmVycmlkZSwgX3R5cGVPdmVycmlkZSkpCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEZWNsYXJlZFR5cGUoX3R5cGVPdmVycmlkZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzZWUgaWYgYWN0dWFsIHR5cGUgaXMgcGMKKyAgICAgICAgaWYgKEphdmFUeXBlcy5tYXliZVBDKF9jb2RlLCBfdHlwZSkpIHsKKyAgICAgICAgICAgIF90eXBlTWV0YSA9IF9vd25lci5nZXRSZXBvc2l0b3J5KCkuZ2V0TWV0YURhdGEoX3R5cGUsCisgICAgICAgICAgICAgICAgX293bmVyLmdldERlZmluaW5nTWV0YURhdGEoKS5nZXRFbnZDbGFzc0xvYWRlcigpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoX3R5cGVNZXRhICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2NvZGUgPSBKYXZhVHlwZXMuUEM7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBleHRlcm5hbGl6ZXIsIHNldCBvdXIgZGVjbGFyZWQgdHlwZSBjb2RlIHRvIHRoZQorICAgICAgICAvLyBhY3R1YWwgdHlwZSBzbyB0aGF0IHdlIHRyZWF0IHRoZSB2YWx1ZSBjb3JyZWN0bHkgYXQgcnVudGltZQorICAgICAgICAvLyAocGVycyBieSByZWFjaCwgZXRjKQorICAgICAgICBpZiAoX3R5cGVPdmVycmlkZSAhPSBudWxsICYmIF9vd25lci5nZXRFeHRlcm5hbGl6ZXJNZXRob2QoKSA9PSBudWxsCisgICAgICAgICAgICAmJiBfb3duZXIuZ2V0RXh0ZXJuYWxWYWx1ZXMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBjYWNoZSB0aGUgbWV0YWRhdGEgaW1tZWRpYXRlbHkgc2luY2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byBnZXQKKyAgICAgICAgICAgIC8vIGl0IGxhemlseSwgc2luY2Ugd2UncmUgbm90IHJlc2V0dGluZyBfZGVjVHlwZSB0byBfdHlwZQorICAgICAgICAgICAgX2RlY0NvZGUgPSBfY29kZTsKKyAgICAgICAgICAgIF9kZWNUeXBlTWV0YSA9IF90eXBlTWV0YTsKKyAgICAgICAgfSBlbHNlIGlmIChKYXZhVHlwZXMubWF5YmVQQyhfZGVjQ29kZSwgX2RlY1R5cGUpKQorICAgICAgICAgICAgcmVzb2x2ZURlY2xhcmVkVHlwZShfZGVjVHlwZSk7CisKKyAgICAgICAgLy8gcmVzb2x2ZXMgbWFwcGVkIGJ5CisgICAgICAgIGdldFZhbHVlTWFwcGVkQnkoKTsKKworICAgICAgICBDbGFzc01ldGFEYXRhIGVtYmVkID0gZ2V0RW1iZWRkZWRNZXRhRGF0YSgpOworICAgICAgICBpZiAoZW1iZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIGVtYmVkLnJlc29sdmUoTU9ERV9NRVRBKTsKKworICAgICAgICAvLyBvaWQgYXMgcHJpbWFyeSBrZXkgZmllbGQ/CisgICAgICAgIGlmIChfZGVjQ29kZSA9PSBKYXZhVHlwZXMuUEMgJiYgaXNFbWJlZGRlZCgpCisgICAgICAgICAgICAmJiBfb3duZXIuaXNQcmltYXJ5S2V5KCkgJiYgX293bmVyLmdldFZhbHVlKCkgPT0gdGhpcykKKyAgICAgICAgICAgIF9jb2RlID0gX2RlY0NvZGUgPSBKYXZhVHlwZXMuT0lEOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSBkZWNsYXJlZCB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlRGVjbGFyZWRUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gX293bmVyLmdldFJlcG9zaXRvcnkoKS5nZXRNZXRhRGF0YSh0eXBlLAorICAgICAgICAgICAgX293bmVyLmdldERlZmluaW5nTWV0YURhdGEoKS5nZXRFbnZDbGFzc0xvYWRlcigpLCBmYWxzZSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGwpCisgICAgICAgICAgICBfZGVjQ29kZSA9IEphdmFUeXBlcy5QQzsKKyAgICAgICAgaWYgKCFpc0VtYmVkZGVkKCkpCisgICAgICAgICAgICBfZGVjVHlwZU1ldGEgPSBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHkoVmFsdWVNZXRhRGF0YSB2bWQpIHsKKyAgICAgICAgLy8gY29weSBkZWNsYXJlZCB0eXBlcywgYnV0IGlmIE9JRCByZXZlcnQgdG8gUEMgdW50aWwgd2UgcmVzb2x2ZQorICAgICAgICAvLyB0byBPSUQgb3Vyc2VsdmVzCisgICAgICAgIF9kZWNUeXBlID0gdm1kLmdldERlY2xhcmVkVHlwZSgpOworICAgICAgICBfZGVjQ29kZSA9IHZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCk7CisgICAgICAgIGlmIChfZGVjQ29kZSA9PSBKYXZhVHlwZXMuT0lEKQorICAgICAgICAgICAgX2RlY0NvZGUgPSBKYXZhVHlwZXMuUEM7CisKKyAgICAgICAgX2RlbGV0ZSA9IHZtZC5nZXRDYXNjYWRlRGVsZXRlKCk7CisgICAgICAgIF9wZXJzaXN0ID0gdm1kLmdldENhc2NhZGVQZXJzaXN0KCk7CisgICAgICAgIF9hdHRhY2ggPSB2bWQuZ2V0Q2FzY2FkZUF0dGFjaCgpOworICAgICAgICBfcmVmcmVzaCA9IHZtZC5nZXRDYXNjYWRlUmVmcmVzaCgpOworICAgICAgICBfdHlwZU92ZXJyaWRlID0gdm1kLmdldFR5cGVPdmVycmlkZSgpOworICAgICAgICBfc2VyaWFsaXplZCA9IHZtZC5pc1NlcmlhbGl6ZWQoKTsKKyAgICAgICAgaWYgKF9lbWJlZGRlZE1ldGEgIT0gbnVsbCkKKyAgICAgICAgICAgIF9lbWJlZGRlZE1ldGEuc2V0RGVzY3JpYmVkVHlwZSh2bWQuZ2V0RGVjbGFyZWRUeXBlKCkpOworCisgICAgICAgIC8vIGRvbid0IGFsbG93IGNvcHkgdG8gb3ZlcnJpZGUgZW1iZWRkZWQKKyAgICAgICAgaWYgKF9lbWJlZGRlZCA9PSBudWxsKQorICAgICAgICAgICAgc2V0RW1iZWRkZWQodm1kLmlzRW1iZWRkZWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1ZhbHVlU3RyYXRlZ2llcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL1ZhbHVlU3RyYXRlZ2llcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDMzODMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvVmFsdWVTdHJhdGVnaWVzLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLm1ldGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmlkaW1hcC5UcmVlQmlkaU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5TdHJpbmdEaXN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBTdHJhdGVnaWVzIGZvciBwZXJzaXN0ZW50IHZhbHVlIGdlbmVyYXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgVmFsdWVTdHJhdGVnaWVzIHsKKworICAgIC8qKgorICAgICAqIE5vIHZhbHVlIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOworCisgICAgLyoqCisgICAgICogIm5hdGl2ZSIgdmFsdWUgc3RyYXRlZ3kuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFUSVZFID0gMTsKKworICAgIC8qKgorICAgICAqICJzZXF1ZW5jZSIgdmFsdWUgc3RyYXRlZ3kuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAyOworCisgICAgLyoqCisgICAgICogImF1dG9hc3NpZ25lZCIgdmFsdWUgc3RyYXRlZ3kuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT0FTU0lHTiA9IDM7CisKKyAgICAvKioKKyAgICAgKiAiaW5jcmVtZW50IiB2YWx1ZSBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNSRU1FTlQgPSA0OworCisgICAgLyoqCisgICAgICogInV1aWQtc3RyaW5nIiB2YWx1ZSBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVUlEX1NUUklORyA9IDU7CisKKyAgICAvKioKKyAgICAgKiAidXVpZC1oZXgiIHZhbHVlIHN0cmF0ZWd5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVVSURfSEVYID0gNjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFZhbHVlU3RyYXRlZ2llcy5jbGFzcyk7CisKKyAgICAvLyB0YWJsZSBvZiBuYW1lcyBhbmQgc3RyYXRlZ2llcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRyZWVCaWRpTWFwIF9tYXAgPSBuZXcgVHJlZUJpZGlNYXAoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIF9tYXAucHV0KCJub25lIiwgTnVtYmVycy52YWx1ZU9mKE5PTkUpKTsKKyAgICAgICAgX21hcC5wdXQoIm5hdGl2ZSIsIE51bWJlcnMudmFsdWVPZihOQVRJVkUpKTsKKyAgICAgICAgX21hcC5wdXQoInNlcXVlbmNlIiwgTnVtYmVycy52YWx1ZU9mKFNFUVVFTkNFKSk7CisgICAgICAgIF9tYXAucHV0KCJhdXRvYXNzaWduIiwgTnVtYmVycy52YWx1ZU9mKEFVVE9BU1NJR04pKTsKKyAgICAgICAgX21hcC5wdXQoImluY3JlbWVudCIsIE51bWJlcnMudmFsdWVPZihJTkNSRU1FTlQpKTsKKyAgICAgICAgX21hcC5wdXQoInV1aWQtc3RyaW5nIiwgTnVtYmVycy52YWx1ZU9mKFVVSURfU1RSSU5HKSk7CisgICAgICAgIF9tYXAucHV0KCJ1dWlkLWhleCIsIE51bWJlcnMudmFsdWVPZihVVUlEX0hFWCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIHN0cmF0ZWd5IHRvIGEgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGludCBzdHJhdGVneSkgeworICAgICAgICBPYmplY3QgY29kZSA9IE51bWJlcnMudmFsdWVPZihzdHJhdGVneSk7CisgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgX21hcC5nZXRLZXkoY29kZSk7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb2RlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIHN0cmF0ZWd5IG5hbWUgdG8gaXRzIGNvbnN0YW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvZGUoU3RyaW5nIHZhbCwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgICAgIE9iamVjdCBjb2RlID0gX21hcC5nZXQodmFsKTsKKyAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgY29kZSkuaW50VmFsdWUoKTsKKworICAgICAgICAvLyBub3QgYSByZWNvZ25pemVkIHN0cmF0ZWd5OyBjaGVjayBmb3IgdHlwbworICAgICAgICBTdHJpbmcgY2xvc2VzdCA9IFN0cmluZ0Rpc3RhbmNlLmdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlKHZhbCwKKyAgICAgICAgICAgIF9tYXAua2V5U2V0KCksIC41Rik7CisgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgIGlmIChjbG9zZXN0ICE9IG51bGwpCisgICAgICAgICAgICBtc2cgPSBfbG9jLmdldCgiYmFkLXZhbHVlLXN0cmF0ZWd5LWhpbnQiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgY29udGV4dCwgdmFsLCBjbG9zZXN0LCBfbWFwLmtleVNldCgpIH0pLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXNnID0gX2xvYy5nZXQoImJhZC12YWx1ZS1zdHJhdGVneSIsIGNvbnRleHQsIHZhbCwgX21hcC5rZXlTZXQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHN0cmF0ZWd5IGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBydW50aW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRTdXBwb3J0ZWQoaW50IHN0cmF0ZWd5LCBNZXRhRGF0YUNvbnRleHQgY29udGV4dCwKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKyAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiA9IGNvbnRleHQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgYm9vbGVhbiBzdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7CisgICAgICAgICAgICBjYXNlIEFVVE9BU1NJR046CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkID0gY29uZi5zdXBwb3J0ZWRPcHRpb25zKCkuY29udGFpbnMKKyAgICAgICAgICAgICAgICAgICAgKE9wZW5KUEFDb25maWd1cmF0aW9uLk9QVElPTl9WQUxVRV9BVVRPQVNTSUdOKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5DUkVNRU5UOgorICAgICAgICAgICAgICAgIHN1cHBvcnRlZCA9IGNvbmYuc3VwcG9ydGVkT3B0aW9ucygpLmNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgIChPcGVuSlBBQ29uZmlndXJhdGlvbi5PUFRJT05fVkFMVUVfSU5DUkVNRU5UKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFOgorICAgICAgICAgICAgICAgIHN1cHBvcnRlZCA9IGNvbnRleHQgaW5zdGFuY2VvZiBDbGFzc01ldGFEYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghc3VwcG9ydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bnN1cHBvcnRlZC12YWx1ZS1zdHJhdGVneSIsCisgICAgICAgICAgICAgICAgY29udGV4dCwgZ2V0TmFtZShzdHJhdGVneSksIGF0dHJpYnV0ZU5hbWUpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNThmMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9tZXRhL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI5IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQSBNZXRhZGF0YTwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFuIGV4dGVuZGFibGUgZnJhbWV3b3JrIGZvciBwYXJzaW5nIGFuZCBjYWNoaW5nCisgICAgcGVyc2lzdGVuY2UgbWV0YWRhdGEuIFRoZSBtZXRhZGF0YSBjYW4gYmUgYWNjZXNzZWQgYXQgYm90aCBlbmhhbmNlbWVudAorICAgIHRpbWUgYW5kIGF0IHJ1bnRpbWUuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQWJzdHJhY3RDaGFuZ2VUcmFja2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQWJzdHJhY3RDaGFuZ2VUcmFja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMGNjNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9BYnN0cmFjdENoYW5nZVRyYWNrZXIuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0Lk1hcEJhY2tlZFNldDsKKworLyoqCisgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIHRvIGNoYW5nZSB0cmFja2Vycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaGFuZ2VUcmFja2VyCisgICAgaW1wbGVtZW50cyBDaGFuZ2VUcmFja2VyIHsKKworICAgIC8qKgorICAgICAqIENvbGxlY3Rpb24gb2YgYWRkZWQgaXRlbXMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIG9mIHJlbW92ZWQgaXRlbXMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIG9mIGNoYW5nZWQgaXRlbXMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGNoYW5nZSA9IG51bGw7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gX2F1dG9PZmYgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfdHJhY2sgPSBmYWxzZTsKKyAgICBwcml2YXRlIEJvb2xlYW4gX2lkZW50aXR5ID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfc2VxID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0Q2hhbmdlVHJhY2tlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RvcCB0cmFja2luZyB3aGVuIHRoZSBudW1iZXIgb2YgY2hhbmdlcworICAgICAqIGV4Y2VlZHMgdGhlIGNvbnRhaW5lciBzaXplLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEF1dG9PZmYoKSB7CisgICAgICAgIHJldHVybiBfYXV0b09mZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RvcCB0cmFja2luZyB3aGVuIHRoZSBudW1iZXIgb2YgY2hhbmdlcworICAgICAqIGV4Y2VlZHMgdGhlIGNvbnRhaW5lciBzaXplLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9PZmYoYm9vbGVhbiBhdXRvT2ZmKSB7CisgICAgICAgIF9hdXRvT2ZmID0gYXV0b09mZjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYWNraW5nKCkgeworICAgICAgICByZXR1cm4gX3RyYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VHJhY2tpbmcoKSB7CisgICAgICAgIF90cmFjayA9IHRydWU7CisgICAgICAgIGlmIChfc2VxID09IC0xKQorICAgICAgICAgICAgX3NlcSA9IGluaXRpYWxTZXF1ZW5jZSgpOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5pdGlhbCBzZXF1ZW5jZSB2YWx1ZSBmb3IgdGhpcyBwcm94eS4gVHlwaWNhbGx5IHRoaXMgaXMKKyAgICAgKiB0aGUgY29udGFpbmVyIHNpemUuIEFzc3VtZXMgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gYnkgZGVmYXVsdCwKKyAgICAgKiByZXR1cm5pbmcgMC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGluaXRpYWxTZXF1ZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcFRyYWNraW5nKCkgeworICAgICAgICBfdHJhY2sgPSBmYWxzZTsKKyAgICAgICAgX3NlcSA9IC0xOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgdHJhY2tlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaWYgKGFkZCAhPSBudWxsKQorICAgICAgICAgICAgYWRkLmNsZWFyKCk7CisgICAgICAgIGlmIChyZW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHJlbS5jbGVhcigpOworICAgICAgICBpZiAoY2hhbmdlICE9IG51bGwpCisgICAgICAgICAgICBjaGFuZ2UuY2xlYXIoKTsKKyAgICAgICAgX2lkZW50aXR5ID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZGRlZCgpIHsKKyAgICAgICAgcmV0dXJuIChhZGQgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogYWRkOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFJlbW92ZWQoKSB7CisgICAgICAgIHJldHVybiAocmVtID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IHJlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGFuZ2VkKCkgeworICAgICAgICByZXR1cm4gKGNoYW5nZSA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBjaGFuZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSB0cmFja2VyIHRoYXQgdGhlIGdpdmVuIG9iamVjdCB3YXMgYWRkZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkZWQoT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAoIV90cmFjaykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc2V0SWRlbnRpdHkodmFsKTsKKyAgICAgICAgYWRkKHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFyayB0aGUgZ2l2ZW4gdmFsdWUgYXMgYWRkZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkKE9iamVjdCB2YWwpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSB0cmFja2VyIHRoYXQgdGhlIGdpdmVuIG9iamVjdCB3YXMgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVkKE9iamVjdCB2YWwpIHsKKyAgICAgICAgaWYgKCFfdHJhY2spCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHNldElkZW50aXR5KHZhbCk7CisgICAgICAgIHJlbW92ZSh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIGdpdmVuIHZhbHVlIGFzIHJlbW92ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVtb3ZlKE9iamVjdCB2YWwpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSB0cmFja2VyIHRoYXQgdGhlIGdpdmVuIG9iamVjdCB3YXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VkKE9iamVjdCB2YWwpIHsKKyAgICAgICAgaWYgKCFfdHJhY2spCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHNldElkZW50aXR5KHZhbCk7CisgICAgICAgIGNoYW5nZSh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIGdpdmVuIHZhbHVlIGFzIGNoYW5nZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2hhbmdlKE9iamVjdCB2YWwpOworCisgICAgcHVibGljIGludCBnZXROZXh0U2VxdWVuY2UoKSB7CisgICAgICAgIHJldHVybiBfc2VxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5leHRTZXF1ZW5jZShpbnQgc2VxKSB7CisgICAgICAgIF9zZXEgPSBzZXE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHNldCBmb3Igc3RvcmluZyBhZGRzL3JlbW92ZXMvY2hhbmdlcy4gVGFrZXMgaW50byBhY2NvdW50CisgICAgICogd2hldGhlciB3ZSBuZWVkIHRvIHVzZSBhbiBpZGVudGl0eSBzZXQgb3Igc3RhbmRhcmQgc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQgbmV3U2V0KCkgeworICAgICAgICBpZiAoX2lkZW50aXR5ID09IEJvb2xlYW4uVFJVRSkKKyAgICAgICAgICAgIHJldHVybiBNYXBCYWNrZWRTZXQuZGVjb3JhdGUobmV3IElkZW50aXR5SGFzaE1hcCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gdXNlIGlkZW50aXR5LWJhc2VkIGRhdGFzdHJ1Y3R1cmVzLCBhbmQgc3dpdGNoIG91ciBjdXJyZW50CisgICAgICogZGF0YXN0cnVjdHVyZXMgYXBwcm9wcmlhdGVseSBpZiBuZWVkZWQuIFdlIHVzZSBpZGVudGl0eSBzdHJ1Y3R1cmVzIGZvcgorICAgICAqIFBDIHR5cGVzIGluIGNhc2UgdGhlIHVzZXIgaGFzIGNvZGVkIHRoZW0gc3VjaCB0aGF0IHR3byBvYmplY3RzIHdpdGgKKyAgICAgKiBkaWZmZXJlbnQgaWRlbnRpdGllcyBjYW4gY29tcGFyZSBlcXVhbHMoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0SWRlbnRpdHkoT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsID09IG51bGwgfHwgX2lkZW50aXR5ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKEltcGxIZWxwZXIuaXNNYW5hZ2VkVHlwZSh2YWwuZ2V0Q2xhc3MoKSkpCisgICAgICAgICAgICBfaWRlbnRpdHkgPSBCb29sZWFuLlRSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9pZGVudGl0eSA9IEJvb2xlYW4uRkFMU0U7CisKKyAgICAgICAgYWRkID0gc3dpdGNoU3RydWN0dXJlKGFkZCwgX2lkZW50aXR5LmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgcmVtID0gc3dpdGNoU3RydWN0dXJlKHJlbSwgX2lkZW50aXR5LmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgY2hhbmdlID0gc3dpdGNoU3RydWN0dXJlKGNoYW5nZSwgX2lkZW50aXR5LmJvb2xlYW5WYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTd2l0Y2ggZnJvbSBhbiBpZGVudGl0eSBzdHJ1Y3R1cmUgdG8gYSBzdGFuZGFyZCBvbmUsIG9yIHZpY2UgdmVyc2EuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBzd2l0Y2hTdHJ1Y3R1cmUoQ29sbGVjdGlvbiBjdXIsCisgICAgICAgIGJvb2xlYW4gaWRlbnRpdHkpIHsKKyAgICAgICAgaWYgKGN1ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChpZGVudGl0eSAmJiBjdXIgaW5zdGFuY2VvZiBIYXNoU2V0KSB7CisgICAgICAgICAgICBpZiAoY3VyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIFNldCByZXBsYWNlID0gTWFwQmFja2VkU2V0LmRlY29yYXRlKG5ldyBJZGVudGl0eUhhc2hNYXAoKSk7CisgICAgICAgICAgICByZXBsYWNlLmFkZEFsbChjdXIpOworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpZGVudGl0eSAmJiAhKGN1ciBpbnN0YW5jZW9mIEhhc2hTZXQpICYmIGN1ciBpbnN0YW5jZW9mIFNldCkgeworICAgICAgICAgICAgaWYgKGN1ci5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQoY3VyKTsKKwkJfQorCQlyZXR1cm4gY3VyOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0Fic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQWJzdHJhY3RMUlNQcm94eUNvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjIzYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0Fic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw0MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkZpbHRlckl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuSXRlcmF0b3JDaGFpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBwcm94eSBkZXNpZ25lZCBmb3IgY29sbGVjdGlvbnMgYmFja2VkIGJ5IGV4dHJlbWVseSBsYXJnZQorICogcmVzdWx0IHNldHMgaW4gd2hpY2ggZWFjaCBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3J9IG1heSBwZXJmb3JtIGEgZGF0YWJhc2UKKyAqIHF1ZXJ5LiBDaGFuZ2VzIHRvIHRoZSBjb2xsZWN0aW9uIGFyZSB0cmFja2VkIHRocm91Z2ggYQorICoge0BsaW5rIENoYW5nZVRyYWNrZXJ9LiBUaGlzIGNvbGxlY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6CisgKiA8dWw+CisgKiA8bGk+VGhlIDxjb2RlPnNpemU8L2NvZGU+IG1ldGhvZCBtYXkgcmV0dXJuIHtAbGluayBJbnRlZ2VyI01BWF9WQUxVRX0uPC9saT4KKyAqIDxsaT5UaGUgY29sbGVjdGlvbiBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uCisgICAgaW1wbGVtZW50cyBTZXQsIExSU1Byb3h5LCBQcmVkaWNhdGUsIENvbGxlY3Rpb25DaGFuZ2VUcmFja2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEFic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uLmNsYXNzKTsKKworICAgIHByaXZhdGUgQ2xhc3MgX2VsZW1lbnRUeXBlID0gbnVsbDsKKyAgICBwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VUcmFja2VySW1wbCBfY3QgPSBudWxsOworICAgIHByaXZhdGUgT3BlbkpQQVN0YXRlTWFuYWdlciBfc20gPSBudWxsOworICAgIHByaXZhdGUgaW50IF9maWVsZCA9IC0xOworICAgIHByaXZhdGUgT3BlbkpQQVN0YXRlTWFuYWdlciBfb3JpZ093bmVyID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfb3JpZ0ZpZWxkID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgX2NvdW50ID0gLTE7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pdGVyYXRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgdGhlIGFsbG93ZWQgdHlwZSBvZiBlbGVtZW50cywgb3IgbnVsbCBmb3Igbm8KKyAgICAgKiByZXN0cmljdGlvbnMKKyAgICAgKiBAcGFyYW0gb3JkZXJlZCB0cnVlIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBvcmRlcmVkCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uKENsYXNzIGVsZW1lbnRUeXBlLCBib29sZWFuIG9yZGVyZWQpIHsKKyAgICAgICAgX2VsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIF9jdCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlckltcGwodGhpcywgZmFsc2UsIG9yZGVyZWQpOworICAgICAgICBfY3Quc2V0QXV0b09mZihmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3duZXIoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IGZpZWxkKSB7CisgICAgICAgIC8vIGNhbid0IHRyYW5zZmVyIG93bmVyc2hpcCBvZiBhbiBscnMgcHJveHkKKyAgICAgICAgaWYgKHNtICE9IG51bGwgJiYgX29yaWdPd25lciAhPSBudWxsCisgICAgICAgICAgICAmJiAoX29yaWdPd25lciAhPSBzbSB8fCBfb3JpZ0ZpZWxkICE9IGZpZWxkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidHJhbnNmZXItbHJzIiwKKyAgICAgICAgICAgICAgICBfb3JpZ093bmVyLmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoX29yaWdGaWVsZCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIF9zbSA9IHNtOworICAgICAgICBfZmllbGQgPSBmaWVsZDsKKworICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIG9yaWdpbmFsIG93bmVyIHNvIHdlIGNhbiBkZXRlY3QgdHJhbnNmZXIgYXR0ZW1wdHMKKyAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9vcmlnT3duZXIgPSBzbTsKKyAgICAgICAgICAgIF9vcmlnRmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBU3RhdGVNYW5hZ2VyIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gX3NtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T3duZXJGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhbmdlVHJhY2tlciBnZXRDaGFuZ2VUcmFja2VyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGNvcHkoT2JqZWN0IG9yaWcpIHsKKyAgICAgICAgLy8gdXNlZCB0byBzdG9yZSBmaWVsZHMgZm9yIHJvbGxiYWNrOyB3ZSBkb24ndCBzdG9yZSBscnMgZmllbGRzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgeworICAgICAgICBQcm94aWVzLmFzc2VydEFsbG93ZWRUeXBlKG8sIF9lbGVtZW50VHlwZSk7CisgICAgICAgIFByb3hpZXMuZGlydHkodGhpcywgZmFsc2UpOworICAgICAgICBfY3QuYWRkZWQobyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGFsbCkgeworICAgICAgICBQcm94aWVzLmRpcnR5KHRoaXMsIGZhbHNlKTsKKyAgICAgICAgYm9vbGVhbiBhZGRlZCA9IGZhbHNlOworICAgICAgICBPYmplY3QgYWRkOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGFsbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYWRkID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgIFByb3hpZXMuYXNzZXJ0QWxsb3dlZFR5cGUoYWRkLCBfZWxlbWVudFR5cGUpOworICAgICAgICAgICAgX2N0LmFkZGVkKGFkZCk7CisgICAgICAgICAgICBhZGRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICBpZiAoIWNvbnRhaW5zKG8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBQcm94aWVzLmRpcnR5KHRoaXMsIGZhbHNlKTsKKyAgICAgICAgUHJveGllcy5yZW1vdmVkKHRoaXMsIG8sIGZhbHNlKTsKKyAgICAgICAgX2N0LnJlbW92ZWQobyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGFsbCkgeworICAgICAgICBQcm94aWVzLmRpcnR5KHRoaXMsIGZhbHNlKTsKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CisgICAgICAgIE9iamVjdCByZW07CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYWxsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICByZW0gPSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKHJlbW92ZShyZW0pKSB7CisgICAgICAgICAgICAgICAgUHJveGllcy5yZW1vdmVkKHRoaXMsIHJlbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIF9jdC5yZW1vdmVkKHJlbSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gYWxsKSB7CisgICAgICAgIGlmIChhbGwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBQcm94aWVzLmRpcnR5KHRoaXMsIGZhbHNlKTsKKyAgICAgICAgSXRyIGl0ciA9IChJdHIpIGl0ZXJhdG9yKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIE9iamVjdCByZW07CisgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJlbSA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFhbGwuY29udGFpbnMocmVtKSkgeworICAgICAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQodGhpcywgcmVtLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIF9jdC5yZW1vdmVkKHJlbSk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZW1vdmVkOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaXRyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgUHJveGllcy5kaXJ0eSh0aGlzLCBmYWxzZSk7CisgICAgICAgIEl0ciBpdHIgPSAoSXRyKSBpdGVyYXRvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHJlbTsKKyAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVtID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQodGhpcywgcmVtLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgX2N0LnJlbW92ZWQocmVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGl0ci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKF9lbGVtZW50VHlwZSAhPSBudWxsICYmICFfZWxlbWVudFR5cGUuaXNJbnN0YW5jZShvKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9jdC5nZXRBZGRlZCgpLmNvbnRhaW5zKG8pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChfY3QuZ2V0UmVtb3ZlZCgpLmNvbnRhaW5zKG8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWhhcyhvKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBhbGwpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBhbGwuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGl0ci5uZXh0KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBhc0xpc3QoKS50b0FycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYSkgeworICAgICAgICByZXR1cm4gYXNMaXN0KCkudG9BcnJheShhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgYXNMaXN0KCkgeworICAgICAgICBJdHIgaXRyID0gKEl0cikgaXRlcmF0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ci5uZXh0KCkpOworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpdHIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaWYgKF9jb3VudCA9PSAtMSkKKyAgICAgICAgICAgIF9jb3VudCA9IGNvdW50KCk7CisgICAgICAgIGlmIChfY291bnQgPT0gSW50ZWdlci5NQVhfVkFMVUUpCisgICAgICAgICAgICByZXR1cm4gX2NvdW50OworICAgICAgICByZXR1cm4gX2NvdW50ICsgX2N0LmdldEFkZGVkKCkuc2l6ZSgpIC0gX2N0LmdldFJlbW92ZWQoKS5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemUoKSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgX2l0ZXJhdGVkID0gdHJ1ZTsKKworICAgICAgICBJdGVyYXRvckNoYWluIGNoYWluID0gbmV3IEl0ZXJhdG9yQ2hhaW4oKTsKKyAgICAgICAgY2hhaW4uYWRkSXRlcmF0b3IobmV3IEZpbHRlckl0ZXJhdG9yKGl0cigpLCB0aGlzKSk7CisKKyAgICAgICAgLy8gbm90ZSBoYXZlIHRvIGNvcHkgX2N0LmdldEFkZGVkIHRvIHByZXZlbnQgY29uY3VycmVudCBtb2QgZXJyb3JzCisgICAgICAgIGNoYWluLmFkZEl0ZXJhdG9yKG5ldyBBcnJheUxpc3QoX2N0LmdldEFkZGVkKCkpLml0ZXJhdG9yKCkpOworICAgICAgICByZXR1cm4gbmV3IEl0cihjaGFpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXNlZCBpbiB0ZXN0aW5nOyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFrZSBzdXJlIHRoYXQgT3BlbkpQQSBkb2VzIG5vdAorICAgICAqIGl0ZXJhdGUgbHJzIGZpZWxkcyBkdXJpbmcgc3RhbmRhcmQgY3J1ZCBvcGVyYXRpb25zCisgICAgICovCisgICAgYm9vbGVhbiBpc0l0ZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gX2l0ZXJhdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVzZWQgaW4gdGVzdGluZzsgd2UgbmVlZCB0byBiZSBhYmxlIHRvIG1ha2Ugc3VyZSB0aGF0IE9wZW5KUEEgZG9lcyBub3QKKyAgICAgKiBpdGVyYXRlIGxycyBmaWVsZHMgZHVyaW5nIHN0YW5kYXJkIGNydWQgb3BlcmF0aW9ucworICAgICAqLworICAgIHZvaWQgc2V0SXRlcmF0ZWQoYm9vbGVhbiBpdCkgeworICAgICAgICBfaXRlcmF0ZWQgPSBpdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHdyaXRlUmVwbGFjZSgpCisgICAgICAgIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXNMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAgKiBjb2xsZWN0aW9uLiBUaGlzIG1ldGhvZCBtYXkgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHJldHVybmVkCisgICAgICogaXRlcmF0b3IgZG9lcyBub3QgaGF2ZSB0byBzdXBwb3J0IHRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlfSBtZXRob2QsCisgICAgICogYW5kIG1heSBpbXBsZW1lbnQge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvciBpdHIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhcyhPYmplY3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiwgb3IKKyAgICAgKiB7QGxpbmsgSW50ZWdlciNNQVhfVkFMVUV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgY291bnQoKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQcmVkaWNhdGUgSW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3QgbykgeworICAgICAgICByZXR1cm4gIV9jdC5nZXRSZW1vdmVkKCkuY29udGFpbnMobyk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXIgSW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhY2tpbmcoKSB7CisgICAgICAgIHJldHVybiBfY3QuaXNUcmFja2luZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VHJhY2tpbmcoKSB7CisgICAgICAgIF9jdC5zdGFydFRyYWNraW5nKCk7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcFRyYWNraW5nKCkgeworICAgICAgICBfY3Quc3RvcFRyYWNraW5nKCk7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworICAgICAgICBpZiAoX2NvdW50ICE9IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgX2NvdW50ID0gLTE7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWQoKSB7CisgICAgICAgIHJldHVybiBfY3QuZ2V0QWRkZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZW1vdmVkKCkgeworICAgICAgICByZXR1cm4gX2N0LmdldFJlbW92ZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGFuZ2VkKCkgeworICAgICAgICByZXR1cm4gX2N0LmdldENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRlZChPYmplY3QgdmFsKSB7CisgICAgICAgIF9jdC5hZGRlZCh2YWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZWQoT2JqZWN0IHZhbCkgeworICAgICAgICBfY3QucmVtb3ZlZCh2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TmV4dFNlcXVlbmNlKCkgeworICAgICAgICByZXR1cm4gX2N0LmdldE5leHRTZXF1ZW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5leHRTZXF1ZW5jZShpbnQgc2VxKSB7CisgICAgICAgIF9jdC5zZXROZXh0U2VxdWVuY2Uoc2VxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGFyb3VuZCBvdXIgZmlsdGVyaW5nIGl0ZXJhdG9yIGNoYWluLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgSXRyCisgICAgICAgIGltcGxlbWVudHMgSXRlcmF0b3IsIENsb3NlYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QRU4gPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9FTEVNID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMT1NFRCA9IDI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvckNoYWluIF9pdHI7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IF9sYXN0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3N0YXRlID0gT1BFTjsKKworICAgICAgICBwdWJsaWMgSXRyKEl0ZXJhdG9yQ2hhaW4gaXRyKSB7CisgICAgICAgICAgICBfaXRyID0gaXRyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUgPT0gQ0xPU0VEKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgLy8gY2xvc2UgYXV0b21hdGljYWxseSBpZiBubyBtb3JlIGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoIV9pdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZnJlZSgpOworICAgICAgICAgICAgICAgIF9zdGF0ZSA9IExBU1RfRUxFTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUgIT0gT1BFTikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX2xhc3QgPSBfaXRyLm5leHQoKTsKKyAgICAgICAgICAgIHJldHVybiBfbGFzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUgPT0gQ0xPU0VEIHx8IF9sYXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIFByb3hpZXMuZGlydHkoQWJzdHJhY3RMUlNQcm94eUNvbGxlY3Rpb24udGhpcywgZmFsc2UpOworICAgICAgICAgICAgX2N0LnJlbW92ZWQoX2xhc3QpOworICAgICAgICAgICAgUHJveGllcy5yZW1vdmVkKEFic3RyYWN0TFJTUHJveHlDb2xsZWN0aW9uLnRoaXMsIF9sYXN0LCBmYWxzZSk7CisgICAgICAgICAgICBfbGFzdCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgICAgIF9zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmcmVlKCkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZSAhPSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgTGlzdCBpdHJzID0gX2l0ci5nZXRJdGVyYXRvcnMoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0cjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGl0ciA9IChJdGVyYXRvcikgaXRycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ciBpbnN0YW5jZW9mIEZpbHRlckl0ZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICBpdHIgPSAoKEZpbHRlckl0ZXJhdG9yKSBpdHIpLmdldEl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgSW1wbEhlbHBlci5jbG9zZShpdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgICAgICBjbG9zZSgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0Fic3RyYWN0TFJTUHJveHlNYXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9BYnN0cmFjdExSU1Byb3h5TWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5YWY3YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9BYnN0cmFjdExSU1Byb3h5TWFwLmphdmEKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRmlsdGVySXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5JdGVyYXRvckNoYWluOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CisKKy8qKgorICogQSBtYXAgcHJveHkgZGVzaWduZWQgZm9yIG1hcHMgYmFja2VkIGJ5IGV4dHJlbWVseSBsYXJnZSByZXN1bHQgc2V0cyBpbgorICogd2hpY2ggZWFjaCBjYWxsIHRvIHtAbGluayAjZ2V0fSBvciB7QGxpbmsgI2NvbnRhaW5zS2V5fSBtYXkgcGVyZm9ybSBhCisgKiBkYXRhYmFzZSBxdWVyeS4gQ2hhbmdlcyB0byB0aGUgbWFwIGFyZSB0cmFja2VkIHRocm91Z2ggYQorICoge0BsaW5rIENoYW5nZVRyYWNrZXJ9LiBUaGlzIG1hcCBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKyAqIDx1bD4KKyAqIDxsaT5UaGUgPGNvZGU+c2l6ZTwvY29kZT4gbWV0aG9kIG1heSByZXR1cm4ge0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfS48L2xpPgorICogPGxpPk51bGwga2V5cyBhbmQgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExSU1Byb3h5TWFwCisgICAgaW1wbGVtZW50cyBNYXAsIExSU1Byb3h5LCBNYXBDaGFuZ2VUcmFja2VyLCBQcmVkaWNhdGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfS0VZID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9WQUxVRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfRU5UUlkgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQWJzdHJhY3RMUlNQcm94eU1hcC5jbGFzcyk7CisKKyAgICBwcml2YXRlIENsYXNzIF9rZXlUeXBlID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzIF92YWx1ZVR5cGUgPSBudWxsOworICAgIHByaXZhdGUgTWFwQ2hhbmdlVHJhY2tlckltcGwgX2N0ID0gbnVsbDsKKyAgICBwcml2YXRlIE9wZW5KUEFTdGF0ZU1hbmFnZXIgX3NtID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfZmllbGQgPSAtMTsKKyAgICBwcml2YXRlIE9wZW5KUEFTdGF0ZU1hbmFnZXIgX29yaWdPd25lciA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX29yaWdGaWVsZCA9IC0xOworICAgIHByaXZhdGUgTWFwIF9tYXAgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9jb3VudCA9IC0xOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXRlcmF0ZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyBBYnN0cmFjdExSU1Byb3h5TWFwKENsYXNzIGtleVR5cGUsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICBfa2V5VHlwZSA9IGtleVR5cGU7CisgICAgICAgIF92YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgICAgICAgIF9jdCA9IG5ldyBNYXBDaGFuZ2VUcmFja2VySW1wbCh0aGlzKTsKKyAgICAgICAgX2N0LnNldEF1dG9PZmYoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE93bmVyKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIGludCBmaWVsZCkgeworICAgICAgICAvLyBjYW4ndCB0cmFuc2ZlciBvd25lcnNoaXAgb2YgYW4gbHJzIHByb3h5CisgICAgICAgIGlmIChzbSAhPSBudWxsICYmIF9vcmlnT3duZXIgIT0gbnVsbAorICAgICAgICAgICAgJiYgKF9vcmlnT3duZXIgIT0gc20gfHwgX29yaWdGaWVsZCAhPSBmaWVsZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoInRyYW5zZmVyLWxycyIsCisgICAgICAgICAgICAgICAgX29yaWdPd25lci5nZXRNZXRhRGF0YSgpLmdldEZpZWxkKF9vcmlnRmllbGQpKSk7CisgICAgICAgIH0KKworICAgICAgICBfc20gPSBzbTsKKyAgICAgICAgX2ZpZWxkID0gZmllbGQ7CisKKyAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBvcmlnaW5hbCBvd25lciBzbyB3ZSBjYW4gZGV0ZWN0IHRyYW5zZmVyIGF0dGVtcHRzCisgICAgICAgIGlmIChzbSAhPSBudWxsKSB7CisgICAgICAgICAgICBfb3JpZ093bmVyID0gc207CisgICAgICAgICAgICBfb3JpZ0ZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRPd25lcigpIHsKKyAgICAgICAgcmV0dXJuIF9zbTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE93bmVyRmllbGQoKSB7CisgICAgICAgIHJldHVybiBfZmllbGQ7CisgICAgfQorCisgICAgcHVibGljIENoYW5nZVRyYWNrZXIgZ2V0Q2hhbmdlVHJhY2tlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjb3B5KE9iamVjdCBvcmlnKSB7CisgICAgICAgIC8vIHVzZWQgdG8gc3RvcmUgZmllbGRzIGZvciByb2xsYmFjOyB3ZSBkb24ndCBzdG9yZSBscnMgZmllbGRzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVzZWQgaW4gdGVzdGluZzsgd2UgbmVlZCB0byBiZSBhYmxlIHRvIG1ha2Ugc3VyZSB0aGF0IE9wZW5KUEEgZG9lcyBub3QKKyAgICAgKiBpdGVyYXRlIGxycyBmaWVsZHMgZHVyaW5nIHN0YW5kYXJkIGNydWQgb3BlcmF0aW9ucworICAgICAqLworICAgIGJvb2xlYW4gaXNJdGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9pdGVyYXRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1c2VkIGluIHRlc3Rpbmc7IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYWtlIHN1cmUgdGhhdCBPcGVuSlBBIGRvZXMgbm90CisgICAgICogaXRlcmF0ZSBscnMgZmllbGRzIGR1cmluZyBzdGFuZGFyZCBjcnVkIG9wZXJhdGlvbnMKKyAgICAgKi8KKyAgICB2b2lkIHNldEl0ZXJhdGVkKGJvb2xlYW4gaXQpIHsKKyAgICAgICAgX2l0ZXJhdGVkID0gaXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBpZiAoX2NvdW50ID09IC0xKQorICAgICAgICAgICAgX2NvdW50ID0gY291bnQoKTsKKyAgICAgICAgaWYgKF9jb3VudCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIHJldHVybiBfY291bnQ7CisgICAgICAgIHJldHVybiBfY291bnQgKyBfY3QuZ2V0QWRkZWQoKS5zaXplKCkgLSBfY3QuZ2V0UmVtb3ZlZCgpLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gc2l6ZSgpID09IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoX2tleVR5cGUgIT0gbnVsbCAmJiAhX2tleVR5cGUuaXNJbnN0YW5jZShrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX21hcCAhPSBudWxsICYmIF9tYXAuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoX2N0LmdldFRyYWNrS2V5cygpKSB7CisgICAgICAgICAgICBpZiAoX2N0LmdldFJlbW92ZWQoKS5jb250YWlucyhrZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBoYXNLZXkoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlIHRyYWNraW5nOgorICAgICAgICAvLyBpZiB3ZSd2ZSByZW1vdmVkIHZhbHVlcywgd2UgbmVlZCB0byBzZWUgaWYgdGhpcyBrZXkgcmVwcmVzZW50cworICAgICAgICAvLyBhIHJlbW92ZWQgaW5zdGFuY2UuIG90aGVyd2lzZSB3ZSBjYW4gcmVseSBvbiB0aGUgMS0xIGJldHdlZW4KKyAgICAgICAgLy8ga2V5cyBhbmQgdmFsdWVzIHdoZW4gdXNpbmcgdmFsdWUgdHJhY2tpbmcKKyAgICAgICAgaWYgKF9jdC5nZXRSZW1vdmVkKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGhhc0tleShrZXkpOworICAgICAgICByZXR1cm4gZ2V0KGtleSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWwpIHsKKyAgICAgICAgaWYgKF92YWx1ZVR5cGUgIT0gbnVsbCAmJiAhX3ZhbHVlVHlwZS5pc0luc3RhbmNlKHZhbCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChfbWFwICE9IG51bGwgJiYgX21hcC5jb250YWluc1ZhbHVlKHZhbCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCFfY3QuZ2V0VHJhY2tLZXlzKCkpIHsKKyAgICAgICAgICAgIGlmIChfY3QuZ2V0UmVtb3ZlZCgpLmNvbnRhaW5zKHZhbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGhhc1ZhbHVlKHZhbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBrZXkgdHJhY2tpbmcKKyAgICAgICAgQ29sbGVjdGlvbiBrZXlzID0ga2V5cyh2YWwpOworICAgICAgICBpZiAoa2V5cyA9PSBudWxsIHx8IGtleXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBrZXlzLnJlbW92ZUFsbChfY3QuZ2V0UmVtb3ZlZCgpKTsKKyAgICAgICAga2V5cy5yZW1vdmVBbGwoX2N0LmdldENoYW5nZWQoKSk7CisgICAgICAgIHJldHVybiBrZXlzLnNpemUoKSA+IDA7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoX2tleVR5cGUgIT0gbnVsbCAmJiAhX2tleVR5cGUuaXNJbnN0YW5jZShrZXkpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIE9iamVjdCByZXQgPSAoX21hcCA9PSBudWxsKSA/IG51bGwgOiBfbWFwLmdldChrZXkpOworICAgICAgICBpZiAocmV0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoX2N0LmdldFRyYWNrS2V5cygpICYmIF9jdC5nZXRSZW1vdmVkKCkuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBPYmplY3QgdmFsID0gdmFsdWUoa2V5KTsKKyAgICAgICAgaWYgKCFfY3QuZ2V0VHJhY2tLZXlzKCkgJiYgX2N0LmdldFJlbW92ZWQoKS5jb250YWlucyh2YWwpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIFByb3hpZXMuYXNzZXJ0QWxsb3dlZFR5cGUoa2V5LCBfa2V5VHlwZSk7CisgICAgICAgIFByb3hpZXMuYXNzZXJ0QWxsb3dlZFR5cGUodmFsdWUsIF92YWx1ZVR5cGUpOworICAgICAgICBQcm94aWVzLmRpcnR5KHRoaXMsIGZhbHNlKTsKKyAgICAgICAgaWYgKF9tYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIF9tYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBPYmplY3Qgb2xkID0gX21hcC5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIGlmIChvbGQgPT0gbnVsbCAmJiAoIV9jdC5nZXRUcmFja0tleXMoKQorICAgICAgICAgICAgfHwgIV9jdC5nZXRSZW1vdmVkKCkuY29udGFpbnMoa2V5KSkpCisgICAgICAgICAgICBvbGQgPSB2YWx1ZShrZXkpOworICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9jdC5jaGFuZ2VkKGtleSwgb2xkLCB2YWx1ZSk7CisgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQodGhpcywgb2xkLCBmYWxzZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX2N0LmFkZGVkKGtleSwgdmFsdWUpOworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbSkgeworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICBQcm94aWVzLmRpcnR5KHRoaXMsIGZhbHNlKTsKKyAgICAgICAgT2JqZWN0IG9sZCA9IChfbWFwID09IG51bGwpID8gbnVsbCA6IF9tYXAucmVtb3ZlKGtleSk7CisgICAgICAgIGlmIChvbGQgPT0gbnVsbCAmJiAoIV9jdC5nZXRUcmFja0tleXMoKQorICAgICAgICAgICAgfHwgIV9jdC5nZXRSZW1vdmVkKCkuY29udGFpbnMoa2V5KSkpCisgICAgICAgICAgICBvbGQgPSB2YWx1ZShrZXkpOworICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9jdC5yZW1vdmVkKGtleSwgb2xkKTsKKyAgICAgICAgICAgIFByb3hpZXMucmVtb3ZlZCh0aGlzLCBrZXksIHRydWUpOworICAgICAgICAgICAgUHJveGllcy5yZW1vdmVkKHRoaXMsIG9sZCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIFByb3hpZXMuZGlydHkodGhpcywgZmFsc2UpOworICAgICAgICBJdHIgaXRyID0gaXRlcmF0b3IoTU9ERV9FTlRSWSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQodGhpcywgZW50cnkuZ2V0S2V5KCksIHRydWUpOworICAgICAgICAgICAgICAgIFByb3hpZXMucmVtb3ZlZCh0aGlzLCBlbnRyeS5nZXRWYWx1ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgX2N0LnJlbW92ZWQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgaXRyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFNldCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RMUlNQcm94eU1hcC50aGlzLnNpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0TFJTUHJveHlNYXAudGhpcy5yZW1vdmUobykgIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdExSU1Byb3h5TWFwLnRoaXMuaXRlcmF0b3IoTU9ERV9LRVkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdENvbGxlY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0TFJTUHJveHlNYXAudGhpcy5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RMUlNQcm94eU1hcC50aGlzLml0ZXJhdG9yKE1PREVfVkFMVUUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RTZXQoKSB7CisgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0TFJTUHJveHlNYXAudGhpcy5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RMUlNQcm94eU1hcC50aGlzLml0ZXJhdG9yKE1PREVfRU5UUlkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgd3JpdGVSZXBsYWNlKCkKKyAgICAgICAgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIEl0ciBpdHIgPSBpdGVyYXRvcihNT0RFX0VOVFJZKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaXRyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4ga2V5IGV4aXN0cyBpbiB0aGUgbWFwLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhc0tleShPYmplY3Qga2V5KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBleGlzdHMgaW4gdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYXNWYWx1ZShPYmplY3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBrZXlzIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENvbGxlY3Rpb24ga2V5cyhPYmplY3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgdmFsdWUoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVudHJpZXMKKyAgICAgKiBpbiB0aGUgbWFwLiBFYWNoIHJldHVybmVkIG9iamVjdCBtdXN0IGltcGxlbWVudCB0aGUKKyAgICAgKiA8Y29kZT5NYXAuRW50cnk8L2NvZGU+IGludGVyZmFjZS4gVGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUKKyAgICAgKiB0aW1lcy4gVGhlIGl0ZXJhdG9yIGRvZXMgbm90IGhhdmUgdG8gc3VwcG9ydCB0aGUKKyAgICAgKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlfSBtZXRob2QsIGFuZCBtYXkgaW1wbGVtZW50CisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvciBpdHIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hcCwgb3Ige0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGNvdW50KCk7CisKKyAgICBwcml2YXRlIEl0ciBpdGVyYXRvcihpbnQgbW9kZSkgeworICAgICAgICBfaXRlcmF0ZWQgPSB0cnVlOworCisgICAgICAgIC8vIGhhdmUgdG8gY29weSB0aGUgZW50cnkgc2V0IG9mIF9tYXAgdG8gcHJldmVudCBjb25jdXJyZW50IG1vZCBlcnJvcnMKKyAgICAgICAgSXRlcmF0b3JDaGFpbiBjaGFpbiA9IG5ldyBJdGVyYXRvckNoYWluKCk7CisgICAgICAgIGlmIChfbWFwICE9IG51bGwpCisgICAgICAgICAgICBjaGFpbi5hZGRJdGVyYXRvcihuZXcgQXJyYXlMaXN0KF9tYXAuZW50cnlTZXQoKSkuaXRlcmF0b3IoKSk7CisgICAgICAgIGNoYWluLmFkZEl0ZXJhdG9yKG5ldyBGaWx0ZXJJdGVyYXRvcihpdHIoKSwgdGhpcykpOworICAgICAgICByZXR1cm4gbmV3IEl0cihtb2RlLCBjaGFpbik7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFByZWRpY2F0ZSBJbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmopIHsKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgb2JqOworICAgICAgICByZXR1cm4gKF9jdC5nZXRUcmFja0tleXMoKQorICAgICAgICAgICAgJiYgIV9jdC5nZXRSZW1vdmVkKCkuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpCisgICAgICAgICAgICB8fCAoIV9jdC5nZXRUcmFja0tleXMoKQorICAgICAgICAgICAgJiYgIV9jdC5nZXRSZW1vdmVkKCkuY29udGFpbnMoZW50cnkuZ2V0VmFsdWUoKSkpKQorICAgICAgICAgICAgJiYgKF9tYXAgPT0gbnVsbCB8fCAhX21hcC5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gTWFwQ2hhbmdlVHJhY2tlciBJbXBsZW1lbnRhdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYWNraW5nKCkgeworICAgICAgICByZXR1cm4gX2N0LmlzVHJhY2tpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFRyYWNraW5nKCkgeworICAgICAgICBfY3Quc3RhcnRUcmFja2luZygpOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3BUcmFja2luZygpIHsKKyAgICAgICAgX2N0LnN0b3BUcmFja2luZygpOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaWYgKF9tYXAgIT0gbnVsbCkKKyAgICAgICAgICAgIF9tYXAuY2xlYXIoKTsKKyAgICAgICAgaWYgKF9jb3VudCAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIF9jb3VudCA9IC0xOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFRyYWNrS2V5cygpIHsKKyAgICAgICAgcmV0dXJuIF9jdC5nZXRUcmFja0tleXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFja0tleXMoYm9vbGVhbiBrZXlzKSB7CisgICAgICAgIF9jdC5zZXRUcmFja0tleXMoa2V5cyk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWQoKSB7CisgICAgICAgIHJldHVybiBfY3QuZ2V0QWRkZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZW1vdmVkKCkgeworICAgICAgICByZXR1cm4gX2N0LmdldFJlbW92ZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGFuZ2VkKCkgeworICAgICAgICByZXR1cm4gX2N0LmdldENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIF9jdC5hZGRlZChrZXksIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIF9jdC5yZW1vdmVkKGtleSwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkKE9iamVjdCBrZXksIE9iamVjdCBvcmlnLCBPYmplY3QgdmFsKSB7CisgICAgICAgIF9jdC5jaGFuZ2VkKGtleSwgb3JpZywgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5leHRTZXF1ZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jdC5nZXROZXh0U2VxdWVuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0U2VxdWVuY2UoaW50IHNlcSkgeworICAgICAgICBfY3Quc2V0TmV4dFNlcXVlbmNlKHNlcSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcHBlciBhcm91bmQgb3VyIGZpbHRlcmluZyBpdGVyYXRvciBjaGFpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEl0cgorICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhdG9yLCBDbG9zZWFibGUgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUEVOID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfRUxFTSA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTE9TRUQgPSAyOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IF9tb2RlOworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yQ2hhaW4gX2l0cjsKKyAgICAgICAgcHJpdmF0ZSBNYXAuRW50cnkgX2xhc3QgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBfc3RhdGUgPSBPUEVOOworCisgICAgICAgIHB1YmxpYyBJdHIoaW50IG1vZGUsIEl0ZXJhdG9yQ2hhaW4gaXRyKSB7CisgICAgICAgICAgICBfbW9kZSA9IG1vZGU7CisgICAgICAgICAgICBfaXRyID0gaXRyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChfc3RhdGUgIT0gT1BFTikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIGNsb3NlIGF1dG9tYXRpY2FsbHkgaWYgbm8gbW9yZSBlbGVtZW50cworICAgICAgICAgICAgaWYgKCFfaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgICAgICAgICBfc3RhdGUgPSBMQVNUX0VMRU07CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlICE9IE9QRU4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgX2xhc3QgPSAoTWFwLkVudHJ5KSBfaXRyLm5leHQoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoX21vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1PREVfS0VZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xhc3QuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgY2FzZSBNT0RFX1ZBTFVFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xhc3QuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xhc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlID09IENMT1NFRCB8fCBfbGFzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIFByb3hpZXMuZGlydHkoQWJzdHJhY3RMUlNQcm94eU1hcC50aGlzLCBmYWxzZSk7CisgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQoQWJzdHJhY3RMUlNQcm94eU1hcC50aGlzLCBfbGFzdC5nZXRLZXkoKSwgdHJ1ZSk7CisgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQoQWJzdHJhY3RMUlNQcm94eU1hcC50aGlzLCBfbGFzdC5nZXRWYWx1ZSgpLCBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBrZXkgYmVmb3JlIHdlIHJlbW92ZSBpdAorICAgICAgICAgICAgLy8gZnJvbSB0aGUgbWFwLCBzaW5jZSBpbiBKREsgMS4zLSwgdGhlIGFjdCBvZiByZW1vdmluZyBhbiBlbnRyeQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgbWFwIHdpbGwgYWxzbyBudWxsIHRoZSBlbnRyeSdzIHZhbHVlLCB3aGljaCB3b3VsZAorICAgICAgICAgICAgLy8gcmVzdWx0IGluIGluY29ycmVjdGx5IHBhc3NpbmcgYSBudWxsIHRvIHRoZSBjaGFuZ2UgdHJhY2tlcgorICAgICAgICAgICAgT2JqZWN0IGtleSA9IF9sYXN0LmdldEtleSgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gX2xhc3QuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgaWYgKF9tYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfbWFwLnJlbW92ZShrZXkpOworICAgICAgICAgICAgX2N0LnJlbW92ZWQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBfbGFzdCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgICAgIF9zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmcmVlKCkgeworICAgICAgICAgICAgaWYgKF9zdGF0ZSAhPSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgTGlzdCBpdHJzID0gX2l0ci5nZXRJdGVyYXRvcnMoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0cjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGl0ciA9IChJdGVyYXRvcikgaXRycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ciBpbnN0YW5jZW9mIEZpbHRlckl0ZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICBpdHIgPSAoKEZpbHRlckl0ZXJhdG9yKSBpdHIpLmdldEl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgSW1wbEhlbHBlci5jbG9zZShpdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgICAgICBjbG9zZSAoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9BcHBsaWNhdGlvbklkcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0FwcGxpY2F0aW9uSWRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0ZmY4YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9BcHBsaWNhdGlvbklkcy5qYXZhCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5GaWVsZE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUmVmbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9iamVjdElkU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVTdHJhdGVnaWVzOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIG1hbmlwdWxhdGluZyBhcHBsaWNhdGlvbiBvYmplY3QgaWRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbklkcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBcHBsaWNhdGlvbklkcy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByaW1hcnkga2V5IHZhbHVlcyBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZC4gVGhlIHZhbHVlcworICAgICAqIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIG1ldGFkYXRhIHByaW1hcnkga2V5IGZpZWxkcy4KKyAgICAgKiBWYWx1ZXMgZm9yIFBDIHByaW1hcnkga2V5IGZpZWxkcyB3aWxsIGJlIHRoZSBwcmltYXJreSBrZXkgdmFsdWUgb3IKKyAgICAgKiBvaWQgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2UgKGRlcGVuZGluZyBvbiAKKyAgICAgKiB7QGxpbmsgRmllbGRNZXRhRGF0YSNpc09iamVjdElkRmllbGRJZE9mUEN9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIHRvUEtWYWx1ZXMoT2JqZWN0IG9pZCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGlmIChtZXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBPYmplY3RbXSBwa3M7CisgICAgICAgIGlmIChtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpIHsKKyAgICAgICAgICAgIHBrcyA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBpZiAob2lkICE9IG51bGwpCisgICAgICAgICAgICAgICAgcGtzWzBdID0gKChPcGVuSlBBSWQpIG9pZCkuZ2V0SWRPYmplY3QoKTsKKyAgICAgICAgICAgIHJldHVybiBwa3M7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXNldCBvd25pbmcgJ21ldGEnIHRvIHRoZSBvd25lciBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGRzLCBiZWNhdXNlCisgICAgICAgIC8vIHRoZSBvbmUgcGFzc2VkIGluIG1pZ2h0IGJlIGEgcHJveHksIGxpa2UgZm9yIGVtYmVkZGVkIG1hcHBpbmdzOworICAgICAgICAvLyBzaW5jZSBnZXRQcmltYXJ5S2V5RmllbGRzIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBwcmltYXJ5CisgICAgICAgIC8vIGtleXMgaW4gdGhlIG9yZGVyIG9mIGluaGVyaXRhbmNlLCB3ZSBhcmUgZ3VhcmFudGVlZCB0aGF0CisgICAgICAgIC8vIHRoZSBsYXN0IGVsZW1lbnQgd2lsbCBiZSB0aGUgbW9zdC1kZXJpdmVkIGNsYXNzLgorICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0UHJpbWFyeUtleUZpZWxkcygpOworICAgICAgICBtZXRhID0gZm1kc1tmbWRzLmxlbmd0aCAtIDFdLmdldERlY2xhcmluZ01ldGFEYXRhKCk7CisgICAgICAgIHBrcyA9IG5ldyBPYmplY3RbZm1kcy5sZW5ndGhdOworICAgICAgICBpZiAob2lkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcGtzOworCisgICAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIC8vIGNvcHkgZmllbGRzIGZyb20gdGhlIG9pZAorICAgICAgICAgICAgUHJpbWFyeUtleUZpZWxkTWFuYWdlciBjb25zdW1lciA9IG5ldyBQcmltYXJ5S2V5RmllbGRNYW5hZ2VyKCk7CisgICAgICAgICAgICBjb25zdW1lci5zZXRTdG9yZShwa3MpOworICAgICAgICAgICAgUENSZWdpc3RyeS5jb3B5S2V5RmllbGRzRnJvbU9iamVjdElkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLAorICAgICAgICAgICAgICAgIGNvbnN1bWVyLCBvaWQpOworICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVyLmdldFN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWZhdWx0IHRvIHJlZmxlY3Rpb24KKyAgICAgICAgaWYgKG1ldGEuaXNPYmplY3RJZFR5cGVTaGFyZWQoKSkKKyAgICAgICAgICAgIG9pZCA9ICgoT2JqZWN0SWQpIG9pZCkuZ2V0SWQoKTsKKyAgICAgICAgQ2xhc3Mgb2lkVHlwZSA9IG9pZC5nZXRDbGFzcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCkKKyAgICAgICAgICAgICAgICBwa3NbaV0gPSBSZWZsZWN0aW9uLmdldChvaWQsIFJlZmxlY3Rpb24uZmluZEZpZWxkKG9pZFR5cGUsIAorICAgICAgICAgICAgICAgICAgICBmbWRzW2ldLmdldE5hbWUoKSwgdHJ1ZSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBrc1tpXSA9IFJlZmxlY3Rpb24uZ2V0KG9pZCwgUmVmbGVjdGlvbi5maW5kR2V0dGVyKG9pZFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0uZ2V0TmFtZSgpLCB0cnVlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgb2JqZWN0IGlkIGNvbnN0cnVjdGVkIGZyb20gdGhlIGdpdmVuIHByaW1hcnkga2V5IHZhbHVlcy4KKyAgICAgKiBWYWx1ZXMgZm9yIFBDIHByaW1hcnkga2V5IGZpZWxkcyBzaG91bGQgYmUgdGhlIHByaW1hcmt5IGtleSB2YWx1ZSBvcgorICAgICAqIG9pZCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBpbnN0YW5jZSAoZGVwZW5kaW5nIG9uIAorICAgICAqIHtAbGluayBGaWVsZE1ldGFEYXRhI2lzT2JqZWN0SWRGaWVsZElkT2ZQQ30pLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGZyb21QS1ZhbHVlcyhPYmplY3RbXSBwa3MsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAobWV0YSA9PSBudWxsIHx8IHBrcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYm9vbGVhbiBjb252ZXJ0ID0gIW1ldGEuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgIGdldENvbXBhdGliaWxpdHlJbnN0YW5jZSgpLmdldFN0cmljdElkZW50aXR5VmFsdWVzKCk7CisgICAgICAgIGlmIChtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpIHsKKyAgICAgICAgICAgIGludCB0eXBlID0gbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKClbMF0uZ2V0T2JqZWN0SWRGaWVsZFR5cGVDb2RlKCk7CisgICAgICAgICAgICBPYmplY3QgdmFsID0gKGNvbnZlcnQpID8gSmF2YVR5cGVzLmNvbnZlcnQocGtzWzBdLCB0eXBlKSA6IHBrc1swXTsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURV9PQko6CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydCAmJiAhKHZhbCBpbnN0YW5jZW9mIEJ5dGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiISh4IGluc3RhbmNlb2YgQnl0ZSkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlSWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKE51bWJlcikgdmFsKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFySWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKENoYXJhY3RlcikgdmFsKS5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydCAmJiAhKHZhbCBpbnN0YW5jZW9mIERvdWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCIhKHggaW5zdGFuY2VvZiBEb3VibGUpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlSWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKE51bWJlcikgdmFsKS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydCAmJiAhKHZhbCBpbnN0YW5jZW9mIEZsb2F0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIiEoeCBpbnN0YW5jZW9mIEZsb2F0KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0SWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKE51bWJlcikgdmFsKS5mbG9hdFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnQgJiYgISh2YWwgaW5zdGFuY2VvZiBJbnRlZ2VyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIiEoeCBpbnN0YW5jZW9mIEludGVnZXIpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50SWQobWV0YS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKE51bWJlcikgdmFsKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkdfT0JKOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnQgJiYgISh2YWwgaW5zdGFuY2VvZiBMb25nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIiEoeCBpbnN0YW5jZW9mIExvbmcpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ0lkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChOdW1iZXIpIHZhbCkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ICYmICEodmFsIGluc3RhbmNlb2YgU2hvcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiISh4IGluc3RhbmNlb2YgU2hvcnQpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnRJZChtZXRhLmdldERlc2NyaWJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTnVtYmVyKSB2YWwpLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0lkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCAoU3RyaW5nKSB2YWwpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZUlkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCAoRGF0ZSkgdmFsKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PSUQ6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdElkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCB2YWwpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY29weSBwa3MgdG8gb2lkCisgICAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIE9iamVjdCBvaWQgPSBQQ1JlZ2lzdHJ5Lm5ld09iamVjdElkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKyAgICAgICAgICAgIFByaW1hcnlLZXlGaWVsZE1hbmFnZXIgcHJvZHVjZXIgPSBuZXcgUHJpbWFyeUtleUZpZWxkTWFuYWdlcigpOworICAgICAgICAgICAgcHJvZHVjZXIuc2V0U3RvcmUocGtzKTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0KQorICAgICAgICAgICAgICAgIHByb2R1Y2VyLnNldE1ldGFEYXRhKG1ldGEpOworICAgICAgICAgICAgUENSZWdpc3RyeS5jb3B5S2V5RmllbGRzVG9PYmplY3RJZChtZXRhLmdldERlc2NyaWJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICBwcm9kdWNlciwgb2lkKTsKKyAgICAgICAgICAgIHJldHVybiBvaWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWZhdWx0IHRvIHJlZmxlY3Rpb24KKyAgICAgICAgQ2xhc3Mgb2lkVHlwZSA9IG1ldGEuZ2V0T2JqZWN0SWRUeXBlKCk7CisgICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KG9pZFR5cGUuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm9iamVjdGlkLWFic3RyYWN0IiwgbWV0YSkpOworICAgICAgICBPYmplY3QgY29weSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3B5ID0gb2lkVHlwZS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24odCk7CisgICAgICAgIH0KKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0UHJpbWFyeUtleUZpZWxkcygpOworICAgICAgICBPYmplY3QgdmFsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHZhbCA9IChjb252ZXJ0KSA/IEphdmFUeXBlcy5jb252ZXJ0KHBrc1tpXSwKKyAgICAgICAgICAgICAgICBmbWRzW2ldLmdldE9iamVjdElkRmllbGRUeXBlQ29kZSgpKSA6IHBrc1tpXTsKKyAgICAgICAgICAgIGlmIChtZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRCkKKyAgICAgICAgICAgICAgICBSZWZsZWN0aW9uLnNldChjb3B5LCBSZWZsZWN0aW9uLmZpbmRGaWVsZChvaWRUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgZm1kc1tpXS5nZXROYW1lKCksIHRydWUpLCB2YWwpOyAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBSZWZsZWN0aW9uLnNldChjb3B5LCBSZWZsZWN0aW9uLmZpbmRTZXR0ZXIob2lkVHlwZSwgCisgICAgICAgICAgICAgICAgICAgIGZtZHNbaV0uZ2V0TmFtZSgpLCBmbWRzW2ldLmdldERlY2xhcmVkVHlwZSgpLCB0cnVlKSwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhLmlzT2JqZWN0SWRUeXBlU2hhcmVkKCkpCisgICAgICAgICAgICBjb3B5ID0gbmV3IE9iamVjdElkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLCBjb3B5KTsKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSB0aGUgZ2l2ZW4gb2lkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvcHkoT2JqZWN0IG9pZCwgQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIGlmIChtZXRhID09IG51bGwgfHwgb2lkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAobWV0YS5pc09wZW5KUEFJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAvLyB1c2UgbWV0YSB0eXBlIGluc3RlYWQgb2Ygb2lkIHR5cGUgaW4gY2FzZSBpdCdzIGEgc3ViY2xhc3MKKyAgICAgICAgICAgIENsYXNzIGNscyA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICAgICAgT3BlbkpQQUlkIGtvaWQgPSAoT3BlbkpQQUlkKSBvaWQ7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIHBrID0gbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKClbMF07CisgICAgICAgICAgICBzd2l0Y2ggKHBrLmdldE9iamVjdElkRmllbGRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlSWQoY2xzLCAoKEJ5dGVJZCkgb2lkKS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAga29pZC5oYXNTdWJjbGFzc2VzKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcklkKGNscywgKChDaGFySWQpIG9pZCkuZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtvaWQuaGFzU3ViY2xhc3NlcygpKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVJZChjbHMsICgoRG91YmxlSWQpIG9pZCkuZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtvaWQuaGFzU3ViY2xhc3NlcygpKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVF9PQko6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXRJZChjbHMsICgoRmxvYXRJZCkgb2lkKS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAga29pZC5oYXNTdWJjbGFzc2VzKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5JTlRfT0JKOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludElkKGNscywgKChJbnRJZCkgb2lkKS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAga29pZC5oYXNTdWJjbGFzc2VzKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkxPTkc6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ0lkKGNscywgKChMb25nSWQpIG9pZCkuZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtvaWQuaGFzU3ViY2xhc3NlcygpKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnRJZChjbHMsICgoU2hvcnRJZCkgb2lkKS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAga29pZC5oYXNTdWJjbGFzc2VzKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdJZChjbHMsIG9pZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAga29pZC5oYXNTdWJjbGFzc2VzKCkpOworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk9JRDoKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBlbWJlZCA9IHBrLmdldEVtYmVkZGVkTWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGlubmVyID0ga29pZC5nZXRJZE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyID0gY29weShpbm5lciwgZW1iZWQsIGVtYmVkLmdldEZpZWxkcygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RJZChjbHMsIGlubmVyLCBrb2lkLmhhc1N1YmNsYXNzZXMoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdElkKGNscywga29pZC5nZXRJZE9iamVjdCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGtvaWQuaGFzU3ViY2xhc3NlcygpKTsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5EQVRFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVJZChjbHMsICgoRGF0ZUlkKSBvaWQpLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrb2lkLmhhc1N1YmNsYXNzZXMoKSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcGMgaW5zdGFuY2Ugb2YgdGhlIHJpZ2h0IHR5cGUsIHNldCBpdHMga2V5IGZpZWxkcworICAgICAgICAvLyB0byB0aGUgb3JpZ2luYWwgb2lkIHZhbHVlcywgdGhlbiBjb3B5IGl0cyBrZXkgZmllbGRzIHRvIGEgbmV3CisgICAgICAgIC8vIG9pZCBpbnN0YW5jZQorICAgICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QobWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAmJiAhaGFzUENQcmltYXJ5S2V5RmllbGRzKG1ldGEpKSB7CisgICAgICAgICAgICBDbGFzcyB0eXBlID0gbWV0YS5nZXRJbnRlcmZhY2VJbXBsKCk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHR5cGUgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlQ2FwYWJsZSBwYyA9IFBDUmVnaXN0cnkubmV3SW5zdGFuY2UodHlwZSwgbnVsbCwgb2lkLCAKKyAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgT2JqZWN0IGNvcHkgPSBwYy5wY05ld09iamVjdElkSW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHBjLnBjQ29weUtleUZpZWxkc1RvT2JqZWN0SWQoY29weSk7CisgICAgICAgICAgICByZXR1cm4gY29weTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBjb3B5ID0gKCFtZXRhLmlzT2JqZWN0SWRUeXBlU2hhcmVkKCkpID8gb2lkCisgICAgICAgICAgICA6ICgoT2JqZWN0SWQpIG9pZCkuZ2V0SWQoKTsKKyAgICAgICAgY29weSA9IGNvcHkoY29weSwgbWV0YSwgbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKCkpOworICAgICAgICBpZiAobWV0YS5pc09iamVjdElkVHlwZVNoYXJlZCgpKQorICAgICAgICAgICAgY29weSA9IG5ldyBPYmplY3RJZChtZXRhLmdldERlc2NyaWJlZFR5cGUoKSwgY29weSwKKyAgICAgICAgICAgICAgICAoKE9wZW5KUEFJZCkgb2lkKS5oYXNTdWJjbGFzc2VzKCkpOworICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIGdpdmVuIHR5cGUncyBwcmltYXJ5IGtleSBmaWVsZHMgYXJlIAorICAgICAqIHBlcnNpc3RlbnQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1BDUHJpbWFyeUtleUZpZWxkcyhDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBtZXRhLmdldFByaW1hcnlLZXlGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGZtZHNbaV0uZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5QQykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGdpdmVuIGlkZW50aXR5IG9iamVjdCB1c2luZyByZWZsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjb3B5KE9iamVjdCBvaWQsIENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMpIHsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQ2xhc3Mgb2lkVHlwZSA9IG9pZC5nZXRDbGFzcygpOworICAgICAgICBPYmplY3QgY29weSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3B5ID0gb2lkVHlwZS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24odCk7CisgICAgICAgIH0KKworICAgICAgICBGaWVsZCBmaWVsZDsKKyAgICAgICAgT2JqZWN0IHZhbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXRNYW5hZ2VtZW50KCkgIT0gRmllbGRNZXRhRGF0YS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKG1ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKSB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gUmVmbGVjdGlvbi5maW5kRmllbGQob2lkVHlwZSwgZm1kc1tpXS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvbi5zZXQoY29weSwgZmllbGQsIFJlZmxlY3Rpb24uZ2V0KG9pZCwgZmllbGQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBSZWZsZWN0aW9uLmdldChvaWQsIFJlZmxlY3Rpb24uZmluZEdldHRlcihvaWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZm1kc1tpXS5nZXROYW1lKCksIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvbi5zZXQoY29weSwgUmVmbGVjdGlvbi5maW5kU2V0dGVyKG9pZFR5cGUsIGZtZHNbaV0uCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCksIGZtZHNbaV0uZ2V0T2JqZWN0SWRGaWVsZFR5cGUoKSwgdHJ1ZSksIHZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiBwcmltYXJ5IGtleSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBvaWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE9iamVjdCBvaWQsIEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIGlmIChvaWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob2lkIGluc3RhbmNlb2YgT3BlbkpQQUlkKQorICAgICAgICAgICAgcmV0dXJuICgoT3BlbkpQQUlkKSBvaWQpLmdldElkT2JqZWN0KCk7CisKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gZm1kLmdldERlZmluaW5nTWV0YURhdGEoKTsKKyAgICAgICAgQ2xhc3Mgb2lkVHlwZSA9IG9pZC5nZXRDbGFzcygpOworICAgICAgICBpZiAobWV0YS5nZXRBY2Nlc3NUeXBlKCkgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQpCisgICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbi5nZXQob2lkLCBSZWZsZWN0aW9uLmZpbmRGaWVsZChvaWRUeXBlLCAKKyAgICAgICAgICAgICAgICBmbWQuZ2V0TmFtZSgpLCB0cnVlKSk7CisgICAgICAgIHJldHVybiBSZWZsZWN0aW9uLmdldChvaWQsIFJlZmxlY3Rpb24uZmluZEdldHRlcihvaWRUeXBlLCBmbWQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgdHJ1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGFuIGFwcGxpY2F0aW9uIGlkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHByaW1hcnkga2V5IGZpZWxkIHN0YXRlCisgICAgICogb2YgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZShQZXJzaXN0ZW5jZUNhcGFibGUgcGMsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAocGMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIE9iamVjdCBvaWQgPSBwYy5wY05ld09iamVjdElkSW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKCFtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpIHsKKyAgICAgICAgICAgIHBjLnBjQ29weUtleUZpZWxkc1RvT2JqZWN0SWQob2lkKTsKKyAgICAgICAgICAgIHJldHVybiBvaWQ7CisgICAgICAgIH0KKworICAgICAgICBGaWVsZE1ldGFEYXRhIHBrID0gbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKClbMF07CisgICAgICAgIGlmIChway5nZXREZWNsYXJlZFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLk9JRCkKKyAgICAgICAgICAgIHJldHVybiBvaWQ7CisKKyAgICAgICAgLy8gYWx3YXlzIGNvcHkgb2lkIG9iamVjdCBpbiBjYXNlIGZpZWxkIHZhbHVlIG11dGF0ZXMgb3IgYmVjb21lcworICAgICAgICAvLyBtYW5hZ2VkCisgICAgICAgIE9iamVjdElkIG9iamlkID0gKE9iamVjdElkKSBvaWQ7CisgICAgICAgIENsYXNzTWV0YURhdGEgZW1iZWQgPSBway5nZXRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgICAgIG9iamlkLnNldElkKGNvcHkob2JqaWQuZ2V0SWQoKSwgZW1iZWQsIGVtYmVkLmdldEZpZWxkcygpKSk7CisgICAgICAgIHJldHVybiBvYmppZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gYXBwbGljYXRpb24gaWRlbnRpdHkgb2JqZWN0IHRvIHRoZSBnaXZlbiBzdGF0ZSwgb3IgcmV0dXJuCisgICAgICogZmFsc2UgaWYgZGV0ZXJtaW5pbmcgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IHJlcXVpcmVzIGEgZmx1c2guCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFzc2lnbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBTdG9yZU1hbmFnZXIgc3RvcmUsCisgICAgICAgIGJvb2xlYW4gcHJlRmx1c2gpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gc20uZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgaWYgKG1ldGEuZ2V0SWRlbnRpdHlUeXBlKCkgIT0gQ2xhc3NNZXRhRGF0YS5JRF9BUFBMSUNBVElPTikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgIGJvb2xlYW4gcmV0OworICAgICAgICBGaWVsZE1ldGFEYXRhW10gcGtzID0gbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKCk7CisgICAgICAgIGlmIChtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkKKyAgICAgICAgICAgICYmIHBrc1swXS5nZXREZWNsYXJlZFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLk9JRCkgeworICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBvaWRzbSA9IG5ldyBPYmplY3RJZFN0YXRlTWFuYWdlcgorICAgICAgICAgICAgICAgIChzbS5mZXRjaE9iamVjdEZpZWxkKHBrc1swXS5nZXRJbmRleCgpKSwgc20sIHBrc1swXSk7CisgICAgICAgICAgICByZXQgPSBhc3NpZ24ob2lkc20sIHN0b3JlLCBwa3NbMF0uZ2V0RW1iZWRkZWRNZXRhRGF0YSgpLgorICAgICAgICAgICAgICAgIGdldEZpZWxkcygpLCBwcmVGbHVzaCk7CisgICAgICAgICAgICBzbS5zdG9yZU9iamVjdEZpZWxkKHBrc1swXS5nZXRJbmRleCgpLAorICAgICAgICAgICAgICAgIG9pZHNtLmdldE1hbmFnZWRJbnN0YW5jZSgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXQgPSBhc3NpZ24oc20sIHN0b3JlLCBtZXRhLmdldFByaW1hcnlLZXlGaWVsZHMoKSwgcHJlRmx1c2gpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBiYXNlIG9pZCBvbiBmaWVsZCB2YWx1ZXMKKyAgICAgICAgc20uc2V0T2JqZWN0SWQoY3JlYXRlKHNtLmdldFBlcnNpc3RlbmNlQ2FwYWJsZSgpLCBtZXRhKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbiBnZW5lcmF0ZWQgdmFsdWVzIHRvIGdpdmVuIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFzc2lnbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBTdG9yZU1hbmFnZXIgc3RvcmUsCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBwa3MsIGJvb2xlYW4gcHJlRmx1c2gpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwa3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAocGtzW2ldLmdldFZhbHVlU3RyYXRlZ3koKSAhPSBWYWx1ZVN0cmF0ZWdpZXMuTk9ORQorICAgICAgICAgICAgICAgICYmIHNtLmlzRGVmYXVsdFZhbHVlKHBrc1tpXS5nZXRJbmRleCgpKQorICAgICAgICAgICAgICAgICYmICFzdG9yZS5hc3NpZ25GaWVsZChzbSwgcGtzW2ldLmdldEluZGV4KCksIHByZUZsdXNoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcyB1c2VkIHRvIHRyYW5zZmVyIHBrIHZhbHVlcyB0by9mcm9tIGFwcGxpY2F0aW9uIG9pZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpbWFyeUtleUZpZWxkTWFuYWdlcgorICAgICAgICBpbXBsZW1lbnRzIEZpZWxkTWFuYWdlciB7CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3RbXSBfc3RvcmUgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBfaW5kZXggPSAwOworICAgICAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgX21ldGEgPSBudWxsOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICAgICAgX21ldGEgPSBtZXRhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldFN0b3JlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9zdG9yZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlKE9iamVjdFtdIHN0b3JlKSB7CisgICAgICAgICAgICBfc3RvcmUgPSBzdG9yZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQm9vbGVhbkZpZWxkKGludCBmaWVsZCwgYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgICAgIHN0b3JlKCh2YWwpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUJ5dGVGaWVsZChpbnQgZmllbGQsIGJ5dGUgdmFsKSB7CisgICAgICAgICAgICBzdG9yZShuZXcgQnl0ZSh2YWwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQ2hhckZpZWxkKGludCBmaWVsZCwgY2hhciB2YWwpIHsKKyAgICAgICAgICAgIHN0b3JlKG5ldyBDaGFyYWN0ZXIodmFsKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZVNob3J0RmllbGQoaW50IGZpZWxkLCBzaG9ydCB2YWwpIHsKKyAgICAgICAgICAgIHN0b3JlKG5ldyBTaG9ydCh2YWwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlSW50RmllbGQoaW50IGZpZWxkLCBpbnQgdmFsKSB7CisgICAgICAgICAgICBzdG9yZShOdW1iZXJzLnZhbHVlT2YodmFsKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUxvbmdGaWVsZChpbnQgZmllbGQsIGxvbmcgdmFsKSB7CisgICAgICAgICAgICBzdG9yZShOdW1iZXJzLnZhbHVlT2YodmFsKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUZsb2F0RmllbGQoaW50IGZpZWxkLCBmbG9hdCB2YWwpIHsKKyAgICAgICAgICAgIHN0b3JlKG5ldyBGbG9hdCh2YWwpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlRG91YmxlRmllbGQoaW50IGZpZWxkLCBkb3VibGUgdmFsKSB7CisgICAgICAgICAgICBzdG9yZShuZXcgRG91YmxlKHZhbCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcmVTdHJpbmdGaWVsZChpbnQgZmllbGQsIFN0cmluZyB2YWwpIHsKKyAgICAgICAgICAgIHN0b3JlKHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdEZpZWxkKGludCBmaWVsZCwgT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgc3RvcmUodmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGZldGNoQm9vbGVhbkZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIChyZXRyaWV2ZShmaWVsZCkgPT0gQm9vbGVhbi5UUlVFKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjaGFyIGZldGNoQ2hhckZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuICgoQ2hhcmFjdGVyKSByZXRyaWV2ZShmaWVsZCkpLmNoYXJWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGUgZmV0Y2hCeXRlRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gKChOdW1iZXIpIHJldHJpZXZlKGZpZWxkKSkuYnl0ZVZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2hvcnQgZmV0Y2hTaG9ydEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSByZXRyaWV2ZShmaWVsZCkpLnNob3J0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZmV0Y2hJbnRGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgcmV0cmlldmUoZmllbGQpKS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZmV0Y2hMb25nRmllbGQoaW50IGZpZWxkKSB7CisgICAgICAgICAgICByZXR1cm4gKChOdW1iZXIpIHJldHJpZXZlKGZpZWxkKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZmV0Y2hGbG9hdEZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSByZXRyaWV2ZShmaWVsZCkpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBkb3VibGUgZmV0Y2hEb3VibGVGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgcmV0cmlldmUoZmllbGQpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBmZXRjaFN0cmluZ0ZpZWxkKGludCBmaWVsZCkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHJldHJpZXZlKGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZmV0Y2hPYmplY3RGaWVsZChpbnQgZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZShmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc3RvcmUoT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgX3N0b3JlW19pbmRleCsrXSA9IHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT2JqZWN0IHJldHJpZXZlKGludCBmaWVsZCkgeworICAgICAgICAgICAgT2JqZWN0IHZhbCA9IF9zdG9yZVtfaW5kZXgrK107CisgICAgICAgICAgICBpZiAoX21ldGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gX21ldGEuZ2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5QQykKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gSmF2YVR5cGVzLmNvbnZlcnQodmFsLCBmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IEphdmFUeXBlcy5jb252ZXJ0KHZhbCwgSmF2YVR5cGVzLmdldFR5cGVDb2RlKGZtZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdElkRmllbGRUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQXJyYXlTdGF0ZUltYWdlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQXJyYXlTdGF0ZUltYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9BcnJheVN0YXRlSW1hZ2UuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKKworLyoqCisgKiBVdGlsaXRpZXMgZm9yIGRlYWxpbmcgd2l0aCBhIHNpbXBsZSBzdGF0ZSBpbWFnZSBjb25zaXN0aW5nIG9mIGFuCisgKiA8Y29kZT5PYmplY3RbXTwvY29kZT4gb2YgZmllbGQgdmFsdWVzIHdpdGggb25lIGV4dHJhIGluZGV4IGNvbnRhaW5pbmcgYQorICoge0BsaW5rIEJpdFNldH0gb2YgbG9hZGVkIGZpZWxkcy4gVGhpcyBzaW1wbGlzdGljIHN0YXRlIGltYWdlIG1pZ2h0IGJlIHVzZWQKKyAqIGZvciBvcHRpbWlzdGljIHZlcnNpb25pbmcuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEFycmF5U3RhdGVJbWFnZSB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc3RhdGUgaW1hZ2UgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gbmV3SW1hZ2UoaW50IG51bUZpZWxkcykgeworICAgICAgICBPYmplY3RbXSBzdGF0ZSA9IG5ldyBPYmplY3RbbnVtRmllbGRzICsgMV07CisgICAgICAgIHN0YXRlW251bUZpZWxkc10gPSBuZXcgQml0U2V0KG51bUZpZWxkcyk7CisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBvYmplY3QgYXBwZWFycyB0byBiZSBhbiBhcnJheSBzdGF0ZQorICAgICAqIGltYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ltYWdlKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT2JqZWN0W10pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBPYmplY3RbXSBhcnIgPSAoT2JqZWN0W10pIG9iajsKKyAgICAgICAgcmV0dXJuIGFyci5sZW5ndGggPiAwICYmIGFyclthcnIubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBCaXRTZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsb2FkZWQgbWFzayBmcm9tIGEgc3RhdGUgaW1hZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgZ2V0TG9hZGVkKE9iamVjdFtdIHN0YXRlKSB7CisgICAgICAgIHJldHVybiAoQml0U2V0KSBzdGF0ZVtzdGF0ZS5sZW5ndGggLSAxXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvYWRlZCBtYXNrIGludG8gYSBzdGF0ZSBpbWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9hZGVkKE9iamVjdFtdIHN0YXRlLCBCaXRTZXQgbG9hZGVkKSB7CisgICAgICAgIHN0YXRlW3N0YXRlLmxlbmd0aCAtIDFdID0gbG9hZGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIGEgc3RhdGUgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBjbG9uZShPYmplY3RbXSBzdGF0ZSkgeworICAgICAgICBPYmplY3RbXSBjb3B5ID0gbmV3IE9iamVjdFtzdGF0ZS5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHN0YXRlLCAwLCBjb3B5LCAwLCBzdGF0ZS5sZW5ndGggLSAxKTsKKyAgICAgICAgQml0U2V0IGxvYWRlZCA9IChCaXRTZXQpIHN0YXRlW3N0YXRlLmxlbmd0aCAtIDFdOworICAgICAgICBjb3B5W2NvcHkubGVuZ3RoIC0gMV0gPSBsb2FkZWQuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGltYWdlcyBhcmUgZXF1aXZhbGVudCBmcm9tIGFuIG9wdGltaXN0aWMKKyAgICAgKiBsb2NraW5nIHBlcnNwZWN0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lVmVyc2lvbihPYmplY3RbXSBzdGF0ZTEsIE9iamVjdFtdIHN0YXRlMikgeworICAgICAgICBpZiAoc3RhdGUxID09IHN0YXRlMikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIGlmIGVpdGhlciBzdGF0ZSBpcyBudWxsLCB0aGVuIHdlIHJlcG9ydCB0aGF0IGl0IGlzIHRoZQorICAgICAgICAvLyBzYW1lOiB0aGlzIGlzIGJlY2F1c2UgYSBudWxsIHZlcnNpb24gd2lsbCBpbmRpY2F0ZSB0aGF0CisgICAgICAgIC8vIHRoZXJlIGFyZSBubyBsb2FkZWQgZmllbGRzIGluIHRoZSB2ZXJzaW9uIGF0IGFsbCwgd2hpY2gKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm90aGluZyB0byBjb21wYXJlCisgICAgICAgIGlmIChzdGF0ZTEgPT0gbnVsbCB8fCBzdGF0ZTIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIGNoZWNrIG9ubHkgdGhlIGZpZWxkcyB0aGF0IGFyZSBpbiB0aGUgbG9hZGVkIHNldCBmb3IgdGhlCisgICAgICAgIC8vIGZpcnN0IHZlcnNpb24KKyAgICAgICAgQml0U2V0IGxvYWRlZDEgPSBnZXRMb2FkZWQoc3RhdGUxKTsKKyAgICAgICAgQml0U2V0IGxvYWRlZDIgPSBnZXRMb2FkZWQoc3RhdGUyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIG1heCA9IGxvYWRlZDEubGVuZ3RoKCk7IGkgPCBtYXg7IGkrKykgeworICAgICAgICAgICAgaWYgKGxvYWRlZDEuZ2V0KGkpICYmIGxvYWRlZDIuZ2V0KGkpCisgICAgICAgICAgICAgICAgJiYgIU9iamVjdFV0aWxzLmVxdWFscyhzdGF0ZTFbaV0sIHN0YXRlMltpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworCX0KK30gCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQnl0ZUlkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQnl0ZUlkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxMGJmZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9CeXRlSWQuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCisvKioKKyAqIHtAbGluayBPcGVuSlBBSWR9IHN1YmNsYXNzIGFwcHJvcHJpYXRlIGZvciBieXRlIGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZUlkIGV4dGVuZHMgT3BlbkpQQUlkIHsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZSBrZXk7CisKKyAgICBwdWJsaWMgQnl0ZUlkKENsYXNzIGNscywgQnl0ZSBrZXkpIHsKKyAgICAgICAgdGhpcyhjbHMsIChrZXkgPT0gbnVsbCkgPyAoYnl0ZSkgMCA6IGtleS5ieXRlVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIEJ5dGVJZChDbGFzcyBjbHMsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpcyhjbHMsIChrZXkgPT0gbnVsbCkgPyAoYnl0ZSkgMCA6IEJ5dGUucGFyc2VCeXRlKGtleSkpOworICAgIH0KKworICAgIHB1YmxpYyBCeXRlSWQoQ2xhc3MgY2xzLCBieXRlIGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZUlkKENsYXNzIGNscywgYnl0ZSBrZXksIGJvb2xlYW4gc3VicykgeworICAgICAgICBzdXBlcihjbHMsIHN1YnMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gbmV3IEJ5dGUoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gQnl0ZS50b1N0cmluZyhrZXkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgaWRIYXNoKCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlkRXF1YWxzKE9wZW5KUEFJZCBvKSB7CisgICAgICAgIHJldHVybiBrZXkgPT0gKChCeXRlSWQpIG8pLmtleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2FjaGVNYXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9DYWNoZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MGVkOGYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2FjaGVNYXAuamF2YQpAQCAtMCwwICsxLDYzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkZpbHRlckl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuSXRlcmF0b3JDaGFpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTFJVTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlNpemVkTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LlJlZW50cmFudExvY2s7CisKKy8qKgorICogRml4ZWQtc2l6ZSBtYXAgdGhhdCBoYXMgYWJpbGl0eSB0byBwaW4vdW5waW4gZW50cmllcyBhbmQgbW92ZSBvdmVyZmxvdyB0bworICogYSBiYWNraW5nIHNvZnQgbWFwLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVNYXAKKyAgICBpbXBsZW1lbnRzIE1hcCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwIGZvciBub24tZXhwaXJlZCBhbmQgbm9uLXBpbm5lZCByZWZlcmVuY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTaXplZE1hcCBjYWNoZU1hcDsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXAgZm9yIGV4cGlyZWQgcmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2l6ZWRNYXAgc29mdE1hcDsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Ygb2JqZWN0cyBwaW5uZWQgaW50byB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcCBwaW5uZWRNYXA7CisKKyAgICAvLyBudW1iZXIgb2YgcGlubmVkIHZhbHVlcyAobm90IGluY2x1ZGluZyBrZXlzIG5vdCBtYXBwZWQgdG8gdmFsdWVzKQorICAgIHByaXZhdGUgaW50IF9waW5uZWRTaXplID0gMDsKKworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBfd3JpdGVMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgX3JlYWRMb2NrOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbm9uLUxSVSAoYW5kIHRoZXJlZm9yZSBoaWdobHkgY29uY3VycmVudCkgY2FjaGUgbWFwIHdpdGggYQorICAgICAqIHNpemUgb2YgMTAwMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGVNYXAoKSB7CisgICAgICAgIHRoaXMoZmFsc2UsIDEwMDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNhY2hlIG1hcCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBDYWNoZU1hcChib29sZWFuIGxydSwgaW50IG1heCkgeworICAgICAgICB0aGlzKGxydSwgbWF4LCBtYXggLyAyLCAuNzVGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjYWNoZSBtYXAgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGVNYXAoYm9vbGVhbiBscnUsIGludCBtYXgsIGludCBzaXplLCBmbG9hdCBsb2FkKSB7CisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHNpemUgPSA1MDA7CisgICAgICAgIGlmICghbHJ1KSB7CisgICAgICAgICAgICBjYWNoZU1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcChzaXplLCBsb2FkKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3ZlcmZsb3dSZW1vdmVkKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZU1hcE92ZXJmbG93UmVtb3ZlZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc29mdE1hcCA9IG5ldyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcChSZWZlcmVuY2VNYXAuSEFSRCwKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VNYXAuU09GVCwgc2l6ZSwgbG9hZCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG92ZXJmbG93UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgc29mdE1hcE92ZXJmbG93UmVtb3ZlZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUV4cGlyZWQoT2JqZWN0IGtleSkgeworICAgICAgICAgICAgICAgICAgICBzb2Z0TWFwVmFsdWVFeHBpcmVkKGtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHBpbm5lZE1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCgpOworICAgICAgICAgICAgX3JlYWRMb2NrID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhY2hlTWFwID0gbmV3IExSVU1hcChzaXplLCBsb2FkKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3ZlcmZsb3dSZW1vdmVkKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZU1hcE92ZXJmbG93UmVtb3ZlZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc29mdE1hcCA9IG5ldyBSZWZlcmVuY2VIYXNoTWFwKFJlZmVyZW5jZU1hcC5IQVJELAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZU1hcC5TT0ZULCBzaXplLCBsb2FkKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3ZlcmZsb3dSZW1vdmVkKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBzb2Z0TWFwT3ZlcmZsb3dSZW1vdmVkKGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlRXhwaXJlZChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICAgICAgICAgIHNvZnRNYXBWYWx1ZUV4cGlyZWQoa2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcGlubmVkTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIF9yZWFkTG9jayA9IF93cml0ZUxvY2s7CisgICAgICAgIH0KKyAgICAgICAgY2FjaGVNYXAuc2V0TWF4U2l6ZSgobWF4IDwgMCkgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IG1heCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGZyb20ge0BsaW5rIFNpemVkTWFwI292ZXJmbG93UmVtb3ZlZH0gaW4gdGhlIGNhY2hlIG1hcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjYWNoZU1hcE92ZXJmbG93UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHNvZnRNYXAuc2l6ZSgpIDwgc29mdE1hcC5nZXRNYXhTaXplKCkpCisgICAgICAgICAgICBwdXQoc29mdE1hcCwga2V5LCB2YWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVudHJ5UmVtb3ZlZChrZXksIHZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZnJvbSB7QGxpbmsgU2l6ZWRNYXAjb3ZlcmZsb3dSZW1vdmVkfSBpbiB0aGUgc29mdCBtYXAuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc29mdE1hcE92ZXJmbG93UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgZW50cnlSZW1vdmVkKGtleSwgdmFsdWUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgdmFsdWUgZXhwaXJlcyBmcm9tIHRoZSBzb2Z0IG1hcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzb2Z0TWFwVmFsdWVFeHBpcmVkKE9iamVjdCBrZXkpIHsKKyAgICAgICAgZW50cnlSZW1vdmVkKGtleSwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IHRoZSBnaXZlbiBlbnRyeSBpbnRvIHRoZSBnaXZlbiBtYXAuIEFsbG93cyBzdWJjbGFzc2VzIHRvCisgICAgICogdGFrZSBhZGRpdGlvbmFsIGFjdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBwdXQoTWFwIG1hcCwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGdpdmVuIG1hcC4gQWxsb3dzIHN1YmNsYXNzZXMgdG8KKyAgICAgKiB0YWtlIGFkZGl0aW9uYWwgYWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlbW92ZShNYXAgbWFwLCBPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBtYXAucmVtb3ZlKGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZSByZWFkIGxvY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZExvY2soKSB7CisgICAgICAgIGlmIChfcmVhZExvY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIF9yZWFkTG9jay5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSByZWFkIGxvY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZFVubG9jaygpIHsKKyAgICAgICAgaWYgKF9yZWFkTG9jayAhPSBudWxsKQorICAgICAgICAgICAgX3JlYWRMb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjcXVpcmUgd3JpdGUgbG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvY2soKSB7CisgICAgICAgIF93cml0ZUxvY2subG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2Ugd3JpdGUgbG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVVubG9jaygpIHsKKyAgICAgICAgX3dyaXRlTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgY2FjaGUgbWFwIHVzZXMgTFJVIGV2aWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTFJVKCkgeworICAgICAgICByZXR1cm4gX3JlYWRMb2NrICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGhhcmQgcmVmZXJlbmNlcyB0byBtYWludGFpbiwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICB3cml0ZUxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlTWFwLnNldE1heFNpemUoKHNpemUgPCAwKSA/IEludGVnZXIuTUFYX1ZBTFVFIDogc2l6ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB3cml0ZVVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGhhcmQgcmVmZXJlbmNlcyB0byBtYWludGFpbiwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVTaXplKCkgeworICAgICAgICBpbnQgbWF4ID0gY2FjaGVNYXAuZ2V0TWF4U2l6ZSgpOworICAgICAgICByZXR1cm4gKG1heCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgPyAtMSA6IG1heDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc29mdCByZWZlcmVuY2VzIHRvIG1haW50YWluLCBvciAtMSBmb3Igbm8gbGltaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29mdFJlZmVyZW5jZVNpemUoaW50IHNpemUpIHsKKyAgICAgICAgd3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzb2Z0TWFwLnNldE1heFNpemUoKHNpemUgPCAwKSA/IEludGVnZXIuTUFYX1ZBTFVFIDogc2l6ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB3cml0ZVVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNvZnQgcmVmZXJlbmNlcyB0byBtYWludGFpbiwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U29mdFJlZmVyZW5jZVNpemUoKSB7CisgICAgICAgIGludCBtYXggPSBzb2Z0TWFwLmdldE1heFNpemUoKTsKKyAgICAgICAgcmV0dXJuIChtYXggPT0gSW50ZWdlci5NQVhfVkFMVUUpID8gLTEgOiBtYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGtleXMgcGlubmVkIGludG8gdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0IGdldFBpbm5lZEtleXMoKSB7CisgICAgICAgIHJlYWRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHBpbm5lZE1hcC5rZXlTZXQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWFkVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NrcyB0aGUgZ2l2ZW4ga2V5IGFuZCBpdHMgdmFsdWUgaW50byB0aGUgbWFwLiBPYmplY3RzIHBpbm5lZCBpbnRvCisgICAgICogdGhlIG1hcCBhcmUgbm90IGNvdW50ZWQgdG93YXJkcyB0aGUgbWF4aW11bSBjYWNoZSBzaXplLCBhbmQgYXJlIG5ldmVyCisgICAgICogZXZpY3RlZCBpbXBsaWNpdGx5LiBZb3UgbWF5IHBpbiBrZXlzIGZvciB3aGljaCBubyB2YWx1ZSBpcyBpbiB0aGUgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZuZSBrZXkncyB2YWx1ZSB3YXMgcGlubmVkOyBmYWxzZSBpZiBubyB2YWx1ZQorICAgICAqIGZvciB0aGUgZ2l2ZW4ga2V5IGlzIGNhY2hlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBpbihPYmplY3Qga2V5KSB7CisgICAgICAgIHdyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHBpbm5lZCBtYXAgd2UgbmVlZCB0byBjcmVhdGUgb25lOyBlbHNlIGlmIHRoZQorICAgICAgICAgICAgLy8gcGlubmVkIG1hcCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBrZXksIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIGlmIChwaW5uZWRNYXAuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGlubmVkTWFwLmdldChrZXkpICE9IG51bGw7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIG90aGVyIG1hcHMgZm9yIGtleQorICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlbW92ZShjYWNoZU1hcCwga2V5KTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWwgPSByZW1vdmUoc29mdE1hcCwga2V5KTsKKworICAgICAgICAgICAgLy8gcGluIGtleQorICAgICAgICAgICAgcHV0KHBpbm5lZE1hcCwga2V5LCB2YWwpOworICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3Bpbm5lZFNpemUrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHdyaXRlVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmRvIGEgcGlubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB1bnBpbihPYmplY3Qga2V5KSB7CisgICAgICAgIHdyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlbW92ZShwaW5uZWRNYXAsIGtleSk7CisgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBwdXQgYmFjayBpbnRvIHVucGlubmVkIGNhY2hlCisgICAgICAgICAgICAgICAgcHV0KGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBfcGlubmVkU2l6ZS0tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgd3JpdGVVbmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhIGtleS12YWx1ZSBwYWlyIGlzIGV2aWN0ZWQgZnJvbSB0aGlzIGRhdGEKKyAgICAgKiBzdHJ1Y3R1cmUuIFRoaXMgaXMgaW52b2tlZCB3aXRoIDxjb2RlPmV4cGlyZWQ8L2NvZGU+IHNldCB0bworICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gYW4gb2JqZWN0IGlzIGRyb3BwZWQgYmVjYXVzZSBvZiBzcGFjZQorICAgICAqIHJlcXVpcmVtZW50cyBvciB0aHJvdWdoIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBzb2Z0IHJlZmVyZW5jZXMuCisgICAgICogSXQgaXMgaW52b2tlZCB3aXRoIDxjb2RlPmV4cGlyZWQ8L2NvZGU+IHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiB3aGVuIGFuIG9iamVjdCBpcyBleHBsaWNpdGx5IHJlbW92ZWQgdmlhIHRoZSB7QGxpbmsgI3JlbW92ZX0gb3IKKyAgICAgKiB7QGxpbmsgI2NsZWFyfSBtZXRob2RzLiBUaGlzIG1heSBiZSBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGZvciBhCisgICAgICogZ2l2ZW4gZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgbWF5IGJlIG51bGwgaWYgdGhlIHZhbHVlIHdhcyBhIHNvZnQgcmVmZXJlbmNlIHRoYXQgaGFzCisgICAgICogYmVlbiBHQ2QKKyAgICAgKiBAc2luY2UgMC4yLjUuMAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGVudHJ5UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZXhwaXJlZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGUgY2FjaGUuIFRoaXMgbWF5IGJlIGludm9rZWQKKyAgICAgKiBtb3JlIHRoYW4gb25jZSBmb3IgYW4gZW50cnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW50cnlBZGRlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIHJlYWRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgdmFsID0gcGlubmVkTWFwLmdldChrZXkpOworICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisKKyAgICAgICAgICAgIHZhbCA9IGNhY2hlTWFwLmdldChrZXkpOworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCB0aGUga2V5IGluIHRoZSBzb2Z0IG1hcCwgbW92ZSBpdCBiYWNrIGludG8KKyAgICAgICAgICAgICAgICAvLyB0aGUgcHJpbWFyeSBtYXAKKyAgICAgICAgICAgICAgICB2YWwgPSBzb2Z0TWFwLmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcHV0KGtleSwgdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWFkVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgd3JpdGVMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBpZiB0aGUga2V5IGlzIHBpbm5lZCwganVzdCBpbnRlcmFjdCBkaXJlY3RseSB3aXRoIHRoZSBwaW5uZWQgbWFwCisgICAgICAgICAgICBPYmplY3QgdmFsOworICAgICAgICAgICAgaWYgKHBpbm5lZE1hcC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgdmFsID0gcHV0KHBpbm5lZE1hcCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIF9waW5uZWRTaXplKys7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5QWRkZWQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnlSZW1vdmVkKGtleSwgdmFsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5QWRkZWQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG5vIGhhcmQgcmVmcywgZG9uJ3QgcHV0IGFueXRoaW5nCisgICAgICAgICAgICBpZiAoY2FjaGVNYXAuZ2V0TWF4U2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcHV0IHRoZSB2YWx1ZSBpbnRvIHRoZSBtYXAgYW5kIGNsZWFyIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLyBzb2Z0IG1hcAorICAgICAgICAgICAgdmFsID0gcHV0KGNhY2hlTWFwLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbCA9IHJlbW92ZShzb2Z0TWFwLCBrZXkpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnlBZGRlZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnlSZW1vdmVkKGtleSwgdmFsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5QWRkZWQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnRyeVJlbW92ZWQoa2V5LCB2YWwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBlbnRyeUFkZGVkKGtleSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHdyaXRlVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgeworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiA8Y29kZT5rZXk8L2NvZGU+IGlzIHBpbm5lZCBpbnRvIHRoZSBjYWNoZSwgdGhlIHBpbiBpcworICAgICAqIGNsZWFyZWQgYW5kIHRoZSBvYmplY3QgaXMgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgIHdyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaWYgdGhlIGtleSBpcyBwaW5uZWQsIGp1c3QgaW50ZXJhY3QgZGlyZWN0bHkgd2l0aCB0aGUKKyAgICAgICAgICAgIC8vIHBpbm5lZCBtYXAKKyAgICAgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgICAgICBpZiAocGlubmVkTWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICAvLyByZS1wdXQgd2l0aCBudWxsIHZhbHVlOyB3ZSBzdGlsbCB3YW50IGtleSBwaW5uZWQKKyAgICAgICAgICAgICAgICB2YWwgPSBwdXQocGlubmVkTWFwLCBrZXksIG51bGwpOworICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfcGlubmVkU2l6ZS0tOworICAgICAgICAgICAgICAgICAgICBlbnRyeVJlbW92ZWQoa2V5LCB2YWwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsID0gcmVtb3ZlKGNhY2hlTWFwLCBrZXkpOworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHZhbCA9IHNvZnRNYXAucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW50cnlSZW1vdmVkKGtleSwgdmFsLCBmYWxzZSk7CisKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB3cml0ZVVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBwaW5uZWQgb2JqZWN0cyBhcyB3ZWxsIGFzIHVucGlubmVkIG9uZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHdyaXRlTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbm90aWZ5RW50cnlSZW1vdmFscyhwaW5uZWRNYXAuZW50cnlTZXQoKSk7CisgICAgICAgICAgICBwaW5uZWRNYXAuY2xlYXIoKTsKKyAgICAgICAgICAgIF9waW5uZWRTaXplID0gMDsKKworICAgICAgICAgICAgbm90aWZ5RW50cnlSZW1vdmFscyhjYWNoZU1hcC5lbnRyeVNldCgpKTsKKyAgICAgICAgICAgIGNhY2hlTWFwLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG5vdGlmeUVudHJ5UmVtb3ZhbHMoc29mdE1hcC5lbnRyeVNldCgpKTsKKyAgICAgICAgICAgIHNvZnRNYXAuY2xlYXIoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHdyaXRlVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5RW50cnlSZW1vdmFscyhTZXQgc2V0KSB7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBzZXQuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW50cnlSZW1vdmVkKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJlYWRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3Bpbm5lZFNpemUgKyBjYWNoZU1hcC5zaXplKCkgKyBzb2Z0TWFwLnNpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzaXplKCkgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgIHJlYWRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGlubmVkTWFwLmdldChrZXkpICE9IG51bGwKKyAgICAgICAgICAgICAgICB8fCBjYWNoZU1hcC5jb250YWluc0tleShrZXkpCisgICAgICAgICAgICAgICAgfHwgc29mdE1hcC5jb250YWluc0tleShrZXkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVhZFVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsKSB7CisgICAgICAgIHJlYWRMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGlubmVkTWFwLmNvbnRhaW5zVmFsdWUodmFsKQorICAgICAgICAgICAgICAgIHx8IGNhY2hlTWFwLmNvbnRhaW5zVmFsdWUodmFsKQorICAgICAgICAgICAgICAgIHx8IHNvZnRNYXAuY29udGFpbnNWYWx1ZSh2YWwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVhZFVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNldCBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgS2V5U2V0KCk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IFZhbHVlQ29sbGVjdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW50cnlTZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZWFkTG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICJDYWNoZU1hcDoiICsgY2FjaGVNYXAudG9TdHJpbmcoKSArICI6OiIKKyAgICAgICAgICAgICAgICArIHNvZnRNYXAudG9TdHJpbmcoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpZXcgb2YgdGhlIGVudHJ5IHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEVudHJ5U2V0CisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTZXQgeworCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBDYWNoZU1hcC50aGlzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgbzsKKyAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcihFbnRyeUl0ZXJhdG9yLkVOVFJZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpZXcgb2YgdGhlIGtleSBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBLZXlTZXQKKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNldCB7CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIENhY2hlTWFwLnRoaXMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKEVudHJ5SXRlcmF0b3IuS0VZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpZXcgb2YgdGhlIHZhbHVlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZUNvbGxlY3Rpb24KKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24geworCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBDYWNoZU1hcC50aGlzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcihFbnRyeUl0ZXJhdG9yLlZBTFVFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIG92ZXIgYWxsIGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yCisgICAgICAgIGltcGxlbWVudHMgSXRlcmF0b3IsIFByZWRpY2F0ZSB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUlkgPSAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVkgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRSA9IDI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvckNoYWluIF9pdHIgPSBuZXcgSXRlcmF0b3JDaGFpbigpOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBfdHlwZTsKKworICAgICAgICBwdWJsaWMgRW50cnlJdGVyYXRvcihpbnQgdHlwZSkgeworICAgICAgICAgICAgX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgX2l0ci5hZGRJdGVyYXRvcihuZXcgRmlsdGVySXRlcmF0b3IoZ2V0VmlldyhwaW5uZWRNYXApLCB0aGlzKSk7CisgICAgICAgICAgICBfaXRyLmFkZEl0ZXJhdG9yKGdldFZpZXcoY2FjaGVNYXApKTsKKyAgICAgICAgICAgIF9pdHIuYWRkSXRlcmF0b3IoZ2V0Vmlldyhzb2Z0TWFwKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGFwcHJvcHJpYXRlIHZpZXcgb2YgdGhlIGdpdmVuIG1hcC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgZ2V0VmlldyhNYXAgbSkgeworICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgc3dpdGNoIChfdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgS0VZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGNhc2UgVkFMVUU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfaXRyLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfaXRyLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIF9pdHIucmVtb3ZlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF90eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFTlRSWToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoTWFwLkVudHJ5KSBvYmopLmdldFZhbHVlKCkgIT0gbnVsbDsKKwkJCWNhc2UgVkFMVUU6CisJCQkJcmV0dXJuIG9iaiAhPSBudWxsOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NhbGxiYWNrRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2FsbGJhY2tFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjAzMjgwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NhbGxiYWNrRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBFeGNlcHRpb24gdHlwZSB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gYSBjYWxsYmFjay4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK3B1YmxpYyBjbGFzcyBDYWxsYmFja0V4Y2VwdGlvbgorICAgIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgQ2FsbGJhY2tFeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsbGJhY2tFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBDQUxMQkFDSzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2hhbmdlVHJhY2tlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NoYW5nZVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODEwZTdjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NoYW5nZVRyYWNrZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBjb21wb25lbnRzIHRoYXQgdHJhY2sgY2hhbmdlcyB0byBjb250YWluZXJzIGF0IGEKKyAqIGZpbmUtZ3JhaW5lZCBsZXZlbC4gUHJveGllcyB0aGF0IHVzZSBjaGFuZ2UgdHJhY2tlcnMgbWlnaHQgaGF2ZSBiZXR0ZXIKKyAqIHVwZGF0ZSBwZXJmb3JtYW5jZSB0aGFuIG5vbi10cmFja2luZyBwcm94aWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tlciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRyYWNrZXIgaGFzIGFuIHVwLXRvLWRhdGUgdmlldyBvZiBhbGwgdGhlIGNoYW5nZXMKKyAgICAgKiB0byB0aGUgY29udGFpbmVyIGl0IGlzIG1hbmFnaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhY2tpbmcoKTsKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgY2hhbmdlIHRyYWNrZXIsIGFuZCB0dXJuIGNoYW5nZSB0cmFja2luZyBiYWNrCisgICAgICogb24gaWYgaXQgaGFzIGJlZW4gZGlzYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRUcmFja2luZygpOworCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgdHJhY2tlciB0byBzdG9wIHRyYWNraW5nIGNoYW5nZXMgZm9yIGl0cyBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFRyYWNraW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgbWFuYWdlZAorICAgICAqIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZGRlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIG1hbmFnZWQKKyAgICAgKiBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgZWxlbWVudHMgdGhhdCBoYXZlIGNoYW5nZWQuIEluIG1hcHMsIHRoaXMgbWFya3MgYQorICAgICAqIHBvc3NpYmxlIGNoYW5nZSBpbiB2YWx1ZSBmb3IgYSBrZXkuIEluIGNvbGxlY3Rpb25zLCB0aGlzIG1hcmtzIGFuCisgICAgICogZWxlbWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgYW5kIHJlLWFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoYW5nZWQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBuZXh0IGVsZW1lbnQgc2VxdWVuY2UgdmFsdWUgZm9yIHRoaXMgcHJveHkgYXQgbG9hZCB0aW1lLgorICAgICAqIElmIHRoZSBkYXRhIHN0b3JlIGtlZXBzIHRoaXMgcHJveHkncyBkYXRhIGluIHNlcXVlbmNlIG9yZGVyIGJ1dCBhbGxvd3MKKyAgICAgKiBob2xlcyBmb3IgcmVtb3ZlZCBvYmplY3RzLCB0aGUgaW1wbGVtZW50YXRpb24gY2FuIHNldCB0aGUgbmV4dAorICAgICAqIHNlcXVlbmNlIGF0IGxvYWQgdGltZSwgdGhlbiByZXRyaWV2ZSBpdCBhbmQgc3RhcnQgZnJvbSB0aGVyZSBmb3IKKyAgICAgKiBhZGRlZCBvYmplY3RzIGF0IGZsdXNoIHRpbWUuIFRoaXMgdmFsdWUgaXMgc2V0IGJhY2sgdG8gMCBpZiB0aGUKKyAgICAgKiBwcm94eSBzdG9wcyB0cmFja2luZyBjaGFuZ2VzLiBGb3Igb3JkZXJlZCBwcm94aWVzLCBpdCBpcyBzZXQgdG8gdGhlCisgICAgICogcHJveHkncyBzaXplIHdoZW4gdGhlIHByb3h5IHN0YXJ0cyB0cmFja2luZyBjaGFuZ2VzIGFnYWluLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TmV4dFNlcXVlbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBlbGVtZW50IHNlcXVlbmNlIHZhbHVlIGZvciB0aGlzIHByb3h5IGF0IGxvYWQgdGltZS4KKyAgICAgKiBJZiB0aGUgZGF0YSBzdG9yZSBrZWVwcyB0aGlzIHByb3h5J3MgZGF0YSBpbiBzZXF1ZW5jZSBvcmRlciBidXQgYWxsb3dzCisgICAgICogaG9sZXMgZm9yIHJlbW92ZWQgb2JqZWN0cywgdGhlIGltcGxlbWVudGF0aW9uIGNhbiBzZXQgdGhlIG5leHQKKyAgICAgKiBzZXF1ZW5jZSBhdCBsb2FkIHRpbWUsIHRoZW4gcmV0cmlldmUgaXQgYW5kIHN0YXJ0IGZyb20gdGhlcmUgZm9yCisgICAgICogYWRkZWQgb2JqZWN0cyBhdCBmbHVzaCB0aW1lLiBUaGlzIHZhbHVlIGlzIHNldCBiYWNrIHRvIDAgaWYgdGhlCisgICAgICogcHJveHkgc3RvcHMgdHJhY2tpbmcgY2hhbmdlcy4gRm9yIG9yZGVyZWQgcHJveGllcywgaXQgaXMgc2V0IHRvIHRoZQorICAgICAqIHByb3h5J3Mgc2l6ZSB3aGVuIHRoZSBwcm94eSBzdGFydHMgdHJhY2tpbmcgY2hhbmdlcyBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0U2VxdWVuY2UgKGludCBzZXEpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NoYXJJZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NoYXJJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGRmYjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2hhcklkLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworLyoqCisgKiB7QGxpbmsgT3BlbkpQQUlkfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgY2hhciBmaWVsZHMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENoYXJJZCBleHRlbmRzIE9wZW5KUEFJZCB7CisKKyAgICBwcml2YXRlIGZpbmFsIGNoYXIga2V5OworCisgICAgcHVibGljIENoYXJJZChDbGFzcyBjbHMsIENoYXJhY3RlciBrZXkpIHsKKyAgICAgICAgdGhpcyhjbHMsIChrZXkgPT0gbnVsbCkgPyAoY2hhcikgMCA6IGtleS5jaGFyVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIENoYXJJZChDbGFzcyBjbHMsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpcyhjbHMsIChrZXkgPT0gbnVsbCkgPyAoY2hhcikgMCA6IGtleS5jaGFyQXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyBDaGFySWQoQ2xhc3MgY2xzLCBjaGFyIGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhcklkKENsYXNzIGNscywgY2hhciBrZXksIGJvb2xlYW4gc3VicykgeworICAgICAgICBzdXBlcihjbHMsIHN1YnMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihrZXkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgaWRIYXNoKCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlkRXF1YWxzKE9wZW5KUEFJZCBvKSB7CisgICAgICAgIHJldHVybiBrZXkgPT0gKChDaGFySWQpIG8pLmtleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2xhc3NSZXNvbHZlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NsYXNzUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzUwNmYzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NsYXNzUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk11bHRpQ2xhc3NMb2FkZXI7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGN1c3RvbWl6ZSB0aGUgbG9hZGluZyBvZiBjbGFzc2VzIHVuZGVyIE9wZW5KUEEuCisgKgorICogQHNpbmNlIDAuMy4wCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBDbGFzc1Jlc29sdmVyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNsYXNzIGxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqIFRoaXMgY2FuIGJlIGEgc3RhbmRhcmQgY2xhc3MgbG9hZGVyLCBvciBhIGN1c3RvbWl6ZWQgbG9hZGVyIHN1Y2gKKyAgICAgKiBhcyBhIHtAbGluayBNdWx0aUNsYXNzTG9hZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0Q2xhc3MgdGhlIGNvbnRleHQgY2xhc3M7IG1heSBiZSBudWxsIGlmIG5vIGNvbnRleHQgY2xhc3MKKyAgICAgKiBAcGFyYW0gZW52TG9hZGVyIHRoZSB0aHJlYWQncyBjb250ZXh0IGNsYXNzIGxvYWRlciB3aGVuIHRoZQorICAgICAqIHBlcnNpc3RlbmNlIGVudmlyb25tZW50IChpLmUuIGJyb2tlcikKKyAgICAgKiB3YXMgb2J0YWluZWQ7IG1heSBiZSBudWxsIGlmIG9wZXJhdGluZyBvdXRzaWRlCisgICAgICogdGhlIGNvbnRleHQgb2YgcGVyc2lzdGVuY2UgZW52aXJvbm1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoQ2xhc3MgY29udGV4dENsYXNzLAorICAgICAgICBDbGFzc0xvYWRlciBlbnZMb2FkZXIpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NsYXNzUmVzb2x2ZXJJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2xhc3NSZXNvbHZlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBhNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NsYXNzUmVzb2x2ZXJJbXBsLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5NdWx0aUNsYXNzTG9hZGVyOworCisvKioKKyAqIERlZmF1bHQgY2xhc3MgcmVzb2x2ZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogQHNpbmNlIDAuMy4wCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NSZXNvbHZlckltcGwKKyAgICBpbXBsZW1lbnRzIENsYXNzUmVzb2x2ZXIgeworCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzIGNvbnRleHRDbGFzcywKKyAgICAgICAgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIC8vIGdldCB0aGUgY29udGV4dCBjbGFzcycgbG9hZGVyOyBpZiB0aGUgY2xhc3Mgd2FzIGxvYWRlZCBieSB0aGUKKyAgICAgICAgLy8gYm9vdHN0cmFwIGxvYWRlciwgdXNlIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXIgaW4gdGhlIGhvcGVzIHRoYXQKKyAgICAgICAgLy8gY2xhc3MuZm9yTmFtZSBjYWxscyBvbiBpdCB3aWxsIGZpbmQgdGhlIGJvb3RzdHJhcCBsb2FkZXIncyBjYWNoZWQKKyAgICAgICAgLy8gY2xhc3MgKHRoZSBib290c3RyYXAgbG9hZGVyIGlzIHRoZSBwYXJlbnQgb2YgdGhlIHN5c3RlbSBsb2FkZXIpCisgICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRMb2FkZXIgPSBudWxsOworICAgICAgICBpZiAoY29udGV4dENsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHRMb2FkZXIgPSBjb250ZXh0Q2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0TG9hZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGV4dExvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSB1bmlxdWUgbG9hZGVyLCBqdXN0IHJldHVybiBpdAorICAgICAgICBDbGFzc0xvYWRlciB0aHJlYWRMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLgorICAgICAgICAgICAgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmICgoY29udGV4dExvYWRlciA9PSBudWxsIHx8IGNvbnRleHRMb2FkZXIgPT0gdGhyZWFkTG9hZGVyKQorICAgICAgICAgICAgJiYgKGVudkxvYWRlciA9PSBudWxsIHx8IGVudkxvYWRlciA9PSB0aHJlYWRMb2FkZXIpKQorICAgICAgICAgICAgcmV0dXJuIHRocmVhZExvYWRlcjsKKworICAgICAgICAvLyBjb25zdHJ1Y3QgYSBtdWx0aSBjbGFzcyBsb2FkZXIgdGhhdCB3aWxsIGRlbGVnYXRlIGluIHRoZSBvcmRlcgorICAgICAgICAvLyBkZXNjcmliZWQgaW4gc2VjdGlvbiAxMi41IG9mIHRoZSBzcGVjCisgICAgICAgIE11bHRpQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IE11bHRpQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGNvbnRleHRMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlci5hZGRDbGFzc0xvYWRlcihjb250ZXh0TG9hZGVyKTsKKyAgICAgICAgbG9hZGVyLmFkZENsYXNzTG9hZGVyKHRocmVhZExvYWRlcik7CisgICAgICAgIGlmIChlbnZMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlci5hZGRDbGFzc0xvYWRlcihlbnZMb2FkZXIpOworICAgICAgICByZXR1cm4gbG9hZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Db2xsZWN0aW9uQ2hhbmdlVHJhY2tlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0NvbGxlY3Rpb25DaGFuZ2VUcmFja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzNjc2NAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Db2xsZWN0aW9uQ2hhbmdlVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKKy8qKgorICogQ2hhbmdlIHRyYWNrZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY29sbGVjdGlvbnMuIElmIHRoZSB1c2VyIGNhbGxzCisgKiBhbnkgbXV0YXRpbmcgbWV0aG9kcyBvbiB0aGUgY29sbGVjdGlvbiB0aGF0IGRvIG5vdCBoYXZlIGFuIGVxdWl2YWxlbnQgaW4KKyAqIHRoaXMgY2hhbmdlIHRyYWNrZXIsIHRoZW4geW91IG11c3QgY2FsbCB7QGxpbmsgI3N0b3BUcmFja2luZ30gYWZ0ZXIKKyAqIGFwcGx5aW5nIHRoZSBvcGVyYXRpb24gdG8gdGhlIGNvbGxlY3Rpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlcgorICAgIGV4dGVuZHMgQ2hhbmdlVHJhY2tlciB7CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCB3YXMgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkZWQoT2JqZWN0IGVsZW0pOworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgd2FzIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlZChPYmplY3QgZWxlbSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXJJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxMmM5MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Db2xsZWN0aW9uQ2hhbmdlVHJhY2tlckltcGwuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlckltcGwKKyAgICBleHRlbmRzIEFic3RyYWN0Q2hhbmdlVHJhY2tlcgorICAgIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIF9jb2xsOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfZHVwczsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX29yZGVyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbCB0aGUgY29sbGVjdGlvbiB0byBkZWxlZ2F0ZSB0bworICAgICAqIEBwYXJhbSBkdXBzIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gYWxsb3dzIGR1cGxpY2F0ZXMsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBvcmRlciB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG9yZGVyZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlckltcGwoQ29sbGVjdGlvbiBjb2xsLCBib29sZWFuIGR1cHMsCisgICAgICAgIGJvb2xlYW4gb3JkZXIpIHsKKyAgICAgICAgX2NvbGwgPSBjb2xsOworICAgICAgICBfZHVwcyA9IGR1cHM7CisgICAgICAgIF9vcmRlciA9IG9yZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBhbGxvd3MgZHVwbGljYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhbGxvd3NEdXBsaWNhdGVzKCkgeworICAgICAgICByZXR1cm4gX2R1cHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIGlzIG9yZGVyZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNPcmRlcmVkKCkgeworICAgICAgICByZXR1cm4gX29yZGVyOworICAgIH0gCisKKyAgICBwdWJsaWMgdm9pZCBhZGRlZChPYmplY3QgZWxlbSkgeworICAgICAgICBzdXBlci5hZGRlZChlbGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVkKE9iamVjdCBlbGVtKSB7CisgICAgICAgIHN1cGVyLnJlbW92ZWQoZWxlbSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpbml0aWFsU2VxdWVuY2UoKSB7CisgICAgICAgIGlmIChfb3JkZXIpCisgICAgICAgICAgICByZXR1cm4gX2NvbGwuc2l6ZSgpOworICAgICAgICByZXR1cm4gc3VwZXIuaW5pdGlhbFNlcXVlbmNlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkKE9iamVjdCBlbGVtKSB7CisgICAgICAgIGlmIChyZW0gPT0gbnVsbCB8fCAhcmVtLnJlbW92ZShlbGVtKSkgeworICAgICAgICAgICAgLy8gYWZ0ZXIgYSBwb2ludCBpdCdzIGluZWZmaWNpZW50IHRvIGtlZXAgdHJhY2tpbmcKKyAgICAgICAgICAgIGlmIChnZXRBdXRvT2ZmKCkKKyAgICAgICAgICAgICAgICAmJiBnZXRBZGRlZCgpLnNpemUoKSArIGdldFJlbW92ZWQoKS5zaXplKCkgPj0gX2NvbGwuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHN0b3BUcmFja2luZygpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFkZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZHVwcyB8fCBfb3JkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IG5ld1NldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGQuYWRkKGVsZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKF9vcmRlcikKKyAgICAgICAgICAgIHN0b3BUcmFja2luZygpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjaGFuZ2UgPSBuZXdTZXQoKTsKKyAgICAgICAgICAgIGNoYW5nZS5hZGQoZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW0pIHsKKyAgICAgICAgLy8gaWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBlbGVtLCB3ZSBjYW4ndAorICAgICAgICAvLyB1c2UgY2hhbmdlIHRyYWNraW5nIGJlY2F1c2Ugc29tZSBiYWNrLWVuZHMgY2FuJ3QganVzdCBkZWxldGUgYQorICAgICAgICAvLyBzaW5nbGUgY29weSBvZiBhIGVsZW0KKyAgICAgICAgaWYgKF9kdXBzICYmIGdldEF1dG9PZmYoKSAmJiBfY29sbC5jb250YWlucyhlbGVtKSkKKyAgICAgICAgICAgIHN0b3BUcmFja2luZygpOworICAgICAgICBlbHNlIGlmIChhZGQgPT0gbnVsbCB8fCAhYWRkLnJlbW92ZShlbGVtKSkgeworICAgICAgICAgICAgLy8gYWZ0ZXIgYSBwb2ludCBpdCdzIGluZWZmaWNpZW50IHRvIGtlZXAgdHJhY2tpbmcKKyAgICAgICAgICAgIGlmIChnZXRBdXRvT2ZmKCkKKyAgICAgICAgICAgICAgICAmJiBnZXRSZW1vdmVkKCkuc2l6ZSgpICsgZ2V0QWRkZWQoKS5zaXplKCkgPj0gX2NvbGwuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHN0b3BUcmFja2luZygpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZW0gPSBuZXdTZXQoKTsKKyAgICAgICAgICAgICAgICByZW0uYWRkKGVsZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlKE9iamVjdCBlbGVtKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9EYXRlSWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9EYXRlSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFkYWZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0RhdGVJZC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiB7QGxpbmsgT3BlbkpQQUlkfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgRGF0ZSBmaWVsZHMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERhdGVJZAorICAgIGV4dGVuZHMgT3BlbkpQQUlkIHsKKworICAgIHByaXZhdGUgZmluYWwgRGF0ZSBrZXk7CisKKyAgICBwdWJsaWMgRGF0ZUlkKENsYXNzIGNscywgU3RyaW5nIGtleSkgeworICAgICAgICB0aGlzKGNscywgbmV3IERhdGUoTG9uZy5wYXJzZUxvbmcoa2V5KSkpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlSWQoQ2xhc3MgY2xzLCBEYXRlIGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworICAgICAgICB0aGlzLmtleSA9IGtleSA9PSBudWxsID8gbmV3IERhdGUoMCkgOiBrZXk7CisgICAgfQorCisgICAgcHVibGljIERhdGVJZChDbGFzcyBjbHMsIGphdmEuc3FsLkRhdGUga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoRGF0ZSkga2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZUlkKENsYXNzIGNscywgamF2YS5zcWwuVGltZXN0YW1wIGtleSkgeworICAgICAgICB0aGlzKGNscywgKERhdGUpIGtleSk7CisgICAgfQorCisgICAgcHVibGljIERhdGVJZChDbGFzcyBjbHMsIERhdGUga2V5LCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgc3VwZXIoY2xzLCBzdWJzKTsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXkgPT0gbnVsbCA/IG5ldyBEYXRlKDApIDoga2V5OworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldElkKCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SWRPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBnZXRJZCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKGtleS5nZXRUaW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgaWRIYXNoKCkgeworICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgcmV0dXJuIGtleS5lcXVhbHMoKChEYXRlSWQpIG8pLmtleSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvRG91YmxlSWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Eb3VibGVJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Mjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvRG91YmxlSWQuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCisvKioKKyAqIHtAbGluayBPcGVuSlBBSWR9IHN1YmNsYXNzIGFwcHJvcHJpYXRlIGZvciBkb3VibGUgZmllbGRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEb3VibGVJZCAKKyAgICBleHRlbmRzIE9wZW5KUEFJZCB7CisKKyAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBrZXk7CisKKyAgICBwdWJsaWMgRG91YmxlSWQoQ2xhc3MgY2xzLCBEb3VibGUga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gMEQgOiBrZXkuZG91YmxlVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIERvdWJsZUlkKENsYXNzIGNscywgU3RyaW5nIGtleSkgeworICAgICAgICB0aGlzKGNscywgKGtleSA9PSBudWxsKSA/IDBEIDogRG91YmxlLnBhcnNlRG91YmxlKGtleSkpOworICAgIH0KKworICAgIHB1YmxpYyBEb3VibGVJZChDbGFzcyBjbHMsIGRvdWJsZSBrZXkpIHsKKyAgICAgICAgc3VwZXIoY2xzKTsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCisgICAgcHVibGljIERvdWJsZUlkKENsYXNzIGNscywgZG91YmxlIGtleSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHN1cGVyKGNscywgc3Vicyk7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gRG91YmxlLnRvU3RyaW5nKGtleSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpZEhhc2goKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoa2V5KSAKKyAgICAgICAgICAgIF4gKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGtleSkgPj4+IDMyKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgcmV0dXJuIGtleSA9PSAoKERvdWJsZUlkKSBvKS5rZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0V4Y2VwdGlvbkluZm8uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9FeGNlcHRpb25JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1MTRkNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9FeGNlcHRpb25JbmZvLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworLyoqCisgKiBJbnRlcmZhY2Ugc3VwcGx5aW5nIGFkZGl0aW9uYWwgZXhjZXB0aW9uIGluZm9ybWF0aW9uLiBBbGwgT3BlbkpQQQorICogZXhjZXB0aW9ucyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4Y2VwdGlvbkluZm8geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUwgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUiA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBzZWUgVGhyb3dhYmxlI2dldE1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBUaHJvd2FibGV9IGZyb20ge0BsaW5rICNnZXROZXN0ZWRUaHJvd2FibGVzfQorICAgICAqIGluIG9yZGVyIHRvIGNvbmZvcm0gdG8ge0BsaW5rIFRocm93YWJsZSNnZXRDYXVzZX0gaW4gSmF2YSAxLjQrLgorICAgICAqCisgICAgICogQHNlZSBUaHJvd2FibGUjZ2V0Q2F1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdGFjay4KKyAgICAgKgorICAgICAqIEBzZWUgVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpOworCisgICAgLyoqCisgICAgICogRXhjZXB0aW9uIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gc3VidHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyBmYXRhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmVzdGVkIHRocm93YWJsZXMuCisgICAgICovCisgICAgcHVibGljIFRocm93YWJsZVtdIGdldE5lc3RlZFRocm93YWJsZXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmYWlsZWQgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmFpbGVkT2JqZWN0KCk7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9FeGNlcHRpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvRXhjZXB0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzZjMjcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvRXhjZXB0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuSmF2YVZlcnNpb25zOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgZXh0ZXJuYWxpemluZyBhbmQgaGFuZGxpbmcgZXhjZXB0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQHNpbmNlIDAuMi41CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25zIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGhyb3dhYmxlW10gRU1QVFlfVEhST1dBQkxFUyA9IG5ldyBUaHJvd2FibGVbMF07CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE91dHB1dFN0cmVhbSBERVZfTlVMTCA9IG5ldyBPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2lsbCBiZSBhYmxlIHRvIGJlIHNlcmlhbGl6ZWQuIFRoaXMKKyAgICAgKiB3aWxsIGNoZWNrIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cyB7QGxpbmsgU2VyaWFsaXphYmxlfSwgYW5kIGlmIHNvLAorICAgICAqIHdpbGwgdHJ5IHRvIHBlcmZvcm0gYW4gYWN0dWFsIHNlcmlhbGl6YXRpb24uIFRoaXMgaXMgaW4gY2FzZSB0aGUgb2JqZWN0CisgICAgICogaGFzIGZpZWxkcyB3aGljaCwgaW4gdHVybiwgYXJlIG5vdCBzZXJpYWxpemFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2IgdGhlIG9iamVjdCB0byB0ZXN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3Qgd2lsbCBiZSBhYmxlIHRvIGJlIHNlcmlhbGl6ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VyaWFsaXphYmxlKE9iamVjdCBvYikgeworICAgICAgICBpZiAoIShvYiBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gZG9uJ3Qgc2VyaWFsaXplIHBlcnNpc3RlbnQgb2JqZWN0cyBleGNlcHRpb25zIHRvIHByZXZlbnQKKyAgICAgICAgLy8gcmVhZGluZyBpbiBhbGwgdGhlIHN0YXRlCisgICAgICAgIGlmICghSW1wbEhlbHBlci5pc01hbmFnZWRUeXBlKG9iLmdldENsYXNzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIG5vdyBkbyBhbiBhY3R1YWwgdGVzdCB0byBzZWUgaWYgd2Ugd2lsbCBiZQorICAgICAgICAvLyBhYmxlIHRvIHBlcmZvcm0gdGhlIHNlcmlhbGl6YXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oREVWX05VTEwpLndyaXRlT2JqZWN0KG9iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZWx5IHN0cmluZ2lmeSB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvYikgeworICAgICAgICBpZiAob2IgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisKKyAgICAgICAgLy8gZG9uJ3QgdGFrZSBvaWQgb2YgbmV3IG9iamVjdHMgc2luY2UgaXQgY2FuIGNhdXNlIGEgZmx1c2ggaWYgYXV0by1pbmMKKyAgICAgICAgLy8gYW5kIHRoZSBpZCBpcyBtZWFuaW5nbGVzcyBhbnl3YXkKKyAgICAgICAgT2JqZWN0IG9pZCA9IGdldE9iamVjdElkKG9iKTsKKworICAgICAgICBpZiAob2lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvaWQgaW5zdGFuY2VvZiBJZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gb2lkLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gb2IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLSIgKyBvaWQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJbXBsSGVscGVyLmlzTWFuYWdlZFR5cGUob2IuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIC8vIG5ldmVyIGNhbGwgdG9TdHJpbmcoKSBvbiBhIFBlcnNpc3RlbmNlQ2FwYWJsZSwgc2luY2UKKyAgICAgICAgICAgIC8vIGl0IG1heSBhY2Nlc3MgcGVyc2lzdGVudCBmaWVsZHM7IGZhbGwtYmFjayB0byB1c2luZworICAgICAgICAgICAgLy8gdGhlIHN0YW5kYXJkIG9iamVjdCBzdHJpbmdpZmljYXRpb24gbWVjaGFuaXNtLiBOZXcKKyAgICAgICAgICAgIC8vIGluc3RhbmNlcyB0aGF0IHVzZSBwcm94eWluZyAocHJvcGVydHktYWNjZXNzIGluc3RhbmNlcywKKyAgICAgICAgICAgIC8vIGZvciBleGFtcGxlKSB0aGF0IHdlcmUgY3JlYXRlZCB3aXRoIHRoZSAnbmV3JyBrZXl3b3JkCisgICAgICAgICAgICAvLyB3aWxsIG5vdCBlbmQgdXAgaW4gdGhpcyBjb2RlLCB3aGljaCBpcyBvayBzaW5jZSB0aGV5CisgICAgICAgICAgICAvLyBkb24ndCBkbyBsYXp5IGxvYWRpbmcgYW55d2F5cywgc28gdGhleSB3aWxsIHN0cmluZ2lmeQorICAgICAgICAgICAgLy8gc2FmZWx5LgorICAgICAgICAgICAgcmV0dXJuIG9iLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIkAiCisgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBvYi50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKHMuaW5kZXhPZihvYi5nZXRDbGFzcygpLmdldE5hbWUoKSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcyArPSAiIFsiICsgb2IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSI7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBvYi5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhZmVseSBzdHJpbmdpZnkgdGhlIGdpdmVuIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoQ29sbGVjdGlvbiBmYWlsZWQpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiWyIpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGZhaWxlZC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYnVmLmFwcGVuZChFeGNlcHRpb25zLnRvU3RyaW5nKGl0ci5uZXh0KCkpKTsKKyAgICAgICAgICAgIGlmIChpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5naWZ5IHRoZSBnaXZlbiBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoRXhjZXB0aW9uSW5mbyBlKSB7CisgICAgICAgIGludCB0eXBlID0gZS5nZXRUeXBlKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIjwiKS4KKyAgICAgICAgICAgIGFwcGVuZChPcGVuSlBBVmVyc2lvbi5WRVJTSU9OX05VTUJFUikuCisgICAgICAgICAgICBhcHBlbmQoT3BlbkpQQVZlcnNpb24uUkVMRUFTRV9TVEFUVVMpLmFwcGVuZCgnICcpLgorICAgICAgICAgICAgYXBwZW5kKGUuaXNGYXRhbCgpID8gImZhdGFsICIgOiAibm9uZmF0YWwgIikuCisgICAgICAgICAgICBhcHBlbmQgKHR5cGUgPT0gRXhjZXB0aW9uSW5mby5HRU5FUkFMID8gImdlbmVyYWwgZXJyb3IiIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IEV4Y2VwdGlvbkluZm8uSU5URVJOQUwgPyAiaW50ZXJuYWwgZXJyb3IiIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IEV4Y2VwdGlvbkluZm8uU1RPUkUgPyAic3RvcmUgZXJyb3IiIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IEV4Y2VwdGlvbkluZm8uVU5TVVBQT1JURUQgPyAidW5zdXBwb3J0ZWQgZXJyb3IiIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IEV4Y2VwdGlvbkluZm8uVVNFUiA/ICJ1c2VyIGVycm9yIiA6CisgICAgICAgICAgICAgICAgKHR5cGUgKyAiIGVycm9yIikpLgorICAgICAgICAgICAgYXBwZW5kKCI+ICIpOworICAgICAgICBidWYuYXBwZW5kKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmFwcGVuZCgiOiAiKS4KKyAgICAgICAgICAgIGFwcGVuZChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIE9iamVjdCBmYWlsZWQgPSBlLmdldEZhaWxlZE9iamVjdCgpOworICAgICAgICBpZiAoZmFpbGVkICE9IG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKFNFUCkuYXBwZW5kKCJGYWlsZWRPYmplY3Q6ICIpLgorICAgICAgICAgICAgICAgIGFwcGVuZCh0b1N0cmluZyhmYWlsZWQpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgZXhjZXB0aW9uJ3MgbmVzdGVkIHRocm93YWJsZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50TmVzdGVkVGhyb3dhYmxlcyhFeGNlcHRpb25JbmZvIGUsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICAvLyBpZiB0aGlzIGlzIEphdmEgMS40IGFuZCB0aGVyZSBpcyBleGFjdGx5IGEgc2luZ2xlCisgICAgICAgIC8vIGV4Y2VwdGlvbiwgdGhlbiBkZWZlciB0byAxLjQncyBiZWhhdmlvciBvZiBwcmludGluZworICAgICAgICAvLyBvdXQgdGhlIHJlc3VsdCBvZiBnZXRDYXVzZSgpLiBUaGlzIGRlZmVycmFsIGhhcHBlbnMgaW4KKyAgICAgICAgLy8gdGhlIGNhbGxpbmcgY29kZS4KKyAgICAgICAgVGhyb3dhYmxlW10gbmVzdGVkID0gZS5nZXROZXN0ZWRUaHJvd2FibGVzKCk7CisgICAgICAgIGludCBpID0gKEphdmFWZXJzaW9ucy5WRVJTSU9OID49IDQpID8gMSA6IDA7CisgICAgICAgIGlmIChpIDwgbmVzdGVkLmxlbmd0aCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIk5lc3RlZFRocm93YWJsZXM6Iik7CisgICAgICAgICAgICBmb3IgKDsgaSA8IG5lc3RlZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBuZXN0ZWRbaV0ucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGV4Y2VwdGlvbidzIG5lc3RlZCB0aHJvd2FibGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE5lc3RlZFRocm93YWJsZXMoRXhjZXB0aW9uSW5mbyBlLCBQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBKYXZhIDEuNCBhbmQgdGhlcmUgaXMgZXhhY3RseSBhIHNpbmdsZQorICAgICAgICAvLyBleGNlcHRpb24sIHRoZW4gZGVmZXIgdG8gMS40J3MgYmVoYXZpb3Igb2YgcHJpbnRpbmcKKyAgICAgICAgLy8gb3V0IHRoZSByZXN1bHQgb2YgZ2V0Q2F1c2UoKS4gVGhpcyBkZWZlcnJhbCBoYXBwZW5zIGluCisgICAgICAgIC8vIHRoZSBjYWxsaW5nIGNvZGUuCisgICAgICAgIFRocm93YWJsZVtdIG5lc3RlZCA9IGUuZ2V0TmVzdGVkVGhyb3dhYmxlcygpOworICAgICAgICBpbnQgaSA9IChKYXZhVmVyc2lvbnMuVkVSU0lPTiA+PSA0KSA/IDEgOiAwOworICAgICAgICBpZiAoaSA8IG5lc3RlZC5sZW5ndGgpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJOZXN0ZWRUaHJvd2FibGVzOiIpOworICAgICAgICAgICAgZm9yICg7IGkgPCBuZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbmVzdGVkW2ldLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGZhaWxlZCBvYmplY3QgaW50byBhIHNlcmlhbGl6YWJsZQorICAgICAqIG9iamVjdCBmb3Igd2hlbiB3ZSBhcmUgc2VyaWFsaXppbmcgYW4gRXhjZXB0aW9uLiBJdCB3aWxsCisgICAgICogdHJ5IHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT5pZiB0aGUgb2JqZWN0IGNhbiBiZSBzZXJpYWxpemVkLCByZXR1cm4gdGhlIG9iamVjdCBpdHNlbGY8L2xpPgorICAgICAqIDxsaT5pZiB0aGUgb2JqZWN0IGhhcyBhIHNlcmlhbGl6YWJsZSBvaWQsIHJldHVybiB0aGUgb2lkPC9saT4KKyAgICAgKiA8bGk+aWYgdGhlIG9iamVjdCBoYXMgYSBub24tc2VyaWFsaXphYmxlIG9pZCwgcmV0dXJuIHRoZSBvaWQncworICAgICAqIHRvU3RyaW5nIGFuZCB0aGUgb2JqZWN0IGNsYXNzPC9saT4KKyAgICAgKiA8bGk+cmV0dXJuIHRoZSBvYmplY3QncyB0b1N0cmluZzwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYiB0aGUgb2JqZWN0IHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHNvbWUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgcmVwbGFjZUZhaWxlZE9iamVjdChPYmplY3Qgb2IpIHsKKyAgICAgICAgaWYgKG9iID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGlzU2VyaWFsaXphYmxlKG9iKSkKKyAgICAgICAgICAgIHJldHVybiBvYjsKKworICAgICAgICAvLyBkb24ndCB0YWtlIG9pZCBvZiBuZXcgb2JqZWN0cyBzaW5jZSBpdCBjYW4gY2F1c2UgYSBmbHVzaCBpZiBhdXRvLWluYworICAgICAgICAvLyBhbmQgdGhlIGlkIGlzIG1lYW5pbmdsZXNzIGFueXdheQorICAgICAgICBPYmplY3Qgb2lkID0gZ2V0T2JqZWN0SWQob2IpOworICAgICAgICBpZiAob2lkICE9IG51bGwgJiYgaXNTZXJpYWxpemFibGUob2lkKSkKKyAgICAgICAgICAgIHJldHVybiBvaWQ7CisKKyAgICAgICAgLy8gbGFzdCBkaXRjaDogc3RyaW5naWZ5IHRoZSBvYmplY3QKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgdGhyb3dhYmxlcyBpbnRvIGEgc2VyaWFsemFibGUgYXJyYXkuIElmCisgICAgICogYW55IG9mIHRoZSBuZXN0ZWQgdGhyb3dhYmxlcyBjYW5ub3QgYmUgc2VyaWFsaXplZCwgdGhleSB3aWxsCisgICAgICogYmUgY29udmVydGVkIGludG8gYSBFeGNlcHRpb24gd2l0aCB0aGUgb3JpZ2luYWwgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRocm93YWJsZVtdIHJlcGxhY2VOZXN0ZWRUaHJvd2FibGVzKFRocm93YWJsZVtdIG5lc3RlZCkgeworICAgICAgICBpZiAobmVzdGVkID09IG51bGwgfHwgbmVzdGVkLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG5lc3RlZDsKKyAgICAgICAgaWYgKGlzU2VyaWFsaXphYmxlKG5lc3RlZCkpCisgICAgICAgICAgICByZXR1cm4gbmVzdGVkOworCisgICAgICAgIFRocm93YWJsZVtdIG5ld05lc3RlZCA9IG5ldyBUaHJvd2FibGVbbmVzdGVkLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXNTZXJpYWxpemFibGUobmVzdGVkW2ldKSkKKyAgICAgICAgICAgICAgICBuZXdOZXN0ZWRbaV0gPSBuZXN0ZWRbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV3TmVzdGVkW2ldID0gbmV3IEV4Y2VwdGlvbihuZXN0ZWRbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld05lc3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBpZCBmb3IgPGNvZGU+b2I8L2NvZGU+IGlmIGl0IGhhcyBvbmUsIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRPYmplY3RJZChPYmplY3Qgb2IpIHsKKyAgICAgICAgaWYgKG9iIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlCisgICAgICAgICAgICAmJiAhKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iKS5wY0lzTmV3KCkpCisgICAgICAgICAgICByZXR1cm4gKChQZXJzaXN0ZW5jZUNhcGFibGUpIG9iKS5wY0ZldGNoT2JqZWN0SWQoKTsKKyAgICAgICAgZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0Zsb2F0SWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9GbG9hdElkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxZTQ1MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9GbG9hdElkLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworLyoqCisgKiB7QGxpbmsgT3BlbkpQQUlkfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgZmxvYXQgZmllbGRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGbG9hdElkIAorICAgIGV4dGVuZHMgT3BlbkpQQUlkIHsKKworICAgIHByaXZhdGUgZmluYWwgZmxvYXQga2V5OworCisgICAgcHVibGljIEZsb2F0SWQoQ2xhc3MgY2xzLCBGbG9hdCBrZXkpIHsKKyAgICAgICAgdGhpcyhjbHMsIChrZXkgPT0gbnVsbCkgPyAwRiA6IGtleS5mbG9hdFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBGbG9hdElkKENsYXNzIGNscywgU3RyaW5nIGtleSkgeworICAgICAgICB0aGlzKGNscywgKGtleSA9PSBudWxsKSA/IDBGIDogRmxvYXQucGFyc2VGbG9hdChrZXkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXRJZChDbGFzcyBjbHMsIGZsb2F0IGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXRJZChDbGFzcyBjbHMsIGZsb2F0IGtleSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHN1cGVyKGNscywgc3Vicyk7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gbmV3IEZsb2F0KGtleSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIEZsb2F0LnRvU3RyaW5nKGtleSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpZEhhc2goKSB7CisgICAgICAgIHJldHVybiBGbG9hdC5mbG9hdFRvSW50Qml0cyhrZXkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlkRXF1YWxzKE9wZW5KUEFJZCBvKSB7CisgICAgICAgIHJldHVybiBrZXkgPT0gKChGbG9hdElkKSBvKS5rZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0dlbmVyYWxFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9HZW5lcmFsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ODQ3ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9HZW5lcmFsRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBHZW5lcmFsIGV4Y2VwdGlvbiB0eXBlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmFsRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBPcGVuSlBBRXhjZXB0aW9uIHsKKworICAgIHB1YmxpYyBHZW5lcmFsRXhjZXB0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBHZW5lcmFsRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR2VuZXJhbEV4Y2VwdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBHZW5lcmFsRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIEdlbmVyYWxFeGNlcHRpb24oTWVzc2FnZSBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBHRU5FUkFMOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9JZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0lkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3MDg2OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9JZC5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBEYXRhc3RvcmUgaWRlbnRpdHkgdHlwZS4gSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2UgdG8gdXNlIHRoaXMgdHlwZSwKKyAqIG9yIGNob29zZSB0byB1c2UgdGhlaXIgb3duIGRhdGFzdG9yZSBpZGVudGl0eSB2YWx1ZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIElkCisgICAgZXh0ZW5kcyBPcGVuSlBBSWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZShJZC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgX2lkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGlkIGZyb20gdGhlIGdpdmVuIHR5cGUgYW5kIHZhbHVlOyB0aGUgdmFsdWUgbWlnaHQgYmUgYW4KKyAgICAgKiBpZCBpbnN0bmFjZSwgYSBzdHJpbmdpZmllZCBpZCwgb3IgYSBwcmltYXJ5IGtleSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElkIG5ld0luc3RhbmNlKENsYXNzIGNscywgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgSWQpCisgICAgICAgICAgICByZXR1cm4gKElkKSB2YWw7CisgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gbmV3IElkKGNscywgKFN0cmluZykgdmFsKTsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgICAgIHJldHVybiBuZXcgSWQoY2xzLCAoKE51bWJlcikgdmFsKS5sb25nVmFsdWUoKSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgSWQoY2xzLCAwTCk7CisgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bmtub3duLW9pZCIsIGNscywgdmFsLAorICAgICAgICAgICAgdmFsLmdldENsYXNzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaWQgZnJvbSB0aGUgcmVzdWx0IG9mIGEge0BsaW5rICN0b1N0cmluZ30gY2FsbCBvbiBhbm90aGVyCisgICAgICogaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIElkKFN0cmluZyBzdHIpIHsKKyAgICAgICAgdGhpcyhzdHIsIChDbGFzc0xvYWRlcikgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGlkIGZyb20gdGhlIHJlc3VsdCBvZiBhbiB7QGxpbmsgI3RvU3RyaW5nfSBjYWxsIG9uIGFub3RoZXIKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWQoU3RyaW5nIHN0ciwgT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZiwgQ2xhc3NMb2FkZXIgYnJva2VyTG9hZGVyKSB7CisgICAgICAgIHRoaXMoc3RyLCAoY29uZiA9PSBudWxsKSA/IGJyb2tlckxvYWRlciA6IGNvbmYuCisgICAgICAgICAgICBnZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS5nZXRDbGFzc0xvYWRlcihJZC5jbGFzcywgYnJva2VyTG9hZGVyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGlkIGZyb20gdGhlIHJlc3VsdCBvZiBhbiB7QGxpbmsgI3RvU3RyaW5nfSBjYWxsIG9uIGFub3RoZXIKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWQoU3RyaW5nIHN0ciwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgX2lkID0gMEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGRhc2ggPSBzdHIuaW5kZXhPZignLScpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0eXBlID0gQ2xhc3MuZm9yTmFtZShzdHIuc3Vic3RyaW5nKDAsIGRhc2gpLCB0cnVlLCBsb2FkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgic3RyaW5nLWlkIiwgc3RyKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaWQgPSBMb25nLnBhcnNlTG9uZyhzdHIuc3Vic3RyaW5nKGRhc2ggKyAxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSB0aGUgcmVzdWx0IG9mIGEge0BsaW5rICN0b1N0cmluZ30gY2FsbCBvbiBhbm90aGVyCisgICAgICogaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIElkKENsYXNzIGNscywgU3RyaW5nIGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworCisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgIF9pZCA9IDBMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFsbG93IGVpdGhlciBzdHJpbmdpZmllZCBsb25nIG9yIHJlc3VsdCBvZiBJZC50b1N0cmluZworICAgICAgICAgICAgaW50IGRhc2ggPSBrZXkuaW5kZXhPZignLScpOworICAgICAgICAgICAgaWYgKGRhc2ggPiAwKSAvLyBkb24ndCBjaGVjayBmb3IgLTE7IG1pZ2h0IGJlIG5lZ2F0aXZlIG51bWJlcgorICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoZGFzaCArIDEpOworICAgICAgICAgICAgX2lkID0gTG9uZy5wYXJzZUxvbmcoa2V5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGtleSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWQoQ2xhc3MgY2xzLCBMb25nIGtleSkgeworICAgICAgICB0aGlzKGNscywgKGtleSA9PSBudWxsKSA/IDBMIDoga2V5LmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBrZXkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIElkKENsYXNzIGNscywgbG9uZyBrZXkpIHsKKyAgICAgICAgc3VwZXIoY2xzKTsKKyAgICAgICAgX2lkID0ga2V5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGtleSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWQoQ2xhc3MgY2xzLCBsb25nIGtleSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHN1cGVyKGNscywgc3Vicyk7CisgICAgICAgIF9pZCA9IGtleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmltYXJ5IGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF9pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKF9pZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpZEhhc2goKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoX2lkIF4gKF9pZCA+Pj4gMzIpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpZEVxdWFscyhPcGVuSlBBSWQgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIF9pZCA9PSAoKElkKSBvdGhlcikuX2lkOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9JbXBsSGVscGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvSW1wbEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmVmZTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvSW1wbEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkxvY2tNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlBDU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuUmVmZXJlbmNlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5VVUlER2VuZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuU2VxdWVuY2VNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CisKKy8qKgorICogSGVscGVyIGZvciBPcGVuSlBBIGJhY2stZW5kcy4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsSGVscGVyIHsKKworICAgIC8vIENhY2hlIGZvciBmcm9tL3RvIHR5cGUgYXNzaWdubWVudHMKKyAgICBwcml2YXRlIHN0YXRpYyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcCBfYXNzaWduYWJsZVR5cGVzID0KKyAgICAgICAgbmV3IENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwKFJlZmVyZW5jZU1hcC5XRUFLLCBSZWZlcmVuY2VNYXAuSEFSRCk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIHN0b3JlIG1hbmFnZXIgaW1wbGVtZW50YXRpb25zLiBUaGlzIG1ldGhvZCBzaW1wbHkgZGVsZWdhdGVzCisgICAgICogdG8gdGhlIHByb3BlciBzaW5ndWxhciBtZXRob2QgZm9yIGVhY2ggc3RhdGUgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBzZWUgU3RvcmVNYW5hZ2VyI2xvYWRBbGwKKyAgICAgKiBAc2luY2UgMC40LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gbG9hZEFsbChDb2xsZWN0aW9uIHNtcywgU3RvcmVNYW5hZ2VyIHN0b3JlLAorICAgICAgICBQQ1N0YXRlIHN0YXRlLCBpbnQgbG9hZCwgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICBDb2xsZWN0aW9uIGZhaWxlZCA9IG51bGw7CisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc207CisgICAgICAgIExvY2tNYW5hZ2VyIGxtOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IHNtcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgc20gPSAoT3BlbkpQQVN0YXRlTWFuYWdlcikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdG9yZS5pbml0aWFsaXplKHNtLCBzdGF0ZSwgZmV0Y2gsIGNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSBhZGRGYWlsZWRJZChzbSwgZmFpbGVkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9hZCAhPSBTdG9yZU1hbmFnZXIuRk9SQ0VfTE9BRF9OT05FCisgICAgICAgICAgICAgICAgfHwgc20uZ2V0UENTdGF0ZSgpID09IFBDU3RhdGUuSE9MTE9XKSB7CisgICAgICAgICAgICAgICAgbG0gPSBzbS5nZXRDb250ZXh0KCkuZ2V0TG9ja01hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0b3JlLmxvYWQoc20sIHNtLmdldFVubG9hZGVkKGZldGNoKSwgZmV0Y2gsIAorICAgICAgICAgICAgICAgICAgICBsbS5nZXRMb2NrTGV2ZWwoc20pLCBjb250ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gYWRkRmFpbGVkSWQoc20sIGZhaWxlZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdG9yZS5leGlzdHMoc20sIGNvbnRleHQpKQorICAgICAgICAgICAgICAgIGZhaWxlZCA9IGFkZEZhaWxlZElkKHNtLCBmYWlsZWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFpbGVkID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGZhaWxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgaWRlbnRpdHkgb2YgZ2l2ZW4gaW5zdGFuY2UgdG8gY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGFkZEZhaWxlZElkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIENvbGxlY3Rpb24gZmFpbGVkKSB7CisgICAgICAgIGlmIChmYWlsZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIGZhaWxlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZmFpbGVkLmFkZChzbS5nZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIGZhaWxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEsIG9yIHJldHVybiBudWxsLiBHZW5lcmF0ZXMKKyAgICAgKiB2YWx1ZXMgZm9yIGh0ZSBmb2xsb3dpbmcgc3RyYXRlZ2llczoge0BsaW5rIFZhbHVlU3RyYXRlZ2llcyNTRVFVRU5DRX0sCisgICAgICoge0BsaW5rIFZhbHVlU3RyYXRlZ2llcyNVVUlEX1NUUklOR30sIHtAbGluayBWYWx1ZVN0cmF0ZWdpZXMjVVVJRF9IRVh9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVJZGVudGl0eVZhbHVlKFN0b3JlQ29udGV4dCBjdHgsCisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSwgaW50IHR5cGVDb2RlKSB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZVZhbHVlKGN0eCwgbWV0YSwgbnVsbCwgdHlwZUNvZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSwgb3IgcmV0dXJuIG51bGwuIEdlbmVyYXRlcworICAgICAqIHZhbHVlcyBmb3IgaHRlIGZvbGxvd2luZyBzdHJhdGVnaWVzOiB7QGxpbmsgVmFsdWVTdHJhdGVnaWVzI1NFUVVFTkNFfSwKKyAgICAgKiB7QGxpbmsgVmFsdWVTdHJhdGVnaWVzI1VVSURfU1RSSU5HfSwge0BsaW5rIFZhbHVlU3RyYXRlZ2llcyNVVUlEX0hFWH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZW5lcmF0ZUZpZWxkVmFsdWUoU3RvcmVDb250ZXh0IGN0eCwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlVmFsdWUoY3R4LCBmbWQuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLCBmbWQsIAorICAgICAgICAgICAgZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIG1ldGFkYWEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlVmFsdWUoU3RvcmVDb250ZXh0IGN0eCwKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhLCBGaWVsZE1ldGFEYXRhIGZtZCwgaW50IHR5cGVDb2RlKSB7CisgICAgICAgIGludCBzdHJhdGVneSA9IChmbWQgPT0gbnVsbCkgPyBtZXRhLmdldElkZW50aXR5U3RyYXRlZ3koKQorICAgICAgICAgICAgOiBmbWQuZ2V0VmFsdWVTdHJhdGVneSgpOworICAgICAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7CisgICAgICAgICAgICBjYXNlIFZhbHVlU3RyYXRlZ2llcy5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhIHNtZCA9IChmbWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBtZXRhLmdldElkZW50aXR5U2VxdWVuY2VNZXRhRGF0YSgpCisgICAgICAgICAgICAgICAgICAgIDogZm1kLmdldFZhbHVlU2VxdWVuY2VNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVHlwZXMuY29udmVydChzbWQuZ2V0SW5zdGFuY2UoY3R4LmdldENsYXNzTG9hZGVyKCkpLgorICAgICAgICAgICAgICAgICAgICBuZXh0KGN0eCwgbWV0YSksIHR5cGVDb2RlKTsKKyAgICAgICAgICAgIGNhc2UgVmFsdWVTdHJhdGVnaWVzLlVVSURfU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBVVUlER2VuZXJhdG9yLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGNhc2UgVmFsdWVTdHJhdGVnaWVzLlVVSURfSEVYOgorICAgICAgICAgICAgICAgIHJldHVybiBVVUlER2VuZXJhdG9yLm5leHRIZXgoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogCisgICAgICogUmV0dXJucyB0aGUgZmllbGRzIG9mIHRoZSBzdGF0ZSB0aGF0IHJlcXVpcmUgYW4gdXBkYXRlLiAKKyAgICAgKiAgCisgICAgICogQHBhcmFtICBzbSAgdGhlIHN0YXRlIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0aGUgQml0U2V0IG9mIGZpZWxkcyB0aGF0IG5lZWQgdXBkYXRlLCBvciBudWxsIGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJpdFNldCBnZXRVcGRhdGVGaWVsZHMoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBpZiAoKHNtLmdldFBDU3RhdGUoKSA9PSBQQ1N0YXRlLlBESVJUWQorICAgICAgICAgICAgJiYgKCFzbS5pc0ZsdXNoZWQoKSB8fCBzbS5pc0ZsdXNoZWREaXJ0eSgpKSkKKyAgICAgICAgICAgIHx8IChzbS5nZXRQQ1N0YXRlKCkgPT0gUENTdGF0ZS5QTkVXICYmIHNtLmlzRmx1c2hlZERpcnR5KCkpKSB7CisgICAgICAgICAgICBCaXRTZXQgZGlydHkgPSBzbS5nZXREaXJ0eSgpOworICAgICAgICAgICAgaWYgKHNtLmlzRmx1c2hlZCgpKSB7CisgICAgICAgICAgICAgICAgZGlydHkgPSAoQml0U2V0KSBkaXJ0eS5jbG9uZSgpOworICAgICAgICAgICAgICAgIGRpcnR5LmFuZE5vdChzbS5nZXRGbHVzaGVkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpcnR5Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlydHk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGdpdmVuIHJlc291cmNlLiBUaGUgcmVzb3VyY2UgY2FuIGJlIGFuIGV4dGVudCBpdGVyYXRvciwKKyAgICAgKiBxdWVyeSByZXN1bHQsIGxhcmdlIHJlc3VsdCBzZXQgcmVsYXRpb24sIG9yIGFueSBjbG9zZWFibGUgT3BlbkpQQQorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT2JqZWN0IG8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2xvc2VhYmxlKQorICAgICAgICAgICAgICAgICgoQ2xvc2VhYmxlKSBvKS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSB0eXBlIHRoYXQgY2FuIGJlIG1hbmFnZWQgYnkKKyAgICAgKiBPcGVuSlBBLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIHRvIHRlc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsYXNzIGlzIG1hbmFnZWFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFuYWdlZFR5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VDYXBhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdGFuY2UgaXMgbWFuYWdlYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgb2JqZWN0IHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpcyBhIHBlcnNpc3RlbnQgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFuYWdlYWJsZShPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VDYXBhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlZCAidG8iIGNsYXNzIGlzIGFzc2lnbmFibGUgdG8gdGhlICJmcm9tIgorICAgICAqIGNsYXNzLiAgVGhpcyBoZWxwZXIgbWV0aG9kIHV0aWxpemVzIGEgY2FjaGUgdG8gaGVscCBhdm9pZCB0aGUgb3ZlcmhlYWQKKyAgICAgKiBvZiB0aGUgQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tIHRhcmdldCBjbGFzcyBpbnN0YW5jZSB0byBiZSBjaGVja2VkIGZvciBhc3NpZ25hYmlsaXR5CisgICAgICogQHBhcmFtIHRvIHNlY29uZCBjbGFzcyBpbnN0YW5jZSB0byBiZSBjaGVja2VkIGZvciBhc3NpZ25hYmlsaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSAidG8iIGNsYXNzIGlzIGFzc2lnbmFibGUgdG8gdGhlICJmcm9tIiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGUoQ2xhc3MgZnJvbSwgQ2xhc3MgdG8pIHsKKyAgICAgICAgaWYgKGZyb20gPT0gbnVsbCB8fCB0byA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEJvb2xlYW4gaXNBc3NpZ25hYmxlID0gbnVsbDsKKyAgICAgICAgTWFwIGFzc2lnbmFibGVUbyA9IChNYXApIF9hc3NpZ25hYmxlVHlwZXMuZ2V0KGZyb20pOworICAgICAgICBpZiAoYXNzaWduYWJsZVRvID09IG51bGwpIHsgLy8gInRvIiBjYWNoZSBkb2Vzbid0IGV4aXN0LCBzbyBjcmVhdGUgaXQuLi4KKyAgICAgICAgICAgIGFzc2lnbmFibGVUbyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCgpOworICAgICAgICAgICAgX2Fzc2lnbmFibGVUeXBlcy5wdXQoZnJvbSwgYXNzaWduYWJsZVRvKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gInRvIiBjYWNoZSBleGlzdHMuLi4KKyAgICAgICAgICAgIGlzQXNzaWduYWJsZSA9IChCb29sZWFuKSBhc3NpZ25hYmxlVG8uZ2V0KHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0Fzc2lnbmFibGUgPT0gbnVsbCkgey8vIHdlIGRvbid0IGhhdmUgYSByZWNvcmQgb2YgdGhpcyBwYWlyLi4uCisgICAgICAgICAgICBpc0Fzc2lnbmFibGUgPSBCb29sZWFuLnZhbHVlT2YoZnJvbS5pc0Fzc2lnbmFibGVGcm9tKHRvKSk7CisgICAgICAgICAgICBhc3NpZ25hYmxlVG8ucHV0KHRvLCBpc0Fzc2lnbmFibGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZS5ib29sZWFuVmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvSW50SWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9JbnRJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmRiYzcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvSW50SWQuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICoge0BsaW5rIE9wZW5KUEFJZH0gc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIGludCBmaWVsZHMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEludElkIGV4dGVuZHMgT3BlbkpQQUlkIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGtleTsKKworICAgIHB1YmxpYyBJbnRJZChDbGFzcyBjbHMsIEludGVnZXIga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gMCA6IGtleS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50SWQoQ2xhc3MgY2xzLCBTdHJpbmcga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gMCA6IEludGVnZXIucGFyc2VJbnQoa2V5KSk7CisgICAgfQorCisgICAgcHVibGljIEludElkKENsYXNzIGNscywgaW50IGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50SWQoQ2xhc3MgY2xzLCBpbnQga2V5LCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgc3VwZXIoY2xzLCBzdWJzKTsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gTnVtYmVycy52YWx1ZU9mKGtleSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGtleSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpZEhhc2goKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgcmV0dXJuIGtleSA9PSAoKEludElkKSBvKS5rZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0ludGVybmFsRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvSW50ZXJuYWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY2MTQzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0ludGVybmFsRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBFeGNlcHRpb24gdHlwZSBmb3IgaW50ZXJuYWwgZXJyb3JzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjIKKyAqLworcHVibGljIGNsYXNzIEludGVybmFsRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBPcGVuSlBBRXhjZXB0aW9uIHsKKworICAgIHB1YmxpYyBJbnRlcm5hbEV4Y2VwdGlvbigpIHsKKyAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIEludGVybmFsRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIEludGVybmFsRXhjZXB0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlcm5hbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZXJuYWxFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZXJuYWxFeGNlcHRpb24oTWVzc2FnZSBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gSU5URVJOQUw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0ludmFsaWRTdGF0ZUV4Y2VwdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0ludmFsaWRTdGF0ZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDY3NDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvSW52YWxpZFN0YXRlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBFeGNlcHRpb24gdHlwZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uIHRoYXQKKyAqIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBjdXJyZW50IHN0YXRlLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIEludmFsaWRTdGF0ZUV4Y2VwdGlvbgorICAgIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgSW52YWxpZFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIEludmFsaWRTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlIG1zZywgT2JqZWN0IGZhaWxlZCkgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBzZXRGYWlsZWRPYmplY3QoZmFpbGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX1NUQVRFOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9MUlNQcm94eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0xSU1Byb3h5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5NGM3NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9MUlNQcm94eS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBmb3IgbGFyZ2UgcmVzdWx0IHNldCBwcm94aWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjAuMworICovCitwdWJsaWMgaW50ZXJmYWNlIExSU1Byb3h5CisgICAgZXh0ZW5kcyBQcm94eSB7CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Mb2NrRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTG9ja0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmEzMmEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTG9ja0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIEV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgbG9ja3Mgb24gb25lIG9yIG1vcmUgb2JqZWN0cyBjb3VsZCBub3QgYmUgYWNxdWlyZWQuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBzaW5jZSAwLjMuMQorICovCitwdWJsaWMgY2xhc3MgTG9ja0V4Y2VwdGlvbgorICAgIGV4dGVuZHMgU3RvcmVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdHJhbnNpZW50IExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKExvY2tFeGNlcHRpb24uY2xhc3MpOworCisgICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IC0xOworCisgICAgcHVibGljIExvY2tFeGNlcHRpb24oT2JqZWN0IGZhaWxlZCkgeworICAgICAgICBzdXBlcihfbG9jLmdldCgibG9jay1mYWlsZWQiLCBFeGNlcHRpb25zLnRvU3RyaW5nKGZhaWxlZCkpKTsKKyAgICAgICAgc2V0RmFpbGVkT2JqZWN0KGZhaWxlZCk7CisgICAgfQorCisgICAgcHVibGljIExvY2tFeGNlcHRpb24oT2JqZWN0IGZhaWxlZCwgaW50IHRpbWVvdXQpIHsKKyAgICAgICAgc3VwZXIoX2xvYy5nZXQoImxvY2stdGltZW91dCIsIEV4Y2VwdGlvbnMudG9TdHJpbmcoZmFpbGVkKSwKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHRpbWVvdXQpKSk7CisgICAgICAgIHNldEZhaWxlZE9iamVjdChmYWlsZWQpOworICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIExPQ0s7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYSBsb2NrLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYSBsb2NrLgorICAgICAqLworICAgIHB1YmxpYyBMb2NrRXhjZXB0aW9uIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHN1cGVyLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICh0aW1lb3V0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIHJldHVybiBzdHIgKyBFeGNlcHRpb25zLlNFUCArICJUaW1lb3V0OiAiICsgdGltZW91dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlSW50KHRpbWVvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0aW1lb3V0ID0gaW4ucmVhZEludCgpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Mb25nSWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Mb25nSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmNhMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0xvbmdJZC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiB7QGxpbmsgT3BlbkpQQUlkfSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgbG9uZyBmaWVsZHMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIExvbmdJZCBleHRlbmRzIE9wZW5KUEFJZCB7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcga2V5OworCisgICAgcHVibGljIExvbmdJZChDbGFzcyBjbHMsIExvbmcga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gMEwgOiBrZXkubG9uZ1ZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBMb25nSWQoQ2xhc3MgY2xzLCBTdHJpbmcga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gMEwgOiBMb25nLnBhcnNlTG9uZyhrZXkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZ0lkKENsYXNzIGNscywgbG9uZyBrZXkpIHsKKyAgICAgICAgc3VwZXIoY2xzKTsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCisgICAgcHVibGljIExvbmdJZChDbGFzcyBjbHMsIGxvbmcga2V5LCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgc3VwZXIoY2xzLCBzdWJzKTsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlcnMudmFsdWVPZihrZXkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgaWRIYXNoKCkgeworICAgICAgICByZXR1cm4gKGludCkgKGtleSBeIChrZXkgPj4+IDMyKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgcmV0dXJuIGtleSA9PSAoKExvbmdJZCkgbykua2V5OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9NYXBDaGFuZ2VUcmFja2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTWFwQ2hhbmdlVHJhY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDEwNTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTWFwQ2hhbmdlVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKKy8qKgorICogQ2hhbmdlIHRyYWNrZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbWFwcy4gSWYgdGhlIHVzZXIgY2FsbHMKKyAqIGFueSBtdXRhdGluZyBtZXRob2RzIG9uIHRoZSBtYXAgdGhhdCBkbyBub3QgaGF2ZSBhbiBlcXVpdmFsZW50IGluCisgKiB0aGlzIGNoYW5nZSB0cmFja2VyLCB0aGVuIHlvdSBtdXN0IGNhbGwge0BsaW5rIENoYW5nZVRyYWNrZXIjc3RvcFRyYWNraW5nfQorICogYWZ0ZXIgYXBwbHlpbmcgdGhlIG9wZXJhdGlvbiB0byB0aGUgbWFwLiBUaGUgY29sbGVjdGlvbnMgcmV0dXJuZWQgZnJvbQorICoge0BsaW5rIENoYW5nZVRyYWNrZXIjZ2V0QWRkZWR9IGFuZCB7QGxpbmsgQ2hhbmdlVHJhY2tlciNnZXRSZW1vdmVkfSB3aWxsCisgKiBiZSBjb2xsZWN0aW9ucyBvZiBrZXlzIHRvIGFkZC9yZW1vdmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBNYXBDaGFuZ2VUcmFja2VyCisgICAgZXh0ZW5kcyBDaGFuZ2VUcmFja2VyIHsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdHJhY2sga2V5cyBvciB2YWx1ZXMuIERlZmF1bHRzIHRvIGtleXMuCisgICAgICogSWYgeW91IHNldCB0byB2YWx1ZXMsIGl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgYSAxLTEgY29ycmVsYXRpb24KKyAgICAgKiBiZXR3ZWVuIGtleXMgYW5kIHZhbHVlcyBpbiB0aGlzIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFja0tleXMoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdHJhY2sga2V5cyBvciB2YWx1ZXMuIERlZmF1bHRzIHRvIGtleXMuCisgICAgICogSWYgeW91IHNldCB0byB2YWx1ZXMsIGl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgYSAxLTEgY29ycmVsYXRpb24KKyAgICAgKiBiZXR3ZWVuIGtleXMgYW5kIHZhbHVlcyBpbiB0aGlzIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFja0tleXMoYm9vbGVhbiBrZXlzKTsKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGF0IHRoZSBnaXZlbiBlbnRyeSB3YXMgYWRkZWQgdG8gdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGF0IHRoZSBnaXZlbiBlbnRyeSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGF0IHRoZSBnaXZlbiBlbnRyeSB3YXMgYWx0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkKE9iamVjdCBrZXksIE9iamVjdCBvbGRWYWwsIE9iamVjdCBuZXdWYWwpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL01hcENoYW5nZVRyYWNrZXJJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTWFwQ2hhbmdlVHJhY2tlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ3YzZiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL01hcENoYW5nZVRyYWNrZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIERlZmF1bHQge0BsaW5rIE1hcENoYW5nZVRyYWNrZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBDaGFuZ2VUcmFja2VySW1wbAorICAgIGV4dGVuZHMgQWJzdHJhY3RDaGFuZ2VUcmFja2VyCisgICAgaW1wbGVtZW50cyBNYXBDaGFuZ2VUcmFja2VyIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwIF9tYXA7CisgICAgcHJpdmF0ZSBib29sZWFuIF9rZXlzID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBNYXBDaGFuZ2VUcmFja2VySW1wbChNYXAgbWFwKSB7CisgICAgICAgIF9tYXAgPSBtYXA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhY2tLZXlzKCkgeworICAgICAgICByZXR1cm4gX2tleXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhY2tLZXlzKGJvb2xlYW4ga2V5cykgeworICAgICAgICBfa2V5cyA9IGtleXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkZWQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAoX2tleXMpCisgICAgICAgICAgICBzdXBlci5hZGRlZChrZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdXBlci5hZGRlZCh2YWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZWQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbCkgeworICAgICAgICBpZiAoX2tleXMpCisgICAgICAgICAgICBzdXBlci5yZW1vdmVkKGtleSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1cGVyLnJlbW92ZWQodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkKE9iamVjdCBrZXksIE9iamVjdCBvbGRWYWwsIE9iamVjdCBuZXdWYWwpIHsKKyAgICAgICAgaWYgKF9rZXlzKQorICAgICAgICAgICAgc3VwZXIuY2hhbmdlZChrZXkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLnJlbW92ZWQob2xkVmFsKTsKKyAgICAgICAgICAgIHN1cGVyLmFkZGVkKG5ld1ZhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGQoT2JqZWN0IG9iaikgeworICAgICAgICAvLyBpZiB0aGUga2V5IHdhcyBwcmV2aW91c2x5IHJlbW92ZWQgYW5kIG5vdyBhZGRlZCBiYWNrLCBtYXJrCisgICAgICAgIC8vIGl0IGFzIGEgY2hhbmdlOyBvdGhlcndpc2UgaXQncyBhIG5ldyBhZGRpdGlvbgorICAgICAgICBpZiAocmVtICE9IG51bGwgJiYgcmVtLnJlbW92ZShvYmopKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpCisgICAgICAgICAgICAgICAgY2hhbmdlID0gbmV3U2V0KCk7CisgICAgICAgICAgICBjaGFuZ2UuYWRkKG9iaik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhZnRlciBhIHBvaW50IGl0IGJlY29tZXMgaW5lZmZpY2llbnQgdG8gdHJhY2sgY2hhbmdlcworICAgICAgICAgICAgaWYgKGdldEF1dG9PZmYoKSAmJiBnZXRBZGRlZCgpLnNpemUoKSArIGdldENoYW5nZWQoKS5zaXplKCkKKyAgICAgICAgICAgICAgICArIGdldFJlbW92ZWQoKS5zaXplKCkgPj0gX21hcC5zaXplKCkpCisgICAgICAgICAgICAgICAgc3RvcFRyYWNraW5nKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGFkZCA9IG5ld1NldCgpOworICAgICAgICAgICAgICAgIGFkZC5hZGQob2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3Qgb2JqKSB7CisgICAgICAgIC8vIG5vIGxvbmdlciBhIGNoYW5nZSwgaWYgaXQgd2FzIGJlZm9yZQorICAgICAgICBpZiAoY2hhbmdlICE9IG51bGwpCisgICAgICAgICAgICBjaGFuZ2UucmVtb3ZlKG9iaik7CisKKyAgICAgICAgLy8gaWYgaXQgd2FzIGEgbmV3IGFkZGl0aW9uLCBqdXN0IGZvcmdldCBpdDsgb3RoZXJ3aXNlIHJlbWVtYmVyCisgICAgICAgIC8vIHRoYXQgaXQgd2FzIHJlbW92ZWQKKyAgICAgICAgaWYgKGFkZCA9PSBudWxsIHx8ICFhZGQucmVtb3ZlKG9iaikpIHsKKyAgICAgICAgICAgIC8vIGFmdGVyIGEgcG9pbnQgaXQgYmVjb21lcyBpbmVmZmljaWVudCB0byB0cmFjayBjaGFuZ2VzCisgICAgICAgICAgICBpZiAoZ2V0QXV0b09mZigpICYmIGdldEFkZGVkKCkuc2l6ZSgpICsgZ2V0Q2hhbmdlZCgpLnNpemUoKQorICAgICAgICAgICAgICAgICsgZ2V0UmVtb3ZlZCgpLnNpemUoKSA+PSBfbWFwLnNpemUoKSkKKyAgICAgICAgICAgICAgICBzdG9wVHJhY2tpbmcoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChyZW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVtID0gbmV3U2V0KCk7CisgICAgICAgICAgICAgICAgcmVtLmFkZChvYmopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlKE9iamVjdCBrZXkpIHsKKyAgICAgICAgLy8gaWYgdGhlIGtleSBpcyBhbHJlYWR5IGNoYW5nZWQgb3IgdGhlIGtleSBpcyBuZXdseSBhZGRlZCwgbm90aGluZworICAgICAgICAvLyB0byBkbworICAgICAgICBpZiAoKGNoYW5nZSAhPSBudWxsICYmIGNoYW5nZS5jb250YWlucyhrZXkpKQorICAgICAgICAgICAgfHwgKGFkZCAhPSBudWxsICYmIGFkZC5jb250YWlucyhrZXkpKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBhZnRlciBhIHBvaW50IGl0IGJlY29tZXMgaW5lZmZpY2llbnQgdG8gdHJhY2sgY2hhbmdlcworICAgICAgICBpZiAoZ2V0QXV0b09mZigpICYmIGdldEFkZGVkKCkuc2l6ZSgpICsgZ2V0Q2hhbmdlZCgpLnNpemUoKQorICAgICAgICAgICAgKyBnZXRSZW1vdmVkKCkuc2l6ZSgpID49IF9tYXAuc2l6ZSgpKQorICAgICAgICAgICAgc3RvcFRyYWNraW5nKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBjaGFuZ2UKKyAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjaGFuZ2UgPSBuZXdTZXQoKTsKKyAgICAgICAgICAgIGNoYW5nZS5hZGQoa2V5KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9NZXRhRGF0YUV4Y2VwdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL01ldGFEYXRhRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9NZXRhRGF0YUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyLk1lc3NhZ2U7CisKKy8qKgorICogRXhjZXB0aW9uIHR5cGUgcmVzZXJ2ZWQgZm9yIG1pc3Npbmcgb3IgaW52YWxpZCBtZXRhZGF0YS4KKyAqCisgKiBAc2luY2UgMC4zLjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhRGF0YUV4Y2VwdGlvbgorICAgIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgTWV0YURhdGFFeGNlcHRpb24oKSB7CisgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRGF0YUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRGF0YUV4Y2VwdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YURhdGFFeGNlcHRpb24oTWVzc2FnZSBtc2csIFRocm93YWJsZSBuZXN0ZWQpIHsKKyAgICAgICAgc3VwZXIobXNnLCBuZXN0ZWQpOworICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBNRVRBREFUQTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTXVsdGlMb2FkZXJDbGFzc1Jlc29sdmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTXVsdGlMb2FkZXJDbGFzc1Jlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1OWI1MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9NdWx0aUxvYWRlckNsYXNzUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk11bHRpQ2xhc3NMb2FkZXI7CisKKy8qKgorICogQSBzaW1wbGUge0BsaW5rIENsYXNzUmVzb2x2ZXJ9IHRoYXQgdXNlcyBtdWx0aXBsZSBjbGFzcyBsb2FkZXJzIHRvCisgKiByZXNvbHZlIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGNsYXNzIE11bHRpTG9hZGVyQ2xhc3NSZXNvbHZlciBpbXBsZW1lbnRzIENsYXNzUmVzb2x2ZXIgeworCisgICAgZmluYWwgcHJpdmF0ZSBNdWx0aUNsYXNzTG9hZGVyIF9sb2FkZXIgPSBuZXcgTXVsdGlDbGFzc0xvYWRlcigpOworCisgICAgcHVibGljIE11bHRpTG9hZGVyQ2xhc3NSZXNvbHZlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTXVsdGlMb2FkZXJDbGFzc1Jlc29sdmVyKENsYXNzTG9hZGVyW10gbG9hZGVycykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvYWRlcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBfbG9hZGVyLmFkZENsYXNzTG9hZGVyKGxvYWRlcnNbaV0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICByZXR1cm4gX2xvYWRlci5hZGRDbGFzc0xvYWRlcihsb2FkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihDbGFzcyBjdHgsIENsYXNzTG9hZGVyIGVudkxvYWRlcikgeworICAgICAgICByZXR1cm4gX2xvYWRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTm9SZXN1bHRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Ob1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTIxMDAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTm9SZXN1bHRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworCisvKioKKyAqIEV4Y2VwdGlvbiB0eXBlIHRocm93biB3aGVuIGEgcXVlcnkgd2FzIGNvbmZpZ3VyZWQgdG8gcmV0dXJuCisgKiBhIHNpbmdsZSByZXN1bHQsIGFuZCBubyByZXN1bHQgd2FzIGZvdW5kLgorICoKKyAqIEBzaW5jZSAwLjkuNworICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGNsYXNzIE5vUmVzdWx0RXhjZXB0aW9uCisgICAgZXh0ZW5kcyBJbnZhbGlkU3RhdGVFeGNlcHRpb24geworCisgICAgcHVibGljIE5vUmVzdWx0RXhjZXB0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIE5vUmVzdWx0RXhjZXB0aW9uKE1lc3NhZ2UgbXNnLCBPYmplY3QgZmFpbGVkKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHNldEZhaWxlZE9iamVjdChmYWlsZWQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE5PX1JFU1VMVDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Ob1RyYW5zYWN0aW9uRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTm9UcmFuc2FjdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3M2ZhMGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTm9UcmFuc2FjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyLk1lc3NhZ2U7CisKKy8qKgorICogRXhjZXB0aW9uIHR5cGUgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyBhIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHdpdGhvdXQKKyAqIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbi4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBOb1RyYW5zYWN0aW9uRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBJbnZhbGlkU3RhdGVFeGNlcHRpb24geworCisgICAgcHVibGljIE5vVHJhbnNhY3Rpb25FeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBOT19UUkFOU0FDVElPTjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhYjFiMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Ob25VbmlxdWVSZXN1bHRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworCisvKioKKyAqIEV4Y2VwdGlvbiB0eXBlIHRocm93biB3aGVuIGEgcXVlcnkgd2FzIGNvbmZpZ3VyZWQgdG8gcmV0dXJuCisgKiBhIHNpbmdsZSByZXN1bHQsIGFuZCBtdWx0aXBsZSByZXN1bHRzIHdlcmUgZm91bmQuCisgKgorICogQHNpbmNlIDAuOS43CisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uCisgICAgZXh0ZW5kcyBJbnZhbGlkU3RhdGVFeGNlcHRpb24geworCisgICAgcHVibGljIE5vblVuaXF1ZVJlc3VsdEV4Y2VwdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBOb25VbmlxdWVSZXN1bHRFeGNlcHRpb24oTWVzc2FnZSBtc2csIE9iamVjdCBmYWlsZWQpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgc2V0RmFpbGVkT2JqZWN0KGZhaWxlZCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgeworICAgICAgICByZXR1cm4gTk9OX1VOSVFVRV9SRVNVTFQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT2JqZWN0RXhpc3RzRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT2JqZWN0RXhpc3RzRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNjc0NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9PYmplY3RFeGlzdHNFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworCisvKioKKyAqIEV4Y2VwdGlvbiB0eXBlIHJlc2VydmVkIGZvciBjb25mbGljdHMgd2l0aCBleGlzdGluZyBvYmplY3RzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RFeGlzdHNFeGNlcHRpb24KKyAgICBleHRlbmRzIFN0b3JlRXhjZXB0aW9uIHsKKworICAgIHB1YmxpYyBPYmplY3RFeGlzdHNFeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBPQkpFQ1RfRVhJU1RTOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL09iamVjdElkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT2JqZWN0SWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY5NmRiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL09iamVjdElkLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworLyoqCisgKiBJZGVudGl0eSB0eXBlIGFwcHJvcHJpYXRlIGZvciBvYmplY3QgcHJpbWFyeSBrZXkgZmllbGRzIGFuZCBzaGFyZWQKKyAqIGlkIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdElkCisgICAgZXh0ZW5kcyBPcGVuSlBBSWQgeworCisgICAgcHJpdmF0ZSBPYmplY3QgX2tleTsKKworICAgIHB1YmxpYyBPYmplY3RJZChDbGFzcyBjbHMsIE9iamVjdCBrZXkpIHsKKyAgICAgICAgc3VwZXIoY2xzKTsKKyAgICAgICAgX2tleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0SWQoQ2xhc3MgY2xzLCBPYmplY3Qga2V5LCBib29sZWFuIHN1YnMpIHsKKyAgICAgICAgc3VwZXIoY2xzLCBzdWJzKTsKKyAgICAgICAgX2tleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkKCkgeworICAgICAgICByZXR1cm4gX2tleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyB1dGlsaXRpZXMgaW4gdGhpcyBwYWNrYWdlIHRvIG11dGF0ZSBpZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldElkKE9iamVjdCBpZCkgeworICAgICAgICBfa2V5ID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9rZXk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpZEhhc2goKSB7CisgICAgICAgIHJldHVybiAoX2tleSA9PSBudWxsKSA/IDAgOiBfa2V5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgT2JqZWN0IGtleSA9ICgoT2JqZWN0SWQpIG8pLl9rZXk7CisgICAgICAgIHJldHVybiAoX2tleSA9PSBudWxsKSA/IGtleSA9PSBudWxsIDogX2tleS5lcXVhbHMoa2V5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWQ4NzYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBFeGNlcHRpb24gdHlwZSByZXNlcnZlZCBmb3IgZmFpbGVkIG9iamVjdCBsb29rdXBzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgorICAgIGV4dGVuZHMgU3RvcmVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdHJhbnNpZW50IExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKTsKKworICAgIHB1YmxpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihPYmplY3QgZmFpbGVkKSB7CisgICAgICAgIHN1cGVyKF9sb2MuZ2V0KCJub3QtZm91bmQiLCBFeGNlcHRpb25zLnRvU3RyaW5nKGZhaWxlZCkpKTsKKyAgICAgICAgc2V0RmFpbGVkT2JqZWN0KGZhaWxlZCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKENvbGxlY3Rpb24gZmFpbGVkLCBUaHJvd2FibGVbXSBuZXN0ZWQpIHsKKyAgICAgICAgc3VwZXIoX2xvYy5nZXQoIm5vdC1mb3VuZC1tdWx0aSIsIEV4Y2VwdGlvbnMudG9TdHJpbmcoZmFpbGVkKSkpOworICAgICAgICBzZXROZXN0ZWRUaHJvd2FibGVzKG5lc3RlZCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgeworICAgICAgICByZXR1cm4gT0JKRUNUX05PVF9GT1VORDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9PcGVuSlBBRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT3BlbkpQQUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MGQ0MDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT3BlbkpQQUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBFeGNlcHRpb24gdHlwZSBmb3IgYWxsIE9wZW5KUEEgZXhjZXB0aW9ucy4gTWVhbnQgdG8gYmUgZWFzaWx5CisgKiB0cmFuc2Zvcm1lZCBpbnRvIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBhdCB0aGUgQVBJIGxheWVyLCBzaW5jZSBtb3N0IEFQSXMKKyAqIGRlZmluZSB0aGVpciBvd24gZXhjZXB0aW9uIHR5cGVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZW5KUEFFeGNlcHRpb24KKyAgICBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgRXhjZXB0aW9uSW5mbyB7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIF9mYXRhbCA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBfZmFpbGVkID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBUaHJvd2FibGVbXSBfbmVzdGVkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFeGNlcHRpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggY2F1c2UuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHRoaXMoY2F1c2UuZ2V0TWVzc2FnZSgpLCBjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggbWVzc2FnZSBhbmQgY2F1c2UuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHNldENhdXNlKGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qgd2l0aCBtZXNzYWdlIGFuZCBjYXVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQUV4Y2VwdGlvbihNZXNzYWdlIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1zZy5nZXRNZXNzYWdlKCkpOworICAgICAgICBzZXRDYXVzZShjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhjZXB0aW9uIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gc3VidHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyBmYXRhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsKCkgeworICAgICAgICByZXR1cm4gX2ZhdGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyBmYXRhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQUV4Y2VwdGlvbiBzZXRGYXRhbChib29sZWFuIGZhdGFsKSB7CisgICAgICAgIF9mYXRhbCA9IGZhdGFsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgVGhyb3dhYmxlfSBmcm9tIHtAbGluayAjZ2V0TmVzdGVkVGhyb3dhYmxlc30KKyAgICAgKiBpbiBvcmRlciB0byBjb25mb3JtIHRvIHtAbGluayBUaHJvd2FibGUjZ2V0Q2F1c2V9IGluIEphdmEgMS40Ky4KKyAgICAgKgorICAgICAqIEBzZWUgVGhyb3dhYmxlI2dldENhdXNlCisgICAgICovCisgICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKKyAgICAgICAgaWYgKF9uZXN0ZWQgPT0gbnVsbCB8fCBfbmVzdGVkLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfbmVzdGVkWzBdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBuZXN0ZWQgdGhyb3dhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uIHNldENhdXNlKFRocm93YWJsZSBuZXN0ZWQpIHsKKyAgICAgICAgaWYgKF9uZXN0ZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKG5lc3RlZCAhPSBudWxsKQorICAgICAgICAgICAgX25lc3RlZCA9IG5ldyBUaHJvd2FibGVbXXsgbmVzdGVkIH07CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuZXN0ZWQgdGhyb3dhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlW10gZ2V0TmVzdGVkVGhyb3dhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIChfbmVzdGVkID09IG51bGwpID8gRXhjZXB0aW9ucy5FTVBUWV9USFJPV0FCTEVTIDogX25lc3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmVzdGVkIHRocm93YWJsZXMuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFeGNlcHRpb24gc2V0TmVzdGVkVGhyb3dhYmxlcyhUaHJvd2FibGVbXSBuZXN0ZWQpIHsKKyAgICAgICAgX25lc3RlZCA9IG5lc3RlZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZhaWxlZCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRGYWlsZWRPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBfZmFpbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmYWlsZWQgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBRXhjZXB0aW9uIHNldEZhaWxlZE9iamVjdChPYmplY3QgZmFpbGVkKSB7CisgICAgICAgIF9mYWlsZWQgPSBmYWlsZWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBFeGNlcHRpb25zLnRvU3RyaW5nKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKKyAgICAgICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIEV4Y2VwdGlvbnMucHJpbnROZXN0ZWRUaHJvd2FibGVzKHRoaXMsIG91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihfZmF0YWwpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlRmFpbGVkT2JqZWN0KF9mYWlsZWQpKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KEV4Y2VwdGlvbnMucmVwbGFjZU5lc3RlZFRocm93YWJsZXMoX25lc3RlZCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBfZmF0YWwgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICBfZmFpbGVkID0gaW4ucmVhZE9iamVjdCgpOworICAgICAgICBfbmVzdGVkID0gKFRocm93YWJsZVtdKSBpbi5yZWFkT2JqZWN0ICgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL09wZW5KUEFJZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL09wZW5KUEFJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDM0NzYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT3BlbkpQQUlkLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXA7CisKKy8qKgorICogSWRlbnRpdHkgY2xhc3MgZXh0ZW5kZWQgYnkgYnVpbHRpbiBPcGVuSlBBIGlkZW50aXR5IG9iamVjdHMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZW5KUEFJZAorICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZSwgU2VyaWFsaXphYmxlIHsKKworICAgIC8vIGNhY2hlIHRoZSB0eXBlcycgZ2VuZXJhdGVkIGhhc2hjb2RlcworICAgIHByaXZhdGUgc3RhdGljIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwIF90eXBlQ2FjaGUgPQorICAgICAgICBuZXcgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAoUmVmZXJlbmNlTWFwLldFQUssIFJlZmVyZW5jZU1hcC5IQVJEKTsKKworICAgIHByb3RlY3RlZCBDbGFzcyB0eXBlOworICAgIHByb3RlY3RlZCBib29sZWFuIHN1YnMgPSB0cnVlOworCisgICAgLy8gdHlwZSBoYXMgaGlzIGJhc2VkIG9uIHRoZSBsZWFzdC1kZXJpdmVkIG5vbi1vYmplY3QgY2xhc3Mgc28gdGhhdAorICAgIC8vIHVzZXItZ2l2ZW4gaWRzIHdpdGggbm9uLWV4YWN0IHR5cGVzIG1hdGNoIGlkcyB3aXRoIGV4YWN0IHR5cGVzCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IF90eXBlSGFzaCA9IDA7CisKKyAgICBwcm90ZWN0ZWQgT3BlbkpQQUlkKCkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPcGVuSlBBSWQoQ2xhc3MgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHByb3RlY3RlZCBPcGVuSlBBSWQoQ2xhc3MgdHlwZSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuc3VicyA9IHN1YnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwZXJzaXRlbnQgY2xhc3Mgd2hpY2ggdGhpcyBpZCBpbnN0YW5jZSByZXByZXNlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgb2lkIG1pZ2h0IGJlIGZvciBhIHN1YmNsYXNzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViY2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIHN1YnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBleGFjdCB0eXBlIG9mIHRoZSBkZXNjcmliZWQgaW5zdGFuY2Ugb25jZSBpdCBpcyBrbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VkSW5zdGFuY2VUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5zdWJzID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZGVudGl0eSB2YWx1ZSBhcyBhbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRJZE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZCdzIGhhc2ggY29kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGlkSGFzaCgpOworCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgaWQgdG8gdGhlIGlkIG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpZEVxdWFscyhPcGVuSlBBSWQgb3RoZXIpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIGhhc2hjb2RlIGZvciB0aGlzIElkLiAgQ2FjaGUgdGhlIHR5cGUncyBnZW5lcmF0ZWQgaGFzaGNvZGUKKyAgICAgKiBzbyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBnZW5lcmF0ZWQgZWFjaCB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGlmIChfdHlwZUhhc2ggPT0gMCkgeworICAgICAgICAgICAgSW50ZWdlciB0eXBlSGFzaEludCA9IChJbnRlZ2VyKSBfdHlwZUNhY2hlLmdldCh0eXBlKTsKKyAgICAgICAgICAgIGlmICh0eXBlSGFzaEludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgYmFzZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IGJhc2UuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgIHdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJjbGFzcyAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgICAgICBzdXBlcmNsYXNzID0gYmFzZS5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF90eXBlSGFzaCA9IGJhc2UuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICBfdHlwZUNhY2hlLnB1dCh0eXBlLCBuZXcgSW50ZWdlcihfdHlwZUhhc2gpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX3R5cGVIYXNoID0gdHlwZUhhc2hJbnQuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3R5cGVIYXNoIF4gaWRIYXNoKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBPcGVuSlBBSWQgaWQgPSAoT3BlbkpQQUlkKSBvOworICAgICAgICByZXR1cm4gaWRFcXVhbHMoaWQpICYmIChpZC50eXBlLmlzQXNzaWduYWJsZUZyb20odHlwZSkKKyAgICAgICAgICAgIHx8IChzdWJzICYmIHR5cGUuaXNBc3NpZ25hYmxlRnJvbShpZC50eXBlKSkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0eXBlLmdldE5hbWUoKSArICItIiArIGdldElkT2JqZWN0KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChvdGhlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIGdldElkT2JqZWN0KCkpLmNvbXBhcmVUbygoKE9wZW5KUEFJZCkgb3RoZXIpLgorICAgICAgICAgICAgZ2V0SWRPYmplY3QgKCkpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9PcHRpbWlzdGljRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT3B0aW1pc3RpY0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDI0OWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvT3B0aW1pc3RpY0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworCisvKioKKyAqIEV4Y2VwdGlvbiB0eXBlIGZvciBvcHRpbWlzdGljIGNvbmN1cnJlbmN5IHZpb2xhdGlvbnMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBzaW5jZSAwLjIuNQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgT3B0aW1pc3RpY0V4Y2VwdGlvbgorICAgIGV4dGVuZHMgU3RvcmVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdHJhbnNpZW50IExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE9wdGltaXN0aWNFeGNlcHRpb24uY2xhc3MpOworCisgICAgcHVibGljIE9wdGltaXN0aWNFeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW1pc3RpY0V4Y2VwdGlvbihPYmplY3QgZmFpbGVkKSB7CisgICAgICAgIHRoaXMoX2xvYy5nZXQoIm9wdC1sb2NrIiwgRXhjZXB0aW9ucy50b1N0cmluZyhmYWlsZWQpKSk7CisgICAgICAgIHNldEZhaWxlZE9iamVjdChmYWlsZWQpOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpbWlzdGljRXhjZXB0aW9uKFRocm93YWJsZVtdIG5lc3RlZCkgeworICAgICAgICB0aGlzKF9sb2MuZ2V0KCJvcHQtbG9jay1uZXN0ZWQiKSk7CisgICAgICAgIHNldE5lc3RlZFRocm93YWJsZXMobmVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW1pc3RpY0V4Y2VwdGlvbihDb2xsZWN0aW9uIGZhaWxlZCwgVGhyb3dhYmxlW10gbmVzdGVkKSB7CisgICAgICAgIHRoaXMoX2xvYy5nZXQoIm9wdC1sb2NrLW11bHRpIiwgRXhjZXB0aW9ucy50b1N0cmluZyhmYWlsZWQpKSk7CisgICAgICAgIHNldE5lc3RlZFRocm93YWJsZXMobmVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBPUFRJTUlTVElDOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94aWVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmE3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveGllcy5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciBtYW5hZ2luZyBwcm94aWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94aWVzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoUHJveGllcy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHByb3h5IHR5cGVzIHRvIGNoZWNrIGlmIHRoZSBnaXZlbiBvd25lcnMgYW5kIGZpZWxkIG5hbWVzCisgICAgICogYXJlIGVxdWl2YWxlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3duZXIoUHJveHkgcHJveHksIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sCisgICAgICAgIGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gcHJveHkuZ2V0T3duZXIoKSA9PSBzbSAmJiBwcm94eS5nZXRPd25lckZpZWxkKCkgPT0gZmllbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBwcm94eSB0eXBlcyB0byBjaGVjayB0aGF0IGFuIGF0dGVtcHQgdG8gYWRkIGEgbmV3IHZhbHVlIGlzIGxlZ2FsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxvd2VkVHlwZShPYmplY3QgdmFsdWUsIENsYXNzIGFsbG93ZWQpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgYWxsb3dlZCAhPSBudWxsICYmICFhbGxvd2VkLmlzSW5zdGFuY2UodmFsdWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWVsZW0tdHlwZSIsIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICBhbGxvd2VkLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgYWxsb3dlZCwKKyAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBwcm94eSB0eXBlcyB0byBkaXJ0eSB0aGVpciBvd25lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlydHkoUHJveHkgcHJveHksIGJvb2xlYW4gc3RvcFRyYWNraW5nKSB7CisgICAgICAgIGlmIChwcm94eS5nZXRPd25lcigpICE9IG51bGwpCisgICAgICAgICAgICBwcm94eS5nZXRPd25lcigpLmRpcnR5KHByb3h5LmdldE93bmVyRmllbGQoKSk7CisgICAgICAgIGlmIChzdG9wVHJhY2tpbmcgJiYgcHJveHkuZ2V0Q2hhbmdlVHJhY2tlcigpICE9IG51bGwpCisgICAgICAgICAgICBwcm94eS5nZXRDaGFuZ2VUcmFja2VyKCkuc3RvcFRyYWNraW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBwcm94eSB0eXBlcyB0byBub3RpZnkgY29sbGVjdGlvbiBvd25lciBvbiBlbGVtZW50IHJlbW92YWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZWQoUHJveHkgcHJveHksIE9iamVjdCByZW1vdmVkLCBib29sZWFuIGtleSkgeworICAgICAgICBpZiAocHJveHkuZ2V0T3duZXIoKSAhPSBudWxsICYmIHJlbW92ZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHByb3h5LmdldE93bmVyKCkucmVtb3ZlZChwcm94eS5nZXRPd25lckZpZWxkKCksIHJlbW92ZWQsIGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBwcm94eSB0eXBlcyB0byBzZXJpYWxpemUgbm9uLXByb3h5IHZlcnNpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHdyaXRlUmVwbGFjZShQcm94eSBwcm94eSwgYm9vbGVhbiBkZXRhY2hhYmxlKSB7CisgICAgICAgIGlmIChkZXRhY2hhYmxlICYmIChwcm94eSA9PSBudWxsIHx8IHByb3h5LmdldE93bmVyKCkgPT0gbnVsbCAKKyAgICAgICAgICAgIHx8IHByb3h5LmdldE93bmVyKCkuaXNEZXRhY2hlZCgpKSkKKyAgICAgICAgICAgIHJldHVybiBwcm94eTsKKyAgICAgICAgcmV0dXJuIHByb3h5LmNvcHkocHJveHkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFiOGFlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKKworLyoqCisgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIHByb3h5IHR5cGVzIHRvIGFsbG93IHNldHRpbmcgYW5kIG51bGxpbmcKKyAqIG9mIHRoZWlyIG93bmluZyBpbnN0YW5jZS4KKyAqIEFsbCBjb25jcmV0ZSBwcm94eSBjbGFzc2VzIHNob3VsZCBiZSBwdWJsaWMgYW5kIGhhdmUgcHVibGMgbm8tYXJncworICogY29uc3RydWN0b3JzIHNvIHRoYXQgdG9vbHMgdGhhdCB3b3JrIHZpYSByZWZsZWN0aW9uIG9uIHBlcnNpc3RlbnQgaW5zdGFuY2VzCisgKiBjYW4gbWFuaXB1bGF0ZSB0aGVtLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJveHkgeworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBwcm94eSwgYW5kIHNldCB0aGUgb3duaW5nIGluc3RhbmNlIG9mIHRoZQorICAgICAqIHByb3h5IGFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQgaXQgaXMgYXNzaWduZWQgdG8uIFNldCB0byBudWxsIHRvCisgICAgICogaW5kaWNhdGUgdGhhdCB0aGUgcHJveHkgaXMgbm8gbG9uZ2VyIG1hbmFnZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3duZXIoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgaW50IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3duaW5nIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVN0YXRlTWFuYWdlciBnZXRPd25lcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvd25pbmcgZmllbGQgaW5kZXguCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPd25lckZpZWxkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNoYW5nZSB0cmFja2VyIGZvciB0aGlzIHByb3h5LCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIENoYW5nZVRyYWNrZXIgZ2V0Q2hhbmdlVHJhY2tlcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIHVucHJveGllZCBjb3B5IG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4gVGhpcyBtZXRob2QgaXMgdXNlZAorICAgICAqIGJ5IHByb3h5IG1hbmFnZXJzIHRvIGNyZWF0ZSBiYWNrdXAgdmFsdWVzIGZvciB1c2UgaW4gcm9sbGJhY2suCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjb3B5KE9iamVjdCBvcmlnKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUJlYW4uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjljZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5QmVhbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKKy8qKgorICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFsbCBnZW5lcmF0ZWQgY3VzdG9tIHR5cGVzLCB3aGljaCB1c2UgSmF2YUJlYW4KKyAqIGNvbnZlbnRpb25zIGZvciBjb3B5aW5nIHN0YXRlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJveHlCZWFuIAorICAgIGV4dGVuZHMgUHJveHkgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcHJveHkgdHlwZSB3aXRoIHRoZSBzYW1lIHN0YXRlIGFzIHRoZQorICAgICAqIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBQcm94eUJlYW4gbmV3SW5zdGFuY2UoT2JqZWN0IG9yaWcpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5Q2FsZW5kYXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUNhbGVuZGFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3Njc2NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUNhbGVuZGFyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIGdlbmVyYXRlZCBwcm94aWVzIG9uIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9CisgKiB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb3h5Q2FsZW5kYXIKKyAgICBleHRlbmRzIFByb3h5IHsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNhbGVuZGFyIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFByb3h5Q2FsZW5kYXIgbmV3SW5zdGFuY2UoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUNvbGxlY3Rpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUNvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmE1MmQzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5Q29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIHByb3h5IGNvbGxlY3Rpb24gdHlwZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBQcm94eUNvbGxlY3Rpb24gCisgICAgZXh0ZW5kcyBQcm94eSwgQ29sbGVjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sbGVjdGlvbiBlbGVtZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldEVsZW1lbnRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBwcm94eSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBQcm94eUNvbGxlY3Rpb24gbmV3SW5zdGFuY2UoQ2xhc3MgZWxlbWVudFR5cGUsIENvbXBhcmF0b3IgY29tcCwKKyAgICAgICAgYm9vbGVhbiB0cmFja0NoYW5nZXMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5Q29sbGVjdGlvbnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUNvbGxlY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhOGMzYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eUNvbGxlY3Rpb25zLmphdmEKQEAgLTAsMCArMSw0NzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgdXNlZCBieSBjb2xsZWN0aW9uIHByb3hpZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFByb3h5Q29sbGVjdGlvbnMgCisgICAgZXh0ZW5kcyBQcm94aWVzIHsKKworICAgIC8qKgorICAgICAqIENhbGwgYmVmb3JlIGludm9raW5nIHtAbGluayBMaXN0I2FkZChpbnQsT2JqZWN0KX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUFkZChQcm94eUNvbGxlY3Rpb24gY29sbCwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpeworICAgICAgICBhc3NlcnRBbGxvd2VkVHlwZSh2YWx1ZSwgY29sbC5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgICAgZGlydHkoY29sbCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIFZlY3RvciNpbnNlcnRFbGVtZW50QXQoT2JqZWN0LGludCl9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVJbnNlcnRFbGVtZW50QXQoUHJveHlDb2xsZWN0aW9uIGNvbGwsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgaW50IGluZGV4KSB7CisgICAgICAgIGJlZm9yZUFkZChjb2xsLCBpbmRleCwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYmVmb3JlIGludm9raW5nIHtAbGluayBDb2xsZWN0aW9uI2FkZChPYmplY3QpfSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQWRkKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0QWxsb3dlZFR5cGUodmFsdWUsIGNvbGwuZ2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAgIGRpcnR5KGNvbGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGFmdGVyIGludm9raW5nIHtAbGluayBDb2xsZWN0aW9uI2FkZChPYmplY3QpfSBvbiBzdXBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRlZCB3aGV0aGVyIHRoZSBvYmplY3Qgd2FzIGFkZGVkCisgICAgICogQHJldHVybiA8Y29kZT5hZGRlZDwvY29kZT4sIGZvciBjb252ZW5pZW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZnRlckFkZChQcm94eUNvbGxlY3Rpb24gY29sbCwgT2JqZWN0IHZhbHVlLCAKKyAgICAgICAgYm9vbGVhbiBhZGRlZCkgeworICAgICAgICBpZiAoYWRkZWQgJiYgY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICgoQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXIpIGNvbGwuZ2V0Q2hhbmdlVHJhY2tlcigpKS5hZGRlZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgVmVjdG9yI2FkZEVsZW1lbnQoT2JqZWN0KX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUFkZEVsZW1lbnQoUHJveHlDb2xsZWN0aW9uIGNvbGwsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBiZWZvcmVBZGQoY29sbCwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYWZ0ZXIgaW52b2tpbmcge0BsaW5rIFZlY3RvciNhZGRFbGVtZW50KE9iamVjdCl9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZnRlckFkZEVsZW1lbnQoUHJveHlDb2xsZWN0aW9uIGNvbGwsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBhZnRlckFkZChjb2xsLCB2YWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIExpbmtlZExpc3QjYWRkRmlyc3QoT2JqZWN0KX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUFkZEZpcnN0KFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYmVmb3JlQWRkKGNvbGwsIDAsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgTGlua2VkTGlzdCNhZGRMYXN0KE9iamVjdCl9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVBZGRMYXN0KFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYmVmb3JlQWRkKGNvbGwsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGFmdGVyIGludm9raW5nIHtAbGluayBMaW5rZWRMaXN0I2FkZExhc3QoT2JqZWN0KX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyQWRkTGFzdChQcm94eUNvbGxlY3Rpb24gY29sbCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGFmdGVyQWRkKGNvbGwsIHZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgUXVldWUjb2ZmZXIoT2JqZWN0KX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZU9mZmVyKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYmVmb3JlQWRkKGNvbGwsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGFmdGVyIGludm9raW5nIHtAbGluayBRdWV1ZSNvZmZlcihPYmplY3QpfSBvbiBzdXBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRlZCB3aGV0aGVyIHRoZSBvYmplY3Qgd2FzIGFkZGVkCisgICAgICogQHJldHVybiA8Y29kZT5hZGRlZDwvY29kZT4sIGZvciBjb252ZW5pZW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZnRlck9mZmVyKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgdmFsdWUsIAorICAgICAgICBib29sZWFuIGFkZGVkKSB7CisgICAgICAgIHJldHVybiBhZnRlckFkZChjb2xsLCB2YWx1ZSwgYWRkZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIGZvciB7QGxpbmsgTGlzdCNhZGRBbGwoaW50LCBDb2xsZWN0aW9uKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFkZEFsbChQcm94eUNvbGxlY3Rpb24gY29sbCwgaW50IGluZGV4LCAKKyAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIGNvbGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IGluZGV4KyspCisgICAgICAgICAgICBsaXN0LmFkZChpbmRleCwgaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiB2YWx1ZXMuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBmb3Ige0BsaW5rIENvbGxlY3Rpb24jYWRkQWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQWxsKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBDb2xsZWN0aW9uIHZhbHVlcykgeworICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgYWRkZWQgfD0gY29sbC5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBjbGVhcmluZyBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGVhcihQcm94eUNvbGxlY3Rpb24gY29sbCkgeworICAgICAgICBkaXJ0eShjb2xsLCB0cnVlKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjb2xsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgcmVtb3ZlZChjb2xsLCBpdHIubmV4dCgpLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgY2xlYXJpbmcgdmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVSZW1vdmVBbGxFbGVtZW50cyhQcm94eUNvbGxlY3Rpb24gY29sbCkgeworICAgICAgICBiZWZvcmVDbGVhcihjb2xsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIGdpdmVuIGl0ZXJhdG9yIGluIGEgcHJveHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBhZnRlckl0ZXJhdG9yKGZpbmFsIFByb3h5Q29sbGVjdGlvbiBjb2xsLCAKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRyKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBwcm94aWVkOyBzb21lIGNvbGwgaW1wbHMgZGVsZWdhdGUgaXRlcmF0b3IgbWV0aG9kcworICAgICAgICBpZiAoaXRyIGluc3RhbmNlb2YgUHJveHlJdGVyYXRvcikKKyAgICAgICAgICAgIHJldHVybiBpdHI7CisgICAgICAgIHJldHVybiBuZXcgUHJveHlJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgT2JqZWN0IF9sYXN0ID0gbnVsbDsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLmhhc05leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIF9sYXN0ID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xhc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICBkaXJ0eShjb2xsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIGlmIChjb2xsLmdldENoYW5nZVRyYWNrZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAoKENvbGxlY3Rpb25DaGFuZ2VUcmFja2VyKSBjb2xsLmdldENoYW5nZVRyYWNrZXIoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkKF9sYXN0KTsKKyAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQoY29sbCwgX2xhc3QsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIGdpdmVuIGl0ZXJhdG9yIGluIGEgcHJveHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0SXRlcmF0b3IgYWZ0ZXJMaXN0SXRlcmF0b3IoZmluYWwgUHJveHlDb2xsZWN0aW9uIGNvbGwsIAorICAgICAgICBpbnQgaWR4LCBmaW5hbCBMaXN0SXRlcmF0b3IgaXRyKSB7CisgICAgICAgIHJldHVybiBhZnRlckxpc3RJdGVyYXRvcihjb2xsLCBpdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgZ2l2ZW4gaXRlcmF0b3IgaW4gYSBwcm94eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3RJdGVyYXRvciBhZnRlckxpc3RJdGVyYXRvcihmaW5hbCBQcm94eUNvbGxlY3Rpb24gY29sbCwgCisgICAgICAgIGZpbmFsIExpc3RJdGVyYXRvciBpdHIpIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIHByb3hpZWQ7IHNvbWUgY29sbCBpbXBscyBkZWxlZ2F0ZSBpdGVyYXRvciBtZXRob2RzCisgICAgICAgIGlmIChpdHIgaW5zdGFuY2VvZiBQcm94eUxpc3RJdGVyYXRvcikKKyAgICAgICAgICAgIHJldHVybiBpdHI7CisgICAgICAgIHJldHVybiBuZXcgUHJveHlMaXN0SXRlcmF0b3IoKSB7CisgICAgICAgICAgICBwcml2YXRlIE9iamVjdCBfbGFzdCA9IG51bGw7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ci5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdHIubmV4dEluZGV4KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICBfbGFzdCA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9sYXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLmhhc1ByZXZpb3VzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLnByZXZpb3VzSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKKyAgICAgICAgICAgICAgICBfbGFzdCA9IGl0ci5wcmV2aW91cygpOworICAgICAgICAgICAgICAgIHJldHVybiBfbGFzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0QWxsb3dlZFR5cGUobywgY29sbC5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICAgICAgICAgICAgICBkaXJ0eShjb2xsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaXRyLnNldChvKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkuc3RvcFRyYWNraW5nKCk7CisgICAgICAgICAgICAgICAgUHJveGllcy5yZW1vdmVkKGNvbGwsIF9sYXN0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgX2xhc3QgPSBvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRBbGxvd2VkVHlwZShvLCBjb2xsLmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICAgICAgICAgIGRpcnR5KGNvbGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpdHIuYWRkKG8pOworICAgICAgICAgICAgICAgIGlmIChjb2xsLmdldENoYW5nZVRyYWNrZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmdldENoYW5nZVRyYWNrZXIoKS5zdG9wVHJhY2tpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKChDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlcikgY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkKG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfbGFzdCA9IG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICBkaXJ0eShjb2xsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIGlmIChjb2xsLmdldENoYW5nZVRyYWNrZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAoKENvbGxlY3Rpb25DaGFuZ2VUcmFja2VyKSBjb2xsLmdldENoYW5nZVRyYWNrZXIoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkKF9sYXN0KTsKKyAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQoY29sbCwgX2xhc3QsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgTGlzdCNyZW1vdmUoaW50KX0gb24gc3VwZXIuCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVSZW1vdmUoUHJveHlDb2xsZWN0aW9uIGNvbGwsIGludCBpbmRleCkgeworICAgICAgICBkaXJ0eShjb2xsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgTGlzdCNyZW1vdmUoaW50KX0gb24gc3VwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVtb3ZlZCB0aGUgcmVtb3ZlZCBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG9iamVjdCwgZm9yIGNvbnZlbmllbmNlCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFmdGVyUmVtb3ZlKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBpbnQgaW5kZXgsIAorICAgICAgICBPYmplY3QgcmVtb3ZlZCkgeworICAgICAgICBpZiAoY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICgoQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXIpY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkpLnJlbW92ZWQocmVtb3ZlZCk7CisgICAgICAgIHJlbW92ZWQoY29sbCwgcmVtb3ZlZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gcmVtb3ZlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgVmVjdG9yI3JlbW92ZUVsZW1lbnRBdChpbnQpfSBvbiBzdXBlci4KKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVJlbW92ZUVsZW1lbnRBdChQcm94eUNvbGxlY3Rpb24gY29sbCwgaW50IGluZGV4KSB7CisgICAgICAgIGJlZm9yZVJlbW92ZShjb2xsLCBpbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIENvbGxlY3Rpb24jcmVtb3ZlfSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlUmVtb3ZlKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgbykgeworICAgICAgICBkaXJ0eShjb2xsLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgQ29sbGVjdGlvbiNyZW1vdmV9IG9uIHN1cGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbW92ZWQgd2hldGhlciB0aGUgb2JqZWN0IHdhcyByZW1vdmVkCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvYmplY3Qgd2FzIHJlbW92ZWQsIGZvciBjb252ZW5pZW5jZQorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWZ0ZXJSZW1vdmUoUHJveHlDb2xsZWN0aW9uIGNvbGwsIE9iamVjdCBvLCAKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkKXsKKyAgICAgICAgaWYgKCFyZW1vdmVkKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICgoQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXIpIGNvbGwuZ2V0Q2hhbmdlVHJhY2tlcigpKS5yZW1vdmVkKG8pOworICAgICAgICByZW1vdmVkKGNvbGwsIG8sIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIFZlY3RvciNyZW1vdmVFbGVtZW50fSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlUmVtb3ZlRWxlbWVudChQcm94eUNvbGxlY3Rpb24gY29sbCwgT2JqZWN0IG8pIHsKKyAgICAgICAgYmVmb3JlUmVtb3ZlKGNvbGwsIG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYWZ0ZXIgaW52b2tpbmcge0BsaW5rIFZlY3RvciNyZW1vdmVFbGVtZW50fSBvbiBzdXBlci4KKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFmdGVyUmVtb3ZlRWxlbWVudChQcm94eUNvbGxlY3Rpb24gY29sbCwgT2JqZWN0IG8sIAorICAgICAgICBib29sZWFuIHJlbW92ZWQpIHsKKyAgICAgICAgcmV0dXJuIGFmdGVyUmVtb3ZlKGNvbGwsIG8sIHJlbW92ZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYmVmb3JlIGludm9raW5nIHtAbGluayBMaW5rZWRMaXN0I3JlbW92ZUZpcnN0fSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlUmVtb3ZlRmlyc3QoUHJveHlDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgYmVmb3JlUmVtb3ZlKGNvbGwsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYWZ0ZXIgaW52b2tpbmcge0BsaW5rIExpbmtlZExpc3QjcmVtb3ZlRmlyc3R9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFmdGVyUmVtb3ZlRmlyc3QoUHJveHlDb2xsZWN0aW9uIGNvbGwsIE9iamVjdCByZW1vdmVkKXsKKyAgICAgICAgcmV0dXJuIGFmdGVyUmVtb3ZlKGNvbGwsIDAsIHJlbW92ZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYWZ0ZXIgaW52b2tpbmcge0BsaW5rIExpbmtlZExpc3QjcmVtb3ZlTGFzdH0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVJlbW92ZUxhc3QoUHJveHlDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgYmVmb3JlUmVtb3ZlKGNvbGwsIGNvbGwuc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgTGlua2VkTGlzdCNyZW1vdmVMYXN0fSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhZnRlclJlbW92ZUxhc3QoUHJveHlDb2xsZWN0aW9uIGNvbGwsIE9iamVjdCByZW1vdmVkKSB7CisgICAgICAgIHJldHVybiBhZnRlclJlbW92ZShjb2xsLCBjb2xsLnNpemUoKSwgcmVtb3ZlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIFF1ZXVlI3JlbW92ZX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVJlbW92ZShQcm94eUNvbGxlY3Rpb24gY29sbCkgeworICAgICAgICBiZWZvcmVSZW1vdmUoY29sbCwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgUXVldWUjcmVtb3ZlfSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhZnRlclJlbW92ZShQcm94eUNvbGxlY3Rpb24gY29sbCwgT2JqZWN0IHJlbW92ZWQpeworICAgICAgICByZXR1cm4gYWZ0ZXJSZW1vdmUoY29sbCwgMCwgcmVtb3ZlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIFF1ZXVlI3BvbGx9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVQb2xsKFByb3h5Q29sbGVjdGlvbiBjb2xsKSB7CisgICAgICAgIGlmICghY29sbC5pc0VtcHR5KCkpCisgICAgICAgICAgICBiZWZvcmVSZW1vdmUoY29sbCwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgUXVldWUjcG9sbH0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYWZ0ZXJQb2xsKFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgcmVtb3ZlZCkgeworICAgICAgICBpZiAocmVtb3ZlZCAhPSBudWxsKQorICAgICAgICAgICAgYWZ0ZXJSZW1vdmUoY29sbCwgMCwgcmVtb3ZlZCk7CisgICAgICAgIHJldHVybiByZW1vdmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIGZvciB7QGxpbmsgQ29sbGVjdGlvbiNyZW1vdmVBbGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoUHJveHlDb2xsZWN0aW9uIGNvbGwsIENvbGxlY3Rpb24gdmFscykgeworICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSB2YWxzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgcmVtb3ZlZCB8PSBjb2xsLnJlbW92ZShpdHIubmV4dCgpKTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgZm9yIHtAbGluayBDb2xsZWN0aW9uI3JldGFpbkFsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChQcm94eUNvbGxlY3Rpb24gY29sbCwgQ29sbGVjdGlvbiB2YWxzKSB7CisgICAgICAgIGludCBzaXplID0gY29sbC5zaXplKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY29sbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIGlmICghdmFscy5jb250YWlucyhpdHIubmV4dCgpKSkKKyAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7CisgICAgICAgIHJldHVybiBjb2xsLnNpemUoKSA8IHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIExpc3Qjc2V0fSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlU2V0KFByb3h5Q29sbGVjdGlvbiBjb2xsLCBpbnQgaW5kZXgsIAorICAgICAgICBPYmplY3QgZWxlbWVudCkgeworICAgICAgICBhc3NlcnRBbGxvd2VkVHlwZShlbGVtZW50LCBjb2xsLmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICBkaXJ0eShjb2xsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGFmdGVyIGludm9raW5nIHtAbGluayBMaXN0I3NldH0gb24gc3VwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZWQgdGhlIHJlcGxhY2VkIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIHJlcGxhY2VkIG9iamVjdCwgZm9yIGNvbnZlbmllbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYWZ0ZXJTZXQoUHJveHlDb2xsZWN0aW9uIGNvbGwsIGludCBpbmRleCwgCisgICAgICAgIE9iamVjdCBlbGVtZW50LCBPYmplY3QgcmVwbGFjZWQpIHsKKyAgICAgICAgaWYgKHJlcGxhY2VkICE9IGVsZW1lbnQpCisgICAgICAgICAgICByZW1vdmVkKGNvbGwsIHJlcGxhY2VkLCBmYWxzZSk7CisgICAgICAgIHJldHVybiByZXBsYWNlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgVmVjdG9yI3NldEVsZW1lbnRBdH0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVNldEVsZW1lbnRBdChQcm94eUNvbGxlY3Rpb24gY29sbCwgT2JqZWN0IGVsZW1lbnQsCisgICAgICAgIGludCBpbmRleCkgeworICAgICAgICBiZWZvcmVTZXQoY29sbCwgaW5kZXgsIGVsZW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYWZ0ZXIgaW52b2tpbmcge0BsaW5rIFZlY3RvciNzZXRFbGVtZW50QXR9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFmdGVyU2V0RWxlbWVudEF0KFByb3h5Q29sbGVjdGlvbiBjb2xsLCBPYmplY3QgZWxlbWVudCwKKyAgICAgICAgaW50IGluZGV4LCBPYmplY3QgcmVwbGFjZWQpIHsKKyAgICAgICAgcmV0dXJuIGFmdGVyU2V0KGNvbGwsIGluZGV4LCBlbGVtZW50LCByZXBsYWNlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya2VyIGludGVyZmFjZSBmb3IgYSBwcm94aWVkIGl0ZXJhdG9yLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQcm94eUl0ZXJhdG9yIAorICAgICAgICBleHRlbmRzIEl0ZXJhdG9yIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrZXIgaW50ZXJmYWNlIGZvciBhIHByb3hpZWQgbGlzdCBpdGVyYXRvci4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUHJveHlMaXN0SXRlcmF0b3IgCisgICAgICAgIGV4dGVuZHMgUHJveHlJdGVyYXRvciwgTGlzdEl0ZXJhdG9yIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlEYXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlEYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmYjM0NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eURhdGUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCisvKioKKyAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgZ2VuZXJhdGVkIHByb3hpZXMgb24ge0BsaW5rIGphdmEudXRpbC5EYXRlfQorICogdHlwZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBQcm94eURhdGUKKyAgICBleHRlbmRzIFByb3h5IHsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGRhdGUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHlEYXRlIG5ld0luc3RhbmNlKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1OWI1ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiBNYW5hZ2VyIGZvciBjb3B5aW5nIGFuZCBwcm94eWluZyBzZWNvbmQgY2xhc3Mgb2JqZWN0cy4gU2Vjb25kIGNsYXNzCisgKiBvYmplY3RzIGFyZSB0aG9zZSB0aGF0IGFyZSBvZnRlbiB1c2VkIGFzIGZpZWxkcyBvZiBwZXJzaXN0ZW50IG9yCisgKiB0cmFuc2FjdGlvbmFsIGluc3RhbmNlcywgYW5kIHdoaWNoIGNhbiB0aGVtc2VsdmVzIGJlIG1vZGlmaWVkIHdpdGhvdXQKKyAqIHJlc2V0dGluZyB0aGUgb3duaW5nIGNsYXNzJyBmaWVsZC4gQmVjYXVzZSB0aGVzZSB0eXBlcyBjYW4gY2hhbmdlIHdpdGhvdXQKKyAqIGFuIGV4cGxpY2l0IGNhbGwgdG8gdGhlIG93bmluZyBwZXJzaXN0ZW5jZSBjYXBhYmxlIGluc3RhbmNlLCBzcGVjaWFsIGNhcmUKKyAqIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlaXIgc3RhdGUgaXMgbWFuYWdlZCBjb3JyZWN0bHkuCisgKiBTcGVjaWZpY2FsbHksIHRoZXkgbXVzdCBiZSBjb3BpZWQgd2hlbiBzYXZpbmcgc3RhdGUgZm9yIHJvbGxiYWNrLCBhbmQgdGhleQorICogbXVzdCBiZSBwcm94aWVkIGZvciBhbnkgaW5zdGFuY2Ugd2hvc2Ugc3RhdGUgaXMgbWFuYWdlZCBieSBhIHN0YXRlIG1hbmFnZXIsCisgKiB3aGVyZSBwcm94eWluZyBpbnZvbHZlcyBjcmVhdGluZyBhIHNlY29uZCBjbGFzcyBvYmplY3QgdGhhdCBhdXRvbWF0aWNsbHkKKyAqIG5vdGlmaWVzIGl0cyBvd25pbmcgaW5zdGFuY2Ugd2hlbmV2ZXIgaXQgaXMgbW9kaWZpZWQuIEdlbmVyYWxseSwgdGhpcworICogZmFjdG9yeSBpcyBvbmx5IHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uOyBzZWNvbmQgY2xhc3Mgb2JqZWN0IGhhbmRsaW5nCisgKiBpcyB0cmFuc3BhcmVudCB0byBjbGllbnQgY29kZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb3h5TWFuYWdlciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgYXJyYXkgb2YgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIGdpdmVuIGFycmF5CisgICAgICogYW5kIGNvbnRhaW5pbmcgdGhlIHNhbWUgZWxlbWVudHMuIFdvcmtzIGZvciBib3RoIHByaW1pdGl2ZSBhbmQKKyAgICAgKiBvYmplY3QgYXJyYXkgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjb3B5QXJyYXkoT2JqZWN0IG9yaWcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgZ2l2ZW4gZGF0ZSB3aXRoIHRoZSBzYW1lIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGNvcHlEYXRlKERhdGUgb3JpZyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgZGF0ZSBwcm94eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHkgbmV3RGF0ZVByb3h5KENsYXNzIHR5cGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgZ2l2ZW4gY2FsZW5kYXIgd2l0aCB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FsZW5kYXIgY29weUNhbGVuZGFyKENhbGVuZGFyIG9yaWcpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGNhbGVuZGFyIHByb3h5LgorICAgICAqLworICAgIHB1YmxpYyBQcm94eSBuZXdDYWxlbmRhclByb3h5KENsYXNzIHR5cGUsIFRpbWVab25lIHRpbWVab25lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGdpdmVuIG9uZQorICAgICAqIHdpdGggYSBjb3B5IG9mIGFsbCBjb250YWluZWQgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gY29weUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBvcmlnKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHByb3h5IGZvciB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0eXBlLiBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbgorICAgICAqIHdpbGwgYWxsb3cgb25seSBhZGRpdGlvbiBvZiBlbGVtZW50cyBhc3NpZ25hYmxlIGZyb20gdGhlIGdpdmVuCisgICAgICogZWxlbWVudCB0eXBlIGFuZCB3aWxsIHVzZSB0aGUgZ2l2ZW4gY29tcGFyYXRvciwgaWYgaXQgaXMgbm90IG51bGwuCisgICAgICovCisgICAgcHVibGljIFByb3h5IG5ld0NvbGxlY3Rpb25Qcm94eShDbGFzcyB0eXBlLCBDbGFzcyBlbGVtZW50VHlwZSwKKyAgICAgICAgQ29tcGFyYXRvciBjb21wYXJlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5ldyBtYXAgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgZ2l2ZW4gb25lCisgICAgICogd2l0aCBhIGNvcHkgb2YgYWxsIGNvbnRhaW5lZCBrZXkvdmFsdWUgcGFpcnMuCisgICAgICovCisgICAgcHVibGljIE1hcCBjb3B5TWFwKE1hcCBvcmlnKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHByb3h5IGZvciB0aGUgZ2l2ZW4gbWFwIHR5cGUuIFRoZSByZXR1cm5lZCBtYXAgd2lsbAorICAgICAqIGFsbG93IG9ubHkgYWRkaXRpb24gb2Yga2V5cy92YWx1ZXMgYXNzaWduYWJsZSBmcm9tIHRoZSBnaXZlbgorICAgICAqIGtleVR5cGUvdmFsdWVUeXBlLCBhbmQgd2lsbCB1c2UgdGhlIGdpdmVuIGNvbXBhcmF0b3IsIGlmIGl0IGlzIG5vdCBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBQcm94eSBuZXdNYXBQcm94eShDbGFzcyB0eXBlLCBDbGFzcyBrZXlUeXBlLCBDbGFzcyB2YWx1ZVR5cGUsCisgICAgICAgIENvbXBhcmF0b3IgY29tcGFyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBnaXZlbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBpbmZvcm1hdGlvbiwgb3IgbnVsbCBpZgorICAgICAqIHRoaXMgbWFuYWdlciBjYW5ub3QgY29weSB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjb3B5Q3VzdG9tKE9iamVjdCBvcmlnKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHByb3h5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0LCBvciBudWxsIGlmIHRoaXMgbWFuYWdlciBjYW5ub3QKKyAgICAgKiBwcm94eSB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHNpbmNlIDAuMi41CisgICAgICovCisgICAgcHVibGljIFByb3h5IG5ld0N1c3RvbVByb3h5IChPYmplY3Qgb2JqKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eU1hbmFnZXJJbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlNYW5hZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmUzNzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlNYW5hZ2VySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5KYXZhVmVyc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDQ2xhc3M7CitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0NsYXNzTG9hZGVyOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQkNGaWVsZDsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkJDTWV0aG9kOworaW1wb3J0IHNlcnAuYnl0ZWNvZGUuQ29kZTsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLkp1bXBJbnN0cnVjdGlvbjsKK2ltcG9ydCBzZXJwLmJ5dGVjb2RlLlByb2plY3Q7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFByb3h5TWFuYWdlcn0gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94eU1hbmFnZXJJbXBsCisgICAgaW1wbGVtZW50cyBQcm94eU1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NVRkZJWCA9ICIkcHJveHkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUHJveHlNYW5hZ2VySW1wbC5jbGFzcyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIF9wcm94eUlkID0gMEw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9zdGRDb2xsZWN0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9zdGRNYXBzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBzdGF0aWMgeworICAgICAgICBfc3RkQ29sbGVjdGlvbnMucHV0KENvbGxlY3Rpb24uY2xhc3MsIEFycmF5TGlzdC5jbGFzcyk7CisgICAgICAgIF9zdGRDb2xsZWN0aW9ucy5wdXQoU2V0LmNsYXNzLCBIYXNoU2V0LmNsYXNzKTsKKyAgICAgICAgX3N0ZENvbGxlY3Rpb25zLnB1dChTb3J0ZWRTZXQuY2xhc3MsIFRyZWVTZXQuY2xhc3MpOworICAgICAgICBfc3RkQ29sbGVjdGlvbnMucHV0KExpc3QuY2xhc3MsIEFycmF5TGlzdC5jbGFzcyk7CisgICAgICAgIGlmIChKYXZhVmVyc2lvbnMuVkVSU0lPTiA+PSA1KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIHF1ZXVlID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlF1ZXVlIiwgZmFsc2UsIAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIF9zdGRDb2xsZWN0aW9ucy5wdXQocXVldWUsIExpbmtlZExpc3QuY2xhc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgcmVhbGx5IGphdmEgNSBhZnRlciBhbGw/CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfc3RkTWFwcy5wdXQoTWFwLmNsYXNzLCBIYXNoTWFwLmNsYXNzKTsKKyAgICAgICAgX3N0ZE1hcHMucHV0KFNvcnRlZE1hcC5jbGFzcywgVHJlZU1hcC5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgX3VucHJveHlhYmxlID0gbmV3IEhhc2hTZXQoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfcHJveGllcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBfdHJhY2tDaGFuZ2VzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Fzc2VydFR5cGUgPSBmYWxzZTsKKworICAgIHB1YmxpYyBQcm94eU1hbmFnZXJJbXBsKCkgeworICAgICAgICBfdW5wcm94eWFibGUuYWRkKFRpbWVab25lLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBwcm94aWVzIHByb2R1Y2VkIGJ5IHRoaXMgZmFjdG9yeSB3aWxsIHVzZSB7QGxpbmsgQ2hhbmdlVHJhY2tlcn1zCisgICAgICogdG8gdHJ5IHRvIGN1dCBkb3duIG9uIGRhdGEgc3RvcmUgb3BlcmF0aW9ucyBhdCB0aGUgY29zdCBvZiBzb21lIGV4dHJhCisgICAgICogYm9va2tlZXBpbmcgb3ZlcmhlYWQuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhY2tDaGFuZ2VzKCkgeworICAgICAgICByZXR1cm4gX3RyYWNrQ2hhbmdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHByb3hpZXMgcHJvZHVjZWQgYnkgdGhpcyBmYWN0b3J5IHdpbGwgdXNlIHtAbGluayBDaGFuZ2VUcmFja2VyfXMKKyAgICAgKiB0byB0cnkgdG8gY3V0IGRvd24gb24gZGF0YSBzdG9yZSBvcGVyYXRpb25zIGF0IHRoZSBjb3N0IG9mIHNvbWUgZXh0cmEKKyAgICAgKiBib29ra2VlcGluZyBvdmVyaGVhZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFja0NoYW5nZXMoYm9vbGVhbiB0cmFjaykgeworICAgICAgICBfdHJhY2tDaGFuZ2VzID0gdHJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBwZXJmb3JtIHJ1bnRpbWUgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IGFsbCBlbGVtZW50cworICAgICAqIGFkZGVkIHRvIGNvbGxlY3Rpb24gYW5kIG1hcCBwcm94aWVzIGFyZSB0aGUgcHJvcGVyIGVsZW1lbnQva2V5L3ZhbHVlCisgICAgICogdHlwZSBhcyBkZWZpbmVkIGJ5IHRoZSBtZXRhZGF0YS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXNzZXJ0QWxsb3dlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfYXNzZXJ0VHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBlcmZvcm0gcnVudGltZSBjaGVja3MgdG8gZW5zdXJlIHRoYXQgYWxsIGVsZW1lbnRzCisgICAgICogYWRkZWQgdG8gY29sbGVjdGlvbiBhbmQgbWFwIHByb3hpZXMgYXJlIHRoZSBwcm9wZXIgZWxlbWVudC9rZXkvdmFsdWUKKyAgICAgKiB0eXBlIGFzIGRlZmluZWQgYnkgdGhlIG1ldGFkYXRhLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRBbGxvd2VkVHlwZShib29sZWFuIGFzc2VydFR5cGUpIHsKKyAgICAgICAgX2Fzc2VydFR5cGUgPSBhc3NlcnRUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG11dGFibGUgdmlldyBvZiBjbGFzcyBuYW1lcyB3ZSBrbm93IGNhbm5vdCBiZSBwcm94aWVkICAKKyAgICAgKiBjb3JyZWN0bHkgYnkgdGhpcyBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFVucHJveHlhYmxlKCkgeworICAgICAgICByZXR1cm4gX3VucHJveHlhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVkIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24uICBBZGQgdGhlIGdpdmVuIHNlbWljb2xvbi1zZXBhcmF0ZWQKKyAgICAgKiBjbGFzcyBuYW1lcyB0byB0aGUgc2V0IG9mIGNsYXNzIG5hbWVzIHdlIGtub3cgY2Fubm90IGJlIHByb3hpZWQgY29ycmVjdGx5CisgICAgICogYnkgdGhpcyBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVucHJveHlhYmxlKFN0cmluZyBjbHNOYW1lcykgeworICAgICAgICBpZiAoY2xzTmFtZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIF91bnByb3h5YWJsZS5hZGRBbGwoQXJyYXlzLmFzTGlzdChTdHJpbmdzLnNwbGl0KGNsc05hbWVzLCAiOyIsIDApKSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjb3B5QXJyYXkoT2JqZWN0IG9yaWcpIHsKKyAgICAgICAgaWYgKG9yaWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKG9yaWcpOworICAgICAgICAgICAgT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2Uob3JpZy5nZXRDbGFzcygpLgorICAgICAgICAgICAgICAgIGdldENvbXBvbmVudFR5cGUoKSwgbGVuZ3RoKTsKKworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCAwLCBhcnJheSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBhcnJheTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWFycmF5IiwKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gY29weUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBvcmlnKSB7CisgICAgICAgIGlmIChvcmlnID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBQcm94eSkKKyAgICAgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbikgKChQcm94eSkgb3JpZykuY29weShvcmlnKTsKKworICAgICAgICBQcm94eUNvbGxlY3Rpb24gcHJveHkgPSBnZXRGYWN0b3J5UHJveHlDb2xsZWN0aW9uKG9yaWcuZ2V0Q2xhc3MoKSk7CisgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbikgcHJveHkuY29weShvcmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJveHkgbmV3Q29sbGVjdGlvblByb3h5KENsYXNzIHR5cGUsIENsYXNzIGVsZW1lbnRUeXBlLAorICAgICAgICBDb21wYXJhdG9yIGNvbXBhcmUpIHsKKyAgICAgICAgdHlwZSA9IHRvUHJveHlhYmxlQ29sbGVjdGlvblR5cGUodHlwZSk7CisgICAgICAgIFByb3h5Q29sbGVjdGlvbiBwcm94eSA9IGdldEZhY3RvcnlQcm94eUNvbGxlY3Rpb24odHlwZSk7CisgICAgICAgIHJldHVybiBwcm94eS5uZXdJbnN0YW5jZSgoX2Fzc2VydFR5cGUpID8gZWxlbWVudFR5cGUgOiBudWxsLCBjb21wYXJlLAorICAgICAgICAgICAgX3RyYWNrQ2hhbmdlcyk7CisgICAgfQorCisgICAgcHVibGljIE1hcCBjb3B5TWFwKE1hcCBvcmlnKSB7CisgICAgICAgIGlmIChvcmlnID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBQcm94eSkKKyAgICAgICAgICAgIHJldHVybiAoTWFwKSAoKFByb3h5KSBvcmlnKS5jb3B5KG9yaWcpOworCisgICAgICAgIFByb3h5TWFwIHByb3h5ID0gZ2V0RmFjdG9yeVByb3h5TWFwKG9yaWcuZ2V0Q2xhc3MoKSk7CisgICAgICAgIHJldHVybiAoTWFwKSBwcm94eS5jb3B5KG9yaWcpOworICAgIH0KKworICAgIHB1YmxpYyBQcm94eSBuZXdNYXBQcm94eShDbGFzcyB0eXBlLCBDbGFzcyBrZXlUeXBlLCAKKyAgICAgICAgQ2xhc3MgZWxlbWVudFR5cGUsIENvbXBhcmF0b3IgY29tcGFyZSkgeworICAgICAgICB0eXBlID0gdG9Qcm94eWFibGVNYXBUeXBlKHR5cGUpOworICAgICAgICBQcm94eU1hcCBwcm94eSA9IGdldEZhY3RvcnlQcm94eU1hcCh0eXBlKTsKKyAgICAgICAgcmV0dXJuIHByb3h5Lm5ld0luc3RhbmNlKChfYXNzZXJ0VHlwZSkgPyBrZXlUeXBlIDogbnVsbCwgCisgICAgICAgICAgICAoX2Fzc2VydFR5cGUpID8gZWxlbWVudFR5cGUgOiBudWxsLCBjb21wYXJlLCBfdHJhY2tDaGFuZ2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBjb3B5RGF0ZShEYXRlIG9yaWcpIHsKKyAgICAgICAgaWYgKG9yaWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob3JpZyBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgcmV0dXJuIChEYXRlKSAoKFByb3h5KSBvcmlnKS5jb3B5KG9yaWcpOworCisgICAgICAgIFByb3h5RGF0ZSBwcm94eSA9IGdldEZhY3RvcnlQcm94eURhdGUob3JpZy5nZXRDbGFzcygpKTsKKyAgICAgICAgcmV0dXJuIChEYXRlKSBwcm94eS5jb3B5KG9yaWcpOworICAgIH0KKworICAgIHB1YmxpYyBQcm94eSBuZXdEYXRlUHJveHkoQ2xhc3MgdHlwZSkgeworICAgICAgICBQcm94eURhdGUgcHJveHkgPSBnZXRGYWN0b3J5UHJveHlEYXRlKHR5cGUpOworICAgICAgICByZXR1cm4gcHJveHkubmV3SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsZW5kYXIgY29weUNhbGVuZGFyKENhbGVuZGFyIG9yaWcpIHsKKyAgICAgICAgaWYgKG9yaWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob3JpZyBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgcmV0dXJuIChDYWxlbmRhcikgKChQcm94eSkgb3JpZykuY29weShvcmlnKTsKKworICAgICAgICBQcm94eUNhbGVuZGFyIHByb3h5ID0gZ2V0RmFjdG9yeVByb3h5Q2FsZW5kYXIob3JpZy5nZXRDbGFzcygpKTsKKyAgICAgICAgcmV0dXJuIChDYWxlbmRhcikgcHJveHkuY29weShvcmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJveHkgbmV3Q2FsZW5kYXJQcm94eShDbGFzcyB0eXBlLCBUaW1lWm9uZSB6b25lKSB7CisgICAgICAgIGlmICh0eXBlID09IENhbGVuZGFyLmNsYXNzKQorICAgICAgICAgICAgdHlwZSA9IEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzOworICAgICAgICBQcm94eUNhbGVuZGFyIHByb3h5ID0gZ2V0RmFjdG9yeVByb3h5Q2FsZW5kYXIodHlwZSk7CisgICAgICAgIFByb3h5Q2FsZW5kYXIgY2FsID0gcHJveHkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKHpvbmUgIT0gbnVsbCkKKyAgICAgICAgICAgICgoQ2FsZW5kYXIpIGNhbCkuc2V0VGltZVpvbmUoem9uZSk7CisgICAgICAgIHJldHVybiBjYWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjb3B5Q3VzdG9tKE9iamVjdCBvcmlnKSB7CisgICAgICAgIGlmIChvcmlnID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBQcm94eSkKKyAgICAgICAgICAgIHJldHVybiAoKFByb3h5KSBvcmlnKS5jb3B5KG9yaWcpOworICAgICAgICBpZiAoSW1wbEhlbHBlci5pc01hbmFnZWFibGUob3JpZykpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQorICAgICAgICAgICAgcmV0dXJuIGNvcHlDb2xsZWN0aW9uKChDb2xsZWN0aW9uKSBvcmlnKTsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBNYXApCisgICAgICAgICAgICByZXR1cm4gY29weU1hcCgoTWFwKSBvcmlnKTsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBEYXRlKQorICAgICAgICAgICAgcmV0dXJuIGNvcHlEYXRlKChEYXRlKSBvcmlnKTsKKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBDYWxlbmRhcikKKyAgICAgICAgICAgIHJldHVybiBjb3B5Q2FsZW5kYXIoKENhbGVuZGFyKSBvcmlnKTsKKyAgICAgICAgUHJveHlCZWFuIHByb3h5ID0gZ2V0RmFjdG9yeVByb3h5QmVhbihvcmlnKTsKKyAgICAgICAgcmV0dXJuIChwcm94eSA9PSBudWxsKSA/IG51bGwgOiBwcm94eS5jb3B5KG9yaWcpOyAKKyAgICB9CisKKyAgICBwdWJsaWMgUHJveHkgbmV3Q3VzdG9tUHJveHkoT2JqZWN0IG9yaWcpIHsKKyAgICAgICAgaWYgKG9yaWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob3JpZyBpbnN0YW5jZW9mIFByb3h5KQorICAgICAgICAgICAgcmV0dXJuIChQcm94eSkgb3JpZzsKKyAgICAgICAgaWYgKEltcGxIZWxwZXIuaXNNYW5hZ2VhYmxlKG9yaWcpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChvcmlnIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgQ29tcGFyYXRvciBjb21wID0gKG9yaWcgaW5zdGFuY2VvZiBTb3J0ZWRTZXQpIAorICAgICAgICAgICAgICAgID8gKChTb3J0ZWRTZXQpIG9yaWcpLmNvbXBhcmF0b3IoKSA6IG51bGw7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGMgPSAoQ29sbGVjdGlvbikgbmV3Q29sbGVjdGlvblByb3h5KG9yaWcuZ2V0Q2xhc3MoKSwgCisgICAgICAgICAgICAgICAgbnVsbCwgY29tcCk7IAorICAgICAgICAgICAgYy5hZGRBbGwoKENvbGxlY3Rpb24pIG9yaWcpOworICAgICAgICAgICAgcmV0dXJuIChQcm94eSkgYzsKKyAgICAgICAgfQorICAgICAgICBpZiAob3JpZyBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgQ29tcGFyYXRvciBjb21wID0gKG9yaWcgaW5zdGFuY2VvZiBTb3J0ZWRNYXApIAorICAgICAgICAgICAgICAgID8gKChTb3J0ZWRNYXApIG9yaWcpLmNvbXBhcmF0b3IoKSA6IG51bGw7CisgICAgICAgICAgICBNYXAgbSA9IChNYXApIG5ld01hcFByb3h5KG9yaWcuZ2V0Q2xhc3MoKSwgbnVsbCwgbnVsbCwgY29tcCk7CisgICAgICAgICAgICBtLnB1dEFsbCgoTWFwKSBvcmlnKTsKKyAgICAgICAgICAgIHJldHVybiAoUHJveHkpIG07CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBEYXRlKSB7CisgICAgICAgICAgICBEYXRlIGQgPSAoRGF0ZSkgbmV3RGF0ZVByb3h5KG9yaWcuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBkLnNldFRpbWUoKChEYXRlKSBvcmlnKS5nZXRUaW1lKCkpOworICAgICAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBUaW1lc3RhbXApCisgICAgICAgICAgICAgICAgKChUaW1lc3RhbXApIGQpLnNldE5hbm9zKCgoVGltZXN0YW1wKSBvcmlnKS5nZXROYW5vcygpKTsKKyAgICAgICAgICAgIHJldHVybiAoUHJveHkpIGQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yaWcgaW5zdGFuY2VvZiBDYWxlbmRhcikgeworICAgICAgICAgICAgQ2FsZW5kYXIgYyA9IChDYWxlbmRhcikgbmV3Q2FsZW5kYXJQcm94eShvcmlnLmdldENsYXNzKCksCisgICAgICAgICAgICAgICAgKChDYWxlbmRhcikgb3JpZykuZ2V0VGltZVpvbmUoKSk7CisgICAgICAgICAgICBjLnNldFRpbWVJbk1pbGxpcygoKENhbGVuZGFyKSBvcmlnKS5nZXRUaW1lSW5NaWxsaXMoKSk7CisgICAgICAgICAgICByZXR1cm4gKFByb3h5KSBjOworICAgICAgICB9CisKKyAgICAgICAgUHJveHlCZWFuIHByb3h5ID0gZ2V0RmFjdG9yeVByb3h5QmVhbihvcmlnKTsKKyAgICAgICAgcmV0dXJuIChwcm94eSA9PSBudWxsKSA/IG51bGwgOiBwcm94eS5uZXdJbnN0YW5jZShvcmlnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbmNyZXRlIHR5cGUgZm9yIHByb3h5aW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyB0b1Byb3h5YWJsZUNvbGxlY3Rpb25UeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFBST1hZX1NVRkZJWCkpCisgICAgICAgICAgICB0eXBlID0gdHlwZS5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGVsc2UgaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgdHlwZSA9IHRvQ29uY3JldGVUeXBlKHR5cGUsIF9zdGRDb2xsZWN0aW9ucyk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgibm8tcHJveHktaW50ZiIsIHR5cGUpKTsKKyAgICAgICAgfSBlbHNlIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KHR5cGUuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1wcm94eS1hYnN0cmFjdCIsIHR5cGUpKTsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25jcmV0ZSB0eXBlIGZvciBwcm94eWluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgdG9Qcm94eWFibGVNYXBUeXBlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFBST1hZX1NVRkZJWCkpCisgICAgICAgICAgICB0eXBlID0gdHlwZS5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGVsc2UgaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgdHlwZSA9IHRvQ29uY3JldGVUeXBlKHR5cGUsIF9zdGRNYXBzKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1wcm94eS1pbnRmIiwgdHlwZSkpOworICAgICAgICB9IGVsc2UgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QodHlwZS5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXByb3h5LWFic3RyYWN0IiwgdHlwZSkpOworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGUgYSBjb25jcmV0ZSB0eXBlIHRvIHByb3h5IGZvciB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdG9Db25jcmV0ZVR5cGUoQ2xhc3MgaW50ZiwgTWFwIGNvbmNyZXRlcykgeworICAgICAgICBDbGFzcyBjb25jcmV0ZSA9IChDbGFzcykgY29uY3JldGVzLmdldChpbnRmKTsKKyAgICAgICAgaWYgKGNvbmNyZXRlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gY29uY3JldGU7CisgICAgICAgIENsYXNzW10gaW50ZnMgPSBpbnRmLmdldEludGVyZmFjZXMoKTsgICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRmcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29uY3JldGUgPSB0b0NvbmNyZXRlVHlwZShpbnRmc1tpXSwgY29uY3JldGVzKTsKKyAgICAgICAgICAgIGlmIChjb25jcmV0ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBjb25jcmV0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgZmFjdG9yeSBwcm94eSBmb3IgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3h5Q29sbGVjdGlvbiBnZXRGYWN0b3J5UHJveHlDb2xsZWN0aW9uKENsYXNzIHR5cGUpIHsKKyAgICAgICAgLy8gd2UgZG9uJ3QgbG9jayBoZXJlOyBvayBpZiB0d28gcHJveGllcyBnZXQgZ2VuZXJhdGVkIGZvciBzYW1lIHR5cGUKKyAgICAgICAgUHJveHlDb2xsZWN0aW9uIHByb3h5ID0gKFByb3h5Q29sbGVjdGlvbikgX3Byb3hpZXMuZ2V0KHR5cGUpOworICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbCA9IGdldE1vc3REZXJpdmVkTG9hZGVyKHR5cGUsIFByb3h5Q29sbGVjdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBDbGFzcyBwY2xzID0gbG9hZEJ1aWxkVGltZVByb3h5KHR5cGUsIGwpOworICAgICAgICAgICAgaWYgKHBjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwY2xzID0gbG9hZFByb3h5KGdlbmVyYXRlUHJveHlDb2xsZWN0aW9uQnl0ZWNvZGUodHlwZSwgdHJ1ZSksbCk7CisgICAgICAgICAgICBwcm94eSA9IChQcm94eUNvbGxlY3Rpb24pIGluc3RhbnRpYXRlUHJveHkocGNscywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBfcHJveGllcy5wdXQodHlwZSwgcHJveHkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm94eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBmYWN0b3J5IHByb3h5IGZvciB0aGUgZ2l2ZW4gbWFwIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm94eU1hcCBnZXRGYWN0b3J5UHJveHlNYXAoQ2xhc3MgdHlwZSkgeworICAgICAgICAvLyB3ZSBkb24ndCBsb2NrIGhlcmU7IG9rIGlmIHR3byBwcm94aWVzIGdldCBnZW5lcmF0ZWQgZm9yIHNhbWUgdHlwZQorICAgICAgICBQcm94eU1hcCBwcm94eSA9IChQcm94eU1hcCkgX3Byb3hpZXMuZ2V0KHR5cGUpOworICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbCA9IGdldE1vc3REZXJpdmVkTG9hZGVyKHR5cGUsIFByb3h5TWFwLmNsYXNzKTsKKyAgICAgICAgICAgIENsYXNzIHBjbHMgPSBsb2FkQnVpbGRUaW1lUHJveHkodHlwZSwgbCk7CisgICAgICAgICAgICBpZiAocGNscyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHBjbHMgPSBsb2FkUHJveHkoZ2VuZXJhdGVQcm94eU1hcEJ5dGVjb2RlKHR5cGUsIHRydWUpLCBsKTsKKyAgICAgICAgICAgIHByb3h5ID0gKFByb3h5TWFwKSBpbnN0YW50aWF0ZVByb3h5KHBjbHMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgX3Byb3hpZXMucHV0KHR5cGUsIHByb3h5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgZmFjdG9yeSBwcm94eSBmb3IgdGhlIGdpdmVuIGRhdGUgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3h5RGF0ZSBnZXRGYWN0b3J5UHJveHlEYXRlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgLy8gd2UgZG9uJ3QgbG9jayBoZXJlOyBvayBpZiB0d28gcHJveGllcyBnZXQgZ2VuZXJhdGVkIGZvciBzYW1lIHR5cGUKKyAgICAgICAgUHJveHlEYXRlIHByb3h5ID0gKFByb3h5RGF0ZSkgX3Byb3hpZXMuZ2V0KHR5cGUpOworICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbCA9IGdldE1vc3REZXJpdmVkTG9hZGVyKHR5cGUsIFByb3h5RGF0ZS5jbGFzcyk7CisgICAgICAgICAgICBDbGFzcyBwY2xzID0gbG9hZEJ1aWxkVGltZVByb3h5KHR5cGUsIGwpOworICAgICAgICAgICAgaWYgKHBjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwY2xzID0gbG9hZFByb3h5KGdlbmVyYXRlUHJveHlEYXRlQnl0ZWNvZGUodHlwZSwgdHJ1ZSksIGwpOworICAgICAgICAgICAgcHJveHkgPSAoUHJveHlEYXRlKSBpbnN0YW50aWF0ZVByb3h5KHBjbHMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgX3Byb3hpZXMucHV0KHR5cGUsIHByb3h5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgZmFjdG9yeSBwcm94eSBmb3IgdGhlIGdpdmVuIGNhbGVuZGFyIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm94eUNhbGVuZGFyIGdldEZhY3RvcnlQcm94eUNhbGVuZGFyKENsYXNzIHR5cGUpIHsKKyAgICAgICAgLy8gd2UgZG9uJ3QgbG9jayBoZXJlOyBvayBpZiB0d28gcHJveGllcyBnZXQgZ2VuZXJhdGVkIGZvciBzYW1lIHR5cGUKKyAgICAgICAgUHJveHlDYWxlbmRhciBwcm94eSA9IChQcm94eUNhbGVuZGFyKSBfcHJveGllcy5nZXQodHlwZSk7CisgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBsID0gZ2V0TW9zdERlcml2ZWRMb2FkZXIodHlwZSwgUHJveHlDYWxlbmRhci5jbGFzcyk7CisgICAgICAgICAgICBDbGFzcyBwY2xzID0gbG9hZEJ1aWxkVGltZVByb3h5KHR5cGUsIGwpOworICAgICAgICAgICAgaWYgKHBjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwY2xzID0gbG9hZFByb3h5KGdlbmVyYXRlUHJveHlDYWxlbmRhckJ5dGVjb2RlKHR5cGUsIHRydWUpLCBsKTsKKyAgICAgICAgICAgIHByb3h5ID0gKFByb3h5Q2FsZW5kYXIpIGluc3RhbnRpYXRlUHJveHkocGNscywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBfcHJveGllcy5wdXQodHlwZSwgcHJveHkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm94eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlZCBmYWN0b3J5IHByb3h5IGZvciB0aGUgZ2l2ZW4gYmVhbiB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgUHJveHlCZWFuIGdldEZhY3RvcnlQcm94eUJlYW4oT2JqZWN0IG9yaWcpIHsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IG9yaWcuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKGlzVW5wcm94eWFibGUodHlwZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyB3ZSBkb24ndCBsb2NrIGhlcmU7IG9rIGlmIHR3byBwcm94aWVzIGdldCBnZW5lcmF0ZWQgZm9yIHNhbWUgdHlwZQorICAgICAgICBQcm94eUJlYW4gcHJveHkgPSAoUHJveHlCZWFuKSBfcHJveGllcy5nZXQodHlwZSk7CisgICAgICAgIGlmIChwcm94eSA9PSBudWxsICYmICFfcHJveGllcy5jb250YWluc0tleSh0eXBlKSkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbCA9IGdldE1vc3REZXJpdmVkTG9hZGVyKHR5cGUsIFByb3h5QmVhbi5jbGFzcyk7CisgICAgICAgICAgICBDbGFzcyBwY2xzID0gbG9hZEJ1aWxkVGltZVByb3h5KHR5cGUsIGwpOworICAgICAgICAgICAgaWYgKHBjbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJDQ2xhc3MgYmMgPSBnZW5lcmF0ZVByb3h5QmVhbkJ5dGVjb2RlKHR5cGUsIHRydWUpOworICAgICAgICAgICAgICAgIGlmIChiYyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwY2xzID0gbG9hZFByb3h5KGJjLCBsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwY2xzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcHJveHkgPSAoUHJveHlCZWFuKSBpbnN0YW50aWF0ZVByb3h5KHBjbHMsIAorICAgICAgICAgICAgICAgICAgICBmaW5kQ29weUNvbnN0cnVjdG9yKHR5cGUpLCBuZXcgT2JqZWN0W10ge29yaWd9KTsKKyAgICAgICAgICAgIF9wcm94aWVzLnB1dCh0eXBlLCBwcm94eSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3h5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGtub3duIHRvIGJlIHVucHJveHlhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVW5wcm94eWFibGUoQ2xhc3MgdHlwZSkgeworICAgICAgICBmb3IgKDsgdHlwZSAhPSBudWxsICYmIHR5cGUgIT0gT2JqZWN0LmNsYXNzOyAKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICAgaWYgKF91bnByb3h5YWJsZS5jb250YWlucyh0eXBlLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIHByb3h5IGNsYXNzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGZvciB0aGUgZ2l2ZW4gdHlwZSwKKyAgICAgKiByZXR1cm5pbmcgbnVsbCBpZiBub25lIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgbG9hZEJ1aWxkVGltZVByb3h5KENsYXNzIHR5cGUsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoZ2V0UHJveHlDbGFzc05hbWUodHlwZSwgZmFsc2UpLCB0cnVlLCBsb2FkZXIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBwcm94eSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYnl0ZWNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBsb2FkUHJveHkoQkNDbGFzcyBiYywgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIEJDQ2xhc3NMb2FkZXIgYmNsb2FkZXIgPSBuZXcgQkNDbGFzc0xvYWRlcihiYy5nZXRQcm9qZWN0KCksIGxvYWRlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShiYy5nZXROYW1lKCksIHRydWUsIGJjbG9hZGVyKTsKKyAgICAgICAgICAgIGJjLmdldFByb2plY3QoKS5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihiYy5nZXROYW1lKCkpLnNldENhdXNlKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIHByb3h5IGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgUHJveHkgaW5zdGFudGlhdGVQcm94eShDbGFzcyBjbHMsIENvbnN0cnVjdG9yIGNvbnMsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb25zICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQcm94eSkgY2xzLmdldENvbnN0cnVjdG9yKGNvbnMuZ2V0UGFyYW1ldGVyVHlwZXMoKSkuCisgICAgICAgICAgICAgICAgICAgIG5ld0luc3RhbmNlKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIChQcm94eSkgY2xzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgiY2FudC1uZXdpbnN0YW5jZSIsIAorICAgICAgICAgICAgICAgIGNscy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihjbHMuZ2V0TmFtZSgpKS5zZXRDYXVzZSh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9yZSBkZXJpdmVkIGxvYWRlciBvZiB0aGUgY2xhc3MgbGFvZGVycyBmb3IgdGhlIGdpdmVuIAorICAgICAqIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0TW9zdERlcml2ZWRMb2FkZXIoQ2xhc3MgYzEsIENsYXNzIGMyKSB7CisgICAgICAgIENsYXNzTG9hZGVyIGwxID0gYzEuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbDIgPSBjMi5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAobDEgPT0gbDIpCisgICAgICAgICAgICByZXR1cm4gbDE7CisgICAgICAgIGlmIChsMSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGwyOworICAgICAgICBpZiAobDIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsMTsKKyAgICAgICAgCisgICAgICAgIGZvciAoQ2xhc3NMb2FkZXIgcCA9IGwxLmdldFBhcmVudCgpOyBwICE9IG51bGw7IHAgPSBwLmdldFBhcmVudCgpKQorICAgICAgICAgICAgaWYgKHAgPT0gbDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGwxOworICAgICAgICByZXR1cm4gbDI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIGJ5dGVjb2RlIGZvciBhIGNvbGxlY3Rpb24gcHJveHkgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCBCQ0NsYXNzIGdlbmVyYXRlUHJveHlDb2xsZWN0aW9uQnl0ZWNvZGUoQ2xhc3MgdHlwZSwgCisgICAgICAgIGJvb2xlYW4gcnVudGltZSkgeworICAgICAgICBhc3NlcnROb3RGaW5hbCh0eXBlKTsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsgCisgICAgICAgIEJDQ2xhc3MgYmMgPSBwcm9qZWN0LmxvYWRDbGFzcyhnZXRQcm94eUNsYXNzTmFtZSh0eXBlLCBydW50aW1lKSk7CisgICAgICAgIGJjLnNldFN1cGVyY2xhc3ModHlwZSk7CisgICAgICAgIGJjLmRlY2xhcmVJbnRlcmZhY2UoUHJveHlDb2xsZWN0aW9uLmNsYXNzKTsKKyAKKyAgICAgICAgZGVsZWdhdGVDb25zdHJ1Y3RvcnMoYmMsIHR5cGUpOworICAgICAgICBhZGRQcm94eU1ldGhvZHMoYmMsIHR5cGUsIGZhbHNlKTsKKyAgICAgICAgYWRkUHJveHlDb2xsZWN0aW9uTWV0aG9kcyhiYywgdHlwZSk7CisgICAgICAgIHByb3h5UmVjb2duaXplZE1ldGhvZHMoYmMsIHR5cGUsIFByb3h5Q29sbGVjdGlvbnMuY2xhc3MsIAorICAgICAgICAgICAgUHJveHlDb2xsZWN0aW9uLmNsYXNzKTsKKyAgICAgICAgcHJveHlTZXR0ZXJzKGJjLCB0eXBlKTsKKyAgICAgICAgYWRkV3JpdGVSZXBsYWNlTWV0aG9kKGJjLCBydW50aW1lKTsKKyAgICAgICAgcmV0dXJuIGJjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJveHkgY2xhc3MgdG8gZ2VuZXJhdGUgZm9yIHRoZSBnaXZlbiB0eXBlLiAgIAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm94eUNsYXNzTmFtZShDbGFzcyB0eXBlLCBib29sZWFuIHJ1bnRpbWUpIHsKKyAgICAgICAgU3RyaW5nIGlkID0gKHJ1bnRpbWUpID8gIiQiICsgbmV4dFByb3h5SWQoKSA6ICIiOworICAgICAgICByZXR1cm4gU3RyaW5ncy5nZXRQYWNrYWdlTmFtZShQcm94eU1hbmFnZXJJbXBsLmNsYXNzKSArICIuIiAKKyAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkucmVwbGFjZSgnLicsICckJykgKyBpZCArIFBST1hZX1NVRkZJWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhcHByb3ByaWF0ZSBleGNlcHRpb24gaWYgdGhlIGdpdmVuIHR5cGUgaXMgZmluYWwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RGaW5hbChDbGFzcyB0eXBlKSB7CisgICAgICAgIGlmIChNb2RpZmllci5pc0ZpbmFsKHR5cGUuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1wcm94eS1maW5hbCIsIHR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgYnl0ZWNvZGUgZm9yIGEgbWFwIHByb3h5IGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQkNDbGFzcyBnZW5lcmF0ZVByb3h5TWFwQnl0ZWNvZGUoQ2xhc3MgdHlwZSwgYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIGFzc2VydE5vdEZpbmFsKHR5cGUpOworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOyAKKyAgICAgICAgQkNDbGFzcyBiYyA9IHByb2plY3QubG9hZENsYXNzKGdldFByb3h5Q2xhc3NOYW1lKHR5cGUsIHJ1bnRpbWUpKTsKKyAgICAgICAgYmMuc2V0U3VwZXJjbGFzcyh0eXBlKTsKKyAgICAgICAgYmMuZGVjbGFyZUludGVyZmFjZShQcm94eU1hcC5jbGFzcyk7CisgCisgICAgICAgIGRlbGVnYXRlQ29uc3RydWN0b3JzKGJjLCB0eXBlKTsKKyAgICAgICAgYWRkUHJveHlNZXRob2RzKGJjLCB0eXBlLCBmYWxzZSk7CisgICAgICAgIGFkZFByb3h5TWFwTWV0aG9kcyhiYywgdHlwZSk7CisgICAgICAgIHByb3h5UmVjb2duaXplZE1ldGhvZHMoYmMsIHR5cGUsIFByb3h5TWFwcy5jbGFzcywgUHJveHlNYXAuY2xhc3MpOworICAgICAgICBwcm94eVNldHRlcnMoYmMsIHR5cGUpOworICAgICAgICBhZGRXcml0ZVJlcGxhY2VNZXRob2QoYmMsIHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gYmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIGJ5dGVjb2RlIGZvciBhIGRhdGUgcHJveHkgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCBCQ0NsYXNzIGdlbmVyYXRlUHJveHlEYXRlQnl0ZWNvZGUoQ2xhc3MgdHlwZSwgYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIGFzc2VydE5vdEZpbmFsKHR5cGUpOworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOyAKKyAgICAgICAgQkNDbGFzcyBiYyA9IHByb2plY3QubG9hZENsYXNzKGdldFByb3h5Q2xhc3NOYW1lKHR5cGUsIHJ1bnRpbWUpKTsKKyAgICAgICAgYmMuc2V0U3VwZXJjbGFzcyh0eXBlKTsKKyAgICAgICAgYmMuZGVjbGFyZUludGVyZmFjZShQcm94eURhdGUuY2xhc3MpOworIAorICAgICAgICBkZWxlZ2F0ZUNvbnN0cnVjdG9ycyhiYywgdHlwZSk7CisgICAgICAgIGFkZFByb3h5TWV0aG9kcyhiYywgdHlwZSwgdHJ1ZSk7CisgICAgICAgIGFkZFByb3h5RGF0ZU1ldGhvZHMoYmMsIHR5cGUpOworICAgICAgICBwcm94eVNldHRlcnMoYmMsIHR5cGUpOworICAgICAgICBhZGRXcml0ZVJlcGxhY2VNZXRob2QoYmMsIHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gYmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIGJ5dGVjb2RlIGZvciBhIGNhbGVuZGFyIHByb3h5IGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQkNDbGFzcyBnZW5lcmF0ZVByb3h5Q2FsZW5kYXJCeXRlY29kZShDbGFzcyB0eXBlLCAKKyAgICAgICAgYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIGFzc2VydE5vdEZpbmFsKHR5cGUpOworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOyAKKyAgICAgICAgQkNDbGFzcyBiYyA9IHByb2plY3QubG9hZENsYXNzKGdldFByb3h5Q2xhc3NOYW1lKHR5cGUsIHJ1bnRpbWUpKTsKKyAgICAgICAgYmMuc2V0U3VwZXJjbGFzcyh0eXBlKTsKKyAgICAgICAgYmMuZGVjbGFyZUludGVyZmFjZShQcm94eUNhbGVuZGFyLmNsYXNzKTsKKyAKKyAgICAgICAgZGVsZWdhdGVDb25zdHJ1Y3RvcnMoYmMsIHR5cGUpOworICAgICAgICBhZGRQcm94eU1ldGhvZHMoYmMsIHR5cGUsIHRydWUpOworICAgICAgICBhZGRQcm94eUNhbGVuZGFyTWV0aG9kcyhiYywgdHlwZSk7CisgICAgICAgIHByb3h5U2V0dGVycyhiYywgdHlwZSk7CisgICAgICAgIGFkZFdyaXRlUmVwbGFjZU1ldGhvZChiYywgcnVudGltZSk7CisgICAgICAgIHJldHVybiBiYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgYnl0ZWNvZGUgZm9yIGEgYmVhbiBwcm94eSBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEJDQ2xhc3MgZ2VuZXJhdGVQcm94eUJlYW5CeXRlY29kZShDbGFzcyB0eXBlLCBib29sZWFuIHJ1bnRpbWUpIHsKKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzRmluYWwodHlwZS5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKEltcGxIZWxwZXIuaXNNYW5hZ2VkVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHdlIGNhbiBvbmx5IGdlbmVyYXRlIGEgdmFsaWQgcHJveHkgaWYgdGhlcmUgaXMgYSBjb3B5IGNvbnN0cnVjdG9yCisgICAgICAgIC8vIG9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gZmluZENvcHlDb25zdHJ1Y3Rvcih0eXBlKTsKKyAgICAgICAgaWYgKGNvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29uc3RydWN0b3JbXSBjcyA9IHR5cGUuZ2V0Q29uc3RydWN0b3JzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgY29ucyA9PSBudWxsICYmIGkgPCBjcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgIGlmIChjc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb25zID0gY3NbaV07IAorICAgICAgICAgICAgaWYgKGNvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7IAorICAgICAgICBCQ0NsYXNzIGJjID0gcHJvamVjdC5sb2FkQ2xhc3MoZ2V0UHJveHlDbGFzc05hbWUodHlwZSwgcnVudGltZSkpOworICAgICAgICBiYy5zZXRTdXBlcmNsYXNzKHR5cGUpOworICAgICAgICBiYy5kZWNsYXJlSW50ZXJmYWNlKFByb3h5QmVhbi5jbGFzcyk7CisgCisgICAgICAgIGRlbGVnYXRlQ29uc3RydWN0b3JzKGJjLCB0eXBlKTsKKyAgICAgICAgYWRkUHJveHlNZXRob2RzKGJjLCB0eXBlLCB0cnVlKTsKKyAgICAgICAgYWRkUHJveHlCZWFuTWV0aG9kcyhiYywgdHlwZSwgY29ucyk7CisgICAgICAgIGlmICghcHJveHlTZXR0ZXJzKGJjLCB0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBhZGRXcml0ZVJlcGxhY2VNZXRob2QoYmMsIHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gYmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHBhc3MtdGhyb3VnaCBjb25zdHJ1Y3RvcnMgdG8gYmFzZSB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWxlZ2F0ZUNvbnN0cnVjdG9ycyhCQ0NsYXNzIGJjLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIENvbnN0cnVjdG9yW10gY29ucyA9IHR5cGUuZ2V0Q29uc3RydWN0b3JzKCk7CisgICAgICAgIENsYXNzW10gcGFyYW1zOworICAgICAgICBCQ01ldGhvZCBtOworICAgICAgICBDb2RlIGNvZGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcGFyYW1zID0gY29uc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgbSA9IGJjLmRlY2xhcmVNZXRob2QoIjxpbml0PiIsIHZvaWQuY2xhc3MsIHBhcmFtcyk7IAorICAgICAgICAgICAgbS5tYWtlUHVibGljKCk7CisKKyAgICAgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgY29kZS54bG9hZCgpLnNldFBhcmFtKGopLnNldFR5cGUocGFyYW1zW2pdKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChjb25zW2ldKTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgbWV0aG9kcyBpbiB0aGUge0BsaW5rIFByb3h5fSBpbnRlcmZhY2UsIHdpdGggdGhlIGV4Y2VwdGlvbgorICAgICAqIG9mIHtAbGluayBQcm94eSNjb3B5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFuZ2VUcmFja2VyIHdoZXRoZXIgdG8gaW1wbGVtZW50IGEgbnVsbCBjaGFuZ2UgdHJhY2tlcjsgaWYgZmFsc2UKKyAgICAgKiB0aGUgY2hhbmdlIHRyYWNrZXIgbWV0aG9kIGlzIGxlZnQgdW5pbXBsZW1lbnRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRQcm94eU1ldGhvZHMoQkNDbGFzcyBiYywgQ2xhc3MgdHlwZSwgCisgICAgICAgIGJvb2xlYW4gY2hhbmdlVHJhY2tlcikgeworICAgICAgICBCQ0ZpZWxkIHNtID0gYmMuZGVjbGFyZUZpZWxkKCJzbSIsIE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MpOworICAgICAgICBzbS5zZXRUcmFuc2llbnQodHJ1ZSk7CisgICAgICAgIEJDRmllbGQgZmllbGQgPSBiYy5kZWNsYXJlRmllbGQoImZpZWxkIiwgaW50LmNsYXNzKTsKKyAgICAgICAgZmllbGQuc2V0VHJhbnNpZW50KHRydWUpOworCisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJzZXRPd25lciIsIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdIHsKKyAgICAgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIuY2xhc3MsIGludC5jbGFzcyB9KTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIENvZGUgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoc20pOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmlsb2FkKCkuc2V0UGFyYW0oMSk7CisgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisKKyAgICAgICAgbSA9IGJjLmRlY2xhcmVNZXRob2QoImdldE93bmVyIiwgT3BlbkpQQVN0YXRlTWFuYWdlci5jbGFzcywgbnVsbCk7CisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBjb2RlID0gbS5nZXRDb2RlKHRydWUpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoc20pOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJnZXRPd25lckZpZWxkIiwgaW50LmNsYXNzLCBudWxsKTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGNvZGUuaXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisKKyAgICAgICAgaWYgKGNoYW5nZVRyYWNrZXIpIHsKKyAgICAgICAgICAgIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJnZXRDaGFuZ2VUcmFja2VyIiwgQ2hhbmdlVHJhY2tlci5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0TnVsbCgpOworICAgICAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsgUHJveHlDb2xsZWN0aW9ufSBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3h5Q29sbGVjdGlvbk1ldGhvZHMoQkNDbGFzcyBiYywgQ2xhc3MgdHlwZSkgeworICAgICAgICAvLyBjaGFuZ2UgdHJhY2tlcgorICAgICAgICBCQ0ZpZWxkIGNoYW5nZVRyYWNrZXIgPSBiYy5kZWNsYXJlRmllbGQoImNoYW5nZVRyYWNrZXIiLCAKKyAgICAgICAgICAgIENvbGxlY3Rpb25DaGFuZ2VUcmFja2VyLmNsYXNzKTsKKyAgICAgICAgY2hhbmdlVHJhY2tlci5zZXRUcmFuc2llbnQodHJ1ZSk7CisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJnZXRDaGFuZ2VUcmFja2VyIiwgQ2hhbmdlVHJhY2tlci5jbGFzcywgCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIENvZGUgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGNoYW5nZVRyYWNrZXIpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIGNvbGxlY3Rpb24gY29weQorICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gZmluZENvcHlDb25zdHJ1Y3Rvcih0eXBlKTsKKyAgICAgICAgaWYgKGNvbnMgPT0gbnVsbCAmJiBTb3J0ZWRTZXQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKKyAgICAgICAgICAgIGNvbnMgPSBmaW5kQ29tcGFyYXRvckNvbnN0cnVjdG9yKHR5cGUpOworICAgICAgICBDbGFzc1tdIHBhcmFtcyA9IChjb25zID09IG51bGwpID8gbmV3IENsYXNzWzBdIAorICAgICAgICAgICAgOiBjb25zLmdldFBhcmFtZXRlclR5cGVzKCk7CisKKyAgICAgICAgbSA9IGJjLmRlY2xhcmVNZXRob2QoImNvcHkiLCBPYmplY3QuY2xhc3MsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgaWYgKHBhcmFtc1swXSA9PSBDb21wYXJhdG9yLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKFNvcnRlZFNldC5jbGFzcyk7CisgICAgICAgICAgICAgICAgY29kZS5pbnZva2VpbnRlcmZhY2UoKS5zZXRNZXRob2QoU29ydGVkU2V0LmNsYXNzLCAiY29tcGFyYXRvciIsIAorICAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShwYXJhbXNbMF0pOworICAgICAgICB9CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZCh0eXBlLCAiPGluaXQ+Iiwgdm9pZC5jbGFzcywgcGFyYW1zKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMCB8fCBwYXJhbXNbMF0gPT0gQ29tcGFyYXRvci5jbGFzcykgeworICAgICAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShDb2xsZWN0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZCh0eXBlLCAiYWRkQWxsIiwgYm9vbGVhbi5jbGFzcywgCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDb2xsZWN0aW9uLmNsYXNzIH0pOworICAgICAgICAgICAgY29kZS5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIGVsZW1lbnQgdHlwZQorICAgICAgICBCQ0ZpZWxkIGVsZW1lbnRUeXBlID0gYmMuZGVjbGFyZUZpZWxkKCJlbGVtZW50VHlwZSIsIENsYXNzLmNsYXNzKTsKKyAgICAgICAgZWxlbWVudFR5cGUuc2V0VHJhbnNpZW50KHRydWUpOworICAgICAgICBtID0gYmMuZGVjbGFyZU1ldGhvZCgiZ2V0RWxlbWVudFR5cGUiLCBDbGFzcy5jbGFzcywgbnVsbCk7CisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBjb2RlID0gbS5nZXRDb2RlKHRydWUpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICBjb2RlLmdldGZpZWxkKCkuc2V0RmllbGQoZWxlbWVudFR5cGUpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIG5ldyBpbnN0YW5jZSBmYWN0b3J5CisgICAgICAgIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJuZXdJbnN0YW5jZSIsIFByb3h5Q29sbGVjdGlvbi5jbGFzcywgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IENsYXNzLmNsYXNzLCBDb21wYXJhdG9yLmNsYXNzLCBib29sZWFuLmNsYXNzIH0pOworICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKGJjKTsgCisgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgIGNvbnMgPSBmaW5kQ29tcGFyYXRvckNvbnN0cnVjdG9yKHR5cGUpOworICAgICAgICBwYXJhbXMgPSAoY29ucyA9PSBudWxsKSA/IG5ldyBDbGFzc1swXSA6IGNvbnMuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgxKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKCI8aW5pdD4iLCB2b2lkLmNsYXNzLCBwYXJhbXMpOworICAgICAgICBpbnQgcmV0ID0gY29kZS5nZXROZXh0TG9jYWxzSW5kZXgoKTsKKyAgICAgICAgY29kZS5hc3RvcmUoKS5zZXRMb2NhbChyZXQpOworCisgICAgICAgIC8vIHNldCBlbGVtZW50IHR5cGUKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKHJldCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5wdXRmaWVsZCgpLnNldEZpZWxkKGVsZW1lbnRUeXBlKTsKKworICAgICAgICAvLyBjcmVhdGUgY2hhbmdlIHRyYWNrZXIgYW5kIHNldCBpdAorICAgICAgICBjb2RlLmlsb2FkKCkuc2V0UGFyYW0oMik7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZlcSgpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwocmV0KTsKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlckltcGwuY2xhc3MpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwocmV0KTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKGFsbG93c0R1cGxpY2F0ZXModHlwZSkpOworICAgICAgICBjb2RlLmNvbnN0YW50KCkuc2V0VmFsdWUoaXNPcmRlcmVkKHR5cGUpKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKENvbGxlY3Rpb25DaGFuZ2VUcmFja2VySW1wbC5jbGFzcywgCisgICAgICAgICAgICAiPGluaXQ+Iiwgdm9pZC5jbGFzcywgbmV3IENsYXNzW10geyBDb2xsZWN0aW9uLmNsYXNzLCAKKyAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgIGNvZGUucHV0ZmllbGQoKS5zZXRGaWVsZChjaGFuZ2VUcmFja2VyKTsKKworICAgICAgICBpZmlucy5zZXRUYXJnZXQoY29kZS5hbG9hZCgpLnNldExvY2FsKHJldCkpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHR5cGUgYWxsb3dzIGR1cGxpY2F0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dzRHVwbGljYXRlcyhDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiAhU2V0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdHlwZSBtYWludGFpbnMgYW4gYXJ0aWZpY2lhbCAKKyAgICAgKiBvcmRlcmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc09yZGVyZWQoQ2xhc3MgdHlwZSkgeworICAgICAgICByZXR1cm4gTGlzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpCisgICAgICAgICAgICB8fCAiamF2YS51dGlsLkxpbmtlZEhhc2hTZXQiLmVxdWFscyh0eXBlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsgUHJveHlNYXB9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUHJveHlNYXBNZXRob2RzKEJDQ2xhc3MgYmMsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgLy8gY2hhbmdlIHRyYWNrZXIKKyAgICAgICAgQkNGaWVsZCBjaGFuZ2VUcmFja2VyID0gYmMuZGVjbGFyZUZpZWxkKCJjaGFuZ2VUcmFja2VyIiwgCisgICAgICAgICAgICBNYXBDaGFuZ2VUcmFja2VyLmNsYXNzKTsKKyAgICAgICAgY2hhbmdlVHJhY2tlci5zZXRUcmFuc2llbnQodHJ1ZSk7CisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJnZXRDaGFuZ2VUcmFja2VyIiwgQ2hhbmdlVHJhY2tlci5jbGFzcywgCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIENvZGUgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGNoYW5nZVRyYWNrZXIpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIG1hcCBjb3B5CisgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPSBmaW5kQ29weUNvbnN0cnVjdG9yKHR5cGUpOworICAgICAgICBpZiAoY29ucyA9PSBudWxsICYmIFNvcnRlZE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQorICAgICAgICAgICAgY29ucyA9IGZpbmRDb21wYXJhdG9yQ29uc3RydWN0b3IodHlwZSk7CisgICAgICAgIENsYXNzW10gcGFyYW1zID0gKGNvbnMgPT0gbnVsbCkgPyBuZXcgQ2xhc3NbMF0gCisgICAgICAgICAgICA6IGNvbnMuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKworICAgICAgICBtID0gYmMuZGVjbGFyZU1ldGhvZCgiY29weSIsIE9iamVjdC5jbGFzcywgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pOworICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKHR5cGUpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBpZiAocGFyYW1zWzBdID09IENvbXBhcmF0b3IuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoU29ydGVkTWFwLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZWludGVyZmFjZSgpLnNldE1ldGhvZChTb3J0ZWRNYXAuY2xhc3MsICJjb21wYXJhdG9yIiwgCisgICAgICAgICAgICAgICAgICAgIENvbXBhcmF0b3IuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShwYXJhbXNbMF0pOworICAgICAgICB9CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZCh0eXBlLCAiPGluaXQ+Iiwgdm9pZC5jbGFzcywgcGFyYW1zKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMCB8fCBwYXJhbXNbMF0gPT0gQ29tcGFyYXRvci5jbGFzcykgeworICAgICAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShNYXAuY2xhc3MpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKHR5cGUsICJwdXRBbGwiLCB2b2lkLmNsYXNzLCAKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE1hcC5jbGFzcyB9KTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIGtleSB0eXBlCisgICAgICAgIEJDRmllbGQga2V5VHlwZSA9IGJjLmRlY2xhcmVGaWVsZCgia2V5VHlwZSIsIENsYXNzLmNsYXNzKTsKKyAgICAgICAga2V5VHlwZS5zZXRUcmFuc2llbnQodHJ1ZSk7CisgICAgICAgIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJnZXRLZXlUeXBlIiwgQ2xhc3MuY2xhc3MsIG51bGwpOworICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5nZXRmaWVsZCgpLnNldEZpZWxkKGtleVR5cGUpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHZhbHVlIHR5cGUKKyAgICAgICAgQkNGaWVsZCB2YWx1ZVR5cGUgPSBiYy5kZWNsYXJlRmllbGQoInZhbHVlVHlwZSIsIENsYXNzLmNsYXNzKTsKKyAgICAgICAgdmFsdWVUeXBlLnNldFRyYW5zaWVudCh0cnVlKTsKKyAgICAgICAgbSA9IGJjLmRlY2xhcmVNZXRob2QoImdldFZhbHVlVHlwZSIsIENsYXNzLmNsYXNzLCBudWxsKTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuZ2V0ZmllbGQoKS5zZXRGaWVsZCh2YWx1ZVR5cGUpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIG5ldyBpbnN0YW5jZSBmYWN0b3J5CisgICAgICAgIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJuZXdJbnN0YW5jZSIsIFByb3h5TWFwLmNsYXNzLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ2xhc3MuY2xhc3MsIENsYXNzLmNsYXNzLCBDb21wYXJhdG9yLmNsYXNzLCAKKyAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBjb2RlID0gbS5nZXRDb2RlKHRydWUpOworCisgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoYmMpOyAKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgY29ucyA9IGZpbmRDb21wYXJhdG9yQ29uc3RydWN0b3IodHlwZSk7CisgICAgICAgIHBhcmFtcyA9IChjb25zID09IG51bGwpID8gbmV3IENsYXNzWzBdIDogY29ucy5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDIpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoIjxpbml0PiIsIHZvaWQuY2xhc3MsIHBhcmFtcyk7CisgICAgICAgIGludCByZXQgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKHJldCk7CisKKyAgICAgICAgLy8gc2V0IGtleSBhbmQgdmFsdWUgdHlwZXMKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldExvY2FsKHJldCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgY29kZS5wdXRmaWVsZCgpLnNldEZpZWxkKGtleVR5cGUpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwocmV0KTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDEpOworICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQodmFsdWVUeXBlKTsKKworICAgICAgICAvLyBjcmVhdGUgY2hhbmdlIHRyYWNrZXIgYW5kIHNldCBpdAorICAgICAgICBjb2RlLmlsb2FkKCkuc2V0UGFyYW0oMyk7CisgICAgICAgIEp1bXBJbnN0cnVjdGlvbiBpZmlucyA9IGNvZGUuaWZlcSgpOworICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwocmV0KTsKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShNYXBDaGFuZ2VUcmFja2VySW1wbC5jbGFzcyk7CisgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChyZXQpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoTWFwQ2hhbmdlVHJhY2tlckltcGwuY2xhc3MsIAorICAgICAgICAgICAgIjxpbml0PiIsIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdIHsgTWFwLmNsYXNzIH0pOworICAgICAgICBjb2RlLnB1dGZpZWxkKCkuc2V0RmllbGQoY2hhbmdlVHJhY2tlcik7CisKKyAgICAgICAgaWZpbnMuc2V0VGFyZ2V0KGNvZGUuYWxvYWQoKS5zZXRMb2NhbChyZXQpKTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIG1ldGhvZHMgaW4gdGhlIHtAbGluayBQcm94eURhdGV9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUHJveHlEYXRlTWV0aG9kcyhCQ0NsYXNzIGJjLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIGJvb2xlYW4gaGFzRGVmYXVsdENvbnMgPSBiYy5nZXREZWNsYXJlZE1ldGhvZCgiPGluaXQ+IiwgCisgICAgICAgICAgICAoQ2xhc3NbXSkgbnVsbCkgIT0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBoYXNNaWxsaXNDb25zID0gYmMuZ2V0RGVjbGFyZWRNZXRob2QoIjxpbml0PiIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10geyBsb25nLmNsYXNzIH0pICE9IG51bGw7CisgICAgICAgIGlmICghaGFzRGVmYXVsdENvbnMgJiYgIWhhc01pbGxpc0NvbnMpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWRhdGUtY29ucyIsIHR5cGUpKTsKKworICAgICAgICAvLyBhZGQgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBtaWxsaXMgY29uc3RydWN0b3IKKyAgICAgICAgQkNNZXRob2QgbTsKKyAgICAgICAgQ29kZSBjb2RlOworICAgICAgICBpZiAoIWhhc0RlZmF1bHRDb25zKSB7CisgICAgICAgICAgICBtID0gYmMuZGVjbGFyZU1ldGhvZCgiPGluaXQ+Iiwgdm9pZC5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0VGhpcygpOworICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoU3lzdGVtLmNsYXNzLCAiY3VycmVudFRpbWVNaWxsaXMiLAorICAgICAgICAgICAgICAgIGxvbmcuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKHR5cGUsICI8aW5pdD4iLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgbG9uZy5jbGFzcyB9KTsKKyAgICAgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOyAgICAgICAgICAgCisgICAgICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGF0ZSBjb3B5CisgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPSBmaW5kQ29weUNvbnN0cnVjdG9yKHR5cGUpOworICAgICAgICBDbGFzc1tdIHBhcmFtczsKKyAgICAgICAgaWYgKGNvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhcmFtcyA9IGNvbnMuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgZWxzZSBpZiAoaGFzTWlsbGlzQ29ucykKKyAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBDbGFzc1tdIHsgbG9uZy5jbGFzcyB9OworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJhbXMgPSBuZXcgQ2xhc3NbMF07CisKKyAgICAgICAgbSA9IGJjLmRlY2xhcmVNZXRob2QoImNvcHkiLCBPYmplY3QuY2xhc3MsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgaWYgKHBhcmFtc1swXSA9PSBsb25nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShEYXRlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoRGF0ZS5jbGFzcywgImdldFRpbWUiLCAKKyAgICAgICAgICAgICAgICAgICAgbG9uZy5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUocGFyYW1zWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QodHlwZSwgIjxpbml0PiIsIHZvaWQuY2xhc3MsIHBhcmFtcyk7CisgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoRGF0ZS5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoRGF0ZS5jbGFzcywgImdldFRpbWUiLCBsb25nLmNsYXNzLCAKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZCh0eXBlLCAic2V0VGltZSIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBsb25nLmNsYXNzIH0pOworICAgICAgICB9CisgICAgICAgIGlmICgocGFyYW1zLmxlbmd0aCA9PSAwIHx8IHBhcmFtc1swXSA9PSBsb25nLmNsYXNzKSAKKyAgICAgICAgICAgICYmIFRpbWVzdGFtcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKFRpbWVzdGFtcC5jbGFzcyk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QoVGltZXN0YW1wLmNsYXNzLCAiZ2V0TmFub3MiLCAKKyAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKHR5cGUsICJzZXROYW5vcyIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKworICAgICAgICAvLyBuZXcgaW5zdGFuY2UgZmFjdG9yeQorICAgICAgICBtID0gYmMuZGVjbGFyZU1ldGhvZCgibmV3SW5zdGFuY2UiLCBQcm94eURhdGUuY2xhc3MsIG51bGwpOyAKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYW5ldygpLnNldFR5cGUoYmMpOyAKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKCI8aW5pdD4iLCB2b2lkLmNsYXNzLCBudWxsKTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIG1ldGhvZHMgaW4gdGhlIHtAbGluayBQcm94eUNhbGVuZGFyfSBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3h5Q2FsZW5kYXJNZXRob2RzKEJDQ2xhc3MgYmMsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgLy8gY2FsZW5kYXIgY29weQorICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gZmluZENvcHlDb25zdHJ1Y3Rvcih0eXBlKTsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbXMgPSAoY29ucyA9PSBudWxsKSA/IG5ldyBDbGFzc1swXSAKKyAgICAgICAgICAgIDogY29ucy5nZXRQYXJhbWV0ZXJUeXBlcygpOworCisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJjb3B5IiwgT2JqZWN0LmNsYXNzLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKKyAgICAgICAgbS5tYWtlUHVibGljKCk7CisgICAgICAgIENvZGUgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKworICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKHR5cGUpOworICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUocGFyYW1zWzBdKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QodHlwZSwgIjxpbml0PiIsIHZvaWQuY2xhc3MsIHBhcmFtcyk7CisgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoQ2FsZW5kYXIuY2xhc3MpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKENhbGVuZGFyLmNsYXNzLCAiZ2V0VGltZUluTWlsbGlzIiwgCisgICAgICAgICAgICAgICAgbG9uZy5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QodHlwZSwgInNldFRpbWVJbk1pbGxpcyIsIHZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBsb25nLmNsYXNzIH0pOworCisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKENhbGVuZGFyLmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChDYWxlbmRhci5jbGFzcywgImlzTGVuaWVudCIsIAorICAgICAgICAgICAgICAgIGJvb2xlYW4uY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKHR5cGUsICJzZXRMZW5pZW50Iiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGJvb2xlYW4uY2xhc3MgfSk7CisKKyAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoQ2FsZW5kYXIuY2xhc3MpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKENhbGVuZGFyLmNsYXNzLCAiZ2V0Rmlyc3REYXlPZldlZWsiLCAKKyAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKHR5cGUsICJzZXRGaXJzdERheU9mV2VlayIsIAorICAgICAgICAgICAgICAgIHZvaWQuY2xhc3MsIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzIH0pOworCisgICAgICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFBhcmFtKDApOworICAgICAgICAgICAgY29kZS5jaGVja2Nhc3QoKS5zZXRUeXBlKENhbGVuZGFyLmNsYXNzKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChDYWxlbmRhci5jbGFzcywgCisgICAgICAgICAgICAgICAgImdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsiLCBpbnQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKHR5cGUsICJzZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrIiwgCisgICAgICAgICAgICAgICAgdm9pZC5jbGFzcywgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSk7CisKKyAgICAgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgICAgICBjb2RlLmFsb2FkKCkuc2V0UGFyYW0oMCk7CisgICAgICAgICAgICBjb2RlLmNoZWNrY2FzdCgpLnNldFR5cGUoQ2FsZW5kYXIuY2xhc3MpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKENhbGVuZGFyLmNsYXNzLCAiZ2V0VGltZVpvbmUiLCAKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBjb2RlLmludm9rZXZpcnR1YWwoKS5zZXRNZXRob2QodHlwZSwgInNldFRpbWVab25lIiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFRpbWVab25lLmNsYXNzIH0pOworICAgICAgICB9CisgICAgICAgIGNvZGUuYXJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisKKyAgICAgICAgLy8gbmV3IGluc3RhbmNlIGZhY3RvcnkKKyAgICAgICAgbSA9IGJjLmRlY2xhcmVNZXRob2QoIm5ld0luc3RhbmNlIiwgUHJveHlDYWxlbmRhci5jbGFzcywgbnVsbCk7IAorICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZShiYyk7IAorICAgICAgICBjb2RlLmR1cCgpOworICAgICAgICBjb2RlLmludm9rZXNwZWNpYWwoKS5zZXRNZXRob2QoIjxpbml0PiIsIHZvaWQuY2xhc3MsIG51bGwpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIHByb3h5IHRoZSBwcm90ZWN0ZWQgY29tcHV0ZUZpZWxkcyBtZXRob2QgYi9jIGl0IGlzIGNhbGxlZCBvbgorICAgICAgICAvLyBtdXRhdGUsIGFuZCBzb21lIHNldHRlcnMgYXJlIGZpbmFsIGFuZCB0aGVyZWZvcmUgbm90IHByb3h5YWJsZQorICAgICAgICBtID0gYmMuZGVjbGFyZU1ldGhvZCgiY29tcHV0ZUZpZWxkcyIsIHZvaWQuY2xhc3MsIG51bGwpOworICAgICAgICBtLm1ha2VQcm90ZWN0ZWQoKTsKKyAgICAgICAgY29kZSA9IG0uZ2V0Q29kZSh0cnVlKTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5jb25zdGFudCgpLnNldFZhbHVlKHRydWUpOworICAgICAgICBjb2RlLmludm9rZXN0YXRpYygpLnNldE1ldGhvZChQcm94aWVzLmNsYXNzLCAiZGlydHkiLCB2b2lkLmNsYXNzLAorICAgICAgICAgICAgbmV3IENsYXNzW10geyBQcm94eS5jbGFzcywgYm9vbGVhbi5jbGFzcyB9KTsKKyAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKHR5cGUsICJjb21wdXRlRmllbGRzIiwgdm9pZC5jbGFzcywgbnVsbCk7CisgICAgICAgIGNvZGUudnJldHVybigpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heFN0YWNrKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsgUHJveHlCZWFufSBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3h5QmVhbk1ldGhvZHMoQkNDbGFzcyBiYywgQ2xhc3MgdHlwZSwgQ29uc3RydWN0b3IgY29ucykgeworICAgICAgICAvLyBiZWFuIGNvcHkKKyAgICAgICAgQkNNZXRob2QgbSA9IGJjLmRlY2xhcmVNZXRob2QoImNvcHkiLCBPYmplY3QuY2xhc3MsIAorICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBDb2RlIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgY29kZS5hbmV3KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgY29kZS5kdXAoKTsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbXMgPSBjb25zLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShwYXJhbXNbMF0pOworICAgICAgICB9CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZChjb25zKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGNvcHlQcm9wZXJ0aWVzKHR5cGUsIGNvZGUpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworCisgICAgICAgIC8vIG5ldyBpbnN0YW5jZSBmYWN0b3J5CisgICAgICAgIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJuZXdJbnN0YW5jZSIsIFByb3h5QmVhbi5jbGFzcywgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9KTsgCisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBjb2RlID0gbS5nZXRDb2RlKHRydWUpOworICAgICAgICBjb2RlLmFuZXcoKS5zZXRUeXBlKGJjKTsgCisgICAgICAgIGNvZGUuZHVwKCk7CisgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZShwYXJhbXNbMF0pOworICAgICAgICB9CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZCgiPGluaXQ+Iiwgdm9pZC5jbGFzcywgcGFyYW1zKTsKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGNvcHlQcm9wZXJ0aWVzKHR5cGUsIGNvZGUpOworICAgICAgICBjb2RlLmFyZXR1cm4oKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgYmVhbiBwcm9wZXJ0aWVzLiAgQ2FsbGVkIHdpdGggdGhlIGNvcHkgb2JqZWN0IG9uIHRoZSBzdGFjay4gIE11c3QKKyAgICAgKiByZXR1cm4gd2l0aCB0aGUgY29weSBvYmplY3Qgb24gdGhlIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb3B5UHJvcGVydGllcyhDbGFzcyB0eXBlLCBDb2RlIGNvZGUpIHsKKyAgICAgICAgaW50IGNvcHkgPSBjb2RlLmdldE5leHRMb2NhbHNJbmRleCgpOworICAgICAgICBjb2RlLmFzdG9yZSgpLnNldExvY2FsKGNvcHkpOworICAgICAgICAKKyAgICAgICAgTWV0aG9kW10gbWV0aHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKKyAgICAgICAgTWV0aG9kIGdldHRlcjsKKyAgICAgICAgaW50IG1vZHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1vZHMgPSBtZXRoc1tpXS5nZXRNb2RpZmllcnMoKTsgCisgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1vZHMpIHx8IE1vZGlmaWVyLmlzU3RhdGljKG1vZHMpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKG1ldGhzW2ldLmdldE5hbWUoKSwgInNldCIpCisgICAgICAgICAgICAgICAgfHwgbWV0aHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGdldHRlciA9IGZpbmRHZXR0ZXIodHlwZSwgbWV0aHNbaV0pOworICAgICAgICAgICAgaWYgKGdldHRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBjb3B5LnNldFhYWChvcmlnLmdldFhYWCgpKTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRMb2NhbChjb3B5KTsKKyAgICAgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRQYXJhbSgwKTsKKyAgICAgICAgICAgIGNvZGUuY2hlY2tjYXN0KCkuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgIGNvZGUuaW52b2tldmlydHVhbCgpLnNldE1ldGhvZChnZXR0ZXIpOworICAgICAgICAgICAgY29kZS5pbnZva2V2aXJ0dWFsKCkuc2V0TWV0aG9kKG1ldGhzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlLmFsb2FkKCkuc2V0TG9jYWwoY29weSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJveHkgcmVjb2duaXplZCBtZXRob2RzIHRvIGludm9rZSBoZWxwZXJzIGluIGdpdmVuIGhlbHBlciBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJveHlSZWNvZ25pemVkTWV0aG9kcyhCQ0NsYXNzIGJjLCBDbGFzcyB0eXBlLCBDbGFzcyBoZWxwZXIsCisgICAgICAgIENsYXNzIHByb3h5VHlwZSkgeworICAgICAgICBNZXRob2RbXSBtZXRocyA9IHR5cGUuZ2V0TWV0aG9kcygpOworICAgICAgICBDbGFzc1tdIHBhcmFtczsKKyAgICAgICAgQ2xhc3NbXSBhZnRlclBhcmFtczsKKyAgICAgICAgTWV0aG9kIG1hdGNoOworICAgICAgICBNZXRob2QgYWZ0ZXI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHBhcmFtcyA9IHRvSGVscGVyUGFyYW1ldGVycyhtZXRoc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLCAKKyAgICAgICAgICAgICAgICBwcm94eVR5cGUpOworCisgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3Igb3ZlcnJpZGluZyBtZXRob2QgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hdGNoID0gaGVscGVyLmdldE1ldGhvZChtZXRoc1tpXS5nZXROYW1lKCksIHBhcmFtcyk7IAorICAgICAgICAgICAgICAgIHByb3h5T3ZlcnJpZGVNZXRob2QoYmMsIG1ldGhzW2ldLCBtYXRjaCwgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjaGVjayBmb3IgYmVmb3JlIGFuZCBhZnRlciBtZXRob2RzLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IG5vdAorICAgICAgICAgICAgLy8gZXhpc3QKKyAgICAgICAgICAgIG1hdGNoID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBoZWxwZXIuZ2V0TWV0aG9kKCJiZWZvcmUiIAorICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobWV0aHNbaV0uZ2V0TmFtZSgpKSwgcGFyYW1zKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWZ0ZXIgPSBudWxsOworICAgICAgICAgICAgYWZ0ZXJQYXJhbXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhZnRlclBhcmFtcyA9IHRvSGVscGVyQWZ0ZXJQYXJhbWV0ZXJzKHBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgIG1ldGhzW2ldLmdldFJldHVyblR5cGUoKSwgKG1hdGNoID09IG51bGwpIAorICAgICAgICAgICAgICAgICAgICA/IHZvaWQuY2xhc3MgOiBtYXRjaC5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgICAgIGFmdGVyID0gaGVscGVyLmdldE1ldGhvZCgiYWZ0ZXIiIAorICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobWV0aHNbaV0uZ2V0TmFtZSgpKSwgYWZ0ZXJQYXJhbXMpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCB8fCBhZnRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHByb3h5QmVmb3JlQWZ0ZXJNZXRob2QoYmMsIHR5cGUsIG1ldGhzW2ldLCBtYXRjaCwgcGFyYW1zLCBhZnRlciwKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJhbXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaGVscGVyIGNsYXNzIG1ldGhvZC4KKyAgICAgKi8gCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSB0b0hlbHBlclBhcmFtZXRlcnMoQ2xhc3NbXSBjbHMsIENsYXNzIGhlbHBlcikgeworICAgICAgICBDbGFzc1tdIHBhcmFtcyA9IG5ldyBDbGFzc1tjbHMubGVuZ3RoICsgMV07CisgICAgICAgIHBhcmFtc1swXSA9IGhlbHBlcjsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjbHMsIDAsIHBhcmFtcywgMSwgY2xzLmxlbmd0aCk7IAorICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGhlbHBlciBjbGFzcyAiYWZ0ZXIiICAgICAKKyAgICAgKiBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSB0b0hlbHBlckFmdGVyUGFyYW1ldGVycyhDbGFzc1tdIGNscywgQ2xhc3MgcmV0LAorICAgICAgICBDbGFzcyBiZWZvcmVSZXQpIHsKKyAgICAgICAgaWYgKHJldCA9PSB2b2lkLmNsYXNzICYmIGJlZm9yZVJldCA9PSB2b2lkLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIGNsczsKKyAgICAgICAgaW50IGxlbiA9IGNscy5sZW5ndGg7CisgICAgICAgIGlmIChyZXQgIT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICBpZiAoYmVmb3JlUmV0ICE9IHZvaWQuY2xhc3MpCisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbXMgPSBuZXcgQ2xhc3NbbGVuXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjbHMsIDAsIHBhcmFtcywgMCwgY2xzLmxlbmd0aCk7CisgICAgICAgIGludCBwb3MgPSBjbHMubGVuZ3RoOworICAgICAgICBpZiAocmV0ICE9IHZvaWQuY2xhc3MpCisgICAgICAgICAgICBwYXJhbXNbcG9zKytdID0gcmV0OworICAgICAgICBpZiAoYmVmb3JlUmV0ICE9IHZvaWQuY2xhc3MpCisgICAgICAgICAgICBwYXJhbXNbcG9zKytdID0gYmVmb3JlUmV0OworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3h5IHNldHRlciBtZXRob2RzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBmaW5kIGFueSBzZXR0ZXJzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHJveHlTZXR0ZXJzKEJDQ2xhc3MgYmMsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgTWV0aG9kW10gbWV0aHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKKyAgICAgICAgaW50IHNldHRlcnMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXNTZXR0ZXIobWV0aHNbaV0pICYmICFNb2RpZmllci5pc0ZpbmFsKG1ldGhzW2ldLmdldE1vZGlmaWVycygpKQorICAgICAgICAgICAgICAgICYmIGJjLmdldERlY2xhcmVkTWV0aG9kKG1ldGhzW2ldLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtZXRoc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0dGVycysrOworICAgICAgICAgICAgICAgIHByb3h5U2V0dGVyKGJjLCB0eXBlLCBtZXRoc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiBzZXR0ZXJzID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm94eSB0aGUgZ2l2ZW4gbWV0aG9kIHdpdGggb25lIHRoYXQgb3ZlcnJpZGVzIGl0IGJ5IGNhbGxpbmcgaW50byB0aGUKKyAgICAgKiBnaXZlbiBoZWxwZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb3h5T3ZlcnJpZGVNZXRob2QoQkNDbGFzcyBiYywgTWV0aG9kIG1ldGgsIAorICAgICAgICBNZXRob2QgaGVscGVyLCBDbGFzc1tdIHBhcmFtcykgeworICAgICAgICBCQ01ldGhvZCBtID0gYmMuZGVjbGFyZU1ldGhvZChtZXRoLmdldE5hbWUoKSwgbWV0aC5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICBtZXRoLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICBtLm1ha2VQdWJsaWMoKTsKKyAgICAgICAgQ29kZSBjb2RlID0gbS5nZXRDb2RlKHRydWUpOworCisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29kZS54bG9hZCgpLnNldFBhcmFtKGkgLSAxKS5zZXRUeXBlKHBhcmFtc1tpXSk7CisgICAgICAgIGNvZGUuaW52b2tlc3RhdGljKCkuc2V0TWV0aG9kKGhlbHBlcik7CisgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUobWV0aC5nZXRSZXR1cm5UeXBlKCkpOworCisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhMb2NhbHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm94eSB0aGUgZ2l2ZW4gbWV0aG9kIHdpdGggb25lIHRoYXQgb3ZlcnJpZGVzIGl0IGJ5IGNhbGxpbmcgaW50byB0aGUKKyAgICAgKiBnaXZlbiBoZWxwZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb3h5QmVmb3JlQWZ0ZXJNZXRob2QoQkNDbGFzcyBiYywgQ2xhc3MgdHlwZSwgTWV0aG9kIG1ldGgsIAorICAgICAgICBNZXRob2QgYmVmb3JlLCBDbGFzc1tdIHBhcmFtcywgTWV0aG9kIGFmdGVyLCBDbGFzc1tdIGFmdGVyUGFyYW1zKSB7CisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKG1ldGguZ2V0TmFtZSgpLCBtZXRoLmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgIG1ldGguZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBDb2RlIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisKKyAgICAgICAgLy8gaW52b2tlIGJlZm9yZQorICAgICAgICBpbnQgYmVmb3JlUmV0ID0gLTE7CisgICAgICAgIGlmIChiZWZvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNvZGUueGxvYWQoKS5zZXRQYXJhbShpIC0gMSkuc2V0VHlwZShwYXJhbXNbaV0pOworICAgICAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoYmVmb3JlKTsKKyAgICAgICAgICAgIGlmIChhZnRlciAhPSBudWxsICYmIGJlZm9yZS5nZXRSZXR1cm5UeXBlKCkgIT0gdm9pZC5jbGFzcykgeworICAgICAgICAgICAgICAgIGJlZm9yZVJldCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgICAgICAgICAgY29kZS54c3RvcmUoKS5zZXRMb2NhbChiZWZvcmVSZXQpLgorICAgICAgICAgICAgICAgICAgICBzZXRUeXBlKGJlZm9yZS5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW52b2tlIHN1cGVyCisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29kZS54bG9hZCgpLnNldFBhcmFtKGkgLSAxKS5zZXRUeXBlKHBhcmFtc1tpXSk7CisgICAgICAgIGNvZGUuaW52b2tlc3BlY2lhbCgpLnNldE1ldGhvZCh0eXBlLCBtZXRoLmdldE5hbWUoKSwgCisgICAgICAgICAgICBtZXRoLmdldFJldHVyblR5cGUoKSwgbWV0aC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKworICAgICAgICAvLyBpbnZva2UgYWZ0ZXIgCisgICAgICAgIGlmIChhZnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gLTE7CisgICAgICAgICAgICBpZiAobWV0aC5nZXRSZXR1cm5UeXBlKCkgIT0gdm9pZC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldCA9IGNvZGUuZ2V0TmV4dExvY2Fsc0luZGV4KCk7CisgICAgICAgICAgICAgICAgY29kZS54c3RvcmUoKS5zZXRMb2NhbChyZXQpLnNldFR5cGUobWV0aC5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZS5hbG9hZCgpLnNldFRoaXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNvZGUueGxvYWQoKS5zZXRQYXJhbShpIC0gMSkuc2V0VHlwZShwYXJhbXNbaV0pOworICAgICAgICAgICAgaWYgKHJldCAhPSAtMSkKKyAgICAgICAgICAgICAgICBjb2RlLnhsb2FkKCkuc2V0TG9jYWwocmV0KS5zZXRUeXBlKG1ldGguZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChiZWZvcmVSZXQgIT0gLTEpCisgICAgICAgICAgICAgICAgY29kZS54bG9hZCgpLnNldExvY2FsKGJlZm9yZVJldCkuCisgICAgICAgICAgICAgICAgICAgIHNldFR5cGUoYmVmb3JlLmdldFJldHVyblR5cGUoKSk7CisgICAgICAgICAgICBjb2RlLmludm9rZXN0YXRpYygpLnNldE1ldGhvZChhZnRlcik7CisgICAgICAgIH0KKyAgICAgICAgY29kZS54cmV0dXJuKCkuc2V0VHlwZShtZXRoLmdldFJldHVyblR5cGUoKSk7CisKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgaXMgYSBzZXR0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXR0ZXIoTWV0aG9kIG1ldGgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgobWV0aC5nZXROYW1lKCksICJzZXQiKQorICAgICAgICAgICAgfHwgc3RhcnRzV2l0aChtZXRoLmdldE5hbWUoKSwgImFkZCIpCisgICAgICAgICAgICB8fCBzdGFydHNXaXRoKG1ldGguZ2V0TmFtZSgpLCAicmVtb3ZlIikKKyAgICAgICAgICAgIHx8IHN0YXJ0c1dpdGgobWV0aC5nZXROYW1lKCksICJpbnNlcnQiKQorICAgICAgICAgICAgfHwgc3RhcnRzV2l0aChtZXRoLmdldE5hbWUoKSwgImNsZWFyIikKKyAgICAgICAgICAgIHx8IHN0YXJ0c1dpdGgobWV0aC5nZXROYW1lKCksICJyb2xsIik7IC8vIHVzZWQgYnkgQ2FsZW5kYXIKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdldHRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzZXR0ZXIsIG9yIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1ldGhvZCBmaW5kR2V0dGVyKENsYXNzIHR5cGUsIE1ldGhvZCBzZXR0ZXIpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzZXR0ZXIuZ2V0TmFtZSgpLnN1YnN0cmluZygzKTsKKyAgICAgICAgQ2xhc3MgcGFyYW0gPSBzZXR0ZXIuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXTsKKyAgICAgICAgTWV0aG9kIGdldHRlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldHRlciA9IHR5cGUuZ2V0TWV0aG9kKCJnZXQiICsgbmFtZSwgKENsYXNzW10pIG51bGwpOyAgIAorICAgICAgICAgICAgaWYgKGdldHRlci5nZXRSZXR1cm5UeXBlKCkuaXNBc3NpZ25hYmxlRnJvbShwYXJhbSkKKyAgICAgICAgICAgICAgICB8fCBwYXJhbS5pc0Fzc2lnbmFibGVGcm9tKGdldHRlci5nZXRSZXR1cm5UeXBlKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXI7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJhbSA9PSBib29sZWFuLmNsYXNzIHx8IHBhcmFtID09IEJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2V0dGVyID0gdHlwZS5nZXRNZXRob2QoImlzIiArIG5hbWUsIChDbGFzc1tdKSBudWxsKTsgICAKKyAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyLmdldFJldHVyblR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtKQorICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS5pc0Fzc2lnbmFibGVGcm9tKGdldHRlci5nZXRSZXR1cm5UeXBlKCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHRhcmdldCBzdHJpbmcgc3RhcnMgd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoKFN0cmluZyBzdHIsIFN0cmluZyB0b2tlbikgeworICAgICAgICByZXR1cm4gc3RyLnN0YXJ0c1dpdGgodG9rZW4pCisgICAgICAgICAgICAmJiAoc3RyLmxlbmd0aCgpID09IHRva2VuLmxlbmd0aCgpIAorICAgICAgICAgICAgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0ci5jaGFyQXQodG9rZW4ubGVuZ3RoKCkpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJveHkgdGhlIGdpdmVuIHNldHRlciBtZXRob2QgdG8gZGlydHkgdGhlIHByb3h5IG93bmVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm94eVNldHRlcihCQ0NsYXNzIGJjLCBDbGFzcyB0eXBlLCBNZXRob2QgbWV0aCkgeworICAgICAgICBDbGFzc1tdIHBhcmFtcyA9IG1ldGguZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgQ2xhc3MgcmV0ID0gbWV0aC5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKG1ldGguZ2V0TmFtZSgpLCByZXQsIHBhcmFtcyk7CisgICAgICAgIG0ubWFrZVB1YmxpYygpOworICAgICAgICBDb2RlIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSh0cnVlKTsKKyAgICAgICAgY29kZS5pbnZva2VzdGF0aWMoKS5zZXRNZXRob2QoUHJveGllcy5jbGFzcywgImRpcnR5Iiwgdm9pZC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgUHJveHkuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29kZS54bG9hZCgpLnNldFBhcmFtKGkpLnNldFR5cGUocGFyYW1zW2ldKTsKKyAgICAgICAgY29kZS5pbnZva2VzcGVjaWFsKCkuc2V0TWV0aG9kKHR5cGUsIG1ldGguZ2V0TmFtZSgpLCByZXQsIHBhcmFtcyk7CisgICAgICAgIGNvZGUueHJldHVybigpLnNldFR5cGUocmV0KTsKKyAgICAgICAgY29kZS5jYWxjdWxhdGVNYXhTdGFjaygpOworICAgICAgICBjb2RlLmNhbGN1bGF0ZU1heExvY2FscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHdyaXRlUmVwbGFjZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNlcmlhbGl6ZXMgdG8gYSBub24tcHJveHkgdHlwZQorICAgICAqIHVubGVzcyBkZXRhY2hlZCBhbmQgdGhpcyBpcyBhIGJ1aWxkLXRpbWUgZ2VuZXJhdGVkIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRXcml0ZVJlcGxhY2VNZXRob2QoQkNDbGFzcyBiYywgYm9vbGVhbiBydW50aW1lKSB7CisgICAgICAgIEJDTWV0aG9kIG0gPSBiYy5kZWNsYXJlTWV0aG9kKCJ3cml0ZVJlcGxhY2UiLCBPYmplY3QuY2xhc3MsIG51bGwpOworICAgICAgICBtLm1ha2VQcm90ZWN0ZWQoKTsKKyAgICAgICAgbS5nZXRFeGNlcHRpb25zKHRydWUpLmFkZEV4Y2VwdGlvbihPYmplY3RTdHJlYW1FeGNlcHRpb24uY2xhc3MpOworICAgICAgICBDb2RlIGNvZGUgPSBtLmdldENvZGUodHJ1ZSk7CisgICAgICAgIGNvZGUuYWxvYWQoKS5zZXRUaGlzKCk7CisgICAgICAgIGNvZGUuY29uc3RhbnQoKS5zZXRWYWx1ZSghcnVudGltZSk7CisgICAgICAgIGNvZGUuaW52b2tlc3RhdGljKCkuc2V0TWV0aG9kKFByb3hpZXMuY2xhc3MsICJ3cml0ZVJlcGxhY2UiLCAKKyAgICAgICAgICAgIE9iamVjdC5jbGFzcywgbmV3IENsYXNzW10geyBQcm94eS5jbGFzcywgYm9vbGVhbi5jbGFzcyB9KTsKKyAgICAgICAgY29kZS5hcmV0dXJuKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4TG9jYWxzKCk7CisgICAgICAgIGNvZGUuY2FsY3VsYXRlTWF4U3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB1bmlxdWUgaWQgdG8gYXZvaWQgcHJveHkgY2xhc3MgbmFtZSBjb25mbGljdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGxvbmcgbmV4dFByb3h5SWQoKSB7CisgICAgICAgIHJldHVybiBfcHJveHlJZCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYW4gYXBwcm9wcmlhdGUgY29weSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yIHJldHVybiBudWxsCisgICAgICogaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29uc3RydWN0b3IgZmluZENvcHlDb25zdHJ1Y3RvcihDbGFzcyBjbHMpIHsKKyAgICAgICAgQ29uc3RydWN0b3JbXSBjb25zID0gY2xzLmdldENvbnN0cnVjdG9ycygpOworICAgICAgICBDb25zdHJ1Y3RvciBtYXRjaCA9IG51bGw7CisgICAgICAgIENsYXNzIG1hdGNoUGFyYW0gPSBudWxsOworICAgICAgICBDbGFzc1tdIHBhcmFtczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBwYXJhbXMgPSBjb25zW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBxdWl0IGltbWVkaWF0ZWx5IG9uIGV4YWN0IG1hdGNoCisgICAgICAgICAgICBpZiAocGFyYW1zWzBdID09IGNscykKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uc1tpXTsKKworICAgICAgICAgICAgaWYgKHBhcmFtc1swXS5pc0Fzc2lnbmFibGVGcm9tKGNscykgJiYgKG1hdGNoUGFyYW0gPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IG1hdGNoUGFyYW0uaXNBc3NpZ25hYmxlRnJvbShwYXJhbXNbMF0pKSkgeworICAgICAgICAgICAgICAgICAvLyB0cmFjayBtb3N0IGRlcml2ZWQgY29sbGVjdGlvbiBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgIG1hdGNoID0gY29uc1tpXTsKKyAgICAgICAgICAgICAgICBtYXRjaFBhcmFtID0gcGFyYW1zWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaDsgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgY29tcGFyYXRvciBmb3IgdGhlIGdpdmVuIHR5cGUsIG9yCisgICAgICogbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yIGZpbmRDb21wYXJhdG9yQ29uc3RydWN0b3IoQ2xhc3MgY2xzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2xzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgQ29tcGFyYXRvci5jbGFzcyB9KTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2FnZTogamF2YSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5wcm94eS5Qcm94eU1hbmFnZXJJbXBsIFtvcHRpb25dKgorICAgICAqICZsdDtjbGFzcyBuYW1lJmd0Oys8YnIgLz4KKyAgICAgKiBXaGVyZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6CisgICAgICogPHVsPiAKKyAgICAgKiA8bGk+PGk+LXV0aWxzLy11ICZsdDtudW1iZXImZ3Q7PC9pPjogR2VuZXJhdGUgcHJveGllcyBmb3IgdGhlIHN0YW5kYXJkCisgICAgICogamF2YS51dGlsIGNvbGxlY3Rpb24sIG1hcCwgZGF0ZSwgYW5kIGNhbGVuZGFyIGNsYXNzZXMgb2YgdGhlIGdpdmVuIEphdmEKKyAgICAgKiB2ZXJzaW9uLiAgVXNlIDQgZm9yIEphdmEgMS40LCA1IGZvciBKYXZhIDUsIGV0Yy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBUaGUgbWFpbiBtZXRob2QgZ2VuZXJhdGVzIC5jbGFzcyBmaWxlcyBmb3IgdGhlIHByb3hpZXMgdG8gdGhlIGNsYXNzZXMgICAgCisgICAgICogZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIEl0IHdyaXRlcyB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgdG8gYmVzaWRlIHRoZQorICAgICAqIFByb3h5TWFuYWdlckltcGwuY2xhc3MgZmlsZSBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIGl0IHdyaXRlcyB0byB0aGUgCisgICAgICogY3VycmVudCBkaXJlY3RvcnkuICBUaGUgcHJveHkgbWFuYWdlciBsb29rcyBmb3IgdGhlc2UgY2xhc3NlcyAKKyAgICAgKiBiZWZvcmUgZ2VuZXJhdGluZyBpdHMgb3duIHByb3hpZXMgYXQgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSAKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBkaXIgPSBGaWxlcy5nZXRDbGFzc0ZpbGUoUHJveHlNYW5hZ2VySW1wbC5jbGFzcyk7CisgICAgICAgIGRpciA9IChkaXIgPT0gbnVsbCkgPyBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpCisgICAgICAgICAgICA6IGRpci5nZXRQYXJlbnRGaWxlKCk7CisKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgYXJncyA9IG9wdHMuc2V0RnJvbUNtZExpbmUoYXJncyk7CisKKyAgICAgICAgTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJncykpOworICAgICAgICBpbnQgdXRpbHMgPSBvcHRzLnJlbW92ZUludFByb3BlcnR5KCJ1dGlscyIsICJ1IiwgMCk7CisgICAgICAgIGlmICh1dGlscyA+PSA0KSB7CisgICAgICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgIGphdmEuc3FsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGphdmEuc3FsLlRpbWUuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXAuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoU2V0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSGFzaHRhYmxlLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTGlua2VkTGlzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgamF2YS51dGlsLlByb3BlcnRpZXMuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGphdmEudXRpbC5UcmVlTWFwLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVHJlZVNldC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICB9KSk7IAorICAgICAgICB9CisgICAgICAgIGlmICh1dGlscyA+PSA1KSB7CisgICAgICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuRW51bU1hcCIsCisgICAgICAgICAgICAgICAgImphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAiLAorICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCIsCisgICAgICAgICAgICAgICAgImphdmEudXRpbC5MaW5rZWRIYXNoU2V0IiwKKyAgICAgICAgICAgICAgICAiamF2YS51dGlsLlByaW9yaXR5UXVldWUiLAorICAgICAgICAgICAgfSkpOyAKKyAgICAgICAgfQorCisgICAgICAgIFByb3h5TWFuYWdlckltcGwgbWdyID0gbmV3IFByb3h5TWFuYWdlckltcGwoKTsKKyAgICAgICAgQ2xhc3MgY2xzOworICAgICAgICBCQ0NsYXNzIGJjOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKChTdHJpbmcpIHR5cGVzLmdldChpKSk7CisgICAgICAgICAgICBpZiAobWdyLmxvYWRCdWlsZFRpbWVQcm94eShjbHMsIGdldE1vc3REZXJpdmVkTG9hZGVyKGNscywgCisgICAgICAgICAgICAgICAgUHJveHkuY2xhc3MpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpCisgICAgICAgICAgICAgICAgYmMgPSBtZ3IuZ2VuZXJhdGVQcm94eUNvbGxlY3Rpb25CeXRlY29kZShjbHMsIGZhbHNlKTsgICAgICAgICAKKyAgICAgICAgICAgIGVsc2UgaWYgKE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpCisgICAgICAgICAgICAgICAgYmMgPSBtZ3IuZ2VuZXJhdGVQcm94eU1hcEJ5dGVjb2RlKGNscywgZmFsc2UpOyAgICAgICAgIAorICAgICAgICAgICAgZWxzZSBpZiAoRGF0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpCisgICAgICAgICAgICAgICAgYmMgPSBtZ3IuZ2VuZXJhdGVQcm94eURhdGVCeXRlY29kZShjbHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKENhbGVuZGFyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkKKyAgICAgICAgICAgICAgICBiYyA9IG1nci5nZW5lcmF0ZVByb3h5Q2FsZW5kYXJCeXRlY29kZShjbHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYyA9IG1nci5nZW5lcmF0ZVByb3h5QmVhbkJ5dGVjb2RlKGNscywgZmFsc2UpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGJjLndyaXRlKG5ldyBGaWxlKGRpciwgYmMuZ2V0Q2xhc3NOYW1lKCkgKyAiLmNsYXNzIikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5TWFwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQwNjRhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5TWFwLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHByb3hpZXMgb24ge0BsaW5rIE1hcH0gdHlwZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBQcm94eU1hcAorICAgIGV4dGVuZHMgUHJveHksIE1hcCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwIGtleSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRLZXlUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwIHZhbHVlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFZhbHVlVHlwZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcHJveHkgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHlNYXAgbmV3SW5zdGFuY2UoQ2xhc3Mga2V5VHlwZSwgQ2xhc3MgdmFsdWVUeXBlLAorICAgICAgICBDb21wYXJhdG9yIGNvbXBhcmUsIGJvb2xlYW4gdHJhY2tDaGFuZ2VzKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eU1hcHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eU1hcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVkNGRkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Byb3h5TWFwcy5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgdXNlZCBieSBtYXAgcHJveGllcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUHJveHlNYXBzIAorICAgIGV4dGVuZHMgUHJveGllcyB7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgTWFwI2NsZWFyfSBvbiBzdXBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xlYXIoUHJveHlNYXAgbWFwKSB7CisgICAgICAgIGRpcnR5KG1hcCwgdHJ1ZSk7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgcmVtb3ZlZChtYXAsIGVudHJ5LmdldEtleSgpLCB0cnVlKTsKKyAgICAgICAgICAgIHJlbW92ZWQobWFwLCBlbnRyeS5nZXRWYWx1ZSgpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBmb3Ige0BsaW5rIE1hcCNrZXlTZXR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0IGtleVNldChQcm94eU1hcCBtYXApIHsKKyAgICAgICAgUHJveHlFbnRyeVNldCBlbnRyaWVzID0gKFByb3h5RW50cnlTZXQpIG1hcC5lbnRyeVNldCgpOworICAgICAgICBlbnRyaWVzLnNldFZpZXcoUHJveHlFbnRyeVNldC5WSUVXX0tFWVMpOworICAgICAgICByZXR1cm4gZW50cmllczsgCisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgZm9yIHtAbGluayBNYXAjdmFsdWVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gdmFsdWVzKFByb3h5TWFwIG1hcCkgeworICAgICAgICBQcm94eUVudHJ5U2V0IGVudHJpZXMgPSAoUHJveHlFbnRyeVNldCkgbWFwLmVudHJ5U2V0KCk7CisgICAgICAgIGVudHJpZXMuc2V0VmlldyhQcm94eUVudHJ5U2V0LlZJRVdfVkFMVUVTKTsKKyAgICAgICAgcmV0dXJuIGVudHJpZXM7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIGdpdmVuIGVudHJ5IHNldCBpbiBhIHByb3h5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0IGFmdGVyRW50cnlTZXQoUHJveHlNYXAgbWFwLCBTZXQgZW50cmllcykgeworICAgICAgICByZXR1cm4gbmV3IFByb3h5RW50cnlTZXRJbXBsKG1hcCwgZW50cmllcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIE1hcCNwdXR9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBiZWZvcmVQdXQoUHJveHlNYXAgbWFwLCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0QWxsb3dlZFR5cGUoa2V5LCBtYXAuZ2V0S2V5VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0QWxsb3dlZFR5cGUodmFsdWUsIG1hcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgIGRpcnR5KG1hcCwgZmFsc2UpOworICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgTWFwI3B1dH0gb24gc3VwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0IHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgc3VwZXIncyBtZXRob2QKKyAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB7QGxpbmsgI2JlZm9yZVB1dH0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB7QGxpbmsgTWFwI3B1dH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhZnRlclB1dChQcm94eU1hcCBtYXAsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgT2JqZWN0IHJldCwgYm9vbGVhbiBiZWZvcmUpIHsKKyAgICAgICAgaWYgKGJlZm9yZSkgeworICAgICAgICAgICAgaWYgKG1hcC5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAoKE1hcENoYW5nZVRyYWNrZXIpIG1hcC5nZXRDaGFuZ2VUcmFja2VyKCkpLmNoYW5nZWQoa2V5LCByZXQsIAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgICAgICByZW1vdmVkKG1hcCwgcmV0LCBmYWxzZSk7CisgICAgICAgIH0gZWxzZSBpZiAobWFwLmdldENoYW5nZVRyYWNrZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgKChNYXBDaGFuZ2VUcmFja2VyKSBtYXAuZ2V0Q2hhbmdlVHJhY2tlcigpKS5hZGRlZChrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGJlZm9yZSBpbnZva2luZyB7QGxpbmsgUHJvcGVydGllcyNzZXRQcm9wZXJ0eX0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGJlZm9yZVNldFByb3BlcnR5KFByb3h5TWFwIG1hcCwgU3RyaW5nIGtleSwgCisgICAgICAgIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gYmVmb3JlUHV0KG1hcCwga2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgUHJvcGVydGllcyNzZXRQcm9wZXJ0eX0gb24gc3VwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0IHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgc3VwZXIncyBtZXRob2QKKyAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB7QGxpbmsgI2JlZm9yZVNldFByb3BlcnR5fQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHtAbGluayBQcm9wZXJ0aWVzI3NldFByb3BlcnR5fQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFmdGVyU2V0UHJvcGVydHkoUHJveHlNYXAgbWFwLCBTdHJpbmcga2V5LCAKKyAgICAgICAgU3RyaW5nIHZhbHVlLCBPYmplY3QgcmV0LCBib29sZWFuIGJlZm9yZSkgeworICAgICAgICByZXR1cm4gYWZ0ZXJQdXQobWFwLCBrZXksIHZhbHVlLCByZXQsIGJlZm9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIFByb3BlcnRpZXMjbG9hZH0gb24gc3VwZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUxvYWQoUHJveHlNYXAgbWFwLCBJbnB1dFN0cmVhbSBpbikgeworICAgICAgICBkaXJ0eShtYXAsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYmVmb3JlIGludm9raW5nIHtAbGluayBQcm9wZXJ0aWVzI2xvYWRYTUx9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVMb2FkRnJvbVhNTChQcm94eU1hcCBtYXAsIElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIGRpcnR5KG1hcCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWQgZm9yIHtAbGluayBNYXAjcHV0QWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QWxsKFByb3h5TWFwIG1hcCwgTWFwIHZhbHVlcykgeworICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdmFsdWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIG1hcC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBiZWZvcmUgaW52b2tpbmcge0BsaW5rIE1hcCNyZW1vdmV9IG9uIHN1cGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBiZWZvcmVSZW1vdmUoUHJveHlNYXAgbWFwLCBPYmplY3Qga2V5KSB7CisgICAgICAgIGRpcnR5KG1hcCwgZmFsc2UpOworICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhZnRlciBpbnZva2luZyB7QGxpbmsgTWFwI3JlbW92ZX0gb24gc3VwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0IHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgc3VwZXIncyBtZXRob2QKKyAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB7QGxpbmsgI2JlZm9yZVJlbW92ZX0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB7QGxpbmsgTWFwI3JlbW92ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhZnRlclJlbW92ZShQcm94eU1hcCBtYXAsIE9iamVjdCBrZXksIE9iamVjdCByZXQsIAorICAgICAgICBib29sZWFuIGJlZm9yZSkgeworICAgICAgICBpZiAoYmVmb3JlKSB7CisgICAgICAgICAgICBpZiAobWFwLmdldENoYW5nZVRyYWNrZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICgoTWFwQ2hhbmdlVHJhY2tlcikgbWFwLmdldENoYW5nZVRyYWNrZXIoKSkucmVtb3ZlZChrZXksIHJldCk7CisgICAgICAgICAgICByZW1vdmVkKG1hcCwga2V5LCB0cnVlKTsKKyAgICAgICAgICAgIHJlbW92ZWQobWFwLCByZXQsIGZhbHNlKTsKKyAgICAgICAgfSAKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrZXIgaW50ZXJmYWNlIGZvciBhIHByb3h5IGVudHJ5IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBQcm94eUVudHJ5U2V0IAorICAgICAgICBleHRlbmRzIFNldCB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklFV19LRVlTID0gMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklFV19WQUxVRVMgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSUVXX0VOVFJJRVMgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgd2hhdCBlbnRyeSB2aWV3IHRoaXMgc2V0IGV4cG9zZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KGludCB2aWV3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXJ0eWluZyBwcm94eSBmb3IgbWFwIGVudHJ5IHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eUVudHJ5U2V0SW1wbAorICAgICAgICBleHRlbmRzIEFic3RyYWN0U2V0IAorICAgICAgICBpbXBsZW1lbnRzIFByb3h5RW50cnlTZXQgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm94eU1hcCBfbWFwOworICAgICAgICBwcml2YXRlIGZpbmFsIFNldCBfZW50cmllczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3ZpZXcgPSBWSUVXX0VOVFJJRVM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN1cHBseSBvd25pbmcgbWFwIGFuZCBkZWxlZ2F0ZSBlbnRyeSBzZXQgb24gY29uc3RydWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb3h5RW50cnlTZXRJbXBsKFByb3h5TWFwIG1hcCwgU2V0IGVudHJpZXMpIHsKKyAgICAgICAgICAgIF9tYXAgPSBtYXA7CisgICAgICAgICAgICBfZW50cmllcyA9IGVudHJpZXM7IAorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZpZXcgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBfdmlldzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBWaWV3IG1vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KGludCB2aWV3KSB7CisgICAgICAgICAgICBfdmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gX2VudHJpZXMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoX3ZpZXcgIT0gVklFV19LRVlTKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIV9tYXAuY29udGFpbnNLZXkobykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgX21hcC5yZW1vdmUobyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ciA9IF9lbnRyaWVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHByaXZhdGUgTWFwLkVudHJ5IF9sYXN0ID0gbnVsbDsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdHIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgX2xhc3QgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF92aWV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZJRVdfS0VZUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xhc3QuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZJRVdfVkFMVUVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGFzdC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xhc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgICAgIGRpcnR5KF9tYXAsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoX21hcC5nZXRDaGFuZ2VUcmFja2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTWFwQ2hhbmdlVHJhY2tlcikgX21hcC5nZXRDaGFuZ2VUcmFja2VyKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQoX2xhc3QuZ2V0S2V5KCksIF9sYXN0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQoX21hcCwgX2xhc3QuZ2V0S2V5KCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICBQcm94aWVzLnJlbW92ZWQoX21hcCwgX2xhc3QuZ2V0VmFsdWUoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHdyaXRlUmVwbGFjZSgpCisgICAgICAgICAgICB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX3ZpZXcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZJRVdfS0VZUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoTWFwKSBfbWFwKS5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZJRVdfVkFMVUVTOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChNYXApIF9tYXApLnZhbHVlcygpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKE1hcCkgX21hcCkuZW50cnlTZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9SZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1JlZmVyZW50aWFsSW50ZWdyaXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxNzEwOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9SZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIEV4Y2VwdGlvbiB0eXBlIHJlc2VydmVkIGZvciB2aW9sYXRpb25zIG9mIGludGVncml0eSBjb25zdHJhaW50cy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICovCitwdWJsaWMgY2xhc3MgUmVmZXJlbnRpYWxJbnRlZ3JpdHlFeGNlcHRpb24KKyAgICBleHRlbmRzIFN0b3JlRXhjZXB0aW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElWX1VOS05PV04gPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElWX0RVUExJQ0FURV9PSUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElWX1VOSVFVRSA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVZfUkVGRVJFTkNFID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVl9NSVhFRCA9IDQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUmVmZXJlbnRpYWxJbnRlZ3JpdHlFeGNlcHRpb24uY2xhc3MpOworCisgICAgcHJpdmF0ZSBpbnQgX2l2ID0gSVZfVU5LTk9XTjsKKworICAgIHB1YmxpYyBSZWZlcmVudGlhbEludGVncml0eUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIFJlZmVyZW50aWFsSW50ZWdyaXR5RXhjZXB0aW9uKGludCBpdikgeworICAgICAgICB0aGlzKGdldE1lc3NhZ2UoaXYpKTsKKyAgICAgICAgc2V0SW50ZWdyaXR5VmlvbGF0aW9uKGl2KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgaXYpIHsKKyAgICAgICAgc3dpdGNoIChpdikgeworICAgICAgICAgICAgY2FzZSBJVl9EVVBMSUNBVEVfT0lEOgorICAgICAgICAgICAgICAgIHJldHVybiBfbG9jLmdldCgiZHVwLW9pZCIpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGNhc2UgSVZfVU5JUVVFOgorICAgICAgICAgICAgICAgIHJldHVybiBfbG9jLmdldCgidW5pcXVlIikuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xvYy5nZXQoInJlZi1pbnRlZ3JpdHkiKS5nZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBSRUZFUkVOVElBTF9JTlRFR1JJVFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgaW50ZWdyaXR5IHZpb2xhdGlvbiB0aGF0IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50ZWdyaXR5VmlvbGF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2l2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGludGVncml0eSB2aW9sYXRpb24gdGhhdCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVmZXJlbnRpYWxJbnRlZ3JpdHlFeGNlcHRpb24gc2V0SW50ZWdyaXR5VmlvbGF0aW9uKGludCBpdikgeworICAgICAgICBfaXYgPSBpdjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUludChfaXYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBfaXYgPSBpbi5yZWFkSW50KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1J1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjU5OTUwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1J1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIGJ5IG1hbnkgZmFjYWRlIGhlbHBlcnMgdG8gdHJhbnNsYXRlIGV4Y2VwdGlvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGludGVyZmFjZSBSdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvcgorICAgIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSdW50aW1lRXhjZXB0aW9uIHRyYW5zbGF0ZShSdW50aW1lRXhjZXB0aW9uIHJlKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9TZXJpYWxpemF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MGQwMTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU2VyaWFsaXphdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk11bHRpQ2xhc3NMb2FkZXI7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgcGVyc2lzdGVudCBvYmplY3RzLAorICogc3VidGl0dXRpbmcgb2lkcyBpbnRvIHRoZSBzZXJpYWxpemVkIHN0cmVhbSBhbmQgc3VidGl0dXRpbmcgdGhlIHBlcnNpc3RlbnQKKyAqIG9iamVjdHMgYmFjayBkdXJpbmcgZGVzZXJpYWxpemF0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC4zLjMKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoU2VyaWFsaXphdGlvbi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgYSB2YWx1ZSB0aGF0IG1pZ2h0IGNvbnRhaW4gcGVyc2lzdGVudCBvYmplY3RzLiBSZXBsYWNlcworICAgICAqIHBlcnNpc3RlbnQgb2JqZWN0cyB3aXRoIHRoZWlyIG9pZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gc2VyaWFsaXplKE9iamVjdCB2YWwsIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9ianMgPSBuZXcgUGVyc2lzdGVudE9iamVjdE91dHB1dFN0cmVhbShieXRlcywKKyAgICAgICAgICAgICAgICBjdHgpOworICAgICAgICAgICAgb2Jqcy53cml0ZU9iamVjdCh2YWwpOworICAgICAgICAgICAgb2Jqcy5mbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZSBhbiBvYmplY3QgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZGVzZXJpYWxpemUoYnl0ZVtdIGJ5dGVzLCBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplKGluLCBjdHgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplIGFuIG9iamVjdCB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZGVzZXJpYWxpemUoSW5wdXRTdHJlYW0gaW4sIFN0b3JlQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjdHggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzUmVzb2x2aW5nT2JqZWN0SW5wdXRTdHJlYW0oaW4pLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVudE9iamVjdElucHV0U3RyZWFtKGluLCBjdHgpLnJlYWRPYmplY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9iamVjdCBvdXRwdXQgc3RyZWFtIHRoYXQgcmVwbGFjZXMgcGVyc2lzdGVudCBvYmplY3RzIHdpdGggdGhlaXIgb2lkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNpc3RlbnRPYmplY3RPdXRwdXRTdHJlYW0KKyAgICAgICAgZXh0ZW5kcyBPYmplY3RPdXRwdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgU3RvcmVDb250ZXh0IF9jdHg7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGVyc2lzdGVudE9iamVjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gZGVsZWdhdGUsCisgICAgICAgICAgICBTdG9yZUNvbnRleHQgY3R4KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgICAgIF9jdHggPSBjdHg7CisgICAgICAgICAgICBlbmFibGVSZXBsYWNlT2JqZWN0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCByZXBsYWNlT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIE9iamVjdCBvaWQgPSBfY3R4LmdldE9iamVjdElkKG9iaik7CisgICAgICAgICAgICByZXR1cm4gKG9pZCA9PSBudWxsKSA/IG9iaiA6IG5ldyBPYmplY3RJZE1hcmtlcihvaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1Jlc29sdmluZ09iamVjdElucHV0U3RyZWFtCisgICAgICAgIGV4dGVuZHMgT2JqZWN0SW5wdXRTdHJlYW0geworCisgICAgICAgIHB1YmxpYyBDbGFzc1Jlc29sdmluZ09iamVjdElucHV0U3RyZWFtKElucHV0U3RyZWFtIGRlbGVnYXRlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBDbGFzcyByZXNvbHZlQ2xhc3MoT2JqZWN0U3RyZWFtQ2xhc3MgZGVzYykgCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgTXVsdGlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgTXVsdGlDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgYWRkQ29udGV4dENsYXNzTG9hZGVycyhsb2FkZXIpOworICAgICAgICAgICAgbG9hZGVyLmFkZENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBsb2FkZXIuYWRkQ2xhc3NMb2FkZXIoTXVsdGlDbGFzc0xvYWRlci5TWVNURU1fTE9BREVSKTsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGRlc2MuZ2V0TmFtZSgpLCB0cnVlLCBsb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29udGV4dENsYXNzTG9hZGVycyhNdWx0aUNsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAgICAgbG9hZGVyLmFkZENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT2JqZWN0IGlucHV0IHN0cmVhbSB0aGF0IHJlcGxhY2VzIG9pZHMgd2l0aCB0aGVpciBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc2lzdGVudE9iamVjdElucHV0U3RyZWFtCisgICAgICAgIGV4dGVuZHMgQ2xhc3NSZXNvbHZpbmdPYmplY3RJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdG9yZUNvbnRleHQgX2N0eDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBzb3VyY2Ugc3RyZWFtIGFuZCBicm9rZXIgdG8KKyAgICAgICAgICogdXNlIGZvciBwZXJzaXN0ZW50IG9iamVjdCBsb29rdXBzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBlcnNpc3RlbnRPYmplY3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBkZWxlZ2F0ZSwKKyAgICAgICAgICAgIFN0b3JlQ29udGV4dCBjdHgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoZGVsZWdhdGUpOworICAgICAgICAgICAgX2N0eCA9IGN0eDsKKyAgICAgICAgICAgIGVuYWJsZVJlc29sdmVPYmplY3QodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZXh0Q2xhc3NMb2FkZXJzKE11bHRpQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgICAgICBzdXBlci5hZGRDb250ZXh0Q2xhc3NMb2FkZXJzKGxvYWRlcik7CisgICAgICAgICAgICBsb2FkZXIuYWRkQ2xhc3NMb2FkZXIoX2N0eC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZU9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBPYmplY3RJZE1hcmtlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKKworICAgICAgICAgICAgT2JqZWN0IG9pZCA9ICgoT2JqZWN0SWRNYXJrZXIpIG9iaikub2lkOworICAgICAgICAgICAgaWYgKG9pZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBPYmplY3QgcGMgPSBfY3R4LmZpbmQob2lkLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKyAgICAgICAgICAgIGlmIChwYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nIGxvZyA9IF9jdHguZ2V0Q29uZmlndXJhdGlvbigpLmdldExvZworICAgICAgICAgICAgICAgICAgICAoT3BlbkpQQUNvbmZpZ3VyYXRpb24uTE9HX1JVTlRJTUUpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgiYmFkLXNlci1vaWQiLCBvaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShuZXcgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24ob2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrZXIgZm9yIG9pZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT2JqZWN0SWRNYXJrZXIKKyAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgICAgIHB1YmxpYyBPYmplY3Qgb2lkOworCisgICAgICAgIHB1YmxpYyBPYmplY3RJZE1hcmtlcihPYmplY3Qgb2lkKSB7CisgICAgICAgICAgICB0aGlzLm9pZCA9IG9pZDsKKwkJfQorCX0gCit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9TaG9ydElkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU2hvcnRJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjdlZDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU2hvcnRJZC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKKy8qKgorICoge0BsaW5rIE9wZW5KUEFJZH0gc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIHNob3J0IGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2hvcnRJZCBleHRlbmRzIE9wZW5KUEFJZCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IGtleTsKKworICAgIHB1YmxpYyBTaG9ydElkKENsYXNzIGNscywgU2hvcnQga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gKHNob3J0KSAwIDoga2V5LnNob3J0VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIFNob3J0SWQoQ2xhc3MgY2xzLCBTdHJpbmcga2V5KSB7CisgICAgICAgIHRoaXMoY2xzLCAoa2V5ID09IG51bGwpID8gKHNob3J0KSAwIDogU2hvcnQucGFyc2VTaG9ydChrZXkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2hvcnRJZChDbGFzcyBjbHMsIHNob3J0IGtleSkgeworICAgICAgICBzdXBlcihjbHMpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2hvcnRJZChDbGFzcyBjbHMsIHNob3J0IGtleSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHN1cGVyKGNscywgc3Vicyk7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldElkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gbmV3IFNob3J0KGtleSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFNob3J0LnRvU3RyaW5nKGtleSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBpZEhhc2goKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgcmV0dXJuIGtleSA9PSAoKFNob3J0SWQpIG8pLmtleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU3RvcmVFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9TdG9yZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDU1NjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU3RvcmVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworCisvKioKKyAqIEJhc2UgZXhjZXB0aW9uIGZvciBkYXRhIHN0b3JlIGVycm9ycy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQHNpbmNlIDAuMi41CisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yZUV4Y2VwdGlvbgorICAgIGV4dGVuZHMgT3BlbkpQQUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NLID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfTk9UX0ZPVU5EID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJTUlTVElDID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOVElBTF9JTlRFR1JJVFkgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9FWElTVFMgPSA1OworCisgICAgcHVibGljIFN0b3JlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmVFeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0b3JlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gU1RPUkU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1N0b3JlRmFjYWRlVHlwZVJlZ2lzdHJ5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvU3RvcmVGYWNhZGVUeXBlUmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhlMGUyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1N0b3JlRmFjYWRlVHlwZVJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7DQorDQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsNCisNCisvKioNCisgKiBSZXBvc2l0b3J5IG9mIHN0b3JlLXNwZWNpZmljIGZhY2FkZSBjbGFzc2VzLiBUaGlzIGlzIHVzZWQgYnkgZmFjYWRlIA0KKyAqIGltcGxlbWVudGF0aW9ucyB0byB3cmFwIHN0b3JlLXNwZWNpZmljIGNvbXBvbmVudHMgd2l0aG91dCBrbm93aW5nIA0KKyAqIGFib3V0IGFsbCBwb3NzaWJsZSBiYWNrLWVuZHMuDQorICovDQorcHVibGljIGNsYXNzIFN0b3JlRmFjYWRlVHlwZVJlZ2lzdHJ5IHsNCisNCisgICAgcHJpdmF0ZSBNYXAgX2ltcGxzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZWdpc3RlciBhIGZhY2FkZSBpbXBsZW1lbnRhdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZhY2FkZVR5cGUgdGhlIGZhY2FkZSBpbnRlcmZhY2UNCisgICAgICogQHBhcmFtIHN0b3JlVHlwZSB0aGUgc3RvcmUncyANCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVNYW5hZ2VyfSB0eXBlLCBvciBudWxsIGZvciBnZW5lcmljDQorICAgICAqIEBwYXJhbSBpbXBsVHlwZSB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBmYWNhZGUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVySW1wbGVtZW50YXRpb24oQ2xhc3MgZmFjYWRlVHlwZSwgQ2xhc3Mgc3RvcmVUeXBlLCANCisgICAgICAgIENsYXNzIGltcGxUeXBlKSB7DQorICAgICAgICBPYmplY3Qga2V5ID0gKHN0b3JlVHlwZSA9PSBudWxsKSA/IChPYmplY3QpZmFjYWRlVHlwZSANCisgICAgICAgICAgICA6IG5ldyBLZXkoZmFjYWRlVHlwZSwgc3RvcmVUeXBlKTsNCisgICAgICAgIF9pbXBscy5wdXQoa2V5LCBpbXBsVHlwZSk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gZmFjYWRlIGFuZCBzdG9yZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZhY2FkZVR5cGUgdGhlIGZhY2FkZSBpbnRlcmZhY2UNCisgICAgICogQHBhcmFtIHN0b3JlVHlwZSB0aGUgc3RvcmUncyANCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVNYW5hZ2VyfSB0eXBlLCBvciBudWxsIGZvciBnZW5lcmljDQorICAgICAqIEBwYXJhbSBpbXBsVHlwZSB0aGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRvcg0KKyAgICAgKi8NCisgICAgcHVibGljIENsYXNzIGdldEltcGxlbWVudGF0aW9uKENsYXNzIGZhY2FkZVR5cGUsIENsYXNzIHN0b3JlVHlwZSkgew0KKyAgICAgICAgLy8gdHJhdmVyc2Ugc3RvcmUgdHlwZSBoaWVyYXJjaHkgdG8gc3RvcmUgbWFuYWdlciB0byBmaW5kIG1vc3Qgc3BlY2lmaWMNCisgICAgICAgIC8vIHN0b3JlIGF2YWlhbGJsZQ0KKyAgICAgICAgQ2xhc3MgaW1wbDsNCisgICAgICAgIGZvciAoOyBzdG9yZVR5cGUgIT0gbnVsbCAmJiBzdG9yZVR5cGUgIT0gU3RvcmVNYW5hZ2VyLmNsYXNzOyANCisgICAgICAgICAgICBzdG9yZVR5cGUgPSBzdG9yZVR5cGUuZ2V0U3VwZXJjbGFzcygpKSB7DQorICAgICAgICAgICAgaW1wbCA9IChDbGFzcykgX2ltcGxzLmdldChuZXcgS2V5KGZhY2FkZVR5cGUsIHN0b3JlVHlwZSkpOw0KKyAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOyANCisgICAgICAgIH0gICAgDQorICAgICAgICByZXR1cm4gKENsYXNzKSBfaW1wbHMuZ2V0KGZhY2FkZVR5cGUpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdpdmVuIGZhY2FkZSBhbmQgc3RvcmUuIElmIG5vIA0KKyAgICAgKiByZWdpc3RlcmVkIGltcGxlbWVudGF0aW9uIGlzIGZvdW5kIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gZGVmYXVsdCB0eXBlDQorICAgICAqIHByb3ZpZGVkIGl0IHRoZSBmYWNhZGUgdHlwZSBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIGRlYWZ1bHQgdHlwZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZhY2FkZVR5cGUgdGhlIGZhY2FkZSBpbnRlcmZhY2UNCisgICAgICogQHBhcmFtIHN0b3JlVHlwZSB0aGUgc3RvcmUncyANCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU3RvcmVNYW5hZ2VyfSB0eXBlLCBvciBudWxsIGZvciBnZW5lcmljDQorICAgICAqIEBwYXJhbSBpbXBsVHlwZSB0aGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRvcg0KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFR5cGUgY2xhc3MgaWYgbm8gcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0SW1wbGVtZW50YXRpb24oQ2xhc3MgZmFjYWRlVHlwZSwgQ2xhc3Mgc3RvcmVUeXBlLCANCisgICAgCUNsYXNzIGRlZmF1bHRUeXBlKSB7DQorICAgIAlDbGFzcyByZXN1bHQgPSBnZXRJbXBsZW1lbnRhdGlvbihmYWNhZGVUeXBlLCBzdG9yZVR5cGUpOw0KKyAgICAJaWYgKHJlc3VsdCA9PSBudWxsKQ0KKyAgICAJCXJlc3VsdCA9IGRlZmF1bHRUeXBlOw0KKyAgICAJaWYgKGZhY2FkZVR5cGUgPT0gbnVsbCB8fCAhZmFjYWRlVHlwZS5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdCkpDQorICAgIAkJdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7DQorICAgIAlyZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBMb29rdXAga2V5IGZvciBmYWNhZGUrc3RvcmUgaGFzaC4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleSB7DQorICAgICAgICBwdWJsaWMgZmluYWwgQ2xhc3MgX2ZhY2FkZVR5cGU7DQorICAgICAgICBwdWJsaWMgZmluYWwgQ2xhc3MgX3N0b3JlVHlwZTsNCisNCisgICAgICAgIHB1YmxpYyBLZXkoQ2xhc3MgZmFjYWRlVHlwZSwgQ2xhc3Mgc3RvcmVUeXBlKSB7DQorICAgICAgICAgICAgX2ZhY2FkZVR5cGUgPSBmYWNhZGVUeXBlOw0KKyAgICAgICAgICAgIF9zdG9yZVR5cGUgPSBzdG9yZVR5cGU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgICAgIHJldHVybiBfZmFjYWRlVHlwZS5oYXNoQ29kZSgpIF4gX3N0b3JlVHlwZS5oYXNoQ29kZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICBLZXkgayA9IChLZXkpIG90aGVyOw0KKyAgICAgICAgICAgIHJldHVybiBfZmFjYWRlVHlwZSA9PSBrLl9mYWNhZGVUeXBlICYmIF9zdG9yZVR5cGUgPT0gay5fc3RvcmVUeXBlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9TdHJpbmdJZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1N0cmluZ0lkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MGY1ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9TdHJpbmdJZC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKKy8qKgorICoge0BsaW5rIE9wZW5KUEFJZH0gc3ViY2xhc3MgYXBwcm9wcmlhdGUgZm9yIFN0cmluZyBmaWVsZHMuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ0lkIGV4dGVuZHMgT3BlbkpQQUlkIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleTsKKworICAgIHB1YmxpYyBTdHJpbmdJZChDbGFzcyBjbHMsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgc3VwZXIoY2xzKTsKKyAgICAgICAgdGhpcy5rZXkgPSAoa2V5ID09IG51bGwpID8gIiIgOiBrZXk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ0lkKENsYXNzIGNscywgU3RyaW5nIGtleSwgYm9vbGVhbiBzdWJzKSB7CisgICAgICAgIHN1cGVyKGNscywgc3Vicyk7CisgICAgICAgIHRoaXMua2V5ID0gKGtleSA9PSBudWxsKSA/ICIiIDoga2V5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgaWRIYXNoKCkgeworICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWRFcXVhbHMoT3BlbkpQQUlkIG8pIHsKKyAgICAgICAgcmV0dXJuIGtleS5lcXVhbHMoKChTdHJpbmdJZCkgbykua2V5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvVW5zdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9VbnN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzI3NzcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvVW5zdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplci5NZXNzYWdlOworCisvKioKKyAqIEV4Y2VwdGlvbiB0eXBlIGZvciBhdHRlbXB0cyB0byBwZXJmb3JtIHVuc3VwcG9ydGVkIG9wZXJhdGlvbnMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBzaW5jZSAwLjIuNQorICovCitwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRFeGNlcHRpb24KKyAgICBleHRlbmRzIE9wZW5KUEFFeGNlcHRpb24geworCisgICAgcHVibGljIFVuc3VwcG9ydGVkRXhjZXB0aW9uKCkgeworICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdXBwb3J0ZWRFeGNlcHRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgc2V0RmF0YWwodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3VwcG9ydGVkRXhjZXB0aW9uKE1lc3NhZ2UgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgICAgIHNldEZhdGFsKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFVOU1VQUE9SVEVEOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Vc2VyRXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvVXNlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTI1NDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvVXNlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyLk1lc3NhZ2U7CisKKy8qKgorICogQmFzZSBleGNlcHRpb24gdHlwZSBmb3IgdXNlciBlcnJvcnMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBzaW5jZSAwLjIuNQorICovCitwdWJsaWMgY2xhc3MgVXNlckV4Y2VwdGlvbgorICAgIGV4dGVuZHMgT3BlbkpQQUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQSA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TVEFURSA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVFJBTlNBQ1RJT04gPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19SRVNVTFQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTl9VTklRVUVfUkVTVUxUID0gNjsKKworICAgIHB1YmxpYyBVc2VyRXhjZXB0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBVc2VyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckV4Y2VwdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBVc2VyRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIFVzZXJFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgIH0KKworICAgIHB1YmxpYyBVc2VyRXhjZXB0aW9uKE1lc3NhZ2UgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVVNFUjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTM0ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQSBVdGlsaXRpZXM8L3N0cm9uZz48L3A+CisKKzxwPgorICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyB1dGlsaXRpZXMgdG8gZmFjaWxpdGF0ZSB0aGUgaGFuZGxpbmcgb2Ygc2Vjb25kCisgICAgY2xhc3Mgb2JqZWN0cyBhbmQgT3BlbkpQQSBvYmplY3QgaWRzLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qanRyZWUvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL0pQUUwuamp0IGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9qanRyZWUvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL0pQUUwuamp0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5N2ExMjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL2pqdHJlZS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWwvSlBRTC5qanQKQEAgLTAsMCArMSwxMjg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorICovCisKKy8qKgorICogIEFuIEpQIFFMIGdyYW1tYXIgcGFyc2VyLgorICogCisgKiAgU2FtcGxlczoKKyAqCSAgU0VMRUNUIENPVU5UKHApIEZST00gUGVyc29uIEFTIHAKKyAqCSAgU0VMRUNUIE9CSkVDVChpZGVudGlmaWVyKSBGUk9NIHNjaGVtYSBpZGVudGlmaWVyCisgKgkgIFNFTEVDVCBpZGVudGlmaWVyIEZST00gc2NoZW1hIEFTIGlkZW50aWZpZXIKKyAqCQorICoJQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqCUBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK29wdGlvbnMgeworCU5PREVfUFJFRklYID0gIkpQUUwiOworCU5PREVfUEFDS0FHRSA9ICJvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmpwcWwiOworCU1VTFRJID0gZmFsc2U7CisJTk9ERV9ERUZBVUxUX1ZPSUQgPSB0cnVlOworCUpBVkFfVU5JQ09ERV9FU0NBUEUgPSB0cnVlOworCVNUQVRJQyA9IGZhbHNlOworCU5PREVfVVNFU19QQVJTRVIgPSB0cnVlOworCisJTE9PS0FIRUFEID0gMTsKKworCisJLy8gZGVidWdnaW5nIHZhcmlhYmxlcworCS8vIERFQlVHX1BBUlNFUiA9IHRydWU7IAkJLy8gc2ltcGxlIHBhcnNlciBkZWJ1ZworCS8vIERFQlVHX1RPS0VOX01BTkFHRVIgPSB0cnVlOyAJLy8gbW9yZSB2ZXJib3NlIHRva2VuIG1hbmFnZXIgZGVidWcKKwkvLyBERUJVR19MT09LQUhFQUQgPSB0cnVlOyAJCS8vIG1vcmUgdmVyYm9zZSBsb29rYWhlYWQgZGVidWcKKworCVNBTklUWV9DSEVDSyA9IHRydWU7IC8vIGNoZWNrIGZvciBsZWZ0LXJlY3Vyc2lvbiwgZXRjIChtdXN0IGFsd2F5cyBiZSB0cnVlKQorCisKKwkvLyBGT1JDRV9MQV9DSEVDSyA9IHRydWU7Cit9CisKK1BBUlNFUl9CRUdJTihKUFFMKQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmpwcWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CisKKworCisvKioKKyAqCUBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEpQUUwKK3sKKwlTdHJpbmcganBxbDsKKworCisJcHVibGljIEpQUUwgKFN0cmluZyBqcHFsKQorCXsKKwkJdGhpcyAobmV3IFN0cmluZ1JlYWRlciAoanBxbCkpOworCisJCXRoaXMuanBxbCA9IGpwcWw7CisJfQorCisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGFyZ3MubGVuZ3RoID4gMCkKKwkJeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCUpQUUwgcGFyc2VyID0gbmV3IEpQUUwgKGFyZ3NbaV0pOworCQkJCVNpbXBsZU5vZGUgYXN0ID0gKFNpbXBsZU5vZGUpIHBhcnNlci5wYXJzZVF1ZXJ5ICgpOworCQkJCWFzdC5kdW1wIChTeXN0ZW0ub3V0LCAiIik7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlKUFFMIHBhcnNlciA9IG5ldyBKUFFMIChTeXN0ZW0uaW4pOworCQkJd2hpbGUgKHRydWUpCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludCAoIkVudGVyIEV4cHJlc3Npb246ICIpOworCQkJCVN5c3RlbS5vdXQuZmx1c2ggKCk7CisJCQkJdHJ5CisJCQkJeworCQkJCQlTaW1wbGVOb2RlIGFzdCA9IChTaW1wbGVOb2RlKSBwYXJzZXIucGFyc2VRdWVyeSAoKTsKKwkJCQkJaWYgKGFzdCA9PSBudWxsKQorCQkJCQkJcmV0dXJuOworCQkJCQllbHNlCisJCQkJCQlhc3QuZHVtcCAoU3lzdGVtLm91dCwgIiIpOworCQkJCX0KKwkJCQljYXRjaCAoVGhyb3dhYmxlIHgpCisJCQkJeworCQkJCQl4LnByaW50U3RhY2tUcmFjZSAoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworUEFSU0VSX0VORChKUFFMKQorCisKK1NLSVAgOgoreworIAkiICIKKwl8ICJcciIKKwl8ICJcdCIKK30KKworCitUT0tFTiBbIElHTk9SRV9DQVNFIF06IC8qIGJhc2ljcyAqLworeworCTwgQ09NTUE6ICIsIiA+CisKKwl8CTwgRE9UOiAiLiIgPgorCisJfAk8IEVROiAiPSIgPgorCXwJPCBORTogIjw+IiA+CisJfAk8IEdUOiAiPiIgPgorCXwJPCBHRTogIj49IiA+CisJfAk8IExUOiAiPCIgPgorCXwJPCBMRTogIjw9IiA+CisKKwl8CTwgUExVUzogIisiID4KKwl8CTwgTUlOVVM6ICItIiA+CisKKwl8CTwgVElNRVM6ICIqIiA+CisJfAk8IERJVjogIi8iID4KKworCXwJPCBORVc6ICJORVciID4KKworCXwJPCBBTEw6ICJBTEwiID4KKwl8CTwgQU5ZOiAiQU5ZIiA+CisJfAk8IEVYSVNUUzogIkVYSVNUUyIgPgorCXwJPCBTT01FOiAiU09NRSIgPgorCXwJPCBFTVBUWTogIkVNUFRZIiA+CisKKwl8CTwgQVNDOiAiQVNDIiA+CisJfAk8IERFU0M6ICJERVNDIiA+CisJfAk8IE9SREVSOiAiT1JERVIiID4KKwl8CTwgQlk6ICJCWSIgPgorCisJfAk8IElTOiAiSVMiID4KKwl8CTwgTUVNQkVSOiAiTUVNQkVSIiA+CisJfAk8IE9GOiAiT0YiID4KKwl8CTwgTElLRTogIkxJS0UiID4KKwl8CTwgRVNDQVBFOiAiRVNDQVBFIiA+CisJfAk8IEJFVFdFRU46ICJCRVRXRUVOIiA+CisKKwl8CTwgTlVMTDogIk5VTEwiID4KK30KKworVE9LRU4gWyBJR05PUkVfQ0FTRSBdOiAvKiBhZ2dyZWdhdGVzICovCit7CisJPCBBVkc6ICJBVkciID4KKwl8CTwgTUlOOiAiTUlOIiA+CisJfAk8IE1BWDogIk1BWCIgPgorCXwJPCBTVU06ICJTVU0iID4KKwl8CTwgQ09VTlQ6ICJDT1VOVCIgPgorfQorCitUT0tFTiBbIElHTk9SRV9DQVNFIF06IC8qIGJvb2xlYW4gYXJpdGhtZXRpYyAqLworeworCTwgT1I6ICJPUiIgPgorCXwJPCBBTkQ6ICJBTkQiID4KKwl8CTwgTk9UOiAiTk9UIiA+Cit9CisKK1RPS0VOIFsgSUdOT1JFX0NBU0UgXTogLyogZnVuY3Rpb25zIHJldHVybmluZyBzdHJpbmdzICovCit7CisJPCBDT05DQVQ6ICJDT05DQVQiID4KKwl8CTwgU1VCU1RSSU5HOiAiU1VCU1RSSU5HIiA+CisJfAk8IFRSSU06ICJUUklNIiA+CisJfAk8IExPV0VSOiAiTE9XRVIiID4KKwl8CTwgVVBQRVI6ICJVUFBFUiIgPgorfQorCitUT0tFTiBbIElHTk9SRV9DQVNFIF06IC8qIHRyaW0gc3BlY2lmaWNhdGlvbiAqLworeworCTwgTEVBRElORzogIkxFQURJTkciID4KKwl8CTwgVFJBSUxJTkc6ICJUUkFJTElORyIgPgorCXwJPCBCT1RIOiAiQk9USCIgPgorfQorCisKK1RPS0VOIFsgSUdOT1JFX0NBU0UgXTogLyogZnVuY3Rpb25zIHJldHVybmluZyBudW1lcmljcyAqLworeworCTwgTEVOR1RIOiAiTEVOR1RIIiA+CisJfAk8IExPQ0FURTogIkxPQ0FURSIgPgorCXwJPCBBQlM6ICJBQlMiID4KKwl8CTwgU1FSVDogIlNRUlQiID4KKwl8CTwgTU9EOiAiTU9EIiA+CisJfAk8IFNJWkU6ICJTSVpFIiA+Cit9CisKKworVE9LRU4gWyBJR05PUkVfQ0FTRSBdOiAvKiBmdW5jdGlvbnMgcmV0dXJuaW5nIGRhdGV0aW1lICovCit7CisJPCBDVVJSRU5UX0RBVEU6ICJDVVJSRU5UX0RBVEUiID4KKwl8CTwgQ1VSUkVOVF9USU1FOiAiQ1VSUkVOVF9USU1FIiA+CisJfAk8IENVUlJFTlRfVElNRVNUQU1QOiAiQ1VSUkVOVF9USU1FU1RBTVAiID4KK30KKworVE9LRU4gWyBJR05PUkVfQ0FTRSBdOiAvKiB0eXBlIG9mIHF1ZXJ5ICovCit7CisJPCBTRUxFQ1Q6ICJTRUxFQ1QiID4KKwl8CTwgRElTVElOQ1Q6ICJESVNUSU5DVCIgPgorCXwJPCBGUk9NOiAiRlJPTSIgPgorCisJfAk8IFVQREFURTogIlVQREFURSIgPgorCXwJPCBERUxFVEU6ICJERUxFVEUiID4KKworCXwJPCBXSEVSRTogIldIRVJFIiA+CisJfAk8IEdST1VQOiAiR1JPVVAiID4KKwl8CTwgSEFWSU5HOiAiSEFWSU5HIiA+CisKKwl8CTwgQVM6ICJBUyIgPgorCXwJPCBMRUZUOiAiTEVGVCIgPgorCXwJPCBPVVRFUjogIk9VVEVSIiA+CisJfAk8IElOTkVSOiAiSU5ORVIiID4KKwl8CTwgSk9JTjogIkpPSU4iID4KKwl8CTwgRkVUQ0g6ICJGRVRDSCIgPgorCXwJPCBJTjogIklOIiA+CisJfAk8IFNFVDogIlNFVCIgPgorCisJfAk8IE9CSkVDVDogIk9CSkVDVCIgPgorfQorCisKKy8qIGluc3BpcmVkIGJ5IHRoZSBKYXZhIDEuMC4yIHNwZWNpZmljYXRpb24gKi8KKy8qICMjIyBzaG91bGQgd2UgbGltaXQgdGhpcyB0byB0aGUgbGVuZ3RoIHRoYXQgaXMgdmFsaWQgaW4gamF2YT8gKi8KK1RPS0VOIDogLyogbGl0ZXJhbHMgKi8KK3sKKwk8IElOVEVHRVJfTElURVJBTDogKChbIjAiLSI5Il0pKykgKFsibCIsIkwiXSk/ID4KKwl8IDwgREVDSU1BTF9MSVRFUkFMOgorCQkoKChbIjAiLSI5Il0pKiAiLiIgKFsiMCItIjkiXSkrKSAoPEVYUE9ORU5UPik/IChbImYiLCJGIiwiZCIsIkQiXSk/CisJCXwgKChbIjAiLSI5Il0pKyAiLiIpICg8RVhQT05FTlQ+KT8gKFsiZiIsIkYiLCJkIiwiRCJdKT8KKwkJfCAoKFsiMCItIjkiXSkrKSAoPEVYUE9ORU5UPikgKFsiZiIsIkYiLCJkIiwiRCJdKT8KKwkJfCAoKFsiMCItIjkiXSkrKSAoPEVYUE9ORU5UPik/IChbImYiLCJGIiwiZCIsIkQiXSk/KSA+CisJfCA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPgorCXwgPCBTVFJJTkdfTElURVJBTDogIiciCisJICAoKCInJyIgfCB+WyInIl0pCisJCS8qCisJICAoKCInJyIgfCB+WyInIiwiXFwiLCJcbiIsIlxyIl0pCisJCXwgKCJcXCIKKwkJCSggWyJuIiwidCIsImIiLCJyIiwiZiIsIlxcIiwiJyJdCisJCQl8IFsiMCItIjciXSAoIFsiMCItIjciXSApPworCQkJfCBbIjAiLSIzIl0gWyIwIi0iNyJdIFsiMCItIjciXQorCQkJKQorCQkgICkKKwkJKi8KKwkgICkqCisJICAiJyIKKwk+CisJfCA8IENIQVJBQ1RFUl9MSVRFUkFMOiAiJyIKKwkgICggICAoflsiJyIsIlxcIiwiXG4iLCJcciJdKQorCQl8ICgiXFwiCisJCQkoIFsibiIsInQiLCJiIiwiciIsImYiLCJcXCIsIiciXQorCQkJfCBbIjAiLSI3Il0gKCBbIjAiLSI3Il0gKT8KKwkJCXwgWyIwIi0iMyJdIFsiMCItIjciXSBbIjAiLSI3Il0KKwkJCSkKKwkJICApCisJICApCisJICAiJyIKKwk+Cit9CisKK1RPS0VOIFsgSUdOT1JFX0NBU0UgXTogLyogYm9vbGVhbiBsaXRlcmFscyBjYW4gYmUgY2FzZS1pbnNlbnNpdGl2ZSAqLworeworCTwgQk9PTEVBTl9MSVRFUkFMOiAiVFJVRSIgfCAiRkFMU0UiID4KK30KKworLyogRnJvbSB0aGUgSmF2YSAxLjAuMiBzcGVjaWZpY2F0aW9uICovCitUT0tFTiA6IC8qIElERU5USUZJRVJTICovCit7CisgIDwgSURFTlRJRklFUjogPExFVFRFUj4gKDxMRVRURVI+fDxESUdJVD4pKiA+CisJfAorICA8ICNMRVRURVI6CisJICBbCisJICAgIlx1MDAyNCIsIAkJCS8vICQKKwkgICAiXHUwMDQxIi0iXHUwMDVhIiwgCS8vIEEtWgorCSAgICJcdTAwNWYiLCAJCQkvLyBfCisJICAgIlx1MDA2MSItIlx1MDA3YSIsIAkvLyBhLXoKKwkgICAiXHUwMGMwIi0iXHUwMGQ2IiwKKwkgICAiXHUwMGQ4Ii0iXHUwMGY2IiwKKwkgICAiXHUwMGY4Ii0iXHUwMGZmIiwKKwkgICAiXHUwMTAwIi0iXHUxZmZmIiwKKwkgICAiXHUzMDQwIi0iXHUzMThmIiwKKwkgICAiXHUzMzAwIi0iXHUzMzdmIiwKKwkgICAiXHUzNDAwIi0iXHUzZDJkIiwKKwkgICAiXHU0ZTAwIi0iXHU5ZmZmIiwKKwkgICAiXHVmOTAwIi0iXHVmYWZmIgorCSAgXQorICA+CisJfAorICA8ICNESUdJVDoKKwkgIFsKKwkgICAiXHUwMDMwIi0iXHUwMDM5IiwgCS8vIDAtOQorCSAgICJcdTA2NjAiLSJcdTA2NjkiLAorCSAgICJcdTA2ZjAiLSJcdTA2ZjkiLAorCSAgICJcdTA5NjYiLSJcdTA5NmYiLAorCSAgICJcdTA5ZTYiLSJcdTA5ZWYiLAorCSAgICJcdTBhNjYiLSJcdTBhNmYiLAorCSAgICJcdTBhZTYiLSJcdTBhZWYiLAorCSAgICJcdTBiNjYiLSJcdTBiNmYiLAorCSAgICJcdTBiZTciLSJcdTBiZWYiLAorCSAgICJcdTBjNjYiLSJcdTBjNmYiLAorCSAgICJcdTBjZTYiLSJcdTBjZWYiLAorCSAgICJcdTBkNjYiLSJcdTBkNmYiLAorCSAgICJcdTBlNTAiLSJcdTBlNTkiLAorCSAgICJcdTBlZDAiLSJcdTBlZDkiLAorCSAgICJcdTEwNDAiLSJcdTEwNDkiCisJICBdCisgID4KK30KKworCitOb2RlIHBhcnNlUXVlcnkoKSA6IHsgfQoreworCShzZWxlY3Rfc3RhdGVtZW50KCkgfCB1cGRhdGVfc3RhdGVtZW50KCkgfCBkZWxldGVfc3RhdGVtZW50KCkpIDxFT0Y+CisJeworCQlyZXR1cm4gamp0cmVlLnJvb3ROb2RlKCk7CisJfQorfQorCisKK3ZvaWQgc2VsZWN0X3N0YXRlbWVudCgpICNTRUxFQ1QgOiB7IH0KK3sKKwlzZWxlY3RfY2xhdXNlKCkKKwkJZnJvbV9jbGF1c2UoKQorCQlbd2hlcmVfY2xhdXNlKCldCisJCVtncm91cGJ5X2NsYXVzZSgpXQorCQlbaGF2aW5nX2NsYXVzZSgpXQorCQlbb3JkZXJieV9jbGF1c2UoKV0KK30KKworCit2b2lkIHVwZGF0ZV9zdGF0ZW1lbnQoKSAjVVBEQVRFIDogeyB9Cit7CisJdXBkYXRlX2NsYXVzZSgpIFsgd2hlcmVfY2xhdXNlKCkgXQorfQorCisKK3ZvaWQgZGVsZXRlX3N0YXRlbWVudCgpICNERUxFVEUgOiB7IH0KK3sKKwk8REVMRVRFPiA8RlJPTT4gKGZyb21faXRlbSgpICNGUk9NKSBbd2hlcmVfY2xhdXNlKCldCit9CisKKwordm9pZCBmcm9tX2NsYXVzZSgpICNGUk9NIDogeyB9Cit7CisJPEZST00+IGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uKCkKKwkoTE9PS0FIRUFEKDEpIDxDT01NQT4gKExPT0tBSEVBRChjb2xsZWN0aW9uX21lbWJlcl9kZWNsYXJhdGlvbigpKSBjb2xsZWN0aW9uX21lbWJlcl9kZWNsYXJhdGlvbigpIHwgTE9PS0FIRUFEKGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uKCkpaWRlbnRpZmljYXRpb25fdmFyaWFibGVfZGVjbGFyYXRpb24oKSkpKgorfQorCisKK3ZvaWQgaWRlbnRpZmljYXRpb25fdmFyaWFibGVfZGVjbGFyYXRpb24oKTogeyB9Cit7CisJZnJvbV9pdGVtKCkgKExPT0tBSEVBRChmZXRjaF9qb2luKCkpIGZldGNoX2pvaW4oKSB8IExPT0tBSEVBRChpbm5lcl9qb2luKCkpIGlubmVyX2pvaW4oKSB8IExPT0tBSEVBRChvdXRlcl9qb2luKCkpIG91dGVyX2pvaW4oKSkqCit9CisKKwordm9pZCBmcm9tX2l0ZW0oKSAjRlJPTUlURU0gOiB7IH0KK3sKKwlhYnN0cmFjdF9zY2hlbWFfbmFtZSgpIFtMT09LQUhFQUQoMSk8QVM+XSBbTE9PS0FIRUFEKGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkpaWRlbnRpZmljYXRpb25fdmFyaWFibGUoKV0KK30KKworCit2b2lkIHN1YnF1ZXJ5X2Zyb21fY2xhdXNlKCkgI0ZST00gOiB7IH0KK3sKKwk8RlJPTT4gc3VicXVlcnlfZnJvbV9pdGVtKCkKKwkJKCBMT09LQUhFQUQoMSkgPENPTU1BPiBzdWJxdWVyeV9mcm9tX2l0ZW0oKSApKgorfQorCit2b2lkIHN1YnF1ZXJ5X2Zyb21faXRlbSgpIDogeyB9Cit7CisgICAgICAgIExPT0tBSEVBRChjb2xsZWN0aW9uX21lbWJlcl9kZWNsYXJhdGlvbigpKSBjb2xsZWN0aW9uX21lbWJlcl9kZWNsYXJhdGlvbigpCisJfCBMT09LQUhFQUQoaWRlbnRpZmljYXRpb25fdmFyaWFibGVfZGVjbGFyYXRpb24oKSkgaWRlbnRpZmljYXRpb25fdmFyaWFibGVfZGVjbGFyYXRpb24oKQorfQorCit2b2lkIGlubmVyX2pvaW4oKSAjSU5ORVJKT0lOIDogeyB9Cit7CisJWzxJTk5FUj5dIDxKT0lOPiBwYXRoKCkgWzxBUz5dIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkKK30KKworCit2b2lkIGNvbGxlY3Rpb25fbWVtYmVyX2RlY2xhcmF0aW9uKCkgI0lOTkVSSk9JTiA6IHsgfQoreworCS8vIHN5bm9ueW1vdXMgd2l0aCAiSU5ORVIgSk9JTiBwYXRoIEFTIGlkZW50aWZpZXIiIChJbm5lckpvaW4pCisJPElOPiAiKCIgcGF0aCgpICIpIiBbIExPT0tBSEVBRCgxKTxBUz5dIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkKK30KKwordm9pZCBvdXRlcl9qb2luKCkgI09VVEVSSk9JTiA6IHsgfQoreworCTxMRUZUPiBbIDxPVVRFUj5dIDxKT0lOPiBwYXRoKCkgWyBMT09LQUhFQUQoMSk8QVM+XSBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSgpCit9CisKKwordm9pZCBmZXRjaF9qb2luKCkgOiB7IH0KK3sKKwlvdXRlcl9mZXRjaF9qb2luKCkgfCBpbm5lcl9mZXRjaF9qb2luKCkKK30KKworCit2b2lkIG91dGVyX2ZldGNoX2pvaW4oKSAjT1VURVJGRVRDSEpPSU4gOiB7IH0KK3sKKwk8TEVGVD4gWzxPVVRFUj5dIDxKT0lOPiA8RkVUQ0g+IHBhdGgoKQorfQorCisKK3ZvaWQgaW5uZXJfZmV0Y2hfam9pbigpICNJTk5FUkZFVENISk9JTiA6IHsgfQoreworCVs8SU5ORVI+XSA8Sk9JTj4gPEZFVENIPiBwYXRoKCkKK30KKworCit2b2lkIHBhdGgoKSAjUEFUSCA6IHsgfQoreworCS8vIGEgcGF0aCBpcyBhbnkgZG90LXNlcGFyYXRlZCBwYXRoIGV4cHJlc3Npb24gc3RhcnRpbmcgd2l0aCBhCisJLy8gbm9uLXJlc2VydmVkIHdvcmQKKwlpZGVudGlmaWNhdGlvbl92YXJpYWJsZSgpICg8RE9UPiBwYXRoX2NvbXBvbmVudCgpKSsKK30KKworCit2b2lkIHVwZGF0ZV9jbGF1c2UoKSA6IHsgfQoreworCTxVUERBVEU+IGZyb21faXRlbSgpICNGUk9NIHNldF9jbGF1c2UoKQorfQorCisKK3ZvaWQgc2V0X2NsYXVzZSgpIDogeyB9Cit7CisJPFNFVD4gdXBkYXRlX2l0ZW0oKSAoPENPTU1BPiB1cGRhdGVfaXRlbSgpKSoKK30KKworCit2b2lkIHVwZGF0ZV9pdGVtKCkgI1VQREFURUlURU0gOiB7IH0KK3sKKwl1cGRhdGVfZmllbGQoKSBFUSgpIG5ld192YWx1ZSgpCit9CisKKwordm9pZCB1cGRhdGVfZmllbGQoKSAjVVBEQVRFRklFTEQgOiB7IH0KK3sKKwkvLyBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSgpICg8RE9UPiBwYXRoX2NvbXBvbmVudCgpKSsKKwlbTE9PS0FIRUFEKDEpIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkgPERPVD5dIHBhdGhfY29tcG9uZW50KCkKK30KKworCit2b2lkIG5ld192YWx1ZSgpICNVUERBVEVWQUxVRSA6IHsgfQoreworCUxPT0tBSEVBRChhcml0aG1ldGljX2V4cHJlc3Npb24oKSkgYXJpdGhtZXRpY19leHByZXNzaW9uKCkgfAorCUxPT0tBSEVBRChzdHJpbmdfcHJpbWFyeSgpKSBzdHJpbmdfcHJpbWFyeSgpIHwKKwlMT09LQUhFQUQoZGF0ZXRpbWVfcHJpbWFyeSgpKSBkYXRldGltZV9wcmltYXJ5KCkgfAorCUxPT0tBSEVBRChib29sZWFuX3ByaW1hcnkoKSkgYm9vbGVhbl9wcmltYXJ5KCkgfAorCUxPT0tBSEVBRChlbnVtX3ByaW1hcnkoKSkgZW51bV9wcmltYXJ5KCkgfAorCUxPT0tBSEVBRChzaW1wbGVfZW50aXR5X2V4cHJlc3Npb24oKSkgc2ltcGxlX2VudGl0eV9leHByZXNzaW9uKCkgfAorCTxOVUxMPgorfQorCisKK3ZvaWQgc2ltcGxlX2VudGl0eV9leHByZXNzaW9uKCkgOiB7IH0KK3sKKwlpZGVudGlmaWNhdGlvbl92YXJpYWJsZSgpIHwgaW5wdXRfcGFyYW1ldGVyKCkKK30KKworCit2b2lkIHNlbGVjdF9jbGF1c2UoKSAjU0VMRUNUQ0xBVVNFIDogeyB9Cit7CisJPFNFTEVDVD4gW2Rpc3RpbmN0KCldIHNlbGVjdF9leHByZXNzaW9ucygpCit9CisKKwordm9pZCBzaW1wbGVfc2VsZWN0X2NsYXVzZSgpICNTRUxFQ1RDTEFVU0UgOiB7IH0KK3sKKwk8U0VMRUNUPiBbZGlzdGluY3QoKV0gc3Vic2VsZWN0X2V4cHJlc3Npb25zKCkgCit9CisKKwordm9pZCBzZWxlY3RfZXhwcmVzc2lvbnMoKSAjU0VMRUNURVhQUkVTU0lPTlMgOiB7IH0KK3sKKwlzZWxlY3RfZXhwcmVzc2lvbigpICg8Q09NTUE+IHNlbGVjdF9leHByZXNzaW9uKCkpKgorfQorCisKK3ZvaWQgc2VsZWN0X2V4cHJlc3Npb24oKSAjU0VMRUNURVhQUkVTU0lPTiA6IHsgfQoreworCWFnZ3JlZ2F0ZV9zZWxlY3RfZXhwcmVzc2lvbigpCisJCXwgTE9PS0FIRUFEKHBhdGgoKSkgcGF0aCgpCisJCXwgaWRlbnRpZmljYXRpb25fdmFyaWFibGUoKQorCQl8ICg8T0JKRUNUPiAiKCIgaWRlbnRpZmljYXRpb25fdmFyaWFibGUoKSAiKSIpCisJCXwgY29uc3RydWN0b3JfZXhwcmVzc2lvbigpCit9CisKKwordm9pZCBzdWJzZWxlY3RfZXhwcmVzc2lvbnMoKSAjU0VMRUNURVhQUkVTU0lPTlMgOiB7IH0KK3sKKwlzdWJzZWxlY3RfZXhwcmVzc2lvbigpICg8Q09NTUE+IHN1YnNlbGVjdF9leHByZXNzaW9uKCkpKgorfQorCit2b2lkIHN1YnNlbGVjdF9leHByZXNzaW9uKCkgI1NFTEVDVEVYUFJFU1NJT04gOiB7IH0KK3sKKwlMT09LQUhFQUQocGF0aCgpKSBwYXRoKCkgCisJCXwgYWdncmVnYXRlX3NlbGVjdF9leHByZXNzaW9uKCkKKwkJfCBMT09LQUhFQUQoMSkgaWRlbnRpZmljYXRpb25fdmFyaWFibGUoKQorCit9CisKKwordm9pZCBjb25zdHJ1Y3Rvcl9leHByZXNzaW9uKCkgI0NPTlNUUlVDVE9SIDogeyB9Cit7CisJPE5FVz4gY2xhc3NuYW1lKCkgY29uc3RydWN0b3JfcGFyYW1ldGVycygpCit9CisKKwordm9pZCBjbGFzc25hbWUoKSAjQ0xBU1NOQU1FIDoKK3sgVG9rZW4gdDsgfQoreworCWlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkgKDxET1Q+IGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkpKgorfQorCisKK3ZvaWQgY29uc3RydWN0b3JfcGFyYW1ldGVycygpICNDT05TVFJVQ1RPUlBBUkFNUyA6IHsgfQoreworCSIoIiAoY29uc3RydWN0b3JfcGFyYW1ldGVyKCkpICg8Q09NTUE+IChjb25zdHJ1Y3Rvcl9wYXJhbWV0ZXIoKSkpKiAiKSIgCit9CisKKwordm9pZCBjb25zdHJ1Y3Rvcl9wYXJhbWV0ZXIoKSAjQ09OU1RSVUNUT1JQQVJBTSA6IHsgfQoreworCShwYXRoKCkgfCBhZ2dyZWdhdGVfc2VsZWN0X2V4cHJlc3Npb24oKSkKK30KKworCisvKiByZXdyaXR0ZW4gdG8gcmVkdWNlIGxvb2thaGVhZHMgKi8KK3ZvaWQgYWdncmVnYXRlX3NlbGVjdF9leHByZXNzaW9uKCkgI0FHR1JFR0FURSA6IHsgfQoreworCShhdmcoKSB8IG1heCgpIHwgbWluKCkgfCBzdW0oKSB8IGNvdW50KCkpCit9CisKKwordm9pZCBkaXN0aW5jdCgpICNESVNUSU5DVCA6IHsgfQoreworCTxESVNUSU5DVD4KK30KKworCit2b2lkIGFnZ3JlZ2F0ZV9wYXRoKCkgOiB7IH0KK3sKKwkiKCIgKAorCQlMT09LQUhFQUQoYXJpdGhtZXRpY19leHByZXNzaW9uKCkpIGFyaXRobWV0aWNfZXhwcmVzc2lvbigpIHwKKwkJTE9PS0FIRUFEKGRpc3RpbmN0X3BhdGgoKSkgZGlzdGluY3RfcGF0aCgpIHwKKwkJTE9PS0FIRUFEKHBhdGgoKSkgcGF0aCgpIHwKKwkJTE9PS0FIRUFEKGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkpIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkKKwkpICIpIgorfQorCisKK3ZvaWQgZGlzdGluY3RfcGF0aCgpICNESVNUSU5DVFBBVEggOiB7IH0KK3sKKwk8RElTVElOQ1Q+IChMT09LQUhFQUQocGF0aCgpKSBwYXRoKCkgfCBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSgpKQorfQorCisKK3ZvaWQgY291bnQoKSAjQ09VTlQgOiB7IH0KK3sKKwk8Q09VTlQ+IGFnZ3JlZ2F0ZV9wYXRoKCkKK30KKworCit2b2lkIGF2ZygpICNBVkVSQUdFIDogeyB9Cit7CisJPEFWRz4gYWdncmVnYXRlX3BhdGgoKQorfQorCisKK3ZvaWQgbWF4KCkgI01BWCA6IHsgfQoreworCTxNQVg+IGFnZ3JlZ2F0ZV9wYXRoKCkKK30KKworCit2b2lkIG1pbigpICNNSU4gOiB7IH0KK3sKKwk8TUlOPiBhZ2dyZWdhdGVfcGF0aCgpCit9CisKKwordm9pZCBzdW0oKSAjU1VNIDogeyB9Cit7CisJPFNVTT4gYWdncmVnYXRlX3BhdGgoKQorfQorCisKK3ZvaWQgd2hlcmVfY2xhdXNlKCkgI1dIRVJFIDogeyB9Cit7CisJPFdIRVJFPiBjb25kaXRpb25hbF9leHByZXNzaW9uKCkgCit9CisKKwordm9pZCBncm91cGJ5X2NsYXVzZSgpICNHUk9VUEJZIDogeyB9Cit7CisJPEdST1VQPiA8Qlk+IGdyb3VwYnlfaXRlbSgpCisJCShMT09LQUhFQUQoMikgPENPTU1BPiAoZ3JvdXBieV9pdGVtKCkpKSogCit9CisKKwordm9pZCBncm91cGJ5X2l0ZW0oKSA6IHsgfQoreworCUxPT0tBSEVBRChwYXRoKCkpIHBhdGgoKSB8IGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKCkKK30KKworCit2b2lkIGhhdmluZ19jbGF1c2UoKSAjSEFWSU5HIDogeyB9Cit7CisJPEhBVklORz4gY29uZGl0aW9uYWxfZXhwcmVzc2lvbigpIAorfQorCisKK3ZvaWQgc3VicXVlcnkoKSAjU1VCU0VMRUNUIDogeyB9Cit7CisJc2ltcGxlX3NlbGVjdF9jbGF1c2UoKQorCQlzdWJxdWVyeV9mcm9tX2NsYXVzZSgpIAorCQlbTE9PS0FIRUFEKHdoZXJlX2NsYXVzZSgpKSB3aGVyZV9jbGF1c2UoKV0gCisJCVtMT09LQUhFQUQoZ3JvdXBieV9jbGF1c2UoKSkgZ3JvdXBieV9jbGF1c2UoKV0gCisJCVtMT09LQUhFQUQoaGF2aW5nX2NsYXVzZSgpKSBoYXZpbmdfY2xhdXNlKCldIAorfQorCisKKy8qIGNoYW5nZWQgdG8gZWxpbWluYXRlIGxlZnQgcmVjdXJzaW9uICovCit2b2lkIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24oKSA6IHsgfQoreworCWNvbmRpdGlvbmFsX3Rlcm0oKSAoTE9PS0FIRUFEKDIpIDxPUj4gKGNvbmRpdGlvbmFsX2V4cHJlc3Npb24oKSAjT1IoMikpKSoKK30KKworCisvKiBjaGFuZ2VkIHRvIGVsaW1pbmF0ZSBsZWZ0IHJlY3Vyc2lvbiAqLwordm9pZCBjb25kaXRpb25hbF90ZXJtKCkgOiB7IH0KK3sKKwljb25kaXRpb25hbF9mYWN0b3IoKSAoTE9PS0FIRUFEKDIpIDxBTkQ+IChjb25kaXRpb25hbF90ZXJtKCkgI0FORCgyKSkpKgorfQorCisKK3ZvaWQgY29uZGl0aW9uYWxfZmFjdG9yKCkgOiB7IH0KK3sKKwlMT09LQUhFQUQoPE5PVD4gY29uZGl0aW9uYWxfcHJpbWFyeSgpKQorCSg8Tk9UPiBjb25kaXRpb25hbF9wcmltYXJ5KCkgI05PVCkgfCBjb25kaXRpb25hbF9wcmltYXJ5KCkKK30KKworCit2b2lkIGNvbmRpdGlvbmFsX3ByaW1hcnkoKSA6IHsgfQoreworCUxPT0tBSEVBRChzaW1wbGVfY29uZF9leHByZXNzaW9uKCkpCisJc2ltcGxlX2NvbmRfZXhwcmVzc2lvbigpIHwgIigiIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24oKSAiKSIgCit9CisKKwordm9pZCBzaW1wbGVfY29uZF9leHByZXNzaW9uKCkgOiB7IH0KK3sKKwkvL0xPT0tBSEVBRChhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgYWxsX29yX2FueV9leHByZXNzaW9uKCkgfAorCUxPT0tBSEVBRChleGlzdHNfZXhwcmVzc2lvbigpKSBleGlzdHNfZXhwcmVzc2lvbigpIHwKKwlMT09LQUhFQUQoY29tcGFyaXNvbl9leHByZXNzaW9uKCkpIGNvbXBhcmlzb25fZXhwcmVzc2lvbigpIHwgCisJTE9PS0FIRUFEKGJldHdlZW5fZXhwcmVzc2lvbigpKSBiZXR3ZWVuX2V4cHJlc3Npb24oKSB8IAorCUxPT0tBSEVBRChsaWtlX2V4cHJlc3Npb24oKSkgbGlrZV9leHByZXNzaW9uKCkgfCAKKwlMT09LQUhFQUQoaW5fZXhwcmVzc2lvbigpKSBpbl9leHByZXNzaW9uKCkgfCAKKwlMT09LQUhFQUQobnVsbF9jb21wYXJpc29uX2V4cHJlc3Npb24oKSkgbnVsbF9jb21wYXJpc29uX2V4cHJlc3Npb24oKSB8IAorCUxPT0tBSEVBRChlbXB0eV9jb2xsZWN0aW9uX2NvbXBhcmlzb25fZXhwcmVzc2lvbigpKSBlbXB0eV9jb2xsZWN0aW9uX2NvbXBhcmlzb25fZXhwcmVzc2lvbigpIHwgCisJTE9PS0FIRUFEKGNvbGxlY3Rpb25fbWVtYmVyX2V4cHJlc3Npb24oKSkgY29sbGVjdGlvbl9tZW1iZXJfZXhwcmVzc2lvbigpCit9CisKKwordm9pZCBiZXR3ZWVuX2V4cHJlc3Npb24oKSAjQkVUV0VFTiA6IHsgfQoreworCUxPT0tBSEVBRCg2KSBhcml0aG1ldGljX2V4cHJlc3Npb24oKQorCQlbPE5PVD4geyBqanRUaGlzLm5vdCA9IHRydWU7IH1dIDxCRVRXRUVOPiBhcml0aG1ldGljX2V4cHJlc3Npb24oKQorCQk8QU5EPiBhcml0aG1ldGljX2V4cHJlc3Npb24oKQorCXwgTE9PS0FIRUFEKDYpIHN0cmluZ19leHByZXNzaW9uKCkKKwkJWzxOT1Q+IHsgamp0VGhpcy5ub3QgPSB0cnVlOyB9XSA8QkVUV0VFTj4gc3RyaW5nX2V4cHJlc3Npb24oKSA8QU5EPiBzdHJpbmdfZXhwcmVzc2lvbigpCisJfCBMT09LQUhFQUQoNikgZGF0ZXRpbWVfZXhwcmVzc2lvbigpCisJCVs8Tk9UPiB7IGpqdFRoaXMubm90ID0gdHJ1ZTsgfV0gPEJFVFdFRU4+IGRhdGV0aW1lX2V4cHJlc3Npb24oKSA8QU5EPiBkYXRldGltZV9leHByZXNzaW9uKCkKK30KKworCit2b2lkIGluX2V4cHJlc3Npb24oKSAjSU4gOiB7IH0KK3sKKwlwYXRoKCkgWyBMT09LQUhFQUQoMSkgPE5PVD4geyBqanRUaGlzLm5vdCA9IHRydWU7IH1dIDxJTj4KKwkJIigiIChsaXRlcmFsX29yX3BhcmFtKCkKKwkJCSg8Q09NTUE+IChsaXRlcmFsX29yX3BhcmFtKCkpKSogfCBzdWJxdWVyeSgpKQorCQkiKSIgCit9CisKKwordm9pZCBsaXRlcmFsX29yX3BhcmFtKCkgOiB7IH0KK3sKKwkobnVtZXJpY19saXRlcmFsKCkKKwl8IHN0cmluZ19saXRlcmFsKCkKKwl8IGJvb2xlYW5fbGl0ZXJhbCgpCisJfCBpbnB1dF9wYXJhbWV0ZXIoKSkKK30KKworCit2b2lkIGxpa2VfZXhwcmVzc2lvbigpICNMSUtFIDogeyB9Cit7CisJc3RyaW5nX2V4cHJlc3Npb24oKSBbPE5PVD4geyBqanRUaGlzLm5vdCA9IHRydWU7IH1dIDxMSUtFPiBwYXR0ZXJuX3ZhbHVlKCkgCit9CisKKwordm9pZCBudWxsX2NvbXBhcmlzb25fZXhwcmVzc2lvbigpICNJU05VTEwgOiB7IH0KK3sKKwkoaW5wdXRfcGFyYW1ldGVyKCkgfCBwYXRoKCkpCisJPElTPiBbPE5PVD4geyBqanRUaGlzLm5vdCA9IHRydWU7IH1dIDxOVUxMPiAKK30KKworCit2b2lkIGVtcHR5X2NvbGxlY3Rpb25fY29tcGFyaXNvbl9leHByZXNzaW9uKCkgI0lTRU1QVFkgOiB7IH0KK3sKKwlwYXRoKCkgPElTPiBbPE5PVD4geyBqanRUaGlzLm5vdCA9IHRydWU7IH1dIDxFTVBUWT4gCit9CisKKwordm9pZCBjb2xsZWN0aW9uX21lbWJlcl9leHByZXNzaW9uKCkgI01FTUJFUk9GIDogeyB9Cit7CisJKExPT0tBSEVBRChwYXRoKCkpIHBhdGgoKSB8IGlucHV0X3BhcmFtZXRlcigpIHwgcGF0aF9jb21wb25lbnQoKSkgCisJWzxOT1Q+IHsgamp0VGhpcy5ub3QgPSB0cnVlOyB9XSA8TUVNQkVSPiBbPE9GPl0gcGF0aCgpCit9CisKKwordm9pZCBleGlzdHNfZXhwcmVzc2lvbigpICNFWElTVFMgOiB7IH0KK3sKKwlbPE5PVD4geyBqanRUaGlzLm5vdCA9IHRydWU7IH1dIDxFWElTVFM+ICIoIiBzdWJxdWVyeSgpICIpIiAKK30KKworCit2b2lkIGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpIDogeyB9Cit7CisJYW55X2V4cHJlc3Npb24oKSB8IHNvbWVfZXhwcmVzc2lvbigpIHwgYWxsX2V4cHJlc3Npb24oKQorfQorCisKK3ZvaWQgYW55X2V4cHJlc3Npb24oKSAjQU5ZIDogeyB9Cit7CisJPEFOWT4gIigiIHN1YnF1ZXJ5KCkgIikiIAorfQorCisKK3ZvaWQgc29tZV9leHByZXNzaW9uKCkgI0FOWSA6IHsgfQoreworCS8vIFNPTUUgYW5kIEFOWSBhcmUgc3lub255bW91cworCTxTT01FPiAiKCIgc3VicXVlcnkoKSAiKSIgCit9CisKKwordm9pZCBhbGxfZXhwcmVzc2lvbigpICNBTEwgOiB7IH0KK3sKKwk8QUxMPiAiKCIgc3VicXVlcnkoKSAiKSIgCit9CisKKwordm9pZCBjb21wYXJpc29uX2V4cHJlc3Npb24oKSA6IHsgfQoreworCS8vIGNvbXBhcmlzb25fZXhwcmVzc2lvbiA6Oj0gc3RyaW5nX3ZhbHVlIGNvbXBhcmlzb25fb3BlcmF0b3Ige3N0cmluZ19leHByZXNzaW9uIHwgYWxsX29yX2FueV9leHByZXNzaW9ufSB8IGJvb2xlYW5fdmFsdWUgeyA9fDw+fSB7Ym9vbGVhbl9leHByZXNzaW9uIHwgYWxsX29yX2FueV9leHByZXNzaW9ufSB8IGRhdGV0aW1lX3ByaW1hcnkgY29tcGFyaXNvbl9vcGVyYXRvciB7ZGF0ZXRpbWVfZXhwcmVzc2lvbiB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbn0gfCBlbnRpdHlfYmVhbl92YWx1ZSB7ID0gfCA8PiB9IHtlbnRpdHlfYmVhbl9leHByZXNzaW9uIHwgYWxsX29yX2FueV9leHByZXNzaW9ufSB8IGFyaXRobWV0aWNfdmFsdWUgY29tcGFyaXNvbl9vcGVyYXRvciB7YXJpdGhtZXRpY19leHByZXNzaW9uIHwgYWxsX29yX2FueV9leHByZXNzaW9uCisKKwlMT09LQUhFQUQoYXJpdGhtZXRpY19jb21wKCkpIGFyaXRobWV0aWNfY29tcCgpIHwKKwlMT09LQUhFQUQoc3RyaW5nX2NvbXAoKSkgc3RyaW5nX2NvbXAoKSB8CisJTE9PS0FIRUFEKGJvb2xlYW5fY29tcCgpKSBib29sZWFuX2NvbXAoKSB8IAorCUxPT0tBSEVBRChlbnVtX2NvbXAoKSkgZW51bV9jb21wKCkgfCAKKwlMT09LQUhFQUQoZGF0ZXRpbWVfY29tcCgpKSBkYXRldGltZV9jb21wKCkgfAorCUxPT0tBSEVBRChlbnRpdHlfY29tcCgpKSBlbnRpdHlfY29tcCgpCit9CisKKwordm9pZCBzdHJpbmdfY29tcCgpIDogeyB9Cit7CisJc3RyaW5nX2V4cHJlc3Npb24oKSAoCisJCSg8RVE+IChzdHJpbmdfZXhwcmVzc2lvbigpfGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjRVFVQUxTKDIpKQorCQl8ICg8TkU+IChzdHJpbmdfZXhwcmVzc2lvbigpfGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjTk9URVFVQUxTKDIpKQorCQl8ICg8R1Q+IChzdHJpbmdfZXhwcmVzc2lvbigpIHwgYWxsX29yX2FueV9leHByZXNzaW9uKCkpICNHUkVBVEVSVEhBTigyKSkKKwkJfCAoPEdFPiAoc3RyaW5nX2V4cHJlc3Npb24oKSB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjR1JFQVRFUk9SRVFVQUwoMikpCisJCXwgKDxMVD4gKHN0cmluZ19leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI0xFU1NUSEFOKDIpKQorCQl8ICg8TEU+IChzdHJpbmdfZXhwcmVzc2lvbigpIHwgYWxsX29yX2FueV9leHByZXNzaW9uKCkpICNMRVNTT1JFUVVBTCgyKSkKKwkJKQorfQorCisKK3ZvaWQgYm9vbGVhbl9jb21wKCkgOiB7IH0KK3sKKwlib29sZWFuX2V4cHJlc3Npb24oKSAoCisJKDxFUT4gKGJvb2xlYW5fZXhwcmVzc2lvbigpIHwgYWxsX29yX2FueV9leHByZXNzaW9uKCkpICNFUVVBTFMoMikpCisJfCAoPE5FPiAoYm9vbGVhbl9leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI05PVEVRVUFMUygyKSkKKwkpCit9CisKK3ZvaWQgZW51bV9jb21wKCkgOiB7IH0KK3sKKwllbnVtX2V4cHJlc3Npb24oKSAoCisJKDxFUT4gKGVudW1fZXhwcmVzc2lvbigpIHwgYWxsX29yX2FueV9leHByZXNzaW9uKCkpICNFUVVBTFMoMikpCisJfCAoPE5FPiAoZW51bV9leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI05PVEVRVUFMUygyKSkKKwkpCit9CisKK3ZvaWQgZW50aXR5X2NvbXAoKSA6IHsgfQoreworCWVudGl0eV9iZWFuX2V4cHJlc3Npb24oKSAoCisJKDxFUT4gKChMT09LQUhFQUQoYWxsX29yX2FueV9leHByZXNzaW9uKCkpIGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpIHwgZW50aXR5X2JlYW5fZXhwcmVzc2lvbigpKSAjRVFVQUxTKDIpKSkKKwl8ICg8TkU+ICgoTE9PS0FIRUFEKGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSB8IGVudGl0eV9iZWFuX2V4cHJlc3Npb24oKSkgI05PVEVRVUFMUygyKSkpCisJKQorfQorCisKK3ZvaWQgYXJpdGhtZXRpY19jb21wKCkgOiB7IH0KK3sKKwkvLyBhcml0aG1ldGljX3ZhbHVlKCkgKAorCWFyaXRobWV0aWNfZXhwcmVzc2lvbigpICgKKwkoPEVRPiAoYXJpdGhtZXRpY19leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI0VRVUFMUygyKSkKKwl8ICg8R1Q+IChhcml0aG1ldGljX2V4cHJlc3Npb24oKSB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjR1JFQVRFUlRIQU4oMikpCisJfCAoPEdFPiAoYXJpdGhtZXRpY19leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI0dSRUFURVJPUkVRVUFMKDIpKQorCXwgKDxMVD4gKGFyaXRobWV0aWNfZXhwcmVzc2lvbigpIHwgYWxsX29yX2FueV9leHByZXNzaW9uKCkpICNMRVNTVEhBTigyKSkKKwl8ICg8TEU+IChhcml0aG1ldGljX2V4cHJlc3Npb24oKSB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjTEVTU09SRVFVQUwoMikpCisJfCAoPE5FPiAoYXJpdGhtZXRpY19leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI05PVEVRVUFMUygyKSkKKwkpCit9CisKKwordm9pZCBkYXRldGltZV9jb21wKCkgOiB7IH0KK3sKKwlkYXRldGltZV9leHByZXNzaW9uKCkgKAorCSg8RVE+IChkYXRldGltZV9leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI0VRVUFMUygyKSkKKwl8ICg8R1Q+IChkYXRldGltZV9leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI0dSRUFURVJUSEFOKDIpKQorCXwgKDxHRT4gKGRhdGV0aW1lX2V4cHJlc3Npb24oKSB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjR1JFQVRFUk9SRVFVQUwoMikpCisJfCAoPExUPiAoZGF0ZXRpbWVfZXhwcmVzc2lvbigpIHwgYWxsX29yX2FueV9leHByZXNzaW9uKCkpICNMRVNTVEhBTigyKSkKKwl8ICg8TEU+IChkYXRldGltZV9leHByZXNzaW9uKCkgfCBhbGxfb3JfYW55X2V4cHJlc3Npb24oKSkgI0xFU1NPUkVRVUFMKDIpKQorCXwgKDxORT4gKGRhdGV0aW1lX2V4cHJlc3Npb24oKSB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbigpKSAjTk9URVFVQUxTKDIpKQorCSkKK30KKworCit2b2lkIGFyaXRobWV0aWNfdmFsdWUoKSA6IHsgfQoreworCXBhdGgoKSB8IGZ1bmN0aW9uc19yZXR1cm5pbmdfbnVtZXJpY3MoKSB8ICIoIiBzdWJxdWVyeSgpICIpIgorfQorCisKKy8qIGNoYW5nZWQgdG8gZWxpbWluYXRlIGxlZnQgcmVjdXJzaW9uICovCit2b2lkIGFyaXRobWV0aWNfZXhwcmVzc2lvbigpIDogeyB9Cit7CisJYXJpdGhtZXRpY190ZXJtKCkKKwkJKCg8UExVUz4gYXJpdGhtZXRpY19leHByZXNzaW9uKCkgI0FERCgyKSkKKwkJfCAoPE1JTlVTPiBhcml0aG1ldGljX2V4cHJlc3Npb24oKSAjU1VCVFJBQ1QoMikpKSoKK30KKworCisvKiBjaGFuZ2VkIHRvIGVsaW1pbmF0ZSBsZWZ0IHJlY3Vyc2lvbiAqLwordm9pZCBhcml0aG1ldGljX3Rlcm0oKSA6IHsgfQoreworCWFyaXRobWV0aWNfZmFjdG9yKCkKKwkJKCg8VElNRVM+IGFyaXRobWV0aWNfdGVybSgpICNNVUxUSVBMWSgyKSkKKwkJfCAoPERJVj4gYXJpdGhtZXRpY190ZXJtKCkgI0RJVklERSgyKSkpKgorfQorCisKK3ZvaWQgYXJpdGhtZXRpY19mYWN0b3IoKSA6IHsgfQoreworCW51bWVyaWNfbGl0ZXJhbCgpIHwgCisJaW5wdXRfcGFyYW1ldGVyKCkgfCAKKwlwYXRoKCkgfAorCUxPT0tBSEVBRCgyKSAiKCIgYXJpdGhtZXRpY19leHByZXNzaW9uKCkgIikiIHwgCisJZnVuY3Rpb25zX3JldHVybmluZ19udW1lcmljcygpIHwgCisJYWdncmVnYXRlX3NlbGVjdF9leHByZXNzaW9uKCkgfAkKKwlzdWJxdWVyeSgpCit9CisKKwordm9pZCBuZWdhdGl2ZSgpICNORUdBVElWRSA6IHsgfQoreworCTxNSU5VUz4KK30KKworCit2b2lkIHN0cmluZ192YWx1ZSgpIDogeyB9Cit7CisJcGF0aCgpIHwgZnVuY3Rpb25zX3JldHVybmluZ19zdHJpbmdzKCkgfCAiKCIgc3VicXVlcnkoKSAiKSIKK30KKworCit2b2lkIHN0cmluZ19leHByZXNzaW9uKCkgOiB7IH0KK3sKKwlpbnB1dF9wYXJhbWV0ZXIoKSB8IHN0cmluZ19wcmltYXJ5KCkKK30KKworCit2b2lkIHN0cmluZ19wcmltYXJ5KCkgOiB7IH0KK3sKKwlzdHJpbmdfbGl0ZXJhbCgpIHwgcGF0aCgpIHwgTE9PS0FIRUFEKDIpICIoIiBzdHJpbmdfZXhwcmVzc2lvbigpICIpIiB8IAorCWZ1bmN0aW9uc19yZXR1cm5pbmdfc3RyaW5ncygpIHwgTE9PS0FIRUFEKDIpICAiKCIgc3VicXVlcnkoKSAiKSIKK30KKworCit2b2lkIGRhdGV0aW1lX2V4cHJlc3Npb24oKSA6IHsgfQoreworCWRhdGV0aW1lX3ByaW1hcnkoKSB8ICIoIiBzdWJxdWVyeSgpICIpIgorfQorCisKK3ZvaWQgZGF0ZXRpbWVfcHJpbWFyeSgpIDogeyB9Cit7CisJcGF0aCgpIHwgZnVuY3Rpb25zX3JldHVybmluZ19kYXRldGltZSgpIHwgaW5wdXRfcGFyYW1ldGVyKCkKK30KKworCit2b2lkIGJvb2xlYW5fdmFsdWUoKSA6IHsgfQoreworCXBhdGgoKSB8ICIoIiBzdWJxdWVyeSgpICIpIgorfQorCisKK3ZvaWQgYm9vbGVhbl9leHByZXNzaW9uKCkgOiB7IH0KK3sKKwlib29sZWFuX3ByaW1hcnkoKSB8ICIoIiBzdWJxdWVyeSgpICIpIgorfQorCisKK3ZvaWQgYm9vbGVhbl9wcmltYXJ5KCkgOiB7IH0KK3sKKwlMT09LQUhFQUQoMikgcGF0aCgpIHwgYm9vbGVhbl9saXRlcmFsKCkgfCBpbnB1dF9wYXJhbWV0ZXIoKQorfQorCisKK3ZvaWQgZW51bV9leHByZXNzaW9uKCkgOiB7IH0KK3sKKwllbnVtX3ByaW1hcnkoKSB8ICIoIiBzdWJxdWVyeSgpICIpIgorfQorCisKK3ZvaWQgZW51bV9wcmltYXJ5KCkgOiB7IH0KK3sKKwlMT09LQUhFQUQoMikgcGF0aCgpCisJfCBMT09LQUhFQUQoZW51bV9saXRlcmFsKCkpIGVudW1fbGl0ZXJhbCgpCisJfCBMT09LQUhFQUQoaW5wdXRfcGFyYW1ldGVyKCkpIGlucHV0X3BhcmFtZXRlcigpCit9CisKKwordm9pZCBlbnVtX2xpdGVyYWwoKSA6IHsgfQoreworCXBhdGgoKQorfQorCisKK3ZvaWQgZW50aXR5X2JlYW5fdmFsdWUoKSA6IHsgfQoreworCUxPT0tBSEVBRChwYXRoKCkpIHBhdGgoKSB8IHBhdGhfY29tcG9uZW50KCkKK30KKworCit2b2lkIGVudGl0eV9iZWFuX2V4cHJlc3Npb24oKSA6IHsgfQoreworCWlucHV0X3BhcmFtZXRlcigpIHwgZW50aXR5X2JlYW5fdmFsdWUoKQorfQorCisKK3ZvaWQgZnVuY3Rpb25zX3JldHVybmluZ19zdHJpbmdzKCkgOiB7IH0KK3sKKwljb25jYXQoKSB8IHN1YnN0cmluZygpIHwgdHJpbSgpIHwgbG93ZXIoKSB8IHVwcGVyKCkKK30KKworCit2b2lkIGNvbmNhdCgpICNDT05DQVQgOiB7IH0KK3sKKwk8Q09OQ0FUPiAiKCIgc3RyaW5nX2V4cHJlc3Npb24oKSA8Q09NTUE+IHN0cmluZ19leHByZXNzaW9uKCkgIikiCit9CisKKwordm9pZCBzdWJzdHJpbmcoKSAjU1VCU1RSSU5HIDogeyB9Cit7CisJPFNVQlNUUklORz4gIigiIHN0cmluZ19leHByZXNzaW9uKCkgPENPTU1BPiBhcml0aG1ldGljX2V4cHJlc3Npb24oKSA8Q09NTUE+IGFyaXRobWV0aWNfZXhwcmVzc2lvbigpICIpIgorfQorCisKK3ZvaWQgdHJpbSgpICNUUklNIDogeyB9Cit7CisJPFRSSU0+ICIoIiBbTE9PS0FIRUFEKDIpW3RyaW1fc3BlY2lmaWNhdGlvbigpXSBbdHJpbV9jaGFyYWN0ZXIoKV0gPEZST00+XQorCQlzdHJpbmdfZXhwcmVzc2lvbigpICIpIgorfQorCisKK3ZvaWQgbG93ZXIoKSAjTE9XRVIgOiB7IH0KK3sKKwk8TE9XRVI+ICIoIiBzdHJpbmdfZXhwcmVzc2lvbigpICIpIgorfQorCisKK3ZvaWQgdXBwZXIoKSAjVVBQRVIgOiB7IH0KK3sKKwk8VVBQRVI+ICIoIiBzdHJpbmdfZXhwcmVzc2lvbigpICIpIgorfQorCisKKwordm9pZCB0cmltX3NwZWNpZmljYXRpb24oKSA6IHsgfQoreworCUxPT0tBSEVBRCgyKSAoPExFQURJTkc+ICNUUklNTEVBRElORykgfCAoPFRSQUlMSU5HPiAjVFJJTVRSQUlMSU5HKSB8ICg8Qk9USD4gI1RSSU1CT1RIKQorfQorCisKK3ZvaWQgZnVuY3Rpb25zX3JldHVybmluZ19udW1lcmljcygpIDogeyB9Cit7CisJbGVuZ3RoKCkgfCBsb2NhdGUoKSB8IGFicygpIHwgc3FydCgpIHwgbW9kKCkgfCBzaXplKCkKK30KKworCit2b2lkIGxlbmd0aCgpICNMRU5HVEggOiB7IH0KK3sKKwk8TEVOR1RIPiAiKCIgc3RyaW5nX2V4cHJlc3Npb24oKSAiKSIKKworfQorCisKK3ZvaWQgbG9jYXRlKCkgI0xPQ0FURSA6IHsgfQoreworCTxMT0NBVEU+ICIoIiBzdHJpbmdfZXhwcmVzc2lvbigpIDxDT01NQT4gc3RyaW5nX2V4cHJlc3Npb24oKQorCQlbPENPTU1BPiBhcml0aG1ldGljX2V4cHJlc3Npb24oKV0gIikiCisKK30KKworCit2b2lkIGFicygpICNBQlMgOiB7IH0KK3sKKwk8QUJTPiAiKCIgYXJpdGhtZXRpY19leHByZXNzaW9uKCkgIikiCisKK30KKworCit2b2lkIHNxcnQoKSAjU1FSVCA6IHsgfQoreworCTxTUVJUPiAiKCIgYXJpdGhtZXRpY19leHByZXNzaW9uKCkgIikiCisKK30KKworCit2b2lkIG1vZCgpICNNT0QgOiB7IH0KK3sKKwk8TU9EPiAiKCIgYXJpdGhtZXRpY19leHByZXNzaW9uKCkgPENPTU1BPiBhcml0aG1ldGljX2V4cHJlc3Npb24oKSAiKSIKKworfQorCisKK3ZvaWQgc2l6ZSgpICNTSVpFIDogeyB9Cit7CisJPFNJWkU+ICIoIiBwYXRoKCkgIikiCit9CisKKwordm9pZCBmdW5jdGlvbnNfcmV0dXJuaW5nX2RhdGV0aW1lKCkgOiB7IH0KK3sKKwkoPENVUlJFTlRfREFURT4gI0NVUlJFTlREQVRFKQorCXwgKDxDVVJSRU5UX1RJTUU+ICNDVVJSRU5UVElNRSkKKwl8ICg8Q1VSUkVOVF9USU1FU1RBTVA+ICNDVVJSRU5UVElNRVNUQU1QKQorfQorCisKK3ZvaWQgb3JkZXJieV9jbGF1c2UoKSAjT1JERVJCWSA6IHsgfQoreworCTxPUkRFUj4gPEJZPiBvcmRlcmJ5X2l0ZW0oKSAoPENPTU1BPiBvcmRlcmJ5X2l0ZW0oKSkqIAorfQorCisKK3ZvaWQgb3JkZXJieV9pdGVtKCkgI09SREVSQllJVEVNIDogeyB9Cit7CisJcGF0aCgpIFsgPEFTQz4gI0FTQ0VORElORyB8IDxERVNDPiAjREVTQ0VORElORyBdCit9CisKKwordm9pZCBhYnN0cmFjdF9zY2hlbWFfbmFtZSgpICNBQlNUUkFDVFNDSEVNQU5BTUUgOiB7IH0KK3sKKwlwYXRoX2NvbXBvbmVudCgpICg8RE9UPiBwYXRoX2NvbXBvbmVudCgpKSoKK30KKworCit2b2lkIHRvaygpICNUT0sgOgoreyBUb2tlbiB0OyB9Cit7CisJdCA9IDxJREVOVElGSUVSPiB7IGpqdFRoaXMuc2V0VG9rZW4gKHQpOyB9Cit9CisKKwordm9pZCBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSgpICNJREVOVElGSUVSIDoKK3sgVG9rZW4gdDsgfQoreworCXQgPSA8SURFTlRJRklFUj4geyBqanRUaGlzLnNldFRva2VuICh0KTsgfQorfQorCisKK3ZvaWQgcGF0aF9jb21wb25lbnQoKSAjSURFTlRJRklDQVRJT05WQVJJQUJMRSA6Cit7IFRva2VuIHQ7IH0KK3sKKwkvLyB1bmxpa2UgdGhlIGlkZW50aWZpZXIoKSwgdGhlIHBhdGhfY29tcG9uZW50KCkgKmNhbiogYmUgYQorCS8vIHJlc2VydmVkIHdvcmQuIEUuZy4sIE9yZGVyLmdyb3VwLmxlbmd0aCBpcyBhIHBlcmZlY3RseQorCS8vIHZhbGlkIHBhdGggZXhwcmVzc2lvbgorCSgKKwl0ID0gPE5FVz4KKwl8IHQgPSA8QUxMPgorCXwgdCA9IDxBTlk+CisJfCB0ID0gPEVYSVNUUz4KKwl8IHQgPSA8U09NRT4KKwl8IHQgPSA8RU1QVFk+CisJfCB0ID0gPEFTQz4KKwl8IHQgPSA8REVTQz4KKwl8IHQgPSA8T1JERVI+CisJfCB0ID0gPElTPgorCXwgdCA9IDxNRU1CRVI+CisJfCB0ID0gPE9GPgorCXwgdCA9IDxMSUtFPgorCXwgdCA9IDxFU0NBUEU+CisJfCB0ID0gPEJFVFdFRU4+CisJfCB0ID0gPE5VTEw+CisJfCB0ID0gPEFWRz4KKwl8IHQgPSA8TUlOPgorCXwgdCA9IDxNQVg+CisJfCB0ID0gPFNVTT4KKwl8IHQgPSA8Q09VTlQ+CisJfCB0ID0gPE9SPgorCXwgdCA9IDxBTkQ+CisJfCB0ID0gPE5PVD4KKwl8IHQgPSA8Q09OQ0FUPgorCXwgdCA9IDxTVUJTVFJJTkc+CisJfCB0ID0gPFRSSU0+CisJfCB0ID0gPExPV0VSPgorCXwgdCA9IDxVUFBFUj4KKwl8IHQgPSA8TEVBRElORz4KKwl8IHQgPSA8VFJBSUxJTkc+CisJfCB0ID0gPEJPVEg+CisJfCB0ID0gPExFTkdUSD4KKwl8IHQgPSA8TE9DQVRFPgorCXwgdCA9IDxBQlM+CisJfCB0ID0gPFNRUlQ+CisJfCB0ID0gPE1PRD4KKwl8IHQgPSA8U0laRT4KKwl8IHQgPSA8Q1VSUkVOVF9EQVRFPgorCXwgdCA9IDxDVVJSRU5UX1RJTUU+CisJfCB0ID0gPENVUlJFTlRfVElNRVNUQU1QPgorCXwgdCA9IDxTRUxFQ1Q+CisJfCB0ID0gPERJU1RJTkNUPgorCXwgdCA9IDxGUk9NPgorCXwgdCA9IDxVUERBVEU+CisJfCB0ID0gPERFTEVURT4KKwl8IHQgPSA8V0hFUkU+CisJfCB0ID0gPEdST1VQPgorCXwgdCA9IDxCWT4KKwl8IHQgPSA8SEFWSU5HPgorCXwgdCA9IDxBUz4KKwl8IHQgPSA8TEVGVD4KKwl8IHQgPSA8T1VURVI+CisJfCB0ID0gPElOTkVSPgorCXwgdCA9IDxKT0lOPgorCXwgdCA9IDxGRVRDSD4KKwl8IHQgPSA8SU4+CisJfCB0ID0gPFNFVD4KKwl8IHQgPSA8T0JKRUNUPgorCXwgdCA9IDxJREVOVElGSUVSPgorICAgICkgeyBqanRUaGlzLnNldFRva2VuICh0KTsgfQorfQorCisKK3ZvaWQgbnVtZXJpY19saXRlcmFsKCkgOiB7IH0KK3sKKwlMT09LQUhFQUQoZGVjaW1hbF9saXRlcmFsKCkpIGRlY2ltYWxfbGl0ZXJhbCgpIHwgaW50ZWdlcl9saXRlcmFsKCkKK30KKworCit2b2lkIGludGVnZXJfbGl0ZXJhbCgpICNJTlRFR0VSTElURVJBTCA6Cit7IFRva2VuIHQ7IH0KK3sKKwlbPFBMVVM+IHwgbmVnYXRpdmUoKV0gdCA9IDxJTlRFR0VSX0xJVEVSQUw+IHsgamp0VGhpcy5zZXRUb2tlbiAodCk7IH0KK30KKworCit2b2lkIGRlY2ltYWxfbGl0ZXJhbCgpICNERUNJTUFMTElURVJBTCA6Cit7IFRva2VuIHQ7IH0KK3sKKwkgWzxQTFVTPiB8IG5lZ2F0aXZlKCldIHQgPSA8REVDSU1BTF9MSVRFUkFMPiB7IGpqdFRoaXMuc2V0VG9rZW4gKHQpOyB9Cit9CisKKwordm9pZCBib29sZWFuX2xpdGVyYWwoKSAjQk9PTEVBTkxJVEVSQUwgOgoreyBUb2tlbiB0OyB9Cit7CisJdCA9IDxCT09MRUFOX0xJVEVSQUw+IHsgamp0VGhpcy5zZXRUb2tlbiAodCk7IH0KK30KKworCit2b2lkIHN0cmluZ19saXRlcmFsKCkgI1NUUklOR0xJVEVSQUwgOgoreyBUb2tlbiB0OyB9Cit7CisJdCA9IDxTVFJJTkdfTElURVJBTD4geyBqanRUaGlzLnNldFRva2VuICh0KTsgfQorfQorCisKK3ZvaWQgaW5wdXRfcGFyYW1ldGVyKCkgOiB7IH0KK3sKKwluYW1lZF9pbnB1dF9wYXJhbWV0ZXIoKSB8IHBvc2l0aW9uYWxfaW5wdXRfcGFyYW1ldGVyKCkKK30KKworCit2b2lkIG5hbWVkX2lucHV0X3BhcmFtZXRlcigpICNOQU1FRElOUFVUUEFSQU1FVEVSIDoKK3sgVG9rZW4gdDsgfQoreworCSI6IiB0ID0gPElERU5USUZJRVI+IHsgamp0VGhpcy5zZXRUb2tlbiAodCk7IH0KK30KKworCit2b2lkIHBvc2l0aW9uYWxfaW5wdXRfcGFyYW1ldGVyKCkgI1BPU0lUSU9OQUxJTlBVVFBBUkFNRVRFUiA6Cit7IFRva2VuIHQ7IH0KK3sKKwkiPyIgdCA9IDxJTlRFR0VSX0xJVEVSQUw+IHsgamp0VGhpcy5zZXRUb2tlbiAodCk7IH0KK30KKworCit2b2lkIHBhdHRlcm5fdmFsdWUoKSAjUEFUVEVSTlZBTFVFIDogeyB9Cit7CisJaW5wdXRfcGFyYW1ldGVyKCkgfCBzdHJpbmdfbGl0ZXJhbCgpCisJWyg8RVNDQVBFPiBlc2NhcGVfY2hhcmFjdGVyKCkgI0VTQ0FQRUNIQVJBQ1RFUildCit9CisKKwordm9pZCBlc2NhcGVfY2hhcmFjdGVyKCkgI0VTQ0FQRUNIQVJBQ1RFUiA6Cit7IFRva2VuIHQ7IH0KK3sKKwl0ID0gPFNUUklOR19MSVRFUkFMPiB7IGpqdFRoaXMuc2V0VG9rZW4gKHQpOyB9Cit9CisKKwordm9pZCB0cmltX2NoYXJhY3RlcigpICNUUklNQ0hBUkFDVEVSIDoKK3sgVG9rZW4gdDsgfQoreworCXQgPSA8U1RSSU5HX0xJVEVSQUw+IHsgamp0VGhpcy5zZXRUb2tlbiAodCk7IH0KK30KKworCit2b2lkIEVRKCkgI0VRVUFMUyA6IHsgfQoreworCTxFUT4KK30KKworCit2b2lkIE5FKCkgI05PVEVRVUFMUyA6IHsgfQoreworCTxORT4KK30KKworCit2b2lkIEdUKCkgI0dSRUFURVJUSEFOIDogeyB9Cit7CisJPEdUPgorfQorCisKK3ZvaWQgR0UoKSAjR1JFQVRFUk9SRVFVQUwgOiB7IH0KK3sKKwk8R0U+Cit9CisKKwordm9pZCBMVCgpICNMRVNTVEhBTiA6IHsgfQoreworCTxMVD4KK30KKworCit2b2lkIExFKCkgI0xFU1NPUkVRVUFMIDogeyB9Cit7CisJPExFPgorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25QYXJzZXIgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRXhwcmVzc2lvblBhcnNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmYxZmRjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkV4cHJlc3Npb25QYXJzZXIKQEAgLTAsMCArMSwxNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KK29yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuanBxbC5KUFFMUGFyc2VyCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9hYnN0cmFjdHN0b3JlL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDE0NDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvYWJzdHJhY3RzdG9yZS9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK25vLXN0b3JlLW1hbmFnZXI6IFlvdXIgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCAiezB9IiBwcm9wZXJ0eSBcCisJbmFtaW5nIHRoZSBjb25jcmV0ZSBzdG9yZSBtYW5hZ2VyIHRvIHVzZSB0byBpbnRlcmFjdCB3aXRoIHlvdXIgZGF0YSBzdG9yZS4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9hbnQvYW50bGliLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9hbnQvYW50bGliLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU0ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9hbnRsaWIueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSAKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8YW50bGliPgorCTx0YXNrZGVmIG5hbWU9ImVuaGFuY2UiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmFudC5QQ0VuaGFuY2VyVGFzayIvPgorCTx0YXNrZGVmIG5hbWU9ImFwcGlkdG9vbCIgCisgICAJCWNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmFudC5BcHBsaWNhdGlvbklkVG9vbFRhc2siLz4KKwk8dGFza2RlZiBuYW1lPSJtZXRhZGF0YXRvb2wiIAorCQljbGFzc25hbWU9Im9yZy5hcGFjaGUub3BlbmpwYS5hbnQuTWV0YURhdGFUb29sVGFzayIvPgorPC9hbnRsaWI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvYW50L2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M0OTdjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2FudC9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK2JhZC1jb25mOiBUaGUgb3B0aW9ucyBzdXBwbGllZCB0byB0aGUgezB9IGFyZSBub3QgdmFsaWQuIFBsZWFzZSBjaGVjayB5b3VyIFwKKwlhbnQgYnVpbGQgZmlsZS4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmOWE2ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTU4IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK0NsYXNzUmVzb2x2ZXItbmFtZTogQ2xhc3MgcmVzb2x2ZXIKK0NsYXNzUmVzb2x2ZXItZGVzYzogVGhlIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNsYXNzUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gXAorICAgIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGNsYXNzIHJlc29sdXRpb24uICBEZWZhdWx0cyB0byBhIHNwZWMtY29tcGxpYW50IFwKKyAgICByZXNvbHZlci4KK0NsYXNzUmVzb2x2ZXItdHlwZTogR2VuZXJhbAorQ2xhc3NSZXNvbHZlci1jYXQ6IFBlcnNpc3RlbmNlLkNsYXNzZXMKK0NsYXNzUmVzb2x2ZXItZGlzcGxheW9yZGVyOiA1MAorQ2xhc3NSZXNvbHZlci1leHBlcnQ6IHRydWUKK0NsYXNzUmVzb2x2ZXItaW50ZXJmYWNlOiBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DbGFzc1Jlc29sdmVyCisKK0Jyb2tlckZhY3RvcnktbmFtZTogQnJva2VyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorQnJva2VyRmFjdG9yeS1kZXNjOiBUaGUgbmFtZSBvZiB0aGUgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXJGYWN0b3J5IFwKKyAgICBjbGFzcyB0aGF0IEJvb3RzdHJhcC5nZXRCcm9rZXJGYWN0b3J5IHNob3VsZCBjcmVhdGUuICBUeXBpY2FsbHkgXAorCW9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDQnJva2VyRmFjdG9yeQorQnJva2VyRmFjdG9yeS10eXBlOiBQZXJzaXN0ZW5jZQorQnJva2VyRmFjdG9yeS1jYXQ6IFBlcnNpc3RlbmNlLkFkdmFuY2VkCitCcm9rZXJGYWN0b3J5LWRpc3BsYXlvcmRlcjogNTAKKworQnJva2VySW1wbC1uYW1lOiBCcm9rZXIgaW1wbGVtZW50YXRpb24KK0Jyb2tlckltcGwtZGVzYzogQnJva2VyIHBsdWdpbiBhbmQgcHJvcGVydGllcy4gIElmIHlvdSB1c2UgYSBjdXN0b20gY2xhc3MsIGl0IFwKKwltdXN0IGV4dGVuZCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlckltcGwuCitCcm9rZXJJbXBsLXR5cGU6IEdlbmVyYWwKK0Jyb2tlckltcGwtY2F0OiBQZXJzaXN0ZW5jZS5BZHZhbmNlZAorQnJva2VySW1wbC1kaXNwbGF5b3JkZXI6IDUwCitCcm9rZXJJbXBsLWV4cGVydDogdHJ1ZQorQnJva2VySW1wbC1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VySW1wbAorCitEYXRhQ2FjaGUtbmFtZTogRGF0YSBjYWNoZQorRGF0YUNhY2hlLWRlc2M6IFBsdWdpbiB1c2VkIHRvIGNhY2hlIGRhdGEgbG9hZGVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIE11c3QgXAorCWltcGxlbWVudCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZS4KK0RhdGFDYWNoZS10eXBlOiBHZW5lcmFsCitEYXRhQ2FjaGUtY2F0OiBDYWNoZQorRGF0YUNhY2hlLWRpc3BsYXlvcmRlcjogNTAKK0RhdGFDYWNoZS1leHBlcnQ6IHRydWUKK0RhdGFDYWNoZS1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGF0YUNhY2hlCisKK0RhdGFDYWNoZU1hbmFnZXItbmFtZTogRGF0YSBjYWNoZQorRGF0YUNhY2hlTWFuYWdlci1kZXNjOiBQbHVnaW4gdXNlZCB0byBtYW5hZ2UgY29uZmlndXJhdGlvbicncyBjYWNoZSBpbnN0YW5jZXMuCitEYXRhQ2FjaGVNYW5hZ2VyLXR5cGU6IEdlbmVyYWwKK0RhdGFDYWNoZU1hbmFnZXItY2F0OiBDYWNoZQorRGF0YUNhY2hlTWFuYWdlci1kaXNwbGF5b3JkZXI6IDUwCitEYXRhQ2FjaGVNYW5hZ2VyLWV4cGVydDogdHJ1ZQorRGF0YUNhY2hlTWFuYWdlci1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGF0YUNhY2hlTWFuYWdlcgorCitEYXRhQ2FjaGVUaW1lb3V0LW5hbWU6IERlZmF1bHQgZGF0YSBjYWNoZSB0aW1lb3V0CitEYXRhQ2FjaGVUaW1lb3V0LWRlc2M6IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgZGF0YSBpbiB0aGUgZGF0YSBjYWNoZSBcCisJaXMgdmFsaWQgZm9yLiBBIHZhbHVlIG9mIDAgb3IgbGVzcyBtZWFucyB0aGF0IGJ5IGRlZmF1bHQsIGNhY2hlZCBkYXRhIGRvZXMgXAorCW5vdCB0aW1lIG91dC4KK0RhdGFDYWNoZVRpbWVvdXQtdHlwZTogR2VuZXJhbAorRGF0YUNhY2hlVGltZW91dC1jYXQ6IENhY2hlCitEYXRhQ2FjaGVUaW1lb3V0LWRpc3BsYXlvcmRlcjogNTAKK0RhdGFDYWNoZVRpbWVvdXQtZXhwZXJ0OiB0cnVlCisKK1F1ZXJ5Q2FjaGUtbmFtZTogUXVlcnkgY2FjaGUKK1F1ZXJ5Q2FjaGUtZGVzYzogUGx1Z2luIHVzZWQgdG8gY2FjaGUgcXVlcnkgcmVzdWx0cyBsb2FkZWQgZnJvbSB0aGUgZGF0YSBcCisJc3RvcmUuIE11c3QgaW1wbGVtZW50IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuUXVlcnlDYWNoZS4KK1F1ZXJ5Q2FjaGUtdHlwZTogR2VuZXJhbAorUXVlcnlDYWNoZS1jYXQ6IENhY2hlLlF1ZXJpZXMKK1F1ZXJ5Q2FjaGUtZGlzcGxheW9yZGVyOiA1MAorUXVlcnlDYWNoZS1leHBlcnQ6IHRydWUKK1F1ZXJ5Q2FjaGUtaW50ZXJmYWNlOiBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLlF1ZXJ5Q2FjaGUKKworUXVlcnlDb21waWxhdGlvbkNhY2hlLW5hbWU6IFF1ZXJ5IGNvbXBpbGF0aW9uIGNhY2hlCitRdWVyeUNvbXBpbGF0aW9uQ2FjaGUtZGVzYzogUGx1Z2luIHVzZWQgdG8gY2FjaGUgcXVlcnkgY29tcGlsYXRpb24gZGF0YS4gXAorCU11c3QgaW1wbGVtZW50IGphdmEudXRpbC5NYXAuIERvZXMgbm90IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUgLS0gaXQgd2lsbCBcCisJYmUgd3JhcHBlZCB2aWEgdGhlIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcCgpIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCBcCisJZXh0ZW5kIG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNhY2hlTWFwLgorUXVlcnlDb21waWxhdGlvbkNhY2hlLXR5cGU6IEdlbmVyYWwKK1F1ZXJ5Q29tcGlsYXRpb25DYWNoZS1jYXQ6IENhY2hlLlF1ZXJpZXMKK1F1ZXJ5Q29tcGlsYXRpb25DYWNoZS1kaXNwbGF5b3JkZXI6IDUwCitRdWVyeUNvbXBpbGF0aW9uQ2FjaGUtZXhwZXJ0OiB0cnVlCitRdWVyeUNvbXBpbGF0aW9uQ2FjaGUtaW50ZXJmYWNlOiBqYXZhLnV0aWwuTWFwCisKK1JlbW90ZUNvbW1pdFByb3ZpZGVyLW5hbWU6IFJlbW90ZSBjb21taXQgcHJvdmlkZXIKK1JlbW90ZUNvbW1pdFByb3ZpZGVyLWRlc2M6IFBsdWdpbiB1c2VkIHRvIGNvbW11bmljYXRlIGNvbW1pdCBpbmZvcm1hdGlvbiBcCisJYW1vbmcgSlZNcy4gTXVzdCBpbXBsZW1lbnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdFByb3ZpZGVyLgorUmVtb3RlQ29tbWl0UHJvdmlkZXItdHlwZTogR2VuZXJhbAorUmVtb3RlQ29tbWl0UHJvdmlkZXItY2F0OiBDYWNoZQorUmVtb3RlQ29tbWl0UHJvdmlkZXItZGlzcGxheW9yZGVyOiA1MAorUmVtb3RlQ29tbWl0UHJvdmlkZXItZXhwZXJ0OiB0cnVlCitSZW1vdGVDb21taXRQcm92aWRlci1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5SZW1vdGVDb21taXRQcm92aWRlcgorCitUcmFuc2FjdGlvbk1vZGUtbmFtZTogVHJhbnNhY3Rpb24gbW9kZQorVHJhbnNhY3Rpb25Nb2RlLWRlc2M6IEVpdGhlciAibG9jYWwiIG9yICJtYW5hZ2VkIi4KK1RyYW5zYWN0aW9uTW9kZS10eXBlOiBDb25uZWN0aW5nCitUcmFuc2FjdGlvbk1vZGUtY2F0OiBQZXJzaXN0ZW5jZS5UcmFuc2FjdGlvbnMKK1RyYW5zYWN0aW9uTW9kZS1kaXNwbGF5b3JkZXI6IDUwCisKK01hbmFnZWRSdW50aW1lLW5hbWU6IE1hbmFnZWQgcnVudGltZQorTWFuYWdlZFJ1bnRpbWUtZGVzYzogUGx1Z2luIHVzZWQgdG8gaW50ZWdyYXRlIHdpdGggYW4gZXh0ZXJuYWwgdHJhbnNhY3Rpb24gXAorCW1hbmFnZXIuICBNdXN0IGltcGxlbWVudCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk1hbmFnZWRSdW50aW1lLgorTWFuYWdlZFJ1bnRpbWUtdHlwZTogR2VuZXJhbAorTWFuYWdlZFJ1bnRpbWUtY2F0OiBQZXJzaXN0ZW5jZS5BZHZhbmNlZAorTWFuYWdlZFJ1bnRpbWUtZGlzcGxheW9yZGVyOiA1MAorTWFuYWdlZFJ1bnRpbWUtZXhwZXJ0OiB0cnVlCitNYW5hZ2VkUnVudGltZS1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5lZS5NYW5hZ2VkUnVudGltZQorCitGZXRjaEJhdGNoU2l6ZS1uYW1lOiBEZWZhdWx0IGZldGNoIGJhdGNoIHNpemUKK0ZldGNoQmF0Y2hTaXplLWRlc2M6IFRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgcHJlLWZldGNoZWQgd2hlbiBcCisJYW4gZWxlbWVudCBpbiBhIHJlc3VsdCBpcyBhY2Nlc3NlZC4gIFVzZSAtMSB0byBwcmUtZmV0Y2ggYWxsIHJlc3VsdHMuCitGZXRjaEJhdGNoU2l6ZS10eXBlOiBPcHRpbWl6YXRpb24KK0ZldGNoQmF0Y2hTaXplLWNhdDogRmV0Y2hpbmcKK0ZldGNoQmF0Y2hTaXplLWRpc3BsYXlvcmRlcjogNTAKK0ZldGNoQmF0Y2hTaXplLWV4cGVydDogdHJ1ZQorCitNYXhGZXRjaERlcHRoLW5hbWU6IE1heGltdW0gZmV0Y2ggZGVwdGguCitNYXhGZXRjaERlcHRoLWRlc2M6IFRoZSBtYXhpbXVtIHJlbGF0aW9uIGRlcHRoIHRvIHRyYXZlcnNlIHdoZW4gZWFnZXIgXAorICAgIGZldGNoaW5nLCBvciAtMSBmb3Igbm8gbGltaXQuCitNYXhGZXRjaERlcHRoLXR5cGU6IE9wdGltaXphdGlvbgorTWF4RmV0Y2hEZXB0aC1jYXQ6IEZldGNoaW5nCitNYXhGZXRjaERlcHRoLWRpc3BsYXlvcmRlcjogNTAKK01heEZldGNoRGVwdGgtZXhwZXJ0OiB0cnVlCisKK0ZldGNoR3JvdXBzLW5hbWU6IEZldGNoIGdyb3VwcyB0byBhZGQgdG8gZGVmYXVsdCBmZXRjaCBncm91cAorRmV0Y2hHcm91cHMtZGVzYzogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmZXRjaCBncm91cCBuYW1lcyB0aGF0IHdsbCBiZSBcCisJbG9hZGVkIGJ5IGRlZmF1bHQgd2hlbiBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGRhdGEgc3RvcmUuCitGZXRjaEdyb3Vwcy10eXBlOiBPcHRpbWl6YXRpb24KK0ZldGNoR3JvdXBzLWNhdDogRmV0Y2hpbmcKK0ZldGNoR3JvdXBzLWRpc3BsYXlvcmRlcjogNTAKK0ZldGNoR3JvdXBzLWV4cGVydDogdHJ1ZQorCitGbHVzaEJlZm9yZVF1ZXJpZXMtbmFtZTogQXV0b21hdGljYWxseSBmbHVzaCBjaGFuZ2VzIGJlZm9yZSBxdWVyaWVzCitGbHVzaEJlZm9yZVF1ZXJpZXMtZGVzYzogV2hldGhlciBvciBub3QgT3BlbkpQQSBzaG91bGQgYXV0b21hdGljYWxseSBmbHVzaCBcCisJbW9kaWZpY2F0aW9ucyB0byB0aGUgZGF0YSBzdG9yZSBiZWZvcmUgZXhlY3V0aW5nIHF1ZXJpZXMuCitGbHVzaEJlZm9yZVF1ZXJpZXMtdHlwZTogR2VuZXJhbAorRmx1c2hCZWZvcmVRdWVyaWVzLWNhdDogUXVlcmllcworRmx1c2hCZWZvcmVRdWVyaWVzLWRpc3BsYXlvcmRlcjogNTAKK0ZsdXNoQmVmb3JlUXVlcmllcy1leHBlcnQ6IHRydWUKKworTG9ja1RpbWVvdXQtbmFtZTogT2JqZWN0IGxvY2sgdGltZW91dAorTG9ja1RpbWVvdXQtZGVzYzogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYW4gb2JqZWN0IGxvY2sgYmVmb3JlIFwKKwl0aHJvd2luZyBhbiBleGNlcHRpb24sIG9yIC0xIGZvciBubyBsaW1pdC4KK0xvY2tUaW1lb3V0LXR5cGU6IE9wdGltaXphdGlvbgorTG9ja1RpbWVvdXQtY2F0OiBMb2NraW5nCitMb2NrVGltZW91dC1kaXNwbGF5b3JkZXI6IDUwCitMb2NrVGltZW91dC1leHBlcnQ6IHRydWUKKworUmVhZExvY2tMZXZlbC1uYW1lOiBEZWZhdWx0IHRyYW5zYWN0aW9uYWwgcmVhZCBsb2NrIGxldmVsCitSZWFkTG9ja0xldmVsLWRlc2M6IFRoZSBkZWZhdWx0IGxvY2sgbGV2ZWwgdG8gdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzIHdpdGhpbiBcCisJbm9uLW9wdGltaXN0aWMgdHJhbnNhY3Rpb25zLiAgU2V0IHRvIG5vbmUsIHJlYWQsIHdyaXRlLCBvciB0aGUgbnVtZXJpYyBcCisJdmFsdWUgb2YgdGhlIGRlc2lyZWQgbG9jayBsZXZlbCBmb3IgeW91ciBsb2NrIG1hbmFnZXIuCitSZWFkTG9ja0xldmVsLXR5cGU6IE9wdGltaXphdGlvbgorUmVhZExvY2tMZXZlbC1jYXQ6IExvY2tpbmcKK1JlYWRMb2NrTGV2ZWwtZGlzcGxheW9yZGVyOiA1MAorUmVhZExvY2tMZXZlbC1leHBlcnQ6IHRydWUKKworV3JpdGVMb2NrTGV2ZWwtbmFtZTogRGVmYXVsdCB0cmFuc2FjdGlvbmFsIHdyaXRlIGxvY2sgbGV2ZWwKK1dyaXRlTG9ja0xldmVsLWRlc2M6IFRoZSBkZWZhdWx0IGxvY2sgbGV2ZWwgdG8gdXNlIHdoZW4gY2hhbmdpbmcgb2JqZWN0cyBcCisJd2l0aGluIG5vbi1vcHRpbWlzdGljIHRyYW5zYWN0aW9ucy4gIFNldCB0byBub25lLCByZWFkLCB3cml0ZSwgb3IgdGhlIFwKKwludW1lcmljIHZhbHVlIG9mIHRoZSBkZXNpcmVkIGxvY2sgbGV2ZWwgZm9yIHlvdXIgbG9jayBtYW5hZ2VyLgorV3JpdGVMb2NrTGV2ZWwtdHlwZTogT3B0aW1pemF0aW9uCitXcml0ZUxvY2tMZXZlbC1jYXQ6IExvY2tpbmcKK1dyaXRlTG9ja0xldmVsLWRpc3BsYXlvcmRlcjogNTAKK1dyaXRlTG9ja0xldmVsLWV4cGVydDogdHJ1ZQorCitTZXF1ZW5jZS1uYW1lOiBEZWZhdWx0IHN5c3RlbSBzZXF1ZW5jZQorU2VxdWVuY2UtZGVzYzogVGhlIGRlZmF1bHQgb3JnLmFwYWNoZS5vcGVuanBhLnJ1bmltZS5TZXEgZm9yIHN5c3RlbSB1c2UuCitTZXF1ZW5jZS10eXBlOiBHZW5lcmFsCitTZXF1ZW5jZS1jYXQ6IE1hcHBpbmdzLkRlZmF1bHRzCitTZXF1ZW5jZS1kaXNwbGF5b3JkZXI6IDUwCitTZXF1ZW5jZS1leHBlcnQ6IHRydWUKK1NlcXVlbmNlLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXEKKworQXV0b0NsZWFyLW5hbWU6IEF1dG8gY2xlYXIgdmFsdWVzCitBdXRvQ2xlYXItZGVzYzogSWYgImRhdGFzdG9yZSIsIGFuIG9iamVjdCcncyBmaWVsZCB2YWx1ZXMgY2xlYXJzIHdoZW4gaXQgXAorCWVudGVycyBhIGRhdGFzdG9yZSB0cmFuc2FjdGlvbi4gIElmICJhbGwiLCBvYmplY3QgZmllbGQgdmFsdWVzIGFsc28gXAorCWNsZWFyIHdoZW4gZW50ZXJpbmcgb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMuCitBdXRvQ2xlYXItdHlwZTogR2VuZXJhbAorQXV0b0NsZWFyLWNhdDogUGVyc2lzdGVuY2UuVHJhbnNhY3Rpb25zLkFkdmFuY2VkCitBdXRvQ2xlYXItZGlzcGxheW9yZGVyOiA1MAorCitDb25uZWN0aW9uUmV0YWluTW9kZS1uYW1lOiBDb25uZWN0aW9uIHJldGFpbiBtb2RlCitDb25uZWN0aW9uUmV0YWluTW9kZS1kZXNjOiBUaGlzIHByb3BlcnR5IGRpY3RhdGVzIHdoZW4gT3BlbkpQQSB3aWxsIHJldGFpbiBhbmQgXAorCXJlbGVhc2UgZGF0YSBzdG9yZSBjb25uZWN0aW9ucy4gIEF2YWlsYWJsZSBvcHRpb25zIGFyZSAib24tZGVtYW5kIiBmb3IgXAorCXJldGFpbmluZyBhIGNvbm5lY3Rpb24gb25seSBkdXJpbmcgcGVzc2ltaXN0aWMgdHJhbnNhY3Rpb25zIGFuZCBkYXRhIHN0b3JlIFwKKwlvcGVyYXRpb25zLCAidHJhbnNhY3Rpb24iIGZvciByZXRhaW5pbmcgYSBjb25uZWN0aW9uIGZvciB0aGUgbGlmZSBvZiBlYWNoIFwKKwl0cmFuc2FjdGlvbiwgb3IgImFsd2F5cyIgdG8gaW5kaWNhdGUgdGhhdCBhIHBlcnNpc3RlbmNlIGNvbnRleHQgc2hvdWxkIFwKKwlyZXRhaW4gYW5kIHJldXNlIGEgc2luZ2xlIGNvbm5lY3Rpb24gZm9yIGl0cyBlbnRpcmUgbGlmZXNwYW4uCitDb25uZWN0aW9uUmV0YWluTW9kZS10eXBlOiBDb25uZWN0aW5nCitDb25uZWN0aW9uUmV0YWluTW9kZS1jYXQ6IENvbm5lY3RpbmcuQWR2YW5jZWQKK0Nvbm5lY3Rpb25SZXRhaW5Nb2RlLWRpc3BsYXlvcmRlcjogNTAKK0Nvbm5lY3Rpb25SZXRhaW5Nb2RlLWV4cGVydDogdHJ1ZQorCitGaWx0ZXJMaXN0ZW5lcnMtbmFtZTogUXVlcnkgZmlsdGVyIGxpc3RlbmVycworRmlsdGVyTGlzdGVuZXJzLWRlc2M6IEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcXVlcnkgZmlsdGVyIGxpc3RlbmVycyB0byBhZGQgXAorCXRvIHRoZSBkZWZhdWx0IGxpc3Qgb2YgZXh0ZW5zaW9ucy4gIEVhY2ggbGlzdGVuZXIgbXVzdCBpbXBsZW1lbnQgdGhlIFwKKwlvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbHRlckxpc3RlbmVyIGludGVyZmFjZS4KK0ZpbHRlckxpc3RlbmVycy10eXBlOiBHZW5lcmFsCitGaWx0ZXJMaXN0ZW5lcnMtY2F0OiBRdWVyaWVzLkV4dGVuc2lvbnMKK0ZpbHRlckxpc3RlbmVycy1kaXNwbGF5b3JkZXI6IDUwCitGaWx0ZXJMaXN0ZW5lcnMtZXhwZXJ0OiB0cnVlCisKK0FnZ3JlZ2F0ZUxpc3RlbmVycy1uYW1lOiBRdWVyeSBhZ2dyZWdhdGUgbGlzdGVuZXJzCitBZ2dyZWdhdGVMaXN0ZW5lcnMtZGVzYzogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBxdWVyeSBhZ2dyZWdhdGUgbGlzdGVuZXJzIFwKKwl0byBhZGQgdG8gdGhlIGRlZmF1bHQgbGlzdCBvZiBleHRlbnNpb25zLiAgRWFjaCBsaXN0ZW5lciBtdXN0IGltcGxlbWVudCBcCisJdGhlIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQWdncmVnYXRlTGlzdGVuZXIgaW50ZXJmYWNlLgorQWdncmVnYXRlTGlzdGVuZXJzLXR5cGU6IEdlbmVyYWwKK0FnZ3JlZ2F0ZUxpc3RlbmVycy1jYXQ6IFF1ZXJpZXMuRXh0ZW5zaW9ucworQWdncmVnYXRlTGlzdGVuZXJzLWRpc3BsYXlvcmRlcjogNTAKK0FnZ3JlZ2F0ZUxpc3RlbmVycy1leHBlcnQ6IHRydWUKKworUmV0cnlDbGFzc1JlZ2lzdHJhdGlvbi1uYW1lOiBSZXRyeSBjbGFzcyByZWdpc3RyYXRpb24KK1JldHJ5Q2xhc3NSZWdpc3RyYXRpb24tZGVzYzogV2hldGhlciB0byBsb2cgYSB3YXJuaW5nIGFuZCBkZWZlciByZWdpc3RyYXRpb24gXAorCXdoZW4gYSByZWdpc3RlcmVkIHBlcnNpc3RlbnQgY2xhc3MgY2Fubm90IGJlIHByb2Nlc3NlZCwgaW5zdGVhZCBvZiBcCisJdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgU2hvdWxkIG9ubHkgYmUgc2V0IHRvIHRydWUgdW5kZXIgY29tcGxleCBcCisJY2xhc3Nsb2FkZXIgdG9wb2xvZ2llcyB0aGF0IGFyZSBjYXVzaW5nIHJlZ2lzdHJhdGlvbiBlcnJvcnMuCitSZXRyeUNsYXNzUmVnaXN0cmF0aW9uLXR5cGU6IEdlbmVyYWwKK1JldHJ5Q2xhc3NSZWdpc3RyYXRpb24tY2F0OiBQZXJzaXN0ZW5jZS5DbGFzc2VzCitSZXRyeUNsYXNzUmVnaXN0cmF0aW9uLWRpc3BsYXlvcmRlcjogNjAKK1JldHJ5Q2xhc3NSZWdpc3RyYXRpb24tZXhwZXJ0OiB0cnVlCisKK1Byb3h5TWFuYWdlci1uYW1lOiBQcm94eSBtYW5hZ2VyCitQcm94eU1hbmFnZXItZGVzYzogUGx1Z2luIHVzZWQgdG8gcHJveHkgc2Vjb25kIGNsYXNzIG9iamVjdCBmaWVsZHMgb2YgbWFuYWdlZCBcCisJaW5zdGFuY2VzLiAgTXVzdCBpbXBsZW1lbnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHlNYW5hZ2VyLgorUHJveHlNYW5hZ2VyLXR5cGU6IEdlbmVyYWwKK1Byb3h5TWFuYWdlci1jYXQ6IFBlcnNpc3RlbmNlLkFkdmFuY2VkCitQcm94eU1hbmFnZXItZGlzcGxheW9yZGVyOiA1MAorUHJveHlNYW5hZ2VyLWV4cGVydDogdHJ1ZQorCitDb25uZWN0aW9uUHJvcGVydGllcy1uYW1lOiBDb25uZWN0aW9uIHByb3BlcnRpZXMKK0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzLWRlc2M6IEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgXAorCXRvIHRoZSBkYXRhYmFzZSBkcml2ZXIgd2hlbiBvYnRhaW5pbmcgYSBjb25uZWN0aW9uLiBQcm9wZXJ0aWVzIGFyZSBvZiB0aGUgXAorCWZvcm0gImtleT12YWx1ZSIuICBJZiB0aGUgZ2l2ZW4gZHJpdmVyIGNsYXNzIGlzIGEgRGF0YVNvdXJjZSwgdGhlc2UgXAorCXByb3BlcnRpZXMgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYmVhbiBwcm9wZXJ0aWVzIG9mIHRoZSBEYXRhU291cmNlLiAKK0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzLXR5cGU6IENvbm5lY3RpbmcKK0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzLWNhdDogQ29ubmVjdGluZy5BZHZhbmNlZAorQ29ubmVjdGlvblByb3BlcnRpZXMtZGlzcGxheW9yZGVyOiA1MAorCitDb25uZWN0aW9uRmFjdG9yeU1vZGUtbmFtZTogQ29ubmVjdGlvbkZhY3RvcnkgbW9kZQorQ29ubmVjdGlvbkZhY3RvcnlNb2RlLWRlc2M6IFRoZSB0eXBlIG9mIGRhdGEgc291cmNlIGluIHVzZS4gIEF2YWlsYWJsZSBvcHRpb25zIFwKKwlhcmUgImxvY2FsIiBmb3IgYSBzdGFuZGFyZCBkYXRhIHNvdXJjZSB1bmRlciBPcGVuSlBBJydzIGNvbnRyb2wsIG9yIFwKKwkibWFuYWdlZCIgZm9yIGEgZGF0YSBzb3VyY2UgbWFuYWdlZCBieSBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgYW5kIFwKKwlhdXRvbWF0aWNhbGx5IGVubGlzdGVkIGluIGdsb2JhbCB0cmFuc2FjdGlvbnMuCitDb25uZWN0aW9uRmFjdG9yeU1vZGUtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbkZhY3RvcnlNb2RlLWNhdDogRGF0YWJhc2UuVHJhbnNhY3Rpb25zCitDb25uZWN0aW9uRmFjdG9yeU1vZGUtZGlzcGxheW9yZGVyOiA1MAorQ29ubmVjdGlvbkZhY3RvcnlNb2RlLWV4cGVydDogdHJ1ZQorCitDb25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMtbmFtZTogQ29ubmVjdGlvbiBmYWN0b3J5IHByb3BlcnRpZXMKK0Nvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcy1kZXNjOiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgXAorCXVzZWQgdG8gY29uZmlndXJlIHRoZSBqYXZheC5zcWwuRGF0YVNvdXJjZSB1c2VkIGFzIHRoZSBDb25uZWN0aW9uRmFjdG9yeS4gXAorCUVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIG9mIHRoZSBmb3JtICJrZXk9dmFsdWUiLCB3aGVyZSAia2V5IiBpcyB0aGUgbmFtZSBcCisJb2Ygc29tZSBiZWFuLWxpa2UgcHJvcGVydHkgb2YgdGhlIGRhdGEgc291cmNlLgorQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzLXR5cGU6IENvbm5lY3RpbmcKK0Nvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcy1jYXQ6IENvbm5lY3RpbmcuQWR2YW5jZWQKK0Nvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcy1kaXNwbGF5b3JkZXI6IDUwCisKK0Nvbm5lY3Rpb24yVXNlck5hbWUtbmFtZTogVW5tYW5hZ2VkIGNvbm5lY3Rpb24gdXNlcm5hbWUKK0Nvbm5lY3Rpb24yVXNlck5hbWUtZGVzYzogVGhlIHVzZXJuYW1lIGZvciB0aGUgY29ubmVjdGlvbiBsaXN0ZWQgaW4gXAorCUNvbm5lY3Rpb24yVVJMLgorQ29ubmVjdGlvbjJVc2VyTmFtZS10eXBlOiBDb25uZWN0aW5nCitDb25uZWN0aW9uMlVzZXJOYW1lLWNhdDogQ29ubmVjdGluZy5YQQorQ29ubmVjdGlvbjJVc2VyTmFtZS1kaXNwbGF5b3JkZXI6IDUwCitDb25uZWN0aW9uMlVzZXJOYW1lLWV4cGVydDogdHJ1ZQorCitDb25uZWN0aW9uMlBhc3N3b3JkLW5hbWU6IFVubWFuYWdlZCBjb25uZWN0aW9uIHBhc3N3b3JkCitDb25uZWN0aW9uMlBhc3N3b3JkLWRlc2M6IFRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGluIFwKKwlDb25uZWN0aW9uMlVzZXJOYW1lCitDb25uZWN0aW9uMlBhc3N3b3JkLXR5cGU6IENvbm5lY3RpbmcKK0Nvbm5lY3Rpb24yUGFzc3dvcmQtY2F0OiBDb25uZWN0aW5nLlhBCitDb25uZWN0aW9uMlBhc3N3b3JkLWRpc3BsYXlvcmRlcjogNTAKK0Nvbm5lY3Rpb24yUGFzc3dvcmQtZXhwZXJ0OiB0cnVlCisKK0Nvbm5lY3Rpb24yVVJMLW5hbWU6IFVubWFuYWdlZCBjb25uZWN0aW9uIFVSTAorQ29ubmVjdGlvbjJVUkwtZGVzYzogVGhlIFVSTCBmb3IgdGhlIHVubWFuYWdlZCBkYXRhIHNvdXJjZS4KK0Nvbm5lY3Rpb24yVVJMLXR5cGU6IENvbm5lY3RpbmcKK0Nvbm5lY3Rpb24yVVJMLWNhdDogQ29ubmVjdGluZy5YQQorQ29ubmVjdGlvbjJVUkwtZGlzcGxheW9yZGVyOiA1MAorQ29ubmVjdGlvbjJVUkwtZXhwZXJ0OiB0cnVlCisKK0Nvbm5lY3Rpb24yRHJpdmVyTmFtZS1uYW1lOiBVbm1hbmFnZWQgY29ubmVjdGlvbiBkcml2ZXIKK0Nvbm5lY3Rpb24yRHJpdmVyTmFtZS1kZXNjOiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZGF0YWJhc2UgZHJpdmVyLCBvciBhbiBcCisJaW5zdGFuY2Ugb2YgYSBEYXRhU291cmNlIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSB1bm1hbmFnZWQgZGF0YSBzb3VyY2UuCitDb25uZWN0aW9uMkRyaXZlck5hbWUtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbjJEcml2ZXJOYW1lLWNhdDogQ29ubmVjdGluZy5YQQorQ29ubmVjdGlvbjJEcml2ZXJOYW1lLWRpc3BsYXlvcmRlcjogNTAKK0Nvbm5lY3Rpb24yRHJpdmVyTmFtZS1leHBlcnQ6IHRydWUKKworQ29ubmVjdGlvbjJQcm9wZXJ0aWVzLW5hbWU6IE5vbi1YQSBjb25uZWN0aW9uIHByb3BlcnRpZXMKK0Nvbm5lY3Rpb24yUHJvcGVydGllcy1kZXNjOiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcGFzc2VkIFwKKwl0byB0aGUgdW5tYW5hZ2VkIGRhdGFiYXNlIGRyaXZlciB3aGVuIG9idGFpbmluZyBhIGNvbm5lY3Rpb24uIFByb3BlcnRpZXMgXAorCWFyZSBvZiB0aGUgZm9ybSAia2V5PXZhbHVlIi4gIElmIHRoZSBnaXZlbiBkcml2ZXIgY2xhc3MgaXMgYSBEYXRhU291cmNlLCBcCisJdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiZWFuIHByb3BlcnRpZXMgb2YgdGhlIFwKKwlEYXRhU291cmNlLiAKK0Nvbm5lY3Rpb24yUHJvcGVydGllcy10eXBlOiBDb25uZWN0aW5nCitDb25uZWN0aW9uMlByb3BlcnRpZXMtY2F0OiBDb25uZWN0aW5nLlhBCitDb25uZWN0aW9uMlByb3BlcnRpZXMtZGlzcGxheW9yZGVyOiA1MAorQ29ubmVjdGlvbjJQcm9wZXJ0aWVzLWV4cGVydDogdHJ1ZQorCitDb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzLW5hbWU6IFVubWFuYWdlZCBjb25uZWN0aW9uIGZhY3RvcnkgcHJvcGVydGllcworQ29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcy1kZXNjOiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgXAorCXVzZWQgdG8gY29uZmlndXJlIHRoZSBqYXZheC5zcWwuRGF0YVNvdXJjZSB1c2VkIGFzIHRoZSB1bm1hbmFnZWQgXAorCUNvbm5lY3Rpb25GYWN0b3J5LiBFYWNoIHByb3BlcnR5IHNob3VsZCBiZSBvZiB0aGUgZm9ybSAia2V5PXZhbHVlIiwgXAorCXdoZXJlICJrZXkiIGlzIHRoZSBuYW1lIG9mIHNvbWUgYmVhbi1saWtlIHByb3BlcnR5IG9mIHRoZSBkYXRhIHNvdXJjZS4KK0Nvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcy1jYXQ6IENvbm5lY3RpbmcuWEEKK0Nvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMtZGlzcGxheW9yZGVyOiA1MAorQ29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcy1leHBlcnQ6IHRydWUKKworT3B0aW1pc3RpYy1uYW1lOiBPcHRpbWlzdGljIHRyYW5zYWN0aW9ucworT3B0aW1pc3RpYy1kZXNjOiBTZWxlY3RzIGJldHdlZW4gb3B0aW1pc3RpYyBhbmQgcGVzc2ltaXN0aWMgKGRhdGEgc3RvcmUpIFwKKwl0cmFuc2FjdGlvbmFsIG1vZGVzLgorT3B0aW1pc3RpYy10eXBlOiBQZXJzaXN0ZW5jZQorT3B0aW1pc3RpYy1jYXQ6IFBlcnNpc3RlbmNlLlRyYW5zYWN0aW9ucworT3B0aW1pc3RpYy1kaXNwbGF5b3JkZXI6IDUwCisKK1JldGFpblN0YXRlLW5hbWU6IFJldGFpbiB2YWx1ZXMKK1JldGFpblN0YXRlLWRlc2M6IElmIHRydWUsIHRoZW4gZmllbGRzIGluIGEgcGVyc2lzdGVuY2UtY2FwYWJsZSBvYmplY3QgdGhhdCBcCisJaGF2ZSBiZWVuIHJlYWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24gbXVzdCBiZSBwcmVzZXJ2ZWQgaW4gbWVtb3J5IGFmdGVyIHRoZSBcCisJdHJhbnNhY3Rpb24gY29tbWl0cy4gT3RoZXJ3aXNlLCBwZXJzaXN0ZW5jZS1jYXBhYmxlIG9iamVjdHMgbXVzdCBcCisJdHJhbnNpdGlvbiB0byB0aGUgaG9sbG93IHN0YXRlIHVwb24gY29tbWl0LCBtZWFuaW5nIHRoYXQgc3Vic2VxdWVudCByZWFkcyBcCisJd2lsbCByZXN1bHQgaW4gYSBkYXRhYmFzZSByb3VuZC10cmlwLgorUmV0YWluU3RhdGUtdHlwZTogUGVyc2lzdGVuY2UKK1JldGFpblN0YXRlLWNhdDogUGVyc2lzdGVuY2UuVHJhbnNhY3Rpb25zLkFkdmFuY2VkCitSZXRhaW5TdGF0ZS1kaXNwbGF5b3JkZXI6IDUwCisKK1Jlc3RvcmVTdGF0ZS1uYW1lOiBSZXN0b3JlIHN0YXRlCitSZXN0b3JlU3RhdGUtZGVzYzogSWYgdHJ1ZSwgdGhlbiBpbW11dGFibGUgZmllbGRzIGluIGEgcGVyc2lzdGVuY2UtY2FwYWJsZSBcCisJb2JqZWN0IHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24gd2lsbCBiZSByZXN0b3JlZCB0byBcCisJdGhlaXIgb3JpZ2luYWwgdmFsdWVzIHVwb24gYSByb2xsYmFjay4gSWYgc2V0IHRvICJhbGwiLCBtdXRhYmxlIGZpZWxkcyBcCisJd2lsbCBhbHNvIGJlIHJlc3RvcmVkLiAgSWYgZmFsc2UsIHRoZSB2YWx1ZXMgd2lsbCBub3QgYmUgY2hhbmdlZCB1cG9uIFwKKwlyb2xsYmFjay4KK1Jlc3RvcmVTdGF0ZS10eXBlOiBQZXJzaXN0ZW5jZQorUmVzdG9yZVN0YXRlLWNhdDogUGVyc2lzdGVuY2UuVHJhbnNhY3Rpb25zLkFkdmFuY2VkCitSZXN0b3JlU3RhdGUtZGlzcGxheW9yZGVyOiA1MAorCitBdXRvRGV0YWNoLW5hbWU6IEF1dG8gZGV0YWNoCitBdXRvRGV0YWNoLWRlc2M6IEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnRzIHVwb24gd2hpY2ggdGhlIG1hbmFnZWQgXAorCWluc3RhbmNlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0YWNoZWQuICBFdmVudHMgYXJlICJjbG9zZSIsICJjb21taXQiLCBcCisJYW5kICJub250eC1yZWFkIi4KK0F1dG9EZXRhY2gtdHlwZTogR2VuZXJhbAorQXV0b0RldGFjaC1jYXQ6IE9wdGltaXphdGlvbgorQXV0b0RldGFjaC1kaXNwbGF5b3JkZXI6IDUwCitBdXRvRGV0YWNoLWV4cGVydDogdHJ1ZQorCitEZXRhY2hTdGF0ZS1uYW1lOiBEZXRhY2ggc3RhdGVzCitEZXRhY2hTdGF0ZS1kZXNjOiBQbHVnaW4gZGVzY3JpYmluZyB0aGUgc2V0IG9mIGZpZWxkIHZhbHVlcyB3aGljaCB3aWxsIGJlIFwKKwlpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCBkZXRhY2ggYW5kIHJlbGF0ZWQgb3B0aW9ucy4gIFRoZXNlIHN0YXRlcyBhcmUgXAorCSJsb2FkZWQiLCAiYWxsIiwgYW5kICJmZXRjaC1ncm91cHMiLgorRGV0YWNoU3RhdGUtdHlwZTogR2VuZXJhbAorRGV0YWNoU3RhdGUtY2F0OiBPcHRpbWl6YXRpb24KK0RldGFjaFN0YXRlLWRpc3BsYXlvcmRlcjogNTAKK0RldGFjaFN0YXRlLWV4cGVydDogdHJ1ZQorCitJZ25vcmVDaGFuZ2VzLW5hbWU6IElnbm9yZSBjaGFuZ2VzCitJZ25vcmVDaGFuZ2VzLWRlc2M6IElmIGZhbHNlLCB0aGVuIE9wZW5KUEEgbXVzdCBjb25zaWRlciBtb2RpZmljYXRpb25zLCBcCisJZGVsZXRpb25zLCBhbmQgYWRkaXRpb25zIGluIHRoZSBjdXJyZW50IHRyYXNuYWN0aW9uIHdoZW4gZXhlY3V0aW5nIGEgXAorCXF1ZXJ5LiAgRWxzZSwgT3BlbkpQQSBpcyBmcmVlIHRvIGlnbm9yZSBjaGFuZ2VzIGFuZCBleGVjdXRlIHRoZSBxdWVyeSBcCisJZGlyZWN0bHkgYWdhaW5zdCB0aGUgZGF0YSBzdG9yZS4KK0lnbm9yZUNoYW5nZXMtdHlwZTogUGVyc2lzdGVuY2UKK0lnbm9yZUNoYW5nZXMtY2F0OiBRdWVyaWVzCitJZ25vcmVDaGFuZ2VzLWRpc3BsYXlvcmRlcjogNTAKKworTm9udHJhbnNhY3Rpb25hbFJlYWQtbmFtZTogTm9uLXRyYW5zYWN0aW9uYWwgcmVhZAorTm9udHJhbnNhY3Rpb25hbFJlYWQtZGVzYzogSWYgdHJ1ZSwgdGhlbiBpdCBpcyBwb3NzaWJsZSB0byByZWFkIFwKKwlwZXJzaXN0ZW50IGRhdGEgb3V0c2lkZSB0aGUgY29udGV4dCBvZiBhIHRyYW5zYWN0aW9uLiBPdGhlcndpc2UsIGEgXAorCXRyYW5zYWN0aW9uIG11c3QgYmUgaW4gcHJvZ3Jlc3MgaW4gb3JkZXIgcmVhZCBkYXRhLgorTm9udHJhbnNhY3Rpb25hbFJlYWQtdHlwZTogUGVyc2lzdGVuY2UKK05vbnRyYW5zYWN0aW9uYWxSZWFkLWNhdDogUGVyc2lzdGVuY2UuVHJhbnNhY3Rpb25zCitOb250cmFuc2FjdGlvbmFsUmVhZC1kaXNwbGF5b3JkZXI6IDUwCisKK05vbnRyYW5zYWN0aW9uYWxXcml0ZS1uYW1lOiBOb24tdHJhbnNhY3Rpb25hbCB3cml0ZQorTm9udHJhbnNhY3Rpb25hbFdyaXRlLWRlc2M6IElmIHRydWUsIHRoZW4gaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgdG8gXAorCWZpZWxkcyBvZiBhIHBlcnNpc3RlbnQtbm9udHJhbnNhY3Rpb25hbCBvYmplY3Qgd2hlbiBhIHRyYW5zYWN0aW9uIGlzIG5vdCBcCisJaW4gcHJvZ3Jlc3MuIElmIGZhbHNlLCBzdWNoIGEgd3JpdGUgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uLgorTm9udHJhbnNhY3Rpb25hbFdyaXRlLXR5cGU6IFBlcnNpc3RlbmNlCitOb250cmFuc2FjdGlvbmFsV3JpdGUtY2F0OiBQZXJzaXN0ZW5jZS5UcmFuc2FjdGlvbnMKK05vbnRyYW5zYWN0aW9uYWxXcml0ZS1kaXNwbGF5b3JkZXI6IDUwCisKK011bHRpdGhyZWFkZWQtbmFtZTogTXVsdGl0aHJlYWRlZAorTXVsdGl0aHJlYWRlZC1kZXNjOiBJZiB0cnVlLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBwbGFucyB0byBoYXZlIG11bHRpcGxlIFwKKwl0aHJlYWRzIHNpbXVsdGFuZW91c2x5IGFjY2Vzc2luZyBhIHNpbmdsZSBjb250ZXh0IG9yIG9iamVjdCwgc28gbWVhc3VyZXMgXAorCW11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIHRocmVhZC1zYWZlLiBPdGhlcndpc2UsIFwKKwl0aGUgaW1wbGVtZW50YXRpb24gbmVlZCBub3QgYWRkcmVzcyB0aHJlYWQgc2FmZXR5LgorTXVsdGl0aHJlYWRlZC10eXBlOiBQZXJzaXN0ZW5jZQorTXVsdGl0aHJlYWRlZC1jYXQ6IFBlcnNpc3RlbmNlLk9wdGltaXphdGlvbgorTXVsdGl0aHJlYWRlZC1kaXNwbGF5b3JkZXI6IDUwCisKK0Nvbm5lY3Rpb25Vc2VyTmFtZS1uYW1lOiBDb25uZWN0aW9uIHVzZXJuYW1lCitDb25uZWN0aW9uVXNlck5hbWUtZGVzYzogVGhlIHVzZXJuYW1lIGZvciB0aGUgY29ubmVjdGlvbiBsaXN0ZWQgaW4gXAorCUNvbm5lY3Rpb25VUkwuCitDb25uZWN0aW9uVXNlck5hbWUtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvblVzZXJOYW1lLWNhdDogQ29ubmVjdGluZworQ29ubmVjdGlvblVzZXJOYW1lLWRpc3BsYXlvcmRlcjogNTAKKworQ29ubmVjdGlvblBhc3N3b3JkLW5hbWU6IENvbm5lY3Rpb24gcGFzc3dvcmQKK0Nvbm5lY3Rpb25QYXNzd29yZC1kZXNjOiBUaGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBpbiBcCisJQ29ubmVjdGlvblVzZXJOYW1lCitDb25uZWN0aW9uUGFzc3dvcmQtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvblBhc3N3b3JkLWNhdDogQ29ubmVjdGluZworQ29ubmVjdGlvblBhc3N3b3JkLWRpc3BsYXlvcmRlcjogNTAKKworQ29ubmVjdGlvblVSTC1uYW1lOiBDb25uZWN0aW9uIFVSTAorQ29ubmVjdGlvblVSTC1kZXNjOiBUaGUgVVJMIGZvciB0aGUgZGF0YSBzb3VyY2UuCitDb25uZWN0aW9uVVJMLXR5cGU6IENvbm5lY3RpbmcKK0Nvbm5lY3Rpb25VUkwtY2F0OiBDb25uZWN0aW5nCitDb25uZWN0aW9uVVJMLWRpc3BsYXlvcmRlcjogNTAKKworQ29ubmVjdGlvbkRyaXZlck5hbWUtbmFtZTogQ29ubmVjdGlvbiBkcml2ZXIKK0Nvbm5lY3Rpb25Ecml2ZXJOYW1lLWRlc2M6IFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBkYXRhYmFzZSBkcml2ZXIsIG9yIGFuIFwKKwlpbnN0YW5jZSBvZiBhIERhdGFTb3VyY2UgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGEgc291cmNlLgorQ29ubmVjdGlvbkRyaXZlck5hbWUtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbkRyaXZlck5hbWUtY2F0OiBDb25uZWN0aW5nCitDb25uZWN0aW9uRHJpdmVyTmFtZS1kaXNwbGF5b3JkZXI6IDUwCisKK0Nvbm5lY3Rpb25GYWN0b3J5TmFtZS1uYW1lOiBDb25uZWN0aW9uIGZhY3RvcnkgbmFtZQorQ29ubmVjdGlvbkZhY3RvcnlOYW1lLWRlc2M6IFRoZSBKTkRJIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gZmFjdG9yeSB0byB1c2UgXAorCWZvciBvYnRhaW5pbmcgY29ubmVjdGlvbnMuCitDb25uZWN0aW9uRmFjdG9yeU5hbWUtdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbkZhY3RvcnlOYW1lLWNhdDogQ29ubmVjdGluZy5BZHZhbmNlZAorQ29ubmVjdGlvbkZhY3RvcnlOYW1lLWRpc3BsYXlvcmRlcjogNTAKKworQ29ubmVjdGlvbkZhY3RvcnktbmFtZTogQ29ubmVjdGlvbiBmYWN0b3J5CitDb25uZWN0aW9uRmFjdG9yeS1kZXNjOiBUaGUgZmFjdG9yeSB0byB1c2UgZm9yIG9idGFpbmluZyBkYXRhc3RvcmUgY29ubmVjdGlvbnMuCitDb25uZWN0aW9uRmFjdG9yeS10eXBlOiBDb25uZWN0aW5nCitDb25uZWN0aW9uRmFjdG9yeS1jYXQ6IENvbm5lY3RpbmcuQWR2YW5jZWQKK0Nvbm5lY3Rpb25GYWN0b3J5LWRpc3BsYXlvcmRlcjogNTAKKworQ29ubmVjdGlvbkZhY3RvcnkyTmFtZS1uYW1lOiBVbm1hbmFnZWQgY29ubmVjdGlvbiBmYWN0b3J5IG5hbWUKK0Nvbm5lY3Rpb25GYWN0b3J5Mk5hbWUtZGVzYzogVGhlIEpOREkgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBmYWN0b3J5IHRvIHVzZSBcCisJZm9yIGZpbmRpbmcgdW5tYW5hZ2VkIGNvbm5lY3Rpb25zLiAgSWYgc3BlY2lmaWVkLCB0aGlzIGlzIHRoZSBjb25uZWN0aW9uIFwKKwl0aGF0IHdpbGwgYmUgdXNlZCBmb3Igb2J0YWluaW5nIHNlcXVlbmNlIG51bWJlcnMuCitDb25uZWN0aW9uRmFjdG9yeTJOYW1lLXR5cGU6IENvbm5lY3RpbmcKK0Nvbm5lY3Rpb25GYWN0b3J5Mk5hbWUtY2F0OiBDb25uZWN0aW5nLlhBCitDb25uZWN0aW9uRmFjdG9yeTJOYW1lLWRpc3BsYXlvcmRlcjogNTAKK0Nvbm5lY3Rpb25GYWN0b3J5Mk5hbWUtZXhwZXJ0OiB0cnVlCisKK0Nvbm5lY3Rpb25GYWN0b3J5Mi1uYW1lOiBVbm1hbmFnZWQgY29ubmVjdGlvbiBmYWN0b3J5CitDb25uZWN0aW9uRmFjdG9yeTItZGVzYzogVGhlIGZhY3RvcnkgdG8gdXNlIGZvciBvYnRhaW5pbmcgdW5tYW5hZ2VkIFwKKwlkYXRhc3RvcmUgY29ubmVjdGlvbnMuCitDb25uZWN0aW9uRmFjdG9yeTItdHlwZTogQ29ubmVjdGluZworQ29ubmVjdGlvbkZhY3RvcnkyLWNhdDogQ29ubmVjdGluZy5BZHZhbmNlZAorQ29ubmVjdGlvbkZhY3RvcnkyLWRpc3BsYXlvcmRlcjogNTAKKworUGVyc2lzdGVuY2VTZXJ2ZXItbmFtZTogUmVtb3RlIHBlcnNpc3RlbmNlIHN1cHBvcnQKK1BlcnNpc3RlbmNlU2VydmVyLWRlc2M6IERlZmluZSB0aGUgcmVtb3RlIHBlcnNpc3RlbmNlIHNlcnZlci4KK1BlcnNpc3RlbmNlU2VydmVyLXR5cGU6IEdlbmVyYWwKK1BlcnNpc3RlbmNlU2VydmVyLWNhdDogUGVyc2lzdGVuY2UuUmVtb3RlCitQZXJzaXN0ZW5jZVNlcnZlci1kaXNwbGF5b3JkZXI6IDUwCitQZXJzaXN0ZW5jZVNlcnZlci1leHBlcnQ6IHRydWUKK1BlcnNpc3RlbmNlU2VydmVyLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yZW1vdGUuVHJhbnNwb3J0CisKK0xvY2tNYW5hZ2VyLW5hbWU6IExvY2sgbWFuYWdlcgorTG9ja01hbmFnZXItZGVzYzogUGx1Z2luIHVzZWQgdG8gaGFuZGxlIGFjcXVpcmluZyBsb2NrcyBvbiBwZXJzaXN0ZW50IFwKKwlpbnN0YW5jZXMuICBNdXN0IGltcGxlbWVudCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkxvY2tNYW5hZ2VyLgorTG9ja01hbmFnZXItdHlwZTogR2VuZXJhbAorTG9ja01hbmFnZXItY2F0OiBMb2NraW5nCitMb2NrTWFuYWdlci1kaXNwbGF5b3JkZXI6IDUwCitMb2NrTWFuYWdlci1leHBlcnQ6IHRydWUKK0xvY2tNYW5hZ2VyLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Mb2NrTWFuYWdlcgorCitJbnZlcnNlTWFuYWdlci1uYW1lOiBJbnZlcnNlIG1hbmFnZXIKK0ludmVyc2VNYW5hZ2VyLWRlc2M6IFBsdWdpbiB1c2VkIHRvIG1hbmFnZSBpbnZlcnNlIHJlbGF0aW9ucyBkdXJpbmcgZmx1c2guIFwKKwlTZXQgdG8gdHJ1ZSB0byB1c2UgdGhlIGRlZmF1bHQgaW52ZXJzZSBtYW5hZ2VyLiAgQ3VzdG9tIGludmVyc2UgbWFuYWdlcnMgXAorCW11c3QgZXh0ZW5kIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuSW52ZXJzZU1hbmFnZXIuCitJbnZlcnNlTWFuYWdlci10eXBlOiBHZW5lcmFsCitJbnZlcnNlTWFuYWdlci1jYXQ6IFBlcnNpc3RlbmNlLkFkdmFuY2VkCitJbnZlcnNlTWFuYWdlci1kaXNwbGF5b3JkZXI6IDUwCitJbnZlcnNlTWFuYWdlci1leHBlcnQ6IHRydWUKK0ludmVyc2VNYW5hZ2VyLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5JbnZlcnNlTWFuYWdlcgorCitTYXZlcG9pbnRNYW5hZ2VyLW5hbWU6IFNhdmVwb2ludCBtYW5hZ2VyCitTYXZlcG9pbnRNYW5hZ2VyLWRlc2M6IFBsdWdpbiB1c2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHNhdmVwb2ludHMgZm9yIFwKKwlwYXJ0aWFsIHJvbGxiYWNrL2NvbW1pdCBzdXBwb3J0LiAgRGVmYXVsdHMgdG8gImluLW1lbSIuIEN1c3RvbSBzYXZlcG9pbnQgXAorCW1hbmFnZXJzIG11c3QgaW1wbGVtZW50IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU2F2ZXBvaW50TWFuYWdlci4KK1NhdmVwb2ludE1hbmFnZXItdHlwZTogR2VuZXJhbAorU2F2ZXBvaW50TWFuYWdlci1jYXQ6IFBlcnNpc3RlbmNlLkFkdmFuY2VkCitTYXZlcG9pbnRNYW5hZ2VyLWRpc3BsYXlvcmRlcjogNTAKK1NhdmVwb2ludE1hbmFnZXItZXhwZXJ0OiB0cnVlCitTYXZlcG9pbnRNYW5hZ2VyLWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TYXZlcG9pbnRNYW5hZ2VyCisKK09ycGhhbmVkS2V5QWN0aW9uLW5hbWU6IE9ycGhhbmVkIGtleSBhY3Rpb24KK09ycGhhbmVkS2V5QWN0aW9uLWRlc2M6IEFjdGlvbiB0byB0YWtlIHdoZW4gT3BlbkpQQSBkaXNjb3ZlcnMgYW4gb3JwaGFuZWQga2V5IFwKKyAgICBpbiB0aGUgZGF0YWJhc2UuICBNYXkgYmUgYSBjdXN0b20gYWN0aW9uIGltcGxlbWVudGluZyBcCisJb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50Lk9ycGhhbmVkS2V5QWN0aW9uLgorT3JwaGFuZWRLZXlBY3Rpb24tdHlwZTogR2VuZXJhbAorT3JwaGFuZWRLZXlBY3Rpb24tY2F0OiBQZXJzaXN0ZW5jZS5BZHZhbmNlZAorT3JwaGFuZWRLZXlBY3Rpb24tZGlzcGxheW9yZGVyOiA1MAorT3JwaGFuZWRLZXlBY3Rpb24tZXhwZXJ0OiB0cnVlCitPcnBoYW5lZEtleUFjdGlvbi1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5PcnBoYW5lZEtleUFjdGlvbgorCitEeW5hbWljRGF0YVN0cnVjdHMtbmFtZTogRHluYW1pYyBkYXRhIHN0cnVjdHMKK0R5bmFtaWNEYXRhU3RydWN0cy1kZXNjOiBXaGV0aGVyIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZSBjdXN0b20gc3RydWN0cyB0byBob2xkIFwKKwlhbmQgdHJhbnNmZXIgcGVyc2lzdGVudCBzdGF0ZSBpbiB0aGUgT3BlbkpQQSBkYXRhIGNhY2hlIGFuZCByZW1vdGUgXAorCXBlcnNpc3RlbmNlIGZyYW1ld29ya3MuICBEeW5hbWljIHN0cnVjdHMgY2FuIHJlZHVjZSBkYXRhIGNhY2hlIFwKKwltZW1vcnkgY29uc3VtcHRpb24sIHJlZHVjZSB0aGUgYW1vdW50IG9mIGRhdGEgc2VyaWFsaXplZCBiYWNrIGFuZCBmb3J0aCBcCisJdW5kZXIgcmVtb3RlIHBlcnNpc3RlbmNlLCBhbmQgaW1wcm92ZSB0aGUgb3ZlcmFsbCBwZXJmb3JtYW5jZSBcCisJb2YgdGhlc2Ugc3lzdGVtcy4gIEhvd2V2ZXIsIHRoZXkgaW5jcmVhc2UgYXBwbGljYXRpb24gd2FybS11cCB0aW1lIHdoaWxlIFwKKwl0aGUgY3VzdG9tIGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBhbmQgbG9hZGVkIGludG8gdGhlIEpWTS4gIFNldCB0byB0cnVlIHRvIFwKKwllbmFibGUgZHluYW1pYyBkYXRhIHN0cnVjdHMuCitEeW5hbWljRGF0YVN0cnVjdHMtdHlwZTogR2VuZXJhbAorRHluYW1pY0RhdGFTdHJ1Y3RzLWNhdDogT3B0aW1pemF0aW9uCitEeW5hbWljRGF0YVN0cnVjdHMtZGlzcGxheW9yZGVyOiA1MAorRHluYW1pY0RhdGFTdHJ1Y3RzLWV4cGVydDogdHJ1ZQorCitNZXRhRGF0YUZhY3RvcnktbmFtZTogTWV0YWRhdGEgZmFjdG9yeQorTWV0YURhdGFGYWN0b3J5LWRlc2M6IFRoZSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3RvcnkgdGhhdCBcCisgICAgcHJvdmlkZXMgcGVyc2lzdGVuY2UgbWV0YWRhdGEuCitNZXRhRGF0YUZhY3RvcnktdHlwZTogR2VuZXJhbAorTWV0YURhdGFGYWN0b3J5LWNhdDogTWFwcGluZ3MKK01ldGFEYXRhRmFjdG9yeS1kaXNwbGF5b3JkZXI6IDUwCitNZXRhRGF0YUZhY3RvcnktaW50ZXJmYWNlOiBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3RvcnkKKworTWV0YURhdGFSZXBvc2l0b3J5LW5hbWU6IE1ldGFkYXRhIHJlcG9zaXRvcnkKK01ldGFEYXRhUmVwb3NpdG9yeS1kZXNjOiBUaGUgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5IHRoYXQgXAorICAgIG1hbmFnZXMgcGVyc2lzdGVuY2UgbWV0YWRhdGEuCitNZXRhRGF0YVJlcG9zaXRvcnktdHlwZTogR2VuZXJhbAorTWV0YURhdGFSZXBvc2l0b3J5LWNhdDogTWFwcGluZ3MKK01ldGFEYXRhUmVwb3NpdG9yeS1kaXNwbGF5b3JkZXI6IDUwCitNZXRhRGF0YVJlcG9zaXRvcnktaW50ZXJmYWNlOiBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnkKKworTWFwcGluZy1uYW1lOiBEYXRhc3RvcmUgbWFwcGluZworTWFwcGluZy1kZXNjOiBUaGUgbmFtZSBvZiB0aGUgZGF0YXN0b3JlIG1hcHBpbmcgdG8gdXNlLgorTWFwcGluZy10eXBlOiBQZXJzaXN0ZW5jZQorTWFwcGluZy1jYXQ6IE1hcHBpbmdzCitNYXBwaW5nLWRpc3BsYXlvcmRlcjogNTAKKworQ29tcGF0aWJpbGl0eS1uYW1lOiBDb21wYXRpYmlsaXR5IEluZm9ybWF0aW9uCitDb21wYXRpYmlsaXR5LWRlc2M6IERldGFpbHMgYWJvdXQgdmFyaW91cyBjb21wYXRpYmlpdHkgb3B0aW9ucyBmb3IgdGhlIGN1cnJlbnQgXAorCWVudmlyb25tZW50LgorQ29tcGF0aWJpbGl0eS10eXBlOiBHZW5lcmFsCitDb21wYXRpYmlsaXR5LWNhdDogUGVyc2lzdGVuY2UuQWR2YW5jZWQKK0NvbXBhdGliaWxpdHktZGlzcGxheW9yZGVyOiA1MAorQ29tcGF0aWJpbGl0eS1leHBlcnQ6IHRydWUKK0NvbXBhdGliaWxpdHktaW50ZXJmYWNlOiBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5Db21wYXRpYmlsaXR5CisKK1F1ZXJ5Q29tcGlsYXRpb25DYWNoZS1uYW1lOiBRdWVyeSBjb21waWxhdGlvbiBjYWNoZQorUXVlcnlDb21waWxhdGlvbkNhY2hlLWRlc2M6IFBsdWdpbiB1c2VkIHRvIGNhY2hlIHF1ZXJ5IGNvbXBpbGF0aW9uIGRhdGEuIFwKKyAgICBNdXN0IGltcGxlbWVudCBqYXZhLnV0aWwuTWFwLiBEb2VzIG5vdCBuZWVkIHRvIGJlIHRocmVhZC1zYWZlIC0tIGl0IHdpbGwgXAorICAgIGJlIHdyYXBwZWQgdmlhIHRoZSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoKSBtZXRob2QgaWYgaXQgZG9lcyBub3QgXAorICAgIGV4dGVuZCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DYWNoZU1hcC4KK1F1ZXJ5Q29tcGlsYXRpb25DYWNoZS10eXBlOiBHZW5lcmFsCitRdWVyeUNvbXBpbGF0aW9uQ2FjaGUtY2F0OiBDYWNoZS5RdWVyaWVzCitRdWVyeUNvbXBpbGF0aW9uQ2FjaGUtZGlzcGxheW9yZGVyOiA1MAorUXVlcnlDb21waWxhdGlvbkNhY2hlLWV4cGVydDogdHJ1ZQorUXVlcnlDb21waWxhdGlvbkNhY2hlLWludGVyZmFjZTogamF2YS51dGlsLk1hcAorCituby1uYW1lZC1jZjogdXNlIGEgRGF0YVNvdXJjZSBib3VuZCB0byBKTkRJCitkaWZmLXNwZWNzOiBBdHRlbXB0IHRvIGNvbmZpZ3VyZSBmb3IgbXVsdGlwbGUgc3BlY2lmaWNhdGlvbnMuICBXYXMgY29uZmlndXJlZCBcCisJZm9yICJ7MH0iLiAgQXR0ZW1wdCB0byBub3cgY29uZmlndXJlIGZvciAiezF9Ii4gIFRoaXMgYXR0ZW1wdCB3aWxsIGJlIFwKKwlpZ25vcmVkLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyYzBiMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9kYXRhY2FjaGUvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw4NiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCityZW1vdmVhbGwtYnljbGFzczogVGhlIGRhdGFjYWNoZSBkb2VzIG5vdCBzdXBwb3J0IGF1dG9tYXRpYyByZW1vdmFsIG9mIFwKKwlzdWJjbGFzc2VzLgorbmVzdGVkLWV4Y2VwczogVGhpcyBvcGVyYXRpb24gZmFpbGVkIGZvciBzb21lIGluc3RhbmNlcy4gIFNlZSB0aGUgbmVzdGVkIFwKKwlleGNlcHRpb25zIGFycmF5IGZvciBkZXRhaWxzLgorZXhwLWxpc3RlbmVyLWV4OiBBbiBleGNlcHRpb24gd2FzIHRocm93biB3aGlsZSBleGVjdXRpbmcgYW4gZXhwaXJhdGlvbiBcCisJbGlzdGVuZXIgY2FsbGJhY2sgbWV0aG9kLiBJdCB3YXMgaW50ZXJjZXB0ZWQuIFRoZSBldmVudCBmcmFtZXdvcmsgXAorCWNvbnN1bWVzIGFueSBleGNlcHRpb25zIHRoYXQgYW4gRXhwaXJhdGlvbkxpc3RlbmVyIG1heSB0aHJvdy4KK2ludGVycnVwdDogVGhpcyB0aHJlYWQgaGFzIGJlZW4gaW50ZXJydXB0ZWQuCitjYWNoZS10aW1lb3V0OiBUaGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBrZXkgInswfSIgaGFzIHRpbWVkIG91dC4KK2NhY2hlLWFscmVhZHktY29uZmlndXJlZDogQ2Fubm90IGludm9rZSB0aGlzIG1ldGhvZCwgYXMgdGhlIGNhY2hlIGhhcyBcCisJYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuCitpbnZhbGlkLXR5cGU6IEludmFsaWQgY2FjaGUgdHlwZSAiezB9Ii4gQWxsb3dlZCB0eXBlcyBhcmUgImRpc3RyaWJ1dGVkIiwgXAorCSJyZXBsaWNhdGVkIiwgb3IgIm5hbWVkIi4KK2NhY2hlLW1pc3M6IENhY2hlIG1pc3Mgd2hpbGUgbG9va2luZyB1cCBrZXkgInswfSIuCitjYWNoZS1oaXQ6IENhY2hlIGhpdCB3aGlsZSBsb29raW5nIHVwIGtleSAiezB9Ii4KK2NhY2hlLXB1dDogUHV0IGtleSAiezB9IiBpbnRvIGNhY2hlLgorY2FjaGUtcmVtb3ZlY2xhc3M6IENhY2hlIHJlbW92aW5nIGNsYXNzICJ7MH0iLgorY2FjaGUtcmVtb3ZlLW1pc3M6IENhY2hlIG1pc3Mgd2hpbGUgcmVtb3Zpbmcga2V5ICJ7MH0iLgorY2FjaGUtcmVtb3ZlLWhpdDogQ2FjaGUgaGl0IHdoaWxlIHJlbW92aW5nIGtleSAiezB9Ii4KK2NhY2hlLWNsZWFyOiBDbGVhcmluZyBkYXRhc3RvcmUgY2FjaGUgInswfSIuCitjYWNoZS1waW4taGl0OiBQaW5uaW5nIGtleSAiezB9Ii4gS2V5IGlzIGN1cnJlbnRseSBpbiB0aGUgY2FjaGUuCitjYWNoZS1waW4tbWlzczogUGlubmluZyBrZXkgInswfSIuIEtleSBpcyBjdXJyZW50bHkgbm90IGluIHRoZSBjYWNoZS4KK2NhY2hlLXVucGluLWhpdDogVW5waW5uaW5nIGtleSAiezB9Ii4gS2V5IGlzIGN1cnJlbnRseSBpbiB0aGUgY2FjaGUuCitjYWNoZS11bnBpbi1taXNzOiBVbnBpbm5pbmcga2V5ICJ7MH0iLiBLZXkgaXMgY3VycmVudGx5IG5vdCBpbiB0aGUgY2FjaGUuCitjYWNoZS1leHBpcmVkOiBLZXkgInswfSIgd2FzIGV4cGlyZWQgZnJvbSB0aGUgY2FjaGUuCitjYWNoZS1jb21taXQ6IFBlcmZvcm1pbmcgYSBjb21taXQgb24gdGhlIGNhY2hlLiBBZGRpbmcgezB9LCBcCisJdXBkYXRpbmcgezF9IGFuZCB7Mn0sIGFuZCByZW1vdmluZyB7M30uCitjYWNoZS1zdGF0czogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgY2FjaGUgezB9OiBoaXRzOiB7MX07IG1pc3NlczogezJ9OyBoaXQgXAorCXJhdGlvOiB7M30KK2NhY2hlLWNsYXNzLXBpbjogVGhlIGNhY2hlICJ7MH0iIGRvZXMgbm90IHN1cHBvcnQgcGVyLWNsYXNzIHBpbm5pbmcuCitjYWNoZS1jbGFzcy11bnBpbjogVGhlIGNhY2hlICJ7MH0iIGRvZXMgbm90IHN1cHBvcnQgcGVyLWNsYXNzIHBpbm5pbmcuCitjYWNoZS1jbGFzcy11bnBpbi1hbGw6IFRoZSBjYWNoZSAiezB9IiBkb2VzIG5vdCBzdXBwZXIgcGVyLWNsYXNzIHBpbm5pbmcuICBcCisgICAgQWxsIHBpbm5lZCBrZXlzIHdpbGwgYmUgdW4tcGlubmVkLgorbGlzdC1jbG9zZWQ6IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhpcyBsaXN0LCBhcyB0aGUgbGlzdCBoYXMgXAorCWJlZW4gY2xvc2VkLgorcXVlcnktY2FjaGUtbWlzcy1ldmljdDogUXVlcnkgY2FjaGUgbWlzcyB3aGlsZSBsb29raW5nIHVwIGtleSAiezB9Ii4gVGhlIFwKKwlrZXkgd2FzIGluIHRoZSBjYWNoZSwgYnV0IHRoZSByZXN1bHRzIGhhdmUgZXhwaXJlZC4KK3F1ZXJ5LWNhY2hlLW1pc3M6IFF1ZXJ5IGNhY2hlIG1pc3Mgd2hpbGUgbG9va2luZyB1cCBrZXkgInswfSIuCitxdWVyeS1jYWNoZS1oaXQ6IFF1ZXJ5IGNhY2hlIGhpdCB3aGlsZSBsb29raW5nIHVwIGtleSAiezB9Ii4KK3F1ZXJ5LWNhY2hlLXB1dDogUHV0IGtleSAiezB9IiBpbnRvIHF1ZXJ5IGNhY2hlLgorcXVlcnktY2FjaGUtcmVtb3ZlLW1pc3M6IFF1ZXJ5IGNhY2hlIG1pc3Mgd2hpbGUgcmVtb3Zpbmcga2V5ICJ7MH0iLgorcXVlcnktY2FjaGUtcmVtb3ZlLWhpdDogUXVlcnkgY2FjaGUgaGl0IHdoaWxlIHJlbW92aW5nIGtleSAiezB9Ii4KK3F1ZXJ5LWNhY2hlLWNsZWFyOiBDbGVhcmluZyBxdWVyeSBjYWNoZS4KK3F1ZXJ5LWNhY2hlLWtleS1leHBpcmVkOiBLZXkgInswfSIgaGFzIGV4cGlyZWQgZnJvbSB0aGUgcXVlcnkgY2FjaGUuCitxdWVyeS1jYWNoZS1rZXktcmVtb3ZlZDogS2V5ICJ7MH0iIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcXVlcnkgY2FjaGUuCityZWctbWJlYW46IFJlZ2lzdGVyZWQgTUJlYW4gKHswfSkuCitjYW50LXJlZy1tYmVhbjogVW5hYmxlIHRvIHJlZ2lzdGVyIERhdGFzdG9yZSBDYWNoZSB7MH0gTUJlYW4uCitxdWVyeS1jYWNoZS1uYW1lOiAgUXVlcnkgQ2FjaGUKK3NjaGVkdWxlci1zdGFydDogU3RhcnRpbmcgY2FjaGUgc2NoZWR1bGVyIHRocmVhZCAiezB9Ii4uLgorc2NoZWR1bGVyLW5hbWU6IE9wZW5KUEEgQ2FjaGUgU2NoZWR1bGVyCitzY2hlZHVsZXItaW50ZXJ2YWw6IENhY2hlIHNjaGVkdWxlIHRocmVhZCB3aWxsIGNoZWNrIGV2ZXJ5ICJ7MH0iIG1pbi4KK3NjaGVkdWxlci1jbGVhcjogU2NoZWR1bGVkIGNhY2hlIGV2aWN0aW9uIGF0IHRpbWUgInsxfSIgZm9yIGNhY2hlOiJ7MH0iCitzY2hlZHVsZXItc3RvcDogU3RvcHBpbmcgc2NoZWR1bGVkIGNhY2hlIGV2aWN0aW9uIHRocmVhZC4KK3NjaGVkdWxlci1mYWlsOiBDYWNoZSBzY2hlZHVsZXIgdGhyZWFkIHVuZXhwZWN0ZWRseSBpbnRlcnJ1cHRlZC4gU3RvcHBpbmcgXAorCXNjaGVkdWxlci4KK2JhZC1zY2hlZHVsZTogSW52YWxpZCBzY2hlZHVsZSBzdHJpbmc6ICJ7MH0iCitub3QtbnVtYmVyOiBUb2tlbiAiezB9IiBpcyBub3QgYSB2YWxpZCBudW1iZXIgb3Igd2lsZGNhcmQgKCopIGZvciBzY2hlZHVsZS4KK2JhZC1jb3VudDogSW52YWxpZCBudW1iZXIgb2YgdG9rZW5zIGluIHN0cmluZyAiezB9IiBmb3IgY2FjaGUgc2NoZWR1bGUuICBcCisJVGhlcmUgc2hvdWxkIGJlIGZpdmUgdG9rZW5zIChtaW51dGUsIGhvdXIsIGRvbSwgbW9udGgsIGRvdykuCitub3QtcmFuZ2U6IFRoZSB0b2tlbiAiezB9IiBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICh7MX0sIHsyfSkuCitkZXNlcmlhbGl6ZS1jbGFzc25vdGZvdW5kOiBEZXNlcmlhbGl6YXRpb24gZXJyb3IsIHVuYWJsZSB0byBmaW5kIGNsYXNzLgorbm8tZGVmYXVsdC1jYWNoZTogTm9uZSBvZiB0aGUgZGF0YSBjYWNoZSBpbnN0YW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gXAorCXN0cmluZyAiezB9IiBhcmUgY29uZmlndXJlZCB0byBiZSB0aGUgZGVmYXVsdCBkYXRhIGNhY2hlLiBUaGVyZSBtdXN0IGJlIFwKKwlvbmUgYW5kIG9ubHkgb25lIGNhY2hlIHdob3NlIG5hbWUgaXMgInsxfSIsIG9yIHdob3NlIG5hbWUgaXMgbm90IHNwZWNpZmllZC4KK211bHRpLWRlZmF1bHQtY2FjaGU6IE1vcmUgdGhhbiBvbmUgb2YgdGhlIGRhdGEgY2FjaGUgaW5zdGFuY2VzIGluIHRoZSBcCisJY29uZmlndXJhdGlvbiBzdHJpbmcgInswfSIgYXJlIGNvbmZpZ3VyZWQgdG8gYmUgdGhlIGRlZmF1bHQgZGF0YSBjYWNoZS4gXAorCVRoZXJlIG11c3QgYmUgb25lIGFuZCBvbmx5IG9uZSBjYWNoZSB3aG9zZSBuYW1lIGlzICJ7MX0iLCBvciB3aG9zZSBuYW1lIGlzIFwKKwlub3Qgc3BlY2lmaWVkLgorCQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2VlL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2VlL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTllODQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvZWUvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIw0KKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIw0KKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorIyB1bmRlciB0aGUgTGljZW5zZS4gIA0KKw0KK3RtLW5vdC1mb3VuZDogQ291bGQgbm90IHBlcmZvcm0gYXV0b21hdGljIGxvb2t1cCBvZiBFSkIgY29udGFpbmVyJydzIFwNCisJamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25NYW5hZ2VyIGltcGxlbWVudGF0aW9uLiBQbGVhc2UgZW5zdXJlIHRoYXQgXA0KKwl5b3UgYXJlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGZyb20gd2l0aGluIGFuIEVKQiAxLjEgY29tcGxpYW50IEVKQiBcDQorCWNvbnRhaW5lciwgYW5kIHRoZW4gc2V0IHRoZSBvcmcuYXBhY2hlLm9wZW5qcGEuTWFuYWdlZFJ1bnRpbWUgcHJvcGVydHkgdG8gdGhlIFwNCisJYXBwcm9wcmlhdGUgdmFsdWUgdG8gb2J0YWluIHRoZSBUcmFuc2FjdGlvbk1hbmFnZXIuDQorZXhwZWN0ZWQtcmVmZXJlbmNlOiBFeHBlY3RlZCBvYmplY3QgdG8gYmUgb2YgdHlwZSBSZWZlcmVuY2UsIGJ1dCBpbnN0ZWFkIHdhcyBcDQorCSJ7MH0iLg0KK25vdC1zdXBwb3J0ZWQ6IFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuDQord2FzLXVuc3VwcG9ydGVkLW9wOiBVbmFibGUgdG8gZXhlY3V0ZSB7MH0gb24gYSBXZWJTcGhlcmUgbWFuYWdlZCB0cmFuc2FjdGlvbi4gXA0KKwlXZWJTcGhlcmUgZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3QgbWFuaXB1bGF0aW9uIG9mIG1hbmFnZWQgdHJhbnNhY3Rpb25zLg0KK3dhcy10cmFuc2FjdGlvbi1pZC1leGNlcHRpb246IFVuYWJsZSB0byBkZXRlcm1pbmUgaWRlbnRpdHkgb2YgdGhlIGN1cnJlbnQgV2ViU3BoZXJlIFwNCisJbWFuYWdlZCB0cmFuc2FjdGlvbi4gUGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIgYXJlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGZyb20gXA0KKwl3aXRoaW4gV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciAodmVyc2lvbiA1LjAuMiBvciBuZXdlcikuDQord2FzLXJlZmxlY3Rpb24tZXhjZXB0aW9uOiBBbiBlcnJvciBvY2N1cmVkIHJlZmxlY3RpbmcgV2ViU3BoZXJlIHByb3ByaWV0YXJ5IFwNCisJaW50ZXJmYWNlcy4gUGxlYXNlIGVuc3VyZSB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb24gZnJvbSB3aXRoaW4gXA0KKwlXZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyICh2ZXJzaW9uIDUuMC4yIG9yIG5ld2VyKS4NCit3YXMtbG9va3VwLWVycm9yOiBBbiBlcnJvciBvY2N1cnJlZCBsb29raW5nIHVwIHRoZSBXZWJTcGhlcmUgZXh0ZW5kZWQgSlRBIFwNCisJc2VydmljZS4gUGxlYXNlIGVuc3VyZSB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb24gZnJvbSB3aXRoaW4gV2ViU3BoZXJlIFwNCisJQXBwbGljYXRpb24gU2VydmVyICh2ZXJzaW9uIDUuMC4yIG9yIG5ld2VyKS4NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9lbmhhbmNlL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGFlYjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDEyMiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitjb3B5LW5vLW9pZDogQ2Fubm90IGNvcHkgaWRlbnRpdHkgZm9yIGFic3RyYWN0IHR5cGUgInswfSIuCituby1tZXRhOiBObyByZWdpc3RlcmVkIG1ldGFkYXRhIGZvciB0eXBlICJ7MH0iLgorYmFkLWdldHRlcjogTWlzc2luZyBnZXR0ZXIgZm9yIHByb3BlcnR5ICJ7MX0iIGluIHR5cGUgInswfSIuIAorYmFkLXNldHRlcjogTWlzc2luZyBzZXR0ZXIgZm9yIHByb3BlcnR5ICJ7MX0iIGluIHR5cGUgInswfSIuIAorYmFkLWZpZWxkOiBNaXNzaW5nIGZpZWxkIGZvciBwcm9wZXJ0eSAiezF9IiBpbiB0eXBlICJ7MH0iLgorcmVmbGVjdC1zZWN1cml0eTogVW5hYmxlIHRvIGFjY2VzcyAiezB9IiB2aWEgcmVmbGVjdGlvbi4gIE1ha2Ugc3VyZSBPcGVuSlBBIFwKKyAgICBoYXMgdGhlICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyIgcGVybWlzc2lvbi4KK25lZWRzLXJ1bnRpbWUtZW5oYW5jZTogInswfSIgcmVxdWlyZXMgcnVudGltZSBlbmhhbmNlbWVudDogezF9CitydW50aW1lLWVuaGFuY2UtcGNjbGFzc2VzOiBZb3UgaGF2ZSBlbmFibGVkIHJ1bnRpbWUgZW5oYW5jZW1lbnQsIGJ1dCBoYXZlIG5vdCBcCisJc3BlY2lmaWVkIHRoZSBzZXQgb2YgcGVyc2lzdGVudCBjbGFzc2VzLiAgT3BlbkpQQSBtdXN0IGxvb2sgZm9yIG1ldGFkYXRhIFwKKyAgICBmb3IgZXZlcnkgbG9hZGVkIGNsYXNzLCB3aGljaCBtaWdodCBpbmNyZWFzZSBjbGFzcyBsb2FkIHRpbWVzIHNpZ25pZmljYW50bHkuCitydW5uaW5nLWFsbC1jbGFzc2VzOiBObyB0YXJnZXRzIHdlcmUgZ2l2ZW4uICBSdW5uaW5nIG9uIGFsbCBjbGFzc2VzIGluIHlvdXIgXAorICAgIHBlcnNpc3RlbnQgY2xhc3NlcyBsaXN0LCBvciBhbGwgbWV0YWRhdGEgZmlsZXMgaW4gY2xhc3NwYXRoIGRpcmVjdG9yaWVzIGlmIFwKKwl5b3UgaGF2ZSBub3QgbGlzdGVkIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzLiAgVXNlIC1oZWxwIHRvIGRpc3BsYXkgdG9vbCBcCisgICAgdXNhZ2UgaW5mb3JtYXRpb24uCitkZXRhY2gtY3VzdG9tLXNlcjogVHlwZSAiezB9IiBpcyBzZXQgdG8gZGV0YWNoIG9uIHNlcmlhbGl6ZSwgYnV0IGltcGxlbWVudHMgXAorCWEgY3VzdG9tIHJlYWRPYmplY3QgYW5kL29yIHdyaXRlT2JqZWN0IG1ldGhvZC4gIFlvdSBjYW5ub3QgdXNlIGN1c3RvbSBcCisJc2VyaWFsaXphdGlvbiB3aXRoIGRldGFjaG1lbnQuIAorZGV0YWNoLWN1c3RvbS1leHRlcm46IFR5cGUgInswfSIgaXMgc2V0IHRvIGRldGFjaCBvbiBzZXJpYWxpemUsIGJ1dCBpbXBsZW1lbnRzIFwKKwlhIGN1c3RvbSByZWFkRXh0ZXJuYWwgYW5kL29yIHdyaXRlRXh0ZXJuYWwgbWV0aG9kLiAgWW91IGNhbm5vdCB1c2UgY3VzdG9tIFwKKwlzZXJpYWxpemF0aW9uIHdpdGggZGV0YWNobWVudC4gCitlbmhhbmNlLXN0YXJ0OiBFbmhhbmNpbmcgdHlwZSAiezB9Ii4KK3BjLXR5cGU6IFR5cGUgInswfSIgaXMgYWxyZWFkeSBwZXJzaXN0ZW5jZSBjYXBhYmxlOyBza2lwcGluZy4KK3BlcnMtYXdhcmU6IFR5cGUgInswfSIgaGFzIG5vIG1ldGFkYXRhOyBlbmhhbmNpbmcgYXMgcGVyc2lzdGVuY2UgYXdhcmUuIFwKKwlJZiB5b3UgaW50ZW5kZWQgZm9yICJ7MH0iIHRvIGJlIHBlcnNpc3RlbmNlLWNhcGFibGUsIHRoZW4gdGhpcyBtZWFucyB0aGF0IFwKKwlPcGVuSlBBIGNvdWxkIG5vdCBmaW5kIGFueSBtZXRhZGF0YSBmb3IgInswfSIuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgXAorCWRpcmVjdG9yeSBjb250YWluaW5nIHlvdXIgbWV0YWRhdGEgaXMgbm90IGluIHlvdXIgQ0xBU1NQQVRILCBvciBpZiB5b3VyIFwKKwltZXRhZGF0YSBmaWxlcyBhcmUgbm90IG5hbWVkIHByb3Blcmx5LiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gbWV0YWRhdGEgXAorCXBsYWNlbWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK2VuaGFuY2UtcnVubmluZzogRW5oYW5jZXIgcnVubmluZyBvbiB0eXBlICJ7MH0iLgorZW5oYW5jZS1hd2FyZTogVGhlIGNsYXNzIGRvZXMgbm90IGhhdmUgbWV0YWRhdGEgLSBlbmhhbmNlZCBhcyBwZXJzaXN0ZW5jZS1hd2FyZS4KK2VuaGFuY2Utbm9ydW46IFRoZSBjbGFzcyBpcyBhbHJlYWR5IHBlcnNpc3RlbmNlIGNhcGFibGUgLSBubyBlbmhhbmNlbWVudCBcCisJcGVyZm9ybWVkLgorZW5oYW5jZS1pbnRlcmZhY2U6IFRoZSBjbGFzcyBpcyBhIG1hbmFnZWQgaW50ZXJmYWNlIC0gbm8gZW5oYW5jZW1lbnQgcGVyZm9ybWVkLgorZW5oYW5jZS11c2FnZTogVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENFbmhhbmNlclxuXAorCVx0Wy1wcm9wZXJ0aWVzLy1wIDxwcm9wZXJ0aWVzIGZpbGUgb3IgcmVzb3VyY2U+XVxuXAorCVx0Wy08cHJvcGVydHkgbmFtZT4gPHByb3BlcnR5IHZhbHVlPl0qXG5cCisJXHRbLWRpcmVjdG9yeS8tZCA8b3V0cHV0IGRpcmVjdG9yeT5dXG5cCisJXHRbLWFkZERlZmF1bHRDb25zdHJ1Y3Rvci8tYWRjIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstamRvRW5oYW5jZS8tamRvIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstZW5mb3JjZVByb3BlcnR5UmVzdHJpY3Rpb25zLy1lcHIgPHRydWUvdCB8IGZhbHNlL2Y+XVxuXAorCVx0Wy10bXBDbGFzc0xvYWRlci8tdGNsIDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdDxjbGFzcyBuYW1lIHwgLmphdmEgZmlsZSB8IC5jbGFzcyBmaWxlIHwgLmpkbyBmaWxlPisgCitlbmhhbmNlLWRlZmF1bHRjb25zdDogVGhlIHR5cGUgInswfSIgbXVzdCBoYXZlIGEgbm8tYXJncyBjb25zdHJ1Y3Rvci4KK2VuaGFuY2UtYWRkZGVmYXVsdGNvbnN0OiBUaGUgdHlwZSAiezB9IiBtdXN0IGhhdmUgYSBuby1hcmdzIGNvbnN0cnVjdG9yLiBcCisJQWRkaW5nIGEgezF9IG5vLWFyZ3MgY29uc3RydWN0b3IuCitlbmhhbmNlLWNsb25lYWJsZTpUaGUgdHlwZSAiezB9IiBpbXBsZW1lbnRzIENsb25lYWJsZSBidXQgZG9lcyBub3QgY2FsbCBcCisJc3VwZXIuY2xvbmUgKCkuICBBZGRpbmcgcHJvdGVjdGVkIHN1cGVyLmNsb25lICgpIGludm9jYXRpb24uCitlbmhhbmNlLXVpZC1hY2Nlc3M6IEFuIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gb2NjdXJlZCB3aGVuIHRyeWluZyB0byBcCisJb2J0YWluIHRoZSBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIGZvciB0aGUgY2xhc3MgInswfSIuIFRoaXMgaXMgYSBrbm93biBcCisJYnVnIGluIEpESyAxLjQrIHdoZW4gdXNpbmcgYSBjdXN0b20gQ2xhc3NMb2FkZXIgdG8gZW5oYW5jZSBhIFwKKwljbGFzcyB0aGF0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUuIElmIGNvbXBhdGliaWxpdHkgd2l0aCBcCisJbm9uLWVuaGFuY2VkIHZlcnNpb25zIG9mICJ7MH0iIGlzIG5vdCBuZWVkZWQsIHRoaXMgd2FybmluZyBjYW4gYmUgaWdub3JlZC4KK2VuaGFuY2UtZGVmY29ucy1leHRlcm46IFR5cGUgInswfSIgcmVxdWlyZXMgYSBwdWJsaWMgY29uc3RydWN0b3IgdG8gc3VwcG9ydCBcCisgICAgZGV0YWNoIG9uIHNlcmlhbGl6ZS4gIE1ha2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yIHB1YmxpYy4KK2NvbnMtYWNjZXNzOiBBbiBlcnJvciBvY2N1cnJlZCB0cnlpbmcgdG8gaW5zdGFudGlhdGUgYSBjdXN0b20gc3RvcmFnZSBjbGFzcy4KK3BjZGF0YS1nZW5lcmF0ZTogR2VuZXJhdGluZyBkeW5hbWljIFBDRGF0YSBmb3IgdHlwZTogInswfSIKK3BjZGF0YS1jcmVhdGVkOiBEeW5hbWljIFBDRGF0YSBjcmVhdGVkOiBuYW1lPSJ7MH0iLCBmb3IgdHlwZT0iezF9IgorZmFjdG9yeS1ub3Qtb2lkbG9hZGVyOiBBdHRlbXB0IHRvIHJ1biB0aGUgYXBwbGljYXRpb24gaWQgdG9vbCB1bmRlciBtZXRhZGF0YSBcCisJY29uZmlndXJhdGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQuICBUaGUgYXBwbGljYXRpb24gaWQgdG9vbCBjYW4gb25seSBcCisJcnVuIHVuZGVyIGNlcnRhaW4gbWV0YWRhdGEgZmFjdG9yeSBzZXR0aW5ncy4KK3N0ci1jb25zOiBUaGUgaWQgdHlwZSAiezB9IiBzcGVjZmllZCBieSBwZXJzaXN0ZW50IHR5cGUgInsxfSIgZG9lcyBub3QgaGF2ZSBhIFwKKwlwdWJsaWMgc3RyaW5nIG9yIGNsYXNzICsgc3RyaW5nIGNvbnN0cnVjdG9yLgorYXBwaWQtc3RhcnQ6IEdlbmVyYXRpbmcgYW4gYXBwbGljYXRpb24gaWQgZm9yIHR5cGUgInswfSIuCithcHBpZC1pbnZhbGlkOiBUeXBlICJ7MH0iIGRvZXMgbm90IGhhdmUgbWV0YWRhdGEsIGRvZXMgbm90IHVzZSBhcHBsaWNhdGlvbiBcCisJaWRlbnRpdHksIHVzZXMgYSBidWlsdC1pbiBpZGVudGl0eSB0eXBlLCBvciBpbmhlcml0cyB0aGUgaWRlbnRpdHkgY2xhc3MgXAorCWZyb20gaXRzIHN1cGVyY2xhc3MuIAorYXBwaWQtd2FybjogVHlwZSAiezB9IiBkb2VzIG5vdCBoYXZlIG1ldGFkYXRhLCBkb2VzIG5vdCB1c2UgYXBwbGljYXRpb24gXAorCWlkZW50aXR5LCBvciBpbmhlcml0cyB0aGUgaWRlbnRpdHkgY2xhc3MgZnJvbSBpdHMgc3VwZXJjbGFzczsgc2tpcHBpbmcuCituYW1lLW11bHQtYXJnczogV2hlbiB5b3Ugc3VwcGx5IHRoZSAtbmFtZSBvcHRpb24sIHlvdSBtdXN0IHJ1biB0aGUgdG9vbCBvbiBcCisJZXhhY3RseSBvbmUgY2xhc3MuICBBdHRlbXB0IHRvIHJ1biBvbiBtdWx0aXBsZSBjbGFzc2VzOiB7MH0KK25vLWlkLWNsYXNzOiBUeXBlICJ7MH0iIGRvZXMgbm90IGRlY2xhcmUgYW4gaWQgY2xhc3MuCituby1wa3M6IFR5cGUgInswfSIgZG9lcyBub3QgZGVjbGFyZSBhbnkgcHJpbWFyeSBrZXkgZmllbGRzLgorYXBwaWQtcnVubmluZzogQXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbCBydW5uaW5nIG9uIHR5cGUgInswfSIuCithcHBpZC1vdXRwdXQ6IFdyaXRpbmcgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MgdG8gZmlsZSAiezB9Ii4gCithcHBpZC1ub3J1bjogTm8gaWRlbnRpdHkgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmb3IgdGhpcyB0eXBlLgorYXBwaWQtdXNhZ2U6IFVzYWdlOiBqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkFwcGxpY2F0aW9uSWRUb29sXG5cCisJXHRbLXByb3BlcnRpZXMvLXAgPHByb3BlcnRpZXMgZmlsZSBvciByZXNvdXJjZT5dXG5cCisJXHRbLTxwcm9wZXJ0eSBuYW1lPiA8cHJvcGVydHkgdmFsdWU+XSpcblwKKwlcdFstaWdub3JlRXJyb3JzLy1pIDx0cnVlL3QgfCBmYWxzZS9mPl0qXG5cCisJXHRbLWRpcmVjdG9yeS8tZCA8b3V0cHV0IGRpcmVjdG9yeT5dXG5cCisJXHRbLW5hbWUvLW4gPGlkIGNsYXNzIG5hbWU+XVxuXAorCVx0Wy1zdWZmaXgvLXMgPGlkIGNsYXNzIHN1ZmZpeD5dXG5cCisJXHRbLXRva2VuLy10IDx0b2tlbj5dXG5cCisJXHRbLWNvZGVGb3JtYXQvLWNmLjxwcm9wZXJ0eSBuYW1lPiA8cHJvcGVydHkgdmFsdWU+XSpcblwKKwlcdDxjbGFzcyBuYW1lIHwgLmphdmEgZmlsZSB8IC5jbGFzcyBmaWxlIHwgLmpkbyBmaWxlPisgCithcHBpZC1jb21tZW50LWZvcjogQXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MgZm9yOiB7MH0KK2FwcGlkLWNvbW1lbnQtZ2VuOiBBdXRvLWdlbmVyYXRlZCBieToKK3Byb3BlcnR5LXZpb2xhdGlvbnM6IERldGVjdGVkIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgdmlvbGF0aW9ucyBvZiB0aGUgXAorCXJlc3RyaWN0aW9ucyBwbGFjZWQgb24gcHJvcGVydHkgYWNjZXNzIHBlcnNpc3RlbnQgdHlwZXM6XG57MH0KK3Byb3BlcnR5LWZpZWxkLWFjY2VzczogInsxfSIgdXNlcyBwcm9wZXJ0eSBhY2Nlc3MsIGJ1dCBpdHMgZmllbGQgInsyfSIgaXMgXAorCWFjY2Vzc2VkIGRpcmVjdGx5IGluIG1ldGhvZCAiezN9IiBkZWZpbmVkIGluICJ7MH0iLgorcHJvcGVydHktYmFkLW1lbWJlcjogVGhlIG1lbWJlciBmb3IgZm9yIHBlcnNpc3RlbnQgcHJvcGVydHkgInswfSIgd2FzIG5vdCBcCisJYSBtZXRob2Q6ICJ7MX0iLgorcHJvcGVydHktbm8tZ2V0dGVyOiBObyBnZXR0ZXIgbWV0aG9kIGZvdW5kIGZvciBwZXJzaXN0ZW50IHByb3BlcnR5ICJ7MH0iLiAgQWxsIFwKKwlwZXJzaXN0ZW50IHByb3BlcnRpZXMgbXVzdCBoYXZlIGdldHRlciBtZXRob2RzLgorcHJvcGVydHktbm8tc2V0dGVyOiBObyBzZXR0ZXIgbWV0aG9kIGZvdW5kIGZvciBwZXJzaXN0ZW50IHByb3BlcnR5ICJ7MH0iLCBhbmQgXAorCWJ5dGVjb2RlIGFuYWx5c2lzIG9mIHRoZSBnZXR0ZXIgZGlkIG5vdCByZXZlYWwgYSBjbGVhciBiYWNraW5nIGZpZWxkLiBcCisJUGxlYXNlIGNyZWF0ZSBhIHNldHRlciBtZXRob2QgZm9yIHRoaXMgcHJvcGVydHkgKGl0IG1heSBiZSBwcml2YXRlKS4gCitwcm9wZXJ0eS1zZXR0ZXItZ2V0dGVyLW1pc21hdGNoOiBCeXRlY29kZSBhbmFseXNpcyBvZiB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIgXAorCW1ldGhvZHMgZm9yIHBlcnNpc3RlbnQgcHJvcGVydHkgInswfSIgaW5kaWNhdGVzIHRoYXQgdGhlIHR3byBtZXRob2RzIFwKKwltaWdodCBiZSBhY3Rpbmcgb24gZGlmZmVyZW50IGJhY2tpbmcgZmllbGRzLiAgVGhlIHNldHRlciBtZXRob2QgYXNzaWducyB0byBcCisJZmllbGQgInsxfSIsIHdoaWxlIHRoZSBnZXR0ZXIgbWV0aG9kIHJldHVybnMgZmllbGQgInsyfSIuCitjZnQtZXhjZXB0aW9uLXRocm93bjogQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gd2hpbGUgYXR0ZW1wdGluZyB0byBwZXJmb3JtIFwKKwljbGFzcyBmaWxlIHRyYW5zZm9ybWF0aW9uIG9uICJ7MH0iOgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjUyN2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw5NyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitvcnBoYW5lZC1rZXktb3duZXI6IERldGVjdGVkIHBvc3NpYmxlIG9ycGhhbmVkIHJlZmVyZW5jZSB0byBkZWxldGVkIG9iamVjdCBcCisJInswfSIgaW4gInsxfSIgb2YgaW5zdGFuY2UgInsyfSIuCitvcnBoYW5lZC1rZXk6IERldGVjdGVkIHBvc3NpYmxlIG9ycGhhbmVkIHJlZmVyZW5jZSB0byBkZWxldGVkIG9iamVjdCAiezB9IiBcCisJaW4gInsxfSIuCituby1hZGRlZC1vaWRzOiBZb3UgaGF2ZSBhdHRlbXB0ZWQgdG8gYWNjZXNzIHRoZSBhZGRlZCBvYmplY3QgSWRzIGZvciBcCisJdGhpcyBldmVudCwgaG93ZXZlciB0aGUgUmVtb3RlQ29tbWl0UHJvdmlkZXIgaXNuJ3QgY29uZmlndXJlZCB0byBzZW5kIFwKKwl0aGVtLiBZb3UgbmVlZCB0byBlaXRoZXIgdXBkYXRlIHlvdXIgUmVtb3RlQ29tbWl0RXZlbnRMaXN0ZXJuZXIsIFwKKwlvciBjaGFuZ2UgeW91ciBvcmcuYXBhY2hlLm9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIgcHJvcGVydHkgc28gdGhhdCBpdCBpbmNsdWRlcyBcCisJdGhlIG9wdGlvbiBUcmFuc21pdEFkZGVkT2JqZWN0SWRzLgorZXh0ZW50LW9ubHktZXZlbnQ6IFlvdSBoYXZlIGF0dGVtcHRlZCB0byBhY2Nlc3Mgb2JqZWN0IElkcyBmb3IgYW4gZXZlbnQgXAorCXRoYXQgb25seSBjYXJyaWVzIGluZm9ybWF0aW9uIGFzIGV4dGVudHMgZm9yIHRoZSBtb2RpZmllZCBvYmplY3RzLgorbm9uZXh0ZW50LWV2ZW50OiBZb3UgaGF2ZSBhdHRlbXB0ZWQgdG8gYWNjZXNzIGV4dGVudCBpbmZvcm1hdGlvbiBmb3IgYW4gXAorCWV2ZW50IHRoYXQgb25seSBjYXJyaWVzIGluZm9ybWF0aW9uIGFzIG9iamVjdCBJZHMuCituby1wcm92aWRlcjogWW91IGhhdmUgYXR0ZW1wdGVkIHRvIHVzZSBhIFJlbW90ZUNvbW1pdExpc3RlbmVyIHdpdGhvdXQgYWxzbyBcCisJc3BlY2lmeWluZyBhIFJlbW90ZUNvbW1pdFByb3ZpZGVyLiAgSW4gb3JkZXIgdG8gdXNlIGEgcmVtb3RlIGNvbW1pdCBcCisJbGlzdGVuZXIsIHlvdSBtdXN0IGNvbmZpZ3VyZSBhIHJlbW90ZSBjb21taXQgcHJvdmlkZXIgdG8gdXNlIHRocm91Z2ggdGhlIFwKKwlvcmcuYXBhY2hlLm9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KK3JlbW90ZS1saXN0ZW5lci1leDogRXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSBleGVjdXRpbmcgcmVtb3RlIGNvbW1pdCBcCisJbGlzdGVuZXIgY2FsbGJhY2sgbWV0aG9kcy4gVGhleSB3ZXJlIGNvbnN1bWVkOiB7MH0KK2ptcy1wcm92aWRlci1jb25maWc6IEVycm9yIGNyZWF0aW5nIGEgcHVibGlzaGVyIG9yIHN1YnNjcmliZXIgZm9yIEpNUyB0b3BpYyBcCisJInswfSIuIFRvcGljQ29ubmVjdGlvbkZhY3RvcnkgSk5ESSBuYW1lOiAiezF9Ii4KK2ptcy1jbG9zZS1lcnJvcjogRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uIGZvciB0b3BpYyAiezB9Ii4KK2ptcy1jbG9zZS1saXN0ZW5lcjogU3RvcHBlZCBsaXN0ZW5pbmcgZm9yIHJlbW90ZSBjb21taXQgaW5mb3JtYXRpb24gb24gXAorCXRvcGljICJ7MH0iLgoram1zLXN0YXJ0LWxpc3RlbmVyOiBTdGFydGVkIGxpc3RlbmluZyBmb3IgcmVtb3RlIGNvbW1pdCBpbmZvcm1hdGlvbiBvbiBcCisJdG9waWMgInswfSIuCitqbXMtc2VudC11cGRhdGU6IFNlbnQgSk1TIHVwZGF0ZSB0byB0b3BpYyAiezB9Ii4KK2ptcy1zZW5kLWVycm9yOiBFcnJvciBicm9hZGNhc3RpbmcgSk1TIHVwZGF0ZSB0byB0b3BpYyAiezB9Ii4gUmVtb3RlIFwKKwlCcm9rZXJGYWN0b3JpZXMgbWF5IGJlIG91dC1vZi1kYXRlLgoram1zLXJlY2VpdmVkLXVwZGF0ZTogUmVjZWl2ZWQgSk1TIHVwZGF0ZSBvbiB0b3BpYyAiezB9Ii4KK2ptcy1yZWNlaXZlLWVycm9yLTE6IEpNU0V4Y2VwdGlvbiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyBvYmplY3QgZnJvbSBhbiBcCisJT2JqZWN0TWVzc2FnZS4KK2ptcy1yZWNlaXZlLWVycm9yLTI6IFJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgInswfSIgb24gdG9waWMgInsxfSIuCitqbXMtcmVjZWl2ZS1lcnJvci0zOiBSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSBvbiB0b3BpYyAiezB9Ii4gXAorCU1lc3NhZ2UgY2xhc3M6ICJ7MX0iLgoram1zLWxpc3RlbmVyLWVycm9yOiBSZWNlaXZlZCBub3RpZmljYXRpb24gb2YgYSBKTVMgZmFpbHVyZSBvbiB0b3BpYyAiezB9Ii4KK2ptcy1yZWNvbm5lY3QtYXR0ZW1wdDogQXR0ZW1wdGluZyB0byByZWNvbm5lY3QgYWZ0ZXIgSk1TIGZhaWx1cmUgb24gdG9waWMgXAorCSJ7MH0iLiAgQXR0ZW1wdCBudW1iZXI6IHsxfQoram1zLXJlY29ubmVjdC1mYWlsOiBBdHRlbXB0IHRvIHJlY29ubmVjdCB0byBKTVMgdG9waWMgInswfSIgZmFpbGVkLiAKK2ptcy1jYW50LXJlY29ubmVjdDogQWxsIGF0dGVtcHRzIHRvIHJlY29ubmVjdCB0byBKTVMgdG9waWMgInswfSIgZmFpbGVkLiBcCisJR2l2aW5nIHVwIGFmdGVyIHsxfSBhdHRlbXB0cy4KK2ptcy1yZWNvbm5lY3RlZDogU3VjY2Vzc2Z1bGx5IHJlY29ubmVjdGVkIHRvIEpNUyB0b3BpYyAiezB9IiBhZnRlciBmYWlsdXJlLgordGNwLXBheWxvYWQtY3JlYXRlLWVycm9yOiBFcnJvciBjcmVhdGluZyBkYXRhIHRvIHNlbmQgdG8gVENQIHByb3ZpZGVyLgordGNwLWFjY2VwdC1lcnJvcjogRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGFjY2VwdCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIGhvc3QuCit0Y3Atbm90LWVxdWFsOiBUaGUgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBUQ1BSZW1vdGVDb21taXRQcm92aWRlciBpcyBcCisJbm90IHRoZSBzYW1lIGFzIGZvciBhbm90aGVyIHByb3ZpZGVyIGluIHRoZSBjdXJyZW50IEpWTSB0aGF0IGlzIGxpc3RlbmluZyBcCisJb24gdGhlIHNhbWUgcG9ydC4gUG9ydDogInswfSIuCit0Y3AtbGlzdGVuZXItYnJva2VuOiBUaGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBwcm92aWRlciBsaXN0ZW5lciBpcyBudWxsLiBcCisJVGhpcyBtZWFucyB0aGF0IHRoZSBwcm92aWRlciBzdGFydHVwIGZhaWxlZC4KK3RjcC1pbml0LWV4Y2VwdGlvbjogQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNvbmZpZ3VyaW5nIHRoZSBcCisJVENQUmVtb3RlQ29tbWl0UHJvdmlkZXIgY29uZmlndXJlZCB0byBsaXN0ZW4gb24gcG9ydCAiezB9Ii4KK3RjcC1zZW50LXVwZGF0ZTogU2VudCBUQ1AgdXBkYXRlIHRvICJ7MH0iIHVzaW5nIGxvY2FsIHBvcnQgInsxfSIuCit0Y3Atc2VuZC1lcnJvcjogRXJyb3Igc2VuZGluZyBUQ1AgdXBkYXRlIHRvICJ7MH0iLgordGNwLXNlbmQtc3RpbGwtZXJyb3I6IFN0aWxsIHVuYWJsZSB0byBzZW5kIFRDUCB1cGRhdGUgdG8gInswfSIuCit0Y3AtcmVjZWl2ZWQtdXBkYXRlOiBSZWNlaXZlZCBUQ1AgdXBkYXRlIGZyb20gInswfSIuCit0Y3AtcmVjZWl2ZS1lcnJvcjogRXhjZXB0aW9uIHRocm93biB3aGlsZSByZWNlaXZpbmcgVENQIHVwZGF0ZS4KK3RjcC1jbG9zZS1lcnJvcjogRXhjZXB0aW9uIHRocm93biB3aGlsZSBjbG9zaW5nIFRDUCByZW1vdGUgY29tbWl0IHByb3ZpZGVyLgordGNwLXNvY2tldC1vcHRpb24tZXJyb3I6IEV4Y2VwdGlvbiB0aHJvd24gd2hpbGUgc2V0dGluZyBOT0RFTEFZIG9wdGlvbiBmb3IgXAorCVRDUCByZW1vdGUgY29tbWl0IHByb3ZpZGVyLgordGNwLWNsb3NlLWxpc3RlbmVyOiBTdG9wcGVkIGxpc3RlbmluZyBmb3IgcmVtb3RlIGNvbW1pdCBpbmZvcm1hdGlvbiBvbiBcCisJcG9ydCAiezB9Ii4KK3RjcC1yZWNlaXZlZC1jb25uZWN0aW9uOiBSZWNlaXZlZCBuZXcgY29ubmVjdGlvbiBmcm9tICJ7MH0iCit0Y3Atc3RhcnQtbGlzdGVuZXI6IFN0YXJ0ZWQgbGlzdGVuaW5nIGZvciByZW1vdGUgY29tbWl0IGluZm9ybWF0aW9uIG9uIFwKKwlwb3J0ICJ7MH0iLgordGNwLWFkZHJlc3MtYXNzZWxmOiBJZGVudGlmaWVkIGFkZHJlc3Mgb2YgInswfSIsIHdoaWNoIGlzIGVxdWFsIHRvIG91cnNlbGYuCit0Y3AtYWRkcmVzcy1zZXQ6IENvbmZpZ3VyZWQgdG8gc2VuZCB0byBwZWVyICJ7MH0iCit0Y3AtcmVjZWl2ZWQtZXZlbnQ6IFJlY2VpdmVkIGV2ZW50IGZyb20gcGVlciAiezB9IgordGNwLW9wZW4tY29ubmVjdGlvbjogQ3JlYXRpbmcgbmV3IHNvY2tldCBjb25uZWN0aW9uIHRvICJ7MH0iLCB1c2luZyBsb2NhbCBwb3J0IFwKKwkiezF9Ii4KK3RjcC1jbG9zZS1zb2NrZXQtZXJyb3I6IEV4Y2VwdGlvbiB0aHJvd24gd2hpbGUgY2xvc2luZyBjb25uZWN0aW9uIGZyb20gInswfSIuCit0Y3AtY2xvc2Utc29ja2V0OiBDbG9zaW5nIGNvbm5lY3Rpb24gZnJvbSAiezB9Ii4KK3RjcC1jbG9zZS1zZW5kaW5nLXNvY2tldDogQ2xvc2luZyB0cmFuc21pc3Npb24gY29ubmVjdGlvbiB0byAiezB9IiB0aGF0IHdhcyBcCisJdXNpbmcgbG9jYWwgcG9ydCAiezF9Ii4KK3RjcC1jbG9zZS1wb29sLWVycm9yOiBFeGNlcHRpb24gdGhyb3duIHdoaWxlIGNsb3NpbmcgY29ubmVjdGlvbiBwb29sLgordGNwLXdyb25nLXZlcnNpb24tZXJyb3I6IFJlY2VpdmVkIHBhY2tldCBmcm9tICJ7MH0iIHdpdGggaW52YWxpZCB2ZXJzaW9uIFwKKwludW1iZXIuIENoZWNrIGlmIGEgcHJpb3IgcmVsZWFzZSBvZiBPcGVuSlBBIGlzIGJlaW5nIHVzZWQgb24gdGhpcyBob3N0LgorYmVhbi1jb25zdHJ1Y3RvcjogQ291bGQgbm90IGluc3RhbnRpYXRlIGNsYXNzIHswfS4gIE1ha2Ugc3VyZSBpdCBoYXMgYW4gXAorICAgIGFjY2Vzc2libGUgbm8tYXJncyBjb25zdHJ1Y3Rvci4KK21ldGhvZC1ub3Rmb3VuZDogTWV0aG9kICJ7MX0iIHdpdGggYXJndW1lbnRzIG9mIHR5cGU6IHsyfSBcCisgICAgbm90IGZvdW5kIGluIGNsYXNzICJ7MH0iLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9leHBzL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDBmMTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2V4cHMvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitpbi1tZW0tc3VicXVlcnk6IFN1YnF1ZXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHF1ZXJpZXMgdGhhdCBleGVjdXRlIFwKKwlpbi1tZW1vcnkuICBJZiB5b3UgZG8gbm90IGludGVuZCBmb3IgdGhpcyBxdWVyeSB0byBleGVjdXRlIGluLW1lbW9yeSwgXAorCWNvbnNpZGVyIHNldHRpbmcgSWdub3JlQ2FjaGUgdG8gdHJ1ZSBmb3IgdGhlIHF1ZXJ5Lgorbm90LWNvbXA6IFRoZSBldmFsdWF0aW9uIG9mIHRoZSBvcmRlcmluZyBleHByZXNzaW9uIG9mIHRoaXMgcXVlcnkgcHJvZHVjZWQgXAorCW5vbi1jb21wYXJhYmxlIHZhbHVlcyAiezB9IiBhbmQgInsxfSIuICBQbGVhc2UgY2hlY2sgdGhhdCB0aGUgb3JkZXJpbmcgXAorCWNsYXVzZSBpcyB2YWxpZC4KK2FnZy1pbi1maWx0ZXI6IElmIHlvdSB1c2UgYW4gYWdncmVnYXRlIGZ1bmN0aW9uIGluIGEgcXVlcnkgZmlsdGVyLCB5b3UgbXVzdCBcCisJbWFrZSBzdXJlIHRvIG9ubHkgaW52b2tlIHRoZSBhZ2dyZWdhdGUgb24gY29sbGVjdGlvbnMuCitwYXJzZS1lcnJvcjogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgcXVlcnkgZmlsdGVyICJ7MX0iLiBcCisJRXJyb3IgbWVzc2FnZTogezB9Citub24tbnVtZXJpYy1wYXRoOiBmaWVsZCB7MH0gb2YgdHlwZSB7MX0KK25vbi1udW1lcmljLXZhbHVlOiB2YWx1ZSBvZiB0eXBlIHswfQorbm9uLW51bWVyaWMtY29tcGFyaXNvbjogRmlsdGVyIGludmFsaWQuIENhbm5vdCBjb21wYXJlIHswfSB0byB7MX0uIE51bWVyaWMgXAorCWNvbXBhcmlzb25zIG11c3QgYmUgYmV0d2VlbiBudW1lcmljIHR5cGVzIG9ubHkuIFRvIGVuYWJsZSBzdWNoIGNvbXBhcmlzb25zIFwKKwlmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIGFkZCAiUXVvdGVkTnVtYmVyc0luUXVlcmllcz10cnVlIiB0byB0aGUgXAorCW9yZy5hcGFjaGUub3BlbmpwYS5Db21wYXRpYmlsaXR5IHNldHRpbmcgaW4geW91ciBjb25maWd1cmF0aW9uLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9qcHFsL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjQ4NTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2pwcWwvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1NyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitwYXJhbS1kZWNzLWludmFsaWQ6IEpQUUwgZG9lcyBub3Qgc3VwcG9ydCBkZWNsYXJlZCBwYXJhbWV0ZXJzLgorYmFkLWpwcWw6IFRoZSBKUFFMIHN0cmluZyAiezB9IiBpcyBub3QgdmFsaWQuICBcCisJTWFrZSBzdXJlIGFsbCBwYXJlbnRoZXNlcyBhcmUgbWF0Y2hlZCBhbmQgdGhhdCB5b3UgdXNlIHByb3BlciBKUFFMIHN5bnRheC4KK2JhZC10cmVlOiBUaGUgSlBRTCBzdGF0ZW1lbnQgaXMgbm90IHZhbGlkOiBlbmNvdW50ZXJlZCBhIG5vZGUgb2YgdHlwZSBcCisJInswfSIuCitwYXJzZS1lcnJvcjogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgcXVlcnkgZmlsdGVyICcnezF9JycuIFwKKwlFcnJvciBtZXNzYWdlOiB7MH0KK25vLWFsaWFzOiBUaGUgYWxpYXMgInswfSIgd2FzIG5vdCBkZWNsYXJlZCBpbiB0aGUgc3RhdGVtZW50IChkZWNsYXJlZCBcCisJYWxpYXNlcyBhcmU6IHsxfSkuIEFsbCBhbGlhc2VzIG11c3QgYmUgZGVjbGFyZWQgaW4gdGhlICJmcm9tIiBcCisJc2VjdGlvbiBvZiB0aGUgSlBRTCBzdGF0ZW1lbnQuCitjYW50LXJlc29sdmUtdHlwZTogVGhlIGVudGl0eSAiezB9IiBjYW5ub3QgYmUgcmVzb2x2ZWQ7IHBsZWFzZSBlbnN1cmUgdGhhdCBcCisJdGhlIGVudGl0eSBuYW1lIGhhcyBiZWVuIGRlY2xhcmVkIGZvciB0aGUgY2xhc3MuCitub3QtaWRlbnRpZmVyOiBUaGUgc3BlY2lmaWVkIG5vZGUgKCJ7MH0iKSBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLgorbm8tZmllbGQ6IE5vIGZpZWxkIG5hbWVkICJ7MX0iIGluIGNsYXNzICJ7MH0iLgordW5hY2Nlc3NpYmxlLWZpZWxkOiBUaGUgZmllbGQgbmFtZWQgInsxfSIgaW4gY2xhc3MgInswfSIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgorbXVsdGktY2hpbGRyZW46IEV4cHJlc3Npb24gInswfSIgZG9lcyBub3QgYWxsb3cgbXV0bGlwbGUgY2hpbGRyZW4gKCJ7MX0iKS4KK25vLWNoaWxkcmVuOiBFeHByZXNzaW9uICJ7MH0iIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjaGlsZC4KK3Vua25vd24tY29tcDogVW5rbm93biBjb21wYXJpc29uIG9wZXJhdG9yICJ7MH0iLgord3JvbmctY2hpbGQtY291bnQ6IFdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZXhwcmVzc2lvbiBcCisJb2YgdHlwZSAiezF9Ijogc2hvdWxkIGhhdmUgYmVlbiB7MH0sIGJ1dCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyBcCisJd2VyZSBzcGVjaWZpZWQ6ICJ7Mn0iLgorbm90LXNjaGVtYS1uYW1lOiBUaGUgbmFtZSAiezB9IiBpcyBub3QgYSByZWNvZ25pemVkIGVudGl0eSBvciBpZGVudGlmaWVyLgorZHVwbGljYXRlLWFsaWFzOiBBbGlhcyAiezB9IiB3YXMgZGVjbGFyZWQgdHdpY2UuCit1bmtub3duLXR5cGU6IENhbm5vdCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZmllbGQgInswfSIuCit1bmV4cGVjdGVkLXZhcjogVGhlIHZhcmlhYmxlICJ7MH0iIHdhcyBmb3VuZCB3aGVyZSBhIGNvbnN0YW50IG9yIFwKKwlmaWVsZCB2YWx1ZSB3YXMgZXhwZWN0ZWQuCitwYXRoLW5vLW1ldGE6IEF0dGVtcHQgdG8gcXVlcnkgZmllbGQgInswfSIgZnJvbSBub24tZW50aXR5IGNsYXNzICJ7MX0iLgorbm90LXlldC1zdXBwb3J0ZWQ6IEV4cHJlc3Npb25zIG9mIHR5cGUgInswfSIgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLgorYmFkLXBvc2l0aW9uYWwtcGFyYW1ldGVyOiBUaGUgcG9zaXRpb25hbCBwYXJhbWV0ZXIgInswfSIgaXMgaW52YWxpZC4gXAorCVBvc2l0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorYmFkLWNhbmRpZGF0ZS10eXBlOiBDb3VsZCBub3QgcmVzb2x2ZSBlbnRpdHkgbmFtZWQgInswfSIuCitiYWQtcmVzdWx0LXR5cGU6IENvdWxkIG5vdCByZXNvbHZlIHJlc3VsdCBjbGFzcyBuYW1lZCAiezB9Ii4KK25vLWZyb20tY2xhdXNlOiBObyAiZnJvbSIgY2xhdXNlIGluIGV4cHJlc3Npb24uCit1bnJlY29nbml6ZWQtb3BlcmF0aW9uOiBVbmtub3duIHF1ZXJ5IG9wZXJhdGlvbiAiezB9Ii4KK2FsaWFzLXJlcXVpcmVkOiBBbiBhbGlhcyBpcyByZXF1aXJlZCBmb3IgdGhlIHNjaGVtYSBuYW1lICJ7MH0iIGluIFwKKwl0aGUgZXhwcmVzc2lvbi4KK3Vua25vd24taWRlbnRpZmllcjogVW5kZWNsYXJlZCBpZGVudGlmaWVyICJ7MH0iLgordXBkYXRlLWNvbnN0YW50LXZhbHVlOiBVcGRhdGUgZXhwcmVzc2lvbiAiezB9IiBtYXkgb25seSB1c2UgbGl0ZXJhbHMgXAorCW9yIHBhcmFtZXRlcnMgYXMgdXBkYXRlIHZhbHVlcy4KK2JhZC1wYXJzZTogRW5jb3VudGVyZWQgInswfSIgYXQgY2hhcmFjdGVyIHsxfSwgYnV0IGV4cGVjdGVkOiB7Mn0uCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNmODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDM2NyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitjYW50LWNvbnZlcnQtcmVzdWx0OiBUaGVyZSBpcyBubyBjb252ZXJzaW9uIGJldHdlZW4gcXVlcnkgcHJvamVjdGlvbiB0eXBlIFwKKwkiezB9IiBhbmQgcmVzdWx0IHR5cGUgInsxfSIuCit1bmxvYWRlZC1kZXRhY2hlZDogQXR0ZW1wdCB0byBhY2Nlc3MgYW4gdW5sb2FkZWQgZmllbGQgb2YgZGV0YWNoZWQgaW5zdGFuY2UgXAorCSJ7MH0iLgorbWV0YS11bmtub3duaWQ6IENhbm5vdCBtYW5pcHVsYXRlIGlkZW50aXR5IG9mIHR5cGUgInswfSI6IGl0JydzIGlkZW50aXR5IHR5cGUgXAorCWlzIHVua25vd24uCituZXctYWJzdHJhY3Q6IENhbm5vdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgInswfSI6IGFic3RyYWN0IGNsYXNzZXMgYXJlIG5vdCBcCisgICAgeWV0IHN1cHBvcnRlZC4KK2JhZC1uZXctcXVlcnk6IEF0dGVtcHQgdG8gY29uc3RydWN0IGEgcXVlcnkgZnJvbSBhbiBleHRlbnQgb3IgY2xhc3MuICBZb3UgbXVzdCBcCisJcGFzcyBhIChwb3NzaWJseSBudWxsKSBxdWVyeSBzdHJpbmcgb3IgdGVtcGxhdGUgdG8gdGhlIHF1ZXJ5IGZhY3RvcnkgXAorCW1ldGhvZCB3aGVuIGNyZWF0aW5nIHRoZSBxdWVyeS4gCit1cGRhdGUtcmVzdHJpY3Q6IERldGVjdGVkIGF0dGVtcHQgdG8gbW9kaWZ5IGZpZWxkICJ7MH0iIHdpdGggdmFsdWUgc3RyYXRlZ3kgXAorCSJyZXN0cmljdCIuCityZWVudHJhbnQtZmx1c2g6IERldGVjdGVkIHJlZW50cmFudCBmbHVzaC4gIE1ha2Ugc3VyZSB5b3VyIGZsdXNoLXRpbWUgaW5zdGFuY2UgXAorCWNhbGxiYWNrIG1ldGhvZHMgb3IgZXZlbnQgbGlzdGVuZXJzIGRvIG5vdCBpbnZva2UgYW55IG9wZXJhdGlvbnMgdGhhdCBcCisJcmVxdWlyZSB0aGUgaW4tcHJvZ3Jlc3MgZmx1c2ggdG8gY29tcGxldGUuCityb2xsZWQtYmFjazogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHJvbGxlZCBiYWNrLiAgU2VlIHRoZSBuZXN0ZWQgZXhjZXB0aW9ucyBcCisJZm9yIGRldGFpbHMgb24gdGhlIGVycm9ycyB0aGF0IG9jY3VycmVkLgorYmFkLWxvY2stbGV2ZWw6IFRoaXMgbG9jayBtYW5hZ2VyIGRvZXMgbm90IHJlY29nbml6ZSBsb2NrIGxldmVsICJ7MH0iLgorcGVzc2ltaXN0aWMtbXV0YXRlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGlyZWN0bHkgbXV0YXRlIGEgcGVyc2lzdGVudCBzZWNvbmQgXAorCWNsYXNzIG9iamVjdCAoc3VjaCBhcyBhIGNvbGxlY3Rpb24gb3IgbWFwIGZpZWxkKSB0aGF0IHlvdSBvYnRhaW5lZCBiZWZvcmUgXAorCXRoZSB0cmFuc2FjdGlvbiBiZWdhbi4gIEFmdGVyIGJlZ2lubmluZyBhIGRhdGFzdG9yZSB0cmFuc2FjdGlvbiwgeW91IFwKKwltdXN0IHJlLW9idGFpbiBhbnkgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHNlY29uZCBjbGFzcyBvYmplY3RzIGZyb20gdGhlIFwKKwlvd25pbmcgcGVyc2lzdGVudCBvYmplY3QuICBEZXRlY3RlZCBhdHRtcHQgdG8gbXV0YXRlIHZhbHVlIG9mIGZpZWxkICJ7MH0iIFwKKwlpbiBpbnN0YW5jZSAiezF9Ii4gIFRoaXMgaW5zdGFuY2UgbWF5IG5vdCBiZSBsb2NrZWQgY29ycmVjdGx5Lgorbm90LWRlcmVmZWQ6IEVuY291bnRlcmVkIHVua25vd24gZGVwZW5kZW50IGluc3RhbmNlICJ7MH0iLiAgVGhpcyBlcnJvciBpcyBcCisJb2Z0ZW4gY2F1c2VkIGJ5IGVpdGhlciByZW1vdmluZyBhIGRlcGVuZGVudCBpbnN0YW5jZSBmcm9tIG9uZSBkZXBlbmRlbnQgXAorCWZpZWxkLCBidXQgbm90IG90aGVyIGRlcGVuZGVudCBmaWVsZHMgdGhhdCByZWZlcmVuY2UgaXQsIG9yIGJ5IHJlbW92aW5nIGEgXAorCWRlcGVuZGVudCBpbnN0YW5jZSBmcm9tIGl0cyBvd25pbmcgZmllbGQsIGZsdXNoaW5nIFwKKwkoY2F1c2luZyB0aGUgdW5yZWZlcmVuY2VkIGRlcGVuZGVudCBpbnN0YW5jZSB0byBiZSBkZWxldGVkKSwgYW5kIHRoZW4gXAorCXRyeWluZyB0byBhc3NpZ24gdGhlIGRlbGV0ZWQgaW5zdGFuY2UgdG8gYW5vdGhlciBmaWVsZCBiZWZvcmUgY29tbWl0LiAgXAorCVRoZSBpbnN0YW5jZSBjYW5ub3QgYmUgdW4tZGVsZXRlZCwgcmVzdWx0aW5nIGluIGFuIGVycm9yLiAgTWFrZSBzdXJlIG5vdCBcCisJdG8gbGVhdmUgZGFuZ2xpbmcgZGVwZW5kZW50IHJlZmVyZW5jZXMgdG8gb2JqZWN0cywgYW5kIHRvIHJlYXNzaWduIFwKKwlkZXBlbmRlbnQgb2JqZWN0cyBiZWZvcmUgZmx1c2ggc28gdGhhdCBPcGVuSlBBIGRvZXMgbm90IHRoaW5rIHRoZXkgYXJlIFwKKwl1bnJlZmVyZW5jZWQgYW5kIHRoZXJlZm9yZSBzYWZlIHRvIGRlbGV0ZS4KK2luaXQtbnVsbC1wYzogQXR0ZW1wdCB0byBpbml0aWFsaXplIGEgc3RhdGUgbWFuYWdlciB3aXRoIGEgbnVsbCBcCisJcGVyc2lzdGVuY2UtY2FwYWJsZSBpbnN0YW5jZSBmb3IgdHlwZSAiezB9Ii4gIFRoaXMgaXMgb2Z0ZW4gY2F1c2VkIGJ5IFwKKwlhdHRlbXB0aW5nIHRvIGxvYWQgYW4gaW5zdGFuY2Ugb2YgYW4gYWJzdHJhY3QgY2xhc3MsIG9yIFwKKwluZWdsZWN0aW5nIHRvIHVzZSBhIGNsYXNzIGluZGljYXRvciB3aGVuIHRoZSBiYXNlIHBlcnNpc3RlbmNlLWNhcGFibGUgXAorCWNsYXNzIGluIGFuIGluaGVyaXRhbmNlIHRyZWUgaXMgYWJzdHJhY3QuCitpbml0LXNtLXBjOiBBdHRlbXB0IHRvIGluaXRpYWxpemUgYSBzdGF0ZSBtYW5hZ2VyIHdpdGggYW4gaW5zdGFuY2UgdGhhdCBpcyBcCisJYWxyZWFkeSBtYW5hZ2VkICgiezB9IikuICBZb3UgbWlnaHQgYmUgdHJ5aW5nIHRvIHBlcnNpc3QgdGhpcyBpbnN0YW5jZSBcCisJaW4gdHdvIHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZS4KK2JhZC1kcy1vaWQ6IFRoZSB0eXBlICJ7MH0iIGRlY2xhcmVzIGRhdGFzdG9yZSBpZGVudGl0eSBidXQgdGhlIHZhbHVlIFwKKwlwYXNzZWQgdG8gbG9va3VwIG9mIHR5cGUgInsxfSIgaXMgbm90IGEgT3BlbkpQQSBpZCBpbnN0YW5jZS4KK251bGwtb2lkczogU29tZSBvZiB0aGUgb2JqZWN0IGlkcyBwYXNzZWQgdG8gZ2V0T2JqZWN0c0J5SWQgd2VyZSBudWxsLgorbWFya2VkLXJvbGxiYWNrOiBUaGUgdHJhbnNhY3Rpb24gY2Fubm90IGJlIGNvbW1pdHRlZCwgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBcCisJbWFya2VkIGZvciByb2xsYmFjayBvbmx5LiAgVGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgcm9sbGVkIGJhY2sgaW5zdGVhZC4gXAorICAgIFRoZSBjYXVzZSBvZiB0aGUgcm9sbGJhY2stb25seSBzdGF0dXMgaXMgcmVwb3J0ZWQgaW4gdGhlIGVtYmVkZGVkIHN0YWNrLgorcmVmcmVzaC1mbHVzaGVkOiBZb3UgY2Fubm90IHJlZnJlc2ggYW4gaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBmbHVzaGVkIHRvIHRoZSBcCisJZGF0YSBzdG9yZS4KK3BjLWxvYWRlci1kaWZmZXJlbnQ6IEF0dGVtcHQgdG8gY2FzdCBpbnN0YW5jZSAiezB9IiB0byBQZXJzaXN0ZW5jZUNhcGFibGUgZmFpbGVkLiBcCisgICAgVGhlIG9iamVjdCBpbXBsZW1lbnRlZCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGUsIFwKKyAgICBidXQgdGhlIGluc3RhbmNlIG9mIHRoYXQgaW50ZXJmYWNlIHdhcyBsb2FkZWQgYnkgdHdvIGRpZmZlcmVudCBDbGFzc0xvYWRlcnM6IFwKKyAgICAiezF9IiBhbmQgInsyfSIuCitwYy1jYXN0OiBBdHRlbXB0IHRvIGNhc3QgaW5zdGFuY2UgInswfSIgdG8gUGVyc2lzdGVuY2VDYXBhYmxlIGZhaWxlZC4gIEVuc3VyZSBcCisJdGhhdCBpdCBoYXMgYmVlbiBlbmhhbmNlZC4KK2RlbC1pbnN0YW5jZTogVGhlIGluc3RhbmNlIG9mIHR5cGUgInswfSIgd2l0aCBvaWQgInsxfSIgbm8gbG9uZ2VyIGV4aXN0cyBpbiBcCisJdGhlIGRhdGEgc3RvcmUuICBUaGlzIG1heSBtZWFuIHRoYXQgeW91IGRlbGV0ZWQgdGhlIGluc3RhbmNlIGluIGEgc2VwYXJhdGUgXAorCXRyYW5zYWN0aW9uLCBidXQgdGhpcyBjb250ZXh0IHN0aWxsIGhhcyBhIGNhY2hlZCB2ZXJzaW9uLgorbm8tYnJva2VyLWNsYXNzOiBUaGUgc3BlY2lmaWVkIHR5cGUgInswfSIgY291bGQgbm90IGJlIGxvYWRlZC4gUGxlYXNlIGVuc3VyZSBcCisJdGhhdCB0aGUgY2xhc3MgZXhpc3RzIGluIHRoZSBwcm9qZWN0IGNsYXNzIHBhdGguCitiYWQtZW1iZWQ6IEF0dGVtcHQgdG8gc2V0IGFuIGVtYmVkZGVkIHZhbHVlIGZvciB1bmVtYmVkZGFibGUgZmllbGQgInswfSIuIFwKKwlQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IgdG8gT3BlbkpQQSBzdXBwb3J0LgorZW1iZWQtcmVmOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGFuIGVtYmVkZGVkIG9iamVjdCByZWZlcmVuY2UgXAorCXRoYXQgd2FzIG9idGFpbmVkIGJlZm9yZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiBzdGF0dXMgY2hhbmdlLiBBZnRlciBcCisJdHJhbnNhY3Rpb25zIGJlZ2luIGFuZCBlbmQsIGFsbCByZWZlcmVuY2VzIHRvIGVtYmVkZGVkIG9iamVjdHMgYmVjb21lIFwKKwlpbnZhbGlkOyB5b3UgaGF2ZSB0byByZS1hY3F1aXJlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgb3duaW5nIHBlcnNpc3RlbnQgXAorCW9iamVjdC4KK2RlbGV0ZWQ6IE9wZXJhdGlvbiBhdHRlbXB0ZWQgb24gYSBkZWxldGVkIGluc3RhbmNlLgorZGlydHk6IElsbGVnYWwgb3BlcmF0aW9uIGF0dGVtcHRlZCBvbiBhIGRpcnR5IGluc3RhbmNlOiBkaXJ0eSBvYmplY3RzIGNhbm5vdCBcCisJYmUgZXZpY3RlZCBvciBtYWRlIHRyYW5zaWVudCBvciBub24tdHJhbnNhY3Rpb25hbC4KK25lc3RlZC1leGNlcHM6IFRoaXMgb3BlcmF0aW9uIGZhaWxlZCBmb3Igc29tZSBpbnN0YW5jZXMuICBTZWUgdGhlIG5lc3RlZCBcCisJZXhjZXB0aW9ucyBhcnJheSBmb3IgZGV0YWlscy4KK25ldzogSWxsZWdhbCBvcGVyYXRpb24gYXR0ZW1wdGVkIG9uIGEgbmV3bHkgcGVyc2lzdGVkIGluc3RhbmNlOiBuZXcgb2JqZWN0cyBcCisJY2Fubm90IGJlIGV2aWN0ZWQgb3IgbWFkZSB0cmFuc2llbnQgb3Igbm9uLXRyYW5zYWN0aW9uYWwuCit0cmFuc2llbnQ6IElsbGVnYWwgb3BlcmF0aW9uIGF0dGVtcHRlZCBvbiBhIHRyYW5zaWVudCBpbnN0YW5jZS4KK25vdC1hY3RpdmU6IENhbiBvbmx5IHBlcmZvcm0gb3BlcmF0aW9uIHdoaWxlIGEgdHJhbnNhY3Rpb24gaXMgYWN0aXZlLgordHJhbnMtYWN0aXZlOiBUaGUgInswfSIgdHJhbnNhY3Rpb24gcHJvcGVydHkgY2Fubm90IGJlIHNldCBkdXJpbmcgYW4gXAorCWFjdGl2ZSB0cmFuc2FjdGlvbi4KK2FjdGl2ZTogVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCB3aGlsZSBhIFRyYW5zYWN0aW9uIGlzIGFjdGl2ZS4KK2Nsb3NlZDogVGhlIGNvbnRleHQgaGFzIGJlZW4gY2xvc2VkLiAgVGhlIHN0YWNrIHRyYWNlIGF0IHdoaWNoIHRoZSBcCisJY29udGV4dCB3YXMgY2xvc2VkIGlzIGhlbGQgaW4gdGhlIGVtYmVkZGVkIGV4Y2VwdGlvbi4KK2Nsb3NlZC1ub3RyYWNlOiBUaGUgY29udGV4dCBoYXMgYmVlbiBjbG9zZWQuICBUaGUgc3RhY2sgdHJhY2UgYXQgd2hpY2ggdGhlIFwKKwljb250ZXh0IHdhcyBjbG9zZWQgaXMgYXZhaWxhYmxlIGlmIFJ1bnRpbWU9VFJBQ0UgbG9nZ2luZyBpcyBlbmFibGVkLgorY2xvc2VkLWZhY3Rvcnk6IFRoZSBmYWN0b3J5IGhhcyBiZWVuIGNsb3NlZC4gIFRoZSBzdGFjayB0cmFjZSBhdCBcCisJd2hpY2ggdGhlIGZhY3Rvcnkgd2FzIGNsb3NlZCBpcyBoZWxkIGluIHRoZSBlbWJlZGRlZCBleGNlcHRpb24uCitjbG9zZWQtZmFjdG9yeS1ub3RyYWNlOiBUaGUgZmFjdG9yeSBoYXMgYmVlbiBjbG9zZWQuICBUaGUgc3RhY2sgdHJhY2UgYXQgXAorCXdoaWNoIHRoZSBmYWN0b3J5IHdhcyBjbG9zZWQgaXMgYXZhaWxhYmxlIGlmIFJ1bnRpbWU9VFJBQ0UgbG9nZ2luZyBpcyBcCisJZW5hYmxlZC4KK25vbi10cmFucy1yZWFkOiBUbyBwZXJmb3JtIHJlYWRzIG9uIHBlcnNpc3RlbnQgZGF0YSBvdXRzaWRlIG9mIGEgdHJhbnNhY3Rpb24sIFwKKwl0aGUgIk5vbnRyYW5zYWN0aW9uYWxSZWFkIiBwcm9wZXJ0eSBtdXN0IGJlIHNldCBvbiB0aGUgVHJhbnNhY3Rpb24uCitub24tdHJhbnMtd3JpdGU6IFRvIHBlcmZvcm0gd3JpdGVzIG9uIHBlcnNpc3RlbnQgZGF0YSBvdXRzaWRlIG9mIGEgXAorCXRyYW5zYWN0aW9uLCB0aGUgIk5vbnRyYW5zYWN0aW9uYWxXcml0ZSIgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gdHJ1ZS4KK3dyaXRlLW9wZXJhdGlvbjogVG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiwgeW91IG11c3QgYmUgd2l0aGluZyBhIHRyYW5zYWN0aW9uLCBcCisJb3IgeW91ciBzZXR0aW5ncyBtdXN0IGFsbG93IG5vbnRyYW5zYWN0aW9uYWwgd3JpdGVzIGFuZCBtdXN0IG5vdCBkZXRhY2ggXAorCWFsbCBub250cmFuc2FjdGlvbmFsIHJlYWRzLgorbm90LW1hbmFnZWQ6IFRoZSBnaXZlbiBpbnN0YW5jZSAiezB9IiBpcyBub3QgbWFuYWdlZCBieSB0aGlzIGNvbnRleHQuCit0cmFucy1ub3QtbWFuYWdlZDogVGhpcyBicm9rZXIgaXMgbm90IGNvbmZpZ3VyZWQgdG8gdXNlIG1hbmFnZWQgdHJhbnNhY3Rpb25zLgorYmFkLWRldGFjaGVkLW9wOiBZb3UgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIHswfSBvbiBkZXRhY2hlZCBvYmplY3QgInsxfSIuIFwKKwlUaGlzIG9wZXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gbWFuYWdlZCBvYmplY3RzLgorcGVyc2lzdC1kZXRhY2hlZDogQXR0ZW1wdCB0byBwZXJzaXN0IGRldGFjaGVkIG9iamVjdCAiezB9Ii4KK251bGwtdmFsdWU6IFRoZSBmaWVsZCAiezB9IiBvZiBpbnN0YW5jZSAiezF9IiBjb250YWluZWQgYSBudWxsIHZhbHVlOyBcCisJdGhlIG1ldGFkYXRhIGZvciB0aGlzIGZpZWxkIHNwZWNpZmllcyB0aGF0IG51bGxzIGFyZSBpbGxlZ2FsLgorY2hhbmdlLWlkZW50aXR5OiBBdHRlbXB0IHRvIGNoYW5nZSBhIHByaW1hcnkga2V5IGZpZWxkIG9mIGFuIGluc3RhbmNlIHRoYXQgXAorCWFscmVhZHkgaGFzIGEgZmluYWwgb2JqZWN0IGlkLiAgT25seSBuZXcsIHVuZmx1c2hlZCBpbnN0YW5jZXMgd2hvc2UgaWQgeW91IFwKKwloYXZlIG5vdCByZXRyaWV2ZWQgY2FuIGhhdmUgdGhlaXIgcHJpbWFyeSBrZXlzIGNoYW5nZWQuCittYW5hZ2VkLW9pZDogWW91IGNhbm5vdCBhc3NpZ24gbWFuYWdlZCBvYmplY3QgInswfSIgdG8gdGhlIHByaW1hcnkga2V5IGZpZWxkIFwKKwlvZiAiezF9Ii4gIEVtYmVkZGVkIHByaW1hcnkga2V5IHZhbHVlcyBtdXN0IGJlIHRyYW5zaWVudCBvYmplY3RzLgorY2hhbmdlZC1vaWQ6IFlvdSBoYXZlIG1vZGlmaWVkIHRoZSBvYmplY3QgaWQgZmllbGQgb2YgInsyfSIuICBJdHMgb2xkIHZhbHVlIFwKKwl3YXMgInswfSIsIGFuZCBpdHMgbmV3IHZhbHVlIGlzICJ7MX0iLiAgT2JqZWN0IGlkIGZpZWxkcyBhcmUgaW1tdXRhYmxlIFwKKwlvbmNlIHRoZSBvYmplY3QgaWQgb2YgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGFzc2lnbmVkLiAKK2NhY2hlLWV4aXN0czogQW4gb2JqZWN0IG9mIHR5cGUgInswfSIgd2l0aCBvaWQgInsxfSIgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBcCisJY29udGV4dDsgYW5vdGhlciBjYW5ub3QgYmUgcGVyc2lzdGVkLgorbnVsbC10cmFuczogQXR0ZW1wdCB0byBjb21taXQgYSBudWxsIGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uLiAgU29tZSBcCisJYXBwbGljYXRpb24gc2VydmVycyBzZXQgdGhlIHRyYW5zYWN0aW9uIHRvIG51bGwgaWYgYSByb2xsYmFjayBvY2N1cnMuCitlbmQtdHJhbnMtZXJyb3I6IEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBlbmRpbmcgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyBcCisJZXhjZXB0aW9uIHdpbGwgYmUgcmUtdGhyb3duLgorbm90LWJvdW5kOiBUaGUgZmlsZSBuYW1lZCAiezB9IiBjb3VsZCBub3QgYmUgZm91bmQuCituYW1pbmctZXhjZXB0aW9uOiBBIE5hbWluZ0V4Y2VwdGlvbiB3YXMgdGhyb3duIHdoaWxlIG9idGFpbmluZyB0aGUgXAorCWZhY3RvcnkgYXQgInswfSIgZnJvbSBKTkRJLgorYXR0YWNoLWRlbGV0ZWQ6IFRoZSBvYmplY3QgInswfSIgd2l0aCBpZCAiezF9IiBoYXMgYmVlbiBkZWxldGVkIGFuZCBcCisJY2Fubm90IGJlIGF0dGFjaGVkLgorbm90LWRldGFjaGFibGU6IFRoZSBjbGFzcyAiezB9IiBkb2VzIG5vdCBkZWNsYXJlIHRoZSAiZGV0YWNoYWJsZSIgbWV0YWRhdGEgXAorCWV4dGVuc2lvbiwgc28gY2Fubm90IGJlIGRldGFjaGVkLgorbm90LWNvcHlhYmxlOiBBdHRlbXB0IHRvIGNvcHkgZmllbGQgInswfSIgZmFpbGVkLiAgVGhlIGZpZWxkIGlzIFwKKwlub3QgY29weWFibGUuICBUaGlzIGNhbiBvY2N1ciB3aXRoIGN1c3RvbSBTQ08gdHlwZXMuIE9ubHkgc3RhbmRhcmQgb3IgXAorICAgIGltbXV0YWJsZSBTQ08gdHlwZXMgY2FuIGJlIGF0dGFjaGVkIGFuZCBkZXRhY2hlZC4KK25vLWRldGFjaC1vYmplY3QtaWQ6IENhbm5vdCBhY2Nlc3MgdGhlIGRldGFjaGVkIG9iamVjdCBpZCBvZiBjbGFzcyAiezB9Ii4gXAorCUVuc3VyZSB0aGF0IHRoZSBjbGFzcyBoYXMgdGhlICJkZXRhY2hhYmxlIiBtZXRhZGF0YSBleHRlbnNpb24sIGFuZCBcCisJdGhlIHRoZSBjbGFzcyBoYXMgYmVlbiByZS1lbmhhbmNlZC4KK2F0dGFjaC12ZXJzaW9uLWRlbDogQXR0ZW1wdGVkIHRvIGF0dGFjaCBkZWxldGVkIGluc3RhbmNlIHR5cGUgInswfSIgd2l0aCBvaWQgXAorCSJ7MX0iLiAgSWYgdGhlIGluc3RhbmNlIGlzIG5ldywgdGhlIHZlcnNpb24gZmllbGQgc2hvdWxkIGJlIGxlZnQgdG8gaXRzIFwKKwlkZWZhdWx0IHZhbHVlLgorYXR0YWNoLXdyb25nY2xhc3M6IEF0dGVtcHRlZCB0byBhdHRhY2ggaW5zdGFuY2UgInswfSIgb2YgdHlwZSAiezF9IiwgYnV0IHRoaXMgXAorCWluc3RhbmNlIGlzIGFscmVhZHkgaW4gdGhlIGRhdGFzdG9yZSBhcyB0eXBlICJ7Mn0iLgorc2p2bS1hY3F1aXJlZC1sb2NrOiBBY3F1aXJlZCBhbiBleGNsdXNpdmUgbG9jayBvbiBvaWQgInswfSI6ICJ7MX0iLgorc2p2bS1yZWxlYXNlZC1sb2NrOiBSZWxlYXNlZCBsb2NrICJ7MH0iLgorY29ubi1ub3Qtc3VwcG9ydGVkOiBUaGlzIGRhdGEgc3RvcmUgY2Fubm90IHJldHVybiBjb25uZWN0aW9ucy4KK2luY3JlbWVudGFsLWZsdXNoLW5vdC1zdXBwb3J0ZWQ6IFRoaXMgZGF0YSBzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IGluY3JlbWVudGFsIFwKKwlmbHVzaGluZy4gIElmIHlvdSBnb3QgdGhpcyBlcnJvciB3aGlsZSBwZXJmb3JtaW5nIGEgcXVlcnksIG1ha2Ugc3VyZSB0aGF0IFwKKwl5b3UgaGF2ZSBub3Qgc2V0IHRoZSBGbHVzaEJlZm9yZVF1ZXJpZXMgb3B0aW9uIHRvIHRydWUsIGVpdGhlciBieSBcCisJc2V0dGluZyB0aGF0IG9wdGlvbiBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgYnkgcHJvZ3JhbW1hdGljYWxseSBcCisJc2V0dGluZyB0aGUgY3VycmVudCBGZXRjaENvbmZpZ3VyYXRpb24nJ3MgRmx1c2hCZWZvcmVRdWVyaWVzIHByb3BlcnR5IFwKKwl0byBRdWVyeUZsdXNoTW9kZXMuRkxVU0hfVFJVRS4KK25vbnRyYW5zLXJlYWQtbm90LXN1cHBvcnRlZDogVGhpcyBkYXRhIHN0b3JlIGRvZXMgbm90IHN1cHBvcnQgbm9udHJhbnNhY3Rpb25hbCBcCisJcmVhZHMuICBTZXQgdGhlIE5vbnRyYW5zYWN0aW9uYWxSZWFkIHByb3BlcnR5IHRvIGZhbHNlLgorb3B0aW1pc3RpYy1ub3Qtc3VwcG9ydGVkOiBUaGlzIGRhdGFzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IG9wdGltaXN0aWMgXAorCXRyYW5zYWN0aW9ucy4gIFNldCB0aGUgT3B0aW1pc3RpYyBwcm9wZXJ0eSB0byBmYWxzZS4KK3Jlc3RvcmUtdW5zZXQ6IFRoZSBSZXN0b3JlVmFsdWVzIG9wdGlvbiBpcyBvZmYsIHNvIGluaXRpYWwgdmFsdWVzIGFyZSBcCisJbm90IGF2YWlsYWJsZS4gVHVybiBvbiBSZXN0b3JlVmFsdWVzIHRvIGJlIGFibGUgdG8gb2J0YWluIGluaXRpYWwgXAorCXZhbHVlcy4KK211dGFibGUtcmVzdG9yZS11bnNldDogVGhlIFJlc3RvcmVWYWx1ZXMgb3B0aW9uIGlzIG5vdCBzZXQgdG8gImFsbCIsIFwKKwlpbml0aWFsIHZhbHVlcyBvZiBtdXRhYmxlIGZpZWxkcyBhcmUgbm90IGF2YWlsYWJsZS4gU2V0IFJlc3RvcmVWYWx1ZXMgdG8gXAorCSJhbGwiIGluIHlvdXIgcHJvcGVydGllcyB0byBiZSBhYmxlIHRvIG9idGFpbiBpbml0aWFsIG11dGFibGUgdmFsdWVzLgoraW5pdGlhbC11bmxvYWRlZDogT3BlbkpQQSBjYW5ub3QgcHJvdmlkZSB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgZmllbGQgInswfSIgXAorCWJlY2F1c2UgdGhlIGZpZWxkIHdhcyBuZXZlciBsb2FkZWQgYmVmb3JlIGJlaW5nIGNoYW5nZWQuCitkdXAtb2lkLWFzc2lnbjogQXR0ZW1wdCB0byBhc3NpZ24gaWQgInswfSIgdG8gbmV3IGluc3RhbmNlICJ7MX0iIGZhaWxlZDsgXAorCXRoZXJlIGlzIGFscmVhZHkgYW4gb2JqZWN0IGluIHRoZSBMMSBjYWNoZSB3aXRoIHRoaXMgaWQuIFwKKwlZb3UgbXVzdCBkZWxldGUgdGhpcyBvYmplY3QgKGluIGEgcHJldmlvdXMgdHJhbnNhY3Rpb24gb3IgdGhlIGN1cnJlbnQgb25lKSBcCisJYmVmb3JlIHJldXNpbmcgaXRzIGlkLiAgVGhpcyBlcnJvciBjYW4gYWxzbyBvY2N1ciB3aGVuIGEgaG9yaXpvbnRhbGx5IFwKKwlvciB2ZXJ0aWNhbGx5IG1hcHBlZCBjbGFzc2VzIHVzZXMgYXV0by1pbmNyZW1lbnQgYXBwbGljYXRpb24gaWRlbnRpdHkgYW5kIFwKKwlkb2VzIG5vdCB1c2UgYSBoaWVyYXJjaHkgb2YgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3Nlcy4KK2R1cC1sb2FkOiBDYW5ub3QgbG9hZCBvYmplY3Qgd2l0aCBpZCAiezB9Ii4gIEluc3RhbmNlICJ7MX0iIHdpdGggdGhlIHNhbWUgaWQgXAorCWFscmVhZHkgZXhpc3RzIGluIHRoZSBMMSBjYWNoZS4gIFRoaXMgY2FuIG9jY3VyIHdoZW4geW91IFwKKwlhc3NpZ24gYW4gZXhpc3RpbmcgaWQgdG8gYSBuZXcgaW5zdGFuY2UsIGFuZCBiZWZvcmUgZmx1c2hpbmcgYXR0ZW1wdCB0byBcCisJbG9hZCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UgZm9yIHRoYXQgaWQuCitiYWQtaWQtdmFsdWU6IFRoZSBnaXZlbiB2YWx1ZSAiezB9IiBjYW5ub3QgYmUgY29udmVydGVkIGludG8gYW4gaWRlbnRpdHkgXAorCWZvciAiezJ9Ii4gIFRoZSB2YWx1ZSBpcyB0aGUgd3JvbmcgdHlwZSAoezF9KS4KK2ZhY3RvcnktaW5pdDogU3RhcnRpbmcgT3BlbkpQQSB7MH0KK2ZhY3RvcnktcHJvcGVydGllczogUHJvcGVydGllczogezB9CitpbnZlcnNlLWNvbnNpc3RlbmN5OiBBbiBpbnZlcnNlIGluY29uc2lzdGVuY3kgaW4gdGhlIG9iamVjdCBtb2RlbCB3YXMgXAorCWRldGVjdGVkIHdoaWxlIGZsdXNoaW5nIHRoZSBmaWVsZCAiezB9IiBvZiB0aGUgaW5zdGFuY2Ugd2l0aCBpZCAiezF9IiBcCisJaW4gY29udGV4dCAiezJ9Ii4KK25vLWJyb2tlcmZhY3Rvcnk6IFlvdSBkaWQgbm90IG5hbWUgdGhlIGZhY3RvcnkgY2xhc3Mgd2l0aCB0aGUgcmVxdWlyZWQgXAorCXByb3BlcnR5IG9wZW5qcGEuQnJva2VyRmFjdG9yeS4gIE5vcm1hbGx5IHRoaXMgcHJvcGVydHkgZGVmYXVsdHMgXAorICAgIGFwcHJvcHJpYXRlbHk7IGhhdmUgeW91IGZvcmdvdHRlbiB0byBpbmNsdWRlIGFsbCB0aGUgT3BlbkpQQSBqYXJzIGluIHlvdXIgXAorICAgIGNsYXNzcGF0aD8KK2Jyb2tlcmZhY3RvcnktZXhjZXA6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGVuIGludm9raW5nIHRoZSBzdGF0aWMgXAorCWdldEluc3RhbmNlIG1ldGhvZCBvbiB0aGUgbmFtZWQgZmFjdG9yeSBjbGFzcyAiezB9Ii4gIFNlZSB0aGUgXAorCW5lc3RlZCBleGNlcHRpb24gZm9yIGRldGFpbHMuCituZXctYnJva2VyZmFjdG9yeS1leGNlcDogVGhlcmUgd2FzIGFuIGVycm9yIHdoZW4gaW52b2tpbmcgdGhlIHN0YXRpYyBcCisJbmV3SW5zdGFuY2UgbWV0aG9kIG9uIHRoZSBuYW1lZCBmYWN0b3J5IGNsYXNzICJ7MH0iLiAgU2VlIHRoZSBcCisJbmVzdGVkIGV4Y2VwdGlvbiBmb3IgZGV0YWlscy4KK2JhZC1icm9rZXJmYWN0b3J5OiBDb3VsZCBub3QgaW52b2tlIHRoZSBzdGF0aWMgZ2V0SW5zdGFuY2UgbWV0aG9kIG9uIHRoZSBcCisJbmFtZWQgZmFjdG9yeSBjbGFzcyAiezB9Ii4KK2JhZC1uZXctYnJva2VyZmFjdG9yeTogQ291bGQgbm90IGludm9rZSB0aGUgc3RhdGljIG5ld0luc3RhbmNlIG1ldGhvZCBvbiB0aGUgXAorCW5hbWVkIGZhY3RvcnkgY2xhc3MgInswfSIuCitiYWQtYnJva2VyZmFjdG9yeS1jbGFzczogVGhlIG5hbWVkIEJyb2tlckZhY3RvcnkgInswfSIgaXMgbm90IHZhbGlkLgoraW5zdGFudGlhdGUtYWJzdHJhY3Q6IENhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyBvZiB0eXBlICJ7MH0iIHdpdGggXAorCW9iamVjdCBpZCAiezF9IjsgdGhpcyBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciBcCisJZm9yIHRoZSBjbGFzcyBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCitub250cmFucy1wcm94aWVkOiBZb3UgY2Fubm90IG1ha2UgYSBwcm9wZXJ0eSBhY2Nlc3Mgb2JqZWN0IGNyZWF0ZWQgd2l0aCAibmV3IiBcCisJbm9udHJhbnNhY3Rpb25hbC4KK25vLWZpZWxkOiBGaWVsZCAiezB9IiBpcyBub3QgZGVjbGFyZWQgaW4gInsxfSIsIG9yIGlzIG5vdCBtYW5hZ2VkLgorbm8tZmllbGQtaW5kZXg6ICJ7MH0iIGlzIG5vdCB0aGUgaW5kZXggb2YgYW55IG1hbmFnZWQgZmllbGQgaW4gInsxfSIuCitjYW50LWNhc2NhZGUtcGVyc2lzdDogRW5jb3VudGVyZWQgdW5tYW5hZ2VkIG9iamVjdCAiezB9IiBpbiBwZXJzaXN0ZW50IGZpZWxkIFwKKwkiezF9IiBvZiBtYW5hZ2VkIG9iamVjdCAiezJ9IiBkdXJpbmcgZmx1c2guICBIb3dldmVyLCB0aGlzIGZpZWxkIGRvZXMgbm90IFwKKwlhbGxvdyBjYXNjYWRlIHBlcnNpc3QuICBZb3UgY2Fubm90IGZsdXNoIHVubWFuYWdlZCBvYmplY3RzLgorY2FudC1jYXNjYWRlLWF0dGFjaDogRW5jb3VudGVyZWQgbmV3IG9iamVjdCAiezB9IiBpbiBwZXJzaXN0ZW50IGZpZWxkIFwKKwkiezF9IiBvZiBtYW5hZ2VkIG9iamVjdCAiezJ9IiBkdXJpbmcgYXR0YWNoLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBkb2VzIG5vdCBcCisJYWxsb3cgY2FzY2FkZSBhdHRhY2guICBZb3UgY2Fubm90IGF0dGFjaCBhIHJlZmVyZW5jZSB0byBhIG5ldyBvYmplY3QgXAorCXdpdGhvdXQgY2FzY2FkaW5nLgorcmVmLXRvLWRlbGV0ZWQ6IEVuY291bnRlcmVkIGRlbGV0ZWQgb2JqZWN0ICJ7MH0iIGluIHBlcnNpc3RlbnQgZmllbGQgXAorCSJ7MX0iIG9mIG1hbmFnZWQgb2JqZWN0ICJ7Mn0iIGR1cmluZyBmbHVzaC4KK25vLXZlcnNpb24tZmllbGQ6IEVuY291bnRlcmVkIG9iamVjdCAiezB9IiB3aXRob3V0IGEgdmVyc2lvbiBmaWVsZCBkdXJpbmcgXAorCWF0dGFjaC4gIEluIG9yZGVyIHRvIGF0dGFjaCBhbiBvYmplY3QsIGl0IG11c3QgZWl0aGVyIGJlIGVuaGFuY2VkIG9yIG11c3QgXAorCWhhdmUgYSB2ZXJzaW9uIGZpZWxkLgoraW5tZW0tYWdnLXByb2otdmFyOiBRdWVyaWVzIHdpdGggYWdncmVnYXRlcyBvciBwcm9qZWN0aW9ucyB1c2luZyB2YXJpYWJsZXMgXAorCWN1cnJlbnRseSBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4tbWVtb3J5LiAgRWl0aGVyIHNldCBJZ25vcmVDYWNoZSB0byB0cnVlLCBcCisJc2V0IHRoZSBvcGVuanBhLkZsdXNoQmVmb3JlUXVlcmllcyBwcm9wZXJ0eSB0byB0cnVlLCBvciBleGVjdXRlIHRoZSBxdWVyeSBcCisJYmVmb3JlIGNoYW5naW5nIGFueSBpbnN0YW5jZXMgaW4gdGhlIHRyYW5zYWN0aW9uLiAgVGhlIG9mZmVuZGluZyBxdWVyeSB3YXMgXAorCW9uIHR5cGUgInswfSIgd2l0aCBmaWx0ZXIgInsxfSIuCittZXJnZWQtb3JkZXItd2l0aC1yZXN1bHQ6IFRoaXMgcXVlcnkgb24gY2FuZGlkYXRlIHR5cGUgInswfSIgd2l0aCBmaWx0ZXIgInsxfSIgXAorCWludm9sdmVzIGNvbWJpbmluZyB0aGUgcmVzdWx0cyBvZiBtdWx0aXBsZSBxdWVyaWVzIGluIG1lbW9yeS4gXAorCVlvdSBoYXZlIGNob3NlbiB0byBvcmRlciB0aGUgcmVzdWx0cyBvbiAiezJ9IiwgYnV0IHlvdSBoYXZlIG5vdCBzZWxlY3RlZCBcCisJdGhpcyBkYXRhIGluIHlvdXIgc2V0UmVzdWx0KCkgY2xhdXNlLiAgUGxlYXNlIGluY2x1ZGUgdGhpcyBvcmRlcmluZyBkYXRhIFwKKwlpbiBzZXRSZXN1bHQoKSBzbyB0aGF0IE9wZW5KUEEgY2FuIGV4dHJhY3QgaXQgZm9yIGluLW1lbW9yeSBvcmRlcmluZy4KK2JhZC1ncm91cGluZzogWW91ciBxdWVyeSBvbiB0eXBlICJ7MH0iIHdpdGggZmlsdGVyICJ7MX0iIGlzIGludmFsaWQuICBZb3VyIFwKKyAgICBzZWxlY3QgYW5kIGhhdmluZyBjbGF1c2VzIG11c3Qgb25seSBpbmNsdWRlIGFnZ3JlZ2F0ZXMgb3IgdmFsdWVzIHRoYXQgYWxzbyBcCisgICAgYXBwZWFyIGluIHlvdXIgZ3JvdXBpbmcgY2xhdXNlLgorcXVlcnktbm9zdXBwb3J0OiBUaGUgInswfSIgcXVlcnkgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLgorcXVlcnktdW5tYXBwZWQ6IFlvdSBjYW5ub3QgcXVlcnkgdW5tYXBwZWQgdHlwZSAiezB9Ii4KK3JhbmdlLXRvby1iaWc6IFRoZSByYW5nZSBvZiB0aGUgcXVlcnkgaXMgdG9vIGJpZy4gU3RhcnQgaW5kZXg6ICJ7MH0iLCBlbmQgXAorCWluZGV4OiAiezF9Ii4gVGhlIHJhbmdlIG11c3QgYmUgbGVzcyB0aGFuIEludGVnZXIuTUFYX1ZBTFVFLgoraW52YWxpZC1yYW5nZTogVGhlIHF1ZXJ5IHJhbmdlIGZyb20gezB9IHRvIHsxfSBpcyBub3QgdmFsaWQuCituby1pbXBsczogVW5hYmxlIHRvIGV4ZWN1dGUgYSBxdWVyeSBvbiB0eXBlICJ7MH0iLiAgVGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgXAorCWlzIG5vdCBtYXBwZWQsIGFuZCBkb2VzIG5vdCBoYXZlIGFueSBtYXBwZWQgaW1wbGVtZW50b3JzLgorYmFkLXBhcmFtLW5hbWU6IFRoZSBwYXJhbWV0ZXIgbmFtZSBvciBwb3NpdGlvbiAiezB9IiBwYXNzZWQgdG8gXAorCWV4ZWN1dGUoKSBpcyBub3QgdmFsaWQuICBBbGwgbWFwIGtleXMgbXVzdCBiZSBhIGRlY2xhcmVkIHBhcmFtZXRlciBcCisJbmFtZSBvciBhIG51bWJlciBtYXRjaGluZyB0aGUgcGFyYW1ldGVyIHBvc2l0aW9uLiAKK2ZvcmNlLWluLW1lbTogVGhpcyBxdWVyeSBvbiB0eXBlICJ7MH0iIG11c3QgbG9hZCB0aGUgZW50aXJlIGNhbmRpZGF0ZSBjbGFzcyBcCisJZXh0ZW50IGFuZCBldmFsdWF0ZSB0aGUgcXVlcnkgaW4tbWVtb3J5LiAgVGhpcyBtYXkgYmUgdmVyeSBzbG93LiAgVGhlIFwKKwlxdWVyeSBtdXN0IGJlIGV4ZWN1dGVkIGluIG1lbW9yeSBiZWNhdXNlIE9wZW5KUEEgaXMgY29uZmlndXJlZCB3aXRoIFwKKwlJZ25vcmVDYWNoZT1mYWxzZSBhbmQgRmx1c2hCZWZvcmVRdWVyaWVzPWZhbHNlIGFuZCBcCisJdGhlcmUgYXJlIGRpcnR5IGluc3RhbmNlcyB0aGF0IG1heSBhZmZlY3QgdGhlIHF1ZXJ5JydzIG91dGNvbWUgaW4gdGhlIFwKKwljYWNoZS4KK2NhbnQtZXhlYy1pbm1lbTogUXVlcmllcyBvZiB0aGlzIHR5cGUgKCJ7MH0iKSBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4tbWVtb3J5LiBcCisJRWl0aGVyIHNldCBJZ25vcmVDYWNoZSB0byB0cnVlLCBzZXQgdGhlIG9wZW5qcGEuRmx1c2hCZWZvcmVRdWVyaWVzIFwKKwlwcm9wZXJ0eSB0byB0cnVlLCBvciBleGVjdXRlIHRoZSBxdWVyeSBiZWZvcmUgY2hhbmdpbmcgYW55IGluc3RhbmNlcyBpbiBcCisJdGhlIHRyYW5zYWN0aW9uLgorZXhlY3V0aW5nLXF1ZXJ5OiBFeGVjdXRpbmcgcXVlcnk6IHswfQorZXhlY3V0aW5nLXF1ZXJ5LXdpdGgtcGFyYW1zOiBFeGVjdXRpbmcgcXVlcnk6IFt7MH1dIHdpdGggcGFyYW1ldGVyczogezF9Citub3QtdW5pcXVlOiBUaGUgcXVlcnkgb24gY2FuZGlkYXRlIHR5cGUgInswfSIgd2l0aCBmaWx0ZXIgInsxfSIgd2FzIFwKKwljb25maWd1cmVkIHRvIGhhdmUgYSB1bmlxdWUgcmVzdWx0LCBidXQgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBtYXRjaGVkIFwKKwl0aGUgcXVlcnkuCituby1yZXN1bHQ6IFRoZSBxdWVyeSBvbiBjYW5kaWRhdGUgdHlwZSAiezB9IiB3aXRoIGZpbHRlciAiezF9IiB3YXMgXAorCWNvbmZpZ3VyZWQgdG8gaGF2ZSBhIHVuaXF1ZSByZXN1bHQsIGJ1dCBubyBpbnN0YW5jZSBtYXRjaGVkIFwKKwl0aGUgcXVlcnkuCitzZXJpYWxpemVkOiBRdWVyaWVzIHRoYXQgaGF2ZSBiZWVuIHNlcmlhbGl6ZWQgZG8gbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24uCityZWFkLW9ubHk6IEF0dGVtcHQgdG8gbW9kaWZ5IGEgcmVhZC1vbmx5IHF1ZXJ5IG9iamVjdC4KK25vLWNsYXNzOiBBIGNhbmRpZGF0ZSBDbGFzcyBtdXN0IGJlIHNwZWNpZmllZCBiZWZvcmUgZXhlY3V0aW5nIGEgcXVlcnkuCituby1tb2RpZnktcmVzdWx0Y2xhc3M6IEEgcXVlcnkgdGhhdCBkZWNsYXJlcyBhIHJlc3VsdCBjbGFzcyBjYW5ub3QgYmUgdXNlZCBcCisJdG8gcGVyZm9ybSBidWxrIHVwZGF0ZXMuCituby1tb2RpZnktdW5pcXVlOiBBIHF1ZXJ5IHRoYXQgZGVjbGFyZXMgdW5pcXVlIHJlc3VsdHMgY2Fubm90IGJlIHVzZWQgXAorCXRvIHBlcmZvcm0gYnVsayB1cGRhdGVzLgorbm8tbW9kaWZ5LXJhbmdlOiBBIHF1ZXJ5IHRoYXQgZGVjbGFyZXMgYSByZXN1bHQgcmFuZ2UgY2Fubm90IGJlIHVzZWQgXAorCXRvIHBlcmZvcm0gYnVsayB1cGRhdGVzLgordW5ib3VuZC1wYXJhbTogQ2Fubm90IGV4ZWN1dGUgcXVlcnk7IHRoZSBkZWNsYXJlZCBwYXJhbWV0ZXIgInswfSIgd2FzIFwKKwlub3QgZ2l2ZW4gYSB2YWx1ZS4KK3VuYm91bmQtcGFyYW1zOiBDYW5ub3QgZXhlY3V0ZSBxdWVyeTsgc29tZSBkZWNsYXJlZCBwYXJhbWV0ZXJzIHdlcmUgbm90IGdpdmVuIFwKKwl2YWx1ZXMuICBZb3UgbXVzdCBzdXBwbHkgYSB2YWx1ZSBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMsIFwKKwlpbiB0aGUgZ2l2ZW4gb3JkZXI6IHswfQorZXh0cmEtcGFyYW1zOiBNb3JlIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgdG8gZXhlY3V0ZSgpIHRoYW4gd2VyZSBkZWNsYXJlZDogXAorCXsxfSBwYXJhbWV0ZXJzIHdlcmUgc3BlY2lmaWVkIGZvciBxdWVyeSBleGVjdXRpb24sIGJ1dCBvbmx5IHswfSBcCisJcGFyYW1ldGVycyB3ZXJlIGRlY2xhcmVkIGluIHRoZSBxdWVyeS4KK251bGwtcHJpbWl0aXZlLXBhcmFtOiBQYXJhbWV0ZXIgInswfSIgd2FzIGRlY2xhcmVkIHdpdGggYSBwcmltdGl2ZSB0eXBlLCBidXQgXAorCWhhcyBiZWVuIGdpdmVuIGEgbnVsbCB2YWx1ZS4KK21lcmdlZC1hZ2dyZWdhdGU6IFRoaXMgcXVlcnkgb24gY2FuZGlkYXRlIHR5cGUgInswfSIgd2l0aCBmaWx0ZXIgInsxfSIgXAorCWludm9sdmVzIGNvbWJpbmluZyB0aGUgcmVzdWx0cyBvZiBtdWx0aXBsZSBzdWItcXVlcmllcy4gIEhvd2V2ZXIsIGJlY2F1c2UgXAorCXRoaXMgcXVlcnkgaXMgZm9yIGFnZ3JlZ2F0ZSBkYXRhLCBPcGVuSlBBIGNhbm5vdCBjb21iaW5lIHRoZSBzdWItcXVlcnkgXAorCWFnZ3JlZ2F0ZXMgaW50byBjb3JyZWN0IGZpbmFsIHZhbHVlcy4KK2JhZC1kZWM6IFRoZSB7MX0gZGVjbGFyYXRpb24gInswfSIgaXMgXAorCW5vdCB2YWxpZC4gVmFyaWFibGVzIGFuZCBpbXBvcnRzIG11c3QgYmUgZGVsaW1pdGVkIHdpdGggIjsiLiAgUGFyYW1ldGVycyBcCisJYW5kIG9yZGVyaW5ncyBtdXN0IGJlIGRlbGltaXRlZCB3aXRoICIsIi4gIEltcG9ydHMgcmVxdWlyZSB0aGUgImltcG9ydCIgXAorCWtleXdvcmQsIGFuZCBvcmRlcmluZ3MgcmVxdWlyZSB0aGUgImFzY2VuZGluZyIgb3IgImRlc2NlbmRpbmciIGtleXdvcmQuCittb2QtYmlnZGVjaW1hbDogWW91IGNhbm5vdCB1c2UgdGhlIG1vZHVsbyBvcGVyYXRvciAoJSkgb24gbnVtYmVycyBvZiB0eXBlIFwKKwlCaWdEZWNpbWFsLgorY2FudC1jb252ZXJ0OiBDYW5ub3QgY29udmVydCBvYmplY3QgInswfSIgb2YgdHlwZSAiezF9IiBpbnRvIGFuIGluc3RhbmNlIG9mIFwKKwkiezJ9Ii4KK2JhZC1tZXRob2QtY2xhc3M6IFlvdSBzZXQgdGhlIG1ldGhvZCBuYW1lIG9mIHRoaXMgb3BlbmpwYS5NZXRob2RRTCBxdWVyeSB0byBcCisJInsxfSIsIGJ1dCBjbGFzcyAiezB9IiBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLiAgTWFrZSBzdXJlIHRvIGZ1bGx5IFwKKwlxdWFsaWZ5IHRoZSBjbGFzcyBuYW1lIG9yIHRvIGltcG9ydCBpdHMgcGFja2FnZSBpbnRvIHRoaXMgcXVlcnkgaWYgdGhlIFwKKwljbGFzcyBpcyBub3QgaW4gdGhlIHF1ZXJ5IGNhbmRpZGF0ZSBjbGFzcycnIHBhY2thZ2UuIAorbWV0aG9kLW5vdC1zdGF0aWM6IE1ldGhvZCAiezB9IiBuYW1lZCBpbiB0aGUgTWV0aG9kUUwgcXVlcnkgbXVzdCBiZSBzdGF0aWMuCituby1tZXRob2Q6IFlvdSBtdXN0IHNldCB0aGUgcXVlcnkgZmlsdGVyIHRvIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gZXhlY3V0ZSBcCisJZm9yIHRoaXMgTWV0aG9kUUwgcXVlcnkgaW5zdGFuY2UuCittZXRob2QtZXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciBpbnZva2luZyBtZXRob2QgInswfSIgd2l0aCBhcmd1bWVudHMgInsxfSIuCitiYWQtcGFyYW0tdHlwZTogVGhlIHR5cGUgInswfSIgYXMgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyBcCisJY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSBpbXBvcnRzLgorY2FudC1zZXQ6IFJlc3VsdCB0eXBlICJ7MH0iIGRvZXMgbm90IGhhdmUgYW55IHB1YmxpYyBmaWVsZHMgb3Igc2V0dGVyIG1ldGhvZHMgXAorCWZvciB0aGUgcHJvamVjdGlvbiBvciBhZ2dyZWdhdGUgcmVzdWx0IGVsZW1lbnQgInsxfSIsIG5vciBkb2VzIGl0IGhhdmUgYSBcCisJZ2VuZXJpYyBwdXQoT2JqZWN0LE9iamVjdCkgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQsIG5vciBkb2VzIGl0IGhhdmUgYSBcCisJcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIHR5cGVzIHsyfS4KK3BhY2stZXJyOiBUaGVyZSB3YXMgYW4gZXJyb3IgcGFja2luZyB0aGUgcHJvamVjdGlvbiBhbmQvb3IgYWdncmVnYXRlIHJlc3VsdHMgXAorCW9mIHRoZSBxdWVyeSBpbnRvIHJlc3VsdCB0eXBlICJ7MH0iLiAgU2VlIHRoZSBuZXN0ZWQgdGhyb3dhYmxlIGZvciBkZXRhaWxzLgorcGFjay1pbnN0YW50aWF0aW9uLWVycjogVGhlcmUgd2FzIGFuIGVycm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHR5cGUgInswfSIgXAorCXdoZW4gcGFja2luZyB0aGUgcHJvamVjdGlvbiBhbmQvb3IgYWdncmVnYXRlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5LiBFbnN1cmUgXAorCXRoYXQgeW91IGhhdmUgZGVmaW5lZCBhIHB1YmxpYyBuby1hcmdzIGNvbnN0cnVjdG9yIGluICJ7MH0iLgorYmFkLWlubWVtLW1ldGhvZDogTWV0aG9kICJ7MH0oU3RvcmVDb250ZXh0LCBDbGFzc01ldGFEYXRhLCBib29sZWFuLCBPYmplY3QsIFwKKwlNYXAsIEZldGNoQ29uZmlndXJhdGlvbikiIGlzIG5vdCBkZWNsYXJlZCBpbiB0eXBlICJ7MX0iLiBcCisJQ2hlY2sgdGhlIG1ldGhvZCBuYW1lIHN1cHBsaWVkIGluIHlvdXIgTWV0aG9kUUwgcXVlcnkgZmlsdGVyLiAgXAorCU9wZW5KUEEgaXMgYXR0ZW1wdGluZyB0byBleGVjdXRlIHRoaXMgcXVlcnkgaW4tbWVtb3J5OyBpZiB5b3UgaW1wbGVtZW50ZWQgXAorICAgIHRoZSBkYXRhc3RvcmUgbWV0aG9kIGluc3RlYWQgKGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGJ1dCB3aXRob3V0IFwKKyAgICB0aGUgT2JqZWN0IGFyZ3VtZW50KSBhbmQgd2FudCB0aGlzIHF1ZXJ5IHRvIGV4ZWN1dGUgaW4gdGhlIGRhdGFzdG9yZSwgXAorICAgIGVpdGhlciBtYWtlIHRoZSBxdWVyeSBiZWZvcmUgbW9kaWZ5aW5nIG9iamVjdHMgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIFwKKwlzZXQgSWdub3JlQ2FjaGUgdG8gdHJ1ZSwgb3Igc2V0IHRoZSBvcGVuanBhLkZsdXNoQmVmb3JlUXVlcmllcyBwcm9wZXJ0eSB0byBcCisJdHJ1ZS4KK2JhZC1kYXRhc3RvcmUtbWV0aG9kOiBNZXRob2QgInswfShTdG9yZUNvbnRleHQsIENsYXNzTWV0YURhdGEsIGJvb2xlYW4sIE1hcCwgXAorCUZldGNoQ29uZmlndXJhdGlvbikiIGlzIG5vdCBkZWNsYXJlZCBpbiB0eXBlICJ7MX0iLiAgQ2hlY2sgXAorCXRoZSBtZXRob2QgbmFtZSBzdXBwbGllZCBpbiB5b3VyIE1ldGhvZFFMIHF1ZXJ5IGZpbHRlci4gIE9wZW5KUEEgaXMgXAorCWF0dGVtcHRpbmcgdG8gZXhlY3V0ZSB0aGlzIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFzdG9yZTsgaWYgeW91IGltcGxlbWVudGVkIFwKKwl0aGUgaW4tbWVtb3J5IG1ldGhvZCBpbnN0ZWFkIChhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBidXQgd2l0aCBhbiBcCisJT2JqZWN0IGFyZ3VtZW50KSBhbmQgd2FudCB0aGlzIHF1ZXJ5IHRvIGV4ZWN1dGUgaW4tbWVtb3J5LCBzdXBwbGx5IGEgXAorCUNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlcyB0byBmaWx0ZXIuCitvbmx5LXVwZGF0ZS1jb25zdGFudHM6IEJ1bGsgdXBkYXRlIHF1ZXJpZXMgd2hlbiBleGVjdXRlZCBpbiBtZW1vcnkgXAorCW1heSBvbmx5IHVwZGF0ZSB0byBjb25zdGFudCB2YWx1ZXMuCitvbmx5LXJhbmdlLWNvbnN0YW50czogUmFuZ2UgdmFsdWVzIG11c3QgYmUgbnVtZXJpYyBjb25zdGFudHMuICBJbGxlZ2FsIHF1ZXJ5OiBcCisgICAgezB9Cituby1zYXZlcG9pbnQtY29weTogVW5hYmxlIHRvIGNvcHkgZmllbGQgInswfSIgZm9yIHNhdmVwb2ludC4KK3NhdmVwb2ludC1leGlzdHM6IEEgc2F2ZXBvaW50IHdpdGggdGhlIG5hbWUgInswfSIgYWxyZWFkeSBleGlzdHMuICBcCisJRWFjaCBzYXZlcG9pbnQgbmFtZSBtdXN0IGJlIHVuaXF1ZS4KK25vLWxhc3RzYXZlcG9pbnQ6IENhbm5vdCByb2xsYmFjay9yZWxlYXNlIGxhc3Qgc2F2ZXBvaW50IGFzIG5vIHNhdmVwb2ludCBcCisJaGFzIGJlZW4gc2V0Lgorbm8tc2F2ZXBvaW50OiBZb3UgaGF2ZSBub3Qgc2V0IGEgc2F2ZXBvaW50IHdpdGggdGhlIG5hbWUgInswfSIKK3NhdmVwb2ludC1pbml0OiBUaGlzIHNhdmVwb2ludCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorc2F2ZXBvaW50LWZsdXNoLW5vdC1zdXBwb3J0ZWQ6IFRoZSBjb25maWd1cmVkIFNhdmVwb2ludE1hbmFnZXIgZG9lcyBub3QgXAorCXN1cHBvcnQgaW5jcmVtZW50YWwgZmx1c2hpbmcgd2hlbiBhIHNhdmVwb2ludCBoYXMgYmVlbiBzZXQuICBZb3UgbXVzdCBcCisJcmVsZWFzZSB5b3VyIHNhdmVwb2ludHMgYmVmb3JlIGZsdXNoaW5nLgorY2FsbGJhY2stZXJyOiBFcnJvcnMgb2NjdXJlZCBwcm9jZXNzaW5nIGxpc3RlbmVyIGNhbGxiYWNrcy4gIFNlZSB0aGUgbmVzdGVkIFwKKyAgICBleGNlcHRpb25zIGZvciBkZXRhaWxzLgorYmFkLWFnZy1saXN0ZW5lci1oaW50OiBRdWVyeSBoaW50IHZhbHVlICJ7MH0iICh7MX0pIGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50byBcCisJYW4gYWdncmVnYXRlIGxpc3RlbmVyLgorYmFkLWZpbHRlci1saXN0ZW5lci1oaW50OiBRdWVyeSBoaW50IHZhbHVlICJ7MH0iICh7MX0pIGNhbm5vdCBiZSBjb252ZXJ0ZWQgXAorCWludG8gYSBmaWx0ZXIgbGlzdGVuZXIuCitiYWQtc2V0dGVyLWhpbnQtYXJnOiBJbiBxdWVyeSBoaW50ICJ7MH0iLCBjYW5ub3QgY29udmVydCBoaW50IHZhbHVlICJ7MX0iIHRvIFwKKyAgICB0eXBlICJ7Mn0iLgorZGV0YWNoLXZhbC1taXNtYXRjaDogVGhlIGluc3RhbmNlICJ7MH0iIGlzIG1hbmFnZWQgYnkgYW5vdGhlciBjb250ZXh0IGFuZCBcCisJY2Fubm90IGJlIGluc3BlY3RlZCBmb3IgZmllbGQgdmFsdWVzLgorZGV0YWNoLXZhbC1iYWRzbTogVGhlIGluc3RhbmNlICJ7MH0iIGhhcyBhbiB1bmtub3duIHN0YXRlIG1hbmFnZXIgd2hpY2ggXAorCXByZXZlbnRzIGZpZWxkIGluc3BlY3Rpb24uCitudWxsLW9pZDogQ2Fubm90IHBlcmZvcm0gZmluZCB1c2luZyBudWxsIG9iamVjdCBpZC4KK2lsbGVnYWwtb3AtaW4tcHJlc3RvcmU6IFRoaXMgb3BlcmF0aW9uIGlzIGlsbGVnYWwgd2hlbiBjYWxsZWQgZHVyaW5nIFwKKwl0cmFuc2FjdGlvbiBjb21wbGV0aW9uLgorbm8tZXhwcmVzc2lvbnM6IFRoZSBxdWVyeSBjYW5ub3QgYmUgZXhlY3V0ZWQgYmVjYXVzZSBpdCBoYXMgbm8gXAorCXZhbGlkIGV4cHJlc3Npb25zLgorbnVsbC1mZzogQXR0ZW1wdCB0byBhZGQgbnVsbC9lbXB0eSBmZXRjaCBncm91cCBuYW1lIHRvIGZldGNoIGNvbmZpZ3VyYXRpb24uCitudWxsLWZpZWxkOiBBdHRlbXB0IHRvIGFkZCBudWxsL2VtcHR5IGZpZWxkIG5hbWUgdG8gZmV0Y2ggY29uZmlndXJhdGlvbi4KK2NvbnRhaW5lci1wcm9qZWN0aW9uOiBRdWVyeSBwcm9qZWN0aW9ucyBjYW5ub3QgaW5jbHVkZSBhcnJheSwgY29sbGVjdGlvbiwgb3IgXAorICAgIG1hcCBmaWVsZHMuICBJbnZhbGlkIHF1ZXJ5OiAiezB9IgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvbG9jYWxpemVyLnByb3BlcnRpZXMgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjZhYTBhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMDUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworbWV0YS1yZWZsZWN0OiBVc2luZyByZWZsZWN0aW9uIGZvciBtZXRhZGF0YSBnZW5lcmF0aW9uLgorZ2VuLW1ldGE6IEdlbmVyYXRpbmcgZGVmYXVsdCBtZXRhZGF0YSBmb3IgdHlwZSAiezB9Ii4KK2xvYWQtY2xzOiBMb2FkaW5nIG1ldGFkYXRhIGZvciAiezB9IiB1bmRlciBtb2RlICJ7MX0iLgorbG9hZC1tYXBwaW5nOiBMb2FkaW5nIG1hcHBpbmcgZm9yICJ7MH0iIHVuZGVyIG1vZGUgInsxfSIuCitwcmVwLW1hcHBpbmc6IFByZXBhcmluZyBtYXBwaW5nIGZvciAiezB9Ii4KK3Jlc29sdmUtbWV0YTogUmVzb2x2aW5nIG1ldGFkYXRhIGZvciAiezB9Ii4KK3Jlc29sdmUtZW1iZWQtbWV0YTogUmVzb2x2aW5nIGVtYmVkZGVkIG1ldGFkYXRhIGZvciAiezB9Ii4KK3Jlc29sdmUtbWFwcGluZzogUmVzb2x2aW5nIG1hcHBpbmcgZm9yICJ7MH0iLgorcmVzb2x2ZS1maWVsZDogXHRSZXNvbHZpbmcgZmllbGQgInswfSIuCitpbml0LW1hcHBpbmc6IEluaXRpYWxpemluZyBtYXBwaW5nIGZvciAiezB9Ii4KK3Jlc29sdmUtaWRlbnRpdHk6IEd1ZXNzaW5nIHBlcnNpc3RlbmNlLWNhcGFibGUgY2xhc3MgbmFtZSBmb3IgaWRlbnRpdHkgXAorCWNsYXNzICJ7MH0iLgorcmVzb2x2ZS1lcnJzOiBFcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgcmVzb2x2aW5nIG1ldGFkYXRhLiAgU2VlIG5lc3RlZCBcCisJZXhjZXB0aW9ucyBmb3IgZGV0YWlscy4KK3ByZXYtZXJyczogVW5hYmxlIHRvIHJlc29sdmUgdHlwZSAiezB9IiBkdWUgdG8gcHJldmlvdXMgZXJyb3JzIHJlc29sdmluZyBcCisJcmVsYXRlZCB0eXBlICJ7MX0iLgorY2xlYXItcmVwb3M6IENsZWFyaW5nIG1ldGFkYXRhIHJlcG9zaXRvcnkgInswfSIuCitwcm9jZXNzLXJlZ2lzdGVyZWQ6IFByb2Nlc3NpbmcgcmVnaXN0ZXJlZCBwZXJzaXN0ZW5jZS1jYXBhYmxlIGNsYXNzICJ7MH0iLgorYXNzaWduZWQtc3VwOiBTZXQgcGVyc2lzdGVuY2UtY2FwYWJsZSBzdXBlcmNsYXNzIG9mICJ7MH0iIHRvICJ7MX0iLgorZm91bmQtcGNzOiBGb3VuZCB7MH0gY2xhc3NlcyB3aXRoIG1ldGFkYXRhIGluIHsxfSBtaWxsaXNlY29uZHMuCitub3QtbWFuYWdlZC1pbnRlcmZhY2U6IENhbm5vdCBzZXQgdHlwZSAiezF9IiBhcyBpbnRlcmZhY2UgInswfSIgaW1wbGVtZW50b3IuIFwKKyAgICAiezB9IiBpcyBub3QgYSBtYW5hZ2VkIGludGVyZmFjZS4KK2RlY2xhcmUtbm9uLWludGVyZmFjZTogQ2Fubm90IGRlY2xhcmUgb24gdHlwZSAiezB9IiBpbnRlcmZhY2UgInsxfSIgYXMgaXQgaXMgXAorICAgIG5vdCBhbiBpbnRlcmZhY2UuCit1bm1hbmFnZWQtc3VwLWZpZWxkOiBTdXBlcmNsYXNzIGZpZWxkICJ7MH0iIGlzIG1hcHBlZCBpbiB0aGUgbWV0YWRhdGEgZm9yIFwKKwlzdWJjbGFzcyAiezF9IiwgYnV0IGlzIG5vdCBhIHBlcnNpc3RlbnQgZmllbGQuCitiYWQtZGlzY292ZXItY2xhc3M6IFRoZSBjbGFzcyAiezB9IiBsaXN0ZWQgaW4gdGhlIG9wZW5qcGEuTWV0YURhdGFGYWN0b3J5IFwKKwljb25maWd1cmF0aW9uIHByb3BlcnR5IGNvdWxkIG5vdCBiZSBsb2FkZWQ7IGlnbm9yaW5nLgorYmFkLWxycy1jb25jcmV0ZTogTGFyZ2UgcmVzdWx0IHNldCBmaWVsZHMgbXVzdCBiZSBvZiB0eXBlIGphdmEudXRpbC5Db2xsZWN0aW9uIFwKKwlvciBqYXZhLnV0aWwuTWFwLiAgTm8gY29uY3JldGUgY2xhc3NlcyBvciBvdGhlciBpbnRlcmZhY2VzIGFyZSBhbGxvd2VkLiBcCisJUmVtb3ZlIHRoZSAibHJzIiBleHRlbnNpb24gZnJvbSBmaWVsZCAiezB9IiBvciBjaGFuZ2UgaXQgdG8gb25lIG9mIFwKKwl0aGVzZSB0eXBlcy4KK2JhZC1scnMtYXJyYXk6IEFycmF5IGZpZWxkcyBkbyBub3Qgc3VwcG9ydCBsYXJnZSByZXN1bHQgc2V0cy4gIFJlbW92ZSB0aGUgXAorCSJscnMiIGV4dGVuc2lvbiBmcm9tIGZpZWxkICJ7MH0iLgorYmFkLWxycy1leHRlcm46IEV4dGVybmFsaXplZCBmaWVsZHMgZG8gbm90IHN1cHBvcnQgbGFyZ2UgcmVzdWx0IHNldHMuICBSZW1vdmUgXAorCXRoZSAibHJzIiBleHRlbnNpb24gZnJvbSBmaWVsZCAiezB9Ii4KK25vLWRldGFjaC1vaWQ6IEZpZWxkICJ7MH0iIG5hbWVkIGFzIHRoZSBkZXRhY2ggb2JqZWN0IGlkIGZpZWxkIGZvciB0eXBlICJ7MX0iIFwKKwlkb2VzIG5vdCBleGlzdC4KK25vLWRldGFjaC1zdGF0ZTogRmllbGQgInswfSIgbmFtZWQgYXMgdGhlIGRldGFjaCBzdGF0ZSBmaWVsZCBmb3IgdHlwZSAiezF9IiBcCisJZG9lcyBub3QgZXhpc3QuCitwYXJlbnQtZGV0YWNoLW9pZDogVHlwZSAiezB9IiBkZWNsYXJlcyBhIGRldGFjaCBvYmplY3QgaWQgZmllbGQsIGJ1dCBpcyBub3QgXAorCXRoZSBsZWFzdC1kZXJpdmVkIGRldGFjaGFibGUgY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIHRyZWUuICBPbmx5IHRoZSBcCisJbGVhc3QtZGVyaXZlZCBkZXRhY2hhYmxlIGNsYXNzIGNhbiBuYW1lIHRoZSBkZXRhY2ggb2JqZWN0IGlkIGFuZCBzdGF0ZSBcCisJZmllbGRzLgorcGFyZW50LWRldGFjaC1zdGF0ZTogVHlwZSAiezB9IiBkZWNsYXJlcyBhIGRldGFjaCBzdGF0ZSBmaWVsZCwgYnV0IGlzIG5vdCBcCisJdGhlIGxlYXN0LWRlcml2ZWQgZGV0YWNoYWJsZSBjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgdHJlZS4gIE9ubHkgdGhlIFwKKwlsZWFzdC1kZXJpdmVkIGRldGFjaGFibGUgY2xhc3MgY2FuIG5hbWUgdGhlIGRldGFjaCBvYmplY3QgaWQgYW5kIHN0YXRlIFwKKwlmaWVsZHMuCithcHBpZC1kZXRhY2gtb2lkOiBUeXBlICJ7MH0iIGRlY2xhcmVzIGEgZGV0YWNoIG9iamVjdCBpZCBmaWVsZCwgYnV0IHVzZXMgXAorCWFwcGxpY2F0aW9uIGlkZW50aXR5LiAgRGV0YWNoIG9iamVjdCBpZCBmaWVsZHMgYXJlIG9ubHkgdXNlZCBmb3IgXAorCWRhdGFzdG9yZSBpZGVudGl0eSBjbGFzc2VzLgorbWFuYWdlZC1kZXRhY2gtb2lkOiBGaWVsZCAiezB9IiBpcyBuYW1lZCBhcyB0aGUgZGV0YWNoIG9iamVjdCBpZCBmaWVsZCBpbiBcCisJdHlwZSAiezF9IiwgYnV0IGlzIGEgbWFuYWdlZCBmaWVsZC4gIERldGFjaCBvYmplY3QgaWQgZmllbGRzIGNhbm5vdCBcCisJYmUgbWFuYWdlZC4KK21hbmFnZWQtZGV0YWNoLXN0YXRlOiBGaWVsZCAiezB9IiBpcyBuYW1lZCBhcyB0aGUgZGV0YWNoIHN0YXRlIGZpZWxkIGluIFwKKwl0eXBlICJ7MX0iLCBidXQgaXMgYSBtYW5hZ2VkIGZpZWxkLiAgRGV0YWNoIHN0YXRlIGZpZWxkcyBjYW5ub3QgXAorCWJlIG1hbmFnZWQuCitiYWQtZGV0YWNoLW9pZDogRmllbGQgInswfSIsIG5hbWVkIGFzIHRoZSBkZXRhY2ggb2JqZWN0IGlkIGZpZWxkIGZvciB0eXBlIFwKKwkiezF9IiwgbXVzdCBiZSBvZiB0eXBlIFN0cmluZy4KK2JhZC1kZXRhY2gtc3RhdGU6IEZpZWxkICJ7MH0iLCBuYW1lZCBhcyB0aGUgZGV0YWNoIHN0YXRlIGZpZWxkIGZvciB0eXBlIFwKKwkiezF9IiwgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4KK25vdC1lbmhhbmNlZDogVGhlIHR5cGUgInswfSIgaGFzIG5vdCBiZWVuIGVuaGFuY2VkLgorYXBwaWQtbm90LXN1cHBvcnRlZDogVGhlIGRhdGEgc3RvcmUgZG9lcyBub3Qgc3VwcG9ydCBhcHBsaWNhdGlvbiBpZGVudGl0eS4gXAorCUFsdGVyICJ7MH0iIHRvIHVzZSBkYXRhc3RvcmUgaWRlbnRpdHkuCitkYXRhc3RvcmVpZC1ub3Qtc3VwcG9ydGVkOiBUaGUgZGF0YSBzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IGRhdGFzdG9yZSBpZGVudGl0eS4gXAorCUFsdGVyICJ7MH0iIHRvIHVzZSBhcHBsaWNhdGlvbiBpZGVudGl0eS4KK3JlY3Vyc2UtZW1iZWQ6IEZpZWxkICJ7MH0iIGF0dGVtcHRzIHRvIHJlY3Vyc2l2ZWx5IGVtYmVkIGl0cyBkZWNsYXJpbmcgdHlwZS4KK2NhbnQtZW1iZWQtZXh0ZXJuOiBGaWVsZCAiezB9IiBpcyBtYXJrZWQgYXMgZW1iZWRkZWQsIGJ1dCBPcGVuSlBBIGlzIHVuYWJsZSB0byBcCisJZW1iZWQgdGhlIGZpZWxkLiAgT3BlbkpQQSBjYW5ub3QgZW1iZWQgZmlyc3QtY2xhc3Mgb2JqZWN0IGZpZWxkcyBwcm9kdWNlZCBcCisJdGhyb3VnaCBhbiBleHRlcm5hbGl6ZXIuICBUcmVhdGluZyBhcyBub24tZW1iZWRkZWQuCitjYW50LWVtYmVkOiBGaWVsZCAiezB9IiBpcyBtYXJrZWQgYXMgZW1iZWRkZWQsIGJ1dCB0aGUgc3RvcmUgbWFuYWdlciBpbiB1c2UgXAorCWNhbm5vdCBlbWJlZCBmaXJzdC1jbGFzcyBvYmplY3QgZmllbGRzLiAgVHJlYXRpbmcgYXMgbm9uLWVtYmVkZGVkLgorY2FudC1lbWJlZC1lbGVtZW50OiBGaWVsZCAiezB9IiBpcyBtYXJrZWQgYXMgaGF2aW5nIGFuIGVtYmVkZGVkIGVsZW1lbnQgb3IgXAorCXZhbHVlIHR5cGUsIGJ1dCB0aGUgc3RvcmUgbWFuYWdlciBpbiB1c2UgY2Fubm90IGVtYmVkIGNvbGxlY3Rpb24vbWFwIFwKKwllbGVtZW50cy4gVHJlYXRpbmcgYXMgbm9uLWVtYmVkZGVkLgorY2FudC1lbWJlZC1rZXk6IEZpZWxkICJ7MH0iIGlzIG1hcmtlZCBhcyBoYXZpbmcgYW4gZW1iZWRkZWQga2V5IHR5cGUsIGJ1dCBcCisJdGhlIHN0b3JlIG1hbmFnZXIgaW4gdXNlIGNhbm5vdCBlbWJlZCBtYXAga2V5cy4gIFRyZWF0aW5nIGFzIG5vbi1lbWJlZGRlZC4KK3R5cGUtbm90LXN1cHBvcnRlZDogVGhlIGRhdGEgc3RvcmUgZG9lcyBub3Qgc3VwcG9ydCBmaWVsZHMgb2YgdHlwZSB7MH0uCitudWxsLWV4dGVybmFsOiBBbiBpbnZhbGlkIG51bGwgZXh0ZXJuYWwtdmFsdWUgd2FzIGRlY2xhcmVkIGZvciBmaWVsZCAiezB9Ii4KK2JhZC1leHRlcm5hbC10eXBlOiBUaGUgZmllbGQgInswfSIgY2Fubm90IHVzZSB0aGUgZXh0ZXJuYWwtdmFsdWVzIHByb3BlcnR5LiBcCisJRXh0ZXJuYWwgdmFsdWVzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGZvciBmaWVsZHMgb2YgcHJpbWl0aXZlcywgXAorCXByaW1pdGl2ZSB3cmFwcGVycywgb3Igc3RyaW5ncy4KK25vLWV4dGVybmFsLXZhbHVlczogVGhlIGZpZWxkICJ7MH0iIGRlY2xhcmVzIGFuIGV4dGVybmFsLXZhbHVlcyBwcm9wZXJ0eSBcCisJYnV0IGRvZXMgbm90IGRlY2xhcmUgYW55IHZhbHVlcyBpbiB0aGUgc3RyaW5nOiAiezF9Ii4KK2V4dGVybi1leHRlcm52YWx1ZXM6IFRoZSBmaWVsZCAiezB9IiBjYW5ub3QgZGVjbGFyZSBib3RoIGFuIGV4dGVybmFsaXplciBcCisJbWV0aG9kIGFuZCBleHRlcm5hbCB2YWx1ZXMuCitiYWQtZXh0ZXJuYWxpemVyOiBUaGUgZXh0ZXJuYWxpemVyIG1ldGhvZCAiezF9IiBvbiBmaWVsZCAiezB9IiBpcyBub3QgdmFsaWQuIFwKKyAJSWYgdGhpcyBpcyBhIG1ldGhvZCBvZiB0aGUgb3duaW5nIGNsYXNzIHR5cGUgYW5kIG5vdCB0aGUgZmllbGQgdHlwZSwgbWFrZSBcCisJc3VyZSB5b3UgaGF2ZSBkZWNsYXJlZCB0aGUgbWV0aG9kIGluIHRoZSBmb3JtIFwKKwkiPG93bmluZy1jbGFzcz4uPG1ldGhvZC1uYW1lPiIsIGFuZCB0aGF0IHRoZSBtZXRob2QgaXMgc3RhdGljLgorZXh0ZXJuYWxpemVyLWVycjogVGhlcmUgd2FzIGFuIGVycm9yIGludm9raW5nIHRoZSBleHRlcm5hbGl6ZXIgZm9yIGZpZWxkIFwKKwkiezB9IiBvbiBKYXZhIHZhbHVlICJ7MX0iOiB7Mn0KK2ZhY3RvcnktZXJyOiBUaGVyZSB3YXMgYW4gZXJyb3IgaW52b2tpbmcgdGhlIGZhY3RvcnkgZm9yIGZpZWxkIFwKKwkiezB9IiBvbiBkYXRhc3RvcmUgdmFsdWUgInsxfSI6IHsyfQorYmFkLWZhY3Rvcnk6IFRoZSBmYWN0b3J5IG1ldGhvZCBzdXBwbGllZCBmb3IgZmllbGQgInswfSIgZG9lcyBub3QgZXhpc3Qgb3IgXAorCWlzIG5vdCBhIHZhbGlkIGNvbnN0cnVjdG9yIG9yIG1ldGhvZC4gIElmIHRoZSBmYWN0b3J5IGlzIGEgbWV0aG9kIFwKKwlvZiB0aGUgb3duaW5nIGNsYXNzIGFuZCBub3QgdGhlIGZpZWxkIHR5cGUsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBkZWNsYXJlZCBcCisJdGhlIG1ldGhvZCBpbiB0aGUgZm9ybSAiPG93bmluZy1jbGFzcz4uPG1ldGhvZC1uYW1lPiIuICBBbHNvLCBtYWtlIHN1cmUgXAorCXRoZSBzcGVjaWZpZWQgZmFjdG9yeSBtZXRob2QgaXMgc3RhdGljLgorYmFkLWNsYXNzOiBUaGUgY2xhc3MgbmFtZSAiezB9IiB1c2VkIGluIGEgbWV0YWRhdGEgZXh0ZW5zaW9uIG9uIGZpZWxkICJ7MX0iIFwKKwlpcyBub3QgdmFsaWQuCituby1tYXBwZWQtYnk6ICJ7MH0iIGRlY2xhcmVkIHRoYXQgaXQgaXMgbWFwcGVkIGJ5ICJ7MX0iLCBidXQgdGhhdCBpcyBhIFwKKwlub3QgYSBmaWVsZCBvZiB0aGUgcmVsYXRlZCB0eXBlLgorbm8taW52ZXJzZTogRmllbGQgInswfSIgZGVjbGFyZXMgYSBsb2dpY2FsIGludmVyc2Ugb2YgInsxfSIsIGJ1dCB0aGF0IGlzIGEgbm90IFwKKwlhIGZpZWxkIG9mIHRoZSByZWxhdGVkIHR5cGUuCitjaXJjLW1hcHBlZC1ieTogInswfSIgZGVjbGFyZXMgdGhhdCBpdCBpcyBtYXBwZWQgYnkgInsxfSIsIGJ1dCB0aGF0IFwKKwlmaWVsZCBhbHNvIGRlY2xhcmVzIHRoYXQgaXQgaXMgbWFwcGVkIGJ5IGFub3RoZXIuICBPbmx5IG9uZSBzaWRlIG9mIFwKKwlhIHJlbGF0aW9uIGNhbiBkZWNsYXJlIHRoYXQgaXQgaXMgbWFwcGVkIGJ5IGFub3RoZXIgZmllbGQuCittYXBwZWQtbm90LWludmVyc2U6IEZpZWxkICJ7MH0iIGRlY2xhcmVzIHRoYXQgaXQgaXMgbWFwcGVkIGJ5IGEgZmllbGQgdGhhdCBpcyBcCisJZGlmZmVyZW50IGZyb20gaXRzIGxvZ2ljYWwgaW52ZXJzZSBmaWVsZC4gIFlvdSBkbyBub3QgbmVlZCB0byBuYW1lIHRoZSBcCisJbG9naWNhbCBpbnZlcnNlIGlmIHlvdScndmUgYWxyZWFkeSBkZWNsYXJlZCB0aGF0IHRoZSBmaWVsZCBpcyBtYXBwZWQgYnkgXAorCWFub3RoZXIsIGJ1dCBpZiB5b3UgZG8sIHRoZW4gdGhlIGxvZ2ljYWwgaW52ZXJzZSBtdXN0IHBvaW50IHRvIHRoZSBcCisJbWFwcGluZyBmaWVsZC4KK21hcHBlZC1ieS1ub3Qta2V5OiBZb3UgY2Fubm90IGRlY2xhcmUgdGhhdCAiezB9IiBpcyBtYXBwZWQgYnkgYW5vdGhlciBmaWVsZC4gXAorCU9ubHkgZGlyZWN0IGZpZWxkIHZhbHVlcyBhbmQgbWFwIGtleXMgY2FuIGJlIG1hcHBlZCBieSBhbm90aGVyIGZpZWxkLgorcm0tZmllbGQ6IEZpZWxkICJ7MH0iIGlzIG5vdCBhIHR5cGUgdGhhdCBpcyBwZXJzaXN0ZW50IGJ5IGRlZmF1bHQuICBJZiBcCisJeW91IHdhbnQgdGhpcyBmaWVsZCB0byBiZSBwZXJzaXN0ZW50LCB5b3UgaGF2ZSB0byBleHBsaWNpdGx5IHNldCBpdCB0byBcCisJcGVyc2lzdGVudCBpbiB5b3VyIG1ldGFkYXRhLgorbm8tbWV0YS1ub3RwYzogTm8gbWV0YWRhdGEgd2FzIGZvdW5kIGZvciB0eXBlICJ7MH0iLiBUaGUgY2xhc3MgaXMgXAorCW5vdCBlbmhhbmNlZC4KK25vLW1ldGEtdHlwZXM6IE5vIG1ldGFkYXRhIHdhcyBmb3VuZCBmb3IgdHlwZSAiezB9Ii4gVGhlIGNsYXNzIGRvZXMgXAorCW5vdCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgcGVyc2lzdGVudCB0eXBlczogezF9Lgorbm8tbWV0YTogTm8gbWV0YWRhdGEgd2FzIGZvdW5kIGZvciB0eXBlICJ7MH0iLiAgRW5zdXJlIHRoYXQgdGhlIGNsYXNzIGlzIFwKKwllbmhhbmNlZCAoaWYgbmVjZXNzYXJ5KSwgdGhhdCB0aGUgY2xhc3MgaGFzIGFwcHJvcHJpYXRlIG1ldGFkYXRhLCBhbmQgdGhhdCBcCisJaWYgeW91IGxpc3QgeW91ciBwZXJzaXN0ZW50IGNsYXNzZXMsIHRoZSBjbGFzcyBpcyBpbmNsdWRlZCBpbiB5b3VyIGxpc3QuCituby1vaWQtbWV0YTogQ291bGQgbm90IGxvY2F0ZSBtZXRhZGF0YSBmb3IgdGhlIGNsYXNzIHVzaW5nIG9pZCAiezB9IiBvZiBcCisJdHlwZSAiezF9Ii4gIFJlZ2lzdGVyZWQgb2lkIHR5cGUgbWFwcGluZ3M6ICJ7Mn0iCituby1hbGlhcy1tZXRhOiBDb3VsZCBub3QgbG9jYXRlIG1ldGFkYXRhIGZvciB0aGUgY2xhc3MgdXNpbmcgYWxpYXMgInswfSIuIFRoaXMgXAorCWNvdWxkIG1lYW4gdGhhdCB0aGUgT3BlbkpQQSBlbmhhbmNlciBvciBsb2FkLXRpbWUgd2VhdmVyIHdhcyBub3QgcnVuIG9uIFwKKyAgICB0aGUgdHlwZSB3aG9zZSBhbGlhcyBpcyAiezB9Ii4gUmVnaXN0ZXJlZCBhbGlhcyBtYXBwaW5nczogInsxfSIKK2Vycm9yLXJlZ2lzdGVyZWQ6IEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgcmVnaXN0ZXJlZCBjbGFzcyAiezB9Ii4KK2ZhaWxlZC1yZWdpc3RlcmVkOiBBIHBvdGVudGlhbGx5IHNlcmlvdXMgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyBcCisJcmVnaXN0ZXJlZCBjbGFzcyAiezB9Ii4gIERlZmVycmluZyBwcm9jZXNzaW5nIG9mIHRoaXMgY2xhc3MgdW50aWwgbmV4dCBcCisJb3Bwb3J0dW5pdHkuCitjYWNoZS1uYW1lczogVHlwZSAiezB9IiBkZWNsYXJlcyBhIGNhY2hlIG5hbWUgb2YgInsxfSIsIGJ1dCBpdHMgcGVyc2lzdGVudCBcCisJc3VwZXJjbGFzcyAiezJ9IiB1c2VzIGEgZGlmZmVyZW50IGNhY2hlIG5hbWUgKCJ7M30iKS4KK2NhY2hlLXRpbWVvdXQtaW52YWxpZDogVHlwZSAiezB9IiBkZWNsYXJlcyBhbiBpbnZhbGlkIGRhdGEtY2FjaGUtdGltZW91dCBcCisJdmFsdWUuIFZhbGlkIHRpbWVvdXQgdmFsdWVzIGFyZSAtMSAodG8gZGlzYWJsZSB0aW1lb3V0cyksIG9yIHBvc2l0aXZlIFwKKwlpbnRlZ2Vycy4gVGltZW91dCB3YXMgc2V0IHRvIHsxfS4KK2lkLXR5cGVzOiBUeXBlICJ7MH0iIGRvZXMgbm90IGRlY2xhcmUgdGhlIHNhbWUgaWRlbnRpdHktdHlwZSBhcyBpdHMgcGVyc2lzdGVudCBcCisJc3VwZXJjbGFzcy4KK2lkLWNsYXNzZXM6IFR5cGUgInswfSIgZGVjbGFyZXMgYW4gaWQgY2xhc3MgInsxfSIgdGhhdCBkb2VzIG5vdCBtYXRjaCBvciBcCisJZXh0ZW5kIGl0cyBwZXJzaXN0ZW50IHN1cGVyY2xhc3MgInsyfSIgaWRlbnRpdHkgY2xhc3MgInszfSIuCituby1pZC1jbGFzczogVHlwZSAiezB9IiB3aXRoIGFwcGxpY2F0aW9uIGlkZW50aXR5IGFuZCBubyBzdXBlcmNsYXNzIGRvZXMgXAorCW5vdCBkZWNsYXJlIGFuIGlkIGNsYXNzLiAgVGhpcyB0eXBlIGlzIG5vdCBlbGlnaWJsZSBmb3IgYnVpbHRpbiBcCisJaWRlbnRpdHksIHNvIGl0IG11c3QgZGVjbGFyZSBhbiBpZCBjbGFzcy4JCitiYWQtcGs6IEZpZWxkICJ7MH0iIGNhbm5vdCBiZSBhIHByaW1hcnkga2V5LiAgUHJpbWFyeSBrZXkgZmllbGRzIGNhbiBvbmx5IGJlIFwKKwlkZWNsYXJlZCBpbiBiYXNlIHBlcnNpc3RlbnQgY2xhc3NlcyB0aGF0IGFsc28gZGVjbGFyZSB0aGVpciBpZGVudGl0eS10eXBlIFwKKwl0byBiZSAiYXBwbGljYXRpb24iLgorYmFkLXBrLXR5cGU6IEZpZWxkICJ7MH0iIGNhbm5vdCBiZSBhIHByaW1hcnkga2V5LiAgSXQgaXMgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS4KK25vLXBrOiBDb25jcmV0ZSB0eXBlICJ7MH0iIHdpdGggYXBwbGljYXRpb24gaWRlbnRpdHkgZG9lcyBub3QgZGVjbGFyZSBhbnkgXAorCXByaW1hcnkga2V5IGZpZWxkcy4KK2ludmFsaWQtaWQ6IFRoZSBpZCBjbGFzcyBzcGVjaWZpZWQgYnkgdHlwZSAiezB9IiBkb2VzIG5vdCBtYXRjaCB0aGUgXAorCXByaW1hcnkga2V5IGZpZWxkcyBvZiB0aGUgY2xhc3MuICBNYWtlIHN1cmUgeW91ciBpZGVudGl0eSBjbGFzcyBoYXMgdGhlIFwKKwlzYW1lIHByaW1hcnkga2V5cyBhcyB5b3VyIHBlcnNpc3RlbnQgdHlwZS4gIE1pc21hdGNoZWQgcHJvcGVydHk6ICJ7MX0iCitudWxsLWNvbnM6IFRoZSBpZCBjbGFzcyBzcGVjaWZpZWQgYnkgdHlwZSAiezB9IiBkb2VzIG5vdCBoYXZlIHB1YmxpYyBhIFwKKwluby1hcmdzIGNvbnN0cnVjdG9yLgoraGMtbWV0aG9kOiBUaGUgaWRlbnRpdHkgY2xhc3Mgc3BlY2lmaWVkIGJ5IHR5cGUgInswfSIgaXMgbm90IHZhbGlkLCBhcyB0aGUgXAorCWhhc2hDb2RlIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbi4gSW1wbGVtZW50IGhhc2hDb2RlIHNvIHRoYXQgdHdvIFwKKwlpbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBwcmltYXJ5IGtleSB2YWx1ZXMgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCitlcS1tZXRob2Q6IFRoZSBpZGVudGl0eSBjbGFzcyBzcGVjaWZpZWQgYnkgdHlwZSAiezB9IiBpcyBub3QgdmFsaWQsIGFzIHRoZSBcCisJZXF1YWxzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbi4gSW1wbGVtZW50IHRoZSBlcXVhbHMgbWV0aG9kIHNvIHRoYXQgdHdvIFwKKwl0d28gaW5zdGFuY2VzIHdpbGwgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgcHJpbWFyeSBcCisJa2V5IHZhbHVlcy4KK2FwcGlkLXN0cmF0ZWd5OiBUeXBlICJ7MH0iIHVzZXMgYXBwbGljYXRpb24gaWRlbnRpdHk7IGl0IGNhbm5vdCBhbHNvIGRlY2xhcmUgXAorCWEgZGF0YXN0b3JlIGlkZW50aXR5IHN0cmF0ZWd5LgoraW5jb25zaXN0ZW50LWFjY2VzczogVHlwZSAiezB9IiBhbmQgaXRzIHBlcnNpc3RlbnQgc3VwZXJjbGFzcyAiezF9IiBkZWNsYXJlIFwKKwlkaWZmZXJlbnQgYWNjZXNzIHR5cGVzLiAgQWxsIHBlcnNpc3RlbnQgY2xhc3NlcyBpbiBhbiBpbmhlcml0YW5jZSBcCisJaGllcmFyY2h5IG11c3QgdXNlIHRoZSBzYW1lIGFjY2VzcyB0eXBlIChmaWVsZCB2cy4gcHJvcGVydHkgYWNjZXNzKS4KK25vLXNlcS1uYW1lOiBUaGUgbWV0YWRhdGEgZm9yICJ7MH0iIHNldHMgaXRzIHZhbHVlIG9yIGlkZW50aXR5IHN0cmF0ZWd5IFwKKwl0byBzZXF1ZW5jZSwgYnV0IGRvZXMgbm90IG5hbWUgdGhlIHNlcXVlbmNlIHRvIHVzZS4KK3Vuc3VwcG9ydGVkLXZhbHVlLXN0cmF0ZWd5OiAiezB9IiBkZWNsYXJlcyBhbiB1bnN1cHBvcnRlZCBzdHJhdGVneSBvZiAiezF9IiBcCisJZm9yIGl0cyB7Mn0uCitjYW50LWluaXQtc2VxOiBUaGVyZSB3YXMgYW4gZXJyb3IgaW5zdGFudGlhdGluZyBuYW1lZCBzZXF1ZW5jZSAiezB9Ii4KK25vdC1zZXEtY2xzOiBOYW1lZCBzZXF1ZW5jZSAiezB9IiBkZWNsYXJlcyBhbiBpbnZhbGlkIGNsYXNzICJ7MX0iLgorYmFkLXZhbHVlLXN0cmF0ZWd5OiAiezB9IiBkZWNsYXJlcyBhbiBpZGVudGl0eSBvciB2YWx1ZSBzdHJhdGVneSBvZiAiezF9Ii4gXAorCVRoaXMgaXMgbm90IGEgcmVjb2duaXplZCBzdHJhdGVneS4gIEF2YWlsYWJsZSBzdHJhdGVnaWVzIGFyZTogezJ9CitiYWQtdmFsdWUtc3RyYXRlZ3ktaGludDogInswfSIgZGVjbGFyZXMgYW4gaWRlbnRpdHkgb3IgdmFsdWUgc3RyYXRlZ3kgb2YgXAorCSJ7MX0iLiAgVGhpcyBpcyBub3QgYSByZWNvZ25pemVkIHN0cmF0ZWd5LCB0aG91Z2ggaXQgY2xvc2VseSByZXNlbWJsZXMgXAorCXRoZSBzdGFuZGFyZCBzdHJhdGVneSAiezJ9Ii4gIEF2YWlsYWJsZSBzdHJhdGVnaWVzIGFyZTogezN9CitiYWQtdXBkYXRlLXN0cmF0ZWd5OiAiezB9IiBkZWNsYXJlcyBhIHJlYWQgb25seSB2YWx1ZSBvZiAiezF9Ii4gXAorCVRoaXMgaXMgbm90IGEgcmVjb2duaXplZCBzdHJhdGVneS4gIEF2YWlsYWJsZSBzdHJhdGVnaWVzIGFyZTogezJ9CitiYWQtdXBkYXRlLXN0cmF0ZWd5LWhpbnQ6ICJ7MH0iIGRlY2xhcmVzIGEgcmVhZCBvbmx5IHZhbHVlIG9mIFwKKwkiezF9Ii4gIFRoaXMgaXMgbm90IGEgcmVjb2duaXplZCBzdHJhdGVneSwgdGhvdWdoIGl0IGNsb3NlbHkgcmVzZW1ibGVzIFwKKwl0aGUgc3RhbmRhcmQgc3RyYXRlZ3kgInsyfSIuICBBdmFpbGFibGUgc3RyYXRlZ2llcyBhcmU6IHszfQorbm90LWludGVyZmFjZTogQ2FuJ3Qgc2V0IHR5cGUgInswfSIgdG8gYmUgYSBtYW5hZ2VkIGludGVyZmFjZSBhcyBpdCBpcyBub3QgXAorICAgIGFuZCBpbnRlcmZhY2UuCitpbnRlcmZhY2U6IFRoZSB0eXBlICJ7MH0iIGlzIGFuIHVubWFuYWdlZCBpbnRlcmZhY2UgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgXAorICAgIG1hZGUgcGVyc2lzdGVudC4KK2VudW06IFR5cGUgInswfSIgaXMgYW4gZW51bWVyYXRpb24gYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgbWFkZSBwZXJzaXN0ZW50LgorYmFkLWRyb3A6IFRoZSBtZXRhZGF0YSBmb3Igc29tZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXMgbWF5IG5vdCBoYXZlIFwKKwliZWVuIGRyb3BwZWQ6IHswfQorYmFkLXN0b3JlOiBZb3VyIGNvbmZpZ3VyZWQgTWV0YURhdGFJTyBjYW5ub3QgY3JlYXRlIG1ldGFkYXRhLiAgWW91IFwKKwltdXN0IGNyZWF0ZSBpdCBieSBoYW5kLiAKK3Rvb2wtcnVubmluZzogTWV0YWRhdGEgdG9vbCBydW5uaW5nIG9uIHR5cGUgInswfSIgd2l0aCBhY3Rpb24gInsxfSIuCit0b29sLXJlY29yZDogUmVjb3JkaW5nIG1ldGFkYXRhIGNoYW5nZXMuCit0b29sLXVzYWdlOiBVc2FnZTogamF2YSBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVRvb2xcblwKKwlcdFstcHJvcGVydGllcy8tcCA8cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlPl1cblwKKwlcdFstPHByb3BlcnR5IG5hbWU+IDxwcm9wZXJ0eSB2YWx1ZT5dKlxuXAorCVx0Wy12ZXJib3NlLy12IDx0cnVlL3QgfCBmYWxzZS9mPl1cblwKKwlcdFstZmlsZS8tZiA8c3Rkb3V0IHwgb3V0cHV0IGZpbGUgb3IgcmVzb3VyY2U+XVxuXAorCVx0Wy1hY3Rpb24vLWEgPGFkZCB8IGRyb3A+XVxuXAorCVx0PGNsYXNzIG5hbWUgfCAuamF2YSBmaWxlIHwgLmNsYXNzIGZpbGU+Kworbm8tbmFtZWQtcXVlcnk6IFRoZXJlIGlzIG5vIG5hbWVkIHF1ZXJ5IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAiezB9IiB3aXRoIFwKKwl0aGUgbmFtZSAiezF9Ii4KK25vLW5hbWVkLXF1ZXJ5LW51bGwtY2xhc3M6IFRoZXJlIGlzIG5vIHF1ZXJ5IHdpdGggdGhlIG5hbWUgInsxfSIgZGVmaW5lZCBmb3IgXAorICAgIGFueSBvZiB0aGUga25vd24gcGVyc2lzdGVudCBjbGFzc2VzOiB7MH0uCituby1uYW1lZC1zZXF1ZW5jZTogQ291bGQgbm90IGxvY2F0ZSB0aGUgc2VxdWVuY2Ugd2l0aCBuYW1lICJ7MH0iLiAgSXQgaXMgXAorCXBvc3NpYmxlIHRoYXQgdGhlIG1ldGFkYXRhIGZpbGUgY29udGFpbmluZyB0aGUgc2VxdWVuY2UgaGFzIG5vdCBiZWVuIFwKKwlwYXJzZWQgeWV0LiAgTWFrZSBzdXJlIHRvIHVzZSBhIHBlcnNpc3RlbnQgY2xhc3Mgd2hvc2UgbWV0YWRhdGEgaXMgaW4gXAorCXRoZSBzYW1lIGZpbGUgc29tZXdoZXJlIGluIHlvdXIgYXBwbGljYXRpb24gYmVmb3JlIHJlcXVlc3RpbmcgdGhlIHNlcXVlbmNlLgordW5yZWNvZ25pemVkLWV4dGVuc2lvbjogVGhlIGV4dGVuc2lvbiBrZXkgInsxfSIgZm9yICJ7MH0iIGlzIG5vdCByZWNvZ25pemVkIFwKKwlhbmQgd2lsbCBiZSBpZ25vcmVkLiBWYWxpZCBleHRlbnNpb24ga2V5cyBhcmUgInsyfSIuCit1bnJlY29nbml6ZWQtZXh0ZW5zaW9uLWhpbnQ6IFRoZSBleHRlbnNpb24ga2V5ICJ7MX0iIGZvciAiezB9IiBpcyBub3QgXAorCXJlY29nbml6ZWQgYW5kIHdpbGwgYmUgaWdub3JlZCwgYWx0aG91Z2ggdGhlIG5hbWUgY2xvc2VseSBtYXRjaGVzIHRoZSBcCisJdmFsaWQga2V5ICJ7M30iLiBWYWxpZCBleHRlbnNpb24ga2V5cyBhcmUgInsyfSIuCittdWx0LXZlcnMtZmllbGRzOiBUeXBlICJ7MH0iIGhhcyBtdWx0aXBsZSB2ZXJzaW9uIGZpZWxkczogW3sxfSwgezJ9XQorYmFkLWFjY2Vzcy10eXBlOiBUaGUgQ2xhc3NNZXRhRGF0YSBhY2Nlc3MgdHlwZSBtdXN0IGJlIHNldCB0byBlaXRoZXIgXAorCUNsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEIG9yIENsYXNzTWV0YURhdGEuQUNDRVNTX1BST1BFUlRZLiBBdHRlbXB0IHRvIFwKKwlzZXQgaXQgdG8gInswfSIgZmFpbGVkLgordmFsLW5vdC1wYzogVGhlIG1hcCB2YWx1ZSB0eXBlIG9mIGZpZWxkICJ7MH0iIHdpdGggYSBkZXJpdmVkIGtleSBtdXN0IGJlIGEgXAorCXBlcnNpc3RlbnQgY2xhc3MuCit2YWwtbm90LW9uZS1wazogVGhlIG1hcCB2YWx1ZSB0eXBlIG9mIGZpZWxkICJ7MH0iIGEgZGVyaXZlZCBrZXkgbXVzdCBiZSBhIFwKKwlwZXJzaXN0ZW50IGNsYXNzIHdpdGggZXhhY3RseSBvbmUgcHJpbWFyeSBrZXkgZmllbGQuCisjIHRoaXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgc2V0IG9mIHByZWZpeGVzIHRoYXQgd2Ugd2FudCB0bworIyBleGNsdWRlIGZyb20gdG9wLWxldmVsIHZhbGlkYXRpb24sIHNvIHRoYXQgZXh0ZW5zaW9ucyB0aGF0CisjIHNob3cgdXAgd2l0aCB0aGUgcHJlZml4IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mCisjIGV4dGVuc2lvbnMgdGhhdCBhcmUgdmFsaWRhdGVkIGJ5IGdlbmVyaWMgdG9vbHMgKHN1Y2ggYXMgdGhlIGVuaGFuY2VyKQorZXh0ZW5zaW9uLWRhdGFzdG9yZS1wcmVmaXg6IGpkYmMtCitub25wYy1maWVsZC1vcmRlcmFibGU6IENhbm5vdCBvcmRlciAiezB9IiBvbiAiezF9IiwgYmVjYXVzZSB7MH0gaXMgbm90IGEgXAorCXJlbGF0aW9uIHRvIGFub3RoZXIgcGVyc2lzdGVudCB0eXBlLiAgRm9yIG5vbi1yZWxhdGlvbiBmaWVsZHMsIHlvdSBjYW4gXAorCW9ubHkgb3JkZXIgb24gdGhlIGZpZWxkIGVsZW1lbnQgdmFsdWVzIHRoZW1zZWx2ZXMsIHJlcHJlc2VudGVkIGJ5IFwKKwkiI2VsZW1lbnQiLgorYmFkLWZpZWxkLW9yZGVyYWJsZTogQ2Fubm90IG9yZGVyICJ7MH0iIG9uICJ7MX0iLCBiZWNhdXNlIHRoYXQgaXMgbm90IGEgXAorCXBlcnNpc3RlbnQgZmllbGQgaW4gdGhlIHJlbGF0ZWQgdHlwZS4KK21peGVkLWlubWVtLW9yZGVyaW5nOiBGaWVsZCAiezB9IiB1c2VzIGFuIGludmFsaWQgY29tYmluYXRpb24gb2YgaW4tbWVtb3J5IGFuZCBcCisJZGF0YXN0b3JlIG9yZGVyaW5nIGZvciBpdHMgdmFsdWVzLiAgSWYgYSBjb21iaW5hdGlvbiBpcyB1c2VkLCBhbGwgXAorCWluLW1lbW9yeSBvcmRlcmluZ3MgbXVzdCBhcHBlYXIgaW4gdGhlIG9yZGVyaW5nIGRlY2xhcmF0aW9uIGJlZm9yZSBcCisJZGF0YXN0b3JlIG9yZGVyaW5ncy4KK2NhbnQtb3JkZXI6IEZpZWxkICJ7MH0iIGNhbm5vdCBiZSBvcmRlcmVkLiAgT3JkZXJpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIFwKKwljb2xsZWN0aW9uIGFuZCBhcnJheSBmaWVsZHMuCitsaWZlY3ljbGUtcmVzb2x2ZWQ6IENvdWxkIGFkZCB0aGUgZm9sbG93aW5nIGNhbGxiYWNrIGFkYXB0ZXJzIHRvICJ7MH0iLCBhcyBcCisJdGhlIGxpZmVjeWNsZSBtZXRhZGF0YSBpcyBhbHJlYWR5IHJlc29sdmVkOiB7MX0KK2FjY2Vzcy1maWVsZC1hbmQtcHJvcDogVHlwZSAiezB9IiBhdHRlbXB0cyB0byB1c2UgYm90aCBmaWVsZCBhbmQgcHJvcGVydHkgXAorCWFjY2Vzcy4gT25seSBvbmUgYWNjZXNzIG1ldGhvZCBpcyBwZXJtaXR0ZWQuCit1bnN1cHBvcnRlZC1pZC10eXBlOiBUeXBlICJ7MH0iIGRlY2xhcmVzIGZpZWxkICJ7MX0iIGFzIGEgcHJpbWFyeSBrZXksIGJ1dCBcCisJa2V5cyBvZiB0eXBlICJ7Mn0iIGFyZSBub3Qgc3VwcG9ydGVkLgorZW1wdHktZmctbmFtZTogQXR0ZW1wdCB0byBhZGQgYW4gdW5uYW1lZCBmZXRjaCBncm91cCB0byAiezB9Ii4KK2ludmFsaWQtZmctZGVwdGg6IEZldGNoIGdyb3VwICJ7MH0iIHNwZWNpZmllcyBpbnZhbGlkIHJlY3Vyc2lvbiBkZXB0aCAiezJ9IiBcCisgICAgZm9yIGZpZWxkICJ7MX0iLiBSZWN1cnNpb24gZGVwdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gLTEuCitjeWNsaWMtZmc6IEF0dGVtcHQgdG8gaW5jbHVkZSBmZXRjaCBncm91cCAiezF9IiBpbiBmZXRjaCBncm91cCAiezB9IiBjcmVhdGVzIFwKKyAgICBhbiBpbmNsdXNpb24gY3ljbGUuCitiYWQtZmctaW5jbHVlOiBBdHRlbXB0IHRvIGluY2x1ZGUgbm9uLWV4aXN0ZW50IGZldGNoIGdyb3VwICJ7MX0iIGluIGZldGNoIFwKKyAgICBncm91cCAiezB9Ii4KK3Vua25vd24tZmc6IEF0dGVtcHQgdG8gYWRkIGZldGNoIGdyb3VwICJ7MH0iIHRvIHR5cGUgZmllbGQgInsxfSIgZmFpbGVkLiBcCisgICAgVGhpcyBmZXRjaCBncm91cCBoYXMgbm90IGJlZW4gZGVmaW5lZC4KK2R1cGxpY2F0ZS1pZmFjZS1hbGlhczogQ2Fubm90IGFsaWFzIGludGVyZmFjZSAiezB9IiBwcm9wZXJ0eSAiezF9IiB0byBsb2NhbCBcCisgICAgZmllbGQgInsyfSIgYXMgdGhlIHByb3BlcnR5IGhhcyBhbHJlYWR5IGJlZW4gYWxpYXNlZC4KK3BjLWFuZC1hd2FyZTogQXR0ZW1wdCB0byByZWdpc3RlciAiezB9IiBhcyBhIHBlcnNpc3RlbmNlLWF3YXJlIGNsYXNzIGZhaWxlZC4gXAorCVRoZSBzYW1lIGNsYXNzIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYXMgcGVyc2lzdGVuY2UtY2FwYWJsZSBhbHJlYWR5Lgorbm90LW5vbi1tYXBwZWQ6IFR5cGUgInswfSIgY2Fubm90IGJlIGEgbm9uLW1hcHBlZCBpbnRlcmZhY2UgYXMgdGhlIGNsYXNzIGlzIFwKKyAgICBub3QgYW4gaW50ZXJmYWNlCitub24tbWFwcGVkLXBjOiBBIG5vbi1tYXBwZWQgaW50ZXJmYWNlIGNhbm5vdCBhbHNvIGJlIG1hcHBlZC4KK25vLW1ldGFkYXRhZmFjdG9yeTogTWV0YURhdGFGYWN0b3J5IGNvdWxkIG5vdCBiZSBjb25maWd1cmVkIFwKKyAgICAoY29uZi5uZXdNZXRhRGF0YUZhY3RvcnlJbnN0YW5jZSgpIHJldHVybmVkIG51bGwpLiBUaGlzIG1pZ2h0IG1lYW4gdGhhdCBcCisgICAgbm8gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHdlcmUgZm91bmQuIEVuc3VyZSB0aGF0IHlvdSBoYXZlIGEgXAorICAgIE1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCBmaWxlLCB0aGF0IGl0IGlzIGF2YWlsYWJsZSBpbiB5b3VyIGNsYXNzcGF0aCwgb3IgXAorICAgIHRoYXQgdGhlIHByb3BlcnRpZXMgZmlsZSB5b3UgYXJlIHVzaW5nIGZvciBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS4gXAorICAgIElmIHlvdSBhcmUgdXNpbmcgQW50LCBwbGVhc2Ugc2VlIHRoZSA8cHJvcGVydGllcz4gb3IgPHByb3BlcnRpZXNGaWxlPiBcCisgICAgYXR0cmlidXRlcyBvZiB0aGUgdGFzaycncyBuZXN0ZWQgPGNvbmZpZz4gZWxlbWVudC4gVGhpcyBjYW4gYWxzbyBvY2N1ciBpZiBcCisgICAgeW91ciBPcGVuSlBBIGRpc3RyaWJ1dGlvbiBqYXJzIGFyZSBjb3JydXB0LCBvciBpZiB5b3VyIHNlY3VyaXR5IHBvbGljeSBpcyBcCisgICAgb3Zlcmx5IHN0cmljdC4KK3NjYW5uaW5nLWRpcmVjdG9yeTogU2Nhbm5pbmcgZGlyZWN0b3J5ICJ7MH0iIGZvciBwZXJzaXN0ZW50IHR5cGVzLgorc2Nhbm5pbmctamFyOiBTY2FubmluZyBqYXIgInswfSIgZm9yIHBlcnNpc3RlbnQgdHlwZXMuCitzY2FubmluZy1maWxlOiBTY2FubmluZyBmaWxlICJ7MH0iIGZvciBwZXJzaXN0ZW50IHR5cGVzLgorc2Nhbm5pbmctamFyLXVybDogU2Nhbm5pbmcgamFyOiBVUkwgInswfSIgZm9yIHBlcnNpc3RlbnQgdHlwZXMuCitzY2FubmluZy1qYXItYXQtdXJsOiBTY2FubmluZyBqYXIgZmlsZSBmcm9tIFVSTCAiezB9IiBmb3IgcGVyc2lzdGVudCB0eXBlcy4KK3NjYW5uaW5nLXVybDogU2Nhbm5pbmcgVVJMICJ7MH0iIGZvciBwZXJzaXN0ZW50IHR5cGVzLgorc2Nhbm5pbmctemlwLXN0cmVhbS11cmw6IFNjYW5uaW5nIGphciBpbiBzdHJlYW0gZnJvbSBVUkwgInswfSIgZm9yIHBlcnNpc3RlbnQgXAorCXR5cGVzLgorc2Nhbm5pbmctcmVzb3VyY2U6IFNjYW5uaW5nIHJlc291cmNlICJ7MH0iIGZvciBwZXJzaXN0ZW50IHR5cGVzLgorc2Nhbi1mb3VuZC1uYW1lczogU2NhbiBvZiAiezF9IiBmb3VuZCBwZXJzaXN0ZW50IHR5cGVzIHswfS4KK3BhcnNlLWZvdW5kLW5hbWVzOiBwYXJzZVBlcnNpc3RlbnRUeXBlTmFtZXMoKSBmb3VuZCB7MH0uCitpbnRlcmZhY2UtbG9hZDogRHluYW1pYyBpbXBsZW1lbnRhdGlvbiBvZiBtYW5hZ2VkICJ7MH0iIGNhbiBub3QgYmUgZGVmaW5lZCBcCisJdXNpbmcgY2xhc3Nsb2FkZXIgInsxfSIuIFNlZSBuZXN0ZWQgZXhjZXB0aW9uIGZvciBkZXRhaWxzLgoraW50ZXJmYWNlLWxvYWQyOiBFbmhhbmNlZCBkeW5hbWljIGltcGxlbWVudGFpb24gb2YgbWFuYWdlZCAiezB9IiBjYW4gbm90IGJlIFwKKwlkZWZpbmVkIHVzaW5nIGNsYXNzbG9hZGVyICJ7MX0iLiBTZWUgbmVzdGVkIGV4Y2VwdGlvbiBmb3IgZGV0YWlscy4KK2ludGVyZmFjZS1iYWRlbmhhbmNlOiBEeW5hbWljIGltcGxlbWVudGFpb24gb2YgInswfSIgY2FuIG5vdCBiZSBlbmhhbmNlZC4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNjkzMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNzUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworZmFpbGVkOiBGYWlsZWQ6CituZXN0ZWQ6IE5lc3RlZDoKK251bGwtb2lkOiBOdWxsIGlkIHZhbHVlIGVuY291bnRlcmVkIHdoaWxlIGNyZWF0aW5nIGRhdGFzdG9yZSBpZGVudGl0eSBmb3IgInswfSIuCit1bmtub3duLW9pZDogV2hpbGUgY3JlYXRpbmcgZGF0YXN0b3JlIGlkZW50aXR5IGZvciAiezB9IiwgdW5rbm93biBpZCB2YWx1ZSBcCisJInsxfSIgb2YgdHlwZSAiezJ9IiBlbmNvdW50ZXJlZC4gIENhbm5vdCBjb252ZXJ0IHRvIFwKKyAgICBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JZC4KK2JhZC1zZXItb2lkOiBFbmNvdW50ZXJlZCBvYmplY3QgaWQgInswfSIgaW4gc2VyaWFsaXplZCBkYXRhLCBidXQgdGhlIFwKKwljb3JyZXNwb25kaW5nIHBlcnNpc3RlbnQgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMuICBTdWJzdGl0dXRpbmcgbnVsbCBpbnRvIFwKKwl0aGUgZGVzZXJpYWxpemF0aW9uIHN0cmVhbS4gCit0cmFuc2Zlci1scnM6IFlvdSBjYW5ub3QgdHJhbnNmZXIgbGFyZ2UgcmVzdWx0IHNldCBmaWVsZHMgZnJvbSBvbmUgb2JqZWN0IG9yIFwKKwlmaWVsZCB0byBhbm90aGVyLgoraW52YWxpZC1rZXk6IEFuIGludmFsaWQga2V5IHdhcyBmb3VuZCBpbiBhIENhY2hlTWFwIHdoaWxlIGZsdXNoaW5nIGRhdGEgZnJvbSBcCisJaXQuICBDYWNoZU1hcDogInswfSIuICBLZXk6ICJ7MX0iLiAgQWxsIHVucGlubmVkIG9iamVjdHMgd2VyZSBjbGVhcmVkIGZyb20gXAorCXRoZSBDYWNoZU1hcCBpbiBvcmRlciB0byByZS1lc3RhYmxpc2ggYSBjb25zaXN0ZW50IGNhY2hlLgorbG9jay1mYWlsZWQ6IFVuYWJsZSB0byBvYnRhaW4gYW4gb2JqZWN0IGxvY2sgb24gInswfSIuCitsb2NrLXRpbWVvdXQ6IENvdWxkIG5vdCBvYnRhaW4gYSBsb2NrIG9uIG9iamVjdCAiezB9IiBpbiB7MX0gbWlsbGlzZWNvbmRzLgorbm90LWZvdW5kOiBUaGUgaW5zdGFuY2UgInswfSIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc3RvcmUuCitvYmotZXhpc3RzOiBUaGUgaW5zdGFuY2UgInswfSIgY2Fubm90IGJlIHBlcnNpc3RlZCwgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aCBcCisJYW4gZXhpc3RpbmcgaW5zdGFuY2UuCitub3QtZm91bmQtbXVsdGk6IFRoZSBmb2xsd2luZyBpbnN0bmFjZXMgZG8gbm90IGV4aXN0IGluIHRoZSBkYXRhIHN0b3JlOiB7MH0KK29wdC1sb2NrOiBBbiBvcHRpbWlzdGljIGxvY2sgdmlvbGF0aW9uIHdhcyBkZXRlY3RlZCB3aGVuIGZsdXNoaW5nIG9iamVjdCBcCisJaW5zdGFuY2UgInswfSIgdG8gdGhlIGRhdGEgc3RvcmUuICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBcCisJb2JqZWN0IHdhcyBjb25jdXJyZW50bHkgbW9kaWZpZWQgaW4gYW5vdGhlciB0cmFuc2FjdGlvbi4KK29wdC1sb2NrLW11bHRpOiBPcHRpbWlzdGljIGxvY2tpbmcgZXJyb3JzIHdlcmUgZGV0ZWN0ZWQgd2hlbiBmbHVzaGluZyB0byB0aGUgXAorCWRhdGEgc3RvcmUuICBUaGUgZm9sbG93aW5nIG9iamVjdHMgbWF5IGhhdmUgYmVlbiBjb25jdXJyZW50bHkgbW9kaWZpZWQgaW4gXAorCWFub3RoZXIgdHJhbnNhY3Rpb246IHswfQorb3B0LWxvY2stbmVzdGVkOiBPcHRpbWlzdGljIGxvY2tpbmcgZXJyb3JzIHdlcmUgZGV0ZWN0ZWQgd2hlbiBcCisJZmx1c2hpbmcgdG8gdGhlIGRhdGEgc3RvcmUuICBUaGlzIGluZGljYXRlcyB0aGF0IHNvbWUgb2JqZWN0cyB3ZXJlIFwKKwljb25jdXJyZW50bHkgbW9kaWZpZWQgaW4gYW5vdGhlciB0cmFuc2FjdGlvbi4gIEVhY2ggZXhjZXB0aW9uIGluIFwKKwl0aGUgbmVzdGVkIHRocm93YWJsZXMgYXJyYXkgY29udGFpbnMgYSBmYWlsZWQgb2JqZWN0IHJlcHJlc2VudGluZyBcCisJYSBjb25jdXJyZW50bHkgbW9kaWZpZWQgb2JqZWN0LgorYmFkLWFycmF5OiBVbmFibGUgdG8gY29weSBhcnJheTogezB9Lgorbm8tcHJveHktZmluYWw6IFVuYWJsZSB0byBjcmVhdGUgYSBzZWNvbmQgY2xhc3Mgb2JqZWN0IHByb3h5IGZvciBmaW5hbCBjbGFzcyBcCisgICAgInswfSIuCituby1wcm94eS1pbnRmOiBVbmFibGUgdG8gY3JlYXRlIGEgc2Vjb25kIGNsYXNzIG9iamVjdCBwcm94eSBmb3IgaW50ZXJmYWNlIFwKKyAgICAiezB9Ii4gIE5vIGNvcnJlc3BvbmRpbmcgY29uY3JldGUgdHlwZXMgYXJlIGtub3duLgorbm8tcHJveHktYWJzdHJhY3Q6IFVuYWJsZSB0byBjcmVhdGUgYSBzZWNvbmQgY2xhc3Mgb2JqZWN0IHByb3h5IGZvciBhYnN0cmFjdCBcCisgICAgdHlwZSAiezB9Ii4gIFlvdSBtdXN0IHVzZSBhIGNvbmNyZXRlIHR5cGUgb3IgYSByZWNvZ25pemVkIGludGVyZmFjZS4KK2NhbnQtbmV3aW5zdGFuY2U6IFVuYWJsZSB0byBpbnN0YW50aWF0ZSBwcm94eSBmb3IgdHlwZSAiezB9Ii4gIE1ha2Ugc3VyZSB0aGUgXAorICAgIGNsYXNzIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCituby1kYXRlLWNvbnM6IEN1c3RvbSBkYXRlIHR5cGUgInswfSIgbmVlZHMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9yIGEgXAorICAgIG1pbGxpc2Vjb25kIGNvbnN0cnVjdG9yLgorYmFkLWVsZW0tdHlwZTogVGhlIGdpdmVuIGVsZW1lbnQgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIFwKKwlmaWVsZC4gVGhlIGNvbnRhaW5lciByZXF1aXJlcyB0aGF0IGFsbCBub24tbnVsbCBvYmplY3RzIGFyZSBvZiB0aGUgdHlwZSBcCisJZGVjbGFyZWQgaW4gdGhlIFhNTCBtZXRhZGF0YSBmb3IgdGhpcyBjb250YWluZXIuIFwKKwkiezF9KGxvYWRlcj17MH0pLmlzQXNzaWduYWJsZUZyb20gKHszfShsb2FkZXI9ezJ9KSkiIGZhaWxlZC4KK3N0cmluZy1pZDogVW5hYmxlIHRvIGNyZWF0ZSBhIHZhbGlkIGlkIGZyb20gc3RyaW5nICJ7MH0iLgorYmFkLXNpbmdsZS1pZDogSW52YWxpZCBzaW5nbGUgaWRlbnRpdHkgZGVjbGFyYXRpb24gZm9yIHR5cGUgInswfSIuIE9ubHkgXAorCWEgc2luZ2xlIGZpZWxkIGNhbiBiZSBkZWNsYXJlZCBmb3Igc2luZ2xlIGZpZWxkIGlkZW50aXR5Lgorbm90LXNpbmdsZTogVGhlIGdpdmVuIHR5cGUgInswfSIgZG9lcyBub3QgdXNlIHNpbmdsZSBmaWVsZCBpZGVudGl0eS4KK2JhZC1wazogQmFkIHNpbmdsZSBwcmltYXJ5IGtleSBmaWVsZCAiezB9IgorZHVwLW9pZDogQSBkdXBsaWNhdGUgb2JqZWN0IGlkIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuICBFYWNoIG9iamVjdCB5b3UgXAorCWluc2VydCBpbnRvIHRoZSBkYXRhIHN0b3JlIG11c3QgaGF2ZSB1bmlxdWUgcHJpbWFyeSBrZXkgZmllbGQgdmFsdWVzLiAgCit1bmlxdWU6IEEgdW5pcXVlIGNvbnN0cmFpbnQgdmlvbGF0aW9uIGhhcyBvY2N1cnJlZC4gCityZWYtaW50ZWdyaXR5OiBBIHJlZmVyZW50aWFsIGludGVncml0eSBjb25zdHJhaW50IGhhcyBvY2N1cnJlZC4KK25vLXN0b3JlLWV4dHM6IE5vIHN0b3JlLXNwZWNpZmljIGZhY2FkZSBmb3VuZCBtYXRjaGluZyAiezB9Ii4gIFVzaW5nIGRlZmF1bHQuCitvYmplY3RpZC1hYnN0cmFjdDogQ2Fubm90IGNyZWF0ZSBuZXcgYXBwbGljYXRpb24gaWRlbnRpdHkgaW5zdGFuY2UgZm9yIFwKKwlhYnN0cmFjdCBjbGFzcyAiezB9Ii4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvZWUvVGVzdFdBU01hbmFnZWRSdW50aW1lLmphdmEgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1Rlc3RXQVNNYW5hZ2VkUnVudGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODExNjgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEta2VybmVsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2VlL1Rlc3RXQVNNYW5hZ2VkUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmVlOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOw0KKw0KKy8qKg0KKyAqIFRlc3QgY2xhc3MgZm9yIGJ1aWxkIHRyYW5zZm9ybWF0aW9uIHBlcmZvcm1lZCBieSBXQVNNYW5hZ2VkUnVudGltZS4NCisgKg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0V0FTTWFuYWdlZFJ1bnRpbWUgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIHRlc3Qgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgV0FTTWFuYWdlZFJ1bnRpbWUkV0FTU3luY2hyb25pemF0aW9uDQorICAgICAqIGNsYXNzIHdhcyBwcm9wZXJseSBtb2RpZmllZCBieSB0aGUgbWF2ZW4gYnVpbGQgcHJvY2VzcyAocmVmZXJlbmNlDQorICAgICAqIHRoZSB0b3AgbGV2ZWwgcG9tLnhtbCkuICBUaGlzIHRlc3RjYXNlIHdpbGwgbm90IGV4ZWN1dGUgcHJvcGVybHkNCisgICAgICogd2l0aGluIEVjbGlwc2Ugc2luY2UgdGhlIEVjbGlwc2UgdGFyZ2V0IGRpcmVjdG9yeSAocHJvYmFibHkpIGhhc24ndA0KKyAgICAgKiBiZWVuIG1vZGlmaWVkIHZpYSB0aGUgbWF2ZW4gYnVpbGQuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KKyAgICAgKiBAYXV0aG9yIE1pY2hhZWwgRGljaw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZUFkZGVkKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KKw0KKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoV0FTTWFuYWdlZFJ1bnRpbWUuQ0xBU1MpOw0KKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsNCisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCisgICAgICAgICAgICBtc2cgPSBlLmdldE1lc3NhZ2UoKTsNCisgICAgICAgIH0NCisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gU3RyaW5ncy4NCisgICAgICAgICAgICBnZXRDbGFzc05hbWUoV0FTTWFuYWdlZFJ1bnRpbWUuSU5URVJGQUNFKTsNCisgICAgICAgIGFzc2VydFRydWUoIm1lc3NhZ2Ugc2hvdWxkIGhhdmUgY29udGFpbmVkICINCisgICAgICAgICAgICArIGludGVyZmFjZU5hbWUgKyAiLCBidXQgd2FzICciICsgbXNnICsgIiciLA0KKyAgICAgICAgICAgIG1zZy5jb250YWlucyhpbnRlcmZhY2VOYW1lKSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWtlcm5lbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL1Rlc3RQcm94eU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9UZXN0UHJveHlNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5ZDY2YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1rZXJuZWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9UZXN0UHJveHlNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc3FsLlRpbWU7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXF1ZW50aWFsTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogVGVzdCBwcm94aWVzIGdlbmVyYXRlZCBieSB0aGUgcHJveHkgbWFuYWdlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFByb3h5TWFuYWdlcgorICAgIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBQcm94eU1hbmFnZXJJbXBsIF9tZ3I7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgX21nciA9IG5ldyBQcm94eU1hbmFnZXJJbXBsKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlMaXN0cygpIHsKKyAgICAgICAgTGlzdCBvcmlnID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0TGlzdHNFcXVhbChvcmlnLCAoTGlzdCkgX21nci5jb3B5Q29sbGVjdGlvbihvcmlnKSk7CisKKyAgICAgICAgb3JpZyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRMaXN0c0VxdWFsKG9yaWcsIChMaXN0KSBfbWdyLmNvcHlDb2xsZWN0aW9uKG9yaWcpKTsKKworICAgICAgICBvcmlnID0gbmV3IEN1c3RvbUxpc3QoKTsKKyAgICAgICAgcG9wdWxhdGUob3JpZyk7CisgICAgICAgIGFzc2VydExpc3RzRXF1YWwob3JpZywgKExpc3QpIF9tZ3IuY29weUNvbGxlY3Rpb24ob3JpZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHRoZSBnaXZlbiBsaXN0IHdpdGggYXJiaXRyYXJ5IGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZShDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgY29sbC5hZGQobmV3IEludGVnZXIoMSkpOworICAgICAgICBjb2xsLmFkZCgiZm9vIik7CisgICAgICAgIGNvbGwuYWRkKG5ldyBMb25nKDk5KSk7CisgICAgICAgIGNvbGwuYWRkKCJiYXIiKTsKKyAgICAgICAgY29sbC5hZGQobmV3IFNob3J0KChzaG9ydCkgNTApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gbGlzdHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRMaXN0c0VxdWFsKExpc3QgbDEsIExpc3QgbDIpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsMS5nZXRDbGFzcygpID09IGwyLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEuc2l6ZSgpLCBsMi5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGwxLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsMS5nZXQoaSkgKyAiICE9ICIgKyBsMi5nZXQoaSksIGwxLmdldChpKSA9PSBsMi5nZXQoaSkpOworICAgIH0gIAorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlTZXRzKCkgeworICAgICAgICBTZXQgb3JpZyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRTZXRzRXF1YWwob3JpZywgKFNldCkgX21nci5jb3B5Q29sbGVjdGlvbihvcmlnKSk7CisgICAgICAgIAorICAgICAgICBvcmlnID0gbmV3IEN1c3RvbVNldCgpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0U2V0c0VxdWFsKG9yaWcsIChTZXQpIF9tZ3IuY29weUNvbGxlY3Rpb24ob3JpZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBzZXRzIGFyZSBleGFjdGx5IHRoZSBzYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0U2V0c0VxdWFsKFNldCBzMSwgU2V0IHMyKSB7CisgICAgICAgIGFzc2VydFRydWUoczEuZ2V0Q2xhc3MoKSA9PSBzMi5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMxLnNpemUoKSwgczIuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMxLCBzMik7CisgICAgfSAgCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weVNvcnRlZFNldHMoKSB7CisgICAgICAgIFNvcnRlZFNldCBvcmlnID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgcG9wdWxhdGUob3JpZyk7CisgICAgICAgIGFzc2VydFNvcnRlZFNldHNFcXVhbChvcmlnLCAoU29ydGVkU2V0KSBfbWdyLmNvcHlDb2xsZWN0aW9uKG9yaWcpKTsKKworICAgICAgICBvcmlnID0gbmV3IFRyZWVTZXQobmV3IEN1c3RvbUNvbXBhcmF0b3IoKSk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRTb3J0ZWRTZXRzRXF1YWwob3JpZywgKFNvcnRlZFNldCkgX21nci5jb3B5Q29sbGVjdGlvbihvcmlnKSk7CisgICAgICAgIAorICAgICAgICBvcmlnID0gbmV3IEN1c3RvbVNvcnRlZFNldCgpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0U29ydGVkU2V0c0VxdWFsKG9yaWcsIChTb3J0ZWRTZXQpIF9tZ3IuY29weUNvbGxlY3Rpb24ob3JpZykpOworCisgICAgICAgIG9yaWcgPSBuZXcgQ3VzdG9tQ29tcGFyYXRvclNvcnRlZFNldChuZXcgQ3VzdG9tQ29tcGFyYXRvcigpKTsKKyAgICAgICAgcG9wdWxhdGUob3JpZyk7CisgICAgICAgIGFzc2VydFNvcnRlZFNldHNFcXVhbChvcmlnLCAoU29ydGVkU2V0KSBfbWdyLmNvcHlDb2xsZWN0aW9uKG9yaWcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gc29ydGVkIHNldCB3aXRoIGFyYml0cmFyeSBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGUoU29ydGVkU2V0IGNvbGwpIHsKKyAgICAgICAgY29sbC5hZGQobmV3IEludGVnZXIoMSkpOworICAgICAgICBjb2xsLmFkZChuZXcgSW50ZWdlcig5OSkpOworICAgICAgICBjb2xsLmFkZChuZXcgSW50ZWdlcig1MCkpOworICAgICAgICBjb2xsLmFkZChuZXcgSW50ZWdlcigtNSkpOworICAgICAgICBjb2xsLmFkZChuZXcgSW50ZWdlcigxMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBzZXRzIGFyZSBleGFjdGx5IHRoZSBzYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0U29ydGVkU2V0c0VxdWFsKFNvcnRlZFNldCBzMSwgU29ydGVkU2V0IHMyKSB7CisgICAgICAgIGFzc2VydFRydWUoczEuZ2V0Q2xhc3MoKSA9PSBzMi5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMxLmNvbXBhcmF0b3IoKSwgczIuY29tcGFyYXRvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMxLnNpemUoKSwgczIuc2l6ZSgpKTsKKyAgICAgICAgSXRlcmF0b3IgaXRyMSA9IHMxLml0ZXJhdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0cjIgPSBzMi5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRyMS5oYXNOZXh0KCkpCisgICAgICAgICAgICBhc3NlcnRUcnVlKGl0cjEubmV4dCgpID09IGl0cjIubmV4dCgpKTsKKyAgICB9ICAKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5TnVsbENvbGxlY3Rpb24oKSB7CisgICAgICAgIGFzc2VydE51bGwoX21nci5jb3B5Q29sbGVjdGlvbihudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlQcm94eUNvbGxlY3Rpb24oKSB7CisgICAgICAgIExpc3Qgb3JpZyA9IChMaXN0KSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShBcnJheUxpc3QuY2xhc3MsIG51bGwsIG51bGwpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0TGlzdHNFcXVhbChuZXcgQXJyYXlMaXN0KG9yaWcpLCAoTGlzdCkgX21nci5jb3B5Q29sbGVjdGlvbihvcmlnKSk7CisKKyAgICAgICAgVHJlZVNldCB0b3JpZyA9IChUcmVlU2V0KSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShUcmVlU2V0LmNsYXNzLCBudWxsLCAKKyAgICAgICAgICAgIG5ldyBDdXN0b21Db21wYXJhdG9yKCkpOworICAgICAgICBhc3NlcnRUcnVlKHRvcmlnLmNvbXBhcmF0b3IoKSBpbnN0YW5jZW9mIEN1c3RvbUNvbXBhcmF0b3IpOworICAgICAgICBwb3B1bGF0ZSh0b3JpZyk7CisgICAgICAgIGFzc2VydFNvcnRlZFNldHNFcXVhbChuZXcgVHJlZVNldCh0b3JpZyksIChTb3J0ZWRTZXQpIAorICAgICAgICAgICAgX21nci5jb3B5Q29sbGVjdGlvbih0b3JpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0TWV0aG9kc1Byb3hpZWQoKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIHByb3h5ID0gX21nci5uZXdDb2xsZWN0aW9uUHJveHkoQXJyYXlMaXN0LmNsYXNzLCBudWxsLCBudWxsKS4KKyAgICAgICAgICAgIGdldENsYXNzKCk7CisgICAgICAgIGFzc2VydExpc3RNZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShDdXN0b21MaXN0LmNsYXNzLCBudWxsLCBudWxsKS4KKyAgICAgICAgICAgIGdldENsYXNzKCk7CisgICAgICAgIGFzc2VydExpc3RNZXRob2RzUHJveGllZChwcm94eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byBvdmVycmlkZSB0byBkaXJ0eSB0aGUgY29sbGVjdGlvbiBhcmUKKyAgICAgKiBwcm94aWVkIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbGxlY3Rpb25NZXRob2RzUHJveGllZChDbGFzcyBjbHMpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoImFkZCIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJhZGRBbGwiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtDb2xsZWN0aW9uLmNsYXNzfSkpOyAKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoImNsZWFyIiwgKENsYXNzW10pIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoIml0ZXJhdG9yIiwgKENsYXNzW10pIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInJlbW92ZSIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInJlbW92ZUFsbCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge0NvbGxlY3Rpb24uY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJyZXRhaW5BbGwiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtDb2xsZWN0aW9uLmNsYXNzfSkpOworCisgICAgICAgIC8vIGNoZWNrIGEgbm9uLW11dGF0aW5nIG1ldGhvZCB0byBtYWtlIHN1cmUgd2UncmUgbm90IGp1c3QgcHJveHlpbmcKKyAgICAgICAgLy8gZXZlcnl0aGluZyAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNscy5nZXREZWNsYXJlZE1ldGhvZCgiY29udGFpbnMiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7CisgICAgICAgICAgICBmYWlsKCJQcm94aWVkIG5vbi1tdXRhdGluZyBtZXRob2QuIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byBvdmVycmlkZSB0byBkaXJ0eSB0aGUgbGlzdCBhcmUKKyAgICAgKiBwcm94aWVkIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydExpc3RNZXRob2RzUHJveGllZChDbGFzcyBjbHMpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Q29sbGVjdGlvbk1ldGhvZHNQcm94aWVkKGNscyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJhZGQiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoImFkZEFsbCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge2ludC5jbGFzcywgQ29sbGVjdGlvbi5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoImxpc3RJdGVyYXRvciIsIChDbGFzc1tdKSBudWxsKSk7IAorICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgibGlzdEl0ZXJhdG9yIiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzfSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgicmVtb3ZlIiwgbmV3IENsYXNzW10ge2ludC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzfSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2RzUHJveGllZCgpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgcHJveHkgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShIYXNoU2V0LmNsYXNzLCBudWxsLCBudWxsKS4KKyAgICAgICAgICAgIGdldENsYXNzKCk7CisgICAgICAgIGFzc2VydENvbGxlY3Rpb25NZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShDdXN0b21TZXQuY2xhc3MsIG51bGwsIG51bGwpLmdldENsYXNzKCk7CisgICAgICAgIGFzc2VydENvbGxlY3Rpb25NZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShDdXN0b21Tb3J0ZWRTZXQuY2xhc3MsIG51bGwsIG51bGwpLgorICAgICAgICAgICAgZ2V0Q2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0Q29sbGVjdGlvbk1ldGhvZHNQcm94aWVkKHByb3h5KTsKKworICAgICAgICBwcm94eSA9IF9tZ3IubmV3Q29sbGVjdGlvblByb3h5KEN1c3RvbUNvbXBhcmF0b3JTb3J0ZWRTZXQuY2xhc3MsIG51bGwsIAorICAgICAgICAgICAgbmV3IEN1c3RvbUNvbXBhcmF0b3IoKSkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0Q29sbGVjdGlvbk1ldGhvZHNQcm94aWVkKHByb3h5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVldWVNZXRob2RzUHJveGllZCgpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgcXVldWUgPSBnZXRRdWV1ZUNsYXNzKCk7CisgICAgICAgIGlmIChxdWV1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENsYXNzIHByb3h5ID0gX21nci5uZXdDb2xsZWN0aW9uUHJveHkoTGlua2VkTGlzdC5jbGFzcywgbnVsbCwgbnVsbCkuCisgICAgICAgICAgICBnZXRDbGFzcygpOworICAgICAgICBhc3NlcnRUcnVlKHF1ZXVlLmlzQXNzaWduYWJsZUZyb20ocHJveHkpKTsgICAgICAgIAorICAgICAgICBhc3NlcnRDb2xsZWN0aW9uTWV0aG9kc1Byb3hpZWQocHJveHkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5LmdldERlY2xhcmVkTWV0aG9kKCJvZmZlciIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgicG9sbCIsIChDbGFzc1tdKSBudWxsKSk7IAorICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5LmdldERlY2xhcmVkTWV0aG9kKCJyZW1vdmUiLCAoQ2xhc3NbXSkgbnVsbCkpOyAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5LmdldERlY2xhcmVkTWV0aG9kKCJwZWVrIiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgZmFpbCgiUHJveGllZCBub24tbXV0YXRpbmcgbWV0aG9kLiIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5rZWRMaXN0TWV0aG9kc1Byb3hpZWQoKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIHByb3h5ID0gX21nci5uZXdDb2xsZWN0aW9uUHJveHkoTGlua2VkTGlzdC5jbGFzcywgbnVsbCwgbnVsbCkuCisgICAgICAgICAgICBnZXRDbGFzcygpOworICAgICAgICBhc3NlcnRMaXN0TWV0aG9kc1Byb3hpZWQocHJveHkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5LmdldERlY2xhcmVkTWV0aG9kKCJhZGRGaXJzdCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgiYWRkTGFzdCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgicmVtb3ZlRmlyc3QiLCAoQ2xhc3NbXSkgbnVsbCkpOyAKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgicmVtb3ZlTGFzdCIsIChDbGFzc1tdKSBudWxsKSk7IAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWZWN0b3JNZXRob2RzUHJveGllZCgpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIENsYXNzIHByb3h5ID0gX21nci5uZXdDb2xsZWN0aW9uUHJveHkoVmVjdG9yLmNsYXNzLCBudWxsLCBudWxsKS4KKyAgICAgICAgICAgIGdldENsYXNzKCk7CisgICAgICAgIGFzc2VydExpc3RNZXRob2RzUHJveGllZChwcm94eSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHkuZ2V0RGVjbGFyZWRNZXRob2QoImFkZEVsZW1lbnQiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHkuZ2V0RGVjbGFyZWRNZXRob2QoImluc2VydEVsZW1lbnRBdCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge09iamVjdC5jbGFzcywgaW50LmNsYXNzfSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5LmdldERlY2xhcmVkTWV0aG9kKCJyZW1vdmVBbGxFbGVtZW50cyIsIAorICAgICAgICAgICAgKENsYXNzW10pIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgicmVtb3ZlRWxlbWVudCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgicmVtb3ZlRWxlbWVudEF0IiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzfSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5LmdldERlY2xhcmVkTWV0aG9kKCJzZXRFbGVtZW50QXQiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3MsIGludC5jbGFzc30pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZVRyYWNrZXIoKSB7CisgICAgICAgIFByb3h5IGNvbGwgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShBcnJheUxpc3QuY2xhc3MsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbGwuZ2V0Q2hhbmdlVHJhY2tlcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsLmdldENoYW5nZVRyYWNrZXIoKSAKKyAgICAgICAgICAgIGluc3RhbmNlb2YgQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXJJbXBsKTsKKyAgICAgICAgQ29sbGVjdGlvbkNoYW5nZVRyYWNrZXJJbXBsIGN0ID0gKENvbGxlY3Rpb25DaGFuZ2VUcmFja2VySW1wbCkgCisgICAgICAgICAgICBjb2xsLmdldENoYW5nZVRyYWNrZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjdC5hbGxvd3NEdXBsaWNhdGVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGN0LmlzT3JkZXJlZCgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNrZXIoKSB7CisgICAgICAgIFByb3h5IGNvbGwgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShIYXNoU2V0LmNsYXNzLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb2xsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb2xsLmdldENoYW5nZVRyYWNrZXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29sbC5nZXRDaGFuZ2VUcmFja2VyKCkgCisgICAgICAgICAgICBpbnN0YW5jZW9mIENvbGxlY3Rpb25DaGFuZ2VUcmFja2VySW1wbCk7CisgICAgICAgIENvbGxlY3Rpb25DaGFuZ2VUcmFja2VySW1wbCBjdCA9IChDb2xsZWN0aW9uQ2hhbmdlVHJhY2tlckltcGwpIAorICAgICAgICAgICAgY29sbC5nZXRDaGFuZ2VUcmFja2VyKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGN0LmFsbG93c0R1cGxpY2F0ZXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGN0LmlzT3JkZXJlZCgpKTsKKyAgICB9CisgCisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JbnRlcmZhY2VQcm94eSgpIHsKKyAgICAgICAgUHJveHkgY29sbCA9IF9tZ3IubmV3Q29sbGVjdGlvblByb3h5KENvbGxlY3Rpb24uY2xhc3MsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0SW50ZXJmYWNlUHJveHkoKSB7CisgICAgICAgIFByb3h5IGNvbGwgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShMaXN0LmNsYXNzLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb2xsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsIGluc3RhbmNlb2YgTGlzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEludGVyZmFjZVByb3h5KCkgeworICAgICAgICBQcm94eSBjb2xsID0gX21nci5uZXdDb2xsZWN0aW9uUHJveHkoU2V0LmNsYXNzLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb2xsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsIGluc3RhbmNlb2YgU2V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29sbCBpbnN0YW5jZW9mIFNvcnRlZFNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEludGVyZmFjZVByb3h5KCkgeworICAgICAgICBQcm94eSBjb2xsID0gX21nci5uZXdDb2xsZWN0aW9uUHJveHkoU29ydGVkU2V0LmNsYXNzLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb2xsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsIGluc3RhbmNlb2YgU29ydGVkU2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVldWVJbnRlcmZhY2VQcm94eSgpIHsKKyAgICAgICAgQ2xhc3MgcXVldWUgPSBnZXRRdWV1ZUNsYXNzKCk7CisgICAgICAgIGlmIChxdWV1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFByb3h5IGNvbGwgPSBfbWdyLm5ld0NvbGxlY3Rpb25Qcm94eShxdWV1ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29sbCk7CisgICAgICAgIGFzc2VydFRydWUocXVldWUuaXNJbnN0YW5jZShjb2xsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgamF2YS51dGlsLlF1ZXVlfSBjbGFzcyBpZiBhdmFpYWxibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0UXVldWVDbGFzcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuUXVldWUiKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlNYXBzKCkgeworICAgICAgICBNYXAgb3JpZyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRNYXBzRXF1YWwob3JpZywgKE1hcCkgX21nci5jb3B5TWFwKG9yaWcpKTsKKworICAgICAgICBvcmlnID0gbmV3IEN1c3RvbU1hcCgpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0TWFwc0VxdWFsKG9yaWcsIChNYXApIF9tZ3IuY29weU1hcChvcmlnKSk7CisKKyAgICAgICAgUHJvcGVydGllcyBwb3JpZyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHBvcmlnLnNldFByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIHBvcmlnLnNldFByb3BlcnR5KCJiYXIiLCAiYml6Iik7CisgICAgICAgIHBvcmlnLnNldFByb3BlcnR5KCJiaXoiLCAiYmF6Iik7CisgICAgICAgIGFzc2VydE1hcHNFcXVhbChvcmlnLCAoTWFwKSBfbWdyLmNvcHlNYXAob3JpZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHRoZSBnaXZlbiBtYXAgd2l0aCBhcmJpdHJhcnkgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlKE1hcCBtYXApIHsKKyAgICAgICAgbWFwLnB1dChuZXcgSW50ZWdlcigxKSwgIjEiKTsKKyAgICAgICAgbWFwLnB1dChuZXcgSW50ZWdlcig5OSksICI5OSIpOworICAgICAgICBtYXAucHV0KG5ldyBJbnRlZ2VyKC0yKSwgIi0yIik7CisgICAgICAgIG1hcC5wdXQobmV3IEludGVnZXIoNTApLCAiNTAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gbWFwcyBhcmUgZXhhY3RseSB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE1hcHNFcXVhbChNYXAgbTEsIE1hcCBtMikgeworICAgICAgICBhc3NlcnRUcnVlKG0xLmdldENsYXNzKCkgPT0gbTIuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMS5zaXplKCksIG0yLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtMSwgbTIpOworICAgIH0gIAorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlTb3J0ZWRNYXBzKCkgeworICAgICAgICBTb3J0ZWRNYXAgb3JpZyA9IG5ldyBUcmVlTWFwKCk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRTb3J0ZWRNYXBzRXF1YWwob3JpZywgKFNvcnRlZE1hcCkgX21nci5jb3B5TWFwKG9yaWcpKTsKKworICAgICAgICBvcmlnID0gbmV3IFRyZWVNYXAobmV3IEN1c3RvbUNvbXBhcmF0b3IoKSk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRTb3J0ZWRNYXBzRXF1YWwob3JpZywgKFNvcnRlZE1hcCkgX21nci5jb3B5TWFwKG9yaWcpKTsKKworICAgICAgICBvcmlnID0gbmV3IEN1c3RvbVNvcnRlZE1hcCgpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0U29ydGVkTWFwc0VxdWFsKG9yaWcsIChTb3J0ZWRNYXApIF9tZ3IuY29weU1hcChvcmlnKSk7CisKKyAgICAgICAgb3JpZyA9IG5ldyBDdXN0b21Db21wYXJhdG9yU29ydGVkTWFwKG5ldyBDdXN0b21Db21wYXJhdG9yKCkpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0U29ydGVkTWFwc0VxdWFsKG9yaWcsIChTb3J0ZWRNYXApIF9tZ3IuY29weU1hcChvcmlnKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIG1hcHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTb3J0ZWRNYXBzRXF1YWwoU29ydGVkTWFwIG0xLCBTb3J0ZWRNYXAgbTIpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtMS5nZXRDbGFzcygpID09IG0yLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobTEuY29tcGFyYXRvcigpLCBtMi5jb21wYXJhdG9yKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobTEuc2l6ZSgpLCBtMi5zaXplKCkpOworICAgICAgICBNYXAuRW50cnkgZW50cnkxOworICAgICAgICBNYXAuRW50cnkgZW50cnkyOworICAgICAgICBJdGVyYXRvciBpdHIxID0gbTEuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvciBpdHIyID0gbTIuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRyMS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGVudHJ5MSA9IChNYXAuRW50cnkpIGl0cjEubmV4dCgpOworICAgICAgICAgICAgZW50cnkyID0gKE1hcC5FbnRyeSkgaXRyMi5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVudHJ5MS5nZXRLZXkoKSA9PSBlbnRyeTIuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0VmFsdWUoKSA9PSBlbnRyeTIuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9ICAKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5TnVsbE1hcCgpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChfbWdyLmNvcHlNYXAobnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5UHJveHlNYXAoKSB7CisgICAgICAgIE1hcCBvcmlnID0gKE1hcCkgX21nci5uZXdNYXBQcm94eShIYXNoTWFwLmNsYXNzLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgcG9wdWxhdGUob3JpZyk7CisgICAgICAgIGFzc2VydE1hcHNFcXVhbChuZXcgSGFzaE1hcChvcmlnKSwgKE1hcCkgX21nci5jb3B5TWFwKG9yaWcpKTsKKworICAgICAgICBUcmVlTWFwIHRvcmlnID0gKFRyZWVNYXApIF9tZ3IubmV3TWFwUHJveHkoVHJlZU1hcC5jbGFzcywgbnVsbCwgbnVsbCwgCisgICAgICAgICAgICBuZXcgQ3VzdG9tQ29tcGFyYXRvcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b3JpZy5jb21wYXJhdG9yKCkgaW5zdGFuY2VvZiBDdXN0b21Db21wYXJhdG9yKTsKKyAgICAgICAgcG9wdWxhdGUodG9yaWcpOworICAgICAgICBhc3NlcnRTb3J0ZWRNYXBzRXF1YWwobmV3IFRyZWVNYXAodG9yaWcpLCAoU29ydGVkTWFwKSAKKyAgICAgICAgICAgIF9tZ3IuY29weU1hcCh0b3JpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBNZXRob2RzUHJveGllZCgpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgcHJveHkgPSBfbWdyLm5ld01hcFByb3h5KEhhc2hNYXAuY2xhc3MsIG51bGwsIG51bGwsIG51bGwpLgorICAgICAgICAgICAgZ2V0Q2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0TWFwTWV0aG9kc1Byb3hpZWQocHJveHkpOworCisgICAgICAgIHByb3h5ID0gX21nci5uZXdNYXBQcm94eShUcmVlTWFwLmNsYXNzLCBudWxsLCBudWxsLCBudWxsKS5nZXRDbGFzcygpOworICAgICAgICBhc3NlcnRNYXBNZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld01hcFByb3h5KFRyZWVNYXAuY2xhc3MsIG51bGwsIG51bGwsIAorICAgICAgICAgICAgbmV3IEN1c3RvbUNvbXBhcmF0b3IoKSkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0TWFwTWV0aG9kc1Byb3hpZWQocHJveHkpOworCisgICAgICAgIHByb3h5ID0gX21nci5uZXdNYXBQcm94eShDdXN0b21NYXAuY2xhc3MsIG51bGwsIG51bGwsIG51bGwpLmdldENsYXNzKCk7CisgICAgICAgIGFzc2VydE1hcE1ldGhvZHNQcm94aWVkKHByb3h5KTsKKworICAgICAgICBwcm94eSA9IF9tZ3IubmV3TWFwUHJveHkoQ3VzdG9tU29ydGVkTWFwLmNsYXNzLCBudWxsLCBudWxsLCBudWxsKS4KKyAgICAgICAgICAgIGdldENsYXNzKCk7CisgICAgICAgIGFzc2VydE1hcE1ldGhvZHNQcm94aWVkKHByb3h5KTsKKworICAgICAgICBwcm94eSA9IF9tZ3IubmV3TWFwUHJveHkoQ3VzdG9tQ29tcGFyYXRvclNvcnRlZE1hcC5jbGFzcywgbnVsbCwgbnVsbCwgCisgICAgICAgICAgICBuZXcgQ3VzdG9tQ29tcGFyYXRvcigpKS5nZXRDbGFzcygpOworICAgICAgICBhc3NlcnRNYXBNZXRob2RzUHJveGllZChwcm94eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byBvdmVycmlkZSB0byBkaXJ0eSB0aGUgY29sbGVjdGlvbiBhcmUKKyAgICAgKiBwcm94aWVkIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hcE1ldGhvZHNQcm94aWVkKENsYXNzIGNscykgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgicHV0IiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJwdXRBbGwiLCBuZXcgQ2xhc3NbXSB7TWFwLmNsYXNzfSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgiY2xlYXIiLCAoQ2xhc3NbXSkgbnVsbCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgicmVtb3ZlIiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgia2V5U2V0IiwgKENsYXNzW10pIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInZhbHVlcyIsIChDbGFzc1tdKSBudWxsKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJlbnRyeVNldCIsIChDbGFzc1tdKSBudWxsKSk7CisKKyAgICAgICAgLy8gY2hlY2sgYSBub24tbXV0YXRpbmcgbWV0aG9kIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QganVzdCBwcm94eWluZworICAgICAgICAvLyBldmVyeXRoaW5nIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xzLmdldERlY2xhcmVkTWV0aG9kKCJjb250YWluc0tleSIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKKyAgICAgICAgICAgIGZhaWwoIlByb3hpZWQgbm9uLW11dGF0aW5nIG1ldGhvZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc01ldGhvZHNQcm94aWVkKCkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzcyBwcm94eSA9IF9tZ3IubmV3TWFwUHJveHkoUHJvcGVydGllcy5jbGFzcywgbnVsbCwgbnVsbCwgbnVsbCkuCisgICAgICAgICAgICBnZXRDbGFzcygpOworICAgICAgICBhc3NlcnRNYXBNZXRob2RzUHJveGllZChwcm94eSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHkuZ2V0RGVjbGFyZWRNZXRob2QoInNldFByb3BlcnR5IiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHkuZ2V0RGVjbGFyZWRNZXRob2QoImxvYWQiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtJbnB1dFN0cmVhbS5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eS5nZXREZWNsYXJlZE1ldGhvZCgibG9hZEZyb21YTUwiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtJbnB1dFN0cmVhbS5jbGFzc30pKTsKKyAgICB9IAorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlEYXRlcygpIHsKKyAgICAgICAgRGF0ZSBvcmlnID0gbmV3IERhdGUoMTk5OSk7CisgICAgICAgIGFzc2VydERhdGVzRXF1YWwob3JpZywgKERhdGUpIF9tZ3IuY29weURhdGUob3JpZykpOworCisgICAgICAgIG9yaWcgPSBuZXcgamF2YS5zcWwuRGF0ZSgxOTk5KTsKKyAgICAgICAgYXNzZXJ0RGF0ZXNFcXVhbChvcmlnLCAoRGF0ZSkgX21nci5jb3B5RGF0ZShvcmlnKSk7CisKKyAgICAgICAgb3JpZyA9IG5ldyBUaW1lKDE5OTkpOworICAgICAgICBhc3NlcnREYXRlc0VxdWFsKG9yaWcsIChEYXRlKSBfbWdyLmNvcHlEYXRlKG9yaWcpKTsKKworICAgICAgICBUaW1lc3RhbXAgdG9yaWcgPSBuZXcgVGltZXN0YW1wKDE5OTkpOworICAgICAgICB0b3JpZy5zZXROYW5vcygyMDAxKTsKKyAgICAgICAgYXNzZXJ0RGF0ZXNFcXVhbCh0b3JpZywgKERhdGUpIF9tZ3IuY29weURhdGUodG9yaWcpKTsKKworICAgICAgICB0b3JpZyA9IG5ldyBDdXN0b21EYXRlKDE5OTkpOworICAgICAgICB0b3JpZy5zZXROYW5vcygyMDAxKTsKKyAgICAgICAgYXNzZXJ0RGF0ZXNFcXVhbCh0b3JpZywgKERhdGUpIF9tZ3IuY29weURhdGUodG9yaWcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gZGF0ZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREYXRlc0VxdWFsKERhdGUgZDEsIERhdGUgZDIpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkMS5nZXRDbGFzcygpID09IGQxLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZDEsIGQyKTsKKyAgICB9ICAKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5TnVsbERhdGUoKSB7CisgICAgICAgIGFzc2VydE51bGwoX21nci5jb3B5RGF0ZShudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlQcm94eURhdGUoKSB7CisgICAgICAgIERhdGUgb3JpZyA9IChEYXRlKSBfbWdyLm5ld0RhdGVQcm94eShUaW1lLmNsYXNzKTsKKyAgICAgICAgb3JpZy5zZXRUaW1lKDE5OTkpOworICAgICAgICBhc3NlcnREYXRlc0VxdWFsKG5ldyBEYXRlKG9yaWcuZ2V0VGltZSgpKSwgKERhdGUpIF9tZ3IuY29weURhdGUob3JpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlTWV0aG9kc1Byb3hpZWQoKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIHByb3h5ID0gX21nci5uZXdEYXRlUHJveHkoRGF0ZS5jbGFzcykuZ2V0Q2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0RGF0ZU1ldGhvZHNQcm94aWVkKHByb3h5KTsKKworICAgICAgICBwcm94eSA9IF9tZ3IubmV3RGF0ZVByb3h5KGphdmEuc3FsLkRhdGUuY2xhc3MpLmdldENsYXNzKCk7CisgICAgICAgIGFzc2VydERhdGVNZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld0RhdGVQcm94eShUaW1lLmNsYXNzKS5nZXRDbGFzcygpOworICAgICAgICBhc3NlcnREYXRlTWV0aG9kc1Byb3hpZWQocHJveHkpOworCisgICAgICAgIHByb3h5ID0gX21nci5uZXdEYXRlUHJveHkoVGltZXN0YW1wLmNsYXNzKS5nZXRDbGFzcygpOworICAgICAgICBhc3NlcnRUaW1lc3RhbXBNZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld0RhdGVQcm94eShDdXN0b21EYXRlLmNsYXNzKS5nZXRDbGFzcygpOworICAgICAgICBhc3NlcnRUaW1lc3RhbXBNZXRob2RzUHJveGllZChwcm94eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byBvdmVycmlkZSB0byBkaXJ0eSB0aGUgZGF0ZSBhcmUKKyAgICAgKiBwcm94aWVkIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERhdGVNZXRob2RzUHJveGllZChDbGFzcyBjbHMpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldERhdGUiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRIb3VycyIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge2ludC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldE1pbnV0ZXMiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRNb250aCIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge2ludC5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldFNlY29uZHMiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRUaW1lIiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7bG9uZy5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldFllYXIiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3N9KSk7CisKKyAgICAgICAgLy8gY2hlY2sgYSBub24tbXV0YXRpbmcgbWV0aG9kIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QganVzdCBwcm94eWluZworICAgICAgICAvLyBldmVyeXRoaW5nIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRUaW1lIiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgZmFpbCgiUHJveGllZCBub24tbXV0YXRpbmcgbWV0aG9kLiIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBtZXRob2RzIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdG8gZGlydHkgdGhlIHRpbWVzdGFtcCBhcmUKKyAgICAgKiBwcm94aWVkIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRpbWVzdGFtcE1ldGhvZHNQcm94aWVkKENsYXNzIGNscykgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnREYXRlTWV0aG9kc1Byb3hpZWQoY2xzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldE5hbm9zIiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzfSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5Q2FsZW5kYXJzKCkgeworICAgICAgICBDYWxlbmRhciBvcmlnID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRDYWxlbmRhcnNFcXVhbChvcmlnLCBfbWdyLmNvcHlDYWxlbmRhcihvcmlnKSk7CisKKyAgICAgICAgb3JpZyA9IG5ldyBDdXN0b21DYWxlbmRhcigpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0Q2FsZW5kYXJzRXF1YWwob3JpZywgX21nci5jb3B5Q2FsZW5kYXIob3JpZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIGNhbGVuZGFyIHdpdGggYXJiaXRyYXJ5IGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZShDYWxlbmRhciBjYWwpIHsKKyAgICAgICAgY2FsLnNldFRpbWVJbk1pbGxpcygxOTk5KTsKKyAgICAgICAgY2FsLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJDU1QiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIGRhdGVzIGFyZSBleGFjdGx5IHRoZSBzYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q2FsZW5kYXJzRXF1YWwoQ2FsZW5kYXIgYzEsIENhbGVuZGFyIGMyKSB7CisgICAgICAgIGFzc2VydFRydWUoYzEuZ2V0Q2xhc3MoKSA9PSBjMS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMxLCBjMik7CisgICAgfSAgCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weU51bGxDYWxlbmRhcigpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChfbWdyLmNvcHlDYWxlbmRhcihudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlQcm94eUNhbGVuZGFyKCkgeworICAgICAgICBDYWxlbmRhciBvcmlnID0gKENhbGVuZGFyKSBfbWdyLm5ld0NhbGVuZGFyUHJveHkKKyAgICAgICAgICAgIChHcmVnb3JpYW5DYWxlbmRhci5jbGFzcywgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkNTVCIpKTsKKyAgICAgICAgcG9wdWxhdGUob3JpZyk7CisgICAgICAgIENhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICBwb3B1bGF0ZShjYWwpOworICAgICAgICBhc3NlcnRDYWxlbmRhcnNFcXVhbChjYWwsIF9tZ3IuY29weUNhbGVuZGFyKG9yaWcpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsZW5kYXJBYnN0cmFjdENsYXNzUHJveHkoKSB7CisgICAgICAgIFByb3h5IGNhbCA9IF9tZ3IubmV3Q2FsZW5kYXJQcm94eShDYWxlbmRhci5jbGFzcywgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2FsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsZW5kYXJNZXRob2RzUHJveGllZCgpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgcHJveHkgPSBfbWdyLm5ld0NhbGVuZGFyUHJveHkoR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MsCisgICAgICAgICAgICBUaW1lWm9uZS5nZXREZWZhdWx0KCkpLmdldENsYXNzKCk7CisgICAgICAgIGFzc2VydENhbGVuZGFyTWV0aG9kc1Byb3hpZWQocHJveHkpOworCisgICAgICAgIHByb3h5ID0gX21nci5uZXdDYWxlbmRhclByb3h5KEN1c3RvbUNhbGVuZGFyLmNsYXNzLAorICAgICAgICAgICAgVGltZVpvbmUuZ2V0RGVmYXVsdCgpKS5nZXRDbGFzcygpOworICAgICAgICBhc3NlcnRDYWxlbmRhck1ldGhvZHNQcm94aWVkKHByb3h5KTsKKworICAgICAgICBwcm94eSA9IF9tZ3IubmV3Q2FsZW5kYXJQcm94eShDYWxlbmRhci5jbGFzcywKKyAgICAgICAgICAgIFRpbWVab25lLmdldERlZmF1bHQoKSkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0Q2FsZW5kYXJNZXRob2RzUHJveGllZChwcm94eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byBvdmVycmlkZSB0byBkaXJ0eSB0aGUgY2FsZW5kYXIgYXJlCisgICAgICogcHJveGllZCBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDYWxlbmRhck1ldGhvZHNQcm94aWVkKENsYXNzIGNscykgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgic2V0IiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJyb2xsIiwgCisgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzLCBpbnQuY2xhc3N9KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xzLmdldERlY2xhcmVkTWV0aG9kKCJzZXRUaW1lSW5NaWxsaXMiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtsb25nLmNsYXNzfSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNscy5nZXREZWNsYXJlZE1ldGhvZCgic2V0VGltZVpvbmUiLCAKKyAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtUaW1lWm9uZS5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoImNvbXB1dGVGaWVsZHMiLCAoQ2xhc3NbXSkgbnVsbCkpOworCisgICAgICAgIC8vIGNoZWNrIGEgbm9uLW11dGF0aW5nIG1ldGhvZCB0byBtYWtlIHN1cmUgd2UncmUgbm90IGp1c3QgcHJveHlpbmcKKyAgICAgICAgLy8gZXZlcnl0aGluZyAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNscy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0VGltZUluTWlsbGlzIiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgZmFpbCgiUHJveGllZCBub24tbXV0YXRpbmcgbWV0aG9kLiIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5QmVhbnMoKSB7CisgICAgICAgIEN1c3RvbUJlYW4gb3JpZyA9IG5ldyBDdXN0b21CZWFuKCk7CisgICAgICAgIHBvcHVsYXRlKG9yaWcpOworICAgICAgICBhc3NlcnRCZWFuc0VxdWFsKG9yaWcsIChDdXN0b21CZWFuKSBfbWdyLmNvcHlDdXN0b20ob3JpZykpOworCisgICAgICAgIG9yaWcgPSBuZXcgQ3VzdG9tQ29weUNvbnN0cnVjdG9yQmVhbihvcmlnKTsKKyAgICAgICAgYXNzZXJ0QmVhbnNFcXVhbChvcmlnLCAoQ3VzdG9tQmVhbikgX21nci5jb3B5Q3VzdG9tKG9yaWcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gYmVhbiB3aXRoIGFyYml0cmFyeSBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZShDdXN0b21CZWFuIGJlYW4pIHsKKyAgICAgICAgYmVhbi5zZXRTdHJpbmcoImZvbyIpOworICAgICAgICBiZWFuLnNldE51bWJlcig5OSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbnByb3h5YWJsZUJlYW4oKSB7CisgICAgICAgIE5vbnByb3h5YWJsZUJlYW4gb3JpZyA9IG5ldyBOb25wcm94eWFibGVCZWFuKDEpOworICAgICAgICBwb3B1bGF0ZShvcmlnKTsKKyAgICAgICAgYXNzZXJ0TnVsbChfbWdyLmNvcHlDdXN0b20ob3JpZykpOworICAgICAgICBhc3NlcnROdWxsKF9tZ3IubmV3Q3VzdG9tUHJveHkob3JpZykpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIGJlYW5zIGFyZSBleGFjdGx5IHRoZSBzYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QmVhbnNFcXVhbChDdXN0b21CZWFuIGIxLCBDdXN0b21CZWFuIGIyKSB7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0Q2xhc3MoKSA9PSBiMi5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRTdHJpbmcoKSA9PSBiMi5nZXRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0TnVtYmVyKCkgPT0gYjIuZ2V0TnVtYmVyKCkpOworICAgIH0gIAorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlOdWxsQmVhbigpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChfbWdyLmNvcHlDdXN0b20obnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5UHJveHlCZWFuKCkgeworICAgICAgICBDdXN0b21CZWFuIG9yaWcgPSAoQ3VzdG9tQmVhbikgX21nci5uZXdDdXN0b21Qcm94eShuZXcgQ3VzdG9tQmVhbigpKTsKKyAgICAgICAgcG9wdWxhdGUob3JpZyk7CisgICAgICAgIEN1c3RvbUJlYW4gY29tcCA9IG5ldyBDdXN0b21CZWFuKCk7CisgICAgICAgIHBvcHVsYXRlKGNvbXApOworICAgICAgICBhc3NlcnRCZWFuc0VxdWFsKGNvbXAsIChDdXN0b21CZWFuKSBfbWdyLmNvcHlDdXN0b20ob3JpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuTWV0aG9kc1Byb3hpZWQoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgcHJveHkgPSBfbWdyLm5ld0N1c3RvbVByb3h5KG5ldyBDdXN0b21CZWFuKCkpLmdldENsYXNzKCk7CisgICAgICAgIGFzc2VydEJlYW5NZXRob2RzUHJveGllZChwcm94eSk7CisKKyAgICAgICAgcHJveHkgPSBfbWdyLm5ld0N1c3RvbVByb3h5KG5ldyBDdXN0b21Db3B5Q29uc3RydWN0b3JCZWFuCisgICAgICAgICAgICAobmV3IEN1c3RvbUJlYW4oKSkpLmdldENsYXNzKCk7CisgICAgICAgIGFzc2VydEJlYW5NZXRob2RzUHJveGllZChwcm94eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byBvdmVycmlkZSB0byBkaXJ0eSB0aGUgYmVhbiBhcmUKKyAgICAgKiBwcm94aWVkIGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEJlYW5NZXRob2RzUHJveGllZChDbGFzcyBjbHMpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldFN0cmluZyIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzc30pKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjbHMuZ2V0RGVjbGFyZWRNZXRob2QoInNldE51bWJlciIsIAorICAgICAgICAgICAgbmV3IENsYXNzW10ge2ludC5jbGFzc30pKTsKKworICAgICAgICAvLyBjaGVjayBhIG5vbi1tdXRhdGluZyBtZXRob2QgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBqdXN0IHByb3h5aW5nCisgICAgICAgIC8vIGV2ZXJ5dGhpbmcgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbHMuZ2V0RGVjbGFyZWRNZXRob2QoImdldFN0cmluZyIsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIlByb3hpZWQgbm9uLW11dGF0aW5nIG1ldGhvZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKFRlc3RQcm94eU1hbmFnZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdGVzdCBjdXN0b20gbGlzdCBoYW5kbGluZy4gIENvcHkgY29uc3RydWN0b3IgaW50ZW50aW9uYWxseSAKKyAgICAgKiBvbW1pdHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUxpc3QKKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNlcXVlbnRpYWxMaXN0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3QgX2RlbGVnYXRlID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaWR4KSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmxpc3RJdGVyYXRvcihpZHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byB0ZXN0IGN1c3RvbSBzZXQgaGFuZGxpbmcuICBDb3B5IGNvbnN0cnVjdG9yIGludGVudGlvbmFsbHkgCisgICAgICogb21taXR0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21TZXQKKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNldCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2RlbGVnYXRlID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsZWdhdGUuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFkZChvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdGVzdCBjdXN0b20gc2V0IGhhbmRsaW5nLiAgQ29weSBjb25zdHJ1Y3RvciBpbnRlbnRpb25hbGx5IAorICAgICAqIG9tbWl0dGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tU29ydGVkU2V0CisgICAgICAgIGV4dGVuZHMgVHJlZVNldCB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byB0ZXN0IGN1c3RvbSBzZXQgaGFuZGxpbmcuICBDb3B5IGNvbnN0cnVjdG9yIGludGVudGlvbmFsbHkgCisgICAgICogb21taXR0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21Db21wYXJhdG9yU29ydGVkU2V0CisgICAgICAgIGV4dGVuZHMgVHJlZVNldCB7CisKKyAgICAgICAgcHVibGljIEN1c3RvbUNvbXBhcmF0b3JTb3J0ZWRTZXQoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ3VzdG9tQ29tcGFyYXRvclNvcnRlZFNldChDb21wYXJhdG9yIGNvbXApIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byB0ZXN0IGN1c3RvbSBtYXAgaGFuZGxpbmcuICBDb3B5IGNvbnN0cnVjdG9yIGludGVudGlvbmFsbHkgCisgICAgICogb21taXR0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21NYXAKKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1hcCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX2RlbGVnYXRlID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsZWdhdGUucHV0KGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5lbnRyeVNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byB0ZXN0IGN1c3RvbSBtYXAgaGFuZGxpbmcuICBDb3B5IGNvbnN0cnVjdG9yIGludGVudGlvbmFsbHkgCisgICAgICogb21taXR0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21Tb3J0ZWRNYXAKKyAgICAgICAgZXh0ZW5kcyBUcmVlTWFwIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRlc3QgY3VzdG9tIG1hcCBoYW5kbGluZy4gIENvcHkgY29uc3RydWN0b3IgaW50ZW50aW9uYWxseSAKKyAgICAgKiBvbW1pdHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUNvbXBhcmF0b3JTb3J0ZWRNYXAKKyAgICAgICAgZXh0ZW5kcyBUcmVlTWFwIHsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tQ29tcGFyYXRvclNvcnRlZE1hcCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDdXN0b21Db21wYXJhdG9yU29ydGVkTWFwKENvbXBhcmF0b3IgY29tcCkgeworICAgICAgICAgICAgc3VwZXIoY29tcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRlc3QgdHJhbnNmZXIgb2YgY29tcGFyYXRvcnMgdG8gcHJveGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21Db21wYXJhdG9yCisgICAgICAgIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSBvMSkuY29tcGFyZVRvKG8yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdGVzdCBjdXN0b20gZGF0ZSBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbURhdGUKKyAgICAgICAgZXh0ZW5kcyBUaW1lc3RhbXAgeworCisgICAgICAgIHB1YmxpYyBDdXN0b21EYXRlKGxvbmcgdGltZSkgeworICAgICAgICAgICAgc3VwZXIodGltZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRlc3QgY3VzdG9tIGJlYW4gaGFuZGxpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21CZWFuIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3N0cmluZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX251bWJlcjsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBfc3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIF9zdHJpbmcgPSBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsgCisgICAgICAgICAgICByZXR1cm4gX251bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihpbnQgbnVtYmVyKSB7CisgICAgICAgICAgICBfbnVtYmVyID0gbnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byB0ZXN0IGN1c3RvbSBiZWFuIGhhbmRsaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tQ29weUNvbnN0cnVjdG9yQmVhbiAKKyAgICAgICAgZXh0ZW5kcyBDdXN0b21CZWFuIHsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tQ29weUNvbnN0cnVjdG9yQmVhbihDdXN0b21CZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHNldFN0cmluZyhiZWFuLmdldFN0cmluZygpKTsKKyAgICAgICAgICAgIHNldE51bWJlcihiZWFuLmdldE51bWJlcigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gbm9uLXByb3h5YWJsZSBjdXN0b20gYmVhbiBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbnByb3h5YWJsZUJlYW4gCisgICAgICAgIGV4dGVuZHMgQ3VzdG9tQmVhbiB7CisKKyAgICAgICAgcHVibGljIE5vbnByb3h5YWJsZUJlYW4obG9uZyB4KSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgbm9uLWRlZmF1bHQsIG5vbi1jb3B5IGNvbnN0cnVjdG9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRlc3QgY3VzdG9tIGNhbGVuZGFyIGhhbmRsaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tQ2FsZW5kYXIKKyAgICAgICAgZXh0ZW5kcyBHcmVnb3JpYW5DYWxlbmRhciB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9wb20ueG1sIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWQwZDMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3BvbS54bWwKQEAgLTAsMCArMSwxNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtbGliPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+T3BlbkpQQSBVdGlsaXRpZXM8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPk9wZW5KUEEgVXRpbGl0aWVzPC9kZXNjcmlwdGlvbj4KKyAgICA8dXJsPmh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9wcm9qZWN0cy9vcGVuanBhPC91cmw+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5qYXZhMTQtdmFsaWRhdGU8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+PHByb3BlcnR5PjxuYW1lPmphdmExNC5qYXI8L25hbWU+PC9wcm9wZXJ0eT48L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxib290Y2xhc3NwYXRoPiR7amF2YTE0Lmphcn08L2Jvb3RjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmpha2FydGEtcmVnZXhwPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjIuMTM8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5hbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjYuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNvdXJjZWZvcmdlLnNlcnA8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xMS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNDwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIGdldCB0aGUgc3ZuIHJldmlzaW9uIG51bWJlciBhbmQgc2V0IGl0IGluIHRoZQorICAgICAgICAgICAgICAgIHN1YnZlcnNpb24ucmV2aXNpb24gc2V0dGluZyAtIGRpc2FibGVkIGZvciBub3cKKyAgICAgICAgICAgICAgICBzaW5jZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gYnVpbGQgZnJvbSBzb3VyY2VzCisgICAgICAgICAgICAgICAgemlwICh3aGVuIHRoZXJlIGlzIG5vIC5zdm4vIG1ldGFkYXRhKQorICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGUgc3VuL21pc2MvUGVyZi5jbGFzcyBmaWxlLCB3aGljaCBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgdGhlcmUgYXMgYSBjb21waWxhdGlvbiBzdHViCisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRlbGV0ZSBzdW4ubWlzYy5QZXJmPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLWNsYXNzZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L3N1bi8iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNldCBzdWJ2ZXJzaW9uIHJldmlzaW9uPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRtcGRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2phdmEuaW8udG1wZGlyfS9vcGVuanBhbXZudG1wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im91dGRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIHR5cGU9ImRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRkaXIiIHZhbHVlPSIke3RtcGRpcn0iLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3ZudmVyc2lvbi5leGVjdXRhYmxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9InN2bnZlcnNpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWMgb3V0cHV0cHJvcGVydHk9InN1YnZlcnNpb24ucmV2aXNpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsb25lcnJvcj0iZmFsc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsaWZleGVjdXRpb25mYWlscz0iZmFsc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlPSIke3N2bnZlcnNpb24uZXhlY3V0YWJsZX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItYyAke2Jhc2VkaXJ9Ly4uIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN1YnZlcnNpb24ucmV2aXNpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0idW5rbm93biIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5SZXZpc2lvbjogJHtzdWJ2ZXJzaW9uLnJldmlzaW9ufTwvZWNobz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke291dGRpcn0vTUVUQS1JTkYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gZmlsZT0iJHtvdXRkaXJ9L01FVEEtSU5GL29yZy5hcGFjaGUub3BlbmpwYS5yZXZpc2lvbi5wcm9wZXJ0aWVzIj5yZXZpc2lvbi5udW1iZXI9JHtzdWJ2ZXJzaW9uLnJldmlzaW9ufTwvZWNobz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dG1wZGlyfSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvYW50L0Fic3RyYWN0VGFzay5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvYW50L0Fic3RyYWN0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTNkZjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9hbnQvQWJzdHJhY3RUYXNrLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIEFudCB0YXNrcyBhbGwgaGF2ZSBhIG5lc3RlZCA8Y29kZT4mbHQ7Y29uZmlnJnJ0OzwvY29kZT4gdGFnLCB3aGljaCB1c2VzCisgKiB0aGUgY29uZmlndXJhdGlvbiBhcyBhIGJlYW4tbGlrZSB0YXNrLiBFLmcuLCB5b3UgY2FuIGRvOgorICogCisgKiA8Y29kZT4gCisgKiAmbHQ7bXl0YXNrJnJ0OzxiciAvPgorICogJm5ic3A7Jm5ic3A7Jmx0O2NvbmZpZyBjb25uZWN0aW9uVXNlck5hbWU9ImZvbyIvJnJ0OzxiciAvPiAKKyAqICZsdDsvbXl0YXNrJnJ0OworICogPC9jb2RlPiAKKyAqCisgKiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3lzdGVtIHdpbGwgYmUgdXNlZCBpZiB0aGUKKyAqIDxjb2RlPiZsdDtjb25maWcmcnQ7PC9jb2RlPiBzdWJ0YXNrIGlzIGV4Y2x1ZGVkLgorICoKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFzayBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBYnN0cmFjdFRhc2suY2xhc3MpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIExpc3QgZmlsZVNldHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFsdE9uRXJyb3IgPSB0cnVlOworICAgIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aCA9IG51bGw7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlUGFyZW50ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNvbGF0ZSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wbCBfY29uZiA9IG51bGw7CisgICAgcHJpdmF0ZSBBbnRDbGFzc0xvYWRlciBfY2wgPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgd2Ugd2FudCB0aGUgdGFzayB0byBpZ25vcmUgYWxsIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYWx0T25FcnJvcihib29sZWFuIGhhbHRPbkVycm9yKSB7CisgICAgICAgIHRoaXMuaGFsdE9uRXJyb3IgPSBoYWx0T25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHdlIHdhbnQgdGhlIENsYXNzTG9hZGVyIHRvIGJlIGlzb2xhdGVkIGZyb20KKyAgICAgKiBhbGwgb3RoZXIgQ2xhc3NMb2FkZXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXNvbGF0ZShib29sZWFuIGlzb2xhdGUpIHsKKyAgICAgICAgdGhpcy5pc29sYXRlID0gaXNvbGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gZGVsZWdhdGUgdG8gdGhlIHBhcmVudCBDbGFzc0xvYWRlcgorICAgICAqIGZvciByZXNvbHZlaW5nIGNsYXNzZXMuIFRoaXMgbWF5ICJ0YWludCIgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VQYXJlbnRDbGFzc2xvYWRlcihib29sZWFuIHVzZVBhcmVudCkgeworICAgICAgICB0aGlzLnVzZVBhcmVudCA9IHVzZVBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFzayBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGlmIChfY29uZiA9PSBudWxsKQorICAgICAgICAgICAgX2NvbmYgPSBuZXdDb25maWd1cmF0aW9uKCk7CisgICAgICAgIHJldHVybiBfY29uZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZQorICAgICAqIHByb2R1Y3QgaW4gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb25maWd1cmF0aW9uSW1wbCBuZXdDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSB0YXNrIGFjdGlvbiBvbiB0aGUgZ2l2ZW4gZmlsZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZXhlY3V0ZU9uKFN0cmluZ1tdIGZpbGVzKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzc2xvYWRlciB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICBpZiAoX2NsICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2NsOworCisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkKKyAgICAgICAgICAgIF9jbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihwcm9qZWN0LCBjbGFzc3BhdGgsIHVzZVBhcmVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9jbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihwcm9qZWN0LmdldENvcmVMb2FkZXIoKSwgcHJvamVjdCwKKyAgICAgICAgICAgICAgICBuZXcgUGF0aChwcm9qZWN0KSwgdXNlUGFyZW50KTsKKyAgICAgICAgX2NsLnNldElzb2xhdGVkKGlzb2xhdGUpOworCisgICAgICAgIHJldHVybiBfY2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byB0aHJvdyBhIHN0YW5kYXJkIGV4Y2VwdGlvbiBpZiB0aGUgdGFzayBpcyBub3QgZ2l2ZW4KKyAgICAgKiBhbnkgZmlsZXMgdG8gZXhlY3V0ZSBvbi4gSW1wbGVtZW50YXRpb25zIG1pZ2h0IGNhbGwgdGhpcyBtZXRob2QgYXMKKyAgICAgKiB0aGUgZmlyc3Qgc3RlcCBpbiB7QGxpbmsgI2V4ZWN1dGVPbn0gdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBnaXZlbgorICAgICAqIGZpbGVzIHRvIHdvcmsgb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RmlsZXMoU3RyaW5nW10gZmlsZXMpIHsKKyAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1maWxlc2V0cyIpLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NQYXRoKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLmFwcGVuZChjbGFzc1BhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKQorICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZVNldHMuYWRkKHNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIHRoZSB1c2VyIGRpZG4ndCBzdXBwbHkgYSBjb25mIGZpbGUsIGxvYWQgdGhlIGRlZmF1bHQKKyAgICAgICAgaWYgKF9jb25mID09IG51bGwpCisgICAgICAgICAgICBfY29uZiA9IG5ld0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKF9jb25mLmdldFByb3BlcnRpZXNSZXNvdXJjZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Qcm92aWRlciBjcCA9IFByb2R1Y3REZXJpdmF0aW9ucy5sb2FkRGVmYXVsdHMKKyAgICAgICAgICAgICAgICAoX2NvbmYuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIGlmIChjcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNwLnNldEludG8oX2NvbmYpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBnZXRGaWxlcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZU9uKGZpbGVzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBpZiAoaGFsdE9uRXJyb3IpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX2NvbmYuY2xvc2UoKTsKKyAgICAgICAgICAgIF9jb25mID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0RmlsZXMoKSB7CisgICAgICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZpbGVTZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBpLm5leHQoKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOworCisgICAgICAgICAgICBTdHJpbmdbXSBkc0ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkc0ZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZHNGaWxlc1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKCFmLmlzRmlsZSgpKQorICAgICAgICAgICAgICAgICAgICBmID0gbmV3IEZpbGUoZHMuZ2V0QmFzZWRpcigpLCBkc0ZpbGVzW2pdKTsKKyAgICAgICAgICAgICAgICBmaWxlcy5hZGQoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgZmlsZXMudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVzLnNpemUoKV0pOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvYW50L3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2FudC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYzAwMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2FudC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwzMCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzwhLS0KKworLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5BbnQgSW50ZWdyYXRpb248L3N0cm9uZz48L3A+CisKKzxwPgorICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyBhIGZvdW5kYXRpb24gZm9yIGJhc2ljIEFudCBzdXBwb3J0LgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9BYnN0cmFjdFByb2R1Y3REZXJpdmF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0Fic3RyYWN0UHJvZHVjdERlcml2YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTA5MDBmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9BYnN0cmFjdFByb2R1Y3REZXJpdmF0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQWJzdHJhY3Qgbm8tb3AgcHJvZHVjdCBkZXJpdmF0aW9uIGZvciBlYXN5IGV4dGVuc2lvbi4KKyAqCisgKiBAYXV0aG9yIFBpbmFraSBQb2RkYXIKKyAqIEBzaW5jZSAwLjQuMQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9kdWN0RGVyaXZhdGlvbgorICAgIGltcGxlbWVudHMgUHJvZHVjdERlcml2YXRpb24geworCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uUHJlZml4KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWRHbG9iYWxzKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZERlZmF1bHRzKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZChTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBhbmNob3IsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWQoRmlsZSBmaWxlLCBTdHJpbmcgYW5jaG9yKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlQ29uZmlndXJhdGlvbkNvbnN0cnVjdChDb25maWd1cmF0aW9uUHJvdmlkZXIgY3ApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZUNvbmZpZ3VyYXRpb25Mb2FkKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJTcGVjaWZpY2F0aW9uU2V0KENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb25DbG9zZShDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0Jvb2xlYW5WYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Cb29sZWFuVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzJlNTQwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Cb29sZWFuVmFsdWUuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsKKworLyoqCisgKiBBIGJvb2xlYW4ge0BsaW5rIFZhbHVlfS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgQm9vbGVhblZhbHVlIGV4dGVuZHMgVmFsdWUgeworCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbHVlOworCisgICAgcHVibGljIEJvb2xlYW5WYWx1ZShTdHJpbmcgcHJvcCkgeworICAgICAgICBzdXBlcihwcm9wKTsKKyAgICAgICAgc2V0QWxpYXNMaXN0Q29tcHJlaGVuc2l2ZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgeworICAgICAgICByZXR1cm4gYm9vbGVhbi5jbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJuYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKQorICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJuYWxTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxTdHJpbmcoU3RyaW5nIHZhbCkgeworICAgICAgICBzZXQoQm9vbGVhbi52YWx1ZU9mKHZhbCkuYm9vbGVhblZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgc2V0KGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0KCgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Db25maWd1cmFibGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvQ29uZmlndXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0MWVjYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvQ29uZmlndXJhYmxlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIG5vdGlmeWluZyBpbnRlcmVzdGVkCisgKiBvYmplY3RzIHdoZW4gY29uZmlndXJhdGlvbiBldmVudHMgb2NjdXIuIEl0IHByb3ZpZGVzIGFuIG9iamVjdAorICogd2l0aCB0aGUgb3Bwb3J0dW5pdHkgdG8gc2V0IGl0c2VsZiB1cCBmb3IgY29uZmlndXJhdGlvbiBhbmQgdG8KKyAqIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBwb3N0LWNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGludGVyZmFjZSBDb25maWd1cmFibGUgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBwcmlvciB0byBzZXR0aW5nIGJlYW4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZik7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJlZm9yZSBiZWFuIHByb3BlcnR5IGNvbmZpZ3VyYXRpb24gaXMgYmVndW4gb24gdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHVwb24gY29tcGxldGlvbiBvZiBiZWFuIHByb3BlcnR5IGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZENvbmZpZ3VyYXRpb24oKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvQ29uZmlndXJhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Db25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3OTMxOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsKKworaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgZ2VuZXJpYyBjb25maWd1cmF0aW9uIG9iamVjdHMuIEluY2x1ZGVzIHRoZSBhYmlsaXR5CisgKiB0byB3cml0ZSBjb25maWd1cmF0aW9uIHRvIGFuZCBmcm9tIHtAbGluayBQcm9wZXJ0aWVzfSBpbnN0YW5jZXMuIEluc3RhbmNlcworICogYXJlIHRocmVhZHNhZmUgZm9yIHJlYWRzLCBidXQgbm90IGZvciB3cml0ZXMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJhdGlvbgorICAgIGV4dGVuZHMgQmVhbkluZm8sIFNlcmlhbGl6YWJsZSwgQ2xvc2VhYmxlLCBDbG9uZWFibGUgeworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIG9mIHJldHVybmVkIHtAbGluayBWYWx1ZX0gcHJvcGVydHkgZGVzY3JpcHRvcnMgbGlzdGluZworICAgICAqIHJlY29nbml6ZWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0FMTE9XRURfVkFMVUVTID0gImFsbG93ZWRWYWx1ZXMiOworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgVmFsdWV9IHByb3BlcnR5IGRlc2NyaXB0b3JzIG5hbWluZworICAgICAqIHRoZSBwcm9wZXJ0eSdzIHR5cGUgb3IgY2F0ZWdvcnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEUgPSAicHJvcGVydHlUeXBlIjsKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIFZhbHVlfSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBuYW1pbmcKKyAgICAgKiB0aGUgcHJvcGVydHknIGhpZXJhcmNoaWNhbCBjYXRlZ29yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ0FURUdPUlkgPSAicHJvcGVydHlDYXRlZ29yeSI7CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgb2YgdGhlIHJldHVybmVkIHtAbGluayBWYWx1ZX0gcHJvcGVydHkgZGVzY3JpcHRvcnMgbmFtaW5nCisgICAgICogdGhlIHByb3BlcnR5J3Mgb3JkZXJpbmcgaW4gaXRzIGNhdGVnb3J5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PUkRFUiA9ICJwcm9wZXJ0eUNhdGVnb3J5T3JkZXIiOworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgVmFsdWV9IHByb3BlcnR5IGRlc2NyaXB0b3JzIG5hbWluZworICAgICAqIHRoZSBpbnRlcmZhY2UgdGhhdCBwbHVnaW4gdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IG11c3QgaW1wbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTlRFUkZBQ0UgPSAicHJvcGVydHlJbnRlcmZhY2UiOworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgVmFsdWV9IHByb3BlcnR5IGRlc2NyaXB0b3JzIG5hbWluZworICAgICAqIHRoZSBwcm9wZXJ0eSdzIG5hbWUgaW4gWE1MIGZvcm1hdCAoaS5lLiB0d28td29yZHMgaW5zdGVhZCBvZiBUd29Xb3JkcykuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1hNTCA9ICJ4bWxOYW1lIjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvZHVjdCBuYW1lLiBEZWZhdWx0cyB0byA8Y29kZT5vcGVuanBhPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9kdWN0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdE5hbWUoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogVGhlIGxvZyBmYWN0b3J5LiBJZiBubyBsb2cgZmFjdG9yeSBoYXMgYmVlbiBzZXQgZXhwbGljaXRseSwKKyAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBvbmUuCisgICAgICovCisgICAgcHVibGljIExvZ0ZhY3RvcnkgZ2V0TG9nRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogVGhlIGxvZyBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvZ0ZhY3RvcnkoTG9nRmFjdG9yeSBmYWN0b3J5KTsKKworICAgIC8qKgorICAgICAqIExvZyBwbHVnaW4gc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvZygpOworCisgICAgLyoqCisgICAgICogTG9nIHBsdWdpbiBzZXR0aW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvZyhTdHJpbmcgbG9nKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRMb2dGYWN0b3J5CisgICAgICovCisgICAgcHVibGljIExvZyBnZXRMb2coU3RyaW5nIGNhdGVnb3J5KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIHRvIHVzZSBmb3IgY29uZmlndXJhdGlvbiBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nIGdldENvbmZpZ3VyYXRpb25Mb2coKTsKKworICAgIAorICAgIC8qKgorICAgICAqIEFuIGVudmlyb25tZW50LXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4gVGhpcyAKKyAgICAgKiBtaWdodCBjb3JyZXNwb25kIHRvIGEgSlBBIHBlcnNpc3RlbmNlLXVuaXQgbmFtZSwgb3IgdG8gc29tZSBvdGhlcgorICAgICAqIG1vcmUtdW5pcXVlIHZhbHVlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMC45LjcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7CisKKyAgICAvKioKKyAgICAgKiBBbiBlbnZpcm9ubWVudC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uIFRoaXMgCisgICAgICogbWlnaHQgY29ycmVzcG9uZCB0byBhIEpQQSBwZXJzaXN0ZW5jZS11bml0IG5hbWUsIG9yIHRvIHNvbWUgb3RoZXIKKyAgICAgKiBtb3JlLXVuaXF1ZSB2YWx1ZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCisgICAgICogCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFZhbHVlfSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFZhbHVlIGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhbGwge0BsaW5rIFZhbHVlfXMuCisgICAgICovCisgICAgcHVibGljIFZhbHVlW10gZ2V0VmFsdWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiBUaGlzCisgICAgICogbWV0aG9kIHJlcGxhY2VzIGFueSBleGlzdGluZyB2YWx1ZSB1bmRlciB0aGUgc2FtZSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWUgYWRkVmFsdWUoVmFsdWUgdmFsKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdmFsdWUgZnJvbSB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVWYWx1ZShWYWx1ZSB2YWwpOworCisgICAgLyoqCisgICAgICogQSBwcm9wZXJ0aWVzIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgQ29uZmlndXJhdGlvbi4KKyAgICAgKiBOb3RlIHRoYXQgY2hhbmdlcyBtYWRlIHRvIHRoaXMgcHJvcGVydGllcyBvYmplY3Qgd2lsbAorICAgICAqIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiB0aGlzIENvbmZpZ3VyYXRpb24gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0b3JlRGVmYXVsdHMgaWYgdHJ1ZSwgdGhlbiBwcm9wZXJ0aWVzIHdpbGwgYmUgd3JpdHRlbgorICAgICAqIG91dCBldmVuIGlmIHRoZXkgbWF0Y2ggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIHRvUHJvcGVydGllcyhib29sZWFuIHN0b3JlRGVmYXVsdHMpOworCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgQ29uZmlndXJhdGlvbiB2aWEgdGhlIGdpdmVuIG1hcC4gQW55IGtleXMgbWlzc2luZyBmcm9tCisgICAgICogdGhlIGdpdmVuIG1hcCB3aWxsIG5vdCBiZSBzZXQuIE5vdGUgdGhhdCBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBtYXAKKyAgICAgKiB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiB0aGlzIENvbmZpZ3VyYXRpb24gb2JqZWN0LgorICAgICAqIElNUE9SVEFOVDogSWYgdGhlIG1hcCBjb250YWlucyBpbnN0YW50aWF0ZWQgb2JqZWN0cyhyYXRoZXIgdGhhbgorICAgICAqIHN0cmluZyB2YWx1ZXMpLCBvbmx5IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhvc2Ugb2JqZWN0cworICAgICAqIGFyZSBjb25zaWRlcmVkIGluIHRoaXMgY29uZmlndXJhdGlvbidzIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kCisgICAgICogPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZHMuIElmIHRoZSBvYmplY3QncyBwcm9wZXJ0eSBoYXMgbm8KKyAgICAgKiBzdHJpbmcgZm9ybShzdWNoIGFzIGFuIHtAbGluayBPYmplY3RWYWx1ZX0pLCB0aGUgb2JqZWN0IGlzIG5vdAorICAgICAqIHBhcnQgb2YgdGhlIGVxdWFsaXR5IGFuZCBoYXNoaW5nIGNhbGN1bGF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmcm9tUHJvcGVydGllcyhNYXAgbWFwKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgYW55IHByb3BlcnR5IGNoYW5nZXMuIFRoZSBwcm9wZXJ0eSBldmVudHMgZmlyZWQKKyAgICAgKiB3aWxsIDxiPm5vdDwvYj4gaW5jbHVkZSB0aGUgb2xkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBwcm9wZXJ0eSBjaGFuZ2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmb3IgYW55IHByb3BlcnR5IGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBMb2NrIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24ncyBzdGF0ZS4gQXR0ZW1wdGluZyB0byBzZXQgc3RhdGUgb24gYQorICAgICAqIHJlYWQtb25seSBjb25maWd1cmF0aW9uIHJlc3VsdHMgaW4gYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBjb25maWd1cmF0aW9uIGlzIGltbXV0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBpbnN0YW50aWF0aW5nIGdldCBtZXRob2RzIGZvciBhbGwgdmFsdWVzLiBVcC1mcm9udAorICAgICAqIGluc3RhbnRpYXRpb24gYWxsb3dzIG9uZSB0byBhdm9pZCB0aGUgc3luY2hyb25pemF0aW9uIG5lY2Vzc2FyeSB3aXRoCisgICAgICogbGF6eSBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbnRpYXRlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Db25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Db25maWd1cmF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjk0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0NvbmZpZ3VyYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSw5ODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mOworCitpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CitpbXBvcnQgamF2YS5iZWFucy5CZWFuRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOworaW1wb3J0IGphdmEuYmVhbnMuRXZlbnRTZXREZXNjcmlwdG9yOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLk1ldGhvZERlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZ0ZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLk5vbmVMb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTXVsdGlDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlNlcnZpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5TdHJpbmdEaXN0YW5jZTsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQ29uZmlndXJhdGlvbn0gaW50ZXJmYWNlLgorICogU3ViY2xhc3NlcyBjYW4gY2hvb3NlIHRvIG9idGFpbiBjb25maWd1cmF0aW9uCisgKiBpbmZvcm1hdGlvbiBmcm9tIEpOREksIFByb3BlcnRpZXMsIGEgQmVhbi1idWlsZGVyLCBldGMuIFRoaXMgY2xhc3MKKyAqIHByb3ZpZGVzIGJhc2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbmFsaXR5LCBpbmNsdWRpbmcgc2VyaWFsaXphdGlvbiwKKyAqIHRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoQ29kZTwvY29kZT4gY29udHJhY3RzLCBhbmQgZGVmYXVsdAorICogcHJvcGVydHkgbG9hZGluZy4KKyAqIFByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB7QGxpbmsgVmFsdWV9IGluc3RhbmNlcyBhcmUgY29uc3RydWN0ZWQgZnJvbQorICogdGhlIHtAbGluayBMb2NhbGl6ZXJ9IGZvciB0aGUgcGFja2FnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBjbGFzcy4gVGhlCisgKiBmb2xsb3dpbmcgbG9jYWxpemVkIHN0cmluZ3Mgd2lsbCBiZSB1c2VkIGZvciBkZXNjcmliaW5nIGEgdmFsdWUsIHdoZXJlCisgKiA8ZW0+bmFtZTwvZW0+IGlzIHRoZSBsYXN0IHRva2VuIG9mIHRoZSB2YWx1ZSdzIHByb3BlcnR5IHN0cmluZzoKKyAqIDx1bD4KKyAqIDxsaT48ZW0+bmFtZTwvZW0+LW5hbWU6IFRoZSBuYW1lIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yIHRoZQorICogb3B0aW9uIGluIGEgdXNlciBpbnRlcmZhY2U7IHJlcXVpcmVkLjwvbGk+CisgKiA8bGk+PGVtPm5hbWU8L2VtPi1kZXNjOiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBvcHRpb247IHJlcXVpcmVkLjwvbGk+CisgKiA8bGk+PGVtPm5hbWU8L2VtPi10eXBlOiBUaGUgdHlwZSBvciBjYXRlZ29yeSBuYW1lIGZvciB0aGlzIG9wdGlvbjsKKyAqIHJlcXVpcmVkLjwvbGk+CisgKiA8bGk+PGVtPm5hbWU8L2VtPi1leHBlcnQ6IFRydWUgaWYgdGhpcyBpcyBhbiBleHBlcnQgb3B0aW9uLCBmYWxzZQorICogb3RoZXJ3aXNlOyBkZWZhdWx0cyB0byBmYWxzZS48L2xpPgorICogPGxpPjxlbT5uYW1lPC9lbT4tdmFsdWVzOiBTZXQgb2YgZXhwZWN0ZWQgb3IgY29tbW9uIHZhbHVlcywgZXhjbHVkaW5nCisgKiBhbGlhcyBrZXlzOyBvcHRpb25hbC48L2xpPgorICogPGxpPjxlbT5uYW1lPC9lbT4taW50ZXJmYWNlOiBUaGUgY2xhc3MgbmFtZSBvZiBhbiBpbnRlcmZhY2Ugd2hvc2UKKyAqIGRpc2NvdmVyYWJsZSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzZXQgb2YgZXhwZWN0ZWQKKyAqIG9yIGNvbW1vbiB2YWx1ZXM7IG9wdGlvbmFsLjwvbGk+CisgKiA8bGk+PGVtPm5hbWU8L2VtPi1jYXQ6IFRoZSBoaWVyYXJjaGljYWwgY2F0ZWdvcnkgZm9yIHRoZSBwcm9wZXJ0eQorICogbmFtZSwgc2VwYXJhdGVkIGJ5ICIuIi4KKyAqIDxsaT48ZW0+bmFtZTwvZW0+LWRpc3BsYXlvcmRlcjogVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBwcm9wZXJ0eSBzaG91bGQKKyAqIGJlIGRpc3BsYXllci48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkltcGwKKyAgICBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb24sIEV4dGVybmFsaXphYmxlLCBWYWx1ZUxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChDb25maWd1cmF0aW9uSW1wbC5jbGFzcyk7CisKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUgbG9nRmFjdG9yeVBsdWdpbjsKKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBfcHJvZHVjdCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9yZWFkT25seSA9IGZhbHNlOworICAgIHByaXZhdGUgTWFwIF9wcm9wcyA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9nbG9iYWxzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2F1dG8gPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgTGlzdCBfdmFscyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8vIHByb3BlcnR5IGxpc3RlbmVyIGhlbHBlcgorICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IF9jaGFuZ2VTdXBwb3J0ID0gbnVsbDsKKworICAgIC8vIGNhY2hlIGRlc2NyaXB0b3JzCisgICAgcHJpdmF0ZSBQcm9wZXJ0eURlc2NyaXB0b3JbXSBfcGRzID0gbnVsbDsKKyAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3JbXSBfbWRzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEF0dGVtcHRzIHRvIGxvYWQgZGVmYXVsdCBwcm9wZXJ0aWVzIHRocm91Z2gKKyAgICAgKiBzeXN0ZW0ncyBjb25maWd1cmVkIHtAbGluayBQcm9kdWN0RGVyaXZhdGlvbn1zLgorICAgICAqLworICAgIHB1YmxpYyBDb25maWd1cmF0aW9uSW1wbCgpIHsKKyAgICAgICAgdGhpcyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkR2xvYmFscyB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gbG9hZCB0aGUgZ2xvYmFsIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkltcGwoYm9vbGVhbiBsb2FkR2xvYmFscykgeworICAgICAgICBzZXRQcm9kdWN0TmFtZSgib3BlbmpwYSIpOworCisgICAgICAgIGxvZ0ZhY3RvcnlQbHVnaW4gPSBhZGRQbHVnaW4oIkxvZyIsIHRydWUpOworICAgICAgICBTdHJpbmdbXSBhbGlhc2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgInRydWUiLCBMb2dGYWN0b3J5SW1wbC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAib3BlbmpwYSIsIExvZ0ZhY3RvcnlJbXBsLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICJjb21tb25zIiwgIm9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkNvbW1vbnNMb2dGYWN0b3J5IiwKKyAgICAgICAgICAgICJsb2c0aiIsICJvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c0SkxvZ0ZhY3RvcnkiLAorICAgICAgICAgICAgIm5vbmUiLCBOb25lTG9nRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAiZmFsc2UiLCBOb25lTG9nRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIH07CisgICAgICAgIGxvZ0ZhY3RvcnlQbHVnaW4uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgbG9nRmFjdG9yeVBsdWdpbi5zZXREZWZhdWx0KGFsaWFzZXNbMF0pOworICAgICAgICBsb2dGYWN0b3J5UGx1Z2luLnNldFN0cmluZyhhbGlhc2VzWzBdKTsKKyAgICAgICAgbG9nRmFjdG9yeVBsdWdpbi5zZXRJbnN0YW50aWF0aW5nR2V0dGVyKCJnZXRMb2dGYWN0b3J5Iik7CisKKyAgICAgICAgaWQgPSBhZGRTdHJpbmcoIklkIik7CisgICAgICAgIAorICAgICAgICBpZiAobG9hZEdsb2JhbHMpCisgICAgICAgICAgICBsb2FkR2xvYmFscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG9tYXRpY2FsbHkgbG9hZCBnbG9iYWwgdmFsdWVzIGZyb20gdGhlIHN5c3RlbSdzCisgICAgICoge0BsaW5rIFByb2R1Y3REZXJpdmF0aW9ufXMsIGFuZCBmcm9tIFN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGxvYWRHbG9iYWxzKCkgeworICAgICAgICBNdWx0aUNsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBNdWx0aUNsYXNzTG9hZGVyKCk7CisgICAgICAgIGxvYWRlci5hZGRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgbG9hZGVyLmFkZENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIENvbmZpZ3VyYXRpb25Qcm92aWRlciBwcm92aWRlciA9IFByb2R1Y3REZXJpdmF0aW9ucy5sb2FkR2xvYmFscyhsb2FkZXIpOworICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHByb3ZpZGVyLnNldEludG8odGhpcyk7CisKKyAgICAgICAgLy8gbGV0IHN5c3RlbSBwcm9wZXJ0aWVzIG92ZXJyaWRlIG90aGVyIGdsb2JhbHMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZyb21Qcm9wZXJ0aWVzKG5ldyBIYXNoTWFwKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIC8vIHNlY3VyaXR5IG1hbmFnZXIgbWlnaHQgZGlzYWxsb3cKKyAgICAgICAgfQorCisgICAgICAgIF9nbG9iYWxzID0gdHJ1ZTsKKyAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZyBsb2cgPSBnZXRDb25maWd1cmF0aW9uTG9nKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJuby1kZWZhdWx0LXByb3ZpZGVycyIpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCkgeworICAgICAgICByZXR1cm4gX3Byb2R1Y3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX3Byb2R1Y3QgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBMb2dGYWN0b3J5IGdldExvZ0ZhY3RvcnkoKSB7CisgICAgICAgIGlmIChsb2dGYWN0b3J5UGx1Z2luLmdldCgpID09IG51bGwpCisgICAgICAgICAgICBsb2dGYWN0b3J5UGx1Z2luLmluc3RhbnRpYXRlKExvZ0ZhY3RvcnkuY2xhc3MsIHRoaXMpOworICAgICAgICByZXR1cm4gKExvZ0ZhY3RvcnkpIGxvZ0ZhY3RvcnlQbHVnaW4uZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9nRmFjdG9yeShMb2dGYWN0b3J5IGxvZ0ZhY3RvcnkpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgbG9nRmFjdG9yeVBsdWdpbi5zZXQobG9nRmFjdG9yeSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2coKSB7CisgICAgICAgIHJldHVybiBsb2dGYWN0b3J5UGx1Z2luLmdldFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZyhTdHJpbmcgbG9nKSB7CisgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgIGxvZ0ZhY3RvcnlQbHVnaW4uc2V0U3RyaW5nKGxvZyk7CisgICAgfQorCisgICAgcHVibGljIExvZyBnZXRMb2coU3RyaW5nIGNhdGVnb3J5KSB7CisgICAgICAgIHJldHVybiBnZXRMb2dGYWN0b3J5KCkuZ2V0TG9nKGNhdGVnb3J5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQuZ2V0KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICB0aGlzLmlkLnNldChpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9nZ2luZyBjaGFubmVsIDxjb2RlPm9wZW5qcGEuUnVudGltZTwvY29kZT4gYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nIGdldENvbmZpZ3VyYXRpb25Mb2coKSB7CisgICAgICAgIHJldHVybiBnZXRMb2coIm9wZW5qcGEuUnVudGltZSIpOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZVtdIGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIChWYWx1ZVtdKSBfdmFscy50b0FycmF5KG5ldyBWYWx1ZVtfdmFscy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gc2VhcmNoIGJhY2t3YXJkcyBzbyB0aGF0IGN1c3RvbSB2YWx1ZXMgYWRkZWQgYWZ0ZXIgY29uc3RydWN0aW9uCisgICAgICAgIC8vIGFyZSBmb3VuZCBxdWlja2x5LCBzaW5jZSB0aGlzIHdpbGwgYmUgdGhlIHN0ZCB3YXkgb2YgYWNjZXNzaW5nIHRoZW0KKyAgICAgICAgVmFsdWUgdmFsOworICAgICAgICBmb3IgKGludCBpID0gX3ZhbHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIHZhbCA9IChWYWx1ZSkgX3ZhbHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHZhbC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhwcm9wZXJ0eSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7CisgICAgICAgIF9yZWFkT25seSA9IHJlYWRPbmx5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc3RhbnRpYXRlQWxsKCkgeworICAgICAgICBTdHJpbmdXcml0ZXIgZXJycyA9IG51bGw7CisgICAgICAgIFByaW50V3JpdGVyIHN0YWNrID0gbnVsbDsKKyAgICAgICAgVmFsdWUgdmFsOworICAgICAgICBTdHJpbmcgZ2V0dGVyTmFtZTsKKyAgICAgICAgTWV0aG9kIGdldHRlcjsKKyAgICAgICAgT2JqZWN0IGdldHRlclRhcmdldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdmFscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgdmFsID0gKFZhbHVlKSBfdmFscy5nZXQoaSk7CisgICAgICAgICAgICBnZXR0ZXJOYW1lID0gdmFsLmdldEluc3RhbnRpYXRpbmdHZXR0ZXIoKTsKKyAgICAgICAgICAgIGlmIChnZXR0ZXJOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGdldHRlclRhcmdldCA9IHRoaXM7CisgICAgICAgICAgICBpZiAoZ2V0dGVyTmFtZS5zdGFydHNXaXRoKCJ0aGlzLiIpKSB7CisgICAgICAgICAgICAgICAgZ2V0dGVyTmFtZSA9IGdldHRlck5hbWUuc3Vic3RyaW5nKCJ0aGlzLiIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGdldHRlclRhcmdldCA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBnZXR0ZXIgPSBnZXR0ZXJUYXJnZXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoZ2V0dGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgICAgIGdldHRlci5pbnZva2UoZ2V0dGVyVGFyZ2V0LCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHQgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHQpLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChlcnJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJycyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sgPSBuZXcgUHJpbnRXcml0ZXIoZXJycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVycnMud3JpdGUoU0VQKTsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShzdGFjayk7CisgICAgICAgICAgICAgICAgc3RhY2suZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJycyAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oX2xvYy5nZXQoImdldC1wcm9wLWVycnMiLAorICAgICAgICAgICAgICAgIGVycnMudG9TdHJpbmcoKSkuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworICAgICAgICByZXR1cm4gX3JlYWRPbmx5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAoX2NoYW5nZVN1cHBvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIF9jaGFuZ2VTdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKyAgICAgICAgX2NoYW5nZVN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChfY2hhbmdlU3VwcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgX2NoYW5nZVN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFZhbHVlIHZhbCkgeworICAgICAgICBpZiAoX2NoYW5nZVN1cHBvcnQgPT0gbnVsbCAmJiBfcHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmcgbmV3U3RyaW5nID0gdmFsLmdldFN0cmluZygpOworICAgICAgICBpZiAoX2NoYW5nZVN1cHBvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIF9jaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSh2YWwuZ2V0UHJvcGVydHkoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXdTdHJpbmcpOworCisgICAgICAgIC8vIGtlZXAgY2FjaGVkIHByb3BzIHVwIHRvIGRhdGUKKyAgICAgICAgaWYgKF9wcm9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobmV3U3RyaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMucmVtb3ZlUHJvcGVydHkodmFsLmdldFByb3BlcnR5KCksIF9wcm9wcyk7CisgICAgICAgICAgICBlbHNlIGlmIChDb25maWd1cmF0aW9ucy5jb250YWluc1Byb3BlcnR5KHZhbC5nZXRQcm9wZXJ0eSgpLCBfcHJvcHMpCisgICAgICAgICAgICAgICAgfHwgdmFsLmdldERlZmF1bHQoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgIXZhbC5nZXREZWZhdWx0KCkuZXF1YWxzKG5ld1N0cmluZykpCisgICAgICAgICAgICAgICAgcHV0KF9wcm9wcywgdmFsLCBuZXdTdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIGFsbCBjbG9zZWFibGUgdmFsdWVzIGFuZCBwbHVnaW5zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlKCkgeworICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMuYmVmb3JlQ2xvc2UodGhpcyk7CisgICAgICAgIAorICAgICAgICBwcmVDbG9zZSgpOworICAgICAgICAKKyAgICAgICAgT2JqZWN0VmFsdWUgdmFsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF92YWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX3ZhbHMuZ2V0KGkpIGluc3RhbmNlb2YgQ2xvc2VhYmxlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgKChDbG9zZWFibGUpIF92YWxzLmdldChpKSkuY2xvc2UoKTsgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30gCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghKF92YWxzLmdldChpKSBpbnN0YW5jZW9mIE9iamVjdFZhbHVlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgdmFsID0gKE9iamVjdFZhbHVlKSBfdmFscy5nZXQoaSk7CisgICAgICAgICAgICBpZiAodmFsLmdldCgpIGluc3RhbmNlb2YgQ2xvc2VhYmxlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChDbG9zZWFibGUpIHZhbC5nZXQoKSkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IGZpbmFsIG1ldGhvZCB7QGxpbmsgI2Nsb3NlfSBhZnRlciBpbnZva2luZyB0aGUgCisgICAgICoge0BsaW5rIFByb2R1Y3REZXJpdmF0aW9uI2JlZm9yZUNvbmZpZ3VyYXRpb25DbG9zZX0gY2FsbGJhY2tzCisgICAgICogYnV0IGJlZm9yZSBwZXJmb3JtaW5nIGludGVybmFsIGNsb3NlIG9wZXJhdGlvbnMuCisgICAgICogCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlQ2xvc2UoKSB7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQmVhbkluZm8gaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCZWFuSW5mb1swXTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0QmVhbkRlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgQmVhbkRlc2NyaXB0b3IoZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWZhdWx0RXZlbnRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIEV2ZW50U2V0RGVzY3JpcHRvcltdIGdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSB7CisgICAgICAgIHJldHVybiBuZXcgRXZlbnRTZXREZXNjcmlwdG9yWzBdOworICAgIH0KKworICAgIHB1YmxpYyBJbWFnZSBnZXRJY29uKGludCBraW5kKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWV0aG9kRGVzY3JpcHRvcltdIGdldE1ldGhvZERlc2NyaXB0b3JzKCkgeworICAgICAgICBpZiAoX21kcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9tZHM7CisKKyAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICBMaXN0IGRlc2NzID0gbmV3IEFycmF5TGlzdCgpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE1ldGhvZCB3cml0ZSA9IHBkc1tpXS5nZXRXcml0ZU1ldGhvZCgpOworICAgICAgICAgICAgTWV0aG9kIHJlYWQgPSBwZHNbaV0uZ2V0UmVhZE1ldGhvZCgpOworICAgICAgICAgICAgaWYgKHJlYWQgIT0gbnVsbCAmJiB3cml0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzY3MuYWRkKG5ldyBNZXRob2REZXNjcmlwdG9yKHdyaXRlKSk7CisgICAgICAgICAgICAgICAgZGVzY3MuYWRkKG5ldyBNZXRob2REZXNjcmlwdG9yKHJlYWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfbWRzID0gKE1ldGhvZERlc2NyaXB0b3JbXSlkZXNjcy4KKyAgICAgICAgICAgIHRvQXJyYXkobmV3IE1ldGhvZERlc2NyaXB0b3JbZGVzY3Muc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBfbWRzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKKyAgICAgICAgaWYgKF9wZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfcGRzOworCisgICAgICAgIF9wZHMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yW192YWxzLnNpemUoKV07CisgICAgICAgIExpc3QgZmFpbHVyZXMgPSBudWxsOworICAgICAgICBWYWx1ZSB2YWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3ZhbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHZhbCA9IChWYWx1ZSkgX3ZhbHMuZ2V0KGkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfcGRzW2ldID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHZhbCk7CisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLmFkZCh2YWwuZ2V0UHJvcGVydHkoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLmFkZCh2YWwuZ2V0UHJvcGVydHkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhaWx1cmVzICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oX2xvYy5nZXQoImludmFsaWQtcHJvcGVydHktZGVzY3JpcHRvcnMiLAorICAgICAgICAgICAgICAgIGZhaWx1cmVzKSk7CisKKyAgICAgICAgcmV0dXJuIF9wZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihWYWx1ZSB2YWwpCisgICAgICAgIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHByb3AgPSB2YWwuZ2V0UHJvcGVydHkoKTsKKyAgICAgICAgcHJvcCA9IHByb3Auc3Vic3RyaW5nKHByb3AubGFzdEluZGV4T2YoJy4nKSArIDEpOworCisgICAgICAgIC8vIHNldCB1cCBwcm9wZXJ0eSBkZXNjcmlwdG9yCisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBkID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHByb3ApLCAKKyAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlbid0IGFueSBtZXRob2RzIGZvciB0aGlzIHZhbHVlKGkuZS4sIGlmIGl0J3MgYQorICAgICAgICAgICAgLy8gZHluYW1pY2FsbHktYWRkZWQgdmFsdWUpLCB0aGVuIGFuIEludHJvc3BlY3Rpb25FeGNlcHRpb24gd2lsbAorICAgICAgICAgICAgLy8gYmUgdGhyb3duLiBUcnkgdG8gY3JlYXRlIGEgUEQgd2l0aCBubyByZWFkIG9yIHdyaXRlIG1ldGhvZHMuCisgICAgICAgICAgICBwZCA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShwcm9wKSwKKyAgICAgICAgICAgICAgICAoTWV0aG9kKSBudWxsLCAoTWV0aG9kKSBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBwZC5zZXREaXNwbGF5TmFtZShmaW5kTG9jYWxpemVkKHByb3AgKyAiLW5hbWUiLCB0cnVlLCB2YWwuZ2V0U2NvcGUoKSkpOworICAgICAgICBwZC5zZXRTaG9ydERlc2NyaXB0aW9uKGZpbmRMb2NhbGl6ZWQocHJvcCArICItZGVzYyIsIHRydWUsCisgICAgICAgICAgICB2YWwuZ2V0U2NvcGUoKSkpOworICAgICAgICBwZC5zZXRFeHBlcnQoInRydWUiLmVxdWFscyhmaW5kTG9jYWxpemVkKHByb3AgKyAiLWV4cGVydCIsIGZhbHNlLAorICAgICAgICAgICAgdmFsLmdldFNjb3BlKCkpKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBkLnNldFJlYWRNZXRob2QoZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldCIKKyAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUocHJvcCksIChDbGFzc1tdKSBudWxsKSk7CisgICAgICAgICAgICBwZC5zZXRXcml0ZU1ldGhvZChnZXRDbGFzcygpLmdldE1ldGhvZCgic2V0IgorICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShwcm9wKSwgbmV3IENsYXNzW10KKyAgICAgICAgICAgICAgICB7IHBkLmdldFJlYWRNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkgfSkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gaWYgYW4gZXJyb3Igb2NjdXJzLCBpdCBtaWdodCBiZSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBhCisgICAgICAgICAgICAvLyBkeW5hbWljIHByb3BlcnR5LgorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBmaW5kTG9jYWxpemVkKHByb3AgKyAiLXR5cGUiLCB0cnVlLCB2YWwuZ2V0U2NvcGUoKSk7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICBwZC5zZXRWYWx1ZShBVFRSSUJVVEVfVFlQRSwgdHlwZSk7CisKKyAgICAgICAgU3RyaW5nIGNhdCA9IGZpbmRMb2NhbGl6ZWQocHJvcCArICItY2F0IiwgZmFsc2UsIHZhbC5nZXRTY29wZSgpKTsKKyAgICAgICAgaWYgKGNhdCAhPSBudWxsKQorICAgICAgICAgICAgcGQuc2V0VmFsdWUoQVRUUklCVVRFX0NBVEVHT1JZLCBjYXQpOworICAgICAgICAKKyAgICAgICAgcGQuc2V0VmFsdWUoQVRUUklCVVRFX1hNTCwgdG9YTUxOYW1lKHByb3ApKTsKKworICAgICAgICBTdHJpbmcgb3JkZXIgPSBmaW5kTG9jYWxpemVkKHByb3AgKyAiLWRpc3BsYXlvcmRlciIsIGZhbHNlLAorICAgICAgICAgICAgdmFsLmdldFNjb3BlKCkpOworICAgICAgICBpZiAob3JkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHBkLnNldFZhbHVlKEFUVFJJQlVURV9PUkRFUiwgb3JkZXIpOworCisgICAgICAgIC8vIGNvbGxlY3QgYWxsb3dlZCB2YWx1ZXMgZnJvbSBhbGlhcyBrZXlzLCBsaXN0ZWQgdmFsdWVzLCBhbmQKKyAgICAgICAgLy8gaW50ZXJmYWNlIGltcGxlbWVudG9ycworICAgICAgICBDb2xsZWN0aW9uIGFsbG93ZWQgPSBuZXcgVHJlZVNldCgpOworICAgICAgICBMaXN0IGFsaWFzZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICBpZiAodmFsLmdldEFsaWFzZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhbGlhc2VzID0gQXJyYXlzLmFzTGlzdCh2YWwuZ2V0QWxpYXNlcygpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlcy5zaXplKCk7IGkgKz0gMikKKyAgICAgICAgICAgICAgICBhbGxvd2VkLmFkZChhbGlhc2VzLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gdmFscyA9IFN0cmluZ3Muc3BsaXQoZmluZExvY2FsaXplZChwcm9wCisgICAgICAgICAgICArICItdmFsdWVzIiwgZmFsc2UsIHZhbC5nZXRTY29wZSgpKSwgIiwiLCAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKCFhbGlhc2VzLmNvbnRhaW5zKHZhbHNbaV0pKQorICAgICAgICAgICAgICAgIGFsbG93ZWQuYWRkKHZhbHNbaV0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgaW50ZiA9IENsYXNzLmZvck5hbWUoZmluZExvY2FsaXplZChwcm9wCisgICAgICAgICAgICAgICAgKyAiLWludGVyZmFjZSIsIHRydWUsIHZhbC5nZXRTY29wZSgpKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIHBkLnNldFZhbHVlKEFUVFJJQlVURV9JTlRFUkZBQ0UsIGludGYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGltcGxzID0gU2VydmljZXMuZ2V0SW1wbGVtZW50b3JzKGludGYpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoIWFsaWFzZXMuY29udGFpbnMoaW1wbHNbaV0pKQorICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLmFkZChpbXBsc1tpXSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGxvd2VkLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHBkLnNldFZhbHVlKEFUVFJJQlVURV9BTExPV0VEX1ZBTFVFUywgKFN0cmluZ1tdKSBhbGxvd2VkLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAobmV3IFN0cmluZ1thbGxvd2VkLnNpemUoKV0pKTsKKworICAgICAgICByZXR1cm4gcGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgZ2l2ZW4gbG9jYWxpemVkIHN0cmluZywgb3IgcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbmRMb2NhbGl6ZWQoU3RyaW5nIGtleSwgYm9vbGVhbiBmYXRhbCwgQ2xhc3Mgc2NvcGUpIHsKKyAgICAgICAgLy8gZmluZCB0aGUgbG9jYWxpemVyIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGlzIGtleQorICAgICAgICBMb2NhbGl6ZXIgbG9jID0gbnVsbDsKKworICAgICAgICAvLyBjaGVjayB0aGUgcGFja2FnZSB0aGF0IHRoZSB2YWx1ZSBjbGFpbXMgdG8gYmUgZGVmaW5lZCBpbiwgaWYKKyAgICAgICAgLy8gYXZhaWxhYmxlLCBiZWZvcmUgd2Ugc3RhcnQgZ3Vlc3NpbmcuCisgICAgICAgIGlmIChzY29wZSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZShzY29wZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2MuZ2V0RmF0YWwoa2V5KS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKENsYXNzIGNscyA9IGdldENsYXNzKCk7IGNscyAhPSBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpKSB7CisgICAgICAgICAgICBsb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZShjbHMpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jLmdldEZhdGFsKGtleSkuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1zZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhdGFsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihrZXksIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBrZXkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVG8vZnJvbSBtYXBzCisgICAgLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIE1hcCB0b1Byb3BlcnRpZXMoYm9vbGVhbiBzdG9yZURlZmF1bHRzKSB7CisgICAgICAgIC8vIGNsb25lIHByb3BlcnRpZXMgYmVmb3JlIG1ha2luZyBhbnkgbW9kaWZpY2F0aW9uczsgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRoZSBpbnRlcm5hbCBwcm9wZXJ0aWVzIGluc3RhbmNlIGNvbnNpc3RlbnQgdG8gbWFpbnRhaW4gZXF1YWxzIGFuZAorICAgICAgICAvLyBoYXNoY29kZSBjb250cmFjdHMKKyAgICAgICAgTWFwIGNsb25lOworICAgICAgICBpZiAoX3Byb3BzID09IG51bGwpCisgICAgICAgICAgICBjbG9uZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGVsc2UgaWYgKF9wcm9wcyBpbnN0YW5jZW9mIFByb3BlcnRpZXMpCisgICAgICAgICAgICBjbG9uZSA9IChNYXApICgoUHJvcGVydGllcykgX3Byb3BzKS5jbG9uZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbG9uZSA9IG5ldyBIYXNoTWFwKF9wcm9wcyk7CisKKyAgICAgICAgLy8gaWYgbm8gZXhpc3RpbmcgcHJvcGVydGllcyBvciB0aGUgcHJvcGVydGllcyBzaG91bGQgY29udGFpbiBlbnRyaWVzCisgICAgICAgIC8vIHdpdGggZGVmYXVsdCB2YWx1ZXMsIGFkZCB2YWx1ZXMgdG8gcHJvcGVydGllcworICAgICAgICBpZiAoX3Byb3BzID09IG51bGwgfHwgc3RvcmVEZWZhdWx0cykgeworICAgICAgICAgICAgVmFsdWUgdmFsOworICAgICAgICAgICAgU3RyaW5nIHN0cjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3ZhbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBrZXkgaW4gZXhpc3RpbmcgcHJvcGVydGllcywgd2UgYWxyZWFkeSBrbm93IHZhbHVlIGlzIHVwCisgICAgICAgICAgICAgICAgLy8gdG8gZGF0ZQorICAgICAgICAgICAgICAgIHZhbCA9IChWYWx1ZSkgX3ZhbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChfcHJvcHMgIT0gbnVsbCAmJiBDb25maWd1cmF0aW9ucy5jb250YWluc1Byb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICh2YWwuZ2V0UHJvcGVydHkoKSwgX3Byb3BzKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBzdHIgPSB2YWwuZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciAhPSBudWxsICYmIChzdG9yZURlZmF1bHRzCisgICAgICAgICAgICAgICAgICAgIHx8ICFzdHIuZXF1YWxzKHZhbC5nZXREZWZhdWx0KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgcHV0KGNsb25lLCB2YWwsIHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX3Byb3BzID09IG51bGwpCisgICAgICAgICAgICAgICAgX3Byb3BzID0gbmV3IEhhc2hNYXAoY2xvbmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmcm9tUHJvcGVydGllcyhNYXAgbWFwKSB7CisgICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fCBtYXAuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworCisgICAgICAgIC8vIGlmIHRoZSBvbmx5IHByZXZpb3VzIGNhbGwgd2FzIHRvIGxvYWQgZGVmYXVsdHMsIGZvcmdldCB0aGVtLgorICAgICAgICAvLyB0aGlzIHdheSB3ZSBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZm9ybWF0dGluZyBvZiB0aGUgdXNlcidzIHByb3BzCisgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIGRlZmF1bHRzLiAgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGNhY2hpbmcgb24KKyAgICAgICAgLy8gY29uZmlndXJhdGlvbiBvYmplY3RzCisgICAgICAgIGlmIChfZ2xvYmFscykgeworICAgICAgICAgICAgX3Byb3BzID0gbnVsbDsKKyAgICAgICAgICAgIF9nbG9iYWxzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBNYXAgcmVtYWluaW5nID0gbmV3IEhhc2hNYXAobWFwKTsKKyAgICAgICAgYm9vbGVhbiBzZXIgPSB0cnVlOworICAgICAgICBWYWx1ZSB2YWw7CisgICAgICAgIE9iamVjdCBvOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF92YWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICB2YWwgPSAoVmFsdWUpIF92YWxzLmdldChpKTsKKyAgICAgICAgICAgIG8gPSBnZXQobWFwLCB2YWwsIHRydWUpOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmVxdWFscygoU3RyaW5nKSBvLCB2YWwuZ2V0U3RyaW5nKCkpKQorICAgICAgICAgICAgICAgICAgICB2YWwuc2V0U3RyaW5nKChTdHJpbmcpIG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXIgJj0gbyBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZTsKKyAgICAgICAgICAgICAgICB2YWwuc2V0T2JqZWN0KG8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMucmVtb3ZlUHJvcGVydHkodmFsLmdldFByb3BlcnR5KCksIHJlbWFpbmluZyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGNvbnZlbnRpb24gaXMgdG8gcG9pbnQgcHJvZHVjdCBhdCBhIHJlc291cmNlIHdpdGggdGhlCisgICAgICAgIC8vIDxwcmVmaXg+LnByb3BlcnRpZXMgU3lzdGVtIHByb3BlcnR5OyByZW1vdmUgdGhhdCBwcm9wZXJ0eSBzbyB3ZQorICAgICAgICAvLyB3ZSBkb24ndCB3YXJuIGFib3V0IGl0CisgICAgICAgIENvbmZpZ3VyYXRpb25zLnJlbW92ZVByb3BlcnR5KCJwcm9wZXJ0aWVzIiwgcmVtYWluaW5nKTsKKyAgICAgICAgCisgICAgICAgIC8vIG5vdyB3YXJuIGlmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nIHByb3BlcnRpZXMgdGhhdCB0aGVyZQorICAgICAgICAvLyBpcyBhbiB1bmhhbmRsZWQgcHJvcAorICAgICAgICBNYXAuRW50cnkgZW50cnk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcmVtYWluaW5nLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdhcm5JbnZhbGlkUHJvcGVydHkoKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgc2VyICY9IGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTZXJpYWxpemFibGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjYWNoZSBwcm9wZXJ0aWVzCisgICAgICAgIGlmIChfcHJvcHMgPT0gbnVsbCAmJiBzZXIpCisgICAgICAgICAgICBfcHJvcHMgPSBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyA8Y29kZT5vPC9jb2RlPiB0byA8Y29kZT5tYXA8L2NvZGU+IHVuZGVyIGtleSBmb3IgPGNvZGU+dmFsPC9jb2RlPi4KKyAgICAgKiBVc2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIGFkZCB0aGUgdmFsdWUgZGlyZWN0bHkgYmVjYXVzZSAKKyAgICAgKiB0aGlzIHdpbGwgYWNjb3VudCBmb3IgdGhlIHByb3BlcnR5IHByZWZpeC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHV0KE1hcCBtYXAsIFZhbHVlIHZhbCwgT2JqZWN0IG8pIHsKKyAgICAgICAgT2JqZWN0IGtleSA9IHZhbC5nZXRMb2FkS2V5KCk7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgIGtleSA9ICJvcGVuanBhLiIgKyB2YWwuZ2V0UHJvcGVydHkoKTsKKyAgICAgICAgbWFwLnB1dChrZXksIG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2sgdXAgdGhlIGdpdmVuIHZhbHVlLCB0ZXN0aW5nIGFsbCBhdmFpbGFibGUgcHJlZml4ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0KE1hcCBtYXAsIFZhbHVlIHZhbCwgYm9vbGVhbiBzZXRMb2FkS2V5KSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBQcm9kdWN0RGVyaXZhdGlvbnMuZ2V0Q29uZmlndXJhdGlvbktleSgKKyAgICAgICAgICAgIHZhbC5nZXRQcm9wZXJ0eSgpLCBtYXApOworICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkgJiYgc2V0TG9hZEtleSkKKyAgICAgICAgICAgIHZhbC5zZXRMb2FkS2V5KGtleSk7CisgICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXNzdWUgYSB3YXJuaW5nIHRoYXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdhcm5JbnZhbGlkUHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7CisgICAgICAgIGlmICghaXNJbnZhbGlkUHJvcGVydHkocHJvcE5hbWUpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBMb2cgbG9nID0gZ2V0Q29uZmlndXJhdGlvbkxvZygpOworICAgICAgICBpZiAobG9nID09IG51bGwgfHwgIWxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgdGhlIGNsb3Nlc3Qgc3RyaW5nIHRvIHRoZSBpbnZhbGlkIHByb3BlcnR5CisgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUgYSBoaW50IGluIGNhc2Ugb2YgYSBtaXNzcGVsbGluZworICAgICAgICBTdHJpbmcgY2xvc2VzdCA9IFN0cmluZ0Rpc3RhbmNlLmdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlCisgICAgICAgICAgICAocHJvcE5hbWUsIG5ld1Byb3BlcnR5TGlzdCgpLCAxNSk7CisKKyAgICAgICAgaWYgKGNsb3Nlc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJpbnZhbGlkLXByb3BlcnR5IiwgcHJvcE5hbWUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImludmFsaWQtcHJvcGVydHktaGludCIsIHByb3BOYW1lLCBjbG9zZXN0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29tcHJlaGVuc2l2ZSBsaXN0IG9mIHJlY29nbml6ZWQgbWFwIGtleXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIG5ld1Byb3BlcnR5TGlzdCgpIHsKKyAgICAgICAgU3RyaW5nW10gcHJlZml4ZXMgPSBQcm9kdWN0RGVyaXZhdGlvbnMuZ2V0Q29uZmlndXJhdGlvblByZWZpeGVzKCk7CisgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoX3ZhbHMuc2l6ZSgpICogcHJlZml4ZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdmFscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcmVmaXhlcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICBsLmFkZChwcmVmaXhlc1tqXSArICIuIiArICgoVmFsdWUpIF92YWxzLmdldChpKSkuZ2V0UHJvcGVydHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBzaG91bGQgcmFpc2UgYSB3YXJuaW5nCisgICAgICogaWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIGtub3duIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnZhbGlkUHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7CisgICAgICAgIC8vIGhhbmRsZSB3YXJuaW5ncyBmb3Igb3BlbmpwYS5Tb21lU3RyaW5nLCBidXQgbm90IGZvcgorICAgICAgICAvLyBvcGVuanBhLnNvbWUuc3VicGFja2FnZS5Tb21lU3RyaW5nLCBzaW5jZSBpdCBtaWdodCBiZSB2YWxpZCBmb3Igc29tZQorICAgICAgICAvLyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuSlBBCisgICAgICAgIFN0cmluZ1tdIHByZWZpeGVzID0gUHJvZHVjdERlcml2YXRpb25zLmdldENvbmZpZ3VyYXRpb25QcmVmaXhlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocHJvcE5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWZpeGVzW2ldKQorICAgICAgICAgICAgICAgICYmIHByb3BOYW1lLmxlbmd0aCgpID4gcHJlZml4ZXNbaV0ubGVuZ3RoKCkgKyAxCisgICAgICAgICAgICAgICAgJiYgcHJvcE5hbWUuaW5kZXhPZignLicsIHByZWZpeGVzW2ldLmxlbmd0aCgpKSAKKyAgICAgICAgICAgICAgICA9PSBwcmVmaXhlc1tpXS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICYmIHByb3BOYW1lLmluZGV4T2YoJy4nLCBwcmVmaXhlc1tpXS5sZW5ndGgoKSArIDEpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQXV0by1jb25maWd1cmF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIG5hbWVkIHJlc291cmNlIGFzIGEgcHJvcGVydGllcyBmaWxlLiBJdCBpcworICAgICAqIHVzZWZ1bCBmb3IgYXV0by1jb25maWd1cmF0aW9uIHRvb2xzIHNvIHVzZXJzIGNhbiBzcGVjaWZ5IGEKKyAgICAgKiA8Y29kZT5wcm9wZXJ0aWVzPC9jb2RlPiB2YWx1ZSB3aXRoIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMubG9hZChyZXNvdXJjZU5hbWUsIG51bGwsIAorICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS5zZXRJbnRvKHRoaXMpOworICAgICAgICBfYXV0byA9IHJlc291cmNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBsb2FkcyB0aGUgbmFtZWQgZmlsZSBhcyBhIHByb3BlcnRpZXMgZmlsZS4gSXQgaXMKKyAgICAgKiB1c2VmdWwgZm9yIGF1dG8tY29uZmlndXJhdGlvbiB0b29scyBzbyB1c2VycyBjYW4gc3BlY2lmeSBhCisgICAgICogPGNvZGU+cHJvcGVydGllc0ZpbGU8L2NvZGU+IHZhbHVlIHdpdGggdGhlIG5hbWUgb2YgYSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXNGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvZHVjdERlcml2YXRpb25zLmxvYWQoZmlsZSwgbnVsbCwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS4KKyAgICAgICAgICAgIHNldEludG8odGhpcyk7CisgICAgICAgIF9hdXRvID0gZmlsZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdGhhdCB3YXMgc2V0IHZpYSBhdXRvLWNvbmZpZ3VyYXRpb24gbWV0aG9kcworICAgICAqIHtAbGluayAjc2V0UHJvcGVydGllc30gb3Ige0BsaW5rICNzZXRQcm9wZXJ0aWVzRmlsZX0sIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIF9hdXRvOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8KKyAgICAvLyBVdGlsaXRpZXMKKyAgICAvLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgcmVhZCBvbmx5IGFuZCBpZiBzbyB0aHJvd3MgYW4KKyAgICAgKiBleGNlcHRpb24sIG90aGVyd2lzZSByZXR1cm5zIHNpbGVudGx5LgorICAgICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgc2V0dGluZyBhbnkgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Tm90UmVhZE9ubHkoKSB7CisgICAgICAgIGlmIChpc1JlYWRPbmx5KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJyZWFkLW9ubHkiKS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGFuIGVxdWFsaXR5IGNoZWNrIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIHJldHVybmVkIGZyb20KKyAgICAgKiB7QGxpbmsgI3RvUHJvcGVydGllc30uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBjb21wYXJlIHByb3BlcnRpZXMKKyAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgY29uZiA9IChDb25maWd1cmF0aW9uSW1wbCkgb3RoZXI7CisgICAgICAgIE1hcCBwMSA9IChfcHJvcHMgPT0gbnVsbCkgPyB0b1Byb3BlcnRpZXMoZmFsc2UpIDogX3Byb3BzOworICAgICAgICBNYXAgcDIgPSAoY29uZi5fcHJvcHMgPT0gbnVsbCkgPyBjb25mLnRvUHJvcGVydGllcyhmYWxzZSkgOiBjb25mLl9wcm9wczsKKyAgICAgICAgcmV0dXJuIHAxLmVxdWFscyhwMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgaGFzaCBjb2RlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIHJldHVybmVkIGZyb20KKyAgICAgKiB7QGxpbmsgI3RvUHJvcGVydGllc30uCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKF9wcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9wcm9wcy5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gdG9Qcm9wZXJ0aWVzKGZhbHNlKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgPGNvZGU+cHJvcE5hbWU8L2NvZGU+IHRvIGEgbG93ZXJjYXNlLXdpdGgtaHlwaGVucy1zdHlsZSBzdHJpbmcuCisgICAgICogVGhpcyBhbGdvcml0aG0gaXMgb25seSBkZXNpZ25lZCBmb3IgbWl4ZXMgb2YgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgCisgICAgICogbGV0dGVycyBhbmQgbG9uZSBkaWdpdHMuIEEgbW9yZSBzb3BoaXN0aWNhdGVkIGNvbnZlcnNpb24gc2hvdWxkIHByb2JhYmx5IAorICAgICAqIGJlIGhhbmRsZWQgYnkgYSBwcm9wZXIgcGFyc2VyIGdlbmVyYXRvciBvciByZWd1bGFyIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvWE1MTmFtZShTdHJpbmcgcHJvcE5hbWUpIHsKKyAgICAgICAgaWYgKHByb3BOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgY2hhciBjOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BOYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGMgPSBwcm9wTmFtZS5jaGFyQXQoaSk7CisKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgc2VxdWVuY2VzIG9mIGFsbC1jYXBzIHRvIGRvd25jYXNlIHdpdGggZGFzaGVzIGFyb3VuZCAKKyAgICAgICAgICAgIC8vIHRoZW0uIHB1dCBhIHRyYWlsaW5nIGNhcCB0aGF0IGlzIGZvbGxvd2VkIGJ5IGRvd25jYXNlIGludG8gdGhlCisgICAgICAgICAgICAvLyBkb3duY2FzZSB3b3JkLgorICAgICAgICAgICAgaWYgKGkgIT0gMCAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYykgCisgICAgICAgICAgICAgICAgJiYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShwcm9wTmFtZS5jaGFyQXQoaS0xKSkKKyAgICAgICAgICAgICAgICB8fCAoaSA+IDEgJiYgaSA8IHByb3BOYW1lLmxlbmd0aCgpIC0gMQorICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wTmFtZS5jaGFyQXQoaS0xKSkgCisgICAgICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHByb3BOYW1lLmNoYXJBdChpKzEpKSkpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJy0nKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc3Vycm91bmQgc2VxdWVuY2VzIG9mIGRpZ2l0cyB3aXRoIGRhc2hlcy4KKyAgICAgICAgICAgIGlmIChpICE9IDAKKyAgICAgICAgICAgICAgICAmJiAoKCFDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHByb3BOYW1lCisgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoaSAtIDEpKSkgCisgICAgICAgICAgICAgICAgfHwgKENoYXJhY3Rlci5pc0xldHRlcihjKSAmJiAhQ2hhcmFjdGVyLmlzTGV0dGVyKHByb3BOYW1lCisgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoaSAtIDEpKSkpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJy0nKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnVmLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBFeHRlcm5hbGl6YWJsZX0gaW50ZXJmYWNlIHRvIHJlYWQgZnJvbQorICAgICAqIHRoZSBwcm9wZXJ0aWVzIHdyaXR0ZW4gYnkge0BsaW5rICN3cml0ZUV4dGVybmFsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGZyb21Qcm9wZXJ0aWVzKChNYXApIGluLnJlYWRPYmplY3QoKSk7CisgICAgICAgIF9wcm9wcyA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgX2dsb2JhbHMgPSBpbi5yZWFkQm9vbGVhbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgRXh0ZXJuYWxpemFibGV9IGludGVyZmFjZSB0byB3cml0ZQorICAgICAqIHRoZSBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IHtAbGluayAjdG9Qcm9wZXJ0aWVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZU9iamVjdCh0b1Byb3BlcnRpZXModHJ1ZSkpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoX3Byb3BzKTsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihfZ2xvYmFscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlcyB7QGxpbmsgI3RvUHJvcGVydGllc30gYW5kIHtAbGluayAjZnJvbVByb3BlcnRpZXN9IHRvIGNsb25lCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uc3RydWN0b3IgY29ucyA9IGdldENsYXNzKCkuZ2V0Q29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAobmV3IENsYXNzW117IGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9uSW1wbCBjbG9uZSA9IChDb25maWd1cmF0aW9uSW1wbCkgY29ucy5uZXdJbnN0YW5jZQorICAgICAgICAgICAgICAgIChuZXcgT2JqZWN0W117IEJvb2xlYW4uRkFMU0UgfSk7CisgICAgICAgICAgICBjbG9uZS5mcm9tUHJvcGVydGllcyh0b1Byb3BlcnRpZXModHJ1ZSkpOworICAgICAgICAgICAgY2xvbmUuX3Byb3BzID0gKF9wcm9wcyA9PSBudWxsKSA/IG51bGwgOiBuZXcgSGFzaE1hcChfcHJvcHMpOworICAgICAgICAgICAgY2xvbmUuX2dsb2JhbHMgPSBfZ2xvYmFsczsKKyAgICAgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVWYWx1ZShWYWx1ZSB2YWwpIHsKKyAgICAgICAgaWYgKCFfdmFscy5yZW1vdmUodmFsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdmFsLnNldExpc3RlbmVyKG51bGwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWUgYWRkVmFsdWUoVmFsdWUgdmFsKSB7CisgICAgICAgIF92YWxzLmFkZCh2YWwpOworICAgICAgICB2YWwuc2V0TGlzdGVuZXIodGhpcyk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nVmFsdWUgYWRkU3RyaW5nKFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBTdHJpbmdWYWx1ZSB2YWwgPSBuZXcgU3RyaW5nVmFsdWUocHJvcGVydHkpOworICAgICAgICBhZGRWYWx1ZSh2YWwpOworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHNldCBvZiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIEZpbGVWYWx1ZSBhZGRGaWxlKFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBGaWxlVmFsdWUgdmFsID0gbmV3IEZpbGVWYWx1ZShwcm9wZXJ0eSk7CisgICAgICAgIGFkZFZhbHVlKHZhbCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50VmFsdWUgYWRkSW50KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBJbnRWYWx1ZSB2YWwgPSBuZXcgSW50VmFsdWUocHJvcGVydHkpOworICAgICAgICBhZGRWYWx1ZSh2YWwpOworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHNldCBvZiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIERvdWJsZVZhbHVlIGFkZERvdWJsZShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgRG91YmxlVmFsdWUgdmFsID0gbmV3IERvdWJsZVZhbHVlKHByb3BlcnR5KTsKKyAgICAgICAgYWRkVmFsdWUodmFsKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBCb29sZWFuVmFsdWUgYWRkQm9vbGVhbihTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgQm9vbGVhblZhbHVlIHZhbCA9IG5ldyBCb29sZWFuVmFsdWUocHJvcGVydHkpOworICAgICAgICBhZGRWYWx1ZSh2YWwpOworICAgICAgICB2YWwuc2V0RGVmYXVsdCgiZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdMaXN0VmFsdWUgYWRkU3RyaW5nTGlzdChTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgU3RyaW5nTGlzdFZhbHVlIHZhbCA9IG5ldyBTdHJpbmdMaXN0VmFsdWUocHJvcGVydHkpOworICAgICAgICBhZGRWYWx1ZSh2YWwpOworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHNldCBvZiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdFZhbHVlIGFkZE9iamVjdChTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgT2JqZWN0VmFsdWUgdmFsID0gbmV3IE9iamVjdFZhbHVlKHByb3BlcnR5KTsKKyAgICAgICAgYWRkVmFsdWUodmFsKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBQbHVnaW5WYWx1ZSBhZGRQbHVnaW4oU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIHNpbmdsZXRvbikgeworICAgICAgICBQbHVnaW5WYWx1ZSB2YWwgPSBuZXcgUGx1Z2luVmFsdWUocHJvcGVydHksIHNpbmdsZXRvbik7CisgICAgICAgIGFkZFZhbHVlKHZhbCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGx1Z2luTGlzdFZhbHVlIGFkZFBsdWdpbkxpc3QoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIFBsdWdpbkxpc3RWYWx1ZSB2YWwgPSBuZXcgUGx1Z2luTGlzdFZhbHVlKHByb3BlcnR5KTsKKyAgICAgICAgYWRkVmFsdWUodmFsKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0NvbmZpZ3VyYXRpb25Qcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Db25maWd1cmF0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzY1NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Db25maWd1cmF0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBwb3B1bGF0ZSB7QGxpbmsgQ29uZmlndXJhdGlvbn1zIGluCisgKiBzb21lIGVudmlyb25tZW50LXNwZWNpZmljIHdheS4gSW1wbGVtZW50YXRpb25zIG11c3QgaW1wbGVtZW50IHRoZQorICogPGNvZGU+ZXF1YWxzPC9jb2RlPiBhbmQgPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZHMgc28gdGhhdCBlcXVpdmFsZW50CisgKiBjb25maWd1cmF0aW9ucyBjb21wYXJlIGVxdWFsLgorICoKKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjQuMC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiBwcm9wZXJ0aWVzIGxvYWRlZCB0aHVzIGZhciwgb3IgZW1wdHkgbWFwIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHByb3BlcnRpZXMgdG8gdGhvc2UgaW4gdGhpcyBwcm92aWRlciwgb3ZlcndyaXRpbmcKKyAgICAgKiBhbnkgZXhpc2l0bmcgcHJvcGVydGllcyB1bmRlciB0aGUgc2FtZSBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnRpZXMoTWFwIHByb3BzKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHNpbmdsZSBwcm9wZXJ0eSwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHByb3BlcnR5IHVuZGVyIHRoZQorICAgICAqIHNhbWUga2V5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldCBsb2FkZWQgaW5mb3JtYXRpb24gaW50byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRvKENvbmZpZ3VyYXRpb24gY29uZik7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0NvbmZpZ3VyYXRpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0NvbmZpZ3VyYXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViYmIyZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvQ29uZmlndXJhdGlvbnMuamF2YQpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb24uTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuU3RyaW5nRGlzdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXA7CisKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgZGVhbGluZyB3aXRoIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25zIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKENvbmZpZ3VyYXRpb25zLmNsYXNzKTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcCBfbG9hZGVycyA9IG5ldyAKKyAgICAgICAgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAoQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAuV0VBSywgCisgICAgICAgICAgICAgICAgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAuSEFSRCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTF9MT0FERVIgPSAibnVsbC1sb2FkZXIiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIGdpdmVuIHBsdWdpbiBzdHJpbmcsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHBsdWdpbikgeworICAgICAgICByZXR1cm4gZ2V0UGx1Z2luQ29tcG9uZW50KHBsdWdpbiwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0aWVzIHBhcnQgb2YgdGhlIGdpdmVuIHBsdWdpbiBzdHJpbmcsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBwbHVnaW4pIHsKKyAgICAgICAgcmV0dXJuIGdldFBsdWdpbkNvbXBvbmVudChwbHVnaW4sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZWl0aGVyIHRoZSBjbGFzcyBuYW1lIG9yIHByb3BlcnRpZXMgc3RyaW5nIGZyb20gYSBwbHVnaW4gc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5Db21wb25lbnQoU3RyaW5nIHBsdWdpbiwgYm9vbGVhbiBjbHNOYW1lKSB7CisgICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkKKyAgICAgICAgICAgIHBsdWdpbiA9IHBsdWdpbi50cmltKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHBsdWdpbikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgb3BlblBhcmVuID0gLTE7CisgICAgICAgIGlmIChwbHVnaW4uY2hhckF0KHBsdWdpbi5sZW5ndGgoKSAtIDEpID09ICcpJykKKyAgICAgICAgICAgIG9wZW5QYXJlbiA9IHBsdWdpbi5pbmRleE9mKCcoJyk7CisgICAgICAgIGlmIChvcGVuUGFyZW4gPT0gLTEpIHsKKyAgICAgICAgICAgIGludCBlcSA9IHBsdWdpbi5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoZXEgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIChjbHNOYW1lKSA/IHBsdWdpbiA6IG51bGw7CisgICAgICAgICAgICByZXR1cm4gKGNsc05hbWUpID8gbnVsbCA6IHBsdWdpbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsc05hbWUocHJvcHMpIGZvcm0KKyAgICAgICAgaWYgKGNsc05hbWUpCisgICAgICAgICAgICByZXR1cm4gcGx1Z2luLnN1YnN0cmluZygwLCBvcGVuUGFyZW4pLnRyaW0oKTsKKyAgICAgICAgU3RyaW5nIHByb3AgPSBwbHVnaW4uc3Vic3RyaW5nKG9wZW5QYXJlbiArIDEsCisgICAgICAgICAgICBwbHVnaW4ubGVuZ3RoKCkgLSAxKS50cmltKCk7CisgICAgICAgIHJldHVybiAocHJvcC5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBwcm9wOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmUgdGhlIGdpdmVuIGNsYXNzIG5hbWUgYW5kIHByb3BlcnRpZXMgaW50byBhIHBsdWdpbiBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luKFN0cmluZyBjbHNOYW1lLCBTdHJpbmcgcHJvcHMpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY2xzTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHByb3BzKSkKKyAgICAgICAgICAgIHJldHVybiBjbHNOYW1lOworICAgICAgICByZXR1cm4gY2xzTmFtZSArICIoIiArIHByb3BzICsgIikiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHBsdWdpbiBzdHJpbmcgdGhhdCBjb21iaW5lcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gcGx1Z2luCisgICAgICogc3RyaW5ncywgd2hlcmUgcHJvcGVydGllcyBvZiA8Y29kZT5vdmVycmlkZTwvY29kZT4gd2lsbCBvdmVycmlkZSB0aGUKKyAgICAgKiBzYW1lIHByb3BlcnRpZXMgb2YgPGNvZGU+b3JpZzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tYmluZVBsdWdpbnMoU3RyaW5nIG9yaWcsIFN0cmluZyBvdmVycmlkZSkgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShvcmlnKSkKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkob3ZlcnJpZGUpKQorICAgICAgICAgICAgcmV0dXJuIG9yaWc7CisKKyAgICAgICAgU3RyaW5nIG9yaWdDbHMgPSBnZXRDbGFzc05hbWUob3JpZyk7CisgICAgICAgIFN0cmluZyBvdmVycmlkZUNscyA9IGdldENsYXNzTmFtZShvdmVycmlkZSk7CisgICAgICAgIFN0cmluZyBjbHM7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG9yaWdDbHMpKQorICAgICAgICAgICAgY2xzID0gb3ZlcnJpZGVDbHM7CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkob3ZlcnJpZGVDbHMpKQorICAgICAgICAgICAgY2xzID0gb3JpZ0NsczsKKyAgICAgICAgZWxzZSBpZiAoIW9yaWdDbHMuZXF1YWxzKG92ZXJyaWRlQ2xzKSkKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZTsgLy8gY29tcGxldGVseSBkaWZmZXJlbnQgcGx1Z2luCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNscyA9IG9yaWdDbHM7CisKKyAgICAgICAgU3RyaW5nIG9yaWdQcm9wcyA9IGdldFByb3BlcnRpZXMob3JpZyk7CisgICAgICAgIFN0cmluZyBvdmVycmlkZVByb3BzID0gZ2V0UHJvcGVydGllcyhvdmVycmlkZSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG9yaWdQcm9wcykpCisgICAgICAgICAgICByZXR1cm4gZ2V0UGx1Z2luKGNscywgb3ZlcnJpZGVQcm9wcyk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG92ZXJyaWRlUHJvcHMpKQorICAgICAgICAgICAgcmV0dXJuIGdldFBsdWdpbihjbHMsIG9yaWdQcm9wcyk7CisKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IHBhcnNlUHJvcGVydGllcyhvcmlnUHJvcHMpOworICAgICAgICBwcm9wcy5wdXRBbGwocGFyc2VQcm9wZXJ0aWVzKG92ZXJyaWRlUHJvcHMpKTsKKyAgICAgICAgcmV0dXJuIGdldFBsdWdpbihjbHMsIHNlcmlhbGl6ZVByb3BlcnRpZXMocHJvcHMpKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLCB1c2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBjbGFzcyBsb2FkZXIuIE5vIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGluc3RhbmNlIGlzIHBlcmZvcm1lZCBieQorICAgICAqIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbHNOYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGNsc05hbWUsIG51bGwsIG51bGwsIGxvYWRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBhbmQKKyAgICAgKiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbHNOYW1lLCBDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIFN0cmluZyBwcm9wcywgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIE9iamVjdCBvYmogPSBuZXdJbnN0YW5jZShjbHNOYW1lLCBudWxsLCBjb25mLCBsb2FkZXIsIHRydWUpOworICAgICAgICBjb25maWd1cmVJbnN0YW5jZShvYmosIGNvbmYsIHByb3BzKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkgbWVtYmVycyBvZiB0aGlzIHBhY2thZ2UgdG8gaW5zdGFudGlhdGUgcGx1Z2luCisgICAgICogdmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsc05hbWUsIFZhbHVlIHZhbCwgQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY2xzTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDbGFzcyBjbHMgPSBudWxsOyAKKworICAgICAgICAvLyBjYW4ndCBoYXZlIGEgbnVsbCByZWZlcmVuY2UgaW4gdGhlIG1hcCwgc28gdXNlIHN5bWJvbGljIAorICAgICAgICAvLyBjb25zdGFudCBhcyBrZXkKKyAgICAgICAgT2JqZWN0IGtleSA9IGxvYWRlciA9PSBudWxsID8gTlVMTF9MT0FERVIgOiBsb2FkZXI7CisgICAgICAgIE1hcCBsb2FkZXJDYWNoZSA9IChNYXApIF9sb2FkZXJzLmdldChrZXkpOworICAgICAgICBpZiAobG9hZGVyQ2FjaGUgPT0gbnVsbCkgeyAvLyBXZSBkb24ndCBoYXZlIGEgY2FjaGUgZm9yIHRoaXMgbG9hZGVyLgorICAgICAgICAgICAgbG9hZGVyQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsKKyAgICAgICAgICAgIF9sb2FkZXJzLnB1dChrZXksIGxvYWRlckNhY2hlKTsKKyAgICAgICAgfSBlbHNlIHsgIC8vIFdlIGhhdmUgYSBjYWNoZSBmb3IgdGhpcyBsb2FkZXIuCisgICAgICAgICAgICBjbHMgPSAoQ2xhc3MpIGxvYWRlckNhY2hlLmdldChjbHNOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkgeyAvLyB3ZSBoYXZlbid0IGNhY2hlZCB0aGlzLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjbHMgPSBTdHJpbmdzLnRvQ2xhc3MoY2xzTmFtZSwgZmluZERlcml2ZWRMb2FkZXIoY29uZiwgbG9hZGVyKSk7CisgICAgICAgICAgICAgICAgbG9hZGVyQ2FjaGUucHV0KGNsc05hbWUsIGNscyk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZSA9IGdldENyZWF0ZUV4Y2VwdGlvbihjbHNOYW1lLCB2YWwsIHJlKTsKKyAgICAgICAgICAgICAgICBpZiAoZmF0YWwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgICAgICAgIExvZyBsb2cgPSAoY29uZiA9PSBudWxsKSA/IG51bGwgOiBjb25mLmdldENvbmZpZ3VyYXRpb25Mb2coKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nICE9IG51bGwgJiYgbG9nLmlzRXJyb3JFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihfbG9jLmdldCgicGx1Z2luLWNyZWF0aW9uLWV4Y2VwdGlvbiIsIHZhbCksIHJlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2xzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBSdW50aW1lRXhjZXB0aW9uIHJlID0gbmV3IE5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICgib2JqLWNyZWF0ZSIsIGNscykuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIGlmIChmYXRhbCkKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIExvZyBsb2cgPSAoY29uZiA9PSBudWxsKSA/IG51bGwgOiBjb25mLmdldENvbmZpZ3VyYXRpb25Mb2coKTsKKyAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCAmJiBsb2cuaXNFcnJvckVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoX2xvYy5nZXQoInBsdWdpbi1jcmVhdGlvbi1leGNlcHRpb24iLCB2YWwpLCByZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gZmluZCBhIGRlcml2ZWQgbG9hZGVyIHRoYXQgZGVsZWdhdGVzIHRvIG91ciB0YXJnZXQgbG9hZGVyLgorICAgICAqIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9uIGxvYWRlcnMgdGhhdCBkZWxlZ2F0ZSBhcHByb3ByaWF0ZWx5IGZvciBrbm93bgorICAgICAqIGNsYXNzZXMgZmlyc3QgY3JhY2sgYXQgY2xhc3MgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZmluZERlcml2ZWRMb2FkZXIoQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgLy8gd2UgYWx3YXlzIHByZWZlciB0aGUgdGhyZWFkIGxvYWRlciwgYmVjYXVzZSBpdCdzIHRoZSBvbmx5IHRoaW5nIHdlCisgICAgICAgIC8vIGNhbiBhY2Nlc3MgdGhhdCBpc24ndCBib3VuZCB0byB0aGUgT3BlbkpQQSBjbGFzc2xvYWRlciwgdW5sZXNzCisgICAgICAgIC8vIHRoZSBjb25mIG9iamVjdCBpcyBvZiBhIGN1c3RvbSBjbGFzcworICAgICAgICBDbGFzc0xvYWRlciBjdHhMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjdHhMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4TG9hZGVyOworICAgICAgICAgICAgaWYgKGNvbmYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZi5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbnMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQ2xhc3NMb2FkZXIgcGFyZW50ID0gY3R4TG9hZGVyOyBwYXJlbnQgIT0gbnVsbDsgCisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbG9hZGVyKQorICAgICAgICAgICAgICAgIHJldHVybiBjdHhMb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmYgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChDbGFzc0xvYWRlciBwYXJlbnQgPSBjb25mLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsgCisgICAgICAgICAgICAgICAgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbG9hZGVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZi5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIHtAbGluayBDb25maWd1cmF0aW9ufSBpbnN0YW5jZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKiBvcHRpb25zIHByb3ZpZGVkLiBBbGwgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gYXJlCisgICAgICogcmVjb2duaXplZDsgYWRkaXRpb25hbGx5LCBpZiBhIDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+IG9yCisgICAgICogPGNvZGU+cDwvY29kZT4gYXJndW1lbnQgZXhpc3RzLCB0aGUgcmVzb3VyY2UgaXQKKyAgICAgKiBwb2ludHMgdG8gd2lsbCBiZSBsb2FkZWQgYW5kIHNldCBpbnRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqIEl0IGNhbiBwb2ludCB0byBlaXRoZXIgYSBmaWxlIG9yIGEgcmVzb3VyY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9wdWxhdGVDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZiwgT3B0aW9ucyBvcHRzKSB7CisgICAgICAgIFN0cmluZyBwcm9wcyA9IG9wdHMucmVtb3ZlUHJvcGVydHkoInByb3BlcnRpZXMiLCAicCIsIG51bGwpOworICAgICAgICBDb25maWd1cmF0aW9uUHJvdmlkZXIgcHJvdmlkZXI7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShwcm9wcykpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcHJvcHM7CisgICAgICAgICAgICBTdHJpbmcgYW5jaG9yID0gbnVsbDsKKyAgICAgICAgICAgIGludCBpZHggPSBwYXRoLmxhc3RJbmRleE9mKCcjJyk7CisgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IHBhdGgubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBwYXRoLnN1YnN0cmluZyhpZHggKyAxKTsKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKF9sb2MuZ2V0KCJhbmNob3Itb25seSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcykuZ2V0TWVzc2FnZSgpLCBDb25maWd1cmF0aW9ucy5jbGFzcy5nZXROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKQorICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gUHJvZHVjdERlcml2YXRpb25zLmxvYWQoZmlsZSwgYW5jaG9yLCBudWxsKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgcGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gUHJvZHVjdERlcml2YXRpb25zLmxvYWQoZmlsZSwgYW5jaG9yLCBudWxsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gUHJvZHVjdERlcml2YXRpb25zLmxvYWQocGF0aCwgYW5jaG9yLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHByb3ZpZGVyLnNldEludG8oY29uZik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihfbG9jLmdldCgibm8tcHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICAgICBwcm9wcykuZ2V0TWVzc2FnZSgpLCBDb25maWd1cmF0aW9ucy5jbGFzcy5nZXROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICBwcm9wcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm92aWRlciA9IFByb2R1Y3REZXJpdmF0aW9ucy5sb2FkRGVmYXVsdHMobnVsbCk7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm92aWRlci5zZXRJbnRvKGNvbmYpOworICAgICAgICB9CisgICAgICAgIG9wdHMuc2V0SW50byhjb25mKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHRocm93IGFuIGluZm9ybWF0aXZlIGRlc2NyaXB0aW9uIG9uIGluc3RhbnRpYXRpb24gZXJyb3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBnZXRDcmVhdGVFeGNlcHRpb24oU3RyaW5nIGNsc05hbWUsCisgICAgICAgIFZhbHVlIHZhbCwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiB3aXRoIHNvbWUgYmV0dGVyIGluZm9ybWF0aW9uCisgICAgICAgIGZpbmFsIFN0cmluZyBtc2c7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtczsKKworICAgICAgICBTdHJpbmcgYWxpYXMgPSB2YWwuYWxpYXMoY2xzTmFtZSk7CisgICAgICAgIFN0cmluZ1tdIGFsaWFzZXMgPSB2YWwuZ2V0QWxpYXNlcygpOworICAgICAgICBTdHJpbmdbXSBrZXlzOworICAgICAgICBpZiAoYWxpYXNlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGtleXMgPSBhbGlhc2VzOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGtleXMgPSBuZXcgU3RyaW5nW2FsaWFzZXMubGVuZ3RoIC8gMl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgICAgICAgICAga2V5c1tpIC8gMl0gPSBhbGlhc2VzW2ldOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGNsb3Nlc3Q7CisgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBtc2cgPSAiaW52YWxpZC1wbHVnaW4iOworICAgICAgICAgICAgcGFyYW1zID0gbmV3IE9iamVjdFtdeyB2YWwuZ2V0UHJvcGVydHkoKSwgYWxpYXMsIGUudG9TdHJpbmcoKSwgfTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2xvc2VzdCA9IFN0cmluZ0Rpc3RhbmNlLmdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlCisgICAgICAgICAgICAoYWxpYXMsIGtleXMsIDAuNWYpKSA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2cgPSAiaW52YWxpZC1wbHVnaW4tYWxpYXNlcyI7CisgICAgICAgICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgdmFsLmdldFByb3BlcnR5KCksIGFsaWFzLCBlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgbmV3IFRyZWVTZXQoQXJyYXlzLmFzTGlzdChrZXlzKSksIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2cgPSAiaW52YWxpZC1wbHVnaW4tYWxpYXNlcy1oaW50IjsKKyAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICB2YWwuZ2V0UHJvcGVydHkoKSwgYWxpYXMsIGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuZXcgVHJlZVNldChBcnJheXMuYXNMaXN0KGtleXMpKSwgY2xvc2VzdCwgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKF9sb2MuZ2V0KG1zZywgcGFyYW1zKSwgZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIHByb3BlcnRpZXMgYnkKKyAgICAgKiBtYXRjaGluZyB0aGUgcHJvcGVydGllcyBzdHJpbmcgdG8gdGhlIG9iamVjdCdzIHNldHRlcgorICAgICAqIG1ldGhvZHMuIFRoZSBwcm9wZXJ0aWVzIHN0cmluZyBzaG91bGQgYmUgaW4gdGhlIGZvcm0KKyAgICAgKiAicHJvcDE9dmFsMSwgcHJvcDI9dmFsMiAuLi4iLiBEb2VzIG5vdCB2YWxpZGF0ZSB0aGF0IHNldHRlcgorICAgICAqIG1ldGhvZHMgZXhpc3QgZm9yIHRoZSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIG9uIGNvbmZpZ3VyYXRpb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlSW5zdGFuY2UoT2JqZWN0IG9iaiwgQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICBTdHJpbmcgcHJvcGVydGllcykgeworICAgICAgICBjb25maWd1cmVJbnN0YW5jZShvYmosIGNvbmYsIHByb3BlcnRpZXMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIGJ5CisgICAgICogbWF0Y2hpbmcgdGhlIHByb3BlcnRpZXMgc3RyaW5nIHRvIHRoZSBvYmplY3QncyBzZXR0ZXIKKyAgICAgKiBtZXRob2RzLiBUaGUgcHJvcGVydGllcyBzdHJpbmcgc2hvdWxkIGJlIGluIHRoZSBmb3JtCisgICAgICogInByb3AxPXZhbDEsIHByb3AyPXZhbDIgLi4uIi4gVmFsaWRhdGVzIHRoYXQgc2V0dGVyIG1ldGhvZHMKKyAgICAgKiBleGlzdCBmb3IgdGhlIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gb24gY29uZmlndXJhdGlvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVJbnN0YW5jZShPYmplY3Qgb2JqLCBDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzLCBTdHJpbmcgY29uZmlndXJhdGlvbk5hbWUpIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBudWxsOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkocHJvcGVydGllcykpCisgICAgICAgICAgICBwcm9wcyA9IHBhcnNlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgICAgICAgY29uZmlndXJlSW5zdGFuY2Uob2JqLCBjb25mLCBwcm9wcywgY29uZmlndXJhdGlvbk5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIGJ5CisgICAgICogbWF0Y2hpbmcgdGhlIHByb3BlcnRpZXMgc3RyaW5nIHRvIHRoZSBvYmplY3QncyBzZXR0ZXIKKyAgICAgKiBtZXRob2RzLiBEb2VzIG5vdCB2YWxpZGF0ZSB0aGF0IHNldHRlciBtZXRob2RzIGV4aXN0IGZvciB0aGUgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBvbiBjb25maWd1cmF0aW9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUluc3RhbmNlKE9iamVjdCBvYmosIENvbmZpZ3VyYXRpb24gY29uZiwKKyAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGNvbmZpZ3VyZUluc3RhbmNlKG9iaiwgY29uZiwgcHJvcGVydGllcywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIHByb3BlcnRpZXMgYnkKKyAgICAgKiBtYXRjaGluZyB0aGUgcHJvcGVydGllcyBzdHJpbmcgdG8gdGhlIG9iamVjdCdzIHNldHRlcgorICAgICAqIG1ldGhvZHMuIElmIDxjb2RlPmNvbmZpZ3VyYXRpb25OYW1lPC9jb2RlPiBpcworICAgICAqIG5vbi08Y29kZT5udWxsPC9jb2RlPiwgdmFsaWRhdGVzIHRoYXQgc2V0dGVyIG1ldGhvZHMgZXhpc3QgZm9yCisgICAgICogdGhlIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gb24gY29uZmlndXJhdGlvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVJbnN0YW5jZShPYmplY3Qgb2JqLCBDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGNvbmZpZ3VyYXRpb25OYW1lKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBPcHRpb25zIG9wdHM7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzIGluc3RhbmNlb2YgT3B0aW9ucykKKyAgICAgICAgICAgIG9wdHMgPSAoT3B0aW9ucykgcHJvcGVydGllczsKKyAgICAgICAgZWxzZSB7IAorICAgICAgICAgICAgb3B0cyA9IG5ldyBPcHRpb25zKCk7CisgICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG9wdHMucHV0QWxsKHByb3BlcnRpZXMpOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlndXJhYmxlIGNvbmZpZ3VyYWJsZSA9IG51bGw7CisgICAgICAgIGlmIChjb25mICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlKQorICAgICAgICAgICAgY29uZmlndXJhYmxlID0gKENvbmZpZ3VyYWJsZSkgb2JqOworCisgICAgICAgIGlmIChjb25maWd1cmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlndXJhYmxlLnNldENvbmZpZ3VyYXRpb24oY29uZik7CisgICAgICAgICAgICBjb25maWd1cmFibGUuc3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgT3B0aW9ucyBpbnZhbGlkRW50cmllcyA9IG9wdHMuc2V0SW50byhvYmopOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgR2VuZXJpY0NvbmZpZ3VyYWJsZSkKKyAgICAgICAgICAgICgoR2VuZXJpY0NvbmZpZ3VyYWJsZSkgb2JqKS5zZXRJbnRvKGludmFsaWRFbnRyaWVzKTsKKworCQlpZiAoIWludmFsaWRFbnRyaWVzLmlzRW1wdHkoKSAmJiBjb25maWd1cmF0aW9uTmFtZSAhPSBudWxsKSB7CisJCQlMb2NhbGl6ZXIuTWVzc2FnZSBtc2cgPSBudWxsOworCQkJU3RyaW5nIGZpcnN0ID0gKFN0cmluZykgaW52YWxpZEVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQlpZiAoaW52YWxpZEVudHJpZXMua2V5U2V0KCkuc2l6ZSgpID09IDEgJiYKKwkJCQlmaXJzdC5pbmRleE9mKCcuJykgPT0gLTEpIHsKKwkJCQkvLyBpZiB0aGVyZSdzIGp1c3Qgb25lIG1pc3NwZWxsaW5nIGFuZCB0aGlzIGlzIG5vdCBhCisJCQkJLy8gcGF0aCB0cmF2ZXJzYWwsIGNoZWNrIGZvciBuZWFyIG1pc3Nlcy4KKwkJCQlDb2xsZWN0aW9uIG9wdGlvbnMgPSBmaW5kT3B0aW9uc0ZvcihvYmouZ2V0Q2xhc3MoKSk7CisJCQkJU3RyaW5nIGNsb3NlID0gU3RyaW5nRGlzdGFuY2UuZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2UKKwkJCQkJKGZpcnN0LCBvcHRpb25zLCAwLjc1Zik7CisJCQkJaWYgKGNsb3NlICE9IG51bGwpCisJCQkJCW1zZyA9IF9sb2MuZ2V0KCJpbnZhbGlkLWNvbmZpZy1wYXJhbS1oaW50IiwgbmV3IE9iamVjdFtdeworCQkJCQkJY29uZmlndXJhdGlvbk5hbWUsIG9iai5nZXRDbGFzcygpLCBmaXJzdCwgY2xvc2UsCisJCQkJCQlvcHRpb25zLCB9KTsKKwkJCX0KKworICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbXNnID0gX2xvYy5nZXQoImludmFsaWQtY29uZmlnLXBhcmFtcyIsIG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbk5hbWUsIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEVudHJpZXMua2V5U2V0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgZmluZE9wdGlvbnNGb3Iob2JqLmdldENsYXNzKCkpLnRvU3RyaW5nKCksIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZ3VyYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgY29uZmlndXJhYmxlLmVuZENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGZpbmRPcHRpb25zRm9yKENsYXNzIGNscykgeworICAgICAgICBDb2xsZWN0aW9uIGMgPSBPcHRpb25zLmZpbmRPcHRpb25zRm9yKGNscyk7CisgICAgICAgIAorICAgICAgICAvLyByZW1vdmUgQ29uZmlndXJhYmxlLnNldENvbmZpZ3VyYXRpb24oKSBhbmQgCisgICAgICAgIC8vIEdlbmVyaWNDb25maWd1cmFibGUuc2V0SW50bygpIGZyb20gdGhlIHNldCwgaWYgYXBwbGljYWJsZS4KKyAgICAgICAgaWYgKENvbmZpZ3VyYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpCisgICAgICAgICAgICBjLnJlbW92ZSgiQ29uZmlndXJhdGlvbiIpOworICAgICAgICBpZiAoR2VuZXJpY0NvbmZpZ3VyYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpCisgICAgICAgICAgICBjLnJlbW92ZSgiSW50byIpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVybiBhIHNldCBvZiBwcm9wZXJ0aWVzIGludG8gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZVByb3BlcnRpZXMoTWFwIG1hcCkgeworICAgICAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKKyAgICAgICAgU3RyaW5nIHZhbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgnPScpOworICAgICAgICAgICAgdmFsID0gU3RyaW5nLnZhbHVlT2YoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoJywnKSAhPSAtMSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCciJykuYXBwZW5kKHZhbCkuYXBwZW5kKCciJyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9ucyBwYXJzZVByb3BlcnRpZXMoU3RyaW5nIHByb3BlcnRpZXMpIHsKKyAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgcHJvcGVydGllcyA9IFN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvcGVydGllcyk7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gb3B0czsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gcHJvcHMgPSBTdHJpbmdzLnNwbGl0KHByb3BlcnRpZXMsICIsIiwgMCk7CisgICAgICAgICAgICBpbnQgaWR4OworICAgICAgICAgICAgY2hhciBxdW90ZTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wOworICAgICAgICAgICAgU3RyaW5nIHZhbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZHggPSBwcm9wc1tpXS5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUga2V5IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkgdmFsdWUsIHNldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGtleSwgYW5kIGNvbnRpbnVlLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHBlcm1pdHMgR2VuZXJpY0NvbmZpZ3VyYWJsZSBpbnN0YW5jZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYmVoYXZlIG1lYW5pbmdmdWxseS4gV2UgbWlnaHQgY29uc2lkZXIgc2V0dGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG8gc29tZSB3ZWxsLWtub3duICJ2YWx1ZSB3YXMgbm90IHNldCwgYnV0CisgICAgICAgICAgICAgICAgICAgIC8vIGtleSBpcyBwcmVzZW50IiBzdHJpbmcgc28gdGhhdCBpbnN0YW5jZXMgZ2V0dGluZworICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgaW5qZWN0ZWQgY2FuIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1lbnRpb25lZAorICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBhbmQgb25lIHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIHByb3AgPSBwcm9wc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gcHJvcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm9wID0gcHJvcHNbaV0uc3Vic3RyaW5nKDAsIGlkeCkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICB2YWwgPSBwcm9wc1tpXS5zdWJzdHJpbmcoaWR4ICsgMSkudHJpbSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBxdW90ZWQsIHJlYWQgdW50aWwgdGhlIGVuZCBxdW90ZQorICAgICAgICAgICAgICAgIGlmICgoKHZhbC5zdGFydHNXaXRoKCJcIiIpICYmIHZhbC5lbmRzV2l0aCgiXCIiKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHZhbC5zdGFydHNXaXRoKCInIikgJiYgdmFsLmVuZHNXaXRoKCInIikpKQorICAgICAgICAgICAgICAgICAgICAmJiB2YWwubGVuZ3RoKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDEsIHZhbC5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbC5zdGFydHNXaXRoKCJcIiIpIHx8IHZhbC5zdGFydHNXaXRoKCInIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSB2YWwuY2hhckF0KDApOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWwuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHF1b3RJZHg7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK2kgPCBwcm9wcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcXVvdElkeCA9IHByb3BzW2ldLmluZGV4T2YocXVvdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3RJZHggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHByb3BzW2ldLnN1YnN0cmluZygwLCBxdW90SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3RJZHggKyAxIDwgcHJvcHNbaV0ubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocHJvcHNbaV0uc3Vic3RyaW5nKHF1b3RJZHggKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHByb3BzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3B0cy5wdXQocHJvcCwgdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvcHRzOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oX2xvYy5nZXQoInByb3AtcGFyc2UiLCBwcm9wZXJ0aWVzKSwgcmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgdXAgdGhlIGdpdmVuIG5hbWUgaW4gSk5ESS4gSWYgdGhlIG5hbWUgaXMgbnVsbCwgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBsb29rdXAoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDb250ZXh0IGN0eCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBjdHgubG9va3VwKG5hbWUpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gbmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgX2xvYy5nZXQoIm5hbWluZy1lcnIiLCBuYW1lKS5nZXRNZXNzYWdlKCksIG5lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjdHggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeyBjdHguY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgZ2l2ZW4gcGFydGlhbCBrZXksIHByZWZpeGVkIHdpdGggYW55CisgICAgICogcG9zc2libGUgY29uZmlndXJhdGlvbiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zUHJvcGVydHkoU3RyaW5nIHBhcnRpYWxLZXksIE1hcCBwcm9wcykgeworICAgICAgICBpZiAocGFydGlhbEtleSA9PSBudWxsIHx8IHByb3BzID09IG51bGwgfHwgcHJvcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcHJvcHMuY29udGFpbnNLZXkoCisgICAgICAgICAgICAgICAgUHJvZHVjdERlcml2YXRpb25zLmdldENvbmZpZ3VyYXRpb25LZXkocGFydGlhbEtleSwgcHJvcHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBwYXJ0aWFsIGtleSwgcHJlZml4ZWQgd2l0aCBhbnkgcG9zc2libGUKKyAgICAgKiBjb25maWd1cmF0aW9uIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcGFydGlhbEtleSwgTWFwIG0pIHsKKyAgICAgICAgaWYgKHBhcnRpYWxLZXkgPT0gbnVsbCB8fCBtID09IG51bGwgfHwgbS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJldHVybiBtLmdldChQcm9kdWN0RGVyaXZhdGlvbnMuZ2V0Q29uZmlndXJhdGlvbktleShwYXJ0aWFsS2V5LCBtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4gcGFydGlhbCBrZXksIHByZWZpeGVkIHdpdGggYW55CisgICAgICogcG9zc2libGUgY29uZmlndXJhdGlvbiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIHBhcnRpYWxLZXksIE1hcCBwcm9wcykgeworICAgICAgICBpZiAocGFydGlhbEtleSA9PSBudWxsIHx8IHByb3BzID09IG51bGwgfHwgcHJvcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBwcm9wcy5yZW1vdmUoUHJvZHVjdERlcml2YXRpb25zLmdldENvbmZpZ3VyYXRpb25LZXkocGFydGlhbEtleSwKKyAgICAgICAgICAgIHByb3BzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Eb3VibGVWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Eb3VibGVWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODI2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0RvdWJsZVZhbHVlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLyoqCisgKiBBIGRvdWJsZSB7QGxpbmsgVmFsdWV9LgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVWYWx1ZSBleHRlbmRzIFZhbHVlIHsKKworICAgIHByaXZhdGUgZG91YmxlIHZhbHVlOworCisgICAgcHVibGljIERvdWJsZVZhbHVlKFN0cmluZyBwcm9wKSB7CisgICAgICAgIHN1cGVyKHByb3ApOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBkb3VibGUuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldChkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgZG91YmxlIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpCisgICAgICAgICAgICB2YWx1ZUNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJuYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXQoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVybmFsU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsU3RyaW5nKFN0cmluZyB2YWwpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkodmFsKSkKKyAgICAgICAgICAgIHNldCgwRCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldChEb3VibGUucGFyc2VEb3VibGUodmFsKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICBzZXQoMEQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXQoKChOdW1iZXIpIG9iaikuZG91YmxlVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9GaWxlVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvRmlsZVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmYWU3YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvRmlsZVZhbHVlLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKKworLyoqCisgKiBBIHtAbGluayBGaWxlfSB7QGxpbmsgVmFsdWV9LgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CisKKyAgICBwcml2YXRlIEZpbGUgdmFsdWU7CisKKyAgICBwdWJsaWMgRmlsZVZhbHVlKFN0cmluZyBwcm9wKSB7CisgICAgICAgIHN1cGVyKHByb3ApOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBGaWxlLmNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXQoRmlsZSB2YWx1ZSkgeworICAgICAgICBGaWxlIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhvbGRWYWx1ZSwgdmFsdWUpKQorICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJuYWxTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogdmFsdWUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxTdHJpbmcoU3RyaW5nIHZhbCkgeworICAgICAgICBzZXQobmV3IEZpbGUodmFsKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBzZXQoKEZpbGUpIG9iaik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0dlbmVyaWNDb25maWd1cmFibGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvR2VuZXJpY0NvbmZpZ3VyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDZkYmYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0dlbmVyaWNDb25maWd1cmFibGUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zOworCisvKioKKyAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBtYXkgcGVyZm9ybSBhZGRpdGlvbmFsCisgKiBnZW5lcmljIGNvbmZpZ3VyYXRpb24gd2l0aCBhbnkga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2Fubm90IGJlIHNldAorICogaW50byB0aGUgb2JqZWN0IHZpYSB0aGUgbm9ybWFsIAorICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zI3NldEludG99IG1lYW5zLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2VuZXJpY0NvbmZpZ3VyYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBnZW5lcmljIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIGRhdGEgaW4KKyAgICAgKiA8Y29kZT5vcHRzPC9jb2RlPi4gVGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbnkgdmFsdWVzIGluCisgICAgICogPGNvZGU+b3B0czwvY29kZT4gdGhhdCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZDsgaWYgYW55CisgICAgICogdmFsdWVzIHJlbWFpbiBpbiA8Y29kZT5vcHRzPC9jb2RlPiBhZnRlciB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCwKKyAgICAgKiBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWRlbnRpZnlpbmcgdGhvc2Uga2V5LXZhbHVlIHBhaXJzIGFzIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50byhPcHRpb25zIG9wdHMpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9JbnRWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9JbnRWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWMyZTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL0ludFZhbHVlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLyoqCisgKiBBbiBpbnQge0BsaW5rIFZhbHVlfS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgSW50VmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CisKKyAgICBwcml2YXRlIGludCB2YWx1ZTsKKworICAgIHB1YmxpYyBJbnRWYWx1ZShTdHJpbmcgcHJvcCkgeworICAgICAgICBzdXBlcihwcm9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgeworICAgICAgICByZXR1cm4gaW50LmNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXQoaW50IHZhbHVlKSB7CisgICAgICAgIGludCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG9sZFZhbHVlKQorICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0KCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVybmFsU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxTdHJpbmcoU3RyaW5nIHZhbCkgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWwpKQorICAgICAgICAgICAgc2V0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXQoSW50ZWdlci5wYXJzZUludCh2YWwpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbE9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHNldCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0KCgoTnVtYmVyKSBvYmopLmludFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvTWFwQ29uZmlndXJhdGlvblByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL01hcENvbmZpZ3VyYXRpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzdmMDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL01hcENvbmZpZ3VyYXRpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBTaW1wbGUgY29uZmlndXJhdGlvbiBwcm92aWRlciB0aGF0IHNldHMgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhCisgKiBwcm92aWRlZCBtYXAuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE1hcENvbmZpZ3VyYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25Qcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChNYXBDb25maWd1cmF0aW9uUHJvdmlkZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBNYXAgX3Byb3BzID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qgd2l0aCBudWxsIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIE1hcENvbmZpZ3VyYXRpb25Qcm92aWRlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IHByb3BlcnRpZXMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBNYXBDb25maWd1cmF0aW9uUHJvdmlkZXIoTWFwIHByb3BzKSB7CisgICAgICAgIGFkZFByb3BlcnRpZXMocHJvcHMpOworICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIChfcHJvcHMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9NQVAgOiBfcHJvcHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydGllcyhNYXAgcHJvcHMpIHsKKyAgICAgICAgaWYgKHByb3BzID09IG51bGwgfHwgcHJvcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoX3Byb3BzID09IG51bGwpCisgICAgICAgICAgICBfcHJvcHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBfcHJvcHMucHV0QWxsKHByb3BzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGFkZFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAoX3Byb3BzID09IG51bGwpCisgICAgICAgICAgICBfcHJvcHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICByZXR1cm4gX3Byb3BzLnB1dChrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRvKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBzZXRJbnRvKGNvbmYsIGNvbmYuZ2V0Q29uZmlndXJhdGlvbkxvZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcHJvcGVydGllcyBpbnRvIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBsb2cgaXMgbm9uLW51bGwsIHdpbGwgbG9nCisgICAgICogYSBUUkFDRSBtZXNzYWdlIGFib3V0IHRoZSBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50byhDb25maWd1cmF0aW9uIGNvbmYsIExvZyBsb2cpIHsKKyAgICAgICAgaWYgKGxvZyAhPSBudWxsICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJjb25mLWxvYWQiLCBnZXRQcm9wZXJ0aWVzKCkpKTsKKyAgICAgICAgaWYgKF9wcm9wcyAhPSBudWxsKQorICAgICAgICAgICAgY29uZi5mcm9tUHJvcGVydGllcyhfcHJvcHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvT2JqZWN0VmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvT2JqZWN0VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRkMjkzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9PYmplY3RWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk9iamVjdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlJlZmVyZW5jZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcDsKKworLyoqCisgKiBBbiBvYmplY3Qge0BsaW5rIFZhbHVlfS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0VmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChPYmplY3RWYWx1ZS5jbGFzcyk7CisKKyAgICAvLyBjYWNoZSB0aGUgdHlwZXMnIGNsYXNzbG9hZGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAgX2NsYXNzbG9hZGVyQ2FjaGUgPQorICAgICAgICBuZXcgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAoUmVmZXJlbmNlTWFwLkhBUkQsIFJlZmVyZW5jZU1hcC5XRUFLKTsKKworICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgT2JqZWN0VmFsdWUoU3RyaW5nIHByb3ApIHsKKyAgICAgICAgc3VwZXIocHJvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworICAgICAgICByZXR1cm4gX3ZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaikgeworICAgICAgICBzZXQob2JqLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGRlcml2ZWQgaWYgdHJ1ZSwgdGhpcyB2YWx1ZSB3YXMgZGVyaXZlZCBmcm9tIG90aGVyIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaiwgYm9vbGVhbiBkZXJpdmVkKSB7CisgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IF92YWx1ZTsKKyAgICAgICAgX3ZhbHVlID0gb2JqOworICAgICAgICBpZiAoIWRlcml2ZWQgJiYgIU9iamVjdFV0aWxzLmVxdWFscyhvYmosIG9sZFZhbHVlKSkgeworICAgICAgICAgICAgb2JqZWN0Q2hhbmdlZCgpOworICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcy4gRXF1aXZhbGVudAorICAgICAqIHRvIDxjb2RlPmluc3RhbnRpYXRlKHR5cGUsIGNvbmYsIHRydWUpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGluc3RhbnRpYXRlKENsYXNzIHR5cGUsIENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGUodHlwZSwgY29uZiwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnN0YW50aWF0ZShDbGFzcyB0eXBlLCBDb25maWd1cmF0aW9uIGNvbmYsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgc3ViY2xhc3NlcyB0byBpbnN0YW50aWF0ZSBhZGRpdGlvbmFsIHBsdWdpbnMuIFRoaXMgbWV0aG9kIGRvZXMKKyAgICAgKiBub3QgcGVyZm9ybSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsc05hbWUsIENsYXNzIHR5cGUsIENvbmZpZ3VyYXRpb24gY29uZiwKKyAgICAgICAgICAgIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSAoQ2xhc3NMb2FkZXIpIF9jbGFzc2xvYWRlckNhY2hlLmdldCh0eXBlKTsKKyAgICAgICAgaWYgKGNsID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsID0gdHlwZS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYgKGNsID09IG51bGwpIHsgIC8vIFN5c3RlbSBjbGFzc2xvYWRlciBpcyByZXR1cm5lZCBhcyBudWxsCisgICAgICAgICAgICAgICAgY2wgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2NsYXNzbG9hZGVyQ2FjaGUucHV0KHR5cGUsIGNsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbnMubmV3SW5zdGFuY2UoY2xzTmFtZSwgdGhpcywgY29uZiwgY2wsIGZhdGFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzeW5jaHJvbml6ZSBpbnRlcm5hbCBkYXRhIHdpdGggdGhlIG5ldworICAgICAqIG9iamVjdCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvYmplY3RDaGFuZ2VkKCkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJuYWxTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgc2V0KG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0KCJjYW50LXNldC1zdHJpbmciLAorICAgICAgICAgICAgICAgIGdldFByb3BlcnR5KCkpLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBzZXQob2JqKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1BsdWdpbkxpc3RWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9QbHVnaW5MaXN0VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU5MWMxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9QbHVnaW5MaXN0VmFsdWUuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CisKKy8qKgorICogQSBsaXN0IG9mIHBsdWdpbnMuIERlZmF1bHRzIGFuZCBhbGlhc2VzIG9uIHBsdWdpbiBsaXN0cyBhcHBseSBvbmx5CisgKiB0byBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2VlIFBsdWdpblZhbHVlCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5MaXN0VmFsdWUgZXh0ZW5kcyBPYmplY3RWYWx1ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwcml2YXRlIFN0cmluZ1tdIF9uYW1lcyA9IEVNUFRZOworICAgIHByaXZhdGUgU3RyaW5nW10gX3Byb3BzID0gRU1QVFk7CisKKyAgICBwdWJsaWMgUGx1Z2luTGlzdFZhbHVlKFN0cmluZyBwcm9wKSB7CisgICAgICAgIHN1cGVyKHByb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gY2xhc3MgbmFtZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBfbmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBjbGFzcyBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWVzKFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIGlmIChuYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgbmFtZXMgPSBFTVBUWTsKKyAgICAgICAgX25hbWVzID0gbmFtZXM7CisgICAgICAgIHNldChudWxsLCB0cnVlKTsKKyAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gX3Byb3BzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFN0cmluZ1tdIHByb3BzKSB7CisgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKQorICAgICAgICAgICAgcHJvcHMgPSBFTVBUWTsKKyAgICAgICAgX3Byb3BzID0gcHJvcHM7CisgICAgICAgIHNldChudWxsLCB0cnVlKTsKKyAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIHBsdWdpbnMgYXMgaW5zdGFuY2VzIG9mIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGluc3RhbnRpYXRlKENsYXNzIGVsZW1UeXBlLCBDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgT2JqZWN0W10gcmV0OworICAgICAgICBpZiAoX25hbWVzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShlbGVtVHlwZSwgMCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShlbGVtVHlwZSwgX25hbWVzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJldFtpXSA9IG5ld0luc3RhbmNlKF9uYW1lc1tpXSwgZWxlbVR5cGUsIGNvbmYsIGZhdGFsKTsKKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9ucy5jb25maWd1cmVJbnN0YW5jZShyZXRbaV0sIGNvbmYsIF9wcm9wc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0KHJldCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gcmVjb2duaXplIGFsaWFzZXMgb2YgdGhlIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgYXR0YWNoZWQKKyAgICAgKiBwcm9wZXJ0aWVzIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgaWYgKF9uYW1lcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX25hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoQ29uZmlndXJhdGlvbnMuZ2V0UGx1Z2luKGFsaWFzKF9uYW1lc1tpXSksIF9wcm9wc1tpXSkpOworICAgICAgICB9CisgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gcmVjb2duaXplIGFsaWFzZXMgb2YgdGhlIHBsdWdpbiBuYW1lIHdpdGhvdXQgdGhlIGF0dGFjaGVkCisgICAgICogcHJvcGVydGllcyBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyKSkKKyAgICAgICAgICAgIHN0ciA9IGdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyKSkgeworICAgICAgICAgICAgX25hbWVzID0gRU1QVFk7CisgICAgICAgICAgICBfcHJvcHMgPSBFTVBUWTsKKyAgICAgICAgICAgIHNldChudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3BsaXQgdXAgdGhlIHN0cmluZzsgZWFjaCBlbGVtZW50IG1pZ2h0IGJlIGEgY2xhc3MgbmFtZSwgb3IgYQorICAgICAgICAvLyBjbGFzcyBuYW1lIHdpdGggcHJvcGVydGllcyBzZXR0aW5ncworICAgICAgICBMaXN0IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBwbHVnaW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gaW5QYXJlbiA9IGZhbHNlOworICAgICAgICBjaGFyIGM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgICAgIGluUGFyZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwbHVnaW4uYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgICAgICAgICAgaW5QYXJlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwbHVnaW4uYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluUGFyZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnMuYWRkKHBsdWdpbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwbHVnaW4uYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwbHVnaW4ubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgcGx1Z2lucy5hZGQocGx1Z2luLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIHBhcnNlIGVhY2ggcGx1Z2luIGVsZW1lbnQgaW50byBpdHMgbmFtZSBhbmQgcHJvcGVydGllcworICAgICAgICBMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0IHByb3BzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBTdHJpbmcgY2xzTmFtZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdHIgPSAoU3RyaW5nKSBwbHVnaW5zLmdldChpKTsKKyAgICAgICAgICAgIGNsc05hbWUgPSB1bmFsaWFzKENvbmZpZ3VyYXRpb25zLmdldENsYXNzTmFtZShzdHIpKTsKKyAgICAgICAgICAgIGlmIChjbHNOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuYW1lcy5hZGQoY2xzTmFtZSk7CisgICAgICAgICAgICAgICAgcHJvcHMuYWRkKENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoc3RyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX25hbWVzID0gKFN0cmluZ1tdKSBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7CisgICAgICAgIF9wcm9wcyA9IChTdHJpbmdbXSkgcHJvcHMudG9BcnJheShuZXcgU3RyaW5nW3Byb3BzLnNpemUoKV0pOworICAgICAgICBzZXQobnVsbCwgdHJ1ZSk7CisgICAgICAgIHZhbHVlQ2hhbmdlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBPYmplY3RbXS5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvYmplY3RDaGFuZ2VkKCkgeworICAgICAgICBPYmplY3RbXSB2YWxzID0gKE9iamVjdFtdKSBnZXQoKTsKKyAgICAgICAgaWYgKHZhbHMgPT0gbnVsbCB8fCB2YWxzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgX25hbWVzID0gRU1QVFk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX25hbWVzID0gbmV3IFN0cmluZ1t2YWxzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgX25hbWVzW2ldID0gKHZhbHNbaV0gPT0gbnVsbCkgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogdmFsc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBfcHJvcHMgPSBFTVBUWTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVybmFsU3RyaW5nKCkgeworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxTdHJpbmcoU3RyaW5nIHN0cikgeworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9QbHVnaW5WYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9QbHVnaW5WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDlkZmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1BsdWdpblZhbHVlLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBBIHBsdWdpbiB7QGxpbmsgVmFsdWV9IGNvbnNpc3Rpbmcgb2YgcGx1Z2luIG5hbWUgYW5kIHByb3BlcnRpZXMuCisgKiBQbHVnaW5zIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvcm06PGJyIC8+CisgKiA8Y29kZT4mbHQ7cGx1Z2luLW5hbWUmZ3Q7KCZsdDtwcm9wMSZndDs9Jmx0O3ZhbDEmZ3Q7LCAuLi4pPC9jb2RlPjxiciAvPgorICogQm90aCB0aGUgcGx1Z2luIG5hbWUgYW5kIHByb3AgbGlzdCBhcmUgb3B0aW9uYWwsIHNvIHRoYXQgdGhlIGZvbGxvd2luZworICogZm9ybXMgYXJlIGFsc28gdmFsaWQ6PGJyIC8+CisgKiA8Y29kZT4mbHQ7cGx1Z2luLW5hbWUmZ3Q7PC9jb2RlPjxiciAvPgorICogPGNvZGU+Jmx0O3Byb3AxJmd0Oz0mbHQ7dmFsMSZndDsgLi4uPC9jb2RlPgorICogRGVmYXVsdHMgYW5kIGFsaWFzZXMgb24gcGx1Z2luIHZhbHVlcyBhcHBseSBvbmx5IHRvIHRoZSBwbHVnaW4gbmFtZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgUGx1Z2luVmFsdWUgZXh0ZW5kcyBPYmplY3RWYWx1ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChQbHVnaW5WYWx1ZS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX3NpbmdsZXRvbjsKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3BzID0gbnVsbDsKKworICAgIHB1YmxpYyBQbHVnaW5WYWx1ZShTdHJpbmcgcHJvcCwgYm9vbGVhbiBzaW5nbGV0b24pIHsKKyAgICAgICAgc3VwZXIocHJvcCk7CisgICAgICAgIF9zaW5nbGV0b24gPSBzaW5nbGV0b247CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHZhbHVlIGlzIGEgc2luZ2xldG9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgeworICAgICAgICByZXR1cm4gX3NpbmdsZXRvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyBvbGROYW1lID0gX25hbWU7CisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5lcXVhbHMob2xkTmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChfc2luZ2xldG9uKQorICAgICAgICAgICAgICAgIHNldChudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIF9wcm9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2luIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhTdHJpbmcgcHJvcHMpIHsKKyAgICAgICAgU3RyaW5nIG9sZFByb3BzID0gX3Byb3BzOworICAgICAgICBfcHJvcHMgPSBwcm9wczsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5lcXVhbHMob2xkUHJvcHMsIHByb3BzKSkgeworICAgICAgICAgICAgaWYgKF9zaW5nbGV0b24pCisgICAgICAgICAgICAgICAgc2V0KG51bGwsIHRydWUpOworICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgcGx1Z2luIGFzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGluc3RhbnRpYXRlKENsYXNzIHR5cGUsIENvbmZpZ3VyYXRpb24gY29uZiwgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICBPYmplY3Qgb2JqID0gbmV3SW5zdGFuY2UoX25hbWUsIHR5cGUsIGNvbmYsIGZhdGFsKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbnMuY29uZmlndXJlSW5zdGFuY2Uob2JqLCBjb25mLCBfcHJvcHMsCisgICAgICAgICAgICAoZmF0YWwpID8gZ2V0UHJvcGVydHkoKSA6IG51bGwpOworICAgICAgICBpZiAoX3NpbmdsZXRvbikKKyAgICAgICAgICAgIHNldChvYmosIHRydWUpOworICAgICAgICByZXR1cm4gb2JqOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqLCBib29sZWFuIGRlcml2ZWQpIHsKKyAgICAgICAgaWYgKCFfc2luZ2xldG9uKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgibm90LXNpbmdsZXRvbiIsCisgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHkoKSkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgc3VwZXIuc2V0KG9iaiwgZGVyaXZlZCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9ucy5nZXRQbHVnaW4oYWxpYXMoX25hbWUpLCBfcHJvcHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgICAgIF9uYW1lID0gQ29uZmlndXJhdGlvbnMuZ2V0Q2xhc3NOYW1lKHN0cik7CisgICAgICAgIF9uYW1lID0gdW5hbGlhcyhfbmFtZSk7CisgICAgICAgIF9wcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoc3RyKTsKKyAgICAgICAgaWYgKF9zaW5nbGV0b24pCisgICAgICAgICAgICBzZXQobnVsbCwgdHJ1ZSk7CisgICAgICAgIHZhbHVlQ2hhbmdlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb2JqZWN0Q2hhbmdlZCgpIHsKKyAgICAgICAgT2JqZWN0IG9iaiA9IGdldCgpOworICAgICAgICBfbmFtZSA9IChvYmogPT0gbnVsbCkgPyB1bmFsaWFzKG51bGwpIDogb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICBfcHJvcHMgPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJuYWxTdHJpbmcoKSB7CisgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgY2FsbGVkCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgY2FsbGVkCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1Byb2R1Y3REZXJpdmF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1Byb2R1Y3REZXJpdmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjNjAzMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvUHJvZHVjdERlcml2YXRpb24uamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogSG9va3MgZm9yIGRlcml2aW5nIHByb2R1Y3RzIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LgorICogUGFyc2VzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSBnbG9iYWwsIGRlZmF1bHQgb3IgZXhwbGljdGx5LXNwZWNpZmllZAorICogcmVzb3VyY2VzLiBBbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgaGF2ZSBhIGNoYW5jZSB0byBtdXRhdGUKKyAqIGEge0BsaW5rIENvbmZpZ3VyYXRpb259IGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdXNlci1zcGVjaWZpZWQgCisgKiBjb25maWd1cmF0aW9uIGRhdGEgaXMgbG9hZGVkLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIHByb2R1Y3QgZGVyaXZhdGlvbnMgYXJlCisgKiBldmFsdWF0ZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc3BlY2lmaWNpdHkgb2YgdGhlIGRlcml2YXRpb24gdHlwZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgKiBAc2luY2UgMC40LjEKKyAqLworcHVibGljIGludGVyZmFjZSBQcm9kdWN0RGVyaXZhdGlvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BST0RVQ1QgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GRUFUVVJFID0gMTAwMDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiBkZXJpdmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIHByZWZpeCBmb3IgcHJvcGVydGllcyBvZiB0aGlzIHByb2R1Y3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uUHJlZml4KCk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGlzIGRlcml2YXRpb24gaXMgdmFsaWQuICBUaGlzIGFjdGlvbiBtaWdodCBjb25zaXN0IG9mCisgICAgICogbG9hZGluZyBjbGFzc2VzIGZvciB0aGUgcHJvZHVjdCB0aGlzIGRlcml2YXRpb24gcmVwcmVzZW50cyB0byBiZSBzdXJlCisgICAgICogdGhleSBleGlzdC4gIFRocm93IGFueSB0aHJvd2FibGUgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCBkZXJpdmF0aW9uLgorICAgICAqIEludmFsaWQgZGVyaXZhdGlvbnMgd2lsbCBub3QgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGdsb2JhbHMgaW50byB0aGUgcmV0dXJuZWQgQ29uZmlndXJhdGlvblByb3ZpZGVyLCBvciByZXR1cm4gbnVsbCBpZiAKKyAgICAgKiBubyBnbG9iYWxzIGFyZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWRHbG9iYWxzKENsYXNzTG9hZGVyIGxvYWRlcikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGRlZmF1bHRzIGludG8gdGhlIHJldHVybmVkIENvbmZpZ3VyYXRpb25Qcm92aWRlciwgb3IgcmV0dXJuIG51bGwgaWYgCisgICAgICogbm8gZGVmYXVsdHMgYXJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZERlZmF1bHRzKENsYXNzTG9hZGVyIGxvYWRlcikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiBnaXZlbiByZXNvdXJjZSBpbnRvIHRoZSByZXR1cm5lZCBDb25maWd1cmF0aW9uUHJvdmlkZXIsIAorICAgICAqIG9yIHJldHVybiBudWxsIGlmIGl0IGlzIG5vdCBhIHJlc291cmNlIHRoaXMgcmVjZWl2ZXIgdW5kZXJzdGFuZHMuIAorICAgICAqIFRoZSBnaXZlbiBjbGFzcyBsb2FkZXIgbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5jaG9yIG9wdGlvbmFsIG5hbWVkIGFuY2hvciB3aXRoaW4gYSBtdWx0aXBsZS1jb25maWd1cmF0aW9uCisgICAgICogcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWQoU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgYW5jaG9yLCAKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIExvYWQgZ2l2ZW4gZmlsZSwgb3IgcmV0dXJuIG51bGwgaWYgaXQgaXMgbm90IGEgZmlsZSB0aGlzIHJlY2VpdmVyCisgICAgICogdW5kZXJzdGFuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5jaG9yIG9wdGlvbmFsIG5hbWVkIGFuY2hvciB3aXRoaW4gYSBtdWx0aXBsZS1jb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWQoRmlsZSBmaWxlLCBTdHJpbmcgYW5jaG9yKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgaW5zdGFuY2Ugd2l0aCBhIGNhbGxiYWNrIHRvIG11dGF0ZSB0aGUgaW5pdGlhbCBwcm9wZXJ0aWVzCisgICAgICogb2YgdGhlIHtAbGluayBDb25maWd1cmF0aW9uUHJvdmlkZXJ9LiBUaGlzIGlzIHByaW1hcmlseSB0byBhbHRlciBvcgorICAgICAqIGFkZCBwcm9wZXJ0aWVzIHRoYXQgZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBjb25maWd1cmF0aW9uIGlzIGNvbnN0cnVjdGVkLAorICAgICAqIGFuZCB0aGVyZWZvcmUgaXMgdHlwaWNhbGx5IHVzZWQgYXQgcnVudGltZSBvbmx5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBDb25maWd1cmF0aW9uUHJvdmlkZXIgaGFzIGJlZW4gbXV0YXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVDb25maWd1cmF0aW9uQ29uc3RydWN0KENvbmZpZ3VyYXRpb25Qcm92aWRlciBjcCk7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgb3Bwb3J0dW5pdHkgdG8gbXV0YXRlCisgICAgICogPGNvZGU+Y29uZjwvY29kZT4gYmVmb3JlIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBDb25maWd1cmF0aW9uIGhhcyBiZWVuIG11dGF0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlQ29uZmlndXJhdGlvbkxvYWQoQ29uZmlndXJhdGlvbiBjb25mKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBhZnRlciB0aGUgc3BlY2lmaWNhdGlvbiBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ2l2ZW4gQ29uZmlndXJhdGlvbiBoYXMgYmVlbiBtdXRhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFmdGVyU3BlY2lmaWNhdGlvblNldChDb25maWd1cmF0aW9uIGNvbmYpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCBiZWZvcmUgdGhlIGdpdmVuIENvbmZpZ3VyYXRpb24gaXMgY2xvc2VkLgorICAgICAqIAorICAgICAqIEBzaW5jZSAwLjkuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb25DbG9zZShDb25maWd1cmF0aW9uIGNvbmYpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9Qcm9kdWN0RGVyaXZhdGlvbnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvUHJvZHVjdERlcml2YXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxYWU1NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvUHJvZHVjdERlcml2YXRpb25zLmphdmEKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlNlcnZpY2VzOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgcnVubmluZyBwcm9kdWN0IGRlcml2YXRpb25zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0RGVyaXZhdGlvbnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUHJvZHVjdERlcml2YXRpb25zLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb2R1Y3REZXJpdmF0aW9uW10gX2Rlcml2YXRpb25zOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIF9kZXJpdmF0aW9uTmFtZXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyb3dhYmxlW10gX2Rlcml2YXRpb25FcnJvcnM7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX3ByZWZpeGVzOworICAgIHN0YXRpYyB7CisgICAgICAgIENsYXNzTG9hZGVyIGwgPSBQcm9kdWN0RGVyaXZhdGlvbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBfZGVyaXZhdGlvbk5hbWVzID0gU2VydmljZXMuZ2V0SW1wbGVtZW50b3JzKFByb2R1Y3REZXJpdmF0aW9uLmNsYXNzLCBsKTsKKyAgICAgICAgX2Rlcml2YXRpb25FcnJvcnMgPSBuZXcgVGhyb3dhYmxlW19kZXJpdmF0aW9uTmFtZXMubGVuZ3RoXTsKKyAgICAgICAgTGlzdCBkZXJpdmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoX2Rlcml2YXRpb25OYW1lcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9kZXJpdmF0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJvZHVjdERlcml2YXRpb24gZCA9IChQcm9kdWN0RGVyaXZhdGlvbikgQ2xhc3MuCisgICAgICAgICAgICAgICAgICAgIGZvck5hbWUoX2Rlcml2YXRpb25OYW1lc1tpXSwgdHJ1ZSwgbCkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBkLnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgZGVyaXZhdGlvbnMuYWRkKGQpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBfZGVyaXZhdGlvbkVycm9yc1tpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtdXN0IGJlIGF0IGxlYXN0IG9uZSBwcm9kdWN0IGRlcml2YXRpb24gdG8gZGVmaW5lIG1ldGFkYXRhIGZhY3RvcmllcywKKyAgICAgICAgLy8gZXRjLiAKKyAgICAgICAgaWYgKGRlcml2YXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICgibm8tcHJvZHVjdC1kZXJpdmF0aW9ucyIsIFByb2R1Y3REZXJpdmF0aW9uLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBkZXJpdmF0aW9uRXJyb3JzVG9TdHJpbmcoKSkuZ2V0TWVzc2FnZSgpLCAKKyAgICAgICAgICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMuY2xhc3MuZ2V0TmFtZSgpLCJkZXJpdmF0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgc29tZSBkZXJpdmF0aW9ucyB3ZXJlbid0IGluc3RhbnRpYWJsZSwgd2FybgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9kZXJpdmF0aW9uRXJyb3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX2Rlcml2YXRpb25FcnJvcnNbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihfbG9jLmdldCgiYmFkLXByb2R1Y3QtZGVyaXZhdGlvbnMiLAorICAgICAgICAgICAgICAgIFByb2R1Y3REZXJpdmF0aW9ucy5jbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChkZXJpdmF0aW9ucywgbmV3IFByb2R1Y3REZXJpdmF0aW9uQ29tcGFyYXRvcigpKTsKKyAgICAgICAgX2Rlcml2YXRpb25zID0gKFByb2R1Y3REZXJpdmF0aW9uW10pIGRlcml2YXRpb25zLnRvQXJyYXkKKyAgICAgICAgICAgIChuZXcgUHJvZHVjdERlcml2YXRpb25bZGVyaXZhdGlvbnMuc2l6ZSgpXSk7CisKKyAgICAgICAgTGlzdCBwcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2Rlcml2YXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX2Rlcml2YXRpb25zW2ldLmdldENvbmZpZ3VyYXRpb25QcmVmaXgoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgISJvcGVuanBhIi5lcXVhbHMoX2Rlcml2YXRpb25zW2ldLmdldENvbmZpZ3VyYXRpb25QcmVmaXgoKSkpCisgICAgICAgICAgICAgICAgcHJlZml4ZXMuYWRkKF9kZXJpdmF0aW9uc1tpXS5nZXRDb25maWd1cmF0aW9uUHJlZml4KCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHByZWZpeEFycmF5ID0gbmV3IFN0cmluZ1sxICsgcHJlZml4ZXMuc2l6ZSgpXTsKKyAgICAgICAgcHJlZml4QXJyYXlbMF0gPSAib3BlbmpwYSI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZml4ZXMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBwcmVmaXhBcnJheVtpICsgMV0gPSAoU3RyaW5nKSBwcmVmaXhlcy5nZXQoaSk7CisgICAgICAgIHNldENvbmZpZ3VyYXRpb25QcmVmaXhlcyhwcmVmaXhBcnJheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB0aGUgcHJvZHVjdCBkZXJpdmF0aW9ucyByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGNsYXNzbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9kdWN0RGVyaXZhdGlvbltdIGdldFByb2R1Y3REZXJpdmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIF9kZXJpdmF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlY29nbml6ZWQgcHJlZml4ZXMgZm9yIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25QcmVmaXhlcygpIHsKKyAgICAgICAgcmV0dXJuIF9wcmVmaXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gcHJlZml4IGFycmF5LiBUaGlzIGlzIHBhY2thZ2UtdmlzaWJsZSBmb3IgCisgICAgICogdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMC45LjcKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0aW9uUHJlZml4ZXMoU3RyaW5nW10gcHJlZml4ZXMpIHsKKyAgICAgICAgX3ByZWZpeGVzID0gcHJlZml4ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZnVsbCBrZXkgbmFtZSBmb3IgPGNvZGU+a2V5PC9jb2RlPiwgZ2l2ZW4gdGhlIHJlZ2lzdGVyZWQKKyAgICAgKiBwcmVmaXhlcyBhbmQgdGhlIGVudHJpZXMgaW4gPGNvZGU+bWFwPC9jb2RlPi4gVGhpcyBtZXRob2QKKyAgICAgKiBjb21wdXRlcyB0aGUgYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBwcmVmaXggdG8gdXNlIGJ5IGxvb2tpbmcgCisgICAgICogdGhyb3VnaCA8Y29kZT5tYXA8L2NvZGU+IGZvciBhIGtleSBzdGFydGluZyB3aXRoIGFueSBvZiB0aGUga25vd24KKyAgICAgKiBjb25maWd1cmF0aW9uIHByZWZpeGVzIGFuZCBlbmRpbmcgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IGFuZCwgaWYgYQorICAgICAqIHZhbHVlIGlzIGZvdW5kLCB1c2luZyB0aGUgcHJlZml4IG9mIHRoYXQga2V5LiBPdGhlcndpc2UsIGl0IHVzZXMKKyAgICAgKiB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBwcmVmaXguIAorICAgICAqIAorICAgICAqIEBzaW5jZSAwLjkuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25LZXkoU3RyaW5nIHBhcnRpYWxLZXksIE1hcCBtYXApIHsKKyAgICAgICAgU3RyaW5nIGZpcnN0S2V5ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IG1hcCAhPSBudWxsICYmIGkgPCBfcHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBmdWxsS2V5ID0gX3ByZWZpeGVzW2ldICsgIi4iICsgcGFydGlhbEtleTsKKyAgICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoZnVsbEtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RLZXkgPT0gbnVsbCkgCisgICAgICAgICAgICAgICAgICAgIGZpcnN0S2V5ID0gZnVsbEtleTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSBmb3VuZCBhIHByb3BlcnR5IHdpdGggYSBwcmV2aW91cyAKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlZml4LCB0aGVuIHRoaXMgaXMgYSBjb2xsaXNpb24uCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiZHVwLXdpdGgtZGlmZmVyZW50LXByZWZpeGVzIiwgZmlyc3RLZXksIGZ1bGxLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmaXJzdEtleSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXhlc1swXSArICIuIiArIHBhcnRpYWxLZXk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmaXJzdEtleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBseSB7QGxpbmsgUHJvZHVjdERlcml2YXRpb24jYmVmb3JlQ29uZmlndXJhdGlvbkNvbnN0cnVjdH0gY2FsbGJhY2tzCisgICAgICogdG8gdGhlIHRoZSBnaXZlbiBpbnN0YW5jZS4gRXhjZXB0aW9ucyBhcmUgc3dhbGxvd2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDb25maWd1cmF0aW9uQ29uc3RydWN0KENvbmZpZ3VyYXRpb25Qcm92aWRlciBjcCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9kZXJpdmF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfZGVyaXZhdGlvbnNbaV0uYmVmb3JlQ29uZmlndXJhdGlvbkNvbnN0cnVjdChjcCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGNhbid0IGxvZzsgbm8gY29uZmlndXJhdGlvbiB5ZXQKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkge0BsaW5rIFByb2R1Y3REZXJpdmF0aW9uI2JlZm9yZUNvbmZpZ3VyYXRpb25Mb2FkfSBjYWxsYmFja3MKKyAgICAgKiB0byB0aGUgdGhlIGdpdmVuIGluc3RhbmNlLiBFeGNlcHRpb25zIGFyZSBzd2FsbG93ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb25Mb2FkKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9kZXJpdmF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfZGVyaXZhdGlvbnNbaV0uYmVmb3JlQ29uZmlndXJhdGlvbkxvYWQoY29uZik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbm90IGNvbmZpZ3VyZWQgeWV0CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGx5IHtAbGluayBQcm9kdWN0RGVyaXZhdGlvbiNhZnRlclNwZWNpZmljYXRpb25TZXR9IGNhbGxiYWNrcworICAgICAqIHRvIHRoZSB0aGUgZ2l2ZW4gaW5zdGFuY2UuIEV4Y2VwdGlvbnMgYXJlIHN3YWxsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJTcGVjaWZpY2F0aW9uU2V0KENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9kZXJpdmF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfZGVyaXZhdGlvbnNbaV0uYWZ0ZXJTcGVjaWZpY2F0aW9uU2V0KGNvbmYpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIG5vdCBjb25maWd1cmVkIHlldAorICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgYSBDb25maWd1cmF0aW9uJ3MgY2xvc2UoKSBtZXRob2QuIAorICAgICAqIEV4Y2VwdGlvbnMgYXJlIHN3YWxsb3dlZC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMC45LjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xvc2UoQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2Rlcml2YXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9kZXJpdmF0aW9uc1tpXS5iZWZvcmVDb25maWd1cmF0aW9uQ2xvc2UoY29uZik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNvbmYuZ2V0Q29uZmlndXJhdGlvbkxvZygpLndhcm4oX2xvYy5nZXQoImJlZm9yZS1jbG9zZS1leCIpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGdpdmVuIGdpdmVuIHJlc291cmNlLCBvciByZXR1cm4gZmFsc2UgaWYgaXQgaXMgbm90IGEgcmVzb3VyY2UKKyAgICAgKiB0aGlzIHByb3ZpZGVyIHVuZGVyc3RhbmRzLiBUaGUgZ2l2ZW4gY2xhc3MgbG9hZGVyIG1heSBiZSBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGFuY2hvciBvcHRpb25hbCBuYW1lZCBhbmNob3Igd2l0aGluIGEgbXVsdGlwbGUtY29uZmlndXJhdGlvbgorICAgICAqIHJlc291cmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZChTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBhbmNob3IsIAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocmVzb3VyY2UpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIENvbmZpZ3VyYXRpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJzID0gbnVsbDsKKyAgICAgICAgLy8gbW9zdCBzcGVjaWZpYyB0byBsZWFzdAorICAgICAgICBmb3IgKGludCBpID0gX2Rlcml2YXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gX2Rlcml2YXRpb25zW2ldLmxvYWQocmVzb3VyY2UsIGFuY2hvciwgbG9hZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBlcnJzID0gKGVycnMgPT0gbnVsbCkgPyBuZXcgU3RyaW5nQnVmZmVyKCkgOiBlcnJzLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICBlcnJzLmFwcGVuZChfZGVyaXZhdGlvbnNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXBvcnRFcnJvcnMoZXJycywgcmVzb3VyY2UpOworICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKHJlc291cmNlLCAKKyAgICAgICAgICAgIFByb2R1Y3REZXJpdmF0aW9ucy5jbGFzcy5nZXROYW1lKCksIHJlc291cmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGdpdmVuIGZpbGUsIG9yIHJldHVybiBmYWxzZSBpZiBpdCBpcyBub3QgYSBmaWxlIHRoaXMgcHJvdmlkZXIKKyAgICAgKiB1bmRlcnN0YW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbmNob3Igb3B0aW9uYWwgbmFtZWQgYW5jaG9yIHdpdGhpbiBhIG11bHRpcGxlLWNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWQoRmlsZSBmaWxlLCBTdHJpbmcgYW5jaG9yLCAKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQ29uZmlndXJhdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVycnMgPSBudWxsOworICAgICAgICAvLyBtb3N0IHNwZWNpZmljIHRvIGxlYXN0CisgICAgICAgIGZvciAoaW50IGkgPSBfZGVyaXZhdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBfZGVyaXZhdGlvbnNbaV0ubG9hZChmaWxlLCBhbmNob3IpOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGVycnMgPSAoZXJycyA9PSBudWxsKSA/IG5ldyBTdHJpbmdCdWZmZXIoKSA6IGVycnMuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgIGVycnMuYXBwZW5kKF9kZXJpdmF0aW9uc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6IiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcG9ydEVycm9ycyhlcnJzLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihmaWxlLmdldEFic29sdXRlUGF0aCgpLCAKKyAgICAgICAgICAgIFByb2R1Y3REZXJpdmF0aW9ucy5jbGFzcy5nZXROYW1lKCksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKyAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIHtAbGluayBDb25maWd1cmF0aW9uUHJvdmlkZXJ9IHRoYXQgaGFzIHBhcnNlZCBzeXN0ZW0gZGVmYXVsdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZERlZmF1bHRzKENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICByZXR1cm4gbG9hZChsb2FkZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB7QGxpbmsgQ29uZmlndXJhdGlvblByb3ZpZGVyfSB0aGF0IGhhcyBwYXJzZWQgc3lzdGVtIGdsb2JhbHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZEdsb2JhbHMoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHJldHVybiBsb2FkKGxvYWRlciwgdHJ1ZSk7CisgICAgfQorICAgICAgICAgICAgCisgICAgLyoqCisgICAgICogTG9hZCBhIGJ1aWx0LWluIHJlc291cmNlIGxvY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb25Qcm92aWRlciBsb2FkKENsYXNzTG9hZGVyIGxvYWRlciwgCisgICAgICAgYm9vbGVhbiBnbG9iYWxzKSB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIAorICAgICAgICBDb25maWd1cmF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgZXJycyA9IG51bGw7CisgICAgICAgIFN0cmluZyB0eXBlID0gKGdsb2JhbHMpID8gImdsb2JhbHMiIDogImRlZmF1bHRzIjsKKyAgICAgICAgLy8gbW9zdCBzcGVjaWZpYyB0byBsZWFzdAorICAgICAgICBmb3IgKGludCBpID0gX2Rlcml2YXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gKGdsb2JhbHMpID8gX2Rlcml2YXRpb25zW2ldLmxvYWRHbG9iYWxzKGxvYWRlcikgCisgICAgICAgICAgICAgICAgICAgIDogX2Rlcml2YXRpb25zW2ldLmxvYWREZWZhdWx0cyhsb2FkZXIpOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZXJycyA9IChlcnJzID09IG51bGwpID8gbmV3IFN0cmluZ0J1ZmZlcigpIDogZXJycy5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgZXJycy5hcHBlbmQoX2Rlcml2YXRpb25zW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVwb3J0RXJyb3JzKGVycnMsIHR5cGUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogVGhyb3duIHByb3BlciBleGNlcHRpb24gZm9yIGdpdmVuIGVycm9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydEVycm9ycyhTdHJpbmdCdWZmZXIgZXJycywgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIGlmIChlcnJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZXJycy50b1N0cmluZygpLCAKKyAgICAgICAgICAgIFByb2R1Y3REZXJpdmF0aW9ucy5jbGFzcy5nZXROYW1lKCksIHJlc291cmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHtAbGluayBQcm9kdWN0RGVyaXZhdGlvbn1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2R1Y3REZXJpdmF0aW9uQ29tcGFyYXRvcgorICAgICAgICBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgaW50IHR5cGUxID0gKChQcm9kdWN0RGVyaXZhdGlvbikgbzEpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGludCB0eXBlMiA9ICgoUHJvZHVjdERlcml2YXRpb24pIG8yKS5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAodHlwZTEgIT0gdHlwZTIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUxIC0gdHlwZTI7CisKKyAgICAgICAgICAgIC8vIGFyYml0cmFyeSBidXQgY29uc2lzdGVudCBvcmRlcgorICAgICAgICAgICAgcmV0dXJuIG8xLmdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXRDbGFzcygpLgorICAgICAgICAgICAgICAgIGdldE5hbWUoKSk7CisJCX0KKwl9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgcHJvZHVjdCBkZXJpdmF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGRlcml2YXRpb25FcnJvcnNUb1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBtZXNzYWdlIGFib3V0IHRoZSBzdGF0dXMgb2YgZWFjaCBwcm9kdWN0IGRlcml2YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlcml2YXRpb25FcnJvcnNUb1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiUHJvZHVjdERlcml2YXRpb25zOiAiKS5hcHBlbmQoX2Rlcml2YXRpb25OYW1lcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9kZXJpdmF0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIikuYXBwZW5kKGkgKyAxKS5hcHBlbmQoIi4gIikuCisgICAgICAgICAgICAgICAgYXBwZW5kKF9kZXJpdmF0aW9uTmFtZXNbaV0pLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgIGlmIChfZGVyaXZhdGlvbkVycm9yc1tpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIk9LIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChfZGVyaXZhdGlvbkVycm9yc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1N0cmluZ0xpc3RWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9TdHJpbmdMaXN0VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI1MWJiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9TdHJpbmdMaXN0VmFsdWUuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuUGFyc2VFeGNlcHRpb247CisKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHN0cmluZyB2YWx1ZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0xpc3RWYWx1ZSBleHRlbmRzIFZhbHVlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFkgPSBuZXcgU3RyaW5nWzBdOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBzX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChTdHJpbmdMaXN0VmFsdWUuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBfdmFsdWVzID0gRU1QVFk7CisKKyAgICBwdWJsaWMgU3RyaW5nTGlzdFZhbHVlKFN0cmluZyBwcm9wKSB7CisgICAgICAgIHN1cGVyKHByb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nW10gdmFsdWVzKSB7CisgICAgICAgIF92YWx1ZXMgPSAodmFsdWVzID09IG51bGwpID8gRU1QVFkgOiB2YWx1ZXM7CisgICAgICAgIHZhbHVlQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0KCkgeworICAgICAgICByZXR1cm4gX3ZhbHVlczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nW10uY2xhc3M7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFVuYWxpYXMgdGhlIHZhbHVlIGxpc3QuICBUaGlzIG1ldGhvZCBkZWZlcnMgdG8gc3VwZXIudW5hbGlhcygpCisgICAgICogVU5MRVNTIHRoZSBzdHJpbmcgcGFzc2VkIGlzIGEgbGlzdCBvZiB2YWx1ZXMgZm9yIGEgcHJvcGVydHkgdGhhdAorICAgICAqIGhhcyBhbGlhc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdW5hbGlhcyhTdHJpbmcgc3RyKSB7CisgICAgICAgIAorICAgICAgICAvLyBkZWZlciB0byBzdXBlci51bmFsaWFzCisgICAgICAgIFN0cmluZ1tdIGFsaWFzZXMgPSBnZXRBbGlhc2VzKCk7CisgICAgICAgIGlmIChhbGlhc2VzLmxlbmd0aCA8PSAwIHx8IHN0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnVuYWxpYXMoc3RyKTsKKyAgICAgICAgc3RyID0gc3RyLnRyaW0oKTsKKyAgICAgICAgaWYgKHN0ci5sZW5ndGgoKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnVuYWxpYXMoc3RyKTsKKyAgICAgICAgCisgICAgICAgIC8vIHNuYWcgdGhpcyBjYXNlIGVhcmx5IGFzIGl0IG9ubHkgY2F1c2VzIHByb2JsZW1zCisgICAgICAgIGlmIChzdHIuZXF1YWxzKCIsIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oc19sb2MuZ2V0KCJpbnZhbGlkLWxpc3QtY29uZmlnIiwKKyAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eSgpLCBzdHIsIGdldEFsaWFzTGlzdCgpKSk7CisgICAgICAgIAorICAgICAgICAvLyB1bmFsaWFzIHRoZSBsaXN0IGFuZCBjb25jYXRlbmF0ZSB0aGUgbGlzdCBvZgorICAgICAgICAvLyBjYW5vbmljYWwgdmFsdWVzLiAgQWxzbywgY2F0Y2ggYW55IGJhZCBhbGlhc2VzLgorICAgICAgICBib29sZWFuIGZvdW5kOworICAgICAgICBTdHJpbmcgaVN0cmluZzsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJldHYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ1tdIHZhbHMgPSBzdHIuc3BsaXQoIiwiLCAwKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaVN0cmluZyA9IHZhbHNbaV0gPSB2YWxzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICByZXR2LmFwcGVuZCgnLCcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGFsaWFzZXMubGVuZ3RoOyB4ICs9IDIpCisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhpU3RyaW5nLCBhbGlhc2VzW3hdKQorICAgICAgICAgICAgICAgICAgICB8fCBTdHJpbmdVdGlscy5lcXVhbHMoaVN0cmluZywgYWxpYXNlc1t4ICsgMV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHYuYXBwZW5kKGFsaWFzZXNbeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHRoZSBhbGlhcyBsaXN0IGlzIG5vdCBjb21wcmVoZW5zaXZlLCBhZGQgYW55IHVua25vd24KKyAgICAgICAgICAgIC8vIHZhbHVlcyBiYWNrIG9udG8gdGhlIGxpc3QKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNBbGlhc0xpc3RDb21wcmVoZW5zaXZlKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihzX2xvYy5nZXQoImludmFsaWQtbGlzdC1jb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHkoKSwgc3RyLCBnZXRBbGlhc0xpc3QoKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0di5hcHBlbmQoaVN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVybmFsU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5ncy5qb2luKF92YWx1ZXMsICIsICIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsU3RyaW5nKFN0cmluZyB2YWwpIHsKKyAgICAgICAgU3RyaW5nW10gdmFscyA9IFN0cmluZ3Muc3BsaXQodmFsLCAiLCIsIDApOworICAgICAgICBpZiAodmFscyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdmFsc1tpXSA9IHZhbHNbaV0udHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgc2V0KHZhbHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgc2V0KChTdHJpbmdbXSkgb2JqKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIExpc3QgZ2V0QWxpYXNMaXN0KCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRBbGlhc2VzKCkpOworICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9TdHJpbmdWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9TdHJpbmdWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmIxMTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1N0cmluZ1ZhbHVlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKKworLyoqCisgKiBBIHN0cmluZyB7QGxpbmsgVmFsdWV9LgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZSBleHRlbmRzIFZhbHVlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFN0cmluZ1ZhbHVlKFN0cmluZyBwcm9wKSB7CisgICAgICAgIHN1cGVyKHByb3ApOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmVxdWFscyh2YWx1ZSwgb2xkVmFsdWUpKQorICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcm5hbFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsU3RyaW5nKFN0cmluZyB2YWwpIHsKKyAgICAgICAgc2V0KHZhbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBzZXQoKFN0cmluZykgb2JqKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzhkZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIEEgY29uZmlndXJhdGlvbiB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsdWUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQUxJQVNFUyA9IG5ldyBTdHJpbmdbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIHNfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoVmFsdWUuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbG9hZEtleSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGFsaWFzZXMgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGdldHRlciA9IG51bGw7CisgICAgcHJpdmF0ZSBWYWx1ZUxpc3RlbmVyIGxpc3RlbiA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGFsaWFzTGlzdENvbXByZWhlbnNpdmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIENsYXNzIHNjb3BlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFZhbHVlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRQcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZShTdHJpbmcgcHJvcCkgeworICAgICAgICBzZXRQcm9wZXJ0eShwcm9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHNldHRpbmcgb3IKKyAgICAgKiBnZXR0aW5nIHRoaXMgdmFsdWUgaW4gYSB7QGxpbmsgTWFwfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHNldHRpbmcgb3IKKyAgICAgKiBnZXR0aW5nIHRoaXMgdmFsdWUgaW4gYSB7QGxpbmsgTWFwfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcCkgeworICAgICAgICB0aGlzLnByb3AgPSBwcm9wOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhpcyB2YWx1ZSB3YXMgbG9hZGVkLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9hZEtleSgpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRLZXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGtleSB1bmRlciB3aGljaCB0aGlzIHZhbHVlIHdhcyBsb2FkZWQsIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZEtleShTdHJpbmcgbG9hZEtleSkgeworICAgICAgICB0aGlzLmxvYWRLZXkgPSBsb2FkS2V5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsaWFzZXMgZm9yIHRoZSB2YWx1ZSBpbiB0aGUgZm9ybSBrZXkxLCB2YWx1ZTEsIGtleTIsIHZhbHVlMiwgLi4uCisgICAgICogQWxsIGFsaWFzIHZhbHVlcyBtdXN0IGJlIGluIHN0cmluZyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGlhc2VzKCkgeworICAgICAgICByZXR1cm4gKGFsaWFzZXMgPT0gbnVsbCkgPyBFTVBUWV9BTElBU0VTIDogYWxpYXNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGlhc2VzIGZvciB0aGUgdmFsdWUgaW4gdGhlIGZvcm0ga2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTIsIC4uLgorICAgICAqIEFsbCBhbGlhcyB2YWx1ZXMgbXVzdCBiZSBpbiBzdHJpbmcgZm9ybS4KKyAgICAgKiA8cD4KKyAgICAgKiBUbyBhdm9pZCBwb3RlbnRpYWwgc2lkZS1lZmZlY3RzLCB0aGlzIG1ldGhvZCBjb3BpZXMgdGhlIGFycmF5IHBhc3NlZCBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhc2VzKFN0cmluZ1tdIGFsaWFzZXMpIHsKKyAgICAgICAgU3RyaW5nIFtdIGFTdHJpbmdzID0gbmV3IFN0cmluZ1thbGlhc2VzLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYWxpYXNlcywgMCwgYVN0cmluZ3MsIDAsIGFTdHJpbmdzLmxlbmd0aCk7CisgICAgICAgIHRoaXMuYWxpYXNlcyA9IGFTdHJpbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIGFuIGV4aXN0aW5nIGFsaWFzLCBvciBhZGRzIHRoZSBnaXZlbiBhbGlhcyB0byB0aGUgZnJvbnQgb2YgdGhlCisgICAgICogYWxpYXMgbGlzdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBBbGwgYWxpYXMgdmFsdWVzIG11c3QgYmUgaW4KKyAgICAgKiBzdHJpbmcgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYWxpYXNlcyA9IHNldEFsaWFzKGtleSwgdmFsdWUsIGFsaWFzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBhbGlhcyBpbnRvIGEgY3VycmVudCBhbGlhcyBsaXN0LCByZXR1cm5pbmcgdGhlIG5ldyBsaXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzZXRBbGlhcyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIFN0cmluZ1tdIGFsaWFzZXMpIHsKKyAgICAgICAgaWYgKGFsaWFzZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGFsaWFzZXMgPSBFTVBUWV9BTElBU0VTOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKGFsaWFzZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgYWxpYXNlc1tpICsgMV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXNlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBhcyBuZXcgYWxpYXMKKyAgICAgICAgU3RyaW5nW10gbmV3QWxpYXNlcyA9IG5ldyBTdHJpbmdbYWxpYXNlcy5sZW5ndGggKyAyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhbGlhc2VzLCAwLCBuZXdBbGlhc2VzLCAyLCBhbGlhc2VzLmxlbmd0aCk7CisgICAgICAgIG5ld0FsaWFzZXNbMF0gPSBrZXk7CisgICAgICAgIG5ld0FsaWFzZXNbMV0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIG5ld0FsaWFzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGFsaWFzIGxpc3QgZGVmaW5lcyBhbGwgcG9zc2libGUgc2V0dGluZ3MgZm9yIHRoaXMKKyAgICAgKiB2YWx1ZS4gSWYgc28sIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYXR0ZW1wdGluZyB0byBpbnZva2UKKyAgICAgKiBhbnkgbWV0aG9kIG9uIHRoaXMgdmFsdWUgd2l0aCBhbiB1bmtub3duIG9wdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsaWFzTGlzdENvbXByZWhlbnNpdmUoKSB7CisgICAgICAgIHJldHVybiBhbGlhc0xpc3RDb21wcmVoZW5zaXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBhbGlhcyBsaXN0IGRlZmluZXMgYWxsIHBvc3NpYmxlIHNldHRpbmdzIGZvciB0aGlzCisgICAgICogdmFsdWUuIElmIHNvLCBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGF0dGVtcHRpbmcgdG8gaW52b2tlCisgICAgICogYW55IG1ldGhvZCBvbiB0aGlzIHZhbHVlIHdpdGggYW4gdW5rbm93biBvcHRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxpYXNMaXN0Q29tcHJlaGVuc2l2ZShib29sZWFuIGFsaWFzTGlzdElzQ29tcHJlaGVuc2l2ZSkgeworICAgICAgICB0aGlzLmFsaWFzTGlzdENvbXByZWhlbnNpdmUgPSBhbGlhc0xpc3RJc0NvbXByZWhlbnNpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxpYXMgdGhlIGdpdmVuIHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhbGlhcyhTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBhbGlhcyhzdHIsIGFsaWFzZXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGlhcyB0aGUgZ2l2ZW4gc2V0dGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzKFN0cmluZyBzdHIsIFN0cmluZ1tdIGFsaWFzZXMsIGJvb2xlYW4gbnVsbE5vdEZvdW5kKSB7CisgICAgICAgIGlmIChzdHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHN0ciA9IHN0ci50cmltKCk7CisgICAgICAgIGlmIChhbGlhc2VzID09IG51bGwgfHwgYWxpYXNlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbE5vdEZvdW5kKSA/IG51bGwgOiBzdHI7CisKKyAgICAgICAgYm9vbGVhbiBlbXB0eSA9IHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA9PSAwOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZXF1YWxzKHN0ciwgYWxpYXNlc1tpXSkKKyAgICAgICAgICAgICAgICB8fCAoZW1wdHkgJiYgYWxpYXNlc1tpXSA9PSBudWxsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXNlc1tpIC0gMV07CisgICAgICAgIHJldHVybiAobnVsbE5vdEZvdW5kKSA/IG51bGwgOiBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5hbGlhcyB0aGUgZ2l2ZW4gc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHVuYWxpYXMoU3RyaW5nIHN0cikgeworICAgICAgICByZXR1cm4gdW5hbGlhcyhzdHIsIGFsaWFzZXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmFsaWFzIHRoZSBnaXZlbiBzZXR0aW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdW5hbGlhcyhTdHJpbmcgc3RyLCBTdHJpbmdbXSBhbGlhc2VzLAorICAgICAgICBib29sZWFuIG51bGxOb3RGb3VuZCkgeworICAgICAgICBpZiAoc3RyICE9IG51bGwpCisgICAgICAgICAgICBzdHIgPSBzdHIudHJpbSgpOworCisgICAgICAgIGJvb2xlYW4gZW1wdHkgPSBzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPT0gMDsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsIHx8IChlbXB0eSAmJiBkZWYgIT0gbnVsbCkpCisgICAgICAgICAgICBzdHIgPSBkZWY7CisgICAgICAgIGlmIChhbGlhc2VzICE9IG51bGwpCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhzdHIsIGFsaWFzZXNbaV0pCisgICAgICAgICAgICAgICAgICAgIHx8IFN0cmluZ1V0aWxzLmVxdWFscyhzdHIsIGFsaWFzZXNbaSArIDFdKQorICAgICAgICAgICAgICAgICAgICB8fCAoZW1wdHkgJiYgYWxpYXNlc1tpXSA9PSBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzZXNbaSArIDFdOworCisgICAgICAgIGlmIChpc0FsaWFzTGlzdENvbXByZWhlbnNpdmUoKSAmJiBhbGlhc2VzICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oc19sb2MuZ2V0KCJpbnZhbGlkLWVudW1lcmF0ZWQtY29uZmlnIiwKKyAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eSgpLCBzdHIsIEFycmF5cy5hc0xpc3QoYWxpYXNlcykpKTsKKworICAgICAgICByZXR1cm4gKG51bGxOb3RGb3VuZCkgPyBudWxsIDogc3RyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0KCkgeworICAgICAgICByZXR1cm4gZGVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJvcGVydCBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBkZWYpIHsKKyAgICAgICAgdGhpcy5kZWYgPSBkZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGdldHRlciBtZXRob2QgZm9yIHRoZSBpbnN0YW50aWF0ZWQgdmFsdWUgb2YgdGhpcworICAgICAqIHByb3BlcnR5KGFzIG9wcG9zZWQgdG8gdGhlIHN0cmluZyB2YWx1ZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbnRpYXRpbmdHZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGdldHRlciBtZXRob2QgZm9yIHRoZSBpbnN0YW50aWF0ZWQgdmFsdWUgb2YgdGhpcworICAgICAqIHByb3BlcnR5KGFzIG9wcG9zZWQgdG8gdGhlIHN0cmluZyB2YWx1ZSkuIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGgKKyAgICAgKiA8Y29kZT50aGlzLjwvY29kZT4sIHRoZW4gdGhlIGdldHRlciB3aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgdmFsdWUKKyAgICAgKiBpbnN0YW5jZSBpdHNlbGYuIE90aGVyd2lzZSwgdGhlIGdldHRlciB3aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpbmdHZXR0ZXIoU3RyaW5nIGdldHRlcikgeworICAgICAgICB0aGlzLmdldHRlciA9IGdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIGRlZmluaW5nIHRoZSBzY29wZSBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIGRlZmluZWQuIFRoaXMgd2lsbAorICAgICAqIGJlIHVzZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gZnJhbWV3b3JrIHRvIGxvb2sgdXAgbWV0YWRhdGEgYWJvdXQKKyAgICAgKiB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyBkZWZpbmluZyB0aGUgc2NvcGUgaW4gd2hpY2ggdGhpcyB2YWx1ZSBpcyBkZWZpbmVkLiBUaGlzIHdpbGwKKyAgICAgKiBiZSB1c2VkIGJ5IHRoZSBjb25maWd1cmF0aW9uIGZyYW1ld29yayB0byBsb29rIHVwIG1ldGFkYXRhIGFib3V0CisgICAgICogdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKENsYXNzIGNscykgeworICAgICAgICBzY29wZSA9IGNsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoaXMgdmFsdWUuIElmIHRoZSBjdXJyZW50IHZhbHVlIGhhcworICAgICAqIGEgc2hvcnQgYWxpYXMga2V5LCB0aGUgYWxpYXMga2V5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gYWxpYXMoZ2V0SW50ZXJuYWxTdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIG51bGwgb3IKKyAgICAgKiBlbXB0eSBhbmQgYSBkZWZhdWx0IGlzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIHVzZWQuIElmIHRoZSBnaXZlbgorICAgICAqIHN0cmluZyhvciBkZWZhdWx0KSBpcyBhbiBhbGlhcyBrZXksIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW50ZXJuYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHZhbCkgeworICAgICAgICBTdHJpbmcgc3RyID0gdW5hbGlhcyh2YWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0SW50ZXJuYWxTdHJpbmcoc3RyKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24ocHJvcCArICI6ICIgKyB2YWwsIHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHZhbHVlIGFzIGFuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICAvLyBpZiBzZXR0aW5nIHRvIG51bGwgc2V0IGFzIHN0cmluZyB0byBnZXQgZGVmYXVsdHMgaW50byBwbGF5CisgICAgICAgIGlmIChvYmogPT0gbnVsbCAmJiBkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFN0cmluZyhudWxsKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldEludGVybmFsT2JqZWN0KG9iaik7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihwcm9wICsgIjogIiArIG9iaiwgcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB0aGlzIFZhbHVlIHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENsYXNzIGdldFZhbHVlVHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbnRlcm5hbCBzdHJpbmcgZm9ybSBvZiB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SW50ZXJuYWxTdHJpbmcoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRJbnRlcm5hbFN0cmluZyhTdHJpbmcgc3RyKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHZhbHVlIGZyb20gYW4gb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldEludGVybmFsT2JqZWN0KE9iamVjdCBvYmopOworCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgZm9yIHZhbHVlIGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIFZhbHVlTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxpc3RlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5lciBmb3IgdmFsdWUgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihWYWx1ZUxpc3RlbmVyIGxpc3RlbikgeworICAgICAgICB0aGlzLmxpc3RlbiA9IGxpc3RlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlaXIgaW5lcm5hbCB2YWx1ZSBjaGFuZ2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZCgpIHsKKyAgICAgICAgaWYgKGxpc3RlbiAhPSBudWxsKQorICAgICAgICAgICAgbGlzdGVuLnZhbHVlQ2hhbmdlZCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gZ2V0U3RyaW5nKCk7CisgICAgICAgIGludCBzdHJIYXNoID0gKHN0ciA9PSBudWxsKSA/IDAgOiBzdHIuaGFzaENvZGUoKTsKKyAgICAgICAgaW50IHByb3BIYXNoID0gKHByb3AgPT0gbnVsbCkgPyAwIDogcHJvcC5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gc3RySGFzaCBeIHByb3BIYXNoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBWYWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgVmFsdWUgbyA9IChWYWx1ZSkgb3RoZXI7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5lcXVhbHMocHJvcCwgby5nZXRQcm9wZXJ0eSgpKQorICAgICAgICAgICAgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKGdldFN0cmluZygpLCBvLmdldFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNuc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9WYWx1ZUxpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1ZhbHVlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzNhMzlhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9WYWx1ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKKy8qKgorICogQ29tcG9uZW50cyBjYW4gbGlzdGVuIG9uIHtAbGluayBWYWx1ZX0gb2JqZWN0cyBmb3IgY2hhbmdlcyBkaXJlY3RseS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhbHVlTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdXNlZCBieSB7QGxpbmsgVmFsdWV9IG9iamVjdHMgdG8gbm90aWZ5IGxpc3RlbmVyIG9mIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoVmFsdWUgdmFsKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhNTFlZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5Db25maWd1cmF0aW9uIEZyYW1ld29yazwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFuIGV4dGVuZGFibGUgcHJvZHVjdCBjb25maWd1cmF0aW9uIGZyYW1ld29yay4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL0JyZWFkdGhGaXJzdFdhbGsuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL0JyZWFkdGhGaXJzdFdhbGsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY2NDNhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvQnJlYWR0aEZpcnN0V2Fsay5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5ncmFwaDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQorLyoqDQorICogPHA+UGVyZm9ybXMgYSBicmVhZHRoLWZpcnN0IHdhbGsgb2YgYSBnaXZlbiB7QGxpbmsgR3JhcGh9LA0KKyAqIG5vdGlmeWluZyB2aXNpdG9ycyBhcyBpdCBzZWVzIGVhY2ggbm9kZS4gIFNlZSB0aGUgQkZTIGFsZ29yaXRobQ0KKyAqIGluIHRoZSBib29rICdJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcycgYnkgQ29ybWVuLCBMZWlzZXJzb24sIGFuZA0KKyAqIFJpdmVzdC48L3A+DQorICogPHAvPg0KKyAqIDxwPkVhY2gge0BsaW5rIEdyYXBoVmlzaXRvcn0gd2lsbCBiZSBub3RpZmllZCB3aGVuIGEgbm9kZQ0KKyAqIGlzIGNvbG9yZWQgYmxhY2sgKG5vZGVWaXNpdGVkKSwgZWRnZSBzZWVuIChlZGdlVmlzaXRlZCksDQorICogYW5kIGEgbm9kZSBpcyBzZWVuIGZvciB0aGUgZmlyc3QgdGltZSwgaS5lLiBjb2xvcmVkIGdyYXkgKG5vZGVTZWVuKS48L3A+DQorICoNCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQ0KKyAqIEBzaW5jZSAxLjAuMA0KKyAqIEBub2phdmFkb2MNCisgKi8NCitwdWJsaWMgY2xhc3MgQnJlYWR0aEZpcnN0V2FsayB7DQorDQorICAgIHByaXZhdGUgZmluYWwgR3JhcGggX2dyYXBoOw0KKyAgICBwcml2YXRlIGZpbmFsIFNldCBfdmlzaXRvcnMgPSBuZXcgSGFzaFNldCgpOw0KKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX3F1ZXVlID0gbmV3IExpbmtlZExpc3QoKTsNCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX25vZGVJbmZvID0gbmV3IEhhc2hNYXAoKTsNCisNCisgICAgcHVibGljIEJyZWFkdGhGaXJzdFdhbGsoR3JhcGggZ3JhcGgpIHsNCisgICAgICAgIF9ncmFwaCA9IGdyYXBoOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBCZWdpbnMgdGhlIGJyZWFkdGggZmlyc3QgdHJhdmVyc2FsLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgd2FsaygpIHsNCisgICAgICAgIF9xdWV1ZS5jbGVhcigpOw0KKyAgICAgICAgX25vZGVJbmZvLmNsZWFyKCk7DQorDQorICAgICAgICBDb2xsZWN0aW9uIG5vZGVzID0gX2dyYXBoLmdldE5vZGVzKCk7DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQ0KKyAgICAgICAgICAgIF9ub2RlSW5mby5wdXQoaXRyLm5leHQoKSwgbmV3IE5vZGVJbmZvKCkpOw0KKw0KKyAgICAgICAgT2JqZWN0IG5vZGU7DQorICAgICAgICBOb2RlSW5mbyBpbmZvOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIG5vZGUgPSBpdHIubmV4dCgpOw0KKyAgICAgICAgICAgIGluZm8gPSAoTm9kZUluZm8pIF9ub2RlSW5mby5nZXQobm9kZSk7DQorICAgICAgICAgICAgaWYgKGluZm8uY29sb3IgPT0gTm9kZUluZm8uQ09MT1JfV0hJVEUpDQorICAgICAgICAgICAgICAgIGVucXVldWUobm9kZSwgaW5mbyk7DQorICAgICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFByb2Nlc3MgdGhlIHF1ZXVlIHRvIHNlZSB3aGF0IGRhdGEgbmVlZHMgdG8gYmUgb2J0YWluZWQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1F1ZXVlKCkgew0KKyAgICAgICAgT2JqZWN0IG5vZGU7DQorICAgICAgICBPYmplY3Qgb3RoZXI7DQorICAgICAgICBOb2RlSW5mbyBpbmZvOw0KKyAgICAgICAgTm9kZUluZm8gb3RoZXJJbmZvOw0KKyAgICAgICAgQ29sbGVjdGlvbiBlZGdlczsNCisgICAgICAgIEVkZ2UgZWRnZTsNCisgICAgICAgIHdoaWxlIChfcXVldWUuc2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgIG5vZGUgPSBfcXVldWUucmVtb3ZlKDApOw0KKyAgICAgICAgICAgIGluZm8gPSAoTm9kZUluZm8pIF9ub2RlSW5mby5nZXQobm9kZSk7DQorICAgICAgICAgICAgdmlzaXQobm9kZSwgaW5mbyk7DQorDQorICAgICAgICAgICAgZWRnZXMgPSBfZ3JhcGguZ2V0RWRnZXNGcm9tKG5vZGUpOw0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgZWRnZSA9IChFZGdlKSBpdHIubmV4dCgpOw0KKyAgICAgICAgICAgICAgICBlZGdlVmlzaXRlZChlZGdlKTsNCisgICAgICAgICAgICAgICAgb3RoZXIgPSBlZGdlLmdldE90aGVyKG5vZGUpOw0KKyAgICAgICAgICAgICAgICBvdGhlckluZm8gPSAoTm9kZUluZm8pIF9ub2RlSW5mby5nZXQob3RoZXIpOw0KKyAgICAgICAgICAgICAgICBpZiAob3RoZXJJbmZvLmNvbG9yID09IE5vZGVJbmZvLkNPTE9SX1dISVRFKQ0KKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZShvdGhlciwgb3RoZXJJbmZvKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFB1c2ggdGhlIGdpdmVuIG5vZGUgb250byB0aGUgcXVldWUgdG8gYmUgcHJvY2Vzc2VkLg0KKyAgICAgKiBOb3RpZnkgdmlzaXRvcnMuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbnF1ZXVlKE9iamVjdCBub2RlLCBOb2RlSW5mbyBpbmZvKSB7DQorICAgICAgICBfcXVldWUuYWRkKG5vZGUpOw0KKyAgICAgICAgaW5mby5jb2xvciA9IE5vZGVJbmZvLkNPTE9SX0dSQVk7DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfdmlzaXRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQ0KKyAgICAgICAgICAgICgoR3JhcGhWaXNpdG9yKSBpLm5leHQoKSkubm9kZVNlZW4obm9kZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFZpc2l0IHRoZSBub2RlLiAgTWFyayB0aGUgbm9kZSBibGFjayBhbmQgbm90aWZ5IHZpc2l0b3JzLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXQoT2JqZWN0IG5vZGUsIE5vZGVJbmZvIGluZm8pIHsNCisgICAgICAgIGluZm8uY29sb3IgPSBOb2RlSW5mby5DT0xPUl9CTEFDSzsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF92aXNpdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspDQorICAgICAgICAgICAgKChHcmFwaFZpc2l0b3IpIGkubmV4dCgpKS5ub2RlVmlzaXRlZChub2RlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQW4gZWRnZSBpcyBzZWVuLiAgTm90aWZ5IHZpc2l0b3JzLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgZWRnZVZpc2l0ZWQoRWRnZSBlZGdlKSB7DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfdmlzaXRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQ0KKyAgICAgICAgICAgICgoR3JhcGhWaXNpdG9yKSBpLm5leHQoKSkuZWRnZVZpc2l0ZWQoZWRnZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIGFkZCBhIHtAbGluayBHcmFwaFZpc2l0b3J9IHRvIGJlIG5vdGlmaWVkIGR1cmluZyBicmVhZHRoIGZpcnN0IHNlYXJjaC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZEdyYXBoVmlzaXRvcihHcmFwaFZpc2l0b3IgdmlzaXRvcikgew0KKyAgICAgICAgX3Zpc2l0b3JzLmFkZCh2aXNpdG9yKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogcmVtb3ZlIGEgZ2l2ZW4ge0BsaW5rIEdyYXBoVmlzaXRvcn0gZnJvbSB0aGUgbGlzdGVuZXIgc2V0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JhcGhWaXNpdG9yKEdyYXBoVmlzaXRvciB2aXNpdG9yKSB7DQorICAgICAgICBfdmlzaXRvcnMucmVtb3ZlKHZpc2l0b3IpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL0RlcHRoRmlyc3RBbmFseXNpcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvRGVwdGhGaXJzdEFuYWx5c2lzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhOGZhNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL0RlcHRoRmlyc3RBbmFseXNpcy5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5ncmFwaDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKy8qKg0KKyAqIDxwPlBlcmZvcm1zIGEgZGVwdGgtZmlyc3QgYW5hbHlzaXMgb2YgYSBnaXZlbiB7QGxpbmsgR3JhcGh9LCBjYWNoaW5nDQorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyYXBoJ3Mgbm9kZXMgYW5kIGVkZ2VzLiAgU2VlIHRoZSBERlMgYWxnb3JpdGhtDQorICogaW4gdGhlIGJvb2sgJ0ludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zJyBieSBDb3JtZW4sIExlaXNlcnNvbiwgYW5kDQorICogUml2ZXN0LiAgVGhlIGFsZ29yaXRobSBoYXMgYmVlbiBtb2RpZmllZCB0byBncm91cCBzaWJsaW5nIG5vZGVzIHdpdGhvdXQNCisgKiBjb25uZWN0aW9ucyB0b2dldGhlciBkdXJpbmcgdGhlIHRvcG9sb2dpY2FsIHNvcnQuPC9wPg0KKyAqDQorICogQGF1dGhvciBBYmUgV2hpdGUNCisgKiBAc2luY2UgMS4wLjANCisgKiBAbm9qYXZhZG9jDQorICovDQorcHVibGljIGNsYXNzIERlcHRoRmlyc3RBbmFseXNpcyB7DQorDQorICAgIHByaXZhdGUgZmluYWwgR3JhcGggX2dyYXBoOw0KKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfbm9kZUluZm8gPSBuZXcgSGFzaE1hcCgpOw0KKyAgICBwcml2YXRlIENvbXBhcmF0b3IgX2NvbXA7DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvci4gIFBlcmZvcm1zIHRoZSBhbmFseXNpcyBvbiB0aGUgZ2l2ZW4gZ3JhcGggYW5kIGNhY2hlcw0KKyAgICAgKiB0aGUgcmVzdWx0aW5nIGluZm9ybWF0aW9uLg0KKyAgICAgKi8NCisgICAgcHVibGljIERlcHRoRmlyc3RBbmFseXNpcyhHcmFwaCBncmFwaCkgew0KKyAgICAgICAgX2dyYXBoID0gZ3JhcGg7DQorDQorICAgICAgICAvLyBpbml0aWFsaXplIG5vZGUgaW5mb3MNCisgICAgICAgIENvbGxlY3Rpb24gbm9kZXMgPSBncmFwaC5nZXROb2RlcygpOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykNCisgICAgICAgICAgICBfbm9kZUluZm8ucHV0KGl0ci5uZXh0KCksIG5ldyBOb2RlSW5mbygpKTsNCisNCisgICAgICAgIC8vIHZpc2l0IGFsbCBub2RlcyAtLSBzZWUgaW50cm8gdG8gYWxnbydzIGJvb2sNCisgICAgICAgIE5vZGVJbmZvIGluZm87DQorICAgICAgICBPYmplY3Qgbm9kZTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBub2RlID0gaXRyLm5leHQoKTsNCisgICAgICAgICAgICBpbmZvID0gKE5vZGVJbmZvKSBfbm9kZUluZm8uZ2V0KG5vZGUpOw0KKyAgICAgICAgICAgIGlmIChpbmZvLmNvbG9yID09IE5vZGVJbmZvLkNPTE9SX1dISVRFKQ0KKyAgICAgICAgICAgICAgICB2aXNpdChncmFwaCwgbm9kZSwgaW5mbywgMCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFZpc2l0IGEgbm9kZS4gIFNlZSBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyBib29rIGZvciBkZXRhaWxzLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBpbnQgdmlzaXQoR3JhcGggZ3JhcGgsIE9iamVjdCBub2RlLCBOb2RlSW5mbyBpbmZvLCBpbnQgdGltZSkgew0KKyAgICAgICAgLy8gZGlzY292ZXIgbm9kZQ0KKyAgICAgICAgaW5mby5jb2xvciA9IE5vZGVJbmZvLkNPTE9SX0dSQVk7DQorDQorICAgICAgICAvLyBleHBsb3JlIGFsbCB2ZXJ0aWNlcyBmcm9tIHRoYXQgbm9kZSBkZXB0aCBmaXJzdA0KKyAgICAgICAgQ29sbGVjdGlvbiBlZGdlcyA9IGdyYXBoLmdldEVkZ2VzRnJvbShub2RlKTsNCisgICAgICAgIEVkZ2UgZWRnZTsNCisgICAgICAgIE9iamVjdCBvdGhlcjsNCisgICAgICAgIE5vZGVJbmZvIG90aGVySW5mbzsNCisgICAgICAgIGludCBtYXhDaGlsZFRpbWUgPSB0aW1lIC0gMTsNCisgICAgICAgIGludCBjaGlsZFRpbWU7DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGVkZ2VzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgZWRnZSA9IChFZGdlKSBpdHIubmV4dCgpOw0KKyAgICAgICAgICAgIG90aGVyID0gZWRnZS5nZXRPdGhlcihub2RlKTsNCisgICAgICAgICAgICBvdGhlckluZm8gPSAoTm9kZUluZm8pIF9ub2RlSW5mby5nZXQob3RoZXIpOw0KKyAgICAgICAgICAgIGlmIChvdGhlckluZm8uY29sb3IgPT0gTm9kZUluZm8uQ09MT1JfV0hJVEUpIHsNCisgICAgICAgICAgICAgICAgLy8gdW5kaXNjb3ZlcmVkIG5vZGU7IHJlY3Vyc2UgaW50byBpdA0KKyAgICAgICAgICAgICAgICBjaGlsZFRpbWUgPSB2aXNpdChncmFwaCwgb3RoZXIsIG90aGVySW5mbywgdGltZSk7DQorICAgICAgICAgICAgICAgIGVkZ2Uuc2V0VHlwZShFZGdlLlRZUEVfVFJFRSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChvdGhlckluZm8uY29sb3IgPT0gTm9kZUluZm8uQ09MT1JfR1JBWSkgew0KKyAgICAgICAgICAgICAgICBjaGlsZFRpbWUgPSAtMTsNCisgICAgICAgICAgICAgICAgZWRnZS5zZXRUeXBlKEVkZ2UuVFlQRV9CQUNLKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjaGlsZFRpbWUgPSBvdGhlckluZm8uZmluaXNoZWQ7DQorICAgICAgICAgICAgICAgIGVkZ2Uuc2V0VHlwZShFZGdlLlRZUEVfRk9SV0FSRCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1heENoaWxkVGltZSA9IE1hdGgubWF4KG1heENoaWxkVGltZSwgY2hpbGRUaW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGZpbmlzaGVkIHdpdGggbm9kZQ0KKyAgICAgICAgaW5mby5jb2xvciA9IE5vZGVJbmZvLkNPTE9SX0JMQUNLOw0KKyAgICAgICAgaW5mby5maW5pc2hlZCA9IG1heENoaWxkVGltZSArIDE7DQorICAgICAgICByZXR1cm4gaW5mby5maW5pc2hlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBjb21wYXJhdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIG9yZGVyaW5nIGdyb3VwcyBvZiBub2Rlcw0KKyAgICAgKiB3aXRoIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldE5vZGVDb21wYXJhdG9yKENvbXBhcmF0b3IgY29tcCkgew0KKyAgICAgICAgX2NvbXAgPSBjb21wOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIG5vZGVzIGluIHRvcG9sb2dpY2FsbHktc29ydGVkIG9yZGVyLiAgVGhpcyBpcyBvZnRlbiB1c2VkDQorICAgICAqIHRvIG9yZGVyIGRlcGVuZGVuY2llcy4gIElmIGVhY2ggZ3JhcGggZWRnZSAodSwgdikgcmVwcmVzZW50cyBhDQorICAgICAqIGRlcGVuZGVuY3kgb2YgdiBvbiB1LCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBub2RlcyBpbiB0aGUNCisgICAgICogb3JkZXIgdGhhdCB0aGV5IHNob3VsZCBiZSBldmFsdWF0ZWQgdG8gc2F0aXNmeSBhbGwgZGVwZW5kZW5jaWVzLiAgT2YNCisgICAgICogY291cnNlLCBpZiB0aGUgZ3JhcGggaXMgY3ljbGljIChoYXMgYmFjayBlZGdlcyksIHRoZW4gbm8gc3VjaCBvcmRlcmluZw0KKyAgICAgKiBpcyBwb3NzaWJsZSwgdGhvdWdoIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBjb3JyZWN0IG9yZGVyDQorICAgICAqIGFzIGlmIGVkZ2VzIGNyZWF0aW5nIHRoZSBjeWNsZXMgZGlkIG5vdCBleGlzdC4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0IGdldFNvcnRlZE5vZGVzKCkgew0KKyAgICAgICAgTWFwLkVudHJ5W10gZW50cmllcyA9IChNYXAuRW50cnlbXSkgX25vZGVJbmZvLmVudHJ5U2V0KCkuDQorICAgICAgICAgICAgdG9BcnJheShuZXcgTWFwLkVudHJ5W19ub2RlSW5mby5zaXplKCldKTsNCisgICAgICAgIEFycmF5cy5zb3J0KGVudHJpZXMsIG5ldyBOb2RlSW5mb0NvbXBhcmF0b3IoX2NvbXApKTsNCisgICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3QoZW50cmllcyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiBhbGwgZWRnZXMgb2YgdGhlIGdpdmVuIHR5cGUuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0bw0KKyAgICAgKiBkaXNjb3ZlciBhbGwgZWRnZXMgdGhhdCBjYXVzZSBjeWNsZXMgaW4gdGhlIGdyYXBoIGJ5IHBhc3NpbmcgaXQNCisgICAgICogdGhlIHtAbGluayAjRURHRV9CQUNLfSBlZGdlIHR5cGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGdlcyhpbnQgdHlwZSkgew0KKyAgICAgICAgQ29sbGVjdGlvbiB0eXBlZCA9IG51bGw7DQorICAgICAgICBFZGdlIGVkZ2U7DQorICAgICAgICBPYmplY3Qgbm9kZTsNCisgICAgICAgIGZvciAoSXRlcmF0b3Igbm9kZXMgPSBfZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBub2Rlcy5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgbm9kZSA9IG5vZGVzLm5leHQoKTsNCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9ncmFwaC5nZXRFZGdlc0Zyb20obm9kZSkuaXRlcmF0b3IoKTsNCisgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgZWRnZSA9IChFZGdlKSBpdHIubmV4dCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZWRnZS5nZXRUeXBlKCkgPT0gdHlwZSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkID09IG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWQgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgICAgICAgICAgICAgICB0eXBlZC5hZGQoZWRnZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gKHR5cGVkID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IHR5cGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIGxvZ2ljYWwgdGltZSB0aGF0IHRoZSBnaXZlbiBub2RlIHdhcyBmaW5pc2hlZCBpbg0KKyAgICAgKiB0aGUgZ3JhcGggd2Fsaywgb3IgLTEgaWYgdGhlIG5vZGUgaXMgbm90IHBhcnQgb2YgdGhlIGdyYXBoLg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRGaW5pc2hlZFRpbWUoT2JqZWN0IG5vZGUpIHsNCisgICAgICAgIE5vZGVJbmZvIGluZm8gPSAoTm9kZUluZm8pIF9ub2RlSW5mby5nZXQobm9kZSk7DQorICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIHJldHVybiBpbmZvLmZpbmlzaGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb21wYXJhdG9yIGZvciB0b3Bsb2dpY2FsbHkgc29ydGluZyBlbnRyaWVzIGluIHRoZSBub2RlIGluZm8gbWFwLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUluZm9Db21wYXJhdG9yDQorICAgICAgICBpbXBsZW1lbnRzIENvbXBhcmF0b3Igew0KKw0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yIF9zdWJDb21wOw0KKw0KKyAgICAgICAgcHVibGljIE5vZGVJbmZvQ29tcGFyYXRvcihDb21wYXJhdG9yIHN1YkNvbXApIHsNCisgICAgICAgICAgICBfc3ViQ29tcCA9IHN1YkNvbXA7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsNCisgICAgICAgICAgICBNYXAuRW50cnkgZTEgPSAoTWFwLkVudHJ5KSBvMTsNCisgICAgICAgICAgICBNYXAuRW50cnkgZTIgPSAoTWFwLkVudHJ5KSBvMjsNCisgICAgICAgICAgICBOb2RlSW5mbyBuMSA9IChOb2RlSW5mbykgZTEuZ2V0VmFsdWUoKTsNCisgICAgICAgICAgICBOb2RlSW5mbyBuMiA9IChOb2RlSW5mbykgZTIuZ2V0VmFsdWUoKTsNCisNCisgICAgICAgICAgICAvLyByZXZlcnNlIGZpbmlzaGVkIG9yZGVyDQorICAgICAgICAgICAgaW50IHJldCA9IG4yLmZpbmlzaGVkIC0gbjEuZmluaXNoZWQ7DQorICAgICAgICAgICAgaWYgKHJldCA9PSAwICYmIF9zdWJDb21wICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHJldCA9IF9zdWJDb21wLmNvbXBhcmUoZTEuZ2V0S2V5KCksIGUyLmdldEtleSgpKTsNCisgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKglMaXN0IG9mIG5vZGUtdG8tbm9kZWluZm8gZW50cmllcyB0aGF0IGV4cG9zZXMganVzdCB0aGUgbm9kZXMuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlTGlzdA0KKyAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3Qgew0KKw0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXAuRW50cnlbXSBfZW50cmllczsNCisNCisgICAgICAgIHB1YmxpYyBOb2RlTGlzdChNYXAuRW50cnlbXSBlbnRyaWVzKSB7DQorICAgICAgICAgICAgX2VudHJpZXMgPSBlbnRyaWVzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGlkeCkgew0KKyAgICAgICAgICAgIHJldHVybiBfZW50cmllc1tpZHhdLmdldEtleSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgICAgICAgIHJldHVybiBfZW50cmllcy5sZW5ndGg7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvRWRnZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvRWRnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGFmY2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9ncmFwaC9FZGdlLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmdyYXBoOw0KKw0KKy8qKg0KKyAqIDxwPkEgZ3JhcGggZWRnZS4gIEluY2x1ZGVzIHRoZSBmcm9tIGFuZCB0byBub2RlcywgYW4gYXJiaXRyYXJ5IHVzZXIgb2JqZWN0LA0KKyAqIGFuZCBhIHdlaWdodC4gIEVkZ2VzIGNhbiBiZSBlaXRoZXIgZGlyZWN0ZWQgb3IgdW5kaXJlY3RlZC48L3A+DQorICoNCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQ0KKyAqIEBzaW5jZSAxLjAuMA0KKyAqIEBub2phdmFkb2MNCisgKi8NCitwdWJsaWMgY2xhc3MgRWRnZSB7DQorDQorICAgIC8qKg0KKyAgICAgKiBBbiBlZGdlICh1LCB2KSBpcyBhIHRyZWUgZWRnZSBpZiBub2RlIHYgd2FzIGZpcnN0IGRpc2NvdmVyZWQgYnkNCisgICAgICogdHJhdmVyc2luZyB0aGUgZWRnZS4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVFJFRSA9IDE7DQorDQorICAgIC8qKg0KKyAgICAgKiBBbiBlZGdlICh1LCB2KSBpcyBhIGJhY2sgZWRnZSBpZiBpdCBjcmVhdGVzIGEgY3ljbGUgYmFjayB0byBhbg0KKyAgICAgKiBhbmNlc3RvciBpbiB0aGUgZ3JhcGguDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JBQ0sgPSAyOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gZWRnZSAodSwgdikgaXMgYSBmb3J3YXJkIGVkZ2UgaWYgaXQgaXMgbm90IGEgdHJlZSBvciBiYWNrIGVkZ2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZPUldBUkQgPSAzOw0KKw0KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBfZnJvbTsNCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX3RvOw0KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2RpcmVjdGVkOw0KKw0KKyAgICBwcml2YXRlIGludCBfdHlwZSA9IDA7DQorICAgIHByaXZhdGUgZG91YmxlIF93ZWlnaHQgPSAwOw0KKyAgICBwcml2YXRlIE9iamVjdCBfdXNlck9iaiA9IG51bGw7DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvci4NCisgICAgICoNCisgICAgICogQHBhcmFtICAgIGZyb20gICAgICAgIHRoZSBub2RlIHRoZSBlZGdlIGNvbWVzIGZyb20NCisgICAgICogQHBhcmFtICAgIHRvICAgICAgICAgICAgdGhlIG5vZGUgdGhlIGVkZ2UgZ29lcyB0bw0KKyAgICAgKiBAcGFyYW0gICAgZGlyZWN0ZWQgICAgd2hldGhlciB0aGUgZWRnZSBpcyBkaXJlY3RlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVkZ2UoT2JqZWN0IGZyb20sIE9iamVjdCB0bywgYm9vbGVhbiBkaXJlY3RlZCkgew0KKyAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZyb20gPT0gbnVsbCIpOw0KKyAgICAgICAgaWYgKHRvID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0byA9PSBudWxsIik7DQorICAgICAgICBfZnJvbSA9IGZyb207DQorICAgICAgICBfdG8gPSB0bzsNCisgICAgICAgIF9kaXJlY3RlZCA9IGRpcmVjdGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvci4NCisgICAgICoNCisgICAgICogQHBhcmFtICAgIGZyb20gICAgICAgIHRoZSBub2RlIHRoZSBlZGdlIGNvbWVzIGZyb20NCisgICAgICogQHBhcmFtICAgIHRvICAgICAgICAgICAgdGhlIG5vZGUgdGhlIGVkZ2UgZ29lcyB0bw0KKyAgICAgKiBAcGFyYW0gICAgZGlyZWN0ZWQgICAgd2hldGhlciB0aGUgZWRnZSBpcyBkaXJlY3RlZA0KKyAgICAgKiBAcGFyYW0gICAgdXNlck9iamVjdCAgICBhbiBhc3NvY2lhdGVkIG9iamVjdA0KKyAgICAgKi8NCisgICAgcHVibGljIEVkZ2UoT2JqZWN0IGZyb20sIE9iamVjdCB0bywgYm9vbGVhbiBkaXJlY3RlZCwgT2JqZWN0IHVzZXJPYmplY3QpIHsNCisgICAgICAgIHRoaXMoZnJvbSwgdG8sIGRpcmVjdGVkKTsNCisgICAgICAgIF91c2VyT2JqID0gdXNlck9iamVjdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSBub2RlIHRoZSBlZGdlIGxpbmtzIGZyb20uDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZyb20oKSB7DQorICAgICAgICByZXR1cm4gX2Zyb207DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiB0aGUgbm9kZSB0aGUgZWRnZSBsaW5rcyB0by4NCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VG8oKSB7DQorICAgICAgICByZXR1cm4gX3RvOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIG5vZGUgb24gdGhlIG9wcG9zaXRlIGVuZCBvZiB0aGUgZ2l2ZW4gb25lLCBvciBudWxsIGlmIHRoZQ0KKyAgICAgKiBnaXZlbiBub2RlIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZWRnZS4NCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0T3RoZXIoT2JqZWN0IG5vZGUpIHsNCisgICAgICAgIGlmIChfdG8gPT0gbm9kZSkNCisgICAgICAgICAgICByZXR1cm4gX2Zyb207DQorICAgICAgICBpZiAoX2Zyb20gPT0gbm9kZSkNCisgICAgICAgICAgICByZXR1cm4gX3RvOw0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZWRnZSBsaW5rcyB0byB0aGUgZ2l2ZW4gbm9kZS4gIEZvciB1bmRpcmVjdGVkIGVkZ2VzLA0KKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgZWl0aGVyIHNpZGUgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIG5vZGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RvKE9iamVjdCBub2RlKSB7DQorICAgICAgICByZXR1cm4gX3RvID09IG5vZGUgfHwgKCFfZGlyZWN0ZWQgJiYgX2Zyb20gPT0gbm9kZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZWRnZSBsaW5rcyBmcm9tIHRoZSBnaXZlbiBub2RlLiAgRm9yIHVuZGlyZWN0ZWQNCisgICAgICogZWRnZXMsIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgc2lkZSBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4NCisgICAgICogbm9kZS4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGlzRnJvbShPYmplY3Qgbm9kZSkgew0KKyAgICAgICAgcmV0dXJuIF9mcm9tID09IG5vZGUgfHwgKCFfZGlyZWN0ZWQgJiYgX3RvID09IG5vZGUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZWRnZSBpcyBkaXJlY3RlZC4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0ZWQoKSB7DQorICAgICAgICByZXR1cm4gX2RpcmVjdGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIHdlaWdodCBvZiB0aGUgZWRnZS4NCisgICAgICovDQorICAgIHB1YmxpYyBkb3VibGUgZ2V0V2VpZ2h0KCkgew0KKyAgICAgICAgcmV0dXJuIF93ZWlnaHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldCB0aGUgd2VpZ2h0IG9mIHRoZSBlZGdlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0V2VpZ2h0KGRvdWJsZSB3ZWlnaHQpIHsNCisgICAgICAgIF93ZWlnaHQgPSB3ZWlnaHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFyYml0cmFyeSB1c2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGVkZ2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoKSB7DQorICAgICAgICByZXR1cm4gX3VzZXJPYmo7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFyYml0cmFyeSB1c2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGVkZ2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyT2JqZWN0KE9iamVjdCBvYmopIHsNCisgICAgICAgIF91c2VyT2JqID0gb2JqOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUcmF2ZXJzYWwgYm9va2tlZXBpbmcgaW5mby4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBfdHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVHJhdmVyc2FsIGJvb2trZWVwaW5nIGluZm8uDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7DQorICAgICAgICBfdHlwZSA9IHR5cGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENsZWFyIHRyYXZlcnNhbCBpbmZvLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgY2xlYXJUcmF2ZXJzYWwoKSB7DQorICAgICAgICBfdHlwZSA9IDA7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIltmcm9tPSIgKyBnZXRGcm9tKCkgKyAiO3RvPSIgKyBnZXRUbygpDQorICAgICAgICAgICAgKyAiO2RpcmVjdGVkPSIgKyBpc0RpcmVjdGVkICgpICsgIjt3ZWlnaHQ9IiArIGdldFdlaWdodCAoKSArICJdIjsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9ncmFwaC9HcmFwaC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvR3JhcGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDU2YmZlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvR3JhcGguamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuZ3JhcGg7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKy8qKg0KKyAqIDxwPkdyYXBoIHJlcHJlc2VudGF0aW9uIHVzaW5nIHRoZSBhZGphY2VuY3kgbGlzdCBmb3JtLiAgU2VlIHRoZSBib29rDQorICogJ0ludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zJyBieSBDb3JtZW4sIExlaXNlcnNvbiwgYW5kIFJpdmVzdC48L3A+DQorICoNCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQ0KKyAqIEBzaW5jZSAxLjAuMA0KKyAqIEBub2phdmFkb2MNCisgKi8NCitwdWJsaWMgY2xhc3MgR3JhcGggew0KKw0KKyAgICAvLyBtYXAgZWFjaCBub2RlIHRvIGxpc3Qgb2YgZWRnZXMgZnJvbSB0aGF0IG5vZGUNCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX25vZGVzID0gbmV3IEhhc2hNYXAoKTsNCisNCisgICAgLyoqDQorICAgICAqIENsZWFyIHRoZSBncmFwaC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgew0KKyAgICAgICAgX25vZGVzLmNsZWFyKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBncmFwaCBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTm9kZShPYmplY3Qgbm9kZSkgew0KKyAgICAgICAgcmV0dXJuIF9ub2Rlcy5jb250YWluc0tleShub2RlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIGEgdmlldyBvZiBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoLg0KKyAgICAgKi8NCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Tm9kZXMoKSB7DQorICAgICAgICByZXR1cm4gX25vZGVzLmtleVNldCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYSBub2RlIHRvIHRoZSBncmFwaC4gIEFkZGluZyBhIG5vZGUgYSBzZWNvbmQgdGltZSBoYXMgbm8gZWZmZWN0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgYWRkTm9kZShPYmplY3Qgbm9kZSkgew0KKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5vZGUgPSBudWxsIik7DQorICAgICAgICBpZiAoIWNvbnRhaW5zTm9kZShub2RlKSkNCisgICAgICAgICAgICBfbm9kZXMucHV0KG5vZGUsIG51bGwpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGdyYXBoLiAgQWxsIGVkZ2VzIHRvIGFuZCBmcm9tIHRoZSBub2RlDQorICAgICAqIHdpbGwgYmUgY2xlYXJlZC4NCisgICAgICoNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBub2RlIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UNCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG5vZGUpIHsNCisgICAgICAgIGJvb2xlYW4gcmVtID0gY29udGFpbnNOb2RlKG5vZGUpOw0KKyAgICAgICAgaWYgKHJlbSkgew0KKyAgICAgICAgICAgIENvbGxlY3Rpb24gZWRnZXMgPSBnZXRFZGdlc1RvKG5vZGUpOw0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspDQorICAgICAgICAgICAgICAgIHJlbW92ZUVkZ2UoKEVkZ2UpIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgICAgIF9ub2Rlcy5yZW1vdmUobm9kZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVtOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gYWxsIGVkZ2VzIGluIHRoZSBncmFwaC4NCisgICAgICovDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVkZ2VzKCkgew0KKyAgICAgICAgQ29sbGVjdGlvbiBhbGwgPSBuZXcgSGFzaFNldCgpOw0KKyAgICAgICAgQ29sbGVjdGlvbiBlZGdlczsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX25vZGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgZWRnZXMgPSAoQ29sbGVjdGlvbikgaXRyLm5leHQoKTsNCisgICAgICAgICAgICBpZiAoZWRnZXMgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgYWxsLmFkZEFsbChlZGdlcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gYWxsIHRoZSBlZGdlcyBmcm9tIGEgcGFydGljdWxhciBub2RlLg0KKyAgICAgKi8NCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RWRnZXNGcm9tKE9iamVjdCBub2RlKSB7DQorICAgICAgICBDb2xsZWN0aW9uIGVkZ2VzID0gKENvbGxlY3Rpb24pIF9ub2Rlcy5nZXQobm9kZSk7DQorICAgICAgICByZXR1cm4gKGVkZ2VzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGVkZ2VzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gYWxsIHRoZSBlZGdlcyB0byBhIHBhcnRpY3VsYXIgbm9kZS4NCisgICAgICovDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVkZ2VzVG8oT2JqZWN0IG5vZGUpIHsNCisgICAgICAgIENvbGxlY3Rpb24gZWRnZXMgPSBnZXRFZGdlcygpOw0KKyAgICAgICAgQ29sbGVjdGlvbiB0byA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICAgIEVkZ2UgZWRnZTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBlZGdlID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICAgICAgaWYgKGVkZ2UuaXNUbyhub2RlKSkNCisgICAgICAgICAgICAgICAgdG8uYWRkKGVkZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRvOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gYWxsIHRoZSBlZGdlcyBmcm9tIG9uZSBub2RlIHRvIGFub3RoZXIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGdlcyhPYmplY3QgZnJvbSwgT2JqZWN0IHRvKSB7DQorICAgICAgICBDb2xsZWN0aW9uIGVkZ2VzID0gZ2V0RWRnZXNGcm9tKGZyb20pOw0KKyAgICAgICAgQ29sbGVjdGlvbiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdChlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgRWRnZSBlZGdlOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBlZGdlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIGVkZ2UgPSAoRWRnZSkgaXRyLm5leHQoKTsNCisgICAgICAgICAgICBpZiAoZWRnZS5pc1RvKHRvKSkNCisgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoZWRnZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbWF0Y2hlczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGFuIGVkZ2UgdG8gdGhlIGdyYXBoLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgYWRkRWRnZShFZGdlIGVkZ2UpIHsNCisgICAgICAgIGlmICghY29udGFpbnNOb2RlKGVkZ2UuZ2V0VG8oKSkpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlZGdlLmdldFRvKCkudG9TdHJpbmcoKSk7DQorICAgICAgICBpZiAoIWNvbnRhaW5zTm9kZShlZGdlLmdldEZyb20oKSkpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlZGdlLmdldEZyb20oKS50b1N0cmluZygpKTsNCisNCisgICAgICAgIENvbGxlY3Rpb24gZnJvbSA9IChDb2xsZWN0aW9uKSBfbm9kZXMuZ2V0KGVkZ2UuZ2V0RnJvbSgpKTsNCisgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsNCisgICAgICAgICAgICBmcm9tID0gbmV3IEFycmF5TGlzdCgzKTsNCisgICAgICAgICAgICBfbm9kZXMucHV0KGVkZ2UuZ2V0RnJvbSgpLCBmcm9tKTsNCisgICAgICAgIH0NCisgICAgICAgIGZyb20uYWRkKGVkZ2UpOw0KKw0KKyAgICAgICAgaWYgKCFlZGdlLmlzRGlyZWN0ZWQoKSAmJiAhZWRnZS5nZXRGcm9tKCkuZXF1YWxzKGVkZ2UuZ2V0VG8oKSkpIHsNCisgICAgICAgICAgICBDb2xsZWN0aW9uIHRvID0gKENvbGxlY3Rpb24pIF9ub2Rlcy5nZXQoZWRnZS5nZXRUbygpKTsNCisgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB0byA9IG5ldyBBcnJheUxpc3QoMyk7DQorICAgICAgICAgICAgICAgIF9ub2Rlcy5wdXQoZWRnZS5nZXRUbygpLCB0byk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRvLmFkZChlZGdlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIGFuIGVkZ2UgZnJvbSB0aGUgZ3JhcGguDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWRnZSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHRoZSBncmFwaA0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWRnZShFZGdlIGVkZ2UpIHsNCisgICAgICAgIENvbGxlY3Rpb24gZWRnZXMgPSAoQ29sbGVjdGlvbikgX25vZGVzLmdldChlZGdlLmdldEZyb20oKSk7DQorICAgICAgICBpZiAoZWRnZXMgPT0gbnVsbCkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBib29sZWFuIHJlbSA9IGVkZ2VzLnJlbW92ZShlZGdlKTsNCisgICAgICAgIGlmIChyZW0gJiYgIWVkZ2UuaXNEaXJlY3RlZCgpKSB7DQorICAgICAgICAgICAgZWRnZXMgPSAoQ29sbGVjdGlvbikgX25vZGVzLmdldChlZGdlLmdldFRvKCkpOw0KKyAgICAgICAgICAgIGlmIChlZGdlcyAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICBlZGdlcy5yZW1vdmUoZWRnZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVtOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKglDbGVhciBhbGwgbm9kZXMgYW5kIGVkZ2VzIG9mIHRoZSBib29ra2VlcGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZWlyDQorICAgICAqCWxhc3QgdHJhdmVyc2FsLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgY2xlYXJUcmF2ZXJzYWwoKSB7DQorICAgICAgICBDb2xsZWN0aW9uIGVkZ2VzOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciB2YWxzID0gX25vZGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHZhbHMuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIGVkZ2VzID0gKENvbGxlY3Rpb24pIHZhbHMubmV4dCgpOw0KKyAgICAgICAgICAgIGlmIChlZGdlcyAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGVkID0gZWRnZXMuaXRlcmF0b3IoKTsgZWQuaGFzTmV4dCgpOykNCisgICAgICAgICAgICAgICAgICAgICgoRWRnZSkgZWQubmV4dCgpKS5jbGVhclRyYXZlcnNhbCAoKTsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9ncmFwaC9HcmFwaFZpc2l0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL0dyYXBoVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjYwMmQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9ncmFwaC9HcmFwaFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5ncmFwaDsNCisNCisvKioNCisgKiA8cD5BIGhlbHBlciBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byBiZSBub3RpZmllZCBvZg0KKyAqIGdyYXBoIGV2ZW50cyBkdXJpbmcgZ3JhcGggdHJhdmVyc2FsczwvcD4NCisgKg0KKyAqIEBhdXRob3IgU3RldmUgS2ltDQorICogQHNpbmNlIDEuMC4wDQorICogQG5vamF2YWRvYw0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgR3JhcGhWaXNpdG9yIHsNCisNCisgICAgLyoqDQorICAgICAqIE1heSBub3QgYmUgY2FsbGVkLiAgVGhlIG1lYW5pbmcgb2YgdGhpcyBtZXRob2QgaXMgZGVwZW5kZW50DQorICAgICAqIG9uIHRoZSB0cmF2ZXJzYWwgYmVpbmcgdXNlZC4gIFNlZSBlYWNoIGFwcHJvcHJpYXRlIGdyYXBoDQorICAgICAqIHdhbGtlciBmb3IgZGV0YWlscy4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIG5vZGVTZWVuKE9iamVjdCBub2RlKTsNCisNCisgICAgLyoqDQorICAgICAqIHdpbGwgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbm9kZQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgbm9kZVZpc2l0ZWQoT2JqZWN0IG5vZGUpOw0KKw0KKyAgICAvKioNCisgICAgICogbWF5IHZpc2l0IHRoZSBub2RlIHR3aWNlIChib3RoIHNpZGVzKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZWRnZVZpc2l0ZWQoRWRnZSBlZGdlKTsNCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvTm9kZUluZm8uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL05vZGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkYmUwMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL05vZGVJbmZvLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuZ3JhcGg7DQorDQorLyoqDQorICogPHA+U3RydWN0IHVzZWQgdG8gdHJhY2sgZ3JhcGggbm9kZSBpbmZvcm1hdGlvbiBkdXJpbmcgdHJhdmVyc2FsLjwvcD4NCisgKg0KKyAqIEBhdXRob3IgQWJlIFdoaXRlDQorICogQHNpbmNlIDEuMC4wDQorICovDQorY2xhc3MgTm9kZUluZm8gew0KKw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURSA9IDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSQVkgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTEFDSyA9IDI7DQorDQorICAgIHB1YmxpYyBpbnQgZmluaXNoZWQgPSAwOw0KKyAgICBwdWJsaWMgaW50IGNvbG9yID0gQ09MT1JfV0hJVEU7DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk1YTRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzwhLS0NCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPGh0bWw+DQorPGJvZHk+DQorPHA+PHN0cm9uZz5HcmFwaCBBYnN0cmFjdGlvbjwvc3Ryb25nPjwvcD4NCisNCis8cD4NCisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgZ3JhcGggYWJzdHJhY3Rpb24gYW5kIGdyYXBoLXJlbGF0ZWQgYWxnb3JpdGhtcy4NCis8L3A+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0Fic3RyYWN0SkRCQ0xpc3RlbmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0Fic3RyYWN0SkRCQ0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjYzA4MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvQWJzdHJhY3RKREJDTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEpEQkNMaXN0ZW5lcn0KKyAqIGxpc3RlbmVyLiBJdCBhbGxvd3Mgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIGZpbmUtZ3JhaW5lZCBldmVudCBoYW5kbGluZy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RKREJDTGlzdGVuZXIgaW1wbGVtZW50cyBKREJDTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogQ2F0Y2gtYWxsIGZvciB1bmhhbmRsZWQgZXZlbnRzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYWxsIG90aGVyCisgICAgICogZXZlbnQgbWV0aG9kcyBpZiB5b3UgZG8gbm90IG92ZXJyaWRlIHRoZW0uIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV2ZW50T2NjdXJyZWQoSkRCQ0V2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVmb3JlUHJlcGFyZVN0YXRlbWVudChKREJDRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnRPY2N1cnJlZChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJQcmVwYXJlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVDcmVhdGVTdGF0ZW1lbnQoSkRCQ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ3JlYXRlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVFeGVjdXRlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckV4ZWN1dGVTdGF0ZW1lbnQoSkRCQ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbW1pdChKREJDRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnRPY2N1cnJlZChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXQoSkRCQ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZVJvbGxiYWNrKEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlclJvbGxiYWNrKEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVSZXR1cm4oSkRCQ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVyUmV0dXJuKEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckNvbm5lY3QoSkRCQ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50T2NjdXJyZWQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNsb3NlKEpEQkNFdmVudCBldmVudCkgeworICAgICAgICBldmVudE9jY3VycmVkKGV2ZW50KTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvQ29uZmlndXJpbmdDb25uZWN0aW9uRGVjb3JhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0NvbmZpZ3VyaW5nQ29ubmVjdGlvbkRlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOGJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0NvbmZpZ3VyaW5nQ29ubmVjdGlvbkRlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKKworLyoqCisgKiBDb25uZWN0aW9uIGRlY29yYXRvciB0aGF0IGNhbiBjb25maWd1cmUgc29tZSBwcm9wZXJ0aWVzIG9mIHRoZQorICogdW5kZXJseWluZyBjb25uZWN0aW9uLiBVbmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgKiA8dWw+CisgKiA8bGk+UXVlcnlUaW1lb3V0PC9saT4KKyAqIDxsaT5UcmFuc2FjdGlvbklzb2xhdGlvbih7QGxpbmsgQ29ubmVjdGlvbn0gY29uc3RhbnRzKTwvbGk+CisgKiA8bGk+QXV0b0NvbW1pdDwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmluZ0Nvbm5lY3Rpb25EZWNvcmF0b3IgaW1wbGVtZW50cyBDb25uZWN0aW9uRGVjb3JhdG9yIHsKKworICAgIHByaXZhdGUgaW50IF9pc29sYXRpb24gPSAtMTsKKyAgICBwcml2YXRlIGludCBfcXVlcnlUaW1lb3V0ID0gLTE7CisgICAgcHJpdmF0ZSBCb29sZWFuIF9hdXRvQ29tbWl0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBhIHF1ZXJ5IHRvIGV4ZWN1dGUgYmVmb3JlCisgICAgICogdGVybWluYXRpbmcgaXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRRdWVyeVRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnlUaW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBhIHF1ZXJ5IHRvIGV4ZWN1dGUgYmVmb3JlCisgICAgICogdGVybWluYXRpbmcgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgICAgIF9xdWVyeVRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9pc29sYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbklzb2xhdGlvbihpbnQgaXNvbGF0aW9uKSB7CisgICAgICAgIF9pc29sYXRpb24gPSBpc29sYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhdXRvIGNvbW1pdCBzaG91bGQgYmUgb24uIFVzZSBudWxsIHRvIGtlZXAKKyAgICAgKiB0aGUgY29ubmVjdGlvbidzIGRlZmF1bHQgc2V0dGluZy4gRGVmYXVsdHMgdG8gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRBdXRvQ29tbWl0KCkgeworICAgICAgICByZXR1cm4gX2F1dG9Db21taXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhdXRvIGNvbW1pdCBzaG91bGQgYmUgb24uIFVzZSBudWxsIHRvIGtlZXAKKyAgICAgKiB0aGUgY29ubmVjdGlvbidzIGRlZmF1bHQgc2V0dGluZy4gRGVmYXVsdHMgdG8gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ29tbWl0KEJvb2xlYW4gYXV0b0NvbW1pdCkgeworICAgICAgICBfYXV0b0NvbW1pdCA9IGF1dG9Db21taXQ7CisgICAgfQorCisgICAgcHVibGljIENvbm5lY3Rpb24gZGVjb3JhdGUoQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9pc29sYXRpb24gPT0gQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9OT05FIHx8IF9xdWVyeVRpbWVvdXQgIT0gLTEKKyAgICAgICAgICAgIHx8IF9hdXRvQ29tbWl0ICE9IG51bGwpCisgICAgICAgICAgICBjb25uID0gbmV3IENvbmZpZ3VyaW5nQ29ubmVjdGlvbihjb25uKTsKKyAgICAgICAgaWYgKF9pc29sYXRpb24gIT0gLTEgJiYgX2lzb2xhdGlvbiAhPSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX05PTkUpCisgICAgICAgICAgICBjb25uLnNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKF9pc29sYXRpb24pOworICAgICAgICByZXR1cm4gY29ubjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvcmF0b3IgdG8gY29uZmlndXJlIGNvbm5lY3Rpb24gY29tcG9uZW50cyBjb3JyZWN0bHkuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBDb25maWd1cmluZ0Nvbm5lY3Rpb24gZXh0ZW5kcyBEZWxlZ2F0aW5nQ29ubmVjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9jdXJBdXRvQ29tbWl0ID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIENvbmZpZ3VyaW5nQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoY29ubik7CisgICAgICAgICAgICBpZiAoX2F1dG9Db21taXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9jdXJBdXRvQ29tbWl0ID0gQ29uZmlndXJpbmdDb25uZWN0aW9uLnRoaXMuZ2V0QXV0b0NvbW1pdCgpOworICAgICAgICAgICAgICAgIGlmIChfY3VyQXV0b0NvbW1pdCAhPSBfYXV0b0NvbW1pdC5ib29sZWFuVmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0QXV0b0NvbW1pdChfYXV0b0NvbW1pdC5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ29tbWl0KGJvb2xlYW4gYXV0bykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoX2lzb2xhdGlvbiAhPSBUUkFOU0FDVElPTl9OT05FKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0QXV0b0NvbW1pdChhdXRvKTsKKyAgICAgICAgICAgICAgICBfY3VyQXV0b0NvbW1pdCA9IGF1dG87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfaXNvbGF0aW9uICE9IFRSQU5TQUNUSU9OX05PTkUpCisgICAgICAgICAgICAgICAgc3VwZXIuY29tbWl0KCk7CisgICAgICAgICAgICBpZiAoX2F1dG9Db21taXQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIF9hdXRvQ29tbWl0LmJvb2xlYW5WYWx1ZSgpICE9IF9jdXJBdXRvQ29tbWl0KQorICAgICAgICAgICAgICAgIHNldEF1dG9Db21taXQoX2F1dG9Db21taXQuYm9vbGVhblZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfaXNvbGF0aW9uICE9IFRSQU5TQUNUSU9OX05PTkUpCisgICAgICAgICAgICAgICAgc3VwZXIucm9sbGJhY2soKTsKKyAgICAgICAgICAgIGlmIChfYXV0b0NvbW1pdCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgX2F1dG9Db21taXQuYm9vbGVhblZhbHVlKCkgIT0gX2N1ckF1dG9Db21taXQpCisgICAgICAgICAgICAgICAgc2V0QXV0b0NvbW1pdChfYXV0b0NvbW1pdC5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLCBib29sZWFuIHdyYXApCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gc3VwZXIucHJlcGFyZVN0YXRlbWVudChzcWwsIHdyYXApOworICAgICAgICAgICAgaWYgKF9xdWVyeVRpbWVvdXQgIT0gLTEpCisgICAgICAgICAgICAgICAgc3RtbnQuc2V0UXVlcnlUaW1lb3V0KF9xdWVyeVRpbWVvdXQpOworICAgICAgICAgICAgcmV0dXJuIHN0bW50OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgaW50IHJzVHlwZSwKKyAgICAgICAgICAgIGludCByc0NvbmN1ciwgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gc3VwZXIucHJlcGFyZVN0YXRlbWVudChzcWwsIHJzVHlwZSwKKyAgICAgICAgICAgICAgICByc0NvbmN1ciwgd3JhcCk7CisgICAgICAgICAgICBpZiAoX3F1ZXJ5VGltZW91dCAhPSAtMSkKKyAgICAgICAgICAgICAgICBzdG1udC5zZXRRdWVyeVRpbWVvdXQoX3F1ZXJ5VGltZW91dCk7CisgICAgICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudChib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGVtZW50IHN0bW50ID0gc3VwZXIuY3JlYXRlU3RhdGVtZW50KHdyYXApOworICAgICAgICAgICAgaWYgKF9xdWVyeVRpbWVvdXQgIT0gLTEpCisgICAgICAgICAgICAgICAgc3RtbnQuc2V0UXVlcnlUaW1lb3V0KF9xdWVyeVRpbWVvdXQpOworICAgICAgICAgICAgcmV0dXJuIHN0bW50OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoaW50IHJzVHlwZSwgaW50IHJzQ29uY3VyLAorICAgICAgICAgICAgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0YXRlbWVudCBzdG1udCA9IHN1cGVyLmNyZWF0ZVN0YXRlbWVudChyc1R5cGUsIHJzQ29uY3VyLCB3cmFwKTsKKyAgICAgICAgICAgIGlmIChfcXVlcnlUaW1lb3V0ICE9IC0xKQorICAgICAgICAgICAgICAgIHN0bW50LnNldFF1ZXJ5VGltZW91dChfcXVlcnlUaW1lb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBzdG1udDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvQ29ubmVjdGlvbkRlY29yYXRvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9Db25uZWN0aW9uRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzMDM1ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvQ29ubmVjdGlvbkRlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKKy8qKgorICogQSBjb25uZWN0aW9uIGRlY29yYXRvciBjYW4gd3JhcCB7QGxpbmsgQ29ubmVjdGlvbn1zIGJlZm9yZSB0aGV5IGFyZQorICogcmV0dXJuZWQgdG8gdGhlIHVzZXIgdG8gYWRkIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uRGVjb3JhdG9yIHsKKworICAgIC8qKgorICAgICAqIERlY29yYXRlIHRoZSBnaXZlbiBjb25uZWN0aW9uIGlmIGRlc2lyZWQuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3Rpb24gZGVjb3JhdGUoQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgU1FMRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EYXRhU291cmNlTG9ncy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EYXRhU291cmNlTG9ncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YWQ5N2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RhdGFTb3VyY2VMb2dzLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Ob25lTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIFByb3ZpZXMgYmFzaWMgbG9nZ2luZyBmYWNpbGl0aWVzIHRvIGEgRGF0YVNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUxvZ3MgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPQorICAgICAgICBMb2NhbGl6ZXIuZm9yUGFja2FnZShEYXRhU291cmNlTG9ncy5jbGFzcyk7CisKKyAgICBwcml2YXRlIExvZyBfamRiY0xvZyA9IG51bGw7CisgICAgcHJpdmF0ZSBMb2cgX3NxbExvZyA9IG51bGw7CisKKyAgICBwdWJsaWMgRGF0YVNvdXJjZUxvZ3MoKSB7CisgICAgfQorCisgICAgcHVibGljIERhdGFTb3VyY2VMb2dzKExvZyBqZGJjTG9nLCBMb2cgc3FsTG9nKSB7CisgICAgICAgIF9qZGJjTG9nID0gamRiY0xvZzsKKyAgICAgICAgX3NxbExvZyA9IHNxbExvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9nIHRvIHdyaXRlIEpEQkMgbWVzc2FnZXMgdG8uCisgICAgICovCisgICAgcHVibGljIExvZyBnZXRKREJDTG9nKCkgeworICAgICAgICByZXR1cm4gKF9qZGJjTG9nID09IG51bGwpID8gTm9uZUxvZ0ZhY3RvcnkuTm9uZUxvZy5nZXRJbnN0YW5jZSgpCisgICAgICAgICAgICA6IF9qZGJjTG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gd3JpdGUgSkRCQyBtZXNzYWdlcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKREJDTG9nKExvZyBsb2cpIHsKKyAgICAgICAgX2pkYmNMb2cgPSBsb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgSkRCQyBsb2dnaW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNKREJDRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChfamRiY0xvZyAhPSBudWxsICYmIF9qZGJjTG9nLmlzVHJhY2VFbmFibGVkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gd3JpdGUgU1FMIG1lc3NhZ2VzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBMb2cgZ2V0U1FMTG9nKCkgeworICAgICAgICByZXR1cm4gKF9zcWxMb2cgPT0gbnVsbCkgPyBOb25lTG9nRmFjdG9yeS5Ob25lTG9nLmdldEluc3RhbmNlKCkKKyAgICAgICAgICAgIDogX3NxbExvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9nIHRvIHdyaXRlIFNRTCBtZXNzYWdlcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTUUxMb2coTG9nIGxvZykgeworICAgICAgICBfc3FsTG9nID0gbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIFNRTCBsb2dnaW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTUUxFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKF9zcWxMb2cgIT0gbnVsbCAmJiBfc3FsTG9nLmlzVHJhY2VFbmFibGVkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIEpEQkMgbWVzc2FnZSBvbiBiZWhhbGYgb2YgdGhlIGdpdmVuIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nSkRCQyhTdHJpbmcgbXNnLCBDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgbG9nKG1zZywgY29ubiwgX2pkYmNMb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIEpEQkMgbWVzc2FnZSBvbiBiZWhhbGYgb2YgdGhlIGdpdmVuIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nSkRCQyhTdHJpbmcgbXNnLCBsb25nIHN0YXJ0VGltZSwgQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgIGxvZyhtc2csIGNvbm4sIF9qZGJjTG9nLCBzdGFydFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIFNRTCBtZXNzYWdlIG9uIGJlaGFsZiBvZiB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2dTUUwoU3RyaW5nIG1zZywgQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgIGxvZyhtc2csIGNvbm4sIF9zcWxMb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIFNRTCBtZXNzYWdlIG9uIGJlaGFsZiBvZiB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2dTUUwoU3RyaW5nIG1zZywgbG9uZyBzdGFydFRpbWUsIENvbm5lY3Rpb24gY29ubikgeworICAgICAgICBsb2cobXNnLCBjb25uLCBfc3FsTG9nLCBzdGFydFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGxvZ2dlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBDb25uZWN0aW9uIGNvbm4sIExvZyBsb2cpIHsKKyAgICAgICAgbG9nKG1zZywgY29ubiwgbG9nLCAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gbG9nZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2csIENvbm5lY3Rpb24gY29ubiwKKyAgICAgICAgTG9nIGxvZywgbG9uZyBzdGFydFRpbWUpIHsKKyAgICAgICAgaWYgKGxvZyA9PSBudWxsIHx8ICFsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBsb25nIHRvdGFsVGltZSA9IC0xOworICAgICAgICBpZiAoc3RhcnRUaW1lICE9IC0xKQorICAgICAgICAgICAgdG90YWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMjUgKyBtc2cubGVuZ3RoKCkpOworICAgICAgICBidWYuYXBwZW5kKCI8dCAiKS5hcHBlbmQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpKTsKKyAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKGNvbm4pOworICAgICAgICBidWYuYXBwZW5kKCI+ICIpOworCisgICAgICAgIC8vIGlmIHRoZSB0aW1lICE9IC0xLCBhcHBlbmQgdGltZSBwcm9maWxpbmcgaW5mb3JtYXRpb24KKyAgICAgICAgaWYgKHRvdGFsVGltZSAhPSAtMSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlsiKS5hcHBlbmQodG90YWxUaW1lKS5hcHBlbmQoIiBtc10gIik7CisKKyAgICAgICAgYnVmLmFwcGVuZChtc2cpOworICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoImRhdGFzb3VyY2UtdHJhY2UtZGF0YSIsIGJ1Zi50b1N0cmluZygpKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlY29yYXRpbmdEYXRhU291cmNlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlY29yYXRpbmdEYXRhU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjODExNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvRGVjb3JhdGluZ0RhdGFTb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmM7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKKy8qKgorICogRGVsZWdhdGluZyBkYXRhIHNvdXJjZSB0aGF0IG1haW50YWlucyBhIGxpc3Qgb2Yge0BsaW5rIENvbm5lY3Rpb25EZWNvcmF0b3J9cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRGVjb3JhdGluZ0RhdGFTb3VyY2UgZXh0ZW5kcyBEZWxlZ2F0aW5nRGF0YVNvdXJjZSB7CisKKyAgICBwcml2YXRlIExpc3QgX2RlY29yYXRvcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3QoKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgd3JhcHBlZCBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVjb3JhdGluZ0RhdGFTb3VyY2UoRGF0YVNvdXJjZSBkcykgeworICAgICAgICBzdXBlcihkcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgY29ubmVjdGlvbiBkZWNvcmF0b3JzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUKKyAgICAgKiBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXREZWNvcmF0b3JzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihfZGVjb3JhdG9ycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgY29ubmVjdGlvbiBkZWNvcmF0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVjb3JhdG9yKENvbm5lY3Rpb25EZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisgICAgICAgIGlmIChkZWNvcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBtdWx0aXBsZSBjb25uZWN0aW9uIGRlY29yYXRvcnMgZWZmaWNpZW50bHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVjb3JhdG9ycyhDb2xsZWN0aW9uIGRlY29yYXRvcnMpIHsKKyAgICAgICAgaWYgKGRlY29yYXRvcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWNvcmF0b3JzLmFkZEFsbChkZWNvcmF0b3JzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjb25uZWN0aW9uIGRlY29yYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVEZWNvcmF0b3IoQ29ubmVjdGlvbkRlY29yYXRvciBkZWNvcmF0b3IpIHsKKyAgICAgICAgcmV0dXJuIF9kZWNvcmF0b3JzLnJlbW92ZShkZWNvcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFsbCBkZWNvcmF0b3JzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyRGVjb3JhdG9ycygpIHsKKyAgICAgICAgX2RlY29yYXRvcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubiA9IHN1cGVyLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIGRlY29yYXRlKGNvbm4pOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gc3VwZXIuZ2V0Q29ubmVjdGlvbih1c2VyLCBwYXNzKTsKKyAgICAgICAgcmV0dXJuIGRlY29yYXRlKGNvbm4pOworICAgIH0KKworICAgIHByaXZhdGUgQ29ubmVjdGlvbiBkZWNvcmF0ZShDb25uZWN0aW9uIGNvbm4pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAoIV9kZWNvcmF0b3JzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2RlY29yYXRvcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgY29ubiA9ICgoQ29ubmVjdGlvbkRlY29yYXRvcikgaXRyLm5leHQoKSkuZGVjb3JhdGUoY29ubik7CisgICAgICAgIHJldHVybiBjb25uOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdDYWxsYWJsZVN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzU2OTYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdDYWxsYWJsZVN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNzk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc3FsLkFycmF5OworaW1wb3J0IGphdmEuc3FsLkJsb2I7CitpbXBvcnQgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuQ2xvYjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRhdGU7CitpbXBvcnQgamF2YS5zcWwuUGFyYW1ldGVyTWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuUmVmOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICoge0BsaW5rIENhbGxhYmxlU3RhdGVtZW50fSB0aGF0IGRlbGVnYXRlcyB0byBhbiBpbnRlcm5hbCBzdGF0ZW1lbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdDYWxsYWJsZVN0YXRlbWVudAorICAgIGltcGxlbWVudHMgQ2FsbGFibGVTdGF0ZW1lbnQsIENsb3NlYWJsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIENhbGxhYmxlU3RhdGVtZW50IF9zdG1udDsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdDYWxsYWJsZVN0YXRlbWVudCBfZGVsOworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbiBfY29ubjsKKworICAgIHB1YmxpYyBEZWxlZ2F0aW5nQ2FsbGFibGVTdGF0ZW1lbnQoQ2FsbGFibGVTdGF0ZW1lbnQgc3RtbnQsCisgICAgICAgIENvbm5lY3Rpb24gY29ubikgeworICAgICAgICBfY29ubiA9IGNvbm47CisgICAgICAgIF9zdG1udCA9IHN0bW50OworICAgICAgICBpZiAoX3N0bW50IGluc3RhbmNlb2YgRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50KQorICAgICAgICAgICAgX2RlbCA9IChEZWxlZ2F0aW5nQ2FsbGFibGVTdGF0ZW1lbnQpIF9zdG1udDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RlbCA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXN1bHRTZXQgd3JhcFJlc3VsdChib29sZWFuIHdyYXAsIFJlc3VsdFNldCBycykgeworICAgICAgICBpZiAoIXdyYXApCisgICAgICAgICAgICByZXR1cm4gcnM7CisKKyAgICAgICAgLy8gbmV2ZXIgd3JhcCBudWxsCisgICAgICAgIGlmIChycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIG5ldyBEZWxlZ2F0aW5nUmVzdWx0U2V0KHJzLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdyYXBwZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBDYWxsYWJsZVN0YXRlbWVudCBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJhc2UgdW5kZXJseWluZyBkYXRhIHN0b3JlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FsbGFibGVTdGF0ZW1lbnQgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiAoX2RlbCA9PSBudWxsKSA/IF9zdG1udCA6IF9kZWwuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50KQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdDYWxsYWJsZVN0YXRlbWVudCkgb3RoZXIpLgorICAgICAgICAgICAgICAgIGdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoInByZXBzdG1udCAiKS5hcHBlbmQoaGFzaENvZGUoKSk7CisgICAgICAgIGFwcGVuZEluZm8oYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZEluZm8oU3RyaW5nQnVmZmVyIGJ1ZikgeworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgX2RlbC5hcHBlbmRJbmZvKGJ1Zik7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleGVjdXRlUXVlcnkodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcXVlcnksIHdpdGggdGhlIG9wdGlvbiBvZiBub3Qgd3JhcHBpbmcgaXQgaW4gYQorICAgICAqIHtAbGluayBEZWxlZ2F0aW5nUmVzdWx0U2V0fSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzOworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgcnMgPSBfZGVsLmV4ZWN1dGVRdWVyeShzcWwsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnMgPSBfc3RtbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisKKyAgICAgICAgcmV0dXJuIHdyYXBSZXN1bHQod3JhcCwgcnMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3RyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlVXBkYXRlKHN0cik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgc3RyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlKHN0cik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhGaWVsZFNpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRNYXhGaWVsZFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhGaWVsZFNpemUoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0TWF4RmllbGRTaXplKGkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4Um93cygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldE1heFJvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhSb3dzKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE1heFJvd3MoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXNjYXBlUHJvY2Vzc2luZyhib29sZWFuIGJvb2wpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0RXNjYXBlUHJvY2Vzc2luZyhib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFF1ZXJ5VGltZW91dCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFF1ZXJ5VGltZW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRRdWVyeVRpbWVvdXQoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5jYW5jZWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMV2FybmluZyBnZXRXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFdhcm5pbmdzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuY2xlYXJXYXJuaW5ncygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1cnNvck5hbWUoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRDdXJzb3JOYW1lKHN0cik7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRSZXN1bHRTZXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFJlc3VsdFNldCh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxhc3QgcmVzdWx0IHNldCwgd2l0aCB0aGUgb3B0aW9uIG9mIG5vdCB3cmFwcGluZyBpdCBpbiBhCisgICAgICoge0BsaW5rIERlbGVnYXRpbmdSZXN1bHRTZXR9LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGdldFJlc3VsdFNldChib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSZXN1bHRTZXQgcnM7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBycyA9IF9kZWwuZ2V0UmVzdWx0U2V0KGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnMgPSBfc3RtbnQuZ2V0UmVzdWx0U2V0KCk7CisKKyAgICAgICAgcmV0dXJuIHdyYXBSZXN1bHQod3JhcCwgcnMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VXBkYXRlQ291bnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRVcGRhdGVDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldE1vcmVSZXN1bHRzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0TW9yZVJlc3VsdHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaERpcmVjdGlvbihpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRGZXRjaERpcmVjdGlvbihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoRGlyZWN0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0RmV0Y2hEaXJlY3Rpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGZXRjaFNpemUoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0RmV0Y2hTaXplKGkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hTaXplKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0RmV0Y2hTaXplKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRDb25jdXJyZW5jeSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFJlc3VsdFNldENvbmN1cnJlbmN5KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRUeXBlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0UmVzdWx0U2V0VHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJhdGNoKFN0cmluZyBzdHIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuYWRkQmF0Y2goc3RyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckJhdGNoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5jbGVhckJhdGNoKCk7CisgICAgfQorCisgICAgcHVibGljIGludFtdIGV4ZWN1dGVCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmV4ZWN1dGVCYXRjaCgpOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9jb25uOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleGVjdXRlUXVlcnkodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcXVlcnksIHdpdGggdGhlIG9wdGlvbiBvZiBub3Qgd3JhcHBpbmcgaXQgaW4gYQorICAgICAqIHtAbGluayBEZWxlZ2F0aW5nUmVzdWx0U2V0fSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzOworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgcnMgPSBfZGVsLmV4ZWN1dGVRdWVyeShmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJzID0gX3N0bW50LmV4ZWN1dGVRdWVyeSgpOworCisgICAgICAgIHJldHVybiB3cmFwUmVzdWx0KHdyYXAsIHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlVXBkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbChpbnQgaTEsIGludCBpMikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXROdWxsKGkxLCBpMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbihpbnQgaSwgYm9vbGVhbiBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEJvb2xlYW4oaSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZShpbnQgaSwgYnl0ZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEJ5dGUoaSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnQoaW50IGksIHNob3J0IHMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0U2hvcnQoaSwgcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50KGludCBpMSwgaW50IGkyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEludChpMSwgaTIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvbmcoaW50IGksIGxvbmcgbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRMb25nKGksIGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0KGludCBpLCBmbG9hdCBmKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEZsb2F0KGksIGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShpbnQgaSwgZG91YmxlIGQpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0RG91YmxlKGksIGQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWwoaW50IGksIEJpZ0RlY2ltYWwgYmQpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0QmlnRGVjaW1hbChpLCBiZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKGludCBpLCBTdHJpbmcgcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRTdHJpbmcoaSwgcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoaW50IGksIGJ5dGVbXSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEJ5dGVzKGksIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoaW50IGksIERhdGUgZCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXREYXRlKGksIGQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoaW50IGksIFRpbWUgdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRUaW1lKGksIHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChpbnQgaSwgVGltZXN0YW1wIHQpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0VGltZXN0YW1wKGksIHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFzY2lpU3RyZWFtKGludCBpMSwgSW5wdXRTdHJlYW0gaXMsIGludCBpMikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRBc2NpaVN0cmVhbShpMSwgaXMsIGkyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbmljb2RlU3RyZWFtKGludCBpMSwgSW5wdXRTdHJlYW0gaXMsIGludCBpMikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRVbmljb2RlU3RyZWFtKGkxLCBpcywgaTIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeVN0cmVhbShpbnQgaTEsIElucHV0U3RyZWFtIGlzLCBpbnQgaTIpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0QmluYXJ5U3RyZWFtKGkxLCBpcywgaTIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFyYW1ldGVycygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuY2xlYXJQYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBpMSwgT2JqZWN0IG8sIGludCBpMiwgaW50IGkzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE9iamVjdChpMSwgbywgaTIsIGkzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoaW50IGkxLCBPYmplY3QgbywgaW50IGkyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE9iamVjdChpMSwgbywgaTIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChpbnQgaSwgT2JqZWN0IG8pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0T2JqZWN0KGksIG8pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmF0Y2goKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LmFkZEJhdGNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyU3RyZWFtKGludCBpMSwgUmVhZGVyIHIsIGludCBpMikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRDaGFyYWN0ZXJTdHJlYW0oaTEsIHIsIGkyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWYoaW50IGksIFJlZiByKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldFJlZihpLCByKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCbG9iKGludCBpLCBCbG9iIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0QmxvYihpLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9iKGludCBpLCBDbG9iIGMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0Q2xvYihpLCBjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShpbnQgaSwgQXJyYXkgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRBcnJheShpLCBhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRNZXRhRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoaW50IGksIERhdGUgZCwgQ2FsZW5kYXIgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXREYXRlKGksIGQsIGMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoaW50IGksIFRpbWUgdCwgQ2FsZW5kYXIgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRUaW1lKGksIHQsIGMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChpbnQgaSwgVGltZXN0YW1wIHQsIENhbGVuZGFyIGMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0VGltZXN0YW1wKGksIHQsIGMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bGwoaW50IGkxLCBpbnQgaTIsIFN0cmluZyBzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE51bGwoaTEsIGkyLCBzKTsKKyAgICB9CisKKyAgICAvLyBKREJDIDMuMCAodW5zdXBwb3J0ZWQpIG1ldGhvZHMgZm9sbG93OyB0aGVzZSBhcmUgcmVxdWlyZWQgdG8gYmUgYWJsZQorICAgIC8vIHRvIGNvbXBpbGUgYWdhaW5zdCBKREsgMS40CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNb3JlUmVzdWx0cyhpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0R2VuZXJhdGVkS2V5cygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHMsIGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzLCBpbnRbXSBpYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgcywgU3RyaW5nW10gc2EpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzLCBpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHMsIGludFtdIGlhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgcywgU3RyaW5nW10gc2EpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldEhvbGRhYmlsaXR5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVSTChpbnQgaSwgVVJMIHVybCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXJNZXRhRGF0YSBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENhbGxhYmxlU3RhdGVtZW50IG1ldGhvZHMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPdXRQYXJhbWV0ZXIoaW50IGkxLCBpbnQgaTIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQucmVnaXN0ZXJPdXRQYXJhbWV0ZXIoaTEsIGkyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck91dFBhcmFtZXRlcihpbnQgaTEsIGludCBpMiwgaW50IGkzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnJlZ2lzdGVyT3V0UGFyYW1ldGVyKGkxLCBpMiwgaTMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdhc051bGwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC53YXNOdWxsKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFN0cmluZyhpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRCb29sZWFuKGkpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldEJ5dGUoaSk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFNob3J0KGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRTaG9ydChpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludChpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0SW50KGkpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldExvbmcoaSk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRGbG9hdChpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0RG91YmxlKGkpOworICAgIH0KKworICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoaW50IGEsIGludCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRCaWdEZWNpbWFsKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldEJ5dGVzKGkpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldERhdGUoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldERhdGUoaSk7CisgICAgfQorCisgICAgcHVibGljIFRpbWUgZ2V0VGltZShpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0VGltZShpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0VGltZXN0YW1wKGkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRPYmplY3QoaSk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0QmlnRGVjaW1hbChpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgaSwgTWFwIG0pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldE9iamVjdChpLCBtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVmIGdldFJlZihpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0UmVmKGkpOworICAgIH0KKworICAgIHB1YmxpYyBCbG9iIGdldEJsb2IoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldEJsb2IoaSk7CisgICAgfQorCisgICAgcHVibGljIENsb2IgZ2V0Q2xvYihpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0Q2xvYihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXkgZ2V0QXJyYXkoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldEFycmF5KGkpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldERhdGUoaW50IGksIENhbGVuZGFyIGMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldERhdGUoaSwgYyk7CisgICAgfQorCisgICAgcHVibGljIFRpbWUgZ2V0VGltZShpbnQgaSwgQ2FsZW5kYXIgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0VGltZShpLCBjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChpbnQgaSwgQ2FsZW5kYXIgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0VGltZXN0YW1wKGksIGMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKGludCBpMSwgaW50IGkyLCBTdHJpbmcgcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5yZWdpc3Rlck91dFBhcmFtZXRlcihpMSwgaTIsIHMpOworICAgIH0KKworICAgIC8vIEpEQkMgMy4wICh1bnN1cHBvcnRlZCkgbWV0aG9kcyBmb2xsb3c7IHRoZXNlIGFyZSByZXF1aXJlZCB0byBiZSBhYmxlCisgICAgLy8gdG8gY29tcGlsZSBhZ2FpbnN0IEpESyAxLjQKKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKFN0cmluZyBzLCBpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKFN0cmluZyBzLCBpbnQgaTEsIGludCBpMikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKFN0cmluZyBzMSwgaW50IGksIFN0cmluZyBzMikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBVUkwgZ2V0VVJMKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyBhLCBVUkwgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBVUkwgZ2V0VVJMKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbChTdHJpbmcgYSwgaW50IGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKFN0cmluZyBhLCBib29sZWFuIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlKFN0cmluZyBhLCBieXRlIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChTdHJpbmcgYSwgc2hvcnQgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludChTdHJpbmcgYSwgaW50IGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb25nKFN0cmluZyBhLCBsb25nIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdChTdHJpbmcgYSwgZmxvYXQgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZShTdHJpbmcgYSwgZG91YmxlIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKFN0cmluZyBhLCBCaWdEZWNpbWFsIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoU3RyaW5nIGEsIGJ5dGVbXSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgYSwgRGF0ZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZShTdHJpbmcgYSwgVGltZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFN0cmluZyBhLCBUaW1lc3RhbXAgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFzY2lpU3RyZWFtKFN0cmluZyBhLCBJbnB1dFN0cmVhbSBiLCBpbnQgYykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeVN0cmVhbShTdHJpbmcgYSwgSW5wdXRTdHJlYW0gYiwgaW50IGMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoU3RyaW5nIGEsIE9iamVjdCBiLCBpbnQgYywgaW50IGQpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoU3RyaW5nIGEsIE9iamVjdCBiLCBpbnQgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChTdHJpbmcgYSwgT2JqZWN0IGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oU3RyaW5nIGEsIFJlYWRlciBiLCBpbnQgYykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIGEsIERhdGUgYiwgQ2FsZW5kYXIgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoU3RyaW5nIGEsIFRpbWUgYiwgQ2FsZW5kYXIgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgYSwgVGltZXN0YW1wIGIsIENhbGVuZGFyIGMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsKFN0cmluZyBhLCBpbnQgYiwgU3RyaW5nIGMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFNob3J0KFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZShTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcChTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBhLCBNYXAgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBSZWYgZ2V0UmVmKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEJsb2IgZ2V0QmxvYihTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBDbG9iIGdldENsb2IoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXkgZ2V0QXJyYXkoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKFN0cmluZyBhLCBDYWxlbmRhciBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFRpbWUgZ2V0VGltZShTdHJpbmcgYSwgQ2FsZW5kYXIgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKFN0cmluZyBhLCBDYWxlbmRhciBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nQ29ubmVjdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nQ29ubmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmJiZDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSw1ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc3FsLkNhbGxhYmxlU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKK2ltcG9ydCBqYXZhLnNxbC5TYXZlcG9pbnQ7CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb24uTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhbiBleGlzdGluZyBjb25uZWN0aW9uLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGUKKyAqIG1ldGhvZHMgd2hvc2UgYmVoYXZpb3IgdGhleSBtZWFuIHRvIGNoYW5nZS4gVGhlIDxjb2RlPmVxdWFsczwvY29kZT4gYW5kCisgKiA8Y29kZT5oYXNoQ29kZTwvY29kZT4gbWV0aG9kcyBwYXNzIHRocm91Z2ggdG8gdGhlIGJhc2UgdW5kZXJseWluZyBkYXRhCisgKiBzdG9yZSBjb25uZWN0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nQ29ubmVjdGlvbiBpbXBsZW1lbnRzIENvbm5lY3Rpb24sIENsb3NlYWJsZSB7CisKKyAgICAvLyBqZGJjIDMgbWV0aG9kIGtleXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgU0VUX0hPTERBQklMSVRZID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBHRVRfSE9MREFCSUxJVFkgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFNFVF9TQVZFUE9JTlRfTk9OQU1FID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBTRVRfU0FWRVBPSU5UID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBST0xMQkFDS19TQVZFUE9JTlQgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTEVBU0VfU0FWRVBPSU5UID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBDUkVBVEVfU1RBVEVNRU5UID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVQQVJFX1NUQVRFTUVOVCA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgUFJFUEFSRV9DQUxMID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVQQVJFX1dJVEhfS0VZUyA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgUFJFUEFSRV9XSVRIX0lOREVYID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVQQVJFX1dJVEhfTkFNRVMgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChEZWxlZ2F0aW5nQ29ubmVjdGlvbi5jbGFzcyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgX2pkYmMzOworCisgICAgc3RhdGljIHsKKyAgICAgICAgYm9vbGVhbiBqZGJjMyA9IGZhbHNlOworICAgICAgICBNZXRob2QgbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtID0gQ29ubmVjdGlvbi5jbGFzcy5nZXRNZXRob2QoInNldFNhdmVwb2ludCIsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IFN0cmluZy5jbGFzcyB9KTsKKyAgICAgICAgICAgIGpkYmMzID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqZGJjMykgeworICAgICAgICAgICAgX2pkYmMzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIF9qZGJjMy5wdXQoU0VUX1NBVkVQT0lOVCwgbSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX2pkYmMzID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb24gX2Nvbm47CisgICAgcHJpdmF0ZSBmaW5hbCBEZWxlZ2F0aW5nQ29ubmVjdGlvbiBfZGVsOworCisgICAgcHVibGljIERlbGVnYXRpbmdDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubikgeworICAgICAgICBfY29ubiA9IGNvbm47CisgICAgICAgIGlmIChjb25uIGluc3RhbmNlb2YgRGVsZWdhdGluZ0Nvbm5lY3Rpb24pCisgICAgICAgICAgICBfZGVsID0gKERlbGVnYXRpbmdDb25uZWN0aW9uKSBfY29ubjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RlbCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB3cmFwcGVkIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfY29ubjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJhc2UgdW5kZXJseWluZyBkYXRhIHN0b3JlIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiAoX2RlbCA9PSBudWxsKSA/IF9jb25uIDogX2RlbC5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nQ29ubmVjdGlvbikKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nQ29ubmVjdGlvbikgb3RoZXIpLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoImNvbm4gIikuYXBwZW5kKGhhc2hDb2RlKCkpOworICAgICAgICBhcHBlbmRJbmZvKGJ1Zik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRJbmZvKFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWwuYXBwZW5kSW5mbyhidWYpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVTdGF0ZW1lbnQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc3RhdGVtZW50LCB3aXRoIHRoZSBvcHRpb24gb2Ygbm90IHdyYXBwaW5nIGl0IGluIGEKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGluZ1N0YXRlbWVudH0sIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRlbWVudCBzdG1udDsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHN0bW50ID0gX2RlbC5jcmVhdGVTdGF0ZW1lbnQoZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG1udCA9IF9jb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgICBpZiAod3JhcCkKKyAgICAgICAgICAgIHN0bW50ID0gbmV3IERlbGVnYXRpbmdTdGF0ZW1lbnQoc3RtbnQsIHRoaXMpOworICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgfQorCisgICAgcHVibGljIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVwYXJlU3RhdGVtZW50KHN0ciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSBhIHN0YXRlbWVudCwgd2l0aCB0aGUgb3B0aW9uIG9mIG5vdCB3cmFwcGluZyBpdCBpbiBhCisgICAgICoge0BsaW5rIERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudH0sIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzdHIsIGJvb2xlYW4gd3JhcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50OworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgc3RtbnQgPSBfZGVsLnByZXBhcmVTdGF0ZW1lbnQoc3RyLCBmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0bW50ID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChzdHIpOworICAgICAgICBpZiAod3JhcCkKKyAgICAgICAgICAgIHN0bW50ID0gbmV3IERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudChzdG1udCwgdGhpcyk7CisgICAgICAgIHJldHVybiBzdG1udDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVwYXJlQ2FsbChzdHIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgYSBjYWxsLCB3aXRoIHRoZSBvcHRpb24gb2Ygbm90IHdyYXBwaW5nIGl0IGluIGEKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50fSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENhbGxhYmxlU3RhdGVtZW50IHByZXBhcmVDYWxsKFN0cmluZyBzdHIsIGJvb2xlYW4gd3JhcCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENhbGxhYmxlU3RhdGVtZW50IHN0bW50OworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgc3RtbnQgPSBfZGVsLnByZXBhcmVDYWxsKHN0ciwgZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG1udCA9IF9jb25uLnByZXBhcmVDYWxsKHN0cik7CisgICAgICAgIGlmICh3cmFwKQorICAgICAgICAgICAgc3RtbnQgPSBuZXcgRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50KHN0bW50LCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHN0bW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbmF0aXZlU1FMKFN0cmluZyBzdHIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2Nvbm4ubmF0aXZlU1FMKHN0cik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0NvbW1pdChib29sZWFuIGJvb2wpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfY29ubi5zZXRBdXRvQ29tbWl0KGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEF1dG9Db21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9jb25uLmdldEF1dG9Db21taXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX2Nvbm4uY29tbWl0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX2Nvbm4ucm9sbGJhY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfY29ubi5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfY29ubi5pc0Nsb3NlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhYmFzZU1ldGFEYXRhIGdldE1ldGFEYXRhKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRNZXRhRGF0YSh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1ldGFkYXRhLCB3aXRoIHRoZSBvcHRpb24gb2Ygbm90IHdyYXBwaW5nIGl0IGluIGEKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGF9LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGF0YWJhc2VNZXRhRGF0YSBnZXRNZXRhRGF0YShib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBEYXRhYmFzZU1ldGFEYXRhIG1ldGE7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBtZXRhID0gX2RlbC5nZXRNZXRhRGF0YShmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1ldGEgPSBfY29ubi5nZXRNZXRhRGF0YSgpOworICAgICAgICBpZiAod3JhcCkKKyAgICAgICAgICAgIG1ldGEgPSBuZXcgRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEobWV0YSwgdGhpcyk7CisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gYm9vbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9jb25uLnNldFJlYWRPbmx5KGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9jb25uLmlzUmVhZE9ubHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBzdHIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfY29ubi5zZXRDYXRhbG9nKHN0cik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfY29ubi5nZXRDYXRhbG9nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfY29ubi5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfY29ubi5nZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTUUxXYXJuaW5nIGdldFdhcm5pbmdzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfY29ubi5nZXRXYXJuaW5ncygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX2Nvbm4uY2xlYXJXYXJuaW5ncygpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGludCB0eXBlLCBpbnQgY29uY3VyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRlbWVudCh0eXBlLCBjb25jdXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0YXRlbWVudCwgd2l0aCB0aGUgb3B0aW9uIG9mIG5vdCB3cmFwcGluZyBpdCBpbiBhCisgICAgICoge0BsaW5rIERlbGVnYXRpbmdTdGF0ZW1lbnR9LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudChpbnQgdHlwZSwgaW50IGNvbmN1ciwgYm9vbGVhbiB3cmFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGVtZW50IHN0bW50OworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgc3RtbnQgPSBfZGVsLmNyZWF0ZVN0YXRlbWVudCh0eXBlLCBjb25jdXIsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RtbnQgPSBfY29ubi5jcmVhdGVTdGF0ZW1lbnQodHlwZSwgY29uY3VyKTsKKyAgICAgICAgaWYgKHdyYXApCisgICAgICAgICAgICBzdG1udCA9IG5ldyBEZWxlZ2F0aW5nU3RhdGVtZW50KHN0bW50LCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHN0bW50OworICAgIH0KKworICAgIHB1YmxpYyBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzdHIsIGludCB0eXBlLCBpbnQgY29uY3VyKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByZXBhcmVTdGF0ZW1lbnQoc3RyLCB0eXBlLCBjb25jdXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgYSBzdGF0ZW1lbnQsIHdpdGggdGhlIG9wdGlvbiBvZiBub3Qgd3JhcHBpbmcgaXQgaW4gYQorICAgICAqIHtAbGluayBEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnR9LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3RyLCBpbnQgdHlwZSwKKyAgICAgICAgaW50IGNvbmN1ciwgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQ7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBzdG1udCA9IF9kZWwucHJlcGFyZVN0YXRlbWVudChzdHIsIHR5cGUsIGNvbmN1ciwgZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG1udCA9IF9jb25uLnByZXBhcmVTdGF0ZW1lbnQoc3RyLCB0eXBlLCBjb25jdXIpOworICAgICAgICBpZiAod3JhcCkKKyAgICAgICAgICAgIHN0bW50ID0gbmV3IERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudChzdG1udCwgdGhpcyk7CisgICAgICAgIHJldHVybiBzdG1udDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoU3RyaW5nIHN0ciwgaW50IHR5cGUsIGludCBjb25jdXIpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlcGFyZUNhbGwoc3RyLCB0eXBlLCBjb25jdXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgYSBjYWxsLCB3aXRoIHRoZSBvcHRpb24gb2Ygbm90IHdyYXBwaW5nIGl0IGluIGEKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50fSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENhbGxhYmxlU3RhdGVtZW50IHByZXBhcmVDYWxsKFN0cmluZyBzdHIsIGludCB0eXBlLCBpbnQgY29uY3VyLAorICAgICAgICBib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDYWxsYWJsZVN0YXRlbWVudCBzdG1udDsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHN0bW50ID0gX2RlbC5wcmVwYXJlQ2FsbChzdHIsIHR5cGUsIGNvbmN1ciwgZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG1udCA9IF9jb25uLnByZXBhcmVDYWxsKHN0ciwgdHlwZSwgY29uY3VyKTsKKyAgICAgICAgaWYgKHdyYXApCisgICAgICAgICAgICBzdG1udCA9IG5ldyBEZWxlZ2F0aW5nQ2FsbGFibGVTdGF0ZW1lbnQoc3RtbnQsIHRoaXMpOworICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgfQorCisgICAgcHVibGljIE1hcCBnZXRUeXBlTWFwKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfY29ubi5nZXRUeXBlTWFwKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZU1hcChNYXAgbWFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX2Nvbm4uc2V0VHlwZU1hcChtYXApOworICAgIH0KKworICAgIC8vIEpEQkMgMy4wIG1ldGhvZHMgZm9sbG93OyB0aGVzZSBhcmUgcmVxdWlyZWQgdG8gYmUgYWJsZSB0bworICAgIC8vIGNvbXBpbGUgYWdhaW5zdCBKREsgMS40OyB0aGVzZSBtZXRob2RzIHdpbGwgbm90IHdvcmsgb24KKyAgICAvLyBwcmV2aW91cyBKVk1zCisKKyAgICBwdWJsaWMgdm9pZCBzZXRIb2xkYWJpbGl0eShpbnQgaG9sZGFiaWxpdHkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRKREJDMygpOworICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIF9qZGJjMy5nZXQoU0VUX0hPTERBQklMSVRZKTsKKyAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgIG0gPSBjcmVhdGVKREJDM01ldGhvZChTRVRfSE9MREFCSUxJVFksICJzZXRIb2xkYWJpbGl0eSIsCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IGludC5jbGFzcyB9KTsKKyAgICAgICAgaW52b2tlSkRCQzMobSwgbmV3IE9iamVjdFtdeyBOdW1iZXJzLnZhbHVlT2YoaG9sZGFiaWxpdHkpIH0pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SG9sZGFiaWxpdHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0SkRCQzMoKTsKKyAgICAgICAgTWV0aG9kIG0gPSAoTWV0aG9kKSBfamRiYzMuZ2V0KEdFVF9IT0xEQUJJTElUWSk7CisgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoR0VUX0hPTERBQklMSVRZLCAiZ2V0SG9sZGFiaWxpdHkiLCBudWxsKTsKKyAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBpbnZva2VKREJDMyhtLCBudWxsKSkuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2F2ZXBvaW50IHNldFNhdmVwb2ludCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRKREJDMygpOworICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIF9qZGJjMy5nZXQoU0VUX1NBVkVQT0lOVF9OT05BTUUpOworICAgICAgICBpZiAobSA9PSBudWxsKQorICAgICAgICAgICAgbSA9IGNyZWF0ZUpEQkMzTWV0aG9kKFNFVF9TQVZFUE9JTlRfTk9OQU1FLCAic2V0U2F2ZXBvaW50IiwgbnVsbCk7CisgICAgICAgIHJldHVybiAoU2F2ZXBvaW50KSBpbnZva2VKREJDMyhtLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2F2ZXBvaW50IHNldFNhdmVwb2ludChTdHJpbmcgc2F2ZXBvaW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0SkRCQzMoKTsKKyAgICAgICAgTWV0aG9kIG0gPSAoTWV0aG9kKSBfamRiYzMuZ2V0KFNFVF9TQVZFUE9JTlQpOworICAgICAgICBpZiAobSA9PSBudWxsKQorICAgICAgICAgICAgbSA9IGNyZWF0ZUpEQkMzTWV0aG9kKFNFVF9TQVZFUE9JTlQsICJzZXRTYXZlcG9pbnQiLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBTdHJpbmcuY2xhc3MgfSk7CisgICAgICAgIHJldHVybiAoU2F2ZXBvaW50KSBpbnZva2VKREJDMyhtLCBuZXcgT2JqZWN0W117IHNhdmVwb2ludCB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhTYXZlcG9pbnQgc2F2ZXBvaW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0SkRCQzMoKTsKKyAgICAgICAgTWV0aG9kIG0gPSAoTWV0aG9kKSBfamRiYzMuZ2V0KFJPTExCQUNLX1NBVkVQT0lOVCk7CisgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoUk9MTEJBQ0tfU0FWRVBPSU5ULCAicm9sbGJhY2siLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBTYXZlcG9pbnQuY2xhc3MgfSk7CisgICAgICAgIGludm9rZUpEQkMzKG0sIG5ldyBPYmplY3RbXXsgc2F2ZXBvaW50IH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VTYXZlcG9pbnQoU2F2ZXBvaW50IHNhdmVwb2ludCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpEQkMzKCk7CisgICAgICAgIE1ldGhvZCBtID0gKE1ldGhvZCkgX2pkYmMzLmdldChSRUxFQVNFX1NBVkVQT0lOVCk7CisgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoUkVMRUFTRV9TQVZFUE9JTlQsICJyZWxlYXNlU2F2ZXBvaW50IiwKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgU2F2ZXBvaW50LmNsYXNzIH0pOworICAgICAgICBpbnZva2VKREJDMyhtLCBuZXcgT2JqZWN0W117IHNhdmVwb2ludCB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudChpbnQgcmVzdWx0U2V0VHlwZSwKKyAgICAgICAgaW50IHJlc3VsdFNldENvbmN1cnJlbmN5LCBpbnQgcmVzdWx0U2V0SG9sZGFiaWxpdHkpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRKREJDMygpOworICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGVtZW50KHJlc3VsdFNldFR5cGUsIHJlc3VsdFNldENvbmN1cnJlbmN5LAorICAgICAgICAgICAgcmVzdWx0U2V0SG9sZGFiaWxpdHksIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGludCByZXN1bHRTZXRUeXBlLAorICAgICAgICBpbnQgcmVzdWx0U2V0Q29uY3VycmVuY3ksIGludCByZXN1bHRTZXRIb2xkYWJpbGl0eSwgYm9vbGVhbiB3cmFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGVtZW50IHN0bW50OworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgc3RtbnQgPSBfZGVsLmNyZWF0ZVN0YXRlbWVudChyZXN1bHRTZXRUeXBlLCByZXN1bHRTZXRDb25jdXJyZW5jeSwKKyAgICAgICAgICAgICAgICByZXN1bHRTZXRIb2xkYWJpbGl0eSwgZmFsc2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE1ldGhvZCBtID0gKE1ldGhvZCkgX2pkYmMzLmdldChDUkVBVEVfU1RBVEVNRU5UKTsKKyAgICAgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICAgICAgbSA9IGNyZWF0ZUpEQkMzTWV0aG9kKENSRUFURV9TVEFURU1FTlQsICJjcmVhdGVTdGF0ZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgaW50LmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgIHN0bW50ID0gKFN0YXRlbWVudCkgaW52b2tlSkRCQzMobSwgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgIE51bWJlcnMudmFsdWVPZihyZXN1bHRTZXRUeXBlKSwKKyAgICAgICAgICAgICAgICBOdW1iZXJzLnZhbHVlT2YocmVzdWx0U2V0Q29uY3VycmVuY3kpLAorICAgICAgICAgICAgICAgIE51bWJlcnMudmFsdWVPZihyZXN1bHRTZXRIb2xkYWJpbGl0eSkgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyYXApCisgICAgICAgICAgICBzdG1udCA9IG5ldyBEZWxlZ2F0aW5nU3RhdGVtZW50KHN0bW50LCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHN0bW50OworICAgIH0KKworICAgIHB1YmxpYyBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsCisgICAgICAgIGludCByZXN1bHRTZXRUeXBlLCBpbnQgcmVzdWx0U2V0Q29uY3VycmVuY3ksIGludCByZXN1bHRTZXRIb2xkYWJpbGl0eSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpEQkMzKCk7CisgICAgICAgIHJldHVybiBwcmVwYXJlU3RhdGVtZW50KHNxbCwgcmVzdWx0U2V0VHlwZSwgcmVzdWx0U2V0Q29uY3VycmVuY3ksCisgICAgICAgICAgICByZXN1bHRTZXRIb2xkYWJpbGl0eSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwKKyAgICAgICAgaW50IHJlc3VsdFNldFR5cGUsIGludCByZXN1bHRTZXRDb25jdXJyZW5jeSwgaW50IHJlc3VsdFNldEhvbGRhYmlsaXR5LAorICAgICAgICBib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udDsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHN0bW50ID0gX2RlbC5wcmVwYXJlU3RhdGVtZW50KHNxbCwgcmVzdWx0U2V0VHlwZSwKKyAgICAgICAgICAgICAgICByZXN1bHRTZXRDb25jdXJyZW5jeSwgcmVzdWx0U2V0SG9sZGFiaWxpdHksIGZhbHNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIF9qZGJjMy5nZXQoUFJFUEFSRV9TVEFURU1FTlQpOworICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoUFJFUEFSRV9TVEFURU1FTlQsICJwcmVwYXJlU3RhdGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IFN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MgfSk7CisgICAgICAgICAgICBzdG1udCA9IChQcmVwYXJlZFN0YXRlbWVudCkgaW52b2tlSkRCQzMobSwgbmV3IE9iamVjdFtdeyBzcWwsCisgICAgICAgICAgICAgICAgTnVtYmVycy52YWx1ZU9mKHJlc3VsdFNldFR5cGUpLAorICAgICAgICAgICAgICAgIE51bWJlcnMudmFsdWVPZihyZXN1bHRTZXRDb25jdXJyZW5jeSksCisgICAgICAgICAgICAgICAgTnVtYmVycy52YWx1ZU9mKHJlc3VsdFNldEhvbGRhYmlsaXR5KSB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JhcCkKKyAgICAgICAgICAgIHN0bW50ID0gbmV3IERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudChzdG1udCwgdGhpcyk7CisgICAgICAgIHJldHVybiBzdG1udDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoU3RyaW5nIHNxbCwKKyAgICAgICAgaW50IHJlc3VsdFNldFR5cGUsIGludCByZXN1bHRTZXRDb25jdXJyZW5jeSwgaW50IHJlc3VsdFNldEhvbGRhYmlsaXR5KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0SkRCQzMoKTsKKyAgICAgICAgcmV0dXJuIHByZXBhcmVDYWxsKHNxbCwgcmVzdWx0U2V0VHlwZSwgcmVzdWx0U2V0Q29uY3VycmVuY3ksCisgICAgICAgICAgICByZXN1bHRTZXRIb2xkYWJpbGl0eSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENhbGxhYmxlU3RhdGVtZW50IHByZXBhcmVDYWxsKFN0cmluZyBzcWwsIGludCByZXN1bHRTZXRUeXBlLAorICAgICAgICBpbnQgcmVzdWx0U2V0Q29uY3VycmVuY3ksIGludCByZXN1bHRTZXRIb2xkYWJpbGl0eSwgYm9vbGVhbiB3cmFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FsbGFibGVTdGF0ZW1lbnQgc3RtbnQ7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBzdG1udCA9IF9kZWwucHJlcGFyZUNhbGwoc3FsLCByZXN1bHRTZXRUeXBlLAorICAgICAgICAgICAgICAgIHJlc3VsdFNldENvbmN1cnJlbmN5LCByZXN1bHRTZXRIb2xkYWJpbGl0eSwgZmFsc2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE1ldGhvZCBtID0gKE1ldGhvZCkgX2pkYmMzLmdldChQUkVQQVJFX0NBTEwpOworICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoUFJFUEFSRV9DQUxMLCAicHJlcGFyZUNhbGwiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgU3RyaW5nLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyB9KTsKKyAgICAgICAgICAgIHN0bW50ID0gKENhbGxhYmxlU3RhdGVtZW50KSBpbnZva2VKREJDMyhtLCBuZXcgT2JqZWN0W117IHNxbCwKKyAgICAgICAgICAgICAgICBOdW1iZXJzLnZhbHVlT2YocmVzdWx0U2V0VHlwZSksCisgICAgICAgICAgICAgICAgTnVtYmVycy52YWx1ZU9mKHJlc3VsdFNldENvbmN1cnJlbmN5KSwKKyAgICAgICAgICAgICAgICBOdW1iZXJzLnZhbHVlT2YocmVzdWx0U2V0SG9sZGFiaWxpdHkpIH0pOworICAgICAgICB9CisgICAgICAgIGlmICh3cmFwKQorICAgICAgICAgICAgc3RtbnQgPSBuZXcgRGVsZWdhdGluZ0NhbGxhYmxlU3RhdGVtZW50KHN0bW50LCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIHN0bW50OworICAgIH0KKworICAgIHB1YmxpYyBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsIGludCBhdXRvR2VuZXJhdGVkS2V5cykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpEQkMzKCk7CisgICAgICAgIHJldHVybiBwcmVwYXJlU3RhdGVtZW50KHNxbCwgYXV0b0dlbmVyYXRlZEtleXMsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsCisgICAgICAgIGludCBhdXRvR2VuZXJhdGVkS2V5cywgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQ7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBzdG1udCA9IF9kZWwucHJlcGFyZVN0YXRlbWVudChzcWwsIGF1dG9HZW5lcmF0ZWRLZXlzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIF9qZGJjMy5nZXQoUFJFUEFSRV9XSVRIX0tFWVMpOworICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoUFJFUEFSRV9XSVRIX0tFWVMsICJwcmVwYXJlU3RhdGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IFN0cmluZy5jbGFzcywgaW50LmNsYXNzIH0pOworICAgICAgICAgICAgc3RtbnQgPSAoUHJlcGFyZWRTdGF0ZW1lbnQpIGludm9rZUpEQkMzKG0sIG5ldyBPYmplY3RbXXsgc3FsLAorICAgICAgICAgICAgICAgIE51bWJlcnMudmFsdWVPZihhdXRvR2VuZXJhdGVkS2V5cykgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyYXApCisgICAgICAgICAgICBzdG1udCA9IG5ldyBEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQoc3RtbnQsIHRoaXMpOworICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgfQorCisgICAgcHVibGljIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgaW50W10gY29sdW1uSW5kZXhlcykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpEQkMzKCk7CisgICAgICAgIHJldHVybiBwcmVwYXJlU3RhdGVtZW50KHNxbCwgY29sdW1uSW5kZXhlcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwKKyAgICAgICAgaW50W10gY29sdW1uSW5kZXhlcywgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQ7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBzdG1udCA9IF9kZWwucHJlcGFyZVN0YXRlbWVudChzcWwsIGNvbHVtbkluZGV4ZXMsIHdyYXApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE1ldGhvZCBtID0gKE1ldGhvZCkgX2pkYmMzLmdldChQUkVQQVJFX1dJVEhfSU5ERVgpOworICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtID0gY3JlYXRlSkRCQzNNZXRob2QoUFJFUEFSRV9XSVRIX0lOREVYLCAicHJlcGFyZVN0YXRlbWVudCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBTdHJpbmcuY2xhc3MsIGludFtdLmNsYXNzIH0pOworICAgICAgICAgICAgc3RtbnQgPSAoUHJlcGFyZWRTdGF0ZW1lbnQpIGludm9rZUpEQkMzKG0sIG5ldyBPYmplY3RbXXsgc3FsLAorICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ZXMgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyYXApCisgICAgICAgICAgICBzdG1udCA9IG5ldyBEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQoc3RtbnQsIHRoaXMpOworICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgfQorCisgICAgcHVibGljIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgU3RyaW5nW10gY29sdW1uTmFtZXMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBhc3NlcnRKREJDMygpOworICAgICAgICByZXR1cm4gcHJlcGFyZVN0YXRlbWVudChzcWwsIGNvbHVtbk5hbWVzLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLAorICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcywgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0SkRCQzMoKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQ7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBzdG1udCA9IF9kZWwucHJlcGFyZVN0YXRlbWVudChzcWwsIGNvbHVtbk5hbWVzLCB3cmFwKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIF9qZGJjMy5nZXQoUFJFUEFSRV9XSVRIX05BTUVTKTsKKyAgICAgICAgICAgIGlmIChtID09IG51bGwpCisgICAgICAgICAgICAgICAgbSA9IGNyZWF0ZUpEQkMzTWV0aG9kKFBSRVBBUkVfV0lUSF9OQU1FUywgInByZXBhcmVTdGF0ZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXsgU3RyaW5nLmNsYXNzLCBTdHJpbmdbXS5jbGFzcyB9KTsKKyAgICAgICAgICAgIHN0bW50ID0gKFByZXBhcmVkU3RhdGVtZW50KSBpbnZva2VKREJDMyhtLCBuZXcgT2JqZWN0W117IHNxbCwKKyAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JhcCkKKyAgICAgICAgICAgIHN0bW50ID0gbmV3IERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudChzdG1udCwgdGhpcyk7CisgICAgICAgIHJldHVybiBzdG1udDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEpEQkMzKCkgeworICAgICAgICBpZiAoX2pkYmMzID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1qZGJjMyIpCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlSkRCQzMoTWV0aG9kIG0sIE9iamVjdFtdIGFyZ3MpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG0uaW52b2tlKF9jb25uLCBhcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgU1FMRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93KFNRTEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgIHRocm93IG5ldyBOZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb24oX2xvYy5nZXQoImludm9rZS1qZGJjMyIpCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSwgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgY3JlYXRlSkRCQzNNZXRob2QoT2JqZWN0IGtleSwgU3RyaW5nIG5hbWUsCisgICAgICAgIENsYXNzW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG0gPSBDb25uZWN0aW9uLmNsYXNzLmdldE1ldGhvZChuYW1lLCBhcmdzKTsKKyAgICAgICAgICAgIF9qZGJjMy5wdXQoa2V5LCBtKTsKKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbihfbG9jLmdldCgiZXJyb3ItamRiYzMiKQorICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCksIHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nRGF0YVNvdXJjZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nRGF0YVNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmJhNmUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdEYXRhU291cmNlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICogV3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZGF0YSBzb3VyY2UuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoZQorICogbWV0aG9kcyB3aG9zZSBiZWhhdmlvciB0aGV5IG1lYW4gdG8gY2hhbmdlLiBUaGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBhbmQKKyAqIDxjb2RlPmhhc2hDb2RlPC9jb2RlPiBtZXRob2RzIHBhc3MgdGhyb3VnaCB0byB0aGUgYmFzZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdEYXRhU291cmNlIGltcGxlbWVudHMgRGF0YVNvdXJjZSwgQ2xvc2VhYmxlIHsKKworICAgIHByaXZhdGUgZmluYWwgRGF0YVNvdXJjZSBfZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBEZWxlZ2F0aW5nRGF0YVNvdXJjZSBfZGVsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSB3cmFwcGVkIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBEZWxlZ2F0aW5nRGF0YVNvdXJjZShEYXRhU291cmNlIGRzKSB7CisgICAgICAgIF9kcyA9IGRzOworCisgICAgICAgIGlmIChfZHMgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nRGF0YVNvdXJjZSkKKyAgICAgICAgICAgIF9kZWwgPSAoRGVsZWdhdGluZ0RhdGFTb3VyY2UpIF9kczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RlbCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB3cmFwcGVkIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlIGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX2RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5uZXItbW9zdCB3cmFwcGVkIGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhU291cmNlIGdldElubmVybW9zdERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gKF9kZWwgPT0gbnVsbCkgPyBfZHMgOiBfZGVsLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdEYXRhU291cmNlKQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdEYXRhU291cmNlKSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuZXF1YWxzKG90aGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiZGF0YXNvdXJjZSAiKS4gYXBwZW5kKGhhc2hDb2RlKCkpOworICAgICAgICBhcHBlbmRJbmZvKGJ1Zik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRJbmZvKFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWwuYXBwZW5kSW5mbyhidWYpOworICAgIH0KKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRMb2dXcml0ZXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9kcy5nZXRMb2dXcml0ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dXcml0ZXIoUHJpbnRXcml0ZXIgb3V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX2RzLnNldExvZ1dyaXRlcihvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TG9naW5UaW1lb3V0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZHMuZ2V0TG9naW5UaW1lb3V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9naW5UaW1lb3V0KGludCB0aW1lb3V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX2RzLnNldExvZ2luVGltZW91dCh0aW1lb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfZHMuZ2V0Q29ubmVjdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCAmJiBwYXNzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2RzLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIF9kcy5nZXRDb25uZWN0aW9uKHVzZXIsIHBhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZHMgaW5zdGFuY2VvZiBDbG9zZWFibGUpCisgICAgICAgICAgICAoKENsb3NlYWJsZSkgX2RzKS5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VhZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nRGF0YWJhc2VNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsNzczIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsNCisNCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsNCitpbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsNCitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0Ow0KK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247DQorDQorLyoqDQorICogV3JhcHBlciBhcm91bmQgYSBEYXRhYmFzZU1ldGFkYXRhIGluc3RhbmNlLg0KKyAqDQorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgNCisgKi8NCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEgaW1wbGVtZW50cyBEYXRhYmFzZU1ldGFEYXRhIHsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZU1ldGFEYXRhIF9tZXRhRGF0YTsNCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uIF9jb25uOw0KKw0KKyAgICBwdWJsaWMgRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEoRGF0YWJhc2VNZXRhRGF0YSBtZXRhRGF0YSwNCisgICAgICAgIENvbm5lY3Rpb24gY29ubikgew0KKyAgICAgICAgX2Nvbm4gPSBjb25uOw0KKyAgICAgICAgX21ldGFEYXRhID0gbWV0YURhdGE7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiB0aGUgYmFzZSB1bmRlcmx5aW5nIGRhdGFiYXNlIG1ldGFkYXRhLg0KKyAgICAgKi8NCisgICAgcHVibGljIERhdGFiYXNlTWV0YURhdGEgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhIGluc3RhbmNlb2YgRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEgPw0KKyAgICAgICAgICAgICgoRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEpIF9tZXRhRGF0YSkuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKQ0KKyAgICAgICAgICAgIDogX21ldGFEYXRhOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ0RhdGFiYXNlTWV0YURhdGEpDQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdEYXRhYmFzZU1ldGFEYXRhKSBvdGhlcikNCisgICAgICAgICAgICAgICAgLmdldElubmVybW9zdERlbGVnYXRlKCk7DQorICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5lcXVhbHMob3RoZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigibWV0YWRhdGEgIikuYXBwZW5kKGhhc2hDb2RlKCkpOw0KKyAgICAgICAgYnVmLmFwcGVuZCgiWyIpLmFwcGVuZChfbWV0YURhdGEudG9TdHJpbmcoKSkuYXBwZW5kKCJdIik7DQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gYWxsUHJvY2VkdXJlc0FyZUNhbGxhYmxlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmFsbFByb2NlZHVyZXNBcmVDYWxsYWJsZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGFsbFRhYmxlc0FyZVNlbGVjdGFibGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuYWxsVGFibGVzQXJlU2VsZWN0YWJsZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGRhdGFEZWZpbml0aW9uQ2F1c2VzVHJhbnNhY3Rpb25Db21taXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZGF0YURlZmluaXRpb25DYXVzZXNUcmFuc2FjdGlvbkNvbW1pdCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGRhdGFEZWZpbml0aW9uSWdub3JlZEluVHJhbnNhY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmRhdGFEZWZpbml0aW9uSWdub3JlZEluVHJhbnNhY3Rpb25zKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlc0FyZURldGVjdGVkKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZGVsZXRlc0FyZURldGVjdGVkKHR5cGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGRvZXNNYXhSb3dTaXplSW5jbHVkZUJsb2JzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmRvZXNNYXhSb3dTaXplSW5jbHVkZUJsb2JzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRCZXN0Um93SWRlbnRpZmllcihTdHJpbmcgY2F0YWxvZywNCisgICAgICAgIFN0cmluZyBzY2hlbWEsIFN0cmluZyB0YWJsZSwgaW50IHNjb3BlLCBib29sZWFuIG51bGxhYmxlKQ0KKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldEJlc3RSb3dJZGVudGlmaWVyKGNhdGFsb2csIHNjaGVtYSwNCisgICAgICAgICAgICB0YWJsZSwgc2NvcGUsIG51bGxhYmxlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldENhdGFsb2dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldENhdGFsb2dzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nU2VwYXJhdG9yKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldENhdGFsb2dTZXBhcmF0b3IoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dUZXJtKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldENhdGFsb2dUZXJtKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRDb2x1bW5Qcml2aWxlZ2VzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLA0KKyAgICAgICAgU3RyaW5nIHRhYmxlLCBTdHJpbmcgY29sdW1uTmFtZVBhdHRlcm4pIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRDb2x1bW5Qcml2aWxlZ2VzKGNhdGFsb2csIHNjaGVtYSwNCisgICAgICAgICAgICB0YWJsZSwgY29sdW1uTmFtZVBhdHRlcm4pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0Q29sdW1ucyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYVBhdHRlcm4sDQorICAgICAgICBTdHJpbmcgdGFibGVOYW1lUGF0dGVybiwgU3RyaW5nIGNvbHVtbk5hbWVQYXR0ZXJuKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0Q29sdW1ucyhjYXRhbG9nLCBzY2hlbWFQYXR0ZXJuLA0KKyAgICAgICAgICAgIHRhYmxlTmFtZVBhdHRlcm4sIGNvbHVtbk5hbWVQYXR0ZXJuKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX2Nvbm47DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRDcm9zc1JlZmVyZW5jZShTdHJpbmcgcHJpbWFyeUNhdGFsb2csDQorICAgICAgICBTdHJpbmcgcHJpbWFyeVNjaGVtYSwgU3RyaW5nIHByaW1hcnlUYWJsZSwgU3RyaW5nIGZvcmVpZ25DYXRhbG9nLA0KKyAgICAgICAgU3RyaW5nIGZvcmVpZ25TY2hlbWEsIFN0cmluZyBmb3JlaWduVGFibGUpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRDcm9zc1JlZmVyZW5jZShwcmltYXJ5Q2F0YWxvZywgcHJpbWFyeVNjaGVtYSwNCisgICAgICAgICAgICBwcmltYXJ5VGFibGUsIGZvcmVpZ25DYXRhbG9nLCBmb3JlaWduU2NoZW1hLCBmb3JlaWduVGFibGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0TmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3RWZXJzaW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRUcmFuc2FjdGlvbklzb2xhdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXREZWZhdWx0VHJhbnNhY3Rpb25Jc29sYXRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldERyaXZlck1ham9yVmVyc2lvbigpIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0RHJpdmVyTWFqb3JWZXJzaW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXREcml2ZXJNaW5vclZlcnNpb24oKSB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldERyaXZlck1pbm9yVmVyc2lvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXREcml2ZXJOYW1lKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXREcml2ZXJWZXJzaW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldERyaXZlclZlcnNpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldEV4cG9ydGVkS2V5cyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwNCisgICAgICAgIFN0cmluZyB0YWJsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldEV4cG9ydGVkS2V5cyhjYXRhbG9nLCBzY2hlbWEsIHRhYmxlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhTmFtZUNoYXJhY3RlcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0RXh0cmFOYW1lQ2hhcmFjdGVycygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllclF1b3RlU3RyaW5nKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldElkZW50aWZpZXJRdW90ZVN0cmluZygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0SW1wb3J0ZWRLZXlzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLA0KKyAgICAgICAgU3RyaW5nIHRhYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0SW1wb3J0ZWRLZXlzKGNhdGFsb2csIHNjaGVtYSwgdGFibGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0SW5kZXhJbmZvKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLA0KKyAgICAgICAgU3RyaW5nIHRhYmxlLCBib29sZWFuIHVuaXF1ZSwgYm9vbGVhbiBhcHByb3hpbWF0ZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldEluZGV4SW5mbyhjYXRhbG9nLCBzY2hlbWEsIHRhYmxlLCB1bmlxdWUsDQorICAgICAgICAgICAgYXBwcm94aW1hdGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4QmluYXJ5TGl0ZXJhbExlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhCaW5hcnlMaXRlcmFsTGVuZ3RoKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRNYXhDYXRhbG9nTmFtZUxlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhDYXRhbG9nTmFtZUxlbmd0aCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q2hhckxpdGVyYWxMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4Q2hhckxpdGVyYWxMZW5ndGgoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1heENvbHVtbk5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4Q29sdW1uTmFtZUxlbmd0aCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29sdW1uc0luR3JvdXBCeSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhDb2x1bW5zSW5Hcm91cEJ5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRNYXhDb2x1bW5zSW5JbmRleCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhDb2x1bW5zSW5JbmRleCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29sdW1uc0luT3JkZXJCeSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhDb2x1bW5zSW5PcmRlckJ5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRNYXhDb2x1bW5zSW5TZWxlY3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4Q29sdW1uc0luU2VsZWN0KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRNYXhDb2x1bW5zSW5UYWJsZSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhDb2x1bW5zSW5UYWJsZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q29ubmVjdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4Q29ubmVjdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1heEN1cnNvck5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4Q3Vyc29yTmFtZUxlbmd0aCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5kZXhMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4SW5kZXhMZW5ndGgoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1heFByb2NlZHVyZU5hbWVMZW5ndGgoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4UHJvY2VkdXJlTmFtZUxlbmd0aCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4Um93U2l6ZSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhSb3dTaXplKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRNYXhTY2hlbWFOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldE1heFNjaGVtYU5hbWVMZW5ndGgoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1heFN0YXRlbWVudExlbmd0aCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRNYXhTdGF0ZW1lbnRMZW5ndGgoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1heFN0YXRlbWVudHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4U3RhdGVtZW50cygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4VGFibGVOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldE1heFRhYmxlTmFtZUxlbmd0aCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4VGFibGVzSW5TZWxlY3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0TWF4VGFibGVzSW5TZWxlY3QoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1heFVzZXJOYW1lTGVuZ3RoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldE1heFVzZXJOYW1lTGVuZ3RoKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROdW1lcmljRnVuY3Rpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldE51bWVyaWNGdW5jdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFByaW1hcnlLZXlzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUpDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0UHJpbWFyeUtleXMoY2F0YWxvZywgc2NoZW1hLCB0YWJsZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRQcm9jZWR1cmVDb2x1bW5zKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwNCisgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lUGF0dGVybiwgU3RyaW5nIGNvbHVtbk5hbWVQYXR0ZXJuKQ0KKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFByb2NlZHVyZUNvbHVtbnMoY2F0YWxvZywgc2NoZW1hUGF0dGVybiwNCisgICAgICAgICAgICBwcm9jZWR1cmVOYW1lUGF0dGVybiwgY29sdW1uTmFtZVBhdHRlcm4pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0UHJvY2VkdXJlcyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYVBhdHRlcm4sDQorICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZVBhdHRlcm4pIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRQcm9jZWR1cmVzKGNhdGFsb2csIHNjaGVtYVBhdHRlcm4sDQorICAgICAgICAgICAgcHJvY2VkdXJlTmFtZVBhdHRlcm4pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2VkdXJlVGVybSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRQcm9jZWR1cmVUZXJtKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRTY2hlbWFzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFNjaGVtYXMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYVRlcm0oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0U2NoZW1hVGVybSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nRXNjYXBlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFNlYXJjaFN0cmluZ0VzY2FwZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U1FMS2V5d29yZHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0U1FMS2V5d29yZHMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0Z1bmN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRTdHJpbmdGdW5jdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUZ1bmN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRTeXN0ZW1GdW5jdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFRhYmxlUHJpdmlsZWdlcyhTdHJpbmcgY2F0YWxvZywNCisgICAgICAgIFN0cmluZyBzY2hlbWFQYXR0ZXJuLCBTdHJpbmcgdGFibGVOYW1lUGF0dGVybikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFRhYmxlUHJpdmlsZWdlcyhjYXRhbG9nLCBzY2hlbWFQYXR0ZXJuLA0KKyAgICAgICAgICAgIHRhYmxlTmFtZVBhdHRlcm4pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0VGFibGVzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwNCisgICAgICAgIFN0cmluZyB0YWJsZU5hbWVQYXR0ZXJuLCBTdHJpbmdbXSB0eXBlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFRhYmxlcyhjYXRhbG9nLCBzY2hlbWFQYXR0ZXJuLA0KKyAgICAgICAgICAgIHRhYmxlTmFtZVBhdHRlcm4sIHR5cGVzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFRhYmxlVHlwZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0VGFibGVUeXBlcygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZURhdGVGdW5jdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0VGltZURhdGVGdW5jdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFR5cGVJbmZvKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFR5cGVJbmZvKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRVRFRzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwNCisgICAgICAgIFN0cmluZyB0eXBlTmFtZVBhdHRlcm4sIGludFtdIHR5cGVzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0VURUcyhjYXRhbG9nLCBzY2hlbWFQYXR0ZXJuLA0KKyAgICAgICAgICAgIHR5cGVOYW1lUGF0dGVybiwgdHlwZXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldFVSTCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0VXNlck5hbWUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFZlcnNpb25Db2x1bW5zKFN0cmluZyBjYXRhbG9nLA0KKyAgICAgICAgU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuZ2V0VmVyc2lvbkNvbHVtbnMoY2F0YWxvZywgc2NoZW1hLCB0YWJsZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaW5zZXJ0c0FyZURldGVjdGVkKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuaW5zZXJ0c0FyZURldGVjdGVkKHR5cGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQ2F0YWxvZ0F0U3RhcnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuaXNDYXRhbG9nQXRTdGFydCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuaXNSZWFkT25seSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIG51bGxQbHVzTm9uTnVsbElzTnVsbCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5udWxsUGx1c05vbk51bGxJc051bGwoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBudWxsc0FyZVNvcnRlZEF0RW5kKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLm51bGxzQXJlU29ydGVkQXRFbmQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBudWxsc0FyZVNvcnRlZEF0U3RhcnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEubnVsbHNBcmVTb3J0ZWRBdFN0YXJ0KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gbnVsbHNBcmVTb3J0ZWRIaWdoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLm51bGxzQXJlU29ydGVkSGlnaCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIG51bGxzQXJlU29ydGVkTG93KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLm51bGxzQXJlU29ydGVkTG93KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gb3RoZXJzRGVsZXRlc0FyZVZpc2libGUoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5vdGhlcnNEZWxldGVzQXJlVmlzaWJsZSh0eXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBvdGhlcnNJbnNlcnRzQXJlVmlzaWJsZShpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLm90aGVyc0luc2VydHNBcmVWaXNpYmxlKHR5cGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIG90aGVyc1VwZGF0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEub3RoZXJzVXBkYXRlc0FyZVZpc2libGUodHlwZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gb3duRGVsZXRlc0FyZVZpc2libGUoaW50IHR5cGUpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5vd25EZWxldGVzQXJlVmlzaWJsZSh0eXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBvd25JbnNlcnRzQXJlVmlzaWJsZShpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLm93bkluc2VydHNBcmVWaXNpYmxlKHR5cGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIG93blVwZGF0ZXNBcmVWaXNpYmxlKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEub3duVXBkYXRlc0FyZVZpc2libGUodHlwZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9yZXNMb3dlckNhc2VRdW90ZWRJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdG9yZXNMb3dlckNhc2VRdW90ZWRJZGVudGlmaWVycygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN0b3Jlc01peGVkQ2FzZUlkZW50aWZpZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN0b3Jlc01peGVkQ2FzZUlkZW50aWZpZXJzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3RvcmVzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3RvcmVzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9yZXNVcHBlckNhc2VJZGVudGlmaWVycygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdG9yZXNVcHBlckNhc2VJZGVudGlmaWVycygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN0b3Jlc1VwcGVyQ2FzZVF1b3RlZElkZW50aWZpZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN0b3Jlc1VwcGVyQ2FzZVF1b3RlZElkZW50aWZpZXJzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbigpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c0FsdGVyVGFibGVXaXRoQWRkQ29sdW1uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNBbHRlclRhYmxlV2l0aERyb3BDb2x1bW4oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNBbHRlclRhYmxlV2l0aERyb3BDb2x1bW4oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FOU0k5MkVudHJ5TGV2ZWxTUUwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNBTlNJOTJFbnRyeUxldmVsU1FMKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNBTlNJOTJGdWxsU1FMKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQU5TSTkyRnVsbFNRTCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNCYXRjaFVwZGF0ZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNCYXRjaFVwZGF0ZXMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5EYXRhTWFuaXB1bGF0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQ2F0YWxvZ3NJbkRhdGFNYW5pcHVsYXRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5JbmRleERlZmluaXRpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQ2F0YWxvZ3NJbkluZGV4RGVmaW5pdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5Qcml2aWxlZ2VEZWZpbml0aW9ucygpDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNDYXRhbG9nc0luUHJpdmlsZWdlRGVmaW5pdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5Qcm9jZWR1cmVDYWxscygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c0NhdGFsb2dzSW5Qcm9jZWR1cmVDYWxscygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJblRhYmxlRGVmaW5pdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNDYXRhbG9nc0luVGFibGVEZWZpbml0aW9ucygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29sdW1uQWxpYXNpbmcoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNDb2x1bW5BbGlhc2luZygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udmVydCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c0NvbnZlcnQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnZlcnQoaW50IGZyb21UeXBlLCBpbnQgdG9UeXBlKQ0KKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQ29udmVydChmcm9tVHlwZSwgdG9UeXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvcmVTUUxHcmFtbWFyKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQ29yZVNRTEdyYW1tYXIoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvcnJlbGF0ZWRTdWJxdWVyaWVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzQ29ycmVsYXRlZFN1YnF1ZXJpZXMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RhdGFEZWZpbml0aW9uQW5kRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9ucygpDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGENCisgICAgICAgICAgICAuc3VwcG9ydHNEYXRhRGVmaW5pdGlvbkFuZERhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnNPbmx5KCkNCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c0RhdGFNYW5pcHVsYXRpb25UcmFuc2FjdGlvbnNPbmx5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEaWZmZXJlbnRUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKQ0KKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzRGlmZmVyZW50VGFibGVDb3JyZWxhdGlvbk5hbWVzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFeHByZXNzaW9uc0luT3JkZXJCeSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c0V4cHJlc3Npb25zSW5PcmRlckJ5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFeHRlbmRlZFNRTEdyYW1tYXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNFeHRlbmRlZFNRTEdyYW1tYXIoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Z1bGxPdXRlckpvaW5zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzRnVsbE91dGVySm9pbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0dyb3VwQnkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNHcm91cEJ5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNHcm91cEJ5QmV5b25kU2VsZWN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzR3JvdXBCeUJleW9uZFNlbGVjdCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzR3JvdXBCeVVucmVsYXRlZCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c0dyb3VwQnlVbnJlbGF0ZWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0ludGVncml0eUVuaGFuY2VtZW50RmFjaWxpdHkoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNJbnRlZ3JpdHlFbmhhbmNlbWVudEZhY2lsaXR5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMaWtlRXNjYXBlQ2xhdXNlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzTGlrZUVzY2FwZUNsYXVzZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGltaXRlZE91dGVySm9pbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNMaW1pdGVkT3V0ZXJKb2lucygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWluaW11bVNRTEdyYW1tYXIoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNNaW5pbXVtU1FMR3JhbW1hcigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWl4ZWRDYXNlSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNNaXhlZENhc2VJZGVudGlmaWVycygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlwbGVSZXN1bHRTZXRzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzTXVsdGlwbGVSZXN1bHRTZXRzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aXBsZVRyYW5zYWN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c011bHRpcGxlVHJhbnNhY3Rpb25zKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOb25OdWxsYWJsZUNvbHVtbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNOb25OdWxsYWJsZUNvbHVtbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzQ29tbWl0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NDb21taXQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzUm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNPcGVuQ3Vyc29yc0Fjcm9zc1JvbGxiYWNrKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc0NvbW1pdCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c09wZW5TdGF0ZW1lbnRzQWNyb3NzQ29tbWl0KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc1JvbGxiYWNrKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NSb2xsYmFjaygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzT3JkZXJCeVVucmVsYXRlZCgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c091dGVySm9pbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNPdXRlckpvaW5zKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQb3NpdGlvbmVkRGVsZXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzUG9zaXRpb25lZERlbGV0ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUG9zaXRpb25lZFVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c1Bvc2l0aW9uZWRVcGRhdGUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc3VsdFNldENvbmN1cnJlbmN5KGludCB0eXBlLCBpbnQgY29uY3VycmVuY3kpDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNSZXN1bHRTZXRDb25jdXJyZW5jeSh0eXBlLCBjb25jdXJyZW5jeSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZXN1bHRTZXRUeXBlKGludCB0eXBlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNSZXN1bHRTZXRUeXBlKHR5cGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NoZW1hc0luRGF0YU1hbmlwdWxhdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c1NjaGVtYXNJbkRhdGFNYW5pcHVsYXRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJbkluZGV4RGVmaW5pdGlvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNTY2hlbWFzSW5JbmRleERlZmluaXRpb25zKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5Qcml2aWxlZ2VEZWZpbml0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c1NjaGVtYXNJblByaXZpbGVnZURlZmluaXRpb25zKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5Qcm9jZWR1cmVDYWxscygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c1NjaGVtYXNJblByb2NlZHVyZUNhbGxzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5UYWJsZURlZmluaXRpb25zKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzU2NoZW1hc0luVGFibGVEZWZpbml0aW9ucygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdG9yZWRQcm9jZWR1cmVzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3VicXVlcmllc0luQ29tcGFyaXNvbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNTdWJxdWVyaWVzSW5Db21wYXJpc29ucygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3VicXVlcmllc0luRXhpc3RzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzU3VicXVlcmllc0luRXhpc3RzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5JbnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNTdWJxdWVyaWVzSW5JbnMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N1YnF1ZXJpZXNJblF1YW50aWZpZWRzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnN1cHBvcnRzU3VicXVlcmllc0luUXVhbnRpZmllZHMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lcygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lcygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHJhbnNhY3Rpb25Jc29sYXRpb25MZXZlbChpbnQgbGV2ZWwpDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNUcmFuc2FjdGlvbklzb2xhdGlvbkxldmVsKGxldmVsKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1RyYW5zYWN0aW9ucygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5zdXBwb3J0c1RyYW5zYWN0aW9ucygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVW5pb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNVbmlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVW5pb25BbGwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEuc3VwcG9ydHNVbmlvbkFsbCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZXNBcmVEZXRlY3RlZChpbnQgdHlwZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLnVwZGF0ZXNBcmVEZXRlY3RlZCh0eXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiB1c2VzTG9jYWxGaWxlUGVyVGFibGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEudXNlc0xvY2FsRmlsZVBlclRhYmxlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gdXNlc0xvY2FsRmlsZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfbWV0YURhdGEudXNlc0xvY2FsRmlsZXMoKTsNCisgICAgfQ0KKw0KKyAgICAvLyBKREJDIDMuMCBtZXRob2RzKHVuc3VwcG9ydGVkKSBmb2xsb3c7IHRoZXNlIGFyZSByZXF1aXJlZCB0byBiZSBhYmxlIHRvDQorICAgIC8vIGNvbXBpbGUgYWdhaW5zdCBKREsgMS40DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2F2ZXBvaW50cygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOYW1lZFBhcmFtZXRlcnMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlwbGVPcGVuUmVzdWx0cygpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNHZXRHZW5lcmF0ZWRLZXlzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFN1cGVyVHlwZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXIsDQorICAgICAgICBTdHJpbmcgdHlwZU5hbWVQYXR0ZXJuKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0U3VwZXJUYWJsZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXIsDQorICAgICAgICBTdHJpbmcgdGFibGVOYW1lUGF0dGVybikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldEF0dHJpYnV0ZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFQYXR0ZXIsDQorICAgICAgICBTdHJpbmcgdHlwZU5hbWVQYXR0ZXJuLCBTdHJpbmcgYXR0cmlidXRlTmFtZVBhdHRlcm4pDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVzdWx0U2V0SG9sZGFiaWxpdHkoaW50IGhvbGRhYmlsaXR5KQ0KKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldEhvbGRhYmlsaXR5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldERhdGFiYXNlTWFqb3JWZXJzaW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gX21ldGFEYXRhLmdldERhdGFiYXNlTWFqb3JWZXJzaW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXREYXRhYmFzZU1pbm9yVmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXREYXRhYmFzZU1pbm9yVmVyc2lvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0SkRCQ01ham9yVmVyc2lvbigpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9tZXRhRGF0YS5nZXRKREJDTWFqb3JWZXJzaW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRKREJDTWlub3JWZXJzaW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldFNRTFN0YXRlVHlwZSgpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gbG9jYXRvcnNVcGRhdGVDb3B5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N0YXRlbWVudFBvb2xpbmcoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorfQ0KKw0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGM5YjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc3FsLkFycmF5OworaW1wb3J0IGphdmEuc3FsLkJsb2I7CitpbXBvcnQgamF2YS5zcWwuQ2xvYjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRhdGU7CitpbXBvcnQgamF2YS5zcWwuUGFyYW1ldGVyTWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVmOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHN0YXRlbWVudC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhlCisgKiBtZXRob2RzIHdob3NlIGJlaGF2aW9yIHRoZXkgbWVhbiB0byBjaGFuZ2UuIFRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZAorICogPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZHMgcGFzcyB0aHJvdWdoIHRvIHRoZSBiYXNlIHVuZGVybHlpbmcgZGF0YQorICogc3RvcmUgc3RhdGVtZW50LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQKKyAgICBpbXBsZW1lbnRzIFByZXBhcmVkU3RhdGVtZW50LCBDbG9zZWFibGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQcmVwYXJlZFN0YXRlbWVudCBfc3RtbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBEZWxlZ2F0aW5nUHJlcGFyZWRTdGF0ZW1lbnQgX2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb24gX2Nvbm47CisKKyAgICBwdWJsaWMgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50IHN0bW50LAorICAgICAgICBDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgX2Nvbm4gPSBjb25uOworICAgICAgICBfc3RtbnQgPSBzdG1udDsKKyAgICAgICAgaWYgKF9zdG1udCBpbnN0YW5jZW9mIERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudCkKKyAgICAgICAgICAgIF9kZWwgPSAoRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50KSBfc3RtbnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kZWwgPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZXN1bHRTZXQgd3JhcFJlc3VsdChSZXN1bHRTZXQgcnMsIGJvb2xlYW4gd3JhcCkgeworICAgICAgICBpZiAoIXdyYXAgfHwgcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgcmV0dXJuIG5ldyBEZWxlZ2F0aW5nUmVzdWx0U2V0KHJzLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdyYXBwZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBQcmVwYXJlZFN0YXRlbWVudCBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJhc2UgdW5kZXJseWluZyBkYXRhIHN0b3JlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlcGFyZWRTdGF0ZW1lbnQgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiAoX2RlbCA9PSBudWxsKSA/IF9zdG1udCA6IF9kZWwuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50KQorICAgICAgICAgICAgb3RoZXIgPSAoKERlbGVnYXRpbmdQcmVwYXJlZFN0YXRlbWVudCkgb3RoZXIpLgorICAgICAgICAgICAgICAgIGdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoInByZXBzdG1udCAiKS5hcHBlbmQoaGFzaENvZGUoKSk7CisgICAgICAgIGFwcGVuZEluZm8oYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZEluZm8oU3RyaW5nQnVmZmVyIGJ1ZikgeworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgX2RlbC5hcHBlbmRJbmZvKGJ1Zik7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleGVjdXRlUXVlcnkoc3RyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBxdWVyeSwgd2l0aCB0aGUgb3B0aW9uIG9mIG5vdCB3cmFwcGluZyBpdCBpbiBhCisgICAgICoge0BsaW5rIERlbGVnYXRpbmdSZXN1bHRTZXR9LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeShTdHJpbmcgc3FsLCBib29sZWFuIHdyYXApCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSZXN1bHRTZXQgcnM7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBycyA9IF9kZWwuZXhlY3V0ZVF1ZXJ5KHNxbCwgZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBycyA9IF9zdG1udC5leGVjdXRlUXVlcnkoc3FsKTsKKyAgICAgICAgcmV0dXJuIHdyYXBSZXN1bHQocnMsIHdyYXApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3RyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlVXBkYXRlKHN0cik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgc3RyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlKHN0cik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhGaWVsZFNpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRNYXhGaWVsZFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhGaWVsZFNpemUoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0TWF4RmllbGRTaXplKGkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4Um93cygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldE1heFJvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhSb3dzKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE1heFJvd3MoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXNjYXBlUHJvY2Vzc2luZyhib29sZWFuIGJvb2wpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0RXNjYXBlUHJvY2Vzc2luZyhib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFF1ZXJ5VGltZW91dCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFF1ZXJ5VGltZW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRRdWVyeVRpbWVvdXQoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5jYW5jZWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU1FMV2FybmluZyBnZXRXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFdhcm5pbmdzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJXYXJuaW5ncygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuY2xlYXJXYXJuaW5ncygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1cnNvck5hbWUoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRDdXJzb3JOYW1lKHN0cik7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRSZXN1bHRTZXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFJlc3VsdFNldCh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxhc3QgcmVzdWx0IHNldCwgd2l0aCB0aGUgb3B0aW9uIG9mIG5vdCB3cmFwcGluZyBpdCBpbiBhCisgICAgICoge0BsaW5rIERlbGVnYXRpbmdSZXN1bHRTZXR9LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGdldFJlc3VsdFNldChib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBSZXN1bHRTZXQgcnM7CisgICAgICAgIGlmIChfZGVsICE9IG51bGwpCisgICAgICAgICAgICBycyA9IF9kZWwuZ2V0UmVzdWx0U2V0KGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnMgPSBfc3RtbnQuZ2V0UmVzdWx0U2V0KCk7CisgICAgICAgIHJldHVybiB3cmFwUmVzdWx0KHJzLCB3cmFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFVwZGF0ZUNvdW50KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0VXBkYXRlQ291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNb3JlUmVzdWx0cygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldE1vcmVSZXN1bHRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0RmV0Y2hEaXJlY3Rpb24oaSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldEZldGNoRGlyZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hTaXplKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEZldGNoU2l6ZShpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoU2l6ZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldEZldGNoU2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0Q29uY3VycmVuY3koKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRSZXN1bHRTZXRDb25jdXJyZW5jeSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0VHlwZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFJlc3VsdFNldFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCYXRjaChTdHJpbmcgc3RyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LmFkZEJhdGNoKHN0cik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuY2xlYXJCYXRjaCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnRbXSBleGVjdXRlQmF0Y2goKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5leGVjdXRlQmF0Y2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfY29ubjsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY3V0ZVF1ZXJ5KHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5LCB3aXRoIHRoZSBvcHRpb24gb2Ygbm90IHdyYXBwaW5nIGl0IGluIGEKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGluZ1Jlc3VsdFNldH0sIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3VsdFNldCByczsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHJzID0gX2RlbC5leGVjdXRlUXVlcnkoZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBycyA9IF9zdG1udC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgcmV0dXJuIHdyYXBSZXN1bHQocnMsIHdyYXApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmV4ZWN1dGVVcGRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsKGludCBpMSwgaW50IGkyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE51bGwoaTEsIGkyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGludCBpLCBib29sZWFuIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0Qm9vbGVhbihpLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlKGludCBpLCBieXRlIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0Qnl0ZShpLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydChpbnQgaSwgc2hvcnQgcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRTaG9ydChpLCBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IGkxLCBpbnQgaTIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0SW50KGkxLCBpMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9uZyhpbnQgaSwgbG9uZyBsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldExvbmcoaSwgbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoaW50IGksIGZsb2F0IGYpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0RmxvYXQoaSwgZik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKGludCBpLCBkb3VibGUgZCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXREb3VibGUoaSwgZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbChpbnQgaSwgQmlnRGVjaW1hbCBiZCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRCaWdEZWNpbWFsKGksIGJkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoaW50IGksIFN0cmluZyBzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldFN0cmluZyhpLCBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlcyhpbnQgaSwgYnl0ZVtdIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0Qnl0ZXMoaSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShpbnQgaSwgRGF0ZSBkKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldERhdGUoaSwgZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZShpbnQgaSwgVGltZSB0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldFRpbWUoaSwgdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGludCBpLCBUaW1lc3RhbXAgdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRUaW1lc3RhbXAoaSwgdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oaW50IGkxLCBJbnB1dFN0cmVhbSBpcywgaW50IGkyKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEFzY2lpU3RyZWFtKGkxLCBpcywgaTIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVuaWNvZGVTdHJlYW0oaW50IGkxLCBJbnB1dFN0cmVhbSBpcywgaW50IGkyKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldFVuaWNvZGVTdHJlYW0oaTEsIGlzLCBpMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmluYXJ5U3RyZWFtKGludCBpMSwgSW5wdXRTdHJlYW0gaXMsIGludCBpMikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRCaW5hcnlTdHJlYW0oaTEsIGlzLCBpMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5jbGVhclBhcmFtZXRlcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoaW50IGkxLCBPYmplY3QgbywgaW50IGkyLCBpbnQgaTMpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0T2JqZWN0KGkxLCBvLCBpMiwgaTMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChpbnQgaTEsIE9iamVjdCBvLCBpbnQgaTIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0T2JqZWN0KGkxLCBvLCBpMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBpLCBPYmplY3QgbykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRPYmplY3QoaSwgbyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuYWRkQmF0Y2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oaW50IGkxLCBSZWFkZXIgciwgaW50IGkyKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldENoYXJhY3RlclN0cmVhbShpMSwgciwgaTIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlZihpbnQgaSwgUmVmIHIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0UmVmKGksIHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsb2IoaW50IGksIEJsb2IgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRCbG9iKGksIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsb2IoaW50IGksIENsb2IgYykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRDbG9iKGksIGMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5KGludCBpLCBBcnJheSBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEFycmF5KGksIGEpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXRNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldE1ldGFEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShpbnQgaSwgRGF0ZSBkLCBDYWxlbmRhciBjKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldERhdGUoaSwgZCwgYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZShpbnQgaSwgVGltZSB0LCBDYWxlbmRhciBjKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldFRpbWUoaSwgdCwgYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGludCBpLCBUaW1lc3RhbXAgdCwgQ2FsZW5kYXIgYykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRUaW1lc3RhbXAoaSwgdCwgYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbChpbnQgaTEsIGludCBpMiwgU3RyaW5nIHMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0TnVsbChpMSwgaTIsIHMpOworICAgIH0KKworICAgIC8vIEpEQkMgMy4wICh1bnN1cHBvcnRlZCkgbWV0aG9kIGZvbGxvdzsgdGhlc2UgYXJlIHJlcXVpcmVkIHRvIGJlIGFibGUKKyAgICAvLyB0byBjb21waWxlIGFnYWluc3QgSkRLIDEuNAorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TW9yZVJlc3VsdHMoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0U2V0IGdldEdlbmVyYXRlZEtleXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzLCBpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgcywgaW50W10gaWEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHMsIFN0cmluZ1tdIHNhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgcywgaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzLCBpbnRbXSBpYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHMsIFN0cmluZ1tdIHNhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVUkwoaW50IGksIFVSTCB1cmwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyTWV0YURhdGEgZ2V0UGFyYW1ldGVyTWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nUmVzdWx0U2V0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdSZXN1bHRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk4NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9EZWxlZ2F0aW5nUmVzdWx0U2V0LmphdmEKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zcWwuQXJyYXk7CitpbXBvcnQgamF2YS5zcWwuQmxvYjsKK2ltcG9ydCBqYXZhLnNxbC5DbG9iOworaW1wb3J0IGphdmEuc3FsLkRhdGU7CitpbXBvcnQgamF2YS5zcWwuUmVmOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuVGltZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJlc3VsdCBzZXQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoZQorICogbWV0aG9kcyB3aG9zZSBiZWhhdmlvciB0aGV5IG1lYW4gdG8gY2hhbmdlLiBUaGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBhbmQKKyAqIDxjb2RlPmhhc2hDb2RlPC9jb2RlPiBtZXRob2RzIHBhc3MgdGhyb3VnaCB0byB0aGUgYmFzZSB1bmRlcmx5aW5nIGRhdGEKKyAqIHN0b3JlIHN0YXRlbWVudC4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1Jlc3VsdFNldCBpbXBsZW1lbnRzIFJlc3VsdFNldCwgQ2xvc2VhYmxlIHsKKworICAgIHByaXZhdGUgZmluYWwgUmVzdWx0U2V0IF9yczsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdSZXN1bHRTZXQgX2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlbWVudCBfc3RtbnQ7CisKKyAgICBwdWJsaWMgRGVsZWdhdGluZ1Jlc3VsdFNldChSZXN1bHRTZXQgcnMsIFN0YXRlbWVudCBzdG1udCkgeworICAgICAgICBpZiAocnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICBfc3RtbnQgPSBzdG1udDsKKyAgICAgICAgX3JzID0gcnM7CisgICAgICAgIGlmIChfcnMgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nUmVzdWx0U2V0KQorICAgICAgICAgICAgX2RlbCA9IChEZWxlZ2F0aW5nUmVzdWx0U2V0KSBfcnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kZWwgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd3JhcHBlZCByZXN1bHQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbm5lci1tb3N0IHdyYXBwZWQgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdFNldCBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChfZGVsID09IG51bGwpID8gX3JzIDogX2RlbC5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBfcnMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdSZXN1bHRTZXQpCisgICAgICAgICAgICBvdGhlciA9ICgoRGVsZWdhdGluZ1Jlc3VsdFNldCkgb3RoZXIpLmdldElubmVybW9zdERlbGVnYXRlKCk7CisgICAgICAgIHJldHVybiBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoInJlc3VsdHNldCAiKS5hcHBlbmQoaGFzaENvZGUoKSk7CisgICAgICAgIGFwcGVuZEluZm8oYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZEluZm8oU3RyaW5nQnVmZmVyIGJ1ZikgeworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgX2RlbC5hcHBlbmRJbmZvKGJ1Zik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbmV4dCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLm5leHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB3YXNOdWxsKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMud2FzTnVsbCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRTdHJpbmcoYSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0Qm9vbGVhbihhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRCeXRlKGEpOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0U2hvcnQoYSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnQoaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEludChhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRMb25nKGEpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0RmxvYXQoYSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldERvdWJsZShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKGludCBhLCBpbnQgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0QmlnRGVjaW1hbChhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRCeXRlcyhhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXREYXRlKGEpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lIGdldFRpbWUoaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFRpbWUoYSk7CisgICAgfQorCisgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFRpbWVzdGFtcChhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QXNjaWlTdHJlYW0oaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEFzY2lpU3RyZWFtKGEpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRVbmljb2RlU3RyZWFtKGEpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEJpbmFyeVN0cmVhbShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0U3RyaW5nKGEpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEJvb2xlYW4oYSk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZShTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0Qnl0ZShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFNob3J0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRJbnQoYSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0TG9uZyhhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEZsb2F0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXREb3VibGUoYSk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChTdHJpbmcgYSwgaW50IGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEJpZ0RlY2ltYWwoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0Qnl0ZXMoYSk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZShTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0RGF0ZShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZSBnZXRUaW1lKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRUaW1lKGEpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRUaW1lc3RhbXAoYSk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldEFzY2lpU3RyZWFtKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRBc2NpaVN0cmVhbShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0VW5pY29kZVN0cmVhbShTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0VW5pY29kZVN0cmVhbShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QmluYXJ5U3RyZWFtKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRCaW5hcnlTdHJlYW0oYSk7CisgICAgfQorCisgICAgcHVibGljIFNRTFdhcm5pbmcgZ2V0V2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRXYXJuaW5ncygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLmNsZWFyV2FybmluZ3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1cnNvck5hbWUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRDdXJzb3JOYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFNldE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0TWV0YURhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0T2JqZWN0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRPYmplY3QoYSk7CisgICAgfQorCisgICAgcHVibGljIGludCBmaW5kQ29sdW1uKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5maW5kQ29sdW1uKGEpOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRDaGFyYWN0ZXJTdHJlYW0oYSk7CisgICAgfQorCisgICAgcHVibGljIFJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldENoYXJhY3RlclN0cmVhbShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRCaWdEZWNpbWFsKGEpOworICAgIH0KKworICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEJpZ0RlY2ltYWwoYSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNCZWZvcmVGaXJzdCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmlzQmVmb3JlRmlyc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmlzQWZ0ZXJMYXN0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXJzdCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmlzRmlyc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5pc0xhc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVGaXJzdCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMuYmVmb3JlRmlyc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckxhc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLmFmdGVyTGFzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGZpcnN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZmlyc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBsYXN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMubGFzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Um93KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0Um93KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmFic29sdXRlKGEpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbGF0aXZlKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5yZWxhdGl2ZShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwcmV2aW91cygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLnByZXZpb3VzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMuc2V0RmV0Y2hEaXJlY3Rpb24oYSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEZldGNoRGlyZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmV0Y2hTaXplKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnNldEZldGNoU2l6ZShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoU2l6ZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldEZldGNoU2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvbmN1cnJlbmN5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0Q29uY3VycmVuY3koKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByb3dVcGRhdGVkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMucm93VXBkYXRlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJvd0luc2VydGVkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMucm93SW5zZXJ0ZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByb3dEZWxldGVkKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMucm93RGVsZXRlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU51bGwoaW50IGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlTnVsbChhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCb29sZWFuKGludCBhLCBib29sZWFuIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlQm9vbGVhbihhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCeXRlKGludCBhLCBieXRlIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlQnl0ZShhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVTaG9ydChpbnQgYSwgc2hvcnQgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVTaG9ydChhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJbnQoaW50IGEsIGludCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZUludChhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVMb25nKGludCBhLCBsb25nIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlTG9uZyhhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVGbG9hdChpbnQgYSwgZmxvYXQgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVGbG9hdChhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVEb3VibGUoaW50IGEsIGRvdWJsZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZURvdWJsZShhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCaWdEZWNpbWFsKGludCBhLCBCaWdEZWNpbWFsIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlQmlnRGVjaW1hbChhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdHJpbmcoaW50IGEsIFN0cmluZyBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZVN0cmluZyhhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCeXRlcyhpbnQgYSwgYnl0ZVtdIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlQnl0ZXMoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlRGF0ZShpbnQgYSwgRGF0ZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZURhdGUoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlVGltZShpbnQgYSwgVGltZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZVRpbWUoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlVGltZXN0YW1wKGludCBhLCBUaW1lc3RhbXAgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVUaW1lc3RhbXAoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQXNjaWlTdHJlYW0oaW50IGEsIElucHV0U3RyZWFtIGluLCBpbnQgYikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVBc2NpaVN0cmVhbShhLCBpbiwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmluYXJ5U3RyZWFtKGludCBhLCBJbnB1dFN0cmVhbSBpbiwgaW50IGIpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlQmluYXJ5U3RyZWFtKGEsIGluLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDaGFyYWN0ZXJTdHJlYW0oaW50IGEsIFJlYWRlciByZWFkZXIsIGludCBiKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZUNoYXJhY3RlclN0cmVhbShhLCByZWFkZXIsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU9iamVjdChpbnQgYSwgT2JqZWN0IG9iLCBpbnQgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVPYmplY3QoYSwgb2IsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU9iamVjdChpbnQgYSwgT2JqZWN0IG9iKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZU9iamVjdChhLCBvYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTnVsbChTdHJpbmcgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVOdWxsKGEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJvb2xlYW4oU3RyaW5nIGEsIGJvb2xlYW4gYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVCb29sZWFuKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJ5dGUoU3RyaW5nIGEsIGJ5dGUgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVCeXRlKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNob3J0KFN0cmluZyBhLCBzaG9ydCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZVNob3J0KGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUludChTdHJpbmcgYSwgaW50IGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlSW50KGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUxvbmcoU3RyaW5nIGEsIGxvbmcgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVMb25nKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUZsb2F0KFN0cmluZyBhLCBmbG9hdCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZUZsb2F0KGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURvdWJsZShTdHJpbmcgYSwgZG91YmxlIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlRG91YmxlKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJpZ0RlY2ltYWwoU3RyaW5nIGEsIEJpZ0RlY2ltYWwgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVCaWdEZWNpbWFsKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlU3RyaW5nKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJ5dGVzKFN0cmluZyBhLCBieXRlW10gYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVCeXRlcyhhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVEYXRlKFN0cmluZyBhLCBEYXRlIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlRGF0ZShhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaW1lKFN0cmluZyBhLCBUaW1lIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlVGltZShhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaW1lc3RhbXAoU3RyaW5nIGEsIFRpbWVzdGFtcCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZVRpbWVzdGFtcChhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVBc2NpaVN0cmVhbShTdHJpbmcgYSwgSW5wdXRTdHJlYW0gaW4sIGludCBiKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZUFzY2lpU3RyZWFtKGEsIGluLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCaW5hcnlTdHJlYW0oU3RyaW5nIGEsIElucHV0U3RyZWFtIGluLCBpbnQgYikKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVCaW5hcnlTdHJlYW0oYSwgaW4sIGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNoYXJhY3RlclN0cmVhbShTdHJpbmcgYSwgUmVhZGVyIHJlYWRlciwgaW50IGIpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMudXBkYXRlQ2hhcmFjdGVyU3RyZWFtKGEsIHJlYWRlciwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlT2JqZWN0KFN0cmluZyBhLCBPYmplY3Qgb2IsIGludCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZU9iamVjdChhLCBvYiwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlT2JqZWN0KFN0cmluZyBhLCBPYmplY3QgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy51cGRhdGVPYmplY3QoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0Um93KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9ycy5pbnNlcnRSb3coKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLnVwZGF0ZVJvdygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVJvdygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMuZGVsZXRlUm93KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFJvdygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfcnMucmVmcmVzaFJvdygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFJvd1VwZGF0ZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLmNhbmNlbFJvd1VwZGF0ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3ZlVG9JbnNlcnRSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLm1vdmVUb0luc2VydFJvdygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdmVUb0N1cnJlbnRSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3JzLm1vdmVUb0N1cnJlbnRSb3coKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldFN0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBhLCBNYXAgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0T2JqZWN0KGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyBSZWYgZ2V0UmVmKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRSZWYoYSk7CisgICAgfQorCisgICAgcHVibGljIEJsb2IgZ2V0QmxvYihpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0QmxvYihhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xvYiBnZXRDbG9iKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRDbG9iKGEpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheSBnZXRBcnJheShpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0QXJyYXkoYSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGEsIE1hcCBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRPYmplY3QoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIFJlZiBnZXRSZWYoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFJlZihhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvYiBnZXRCbG9iKFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRCbG9iKGEpOworICAgIH0KKworICAgIHB1YmxpYyBDbG9iIGdldENsb2IoU3RyaW5nIGEpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldENsb2IoYSk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5IGdldEFycmF5KFN0cmluZyBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRBcnJheShhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKGludCBhLCBDYWxlbmRhciBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXREYXRlKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldERhdGUoU3RyaW5nIGEsIENhbGVuZGFyIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldERhdGUoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIFRpbWUgZ2V0VGltZShpbnQgYSwgQ2FsZW5kYXIgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfcnMuZ2V0VGltZShhLCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZSBnZXRUaW1lKFN0cmluZyBhLCBDYWxlbmRhciBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRUaW1lKGEsIGIpOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKGludCBhLCBDYWxlbmRhciBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9ycy5nZXRUaW1lc3RhbXAoYSwgYik7CisgICAgfQorCisgICAgcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoU3RyaW5nIGEsIENhbGVuZGFyIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3JzLmdldFRpbWVzdGFtcChhLCBiKTsKKyAgICB9CisKKyAgICAvLyBKREJDIDMuMCAodW5zdXBwb3J0ZWQpIG1ldGhvZCBmb2xsb3c7IHRoZXNlIGFyZSByZXF1aXJlZCB0byBiZSBhYmxlCisgICAgLy8gdG8gY29tcGlsZSBhZ2FpbnN0IEpESyAxLjQKKworICAgIHB1YmxpYyBVUkwgZ2V0VVJMKGludCBjb2x1bW4pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVVJMIGdldFVSTChTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVJlZihpbnQgY29sdW1uLCBSZWYgcmVmKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlUmVmKFN0cmluZyBjb2x1bW5OYW1lLCBSZWYgcmVmKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmxvYihpbnQgY29sdW1uLCBCbG9iIGJsb2IpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCbG9iKFN0cmluZyBjb2x1bW5OYW1lLCBCbG9iIGJsb2IpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDbG9iKGludCBjb2x1bW4sIENsb2IgY2xvYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNsb2IoU3RyaW5nIGNvbHVtbk5hbWUsIENsb2IgY2xvYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFycmF5KGludCBjb2x1bW4sIEFycmF5IGFycmF5KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQXJyYXkoU3RyaW5nIGNvbHVtbk5hbWUsIEFycmF5IGFycmF5KQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdTdGF0ZW1lbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvRGVsZWdhdGluZ1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0RlbGVnYXRpbmdTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmM7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHN0YXRlbWVudC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhlCisgKiBtZXRob2RzIHdob3NlIGJlaGF2aW9yIHRoZXkgbWVhbiB0byBjaGFuZ2UuIFRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZAorICogPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZHMgcGFzcyB0aHJvdWdoIHRvIHRoZSBiYXNlIHVuZGVybHlpbmcgZGF0YQorICogc3RvcmUgc3RhdGVtZW50LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nU3RhdGVtZW50IGltcGxlbWVudHMgU3RhdGVtZW50LCBDbG9zZWFibGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdGF0ZW1lbnQgX3N0bW50OworICAgIHByaXZhdGUgZmluYWwgRGVsZWdhdGluZ1N0YXRlbWVudCBfZGVsOworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbiBfY29ubjsKKworICAgIHB1YmxpYyBEZWxlZ2F0aW5nU3RhdGVtZW50KFN0YXRlbWVudCBzdG1udCwgQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgIF9jb25uID0gY29ubjsKKyAgICAgICAgX3N0bW50ID0gc3RtbnQ7CisgICAgICAgIGlmIChzdG1udCBpbnN0YW5jZW9mIERlbGVnYXRpbmdTdGF0ZW1lbnQpCisgICAgICAgICAgICBfZGVsID0gKERlbGVnYXRpbmdTdGF0ZW1lbnQpIHN0bW50OworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGVsID0gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IHdyYXBSZXN1bHQoUmVzdWx0U2V0IHJzLCBib29sZWFuIHdyYXApIHsKKyAgICAgICAgaWYgKCF3cmFwIHx8IHJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcnM7CisgICAgICAgIHJldHVybiBuZXcgRGVsZWdhdGluZ1Jlc3VsdFNldChycywgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB3cmFwcGVkIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX3N0bW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmFzZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgc3RhdGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiAoX2RlbCA9PSBudWxsKSA/IF9zdG1udCA6IF9kZWwuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1N0YXRlbWVudCkKKyAgICAgICAgICAgIG90aGVyID0gKChEZWxlZ2F0aW5nU3RhdGVtZW50KSBvdGhlcikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgcmV0dXJuIGdldElubmVybW9zdERlbGVnYXRlKCkuZXF1YWxzKG90aGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigic3RtbnQgIikuYXBwZW5kKGhhc2hDb2RlKCkpOworICAgICAgICBhcHBlbmRJbmZvKGJ1Zik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRJbmZvKFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgaWYgKF9kZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kZWwuYXBwZW5kSW5mbyhidWYpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KFN0cmluZyBzdHIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY3V0ZVF1ZXJ5KHN0ciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcXVlcnksIHdpdGggdGhlIG9wdGlvbiBvZiBub3Qgd3JhcHBpbmcgaXQgaW4gYQorICAgICAqIHtAbGluayBEZWxlZ2F0aW5nUmVzdWx0U2V0fSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzOworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgcnMgPSBfZGVsLmV4ZWN1dGVRdWVyeShzcWwsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnMgPSBfc3RtbnQuZXhlY3V0ZVF1ZXJ5KHNxbCk7CisgICAgICAgIHJldHVybiB3cmFwUmVzdWx0KHJzLCB3cmFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZXhlY3V0ZVVwZGF0ZShzdHIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZXhlY3V0ZShzdHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4RmllbGRTaXplKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0TWF4RmllbGRTaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4RmllbGRTaXplKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldE1heEZpZWxkU2l6ZShpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFJvd3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRNYXhSb3dzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4Um93cyhpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRNYXhSb3dzKGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVzY2FwZVByb2Nlc3NpbmcoYm9vbGVhbiBib29sKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEVzY2FwZVByb2Nlc3NpbmcoYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRRdWVyeVRpbWVvdXQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRRdWVyeVRpbWVvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVRpbWVvdXQoaW50IGkpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0UXVlcnlUaW1lb3V0KGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuY2FuY2VsKCk7CisgICAgfQorCisgICAgcHVibGljIFNRTFdhcm5pbmcgZ2V0V2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRXYXJuaW5ncygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LmNsZWFyV2FybmluZ3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJzb3JOYW1lKFN0cmluZyBzdHIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBfc3RtbnQuc2V0Q3Vyc29yTmFtZShzdHIpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0UmVzdWx0U2V0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRSZXN1bHRTZXQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsYXN0IHJlc3VsdCBzZXQsIHdpdGggdGhlIG9wdGlvbiBvZiBub3Qgd3JhcHBpbmcgaXQgaW4gYQorICAgICAqIHtAbGluayBEZWxlZ2F0aW5nUmVzdWx0U2V0fSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBnZXRSZXN1bHRTZXQoYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzOworICAgICAgICBpZiAoX2RlbCAhPSBudWxsKQorICAgICAgICAgICAgcnMgPSBfZGVsLmdldFJlc3VsdFNldChmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJzID0gX3N0bW50LmdldFJlc3VsdFNldCgpOworICAgICAgICByZXR1cm4gd3JhcFJlc3VsdChycywgd3JhcCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRVcGRhdGVDb3VudCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX3N0bW50LmdldFVwZGF0ZUNvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TW9yZVJlc3VsdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRNb3JlUmVzdWx0cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZldGNoRGlyZWN0aW9uKGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LnNldEZldGNoRGlyZWN0aW9uKGkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hEaXJlY3Rpb24oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRGZXRjaERpcmVjdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZldGNoU2l6ZShpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5zZXRGZXRjaFNpemUoaSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGZXRjaFNpemUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRGZXRjaFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldENvbmN1cnJlbmN5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZ2V0UmVzdWx0U2V0Q29uY3VycmVuY3koKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldFR5cGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udC5nZXRSZXN1bHRTZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmF0Y2goU3RyaW5nIHN0cikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIF9zdG1udC5hZGRCYXRjaChzdHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyQmF0Y2goKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgX3N0bW50LmNsZWFyQmF0Y2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50W10gZXhlY3V0ZUJhdGNoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfc3RtbnQuZXhlY3V0ZUJhdGNoKCk7CisgICAgfQorCisgICAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2Nvbm47CisgICAgfQorCisgICAgLy8gSkRCQyAzLjAgKHVuc3VwcG9ydGVkKSBtZXRob2QgZm9sbG93OyB0aGVzZSBhcmUgcmVxdWlyZWQgdG8gYmUgYWJsZQorICAgIC8vIHRvIGNvbXBpbGUgYWdhaW5zdCBKREsgMS40CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNb3JlUmVzdWx0cyhpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0R2VuZXJhdGVkS2V5cygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHMsIGludCBpKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzLCBpbnRbXSBpYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgcywgU3RyaW5nW10gc2EpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzLCBpbnQgaSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHMsIGludFtdIGlhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgcywgU3RyaW5nW10gc2EpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldEhvbGRhYmlsaXR5KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvSkRCQ0V2ZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0pEQkNFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGZiZjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0pEQkNFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqCisgKiBBIEpEQkMgZXZlbnQuIFRoZSBldmVudCBzb3VyY2Ugd2lsbCBiZSB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzZWUgSkRCQ0xpc3RlbmVyCisgKi8KK3B1YmxpYyBjbGFzcyBKREJDRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEge0BsaW5rIFN0YXRlbWVudH0gaXMgYmVpbmcgcHJlcGFyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBCRUZPUkVfUFJFUEFSRV9TVEFURU1FTlQgPSAxOworCisgICAgLyoqCisgICAgICogVHlwZSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHtAbGluayBTdGF0ZW1lbnR9IGlzIGJlaW5nIHByZXBhcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUZURVJfUFJFUEFSRV9TVEFURU1FTlQgPSAyOworCisgICAgLyoqCisgICAgICogVHlwZSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHtAbGluayBTdGF0ZW1lbnR9IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBCRUZPUkVfQ1JFQVRFX1NUQVRFTUVOVCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEge0BsaW5rIFN0YXRlbWVudH0gaXMgYmVpbmcgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFGVEVSX0NSRUFURV9TVEFURU1FTlQgPSA0OworCisgICAgLyoqCisgICAgICogVHlwZSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHtAbGluayBTdGF0ZW1lbnR9IGlzIGFib3V0IHRvIGJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQkVGT1JFX0VYRUNVVEVfU1RBVEVNRU5UID0gNTsKKworICAgIC8qKgorICAgICAqIFR5cGUgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB7QGxpbmsgU3RhdGVtZW50fSBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUZURVJfRVhFQ1VURV9TVEFURU1FTlQgPSA2OworCisgICAgLyoqCisgICAgICogVHlwZSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHtAbGluayBDb25uZWN0aW9ufSBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBCRUZPUkVfQ09NTUlUID0gNzsKKworICAgIC8qKgorICAgICAqIFR5cGUgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB7QGxpbmsgQ29ubmVjdGlvbn0gd2FzIGp1c3QgY29tbWl0dGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUZURVJfQ09NTUlUID0gODsKKworICAgIC8qKgorICAgICAqIFR5cGUgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSByb2xsYmFjayBpcyBhYm91dCB0byBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEJFRk9SRV9ST0xMQkFDSyA9IDk7CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcm9sbGJhY2sganVzdCBvY2N1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUZURVJfUk9MTEJBQ0sgPSAxMDsKKworICAgIC8qKgorICAgICAqIFR5cGUgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBjb25uZWN0aW9uIHdhcyBvYnRhaW5lZC4gVGhpcyBkb2VzCisgICAgICogbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBuZXcgaWYgcG9vbGluZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQUZURVJfQ09OTkVDVCA9IDExOworCisgICAgLyoqCisgICAgICogVHlwZSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIGNvbm5lY3Rpb24gd2FzIGNsb3NlZC4gVGhpcyBkb2VzCisgICAgICogbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBjb25uZWN0aW9uIHdhcworICAgICAqIHNldmVyZWQgaWYgcG9vbGluZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQkVGT1JFX0NMT1NFID0gMTI7CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3FsOworICAgIHByaXZhdGUgZmluYWwgSkRCQ0V2ZW50IGFzc29jaWF0ZWRFdmVudDsKKyAgICBwcml2YXRlIGZpbmFsIHRyYW5zaWVudCBTdGF0ZW1lbnQgc3RhdGVtZW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEpEQkNFdmVudChDb25uZWN0aW9uIHNvdXJjZSwgc2hvcnQgdHlwZSwgSkRCQ0V2ZW50IGFzc29jaWF0ZWRFdmVudCwKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCwgU3RyaW5nIHNxbCkgeworICAgICAgICBzdXBlcihzb3VyY2UpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLnRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgdGhpcy5hc3NvY2lhdGVkRXZlbnQgPSBhc3NvY2lhdGVkRXZlbnQ7CisgICAgICAgIHRoaXMuc3FsID0gc3FsOworICAgICAgICB0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50J3MgdHlwZSBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzaG9ydCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbm5lY3Rpb24gZm9yIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIChDb25uZWN0aW9uKSBnZXRTb3VyY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRpbWUgdGhlIGV2ZW50IHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgbG9uZyBnZXRUaW1lKCkgeworICAgICAgICByZXR1cm4gdGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFzc29jaWF0ZWQge0BsaW5rIEpEQkNFdmVudH0gZm9yIHRoaXMgZXZlbnQuCisgICAgICogRm9yIEFGVEVSX1hYWCBldmVudHMsIHRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgdGhlIEpEQkNFdmVudAorICAgICAqIHRoYXQgd2FzIGNyZWF0ZWQgaW4gdGhlIEJFRk9SRV9YWFggc3RhZ2UuIFRoaXMgbWF5IGJlIG51bGwgd2hlbgorICAgICAqIGFuIGFzc29jaWF0aW9uIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBKREJDRXZlbnQgZ2V0QXNzb2NpYXRlZEV2ZW50KCkgeworICAgICAgICByZXR1cm4gYXNzb2NpYXRlZEV2ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU1FMIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50OyBtYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNRTCgpIHsKKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFN0YXRlbWVudCBmb3IgdGhpcyBldmVudCwgbWF5IGJlIG51bGwgZm9yIGV2ZW50cworICAgICAqIHVucmVsYXRlZCB0byBTdGF0ZW1lbnQgZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdGF0ZW1lbnQgZ2V0U3RhdGVtZW50KCkgeworICAgICAgICByZXR1cm4gc3RhdGVtZW50OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9KREJDRXZlbnRDb25uZWN0aW9uRGVjb3JhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0pEQkNFdmVudENvbm5lY3Rpb25EZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTcxNGIxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9KREJDRXZlbnRDb25uZWN0aW9uRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlcjsKKworLyoqCisgKiBNYW5hZ2VzIHRoZSBmaXJpbmcgb2Yge0BsaW5rIEpEQkNFdmVudH1zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBKREJDRXZlbnRDb25uZWN0aW9uRGVjb3JhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25jdXJyZW50RXZlbnRNYW5hZ2VyCisgICAgaW1wbGVtZW50cyBDb25uZWN0aW9uRGVjb3JhdG9yIHsKKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGRlY29yYXRlKENvbm5lY3Rpb24gY29ubikgeworICAgICAgICBpZiAoIWhhc0xpc3RlbmVycygpKQorICAgICAgICAgICAgcmV0dXJuIGNvbm47CisgICAgICAgIHJldHVybiBuZXcgRXZlbnRDb25uZWN0aW9uKGNvbm4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmUgdGhlIGdpdmVuIGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMuIFByZXZlbnRzIGNyZWF0aW9uIG9mIGFuCisgICAgICogZXZlbnQgb2JqZWN0IHdoZW4gdGhlcmUgYXJlIG5vIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpEQkNFdmVudCBmaXJlRXZlbnQoQ29ubmVjdGlvbiBzb3VyY2UsIHNob3J0IHR5cGUsCisgICAgICAgIEpEQkNFdmVudCBhc3NvY2lhdGVkRXZlbnQsIFN0YXRlbWVudCBzdG1udCwgU3RyaW5nIHNxbCkgeworICAgICAgICBpZiAoIWhhc0xpc3RlbmVycygpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgSkRCQ0V2ZW50IGV2ZW50ID0gbmV3IEpEQkNFdmVudChzb3VyY2UsIHR5cGUsIGFzc29jaWF0ZWRFdmVudCwKKyAgICAgICAgICAgIHN0bW50LCBzcWwpOworICAgICAgICBmaXJlRXZlbnQoZXZlbnQpOworICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZSB0aGUgZ2l2ZW4gZXZlbnQgdG8gYWxsIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoT2JqZWN0IGV2ZW50LCBPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgSkRCQ0xpc3RlbmVyIGxpc3RlbiA9IChKREJDTGlzdGVuZXIpIGxpc3RlbmVyOworICAgICAgICBKREJDRXZlbnQgZXYgPSAoSkRCQ0V2ZW50KSBldmVudDsKKyAgICAgICAgc3dpdGNoIChldi5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSkRCQ0V2ZW50LkJFRk9SRV9QUkVQQVJFX1NUQVRFTUVOVDoKKyAgICAgICAgICAgICAgICBsaXN0ZW4uYmVmb3JlUHJlcGFyZVN0YXRlbWVudChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpEQkNFdmVudC5BRlRFUl9QUkVQQVJFX1NUQVRFTUVOVDoKKyAgICAgICAgICAgICAgICBsaXN0ZW4uYWZ0ZXJQcmVwYXJlU3RhdGVtZW50KGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkRCQ0V2ZW50LkJFRk9SRV9DUkVBVEVfU1RBVEVNRU5UOgorICAgICAgICAgICAgICAgIGxpc3Rlbi5iZWZvcmVDcmVhdGVTdGF0ZW1lbnQoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKREJDRXZlbnQuQUZURVJfQ1JFQVRFX1NUQVRFTUVOVDoKKyAgICAgICAgICAgICAgICBsaXN0ZW4uYWZ0ZXJDcmVhdGVTdGF0ZW1lbnQoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKREJDRXZlbnQuQkVGT1JFX0VYRUNVVEVfU1RBVEVNRU5UOgorICAgICAgICAgICAgICAgIGxpc3Rlbi5iZWZvcmVFeGVjdXRlU3RhdGVtZW50KGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkRCQ0V2ZW50LkFGVEVSX0VYRUNVVEVfU1RBVEVNRU5UOgorICAgICAgICAgICAgICAgIGxpc3Rlbi5hZnRlckV4ZWN1dGVTdGF0ZW1lbnQoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKREJDRXZlbnQuQkVGT1JFX0NPTU1JVDoKKyAgICAgICAgICAgICAgICBsaXN0ZW4uYmVmb3JlQ29tbWl0KGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkRCQ0V2ZW50LkFGVEVSX0NPTU1JVDoKKyAgICAgICAgICAgICAgICBsaXN0ZW4uYWZ0ZXJDb21taXQoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKREJDRXZlbnQuQkVGT1JFX1JPTExCQUNLOgorICAgICAgICAgICAgICAgIGxpc3Rlbi5iZWZvcmVSb2xsYmFjayhldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpEQkNFdmVudC5BRlRFUl9ST0xMQkFDSzoKKyAgICAgICAgICAgICAgICBsaXN0ZW4uYWZ0ZXJSb2xsYmFjayhldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpEQkNFdmVudC5BRlRFUl9DT05ORUNUOgorICAgICAgICAgICAgICAgIGxpc3Rlbi5hZnRlckNvbm5lY3QoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKREJDRXZlbnQuQkVGT1JFX0NMT1NFOgorICAgICAgICAgICAgICAgIGxpc3Rlbi5iZWZvcmVDbG9zZShldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlcyBldmVudHMgYXMgYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBFdmVudENvbm5lY3Rpb24gZXh0ZW5kcyBEZWxlZ2F0aW5nQ29ubmVjdGlvbiB7CisKKyAgICAgICAgcHVibGljIEV2ZW50Q29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbm4pOworICAgICAgICAgICAgZmlyZUV2ZW50KGdldERlbGVnYXRlKCksIEpEQkNFdmVudC5BRlRFUl9DT05ORUNULCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgSkRCQ0V2ZW50IGJlZm9yZSA9IGZpcmVFdmVudChnZXREZWxlZ2F0ZSgpLAorICAgICAgICAgICAgICAgIEpEQkNFdmVudC5CRUZPUkVfQ09NTUlULCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIuY29tbWl0KCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpcmVFdmVudChnZXREZWxlZ2F0ZSgpLCBKREJDRXZlbnQuQUZURVJfQ09NTUlULCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpEQkNFdmVudCBiZWZvcmUgPSBmaXJlRXZlbnQoZ2V0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICBKREJDRXZlbnQuQkVGT1JFX1JPTExCQUNLLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZmlyZUV2ZW50KGdldERlbGVnYXRlKCksIEpEQkNFdmVudC5BRlRFUl9ST0xMQkFDSywgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKREJDRXZlbnQgYmVmb3JlID0gZmlyZUV2ZW50KGdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkJFRk9SRV9DUkVBVEVfU1RBVEVNRU5ULCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIFN0YXRlbWVudCBzdG1udCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0bW50ID0gbmV3IEV2ZW50U3RhdGVtZW50KHN1cGVyLmNyZWF0ZVN0YXRlbWVudChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIEV2ZW50Q29ubmVjdGlvbi50aGlzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZmlyZUV2ZW50KGdldERlbGVnYXRlKCksIEpEQkNFdmVudC5BRlRFUl9DUkVBVEVfU1RBVEVNRU5ULAorICAgICAgICAgICAgICAgICAgICBiZWZvcmUsIHN0bW50LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdG1udDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGludCByc1R5cGUsIGludCByc0NvbmN1ciwKKyAgICAgICAgICAgIGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKREJDRXZlbnQgYmVmb3JlID0gZmlyZUV2ZW50KGdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkJFRk9SRV9DUkVBVEVfU1RBVEVNRU5ULCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIFN0YXRlbWVudCBzdG1udCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0bW50ID0gbmV3IEV2ZW50U3RhdGVtZW50KHN1cGVyLmNyZWF0ZVN0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICAocnNUeXBlLCByc0NvbmN1ciwgZmFsc2UpLCBFdmVudENvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpcmVFdmVudChnZXREZWxlZ2F0ZSgpLCBKREJDRXZlbnQuQUZURVJfQ1JFQVRFX1NUQVRFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlLCBzdG1udCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLCBib29sZWFuIHdyYXApCisgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpEQkNFdmVudCBiZWZvcmUgPSBmaXJlRXZlbnQoZ2V0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICBKREJDRXZlbnQuQkVGT1JFX1BSRVBBUkVfU1RBVEVNRU5ULCBudWxsLCBudWxsLCBzcWwpOworICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG1udCA9IG5ldyBFdmVudFByZXBhcmVkU3RhdGVtZW50KHN1cGVyLnByZXBhcmVTdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKHNxbCwgZmFsc2UpLCBFdmVudENvbm5lY3Rpb24udGhpcywgc3FsKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZmlyZUV2ZW50KGdldERlbGVnYXRlKCksIEpEQkNFdmVudC5BRlRFUl9QUkVQQVJFX1NUQVRFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlLCBzdG1udCwgc3FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdG1udDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsIGludCByc1R5cGUsCisgICAgICAgICAgICBpbnQgcnNDb25jdXIsIGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKREJDRXZlbnQgYmVmb3JlID0gZmlyZUV2ZW50KGdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkJFRk9SRV9QUkVQQVJFX1NUQVRFTUVOVCwgbnVsbCwgbnVsbCwgc3FsKTsKKyAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RtbnQgPSBuZXcgRXZlbnRQcmVwYXJlZFN0YXRlbWVudChzdXBlci5wcmVwYXJlU3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgIChzcWwsIHJzVHlwZSwgcnNDb25jdXIsIGZhbHNlKSwgRXZlbnRDb25uZWN0aW9uLnRoaXMsIHNxbCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpcmVFdmVudChnZXREZWxlZ2F0ZSgpLCBKREJDRXZlbnQuQUZURVJfUFJFUEFSRV9TVEFURU1FTlQsCisgICAgICAgICAgICAgICAgICAgIGJlZm9yZSwgc3RtbnQsIHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RtbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXJlRXZlbnQoZ2V0RGVsZWdhdGUoKSwgSkRCQ0V2ZW50LkJFRk9SRV9DTE9TRSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlcyBldmVudHMgYXMgYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBFdmVudFByZXBhcmVkU3RhdGVtZW50IGV4dGVuZHMgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEV2ZW50Q29ubmVjdGlvbiBfY29ubjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3NxbDsKKworICAgICAgICBwdWJsaWMgRXZlbnRQcmVwYXJlZFN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudCBwcywKKyAgICAgICAgICAgIEV2ZW50Q29ubmVjdGlvbiBjb25uLCBTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBzdXBlcihwcywgY29ubik7CisgICAgICAgICAgICBfY29ubiA9IGNvbm47CisgICAgICAgICAgICBfc3FsID0gc3FsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKREJDRXZlbnQgYmVmb3JlID0gZmlyZUV2ZW50KF9jb25uLmdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkJFRk9SRV9FWEVDVVRFX1NUQVRFTUVOVCwgbnVsbCwgZ2V0RGVsZWdhdGUoKSwgX3NxbCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5leGVjdXRlVXBkYXRlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpcmVFdmVudChfY29ubi5nZXREZWxlZ2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICBKREJDRXZlbnQuQUZURVJfRVhFQ1VURV9TVEFURU1FTlQsIGJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVsZWdhdGUoKSwgX3NxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeShib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgSkRCQ0V2ZW50IGJlZm9yZSA9IGZpcmVFdmVudChfY29ubi5nZXREZWxlZ2F0ZSgpLAorICAgICAgICAgICAgICAgIEpEQkNFdmVudC5CRUZPUkVfRVhFQ1VURV9TVEFURU1FTlQsIG51bGwsIGdldERlbGVnYXRlKCksIF9zcWwpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZVF1ZXJ5KHdyYXApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmaXJlRXZlbnQoX2Nvbm4uZ2V0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkFGVEVSX0VYRUNVVEVfU1RBVEVNRU5ULCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIGdldERlbGVnYXRlKCksIF9zcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludFtdIGV4ZWN1dGVCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgSkRCQ0V2ZW50IGJlZm9yZSA9IGZpcmVFdmVudChfY29ubi5nZXREZWxlZ2F0ZSgpLAorICAgICAgICAgICAgICAgIEpEQkNFdmVudC5CRUZPUkVfRVhFQ1VURV9TVEFURU1FTlQsIG51bGwsIGdldERlbGVnYXRlKCksIF9zcWwpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZUJhdGNoKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZpcmVFdmVudChfY29ubi5nZXREZWxlZ2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICBKREJDRXZlbnQuQUZURVJfRVhFQ1VURV9TVEFURU1FTlQsIGJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVsZWdhdGUoKSwgX3NxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlcyBldmVudHMgYXMgYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBFdmVudFN0YXRlbWVudCBleHRlbmRzIERlbGVnYXRpbmdTdGF0ZW1lbnQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRXZlbnRDb25uZWN0aW9uIF9jb25uOworCisgICAgICAgIHB1YmxpYyBFdmVudFN0YXRlbWVudChTdGF0ZW1lbnQgc3RtbnQsIEV2ZW50Q29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgICAgICBzdXBlcihzdG1udCwgY29ubik7CisgICAgICAgICAgICBfY29ubiA9IGNvbm47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKREJDRXZlbnQgYmVmb3JlID0gZmlyZUV2ZW50KF9jb25uLmdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkJFRk9SRV9FWEVDVVRFX1NUQVRFTUVOVCwgbnVsbCwgZ2V0RGVsZWdhdGUoKSwgc3FsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVVcGRhdGUoc3FsKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZmlyZUV2ZW50KF9jb25uLmdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgIEpEQkNFdmVudC5BRlRFUl9FWEVDVVRFX1NUQVRFTUVOVCwgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICBnZXREZWxlZ2F0ZSgpLCBzcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKREJDRXZlbnQgYmVmb3JlID0gZmlyZUV2ZW50KF9jb25uLmdldERlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkJFRk9SRV9FWEVDVVRFX1NUQVRFTUVOVCwgbnVsbCwgZ2V0RGVsZWdhdGUoKSwgc3FsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVRdWVyeShzcWwsIHdyYXApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmaXJlRXZlbnQoX2Nvbm4uZ2V0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgSkRCQ0V2ZW50LkFGVEVSX0VYRUNVVEVfU1RBVEVNRU5ULCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIGdldERlbGVnYXRlKCksIHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL0pEQkNMaXN0ZW5lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9KREJDTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBkODFhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9KREJDTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYzsKKworLyoqCisgKiBBIGxpc3RlbmVyIGZvciBhbGwge0BsaW5rIEpEQkNFdmVudH1zIHRoYXQgb2NjdXIuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2VlIEFic3RyYWN0SkRCQ0xpc3RlbmVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSkRCQ0xpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEBzZWUgSkRCQ0V2ZW50I0JFRk9SRV9QUkVQQVJFX1NUQVRFTUVOVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZVByZXBhcmVTdGF0ZW1lbnQoSkRCQ0V2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEBzZWUgSkRCQ0V2ZW50I0FGVEVSX1BSRVBBUkVfU1RBVEVNRU5UCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJQcmVwYXJlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBAc2VlIEpEQkNFdmVudCNCRUZPUkVfQ1JFQVRFX1NUQVRFTUVOVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNyZWF0ZVN0YXRlbWVudChKREJDRXZlbnQgZXZlbnQpOworCisgICAgLyoqCisgICAgICogQHNlZSBKREJDRXZlbnQjQUZURVJfQ1JFQVRFX1NUQVRFTUVOVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyQ3JlYXRlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBAc2VlIEpEQkNFdmVudCNCRUZPUkVfRVhFQ1VURV9TVEFURU1FTlQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVFeGVjdXRlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBAc2VlIEpEQkNFdmVudCNBRlRFUl9FWEVDVVRFX1NUQVRFTUVOVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyRXhlY3V0ZVN0YXRlbWVudChKREJDRXZlbnQgZXZlbnQpOworCisgICAgLyoqCisgICAgICogQHNlZSBKREJDRXZlbnQjQkVGT1JFX0NPTU1JVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbW1pdChKREJDRXZlbnQgZXZlbnQpOworCisgICAgLyoqCisgICAgICogQHNlZSBKREJDRXZlbnQjQUZURVJfQ09NTUlUCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDb21taXQoSkRCQ0V2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEBzZWUgSkRCQ0V2ZW50I0JFRk9SRV9ST0xMQkFDSworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZVJvbGxiYWNrKEpEQkNFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBAc2VlIEpEQkNFdmVudCNBRlRFUl9ST0xMQkFDSworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFmdGVyUm9sbGJhY2soSkRCQ0V2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEBzZWUgSkRCQ0V2ZW50I0FGVEVSX0NPTk5FQ1QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckNvbm5lY3QoSkRCQ0V2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIEBzZWUgSkRCQ0V2ZW50I0JFRk9SRV9DTE9TRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNsb3NlKEpEQkNFdmVudCBldmVudCk7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvTG9nZ2luZ0Nvbm5lY3Rpb25EZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU5NjBlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9Mb2dnaW5nQ29ubmVjdGlvbkRlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMTI5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEuc3FsLkFycmF5OworaW1wb3J0IGphdmEuc3FsLkJhdGNoVXBkYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLkJsb2I7CitpbXBvcnQgamF2YS5zcWwuQ2xvYjsKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZWY7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxXYXJuaW5nOworaW1wb3J0IGphdmEuc3FsLlNhdmVwb2ludDsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuVGltZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CisKKy8qKgorICogQSB7QGxpbmsgQ29ubmVjdGlvbkRlY29yYXRvcn0gdGhhdCBjcmVhdGVzIGxvZ2dpbmcgY29ubmVjdGlvbnMgYW5kCisgKiB7QGxpbmsgUmVwb3J0aW5nU1FMRXhjZXB0aW9ufXMuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIExvZ2dpbmdDb25uZWN0aW9uRGVjb3JhdG9yIGltcGxlbWVudHMgQ29ubmVjdGlvbkRlY29yYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fSUdOT1JFID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTl9MT0dfVFJBQ0UgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVJOX0xPR19JTkZPID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTl9MT0dfV0FSTiA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fTE9HX0VSUk9SID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTl9USFJPVyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fSEFORExFID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXQVJOSU5HX0FDVElPTlMgPSBuZXcgU3RyaW5nWzddOworCisgICAgc3RhdGljIHsKKyAgICAgICAgV0FSTklOR19BQ1RJT05TW1dBUk5fSUdOT1JFXSA9ICJpZ25vcmUiOworICAgICAgICBXQVJOSU5HX0FDVElPTlNbV0FSTl9MT0dfVFJBQ0VdID0gInRyYWNlIjsKKyAgICAgICAgV0FSTklOR19BQ1RJT05TW1dBUk5fTE9HX0lORk9dID0gImluZm8iOworICAgICAgICBXQVJOSU5HX0FDVElPTlNbV0FSTl9MT0dfV0FSTl0gPSAid2FybiI7CisgICAgICAgIFdBUk5JTkdfQUNUSU9OU1tXQVJOX0xPR19FUlJPUl0gPSAiZXJyb3IiOworICAgICAgICBXQVJOSU5HX0FDVElPTlNbV0FSTl9USFJPV10gPSAidGhyb3ciOworICAgICAgICBXQVJOSU5HX0FDVElPTlNbV0FSTl9IQU5ETEVdID0gImhhbmRsZSI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlTG9ncyBfbG9ncyA9IG5ldyBEYXRhU291cmNlTG9ncygpOworICAgIHByaXZhdGUgU1FMRm9ybWF0dGVyIF9mb3JtYXR0ZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wcmV0dHlQcmludDsKKyAgICBwcml2YXRlIGludCBfcHJldHR5UHJpbnRMaW5lTGVuZ3RoID0gNjA7CisgICAgcHJpdmF0ZSBpbnQgX3dhcm5pbmdBY3Rpb24gPSBXQVJOX0lHTk9SRTsKKyAgICBwcml2YXRlIFNRTFdhcm5pbmdIYW5kbGVyIF93YXJuaW5nSGFuZGxlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3RyYWNrUGFyYW1ldGVycyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHByZXR0eS1wcmludCBTUUwgYnkgcnVubmluZyBpdAorICAgICAqIHRocm91Z2gge0BsaW5rIFNRTEZvcm1hdHRlciNwcmV0dHlQcmludH0uIElmCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LCBkb24ndCBwcmV0dHktcHJpbnQsIGFuZCBvdXRwdXQgU1FMIGxvZ3MgaW4KKyAgICAgKiBhIHNpbmdsZSBsaW5lLiBQcmV0dHktcHJpbnRlZCBTUUwgY2FuIGJlIGVhc2llciBmb3IgYSBodW1hbiB0bworICAgICAqIHJlYWQsIGJ1dCBpcyBoYXJkZXIgdG8gcGFyc2Ugd2l0aCB0b29scyBsaWtlIGdyZXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJldHR5UHJpbnQoYm9vbGVhbiBwcmV0dHlQcmludCkgeworICAgICAgICBfcHJldHR5UHJpbnQgPSBwcmV0dHlQcmludDsKKyAgICAgICAgaWYgKF9mb3JtYXR0ZXIgPT0gbnVsbCAmJiBfcHJldHR5UHJpbnQpIHsKKyAgICAgICAgICAgIF9mb3JtYXR0ZXIgPSBuZXcgU1FMRm9ybWF0dGVyKCk7CisgICAgICAgICAgICBfZm9ybWF0dGVyLnNldExpbmVMZW5ndGgoX3ByZXR0eVByaW50TGluZUxlbmd0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoIV9wcmV0dHlQcmludCkKKyAgICAgICAgICAgIF9mb3JtYXR0ZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldFByZXR0eVByaW50CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJldHR5UHJpbnQoKSB7CisgICAgICAgIHJldHVybiBfcHJldHR5UHJpbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50IHBlciBsaW5lIHdoZW4KKyAgICAgKiBwcmV0dHktcHJpbnRpbmcgb2YgU1FMIGlzIGVuYWJsZWQuIERlZmF1bHRzIHRvIDYwIHRvIHByb3ZpZGUKKyAgICAgKiBzb21lIHNwYWNlIGZvciBhbnkgYW50LXJlbGF0ZWQgY2hhcmFjdGVycyBvbiB0aGUgbGVmdCBvZiBhCisgICAgICogc3RhbmRhcmQgODAtY2hhcmFjdGVyIGRpc3BsYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJldHR5UHJpbnRMaW5lTGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICAgICAgX3ByZXR0eVByaW50TGluZUxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgaWYgKF9mb3JtYXR0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF9mb3JtYXR0ZXIuc2V0TGluZUxlbmd0aChsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldFByZXR0eVByaW50TGluZUxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UHJldHR5UHJpbnRMaW5lTGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gX3ByZXR0eVByaW50TGluZUxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHRyYWNrIHBhcmFtZXRlcnMgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXBvcnRpbmcgZXhjZXB0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFja1BhcmFtZXRlcnMoYm9vbGVhbiB0cmFja1BhcmFtZXRlcnMpIHsKKyAgICAgICAgX3RyYWNrUGFyYW1ldGVycyA9IHRyYWNrUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHRyYWNrIHBhcmFtZXRlcnMgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXBvcnRpbmcgZXhjZXB0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFja1BhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBfdHJhY2tQYXJhbWV0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoYXQgdG8gZG8gd2l0aCBTUUwgd2FybmluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2FybmluZ0FjdGlvbihTdHJpbmcgd2FybmluZ0FjdGlvbikgeworICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYXNMaXN0KFdBUk5JTkdfQUNUSU9OUykuaW5kZXhPZih3YXJuaW5nQWN0aW9uKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgIGluZGV4ID0gV0FSTl9JR05PUkU7CisgICAgICAgIF93YXJuaW5nQWN0aW9uID0gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hhdCB0byBkbyB3aXRoIFNRTCB3YXJuaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdhcm5pbmdBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBXQVJOSU5HX0FDVElPTlNbX3dhcm5pbmdBY3Rpb25dOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoYXQgdG8gZG8gd2l0aCBTUUwgd2FybmluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2FybmluZ0hhbmRsZXIoU1FMV2FybmluZ0hhbmRsZXIgd2FybmluZ0hhbmRsZXIpIHsKKyAgICAgICAgX3dhcm5pbmdIYW5kbGVyID0gd2FybmluZ0hhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hhdCB0byBkbyB3aXRoIFNRTCB3YXJuaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMV2FybmluZ0hhbmRsZXIgZ2V0V2FybmluZ0hhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBfd2FybmluZ0hhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxvZyB0byB3cml0ZSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YVNvdXJjZUxvZ3MgZ2V0TG9ncygpIHsKKyAgICAgICAgcmV0dXJuIF9sb2dzOworICAgIH0KKworICAgIHB1YmxpYyBDb25uZWN0aW9uIGRlY29yYXRlKENvbm5lY3Rpb24gY29ubikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgTG9nZ2luZ0Nvbm5lY3Rpb24oY29ubik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jbHVkZSBTUUwgaW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU1FMRXhjZXB0aW9uIHdyYXAoU1FMRXhjZXB0aW9uIHNxbGUsIFN0YXRlbWVudCBzdG1udCkgeworICAgICAgICBpZiAoc3FsZSBpbnN0YW5jZW9mIFJlcG9ydGluZ1NRTEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHJldHVybiAoUmVwb3J0aW5nU1FMRXhjZXB0aW9uKSBzcWxlOworICAgICAgICByZXR1cm4gbmV3IFJlcG9ydGluZ1NRTEV4Y2VwdGlvbihzcWxlLCBzdG1udCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jbHVkZSBTUUwgaW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU1FMRXhjZXB0aW9uIHdyYXAoU1FMRXhjZXB0aW9uIHNxbGUsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgaWYgKHNxbGUgaW5zdGFuY2VvZiBSZXBvcnRpbmdTUUxFeGNlcHRpb24pCisgICAgICAgICAgICByZXR1cm4gKFJlcG9ydGluZ1NRTEV4Y2VwdGlvbikgc3FsZTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBvcnRpbmdTUUxFeGNlcHRpb24oc3FsZSwgc3FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBhbGxvd3MgY3VzdG9taXphdGlvbiBvZiB3aGF0IHRvIGRvIHdoZW4KKyAgICAgKiB7QGxpbmsgU1FMV2FybmluZ31zIG9jY3VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFNRTFdhcm5pbmdIYW5kbGVyIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVXYXJuaW5nKFNRTFdhcm5pbmcgd2FybmluZykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dnaW5nIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBMb2dnaW5nQ29ubmVjdGlvbiBleHRlbmRzIERlbGVnYXRpbmdDb25uZWN0aW9uIHsKKworICAgICAgICBwdWJsaWMgTG9nZ2luZ0Nvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbm4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gc3VwZXIucHJlcGFyZVN0YXRlbWVudChzcWwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudChzdG1udCwgc3FsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IHdyYXAoc2UsIHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLCBpbnQgcnNUeXBlLAorICAgICAgICAgICAgaW50IHJzQ29uY3VyLCBib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IHN1cGVyLnByZXBhcmVTdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKHNxbCwgcnNUeXBlLCByc0NvbmN1ciwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9nZ2luZ1ByZXBhcmVkU3RhdGVtZW50KHN0bW50LCBzcWwpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgd3JhcChzZSwgc3FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdGF0ZW1lbnQgc3RtbnQgPSBzdXBlci5jcmVhdGVTdGF0ZW1lbnQoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dnaW5nU3RhdGVtZW50KHN0bW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGludCB0eXBlLCBpbnQgY29uY3VycmVuY3ksCisgICAgICAgICAgICBib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGVtZW50IHN0bW50ID0gc3VwZXIuY3JlYXRlU3RhdGVtZW50KHR5cGUsIGNvbmN1cnJlbmN5LCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdTdGF0ZW1lbnQoc3RtbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29tbWl0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN1cGVyLmNvbW1pdCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJjb21taXQiLCBzdGFydCwgdGhpcyk7CisgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2dzLmlzSkRCQ0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZ3MubG9nSkRCQygicm9sbGJhY2siLCBzdGFydCwgdGhpcyk7CisgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2dzLmlzSkRCQ0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZ3MubG9nSkRCQygiY2xvc2UiLCBzdGFydCwgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2F2ZXBvaW50IHNldFNhdmVwb2ludCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2V0U2F2ZXBvaW50KCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoInNhdmVwb2ludCIsIHN0YXJ0LCB0aGlzKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2F2ZXBvaW50IHNldFNhdmVwb2ludChTdHJpbmcgbmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5zZXRTYXZlcG9pbnQobmFtZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoInNhdmVwb2ludDogIiArIG5hbWUsIHN0YXJ0LCB0aGlzKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhTYXZlcG9pbnQgc2F2ZXBvaW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIucm9sbGJhY2soc2F2ZXBvaW50KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2dzLmlzSkRCQ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2F2ZXBvaW50LmdldFNhdmVwb2ludE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNxZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFN0cmluZy52YWx1ZU9mKHNhdmVwb2ludC5nZXRTYXZlcG9pbnRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJyb2xsYmFjazogIiArIG5hbWUsIHN0YXJ0LCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludChTYXZlcG9pbnQgc2F2ZXBvaW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIucmVsZWFzZVNhdmVwb2ludChzYXZlcG9pbnQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzYXZlcG9pbnQuZ2V0U2F2ZXBvaW50TmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc3FlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gU3RyaW5nLnZhbHVlT2Yoc2F2ZXBvaW50LmdldFNhdmVwb2ludElkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoInJlbGVhc2U6ICIgKyBuYW1lLCBzdGFydCwgdGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KGludCByZXN1bHRTZXRUeXBlLAorICAgICAgICAgICAgaW50IHJlc3VsdFNldENvbmN1cnJlbmN5LCBpbnQgcmVzdWx0U2V0SG9sZGFiaWxpdHksIGJvb2xlYW4gd3JhcCkKKyAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGVtZW50IHN0bW50ID0gc3VwZXIuY3JlYXRlU3RhdGVtZW50KHJlc3VsdFNldFR5cGUsCisgICAgICAgICAgICAgICAgcmVzdWx0U2V0Q29uY3VycmVuY3ksIHJlc3VsdFNldEhvbGRhYmlsaXR5LCBmYWxzZSk7CisgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdTdGF0ZW1lbnQoc3RtbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwKKyAgICAgICAgICAgIGludCByZXN1bHRTZXRUeXBlLCBpbnQgcmVzdWx0U2V0Q29uY3VycmVuY3ksCisgICAgICAgICAgICBpbnQgcmVzdWx0U2V0SG9sZGFiaWxpdHksIGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gc3VwZXIucHJlcGFyZVN0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICAoc3FsLCByZXN1bHRTZXRUeXBlLCByZXN1bHRTZXRDb25jdXJyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldEhvbGRhYmlsaXR5LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZygpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9nZ2luZ1ByZXBhcmVkU3RhdGVtZW50KHN0bW50LCBzcWwpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgd3JhcChzZSwgc3FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KFN0cmluZyBzcWwsCisgICAgICAgICAgICBpbnQgYXV0b0dlbmVyYXRlZEtleXMsIGJvb2xlYW4gd3JhcCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bW50ID0gc3VwZXIucHJlcGFyZVN0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICAoc3FsLCBhdXRvR2VuZXJhdGVkS2V5cywgZmFsc2UpOworICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudChzdG1udCwgc3FsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IHdyYXAoc2UsIHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudChTdHJpbmcgc3FsLAorICAgICAgICAgICAgaW50W10gY29sdW1uSW5kZXhlcywgYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQgPSBzdXBlci5wcmVwYXJlU3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgIChzcWwsIGNvbHVtbkluZGV4ZXMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQoc3RtbnQsIHNxbCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB3cmFwKHNlLCBzcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVTdGF0ZW1lbnQoU3RyaW5nIHNxbCwKKyAgICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzLCBib29sZWFuIHdyYXApIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG1udCA9IHN1cGVyLnByZXBhcmVTdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKHNxbCwgY29sdW1uTmFtZXMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQoc3RtbnQsIHNxbCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB3cmFwKHNlLCBzcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIERhdGFiYXNlTWV0YURhdGEgZ2V0TWV0YURhdGEoYm9vbGVhbiB3cmFwKQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdEYXRhYmFzZU1ldGFEYXRhKHN1cGVyLmdldE1ldGFEYXRhKGZhbHNlKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTG9nIHRpbWUgZWxhcHNlZCBzaW5jZSBnaXZlbiBzdGFydC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBsb2dUaW1lKGxvbmcgc3RhcnRUaW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfbG9ncy5pc1NRTEVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9ncy5sb2dTUUwoInNwZW50Iiwgc3RhcnRUaW1lLCB0aGlzKTsgCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTG9nIHRpbWUgZWxhcHNlZCBzaW5jZSBnaXZlbiBzdGFydC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBsb2dTUUwoU3RhdGVtZW50IHN0bW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfbG9ncy5pc1NRTEVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9ncy5sb2dTUUwoImV4ZWN1dGluZyAiICsgc3RtbnQsIHRoaXMpOyAKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgYW55IHtAbGluayBTUUxXYXJuaW5nfXMgb24gdGhlIGN1cnJlbnQge0BsaW5rIENvbm5lY3Rpb259LgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNoYW5kbGVTUUxXYXJuaW5nKFNRTFdhcm5pbmcpCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU1FMV2FybmluZygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKF93YXJuaW5nQWN0aW9uID09IFdBUk5fSUdOT1JFKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKGdldFdhcm5pbmdzKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbGVhcldhcm5pbmdzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIGFueSB7QGxpbmsgU1FMV2FybmluZ31zIG9uIHRoZSBzcGVjaWZpZWQge0BsaW5rIFN0YXRlbWVudH0uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2hhbmRsZVNRTFdhcm5pbmcoU1FMV2FybmluZykKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTUUxXYXJuaW5nKFN0YXRlbWVudCBzdG1udCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoX3dhcm5pbmdBY3Rpb24gPT0gV0FSTl9JR05PUkUpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoc3RtbnQuZ2V0V2FybmluZ3MoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHN0bW50LmNsZWFyV2FybmluZ3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgYW55IHtAbGluayBTUUxXYXJuaW5nfXMgb24gdGhlIHNwZWNpZmllZCB7QGxpbmsgUmVzdWx0U2V0fS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjaGFuZGxlU1FMV2FybmluZyhTUUxXYXJuaW5nKQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNRTFdhcm5pbmcoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChfd2FybmluZ0FjdGlvbiA9PSBXQVJOX0lHTk9SRSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhycy5nZXRXYXJuaW5ncygpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcnMuY2xlYXJXYXJuaW5ncygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0aGUgc3BlY2lmaWVkIHtAbGluayBTUUxXYXJuaW5nfSBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgICAqIHNldHRpbmcgb2YgdGhlIHtAbGluayAjc2V0V2FybmluZ0FjdGlvbn0gYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gd2FybmluZyB0aGUgd2FybmluZyB0byBoYW5kbGUKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTUUxXYXJuaW5nKFNRTFdhcm5pbmcgd2FybmluZykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAod2FybmluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmIChfd2FybmluZ0FjdGlvbiA9PSBXQVJOX0lHTk9SRSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIExvZyBsb2cgPSBfbG9ncy5nZXRKREJDTG9nKCk7CisgICAgICAgICAgICBmb3IgKDsgd2FybmluZyAhPSBudWxsOyB3YXJuaW5nID0gd2FybmluZy5nZXROZXh0V2FybmluZygpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfd2FybmluZ0FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBUk5fTE9HX1RSQUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSh3YXJuaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBUk5fTE9HX0lORk86CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyh3YXJuaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBUk5fTE9HX1dBUk46CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2Fybih3YXJuaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBUk5fTE9HX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcih3YXJuaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBUk5fVEhST1c6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHRocm93IGl0IGFzIGlmIGl0IHdlcmUgYSBTUUxFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHdhcm5pbmc7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FSTl9IQU5ETEU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3dhcm5pbmdIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dhcm5pbmdIYW5kbGVyLmhhbmRsZVdhcm5pbmcod2FybmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ldGFkYXRhIHdyYXBwZXIgdGhhdCBsb2dzIGFjdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIExvZ2dpbmdEYXRhYmFzZU1ldGFEYXRhCisgICAgICAgICAgICBleHRlbmRzIERlbGVnYXRpbmdEYXRhYmFzZU1ldGFEYXRhIHsKKworICAgICAgICAgICAgcHVibGljIExvZ2dpbmdEYXRhYmFzZU1ldGFEYXRhKERhdGFiYXNlTWV0YURhdGEgbWV0YSkgeworICAgICAgICAgICAgICAgIHN1cGVyKG1ldGEsIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldEJlc3RSb3dJZGVudGlmaWVyKFN0cmluZyBjYXRhbG9nLAorICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWEsIFN0cmluZyB0YWJsZSwgaW50IHNjb3BlLCBib29sZWFuIG51bGxhYmxlKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldEJlc3RSb3dJZGVudGlmaWVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2cgKyAiLCAiICsgc2NoZW1hICsgIiwgIiArIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJlc3RSb3dJZGVudGlmaWVyKGNhdGFsb2csIHNjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgdGFibGUsIHNjb3BlLCBudWxsYWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0Q2F0YWxvZ3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJnZXRDYXRhbG9ncyIsIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDYXRhbG9ncygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldENvbHVtblByaXZpbGVnZXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsCisgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlLCBTdHJpbmcgY29sdW1uTmFtZVBhdHRlcm4pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldENvbHVtblByaXZpbGVnZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2F0YWxvZyArICIsICIgKyBzY2hlbWEgKyAiLCAiICsgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBMb2dnaW5nQ29ubmVjdGlvbi50aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29sdW1uUHJpdmlsZWdlcyhjYXRhbG9nLCBzY2hlbWEsCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBjb2x1bW5OYW1lUGF0dGVybik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0Q29sdW1ucyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYVBhdHRlcm4sCisgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZVBhdHRlcm4sIFN0cmluZyBjb2x1bW5OYW1lUGF0dGVybikKKyAgICAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJnZXRDb2x1bW5zOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2cgKyAiLCAiICsgc2NoZW1hUGF0dGVybiArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGFibGVOYW1lUGF0dGVybiArICIsICIgKyBjb2x1bW5OYW1lUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDb2x1bW5zKGNhdGFsb2csIHNjaGVtYVBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVBhdHRlcm4sIGNvbHVtbk5hbWVQYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFJlc3VsdFNldCBnZXRDcm9zc1JlZmVyZW5jZShTdHJpbmcgcHJpbWFyeUNhdGFsb2csCisgICAgICAgICAgICAgICAgU3RyaW5nIHByaW1hcnlTY2hlbWEsIFN0cmluZyBwcmltYXJ5VGFibGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIGZvcmVpZ25DYXRhbG9nLCBTdHJpbmcgZm9yZWlnblNjaGVtYSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgZm9yZWlnblRhYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJnZXRDcm9zc1JlZmVyZW5jZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcmltYXJ5Q2F0YWxvZyArICIsICIgKyBwcmltYXJ5U2NoZW1hICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcmltYXJ5VGFibGUgKyAiLCAiICsgZm9yZWlnbkNhdGFsb2cgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZvcmVpZ25TY2hlbWEgKyAiLCAiICsgZm9yZWlnblNjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDcm9zc1JlZmVyZW5jZShwcmltYXJ5Q2F0YWxvZywgcHJpbWFyeVNjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVRhYmxlLCBmb3JlaWduQ2F0YWxvZywgZm9yZWlnblNjaGVtYSwgZm9yZWlnblRhYmxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFJlc3VsdFNldCBnZXRFeHBvcnRlZEtleXMoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsCisgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJnZXRFeHBvcnRlZEtleXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2F0YWxvZyArICIsICIgKyBzY2hlbWEgKyAiLCAiICsgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBMb2dnaW5nQ29ubmVjdGlvbi50aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXhwb3J0ZWRLZXlzKGNhdGFsb2csIHNjaGVtYSwgdGFibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldEltcG9ydGVkS2V5cyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldEltcG9ydGVkS2V5czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXRhbG9nICsgIiwgIiArIHNjaGVtYSArICIsICIgKyB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRJbXBvcnRlZEtleXMoY2F0YWxvZywgc2NoZW1hLCB0YWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0SW5kZXhJbmZvKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLAorICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZSwgYm9vbGVhbiB1bmlxdWUsIGJvb2xlYW4gYXBwcm94aW1hdGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2dzLmlzSkRCQ0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgX2xvZ3MubG9nSkRCQygiZ2V0SW5kZXhJbmZvOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2cgKyAiLCAiICsgc2NoZW1hICsgIiwgIiArIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluZGV4SW5mbyhjYXRhbG9nLCBzY2hlbWEsIHRhYmxlLCB1bmlxdWUsCisgICAgICAgICAgICAgICAgICAgIGFwcHJveGltYXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFJlc3VsdFNldCBnZXRQcmltYXJ5S2V5cyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFByaW1hcnlLZXlzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2cgKyAiLCAiICsgc2NoZW1hICsgIiwgIiArIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByaW1hcnlLZXlzKGNhdGFsb2csIHNjaGVtYSwgdGFibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFByb2NlZHVyZUNvbHVtbnMoU3RyaW5nIGNhdGFsb2csCisgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYVBhdHRlcm4sIFN0cmluZyBwcm9jZWR1cmVOYW1lUGF0dGVybiwKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uTmFtZVBhdHRlcm4pIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFByb2NlZHVyZUNvbHVtbnM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2F0YWxvZyArICIsICIgKyBzY2hlbWFQYXR0ZXJuICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9jZWR1cmVOYW1lUGF0dGVybiArICIsICIgKyBjb2x1bW5OYW1lUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9jZWR1cmVDb2x1bW5zKGNhdGFsb2csIHNjaGVtYVBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgIHByb2NlZHVyZU5hbWVQYXR0ZXJuLCBjb2x1bW5OYW1lUGF0dGVybik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0UHJvY2VkdXJlcyhTdHJpbmcgY2F0YWxvZywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hUGF0dGVybiwgU3RyaW5nIHByb2NlZHVyZU5hbWVQYXR0ZXJuKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFByb2NlZHVyZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2F0YWxvZyArICIsICIgKyBzY2hlbWFQYXR0ZXJuICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9jZWR1cmVOYW1lUGF0dGVybiwgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb2NlZHVyZXMoY2F0YWxvZywgc2NoZW1hUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlTmFtZVBhdHRlcm4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFNjaGVtYXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJnZXRTY2hlbWFzIiwgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNjaGVtYXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFJlc3VsdFNldCBnZXRUYWJsZVByaXZpbGVnZXMoU3RyaW5nIGNhdGFsb2csCisgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYVBhdHRlcm4sIFN0cmluZyB0YWJsZU5hbWVQYXR0ZXJuKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFRhYmxlUHJpdmlsZWdlcyIsIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUYWJsZVByaXZpbGVnZXMoY2F0YWxvZywgc2NoZW1hUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lUGF0dGVybik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0VGFibGVzKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hUGF0dGVybiwKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGVOYW1lUGF0dGVybiwgU3RyaW5nW10gdHlwZXMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFRhYmxlczogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXRhbG9nICsgIiwgIiArIHNjaGVtYVBhdHRlcm4gKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRhYmxlTmFtZVBhdHRlcm4sIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUYWJsZXMoY2F0YWxvZywgc2NoZW1hUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lUGF0dGVybiwgdHlwZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0IGdldFRhYmxlVHlwZXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJnZXRUYWJsZVR5cGVzIiwgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhYmxlVHlwZXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFJlc3VsdFNldCBnZXRUeXBlSW5mbygpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFR5cGVJbmZvIiwgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFR5cGVJbmZvKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBSZXN1bHRTZXQgZ2V0VURUcyhTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYVBhdHRlcm4sCisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lUGF0dGVybiwgaW50W10gdHlwZXMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFVEVHMiLCBMb2dnaW5nQ29ubmVjdGlvbi50aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VURUcyhjYXRhbG9nLCBzY2hlbWFQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZVBhdHRlcm4sIHR5cGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFJlc3VsdFNldCBnZXRWZXJzaW9uQ29sdW1ucyhTdHJpbmcgY2F0YWxvZywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImdldFZlcnNpb25Db2x1bW5zOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2cgKyAiLCAiICsgc2NoZW1hICsgIiwgIiArIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZlcnNpb25Db2x1bW5zKGNhdGFsb2csIHNjaGVtYSwgdGFibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXRlbWVudCB3cmFwcGVyIHRoYXQgbG9ncyBTUUwgdG8gdGhlIHBhcmVudCBkYXRhIHNvdXJjZSBhbmQKKyAgICAgICAgICogcmVtZW1iZXJzIHRoZSBsYXN0IHBpZWNlIG9mIFNRTCB0byBiZSBleGVjdXRlZCBvbiBpdC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgTG9nZ2luZ1N0YXRlbWVudCBleHRlbmRzIERlbGVnYXRpbmdTdGF0ZW1lbnQgeworCisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfc3FsID0gbnVsbDsKKworICAgICAgICAgICAgcHVibGljIExvZ2dpbmdTdGF0ZW1lbnQoU3RhdGVtZW50IHN0bW50KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzdXBlcihzdG1udCwgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZEluZm8oU3RyaW5nQnVmZmVyIGJ1ZikgeworICAgICAgICAgICAgICAgIGlmIChfc3FsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICBpZiAoX2Zvcm1hdHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKFNFUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKF9mb3JtYXR0ZXIucHJldHR5UHJpbnQoX3NxbCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChfc3FsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIFJlc3VsdFNldCB3cmFwUmVzdWx0KFJlc3VsdFNldCBycywgYm9vbGVhbiB3cmFwKSB7CisgICAgICAgICAgICAgICAgaWYgKCF3cmFwIHx8IHJzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci53cmFwUmVzdWx0KHJzLCB3cmFwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdSZXN1bHRTZXQocnMsIHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3MuaXNKREJDRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dKREJDKCJjYW5jZWwgIiArIHRoaXMsIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIHN1cGVyLmNhbmNlbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeShTdHJpbmcgc3FsLCBib29sZWFuIHdyYXApCisgICAgICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgX3NxbCA9IHNxbDsKKyAgICAgICAgICAgICAgICBsb2dTUUwodGhpcyk7CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5leGVjdXRlUXVlcnkoc3FsLCB3cmFwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgd3JhcChzZSwgTG9nZ2luZ1N0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsb2dUaW1lKHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhMb2dnaW5nU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIF9zcWwgPSBzcWw7CisgICAgICAgICAgICAgICAgbG9nU1FMKHRoaXMpOworICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZVVwZGF0ZShzcWwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyB3cmFwKHNlLCBMb2dnaW5nU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1RpbWUoc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdTdGF0ZW1lbnQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIF9zcWwgPSBzcWw7CisgICAgICAgICAgICAgICAgbG9nU1FMKHRoaXMpOworICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZShzcWwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyB3cmFwKHNlLCBMb2dnaW5nU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1RpbWUoc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdTdGF0ZW1lbnQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQKKyAgICAgICAgICAgIGV4dGVuZHMgRGVsZWdhdGluZ1ByZXBhcmVkU3RhdGVtZW50IHsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3NxbDsKKyAgICAgICAgICAgIHByaXZhdGUgTGlzdCBfcGFyYW1zID0gbnVsbDsKKyAgICAgICAgICAgIHByaXZhdGUgTGlzdCBfcGFyYW1CYXRjaCA9IG51bGw7CisKKyAgICAgICAgICAgIHB1YmxpYyBMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnQgc3RtbnQsIFN0cmluZyBzcWwpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc3VwZXIoc3RtbnQsIExvZ2dpbmdDb25uZWN0aW9uLnRoaXMpOworICAgICAgICAgICAgICAgIF9zcWwgPSBzcWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBSZXN1bHRTZXQgd3JhcFJlc3VsdChSZXN1bHRTZXQgcnMsIGJvb2xlYW4gd3JhcCkgeworICAgICAgICAgICAgICAgIGlmICghd3JhcCB8fCBycyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIud3JhcFJlc3VsdChycywgd3JhcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dnaW5nUmVzdWx0U2V0KHJzLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoU3RyaW5nIHNxbCwgYm9vbGVhbiB3cmFwKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvZ1NRTCh0aGlzKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVRdWVyeShzcWwsIHdyYXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyB3cmFwKHNlLCBMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQudGhpcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nVGltZShzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyTG9nUGFyYW1ldGVycyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgbG9nU1FMKHRoaXMpOworICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXhlY3V0ZVVwZGF0ZShzcWwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyB3cmFwKHNlLCBMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQudGhpcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nVGltZShzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyTG9nUGFyYW1ldGVycyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhMb2dnaW5nUHJlcGFyZWRTdGF0ZW1lbnQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvZ1NRTCh0aGlzKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGUoc3FsKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgd3JhcChzZSwgTG9nZ2luZ1ByZXBhcmVkU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1RpbWUoc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBjbGVhckxvZ1BhcmFtZXRlcnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoTG9nZ2luZ1ByZXBhcmVkU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIFJlc3VsdFNldCBleGVjdXRlUXVlcnkoYm9vbGVhbiB3cmFwKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBsb2dTUUwodGhpcyk7CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5leGVjdXRlUXVlcnkod3JhcCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHdyYXAoc2UsIExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsb2dUaW1lKHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJMb2dQYXJhbWV0ZXJzKHRydWUpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZSgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvZ1NRTCh0aGlzKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgd3JhcChzZSwgTG9nZ2luZ1ByZXBhcmVkU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1RpbWUoc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBjbGVhckxvZ1BhcmFtZXRlcnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoTG9nZ2luZ1ByZXBhcmVkU3RhdGVtZW50LnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludFtdIGV4ZWN1dGVCYXRjaCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvZ1NRTCh0aGlzKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGVCYXRjaCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZXhjZXB0aW9uIGlzIGEgQmF0Y2hVcGRhdGVFeGNlcHRpb24sIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgdHJhY2tpbmcgcGFyYW1ldGVycywgdGhlbiBzZXQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIHNldCB0byBiZSB0aGUgaW5kZXggb2YgdGhlIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQgc28gdGhhdCB0aGUgUmVwb3J0aW5nU1FMRXhjZXB0aW9uIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgY29ycmVjdCBwYXJhbQorICAgICAgICAgICAgICAgICAgICBpZiAoc2UgaW5zdGFuY2VvZiBCYXRjaFVwZGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX3BhcmFtQmF0Y2ggIT0gbnVsbCAmJiBzaG91bGRUcmFja1BhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gY291bnQgPSAoKEJhdGNoVXBkYXRlRXhjZXB0aW9uKSBzZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXBkYXRlQ291bnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gbnVsbCAmJiBjb3VudC5sZW5ndGggPD0gX3BhcmFtQmF0Y2guc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLTMgaXMgU3RhdGVtZW50LlNUQVRFTUVOVF9GQUlMRUQsIGJ1dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGF2YWlsYWJsZSBpbiBKREsgMS40KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRbaV0gPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gLTMgZWxlbWVudDogaXQgbWF5IGJlIHRoYXQgdGhlIHNlcnZlciBzdG9wcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZywgc28gdGhlIHNpemUgb2YgdGhlIGNvdW50IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY291bnQubGVuZ3RoICsgMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgY3VycmVudCBwYXJhbXMgdG8gdGhlIHNhdmVkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IF9wYXJhbUJhdGNoLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtcyA9IChMaXN0KSBfcGFyYW1CYXRjaC5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IHdyYXAoc2UsIExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsb2dUaW1lKHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJMb2dQYXJhbWV0ZXJzKHRydWUpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBsb2dTUUwodGhpcyk7CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHdyYXAoc2UsIExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsb2dUaW1lKHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJMb2dQYXJhbWV0ZXJzKHRydWUpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdQcmVwYXJlZFN0YXRlbWVudC50aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfbG9ncy5pc0pEQkNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIF9sb2dzLmxvZ0pEQkMoImNhbmNlbCAiICsgdGhpcyArICI6ICIgKyBfc3FsLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0Nvbm5lY3Rpb24udGhpcyk7CisKKyAgICAgICAgICAgICAgICBzdXBlci5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TnVsbChpbnQgaTEsIGludCBpMikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGkxLCAibnVsbCIsIG51bGwpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldE51bGwoaTEsIGkyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbihpbnQgaSwgYm9vbGVhbiBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgYik7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0Qm9vbGVhbihpLCBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Qnl0ZShpbnQgaSwgYnl0ZSBiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgYik7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0Qnl0ZShpLCBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0U2hvcnQoaW50IGksIHNob3J0IHMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpLCBzKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRTaG9ydChpLCBzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW50KGludCBpMSwgaW50IGkyKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaTEsIGkyKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRJbnQoaTEsIGkyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TG9uZyhpbnQgaSwgbG9uZyBsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgbCk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0TG9uZyhpLCBsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoaW50IGksIGZsb2F0IGYpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpLCBmKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRGbG9hdChpLCBmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RG91YmxlKGludCBpLCBkb3VibGUgZCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksIGQpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldERvdWJsZShpLCBkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbChpbnQgaSwgQmlnRGVjaW1hbCBiZCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgIkJpZ0RlY2ltYWwiLCBiZCk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0QmlnRGVjaW1hbChpLCBiZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhpbnQgaSwgU3RyaW5nIHMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpLCAiU3RyaW5nIiwgcyk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0U3RyaW5nKGksIHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRCeXRlcyhpbnQgaSwgYnl0ZVtdIGIpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpLCAiYnl0ZVtdIiwgYik7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0Qnl0ZXMoaSwgYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGUoaW50IGksIERhdGUgZCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksICJEYXRlIiwgZCk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0RGF0ZShpLCBkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZShpbnQgaSwgVGltZSB0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgIlRpbWUiLCB0KTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRUaW1lKGksIHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoaW50IGksIFRpbWVzdGFtcCB0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgIlRpbWVzdGFtcCIsIHQpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldFRpbWVzdGFtcChpLCB0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oaW50IGkxLCBJbnB1dFN0cmVhbSBpcywgaW50IGkyKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpMSwgIklucHV0U3RyZWFtIiwgaXMpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldEFzY2lpU3RyZWFtKGkxLCBpcywgaTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbmljb2RlU3RyZWFtKGludCBpMSwgSW5wdXRTdHJlYW0gaXMsIGludCBpMikKKyAgICAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaTEsICJJbnB1dFN0cmVhbSIsIGlzKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRVbmljb2RlU3RyZWFtKGkyLCBpcywgaTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRCaW5hcnlTdHJlYW0oaW50IGkxLCBJbnB1dFN0cmVhbSBpcywgaW50IGkyKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpMSwgIklucHV0U3RyZWFtIiwgaXMpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldEJpbmFyeVN0cmVhbShpMSwgaXMsIGkyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgY2xlYXJMb2dQYXJhbWV0ZXJzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdXBlci5jbGVhclBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBpMSwgT2JqZWN0IG8sIGludCBpMiwgaW50IGkzKQorICAgICAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpMSwgIk9iamVjdCIsIG8pOworICAgICAgICAgICAgICAgIHN1cGVyLnNldE9iamVjdChpMSwgbywgaTIsIGkzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBpMSwgT2JqZWN0IG8sIGludCBpMikKKyAgICAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaTEsICJPYmplY3QiLCBvKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRPYmplY3QoaTEsIG8sIGkyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KGludCBpLCBPYmplY3QgbykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksICJPYmplY3QiLCBvKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRPYmplY3QoaSwgbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEJhdGNoKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2dzLmlzU1FMRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9ncy5sb2dTUUwoImJhdGNoaW5nICIgKyB0aGlzLCBMb2dnaW5nQ29ubmVjdGlvbi50aGlzKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuYWRkQmF0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFRyYWNrUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgb3VyIGxpc3QgaXMgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyYW1CYXRjaCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJhbUJhdGNoID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBwYXJhbWV0ZXJzIHNpbmNlIHRoZXkgd2lsbCBiZSByZS11c2VkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhcmFtcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJhbUJhdGNoLmFkZChuZXcgQXJyYXlMaXN0KF9wYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1CYXRjaC5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1RpbWUoc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyU3RyZWFtKGludCBpMSwgUmVhZGVyIHIsIGludCBpMikKKyAgICAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaTEsICJSZWFkZXIiLCByKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRDaGFyYWN0ZXJTdHJlYW0oaTEsIHIsIGkyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVmKGludCBpLCBSZWYgcikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksICJSZWYiLCByKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRSZWYoaSwgcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJsb2IoaW50IGksIEJsb2IgYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksICJCbG9iIiwgYik7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0QmxvYihpLCBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xvYihpbnQgaSwgQ2xvYiBjKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgIkNsb2IiLCBjKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRDbG9iKGksIGMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShpbnQgaSwgQXJyYXkgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksICJBcnJheSIsIGEpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldEFycmF5KGksIGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0ZShpbnQgaSwgRGF0ZSBkLCBDYWxlbmRhciBjKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaSwgIkRhdGUiLCBkKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXREYXRlKGksIGQsIGMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKGludCBpLCBUaW1lIHQsIENhbGVuZGFyIGMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpLCAiVGltZSIsIHQpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldFRpbWUoaSwgdCwgYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChpbnQgaSwgVGltZXN0YW1wIHQsIENhbGVuZGFyIGMpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGksICJUaW1lc3RhbXAiLCB0KTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRUaW1lc3RhbXAoaSwgdCwgYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE51bGwoaW50IGkxLCBpbnQgaTIsIFN0cmluZyBzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaTEsICJudWxsIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0TnVsbChpMSwgaTIsIHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRJbmZvKFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgaWYgKF9mb3JtYXR0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKFNFUCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2Zvcm1hdHRlci5wcmV0dHlQcmludChfc3FsKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU0VQKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKF9zcWwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbUJ1ZiA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKF9wYXJhbXMgIT0gbnVsbCAmJiAhX3BhcmFtcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX3BhcmFtcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1CdWYuYXBwZW5kKGl0ci5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1CdWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtQnVmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfcHJldHR5UHJpbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIltwYXJhbXM9IikuCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQocGFyYW1CdWYudG9TdHJpbmcoKSkuYXBwZW5kKCJdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cGVyLmFwcGVuZEluZm8oYnVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTG9nUGFyYW1ldGVycyhib29sZWFuIGJhdGNoKSB7CisgICAgICAgICAgICAgICAgaWYgKF9wYXJhbXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX3BhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGlmIChiYXRjaCAmJiBfcGFyYW1CYXRjaCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfcGFyYW1CYXRjaC5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkVHJhY2tQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBfdHJhY2tQYXJhbWV0ZXJzIHx8IF9sb2dzLmlzU1FMRW5hYmxlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgc2V0TG9nUGFyYW1ldGVyKGludCBpbmRleCwgYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkVHJhY2tQYXJhbWV0ZXJzKCkpCisgICAgICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpbmRleCwgIihib29sZWFuKSAiICsgdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExvZ1BhcmFtZXRlcihpbnQgaW5kZXgsIGJ5dGUgdmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFRyYWNrUGFyYW1ldGVycygpKQorICAgICAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaW5kZXgsICIoYnl0ZSkgIiArIHZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBzZXRMb2dQYXJhbWV0ZXIoaW50IGluZGV4LCBkb3VibGUgdmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFRyYWNrUGFyYW1ldGVycygpKQorICAgICAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaW5kZXgsICIoZG91YmxlKSAiICsgdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExvZ1BhcmFtZXRlcihpbnQgaW5kZXgsIGZsb2F0IHZhbCkgeworICAgICAgICAgICAgICAgIGlmIChzaG91bGRUcmFja1BhcmFtZXRlcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGluZGV4LCAiKGZsb2F0KSAiICsgdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExvZ1BhcmFtZXRlcihpbnQgaW5kZXgsIGludCB2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkVHJhY2tQYXJhbWV0ZXJzKCkpCisgICAgICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpbmRleCwgIihpbnQpICIgKyB2YWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgc2V0TG9nUGFyYW1ldGVyKGludCBpbmRleCwgbG9uZyB2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkVHJhY2tQYXJhbWV0ZXJzKCkpCisgICAgICAgICAgICAgICAgICAgIHNldExvZ1BhcmFtZXRlcihpbmRleCwgIihsb25nKSAiICsgdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExvZ1BhcmFtZXRlcihpbnQgaW5kZXgsIHNob3J0IHZhbCkgeworICAgICAgICAgICAgICAgIGlmIChzaG91bGRUcmFja1BhcmFtZXRlcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0TG9nUGFyYW1ldGVyKGluZGV4LCAiKHNob3J0KSAiICsgdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExvZ1BhcmFtZXRlcihpbnQgaW5kZXgsIFN0cmluZyB0eXBlLCBPYmplY3QgdmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFRyYWNrUGFyYW1ldGVycygpKQorICAgICAgICAgICAgICAgICAgICBzZXRMb2dQYXJhbWV0ZXIoaW5kZXgsICIoIiArIHR5cGUgKyAiKSAiICsgdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExvZ1BhcmFtZXRlcihpbnQgaW5kZXgsIFN0cmluZyB2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoX3BhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfcGFyYW1zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChfcGFyYW1zLnNpemUoKSA8IGluZGV4KQorICAgICAgICAgICAgICAgICAgICBfcGFyYW1zLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCgpID4gODApCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgNzcpICsgIi4uLiI7CisgICAgICAgICAgICAgICAgX3BhcmFtcy5zZXQoaW5kZXggLSAxLCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdhcm5pbmctaGFuZGxpbmcgcmVzdWx0IHNldC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgTG9nZ2luZ1Jlc3VsdFNldCBleHRlbmRzIERlbGVnYXRpbmdSZXN1bHRTZXQgeworCisgICAgICAgICAgICBwdWJsaWMgTG9nZ2luZ1Jlc3VsdFNldChSZXN1bHRTZXQgcnMsIFN0YXRlbWVudCBzdG1udCkgeworICAgICAgICAgICAgICAgIHN1cGVyKHJzLCBzdG1udCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIubmV4dCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoTG9nZ2luZ1Jlc3VsdFNldC50aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdSZXN1bHRTZXQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVGaXJzdCgpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmJlZm9yZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhMb2dnaW5nUmVzdWx0U2V0LnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJMYXN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuYWZ0ZXJMYXN0KCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhMb2dnaW5nUmVzdWx0U2V0LnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZmlyc3QoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZmlyc3QoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdSZXN1bHRTZXQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBsYXN0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxhc3QoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdSZXN1bHRTZXQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhYnNvbHV0ZShpbnQgYSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmFic29sdXRlKGEpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNRTFdhcm5pbmcoTG9nZ2luZ1Jlc3VsdFNldC50aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGF0aXZlKGludCBhKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVsYXRpdmUoYSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU1FMV2FybmluZyhMb2dnaW5nUmVzdWx0U2V0LnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJldmlvdXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucHJldmlvdXMoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTUUxXYXJuaW5nKExvZ2dpbmdSZXN1bHRTZXQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9SZXBvcnRpbmdTUUxFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvUmVwb3J0aW5nU1FMRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwMTA4YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvUmVwb3J0aW5nU1FMRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmM7CisKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworCisvKioKKyAqIEEge0BsaW5rIFNRTEV4Y2VwdGlvbn0gdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAorICogdGhlIHtAbGluayBTdGF0ZW1lbnR9IFNRTCB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnRpbmdTUUxFeGNlcHRpb24gZXh0ZW5kcyBTUUxFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCB0cmFuc2llbnQgU3RhdGVtZW50IF9zdG1udDsKKyAgICBwcml2YXRlIGZpbmFsIFNRTEV4Y2VwdGlvbiBfc3FsZTsKKworICAgIHB1YmxpYyBSZXBvcnRpbmdTUUxFeGNlcHRpb24oU1FMRXhjZXB0aW9uIHNxbGUsIFN0YXRlbWVudCBzdG1udCwKKyAgICAgICAgU3RyaW5nIHNxbCkgeworICAgICAgICBzdXBlcihnZXRFeGNlcHRpb25NZXNzYWdlKHNxbGUsIHN0bW50LCBzcWwpKTsKKyAgICAgICAgdGhpcy5fc3FsZSA9IHNxbGU7CisgICAgICAgIHRoaXMuX3N0bW50ID0gc3RtbnQ7CisgICAgICAgIHNldE5leHRFeGNlcHRpb24oc3FsZSk7CisgICAgfQorCisgICAgcHVibGljIFJlcG9ydGluZ1NRTEV4Y2VwdGlvbihTUUxFeGNlcHRpb24gc3FsZSwgU3RyaW5nIHNxbCkgeworICAgICAgICB0aGlzKHNxbGUsIG51bGwsIHNxbCk7CisgICAgfQorCisgICAgcHVibGljIFJlcG9ydGluZ1NRTEV4Y2VwdGlvbihTUUxFeGNlcHRpb24gc3FsZSwgU3RhdGVtZW50IHN0bW50KSB7CisgICAgICAgIHRoaXMoc3FsZSwgc3RtbnQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNRTCBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgU1FMRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNRTFN0YXRlKCkgeworICAgICAgICByZXR1cm4gX3NxbGUuZ2V0U1FMU3RhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHtAbGluayBTUUxFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXJyb3JDb2RlKCkgeworICAgICAgICByZXR1cm4gX3NxbGUuZ2V0RXJyb3JDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFN0YXRlbWVudH0gdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldFN0YXRlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdG1udDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uTWVzc2FnZShTUUxFeGNlcHRpb24gc3FsZSwKKyAgICAgICAgU3RhdGVtZW50IHN0bW50LCBTdHJpbmcgc3FsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc3RtbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3FsZS5nZXRNZXNzYWdlKCkgKyAiIHsiICsgc3RtbnQgKyAifSAiCisgICAgICAgICAgICAgICAgICAgICsgIltjb2RlPSIgKyBzcWxlLmdldEVycm9yQ29kZSgpICsgIiwgc3RhdGU9IgorICAgICAgICAgICAgICAgICAgICArIHNxbGUuZ2V0U1FMU3RhdGUoKSArICJdIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNxbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBzcWxlLmdldE1lc3NhZ2UoKSArICIgeyIgKyBzcWwgKyAifSAiCisgICAgICAgICAgICAgICAgICAgICsgIltjb2RlPSIgKyBzcWxlLmdldEVycm9yQ29kZSgpICsgIiwgc3RhdGU9IgorICAgICAgICAgICAgICAgICAgICArIHNxbGUuZ2V0U1FMU3RhdGUoKSArICJdIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gc3FsZS5nZXRNZXNzYWdlKCkgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgKyAiW2NvZGU9IiArIHNxbGUuZ2V0RXJyb3JDb2RlKCkgKyAiLCBzdGF0ZT0iCisgICAgICAgICAgICAgICAgICAgICsgc3FsZS5nZXRTUUxTdGF0ZSgpICsgIl0iOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIHNxbGUuZ2V0TWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL1NRTEZvcm1hdHRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9TUUxGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI3MGUyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9TUUxGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKgorICogTG90cyBvZiB0aGlzIGNvdWxkIGJlIGFic3RyYWN0ZWQgb3V0IGludG8gYSB3b3JkLXdyYXBwaW5nIGNsYXNzLgorICovCisKKy8qKgorICogQ29udmVydHMgc2luZ2xlLWxpbmUgU1FMIHN0cmluZ3MgaW50byBuaWNlbHktZm9ybWF0dGVkCisgKiBtdWx0aS1saW5lLCBpbmRlbnRlZCBzdGF0ZW1lbnRzLgorICogRXhhbXBsZTogZnJvbSBQRVJTT04gdDAsIENPTVBBTlkgdDEgV0hFUkUgdDAuSUQgPSAxMCBBTkQgXAorICogdDAuQ09NUEFOWV9JRCA9IHQxLklEIEFORCB0MS5OQU1FID0gJ09wZW5KUEEnPC9jb2RlPiBiZWNvbWVzCisgKiA8Y29kZT5TRUxFQ1QgKiBGUk9NIFBFUlNPTiB0MCwgQ09NUEFOWSB0MQorICogV0hFUkUgdDAuSUQgPSAxMCBBTkQgdDAuQ09NUEFOWV9JRCA9IHQxLklEIEFORCB0MS5OQU1FID0gJ09wZW5KUEEnXAorICogPC9jb2RlPiBhbmQKKyAqIDxjb2RlPklOU0VSVCBJTlRPIFBFUlNPTiBWQUxVRVMoJ1BhdHJpY2snLCAnTGluc2tleScsICdPcGVuSlBBJywgXAorICogJzIwMiA1OTUgMjA2NCB4MTExMScpPC9jb2RlPiBiZWNvbWVzCisgKiA8Y29kZT5JTlNFUlQgSU5UTyBQRVJTT04gVkFMVUVTKCdQYXRyaWNrJywgJ0xpbnNrZXknLCAnT3BlbkpQQScsICcyMDIKKyAqIDU5NSAyMDY0IHgxMTExJyk8L2NvZGU+IGV0Yy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICovCitwdWJsaWMgY2xhc3MgU1FMRm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtdWx0aUxpbmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG91YmxlU3BhY2UgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIG5ld2xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgcHJpdmF0ZSBpbnQgbGluZUxlbmd0aCA9IDcyOworICAgIHByaXZhdGUgU3RyaW5nIHdyYXBJbmRlbnQgPSAiICAgICAgICAiOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXVzZUluZGVudCA9ICIgICAgIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNlbGVjdFNlcGFyYXRvcnMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICJGUk9NICIsICJXSEVSRSAiLCAiT1JERVIgQlkgIiwgLy8gIyMjIGlzIHRoaXMgb3JkZXIgY29ycmVjdD8KKyAgICAgICAgIkdST1VQIEJZICIsICJIQVZJTkcgIiwgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGluc2VydFNlcGFyYXRvcnMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICJWQUxVRVMgIiwgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHVwZGF0ZVNlcGFyYXRvcnMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICJTRVQgIiwgIldIRVJFICIsIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZWxldGVTZXBhcmF0b3JzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAiV0hFUkUgIiwgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNyZWF0ZVRhYmxlU2VwYXJhdG9ycyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgIiggIiwgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNyZWF0ZUluZGV4U2VwYXJhdG9ycyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgIk9OICIsICIoICIsIH07CisKKyAgICBwdWJsaWMgdm9pZCBzZXROZXdsaW5lKFN0cmluZyB2YWwpIHsKKyAgICAgICAgbmV3bGluZSA9IHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5ld2xpbmUoKSB7CisgICAgICAgIHJldHVybiBuZXdsaW5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpbmVMZW5ndGgoaW50IHZhbCkgeworICAgICAgICBsaW5lTGVuZ3RoID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIGxpbmVMZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3JhcEluZGVudChTdHJpbmcgdmFsKSB7CisgICAgICAgIHdyYXBJbmRlbnQgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRXcmFwSW5kZW50KCkgeworICAgICAgICByZXR1cm4gd3JhcEluZGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGF1c2VJbmRlbnQoU3RyaW5nIHZhbCkgeworICAgICAgICBjbGF1c2VJbmRlbnQgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDbGF1c2VJbmRlbnQoKSB7CisgICAgICAgIHJldHVybiBjbGF1c2VJbmRlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlbiB0cnkgdG8gcGFyc2UgbXVsdGktbGluZSBTUUwgc3RhdGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aUxpbmUoYm9vbGVhbiBtdWx0aUxpbmUpIHsKKyAgICAgICAgdGhpcy5tdWx0aUxpbmUgPSBtdWx0aUxpbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlbiB0cnkgdG8gcGFyc2UgbXVsdGktbGluZSBTUUwgc3RhdGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNdWx0aUxpbmUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm11bHRpTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB0aGVuIG91dHB1dCB0d28gbGluZXMgYWZ0ZXIgbXVsdGktbGluZSBzdGF0ZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVNwYWNlKGJvb2xlYW4gZG91YmxlU3BhY2UpIHsKKyAgICAgICAgdGhpcy5kb3VibGVTcGFjZSA9IGRvdWJsZVNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRoZW4gb3V0cHV0IHR3byBsaW5lcyBhZnRlciBtdWx0aS1saW5lIHN0YXRlbWVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RG91YmxlU3BhY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvdWJsZVNwYWNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHJldHR5UHJpbnQoT2JqZWN0IHNxbE9iamVjdCkgeworICAgICAgICBpZiAoIW11bHRpTGluZSkgeworICAgICAgICAgICAgcmV0dXJuIHByZXR0eVByaW50TGluZShzcWxPYmplY3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNxbCA9IG5ldyBTdHJpbmdCdWZmZXIoc3FsT2JqZWN0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3FsLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgd2hpbGUgKHNxbC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChzcWwudG9TdHJpbmcoKS5pbmRleE9mKCI7XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgc3FsLnRvU3RyaW5nKCkuaW5kZXhPZigiO1xyIikpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNxbC50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNxbC5zdWJzdHJpbmcoMCwgaW5kZXggKyAyKTsKKworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBsaW5lIGZyb20gdGhlIHNxbCBidWZmZXIKKyAgICAgICAgICAgICAgICBzcWwuZGVsZXRlKDAsIGxpbmUubGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChwcmV0dHlQcmludExpbmUobGluZSkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMSArIChnZXREb3VibGVTcGFjZSgpID8gMSA6IDApOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgcHJldHR5UHJpbnRMaW5lKE9iamVjdCBzcWxPYmplY3QpIHsKKyAgICAgICAgU3RyaW5nIHNxbCA9IHNxbE9iamVjdC50b1N0cmluZygpLnRyaW0oKTsKKyAgICAgICAgU3RyaW5nIGxvd2VyQ2FzZVNxbCA9IHNxbC50b0xvd2VyQ2FzZSgpOworCisgICAgICAgIFN0cmluZ1tdIHNlcGFyYXRvcnM7CisgICAgICAgIGlmIChsb3dlckNhc2VTcWwuc3RhcnRzV2l0aCgic2VsZWN0IikpCisgICAgICAgICAgICBzZXBhcmF0b3JzID0gc2VsZWN0U2VwYXJhdG9yczsKKyAgICAgICAgZWxzZSBpZiAobG93ZXJDYXNlU3FsLnN0YXJ0c1dpdGgoImluc2VydCIpKQorICAgICAgICAgICAgc2VwYXJhdG9ycyA9IGluc2VydFNlcGFyYXRvcnM7CisgICAgICAgIGVsc2UgaWYgKGxvd2VyQ2FzZVNxbC5zdGFydHNXaXRoKCJ1cGRhdGUiKSkKKyAgICAgICAgICAgIHNlcGFyYXRvcnMgPSB1cGRhdGVTZXBhcmF0b3JzOworICAgICAgICBlbHNlIGlmIChsb3dlckNhc2VTcWwuc3RhcnRzV2l0aCgiZGVsZXRlIikpCisgICAgICAgICAgICBzZXBhcmF0b3JzID0gZGVsZXRlU2VwYXJhdG9yczsKKyAgICAgICAgZWxzZSBpZiAobG93ZXJDYXNlU3FsLnN0YXJ0c1dpdGgoImNyZWF0ZSB0YWJsZSIpKQorICAgICAgICAgICAgc2VwYXJhdG9ycyA9IGNyZWF0ZVRhYmxlU2VwYXJhdG9yczsKKyAgICAgICAgZWxzZSBpZiAobG93ZXJDYXNlU3FsLnN0YXJ0c1dpdGgoImNyZWF0ZSBpbmRleCIpKQorICAgICAgICAgICAgc2VwYXJhdG9ycyA9IGNyZWF0ZUluZGV4U2VwYXJhdG9yczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VwYXJhdG9ycyA9IG5ldyBTdHJpbmdbMF07CisKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGVuZCA9IC0xOworICAgICAgICBTdHJpbmdCdWZmZXIgY2xhdXNlOworICAgICAgICBMaXN0IGNsYXVzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGNsYXVzZXMuYWRkKG5ldyBTdHJpbmdCdWZmZXIoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VwYXJhdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZW5kID0gbG93ZXJDYXNlU3FsLmluZGV4T2YoIiAiICsgc2VwYXJhdG9yc1tpXS50b0xvd2VyQ2FzZSgpLAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNsYXVzZSA9IChTdHJpbmdCdWZmZXIpIGNsYXVzZXMuZ2V0KGNsYXVzZXMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBjbGF1c2UuYXBwZW5kKHNxbC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOworCisgICAgICAgICAgICBjbGF1c2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBjbGF1c2VzLmFkZChjbGF1c2UpOworICAgICAgICAgICAgY2xhdXNlLmFwcGVuZChjbGF1c2VJbmRlbnQpOworICAgICAgICAgICAgY2xhdXNlLmFwcGVuZChzZXBhcmF0b3JzW2ldKTsKKworICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxICsgc2VwYXJhdG9yc1tpXS5sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXVzZSA9IChTdHJpbmdCdWZmZXIpIGNsYXVzZXMuZ2V0KGNsYXVzZXMuc2l6ZSgpIC0gMSk7CisgICAgICAgIGNsYXVzZS5hcHBlbmQoc3FsLnN1YnN0cmluZyhzdGFydCkpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBwcCA9IG5ldyBTdHJpbmdCdWZmZXIoc3FsLmxlbmd0aCgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xhdXNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHBwLmFwcGVuZCh3cmFwTGluZSgoKFN0cmluZ0J1ZmZlcikgaXRlci5uZXh0KCkpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICBwcC5hcHBlbmQobmV3bGluZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHAudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB3cmFwTGluZShTdHJpbmcgbGluZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKGxpbmUubGVuZ3RoKCkpOworCisgICAgICAgIC8vIGVuc3VyZSB0aGF0IGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoKCkgJiYKKyAgICAgICAgICAgIChsaW5lLmNoYXJBdChpKSA9PSAnICcgfHwgbGluZS5jaGFyQXQoaSkgPT0gJ1x0Jyk7IGkrKykgeworICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUuY2hhckF0KGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUpOworICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgU3RyaW5nIGVsZW07CisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBlbGVtID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgbGVuZ3RoICs9IGVsZW0ubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHdlIHdvdWxkIGhhdmUgZXhjZWVkZWQgdGhlIG1heCwgd3JpdGUgb3V0IGEgbmV3bGluZQorICAgICAgICAgICAgLy8gYmVmb3JlIHdyaXRpbmcgdGhlIGVsZW0uCisgICAgICAgICAgICBpZiAobGVuZ3RoID49IGxpbmVMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKHdyYXBJbmRlbnQpOworICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChlbGVtKTsKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSB3cmFwSW5kZW50Lmxlbmd0aCgpICsgZWxlbS5sZW5ndGgoKSArIDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCwgdGhlbiB0aGUKKyAgICAgICAgICAgIC8vIGxhc3Qgd29yZCBhbG9uZSB3YXMgdG9vIGxvbmcsIHNvIGp1c3Qgd3JpdGUgb3V0IGEKKyAgICAgICAgICAgIC8vIG5ld2xpbmUgYW5kIG1vdmUgb24uCisgICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGgoKSA+PSBsaW5lTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGVsZW0pOworICAgICAgICAgICAgICAgIGlmICh0b2suaGFzTW9yZVRva2VucygpKQorICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKHdyYXBJbmRlbnQpOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHdyYXBJbmRlbnQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChlbGVtKTsKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICcpOworICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGluZXMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgICAgICBTUUxGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IFNRTEZvcm1hdHRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmb3JtYXR0ZXIucHJldHR5UHJpbnQoYXJnc1tpXSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9qZGJjL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdkOGYyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwzMCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxodG1sPgorPGJvZHk+Cis8cD48c3Ryb25nPkRhdGFiYXNlIENvbm5lY3Rpdml0eTwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgSW5jbHVkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBqYXZheC5zcWwuRGF0YVNvdXJjZX0gQVBJcworICAgIGFyb3VuZCBhIG5vcm1hbCBKREJDIDEueCBkcml2ZXIuIEltcGxlbWVudHMgbG9nZ2luZyBhbmQgdGhlIGFiaWxpdHkgdG8KKyAgICBjdXN0b21pemUgSkRCQyBiZWhhdmlvci4gIEFsc28gaW5jbHVkZXMgYSBmcmFtZXdvcmsgZm9yIGZpcmluZyBhbmQKKyAgICBjb25zdW1pbmcgSkRCQy1yZWxhdGVkIGV2ZW50cy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9BYnN0cmFjdExvZy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0Fic3RyYWN0TG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4OTc4MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9BYnN0cmFjdExvZy5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworLyoqCisgKiBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIExvZ30gaW50ZXJmYWNlLiBXcml0ZXMKKyAqIG91dHB1dCB0byBzdGRvdXQuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9nIGltcGxlbWVudHMgTG9nIHsKKworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIGxvZ2dpbmcgbGV2ZWwgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0VuYWJsZWQoc2hvcnQgbGV2ZWwpOworCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgc3BlY2lmaWVkIGxvZyBtZXNzYWdlIHRvIHRoZSBoYW5kbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGxldmVsIHRoZSBsZXZlbCBvZiB0aGUgbG9nIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgICAgICogQHBhcmFtIHQgdGhlIFRocm93YWJsZSwgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvZyhzaG9ydCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhY2VFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gaXNFbmFibGVkKFRSQUNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkgeworICAgICAgICByZXR1cm4gaXNFbmFibGVkKElORk8pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBpc0VuYWJsZWQoV0FSTik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvckVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBpc0VuYWJsZWQoRVJST1IpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWxFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gaXNFbmFibGVkKEZBVEFMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cmFjZShPYmplY3QgbWVzc2FnZSkgeworICAgICAgICB0cmFjZShtZXNzYWdlLCB0aHJvd2FibGVQYXJhbShtZXNzYWdlLCBudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7CisgICAgICAgIGlmIChpc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nKFRSQUNFLCB0b1N0cmluZyhtZXNzYWdlKSwgdGhyb3dhYmxlUGFyYW0obWVzc2FnZSwgdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG1lc3NhZ2UpIHsKKyAgICAgICAgaW5mbyhtZXNzYWdlLCB0aHJvd2FibGVQYXJhbShtZXNzYWdlLCBudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgaWYgKGlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZyhJTkZPLCB0b1N0cmluZyhtZXNzYWdlKSwgdGhyb3dhYmxlUGFyYW0obWVzc2FnZSwgdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG1lc3NhZ2UpIHsKKyAgICAgICAgd2FybihtZXNzYWdlLCB0aHJvd2FibGVQYXJhbShtZXNzYWdlLCBudWxsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FybihPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgaWYgKGlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZyhXQVJOLCB0b1N0cmluZyhtZXNzYWdlKSwgdGhyb3dhYmxlUGFyYW0obWVzc2FnZSwgdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBtZXNzYWdlKSB7CisgICAgICAgIGVycm9yKG1lc3NhZ2UsIHRocm93YWJsZVBhcmFtKG1lc3NhZ2UsIG51bGwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgaWYgKGlzRXJyb3JFbmFibGVkKCkpCisgICAgICAgICAgICBsb2coRVJST1IsIHRvU3RyaW5nKG1lc3NhZ2UpLCB0aHJvd2FibGVQYXJhbShtZXNzYWdlLCB0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmF0YWwoT2JqZWN0IG1lc3NhZ2UpIHsKKyAgICAgICAgZmF0YWwobWVzc2FnZSwgdGhyb3dhYmxlUGFyYW0obWVzc2FnZSwgbnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkgeworICAgICAgICBpZiAoaXNGYXRhbEVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZyhGQVRBTCwgdG9TdHJpbmcobWVzc2FnZSksIHRocm93YWJsZVBhcmFtKG1lc3NhZ2UsIHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBvYnRhaW4gYSBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRTdGFja1RyYWNlKFRocm93YWJsZSB0KSB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3csIHRydWUpOworICAgICAgICB0LnByaW50U3RhY2tUcmFjZShwdyk7CisgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgIHJldHVybiBzdy50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIGVpdGhlciBnaXZlbiBpbnN0YW5jZSBpcyBhIHRocm93YWJsZSwgcmV0dXJuIGl0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSB0aHJvd2FibGVQYXJhbShPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgaWYgKHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFRocm93YWJsZSkKKyAgICAgICAgICAgIHJldHVybiAoVGhyb3dhYmxlKSBtZXNzYWdlOworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVmZmljaWVudGx5IHR1cm4gdGhlIGdpdmVuIG9iamVjdCBpbnRvIGEgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyAibnVsbCIgOiBvLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0NvbW1vbnNMb2dGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvQ29tbW9uc0xvZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg0MWIxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0NvbW1vbnNMb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2c7CisKKy8qKgorICoge0BsaW5rIExvZ0ZhY3Rvcnl9IGltcGxlbWVudGF0aW9uIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBjb21tb25zIGxvZ2dpbmcKKyAqIGZyYW1ld29yay4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uc0xvZ0ZhY3RvcnkgZXh0ZW5kcyBMb2dGYWN0b3J5QWRhcHRlciB7CisKKyAgICBwcml2YXRlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkgX2ZhY3Rvcnk7CisKKyAgICBwdWJsaWMgQ29tbW9uc0xvZ0ZhY3RvcnkoKSB7CisgICAgICAgIF9mYWN0b3J5ID0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRGYWN0b3J5KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZyBuZXdMb2dBZGFwdGVyKFN0cmluZyBjaGFubmVsKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9nQWRhcHRlcihfZmFjdG9yeS5nZXRJbnN0YW5jZShjaGFubmVsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRhcHRzIGEgY29tbW9ucyBsb2dnaW5nIGxvZyB0byB0aGUge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZ30KKyAgICAgKiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2dBZGFwdGVyIGltcGxlbWVudHMgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nIHsKKworICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBfbG9nOworCisgICAgICAgIHByaXZhdGUgTG9nQWRhcHRlcihvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgd3JhcGVlKSB7CisgICAgICAgICAgICBfbG9nID0gd3JhcGVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvckVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2xvZy5pc0Vycm9yRW5hYmxlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGYXRhbEVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2xvZy5pc0ZhdGFsRW5hYmxlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbmZvRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nLmlzSW5mb0VuYWJsZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJhY2VFbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIF9sb2cuaXNUcmFjZUVuYWJsZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2xvZy5pc1dhcm5FbmFibGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0cmFjZShPYmplY3QgbykgeworICAgICAgICAgICAgX2xvZy50cmFjZShvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy50cmFjZShvLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIF9sb2cuaW5mbyhvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG8sIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBfbG9nLmluZm8obywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBvKSB7CisgICAgICAgICAgICBfbG9nLndhcm4obyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy53YXJuKG8sIHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIF9sb2cuZXJyb3Iobyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbywgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIF9sb2cuZXJyb3IobywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbChPYmplY3QgbykgeworICAgICAgICAgICAgX2xvZy5mYXRhbChvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy5mYXRhbChvLCB0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Mb2cuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Mb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdmN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0xvZy5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nOworCisvKioKKyAqIExvZ2dpbmcgaW50ZXJmYWNlIHRoYXQgaXMgaW5kZXBlbmRlbnQgb2Ygb3RoZXIgbG9nZ2luZyBmcmFtZXdvcmtzLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIExvZyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFRSQUNFID0gMTsKKyAgICAvLyB0aGUgb2xkIERFQlVHIGNvbnN0YW50IHdhcyAyLiBMZWF2aW5nIGEgaG9sZSBmb3IgY29tcGF0aWJpbGl0eS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IElORk8gPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgV0FSTiA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUiA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBGQVRBTCA9IDY7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSB7QGxpbmsgI1RSQUNFfSBsb2cgbGV2ZWwgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZiB0aGUge0BsaW5rICNJTkZPfSBsb2cgbGV2ZWwgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9FbmFibGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSB7QGxpbmsgI1dBUk59IGxvZyBsZXZlbCBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhlIHtAbGluayAjRVJST1J9IGxvZyBsZXZlbCBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXJyb3JFbmFibGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSB7QGxpbmsgI0ZBVEFMfSBsb2cgbGV2ZWwgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogV3JpdGUgb3V0IGEgbG9nIG1lc3NhZ2UgYXQgdGhlIHtAbGluayAjVFJBQ0V9CisgICAgICogbGV2ZWwgd2l0aCB0aGUgc3RyaW5naWZpY2F0aW9uIG9mIDxjb2RlPm88L2NvZGU+IGFzIHRoZSBib2R5CisgICAgICogb2YgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IG8pOworCisgICAgLyoqCisgICAgICogV3JpdGUgb3V0IGEgbG9nIG1lc3NhZ2UgYXQgdGhlIHtAbGluayAjVFJBQ0V9CisgICAgICogbGV2ZWwgd2l0aCB0aGUgc3RyaW5naWZpY2F0aW9uIG9mIDxjb2RlPm88L2NvZGU+IGFzIHRoZSBib2R5CisgICAgICogb2YgdGhlIG1lc3NhZ2UsIGFsc28gb3V0cHV0dGluZyA8Y29kZT50PC9jb2RlPiB0byB0aGUgbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBvLCBUaHJvd2FibGUgdCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBvdXQgYSBsb2cgbWVzc2FnZSBhdCB0aGUge0BsaW5rICNJTkZPfQorICAgICAqIGxldmVsIHdpdGggdGhlIHN0cmluZ2lmaWNhdGlvbiBvZiA8Y29kZT5vPC9jb2RlPiBhcyB0aGUgYm9keQorICAgICAqIG9mIHRoZSBtZXNzYWdlLCBhbHNvIG91dHB1dHRpbmcgPGNvZGU+dDwvY29kZT4gdG8gdGhlIGxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmZvKE9iamVjdCBvKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCBhIGxvZyBtZXNzYWdlIGF0IHRoZSB7QGxpbmsgI0lORk99CisgICAgICogbGV2ZWwgd2l0aCB0aGUgc3RyaW5naWZpY2F0aW9uIG9mIDxjb2RlPm88L2NvZGU+IGFzIHRoZSBib2R5CisgICAgICogb2YgdGhlIG1lc3NhZ2UsIGFsc28gb3V0cHV0dGluZyA8Y29kZT50PC9jb2RlPiB0byB0aGUgbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG8sIFRocm93YWJsZSB0KTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCBhIGxvZyBtZXNzYWdlIGF0IHRoZSB7QGxpbmsgI1dBUk59CisgICAgICogbGV2ZWwgd2l0aCB0aGUgc3RyaW5naWZpY2F0aW9uIG9mIDxjb2RlPm88L2NvZGU+IGFzIHRoZSBib2R5CisgICAgICogb2YgdGhlIG1lc3NhZ2UsIGFsc28gb3V0cHV0dGluZyA8Y29kZT50PC9jb2RlPiB0byB0aGUgbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG8pOworCisgICAgLyoqCisgICAgICogV3JpdGUgb3V0IGEgbG9nIG1lc3NhZ2UgYXQgdGhlIHtAbGluayAjV0FSTn0KKyAgICAgKiBsZXZlbCB3aXRoIHRoZSBzdHJpbmdpZmljYXRpb24gb2YgPGNvZGU+bzwvY29kZT4gYXMgdGhlIGJvZHkKKyAgICAgKiBvZiB0aGUgbWVzc2FnZSwgYWxzbyBvdXRwdXR0aW5nIDxjb2RlPnQ8L2NvZGU+IHRvIHRoZSBsb2cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FybihPYmplY3QgbywgVGhyb3dhYmxlIHQpOworCisgICAgLyoqCisgICAgICogV3JpdGUgb3V0IGEgbG9nIG1lc3NhZ2UgYXQgdGhlIHtAbGluayAjRVJST1J9CisgICAgICogbGV2ZWwgd2l0aCB0aGUgc3RyaW5naWZpY2F0aW9uIG9mIDxjb2RlPm88L2NvZGU+IGFzIHRoZSBib2R5CisgICAgICogb2YgdGhlIG1lc3NhZ2UsIGFsc28gb3V0cHV0dGluZyA8Y29kZT50PC9jb2RlPiB0byB0aGUgbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBvKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCBhIGxvZyBtZXNzYWdlIGF0IHRoZSB7QGxpbmsgI0VSUk9SfQorICAgICAqIGxldmVsIHdpdGggdGhlIHN0cmluZ2lmaWNhdGlvbiBvZiA8Y29kZT5vPC9jb2RlPiBhcyB0aGUgYm9keQorICAgICAqIG9mIHRoZSBtZXNzYWdlLCBhbHNvIG91dHB1dHRpbmcgPGNvZGU+dDwvY29kZT4gdG8gdGhlIGxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbywgVGhyb3dhYmxlIHQpOworCisgICAgLyoqCisgICAgICogV3JpdGUgb3V0IGEgbG9nIG1lc3NhZ2UgYXQgdGhlIHtAbGluayAjRkFUQUx9CisgICAgICogbGV2ZWwgd2l0aCB0aGUgc3RyaW5naWZpY2F0aW9uIG9mIDxjb2RlPm88L2NvZGU+IGFzIHRoZSBib2R5CisgICAgICogb2YgdGhlIG1lc3NhZ2UsIGFsc28gb3V0cHV0dGluZyA8Y29kZT50PC9jb2RlPiB0byB0aGUgbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBvKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCBhIGxvZyBtZXNzYWdlIGF0IHRoZSB7QGxpbmsgI0ZBVEFMfQorICAgICAqIGxldmVsIHdpdGggdGhlIHN0cmluZ2lmaWNhdGlvbiBvZiA8Y29kZT5vPC9jb2RlPiBhcyB0aGUgYm9keQorICAgICAqIG9mIHRoZSBtZXNzYWdlLCBhbHNvIG91dHB1dHRpbmcgPGNvZGU+dDwvY29kZT4gdG8gdGhlIGxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmYXRhbChPYmplY3QgbywgVGhyb3dhYmxlIHQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0xvZzRKTG9nRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0xvZzRKTG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODg5MTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nNEpMb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2c7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKKworLyoqCisgKiB7QGxpbmsgTG9nRmFjdG9yeX0gaW1wbGVtZW50YXRpb24gdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIExvZzRKIGZyYW1ld29yay4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgTGluc2tleQorICovCitwdWJsaWMgY2xhc3MgTG9nNEpMb2dGYWN0b3J5IGV4dGVuZHMgTG9nRmFjdG9yeUFkYXB0ZXIgeworCisgICAgcHJvdGVjdGVkIExvZyBuZXdMb2dBZGFwdGVyKFN0cmluZyBjaGFubmVsKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9nQWRhcHRlcigoTG9nZ2VyKSBMb2dNYW5hZ2VyLmdldExvZ2dlcihjaGFubmVsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRhcHRzIGEgTG9nNEogbG9nZ2VyIHRvIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nfSBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2dBZGFwdGVyIGltcGxlbWVudHMgTG9nIHsKKworICAgICAgICBwcml2YXRlIExvZ2dlciBfbG9nOworCisgICAgICAgIHByaXZhdGUgTG9nQWRhcHRlcihMb2dnZXIgd3JhcGVlKSB7CisgICAgICAgICAgICBfbG9nID0gd3JhcGVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExvZ2dlciBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2xvZy5nZXRFZmZlY3RpdmVMZXZlbCgpLnRvSW50KCkgPj0gTGV2ZWwuREVCVUdfSU5UOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbmZvRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nLmdldEVmZmVjdGl2ZUxldmVsKCkudG9JbnQoKSA+PSBMZXZlbC5JTkZPX0lOVDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2xvZy5nZXRFZmZlY3RpdmVMZXZlbCgpLnRvSW50KCkgPj0gTGV2ZWwuV0FSTl9JTlQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Vycm9yRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nLmdldEVmZmVjdGl2ZUxldmVsKCkudG9JbnQoKSA+PSBMZXZlbC5FUlJPUl9JTlQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nLmdldEVmZmVjdGl2ZUxldmVsKCkudG9JbnQoKSA+PSBMZXZlbC5GQVRBTF9JTlQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0cmFjZShPYmplY3QgbykgeworICAgICAgICAgICAgX2xvZy5kZWJ1ZyhvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy5kZWJ1ZyhvLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIF9sb2cuaW5mbyhvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG8sIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBfbG9nLmluZm8obywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBvKSB7CisgICAgICAgICAgICBfbG9nLndhcm4obyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy53YXJuKG8sIHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIF9sb2cuZXJyb3Iobyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbywgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIF9sb2cuZXJyb3IobywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbChPYmplY3QgbykgeworICAgICAgICAgICAgX2xvZy5mYXRhbChvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgX2xvZy5mYXRhbChvLCB0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Mb2dGYWN0b3J5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTRlMGUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2c7CisKKy8qKgorICogRmFjdG9yeSBmb3IgbG9nIGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIExvZ0ZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbG9nIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBMb2cgZ2V0TG9nKFN0cmluZyBjaGFubmVsKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Mb2dGYWN0b3J5QWRhcHRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0xvZ0ZhY3RvcnlBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMjI1NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Mb2dGYWN0b3J5QWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKKy8qKgorICogQmFzZSB0eXBlIHRoYXQgYWlkcyBpbiBhZGFwdGluZyBhbiBleHRlcm5hbCBsb2cgZnJhbWV3b3JrIHRvIHRoZQorICoge0BsaW5rIExvZ0ZhY3Rvcnl9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2dGYWN0b3J5QWRhcHRlciBpbXBsZW1lbnRzIExvZ0ZhY3RvcnkgeworCisgICAgLy8gY2FjaGUgY2F0ZWdvcnkgdG8gbG9nIGFkYXB0ZXJzCisgICAgcHJpdmF0ZSBNYXAgX2xvZ3MgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsKKworICAgIHB1YmxpYyBMb2cgZ2V0TG9nKFN0cmluZyBjaGFubmVsKSB7CisgICAgICAgIC8vIG5vIGxvY2tpbmc7IE9LIGlmIHNhbWUgYWRhcHRlciBjcmVhdGVkIG11bHRpcGxlIHRpbWVzCisgICAgICAgIExvZyBsb2cgPSAoTG9nKSBfbG9ncy5nZXQoY2hhbm5lbCk7CisgICAgICAgIGlmIChsb2cgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nID0gbmV3TG9nQWRhcHRlcihjaGFubmVsKTsKKyAgICAgICAgICAgIF9sb2dzLnB1dChjaGFubmVsLCBsb2cpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbG9nIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjaGFubmVsLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkCisgICAgICogbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGNoYW5uZWwgaW4gY29uY3VycmVudCBzaXR1YXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMb2cgbmV3TG9nQWRhcHRlcihTdHJpbmcgY2hhbm5lbCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nRmFjdG9yeUltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Mb2dGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmIyOGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5HZW5lcmljQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5GaWxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCisvKioKKyAqIERlZmF1bHQge0BsaW5rIExvZ0ZhY3Rvcnl9IGltcGxlbWVudGF0aW9uLiBGb3IgZWFzZSBvZiBhdXRvbWF0aWMKKyAqIGNvbmZpZ3VyYXRpb24sIHRoaXMgaW1wbGVtZW50YXRpb24ga2V5cyBvbiBvbmx5IHRoZSBsYXN0IGRvdC1zZXBhcmF0ZWQKKyAqIHRva2VuIG9mIHRoZSBsb2cgY2hhbm5lbCBuYW1lLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBjbGFzcyBMb2dGYWN0b3J5SW1wbCAKKyAgICBpbXBsZW1lbnRzIExvZ0ZhY3RvcnksIEdlbmVyaWNDb25maWd1cmFibGUsIENvbmZpZ3VyYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlKExvZ0ZhY3RvcnlJbXBsLmNsYXNzKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX1NUUiA9IF9sb2MuZ2V0KCJsb2ctdHJhY2UiKS5nZXRNZXNzYWdlKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19TVFIgPSBfbG9jLmdldCgibG9nLWluZm8iKS5nZXRNZXNzYWdlKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9TVFIgPSBfbG9jLmdldCgibG9nLXdhcm4iKS5nZXRNZXNzYWdlKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU1RSID0gX2xvYy5nZXQoImxvZy1lcnJvciIpLmdldE1lc3NhZ2UoKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVRBTF9TVFIgPSBfbG9jLmdldCgibG9nLWZhdGFsIikuZ2V0TWVzc2FnZSgpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RET1VUID0gInN0ZG91dCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RERVJSID0gInN0ZGVyciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgZmFjdG9yeSB3YXMgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgaW5pdGlhbGl6YXRpb25NaWxsaXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIExvZ31zIHRoYXQgdGhpcyBmYWN0b3J5IG1hbmFnZXMsIGtleWVkIGJ5IGxvZyBjaGFubmVsIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgX2xvZ3MgPSBuZXcgQ29uY3VycmVudEhhc2hNYXAoKTsgLy8gPFN0cmluZyxMb2c+CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgc2hvcnQgX2RlZmF1bHRMb2dMZXZlbCA9IExvZy5JTkZPOworCisgICAgLyoqCisgICAgICogU3RvcmFnZSBmb3IgbG9nZ2luZyBsZXZlbCBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBhdCBjb25maWd1cmF0aW9uIHRpbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgX2NvbmZpZ3VyZWRMZXZlbHMgPSBuZXcgSGFzaE1hcCgpOyAvLyA8U3RyaW5nLEludGVnZXI+CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLiBEZWZhdWx0cyB0byBTeXN0ZW0uZXJyLgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gX291dCA9IFN5c3RlbS5lcnI7CisKKyAgICAvKioKKyAgICAgKiBBIHRva2VuIHRvIGFkZCB0byBhbGwgbG9nIG1lc3NhZ2VzLiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIAorICAgICAqIGNvbmZpZ3VyYXRpb24ncyBpZCB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgX2RpYWdDb250ZXh0ID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2RpYWdDb250ZXh0Q29tcHV0ZWQgPSBmYWxzZTsKKyAgICAKKyAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gX2NvbmY7CisKKworICAgIHB1YmxpYyBMb2dGYWN0b3J5SW1wbCgpIHsKKyAgICAgICAgaW5pdGlhbGl6YXRpb25NaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9nIGdldExvZyhTdHJpbmcgY2hhbm5lbCkgeworICAgICAgICAvLyBubyBsb2NraW5nOyBvayBpZiBzYW1lIGxvZyBjcmVhdGVkIG11bHRpcGxlIHRpbWVzCisgICAgICAgIExvZ0ltcGwgbCA9IChMb2dJbXBsKSBfbG9ncy5nZXQoY2hhbm5lbCk7CisgICAgICAgIGlmIChsID09IG51bGwpIHsKKyAgICAgICAgICAgIGwgPSBuZXdMb2dJbXBsKCk7CisgICAgICAgICAgICBsLnNldENoYW5uZWwoY2hhbm5lbCk7CisgICAgICAgICAgICBTaG9ydCBsdmwgPSAoU2hvcnQpIF9jb25maWd1cmVkTGV2ZWxzLmdldChzaG9ydGVuKGNoYW5uZWwpKTsKKyAgICAgICAgICAgIGwuc2V0TGV2ZWwobHZsID09IG51bGwgPyBfZGVmYXVsdExvZ0xldmVsIDogbHZsLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICBfbG9ncy5wdXQoY2hhbm5lbCwgbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGxvZy4gVGhlIGxvZyB3aWxsIGJlIGNhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTG9nSW1wbCBuZXdMb2dJbXBsKCkgeworICAgICAgICByZXR1cm4gbmV3IExvZ0ltcGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG5hbWUgb2YgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHVuY29uZmlndXJlZCBsb2cgY2hhbm5lbHM7CisgICAgICogdXNlZCBmb3IgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdExldmVsKFN0cmluZyBsZXZlbCkgeworICAgICAgICBfZGVmYXVsdExvZ0xldmVsID0gZ2V0TGV2ZWwobGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGxldmVsIGZvciB1bmNvbmZpZ3VyZWQgbG9nIGNoYW5uZWxzLgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBnZXREZWZhdWx0TGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBfZGVmYXVsdExvZ0xldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGxldmVsIGZvciB1bmNvbmZpZ3VyZWQgbG9nIGNoYW5uZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRMZXZlbChzaG9ydCBsZXZlbCkgeworICAgICAgICBfZGVmYXVsdExvZ0xldmVsID0gbGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgdG8gcHJlZml4IGFsbCBsb2cgbWVzc2FnZXMgd2l0aC4gU2V0IHRvCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBjb25maWd1cmF0aW9uJ3MgSWQgcHJvcGVydHkgc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWFnbm9zdGljQ29udGV4dChTdHJpbmcgdmFsKSB7CisgICAgICAgIF9kaWFnQ29udGV4dCA9IHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyB0byBwcmVmaXggYWxsIGxvZyBtZXNzYWdlcyB3aXRoLiBTZXQgdG8KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIGNvbmZpZ3VyYXRpb24ncyBJZCBwcm9wZXJ0eSBzZXR0aW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlhZ25vc3RpY0NvbnRleHQoKSB7CisgICAgICAgIGlmICghX2RpYWdDb250ZXh0Q29tcHV0ZWQpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaW5pdGlhbGl6YXRpb24gaGFzIHRvIGhhcHBlbiBsYXppbHkgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoYXQgY29uZi5nZXRJZCgpIHdpbGwgYmUgcG9wdWxhdGVkIGJ5IHRoZSB0aW1lIHRoYXQKKyAgICAgICAgICAgIC8vIGVuZENvbmZpZ3VyYXRpb24oKSBpcyBjYWxsZWQuCisgICAgICAgICAgICBpZiAoX2RpYWdDb250ZXh0ID09IG51bGwgJiYgX2NvbmYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9kaWFnQ29udGV4dCA9IF9jb25mLmdldElkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKF9kaWFnQ29udGV4dCkpCisgICAgICAgICAgICAgICAgX2RpYWdDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIF9kaWFnQ29udGV4dENvbXB1dGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2RpYWdDb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uIFJlY29nbml6ZWQgdmFsdWVzIGFyZTogPGNvZGU+c3Rkb3V0PC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zdGRlcnI8L2NvZGU+LiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSBjb25zaWRlcmVkIGEgZmlsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgaWYgKFNURE9VVC5lcXVhbHMoZmlsZSkpCisgICAgICAgICAgICBfb3V0ID0gU3lzdGVtLm91dDsKKyAgICAgICAgZWxzZSBpZiAoU1RERVJSLmVxdWFscyhmaWxlKSkKKyAgICAgICAgICAgIF9vdXQgPSBTeXN0ZW0uZXJyOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IEZpbGVzLmdldEZpbGUoZmlsZSwgbnVsbCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9vdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgKGYuZ2V0Q2Fub25pY2FsUGF0aCgpLCB0cnVlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0KCJsb2ctYmFkLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICBmaWxlKSArICIgIiArIGlvZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIFByaW50U3RyZWFtIGdldFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIF9vdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oUHJpbnRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic3RyZWFtID09IG51bGwiKTsKKyAgICAgICAgX291dCA9IHN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbG9nIGxldmVsIGNvbnN0YW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExldmVsTmFtZShzaG9ydCBsZXZlbCkgeworICAgICAgICBzd2l0Y2ggKGxldmVsKSB7CisgICAgICAgICAgICBjYXNlIExvZy5UUkFDRToKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBQ0VfU1RSOworICAgICAgICAgICAgY2FzZSBMb2cuSU5GTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5GT19TVFI7CisgICAgICAgICAgICBjYXNlIExvZy5XQVJOOgorICAgICAgICAgICAgICAgIHJldHVybiBXQVJOX1NUUjsKKyAgICAgICAgICAgIGNhc2UgTG9nLkVSUk9SOgorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9TVFI7CisgICAgICAgICAgICBjYXNlIExvZy5GQVRBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFUQUxfU1RSOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xvYy5nZXQoImxvZy11bmtub3duIikuZ2V0TWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN5bWJvbGljIGNvbnN0YW50IGZvciB0aGUgc3BlY2lmaWVkIHN0cmluZyBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHNob3J0IGdldExldmVsKFN0cmluZyBzdHIpIHsKKyAgICAgICAgc3RyID0gc3RyLnRvVXBwZXJDYXNlKCkudHJpbSgpOworICAgICAgICBzaG9ydCB2YWwgPSBUUkFDRV9TVFIuZXF1YWxzKHN0cikgPyBMb2cuVFJBQ0UgOgorICAgICAgICAgICAgSU5GT19TVFIuZXF1YWxzKHN0cikgPyBMb2cuSU5GTyA6CisgICAgICAgICAgICAgICAgV0FSTl9TVFIuZXF1YWxzKHN0cikgPyBMb2cuV0FSTiA6CisgICAgICAgICAgICAgICAgICAgIEVSUk9SX1NUUi5lcXVhbHMoc3RyKSA/IExvZy5FUlJPUiA6CisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTF9TVFIuZXF1YWxzKHN0cikgPyBMb2cuRkFUQUwgOiAtMTsKKworICAgICAgICBpZiAodmFsID09IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChfbG9jLmdldCgibG9nLWJhZC1jb25zdGFudCIsIHN0cikuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gQ29uZmlndXJhYmxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29uZmlndXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDb25maWd1cmF0aW9uKCkgeworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gR2VuZXJpY0NvbmZpZ3VyYWJsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRvKE9wdGlvbnMgb3B0cykgeworICAgICAgICBpZiAoIW9wdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9wdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBlID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgX2NvbmZpZ3VyZWRMZXZlbHMucHV0KHNob3J0ZW4oKFN0cmluZykgZS5nZXRLZXkoKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBTaG9ydChnZXRMZXZlbCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHRzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2hvcnRlbihTdHJpbmcgY2hhbm5lbCkgeworICAgICAgICByZXR1cm4gY2hhbm5lbC5zdWJzdHJpbmcoY2hhbm5lbC5sYXN0SW5kZXhPZignLicpICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBMb2d9IGludGVyZmFjZS4gV3JpdGVzCisgICAgICogb3V0cHV0IHRvIHN0ZGVyci4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTG9nSW1wbCBleHRlbmRzIEFic3RyYWN0TG9nIHsKKworICAgICAgICBwcml2YXRlIHNob3J0IF9sZXZlbCA9IElORk87CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9jaGFubmVsOworCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChzaG9ydCBsZXZlbCkgeworICAgICAgICAgICAgcmV0dXJuIGxldmVsID49IF9sZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGxvZyhzaG9ydCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZm9ybWF0TWVzc2FnZShsZXZlbCwgbWVzc2FnZSwgdCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKF9vdXQpIHsKKyAgICAgICAgICAgICAgICBfb3V0LnByaW50KG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydCA8Y29kZT5tZXNzYWdlPC9jb2RlPiBpbnRvIGEgc3RyaW5nIHJlYWR5IHRvIGJlIHdyaXR0ZW4gdG8KKyAgICAgICAgICogdGhlIGxvZy4gVGhlIHN0cmluZyBzaG91bGQgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgbmV3bGluZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHQgbWF5IGJlIG51bGwKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0TWVzc2FnZShzaG9ydCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsCisgICAgICAgICAgICBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gd2Ugd3JpdGUgdG8gYSBTdHJpbmdCdWZmZXIgYW5kIHRoZW4gZmx1c2ggaXQgYWxsIGF0CisgICAgICAgICAgICAvLyBvbmNlIGFzIGEgc2luZ2xlIGxpbmUsIHNpbmNlIHNvbWUgZW52aXJvbm1lbnRzKGUuZy4sIEpCb3NzKQorICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIFN5c3RlbSBvdXRwdXQgc3RyZWFtIHRvIGZsdXNoIGFueSBjYWxscworICAgICAgICAgICAgLy8gdG8gd3JpdGUgd2l0aG91dCByZWdhcmQgdG8gbGluZSBicmVha3MsIG1ha2luZyB0aGUKKyAgICAgICAgICAgIC8vIG91dHB1dCBpbmNvbXByZWhlbnNpYmUuCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICBidWYuYXBwZW5kKGdldE9mZnNldCgpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICBpZiAoZ2V0RGlhZ25vc3RpY0NvbnRleHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0RGlhZ25vc3RpY0NvbnRleHQoKSkuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChnZXRMZXZlbE5hbWUobGV2ZWwpKTsKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSBJTkZPIHx8IGxldmVsID09IFdBUk4pCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICBbIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIl0gIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKF9jaGFubmVsKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAtICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoTkVXTElORSk7CisKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN3cml0ZXIpOworICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB3cml0ZXIpOworICAgICAgICAgICAgICAgIHB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHN3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgZ2V0T2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaW5pdGlhbGl6YXRpb25NaWxsaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGFubmVsKFN0cmluZyB2YWwpIHsKKyAgICAgICAgICAgIF9jaGFubmVsID0gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFubmVsKCkgeworICAgICAgICAgICAgcmV0dXJuIF9jaGFubmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TGV2ZWwoc2hvcnQgdmFsKSB7CisgICAgICAgICAgICBfbGV2ZWwgPSB2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2hvcnQgZ2V0TGV2ZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gX2xldmVsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0xvZ091dHB1dFN0cmVhbS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL0xvZ091dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqCisgKiBNYW55IHN0YW5kYXJkIGNvbXBvbmVudHMgbG9nIHRvIHtAbGluayBPdXRwdXRTdHJlYW19cy4KKyAqIFRoaXMgd3JhcHBlciBjbGFzcyBleHRlbmRzIHRoZSB7QGxpbmsgQnl0ZUFycmF5T3V0cHV0U3RyZWFtfQorICogY2xhc3MgYW5kIHdyaXRlcyBhbGwgZ2l2ZW4gZGF0YSB0byBhbiB1bmRlcmx5aW5nIHtAbGluayBMb2d9IGluc3RhbmNlCisgKiB3aGVuZXZlciBpdCBpcyBmbHVzaGVkIGFuZCB0aGUgaW50ZXJuYWxseSBoZWxkIGJ5dGUgYXJyYXkgY29udGFpbnMgYSBuZXdsaW5lLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlLCBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGNsYXNzIExvZ091dHB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX3NlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IF9sZXZlbDsKKyAgICBwcml2YXRlIGZpbmFsIExvZyBfbG9nOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nIHRoZSBsb2cgdG8gbG9nIHRvCisgICAgICogQHBhcmFtIGxldmVsIHRoZSBsZXZlbCB0byBsb2cgYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nT3V0cHV0U3RyZWFtKExvZyBsb2csIGludCBsZXZlbCkgeworICAgICAgICBfbG9nID0gbG9nOworICAgICAgICBfbGV2ZWwgPSBsZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmZsdXNoKCk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHRvQnl0ZUFycmF5KCk7CisgICAgICAgIGlmIChieXRlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmcgbXNnID0gbmV3IFN0cmluZyhieXRlcyk7CisgICAgICAgIGlmIChtc2cuaW5kZXhPZihfc2VwKSAhPSAtMSkgeworICAgICAgICAgICAgLy8gYnJlYWsgdXAgdGhlIG1lc3NhZ2UgYmFzZWQgb24gdGhlIGxpbmUgc2VwYXJhdG9yOyB0aGlzCisgICAgICAgICAgICAvLyBtYXkgYmUgYmVjYXVzZSB0aGUgZmx1c2hlZCBidWZmZXIgY29udGFpbnMgbXV0bGlwbGUgbGluZXMKKyAgICAgICAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobXNnLCBfc2VwKTsKKyAgICAgICAgICAgICAgICB0b2suaGFzTW9yZVRva2VucygpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0ID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGxvZyhuZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGludGVybmFsbHkgaGVsZCBieXRlIGFycmF5CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIHN3aXRjaCAoX2xldmVsKSB7CisgICAgICAgICAgICBjYXNlIExvZy5UUkFDRToKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExvZy5JTkZPOgorICAgICAgICAgICAgICAgIF9sb2cuaW5mbyhtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMb2cuV0FSTjoKKyAgICAgICAgICAgICAgICBfbG9nLndhcm4obXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9nLkVSUk9SOgorICAgICAgICAgICAgICAgIF9sb2cuZXJyb3IobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9nLkZBVEFMOgorICAgICAgICAgICAgICAgIF9sb2cuZmF0YWwobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL011bHRpTG9nRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL011bHRpTG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTk4MGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTXVsdGlMb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKKy8qKgorICogQSBMb2dGYWN0b3J5IGltcGxlbWVudGF0aW9uIHRvIHBhc3MgZXZlbnRzIHRocm91Z2ggbXVsdGlwbGUKKyAqIExvZ0ZhY3RvcnkgaW1wbGVtZW50YXRpb25zKHN1Y2ggYXMgbG9nNGogYW5kIExvZ1BhbmVsRmFjdG9yeSkuCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGNsYXNzIE11bHRpTG9nRmFjdG9yeSBpbXBsZW1lbnRzIExvZ0ZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBMaXN0IF9kZWxlZ2F0ZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gZGVsZWdhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aUxvZ0ZhY3RvcnkoTG9nRmFjdG9yeSBkMSwgTG9nRmFjdG9yeSBkMikgeworICAgICAgICB0aGlzKG5ldyBMb2dGYWN0b3J5W117IGQxLCBkMiB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gZGVsZWdhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aUxvZ0ZhY3RvcnkoTG9nRmFjdG9yeSBkMSwgTG9nRmFjdG9yeSBkMiwgTG9nRmFjdG9yeSBkMykgeworICAgICAgICB0aGlzKG5ldyBMb2dGYWN0b3J5W117IGQxLCBkMiwgZDMgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGRlbGVnYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlMb2dGYWN0b3J5KExvZ0ZhY3RvcnlbXSBkZWxlZ2F0ZXMpIHsKKyAgICAgICAgX2RlbGVnYXRlcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdChBcnJheXMuYXNMaXN0KGRlbGVnYXRlcykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZExvZ0ZhY3RvcnkoTG9nRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgIF9kZWxlZ2F0ZXMuYWRkKGZhY3RvcnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxvZ0ZhY3RvcnkoTG9nRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgIF9kZWxlZ2F0ZXMucmVtb3ZlKGZhY3RvcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlbGVnYXRlcyB0aGF0IHRoaXMgTXVsdGlMb2dGYWN0b3J5IGRlbGVnYXRlcyBtZXNzYWdlcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nRmFjdG9yeVtdIGdldERlbGVnYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIChMb2dGYWN0b3J5W10pIF9kZWxlZ2F0ZXMudG9BcnJheShuZXcgTG9nRmFjdG9yeVswXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIExvZyBpbXBsIHRoYXQgY29tYmluZXMgYWxsIGxvZ3MuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBMb2cgZ2V0TG9nKFN0cmluZyBjaGFubmVsKSB7CisgICAgICAgIExpc3QgbG9ncyA9IG5ldyBBcnJheUxpc3QoX2RlbGVnYXRlcy5zaXplKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZGVsZWdhdGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTG9nRmFjdG9yeSBmID0gKExvZ0ZhY3RvcnkpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZyBsID0gZi5nZXRMb2coY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbG9ncy5hZGQobCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUxvZygoTG9nW10pIGxvZ3MudG9BcnJheShuZXcgTG9nW2xvZ3Muc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmF0b3J5IExvZyBpbXBsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE11bHRpTG9nIGltcGxlbWVudHMgTG9nIHsKKworICAgICAgICBwcml2YXRlIExvZ1tdIF9sb2dzOworCisgICAgICAgIHB1YmxpYyBNdWx0aUxvZyhMb2dbXSBsb2dzKSB7CisgICAgICAgICAgICBfbG9ncyA9IGxvZ3M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBsb2dzIHRoYXQgdGhpcyBsb2cgZGVsZWdhdGVzIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvZ1tdIGdldERlbGVnYXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBfbG9nczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBtc2cpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xvZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgX2xvZ3NbaV0udHJhY2UobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBtc2csIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9sb2dzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIF9sb2dzW2ldLnRyYWNlKG1zZywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbmZvKE9iamVjdCBtc2cpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xvZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgX2xvZ3NbaV0uaW5mbyhtc2cpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBfbG9nc1tpXS5pbmZvKG1zZywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBtc2cpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xvZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgX2xvZ3NbaV0ud2Fybihtc2cpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2FybihPYmplY3QgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBfbG9nc1tpXS53YXJuKG1zZywgdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbXNnKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9sb2dzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIF9sb2dzW2ldLmVycm9yKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbXNnLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBfbG9nc1tpXS5lcnJvcihtc2csIHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmF0YWwoT2JqZWN0IG1zZykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBfbG9nc1tpXS5mYXRhbChtc2cpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmF0YWwoT2JqZWN0IG1zZywgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xvZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgX2xvZ3NbaV0uZmF0YWwobXNnLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJhY2VFbmFibGVkKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3NbaV0uaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3NbaV0uaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9sb2dzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChfbG9nc1tpXS5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvckVuYWJsZWQoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9sb2dzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChfbG9nc1tpXS5pc0Vycm9yRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWxFbmFibGVkKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoX2xvZ3NbaV0uaXNGYXRhbEVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTm9uZUxvZ0ZhY3RvcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9Ob25lTG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGI1NTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTm9uZUxvZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nOworCisvKioKKyAqIEEgbG9nIGZhY3RvcnkgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBkbyBhbnkgbG9nZ2luZywgYXMKKyAqIHF1aWNrbHkgYXMgcG9zc2libGUuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworcHVibGljIGNsYXNzIE5vbmVMb2dGYWN0b3J5IGltcGxlbWVudHMgTG9nRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZmluYWwgTG9nIGdldExvZyhTdHJpbmcgY2hhbm5lbCkgeworICAgICAgICByZXR1cm4gTm9uZUxvZy5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vLW9wIGxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmVMb2cgaW1wbGVtZW50cyBMb2cgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vbmVMb2cgc19sb2cgPSBuZXcgTm9uZUxvZygpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9uZUxvZyBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzX2xvZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXJyb3JFbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGYXRhbEVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1dhcm5FbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgdHJhY2UoT2JqZWN0IG8pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRyYWNlKE9iamVjdCBvLCBUaHJvd2FibGUgdCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5mbyhPYmplY3QgbykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgaW5mbyhPYmplY3QgbywgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdhcm4oT2JqZWN0IG8pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdhcm4oT2JqZWN0IG8sIFRocm93YWJsZSB0KSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBlcnJvcihPYmplY3QgbykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgZXJyb3IoT2JqZWN0IG8sIFRocm93YWJsZSB0KSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBmYXRhbChPYmplY3QgbykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgZmF0YWwoT2JqZWN0IG8sIFRocm93YWJsZSB0KSB7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2xvZy9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTU4YzkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5Mb2dnaW5nPC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBsaWdodHdlaWdodCBsb2dnaW5nIGludGVyZmFjZSwgYSBzaW1wbGUKKyAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHdyaXRlcyBsb2dnaW5nIG91dHB1dCB0byB0aGUgY29uc29sZSBhbmQKKyAgICBhbGxvd3MgZm9yIGJhc2ljIGxvZyBjb25maWd1cmF0aW9uLCBhbmQgcGx1Zy1pbnMgZm9yIHRoZSBBcGFjaGUKKyAgICBDb21tb25zIExvZ2dpbmcgYW5kIHRoZSBBcGFjaGUgTG9nNEogZnJhbWV3b3Jrcy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ0ZNZXRhRGF0YVBhcnNlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9DRk1ldGFEYXRhUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5Mzk4MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ0ZNZXRhRGF0YVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogQ3VzdG9tIFNBWCBwYXJzZXIgdXNlZCBieSB0aGUgc3lzdGVtIHRvIHF1aWNrbHkgcGFyc2UgbWV0YWRhdGEgZmlsZXMKKyAqIGZvciBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBDRk1ldGFEYXRhUGFyc2VyIGV4dGVuZHMgWE1MTWV0YURhdGFQYXJzZXIgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBQ0tBR0VTID0gbmV3IFN0cmluZ1tdeworICAgICAgICAiamF2YS5sYW5nLiIsICJqYXZhLnV0aWwuIiwgImphdmEubWF0aC4iIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQ0ZNZXRhRGF0YVBhcnNlci5jbGFzcyk7CisKKyAgICAvLyB0aGUgY3VycmVudCBwYWNrYWdlIGFuZCBjbGFzcyBiZWluZyBwYXJzZWQKKyAgICBwcml2YXRlIFN0cmluZyBfcGFja2FnZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2NsYXNzID0gbnVsbDsKKworICAgIHB1YmxpYyBDRk1ldGFEYXRhUGFyc2VyKCkgeworICAgICAgICBzZXRQYXJzZVRleHQoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGVsZW1lbnQuIERlZmF1bHRzIHRvICJwYWNrYWdlIi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhY2thZ2VFbGVtZW50TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gInBhY2thZ2UiLmVxdWFscyhuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlIG9mIHRoZSBwYWNrYWdlIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgbmFtZSwgb3IgbnVsbCB0bworICAgICAqIHVzZSB0aGUgZWxlbWVudCB0ZXh0LiBEZWZhdWx0cyB0byAibmFtZSIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlQXR0cmlidXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJuYW1lIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVwdGggb2YgdGhlIHBhY2thZ2UgZWxlbWVudC4gRGVmYXVsdHMgdG8gMS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFBhY2thZ2VFbGVtZW50RGVwdGgoKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBlbGVtZW50LiBEZWZhdWx0cyB0byAiY2xhc3MiLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NFbGVtZW50TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gImNsYXNzIi5lcXVhbHMobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3MgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBuYW1lLCBvciBudWxsIHRvCisgICAgICogdXNlIHRoZSBlbGVtZW50IHRleHQuIERlZmF1bHRzIHRvICJuYW1lIi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQXR0cmlidXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJuYW1lIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVwdGggb2YgdGhlIGNsYXNzIGVsZW1lbnQuIERlZmF1bHRzIHRvIDIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRDbGFzc0VsZW1lbnREZXB0aCgpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2tpcCByb290IGVsZW1lbnQKKyAgICAgICAgaW50IGRlcHRoID0gY3VycmVudERlcHRoKCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSBnZXRQYWNrYWdlRWxlbWVudERlcHRoKCkKKyAgICAgICAgICAgICAgICAmJiBpc1BhY2thZ2VFbGVtZW50TmFtZShuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQYWNrYWdlKG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSBnZXRDbGFzc0VsZW1lbnREZXB0aCgpICYmIGlzQ2xhc3NFbGVtZW50TmFtZShuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRDbGFzcyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICBpZiAoZGVwdGggPiBnZXRDbGFzc0VsZW1lbnREZXB0aCgpICYmIF9jbGFzcyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgZ2V0Q2xhc3NBdHRyaWJ1dGVOYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRDbGFzc0VsZW1lbnQobmFtZSwgYXR0cnMpOworICAgICAgICAgICAgaWYgKGRlcHRoID4gZ2V0UGFja2FnZUVsZW1lbnREZXB0aCgpICYmIF9wYWNrYWdlICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBnZXRQYWNrYWdlQXR0cmlidXRlTmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UGFja2FnZUVsZW1lbnQobmFtZSwgYXR0cnMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U3lzdGVtRWxlbWVudChuYW1lLCBhdHRycyk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgc2U7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgdGhyb3cgZ2V0RXhjZXB0aW9uKF9sb2MuZ2V0KCJwYXJzZS1lcnJvciIsIG5hbWUpLCBucGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNraXAgcm9vdCBlbGVtZW50CisgICAgICAgIGludCBkZXB0aCA9IGN1cnJlbnREZXB0aCgpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGRlcHRoID09IGdldFBhY2thZ2VFbGVtZW50RGVwdGgoKQorICAgICAgICAgICAgICAgICYmIGlzUGFja2FnZUVsZW1lbnROYW1lKG5hbWUpKQorICAgICAgICAgICAgICAgIGVuZFBhY2thZ2UobmFtZSk7CisgICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA9PSBnZXRDbGFzc0VsZW1lbnREZXB0aCgpCisgICAgICAgICAgICAgICAgJiYgaXNDbGFzc0VsZW1lbnROYW1lKG5hbWUpKQorICAgICAgICAgICAgICAgIGVuZENsYXNzKG5hbWUpOworICAgICAgICAgICAgZWxzZSBpZiAoZGVwdGggPiBnZXRDbGFzc0VsZW1lbnREZXB0aCgpICYmIF9jbGFzcyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgZ2V0Q2xhc3NBdHRyaWJ1dGVOYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlbmRDbGFzc0VsZW1lbnQobmFtZSk7CisgICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA+IGdldFBhY2thZ2VFbGVtZW50RGVwdGgoKSAmJiBfcGFja2FnZSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgZ2V0UGFja2FnZUF0dHJpYnV0ZU5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVuZFBhY2thZ2VFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVuZFN5c3RlbUVsZW1lbnQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgc2U7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgdGhyb3cgZ2V0RXhjZXB0aW9uKF9sb2MuZ2V0KCJwYXJzZS1lcnJvciIsIG5hbWUpLCBucGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBwYWNrYWdlLiBQYXJzZXMgb3V0IHBhY2thZ2UgYXR0cmlidXRlIGJ5IGRlZmF1bHQuCisgICAgICogUmV0dXJuIGZhbHNlIHRvIHNraXAgcGFja2FnZSBlbGVtZW50IGFuZCBpdHMgY29udGVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRQYWNrYWdlKFN0cmluZyBlbGVtLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFBhY2thZ2VBdHRyaWJ1dGVOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBhdHRycy5nZXRWYWx1ZShnZXRQYWNrYWdlQXR0cmlidXRlTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChfcGFja2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9wYWNrYWdlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kIGEgcGFja2FnZS4gUGFyc2VzIGNvbnRhaW5lZCB0ZXh0IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kUGFja2FnZShTdHJpbmcgZWxlbSkgeworICAgICAgICBpZiAoZ2V0UGFja2FnZUF0dHJpYnV0ZU5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgX3BhY2thZ2UgPSBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfcGFja2FnZSA9IGN1cnJlbnRUZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBjbGFzcy4gUGFyc2VzIG91dCBjbGFzcyBuYW1lIGJ5IGRlZmF1bHQuIFJldHVybgorICAgICAqIGZhbHNlIHRvIHNraXAgY2xhc3MgZWxlbWVudCBhbmQgaXRzIGNvbnRlbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0Q2xhc3MoU3RyaW5nIGVsZW0sIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0Q2xhc3NBdHRyaWJ1dGVOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgX2NsYXNzID0gYXR0cnMuZ2V0VmFsdWUoZ2V0Q2xhc3NBdHRyaWJ1dGVOYW1lKCkpOworICAgICAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KF9wYWNrYWdlKSAmJiBfY2xhc3MuaW5kZXhPZignLicpID09IC0xKQorICAgICAgICAgICAgICAgIF9jbGFzcyA9IF9wYWNrYWdlICsgIi4iICsgX2NsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZCBhIGNsYXNzLiBQYXJzZXMgY29udGFpbmVkIHRleHQgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRDbGFzcyhTdHJpbmcgZWxlbSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRDbGFzc0F0dHJpYnV0ZU5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgX2NsYXNzID0gbnVsbDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfY2xhc3MgPSBjdXJyZW50VGV4dCgpOworICAgICAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KF9wYWNrYWdlKSAmJiBfY2xhc3MuaW5kZXhPZignLicpID09IC0xKQorICAgICAgICAgICAgICAgIF9jbGFzcyA9IF9wYWNrYWdlICsgIi4iICsgX2NsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgbWFya2luZyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCBvdXRzaWRlIG9mIGFueQorICAgICAqIHBhY2thZ2Ugb3IgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRTeXN0ZW1FbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG1hcmtpbmcgdGhlIGVuZCBvZiBhbiBlbGVtZW50IG91dHNpZGUgb2YgYW55CisgICAgICogcGFja2FnZSBvciBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRTeXN0ZW1FbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBtYXJraW5nIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIGRlY2xhcmVkCisgICAgICogcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydFBhY2thZ2VFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG1hcmtpbmcgdGhlIGVuZCBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIGRlY2xhcmVkCisgICAgICogcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRQYWNrYWdlRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgbWFya2luZyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSBkZWNsYXJlZAorICAgICAqIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0Q2xhc3NFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG1hcmtpbmcgdGhlIGVuZCBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIGRlY2xhcmVkCisgICAgICogY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kQ2xhc3NFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjbGVhciBhbnkgc3RhdGUgYW5kIHJlYWR5IHRoZSBwYXJzZXIgZm9yCisgICAgICogYSBuZXcgZG9jdW1lbnQuIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwKKyAgICAgKiA8Y29kZT5zdXBlci5yZXNldCgpPC9jb2RlPiB0byBjbGVhciBzdXBlcmNsYXNzIHN0YXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICAgICAgICBzdXBlci5yZXNldCgpOworICAgICAgICBfcGFja2FnZSA9IG51bGw7CisgICAgICAgIF9jbGFzcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGNsYXNzIGJlaW5nIHBhcnNlZDsgdGhlIHJldHVybmVkIG5hbWUgd2lsbAorICAgICAqIGJlIGZ1bGx5IHF1YWxpZmllZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBfY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHBhY2thZ2UgYmVpbmcgcGFyc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY3VycmVudFBhY2thZ2UoKSB7CisgICAgICAgIHJldHVybiBfcGFja2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUge0BsaW5rIENsYXNzfSBmb3IgdGhlIGdpdmVuIG5hbWUsCisgICAgICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgcGFja2FnZSBjdXJyZW50bHkgYmVpbmcgcGFyc2VkIGZvciByZWxhdGl2ZQorICAgICAqIGNsYXNzIG5hbWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgQ2xhc3MgY2xzID0gY2xhc3NGb3JOYW1lKG5hbWUsIF9wYWNrYWdlLCByZXNvbHZlLCBjdXJyZW50Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGdldEV4Y2VwdGlvbihfbG9jLmdldCgiaW52YWxpZC1jbGFzcyIsIG5hbWUpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBjbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBhZ2FpbnN0IHRoZSBnaXZlbiBwYWNrYWdlIGFuZCB0aGUgc2V0CisgICAgICogb2YgYWNjZXB0ZWQgc3RhbmRhcmQgcGFja2FnZXMuIFJldHVybiBudWxsIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgcGtnLAorICAgICAgICBib29sZWFuIHJlc29sdmUsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIGJvb2xlYW4gZnVsbE5hbWUgPSBuYW1lLmluZGV4T2YoJy4nKSAhPSAtMTsKKyAgICAgICAgYm9vbGVhbiBub1BhY2thZ2UgPSBTdHJpbmdVdGlscy5pc0VtcHR5KHBrZyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZnVsbE5hbWUgfHwgbm9QYWNrYWdlKQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdzLnRvQ2xhc3MobmFtZSwgcmVzb2x2ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdzLnRvQ2xhc3MocGtnICsgIi4iICsgbmFtZSwgcmVzb2x2ZSwgbG9hZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm90IGEgZnVsbCBuYW1lLCBub3cgdHJ5IHRoZSBuYW1lIHdpdGhvdXQgYSBwYWNrYWdlCisgICAgICAgIGlmICghZnVsbE5hbWUgJiYgIW5vUGFja2FnZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5ncy50b0NsYXNzKG5hbWUsIHJlc29sdmUsIGxvYWRlcik7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnkgd2l0aCBzdGFuZGFyZCBwYWNrYWdlcworICAgICAgICBpZiAoIWZ1bGxOYW1lKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBBQ0tBR0VTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ3MudG9DbGFzcyhQQUNLQUdFU1tpXSArIG5hbWUsIHJlc29sdmUsIGxvYWRlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NGTWV0YURhdGFTZXJpYWxpemVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NGTWV0YURhdGFTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2NmUwZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ0ZNZXRhRGF0YVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKKworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBIZWxwcyBzZXJpYWxpemUgbWV0YWRhdGEgb2JqZWN0cyB0byBwYWNrYWdlIGFuZCBjbGFzcyBlbGVtZW50cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICogQHNlZSBDRk1ldGFEYXRhUGFyc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDRk1ldGFEYXRhU2VyaWFsaXplciBleHRlbmRzIFhNTE1ldGFEYXRhU2VyaWFsaXplciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBfcGFja2FnZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBwYWNrYWdlIGZvciBvYmplY3RzIGJlaW5nIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlKCkgeworICAgICAgICByZXR1cm4gX3BhY2thZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgcGFja2FnZSBmb3Igb2JqZWN0cyBiZWluZyBzZXJpYWxpemVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHBrZykgeworICAgICAgICBfcGFja2FnZSA9IHBrZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdyb3VwIG9iamVjdHMgYnkgcGFja2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbWFwcGluZyBvZiBwYWNrYWdlIG5hbWUgdG8gYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgaW4KKyAgICAgKiB0aGF0IHBhY2thZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIGdyb3VwQnlQYWNrYWdlKENvbGxlY3Rpb24gb2JqcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcCBwYWNrYWdlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZTsKKyAgICAgICAgQ29sbGVjdGlvbiBwYWNrYWdlT2JqczsKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBvYmpzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBvYmogPSBpdHIubmV4dCgpOworICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlKG9iaik7CisgICAgICAgICAgICBwYWNrYWdlT2JqcyA9IChDb2xsZWN0aW9uKSBwYWNrYWdlcy5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VPYmpzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlT2JqcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgICAgICAgICAgcGFja2FnZXMucHV0KHBhY2thZ2VOYW1lLCBwYWNrYWdlT2Jqcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWNrYWdlT2Jqcy5hZGQob2JqKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja2FnZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGdpdmVuIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgaW4gYQorICAgICAqIHBhY2thZ2UuIFVzZWQgYnkge0BsaW5rICNncm91cEJ5UGFja2FnZX0uIFJldHVybnMgbnVsbCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZShPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGNsYXNzIG5hbWUsIHN0cmlwcGluZyB0aGUgcGFja2FnZSBpZiBpdCBpcyBub3QgbmVlZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIGluIGN1cnJlbnQgcGFja2FnZTsgbWFrZSBzdXJlIG5vdCBpbiBhIHN1Yi1wYWNrYWdlCisgICAgICAgIGlmIChfcGFja2FnZSAhPSBudWxsICYmIG5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSBfcGFja2FnZS5sZW5ndGgoKQorICAgICAgICAgICAgJiYgbmFtZS5zdGFydHNXaXRoKF9wYWNrYWdlKSkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhfcGFja2FnZS5sZW5ndGgoKSArIDEpOworCisgICAgICAgIC8vIGNoZWNrIG90aGVyIGtub3duIHBhY2thZ2VzCisgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VzID0gQ0ZNZXRhRGF0YVBhcnNlci5QQUNLQUdFUzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocGFja2FnZXNbaV0pCisgICAgICAgICAgICAgICAgJiYgbmFtZS5sYXN0SW5kZXhPZignLicpID09IHBhY2thZ2VzW2ldLmxlbmd0aCgpIC0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcocGFja2FnZXNbaV0ubGVuZ3RoKCkpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NsYXNzQW5ub3RhdGlvbk1ldGFEYXRhRmlsdGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NsYXNzQW5ub3RhdGlvbk1ldGFEYXRhRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5MjEwYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ2xhc3NBbm5vdGF0aW9uTWV0YURhdGFGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgc2VycC5ieXRlY29kZS5sb3dsZXZlbC5Db25zdGFudFBvb2xUYWJsZTsKKworLyoqCisgKiBGaWx0ZXIgdGhhdCBsb29rcyBmb3IgY2xhc3NlcyB3aXRoIG9uZSBvZiBhIHNldCBvZiBhbm5vdGF0aW9ucy4KKyAqIFNlZSBKREsgMS41IEpWTSBzcGVjIGZvciBkZXRhaWxzIG9uIGFubm90YXRpb24gYnl0ZWNvZGU6PGJyIC8+CisgKiBqYXZhLnN1bi5jb20vZG9jcy9ib29rcy92bXNwZWMvMm5kLWVkaXRpb24vQ2xhc3NGaWxlRm9ybWF0LWZpbmFsLWRyYWZ0LnBkZgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0Fubm90YXRpb25NZXRhRGF0YUZpbHRlciBpbXBsZW1lbnRzIE1ldGFEYXRhRmlsdGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX2Fubm9zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBhbm5vdGF0aW9uIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICovCisgICAgcHVibGljIENsYXNzQW5ub3RhdGlvbk1ldGFEYXRhRmlsdGVyKENsYXNzIGFubm8pIHsKKyAgICAgICAgdGhpcyhuZXcgQ2xhc3NbXXsgYW5ubyB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGFubm90YXRpb25zIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICovCisgICAgcHVibGljIENsYXNzQW5ub3RhdGlvbk1ldGFEYXRhRmlsdGVyKENsYXNzW10gYW5ub3MpIHsKKyAgICAgICAgX2Fubm9zID0gbmV3IFN0cmluZ1thbm5vcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm9zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX2Fubm9zW2ldID0gIkwiICsgYW5ub3NbaV0uZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIjsiOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoUmVzb3VyY2UgcnNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9hbm5vcy5sZW5ndGggPT0gMCB8fCAhcnNyYy5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25zdGFudFBvb2xUYWJsZSB0YWJsZSA9IG5ldyBDb25zdGFudFBvb2xUYWJsZShyc3JjLmdldENvbnRlbnQoKSk7CisgICAgICAgICAgICBpbnQgaWR4ID0gdGFibGUuZ2V0RW5kSW5kZXgoKTsKKyAgICAgICAgICAgIGlkeCArPSA2OyAvLyBza2lwIGFjY2VzcywgY2xzLCBzdXBlcgorCisgICAgICAgICAgICAvLyBza2lwIGludGVyZmFjZXMKKyAgICAgICAgICAgIGludCBpbnRlcmZhY2VzID0gdGFibGUucmVhZFVuc2lnbmVkU2hvcnQoaWR4KTsKKyAgICAgICAgICAgIGlkeCArPSAyICsgaW50ZXJmYWNlcyAqIDI7CisKKyAgICAgICAgICAgIC8vIHNraXAgZmllbGRzIGFuZCBtZXRob2RzCisgICAgICAgICAgICBpbnQgZmllbGRzID0gdGFibGUucmVhZFVuc2lnbmVkU2hvcnQoaWR4KTsKKyAgICAgICAgICAgIGlkeCArPSAyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHM7IGkrKykKKyAgICAgICAgICAgICAgICBpZHggKz0gc2tpcEZpZWxkT3JNZXRob2QodGFibGUsIGlkeCk7CisgICAgICAgICAgICBpbnQgbWV0aG9kcyA9IHRhYmxlLnJlYWRVbnNpZ25lZFNob3J0KGlkeCk7CisgICAgICAgICAgICBpZHggKz0gMjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kczsgaSsrKQorICAgICAgICAgICAgICAgIGlkeCArPSBza2lwRmllbGRPck1ldGhvZCh0YWJsZSwgaWR4KTsKKworICAgICAgICAgICAgLy8gbG9vayBmb3IgYW5ub3RhdGlvbiBhdHRycworICAgICAgICAgICAgaW50IGF0dHJzID0gdGFibGUucmVhZFVuc2lnbmVkU2hvcnQoaWR4KTsKKyAgICAgICAgICAgIGlkeCArPSAyOworICAgICAgICAgICAgaW50IG5hbWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gdGFibGUucmVhZFVuc2lnbmVkU2hvcnQoaWR4KTsKKyAgICAgICAgICAgICAgICBpZHggKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiLmVxdWFscyh0YWJsZS5yZWFkU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICh0YWJsZS5nZXQobmFtZSkpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoQW5ub3RhdGlvbnModGFibGUsIGlkeCArIDQpOworICAgICAgICAgICAgICAgIGlkeCArPSA0ICsgdGFibGUucmVhZEludChpZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgRXJyb3IgY2ZlID0gbmV3IENsYXNzRm9ybWF0RXJyb3IocnNyYy5nZXROYW1lKCkpOworICAgICAgICAgICAgY2ZlLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGNmZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFubm90YXRpb25zIG1hdGNoIG91ciBjYW5kaWRhdGVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaEFubm90YXRpb25zKENvbnN0YW50UG9vbFRhYmxlIHRhYmxlLCBpbnQgaWR4KSB7CisgICAgICAgIGludCBhbm5vcyA9IHRhYmxlLnJlYWRVbnNpZ25lZFNob3J0KGlkeCk7CisgICAgICAgIGlkeCArPSAyOworCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgcHJvcHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3M7IGkrKykgeworICAgICAgICAgICAgdHlwZSA9IHRhYmxlLnJlYWRVbnNpZ25lZFNob3J0KGlkeCk7CisgICAgICAgICAgICBpZHggKz0gMjsKKyAgICAgICAgICAgIGlmIChtYXRjaEFubm90YXRpb24odGFibGUucmVhZFN0cmluZyh0YWJsZS5nZXQodHlwZSkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgcHJvcHMgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydChpZHgpOworICAgICAgICAgICAgaWR4ICs9IDI7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3BzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZHggKz0gMjsgLy8gbmFtZQorICAgICAgICAgICAgICAgIGlkeCArPSBza2lwQW5ub3RhdGlvblByb3BlcnR5VmFsdWUodGFibGUsIGlkeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBhbm5vdGF0aW9uIG1hdGNoZXMgb3VyIGNhbmRpZGF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoQW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9hbm5vcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhfYW5ub3NbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcCBhbiBhbm5vdGF0aW9uIHByb3BlcnR5IHZhbHVlLCByZXR1cm5pbmcgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBza2lwQW5ub3RhdGlvblByb3BlcnR5VmFsdWUoQ29uc3RhbnRQb29sVGFibGUgdGFibGUsCisgICAgICAgIGludCBpZHgpIHsKKyAgICAgICAgaW50IHNraXBwZWQgPSAwOworICAgICAgICBzd2l0Y2ggKHRhYmxlLnJlYWRCeXRlKGlkeCArIHNraXBwZWQrKykpIHsKKyAgICAgICAgICAgIGNhc2UgJ1onOiAvLyBib29sCisgICAgICAgICAgICBjYXNlICdCJzogLy8gYnl0ZQorICAgICAgICAgICAgY2FzZSAnQyc6IC8vIGNoYXIKKyAgICAgICAgICAgIGNhc2UgJ0QnOiAvLyBkb3VibGUKKyAgICAgICAgICAgIGNhc2UgJ0YnOiAvLyBmbG9hdAorICAgICAgICAgICAgY2FzZSAnSSc6IC8vIGludAorICAgICAgICAgICAgY2FzZSAnSic6IC8vIGxvbmcKKyAgICAgICAgICAgIGNhc2UgJ1MnOiAvLyBzaG9ydAorICAgICAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZworICAgICAgICAgICAgY2FzZSAnYyc6IC8vIGNsYXNzCisgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZSc6IC8vIGVudW0gcHRyCisgICAgICAgICAgICAgICAgc2tpcHBlZCArPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnWyc6IC8vIGFycmF5CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydChpZHggKyBza2lwcGVkKTsKKyAgICAgICAgICAgICAgICBza2lwcGVkICs9IDI7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBBbm5vdGF0aW9uUHJvcGVydHlWYWx1ZSh0YWJsZSwgaWR4ICsgc2tpcHBlZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdAJzogLy8gYW5ubworICAgICAgICAgICAgICAgIHNraXBwZWQgKz0gMjsgLy8gdHlwZQorICAgICAgICAgICAgICAgIGludCBwcm9wcyA9IHRhYmxlLnJlYWRVbnNpZ25lZFNob3J0KGlkeCArIHNraXBwZWQpOworICAgICAgICAgICAgICAgIHNraXBwZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3BzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAyOyAvLyBuYW1lCisgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBBbm5vdGF0aW9uUHJvcGVydHlWYWx1ZSh0YWJsZSwgaWR4ICsgc2tpcHBlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBza2lwcGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNraXAgdGhlIGN1cnJlbnQgZmllbGQgb3IgbWV0aG9kLCByZXR1cm5pbmcgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBza2lwRmllbGRPck1ldGhvZChDb25zdGFudFBvb2xUYWJsZSB0YWJsZSwgaW50IGlkeCkgeworICAgICAgICBpbnQgYXR0cnMgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydChpZHggKyA2KTsKKyAgICAgICAgaW50IHNraXBwZWQgPSA4OworICAgICAgICBpbnQgbGVuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzOyBpKyspIHsKKyAgICAgICAgICAgIGxlbiA9IHRhYmxlLnJlYWRJbnQoaWR4ICsgc2tpcHBlZCArIDIpOworICAgICAgICAgICAgc2tpcHBlZCArPSA2ICsgbGVuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBza2lwcGVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ2xhc3NBcmdQYXJzZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ2xhc3NBcmdQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU5MjJjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9DbGFzc0FyZ1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsNjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmV4Y2VwdGlvbi5OZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkZpbGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgc2VycC5ieXRlY29kZS5sb3dsZXZlbC5Db25zdGFudFBvb2xUYWJsZTsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBQYXJzZXIgdXNlZCB0byByZXNvbHZlIGFyZ3VtZW50cyBpbnRvIGphdmEgY2xhc3Nlcy4KKyAqIEludGVycHJldHMgY29tbWFuZC1saW5lIGFyZ3MgYXMgZWl0aGVyIGNsYXNzIG5hbWVzLCAuY2xhc3MgZmlsZXMgb3IKKyAqIHJlc291cmNlcywgLmphdmEgZmlsZXMgb3IgcmVzb3VyY2VzLCBvciBtZXRhZGF0YSBmaWxlcyBvciByZXNvdXJjZXMKKyAqIGNvbmZvcm1pbmcgdG8gdGhlIGNvbW1vbiBmb3JtYXQgZGVmaW5lZCBieSB7QGxpbmsgQ0ZNZXRhRGF0YVBhcnNlcn0uCisgKiBUcmFuc2Zvcm1zIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBhcmdzIGludG8ge0BsaW5rIENsYXNzfSBpbnN0YW5jZXMuCisgKiBOb3RlIHRoYXQgd2hlbiBwYXJzaW5nIC5qYXZhIGZpbGVzLCBvbmx5IHRoZSBtYWluIGNsYXNzIGluIHRoZSBmaWxlCisgKiBpcyBkZXRlY3RlZC4gT3RoZXIgY2xhc3NlcyBkZWZpbmVkIGluIHRoZSBmaWxlLCBzdWNoIGFzIGlubmVyIGNsYXNzZXMsCisgKiBhcmUgbm90IGFkZGVkIHRvIHRoZSByZXR1cm5lZCBjbGFzc2VzIGxpc3QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIENsYXNzQXJnUGFyc2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9FT0YgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fTk9ORSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BBQ0tBR0UgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9DTEFTUyA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BBQ0tBR0VfTk9BVFRSID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fQ0xBU1NfTk9BVFRSID0gNDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKENsYXNzQXJnUGFyc2VyLmNsYXNzKTsKKworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2xvYWRlciA9IG51bGw7CisgICAgcHJpdmF0ZSBjaGFyW10gX3BhY2thZ2VBdHRyID0gIm5hbWUiLnRvQ2hhckFycmF5KCk7CisgICAgcHJpdmF0ZSBjaGFyW10gX2NsYXNzQXR0ciA9ICJuYW1lIi50b0NoYXJBcnJheSgpOworICAgIHByaXZhdGUgY2hhcltdW10gX2JlZ2luRWxlbWVudHMgPSB7IHsgJ3AnIH0sIHsgJ2MnIH0gfTsKKyAgICBwcml2YXRlIGNoYXJbXVtdIF9lbmRFbGVtZW50cyA9IHsgImFja2FnZSIudG9DaGFyQXJyYXkoKSwKKyAgICAgICAgImxhc3MiLnRvQ2hhckFycmF5KCkgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyBsb2FkZXIgd2l0aCB3aGljaCB0byBsb2FkIHBhcnNlZCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIF9sb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIGxvYWRlciB3aXRoIHdoaWNoIHRvIGxvYWQgcGFyc2VkIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIF9sb2FkZXIgPSBsb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aGUgcmVsZXZhbnQgbWV0YWRhdGEgZmlsZSBzdHJ1Y3R1cmUgc28gdGhhdCBtZXRhZGF0YSBmaWxlcworICAgICAqIGNvbnRhaW5pbmcgY2xhc3MgbmFtZXMgY2FuIGJlIHBhcnNlZC4gTnVsbCBhdHRyaWJ1dGUgbmFtZXMgaW5kaWNhdGUKKyAgICAgKiB0aGF0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFTdHJ1Y3R1cmUoU3RyaW5nIHBhY2thZ2VFbGVtZW50TmFtZSwKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VBdHRyaWJ1dGVOYW1lLCBTdHJpbmdbXSBjbGFzc0VsZW1lbnROYW1lcywKKyAgICAgICAgU3RyaW5nIGNsYXNzQXR0cmlidXRlTmFtZSkgeworICAgICAgICAvLyBjYWxjdWxhdGUgaG93IG1hbnkgY2hhcnMgZGVlcCB3ZSBoYXZlIHRvIGdvIHRvIGlkZW50aWZ5IGVhY2ggZWxlbWVudAorICAgICAgICAvLyBuYW1lIGFzIHVuaXF1ZS4gIHRoaXMgaXMgZXh0cmVtZWx5IGluZWZmaWNpZW50IGZvciBsYXJnZSBOLCBidXQKKyAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgbW9yZSB0aGFuIGEgZmV3IGVsZW1lbnRzCisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltjbGFzc0VsZW1lbnROYW1lcy5sZW5ndGggKyAxXTsKKyAgICAgICAgaW50IGNoYXJJZHggPSAwOworICAgICAgICBmb3IgKDsgdHJ1ZTsgY2hhcklkeCsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJJZHggPT0gcGFja2FnZUVsZW1lbnROYW1lLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjYW50LWRpZmYtZWxlbXMiKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSBwYWNrYWdlRWxlbWVudE5hbWUuY2hhckF0KGNoYXJJZHgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFySWR4ID09IGNsYXNzRWxlbWVudE5hbWVzW2kgLSAxXS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiY2FudC1kaWZmLWVsZW1zIikuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gY2xhc3NFbGVtZW50TmFtZXNbaSAtIDFdLmNoYXJBdChjaGFySWR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hhcnNVbmlxdWUoYnVmKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIF9wYWNrYWdlQXR0ciA9IChwYWNrYWdlQXR0cmlidXRlTmFtZSA9PSBudWxsKSA/IG51bGwKKyAgICAgICAgICAgIDogcGFja2FnZUF0dHJpYnV0ZU5hbWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgX2NsYXNzQXR0ciA9IChjbGFzc0F0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgPyBudWxsCisgICAgICAgICAgICA6IGNsYXNzQXR0cmlidXRlTmFtZS50b0NoYXJBcnJheSgpOworICAgICAgICBfYmVnaW5FbGVtZW50cyA9IG5ldyBjaGFyW2NsYXNzRWxlbWVudE5hbWVzLmxlbmd0aCArIDFdW107CisgICAgICAgIF9lbmRFbGVtZW50cyA9IG5ldyBjaGFyW2NsYXNzRWxlbWVudE5hbWVzLmxlbmd0aCArIDFdW107CisgICAgICAgIF9iZWdpbkVsZW1lbnRzWzBdID0gcGFja2FnZUVsZW1lbnROYW1lLnN1YnN0cmluZygwLCBjaGFySWR4ICsgMSkuCisgICAgICAgICAgICB0b0NoYXJBcnJheSgpOworICAgICAgICBfZW5kRWxlbWVudHNbMF0gPSBwYWNrYWdlRWxlbWVudE5hbWUuc3Vic3RyaW5nKGNoYXJJZHggKyAxKS4KKyAgICAgICAgICAgIHRvQ2hhckFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NFbGVtZW50TmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIF9iZWdpbkVsZW1lbnRzW2kgKyAxXSA9IGNsYXNzRWxlbWVudE5hbWVzW2ldLgorICAgICAgICAgICAgICAgIHN1YnN0cmluZygwLCBjaGFySWR4ICsgMSkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIF9lbmRFbGVtZW50c1tpICsgMV0gPSBjbGFzc0VsZW1lbnROYW1lc1tpXS4KKyAgICAgICAgICAgICAgICBzdWJzdHJpbmcoY2hhcklkeCArIDEpLnRvQ2hhckFycmF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBnaXZlbiBidWZmZXIgYXJlIHVuaXF1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoYXJzVW5pcXVlKGNoYXJbXSBidWYpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgIGlmIChidWZbal0gPT0gYnVmW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIENsYXNzfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MoZXMpIG5hbWVkIGluIHRoZQorICAgICAqIGdpdmVuIGFyZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmcgYSBjbGFzcyBuYW1lLCAuamF2YSBmaWxlLCAuY2xhc3MgZmlsZSwgb3IgbWV0YWRhdGEKKyAgICAgKiBmaWxlIG5hbWluZyB0aGUgdHlwZShzKSB0byBhY3Qgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NbXSBwYXJzZVR5cGVzKFN0cmluZyBhcmcpIHsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBwYXJzZVR5cGVOYW1lcyhhcmcpOworICAgICAgICBDbGFzc1tdIG9ianMgPSBuZXcgQ2xhc3NbbmFtZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIG9ianNbaV0gPSBTdHJpbmdzLnRvQ2xhc3MobmFtZXNbaV0sIF9sb2FkZXIpOworICAgICAgICByZXR1cm4gb2JqczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBDbGFzc30gcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzKGVzKSBuYW1lZCBpbiB0aGUKKyAgICAgKiBnaXZlbiBtZXRhZGF0YXMuCisgICAgICovCisgICAgcHVibGljIENsYXNzW10gcGFyc2VUeXBlcyhNZXRhRGF0YUl0ZXJhdG9yIGl0cikgeworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHBhcnNlVHlwZU5hbWVzKGl0cik7CisgICAgICAgIENsYXNzW10gb2JqcyA9IG5ldyBDbGFzc1tuYW1lcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgb2Jqc1tpXSA9IFN0cmluZ3MudG9DbGFzcyhuYW1lc1tpXSwgX2xvYWRlcik7CisgICAgICAgIHJldHVybiBvYmpzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hcHBpbmcgb2YgZWFjaCBtZXRhZGF0YSByZXNvdXJjZSB0byBhbiBhcnJheSBvZiBpdHMKKyAgICAgKiBjb250YWluZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIG1hcFR5cGVzKE1ldGFEYXRhSXRlcmF0b3IgaXRyKSB7CisgICAgICAgIE1hcCBtYXAgPSBtYXBUeXBlTmFtZXMoaXRyKTsKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBTdHJpbmdbXSBuYW1lczsKKyAgICAgICAgQ2xhc3NbXSBvYmpzOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICBuYW1lcyA9IChTdHJpbmdbXSkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIG9ianMgPSBuZXcgQ2xhc3NbbmFtZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmFtZXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgb2Jqc1tqXSA9IFN0cmluZ3MudG9DbGFzcyhuYW1lc1tqXSwgX2xvYWRlcik7CisgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShvYmpzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzKGVzKSBmcm9tIHRoZSBnaXZlbiBhcmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJnIGEgY2xhc3MgbmFtZSwgLmphdmEgZmlsZSwgLmNsYXNzIGZpbGUsIG9yIG1ldGFkYXRhCisgICAgICogZmlsZSBuYW1pbmcgdGhlIHR5cGUocykgdG8gYWN0IG9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2l0aCBhcHByb3ByaWF0ZSBtZXNzYWdlIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIHBhcnNlVHlwZU5hbWVzKFN0cmluZyBhcmcpIHsKKyAgICAgICAgaWYgKGFyZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVzLmdldEZpbGUoYXJnLCBfbG9hZGVyKTsKKyAgICAgICAgICAgIGlmIChhcmcuZW5kc1dpdGgoIi5jbGFzcyIpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117IGdldEZyb21DbGFzc0ZpbGUoZmlsZSkgfTsKKyAgICAgICAgICAgIGlmIChhcmcuZW5kc1dpdGgoIi5qYXZhIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsgZ2V0RnJvbUphdmFGaWxlKGZpbGUpIH07CisgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sID0gZ2V0RnJvbU1ldGFEYXRhRmlsZShmaWxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBjb2wudG9BcnJheShuZXcgU3RyaW5nW2NvbC5zaXplKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgX2xvYy5nZXQoImNsYXNzLWFyZyIsIGFyZykuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG11c3QgYmUgYSBjbGFzcyBuYW1lCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117IGFyZyB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzKGVzKSBmcm9tIHRoZSBnaXZlbiBtZXRhZGF0YXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIHBhcnNlVHlwZU5hbWVzKE1ldGFEYXRhSXRlcmF0b3IgaXRyKSB7CisgICAgICAgIGlmIChpdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworCisgICAgICAgIExpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIE9iamVjdCBzb3VyY2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVOYW1lcyhzb3VyY2UsIGl0ci5nZXRJbnB1dFN0cmVhbSgpLCBuYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIF9sb2MuZ2V0KCJjbGFzcy1hcmciLCBzb3VyY2UpLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gbWV0YWRhdGEgaXRlcmF0b3Igc3RyZWFtLCBjbG9zaW5nIHRoZQorICAgICAqIHN0cmVhbSBvbiBjb21wbGV0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlTmFtZXMoT2JqZWN0IHNvdXJjZSwgSW5wdXRTdHJlYW0gaW4sIExpc3QgbmFtZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc291cmNlLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5jbGFzcyIpKQorICAgICAgICAgICAgICAgIG5hbWVzLmFkZChnZXRGcm9tQ2xhc3MoaW4pKTsKKyAgICAgICAgICAgIG5hbWVzLmFkZEFsbChnZXRGcm9tTWV0YURhdGEobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBtYXBwaW5nIG9mIGVhY2ggbWV0YWRhdGEgcmVzb3VyY2UgdG8gYW4gYXJyYXkgb2YgaXRzIGNvbnRhaW5lZAorICAgICAqIGNsYXNzIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgbWFwVHlwZU5hbWVzKE1ldGFEYXRhSXRlcmF0b3IgaXRyKSB7CisgICAgICAgIGlmIChpdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisKKyAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIE9iamVjdCBzb3VyY2UgPSBudWxsOworICAgICAgICBMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVOYW1lcyhzb3VyY2UsIGl0ci5nZXRJbnB1dFN0cmVhbSgpLCBuYW1lcyk7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoc291cmNlLCAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pKTsKKyAgICAgICAgICAgICAgICBuYW1lcy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBfbG9jLmdldCgiY2xhc3MtYXJnIiwgc291cmNlKS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZWQgaW4gdGhlIGdpdmVuIC5jbGFzcyBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEZyb21DbGFzc0ZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0RnJvbUNsYXNzKGZpbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmluICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgZ2l2ZW4gLmNsYXNzIGJ5dGVjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEZyb21DbGFzcyhJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29uc3RhbnRQb29sVGFibGUgdGFibGUgPSBuZXcgQ29uc3RhbnRQb29sVGFibGUoaW4pOworICAgICAgICBpbnQgaWR4ID0gdGFibGUuZ2V0RW5kSW5kZXgoKTsKKyAgICAgICAgaWR4ICs9IDI7IC8vIGFjY2VzcyBmbGFncworICAgICAgICBpbnQgY2xzRW50cnkgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydChpZHgpOworICAgICAgICBpbnQgdXRmRW50cnkgPSB0YWJsZS5yZWFkVW5zaWduZWRTaG9ydCh0YWJsZS5nZXQoY2xzRW50cnkpKTsKKyAgICAgICAgcmV0dXJuIHRhYmxlLnJlYWRTdHJpbmcodGFibGUuZ2V0KHV0ZkVudHJ5KSkucmVwbGFjZSgnLycsICcuJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZWQgaW4gdGhlIGdpdmVuIC5qYXZhIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RnJvbUphdmFGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZmluZCB0aGUgbGluZSB3aXRoIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uCisgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBwYWNrID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgicGFja2FnZSAiKSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoOCkudHJpbSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiBhbnl0aGluZyBiZXlvbmQgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgcGFjayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQobGluZS5jaGFyQXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGluZS5jaGFyQXQoaSkgPT0gJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2suYXBwZW5kKGxpbmUuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0cmlwICcuamF2YScKKyAgICAgICAgICAgIFN0cmluZyBjbHNOYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICBjbHNOYW1lID0gY2xzTmFtZS5zdWJzdHJpbmcoMCwgY2xzTmFtZS5sZW5ndGgoKSAtIDUpOworCisgICAgICAgICAgICAvLyBwcmVmaXggd2l0aCBwYWNrYWdlCisgICAgICAgICAgICBpZiAocGFjayAhPSBudWxsICYmIHBhY2subGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIGNsc05hbWUgPSBwYWNrICsgIi4iICsgY2xzTmFtZTsKKworICAgICAgICAgICAgcmV0dXJuIGNsc05hbWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc2VzIG5hbWVkIGluIHRoZSBnaXZlbiBjb21tb24gZm9ybWF0IG1ldGFkYXRhIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEZyb21NZXRhRGF0YUZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlUmVhZGVyIGluID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0RnJvbU1ldGFEYXRhKGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3NlcyBuYW1lZCBpbiB0aGUgZ2l2ZW4gY29tbW9uIGZvcm1hdCBtZXRhZGF0YSBzdHJlYW0uCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEZyb21NZXRhRGF0YShSZWFkZXIgeG1sKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb2xsZWN0aW9uIG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcih4bWwpOworCisgICAgICAgIGJvb2xlYW4gY29tbWVudCA9IGZhbHNlOworICAgICAgICBpbnQgdG9rZW4gPSBUT0tFTl9OT05FOworICAgICAgICBTdHJpbmcgcGtnID0gIiI7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICByZWFkOgorICAgICAgICBmb3IgKGludCBjaCA9IDAsIGxhc3QgPSAwLCBsYXN0MiA9IDA7CisgICAgICAgICAgICBjaCA9PSAnPCcgfHwgKGNoID0gaW4ucmVhZCgpKSAhPSAtMTsgbGFzdDIgPSBsYXN0LCBsYXN0ID0gY2gpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBjb21tZW50cworICAgICAgICAgICAgaWYgKGNvbW1lbnQgJiYgbGFzdDIgPT0gJy0nICYmIGxhc3QgPT0gJy0nICYmIGNoID09ICc+JykgeworICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21tZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICc8JykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdDIgPT0gJzwnICYmIGxhc3QgPT0gJyEnICYmIGNoID09ICctJykgeworICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBub3QgYW4gZWxlbWVudCBzdGFydCwgc2tpcCBpdAorICAgICAgICAgICAgaWYgKGNoICE9ICc8JykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRva2VuID0gVE9LRU5fTk9ORTsgLy8gcmVzZXQgdG9rZW4KKyAgICAgICAgICAgIGxhc3QgPSBjaDsgLy8gdXBkYXRlIG5lZWRlZCBmb3IgY29tbWVudCBkZXRlY3Rpb24KKyAgICAgICAgICAgIGNoID0gcmVhZFRocm91Z2hXaGl0ZXNwYWNlKGluKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLycgfHwgY2ggPT0gJyEnIHx8IGNoID09ICc/JykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gcmVhZCBlbGVtZW50IG5hbWU7IGxvb2sgZm9yIHBhY2thZ2VzIGFuZCBjbGFzc2VzCisgICAgICAgICAgICB0b2tlbiA9IHJlYWRFbGVtZW50VG9rZW4oY2gsIGluKTsKKyAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0VPRjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVhZDsKKyAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BBQ0tBR0U6CisgICAgICAgICAgICAgICAgICAgIHBrZyA9IHJlYWRBdHRyaWJ1dGUoaW4sIF9wYWNrYWdlQXR0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwa2cgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fUEFDS0FHRV9OT0FUVFI6CisgICAgICAgICAgICAgICAgICAgIHBrZyA9IHJlYWRFbGVtZW50VGV4dChpbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwa2cgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgIGNoID0gJzwnOyAvLyByZWFkaW5nIGVsZW1lbnQgdGV4dCByZWFkcyB0byBuZXh0ICc8JworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NMQVNTOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVhZEF0dHJpYnV0ZShpbiwgX2NsYXNzQXR0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWFkOworICAgICAgICAgICAgICAgICAgICBpZiAocGtnLmxlbmd0aCgpID4gMCAmJiBuYW1lLmluZGV4T2YoJy4nKSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChwa2cgKyAiLiIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NMQVNTX05PQVRUUjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlYWRFbGVtZW50VGV4dChpbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayByZWFkOworICAgICAgICAgICAgICAgICAgICBjaCA9ICc8JzsgLy8gcmVhZGluZyBlbGVtZW50IHRleHQgcmVhZHMgdG8gbmV4dCAnPCcKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrZy5sZW5ndGgoKSA+IDAgJiYgbmFtZS5pbmRleE9mKCcuJykgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQocGtnICsgIi4iICsgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgWE1MIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgbWF0Y2hpbmcgdG9rZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVhZEVsZW1lbnRUb2tlbihpbnQgY2gsIFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbG9vayB0aHJvdWdoIHRoZSBiZWdpbm5pbmcgZWxlbWVudCBuYW1lcyB0byBmaW5kIHdoYXQgZWxlbWVudCB0aGlzCisgICAgICAgIC8vIG1pZ2h0IGJlKGlmIGFueSkKKyAgICAgICAgaW50IG1hdGNoSWR4ID0gLTE7CisgICAgICAgIGludCBtYXRjaGVkID0gMDsKKyAgICAgICAgaW50IGRxID0gMDsKKyAgICAgICAgZm9yIChpbnQgYmVnaW5JZHggPSAwOyBiZWdpbklkeCA8IF9iZWdpbkVsZW1lbnRzWzBdLmxlbmd0aDsgYmVnaW5JZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJlZ2luSWR4ICE9IDApCisgICAgICAgICAgICAgICAgY2ggPSBpbi5yZWFkKCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0VPRjsKKworICAgICAgICAgICAgbWF0Y2hlZCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9iZWdpbkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChkcSAmICgyIDw8IGkpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChjaCA9PSBfYmVnaW5FbGVtZW50c1tpXVtiZWdpbklkeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hJZHggPSBpOworICAgICAgICAgICAgICAgICAgICBtYXRjaGVkKys7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRxIHw9IDIgPDwgaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1hdGNoZWQgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2hlZCAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIFRPS0VOX05PTkU7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50IG5hbWUgbWF0Y2hlcworICAgICAgICBjaGFyW10gbWF0Y2ggPSBfZW5kRWxlbWVudHNbbWF0Y2hJZHhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fRU9GOworICAgICAgICAgICAgaWYgKGNoICE9IG1hdGNoW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9OT05FOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVhZCB0aGUgbmV4dCBjaGFyIHRvIG1ha2Ugc3VyZSB3ZSBmaW5pc2hlZCB0aGUgZWxlbWVudCBuYW1lCisgICAgICAgIGNoID0gaW4ucmVhZCgpOworICAgICAgICBpZiAoY2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gVE9LRU5fRU9GOworICAgICAgICBpZiAoY2ggPT0gJz4nKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hJZHggPT0gMCAmJiBfcGFja2FnZUF0dHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fUEFDS0FHRV9OT0FUVFI7CisgICAgICAgICAgICBpZiAobWF0Y2hJZHggIT0gMCAmJiBfY2xhc3NBdHRyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0NMQVNTX05PQVRUUjsKKyAgICAgICAgfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpIHsKKyAgICAgICAgICAgIGlmIChtYXRjaElkeCA9PSAwICYmIF9wYWNrYWdlQXR0ciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9QQUNLQUdFOworICAgICAgICAgICAgaWYgKG1hdGNoSWR4ICE9IDAgJiYgX2NsYXNzQXR0ciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9DTEFTUzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVE9LRU5fTk9ORTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiBjaGFycyBvZiB0aGUgY3VycmVudCBYTUwKKyAgICAgKiBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRBdHRyaWJ1dGUoUmVhZGVyIGluLCBjaGFyW10gbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gMDsKKyAgICAgICAgZm9yIChpbnQgY2gsIGxhc3QgPSAwOyB0cnVlOyBsYXN0ID0gY2gpIHsKKyAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOworICAgICAgICAgICAgaWYgKGNoID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGNoID09ICc+JykKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgICAgIC8vIGlmIG5vdCBleHBlY3RlZCBjaGFyIG9yIHN0aWxsIGxvb2tpbmcgZm9yICduJyBhbmQgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIGNoYXIgaXMgbm90IHdoaXRlc3BhY2UsIGtlZXAgbG9va2luZworICAgICAgICAgICAgaWYgKGNoICE9IG5hbWVbZXhwZWN0ZWRdIHx8IChleHBlY3RlZCA9PSAwICYmIGxhc3QgIT0gMAorICAgICAgICAgICAgICAgICYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBsYXN0KSkpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZvdW5kIGV4cGVjdGVkIGNoYXI7IGhhdmUgd2UgZm91bmQgdGhlIHdob2xlICJuYW1lIj8KKyAgICAgICAgICAgIGV4cGVjdGVkKys7CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbmFtZS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG5leHQgY2hhciBpcyAnPScKKyAgICAgICAgICAgICAgICBjaCA9IHJlYWRUaHJvdWdoV2hpdGVzcGFjZShpbik7CisgICAgICAgICAgICAgICAgaWYgKGNoID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdG9zcyBvdXQgYW55IHN1YnNlcXVlbnQgd2hpdGVzcGFjZSBhbmQgdGhlIG5leHQgY2hhciwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBpcyB0aGUgb3BlbmluZyBxdW90ZSBmb3IgdGhlIGF0dHIgdmFsdWUsIHRoZW4gcmVhZCB1bnRpbCB0aGUKKyAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIHF1b3RlCisgICAgICAgICAgICAgICAgcmVhZFRocm91Z2hXaGl0ZXNwYWNlKGluKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEF0dHJpYnV0ZVZhbHVlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGN1cnJlbnQgdGV4dCB2YWx1ZSB1bnRpbCB0aGUgbmV4dCBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRFbGVtZW50VGV4dChSZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBudWxsOworICAgICAgICBpbnQgY2g7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY2gpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJ1ZiA9PSBudWxsKSA/ICIiIDogYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB1bnRpbCB0aGUgbmV4dCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVhZFRocm91Z2hXaGl0ZXNwYWNlKFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNoOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2ggPSBpbi5yZWFkKCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gLTEgfHwgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRBdHRyaWJ1dGVWYWx1ZShSZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGludCBjaDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOworICAgICAgICAgICAgaWYgKGNoID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKQorICAgICAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ2xhc3NNZXRhRGF0YUl0ZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NsYXNzTWV0YURhdGFJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGVlNGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NsYXNzTWV0YURhdGFJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk11bHRpQ2xhc3NMb2FkZXI7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogSXRlcmF0b3Igb3ZlciBhbGwgbWV0YWRhdGEgcmVzb3VyY2VzIHRoYXQgbWlnaHQgY29udGFpbiB0aGUKKyAqIG1ldGFkYXRhIGZvciBhIGdpdmVuIGNsYXNzLCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IGdlbmVyYWwuIEFzc3VtZXMgdGhhdAorICogcGFja2FnZS1sZXZlbCByZXNvdXJjZXMgYXJlIG5hbWVkICJwYWNrYWdlLiZsdDtzdWZmaXgmZ3Q7Ii4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQ2xhc3NNZXRhRGF0YUl0ZXJhdG9yIGltcGxlbWVudHMgTWV0YURhdGFJdGVyYXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIF9sb2FkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IF9sb2NzOworICAgIHByaXZhdGUgaW50IF9sb2MgPSAtMTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX3VybHMgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgIHByaXZhdGUgaW50IF91cmwgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgdGhlIGNsYXNzIHdob3NlIG1ldGFkYXRhIHRvIGZpbmQsIHRoZSBzdWZmaXgKKyAgICAgKiBvZiBtZXRhZGF0YSBmaWxlcywgYW5kIHdoZXRoZXIgdG8gcGFyc2UgdG9wLWRvd24gb3IgYm90dG9tLXVwLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc01ldGFEYXRhSXRlcmF0b3IoQ2xhc3MgY2xzLCBTdHJpbmcgc3VmZml4LCBib29sZWFuIHRvcERvd24pIHsKKyAgICAgICAgdGhpcyhjbHMsIHN1ZmZpeCwgbnVsbCwgdG9wRG93bik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSB0aGUgY2xhc3Mgd2hvc2UgbWV0YWRhdGEgdG8gZmluZCwgdGhlIHN1ZmZpeAorICAgICAqIG9mIG1ldGFkYXRhIGZpbGVzLCBhbmQgd2hldGhlciB0byBwYXJzZSB0b3AtZG93biBvciBib3R0b20tdXAuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGFJdGVyYXRvcihDbGFzcyBjbHMsIFN0cmluZyBzdWZmaXgsIENsYXNzTG9hZGVyIGxvYWRlciwKKyAgICAgICAgYm9vbGVhbiB0b3BEb3duKSB7CisgICAgICAgIC8vIHNraXAgY2xhc3NlcyB0aGF0IGNhbid0IGhhdmUgbWV0YWRhdGEKKyAgICAgICAgaWYgKGNscyAhPSBudWxsICYmIChjbHMuaXNQcmltaXRpdmUoKQorICAgICAgICAgICAgfHwgY2xzLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLiIpCisgICAgICAgICAgICB8fCBjbHMuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmF4LiIpKSkgeworICAgICAgICAgICAgX2xvYWRlciA9IG51bGw7CisgICAgICAgICAgICBfbG9jcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIE11bHRpQ2xhc3NMb2FkZXIgbXVsdGkgPSBuZXcgTXVsdGlDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgbXVsdGkuYWRkQ2xhc3NMb2FkZXIobXVsdGkuU1lTVEVNX0xPQURFUik7CisgICAgICAgICAgICBtdWx0aS5hZGRDbGFzc0xvYWRlcihtdWx0aS5USFJFQURfTE9BREVSKTsKKyAgICAgICAgICAgIG11bHRpLmFkZENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBpZiAoY2xzICE9IG51bGwgJiYgY2xzLmdldENsYXNzTG9hZGVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtdWx0aS5hZGRDbGFzc0xvYWRlcihjbHMuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBsb2FkZXIgPSBtdWx0aTsKKyAgICAgICAgfQorICAgICAgICBfbG9hZGVyID0gbG9hZGVyOworCisgICAgICAgIC8vIGNvbGxlY3QgdGhlIHNldCBvZiBhbGwgcG9zc2libGUgbWV0YWRhdGEgbG9jYXRpb25zOyBzdGFydCB3aXRoCisgICAgICAgIC8vIHN5c3RlbSBsb2NhdGlvbnMKKyAgICAgICAgX2xvY3MgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIF9sb2NzLmFkZCgiTUVUQS1JTkYvcGFja2FnZSIgKyBzdWZmaXgpOworICAgICAgICBfbG9jcy5hZGQoIldFQi1JTkYvcGFja2FnZSIgKyBzdWZmaXgpOworICAgICAgICBfbG9jcy5hZGQoInBhY2thZ2UiICsgc3VmZml4KTsKKworICAgICAgICAvLyBwdXQgdGhpcyBsZWdhY3kgbG9jYXRpb24gYXQgdGhlIGVuZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UncmUKKyAgICAgICAgLy8gZ29pbmcgdG9wIGRvd24gb3IgYm90dG9tIHVwIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgaXQgYXMgb2Z0ZW4KKyAgICAgICAgLy8gZHVyaW5nIHRlc3RpbmcKKyAgICAgICAgaWYgKCF0b3BEb3duKQorICAgICAgICAgICAgX2xvY3MuYWRkKCJzeXN0ZW0iICsgc3VmZml4KTsKKworICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGFsc28gY2hlY2s6CisgICAgICAgICAgICAvLyAxLiBmb3IgZWFjaCBwYWNrYWdlIGZyb20gdGhlIHRvcCBkb3duIHRvIGNscycgcGFja2FnZToKKyAgICAgICAgICAgIC8vIDxwYXRoPi9wYWNrYWdlPHN1ZmZpeD4KKyAgICAgICAgICAgIC8vIDxwYXRoPi88cGFja2FnZS1uYW1lPjxzdWZmaXg+IChsZWdhY3kgc3VwcG9ydCkKKyAgICAgICAgICAgIC8vIDxwYXRoPi8uLi88cGFja2FnZS1uYW1lPjxzdWZmaXg+IChsZWdhY3kgc3VwcG9ydCkKKyAgICAgICAgICAgIC8vIDIuIDxwYXRoPi88Y2xhc3MtbmFtZT48c3VmZml4PgorICAgICAgICAgICAgU3RyaW5nIHBrZyA9IFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoY2xzKS5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICAgICAgICAgIGlmIChwa2cubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCwgc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lLCBwYXRoLCB1cFBhdGggPSAiIjsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IHBrZy5pbmRleE9mKCcvJywgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa2dOYW1lID0gKHN0YXJ0ID09IDApID8gcGtnIDogcGtnLnN1YnN0cmluZyhzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGtnICsgIi8iOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGtnTmFtZSA9IHBrZy5zdWJzdHJpbmcoc3RhcnQsIGlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGtnLnN1YnN0cmluZygwLCBpZHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIF9sb2NzLmFkZChwYXRoICsgInBhY2thZ2UiICsgc3VmZml4KTsKKyAgICAgICAgICAgICAgICAgICAgX2xvY3MuYWRkKHBhdGggKyBwa2dOYW1lICsgc3VmZml4KTsgLy8gbGVnYWN5CisgICAgICAgICAgICAgICAgICAgIF9sb2NzLmFkZCh1cFBhdGggKyBwa2dOYW1lICsgc3VmZml4KTsgLy8gbGVnYWN5CisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBfbG9jcy5hZGQocGF0aCArIFN0cmluZ3MuZ2V0Q2xhc3NOYW1lKGNscykgKyBzdWZmaXgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaWR4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgdXBQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCAhPSAtMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIDxjbGFzcy1uYW1lPjxzdWZmaXg+IGZvciB0b3AtbGV2ZWwgY2xhc3NlcworICAgICAgICAgICAgICAgIF9sb2NzLmFkZChjbHMuZ2V0TmFtZSgpICsgc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodG9wRG93bikKKyAgICAgICAgICAgIF9sb2NzLmFkZCgic3lzdGVtIiArIHN1ZmZpeCk7IC8vIGxlZ2FjeQorICAgICAgICBlbHNlCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKF9sb2NzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bWVyYXRpb24gZTsKKyAgICAgICAgd2hpbGUgKF91cmwgKyAxID49IF91cmxzLnNpemUoKSkgeworICAgICAgICAgICAgaWYgKCsrX2xvYyA+PSBfbG9jcy5zaXplKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBfdXJsID0gLTE7CisgICAgICAgICAgICBfdXJscy5jbGVhcigpOworICAgICAgICAgICAgZSA9IF9sb2FkZXIuZ2V0UmVzb3VyY2VzKChTdHJpbmcpIF9sb2NzLmdldChfbG9jKSk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICBfdXJscy5hZGQoZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiBfdXJscy5nZXQoKytfdXJsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoX3VybCA9PSAtMSB8fCBfdXJsID49IF91cmxzLnNpemUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuICgoVVJMKSBfdXJscy5nZXQoX3VybCkpLm9wZW5TdHJlYW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF91cmwgPT0gLTEgfHwgX3VybCA+PSBfdXJscy5zaXplKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFVSTERlY29kZXIuZGVjb2RlKCgoVVJMKSBfdXJscy5nZXQoX3VybCkpLgorICAgICAgICAgICAgZ2V0RmlsZSgpKSk7CisgICAgICAgIHJldHVybiAoZmlsZS5leGlzdHMoKSkgPyBmaWxlIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NsYXNzcGF0aE1ldGFEYXRhSXRlcmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvQ2xhc3NwYXRoTWV0YURhdGFJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmFiNjIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL0NsYXNzcGF0aE1ldGFEYXRhSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEl0ZXJhdG9yIG92ZXIgZGlyZWN0b3JpZXMgaW4gdGhlIGNsYXNzcGF0aC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoTWV0YURhdGFJdGVyYXRvciBleHRlbmRzIE1ldGFEYXRhSXRlcmF0b3JDaGFpbiB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yOyBpdGVyYXRlcyBvdmVyIGFsbCBjbGFzc3BhdGggZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIENsYXNzcGF0aE1ldGFEYXRhSXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgdGhlIGNsYXNzcGF0aCBkaXJlY3RvcmllcyB0byBzY2FuIGFuZCBhbiBvcHRpb25hbAorICAgICAqIHJlc291cmNlIGZpbHRlci4gVGhlIGdpdmVuIGRpcmVjdG9yaWVzIG1heSBiZSBudWxsIHRvIHNjYW4gYWxsCisgICAgICogY2xhc3NwYXRoIGRpcmVjdG9yaWVzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc3BhdGhNZXRhRGF0YUl0ZXJhdG9yKFN0cmluZ1tdIGRpcnMsIE1ldGFEYXRhRmlsdGVyIGZpbHRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIFN0cmluZyBwYXRoID0gcHJvcHMuZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOworICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBTdHJpbmdzLnNwbGl0KHBhdGgsCisgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKSwgMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkaXJzICE9IG51bGwgJiYgZGlycy5sZW5ndGggIT0gMCAmJiAhZW5kc1dpdGgodG9rZW5zW2ldLCBkaXJzKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodG9rZW5zW2ldKTsKKyAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgYWRkSXRlcmF0b3IobmV3IEZpbGVNZXRhRGF0YUl0ZXJhdG9yKGZpbGUsIGZpbHRlcikpOworICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5zW2ldLmVuZHNXaXRoKCIuamFyIikpCisgICAgICAgICAgICAgICAgYWRkSXRlcmF0b3IobmV3IFppcEZpbGVNZXRhRGF0YUl0ZXJhdG9yKG5ldyBaaXBGaWxlKGZpbGUpLAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0b2tlbiBlbmRzIHdpdGggYW55IG9mIHRoZSBnaXZlbiBzdHJpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nIHRva2VuLCBTdHJpbmdbXSBzdWZmcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHRva2VuLmVuZHNXaXRoKHN1ZmZzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvRmlsZU1ldGFEYXRhSXRlcmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvRmlsZU1ldGFEYXRhSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc2MGJhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9GaWxlTWV0YURhdGFJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBJdGVyYXRvciBvdmVyIGEgZmlsZSwgb3Igb3ZlciBhbGwgbWV0YWRhdGEgcmVzb3VyY2VzIGJlbG93IGEgZ2l2ZW4gZGlyZWN0b3J5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTWV0YURhdGFJdGVyYXRvciBpbXBsZW1lbnRzIE1ldGFEYXRhSXRlcmF0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTQ0FOX0xJTUlUID0gMTAwMDAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRmlsZU1ldGFEYXRhSXRlcmF0b3IuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBfaXRyOworICAgIHByaXZhdGUgRmlsZSBfZmlsZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IG1ldGFkYXRhIGZpbGUuCisgICAgICovCisgICAgcHVibGljIEZpbGVNZXRhRGF0YUl0ZXJhdG9yKEZpbGUgZmlsZSkgeworICAgICAgICBfaXRyID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKGZpbGUpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSByb290IG9mIGRpcmVjdG9yeSB0cmVlIHRvIHNlYXJjaCBhbmQgb3B0aW9uYWwKKyAgICAgKiBmaWxlIGZpbHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZU1ldGFEYXRhSXRlcmF0b3IoRmlsZSBkaXIsIE1ldGFEYXRhRmlsdGVyIGZpbHRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpciA9PSBudWxsKQorICAgICAgICAgICAgX2l0ciA9IG51bGw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBtZXRhcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIEZpbGVSZXNvdXJjZSByc3JjID0gKGZpbHRlciA9PSBudWxsKSA/IG51bGwgOiBuZXcgRmlsZVJlc291cmNlKCk7CisgICAgICAgICAgICBzY2FuKGRpciwgZmlsdGVyLCByc3JjLCBtZXRhcywgMCk7CisgICAgICAgICAgICBfaXRyID0gbWV0YXMuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW4gYWxsIGZpbGVzIGJlbG93IHRoZSBnaXZlbiBvbmUgZm9yIG1ldGFkYXRhIGZpbGVzLCBhZGRpbmcgdGhlbQorICAgICAqIHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNjYW4oRmlsZSBmaWxlLCBNZXRhRGF0YUZpbHRlciBmaWx0ZXIsIEZpbGVSZXNvdXJjZSByc3JjLAorICAgICAgICBDb2xsZWN0aW9uIG1ldGFzLCBpbnQgc2Nhbm5lZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNjYW5uZWQgPiBTQ0FOX0xJTUlUKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgidG9vLW1hbnktZmlsZXMiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFNDQU5fTElNSVQpKS5nZXRNZXNzYWdlKCkpOworICAgICAgICBzY2FubmVkKys7CisKKyAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKQorICAgICAgICAgICAgbWV0YXMuYWRkKGZpbGUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJzcmMuc2V0RmlsZShmaWxlKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhyc3JjKSkKKyAgICAgICAgICAgICAgICBtZXRhcy5hZGQoZmlsZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOworICAgICAgICAgICAgICAgIGlmIChmaWxlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZCA9IHNjYW4oZmlsZXNbaV0sIGZpbHRlciwgcnNyYywgbWV0YXMsIHNjYW5uZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2FubmVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBfaXRyICE9IG51bGwgJiYgX2l0ci5oYXNOZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9pdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgX2ZpbGUgPSAoRmlsZSkgX2l0ci5uZXh0KCk7CisgICAgICAgIHJldHVybiBfZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSTCgpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShfZmlsZSk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgaWYgKF9maWxlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiBfZmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlUmVzb3VyY2UgaW1wbGVtZW50cyBNZXRhRGF0YUZpbHRlci5SZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBGaWxlIF9maWxlID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgX2ZpbGUgPSBmaWxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIF9maWxlLmdldE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIGxlbiA9IF9maWxlLmxlbmd0aCgpOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oX2ZpbGUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBieXRlW10gY29udGVudDsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDAgfHwgbGVuID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBKVk1zIGRvbid0IHJldHVybiBhIHByb3BlciBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsgCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHI7IChyID0gZmluLnJlYWQoYnVmKSkgIT0gLTE7KQorICAgICAgICAgICAgICAgICAgICAgICAgYm91dC53cml0ZShidWYsIDAsIHIpOworICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gYm91dC50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBuZXcgYnl0ZVsoaW50KSBsZW5dOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCByLCBvID0gMDsgbyA8IGNvbnRlbnQubGVuZ3RoICYmIChyID0gZmluLgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChjb250ZW50LCBvLCBjb250ZW50Lmxlbmd0aCAtIG8pKSAhPSAtMTsgbyArPSByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7IGZpbi5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL01ldGFEYXRhRmlsdGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL01ldGFEYXRhRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4MDRjNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvTWV0YURhdGFGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogRmlsdGVycyBtZXRhZGF0YSByZXNvdXJjZXMuIFR5cGljYWxseSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgcmVzdWx0cworICogb2YgYSB7QGxpbmsgTWV0YURhdGFJdGVyYXRvcn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUZpbHRlciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGFzc2VzIHRoZSBmaWx0ZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhSZXNvdXJjZSByc3JjKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIG1ldGFkYXRhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlc291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIGNvbnRlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9NZXRhRGF0YUl0ZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL01ldGFEYXRhSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTMxZGZiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9NZXRhRGF0YUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkNsb3NlYWJsZTsgLy8gYWxzbyBpbiBqYXZhLmlvKGluIDEuNSkKKworLyoqCisgKiBJdGVyYXRvciBvdmVyIG1ldGFkYXRhIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhSXRlcmF0b3IgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgaXMgYW5vdGhlciByZXNvdXJjZSB0byBpdGVyYXRlIG92ZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmV4dCBtZXRhZGF0YSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhc3QtaXRlcmF0ZWQgbWV0YWRhdGEgcmVzb3VyY2UgY29udGVudCBhcyBhIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhc3QtaXRlcmF0ZWQgbWV0YWRhdGEgcmVzb3VyY2UgY29udGVudCBhcyBhIGZpbGUsIG9yIG51bGwKKyAgICAgKiBpZiBub3QgYW4gZXh0YW50IGZpbGUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIGl0ZXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvTWV0YURhdGFJdGVyYXRvckNoYWluLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL01ldGFEYXRhSXRlcmF0b3JDaGFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjY5MjkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL01ldGFEYXRhSXRlcmF0b3JDaGFpbi5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogTWV0YWRhdGEgaXRlcmF0b3IgdGhhdCBjb21iaW5lcyBzZXZlcmFsIGl0ZXJhdG9ycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgTWV0YURhdGFJdGVyYXRvckNoYWluIGltcGxlbWVudHMgTWV0YURhdGFJdGVyYXRvciB7CisKKyAgICBwcml2YXRlIExpc3QgX2l0cnMgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9jdXIgPSAtMTsKKyAgICBwcml2YXRlIE1ldGFEYXRhSXRlcmF0b3IgX2l0ciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YUl0ZXJhdG9yQ2hhaW4oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tYmluZSB0d28gaXRlcmF0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRhRGF0YUl0ZXJhdG9yQ2hhaW4oTWV0YURhdGFJdGVyYXRvciBpdHIxLCBNZXRhRGF0YUl0ZXJhdG9yIGl0cjIpIHsKKyAgICAgICAgX2l0cnMgPSBuZXcgQXJyYXlMaXN0KDIpOworICAgICAgICBfaXRycy5hZGQoaXRyMSk7CisgICAgICAgIF9pdHJzLmFkZChpdHIyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaXRlcmF0b3IgdG8gdGhlIGNoYWluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEl0ZXJhdG9yKE1ldGFEYXRhSXRlcmF0b3IgaXRyKSB7CisgICAgICAgIGlmIChfY3VyICE9IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBpZiAoX2l0cnMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9pdHJzID0gbmV3IEFycmF5TGlzdCg0KTsKKyAgICAgICAgX2l0cnMuYWRkKGl0cik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfaXRycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX2N1ciA9PSAtMSkKKyAgICAgICAgICAgIF9jdXIgPSAwOworCisgICAgICAgIE1ldGFEYXRhSXRlcmF0b3IgaXRyOworICAgICAgICBmb3IgKDsgX2N1ciA8IF9pdHJzLnNpemUoKTsgX2N1cisrKSB7CisgICAgICAgICAgICBpdHIgPSAoTWV0YURhdGFJdGVyYXRvcikgX2l0cnMuZ2V0KF9jdXIpOworICAgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBfaXRyID0gaXRyOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9pdHIgPSBudWxsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNOZXh0KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gX2l0ci5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9pdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIF9pdHIuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9pdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIF9pdHIuZ2V0RmlsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoX2l0cnMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2l0cnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgKChNZXRhRGF0YUl0ZXJhdG9yKSBpdHIubmV4dCgpKS5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvTWV0YURhdGFQYXJzZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvTWV0YURhdGFQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDAyNGEwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9NZXRhRGF0YVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgbWV0YWRhdGEgcGFyc2Vycy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhUGFyc2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzc2xvYWRlciB0byB1c2UgdG8gcmVzb2x2ZSByZXNvdXJjZXMsIG9yIG51bGwgZm9yIGltcGwtZGVmaW5lZAorICAgICAqIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0cyBmcm9tIHRoZSBsYXN0IHBhcnNlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFJlc3VsdHMoKTsKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBnaXZlbiByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgcnNyYykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGdpdmVuIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBnaXZlbiBmaWxlLCB3aGljaCBtYXkgYmUgYSBkaXJlY3RvcnksIGluIHdoaWNoIGNhc2UgaXQKKyAgICAgKiB3aWxsIGJlIHNjYW5uZWQgcmVjdXJzaXZlbHkgZm9yIG1ldGFkYXRhIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUGFyc2UgYWxsIHBvc3NpYmxlIG1ldGFkYXRhIGxvY2F0aW9ucyBmb3IgdGhlIGdpdmVuIGNsYXNzLCBnb2luZworICAgICAqIHRvcC1kb3duIG9yIGJvdHRvbS11cC4gSWYgdGhlIGNsYXNzIGlzIG51bGwsIG9ubHkgdG9wLWxldmVsIGxvY2F0aW9ucworICAgICAqIHdpbGwgYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKENsYXNzIGNscywgYm9vbGVhbiB0b3BEb3duKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgbWV0YWRhdGEgaW4gdGhlIGdpdmVuIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50IHJlYWRlciBjb250YWluaW5nIHRoZSBtZXRhZGF0YSB0byBwYXJzZQorICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgYmVpbmcgcGFyc2VkLCBmb3IgdXNlCisgICAgICogaW4gZXJyb3IgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShSZWFkZXIgY29udGVudCwgU3RyaW5nIHNvdXJjZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBtZXRhZGF0YSBzdXBwbGllZCBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFyc2UoTWV0YURhdGFJdGVyYXRvciBpdHIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUgb2YgcGFyc2VkIHJlc291cmNlIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL01ldGFEYXRhU2VyaWFsaXplci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9NZXRhRGF0YVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWMzMDBhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9NZXRhRGF0YVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBtZXRhIGRhdGEgc2VyaWFsaXplcnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVNlcmlhbGl6ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFDVCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFVFRZID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUkJPU0UgPSA0OworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHRoZSBjdXJyZW50IHNldCBvZiBvYmplY3RzIHRvIHRoZSBmaWxlcyBmcm9tIHdoaWNoIHRoZXkgd2VyZQorICAgICAqIHBhcnNlZC4gQW55IG9iamVjdHMgZm9yIHdoaWNoIGEgc291cmNlIGZpbGUgY2Fubm90IGJlIGRldGVybWluZWQgd2lsbAorICAgICAqIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIGZsYWdzIGJpdCBmbGFncyBzcGVjaWZ5aW5nIHRoZSBvdXRwdXQgZmxhZ3M7IGUuZy4ge0BsaW5rICNQUkVUVFl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGludCBmbGFncykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHRoZSBjdXJyZW50IHNldCBvZiBvYmplY3RzIHRvIHRoZSBmaWxlcyBmcm9tIHdoaWNoIHRoZXkgd2VyZQorICAgICAqIHBhcnNlZC4gVGhlIG9iamVjdHMgbXVzdCBpbXBsZW1lbnQgdGhlIHtAbGluayBTb3VyY2VUcmFja2VyfSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IGlmIG51bGwsIHRoZW4gc2VyaWFsaXplIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbTsKKyAgICAgKiBvdGh3ZXJ3aXNlLCBwb3B1bGF0ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBNYXB9IHdpdGgKKyAgICAgKiBrZXlzIHRoYXQgYXJlIHRoZSB7QGxpbmsgRmlsZX0gaW5zdGFuY2VzLCBhbmQKKyAgICAgKiB2YWx1ZXMgdGhhdCBhcmUgdGhlIHtAbGluayBTdHJpbmd9IGNvbnRlbnRzIG9mIHRoZSBtZXRhZGF0YQorICAgICAqIEBwYXJhbSBmbGFncyBiaXQgZmxhZ3Mgc3BlY2lmeWluZyB0aGUgb3V0cHV0IGZsYWdzOyBlLmcuIHtAbGluayAjUFJFVFRZfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNYXAgb3V0cHV0LCBpbnQgZmxhZ3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSB0aGUgY3VycmVudCBzZXQgb2Ygb2JqZWN0cyB0byB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBiaXQgZmxhZ3Mgc3BlY2lmeWluZyB0aGUgb3V0cHV0IGZsYWdzOyBlLmcuCisgICAgICoge0BsaW5rICNQUkVUVFl9IHwge0BsaW5rICNBUFBFTkR9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEZpbGUgZmlsZSwgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgdGhlIGN1cnJlbnQgc2V0IG9mIG9iamVjdHMgdG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBiaXQgZmxhZ3Mgc3BlY2lmeWluZyB0aGUgb3V0cHV0IGZsYWdzOyBlLmcuIHtAbGluayAjUFJFVFRZfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgb3V0LCBpbnQgZmxhZ3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvUmVzb3VyY2VNZXRhRGF0YUl0ZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1Jlc291cmNlTWV0YURhdGFJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjI3MjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1Jlc291cmNlTWV0YURhdGFJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5NdWx0aUNsYXNzTG9hZGVyOworCisvKioKKyAqIEl0ZXJhdG9yIG92ZXIgYSBnaXZlbiBtZXRhZGF0YSByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VNZXRhRGF0YUl0ZXJhdG9yIGltcGxlbWVudHMgTWV0YURhdGFJdGVyYXRvciB7CisKKyAgICBwcml2YXRlIExpc3QgX3VybHMgPSBudWxsOworICAgIHByaXZhdGUgaW50IF91cmwgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgdGhlIHJlc291cmNlIHRvIHBhcnNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1ldGFEYXRhSXRlcmF0b3IoU3RyaW5nIHJzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMocnNyYywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSB0aGUgcmVzb3VyY2UgdG8gcGFyc2UuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTWV0YURhdGFJdGVyYXRvcihTdHJpbmcgcnNyYywgQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIE11bHRpQ2xhc3NMb2FkZXIgbXVsdGkgPSBuZXcgTXVsdGlDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgbXVsdGkuYWRkQ2xhc3NMb2FkZXIobXVsdGkuU1lTVEVNX0xPQURFUik7CisgICAgICAgICAgICBtdWx0aS5hZGRDbGFzc0xvYWRlcihtdWx0aS5USFJFQURfTE9BREVSKTsKKyAgICAgICAgICAgIG11bHRpLmFkZENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBsb2FkZXIgPSBtdWx0aTsKKyAgICAgICAgfQorCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKHJzcmMpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgaWYgKF91cmxzID09IG51bGwpCisgICAgICAgICAgICAgICAgX3VybHMgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgICAgICAgICAgX3VybHMuYWRkKGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gX3VybHMgIT0gbnVsbCAmJiBfdXJsICsgMSA8IF91cmxzLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgIGlmICghaGFzTmV4dCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIF91cmxzLmdldCgrK191cmwpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfdXJsID09IC0xIHx8IF91cmwgPj0gX3VybHMuc2l6ZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gKChVUkwpIF91cmxzLmdldChfdXJsKSkub3BlblN0cmVhbSgpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoX3VybCA9PSAtMSB8fCBfdXJsID49IF91cmxzLnNpemUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoVVJMRGVjb2Rlci5kZWNvZGUoKChVUkwpIF91cmxzLmdldChfdXJsKSkuCisgICAgICAgICAgICBnZXRGaWxlKCkpKTsKKyAgICAgICAgcmV0dXJuIChmaWxlLmV4aXN0cygpKSA/IGZpbGUgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9Tb3VyY2VUcmFja2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1NvdXJjZVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTgzOGZjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9Tb3VyY2VUcmFja2VyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogSW50ZXJmYWNlIHRoYXQgY2FuIG9wdGlvbmFsbHkgYmUgaW1wbGVtZW50ZWQgYnkgbWV0YWRhdGEKKyAqIHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggdGhlIG1ldGFkYXRhIHdhcyBvcmlnaW5hbGx5IHBhcnNlZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNvdXJjZVRyYWNrZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1JDX09USEVSID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUkNfQU5OT1RBVElPTlMgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNSQ19YTUwgPSAyOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhpcyBpbnN0YW5jZSB3YXMgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUZpbGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluLWRlcGVuZGVudCBzY29wZSBvZiB0aGlzIGluc3RhbmNlIHdpdGhpbiBpdHMgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZVNjb3BlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR5cGUgb2Ygc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4tbWVhbmluZ2Z1bCBuYW1lIG9mIHRoZSByZXNvdXJjZSB0aGF0IHdhcyBsb2FkZWQKKyAgICAgKiBmcm9tIHRoaXMgc291cmNlLiBJLmUuLCBpZiB3ZSBoYWQgbG9hZGVkIHRoZSBzb3VyY2UgZm9yIGEgSmF2YQorICAgICAqIGNsYXNzLCB0aGlzIHdvdWxkIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvU291cmNlVHJhY2tlcnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvU291cmNlVHJhY2tlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VlNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9Tb3VyY2VUcmFja2Vycy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBwZXJmb3JtaW5nIGNvbW1vbiBvcGVyYXRpb25zIG9uIHtAbGluayBTb3VyY2VUcmFja2VyfXMuCisgKgorICogQHNpbmNlIDAuMy4zLjEKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZVRyYWNrZXJzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0KKyAgICAgICAgTG9jYWxpemVyLmZvclBhY2thZ2UoU291cmNlVHJhY2tlcnMuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYXBwcm9wcmlhdGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIgZGVzY3JpYmluZworICAgICAqIHRoZSBsb2NhdGlvbihzKSB0aGF0IDxjb2RlPnRyYWNrZXJzPC9jb2RlPiB3ZXJlIGxvYWRlZCBmcm9tLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYWNrZXJzIHRoZSBzb3VyY2UtdHJhY2tlcnMgZm9yIHdoaWNoIGxvY2F0aW9uIGluZm8gc2hvdWxkCisgICAgICogYmUgcHJvdmlkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U291cmNlTG9jYXRpb25NZXNzYWdlKFNvdXJjZVRyYWNrZXJbXSB0cmFja2VycykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigyMCAqICh0cmFja2Vycy5sZW5ndGggKyAxKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoX2xvYy5nZXQoInNvdXJjZS10cmFja2Vycy1sb2NhdGlvbi1oZWFkZXIiKSkuYXBwZW5kKFNFUCk7CisgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlUGF0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja2Vycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc291cmNlRmlsZVBhdGggPSAodHJhY2tlcnNbaV0uZ2V0U291cmNlRmlsZSgpID09IG51bGwgPworICAgICAgICAgICAgICAgIF9sb2MuZ2V0KCJzb3VyY2UtdHJhY2tlci1maWxlLXVua25vd24iKS5nZXRNZXNzYWdlKCkgOgorICAgICAgICAgICAgICAgIHRyYWNrZXJzW2ldLmdldFNvdXJjZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgICIpLmFwcGVuZChfbG9jLmdldCgKKyAgICAgICAgICAgICAgICAic291cmNlLXRyYWNrZXJzLWxvY2F0aW9uLWxpbmUtaXRlbSIsCisgICAgICAgICAgICAgICAgdHJhY2tlcnNbaV0uZ2V0UmVzb3VyY2VOYW1lKCksIHNvdXJjZUZpbGVQYXRoKSk7CisgICAgICAgICAgICBpZiAoaSA8IHRyYWNrZXJzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChTRVApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1N1ZmZpeE1ldGFEYXRhRmlsdGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1N1ZmZpeE1ldGFEYXRhRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNjAwYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvU3VmZml4TWV0YURhdGFGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworLyoqCisgKiBGaWx0ZXJzIG1ldGFkYXRhIGl0ZXJhdGlvbiBiYXNlZCBvbiByZXNvdXJjZSBuYW1lIHN1ZmZpeC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU3VmZml4TWV0YURhdGFGaWx0ZXIgaW1wbGVtZW50cyBNZXRhRGF0YUZpbHRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfc3VmZml4OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBzdWZmaXggdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3VmZml4TWV0YURhdGFGaWx0ZXIoU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICBfc3VmZml4ID0gc3VmZml4OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoUmVzb3VyY2UgcnNyYykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHJzcmMuZ2V0TmFtZSgpOworICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsICYmIG5hbWUuZW5kc1dpdGgoX3N1ZmZpeCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9VUkxNZXRhRGF0YUl0ZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1VSTE1ldGFEYXRhSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTIwMzljCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9VUkxNZXRhRGF0YUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworCisvKioKKyAqIEl0ZXJhdG9yIG92ZXIgdGhlIG1ldGFkYXRhIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IGEgVVJMLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBVUkxNZXRhRGF0YUl0ZXJhdG9yIGltcGxlbWVudHMgTWV0YURhdGFJdGVyYXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFVSTCBfdXJsOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXRlcmF0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgcmVzb3VyY2UgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBVUkxNZXRhRGF0YUl0ZXJhdG9yKFVSTCB1cmwpIHsKKyAgICAgICAgX3VybCA9IHVybDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gX3VybCAhPSBudWxsICYmICFfaXRlcmF0ZWQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNOZXh0KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgX2l0ZXJhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIF91cmw7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFfaXRlcmF0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChfdXJsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIF91cmwub3BlblN0cmVhbSgpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIGlmICghX2l0ZXJhdGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBpZiAoX3VybCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFVSTERlY29kZXIuZGVjb2RlKF91cmwuZ2V0UGF0aCgpKSk7CisgICAgICAgIHJldHVybiAoZmlsZS5leGlzdHMoKSkgPyBmaWxlIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWE1MTWV0YURhdGFQYXJzZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWE1MTWV0YURhdGFQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQxZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9YTUxNZXRhRGF0YVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CisKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuSmF2YVZlcnNpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sLkNvbW1lbnRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sLkRvY1R5cGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuTG9jYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuWE1MRmFjdG9yeTsKKworLyoqCisgKiBDdXN0b20gU0FYIHBhcnNlciB1c2VkIGJ5IHRoZSBzeXN0ZW0gdG8gcXVpY2tseSBwYXJzZSBtZXRhZGF0YSBmaWxlcy4KKyAqIFN1YmNsYXNzZXMgc2hvdWxkIGhhbmRsZSB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgY29udGVudC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MTWV0YURhdGFQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgorICAgIGltcGxlbWVudHMgTGV4aWNhbEhhbmRsZXIsIE1ldGFEYXRhUGFyc2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFhNTE1ldGFEYXRhUGFyc2VyLmNsYXNzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9zY2hlbWFCdWc7CisKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIFhlcmNlcyB2ZXJzaW9uIDIuMC4yIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGRpc2FibGUKKyAgICAgICAgICAgIC8vIHNjaGVtYSB2YWxpZGF0aW9uLCB3aGljaCB3b3JrcyBhcm91bmQgdGhlIGJ1ZyByZXBvcnRlZCBhdDoKKyAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ3MDg4NTkKKyAgICAgICAgICAgIF9zY2hlbWFCdWcgPSAiWGVyY2VzLUogMi4wLjIiLmVxdWFscyhDbGFzcy5mb3JOYW1lCisgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlZlcnNpb24iKS5nZXRGaWVsZCgiZlZlcnNpb24iKS4KKyAgICAgICAgICAgICAgICBnZXQobnVsbCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gWGVyY2VzIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUKKyAgICAgICAgICAgIF9zY2hlbWFCdWcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG1hcCBvZiBjbGFzc2xvYWRlcnMgdG8gc2V0cyBvZiBwYXJzZWQgbG9jYXRpb25zLCBzbyB0aGF0IHdlIGRvbid0IHBhcnNlCisgICAgLy8gdGhlIHNhbWUgcmVzb3VyY2UgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGNsYXNzCisgICAgcHJpdmF0ZSBNYXAgX3BhcnNlZCA9IG51bGw7CisKKyAgICBwcml2YXRlIExvZyBfbG9nID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3ZhbGlkYXRpbmcgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3lzdGVtSWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2FjaGluZyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9wYXJzZVRleHQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfcGFyc2VDb21tZW50cyA9IHRydWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3N1ZmZpeCA9IG51bGw7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfbG9hZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIF9jdXJMb2FkZXIgPSBudWxsOworCisgICAgLy8gc3RhdGUgZm9yIGN1cnJlbnQgcGFyc2UKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gX2N1clJlc3VsdHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIHByaXZhdGUgTGlzdCBfcmVzdWx0cyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NvdXJjZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSBfc291cmNlRmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX3RleHQgPSBudWxsOworICAgIHByaXZhdGUgTGlzdCBfY29tbWVudHMgPSBudWxsOworICAgIHByaXZhdGUgTG9jYXRpb24gX2xvY2F0aW9uID0gbmV3IExvY2F0aW9uKCk7CisgICAgcHJpdmF0ZSBMZXhpY2FsSGFuZGxlciBfbGggPSBudWxsOworICAgIHByaXZhdGUgaW50IF9kZXB0aCA9IC0xOworICAgIHByaXZhdGUgaW50IF9pZ25vcmUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcGFyc2UgZWxlbWVudCB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFBhcnNlVGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZVRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBwYXJzZSBlbGVtZW50IHRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyc2VUZXh0KGJvb2xlYW4gdGV4dCkgeworICAgICAgICBfcGFyc2VUZXh0ID0gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBhcnNlIGVsZW1lbnQgY29tbWVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UGFyc2VDb21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZUNvbW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcGFyc2UgZWxlbWVudCBjb21tZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbW1lbnRzKGJvb2xlYW4gY29tbWVudHMpIHsKKyAgICAgICAgX3BhcnNlQ29tbWVudHMgPSBjb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgWE1MIGRvY3VtZW50IGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9sb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGV4aWNhbCBoYW5kbGVyIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgU0FYIHBhcnNlciB1c2VkCisgICAgICogYnkgdGhpcyBjbGFzcy4gU2luY2UgdGhlIDxjb2RlPm9yZy54bWwuc2F4LmV4dDwvY29kZT4gcGFja2FnZSBpcyBub3QKKyAgICAgKiBhIHJlcXVpcmVkIHBhcnQgb2YgU0FYMiwgdGhpcyBoYW5kbGVyIG1pZ2h0IG5vdCBiZSB1c2VkIGJ5IHRoZSBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gX2xoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsZXhpY2FsIGhhbmRsZXIgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBTQVggcGFyc2VyIHVzZWQKKyAgICAgKiBieSB0aGlzIGNsYXNzLiBTaW5jZSB0aGUgPGNvZGU+b3JnLnhtbC5zYXguZXh0PC9jb2RlPiBwYWNrYWdlIGlzIG5vdAorICAgICAqIGEgcmVxdWlyZWQgcGFydCBvZiBTQVgyLCB0aGlzIGhhbmRsZXIgbWlnaHQgbm90IGJlIHVzZWQgYnkgdGhlIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZXhpY2FsSGFuZGxlcihMZXhpY2FsSGFuZGxlciBsaCkgeworICAgICAgICBfbGggPSBsaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgWE1MIGRvY3VtZW50IGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIF9sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIHRoZSBzb3VyY2UgbmFtZSBhcyB0aGUgWE1MIHN5c3RlbSBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTb3VyY2VJc1N5c3RlbUlkKCkgeworICAgICAgICByZXR1cm4gX3N5c3RlbUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIHRoZSBzb3VyY2UgbmFtZSBhcyB0aGUgWE1MIHN5c3RlbSBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VJc1N5c3RlbUlkKGJvb2xlYW4gc3lzdGVtSWQpIHsKKyAgICAgICAgX3N5c3RlbUlkID0gc3lzdGVtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGlzIGEgdmFsaWRhdGluZyBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgeworICAgICAgICByZXR1cm4gX3ZhbGlkYXRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGlzIGEgdmFsaWRhdGluZyBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIHZhbGlkYXRpbmcpIHsKKyAgICAgICAgX3ZhbGlkYXRpbmcgPSB2YWxpZGF0aW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdGVkIHN1ZmZpeCBmb3IgbWV0YWRhdGEgcmVzb3VyY2VzLCBvciBudWxsIGlmIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7CisgICAgICAgIHJldHVybiBfc3VmZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdGVkIHN1ZmZpeCBmb3IgbWV0YWRhdGEgcmVzb3VyY2VzLCBvciBudWxsIGlmIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKyAgICAgICAgX3N1ZmZpeCA9IHN1ZmZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHBhcnNlZCByZXNvdXJjZSBuYW1lcyBhcmUgY2FjaGVkIHRvIGF2b2lkIGR1cGxpY2F0ZSBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGluZygpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgcGFyc2VkIHJlc291cmNlIG5hbWVzIGFyZSBjYWNoZWQgdG8gYXZvaWQgZHVwbGljYXRlIHBhcnNpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGluZyhib29sZWFuIGNhY2hpbmcpIHsKKyAgICAgICAgX2NhY2hpbmcgPSBjYWNoaW5nOworICAgICAgICBpZiAoIWNhY2hpbmcpCisgICAgICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIExvZyBnZXRMb2coKSB7CisgICAgICAgIHJldHVybiBfbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9nKExvZyBsb2cpIHsKKyAgICAgICAgX2xvZyA9IGxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzc2xvYWRlciB0byB1c2UgZm9yIGNsYXNzIG5hbWUgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzbG9hZGVyIHRvIHVzZSBmb3IgY2xhc3MgbmFtZSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBfbG9hZGVyID0gbG9hZGVyOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFJlc3VsdHMoKSB7CisgICAgICAgIGlmIChfcmVzdWx0cyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIHJldHVybiBfcmVzdWx0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgcnNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJzcmMgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhcnNlKG5ldyBSZXNvdXJjZU1ldGFEYXRhSXRlcmF0b3IocnNyYywgX2xvYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhcnNlKG5ldyBVUkxNZXRhRGF0YUl0ZXJhdG9yKHVybCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICBwYXJzZShuZXcgRmlsZU1ldGFEYXRhSXRlcmF0b3IoZmlsZSkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBzdWZmID0gKF9zdWZmaXggPT0gbnVsbCkgPyAiIiA6IF9zdWZmaXg7CisgICAgICAgICAgICBwYXJzZShuZXcgRmlsZU1ldGFEYXRhSXRlcmF0b3IoZmlsZSwKKyAgICAgICAgICAgICAgICBuZXcgU3VmZml4TWV0YURhdGFGaWx0ZXIoc3VmZikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKENsYXNzIGNscywgYm9vbGVhbiB0b3BEb3duKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc3VmZiA9IChfc3VmZml4ID09IG51bGwpID8gIiIgOiBfc3VmZml4OworICAgICAgICBwYXJzZShuZXcgQ2xhc3NNZXRhRGF0YUl0ZXJhdG9yKGNscywgc3VmZiwgdG9wRG93biksICF0b3BEb3duKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShSZWFkZXIgeG1sLCBTdHJpbmcgc291cmNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHhtbCAhPSBudWxsICYmIChzb3VyY2VOYW1lID09IG51bGwgfHwgIXBhcnNlZChzb3VyY2VOYW1lKSkpCisgICAgICAgICAgICBwYXJzZU5ld1Jlc291cmNlKHhtbCwgc291cmNlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFyc2UoTWV0YURhdGFJdGVyYXRvciBpdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKGl0ciwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSByZXNvdXJjZXMgcmV0dXJuZWQgYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLCBvcHRpb25hbGx5IHN0b3BwaW5nCisgICAgICogd2hlbiB0aGUgZmlyc3QgdmFsaWQgcmVzb3VyY2UgaXMgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKE1ldGFEYXRhSXRlcmF0b3IgaXRyLCBib29sZWFuIHN0b3BGaXJzdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGl0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHNvdXJjZU5hbWU7CisgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHNvdXJjZU5hbWUgPSBpdHIubmV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZChzb3VyY2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcEZpcnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGluZGl2aWR1YWwgZmlsZXMgb2YgdGhlIHJlc291cmNlIG1pZ2h0IGFscmVhZHkgYmUgcGFyc2VkCisgICAgICAgICAgICAgICAgX3NvdXJjZUZpbGUgPSBpdHIuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgIHBhcnNlTmV3UmVzb3VyY2UobmV3IElucHV0U3RyZWFtUmVhZGVyKGl0ci5nZXRJbnB1dFN0cmVhbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0b3BGaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBpdHIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgcHJldmlvdXNseS11bnNlZW4gc291cmNlLiBBbGwgcGFyc2luZyBtZXRob2RzIGRlbGVnYXRlCisgICAgICogdG8gdGhpcyBvbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VOZXdSZXNvdXJjZShSZWFkZXIgeG1sLCBTdHJpbmcgc291cmNlTmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9sb2cgIT0gbnVsbCAmJiBfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJzdGFydC1wYXJzZSIsIHNvdXJjZU5hbWUpKTsKKworICAgICAgICAvLyBldmVuIGlmIHdlIHdhbnQgdG8gdmFsaWRhdGUsIHNwZWNpZnkgdGhhdCBpdCB3b24ndCBoYXBwZW4KKyAgICAgICAgLy8gaWYgd2UgaGF2ZSBuZWl0aGVyIGEgRG9jVHlwZSBub3QgYSBTY2hlbWEKKyAgICAgICAgT2JqZWN0IHNjaGVtYVNvdXJjZSA9IGdldFNjaGVtYVNvdXJjZSgpOworICAgICAgICBpZiAoc2NoZW1hU291cmNlICE9IG51bGwgJiYgX3NjaGVtYUJ1ZykgeworICAgICAgICAgICAgaWYgKF9sb2cgIT0gbnVsbCAmJiBfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGFyc2VyLXNjaGVtYS1idWciKSk7CisgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gdmFsaWRhdGluZyA9IF92YWxpZGF0aW5nICYmIChnZXREb2NUeXBlKCkgIT0gbnVsbCAKKyAgICAgICAgICAgIHx8IHNjaGVtYVNvdXJjZSAhPSBudWxsKTsKKworICAgICAgICAvLyBwYXJzZSB0aGUgbWV0YWRhdGEgd2l0aCBhIFNBWCBwYXJzZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zb3VyY2VOYW1lID0gc291cmNlTmFtZTsKKyAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBYTUxGYWN0b3J5LmdldFNBWFBhcnNlcih2YWxpZGF0aW5nLCB0cnVlKTsKKyAgICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBudWxsOworICAgICAgICAgICAgaWYgKHZhbGlkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBzY2hlbWEgPSBzY2hlbWFTb3VyY2U7CisgICAgICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsICYmIGdldERvY1R5cGUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB4bWwgPSBuZXcgRG9jVHlwZVJlYWRlcih4bWwsIGdldERvY1R5cGUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfcGFyc2VDb21tZW50cyB8fCBfbGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgKCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0aGlzKTsKKworICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyc2VyLnNldFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL3NjaGVtYUxhbmd1YWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOworICAgICAgICAgICAgICAgIHBhcnNlci5zZXRQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheHAvcHJvcGVydGllcy9zY2hlbWFTb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoeG1sKTsKKyAgICAgICAgICAgIGlmIChfc3lzdGVtSWQgJiYgc291cmNlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKHNvdXJjZU5hbWUpOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlzLCB0aGlzKTsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihzZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIEphdmFWZXJzaW9ucy5pbml0Q2F1c2UoaW9lLCBzZSk7CisgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNvdXJjZSBpcyBwYXJzZWQuIE90aGVyd2lzZSwgcmVjb3JkIHRoYXQKKyAgICAgKiBpdCB3aWxsIGJlIHBhcnNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZWQoU3RyaW5nIHNyYykgeworICAgICAgICBpZiAoIV9jYWNoaW5nKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX3BhcnNlZCA9PSBudWxsKQorICAgICAgICAgICAgX3BhcnNlZCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY3VycmVudENsYXNzTG9hZGVyKCk7CisgICAgICAgIFNldCBzZXQgPSAoU2V0KSBfcGFyc2VkLmdldChsb2FkZXIpOworICAgICAgICBpZiAoc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBfcGFyc2VkLnB1dChsb2FkZXIsIHNldCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBhZGRlZCA9IHNldC5hZGQoc3JjKTsKKyAgICAgICAgaWYgKCFhZGRlZCAmJiBfbG9nICE9IG51bGwgJiYgX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiYWxyZWFkeS1wYXJzZWQiLCBzcmMpKTsKKyAgICAgICAgcmV0dXJuICFhZGRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgaWYgKF9sb2cgIT0gbnVsbCAmJiBfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJjbGVhci1wYXJzZXIiLCB0aGlzKSk7CisgICAgICAgIGlmIChfcGFyc2VkICE9IG51bGwpCisgICAgICAgICAgICBfcGFyc2VkLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc2UpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB0aHJvdyBnZXRFeGNlcHRpb24oc2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGdldEV4Y2VwdGlvbihzZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIF9sb2NhdGlvbi5zZXRMb2NhdG9yKGxvY2F0b3IpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFOYW1lLAorICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgX2RlcHRoKys7CisgICAgICAgIGlmIChfZGVwdGggPD0gX2lnbm9yZSkKKyAgICAgICAgICAgIGlmICghc3RhcnRFbGVtZW50KHFOYW1lLCBhdHRycykpCisgICAgICAgICAgICAgICAgaWdub3JlQ29udGVudCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcU5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoX2RlcHRoIDwgX2lnbm9yZSkKKyAgICAgICAgICAgIGVuZEVsZW1lbnQocU5hbWUpOworICAgICAgICBfdGV4dCA9IG51bGw7CisgICAgICAgIGlmIChfY29tbWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9jb21tZW50cy5jbGVhcigpOworICAgICAgICBpZiAoX2RlcHRoID09IF9pZ25vcmUpCisgICAgICAgICAgICBfaWdub3JlID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIF9kZXB0aC0tOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKF9wYXJzZVRleHQgJiYgX2RlcHRoIDw9IF9pZ25vcmUpIHsKKyAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF90ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgX3RleHQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoX3BhcnNlQ29tbWVudHMgJiYgX2RlcHRoIDw9IF9pZ25vcmUpIHsKKyAgICAgICAgICAgIGlmIChfY29tbWVudHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY29tbWVudHMgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgICAgICAgICAgX2NvbW1lbnRzLmFkZChTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOworICAgICAgICB9CisgICAgICAgIGlmIChfbGggIT0gbnVsbCkKKyAgICAgICAgICAgIF9saC5jb21tZW50KGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbGggIT0gbnVsbCkKKyAgICAgICAgICAgIF9saC5zdGFydENEQVRBKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9saCAhPSBudWxsKQorICAgICAgICAgICAgX2xoLmVuZENEQVRBKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9saCAhPSBudWxsKQorICAgICAgICAgICAgX2xoLnN0YXJ0RFREKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbGggIT0gbnVsbCkKKyAgICAgICAgICAgIF9saC5lbmREVEQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbGggIT0gbnVsbCkKKyAgICAgICAgICAgIF9saC5zdGFydEVudGl0eShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoX2xoICE9IG51bGwpCisgICAgICAgICAgICBfbGguZW5kRW50aXR5KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIHNvbWUgZWxlbWVudC4gSWYgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIGZhbHNlLCB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgdGhlIGVuZCBlbGVtZW50IGV2ZW50IHdpbGwKKyAgICAgKiBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG1hcmtpbmcgdGhlIGVuZCBvZiBzb21lIGVsZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHJlc3VsdCB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBjdXJyZW50IHBhcnNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFJlc3VsdChPYmplY3QgcmVzdWx0KSB7CisgICAgICAgIGlmIChfbG9nICE9IG51bGwgJiYgX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgiYWRkLXJlc3VsdCIsIHJlc3VsdCkpOworICAgICAgICBfY3VyUmVzdWx0cy5hZGQocmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaW5pc2ggdXAgYWZ0ZXIgYSBwYXJzZTsgdGhpcyBpcyBvbmx5CisgICAgICogY2FsbGVkIGlmIG5vIGVycm9ycyBhcmUgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuIFN1YmNsYXNzZXMgc2hvdWxkCisgICAgICogY2FsbCA8Y29kZT5zdXBlci5maW5pc2goKTwvY29kZT4gdG8gcmVzb2x2ZSBzdXBlcmNsYXNzIHN0YXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgaWYgKF9sb2cgIT0gbnVsbCAmJiBfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJlbmQtcGFyc2UiLCBnZXRTb3VyY2VOYW1lKCkpKTsKKyAgICAgICAgX3Jlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KF9jdXJSZXN1bHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjbGVhciBhbnkgc3RhdGUgYW5kIHJlYWR5IHRoZSBwYXJzZXIgZm9yCisgICAgICogYSBuZXcgZG9jdW1lbnQuIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwKKyAgICAgKiA8Y29kZT5zdXBlci5yZXNldCgpPC9jb2RlPiB0byBjbGVhciBzdXBlcmNsYXNzIHN0YXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICAgICAgICBfY3VyUmVzdWx0cy5jbGVhcigpOworICAgICAgICBfY3VyTG9hZGVyID0gbnVsbDsKKyAgICAgICAgX3NvdXJjZU5hbWUgPSBudWxsOworICAgICAgICBfc291cmNlRmlsZSA9IG51bGw7CisgICAgICAgIF9kZXB0aCA9IC0xOworICAgICAgICBfaWdub3JlID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIGlmIChfY29tbWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9jb21tZW50cy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0byByZXR1cm4gdGhlIFhNTCBzY2hlbWEgc291cmNlIGZvciB0aGUgZG9jdW1lbnQuIFJldHVybnMKKyAgICAgKiBudWxsIGJ5IGRlZmF1bHQuIE1heSByZXR1cm46CisgICAgICogPHVsPgorICAgICAqIDxsaT48Y29kZT5TdHJpbmc8L2NvZGU+IHBvaW50aW5nIHRvIHNjaGVtYSBVUkkuPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGNvbnRhaW5pbmcgc2NoZW1hIGNvbnRlbnRzLjwvbGk+CisgICAgICogPGxpPjxjb2RlPklucHV0U291cmNlPC9jb2RlPiBjb250YWluaW5nIHNjaGVtYSBjb250ZW50cy48L2xpPgorICAgICAqIDxsaT48Y29kZT5GaWxlPC9jb2RlPiBjb250YWluaW5nIHNjaGVtYSBjb250ZW50cy48L2xpPgorICAgICAqIDxsaT5BcnJheSBvZiBhbnkgb2YgdGhlIGFib3ZlIGVsZW1lbnRzLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNjaGVtYVNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbnkgPGNvZGU+RE9DVFlQRTwvY29kZT4gZGVjbGFyYXRpb24KKyAgICAgKiB0aGF0IHNob3VsZCBiZSBkeW5hbWljYWxseSBpbmNsdWRlZCBpbiB4bWwgZG9jdW1lbnRzIHRoYXQgd2lsbCBiZQorICAgICAqIHZhbGlkYXRlZC4gUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlYWRlciBnZXREb2NUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBiZWluZyBwYXJzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gX3NvdXJjZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWxlIG9mIHRoZSBzb3VyY2UgYmVpbmcgcGFyc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldFNvdXJjZUZpbGUoKSB7CisgICAgICAgIHJldHVybiBfc291cmNlRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgY3VycmVudCBjb21tZW50cyB0byB0aGUgZ2l2ZW4gZW50aXR5LiBCeSBkZWZhdWx0LCBhc3N1bWVzIGVudGl0eQorICAgICAqIGlzIHtAbGluayBDb21tZW50YWJsZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudHMoT2JqZWN0IG9iaikgeworICAgICAgICBTdHJpbmdbXSBjb21tZW50cyA9IGN1cnJlbnRDb21tZW50cygpOworICAgICAgICBpZiAoY29tbWVudHMubGVuZ3RoID4gMCAmJiBvYmogaW5zdGFuY2VvZiBDb21tZW50YWJsZSkKKyAgICAgICAgICAgICgoQ29tbWVudGFibGUpIG9iaikuc2V0Q29tbWVudHMoY29tbWVudHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFycmF5IG9mIGNvbW1lbnRzIGZvciB0aGUgY3VycmVudCBub2RlLCBvciBlbXB0eSBhcnJheSBpZiBub25lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjdXJyZW50Q29tbWVudHMoKSB7CisgICAgICAgIGlmIChfY29tbWVudHMgPT0gbnVsbCB8fCBfY29tbWVudHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIENvbW1lbnRhYmxlLkVNUFRZX0NPTU1FTlRTOworICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBfY29tbWVudHMudG9BcnJheShuZXcgU3RyaW5nW19jb21tZW50cy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRleHQgdmFsdWUgd2l0aGluIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50VGV4dCgpIHsKKyAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiBfdGV4dC50b1N0cmluZygpLnRyaW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbG9jYXRpb24gd2l0aGluIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICIgWyIgKyBfbG9jLmdldCgibG9jLXByZWZpeCIpICsgX2xvY2F0aW9uLmdldExvY2F0aW9uKCkgKyAiXSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJzZSBkZXB0aC4gV2l0aGluIHRoZSByb290IGVsZW1lbnQsIHRoZSBkZXB0aCBpcyAwLAorICAgICAqIHdpdGhpbiB0aGUgZmlyc3QgbmVzdGVkIGVsZW1lbnQsIGl0IGlzIDEsIGFuZCBzbyBmb3J0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGN1cnJlbnREZXB0aCgpIHsKKyAgICAgICAgcmV0dXJuIF9kZXB0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGxvYWRlciB0byB1c2Ugd2hlbiByZXNvbHZpbmcgcmVzb3VyY2VzIGFuZCBsb2FkaW5nCisgICAgICogY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY3VycmVudENsYXNzTG9hZGVyKCkgeworICAgICAgICBpZiAoX2xvYWRlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9sb2FkZXI7CisgICAgICAgIGlmIChfY3VyTG9hZGVyID09IG51bGwpCisgICAgICAgICAgICBfY3VyTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgcmV0dXJuIF9jdXJMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JlIGFsbCBjb250ZW50IGJlbG93IHRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWdub3JlRW5kIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBlbmQgZWxlbWVudCBldmVudAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGlnbm9yZUNvbnRlbnQoYm9vbGVhbiBpZ25vcmVFbmQpIHsKKyAgICAgICAgX2lnbm9yZSA9IF9kZXB0aDsKKyAgICAgICAgaWYgKCFpZ25vcmVFbmQpCisgICAgICAgICAgICBfaWdub3JlKys7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFNBWEV4Y2VwdGlvbiB3aXRoIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGFuZCB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTQVhFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTQVhFeGNlcHRpb24oZ2V0U291cmNlTmFtZSgpICsgY3VycmVudExvY2F0aW9uKCkgKworICAgICAgICAgICAgIjogIiArIG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFNBWEV4Y2VwdGlvbiB3aXRoIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGFuZCB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTQVhFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHJldHVybiBuZXcgU0FYRXhjZXB0aW9uKGdldFNvdXJjZU5hbWUoKSArIGN1cnJlbnRMb2NhdGlvbigpICsKKyAgICAgICAgICAgICI6ICIgKyBtc2cuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU0FYRXhjZXB0aW9uIHdpdGggdGhlIHNvdXJjZSBmaWxlIG5hbWUgYW5kIHRoZSBnaXZlbiBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNBWEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oTWVzc2FnZSBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCAmJiBfbG9nICE9IG51bGwgJiYgX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgic2F4LWV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgZ2V0U291cmNlTmFtZSgpLCBfbG9jYXRpb24uZ2V0TG9jYXRpb24oKSksIGNhdXNlKTsKKyAgICAgICAgU0FYRXhjZXB0aW9uIGUgPSBuZXcgU0FYRXhjZXB0aW9uKGdldFNvdXJjZU5hbWUoKSArIGN1cnJlbnRMb2NhdGlvbigpICsKKyAgICAgICAgICAgICI6ICIgKyBtc2cgKyAiIFsiICsgY2F1c2UgKyAiXSIpOworICAgICAgICBlLmluaXRDYXVzZShjYXVzZSk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWE1MTWV0YURhdGFTZXJpYWxpemVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1hNTE1ldGFEYXRhU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGM2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL1hNTE1ldGFEYXRhU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuRmlsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbC5Db21tZW50YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbC5YTUxXcml0ZXI7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSB0eXBlIGZvciBzZXJsaWFsaXplcnMgdGhhdCB0cmFuc2ZlciBncm91cHMgb2Ygb2JqZWN0cworICogdG8gWE1MLiBJbmNsdWRlcyBhIHdheSBvZiBzZXJpYWxpemluZyBvYmplY3RzIGJhY2sgdG8gdGhlIFhNTCBmaWxlcworICogdGhleSB3ZXJlIHBhcnNlZCBmcm9tLiBTZXJpYWxpemVycyBhcmUgbm90IHRocmVhZCBzYWZlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxNZXRhRGF0YVNlcmlhbGl6ZXIgaW1wbGVtZW50cyBNZXRhRGF0YVNlcmlhbGl6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoWE1MTWV0YURhdGFTZXJpYWxpemVyLmNsYXNzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgX2ZhY3RvcnkgPQorICAgICAgICAoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgIHByaXZhdGUgTG9nIF9sb2cgPSBudWxsOworCisgICAgLy8gY3VycmVudCBzZXJpYWxpemF0aW9uIHN0YXRlCisgICAgcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzSW1wbCBfYXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIF9oYW5kbGVyID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfZmxhZ3MgPSAwOworICAgIHByaXZhdGUgRmlsZSBfYmFja3VwID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIExvZyBnZXRMb2coKSB7CisgICAgICAgIHJldHVybiBfbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9nKExvZyBsb2cpIHsKKyAgICAgICAgX2xvZyA9IGxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXJpYWxpemUoKE1hcCkgbnVsbCwgZmxhZ3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNYXAgb3V0cHV0LCBpbnQgZmxhZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1hcCBmaWxlcyA9IGdldEZpbGVNYXAoKTsKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gZm9yIGVhY2ggZmlsZSwgc2VyaWFsaXplIG9iamVjdHMKKyAgICAgICAgTWFwLkVudHJ5IGVudHJ5OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGZpbGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IChGaWxlKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gZmlsZU9ianMgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgaWYgKF9sb2cgIT0gbnVsbCAmJiBfbG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLmluZm8oX2xvYy5nZXQoInNlci1maWxlIiwgZmlsZSkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVySGFuZGxlciB0cmFucyA9IF9mYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcigpOworICAgICAgICAgICAgICAgIFdyaXRlciB3cml0ZXI7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIF9iYWNrdXAgPSBwcmVwYXJlV3JpdGUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICAgICAgICAgICAgICBXcml0ZXIgeG1sID0gd3JpdGVyOworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQUkVUVFkpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeG1sID0gbmV3IFhNTFdyaXRlcih3cml0ZXIpOworICAgICAgICAgICAgICAgIHRyYW5zLnNldFJlc3VsdChuZXcgU3RyZWFtUmVzdWx0KHhtbCkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShmaWxlT2JqcywgdHJhbnMsIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dChmaWxlLCAoKFN0cmluZ1dyaXRlcikgd3JpdGVyKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihzZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24odGNlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZmlsZS4gQmFjayB1cCB0aGUgZmlsZSBhbmQgbWFrZSBzdXJlIHRoZQorICAgICAqIHBhdGggdG8gaXQgaXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBwcmVwYXJlV3JpdGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGJhY2t1cCA9IEZpbGVzLmJhY2t1cChmaWxlLCBmYWxzZSk7CisgICAgICAgIGlmIChiYWNrdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKQorICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFja3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgTWFwfSB3aXRoIGtleXMgb2YgdGhlIHtAbGluayBGaWxlfSB0byBiZQorICAgICAqIHdyaXR0ZW4gdG8sIGFuZCB2YWx1ZXMgb2YgYSB7QGxpbmsgQ29sbGVjdGlvbn0gb2YKKyAgICAgKiB7QGxpbmsgU291cmNlVHJhY2tlcn0gaW5zdGFuY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgZ2V0RmlsZU1hcCgpIHsKKyAgICAgICAgQ29sbGVjdGlvbiBvYmpzID0gZ2V0T2JqZWN0cygpOworICAgICAgICBpZiAob2JqcyA9PSBudWxsIHx8IG9ianMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgbWFwIG9mIGZpbGVzIHRvIGxpc3RzIG9mIG9iamVjdHMKKyAgICAgICAgTWFwIGZpbGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgRmlsZSBmaWxlOworICAgICAgICBDb2xsZWN0aW9uIGZpbGVPYmpzOworICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG9ianMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIG9iaiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICBmaWxlID0gZ2V0U291cmNlRmlsZShvYmopOworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChfbG9nICE9IG51bGwgJiYgX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJuby1maWxlIiwgb2JqKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbGVPYmpzID0gKENvbGxlY3Rpb24pIGZpbGVzLmdldChmaWxlKTsKKyAgICAgICAgICAgIGlmIChmaWxlT2JqcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsZU9ianMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgICAgIGZpbGVzLnB1dChmaWxlLCBmaWxlT2Jqcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlT2Jqcy5hZGQob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBmaWxlIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuIEJ5IGRlZmF1bHQsIGNoZWNrcworICAgICAqIHRvIHNlZSBpZiB0aGUgaW5zdGFuY2UgaW1wbGVtZW50cyB7QGxpbmsgU291cmNlVHJhY2tlcn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRmlsZShPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTb3VyY2VUcmFja2VyKQorICAgICAgICAgICAgcmV0dXJuICgoU291cmNlVHJhY2tlcikgb2JqKS5nZXRTb3VyY2VGaWxlKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShGaWxlIGZpbGUsIGludCBmbGFncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9sb2cgIT0gbnVsbCkKKyAgICAgICAgICAgIF9sb2cuaW5mbyhfbG9jLmdldCgic2VyLWZpbGUiLCBmaWxlKSk7CisKKyAgICAgICAgX2JhY2t1cCA9IHByZXBhcmVXcml0ZShmaWxlKTsKKyAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlLmdldENhbm9uaWNhbFBhdGgoKSwKKyAgICAgICAgICAgIChmbGFncyAmIEFQUEVORCkgPiAwKTsKKyAgICAgICAgc2VyaWFsaXplKG91dCwgZmxhZ3MpOworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIG91dCwgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKChmbGFncyAmIFBSRVRUWSkgPiAwKQorICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShuZXcgU3RyZWFtUmVzdWx0KG5ldyBYTUxXcml0ZXIob3V0KSksIGZsYWdzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXJpYWxpemUobmV3IFN0cmVhbVJlc3VsdChvdXQpLCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHRoZSBjdXJyZW50IHNldCBvZiBvYmplY3RzIHRvIHRoZSBnaXZlbiByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFJlc3VsdCByZXN1bHQsIGludCBmbGFncykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFuc2Zvcm1lckhhbmRsZXIgdHJhbnMgPSBfZmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIoKTsKKyAgICAgICAgICAgIHRyYW5zLnNldFJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgc2VyaWFsaXplKHRyYW5zLCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB0Y2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24odGNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlsaXplIHRoZSBjdXJyZW50IHNldCBvZiBvYmplY3RzIHRvIGEgc2VyaWVzIG9mIFNBWCBldmVudHMgb24gdGhlCisgICAgICogZ2l2ZW4gaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgaW50IGZsYWdzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc2VyaWFsaXplKGdldE9iamVjdHMoKSwgaGFuZGxlciwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIHRoZSBnaXZlbiBoYW5kbGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoQ29sbGVjdGlvbiBvYmpzLCBDb250ZW50SGFuZGxlciBoYW5kbGVyLCBpbnQgZmxhZ3MpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoX2xvZyAhPSBudWxsICYmIF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIF9sb2cudHJhY2UoX2xvYy5nZXQoInNlci1vYmpzIiwgb2JqcykpOworCisgICAgICAgIF9oYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgX2ZsYWdzID0gZmxhZ3M7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIW9ianMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlci5zdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplKG9ianMpOworICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgc2VyaWFsaXphdGlvbiBpcyBpbiB2ZXJib3NlIG1vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gKF9mbGFncyAmIFZFUkJPU0UpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFja3VwIGZpbGUgbWFkZSBmb3IgdGhlIGN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY3VycmVudEJhY2t1cEZpbGUoKSB7CisgICAgICAgIHJldHVybiBfYmFja3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGVsZW1lbnQgd2l0aCB0aGUgY3VycmVudCBhdHRyaWJ1dGUgc2V0dGluZ3MuIENsZWFycyB0aGUKKyAgICAgKiBhdHRyaWJ1dGVzIGFzIHdlbGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgX2hhbmRsZXIuc3RhcnRFbGVtZW50KCIiLCBuYW1lLCBuYW1lLCBfYXR0cnMpOworICAgICAgICBfYXR0cnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgX2hhbmRsZXIuZW5kRWxlbWVudCgiIiwgbmFtZSwgbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRleHQgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgX2hhbmRsZXIuY2hhcmFjdGVycyh0ZXh0LnRvQ2hhckFycmF5KCksIDAsIHRleHQubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgZ3JvdXAuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgX2F0dHJzLmFkZEF0dHJpYnV0ZSgiIiwgbmFtZSwgbmFtZSwgIkNEQVRBIiwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIF9hdHRyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb21tZW50IHRvIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudHMoU3RyaW5nW10gY29tbWVudHMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoY29tbWVudHMgPT0gbnVsbCB8fCBjb21tZW50cy5sZW5ndGggPT0gMAorICAgICAgICAgICAgfHwgIShfaGFuZGxlciBpbnN0YW5jZW9mIExleGljYWxIYW5kbGVyKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBMZXhpY2FsSGFuZGxlciBsaCA9IChMZXhpY2FsSGFuZGxlcikgX2hhbmRsZXI7CisgICAgICAgIGNoYXJbXSBjaGFyczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2hhcnMgPSBjb21tZW50c1tpXS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgbGguY29tbWVudChjaGFycywgMCwgY2hhcnMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBnaXZlbiBlbnRpdHkncyBjb21tZW50cy4gQnkgZGVmYXVsdCwgdGVzdHMgaWYgZW50aXR5IGlzCisgICAgICoge0BsaW5rIENvbW1lbnRhYmxlfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50cyhPYmplY3Qgb2JqKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbW1lbnRhYmxlKQorICAgICAgICAgICAgYWRkQ29tbWVudHMoKChDb21tZW50YWJsZSkgb2JqKS5nZXRDb21tZW50cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCBzZXJpYWxpemF0aW9uIHN0YXRlIGZvciB0aGUgbmV4dCBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgX2F0dHJzLmNsZWFyKCk7CisgICAgICAgIF9oYW5kbGVyID0gbnVsbDsKKyAgICAgICAgX2ZsYWdzID0gMDsKKyAgICAgICAgX2JhY2t1cCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHRoZSBnaXZlbiBzZXQgb2Ygb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemUoQ29sbGVjdGlvbiBvYmpzKSB0aHJvd3MgU0FYRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHNldCBvZiBvYmplY3RzIGZvciBzZXJpYWxpemF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb2xsZWN0aW9uIGdldE9iamVjdHMoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWmlwRmlsZU1ldGFEYXRhSXRlcmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWmlwRmlsZU1ldGFEYXRhSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRiOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9aaXBGaWxlTWV0YURhdGFJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCisvKioKKyAqIEl0ZXJhdG9yIG92ZXIgYWxsIG1ldGFkYXRhIHJlc291cmNlcyBpbiBhIGdpdmVuIHppcCBmaWxlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBaaXBGaWxlTWV0YURhdGFJdGVyYXRvcgorICAgIGltcGxlbWVudHMgTWV0YURhdGFJdGVyYXRvciwgTWV0YURhdGFGaWx0ZXIuUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBaaXBGaWxlIF9maWxlOworICAgIHByaXZhdGUgZmluYWwgTWV0YURhdGFGaWx0ZXIgX2ZpbHRlcjsKKyAgICBwcml2YXRlIGZpbmFsIEVudW1lcmF0aW9uIF9lbnRyaWVzOworICAgIHByaXZhdGUgWmlwRW50cnkgX2VudHJ5ID0gbnVsbDsKKyAgICBwcml2YXRlIFppcEVudHJ5IF9sYXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgemlwL2phciBVUkwgYW5kIG9wdGlvbmFsIGZpbGUgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyBaaXBGaWxlTWV0YURhdGFJdGVyYXRvcihVUkwgdXJsLCBNZXRhRGF0YUZpbHRlciBmaWx0ZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgX2ZpbGUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbi5zZXREZWZhdWx0VXNlQ2FjaGVzKGZhbHNlKTsKKyAgICAgICAgICAgIF9maWxlID0gKFppcEZpbGUpIGNvbi5nZXRDb250ZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgX2ZpbHRlciA9IGZpbHRlcjsKKyAgICAgICAgX2VudHJpZXMgPSAoX2ZpbGUgPT0gbnVsbCkgPyBudWxsIDogX2ZpbGUuZW50cmllcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgemlwIGZpbGUgYW5kIG9wdGlvbmFsIGZpbGUgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyBaaXBGaWxlTWV0YURhdGFJdGVyYXRvcihaaXBGaWxlIGZpbGUsIE1ldGFEYXRhRmlsdGVyIGZpbHRlcikgeworICAgICAgICBfZmlsZSA9IGZpbGU7CisgICAgICAgIF9maWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgIF9lbnRyaWVzID0gKGZpbGUgPT0gbnVsbCkgPyBudWxsIDogZmlsZS5lbnRyaWVzKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZW50cmllcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIHNlYXJjaCBmb3IgbmV4dCBtZXRhZGF0YSBmaWxlCisgICAgICAgIHdoaWxlIChfZW50cnkgPT0gbnVsbCAmJiBfZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgX2VudHJ5ID0gKFppcEVudHJ5KSBfZW50cmllcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKF9maWx0ZXIgIT0gbnVsbCAmJiAhX2ZpbHRlci5tYXRjaGVzKHRoaXMpKQorICAgICAgICAgICAgICAgIF9lbnRyeSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9lbnRyeSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzTmV4dCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgU3RyaW5nIHJldCA9IF9lbnRyeS5nZXROYW1lKCk7CisgICAgICAgIF9sYXN0ID0gX2VudHJ5OworICAgICAgICBfZW50cnkgPSBudWxsOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbGFzdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gX2ZpbGUuZ2V0SW5wdXRTdHJlYW0oX2xhc3QpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIGlmIChfbGFzdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgaWYgKF9maWxlICE9IG51bGwpCisgICAgICAgICAgICAgICBfZmlsZS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE1ldGFEYXRhRmlsdGVyLlJlc291cmNlIGltcGxlbWVudGF0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfZW50cnkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgc2l6ZSA9IF9lbnRyeS5nZXRTaXplKCk7CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBfZmlsZS5nZXRJbnB1dFN0cmVhbShfZW50cnkpOworICAgICAgICBieXRlW10gY29udGVudDsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgIGZvciAoaW50IHI7IChyID0gaW4ucmVhZChidWYpKSAhPSAtMTsgYm91dC53cml0ZShidWYsIDAsIHIpKSA7CisgICAgICAgICAgICBjb250ZW50ID0gYm91dC50b0J5dGVBcnJheSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudCA9IG5ldyBieXRlWyhpbnQpIHNpemVdOworICAgICAgICAgICAgaW4ucmVhZChjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWmlwU3RyZWFtTWV0YURhdGFJdGVyYXRvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9aaXBTdHJlYW1NZXRhRGF0YUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxNTBlZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL21ldGEvWmlwU3RyZWFtTWV0YURhdGFJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKKy8qKgorICogSXRlcmF0b3Igb3ZlciBhbGwgbWV0YWRhdGEgcmVzb3VyY2VzIGluIGEgZ2l2ZW4gemlwIGlucHV0IHN0cmVhbS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgWmlwU3RyZWFtTWV0YURhdGFJdGVyYXRvcgorICAgIGltcGxlbWVudHMgTWV0YURhdGFJdGVyYXRvciwgTWV0YURhdGFGaWx0ZXIuUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBaaXBJbnB1dFN0cmVhbSBfc3RyZWFtOworICAgIHByaXZhdGUgZmluYWwgTWV0YURhdGFGaWx0ZXIgX2ZpbHRlcjsKKyAgICBwcml2YXRlIFppcEVudHJ5IF9lbnRyeSA9IG51bGw7CisgICAgcHJpdmF0ZSBaaXBFbnRyeSBfbGFzdCA9IG51bGw7CisgICAgcHJpdmF0ZSBieXRlW10gX2J1ZiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IHppcCBzdHJlYW0gYW5kIG9wdGlvbmFsIG1ldGFkYXRhIGZpbHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwU3RyZWFtTWV0YURhdGFJdGVyYXRvcihaaXBJbnB1dFN0cmVhbSBzdHJlYW0sCisgICAgICAgIE1ldGFEYXRhRmlsdGVyIGZpbHRlcikgeworICAgICAgICBfc3RyZWFtID0gc3RyZWFtOworICAgICAgICBfZmlsdGVyID0gZmlsdGVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX2VudHJ5ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBjbG9zZSBsYXN0IHJzcmMKKyAgICAgICAgaWYgKF9idWYgPT0gbnVsbCAmJiBfbGFzdCAhPSBudWxsKQorICAgICAgICAgICAgX3N0cmVhbS5jbG9zZUVudHJ5KCk7CisgICAgICAgIF9sYXN0ID0gbnVsbDsKKyAgICAgICAgX2J1ZiA9IG51bGw7CisKKyAgICAgICAgLy8gc2VhcmNoIGZvciBuZXh0IGZpbGUKKyAgICAgICAgWmlwRW50cnkgZW50cnk7CisgICAgICAgIHdoaWxlIChfZW50cnkgPT0gbnVsbCAmJiAoZW50cnkgPSBfc3RyZWFtLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBfZW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIGlmIChfZmlsdGVyICE9IG51bGwgJiYgIV9maWx0ZXIubWF0Y2hlcyh0aGlzKSkgeworICAgICAgICAgICAgICAgIF9lbnRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgX3N0cmVhbS5jbG9zZUVudHJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9lbnRyeSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzTmV4dCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgU3RyaW5nIHJldCA9IF9lbnRyeS5nZXROYW1lKCk7CisgICAgICAgIF9sYXN0ID0gX2VudHJ5OworICAgICAgICBfZW50cnkgPSBudWxsOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgaWYgKF9sYXN0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKF9idWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oX2J1Zik7CisgICAgICAgIHJldHVybiBuZXcgTm9DbG9zZUlucHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gTWV0YURhdGFGaWx0ZXIuUmVzb3VyY2UgaW1wbGVtZW50YXRpb24KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9lbnRyeS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYnVmZmVyIGNvbnRlbnQgc28gdGhhdCBmdXR1cmUgY2FsbHMgdG8gZ2V0SW5wdXRTdHJlYW0gY2FuIHJlYWQKKyAgICAgICAgLy8gdGhlIHNhbWUgZGF0YQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBmb3IgKGludCByOyAociA9IF9zdHJlYW0ucmVhZChidWYpKSAhPSAtMTsgYm91dC53cml0ZShidWYsIDAsIHIpKSA7CisgICAgICAgIF9idWYgPSBib3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIF9zdHJlYW0uY2xvc2VFbnRyeSgpOworICAgICAgICByZXR1cm4gX2J1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb24tY2xvc2luZyBpbnB1dCBzdHJlYW0gdXNlZCB0byBtYWtlIHN1cmUgdGhlIHVuZGVybHlpbmcgemlwCisgICAgICogc3RyZWFtIGlzIG5vdCBjbG9zZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBOb0Nsb3NlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW0uYXZhaWxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW0ucmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW0ucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY1ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxodG1sPgorPGJvZHk+Cis8cD48c3Ryb25nPk1ldGFkYXRhIEZyYW1ld29yazwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgRXh0ZW5kYWJsZSBmcmFtZXdvcmsgZm9yIG1ldGFkYXRhIHBhcnNpbmcgYW5kIHNlcmlhbGl6aW5nLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0Fic3RyYWN0TGlzdEl0ZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvQWJzdHJhY3RMaXN0SXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVhNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0Fic3RyYWN0TGlzdEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIEFic3RyYWN0IHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEFic3RyYWN0TGlzdEl0ZXJhdG9yLmNsYXNzKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oX2xvYy5nZXQoInJlYWQtb25seSIpCisgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKF9sb2MuZ2V0KCJyZWFkLW9ubHkiKQorICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oX2xvYy5nZXQoInJlYWQtb25seSIpCisgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvQWJzdHJhY3ROb25TZXF1ZW50aWFsUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0Fic3RyYWN0Tm9uU2VxdWVudGlhbFJlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJmMzMzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0Fic3RyYWN0Tm9uU2VxdWVudGlhbFJlc3VsdExpc3QuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk9iamVjdFV0aWxzOworCisvKioKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHJhbmRvbS1hY2Nlc3MgcmVzdWx0IGxpc3RzLiBVbmxpa2UgdGhlCisgKiB7QGxpbmsgQWJzdHJhY3RMaXN0fSwgdGhpcyBjbGFzcyBkb2Vzbid0IHJlbHkgb24gdGhlCisgKiB7QGxpbmsgQ29sbGVjdGlvbiNzaXplfSBtZXRob2QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uU2VxdWVudGlhbFJlc3VsdExpc3QKKyAgICBleHRlbmRzIEFic3RyYWN0UmVzdWx0TGlzdCB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBQQVNUX0VORCA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCBhbmQge0BsaW5rICNzaXplfS4gUmV0dXJuIHtAbGluayAjUEFTVF9FTkR9CisgICAgICogaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRJbnRlcm5hbChpbnQgaW5kZXgpOworCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICBmb3IgKGludCBpID0gMDsgdHJ1ZTsgaSsrKSB7CisgICAgICAgICAgICBvYmogPSBnZXRJbnRlcm5hbChpKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gUEFTVF9FTkQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuZXF1YWxzKG8sIG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIGlmICghY29udGFpbnMoaXRyLm5leHQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBPYmplY3Qgb2JqID0gZ2V0SW50ZXJuYWwoaW5kZXgpOworICAgICAgICBpZiAob2JqID09IFBBU1RfRU5EKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICBmb3IgKGludCBpID0gMDsgdHJ1ZTsgaSsrKSB7CisgICAgICAgICAgICBvYmogPSBnZXRJbnRlcm5hbChpKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gUEFTVF9FTkQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuZXF1YWxzKG8sIG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IHRydWU7IGkrKykgeworICAgICAgICAgICAgb2JqID0gZ2V0SW50ZXJuYWwoaSk7CisgICAgICAgICAgICBpZiAob2JqID09IFBBU1RfRU5EKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmVxdWFscyhvLCBvYmopKQorICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwoMCkgPT0gUEFTVF9FTkQ7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoMCk7CisgICAgfQorCisgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0TGlzdEl0ZXJhdG9yKG5ldyBJdHIoaW5kZXgpLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgT2JqZWN0IG9iajsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IHRydWU7IGkrKykgeworICAgICAgICAgICAgb2JqID0gZ2V0SW50ZXJuYWwoaSk7CisgICAgICAgICAgICBpZiAob2JqID09IFBBU1RfRU5EKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbGlzdC5hZGQob2JqKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYSkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBPYmplY3Qgb2JqOworICAgICAgICBmb3IgKGludCBpID0gMDsgdHJ1ZTsgaSsrKSB7CisgICAgICAgICAgICBvYmogPSBnZXRJbnRlcm5hbChpKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gUEFTVF9FTkQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsaXN0LmFkZChvYmopOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoYSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJdHIgZXh0ZW5kcyBBYnN0cmFjdExpc3RJdGVyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2lkeCA9IDA7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IF9uZXh0ID0gUEFTVF9FTkQ7CisKKyAgICAgICAgcHVibGljIEl0cihpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIF9pZHggPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIF9pZHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gX2lkeCAtIDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgX25leHQgPSBnZXRJbnRlcm5hbChfaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBfbmV4dCAhPSBQQVNUX0VORDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIF9pZHggPiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKKyAgICAgICAgICAgIGlmIChfaWR4ID09IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbnRlcm5hbCgtLV9pZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9pZHgrKzsKKyAgICAgICAgICAgIHJldHVybiBfbmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9BYnN0cmFjdFJlc3VsdExpc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9BYnN0cmFjdFJlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2QxZDcyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0Fic3RyYWN0UmVzdWx0TGlzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcmVhZC1vbmx5IHJlc3VsdCBsaXN0cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXN1bHRMaXN0IGltcGxlbWVudHMgUmVzdWx0TGlzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChBYnN0cmFjdFJlc3VsdExpc3QuY2xhc3MpOworCisgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgdGhyb3cgcmVhZE9ubHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHJlYWRPbmx5KCkgeworICAgICAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKF9sb2MuZ2V0KCJyZWFkLW9ubHkiKQorICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7CisgICAgICAgIHRocm93IHJlYWRPbmx5KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICB0aHJvdyByZWFkT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgeworICAgICAgICB0aHJvdyByZWFkT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgeworICAgICAgICB0aHJvdyByZWFkT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICB0aHJvdyByZWFkT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgdGhyb3cgcmVhZE9ubHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIHRocm93IHJlYWRPbmx5KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeworICAgICAgICB0aHJvdyByZWFkT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICB0aHJvdyByZWFkT25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb20sIGludCB0bykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICBjbG9zZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE9wZW4oKSB7CisgICAgICAgIGlmIChpc0Nsb3NlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oX2xvYy5nZXQoImNsb3NlZCIpLmdldE1lc3NhZ2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0Fic3RyYWN0U2VxdWVudGlhbFJlc3VsdExpc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9BYnN0cmFjdFNlcXVlbnRpYWxSZXN1bHRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4Mzg5MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9BYnN0cmFjdFNlcXVlbnRpYWxSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXF1ZW50aWFsTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuT2JqZWN0VXRpbHM7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc2VxdWVudGlhbCByZXN1bHQgbGlzdHMuIFVubGlrZSB0aGUKKyAqIHtAbGluayBBYnN0cmFjdFNlcXVlbnRpYWxMaXN0fSwgdGhpcyBjbGFzcyBkb2Vzbid0IHJlbHkgb24gdGhlCisgKiB7QGxpbmsgQ29sbGVjdGlvbiNzaXplfSBtZXRob2QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VxdWVudGlhbFJlc3VsdExpc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc3VsdExpc3QgeworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIGFuZCB7QGxpbmsgI3NpemV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0SXRlcmF0b3IgaXRyKGludCBpbmRleCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaXRyKDApOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5lcXVhbHMobywgaXRyLm5leHQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGl0ci5uZXh0KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIGl0cihpbmRleCkubmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gaXRyKDApOyBpdHIuaGFzTmV4dCgpOyBpbmRleCsrKQorICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmVxdWFscyhvLCBpdHIubmV4dCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBpdHIoMCk7IGl0ci5oYXNOZXh0KCk7IGkrKykKKyAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5lcXVhbHMobywgaXRyLm5leHQoKSkpCisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gIWl0cigwKS5oYXNOZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoMCk7CisgICAgfQorCisgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0TGlzdEl0ZXJhdG9yKGl0cihpbmRleCksIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGl0cigwKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBsaXN0LmFkZChpdHIubmV4dCgpKTsKKyAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBpdHIoMCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgbGlzdC5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoYSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0VhZ2VyUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0VhZ2VyUmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTZiNDYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvRWFnZXJSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogU2ltcGxlLCBub24tbGF6eSBSZXN1bHRMaXN0IGltcGxlbWVudGF0aW9uCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEVhZ2VyUmVzdWx0TGlzdCBleHRlbmRzIExpc3RSZXN1bHRMaXN0IGltcGxlbWVudHMgUmVzdWx0TGlzdCB7CisKKyAgICBwdWJsaWMgRWFnZXJSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCkgeworICAgICAgICBzdXBlcihuZXcgQXJyYXlMaXN0KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcm9wLm9wZW4oKTsKKyAgICAgICAgICAgIHdoaWxlIChyb3AubmV4dCgpKQorICAgICAgICAgICAgICAgIGdldERlbGVnYXRlKCkuYWRkKHJvcC5nZXRSZXN1bHRPYmplY3QoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJvcC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0xhenlGb3J3YXJkUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0xhenlGb3J3YXJkUmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzA0OWYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvTGF6eUZvcndhcmRSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIExhenkgZm9yd2FyZC1vbmx5IHJlc3VsdCBsaXN0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBMYXp5Rm9yd2FyZFJlc3VsdExpc3QgZXh0ZW5kcyBBYnN0cmFjdFNlcXVlbnRpYWxSZXN1bHRMaXN0CisgICAgaW1wbGVtZW50cyBSZXN1bHRMaXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUEVOID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJFRUQgPSAyOworCisgICAgcHJpdmF0ZSBSZXN1bHRPYmplY3RQcm92aWRlciBfcm9wID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBpbnQgX3N0YXRlID0gT1BFTjsKKyAgICBwcml2YXRlIGludCBfc2l6ZSA9IC0xOworCisgICAgcHVibGljIExhenlGb3J3YXJkUmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciByb3ApIHsKKyAgICAgICAgX3JvcCA9IHJvcDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9yb3Aub3BlbigpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlck9wZW4oKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUgPT0gT1BFTjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZSA9PSBDTE9TRUQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChfc3RhdGUgIT0gQ0xPU0VEKSB7CisgICAgICAgICAgICBmcmVlKCk7CisgICAgICAgICAgICBfc3RhdGUgPSBDTE9TRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworCisgICAgICAgIC8vIG9wdGltaXphdGlvbiBmb3IgZ2V0dGluZyBzZXF1bnRpYWxseQorICAgICAgICBpZiAoaW5kZXggPT0gX2xpc3Quc2l6ZSgpKQorICAgICAgICAgICAgYWRkTmV4dCgpOworICAgICAgICBpZiAoaW5kZXggPCBfbGlzdC5zaXplKCkpCisgICAgICAgICAgICByZXR1cm4gX2xpc3QuZ2V0KGluZGV4KTsKKworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yIGl0cihpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChfc3RhdGUgIT0gT1BFTikgPyBfbGlzdC5saXN0SXRlcmF0b3IoaW5kZXgpIDogbmV3IEl0cihpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChfc2l6ZSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICAgICAgaWYgKF9zdGF0ZSAhPSBPUEVOKQorICAgICAgICAgICAgcmV0dXJuIF9saXN0LnNpemUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zaXplID0gX3JvcC5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gX3NpemU7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkTmV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX3JvcC5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBmcmVlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2xpc3QuYWRkKF9yb3AuZ2V0UmVzdWx0T2JqZWN0KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZnJlZSgpIHsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBPUEVOKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9yb3AuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc3RhdGUgPSBGUkVFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGZ1bGx5IHRyYXZlcnNlIHJlc3VsdHMKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBPUEVOKQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBpdHIoX2xpc3Quc2l6ZSgpKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICAgICAgaXRyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIF9saXN0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIC8vIHN1cGVyY2xhc3MgdHJpZXMgdG8gdHJhdmVyc2VzIGVudGlyZSBsaXN0IGZvciBoYXNoY29kZQorICAgICAgICByZXR1cm4gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAvLyBzdXBlcmNsYXNzIHRyaWVzIHRvIHRyYXZlcnNlIGVudGlyZSBsaXN0IGZvciBlcXVhbGl0eQorICAgICAgICByZXR1cm4gb3RoZXIgPT0gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEl0ciBleHRlbmRzIEFic3RyYWN0TGlzdEl0ZXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIGludCBfaWR4ID0gMDsKKworICAgICAgICBwdWJsaWMgSXRyKGludCBpbmRleCkgeworICAgICAgICAgICAgX2lkeCA9IE1hdGgubWluKGluZGV4LCBfbGlzdC5zaXplKCkpOworICAgICAgICAgICAgd2hpbGUgKF9pZHggPCBpbmRleCkKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfaWR4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIF9pZHggLSAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChfbGlzdC5zaXplKCkgPiBfaWR4KQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKF9zdGF0ZSAhPSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBhZGROZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgIHJldHVybiBfaWR4ID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7CisgICAgICAgICAgICBpZiAoX2lkeCA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuZ2V0KC0tX2lkeCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIF9saXN0LmdldChfaWR4KyspOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0xpc3RSZXN1bHRMaXN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvTGlzdFJlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNkMmIyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL0xpc3RSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBBIGJhc2ljIHtAbGluayBSZXN1bHRMaXN0fSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdyYXBzIGEgbm9ybWFsIGxpc3QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIExpc3RSZXN1bHRMaXN0IGV4dGVuZHMgQWJzdHJhY3RSZXN1bHRMaXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdCBfbGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Nsb3NlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFJlc3VsdExpc3QoTGlzdCBsaXN0KSB7CisgICAgICAgIF9saXN0ID0gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdyYXBwZWQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9saXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdmlkZXJPcGVuKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgIHJldHVybiBfY2xvc2VkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBfY2xvc2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIHJldHVybiBfbGlzdC5jb250YWlucyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICByZXR1cm4gX2xpc3QuY29udGFpbnNBbGwoYyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9saXN0LmdldChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9saXN0LmluZGV4T2Yobyk7CisgICAgfQorCisgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIHJldHVybiBfbGlzdC5sYXN0SW5kZXhPZihvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9saXN0LnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIHJldHVybiBfbGlzdC5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0TGlzdEl0ZXJhdG9yKF9saXN0Lmxpc3RJdGVyYXRvcigpLCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRMaXN0SXRlcmF0b3IoX2xpc3QubGlzdEl0ZXJhdG9yKGluZGV4KSwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9saXN0LnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7CisgICAgICAgIGFzc2VydE9wZW4oKTsKKyAgICAgICAgcmV0dXJuIF9saXN0LnRvQXJyYXkoYSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7CisgICAgICAgIHJldHVybiBfbGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhOWIyOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9MaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb24uTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IHByb3ZpZGVyIHdyYXBwZWQgYXJvdW5kIGEgbm9ybWFsIGxpc3QuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIExpc3RSZXN1bHRPYmplY3RQcm92aWRlciBpbXBsZW1lbnRzIFJlc3VsdE9iamVjdFByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdCBfbGlzdDsKKyAgICBwcml2YXRlIGludCBfaWR4ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gU3VwcGx5IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIoTGlzdCBsaXN0KSB7CisgICAgICAgIF9saXN0ID0gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9saXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9saXN0LmdldChfaWR4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhYnNvbHV0ZShfaWR4ICsgMSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwb3MgPj0gMCAmJiBwb3MgPCBfbGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgIF9pZHggPSBwb3M7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfbGlzdC5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX2lkeCA9IC0xOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfbGlzdCBpbnN0YW5jZW9mIENsb3NlYWJsZSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChDbG9zZWFibGUpIF9saXN0KS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVDaGVja2VkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIHNob3VsZG4ndCBldmVyIGhhcHBlbgorICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9NZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL01lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhMTc4YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9NZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb24uTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uOworCisvKioKKyAqIEEgcmVzdWx0IG9iamVjdCBwcm92aWRlciB0aGF0IG1lcmdlcyBtdWx0aXBsZSByZXN1bHQgb2JqZWN0IHByb3ZpZGVyCisgKiBkZWxlZ2F0ZXMuIFN1cHBvcnQgZXhpc3RzIGZvciBtYWludGFpbmluZyBvcmRlcmluZyBvZiB0aGUgaW50ZXJuYWxseSBoZWxkCisgKiByZXN1bHRzLCBwcm92aWRlZCB0aGF0IGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgcmVzdWx0cyBpcyBpdHNlbGYgb3JkZXJlZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGNsYXNzIE1lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyIGltcGxlbWVudHMgUmVzdWx0T2JqZWN0UHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBVTk9QRU5FRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBPUEVORUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVkFMVUUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRE9ORSA9IDM7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc3VsdE9iamVjdFByb3ZpZGVyW10gX3JvcHM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yIF9jb21wOworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIF9zdGF0dXM7CisgICAgcHJpdmF0ZSBPYmplY3RbXSBfdmFsdWVzOworICAgIHByaXZhdGUgT2JqZWN0W10gX29yZGVyVmFsdWVzOworICAgIHByaXZhdGUgT2JqZWN0IF9jdXIgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9zaXplID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gUHJvdmlkZSBkZWxlZ2F0ZXMuCisgICAgICovCisgICAgcHVibGljIE1lcmdlZFJlc3VsdE9iamVjdFByb3ZpZGVyKFJlc3VsdE9iamVjdFByb3ZpZGVyW10gcm9wcykgeworICAgICAgICB0aGlzKHJvcHMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBQcm92aWRlIGRlbGVnYXRlcyBhbmQgb3B0aW9uYWwgY29tcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIoUmVzdWx0T2JqZWN0UHJvdmlkZXJbXSByb3BzLAorICAgICAgICBDb21wYXJhdG9yIGNvbXApIHsKKyAgICAgICAgX3JvcHMgPSByb3BzOworICAgICAgICBfY29tcCA9IGNvbXA7CisgICAgICAgIF9zdGF0dXMgPSBuZXcgYnl0ZVtyb3BzLmxlbmd0aF07CisgICAgICAgIF92YWx1ZXMgPSAoY29tcCA9PSBudWxsKSA/IG51bGwgOiBuZXcgT2JqZWN0W3JvcHMubGVuZ3RoXTsKKyAgICAgICAgX29yZGVyVmFsdWVzID0gKGNvbXAgPT0gbnVsbCkgPyBudWxsIDogbmV3IE9iamVjdFtyb3BzLmxlbmd0aF07CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSYW5kb21BY2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBjb21wYXJhdG9yLCB0aGVuIG9wZW4gYWxsOyBlbHNlIG9wZW4gZmlyc3QKKyAgICAgICAgaW50IGxlbiA9IChfY29tcCAhPSBudWxsKSA/IF9yb3BzLmxlbmd0aCA6IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIF9yb3BzW2ldLm9wZW4oKTsKKyAgICAgICAgICAgIF9zdGF0dXNbaV0gPSBPUEVORUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhYnNvbHV0ZShpbnQgcG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfc2l6ZSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBfc2l6ZTsKKworICAgICAgICAvLyBoYXZlIHRvIG9wZW4gYWxsIHRvIGdldCBzaXplcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zdGF0dXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChfc3RhdHVzW2ldID09IFVOT1BFTkVEKSB7CisgICAgICAgICAgICAgICAgX3JvcHNbaV0ub3BlbigpOworICAgICAgICAgICAgICAgIF9zdGF0dXNbaV0gPSBPUEVORUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgdG90YWwgPSAwOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcm9wcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2l6ZSA9IF9yb3BzW2ldLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgdG90YWwgPSBzaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWwgKz0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSA9IHRvdGFsOworICAgICAgICByZXR1cm4gX3NpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcm9wcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChfc3RhdHVzW2ldICE9IFVOT1BFTkVEKQorICAgICAgICAgICAgICAgIF9yb3BzW2ldLnJlc2V0KCk7CisgICAgICAgIGNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGVyciA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3JvcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKF9zdGF0dXNbaV0gIT0gVU5PUEVORUQpCisgICAgICAgICAgICAgICAgICAgIF9yb3BzW2ldLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIGlmIChlcnIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGVycjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9jdXIgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yb3BzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBfc3RhdHVzW2ldID0gT1BFTkVEOworICAgICAgICAgICAgaWYgKF92YWx1ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfdmFsdWVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChfb3JkZXJWYWx1ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfb3JkZXJWYWx1ZXNbaV0gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoX3JvcHMubGVuZ3RoID09IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICBfcm9wc1swXS5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbGwgcm9wcyB3aXRoIHRoZSBsYXRlc3QgdmFsdWVzCisgICAgICAgIGJvb2xlYW4gaGFzVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc3RhdHVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9zdGF0dXNbaV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVOT1BFTkVEOgorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgb25seSBldmVyIGJlIHRoZSBjYXNlIGlmIHdlIGFyZW4ndCBvcmRlcmluZworICAgICAgICAgICAgICAgICAgICBfcm9wc1tpXS5vcGVuKCk7CisgICAgICAgICAgICAgICAgICAgIF9zdGF0dXNbaV0gPSBPUEVORUQ7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICAgICAgY2FzZSBPUEVORUQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcm9wIGhhcyBhIHZhbHVlLCBjYWNoZSBpdDsgaWYgd2UncmUgbm90IG9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoYXQncyB0aGUgdmFsdWUgdG8gcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGlmIChfcm9wc1tpXS5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29tcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1ciA9IF9yb3BzW2ldLmdldFJlc3VsdE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXR1c1tpXSA9IFZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXNbaV0gPSBfcm9wc1tpXS5nZXRSZXN1bHRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JkZXJWYWx1ZXNbaV0gPSBnZXRPcmRlcmluZ1ZhbHVlKF92YWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIF9yb3BzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdHVzW2ldID0gRE9ORTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWQUxVRToKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSB1c2UgdGhpcyBzdGF0ZSB3aGVuIG9yZGVyaW5nCisgICAgICAgICAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBnZXQgdG8gdGhpcyBwb2ludCB3aXRob3V0IGEgY29tcGFyYXRvciwgaXQgbWVhbnMgbm9uZQorICAgICAgICAvLyBvZiBvdXIgcm9wcyBoYXZlIGFueSBtb3JlIHZhbHVlcworICAgICAgICBpZiAoX2NvbXAgPT0gbnVsbCB8fCAhaGFzVmFsdWUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gZm9yIGFsbCB0aGUgcm9wcyB3aXRoIHZhbHVlcywgZmluZCB0aGUgJ2xlYXN0JyBvbmUgYWNjb3JkaW5nIHRvCisgICAgICAgIC8vIHRoZSBjb21wYXJhdG9yCisgICAgICAgIGludCBsZWFzdCA9IC0xOworICAgICAgICBPYmplY3Qgb3JkZXJWYWwgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9vcmRlclZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKF9zdGF0dXNbaV0gIT0gVkFMVUUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAobGVhc3QgPT0gLTEgfHwgX2NvbXAuY29tcGFyZShfb3JkZXJWYWx1ZXNbaV0sIG9yZGVyVmFsKSA8IDApIHsKKyAgICAgICAgICAgICAgICBsZWFzdCA9IGk7CisgICAgICAgICAgICAgICAgb3JkZXJWYWwgPSBfb3JkZXJWYWx1ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhc3NpZ24gdGhlIGxlYXN0IHZhbHVlIHRvIHRoZSBjdXJyZW50IG9uZSwgYW5kIGNsZWFyIHRoZSBjYWNoZWQKKyAgICAgICAgLy8gdmFsdWUgZm9yIHRoYXQgcm9wIHNvIHRoYXQgd2Uga25vdyB0byBnZXQgdGhlIG5leHQgdmFsdWUgZm9yCisgICAgICAgIC8vIHRoZSBuZXh0IGNvbXBhcmlzb24KKyAgICAgICAgX2N1ciA9IF92YWx1ZXNbbGVhc3RdOworICAgICAgICBfdmFsdWVzW2xlYXN0XSA9IG51bGw7CisgICAgICAgIF9vcmRlclZhbHVlc1tsZWFzdF0gPSBudWxsOworICAgICAgICBfc3RhdHVzW2xlYXN0XSA9IE9QRU5FRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHRPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9jdXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSB0byB1c2UgZm9yIG9yZGVyaW5nIG9uIHRoZSBnaXZlbiByZXN1bHQgdmFsdWUuIFJldHVybnMKKyAgICAgKiB0aGUgcmVzdWx0IHZhbHVlIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSByZXN1bHQgdmFsdWUKKyAgICAgKiBAcGFyYW0gaWR4IHRoZSBpbmRleCBvZiB0aGUgcmVzdWx0IG9iamVjdCBwcm92aWRlciBpbiB0aGUgYXJyYXkKKyAgICAgKiBnaXZlbiBvbiBjb25zdHJ1Y3Rpb24gdGhhdCBwcm9kdWNlZCB0aGUgcmVzdWx0IHZhbHVlCisgICAgICogQHBhcmFtIHJvcCB0aGUgcmVzdWx0IG9iamVjdCBwcm92aWRlciB0aGF0IHByb2R1Y2VkIHRoZSByZXN1bHQgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldE9yZGVyaW5nVmFsdWUoT2JqZWN0IHZhbCwgaW50IGlkeCwKKyAgICAgICAgUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wKSB7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1JhbmRvbUFjY2Vzc1Jlc3VsdExpc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SYW5kb21BY2Nlc3NSZXN1bHRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNWEyNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SYW5kb21BY2Nlc3NSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKKworLyoqCisgKiBSYW5kb20tYWNjZXNzIHJlc3VsdCBsaXN0IGltcGxlbWVudGF0aW9uLiBJdCBtYWludGFpbnMgYSBtYXAKKyAqIG9mIHRoZSBpdGVtcyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBpbnN0YW50aWF0ZWQuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5kb21BY2Nlc3NSZXN1bHRMaXN0IGV4dGVuZHMgQWJzdHJhY3ROb25TZXF1ZW50aWFsUmVzdWx0TGlzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1BFTiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSRUVEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VEID0gMjsKKworICAgIC8vIGRhdGEgcHJvdmlkZXIKKyAgICBwcml2YXRlIFJlc3VsdE9iamVjdFByb3ZpZGVyIF9yb3AgPSBudWxsOworCisgICAgLy8gaG9sZHMgYWxsIHRoZSByb3cgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGluc3RhbnRpYXRlZCBzbyBmYXIKKyAgICBwcml2YXRlIE1hcCBfcm93cyA9IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3RbXSBfZnVsbCA9IG51bGw7CisKKyAgICAvLyBib29ra2VlcGluZworICAgIHByaXZhdGUgbG9uZyBfcmVxdWVzdHMgPSAwOworICAgIHByaXZhdGUgaW50IF9zdGF0ZSA9IE9QRU47CisgICAgcHJpdmF0ZSBpbnQgX3NpemUgPSAtMTsKKworICAgIHB1YmxpYyBSYW5kb21BY2Nlc3NSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCkgeworICAgICAgICBfcm9wID0gcm9wOworICAgICAgICBfcm93cyA9IG5ld1Jvd01hcCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcm9wLm9wZW4oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIF9yb3AuaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNvbnRyb2wgd2hhdCBraW5kIG9mIG1hcCBpcyB1c2VkIGZvcgorICAgICAqIHRoZSBpbnN0YW50aWF0ZWQgcm93cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIG5ld1Jvd01hcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlck9wZW4oKSB7CisgICAgICAgIHJldHVybiBfc3RhdGUgPT0gT1BFTjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZSA9PSBDTE9TRUQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChfc3RhdGUgIT0gQ0xPU0VEKSB7CisgICAgICAgICAgICBmcmVlKCk7CisgICAgICAgICAgICBfc3RhdGUgPSBDTE9TRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEludGVybmFsKGludCBpbmRleCkgeworICAgICAgICBpZiAoX2Z1bGwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IF9mdWxsLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUEFTVF9FTkQ7CisgICAgICAgICAgICByZXR1cm4gX2Z1bGxbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgSW50ZWdlciBpID0gTnVtYmVycy52YWx1ZU9mKGluZGV4KTsKKyAgICAgICAgT2JqZWN0IHJldCA9IF9yb3dzLmdldChpKTsKKyAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmV0IGluc3RhbmNlb2YgTnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBpbnN0YW50aWF0ZVJvdyhpKTsKKyAgICAgICAgcmV0dXJuIChyZXQgPT0gbnVsbCkgPyBQQVNUX0VORCA6IHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgcm93IG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGluc3RhbnRpYXRlUm93KEludGVnZXIgaSkgeworICAgICAgICBfcmVxdWVzdHMrKzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghX3JvcC5hYnNvbHV0ZShpLmludFZhbHVlKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBQQVNUX0VORDsKKworICAgICAgICAgICAgT2JqZWN0IG9iID0gX3JvcC5nZXRSZXN1bHRPYmplY3QoKTsKKyAgICAgICAgICAgIGlmIChvYiA9PSBudWxsKQorICAgICAgICAgICAgICAgIG9iID0gbmV3IE51bGwoKTsKKworICAgICAgICAgICAgLy8gY2FjaGUgdGhlIHJlc3VsdAorICAgICAgICAgICAgX3Jvd3MucHV0KGksIG9iKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIG91ciBtYXAgaXMgZnVsbAorICAgICAgICAgICAgY2hlY2tDb21wbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuIG9iOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHNvZnQgbWFwIGlzIHRoZSBzYW1lIHNpemUgYXMgYWxsIHRoZQorICAgICAqIHJvd3MgaW4gdGhlIFJlc3VsdDogaWYgc28sIHdlIGNvcHkgb3ZlciB0aGUgdmFsdWVzIHRvIGEKKyAgICAgKiBoYXJkIHJlZmVyZW5jZSBIYXNoU2V0IGFuZCBjbG9zZSB0aGUgUmVzdWx0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIGVuZGVhdm91ci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDb21wbGV0ZSgpIHsKKyAgICAgICAgLy8gb25seSBjaGVjayBpZiB3ZSd2ZSBhY3R1YWxseSBnb3R0ZW4gdGhlIHNpemUgZm9yIHNvbWUgcmVhc29uIGFscmVhZHkKKyAgICAgICAgaWYgKF9zaXplID09IC0xIHx8IF9yb3dzLnNpemUoKSAhPSBfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBPYmplY3RbXSBmdWxsID0gbmV3IE9iamVjdFtfc2l6ZV07CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIEludGVnZXIga2V5OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9yb3dzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IGNvdW50KyspIHsKKyAgICAgICAgICAgIGtleSA9IChJbnRlZ2VyKSBpdHIubmV4dCgpOworICAgICAgICAgICAgZnVsbFtrZXkuaW50VmFsdWUoKV0gPSBfcm93cy5nZXQoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvdWJsZS1jaGVjaywgaW4gY2FzZSBhbnkgb2YgdGhlIHNvZnQgcmVmZXJlbmNlcyB3ZXJlCisgICAgICAgIC8vIGNsZWFuZWQgdXAgYmV0d2VlbiB0aGUgdGltZSB3ZSBjaGVja2VkIHRoZSBzaXplIGFuZCB0aGUKKyAgICAgICAgLy8gdGltZSB3ZSBjb21wbGV0ZWQgdGhlIGNvcHkgdG8gdGhlIGhhcmQgcmVmZXJlbmNlIG1hcAorICAgICAgICBpZiAoY291bnQgPT0gX3NpemUpIHsKKyAgICAgICAgICAgIF9mdWxsID0gZnVsbDsKKyAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBpZiAoX3NpemUgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gX3NpemU7CisgICAgICAgIGlmIChfZnVsbCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9mdWxsLmxlbmd0aDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zaXplID0gX3JvcC5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gX3NpemU7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZnJlZSgpIHsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBPUEVOKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9yb3AuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcm93cyA9IG51bGw7CisgICAgICAgICAgICBfc3RhdGUgPSBGUkVFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZnVsbCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzdWx0TGlzdChBcnJheXMuYXNMaXN0KF9mdWxsKSk7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGl0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgbGlzdC5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgKyAiOyBpZGVudGl0eTogIiArIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpCisgICAgICAgICAgICArICI7IGNhY2hlZDogIiArIF9yb3dzLnNpemUoKQorICAgICAgICAgICAgKyAiOyByZXF1ZXN0czogIiArIF9yZXF1ZXN0czsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAvLyBzdXBlcmNsYXNzIHRyaWVzIHRvIHRyYXZlcnNlcyBlbnRpcmUgbGlzdCBmb3IgaGFzaGNvZGUKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgLy8gc3VwZXJjbGFzcyB0cmllcyB0byB0cmF2ZXJzZSBlbnRpcmUgbGlzdCBmb3IgZXF1YWxpdHkKKyAgICAgICAgcmV0dXJuIG90aGVyID09IHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byByZXByZXNlbnQgbnVsbHMgaW4gdGhlIHJlc3VsdCBsaXN0LiBDYW4ndCB1c2UgYSBzaW5nbGV0b24KKyAgICAgKiBwYXR0ZXJuLCBiZWNhdXNlIHRoZW4gdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBoYXJkIHJlZiB0byBhbGwgdGhlCisgICAgICogbnVsbHMsIGFuZCB0aGV5J2xsIG5ldmVyIGdldCBHQydkOyB0aGlzIGlzIGJhZCBpbiB0aGUgdW5saWtlbHkKKyAgICAgKiBldmVudCBvZiBhIGh1Z2UgcmVzdWx0IHNldCB3aXRoIGxvdHMgb2YgbnVsbHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbCB7CisKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SYW5nZVJlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvUmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDI3NjIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvUmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworCisvKioKKyAqIFByZXZlbnRzIGEgdmlldyBvZiBhIGdpdmVuIHJhbmdlIG9mIGluZGljZXMgZnJvbSB0aGUgZGVsZWdhdGUKKyAqIHJlc3VsdCBvYmplY3QgcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIgaW1wbGVtZW50cyBSZXN1bHRPYmplY3RQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChSYW5nZVJlc3VsdE9iamVjdFByb3ZpZGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgUmVzdWx0T2JqZWN0UHJvdmlkZXIgX2RlbGVnYXRlOworICAgIHByaXZhdGUgZmluYWwgaW50IF9zdGFydElkeDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBfZW5kSWR4OworICAgIHByaXZhdGUgaW50IF9pZHggPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBCZWNhdXNlIHRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBzb21lIGRlbGVnYXRlLAorICAgICAqIGFuZCByZXN1bHQgb2JqZWN0IHByb3ZpZGVycyB3b3JrIHdpdGggaW50IGluZGV4ZXMsIG5laXRoZXIgdGhlIHN0YXJ0CisgICAgICogb3IgZW5kIGluZGV4IGNhbiBiZSBncmVhdGVyIHRoYW4gSW50ZWdlci5NQVhfVkFMVUUod2l0aCB0aGUgZXhjZXB0aW9uCisgICAgICogb2YgTG9uZy5NQVhfVkFMVUUsIHdoaWNoIGlzIHVzZWQgdG8gaW5kaWNhdGUgbm8gbGltaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGVnYXRlIHRoZSByZXN1bHQgb2JqZWN0IHByb3ZpZGVyIHRvIGRlbGVnYXRlIHRvCisgICAgICogQHBhcmFtIHN0YXJ0SWR4IDAtYmFzZWQgaW5jbHVzaXZlIHN0YXJ0IGluZGV4IG9mIHRoZSByYW5nZQorICAgICAqIHRvIHByZXNlbnQ7IG11c3QgYmUgJmx0OyBJbnRlZ2VyLk1BWF9WQUxVRQorICAgICAqIEBwYXJhbSBlbmRJZHggMC1iYXNlZCBleGNsdXNpdmUgZW5kIGluZGV4IG9mIHRoZSByYW5nZSB0bworICAgICAqIHByZXNlbnQ7IG11c3QgYmUgJmx0OyBJbnRlZ2VyLk1BWF9WQUxVRSwgb3IgTG9uZy5NQVhfVkFMVUUgZm9yIG5vIGxpbWl0CisgICAgICovCisgICAgcHVibGljIFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIoUmVzdWx0T2JqZWN0UHJvdmlkZXIgZGVsZWdhdGUsCisgICAgICAgIGxvbmcgc3RhcnRJZHgsIGxvbmcgZW5kSWR4KSB7CisgICAgICAgIC8vIHVzZSBJbnRlZ2VyLk1BWF9WQUxVRSBmb3Igbm8gbGltaXQgaW50ZXJuYWxseQorICAgICAgICBpZiAoZW5kSWR4ID09IExvbmcuTUFYX1ZBTFVFKQorICAgICAgICAgICAgZW5kSWR4ID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICAgICAgX2RlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIGlmIChzdGFydElkeCA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IGVuZElkeCA+IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihfbG9jLmdldCgicmFuZ2UtdG9vLWhpZ2giLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0YXJ0SWR4KSwgU3RyaW5nLnZhbHVlT2YoZW5kSWR4KSkuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICBfc3RhcnRJZHggPSAoaW50KSBzdGFydElkeDsKKyAgICAgICAgX2VuZElkeCA9IChpbnQpIGVuZElkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JhbmRvbUFjY2VzcygpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5zdXBwb3J0c1JhbmRvbUFjY2VzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX2RlbGVnYXRlLm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3VsdE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoX2lkeCA8IF9zdGFydElkeCB8fCBfaWR4ID49IF9lbmRJZHgpCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihfaWR4KSk7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuZ2V0UmVzdWx0T2JqZWN0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbmV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhZHZhbmNlIHVwIHRvIGp1c3QgYmVoaW5kIF9zdGFydElkeCBpZiB3ZSBoYXZlbid0IGFscmVhZHkKKyAgICAgICAgd2hpbGUgKF9pZHggPCBfc3RhcnRJZHggLSAxKSB7CisgICAgICAgICAgICBpZiAoX2RlbGVnYXRlLnN1cHBvcnRzUmFuZG9tQWNjZXNzKCkpIHsKKyAgICAgICAgICAgICAgICBfaWR4ID0gX3N0YXJ0SWR4IC0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIV9kZWxlZ2F0ZS5hYnNvbHV0ZShfc3RhcnRJZHggLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfaWR4Kys7CisgICAgICAgICAgICAgICAgaWYgKCFfZGVsZWdhdGUubmV4dCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgbm90IGZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIHJhbmdlCisgICAgICAgIGlmIChfaWR4ID49IF9lbmRJZHggLSAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIF9pZHgrKzsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF9pZHggPSBwb3MgKyBfc3RhcnRJZHg7CisgICAgICAgIGlmIChfaWR4ID49IF9lbmRJZHgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuYWJzb2x1dGUoX2lkeCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBzaXplID0gX2RlbGVnYXRlLnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgPT0gSW50ZWdlci5NQVhfVkFMVUUpCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgc2l6ZSA9IE1hdGgubWluKF9lbmRJZHgsIHNpemUpIC0gX3N0YXJ0SWR4OworICAgICAgICByZXR1cm4gKHNpemUgPCAwKSA/IDAgOiBzaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF9pZHggPSAtMTsKKyAgICAgICAgX2RlbGVnYXRlLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX2RlbGVnYXRlLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgICAgICBfZGVsZWdhdGUuaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRMaXN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvUmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTJmODkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvUmVzdWx0TGlzdC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICogTGlzdCBpbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgbGF6eSBSZXN1bHRMaXN0IGluc3RhbnRpYXRpb24uCisgKiBBIFJlc3VsdExpc3Qgd2lsbCB0eXBpY2FsbHkgYmUgaW5zdGFudGlhdGVkIGZyb20gYSBmYWN0b3J5LCBhbmQKKyAqIHdpbGwgdXNlIGEgUmVzdWx0T2JqZWN0UHJvdmlkZXIgZm9yIG9idGFpbmluZyBpbmRpdmlkdWFsIG9iamVjdAorICogZGF0YSByZXByZXNlbnRhdGlvbnMuIERlcGVuZGluZyBvbiB0aGUgc3VwcG9ydCBmb3Igc2Nyb2xsaW5nIGlucHV0cywKKyAqIHRoZSBsaXN0IHRoYXQgaXMgcmV0dXJuZWQgbWF5IHVzZSBsYXp5IGluc3RhbnRpYXRpb24gb2YgdGhlCisgKiBvYmplY3RzLCBhbmQgdGh1cyBhbGxvdyB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXRzIHRvIGJlIG9idGFpbmVkIGFuZAorICogbWFuaXB1bGF0ZWQuIE5vdGUgdGhhdCB3cmFwcGluZyBhIFJlc3VsdExpc3QgaW4gYW5vdGhlciBDb2xsZWN0aW9uIHdpbGwKKyAqIGFsd2F5cyBpbnN0YW50aWF0ZSB0aGUgZW50aXJlIHNldCBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlCisgKiBSZXN1bHRMaXN0LiBUaGlzIG1heSBub3QgYWx3YXlzIGJlIGRlc2lyZWFibGUsIHNpbmNlIHRoZSBsaXN0IG1heQorICogYmUgdmVyeSBsYXJnZS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc3VsdExpc3QgZXh0ZW5kcyBMaXN0LCBTZXJpYWxpemFibGUsIENsb3NlYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVyIGJhY2tpbmcgdGhpcyBsaXN0IGlzIG9wZW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlck9wZW4oKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxpc3QgaGFzIGJlZW4gY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCk7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRMaXN0SXRlcmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRMaXN0SXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTE4ODBmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Jlc3VsdExpc3RJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKKworLyoqCisgKiBXcmFwcGVyIGl0ZXJhdG9yIHRoYXQgd2lsbCByZXR1cm4gZmFsc2UgZm9yIDxjb2RlPmhhc05leHQoKTwvY29kZT4gaWYKKyAqIHRoZSBvd25pbmcgUmVzdWx0TGlzdCBoYXMgYmVlbiBjbG9zZWQuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFJlc3VsdExpc3RJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0TGlzdEl0ZXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoCisgICAgICAgIFJlc3VsdExpc3RJdGVyYXRvci5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvciBfbGk7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRMaXN0IF9ybDsKKworICAgIHB1YmxpYyBSZXN1bHRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yIGxpLCBSZXN1bHRMaXN0IHJsKSB7CisgICAgICAgIF9saSA9IGxpOworICAgICAgICBfcmwgPSBybDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0TGlzdCBnZXRSZXN1bHRMaXN0KCkgeworICAgICAgICByZXR1cm4gX3JsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIGlmIChfcmwuaXNDbG9zZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9saS5oYXNOZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7CisgICAgICAgIHJldHVybiBfbGkuaGFzUHJldmlvdXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgIGlmIChfcmwuaXNDbG9zZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKF9sb2MuZ2V0KCJjbG9zZWQiKS5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gX2xpLm5leHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9saS5uZXh0SW5kZXgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgeworICAgICAgICByZXR1cm4gX2xpLnByZXZpb3VzKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgeworICAgICAgICByZXR1cm4gX2xpLnByZXZpb3VzSW5kZXgoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Jlc3VsdE9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjMWYwMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEludGVyZmFjZSB0aGF0IGFsbG93cyBsYXp5L2N1c3RvbSBpbnN0YW50aWF0aW9uIG9mIGlucHV0IG9iamVjdHMuCisgKiB7QGxpbmsgUmVzdWx0TGlzdH0gb2JqZWN0cyBkbyBub3QgbmVjZXNzYXJpbHkgbG9hZCBpbiBkYXRhIGFsbAorICogYXQgb25jZS4gSW5zdGVhZCwgdGhleSBtYXkgbGF6aWx5IGxvYWQgb2JqZWN0cyBhcyBuZWNlc3NhcnkuIFNvLAorICogdGhlIGxpZmVzcGFuIG9mIGEge0BsaW5rIFJlc3VsdE9iamVjdFByb3ZpZGVyfSBpbnN0YW5jZSBpcworICogcmVsYXRlZCB0byBob3cgdGhlIGFwcGxpY2F0aW9uIGRlYWxzIHdpdGggcHJvY2Vzc2luZyB0aGUKKyAqIHtAbGluayBSZXN1bHRMaXN0fSBjcmVhdGVkIHdpdGggYSBnaXZlbgorICoge0BsaW5rIFJlc3VsdE9iamVjdFByb3ZpZGVyfSBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdWx0T2JqZWN0UHJvdmlkZXIgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBwcm92aWRlciBzdXBwb3J0cyByYW5kb20gYWNjZXNzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmFuZG9tQWNjZXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSByZXN1bHQuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICoge0BsaW5rICNuZXh0fSwge0BsaW5rICNhYnNvbHV0ZX0sIG9yIHtAbGluayAjc2l6ZX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgY3VycmVudCByZXN1bHQgb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUKKyAgICAgKiBjYWxsZWQgYWZ0ZXIge0BsaW5rICNuZXh0fSBvciB7QGxpbmsgI2Fic29sdXRlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3VsdE9iamVjdCgpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBBZHZhbmNlIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBwb3NpdGlvbi4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCisgICAgICogdGhlcmUgaXMgbW9yZSBkYXRhOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogTW92ZSB0byB0aGUgZ2l2ZW4gMC1iYXNlZCBwb3NpdGlvbi4gVGhpcyBtZXRob2QgaXMKKyAgICAgKiBvbmx5IGNhbGxlZCBmb3IgcHJvdmlkZXJzIHRoYXQgc3VwcG9ydCByYW5kb20gYWNjZXNzLgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBkYXRhIGF0IHRoaXMgcG9zaXRpb247CisgICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyBtYXkgYmUgaW52b2tlZCBpbiBwbGFjZSBvZgorICAgICAqIHtAbGluayAjbmV4dH0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWJzb2x1dGUoaW50IHBvcykgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBpbnB1dCwgb3Ige0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfQorICAgICAqIGlmIHRoZSBzaXplIGluIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoaXMgcHJvdmlkZXIuIFRoaXMgaXMgYW4gb3B0aW9uYWwgb3BlcmF0aW9uLiBJZiBzdXBwb3J0ZWQsCisgICAgICogaXQgc2hvdWxkIG1vdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBwcm92aWRlciB0byBiZWZvcmUgdGhlIGZpcnN0CisgICAgICogZWxlbWVudC4gTm9uLXJhbmRvbS1hY2Nlc3MgcHJvdmlkZXJzIG1heSBiZSBhYmxlIHRvIHN1cHBvcnQgdGhpcworICAgICAqIG1ldGhvZCBieSByZS1hY3F1aXJpbmcgYWxsIHJlc291cmNlcyBhcyBpZiB0aGUgcmVzdWx0IHdlcmUganVzdCBvcGVuZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEFueSBjaGVja2VkIGV4Y2VwdGlvbnMgdGhhdCBhcmUgdGhyb3duIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgorICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiBhcyBhbiBhcHByb3ByaWF0ZSB1bmNoZWNrZWQKKyAgICAgKiBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlQ2hlY2tlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvUmVzdWx0T2JqZWN0UHJvdmlkZXJJdGVyYXRvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Jlc3VsdE9iamVjdFByb3ZpZGVySXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmE4YThiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Jlc3VsdE9iamVjdFByb3ZpZGVySXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICogSXRlcmF0b3Igd3JhcHBlZCBhcm91bmQgYSB7QGxpbmsgUmVzdWx0T2JqZWN0UHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN1bHRPYmplY3RQcm92aWRlckl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IsIENsb3NlYWJsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc3VsdE9iamVjdFByb3ZpZGVyIF9yb3A7CisgICAgcHJpdmF0ZSBCb29sZWFuIF9oYXNOZXh0ID0gbnVsbDsKKyAgICBwcml2YXRlIEJvb2xlYW4gX29wZW4gPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFN1cHBseSBvYmplY3QgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdE9iamVjdFByb3ZpZGVySXRlcmF0b3IoUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wKSB7CisgICAgICAgIF9yb3AgPSByb3A7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHVuZGVybHlpbmcgcmVzdWx0IG9iamVjdCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKF9vcGVuID09IEJvb2xlYW4uVFJVRSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfcm9wLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgX29wZW4gPSBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICBpZiAoX29wZW4gPT0gQm9vbGVhbi5GQUxTRSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoX2hhc05leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoX29wZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfcm9wLm9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX29wZW4gPSBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oYXNOZXh0ID0gKF9yb3AubmV4dCgpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2xvc2UgaWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgICBpZiAoIV9oYXNOZXh0LmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgaWYgKCFoYXNOZXh0KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHJldCA9IF9yb3AuZ2V0UmVzdWx0T2JqZWN0KCk7CisgICAgICAgICAgICBfaGFzTmV4dCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvU2ltcGxlUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1NpbXBsZVJlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI4NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1NpbXBsZVJlc3VsdExpc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIGFsbW9zdCBzdGF0ZWxlc3Mge0BsaW5rIFJlc3VsdExpc3R9IGRlc2lnbmVkIGZvciB1c2Ugd2l0aCByZXN1bHQKKyAqIG9iamVjdCBwcm92aWRlcnMgYmFja2VkIGJ5IGVmZmljaWVudCByYW5kb20tYWNjZXNzIGRhdGEgc3RydWN0dXJlcywgc3VjaAorICogYXMgdGhlIHtAbGluayBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXJ9LiBUaGlzIHJlc3VsdCBsaXN0IGRvZXMgbm90CisgKiBwZXJmb3JtIGFueSBjYWNoaW5nLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVSZXN1bHRMaXN0IGV4dGVuZHMgQWJzdHJhY3ROb25TZXF1ZW50aWFsUmVzdWx0TGlzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHRyYW5zaWVudCBSZXN1bHRPYmplY3RQcm92aWRlciBfcm9wOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgX3NpemUgPSAtMTsKKworICAgIHB1YmxpYyBTaW1wbGVSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHJvcCkgeworICAgICAgICBfcm9wID0gcm9wOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3JvcC5vcGVuKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyT3BlbigpIHsKKyAgICAgICAgcmV0dXJuICFfY2xvc2VkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gX2Nsb3NlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKCFfY2xvc2VkKSB7CisgICAgICAgICAgICBfY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX3JvcC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SW50ZXJuYWwoaW50IGluZGV4KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIV9yb3AuYWJzb2x1dGUoaW5kZXgpKQorICAgICAgICAgICAgICAgIHJldHVybiBQQVNUX0VORDsKKyAgICAgICAgICAgIHJldHVybiBfcm9wLmdldFJlc3VsdE9iamVjdCgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgcmV0dXJuIFBBU1RfRU5EOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBhc3NlcnRPcGVuKCk7CisgICAgICAgIGlmIChfc2l6ZSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9zaXplID0gX3JvcC5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gX3NpemU7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoX2Nsb3NlZCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIC8vIGxvYWQgcmVzdWx0cyBpbnRvIGxpc3QKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGl0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgbGlzdC5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9Tb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1NvZnRSYW5kb21BY2Nlc3NSZXN1bHRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkNTRkOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9Tb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlZmVyZW5jZU1hcDsKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBvZiB0aGUge0BsaW5rIFJhbmRvbUFjY2Vzc1Jlc3VsdExpc3R9IHRoYXQgb25seSBtYWludGFpbnMKKyAqIHNvZnQgcmVmZXJlbmNlcyB0byBpbnN0YW50aWF0ZWQgb2JqZWN0cy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU29mdFJhbmRvbUFjY2Vzc1Jlc3VsdExpc3QgZXh0ZW5kcyBSYW5kb21BY2Nlc3NSZXN1bHRMaXN0IHsKKworICAgIHB1YmxpYyBTb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciByb3ApIHsKKyAgICAgICAgc3VwZXIocm9wKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTWFwIG5ld1Jvd01hcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VNYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvV2luZG93UmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1dpbmRvd1Jlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNjNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1dpbmRvd1Jlc3VsdExpc3QuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlc3VsdExpc3QgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgZm9yd2FyZC1zY3JvbGxpbmcgd2luZG93IG9mIHJlc3VsdHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFdpbmRvd1Jlc3VsdExpc3QgZXh0ZW5kcyBBYnN0cmFjdE5vblNlcXVlbnRpYWxSZXN1bHRMaXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUEVOID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJFRUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTE9TRUQgPSAyOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBfd2luZG93OworICAgIHByaXZhdGUgaW50IF9wb3MgPSAtMTsKKyAgICBwcml2YXRlIFJlc3VsdE9iamVjdFByb3ZpZGVyIF9yb3AgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfcmFuZG9tID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgX3N0YXRlID0gT1BFTjsKKyAgICBwcml2YXRlIGludCBfc2l6ZSA9IC0xOworCisgICAgcHVibGljIFdpbmRvd1Jlc3VsdExpc3QoUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wKSB7CisgICAgICAgIHRoaXMocm9wLCAxMCk7CisgICAgfQorCisgICAgcHVibGljIFdpbmRvd1Jlc3VsdExpc3QoUmVzdWx0T2JqZWN0UHJvdmlkZXIgcm9wLCBpbnQgd2luZG93U2l6ZSkgeworICAgICAgICBfcm9wID0gcm9wOworCisgICAgICAgIGlmICh3aW5kb3dTaXplIDw9IDApCisgICAgICAgICAgICB3aW5kb3dTaXplID0gMTA7CisgICAgICAgIF93aW5kb3cgPSBuZXcgT2JqZWN0W3dpbmRvd1NpemVdOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcm9wLm9wZW4oKTsKKyAgICAgICAgICAgIF9yYW5kb20gPSBfcm9wLnN1cHBvcnRzUmFuZG9tQWNjZXNzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBfcm9wLmhhbmRsZUNoZWNrZWRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyT3BlbigpIHsKKyAgICAgICAgcmV0dXJuIF9zdGF0ZSA9PSBPUEVOOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gX3N0YXRlID09IENMT1NFRDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKF9zdGF0ZSAhPSBDTE9TRUQpIHsKKyAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgICAgIF9zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgYXNzZXJ0T3BlbigpOworICAgICAgICBpZiAoX3NpemUgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gX3NpemU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc2l6ZSA9IF9yb3Auc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIF9zaXplOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJbnRlcm5hbChpbnQgaW5kZXgpIHsKKyAgICAgICAgLy8gb3V0IG9mIHJhbmdlPworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IChfc2l6ZSAhPSAtMSAmJiBpbmRleCA+PSBfc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gUEFTVF9FTkQ7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYmVmb3JlIHdpbmRvdyByYW5nZSwgbW92ZSB3aW5kb3cgYmFjaworICAgICAgICAgICAgaWYgKGluZGV4IDwgX3BvcykgeworICAgICAgICAgICAgICAgIGlmICghX3JhbmRvbSB8fCBpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBfcm9wLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgX3BvcyA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBnZXQgb3IgcGFzdCB3aW5kb3cgcmFuZ2UsIG1vdmUgd2luZG93CisgICAgICAgICAgICBpZiAoX3BvcyA9PSAtMSB8fCBpbmRleCA+PSBfcG9zICsgX3dpbmRvdy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiByZXN1bHQgcHJvdmlkZXIganVzdCBiZWZvcmUgcmVxdWVzdGVkIGluZGV4CisgICAgICAgICAgICAgICAgaWYgKF9yYW5kb20gJiYgaW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIV9yb3AuYWJzb2x1dGUoaW5kZXggLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQQVNUX0VORDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgYmVnaW4gPSAoX3BvcyA9PSAtMSkgPyAwIDogX3BvcyArIF93aW5kb3cubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gYmVnaW47IGkgPCBpbmRleDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfcm9wLm5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEFTVF9FTkQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHdpbmRvdyBzdGFydGluZyBhdCByZXF1ZXN0ZWQgaW5kZXgKKyAgICAgICAgICAgICAgICBpbnQgZW5kID0gLTE7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfd2luZG93Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gLTEgJiYgIV9yb3AubmV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTsKKyAgICAgICAgICAgICAgICAgICAgX3dpbmRvd1tpXSA9IChlbmQgPT0gLTEpID8gX3JvcC5nZXRSZXN1bHRPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBQQVNUX0VORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3BvcyA9IGluZGV4OworCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHdpbmRvdyBzcGFucyB0aGUgZW50aXJlIHJlc3VsdCBsaXN0LCBmcmVlCisgICAgICAgICAgICAgICAgaWYgKGVuZCAhPSAtMSAmJiBfcG9zID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgX3NpemUgPSBlbmQ7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdyYWIgcmVzdWx0IGZyb20gd2luZG93CisgICAgICAgICAgICByZXR1cm4gX3dpbmRvd1tpbmRleCAtIF9wb3NdOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgX3JvcC5oYW5kbGVDaGVja2VkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZnJlZSgpIHsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBPUEVOKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9yb3AuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc3RhdGUgPSBGUkVFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfc3RhdGUgIT0gT1BFTikKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIC8vIGxvYWQgcmVzdWx0cyBpbnRvIGxpc3QKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGl0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgbGlzdC5hZGQoaXRyLm5leHQoKSk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYmNlODcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5SZXN1bHQgT2JqZWN0IFByb3ZpZGVyIEZyYW1ld29yazwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciB0aGUgbGF6eSBsb2FkaW5nIG9mIHBvdGVudGlhbGx5CisgICAgbGFyZ2UgbGlzdHMgb2YgZGF0YS4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQWJzdHJhY3RFdmVudE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQWJzdHJhY3RFdmVudE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA3M2YxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9BYnN0cmFjdEV2ZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQmFzZSBldmVudCBtYW5hZ2VyIHRoYXQgaGFuZGxlcyBhZGRpbmcvcmVtb3ZpbmcgbGlzdGVuZXJzCisgKiBhbmQgZmlyaW5nIGV2ZW50cy4gVGhpcyBjbGFzcyBpcyByZWVudHJhbnQtc2FmZTsgbGlzdGVuZXJzIGNhbiBiZSBhZGRlZAorICogYW5kIHJlbW92ZWQgYnkgb3RoZXIgbGlzdGVuZXJzIHdoZW4gdGhleSByZWNlaXZlIGV2ZW50cy4gVGhlIGNoYW5nZXMgd2lsbAorICogbm90IGJlIHZpc2libGUgdW50aWwgdGhlIGV2ZW50IGZpcmUgdGhhdCBpbml0aWF0ZWQgdGhlIHJlY3Vyc2l2ZSBzZXF1ZW5jZQorICogb2YgY2FsbHMgY29tcGxldGVzLCBob3dldmVyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzIEV2ZW50TWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBFeGNlcHRpb25bXSBFTVBUWV9FWENFUFRJT05TID0gbmV3IEV4Y2VwdGlvblswXTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfZmlyaW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9saXN0ZW5lcnMgPSBudWxsOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfbmV3TGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChfZmlyaW5nKSB7CisgICAgICAgICAgICBpZiAoX25ld0xpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgX25ld0xpc3RlbmVycyA9IG5ld0xpc3RlbmVyQ29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgIF9uZXdMaXN0ZW5lcnMuYWRkQWxsKF9saXN0ZW5lcnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX25ld0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKF9saXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfbGlzdGVuZXJzID0gbmV3TGlzdGVuZXJDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICBfbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9maXJpbmcgJiYgX2xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIGlmIChfbmV3TGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfbmV3TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgX25ld0xpc3RlbmVycy5hZGRBbGwoX2xpc3RlbmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX25ld0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbGlzdGVuZXJzICE9IG51bGwgJiYgX2xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBpbnN0YW5jZSBpcyBpbiB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGhhc0xpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICByZXR1cm4gX2xpc3RlbmVycyAhPSBudWxsICYmIF9saXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIF9saXN0ZW5lcnMgIT0gbnVsbCAmJiAhX2xpc3RlbmVycy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiBnZXRMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiAoX2xpc3RlbmVycyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QKKyAgICAgICAgICAgIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihfbGlzdGVuZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIHRoZSBnaXZlbiBldmVudCB0byBhbGwgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRXhjZXB0aW9uW10gZmlyZUV2ZW50KE9iamVjdCBldmVudCkgeworICAgICAgICBpZiAoX2xpc3RlbmVycyA9PSBudWxsIHx8IF9saXN0ZW5lcnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0VYQ0VQVElPTlM7CisKKyAgICAgICAgYm9vbGVhbiByZWVudHJhbnQgPSBfZmlyaW5nOworICAgICAgICBfZmlyaW5nID0gdHJ1ZTsKKyAgICAgICAgTGlzdCBleGNlcHRpb25zID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcmVFdmVudChldmVudCwgaXRyLm5leHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhpcyB3YXNuJ3QgYSByZWVudHJhbnQgY2FsbCwgcmVjb3JkIHRoYXQgd2UncmUgbm8gbG9uZ2VyCisgICAgICAgIC8vIGluIHRoZSBwcm9jZXNzIG9mIGZpcmluZyBldmVudHMgYW5kIHJlcGxhY2Ugb3VyIGluaXRpYWwgbGlzdGVuZXIKKyAgICAgICAgLy8gbGlzdCB3aXRoIHRoZSBzZXQgb2YgbmV3IGxpc3RlbmVycworICAgICAgICBpZiAoIXJlZW50cmFudCkgeworICAgICAgICAgICAgX2ZpcmluZyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKF9uZXdMaXN0ZW5lcnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfbGlzdGVuZXJzID0gX25ld0xpc3RlbmVyczsKKyAgICAgICAgICAgIF9uZXdMaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9FWENFUFRJT05TOworICAgICAgICByZXR1cm4gKEV4Y2VwdGlvbltdKSBleGNlcHRpb25zLnRvQXJyYXkKKyAgICAgICAgICAgIChuZXcgRXhjZXB0aW9uW2V4Y2VwdGlvbnMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGZpcmUgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBnaXZlbiBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlRXZlbnQoT2JqZWN0IGV2ZW50LCBPYmplY3QgbGlzdGVuZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgY29udGFpbmVyIGZvciBsaXN0ZW5lcnMuIFVzZXMgYSBsaW5rZWQgbGlzdCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIG5ld0xpc3RlbmVyQ29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRMaXN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9CYXNlMTZFbmNvZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0Jhc2UxNkVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGViMDUyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9CYXNlMTZFbmNvZGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKKy8qKgorICogQmFzZSAxNiBlbmNvZGVyLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlMTZFbmNvZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBIRVggPSBuZXcgY2hhcltdeworICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKyAgICAgICAgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicgfTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYnl0ZXMgdG8gYSBiYXNlMTYgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShieXRlW10gYnl0ZUFycmF5KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBoZXhCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGJ5dGVBcnJheS5sZW5ndGggKiAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlQXJyYXkubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA+PSAwOyBqLS0pCisgICAgICAgICAgICAgICAgaGV4QnVmZmVyLmFwcGVuZChIRVhbKGJ5dGVBcnJheVtpXSA+PiAoaiAqIDQpKSAmIDB4Rl0pOworICAgICAgICByZXR1cm4gaGV4QnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGJhc2UxNiBzdHJpbmcgaW50byBhIGJ5dGUgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBzKSB7CisgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBieXRlW10gciA9IG5ldyBieXRlW2xlbiAvIDJdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBkaWdpdDEgPSBzLmNoYXJBdChpICogMiksIGRpZ2l0MiA9IHMuY2hhckF0KGkgKiAyICsgMSk7CisgICAgICAgICAgICBpZiAoZGlnaXQxID49ICcwJyAmJiBkaWdpdDEgPD0gJzknKQorICAgICAgICAgICAgICAgIGRpZ2l0MSAtPSAnMCc7CisgICAgICAgICAgICBlbHNlIGlmIChkaWdpdDEgPj0gJ0EnICYmIGRpZ2l0MSA8PSAnRicpCisgICAgICAgICAgICAgICAgZGlnaXQxIC09ICdBJyAtIDEwOworICAgICAgICAgICAgaWYgKGRpZ2l0MiA+PSAnMCcgJiYgZGlnaXQyIDw9ICc5JykKKyAgICAgICAgICAgICAgICBkaWdpdDIgLT0gJzAnOworICAgICAgICAgICAgZWxzZSBpZiAoZGlnaXQyID49ICdBJyAmJiBkaWdpdDIgPD0gJ0YnKQorICAgICAgICAgICAgICAgIGRpZ2l0MiAtPSAnQScgLSAxMDsKKworICAgICAgICAgICAgcltpXSA9IChieXRlKSAoKGRpZ2l0MSA8PCA0KSArIGRpZ2l0Mik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9CeXRlY29kZVdyaXRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9CeXRlY29kZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Njc1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0J5dGVjb2RlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgc2VycC5ieXRlY29kZS5CQ0NsYXNzOworCisvKioKKyAqIENvbnRyb2wgaG93IGVuaGFuY2VkIGJ5dGVjb2RlIGlzIHdyaXR0ZW4uCisgKgorICogQGF1dGhvciBTdGV2ZSBLaW0KKyAqLworcHVibGljIGludGVyZmFjZSBCeXRlY29kZVdyaXRlciB7CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShCQ0NsYXNzIHR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQnl0ZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQnl0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMwMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9CeXRlcy5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGNhbWUgZnJvbSB0aGUgQXBhY2hlIENvbW1vbnMgSWQgc2FuZGJveCBwcm9qZWN0IGluIHN1cHBvcnQNCisgKiBvZiB0aGUgVVVJREdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbi4NCisgKg0KKyAqIDxwPlN0YXRpYyBtZXRob2RzIGZvciBtYW5hZ2luZyBieXRlIGFycmF5cyAoYWxsIG1ldGhvZHMgZm9sbG93IEJpZw0KKyAqIEVuZGlhbiBvcmRlciB3aGVyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIGluIGZyb250KS48L3A+DQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIEJ5dGVzIHsNCisNCisgICAgLyoqDQorICAgICAqIDxwPkhpZGUgY29uc3RydWN0b3IgaW4gdXRpbGl0eSBjbGFzcy48L3A+DQorICAgICAqLw0KKyAgICBwcml2YXRlIEJ5dGVzKCkgew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBcHBlbmRzIHR3byBieXRlcyBhcnJheSBpbnRvIG9uZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGEgQSBieXRlW10uDQorICAgICAqIEBwYXJhbSBiIEEgYnl0ZVtdLg0KKyAgICAgKiBAcmV0dXJuIEEgYnl0ZVtdLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gYXBwZW5kKGJ5dGVbXSBhLCBieXRlW10gYikgew0KKyAgICAgICAgYnl0ZVtdIHogPSBuZXcgYnl0ZVthLmxlbmd0aCArIGIubGVuZ3RoXTsNCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYSwgMCwgeiwgMCwgYS5sZW5ndGgpOw0KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCAwLCB6LCBhLmxlbmd0aCwgYi5sZW5ndGgpOw0KKyAgICAgICAgcmV0dXJuIHo7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSA4LWJ5dGUgYXJyYXkgYnVpbHQgZnJvbSBhIGxvbmcuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgdG8gY29udmVydC4NCisgICAgICogQHJldHVybiBBIGJ5dGVbXS4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZXMobG9uZyBuKSB7DQorICAgICAgICByZXR1cm4gdG9CeXRlcyhuLCBuZXcgYnl0ZVs4XSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEJ1aWxkIGEgOC1ieXRlIGFycmF5IGZyb20gYSBsb25nLiAgTm8gY2hlY2sgaXMgcGVyZm9ybWVkIG9uIHRoZQ0KKyAgICAgKiBhcnJheSBsZW5ndGguDQorICAgICAqDQorICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgdG8gY29udmVydC4NCisgICAgICogQHBhcmFtIGIgVGhlIGFycmF5IHRvIGZpbGwuDQorICAgICAqIEByZXR1cm4gQSBieXRlW10uDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGIpIHsNCisgICAgICAgIGJbN10gPSAoYnl0ZSkgKG4pOw0KKyAgICAgICAgbiA+Pj49IDg7DQorICAgICAgICBiWzZdID0gKGJ5dGUpIChuKTsNCisgICAgICAgIG4gPj4+PSA4Ow0KKyAgICAgICAgYls1XSA9IChieXRlKSAobik7DQorICAgICAgICBuID4+Pj0gODsNCisgICAgICAgIGJbNF0gPSAoYnl0ZSkgKG4pOw0KKyAgICAgICAgbiA+Pj49IDg7DQorICAgICAgICBiWzNdID0gKGJ5dGUpIChuKTsNCisgICAgICAgIG4gPj4+PSA4Ow0KKyAgICAgICAgYlsyXSA9IChieXRlKSAobik7DQorICAgICAgICBuID4+Pj0gODsNCisgICAgICAgIGJbMV0gPSAoYnl0ZSkgKG4pOw0KKyAgICAgICAgbiA+Pj49IDg7DQorICAgICAgICBiWzBdID0gKGJ5dGUpIChuKTsNCisNCisgICAgICAgIHJldHVybiBiOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBCdWlsZCBhIGxvbmcgZnJvbSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBhcnJheS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGVbXSB0byBjb252ZXJ0Lg0KKyAgICAgKiBAcmV0dXJuIEEgbG9uZy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgbG9uZyB0b0xvbmcoYnl0ZVtdIGIpIHsNCisgICAgICAgIHJldHVybiAoKCgobG9uZykgYls3XSkgJiAweEZGKQ0KKyAgICAgICAgICAgICAgICArICgoKChsb25nKSBiWzZdKSAmIDB4RkYpIDw8IDgpDQorICAgICAgICAgICAgICAgICsgKCgoKGxvbmcpIGJbNV0pICYgMHhGRikgPDwgMTYpDQorICAgICAgICAgICAgICAgICsgKCgoKGxvbmcpIGJbNF0pICYgMHhGRikgPDwgMjQpDQorICAgICAgICAgICAgICAgICsgKCgoKGxvbmcpIGJbM10pICYgMHhGRikgPDwgMzIpDQorICAgICAgICAgICAgICAgICsgKCgoKGxvbmcpIGJbMl0pICYgMHhGRikgPDwgNDApDQorICAgICAgICAgICAgICAgICsgKCgoKGxvbmcpIGJbMV0pICYgMHhGRikgPDwgNDgpDQorICAgICAgICAgICAgICAgICsgKCgoKGxvbmcpIGJbMF0pICYgMHhGRikgPDwgNTYpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgKiBDb21wYXJlcyB0d28gYnl0ZSBhcnJheXMgZm9yIGVxdWFsaXR5Lg0KKyAgICAqDQorICAgICogQHBhcmFtIGEgQSBieXRlW10uDQorICAgICogQHBhcmFtIGIgQSBieXRlW10uDQorICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhcnJheXMgaGF2ZSBpZGVudGljYWwgY29udGVudHMuDQorICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVFcXVhbChieXRlW10gYSwgYnl0ZVtdIGIpIHsNCisgICAgICAgIGludCBhTGVuZ3RoID0gYS5sZW5ndGg7DQorICAgICAgICBpZiAoYUxlbmd0aCAhPSBiLmxlbmd0aCkgew0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGFbaV0gIT0gYltpXSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDxwPkNvbXBhcmVzIHR3byBieXRlIGFycmF5cyBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+Q29tcGFyYWJsZTwvY29kZT4uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBsaHMgLSBsZWZ0IGhhbmQgdmFsdWUgaW4gdGhlIGNvbXBhcmlzb24gb3BlcmF0aW9uLg0KKyAgICAgKiBAcGFyYW0gcmhzIC0gcmlnaHQgaGFuZCB2YWx1ZSBpbiB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb24uDQorICAgICAqIEByZXR1cm4gIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIA0KKyAgICAgKiA8Y29kZT5saHM8L2NvZGU+IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiANCisgICAgICogPGNvZGU+cmhzPC9jb2RlPi4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhieXRlW10gbGhzLCBieXRlW10gcmhzKSB7DQorICAgICAgICBpZiAobGhzID09IHJocykgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGxocyA9PSBudWxsKSB7DQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJocyA9PSBudWxsKSB7DQorICAgICAgICAgICAgcmV0dXJuICsxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGxocy5sZW5ndGggIT0gcmhzLmxlbmd0aCkgew0KKyAgICAgICAgICAgIHJldHVybiAoKGxocy5sZW5ndGggPCByaHMubGVuZ3RoKSA/IC0xIDogKzEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBpZiAobGhzW2ldIDwgcmhzW2ldKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGxoc1tpXSA+IHJoc1tpXSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQnVpbGQgYSBzaG9ydCBmcm9tIGZpcnN0IDIgYnl0ZXMgb2YgdGhlIGFycmF5Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYiBUaGUgYnl0ZVtdIHRvIGNvbnZlcnQuDQorICAgICAqIEByZXR1cm4gQSBzaG9ydC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgc2hvcnQgdG9TaG9ydChieXRlW10gYikgew0KKyAgICAgICAgcmV0dXJuICAoc2hvcnQpICgoYlsxXSAmIDB4RkYpICsgKChiWzBdICYgMHhGRikgPDwgOCkpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQ2xvc2VhYmxlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0Nsb3NlYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTU4MTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0Nsb3NlYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCisvKioKKyAqIEdlbmVyaWMgaW50ZXJmYWNlIGZvciBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGNsb3NlZCBzbyB0aGF0IGhlbHBlcnMKKyAqIGNhbiB0cmVhdGUgdGhlbSBpbiBhIGdlbmVyaWMgd2F5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2xvc2VhYmxlIHsKKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQ29kZUZvcm1hdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9Db2RlRm9ybWF0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0MDdiOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvQ29kZUZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgc29tZSBjb21tb24gSmF2YSBzb3VyY2UgY29kZSBmb3JtYXR0aW5nIG9wdGlvbnMuIFRoZQorICogY2xhc3MgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGJ1ZmZlciBmb3IgZm9ybWF0dGVkIEphdmEgY29kZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29kZUZvcm1hdCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX3NlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIHByaXZhdGUgU3RyaW5nIF90YWIgPSAiXHQiOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3BhY2VCZWZvcmVQYXJlbiA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3BhY2VJblBhcmVuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9icmFjZU9uU2FtZUxpbmUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfYnJhY2VBdFNhbWVUYWJMZXZlbCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc2NvcmVCZWZvcmVGaWVsZE5hbWUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBfbGluZXNCZXR3ZWVuU2VjdGlvbnMgPSAxOworCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc3BhY2VzIHRvIHVzZSBmb3IgdGFiczsgMCBtZWFucyB0byB1c2UgYWN0dWFsIHRhYgorICAgICAqIGNoYXJhY3RlcnMuIERlZmF1bHRzIHRvIDAuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUYWJTcGFjZXMoKSB7CisgICAgICAgIHJldHVybiAoX3RhYi5lcXVhbHMoIlx0IikpID8gMCA6IF90YWIubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzcGFjZXMgdG8gdXNlIGZvciB0YWJzOyAwIG1lYW5zIHRvIHVzZSBhY3R1YWwgdGFiCisgICAgICogY2hhcmFjdGVycy4gRGVmYXVsdHMgdG8gMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJTcGFjZXMoaW50IHRhYikgeworICAgICAgICBpZiAodGFiID09IDApCisgICAgICAgICAgICBfdGFiID0gIlx0IjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgdGFicyA9IG5ldyBTdHJpbmdCdWZmZXIodGFiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiOyBpKyspCisgICAgICAgICAgICAgICAgdGFicy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIF90YWIgPSB0YWJzLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBsYWNlIGEgc3BhY2UgYmVmb3JlIHBhcmVudGhlc2VzLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTcGFjZUJlZm9yZVBhcmVuKCkgeworICAgICAgICByZXR1cm4gX3NwYWNlQmVmb3JlUGFyZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBwbGFjZSBhIHNwYWNlIGJlZm9yZSBwYXJlbnRoZXNlcy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3BhY2VCZWZvcmVQYXJlbihib29sZWFuIHNwYWNlQmVmb3JlUGFyZW4pIHsKKyAgICAgICAgX3NwYWNlQmVmb3JlUGFyZW4gPSBzcGFjZUJlZm9yZVBhcmVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcGxhY2UgYSBzcGFjZSB3aXRoaW4gcGFyZW50aGVzZXMuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFNwYWNlSW5QYXJlbigpIHsKKyAgICAgICAgcmV0dXJuIF9zcGFjZUluUGFyZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBwbGFjZSBhIHNwYWNlIHdpdGhpbiBwYXJlbnRoZXNlcy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3BhY2VJblBhcmVuKGJvb2xlYW4gc3BhY2VJblBhcmVuKSB7CisgICAgICAgIF9zcGFjZUluUGFyZW4gPSBzcGFjZUluUGFyZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBwbGFjZSBvcGVuaW5nIGJyYWNlcyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZQorICAgICAqIGJsb2NrIGRlY2xhcmF0aW9uLCBvciBvbiB0aGUgbmV4dCBsaW5lLiBEZWZhdWx0cyB0byBzYW1lIGxpbmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QnJhY2VPblNhbWVMaW5lKCkgeworICAgICAgICByZXR1cm4gX2JyYWNlT25TYW1lTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBsYWNlIG9wZW5pbmcgYnJhY2VzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlCisgICAgICogYmxvY2sgZGVjbGFyYXRpb24sIG9yIG9uIHRoZSBuZXh0IGxpbmUuIERlZmF1bHRzIHRvIHNhbWUgbGluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCcmFjZU9uU2FtZUxpbmUoYm9vbGVhbiBicmFjZU9uU2FtZUxpbmUpIHsKKyAgICAgICAgX2JyYWNlT25TYW1lTGluZSA9IGJyYWNlT25TYW1lTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBsYWNlIGJyYWNlcyBhdCB0aGUgc2FtZSB0YWIgbGV2ZWwgYXMgdGhlIGNvZGUgd2l0aGluCisgICAgICogdGhlIGJsb2NrLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCcmFjZUF0U2FtZVRhYkxldmVsKCkgeworICAgICAgICByZXR1cm4gX2JyYWNlQXRTYW1lVGFiTGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBwbGFjZSBicmFjZXMgYXQgdGhlIHNhbWUgdGFiIGxldmVsIGFzIHRoZSBjb2RlIHdpdGhpbgorICAgICAqIHRoZSBibG9jay4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnJhY2VBdFNhbWVUYWJMZXZlbChib29sZWFuIGJyYWNlQXRTYW1lVGFiTGV2ZWwpIHsKKyAgICAgICAgX2JyYWNlQXRTYW1lVGFiTGV2ZWwgPSBicmFjZUF0U2FtZVRhYkxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcGxhY2UgYW4gdW5kZXJzY29yZSBiZWZvcmUgcHJpdmF0ZSBmaWVsZCBuYW1lcy4gRGVmYXVsdHMKKyAgICAgKiB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTY29yZUJlZm9yZUZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zY29yZUJlZm9yZUZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHBsYWNlIGFuIHVuZGVyc2NvcmUgYmVmb3JlIHByaXZhdGUgZmllbGQgbmFtZXMuIERlZmF1bHRzCisgICAgICogdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NvcmVCZWZvcmVGaWVsZE5hbWUoYm9vbGVhbiBzY29yZUJlZm9yZUZpZWxkTmFtZSkgeworICAgICAgICBfc2NvcmVCZWZvcmVGaWVsZE5hbWUgPSBzY29yZUJlZm9yZUZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVtcHR5IGxpbmVzIGJldHdlZW4gY29kZSBzZWN0aW9ucy4gRGVmYXVsdHMgdG8gMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExpbmVzQmV0d2VlblNlY3Rpb25zKCkgeworICAgICAgICByZXR1cm4gX2xpbmVzQmV0d2VlblNlY3Rpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZW1wdHkgbGluZXMgYmV0d2VlbiBzZWN0aW9ucy4gRGVmYXVsdHMgdG8gMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5lc0JldHdlZW5TZWN0aW9ucyhpbnQgbGluZXNCZXR3ZWVuU2VjdGlvbnMpIHsKKyAgICAgICAgX2xpbmVzQmV0d2VlblNlY3Rpb25zID0gbGluZXNCZXR3ZWVuU2VjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGxpbmUgY2hhcmFjdGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVuZGwoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBnaXZlbiBudW1iZXIgb2YgbmV3IGxpbmUgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZGwoaW50IG51bSkgeworICAgICAgICBpZiAobnVtID09IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIGlmIChudW0gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBfc2VwOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKF9zZXAubGVuZ3RoKCkgKiBudW0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKQorICAgICAgICAgICAgYnVmLmFwcGVuZChfc2VwKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG5ldyBsaW5lIGNoYXJhY3RlcnMsIGZvbGxvd2VkIGJ5CisgICAgICogdGhlIGdpdmVuIHRhYiBsZXZlbCBpbmRlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZGwoaW50IG51bSwgaW50IHRhYnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEVuZGwobnVtKSArIGdldFRhYih0YWJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4geyNnZXRMaW5lc0JldHdlZW5TZWN0aW9uc30gKyAxIG5ldyBsaW5lIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRFbmRsKGdldExpbmVzQmV0d2VlblNlY3Rpb25zKCkgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHBhcmVudGhlc2VzIHN0cmluZy4gVXNlcnMgY2FuIGNob29zZSB0byBwbGFjZSBzcGFjZXMgYmVmb3JlCisgICAgICogYW5kIHdpdGhpbiBwYXJlbnRoZXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9wZW5QYXJlbihib29sZWFuIG1ldGhvZE9ySWYpIHsKKyAgICAgICAgaWYgKChfc3BhY2VCZWZvcmVQYXJlbiAmJiBtZXRob2RPcklmKSAmJiBfc3BhY2VJblBhcmVuKQorICAgICAgICAgICAgcmV0dXJuICIgKCAiOworICAgICAgICBpZiAoX3NwYWNlQmVmb3JlUGFyZW4gJiYgbWV0aG9kT3JJZikKKyAgICAgICAgICAgIHJldHVybiAiICgiOworICAgICAgICBpZiAoX3NwYWNlSW5QYXJlbikKKyAgICAgICAgICAgIHJldHVybiAiKCAiOworICAgICAgICByZXR1cm4gIigiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHBhcmVudGhlc2VzIHN0cmluZy4gVXNlcnMgY2FuIGNob29zZSB0byBwbGFjZSBzcGFjZXMgd2l0aGluCisgICAgICogcGFyZW50aGVzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbG9zZVBhcmVuKCkgeworICAgICAgICBpZiAoX3NwYWNlSW5QYXJlbikKKyAgICAgICAgICAgIHJldHVybiAiICkiOworICAgICAgICByZXR1cm4gIikiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaXJlZCBwYXJlbnRoZXNlcyBmb3IgZW1wdHkgbWV0aG9kIHBhcmFtZXRlcnMuIFVzZXJzIGNhbiBjaG9vc2UKKyAgICAgKiB0byBwbGFjZSBzcGFjZXMgYmVmb3JlIHBhcmVudGhlc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW5zKCkgeworICAgICAgICBpZiAoX3NwYWNlQmVmb3JlUGFyZW4pCisgICAgICAgICAgICByZXR1cm4gIiAoKSI7CisgICAgICAgIHJldHVybiAiKCkiOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gYnJhY2Ugc3RyaW5nLiBVc2VycyBjYW4gY2hvb3NlIHRvIHBsYWNlIGJyYWNlcyBvbiB0aGUgc2FtZQorICAgICAqIGxpbmUsIG9yIG9uIGEgbmV3IGxpbmUsIGFuZCBjYW4gY2hvb3NlIHRoZSBpbmRlbnRpbmcgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiTGV2ZWwgdGhlIHRhYiBsZXZlbCBvZiBjb2RlIHdpdGhpbiB0aGUgYnJhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9wZW5CcmFjZShpbnQgdGFiTGV2ZWwpIHsKKyAgICAgICAgaWYgKF9icmFjZU9uU2FtZUxpbmUpCisgICAgICAgICAgICByZXR1cm4gIiB7IjsKKyAgICAgICAgaWYgKF9icmFjZUF0U2FtZVRhYkxldmVsKQorICAgICAgICAgICAgcmV0dXJuIGdldEVuZGwoKSArIGdldFRhYih0YWJMZXZlbCkgKyAieyI7CisgICAgICAgIHJldHVybiBnZXRFbmRsKCkgKyBnZXRUYWIodGFiTGV2ZWwgLSAxKSArICJ7IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBicmFjZSBzdHJpbmcuIFVzZXJzIGNhbiBjaG9vc2UgdG8gcGxhY2UgYnJhY2VzIG9uIHRoZSBzYW1lCisgICAgICogbGluZSwgb3Igb24gYSBuZXcgbGluZSwgYW5kIGNhbiBjaG9vc2UgdGhlIGluZGVudGluZyBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWJMZXZlbCB0aGUgdGFiIGxldmVsIG9mIGNvZGUgd2l0aGluIHRoZSBicmFjZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xvc2VCcmFjZShpbnQgdGFiTGV2ZWwpIHsKKyAgICAgICAgaWYgKF9icmFjZUF0U2FtZVRhYkxldmVsKQorICAgICAgICAgICAgcmV0dXJuIGdldFRhYih0YWJMZXZlbCkgKyAifSI7CisgICAgICAgIHJldHVybiBnZXRUYWIodGFiTGV2ZWwgLSAxKSArICJ9IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRlbmRzIGRlY2xhcmF0aW9uLiBVc2VzIGNvbmZpZ3VyYXRpb24gb2Yge0BsaW5rICNvcGVuQnJhY2V9LAorICAgICAqIGJ1dCBwcmludHMgImV4dGVuZHMiIGluc3RlYWQgb2YgYSBicmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuZHNEZWMoaW50IHRhYkxldmVsKSB7CisgICAgICAgIGlmIChfYnJhY2VPblNhbWVMaW5lKQorICAgICAgICAgICAgcmV0dXJuICIgZXh0ZW5kcyI7CisgICAgICAgIGlmIChfYnJhY2VBdFNhbWVUYWJMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRFbmRsKCkgKyBnZXRUYWIodGFiTGV2ZWwpICsgImV4dGVuZHMiOworICAgICAgICByZXR1cm4gZ2V0RW5kbCgpICsgZ2V0VGFiKHRhYkxldmVsKSArICJleHRlbmRzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIGRlY2xhcmF0aW9uLiBVc2VzIGNvbmZpZ3VyYXRpb24gb2Yge0BsaW5rICNvcGVuQnJhY2V9LAorICAgICAqIGJ1dCBwcmludHMgImltcGxlbWVudHMiIGluc3RlYWQgb2YgYSBicmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudHNEZWMoaW50IHRhYkxldmVsKSB7CisgICAgICAgIGlmIChfYnJhY2VPblNhbWVMaW5lKQorICAgICAgICAgICAgcmV0dXJuICIgaW1wbGVtZW50cyI7CisgICAgICAgIGlmIChfYnJhY2VBdFNhbWVUYWJMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRFbmRsKCkgKyBnZXRUYWIodGFiTGV2ZWwpICsgImltcGxlbWVudHMiOworICAgICAgICByZXR1cm4gZ2V0RW5kbCgpICsgZ2V0VGFiKHRhYkxldmVsKSArICJpbXBsZW1lbnRzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgZGVjbGFyYXRpb24uIFVzZXMgY29uZmlndXJhdGlvbiBvZiB7QGxpbmsgI29wZW5CcmFjZX0sCisgICAgICogYnV0IHByaW50cyAidGhyb3dzIiBpbnN0ZWFkIG9mIGEgYnJhY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUaHJvd3NEZWMoaW50IHRhYkxldmVsKSB7CisgICAgICAgIGlmIChfYnJhY2VPblNhbWVMaW5lKQorICAgICAgICAgICAgcmV0dXJuICIgdGhyb3dzIjsKKyAgICAgICAgaWYgKF9icmFjZUF0U2FtZVRhYkxldmVsKQorICAgICAgICAgICAgcmV0dXJuIGdldEVuZGwoKSArIGdldFRhYih0YWJMZXZlbCkgKyAidGhyb3dzIjsKKyAgICAgICAgcmV0dXJuIGdldEVuZGwoKSArIGdldFRhYih0YWJMZXZlbCkgKyAidGhyb3dzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWIgc3RyaW5nLiBVc2VycyBjYW4gY2hvb3NlIHRvIHVzZSBzcGFjZXMgb3IgdGFiIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWIoKSB7CisgICAgICAgIHJldHVybiBnZXRUYWIoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFiIHN0cmluZy4gVXNlcnMgY2FuIGNob29zZSB0byB1c2Ugc3BhY2VzIG9yIHRhYiBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHRhYkxldmVsIHRoZSBudW1iZXIgb2YgdGFicworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFiKGludCB0YWJMZXZlbCkgeworICAgICAgICBpZiAodGFiTGV2ZWwgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgaWYgKHRhYkxldmVsID09IDEpCisgICAgICAgICAgICByZXR1cm4gX3RhYjsKKworICAgICAgICBTdHJpbmdCdWZmZXIgdGFicyA9IG5ldyBTdHJpbmdCdWZmZXIoX3RhYi5sZW5ndGgoKSAqIHRhYkxldmVsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJMZXZlbDsgaSsrKQorICAgICAgICAgICAgdGFicy5hcHBlbmQoX3RhYik7CisgICAgICAgIHJldHVybiB0YWJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaWVsZCBuYW1lIGZvciBnaXZlbiBzdWdnZXN0ZWQgbmFtZSwgcG9zc2libHkgYWRkaW5nCisgICAgICogbGVhZGluZyB1bmRlcnNjb3JlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChfc2NvcmVCZWZvcmVGaWVsZE5hbWUpID8gIl8iICsgZmllbGROYW1lIDogZmllbGROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW50ZXJuYWwgY29kZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBfYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBhcHBlbmQoYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IGFwcGVuZChieXRlIHZhbCkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgYXBwZW5kKGNoYXIgdmFsKSB7CisgICAgICAgIF9idWYuYXBwZW5kKHZhbCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBhcHBlbmQoZG91YmxlIHZhbCkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgYXBwZW5kKGZsb2F0IHZhbCkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgYXBwZW5kKGludCB2YWwpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IGFwcGVuZChsb25nIHZhbCkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgYXBwZW5kKHNob3J0IHZhbCkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgYXBwZW5kKE9iamVjdCB2YWwpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RW5kbCgpCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgZW5kbCgpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQoZ2V0RW5kbCgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RW5kbChpbnQpCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgZW5kbChpbnQgbnVtKSB7CisgICAgICAgIF9idWYuYXBwZW5kKGdldEVuZGwobnVtKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEVuZGwoaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgZW5kbChpbnQgbnVtLCBpbnQgdGFicykgeworICAgICAgICBfYnVmLmFwcGVuZChnZXRFbmRsKG51bSwgdGFicykpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRBZnRlclNlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBhZnRlclNlY3Rpb24oKSB7CisgICAgICAgIF9idWYuYXBwZW5kKGdldEFmdGVyU2VjdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3BlblBhcmVuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgb3BlblBhcmVuKGJvb2xlYW4gbWV0aG9kT3JJZikgeworICAgICAgICBfYnVmLmFwcGVuZChnZXRPcGVuUGFyZW4obWV0aG9kT3JJZikpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDbG9zZVBhcmVuCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgY2xvc2VQYXJlbigpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQoZ2V0Q2xvc2VQYXJlbigpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGFyZW5zCisgICAgICovCisgICAgcHVibGljIENvZGVGb3JtYXQgcGFyZW5zKCkgeworICAgICAgICBfYnVmLmFwcGVuZChnZXRQYXJlbnMoKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldE9wZW5CcmFjZQorICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IG9wZW5CcmFjZShpbnQgdGFiTGV2ZWwpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQoZ2V0T3BlbkJyYWNlKHRhYkxldmVsKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldENsb3NlQnJhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBjbG9zZUJyYWNlKGludCB0YWJMZXZlbCkgeworICAgICAgICBfYnVmLmFwcGVuZChnZXRDbG9zZUJyYWNlKHRhYkxldmVsKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEV4dGVuZHNEZWMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBleHRlbmRzRGVjKGludCB0YWJMZXZlbCkgeworICAgICAgICBfYnVmLmFwcGVuZChnZXRFeHRlbmRzRGVjKHRhYkxldmVsKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEltcGxlbWVudHNEZWMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBpbXBsZW1lbnRzRGVjKGludCB0YWJMZXZlbCkgeworICAgICAgICBfYnVmLmFwcGVuZChnZXRJbXBsZW1lbnRzRGVjKHRhYkxldmVsKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRocm93c0RlYworICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IHRocm93c0RlYyhpbnQgdGFiTGV2ZWwpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQoZ2V0VGhyb3dzRGVjKHRhYkxldmVsKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRhYgorICAgICAqLworICAgIHB1YmxpYyBDb2RlRm9ybWF0IHRhYigpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQoZ2V0VGFiKCkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUYWIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCB0YWIoaW50IHRhYkxldmVsKSB7CisgICAgICAgIF9idWYuYXBwZW5kKGdldFRhYih0YWJMZXZlbCkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRGaWVsZE5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29kZUZvcm1hdCBmaWVsZE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQoZ2V0RmllbGROYW1lKG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGludGVybmFsIGNvZGUgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW50ZXJuYWwgYnVmZmVyIGFzIGEgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBfYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIF9idWYubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhIGNvcHkgb2YgdGhpcyBjb2RlIGZvcm1hdCBvYmplY3Qgd2l0aCBhbGwgdGhlIHNhbWUgZm9ybWF0dGluZworICAgICAqIHNldHRpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIENvZGVGb3JtYXQgZm9ybWF0ID0gbmV3IENvZGVGb3JtYXQoKTsKKyAgICAgICAgZm9ybWF0Ll90YWIgPSBfdGFiOworICAgICAgICBmb3JtYXQuX3NwYWNlQmVmb3JlUGFyZW4gPSBfc3BhY2VCZWZvcmVQYXJlbjsKKyAgICAgICAgZm9ybWF0Ll9zcGFjZUluUGFyZW4gPSBfc3BhY2VJblBhcmVuOworICAgICAgICBmb3JtYXQuX2JyYWNlT25TYW1lTGluZSA9IF9icmFjZU9uU2FtZUxpbmU7CisgICAgICAgIGZvcm1hdC5fYnJhY2VBdFNhbWVUYWJMZXZlbCA9IF9icmFjZUF0U2FtZVRhYkxldmVsOworICAgICAgICBmb3JtYXQuX3Njb3JlQmVmb3JlRmllbGROYW1lID0gX3Njb3JlQmVmb3JlRmllbGROYW1lOworICAgICAgICBmb3JtYXQuX2xpbmVzQmV0d2VlblNlY3Rpb25zID0gX2xpbmVzQmV0d2VlblNlY3Rpb25zOworICAgICAgICByZXR1cm4gZm9ybWF0OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvRXZlbnRNYW5hZ2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0V2ZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGZlYjgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0V2ZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogQmFzaWMgZXZlbnQgbWFuYWdlciBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBFdmVudE1hbmFnZXIgeworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBpbnN0YW5jZSBpcyBpbiB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSByZWFkLW9ubHkgbGlzdCBvZiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0TGlzdGVuZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBGaXJlIHRoZSBnaXZlbiBldmVudCB0byBhbGwgbGlzdGVuZXJzLCByZXR1cm5pbmcgYW55IGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIEV4Y2VwdGlvbltdIGZpcmVFdmVudChPYmplY3QgZXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9GaWxlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9GaWxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjEwY2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0ZpbGVzLmphdmEKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZXhjZXB0aW9uLk5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBVdGlsaXR5IG9wZXJhdGlvbnMgb24gZmlsZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEZpbGVzIHsKKworICAgIC8qKgorICAgICAqIEJhY2t1cCB0aGUgZ2l2ZW4gZmlsZSB0byBhIG5ldyBmaWxlIGNhbGxlZCAmbHQ7ZmlsZS1uYW1lJmd0O34uIElmCisgICAgICogdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgYSBiYWNrdXAgY291bGQgbm90IGJlIGNyZWF0ZWQsIHJldHVybnMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgYmFja3VwKEZpbGUgZmlsZSwgYm9vbGVhbiBjb3B5KSB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBjcmVhdGUgbmV3IGZpbGUgb2JqZWN0IGNvcHkgc28gd2UgZG9uJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbAorICAgICAgICBGaWxlIGNsb25lID0gbmV3IEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIEZpbGUgYmsgPSBuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIn4iKTsKKyAgICAgICAgaWYgKCFjbG9uZS5yZW5hbWVUbyhiaykpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29weShiaywgZmlsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldmVydCB0aGUgZ2l2ZW4gYmFja3VwIGZpbGUgdG8gdGhlIG9yaWdpbmFsIGxvY2F0aW9uLiBJZiB0aGUgZ2l2ZW4KKyAgICAgKiBmaWxlJ3MgbmFtZSBkb2VzIG5vdCBlbmQgaW4gJ34nLCB0aGUgJ34nIGlzIGFwcGVuZGVkIGJlZm9yZSBwcm9jZWVkaW5nLgorICAgICAqIElmIHRoZSBiYWNrdXAgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBjb3VsZCBub3QgYmUgcmV2ZXJ0ZWQsIHJldHVybnMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgcmV2ZXJ0KEZpbGUgYmFja3VwLCBib29sZWFuIGNvcHkpIHsKKyAgICAgICAgaWYgKGJhY2t1cCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghYmFja3VwLmdldE5hbWUoKS5lbmRzV2l0aCgifiIpKQorICAgICAgICAgICAgYmFja3VwID0gbmV3IEZpbGUoYmFja3VwLmdldFBhdGgoKSArICJ+Iik7CisgICAgICAgIGlmICghYmFja3VwLmV4aXN0cygpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY3JlYXRlIG5ldyBmaWxlIG9iamVjdCBjb3B5IHNvIHdlIGRvbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwKKyAgICAgICAgU3RyaW5nIHBhdGggPSBiYWNrdXAuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIEZpbGUgY2xvbmUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgRmlsZSBvcmlnID0gbmV3IEZpbGUocGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgaWYgKCFjbG9uZS5yZW5hbWVUbyhvcmlnKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb3B5KG9yaWcsIGJhY2t1cCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9yaWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzb3VyY2UgZmlsZSBmb3IgdGhlIGdpdmVuIGNsYXNzLCBvciBudWxsIGlmIHRoZQorICAgICAqIHNvdXJjZSBpcyBub3QgaW4gdGhlIENMQVNTUEFUSC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0U291cmNlRmlsZShDbGFzcyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzRmlsZShjbHMsICIuamF2YSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2xhc3MgZmlsZSBvZiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIG51bGwgaWYgdGhlCisgICAgICogY2xhc3MgaXMgaW4gYSBqYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENsYXNzRmlsZShDbGFzcyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzRmlsZShjbHMsICIuY2xhc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpbGUgZm9yIHRoZSBjbGFzcyByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRDbGFzc0ZpbGUoQ2xhc3MgY2xzLCBTdHJpbmcgZXh0KSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gU3RyaW5ncy5nZXRDbGFzc05hbWUoY2xzKTsKKworICAgICAgICAvLyBpZiBpdCdzIGFuIGlubmVyIGNsYXNzLCB1c2UgdGhlIHBhcmVudCBjbGFzcyBuYW1lCisgICAgICAgIGludCBpbm5lcklkeCA9IG5hbWUuaW5kZXhPZignJCcpOworICAgICAgICBpZiAoaW5uZXJJZHggIT0gLTEpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5uZXJJZHgpOworCisgICAgICAgIFVSTCByc3JjID0gY2xzLmdldFJlc291cmNlKG5hbWUgKyBleHQpOworICAgICAgICBpZiAocnNyYyAhPSBudWxsICYmIHJzcmMuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShVUkxEZWNvZGVyLmRlY29kZShyc3JjLmdldEZpbGUoKSkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpbGUgZm9yIHRoZSBnaXZlbiBwYWNrYWdlLiBJZiB0aGUgZ2l2ZW4gYmFzZSBkaXJlY3RvcnkKKyAgICAgKiBtYXRjaGVzIHRoZSBnaXZlbiBwYWNrYWdlIHN0cnVjdHVyZSwgaXQgd2lsbCBiZSB1c2VkIGFzLWlzLiBJZiBub3QsCisgICAgICogdGhlIHBhY2thZ2Ugc3RydWN0dXJlIHdpbGwgYmUgYWRkZWQgYmVuZWF0aCB0aGUgYmFzZSBkaXJlY3RvcnkuIElmCisgICAgICogdGhlIGJhc2UgZGlyZWN0b3J5IGlzIG51bGwsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUKKyAgICAgKiB1c2VkIGFzIHRoZSBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRQYWNrYWdlRmlsZShGaWxlIGJhc2UsIFN0cmluZyBwa2csIGJvb2xlYW4gbWtkaXJzKSB7CisgICAgICAgIGlmIChiYXNlID09IG51bGwpCisgICAgICAgICAgICBiYXNlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocGtnKSkgeworICAgICAgICAgICAgaWYgKG1rZGlycyAmJiAhYmFzZS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBiYXNlLm1rZGlycygpOworICAgICAgICAgICAgcmV0dXJuIGJhc2U7CisgICAgICAgIH0KKworICAgICAgICBwa2cgPSBwa2cucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgIEZpbGUgZmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYmFzZS5nZXRDYW5vbmljYWxQYXRoKCkuZW5kc1dpdGgocGtnKSkKKyAgICAgICAgICAgICAgICBmaWxlID0gYmFzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoYmFzZSwgcGtnKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWtkaXJzICYmICFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgZmlsZS5ta2RpcnMoKTsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSBtYXRjaGluZyBmaWxlLiBUaGUgc3RyaW5nIGlzIGZpcnN0CisgICAgICogdGVzdGVkIHRvIHNlZSBpZiBpdCBpcyBhbiBleGlzdGluZyBmaWxlIHBhdGguIElmIGl0IGRvZXMgbm90CisgICAgICogcmVwcmVzZW50IGFuIGV4aXN0aW5nIGZpbGUsIGl0IGlzIGNoZWNrZWQgYXMgYSByZXNvdXJjZSBuYW1lIG9mIGEKKyAgICAgKiBmaWxlLiBJZiBubyByZXNvdXJjZSBleGlzdHMsIHRoZW4gaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBwYXRoCisgICAgICogdG8gYSBmaWxlIHRoYXQgZG9lcyBub3QgZXhpc3QgeWV0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpbGUgcGF0aCBvciByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGxvYWRlciBhIGNsYXNzIGxvYWRlciB0byB1c2UgaW4gcmVzb3VyY2UgbG9va3VwLCBvciBudWxsCisgICAgICogdG8gdXNlIHRoZSB0aHJlYWQncyBjb250ZXh0IGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOworICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBmaWxlOworCisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIFVSTCB1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UobmFtZSk7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHVybEZpbGUgPSB1cmwuZ2V0RmlsZSgpOworICAgICAgICAgICAgaWYgKHVybEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgcnNyYyA9IG5ldyBGaWxlKFVSTERlY29kZXIuZGVjb2RlKHVybEZpbGUpKTsKKyAgICAgICAgICAgICAgICBpZiAocnNyYy5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJzcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBnbyBiYWNrIHRvIG9yaWdpbmFsIG5vbi1leGlzdGFudCBmaWxlIHBhdGgKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgd3JpdGVyIHRvIHRoZSBzdHJlYW0oc3Rkb3V0IG9yIHN0ZGVycikgb3IgZmlsZSBuYW1lZCBieSB0aGUKKyAgICAgKiBnaXZlbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRGaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXcml0ZXIgZ2V0V3JpdGVyKFN0cmluZyBmaWxlLCBDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCJzdGRvdXQiLmVxdWFscyhmaWxlKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisgICAgICAgIGlmICgic3RkZXJyIi5lcXVhbHMoZmlsZSkpCisgICAgICAgICAgICByZXR1cm4gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlV3JpdGVyKGdldEZpbGUoZmlsZSwgbG9hZGVyKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIG91dHB1dCBzdHJlYW0gdG8gdGhlIHN0cmVhbShzdGRvdXQgb3Igc3RkZXJyKSBvciBmaWxlIG5hbWVkCisgICAgICogYnkgdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oU3RyaW5nIGZpbGUsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICgic3Rkb3V0Ii5lcXVhbHMoZmlsZSkpCisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLm91dDsKKyAgICAgICAgaWYgKCJzdGRlcnIiLmVxdWFscyhmaWxlKSkKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZXJyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGdldEZpbGUoZmlsZSwgbG9hZGVyKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBhIGZpbGUuIFJldHVybiBmYWxzZSBpZiA8Y29kZT5mcm9tPC9jb2RlPiBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weShGaWxlIGZyb20sIEZpbGUgdG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmcm9tID09IG51bGwgfHwgdG8gPT0gbnVsbCB8fCAhZnJvbS5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZnJvbSk7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluYnVmID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4pOworICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG8pOworICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gb3V0YnVmID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dCk7CisgICAgICAgICAgICBmb3IgKGludCBiOyAoYiA9IGluYnVmLnJlYWQoKSkgIT0gLTE7IG91dGJ1Zi53cml0ZShiKSkgOworICAgICAgICAgICAgb3V0YnVmLmZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0Zvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0Zvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwYzNiYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDcwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKgorICogIyMjIHRoaW5ncyB0byBhZGQ6IC0gc2hvdWxkIHByb2JhYmx5IGJlIGEgU291cmNlVHJhY2tlcgorICogLSBpZiBhbiBlbnRyeSBpcyByZW1vdmVkLCBzaG91bGQgdGhlcmUgYmUgYW4gb3B0aW9uIHRvIHJlbW92ZSBjb21tZW50cworICoganVzdCBiZWZvcmUgdGhlIGVudHJ5KGEgbGEgamF2YWRvYyk/CisgKiAtIHNob3VsZCB3ZSBoYXZlIGFuIG9wdGlvbiB0byBjbGVhbiB1cCB3aGl0ZXNwYWNlPworICogLSBwb3RlbnRpYWxseSB3b3VsZCBiZSBpbnRlcmVzdGluZyB0byBhZGQgY29tbWVudHMgYWJvdXQgZWFjaAorICogcHJvcGVydHkgdGhhdCBPcGVuSlBBIGFkZHMgdG8gdGhpcyBvYmplY3QuIFdlJ2Qgd2FudCB0byBtYWtlIHRoZQorICogYXV0b21hdGljIGNvbW1lbnQtcmVtb3ZpbmcgY29kZSB3b3JrIGZpcnN0LCB0aG91Z2gsIHNvIHRoYXQgaWYKKyAqIHNvbWVvbmUgdGhlbiByZW1vdmVkIHRoZSBwcm9wZXJ0eSwgdGhlIGNvbW1lbnRzIHdvdWxkIGdvIGF3YXkuCisgKiAtIHdvdWxkIGJlIG5lYXQgaWYgRHVwbGljYXRlS2V5RXhjZXB0aW9uIGNvdWxkIHJlcG9ydCBsaW5lIG51bWJlcnMgb2YKKyAqIG9mZmVuZGluZyBlbnRyaWVzLgorICogLSBwdXRBbGwoKSB3aXRoIGFub3RoZXIgRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMgc2hvdWxkIGJlIHNtYXJ0ZXIKKyAqLworCisvKioKKyAqIEEgc3BlY2lhbGl6YXRpb24gb2Yge0BsaW5rIFByb3BlcnRpZXN9IHRoYXQgc3RvcmVzIGl0cyBjb250ZW50cworICogaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHdpdGggdGhlIHNhbWUgZm9ybWF0dGluZyBhcyB3YXMgdXNlZCB0byByZWFkCisgKiB0aGUgY29udGVudHMgZnJvbSBhbiBpbnB1dCBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgaXQgbWVhbnMKKyAqIHRoYXQgYSBwcm9wZXJ0aWVzIGZpbGUgbG9hZGVkIHZpYSB0aGlzIG9iamVjdCBhbmQgdGhlbiB3cml0dGVuCisgKiBiYWNrIG91dCBsYXRlciBvbiB3aWxsIG9ubHkgYmUgZGlmZmVyZW50IHdoZXJlIGNoYW5nZXMgb3IKKyAqIGFkZGl0aW9ucyB3ZXJlIG1hZGUuCisgKiBCeSBkZWZhdWx0LCB0aGUge0BsaW5rICNzdG9yZX0gbWV0aG9kIGluIHRoaXMgY2xhc3MgZG9lcyBub3QKKyAqIGJlaGF2ZSB0aGUgc2FtZSBhcyB7QGxpbmsgUHJvcGVydGllcyNzdG9yZX0uIFlvdSBjYW4gY2F1c2UgYW4KKyAqIGluc3RhbmNlIHRvIGFwcHJveGltYXRlIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgUHJvcGVydGllcyNzdG9yZX0KKyAqIGJ5IGludm9raW5nIHtAbGluayAjc2V0RGVmYXVsdEVudHJ5RGVsaW1pdGVyfSB3aXRoIDxjb2RlPj08L2NvZGU+LAorICoge0BsaW5rICNzZXRBZGRXaGl0ZXNwYWNlQWZ0ZXJEZWxpbWl0ZXJ9IHdpdGggPGNvZGU+ZmFsc2U8L2NvZGU+LCBhbmQKKyAqIHtAbGluayAjc2V0QWxsb3dEdXBsaWNhdGVzfSB3aXRoIDxjb2RlPnRydWU8L2NvZGU+LiBIb3dldmVyLCB0aGlzCisgKiB3aWxsIG9ubHkgaW5mbHVlbmNlIGhvdyB0aGUgaW5zdGFuY2Ugd2lsbCB3cml0ZSBuZXcgdmFsdWVzLCBub3QgaG93CisgKiBpdCB3aWxsIHdyaXRlIGV4aXN0aW5nIGtleS12YWx1ZSBwYWlycyB0aGF0IGFyZSBtb2RpZmllZC4KKyAqIEluIGNvbmp1bmN0aW9uIHdpdGggYSBjb25zZXJ2YXRpdmUgb3V0cHV0IHdyaXRlciwgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIG9ubHkgd3JpdGUgdG8gZGlzayBjaGFuZ2VzIC8gYWRkaXRpb25zLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBwZXJtaXQgZXNjYXBlZCAnICcsICc9JywgJzonCisgKiBjaGFyYWN0ZXJzIGluIGtleSBuYW1lcy4KKyAqCisgKiBAc2luY2UgMC4zLjMKKyAqLworcHVibGljIGNsYXNzIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzIGV4dGVuZHMgUHJvcGVydGllcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcy5jbGFzcyk7CisKKyAgICBwcml2YXRlIGNoYXIgZGVmYXVsdEVudHJ5RGVsaW1pdGVyID0gJzonOworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRXaGl0ZXNwYWNlQWZ0ZXJEZWxpbWl0ZXIgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5zZXJ0VGltZXN0YW1wID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFByb3BlcnR5U291cmNlIHNvdXJjZTsKKyAgICBwcml2YXRlIExpbmtlZEhhc2hTZXQgbmV3S2V5cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBIYXNoU2V0IG1vZGlmaWVkS2V5cyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAvLyBtYXJrZXIgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSBub3QgZGVzZXJpYWxpemluZworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaXNOb3REZXNlcmlhbGl6aW5nID0gdHJ1ZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGlzTG9hZGluZyA9IGZhbHNlOworCisgICAgcHVibGljIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcyhQcm9wZXJ0aWVzIGRlZmF1bHRzKSB7CisgICAgICAgIHN1cGVyKGRlZmF1bHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhcmFjdGVyIHRvIHVzZSBhcyBhIGRlbGltaXRlciBiZXR3ZWVuIHByb3BlcnR5IGtleXMgYW5kIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZhdWx0RW50cnlEZWxpbWl0ZXIgZWl0aGVyICc6JyBvciAnPScKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RW50cnlEZWxpbWl0ZXIoY2hhciBkZWZhdWx0RW50cnlEZWxpbWl0ZXIpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0RW50cnlEZWxpbWl0ZXIgPSBkZWZhdWx0RW50cnlEZWxpbWl0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayAjc2V0RGVmYXVsdEVudHJ5RGVsaW1pdGVyfQorICAgICAqLworICAgIHB1YmxpYyBjaGFyIGdldERlZmF1bHRFbnRyeURlbGltaXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEVudHJ5RGVsaW1pdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBwcm9wZXJ0aWVzIG9iamVjdCB3aWxsIGFkZCBhCisgICAgICogc3BhY2UgYWZ0ZXIgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXIoaWYgdGhlIGRlbGltaXRlciBpcyBub3QKKyAgICAgKiB0aGUgc3BhY2UgY2hhcmFjdGVyKS4gRWxzZSwgdGhpcyB3aWxsIG5vdCBhZGQgYSBzcGFjZS4KKyAgICAgKiBEZWZhdWx0IHZhbHVlOiA8Y29kZT50cnVlPC9jb2RlPi4gTm90ZSB0aGF0IHtAbGluaworICAgICAqIFByb3BlcnRpZXMjc3RvcmV9IG5ldmVyIHdyaXRlcyB3aGl0ZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkZFdoaXRlc3BhY2VBZnRlckRlbGltaXRlcihib29sZWFuIGFkZCkgeworICAgICAgICB0aGlzLmFkZFdoaXRlc3BhY2VBZnRlckRlbGltaXRlciA9IGFkZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcHJvcGVydGllcyBvYmplY3Qgd2lsbCBhZGQgYQorICAgICAqIHNwYWNlIGFmdGVyIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyKGlmIHRoZSBkZWxpbWl0ZXIgaXMgbm90CisgICAgICogdGhlIHNwYWNlIGNoYXJhY3RlcikuIEVsc2UsIHRoaXMgd2lsbCBub3QgYWRkIGEgc3BhY2UuCisgICAgICogRGVmYXVsdCB2YWx1ZTogPGNvZGU+dHJ1ZTwvY29kZT4uIE5vdGUgdGhhdCB7QGxpbmsKKyAgICAgKiBQcm9wZXJ0aWVzI3N0b3JlfSBuZXZlciB3cml0ZXMgd2hpdGVzcGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBZGRXaGl0ZXNwYWNlQWZ0ZXJEZWxpbWl0ZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZFdoaXRlc3BhY2VBZnRlckRlbGltaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcHJvcGVydGllcyBvYmplY3Qgd2lsbCBhZGQgYQorICAgICAqIHRpbWVzdGFtcCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBqdXN0IGFmdGVyIHRoZSBoZWFkZXIKKyAgICAgKiAoaWYgYW55KSBpcyBwcmludGVkLiBFbHNlLCB0aGlzIHdpbGwgbm90IGFkZCBhIHRpbWVzdGFtcC4KKyAgICAgKiBEZWZhdWx0IHZhbHVlOiA8Y29kZT5mYWxzZTwvY29kZT4uIE5vdGUgdGhhdCB7QGxpbmsKKyAgICAgKiBQcm9wZXJ0aWVzI3N0b3JlfSBhbHdheXMgd3JpdGVzIGEgdGltZXN0YW1wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluc2VydFRpbWVzdGFtcChib29sZWFuIGluc2VydFRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLmluc2VydFRpbWVzdGFtcCA9IGluc2VydFRpbWVzdGFtcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcHJvcGVydGllcyBvYmplY3Qgd2lsbCBhZGQgYQorICAgICAqIHRpbWVzdGFtcCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBqdXN0IGFmdGVyIHRoZSBoZWFkZXIKKyAgICAgKiAoaWYgYW55KSBpcyBwcmludGVkLiBFbHNlLCB0aGlzIHdpbGwgbm90IGFkZCBhIHRpbWVzdGFtcC4KKyAgICAgKiBEZWZhdWx0IHZhbHVlOiA8Y29kZT5mYWxzZTwvY29kZT4uIE5vdGUgdGhhdCB7QGxpbmsKKyAgICAgKiBQcm9wZXJ0aWVzI3N0b3JlfSBhbHdheXMgd3JpdGVzIGEgdGltZXN0YW1wLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEluc2VydFRpbWVzdGFtcCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGltZXN0YW1wOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgZHVwbGljYXRlIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQsIGFuZAorICAgICAqIHRoZSBsYXN0IHByb3BlcnR5IHNldHRpbmcgaW4gdGhlIGlucHV0IHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cworICAgICAqIHNldHRpbmdzLiBJZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCBkdXBsaWNhdGUgcHJvcGVydHkgZGVmaW5pdGlvbnMKKyAgICAgKiBpbiB0aGUgaW5wdXQgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIGR1cmluZyB7QGxpbmsgI2xvYWR9LgorICAgICAqIERlZmF1bHQgdmFsdWU6IDxjb2RlPmZhbHNlPC9jb2RlPi4gTm90ZSB0aGF0IHtAbGluaworICAgICAqIFByb3BlcnRpZXMjc3RvcmV9IGFsd2F5cyBhbGxvd3MgZHVwbGljYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0R1cGxpY2F0ZXMoYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKKyAgICAgICAgdGhpcy5hbGxvd0R1cGxpY2F0ZXMgPSBhbGxvd0R1cGxpY2F0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBkdXBsaWNhdGUgcHJvcGVydGllcyBhcmUgYWxsb3dlZCwgYW5kCisgICAgICogdGhlIGxhc3QgcHJvcGVydHkgc2V0dGluZyBpbiB0aGUgaW5wdXQgd2lsbCBvdmVyd3JpdGUgYW55IHByZXZpb3VzCisgICAgICogc2V0dGluZ3MuIElmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIGR1cGxpY2F0ZSBwcm9wZXJ0eSBkZWZpbml0aW9ucworICAgICAqIGluIHRoZSBpbnB1dCB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gZHVyaW5nIHtAbGluayAjbG9hZH0uCisgICAgICogRGVmYXVsdCB2YWx1ZTogPGNvZGU+ZmFsc2U8L2NvZGU+LiBOb3RlIHRoYXQge0BsaW5rCisgICAgICogUHJvcGVydGllcyNzdG9yZX0gYWx3YXlzIGFsbG93cyBkdXBsaWNhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEFsbG93RHVwbGljYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWxsb3dEdXBsaWNhdGVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KGtleSwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcHV0KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENpcmN1bXZlbnRzIHRoZSBzdXBlcmNsYXNzIHtAbGluayAjcHV0QWxsfSBpbXBsZW1lbnRhdGlvbiwKKyAgICAgKiBwdXR0aW5nIGFsbCB0aGUga2V5LXZhbHVlIHBhaXJzIHZpYSB7QGxpbmsgI3B1dH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtKSB7CisgICAgICAgIE1hcC5FbnRyeSBlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBwdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSBib29ra2VlcGluZyBjb2xsZWN0aW90bnMgYXMgd2VsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgIG5ld0tleXMucmVtb3ZlKGtleSk7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgc3VwZXIuY2xlYXIoKTsKKworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpCisgICAgICAgICAgICBzb3VyY2UuY2xlYXIoKTsKKworICAgICAgICBuZXdLZXlzLmNsZWFyKCk7CisgICAgICAgIG1vZGlmaWVkS2V5cy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzIGMgPSAoRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMpCisgICAgICAgICAgICBzdXBlci5jbG9uZSgpOworCisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgIGMuc291cmNlID0gKFByb3BlcnR5U291cmNlKSBzb3VyY2UuY2xvbmUoKTsKKworICAgICAgICBpZiAobW9kaWZpZWRLZXlzICE9IG51bGwpCisgICAgICAgICAgICBjLm1vZGlmaWVkS2V5cyA9IChIYXNoU2V0KSBtb2RpZmllZEtleXMuY2xvbmUoKTsKKworICAgICAgICBpZiAobmV3S2V5cyAhPSBudWxsKSB7CisgICAgICAgICAgICBjLm5ld0tleXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOworICAgICAgICAgICAgYy5uZXdLZXlzLmFkZEFsbChuZXdLZXlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisKKyAgICAgICAgaXNOb3REZXNlcmlhbGl6aW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIE9iamVjdCBvID0gc3VwZXIucHV0KGtleSwgdmFsKTsKKworICAgICAgICAvLyBpZiB3ZSdyZSBubyBsb25nZXIgbG9hZGluZyBmcm9tIHByb3BlcnRpZXMgYW5kIHRoaXMgcHV0CisgICAgICAgIC8vIHJlcHJlc2VudHMgYW4gYWN0dWFsIGNoYW5nZSBpbiB2YWx1ZSwgbWFyayB0aGUgbW9kaWZpY2F0aW9uCisgICAgICAgIC8vIG9yIGFkZGl0aW9uIGluIHRoZSBib29ra2VlcGluZyBjb2xsZWN0aW9ucy4KKyAgICAgICAgaWYgKCFpc0xvYWRpbmcgJiYgaXNOb3REZXNlcmlhbGl6aW5nICYmICF2YWwuZXF1YWxzKG8pKSB7CisgICAgICAgICAgICBpZiAobyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1vZGlmaWVkS2V5cy5hZGQoa2V5KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFuZXdLZXlzLmNvbnRhaW5zKGtleSkpCisgICAgICAgICAgICAgICAgbmV3S2V5cy5hZGQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgcHJvcGVydGllcyBpbiA8Y29kZT5pbjwvY29kZT4sIGFjY29yZGluZyB0byB0aGUgcnVsZXMKKyAgICAgKiBkZXNjcmliZWQgaW4ge0BsaW5rIFByb3BlcnRpZXMjbG9hZH0uIElmIHtAbGluayAjZ2V0QWxsb3dEdXBsaWNhdGVzfQorICAgICAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgd2lsbCB0aHJvdyBhIHtAbGluaworICAgICAqIER1cGxpY2F0ZUtleUV4Y2VwdGlvbn0gaWYgZHVwbGljYXRlIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUKKyAgICAgKiBlbmNvdW50ZXJlZC4KKyAgICAgKgorICAgICAqIEBzZWUgUHJvcGVydGllcyNsb2FkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvYWRQcm9wZXJ0aWVzKGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRQcm9wZXJ0aWVzKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzb3VyY2UgPSBuZXcgUHJvcGVydHlTb3VyY2UoKTsKKworICAgICAgICBQcm9wZXJ0eUxpbmVSZWFkZXIgcmVhZGVyID0gbmV3IFByb3BlcnR5TGluZVJlYWRlcihpbiwgc291cmNlKTsKKworICAgICAgICBTZXQgbG9hZGVkS2V5cyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eUxpbmUgbDsKKyAgICAgICAgICAgIChsID0gcmVhZGVyLnJlYWRQcm9wZXJ0eUxpbmUoKSkgIT0gbnVsbCAmJiBzb3VyY2UuYWRkKGwpOykgeworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBsLmxpbmUudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgY2hhciBjID0gMDsKKyAgICAgICAgICAgIGludCBwb3MgPSAwOworCisgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGluZS5sZW5ndGgoKSAmJiBpc1NwYWNlKGMgPSBsaW5lLmNoYXJBdChwb3MpKSkKKyAgICAgICAgICAgICAgICBwb3MrKzsKKworICAgICAgICAgICAgaWYgKChsaW5lLmxlbmd0aCgpIC0gcG9zKSA9PSAwCisgICAgICAgICAgICAgICAgfHwgbGluZS5jaGFyQXQocG9zKSA9PSAnIycgfHwgbGluZS5jaGFyQXQocG9zKSA9PSAnIScpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBrZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGluZS5sZW5ndGgoKSAmJiAhaXNTcGFjZShjID0gbGluZS5jaGFyQXQocG9zKyspKQorICAgICAgICAgICAgICAgICYmIGMgIT0gJz0nICYmIGMgIT0gJzonKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IGxpbmUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxpbmUubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1NwYWNlKGMgPSBsaW5lLmNoYXJBdChwb3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHJlYWRFc2NhcGUobGluZSwgcG9zLCBrZXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNEZWxpbSA9IChjID09ICc6JyB8fCBjID09ICc9Jyk7CisKKyAgICAgICAgICAgIGZvciAoOyBwb3MgPCBsaW5lLmxlbmd0aCgpCisgICAgICAgICAgICAgICAgJiYgaXNTcGFjZShjID0gbGluZS5jaGFyQXQocG9zKSk7IHBvcysrKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgaWYgKCFpc0RlbGltICYmIChjID09ICc6JyB8fCBjID09ICc9JykpIHsKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGluZS5sZW5ndGgoKSAmJiBpc1NwYWNlKGMgPSBsaW5lLmNoYXJBdChwb3MpKSkKKyAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlbGVtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcihsaW5lLmxlbmd0aCgpIC0gcG9zKTsKKworICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxpbmUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBjID0gbGluZS5jaGFyQXQocG9zKyspOworICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBsaW5lLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxpbmUubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1NwYWNlKGMgPSBsaW5lLmNoYXJBdChwb3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZW5zdXJlQ2FwYWNpdHkobGluZS5sZW5ndGgoKSAtIHBvcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSByZWFkRXNjYXBlKGxpbmUsIHBvcywgZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbG9hZGVkS2V5cy5hZGQoa2V5LnRvU3RyaW5nKCkpICYmICFhbGxvd0R1cGxpY2F0ZXMpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUtleUV4Y2VwdGlvbihrZXkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCkpLCBlbGVtZW50LnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBsLnNldFByb3BlcnR5S2V5KGtleS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGwuc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcHV0KGtleS50b1N0cmluZygpLCBlbGVtZW50LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgbmV4dCBlc2NhcGVkIGNoYXJhY3RlcjogaGFuZGxlIG5ld2xpbmVzLCB0YWJzLCByZXR1cm5zLCBhbmQKKyAgICAgKiBmb3JtIGZlZWRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVzY2FwZWQgY2hhcmFjdGVyLCB0aGVuIHRyeSB0bworICAgICAqIGRlY29kZSB1bmljb2RlIGNoYXJhY3RlcnMuIEZpbmFsbHksIGp1c3QgYWRkIHRoZSBjaGFyYWN0ZXIgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBvZiB0aGUgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHJlYWRpbmcKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHdlIGFyZSBhcHBlbmRpbmcgdG8KKyAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgcmVhZGluZyBpcyBkb25lCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRFc2NhcGUoU3RyaW5nIHNvdXJjZSwgaW50IHBvcywgU3RyaW5nQnVmZmVyIHZhbHVlKSB7CisgICAgICAgIGNoYXIgYyA9IHNvdXJjZS5jaGFyQXQocG9zKyspOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnXGYnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnXHInKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgICAgIGlmIChwb3MgKyA0IDw9IHNvdXJjZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIHVuaSA9IChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50CisgICAgICAgICAgICAgICAgICAgICAgICAoc291cmNlLnN1YnN0cmluZyhwb3MsIHBvcyArIDQpLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZCh1bmkpOworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGhlYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcmUob3V0LCBoZWFkZXIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmUoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGhlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBlbmRXaXRoTmV3bGluZSA9IHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lbmRzSW5OZXdsaW5lOworCisgICAgICAgIC8vIE11c3QgYmUgSVNPLTg4NTktMSBlY29kaW5nIGFjY29yZGluZyB0byBQcm9wZXJ0aWVzLmxvYWQgamF2YWRvYworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIKKyAgICAgICAgICAgIChuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIklTTy04ODU5LTEiKSwgZmFsc2UpOworCisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIjIiArIGhlYWRlcik7CisKKyAgICAgICAgaWYgKGluc2VydFRpbWVzdGFtcCkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIjIiArIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKTsKKworICAgICAgICBMaXN0IGxpbmVzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgLy8gZmlyc3Qgd3JpdGUgYWxsIHRoZSBleGlzdGluZyBwcm9wcyBhcyB0aGV5IHdlcmUgaW5pdGlhbGx5IHJlYWQKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKQorICAgICAgICAgICAgbGluZXMuYWRkQWxsKHNvdXJjZSk7CisKKyAgICAgICAgLy8gbmV4dCB3cml0ZSBvdXQgbmV3IGtleXMsIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIGtleXMKKyAgICAgICAgTGlua2VkSGFzaFNldCBrZXlzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAga2V5cy5hZGRBbGwobmV3S2V5cyk7CisgICAgICAgIGtleXMuYWRkQWxsKGtleVNldCgpKTsKKworICAgICAgICBsaW5lcy5hZGRBbGwoa2V5cyk7CisKKyAgICAgICAga2V5cy5yZW1vdmUobnVsbCk7CisKKyAgICAgICAgYm9vbGVhbiBuZWVkc05ld2xpbmUgPSBmYWxzZTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaW5lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gaS5uZXh0KCk7CisKKyAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKCgoUHJvcGVydHlMaW5lKSBuZXh0KS53cml0ZSh3cml0ZXIsIGtleXMsIG5lZWRzTmV3bGluZSkpCisgICAgICAgICAgICAgICAgICAgIG5lZWRzTmV3bGluZSA9IGkuaGFzTmV4dCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIG5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGtleXMucmVtb3ZlKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlUHJvcGVydHkoa2V5LCB3cml0ZXIsIG5lZWRzTmV3bGluZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzTmV3bGluZSA9IGkuaGFzTmV4dCgpICYmIGtleXMuc2l6ZSgpID4gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG5ldyBvciBtb2RpZmllZCBwcm9wZXJ0aWVzIHdpbGwgY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIHRvIGVuZCB3aXRoIGEgbmV3bGluZQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kV2l0aE5ld2xpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGVuZCBpbiBhIG5ld2xpbmUgaWYgdGhlIHNvdXJjZSBlbmRlZCBpbiBpdAorICAgICAgICBpZiAoZW5kV2l0aE5ld2xpbmUpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOworCisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZVByb3BlcnR5KFN0cmluZyBrZXksIFByaW50V3JpdGVyIHdyaXRlciwKKyAgICAgICAgYm9vbGVhbiBuZWVkc05ld2xpbmUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFN0cmluZyB2YWwgPSBnZXRQcm9wZXJ0eShrZXkpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZm9ybWF0VmFsdWUoa2V5LCBzLCB0cnVlKTsKKyAgICAgICAgcy5hcHBlbmQoZGVmYXVsdEVudHJ5RGVsaW1pdGVyKTsKKyAgICAgICAgaWYgKGFkZFdoaXRlc3BhY2VBZnRlckRlbGltaXRlcikKKyAgICAgICAgICAgIHMuYXBwZW5kKCcgJyk7CisgICAgICAgIGZvcm1hdFZhbHVlKHZhbCwgcywgZmFsc2UpOworCisgICAgICAgIGlmIChuZWVkc05ld2xpbmUpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOworCisgICAgICAgIHdyaXRlci5wcmludChzKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhlIGdpdmVuIHN0cmluZyBhcyBhbiBlbmNvZGVkIHZhbHVlIGZvciBzdG9yYWdlLiBUaGlzIHdpbGwKKyAgICAgKiBwZXJmb3JtIGFueSBuZWNlc3NhcnkgZXNjYXBpbmcgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciB0aGUgdmFsdWUgdG8gZW5jb2RlCisgICAgICogQHBhcmFtIGJ1ZiB0aGUgYnVmZmVyIHRvIHdoaWNoIHRvIGFwcGVuZCB0aGUgZW5jb2RlZCB2YWx1ZQorICAgICAqIEBwYXJhbSBpc0tleSBpZiB0cnVlLCB0aGVuIHRoZSBzdHJpbmcgaXMgYSBQcm9wZXJ0eSBrZXksIG90aGVyd2lzZQorICAgICAqIGl0IGlzIGEgdmFsdWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdFZhbHVlKFN0cmluZyBzdHIsIFN0cmluZ0J1ZmZlciBidWYsCisgICAgICAgIGJvb2xlYW4gaXNLZXkpIHsKKyAgICAgICAgaWYgKGlzS2V5KSB7CisgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgYnVmLmVuc3VyZUNhcGFjaXR5KHN0ci5sZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYuZW5zdXJlQ2FwYWNpdHkoYnVmLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZXNjYXBlU3BhY2UgPSB0cnVlOworICAgICAgICBpbnQgc2l6ZSA9IHN0ci5sZW5ndGgoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gc3RyLmNoYXJBdChpKTsKKworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xmJykKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyAnKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZXNjYXBlU3BhY2UgPyAiXFwgIiA6ICIgIik7CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcXCcgfHwgYyA9PSAnIScgfHwgYyA9PSAnIycgfHwgYyA9PSAnPScgfHwgYyA9PSAnOicpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnXFwnKS5hcHBlbmQoYyk7CisgICAgICAgICAgICBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPiAnficpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXFx1MDAwMCIuc3Vic3RyaW5nKDAsIDYgLSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpLgorICAgICAgICAgICAgICAgICAgICBsZW5ndGgoKSkpLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMpOworCisgICAgICAgICAgICBpZiAoYyAhPSAnICcpCisgICAgICAgICAgICAgICAgZXNjYXBlU3BhY2UgPSBpc0tleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVwbGljYXRlS2V5RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIER1cGxpY2F0ZUtleUV4Y2VwdGlvbihTdHJpbmcga2V5LCBPYmplY3QgZmlyc3RWYWwsCisgICAgICAgICAgICBTdHJpbmcgc2Vjb25kVmFsKSB7CisgICAgICAgICAgICBzdXBlcihfbG9jLmdldCgiZHVwLWtleSIsIGtleSwgZmlyc3RWYWwsIHNlY29uZFZhbCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHRoZSBvcmlnaW5hbCBsaW5lIG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGU6IGNhbiBiZSBhCisgICAgICogcHJvcGVyIGtleS92YWx1ZSBwYWlyLCBvciBhIGNvbW1lbnQsIG9yIGp1c3Qgd2hpdGVzcGFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFByb3BlcnR5TGluZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlLZXk7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5VmFsdWU7CisKKyAgICAgICAgcHVibGljIFByb3BlcnR5TGluZShTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgdGhpcy5saW5lLmFwcGVuZChsaW5lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgbmV3bGluZSkgeworICAgICAgICAgICAgbGluZS5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKKyAgICAgICAgICAgIGxpbmUuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlLZXkoU3RyaW5nIHByb3BlcnR5S2V5KSB7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5S2V5ID0gcHJvcGVydHlLZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlLZXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgZ2l2ZW4gbGluZS4gSXQgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gaWYgdGhlIGxpbmUgaXMgYQorICAgICAgICAgKiBjb21tZW50LCBvciBpZiBpdCBpcyBhIHByb3BlcnR5IGFuZCBpdHMgdmFsdWUgaXMgdW5jaGFuZ2VkCisgICAgICAgICAqIGZyb20gdGhlIG9yaWdpbmFsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHcgdGhlIFByaW50V3JpdGVyIHRvIHdoaWNoIHRoZSB3cml0ZQorICAgICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgd2FzIGEga25vd24ga2V5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShQcmludFdyaXRlciBwdywgQ29sbGVjdGlvbiBrZXlzLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkc05ld2xpbmUpIHsKKyAgICAgICAgICAgIC8vIG5vIHByb3BlcnR5PyBJdCBtYXkgYmUgYSBjb21tZW50IG9yIGp1c3Qgd2hpdGVzcGFjZQorICAgICAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobmVlZHNOZXdsaW5lKQorICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQobGluZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB0aGUgc2FtZSB2YWx1ZSB3ZSBpbml0aWFsbHkgcmVhZDoKKyAgICAgICAgICAgIC8vIGlmIHNvLCB0aGVuIGp1c3Qgd3JpdGUgaXQgYmFjayBleGFjdGx5IGFzIGl0IHdhcyByZWFkCisgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsICYmIGNvbnRhaW5zS2V5KHByb3BlcnR5S2V5KSAmJgorICAgICAgICAgICAgICAgIChwcm9wZXJ0eVZhbHVlLmVxdWFscyhnZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSkpIHx8CisgICAgICAgICAgICAgICAgICAgICghbmV3S2V5cy5jb250YWlucyhwcm9wZXJ0eUtleSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtb2RpZmllZEtleXMuY29udGFpbnMocHJvcGVydHlLZXkpKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobmVlZHNOZXdsaW5lKQorICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQobGluZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGtleXMucmVtb3ZlKHByb3BlcnR5S2V5KTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG1vZGlmaWVkIG9yIGFkZGVkIHRoZSBzcGVjaWZpZWQga2V5LCB0aGVuIHdyaXRlCisgICAgICAgICAgICAvLyBpdCBiYWNrIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGluIHRoZSBmaWxlIGZyb20gd2hpY2ggaXQKKyAgICAgICAgICAgIC8vIHdhcyBvcmlnaW5hbGx5IHJlYWQsIHNvIHRoYXQgaXQgd2lsbCBiZSBpbiB0aGUgcHJveGltaXR5CisgICAgICAgICAgICAvLyB0byB0aGUgY29tbWVudAorICAgICAgICAgICAgaWYgKGNvbnRhaW5zS2V5KHByb3BlcnR5S2V5KSAmJgorICAgICAgICAgICAgICAgIChtb2RpZmllZEtleXMuY29udGFpbnMocHJvcGVydHlLZXkpIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld0tleXMuY29udGFpbnMocHJvcGVydHlLZXkpKSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLnJlbW92ZShwcm9wZXJ0eUtleSkpIDsKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JpdGVQcm9wZXJ0eShwcm9wZXJ0eUtleSwgcHcsIG5lZWRzTmV3bGluZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBuZXcgb3IgY2hhbmdlZCBwcm9wZXJ0eTogZG9uJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUHJvcGVydHlMaW5lUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgeworCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUxpbmVSZWFkZXIoSW5wdXRTdHJlYW0gaW4sIFByb3BlcnR5U291cmNlIHNvdXJjZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBNdXN0IGJlIElTTy04ODU5LTEgZWNvZGluZyBhY2NvcmRpbmcgdG8gUHJvcGVydGllcy5sb2FkIGphdmFkb2MKKyAgICAgICAgICAgIHN1cGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgTGluZUVuZGluZ1N0cmVhbShpbiwgc291cmNlKSwKKyAgICAgICAgICAgICAgICAiSVNPLTg4NTktMSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUxpbmUgcmVhZFByb3BlcnR5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgbCA9IHJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAobCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBQcm9wZXJ0eUxpbmUgcGwgPSBuZXcgUHJvcGVydHlMaW5lKGwpOworICAgICAgICAgICAgcmV0dXJuIHBsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIEZpbHRlcklucHV0U3RyZWFtIHRoYXQgbWVyZWx5IHJlbWVtYmVycyBpZiB0aGUgbGFzdAorICAgICAqIGNoYXJhY3RlciB0aGF0IGl0IHJlYWQgd2FzIGEgbmV3bGluZSBvciBub3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGluZUVuZGluZ1N0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3BlcnR5U291cmNlIHNvdXJjZTsKKworICAgICAgICBMaW5lRW5kaW5nU3RyZWFtKElucHV0U3RyZWFtIGluLCBQcm9wZXJ0eVNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKworICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IGMgPSBzdXBlci5yZWFkKCk7CisgICAgICAgICAgICBzb3VyY2UuZW5kc0luTmV3bGluZSA9IChjID09ICdcbicgfHwgYyA9PSAnXHInKTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IG4gPSBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgICAgICBzb3VyY2UuZW5kc0luTmV3bGluZSA9CisgICAgICAgICAgICAgICAgICAgIChiW24gKyBvZmYgLSAxXSA9PSAnXG4nIHx8IGJbbiArIG9mZiAtIDFdID09ICdccicpOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBMaW5rZWRMaXN0CisgICAgICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgeworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBlbmRzSW5OZXdsaW5lID0gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9KYXZhVmVyc2lvbnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvSmF2YVZlcnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3Mjg1YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvSmF2YVZlcnNpb25zLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgZGVhbGluZyB3aXRoIGRpZmZlcmVudCBKYXZhIHNwZWMgdmVyc2lvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEphdmFWZXJzaW9ucyB7CisKKyAgICAvKioKKyAgICAgKiBKYXZhIHZlcnNpb247IG9uZSBvZiAyLCAzLCA0LCA1LCA2LCBvciA3LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT047CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEVNUFRZX0NMQVNTRVMgPSBuZXcgQ2xhc3NbMF07CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBQQVJBTV9UWVBFID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBFTlVNX1RZUEUgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIEFOTk9fVFlQRSA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIEdFVF9TVEFDSyA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIFNFVF9TVEFDSyA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIEdFVF9DQVVTRSA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIElOSVRfQ0FVU0UgPSBudWxsOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3RyaW5nIHNwZWNWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIpOworICAgICAgICBpZiAoIjEuMiIuZXF1YWxzKHNwZWNWZXJzaW9uKSkKKyAgICAgICAgICAgIFZFUlNJT04gPSAyOworICAgICAgICBlbHNlIGlmICgiMS4zIi5lcXVhbHMoc3BlY1ZlcnNpb24pKQorICAgICAgICAgICAgVkVSU0lPTiA9IDM7CisgICAgICAgIGVsc2UgaWYgKCIxLjQiLmVxdWFscyhzcGVjVmVyc2lvbikpCisgICAgICAgICAgICBWRVJTSU9OID0gNDsKKyAgICAgICAgZWxzZSBpZiAoIjEuNSIuZXF1YWxzKHNwZWNWZXJzaW9uKSkKKyAgICAgICAgICAgIFZFUlNJT04gPSA1OworICAgICAgICBlbHNlIGlmICgiMS42Ii5lcXVhbHMoc3BlY1ZlcnNpb24pKQorICAgICAgICAgICAgVkVSU0lPTiA9IDY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFZFUlNJT04gPSA3OyAvLyBtYXliZSBzb21lZGF5Li4uCisKKyAgICAgICAgaWYgKFZFUlNJT04gPj0gNSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQQVJBTV9UWVBFID0gQ2xhc3MuZm9yTmFtZQorICAgICAgICAgICAgICAgICAgICAoImphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlIik7CisgICAgICAgICAgICAgICAgRU5VTV9UWVBFID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkVudW0iKTsKKyAgICAgICAgICAgICAgICBBTk5PX1RZUEUgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFZFUlNJT04gPj0gNCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBzdGFjayA9IENsYXNzLmZvck5hbWUoIltMamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50OyIpOworICAgICAgICAgICAgICAgIEdFVF9TVEFDSyA9IFRocm93YWJsZS5jbGFzcy5nZXRNZXRob2QoImdldFN0YWNrVHJhY2UiLAorICAgICAgICAgICAgICAgICAgICAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICAgICAgU0VUX1NUQUNLID0gVGhyb3dhYmxlLmNsYXNzLmdldE1ldGhvZCgic2V0U3RhY2tUcmFjZSIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyBzdGFjayB9KTsKKyAgICAgICAgICAgICAgICBHRVRfQ0FVU0UgPSBUaHJvd2FibGUuY2xhc3MuZ2V0TWV0aG9kKCJnZXRDYXVzZSIsCisgICAgICAgICAgICAgICAgICAgIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgICAgICBJTklUX0NBVVNFID0gVGhyb3dhYmxlLmNsYXNzLmdldE1ldGhvZCgiaW5pdENhdXNlIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117IFRocm93YWJsZS5jbGFzcyB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmVyc2lvbi1zcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSBjbGFzcyB0byBjaGVjaworICAgICAqIEByZXR1cm4gdGhlIEpESy12ZXJzaW9uLXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGNsYXNzCisgICAgICogQHNlZSAjZ2V0VmVyc2lvblNwZWNpZmljQ2xhc3MoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VmVyc2lvblNwZWNpZmljQ2xhc3MoQ2xhc3MgYmFzZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZlcnNpb25TcGVjaWZpY0NsYXNzKGJhc2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9idGFpbnMgYSBzdWJjbGFzcyBvZiB0aGUgc3BlY2lmaWMgYmFzZSBjbGFzcyB0aGF0IGlzCisgICAgICogc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBKYXZhIGluIHVzZS4gVGhlCisgICAgICogaGV1cmlzdGljIGZvciB0aGUgY2xhc3MgbmFtZSB0byBsb2FkIHdpbGwgYmUgdGhhdCBPcGVuSlBBCisgICAgICogZmlyc3QgY2hlY2tzIGZvciB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgY3VycmVudAorICAgICAqIHNldHRpbmcgb2YgdGhlIHtAbGluayAjVkVSU0lPTn0gZmllbGQsIHRoZW4gZWFjaCBudW1iZXIgaW4KKyAgICAgKiBkZWNyZWFzaW5nIG9yZGVyLCB1bnRpbCBlbmRpbmcgaW4gdGhlIHVucXVhbGlmaWVkIG5hbWUuCisgICAgICogRm9yIGV4YW1wbGUsIGlmIHdlIGFyZSB1c2luZyBKREsgMS41LjEsIGFuZCB3ZSB3YW50IHRvIGxvYWQKKyAgICAgKiAib3JnLmFwYWNoZS5vcGVuanBhLmxpYi5Tb21lQ2xhc3MiLCB3ZSB3aWxsIHRyeSB0byBsb2FkIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBjbGFzc2VzIGluIG9yZGVyIGFuZCByZXR1cm4gdGhlIGZpcnN0IG9uZSB0aGF0IGlzIHN1Y2Nlc3NmdWxseQorICAgICAqIGZvdW5kIGFuZCBsb2FkZWQ6CisgICAgICogPG9sPgorICAgICAqIDxsaT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLlNvbWVDbGFzczU8L2xpPgorICAgICAqIDxsaT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLlNvbWVDbGFzczQ8L2xpPgorICAgICAqIDxsaT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLlNvbWVDbGFzczM8L2xpPgorICAgICAqIDxsaT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLlNvbWVDbGFzczI8L2xpPgorICAgICAqIDxsaT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLlNvbWVDbGFzczE8L2xpPgorICAgICAqIDxsaT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLlNvbWVDbGFzczwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvYWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgSmF2YSB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRWZXJzaW9uU3BlY2lmaWNDbGFzcyhTdHJpbmcgYmFzZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gVkVSU0lPTjsgaSA+PSAxOyBpLS0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoYmFzZSArIGkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB0aHJvd2FibGVzIG1pZ2h0IG9jY3VyIHdpdGggYnl0ZWNvZGUgdGhhdCB3ZQorICAgICAgICAgICAgICAgIC8vIGNhbm5vdCB1bmRlcnN0YW5kCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoYmFzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgaXMgYW4gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uKENsYXNzIGNscykgeworICAgICAgICByZXR1cm4gQU5OT19UWVBFICE9IG51bGwgJiYgQU5OT19UWVBFLmlzQXNzaWduYWJsZUZyb20oY2xzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhbiBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbnVtZXJhdGlvbihDbGFzcyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIEVOVU1fVFlQRSAhPSBudWxsICYmIEVOVU1fVFlQRS5pc0Fzc2lnbmFibGVGcm9tKGNscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdHMgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGEgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc1tdIGdldFBhcmFtZXRlcml6ZWRUeXBlcyhGaWVsZCBmKSB7CisgICAgICAgIGlmIChmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKFZFUlNJT04gPCA1KQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NMQVNTRVM7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCB0eXBlID0gRmllbGQuY2xhc3MuZ2V0TWV0aG9kKCJnZXRHZW5lcmljVHlwZSIsCisgICAgICAgICAgICAgICAgKENsYXNzW10pIG51bGwpLmludm9rZShmLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3RQYXJhbWV0ZXJpemVkVHlwZXModHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQ0xBU1NFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3RzIHRoZSBwYXJhbWV0ZXJpemVkIHJldHVybiB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgYSBnaXZlbiBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc1tdIGdldFBhcmFtZXRlcml6ZWRUeXBlcyhNZXRob2QgbWV0aCkgeworICAgICAgICBpZiAobWV0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChWRVJTSU9OIDwgNSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9DTEFTU0VTOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgdHlwZSA9IE1ldGhvZC5jbGFzcy5nZXRNZXRob2QoImdldEdlbmVyaWNSZXR1cm5UeXBlIiwKKyAgICAgICAgICAgICAgICAoQ2xhc3NbXSkgbnVsbCkuaW52b2tlKG1ldGgsIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gY29sbGVjdFBhcmFtZXRlcml6ZWRUeXBlcyh0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9DTEFTU0VTOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCBwYXJhbWV0ZXJpemVkIGNsYXNzZXMgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gY29sbGVjdFBhcmFtZXRlcml6ZWRUeXBlcyhPYmplY3QgdHlwZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChQQVJBTV9UWVBFID09IG51bGwgfHwgIVBBUkFNX1RZUEUuaXNJbnN0YW5jZSh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9DTEFTU0VTOworCisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSAoT2JqZWN0W10pIFBBUkFNX1RZUEUuZ2V0TWV0aG9kCisgICAgICAgICAgICAoImdldEFjdHVhbFR5cGVBcmd1bWVudHMiLCAoQ2xhc3NbXSkgbnVsbCkuaW52b2tlKHR5cGUsCisgICAgICAgICAgICAoT2JqZWN0W10pIG51bGwpOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9DTEFTU0VTOworCisgICAgICAgIENsYXNzW10gY2xzcyA9IG5ldyBDbGFzc1thcmdzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEoYXJnc1tpXSBpbnN0YW5jZW9mIENsYXNzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQ0xBU1NFUzsKKyAgICAgICAgICAgIGNsc3NbaV0gPSAoQ2xhc3MpIGFyZ3NbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgdGhlIHN0YWNrIGZyb20gb25lIHRocm93YWJsZSB0byBhbm90aGVyLCBvciByZXR1cm4KKyAgICAgKiBmYWxzZSBpZiBpdCBjYW5ub3QgYmUgZG9uZSwgcG9zc2libHkgZHVlIHRvIGFuIHVuc3VwcG9ydGVkIEphdmEgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJhbnNmZXJTdGFja1RyYWNlKFRocm93YWJsZSBmcm9tLCBUaHJvd2FibGUgdG8pIHsKKyAgICAgICAgaWYgKEdFVF9TVEFDSyA9PSBudWxsIHx8IFNFVF9TVEFDSyA9PSBudWxsIHx8IGZyb20gPT0gbnVsbAorICAgICAgICAgICAgfHwgdG8gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHN0YWNrID0gR0VUX1NUQUNLLmludm9rZShmcm9tLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgU0VUX1NUQUNLLmludm9rZSh0bywgbmV3IE9iamVjdFtdeyBzdGFjayB9KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYXVzZSBvZiB0aGUgZ2l2ZW4gdGhyb3dhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGdldENhdXNlKFRocm93YWJsZSBleCkgeworICAgICAgICBpZiAoR0VUX0NBVVNFID09IG51bGwgfHwgZXggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFRocm93YWJsZSkgR0VUX0NBVVNFLmludm9rZShleCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYXVzZSBvZiB0aGUgZ2l2ZW4gdGhyb3dhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGluaXRDYXVzZShUaHJvd2FibGUgZXgsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBpZiAoSU5JVF9DQVVTRSA9PSBudWxsIHx8IGV4ID09IG51bGwgfHwgY2F1c2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBleDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChUaHJvd2FibGUpIElOSVRfQ0FVU0UuaW52b2tlKGV4LCBuZXcgT2JqZWN0W117IGNhdXNlIH0pOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIGV4OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEgdmVyc2lvbiBpczogIiArIFZFUlNJT04pOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvTFJVTWFwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0xSVU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzI0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0xSVU1hcC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRXh0ZW5zaW9uIG9mIHRoZSBjb21tb25zIDxjb2RlPkxSVU1hcDwvY29kZT4gdGhhdCBjYW4gY2hhbmdlIGl0cworICogbWF4aW11bSBzaXplLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBMUlVNYXAgZXh0ZW5kcyBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxSVU1hcAorICAgIGltcGxlbWVudHMgU2l6ZWRNYXAgeworCisgICAgcHJpdmF0ZSBpbnQgX21heCA9IC0xOworCisgICAgcHVibGljIExSVU1hcCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTFJVTWFwKGludCBtYXhTaXplKSB7CisgICAgICAgIHN1cGVyKG1heFNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBMUlVNYXAoaW50IG1heFNpemUsIGZsb2F0IGxvYWRGYWN0b3IpIHsKKyAgICAgICAgc3VwZXIobWF4U2l6ZSwgbG9hZEZhY3Rvcik7CisgICAgfQorCisgICAgcHVibGljIExSVU1hcChNYXAgbWFwKSB7CisgICAgICAgIHN1cGVyKG1hcCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhTaXplKCkgeworICAgICAgICByZXR1cm4gbWF4U2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFNpemUoaW50IG1heCkgeworICAgICAgICBpZiAobWF4IDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YobWF4KSk7CisgICAgICAgIF9tYXggPSBtYXg7CisKKyAgICAgICAgT2JqZWN0IGtleTsKKyAgICAgICAgd2hpbGUgKHNpemUoKSA+IF9tYXgpIHsKKyAgICAgICAgICAgIGtleSA9IGxhc3RLZXkoKTsKKyAgICAgICAgICAgIG92ZXJmbG93UmVtb3ZlZChrZXksIHJlbW92ZShrZXkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG92ZXJmbG93UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG1heFNpemUoKSB7CisgICAgICAgIHJldHVybiAoX21heCA9PSAtMSkgPyBzdXBlci5tYXhTaXplKCkgOiBfbWF4OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIChfbWF4ID09IC0xKSA/IHN1cGVyLmlzRnVsbCgpIDogc2l6ZSgpID49IF9tYXg7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlTFJVKExpbmtFbnRyeSBlbnRyeSkgeworICAgICAgICBvdmVyZmxvd1JlbW92ZWQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlTFJVKGVudHJ5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1dyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUludChfbWF4KTsKKyAgICAgICAgc3VwZXIuZG9Xcml0ZU9iamVjdChvdXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvUmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgX21heCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgc3VwZXIuZG9SZWFkT2JqZWN0KGluKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL0xvY2FsaXplci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9Mb2NhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk2MjJhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9Mb2NhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OworCisvKioKKyAqIFRoZSBMb2NhbGl6ZXIgcHJvdmlkZXMgY29udmVuaWVudCBhY2Nlc3MgdG8gbG9jYWxpemVkCisgKiBzdHJpbmdzLiBJdCBpbmxjdWRlcyBidWlsdC1pbiBzdXBwb3J0IGZvciBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uIHRocm91Z2gKKyAqIHRoZSB1c2Ugb2YgdGhlIHtAbGluayBNZXNzYWdlRm9ybWF0fSB1dGlsaXR5LgorICogU3RyaW5ncyBhcmUgc3RvcmVkIGluIHBlci1wYWNrYWdlIHtAbGluayBQcm9wZXJ0aWVzfSBmaWxlcy4KKyAqIFRoZSBwcm9wZXJ0eSBmaWxlIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUgbXVzdCBiZSBuYW1lZAorICogPGNvZGU+bG9jYWxpemVyLnByb3BlcnRpZXM8L2NvZGU+LiBBZGRpdGlvbmFsIGxvY2FsZXMgY2FuIGJlIHN1cHBvcnRlZAorICogdGhyb3VnaCBhZGRpdGlvbmFsIHByb3BlcnR5IGZpbGVzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbnMgc3BlY2lmaWVkCisgKiBpbiB0aGUge0BsaW5rIFJlc291cmNlQnVuZGxlfSBjbGFzcy4gRm9yIGV4YW1wbGUsIHRoZSBnZXJtYW4gbG9jYWxlCisgKiBjb3VsZCBiZSBzdXBwb3J0ZWQgdGhyb3VnaCBhIDxjb2RlPmxvY2FsaXplcl9kZV9ERS5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbGl6ZXIgeworCisgICAgLy8gc3RhdGljIGNhY2hlIG9mIHBhY2thZ2UrbG9jIG5hbWUgdG8gbG9jYWxpemVyIG1hcHBpbmdzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIF9sb2NhbGl6ZXJzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKCk7CisKKyAgICAvLyBsaXN0IG9mIHJlc291cmNlIHByb3ZpZGVycyB0byBkZWxlZ2F0ZSB0byB3aGVuIGxvY2F0aW5nIHJlc291cmNlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gX3Byb3ZpZGVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0CisgICAgICAgIChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgIG5ldyBTaW1wbGVSZXNvdXJjZUJ1bmRsZVByb3ZpZGVyKCksCisgICAgICAgICAgICBuZXcgU3RyZWFtUmVzb3VyY2VCdW5kbGVQcm92aWRlcigpLAorICAgICAgICAgICAgbmV3IFppcFJlc291cmNlQnVuZGxlUHJvdmlkZXIoKSwgfSkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgTG9jYWxpemVyIGluc3RhbmNlIHRoYXQgd2lsbCBhY2Nlc3MgdGhlIHByb3BlcnRpZXMgZmlsZQorICAgICAqIGluIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBjbGFzcyB1c2luZyB0aGUgc3lzdGVtIGRlZmF1bHQgbG9jYWxlLgorICAgICAqCisgICAgICogQHNlZSAjZm9yUGFja2FnZShDbGFzcyxMb2NhbGUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6ZXIgZm9yUGFja2FnZShDbGFzcyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIGZvclBhY2thZ2UoY2xzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBMb2NhbGl6ZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGFjY2VzcyB0aGUgcHJvcGVydGllcyBmaWxlCisgICAgICogaW4gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIGNsYXNzIHVzaW5nIHRoZSBnaXZlbiBsb2NhbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xzIHRoZSBjbGFzcyB3aG9zZSBwYWNrYWdlIHRvIGNoZWNrIGZvciB0aGUgbG9jYWxpemVkCisgICAgICogcHJvcGVydGllcyBmaWxlOyBpZiBudWxsLCB0aGUgc3lzdGVtIHdpbGwgY2hlY2sgZm9yCisgICAgICogYSB0b3AtbGV2ZWwgcHJvcGVydGllcyBmaWxlCisgICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIHRvIHdoaWNoIHN0cmluZ3Mgc2hvdWxkIGJlIGxvY2FsaXplZDsgaWYKKyAgICAgKiBudWxsLCB0aGUgc3lzdGVtIGRlZmF1bHQgd2lsbCBiZSBhc3N1bWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6ZXIgZm9yUGFja2FnZShDbGFzcyBjbHMsIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKQorICAgICAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKworICAgICAgICBpbnQgZG90ID0gKGNscyA9PSBudWxsKSA/IC0xIDogY2xzLmdldE5hbWUoKS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBTdHJpbmcgcGtnOworICAgICAgICBTdHJpbmcgZmlsZTsKKyAgICAgICAgaWYgKGRvdCA9PSAtMSkgeworICAgICAgICAgICAgcGtnID0gIiI7CisgICAgICAgICAgICBmaWxlID0gImxvY2FsaXplciI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwa2cgPSBjbHMuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBkb3QpOworICAgICAgICAgICAgZmlsZSA9IHBrZyArICIubG9jYWxpemVyIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcga2V5ID0gZmlsZSArIGxvY2FsZS50b1N0cmluZygpOworCisgICAgICAgIC8vIG5vIGxvY2tpbmc7IG9rIGlmIGJ1bmRsZSBjcmVhdGVkIG11bHRpcGxlIHRpbWVzCisgICAgICAgIC8vIGNoZWNrIGZvciBjYWNoZWQgdmVyc2lvbgorICAgICAgICBMb2NhbGl6ZXIgbG9jID0gKExvY2FsaXplcikgX2xvY2FsaXplcnMuZ2V0KGtleSk7CisgICAgICAgIGlmIChsb2MgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsb2M7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbG9jID0gbmV3IExvY2FsaXplcihwa2csIGZpbGUsIGxvY2FsZSwgCisgICAgICAgICAgICAgICAgY2xzID09IG51bGwgPyBudWxsIDogY2xzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgX2xvY2FsaXplcnMucHV0KGtleSwgbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBsb2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIHJlc291cmNlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQcm92aWRlcihSZXNvdXJjZUJ1bmRsZVByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIF9wcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSByZXNvdXJjZSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlUHJvdmlkZXIoUmVzb3VyY2VCdW5kbGVQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICByZXR1cm4gX3Byb3ZpZGVycy5yZW1vdmUocHJvdmlkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIF9maWxlOworICAgIHByaXZhdGUgU3RyaW5nIF9wa2c7CisgICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBfYnVuZGxlID0gbnVsbDsKKyAgICBwcml2YXRlIExvY2FsZSBfbG9jYWxlOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2xvYWRlcjsKKworICAgIHByaXZhdGUgTG9jYWxpemVyKFN0cmluZyBwa2csIFN0cmluZyBmLCBMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgX3BrZyA9IHBrZzsKKyAgICAgICAgX2ZpbGUgPSBmOworICAgICAgICBfbG9jYWxlID0gbG9jYWxlOworICAgICAgICBfbG9hZGVyID0gbG9hZGVyOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgLy8gbm8gbG9ja2luZzsgaXQncyBvayB0byBjcmVhdGUgbXVsdGlwbGUgYnVuZGxlcworICAgICAgICBpZiAoX2J1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBmaW5kIHJlc291cmNlIGJ1bmRsZQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfcHJvdmlkZXJzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRyLmhhc05leHQoKSAmJiBfYnVuZGxlID09IG51bGw7ICkgeworICAgICAgICAgICAgICAgIF9idW5kbGUgPSAoKFJlc291cmNlQnVuZGxlUHJvdmlkZXIpIGl0ci5uZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIC5maW5kUmVzb3VyY2UoX2ZpbGUsIF9sb2NhbGUsIF9sb2FkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBfYnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYWxpemVkIHN0cmluZyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldChTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXQoa2V5LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsaXplZCBzdHJpbmcgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZSBnZXRGYXRhbChTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRGYXRhbChrZXksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYWxpemVkIHN0cmluZyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LiBUaGUgZ2l2ZW4KKyAgICAgKiA8Y29kZT5zdWI8L2NvZGU+IG9iamVjdCB3aWxsIGJlIHBhY2tlZCBpbnRvIGFuIGFycmF5IGFuZCBzdWJzdGl0dXRlZAorICAgICAqIGludG8gdGhlIGZvdW5kIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZQorICAgICAqIHtAbGluayBNZXNzYWdlRm9ybWF0fSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldChTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UgZ2V0KFN0cmluZyBrZXksIE9iamVjdCBzdWIpIHsKKyAgICAgICAgcmV0dXJuIGdldChrZXksIG5ldyBPYmplY3RbXXsgc3ViIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYWxpemVkIHN0cmluZyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LiBUaGUgZ2l2ZW4KKyAgICAgKiA8Y29kZT5zdWI8L2NvZGU+IG9iamVjdCB3aWxsIGJlIHBhY2tlZCBpbnRvIGFuIGFycmF5IGFuZCBzdWJzdGl0dXRlZAorICAgICAqIGludG8gdGhlIGZvdW5kIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZQorICAgICAqIHtAbGluayBNZXNzYWdlRm9ybWF0fSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEZhdGFsKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZSBnZXRGYXRhbChTdHJpbmcga2V5LCBPYmplY3Qgc3ViKSB7CisgICAgICAgIHJldHVybiBnZXRGYXRhbChrZXksIG5ldyBPYmplY3RbXXsgc3ViIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldChTdHJpbmcsT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldChTdHJpbmcga2V5LCBPYmplY3Qgc3ViMSwgT2JqZWN0IHN1YjIpIHsKKyAgICAgICAgcmV0dXJuIGdldChrZXksIG5ldyBPYmplY3RbXXsgc3ViMSwgc3ViMiB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRGYXRhbChTdHJpbmcsT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldEZhdGFsKFN0cmluZyBrZXksIE9iamVjdCBzdWIxLCBPYmplY3Qgc3ViMikgeworICAgICAgICByZXR1cm4gZ2V0RmF0YWwoa2V5LCBuZXcgT2JqZWN0W117IHN1YjEsIHN1YjIgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0KFN0cmluZyxPYmplY3QpCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UgZ2V0KFN0cmluZyBrZXksIE9iamVjdCBzdWIxLCBPYmplY3Qgc3ViMiwgT2JqZWN0IHN1YjMpIHsKKyAgICAgICAgcmV0dXJuIGdldChrZXksIG5ldyBPYmplY3RbXXsgc3ViMSwgc3ViMiwgc3ViMyB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsaXplZCBzdHJpbmcgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleS4gVGhlIGdpdmVuCisgICAgICogPGNvZGU+c3ViczwvY29kZT4gb2JqZWN0cyB3aWxsIGJlIHN1YnN0aXR1dGVkCisgICAgICogaW50byB0aGUgZm91bmQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlCisgICAgICoge0BsaW5rIE1lc3NhZ2VGb3JtYXR9IGNsYXNzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0KFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZSBnZXQoU3RyaW5nIGtleSwgT2JqZWN0W10gc3VicykgeworICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoX3BrZywgZ2V0QnVuZGxlKCksIGtleSwgc3VicywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYWxpemVkIHN0cmluZyBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LiBUaGUgZ2l2ZW4KKyAgICAgKiA8Y29kZT5zdWJzPC9jb2RlPiBvYmplY3RzIHdpbGwgYmUgc3Vic3RpdHV0ZWQKKyAgICAgKiBpbnRvIHRoZSBmb3VuZCBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUKKyAgICAgKiB7QGxpbmsgTWVzc2FnZUZvcm1hdH0gY2xhc3MuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRGYXRhbChTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UgZ2V0RmF0YWwoU3RyaW5nIGtleSwgT2JqZWN0W10gc3VicykgeworICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoX3BrZywgZ2V0QnVuZGxlKCksIGtleSwgc3VicywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSA8Y29kZT5NZXNzYWdlPC9jb2RlPiBjYW4gcHJvdmlkZSBhIGxvY2FsaXplZCBtZXNzYWdlIHZpYSB0aGUgCisgICAgICoge0BsaW5rICNnZXRNZXNzYWdlfSBtZXRob2QgY2FsbCwgYW5kIGNhbiBhbHNvIHByb3ZpZGUgdGhlIG9yaWdpbmFsIGtleSwKKyAgICAgKiBwYWNrYWdlLCBhbmQgc3Vic3RpdHV0aW9uIGFycmF5IHRoYXQgd2VyZSB1c2VkIHRvIGFzc2VtYmxlIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BrZzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2tleTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBfc3ViczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2xvY2FsaXplZE1lc3NhZ2U7CisKKyAgICAgICAgcHJpdmF0ZSBNZXNzYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCAKKyAgICAgICAgICAgIE9iamVjdFtdIHN1YnMsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCAmJiBmYXRhbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKGtleSwga2V5LCBrZXkpOworCisgICAgICAgICAgICBfcGtnID0gcGFja2FnZU5hbWU7CisgICAgICAgICAgICBfa2V5ID0ga2V5OworICAgICAgICAgICAgX3N1YnMgPSBzdWJzOworICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgX2xvY2FsaXplZE1lc3NhZ2UgPSBrZXk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbGl6ZWQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsaXplZCA9IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmYXRhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1yZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2xvY2FsaXplZE1lc3NhZ2UgPSAobG9jYWxpemVkID09IG51bGwpID8ga2V5IDogbG9jYWxpemVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsb2NhbGl6ZWQgbWVzc2FnZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChfbG9jYWxpemVkTWVzc2FnZSwgX3N1YnMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUga2V5IGZvciB0aGUgbG9jYWxpemVkIG1lc3NhZ2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfa2V5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN1YnN0aXR1dGlvbnMgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTdWJzdGl0dXRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIF9zdWJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcGtnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL011bHRpQ2xhc3NMb2FkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvTXVsdGlDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzk2NjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL011bHRpQ2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBDbGFzcyBsb2FkZXIgdHlwZSB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIGRlbGVnYXRlIHRvIG11bHRpcGxlCisgKiBpbnRlcm5hbCBjbGFzcyBsb2FkZXJzLgorICogVGhlIHtAbGluayAjVEhSRUFEX0xPQURFUn0gY29uc3RhbnQgaXMgYSBtYXJrZXIgdGhhdCB3aWxsIGJlIHJlcGxhY2VkCisgKiB3aXRoIHRoZSBjb250ZXh0IGxvYWRlciBvZiB0aGUgY3VycmVudCB0aHJlYWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIE11bHRpQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBNYXJrZXIgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGNvbnRleHQgbG9hZGVyIG9mIHRoZSBjdXJyZW50CisgICAgICogdGhyZWFkIHdoZW5ldmVyIGl0IGlzIGRpc2NvdmVyZWQgaW4gdGhlIGNsYXNzIGxvYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgVEhSRUFEX0xPQURFUiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhbmRhcmQgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzTG9hZGVyIFNZU1RFTV9MT0FERVIgPQorICAgICAgICBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOworCisgICAgcHJpdmF0ZSBMaXN0IF9sb2FkZXJzID0gbmV3IEFycmF5TGlzdCg1KTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBpbml0aWFsaXplcyB0aGUgbG9hZGVyIHdpdGggYW4gZW1wdHkgbGlzdCBvZiBkZWxlZ2F0ZXMuCisgICAgICovCisgICAgcHVibGljIE11bHRpQ2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHN1cGVyKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIHRoZSBjbGFzcyBsb2FkZXJzIG9mIGFub3RoZXIgbXVsdGkgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aUNsYXNzTG9hZGVyKE11bHRpQ2xhc3NMb2FkZXIgb3RoZXIpIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIGFkZENsYXNzTG9hZGVycyhvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBsaXN0IGNvbnRhaW5zIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIgb3IgbWFya2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVycy5jb250YWlucyhsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBhbGwgY29udGFpbmVkIGNsYXNzIGxvYWRlcnMuCisgICAgICovCisgICAgcHVibGljIENsYXNzTG9hZGVyW10gZ2V0Q2xhc3NMb2FkZXJzKCkgeworICAgICAgICBDbGFzc0xvYWRlcltdIGxvYWRlcnMgPSBuZXcgQ2xhc3NMb2FkZXJbc2l6ZSgpXTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyOworICAgICAgICBJdGVyYXRvciBpdHIgPSBfbG9hZGVycy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvYWRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxvYWRlciA9IChDbGFzc0xvYWRlcikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gVEhSRUFEX0xPQURFUikKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgbG9hZGVyc1tpXSA9IGxvYWRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9hZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGxvYWRlciBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKGludCBpbmRleCkgeworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIF9sb2FkZXJzLmdldChpbmRleCk7CisgICAgICAgIGlmIChsb2FkZXIgPT0gVEhSRUFEX0xPQURFUikKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIHJldHVybiBsb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIgdG8gdGhlIHNldCBvZiBsb2FkZXJzIHRoYXQgd2lsbCBiZSB0cmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbG9hZGVyIHdhcyBhZGRlZCwgZmFsc2UgaWYgYWxyZWFkeSBpbiB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBpZiAoX2xvYWRlcnMuY29udGFpbnMobG9hZGVyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9sb2FkZXJzLmFkZChsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxvYWRlciB3YXMgYWRkZWQsIGZhbHNlIGlmIGFscmVhZHkgaW4gdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGFzc0xvYWRlcihpbnQgaW5kZXgsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBpZiAoX2xvYWRlcnMuY29udGFpbnMobG9hZGVyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgX2xvYWRlcnMuYWRkKGluZGV4LCBsb2FkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzIGxvYWRlcnMgb2YgdGhpcyBsb2FkZXIgdG8gdGhvc2Ugb2YgdGhlIGdpdmVuIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcnMoTXVsdGlDbGFzc0xvYWRlciBtdWx0aSkgeworICAgICAgICBjbGVhcigpOworICAgICAgICBhZGRDbGFzc0xvYWRlcnMobXVsdGkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYWxsIGNsYXNzIGxvYWRlcnMgZnJvbSB0aGUgZ2l2ZW4gbXVsdGkgbG9hZGVyIHN0YXJ0aW5nIGF0IHRoZQorICAgICAqIGdpdmVuIGluZGV4LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBsb2FkZXJzIHdlcmUgYWRkZWQsIGZhbHNlIGlmIGFsbCBhbHJlYWR5IGluIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGFzc0xvYWRlcnMoaW50IGluZGV4LCBNdWx0aUNsYXNzTG9hZGVyIG11bHRpKSB7CisgICAgICAgIGlmIChtdWx0aSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIHVzZSBpdGVyYXRvciBzbyB0aGF0IHRoZSB0aHJlYWQgbG9hZGVyIGlzIG5vdCByZXNvbHZlZAorICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbXVsdGkuX2xvYWRlcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGlmIChhZGRDbGFzc0xvYWRlcihpbmRleCwgKENsYXNzTG9hZGVyKSBpdHIubmV4dCgpKSkgeworICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFsbCB0aGUgY2xhc3MgbG9hZGVycyBmcm9tIHRoZSBnaXZlbiBtdWx0aSBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IGxvYWRlcnMgd2VyZSBhZGRlZCwgZmFsc2UgaWYgYWxsIGFscmVhZHkgaW4gbGlzdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZENsYXNzTG9hZGVycyhNdWx0aUNsYXNzTG9hZGVyIG11bHRpKSB7CisgICAgICAgIGlmIChtdWx0aSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIHVzZSBpdGVyYXRvciBzbyB0aGF0IHRoZSB0aHJlYWQgbG9hZGVyIGlzIG5vdCByZXNvbHZlZAorICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbXVsdGkuX2xvYWRlcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBhZGRlZCA9IGFkZENsYXNzTG9hZGVyKChDbGFzc0xvYWRlcikgaXRyLm5leHQoKSkgfHwgYWRkZWQ7CisgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGxvYWRlciBmcm9tIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBpbiBsaXN0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVycy5yZW1vdmUobG9hZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgbGlzdCBvZiBjbGFzcyBsb2FkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbG9hZGVycy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGludGVybmFsIGNsYXNzIGxvYWRlcnMuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gX2xvYWRlcnMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBpbnRlcm5hbCBjbGFzcyBsYW9kZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVycy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2xvYWRlcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGxvYWRlciA9IChDbGFzc0xvYWRlcikgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gVEhSRUFEX0xPQURFUikKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyOworICAgICAgICBVUkwgcnNyYzsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBfbG9hZGVycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgbG9hZGVyID0gKENsYXNzTG9hZGVyKSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBUSFJFQURfTE9BREVSKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgLy8gc2tpcCAKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcnNyYyA9IGxvYWRlci5nZXRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChyc3JjICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJzcmM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcjsKKyAgICAgICAgRW51bWVyYXRpb24gcnNyY3M7CisgICAgICAgIE9iamVjdCByc3JjOworICAgICAgICBWZWN0b3IgYWxsID0gbmV3IFZlY3RvcigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBsb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IFRIUkVBRF9MT0FERVIpCisgICAgICAgICAgICAgICAgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgcnNyY3MgPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKG5hbWUpOworICAgICAgICAgICAgd2hpbGUgKHJzcmNzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgcnNyYyA9IHJzcmNzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCFhbGwuY29udGFpbnMocnNyYykpCisgICAgICAgICAgICAgICAgICAgIGFsbC5hZGRFbGVtZW50KHJzcmMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGwuZWxlbWVudHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTXVsdGlDbGFzc0xvYWRlcikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiAoKE11bHRpQ2xhc3NMb2FkZXIpIG90aGVyKS5fbG9hZGVycy5lcXVhbHMoX2xvYWRlcnMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBfbG9hZGVycy5oYXNoQ29kZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvT3B0aW9ucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9PcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2MGRkMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBBIHNwZWNpYWxpemF0aW9uIG9mIHRoZSB7QGxpbmsgUHJvcGVydGllc30gbWFwIHR5cGUgd2l0aCB0aGUgYWRkZWQKKyAqIGFiaWxpdGllcyB0byByZWFkIGFwcGxpY2F0aW9uIG9wdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZCB0bworICogdXNlIGJlYW4gcGF0dGVybnMgdG8gc2V0IGFuIG9iamVjdCdzIHByb3BlcnRpZXMgdmlhIGNvbW1hbmQtbGluZSB0aGUKKyAqIHN0b3JlZCBtYXBwaW5ncy4KKyAqIEEgdHlwaWNhbCB1c2UgcGF0dGVybiBmb3IgdGhpcyBjbGFzcyBpcyB0byBjb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2UKKyAqIGluIHRoZSA8Y29kZT5tYWluPC9jb2RlPiBtZXRob2QsIHRoZW4gY2FsbCB7QGxpbmsgI3NldEZyb21DbWRMaW5lfSB3aXRoIHRoZQorICogZ2l2ZW4gYXJncy4gTmV4dCwgYW4gaW5zdGFuY2VvZiB0aGUgY2xhc3MgYmVpbmcgaW52b2tlZCBpcyBjcmVhdGVkLCBhbmQKKyAqIHtAbGluayAjc2V0SW50b30gaXMgY2FsbGVkIHdpdGggdGhhdCBpbnN0YW5jZSBhcyBhIHBhcmFtZXRlci4gV2l0aCB0aGlzCisgKiBwYXR0ZXJuLCB0aGUgdXNlciBjYW4gY29uZmlndXJlIGFueSBiZWFuIHByb3BlcnRpZXMgb2YgdGhlIGNsYXNzLCBvciBldmVuCisgKiBwcm9wZXJ0aWVzIG9mIGNsYXNzZXMgcmVhY2hhYmxlIGZyb20gdGhlIGNsYXNzLCB0aHJvdWdoIHRoZSBjb21tYW5kIGxpbmUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE9wdGlvbnMgZXh0ZW5kcyBUeXBlZFByb3BlcnRpZXMgeworCisgICAgLyoqCisgICAgICogSW1tdXRhYmxlIGVtcHR5IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9ucyBFTVBUWSA9IG5ldyBFbXB0eU9wdGlvbnMoKTsKKworICAgIC8vIG1hcHMgcHJpbWl0aXZlIHR5cGVzIHRvIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyIGNsYXNzIGFuZCBkZWZhdWx0IHZhbHVlCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W11bXSBfcHJpbVdyYXBwZXJzID0gbmV3IE9iamVjdFtdW117CisgICAgICAgIHsgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5GQUxTRSB9LAorICAgICAgICB7IGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MsIG5ldyBCeXRlKChieXRlKSAwKSB9LAorICAgICAgICB7IGNoYXIuY2xhc3MsIENoYXJhY3Rlci5jbGFzcywgbmV3IENoYXJhY3RlcigoY2hhcikgMCkgfSwKKyAgICAgICAgeyBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcywgbmV3IERvdWJsZSgwRCkgfSwKKyAgICAgICAgeyBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsIG5ldyBGbG9hdCgwRikgfSwKKyAgICAgICAgeyBpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKDApIH0sCisgICAgICAgIHsgbG9uZy5jbGFzcywgTG9uZy5jbGFzcywgbmV3IExvbmcoMEwpIH0sCisgICAgICAgIHsgc2hvcnQuY2xhc3MsIFNob3J0LmNsYXNzLCBuZXcgU2hvcnQoKHNob3J0KSAwKSB9LCB9OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9ucygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIG9wdGlvbnMgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gc2V0IG9mIGRlZmF1bHRzLgorICAgICAqCisgICAgICogQHNlZSBQcm9wZXJ0aWVzI1Byb3BlcnRpZXMoUHJvcGVydGllcykKKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9ucyhQcm9wZXJ0aWVzIGRlZmF1bHRzKSB7CisgICAgICAgIHN1cGVyKGRlZmF1bHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIGFyZ3VtZW50IGxpc3QgaW50byBmbGFnL3ZhbHVlIHBhaXJzLCB3aGljaCBhcmUgc3RvcmVkCisgICAgICogYXMgcHJvcGVydGllcy4gRmxhZ3MgdGhhdCBhcmUgcHJlc2VudCB3aXRob3V0IHZhbHVlcyBhcmUgZ2l2ZW4KKyAgICAgKiB0aGUgdmFsdWUgInRydWUiLiBJZiBhbnkgZmxhZyBpcyBmb3VuZCBmb3Igd2hpY2ggdGhlcmUgaXMgYWxyZWFkeQorICAgICAqIGEgbWFwcGluZyBwcmVzZW50LCB0aGUgZXhpc3RpbmcgbWFwcGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuLgorICAgICAqIEZsYWdzIHNob3VsZCBiZSBvZiB0aGUgZm9ybTo8YnIgLz4KKyAgICAgKiA8Y29kZT5qYXZhIEZvbyAtZmxhZzEgdmFsdWUxIC1mbGFnMiB2YWx1ZTIgLi4uIGFyZzEgYXJnMiAuLi48L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cworICAgICAqIEByZXR1cm4gYWxsIGFyZ3VtZW50cyBpbiB0aGUgb3JpZ2luYWwgYXJyYXkgYmV5b25kIHRoZQorICAgICAqIGZsYWcvdmFsdWUgcGFpciBsaXN0CisgICAgICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gc2V0RnJvbUNtZExpbmUoU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gYXJnczsKKworICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgTGlzdCByZW1haW5kZXIgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoICsgMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCB8fCBhcmdzW2ldLnN0YXJ0c1dpdGgoIi0iKSkgeworICAgICAgICAgICAgICAgIGtleSA9IHRyaW1RdW90ZShrZXkpOworICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoa2V5LCB0cmltUXVvdGUodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoa2V5LCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpID09IGFyZ3MubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gYXJnc1tpXS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoa2V5LCB0cmltUXVvdGUoYXJnc1tpXSkpOworICAgICAgICAgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZW1haW5kZXIuYWRkKGFyZ3NbaV0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcmVtYWluZGVyLnRvQXJyYXkobmV3IFN0cmluZ1tyZW1haW5kZXIuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdXNlcyByZWZsZWN0aW9uIHRvIHNldCBhbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGdpdmVuCisgICAgICogb2JqZWN0IHRoYXQgYXJlIG5hbWVkIGJ5IHRoZSBrZXlzIGluIHRoaXMgbWFwLiBGb3IgYSBnaXZlbiBrZXkgJ2ZvbycsCisgICAgICogdGhlIGFsZ29yaXRobSB3aWxsIGxvb2sgZm9yIGEgJ3NldEZvbycgbWV0aG9kIGluIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKiBGb3IgYSBnaXZlbiBrZXkgJ2Zvby5iYXInLCB0aGUgYWxnb3JpdGhtIHdpbGwgZmlyc3QgbG9vayBmb3IgYQorICAgICAqICdnZXRGb28nIG1ldGhvZCBpbiB0aGUgZ2l2ZW4gaW5zdGFuY2UsIHRoZW4gd2lsbCByZWN1cnNlIG9uIHRoZSByZXR1cm4KKyAgICAgKiB2YWx1ZSBvZiB0aGF0IG1ldGhvZCwgbm93IGxvb2tpbmcgZm9yIHRoZSAnYmFyJyBwcm9wZXJ0eS4gVGhpcyBhbGxvd3MKKyAgICAgKiB0aGUgc2V0dGluZyBvZiBuZXN0ZWQgb2JqZWN0IHByb3BlcnRpZXMuIElmIGluIHRoZSBhYm92ZSBleGFtcGxlIHRoZQorICAgICAqICdnZXRGb28nIG1ldGhvZCBpcyBub3QgcHJlc2VudCBvciByZXR1cm5zIG51bGwsIHRoZSBhbGdvcml0aG0gd2lsbAorICAgICAqIGxvb2sgZm9yIGEgJ3NldEZvbycgbWV0aG9kOyBpZiBmb3VuZCBpdCB3aWxsIGNvbnN0cmN0IGEgbmV3IGluc3RhbmNlCisgICAgICogb2YgdGhlIGNvcnJlY3QgdHlwZSwgc2V0IGl0IHVzaW5nIHRoZSAnc2V0Rm9vJyBtZXRob2QsIHRoZW4gcmVjdXJzZSBvbgorICAgICAqIGl0IGFzIGFib3ZlLiBQcm9wZXJ0eSBuYW1lcyBjYW4gYmUgbmVzdGVkIGluIHRoaXMgd2F5IHRvIGFuIGFyYml0cmFyeQorICAgICAqIGRlcHRoLiBGb3Igc2V0dGVyIG1ldGhvZHMgdGhhdCB0YWtlIG11bHRpcGxlIHBhcmFtZXRlcnMsIHRoZSB2YWx1ZQorICAgICAqIG1hcHBlZCB0byB0aGUga2V5IGNhbiB1c2UgdGhlICcsJyBhcyBhbiBhcmd1bWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIElmIG5vdCBlbm91Z2ggdmFsdWVzIGFyZSBwcmVzZW50IGZvciBhIGdpdmVuIG1ldGhvZCBhZnRlciBzcGxpdHRpbmcKKyAgICAgKiB0aGUgc3RyaW5nIG9uICcsJywgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgd2lsbCByZWNlaXZlIGRlZmF1bHQKKyAgICAgKiB2YWx1ZXMuIEFsbCBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCBmcm9tIHN0cmluZyBmb3JtIHRvIHRoZQorICAgICAqIGNvcnJlY3QgdHlwZSBpZiBwb3NzaWJsZShpLmUuIGlmIHRoZSB0eXBlIGlzIHByaW1pdGl2ZSwKKyAgICAgKiBqYXZhLmxhbmcuQ2xhcywgb3IgaGFzIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSBzdHJpbmcKKyAgICAgKiBhcmd1bWVudCkuIEV4YW1wbGVzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+TWFwIEVudHJ5OiA8Y29kZT4iYWdlIi0mZ3Q7IjEyIjwvY29kZT48YnIgLz4KKyAgICAgKiBSZXN1bHRhbnQgbWV0aG9kIGNhbGw6IDxjb2RlPm9iai5zZXRBZ2UoMTIpPC9jb2RlPjwvbGk+CisgICAgICogPGxpPk1hcCBFbnRyeTogPGNvZGU+InJhbmdlIi0mZ3Q7IjEsMjAiPC9jb2RlPjxiciAvPgorICAgICAqIFJlc3VsdGFudCBtZXRob2QgY2FsbDogPGNvZGU+b2JqLnNldFJhbmdlKDEsIDIwKTwvY29kZT48L2xpPgorICAgICAqIDxsaT5NYXAgRW50cnk6IDxjb2RlPiJyYW5nZSItJmd0OyIxMCI8L2NvZGU+PGJyIC8+CisgICAgICogUmVzdWx0YW50IG1ldGhvZCBjYWxsOiA8Y29kZT5vYmouc2V0UmFuZ2UoMTAsIDEwKTwvY29kZT48L2xpPgorICAgICAqIDxsaT5NYXAgRW50cnk6IDxjb2RlPiJicm90aGVyLm5hbWUiLSZndDsiQm9iIjwvY29kZT48YnIgLz4KKyAgICAgKiBSZXN1bHRhbnQgbWV0aG9kIGNhbGw6IDxjb2RlPm9iai5nZXRCcm90aGVyKCkuc2V0TmFtZSgiQm9iIikKKyAgICAgKiA8Y29kZT48L2xpPgorICAgICAqIDwvdWw+IAorICAgICAqIEFueSBrZXlzIHByZXNlbnQgaW4gdGhlIG1hcCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8KKyAgICAgKiBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGluIHRoZSBnaXZlbiBvYmplY3Qgd2lsbCBiZSBpZ25vcmVkLAorICAgICAqIGFuZCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSB7QGxpbmsgTWFwfSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4ge0BsaW5rIE9wdGlvbnN9IG9mIGtleS12YWx1ZSBwYWlycyBpbiB0aGlzIG9iamVjdAorICAgICAqIGZvciB3aGljaCBubyBzZXR0ZXJzIGNvdWxkIGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBvbiBwYXJzZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25zIHNldEludG8oT2JqZWN0IG9iaikgeworICAgICAgICAvLyBzZXQgYWxsIGRlZmF1bHRzIHRoYXQgaGF2ZSBubyBleHBsaWNpdCB2YWx1ZQorICAgICAgICBNYXAuRW50cnkgZW50cnkgPSBudWxsOworICAgICAgICBpZiAoZGVmYXVsdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBkZWZhdWx0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0SW50byhvYmosIGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBmcm9tIG1haW4gbWFwCisgICAgICAgIE9wdGlvbnMgaW52YWxpZEVudHJpZXMgPSBudWxsOworICAgICAgICBNYXAuRW50cnkgZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBlID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghc2V0SW50byhvYmosIGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGludmFsaWRFbnRyaWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbnRyaWVzID0gbmV3IE9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkRW50cmllcy5wdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGludmFsaWRFbnRyaWVzID09IG51bGwpID8gRU1QVFkgOiBpbnZhbGlkRW50cmllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSBuYW1lZCBieSB0aGUga2V5IG9mIHRoZSBnaXZlbiBlbnRyeSBpbiB0aGUKKyAgICAgKiBnaXZlbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXQgc3VjY2VlZGVkLCBvcgorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBubyBtZXRob2QgY291bGQgYmUgZm91bmQgZm9yIHRoaXMgcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNldEludG8oT2JqZWN0IG9iaiwgTWFwLkVudHJ5IGVudHJ5KSB7CisgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBsb29rIGZvciBtYXRjaGluZyBwYXJhbWV0ZXIgb2Ygb2JqZWN0CisgICAgICAgICAgICBPYmplY3RbXSBtYXRjaCA9IG5ldyBPYmplY3RbXXsgb2JqLCBudWxsIH07CisgICAgICAgICAgICBpZiAoIW1hdGNoT3B0aW9uVG9NZW1iZXIoZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSwgbWF0Y2gpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgQ2xhc3NbXSB0eXBlID0gZ2V0VHlwZShtYXRjaFsxXSk7CisgICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W3R5cGUubGVuZ3RoXTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHN0clZhbHVlczsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgc3RyVmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgICAgICBzdHJWYWx1ZXMgPSBuZXcgU3RyaW5nW117IGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSB9OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0clZhbHVlcyA9IFN0cmluZ3Muc3BsaXQoZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpLCAiLCIsIDApOworCisgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBzdHJpbmcgdmFsdWVzIGludG8gcGFyYW1ldGVyIHZhbHVlcywgaWYgbm90CisgICAgICAgICAgICAvLyBlbm91Z2ggc3RyaW5nIHZhbHVlcyByZXBlYXQgbGFzdCBvbmUgZm9yIHJlc3QKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyVmFsdWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHN0cmluZ1RvT2JqZWN0KHN0clZhbHVlc1tpXS50cmltKCksIHR5cGVbaV0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0clZhbHVlcy5sZW5ndGg7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZ2V0RGVmYXVsdFZhbHVlKHR5cGVbaV0pOworCisgICAgICAgICAgICAvLyBpbnZva2UgdGhlIHNldHRlciAvIHNldCB0aGUgZmllbGQKKyAgICAgICAgICAgIGludm9rZShtYXRjaFswXSwgbWF0Y2hbMV0sIHZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihvYmogKyAiLiIgKyBlbnRyeS5nZXRLZXkoKQorICAgICAgICAgICAgICAgICsgIiA9ICIgKyBlbnRyeS5nZXRWYWx1ZSgpLCB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2luZ2xlIHF1b3RlcyBmcm9tIHRoZSBnaXZlbiBTdHJpbmcsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJpbVF1b3RlKFN0cmluZyB2YWwpIHsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIHZhbC5zdGFydHNXaXRoKCInIikgJiYgdmFsLmVuZHNXaXRoKCInIikpCisgICAgICAgICAgICByZXR1cm4gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbGwgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IG9uIHRoZSBwcm92aWRlZCBjbGFzcy4gVGhpcyBkb2VzCisgICAgICogbm90IGxvb2sgZm9yIHBhdGgtdHJhdmVyc2FsIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIGNsYXNzIGZvciB3aGljaCBhdmFpbGFibGUgb3B0aW9ucyBzaG91bGQgYmUgbGlzdGVkLgorICAgICAqIEByZXR1cm4gVGhlIGF2YWlsYWJsZSBvcHRpb24gbmFtZXMgaW4gPGNvZGU+dHlwZTwvY29kZT4uIFRoZQorICAgICAqIG5hbWVzIHdpbGwgaGF2ZSBpbml0aWFsIGNhcHMuIFRoZXkgd2lsbCBiZSBvcmRlcmVkIGFscGhhYmV0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBmaW5kT3B0aW9uc0ZvcihDbGFzcyB0eXBlKSB7CisgICAgICAgIENvbGxlY3Rpb24gbmFtZXMgPSBuZXcgVHJlZVNldCgpOworICAgICAgICAvLyBsb29rIGZvciBhIHNldHRlciBtZXRob2QgbWF0Y2hpbmcgdGhlIGtleQorICAgICAgICBNZXRob2RbXSBtZXRocyA9IHR5cGUuZ2V0TWV0aG9kcygpOworICAgICAgICBDbGFzc1tdIHBhcmFtczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1ldGhzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzZXQiKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1ldGhzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1swXS5pc0FycmF5KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgbmFtZXMuYWRkKFN0cmluZ1V0aWxzLmNhcGl0YWxpemUoCisgICAgICAgICAgICAgICAgICAgIG1ldGhzW2ldLmdldE5hbWUoKS5zdWJzdHJpbmcoMykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBwdWJsaWMgZmllbGRzCisgICAgICAgIEZpZWxkW10gZmllbGRzID0gdHlwZS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBuYW1lcy5hZGQoU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShmaWVsZHNbaV0uZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXMgYSBrZXkgdG8gYW4gb2JqZWN0L3NldHRlciBwYWlyLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUga2V5IGdpdmVuIGF0IHRoZSBjb21tYW5kIGxpbmU7IG1heSBiZSBvZiB0aGUgZm9ybQorICAgICAqICdmb28uYmFyJyB0byBzaWduaWZ5IHRoZSAnYmFyJyBwcm9wZXJ0eSBvZiB0aGUgJ2Zvbycgb3duZWQgb2JqZWN0CisgICAgICogQHBhcmFtIG1hdGNoIGFuIGFycmF5IG9mIGxlbmd0aCAyLCB3aGVyZSB0aGUgZmlyc3QgaW5kZXggaXMgc2V0CisgICAgICogdG8gdGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgc2V0dGVyIGZvcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBtYWRlLCBmYWxzZSBvdGhlcndpc2U7IGFkZGl0aW9uYWxseSwKKyAgICAgKiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIG1hdGNoIGFycmF5IHdpbGwgYmUgc2V0IHRvCisgICAgICogdGhlIG1hdGNoaW5nIG9iamVjdCBhbmQgdGhlIHNlY29uZCBpbmRleCB3aWxsIGJlCisgICAgICogc2V0IHRvIHRoZSBzZXR0ZXIgbWV0aG9kIG9yIHB1YmxpYyBmaWVsZCBmb3IgdGhlCisgICAgICogcHJvcGVydHkgbmFtZWQgYnkgdGhlIGtleQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hPcHRpb25Ub01lbWJlcihTdHJpbmcga2V5LCBPYmplY3RbXSBtYXRjaCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGtleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgYmVhbiBwcm9wZXJ0aWVzIGZvciBzZXR0ZXJzOyBhbnkKKyAgICAgICAgLy8gc2V0dGVyIHdpdGggbW9yZSB0aGFuIDEgYXJnIGlzIGlnbm9yZWQ7IGNhbGMgc2V0dGVyIGFuZCBnZXR0ZXIKKyAgICAgICAgLy8gbmFtZSB0byBsb29rIGZvcgorICAgICAgICBTdHJpbmdbXSBmaW5kID0gU3RyaW5ncy5zcGxpdChrZXksICIuIiwgMik7CisgICAgICAgIFN0cmluZyBiYXNlID0gU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShmaW5kWzBdKTsKKyAgICAgICAgU3RyaW5nIHNldCA9ICJzZXQiICsgYmFzZTsKKyAgICAgICAgU3RyaW5nIGdldCA9ICJnZXQiICsgYmFzZTsKKworICAgICAgICAvLyBsb29rIGZvciBhIHNldHRlci9nZXR0ZXIgbWF0Y2hpbmcgdGhlIGtleTsgbG9vayBmb3IgbWV0aG9kcyBmaXJzdAorICAgICAgICBDbGFzcyB0eXBlID0gbWF0Y2hbMF0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgTWV0aG9kW10gbWV0aHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKKyAgICAgICAgTWV0aG9kIHNldE1ldGggPSBudWxsOworICAgICAgICBNZXRob2QgZ2V0TWV0aCA9IG51bGw7CisgICAgICAgIENsYXNzW10gcGFyYW1zOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWV0aHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhzZXQpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zID0gbWV0aHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zWzBdLmlzQXJyYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvLyB1c2UgdGhpcyBtZXRob2QgaWYgd2UgaGF2ZW4ndCBmb3VuZCBhbnkgb3RoZXIgc2V0dGVyLCBpZgorICAgICAgICAgICAgICAgIC8vIGl0IGhhcyBsZXNzIHBhcmFtZXRlcnMgdGhhbiBhbnkgb3RoZXIgc2V0dGVyLCBvciBpZiBpdCB1c2VzCisgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoc2V0TWV0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXRNZXRoID0gbWV0aHNbaV07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1zLmxlbmd0aCA8IHNldE1ldGguZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHNldE1ldGggPSBtZXRoc1tpXTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbXMubGVuZ3RoID09IHNldE1ldGguZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFyYW1zWzBdID09IFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgc2V0TWV0aCA9IG1ldGhzW2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRoc1tpXS5nZXROYW1lKCkuZXF1YWxzKGdldCkpCisgICAgICAgICAgICAgICAgZ2V0TWV0aCA9IG1ldGhzW2ldOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm8gbWV0aG9kcyBmb3VuZCwgY2hlY2sgZm9yIHB1YmxpYyBmaWVsZAorICAgICAgICBNZW1iZXIgc2V0dGVyID0gc2V0TWV0aDsKKyAgICAgICAgTWVtYmVyIGdldHRlciA9IGdldE1ldGg7CisgICAgICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOworICAgICAgICAgICAgU3RyaW5nIHVuY2FwQmFzZSA9IFN0cmluZ1V0aWxzLnVuY2FwaXRhbGl6ZShmaW5kWzBdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuZXF1YWxzKGJhc2UpCisgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkc1tpXS5nZXROYW1lKCkuZXF1YWxzKHVuY2FwQmFzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGVyID0gZmllbGRzW2ldOworICAgICAgICAgICAgICAgICAgICBnZXR0ZXIgPSBmaWVsZHNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vIHdheSB0byBhY2Nlc3MgcHJvcGVydHksIGdpdmUgdXAKKyAgICAgICAgaWYgKHNldHRlciA9PSBudWxsICYmIGdldHRlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIHJlY3Vyc2Ugb24gaW5uZXIgb2JqZWN0IHdpdGggcmVtYWluZGVyIG9mIGtleT8KKyAgICAgICAgaWYgKGZpbmQubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgT2JqZWN0IGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChnZXR0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpbm5lciA9IGludm9rZShtYXRjaFswXSwgZ2V0dGVyLCBudWxsKTsKKworICAgICAgICAgICAgLy8gaWYgbm8gZ2V0dGVyIG9yIGN1cnJlbnQgaW5uZXIgaXMgbnVsbCwgdHJ5IHRvIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgLy8gaW5uZXIgaW5zdGFuY2UgYW5kIHNldCBpdCBpbiBvYmplY3QKKyAgICAgICAgICAgIGlmIChpbm5lciA9PSBudWxsICYmIHNldHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgaW5uZXJUeXBlID0gZ2V0VHlwZShzZXR0ZXIpWzBdOworICAgICAgICAgICAgICAgIGlubmVyID0gaW5uZXJUeXBlLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgaW52b2tlKG1hdGNoWzBdLCBzZXR0ZXIsIG5ldyBPYmplY3RbXXsgaW5uZXIgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaFswXSA9IGlubmVyOworICAgICAgICAgICAgcmV0dXJuIG1hdGNoT3B0aW9uVG9NZW1iZXIoZmluZFsxXSwgbWF0Y2gpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ290IG1hdGNoOyBmaW5kIHNldHRlciBmb3IgcHJvcGVydHkKKyAgICAgICAgbWF0Y2hbMV0gPSBzZXR0ZXI7CisgICAgICAgIHJldHVybiBtYXRjaFsxXSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIHNldCB0aGUgZ2l2ZW4gbWVtYmVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gZ2V0VHlwZShPYmplY3QgbWVtYmVyKSB7CisgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2QpCisgICAgICAgICAgICByZXR1cm4gKChNZXRob2QpIG1lbWJlcikuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1tdeyAoKEZpZWxkKSBtZW1iZXIpLmdldFR5cGUoKSB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ2l2ZW4gbWVtYmVyIHRvIHRoZSBnaXZlbiB2YWx1ZShzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgaW52b2tlKE9iamVjdCB0YXJnZXQsIE9iamVjdCBtZW1iZXIsIE9iamVjdFtdIHZhbHVlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2QpCisgICAgICAgICAgICByZXR1cm4gKChNZXRob2QpIG1lbWJlcikuaW52b2tlKHRhcmdldCwgdmFsdWVzKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoKEZpZWxkKSBtZW1iZXIpLmdldCh0YXJnZXQpOworICAgICAgICAoKEZpZWxkKSBtZW1iZXIpLnNldCh0YXJnZXQsIHZhbHVlc1swXSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBzdHJpbmcgaW50byBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUsIG9yIGl0cworICAgICAqIHdyYXBwZXIgdHlwZSBpZiBpdCBpcyBwcmltaXRpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3Qgc3RyaW5nVG9PYmplY3QoU3RyaW5nIHN0ciwgQ2xhc3MgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbnVsbCBhbmQgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsIHx8IHR5cGUgPT0gU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIHN0cjsKKworICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGNyZWF0aW5nIENsYXNzIGluc3RhbmNlcworICAgICAgICBpZiAodHlwZSA9PSBDbGFzcy5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHN0ciwgZmFsc2UsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBudW1lcmljIHR5cGVzIHRoYXQgZW5kIGluIC4wOyBzdHJpcCB0aGUgZGVjaW1hbAorICAgICAgICAvLyBwbGFjZXMgYmVjYXVzZSBpdCBjYW4ga2lsbCBpbnQsIHNob3J0LCBsb25nIHBhcnNpbmcKKyAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSB8fCBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKKyAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoKCkgPiAyICYmIHN0ci5lbmRzV2l0aCgiLjAiKSkKKyAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGgoKSAtIDIpOworCisgICAgICAgIC8vIGZvciBwcmltaXRpdmVzLCByZWN1cnNlIG9uIHdyYXBwZXIgdHlwZQorICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcHJpbVdyYXBwZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh0eXBlID09IF9wcmltV3JhcHBlcnNbaV1bMF0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdUb09iamVjdChzdHIsIChDbGFzcykgX3ByaW1XcmFwcGVyc1tpXVsxXSk7CisKKyAgICAgICAgLy8gbG9vayBmb3IgYSBzdHJpbmcgY29uc3RydWN0b3IKKyAgICAgICAgRXhjZXB0aW9uIGVyciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gdHlwZS5nZXRDb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgIChuZXcgQ2xhc3NbXXsgU3RyaW5nLmNsYXNzIH0pOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQm9vbGVhbi5jbGFzcyAmJiAidCIuZXF1YWxzSWdub3JlQ2FzZShzdHIpKQorICAgICAgICAgICAgICAgIHN0ciA9ICJ0cnVlIjsKKyAgICAgICAgICAgIHJldHVybiBjb25zLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXsgc3RyIH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyID0gZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogdGhlIGFyZyB2YWx1ZSBpcyBhIHN1YnR5cGUgbmFtZSBhbmQgYSBuZXcgaW5zdGFuY2UKKyAgICAgICAgLy8gb2YgdGhhdCB0eXBlIHNob3VsZCBiZSBzZXQgYXMgdGhlIG9iamVjdAorICAgICAgICBDbGFzcyBzdWJUeXBlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1YlR5cGUgPSBDbGFzcy5mb3JOYW1lKHN0cik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0eXBlLmlzQXNzaWduYWJsZUZyb20oc3ViVHlwZSkpCisgICAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIHJldHVybiBzdWJUeXBlLm5ld0luc3RhbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlciB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShDbGFzcyB0eXBlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3ByaW1XcmFwcGVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChfcHJpbVdyYXBwZXJzW2ldWzBdID09IHR5cGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmltV3JhcHBlcnNbaV1bMl07CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2Yge0BsaW5rICNnZXRCb29sZWFuUHJvcGVydHl9IHRvIGFsbG93CisgICAgICogYSB2YWx1ZSB0byBhcHBlYXIgdW5kZXIgZWl0aGVyIG9mIHR3byBrZXlzOyB1c2VmdWwgZm9yIHNob3J0IGFuZAorICAgICAqIGxvbmcgdmVyc2lvbnMgb2YgY29tbWFuZC1saW5lIGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcga2V5MiwgYm9vbGVhbiBkZWYpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGdldFByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHZhbCA9IGdldFByb3BlcnR5KGtleTIpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZGVmOworICAgICAgICByZXR1cm4gInQiLmVxdWFsc0lnbm9yZUNhc2UodmFsKSB8fCAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBUeXBlZFByb3BlcnRpZXMjZ2V0RmxvYXRQcm9wZXJ0eX0gdG8gYWxsb3cKKyAgICAgKiBhIHZhbHVlIHRvIGFwcGVhciB1bmRlciBlaXRoZXIgb2YgdHdvIGtleXM7IHVzZWZ1bCBmb3Igc2hvcnQgYW5kCisgICAgICogbG9uZyB2ZXJzaW9ucyBvZiBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleTIsIGZsb2F0IGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgdmFsID0gZ2V0UHJvcGVydHkoa2V5Mik7CisgICAgICAgIHJldHVybiAodmFsID09IG51bGwpID8gZGVmIDogRmxvYXQucGFyc2VGbG9hdCh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBUeXBlZFByb3BlcnRpZXMjZ2V0RG91YmxlUHJvcGVydHl9IHRvIGFsbG93CisgICAgICogYSB2YWx1ZSB0byBhcHBlYXIgdW5kZXIgZWl0aGVyIG9mIHR3byBrZXlzOyB1c2VmdWwgZm9yIHNob3J0IGFuZAorICAgICAqIGxvbmcgdmVyc2lvbnMgb2YgY29tbWFuZC1saW5lIGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleTIsIGRvdWJsZSBkZWYpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGdldFByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHZhbCA9IGdldFByb3BlcnR5KGtleTIpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IGRlZiA6IERvdWJsZS5wYXJzZURvdWJsZSh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBUeXBlZFByb3BlcnRpZXMjZ2V0TG9uZ1Byb3BlcnR5fSB0byBhbGxvdworICAgICAqIGEgdmFsdWUgdG8gYXBwZWFyIHVuZGVyIGVpdGhlciBvZiB0d28ga2V5czsgdXNlZnVsIGZvciBzaG9ydCBhbmQKKyAgICAgKiBsb25nIHZlcnNpb25zIG9mIGNvbW1hbmQtbGluZSBmbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleTIsIGxvbmcgZGVmKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSBnZXRQcm9wZXJ0eShrZXkpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICB2YWwgPSBnZXRQcm9wZXJ0eShrZXkyKTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBkZWYgOiBMb25nLnBhcnNlTG9uZyh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBUeXBlZFByb3BlcnRpZXMjZ2V0SW50UHJvcGVydHl9IHRvIGFsbG93CisgICAgICogYSB2YWx1ZSB0byBhcHBlYXIgdW5kZXIgZWl0aGVyIG9mIHR3byBrZXlzOyB1c2VmdWwgZm9yIHNob3J0IGFuZAorICAgICAqIGxvbmcgdmVyc2lvbnMgb2YgY29tbWFuZC1saW5lIGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleTIsIGludCBkZWYpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGdldFByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHZhbCA9IGdldFByb3BlcnR5KGtleTIpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IGRlZiA6IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB7QGxpbmsgUHJvcGVydGllcyNnZXRQcm9wZXJ0eX0gdG8gYWxsb3cKKyAgICAgKiBhIHZhbHVlIHRvIGFwcGVhciB1bmRlciBlaXRoZXIgb2YgdHdvIGtleXM7IHVzZWZ1bCBmb3Igc2hvcnQgYW5kCisgICAgICogbG9uZyB2ZXJzaW9ucyBvZiBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcga2V5MiwgU3RyaW5nIGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBnZXRQcm9wZXJ0eShrZXkyLCBkZWYpIDogdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBUeXBlZFByb3BlcnRpZXMjcmVtb3ZlQm9vbGVhblByb3BlcnR5fSB0byBhbGxvdworICAgICAqIGEgdmFsdWUgdG8gYXBwZWFyIHVuZGVyIGVpdGhlciBvZiB0d28ga2V5czsgdXNlZnVsIGZvciBzaG9ydCBhbmQKKyAgICAgKiBsb25nIHZlcnNpb25zIG9mIGNvbW1hbmQtbGluZSBmbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVCb29sZWFuUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleTIsIGJvb2xlYW4gZGVmKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSByZW1vdmVQcm9wZXJ0eShrZXkpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICB2YWwgPSByZW1vdmVQcm9wZXJ0eShrZXkyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHkoa2V5Mik7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgICAgIHJldHVybiAidCIuZXF1YWxzSWdub3JlQ2FzZSh2YWwpIHx8ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2Yge0BsaW5rIFR5cGVkUHJvcGVydGllcyNyZW1vdmVGbG9hdFByb3BlcnR5fSB0byBhbGxvdworICAgICAqIGEgdmFsdWUgdG8gYXBwZWFyIHVuZGVyIGVpdGhlciBvZiB0d28ga2V5czsgdXNlZnVsIGZvciBzaG9ydCBhbmQKKyAgICAgKiBsb25nIHZlcnNpb25zIG9mIGNvbW1hbmQtbGluZSBmbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgcmVtb3ZlRmxvYXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcga2V5MiwgZmxvYXQgZGVmKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSByZW1vdmVQcm9wZXJ0eShrZXkpOworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICB2YWwgPSByZW1vdmVQcm9wZXJ0eShrZXkyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHkoa2V5Mik7CisgICAgICAgIHJldHVybiAodmFsID09IG51bGwpID8gZGVmIDogRmxvYXQucGFyc2VGbG9hdCh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBUeXBlZFByb3BlcnRpZXMjcmVtb3ZlRG91YmxlUHJvcGVydHl9IHRvIGFsbG93CisgICAgICogYSB2YWx1ZSB0byBhcHBlYXIgdW5kZXIgZWl0aGVyIG9mIHR3byBrZXlzOyB1c2VmdWwgZm9yIHNob3J0IGFuZAorICAgICAqIGxvbmcgdmVyc2lvbnMgb2YgY29tbWFuZC1saW5lIGZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgcmVtb3ZlRG91YmxlUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleTIsIGRvdWJsZSBkZWYpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IHJlbW92ZVByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHZhbCA9IHJlbW92ZVByb3BlcnR5KGtleTIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eShrZXkyKTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBkZWYgOiBEb3VibGUucGFyc2VEb3VibGUodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB7QGxpbmsgVHlwZWRQcm9wZXJ0aWVzI3JlbW92ZUxvbmdQcm9wZXJ0eX0gdG8gYWxsb3cKKyAgICAgKiBhIHZhbHVlIHRvIGFwcGVhciB1bmRlciBlaXRoZXIgb2YgdHdvIGtleXM7IHVzZWZ1bCBmb3Igc2hvcnQgYW5kCisgICAgICogbG9uZyB2ZXJzaW9ucyBvZiBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIGxvbmcgcmVtb3ZlTG9uZ1Byb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBrZXkyLCBsb25nIGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gcmVtb3ZlUHJvcGVydHkoa2V5KTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgdmFsID0gcmVtb3ZlUHJvcGVydHkoa2V5Mik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlbW92ZVByb3BlcnR5KGtleTIpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IGRlZiA6IExvbmcucGFyc2VMb25nKHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2Yge0BsaW5rIFR5cGVkUHJvcGVydGllcyNyZW1vdmVJbnRQcm9wZXJ0eX0gdG8gYWxsb3cKKyAgICAgKiBhIHZhbHVlIHRvIGFwcGVhciB1bmRlciBlaXRoZXIgb2YgdHdvIGtleXM7IHVzZWZ1bCBmb3Igc2hvcnQgYW5kCisgICAgICogbG9uZyB2ZXJzaW9ucyBvZiBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIGludCByZW1vdmVJbnRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcga2V5MiwgaW50IGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gcmVtb3ZlUHJvcGVydHkoa2V5KTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgdmFsID0gcmVtb3ZlUHJvcGVydHkoa2V5Mik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlbW92ZVByb3BlcnR5KGtleTIpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IGRlZiA6IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB7QGxpbmsgUHJvcGVydGllcyNyZW1vdmVQcm9wZXJ0eX0gdG8gYWxsb3cKKyAgICAgKiBhIHZhbHVlIHRvIGFwcGVhciB1bmRlciBlaXRoZXIgb2YgdHdvIGtleXM7IHVzZWZ1bCBmb3Igc2hvcnQgYW5kCisgICAgICogbG9uZyB2ZXJzaW9ucyBvZiBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcga2V5MiwgU3RyaW5nIGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gcmVtb3ZlUHJvcGVydHkoa2V5KTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyByZW1vdmVQcm9wZXJ0eShrZXkyLCBkZWYpIDogdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltbXV0YWJsZSBlbXB0eSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5T3B0aW9ucyBleHRlbmRzIE9wdGlvbnMgeworCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1BhcmFtZXRlclRlbXBsYXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1BhcmFtZXRlclRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhZjY3MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUGFyYW1ldGVyVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSB0ZW1wbGF0ZSB0aGF0IGFsbG93cyBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9ucy4gUGFyYW1ldGVycyBzaG91bGQgYmUKKyAqIHBsYWNlZCBpbiB0aGUgdGVtcGxhdGUgaW4gdGhlIGZvcm0gJHtwYXJhbS1uYW1lfS4gVXNlIHRoZQorICoge0BsaW5rICNzZXRQYXJhbWV0ZXJ9IG1ldGhvZCB0byBzZXQgdGhlIHBhcmFtZXRlciB2YWx1ZXMsIHdoaWNoIHdpbGwgYmUKKyAqIHN1YnN0aXR1dGVkIGludG8gdGhlIHRlbXBsYXRlIG9uIGNhbGxzIHRvIHtAbGluayAjd3JpdGV9IGFuZAorICoge0BsaW5rICN0b1N0cmluZ30uIElmIGEgcGFyYW1ldGVyIGlzIGVuY291bnRlcmVkIHRoYXQgaGFzbid0IGJlZW4gc2V0LCB0aGVuCisgKiB0aGUgcGFyYW1ldGVyIGtleSBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgY29ycmVzcG9uZGluZyBTeXN0ZW0gcHJvcGVydHkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlclRlbXBsYXRlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBfYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHByaXZhdGUgZmluYWwgTWFwIF9wYXJhbXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgdGVtcGxhdGUuCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlclRlbXBsYXRlIGFwcGVuZChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyVGVtcGxhdGUgYXBwZW5kKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyVGVtcGxhdGUgYXBwZW5kKGNoYXIgdmFsdWUpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyVGVtcGxhdGUgYXBwZW5kKGRvdWJsZSB2YWx1ZSkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJUZW1wbGF0ZSBhcHBlbmQoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyVGVtcGxhdGUgYXBwZW5kKGludCB2YWx1ZSkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJUZW1wbGF0ZSBhcHBlbmQobG9uZyB2YWx1ZSkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJUZW1wbGF0ZSBhcHBlbmQoc2hvcnQgdmFsdWUpIHsKKyAgICAgICAgX2J1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyVGVtcGxhdGUgYXBwZW5kKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBfYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJUZW1wbGF0ZSBhcHBlbmQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhcHBlbmQobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgaW50ZXJuYWwgdGVtcGxhdGUuCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlclRlbXBsYXRlIGFwcGVuZChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciBidWYgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlICgobGluZSA9IGJ1Zi5yZWFkTGluZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgX2J1Zi5hcHBlbmQobGluZSkuYXBwZW5kKFNFUCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGludGVybmFsIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJUZW1wbGF0ZSBhcHBlbmQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGFwcGVuZChyZWFkZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHBhcmFtZXRlciBoYXMgYmVlbiBnaXZlbiBhIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gX3BhcmFtcy5jb250YWluc0tleShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHNldCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gX3BhcmFtcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbCkgeworICAgICAgICByZXR1cm4gX3BhcmFtcy5wdXQobmFtZSwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlcyBmb3IgYWxsIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBnaXZlbiBtYXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhNYXAgcGFyYW1zKSB7CisgICAgICAgIF9wYXJhbXMucHV0QWxsKHBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIHJlY29yZGVkIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkgeworICAgICAgICBfcGFyYW1zLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgdmFsdWUgdGVtcGxhdGUgd2l0aCBhbGwgcGFyYW1ldGVycworICAgICAqIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgY3VycmVudCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgaWYgKF9idWYubGVuZ3RoKCkgPT0gMCB8fCBfcGFyYW1zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBfYnVmLnRvU3RyaW5nKCk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNvcHkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbSA9IG51bGw7CisgICAgICAgIGNoYXIgY2gsIGxhc3QgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9idWYubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2ggPSBfYnVmLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChsYXN0ID09ICckJyAmJiBjaCA9PSAneycpIHsKKyAgICAgICAgICAgICAgICBjb3B5LmRlbGV0ZUNoYXJBdChjb3B5Lmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICd9JyAmJiBwYXJhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9wYXJhbXMuY29udGFpbnNLZXkocGFyYW0udG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgIGNvcHkuYXBwZW5kKF9wYXJhbXMuZ2V0KHBhcmFtLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvcHkuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eShwYXJhbS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhcmFtLmFwcGVuZChjaCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29weS5hcHBlbmQoY2gpOworCisgICAgICAgICAgICBsYXN0ID0gY2g7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgaW50ZXJuYWwgdmFsdWUgdGVtcGxhdGUgd2l0aCBhbGwgcGFyYW1ldGVycworICAgICAqIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgY3VycmVudCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgaW50ZXJuYWwgdmFsdWUgdGVtcGxhdGUgd2l0aCBhbGwgcGFyYW1ldGVycworICAgICAqIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgY3VycmVudCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKHRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgaW50ZXJuYWwgdmFsdWUgdGVtcGxhdGUgd2l0aCBhbGwgcGFyYW1ldGVycworICAgICAqIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgY3VycmVudCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGUod3JpdGVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUGFyc2VFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjlhOTRkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9QYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZXhjZXB0aW9uLk5lc3RhYmxlUnVudGltZUV4Y2VwdGlvbjsKKworLyoqCisgKiBFeGNlcHRpb24gdHlwZSBmb3IgcGFyc2UgZXJyb3JzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6ZXIuTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oTG9jYWxpemVyLk1lc3NhZ2UgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobXNnLmdldE1lc3NhZ2UoKSwgY2F1c2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUmVmZXJlbmNlSGFzaE1hcC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9SZWZlcmVuY2VIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwNWQyZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUmVmZXJlbmNlSGFzaE1hcC5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKKworLyoqCisgKiBNYXAgaW4gd2hpY2ggdGhlIGtleSwgdmFsdWUsIG9yIGJvdGggbWF5IGJlIHdlYWsvc29mdCByZWZlcmVuY2VzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIFJlZmVyZW5jZUhhc2hNYXAKKyAgICBleHRlbmRzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuUmVmZXJlbmNlTWFwCisgICAgaW1wbGVtZW50cyBSZWZlcmVuY2VNYXAsIFNpemVkTWFwIHsKKworICAgIHByaXZhdGUgaW50IF9tYXhTaXplID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICBwdWJsaWMgUmVmZXJlbmNlSGFzaE1hcChpbnQga2V5VHlwZSwgaW50IHZhbHVlVHlwZSkgeworICAgICAgICBzdXBlcih0b1JlZmVyZW5jZUNvbnN0YW50KGtleVR5cGUpLCB0b1JlZmVyZW5jZUNvbnN0YW50KHZhbHVlVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBSZWZlcmVuY2VIYXNoTWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlLCBpbnQgY2FwYWNpdHksCisgICAgICAgIGZsb2F0IGxvYWRGYWN0b3IpIHsKKyAgICAgICAgc3VwZXIodG9SZWZlcmVuY2VDb25zdGFudChrZXlUeXBlKSwgdG9SZWZlcmVuY2VDb25zdGFudCh2YWx1ZVR5cGUpLAorICAgICAgICAgICAgY2FwYWNpdHksIGxvYWRGYWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmN2ZXIgb3VyIHJlZmVyZW5jZSBjb25zdGFudHMgdG8gQXBhY2hlJ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRvUmVmZXJlbmNlQ29uc3RhbnQoaW50IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJlZmVyZW5jZU1hcC5IQVJEOgorICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLlJlZmVyZW5jZU1hcC4gSEFSRDsKKyAgICAgICAgICAgIGNhc2UgUmVmZXJlbmNlTWFwLlNPRlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuUmVmZXJlbmNlTWFwLiBTT0ZUOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5SZWZlcmVuY2VNYXAuIFdFQUs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFNpemUoKSB7CisgICAgICAgIHJldHVybiBfbWF4U2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTaXplKGludCBtYXhTaXplKSB7CisgICAgICAgIF9tYXhTaXplID0gKG1heFNpemUgPCAwKSA/IEludGVnZXIuTUFYX1ZBTFVFIDogbWF4U2l6ZTsKKyAgICAgICAgaWYgKF9tYXhTaXplICE9IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgcmVtb3ZlT3ZlcmZsb3coX21heFNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIHNpemUoKSA+PSBfbWF4U2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdmVyZmxvd1JlbW92ZWQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsdWVFeHBpcmVkKE9iamVjdCBrZXkpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBrZXlFeHBpcmVkKE9iamVjdCB2YWx1ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyZWQoKSB7CisgICAgICAgIHB1cmdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBlbnRyaWVzIG92ZXIgbWF4IHNpemUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU92ZXJmbG93KGludCBtYXhTaXplKSB7CisgICAgICAgIE9iamVjdCBrZXk7CisgICAgICAgIHdoaWxlIChzaXplKCkgPiBtYXhTaXplKSB7CisgICAgICAgICAgICBrZXkgPSBrZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgIG92ZXJmbG93UmVtb3ZlZChrZXksIHJlbW92ZShrZXkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmcoaW50IGhhc2hJbmRleCwgaW50IGhhc2hDb2RlLCBPYmplY3Qga2V5LAorICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKF9tYXhTaXplICE9IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgcmVtb3ZlT3ZlcmZsb3coX21heFNpemUgLSAxKTsKKyAgICAgICAgc3VwZXIuYWRkTWFwcGluZyhoYXNoSW5kZXgsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGNyZWF0ZUVudHJ5KEhhc2hFbnRyeSBuZXh0LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksCisgICAgICAgIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc2libGVFbnRyeSh0aGlzLCBuZXh0LCBoYXNoQ29kZSwga2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHVyZ2UoUmVmZXJlbmNlIHJlZikgeworICAgICAgICAvLyB0aGUgbG9naWMgZm9yIHRoaXMgbWV0aG9kIGlzIHRha2VuIGZyb20gdGhlIG9yaWdpbmFsIHB1cmdlIG1ldGhvZAorICAgICAgICAvLyB3ZSdyZSBvdmVycmlkaW5nLCB3aXRoIGFkZGVkIGxvZ2ljIHRvIHRyYWNrIHRoZSBleHBpcmVkIGtleS92YWx1ZQorICAgICAgICBpbnQgaW5kZXggPSBoYXNoSW5kZXgocmVmLmhhc2hDb2RlKCksIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgQWNjZXNzaWJsZUVudHJ5IGVudHJ5ID0gKEFjY2Vzc2libGVFbnRyeSkgZGF0YVtpbmRleF07CisgICAgICAgIEFjY2Vzc2libGVFbnRyeSBwcmV2ID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IGtleSA9IG51bGwsIHZhbHVlID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwdXJnZShlbnRyeSwgcmVmKSkgeworICAgICAgICAgICAgICAgIGlmIChpc0hhcmQoa2V5VHlwZSkpCisgICAgICAgICAgICAgICAgICAgIGtleSA9IGVudHJ5LmtleSgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzSGFyZCh2YWx1ZVR5cGUpKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudHJ5LnZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XSA9IGVudHJ5Lm5leHRFbnRyeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJldi5zZXROZXh0RW50cnkoZW50cnkubmV4dEVudHJ5KCkpOworICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXYgPSBlbnRyeTsKKyAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dEVudHJ5KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5ICE9IG51bGwpCisgICAgICAgICAgICB2YWx1ZUV4cGlyZWQoa2V5KTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGtleUV4cGlyZWQodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlZSB0aGUgY29kZSBmb3IgPGNvZGU+UmVmZXJlbmNlTWFwLlJlZmVyZW5jZUVudHJ5LnB1cmdlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHVyZ2UoQWNjZXNzaWJsZUVudHJ5IGVudHJ5LCBSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSAoIWlzSGFyZChrZXlUeXBlKSAmJiBlbnRyeS5rZXkoKSA9PSByZWYpCisgICAgICAgICAgICB8fCAoIWlzSGFyZCh2YWx1ZVR5cGUpICYmIGVudHJ5LnZhbHVlKCkgPT0gcmVmKTsKKyAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICBpZiAoIWlzSGFyZChrZXlUeXBlKSkKKyAgICAgICAgICAgICAgICAoKFJlZmVyZW5jZSkgZW50cnkua2V5KCkpLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoIWlzSGFyZCh2YWx1ZVR5cGUpKQorICAgICAgICAgICAgICAgICgoUmVmZXJlbmNlKSBlbnRyeS52YWx1ZSgpKS5jbGVhcigpOworICAgICAgICAgICAgZWxzZSBpZiAocHVyZ2VWYWx1ZXMpCisgICAgICAgICAgICAgICAgZW50cnkubnVsbFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIYXJkKGludCB0eXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuIFJlZmVyZW5jZU1hcC5IQVJEOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvV3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlSW50KF9tYXhTaXplKTsKKyAgICAgICAgc3VwZXIuZG9Xcml0ZU9iamVjdChvdXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvUmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX21heFNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIHN1cGVyLmRvUmVhZE9iamVjdChpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uIG9mIHRoZSBiYXNlIGVudHJ5IHR5cGUgdGhhdCBhbGxvd3Mgb3VyIG91dGVyIGNsYXNzIHRvIGFjY2VzcworICAgICAqIHByb3RlY3RlZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY2Nlc3NpYmxlRW50cnkgZXh0ZW5kcyBSZWZlcmVuY2VFbnRyeSB7CisKKyAgICAgICAgcHVibGljIEFjY2Vzc2libGVFbnRyeShvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLgorICAgICAgICAgICAgQWJzdHJhY3RSZWZlcmVuY2VNYXAgbWFwLCBIYXNoRW50cnkgbmV4dCwKKyAgICAgICAgICAgIGludCBoYXNoQ29kZSwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihtYXAsIG5leHQsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3Qga2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgdmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBudWxsVmFsdWUoKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZUVudHJ5IG5leHRFbnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoQWNjZXNzaWJsZUVudHJ5KSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEVudHJ5KEFjY2Vzc2libGVFbnRyeSBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9SZWZlcmVuY2VIYXNoU2V0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1JlZmVyZW5jZUhhc2hTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM0NDlhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9SZWZlcmVuY2VIYXNoU2V0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0Lk1hcEJhY2tlZFNldDsKKworLyoqCisgKiBBIHNldCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHN0b3JlZCBhcyB3ZWFrIG9yIHNvZnQgcmVmZXJlbmNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlSGFzaFNldCBpbXBsZW1lbnRzIFNldCwgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIEhhcmQgcmVmZXJlbmNlIG1hcmtlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVJEID0gMDsKKworICAgIC8qKgorICAgICAqIFNvZnQgcmVmZXJlbmNlIG1hcmtlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0ZUID0gMTsKKworICAgIC8qKgorICAgICAqIFdlYWsgcmVmZXJlbmNlIG1hcmtlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUFLID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBEVU1NWV9WQUwgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldCBfc2V0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgc2V0IHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBSZWZlcmVuY2VIYXNoU2V0KGludCByZWZUeXBlKSB7CisgICAgICAgIGlmIChyZWZUeXBlID09IEhBUkQpCisgICAgICAgICAgICBfc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgbWFwUmVmVHlwZSA9IChyZWZUeXBlID09IFdFQUspID8gb3JnLmFwYWNoZS5jb21tb25zLgorICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25zLm1hcC5SZWZlcmVuY2VNYXAuV0VBSyA6IG9yZy5hcGFjaGUuCisgICAgICAgICAgICAgICAgY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuUmVmZXJlbmNlTWFwLlNPRlQ7CisgICAgICAgICAgICBfc2V0ID0gTWFwQmFja2VkU2V0LmRlY29yYXRlKG5ldyBvcmcuYXBhY2hlLmNvbW1vbnMuCisgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMubWFwLlJlZmVyZW5jZU1hcChtYXBSZWZUeXBlLAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuCisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZU1hcC5IQVJEKSwgRFVNTVlfVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBfc2V0LmFkZChvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQuYWRkQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfc2V0LmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gX3NldC5jb250YWlucyhvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICByZXR1cm4gX3NldC5jb250YWluc0FsbChjb2xsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gX3NldC5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gX3NldC5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBfc2V0LnJlbW92ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQucmVtb3ZlQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQucmV0YWluQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworICAgICAgICByZXR1cm4gX3NldC50b0FycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyKSB7CisgICAgICAgIHJldHVybiBfc2V0LnRvQXJyYXkoYXJyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gX3NldC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmZXJlbmNlSGFzaFNldCkKKyAgICAgICAgICAgIG9iaiA9ICgoUmVmZXJlbmNlSGFzaFNldCkgb2JqKS5fc2V0OworICAgICAgICByZXR1cm4gX3NldC5lcXVhbHMob2JqKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1JlZmVyZW5jZU1hcC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9SZWZlcmVuY2VNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU1OWM1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9SZWZlcmVuY2VNYXAuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSB7QGxpbmsgTWFwfSB0eXBlIHRoYXQgY2FuIGhvbGQgaXRzIGtleXMsIHZhbHVlcywgb3IgYm90aCB3aXRoCisgKiB3ZWFrIG9yIHNvZnQgcmVmZXJlbmNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZU1hcCBleHRlbmRzIE1hcCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVJEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUFLID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0ZUID0gMjsKKworICAgIC8qKgorICAgICAqIFB1cmdlIHN0YWxlIGVudHJpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRXhwaXJlZCgpOworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGFibGUgY2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgcmVmZXJlbmNlIGV4cGlyZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGZvciB0aGUgZXhwaXJlZCBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBrZXlFeHBpcmVkKE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkYWJsZSBjYWxsYmFjayBmb3Igd2hlbiBhIHZhbHVlIHJlZmVyZW5jZSBleHBpcmVzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUga2V5IGZvciB0aGUgZXhwaXJlZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlRXhwaXJlZChPYmplY3Qga2V5KTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUmVzb3VyY2VCdW5kbGVQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9SZXNvdXJjZUJ1bmRsZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3MDMyOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvUmVzb3VyY2VCdW5kbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogQSBzaW1wbGUgbWVjaGFuaXNtIGZvciBsb29raW5nIHVwIFJlc291cmNlQnVuZGxlIGluc3RhbmNlcworICogYWNyb3NzIGRpZmZlcmVudCBwb3RlbnRpYWwgc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBoZW4gS2ltCisgKi8KK2ludGVyZmFjZSBSZXNvdXJjZUJ1bmRsZVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEZpbmQgYSBSZXNvdXJjZUJ1bmRsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBsb2NhbGUsIGFuZCBjbGFzcyBsb2FkZXIKKyAgICAgKiAod2hpY2ggbWF5IGJlIG51bGwpLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUsIExvY2FsZSBsb2NhbGUsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcik7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU2VydmljZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU2VydmljZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhiZTgwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9TZXJ2aWNlcy5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzZXMgdG8gbG9jYXRlIHNlcnZpY2VzLCBhcyBkZWZpbmVkIGluIHRoZSA8YQorICogaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2phci9qYXIuaHRtbAorICogI1NlcnZpY2UlMjBQcm92aWRlciI+SmFyIEZpbGUgU3BlY2lmaWNhdGlvbjwvYT4uIE1vc3Qgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcworICogY2xhc3MgY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIDxlbT5zdW4ubWlzYy5TZXJ2aWNlPC9lbT4gY2xhc3MsIGJ1dCBzaW5jZQorICogaXQgaXMgdW5kb2N1bWVudGVkLCB3ZSBjYW5ub3QgcmVseSBvbiBpdHMgQVBJLgorICogU2VydmljZSBsb2NhdGlvbiBmb3IgYSBzcGVjaWZpZWQgaW50ZXJmYWNlIGlzIGRvbmUgYnkgc2VhcmNoaW5nIGZvciB0aGUKKyAqIHJlc291cmNlIDxlbT4vTUVUQS1JTkYvc2VydmljZXMvPC9lbT48aT5zZXJ2aWNlLmNsYXNzLm5hbWU8L2k+LCBhbmQKKyAqIGxvYWRpbmcgdGhlIHJlc291cmNlLgorICogTWV0aG9kcyBpbiB0aGlzIGNsYXNzIHRoYXQgZG8gbm90IGRlY2xhcmUgZXhjZXB0aW9ucyB3aWxsIG5ldmVyIHRocm93CisgKiBSdW50aW1lIGV4Y2VwdGlvbnM6IGV4Y2VwdGlvbnMgYXJlIHNpbGVudGx5IHN3YWxsb3dlZCBhbmQgZW1wdHkgYXJyYXkgdmFsdWVzCisgKiBhcmUgcmV0dXJuZWQuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiTUVUQS1JTkYvc2VydmljZXMvIjsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzIG9mIGNsYXNzIG5hbWVzIG9mIGFsbCBrbm93biBzZXJ2aWNlCisgICAgICogaW1wbGVtZW50b3JzIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG9yIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SW1wbGVtZW50b3JzKENsYXNzIHNlcnZpY2VDbGFzcykgeworICAgICAgICByZXR1cm4gZ2V0SW1wbGVtZW50b3JzKHNlcnZpY2VDbGFzcywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3Mgb2YgY2xhc3MgbmFtZXMgb2YgYWxsIGtub3duIHNlcnZpY2UKKyAgICAgKiBpbXBsZW1lbnRvcnMgb2YgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2Ugb3IgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRJbXBsZW1lbnRvcnMoQ2xhc3Mgc2VydmljZUNsYXNzLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldEltcGxlbWVudG9ycyhzZXJ2aWNlQ2xhc3MuZ2V0TmFtZSgpLCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzIG9mIGNsYXNzIG5hbWVzIG9mIGFsbCBrbm93biBzZXJ2aWNlCisgICAgICogaW1wbGVtZW50b3JzIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZShhcyByZXNvbHZlZCBieSB0aGUgY3VycmVudAorICAgICAqIHRocmVhZCdzIGNvbnRleHQgY2xhc3MgbG9hZGVyKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEltcGxlbWVudG9ycyhTdHJpbmcgc2VydmljZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEltcGxlbWVudG9ycyhzZXJ2aWNlTmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3Mgb2YgY2xhc3MgbmFtZXMgb2YgYWxsIGtub3duIHNlcnZpY2UKKyAgICAgKiBpbXBsZW1lbnRvcnMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lLCBhcyByZXNvbHZlZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICoge0BsaW5rIENsYXNzTG9hZGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEltcGxlbWVudG9ycyhTdHJpbmcgc2VydmljZU5hbWUsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXQgcmVzb3VyY2VMaXN0ID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHJlc291cmNlcyA9IGxvYWRlci5nZXRSZXNvdXJjZXMoUFJFRklYICsgc2VydmljZU5hbWUpOworICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZXMoKFVSTCkgcmVzb3VyY2VzLm5leHRFbGVtZW50KCksIHJlc291cmNlTGlzdCk7CisKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHJlc291cmNlTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzb3VyY2VMaXN0CisgICAgICAgICAgICAgICAgLnNpemUoKV0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc2lsZW50bHkgc3dhbGxvdyBhbGwgZXhjZXB0aW9ucy4KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIFVSTCByZXNvdXJjZSBhbmQgYWRkIHRoZSBsaXN0ZWQgY2xhc3MgbmFtZXMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIFNldC4gQ2xhc3MgbmFtZXMgYXJlIHNlcGFyYXRlZCBieSBsaW5lcy4gTGluZXMgc3RhcnRpbmcgd2l0aCAnIycgYXJlCisgICAgICogaWdub3JlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlc291cmNlcyhVUkwgdXJsLCBTZXQgc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICAgICAgaW4pKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aCgiIyIpCisgICAgICAgICAgICAgICAgICAgIHx8IGxpbmUudHJpbSgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiMgXHQiKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dCA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHQudHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQubGVuZ3RoKCkgPiAwICYmICFuZXh0LnN0YXJ0c1dpdGgoIiMiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKG5leHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy8gc2lsZW50bHkgY29uc3VtZSBleGNlcHRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NbXSBnZXRJbXBsZW1lbnRvckNsYXNzZXMoQ2xhc3Mgc2VydmljZUNsYXNzKSB7CisgICAgICAgIHJldHVybiBnZXRJbXBsZW1lbnRvckNsYXNzZXMoc2VydmljZUNsYXNzLmdldE5hbWUoKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDbGFzc1tdIGdldEltcGxlbWVudG9yQ2xhc3NlcyhDbGFzcyBzZXJ2aWNlQ2xhc3MsCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICByZXR1cm4gZ2V0SW1wbGVtZW50b3JDbGFzc2VzKHNlcnZpY2VDbGFzcy5nZXROYW1lKCksIGxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIENsYXNzIG9iamVjdHMgb2YgYWxsIGtub3duIHNlcnZpY2UgaW1wbGVtZW50b3JzIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBjbGFzcyBuYW1lKGFzIHJlc29sdmVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbnRleHQgY2xhc3MKKyAgICAgKiBsb2FkZXIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NbXSBnZXRJbXBsZW1lbnRvckNsYXNzZXMoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRJbXBsZW1lbnRvckNsYXNzZXMoc2VydmljZU5hbWUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NbXSBnZXRJbXBsZW1lbnRvckNsYXNzZXMoU3RyaW5nIHNlcnZpY2VOYW1lLAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbXBsZW1lbnRvckNsYXNzZXMoc2VydmljZU5hbWUsIGxvYWRlciwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIHdpdGggc2tpcG1pc3NpbmcKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NbMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgQ2xhc3Mgb2JqZWN0cyBvZiBhbGwga25vd24gc2VydmljZSBpbXBsZW1lbnRvcnMgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGFzIHJlc29sdmVkIGJ5IHRoZSBzcGVjaWZpZWQge0BsaW5rIENsYXNzTG9hZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBza2lwTWlzc2luZyBpZiB0cnVlLCB0aGVuIGlnbm9yZSBjbGFzc2VzIHRoYXQgY2Fubm90IGJlIGxvYWRlZCBieQorICAgICAqIHRoZSBjbGFzc2xvYWRlcjsgb3RoZXJ3aXNlLCByZXNvbHV0aW9uIGZhaWx1cmVzIHdpbGwgdGhyb3cgYQorICAgICAqIHtAbGluayBDbGFzc05vdEZvdW5kRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzW10gZ2V0SW1wbGVtZW50b3JDbGFzc2VzKFN0cmluZyBzZXJ2aWNlTmFtZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyLCBib29sZWFuIHNraXBNaXNzaW5nKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBnZXRJbXBsZW1lbnRvcnMoc2VydmljZU5hbWUsIGxvYWRlcik7CisgICAgICAgIGlmIChuYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1swXTsKKworICAgICAgICBMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KG5hbWVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoQ2xhc3MuZm9yTmFtZShuYW1lc1tpXSwgZmFsc2UsIGxvYWRlcikpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFza2lwTWlzc2luZykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IgZWN2ZSkgeworICAgICAgICAgICAgICAgIGlmICghc2tpcE1pc3NpbmcpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGVjdmU7CisgICAgICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgbGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBNaXNzaW5nKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKENsYXNzW10pIGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1NpbXBsZVJlZ2V4LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1NpbXBsZVJlZ2V4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlM2Q1MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU2ltcGxlUmVnZXguamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKKy8qKgorICogQWxsb3dzIGZvciBzaW1wbGUgcmVnZXggc3R5bGUgdGVzdGluZyBvZiBzdHJpbmdzLiBUaGUgd2lsZGNhcmQgJy4nCisgKiBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbnkgc2luZ2xlIGNoYXJhY3Rlciwgd2hpbGUgJy4qJyBpcyB1c2VkIHRvIHJlcHJlc2VudAorICogYW55IHNlcmllcyBvZiAwIG9yIG1vcmUgY2hhcmFjdGVycy4gRXhhbXBsZXM6PGJyIC8+CisgKiA8Y29kZT4gU2ltcGxlUmVnZXggcmUgPSBuZXcgU2ltcGxlUmVnZXgoInRoZSBxdS5jayAuKiBkb2ciLCB0cnVlKTsKKyAqIGJvb2xlYW4gbWF0Y2hlcyA9IHJlLm1hdGNoZXMoIlRoZSBxdWljayBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nIik7CisgKiA8L2NvZGU+CisgKgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU2ltcGxlUmVnZXggeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhwcjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2FzZUluc2Vuc2l0aXZlOworCisgICAgcHVibGljIFNpbXBsZVJlZ2V4KFN0cmluZyBleHByLCBib29sZWFuIGNhc2VJbnNlbnNpdGl2ZSkgeworICAgICAgICB0aGlzLmNhc2VJbnNlbnNpdGl2ZSA9IGNhc2VJbnNlbnNpdGl2ZTsKKworICAgICAgICAvLyBJZiB3ZSdyZSBjYXNlIGluc2Vuc2l0aXZlLCB0b0xvd2VyQ2FzZSB0aGUgZXhwci4gIFdlJ2xsIHRvTG93ZXJDYXNlCisgICAgICAgIC8vIGVhY2ggdGFyZ2V0LCB0b28sIGluIHRoZSBtYXRjaGVzIGNhbGwuCisgICAgICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpCisgICAgICAgICAgICB0aGlzLmV4cHIgPSBleHByLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuZXhwciA9IGV4cHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIC8vIElmIHdlJ3JlIGNhc2UgaW5zZW5zaXRpdmUsIHRvTG93ZXJDYXNlIHRoZSB0YXJnZXQKKyAgICAgICAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkKKyAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC50b0xvd2VyQ2FzZSgpOworCisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHdlIGFyZSBub3QgcG9zaXRpb24gaW5kZXBlbmRlbnQoIm1vYmlsZSIpLiBXZSBvbmx5CisgICAgICAgIC8vIGJlY29tZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBvbmNlIHdlIGhpdCBvdXIgZmlyc3QgIi4qIi4KKyAgICAgICAgYm9vbGVhbiBtb2JpbGUgPSBmYWxzZTsKKworICAgICAgICAvLyBGaW5kIG9jY3VycmVuY2VzIG9mICIuKiIgaW4gdGhlIGV4cHJlc3Npb24uCisgICAgICAgIGludCBleHByUG9zID0gMDsKKyAgICAgICAgaW50IHRhcmdldFBvcyA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgIi4qIgorICAgICAgICAgICAgaW50IHN0YXIgPSBleHByLmluZGV4T2YoIi4qIiwgZXhwclBvcyk7CisKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIGF0IGEgIi4qIiBub3csIHNpbXBseSBza2lwIGl0IGFuZCBiZWNvbWUgcG9zaXRpb24KKyAgICAgICAgICAgIC8vIGluZGVwZW5kZW50CisgICAgICAgICAgICBpZiAoc3RhciA9PSBleHByUG9zKSB7CisgICAgICAgICAgICAgICAgbW9iaWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBleHByUG9zICs9IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSAiLioicywgdGhlbiB3ZSdyZSBlZmZlY3RpdmVseSBubyBsb25nZXIKKyAgICAgICAgICAgIC8vIHBvc2l0aW9uIGluZGVwZW5kZW50KGFzc3VtaW5nIHdlIGV2ZW4gd2VyZSBiZWZvcmUpLCBzaW5jZQorICAgICAgICAgICAgLy8gd2UgbXVzdCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZXhwci5sZW5ndGgoKSAtIGV4cHJQb3M7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgbW9iaWxlLCB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGV4cHIgYW5kCisgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoLiAgSWYgbm90LCB0aGVuIGl0J3Mgbm90IGEKKyAgICAgICAgICAgICAgICAvLyBtYXRjaC4gIElmIHdlJ3JlIG1vYmlsZSwgdGhlbiB0aGUgbGVuZ3RoIGRvZXNuJ3QgaGF2ZSB0bworICAgICAgICAgICAgICAgIC8vIGJlIHRoZSBzYW1lIGFzIGxvbmcgYXMgdGhlIHJlbWFpbmRlciBvZiB0aGUgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgIC8vIGlzIGVxdWFsIHRvIHRoZSBlbmQgb2YgdGhlIHRhcmdldAorICAgICAgICAgICAgICAgIGlmICghbW9iaWxlICYmIHRhcmdldFBvcyAhPSB0YXJnZXQubGVuZ3RoKCkgLSBsZW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIEluIGFueWNhc2UsIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgbXVzdCBiZQorICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgdGhlIGV4cHJlc3Npb24uCisgICAgICAgICAgICAgICAgLy8gKFdlIGNoZWNrIG5vdyB0byBhdm9pZCBzZW5kaW5nIGEgbmVnYXRpdmUgc3RhcnQgcG9zIHRvCisgICAgICAgICAgICAgICAgLy8gaW5kZXhPZikKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCgpIDwgbGVuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvLyBNYXRjaCB0aGUgZW5kIG9mIHRoZSB0YXJnZXQgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgaW50IG1hdGNoID0gaW5kZXhPZih0YXJnZXQsIHRhcmdldC5sZW5ndGgoKSAtIGxlbiwgZXhwclBvcywKKyAgICAgICAgICAgICAgICAgICAgbGVuLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWF0Y2ggdGhlIGZyYWdtZW50IG9mIHRoZSBleHByZXNzaW9uIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgICAgIGludCBtYXRjaCA9IGluZGV4T2YodGFyZ2V0LCB0YXJnZXRQb3MsIGV4cHJQb3MsCisgICAgICAgICAgICAgICAgc3RhciAtIGV4cHJQb3MsICFtb2JpbGUpOworICAgICAgICAgICAgaWYgKG1hdGNoID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHRhcmdldFBvcyA9IG1hdGNoICsgc3RhciAtIGV4cHJQb3M7CisgICAgICAgICAgICBleHByUG9zID0gc3RhciArIDI7CisgICAgICAgICAgICBtb2JpbGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2ggYSBzZWN0aW9uIG9mIHRhcmdldCB0byBhIGZyYWdtZW50IG9mIHRoZSBleHByZXNzaW9uLgorICAgICAqIElmIHdlJ3JlIG9ubHkgdG8gbWF0Y2ggdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFyZ2V0LCBiZWdpbk9ubHkKKyAgICAgKiB3aWxsIGJlIHRydWUsIG90aGVyd2lzZSB3ZSBjYW4gbWF0Y2ggYW55bW9yZSBpbiB0aGUgdGFyZ2V0KHN0YXJ0aW5nCisgICAgICogYXQgdGhlIHRhcmdldFN0YXJ0IHBvc2l0aW9uKS4gQSAiLiIgaW4gdGhlIGV4cHJlc3Npb24gbWF0Y2hlcyBhbnkKKyAgICAgKiBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaW5kZXhPZihTdHJpbmcgdGFyZ2V0LCBpbnQgdGFyZ2V0U3RhcnQsCisgICAgICAgIGludCBleHByU3RhcnQsIGludCBleHByTGVuZ3RoLCBib29sZWFuIGJlZ2luT25seSkgeworICAgICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgdGFyZ2V0IHNlZWluZyBpZiB0aGVyZSBpcyBhIG1hdGNoCisgICAgICAgIHdoaWxlICh0YXJnZXQubGVuZ3RoKCkgLSB0YXJnZXRTdGFydCA+PSBleHByTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgc3VjY2Vzcy4gIElmIHRoZXJlIGlzbid0IGEgbWF0Y2ggd2UnbGwgYnJlYWsgb3V0CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwckxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gIi4iIGluIHRoZSBleHByIG1hdGNoZXMgYW55IGNoYXJhY3RlciBpbiB0aGUgdGFyZ2V0CisgICAgICAgICAgICAgICAgaWYgKGV4cHIuY2hhckF0KGV4cHJTdGFydCArIGkpICE9ICcuJyAmJgorICAgICAgICAgICAgICAgICAgICBleHByLmNoYXJBdChleHByU3RhcnQgKyBpKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmNoYXJBdCh0YXJnZXRTdGFydCArIGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3RhcnQ7CisKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIHBvc2l0aW9uIGRlcGVuZGVudChiZWdpbk9ubHkgPT0gdHJ1ZSksIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRoZSBzZWFyY2gKKyAgICAgICAgICAgIGlmIChiZWdpbk9ubHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICB0YXJnZXRTdGFydCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1NpbXBsZVJlc291cmNlQnVuZGxlUHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU2ltcGxlUmVzb3VyY2VCdW5kbGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTMzMmIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1NpbXBsZVJlc291cmNlQnVuZGxlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIHtAbGluayBSZXNvdXJjZUJ1bmRsZVByb3ZpZGVyfSB0aGF0IHVzZXMgSmF2YSdzIGJ1aWx0LWluIHJlc291cmNlCisgKiBidW5kbGUgbG9va3VwIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgU2ltcGxlUmVzb3VyY2VCdW5kbGVQcm92aWRlciBpbXBsZW1lbnRzIFJlc291cmNlQnVuZGxlUHJvdmlkZXIgeworCisgICAgcHVibGljIFJlc291cmNlQnVuZGxlIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSwgTG9jYWxlIGxvY2FsZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobmFtZSwgbG9jYWxlLCBsb2FkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSB3aXRoIHRoZSBkZWZhdWx0IGNsYXNzIGxvYWRlcgorICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKG5hbWUsIGxvY2FsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1NpemVkTWFwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1NpemVkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmMjI0ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU2l6ZWRNYXAuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSB7QGxpbmsgTWFwfSB0eXBlIHRoYXQgbWFpbnRhaW5zIGEgbWF4aW11bSBzaXplLCBhdXRvbWF0aWNhbGx5CisgKiByZW1vdmluZyBlbnRyaWVzIHdoZW4gdGhlIG1heGltdW0gaXMgZXhjZWVkZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBTaXplZE1hcCBleHRlbmRzIE1hcCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcywgb3IgSW50ZWdlci5NQVhfVkFMVUUgZm9yIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4U2l6ZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMsIG9yIEludGVnZXIuTUFYX1ZBTFVFIGZvciBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTaXplKGludCBtYXgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbWFwIGlzIGZ1bGwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkYWJsZSBjYWxsYmFjayBmb3Igd2hlbiBhbiBvdmVyZmxvdyBlbnRyeSBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3ZlcmZsb3dSZW1vdmVkKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1N0cmVhbVJlc291cmNlQnVuZGxlUHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU3RyZWFtUmVzb3VyY2VCdW5kbGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzcwYjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1N0cmVhbVJlc291cmNlQnVuZGxlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKiB7QGxpbmsgUmVzb3VyY2VCdW5kbGVQcm92aWRlcn0gdGhhdCB1c2VzIHRoZQorICoge0BsaW5rIENsYXNzTG9hZGVyI2dldFJlc291cmNlQXNTdHJlYW19IG1ldGhvZCB0byBsb2FkIHJlc291cmNlcy4KKyAqIENyZWF0ZWQgZm9yIHVzZSB1bmRlciBXU0FELgorICoKKyAqIEBhdXRob3IgU3RlcGhlbiBLaW0KKyAqLworY2xhc3MgU3RyZWFtUmVzb3VyY2VCdW5kbGVQcm92aWRlciBpbXBsZW1lbnRzIFJlc291cmNlQnVuZGxlUHJvdmlkZXIgeworCisgICAgcHVibGljIFJlc291cmNlQnVuZGxlIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSwgTG9jYWxlIGxvY2FsZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFN0cmluZyByc3JjID0gbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIucHJvcGVydGllcyI7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyc3JjKTsKKyAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU3RyaW5nRGlzdGFuY2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvU3RyaW5nRGlzdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJmNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9TdHJpbmdEaXN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgY2FsY3VsYXRpbmcgc3RyaW5nIGRpc3RhbmNlLgorICoKKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4CisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdEaXN0YW5jZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgc3RyaW5nIHdpdGggdGhlIGNsb3Nlc3QgTGV2ZW5zaHRlaW4gZGlzdGFuY2UKKyAgICAgKiB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2UoU3RyaW5nLENvbGxlY3Rpb24saW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlKFN0cmluZyBzdHIsCisgICAgICAgIFN0cmluZ1tdIGNhbmRpZGF0ZXMpIHsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2Uoc3RyLCBBcnJheXMuYXNMaXN0KGNhbmRpZGF0ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgc3RyaW5nIHdpdGggdGhlIGNsb3Nlc3QgTGV2ZW5zaHRlaW4gZGlzdGFuY2UKKyAgICAgKiB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2UoU3RyaW5nLENvbGxlY3Rpb24saW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlKFN0cmluZyBzdHIsCisgICAgICAgIENvbGxlY3Rpb24gY2FuZGlkYXRlcykgeworICAgICAgICByZXR1cm4gZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2Uoc3RyLCBjYW5kaWRhdGVzLAorICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNhbmRpZGF0ZSBzdHJpbmcgd2l0aCB0aGUgY2xvc2VzdCBMZXZlbnNodGVpbiBkaXN0YW5jZQorICAgICAqIHRvIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDbG9zZXN0TGV2ZW5zaHRlaW5EaXN0YW5jZShTdHJpbmcsQ29sbGVjdGlvbixpbnQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2UoU3RyaW5nIHN0ciwKKyAgICAgICAgU3RyaW5nW10gY2FuZGlkYXRlcywgaW50IHRocmVzaG9sZCkgeworICAgICAgICBpZiAoY2FuZGlkYXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBnZXRDbG9zZXN0TGV2ZW5zaHRlaW5EaXN0YW5jZShzdHIsIEFycmF5cy5hc0xpc3QoY2FuZGlkYXRlcyksCisgICAgICAgICAgICB0aHJlc2hvbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNhbmRpZGF0ZSBzdHJpbmcgd2l0aCB0aGUgY2xvc2VzdCBMZXZlbnNodGVpbiBkaXN0YW5jZQorICAgICAqIHRvIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHVzaW5nIHRoZSB0aHJlc2hvbGQgYXMgdGhlIHNwZWNpZmllZAorICAgICAqIHBlcmNlbnRhZ2Ugb2YgdGhlIGxlbmd0aCBvZiB0aGUgY2FuZGlkYXRlIHN0cmluZygwLjBmLTEuMGYpLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2xvc2VzdExldmVuc2h0ZWluRGlzdGFuY2UoU3RyaW5nLENvbGxlY3Rpb24saW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlKFN0cmluZyBzdHIsCisgICAgICAgIFN0cmluZ1tdIGNhbmRpZGF0ZXMsIGZsb2F0IHRocmVzaG9sZFBlcmNlbnRhZ2UpIHsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBnZXRDbG9zZXN0TGV2ZW5zaHRlaW5EaXN0YW5jZShzdHIsIEFycmF5cy5hc0xpc3QoY2FuZGlkYXRlcyksCisgICAgICAgICAgICB0aHJlc2hvbGRQZXJjZW50YWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgc3RyaW5nIHdpdGggdGhlIGNsb3Nlc3QgTGV2ZW5zaHRlaW4gZGlzdGFuY2UKKyAgICAgKiB0byB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCB1c2luZyB0aGUgdGhyZXNob2xkIGFzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwZXJjZW50YWdlIG9mIHRoZSBsZW5ndGggb2YgdGhlIGNhbmRpZGF0ZSBzdHJpbmcoMC4wZi0xLjBmKS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlKFN0cmluZyxDb2xsZWN0aW9uLGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbG9zZXN0TGV2ZW5zaHRlaW5EaXN0YW5jZShTdHJpbmcgc3RyLAorICAgICAgICBDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIGZsb2F0IHRocmVzaG9sZFBlcmNlbnRhZ2UpIHsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdGhyZXNob2xkUGVyY2VudGFnZSA9IE1hdGgubWluKHRocmVzaG9sZFBlcmNlbnRhZ2UsIDEuMGYpOworICAgICAgICB0aHJlc2hvbGRQZXJjZW50YWdlID0gTWF0aC5tYXgodGhyZXNob2xkUGVyY2VudGFnZSwgMC4wZik7CisKKyAgICAgICAgcmV0dXJuIGdldENsb3Nlc3RMZXZlbnNodGVpbkRpc3RhbmNlKHN0ciwgY2FuZGlkYXRlcywKKyAgICAgICAgICAgIChpbnQpIChzdHIubGVuZ3RoKCkgKiB0aHJlc2hvbGRQZXJjZW50YWdlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2FuZGlkYXRlIHN0cmluZyB3aXRoIHRoZSBjbG9zZXN0IExldmVuc2h0ZWluIGRpc3RhbmNlCisgICAgICogdG8gdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBjaGVjaworICAgICAqIEBwYXJhbSBjYW5kaWRhdGVzIHRoZSBsaXN0IG9mIHN0cmluZ3MgdG8gdGVzdCBhZ2FpbnN0CisgICAgICogQHBhcmFtIHRocmVzaG9sZCB0aGUgdGhyZXNob2xkIGRpc3RhbmNlIGEgY2FuZGlkYXRlIG11c3QgbWVldAorICAgICAqIEBzZWUgI2dldExldmVuc2h0ZWluRGlzdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbG9zZXN0TGV2ZW5zaHRlaW5EaXN0YW5jZShTdHJpbmcgc3RyLAorICAgICAgICBDb2xsZWN0aW9uIGNhbmRpZGF0ZXMsIGludCB0aHJlc2hvbGQpIHsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCB8fCBjYW5kaWRhdGVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZyBtaW5TdHJpbmcgPSBudWxsOworICAgICAgICBpbnQgbWluVmFsdWUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gZ2V0TGV2ZW5zaHRlaW5EaXN0YW5jZShzdHIsIGNhbmRpZGF0ZSk7CisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBtaW5WYWx1ZSkgeworICAgICAgICAgICAgICAgIG1pblZhbHVlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgbWluU3RyaW5nID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBsb3dlc3QgY2xvc2Ugc3RyaW5nIG9ubHkgaWYgd2Ugc3VycGFzcyB0aGUgdGhyZXNoaG9sZAorICAgICAgICBpZiAobWluVmFsdWUgPD0gdGhyZXNob2xkKQorICAgICAgICAgICAgcmV0dXJuIG1pblN0cmluZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHN0cmluZ3MuCisgICAgICogVGhlIGRpc3RhbmNlIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZQorICAgICAqIGFwcGxpZWQgdG8gdGhlIGZpcnN0IHN0cmluZyBpbiBvcmRlciB0byBnZXQgdG8gdGhlIHNlY29uZAorICAgICAqIHN0cmluZy4gRm9yIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobSwgc2VlCisgICAgICogPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbnNodGVpbl9kaXN0YW5jZSI+CisgICAgICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbnNodGVpbl9kaXN0YW5jZTwvYT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TGV2ZW5zaHRlaW5EaXN0YW5jZShTdHJpbmcgcywgU3RyaW5nIHQpIHsKKyAgICAgICAgaW50IG4gPSBzLmxlbmd0aCgpOworICAgICAgICBpbnQgbSA9IHQubGVuZ3RoKCk7CisKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBtOworCisgICAgICAgIGlmIChtID09IDApCisgICAgICAgICAgICByZXR1cm4gbjsKKworICAgICAgICBpbnRbXVtdIG1hdHJpeCA9IG5ldyBpbnRbbiArIDFdW20gKyAxXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspCisgICAgICAgICAgICBtYXRyaXhbaV1bMF0gPSBpOworCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG07IGorKykKKyAgICAgICAgICAgIG1hdHJpeFswXVtqXSA9IGo7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc2kgPSBzLmNoYXJBdChpIC0gMSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG07IGorKykgeworICAgICAgICAgICAgICAgIGludCB0aiA9IHQuY2hhckF0KGogLSAxKTsKKworICAgICAgICAgICAgICAgIGludCBjb3N0OworCisgICAgICAgICAgICAgICAgaWYgKHNpID09IHRqKQorICAgICAgICAgICAgICAgICAgICBjb3N0ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAxOworCisgICAgICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gbWluKG1hdHJpeFtpIC0gMV1bal0gKyAxLCBtYXRyaXhbaV1baiAtIDFdICsgMSwKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4W2kgLSAxXVtqIC0gMV0gKyBjb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXRyaXhbbl1bbV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1pbihpbnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgICAgIGludCBtaSA9IGE7CisKKyAgICAgICAgaWYgKGIgPCBtaSkKKyAgICAgICAgICAgIG1pID0gYjsKKworICAgICAgICBpZiAoYyA8IG1pKQorICAgICAgICAgICAgbWkgPSBjOworCisgICAgICAgIHJldHVybiBtaTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVtcG9yYXJ5Q2xhc3NMb2FkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVtcG9yYXJ5Q2xhc3NMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzE4YThkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZW1wb3JhcnlDbGFzc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgc2VycC5ieXRlY29kZS5sb3dsZXZlbC5Db25zdGFudFBvb2xUYWJsZTsKKworLyoqCisgKiBDbGFzc0xvYWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyBjbGFzc2VzIHRvIGJlIHRlbXBvcmFyaWx5CisgKiBsb2FkZWQgYW5kIHRoZW4gdGhyb3duIGF3YXkuIFVzZWZ1bCBmb3IgdGhlIGVuaGFuY2VyIHRvIGJlIGFibGUKKyAqIHRvIHJ1biBhZ2FpbnN0IGEgY2xhc3Mgd2l0aG91dCBmaXJzdCBsb2FkaW5nKGFuZCB0aHVzIHBvbGx1dGluZykKKyAqIHRoZSBwYXJlbnQgQ2xhc3NMb2FkZXIuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFRlbXBvcmFyeUNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgeworCisgICAgcHVibGljIFRlbXBvcmFyeUNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICBzdXBlcihwYXJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxvYWRDbGFzcyhuYW1lLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IGxvYWRlZCBpdAorICAgICAgICBDbGFzcyBjID0gZmluZExvYWRlZENsYXNzKG5hbWUpOworICAgICAgICBpZiAoYyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGM7CisKKyAgICAgICAgLy8gYnVnICMyODMuIGRlZmVyIHRvIHN5c3RlbSBpZiB0aGUgbmFtZSBpcyBhIHByb3RlY3RlZCBuYW1lLgorICAgICAgICAvLyAic3VuLiIgaXMgcmVxdWlyZWQgZm9yIEpESyAxLjQsIHdoaWNoIGhhcyBhbiBhY2Nlc3MgY2hlY2sgZm9yCisgICAgICAgIC8vIHN1bi5yZWZsZWN0LkdlbmVyYXRlZFNlcmlhbGl6YXRpb25Db25zdHJ1Y3RvckFjY2Vzc29yMQorICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiamF2YXguIikKKyAgICAgICAgICAgIHx8IG5hbWUuc3RhcnRzV2l0aCgic3VuLiIpKQorICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgcmVzb2x2ZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKworICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOworICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZSA9IGdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyAobiA9IHJlc291cmNlLnJlYWQoYiwgMCwgYi5sZW5ndGgpKSAhPSAtMTsKKyAgICAgICAgICAgICAgICBib3V0LndyaXRlKGIsIDAsIG4pKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGJ5dGVbXSBjbGFzc0J5dGVzID0gYm91dC50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgaWYgKGlzQW5ub3RhdGlvbihjbGFzc0J5dGVzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCByZXNvbHZlLCBnZXRDbGFzcygpLgorICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcigpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lQ2xhc3MobmFtZSwgY2xhc3NCeXRlcywgMCwgY2xhc3NCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIHByb2hpYml0ZWQgcGFja2FnZTogZGVmZXIgdG8gdGhlIHBhcmVudAorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5sb2FkQ2xhc3MobmFtZSwgcmVzb2x2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIHBhcmVudAorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhc3QtcGFyc2UgdGhlIGdpdmVuIGNsYXNzIGJ5dGVjb2RlIHRvIGRldGVybWluZSBpZiBpdCBpcyBhbgorICAgICAqIGFubm90YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Fubm90YXRpb24oYnl0ZVtdIGIpIHsKKyAgICAgICAgaWYgKEphdmFWZXJzaW9ucy5WRVJTSU9OIDwgNSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGlkeCA9IENvbnN0YW50UG9vbFRhYmxlLmdldEVuZEluZGV4KGIpOworICAgICAgICBpbnQgYWNjZXNzID0gQ29uc3RhbnRQb29sVGFibGUucmVhZFVuc2lnbmVkU2hvcnQoYiwgaWR4KTsKKyAgICAgICAgcmV0dXJuIChhY2Nlc3MgJiAweDIwMDApICE9IDA7IC8vIGFjY2VzcyBjb25zdGFudCBmb3IgYW5ub3RhdGlvbiB0eXBlCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVHlwZWRQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlOTBkOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVHlwZWRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogQSBzcGVjaWFsaXphdGlvbiBvZiB0aGUge0BsaW5rIFByb3BlcnRpZXN9IG1hcCB0eXBlIHdpdGggYWRkZWQKKyAqIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gcmV0cmlldmUgYW5kIHNldCBvcHRpb25zIGFzIHByaW1pdGl2ZSB2YWx1ZXMuCisgKiBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYWxsIGRhdGEgaXMga2VwdCBpbiBzdHJpbmcgZm9ybS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgVHlwZWRQcm9wZXJ0aWVzIGV4dGVuZHMgUHJvcGVydGllcyB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlZFByb3BlcnRpZXMoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBwcm9wZXJ0aWVzIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHNldCBvZiBkZWZhdWx0cy4KKyAgICAgKgorICAgICAqIEBzZWUgUHJvcGVydGllcyNQcm9wZXJ0aWVzKFByb3BlcnRpZXMpCisgICAgICovCisgICAgcHVibGljIFR5cGVkUHJvcGVydGllcyhQcm9wZXJ0aWVzIGRlZmF1bHRzKSB7CisgICAgICAgIHN1cGVyKGRlZmF1bHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBib29sZWFuLCBvciBmYWxzZSBpZgorICAgICAqIGl0IGRvZXMgbm90IGV4aXN0IGFuZCBoYXMgbm8gc2V0IGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShrZXksIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBib29sZWFuLCBvciB0aGUgZ2l2ZW4KKyAgICAgKiBkZWZhdWx0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcga2V5LCBib29sZWFuIGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgcmV0dXJuICJ0Ii5lcXVhbHNJZ25vcmVDYXNlKHZhbCkgfHwgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBmbG9hdCwgb3IgMCBpZgorICAgICAqIGl0IGRvZXMgbm90IGV4aXN0IGFuZCBoYXMgbm8gc2V0IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBvbiBwYXJzZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldEZsb2F0UHJvcGVydHkoa2V5LCAwRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGEgZmxvYXQsIG9yIHRoZSBnaXZlbgorICAgICAqIGRlZmF1bHQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBvbiBwYXJzZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFByb3BlcnR5KFN0cmluZyBrZXksIGZsb2F0IGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBkZWYgOiBGbG9hdC5wYXJzZUZsb2F0KHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGEgZG91YmxlLCBvciAwIGlmCisgICAgICogaXQgZG9lcyBub3QgZXhpc3QgYW5kIGhhcyBubyBzZXQgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXREb3VibGVQcm9wZXJ0eShrZXksIDBEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBkb3VibGUsIG9yIHRoZSBnaXZlbgorICAgICAqIGRlZmF1bHQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBvbiBwYXJzZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlUHJvcGVydHkoU3RyaW5nIGtleSwgZG91YmxlIGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBkZWYgOiBEb3VibGUucGFyc2VEb3VibGUodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBsb25nLCBvciAwIGlmCisgICAgICogaXQgZG9lcyBub3QgZXhpc3QgYW5kIGhhcyBubyBzZXQgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZ1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldExvbmdQcm9wZXJ0eShrZXksIDBMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBkb3VibGUsIG9yIHRoZSBnaXZlbgorICAgICAqIGRlZmF1bHQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBvbiBwYXJzZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExvbmdQcm9wZXJ0eShTdHJpbmcga2V5LCBsb25nIGRlZikgeworICAgICAgICBTdHJpbmcgdmFsID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gbnVsbCkgPyBkZWYgOiBMb25nLnBhcnNlTG9uZyh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvcGVydHkgdW5kZXIgdGhlIGdpdmVuIGtleSBhcyBhbiBpbnQsIG9yIDAgaWYKKyAgICAgKiBpdCBkb2VzIG5vdCBleGlzdCBhbmQgaGFzIG5vIHNldCBkZWZhdWx0LgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gb24gcGFyc2UgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEludFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldEludFByb3BlcnR5KGtleSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGFuIGludCwgb3IgdGhlIGdpdmVuCisgICAgICogZGVmYXVsdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcga2V5LCBpbnQgZGVmKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSBnZXRQcm9wZXJ0eShrZXkpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IGRlZiA6IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMge0BsaW5rIFByb3BlcnRpZXMjc2V0UHJvcGVydHkoU3RyaW5nLFN0cmluZyl9IHRvIHJlbW92ZQorICAgICAqIHRoZSBrZXkgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNlZSBQcm9wZXJ0aWVzI3NldFByb3BlcnR5KFN0cmluZyxTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsKSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZW1vdmUoa2V5KTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldFByb3BlcnR5KGtleSwgdmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGtleSB0byBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBzZWUgUHJvcGVydGllcyNzZXRQcm9wZXJ0eShTdHJpbmcsU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIGJvb2xlYW4gdmFsKSB7CisgICAgICAgIHNldFByb3BlcnR5KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiBrZXkgdG8gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAc2VlIFByb3BlcnRpZXMjc2V0UHJvcGVydHkoU3RyaW5nLFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBkb3VibGUgdmFsKSB7CisgICAgICAgIHNldFByb3BlcnR5KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiBrZXkgdG8gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAc2VlIFByb3BlcnRpZXMjc2V0UHJvcGVydHkoU3RyaW5nLFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBmbG9hdCB2YWwpIHsKKyAgICAgICAgc2V0UHJvcGVydHkoa2V5LCBTdHJpbmcudmFsdWVPZih2YWwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGtleSB0byBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBzZWUgUHJvcGVydGllcyNzZXRQcm9wZXJ0eShTdHJpbmcsU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIGludCB2YWwpIHsKKyAgICAgICAgc2V0UHJvcGVydHkoa2V5LCBTdHJpbmcudmFsdWVPZih2YWwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGtleSB0byBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBzZWUgUHJvcGVydGllcyNzZXRQcm9wZXJ0eShTdHJpbmcsU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIGxvbmcgdmFsKSB7CisgICAgICAgIHNldFByb3BlcnR5KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgT2JqZWN0IHZhbCA9IHJlbW92ZShrZXkpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IG51bGwgOiB2YWwudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHByb3BlcnR5LCBvciByZXR1cm4gdGhlIGdpdmVuIGRlZmF1bHQgaWYgaXQgZG9lcworICAgICAqIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBkZWYpIHsKKyAgICAgICAgaWYgKCFjb250YWluc0tleShrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgcmV0dXJuIHJlbW92ZVByb3BlcnR5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGEgYm9vbGVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVCb29sZWFuUHJvcGVydHkoU3RyaW5nIGtleSkgeworICAgICAgICBTdHJpbmcgdmFsID0gcmVtb3ZlUHJvcGVydHkoa2V5KTsKKyAgICAgICAgcmV0dXJuICJ0Ii5lcXVhbHNJZ25vcmVDYXNlKHZhbCkgfHwgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBib29sZWFuLCBvciByZXR1cm4gdGhlCisgICAgICogZ2l2ZW4gZGVmYXVsdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVCb29sZWFuUHJvcGVydHkoU3RyaW5nIGtleSwgYm9vbGVhbiBkZWYpIHsKKyAgICAgICAgaWYgKCFjb250YWluc0tleShrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUJvb2xlYW5Qcm9wZXJ0eShrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgcHJvcGVydHkgdW5kZXIgdGhlIGdpdmVuIGtleSBhcyBhIGRvdWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSByZW1vdmVEb3VibGVQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyB2YWwgPSByZW1vdmVQcm9wZXJ0eShrZXkpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IDBEIDogRG91YmxlLnBhcnNlRG91YmxlKHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGEgZG91YmxlLCBvciByZXR1cm4gdGhlCisgICAgICogZ2l2ZW4gZGVmYXVsdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSByZW1vdmVEb3VibGVQcm9wZXJ0eShTdHJpbmcga2V5LCBkb3VibGUgZGVmKSB7CisgICAgICAgIGlmICghY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgICAgIHJldHVybiByZW1vdmVEb3VibGVQcm9wZXJ0eShrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgcHJvcGVydHkgdW5kZXIgdGhlIGdpdmVuIGtleSBhcyBhIGZsb2F0LgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gb24gcGFyc2UgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgcmVtb3ZlRmxvYXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyB2YWwgPSByZW1vdmVQcm9wZXJ0eShrZXkpOworICAgICAgICByZXR1cm4gKHZhbCA9PSBudWxsKSA/IDBGIDogRmxvYXQucGFyc2VGbG9hdCh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgcHJvcGVydHkgdW5kZXIgdGhlIGdpdmVuIGtleSBhcyBhIGZsb2F0LCBvciByZXR1cm4gdGhlCisgICAgICogZ2l2ZW4gZGVmYXVsdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGZsb2F0IHJlbW92ZUZsb2F0UHJvcGVydHkoU3RyaW5nIGtleSwgZmxvYXQgZGVmKSB7CisgICAgICAgIGlmICghY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgICAgIHJldHVybiByZW1vdmVGbG9hdFByb3BlcnR5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGEgaW50LgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gb24gcGFyc2UgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlbW92ZUludFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IHJlbW92ZVByb3BlcnR5KGtleSk7CisgICAgICAgIHJldHVybiAodmFsID09IG51bGwpID8gMCA6IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHByb3BlcnR5IHVuZGVyIHRoZSBnaXZlbiBrZXkgYXMgYSBpbnQsIG9yIHJldHVybiB0aGUKKyAgICAgKiBnaXZlbiBkZWZhdWx0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gb24gcGFyc2UgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlbW92ZUludFByb3BlcnR5KFN0cmluZyBrZXksIGludCBkZWYpIHsKKyAgICAgICAgaWYgKCFjb250YWluc0tleShrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUludFByb3BlcnR5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSB1bmRlciB0aGUgZ2l2ZW4ga2V5IGFzIGEgbG9uZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIHBhcnNlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGxvbmcgcmVtb3ZlTG9uZ1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IHJlbW92ZVByb3BlcnR5KGtleSk7CisgICAgICAgIHJldHVybiAodmFsID09IG51bGwpID8gMEwgOiBMb25nLnBhcnNlTG9uZyh2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgcHJvcGVydHkgdW5kZXIgdGhlIGdpdmVuIGtleSBhcyBhIGxvbmcsIG9yIHJldHVybiB0aGUKKyAgICAgKiBnaXZlbiBkZWZhdWx0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gb24gcGFyc2UgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyByZW1vdmVMb25nUHJvcGVydHkoU3RyaW5nIGtleSwgbG9uZyBkZWYpIHsKKyAgICAgICAgaWYgKCFjb250YWluc0tleShrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUxvbmdQcm9wZXJ0eShrZXkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9VVUlER2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjNmE0MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmV4Y2VwdGlvbi5OZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb247CisKKy8qKgorICogVVVJRCB2YWx1ZSBnZW5lcmF0b3IuICBCYXNlZCBvbiB0aGUgdGltZS1iYXNlZCBnZW5lcmF0b3IgaW4gdGhlIEFwYWNoZQorICogQ29tbW9ucyBJZCBwcm9qZWN0OiAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL3NhbmRib3gvaWQvdXVpZC5odG1sCisgKgorICogVGhlIGNvZGUgaGFzIGJlZW4gdmFzdGx5IHNpbXBsaWZpZWQgYW5kIG1vZGlmaWVkIHRvIHJlcGxhY2UgdGhlIGV0aGVybmV0CisgKiBhZGRyZXNzIG9mIHRoZSBob3N0IG1hY2hpbmUgd2l0aCB0aGUgSVAsIHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIHJlcXVpcmUKKyAqIG5hdGl2ZSBsaWJzIGFuZCBKYXZhIGNhbm5vdCBhY2Nlc3MgdGhlIE1BQyBhZGRyZXNzIGRpcmVjdGx5LgorICoKKyAqIEluIHNwaXJpdCwgaW1wbGVtZW50cyB0aGUgSUVURiBVVUlEIGRyYWZ0IHNwZWNpZmljYXRpb24sIGZvdW5kIGhlcmU6PGJyIC8+CisgKiBodHRwOi8vd3d3MS5pY3MudWNpLmVkdS9+ZWp3L2F1dGhvcmluZy91dWlkLWd1aWQvZHJhZnQtbGVhY2gtdXVpZHMtZ3VpZHMtMDEKKyAqIC50eHQKKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZSwgS2V2aW4gU3V0dGVyCisgKiBAbm9qYXZhZG9jCisgKiBAc2luY2UgMC4zLjMKKyAqLworcHVibGljIGNsYXNzIFVVSURHZW5lcmF0b3IgeworCisgICAgLy8gaW5kZXhlcyB3aXRoaW4gdGhlIHV1aWQgYXJyYXkgZm9yIGNlcnRhaW4gYm91bmRhcmllcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSURYX1RJTUVfSEkgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSURYX1RZUEUgPSA2OyAvLyBtdWx0aXBsZXhlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSURYX1RJTUVfTUlEID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIElEWF9USU1FX0xPID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIElEWF9USU1FX1NFUSA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBJRFhfVkFSSUFUSU9OID0gODsgLy8gbXVsdGlwbGV4ZWQKKworICAgIC8vIGluZGV4ZXMgYW5kIGxlbmd0aHMgd2l0aGluIHRoZSB0aW1lc3RhbXAgZm9yIGNlcnRhaW4gYm91bmRhcmllcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFNfVElNRV9MT19JRFggPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFNfVElNRV9MT19MRU4gPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVFNfVElNRV9NSURfSURYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRTX1RJTUVfTUlEX0xFTiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUU19USU1FX0hJX0lEWCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUU19USU1FX0hJX0xFTiA9IDI7CisKKyAgICAvLyBvZmZzZXQgdG8gbW92ZSBmcm9tIDEvMS8xOTcwLCB3aGljaCBpcyAwLXRpbWUgZm9yIEphdmEsIHRvIGdyZWdvcmlhbgorICAgIC8vIDAtdGltZSAxMC8xNS8xNTgyLCBhbmQgbXVsdGlwbGllciB0byBnbyBmcm9tIDEwMG5zZWMgdG8gbXNlYyB1bml0cworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR1JFR19PRkZTRVQgPSAweDAxYjIxZGQyMTM4MTQwMDBMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElfTVVMVCA9IDEwMDAwTDsKKworICAgIC8vIHR5cGUgb2YgVVVJRCAtLSB0aW1lIGJhc2VkCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBUWVBFX1RJTUVfQkFTRUQgPSAweDEwOworCisgICAgLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCB0byByZWR1Y2UgY29uZmxpY3RzIHdpdGggb3RoZXIgSlZNcywgYW5kCisgICAgLy8gaGFzaGVyIGZvciBzdHJpbmdzLiAgbm90ZSB0aGF0IHNlY3VyZSByYW5kb20gaXMgdmVyeSBzbG93IHRoZSBmaXJzdCB0aW1lCisgICAgLy8gaXQgaXMgdXNlZDsgY29uc2lkZXIgc3dpdGNoaW5nIHRvIGEgc3RhbmRhcmQgcmFuZG9tCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTSA9IG5ldyBTZWN1cmVSYW5kb20oKTsKKworICAgIC8vIDQtYnl0ZSBJUCBhZGRyZXNzICsgMiByYW5kb20gYnl0ZXMgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGZhY3QgdGhhdAorICAgIC8vIHRoZSBNQUMgYWRkcmVzcyBpcyB1c3VhbGx5IDYgYnl0ZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gSVA7CisKKyAgICAvLyBjb3VudGVyIGlzIGluaXRpYWxpemVkIHRvIDAgYW5kIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHV1aWQgcmVxdWVzdAorICAgIC8vIHdpdGhpbiB0aGUgc2FtZSB0aW1lc3RhbXAgd2luZG93LgorICAgIHByaXZhdGUgc3RhdGljIGludCBfY291bnRlcjsKKworICAgIC8vIGN1cnJlbnQgdGltZXN0YW1wICh1c2VkIHRvIGRldGVjdCBtdWx0aXBsZSB1dWlkIHJlcXVlc3RzIHdpdGhpbiBzYW1lCisgICAgLy8gdGltZXN0YW1wKQorICAgIHByaXZhdGUgc3RhdGljIGxvbmcgX2N1cnJlbnRNaWxsaXM7CisKKyAgICAvLyBsYXN0IHVzZWQgbWlsbGlzIHRpbWUsIGFuZCBhIHNlbWktcmFuZG9tIHNlcXVlbmNlIHRoYXQgZ2V0cyByZXNldAorICAgIC8vIHdoZW4gaXQgb3ZlcmZsb3dzCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBfbGFzdE1pbGxpcyA9IDBMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfMTRCSVQgPSAweDNGRkY7CisgICAgcHJpdmF0ZSBzdGF0aWMgc2hvcnQgX3NlcSA9IChzaG9ydClSQU5ET00ubmV4dEludChNQVhfMTRCSVQpOworCisgICAgLyoKKyAgICAgKiBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gZ2V0IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IG1hY2hpbmUuCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgYnl0ZVtdIGlwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlwID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0QWRkcmVzcygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorCisgICAgICAgIElQID0gbmV3IGJ5dGVbNl07CisgICAgICAgIFJBTkRPTS5uZXh0Qnl0ZXMoSVApOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGlwLCAwLCBJUCwgMiwgaXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB1bmlxdWUgVVVJRCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBuZXh0KCkgeworICAgICAgICAvLyBzZXQgaXAgYWRkcgorICAgICAgICBieXRlW10gdXVpZCA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShJUCwgMCwgdXVpZCwgMTAsIElQLmxlbmd0aCk7CisKKyAgICAgICAgLy8gU2V0IHRpbWUgaW5mby4gIEhhdmUgdG8gZG8gdGhpcyBwcm9jZXNzaW5nIHdpdGhpbiBhIHN5bmNocm9uaXplZAorICAgICAgICAvLyBibG9jayBiZWNhdXNlIG9mIHRoZSBzdGF0aWNzLi4uCisgICAgICAgIGxvbmcgbm93ID0gMDsKKyAgICAgICAgc3luY2hyb25pemVkIChVVUlER2VuZXJhdG9yLmNsYXNzKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIHRpbWUgdG8gdXNlIGZvciB0aGlzIHV1aWQuICBUaGlzIG1ldGhvZCBoYXMgdGhlIHNpZGUKKyAgICAgICAgICAgIC8vIGVmZmVjdCBvZiBtb2RpZnlpbmcgdGhlIGNsb2NrIHNlcXVlbmNlLCBhcyB3ZWxsLgorICAgICAgICAgICAgbm93ID0gZ2V0VGltZSgpOworCisgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHJlc3VsdGluZyBjbG9jayBzZXF1ZW5jZSBpbnRvIHRoZSB1dWlkCisgICAgICAgICAgICB1dWlkW0lEWF9USU1FX1NFUV0gPSAoYnl0ZSkgKChfc2VxICYgMHgzRjAwKSA+Pj4gOCk7CisgICAgICAgICAgICB1dWlkW0lEWF9WQVJJQVRJT05dIHw9IDB4ODA7CisgICAgICAgICAgICB1dWlkW0lEWF9USU1FX1NFUSsxXSA9IChieXRlKSAoX3NlcSAmIDB4RkYpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBoYXZlIHRvIGJyZWFrIHVwIHRpbWUgYmVjYXVzZSBieXRlcyBhcmUgc3ByZWFkIHRocm91Z2ggdXVpZAorICAgICAgICBieXRlW10gdGltZUJ5dGVzID0gQnl0ZXMudG9CeXRlcyhub3cpOworCisgICAgICAgIC8vIENvcHkgdGltZSBsb3cKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aW1lQnl0ZXMsIFRTX1RJTUVfTE9fSURYLCB1dWlkLCBJRFhfVElNRV9MTywKKyAgICAgICAgICAgICAgICBUU19USU1FX0xPX0xFTik7CisgICAgICAgIC8vIENvcHkgdGltZSBtaWQKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aW1lQnl0ZXMsIFRTX1RJTUVfTUlEX0lEWCwgdXVpZCwgSURYX1RJTUVfTUlELAorICAgICAgICAgICAgICAgIFRTX1RJTUVfTUlEX0xFTik7CisgICAgICAgIC8vIENvcHkgdGltZSBoaQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRpbWVCeXRlcywgVFNfVElNRV9ISV9JRFgsIHV1aWQsIElEWF9USU1FX0hJLAorICAgICAgICAgICAgICAgIFRTX1RJTUVfSElfTEVOKTsKKyAgICAgICAgLy9TZXQgdmVyc2lvbiAodGltZS1iYXNlZCkKKyAgICAgICAgdXVpZFtJRFhfVFlQRV0gfD0gVFlQRV9USU1FX0JBU0VEOyAvLyAwMDAxIDAwMDAKKworICAgICAgICByZXR1cm4gdXVpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5leHQgdW5pcXVlIHV1aWQgdmFsdWUgYXMgYSAxNi1jaGFyYWN0ZXIgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTdHJpbmcoKSB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5leHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCAiSVNPLTg4NTktMSIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuZXh0IHVuaXF1ZSB1dWlkIHZhbHVlIGFzIGEgMzItY2hhcmFjdGVyIGhleCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmV4dEhleCgpIHsKKyAgICAgICAgcmV0dXJuIEJhc2UxNkVuY29kZXIuZW5jb2RlKG5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0aW1lc3RhbXAgdG8gYmUgdXNlZCBmb3IgdGhpcyB1dWlkLiAgTXVzdCBiZSBjYWxsZWQgZnJvbQorICAgICAqIGEgc3luY2hyb25pemVkIGJsb2NrLgorICAgICAqCisgICAgICogQHJldHVybiBsb25nIHRpbWVzdGFtcAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0VGltZSgpIHsKKyAgICAgICAgbG9uZyBuZXdUaW1lID0gZ2V0VVVJRFRpbWUoKTsKKyAgICAgICAgaWYgKG5ld1RpbWUgPD0gX2xhc3RNaWxsaXMpIHsKKyAgICAgICAgICAgIGluY3JlbWVudFNlcXVlbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgX2xhc3RNaWxsaXMgPSBuZXdUaW1lOworICAgICAgICByZXR1cm4gbmV3VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZWx5IG1vZGlmaWVkIHRpbWVzdGFtZXAgZm9yIHRoZSBVVUlELiAgTXVzdCBiZSBjYWxsZWQKKyAgICAgKiBmcm9tIGEgc3luY2hyb25pemVkIGJsb2NrLgorICAgICAqCisgICAgICogQHJldHVybiBsb25nIHRpbWVzdGFtcCBpbiAxMDBucyBpbnRlcnZhbHMgc2luY2UgdGhlIEdyZWdvcmlhbiBjaGFuZ2UKKyAgICAgKiBvZmZzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFVVSURUaW1lKCkgeworICAgICAgICBpZiAoX2N1cnJlbnRNaWxsaXMgIT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKKyAgICAgICAgICAgIF9jdXJyZW50TWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBfY291bnRlciA9IDA7ICAvLyByZXNldCBjb3VudGVyCisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBjcmVhdGVkIHRvbyBtYW55IHV1aWQncyBmb3IgdGhpcyB0aW1lc3RhbXAKKyAgICAgICAgaWYgKF9jb3VudGVyICsgMSA+PSBNSUxMSV9NVUxUKSB7CisgICAgICAgICAgICAvLyBPcmlnaW5hbCBhbGdvcml0aG0gdGhyZXcgZXhjZXB0aW9uLiAgU2VlbWVkIGxpa2Ugb3ZlcmtpbGwuCisgICAgICAgICAgICAvLyBMZXQncyBqdXN0IGluY3JlbWVudCB0aGUgdGltZXN0YW1wIGluc3RlYWQgYW5kIHN0YXJ0IG92ZXIuLi4KKyAgICAgICAgICAgIF9jdXJyZW50TWlsbGlzKys7CisgICAgICAgICAgICBfY291bnRlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBjYWxjdWxhdGUgdGltZSBhcyBjdXJyZW50IG1pbGxpcyBwbHVzIG9mZnNldCB0aW1lcyAxMDAgbnMgdGlja3MKKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IChfY3VycmVudE1pbGxpcyArIEdSRUdfT0ZGU0VUKSAqIE1JTExJX01VTFQ7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSB1dWlkIHRpbWUgcGx1cyB0aGUgYXJ0aWZpY2lhbCB0aWNrIGNvdW50ZXIgaW5jcmVtZW50ZWQKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgX2NvdW50ZXIrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnRzIHRoZSBjbG9jayBzZXF1ZW5jZSBmb3IgdGhpcyB1dWlkLiAgTXVzdCBiZSBjYWxsZWQgZnJvbSBhCisgICAgICogc3luY2hyb25pemVkIGJsb2NrLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5jcmVtZW50U2VxdWVuY2UoKSB7CisgICAgICAgIC8vIGluY3JlbWVudCwgYnV0IGlmIGl0J3MgZ3JlYXRlciB0aGFuIGl0cyAxNC1iaXRzLCByZXNldCBpdAorICAgICAgICBpZiAoKytfc2VxID4gTUFYXzE0QklUKSB7CisgICAgICAgICAgICBfc2VxID0gKHNob3J0KVJBTkRPTS5uZXh0SW50KE1BWF8xNEJJVCk7ICAvLyBzZW1pLXJhbmRvbQorICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvWmlwUmVzb3VyY2VCdW5kbGVQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9aaXBSZXNvdXJjZUJ1bmRsZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMmU2MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvWmlwUmVzb3VyY2VCdW5kbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKKworLyoqCisgKiB7QGxpbmsgUmVzb3VyY2VCdW5kbGVQcm92aWRlcn0gdGhhdCBleHBlY3RzIHRoZQorICoge0BsaW5rIENsYXNzTG9hZGVyI2dldFJlc291cmNlQXNTdHJlYW19IG1ldGhvZCB0byByZXR1cm4gYSB6aXBwZWQgaW5wdXQKKyAqIHN0cmVhbS4gQ3JlYXRlZCBmb3IgdXNlIHVuZGVyIFdlYmxvZ2ljIFJBUnMuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqLworY2xhc3MgWmlwUmVzb3VyY2VCdW5kbGVQcm92aWRlciBpbXBsZW1lbnRzIFJlc291cmNlQnVuZGxlUHJvdmlkZXIgeworCisgICAgcHVibGljIFJlc291cmNlQnVuZGxlIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSwgTG9jYWxlIGxvY2FsZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFN0cmluZyByc3JjID0gbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIucHJvcGVydGllcyI7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyc3JjKTsKKyAgICAgICAgaWYgKGluID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXAgPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlwRW50cnkgemU7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHplID0gemlwLmdldE5leHRFbnRyeSgpOworICAgICAgICAgICAgICAgIGlmICh6ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChyc3JjLmVxdWFscyh6ZS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoemlwKTsKKworICAgICAgICAgICAgICAgIHppcC5jbG9zZUVudHJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHppcC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0Q29sbGVjdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0Q29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmY4NjcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQWJzdHJhY3RDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgRGF3aWQgS3VyenluaWVjLCBiYXNlZCBvbiBwdWJsaWMgZG9tYWluIGNvZGUgd3JpdHRlbiBieSBEb3VnIExlYQorICogYW5kIHB1YmxpY3RseSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcworICogZXhwbGFpbmVkIGF0IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCisvKioKKyAqIE92ZXJyaWRlcyB0b0FycmF5KCkgYW5kIHRvQXJyYXkoT2JqZWN0W10pIGluIEFic3RyYWN0Q29sbGVjdGlvbiB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgdmFsaWQgZm9yIGNvbmN1cnJlbnQgY29sbGVjdGlvbnMuCisgKgorICogQGF1dGhvciBEb3VnIExlYQorICogQGF1dGhvciBEYXdpZCBLdXJ6eW5pZWMKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLiAoRm9yIGludm9jYXRpb24gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLCB0eXBpY2FsbHkKKyAgICAgKiBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0Q29sbGVjdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIFV0aWxzLmNvbGxlY3Rpb25Ub0FycmF5KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHsKKyAgICAgICAgcmV0dXJuIFV0aWxzLmNvbGxlY3Rpb25Ub0FycmF5KHRoaXMsIGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdENvbmN1cnJlbnRFdmVudE1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdENvbmN1cnJlbnRFdmVudE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDBiMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5FdmVudE1hbmFnZXI7CisKKy8qKgorICogQmFzZSBldmVudCBtYW5hZ2VyIHRoYXQgaGFuZGxlcyBhZGRpbmcvcmVtb3ZpbmcgbGlzdGVuZXJzCisgKiBhbmQgZmlyaW5nIGV2ZW50cy4gTWVhbnQgZm9yIGhpZ2ggY29uY3VycmVuY3kuIFRoaXMgY2xhc3MgaXMKKyAqIHJlZW50cmFudC1zYWZlOyBsaXN0ZW5lcnMgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGJ5IG90aGVyIGxpc3RlbmVycyB3aGVuIAorICogdGhleSByZWNlaXZlIGV2ZW50cy4gVGhlIGNoYW5nZXMgd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZXZlbnQgZmlyZQorICogdGhhdCBpbml0aWF0ZWQgdGhlIHJlY3Vyc2l2ZSBzZXF1ZW5jZSBvZiBjYWxscyBjb21wbGV0ZXMsIGhvd2V2ZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzIEV2ZW50TWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBFeGNlcHRpb25bXSBFTVBUWV9FWENFUFRJT05TID0gbmV3IEV4Y2VwdGlvblswXTsKKworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBfbGlzdGVuZXJzOworICAgIHByaXZhdGUgYm9vbGVhbiBfZmFpbEZhc3QgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0Q29uY3VycmVudEV2ZW50TWFuYWdlcigpIHsKKyAgICAgICAgX2xpc3RlbmVycyA9IG5ld0xpc3RlbmVyQ29sbGVjdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZmFpbCBhZnRlciB0aGUgZmlyc3QgZXhjZXB0aW9uIHRocm93biBieSBhbnkgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsRmFzdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsRmFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZhaWwgYWZ0ZXIgdGhlIGZpcnN0IGV4Y2VwdGlvbiB0aHJvd24gYnkgYW55IGxpc3RlbmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxGYXN0KGJvb2xlYW4gZmFpbEZhc3QpIHsKKyAgICAgICAgX2ZhaWxGYXN0ID0gZmFpbEZhc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gZXZlbnQgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgcmV0dXJuIF9saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gaW5zdGFuY2UgaXMgaW4gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0xpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICByZXR1cm4gX2xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiAhX2xpc3RlbmVycy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldExpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oX2xpc3RlbmVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZSB0aGUgZ2l2ZW4gZXZlbnQgdG8gYWxsIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uW10gZmlyZUV2ZW50KE9iamVjdCBldmVudCkgeworICAgICAgICBpZiAoX2xpc3RlbmVycy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfRVhDRVBUSU9OUzsKKworICAgICAgICBMaXN0IGV4Y2VwdGlvbnMgPSBudWxsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9saXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlyZUV2ZW50KGV2ZW50LCBpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKF9mYWlsRmFzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb25bXSB7IGUgfTsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zLmFkZChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlcHRpb25zID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfRVhDRVBUSU9OUzsKKyAgICAgICAgcmV0dXJuIChFeGNlcHRpb25bXSkgZXhjZXB0aW9ucy50b0FycmF5CisgICAgICAgICAgICAobmV3IEV4Y2VwdGlvbltleGNlcHRpb25zLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBmaXJlIHRoZSBnaXZlbiBldmVudCB0byB0aGUgZ2l2ZW4gbGlzdGVuZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZmlyZUV2ZW50KE9iamVjdCBldmVudCwgT2JqZWN0IGxpc3RlbmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGNvbmN1cnJlbnQgY29udGFpbmVyIGZvciBsaXN0ZW5lcnMuIFVzZXMgYSAKKyAgICAgKiB7QGxpbmsgQ29weU9uV3JpdGVBcnJheUxpc3R9IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gbmV3TGlzdGVuZXJDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0Fic3RyYWN0UXVldWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdFF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhYTc3OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdFF1ZXVlLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBza2VsZXRhbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc29tZSB7QGxpbmsgUXVldWV9CisgKiBvcGVyYXRpb25zLiBUaGUgaW1wbGVtZW50YXRpb25zIGluIHRoaXMgY2xhc3MgYXJlIGFwcHJvcHJpYXRlIHdoZW4KKyAqIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGRvZXMgPGVtPm5vdDwvZW0+IGFsbG93IDx0dD5udWxsPC90dD4KKyAqIGVsZW1lbnRzLiBNZXRob2RzIHtAbGluayAjYWRkIGFkZH0sIHtAbGluayAjcmVtb3ZlIHJlbW92ZX0sIGFuZAorICoge0BsaW5rICNlbGVtZW50IGVsZW1lbnR9IGFyZSBiYXNlZCBvbiB7QGxpbmsgI29mZmVyIG9mZmVyfSwge0BsaW5rCisgKiAjcG9sbCBwb2xsfSwgYW5kIHtAbGluayAjcGVlayBwZWVrfSwgcmVzcGVjdGl2ZWx5IGJ1dCB0aHJvdworICogZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIGluZGljYXRpbmcgZmFpbHVyZSB2aWEgPHR0PmZhbHNlPC90dD4gb3IKKyAqIDx0dD5udWxsPC90dD4gcmV0dXJucy4KKyAqIEEgPHR0PlF1ZXVlPC90dD4gaW1wbGVtZW50YXRpb24gdGhhdCBleHRlbmRzIHRoaXMgY2xhc3MgbXVzdAorICogbWluaW1hbGx5IGRlZmluZSBhIG1ldGhvZCB7QGxpbmsgUXVldWUjb2ZmZXJ9IHdoaWNoIGRvZXMgbm90IHBlcm1pdAorICogaW5zZXJ0aW9uIG9mIDx0dD5udWxsPC90dD4gZWxlbWVudHMsIGFsb25nIHdpdGggbWV0aG9kcyB7QGxpbmsKKyAqIFF1ZXVlI3BlZWt9LCB7QGxpbmsgUXVldWUjcG9sbH0sIHtAbGluayBDb2xsZWN0aW9uI3NpemV9LCBhbmQgYQorICoge0BsaW5rIENvbGxlY3Rpb24jaXRlcmF0b3J9IHN1cHBvcnRpbmcge0BsaW5rCisgKiBJdGVyYXRvciNyZW1vdmV9LiBUeXBpY2FsbHksIGFkZGl0aW9uYWwgbWV0aG9kcyB3aWxsIGJlIG92ZXJyaWRkZW4KKyAqIGFzIHdlbGwuIElmIHRoZXNlIHJlcXVpcmVtZW50cyBjYW5ub3QgYmUgbWV0LCBjb25zaWRlciBpbnN0ZWFkCisgKiBzdWJjbGFzc2luZyB7QGxpbmsgQWJzdHJhY3RDb2xsZWN0aW9ufS4gVGhpcyBjbGFzcyBpcyBhIG1lbWJlciBvZiB0aGUKKyAqIDxhIGhyZWY9IntAZG9jUm9vdH0vLi4vZ3VpZGUvY29sbGVjdGlvbnMvaW5kZXguaHRtbCI+CisgKiBKYXZhIENvbGxlY3Rpb25zIEZyYW1ld29yazwvYT4uCisgKgorICogQGF1dGhvciBEb3VnIExlYQorICogQHNpbmNlIDEuNQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFF1ZXVlIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uIGltcGxlbWVudHMgUXVldWUgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHVzZSBieSBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdFF1ZXVlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhpcyBxdWV1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBkbyBzbworICAgICAqIGltbWVkaWF0ZWx5IHdpdGhvdXQgdmlvbGF0aW5nIGNhcGFjaXR5IHJlc3RyaWN0aW9ucywgcmV0dXJuaW5nCisgICAgICogPHR0PnRydWU8L3R0PiB1cG9uIHN1Y2Nlc3MgYW5kIHRocm93aW5nIGFuIDx0dD5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L3R0PgorICAgICAqIGlmIG5vIHNwYWNlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgPHR0Pm9mZmVyPC90dD4gc3VjY2VlZHMsCisgICAgICogZWxzZSB0aHJvd3MgYW4gPHR0PklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGVsZW1lbnQgdG8gYWRkCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IChhcyBzcGVjaWZpZWQgYnkge0BsaW5rIENvbGxlY3Rpb24jYWRkfSkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgYWRkZWQgYXQgdGhpcworICAgICAqIHRpbWUgZHVlIHRvIGNhcGFjaXR5IHJlc3RyaWN0aW9ucworICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsIGFuZAorICAgICAqIHRoaXMgcXVldWUgbm90IHBlcm1pdCBudWxsIGVsZW1lbnRzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IGUpIHsKKyAgICAgICAgaWYgKG9mZmVyKGUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlF1ZXVlIGZ1bGwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZS4gVGhpcyBtZXRob2QgZGlmZmVycworICAgICAqIGZyb20ge0BsaW5rICNwb2xsIHBvbGx9IG9ubHkgaW4gdGhhdCBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoaXMKKyAgICAgKiBxdWV1ZSBpcyBlbXB0eS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgPHR0PnBvbGw8L3R0PgorICAgICAqIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgeworICAgICAgICBPYmplY3QgeCA9IHBvbGwoKTsKKyAgICAgICAgaWYgKHggIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZS4gVGhpcyBtZXRob2QKKyAgICAgKiBkaWZmZXJzIGZyb20ge0BsaW5rICNwZWVrIHBlZWt9IG9ubHkgaW4gdGhhdCBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmCisgICAgICogdGhpcyBxdWV1ZSBpcyBlbXB0eS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiA8dHQ+cGVlazwvdHQ+CisgICAgICogdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZQorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGlzIHF1ZXVlIGlzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBlbGVtZW50KCkgeworICAgICAgICBPYmplY3QgeCA9IHBlZWsoKTsKKyAgICAgICAgaWYgKHggIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUuCisgICAgICogVGhlIHF1ZXVlIHdpbGwgYmUgZW1wdHkgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMuCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXBlYXRlZGx5IGludm9rZXMge0BsaW5rICNwb2xsIHBvbGx9IHVudGlsIGl0CisgICAgICogcmV0dXJucyA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICB3aGlsZSAocG9sbCgpICE9IG51bGwpCisgICAgICAgICAgICA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0byB0aGlzCisgICAgICogcXVldWUuIEF0dGVtcHRzIHRvIGFkZEFsbCBvZiBhIHF1ZXVlIHRvIGl0c2VsZiByZXN1bHQgaW4KKyAgICAgKiA8dHQ+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC90dD4uIEZ1cnRoZXIsIHRoZSBiZWhhdmlvciBvZgorICAgICAqIHRoaXMgb3BlcmF0aW9uIGlzIHVuZGVmaW5lZCBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMKKyAgICAgKiBtb2RpZmllZCB3aGlsZSB0aGUgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24sCisgICAgICogYW5kIGFkZHMgZWFjaCBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciB0byB0aGlzCisgICAgICogcXVldWUsIGluIHR1cm4uIEEgcnVudGltZSBleGNlcHRpb24gZW5jb3VudGVyZWQgd2hpbGUKKyAgICAgKiB0cnlpbmcgdG8gYWRkIGFuIGVsZW1lbnQoaW5jbHVkaW5nLCBpbiBwYXJ0aWN1bGFyLCBhCisgICAgICogPHR0Pm51bGw8L3R0PiBlbGVtZW50KSBtYXkgcmVzdWx0IGluIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMKKyAgICAgKiBoYXZpbmcgYmVlbiBzdWNjZXNzZnVsbHkgYWRkZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGMgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBxdWV1ZSBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIGFuIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbGxlY3Rpb24gcHJldmVudHMgaXQgZnJvbSBiZWluZyBhZGRlZCB0byB0aGlzIHF1ZXVlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYQorICAgICAqIG51bGwgZWxlbWVudCBhbmQgdGhpcyBxdWV1ZSBkb2VzIG5vdCBwZXJtaXQgbnVsbCBlbGVtZW50cywKKyAgICAgKiBvciBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNvbWUgcHJvcGVydHkgb2YgYW4gZWxlbWVudCBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMKKyAgICAgKiBxdWV1ZSwgb3IgaWYgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGlzIHRoaXMgcXVldWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBub3QgYWxsIHRoZSBlbGVtZW50cyBjYW4gYmUgYWRkZWQgYXQKKyAgICAgKiB0aGlzIHRpbWUgZHVlIHRvIGluc2VydGlvbiByZXN0cmljdGlvbnMKKyAgICAgKiBAc2VlICNhZGQoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBpZiAoYyA9PSB0aGlzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgIEl0ZXJhdG9yIGUgPSBjLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgeworICAgICAgICAgICAgaWYgKGFkZChlLm5leHQoKSkpCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2RpZmllZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQWJzdHJhY3RTZXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9BYnN0cmFjdFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2ZjNzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQWJzdHJhY3RTZXQuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogV3JpdHRlbiBieSBEYXdpZCBLdXJ6eW5pZWMsIGJhc2VkIG9uIHB1YmxpYyBkb21haW4gY29kZSB3cml0dGVuIGJ5IERvdWcgTGVhCisgKiBhbmQgcHVibGljdGx5IGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uLCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzCisgKiBleHBsYWluZWQgYXQgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKKy8qKgorICogT3ZlcnJpZGVzIHRvQXJyYXkoKSBhbmQgdG9BcnJheShPYmplY3RbXSkgaW4gQWJzdHJhY3RDb2xsZWN0aW9uIHRvIHByb3ZpZGUKKyAqIGltcGxlbWVudGF0aW9ucyB2YWxpZCBmb3IgY29uY3VycmVudCBzZXRzLgorICoKKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqIEBhdXRob3IgRGF3aWQgS3VyenluaWVjCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0U2V0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0IHsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIHR5cGljYWxseQorICAgICAqIGltcGxpY2l0LikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTZXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBVdGlscy5jb2xsZWN0aW9uVG9BcnJheSh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7CisgICAgICAgIHJldHVybiBVdGlscy5jb2xsZWN0aW9uVG9BcnJheSh0aGlzLCBhKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQXJyYXlzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQXJyYXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2ZTVhNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9BcnJheXMuamF2YQpAQCAtMCwwICsxLDg0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgRGF3aWQgS3VyenluaWVjLCBiYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlCisgKiBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYgRXhwZXJ0IEdyb3VwLiBSZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwKKyAqIGFzIGV4cGxhaW5lZCBhdCBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBBcnJheXMgeworCisgICAgcHJpdmF0ZSBBcnJheXMoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQobG9uZ1tdIGEpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGxvbmdbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSwgZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChpbnRbXSBhKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuc29ydChhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChpbnRbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSwgZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChzaG9ydFtdIGEpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KHNob3J0W10gYSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEsIGZyb21JbmRleCwgdG9JbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoY2hhcltdIGEpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGNoYXJbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSwgZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChieXRlW10gYSkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoYnl0ZVtdIGEsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuc29ydChhLCBmcm9tSW5kZXgsIHRvSW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGRvdWJsZVtdIGEpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGRvdWJsZVtdIGEsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuc29ydChhLCBmcm9tSW5kZXgsIHRvSW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGZsb2F0W10gYSkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoZmxvYXRbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSwgZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChPYmplY3RbXSBhKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuc29ydChhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChPYmplY3RbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQoYSwgZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29ydChPYmplY3RbXSBhLCBDb21wYXJhdG9yIGMpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEsIGMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KE9iamVjdFtdIGEsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LAorICAgICAgICBDb21wYXJhdG9yIGMpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5zb3J0KGEsIGZyb21JbmRleCwgdG9JbmRleCwgYyk7CisgICAgfQorCisgICAgLy8gU2VhcmNoaW5nCisKKyAgICBwdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2gobG9uZ1tdIGEsIGxvbmcga2V5KSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmJpbmFyeVNlYXJjaChhLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChpbnRbXSBhLCBpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmJpbmFyeVNlYXJjaChhLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChzaG9ydFtdIGEsIHNob3J0IGtleSkgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5iaW5hcnlTZWFyY2goYSwga2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2goY2hhcltdIGEsIGNoYXIga2V5KSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmJpbmFyeVNlYXJjaChhLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChieXRlW10gYSwgYnl0ZSBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGEsIGtleSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKGRvdWJsZVtdIGEsIGRvdWJsZSBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGEsIGtleSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKGZsb2F0W10gYSwgZmxvYXQga2V5KSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmJpbmFyeVNlYXJjaChhLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChPYmplY3RbXSBhLCBPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmJpbmFyeVNlYXJjaChhLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChPYmplY3RbXSBhLCBPYmplY3Qga2V5LCBDb21wYXJhdG9yIGMpIHsKKyAgICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuYmluYXJ5U2VhcmNoKGEsIGtleSwgYyk7CisgICAgfQorCisgICAgLy8gRXF1YWxpdHkgVGVzdGluZworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhsb25nW10gYSwgbG9uZ1tdIGEyKSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhhLCBhMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhpbnRbXSBhLCBpbnRbXSBhMikgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYSwgYTIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoc2hvcnRbXSBhLCBzaG9ydCBhMltdKSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhhLCBhMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhjaGFyW10gYSwgY2hhcltdIGEyKSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhhLCBhMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhieXRlW10gYSwgYnl0ZVtdIGEyKSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhhLCBhMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhib29sZWFuW10gYSwgYm9vbGVhbltdIGEyKSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhhLCBhMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhkb3VibGVbXSBhLCBkb3VibGVbXSBhMikgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYSwgYTIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZmxvYXRbXSBhLCBmbG9hdFtdIGEyKSB7CisgICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhhLCBhMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3RbXSBhLCBPYmplY3RbXSBhMikgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYSwgYTIpOworICAgIH0KKworICAgIC8vIEZpbGxpbmcKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGxvbmdbXSBhLCBsb25nIHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChsb25nW10gYSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGxvbmcgdmFsKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChhLCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoaW50W10gYSwgaW50IHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChpbnRbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgaW50IHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKHNob3J0W10gYSwgc2hvcnQgdmFsKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChhLCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKHNob3J0W10gYSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIHNob3J0IHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGNoYXJbXSBhLCBjaGFyIHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChjaGFyW10gYSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGNoYXIgdmFsKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChhLCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoYnl0ZVtdIGEsIGJ5dGUgdmFsKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChhLCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGJ5dGVbXSBhLCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYnl0ZSB2YWwpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKGEsIGZyb21JbmRleCwgdG9JbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChib29sZWFuW10gYSwgYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKGEsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoYm9vbGVhbltdIGEsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LAorICAgICAgICBib29sZWFuIHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKGRvdWJsZVtdIGEsIGRvdWJsZSB2YWwpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKGEsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoZG91YmxlW10gYSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsCisgICAgICAgIGRvdWJsZSB2YWwpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKGEsIGZyb21JbmRleCwgdG9JbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChmbG9hdFtdIGEsIGZsb2F0IHZhbCkgeworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoYSwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChmbG9hdFtdIGEsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBmbG9hdCB2YWwpIHsKKyAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKGEsIGZyb21JbmRleCwgdG9JbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbChPYmplY3RbXSBhLCBPYmplY3QgdmFsKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChhLCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKE9iamVjdFtdIGEsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LAorICAgICAgICBPYmplY3QgdmFsKSB7CisgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChhLCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbCk7CisgICAgfQorCisgICAgLy8gQ2xvbmluZworCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29weU9mKE9iamVjdFtdIG9yaWdpbmFsLCBpbnQgbmV3TGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBjb3B5T2Yob3JpZ2luYWwsIG5ld0xlbmd0aCwgb3JpZ2luYWwuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29weU9mKE9iamVjdFtdIG9yaWdpbmFsLCBpbnQgbmV3TGVuZ3RoLAorICAgICAgICBDbGFzcyBuZXdUeXBlKSB7CisgICAgICAgIE9iamVjdFtdIGFyciA9IChuZXdUeXBlID09IE9iamVjdFtdLmNsYXNzKSA/IG5ldyBPYmplY3RbbmV3TGVuZ3RoXSA6CisgICAgICAgICAgICAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKG5ld1R5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCBuZXdMZW5ndGgpOworICAgICAgICBpbnQgbGVuID0gKG9yaWdpbmFsLmxlbmd0aCA8IG5ld0xlbmd0aCA/IG9yaWdpbmFsLmxlbmd0aCA6IG5ld0xlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWwsIDAsIGFyciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gY29weU9mKGJ5dGVbXSBvcmlnaW5hbCwgaW50IG5ld0xlbmd0aCkgeworICAgICAgICBieXRlW10gYXJyID0gbmV3IGJ5dGVbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGxlbiA9IChvcmlnaW5hbC5sZW5ndGggPCBuZXdMZW5ndGggPyBvcmlnaW5hbC5sZW5ndGggOiBuZXdMZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCAwLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgc2hvcnRbXSBjb3B5T2Yoc2hvcnRbXSBvcmlnaW5hbCwgaW50IG5ld0xlbmd0aCkgeworICAgICAgICBzaG9ydFtdIGFyciA9IG5ldyBzaG9ydFtuZXdMZW5ndGhdOworICAgICAgICBpbnQgbGVuID0gKG9yaWdpbmFsLmxlbmd0aCA8IG5ld0xlbmd0aCA/IG9yaWdpbmFsLmxlbmd0aCA6IG5ld0xlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWwsIDAsIGFyciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBjb3B5T2YoaW50W10gb3JpZ2luYWwsIGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgaW50W10gYXJyID0gbmV3IGludFtuZXdMZW5ndGhdOworICAgICAgICBpbnQgbGVuID0gKG9yaWdpbmFsLmxlbmd0aCA8IG5ld0xlbmd0aCA/IG9yaWdpbmFsLmxlbmd0aCA6IG5ld0xlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWwsIDAsIGFyciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nW10gY29weU9mKGxvbmdbXSBvcmlnaW5hbCwgaW50IG5ld0xlbmd0aCkgeworICAgICAgICBsb25nW10gYXJyID0gbmV3IGxvbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGxlbiA9IChvcmlnaW5hbC5sZW5ndGggPCBuZXdMZW5ndGggPyBvcmlnaW5hbC5sZW5ndGggOiBuZXdMZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCAwLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIGNvcHlPZihjaGFyW10gb3JpZ2luYWwsIGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgY2hhcltdIGFyciA9IG5ldyBjaGFyW25ld0xlbmd0aF07CisgICAgICAgIGludCBsZW4gPSAob3JpZ2luYWwubGVuZ3RoIDwgbmV3TGVuZ3RoID8gb3JpZ2luYWwubGVuZ3RoIDogbmV3TGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgMCwgYXJyLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZsb2F0W10gY29weU9mKGZsb2F0W10gb3JpZ2luYWwsIGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgZmxvYXRbXSBhcnIgPSBuZXcgZmxvYXRbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGxlbiA9IChvcmlnaW5hbC5sZW5ndGggPCBuZXdMZW5ndGggPyBvcmlnaW5hbC5sZW5ndGggOiBuZXdMZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCAwLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlW10gY29weU9mKGRvdWJsZVtdIG9yaWdpbmFsLCBpbnQgbmV3TGVuZ3RoKSB7CisgICAgICAgIGRvdWJsZVtdIGFyciA9IG5ldyBkb3VibGVbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGxlbiA9IChvcmlnaW5hbC5sZW5ndGggPCBuZXdMZW5ndGggPyBvcmlnaW5hbC5sZW5ndGggOiBuZXdMZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCAwLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGNvcHlPZihib29sZWFuW10gb3JpZ2luYWwsIGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgYm9vbGVhbltdIGFyciA9IG5ldyBib29sZWFuW25ld0xlbmd0aF07CisgICAgICAgIGludCBsZW4gPSAob3JpZ2luYWwubGVuZ3RoIDwgbmV3TGVuZ3RoID8gb3JpZ2luYWwubGVuZ3RoIDogbmV3TGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgMCwgYXJyLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvcHlPZlJhbmdlKE9iamVjdFtdIG9yaWdpbmFsLCBpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIHJldHVybiBjb3B5T2ZSYW5nZShvcmlnaW5hbCwgZnJvbSwgdG8sIG9yaWdpbmFsLmdldENsYXNzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvcHlPZlJhbmdlKE9iamVjdFtdIG9yaWdpbmFsLCBpbnQgZnJvbSwgaW50IHRvLAorICAgICAgICBDbGFzcyBuZXdUeXBlKSB7CisgICAgICAgIGludCBuZXdMZW5ndGggPSB0byAtIGZyb207CisgICAgICAgIGlmIChuZXdMZW5ndGggPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmcm9tICsgIiA+ICIgKyB0byk7CisgICAgICAgIE9iamVjdFtdIGFyciA9IChuZXdUeXBlID09IE9iamVjdFtdLmNsYXNzKSA/IG5ldyBPYmplY3RbbmV3TGVuZ3RoXSA6CisgICAgICAgICAgICAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKG5ld1R5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCBuZXdMZW5ndGgpOworICAgICAgICBpbnQgY2VpbCA9IG9yaWdpbmFsLmxlbmd0aCAtIGZyb207CisgICAgICAgIGludCBsZW4gPSAoY2VpbCA8IG5ld0xlbmd0aCkgPyBjZWlsIDogbmV3TGVuZ3RoOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCBmcm9tLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvcHlPZlJhbmdlKGJ5dGVbXSBvcmlnaW5hbCwgaW50IGZyb20sIGludCB0bykgeworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdG8gLSBmcm9tOworICAgICAgICBpZiAobmV3TGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZnJvbSArICIgPiAiICsgdG8pOworICAgICAgICBieXRlW10gYXJyID0gbmV3IGJ5dGVbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGNlaWwgPSBvcmlnaW5hbC5sZW5ndGggLSBmcm9tOworICAgICAgICBpbnQgbGVuID0gKGNlaWwgPCBuZXdMZW5ndGgpID8gY2VpbCA6IG5ld0xlbmd0aDsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgZnJvbSwgYXJyLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHNob3J0W10gY29weU9mUmFuZ2Uoc2hvcnRbXSBvcmlnaW5hbCwgaW50IGZyb20sIGludCB0bykgeworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdG8gLSBmcm9tOworICAgICAgICBpZiAobmV3TGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZnJvbSArICIgPiAiICsgdG8pOworICAgICAgICBzaG9ydFtdIGFyciA9IG5ldyBzaG9ydFtuZXdMZW5ndGhdOworICAgICAgICBpbnQgY2VpbCA9IG9yaWdpbmFsLmxlbmd0aCAtIGZyb207CisgICAgICAgIGludCBsZW4gPSAoY2VpbCA8IG5ld0xlbmd0aCkgPyBjZWlsIDogbmV3TGVuZ3RoOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCBmcm9tLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50W10gY29weU9mUmFuZ2UoaW50W10gb3JpZ2luYWwsIGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IHRvIC0gZnJvbTsKKyAgICAgICAgaWYgKG5ld0xlbmd0aCA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZyb20gKyAiID4gIiArIHRvKTsKKyAgICAgICAgaW50W10gYXJyID0gbmV3IGludFtuZXdMZW5ndGhdOworICAgICAgICBpbnQgY2VpbCA9IG9yaWdpbmFsLmxlbmd0aCAtIGZyb207CisgICAgICAgIGludCBsZW4gPSAoY2VpbCA8IG5ld0xlbmd0aCkgPyBjZWlsIDogbmV3TGVuZ3RoOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsLCBmcm9tLCBhcnIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZ1tdIGNvcHlPZlJhbmdlKGxvbmdbXSBvcmlnaW5hbCwgaW50IGZyb20sIGludCB0bykgeworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdG8gLSBmcm9tOworICAgICAgICBpZiAobmV3TGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZnJvbSArICIgPiAiICsgdG8pOworICAgICAgICBsb25nW10gYXJyID0gbmV3IGxvbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGNlaWwgPSBvcmlnaW5hbC5sZW5ndGggLSBmcm9tOworICAgICAgICBpbnQgbGVuID0gKGNlaWwgPCBuZXdMZW5ndGgpID8gY2VpbCA6IG5ld0xlbmd0aDsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgZnJvbSwgYXJyLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNoYXJbXSBjb3B5T2ZSYW5nZShjaGFyW10gb3JpZ2luYWwsIGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IHRvIC0gZnJvbTsKKyAgICAgICAgaWYgKG5ld0xlbmd0aCA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZyb20gKyAiID4gIiArIHRvKTsKKyAgICAgICAgY2hhcltdIGFyciA9IG5ldyBjaGFyW25ld0xlbmd0aF07CisgICAgICAgIGludCBjZWlsID0gb3JpZ2luYWwubGVuZ3RoIC0gZnJvbTsKKyAgICAgICAgaW50IGxlbiA9IChjZWlsIDwgbmV3TGVuZ3RoKSA/IGNlaWwgOiBuZXdMZW5ndGg7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWwsIGZyb20sIGFyciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmbG9hdFtdIGNvcHlPZlJhbmdlKGZsb2F0W10gb3JpZ2luYWwsIGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IHRvIC0gZnJvbTsKKyAgICAgICAgaWYgKG5ld0xlbmd0aCA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZyb20gKyAiID4gIiArIHRvKTsKKyAgICAgICAgZmxvYXRbXSBhcnIgPSBuZXcgZmxvYXRbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGNlaWwgPSBvcmlnaW5hbC5sZW5ndGggLSBmcm9tOworICAgICAgICBpbnQgbGVuID0gKGNlaWwgPCBuZXdMZW5ndGgpID8gY2VpbCA6IG5ld0xlbmd0aDsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgZnJvbSwgYXJyLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGNvcHlPZlJhbmdlKGRvdWJsZVtdIG9yaWdpbmFsLCBpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIGludCBuZXdMZW5ndGggPSB0byAtIGZyb207CisgICAgICAgIGlmIChuZXdMZW5ndGggPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmcm9tICsgIiA+ICIgKyB0byk7CisgICAgICAgIGRvdWJsZVtdIGFyciA9IG5ldyBkb3VibGVbbmV3TGVuZ3RoXTsKKyAgICAgICAgaW50IGNlaWwgPSBvcmlnaW5hbC5sZW5ndGggLSBmcm9tOworICAgICAgICBpbnQgbGVuID0gKGNlaWwgPCBuZXdMZW5ndGgpID8gY2VpbCA6IG5ld0xlbmd0aDsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgZnJvbSwgYXJyLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBjb3B5T2ZSYW5nZShib29sZWFuW10gb3JpZ2luYWwsIGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IHRvIC0gZnJvbTsKKyAgICAgICAgaWYgKG5ld0xlbmd0aCA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZyb20gKyAiID4gIiArIHRvKTsKKyAgICAgICAgYm9vbGVhbltdIGFyciA9IG5ldyBib29sZWFuW25ld0xlbmd0aF07CisgICAgICAgIGludCBjZWlsID0gb3JpZ2luYWwubGVuZ3RoIC0gZnJvbTsKKyAgICAgICAgaW50IGxlbiA9IChjZWlsIDwgbmV3TGVuZ3RoKSA/IGNlaWwgOiBuZXdMZW5ndGg7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWwsIGZyb20sIGFyciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgYXNMaXN0KE9iamVjdFtdIGEpIHsKKyAgICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nIGFbXSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGhhc2ggPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxvbmcgZSA9IGFbaV07CisgICAgICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgKGludCkgKGUgXiAoZSA+Pj4gMzIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoaW50IGFbXSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGhhc2ggPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyBhW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShzaG9ydCBhW10pIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGludCBoYXNoID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgYVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoY2hhciBhW10pIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGludCBoYXNoID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgYVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYnl0ZSBhW10pIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGludCBoYXNoID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgYVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYm9vbGVhbiBhW10pIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGludCBoYXNoID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgKGFbaV0gPyAxMjMxIDogMTIzNyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGZsb2F0IGFbXSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGhhc2ggPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyBGbG9hdC5mbG9hdFRvSW50Qml0cyhhW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZG91YmxlIGFbXSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGhhc2ggPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxvbmcgZSA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGFbaV0pOworICAgICAgICAgICAgaGFzaCA9IDMxICogaGFzaCArIChpbnQpIChlIF4gKGUgPj4+IDMyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKE9iamVjdCBhW10pIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGludCBoYXNoID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgZSA9IGFbaV07CisgICAgICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgKGUgPT0gbnVsbCA/IDAgOiBlLmhhc2hDb2RlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBkZWVwSGFzaENvZGUoT2JqZWN0IGFbXSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGhhc2ggPSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBlID0gYVtpXTsKKyAgICAgICAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKworICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgT2JqZWN0W10gPyBkZWVwSGFzaENvZGUoKE9iamVjdFtdKSBlKSA6CisgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgYnl0ZVtdID8gaGFzaENvZGUoKGJ5dGVbXSkgZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBzaG9ydFtdID8gaGFzaENvZGUoKHNob3J0W10pIGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGludFtdID8gaGFzaENvZGUoKGludFtdKSBlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgbG9uZ1tdID8gaGFzaENvZGUoKGxvbmdbXSkgZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBjaGFyW10gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlKChjaGFyW10pIGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGJvb2xlYW5bXSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlKChib29sZWFuW10pIGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBmbG9hdFtdID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlKChmbG9hdFtdKSBlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGRvdWJsZVtdID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZSgoZG91YmxlW10pIGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSAhPSBudWxsID8gZS5oYXNoQ29kZSgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpKSkpKSkpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWVwRXF1YWxzKE9iamVjdFtdIGExLCBPYmplY3RbXSBhMikgeworICAgICAgICBpZiAoYTEgPT0gYTIpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoYTEgPT0gbnVsbCB8fCBhMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGludCBsZW4gPSBhMS5sZW5ndGg7CisgICAgICAgIGlmIChsZW4gIT0gYTIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBlMSA9IGExW2ldOworICAgICAgICAgICAgT2JqZWN0IGUyID0gYTJbaV07CisgICAgICAgICAgICBpZiAoZTEgPT0gZTIpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGUxID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gZXEgPQorICAgICAgICAgICAgICAgIChlMS5nZXRDbGFzcygpICE9IGUyLmdldENsYXNzKCkgfHwgZTEuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpID8KKyAgICAgICAgICAgICAgICAgICAgZTEuZXF1YWxzKGUyKSA6CisgICAgICAgICAgICAgICAgICAgIChlMSBpbnN0YW5jZW9mIE9iamVjdFtdICYmIGUyIGluc3RhbmNlb2YgT2JqZWN0W10pID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBFcXVhbHMoKE9iamVjdFtdKSBlMSwgKE9iamVjdFtdKSBlMikgOgorICAgICAgICAgICAgICAgICAgICAgICAgKGUxIGluc3RhbmNlb2YgYnl0ZVtdICYmIGUyIGluc3RhbmNlb2YgYnl0ZVtdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzKChieXRlW10pIGUxLCAoYnl0ZVtdKSBlMikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlMSBpbnN0YW5jZW9mIHNob3J0W10gJiYgZTIgaW5zdGFuY2VvZiBzaG9ydFtdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscygoc2hvcnRbXSkgZTEsIChzaG9ydFtdKSBlMikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZTEgaW5zdGFuY2VvZiBpbnRbXSAmJiBlMiBpbnN0YW5jZW9mIGludFtdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoKGludFtdKSBlMSwgKGludFtdKSBlMikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUxIGluc3RhbmNlb2YgbG9uZ1tdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIgaW5zdGFuY2VvZiBsb25nW10pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoKGxvbmdbXSkgZTEsIChsb25nW10pIGUyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUxIGluc3RhbmNlb2YgY2hhcltdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUyIGluc3RhbmNlb2YgY2hhcltdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscygoY2hhcltdKSBlMSwgKGNoYXJbXSkgZTIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUxIGluc3RhbmNlb2YgYm9vbGVhbltdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMiBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzKChib29sZWFuW10pIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib29sZWFuW10pIGUyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZTEgaW5zdGFuY2VvZiBmbG9hdFtdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIgaW5zdGFuY2VvZiBmbG9hdFtdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzKChmbG9hdFtdKSBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0W10pIGUyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUxIGluc3RhbmNlb2YgZG91YmxlW10gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIgaW5zdGFuY2VvZiBkb3VibGVbXSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoKGRvdWJsZVtdKSBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGVbXSkgZTIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEuZXF1YWxzKGUyKTsKKworICAgICAgICAgICAgaWYgKCFlcSkgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhsb25nW10gYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAoYS5sZW5ndGggPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKS5hcHBlbmQoYVswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoYVtpXSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhpbnRbXSBhKSB7CisgICAgICAgIGlmIChhID09IG51bGwpIHJldHVybiAibnVsbCI7CisgICAgICAgIGlmIChhLmxlbmd0aCA9PSAwKSByZXR1cm4gIltdIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnWycpLmFwcGVuZChhWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhLmxlbmd0aDsgaSsrKSBidWYuYXBwZW5kKCIsICIpLmFwcGVuZChhW2ldKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnXScpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKHNob3J0W10gYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAoYS5sZW5ndGggPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKS5hcHBlbmQoYVswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoYVtpXSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhjaGFyW10gYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAoYS5sZW5ndGggPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKS5hcHBlbmQoYVswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoYVtpXSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlW10gYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAoYS5sZW5ndGggPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKS5hcHBlbmQoYVswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoYVtpXSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuW10gYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAoYS5sZW5ndGggPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKS5hcHBlbmQoYVswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoYVtpXSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhmbG9hdFtdIGEpIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuICJudWxsIjsKKyAgICAgICAgaWYgKGEubGVuZ3RoID09IDApIHJldHVybiAiW10iOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCdbJykuYXBwZW5kKGFbMF0pOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKGFbaV0pOworICAgICAgICBidWYuYXBwZW5kKCddJyk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoZG91YmxlW10gYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBpZiAoYS5sZW5ndGggPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKS5hcHBlbmQoYVswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoYVtpXSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhPYmplY3RbXSBhKSB7CisgICAgICAgIGlmIChhID09IG51bGwpIHJldHVybiAibnVsbCI7CisgICAgICAgIGlmIChhLmxlbmd0aCA9PSAwKSByZXR1cm4gIltdIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnWycpLmFwcGVuZChhWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhLmxlbmd0aDsgaSsrKSBidWYuYXBwZW5kKCIsICIpLmFwcGVuZChhW2ldKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnXScpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZXBUb1N0cmluZyhPYmplY3RbXSBhKSB7CisgICAgICAgIGlmIChhID09IG51bGwpIHJldHVybiAibnVsbCI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGRlZXBUb1N0cmluZyhhLCBidWYsIG5ldyBBcnJheUxpc3QoKSk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlZXBUb1N0cmluZyhPYmplY3RbXSBhLCBTdHJpbmdCdWZmZXIgYnVmLCBMaXN0IHNlZW4pIHsKKyAgICAgICAgc2Vlbi5hZGQoYSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBPYmplY3QgZSA9IGFbaV07CisgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgibnVsbCIpOworICAgICAgICAgICAgfSBlbHNlIGlmICghZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlZW4uY29udGFpbnMoZSkpIGJ1Zi5hcHBlbmQoIlsuLi5dIik7CisgICAgICAgICAgICAgICAgZWxzZSBkZWVwVG9TdHJpbmcoKE9iamVjdFtdKSBlLCBidWYsIHNlZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmUgYXJyCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoZSBpbnN0YW5jZW9mIGJ5dGVbXSkgPyB0b1N0cmluZygoYnl0ZVtdKSBlKSA6CisgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2Ygc2hvcnRbXSkgPyB0b1N0cmluZygoc2hvcnRbXSkgZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBpbnRbXSkgPyB0b1N0cmluZygoaW50W10pIGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGxvbmdbXSkgPyB0b1N0cmluZygobG9uZ1tdKSBlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgY2hhcltdKSA/IHRvU3RyaW5nKChjaGFyW10pIGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgYm9vbGVhbltdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoKGJvb2xlYW5bXSkgZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgZmxvYXRbXSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZygoZmxvYXRbXSkgZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGRvdWJsZVtdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZygoZG91YmxlW10pIGUpIDogIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgc2Vlbi5yZW1vdmUoc2Vlbi5zaXplKCkgLSAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmFkZmIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAuamF2YQpAQCAtMCwwICsxLDk0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlNpemVkTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIEhhc2hNYXAgd2hpY2ggaGFzIGxpbWl0ZWQgc3luY2hyb25pemF0aW9uLgorICogSW4gcGFydGljdWxhciBtdXRhdG9ycyBhcmUgZ2VuZXJhbGx5IHN5bmNocm9uaXplZCB3aGlsZSBhY2Nlc3NvcnMKKyAqIGFyZSBnZW5lcmFsbHkgbm90LiBBZGRpdGlvbmFsbHkgdGhlIEl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzCisgKiBjbGFzcyBhcmUgbm90ICJmYWlsLWZhc3QiLCBidXQgaW5zdGVhZCB0cnkgdG8gY29udGludWUgdG8gaXRlcmF0ZQorICogb3ZlciB0aGUgZGF0YSBzdHJ1Y3R1cmUgYWZ0ZXIgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4KKyAqIFRoZSBzeW5jaHJvbml6YXRpb24gc2VtYW50aWNzIGFyZSBidWlsdCByaWdodCBpbiB0byB0aGUKKyAqIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIGEgZGVsZWdhdGluZyB3cmFwcGVyIGxpa2UgdGhlCisgKiBvdGhlciBjb2xsZWN0aW9uIGNsYXNzZXMgZG8gYmVjYXVzZSBpdCB3YXNuJ3QgY2xlYXIgdG8gbWUgdGhhdCB0aGUKKyAqIGhvdyB0aGUgdHdvIHNob3VsZCBiZSBzZXBlcmF0ZWQgb3IgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gZG8KKyAqIHNvLiBUaGlzIGNhbiBwcm9iYWJseSBiZSBhIHRvcGljIGZvciBmdXJ0aGVyIGRlYmF0ZSBpbiB0aGUgZnV0dXJlLgorICogVGhpcyBjbGFzcyBpcyBiYXNlZCBoZWF2aWx5IG9uIHRoZSBIYXNoTWFwIGNsYXNzIGluIHRoZSBKYXZhCisgKiBjb2xsZWN0aW9ucyBwYWNrYWdlLgorICovCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudEhhc2hNYXAgZXh0ZW5kcyBBYnN0cmFjdE1hcAorICAgIGltcGxlbWVudHMgQ29uY3VycmVudE1hcCwgU2l6ZWRNYXAsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgLSBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkgPSAxNjsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkCisgICAgICogYnkgZWl0aGVyIG9mIHRoZSBjb25zdHJ1Y3RvcnMgd2l0aCBhcmd1bWVudHMuCisgICAgICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3byA8PSAxPDwzMC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMzA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9hZCBmYXN0IHVzZWQgd2hlbiBub25lIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0xPQURfRkFDVE9SID0gMC43NWY7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBvZiByYW5kb20gbnVtYmVycyB1c2VkIGluICJyYW5kb20iIG1ldGhvZHMsIHNpbmNlIGdlbmVyYXRpbmcgdGhlbQorICAgICAqIGlzIGV4cGVuc2l2ZS4gV2UgaG9wZSBlYWNoIG1hcCBjaGFuZ2VzIGVub3VnaCBiZXR3ZWVuIGN5Y2xpbmcgdGhyb3VnaAorICAgICAqIHRoaXMgbGlzdCB0aGF0IHRoZSBvdmVyYWxsIGVmZmVjdCBpcyByYW5kb20gZW5vdWdoLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBkb3VibGVbXSBSQU5ET01TID0gbmV3IGRvdWJsZVsxMDAwXTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkFORE9NUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIFJBTkRPTVNbaV0gPSByYW5kb20ubmV4dERvdWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSwgcmVzaXplZCBhcyBuZWNlc3NhcnkuIExlbmd0aCBNVVNUIEFsd2F5cyBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBFbnRyeVtdIHRhYmxlOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgaWRlbnRpdHkgaGFzaCBtYXAuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IHNpemU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmV4dCBzaXplIHZhbHVlIGF0IHdoaWNoIHRvIHJlc2l6ZShjYXBhY2l0eSAqIGxvYWQgZmFjdG9yKS4KKyAgICAgKgorICAgICAqIEBzZXJpYWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB0aHJlc2hvbGQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLgorICAgICAqCisgICAgICogQHNlcmlhbAorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbG9hZEZhY3RvcjsKKworICAgIC8qKgorICAgICAqIFNwcmVhZCAicmFuZG9tIiByZW1vdmVzIGFuZCBpdGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tRW50cnkgPSAwOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBlbnRyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1heFNpemUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgPHR0PkNvbmN1cnJlbnRIYXNoTWFwPC90dD4gd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwKKyAgICAgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbml0aWFsIGNhcGFjaXR5LgorICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yIFRoZSBsb2FkIGZhY3Rvci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBuZWdhdGl2ZQorICAgICAqIG9yIHRoZSBsb2FkIGZhY3RvciBpcyBub25wb3NpdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY3VycmVudEhhc2hNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgeworICAgICAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBpbml0aWFsIGNhcGFjaXR5OiAiICsKKyAgICAgICAgICAgICAgICBpbml0aWFsQ2FwYWNpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZKQorICAgICAgICAgICAgaW5pdGlhbENhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKKyAgICAgICAgaWYgKGxvYWRGYWN0b3IgPD0gMCB8fCBsb2FkRmFjdG9yID4gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBsb2FkIGZhY3RvcjogIiArCisgICAgICAgICAgICAgICAgbG9hZEZhY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIGEgcG93ZXIgb2YgMiA+PSBpbml0aWFsQ2FwYWNpdHkKKyAgICAgICAgaW50IGNhcGFjaXR5ID0gMTsKKyAgICAgICAgd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSBjYXBhY2l0eSA8PD0gMTsKKworICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOworICAgICAgICB0aHJlc2hvbGQgPSAoaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKKyAgICAgICAgdGFibGUgPSBuZXcgRW50cnlbY2FwYWNpdHldOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgPHR0PkNvbmN1cnJlbnRIYXNoTWFwPC90dD4gd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwKKyAgICAgKiBjYXBhY2l0eSBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IoMC43NSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIG5lZ2F0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBDb25jdXJyZW50SGFzaE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDx0dD5Db25jdXJyZW50SGFzaE1hcDwvdHQ+IHdpdGggdGhlIGRlZmF1bHQgaW5pdGlhbAorICAgICAqIGNhcGFjaXR5KDE2KSBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IoMC43NSkuCisgICAgICovCisgICAgcHVibGljIENvbmN1cnJlbnRIYXNoTWFwKCkgeworICAgICAgICB0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyA8dHQ+Q29uY3VycmVudEhhc2hNYXA8L3R0PiB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRoZQorICAgICAqIHNwZWNpZmllZCA8dHQ+TWFwPC90dD4uIFRoZSA8dHQ+Q29uY3VycmVudEhhc2hNYXA8L3R0PiBpcyBjcmVhdGVkIHdpdGgKKyAgICAgKiBkZWZhdWx0IGxvYWQgZmFjdG9yKDAuNzUpIGFuZCBhbiBpbml0aWFsIGNhcGFjaXR5IHN1ZmZpY2llbnQgdG8KKyAgICAgKiBob2xkIHRoZSBtYXBwaW5ncyBpbiB0aGUgc3BlY2lmaWVkIDx0dD5NYXA8L3R0Pi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIHRoZSBtYXAgd2hvc2UgbWFwcGluZ3MgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgbWFwIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIENvbmN1cnJlbnRIYXNoTWFwKE1hcCBtKSB7CisgICAgICAgIHRoaXMoTWF0aC5tYXgoKGludCkgKG0uc2l6ZSgpIC8gREVGQVVMVF9MT0FEX0ZBQ1RPUikgKyAxLAorICAgICAgICAgICAgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZKSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7CisgICAgICAgIHB1dEFsbChtKTsKKyAgICB9CisKKyAgICAvLyBpbnRlcm5hbCB1dGlsaXRpZXMKKworICAgIC8qKgorICAgICAqIFZhbHVlIHJlcHJlc2VudGluZyBudWxsIGtleXMgaW5zaWRlIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTF9LRVkgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBrZXkuIFVzZSBOVUxMX0tFWSBpZiBrZXkgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbWFza051bGwoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gKGtleSA9PSBudWxsID8gTlVMTF9LRVkgOiBrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMga2V5IHJlcHJlc2VudGVkIGJ5IHNwZWNpZmllZCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgdW5tYXNrTnVsbChPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiAoa2V5ID09IE5VTExfS0VZID8gbnVsbCA6IGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBmb3Igbm9uLW51bGwgT2JqZWN0IHguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhhc2goT2JqZWN0IHgpIHsKKyAgICAgICAgaW50IGggPSB4Lmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiBoIC0gKGggPDwgNyk7IC8vIGkuZS4sIC0xMjcgKiBoCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGVxdWFsaXR5IG9mIG5vbi1udWxsIHJlZmVyZW5jZSB4IGFuZCBwb3NzaWJseS1udWxsIHkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShPYmplY3QgeCwgT2JqZWN0IHkpIHsKKyAgICAgICAgcmV0dXJuIHggPT0geSB8fCB4LmVxdWFscyh5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNhcGFjaXR5IG9mIGJhY2tpbmcgdGFibGUgaW4gdGhpcyBtYXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNhcGFjaXR5IG9mIGJhY2tpbmcgdGFibGUgaW4gdGhpcyBtYXAuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBjYXBhY2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhpcyBtYXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhpcyBtYXAuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3IoKSB7CisgICAgICAgIHJldHVybiBsb2FkRmFjdG9yOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4U2l6ZShpbnQgbWF4U2l6ZSkgeworICAgICAgICB0aGlzLm1heFNpemUgPSAobWF4U2l6ZSA8IDApID8gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhTaXplOworICAgICAgICBpZiAodGhpcy5tYXhTaXplICE9IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgcmVtb3ZlT3ZlcmZsb3codGhpcy5tYXhTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKSB7CisgICAgICAgIHJldHVybiBtYXhTaXplICE9IEludGVnZXIuTUFYX1ZBTFVFICYmIHNpemUoKSA+PSBtYXhTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG92ZXJmbG93UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBjb250YWlucyBubyBrZXktdmFsdWUgbWFwcGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgbm8ga2V5LXZhbHVlIG1hcHBpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHNwZWNpZmllZCBrZXkgaXMgbWFwcGVkIGluIHRoaXMgaWRlbnRpdHkKKyAgICAgKiBoYXNoIG1hcCwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LgorICAgICAqIEEgcmV0dXJuIHZhbHVlIG9mIDx0dD5udWxsPC90dD4gZG9lcyBub3QgPGk+bmVjZXNzYXJpbHk8L2k+IGluZGljYXRlCisgICAgICogdGhhdCB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoZSBrZXk7IGl0IGlzIGFsc28gcG9zc2libGUgdGhhdAorICAgICAqIHRoZSBtYXAgZXhwbGljaXRseSBtYXBzIHRoZSBrZXkgdG8gPHR0Pm51bGw8L3R0Pi4gVGhlCisgICAgICogPHR0PmNvbnRhaW5zS2V5PC90dD4gbWV0aG9kIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIHR3byBjYXNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXksIG9yCisgICAgICogPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LgorICAgICAqIEBzZWUgI3B1dChPYmplY3QsIE9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIEVudHJ5IGUgPSBnZXRFbnRyeShrZXkpOworICAgICAgICByZXR1cm4gZSA9PSBudWxsID8gbnVsbCA6IGUudmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIG1hcCBpcyB0byBiZSB0ZXN0ZWQKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICoga2V5LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldEVudHJ5KGtleSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlCisgICAgICogQ29uY3VycmVudEhhc2hNYXAuIFJldHVybnMgbnVsbCBpZiB0aGUgQ29uY3VycmVudEhhc2hNYXAgY29udGFpbnMgbm8KKyAgICAgKiBtYXBwaW5nIGZvciB0aGlzIGtleS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW50cnkgZ2V0RW50cnkoT2JqZWN0IGtleSkgeworICAgICAgICBPYmplY3QgayA9IG1hc2tOdWxsKGtleSk7CisgICAgICAgIGludCBoYXNoID0gaGFzaChrKTsKKyAgICAgICAgRW50cnlbXSB0YWIgPSB0YWJsZTsKKyAgICAgICAgZm9yIChFbnRyeSBlID0gdGFiW2hhc2ggJiAodGFiLmxlbmd0aCAtIDEpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZXEoaywgZS5rZXkpKSByZXR1cm4gZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIG1hcC4KKyAgICAgKiBJZiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQKKyAgICAgKiB2YWx1ZSBpcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkga2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgPHR0Pm51bGw8L3R0PgorICAgICAqIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuIEEgPHR0Pm51bGw8L3R0PiByZXR1cm4gY2FuCisgICAgICogYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBDb25jdXJyZW50SGFzaE1hcCBwcmV2aW91c2x5IGFzc29jaWF0ZWQKKyAgICAgKiA8dHQ+bnVsbDwvdHQ+IHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCBrID0gbWFza051bGwoa2V5KTsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGspOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBpID0gaGFzaCAmICh0YWJsZS5sZW5ndGggLSAxKTsKKworICAgICAgICAgICAgZm9yIChFbnRyeSBlID0gdGFibGVbaV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBlcShrLCBlLmtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWF4U2l6ZSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICByZW1vdmVPdmVyZmxvdyhtYXhTaXplIC0gMSk7CisgICAgICAgICAgICB0YWJsZVtpXSA9IGNyZWF0ZUVudHJ5KGhhc2gsIGssIHZhbHVlLCB0YWJsZVtpXSk7CisgICAgICAgICAgICBpZiAoc2l6ZSsrID49IHRocmVzaG9sZCkgcmVzaXplKDIgKiB0YWJsZS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgZW50cmllcyBlcXVhbCB0byBvciBvdmVyIHRoZSBtYXggc2l6ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlT3ZlcmZsb3coaW50IG1heFNpemUpIHsKKyAgICAgICAgd2hpbGUgKHNpemUgPiBtYXhTaXplKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSByZW1vdmVSYW5kb20oKTsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgb3ZlcmZsb3dSZW1vdmVkKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0SWZBYnNlbnQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCBrID0gbWFza051bGwoa2V5KTsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGspOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBpID0gaGFzaCAmICh0YWJsZS5sZW5ndGggLSAxKTsKKworICAgICAgICAgICAgZm9yIChFbnRyeSBlID0gdGFibGVbaV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBlcShrLCBlLmtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWF4U2l6ZSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICByZW1vdmVPdmVyZmxvdyhtYXhTaXplIC0gMSk7CisgICAgICAgICAgICB0YWJsZVtpXSA9IGNyZWF0ZUVudHJ5KGhhc2gsIGssIHZhbHVlLCB0YWJsZVtpXSk7CisgICAgICAgICAgICBpZiAoc2l6ZSsrID49IHRocmVzaG9sZCkgcmVzaXplKDIgKiB0YWJsZS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIG1hcCBpbnRvIGEgbmV3IDx0dD5Db25jdXJyZW50SGFzaE1hcDwvdHQ+CisgICAgICogaW5zdGFuY2Ugd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbgorICAgICAqIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIG1hcCBleGNlZWRzIGl0cyBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3Q2FwYWNpdHkgdGhlIG5ldyBjYXBhY2l0eSwgTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzaXplKGludCBuZXdDYXBhY2l0eSkgeworICAgICAgICAvLyBhc3NlcnQobmV3Q2FwYWNpdHkgJiAtbmV3Q2FwYWNpdHkpID09IG5ld0NhcGFjaXR5OyAvLyBwb3dlciBvZiAyCisgICAgICAgIEVudHJ5W10gb2xkVGFibGUgPSB0YWJsZTsKKyAgICAgICAgaW50IG9sZENhcGFjaXR5ID0gb2xkVGFibGUubGVuZ3RoOworCisgICAgICAgIC8vIGNoZWNrIGlmIG5lZWRlZAorICAgICAgICBpZiAoc2l6ZSA8IHRocmVzaG9sZCB8fCBvbGRDYXBhY2l0eSA+IG5ld0NhcGFjaXR5KSByZXR1cm47CisKKyAgICAgICAgRW50cnlbXSBuZXdUYWJsZSA9IG5ldyBFbnRyeVtuZXdDYXBhY2l0eV07CisgICAgICAgIGludCBtYXNrID0gbmV3Q2FwYWNpdHkgLSAxOworICAgICAgICBmb3IgKGludCBpID0gb2xkQ2FwYWNpdHk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBmb3IgKEVudHJ5IGUgPSBvbGRUYWJsZVtpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICAgICAgRW50cnkgY2xvbmUgPSAoRW50cnkpIGUuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBpbnQgaiA9IGNsb25lLmhhc2ggJiBtYXNrOworICAgICAgICAgICAgICAgIGNsb25lLm5leHQgPSBuZXdUYWJsZVtqXTsKKyAgICAgICAgICAgICAgICBuZXdUYWJsZVtqXSA9IGNsb25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRhYmxlID0gbmV3VGFibGU7CisgICAgICAgIHRocmVzaG9sZCA9IChpbnQpIChuZXdDYXBhY2l0eSAqIGxvYWRGYWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyBhbGwgb2YgdGhlIG1hcHBpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAgdG8gdGhpcyBtYXAKKyAgICAgKiBUaGVzZSBtYXBwaW5ncyB3aWxsIHJlcGxhY2UgYW55IG1hcHBpbmdzIHRoYXQKKyAgICAgKiB0aGlzIG1hcCBoYWQgZm9yIGFueSBvZiB0aGUga2V5cyBjdXJyZW50bHkgaW4gdGhlIHNwZWNpZmllZCBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBtYXBwaW5ncyB0byBiZSBzdG9yZWQgaW4gdGhpcyBtYXAuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIG1hcCBpcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBwdXRBbGwoTWFwIHQpIHsKKyAgICAgICAgLy8gRXhwYW5kIGVub3VnaCB0byBob2xkIHQncyBlbGVtZW50cyB3aXRob3V0IHJlc2l6aW5nLgorICAgICAgICBpbnQgbiA9IHQuc2l6ZSgpOworICAgICAgICBpZiAobiA9PSAwKSByZXR1cm47CisgICAgICAgIGlmIChuID49IHRocmVzaG9sZCkgeworICAgICAgICAgICAgbiA9IChpbnQpIChuIC8gbG9hZEZhY3RvciArIDEpOworICAgICAgICAgICAgaWYgKG4gPiBNQVhJTVVNX0NBUEFDSVRZKSBuID0gTUFYSU1VTV9DQVBBQ0lUWTsKKyAgICAgICAgICAgIGludCBjYXBhY2l0eSA9IHRhYmxlLmxlbmd0aDsKKyAgICAgICAgICAgIHdoaWxlIChjYXBhY2l0eSA8IG4pIGNhcGFjaXR5IDw8PSAxOworICAgICAgICAgICAgcmVzaXplKGNhcGFjaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHQuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICBwdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9yIHRoaXMga2V5IGZyb20gdGhpcyBtYXAgaWYgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCisgICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgPHR0Pm51bGw8L3R0PgorICAgICAqIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuIEEgPHR0Pm51bGw8L3R0PiByZXR1cm4gY2FuCisgICAgICogYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBtYXAgcHJldmlvdXNseSBhc3NvY2lhdGVkIDx0dD5udWxsPC90dD4KKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKKyAgICAgICAgRW50cnkgZSA9IHJlbW92ZUVudHJ5Rm9yS2V5KGtleSk7CisgICAgICAgIHJldHVybiAoZSA9PSBudWxsID8gZSA6IGUudmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUKKyAgICAgKiBDb25jdXJyZW50SGFzaE1hcC4gUmV0dXJucyBudWxsIGlmIHRoZSBDb25jdXJyZW50SGFzaE1hcCBjb250YWlucyBubworICAgICAqIG1hcHBpbmcgZm9yIHRoaXMga2V5LgorICAgICAqLworICAgIHByaXZhdGUgRW50cnkgcmVtb3ZlRW50cnlGb3JLZXkoT2JqZWN0IGtleSkgeworICAgICAgICBPYmplY3QgayA9IG1hc2tOdWxsKGtleSk7CisgICAgICAgIGludCBoYXNoID0gaGFzaChrKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgaSA9IGhhc2ggJiAodGFibGUubGVuZ3RoIC0gMSk7CisgICAgICAgICAgICBFbnRyeSBlID0gdGFibGVbaV07CisKKyAgICAgICAgICAgIGlmIChlID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGVxKGssIGUua2V5KSkgeworICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICB0YWJsZVtpXSA9IGUubmV4dDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRW50cnkgcHJldiA9IGU7CisgICAgICAgICAgICBmb3IgKGUgPSBlLm5leHQ7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZXEoaywgZS5rZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gZS5uZXh0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbCB2ZXJzaW9uIG9mIHJlbW92ZSBmb3IgRW50cnlTZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBFbnRyeSByZW1vdmVNYXBwaW5nKE9iamVjdCBvKSB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSByZXR1cm4gbnVsbDsKKworICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvOworICAgICAgICBPYmplY3QgayA9IG1hc2tOdWxsKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGspOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBpID0gaGFzaCAmICh0YWJsZS5sZW5ndGggLSAxKTsKKyAgICAgICAgICAgIEVudHJ5IGUgPSB0YWJsZVtpXTsKKworICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZS5lcXVhbHMoZW50cnkpKSB7CisgICAgICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgICAgIHRhYmxlW2ldID0gZS5uZXh0OworICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbnRyeSBwcmV2ID0gZTsKKyAgICAgICAgICAgIGZvciAoZSA9IGUubmV4dDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBlLmVxdWFscyhlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBlLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgdGFibGUgPSBuZXcgRW50cnlbdGFibGUubGVuZ3RoXTsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFyYml0cmFyeSBlbnRyeSBpbmRleC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByYW5kb21FbnRyeUluZGV4KCkgeworICAgICAgICBpZiAocmFuZG9tRW50cnkgPT0gUkFORE9NUy5sZW5ndGgpCisgICAgICAgICAgICByYW5kb21FbnRyeSA9IDA7CisgICAgICAgIHJldHVybiAoaW50KSAoUkFORE9NU1tyYW5kb21FbnRyeSsrXSAqIHRhYmxlLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIE1hcC5FbnRyeSByZW1vdmVSYW5kb20oKSB7CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCByYW5kb20gPSByYW5kb21FbnRyeUluZGV4KCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kRW50cnkocmFuZG9tLCByYW5kb20gJSAyID09IDAsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIEVudHJ5IHJlbSA9IHRhYmxlW2luZGV4XTsKKyAgICAgICAgICAgIHRhYmxlW2luZGV4XSA9IHJlbS5uZXh0OworICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHJlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBuZWFyZXN0IHRoZSBnaXZlbiBpbmRleCwgc3RhcnRpbmcgaW4gdGhlCisgICAgICogZ2l2ZW4gZGlyZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGZpbmRFbnRyeShpbnQgc3RhcnQsIGJvb2xlYW4gZm9yd2FyZCwgYm9vbGVhbiBzZWFyY2hlZE90aGVyKSB7CisgICAgICAgIGlmIChmb3J3YXJkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0YWJsZS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAodGFibGVbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICByZXR1cm4gKHNlYXJjaGVkT3RoZXIgfHwgc3RhcnQgPT0gMCkgPyAtMQorICAgICAgICAgICAgICAgIDogZmluZEVudHJ5KHN0YXJ0IC0gMSwgZmFsc2UsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICBpZiAodGFibGVbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICByZXR1cm4gKHNlYXJjaGVkT3RoZXIgfHwgc3RhcnQgPT0gdGFibGUubGVuZ3RoIC0gMSkgPyAtMQorICAgICAgICAgICAgICAgIDogZmluZEVudHJ5KHN0YXJ0ICsgMSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgcmFuZG9tRW50cnlJdGVyYXRvcigpIHsKKyAgICAgICAgLy8gcGFzcyBpbmRleCBzbyBjYWxjdWxhdGVkIGJlZm9yZSBpdGVyYXRvciByZWZzIHRhYmxlLCBpbiBjYXNlIHRhYmxlCisgICAgICAgIC8vIGdldHMgcmVwbGFjZSB3aXRoIGEgbGFyZ2VyIG9uZQorICAgICAgICByZXR1cm4gbmV3IEhhc2hJdGVyYXRvcihFTlRSSUVTLCByYW5kb21FbnRyeUluZGV4KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBtYXBzIG9uZSBvciBtb3JlIGtleXMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZC4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgbWFwcyBvbmUgb3IgbW9yZSBrZXlzIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGNvbnRhaW5zTnVsbFZhbHVlKCk7CisKKyAgICAgICAgRW50cnkgdGFiW10gPSB0YWJsZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhlLnZhbHVlKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWwtY2FzZSBjb2RlIGZvciBjb250YWluc1ZhbHVlIHdpdGggbnVsbCBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc051bGxWYWx1ZSgpIHsKKyAgICAgICAgRW50cnkgdGFiW10gPSB0YWJsZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKGUudmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyA8dHQ+Q29uY3VycmVudEhhc2hNYXA8L3R0PiBpbnN0YW5jZTogdGhlCisgICAgICoga2V5cyBhbmQgdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29uY3VycmVudEhhc2hNYXAodGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEVudHJ5IGNyZWF0ZUVudHJ5KGludCBoLCBPYmplY3QgaywgT2JqZWN0IHYsIEVudHJ5IG4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbnRyeShoLCBrLCB2LCBuKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgTWFwLkVudHJ5IHsKKworICAgICAgICBmaW5hbCBPYmplY3Qga2V5OworICAgICAgICBPYmplY3QgdmFsdWU7CisgICAgICAgIGZpbmFsIGludCBoYXNoOworICAgICAgICBFbnRyeSBuZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IGVudHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEVudHJ5KGludCBoLCBPYmplY3QgaywgT2JqZWN0IHYsIEVudHJ5IG4pIHsKKyAgICAgICAgICAgIHZhbHVlID0gdjsKKyAgICAgICAgICAgIG5leHQgPSBuOworICAgICAgICAgICAga2V5ID0gazsKKyAgICAgICAgICAgIGhhc2ggPSBoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gdW5tYXNrTnVsbChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87CisgICAgICAgICAgICBPYmplY3QgazEgPSBnZXRLZXkoKTsKKyAgICAgICAgICAgIE9iamVjdCBrMiA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAoazEgPT0gazIgfHwgKGsxICE9IG51bGwgJiYgazEuZXF1YWxzKGsyKSkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdjEgPSBnZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIE9iamVjdCB2MiA9IGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodjEgPT0gdjIgfHwgKHYxICE9IG51bGwgJiYgdjEuZXF1YWxzKHYyKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoa2V5ID09IE5VTExfS0VZID8gMCA6IGtleS5oYXNoQ29kZSgpKSBeCisgICAgICAgICAgICAgICAgKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEtleSgpICsgIj0iICsgZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgICAgICAvLyBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBzZXQgdGhlIG5leHQgZmllbGQKKyAgICAgICAgICAgIC8vIGNvcnJlY3RseS4KKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnkoaGFzaCwga2V5LCB2YWx1ZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUeXBlcyBvZiBFbnVtZXJhdGlvbnMvSXRlcmF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlTID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVTID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5UUklFUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBNYXAgaXRlcmF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7CisKKyAgICAgICAgZmluYWwgRW50cnlbXSB0YWJsZSA9IENvbmN1cnJlbnRIYXNoTWFwLnRoaXMudGFibGU7CisgICAgICAgIGZpbmFsIGludCB0eXBlOworICAgICAgICBpbnQgc3RhcnRJbmRleDsKKyAgICAgICAgaW50IHN0b3BJbmRleCA9IDA7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgRW50cnkgZW50cnkgPSBudWxsOworICAgICAgICBFbnRyeSBsYXN0UmV0dXJuZWQgPSBudWxsOworCisgICAgICAgIEhhc2hJdGVyYXRvcihpbnQgdHlwZSwgaW50IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OworICAgICAgICAgICAgaW5kZXggPSBzdGFydEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gc3RvcEluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKChlbnRyeSA9IHRhYmxlW2luZGV4LS1dKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdG9wSW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gdGFibGUubGVuZ3RoIC0gMTsKKyAgICAgICAgICAgICAgICBzdG9wSW5kZXggPSBzdGFydEluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gc3RvcEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZW50cnkgPSB0YWJsZVtpbmRleC0tXSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgRW50cnkgZSA9IGxhc3RSZXR1cm5lZCA9IGVudHJ5OworICAgICAgICAgICAgZW50cnkgPSBlLm5leHQ7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBLRVlTID8gZS5rZXkgOiAodHlwZSA9PSBWQUxVRVMgPyBlLnZhbHVlIDogZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25jdXJyZW50SGFzaE1hcC50aGlzKSB7CisgICAgICAgICAgICAgICAgRW50cnlbXSB0YWIgPSBDb25jdXJyZW50SGFzaE1hcC50aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IChsYXN0UmV0dXJuZWQuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBlLCBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlID09IGxhc3RSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJbaW5kZXhdID0gZS5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IGUubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJdGVyYXRlZCBvZmYgdGFibGUgd2hlbiBkb2luZyByZW1vdmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZpZXdzCisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTZXQgZW50cnlTZXQgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFNldCBrZXlTZXQgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IENvbGxlY3Rpb24gdmFsdWVzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZSBzZXQgaXMKKyAgICAgKiBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHNldCwgYW5kCisgICAgICogdmljZS12ZXJzYS4gVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBtYXBwaW5nIGZyb20gdGhpcyBtYXAsIHZpYSB0aGUgPHR0Pkl0ZXJhdG9yLnJlbW92ZTwvdHQ+LAorICAgICAqIDx0dD5TZXQucmVtb3ZlPC90dD4sIDx0dD5yZW1vdmVBbGw8L3R0PiwgPHR0PnJldGFpbkFsbDwvdHQ+LCBhbmQKKyAgICAgKiA8dHQ+Y2xlYXI8L3R0PiBvcGVyYXRpb25zLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8dHQ+YWRkPC90dD4gb3IKKyAgICAgKiA8dHQ+YWRkQWxsPC90dD4gb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXQgdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFNldCBrZXlTZXQoKSB7CisgICAgICAgIFNldCBrcyA9IGtleVNldDsKKyAgICAgICAgcmV0dXJuIChrcyAhPSBudWxsID8ga3MgOiAoa2V5U2V0ID0gbmV3IEtleVNldCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBLZXlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldCB7CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoSXRlcmF0b3IoS0VZUywgdGFibGUubGVuZ3RoIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnNLZXkobyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBDb25jdXJyZW50SGFzaE1hcC50aGlzLnJlbW92ZUVudHJ5Rm9yS2V5KG8pICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwLnRoaXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIHZpZXcgb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuIFRoZQorICAgICAqIGNvbGxlY3Rpb24gaXMgYmFja2VkIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluCisgICAgICogdGhlIGNvbGxlY3Rpb24sIGFuZCB2aWNlLXZlcnNhLiBUaGUgY29sbGVjdGlvbiBzdXBwb3J0cyBlbGVtZW50CisgICAgICogcmVtb3ZhbCwgd2hpY2ggcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBtYXBwaW5nIGZyb20gdGhpcyBtYXAsIHZpYSB0aGUKKyAgICAgKiA8dHQ+SXRlcmF0b3IucmVtb3ZlPC90dD4sIDx0dD5Db2xsZWN0aW9uLnJlbW92ZTwvdHQ+LAorICAgICAqIDx0dD5yZW1vdmVBbGw8L3R0PiwgPHR0PnJldGFpbkFsbDwvdHQ+LCBhbmQgPHR0PmNsZWFyPC90dD4gb3BlcmF0aW9ucy4KKyAgICAgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8dHQ+YWRkPC90dD4gb3IgPHR0PmFkZEFsbDwvdHQ+IG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uIHZhbHVlcygpIHsKKyAgICAgICAgQ29sbGVjdGlvbiB2cyA9IHZhbHVlczsKKyAgICAgICAgcmV0dXJuICh2cyAhPSBudWxsID8gdnMgOiAodmFsdWVzID0gbmV3IFZhbHVlcygpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBWYWx1ZXMgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24geworCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaEl0ZXJhdG9yKFZBTFVFUywgdGFibGUubGVuZ3RoIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnNWYWx1ZShvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXAudGhpcy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiBFYWNoCisgICAgICogZWxlbWVudCBpbiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbiBpcyBhIDx0dD5NYXAuRW50cnk8L3R0Pi4gVGhlCisgICAgICogY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4KKyAgICAgKiB0aGUgY29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuIFRoZSBjb2xsZWN0aW9uIHN1cHBvcnRzIGVsZW1lbnQKKyAgICAgKiByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGUgbWFwLCB2aWEgdGhlCisgICAgICogPHR0Pkl0ZXJhdG9yLnJlbW92ZTwvdHQ+LCA8dHQ+Q29sbGVjdGlvbi5yZW1vdmU8L3R0PiwKKyAgICAgKiA8dHQ+cmVtb3ZlQWxsPC90dD4sIDx0dD5yZXRhaW5BbGw8L3R0PiwgYW5kIDx0dD5jbGVhcjwvdHQ+IG9wZXJhdGlvbnMuCisgICAgICogSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPHR0PmFkZDwvdHQ+IG9yIDx0dD5hZGRBbGw8L3R0PiBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqIEBzZWUgTWFwLkVudHJ5CisgICAgICovCisgICAgcHVibGljIGZpbmFsIFNldCBlbnRyeVNldCgpIHsKKyAgICAgICAgU2V0IGVzID0gZW50cnlTZXQ7CisgICAgICAgIHJldHVybiAoZXMgIT0gbnVsbCA/IGVzIDogKGVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEVudHJ5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQgeworCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaEl0ZXJhdG9yKEVOVFJJRVMsIHRhYmxlLmxlbmd0aCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87CisgICAgICAgICAgICBFbnRyeSBjYW5kaWRhdGUgPSBnZXRFbnRyeShlLmdldEtleSgpKTsKKyAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT0gbnVsbCAmJiBjYW5kaWRhdGUuZXF1YWxzKGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gcmVtb3ZlTWFwcGluZyhvKSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwLnRoaXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSA8dHQ+Q29uY3VycmVudEhhc2hNYXA8L3R0PiBpbnN0YW5jZSB0byBhIHN0cmVhbQorICAgICAqIChpLmUuLCBzZXJpYWxpemUgaXQpLgorICAgICAqCisgICAgICogQHNlcmlhbERhdGEgVGhlIDxpPmNhcGFjaXR5PC9pPiBvZiB0aGUgQ29uY3VycmVudEhhc2hNYXAodGhlIGxlbmd0aCBvZgorICAgICAqIHRoZSBidWNrZXQgYXJyYXkpIGlzIGVtaXR0ZWQoaW50KSwgZm9sbG93ZWQgYnkgdGhlIDxpPnNpemU8L2k+IG9mIHRoZQorICAgICAqIENvbmN1cnJlbnRIYXNoTWFwKHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzKSwgZm9sbG93ZWQgYnkgdGhlIGtleQorICAgICAqIChPYmplY3QpIGFuZCB2YWx1ZShPYmplY3QpIGZvciBlYWNoIGtleS12YWx1ZSBtYXBwaW5nIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgICAqIENvbmN1cnJlbnRIYXNoTWFwIFRoZSBrZXktdmFsdWUgbWFwcGluZ3MgYXJlIGVtaXR0ZWQgaW4gdGhlIG9yZGVyIHRoYXQKKyAgICAgKiB0aGV5IGFyZSByZXR1cm5lZCBieSA8dHQ+ZW50cnlTZXQoKS5pdGVyYXRvcigpPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKKyAgICAgICAgcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKworICAgICAgICAvLyBXcml0ZSBvdXQgbnVtYmVyIG9mIGJ1Y2tldHMKKyAgICAgICAgcy53cml0ZUludCh0YWJsZS5sZW5ndGgpOworCisgICAgICAgIC8vIFdyaXRlIG91dCBzaXplKG51bWJlciBvZiBNYXBwaW5ncykKKyAgICAgICAgcy53cml0ZUludChzaXplKTsKKyAgICAgICAgcy53cml0ZUludChtYXhTaXplKTsKKworICAgICAgICAvLyBXcml0ZSBvdXQga2V5cyBhbmQgdmFsdWVzKGFsdGVybmF0aW5nKQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIHMud3JpdGVPYmplY3QoZS5nZXRLZXkoKSk7CisgICAgICAgICAgICBzLndyaXRlT2JqZWN0KGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQ1MjcwNjU1NjcyNDEyNTc3OEw7CisKKyAgICAvKioKKyAgICAgKiBSZWNvbnN0aXR1dGUgdGhlIDx0dD5Db25jdXJyZW50SGFzaE1hcDwvdHQ+IGluc3RhbmNlIGZyb20gYSBzdHJlYW0oaS5lLiwKKyAgICAgKiBkZXNlcmlhbGl6ZSBpdCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgdGhyZXNob2xkLCBsb2FkZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgorICAgICAgICBzLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisKKyAgICAgICAgLy8gUmVhZCBpbiBudW1iZXIgb2YgYnVja2V0cyBhbmQgYWxsb2NhdGUgdGhlIGJ1Y2tldCBhcnJheTsKKyAgICAgICAgaW50IG51bUJ1Y2tldHMgPSBzLnJlYWRJbnQoKTsKKyAgICAgICAgdGFibGUgPSBuZXcgRW50cnlbbnVtQnVja2V0c107CisKKyAgICAgICAgLy8gUmVhZCBpbiBzaXplKG51bWJlciBvZiBNYXBwaW5ncykKKyAgICAgICAgaW50IHNpemUgPSBzLnJlYWRJbnQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIHJlYWQgdGhlIG1heCBzaXplCisgICAgICAgIG1heFNpemUgPSBzLnJlYWRJbnQoKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBrZXlzIGFuZCB2YWx1ZXMsIGFuZCBwdXQgdGhlIG1hcHBpbmdzIGluIHRoZQorICAgICAgICAvLyBDb25jdXJyZW50SGFzaE1hcAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IGtleSA9IHMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBwdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hTZXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjBlYTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hTZXQuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5NYXBCYWNrZWRTZXQ7CisKKy8qKgorICogQSBjb25jdXJyZW50IHNldC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudEhhc2hTZXQgaW1wbGVtZW50cyBTZXQsIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRFVNTVlfVkFMID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgX3NldDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHNldCB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY3VycmVudEhhc2hTZXQoKSB7CisgICAgICAgIF9zZXQgPSBNYXBCYWNrZWRTZXQuZGVjb3JhdGUobmV3IENvbmN1cnJlbnRIYXNoTWFwKCksIERVTU1ZX1ZBTCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIF9zZXQuYWRkKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICByZXR1cm4gX3NldC5hZGRBbGwoY29sbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9zZXQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBfc2V0LmNvbnRhaW5zKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsKSB7CisgICAgICAgIHJldHVybiBfc2V0LmNvbnRhaW5zQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBfc2V0LmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBfc2V0Lml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIF9zZXQucmVtb3ZlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICByZXR1cm4gX3NldC5yZW1vdmVBbGwoY29sbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICByZXR1cm4gX3NldC5yZXRhaW5BbGwoY29sbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gX3NldC5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBfc2V0LnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnIpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQudG9BcnJheShhcnIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBfc2V0Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb25jdXJyZW50SGFzaFNldCkKKyAgICAgICAgICAgIG9iaiA9ICgoQ29uY3VycmVudEhhc2hTZXQpIG9iaikuX3NldDsKKyAgICAgICAgcmV0dXJuIF9zZXQuZXF1YWxzKG9iaik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDAzNTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlLmphdmEKQEAgLTAsMCArMSw1MDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogQW4gdW5ib3VuZGVkIHRocmVhZC1zYWZlIHtAbGlua3BsYWluIFF1ZXVlIHF1ZXVlfSBiYXNlZCBvbiBsaW5rZWQgbm9kZXMuCisgKiBUaGlzIHF1ZXVlIG9yZGVycyBlbGVtZW50cyBGSUZPKGZpcnN0LWluLWZpcnN0LW91dCkuCisgKiBUaGUgPGVtPmhlYWQ8L2VtPiBvZiB0aGUgcXVldWUgaXMgdGhhdCBlbGVtZW50IHRoYXQgaGFzIGJlZW4gb24gdGhlCisgKiBxdWV1ZSB0aGUgbG9uZ2VzdCB0aW1lLgorICogVGhlIDxlbT50YWlsPC9lbT4gb2YgdGhlIHF1ZXVlIGlzIHRoYXQgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG9uIHRoZQorICogcXVldWUgdGhlIHNob3J0ZXN0IHRpbWUuIE5ldyBlbGVtZW50cworICogYXJlIGluc2VydGVkIGF0IHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSwgYW5kIHRoZSBxdWV1ZSByZXRyaWV2YWwKKyAqIG9wZXJhdGlvbnMgb2J0YWluIGVsZW1lbnRzIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAqIEEgPHR0PkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTwvdHQ+IGlzIGFuIGFwcHJvcHJpYXRlIGNob2ljZSB3aGVuCisgKiBtYW55IHRocmVhZHMgd2lsbCBzaGFyZSBhY2Nlc3MgdG8gYSBjb21tb24gY29sbGVjdGlvbi4KKyAqIFRoaXMgcXVldWUgZG9lcyBub3QgcGVybWl0IDx0dD5udWxsPC90dD4gZWxlbWVudHMuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGVtcGxveXMgYW4gZWZmaWNpZW50ICZxdW90O3dhaXQtZnJlZSZxdW90OworICogYWxnb3JpdGhtIGJhc2VkIG9uIG9uZSBkZXNjcmliZWQgaW4gPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuY3Mucm9jaGVzdGVyLmVkdS91L21pY2hhZWwvUE9EQzk2Lmh0bWwiPiBTaW1wbGUsCisgKiBGYXN0LCBhbmQgUHJhY3RpY2FsIE5vbi1CbG9ja2luZyBhbmQgQmxvY2tpbmcgQ29uY3VycmVudCBRdWV1ZQorICogQWxnb3JpdGhtczwvYT4gYnkgTWFnZWQgTS4gTWljaGFlbCBhbmQgTWljaGFlbCBMLiBTY290dC4KKyAqIEJld2FyZSB0aGF0LCB1bmxpa2UgaW4gbW9zdCBjb2xsZWN0aW9ucywgdGhlIDx0dD5zaXplPC90dD4gbWV0aG9kCisgKiBpcyA8ZW0+Tk9UPC9lbT4gYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4gQmVjYXVzZSBvZiB0aGUKKyAqIGFzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhlc2UgcXVldWVzLCBkZXRlcm1pbmluZyB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIGVsZW1lbnRzIHJlcXVpcmVzIGEgdHJhdmVyc2FsIG9mIHRoZSBlbGVtZW50cy4KKyAqIFRoaXMgY2xhc3MgYW5kIGl0cyBpdGVyYXRvciBpbXBsZW1lbnQgYWxsIG9mIHRoZQorICogPGVtPm9wdGlvbmFsPC9lbT4gbWV0aG9kcyBvZiB0aGUge0BsaW5rIENvbGxlY3Rpb259IGFuZCB7QGxpbmsKKyAqIEl0ZXJhdG9yfSBpbnRlcmZhY2VzLiBNZW1vcnkgY29uc2lzdGVuY3kgZWZmZWN0czogQXMgd2l0aCBvdGhlciBjb25jdXJyZW50CisgKiBjb2xsZWN0aW9ucywgYWN0aW9ucyBpbiBhIHRocmVhZCBwcmlvciB0byBwbGFjaW5nIGFuIG9iamVjdCBpbnRvIGEKKyAqIHtAY29kZSBDb25jdXJyZW50TGlua2VkUXVldWV9CisgKiA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCNNZW1vcnlWaXNpYmlsaXR5Ij48aT5oYXBwZW4tYmVmb3JlPC9pPjwvYT4KKyAqIGFjdGlvbnMgc3Vic2VxdWVudCB0byB0aGUgYWNjZXNzIG9yIHJlbW92YWwgb2YgdGhhdCBlbGVtZW50IGZyb20KKyAqIHRoZSB7QGNvZGUgQ29uY3VycmVudExpbmtlZFF1ZXVlfSBpbiBhbm90aGVyIHRocmVhZC4KKyAqIFRoaXMgY2xhc3MgaXMgYSBtZW1iZXIgb2YgdGhlCisgKiA8YSBocmVmPSJ7QGRvY1Jvb3R9Ly4uL2d1aWRlL2NvbGxlY3Rpb25zL2luZGV4Lmh0bWwiPgorICogSmF2YSBDb2xsZWN0aW9ucyBGcmFtZXdvcms8L2E+LgorICoKKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGNsYXNzIENvbmN1cnJlbnRMaW5rZWRRdWV1ZSBleHRlbmRzIEFic3RyYWN0UXVldWUKKyAgICBpbXBsZW1lbnRzIFF1ZXVlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOTY3NDU2OTMyNjc1MjE2NzZMOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgaGVhZExvY2sgPSBuZXcgU2VyaWFsaXphYmxlTG9jaygpOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHRhaWxMb2NrID0gbmV3IFNlcmlhbGl6YWJsZUxvY2soKTsKKworICAgIC8qCisgICAgICogVGhpcyBpcyBhIHN0cmFpZ2h0IGFkYXB0YXRpb24gb2YgTWljaGFlbCAmIFNjb3R0IGFsZ29yaXRobS4KKyAgICAgKiBGb3IgZXhwbGFuYXRpb24sIHJlYWQgdGhlIHBhcGVyLiBUaGUgb25seShtaW5vcikgYWxnb3JpdGhtaWMKKyAgICAgKiBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyB2ZXJzaW9uIHN1cHBvcnRzIGxhenkgZGVsZXRpb24gb2YKKyAgICAgKiBpbnRlcm5hbCBub2RlcyhtZXRob2QgcmVtb3ZlKE9iamVjdCkpIC0tIHJlbW92ZSBDQVMnZXMgaXRlbQorICAgICAqIGZpZWxkcyB0byBudWxsLiBUaGUgbm9ybWFsIHF1ZXVlIG9wZXJhdGlvbnMgdW5saW5rIGJ1dCB0aGVuCisgICAgICogcGFzcyBvdmVyIG5vZGVzIHdpdGggbnVsbCBpdGVtIGZpZWxkcy4gU2ltaWxhcmx5LCBpdGVyYXRpb24KKyAgICAgKiBtZXRob2RzIGlnbm9yZSB0aG9zZSB3aXRoIG51bGxzLgorICAgICAqIEFsc28gbm90ZSB0aGF0IGxpa2UgbW9zdCBub24tYmxvY2tpbmcgYWxnb3JpdGhtcyBpbiB0aGlzCisgICAgICogcGFja2FnZSwgdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBpbiBnYXJiYWdlCisgICAgICogY29sbGVjdGVkIHN5c3RlbXMsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIEFCQSBwcm9ibGVtcyBkdWUKKyAgICAgKiB0byByZWN5Y2xlZCBub2Rlcywgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgImNvdW50ZWQKKyAgICAgKiBwb2ludGVycyIgb3IgcmVsYXRlZCB0ZWNobmlxdWVzIHNlZW4gaW4gdmVyc2lvbnMgdXNlZCBpbgorICAgICAqIG5vbi1HQydlZCBzZXR0aW5ncy4KKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgT2JqZWN0IGl0ZW07CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgTm9kZSBuZXh0OworCisgICAgICAgIE5vZGUoT2JqZWN0IHgpIHsKKyAgICAgICAgICAgIGl0ZW0gPSB4OworICAgICAgICB9CisKKyAgICAgICAgTm9kZShPYmplY3QgeCwgTm9kZSBuKSB7CisgICAgICAgICAgICBpdGVtID0geDsKKyAgICAgICAgICAgIG5leHQgPSBuOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IGdldEl0ZW0oKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCBib29sZWFuIGNhc0l0ZW0oT2JqZWN0IGNtcCwgT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gY21wKSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IHZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIHZvaWQgc2V0SXRlbShPYmplY3QgdmFsKSB7CisgICAgICAgICAgICBpdGVtID0gdmFsOworICAgICAgICB9CisKKyAgICAgICAgTm9kZSBnZXROZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjYXNOZXh0KE5vZGUgY21wLCBOb2RlIHZhbCkgeworICAgICAgICAgICAgaWYgKG5leHQgPT0gY21wKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IHZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIHZvaWQgc2V0TmV4dChOb2RlIHZhbCkgeworICAgICAgICAgICAgbmV4dCA9IHZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNUYWlsKE5vZGUgY21wLCBOb2RlIHZhbCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRhaWxMb2NrKSB7CisgICAgICAgICAgICBpZiAodGFpbCA9PSBjbXApIHsKKyAgICAgICAgICAgICAgICB0YWlsID0gdmFsOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzSGVhZChOb2RlIGNtcCwgTm9kZSB2YWwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChoZWFkTG9jaykgeworICAgICAgICAgICAgaWYgKGhlYWQgPT0gY21wKSB7CisgICAgICAgICAgICAgICAgaGVhZCA9IHZhbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9pbnRlciB0byBoZWFkZXIgbm9kZSwgaW5pdGlhbGl6ZWQgdG8gYSBkdW1teSBub2RlLiBUaGUgZmlyc3QKKyAgICAgKiBhY3R1YWwgbm9kZSBpcyBhdCBoZWFkLmdldE5leHQoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCB2b2xhdGlsZSBOb2RlIGhlYWQgPSBuZXcgTm9kZShudWxsLCBudWxsKTsKKworICAgIC8qKgorICAgICAqIFBvaW50ZXIgdG8gbGFzdCBub2RlIG9uIGxpc3QgKgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIE5vZGUgdGFpbCA9IGhlYWQ7CisKKyAgICAvKiAqCisgICAgICogQ3JlYXRlcyBhIDx0dD5Db25jdXJyZW50TGlua2VkUXVldWU8L3R0PiB0aGF0IGlzIGluaXRpYWxseSBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY3VycmVudExpbmtlZFF1ZXVlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8dHQ+Q29uY3VycmVudExpbmtlZFF1ZXVlPC90dD4KKyAgICAgKiBpbml0aWFsbHkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24sCisgICAgICogYWRkZWQgaW4gdHJhdmVyc2FsIG9yZGVyIG9mIHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY29udGFpbgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9yIGFueQorICAgICAqIG9mIGl0cyBlbGVtZW50cyBhcmUgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBDb25jdXJyZW50TGlua2VkUXVldWUoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCisgICAgICAgICAgICBhZGQoaXQubmV4dCgpKTsKKyAgICB9CisKKyAgICAvLyBIYXZlIHRvIG92ZXJyaWRlIGp1c3QgdG8gdXBkYXRlIHRoZSBqYXZhZG9jCisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhdCB0aGUgdGFpbCBvZiB0aGlzIHF1ZXVlLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IChhcyBzcGVjaWZpZWQgYnkge0BsaW5rIENvbGxlY3Rpb24jYWRkfSkKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBlKSB7CisgICAgICAgIHJldHVybiBvZmZlcihlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhdCB0aGUgdGFpbCBvZiB0aGlzIHF1ZXVlLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IChhcyBzcGVjaWZpZWQgYnkge0BsaW5rIFF1ZXVlI29mZmVyfSkKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoT2JqZWN0IGUpIHsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIE5vZGUgbiA9IG5ldyBOb2RlKGUsIG51bGwpOworICAgICAgICBmb3IgKDsgOykgeworICAgICAgICAgICAgTm9kZSB0ID0gdGFpbDsKKyAgICAgICAgICAgIE5vZGUgcyA9IHQuZ2V0TmV4dCgpOworICAgICAgICAgICAgaWYgKHQgPT0gdGFpbCkgeworICAgICAgICAgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuY2FzTmV4dChzLCBuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzVGFpbCh0LCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzVGFpbCh0LCBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHBvbGwoKSB7CisgICAgICAgIGZvciAoOyA7KSB7CisgICAgICAgICAgICBOb2RlIGggPSBoZWFkOworICAgICAgICAgICAgTm9kZSB0ID0gdGFpbDsKKyAgICAgICAgICAgIE5vZGUgZmlyc3QgPSBoLmdldE5leHQoKTsKKyAgICAgICAgICAgIGlmIChoID09IGhlYWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaCA9PSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc1RhaWwodCwgZmlyc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FzSGVhZChoLCBmaXJzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBmaXJzdC5nZXRJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LnNldEl0ZW0obnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHNraXAgb3ZlciBkZWxldGVkIGl0ZW0sIGNvbnRpbnVlIGxvb3AsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBwZWVrKCkgeyAvLyBzYW1lIGFzIHBvbGwgZXhjZXB0IGRvbid0IHJlbW92ZSBpdGVtCisgICAgICAgIGZvciAoOyA7KSB7CisgICAgICAgICAgICBOb2RlIGggPSBoZWFkOworICAgICAgICAgICAgTm9kZSB0ID0gdGFpbDsKKyAgICAgICAgICAgIE5vZGUgZmlyc3QgPSBoLmdldE5leHQoKTsKKyAgICAgICAgICAgIGlmIChoID09IGhlYWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaCA9PSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc1RhaWwodCwgZmlyc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gZmlyc3QuZ2V0SXRlbSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gcmVtb3ZlIGRlbGV0ZWQgbm9kZSBhbmQgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc0hlYWQoaCwgZmlyc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGFjdHVhbChub24taGVhZGVyKSBub2RlIG9uIGxpc3QuIFRoaXMgaXMgeWV0CisgICAgICogYW5vdGhlciB2YXJpYW50IG9mIHBvbGwvcGVlazsgaGVyZSByZXR1cm5pbmcgb3V0IHRoZSBmaXJzdAorICAgICAqIG5vZGUsIG5vdCBlbGVtZW50KHNvIHdlIGNhbm5vdCBjb2xsYXBzZSB3aXRoIHBlZWsoKSB3aXRob3V0CisgICAgICogaW50cm9kdWNpbmcgcmFjZS4pCisgICAgICovCisgICAgTm9kZSBmaXJzdCgpIHsKKyAgICAgICAgZm9yICg7IDspIHsKKyAgICAgICAgICAgIE5vZGUgaCA9IGhlYWQ7CisgICAgICAgICAgICBOb2RlIHQgPSB0YWlsOworICAgICAgICAgICAgTm9kZSBmaXJzdCA9IGguZ2V0TmV4dCgpOworICAgICAgICAgICAgaWYgKGggPT0gaGVhZCkgeworICAgICAgICAgICAgICAgIGlmIChoID09IHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzVGFpbCh0LCBmaXJzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0LmdldEl0ZW0oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0OworICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIHJlbW92ZSBkZWxldGVkIG5vZGUgYW5kIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNIZWFkKGgsIGZpcnN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyBxdWV1ZSBjb250YWlucyBubyBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIG5vIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0KCkgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBxdWV1ZS4gSWYgdGhpcyBxdWV1ZQorICAgICAqIGNvbnRhaW5zIG1vcmUgdGhhbiA8dHQ+SW50ZWdlci5NQVhfVkFMVUU8L3R0PiBlbGVtZW50cywgcmV0dXJucworICAgICAqIDx0dD5JbnRlZ2VyLk1BWF9WQUxVRTwvdHQ+LgorICAgICAqIEJld2FyZSB0aGF0LCB1bmxpa2UgaW4gbW9zdCBjb2xsZWN0aW9ucywgdGhpcyBtZXRob2QgaXMKKyAgICAgKiA8ZW0+Tk9UPC9lbT4gYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4gQmVjYXVzZSBvZiB0aGUKKyAgICAgKiBhc3luY2hyb25vdXMgbmF0dXJlIG9mIHRoZXNlIHF1ZXVlcywgZGV0ZXJtaW5pbmcgdGhlIGN1cnJlbnQKKyAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWlyZXMgYW4gTyhuKSB0cmF2ZXJzYWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBxdWV1ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChOb2RlIHAgPSBmaXJzdCgpOyBwICE9IG51bGw7IHAgPSBwLmdldE5leHQoKSkgeworICAgICAgICAgICAgaWYgKHAuZ2V0SXRlbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDb2xsZWN0aW9ucy5zaXplKCkgc3BlYyBzYXlzIHRvIG1heCBvdXQKKyAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYgdGhpcyBxdWV1ZSBjb250YWlucworICAgICAqIGF0IGxlYXN0IG9uZSBlbGVtZW50IDx0dD5lPC90dD4gc3VjaCB0aGF0IDx0dD5vLmVxdWFscyhlKTwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIG8gb2JqZWN0IHRvIGJlIGNoZWNrZWQgZm9yIGNvbnRhaW5tZW50IGluIHRoaXMgcXVldWUKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBxdWV1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoTm9kZSBwID0gZmlyc3QoKTsgcCAhPSBudWxsOyBwID0gcC5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gcC5nZXRJdGVtKCk7CisgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIG8uZXF1YWxzKGl0ZW0pKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoaXMgcXVldWUsCisgICAgICogaWYgaXQgaXMgcHJlc2VudC4gTW9yZSBmb3JtYWxseSwgcmVtb3ZlcyBhbiBlbGVtZW50IDx0dD5lPC90dD4gc3VjaAorICAgICAqIHRoYXQgPHR0Pm8uZXF1YWxzKGUpPC90dD4sIGlmIHRoaXMgcXVldWUgY29udGFpbnMgb25lIG9yIG1vcmUgc3VjaAorICAgICAqIGVsZW1lbnRzLgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKiAob3IgZXF1aXZhbGVudGx5LCBpZiB0aGlzIHF1ZXVlIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwpLgorICAgICAqCisgICAgICogQHBhcmFtIG8gZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBxdWV1ZSwgaWYgcHJlc2VudAorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIHF1ZXVlIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKE5vZGUgcCA9IGZpcnN0KCk7IHAgIT0gbnVsbDsgcCA9IHAuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3QgaXRlbSA9IHAuZ2V0SXRlbSgpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBvLmVxdWFscyhpdGVtKSAmJiBwLmNhc0l0ZW0oaXRlbSwgbnVsbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhpcyBxdWV1ZSBpbiBwcm9wZXIgc2VxdWVuY2UuCisgICAgICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIGlzIGEgIndlYWtseSBjb25zaXN0ZW50IiBpdGVyYXRvciB0aGF0CisgICAgICogd2lsbCBuZXZlciB0aHJvdyB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0sCisgICAgICogYW5kIGd1YXJhbnRlZXMgdG8gdHJhdmVyc2UgZWxlbWVudHMgYXMgdGhleSBleGlzdGVkIHVwb24KKyAgICAgKiBjb25zdHJ1Y3Rpb24gb2YgdGhlIGl0ZXJhdG9yLCBhbmQgbWF5KGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0bykKKyAgICAgKiByZWZsZWN0IGFueSBtb2RpZmljYXRpb25zIHN1YnNlcXVlbnQgdG8gY29uc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGlzIHF1ZXVlIGluIHByb3BlciBzZXF1ZW5jZQorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdHIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEl0ciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogTmV4dCBub2RlIHRvIHJldHVybiBpdGVtIGZvci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTm9kZSBuZXh0Tm9kZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogbmV4dEl0ZW0gaG9sZHMgb24gdG8gaXRlbSBmaWVsZHMgYmVjYXVzZSBvbmNlIHdlIGNsYWltCisgICAgICAgICAqIHRoYXQgYW4gZWxlbWVudCBleGlzdHMgaW4gaGFzTmV4dCgpLCB3ZSBtdXN0IHJldHVybiBpdCBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIG5leHQoKSBjYWxsIGV2ZW4gaWYgaXQgd2FzIGluIHRoZSBwcm9jZXNzIG9mCisgICAgICAgICAqIGJlaW5nIHJlbW92ZWQgd2hlbiBoYXNOZXh0KCkgd2FzIGNhbGxlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgT2JqZWN0IG5leHRJdGVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb2RlIG9mIHRoZSBsYXN0IHJldHVybmVkIGl0ZW0sIHRvIHN1cHBvcnQgcmVtb3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBOb2RlIGxhc3RSZXQ7CisKKyAgICAgICAgSXRyKCkgeworICAgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1vdmVzIHRvIG5leHQgdmFsaWQgbm9kZSBhbmQgcmV0dXJucyBpdGVtIHRvIHJldHVybiBmb3IKKyAgICAgICAgICogbmV4dCgpLCBvciBudWxsIGlmIG5vIHN1Y2guCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE9iamVjdCBhZHZhbmNlKCkgeworICAgICAgICAgICAgbGFzdFJldCA9IG5leHROb2RlOworICAgICAgICAgICAgT2JqZWN0IHggPSBuZXh0SXRlbTsKKworICAgICAgICAgICAgTm9kZSBwID0gKG5leHROb2RlID09IG51bGwpID8gZmlyc3QoKSA6IG5leHROb2RlLmdldE5leHQoKTsKKyAgICAgICAgICAgIGZvciAoOyA7KSB7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG5leHRJdGVtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gcC5nZXRJdGVtKCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IHA7CisgICAgICAgICAgICAgICAgICAgIG5leHRJdGVtID0gaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICAgICAgfSBlbHNlIC8vIHNraXAgb3ZlciBudWxscworICAgICAgICAgICAgICAgICAgICBwID0gcC5nZXROZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHROb2RlICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICBpZiAobmV4dE5vZGUgPT0gbnVsbCkgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICBOb2RlIGwgPSBsYXN0UmV0OworICAgICAgICAgICAgaWYgKGwgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgLy8gcmVseSBvbiBhIGZ1dHVyZSB0cmF2ZXJzYWwgdG8gcmVsaW5rLgorICAgICAgICAgICAgbC5zZXRJdGVtKG51bGwpOworICAgICAgICAgICAgbGFzdFJldCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBzdGF0ZSB0byBhIHN0cmVhbSh0aGF0IGlzLCBzZXJpYWxpemUgaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmVhbQorICAgICAqIEBzZXJpYWxEYXRhIEFsbCBvZiB0aGUgZWxlbWVudHMoZWFjaCBhbiA8dHQ+RTwvdHQ+KSBpbgorICAgICAqIHRoZSBwcm9wZXIgb3JkZXIsIGZvbGxvd2VkIGJ5IGEgbnVsbAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQorICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IGFueSBoaWRkZW4gc3R1ZmYKKyAgICAgICAgcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKworICAgICAgICAvLyBXcml0ZSBvdXQgYWxsIGVsZW1lbnRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCisgICAgICAgIGZvciAoTm9kZSBwID0gZmlyc3QoKTsgcCAhPSBudWxsOyBwID0gcC5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gcC5nZXRJdGVtKCk7CisgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHMud3JpdGVPYmplY3QoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgdHJhaWxpbmcgbnVsbCBhcyBzZW50aW5lbAorICAgICAgICBzLndyaXRlT2JqZWN0KG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29uc3RpdHV0ZSB0aGUgUXVldWUgaW5zdGFuY2UgZnJvbSBhIHN0cmVhbSh0aGF0IGlzLCBkZXNlcmlhbGl6ZSBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyZWFtCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlYWQgaW4gY2FwYWNpdHksIGFuZCBhbnkgaGlkZGVuIHN0dWZmCisgICAgICAgIHMuZGVmYXVsdFJlYWRPYmplY3QoKTsKKworICAgICAgICBoZWFkID0gbmV3IE5vZGUobnVsbCwgbnVsbCk7CisgICAgICAgIHRhaWwgPSBoZWFkOworICAgICAgICAvLyBSZWFkIGluIGFsbCBlbGVtZW50cyBhbmQgcGxhY2UgaW4gcXVldWUKKyAgICAgICAgZm9yICg7IDspIHsKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9mZmVyKGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsaXphYmxlTG9jayBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudE1hcC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGY2NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRNYXAuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBoaWdobHkgY29uY3VycmVudCBtYXAuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBDb25jdXJyZW50TWFwIGV4dGVuZHMgTWFwIHsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBhcmJpdHJhcnkobm90IHN0cmljdGx5IHJhbmRvbSkgZW50cnkgZnJvbSB0aGUgbWFwLiBUaGlzCisgICAgICogYWxsb3dzIGltcGxlbWVudGF0aW9uIG9mIGNvbmN1cnJlbnQgY2FjaGVzIHdpdGggc2l6ZSBjZWlsaW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgZW50cnksIG9yIG51bGwgaWYgbWFwIGlzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIE1hcC5FbnRyeSByZW1vdmVSYW5kb20oKTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdGUgb3ZlciBtYXAgZW50cmllcywgYmVnaW5uaW5nIGF0IGFuIGFyYml0cmFyeQorICAgICAqIChub3Qgc3RyaWN0bHkgcmFuZG9tKSBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgcmFuZG9tRW50cnlJdGVyYXRvcigpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJlYTNkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLmphdmEKQEAgLTAsMCArMSwxMDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuUmVmZXJlbmNlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5TaXplZE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBIYXNoTWFwIHdoaWNoIGhhcyBsaW1pdGVkIHN5bmNocm9uaXphdGlvbgorICogYW5kIHJlZmVyZW5jZSBrZXlzIG9yIHZhbHVlcyhidXQgbm90IGJvdGgpLiBJbiBwYXJ0aWN1bGFyIG11dGF0b3JzIGFyZQorICogZ2VuZXJhbGx5IHN5bmNocm9uaXplZCB3aGlsZSBhY2Nlc3NvcnMgYXJlIGdlbmVyYWxseSBub3QuIEFkZGl0aW9uYWxseSB0aGUKKyAqIEl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIGNsYXNzIGFyZSBub3QgImZhaWwtZmFzdCIsIGJ1dCBpbnN0ZWFkIHRyeSB0bworICogY29udGludWUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBkYXRhIHN0cnVjdHVyZSBhZnRlciBjaGFuZ2VzIGhhdmUgYmVlbgorICogbWFkZS4gRmluYWxseSBwdXJnaW5nIG9mIHRoZSByZWZlcmVuY2UgcXVldWUgaXMgb25seSBkb25lIGluc2lkZSBtdXRhdG9ycy4KKyAqIE51bGwga2V5cyBhcmUgbm90IHN1cHBvcnRlZCBpZiBrZXlzIHVzZSByZWZlcmVuY2VzLiBOdWxsIHZhbHVlcyBhcmUgbm90CisgKiBzdXBwb3J0ZWQgaWYgdmFsdWVzIHVzZSByZWZlcmVuY2VzLgorICogVGhpcyBjbGFzcyBpcyBiYXNlZCBoZWF2aWx5IG9uIHRoZSBXZWFrSGFzaE1hcCBjbGFzcyBpbiB0aGUgSmF2YQorICogY29sbGVjdGlvbnMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwIGV4dGVuZHMgQWJzdHJhY3RNYXAKKyAgICBpbXBsZW1lbnRzIENvbmN1cnJlbnRNYXAsIFJlZmVyZW5jZU1hcCwgU2l6ZWRNYXAsIENsb25lYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBvZiByYW5kb20gbnVtYmVycyB1c2VkIGluICJyYW5kb20iIG1ldGhvZHMsIHNpbmNlIGdlbmVyYXRpbmcgdGhlbQorICAgICAqIGlzIGV4cGVuc2l2ZS4gV2UgaG9wZSBlYWNoIG1hcCBjaGFuZ2VzIGVub3VnaCBiZXR3ZWVuIGN5Y2xpbmcgdGhyb3VnaAorICAgICAqIHRoaXMgbGlzdCB0aGF0IHRoZSBvdmVyYWxsIGVmZmVjdCBpcyByYW5kb20gZW5vdWdoLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBkb3VibGVbXSBSQU5ET01TID0gbmV3IGRvdWJsZVsxMDAwXTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkFORE9NUy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIFJBTkRPTVNbaV0gPSByYW5kb20ubmV4dERvdWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoYXNoIHRhYmxlIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRW50cnlbXSB0YWJsZTsKKworICAgIC8qKgorICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBSZWhhc2hlcyB0aGUgdGFibGUgd2hlbiBjb3VudCBleGNlZWRzIHRoaXMgdGhyZXNob2xkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHRocmVzaG9sZDsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIEhhc2hNYXAuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBsb2FkRmFjdG9yOworCisgICAgLyoqCisgICAgICogVGhlIGtleSByZWZlcmVuY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBrZXlUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIHJlZmVyZW5jZSB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSBxdWV1ZSBmb3IgY2xlYXJlZCBFbnRyaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOworCisgICAgLyoqCisgICAgICogU3ByZWFkICJyYW5kb20iIHJlbW92ZXMgYW5kIGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByYW5kb21FbnRyeSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4U2l6ZSA9IEludGVnZXIuTUFYX1ZBTFVFOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShPYmplY3QgeCwgT2JqZWN0IHkpIHsKKyAgICAgICAgcmV0dXJuIHggPT0geSB8fCAoeCAhPSBudWxsICYmIHguZXF1YWxzKHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBIYXNoTWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsCisgICAgICogY2FwYWNpdHkgYW5kIHRoZSBzcGVjaWZpZWQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5VHlwZSB0aGUgcmVmZXJlbmNlIHR5cGUgb2YgbWFwIGtleXMKKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIHRoZSByZWZlcmVuY2UgdHlwZSBvZiBtYXAgdmFsdWVzCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgSGFzaE1hcC4KKyAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciBhIG51bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5laXRoZXIga2V5cyBub3IgdmFsdWVzIHVzZSBoYXJkCisgICAgICogcmVmZXJlbmNlcywgaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIG9yIGlmCisgICAgICogdGhlIGxvYWQgZmFjdG9yIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvCisgICAgICovCisgICAgcHVibGljIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlLAorICAgICAgICBpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisgICAgICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEluaXRpYWwgQ2FwYWNpdHk6ICIgKworICAgICAgICAgICAgICAgIGluaXRpYWxDYXBhY2l0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsb2FkRmFjdG9yID4gMSkgfHwgKGxvYWRGYWN0b3IgPD0gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgTG9hZCBmYWN0b3I6ICIgKworICAgICAgICAgICAgICAgIGxvYWRGYWN0b3IpOworICAgICAgICB9CisgICAgICAgIGlmIChrZXlUeXBlICE9IEhBUkQgJiYgdmFsdWVUeXBlICE9IEhBUkQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVpdGhlciBrZXlzIG9yIHZhbHVlcyBtdXN0ICIgKworICAgICAgICAgICAgICAgICJ1c2UgaGFyZCByZWZlcmVuY2VzLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMua2V5VHlwZSA9IGtleVR5cGU7CisgICAgICAgIHRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOworICAgICAgICB0YWJsZSA9IG5ldyBFbnRyeVtpbml0aWFsQ2FwYWNpdHldOworICAgICAgICB0aHJlc2hvbGQgPSAoaW50KSAoaW5pdGlhbENhcGFjaXR5ICogbG9hZEZhY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgSGFzaE1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eQorICAgICAqIGFuZCBkZWZhdWx0IGxvYWQgZmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGtleVR5cGUgdGhlIHJlZmVyZW5jZSB0eXBlIG9mIG1hcCBrZXlzCisgICAgICogQHBhcmFtIHZhbHVlVHlwZSB0aGUgcmVmZXJlbmNlIHR5cGUgb2YgbWFwIHZhbHVlcworICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIEhhc2hNYXAuCisgICAgICovCisgICAgcHVibGljIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlLAorICAgICAgICBpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgICAgIHRoaXMoa2V5VHlwZSwgdmFsdWVUeXBlLCBpbml0aWFsQ2FwYWNpdHksIDAuNzVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBIYXNoTWFwIHdpdGggYSBkZWZhdWx0IGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlUeXBlIHRoZSByZWZlcmVuY2UgdHlwZSBvZiBtYXAga2V5cworICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgdGhlIHJlZmVyZW5jZSB0eXBlIG9mIG1hcCB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAoaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUpIHsKKyAgICAgICAgdGhpcyhrZXlUeXBlLCB2YWx1ZVR5cGUsIDExLCAwLjc1Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBIYXNoTWFwIHdpdGggdGhlIHNhbWUgbWFwcGluZ3MgYXMgdGhlIGdpdmVuCisgICAgICogTWFwLiBUaGUgSGFzaE1hcCBpcyBjcmVhdGVkIHdpdGggYSBjYXBhY2l0eSBvZiB0aHJpY2UgdGhlIG51bWJlcgorICAgICAqIG9mIGVudHJpZXMgaW4gdGhlIGdpdmVuIE1hcCBvciAxMSAod2hpY2hldmVyIGlzIGdyZWF0ZXIpLCBhbmQgYQorICAgICAqIGRlZmF1bHQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5VHlwZSB0aGUgcmVmZXJlbmNlIHR5cGUgb2YgbWFwIGtleXMKKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIHRoZSByZWZlcmVuY2UgdHlwZSBvZiBtYXAgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlLCBNYXAgdCkgeworICAgICAgICB0aGlzKGtleVR5cGUsIHZhbHVlVHlwZSwgTWF0aC5tYXgoMyAqIHQuc2l6ZSgpLCAxMSksIDAuNzVmKTsKKyAgICAgICAgcHV0QWxsKHQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1heFNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4U2l6ZShpbnQgbWF4U2l6ZSkgeworICAgICAgICB0aGlzLm1heFNpemUgPSAobWF4U2l6ZSA8IDApID8gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhTaXplOworICAgICAgICBpZiAodGhpcy5tYXhTaXplICE9IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgcmVtb3ZlT3ZlcmZsb3codGhpcy5tYXhTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKSB7CisgICAgICAgIHJldHVybiBtYXhTaXplICE9IEludGVnZXIuTUFYX1ZBTFVFICYmIHNpemUoKSA+PSBtYXhTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG92ZXJmbG93UmVtb3ZlZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgTWFwLiBUaGlzCisgICAgICogcmVzdWx0IGlzIGEgc25hcHNob3QsIGFuZCBtYXkgbm90IHJlZmxlY3QgdW5wcm9jZXNzZWQgZW50cmllcworICAgICAqIHRoYXQgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSBuZXh0IGF0dGVtcHRlZCBhY2Nlc3MgYmVjYXVzZSB0aGV5CisgICAgICogYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIE1hcCBjb250YWlucyBubyBrZXktdmFsdWUgbWFwcGluZ3MuIFRoaXMKKyAgICAgKiByZXN1bHQgaXMgYSBzbmFwc2hvdCwgYW5kIG1heSBub3QgcmVmbGVjdCB1bnByb2Nlc3NlZCBlbnRyaWVzCisgICAgICogdGhhdCB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIG5leHQgYXR0ZW1wdGVkIGFjY2VzcyBiZWNhdXNlIHRoZXkKKyAgICAgKiBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSGFzaE1hcCBtYXBzIG9uZSBvciBtb3JlIGtleXMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIHByZXNlbmNlIGluIHRoaXMgTWFwIGlzIHRvIGJlIHRlc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOworCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmFsdWVUeXBlICE9IEhBUkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IGktLSA+IDA7KQorICAgICAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpXTsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldFZhbHVlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IGktLSA+IDA7KQorICAgICAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpXTsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGlmIChlcSh2YWx1ZSwgZS5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBIYXNoTWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IGtleSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIE1hcCBpcyB0byBiZSB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwgJiYga2V5VHlwZSAhPSBIQVJEKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7CisgICAgICAgIGludCBoYXNoID0gKGtleSA9PSBudWxsKSA/IDAgOiBrZXkuaGFzaENvZGUoKTsKKyAgICAgICAgaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7CisgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKQorICAgICAgICAgICAgaWYgKGUuZ2V0SGFzaCgpID09IGhhc2ggJiYgZXEoa2V5LCBlLmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgSGFzaE1hcCBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgSGFzaE1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkga2V5IHdob3NlIGFzc29jaWF0ZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwgJiYga2V5VHlwZSAhPSBIQVJEKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgRW50cnlbXSB0YWIgPSB0YWJsZTsKKyAgICAgICAgaW50IGhhc2ggPSAoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpOworICAgICAgICBpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKKyAgICAgICAgZm9yIChFbnRyeSBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpCisgICAgICAgICAgICBpZiAoKGUuZ2V0SGFzaCgpID09IGhhc2gpICYmIGVxKGtleSwgZS5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0VmFsdWUoKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWhhc2hlcyB0aGUgY29udGVudHMgb2YgdGhlIEhhc2hNYXAgaW50byBhIEhhc2hNYXAgd2l0aCBhCisgICAgICogbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZQorICAgICAqIG51bWJlciBvZiBrZXlzIGluIHRoZSBIYXNoTWFwIGV4Y2VlZHMgdGhpcyBIYXNoTWFwJ3MgY2FwYWNpdHkKKyAgICAgKiBhbmQgbG9hZCBmYWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKKyAgICAgICAgaW50IG9sZENhcGFjaXR5ID0gdGFibGUubGVuZ3RoOworICAgICAgICBFbnRyeSBvbGRNYXBbXSA9IHRhYmxlOworCisgICAgICAgIGludCBuZXdDYXBhY2l0eSA9IG9sZENhcGFjaXR5ICogMiArIDE7CisgICAgICAgIEVudHJ5IG5ld01hcFtdID0gbmV3IEVudHJ5W25ld0NhcGFjaXR5XTsKKworICAgICAgICBmb3IgKGludCBpID0gb2xkQ2FwYWNpdHk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBmb3IgKEVudHJ5IG9sZCA9IG9sZE1hcFtpXTsgb2xkICE9IG51bGw7KSB7CisgICAgICAgICAgICAgICAgaWYgKChrZXlUeXBlICE9IEhBUkQgJiYgb2xkLmdldEtleSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IHZhbHVlVHlwZSAhPSBIQVJEICYmIG9sZC5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRW50cnkgZSA9IG9sZDsKKyAgICAgICAgICAgICAgICAgICAgb2xkID0gb2xkLmdldE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZS5zZXROZXh0KG51bGwpOworICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEVudHJ5IGUgPSAoRW50cnkpIG9sZC5jbG9uZShxdWV1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9sZCA9IG9sZC5nZXROZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gKGUuZ2V0SGFzaCgpICYgMHg3RkZGRkZGRikgJSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgICAgICAgICAgZS5zZXROZXh0KG5ld01hcFtpbmRleF0pOworICAgICAgICAgICAgICAgICAgICBuZXdNYXBbaW5kZXhdID0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKKyAgICAgICAgdGFibGUgPSBuZXdNYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyBIYXNoTWFwLgorICAgICAqIElmIHRoZSBIYXNoTWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQKKyAgICAgKiB2YWx1ZSBpcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkga2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgbnVsbCBpZiB0aGVyZQorICAgICAqIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuIEEgbnVsbCByZXR1cm4gY2FuIGFsc28gaW5kaWNhdGUgdGhhdAorICAgICAqIHRoZSBIYXNoTWFwIHByZXZpb3VzbHkgYXNzb2NpYXRlZCBudWxsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICgoa2V5ID09IG51bGwgJiYga2V5VHlwZSAhPSBIQVJEKQorICAgICAgICAgICAgfHwgKHZhbHVlID09IG51bGwgJiYgdmFsdWVUeXBlICE9IEhBUkQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCByZWZlcmVuY2VzIG5vdCBzdXBwb3J0ZWQiKTsKKworICAgICAgICBpbnQgaGFzaCA9IChrZXkgPT0gbnVsbCkgPyAwIDoga2V5Lmhhc2hDb2RlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZXhwdW5nZVN0YWxlRW50cmllcygpOworCisgICAgICAgICAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLAorICAgICAgICAgICAgICAgIGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmICgoZS5nZXRIYXNoKCkgPT0gaGFzaCkgJiYgZXEoa2V5LCBlLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVUeXBlID09IEhBUkQpCisgICAgICAgICAgICAgICAgICAgICAgICBlLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlID0gbmV3RW50cnkoaGFzaCwgZS5nZXRLZXkoKSwgdmFsdWUsIGUuZ2V0TmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiW2luZGV4XSA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5zZXROZXh0KGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY291bnQgPj0gdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgLy8gUmVoYXNoIHRoZSB0YWJsZSBpZiB0aGUgdGhyZXNob2xkIGlzIGV4Y2VlZGVkCisgICAgICAgICAgICAgICAgcmVoYXNoKCk7CisKKyAgICAgICAgICAgICAgICB0YWIgPSB0YWJsZTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWF4U2l6ZSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICByZW1vdmVPdmVyZmxvdyhtYXhTaXplIC0gMSk7CisgICAgICAgICAgICB0YWJbaW5kZXhdID0gbmV3RW50cnkoaGFzaCwga2V5LCB2YWx1ZSwgdGFiW2luZGV4XSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBFbnRyeSBuZXdFbnRyeShpbnQgaGFzaCwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlLCBFbnRyeSBuZXh0KSB7CisgICAgICAgIGludCByZWZUeXBlID0gKGtleVR5cGUgIT0gSEFSRCkgPyBrZXlUeXBlIDogdmFsdWVUeXBlOworICAgICAgICBzd2l0Y2ggKHJlZlR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgV0VBSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlYWtFbnRyeShoYXNoLCBrZXksIHZhbHVlLCByZWZUeXBlID09IGtleVR5cGUsIG5leHQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlKTsKKyAgICAgICAgICAgIGNhc2UgU09GVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNvZnRFbnRyeShoYXNoLCBrZXksIHZhbHVlLCByZWZUeXBlID09IGtleVR5cGUsIG5leHQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXJkRW50cnkoaGFzaCwga2V5LCB2YWx1ZSwgbmV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGVudHJpZXMgZXF1YWwgdG8gb3Igb3ZlciB0aGUgbWF4IHNpemUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU92ZXJmbG93KGludCBtYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChjb3VudCA+IG1heFNpemUpIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IHJlbW92ZVJhbmRvbSgpOworICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBvdmVyZmxvd1JlbW92ZWQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyBrZXkgZnJvbSB0aGlzIEhhc2hNYXAgaWYgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBNYXAuCisgICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgbnVsbCBpZiB0aGVyZQorICAgICAqIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuIEEgbnVsbCByZXR1cm4gY2FuIGFsc28gaW5kaWNhdGUgdGhhdAorICAgICAqIHRoZSBIYXNoTWFwIHByZXZpb3VzbHkgYXNzb2NpYXRlZCBudWxsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwgJiYga2V5VHlwZSAhPSBIQVJEKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaW50IGhhc2ggPSAoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGV4cHVuZ2VTdGFsZUVudHJpZXMoKTsKKworICAgICAgICAgICAgRW50cnlbXSB0YWIgPSB0YWJsZTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKEVudHJ5IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOworICAgICAgICAgICAgICAgIHByZXYgPSBlLCBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGUuZ2V0SGFzaCgpID09IGhhc2gpICYmIGVxKGtleSwgZS5nZXRLZXkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuc2V0TmV4dChlLmdldE5leHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgcHV0IHRoZSBidWNrZXQgYWZ0ZXIgdXMKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGFiW2luZGV4XSA9IGUuZ2V0TmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZXhwdW5nZVN0YWxlRW50cmllcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RXhwaXJlZChPYmplY3QgdmFsdWUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUV4cGlyZWQoT2JqZWN0IGtleSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcmJpdHJhcnkgZW50cnkgaW5kZXguCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tRW50cnlJbmRleCgpIHsKKyAgICAgICAgaWYgKHJhbmRvbUVudHJ5ID09IFJBTkRPTVMubGVuZ3RoKQorICAgICAgICAgICAgcmFuZG9tRW50cnkgPSAwOworICAgICAgICByZXR1cm4gKGludCkgKFJBTkRPTVNbcmFuZG9tRW50cnkrK10gKiB0YWJsZS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBNYXAuRW50cnkgcmVtb3ZlUmFuZG9tKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGV4cHVuZ2VTdGFsZUVudHJpZXMoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpbnQgcmFuZG9tID0gcmFuZG9tRW50cnlJbmRleCgpOworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZEVudHJ5KHJhbmRvbSwgcmFuZG9tICUgMiA9PSAwLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBFbnRyeSByZW0gPSB0YWJsZVtpbmRleF07CisgICAgICAgICAgICB0YWJsZVtpbmRleF0gPSByZW0uZ2V0TmV4dCgpOworICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgIHJldHVybiByZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgbmVhcmVzdCB0aGUgZ2l2ZW4gaW5kZXgsIHN0YXJ0aW5nIGluIHRoZQorICAgICAqIGdpdmVuIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBmaW5kRW50cnkoaW50IHN0YXJ0LCBib29sZWFuIGZvcndhcmQsIGJvb2xlYW4gc2VhcmNoZWRPdGhlcikgeworICAgICAgICBpZiAoZm9yd2FyZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGFibGUubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHRhYmxlW2ldICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgcmV0dXJuIChzZWFyY2hlZE90aGVyIHx8IHN0YXJ0ID09IDApID8gLTEKKyAgICAgICAgICAgICAgICA6IGZpbmRFbnRyeShzdGFydCAtIDEsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgaWYgKHRhYmxlW2ldICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgcmV0dXJuIChzZWFyY2hlZE90aGVyIHx8IHN0YXJ0ID09IHRhYmxlLmxlbmd0aCAtIDEpID8gLTEKKyAgICAgICAgICAgICAgICA6IGZpbmRFbnRyeShzdGFydCArIDEsIHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIHJhbmRvbUVudHJ5SXRlcmF0b3IoKSB7CisgICAgICAgIC8vIHBhc3MgaW5kZXggc28gY2FsY3VsYXRlZCBiZWZvcmUgaXRlcmF0b3IgcmVmcyB0YWJsZSwgaW4gY2FzZSB0YWJsZQorICAgICAgICAvLyBnZXRzIHJlcGxhY2Ugd2l0aCBhIGxhcmdlciBvbmUKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoSXRlcmF0b3IoRU5UUklFUywgcmFuZG9tRW50cnlJbmRleCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgTWFwIHRvIHRoaXMgSGFzaE1hcAorICAgICAqIFRoZXNlIG1hcHBpbmdzIHdpbGwgcmVwbGFjZSBhbnkgbWFwcGluZ3MgdGhhdCB0aGlzIEhhc2hNYXAgaGFkIGZvciBhbnkKKyAgICAgKiBvZiB0aGUga2V5cyBjdXJyZW50bHkgaW4gdGhlIHNwZWNpZmllZCBNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBNYXBwaW5ncyB0byBiZSBzdG9yZWQgaW4gdGhpcyBNYXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7CisgICAgICAgIEl0ZXJhdG9yIGkgPSB0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgcHV0KGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgSGFzaE1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIC8vIGNsZWFyIG91dCByZWYgcXVldWUuIFdlIGRvbid0IG5lZWQgdG8gZXhwdW5nZSBlbnRyaWVzCisgICAgICAgIC8vIHNpbmNlIHRhYmxlIGlzIGdldHRpbmcgY2xlYXJlZC4KKyAgICAgICAgd2hpbGUgKHF1ZXVlLnBvbGwoKSAhPSBudWxsKQorICAgICAgICAgICAgOworICAgICAgICB0YWJsZSA9IG5ldyBFbnRyeVt0YWJsZS5sZW5ndGhdOworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIC8vIEFsbG9jYXRpb24gb2YgYXJyYXkgbWF5IGhhdmUgY2F1c2VkIEdDLCB3aGljaCBtYXkgaGF2ZSBjYXVzZWQKKyAgICAgICAgLy8gYWRkaXRpb25hbCBlbnRyaWVzIHRvIGdvIHN0YWxlLiAgICBSZW1vdmluZyB0aGVzZSBlbnRyaWVzIGZyb20KKyAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBxdWV1ZSB3aWxsIG1ha2UgdGhlbSBlbGlnaWJsZSBmb3IgcmVjbGFtYXRpb24uCisgICAgICAgIHdoaWxlIChxdWV1ZS5wb2xsKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgSGFzaE1hcC4gVGhlIGtleXMgYW5kIHZhbHVlcworICAgICAqIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHB1bmdlU3RhbGVFbnRyaWVzKCk7CisKKyAgICAgICAgICAgIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwIHQgPSAoQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXApCisgICAgICAgICAgICAgICAgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIHQudGFibGUgPSBuZXcgRW50cnlbdGFibGUubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB0YWJsZS5sZW5ndGg7IGktLSA+IDA7KSB7CisgICAgICAgICAgICAgICAgRW50cnkgZSA9IHRhYmxlW2ldOworICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdC50YWJsZVtpXSA9IChFbnRyeSkgZS5jbG9uZSh0LnF1ZXVlKTsKKyAgICAgICAgICAgICAgICAgICAgZSA9IGUuZ2V0TmV4dCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5IGsgPSB0LnRhYmxlW2ldOyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgay5zZXROZXh0KChFbnRyeSkgZS5jbG9uZSh0LnF1ZXVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gay5nZXROZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0LmtleVNldCA9IG51bGw7CisgICAgICAgICAgICB0LmVudHJ5U2V0ID0gbnVsbDsKKyAgICAgICAgICAgIHQudmFsdWVzID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIHNpbmNlIHdlIGFyZSBDbG9uZWFibGUKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWaWV3cworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0IGtleVNldCA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0IGVudHJ5U2V0ID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDb2xsZWN0aW9uIHZhbHVlcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU2V0IHZpZXcgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgSGFzaE1hcC4gVGhlIFNldCBpcworICAgICAqIGJhY2tlZCBieSB0aGUgSGFzaE1hcCwgc28gY2hhbmdlcyB0byB0aGUgSGFzaE1hcCBhcmUgcmVmbGVjdGVkIGluIHRoZQorICAgICAqIFNldCwgYW5kIHZpY2UtdmVyc2EuIFRoZSBTZXQgc3VwcG9ydHMgZWxlbWVudCByZW1vdmFsLCB3aGljaCByZW1vdmVzCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tIHRoZSBIYXNoTWFwLCB2aWEgdGhlIEl0ZXJhdG9yLnJlbW92ZSwKKyAgICAgKiBTZXQucmVtb3ZlLCByZW1vdmVBbGwgcmV0YWluQWxsLCBhbmQgY2xlYXIgb3BlcmF0aW9ucy4gSXQgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IHRoZSBhZGQgb3IgYWRkQWxsIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFNldCBrZXlTZXQoKSB7CisgICAgICAgIGlmIChrZXlTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAga2V5U2V0ID0gbmV3IGphdmEudXRpbC5BYnN0cmFjdFNldCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaEl0ZXJhdG9yKEtFWVMsIHRhYmxlLmxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0tleShvKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLnRoaXMucmVtb3ZlKG8pICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLnRoaXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBrZXlTZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIEhhc2hNYXAuCisgICAgICogVGhlIENvbGxlY3Rpb24gaXMgYmFja2VkIGJ5IHRoZSBIYXNoTWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBIYXNoTWFwIGFyZQorICAgICAqIHJlZmxlY3RlZCBpbiB0aGUgQ29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuIFRoZSBDb2xsZWN0aW9uIHN1cHBvcnRzCisgICAgICogZWxlbWVudCByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGUKKyAgICAgKiBIYXNoTWFwLCB2aWEgdGhlIEl0ZXJhdG9yLnJlbW92ZSwgQ29sbGVjdGlvbi5yZW1vdmUsIHJlbW92ZUFsbCwKKyAgICAgKiByZXRhaW5BbGwgYW5kIGNsZWFyIG9wZXJhdGlvbnMuIEl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGFkZCBvciBhZGRBbGwKKyAgICAgKiBvcGVyYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaEl0ZXJhdG9yKFZBTFVFUywgdGFibGUubGVuZ3RoIC0gMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVmFsdWUobyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLnRoaXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgSGFzaE1hcC4KKyAgICAgKiBFYWNoIGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgYSBNYXAuRW50cnkuIFRoZSBDb2xsZWN0aW9uCisgICAgICogaXMgYmFja2VkIGJ5IHRoZSBIYXNoTWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBIYXNoTWFwIGFyZSByZWZsZWN0ZWQgaW4gdGhlCisgICAgICogQ29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuIFRoZSBDb2xsZWN0aW9uIHN1cHBvcnRzIGVsZW1lbnQgcmVtb3ZhbCwKKyAgICAgKiB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGUgSGFzaE1hcCwgdmlhIHRoZQorICAgICAqIEl0ZXJhdG9yLnJlbW92ZSwgQ29sbGVjdGlvbi5yZW1vdmUsIHJlbW92ZUFsbCwgcmV0YWluQWxsIGFuZCBjbGVhcgorICAgICAqIG9wZXJhdGlvbnMuIEl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGFkZCBvciBhZGRBbGwgb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIEBzZWUgTWFwLkVudHJ5CisgICAgICovCisgICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKKyAgICAgICAgaWYgKGVudHJ5U2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGVudHJ5U2V0ID0gbmV3IGphdmEudXRpbC5BYnN0cmFjdFNldCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaEl0ZXJhdG9yKEVOVFJJRVMsIHRhYmxlLmxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvOworICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7CisgICAgICAgICAgICAgICAgICAgIGludCBoYXNoID0gKGtleSA9PSBudWxsID8gMCA6IGtleS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeSBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRIYXNoKCkgPT0gaGFzaCAmJiBlcShlLCBlbnRyeSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG87CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcC50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc2ggPSAoa2V5ID09IG51bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IGUsIGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVxKGUsIGVudHJ5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5zZXROZXh0KGUuZ2V0TmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiW2luZGV4XSA9IGUuZ2V0TmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcC50aGlzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbnRyeVNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHB1bmdlIHN0YWxlIGVudHJpZXMgZnJvbSB0aGUgdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cHVuZ2VTdGFsZUVudHJpZXMoKSB7CisgICAgICAgIE9iamVjdCByOworICAgICAgICB3aGlsZSAoKHIgPSBxdWV1ZS5wb2xsKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSByOworICAgICAgICAgICAgaW50IGhhc2ggPSBlbnRyeS5nZXRIYXNoKCk7CisgICAgICAgICAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOworICAgICAgICAgICAgaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7CisKKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7CisgICAgICAgICAgICAgICAgcHJldiA9IGUsIGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChlID09IGVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LnNldE5leHQoZS5nZXROZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHB1dCB0aGUgYnVja2V0IGFmdGVyIHVzCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYltpbmRleF0gPSBlLmdldE5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5VHlwZSA9PSBIQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVFeHBpcmVkKGUuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlFeHBpcmVkKGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzaE1hcCBjb2xsaXNpb24gbGlzdCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgRW50cnkgZXh0ZW5kcyBNYXAuRW50cnkgeworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFzaCgpOworCisgICAgICAgIHB1YmxpYyBFbnRyeSBnZXROZXh0KCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dChFbnRyeSBuZXh0KTsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKFJlZmVyZW5jZVF1ZXVlIHF1ZXVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXJkIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhhcmRFbnRyeSBpbXBsZW1lbnRzIEVudHJ5IHsKKworICAgICAgICBwcml2YXRlIGludCBoYXNoOworICAgICAgICBwcml2YXRlIE9iamVjdCBrZXk7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworICAgICAgICBwcml2YXRlIEVudHJ5IG5leHQ7CisKKyAgICAgICAgSGFyZEVudHJ5KGludCBoYXNoLCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIEVudHJ5IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMuaGFzaCA9IGhhc2g7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEhhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbnRyeSBnZXROZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0KEVudHJ5IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKFJlZmVyZW5jZVF1ZXVlIHF1ZXVlKSB7CisgICAgICAgICAgICAvLyBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBzZXQgdGhlIG5leHQgZmllbGQKKyAgICAgICAgICAgIC8vIGNvcnJlY3RseS4KKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFyZEVudHJ5KGhhc2gsIGtleSwgdmFsdWUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFwLkVudHJ5IE9wcworCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgbzsKKworICAgICAgICAgICAgT2JqZWN0IGsxID0ga2V5OworICAgICAgICAgICAgT2JqZWN0IGsyID0gZS5nZXRLZXkoKTsKKworICAgICAgICAgICAgcmV0dXJuIChrMSA9PSBudWxsID8gazIgPT0gbnVsbCA6IGVxKGsxLCBrMikpICYmCisgICAgICAgICAgICAgICAgKHZhbHVlID09IG51bGwgPyBlLmdldFZhbHVlKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA6IGVxKHZhbHVlLCBlLmdldFZhbHVlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzaCBeICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkgKyAiPSIgKyB2YWx1ZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2VhayBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXZWFrRW50cnkgZXh0ZW5kcyBXZWFrUmVmZXJlbmNlIGltcGxlbWVudHMgRW50cnkgeworCisgICAgICAgIHByaXZhdGUgaW50IGhhc2g7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IGhhcmQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBrZXlSZWY7CisgICAgICAgIHByaXZhdGUgRW50cnkgbmV4dDsKKworICAgICAgICBXZWFrRW50cnkoaW50IGhhc2gsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBrZXlSZWYsCisgICAgICAgICAgICBFbnRyeSBuZXh0LCBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSkgeworICAgICAgICAgICAgc3VwZXIoKGtleVJlZikgPyBrZXkgOiB2YWx1ZSwgcXVldWUpOworICAgICAgICAgICAgdGhpcy5oYXNoID0gaGFzaDsKKyAgICAgICAgICAgIHRoaXMuaGFyZCA9IChrZXlSZWYpID8gdmFsdWUgOiBrZXk7CisgICAgICAgICAgICB0aGlzLmtleVJlZiA9IGtleVJlZjsKKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEhhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbnRyeSBnZXROZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0KEVudHJ5IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKFJlZmVyZW5jZVF1ZXVlIHF1ZXVlKSB7CisgICAgICAgICAgICAvLyBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBzZXQgdGhlIG5leHQgZmllbGQKKyAgICAgICAgICAgIC8vIGNvcnJlY3RseS4KKyAgICAgICAgICAgIHJldHVybiBuZXcgV2Vha0VudHJ5KGhhc2gsIGdldEtleSgpLCBnZXRWYWx1ZSgpLCBrZXlSZWYsIG51bGwsCisgICAgICAgICAgICAgICAgcXVldWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFwLkVudHJ5IE9wcworCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIChrZXlSZWYpID8gc3VwZXIuZ2V0KCkgOiBoYXJkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoa2V5UmVmKSA/IGhhcmQgOiBzdXBlci5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoIWtleVJlZikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHQgdG8gcmVzZXQgcmVmZXJlbmNlIHZhbHVlLiIpOworCisgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBoYXJkOworICAgICAgICAgICAgaGFyZCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBvOworICAgICAgICAgICAgcmV0dXJuIGVxKGdldEtleSgpLCBlLmdldEtleSgpKSAmJiBlcShnZXRWYWx1ZSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWwgPSBnZXRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIGhhc2ggXiAodmFsID09IG51bGwgPyAwIDogdmFsLmhhc2hDb2RlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRLZXkoKSArICI9IiArIGdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb2Z0IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNvZnRFbnRyeSBleHRlbmRzIFNvZnRSZWZlcmVuY2UgaW1wbGVtZW50cyBFbnRyeSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaGFzaDsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgaGFyZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGtleVJlZjsKKyAgICAgICAgcHJpdmF0ZSBFbnRyeSBuZXh0OworCisgICAgICAgIFNvZnRFbnRyeShpbnQgaGFzaCwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGtleVJlZiwKKyAgICAgICAgICAgIEVudHJ5IG5leHQsIFJlZmVyZW5jZVF1ZXVlIHF1ZXVlKSB7CisgICAgICAgICAgICBzdXBlcigoa2V5UmVmKSA/IGtleSA6IHZhbHVlLCBxdWV1ZSk7CisgICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOworICAgICAgICAgICAgdGhpcy5oYXJkID0gKGtleVJlZikgPyB2YWx1ZSA6IGtleTsKKyAgICAgICAgICAgIHRoaXMua2V5UmVmID0ga2V5UmVmOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVudHJ5IGdldE5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHQoRW50cnkgbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoUmVmZXJlbmNlUXVldWUgcXVldWUpIHsKKyAgICAgICAgICAgIC8vIEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIHNldCB0aGUgbmV4dCBmaWVsZAorICAgICAgICAgICAgLy8gY29ycmVjdGx5LgorICAgICAgICAgICAgcmV0dXJuIG5ldyBTb2Z0RW50cnkoaGFzaCwgZ2V0S2V5KCksIGdldFZhbHVlKCksIGtleVJlZiwgbnVsbCwKKyAgICAgICAgICAgICAgICBxdWV1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXAuRW50cnkgT3BzCisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gKGtleVJlZikgPyBzdXBlci5nZXQoKSA6IGhhcmQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIChrZXlSZWYpID8gaGFyZCA6IHN1cGVyLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICgha2V5UmVmKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0ZW1wdCB0byByZXNldCByZWZlcmVuY2UgdmFsdWUuIik7CisKKyAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGhhcmQ7CisgICAgICAgICAgICBoYXJkID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87CisgICAgICAgICAgICByZXR1cm4gZXEoZ2V0S2V5KCksIGUuZ2V0S2V5KCkpICYmIGVxKGdldFZhbHVlKCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgT2JqZWN0IHZhbCA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gaGFzaCBeICh2YWwgPT0gbnVsbCA/IDAgOiB2YWwuaGFzaENvZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEtleSgpICsgIj0iICsgZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFR5cGVzIG9mIEVudW1lcmF0aW9ucy9JdGVyYXRpb25zCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRVMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRSSUVTID0gMjsKKworICAgIC8qKgorICAgICAqIE1hcCBpdGVyYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKKworICAgICAgICBmaW5hbCBFbnRyeVtdIHRhYmxlID0gQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAudGhpcy50YWJsZTsKKyAgICAgICAgZmluYWwgaW50IHR5cGU7CisgICAgICAgIGludCBzdGFydEluZGV4OworICAgICAgICBpbnQgc3RvcEluZGV4ID0gMDsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICBFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgIEVudHJ5IGxhc3RSZXR1cm5lZCA9IG51bGw7CisKKyAgICAgICAgSGFzaEl0ZXJhdG9yKGludCB0eXBlLCBpbnQgc3RhcnRJbmRleCkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBpbmRleCA9IHN0YXJ0SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSBzdG9wSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVudHJ5ID0gdGFibGVbaW5kZXgtLV0pICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0b3BJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSB0YWJsZS5sZW5ndGggLSAxOworICAgICAgICAgICAgICAgIHN0b3BJbmRleCA9IHN0YXJ0SW5kZXggKyAxOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSBzdG9wSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRyeSA9IHRhYmxlW2luZGV4LS1dKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBFbnRyeSBlID0gbGFzdFJldHVybmVkID0gZW50cnk7CisgICAgICAgICAgICBlbnRyeSA9IGUuZ2V0TmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gS0VZUyA/IGUuZ2V0S2V5KCkKKyAgICAgICAgICAgICAgICA6ICh0eXBlID09IFZBTFVFUyA/IGUuZ2V0VmFsdWUoKSA6IGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAudGhpcykgeworICAgICAgICAgICAgICAgIEVudHJ5W10gdGFiID0gQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAudGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAobGFzdFJldHVybmVkLmdldEhhc2goKSAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBlLCBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gbGFzdFJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYltpbmRleF0gPSBlLmdldE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LnNldE5leHQoZS5nZXROZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJdGVyYXRlZCBvZmYgdGFibGUgd2hlbiBkb2luZyByZW1vdmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBjYXBhY2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlLmxlbmd0aDsKKyAgICB9CisKKyAgICBmbG9hdCBsb2FkRmFjdG9yKCkgeworICAgICAgICByZXR1cm4gbG9hZEZhY3RvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50UmVmZXJlbmNlSGFzaFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2UyYTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5NYXBCYWNrZWRTZXQ7CisKKy8qKgorICogQSBjb25jdXJyZW50IHNldCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHN0b3JlZCBhcyB3ZWFrIG9yIHNvZnQgcmVmZXJlbmNlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQgaW1wbGVtZW50cyBTZXQsIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBIYXJkIHJlZmVyZW5jZSBtYXJrZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFSRCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTb2Z0IHJlZmVyZW5jZSBtYXJrZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09GVCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBXZWFrIHJlZmVyZW5jZSBtYXJrZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VBSyA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRFVNTVlfVkFMID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgX3NldDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHNldCB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQoaW50IHJlZlR5cGUpIHsKKyAgICAgICAgaWYgKHJlZlR5cGUgPT0gSEFSRCkKKyAgICAgICAgICAgIF9zZXQgPSBNYXBCYWNrZWRTZXQuZGVjb3JhdGUobmV3IENvbmN1cnJlbnRIYXNoTWFwKCksIERVTU1ZX1ZBTCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IG1hcFJlZlR5cGUgPSAocmVmVHlwZSA9PSBXRUFLKSA/IENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLldFQUsKKyAgICAgICAgICAgICAgICA6IENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoTWFwLlNPRlQ7CisgICAgICAgICAgICBfc2V0ID0gTWFwQmFja2VkU2V0LmRlY29yYXRlKG5ldyBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcAorICAgICAgICAgICAgICAgIChtYXBSZWZUeXBlLCBDb25jdXJyZW50UmVmZXJlbmNlSGFzaE1hcC5IQVJEKSwgRFVNTVlfVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBfc2V0LmFkZChvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQuYWRkQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBfc2V0LmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gX3NldC5jb250YWlucyhvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICByZXR1cm4gX3NldC5jb250YWluc0FsbChjb2xsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gX3NldC5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gX3NldC5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBfc2V0LnJlbW92ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQucmVtb3ZlQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQucmV0YWluQWxsKGNvbGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zZXQuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworICAgICAgICByZXR1cm4gX3NldC50b0FycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyKSB7CisgICAgICAgIHJldHVybiBfc2V0LnRvQXJyYXkoYXJyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gX3NldC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hTZXQpCisgICAgICAgICAgICBvYmogPSAoKENvbmN1cnJlbnRSZWZlcmVuY2VIYXNoU2V0KSBvYmopLl9zZXQ7CisgICAgICAgIHJldHVybiBfc2V0LmVxdWFscyhvYmopOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db25kVmFyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uZFZhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2JlNjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uZFZhci5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IERvdWcgTGVhIGFuZCByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogVGhpcyBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2VzIHdoYXRzb2V2ZXIgd2l0aG91dCBhY2tub3dsZWRnbWVudC4KKyAqIFRoYW5rcyBmb3IgdGhlIGFzc2lzdGFuY2UgYW5kIHN1cHBvcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJzLAorICogYW5kIGV2ZXJ5b25lIGNvbnRyaWJ1dGluZywgdGVzdGluZywgYW5kIHVzaW5nIHRoaXMgY29kZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitjbGFzcyBDb25kVmFyIGltcGxlbWVudHMgQ29uZGl0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jaworICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBFeGNsdXNpdmVMb2NrIGxvY2s7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ29uZFZhciB0aGF0IHJlbGllcyBvbiB0aGUgZ2l2ZW4gbXV0dWFsIGV4Y2x1c2lvbiBsb2NrLgorICAgICAqIEBwYXJhbSBsb2NrIEEgbm9uLXJlZW50cmFudCBtdXR1YWwgZXhjbHVzaW9uIGxvY2suCisgICAgICovCisgICAgQ29uZFZhcihFeGNsdXNpdmVMb2NrIGxvY2spIHsKKyAgICAgICAgdGhpcy5sb2NrID0gbG9jazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhd2FpdFVuaW50ZXJydXB0aWJseSgpIHsKKyAgICAgICAgaW50IGhvbGRDb3VudCA9IGxvY2suZ2V0SG9sZENvdW50KCk7CisgICAgICAgIGlmIChob2xkQ291bnQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhdm9pZCBpbnN0YW50IHNwdXJpb3VzIHdha2V1cCBpZiB0aHJlYWQgYWxyZWFkeSBpbnRlcnJ1cHRlZAorICAgICAgICBib29sZWFuIHdhc0ludGVycnVwdGVkID0gVGhyZWFkLmludGVycnVwdGVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gaG9sZENvdW50OyBpID4gMDsgaS0tKSBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhc0ludGVycnVwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBoYXZlIG1hc2tlZCB0aGUgc2lnbmFsIGFuZCB0aGVyZSBpcyBubyB3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRlbGw7IGRlZmVuc2l2ZWx5IHByb3BhZ2F0ZSB0aGUgc2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBob2xkQ291bnQ7IGkgPiAwOyBpLS0pIGxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKHdhc0ludGVycnVwdGVkKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF3YWl0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGhvbGRDb3VudCA9IGxvY2suZ2V0SG9sZENvdW50KCk7CisgICAgICAgIGlmIChob2xkQ291bnQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBob2xkQ291bnQ7IGkgPiAwOyBpLS0pIGxvY2subG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXdhaXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KQorICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbnQgaG9sZENvdW50ID0gbG9jay5nZXRIb2xkQ291bnQoKTsKKyAgICAgICAgaWYgKGhvbGRDb3VudCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIGxvbmcgbmFub3MgPSB1bml0LnRvTmFub3ModGltZW91dCk7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFub3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gVXRpbHMubmFub1RpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLnRpbWVkV2FpdCh0aGlzLCBuYW5vcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBESzogZHVlIHRvIGNvYXJzZS1ncmFpbmVkKG1pbGxpcykgY2xvY2ssIGl0IHNlZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXJhYmxlIHRvIGFja25vd2xlZGdlIHRpbWVvdXQoc3VjY2VzcyA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGVxdWFsaXR5IGhvbGRzKHRpbWluZyBpcyBleGFjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBVdGlscy5uYW5vVGltZSgpIC0gc3RhcnQgPCBuYW5vczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gaG9sZENvdW50OyBpID4gMDsgaS0tKSBsb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKy8vICAgIHB1YmxpYyBsb25nIGF3YWl0TmFub3MobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworLy8gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworLy8gICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXdhaXRVbnRpbChEYXRlIGRlYWRsaW5lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAoZGVhZGxpbmUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIGludCBob2xkQ291bnQgPSBsb2NrLmdldEhvbGRDb3VudCgpOworICAgICAgICBpZiAoaG9sZENvdW50ID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBhYnN0aW1lID0gZGVhZGxpbmUuZ2V0VGltZSgpOworICAgICAgICBpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOworCisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgbXNlY3MgPSBhYnN0aW1lIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2VjcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQobXNlY3MpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gREs6IGR1ZSB0byBjb2Fyc2UtZ3JhaW5lZChtaWxsaXMpIGNsb2NrLCBpdCBzZWVtcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZmVyYWJsZSB0byBhY2tub3dsZWRnZSB0aW1lb3V0KHN1Y2Nlc3MgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBlcXVhbGl0eSBob2xkcyh0aW1pbmcgaXMgZXhhY3QpCisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IG1zZWNzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBob2xkQ291bnQ7IGkgPiAwOyBpLS0pIGxvY2subG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzaWduYWwoKSB7CisgICAgICAgIGlmICghbG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2lnbmFsQWxsKCkgeworICAgICAgICBpZiAoIWxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4Y2x1c2l2ZUxvY2sgZ2V0TG9jaygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2s7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzV2FpdGVycygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgRkFJUiB2ZXJzaW9uIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRXYWl0UXVldWVMZW5ndGgoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIEZBSVIgdmVyc2lvbiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldFdhaXRpbmdUaHJlYWRzKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBGQUlSIHZlcnNpb24iKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50ZXJmYWNlIEV4Y2x1c2l2ZUxvY2sgZXh0ZW5kcyBMb2NrIHsKKworICAgICAgICBib29sZWFuIGlzSGVsZEJ5Q3VycmVudFRocmVhZCgpOworCisgICAgICAgIGludCBnZXRIb2xkQ291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uZGl0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29uZGl0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2OTRhZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db25kaXRpb24uamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIDx0dD5Db25kaXRpb248L3R0PiBmYWN0b3JzIG91dCB0aGUgPHR0Pk9iamVjdDwvdHQ+IG1vbml0b3IKKyAqIG1ldGhvZHMoe0BsaW5rIE9iamVjdCN3YWl0KCkgd2FpdH0sIHtAbGluayBPYmplY3Qjbm90aWZ5IG5vdGlmeX0KKyAqIGFuZCB7QGxpbmsgT2JqZWN0I25vdGlmeUFsbCBub3RpZnlBbGx9KSBpbnRvIGRpc3RpbmN0IG9iamVjdHMgdG8KKyAqIGdpdmUgdGhlIGVmZmVjdCBvZiBoYXZpbmcgbXVsdGlwbGUgd2FpdC1zZXRzIHBlciBvYmplY3QsIGJ5CisgKiBjb21iaW5pbmcgdGhlbSB3aXRoIHRoZSB1c2Ugb2YgYXJiaXRyYXJ5IHtAbGluayBMb2NrfSBpbXBsZW1lbnRhdGlvbnMuCisgKiBXaGVyZSBhIDx0dD5Mb2NrPC90dD4gcmVwbGFjZXMgdGhlIHVzZSBvZiA8dHQ+c3luY2hyb25pemVkPC90dD4gbWV0aG9kcworICogYW5kIHN0YXRlbWVudHMsIGEgPHR0PkNvbmRpdGlvbjwvdHQ+IHJlcGxhY2VzIHRoZSB1c2Ugb2YgdGhlIE9iamVjdAorICogbW9uaXRvciBtZXRob2RzLiBDb25kaXRpb25zKGFsc28ga25vd24gYXMgPGVtPmNvbmRpdGlvbiBxdWV1ZXM8L2VtPiBvcgorICogPGVtPmNvbmRpdGlvbiB2YXJpYWJsZXM8L2VtPikgcHJvdmlkZSBhIG1lYW5zIGZvciBvbmUgdGhyZWFkIHRvCisgKiBzdXNwZW5kIGV4ZWN1dGlvbih0byAmcXVvdDt3YWl0JnF1b3Q7KSB1bnRpbCBub3RpZmllZCBieSBhbm90aGVyCisgKiB0aHJlYWQgdGhhdCBzb21lIHN0YXRlIGNvbmRpdGlvbiBtYXkgbm93IGJlIHRydWUuIEJlY2F1c2UgYWNjZXNzCisgKiB0byB0aGlzIHNoYXJlZCBzdGF0ZSBpbmZvcm1hdGlvbiBvY2N1cnMgaW4gZGlmZmVyZW50IHRocmVhZHMsIGl0CisgKiBtdXN0IGJlIHByb3RlY3RlZCwgc28gYSBsb2NrIG9mIHNvbWUgZm9ybSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBjb25kaXRpb24uIFRoZSBrZXkgcHJvcGVydHkgdGhhdCB3YWl0aW5nIGZvciBhIGNvbmRpdGlvbiBwcm92aWRlcworICogaXMgdGhhdCBpdCA8ZW0+YXRvbWljYWxseTwvZW0+IHJlbGVhc2VzIHRoZSBhc3NvY2lhdGVkIGxvY2sgYW5kCisgKiBzdXNwZW5kcyB0aGUgY3VycmVudCB0aHJlYWQsIGp1c3QgbGlrZSA8dHQ+T2JqZWN0LndhaXQ8L3R0Pi4KKyAqIEEgPHR0PkNvbmRpdGlvbjwvdHQ+IGluc3RhbmNlIGlzIGludHJpbnNpY2FsbHkgYm91bmQgdG8gYSBsb2NrLgorICogVG8gb2J0YWluIGEgPHR0PkNvbmRpdGlvbjwvdHQ+IGluc3RhbmNlIGZvciBhIHBhcnRpY3VsYXIge0BsaW5rIExvY2t9CisgKiBpbnN0YW5jZSB1c2UgaXRzIHtAbGluayBMb2NrI25ld0NvbmRpdGlvbiBuZXdDb25kaXRpb24oKX0gbWV0aG9kLgorICogQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlIGEgYm91bmRlZCBidWZmZXIgd2hpY2ggc3VwcG9ydHMKKyAqIDx0dD5wdXQ8L3R0PiBhbmQgPHR0PnRha2U8L3R0PiBtZXRob2RzLiBJZiBhCisgKiA8dHQ+dGFrZTwvdHQ+IGlzIGF0dGVtcHRlZCBvbiBhbiBlbXB0eSBidWZmZXIsIHRoZW4gdGhlIHRocmVhZCB3aWxsIGJsb2NrCisgKiB1bnRpbCBhbiBpdGVtIGJlY29tZXMgYXZhaWxhYmxlOyBpZiBhIDx0dD5wdXQ8L3R0PiBpcyBhdHRlbXB0ZWQgb24gYQorICogZnVsbCBidWZmZXIsIHRoZW4gdGhlIHRocmVhZCB3aWxsIGJsb2NrIHVudGlsIGEgc3BhY2UgYmVjb21lcyBhdmFpbGFibGUuCisgKiBXZSB3b3VsZCBsaWtlIHRvIGtlZXAgd2FpdGluZyA8dHQ+cHV0PC90dD4gdGhyZWFkcyBhbmQgPHR0PnRha2U8L3R0PgorICogdGhyZWFkcyBpbiBzZXBhcmF0ZSB3YWl0LXNldHMgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZSBvcHRpbWl6YXRpb24gb2YKKyAqIG9ubHkgbm90aWZ5aW5nIGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUgd2hlbiBpdGVtcyBvciBzcGFjZXMgYmVjb21lCisgKiBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdHdvCisgKiB7QGxpbmsgQ29uZGl0aW9ufSBpbnN0YW5jZXMuCisgKiA8cHJlPiBjbGFzcyBCb3VuZGVkQnVmZmVyIHsKKyAqIDxiPmZpbmFsIExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7PC9iPgorICogZmluYWwgQ29uZGl0aW9uIG5vdEZ1bGwgPSA8Yj5sb2NrLm5ld0NvbmRpdGlvbigpOyA8L2I+CisgKiBmaW5hbCBDb25kaXRpb24gbm90RW1wdHkgPSA8Yj5sb2NrLm5ld0NvbmRpdGlvbigpOyA8L2I+CisgKiBmaW5hbCBPYmplY3RbXSBpdGVtcyA9IG5ldyBPYmplY3RbMTAwXTsgaW50IHB1dHB0ciwgdGFrZXB0ciwgY291bnQ7CisgKiBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IHgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgKiA8Yj5sb2NrLmxvY2soKTsgdHJ5IHs8L2I+IHdoaWxlIChjb3VudCA9PSBpdGVtcy5sZW5ndGgpCisgKiA8Yj5ub3RGdWxsLmF3YWl0KCk7PC9iPiBpdGVtc1twdXRwdHJdID0geDsKKyAqIGlmICgrK3B1dHB0ciA9PSBpdGVtcy5sZW5ndGgpIHB1dHB0ciA9IDA7ICsrY291bnQ7CisgKiA8Yj5ub3RFbXB0eS5zaWduYWwoKTs8L2I+CisgKiA8Yj59IGZpbmFsbHkgeyBsb2NrLnVubG9jaygpOyB9PC9iPiB9CisgKiBwdWJsaWMgT2JqZWN0IHRha2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICogPGI+bG9jay5sb2NrKCk7IHRyeSB7PC9iPiB3aGlsZSAoY291bnQgPT0gMCkKKyAqIDxiPm5vdEVtcHR5LmF3YWl0KCk7PC9iPiBPYmplY3QgeCA9IGl0ZW1zW3Rha2VwdHJdOworICogaWYgKCsrdGFrZXB0ciA9PSBpdGVtcy5sZW5ndGgpIHRha2VwdHIgPSAwOyAtLWNvdW50OworICogPGI+bm90RnVsbC5zaWduYWwoKTs8L2I+IHJldHVybiB4OworICogPGI+fSBmaW5hbGx5IHsgbG9jay51bmxvY2soKTsgfTwvYj4gfSB9CisgKiA8L3ByZT4KKyAqIAorICogKFRoZSB7QGxpbmsgZWR1LmVtb3J5Lm1hdGhjcy5iYWNrcG9ydC5qYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWV9IGNsYXNzIHByb3ZpZGVzCisgKiB0aGlzIGZ1bmN0aW9uYWxpdHksIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBpbXBsZW1lbnQgdGhpcworICogc2FtcGxlIHVzYWdlIGNsYXNzLikKKyAqIEEgPHR0PkNvbmRpdGlvbjwvdHQ+IGltcGxlbWVudGF0aW9uIGNhbiBwcm92aWRlIGJlaGF2aW9yIGFuZCBzZW1hbnRpY3MKKyAqIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhhdCBvZiB0aGUgPHR0Pk9iamVjdDwvdHQ+IG1vbml0b3IgbWV0aG9kcywgc3VjaCBhcworICogZ3VhcmFudGVlZCBvcmRlcmluZyBmb3Igbm90aWZpY2F0aW9ucywgb3Igbm90IHJlcXVpcmluZyBhIGxvY2sgdG8gYmUgaGVsZAorICogd2hlbiBwZXJmb3JtaW5nIG5vdGlmaWNhdGlvbnMuCisgKiBJZiBhbiBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBzdWNoIHNwZWNpYWxpemVkIHNlbWFudGljcyB0aGVuIHRoZQorICogaW1wbGVtZW50YXRpb24gbXVzdCBkb2N1bWVudCB0aG9zZSBzZW1hbnRpY3MuCisgKiBOb3RlIHRoYXQgPHR0PkNvbmRpdGlvbjwvdHQ+IGluc3RhbmNlcyBhcmUganVzdCBub3JtYWwgb2JqZWN0cyBhbmQgY2FuCisgKiB0aGVtc2VsdmVzIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBpbiBhIDx0dD5zeW5jaHJvbml6ZWQ8L3R0PiBzdGF0ZW1lbnQsCisgKiBhbmQgY2FuIGhhdmUgdGhlaXIgb3duIG1vbml0b3Ige0BsaW5rIE9iamVjdCN3YWl0IHdhaXR9IGFuZAorICoge0BsaW5rIE9iamVjdCNub3RpZnkgbm90aWZpY2F0aW9ufSBtZXRob2RzIGludm9rZWQuCisgKiBBY3F1aXJpbmcgdGhlIG1vbml0b3IgbG9jayBvZiBhIDx0dD5Db25kaXRpb248L3R0PiBpbnN0YW5jZSwgb3IgdXNpbmcgaXRzCisgKiBtb25pdG9yIG1ldGhvZHMsIGhhcyBubyBzcGVjaWZpZWQgcmVsYXRpb25zaGlwIHdpdGggYWNxdWlyaW5nIHRoZQorICoge0BsaW5rIExvY2t9IGFzc29jaWF0ZWQgd2l0aCB0aGF0IDx0dD5Db25kaXRpb248L3R0PiBvciB0aGUgdXNlIG9mIGl0cworICoge0BsaW5rICNhd2FpdCB3YWl0aW5nfSBhbmQge0BsaW5rICNzaWduYWwgc2lnbmFsbGluZ30gbWV0aG9kcy4KKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdG8gYXZvaWQgY29uZnVzaW9uIHlvdSBuZXZlciB1c2UgPHR0PkNvbmRpdGlvbjwvdHQ+CisgKiBpbnN0YW5jZXMgaW4gdGhpcyB3YXksIGV4Y2VwdCBwZXJoYXBzIHdpdGhpbiB0aGVpciBvd24gaW1wbGVtZW50YXRpb24uCisgKiBFeGNlcHQgd2hlcmUgbm90ZWQsIHBhc3NpbmcgYSA8dHQ+bnVsbDwvdHQ+IHZhbHVlIGZvciBhbnkgcGFyYW1ldGVyCisgKiB3aWxsIHJlc3VsdCBpbiBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duLgorICogCisgKiA8aDM+SW1wbGVtZW50YXRpb24gQ29uc2lkZXJhdGlvbnM8L2gzPgorICogV2hlbiB3YWl0aW5nIHVwb24gYSA8dHQ+Q29uZGl0aW9uPC90dD4sIGEgJnF1b3Q7PGVtPnNwdXJpb3VzCisgKiB3YWtldXA8L2VtPiZxdW90OyBpcyBwZXJtaXR0ZWQgdG8gb2NjdXIsIGluCisgKiBnZW5lcmFsLCBhcyBhIGNvbmNlc3Npb24gdG8gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0gc2VtYW50aWNzLgorICogVGhpcyBoYXMgbGl0dGxlIHByYWN0aWNhbCBpbXBhY3Qgb24gbW9zdCBhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcyBhCisgKiA8dHQ+Q29uZGl0aW9uPC90dD4gc2hvdWxkIGFsd2F5cyBiZSB3YWl0ZWQgdXBvbiBpbiBhIGxvb3AsIHRlc3RpbmcKKyAqIHRoZSBzdGF0ZSBwcmVkaWNhdGUgdGhhdCBpcyBiZWluZyB3YWl0ZWQgZm9yLiBBbiBpbXBsZW1lbnRhdGlvbiBpcworICogZnJlZSB0byByZW1vdmUgdGhlIHBvc3NpYmlsaXR5IG9mIHNwdXJpb3VzIHdha2V1cHMgYnV0IGl0IGlzCisgKiByZWNvbW1lbmRlZCB0aGF0IGFwcGxpY2F0aW9ucyBwcm9ncmFtbWVycyBhbHdheXMgYXNzdW1lIHRoYXQgdGhleSBjYW4KKyAqIG9jY3VyIGFuZCBzbyBhbHdheXMgd2FpdCBpbiBhIGxvb3AuIFRoZSB0aHJlZSBmb3JtcyBvZiBjb25kaXRpb24gd2FpdGluZworICogKGludGVycnVwdGlibGUsIG5vbi1pbnRlcnJ1cHRpYmxlLCBhbmQgdGltZWQpIG1heSBkaWZmZXIgaW4gdGhlaXIgZWFzZSBvZgorICogaW1wbGVtZW50YXRpb24gb24gc29tZSBwbGF0Zm9ybXMgYW5kIGluIHRoZWlyIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy4KKyAqIEluIHBhcnRpY3VsYXIsIGl0IG1heSBiZSBkaWZmaWN1bHQgdG8gcHJvdmlkZSB0aGVzZSBmZWF0dXJlcyBhbmQgbWFpbnRhaW4KKyAqIHNwZWNpZmljIHNlbWFudGljcyBzdWNoIGFzIG9yZGVyaW5nIGd1YXJhbnRlZXMuCisgKiBGdXJ0aGVyLCB0aGUgYWJpbGl0eSB0byBpbnRlcnJ1cHQgdGhlIGFjdHVhbCBzdXNwZW5zaW9uIG9mIHRoZSB0aHJlYWQgbWF5CisgKiBub3QgYWx3YXlzIGJlIGZlYXNpYmxlIHRvIGltcGxlbWVudCBvbiBhbGwgcGxhdGZvcm1zLgorICogQ29uc2VxdWVudGx5LCBhbiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8gZGVmaW5lIGV4YWN0bHkgdGhlCisgKiBzYW1lIGd1YXJhbnRlZXMgb3Igc2VtYW50aWNzIGZvciBhbGwgdGhyZWUgZm9ybXMgb2Ygd2FpdGluZywgbm9yIGlzIGl0CisgKiByZXF1aXJlZCB0byBzdXBwb3J0IGludGVycnVwdGlvbiBvZiB0aGUgYWN0dWFsIHN1c3BlbnNpb24gb2YgdGhlIHRocmVhZC4KKyAqIEFuIGltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkIHRvCisgKiBjbGVhcmx5IGRvY3VtZW50IHRoZSBzZW1hbnRpY3MgYW5kIGd1YXJhbnRlZXMgcHJvdmlkZWQgYnkgZWFjaCBvZiB0aGUKKyAqIHdhaXRpbmcgbWV0aG9kcywgYW5kIHdoZW4gYW4gaW1wbGVtZW50YXRpb24gZG9lcyBzdXBwb3J0IGludGVycnVwdGlvbiBvZgorICogdGhyZWFkIHN1c3BlbnNpb24gdGhlbiBpdCBtdXN0IG9iZXkgdGhlIGludGVycnVwdGlvbiBzZW1hbnRpY3MgYXMgZGVmaW5lZAorICogaW4gdGhpcyBpbnRlcmZhY2UuCisgKiBBcyBpbnRlcnJ1cHRpb24gZ2VuZXJhbGx5IGltcGxpZXMgY2FuY2VsbGF0aW9uLCBhbmQgY2hlY2tzIGZvcgorICogaW50ZXJydXB0aW9uIGFyZSBvZnRlbiBpbmZyZXF1ZW50LCBhbiBpbXBsZW1lbnRhdGlvbiBjYW4gZmF2b3IgcmVzcG9uZGluZworICogdG8gYW4gaW50ZXJydXB0IG92ZXIgbm9ybWFsIG1ldGhvZCByZXR1cm4uIFRoaXMgaXMgdHJ1ZSBldmVuIGlmIGl0IGNhbiBiZQorICogc2hvd24gdGhhdCB0aGUgaW50ZXJydXB0IG9jY3VycmVkIGFmdGVyIGFub3RoZXIgYWN0aW9uIG1heSBoYXZlIHVuYmxvY2tlZAorICogdGhlIHRocmVhZC4gQW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIGRvY3VtZW50IHRoaXMgYmVoYXZpb3IuCisgKgorICogQGF1dGhvciBEb3VnIExlYQorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbmRpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHdhaXQgdW50aWwgaXQgaXMgc2lnbmFsbGVkIG9yCisgICAgICoge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0ZWR9LgorICAgICAqIFRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDx0dD5Db25kaXRpb248L3R0PiBpcyBhdG9taWNhbGx5CisgICAgICogcmVsZWFzZWQgYW5kIHRoZSBjdXJyZW50IHRocmVhZCBiZWNvbWVzIGRpc2FibGVkIGZvciB0aHJlYWQgc2NoZWR1bGluZworICAgICAqIHB1cnBvc2VzIGFuZCBsaWVzIGRvcm1hbnQgdW50aWwgPGVtPm9uZTwvZW0+IG9mIGZvdXIgdGhpbmdzIGhhcHBlbnM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCBpbnZva2VzIHRoZSB7QGxpbmsgI3NpZ25hbH0gbWV0aG9kIGZvciB0aGlzCisgICAgICogPHR0PkNvbmRpdGlvbjwvdHQ+IGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaGFwcGVucyB0byBiZSBjaG9zZW4gYXMgdGhlCisgICAgICogdGhyZWFkIHRvIGJlIGF3YWtlbmVkOyBvcgorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCBpbnZva2VzIHRoZSB7QGxpbmsgI3NpZ25hbEFsbH0gbWV0aG9kIGZvciB0aGlzCisgICAgICogPHR0PkNvbmRpdGlvbjwvdHQ+OyBvcgorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRzfSB0aGUgY3VycmVudAorICAgICAqIHRocmVhZCwgYW5kIGludGVycnVwdGlvbiBvZiB0aHJlYWQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQ7IG9yCisgICAgICogPGxpPkEgJnF1b3Q7PGVtPnNwdXJpb3VzIHdha2V1cDwvZW0+JnF1b3Q7IG9jY3VycworICAgICAqIDwvdWw+IEluIGFsbCBjYXNlcywgYmVmb3JlIHRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkIG11c3QKKyAgICAgKiByZS1hY3F1aXJlIHRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmRpdGlvbi4gV2hlbiB0aGUKKyAgICAgKiB0aHJlYWQgcmV0dXJucyBpdCBpcyA8ZW0+Z3VhcmFudGVlZDwvZW0+IHRvIGhvbGQgdGhpcyBsb2NrLgorICAgICAqIElmIHRoZSBjdXJyZW50IHRocmVhZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmhhcyBpdHMgaW50ZXJydXB0ZWQgc3RhdHVzIHNldCBvbiBlbnRyeSB0byB0aGlzIG1ldGhvZDsgb3IKKyAgICAgKiA8bGk+aXMge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0ZWR9IHdoaWxlIHdhaXRpbmcKKyAgICAgKiBhbmQgaW50ZXJydXB0aW9uIG9mIHRocmVhZCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCwKKyAgICAgKiA8L3VsPgorICAgICAqIHRoZW4ge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufSBpcyB0aHJvd24gYW5kIHRoZSBjdXJyZW50IHRocmVhZCdzCisgICAgICogaW50ZXJydXB0ZWQgc3RhdHVzIGlzIGNsZWFyZWQuIEl0IGlzIG5vdCBzcGVjaWZpZWQsIGluIHRoZSBmaXJzdAorICAgICAqIGNhc2UsIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0IGZvciBpbnRlcnJ1cHRpb24gb2NjdXJzIGJlZm9yZSB0aGUgbG9jaworICAgICAqIGlzIHJlbGVhc2VkLgorICAgICAqIAorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIFRoZSBjdXJyZW50IHRocmVhZCBpcyBhc3N1bWVkIHRvIGhvbGQgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogSXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvIGRldGVybWluZSBpZiB0aGlzIGlzCisgICAgICogdGhlIGNhc2UgYW5kIGlmIG5vdCwgaG93IHRvIHJlc3BvbmQuIFR5cGljYWxseSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUKKyAgICAgKiB0aHJvd24oc3VjaCBhcyB7QGxpbmsgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbn0pIGFuZCB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IGRvY3VtZW50IHRoYXQgZmFjdC4KKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gZmF2b3IgcmVzcG9uZGluZyB0byBhbiBpbnRlcnJ1cHQgb3ZlciBub3JtYWwKKyAgICAgKiBtZXRob2QgcmV0dXJuIGluIHJlc3BvbnNlIHRvIGEgc2lnbmFsLiBJbiB0aGF0IGNhc2UgdGhlIGltcGxlbWVudGF0aW9uCisgICAgICogbXVzdCBlbnN1cmUgdGhhdCB0aGUgc2lnbmFsIGlzIHJlZGlyZWN0ZWQgdG8gYW5vdGhlciB3YWl0aW5nIHRocmVhZCwgaWYKKyAgICAgKiB0aGVyZSBpcyBvbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZChhbmQKKyAgICAgKiBpbnRlcnJ1cHRpb24gb2YgdGhyZWFkIHN1c3BlbnNpb24gaXMgc3VwcG9ydGVkKS4KKyAgICAgKi8KKyAgICB2b2lkIGF3YWl0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBjdXJyZW50IHRocmVhZCB0byB3YWl0IHVudGlsIGl0IGlzIHNpZ25hbGxlZC4KKyAgICAgKiBUaGUgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25kaXRpb24gaXMgYXRvbWljYWxseQorICAgICAqIHJlbGVhc2VkIGFuZCB0aGUgY3VycmVudCB0aHJlYWQgYmVjb21lcyBkaXNhYmxlZCBmb3IgdGhyZWFkIHNjaGVkdWxpbmcKKyAgICAgKiBwdXJwb3NlcyBhbmQgbGllcyBkb3JtYW50IHVudGlsIDxlbT5vbmU8L2VtPiBvZiB0aHJlZSB0aGluZ3MgaGFwcGVuczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlNvbWUgb3RoZXIgdGhyZWFkIGludm9rZXMgdGhlIHtAbGluayAjc2lnbmFsfSBtZXRob2QgZm9yIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gYW5kIHRoZSBjdXJyZW50IHRocmVhZCBoYXBwZW5zIHRvIGJlIGNob3NlbiBhcyB0aGUKKyAgICAgKiB0aHJlYWQgdG8gYmUgYXdha2VuZWQ7IG9yCisgICAgICogPGxpPlNvbWUgb3RoZXIgdGhyZWFkIGludm9rZXMgdGhlIHtAbGluayAjc2lnbmFsQWxsfSBtZXRob2QgZm9yIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD47IG9yCisgICAgICogPGxpPkEgJnF1b3Q7PGVtPnNwdXJpb3VzIHdha2V1cDwvZW0+JnF1b3Q7IG9jY3VycworICAgICAqIDwvdWw+IEluIGFsbCBjYXNlcywgYmVmb3JlIHRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkIG11c3QKKyAgICAgKiByZS1hY3F1aXJlIHRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmRpdGlvbi4gV2hlbiB0aGUKKyAgICAgKiB0aHJlYWQgcmV0dXJucyBpdCBpcyA8ZW0+Z3VhcmFudGVlZDwvZW0+IHRvIGhvbGQgdGhpcyBsb2NrLgorICAgICAqIElmIHRoZSBjdXJyZW50IHRocmVhZCdzIGludGVycnVwdGVkIHN0YXR1cyBpcyBzZXQgd2hlbiBpdCBlbnRlcnMKKyAgICAgKiB0aGlzIG1ldGhvZCwgb3IgaXQgaXMge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0ZWR9CisgICAgICogd2hpbGUgd2FpdGluZywgaXQgd2lsbCBjb250aW51ZSB0byB3YWl0IHVudGlsIHNpZ25hbGxlZC4gV2hlbiBpdCBmaW5hbGx5CisgICAgICogcmV0dXJucyBmcm9tIHRoaXMgbWV0aG9kIGl0cyBpbnRlcnJ1cHRlZCBzdGF0dXMgd2lsbCBzdGlsbCBiZSBzZXQuCisgICAgICogCisgICAgICogPGI+SW1wbGVtZW50YXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+CisgICAgICogVGhlIGN1cnJlbnQgdGhyZWFkIGlzIGFzc3VtZWQgdG8gaG9sZCB0aGUgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIDx0dD5Db25kaXRpb248L3R0PiB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBJdCBpcyB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMKKyAgICAgKiB0aGUgY2FzZSBhbmQgaWYgbm90LCBob3cgdG8gcmVzcG9uZC4gVHlwaWNhbGx5LCBhbiBleGNlcHRpb24gd2lsbCBiZQorICAgICAqIHRocm93bihzdWNoIGFzIHtAbGluayBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9ufSkgYW5kIHRoZQorICAgICAqIGltcGxlbWVudGF0aW9uIG11c3QgZG9jdW1lbnQgdGhhdCBmYWN0LgorICAgICAqLworICAgIHZvaWQgYXdhaXRVbmludGVycnVwdGlibHkoKTsKKworLy8gICAgLyoqCisvLyAgICAgKiBDYXVzZXMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHdhaXQgdW50aWwgaXQgaXMgc2lnbmFsbGVkIG9yIGludGVycnVwdGVkLAorLy8gICAgICogb3IgdGhlIHNwZWNpZmllZCB3YWl0aW5nIHRpbWUgZWxhcHNlcy4KKy8vICAgICAqCisvLyAgICAgKiA8cD5UaGUgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25kaXRpb24gaXMgYXRvbWljYWxseQorLy8gICAgICogcmVsZWFzZWQgYW5kIHRoZSBjdXJyZW50IHRocmVhZCBiZWNvbWVzIGRpc2FibGVkIGZvciB0aHJlYWQgc2NoZWR1bGluZworLy8gICAgICogcHVycG9zZXMgYW5kIGxpZXMgZG9ybWFudCB1bnRpbCA8ZW0+b25lPC9lbT4gb2YgZml2ZSB0aGluZ3MgaGFwcGVuczoKKy8vICAgICAqIDx1bD4KKy8vICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCBpbnZva2VzIHRoZSB7QGxpbmsgI3NpZ25hbH0gbWV0aG9kIGZvciB0aGlzCisvLyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gYW5kIHRoZSBjdXJyZW50IHRocmVhZCBoYXBwZW5zIHRvIGJlIGNob3NlbiBhcyB0aGUKKy8vICAgICAqIHRocmVhZCB0byBiZSBhd2FrZW5lZDsgb3IKKy8vICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCBpbnZva2VzIHRoZSB7QGxpbmsgI3NpZ25hbEFsbH0gbWV0aG9kIGZvciB0aGlzCisvLyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD47IG9yCisvLyAgICAgKiA8bGk+U29tZSBvdGhlciB0aHJlYWQge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0c30gdGhlIGN1cnJlbnQKKy8vICAgICAqIHRocmVhZCwgYW5kIGludGVycnVwdGlvbiBvZiB0aHJlYWQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQ7IG9yCisvLyAgICAgKiA8bGk+VGhlIHNwZWNpZmllZCB3YWl0aW5nIHRpbWUgZWxhcHNlczsgb3IKKy8vICAgICAqIDxsaT5BICZxdW90OzxlbT5zcHVyaW91cyB3YWtldXA8L2VtPiZxdW90OyBvY2N1cnMuCisvLyAgICAgKiA8L3VsPgorLy8gICAgICoKKy8vICAgICAqIDxwPkluIGFsbCBjYXNlcywgYmVmb3JlIHRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkIG11c3QKKy8vICAgICAqIHJlLWFjcXVpcmUgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZGl0aW9uLiBXaGVuIHRoZQorLy8gICAgICogdGhyZWFkIHJldHVybnMgaXQgaXMgPGVtPmd1YXJhbnRlZWQ8L2VtPiB0byBob2xkIHRoaXMgbG9jay4KKy8vICAgICAqCisvLyAgICAgKiA8cD5JZiB0aGUgY3VycmVudCB0aHJlYWQ6CisvLyAgICAgKiA8dWw+CisvLyAgICAgKiA8bGk+aGFzIGl0cyBpbnRlcnJ1cHRlZCBzdGF0dXMgc2V0IG9uIGVudHJ5IHRvIHRoaXMgbWV0aG9kOyBvcgorLy8gICAgICogPGxpPmlzIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdGVkfSB3aGlsZSB3YWl0aW5nCisvLyAgICAgKiBhbmQgaW50ZXJydXB0aW9uIG9mIHRocmVhZCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCwKKy8vICAgICAqIDwvdWw+CisvLyAgICAgKiB0aGVuIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaXMgdGhyb3duIGFuZCB0aGUgY3VycmVudCB0aHJlYWQncworLy8gICAgICogaW50ZXJydXB0ZWQgc3RhdHVzIGlzIGNsZWFyZWQuIEl0IGlzIG5vdCBzcGVjaWZpZWQsIGluIHRoZSBmaXJzdAorLy8gICAgICogY2FzZSwgd2hldGhlciBvciBub3QgdGhlIHRlc3QgZm9yIGludGVycnVwdGlvbiBvY2N1cnMgYmVmb3JlIHRoZSBsb2NrCisvLyAgICAgKiBpcyByZWxlYXNlZC4KKy8vICAgICAqCisvLyAgICAgKiA8cD5UaGUgbWV0aG9kIHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcworLy8gICAgICogcmVtYWluaW5nIHRvIHdhaXQgZ2l2ZW4gdGhlIHN1cHBsaWVkIDx0dD5uYW5vc1RpbWVvdXQ8L3R0PgorLy8gICAgICogdmFsdWUgdXBvbiByZXR1cm4sIG9yIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gaWYgaXQKKy8vICAgICAqIHRpbWVkIG91dC4gVGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgaG93CisvLyAgICAgKiBsb25nIHRvIHJlLXdhaXQgaW4gY2FzZXMgd2hlcmUgdGhlIHdhaXQgcmV0dXJucyBidXQgYW4gYXdhaXRlZAorLy8gICAgICogY29uZGl0aW9uIHN0aWxsIGRvZXMgbm90IGhvbGQuIFR5cGljYWwgdXNlcyBvZiB0aGlzIG1ldGhvZCB0YWtlCisvLyAgICAgKiB0aGUgZm9sbG93aW5nIGZvcm06CisvLyAgICAgKgorLy8gICAgICogPHByZT4KKy8vICAgICAqIHN5bmNocm9uaXplZCBib29sZWFuIGFNZXRob2QobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KSB7CisvLyAgICAgKiAgIGxvbmcgbmFub3NUaW1lb3V0ID0gdW5pdC50b05hbm9zKHRpbWVvdXQpOworLy8gICAgICogICB3aGlsZSAoIWNvbmRpdGlvbkJlaW5nV2FpdGVkRm9yKSB7CisvLyAgICAgKiAgICAgaWYgKG5hbm9zVGltZW91dCAmZ3Q7IDApCisvLyAgICAgKiAgICAgICAgIG5hbm9zVGltZW91dCA9IHRoZUNvbmRpdGlvbi5hd2FpdE5hbm9zKG5hbm9zVGltZW91dCk7CisvLyAgICAgKiAgICAgIGVsc2UKKy8vICAgICAqICAgICAgICByZXR1cm4gZmFsc2U7CisvLyAgICAgKiAgIH0KKy8vICAgICAqIC8vIC4uLgorLy8gICAgICogfQorLy8gICAgICogPC9wcmU+CisvLyAgICAgKgorLy8gICAgICogPHA+IERlc2lnbiBub3RlOiBUaGlzIG1ldGhvZCByZXF1aXJlcyBhIG5hbm9zZWNvbmQgYXJndW1lbnQgc28KKy8vICAgICAqIGFzIHRvIGF2b2lkIHRydW5jYXRpb24gZXJyb3JzIGluIHJlcG9ydGluZyByZW1haW5pbmcgdGltZXMuCisvLyAgICAgKiBTdWNoIHByZWNpc2lvbiBsb3NzIHdvdWxkIG1ha2UgaXQgZGlmZmljdWx0IGZvciBwcm9ncmFtbWVycyB0bworLy8gICAgICogZW5zdXJlIHRoYXQgdG90YWwgd2FpdGluZyB0aW1lcyBhcmUgbm90IHN5c3RlbWF0aWNhbGx5IHNob3J0ZXIKKy8vICAgICAqIHRoYW4gc3BlY2lmaWVkIHdoZW4gcmUtd2FpdHMgb2NjdXIuCisvLyAgICAgKgorLy8gICAgICogPHA+PGI+SW1wbGVtZW50YXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+CisvLyAgICAgKiA8cD5UaGUgY3VycmVudCB0aHJlYWQgaXMgYXNzdW1lZCB0byBob2xkIHRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisvLyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisvLyAgICAgKiBJdCBpcyB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMKKy8vICAgICAqIHRoZSBjYXNlIGFuZCBpZiBub3QsIGhvdyB0byByZXNwb25kLiBUeXBpY2FsbHksIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCisvLyAgICAgKiB0aHJvd24oc3VjaCBhcyB7QGxpbmsgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbn0pIGFuZCB0aGUKKy8vICAgICAqIGltcGxlbWVudGF0aW9uIG11c3QgZG9jdW1lbnQgdGhhdCBmYWN0LgorLy8gICAgICoKKy8vICAgICAqIDxwPkFuIGltcGxlbWVudGF0aW9uIGNhbiBmYXZvciByZXNwb25kaW5nIHRvIGFuIGludGVycnVwdCBvdmVyIG5vcm1hbAorLy8gICAgICogbWV0aG9kIHJldHVybiBpbiByZXNwb25zZSB0byBhIHNpZ25hbCwgb3Igb3ZlciBpbmRpY2F0aW5nIHRoZSBlbGFwc2UKKy8vICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgd2FpdGluZyB0aW1lLiBJbiBlaXRoZXIgY2FzZSB0aGUgaW1wbGVtZW50YXRpb24KKy8vICAgICAqIG11c3QgZW5zdXJlIHRoYXQgdGhlIHNpZ25hbCBpcyByZWRpcmVjdGVkIHRvIGFub3RoZXIgd2FpdGluZyB0aHJlYWQsIGlmCisvLyAgICAgKiB0aGVyZSBpcyBvbmUuCisvLyAgICAgKgorLy8gICAgICogQHBhcmFtIG5hbm9zVGltZW91dCB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQsIGluIG5hbm9zZWNvbmRzCisvLyAgICAgKiBAcmV0dXJuIEEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gaWYgdGhlIHdhaXQgaGFzCisvLyAgICAgKiB0aW1lZCBvdXQ7IG90aGVyd2lzZSBhbiBlc3RpbWF0ZSwgdGhhdAorLy8gICAgICogaXMgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSA8dHQ+bmFub3NUaW1lb3V0PC90dD4gYXJndW1lbnQsCisvLyAgICAgKiBvZiB0aGUgdGltZSBzdGlsbCByZW1haW5pbmcgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5lZC4KKy8vICAgICAqCisvLyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZChhbmQKKy8vICAgICAqIGludGVycnVwdGlvbiBvZiB0aHJlYWQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQpLgorLy8gICAgICovCisvLyAgICBsb25nIGF3YWl0TmFub3MobG9uZyBuYW5vc1RpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgY3VycmVudCB0aHJlYWQgdG8gd2FpdCB1bnRpbCBpdCBpcyBzaWduYWxsZWQgb3IgaW50ZXJydXB0ZWQsCisgICAgICogb3IgdGhlIHNwZWNpZmllZCB3YWl0aW5nIHRpbWUgZWxhcHNlcy4gVGhpcyBtZXRob2QgaXMgYmVoYXZpb3JhbGx5CisgICAgICogZXF1aXZhbGVudCB0bzo8YnI+CisgICAgICogPHByZT4gYXdhaXROYW5vcyh1bml0LnRvTmFub3ModGltZSkpICZndDsgMAorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWUgdGhlIG1heGltdW0gdGltZSB0byB3YWl0CisgICAgICogQHBhcmFtIHVuaXQgdGhlIHRpbWUgdW5pdCBvZiB0aGUgPHR0PnRpbWU8L3R0PiBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIDx0dD5mYWxzZTwvdHQ+IGlmIHRoZSB3YWl0aW5nIHRpbWUgZGV0ZWN0YWJseSBlbGFwc2VkCisgICAgICogYmVmb3JlIHJldHVybiBmcm9tIHRoZSBtZXRob2QsIGVsc2UgPHR0PnRydWU8L3R0Pi4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZChhbmQKKyAgICAgKiBpbnRlcnJ1cHRpb24gb2YgdGhyZWFkIHN1c3BlbnNpb24gaXMgc3VwcG9ydGVkKS4KKyAgICAgKi8KKyAgICBib29sZWFuIGF3YWl0KGxvbmcgdGltZSwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBjdXJyZW50IHRocmVhZCB0byB3YWl0IHVudGlsIGl0IGlzIHNpZ25hbGxlZCBvciBpbnRlcnJ1cHRlZCwKKyAgICAgKiBvciB0aGUgc3BlY2lmaWVkIGRlYWRsaW5lIGVsYXBzZXMuCisgICAgICogVGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZGl0aW9uIGlzIGF0b21pY2FsbHkKKyAgICAgKiByZWxlYXNlZCBhbmQgdGhlIGN1cnJlbnQgdGhyZWFkIGJlY29tZXMgZGlzYWJsZWQgZm9yIHRocmVhZCBzY2hlZHVsaW5nCisgICAgICogcHVycG9zZXMgYW5kIGxpZXMgZG9ybWFudCB1bnRpbCA8ZW0+b25lPC9lbT4gb2YgZml2ZSB0aGluZ3MgaGFwcGVuczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlNvbWUgb3RoZXIgdGhyZWFkIGludm9rZXMgdGhlIHtAbGluayAjc2lnbmFsfSBtZXRob2QgZm9yIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gYW5kIHRoZSBjdXJyZW50IHRocmVhZCBoYXBwZW5zIHRvIGJlIGNob3NlbiBhcyB0aGUKKyAgICAgKiB0aHJlYWQgdG8gYmUgYXdha2VuZWQ7IG9yCisgICAgICogPGxpPlNvbWUgb3RoZXIgdGhyZWFkIGludm9rZXMgdGhlIHtAbGluayAjc2lnbmFsQWxsfSBtZXRob2QgZm9yIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD47IG9yCisgICAgICogPGxpPlNvbWUgb3RoZXIgdGhyZWFkIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdHN9IHRoZSBjdXJyZW50CisgICAgICogdGhyZWFkLCBhbmQgaW50ZXJydXB0aW9uIG9mIHRocmVhZCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZDsgb3IKKyAgICAgKiA8bGk+VGhlIHNwZWNpZmllZCBkZWFkbGluZSBlbGFwc2VzOyBvcgorICAgICAqIDxsaT5BICZxdW90OzxlbT5zcHVyaW91cyB3YWtldXA8L2VtPiZxdW90OyBvY2N1cnMuCisgICAgICogPC91bD4gSW4gYWxsIGNhc2VzLCBiZWZvcmUgdGhpcyBtZXRob2QgY2FuIHJldHVybiB0aGUgY3VycmVudCB0aHJlYWQgbXVzdAorICAgICAqIHJlLWFjcXVpcmUgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZGl0aW9uLiBXaGVuIHRoZQorICAgICAqIHRocmVhZCByZXR1cm5zIGl0IGlzIDxlbT5ndWFyYW50ZWVkPC9lbT4gdG8gaG9sZCB0aGlzIGxvY2suCisgICAgICogIElmIHRoZSBjdXJyZW50IHRocmVhZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmhhcyBpdHMgaW50ZXJydXB0ZWQgc3RhdHVzIHNldCBvbiBlbnRyeSB0byB0aGlzIG1ldGhvZDsgb3IKKyAgICAgKiA8bGk+aXMge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0ZWR9IHdoaWxlIHdhaXRpbmcKKyAgICAgKiBhbmQgaW50ZXJydXB0aW9uIG9mIHRocmVhZCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCwKKyAgICAgKiA8L3VsPgorICAgICAqIHRoZW4ge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufSBpcyB0aHJvd24gYW5kIHRoZSBjdXJyZW50IHRocmVhZCdzCisgICAgICogaW50ZXJydXB0ZWQgc3RhdHVzIGlzIGNsZWFyZWQuIEl0IGlzIG5vdCBzcGVjaWZpZWQsIGluIHRoZSBmaXJzdAorICAgICAqIGNhc2UsIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0IGZvciBpbnRlcnJ1cHRpb24gb2NjdXJzIGJlZm9yZSB0aGUgbG9jaworICAgICAqIGlzIHJlbGVhc2VkLgorICAgICAqICBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWFkbGluZSBoYXMgZWxhcHNlZCwKKyAgICAgKiB3aGljaCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+IHN5bmNocm9uaXplZCBib29sZWFuIGFNZXRob2QoRGF0ZSBkZWFkbGluZSkgeworICAgICAqIGJvb2xlYW4gc3RpbGxXYWl0aW5nID0gdHJ1ZTsgd2hpbGUgKCFjb25kaXRpb25CZWluZ1dhaXRlZEZvcikgeworICAgICAqIGlmIChzdGlsbFdhaXRpbmcpIHN0aWxsV2FpdGluZyA9IHRoZUNvbmRpdGlvbi5hd2FpdFVudGlsKGRlYWRsaW5lKTsgZWxzZQorICAgICAqIHJldHVybiBmYWxzZTsgfSAvLyAuLi4gfQorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIFRoZSBjdXJyZW50IHRocmVhZCBpcyBhc3N1bWVkIHRvIGhvbGQgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogSXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvIGRldGVybWluZSBpZiB0aGlzIGlzCisgICAgICogdGhlIGNhc2UgYW5kIGlmIG5vdCwgaG93IHRvIHJlc3BvbmQuIFR5cGljYWxseSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUKKyAgICAgKiB0aHJvd24oc3VjaCBhcyB7QGxpbmsgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbn0pIGFuZCB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IGRvY3VtZW50IHRoYXQgZmFjdC4KKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gZmF2b3IgcmVzcG9uZGluZyB0byBhbiBpbnRlcnJ1cHQgb3ZlciBub3JtYWwKKyAgICAgKiBtZXRob2QgcmV0dXJuIGluIHJlc3BvbnNlIHRvIGEgc2lnbmFsLCBvciBvdmVyIGluZGljYXRpbmcgdGhlIHBhc3NpbmcKKyAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIGRlYWRsaW5lLiBJbiBlaXRoZXIgY2FzZSB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzaWduYWwgaXMgcmVkaXJlY3RlZCB0byBhbm90aGVyIHdhaXRpbmcgdGhyZWFkLCBpZgorICAgICAqIHRoZXJlIGlzIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWFkbGluZSB0aGUgYWJzb2x1dGUgdGltZSB0byB3YWl0IHVudGlsCisgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgZGVhZGxpbmUgaGFzCisgICAgICogZWxhcHNlZCB1cG9uIHJldHVybiwgZWxzZSA8dHQ+dHJ1ZTwvdHQ+LgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkKGFuZAorICAgICAqIGludGVycnVwdGlvbiBvZiB0aHJlYWQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQpLgorICAgICAqLworICAgIGJvb2xlYW4gYXdhaXRVbnRpbChEYXRlIGRlYWRsaW5lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXYWtlcyB1cCBvbmUgd2FpdGluZyB0aHJlYWQuCisgICAgICogSWYgYW55IHRocmVhZHMgYXJlIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gdGhlbiBvbmUKKyAgICAgKiBpcyBzZWxlY3RlZCBmb3Igd2FraW5nIHVwLiBUaGF0IHRocmVhZCBtdXN0IHRoZW4gcmUtYWNxdWlyZSB0aGUKKyAgICAgKiBsb2NrIGJlZm9yZSByZXR1cm5pbmcgZnJvbSA8dHQ+YXdhaXQ8L3R0Pi4KKyAgICAgKi8KKyAgICB2b2lkIHNpZ25hbCgpOworCisgICAgLyoqCisgICAgICogV2FrZXMgdXAgYWxsIHdhaXRpbmcgdGhyZWFkcy4KKyAgICAgKiBJZiBhbnkgdGhyZWFkcyBhcmUgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbiB0aGVuIHRoZXkgYXJlCisgICAgICogYWxsIHdva2VuIHVwLiBFYWNoIHRocmVhZCBtdXN0IHJlLWFjcXVpcmUgdGhlIGxvY2sgYmVmb3JlIGl0IGNhbgorICAgICAqIHJldHVybiBmcm9tIDx0dD5hd2FpdDwvdHQ+LgorICAgICAqLworICAgIHZvaWQgc2lnbmFsQWxsKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODk1MjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3QuamF2YQpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgRGF3aWQgS3VyenluaWVjLCBvbiB0aGUgYmFzaXMgb2YgcHVibGljIHNwZWNpZmljYXRpb25zIGFuZAorICogcHVibGljIGRvbWFpbiBzb3VyY2VzIGZyb20gSlNSIDE2NiwgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLAorICogYXMgZXhwbGFpbmVkIGF0IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIENvcHlPbldyaXRlQXJyYXlMaXN0IGltcGxlbWVudHMgTGlzdCwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODY3MzI2NDE5NTc0Nzk0MjU5NUw7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIHRyYW5zaWVudCBPYmplY3RbXSBhcnJheTsKKworICAgIHB1YmxpYyBDb3B5T25Xcml0ZUFycmF5TGlzdCgpIHsKKyAgICAgICAgc2V0QXJyYXkobmV3IE9iamVjdFswXSk7CisgICAgfQorCisgICAgcHVibGljIENvcHlPbldyaXRlQXJyYXlMaXN0KENvbGxlY3Rpb24gYykgeworICAgICAgICAvLyBtdXN0IGRlYWwgd2l0aCBjb25jdXJyZW50IGNvbGxlY3Rpb25zCisgICAgICAgIE9iamVjdFtdIGFycmF5ID0gYy50b0FycmF5KCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgT2JqZWN0W10gdHlwZQorICAgICAgICBpZiAoYXJyYXkuZ2V0Q2xhc3MoKSAhPSBPYmplY3RbXS5jbGFzcykgeworICAgICAgICAgICAgYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBhcnJheS5sZW5ndGgsIE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhc3N1bWUgdGhhdCBjLnRvQXJyYXkoKSBoYXMgcmV0dXJuZWQgYSBuZXcgYXJyYXkgaW5zdGFuY2UsIGFzCisgICAgICAgIC8vIHJlcXVpcmVkIGJ5IHRoZSBzcGVjCisgICAgICAgIHNldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29weU9uV3JpdGVBcnJheUxpc3QoT2JqZWN0W10gYXJyYXkpIHsKKyAgICAgICAgc2V0QXJyYXkoQXJyYXlzLmNvcHlPZihhcnJheSwgYXJyYXkubGVuZ3RoLCBPYmplY3RbXS5jbGFzcykpOworICAgIH0KKworICAgIGZpbmFsIE9iamVjdFtdIGdldEFycmF5KCkgeworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBzZXRBcnJheShPYmplY3RbXSBhcnJheSkgeworICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gZ2V0QXJyYXkoKS5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEFycmF5KCkubGVuZ3RoID09IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNlYXJjaChPYmplY3RbXSBhcnJheSwgT2JqZWN0IHN1YmplY3QsIGludCBwb3MsCisgICAgICAgIGludCBlbmQpIHsKKyAgICAgICAgaWYgKHN1YmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICg7IHBvcyA8IGVuZDsgcG9zKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlbcG9zXSA9PSBudWxsKSByZXR1cm4gcG9zOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICg7IHBvcyA8IGVuZDsgcG9zKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5lcXVhbHMoYXJyYXlbcG9zXSkpIHJldHVybiBwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCByZXZlcnNlU2VhcmNoKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgc3ViamVjdCwgaW50IHN0YXJ0LAorICAgICAgICBpbnQgcG9zKSB7CisgICAgICAgIGlmIChzdWJqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAocG9zLS07IHBvcyA+PSBzdGFydDsgcG9zLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlbcG9zXSA9PSBudWxsKSByZXR1cm4gcG9zOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChwb3MtLTsgcG9zID49IHN0YXJ0OyBwb3MtLSkgeworICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmVxdWFscyhhcnJheVtwb3NdKSkgcmV0dXJuIHBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICByZXR1cm4gc2VhcmNoKGFycmF5LCBvLCAwLCBhcnJheS5sZW5ndGgpID49IDA7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IENPV0l0ZXJhdG9yKGdldEFycmF5KCksIDApOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKGFycmF5LCBhcnJheS5sZW5ndGgsIE9iamVjdFtdLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7CisgICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKKyAgICAgICAgaWYgKGEubGVuZ3RoIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZihhcnJheSwgbGVuZ3RoLCBhLmdldENsYXNzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgYSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChhLmxlbmd0aCA+IGxlbmd0aCkgYVtsZW5ndGhdID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgT2JqZWN0W10gb2xkYXJyID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBvbGRhcnIubGVuZ3RoOworICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtsZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCAwLCBuZXdhcnIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICBuZXdhcnJbbGVuZ3RoXSA9IG87CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRJZkFic2VudChPYmplY3QgbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG9sZGFyciA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gb2xkYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChzZWFyY2goYXJyYXksIG8sIDAsIGxlbmd0aCkgPj0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtsZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCAwLCBuZXdhcnIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICBuZXdhcnJbbGVuZ3RoXSA9IG87CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFkZEFsbEFic2VudChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgT2JqZWN0W10gYXJyID0gYy50b0FycmF5KCk7CisgICAgICAgIGlmIChhcnIubGVuZ3RoID09IDApIHJldHVybiAwOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG9sZGFyciA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgb2xkbGVuZ3RoID0gb2xkYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIE9iamVjdFtdIHRtcCA9IG5ldyBPYmplY3RbYXJyLmxlbmd0aF07CisgICAgICAgICAgICBpbnQgYWRkZWQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGFycltpXTsKKyAgICAgICAgICAgICAgICBpZiAoc2VhcmNoKG9sZGFyciwgbywgMCwgb2xkbGVuZ3RoKSA8IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgc2VhcmNoKHRtcCwgbywgMCwgYWRkZWQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB0bXBbYWRkZWQrK10gPSBvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRlZCA9PSAwKSByZXR1cm4gMDsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3Rbb2xkbGVuZ3RoICsgYWRkZWRdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRhcnIsIDAsIG5ld2FyciwgMCwgb2xkbGVuZ3RoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBuZXdhcnIsIG9sZGxlbmd0aCwgYWRkZWQpOworICAgICAgICAgICAgc2V0QXJyYXkobmV3YXJyKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgICAgICAgICBpbnQgcG9zID0gc2VhcmNoKGFycmF5LCBvLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgaWYgKHBvcyA8IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbGVuZ3RoIC0gMV07CisgICAgICAgICAgICBpbnQgbW92ZWQgPSBsZW5ndGggLSBwb3MgLSAxOworICAgICAgICAgICAgaWYgKHBvcyA+IDApIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld2FyciwgMCwgcG9zKTsKKyAgICAgICAgICAgIGlmIChtb3ZlZCA+IDApIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHBvcyArIDEsIG5ld2FyciwgcG9zLCBtb3ZlZCk7CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGlmIChzZWFyY2goYXJyYXksIGl0ci5uZXh0KCksIDAsIGFycmF5Lmxlbmd0aCkgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICAvLyBtdXN0IGRlYWwgd2l0aCBjb25jdXJyZW50IGNvbGxlY3Rpb25zCisgICAgICAgIE9iamVjdFtdIGNhID0gYy50b0FycmF5KCk7CisgICAgICAgIGlmIChjYS5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG9sZGFyciA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gb2xkYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbGVuZ3RoICsgY2EubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCAwLCBuZXdhcnIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICBpbnQgcG9zID0gbGVuZ3RoOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjYSwgMCwgbmV3YXJyLCBwb3MsIGNhLmxlbmd0aCk7CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgLy8gbXVzdCBkZWFsIHdpdGggY29uY3VycmVudCBjb2xsZWN0aW9ucworICAgICAgICBPYmplY3RbXSBjYSA9IGMudG9BcnJheSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG9sZGFyciA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gb2xkYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCisgICAgICAgICAgICAgICAgICAgICIsIFNpemU6ICIgKyBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBPYmplY3RbXSBuZXdhcnIgPSBuZXcgT2JqZWN0W2xlbmd0aCArIGNhLmxlbmd0aF07CisgICAgICAgICAgICBpbnQgbW92ZWQgPSBsZW5ndGggLSBpbmRleDsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCAwLCBuZXdhcnIsIDAsIGluZGV4KTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2EsIDAsIG5ld2FyciwgaW5kZXgsIGNhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAobW92ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtCisgICAgICAgICAgICAgICAgICAgIC5hcnJheWNvcHkob2xkYXJyLCBpbmRleCwgbmV3YXJyLCBpbmRleCArIGNhLmxlbmd0aCwgbW92ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0QXJyYXkobmV3YXJyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICBpZiAoYy5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworICAgICAgICAgICAgT2JqZWN0W10gdG1wID0gbmV3IE9iamVjdFtsZW5ndGhdOworICAgICAgICAgICAgaW50IG5ld2xlbiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBhcnJheVtpXTsKKyAgICAgICAgICAgICAgICBpZiAoIWMuY29udGFpbnMobykpIHRtcFtuZXdsZW4rK10gPSBvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld2xlbiA9PSBsZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbmV3bGVuXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBuZXdhcnIsIDAsIG5ld2xlbik7CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKKyAgICAgICAgICAgIE9iamVjdFtdIHRtcCA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKKyAgICAgICAgICAgIGludCBuZXdsZW4gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gYXJyYXlbaV07CisgICAgICAgICAgICAgICAgaWYgKGMuY29udGFpbnMobykpIHRtcFtuZXdsZW4rK10gPSBvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld2xlbiA9PSBsZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbmV3bGVuXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBuZXdhcnIsIDAsIG5ld2xlbik7CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgc2V0QXJyYXkobmV3IE9iamVjdFswXSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBMaXN0SXRlcmF0b3IgaXRyID0gKChMaXN0KSBvKS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgd2hpbGUgKGlkeCA8IGxlbmd0aCAmJiBpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3QgbzEgPSBhcnJheVtpZHgrK107CisgICAgICAgICAgICBPYmplY3QgbzIgPSBpdHIubmV4dCgpOworICAgICAgICAgICAgaWYgKCFlcShvMSwgbzIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChpZHggPT0gbGVuZ3RoICYmICFpdHIuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaENvZGUgPSAxOworICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgIGludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gYXJyYXlbaV07CisgICAgICAgICAgICBoYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyAobyA9PSBudWxsID8gMCA6IG8uaGFzaENvZGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0QXJyYXkoKVtpbmRleF07CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG9sZGFyciA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gb2xkYXJyLmxlbmd0aDsKKyAgICAgICAgICAgIC8vIHBpZ2d5YmFjayB0aGUgYXJyYXkgYm91bmRzIGNoZWNrCisgICAgICAgICAgICBPYmplY3Qgb2xkVmFsID0gb2xkYXJyW2luZGV4XTsKKyAgICAgICAgICAgIGlmIChvbGRWYWwgPT0gZWxlbWVudCkgeworICAgICAgICAgICAgICAgIHNldEFycmF5KG9sZGFycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9sZGFyciwgMCwgbmV3YXJyLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIG5ld2FycltpbmRleF0gPSBlbGVtZW50OworICAgICAgICAgICAgICAgIHNldEFycmF5KG5ld2Fycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb2xkVmFsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBPYmplY3RbXSBvbGRhcnIgPSBnZXRBcnJheSgpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IG9sZGFyci5sZW5ndGg7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKworICAgICAgICAgICAgICAgICAgICAiLCBTaXplOiAiICsgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbGVuZ3RoICsgMV07CisgICAgICAgICAgICBpbnQgbW92ZWQgPSBsZW5ndGggLSBpbmRleDsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCAwLCBuZXdhcnIsIDAsIGluZGV4KTsKKyAgICAgICAgICAgIG5ld2FycltpbmRleF0gPSBlbGVtZW50OworICAgICAgICAgICAgaWYgKG1vdmVkID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCBpbmRleCwgbmV3YXJyLCBpbmRleCArIDEsIG1vdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFycmF5KG5ld2Fycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCisgICAgICAgICAgICAgICAgICAgICIsIFNpemU6ICIgKyBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGFycmF5W2luZGV4XTsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbbGVuZ3RoIC0gMV07CisgICAgICAgICAgICBpbnQgbW92ZWQgPSBsZW5ndGggLSBpbmRleCAtIDE7CisgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdhcnIsIDAsIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChtb3ZlZCA+IDApCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyAxLCBuZXdhcnIsIGluZGV4LCBtb3ZlZCk7CisgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgeworICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgIHJldHVybiBzZWFyY2goYXJyYXksIG8sIDAsIGFycmF5Lmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICByZXR1cm4gc2VhcmNoKGFycmF5LCBvLCBpbmRleCwgYXJyYXkubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VTZWFyY2goYXJyYXksIG8sIDAsIGFycmF5Lmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbywgaW50IGluZGV4KSB7CisgICAgICAgIE9iamVjdFtdIGFycmF5ID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VTZWFyY2goYXJyYXksIG8sIDAsIGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDT1dJdGVyYXRvcihnZXRBcnJheSgpLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gYXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCisgICAgICAgICAgICAgICAgIiwgU2l6ZTogIiArIGFycmF5Lmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDT1dJdGVyYXRvcihhcnJheSwgaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICBpZiAoZnJvbUluZGV4IDwgMCB8fCB0b0luZGV4ID4gYXJyYXkubGVuZ3RoIHx8IGZyb21JbmRleCA+IHRvSW5kZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDT1dTdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCAtIGZyb21JbmRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworICAgICAgICBvdXQud3JpdGVJbnQobGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChhcnJheVtpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisgICAgICAgIGludCBsZW5ndGggPSBpbi5yZWFkSW50KCk7CisgICAgICAgIE9iamVjdFtdIGFycmF5ID0gbmV3IE9iamVjdFtsZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhcnJheVtpXSA9IGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRBcnJheShhcnJheSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYXJyYXlbaV0pOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDT1dJdGVyYXRvciBpbXBsZW1lbnRzIExpc3RJdGVyYXRvciB7CisKKyAgICAgICAgZmluYWwgT2JqZWN0W10gYXJyYXk7CisgICAgICAgIGludCBjdXJzb3I7CisKKyAgICAgICAgQ09XSXRlcmF0b3IoT2JqZWN0W10gYXJyYXksIGludCBjdXJzb3IpIHsKKyAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKyAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gY3Vyc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IgPCBhcnJheS5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IgPiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlbY3Vyc29yKytdOworICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRvZG86IHNob3VsZCBkZWNyZW1lbnQgY3Vyc29yIG9uIGZhaWx1cmU/Li4uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVstLWN1cnNvcl07CisgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdG9kbzogc2hvdWxkIGRlY3JlbWVudCBjdXJzb3Igb24gZmFpbHVyZT8uLi4KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3QgdmFsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ09XU3ViTGlzdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgTGlzdCB7CisKKyAgICAgICAgZmluYWwgaW50IG9mZnNldDsKKyAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgT2JqZWN0W10gZXhwZWN0ZWRBcnJheTsKKworICAgICAgICBDT1dTdWJMaXN0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICB0aGlzLmV4cGVjdGVkQXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoID09IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIHNlYXJjaChnZXRBcnJheSgpLCBvLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkgPj0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtsZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgb2Zmc2V0LCBuZXdhcnIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gbmV3YXJyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYSkgeworICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICAgICAgaWYgKGEubGVuZ3RoIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYSA9IChPYmplY3RbXSkgQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKGEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIG9mZnNldCwgYSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgb2Zmc2V0LCBhLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChhLmxlbmd0aCA+IGxlbmd0aCkgYVtsZW5ndGhdID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7CisgICAgICAgICAgICBhZGQobGVuZ3RoLCBvKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaW50IGZ1bGxMZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IHNlYXJjaChhcnJheSwgbywgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChwb3MgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtmdWxsTGVuZ3RoIC0gMV07CisgICAgICAgICAgICAgICAgaW50IG1vdmVkID0gbGVuZ3RoIC0gcG9zIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgbmV3YXJyLCAwLCBwb3MpOworICAgICAgICAgICAgICAgIGlmIChtb3ZlZCA+IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHBvcyArIDEsIG5ld2FyciwgcG9zLCBtb3ZlZCk7CisgICAgICAgICAgICAgICAgc2V0QXJyYXkobmV3YXJyKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZEFycmF5ID0gbmV3YXJyOworICAgICAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VhcmNoKGFycmF5LCBpdHIubmV4dCgpLCBvZmZzZXQsIGxlbmd0aCkgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRBbGwobGVuZ3RoLCBjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgeworICAgICAgICAgICAgaW50IGFkZGVkID0gYy5zaXplKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBTaXplOiAiICsgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0W10gb2xkYXJyID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkYXJyICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgZnVsbExlbmd0aCA9IG9sZGFyci5sZW5ndGg7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtmdWxsTGVuZ3RoICsgYWRkZWRdOworICAgICAgICAgICAgICAgIGludCBwb3MgPSBvZmZzZXQgKyBpbmRleDsKKyAgICAgICAgICAgICAgICBpbnQgbmV3cG9zID0gcG9zOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCAwLCBuZXdhcnIsIDAsIHBvcyk7CisgICAgICAgICAgICAgICAgaW50IHJlbSA9IGZ1bGxMZW5ndGggLSBwb3M7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIG5ld2FycltuZXdwb3MrK10gPSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVtID4gMCkgU3lzdGVtLmFycmF5Y29weShvbGRhcnIsIHBvcywgbmV3YXJyLCBuZXdwb3MsIHJlbSk7CisgICAgICAgICAgICAgICAgc2V0QXJyYXkobmV3YXJyKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZEFycmF5ID0gbmV3YXJyOworICAgICAgICAgICAgICAgIGxlbmd0aCArPSBhZGRlZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgICAgIGlmIChjLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgc3luY2hyb25pemVkIChDb3B5T25Xcml0ZUFycmF5TGlzdC50aGlzKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICAgICAgICAgIGlmIChhcnJheSAhPSBleHBlY3RlZEFycmF5KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGludCBmdWxsTGVuZ3RoID0gYXJyYXkubGVuZ3RoOworICAgICAgICAgICAgICAgIE9iamVjdFtdIHRtcCA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBpbnQgcmV0YWluZWQgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGFycmF5W2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoIWMuY29udGFpbnMobykpIHRtcFtyZXRhaW5lZCsrXSA9IG87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXRhaW5lZCA9PSBsZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBuZXdhcnIgPSBuZXcgT2JqZWN0W2Z1bGxMZW5ndGggKyByZXRhaW5lZCAtIGxlbmd0aF07CisgICAgICAgICAgICAgICAgaW50IG1vdmVkID0gZnVsbExlbmd0aCAtIG9mZnNldCAtIGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgbmV3YXJyLCAwLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChyZXRhaW5lZCA+IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBuZXdhcnIsIG9mZnNldCwgcmV0YWluZWQpOworICAgICAgICAgICAgICAgIGlmIChtb3ZlZCA+IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIG9mZnNldCArIGxlbmd0aCwgbmV3YXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgcmV0YWluZWQsIG1vdmVkKTsKKyAgICAgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkQXJyYXkgPSBuZXdhcnI7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcmV0YWluZWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaW50IGZ1bGxMZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gdG1wID0gbmV3IE9iamVjdFtsZW5ndGhdOworICAgICAgICAgICAgICAgIGludCByZXRhaW5lZCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gYXJyYXlbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjLmNvbnRhaW5zKG8pKSB0bXBbcmV0YWluZWQrK10gPSBvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmV0YWluZWQgPT0gbGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtmdWxsTGVuZ3RoICsgcmV0YWluZWQgLSBsZW5ndGhdOworICAgICAgICAgICAgICAgIGludCBtb3ZlZCA9IGZ1bGxMZW5ndGggLSBvZmZzZXQgLSBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld2FyciwgMCwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0YWluZWQgPiAwKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRtcCwgMCwgbmV3YXJyLCBvZmZzZXQsIHJldGFpbmVkKTsKKyAgICAgICAgICAgICAgICBpZiAobW92ZWQgPiAwKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBvZmZzZXQgKyBsZW5ndGgsIG5ld2FyciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIHJldGFpbmVkLCBtb3ZlZCk7CisgICAgICAgICAgICAgICAgc2V0QXJyYXkobmV3YXJyKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZEFycmF5ID0gbmV3YXJyOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJldGFpbmVkOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaW50IGZ1bGxMZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtmdWxsTGVuZ3RoIC0gbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBpbnQgbW92ZWQgPSBmdWxsTGVuZ3RoIC0gb2Zmc2V0IC0gbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdhcnIsIDAsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKG1vdmVkID4gMCkKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgb2Zmc2V0ICsgbGVuZ3RoLCBuZXdhcnIsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkKTsKKyAgICAgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkQXJyYXkgPSBuZXdhcnI7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIE9iamVjdFtdIGFycmF5OworICAgICAgICAgICAgaW50IGxhc3Q7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgbGFzdCA9IG9mZnNldCArIGxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3RJdGVyYXRvciBpdHIgPSAoKExpc3QpIG8pLmxpc3RJdGVyYXRvcigpOworICAgICAgICAgICAgaW50IGlkeCA9IG9mZnNldDsKKyAgICAgICAgICAgIHdoaWxlIChpZHggPCBsYXN0ICYmIGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbzEgPSBhcnJheVtpZHhdOworICAgICAgICAgICAgICAgIE9iamVjdCBvMiA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFlcShvMSwgbzIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGlkeCA9PSBsYXN0ICYmICFpdHIuaGFzTmV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSAxOworICAgICAgICAgICAgT2JqZWN0W10gYXJyYXk7CisgICAgICAgICAgICBpbnQgbGFzdDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29weU9uV3JpdGVBcnJheUxpc3QudGhpcykgeworICAgICAgICAgICAgICAgIGFycmF5ID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXkgIT0gZXhwZWN0ZWRBcnJheSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBsYXN0ID0gb2Zmc2V0ICsgbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gYXJyYXlbaV07CisgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgKG8gPT0gbnVsbCA/IDAgOiBvLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGhhc2hDb2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0QXJyYXkoKVtvZmZzZXQgKyBpbmRleF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBTaXplOiAiICsgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0W10gb2xkYXJyID0gZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkYXJyICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaW50IGZ1bGxMZW5ndGggPSBvbGRhcnIubGVuZ3RoOworICAgICAgICAgICAgICAgIC8vIHBpZ2d5YmFjayB0aGUgYXJyYXkgYm91bmRzIGNoZWNrCisgICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbCA9IG9sZGFycltvZmZzZXQgKyBpbmRleF07CisgICAgICAgICAgICAgICAgaWYgKG9sZFZhbCA9PSBlbGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHNldEFycmF5KG9sZGFycik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3YXJyID0gbmV3IE9iamVjdFtmdWxsTGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRhcnIsIDAsIG5ld2FyciwgMCwgZnVsbExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG5ld2FycltvZmZzZXQgKyBpbmRleF0gPSBlbGVtZW50OworICAgICAgICAgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEFycmF5ID0gbmV3YXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29weU9uV3JpdGVBcnJheUxpc3QudGhpcykgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgU2l6ZTogIiArIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE9iamVjdFtdIG9sZGFyciA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZGFyciAhPSBleHBlY3RlZEFycmF5KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGludCBmdWxsTGVuZ3RoID0gb2xkYXJyLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBuZXdhcnIgPSBuZXcgT2JqZWN0W2Z1bGxMZW5ndGggKyAxXTsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gb2Zmc2V0ICsgaW5kZXg7CisgICAgICAgICAgICAgICAgaW50IG1vdmVkID0gZnVsbExlbmd0aCAtIHBvczsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9sZGFyciwgMCwgbmV3YXJyLCAwLCBwb3MpOworICAgICAgICAgICAgICAgIG5ld2Fycltwb3NdID0gZWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAobW92ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkYXJyLCBwb3MsIG5ld2FyciwgcG9zICsgMSwgbW92ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRBcnJheShuZXdhcnIpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkQXJyYXkgPSBuZXdhcnI7CisgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29weU9uV3JpdGVBcnJheUxpc3QudGhpcykgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIFNpemU6ICIgKyBsZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaW50IGZ1bGxMZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IG9mZnNldCArIGluZGV4OworICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBhcnJheVtwb3NdOworICAgICAgICAgICAgICAgIE9iamVjdFtdIG5ld2FyciA9IG5ldyBPYmplY3RbZnVsbExlbmd0aCAtIDFdOworICAgICAgICAgICAgICAgIGludCBtb3ZlZCA9IGZ1bGxMZW5ndGggLSBwb3MgLSAxOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld2FyciwgMCwgcG9zKTsKKyAgICAgICAgICAgICAgICBpZiAobW92ZWQgPiAwKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBwb3MgKyAxLCBuZXdhcnIsIHBvcywgbW92ZWQpOworICAgICAgICAgICAgICAgIHNldEFycmF5KG5ld2Fycik7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRBcnJheSA9IG5ld2FycjsKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpbnQgcG9zID0gc2VhcmNoKGdldEFycmF5KCksIG8sIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBwb3MgPj0gMCA/IHBvcyAtIG9mZnNldCA6IC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGludCBwb3MgPQorICAgICAgICAgICAgICAgIHNlYXJjaChnZXRBcnJheSgpLCBvLCBvZmZzZXQgKyBpbmRleCwgb2Zmc2V0ICsgbGVuZ3RoKSAtIG9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBwb3MgPj0gMCA/IHBvcyAtIG9mZnNldCA6IC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworICAgICAgICAgICAgaW50IHBvcyA9IHJldmVyc2VTZWFyY2goZ2V0QXJyYXkoKSwgbywgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpCisgICAgICAgICAgICAgICAgLSBvZmZzZXQ7CisgICAgICAgICAgICByZXR1cm4gcG9zID49IDAgPyBwb3MgLSBvZmZzZXQgOiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8sIGludCBpbmRleCkgeworICAgICAgICAgICAgaW50IHBvcyA9CisgICAgICAgICAgICAgICAgcmV2ZXJzZVNlYXJjaChnZXRBcnJheSgpLCBvLCBvZmZzZXQsIG9mZnNldCArIGluZGV4KSAtIG9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBwb3MgPj0gMCA/IHBvcyAtIG9mZnNldCA6IC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7CisgICAgICAgICAgICAvLyBtdXN0IHN5bmNocm9uaXplIHRvIGF0b21pY2FsbHkgb2J0YWluIHRoZSBhcnJheSBhbmQgbGVuZ3RoCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvcHlPbldyaXRlQXJyYXlMaXN0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDT1dTdWJJdGVyYXRvcihhcnJheSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIC8vIG11c3Qgc3luY2hyb25pemUgdG8gYXRvbWljYWxseSBvYnRhaW4gdGhlIGFycmF5IGFuZCBsZW5ndGgKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29weU9uV3JpdGVBcnJheUxpc3QudGhpcykgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIFNpemU6ICIgKyBsZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3RbXSBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ICE9IGV4cGVjdGVkQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDT1dTdWJJdGVyYXRvcihhcnJheSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChmcm9tSW5kZXggPCAwIHx8IHRvSW5kZXggPiBsZW5ndGggfHwgZnJvbUluZGV4ID4gdG9JbmRleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENPV1N1Ykxpc3Qob2Zmc2V0ICsgZnJvbUluZGV4LCB0b0luZGV4IC0gZnJvbUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBPYmplY3RbXSBhcnJheTsKKyAgICAgICAgICAgIGludCBsYXN0OworICAgICAgICAgICAgc3luY2hyb25pemVkIChDb3B5T25Xcml0ZUFycmF5TGlzdC50aGlzKSB7CisgICAgICAgICAgICAgICAgYXJyYXkgPSBnZXRBcnJheSgpOworICAgICAgICAgICAgICAgIGlmIChhcnJheSAhPSBleHBlY3RlZEFycmF5KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGxhc3QgPSBvZmZzZXQgKyBsZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnWycpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpID4gb2Zmc2V0KSBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYXJyYXlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgnXScpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENPV1N1Ykl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yIHsKKworICAgICAgICBmaW5hbCBPYmplY3RbXSBhcnJheTsKKyAgICAgICAgaW50IGN1cnNvcjsKKyAgICAgICAgaW50IGZpcnN0LCBsYXN0OworCisgICAgICAgIENPV1N1Ykl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgZmlyc3QsIGludCBsYXN0LCBpbnQgY3Vyc29yKSB7CisgICAgICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CisgICAgICAgICAgICB0aGlzLmxhc3QgPSBsYXN0OworICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSBjdXJzb3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvciA8IGxhc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IgPiBmaXJzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvciAtIGZpcnN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBsYXN0KSB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIGFycmF5W2N1cnNvcisrXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IgLSBmaXJzdCAtIDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgeworICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBmaXJzdCkgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBhcnJheVstLWN1cnNvcl07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgcmV0dXJuIChvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5U2V0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NmQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheVNldC5qYXZhCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBVc2UsIG1vZGlmeSwgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIGluIGFueSB3YXkgd2l0aG91dCBhY2tub3dsZWRnZW1lbnQuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHtAbGluayBqYXZhLnV0aWwuU2V0fSB0aGF0IHVzZXMgYW4gaW50ZXJuYWwge0BsaW5rIENvcHlPbldyaXRlQXJyYXlMaXN0fQorICogZm9yIGFsbCBvZiBpdHMgb3BlcmF0aW9ucy4gVGh1cywgaXQgc2hhcmVzIHRoZSBzYW1lIGJhc2ljIHByb3BlcnRpZXM6CisgKiA8dWw+CisgKiA8bGk+SXQgaXMgYmVzdCBzdWl0ZWQgZm9yIGFwcGxpY2F0aW9ucyBpbiB3aGljaCBzZXQgc2l6ZXMgZ2VuZXJhbGx5CisgKiBzdGF5IHNtYWxsLCByZWFkLW9ubHkgb3BlcmF0aW9ucworICogdmFzdGx5IG91dG51bWJlciBtdXRhdGl2ZSBvcGVyYXRpb25zLCBhbmQgeW91IG5lZWQKKyAqIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGFtb25nIHRocmVhZHMgZHVyaW5nIHRyYXZlcnNhbC4KKyAqIDxsaT5JdCBpcyB0aHJlYWQtc2FmZS4KKyAqIDxsaT5NdXRhdGl2ZSBvcGVyYXRpb25zKDx0dD5hZGQ8L3R0PiwgPHR0PnNldDwvdHQ+LCA8dHQ+cmVtb3ZlPC90dD4sIGV0Yy4pCisgKiBhcmUgZXhwZW5zaXZlIHNpbmNlIHRoZXkgdXN1YWxseSBlbnRhaWwgY29weWluZyB0aGUgZW50aXJlIHVuZGVybHlpbmcgYXJyYXkuCisgKiA8bGk+SXRlcmF0b3JzIGRvIG5vdCBzdXBwb3J0IHRoZSBtdXRhdGl2ZSA8dHQ+cmVtb3ZlPC90dD4gb3BlcmF0aW9uLgorICogPGxpPlRyYXZlcnNhbCB2aWEgaXRlcmF0b3JzIGlzIGZhc3QgYW5kIGNhbm5vdCBlbmNvdW50ZXIKKyAqIGludGVyZmVyZW5jZSBmcm9tIG90aGVyIHRocmVhZHMuIEl0ZXJhdG9ycyByZWx5IG9uCisgKiB1bmNoYW5naW5nIHNuYXBzaG90cyBvZiB0aGUgYXJyYXkgYXQgdGhlIHRpbWUgdGhlIGl0ZXJhdG9ycyB3ZXJlIGNvbnN0cnVjdGVkLgorICogPC91bD4KKyAqIDxiPlNhbXBsZSBVc2FnZS48L2I+IFRoZSBmb2xsb3dpbmcgY29kZSBza2V0Y2ggdXNlcyBhCisgKiBjb3B5LW9uLXdyaXRlIHNldCB0byBtYWludGFpbiBhIHNldCBvZiBIYW5kbGVyIG9iamVjdHMgdGhhdAorICogcGVyZm9ybSBzb21lIGFjdGlvbiB1cG9uIHN0YXRlIHVwZGF0ZXMuCisgKiAKKyAqIDxwcmU+IGNsYXNzIEhhbmRsZXIgeyB2b2lkIGhhbmRsZSgpOyAuLi4gfQorICogY2xhc3MgWCB7IHByaXZhdGUgZmluYWwgQ29weU9uV3JpdGVBcnJheVNldCZsdDtIYW5kbGVyJmd0OyBoYW5kbGVycworICogPSBuZXcgQ29weU9uV3JpdGVBcnJheVNldCZsdDtIYW5kbGVyJmd0OygpOworICogcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyIGgpIHsgaGFuZGxlcnMuYWRkKGgpOyB9CisgKiBwcml2YXRlIGxvbmcgaW50ZXJuYWxTdGF0ZTsKKyAqIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hhbmdlU3RhdGUoKSB7IGludGVybmFsU3RhdGUgPSAuLi47IH0KKyAqIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgY2hhbmdlU3RhdGUoKTsgZm9yIChIYW5kbGVyIGhhbmRsZXIgOiBoYW5kbGVycykKKyAqIGhhbmRsZXIuaGFuZGxlKCk7IH0gfQorICogPC9wcmU+IFRoaXMgY2xhc3MgaXMgYSBtZW1iZXIgb2YgdGhlCisgKiA8YSBocmVmPSJ7QGRvY1Jvb3R9Ly4uL2d1aWRlL2NvbGxlY3Rpb25zL2luZGV4Lmh0bWwiPgorICogSmF2YSBDb2xsZWN0aW9ucyBGcmFtZXdvcms8L2E+LgorICoKKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqIEBzZWUgQ29weU9uV3JpdGVBcnJheUxpc3QKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGNsYXNzIENvcHlPbldyaXRlQXJyYXlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldAorICAgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTQ1Nzc0NzY1MTM0NDAzNDI2M0w7CisKKyAgICBwcml2YXRlIGZpbmFsIENvcHlPbldyaXRlQXJyYXlMaXN0IGFsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBzZXQuCisgICAgICovCisgICAgcHVibGljIENvcHlPbldyaXRlQXJyYXlTZXQoKSB7CisgICAgICAgIGFsID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNldCBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNvbnRhaW4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIENvcHlPbldyaXRlQXJyYXlTZXQoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIGFsID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0KCk7CisgICAgICAgIGFsLmFkZEFsbEFic2VudChjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBhbC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgc2V0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgc2V0IGNvbnRhaW5zIG5vIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGFsLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LgorICAgICAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIHNldAorICAgICAqIGNvbnRhaW5zIGFuIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKyAgICAgKiA8dHQ+KG89PW51bGwmbmJzcDs/Jm5ic3A7ZT09bnVsbCZuYnNwOzombmJzcDtvLmVxdWFscyhlKSk8L3R0Pi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIGVsZW1lbnQgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBzZXQgaXMgdG8gYmUgdGVzdGVkCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBhbC5jb250YWlucyhvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldC4KKyAgICAgKiBJZiB0aGlzIHNldCBtYWtlcyBhbnkgZ3VhcmFudGVlcyBhcyB0byB3aGF0IG9yZGVyIGl0cyBlbGVtZW50cworICAgICAqIGFyZSByZXR1cm5lZCBieSBpdHMgaXRlcmF0b3IsIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZQorICAgICAqIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAqIFRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlICJzYWZlIiBpbiB0aGF0IG5vIHJlZmVyZW5jZXMgdG8gaXQKKyAgICAgKiBhcmUgbWFpbnRhaW5lZCBieSB0aGlzIHNldC4gKEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCBtdXN0CisgICAgICogYWxsb2NhdGUgYSBuZXcgYXJyYXkgZXZlbiBpZiB0aGlzIHNldCBpcyBiYWNrZWQgYnkgYW4gYXJyYXkpLgorICAgICAqIFRoZSBjYWxsZXIgaXMgdGh1cyBmcmVlIHRvIG1vZGlmeSB0aGUgcmV0dXJuZWQgYXJyYXkuCisgICAgICogVGhpcyBtZXRob2QgYWN0cyBhcyBicmlkZ2UgYmV0d2VlbiBhcnJheS1iYXNlZCBhbmQgY29sbGVjdGlvbi1iYXNlZCBBUElzLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGFsLnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldDsgdGhlCisgICAgICogcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCisgICAgICogSWYgdGhlIHNldCBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCisgICAgICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhpcyBzZXQuCisgICAgICogSWYgdGhpcyBzZXQgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggcm9vbSB0byBzcGFyZQorICAgICAqIChpLmUuLCB0aGUgYXJyYXkgaGFzIG1vcmUgZWxlbWVudHMgdGhhbiB0aGlzIHNldCksIHRoZSBlbGVtZW50IGluCisgICAgICogdGhlIGFycmF5IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZW5kIG9mIHRoZSBzZXQgaXMgc2V0IHRvCisgICAgICogPHR0Pm51bGw8L3R0Pi4gKFRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBsZW5ndGggb2YgdGhpcworICAgICAqIHNldCA8aT5vbmx5PC9pPiBpZiB0aGUgY2FsbGVyIGtub3dzIHRoYXQgdGhpcyBzZXQgZG9lcyBub3QgY29udGFpbgorICAgICAqIGFueSBudWxsIGVsZW1lbnRzLikKKyAgICAgKiBJZiB0aGlzIHNldCBtYWtlcyBhbnkgZ3VhcmFudGVlcyBhcyB0byB3aGF0IG9yZGVyIGl0cyBlbGVtZW50cworICAgICAqIGFyZSByZXR1cm5lZCBieSBpdHMgaXRlcmF0b3IsIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBlbGVtZW50cworICAgICAqIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAqIExpa2UgdGhlIHtAbGluayAjdG9BcnJheSgpfSBtZXRob2QsIHRoaXMgbWV0aG9kIGFjdHMgYXMgYnJpZGdlIGJldHdlZW4KKyAgICAgKiBhcnJheS1iYXNlZCBhbmQgY29sbGVjdGlvbi1iYXNlZCBBUElzLiBGdXJ0aGVyLCB0aGlzIG1ldGhvZCBhbGxvd3MKKyAgICAgKiBwcmVjaXNlIGNvbnRyb2wgb3ZlciB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSBvdXRwdXQgYXJyYXksIGFuZCBtYXksCisgICAgICogdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCBiZSB1c2VkIHRvIHNhdmUgYWxsb2NhdGlvbiBjb3N0cy4KKyAgICAgKiBTdXBwb3NlIDx0dD54PC90dD4gaXMgYSBzZXQga25vd24gdG8gY29udGFpbiBvbmx5IHN0cmluZ3MuCisgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkIHRvIGR1bXAgdGhlIHNldCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkCisgICAgICogYXJyYXkgb2YgPHR0PlN0cmluZzwvdHQ+OgorICAgICAqIAorICAgICAqIDxwcmU+IFN0cmluZ1tdIHkgPSB4LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7PC9wcmU+CisgICAgICogTm90ZSB0aGF0IDx0dD50b0FycmF5KG5ldyBPYmplY3RbMF0pPC90dD4gaXMgaWRlbnRpY2FsIGluIGZ1bmN0aW9uIHRvCisgICAgICogPHR0PnRvQXJyYXkoKTwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGEgdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgc2V0IGFyZSB0byBiZQorICAgICAqIHN0b3JlZCwgaWYgaXQgaXMgYmlnIGVub3VnaDsgb3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBvZiB0aGUgc2FtZQorICAgICAqIHJ1bnRpbWUgdHlwZSBpcyBhbGxvY2F0ZWQgZm9yIHRoaXMgcHVycG9zZS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldAorICAgICAqIEB0aHJvd3MgQXJyYXlTdG9yZUV4Y2VwdGlvbiBpZiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkKKyAgICAgKiBpcyBub3QgYSBzdXBlcnR5cGUgb2YgdGhlIHJ1bnRpbWUgdHlwZSBvZiBldmVyeSBlbGVtZW50IGluIHRoaXMgc2V0CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7CisgICAgICAgIHJldHVybiBhbC50b0FycmF5KGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LgorICAgICAqIFRoZSBzZXQgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGlzIGNhbGwgcmV0dXJucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgYWwuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoaXMgc2V0IGlmIGl0IGlzIHByZXNlbnQuCisgICAgICogTW9yZSBmb3JtYWxseSwgcmVtb3ZlcyBhbiBlbGVtZW50IDx0dD5lPC90dD4gc3VjaCB0aGF0CisgICAgICogPHR0PihvPT1udWxsJm5ic3A7PyZuYnNwO2U9PW51bGwmbmJzcDs6Jm5ic3A7by5lcXVhbHMoZSkpPC90dD4sCisgICAgICogaWYgdGhpcyBzZXQgY29udGFpbnMgc3VjaCBhbiBlbGVtZW50LiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYKKyAgICAgKiB0aGlzIHNldCBjb250YWluZWQgdGhlIGVsZW1lbnQob3IgZXF1aXZhbGVudGx5LCBpZiB0aGlzIHNldAorICAgICAqIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwpLiAoVGhpcyBzZXQgd2lsbCBub3QgY29udGFpbiB0aGUKKyAgICAgKiBlbGVtZW50IG9uY2UgdGhlIGNhbGwgcmV0dXJucy4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gbyBvYmplY3QgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgc2V0LCBpZiBwcmVzZW50CisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgc2V0IGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIGFsLnJlbW92ZShvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGlzIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgorICAgICAqIE1vcmUgZm9ybWFsbHksIGFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IDx0dD5lPC90dD4gdG8gdGhpcyBzZXQgaWYKKyAgICAgKiB0aGUgc2V0IGNvbnRhaW5zIG5vIGVsZW1lbnQgPHR0PmUyPC90dD4gc3VjaCB0aGF0CisgICAgICogPHR0PihlPT1udWxsJm5ic3A7PyZuYnNwO2UyPT1udWxsJm5ic3A7OiZuYnNwO2UuZXF1YWxzKGUyKSk8L3R0Pi4KKyAgICAgKiBJZiB0aGlzIHNldCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0aGUgY2FsbCBsZWF2ZXMgdGhlIHNldAorICAgICAqIHVuY2hhbmdlZCBhbmQgcmV0dXJucyA8dHQ+ZmFsc2U8L3R0Pi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhpcyBzZXQKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBzZXQgZGlkIG5vdCBhbHJlYWR5IGNvbnRhaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IGUpIHsKKyAgICAgICAgcmV0dXJuIGFsLmFkZElmQWJzZW50KGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIHNldCBjb250YWlucyBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBJZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMgYWxzbyBhIHNldCwgdGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgaXQgaXMgYSA8aT5zdWJzZXQ8L2k+IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGMgY29sbGVjdGlvbiB0byBiZSBjaGVja2VkIGZvciBjb250YWlubWVudCBpbiB0aGlzIHNldAorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIHNldCBjb250YWlucyBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBjb2xsZWN0aW9uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMgbnVsbAorICAgICAqIEBzZWUgI2NvbnRhaW5zKE9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgcmV0dXJuIGFsLmNvbnRhaW5zQWxsKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdG8gdGhpcyBzZXQgaWYKKyAgICAgKiB0aGV5J3JlIG5vdCBhbHJlYWR5IHByZXNlbnQuIElmIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBhbHNvIGEKKyAgICAgKiBzZXQsIHRoZSA8dHQ+YWRkQWxsPC90dD4gb3BlcmF0aW9uIGVmZmVjdGl2ZWx5IG1vZGlmaWVzIHRoaXMgc2V0IHNvCisgICAgICogdGhhdCBpdHMgdmFsdWUgaXMgdGhlIDxpPnVuaW9uPC9pPiBvZiB0aGUgdHdvIHNldHMuIFRoZSBiZWhhdmlvciBvZgorICAgICAqIHRoaXMgb3BlcmF0aW9uIGlzIHVuZGVmaW5lZCBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMgbW9kaWZpZWQKKyAgICAgKiB3aGlsZSB0aGUgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGMgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoaXMgc2V0CisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgc2V0IGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBudWxsCisgICAgICogQHNlZSAjYWRkKE9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIHJldHVybiBhbC5hZGRBbGxBYnNlbnQoYykgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgZnJvbSB0aGlzIHNldCBhbGwgb2YgaXRzIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29sbGVjdGlvbi4gSWYgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGlzIGFsc28gYSBzZXQsCisgICAgICogdGhpcyBvcGVyYXRpb24gZWZmZWN0aXZlbHkgbW9kaWZpZXMgdGhpcyBzZXQgc28gdGhhdCBpdHMgdmFsdWUgaXMgdGhlCisgICAgICogPGk+YXN5bW1ldHJpYyBzZXQgZGlmZmVyZW5jZTwvaT4gb2YgdGhlIHR3byBzZXRzLgorICAgICAqCisgICAgICogQHBhcmFtIGMgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIHNldAorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIHNldCBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIGFuIGVsZW1lbnQgb2YgdGhpcyBzZXQKKyAgICAgKiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24ob3B0aW9uYWwpCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGlzIHNldCBjb250YWlucyBhIG51bGwgZWxlbWVudCBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24gZG9lcyBub3QgcGVybWl0IG51bGwgZWxlbWVudHMob3B0aW9uYWwpLAorICAgICAqIG9yIGlmIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBudWxsCisgICAgICogQHNlZSAjcmVtb3ZlKE9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIHJldHVybiBhbC5yZW1vdmVBbGwoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0YWlucyBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldCB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uIEluIG90aGVyIHdvcmRzLCByZW1vdmVzIGZyb20gdGhpcyBzZXQgYWxsIG9mCisgICAgICogaXRzIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBJZgorICAgICAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBhbHNvIGEgc2V0LCB0aGlzIG9wZXJhdGlvbiBlZmZlY3RpdmVseQorICAgICAqIG1vZGlmaWVzIHRoaXMgc2V0IHNvIHRoYXQgaXRzIHZhbHVlIGlzIHRoZSA8aT5pbnRlcnNlY3Rpb248L2k+IG9mIHRoZQorICAgICAqIHR3byBzZXRzLgorICAgICAqCisgICAgICogQHBhcmFtIGMgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIHJldGFpbmVkIGluIHRoaXMgc2V0CisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgc2V0IGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgb2YgYW4gZWxlbWVudCBvZiB0aGlzIHNldAorICAgICAqIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbihvcHRpb25hbCkKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoaXMgc2V0IGNvbnRhaW5zIGEgbnVsbCBlbGVtZW50IGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBkb2VzIG5vdCBwZXJtaXQgbnVsbCBlbGVtZW50cyhvcHRpb25hbCksCisgICAgICogb3IgaWYgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGlzIG51bGwKKyAgICAgKiBAc2VlICNyZW1vdmUoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgcmV0dXJuIGFsLnJldGFpbkFsbChjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHNldAorICAgICAqIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBlbGVtZW50cyB3ZXJlIGFkZGVkLgorICAgICAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciBwcm92aWRlcyBhIHNuYXBzaG90IG9mIHRoZSBzdGF0ZSBvZiB0aGUgc2V0CisgICAgICogd2hlbiB0aGUgaXRlcmF0b3Igd2FzIGNvbnN0cnVjdGVkLiBObyBzeW5jaHJvbml6YXRpb24gaXMgbmVlZGVkIHdoaWxlCisgICAgICogdHJhdmVyc2luZyB0aGUgaXRlcmF0b3IuIFRoZSBpdGVyYXRvciBkb2VzIDxlbT5OT1Q8L2VtPiBzdXBwb3J0IHRoZQorICAgICAqIDx0dD5yZW1vdmU8L3R0PiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoaXMgc2V0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gYWwuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgc2V0IGZvciBlcXVhbGl0eS4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyB0aGUgc2FtZSBvYmplY3QKKyAgICAgKiBhcyB0aGlzIG9iamVjdCwgb3IgaWYgaXQgaXMgYWxzbyBhIHtAbGluayBTZXR9IGFuZCB0aGUgZWxlbWVudHMKKyAgICAgKiByZXR1cm5lZCBieSBhbiB7QGxpbmtwbGFpbiBMaXN0I2l0ZXJhdG9yKCkgaXRlcmF0b3J9IG92ZXIgdGhlCisgICAgICogc3BlY2lmaWVkIHNldCBhcmUgdGhlIHNhbWUgYXMgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IGFuCisgICAgICogaXRlcmF0b3Igb3ZlciB0aGlzIHNldC4gTW9yZSBmb3JtYWxseSwgdGhlIHR3byBpdGVyYXRvcnMgYXJlCisgICAgICogY29uc2lkZXJlZCB0byByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMgaWYgdGhleSByZXR1cm4gdGhlIHNhbWUKKyAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgYW5kIGZvciBldmVyeSBlbGVtZW50IHtAY29kZSBlMX0gcmV0dXJuZWQgYnkKKyAgICAgKiB0aGUgaXRlcmF0b3Igb3ZlciB0aGUgc3BlY2lmaWVkIHNldCwgdGhlcmUgaXMgYW4gZWxlbWVudAorICAgICAqIHtAY29kZSBlMn0gcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yIG92ZXIgdGhpcyBzZXQgc3VjaCB0aGF0CisgICAgICoge0Bjb2RlKGUxPT1udWxsID8gZTI9PW51bGwgOiBlMS5lcXVhbHMoZTIpKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbyBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyBzZXQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTZXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBTZXQgc2V0ID0gKFNldCkgKG8pOworICAgICAgICBJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOworCisgICAgICAgIC8vIFVzZXMgTyhuXjIpIGFsZ29yaXRobSB0aGF0IGlzIG9ubHkgYXBwcm9wcmlhdGUKKyAgICAgICAgLy8gZm9yIHNtYWxsIHNldHMsIHdoaWNoIENvcHlPbldyaXRlQXJyYXlTZXRzIHNob3VsZCBiZS4KKworICAgICAgICAvLyAgVXNlIGEgc2luZ2xlIHNuYXBzaG90IG9mIHVuZGVybHlpbmcgYXJyYXkKKyAgICAgICAgT2JqZWN0W10gZWxlbWVudHMgPSBhbC5nZXRBcnJheSgpOworICAgICAgICBpbnQgbGVuID0gZWxlbWVudHMubGVuZ3RoOworICAgICAgICAvLyBNYXJrIG1hdGNoZWQgZWxlbWVudHMgdG8gYXZvaWQgcmUtY2hlY2tpbmcKKyAgICAgICAgYm9vbGVhbltdIG1hdGNoZWQgPSBuZXcgYm9vbGVhbltsZW5dOworICAgICAgICBpbnQgayA9IDA7CisgICAgICAgIG91dGVyOgorICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoKytrID4gbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIE9iamVjdCB4ID0gaXQubmV4dCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFtpXSAmJiBlcSh4LCBlbGVtZW50c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFtpXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gayA9PSBsZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgZXF1YWxpdHksIGNvcGluZyB3aXRoIG51bGxzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgcmV0dXJuIChvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9GSUZPQ29uZFZhci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0ZJRk9Db25kVmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0MDg5YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9GSUZPQ29uZFZhci5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IERvdWcgTGVhIGFuZCByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogVGhpcyBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2VzIHdoYXRzb2V2ZXIgd2l0aG91dCBhY2tub3dsZWRnbWVudC4KKyAqIFRoYW5rcyBmb3IgdGhlIGFzc2lzdGFuY2UgYW5kIHN1cHBvcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJzLAorICogYW5kIGV2ZXJ5b25lIGNvbnRyaWJ1dGluZywgdGVzdGluZywgYW5kIHVzaW5nIHRoaXMgY29kZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitjbGFzcyBGSUZPQ29uZFZhciBleHRlbmRzIENvbmRWYXIgaW1wbGVtZW50cyBDb25kaXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdhaXRRdWV1ZS5RdWV1ZWRTeW5jIHN5bmMgPQorICAgICAgICBuZXcgV2FpdFF1ZXVlLlF1ZXVlZFN5bmMoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWNoZWNrKFdhaXRRdWV1ZS5XYWl0Tm9kZSBub2RlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihXYWl0UXVldWUuV2FpdE5vZGUgbm9kZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgLy8gd2FpdCBxdWV1ZTsgb25seSBhY2Nlc3NlZCB3aGVuIGhvbGRpbmcgdGhlIGxvY2sKKyAgICBwcml2YXRlIGZpbmFsIFdhaXRRdWV1ZSB3cSA9IG5ldyBGSUZPV2FpdFF1ZXVlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ29uZFZhciB0aGF0IHJlbGllcyBvbiB0aGUgZ2l2ZW4gbXV0dWFsIGV4Y2x1c2lvbiBsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2sgQSBub24tcmVlbnRyYW50IG11dHVhbCBleGNsdXNpb24gbG9jay4KKyAgICAgKi8KKyAgICBGSUZPQ29uZFZhcihFeGNsdXNpdmVMb2NrIGxvY2spIHsKKyAgICAgICAgc3VwZXIobG9jayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXdhaXRVbmludGVycnVwdGlibHkoKSB7CisgICAgICAgIGludCBob2xkQ291bnQgPSBsb2NrLmdldEhvbGRDb3VudCgpOworICAgICAgICBpZiAoaG9sZENvdW50ID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgV2FpdFF1ZXVlLldhaXROb2RlIG4gPSBuZXcgV2FpdFF1ZXVlLldhaXROb2RlKCk7CisgICAgICAgIHdxLmluc2VydChuKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay51bmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG4uZG9XYWl0VW5pbnRlcnJ1cHRpYmx5KHN5bmMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhd2FpdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBob2xkQ291bnQgPSBsb2NrLmdldEhvbGRDb3VudCgpOworICAgICAgICBpZiAoaG9sZENvdW50ID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgV2FpdFF1ZXVlLldhaXROb2RlIG4gPSBuZXcgV2FpdFF1ZXVlLldhaXROb2RlKCk7CisgICAgICAgIHdxLmluc2VydChuKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay51bmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG4uZG9XYWl0KHN5bmMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGhvbGRDb3VudDsgaSA+IDA7IGktLSkgbG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpCisgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBob2xkQ291bnQgPSBsb2NrLmdldEhvbGRDb3VudCgpOworICAgICAgICBpZiAoaG9sZENvdW50ID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgbG9uZyBuYW5vcyA9IHVuaXQudG9OYW5vcyh0aW1lb3V0KTsKKyAgICAgICAgV2FpdFF1ZXVlLldhaXROb2RlIG4gPSBuZXcgV2FpdFF1ZXVlLldhaXROb2RlKCk7CisgICAgICAgIHdxLmluc2VydChuKTsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBob2xkQ291bnQ7IGkgPiAwOyBpLS0pIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdWNjZXNzID0gbi5kb1RpbWVkV2FpdChzeW5jLCBuYW5vcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gaG9sZENvdW50OyBpID4gMDsgaS0tKSBsb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKy8vICAgIHB1YmxpYyBsb25nIGF3YWl0TmFub3MobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworLy8gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworLy8gICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXdhaXRVbnRpbChEYXRlIGRlYWRsaW5lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAoZGVhZGxpbmUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIGxvbmcgYWJzdGltZSA9IGRlYWRsaW5lLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIG1zZWNzID0gYWJzdGltZSAtIHN0YXJ0OworICAgICAgICByZXR1cm4gYXdhaXQobXNlY3MsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2lnbmFsKCkgeworICAgICAgICBpZiAoIWxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IDspIHsKKyAgICAgICAgICAgIFdhaXRRdWV1ZS5XYWl0Tm9kZSB3ID0gd3EuZXh0cmFjdCgpOworICAgICAgICAgICAgaWYgKHcgPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBvbmUgdG8gc2lnbmFsCisgICAgICAgICAgICBpZiAody5zaWduYWwoc3luYykpIHJldHVybjsgLy8gbm90aWZ5IGlmIHN0aWxsIHdhaXRpbmcsIGVsc2Ugc2tpcAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2lnbmFsQWxsKCkgeworICAgICAgICBpZiAoIWxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IDspIHsKKyAgICAgICAgICAgIFdhaXRRdWV1ZS5XYWl0Tm9kZSB3ID0gd3EuZXh0cmFjdCgpOworICAgICAgICAgICAgaWYgKHcgPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBtb3JlIHRvIHNpZ25hbAorICAgICAgICAgICAgdy5zaWduYWwoc3luYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNXYWl0ZXJzKCkgeworICAgICAgICBpZiAoIWxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdxLmhhc05vZGVzKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRXYWl0UXVldWVMZW5ndGgoKSB7CisgICAgICAgIGlmICghbG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3EuZ2V0TGVuZ3RoKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0V2FpdGluZ1RocmVhZHMoKSB7CisgICAgICAgIGlmICghbG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3EuZ2V0V2FpdGluZ1RocmVhZHMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvRklGT1dhaXRRdWV1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0ZJRk9XYWl0UXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjJmZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0ZJRk9XYWl0UXVldWUuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBTaW1wbGUgbGlua2VkIGxpc3QgcXVldWUgdXNlZCBpbiBGSUZPU2VtYXBob3JlLgorICogTWV0aG9kcyBhcmUgbm90IHN5bmNocm9uaXplZDsgdGhleSBkZXBlbmQgb24gc3luY2ggb2YgY2FsbGVycy4KKyAqIE11c3QgYmUgcHVibGljLCBzaW5jZSBpdCBpcyB1c2VkIGJ5IFNlbWFwaG9yZShvdXRzaWRlIHRoaXMgcGFja2FnZSkuCisgKiBOT1RFOiB0aGlzIGNsYXNzIGlzIE5PVCBwcmVzZW50IGluIGphdmEudXRpbC5jb25jdXJyZW50LgorICovCitjbGFzcyBGSUZPV2FpdFF1ZXVlIGV4dGVuZHMgV2FpdFF1ZXVlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBXYWl0Tm9kZSBoZWFkXyA9IG51bGw7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBXYWl0Tm9kZSB0YWlsXyA9IG51bGw7CisKKyAgICBwdWJsaWMgRklGT1dhaXRRdWV1ZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoV2FpdE5vZGUgdykgeworICAgICAgICBpZiAodGFpbF8gPT0gbnVsbCkKKyAgICAgICAgICAgIGhlYWRfID0gdGFpbF8gPSB3OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRhaWxfLm5leHQgPSB3OworICAgICAgICAgICAgdGFpbF8gPSB3OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFdhaXROb2RlIGV4dHJhY3QoKSB7CisgICAgICAgIGlmIChoZWFkXyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgV2FpdE5vZGUgdyA9IGhlYWRfOworICAgICAgICAgICAgaGVhZF8gPSB3Lm5leHQ7CisgICAgICAgICAgICBpZiAoaGVhZF8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0YWlsXyA9IG51bGw7CisgICAgICAgICAgICB3Lm5leHQgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOb2RlcygpIHsKKyAgICAgICAgcmV0dXJuIGhlYWRfICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIFdhaXROb2RlIG5vZGUgPSBoZWFkXzsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUud2FpdGluZykgY291bnQrKzsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFdhaXRpbmdUaHJlYWRzKCkgeworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFdhaXROb2RlIG5vZGUgPSBoZWFkXzsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUud2FpdGluZykgbGlzdC5hZGQobm9kZS5vd25lcik7CisgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV2FpdGluZyhUaHJlYWQgdGhyZWFkKSB7CisgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIGZvciAoV2FpdE5vZGUgbm9kZSA9IGhlYWRfOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLm5leHQpIHsKKyAgICAgICAgICAgIGlmIChub2RlLndhaXRpbmcgJiYgbm9kZS5vd25lciA9PSB0aHJlYWQpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvTG9jay5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0xvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjQzMWFlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L0xvY2suamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworLyoqCisgKiA8dHQ+TG9jazwvdHQ+IGltcGxlbWVudGF0aW9ucyBwcm92aWRlIG1vcmUgZXh0ZW5zaXZlIGxvY2tpbmcKKyAqIG9wZXJhdGlvbnMgdGhhbiBjYW4gYmUgb2J0YWluZWQgdXNpbmcgPHR0PnN5bmNocm9uaXplZDwvdHQ+IG1ldGhvZHMKKyAqIGFuZCBzdGF0ZW1lbnRzLiBUaGV5IGFsbG93IG1vcmUgZmxleGlibGUgc3RydWN0dXJpbmcsIG1heSBoYXZlCisgKiBxdWl0ZSBkaWZmZXJlbnQgcHJvcGVydGllcywgYW5kIG1heSBzdXBwb3J0IG11bHRpcGxlIGFzc29jaWF0ZWQKKyAqIHtAbGluayBDb25kaXRpb259IG9iamVjdHMuCisgKiBBIGxvY2sgaXMgYSB0b29sIGZvciBjb250cm9sbGluZyBhY2Nlc3MgdG8gYSBzaGFyZWQgcmVzb3VyY2UgYnkKKyAqIG11bHRpcGxlIHRocmVhZHMuIENvbW1vbmx5LCBhIGxvY2sgcHJvdmlkZXMgZXhjbHVzaXZlIGFjY2VzcyB0byBhCisgKiBzaGFyZWQgcmVzb3VyY2U6IG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUgY2FuIGFjcXVpcmUgdGhlIGxvY2sgYW5kCisgKiBhbGwgYWNjZXNzIHRvIHRoZSBzaGFyZWQgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgbG9jayBiZQorICogYWNxdWlyZWQgZmlyc3QuIEhvd2V2ZXIsIHNvbWUgbG9ja3MgbWF5IGFsbG93IGNvbmN1cnJlbnQgYWNjZXNzIHRvCisgKiBhIHNoYXJlZCByZXNvdXJjZSwgc3VjaCBhcyB0aGUgcmVhZCBsb2NrIG9mIGEge0BsaW5rIFJlYWRXcml0ZUxvY2t9LgorICogVGhlIHVzZSBvZiA8dHQ+c3luY2hyb25pemVkPC90dD4gbWV0aG9kcyBvciBzdGF0ZW1lbnRzIHByb3ZpZGVzCisgKiBhY2Nlc3MgdG8gdGhlIGltcGxpY2l0IG1vbml0b3IgbG9jayBhc3NvY2lhdGVkIHdpdGggZXZlcnkgb2JqZWN0LCBidXQKKyAqIGZvcmNlcyBhbGwgbG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSB0byBvY2N1ciBpbiBhIGJsb2NrLXN0cnVjdHVyZWQgd2F5OgorICogd2hlbiBtdWx0aXBsZSBsb2NrcyBhcmUgYWNxdWlyZWQgdGhleSBtdXN0IGJlIHJlbGVhc2VkIGluIHRoZSBvcHBvc2l0ZQorICogb3JkZXIsIGFuZCBhbGwgbG9ja3MgbXVzdCBiZSByZWxlYXNlZCBpbiB0aGUgc2FtZSBsZXhpY2FsIHNjb3BlIGluIHdoaWNoCisgKiB0aGV5IHdlcmUgYWNxdWlyZWQuCisgKiBXaGlsZSB0aGUgc2NvcGluZyBtZWNoYW5pc20gZm9yIDx0dD5zeW5jaHJvbml6ZWQ8L3R0PiBtZXRob2RzCisgKiBhbmQgc3RhdGVtZW50cyBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBwcm9ncmFtIHdpdGggbW9uaXRvciBsb2NrcywKKyAqIGFuZCBoZWxwcyBhdm9pZCBtYW55IGNvbW1vbiBwcm9ncmFtbWluZyBlcnJvcnMgaW52b2x2aW5nIGxvY2tzLAorICogdGhlcmUgYXJlIG9jY2FzaW9ucyB3aGVyZSB5b3UgbmVlZCB0byB3b3JrIHdpdGggbG9ja3MgaW4gYSBtb3JlCisgKiBmbGV4aWJsZSB3YXkuIEZvciBleGFtcGxlLCBzb21lIGFsZ29yaXRobXMgZm9yIHRyYXZlcnNpbmcKKyAqIGNvbmN1cnJlbnRseSBhY2Nlc3NlZCBkYXRhIHN0cnVjdHVyZXMgcmVxdWlyZSB0aGUgdXNlIG9mCisgKiAmcXVvdDtoYW5kLW92ZXItaGFuZCZxdW90OyBvciAmcXVvdDtjaGFpbiBsb2NraW5nJnF1b3Q7OiB5b3UKKyAqIGFjcXVpcmUgdGhlIGxvY2sgb2Ygbm9kZSBBLCB0aGVuIG5vZGUgQiwgdGhlbiByZWxlYXNlIEEgYW5kIGFjcXVpcmUKKyAqIEMsIHRoZW4gcmVsZWFzZSBCIGFuZCBhY3F1aXJlIEQgYW5kIHNvIG9uLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlCisgKiA8dHQ+TG9jazwvdHQ+IGludGVyZmFjZSBlbmFibGUgdGhlIHVzZSBvZiBzdWNoIHRlY2huaXF1ZXMgYnkKKyAqIGFsbG93aW5nIGEgbG9jayB0byBiZSBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaW4gZGlmZmVyZW50IHNjb3BlcywKKyAqIGFuZCBhbGxvd2luZyBtdWx0aXBsZSBsb2NrcyB0byBiZSBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaW4gYW55IG9yZGVyLgorICogV2l0aCB0aGlzIGluY3JlYXNlZCBmbGV4aWJpbGl0eSBjb21lcyBhZGRpdGlvbmFsCisgKiByZXNwb25zaWJpbGl0eS4gVGhlIGFic2VuY2Ugb2YgYmxvY2stc3RydWN0dXJlZCBsb2NraW5nIHJlbW92ZXMgdGhlCisgKiBhdXRvbWF0aWMgcmVsZWFzZSBvZiBsb2NrcyB0aGF0IG9jY3VycyB3aXRoIDx0dD5zeW5jaHJvbml6ZWQ8L3R0PgorICogbWV0aG9kcyBhbmQgc3RhdGVtZW50cy4gSW4gbW9zdCBjYXNlcywgdGhlIGZvbGxvd2luZyBpZGlvbSBzaG91bGQgYmUgdXNlZDoKKyAqIAorICogPHByZT48dHQ+IExvY2sgbCA9IC4uLjsgbC5sb2NrKCk7IHRyeSB7CisgKiAvLyBhY2Nlc3MgdGhlIHJlc291cmNlIHByb3RlY3RlZCBieSB0aGlzIGxvY2sgfSBmaW5hbGx5IHsgbC51bmxvY2soKTsgfQorICogPC90dD48L3ByZT4KKyAqIFdoZW4gbG9ja2luZyBhbmQgdW5sb2NraW5nIG9jY3VyIGluIGRpZmZlcmVudCBzY29wZXMsIGNhcmUgbXVzdCBiZQorICogdGFrZW4gdG8gZW5zdXJlIHRoYXQgYWxsIGNvZGUgdGhhdCBpcyBleGVjdXRlZCB3aGlsZSB0aGUgbG9jayBpcworICogaGVsZCBpcyBwcm90ZWN0ZWQgYnkgdHJ5LWZpbmFsbHkgb3IgdHJ5LWNhdGNoIHRvIGVuc3VyZSB0aGF0IHRoZQorICogbG9jayBpcyByZWxlYXNlZCB3aGVuIG5lY2Vzc2FyeS4KKyAqIAorICogPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkKKyAqIG92ZXIgdGhlIHVzZSBvZiA8dHQ+c3luY2hyb25pemVkPC90dD4gbWV0aG9kcyBhbmQgc3RhdGVtZW50cyBieQorICogcHJvdmlkaW5nIGEgbm9uLWJsb2NraW5nIGF0dGVtcHQgdG8gYWNxdWlyZSBhIGxvY2soe0BsaW5rCisgKiAjdHJ5TG9jaygpfSksIGFuIGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgbG9jayB0aGF0IGNhbiBiZQorICogaW50ZXJydXB0ZWQoe0BsaW5rICNsb2NrSW50ZXJydXB0aWJseX0sIGFuZCBhbiBhdHRlbXB0IHRvIGFjcXVpcmUKKyAqIHRoZSBsb2NrIHRoYXQgY2FuIHRpbWVvdXQoe0BsaW5rICN0cnlMb2NrKGxvbmcsIFRpbWVVbml0KX0pLgorICogQSA8dHQ+TG9jazwvdHQ+IGNsYXNzIGNhbiBhbHNvIHByb3ZpZGUgYmVoYXZpb3IgYW5kIHNlbWFudGljcworICogdGhhdCBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBpbXBsaWNpdCBtb25pdG9yIGxvY2ssCisgKiBzdWNoIGFzIGd1YXJhbnRlZWQgb3JkZXJpbmcsIG5vbi1yZWVudHJhbnQgdXNhZ2UsIG9yIGRlYWRsb2NrCisgKiBkZXRlY3Rpb24uIElmIGFuIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHN1Y2ggc3BlY2lhbGl6ZWQgc2VtYW50aWNzCisgKiB0aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGRvY3VtZW50IHRob3NlIHNlbWFudGljcy4KKyAqIE5vdGUgdGhhdCA8dHQ+TG9jazwvdHQ+IGluc3RhbmNlcyBhcmUganVzdCBub3JtYWwgb2JqZWN0cyBhbmQgY2FuCisgKiB0aGVtc2VsdmVzIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBpbiBhIDx0dD5zeW5jaHJvbml6ZWQ8L3R0PiBzdGF0ZW1lbnQuCisgKiBBY3F1aXJpbmcgdGhlCisgKiBtb25pdG9yIGxvY2sgb2YgYSA8dHQ+TG9jazwvdHQ+IGluc3RhbmNlIGhhcyBubyBzcGVjaWZpZWQgcmVsYXRpb25zaGlwCisgKiB3aXRoIGludm9raW5nIGFueSBvZiB0aGUge0BsaW5rICNsb2NrfSBtZXRob2RzIG9mIHRoYXQgaW5zdGFuY2UuCisgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRvIGF2b2lkIGNvbmZ1c2lvbiB5b3UgbmV2ZXIgdXNlIDx0dD5Mb2NrPC90dD4KKyAqIGluc3RhbmNlcyBpbiB0aGlzIHdheSwgZXhjZXB0IHdpdGhpbiB0aGVpciBvd24gaW1wbGVtZW50YXRpb24uCisgKiBFeGNlcHQgd2hlcmUgbm90ZWQsIHBhc3NpbmcgYSA8dHQ+bnVsbDwvdHQ+IHZhbHVlIGZvciBhbnkKKyAqIHBhcmFtZXRlciB3aWxsIHJlc3VsdCBpbiBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duLgorICogCisgKiA8aDM+TWVtb3J5IFN5bmNocm9uaXphdGlvbjwvaDM+CisgKiBBbGwgPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbnMgPGVtPm11c3Q8L2VtPiBlbmZvcmNlIHRoZSBzYW1lCisgKiBtZW1vcnkgc3luY2hyb25pemF0aW9uIHNlbWFudGljcyBhcyBwcm92aWRlZCBieSB0aGUgYnVpbHQtaW4gbW9uaXRvcgorICogbG9jaywgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvIj4KKyAqIFRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFRoaXJkIEVkaXRpb24oMTcuNCBNZW1vcnkgTW9kZWwpPC9hPjoKKyAqIDx1bD4KKyAqIDxsaT5BIHN1Y2Nlc3NmdWwgPHR0PmxvY2s8L3R0PiBvcGVyYXRpb24gaGFzIHRoZSBzYW1lIG1lbW9yeQorICogc3luY2hyb25pemF0aW9uIGVmZmVjdHMgYXMgYSBzdWNjZXNzZnVsIDxlbT5Mb2NrPC9lbT4gYWN0aW9uLgorICogPGxpPkEgc3VjY2Vzc2Z1bCA8dHQ+dW5sb2NrPC90dD4gb3BlcmF0aW9uIGhhcyB0aGUgc2FtZQorICogbWVtb3J5IHN5bmNocm9uaXphdGlvbiBlZmZlY3RzIGFzIGEgc3VjY2Vzc2Z1bCA8ZW0+VW5sb2NrPC9lbT4gYWN0aW9uLgorICogPC91bD4gVW5zdWNjZXNzZnVsIGxvY2tpbmcgYW5kIHVubG9ja2luZyBvcGVyYXRpb25zLCBhbmQgcmVlbnRyYW50CisgKiBsb2NraW5nL3VubG9ja2luZyBvcGVyYXRpb25zLCBkbyBub3QgcmVxdWlyZSBhbnkgbWVtb3J5CisgKiBzeW5jaHJvbml6YXRpb24gZWZmZWN0cy4KKyAqIAorICogPGgzPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9oMz4KKyAqIFRoZSB0aHJlZSBmb3JtcyBvZiBsb2NrIGFjcXVpc2l0aW9uKGludGVycnVwdGlibGUsCisgKiBub24taW50ZXJydXB0aWJsZSwgYW5kIHRpbWVkKSBtYXkgZGlmZmVyIGluIHRoZWlyIHBlcmZvcm1hbmNlCisgKiBjaGFyYWN0ZXJpc3RpY3MsIG9yZGVyaW5nIGd1YXJhbnRlZXMsIG9yIG90aGVyIGltcGxlbWVudGF0aW9uCisgKiBxdWFsaXRpZXMuIEZ1cnRoZXIsIHRoZSBhYmlsaXR5IHRvIGludGVycnVwdCB0aGUgPGVtPm9uZ29pbmc8L2VtPgorICogYWNxdWlzaXRpb24gb2YgYSBsb2NrIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gPHR0PkxvY2s8L3R0PgorICogY2xhc3MuIENvbnNlcXVlbnRseSwgYW4gaW1wbGVtZW50YXRpb24gaXMgbm90IHJlcXVpcmVkIHRvIGRlZmluZQorICogZXhhY3RseSB0aGUgc2FtZSBndWFyYW50ZWVzIG9yIHNlbWFudGljcyBmb3IgYWxsIHRocmVlIGZvcm1zIG9mCisgKiBsb2NrIGFjcXVpc2l0aW9uLCBub3IgaXMgaXQgcmVxdWlyZWQgdG8gc3VwcG9ydCBpbnRlcnJ1cHRpb24gb2YgYW4KKyAqIG9uZ29pbmcgbG9jayBhY3F1aXNpdGlvbi4gQW4gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQgdG8gY2xlYXJseQorICogZG9jdW1lbnQgdGhlIHNlbWFudGljcyBhbmQgZ3VhcmFudGVlcyBwcm92aWRlZCBieSBlYWNoIG9mIHRoZQorICogbG9ja2luZyBtZXRob2RzLiBJdCBtdXN0IGFsc28gb2JleSB0aGUgaW50ZXJydXB0aW9uIHNlbWFudGljcyBhcworICogZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSwgdG8gdGhlIGV4dGVudCB0aGF0IGludGVycnVwdGlvbiBvZiBsb2NrCisgKiBhY3F1aXNpdGlvbiBpcyBzdXBwb3J0ZWQ6IHdoaWNoIGlzIGVpdGhlciB0b3RhbGx5LCBvciBvbmx5IG9uIG1ldGhvZCBlbnRyeS4KKyAqIEFzIGludGVycnVwdGlvbiBnZW5lcmFsbHkgaW1wbGllcyBjYW5jZWxsYXRpb24sIGFuZCBjaGVja3MgZm9yCisgKiBpbnRlcnJ1cHRpb24gYXJlIG9mdGVuIGluZnJlcXVlbnQsIGFuIGltcGxlbWVudGF0aW9uIGNhbiBmYXZvciByZXNwb25kaW5nCisgKiB0byBhbiBpbnRlcnJ1cHQgb3ZlciBub3JtYWwgbWV0aG9kIHJldHVybi4gVGhpcyBpcyB0cnVlIGV2ZW4gaWYgaXQgY2FuIGJlCisgKiBzaG93biB0aGF0IHRoZSBpbnRlcnJ1cHQgb2NjdXJyZWQgYWZ0ZXIgYW5vdGhlciBhY3Rpb24gbWF5IGhhdmUgdW5ibG9ja2VkCisgKiB0aGUgdGhyZWFkLiBBbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZG9jdW1lbnQgdGhpcyBiZWhhdmlvci4KKyAqCisgKiBAYXV0aG9yIERvdWcgTGVhCisgKiBAc2VlIFJlZW50cmFudExvY2sKKyAqIEBzZWUgQ29uZGl0aW9uCisgKiBAc2VlIFJlYWRXcml0ZUxvY2sKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGludGVyZmFjZSBMb2NrIHsKKworICAgIC8qKgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrLiBJZiB0aGUgbG9jayBpcyBub3QgYXZhaWxhYmxlIHRoZW4KKyAgICAgKiB0aGUgY3VycmVudCB0aHJlYWQgYmVjb21lcyBkaXNhYmxlZCBmb3IgdGhyZWFkIHNjaGVkdWxpbmcKKyAgICAgKiBwdXJwb3NlcyBhbmQgbGllcyBkb3JtYW50IHVudGlsIHRoZSBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkLgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIEEgPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgYWJsZSB0byBkZXRlY3QKKyAgICAgKiBlcnJvbmVvdXMgdXNlIG9mIHRoZSBsb2NrLCBzdWNoIGFzIGFuIGludm9jYXRpb24gdGhhdCB3b3VsZCBjYXVzZQorICAgICAqIGRlYWRsb2NrLCBhbmQgbWF5IHRocm93IGFuKHVuY2hlY2tlZCkgZXhjZXB0aW9uIGluIHN1Y2ggY2lyY3Vtc3RhbmNlcy4KKyAgICAgKiBUaGUgY2lyY3Vtc3RhbmNlcyBhbmQgdGhlIGV4Y2VwdGlvbiB0eXBlIG11c3QgYmUgZG9jdW1lbnRlZCBieSB0aGF0CisgICAgICogPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGxvY2soKTsKKworICAgIC8qKgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrIHVubGVzcyB0aGUgY3VycmVudCB0aHJlYWQgaXMKKyAgICAgKiB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRlZH0uCisgICAgICogQWNxdWlyZXMgdGhlIGxvY2sgaWYgaXQgaXMgYXZhaWxhYmxlIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5LgorICAgICAqIElmIHRoZSBsb2NrIGlzIG5vdCBhdmFpbGFibGUgdGhlbgorICAgICAqIHRoZSBjdXJyZW50IHRocmVhZCBiZWNvbWVzIGRpc2FibGVkIGZvciB0aHJlYWQgc2NoZWR1bGluZworICAgICAqIHB1cnBvc2VzIGFuZCBsaWVzIGRvcm1hbnQgdW50aWwgb25lIG9mIHR3byB0aGluZ3MgaGFwcGVuczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBsb2NrIGlzIGFjcXVpcmVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZDsgb3IKKyAgICAgKiA8bGk+U29tZSBvdGhlciB0aHJlYWQge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0c30gdGhlIGN1cnJlbnQKKyAgICAgKiB0aHJlYWQsIGFuZCBpbnRlcnJ1cHRpb24gb2YgbG9jayBhY3F1aXNpdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgICogPC91bD4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+aGFzIGl0cyBpbnRlcnJ1cHRlZCBzdGF0dXMgc2V0IG9uIGVudHJ5IHRvIHRoaXMgbWV0aG9kOyBvcgorICAgICAqIDxsaT5pcyB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRlZH0gd2hpbGUgYWNxdWlyaW5nCisgICAgICogdGhlIGxvY2ssIGFuZCBpbnRlcnJ1cHRpb24gb2YgbG9jayBhY3F1aXNpdGlvbiBpcyBzdXBwb3J0ZWQsCisgICAgICogPC91bD4KKyAgICAgKiB0aGVuIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaXMgdGhyb3duIGFuZCB0aGUgY3VycmVudCB0aHJlYWQncworICAgICAqIGludGVycnVwdGVkIHN0YXR1cyBpcyBjbGVhcmVkLgorICAgICAqIAorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIFRoZSBhYmlsaXR5IHRvIGludGVycnVwdCBhIGxvY2sgYWNxdWlzaXRpb24gaW4gc29tZQorICAgICAqIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IGJlIHBvc3NpYmxlLCBhbmQgaWYgcG9zc2libGUgbWF5IGJlIGFuCisgICAgICogZXhwZW5zaXZlIG9wZXJhdGlvbi4gVGhlIHByb2dyYW1tZXIgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhpcworICAgICAqIG1heSBiZSB0aGUgY2FzZS4gQW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIGRvY3VtZW50IHdoZW4gdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gZmF2b3IgcmVzcG9uZGluZyB0byBhbiBpbnRlcnJ1cHQgb3ZlcgorICAgICAqIG5vcm1hbCBtZXRob2QgcmV0dXJuLgorICAgICAqIEEgPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgYWJsZSB0byBkZXRlY3QKKyAgICAgKiBlcnJvbmVvdXMgdXNlIG9mIHRoZSBsb2NrLCBzdWNoIGFzIGFuIGludm9jYXRpb24gdGhhdCB3b3VsZAorICAgICAqIGNhdXNlIGRlYWRsb2NrLCBhbmQgbWF5IHRocm93IGFuKHVuY2hlY2tlZCkgZXhjZXB0aW9uIGluIHN1Y2gKKyAgICAgKiBjaXJjdW1zdGFuY2VzLiBUaGUgY2lyY3Vtc3RhbmNlcyBhbmQgdGhlIGV4Y2VwdGlvbiB0eXBlIG11c3QKKyAgICAgKiBiZSBkb2N1bWVudGVkIGJ5IHRoYXQgPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkCisgICAgICogd2hpbGUgYWNxdWlyaW5nIHRoZSBsb2NrKGFuZCBpbnRlcnJ1cHRpb24gb2YgbG9jayBhY3F1aXNpdGlvbiBpcworICAgICAqIHN1cHBvcnRlZCkuCisgICAgICogQHNlZSBUaHJlYWQjaW50ZXJydXB0CisgICAgICovCisgICAgdm9pZCBsb2NrSW50ZXJydXB0aWJseSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrIG9ubHkgaWYgaXQgaXMgZnJlZSBhdCB0aGUgdGltZSBvZiBpbnZvY2F0aW9uLgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrIGlmIGl0IGlzIGF2YWlsYWJsZSBhbmQgcmV0dXJucyBpbW1lZGlhdGVseQorICAgICAqIHdpdGggdGhlIHZhbHVlIDx0dD50cnVlPC90dD4uCisgICAgICogSWYgdGhlIGxvY2sgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuCisgICAgICogaW1tZWRpYXRlbHkgd2l0aCB0aGUgdmFsdWUgPHR0PmZhbHNlPC90dD4uCisgICAgICogQSB0eXBpY2FsIHVzYWdlIGlkaW9tIGZvciB0aGlzIG1ldGhvZCB3b3VsZCBiZToKKyAgICAgKiA8cHJlPiBMb2NrIGxvY2sgPSAuLi47IGlmIChsb2NrLnRyeUxvY2soKSkgeyB0cnkgeworICAgICAqIC8vIG1hbmlwdWxhdGUgcHJvdGVjdGVkIHN0YXRlIH0gZmluYWxseSB7IGxvY2sudW5sb2NrKCk7IH0gfSBlbHNlIHsKKyAgICAgKiAvLyBwZXJmb3JtIGFsdGVybmF0aXZlIGFjdGlvbnMgfQorICAgICAqIDwvcHJlPgorICAgICAqIFRoaXMgdXNhZ2UgZW5zdXJlcyB0aGF0IHRoZSBsb2NrIGlzIHVubG9ja2VkIGlmIGl0IHdhcyBhY3F1aXJlZCwgYW5kCisgICAgICogZG9lc24ndCB0cnkgdG8gdW5sb2NrIGlmIHRoZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGxvY2sgd2FzIGFjcXVpcmVkIGFuZCA8dHQ+ZmFsc2U8L3R0PgorICAgICAqIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIHRyeUxvY2soKTsKKworICAgIC8qKgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrIGlmIGl0IGlzIGZyZWUgd2l0aGluIHRoZSBnaXZlbiB3YWl0aW5nIHRpbWUgYW5kIHRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIGhhcyBub3QgYmVlbiB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRlZH0uCisgICAgICogSWYgdGhlIGxvY2sgaXMgYXZhaWxhYmxlIHRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkKKyAgICAgKiB3aXRoIHRoZSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+LiBJZiB0aGUgbG9jayBpcyBub3QgYXZhaWxhYmxlIHRoZW4KKyAgICAgKiB0aGUgY3VycmVudCB0aHJlYWQgYmVjb21lcyBkaXNhYmxlZCBmb3IgdGhyZWFkIHNjaGVkdWxpbmcKKyAgICAgKiBwdXJwb3NlcyBhbmQgbGllcyBkb3JtYW50IHVudGlsIG9uZSBvZiB0aHJlZSB0aGluZ3MgaGFwcGVuczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBsb2NrIGlzIGFjcXVpcmVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZDsgb3IKKyAgICAgKiA8bGk+U29tZSBvdGhlciB0aHJlYWQge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0c30gdGhlIGN1cnJlbnQKKyAgICAgKiB0aHJlYWQsIGFuZCBpbnRlcnJ1cHRpb24gb2YgbG9jayBhY3F1aXNpdGlvbiBpcyBzdXBwb3J0ZWQ7IG9yCisgICAgICogPGxpPlRoZSBzcGVjaWZpZWQgd2FpdGluZyB0aW1lIGVsYXBzZXMKKyAgICAgKiA8L3VsPiBJZiB0aGUgbG9jayBpcyBhY3F1aXJlZCB0aGVuIHRoZSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IGlzIHJldHVybmVkLgorICAgICAqIElmIHRoZSBjdXJyZW50IHRocmVhZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmhhcyBpdHMgaW50ZXJydXB0ZWQgc3RhdHVzIHNldCBvbiBlbnRyeSB0byB0aGlzIG1ldGhvZDsgb3IKKyAgICAgKiA8bGk+aXMge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQgaW50ZXJydXB0ZWR9IHdoaWxlIGFjcXVpcmluZworICAgICAqIHRoZSBsb2NrLCBhbmQgaW50ZXJydXB0aW9uIG9mIGxvY2sgYWNxdWlzaXRpb24gaXMgc3VwcG9ydGVkLAorICAgICAqIDwvdWw+CisgICAgICogdGhlbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlzIHRocm93biBhbmQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MKKyAgICAgKiBpbnRlcnJ1cHRlZCBzdGF0dXMgaXMgY2xlYXJlZC4KKyAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIHdhaXRpbmcgdGltZSBlbGFwc2VzIHRoZW4gdGhlIHZhbHVlIDx0dD5mYWxzZTwvdHQ+CisgICAgICogaXMgcmV0dXJuZWQuIElmIHRoZSB0aW1lIGlzCisgICAgICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBtZXRob2Qgd2lsbCBub3Qgd2FpdCBhdCBhbGwuCisgICAgICogCisgICAgICogPGI+SW1wbGVtZW50YXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+CisgICAgICogVGhlIGFiaWxpdHkgdG8gaW50ZXJydXB0IGEgbG9jayBhY3F1aXNpdGlvbiBpbiBzb21lIGltcGxlbWVudGF0aW9ucworICAgICAqIG1heSBub3QgYmUgcG9zc2libGUsIGFuZCBpZiBwb3NzaWJsZSBtYXkgYmUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbi4KKyAgICAgKiBUaGUgcHJvZ3JhbW1lciBzaG91bGQgYmUgYXdhcmUgdGhhdCB0aGlzIG1heSBiZSB0aGUgY2FzZS4gQW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZG9jdW1lbnQgd2hlbiB0aGlzIGlzIHRoZSBjYXNlLgorICAgICAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBmYXZvciByZXNwb25kaW5nIHRvIGFuIGludGVycnVwdCBvdmVyIG5vcm1hbAorICAgICAqIG1ldGhvZCByZXR1cm4sIG9yIHJlcG9ydGluZyBhIHRpbWVvdXQuCisgICAgICogQSA8dHQ+TG9jazwvdHQ+IGltcGxlbWVudGF0aW9uIG1heSBiZSBhYmxlIHRvIGRldGVjdAorICAgICAqIGVycm9uZW91cyB1c2Ugb2YgdGhlIGxvY2ssIHN1Y2ggYXMgYW4gaW52b2NhdGlvbiB0aGF0IHdvdWxkIGNhdXNlCisgICAgICogZGVhZGxvY2ssIGFuZCBtYXkgdGhyb3cgYW4odW5jaGVja2VkKSBleGNlcHRpb24gaW4gc3VjaCBjaXJjdW1zdGFuY2VzLgorICAgICAqIFRoZSBjaXJjdW1zdGFuY2VzIGFuZCB0aGUgZXhjZXB0aW9uIHR5cGUgbXVzdCBiZSBkb2N1bWVudGVkIGJ5IHRoYXQKKyAgICAgKiA8dHQ+TG9jazwvdHQ+IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWUgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciB0aGUgbG9jaworICAgICAqIEBwYXJhbSB1bml0IHRoZSB0aW1lIHVuaXQgb2YgdGhlIDx0dD50aW1lPC90dD4gYXJndW1lbnQuCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBsb2NrIHdhcyBhY3F1aXJlZCBhbmQgPHR0PmZhbHNlPC90dD4KKyAgICAgKiBpZiB0aGUgd2FpdGluZyB0aW1lIGVsYXBzZWQgYmVmb3JlIHRoZSBsb2NrIHdhcyBhY3F1aXJlZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZAorICAgICAqIHdoaWxlIGFjcXVpcmluZyB0aGUgbG9jayhhbmQgaW50ZXJydXB0aW9uIG9mIGxvY2sgYWNxdWlzaXRpb24gaXMKKyAgICAgKiBzdXBwb3J0ZWQpLgorICAgICAqIEBzZWUgVGhyZWFkI2ludGVycnVwdAorICAgICAqLworICAgIGJvb2xlYW4gdHJ5TG9jayhsb25nIHRpbWUsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoZSBsb2NrLgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIEEgPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbiB3aWxsIHVzdWFsbHkgaW1wb3NlCisgICAgICogcmVzdHJpY3Rpb25zIG9uIHdoaWNoIHRocmVhZCBjYW4gcmVsZWFzZSBhIGxvY2sodHlwaWNhbGx5IG9ubHkgdGhlCisgICAgICogaG9sZGVyIG9mIHRoZSBsb2NrIGNhbiByZWxlYXNlIGl0KSBhbmQgbWF5IHRocm93CisgICAgICogYW4odW5jaGVja2VkKSBleGNlcHRpb24gaWYgdGhlIHJlc3RyaWN0aW9uIGlzIHZpb2xhdGVkLgorICAgICAqIEFueSByZXN0cmljdGlvbnMgYW5kIHRoZSBleGNlcHRpb24KKyAgICAgKiB0eXBlIG11c3QgYmUgZG9jdW1lbnRlZCBieSB0aGF0IDx0dD5Mb2NrPC90dD4gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgdm9pZCB1bmxvY2soKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIENvbmRpdGlvbn0gaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byB0aGlzCisgICAgICogPHR0PkxvY2s8L3R0PiBpbnN0YW5jZS4KKyAgICAgKiBCZWZvcmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHRoZSBsb2NrIG11c3QgYmUgaGVsZCBieSB0aGUKKyAgICAgKiBjdXJyZW50IHRocmVhZC4KKyAgICAgKiBBIGNhbGwgdG8ge0BsaW5rIENvbmRpdGlvbiNhd2FpdCgpfSB3aWxsIGF0b21pY2FsbHkgcmVsZWFzZSB0aGUgbG9jaworICAgICAqIGJlZm9yZSB3YWl0aW5nIGFuZCByZS1hY3F1aXJlIHRoZSBsb2NrIGJlZm9yZSB0aGUgd2FpdCByZXR1cm5zLgorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIFRoZSBleGFjdCBvcGVyYXRpb24gb2YgdGhlIHtAbGluayBDb25kaXRpb259IGluc3RhbmNlIGRlcGVuZHMgb24gdGhlCisgICAgICogPHR0PkxvY2s8L3R0PiBpbXBsZW1lbnRhdGlvbiBhbmQgbXVzdCBiZSBkb2N1bWVudGVkIGJ5IHRoYXQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIENvbmRpdGlvbn0gaW5zdGFuY2UgZm9yIHRoaXMgPHR0PkxvY2s8L3R0PiBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgPHR0PkxvY2s8L3R0PgorICAgICAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBDb25kaXRpb24gbmV3Q29uZGl0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvTmFub1RpbWVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvTmFub1RpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3ODFlNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9OYW5vVGltZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogV3JpdHRlbiBieSBEYXdpZCBLdXJ6eW5pZWMgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQKKyAqIGF0IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCisvKioKKyAqIEludGVyZmFjZSB0byBzcGVjaWZ5IGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBwcmVjaXNlIHRpbWVyLgorICoKKyAqIEBhdXRob3IgRGF3aWQgS3VyenluaWVjCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBOYW5vVGltZXIgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbW9zdCBwcmVjaXNlIGF2YWlsYWJsZSBzeXN0ZW0gdGltZXIsCisgICAgICogaW4gbmFub3NlY29uZHMuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgdG8gbWVhc3VyZSBlbGFwc2VkIHRpbWUgYW5kCisgICAgICogaXMgbm90IHJlbGF0ZWQgdG8gYW55IG90aGVyIG5vdGlvbiBvZiBzeXN0ZW0gb3Igd2FsbC1jbG9jayB0aW1lLiBUaGUKKyAgICAgKiB2YWx1ZSByZXR1cm5lZCByZXByZXNlbnRzIG5hbm9zZWNvbmRzIHNpbmNlIHNvbWUgZml4ZWQgYnV0IGFyYml0cmFyeQorICAgICAqIHRpbWUocGVyaGFwcyBpbiB0aGUgZnV0dXJlLCBzbyB2YWx1ZXMgbWF5IGJlIG5lZ2F0aXZlKS4gVGhpcyBtZXRob2QKKyAgICAgKiBwcm92aWRlcyBuYW5vc2Vjb25kIHByZWNpc2lvbiwgYnV0IG5vdCBuZWNlc3NhcmlseSBuYW5vc2Vjb25kIGFjY3VyYWN5LgorICAgICAqIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgaG93IGZyZXF1ZW50bHkgdmFsdWVzIGNoYW5nZS4gRGlmZmVyZW5jZXMKKyAgICAgKiBpbiBzdWNjZXNzaXZlIGNhbGxzIHRoYXQgc3BhbiBncmVhdGVyIHRoYW4gYXBwcm94aW1hdGVseSAyOTIgeWVhcnMKKyAgICAgKiAoMjYzIG5hbm9zZWNvbmRzKSB3aWxsIG5vdCBhY2N1cmF0ZWx5IGNvbXB1dGUgZWxhcHNlZCB0aW1lIGR1ZSB0bworICAgICAqIG51bWVyaWNhbCBvdmVyZmxvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN5c3RlbSB0aW1lciwgaW4gbmFub3NlY29uZHMuCisgICAgICovCisgICAgbG9uZyBuYW5vVGltZSgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1F1ZXVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc1NzgzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1F1ZXVlLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gZGVzaWduZWQgZm9yIGhvbGRpbmcgZWxlbWVudHMgcHJpb3IgdG8gcHJvY2Vzc2luZy4KKyAqIEJlc2lkZXMgYmFzaWMge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9uIENvbGxlY3Rpb259IG9wZXJhdGlvbnMsCisgKiBxdWV1ZXMgcHJvdmlkZSBhZGRpdGlvbmFsIGluc2VydGlvbiwgZXh0cmFjdGlvbiwgYW5kIGluc3BlY3Rpb24KKyAqIG9wZXJhdGlvbnMuIEVhY2ggb2YgdGhlc2UgbWV0aG9kcyBleGlzdHMgaW4gdHdvIGZvcm1zOiBvbmUgdGhyb3dzCisgKiBhbiBleGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBmYWlscywgdGhlIG90aGVyIHJldHVybnMgYSBzcGVjaWFsCisgKiB2YWx1ZShlaXRoZXIgPHR0Pm51bGw8L3R0PiBvciA8dHQ+ZmFsc2U8L3R0PiwgZGVwZW5kaW5nIG9uIHRoZQorICogb3BlcmF0aW9uKS4gVGhlIGxhdHRlciBmb3JtIG9mIHRoZSBpbnNlcnQgb3BlcmF0aW9uIGlzIGRlc2lnbmVkCisgKiBzcGVjaWZpY2FsbHkgZm9yIHVzZSB3aXRoIGNhcGFjaXR5LXJlc3RyaWN0ZWQgPHR0PlF1ZXVlPC90dD4KKyAqIGltcGxlbWVudGF0aW9uczsgaW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMsIGluc2VydCBvcGVyYXRpb25zIGNhbm5vdCBmYWlsLgorICogCisgKiAKKyAqIDx0YWJsZSBCT1JERVIgQ0VMTFBBRERJTkc9MyBDRUxMU1BBQ0lORz0xPgorICogPHRyPgorICogPHRkPjwvdGQ+CisgKiA8dGQgQUxJR049Q0VOVEVSPjxlbT5UaHJvd3MgZXhjZXB0aW9uPC9lbT48L3RkPgorICogPHRkIEFMSUdOPUNFTlRFUj48ZW0+UmV0dXJucyBzcGVjaWFsIHZhbHVlPC9lbT48L3RkPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD48Yj5JbnNlcnQ8L2I+PC90ZD4KKyAqIDx0ZD57QGxpbmsgI2FkZCBhZGQoZSl9PC90ZD4KKyAqIDx0ZD57QGxpbmsgI29mZmVyIG9mZmVyKGUpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPjxiPlJlbW92ZTwvYj48L3RkPgorICogPHRkPntAbGluayAjcmVtb3ZlIHJlbW92ZSgpfTwvdGQ+CisgKiA8dGQ+e0BsaW5rICNwb2xsIHBvbGwoKX08L3RkPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD48Yj5FeGFtaW5lPC9iPjwvdGQ+CisgKiA8dGQ+e0BsaW5rICNlbGVtZW50IGVsZW1lbnQoKX08L3RkPgorICogPHRkPntAbGluayAjcGVlayBwZWVrKCl9PC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPiBRdWV1ZXMgdHlwaWNhbGx5LCBidXQgZG8gbm90IG5lY2Vzc2FyaWx5LCBvcmRlciBlbGVtZW50cyBpbiBhCisgKiBGSUZPKGZpcnN0LWluLWZpcnN0LW91dCkgbWFubmVyLiBBbW9uZyB0aGUgZXhjZXB0aW9ucyBhcmUKKyAqIHByaW9yaXR5IHF1ZXVlcywgd2hpY2ggb3JkZXIgZWxlbWVudHMgYWNjb3JkaW5nIHRvIGEgc3VwcGxpZWQKKyAqIGNvbXBhcmF0b3IsIG9yIHRoZSBlbGVtZW50cycgbmF0dXJhbCBvcmRlcmluZywgYW5kIExJRk8gcXVldWVzKG9yCisgKiBzdGFja3MpIHdoaWNoIG9yZGVyIHRoZSBlbGVtZW50cyBMSUZPKGxhc3QtaW4tZmlyc3Qtb3V0KS4KKyAqIFdoYXRldmVyIHRoZSBvcmRlcmluZyB1c2VkLCB0aGUgPGVtPmhlYWQ8L2VtPiBvZiB0aGUgcXVldWUgaXMgdGhhdAorICogZWxlbWVudCB3aGljaCB3b3VsZCBiZSByZW1vdmVkIGJ5IGEgY2FsbCB0byB7QGxpbmsgI3JlbW92ZSgpIH0gb3IKKyAqIHtAbGluayAjcG9sbCgpfS4gSW4gYSBGSUZPIHF1ZXVlLCBhbGwgbmV3IGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBhdAorICogdGhlIDxlbT4gdGFpbDwvZW0+IG9mIHRoZSBxdWV1ZS4gT3RoZXIga2luZHMgb2YgcXVldWVzIG1heSB1c2UKKyAqIGRpZmZlcmVudCBwbGFjZW1lbnQgcnVsZXMuIEV2ZXJ5IDx0dD5RdWV1ZTwvdHQ+IGltcGxlbWVudGF0aW9uCisgKiBtdXN0IHNwZWNpZnkgaXRzIG9yZGVyaW5nIHByb3BlcnRpZXMuCisgKiBUaGUge0BsaW5rICNvZmZlciBvZmZlcn0gbWV0aG9kIGluc2VydHMgYW4gZWxlbWVudCBpZiBwb3NzaWJsZSwKKyAqIG90aGVyd2lzZSByZXR1cm5pbmcgPHR0PmZhbHNlPC90dD4uIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB7QGxpbmsKKyAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZCBDb2xsZWN0aW9uLmFkZH0gbWV0aG9kLCB3aGljaCBjYW4gZmFpbCB0bworICogYWRkIGFuIGVsZW1lbnQgb25seSBieSB0aHJvd2luZyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLiBUaGUKKyAqIDx0dD5vZmZlcjwvdHQ+IG1ldGhvZCBpcyBkZXNpZ25lZCBmb3IgdXNlIHdoZW4gZmFpbHVyZSBpcyBhIG5vcm1hbCwKKyAqIHJhdGhlciB0aGFuIGV4Y2VwdGlvbmFsIG9jY3VycmVuY2UsIGZvciBleGFtcGxlLCBpbiBmaXhlZC1jYXBhY2l0eQorICogKG9yICZxdW90O2JvdW5kZWQmcXVvdDspIHF1ZXVlcy4KKyAqIFRoZSB7QGxpbmsgI3JlbW92ZSgpfSBhbmQge0BsaW5rICNwb2xsKCl9IG1ldGhvZHMgcmVtb3ZlIGFuZAorICogcmV0dXJuIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAqIEV4YWN0bHkgd2hpY2ggZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGlzIGEKKyAqIGZ1bmN0aW9uIG9mIHRoZSBxdWV1ZSdzIG9yZGVyaW5nIHBvbGljeSwgd2hpY2ggZGlmZmVycyBmcm9tCisgKiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4gVGhlIDx0dD5yZW1vdmUoKTwvdHQ+IGFuZAorICogPHR0PnBvbGwoKTwvdHQ+IG1ldGhvZHMgZGlmZmVyIG9ubHkgaW4gdGhlaXIgYmVoYXZpb3Igd2hlbiB0aGUKKyAqIHF1ZXVlIGlzIGVtcHR5OiB0aGUgPHR0PnJlbW92ZSgpPC90dD4gbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sCisgKiB3aGlsZSB0aGUgPHR0PnBvbGwoKTwvdHQ+IG1ldGhvZCByZXR1cm5zIDx0dD5udWxsPC90dD4uCisgKiBUaGUge0BsaW5rICNlbGVtZW50KCl9IGFuZCB7QGxpbmsgI3BlZWsoKX0gbWV0aG9kcyByZXR1cm4sIGJ1dCBkbworICogbm90IHJlbW92ZSwgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICogVGhlIDx0dD5RdWV1ZTwvdHQ+IGludGVyZmFjZSBkb2VzIG5vdCBkZWZpbmUgdGhlIDxpPmJsb2NraW5nIHF1ZXVlCisgKiBtZXRob2RzPC9pPiwgd2hpY2ggYXJlIGNvbW1vbiBpbiBjb25jdXJyZW50IHByb2dyYW1taW5nLiBUaGVzZSBtZXRob2RzLAorICogd2hpY2ggd2FpdCBmb3IgZWxlbWVudHMgdG8gYXBwZWFyIG9yIGZvciBzcGFjZSB0byBiZWNvbWUgYXZhaWxhYmxlLCBhcmUKKyAqIGRlZmluZWQgaW4gdGhlIHtAbGluayBlZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWV9IGludGVyZmFjZSwgd2hpY2gKKyAqIGV4dGVuZHMgdGhpcyBpbnRlcmZhY2UuCisgKiAKKyAqIDx0dD5RdWV1ZTwvdHQ+IGltcGxlbWVudGF0aW9ucyBnZW5lcmFsbHkgZG8gbm90IGFsbG93IGluc2VydGlvbgorICogb2YgPHR0Pm51bGw8L3R0PiBlbGVtZW50cywgYWx0aG91Z2ggc29tZSBpbXBsZW1lbnRhdGlvbnMsIHN1Y2ggYXMKKyAqIHtAbGluayBMaW5rZWRMaXN0fSwgZG8gbm90IHByb2hpYml0IGluc2VydGlvbiBvZiA8dHQ+bnVsbDwvdHQ+LgorICogRXZlbiBpbiB0aGUgaW1wbGVtZW50YXRpb25zIHRoYXQgcGVybWl0IGl0LCA8dHQ+bnVsbDwvdHQ+IHNob3VsZAorICogbm90IGJlIGluc2VydGVkIGludG8gYSA8dHQ+UXVldWU8L3R0PiwgYXMgPHR0Pm51bGw8L3R0PiBpcyBhbHNvCisgKiB1c2VkIGFzIGEgc3BlY2lhbCByZXR1cm4gdmFsdWUgYnkgdGhlIDx0dD5wb2xsPC90dD4gbWV0aG9kIHRvCisgKiBpbmRpY2F0ZSB0aGF0IHRoZSBxdWV1ZSBjb250YWlucyBubyBlbGVtZW50cy4KKyAqIAorICogPHR0PlF1ZXVlPC90dD4gaW1wbGVtZW50YXRpb25zIGdlbmVyYWxseSBkbyBub3QgZGVmaW5lCisgKiBlbGVtZW50LWJhc2VkIHZlcnNpb25zIG9mIG1ldGhvZHMgPHR0PmVxdWFsczwvdHQ+IGFuZAorICogPHR0Pmhhc2hDb2RlPC90dD4gYnV0IGluc3RlYWQgaW5oZXJpdCB0aGUgaWRlbnRpdHkgYmFzZWQgdmVyc2lvbnMKKyAqIGZyb20gY2xhc3MgPHR0Pk9iamVjdDwvdHQ+LCBiZWNhdXNlIGVsZW1lbnQtYmFzZWQgZXF1YWxpdHkgaXMgbm90CisgKiBhbHdheXMgd2VsbC1kZWZpbmVkIGZvciBxdWV1ZXMgd2l0aCB0aGUgc2FtZSBlbGVtZW50cyBidXQgZGlmZmVyZW50CisgKiBvcmRlcmluZyBwcm9wZXJ0aWVzLgorICogIFRoaXMgaW50ZXJmYWNlIGlzIGEgbWVtYmVyIG9mIHRoZQorICogPGEgaHJlZj0ie0Bkb2NSb290fS8uLi9ndWlkZS9jb2xsZWN0aW9ucy9pbmRleC5odG1sIj4KKyAqIEphdmEgQ29sbGVjdGlvbnMgRnJhbWV3b3JrPC9hPi4KKyAqCisgKiBAYXV0aG9yIERvdWcgTGVhCisgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uCisgKiBAc2VlIExpbmtlZExpc3QKKyAqIEBzZWUgUHJpb3JpdHlRdWV1ZQorICogQHNlZSBlZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUKKyAqIEBzZWUgZWR1LmVtb3J5Lm1hdGhjcy5iYWNrcG9ydC5qYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlCisgKiBAc2VlIGVkdS5lbW9yeS5tYXRoY3MuYmFja3BvcnQuamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlCisgKiBAc2VlIGVkdS5lbW9yeS5tYXRoY3MuYmFja3BvcnQuamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZQorICogQHNlZSBlZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50LlByaW9yaXR5QmxvY2tpbmdRdWV1ZQorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXVlIGV4dGVuZHMgQ29sbGVjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoaXMgcXVldWUgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8gc28KKyAgICAgKiBpbW1lZGlhdGVseSB3aXRob3V0IHZpb2xhdGluZyBjYXBhY2l0eSByZXN0cmljdGlvbnMsIHJldHVybmluZworICAgICAqIDx0dD50cnVlPC90dD4gdXBvbiBzdWNjZXNzIGFuZCB0aHJvd2luZyBhbiA8dHQ+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC90dD4KKyAgICAgKiBpZiBubyBzcGFjZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGVsZW1lbnQgdG8gYWRkCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IChhcyBzcGVjaWZpZWQgYnkge0BsaW5rIENvbGxlY3Rpb24jYWRkfSkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgYWRkZWQgYXQgdGhpcworICAgICAqIHRpbWUgZHVlIHRvIGNhcGFjaXR5IHJlc3RyaWN0aW9ucworICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsIGFuZAorICAgICAqIHRoaXMgcXVldWUgbm90IHBlcm1pdCBudWxsIGVsZW1lbnRzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKi8KKyAgICBib29sZWFuIGFkZChPYmplY3QgZSk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoaXMgcXVldWUgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8KKyAgICAgKiBzbyBpbW1lZGlhdGVseSB3aXRob3V0IHZpb2xhdGluZyBjYXBhY2l0eSByZXN0cmljdGlvbnMuCisgICAgICogV2hlbiB1c2luZyBhIGNhcGFjaXR5LXJlc3RyaWN0ZWQgcXVldWUsIHRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseQorICAgICAqIHByZWZlcmFibGUgdG8ge0BsaW5rICNhZGR9LCB3aGljaCBjYW4gZmFpbCB0byBpbnNlcnQgYW4gZWxlbWVudCBvbmx5CisgICAgICogYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGVsZW1lbnQgdG8gYWRkCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBlbGVtZW50IHdhcyBhZGRlZCB0byB0aGlzIHF1ZXVlLCBlbHNlCisgICAgICogPHR0PmZhbHNlPC90dD4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50CisgICAgICogcHJldmVudHMgaXQgZnJvbSBiZWluZyBhZGRlZCB0byB0aGlzIHF1ZXVlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgbnVsbCBhbmQKKyAgICAgKiB0aGlzIHF1ZXVlIGRvZXMgbm90IHBlcm1pdCBudWxsIGVsZW1lbnRzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKi8KKyAgICBib29sZWFuIG9mZmVyKE9iamVjdCBlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGlzIHF1ZXVlLiBUaGlzIG1ldGhvZCBkaWZmZXJzCisgICAgICogZnJvbSB7QGxpbmsgI3BvbGwgcG9sbH0gb25seSBpbiB0aGF0IGl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhpcworICAgICAqIHF1ZXVlIGlzIGVtcHR5LiBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZQorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGlzIHF1ZXVlIGlzIGVtcHR5CisgICAgICovCisgICAgT2JqZWN0IHJlbW92ZSgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFuZCByZW1vdmVzIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsCisgICAgICogb3IgcmV0dXJucyA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eQorICAgICAqLworICAgIE9iamVjdCBwb2xsKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMsIGJ1dCBkb2VzIG5vdCByZW1vdmUsIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUuIFRoaXMgbWV0aG9kCisgICAgICogZGlmZmVycyBmcm9tIHtAbGluayAjcGVlayBwZWVrfSBvbmx5IGluIHRoYXQgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eQorICAgICAqLworICAgIE9iamVjdCBlbGVtZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMsIGJ1dCBkb2VzIG5vdCByZW1vdmUsIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsCisgICAgICogb3IgcmV0dXJucyA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eQorICAgICAqLworICAgIE9iamVjdCBwZWVrKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvUmVlbnRyYW50TG9jay5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1JlZW50cmFudExvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRiM2NlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1JlZW50cmFudExvY2suamF2YQpAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIEEgcmVlbnRyYW50IG11dHVhbCBleGNsdXNpb24ge0BsaW5rIExvY2t9IHdpdGggdGhlIHNhbWUgYmFzaWMKKyAqIGJlaGF2aW9yIGFuZCBzZW1hbnRpY3MgYXMgdGhlIGltcGxpY2l0IG1vbml0b3IgbG9jayBhY2Nlc3NlZCB1c2luZworICogPHR0PnN5bmNocm9uaXplZDwvdHQ+IG1ldGhvZHMgYW5kIHN0YXRlbWVudHMsIGJ1dCB3aXRoIGV4dGVuZGVkIGNhcGFiaWxpdGllcy4KKyAqIEEgPHR0PlJlZW50cmFudExvY2s8L3R0PiBpcyA8ZW0+b3duZWQ8L2VtPiBieSB0aGUgdGhyZWFkIGxhc3QKKyAqIHN1Y2Nlc3NmdWxseSBsb2NraW5nLCBidXQgbm90IHlldCB1bmxvY2tpbmcgaXQuIEEgdGhyZWFkIGludm9raW5nCisgKiA8dHQ+bG9jazwvdHQ+IHdpbGwgcmV0dXJuLCBzdWNjZXNzZnVsbHkgYWNxdWlyaW5nIHRoZSBsb2NrLCB3aGVuCisgKiB0aGUgbG9jayBpcyBub3Qgb3duZWQgYnkgYW5vdGhlciB0aHJlYWQuIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4KKyAqIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IHRocmVhZCBhbHJlYWR5IG93bnMgdGhlIGxvY2suIFRoaXMgY2FuCisgKiBiZSBjaGVja2VkIHVzaW5nIG1ldGhvZHMge0BsaW5rICNpc0hlbGRCeUN1cnJlbnRUaHJlYWR9LCBhbmQge0BsaW5rCisgKiAjZ2V0SG9sZENvdW50fS4gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzIGFjY2VwdHMgYW4gb3B0aW9uYWwKKyAqIDxlbT5mYWlybmVzczwvZW0+IHBhcmFtZXRlci4gV2hlbiBzZXQgPHR0PnRydWU8L3R0PiwgdW5kZXIKKyAqIGNvbnRlbnRpb24sIGxvY2tzIGZhdm9yIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgbG9uZ2VzdC13YWl0aW5nCisgKiB0aHJlYWQuIE90aGVyd2lzZSB0aGlzIGxvY2sgZG9lcyBub3QgZ3VhcmFudGVlIGFueSBwYXJ0aWN1bGFyCisgKiBhY2Nlc3Mgb3JkZXIuIFByb2dyYW1zIHVzaW5nIGZhaXIgbG9ja3MgYWNjZXNzZWQgYnkgbWFueSB0aHJlYWRzCisgKiBtYXkgZGlzcGxheSBsb3dlciBvdmVyYWxsIHRocm91Z2hwdXQoaS5lLiwgYXJlIHNsb3dlcjsgb2Z0ZW4gbXVjaAorICogc2xvd2VyKSB0aGFuIHRob3NlIHVzaW5nIHRoZSBkZWZhdWx0IHNldHRpbmcsIGJ1dCBoYXZlIHNtYWxsZXIKKyAqIHZhcmlhbmNlcyBpbiB0aW1lcyB0byBvYnRhaW4gbG9ja3MgYW5kIGd1YXJhbnRlZSBsYWNrIG9mCisgKiBzdGFydmF0aW9uLiBOb3RlIGhvd2V2ZXIsIHRoYXQgZmFpcm5lc3Mgb2YgbG9ja3MgZG9lcyBub3QgZ3VhcmFudGVlCisgKiBmYWlybmVzcyBvZiB0aHJlYWQgc2NoZWR1bGluZy4gVGh1cywgb25lIG9mIG1hbnkgdGhyZWFkcyB1c2luZyBhCisgKiBmYWlyIGxvY2sgbWF5IG9idGFpbiBpdCBtdWx0aXBsZSB0aW1lcyBpbiBzdWNjZXNzaW9uIHdoaWxlIG90aGVyCisgKiBhY3RpdmUgdGhyZWFkcyBhcmUgbm90IHByb2dyZXNzaW5nIGFuZCBub3QgY3VycmVudGx5IGhvbGRpbmcgdGhlIGxvY2suCisgKiBBbHNvIG5vdGUgdGhhdCB0aGUgdW50aW1lZCB7QGxpbmsgI3RyeUxvY2soKSB0cnlMb2NrfSBtZXRob2QgZG9lcyBub3QKKyAqIGhvbm9yIHRoZSBmYWlybmVzcyBzZXR0aW5nLiBJdCB3aWxsIHN1Y2NlZWQgaWYgdGhlIGxvY2sKKyAqIGlzIGF2YWlsYWJsZSBldmVuIGlmIG90aGVyIHRocmVhZHMgYXJlIHdhaXRpbmcuCisgKiBJdCBpcyByZWNvbW1lbmRlZCBwcmFjdGljZSB0byA8ZW0+YWx3YXlzPC9lbT4gaW1tZWRpYXRlbHkKKyAqIGZvbGxvdyBhIGNhbGwgdG8gPHR0PmxvY2s8L3R0PiB3aXRoIGEgPHR0PnRyeTwvdHQ+IGJsb2NrLCBtb3N0CisgKiB0eXBpY2FsbHkgaW4gYSBiZWZvcmUvYWZ0ZXIgY29uc3RydWN0aW9uIHN1Y2ggYXM6CisgKiAKKyAqIDxwcmU+IGNsYXNzIFggeyBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgKiAvLyAuLi4gcHVibGljIHZvaWQgbSgpIHsgbG9jay5sb2NrKCk7IC8vIGJsb2NrIHVudGlsIGNvbmRpdGlvbiBob2xkcyB0cnkgeworICogLy8gLi4uIG1ldGhvZCBib2R5IH0gZmluYWxseSB7IGxvY2sudW5sb2NrKCkgfSB9IH0KKyAqIDwvcHJlPiBJbiBhZGRpdGlvbiB0byBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBMb2NrfSBpbnRlcmZhY2UsIHRoaXMKKyAqIGNsYXNzIGRlZmluZXMgbWV0aG9kcyA8dHQ+aXNMb2NrZWQ8L3R0PiBhbmQKKyAqIDx0dD5nZXRMb2NrUXVldWVMZW5ndGg8L3R0PiwgYXMgd2VsbCBhcyBzb21lIGFzc29jaWF0ZWQKKyAqIDx0dD5wcm90ZWN0ZWQ8L3R0PiBhY2Nlc3MgbWV0aG9kcyB0aGF0IG1heSBiZSB1c2VmdWwgZm9yCisgKiBpbnN0cnVtZW50YXRpb24gYW5kIG1vbml0b3JpbmcuCisgKiBTZXJpYWxpemF0aW9uIG9mIHRoaXMgY2xhc3MgYmVoYXZlcyBpbiB0aGUgc2FtZSB3YXkgYXMgYnVpbHQtaW4KKyAqIGxvY2tzOiBhIGRlc2VyaWFsaXplZCBsb2NrIGlzIGluIHRoZSB1bmxvY2tlZCBzdGF0ZSwgcmVnYXJkbGVzcyBvZgorICogaXRzIHN0YXRlIHdoZW4gc2VyaWFsaXplZC4KKyAqIFRoaXMgbG9jayBzdXBwb3J0cyBhIG1heGltdW0gb2YgMjE0NzQ4MzY0NyByZWN1cnNpdmUgbG9ja3MgYnkKKyAqIHRoZSBzYW1lIHRocmVhZC4gQXR0ZW1wdHMgdG8gZXhjZWVkIHRoaXMgbGltaXQgcmVzdWx0IGluCisgKiB7QGxpbmsgRXJyb3J9IHRocm93cyBmcm9tIGxvY2tpbmcgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIERvdWcgTGVhCisgKiBAYXV0aG9yIERhd2lkIEt1cnp5bmllYworICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgY2xhc3MgUmVlbnRyYW50TG9jayBpbXBsZW1lbnRzIExvY2ssIGphdmEuaW8uU2VyaWFsaXphYmxlLAorICAgIENvbmRWYXIuRXhjbHVzaXZlTG9jayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MzczOTg0ODcyNTcyNDE0Njk5TDsKKworICAgIHByaXZhdGUgZmluYWwgU3luYyBzeW5jOworCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN5bmMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUxNzk1MjM3NjIwMzQwMjU4NjBMOworCisgICAgICAgIHByb3RlY3RlZCB0cmFuc2llbnQgVGhyZWFkIG93bmVyXyA9IG51bGw7CisgICAgICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IGhvbGRzXyA9IDA7CisKKyAgICAgICAgcHJvdGVjdGVkIFN5bmMoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2NrKCk7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbG9ja0ludGVycnVwdGlibHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisKKyAgICAgICAgZmluYWwgdm9pZCBpbmNIb2xkcygpIHsKKyAgICAgICAgICAgIGludCBuZXh0SG9sZHMgPSArK2hvbGRzXzsKKyAgICAgICAgICAgIGlmIChuZXh0SG9sZHMgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTWF4aW11bSBsb2NrIGNvdW50IGV4Y2VlZGVkIik7CisgICAgICAgICAgICBob2xkc18gPSBuZXh0SG9sZHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0cnlMb2NrKCkgeworICAgICAgICAgICAgVGhyZWFkIGNhbGxlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3duZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3duZXJfID0gY2FsbGVyOworICAgICAgICAgICAgICAgICAgICBob2xkc18gPSAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxlciA9PSBvd25lcl8pIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jSG9sZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdHJ5TG9jayhsb25nIG5hbm9zKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdW5sb2NrKCk7CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SG9sZENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGlzSGVsZEJ5Q3VycmVudFRocmVhZCgpID8gaG9sZHNfIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaG9sZHNfID4gMCAmJiBUaHJlYWQuY3VycmVudFRocmVhZCgpID09IG93bmVyXzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0xvY2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvd25lcl8gIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmFpcigpOworCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgVGhyZWFkIGdldE93bmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG93bmVyXzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1F1ZXVlZFRocmVhZHMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBGQUlSIHZlcnNpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UXVldWVMZW5ndGgoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBGQUlSIHZlcnNpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFF1ZXVlZFRocmVhZHMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBGQUlSIHZlcnNpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWVkKFRocmVhZCB0aHJlYWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIEZBSVIgdmVyc2lvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgc3RhdGljIGNsYXNzIE5vbmZhaXJTeW5jIGV4dGVuZHMgU3luYyB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzMxNjE1MzU2Mzc4MjgyMzY5MUw7CisKKyAgICAgICAgTm9uZmFpclN5bmMoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgICAgICAgICAgVGhyZWFkIGNhbGxlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3duZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3duZXJfID0gY2FsbGVyOworICAgICAgICAgICAgICAgICAgICBob2xkc18gPSAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYWxsZXIgPT0gb3duZXJfKSB7CisgICAgICAgICAgICAgICAgICAgIGluY0hvbGRzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdhc0ludGVycnVwdGVkID0gVGhyZWFkLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0ludGVycnVwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBub3RpZnk7IGlmIHdlIHdlcmUgc2lnbmFsbGVkLCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGFjdCBhcyBzaWduYWxsZWQsIGlnbm9yaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnJ1cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyXyA9IGNhbGxlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZHNfID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXNJbnRlcnJ1cHRlZCkgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGxvY2tJbnRlcnJ1cHRpYmx5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBUaHJlYWQgY2FsbGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChvd25lcl8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvd25lcl8gPSBjYWxsZXI7CisgICAgICAgICAgICAgICAgICAgIGhvbGRzXyA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxlciA9PSBvd25lcl8pIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jSG9sZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob3duZXJfICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfID0gY2FsbGVyOworICAgICAgICAgICAgICAgICAgICAgICAgaG9sZHNfID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lcl8gPT0gbnVsbCkgbm90aWZ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRyeUxvY2sobG9uZyBuYW5vcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBUaHJlYWQgY2FsbGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKG93bmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG93bmVyXyA9IGNhbGxlcjsKKyAgICAgICAgICAgICAgICAgICAgaG9sZHNfID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYWxsZXIgPT0gb3duZXJfKSB7CisgICAgICAgICAgICAgICAgICAgIGluY0hvbGRzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFub3MgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gVXRpbHMubmFub1RpbWUoKSArIG5hbm9zOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IDspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy50aW1lZFdhaXQodGhpcywgbmFub3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZXIgPT0gb3duZXJfKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY0hvbGRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3duZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfID0gY2FsbGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkc18gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW5vcyA9IGRlYWRsaW5lIC0gVXRpbHMubmFub1RpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbm9zIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyXyA9PSBudWxsKSBub3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVubG9jaygpIHsKKyAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpICE9IG93bmVyXykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigiTm90IG93bmVyIik7CisKKyAgICAgICAgICAgIGlmICgtLWhvbGRzXyA9PSAwKSB7CisgICAgICAgICAgICAgICAgb3duZXJfID0gbnVsbDsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRmFpcigpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBGYWlyU3luYyBleHRlbmRzIFN5bmMgaW1wbGVtZW50cyBXYWl0UXVldWUuUXVldWVkU3luYyB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMwMDA4OTc4OTcwOTA0NjY1NDBMOworCisgICAgICAgIHByaXZhdGUgdHJhbnNpZW50IFdhaXRRdWV1ZSB3cV8gPSBuZXcgRklGT1dhaXRRdWV1ZSgpOworCisgICAgICAgIEZhaXJTeW5jKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2hlY2soV2FpdFF1ZXVlLldhaXROb2RlIG5vZGUpIHsKKyAgICAgICAgICAgIFRocmVhZCBjYWxsZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgaWYgKG93bmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3duZXJfID0gY2FsbGVyOworICAgICAgICAgICAgICAgIGhvbGRzXyA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxlciA9PSBvd25lcl8pIHsKKyAgICAgICAgICAgICAgICBpbmNIb2xkcygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3FfLmluc2VydChub2RlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0YWtlT3ZlcihXYWl0UXVldWUuV2FpdE5vZGUgbm9kZSkgeworICAgICAgICAgICAgLy8gYXNzZXJ0KGhvbGRzXyA9PSAxICYmIG93bmVyXyA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpCisgICAgICAgICAgICBvd25lcl8gPSBub2RlLmdldE93bmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2NrKCkgeworICAgICAgICAgICAgVGhyZWFkIGNhbGxlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3duZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3duZXJfID0gY2FsbGVyOworICAgICAgICAgICAgICAgICAgICBob2xkc18gPSAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYWxsZXIgPT0gb3duZXJfKSB7CisgICAgICAgICAgICAgICAgICAgIGluY0hvbGRzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBXYWl0UXVldWUuV2FpdE5vZGUgbiA9IG5ldyBXYWl0UXVldWUuV2FpdE5vZGUoKTsKKyAgICAgICAgICAgIG4uZG9XYWl0VW5pbnRlcnJ1cHRpYmx5KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbG9ja0ludGVycnVwdGlibHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIFRocmVhZCBjYWxsZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKG93bmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG93bmVyXyA9IGNhbGxlcjsKKyAgICAgICAgICAgICAgICAgICAgaG9sZHNfID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGVyID09IG93bmVyXykgeworICAgICAgICAgICAgICAgICAgICBpbmNIb2xkcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgV2FpdFF1ZXVlLldhaXROb2RlIG4gPSBuZXcgV2FpdFF1ZXVlLldhaXROb2RlKCk7CisgICAgICAgICAgICBuLmRvV2FpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRyeUxvY2sobG9uZyBuYW5vcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBUaHJlYWQgY2FsbGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChvd25lcl8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvd25lcl8gPSBjYWxsZXI7CisgICAgICAgICAgICAgICAgICAgIGhvbGRzXyA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGVyID09IG93bmVyXykgeworICAgICAgICAgICAgICAgICAgICBpbmNIb2xkcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBXYWl0UXVldWUuV2FpdE5vZGUgbiA9IG5ldyBXYWl0UXVldWUuV2FpdE5vZGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuLmRvVGltZWRXYWl0KHRoaXMsIG5hbm9zKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgV2FpdFF1ZXVlLldhaXROb2RlIGdldFNpZ25hbGxlZShUaHJlYWQgY2FsbGVyKSB7CisgICAgICAgICAgICBpZiAoY2FsbGVyICE9IG93bmVyXykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbigiTm90IG93bmVyIik7CisgICAgICAgICAgICAvLyBhc3NlcnQoaG9sZHNfID4gMCkKKyAgICAgICAgICAgIGlmIChob2xkc18gPj0gMikgeyAvLyBjdXJyZW50IHRocmVhZCB3aWxsIGtlZXAgdGhlIGxvY2sKKyAgICAgICAgICAgICAgICAtLWhvbGRzXzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFzc2VydChob2xkc18gPT0gMSkKKyAgICAgICAgICAgIFdhaXRRdWV1ZS5XYWl0Tm9kZSB3ID0gd3FfLmV4dHJhY3QoKTsKKyAgICAgICAgICAgIGlmICh3ID09IG51bGwpIHsgLy8gaWYgbm9uZSwgY2xlYXIgZm9yIG5ldyBhcnJpdmFscworICAgICAgICAgICAgICAgIG93bmVyXyA9IG51bGw7CisgICAgICAgICAgICAgICAgaG9sZHNfID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdW5sb2NrKCkgeworICAgICAgICAgICAgVGhyZWFkIGNhbGxlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICBmb3IgKDsgOykgeworICAgICAgICAgICAgICAgIFdhaXRRdWV1ZS5XYWl0Tm9kZSB3ID0gZ2V0U2lnbmFsbGVlKGNhbGxlcik7CisgICAgICAgICAgICAgICAgaWYgKHcgPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBvbmUgdG8gc2lnbmFsCisgICAgICAgICAgICAgICAgaWYgKHcuc2lnbmFsKHRoaXMpKSByZXR1cm47IC8vIG5vdGlmeSBpZiBzdGlsbCB3YWl0aW5nLCBvciBza2lwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZhaXIoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNRdWV1ZWRUaHJlYWRzKCkgeworICAgICAgICAgICAgcmV0dXJuIHdxXy5oYXNOb2RlcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UXVldWVMZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gd3FfLmdldExlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uIGdldFF1ZXVlZFRocmVhZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gd3FfLmdldFdhaXRpbmdUaHJlYWRzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNRdWV1ZWQoVGhyZWFkIHRocmVhZCkgeworICAgICAgICAgICAgcmV0dXJuIHdxXy5pc1dhaXRpbmcodGhyZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgd3FfID0gbmV3IEZJRk9XYWl0UXVldWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPHR0PlJlZW50cmFudExvY2s8L3R0Pi4KKyAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgPHR0PlJlZW50cmFudExvY2soZmFsc2UpPC90dD4uCisgICAgICovCisgICAgcHVibGljIFJlZW50cmFudExvY2soKSB7CisgICAgICAgIHN5bmMgPSBuZXcgTm9uZmFpclN5bmMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDx0dD5SZWVudHJhbnRMb2NrPC90dD4gd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBmYWlybmVzcyBwb2xpY3kuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFpciB0cnVlIGlmIHRoaXMgbG9jayB3aWxsIGJlIGZhaXI7IGVsc2UgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVlbnRyYW50TG9jayhib29sZWFuIGZhaXIpIHsKKyAgICAgICAgc3luYyA9IChmYWlyKSA/IChTeW5jKSBuZXcgRmFpclN5bmMoKSA6IG5ldyBOb25mYWlyU3luYygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrLgorICAgICAqIEFjcXVpcmVzIHRoZSBsb2NrIGlmIGl0IGlzIG5vdCBoZWxkIGJ5IGFub3RoZXIgdGhyZWFkIGFuZCByZXR1cm5zCisgICAgICogaW1tZWRpYXRlbHksIHNldHRpbmcgdGhlIGxvY2sgaG9sZCBjb3VudCB0byBvbmUuIElmIHRoZSBjdXJyZW50IHRocmVhZAorICAgICAqIGFscmVhZHkgaG9sZHMgdGhlIGxvY2sgdGhlbiB0aGUgaG9sZCBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSBvbmUgYW5kCisgICAgICogdGhlIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LgorICAgICAqIElmIHRoZSBsb2NrIGlzIGhlbGQgYnkgYW5vdGhlciB0aHJlYWQgdGhlbiB0aGUKKyAgICAgKiBjdXJyZW50IHRocmVhZCBiZWNvbWVzIGRpc2FibGVkIGZvciB0aHJlYWQgc2NoZWR1bGluZworICAgICAqIHB1cnBvc2VzIGFuZCBsaWVzIGRvcm1hbnQgdW50aWwgdGhlIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQsCisgICAgICogYXQgd2hpY2ggdGltZSB0aGUgbG9jayBob2xkIGNvdW50IGlzIHNldCB0byBvbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9jaygpIHsKKyAgICAgICAgc3luYy5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIGxvY2sgdW5sZXNzIHRoZSBjdXJyZW50IHRocmVhZCBpcworICAgICAqIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdGVkfS4KKyAgICAgKiBBY3F1aXJlcyB0aGUgbG9jayBpZiBpdCBpcyBub3QgaGVsZCBieSBhbm90aGVyIHRocmVhZCBhbmQgcmV0dXJucworICAgICAqIGltbWVkaWF0ZWx5LCBzZXR0aW5nIHRoZSBsb2NrIGhvbGQgY291bnQgdG8gb25lLgorICAgICAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBhbHJlYWR5IGhvbGRzIHRoaXMgbG9jayB0aGVuIHRoZSBob2xkIGNvdW50CisgICAgICogaXMgaW5jcmVtZW50ZWQgYnkgb25lIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuCisgICAgICogSWYgdGhlIGxvY2sgaXMgaGVsZCBieSBhbm90aGVyIHRocmVhZCB0aGVuIHRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIGJlY29tZXMgZGlzYWJsZWQgZm9yIHRocmVhZCBzY2hlZHVsaW5nCisgICAgICogcHVycG9zZXMgYW5kIGxpZXMgZG9ybWFudCB1bnRpbCBvbmUgb2YgdHdvIHRoaW5ncyBoYXBwZW5zOgorICAgICAqIAorICAgICAqIDx1bD4KKyAgICAgKiAKKyAgICAgKiA8bGk+VGhlIGxvY2sgaXMgYWNxdWlyZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkOyBvcgorICAgICAqIAorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRzfSB0aGUgY3VycmVudAorICAgICAqIHRocmVhZC4KKyAgICAgKiAKKyAgICAgKiA8L3VsPiBJZiB0aGUgbG9jayBpcyBhY3F1aXJlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgdGhlbiB0aGUgbG9jayBob2xkCisgICAgICogY291bnQgaXMgc2V0IHRvIG9uZS4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkOgorICAgICAqIAorICAgICAqIDx1bD4KKyAgICAgKiAKKyAgICAgKiA8bGk+aGFzIGl0cyBpbnRlcnJ1cHRlZCBzdGF0dXMgc2V0IG9uIGVudHJ5IHRvIHRoaXMgbWV0aG9kOyBvcgorICAgICAqIAorICAgICAqIDxsaT5pcyB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRlZH0gd2hpbGUgYWNxdWlyaW5nIHRoZSBsb2NrLAorICAgICAqIAorICAgICAqIDwvdWw+CisgICAgICogdGhlbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlzIHRocm93biBhbmQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MKKyAgICAgKiBpbnRlcnJ1cHRlZCBzdGF0dXMgaXMgY2xlYXJlZC4KKyAgICAgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBhcyB0aGlzIG1ldGhvZCBpcyBhbiBleHBsaWNpdCBpbnRlcnJ1cHRpb24KKyAgICAgKiBwb2ludCwgcHJlZmVyZW5jZSBpcworICAgICAqIGdpdmVuIHRvIHJlc3BvbmRpbmcgdG8gdGhlIGludGVycnVwdCBvdmVyIG5vcm1hbCBvciByZWVudHJhbnQKKyAgICAgKiBhY3F1aXNpdGlvbiBvZiB0aGUgbG9jay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9ja0ludGVycnVwdGlibHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBzeW5jLmxvY2tJbnRlcnJ1cHRpYmx5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIGxvY2sgb25seSBpZiBpdCBpcyBub3QgaGVsZCBieSBhbm90aGVyIHRocmVhZCBhdCB0aGUgdGltZQorICAgICAqIG9mIGludm9jYXRpb24uIEFjcXVpcmVzIHRoZSBsb2NrIGlmIGl0IGlzIG5vdCBoZWxkIGJ5IGFub3RoZXIgdGhyZWFkIGFuZAorICAgICAqIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCB0aGUgdmFsdWUgPHR0PnRydWU8L3R0Piwgc2V0dGluZyB0aGUKKyAgICAgKiBsb2NrIGhvbGQgY291bnQgdG8gb25lLiBFdmVuIHdoZW4gdGhpcyBsb2NrIGhhcyBiZWVuIHNldCB0byB1c2UgYQorICAgICAqIGZhaXIgb3JkZXJpbmcgcG9saWN5LCBhIGNhbGwgdG8gPHR0PnRyeUxvY2soKTwvdHQ+IDxlbT53aWxsPC9lbT4KKyAgICAgKiBpbW1lZGlhdGVseSBhY3F1aXJlIHRoZSBsb2NrIGlmIGl0IGlzIGF2YWlsYWJsZSwgd2hldGhlciBvciBub3QKKyAgICAgKiBvdGhlciB0aHJlYWRzIGFyZSBjdXJyZW50bHkgd2FpdGluZyBmb3IgdGhlIGxvY2suCisgICAgICogVGhpcyAmcXVvdDtiYXJnaW5nJnF1b3Q7IGJlaGF2aW9yIGNhbiBiZSB1c2VmdWwgaW4gY2VydGFpbgorICAgICAqIGNpcmN1bXN0YW5jZXMsIGV2ZW4gdGhvdWdoIGl0IGJyZWFrcyBmYWlybmVzcy4gSWYgeW91IHdhbnQgdG8gaG9ub3IKKyAgICAgKiB0aGUgZmFpcm5lc3Mgc2V0dGluZyBmb3IgdGhpcyBsb2NrLCB0aGVuIHVzZQorICAgICAqIHtAbGluayAjdHJ5TG9jayhsb25nLCBUaW1lVW5pdCkgdHJ5TG9jaygwLCBUaW1lVW5pdC5TRUNPTkRTKSB9CisgICAgICogd2hpY2ggaXMgYWxtb3N0IGVxdWl2YWxlbnQoaXQgYWxzbyBkZXRlY3RzIGludGVycnVwdGlvbikuCisgICAgICogSWYgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgICogYWxyZWFkeSBob2xkcyB0aGlzIGxvY2sgdGhlbiB0aGUgaG9sZCBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSBvbmUgYW5kCisgICAgICogdGhlIG1ldGhvZCByZXR1cm5zIDx0dD50cnVlPC90dD4uCisgICAgICogSWYgdGhlIGxvY2sgaXMgaGVsZCBieSBhbm90aGVyIHRocmVhZCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuCisgICAgICogaW1tZWRpYXRlbHkgd2l0aCB0aGUgdmFsdWUgPHR0PmZhbHNlPC90dD4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGxvY2sgd2FzIGZyZWUgYW5kIHdhcyBhY3F1aXJlZCBieSB0aGUKKyAgICAgKiBjdXJyZW50IHRocmVhZCwgb3IgdGhlIGxvY2sgd2FzIGFscmVhZHkgaGVsZCBieSB0aGUgY3VycmVudCB0aHJlYWQ7IGFuZAorICAgICAqIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB0cnlMb2NrKCkgeworICAgICAgICByZXR1cm4gc3luYy50cnlMb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIGxvY2sgaWYgaXQgaXMgbm90IGhlbGQgYnkgYW5vdGhlciB0aHJlYWQgd2l0aGluIHRoZSBnaXZlbgorICAgICAqIHdhaXRpbmcgdGltZSBhbmQgdGhlIGN1cnJlbnQgdGhyZWFkIGhhcyBub3QgYmVlbgorICAgICAqIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdGVkfS4KKyAgICAgKiBBY3F1aXJlcyB0aGUgbG9jayBpZiBpdCBpcyBub3QgaGVsZCBieSBhbm90aGVyIHRocmVhZCBhbmQgcmV0dXJucworICAgICAqIGltbWVkaWF0ZWx5IHdpdGggdGhlIHZhbHVlIDx0dD50cnVlPC90dD4sIHNldHRpbmcgdGhlIGxvY2sgaG9sZCBjb3VudAorICAgICAqIHRvIG9uZS4gSWYgdGhpcyBsb2NrIGhhcyBiZWVuIHNldCB0byB1c2UgYSBmYWlyIG9yZGVyaW5nIHBvbGljeSB0aGVuCisgICAgICogYW4gYXZhaWxhYmxlIGxvY2sgPGVtPndpbGwgbm90PC9lbT4gYmUgYWNxdWlyZWQgaWYgYW55IG90aGVyIHRocmVhZHMKKyAgICAgKiBhcmUgd2FpdGluZyBmb3IgdGhlIGxvY2suIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gdGhlIHtAbGluayAjdHJ5TG9jaygpfQorICAgICAqIG1ldGhvZC4gSWYgeW91IHdhbnQgYSB0aW1lZCA8dHQ+dHJ5TG9jazwvdHQ+IHRoYXQgZG9lcyBwZXJtaXQgYmFyZ2luZyBvbgorICAgICAqIGEgZmFpciBsb2NrIHRoZW4gY29tYmluZSB0aGUgdGltZWQgYW5kIHVuLXRpbWVkIGZvcm1zIHRvZ2V0aGVyOgorICAgICAqIAorICAgICAqIDxwcmU+aWYgKGxvY2sudHJ5TG9jaygpIHx8IGxvY2sudHJ5TG9jayh0aW1lb3V0LCB1bml0KSApIHsgLi4uIH0KKyAgICAgKiA8L3ByZT4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgICogYWxyZWFkeSBob2xkcyB0aGlzIGxvY2sgdGhlbiB0aGUgaG9sZCBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSBvbmUgYW5kCisgICAgICogdGhlIG1ldGhvZCByZXR1cm5zIDx0dD50cnVlPC90dD4uCisgICAgICogSWYgdGhlIGxvY2sgaXMgaGVsZCBieSBhbm90aGVyIHRocmVhZCB0aGVuIHRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIGJlY29tZXMgZGlzYWJsZWQgZm9yIHRocmVhZCBzY2hlZHVsaW5nCisgICAgICogcHVycG9zZXMgYW5kIGxpZXMgZG9ybWFudCB1bnRpbCBvbmUgb2YgdGhyZWUgdGhpbmdzIGhhcHBlbnM6CisgICAgICogCisgICAgICogPHVsPgorICAgICAqIAorICAgICAqIDxsaT5UaGUgbG9jayBpcyBhY3F1aXJlZCBieSB0aGUgY3VycmVudCB0aHJlYWQ7IG9yCisgICAgICogCisgICAgICogPGxpPlNvbWUgb3RoZXIgdGhyZWFkIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdHN9IHRoZSBjdXJyZW50CisgICAgICogdGhyZWFkOyBvcgorICAgICAqIAorICAgICAqIDxsaT5UaGUgc3BlY2lmaWVkIHdhaXRpbmcgdGltZSBlbGFwc2VzCisgICAgICogCisgICAgICogPC91bD4KKyAgICAgKiBJZiB0aGUgbG9jayBpcyBhY3F1aXJlZCB0aGVuIHRoZSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IGlzIHJldHVybmVkIGFuZAorICAgICAqIHRoZSBsb2NrIGhvbGQgY291bnQgaXMgc2V0IHRvIG9uZS4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkOgorICAgICAqIAorICAgICAqIDx1bD4KKyAgICAgKiAKKyAgICAgKiA8bGk+aGFzIGl0cyBpbnRlcnJ1cHRlZCBzdGF0dXMgc2V0IG9uIGVudHJ5IHRvIHRoaXMgbWV0aG9kOyBvcgorICAgICAqIAorICAgICAqIDxsaT5pcyB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRlZH0gd2hpbGUgYWNxdWlyaW5nIHRoZSBsb2NrLAorICAgICAqIAorICAgICAqIDwvdWw+CisgICAgICogdGhlbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlzIHRocm93biBhbmQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MKKyAgICAgKiBpbnRlcnJ1cHRlZCBzdGF0dXMgaXMgY2xlYXJlZC4KKyAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIHdhaXRpbmcgdGltZSBlbGFwc2VzIHRoZW4gdGhlIHZhbHVlIDx0dD5mYWxzZTwvdHQ+CisgICAgICogaXMgcmV0dXJuZWQuIElmIHRoZSB0aW1lIGlzCisgICAgICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBtZXRob2Qgd2lsbCBub3Qgd2FpdCBhdCBhbGwuCisgICAgICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhpcyBtZXRob2QgaXMgYW4gZXhwbGljaXQgaW50ZXJydXB0aW9uCisgICAgICogcG9pbnQsIHByZWZlcmVuY2UgaXMKKyAgICAgKiBnaXZlbiB0byByZXNwb25kaW5nIHRvIHRoZSBpbnRlcnJ1cHQgb3ZlciBub3JtYWwgb3IgcmVlbnRyYW50CisgICAgICogYWNxdWlzaXRpb24gb2YgdGhlIGxvY2ssIGFuZCBvdmVyIHJlcG9ydGluZyB0aGUgZWxhcHNlIG9mIHRoZSB3YWl0aW5nCisgICAgICogdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBsb2NrCisgICAgICogQHBhcmFtIHVuaXQgdGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZW91dCBhcmd1bWVudAorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgbG9jayB3YXMgZnJlZSBhbmQgd2FzIGFjcXVpcmVkIGJ5IHRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkLCBvciB0aGUgbG9jayB3YXMgYWxyZWFkeSBoZWxkIGJ5IHRoZSBjdXJyZW50IHRocmVhZDsgYW5kCisgICAgICogPHR0PmZhbHNlPC90dD4gaWYgdGhlIHdhaXRpbmcgdGltZSBlbGFwc2VkIGJlZm9yZSB0aGUgbG9jayBjb3VsZCBiZQorICAgICAqIGFjcXVpcmVkLgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB1bml0IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB0cnlMb2NrKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkKKyAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHN5bmMudHJ5TG9jayh1bml0LnRvTmFub3ModGltZW91dCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIHJlbGVhc2UgdGhpcyBsb2NrLiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlCisgICAgICogaG9sZGVyIG9mIHRoaXMgbG9jayB0aGVuIHRoZSBob2xkIGNvdW50IGlzIGRlY3JlbWVudGVkLiBJZiB0aGUKKyAgICAgKiBob2xkIGNvdW50IGlzIG5vdyB6ZXJvIHRoZW4gdGhlIGxvY2sgaXMgcmVsZWFzZWQuIElmIHRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCB0aGUgaG9sZGVyIG9mIHRoaXMgbG9jayB0aGVuIHtAbGluaworICAgICAqIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCB0aHJlYWQgZG9lcyBub3QKKyAgICAgKiBob2xkIHRoaXMgbG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIHN5bmMudW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBDb25kaXRpb259IGluc3RhbmNlIGZvciB1c2Ugd2l0aCB0aGlzCisgICAgICoge0BsaW5rIExvY2t9IGluc3RhbmNlLgorICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgQ29uZGl0aW9ufSBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgc2FtZQorICAgICAqIHVzYWdlcyBhcyBkbyB0aGUge0BsaW5rIE9iamVjdH0gbW9uaXRvciBtZXRob2RzKHtAbGluaworICAgICAqIE9iamVjdCN3YWl0KCkgd2FpdH0sIHtAbGluayBPYmplY3Qjbm90aWZ5IG5vdGlmeX0sIGFuZCB7QGxpbmsKKyAgICAgKiBPYmplY3Qjbm90aWZ5QWxsIG5vdGlmeUFsbH0pIHdoZW4gdXNlZCB3aXRoIHRoZSBidWlsdC1pbiBtb25pdG9yIGxvY2suCisgICAgICogCisgICAgICogPHVsPgorICAgICAqIAorICAgICAqIDxsaT5JZiB0aGlzIGxvY2sgaXMgbm90IGhlbGQgd2hlbiBhbnkgb2YgdGhlIHtAbGluayBDb25kaXRpb259CisgICAgICoge0BsaW5rIENvbmRpdGlvbiNhd2FpdCgpIHdhaXRpbmd9IG9yIHtAbGluayBDb25kaXRpb24jc2lnbmFsCisgICAgICogc2lnbmFsbGluZ30gbWV0aG9kcyBhcmUgY2FsbGVkLCB0aGVuIGFuIHtAbGluaworICAgICAqIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiAKKyAgICAgKiA8bGk+V2hlbiB0aGUgY29uZGl0aW9uIHtAbGluayBDb25kaXRpb24jYXdhaXQoKSB3YWl0aW5nfQorICAgICAqIG1ldGhvZHMgYXJlIGNhbGxlZCB0aGUgbG9jayBpcyByZWxlYXNlZCBhbmQsIGJlZm9yZSB0aGV5CisgICAgICogcmV0dXJuLCB0aGUgbG9jayBpcyByZWFjcXVpcmVkIGFuZCB0aGUgbG9jayBob2xkIGNvdW50IHJlc3RvcmVkCisgICAgICogdG8gd2hhdCBpdCB3YXMgd2hlbiB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuCisgICAgICogCisgICAgICogPGxpPklmIGEgdGhyZWFkIGlzIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdGVkfSB3aGlsZQorICAgICAqIHdhaXRpbmcgdGhlbiB0aGUgd2FpdCB3aWxsIHRlcm1pbmF0ZSwgYW4ge0BsaW5rCisgICAgICogSW50ZXJydXB0ZWRFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLCBhbmQgdGhlIHRocmVhZCdzCisgICAgICogaW50ZXJydXB0ZWQgc3RhdHVzIHdpbGwgYmUgY2xlYXJlZC4KKyAgICAgKiAKKyAgICAgKiA8bGk+IFdhaXRpbmcgdGhyZWFkcyBhcmUgc2lnbmFsbGVkIGluIEZJRk8gb3JkZXIKKyAgICAgKiAKKyAgICAgKiA8bGk+VGhlIG9yZGVyaW5nIG9mIGxvY2sgcmVhY3F1aXNpdGlvbiBmb3IgdGhyZWFkcyByZXR1cm5pbmcKKyAgICAgKiBmcm9tIHdhaXRpbmcgbWV0aG9kcyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhyZWFkcyBpbml0aWFsbHkKKyAgICAgKiBhY3F1aXJpbmcgdGhlIGxvY2ssIHdoaWNoIGlzIGluIHRoZSBkZWZhdWx0IGNhc2Ugbm90IHNwZWNpZmllZCwKKyAgICAgKiBidXQgZm9yIDxlbT5mYWlyPC9lbT4gbG9ja3MgZmF2b3JzIHRob3NlIHRocmVhZHMgdGhhdCBoYXZlIGJlZW4KKyAgICAgKiB3YWl0aW5nIHRoZSBsb25nZXN0LgorICAgICAqIAorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBDb25kaXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIENvbmRpdGlvbiBuZXdDb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBpc0ZhaXIoKSA/IG5ldyBGSUZPQ29uZFZhcih0aGlzKSA6IG5ldyBDb25kVmFyKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgdGhlIG51bWJlciBvZiBob2xkcyBvbiB0aGlzIGxvY2sgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAqIEEgdGhyZWFkIGhhcyBhIGhvbGQgb24gYSBsb2NrIGZvciBlYWNoIGxvY2sgYWN0aW9uIHRoYXQgaXMgbm90CisgICAgICogbWF0Y2hlZCBieSBhbiB1bmxvY2sgYWN0aW9uLgorICAgICAqIFRoZSBob2xkIGNvdW50IGluZm9ybWF0aW9uIGlzIHR5cGljYWxseSBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kCisgICAgICogZGVidWdnaW5nIHB1cnBvc2VzLiBGb3IgZXhhbXBsZSwgaWYgYSBjZXJ0YWluIHNlY3Rpb24gb2YgY29kZSBzaG91bGQKKyAgICAgKiBub3QgYmUgZW50ZXJlZCB3aXRoIHRoZSBsb2NrIGFscmVhZHkgaGVsZCB0aGVuIHdlIGNhbiBhc3NlcnQgdGhhdCBmYWN0OgorICAgICAqIAorICAgICAqIDxwcmU+IGNsYXNzIFggeyBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOyAvLyAuLi4KKyAgICAgKiBwdWJsaWMgdm9pZCBtKCkgeyBhc3NlcnQgbG9jay5nZXRIb2xkQ291bnQoKSA9PSAwOyBsb2NrLmxvY2soKTsgdHJ5IHsKKyAgICAgKiAvLyAuLi4gbWV0aG9kIGJvZHkgfSBmaW5hbGx5IHsgbG9jay51bmxvY2soKTsgfSB9IH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBob2xkcyBvbiB0aGlzIGxvY2sgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLAorICAgICAqIG9yIHplcm8gaWYgdGhpcyBsb2NrIGlzIG5vdCBoZWxkIGJ5IHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhvbGRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHN5bmMuZ2V0SG9sZENvdW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBpZiB0aGlzIGxvY2sgaXMgaGVsZCBieSB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICogQW5hbG9nb3VzIHRvIHRoZSB7QGxpbmsgVGhyZWFkI2hvbGRzTG9ja30gbWV0aG9kIGZvciBidWlsdC1pbgorICAgICAqIG1vbml0b3IgbG9ja3MsIHRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kCisgICAgICogdGVzdGluZy4gRm9yIGV4YW1wbGUsIGEgbWV0aG9kIHRoYXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgICogYSBsb2NrIGlzIGhlbGQgY2FuIGFzc2VydCB0aGF0IHRoaXMgaXMgdGhlIGNhc2U6CisgICAgICogCisgICAgICogPHByZT4gY2xhc3MgWCB7IFJlZW50cmFudExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7IC8vIC4uLgorICAgICAqIHB1YmxpYyB2b2lkIG0oKSB7IGFzc2VydCBsb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpOworICAgICAqIC8vIC4uLiBtZXRob2QgYm9keSB9IH0KKyAgICAgKiA8L3ByZT4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBlbnN1cmUgdGhhdCBhIHJlZW50cmFudCBsb2NrIGlzIHVzZWQKKyAgICAgKiBpbiBhIG5vbi1yZWVudHJhbnQgbWFubmVyLCBmb3IgZXhhbXBsZToKKyAgICAgKiAKKyAgICAgKiA8cHJlPiBjbGFzcyBYIHsgUmVlbnRyYW50TG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsgLy8gLi4uCisgICAgICogcHVibGljIHZvaWQgbSgpIHsgYXNzZXJ0ICFsb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpOyBsb2NrLmxvY2soKTsKKyAgICAgKiB0cnkgeyAvLyAuLi4gbWV0aG9kIGJvZHkgfSBmaW5hbGx5IHsgbG9jay51bmxvY2soKTsgfSB9IH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiBjdXJyZW50IHRocmVhZCBob2xkcyB0aGlzIGxvY2sgYW5kCisgICAgICogPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSGVsZEJ5Q3VycmVudFRocmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIHN5bmMuaXNIZWxkQnlDdXJyZW50VGhyZWFkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBpZiB0aGlzIGxvY2sgaXMgaGVsZCBieSBhbnkgdGhyZWFkLiBUaGlzIG1ldGhvZCBpcworICAgICAqIGRlc2lnbmVkIGZvciB1c2UgaW4gbW9uaXRvcmluZyBvZiB0aGUgc3lzdGVtIHN0YXRlLAorICAgICAqIG5vdCBmb3Igc3luY2hyb25pemF0aW9uIGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgYW55IHRocmVhZCBob2xkcyB0aGlzIGxvY2sgYW5kCisgICAgICogPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkgeworICAgICAgICByZXR1cm4gc3luYy5pc0xvY2tlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxvY2sgaGFzIGZhaXJuZXNzIHNldCB0cnVlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbG9jayBoYXMgZmFpcm5lc3Mgc2V0IHRydWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGYWlyKCkgeworICAgICAgICByZXR1cm4gc3luYy5pc0ZhaXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8dHQ+bnVsbDwvdHQ+IGlmIG5vdCBvd25lZC4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYQorICAgICAqIHRocmVhZCB0aGF0IGlzIG5vdCB0aGUgb3duZXIsIHRoZSByZXR1cm4gdmFsdWUgcmVmbGVjdHMgYQorICAgICAqIGJlc3QtZWZmb3J0IGFwcHJveGltYXRpb24gb2YgY3VycmVudCBsb2NrIHN0YXR1cy4gRm9yIGV4YW1wbGUsCisgICAgICogdGhlIG93bmVyIG1heSBiZSBtb21lbnRhcmlseSA8dHQ+bnVsbDwvdHQ+IGV2ZW4gaWYgdGhlcmUgYXJlCisgICAgICogdGhyZWFkcyB0cnlpbmcgdG8gYWNxdWlyZSB0aGUgbG9jayBidXQgaGF2ZSBub3QgeWV0IGRvbmUgc28uCisgICAgICogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSBjb25zdHJ1Y3Rpb24gb2YKKyAgICAgKiBzdWJjbGFzc2VzIHRoYXQgcHJvdmlkZSBtb3JlIGV4dGVuc2l2ZSBsb2NrIG1vbml0b3JpbmcgZmFjaWxpdGllcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG93bmVyLCBvciA8dHQ+bnVsbDwvdHQ+IGlmIG5vdCBvd25lZAorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgZ2V0T3duZXIoKSB7CisgICAgICAgIHJldHVybiBzeW5jLmdldE93bmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcmllcyB3aGV0aGVyIGFueSB0aHJlYWRzIGFyZSB3YWl0aW5nIHRvIGFjcXVpcmUgdGhpcyBsb2NrLiBOb3RlIHRoYXQKKyAgICAgKiBiZWNhdXNlIGNhbmNlbGxhdGlvbnMgbWF5IG9jY3VyIGF0IGFueSB0aW1lLCBhIDx0dD50cnVlPC90dD4KKyAgICAgKiByZXR1cm4gZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgYW55IG90aGVyIHRocmVhZCB3aWxsIGV2ZXIKKyAgICAgKiBhY3F1aXJlIHRoaXMgbG9jay4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgcHJpbWFyaWx5IGZvciB1c2UgaW4KKyAgICAgKiBtb25pdG9yaW5nIG9mIHRoZSBzeXN0ZW0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgbWF5IGJlIG90aGVyIHRocmVhZHMgd2FpdGluZyB0byBhY3F1aXJlIHRoZSBsb2NrLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1F1ZXVlZFRocmVhZHMoKSB7CisgICAgICAgIHJldHVybiBzeW5jLmhhc1F1ZXVlZFRocmVhZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIGdpdmVuIHRocmVhZCBpcyB3YWl0aW5nIHRvIGFjcXVpcmUgdGhpcworICAgICAqIGxvY2suIE5vdGUgdGhhdCBiZWNhdXNlIGNhbmNlbGxhdGlvbnMgbWF5IG9jY3VyIGF0IGFueSB0aW1lLCBhCisgICAgICogPHR0PnRydWU8L3R0PiByZXR1cm4gZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhpcyB0aHJlYWQKKyAgICAgKiB3aWxsIGV2ZXIgYWNxdWlyZSB0aGlzIGxvY2suIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHByaW1hcmlseSBmb3IgdXNlCisgICAgICogaW4gbW9uaXRvcmluZyBvZiB0aGUgc3lzdGVtIHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHRocmVhZCB0aGUgdGhyZWFkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0aHJlYWQgaXMgcXVldWVkIHdhaXRpbmcgZm9yIHRoaXMgbG9jay4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRocmVhZCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzUXVldWVkVGhyZWFkKFRocmVhZCB0aHJlYWQpIHsKKyAgICAgICAgcmV0dXJuIHN5bmMuaXNRdWV1ZWQodGhyZWFkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nIHRvCisgICAgICogYWNxdWlyZSB0aGlzIGxvY2suIFRoZSB2YWx1ZSBpcyBvbmx5IGFuIGVzdGltYXRlIGJlY2F1c2UgdGhlIG51bWJlciBvZgorICAgICAqIHRocmVhZHMgbWF5IGNoYW5nZSBkeW5hbWljYWxseSB3aGlsZSB0aGlzIG1ldGhvZCB0cmF2ZXJzZXMKKyAgICAgKiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIGZvciB1c2UgaW4KKyAgICAgKiBtb25pdG9yaW5nIG9mIHRoZSBzeXN0ZW0gc3RhdGUsIG5vdCBmb3Igc3luY2hyb25pemF0aW9uIGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIHRocmVhZHMgd2FpdGluZyBmb3IgdGhpcyBsb2NrCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRRdWV1ZUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHN5bmMuZ2V0UXVldWVMZW5ndGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRocmVhZHMgdGhhdCBtYXkgYmUgd2FpdGluZyB0bworICAgICAqIGFjcXVpcmUgdGhpcyBsb2NrLiBCZWNhdXNlIHRoZSBhY3R1YWwgc2V0IG9mIHRocmVhZHMgbWF5IGNoYW5nZQorICAgICAqIGR5bmFtaWNhbGx5IHdoaWxlIGNvbnN0cnVjdGluZyB0aGlzIHJlc3VsdCwgdGhlIHJldHVybmVkCisgICAgICogY29sbGVjdGlvbiBpcyBvbmx5IGEgYmVzdC1lZmZvcnQgZXN0aW1hdGUuIFRoZSBlbGVtZW50cyBvZiB0aGUKKyAgICAgKiByZXR1cm5lZCBjb2xsZWN0aW9uIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLiBUaGlzIG1ldGhvZCBpcworICAgICAqIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgY29uc3RydWN0aW9uIG9mIHN1YmNsYXNzZXMgdGhhdCBwcm92aWRlCisgICAgICogbW9yZSBleHRlbnNpdmUgbW9uaXRvcmluZyBmYWNpbGl0aWVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aHJlYWRzCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0UXVldWVkVGhyZWFkcygpIHsKKyAgICAgICAgcmV0dXJuIHN5bmMuZ2V0UXVldWVkVGhyZWFkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgd2hldGhlciBhbnkgdGhyZWFkcyBhcmUgd2FpdGluZyBvbiB0aGUgZ2l2ZW4gY29uZGl0aW9uCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jay4gTm90ZSB0aGF0IGJlY2F1c2UgdGltZW91dHMgYW5kCisgICAgICogaW50ZXJydXB0cyBtYXkgb2NjdXIgYXQgYW55IHRpbWUsIGEgPHR0PnRydWU8L3R0PiByZXR1cm4gZG9lcworICAgICAqIG5vdCBndWFyYW50ZWUgdGhhdCBhIGZ1dHVyZSA8dHQ+c2lnbmFsPC90dD4gd2lsbCBhd2FrZW4gYW55CisgICAgICogdGhyZWFkcy4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgcHJpbWFyaWx5IGZvciB1c2UgaW4KKyAgICAgKiBtb25pdG9yaW5nIG9mIHRoZSBzeXN0ZW0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBjb25kaXRpb24KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlcmUgYXJlIGFueSB3YWl0aW5nIHRocmVhZHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbG9jayBpcyBub3QgaGVsZAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjb25kaXRpb24gaXMKKyAgICAgKiBub3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jaworICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgY29uZGl0aW9uIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNXYWl0ZXJzKENvbmRpdGlvbiBjb25kaXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGFzQ29uZFZhcihjb25kaXRpb24pLmhhc1dhaXRlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZQorICAgICAqIGdpdmVuIGNvbmRpdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2NrLiBOb3RlIHRoYXQgYmVjYXVzZQorICAgICAqIHRpbWVvdXRzIGFuZCBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhdCBhbnkgdGltZSwgdGhlIGVzdGltYXRlCisgICAgICogc2VydmVzIG9ubHkgYXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGFjdHVhbCBudW1iZXIgb2Ygd2FpdGVycy4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCBmb3IgdXNlIGluIG1vbml0b3Jpbmcgb2YgdGhlIHN5c3RlbQorICAgICAqIHN0YXRlLCBub3QgZm9yIHN5bmNocm9uaXphdGlvbiBjb250cm9sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uCisgICAgICogQHJldHVybiB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiB3YWl0aW5nIHRocmVhZHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbG9jayBpcyBub3QgaGVsZAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjb25kaXRpb24gaXMKKyAgICAgKiBub3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jaworICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgY29uZGl0aW9uIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdhaXRRdWV1ZUxlbmd0aChDb25kaXRpb24gY29uZGl0aW9uKSB7CisgICAgICAgIHJldHVybiBhc0NvbmRWYXIoY29uZGl0aW9uKS5nZXRXYWl0UXVldWVMZW5ndGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRob3NlIHRocmVhZHMgdGhhdCBtYXkgYmUKKyAgICAgKiB3YWl0aW5nIG9uIHRoZSBnaXZlbiBjb25kaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jay4KKyAgICAgKiBCZWNhdXNlIHRoZSBhY3R1YWwgc2V0IG9mIHRocmVhZHMgbWF5IGNoYW5nZSBkeW5hbWljYWxseSB3aGlsZQorICAgICAqIGNvbnN0cnVjdGluZyB0aGlzIHJlc3VsdCwgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgb25seSBhCisgICAgICogYmVzdC1lZmZvcnQgZXN0aW1hdGUuIFRoZSBlbGVtZW50cyBvZiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbgorICAgICAqIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0bworICAgICAqIGZhY2lsaXRhdGUgY29uc3RydWN0aW9uIG9mIHN1YmNsYXNzZXMgdGhhdCBwcm92aWRlIG1vcmUKKyAgICAgKiBleHRlbnNpdmUgY29uZGl0aW9uIG1vbml0b3JpbmcgZmFjaWxpdGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGNvbmRpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhyZWFkcworICAgICAqIEB0aHJvd3MgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGxvY2sgaXMgbm90IGhlbGQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzCisgICAgICogbm90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvY2sKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGNvbmRpdGlvbiBudWxsCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0V2FpdGluZ1RocmVhZHMoQ29uZGl0aW9uIGNvbmRpdGlvbikgeworICAgICAgICByZXR1cm4gYXNDb25kVmFyKGNvbmRpdGlvbikuZ2V0V2FpdGluZ1RocmVhZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgbG9jaywgYXMgd2VsbCBhcyBpdHMgbG9jaworICAgICAqIHN0YXRlLiBUaGUgc3RhdGUsIGluIGJyYWNrZXRzLCBpbmNsdWRlcyBlaXRoZXIgdGhlIFN0cmluZworICAgICAqICZxdW90O1VubG9ja2VkJnF1b3Q7IG9yIHRoZSBTdHJpbmcgJnF1b3Q7TG9ja2VkIGJ5JnF1b3Q7CisgICAgICogZm9sbG93ZWQgYnkgdGhlIHtAbGluayBUaHJlYWQjZ2V0TmFtZX0gb2YgdGhlIG93bmluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgbG9jaywgYXMgd2VsbCBhcyBpdHMgbG9jayBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBUaHJlYWQgbyA9IGdldE93bmVyKCk7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgKChvID09IG51bGwpID8gIltVbmxvY2tlZF0iCisgICAgICAgICAgICA6ICJbTG9ja2VkIGJ5IHRocmVhZCAiICsgby5nZXROYW1lKCkgKyAiXSIpOworICAgIH0KKworICAgIHByaXZhdGUgQ29uZFZhciBhc0NvbmRWYXIoQ29uZGl0aW9uIGNvbmRpdGlvbikgeworICAgICAgICBpZiAoY29uZGl0aW9uID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKCEoY29uZGl0aW9uIGluc3RhbmNlb2YgQ29uZFZhcikpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3Qgb3duZXIiKTsKKyAgICAgICAgQ29uZFZhciBjb25kVmFyID0gKENvbmRWYXIpIGNvbmRpdGlvbjsKKyAgICAgICAgaWYgKGNvbmRWYXIubG9jayAhPSB0aGlzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IG93bmVyIik7CisgICAgICAgIHJldHVybiBjb25kVmFyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMTdmYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdC5qYXZhCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCisvKioKKyAqIEEgPHR0PlRpbWVVbml0PC90dD4gcmVwcmVzZW50cyB0aW1lIGR1cmF0aW9ucyBhdCBhIGdpdmVuIHVuaXQgb2YKKyAqIGdyYW51bGFyaXR5IGFuZCBwcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgdG8gY29udmVydCBhY3Jvc3MgdW5pdHMsCisgKiBhbmQgdG8gcGVyZm9ybSB0aW1pbmcgYW5kIGRlbGF5IG9wZXJhdGlvbnMgaW4gdGhlc2UgdW5pdHMuIEEKKyAqIDx0dD5UaW1lVW5pdDwvdHQ+IGRvZXMgbm90IG1haW50YWluIHRpbWUgaW5mb3JtYXRpb24sIGJ1dCBvbmx5CisgKiBoZWxwcyBvcmdhbml6ZSBhbmQgdXNlIHRpbWUgcmVwcmVzZW50YXRpb25zIHRoYXQgbWF5IGJlIG1haW50YWluZWQKKyAqIHNlcGFyYXRlbHkgYWNyb3NzIHZhcmlvdXMgY29udGV4dHMuIEEgbmFub3NlY29uZCBpcyBkZWZpbmVkIGFzIG9uZQorICogdGhvdXNhbmR0aCBvZiBhIG1pY3Jvc2Vjb25kLCBhIG1pY3Jvc2Vjb25kIGFzIG9uZSB0aG91c2FuZHRoIG9mIGEKKyAqIG1pbGxpc2Vjb25kLCBhIG1pbGxpc2Vjb25kIGFzIG9uZSB0aG91c2FuZHRoIG9mIGEgc2Vjb25kLCBhIG1pbnV0ZQorICogYXMgc2l4dHkgc2Vjb25kcywgYW4gaG91ciBhcyBzaXh0eSBtaW51dGVzLCBhbmQgYSBkYXkgYXMgdHdlbnR5IGZvdXIgaG91cnMuCisgKiBBIDx0dD5UaW1lVW5pdDwvdHQ+IGlzIG1haW5seSB1c2VkIHRvIGluZm9ybSB0aW1lLWJhc2VkIG1ldGhvZHMKKyAqIGhvdyBhIGdpdmVuIHRpbWluZyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGludGVycHJldGVkLiBGb3IgZXhhbXBsZSwKKyAqIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHRpbWVvdXQgaW4gNTAgbWlsbGlzZWNvbmRzIGlmIHRoZSB7QGxpbmsKKyAqIGVkdS5lbW9yeS5tYXRoY3MuYmFja3BvcnQuamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayBsb2NrfSBpcyBub3QKKyAqIGF2YWlsYWJsZToKKyAqIAorICogPHByZT4gTG9jayBsb2NrID0gLi4uOyBpZiAoIGxvY2sudHJ5TG9jayg1MEwsIFRpbWVVbml0Lk1JTExJU0VDT05EUykgKSAuLi4KKyAqIDwvcHJlPiB3aGlsZSB0aGlzIGNvZGUgd2lsbCB0aW1lb3V0IGluIDUwIHNlY29uZHM6CisgKiA8cHJlPiBMb2NrIGxvY2sgPSAuLi47IGlmICggbG9jay50cnlMb2NrKDUwTCwgVGltZVVuaXQuU0VDT05EUykgKSAuLi4KKyAqIDwvcHJlPiBOb3RlIGhvd2V2ZXIsIHRoYXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYSBwYXJ0aWN1bGFyIHRpbWVvdXQKKyAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgYWJsZSB0byBub3RpY2UgdGhlIHBhc3NhZ2Ugb2YgdGltZSBhdCB0aGUKKyAqIHNhbWUgZ3JhbnVsYXJpdHkgYXMgdGhlIGdpdmVuIDx0dD5UaW1lVW5pdDwvdHQ+LgorICoKKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRpbWVVbml0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVW5pdCBOQU5PU0VDT05EUyA9IG5ldyBUaW1lVW5pdCgwLCAiTkFOT1NFQ09ORFMiKSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUzNTE0ODQ5MDg4MzIwODM2MUw7CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9OYW5vcyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9NaWNyb3MobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4gZCAvIChDMSAvIEMwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWlsbGlzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQgLyAoQzIgLyBDMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB0b1NlY29uZHMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4gZCAvIChDMyAvIEMwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWludXRlcyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkIC8gKEM0IC8gQzApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9Ib3Vycyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkIC8gKEM1IC8gQzApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9EYXlzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQgLyAoQzYgLyBDMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBjb252ZXJ0KGxvbmcgZCwgVGltZVVuaXQgdSkgeworICAgICAgICAgICAgcmV0dXJuIHUudG9OYW5vcyhkKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIChkIC0gKG0gKiBDMikpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZVVuaXQgTUlDUk9TRUNPTkRTID0KKyAgICAgICAgbmV3IFRpbWVVbml0KDEsICJNSUNST1NFQ09ORFMiKSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTg1OTA2NTc1OTI5NTc5MTA4TDsKKworICAgICAgICAgICAgcHVibGljIGxvbmcgdG9OYW5vcyhsb25nIGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geChkLCBDMSAvIEMwLCBNQVggLyAoQzEgLyBDMCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0b01pY3Jvcyhsb25nIGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdG9NaWxsaXMobG9uZyBkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGQgLyAoQzIgLyBDMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHRvU2Vjb25kcyhsb25nIGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZCAvIChDMyAvIEMxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdG9NaW51dGVzKGxvbmcgZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkIC8gKEM0IC8gQzEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0b0hvdXJzKGxvbmcgZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkIC8gKEM1IC8gQzEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0b0RheXMobG9uZyBkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGQgLyAoQzYgLyBDMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGNvbnZlcnQobG9uZyBkLCBUaW1lVW5pdCB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHUudG9NaWNyb3MoZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGQgKiBDMSkgLSAobSAqIEMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRpbWVVbml0IE1JTExJU0VDT05EUyA9CisgICAgICAgIG5ldyBUaW1lVW5pdCgyLCAiTUlMTElTRUNPTkRTIikgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTAzMjA0Nzc5NDEyMzMyNTE4NEw7CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHRvTmFub3MobG9uZyBkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzIgLyBDMCwgTUFYIC8gKEMyIC8gQzApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdG9NaWNyb3MobG9uZyBkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzIgLyBDMSwgTUFYIC8gKEMyIC8gQzEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdG9NaWxsaXMobG9uZyBkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHRvU2Vjb25kcyhsb25nIGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZCAvIChDMyAvIEMyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdG9NaW51dGVzKGxvbmcgZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkIC8gKEM0IC8gQzIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0b0hvdXJzKGxvbmcgZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkIC8gKEM1IC8gQzIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0b0RheXMobG9uZyBkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGQgLyAoQzYgLyBDMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGNvbnZlcnQobG9uZyBkLCBUaW1lVW5pdCB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHUudG9NaWxsaXMoZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVW5pdCBTRUNPTkRTID0gbmV3IFRpbWVVbml0KDMsICJTRUNPTkRTIikgeworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjc3NTUwMjg0NDkzNzgzOTBMOworCisgICAgICAgIHB1YmxpYyBsb25nIHRvTmFub3MobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDMyAvIEMwLCBNQVggLyAoQzMgLyBDMCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9NaWNyb3MobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDMyAvIEMxLCBNQVggLyAoQzMgLyBDMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9NaWxsaXMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDMyAvIEMyLCBNQVggLyAoQzMgLyBDMikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9TZWNvbmRzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB0b01pbnV0ZXMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4gZCAvIChDNCAvIEMzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvSG91cnMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4gZCAvIChDNSAvIEMzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvRGF5cyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkIC8gKEM2IC8gQzMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgY29udmVydChsb25nIGQsIFRpbWVVbml0IHUpIHsKKyAgICAgICAgICAgIHJldHVybiB1LnRvU2Vjb25kcyhkKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVW5pdCBNSU5VVEVTID0gbmV3IFRpbWVVbml0KDQsICJNSU5VVEVTIikgeworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxODI3MzUxNTY2NDAyNjA5MTg3TDsKKworICAgICAgICBwdWJsaWMgbG9uZyB0b05hbm9zKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzQgLyBDMCwgTUFYIC8gKEM0IC8gQzApKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWljcm9zKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzQgLyBDMSwgTUFYIC8gKEM0IC8gQzEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWlsbGlzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzQgLyBDMiwgTUFYIC8gKEM0IC8gQzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvU2Vjb25kcyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiB4KGQsIEM0IC8gQzMsIE1BWCAvIChDNCAvIEMzKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB0b01pbnV0ZXMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvSG91cnMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4gZCAvIChDNSAvIEM0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvRGF5cyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkIC8gKEM2IC8gQzQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgY29udmVydChsb25nIGQsIFRpbWVVbml0IHUpIHsKKyAgICAgICAgICAgIHJldHVybiB1LnRvTWludXRlcyhkKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVW5pdCBIT1VSUyA9IG5ldyBUaW1lVW5pdCg1LCAiSE9VUlMiKSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NDM4NDM2MTM0NzMyMDg5ODEwTDsKKworICAgICAgICBwdWJsaWMgbG9uZyB0b05hbm9zKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzUgLyBDMCwgTUFYIC8gKEM1IC8gQzApKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWljcm9zKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzUgLyBDMSwgTUFYIC8gKEM1IC8gQzEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWlsbGlzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzUgLyBDMiwgTUFYIC8gKEM1IC8gQzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvU2Vjb25kcyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiB4KGQsIEM1IC8gQzMsIE1BWCAvIChDNSAvIEMzKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB0b01pbnV0ZXMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDNSAvIEM0LCBNQVggLyAoQzUgLyBDNCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9Ib3Vycyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9EYXlzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQgLyAoQzYgLyBDNSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBjb252ZXJ0KGxvbmcgZCwgVGltZVVuaXQgdSkgeworICAgICAgICAgICAgcmV0dXJuIHUudG9Ib3VycyhkKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVW5pdCBEQVlTID0gbmV3IFRpbWVVbml0KDYsICJEQVlTIikgeworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Njc0NjMxNzE5NTk2NzQ2MDBMOworCisgICAgICAgIHB1YmxpYyBsb25nIHRvTmFub3MobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDNiAvIEMwLCBNQVggLyAoQzYgLyBDMCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9NaWNyb3MobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDNiAvIEMxLCBNQVggLyAoQzYgLyBDMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9NaWxsaXMobG9uZyBkKSB7CisgICAgICAgICAgICByZXR1cm4geChkLCBDNiAvIEMyLCBNQVggLyAoQzYgLyBDMikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgdG9TZWNvbmRzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzYgLyBDMywgTUFYIC8gKEM2IC8gQzMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvTWludXRlcyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiB4KGQsIEM2IC8gQzQsIE1BWCAvIChDNiAvIEM0KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB0b0hvdXJzKGxvbmcgZCkgeworICAgICAgICAgICAgcmV0dXJuIHgoZCwgQzYgLyBDNSwgTUFYIC8gKEM2IC8gQzUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRvRGF5cyhsb25nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgY29udmVydChsb25nIGQsIFRpbWVVbml0IHUpIHsKKyAgICAgICAgICAgIHJldHVybiB1LnRvRGF5cyhkKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVVuaXRbXSB2YWx1ZXMgPSBuZXcgVGltZVVuaXRbXXsKKyAgICAgICAgTkFOT1NFQ09ORFMsIE1JQ1JPU0VDT05EUywgTUlMTElTRUNPTkRTLCBTRUNPTkRTLCBNSU5VVEVTLCBIT1VSUywgREFZUworICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIFRpbWVVbml0W10gdmFsdWVzKCkgeworICAgICAgICByZXR1cm4gKFRpbWVVbml0W10pIHZhbHVlcy5jbG9uZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIHVuaXQuIFRoaXMgdmFsdWUgaXMgbm8gbG9uZ2VyIHVzZWQgaW4gdGhpcworICAgICAqIHZlcnNpb24gb2YgdGhpcyBjbGFzcywgYnV0IGlzIHJldGFpbmVkIGZvciBzZXJpYWxpemF0aW9uCisgICAgICogY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHRoaXMgdW5pdAorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIFRpbWVVbml0KGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8vIEhhbmR5IGNvbnN0YW50cyBmb3IgY29udmVyc2lvbiBtZXRob2RzCisgICAgc3RhdGljIGZpbmFsIGxvbmcgQzAgPSAxOworICAgIHN0YXRpYyBmaW5hbCBsb25nIEMxID0gQzAgKiAxMDAwOworICAgIHN0YXRpYyBmaW5hbCBsb25nIEMyID0gQzEgKiAxMDAwOworICAgIHN0YXRpYyBmaW5hbCBsb25nIEMzID0gQzIgKiAxMDAwOworICAgIHN0YXRpYyBmaW5hbCBsb25nIEM0ID0gQzMgKiA2MDsKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBDNSA9IEM0ICogNjA7CisgICAgc3RhdGljIGZpbmFsIGxvbmcgQzYgPSBDNSAqIDI0OworCisgICAgc3RhdGljIGZpbmFsIGxvbmcgTUFYID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAvKioKKyAgICAgKiBTY2FsZSBkIGJ5IG0sIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KKyAgICAgKiBUaGlzIGhhcyBhIHNob3J0IG5hbWUgdG8gbWFrZSBhYm92ZSBjb2RlIG1vcmUgcmVhZGFibGUuCisgICAgICovCisgICAgc3RhdGljIGxvbmcgeChsb25nIGQsIGxvbmcgbSwgbG9uZyBvdmVyKSB7CisgICAgICAgIGlmIChkID4gb3ZlcikgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgICAgICBpZiAoZCA8IC1vdmVyKSByZXR1cm4gTG9uZy5NSU5fVkFMVUU7CisgICAgICAgIHJldHVybiBkICogbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiB0aW1lIGR1cmF0aW9uIGluIHRoZSBnaXZlbiB1bml0IHRvIHRoaXMKKyAgICAgKiB1bml0LiBDb252ZXJzaW9ucyBmcm9tIGZpbmVyIHRvIGNvYXJzZXIgZ3JhbnVsYXJpdGllcworICAgICAqIHRydW5jYXRlLCBzbyBsb3NlIHByZWNpc2lvbi4gRm9yIGV4YW1wbGUgY29udmVydGluZworICAgICAqIDx0dD45OTk8L3R0PiBtaWxsaXNlY29uZHMgdG8gc2Vjb25kcyByZXN1bHRzIGluCisgICAgICogPHR0PjA8L3R0Pi4gQ29udmVyc2lvbnMgZnJvbSBjb2Fyc2VyIHRvIGZpbmVyIGdyYW51bGFyaXRpZXMKKyAgICAgKiB3aXRoIGFyZ3VtZW50cyB0aGF0IHdvdWxkIG51bWVyaWNhbGx5IG92ZXJmbG93IHNhdHVyYXRlIHRvCisgICAgICogPHR0PkxvbmcuTUlOX1ZBTFVFPC90dD4gaWYgbmVnYXRpdmUgb3IgPHR0PkxvbmcuTUFYX1ZBTFVFPC90dD4KKyAgICAgKiBpZiBwb3NpdGl2ZS4gRm9yIGV4YW1wbGUsIHRvIGNvbnZlcnQgMTAgbWludXRlcyB0byBtaWxsaXNlY29uZHMsIHVzZToKKyAgICAgKiA8dHQ+VGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMTBMLCBUaW1lVW5pdC5NSU5VVEVTKTwvdHQ+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRHVyYXRpb24gdGhlIHRpbWUgZHVyYXRpb24gaW4gdGhlIGdpdmVuIDx0dD5zb3VyY2VVbml0PC90dD4KKyAgICAgKiBAcGFyYW0gc291cmNlVW5pdCB0aGUgdW5pdCBvZiB0aGUgPHR0PnNvdXJjZUR1cmF0aW9uPC90dD4gYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgZHVyYXRpb24gaW4gdGhpcyB1bml0LAorICAgICAqIG9yIDx0dD5Mb25nLk1JTl9WQUxVRTwvdHQ+IGlmIGNvbnZlcnNpb24gd291bGQgbmVnYXRpdmVseQorICAgICAqIG92ZXJmbG93LCBvciA8dHQ+TG9uZy5NQVhfVkFMVUU8L3R0PiBpZiBpdCB3b3VsZCBwb3NpdGl2ZWx5IG92ZXJmbG93LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGNvbnZlcnQobG9uZyBzb3VyY2VEdXJhdGlvbiwgVGltZVVuaXQgc291cmNlVW5pdCk7CisKKyAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIDx0dD5OQU5PU0VDT05EUy5jb252ZXJ0KGR1cmF0aW9uLCB0aGlzKTwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBkdXJhdGlvbiwKKyAgICAgKiBvciA8dHQ+TG9uZy5NSU5fVkFMVUU8L3R0PiBpZiBjb252ZXJzaW9uIHdvdWxkIG5lZ2F0aXZlbHkKKyAgICAgKiBvdmVyZmxvdywgb3IgPHR0PkxvbmcuTUFYX1ZBTFVFPC90dD4gaWYgaXQgd291bGQgcG9zaXRpdmVseSBvdmVyZmxvdy4KKyAgICAgKiBAc2VlICNjb252ZXJ0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdG9OYW5vcyhsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gPHR0Pk1JQ1JPU0VDT05EUy5jb252ZXJ0KGR1cmF0aW9uLCB0aGlzKTwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBkdXJhdGlvbiwKKyAgICAgKiBvciA8dHQ+TG9uZy5NSU5fVkFMVUU8L3R0PiBpZiBjb252ZXJzaW9uIHdvdWxkIG5lZ2F0aXZlbHkKKyAgICAgKiBvdmVyZmxvdywgb3IgPHR0PkxvbmcuTUFYX1ZBTFVFPC90dD4gaWYgaXQgd291bGQgcG9zaXRpdmVseSBvdmVyZmxvdy4KKyAgICAgKiBAc2VlICNjb252ZXJ0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdG9NaWNyb3MobG9uZyBkdXJhdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIDx0dD5NSUxMSVNFQ09ORFMuY29udmVydChkdXJhdGlvbiwgdGhpcyk8L3R0Pi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgZHVyYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgZHVyYXRpb24sCisgICAgICogb3IgPHR0PkxvbmcuTUlOX1ZBTFVFPC90dD4gaWYgY29udmVyc2lvbiB3b3VsZCBuZWdhdGl2ZWx5CisgICAgICogb3ZlcmZsb3csIG9yIDx0dD5Mb25nLk1BWF9WQUxVRTwvdHQ+IGlmIGl0IHdvdWxkIHBvc2l0aXZlbHkgb3ZlcmZsb3cuCisgICAgICogQHNlZSAjY29udmVydAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHRvTWlsbGlzKGxvbmcgZHVyYXRpb24pOworCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byA8dHQ+U0VDT05EUy5jb252ZXJ0KGR1cmF0aW9uLCB0aGlzKTwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBkdXJhdGlvbiwKKyAgICAgKiBvciA8dHQ+TG9uZy5NSU5fVkFMVUU8L3R0PiBpZiBjb252ZXJzaW9uIHdvdWxkIG5lZ2F0aXZlbHkKKyAgICAgKiBvdmVyZmxvdywgb3IgPHR0PkxvbmcuTUFYX1ZBTFVFPC90dD4gaWYgaXQgd291bGQgcG9zaXRpdmVseSBvdmVyZmxvdy4KKyAgICAgKiBAc2VlICNjb252ZXJ0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdG9TZWNvbmRzKGxvbmcgZHVyYXRpb24pOworCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byA8dHQ+TUlOVVRFUy5jb252ZXJ0KGR1cmF0aW9uLCB0aGlzKTwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBkdXJhdGlvbiwKKyAgICAgKiBvciA8dHQ+TG9uZy5NSU5fVkFMVUU8L3R0PiBpZiBjb252ZXJzaW9uIHdvdWxkIG5lZ2F0aXZlbHkKKyAgICAgKiBvdmVyZmxvdywgb3IgPHR0PkxvbmcuTUFYX1ZBTFVFPC90dD4gaWYgaXQgd291bGQgcG9zaXRpdmVseSBvdmVyZmxvdy4KKyAgICAgKiBAc2VlICNjb252ZXJ0CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHRvTWludXRlcyhsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gPHR0PkhPVVJTLmNvbnZlcnQoZHVyYXRpb24sIHRoaXMpPC90dD4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIGR1cmF0aW9uCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIGR1cmF0aW9uLAorICAgICAqIG9yIDx0dD5Mb25nLk1JTl9WQUxVRTwvdHQ+IGlmIGNvbnZlcnNpb24gd291bGQgbmVnYXRpdmVseQorICAgICAqIG92ZXJmbG93LCBvciA8dHQ+TG9uZy5NQVhfVkFMVUU8L3R0PiBpZiBpdCB3b3VsZCBwb3NpdGl2ZWx5IG92ZXJmbG93LgorICAgICAqIEBzZWUgI2NvbnZlcnQKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdG9Ib3Vycyhsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gPHR0PkRBWVMuY29udmVydChkdXJhdGlvbiwgdGhpcyk8L3R0Pi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgZHVyYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgZHVyYXRpb24KKyAgICAgKiBAc2VlICNjb252ZXJ0CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHRvRGF5cyhsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgdG8gY29tcHV0ZSB0aGUgZXhjZXNzLW5hbm9zZWNvbmQgYXJndW1lbnQgdG8gd2FpdCwgc2xlZXAsIGpvaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZCB0aGUgZHVyYXRpb24KKyAgICAgKiBAcGFyYW0gbSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcworICAgICAqLworICAgIGFic3RyYWN0IGludCBleGNlc3NOYW5vcyhsb25nIGQsIGxvbmcgbSk7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHRpbWVkIDx0dD5PYmplY3Qud2FpdDwvdHQ+IHVzaW5nIHRoaXMgdGltZSB1bml0LgorICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjb252ZXJ0cyB0aW1lb3V0IGFyZ3VtZW50cworICAgICAqIGludG8gdGhlIGZvcm0gcmVxdWlyZWQgYnkgdGhlIDx0dD5PYmplY3Qud2FpdDwvdHQ+IG1ldGhvZC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGltcGxlbWVudCBhIGJsb2NraW5nIDx0dD5wb2xsPC90dD4KKyAgICAgKiBtZXRob2Qoc2VlIHtAbGluayBCbG9ja2luZ1F1ZXVlI3BvbGwgQmxvY2tpbmdRdWV1ZS5wb2xsfSkgdXNpbmc6CisgICAgICogCisgICAgICogPHByZT4gcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcG9sbChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpCisgICAgICogdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsgd2hpbGUgKGVtcHR5KSB7CisgICAgICogdW5pdC50aW1lZFdhaXQodGhpcywgdGltZW91dCk7IC4uLiB9IH08L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byB3YWl0IG9uCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIG1heGltdW0gdGltZSB0byB3YWl0LiBJZiBsZXNzIHRoYW4KKyAgICAgKiBvciBlcXVhbCB0byB6ZXJvLCBkbyBub3Qgd2FpdCBhdCBhbGwuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nLgorICAgICAqIEBzZWUgT2JqZWN0I3dhaXQobG9uZywgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRpbWVkV2FpdChPYmplY3Qgb2JqLCBsb25nIHRpbWVvdXQpCisgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgeworICAgICAgICAgICAgbG9uZyBtcyA9IHRvTWlsbGlzKHRpbWVvdXQpOworICAgICAgICAgICAgaW50IG5zID0gZXhjZXNzTmFub3ModGltZW91dCwgbXMpOworICAgICAgICAgICAgb2JqLndhaXQobXMsIG5zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgdGltZWQgPHR0PlRocmVhZC5qb2luPC90dD4gdXNpbmcgdGhpcyB0aW1lIHVuaXQuCisgICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNvbnZlcnRzIHRpbWUgYXJndW1lbnRzIGludG8gdGhlCisgICAgICogZm9ybSByZXF1aXJlZCBieSB0aGUgPHR0PlRocmVhZC5qb2luPC90dD4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHRocmVhZCB0aGUgdGhyZWFkIHRvIHdhaXQgZm9yCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIG1heGltdW0gdGltZSB0byB3YWl0LiBJZiBsZXNzIHRoYW4KKyAgICAgKiBvciBlcXVhbCB0byB6ZXJvLCBkbyBub3Qgd2FpdCBhdCBhbGwuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nLgorICAgICAqIEBzZWUgVGhyZWFkI2pvaW4obG9uZywgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRpbWVkSm9pbihUaHJlYWQgdGhyZWFkLCBsb25nIHRpbWVvdXQpCisgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgeworICAgICAgICAgICAgbG9uZyBtcyA9IHRvTWlsbGlzKHRpbWVvdXQpOworICAgICAgICAgICAgaW50IG5zID0gZXhjZXNzTmFub3ModGltZW91dCwgbXMpOworICAgICAgICAgICAgdGhyZWFkLmpvaW4obXMsIG5zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgPHR0PlRocmVhZC5zbGVlcDwvdHQ+IHVzaW5nIHRoaXMgdW5pdC4KKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29udmVydHMgdGltZSBhcmd1bWVudHMgaW50byB0aGUKKyAgICAgKiBmb3JtIHJlcXVpcmVkIGJ5IHRoZSA8dHQ+VGhyZWFkLnNsZWVwPC90dD4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIG1heGltdW0gdGltZSB0byBzbGVlcC4gSWYgbGVzcyB0aGFuCisgICAgICogb3IgZXF1YWwgdG8gemVybywgZG8gbm90IHNsZWVwIGF0IGFsbC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIGludGVycnVwdGVkIHdoaWxlIHNsZWVwaW5nLgorICAgICAqIEBzZWUgVGhyZWFkI3NsZWVwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2xlZXAobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAodGltZW91dCA+IDApIHsKKyAgICAgICAgICAgIGxvbmcgbXMgPSB0b01pbGxpcyh0aW1lb3V0KTsKKyAgICAgICAgICAgIGludCBucyA9IGV4Y2Vzc05hbm9zKHRpbWVvdXQsIG1zKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChtcywgbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1V0aWxzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDIzNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1V0aWxzLmphdmEKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KKy8qCisgKiBXcml0dGVuIGJ5IERhd2lkIEt1cnp5bmllYywgYmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZQorICogZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2IEV4cGVydCBHcm91cC4gUmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sCisgKiBhcyBleHBsYWluZWQgYXQgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluLgorICogVGhhbmtzIHRvIENyYWlnIE1hdHRvY2tzIGZvciBzdWdnZXN0aW5nIHRvIHVzZSA8Y29kZT5zdW4ubWlzYy5QZXJmPC9jb2RlPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5jb25jdXJyZW50OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBncm91cHMgdG9nZXRoZXIgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS51dGlsLmNvbmN1cnJlbnQgdGhhdAorICogY2Fubm90IGJlIGZ1bGx5IGFuZCByZWxpYWJseSBpbXBsZW1lbnRlZCBpbiBiYWNrcG9ydCwgYnV0IGZvciB3aGljaCBzb21lCisgKiBmb3JtIG9mIGVtdWxhdGlvbiBpcyBwb3NzaWJsZS4KKyAqIEN1cnJlbnRseSwgdGhpcyBjbGFzcyBjb250YWlucyBtZXRob2RzIHJlbGF0ZWQgdG8gbmFub3NlY29uZC1wcmVjaXNpb24KKyAqIHRpbWluZywgcGFydGljdWxhcmx5IHZpYSB0aGUge0BsaW5rICNuYW5vVGltZX0gbWV0aG9kLiBUbyBtZWFzdXJlIHRpbWUKKyAqIGFjY3VyYXRlbHksIHRoaXMgbWV0aG9kIGJ5IGRlZmF1bHQgdXNlcyA8Y29kZT5qYXZhLnN1bi5QZXJmPC9jb2RlPiBvbgorICogSkRLMS40LjIgYW5kIGl0IGZhbGxzIGJhY2sgdG8gPGNvZGU+U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzPC9jb2RlPgorICogb24gZWFybGllciBKREtzLgorICoKKyAqIEBhdXRob3IgRGF3aWQgS3VyenluaWVjCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFV0aWxzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE5hbm9UaW1lciBuYW5vVGltZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHByb3ZpZGVyUHJvcCA9CisgICAgICAgICJlZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50Lk5hbm9UaW1lclByb3ZpZGVyIjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIE5hbm9UaW1lciB0aW1lciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgbmFub1RpbWVyQ2xhc3NOYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3ZpZGVyUHJvcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChuYW5vVGltZXJDbGFzc05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzLmZvck5hbWUobmFub1RpbWVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB0aW1lciA9IChOYW5vVGltZXIpIGNscy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAorICAgICAgICAgICAgICAgICJXQVJOSU5HOiB1bmFibGUgdG8gbG9hZCB0aGUgc3lzdGVtLXByb3BlcnR5LWRlZmluZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJuYW5vdGltZSBwcm92aWRlcjsgc3dpdGNoaW5nIHRvIHRoZSBkZWZhdWx0Iik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGltZXIgPSBuZXcgU3VuUGVyZlByb3ZpZGVyKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRpbWVyID0gbmV3IE1pbGxpc1Byb3ZpZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBuYW5vVGltZXIgPSB0aW1lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIFV0aWxzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG1vc3QgcHJlY2lzZSBhdmFpbGFibGUgc3lzdGVtIHRpbWVyLAorICAgICAqIGluIG5hbm9zZWNvbmRzLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIHRvIG1lYXN1cmUgZWxhcHNlZCB0aW1lIGFuZAorICAgICAqIGlzIG5vdCByZWxhdGVkIHRvIGFueSBvdGhlciBub3Rpb24gb2Ygc3lzdGVtIG9yIHdhbGwtY2xvY2sgdGltZS4gVGhlCisgICAgICogdmFsdWUgcmV0dXJuZWQgcmVwcmVzZW50cyBuYW5vc2Vjb25kcyBzaW5jZSBzb21lIGZpeGVkIGJ1dCBhcmJpdHJhcnkKKyAgICAgKiB0aW1lKHBlcmhhcHMgaW4gdGhlIGZ1dHVyZSwgc28gdmFsdWVzIG1heSBiZSBuZWdhdGl2ZSkuIFRoaXMgbWV0aG9kCisgICAgICogcHJvdmlkZXMgbmFub3NlY29uZCBwcmVjaXNpb24sIGJ1dCBub3QgbmVjZXNzYXJpbHkgbmFub3NlY29uZCBhY2N1cmFjeS4KKyAgICAgKiBObyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IGhvdyBmcmVxdWVudGx5IHZhbHVlcyBjaGFuZ2UuIERpZmZlcmVuY2VzCisgICAgICogaW4gc3VjY2Vzc2l2ZSBjYWxscyB0aGF0IHNwYW4gZ3JlYXRlciB0aGFuIGFwcHJveGltYXRlbHkgMjkyIHllYXJzCisgICAgICogKDJeNjMgbmFub3NlY29uZHMpIHdpbGwgbm90IGFjY3VyYXRlbHkgY29tcHV0ZSBlbGFwc2VkIHRpbWUgZHVlIHRvCisgICAgICogbnVtZXJpY2FsIG92ZXJmbG93LgorICAgICAqIAorICAgICAqIDxlbT5JbXBsZW1lbnRhdGlvbiBub3RlOjwvZW0+QnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgdXNlcworICAgICAqIDxjb2RlPnN1bi5taXNjLlBlcmY8L2NvZGU+IG9uIEphdmEgMS40LjIsIGFuZCBmYWxscyBiYWNrIHRvCisgICAgICogU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgZW11bGF0aW9uIG9uIGVhcmxpZXIgSkRLcy4gQ3VzdG9tCisgICAgICogdGltZXIgY2FuIGJlIHByb3ZpZGVkIHZpYSB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICogPGNvZGU+ZWR1LmVtb3J5Lm1hdGhjcy5iYWNrcG9ydC5qYXZhLnV0aWwuY29uY3VycmVudC5OYW5vVGltZXJQcm92aWRlcjwvY29kZT4uCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBzaG91bGQgbmFtZSBhIGNsYXNzIGltcGxlbWVudGluZworICAgICAqIHtAbGluayBOYW5vVGltZXJ9IGludGVyZmFjZS4KKyAgICAgKiBOb3RlOiBvbiBKREsgMS40LjIsIDxjb2RlPnN1bi5taXNjLlBlcmY8L2NvZGU+IHRpbWVyIHNlZW1zIHRvIGhhdmUKKyAgICAgKiByZXNvbHV0aW9uIG9mIHRoZSBvcmRlciBvZiAxIG1pY3Jvc2Vjb25kLCBtZWFzdXJlZCBvbiBMaW51eC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN5c3RlbSB0aW1lciwgaW4gbmFub3NlY29uZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIG5hbm9UaW1lKCkgeworICAgICAgICByZXR1cm4gbmFub1RpbWVyLm5hbm9UaW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBjdXJyZW50IHRocmVhZCB0byB3YWl0IHVudGlsIGl0IGlzIHNpZ25hbGxlZCBvciBpbnRlcnJ1cHRlZCwKKyAgICAgKiBvciB0aGUgc3BlY2lmaWVkIHdhaXRpbmcgdGltZSBlbGFwc2VzLiBUaGlzIG1ldGhvZCBvcmlnaW5hbGx5IGFwcGVhcnMKKyAgICAgKiBpbiB0aGUge0BsaW5rIENvbmRpdGlvbn0gaW50ZXJmYWNlLCBidXQgaXQgd2FzIG1vdmVkIHRvIGhlcmUgc2luY2UgaXQKKyAgICAgKiBjYW4gb25seSBiZSBlbXVsYXRlZCwgd2l0aCB2ZXJ5IGxpdHRsZSBhY2N1cmFjeSBndWFyYW50ZWVzOiB0aGUKKyAgICAgKiBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgYWNjdXJhdGUgbmFub3NlY29uZCB0aW1lciBhbmQgbmF0aXZlCisgICAgICogc3VwcG9ydCBmb3IgbmFub3NlY29uZC1wcmVjaXNpb24gd2FpdCBxdWV1ZXMsIHdoaWNoIGFyZSBub3QgdXN1YWxseQorICAgICAqIHByZXNlbnQgaW4gSlZNcyBwcmlvciB0byAxLjUuIExvc3Mgb2YgcHJlY2lzaW9uIG1heSBjYXVzZSB0b3RhbCB3YWl0aW5nCisgICAgICogdGltZXMgdG8gYmUgc3lzdGVtYXRpY2FsbHkgc2hvcnRlciB0aGFuIHNwZWNpZmllZCB3aGVuIHJlLXdhaXRzIG9jY3VyLgorICAgICAqIFRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmRpdGlvbiBpcyBhdG9taWNhbGx5CisgICAgICogcmVsZWFzZWQgYW5kIHRoZSBjdXJyZW50IHRocmVhZCBiZWNvbWVzIGRpc2FibGVkIGZvciB0aHJlYWQgc2NoZWR1bGluZworICAgICAqIHB1cnBvc2VzIGFuZCBsaWVzIGRvcm1hbnQgdW50aWwgPGVtPm9uZTwvZW0+IG9mIGZpdmUgdGhpbmdzIGhhcHBlbnM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCBpbnZva2VzIHRoZSB7QGxpbmsKKyAgICAgKiBlZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiNzaWduYWx9CisgICAgICogbWV0aG9kIGZvciB0aGlzCisgICAgICogPHR0PkNvbmRpdGlvbjwvdHQ+IGFuZCB0aGUgY3VycmVudCB0aHJlYWQgaGFwcGVucyB0byBiZSBjaG9zZW4gYXMgdGhlCisgICAgICogdGhyZWFkIHRvIGJlIGF3YWtlbmVkOyBvcgorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCBpbnZva2VzIHRoZSB7QGxpbmsKKyAgICAgKiBlZHUuZW1vcnkubWF0aGNzLmJhY2twb3J0LmphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiNzaWduYWxBbGx9CisgICAgICogbWV0aG9kIGZvciB0aGlzCisgICAgICogPHR0PkNvbmRpdGlvbjwvdHQ+OyBvcgorICAgICAqIDxsaT5Tb21lIG90aGVyIHRocmVhZCB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCBpbnRlcnJ1cHRzfSB0aGUgY3VycmVudAorICAgICAqIHRocmVhZCwgYW5kIGludGVycnVwdGlvbiBvZiB0aHJlYWQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQ7IG9yCisgICAgICogPGxpPlRoZSBzcGVjaWZpZWQgd2FpdGluZyB0aW1lIGVsYXBzZXM7IG9yCisgICAgICogPGxpPkEgJnF1b3Q7PGVtPnNwdXJpb3VzIHdha2V1cDwvZW0+JnF1b3Q7IG9jY3Vycy4KKyAgICAgKiA8L3VsPiBJbiBhbGwgY2FzZXMsIGJlZm9yZSB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCBtdXN0CisgICAgICogcmUtYWNxdWlyZSB0aGUgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25kaXRpb24uIFdoZW4gdGhlCisgICAgICogdGhyZWFkIHJldHVybnMgaXQgaXMgPGVtPmd1YXJhbnRlZWQ8L2VtPiB0byBob2xkIHRoaXMgbG9jay4KKyAgICAgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT5oYXMgaXRzIGludGVycnVwdGVkIHN0YXR1cyBzZXQgb24gZW50cnkgdG8gdGhpcyBtZXRob2Q7IG9yCisgICAgICogPGxpPmlzIHtAbGluayBUaHJlYWQjaW50ZXJydXB0IGludGVycnVwdGVkfSB3aGlsZSB3YWl0aW5nCisgICAgICogYW5kIGludGVycnVwdGlvbiBvZiB0aHJlYWQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQsCisgICAgICogPC91bD4KKyAgICAgKiB0aGVuIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaXMgdGhyb3duIGFuZCB0aGUgY3VycmVudCB0aHJlYWQncworICAgICAqIGludGVycnVwdGVkIHN0YXR1cyBpcyBjbGVhcmVkLiBJdCBpcyBub3Qgc3BlY2lmaWVkLCBpbiB0aGUgZmlyc3QKKyAgICAgKiBjYXNlLCB3aGV0aGVyIG9yIG5vdCB0aGUgdGVzdCBmb3IgaW50ZXJydXB0aW9uIG9jY3VycyBiZWZvcmUgdGhlIGxvY2sKKyAgICAgKiBpcyByZWxlYXNlZC4gVGhlIG1ldGhvZCByZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMKKyAgICAgKiByZW1haW5pbmcgdG8gd2FpdCBnaXZlbiB0aGUgc3VwcGxpZWQgPHR0Pm5hbm9zVGltZW91dDwvdHQ+CisgICAgICogdmFsdWUgdXBvbiByZXR1cm4sIG9yIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gaWYgaXQKKyAgICAgKiB0aW1lZCBvdXQuIEFjY3VyYWN5IG9mIHRoaXMgZXN0aW1hdGUgaXMgZGlyZWN0bHkgZGVwZW5kZW50IG9uIHRoZQorICAgICAqIGFjY3VyYWN5IG9mIHtAbGluayAjbmFub1RpbWV9LiBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZQorICAgICAqIHdoZXRoZXIgYW5kIGhvdyBsb25nIHRvIHJlLXdhaXQgaW4gY2FzZXMgd2hlcmUgdGhlIHdhaXQgcmV0dXJucyBidXQgYW4KKyAgICAgKiBhd2FpdGVkIGNvbmRpdGlvbiBzdGlsbCBkb2VzIG5vdCBob2xkLiBUeXBpY2FsIHVzZXMgb2YgdGhpcyBtZXRob2QgdGFrZQorICAgICAqIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAgICAgKiAKKyAgICAgKiA8cHJlPiBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhTWV0aG9kKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgeworICAgICAqIGxvbmcgbmFub3NUaW1lb3V0ID0gdW5pdC50b05hbm9zKHRpbWVvdXQpOworICAgICAqIHdoaWxlICghY29uZGl0aW9uQmVpbmdXYWl0ZWRGb3IpIHsgaWYgKG5hbm9zVGltZW91dCAmZ3Q7IDApCisgICAgICogbmFub3NUaW1lb3V0ID0gdGhlQ29uZGl0aW9uLmF3YWl0TmFub3MobmFub3NUaW1lb3V0KTsgZWxzZSByZXR1cm4gZmFsc2U7CisgICAgICogfSAvLyAuLi4gfQorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIDxiPkltcGxlbWVudGF0aW9uIENvbnNpZGVyYXRpb25zPC9iPgorICAgICAqIFRoZSBjdXJyZW50IHRocmVhZCBpcyBhc3N1bWVkIHRvIGhvbGQgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiA8dHQ+Q29uZGl0aW9uPC90dD4gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogSXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvIGRldGVybWluZSBpZiB0aGlzIGlzCisgICAgICogdGhlIGNhc2UgYW5kIGlmIG5vdCwgaG93IHRvIHJlc3BvbmQuIFR5cGljYWxseSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUKKyAgICAgKiB0aHJvd24oc3VjaCBhcyB7QGxpbmsgSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbn0pIGFuZCB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IGRvY3VtZW50IHRoYXQgZmFjdC4KKyAgICAgKiBBIGNvbmRpdGlvbiBpbXBsZW1lbnRhdGlvbiBjYW4gZmF2b3IgcmVzcG9uZGluZyB0byBhbiBpbnRlcnJ1cHQgb3ZlcgorICAgICAqIG5vcm1hbCBtZXRob2QgcmV0dXJuIGluIHJlc3BvbnNlIHRvIGEgc2lnbmFsLCBvciBvdmVyIGluZGljYXRpbmcgdGhlCisgICAgICogZWxhcHNlIG9mIHRoZSBzcGVjaWZpZWQgd2FpdGluZyB0aW1lLiBJbiBlaXRoZXIgY2FzZSB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzaWduYWwgaXMgcmVkaXJlY3RlZCB0byBhbm90aGVyIHdhaXRpbmcgdGhyZWFkLCBpZgorICAgICAqIHRoZXJlIGlzIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdG8gd2FpdCBmb3IKKyAgICAgKiBAcGFyYW0gbmFub3NUaW1lb3V0IHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCwgaW4gbmFub3NlY29uZHMKKyAgICAgKiBAcmV0dXJuIEEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gaWYgdGhlIHdhaXQgaGFzCisgICAgICogdGltZWQgb3V0OyBvdGhlcndpc2UgYW4gZXN0aW1hdGUsIHRoYXQKKyAgICAgKiBpcyBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIDx0dD5uYW5vc1RpbWVvdXQ8L3R0PiBhcmd1bWVudCwKKyAgICAgKiBvZiB0aGUgdGltZSBzdGlsbCByZW1haW5pbmcgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5lZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZChhbmQKKyAgICAgKiBpbnRlcnJ1cHRpb24gb2YgdGhyZWFkIHN1c3BlbnNpb24gaXMgc3VwcG9ydGVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgYXdhaXROYW5vcyhDb25kaXRpb24gY29uZCwgbG9uZyBuYW5vc1RpbWVvdXQpCisgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW5vc1RpbWVvdXQgPD0gMCkgcmV0dXJuIG5hbm9zVGltZW91dDsKKyAgICAgICAgbG9uZyBub3cgPSBuYW5vVGltZSgpOworICAgICAgICBjb25kLmF3YWl0KG5hbm9zVGltZW91dCwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgICAgICByZXR1cm4gbmFub3NUaW1lb3V0IC0gKG5hbm9UaW1lKCkgLSBub3cpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFN1blBlcmZQcm92aWRlciBpbXBsZW1lbnRzIE5hbm9UaW1lciB7CisKKyAgICAgICAgZmluYWwgc3VuLm1pc2MuUGVyZiBwZXJmOworICAgICAgICBmaW5hbCBsb25nIG11bHRpcGxpZXIsIGRpdmlzb3I7CisKKyAgICAgICAgU3VuUGVyZlByb3ZpZGVyKCkgeworICAgICAgICAgICAgcGVyZiA9IChzdW4ubWlzYy5QZXJmKQorICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdW4ubWlzYy5QZXJmLmdldFBlcmYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIGF2b2lkIEJPVEggb3ZlcmZsb3cgYW5kIHJvdW5kaW5nIGVycm9ycworICAgICAgICAgICAgbG9uZyBudW1lcmF0b3IgPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgbG9uZyBkZW5vbWluYXRvciA9IHBlcmYuaGlnaFJlc0ZyZXF1ZW5jeSgpOworICAgICAgICAgICAgbG9uZyBnY2QgPSBnY2QobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgICAgICAgICB0aGlzLm11bHRpcGxpZXIgPSBudW1lcmF0b3IgLyBnY2Q7CisgICAgICAgICAgICB0aGlzLmRpdmlzb3IgPSBkZW5vbWluYXRvciAvIGdjZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIG5hbm9UaW1lKCkgeworICAgICAgICAgICAgbG9uZyBjdHIgPSBwZXJmLmhpZ2hSZXNDb3VudGVyKCk7CisKKyAgICAgICAgICAgIC8vIGFueXRoaW5nIGxlc3Mgc29waGlzdGljYXRlZCBzdWZmZXJzIGVpdGhlciBmcm9tIHJvdW5kaW5nIGVycm9ycworICAgICAgICAgICAgLy8gKEZQIGFyaXRobWV0aWNzLCBiYWNrcG9ydCB2MS4wKSBvciBvdmVyZmxvdywgd2hlbiBnY2QgaXMgc21hbGwKKyAgICAgICAgICAgIC8vIChhIGJ1ZyBpbiBiYWNrcG9ydCB2MS4wXzAxIHJlcG9ydGVkIGJ5IFJhbWVzaCBOZXRoaSkKKworICAgICAgICAgICAgcmV0dXJuICgoY3RyIC8gZGl2aXNvcikgKiBtdWx0aXBsaWVyKSArCisgICAgICAgICAgICAgICAgKGN0ciAlIGRpdmlzb3IpICogbXVsdGlwbGllciAvIGRpdmlzb3I7CisKKyAgICAgICAgICAgIC8vIGV2ZW4gdGhlIGFib3ZlIGNhbiB0aGVvcmV0aWNhbGx5IGNhdXNlIHByb2JsZW1zIGlmIHlvdXIgSlZNIGlzCisgICAgICAgICAgICAvLyBydW5uaW5nIGZvciBzdWZmaWNpZW50bHkgbG9uZyB0aW1lLCBidXQgInN1ZmZpY2llbnRseSIgbWVhbnMgMjkyCisgICAgICAgICAgICAvLyB5ZWFycyh3b3JzdCBjYXNlKSwgb3IgMzAsMDAwIHllYXJzKGNvbW1vbiBjYXNlKS4KKworICAgICAgICAgICAgLy8gRGV0YWlsczogd2hlbiB0aGUgdGlja3MgY3RyIG92ZXJmbG93cywgdGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkCisgICAgICAgICAgICAvLyBkaXNjb250aW51aXR5IGluIGNvbXB1dGVkIG5hbm9zLCBldmVuIGluIGluZmluaXRlIGFyaXRobWV0aWNzLAorICAgICAgICAgICAgLy8gdW5sZXNzIHdlIGNvdW50IG51bWJlciBvZiBvdmVyZmxvd3MgdGhhdCB0aGUgY3RyIHdlbnQgdGhyb3VnaAorICAgICAgICAgICAgLy8gc2luY2UgdGhlIEpWTSBzdGFydGVkLiBUaGlzIGZvbGxvd3MgZnJvbSB0aGUgZmFjdCB0aGF0CisgICAgICAgICAgICAvLyAoMl42NCptdWx0aXBsaWVyL2Rpdmlzb3IpIG1vZCgyXjY0KSA+IDAgaW4gZ2VuZXJhbCBjYXNlLgorICAgICAgICAgICAgLy8gVGhlb3JldGljYWxseSB3ZSBjb3VsZCBmaW5kIG91dCB0aGUgbnVtYmVyIG9mIG92ZXJmbG93cyBieQorICAgICAgICAgICAgLy8gY2hlY2tpbmcgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIGJ1dCB0aGlzIGlzIHVucmVsaWFibGUKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBzeXN0ZW0gdGltZSBjYW4gdW5wcmVkaWN0YWJseSBjaGFuZ2UgZHVyaW5nIHRoZSBKVk0KKyAgICAgICAgICAgIC8vIGxpZmV0aW1lLgorICAgICAgICAgICAgLy8gVGhlIHRpbWUgdG8gb3ZlcmZsb3cgaXMgMl42MyAvIHRpY2tzIGZyZXF1ZW5jeS4gV2l0aCBjdXJyZW50CisgICAgICAgICAgICAvLyB0aWNrcyBmcmVxdWVuY2llcyBvZiBzZXZlcmFsIE1IeiwgaXQgZ2l2ZXMgYWJvdXQgMzAsMDAwIHllYXJzCisgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHByb2JsZW0gaGFwcGVucy4gSWYgdGlja3MgZnJlcXVlbmN5IHJlYWNoZXMgMSBHSHosIHRoZQorICAgICAgICAgICAgLy8gdGltZSB0byBvdmVyZmxvdyBpcyAyOTIgeWVhcnMuIEl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGZyZXF1ZW5jeQorICAgICAgICAgICAgLy8gZXZlciBleGNlZWRzIDEgR0h6LiBXZSBjb3VsZCBkb3VibGUgdGhlIHRpbWUgdG8gb3ZlcmZsb3cKKyAgICAgICAgICAgIC8vICh0byAyXjY0IC8gZnJlcXVlbmN5KSBieSB1c2luZyB1bnNpZ25lZCBhcml0aG1ldGljcywgZS5nLiBieQorICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29ycmVjdGlvbiB3aGVuZXZlciB0aGUgdGlja3MgaXMgbmVnYXRpdmU6CisgICAgICAgICAgICAvLyAgICAgIC0yKigoTG9uZy5NSU5fVkFMVUUgLyBkaXZpc29yKSAqIG11bHRpcGxpZXIgKworICAgICAgICAgICAgLy8gICAgICAgICAgKExvbmcuTUlOX1ZBTFVFICUgZGl2aXNvcikgKiBtdWx0aXBsaWVyIC8gZGl2aXNvcikKKyAgICAgICAgICAgIC8vIEJ1dCwgd2l0aCB0aGUgd29yc3QgY2FzZSBvZiBhcyBtdWNoIGFzIDI5MiB5ZWFycywgaXQgZG9lcyBub3QKKyAgICAgICAgICAgIC8vIHNlZW0ganVzdGlmaWVkLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWlsbGlzUHJvdmlkZXIgaW1wbGVtZW50cyBOYW5vVGltZXIgeworCisgICAgICAgIE1pbGxpc1Byb3ZpZGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgbmFub1RpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKiAxMDAwMDAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnY2QobG9uZyBhLCBsb25nIGIpIHsKKyAgICAgICAgbG9uZyByOworICAgICAgICB3aGlsZSAoYiA+IDApIHsKKyAgICAgICAgICAgIHIgPSBhICUgYjsKKyAgICAgICAgICAgIGEgPSBiOworICAgICAgICAgICAgYiA9IHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb2xsZWN0aW9uVG9BcnJheShDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgLy8gZ3Vlc3MgdGhlIGFycmF5IHNpemU7IGV4cGVjdCB0byBwb3NzaWJseSBiZSBkaWZmZXJlbnQKKyAgICAgICAgaW50IGxlbiA9IGMuc2l6ZSgpOworICAgICAgICBPYmplY3RbXSBhcnIgPSBuZXcgT2JqZWN0W2xlbl07CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB3aGlsZSAoaWR4IDwgbGVuICYmIGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBhcnJbaWR4KytdID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpZHggPT0gbGVuKSByZXR1cm4gYXJyOworICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBoYXZlIHRvIHRyaW0KKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZihhcnIsIGlkeCwgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBoYXZlIHRvIGdyb3cKKyAgICAgICAgICAgIGludCBuZXdjYXAgPSAoKGFyci5sZW5ndGggLyAyKSArIDEpICogMzsKKyAgICAgICAgICAgIGlmIChuZXdjYXAgPCBhcnIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgLy8gb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld2NhcCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPdXRPZk1lbW9yeUVycm9yKCJyZXF1aXJlZCBhcnJheSBzaXplIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyciA9IEFycmF5cy5jb3B5T2YoYXJyLCBuZXdjYXAsIE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgICAgIGxlbiA9IG5ld2NhcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29sbGVjdGlvblRvQXJyYXkoQ29sbGVjdGlvbiBjLCBPYmplY3RbXSBhKSB7CisgICAgICAgIENsYXNzIGFUeXBlID0gYS5nZXRDbGFzcygpOworICAgICAgICAvLyBndWVzcyB0aGUgYXJyYXkgc2l6ZTsgZXhwZWN0IHRvIHBvc3NpYmx5IGJlIGRpZmZlcmVudAorICAgICAgICBpbnQgbGVuID0gYy5zaXplKCk7CisgICAgICAgIE9iamVjdFtdIGFyciA9IChhLmxlbmd0aCA+PSBsZW4gPyBhIDoKKyAgICAgICAgICAgIChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCBsZW4pKTsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gYy5pdGVyYXRvcigpOworICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHdoaWxlIChpZHggPCBsZW4gJiYgaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGFycltpZHgrK10gPSBpdHIubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBsZW4pIHJldHVybiBhcnI7CisgICAgICAgICAgICAgICAgaWYgKGFyciA9PSBhKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9yaWcgYXJyYXkgLT4gbnVsbCB0ZXJtaW5hdGUKKyAgICAgICAgICAgICAgICAgICAgYVtpZHhdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byB0cmltCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKGFyciwgaWR4LCBhVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBoYXZlIHRvIGdyb3cKKyAgICAgICAgICAgIGludCBuZXdjYXAgPSAoKGFyci5sZW5ndGggLyAyKSArIDEpICogMzsKKyAgICAgICAgICAgIGlmIChuZXdjYXAgPCBhcnIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgLy8gb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld2NhcCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPdXRPZk1lbW9yeUVycm9yKCJyZXF1aXJlZCBhcnJheSBzaXplIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyciA9IEFycmF5cy5jb3B5T2YoYXJyLCBuZXdjYXAsIGFUeXBlKTsKKyAgICAgICAgICAgIGxlbiA9IG5ld2NhcDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9XYWl0UXVldWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvY29uY3VycmVudC9XYWl0UXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGRmMjYxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1dhaXRRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IERvdWcgTGVhIGFuZCByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogVGhpcyBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2VzIHdoYXRzb2V2ZXIgd2l0aG91dCBhY2tub3dsZWRnbWVudC4KKyAqIFRoYW5rcyBmb3IgdGhlIGFzc2lzdGFuY2UgYW5kIHN1cHBvcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJzLAorICogYW5kIGV2ZXJ5b25lIGNvbnRyaWJ1dGluZywgdGVzdGluZywgYW5kIHVzaW5nIHRoaXMgY29kZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGludGVybmFsIHF1ZXVlIGNsYXNzZXMgZm9yIHNlbWFwaG9yZXMsIGV0Yy4KKyAqIFJlbGllcyBvbiBzdWJjbGFzc2VzIHRvIGFjdHVhbGx5IGltcGxlbWVudCBxdWV1ZSBtZWNoYW5pY3MuCisgKiBOT1RFOiB0aGlzIGNsYXNzIGlzIE5PVCBwcmVzZW50IGluIGphdmEudXRpbC5jb25jdXJyZW50LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2FpdFF1ZXVlIHsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc2VydChXYWl0Tm9kZSB3KTsgLy8gYXNzdW1lZCBub3QgdG8gYmxvY2sKKworICAgIHB1YmxpYyBhYnN0cmFjdCBXYWl0Tm9kZSBleHRyYWN0KCk7IC8vIHNob3VsZCByZXR1cm4gbnVsbCBpZiBlbXB0eQorCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTm9kZXMoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVuZ3RoKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbiBnZXRXYWl0aW5nVGhyZWFkcygpOworCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNXYWl0aW5nKFRocmVhZCB0aHJlYWQpOworCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUXVldWVkU3luYyB7CisKKyAgICAgICAgLy8gaW52b2tlZCB3aXRoIHN5bmMgb24gd2FpdCBub2RlLCAoYXRvbWljYWxseSkganVzdCBiZWZvcmUgZW5xdWV1aW5nCisgICAgICAgIGJvb2xlYW4gcmVjaGVjayhXYWl0Tm9kZSBub2RlKTsKKworICAgICAgICAvLyBpbnZva2VkIHdpdGggc3luYyBvbiB3YWl0IG5vZGUsIChhdG9taWNhbGx5KSBqdXN0IGJlZm9yZSBzaWduYWxsaW5nCisgICAgICAgIHZvaWQgdGFrZU92ZXIoV2FpdE5vZGUgbm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWl0Tm9kZSB7CisKKyAgICAgICAgYm9vbGVhbiB3YWl0aW5nID0gdHJ1ZTsKKyAgICAgICAgV2FpdE5vZGUgbmV4dCA9IG51bGw7CisgICAgICAgIGZpbmFsIFRocmVhZCBvd25lcjsKKworICAgICAgICBwdWJsaWMgV2FpdE5vZGUoKSB7CisgICAgICAgICAgICB0aGlzLm93bmVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJlYWQgZ2V0T3duZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gb3duZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2lnbmFsKFF1ZXVlZFN5bmMgc3luYykgeworICAgICAgICAgICAgYm9vbGVhbiBzaWduYWxsZWQgPSB3YWl0aW5nOworICAgICAgICAgICAgaWYgKHNpZ25hbGxlZCkgeworICAgICAgICAgICAgICAgIHdhaXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgICAgICBzeW5jLnRha2VPdmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpZ25hbGxlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkb1RpbWVkV2FpdChRdWV1ZWRTeW5jIHN5bmMsIGxvbmcgbmFub3MpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHN5bmMucmVjaGVjayh0aGlzKSB8fCAhd2FpdGluZykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5hbm9zIDw9IDApIHsKKyAgICAgICAgICAgICAgICB3YWl0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gVXRpbHMubmFub1RpbWUoKSArIG5hbm9zOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyA7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy50aW1lZFdhaXQodGhpcywgbmFub3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3YWl0aW5nKSAvLyBkZWZpbml0ZWx5IHNpZ25hbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3MgPSBkZWFkbGluZSAtIFV0aWxzLm5hbm9UaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbm9zIDw9IDApIHsgLy8gdGltZWQgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nKSB7IC8vIG5vIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyA9IGZhbHNlOyAvLyBpbnZhbGlkYXRlIGZvciB0aGUgc2lnbmFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCBhZnRlciBpdCB3YXMgbm90aWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkb1dhaXQoUXVldWVkU3luYyBzeW5jKQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghc3luYy5yZWNoZWNrKHRoaXMpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhaXRpbmcpIHdhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBpZiAod2FpdGluZykgeyAvLyBubyBub3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgPSBmYWxzZTsgLy8gaW52YWxpZGF0ZSBmb3IgdGhlIHNpZ25hbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgYWZ0ZXIgaXQgd2FzIG5vdGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRvV2FpdFVuaW50ZXJydXB0aWJseShRdWV1ZWRTeW5jIHN5bmMpIHsKKyAgICAgICAgICAgIGlmICghc3luYy5yZWNoZWNrKHRoaXMpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB3YXNJbnRlcnJ1cHRlZCA9IFRocmVhZC5pbnRlcnJ1cHRlZCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh3YWl0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzSW50ZXJydXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gbm90aWZ5OyBpZiB3ZSB3ZXJlIHNpZ25hbGxlZCwgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIG5vdCB3YWl0aW5nLCBhbmQgd2UnbGwgYWN0IGxpa2Ugc2lnbmFsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAod2FzSW50ZXJydXB0ZWQpIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY5MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDIzIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+Q29uY3VycmVudCBVdGlsaXRpZXM8L3N0cm9uZz48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDQ3YjkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDIzIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+R2VuZXJhbCBVdGlsaXRpZXM8L3N0cm9uZz48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvQ29tbWVudGFibGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9Db21tZW50YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYTA5MWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvQ29tbWVudGFibGUuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sOworCisvKioKKyAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgYWRvcm5lZCB3aXRoIGNvbW1lbnRzLgorICoKKyAqIEBub2phdmFkb2MKKyAqIEBzaW5jZSAwLjMuMworICovCitwdWJsaWMgaW50ZXJmYWNlIENvbW1lbnRhYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQ09NTUVOVFMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgLyoqCisgICAgICogU2V0IGNvbW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRzKFN0cmluZ1tdIGNvbW1lbnRzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBjb21tZW50cywgb3IgZW1wdHkgYXJyYXkgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWVudHMoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9Eb2NUeXBlUmVhZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvRG9jVHlwZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTY0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvRG9jVHlwZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCisvKioKKyAqIFRoZSBEb2NUeXBlUmVhZGVyIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGluY2x1ZGUgYQorICogPGNvZGU+RE9DVFlQRTwvY29kZT4gZGVjbGFyYXRpb24gaW4gYW4gWE1MIHN0cmVhbS4gT2Z0ZW4gaXQgaXMKKyAqIGluY29udmVuaWVudCB0byBzcGVjaWZ5IGEgPGNvZGU+RE9DVFlQRTwvY29kZT4gaW4gWE1MIGZpbGVzIC0tIHlvdSBtYW55CisgKiB3YW50IHRoZSBvcHRpb24gb2YgcGFyc2luZyB0aGUgZmlsZXMgd2l0aG91dCByZWFkaW5nIHRoZSBEVEQsIHRoZSBmaWxlcworICogbWF5IG1vdmUgYXJvdW5kLCBtYWtpbmcgcGxhY2luZyBhIDxjb2RlPkRPQ1RZUEU8L2NvZGU+IHBhdGggdG8gdGhlIERURCBpbgorICogdGhlbSB1bmF0dHJhY3RpdmUsIGFuZCB5b3UgbWF5IGhhdmUgbWFueSBmaWxlcywgbWFraW5nIGFuIGluLWxpbmUgaW5jbHVkZQorICogb2YgdGhlIERURCB1bmF0dHJhY3RpdmUgYXMgd2VsbC4gVGhpcyBjbGFzcyBtYWtlcworICogaXQgcG9zc2libGUgdG8gbWFpbnRhaW4gWE1MIGZpbGVzIHdpdGhvdXQgYW55IDxjb2RlPkRPQ1RZUEU8L2NvZGU+CisgKiBkZWNsYXJhdGlvbiwgdGhlbiBkeW5hbWljYWxseSBpbmNsdWRlIHRoZSA8Y29kZT5ET0NUWVBFPC9jb2RlPiBpbmZvcm1hdGlvbgorICogYXQgcnVudGltZS4KKyAqIElmIHRoZSBYTUwgc3RyZWFtIGFscmVhZHkgY29udGFpbnMgYSA8Y29kZT5ET0NUWVBFPC9jb2RlPiBkZWNsYXJhdGlvbiwKKyAqIHRoZSByZWFkZXIgd2lsbCBub3QgYWRkIGFuIGFkZGl0aW9uYWwgb25lLgorICogVGhlIDxjb2RlPkRPQ1RZUEU8L2NvZGU+IGluZm9ybWF0aW9uIGdpdmVuIHRvIHRoZSByZWFkZXIgd2lsbCBiZSBwbGFjZWQKKyAqIGluIHRoZSBYTUwgc3RyZWFtIGl0IHdyYXBzIGp1c3QgYmVmb3JlIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LgorICogTm90ZSB0aGF0IGFsbCBtZXRob2RzIG90aGVyIHRoYW4gdGhlIHZhcmlvdXMgZm9ybXMgb2YgPGNvZGU+cmVhZDwvY29kZT4KKyAqIGFwcGx5IG9udG8gdGhlIHVuZGVybHlpbmcgWE1MIHN0cmVhbSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIHVudGlsIHRoZQorICogaGVhZGVyIGFuZCBkb2MgdHlwZSBoYXZlIGJlZW4gcmVhZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRG9jVHlwZVJlYWRlciBleHRlbmRzIFJlYWRlciB7CisKKyAgICBwcml2YXRlIFJlYWRlciBfeG1sID0gbnVsbDsKKyAgICBwcml2YXRlIFJlYWRlciBfZG9jVHlwZSA9IG51bGw7CisKKyAgICAvLyB1c2UgdG8gaG9sZCBhbGwgaGVhZGVyIGluZm9ybWF0aW9uIHVudGlsIHRoZSBkb2N0eXBlIGRlYyBzaG91bGQgYmUKKyAgICAvLyBpbnNlcnRlZAorICAgIHByaXZhdGUgY2hhcltdIF9oZWFkZXIgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9oZWFkZXJQb3MgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSByZWFkZXIgd2l0aCBhbiBYTUwgc3RyZWFtLCBhbmQgc2V0IHRoZQorICAgICAqIDxjb2RlPkRPQ1RZUEU8L2NvZGU+IGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkLiBUaGUgZ2l2ZW4KKyAgICAgKiByZWFkZXIgc2hvdWxkIGFjY2VzcyBhbiBpbnB1dCBzb3VyY2UgY29udGFpbmluZyB0aGUgZXhhY3QgZGVjbGFyYXRpb24KKyAgICAgKiB0byBpbmNsdWRlLCBzdWNoIGFzOjxiciAvPgorICAgICAqIDxjb2RlPiZsdDtET0NUWVBFIHNjaGVkdWxlIFNZU1RFTSAic2NoZWR1bGUuZHRkIiZndDs8L2NvZGU+PGJyIC8+CisgICAgICogPGNvZGU+Jmx0O0RPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIC4uLiZndDs8L2NvZGU+PGJyIC8+CisgICAgICogPGNvZGU+Jmx0O0RPQ1RZUEUgc3RvY2stcHJpY2UgWyAmbHQ7RUxFTUVOVCBzeW1iIC4uLiBdJmd0OzwvY29kZT48YnIgLz4KKyAgICAgKiBJZiB0aGUgcmVhZGVyIGlzIG51bGwsIG5vIDxjb2RlPkRPQ1RZUEU8L2NvZGU+IGluZm9ybWF0aW9uIHdpbGwgYmUKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBEb2NUeXBlUmVhZGVyKFJlYWRlciB4bWwsIFJlYWRlciBkb2NUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBfZG9jVHlwZSA9IGRvY1R5cGU7CisgICAgICAgIF94bWwgPSBidWZmZXJIZWFkZXIoeG1sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgY2ggPSByZWFkSGVhZGVyKCk7CisgICAgICAgIGlmIChjaCAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBjaDsKKworICAgICAgICBjaCA9IHJlYWREb2NUeXBlKCk7CisgICAgICAgIGlmIChjaCAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBjaDsKKworICAgICAgICByZXR1cm4gX3htbC5yZWFkKCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBoZWFkZXJSZWFkID0gcmVhZEhlYWRlcihidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclJlYWQ7CisgICAgICAgIGxlbiAtPSBoZWFkZXJSZWFkOworCisgICAgICAgIGludCBkb2NSZWFkID0gcmVhZERvY1R5cGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIG9mZiArPSBkb2NSZWFkOworICAgICAgICBsZW4gLT0gZG9jUmVhZDsKKworICAgICAgICByZXR1cm4gaGVhZGVyUmVhZCArIGRvY1JlYWQgKyBfeG1sLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF94bWwuc2tpcChsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF94bWwucmVhZHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gX3htbC5tYXJrU3VwcG9ydGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF94bWwubWFyayhyZWFkQWhlYWRMaW1pdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBfeG1sLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBfeG1sLmNsb3NlKCk7CisgICAgICAgIGlmIChfZG9jVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgX2RvY1R5cGUuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgYWxsIHRleHQgdW50aWwgdGhlIGRvYyB0eXBlIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlYWRlciBidWZmZXJIZWFkZXIoUmVhZGVyIG9yaWdYTUwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvbid0IGJvdGhlciBpZiBubyBkb2MgdHlwZSBkZWNsYXJhdGlvbgorICAgICAgICBpZiAoX2RvY1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgX2hlYWRlciA9IG5ldyBjaGFyWzBdOworICAgICAgICAgICAgcmV0dXJuIG9yaWdYTUw7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYnVmZmVyCisgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFB1c2hiYWNrUmVhZGVyIHhtbCA9IG5ldyBQdXNoYmFja1JlYWRlcihvcmlnWE1MLCAzKTsKKyAgICAgICAgaW50IGNoLCBjaDIsIGNoMzsKKyAgICAgICAgYm9vbGVhbiBjb21tZW50OworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyByZWFkIGxlYWRpbmcgc3BhY2UKKyAgICAgICAgICAgIGZvciAoY2ggPSB4bWwucmVhZCgpOyBjaCAhPSAtMQorICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKTsgY2ggPSB4bWwucmVhZCgpKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjaCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlck9ubHkod3JpdGVyLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyBpZiBub3QgWE1MLCBmaW5pc2gKKyAgICAgICAgICAgIGlmIChjaCAhPSAnPCcpIHsKKyAgICAgICAgICAgICAgICB4bWwudW5yZWFkKGNoKTsKKyAgICAgICAgICAgICAgICBfaGVhZGVyID0gd3JpdGVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geG1sOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGUgcm9vdCBlbGVtZW50LCBmaW5pc2gKKyAgICAgICAgICAgIGNoID0geG1sLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSAnPycgJiYgY2ggIT0gJyEnKSB7CisgICAgICAgICAgICAgICAgeG1sLnVucmVhZChjaCk7CisgICAgICAgICAgICAgICAgeG1sLnVucmVhZCgnPCcpOworICAgICAgICAgICAgICAgIF9oZWFkZXIgPSB3cml0ZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIHJldHVybiB4bWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIGEgZG9jIHR5cGUgZWxlbWVudCwgZmluaXNoCisgICAgICAgICAgICBjaDIgPSB4bWwucmVhZCgpOworICAgICAgICAgICAgaWYgKGNoID09ICchJyAmJiBjaDIgPT0gJ0QnKSB7CisgICAgICAgICAgICAgICAgeG1sLnVucmVhZChjaDIpOworICAgICAgICAgICAgICAgIHhtbC51bnJlYWQoY2gpOworICAgICAgICAgICAgICAgIHhtbC51bnJlYWQoJzwnKTsKKyAgICAgICAgICAgICAgICBfaGVhZGVyID0gd3JpdGVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBfZG9jVHlwZSA9IG51bGw7IC8vIG1ha2Ugc3VyZSBkb2MgdHlwZSBub3QgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICByZXR1cm4geG1sOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpcyB0aGlzIGEgY29tbWVudD8KKyAgICAgICAgICAgIGNoMyA9IHhtbC5yZWFkKCk7CisgICAgICAgICAgICBjb21tZW50ID0gY2ggPT0gJyEnICYmIGNoMiA9PSAnLScgJiYgY2gzID09ICctJzsKKworICAgICAgICAgICAgLy8gcGxhY2UgZXZlcnl0aGluZyByZWFkIGludG8gdGhlIGhlYWRlciBtYXRlcmlhbAorICAgICAgICAgICAgd3JpdGVyLndyaXRlKCc8Jyk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoY2gpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNoMik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoY2gzKTsKKworICAgICAgICAgICAgLy8gcmVhZCB1bnRpbCB0aGUgbmV4dCAnPicgb3IgJy0tPicgaWYgYSBjb21tZW50CisgICAgICAgICAgICBjaDIgPSAwOworICAgICAgICAgICAgY2gzID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgoY2ggPSB4bWwucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjaCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKCFjb21tZW50ICYmIGNoID09ICc+JykKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNvbW1lbnQgJiYgY2ggPT0gJz4nICYmIGNoMiA9PSAnLScgJiYgY2gzID09ICctJykpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gdHJhY2sgbGFzdCB0d28gY2hhcnMgc28gd2UgY2FuIHRlbGwgaWYgY29tbWVudCBpcyBlbmRpbmcKKyAgICAgICAgICAgICAgICBjaDMgPSBjaDI7CisgICAgICAgICAgICAgICAgY2gyID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlck9ubHkod3JpdGVyLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyByZWFkIHRoZSBzcGFjZSBhZnRlciB0aGUgZGVjbGFyYXRpb24KKyAgICAgICAgICAgIGZvciAoY2ggPSB4bWwucmVhZCgpOyBjaCAhPSAtMQorICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKTsgY2ggPSB4bWwucmVhZCgpKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjaCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlck9ubHkod3JpdGVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgeG1sLnVucmVhZChjaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgc3RyZWFtIGNvbnRhaW5lZCBvbmx5IHNwYWNlLCB0aGluayBvZiBpdCBhcyBwdXJlIFhNTCB3aXRoIG5vCisgICAgICogaGVhZGVyIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgUmVhZGVyIGhlYWRlck9ubHkoU3RyaW5nIGhlYWRlcikgeworICAgICAgICBfaGVhZGVyID0gbmV3IGNoYXJbMF07CisgICAgICAgIF9kb2NUeXBlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoaGVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlcmVkIGhlYWRlciwgb3IgLTEgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkSGVhZGVyKCkgeworICAgICAgICBpZiAoX2hlYWRlclBvcyA9PSBfaGVhZGVyLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIF9oZWFkZXJbX2hlYWRlclBvcysrXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGZyb20gdGhlIGJ1ZmZlcmVkIGhlYWRlciB0byB0aGUgZ2l2ZW4gYXJyYXksIHJldHVybmluZyB0aGUKKyAgICAgKiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRIZWFkZXIoY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpbnQgcmVhZCA9IDA7CisgICAgICAgIGZvciAoOyBsZW4gPiAwICYmIF9oZWFkZXJQb3MgPCBfaGVhZGVyLmxlbmd0aDsgcmVhZCsrLCBvZmYrKywgbGVuLS0pCisgICAgICAgICAgICBidWZbb2ZmXSA9IF9oZWFkZXJbX2hlYWRlclBvcysrXTsKKworICAgICAgICByZXR1cm4gcmVhZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIGRvYyB0eXBlIGRlY2xhcmF0aW9uLCBvciAtMSBpZiBub25lLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWREb2NUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKF9kb2NUeXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgaW50IGNoID0gX2RvY1R5cGUucmVhZCgpOworICAgICAgICBpZiAoY2ggPT0gLTEpCisgICAgICAgICAgICBfZG9jVHlwZSA9IG51bGw7CisKKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZnJvbSB0aGUgZG9jIHR5cGUgZGVjbGFyYXRpb24gdG8gdGhlIGdpdmVuIGFycmF5LCByZXR1cm5pbmcgdGhlCisgICAgICogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkRG9jVHlwZShjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoX2RvY1R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGludCByZWFkID0gX2RvY1R5cGUucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgaWYgKHJlYWQgPCBsZW4pCisgICAgICAgICAgICBfZG9jVHlwZSA9IG51bGw7CisgICAgICAgIGlmIChyZWFkID09IC0xKQorICAgICAgICAgICAgcmVhZCA9IDA7CisKKyAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL0xvY2F0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvTG9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkwZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL0xvY2F0aW9uLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbDsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IHNlcnAudXRpbC5OdW1iZXJzOworCisvKioKKyAqIEBhdXRob3IgU3RlcGhlbiBLaW0KKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIExvY2F0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UoTG9jYXRpb24uY2xhc3MpOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9udWxsT25Ob0xvY2F0b3IgPSBmYWxzZTsKKyAgICBwcml2YXRlIExvY2F0b3IgX2xvY2F0b3IgPSBudWxsOworCisgICAgcHVibGljIExvY2F0aW9uKCkgeworICAgICAgICB0aGlzKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYXRpb24oYm9vbGVhbiBudWxsT25Ob0xvY2F0b3IpIHsKKyAgICAgICAgX251bGxPbk5vTG9jYXRvciA9IG51bGxPbk5vTG9jYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmb3IgY3VzdG9taXplZCByZXNwb25zZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKFN0cmluZyBmb3JtYXQpIHsKKyAgICAgICAgaWYgKF9sb2NhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChfbnVsbE9uTm9Mb2NhdG9yKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIF9sb2MuZ2V0KCJuby1sb2NhdG9yIikuZ2V0TWVzc2FnZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBPYmplY3QgW117CisgICAgICAgICAgICBOdW1iZXJzLnZhbHVlT2YoX2xvY2F0b3IuZ2V0TGluZU51bWJlcigpKSwKKyAgICAgICAgICAgIE51bWJlcnMudmFsdWVPZihfbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSksIF9sb2NhdG9yLmdldFB1YmxpY0lkKCksCisgICAgICAgICAgICBfbG9jYXRvci5nZXRTeXN0ZW1JZCgpIH0pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRMb2NhdGlvbihfbG9jLmdldCgibG9jYXRpb24tZm9ybWF0IikuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBfbG9jYXRvciA9IGxvY2F0b3I7CisgICAgfQorCisgICAgcHVibGljIExvY2F0b3IgZ2V0TG9jYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIF9sb2NhdG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bGxPbk5vTG9jYXRvcihib29sZWFuIHZhbCkgeworICAgICAgICBfbnVsbE9uTm9Mb2NhdG9yID0gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbE9uTm9Mb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gX251bGxPbk5vTG9jYXRvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvVmFsaWRhdGluZ0Vycm9ySGFuZGxlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1ZhbGlkYXRpbmdFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTdhYmRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1ZhbGlkYXRpbmdFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sOworCitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBFcnJvckhhbmRsZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CisgKiBiZWhhdmlvciBvZiBpZ25vcmluZyBwYXJzZSBlcnJvcnMgdG8gdGhyb3cgYSB7QGxpbmsgU0FYRXhjZXB0aW9ufSBpbnN0ZWFkLgorICogVGhpcyBoYW5kbGVyIGlzIHVzZWQgYnkgdGhlIHZhbGlkYXRpbmcgcGFyc2VycyBvZiB0aGUge0BsaW5rIFhNTEZhY3Rvcnl9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW5nRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKKworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvWE1MRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1hNTEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDQzMmJmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1hNTEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb24uTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogVGhlIFhNTEZhY3RvcnkgcHJvZHVjZXMgdmFsaWRhdGluZyBhbmQgbm9uLXZhbGlkYXRpbmcgRE9NIGxldmVsIDIKKyAqIGFuZCBTQVggbGV2ZWwgMiBwYXJzZXJzIGFuZCBYU0wgdHJhbnNmb3JtZXJzIHRocm91Z2ggSkFYUC4gSXQgdXNlcworICogY2FjaGluZyB0byBhdm9pZCByZXBlYXRlZGx5IHBheWluZyB0aGUgcmVsYXRpdmVseSBleHBlbnNpdmUgcnVudGltZSBjb3N0cworICogYXNzb2NpYXRlZCB3aXRoIHJlc29sdmluZyB0aGUgY29ycmVjdCBYTUwgaW1wbGVtZW50YXRpb24gdGhyb3VnaCB0aGUKKyAqIEpBWFAgY29uZmlndXJhdGlvbiBtZWNoYW5pc21zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxGYWN0b3J5IHsKKworICAgIC8vIGNhY2hlIHBhcnNlcnMgYW5kIHRyYW5zZm9ybWVycyBpbiBhbGwgcG9zc2libGUgY29uZmlndXJhdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5W10gX3NheEZhY3RvcmllcyA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeVtdIF9kb21GYWN0b3JpZXMgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIEVycm9ySGFuZGxlciBfdmFsaWRhdGluZzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIF9zYXhGYWN0b3JpZXMgPSBuZXcgU0FYUGFyc2VyRmFjdG9yeVs0XTsKKyAgICAgICAgX2RvbUZhY3RvcmllcyA9IG5ldyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5WzRdOworCisgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4RmFjdG9yeTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5OworICAgICAgICBpbnQgYXJySWR4OworICAgICAgICBmb3IgKGludCB2YWxpZGF0aW5nID0gMDsgdmFsaWRhdGluZyA8IDI7IHZhbGlkYXRpbmcrKykgeworICAgICAgICAgICAgZm9yIChpbnQgbmFtZXNwYWNlID0gMDsgbmFtZXNwYWNlIDwgMjsgbmFtZXNwYWNlKyspIHsKKyAgICAgICAgICAgICAgICBhcnJJZHggPSBmYWN0b3J5SW5kZXgodmFsaWRhdGluZyA9PSAxLCBuYW1lc3BhY2UgPT0gMSk7CisKKyAgICAgICAgICAgICAgICBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIHNheEZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nID09IDEpOworICAgICAgICAgICAgICAgIHNheEZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUobmFtZXNwYWNlID09IDEpOworICAgICAgICAgICAgICAgIF9zYXhGYWN0b3JpZXNbYXJySWR4XSA9IHNheEZhY3Rvcnk7CisKKyAgICAgICAgICAgICAgICBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGRvbUZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nID09IDEpOworICAgICAgICAgICAgICAgIGRvbUZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUobmFtZXNwYWNlID09IDEpOworICAgICAgICAgICAgICAgIF9kb21GYWN0b3JpZXNbYXJySWR4XSA9IGRvbUZhY3Rvcnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX3ZhbGlkYXRpbmcgPSBuZXcgVmFsaWRhdGluZ0Vycm9ySGFuZGxlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFNBWFBhcnNlciB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNBWFBhcnNlciBnZXRTQVhQYXJzZXIoYm9vbGVhbiB2YWxpZGF0aW5nLAorICAgICAgICBib29sZWFuIG5hbWVzcGFjZUF3YXJlKSB7CisgICAgICAgIFNBWFBhcnNlciBzcDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNwID0gX3NheEZhY3Rvcmllc1tmYWN0b3J5SW5kZXgodmFsaWRhdGluZywgbmFtZXNwYWNlQXdhcmUpXS4KKyAgICAgICAgICAgICAgICBuZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOZXN0YWJsZVJ1bnRpbWVFeGNlcHRpb24ocGNlKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZGF0aW5nKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNwLmdldFhNTFJlYWRlcigpLnNldEVycm9ySGFuZGxlcihfdmFsaWRhdGluZyk7CisgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBEb2N1bWVudEJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RE9NUGFyc2VyKGJvb2xlYW4gdmFsaWRhdGluZywKKyAgICAgICAgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZSkgeworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYiA9IF9kb21GYWN0b3JpZXNbZmFjdG9yeUluZGV4KHZhbGlkYXRpbmcsIG5hbWVzcGFjZUF3YXJlKV0uCisgICAgICAgICAgICAgICAgbmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uKHBjZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsaWRhdGluZykKKyAgICAgICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihfdmFsaWRhdGluZyk7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgRE9NIERvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7CisgICAgICAgIHJldHVybiBnZXRET01QYXJzZXIoZmFsc2UsIGZhbHNlKS5uZXdEb2N1bWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgaW5kZXggb2YgdGhlIGZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmFjdG9yeUluZGV4KGJvb2xlYW4gdmFsaWRhdGluZywKKyAgICAgICAgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZSkgeworICAgICAgICBpbnQgYXJyYXlJbmRleCA9IDA7CisgICAgICAgIGlmICh2YWxpZGF0aW5nKQorICAgICAgICAgICAgYXJyYXlJbmRleCArPSAyOworICAgICAgICBpZiAobmFtZXNwYWNlQXdhcmUpCisgICAgICAgICAgICBhcnJheUluZGV4ICs9IDE7CisgICAgICAgIHJldHVybiBhcnJheUluZGV4OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9YTUxXcml0ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9YTUxXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQ1ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1hNTFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworLyoqCisgKiBUaGUgWE1MV3JpdGVyIGlzIGEgd3JpdGVyIHR5cGUgZm9yIHByZXR0eS1wcmludGluZyBYTUwuCisgKiBJdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmVhbWVkIFhNTCB3aWxsIGJlIGdpdmVuIHdpdGhvdXQgYW55IHdoaXRlc3BhY2UsCisgKiBvdGhlciB0aGFuIHRoZSBzcGFjZSB3aXRoaW4gdGV4dCBibG9ja3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFhNTFdyaXRlciBleHRlbmRzIEZpbHRlcldyaXRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2VuZGwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICBwcml2YXRlIGludCBfbGFzdENoYXIgPSAnICc7CisgICAgcHJpdmF0ZSBpbnQgX2xhc3RDaGFyMiA9ICcgJzsKKyAgICBwcml2YXRlIGludCBfbGFzdENoYXIzID0gJyAnOworICAgIHByaXZhdGUgaW50IF9kZXB0aCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gWE1MV3JpdGVyIHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgZ2l2ZW4gc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBYTUxXcml0ZXIoV3JpdGVyIG91dCkgeworICAgICAgICBzdXBlcihvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgd3JpdGUoY2J1ZltvZmYgKyBpXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0ciwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIHdyaXRlKHN0ci5jaGFyQXQob2ZmICsgaSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyB0aGUgYmFzaWMgaWRlYSBvZiB0aGlzIG1ldGhvZCBpcyB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIGEgdGFnCisgICAgICAgIC8vIG9yIGEgdGV4dCBibG9jayBzdGFydHMsIGl0IGlzIHBsYWNlZCBvbiBhIHNlcGFyYXRlIGxpbmUgYW5kCisgICAgICAgIC8vIGluZGVudGVkIGFuIGFtb3VudCBhcHByb3ByaWF0ZSB0byB0aGUgWE1MIHRyZWUgZGVwdGgKKworICAgICAgICBpZiAoX2xhc3RDaGFyID09ICc8JykgeworICAgICAgICAgICAgLy8gdGFnIG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24/CisgICAgICAgICAgICBpZiAoYyAhPSAnPycgJiYgYyAhPSAnIScpIHsKKyAgICAgICAgICAgICAgICAvLyBlbmQgdGFnOyBkZWNyZWFzZSBkZXB0aCBiZWZvcmUgd3JpdGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLycpCisgICAgICAgICAgICAgICAgICAgIF9kZXB0aC0tOworCisgICAgICAgICAgICAgICAgLy8gdGFncyBhcmUgYWx3YXlzIG9uIHNlcGFyYXRlIGxpbmVzCisgICAgICAgICAgICAgICAgb3V0LndyaXRlKF9lbmRsKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNwYWNlcygpOworCisgICAgICAgICAgICAgICAgLy8gYmVnaW5uaW5nIHRhZzsgaW5jcmVhc2UgZGVwdGggZm9yIHRhZyBib2R5CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gJy8nKQorICAgICAgICAgICAgICAgICAgICBfZGVwdGgrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIC8gY29tbWVudCwKKyAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBjaGFycworICAgICAgICAgICAgaWYgKGMgIT0gJyEnKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCc8Jyk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJz4nKSB7CisgICAgICAgICAgICAvLyBpZiB1bmFyeSB0YWcgZGVjcmVhc2UgZGVwdGggdG8gdW5kbyB0aGUgaW5jcmVhc2UgYXQgdGFnIHN0YXJ0CisgICAgICAgICAgICBpZiAoX2xhc3RDaGFyID09ICcvJykKKyAgICAgICAgICAgICAgICBfZGVwdGgtLTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBjb21tZW50LXByb2Nlc3NpbmcgY29uZGl0aW9ucworICAgICAgICAgICAgaWYgKF9sYXN0Q2hhcjIgPT0gJzwnICYmIF9sYXN0Q2hhciA9PSAnIScpCisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8ISIpOworICAgICAgICAgICAgZWxzZSBpZiAoX2xhc3RDaGFyMyA9PSAnPCcgJiYgX2xhc3RDaGFyMiA9PSAnIScgJiYgX2xhc3RDaGFyID09ICctJykKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjwhLSIpOworCisgICAgICAgICAgICBvdXQud3JpdGUoJz4nKTsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc8JykgeworICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgIjwhLS0iLCBpbmRlbnQgYW5kIHB1dCBpbiB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgICAgICAvLyB0aGUgY29tbWVudC4gaWYgaXQncyAiPCEtPyIgd2hlcmUgPyBpcyBzb21ldGhpbmcgb3RoZXIKKyAgICAgICAgICAgIC8vIHRoYW4gLSwgZHVtcCB3aGF0IHdlJ3ZlIGdvdHRlbiBzbyBmYXIKKyAgICAgICAgICAgIGlmIChfbGFzdENoYXIzID09ICc8JyAmJiBfbGFzdENoYXIyID09ICchJyAmJiBfbGFzdENoYXIgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShfZW5kbCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU3BhY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPCEtLSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPCEtIik7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCAiPCEtIiwga2VlcCBvbiBub3Qgd3JpdGluZyBkYXRhCisgICAgICAgICAgICBlbHNlIGlmICghKF9sYXN0Q2hhcjIgPT0gJzwnICYmIF9sYXN0Q2hhciA9PSAnIScgJiYgYyA9PSAnLScpKSB7CisgICAgICAgICAgICAgICAgLy8gaWYganVzdCBlbmRlZCBhIHRhZyBhbmQgYWJvdXQgdG8gcHJpbnQgdGV4dCwgcHV0IG9uCisgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgbGluZQorICAgICAgICAgICAgICAgIGlmIChfbGFzdENoYXIgPT0gJz4nICYmIF9sYXN0Q2hhcjIgIT0gJz8nICYmIF9sYXN0Q2hhcjIgIT0gJyEnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKF9lbmRsKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTcGFjZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX2xhc3RDaGFyMyA9IF9sYXN0Q2hhcjI7CisgICAgICAgIF9sYXN0Q2hhcjIgPSBfbGFzdENoYXI7CisgICAgICAgIF9sYXN0Q2hhciA9IGM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3BhY2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZGVwdGg7IGkrKykKKyAgICAgICAgICAgIG91dC53cml0ZSgiICAgICIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjk2NmMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5YTUwgSGFuZGxpbmc8L3N0cm9uZz48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2FudC9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvYW50L2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2FudC9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK25vLWZpbGVzZXRzOiBObyBmaWxlc2V0cyBzcGVjaWZpZWQuCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvbG9jYWxpemVyLnByb3BlcnRpZXMgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0Mjc4ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDExMiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitnZXQtcHJvcC1lcnJzOiBUaGVyZSB3ZXJlIGVycm9ycyBpbml0aWFsaXppbmcgeW91ciBjb25maWd1cmF0aW9uOiB7MH0KK3JlYWQtb25seTogVGhlIGNvbmZpZ3VyYXRpb24gaXMgcmVhZCBvbmx5OyBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuCitvYmotY3JlYXRlOiBBbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgInswfSIgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZC4gIE1ha2UgXAorCXN1cmUgdGhlIGNsYXNzIGhhcyBhIHB1YmxpYyBuby1hcmdzIGNvbnN0cnVjdG9yLgorcHJvcC1wYXJzZTogVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgdGhlIHByb3BlcnRpZXMgc3RyaW5nICJ7MH0iLiAgUGxlYXNlIFwKKwljaGVjayB0aGF0IHRoZSBmb3JtYXQgaXM6ICI8bmFtZTE+PTx2YWx1ZTE+IDxuYW1lMj49PHZhbHVlMj4gLi4uIi4KK25hbWluZy1lcnI6CVRoZXJlIHdhcyBhbiBlcnJvciBkdWluZyBKTkRJIGxvb2t1cCBvZiB0aGUgbmFtZSAiezB9Ii4KK2ludmFsaWQtY29uZmlnLXBhcmFtczogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24gXAorCXBsdWdpbiBvcHRpb24gInswfSIuIFRoZSBwbHVnaW4gd2FzIG9mIHR5cGUgInsxfSIuIFNldHRlciBtZXRob2RzIGZvciB0aGUgXAorCWZvbGxvd2luZyBwbHVnaW4gcHJvcGVydGllcyB3ZXJlIG5vdCBhdmFpbGFibGUgaW4gdGhhdCB0eXBlOiB7Mn0uIFwKKwlQb3NzaWJsZSBwbHVnaW4gcHJvcGVydGllcyBhcmU6IHszfS5cblwKKwlFbnN1cmUgdGhhdCB5b3VyIHBsdWdpbiBjb25maWd1cmF0aW9uIHN0cmluZyB1c2VzIGtleSB2YWx1ZXMgdGhhdCBcCisJY29ycmVzcG9uZCB0byBzZXR0ZXIgbWV0aG9kcyBpbiB0aGUgcGx1Z2luIGNsYXNzLgoraW52YWxpZC1jb25maWctcGFyYW0taGludDogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNldHRpbmcgdXAgdGhlIFwKKwljb25maWd1cmF0aW9uIHBsdWdpbiBvcHRpb24gInswfSIuIFRoZSBwbHVnaW4gd2FzIG9mIHR5cGUgInsxfSIuIFwKKwlUaGUgcGx1Z2luIHByb3BlcnR5ICJ7Mn0iIGhhZCBubyBjb3JyZXNwb25kaW5nIHNldHRlciBtZXRob2Qgb3IgYWNjZXNzaWJsZSBcCisJZmllbGQuIFRoZSBwbHVnaW4gcHJvcGVydHkgY2xvc2VseSBtYXRjaGVzICJ7M30iOyBwZXJoYXBzIHRoZSBwcm9wZXJ0eSBcCisJd2FzIG1pc3NwZWxsZWQuIEVuc3VyZSB0aGF0IHlvdXIgcGx1Z2luIGNvbmZpZ3VyYXRpb24gc3RyaW5nIHVzZXMga2V5IFwKKwl2YWx1ZXMgdGhhdCBjb3JyZXNwb25kIHRvIHNldHRlciBtZXRob2RzIGluIHRoZSBwbHVnaW4gY2xhc3MuIEFsbCBcCisJcG9zc2libGUgcGx1Z2luIHByb3BlcnRpZXMgYXJlOiB7NH0uCitpbnZhbGlkLWVudW1lcmF0ZWQtY29uZmlnOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc2V0dGluZyB1cCB0aGUgXAorCWNvbmZpZ3VyYXRpb24gb3B0aW9uICJ7MH0iLCBhbmQgaXQgd2FzIHNldCB0byAiezF9Ii4gQWxsIFwKKwlwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgc2V0dGluZyBhcmU6IHsyfS4KK2ludmFsaWQtbGlzdC1jb25maWc6IFRoZXJlIHdhcyBhbiBlcnJvciBzZXR0aW5nIHVwIHRoZSBcCisJY29uZmlndXJhdGlvbiBvcHRpb24gInswfSIuIEl0IHdhcyBzZXQgdG8gInsxfSIuIEFsbCBcCisJcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHNldHRpbmcgYXJlOiB7Mn0sIG9yIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgXAorCW9mIHRoZSBzYW1lLgoraW52YWxpZC1wcm9wZXJ0eS1kZXNjcmlwdG9yczogRXJyb3JzIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHByb3BlcnR5IFwKKwlkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiB7MH0uCitpbnZhbGlkLXByb3BlcnR5OiBUaGUgcHJvcGVydHkgbmFtZWQgInswfSIgd2FzIG5vdCByZWNvZ25pemVkIGFuZCB3aWxsIFwKKwliZSBpZ25vcmVkLgoraW52YWxpZC1wcm9wZXJ0eS1oaW50OiBUaGUgcHJvcGVydHkgbmFtZWQgInswfSIgd2FzIG5vdCByZWNvZ25pemVkIGFuZCB3aWxsIFwKKwliZSBpZ25vcmVkLCBhbHRob3VnaCB0aGUgbmFtZSBjbG9zZWx5IG1hdGNoZXMgYSB2YWxpZCBwcm9wZXJ0eSBjYWxsZWQgInsxfSIuCitpbnZhbGlkLXBsdWdpbjogSW5zdGFudGlhdGlvbiBvZiBwbHVnaW4gInswfSIgd2l0aCB2YWx1ZSAiezF9IiBjYXVzZWQgYW4gXAorCWVycm9yICJ7Mn0iLiBUaGUgYWxpYXMgb3IgY2xhc3MgbmFtZSBtYXkgaGF2ZSBiZWVuIG1pc3NwZWxsZWQsIG9yIHRoZSBcCisJY2xhc3MgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGNsYXNzIHBhdGguCitpbnZhbGlkLXBsdWdpbi1hbGlhc2VzOiBJbnN0YW50aWF0aW9uIG9mIHBsdWdpbiAiezB9IiB3aXRoIHZhbHVlICJ7MX0iIGNhdXNlZCBcCisJYW4gZXJyb3IgInsyfSIuIFRoZSBhbGlhcyBvciBjbGFzcyBuYW1lIG1heSBoYXZlIGJlZW4gbWlzc3BlbGxlZCwgb3IgdGhlIFwKKwljbGFzcyBtYXkgbm90IGhhdmUgYmUgYXZhaWxhYmxlIGluIHRoZSBjbGFzcyBwYXRoLiBWYWxpZCBhbGlhc2VzIGZvciB0aGlzIFwKKwlwbHVnaW4gYXJlOiB7M30KK2ludmFsaWQtcGx1Z2luLWFsaWFzZXMtaGludDogSW5zdGFudGlhdGlvbiBvZiBwbHVnaW4gInswfSIgd2l0aCB2YWx1ZSAiezF9IiBcCisJY2F1c2VkIGFuIGVycm9yICJ7Mn0iLiBUaGUgYWxpYXMgb3IgY2xhc3MgbmFtZSBtYXkgaGF2ZSBiZWVuIG1pc3NwZWxsZWQgXAorCShhcyBpdCBjbG9zZWx5IG1hdGNoZXMgdGhlIHZhbGlkIHBsdWdpbiBhbGlhcyAiezR9IiksIG9yIHRoZSBjbGFzcyBtYXkgXAorCW5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGNsYXNzIHBhdGguICBWYWxpZCBhbGlhc2VzIGZvciB0aGlzIHBsdWdpbiBhcmU6IHszfQorbm90LXNpbmdsZXRvbjogWW91IGNhbm5vdCBzZXQgdGhlIHZhbHVlIG9mIHByb3BlcnR5ICJ7MH0iIGFzIGFuIG9iamVjdC4gIFRoZSBcCisJcHJvcGVydHkgY2Fubm90IHVzZSBhIHNpbmdsZSB2YWx1ZTsgaXQgbXVzdCBiZSByZWNyZWF0ZWQgb24gZWFjaCByZXF1ZXN0LgorY2FudC1zZXQtc3RyaW5nOiBDb25maWd1cmF0aW9uIHByb3BlcnR5ICJ7MH0iIGNhbm5vdCBiZSBzZXQgZnJvbSBhIHN0cmluZy4gXAorCVlvdSBtdXN0IHN1cHBseSB0aGUgb2JqZWN0IHZhbHVlLgorbG9hZGVkLXZpYS1wcm92aWRlcjogQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBsb2FkZWQgdmlhICJ7MH0iLgorbm8tZGVmYXVsdC1wcm92aWRlcnM6IERlZmF1bHQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBjb3VsZG4nJ3QgYmUgbG9hZGVkIFwKKwlmcm9tIGFueSBjb25maWd1cmF0aW9uIHByb3ZpZGVyLgorbm8tcHJvdmlkZXI6IE5vIHJlZ2lzdGVyZWQgY29uZmlndXJhdGlvbiBwcm92aWRlciBjb3VsZCBsb2FkICJ7MH0iLgorbm8tcHJvdmlkZXJzOiBZb3VyIHN5c3RlbSBpcyBtaXNzaW5nIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXJzLiBcCisgICAgQ29uZmlndXJhdGlvbiBwcm92aWRlcnMgbG9hZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBzdXBwb3J0ZWQgXAorICAgIHNwZWNpZmljYXRpb25zLiAgWW91IG11c3QgaGF2ZSBhIE1FVEEtSU5GL3NlcnZpY2VzL3swfSBmaWxlIGluIHlvdXIgXAorICAgIGNsYXNzcGF0aCBsaXN0aW5nIHRoZSBhdmFpbGFibGUgcHJvdmlkZXIgY2xhc3NlcywgYW5kIHNvbWUgbGlzdGVkIGNsYXNzIFwKKyAgICBtdXN0IGJlIGluc3RhbnRpYWJsZS4gIFR5cGljYWxseSB0aGlzIGZpbGUgaXMgYnVuZGxlZCBhcyBwYXJ0IG9mIHRoZSBcCisgICAgZGlzdHJpYnV0aW9uLiAgSGF2ZSB5b3UgdW5idW5kbGVkIGl0LCBvciB1bmJ1bmRsZWQgaXRzIGxpc3RlZCBjbGFzc2VzPworZHVwLXdpdGgtZGlmZmVyZW50LXByZWZpeGVzOiBGb3VuZCBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdpdGggZGlmZmVyZW50IHZhbGlkIFwKKwlwcmVmaXhlcy4gUHJvcGVydGllczogezB9LCB7MX0uCitwbHVnaW4tY3JlYXRpb24tZXhjZXB0aW9uOiBBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgYSBwbHVnaW4gZm9yIFwKKyAgICB2YWx1ZSB7MH0uIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgY29uc3VtZWQuCithbmNob3Itb25seTogWW91IGNhbm5vdCBzdXBwbHkgYSBjb25maWd1cmF0aW9uIHVuaXQgbmFtZSBvbmx5LiAgWW91IG11c3QgYWxzbyBcCisgICAgc3VwcGx5IHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBpbiB3aGljaCB0aGUgdW5pdCBhcHBlYXJzLgorbm8tcHJvZHVjdC1kZXJpdmF0aW9uczogWW91ciBzeXN0ZW0gaXMgbWlzc2luZyBwcm9kdWN0IGRlcml2YXRpb25zLiAgUHJvZHVjdCBcCisgICAgZGVyaXZhdGlvbnMgcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHN1cHBvcnRlZCBkYXRhIHN0b3JlcyBhbmQgXAorICAgIHNwZWNpZmljYXRpb25zLiAgWW91IG11c3QgaGF2ZSBhIE1FVEEtSU5GL3NlcnZpY2VzL3swfSBmaWxlIGluIHlvdXIgXAorICAgIGNsYXNzcGF0aCBsaXN0aW5nIHRoZSBhdmFpbGFibGUgZGVyaXZhdGlvbiBjbGFzc2VzLCBhbmQgc29tZSBsaXN0ZWQgY2xhc3MgXAorICAgIG11c3QgYmUgaW5zdGFudGlhYmxlLiAgVHlwaWNhbGx5IHRoaXMgZmlsZSBpcyBidW5kbGVkIGFzIHBhcnQgb2YgdGhlIFwKKyAgICBkaXN0cmlidXRpb24uICBIYXZlIHlvdSB1bmJ1bmRsZWQgaXQsIG9yIHVuYnVuZGxlZCBpdHMgbGlzdGVkIGNsYXNzZXM/IFwKKyAgICBJZiB5b3UgYXJlIHVzaW5nIGFudCwgYSBjb21tb24gc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzIHRvIHBsYWNlIFwKKyAgICB0aGUgamFyIGxpYnJhcmllcyBvZiB0aGUgT3BlbkpQQSBkaXN0cmlidXRpb24gaW4gdGhlIFwKKyAgICAkJ3t1c2VyLmhvbWV9Ly5hbnQvbGliIGRpcmVjdG9yeS4gQW5vdGhlciBjb21tb24gY2F1c2Ugb2YgdGhpcyBwcm9ibGVtIFwKKyAgICBpcyBhbiBvdmVybHktcmVzdHJpY3RpdmUgc2VjdXJpdHkgbWFuYWdlci5cbnsxfQorYmFkLXByb2R1Y3QtZGVyaXZhdGlvbnM6IFNvbWUgcHJvZHVjdCBkZXJpdmF0aW9ucyBhcmUgYmVpbmcgc2tpcHBlZC4gRm9yIFwKKyAgICBpbmZvcm1hdGlvbiBhYm91dCBwcm9kdWN0IGRlcml2YXRpb24gc3RhdHVzLCBydW46XG5qYXZhIHswfQorYmVmb3JlLWNsb3NlLWV4OiBBbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIFByb2R1Y3REZXJpdmF0aW9ucy5iZWZvcmVDbG9zZSgpLlwKKwlUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlIGlnbm9yZWQsIGFuZCBpcyBsb2dnZWQgYWxvbmcgd2l0aCB0aGlzIG1lc3NhZ2UuCisKK0xvZy1uYW1lOiBMb2cgZmFjdG9yeQorTG9nLWRlc2M6IExvZ0ZhY3RvcnkgYW5kIGNvbmZpZ3VyYXRpb24gZm9yIE9wZW5KUEEnJ3MgbG9nZ2luZyBuZWVkcy4KK0xvZy10eXBlOiBHZW5lcmFsCitMb2ctY2F0OiBMb2dnaW5nCitMb2ctZGlzcGxheW9yZGVyOiA1MAorTG9nLWV4cGVydDogZmFsc2UKK0xvZy1pbnRlcmZhY2U6IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZ0ZhY3RvcnkKKworSWQtbmFtZTogQ29uZmlndXJhdGlvbiBJRAorSWQtZGVzYzogQW4gZW52aXJvbm1lbnQtc3BlY2lmaWMgaWRlbnRpZmllciBmb3IgdGhpcyBjb25maWd1cmF0aW9uLiBUaGlzIFwKKwltaWdodCBjb3JyZXNwb25kIHRvIGEgSlBBIHBlcnNpc3RlbmNlLXVuaXQgbmFtZSwgb3IgdG8gc29tZSBvdGhlciBcCisgICAgbW9yZS11bmlxdWUgdmFsdWUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiAKK0lkLXR5cGU6IEdlbmVyYWwKK0lkLWNhdDogR2VuZXJhbAorSWQtZGlzcGxheW9yZGVyOiA1MAorSWQtZXhwZXJ0OiB0cnVlCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvbG9jYWxpemVyLnByb3BlcnRpZXMgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2pkYmMvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3YjFjZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDEwNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitub3QtamRiYzM6IEF0dGVtcHRlZCB0byBjYWxsIEpEQkMgMyBtZXRob2Qgb24gYSBub24tSkRCQyAzIEpWTS4KK2ludm9rZS1qZGJjMzogQW4gZXJyb3Igb2NjdXJyZWQgYXR0ZW1wdGluZyB0byBpbnZva2UgSkRCQyAzIG1ldGhvZC4gIFlvdXIgXAorCWRyaXZlciBvciBkYXRhYmFzZSBtYXkgbm90IHN1cHBvcnQgSkRCQyAzIGZlYXR1cmVzLgorZXJyb3ItamRiYzM6IEVycm9yIGxvYWRpbmcgSkRCQyAzIG1ldGhvZC4KK3dhaXQtb24tY29ubjogV2FpdGVkIHswfSBtaWxsaXNlY29uZHMgZm9yIGNvbm5lY3Rpb24gezF9LiAgVGhpcyBtaWdodCBpbmRpY2F0ZSBcCisJdGhhdCB5b3UgbmVlZCB0byBpbmNyZWFzZSB5b3VyIGNvbm5lY3Rpb24gcG9vbCBzaXplLgorcHMtb3ZlcmZsb3c6IFRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGUgaGFzIG92ZXJmbG93ZWQuICJ7MH0iIHdhcyByZW1vdmVkLiBcCisJWW91IG1heSB3YW50IHRvIGluY3JlYXNlIHlvdXIgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hlIHNpemUuICBUaGUgbWF4aW11bSBcCisJbnVtYmVyIG9mIGNhY2hlZCBzdGF0ZW1lbnRzIGlzIGN1cnJlbnRseSBzZXQgdG8gezF9LgordHJhY2tlci1leGVjdXRlc3RtbnQ6IFN0YXRlbWVudCBleGVjdXRpb24KK3RyYWNrZXItZXhlY3V0ZXByZXBzdG1udDogUHJlcGFyZWRTdGF0ZW1lbnQgZXhlY3V0aW9uCit0cmFja2VyLWNvbW1pdDogQ29tbWl0IGV4ZWN1dGlvbgordHJhY2tlci1yb2xsYmFjazogUm9sbGJhY2sgZXhlY3V0aW9uCit0cmFja2VyLWNvbm5lY3Rpb246IENvbm5lY3Rpb24gb3BlbmluZwordHJhY2tlci1yZXN1bHRTZXQ6IFJlc3VsdFNldCBjbG9zaW5nCit0cmFja2VyLW1pbjogbWluCit0cmFja2VyLXRvdGFsOiB0b3RhbAordHJhY2tlci1tYXg6IG1heAordHJhY2tlci1hdmVyYWdlOiBhdmVyYWdlCit0cmFja2VyLW1zOiBtcwordHJhY2tlci1vY2N1cmFuY2VzOiBvY2N1cmFuY2VzCit0cmFja2VyLXNsb3dlc3Qtc3RhdGVtZW50czogc2xvd2VzdCBzdGF0ZW1lbnRzCityc3JjLWNsb3NlZDogVGhlIGNvbm5lY3Rpb24gInswfSIgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuICBUaGUgZW1iZWRkZWQgXAorCXN0YWNrIHRyYWNlIGZvciB0aGlzIGV4Y2VwdGlvbiBkZXRhaWxzIHRoZSBjbG9zdXJlIHBvaW50Lgorbm90LWFjdGl2ZTogQXR0ZW1wdCB0byBvcGVyYXRlIG9uIGNvbm5lY3Rpb24gInswfSIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIFwKKwlyZXR1cm5lZCB0byB0aGUgY29ubmVjdGlvbiBwb29sLgorcG9vbGRzLW51bGw6IEEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgb2J0YWluZWQgZm9yIGRyaXZlciBjbGFzcyAiezB9IiBcCisJYW5kIFVSTCAiezF9Ii4gIFlvdSBtYXkgaGF2ZSBzcGVjaWZpZWQgYW4gaW52YWxpZCBVUkwuCitnZXQtY29ubi1leGNlcHRpb246CUFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9mIHR5cGUgInswfSIgb2NjdXJyZWQgd2hpbGUgXAorCWdldHRpbmcgYSBjb25uZWN0aW9uLiBUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHJlLXRocm93biBhcyBhIFNRTEV4Y2VwdGlvbi4KK2Nvbm4tcG9vbC1leGhhdXN0ZWQ6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyAoezB9KSBmb3IgdGhlIFwKKwljb25uZWN0aW9uIHBvb2wgaGF2ZSBiZWVuIGV4aGF1c3RlZC4KK3BzY2FjaGUuc3RhdC5yZXF1ZXN0cy5uYW1lOiBSZXF1ZXN0cworcHNjYWNoZS5zdGF0LnJlcXVlc3RzLmRlc2M6IENhY2hlIHJlcXVlc3RzCitwc2NhY2hlLnN0YXQucmVxdWVzdHMub3JkOiBDb3VudAorcHNjYWNoZS5zdGF0LmxlYWtlZC5uYW1lOiBMZWFrZWQKK3BzY2FjaGUuc3RhdC5sZWFrZWQuZGVzYzogTGVha2VkIHN0YXRlbWVudHMKK3BzY2FjaGUuc3RhdC5sZWFrZWQub3JkOiBTdGF0ZW1lbnRzCitwc2NhY2hlLnN0YXQuaGl0cy5uYW1lOiBIaXRzCitwc2NhY2hlLnN0YXQuaGl0cy5kZXNjOiBDYWNoZSBoaXRzCitwc2NhY2hlLnN0YXQuaGl0cy5vcmQ6IENvdW50Citwc2NhY2hlLnN0YXQuY3JlYXRlZC5uYW1lOiBDcmVhdGVkCitwc2NhY2hlLnN0YXQuY3JlYXRlZC5kZXNjOiBDcmVhdGVkIHN0YXRlbWVudHMKK3BzY2FjaGUuc3RhdC5jcmVhdGVkLm9yZDogU3RhdGVtZW50cworcHNjYWNoZS5zdGF0LnJlZHVuZGFudC5uYW1lOiBSZWR1bmRhbnQKK3BzY2FjaGUuc3RhdC5yZWR1bmRhbnQuZGVzYzogUmVkdW5kYW50IHN0YXRlbWVudHMKK3BzY2FjaGUuc3RhdC5yZWR1bmRhbnQub3JkOiBTdGF0ZW1lbnRzCitwc2NhY2hlLnN0YXQub3ZlcmZsb3cubmFtZTogT3ZlcmZsb3cKK3BzY2FjaGUuc3RhdC5vdmVyZmxvdy5kZXNjOiBDYWNoZSBvdmVyZmxvd3MKK3BzY2FjaGUuc3RhdC5vdmVyZmxvdy5vcmQ6IENvdW50Citwc2NhY2hlLnN0YXQuc2l6ZS5uYW1lOiBTaXplCitwc2NhY2hlLnN0YXQuc2l6ZS5kZXNjOiBDYWNoZWQgc3RhdGVtZW50cworcHNjYWNoZS5zdGF0LnNpemUub3JkOiBTaXplCit2YWxpZGF0aW9uc3FsLWRlc2M6ICBTUUwgdXNlZCB0byB2YWxpZGF0ZSBjb25uZWN0aW9ucwordmFsaWRhdGlvbi10aW1lb3V0LWRlc2M6ICBUaGUgbWluaW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgbXVzdCBlbGFwc2UgXAorCWJlZm9yZSBhIGNvbm5lY3Rpb24gd2lsbCBldmVyIGJlIHJlLXZhbGlkYXRlZC4KK3JvbGxiYWNrLW9uLXJldHVybi1kZXNjOiAgRm9yY2UgYWxsIGNvbm5lY3Rpb25zIHRvIGJlIHJvbGxlZCBiYWNrIHdoZW4gdGhleSBcCisJYXJlIHJldHVybmVkIHRvIHRoZSBwb29sLgorbWF4LWFjdGl2ZS1kZXNjOiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHVzZSBhdCBvbmUgdGltZS4KK21heC1pZGxlLWRlc2M6ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgaWRsZSBkYXRhYmFzZSBjb25uZWN0aW9ucyB0byBrZWVwIGluIHRoZSBcCisJcG9vbC4KK21heC13YWl0LWRlc2M6ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGEgZnJlZSBkYXRhYmFzZSBcCisJY29ubmVjdGlvbiB0byBiZWNvbWUgYXZhaWxhYmxlIGJlZm9yZSBnaXZpbmcgdXAuCit0ZXN0LW9uLWJvcnJvdy1kZXNjOiAgV2hldGhlciB0byB2YWxpZGF0ZSBkYXRhYmFzZSBjb25uZWN0aW9ucyBiZWZvcmUgXAorCW9idGFpbmluZyB0aGVtIGZyb20gdGhlIHBvb2wuCit0ZXN0LW9uLXJldHVybi1kZXNjOiAgV2hldGhlciB0byB2YWxpZGF0ZSBkYXRhYmFzZSBjb25uZWN0aW9ucyBiZWZvcmUgXAorCXJldHVybmluZyB0aGVtIHRvIHRoZSBwb29sLgordGltZS1iZXR3ZWVuLWV2aWN0aW9uLXJ1bnMtbWlsbGlzLWRlc2M6ICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIFwKKwlydW5zIG9mIHRoZSBldmljdGlvbiB0aHJlYWQuICAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUgdGhyZWFkIHdpbGwgbmV2ZXIgcnVuLgorbnVtLXRlc3RzLXBlci1ldmljdGlvbi1ydW4tZGVzYzogIE51bWJlciBvZiBjb25uZWN0aW9ucyB0ZXN0ZWQgcGVyIGV2aWN0aW9uIHJ1bi4KK21pbi1ldmljdGFibGUtaWRsZS10aW1lLW1pbGxpcy1kZXNjOiAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IFwKKwlhIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2FuIHNpdCBpZGxlIGJlZm9yZSBpdCBiZWNvbWVzIGEgY2FuZGlkYXRlIGZvciBcCisJZXZpY3Rpb24gZnJvbSB0aGUgcG9vbC4KK3Rlc3Qtd2hpbGUtaWRsZS1kZXNjOiAgV2hldGhlciB0byBwZXJpb2RpY2FsbHkgdmFsaWRhdGUgaWRsZSBkYXRhYmFzZSBcCisJY29ubmVjdGlvbnMuCitudW0tYWN0aXZlLWRlc2M6ICBOdW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGluIHBvb2wuCitudW0taWRsZS1kZXNjOiAgTnVtYmVyIG9mIGlkbGUgY29ubmVjdGlvbnMgaW4gcG9vbC4KK2Nvbm5lY3Rpb24tdXNlci1uYW1lLWRlc2M6ICBUaGUgSkRCQyB1c2VyIG5hbWUgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlLgorY29ubmVjdGlvbi11cmwtZGVzYzogIFRoZSBKREJDIFVSTCBmb3IgdGhlIGRhdGFiYXNlLgorY29ubmVjdGlvbi1wcm9wZXJ0aWVzLWRlc2M6ICBQcm9wZXJ0aWVzIGFwcGxpZWQgdG8gdGhlIEpEQkMgZHJpdmVyIG9yIFwKKwlkYXRhc291cmNlLgorY29ubmVjdGlvbi1kcml2ZXItbmFtZS1kZXNjOiAgVGhlIEpEQkMgZHJpdmVyLgorbG9naW4tdGltZW91dC1kZXNjOiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBibG9jayBmb3IgZGF0YWJhc2UgXAorCWxvZ2luLgorY2xvc2UtcG9vbDogU2h1dHRpbmcgZG93biBjb25uZWN0aW9uIHBvb2wuCitjbG9zZS1wb29sLWZhaWw6IEVycm9yIGNhdWdodCB3aGVuIGlzc3VpbmcgY2xvc2UgcG9vbCBTUUw6IHswfQorZGF0YXNvdXJjZS10cmFjZS1kYXRhOiB7MH0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4YWEyOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbG9nL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzEgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworbG9nLXRyYWNlOiBUUkFDRQorbG9nLWluZm86IElORk8KK2xvZy13YXJuOiBXQVJOCitsb2ctZXJyb3I6IEVSUk9SCitsb2ctZmF0YWw6IEZBVEFMCitsb2ctdW5rbm93bjogVU5LTk9XTgorbG9nLWJhZC1jb25zdGFudDogVGhlIGxvZyBsZXZlbCBzdHJpbmcgInswfSIgaXMgbm90IHZhbGlkLiBWYWxpZCB2YWx1ZXMgYXJlIFwKKwlUUkFDRSwgSU5GTywgV0FSTiwgRVJST1Igb3IgRkFUQUwuCitsb2ctYmFkLWZpbGU6IFRoZSBmaWxlIG5hbWUgInswfSIgaXMgbm90IHZhbGlkLgorY291bGQtbm90LWNyZWF0ZS1mYWN0b3J5OiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGEgXAorCUxvZ0ZhY3Rvcnkgb2YgdHlwZSAiezB9IiwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBcCisJb3BlbmpwYS5Mb2cgc3lzdGVtIHByb3BlcnR5LiBDcmVhdGVkIGEgXAorCW9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZ0ZhY3RvcnlJbXBsIGluc3RlYWQuCitsb2ctb3V0cHV0LXN0cmVhbS1kYXRhOiB7MH0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvbWV0YS9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNlODJjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9tZXRhL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworbG9jLXByZWZpeDogTG9jYXRpb246IAorc3RhcnQtcGFyc2U6IFBhcnNpbmcgcmVzb3VyY2UgInswfSIuCitlbmQtcGFyc2U6IEZpbmlzaGVkIHBhcnNpbmcgbWV0YWRhdGEgcmVzb3VyY2UgInswfSIuCithbHJlYWR5LXBhcnNlZDogU2tpcHBpbmcgcmVzb3VyY2UgInswfSI7IGl0IHdhcyBwYXJzZWQgcHJldmlvdXNseS4KK2NsZWFyLXBhcnNlcjogQ2xlYXJpbmcgY2FjaGUgb2YgcGFyc2VkIGZpbGVzIGluICJ7MH0iLgorYWRkLXJlc3VsdDogQWRkaW5nIHBhcnNlIHJlc3VsdDogInswfSIKK2NhbnQtZGlmZi1lbGVtczogVW5hYmxlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBnaXZlbiBwYWNrYWdlIGFuZCBjbGFzcyBcCisJZWxlbWVudHMgZm9yIGNsYXNzIGFyZyBwYXJzaW5nLiAgTm8gZWxlbWVudCBjYW4gYmUgYSBjb21wbGV0ZSBwcmVmaXggb2YgXAorCWFub3RoZXIuCitjbGFzcy1hcmc6IEVycm9yIGV4dHJhY3RpbmcgY2xhc3MgaW5mb3JtYXRpb24gZnJvbSAiezB9Ii4KK3BhcnNlLWVycm9yOiBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyBlbGVtZW50ICJ7MH0iLiAgTWFrZSBzdXJlIFwKKwl0aGUgbWV0YWRhdGEgZmlsZSBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkLgorbm8tZmlsZTogTm8gc291cmNlIGZpbGUgZm91bmQgZm9yICJ7MH0iLgorc2VyLWZpbGU6IFdyaXRpbmcgdG8gZmlsZSAiezB9Ii4KK3Nlci1vYmpzOiBTZXJpYWxpemluZyBjb250ZW50czogezB9CitwYXJzZS1jbGFzczogUGFyc2luZyBjbGFzcyAiezB9Ii4KK3Nlci1jbGFzczogV3JpdGluZyBvYmplY3QgInswfSIuCitpbnZhbGlkLWNsYXNzOiBUeXBlICJ7MH0iIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQuCit0b28tbWFueS1maWxlczogVG9vIG1hbnkgZmlsZXMgdG8gc2NhbiBmb3IgbWV0YWRhdGEuICBSZWFjaGVkIGxpbWl0IG9mIHswfSBcCisJZmlsZXMuCitzb3VyY2UtdHJhY2tlcnMtbG9jYXRpb24taGVhZGVyOiBTb3VyY2UgZmlsZSBsb2NhdGlvbnM6Citzb3VyY2UtdHJhY2tlcnMtbG9jYXRpb24tbGluZS1pdGVtOiB7MH06IHsxfQorc291cmNlLXRyYWNrZXItZmlsZS11bmtub3duOiA8ZmlsZSBsb2NhdGlvbiB1bmtub3duPgorcGFyc2VyLXNjaGVtYS1idWc6IFhNTCBzY2hlbWEgdmFsaWRhdGlvbiBpcyBkaXNhYmxlZCBkdWUgdG8gYnVncyBkZXRlY3RlZCBcCisJaW4gdGhlIFNBWCBwYXJzZXIuCitzYXgtZXhjZXB0aW9uOiBBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB7MH0gYXQgbG9jYXRpb24gezF9LiBcCisgICAgVGhpcyBleGNlcHRpb24gaGFzIGJlZW4gdHJhbnNsYXRlZCB0byBhIFNBWEV4Y2VwdGlvbiwgYW5kIHdpbGwgYmUgXAorICAgIHJlLXRocm93bi4gVGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpcyBiZWluZyBsb2dnZWQgYWxvbmcgd2l0aCB0aGlzIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDA0ODUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDIxIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK2Nsb3NlZDogVGhlIHJlc3VsdCBsaXN0IGhhcyBiZWVuIGNsb3NlZC4KK3JlYWQtb25seTogUmVzdWx0IGxpc3RzIGFyZSByZWFkLW9ubHkuCityYW5nZS10b28taGlnaDogVGhlIFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIgY2FuIG9ubHkgYmUgdXNlZCBmb3IgcmFuZ2VzIHRoYXQgXAorCWFyZSBiZWxvdyBJbnRlZ2VyLk1BWF9WQUxVRS4gU3RhcnQgaW5kZXg6ICJ7MH0iLCBlbmQgaW5kZXg6ICJ7MX0iLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOGE4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitkdXAta2V5OiBEdXBsaWNhdGUga2V5cyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwcm9wZXJ0aWVzIGZpbGUuIEtleTogezB9LCBcCisJZmlyc3QgdmFsdWU6IHsxfSwgc2Vjb25kIHZhbHVlOiB7Mn0uCitjb25jdXJyZW50LWluaXRpYWw6IElsbGVnYWwgaW5pdGlhbCB2YWx1ZSBvZiB7MH0gc3BlY2lmaWVkLgorY29uY3VycmVudC1sb2FkOiBJbGxlZ2FsIGxvYWQgdmFsdWUgb2YgezB9IHNwZWNpZmllZC4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL2xvY2FsaXplci5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvbG9jYWxpemVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNDRiMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworbm8tbG9jYXRvcjogVW5rbm93bgorbG9jYXRpb24tZm9ybWF0OiBMaW5lOiB7MH0sIEM6IHsxfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9UZXN0Q29uZmlndXJhdGlvblByb3ZpZGVyUHJlZml4ZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVGVzdENvbmZpZ3VyYXRpb25Qcm92aWRlclByZWZpeGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzOTFkOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVGVzdENvbmZpZ3VyYXRpb25Qcm92aWRlclByZWZpeGVzLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworcHVibGljIGNsYXNzIFRlc3RDb25maWd1cmF0aW9uUHJvdmlkZXJQcmVmaXhlcworICAgIGV4dGVuZHMgVGVzdENhc2UgeworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJFRklYID0gCisgICAgICAgIFRlc3RDb25maWd1cmF0aW9uUHJvdmlkZXJQcmVmaXhlcy5jbGFzcy5nZXROYW1lKCk7CisKKyAgICBwcml2YXRlIFN0cmluZ1tdIF9vcmlnUHJlZml4ZXM7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgX29yaWdQcmVmaXhlcyA9IFByb2R1Y3REZXJpdmF0aW9ucy5nZXRDb25maWd1cmF0aW9uUHJlZml4ZXMoKTsKKyAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KF9vcmlnUHJlZml4ZXMpKTsKKyAgICAgICAgbC5hZGQoQ1VTVE9NX1BSRUZJWCk7CisgICAgICAgIFByb2R1Y3REZXJpdmF0aW9ucy5zZXRDb25maWd1cmF0aW9uUHJlZml4ZXMoCisgICAgICAgICAgICAoU3RyaW5nW10pIGwudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMuc2V0Q29uZmlndXJhdGlvblByZWZpeGVzKF9vcmlnUHJlZml4ZXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4Q29udGVudHMoKSB7IAorICAgICAgICBTdHJpbmdbXSBwcmVmaXhlcyA9IFByb2R1Y3REZXJpdmF0aW9ucy5nZXRDb25maWd1cmF0aW9uUHJlZml4ZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENVU1RPTV9QUkVGSVgsIHByZWZpeGVzW3ByZWZpeGVzLmxlbmd0aCAtIDFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcGVuanBhIiwgcHJlZml4ZXNbMF0pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbEtleUFuZE51bGxNYXAoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygib3BlbmpwYS5Gb28iLCAiRm9vIiwgKE1hcCkgbnVsbCwgbnVsbCk7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbEtleVdpdGhJbnZhbGlkUHJlZml4KCkgeworICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgbWFwLnB1dCgiYmFyLkZvbyIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9wZW5qcGEuRm9vIiwgIkZvbyIsIG1hcCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxLZXlXaXRob3V0TWF0Y2goKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KCJiYXIuQmF6IiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygib3BlbmpwYS5Gb28iLCAiRm9vIiwgbWFwLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbEtleVdpdGhPcGVuSlBBTWF0Y2goKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KCJvcGVuanBhLkZvbyIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9wZW5qcGEuRm9vIiwgIkZvbyIsIG1hcCwgInZhbHVlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxLZXlXaXRoQ3VzdG9tTWF0Y2goKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KENVU1RPTV9QUkVGSVggKyAiLkZvbyIsICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ1VTVE9NX1BSRUZJWCArICIuRm9vIiwgIkZvbyIsIG1hcCwgInZhbHVlIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsS2V5RHVwbGljYXRlRnVsbEtleXMoKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KENVU1RPTV9QUkVGSVggKyAiLkZvbyIsICJ2YWx1ZSIpOworICAgICAgICBtYXAucHV0KCJvcGVuanBhLkZvbyIsICJ2YWx1ZSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJvZHVjdERlcml2YXRpb25zLmdldENvbmZpZ3VyYXRpb25LZXkoIkZvbyIsIG1hcCk7CisgICAgICAgICAgICBmYWlsKCJkdXBsaWNhdGUga2V5cyBzaG91bGQgcmVzdWx0IGluIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBmdWxsS2V5LCBTdHJpbmcgcGFydGlhbEtleSwgCisgICAgICAgIE1hcCBtYXAsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZnVsbEtleSwgUHJvZHVjdERlcml2YXRpb25zLmdldENvbmZpZ3VyYXRpb25LZXkoCisgICAgICAgICAgICBwYXJ0aWFsS2V5LCBtYXApKTsKKyAgICAgICAgaWYgKG1hcCAhPSBudWxsKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBtYXAuZ2V0KGZ1bGxLZXkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1Rlc3RDb25maWd1cmF0aW9ucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9UZXN0Q29uZmlndXJhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzUzMjkzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9UZXN0Q29uZmlndXJhdGlvbnMuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi50ZXN0LkFic3RyYWN0VGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBDb25maWd1cmF0aW9uc30gY2xhc3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RDb25maWd1cmF0aW9ucyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgeworCisgICAgcHVibGljIFRlc3RDb25maWd1cmF0aW9ucyhTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQbHVnaW4oKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSBudWxsOworICAgICAgICBhc3NlcnROdWxsKENvbmZpZ3VyYXRpb25zLmdldENsYXNzTmFtZShzdHIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChDb25maWd1cmF0aW9ucy5nZXRQcm9wZXJ0aWVzKHN0cikpOworICAgICAgICBzdHIgPSAiZm9vIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUoc3RyKSk7CisgICAgICAgIGFzc2VydE51bGwoQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhzdHIpKTsKKyAgICAgICAgc3RyID0gImE9YiI7CisgICAgICAgIGFzc2VydE51bGwoQ29uZmlndXJhdGlvbnMuZ2V0Q2xhc3NOYW1lKHN0cikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9YiIsIENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoc3RyKSk7CisgICAgICAgIHN0ciA9ICJhPWIsIGM9ZCI7CisgICAgICAgIGFzc2VydE51bGwoQ29uZmlndXJhdGlvbnMuZ2V0Q2xhc3NOYW1lKHN0cikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9YiwgYz1kIiwgQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhzdHIpKTsKKyAgICAgICAgc3RyID0gImZvbyhhPWIsIGM9ZCkiOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIENvbmZpZ3VyYXRpb25zLmdldENsYXNzTmFtZShzdHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPWIsIGM9ZCIsIENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoc3RyKSk7CisgICAgICAgIHN0ciA9ICIgZm9vKCBhPVwiYixjIGRcIiwgYz1cImRcIiApICI7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgQ29uZmlndXJhdGlvbnMuZ2V0Q2xhc3NOYW1lKHN0cikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9XCJiLGMgZFwiLCBjPVwiZFwiIiwgQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhzdHIpKTsKKyAgICAgICAgc3RyID0gIiBmb28oIGE9J2IsYyBkJywgYz0nZCcgKSAiOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIENvbmZpZ3VyYXRpb25zLmdldENsYXNzTmFtZShzdHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPSdiLGMgZCcsIGM9J2QnIiwgQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhzdHIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQcm9wZXJ0aWVzKCkgeworICAgICAgICBPcHRpb25zIG9wdHMgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXMobnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBvcHRzLnNpemUoKSk7CisKKyAgICAgICAgb3B0cyA9IENvbmZpZ3VyYXRpb25zLnBhcnNlUHJvcGVydGllcygiIGZvbz1iYXIsIGJpej1iYXogIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBvcHRzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgb3B0cy5nZXRQcm9wZXJ0eSgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJheiIsIG9wdHMuZ2V0UHJvcGVydHkoImJpeiIpKTsKKworICAgICAgICBvcHRzID0gQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzKCJmb289YmFyLGJpej1cImJheiw9LGJhelwiLHg9eSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgb3B0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIG9wdHMuZ2V0UHJvcGVydHkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXosPSxiYXoiLCBvcHRzLmdldFByb3BlcnR5KCJiaXoiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieSIsIG9wdHMuZ2V0UHJvcGVydHkoIngiKSk7CisKKyAgICAgICAgb3B0cyA9IENvbmZpZ3VyYXRpb25zLnBhcnNlUHJvcGVydGllcworICAgICAgICAgICAgKCJmb289XCJiYXIgYmFyLDEwXCIsYml6PVwiYmF6IGJhelwiIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBvcHRzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIGJhciwxMCIsIG9wdHMuZ2V0UHJvcGVydHkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXogYmF6Iiwgb3B0cy5nZXRQcm9wZXJ0eSgiYml6IikpOworICAgICAgICBvcHRzID0gQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzCisgICAgICAgICAgICAoImZvbz0nYmFyIGJhciwxMCcsYml6PSdiYXogYmF6JyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb3B0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciBiYXIsMTAiLCBvcHRzLmdldFByb3BlcnR5KCJmb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmF6IGJheiIsIG9wdHMuZ2V0UHJvcGVydHkoImJpeiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZVBsdWdpbnMoKSB7CisgICAgICAgIGFzc2VydFBsdWdpbnNDb21iaW5lZCgianBhIiwgbnVsbCwgCisgICAgICAgICAgICBudWxsLCBudWxsLAorICAgICAgICAgICAgImpwYSIsIG51bGwpOworICAgICAgICBhc3NlcnRQbHVnaW5zQ29tYmluZWQoImpwYSIsIG51bGwsCisgICAgICAgICAgICAianBhIiwgbnVsbCwKKyAgICAgICAgICAgICJqcGEiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0UGx1Z2luc0NvbWJpbmVkKCJqZG8iLCBudWxsLAorICAgICAgICAgICAgImpwYSIsIG51bGwsCisgICAgICAgICAgICAianBhIiwgbnVsbCk7CisgICAgICAgIGFzc2VydFBsdWdpbnNDb21iaW5lZCgiamRvIiwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXIiIH0sCisgICAgICAgICAgICAianBhIiwgbnVsbCwKKyAgICAgICAgICAgICJqcGEiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0UGx1Z2luc0NvbWJpbmVkKCJqZG8iLCBuZXcgU3RyaW5nW10geyAiZm9vIiwgImJhciIgfSwKKyAgICAgICAgICAgICJqcGEiLCBuZXcgU3RyaW5nW10geyAiYml6IiwgImJheiIgfSwKKyAgICAgICAgICAgICJqcGEiLCBuZXcgU3RyaW5nW10geyAiYml6IiwgImJheiIgfSk7IAorICAgICAgICBhc3NlcnRQbHVnaW5zQ29tYmluZWQoImpkbyIsIG5ldyBTdHJpbmdbXSB7ICJmb28iLCAiYmFyIiB9LAorICAgICAgICAgICAgbnVsbCwgbmV3IFN0cmluZ1tdIHsgImJpeiIsICJiYXoiIH0sCisgICAgICAgICAgICAiamRvIiwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXIiLCAiYml6IiwgImJheiIgfSk7IAorICAgICAgICBhc3NlcnRQbHVnaW5zQ29tYmluZWQobnVsbCwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXIiIH0sCisgICAgICAgICAgICBudWxsLCBuZXcgU3RyaW5nW10geyAiYml6IiwgImJheiIgfSwKKyAgICAgICAgICAgIG51bGwsIG5ldyBTdHJpbmdbXSB7ICJmb28iLCAiYmFyIiwgImJpeiIsICJiYXoiIH0pOyAKKyAgICAgICAgYXNzZXJ0UGx1Z2luc0NvbWJpbmVkKG51bGwsIG5ldyBTdHJpbmdbXSB7ICJmb28iLCAiYmFyIiB9LAorICAgICAgICAgICAgImpwYSIsIG5ldyBTdHJpbmdbXSB7ICJiaXoiLCAiYmF6IiB9LAorICAgICAgICAgICAgImpwYSIsIG5ldyBTdHJpbmdbXSB7ICJmb28iLCAiYmFyIiwgImJpeiIsICJiYXoiIH0pOyAKKyAgICAgICAgYXNzZXJ0UGx1Z2luc0NvbWJpbmVkKCJqcGEiLCBuZXcgU3RyaW5nW10geyAiZm9vIiwgImJhciIgfSwKKyAgICAgICAgICAgICJqcGEiLCBuZXcgU3RyaW5nW10geyAiYml6IiwgImJheiIgfSwKKyAgICAgICAgICAgICJqcGEiLCBuZXcgU3RyaW5nW10geyAiZm9vIiwgImJhciIsICJiaXoiLCAiYmF6IiB9KTsgCisgICAgICAgIGFzc2VydFBsdWdpbnNDb21iaW5lZCgianBhIiwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXIiIH0sCisgICAgICAgICAgICAianBhIiwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXoiIH0sCisgICAgICAgICAgICAianBhIiwgbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXoiIH0pOyAKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGx1Z2luc0NvbWJpbmVkKFN0cmluZyBjbHMxLCBTdHJpbmdbXSBwcm9wczEsCisgICAgICAgIFN0cmluZyBjbHMyLCBTdHJpbmdbXSBwcm9wczIsIFN0cmluZyBleHBDbHMsIFN0cmluZ1tdIGV4cFByb3BzKSB7CisgICAgICAgIFN0cmluZyBwbHVnaW4xID0gQ29uZmlndXJhdGlvbnMuZ2V0UGx1Z2luKGNsczEsIAorICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMuc2VyaWFsaXplUHJvcGVydGllcyh0b1Byb3BlcnRpZXMocHJvcHMxKSkpOworICAgICAgICBTdHJpbmcgcGx1Z2luMiA9IENvbmZpZ3VyYXRpb25zLmdldFBsdWdpbihjbHMyLCAKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25zLnNlcmlhbGl6ZVByb3BlcnRpZXModG9Qcm9wZXJ0aWVzKHByb3BzMikpKTsKKworICAgICAgICBTdHJpbmcgcmVzID0gQ29uZmlndXJhdGlvbnMuY29tYmluZVBsdWdpbnMocGx1Z2luMSwgcGx1Z2luMik7CisgICAgICAgIFN0cmluZyByZXNDbHMgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUocmVzKTsKKyAgICAgICAgTWFwIHJlc1Byb3BzID0gQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzKENvbmZpZ3VyYXRpb25zLgorICAgICAgICAgICAgZ2V0UHJvcGVydGllcyhyZXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cENscywgcmVzQ2xzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRvUHJvcGVydGllcyhleHBQcm9wcyksIHJlc1Byb3BzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgdG9Qcm9wZXJ0aWVzKFN0cmluZ1tdIHByb3BzKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBpZiAocHJvcHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbWFwLnB1dChwcm9wc1tpXSwgcHJvcHNbKytpXSk7CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBtYWluKFRlc3RDb25maWd1cmF0aW9ucy5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi9UZXN0VmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVGVzdFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiMjNmOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVGVzdFZhbHVlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmY7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VmFsdWUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcm5hbFN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGdldFZhbHVlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbGlhc2VzQnlWYWx1ZSgpIHsKKyAgICAgICAgU3RyaW5nIGFsaWFzID0gImFsaWFzIjsKKyAgICAgICAgU3RyaW5nIGFOYW1lID0gIkpvaG5ueSI7CisgICAgICAgIFN0cmluZyBiTmFtZSA9ICJQZXRlIjsKKyAgICAgICAgU3RyaW5nIFtdIGFTdHJpbmdzID0geyBhbGlhcywgYU5hbWUgfTsKKyAgICAgICAgCisgICAgICAgIFNpbXBsZVZhbHVlIHNWYWx1ZSA9IG5ldyBTaW1wbGVWYWx1ZSgpOworICAgICAgICBzVmFsdWUuc2V0QWxpYXNlcyhhU3RyaW5ncyk7CisgICAgICAgIHNWYWx1ZS5zZXRBbGlhcyhhbGlhcywgYk5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRpZCBub3Qgc2V0IHRoZSBuZXcgYWxpYXMiLCBiTmFtZSwgCisgICAgICAgICAgICAgICAgc1ZhbHVlLmdldEFsaWFzZXMoKVsxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXJyYXkgb2YgYWxpYXNlcyBub3Qgc2V0IGJ5IHZhbHVlIiwgYU5hbWUsIGFTdHJpbmdzWzFdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1Rlc3RYTUxDYXNlQ29udmVyc2lvbnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvVGVzdFhNTENhc2VDb252ZXJzaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NmQzNTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL1Rlc3RYTUxDYXNlQ29udmVyc2lvbnMuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZjsNCisNCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCisNCitwdWJsaWMgY2xhc3MgVGVzdFhNTENhc2VDb252ZXJzaW9ucyBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgcHVibGljIHZvaWQgdGVzdFRvWE1MTmFtZSgpIHsNCisgICAgICAgIGFzc2VydEVxdWFscygiZWFzeS14bWwtY29udmVyc2lvbiIsIA0KKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25JbXBsLnRvWE1MTmFtZSgiZWFzeVhtbENvbnZlcnNpb24iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImluaXRpYWwtY2FwcyIsIA0KKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25JbXBsLnRvWE1MTmFtZSgiSW5pdGlhbENhcHMiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm5vZGFzaCIsIA0KKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25JbXBsLnRvWE1MTmFtZSgibm9kYXNoIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbm90aGVybm9kYXNoIiwgDQorICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwudG9YTUxOYW1lKCJBbm90aGVybm9kYXNoIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtdWx0aXBsZS1jYXBzIiwgDQorICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwudG9YTUxOYW1lKCJNVWx0aXBsZUNhcHMiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInRyYWlsaW5nLW11bHRpLWNhcHMiLCANCisgICAgICAgICAgICBDb25maWd1cmF0aW9uSW1wbC50b1hNTE5hbWUoIlRyYWlsaW5nTXVsdGlDQVBTIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28taS1ubmVyLWNhcHMiLCANCisgICAgICAgICAgICBDb25maWd1cmF0aW9uSW1wbC50b1hNTE5hbWUoIlR3b0lObmVyQ2FwcyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZm91ci1pbm4tZXItY2FwcyIsIA0KKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25JbXBsLnRvWE1MTmFtZSgiRm91cklOTkVyQ2FwcyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiaW5uZXItMy1udW1iZXIiLCANCisgICAgICAgICAgICBDb25maWd1cmF0aW9uSW1wbC50b1hNTE5hbWUoIklubmVyM051bWJlciIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiaW5uZXItMDMtbnVtYmVyIiwgDQorICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwudG9YTUxOYW1lKCJJbm5lcjAzTnVtYmVyIikpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlciAobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoYXJnc1swXSkpKTsNCisgICAgICAgIHdoaWxlICh0cnVlKSB7DQorICAgICAgICAgICAgU3RyaW5nIHMgPSByLnJlYWRMaW5lKCk7DQorICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMgKyAiOiAiICsgQ29uZmlndXJhdGlvbkltcGwudG9YTUxOYW1lKHMpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL3Rlc3QvQ29uZmlndXJhdGlvblRlc3RQcm9kdWN0RGVyaXZhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi90ZXN0L0NvbmZpZ3VyYXRpb25UZXN0UHJvZHVjdERlcml2YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGExYTZlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi90ZXN0L0NvbmZpZ3VyYXRpb25UZXN0UHJvZHVjdERlcml2YXRpb24uamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYudGVzdDsNCisNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuVVJMOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkFic3RyYWN0UHJvZHVjdERlcml2YXRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuTWFwQ29uZmlndXJhdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUHJvZHVjdERlcml2YXRpb247DQorDQorLyoqDQorICogQSBQcm9kdWN0IERlcml2YXRpb24gdG8gdGVzdCBsb2FkaW5nIG9mIGdsb2JhbCBhbmQgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGgNCisgKiBTeXN0ZW0gc2V0dGluZ3MuICBSZWFkcyBpdHMgZ2xvYmFsIGZyb20gYSBmaWxlIHNwZWNpZmllZCBieSANCisgKiA8Y29kZT4ib3BlbmpwYXRlc3QucHJvcGVydGllcyI8L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eS4NCisgKg0KKyAqIEBhdXRob3IgUGluYWtpIFBvZGRhcg0KKyAqIEBhdXRob3IgQWJlIFdoaXRlDQorICovDQorcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25UZXN0UHJvZHVjdERlcml2YXRpb24gDQorICAgIGV4dGVuZHMgQWJzdHJhY3RQcm9kdWN0RGVyaXZhdGlvbiB7DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBQcm9kdWN0RGVyaXZhdGlvbi5UWVBFX1BST0RVQ1Q7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb25DbG9zZShDb25maWd1cmF0aW9uIGNvbmYpIHsNCisgICAgICAgIGNsb3NlZCA9IHRydWU7DQorICAgIH0NCisNCisgICAgcHVibGljIENvbmZpZ3VyYXRpb25Qcm92aWRlciBsb2FkR2xvYmFscyhDbGFzc0xvYWRlciBsb2FkZXIpDQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIGxvYWQobnVsbCwgbG9hZGVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWQoU3RyaW5nIHJzcmMsIENsYXNzTG9hZGVyIGxvYWRlcikNCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAocnNyYyA9PSBudWxsKQ0KKyAgICAgICAgICAgIHJzcmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9wZW5qcGF0ZXN0LnByb3BlcnRpZXMiKTsNCisgICAgICAgIGlmIChyc3JjID09IG51bGwgfHwgIXJzcmMuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorDQorICAgICAgICBVUkwgdXJsID0gZmluZFJlc291cmNlKHJzcmMsIGxvYWRlcik7DQorICAgICAgICBpZiAodXJsID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihyc3JjLCBnZXRDbGFzcygpLmdldE5hbWUoKSwgDQorICAgICAgICAgICAgICAgIHJzcmMpOw0KKw0KKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSB1cmwub3BlblN0cmVhbSgpOw0KKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7DQorICAgICAgICBpZiAoaW4gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcENvbmZpZ3VyYXRpb25Qcm92aWRlcihwcm9wcyk7DQorICAgICAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICAgICAgdHJ5IHsgaW4uY2xvc2UoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIExvY2F0ZSB0aGUgZ2l2ZW4gcmVzb3VyY2UuDQorICAgICAqLw0KKyAgICBwcml2YXRlIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIHJzcmMsIENsYXNzTG9hZGVyIGxvYWRlcikNCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5nZXRSZXNvdXJjZShyc3JjKTsNCisNCisgICAgICAgIC8vIGluIGpidWlsZGVyIHRoZSBjbGFzc2xvYWRlciBjYW4gYmUgbnVsbA0KKyAgICAgICAgVVJMIHVybCA9IG51bGw7DQorICAgICAgICBsb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7DQorICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpDQorICAgICAgICAgICAgdXJsID0gbG9hZGVyLmdldFJlc291cmNlKHJzcmMpOw0KKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7DQorICAgICAgICAgICAgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsNCisgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShyc3JjKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGxvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7DQorICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICB1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UocnNyYyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdXJsOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvdGVzdC9UZXN0Q29uZmlndXJhdGlvbkltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvdGVzdC9UZXN0Q29uZmlndXJhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQ0OWFlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi90ZXN0L1Rlc3RDb25maWd1cmF0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi50ZXN0OworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudGVzdC5BYnN0cmFjdFRlc3RDYXNlOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgQ29uZmlndXJhdGlvbkltcGx9IHR5cGUuIFRoaXMgbmVlZHMgdG8gYmUgcGxhY2VkCisgKiBpbiBhIHN1Yi1wYWNrYWdlIHNvIHRoYXQgaXQgY2FuIGhhdmUgaXRzIG93biBsb2NhbGl6ZXIucHJvcGVydGllcworICogcHJvcGVydGllcywgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciB0aGUgYmVhbiBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZQorICogY29uZmlndXJhdGlvbiBmcmFtZXdvcmsge0BsaW5rIFZhbHVlfS4KKyAqIAorICogVGhpcyB0ZXN0IGFzc3VtZXMgYSA8Y29kZT4idGVzdC5wcm9wZXJ0aWVzIjwvY29kZT4gZmlsZSBhdmFpbGFibGUgaW4KKyAqIGNsYXNzcGF0aCBhbmQgYWxzbyBzeXN0ZW0gcHJvcGVydHkgPGNvZGU+Im9wZW5qcGF0ZXN0LnByb3BlcnRpZXMiPC9jb2RlPgorICogaXMgc2V0IHRvIDxjb2RlPiJ0ZXN0LnByb3BlcnRpZXMiPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29uZmlndXJhdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgQ29uZmlndXJhdGlvblRlc3QgX2NvbmYgPSBuZXcgQ29uZmlndXJhdGlvblRlc3QoKTsKKworICAgIHB1YmxpYyBUZXN0Q29uZmlndXJhdGlvbkltcGwoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3BlbmpwYXRlc3QucHJvcGVydGllcyIsICJ0ZXN0LnByb3BlcnRpZXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9wZW5qcGF0ZXN0LnByb3BlcnRpZXMiLCAiIik7CisgICAgCXN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGdsb2JhbCBwcm9wZXJ0aWVzIGFyZSBmb3VuZCBhbmQgbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxzKCkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9wZW5qcGEuc3lzS2V5IiwgInN5c3ZhbHVlIik7CisgICAgICAgIGFzc2VydE51bGwoX2NvbmYuZ2V0VGVzdEtleSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChfY29uZi5nZXRTeXNLZXkoKSk7CisgICAgICAgIGFzc2VydE51bGwoX2NvbmYuZ2V0UGx1Z2luS2V5KCkpOworICAgICAgICBhc3NlcnROdWxsKF9jb25mLmdldE9iamVjdEtleSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfY29uZi5sb2FkR2xvYmFscygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0dmFsdWUiLCBfY29uZi5nZXRUZXN0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN5c3ZhbHVlIiwgX2NvbmYuZ2V0U3lzS2V5KCkpOworICAgICAgICBhc3NlcnROdWxsKF9jb25mLmdldFBsdWdpbktleSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChfY29uZi5nZXRPYmplY3RLZXkoKSk7CisKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgbG9jYXRpb24gdG8gYSBub24tZXhpc3RhbnQgdmFsdWUKKyAgICAgICAgX2NvbmYuc2V0VGVzdEtleShudWxsKTsKKyAgICAgICAgX2NvbmYuc2V0U3lzS2V5KG51bGwpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9wZW5qcGF0ZXN0LnByb3BlcnRpZXMiLCAiZm9vLnByb3BlcnRpZXMiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIV9jb25mLmxvYWRHbG9iYWxzKCkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiBmb3IgbWlzc2luZyByZXNvdXJjZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGJhY2sgZm9yIHJlbWFpbmRlciBvZiB0ZXN0cworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9wZW5qcGF0ZXN0LnByb3BlcnRpZXMiLCAidGVzdC5wcm9wZXJ0aWVzIik7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3BlbmpwYS5wbHVnaW5LZXkiLCAiamF2YS5sYW5nLk9iamVjdCIpOworICAgICAgICBhc3NlcnRUcnVlKF9jb25mLmxvYWRHbG9iYWxzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3R2YWx1ZSIsIF9jb25mLmdldFRlc3RLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3lzdmFsdWUiLCBfY29uZi5nZXRTeXNLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIF9jb25mLmdldFBsdWdpbktleSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChfY29uZi5nZXRQbHVnaW5LZXlJbnN0YW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChfY29uZi5nZXRPYmplY3RLZXkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIHNlcmlhbGl6ZWQgdG8gcHJvcGVydGllcyBjb3JyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvUHJvcGVydGllcygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfY29uZi5sb2FkR2xvYmFscygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0dmFsdWUiLCBfY29uZi5nZXRUZXN0S2V5KCkpOworICAgICAgICBNYXAgcHJvcHMgPSBfY29uZi50b1Byb3BlcnRpZXMoZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3R2YWx1ZSIsIHByb3BzLmdldCgib3BlbmpwYS50ZXN0S2V5IikpOworICAgICAgICBhc3NlcnRGYWxzZShwcm9wcy5jb250YWluc0tleSgib3BlbmpwYS5vYmplY3RLZXkiKSk7CisgICAgICAgIF9jb25mLnNldFRlc3RLZXkoImZvbyIpOworICAgICAgICBfY29uZi5zZXRQbHVnaW5LZXkobmV3IE9iamVjdCgpKTsKKyAgICAgICAgX2NvbmYuc2V0T2JqZWN0S2V5KG5ldyBPYmplY3QoKSk7CisgICAgICAgIHByb3BzID0gX2NvbmYudG9Qcm9wZXJ0aWVzKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBwcm9wcy5nZXQoIm9wZW5qcGEudGVzdEtleSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcHJvcHMuZ2V0KCJvcGVuanBhLnBsdWdpbktleSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJvcHMuY29udGFpbnNLZXkoIm9wZW5qcGEub2JqZWN0S2V5IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHByb3BlcnRpZXMgY2FjaGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc0NhY2hpbmcoKSB7CisgICAgICAgIF9jb25mLnNldFRlc3RLZXkoInZhbCIpOworICAgICAgICBfY29uZi5zZXRQbHVnaW5LZXkoImphdmEubGFuZy5PYmplY3QiKTsKKyAgICAgICAgTWFwIHByb3BzMSA9IF9jb25mLnRvUHJvcGVydGllcyhmYWxzZSk7CisgICAgICAgIE1hcCBwcm9wczIgPSBfY29uZi50b1Byb3BlcnRpZXMoZmFsc2UpOworICAgICAgICBfY29uZi5zZXRPYmplY3RLZXkobmV3IE9iamVjdCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChfY29uZi5nZXRQbHVnaW5LZXlJbnN0YW5jZSgpKTsgLy8gaW5zdGFudGlhdGUKKyAgICAgICAgTWFwIHByb3BzMyA9IF9jb25mLnRvUHJvcGVydGllcyhmYWxzZSk7CisgICAgICAgIF9jb25mLnNldFRlc3RLZXkoImNoYW5nZWQiKTsKKyAgICAgICAgTWFwIHByb3BzNCA9IF9jb25mLnRvUHJvcGVydGllcyhmYWxzZSk7CisgICAgICAgIF9jb25mLnNldFBsdWdpbktleShuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIE1hcCBwcm9wczUgPSBfY29uZi50b1Byb3BlcnRpZXMoZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMocHJvcHMxLCBwcm9wczIpOworICAgICAgICBhc3NlcnRFcXVhbHMocHJvcHMxLCBwcm9wczMpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMocHJvcHMxLCBwcm9wczQpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMocHJvcHM0LCBwcm9wczUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGVxdWFscyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKKyAgICAgICAgQ29uZmlndXJhdGlvblRlc3QgY29uZiA9IG5ldyBDb25maWd1cmF0aW9uVGVzdCgpOworICAgICAgICBjb25mLnNldFRlc3RLZXkoX2NvbmYuZ2V0VGVzdEtleSgpKTsKKyAgICAgICAgY29uZi5zZXRTeXNLZXkoX2NvbmYuZ2V0U3lzS2V5KCkpOworICAgICAgICBjb25mLnNldFBsdWdpbktleShfY29uZi5nZXRQbHVnaW5LZXkoKSk7CisgICAgICAgIGNvbmYuc2V0T2JqZWN0S2V5KF9jb25mLmdldE9iamVjdEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9jb25mLCBjb25mKTsKKworICAgICAgICBjb25mLnNldFRlc3RLZXkoIm5ld3ZhbCIpOworICAgICAgICBhc3NlcnRUcnVlKCFfY29uZi5lcXVhbHMoY29uZikpOworICAgICAgICBjb25mLnNldFRlc3RLZXkoX2NvbmYuZ2V0VGVzdEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9jb25mLCBjb25mKTsKKworICAgICAgICBjb25mLnNldE9iamVjdEtleShuZXcgT2JqZWN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoX2NvbmYsIGNvbmYpOworCisgICAgICAgIGNvbmYuc2V0UGx1Z2luS2V5KG5ldyBTdHJpbmdCdWZmZXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoIV9jb25mLmVxdWFscyhjb25mKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB1c2luZyBiZWFuIGludHJvc3BlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5BY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzID0gX2NvbmYuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwZHNbaV0uZ2V0U2hvcnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGRzW2ldLmdldERpc3BsYXlOYW1lKCkpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBkc1tpXS5nZXRXcml0ZU1ldGhvZCgpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGRzW2ldLmdldFJlYWRNZXRob2QoKSk7CisKKyAgICAgICAgICAgIHBkc1tpXS5nZXRSZWFkTWV0aG9kKCkuaW52b2tlKF9jb25mLCAoT2JqZWN0W10pIG51bGwpOworCisgICAgICAgICAgICBNZXRob2Qgc2V0dGVyID0gcGRzW2ldLmdldFdyaXRlTWV0aG9kKCk7CisgICAgICAgICAgICBNZXRob2QgZ2V0dGVyID0gcGRzW2ldLmdldFJlYWRNZXRob2QoKTsKKyAgICAgICAgICAgIENsYXNzIHBhcmFtID0gcGRzW2ldLmdldFJlYWRNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCk7CisKKyAgICAgICAgICAgIE9iamVjdCBzZXRWYWwgPSBudWxsOworICAgICAgICAgICAgaWYgKHBhcmFtID09IGludC5jbGFzcykKKyAgICAgICAgICAgICAgICBzZXRWYWwgPSByYW5kb21JbnQoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09IGxvbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgc2V0VmFsID0gcmFuZG9tTG9uZygpOworICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gPT0gU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgIHNldFZhbCA9IHJhbmRvbVN0cmluZygpOworICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gPT0gYm9vbGVhbi5jbGFzcykKKyAgICAgICAgICAgICAgICBzZXRWYWwgPSBuZXcgQm9vbGVhbighKCgoQm9vbGVhbikgZ2V0dGVyLmludm9rZShfY29uZiwKKyAgICAgICAgICAgICAgICAgICAgKE9iamVjdFtdKSBudWxsKSkuYm9vbGVhblZhbHVlKCkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgc2V0dGVyLmludm9rZShfY29uZiwgbmV3IE9iamVjdCBbXXsgc2V0VmFsIH0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNldFZhbCwgZ2V0dGVyLmludm9rZShfY29uZiwgKE9iamVjdFtdKSBudWxsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZyZWV6aW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGcmVlemluZygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghX2NvbmYuaXNSZWFkT25seSgpKTsKKyAgICAgICAgX2NvbmYuc2V0UmVhZE9ubHkodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoX2NvbmYuaXNSZWFkT25seSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jb25mLnNldFRlc3RLZXkoImJhciIpOworICAgICAgICAgICAgZmFpbCgiQWxsb3dlZCBzZXQgb24gcmVhZCBvbmx5IGNvbmZpZ3VyYXRpb24uIik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHAucHV0KCJ4IiwgInkiKTsKKyAgICAgICAgICAgIF9jb25mLmZyb21Qcm9wZXJ0aWVzKHApOworICAgICAgICAgICAgZmFpbCgiQWxsb3dlZCBmcm9tTWFwIG9uIHJlYWQgb25seSBjb25maWd1cmF0aW9uLiIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHNlcmlhbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfY29uZi5sb2FkR2xvYmFscygpKTsKKyAgICAgICAgX2NvbmYuc2V0VGVzdEtleSgidGVzdHZhbHVlIik7CisgICAgICAgIF9jb25mLnNldFN5c0tleSgic3lzdmFsdWUiKTsKKyAgICAgICAgX2NvbmYuc2V0T2JqZWN0S2V5KG5ldyBPYmplY3QoKSk7CisgICAgICAgIF9jb25mLnNldFBsdWdpbktleShuZXcgT2JqZWN0KCkpOworCisgICAgICAgIENvbmZpZ3VyYXRpb25UZXN0IGNvcHkgPSAoQ29uZmlndXJhdGlvblRlc3QpIHJvdW5kdHJpcChfY29uZiwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdHZhbHVlIiwgY29weS5nZXRUZXN0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN5c3ZhbHVlIiwgY29weS5nZXRTeXNLZXkoKSk7CisgICAgICAgIGFzc2VydE51bGwoY29weS5nZXRPYmplY3RLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGNvcHkuZ2V0UGx1Z2luS2V5KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvcHkuZ2V0UGx1Z2luS2V5SW5zdGFuY2UoKSk7CisKKyAgICAgICAgY29weS5zZXRUZXN0S2V5KCJ0ZXN0dmFsdWUyIik7CisgICAgICAgIGNvcHkuc2V0U3lzS2V5KCJzeXN2YWx1ZTIiKTsKKyAgICAgICAgY29weS5zZXRQbHVnaW5LZXkobmV3IFN0cmluZ0J1ZmZlcigpKTsKKworICAgICAgICBDb25maWd1cmF0aW9uVGVzdCBjb3B5MiA9IChDb25maWd1cmF0aW9uVGVzdCkgcm91bmR0cmlwKGNvcHksIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3R2YWx1ZTIiLCBjb3B5Mi5nZXRUZXN0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN5c3ZhbHVlMiIsIGNvcHkyLmdldFN5c0tleSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3B5Mi5nZXRPYmplY3RLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIsIGNvcHkyLmdldFBsdWdpbktleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjb3B5Mi5nZXRQbHVnaW5LZXlJbnN0YW5jZSgpLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdERlcml2YXRpb25DbG9zZUNhbGxiYWNrKCkgeworICAgICAgICAvLyB0b2dnbGUgdGhlIHN0YXRpYy4gVGhpcyB3aWxsIGJlIHJlc2V0IGJ5IHRoZSBjbG9zZSBpbnZvY2F0aW9uLgorICAgICAgICBDb25maWd1cmF0aW9uVGVzdFByb2R1Y3REZXJpdmF0aW9uLmNsb3NlZCA9IGZhbHNlOworICAgICAgICBfY29uZi5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKENvbmZpZ3VyYXRpb25UZXN0UHJvZHVjdERlcml2YXRpb24uY2xvc2VkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG1haW4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uVGVzdCBleHRlbmRzIENvbmZpZ3VyYXRpb25JbXBsIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1ZhbHVlIF90ZXN0S2V5OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1ZhbHVlIF9zeXNLZXk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGx1Z2luVmFsdWUgX3BsdWdpbktleTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RWYWx1ZSBfb2JqZWN0S2V5OworCisgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uVGVzdCgpIHsKKyAgICAgICAgICAgIHRoaXModHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvblRlc3QoYm9vbGVhbiBjYW5TZXRQbHVnaW4pIHsKKyAgICAgICAgICAgIHN1cGVyKGZhbHNlKTsKKyAgICAgICAgICAgIF90ZXN0S2V5ID0gYWRkU3RyaW5nKCJ0ZXN0S2V5Iik7CisgICAgICAgICAgICBfc3lzS2V5ID0gYWRkU3RyaW5nKCJzeXNLZXkiKTsKKyAgICAgICAgICAgIF9wbHVnaW5LZXkgPSBhZGRQbHVnaW4oInBsdWdpbktleSIsIGNhblNldFBsdWdpbik7CisgICAgICAgICAgICBfb2JqZWN0S2V5ID0gYWRkT2JqZWN0KCJvYmplY3RLZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfdGVzdEtleS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRlc3RLZXkoU3RyaW5nIHZhbCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgICAgIF90ZXN0S2V5LnNldCh2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXNLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gX3N5c0tleS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c0tleShTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICBhc3NlcnROb3RSZWFkT25seSgpOworICAgICAgICAgICAgX3N5c0tleS5zZXQodmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luS2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIF9wbHVnaW5LZXkuZ2V0U3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbHVnaW5LZXkoU3RyaW5nIHZhbCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgICAgIF9wbHVnaW5LZXkuc2V0U3RyaW5nKHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBsdWdpbktleUluc3RhbmNlKCkgeworICAgICAgICAgICAgaWYgKF9wbHVnaW5LZXkuZ2V0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX3BsdWdpbktleS5pbnN0YW50aWF0ZShPYmplY3QuY2xhc3MsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIF9wbHVnaW5LZXkuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbHVnaW5LZXkoT2JqZWN0IHZhbCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90UmVhZE9ubHkoKTsKKyAgICAgICAgICAgIF9wbHVnaW5LZXkuc2V0KHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfb2JqZWN0S2V5LmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0S2V5KE9iamVjdCB2YWwpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdFJlYWRPbmx5KCk7CisgICAgICAgICAgICBfb2JqZWN0S2V5LnNldCh2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVyaXZlT2JqZWN0S2V5KE9iamVjdCB2YWwpIHsKKyAgICAgICAgICAgIF9vYmplY3RLZXkuc2V0KHZhbCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW52YWxpZFByb3BlcnR5KFN0cmluZyBzKSB7CisgICAgICAgICAgICBpZiAoIm9wZW5qcGF0ZXN0LnByb3BlcnRpZXMiLmVxdWFscyhzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pc0ludmFsaWRQcm9wZXJ0eShzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvdGVzdC9UZXN0UGx1Z2luVmFsdWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvdGVzdC9UZXN0UGx1Z2luVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk0ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvY29uZi90ZXN0L1Rlc3RQbHVnaW5WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi50ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlBsdWdpbkxpc3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUGx1Z2luVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlN0cmluZ1ZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5WYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnRlc3QuQWJzdHJhY3RUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFZhbHVlfSwge0BsaW5rIFBsdWdpblZhbHVlfSwgYW5kCisgKiB7QGxpbmsgUGx1Z2luTGlzdFZhbHVlfSBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UGx1Z2luVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBUZXN0UGx1Z2luVmFsdWUoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHQoKSB7CisgICAgICAgIGRlZmF1bHRUZXN0KG5ldyBTdHJpbmdWYWx1ZSgidGVzdEtleSIpKTsKKyAgICAgICAgZGVmYXVsdFRlc3QobmV3IFBsdWdpblZhbHVlKCJ0ZXN0S2V5IiwgdHJ1ZSkpOworICAgICAgICBkZWZhdWx0VGVzdChuZXcgUGx1Z2luTGlzdFZhbHVlKCJ0ZXN0S2V5IikpOworICAgICAgICBwbHVnaW5EZWZhdWx0VGVzdChuZXcgUGx1Z2luVmFsdWUoInRlc3RLZXkiLCB0cnVlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlZmF1bHRUZXN0KFZhbHVlIHZhbCkgeworICAgICAgICBhc3NlcnROdWxsKHZhbC5nZXRTdHJpbmcoKSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoImZvbyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwodmFsLmdldFN0cmluZygpKTsKKyAgICAgICAgdmFsLnNldERlZmF1bHQoInh4eCIpOworICAgICAgICB2YWwuc2V0U3RyaW5nKG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoInh4eCIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoImJhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoIiAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eHgiLCB2YWwuZ2V0U3RyaW5nKCkpOworICAgICAgICB2YWwuc2V0U3RyaW5nKCJ5eXkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ5eXkiLCB2YWwuZ2V0U3RyaW5nKCkpOworICAgICAgICB2YWwuc2V0U3RyaW5nKG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoInh4eCIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsdWdpbkRlZmF1bHRUZXN0KFBsdWdpblZhbHVlIHZhbCkgeworICAgICAgICB2YWwuc2V0RGVmYXVsdCgiZm9vIik7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoIng9eSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyh4PXkpIiwgdmFsLmdldFN0cmluZygpKTsKKyAgICAgICAgdmFsLnNldChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCB2YWwuZ2V0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIHZhbC5nZXQoKSk7CisgICAgICAgIHZhbC5zZXQobnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmFsLmdldFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHZhbC5nZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsaWFzKCkgeworICAgICAgICBhbGlhc1Rlc3QobmV3IFN0cmluZ1ZhbHVlKCJ0ZXN0S2V5IikpOworICAgICAgICBhbGlhc1Rlc3QobmV3IFBsdWdpblZhbHVlKCJ0ZXN0S2V5IiwgdHJ1ZSkpOworICAgICAgICBhbGlhc1Rlc3QobmV3IFBsdWdpbkxpc3RWYWx1ZSgidGVzdEtleSIpKTsKKyAgICAgICAgZW1wdHlBbGlhc1Rlc3QobmV3IFN0cmluZ1ZhbHVlKCJ0ZXN0S2V5IikpOworICAgICAgICBlbXB0eUFsaWFzVGVzdChuZXcgU3RyaW5nVmFsdWUoInRlc3RLZXkiKSk7CisgICAgICAgIHBsdWdpbkFsaWFzVGVzdChuZXcgUGx1Z2luVmFsdWUoInRlc3RLZXkiLCB0cnVlKSk7CisgICAgICAgIHBsdWdpbkFsaWFzVGVzdChuZXcgUGx1Z2luTGlzdFZhbHVlKCJ0ZXN0S2V5IikpOworICAgICAgICBwbHVnaW5MaXN0QWxpYXNUZXN0KG5ldyBQbHVnaW5MaXN0VmFsdWUoInRlc3RLZXkiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFsaWFzVGVzdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgdmFsLnNldEFsaWFzZXMobmV3IFN0cmluZ1tdeyAiZm9vIiwgImJhciIgfSk7CisgICAgICAgIHZhbC5zZXREZWZhdWx0KCJiYXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCB2YWwuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgdmFsLnNldFN0cmluZyhudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2YWwuZ2V0U3RyaW5nKCkpOworICAgICAgICB2YWwuc2V0RGVmYXVsdCgieHh4Iik7CisgICAgICAgIHZhbC5zZXRTdHJpbmcobnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygieHh4IiwgdmFsLmdldFN0cmluZygpKTsKKyAgICAgICAgdmFsLnNldERlZmF1bHQoImJhciIpOworICAgICAgICB2YWwuc2V0U3RyaW5nKG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoInl5eSIpOworICAgICAgICB2YWwuc2V0QWxpYXNlcyhuZXcgU3RyaW5nW117ICJ4eHgiLCAieXl5IiB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eHgiLCB2YWwuZ2V0U3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbXB0eUFsaWFzVGVzdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgdmFsLnNldERlZmF1bHQoImZvbyIpOworICAgICAgICB2YWwuc2V0QWxpYXNlcyhuZXcgU3RyaW5nW117ICJmYWxzZSIsIG51bGwgfSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoImZhbHNlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCB2YWwuZ2V0U3RyaW5nKCkpOworICAgICAgICB2YWwuc2V0U3RyaW5nKG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsdWdpbkFsaWFzVGVzdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgLy8gdGVzdCBwbHVnaW4gbmFtZS1vbmx5IGFsaWFzZXMKKyAgICAgICAgdmFsLnNldFN0cmluZygiZm9vKGJpej1iYXopIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vKGJpej1iYXopIiwgdmFsLmdldFN0cmluZygpKTsKKyAgICAgICAgdmFsLnNldEFsaWFzZXMobmV3IFN0cmluZ1tdeyAieHh4IiwgImZvbyIgfSk7CisgICAgICAgIGFzc2VydEVxdWFscygieHh4KGJpej1iYXopIiwgdmFsLmdldFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGx1Z2luTGlzdEFsaWFzVGVzdChWYWx1ZSB2YWwpIHsKKyAgICAgICAgLy8gYW5kIHRlc3Qgb24gbGlzdHMKKyAgICAgICAgdmFsLnNldFN0cmluZygiZm9vKGJpej1iYXopLCBmb28oYT1iKSx4eHgsIGZvbywgeXl5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vKGJpej1iYXopLCBmb28oYT1iKSwgeHh4LCBmb28sIHl5eSIsIHZhbC5nZXRTdHJpbmcoKSk7CisgICAgICAgIHZhbC5zZXRBbGlhc2VzKG5ldyBTdHJpbmdbXXsgImJhciIsICJmb28iIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhcihiaXo9YmF6KSwgYmFyKGE9YiksIHh4eCwgYmFyLCB5eXkiLCB2YWwuZ2V0U3RyaW5nKCkpOworCisgICAgICAgIHZhbC5zZXRBbGlhc2VzKG5ldyBTdHJpbmdbXXsgIm5vbmUiLCBudWxsIH0pOworICAgICAgICB2YWwuc2V0U3RyaW5nKCJub25lIik7CisgICAgICAgIGFzc2VydFRydWUoKChQbHVnaW5MaXN0VmFsdWUpIHZhbCkuZ2V0Q2xhc3NOYW1lcygpLmxlbmd0aCA9PSAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luTGlzdFBhcnNpbmcoKSB7CisgICAgICAgIFBsdWdpbkxpc3RWYWx1ZSB2YWwgPSBuZXcgUGx1Z2luTGlzdFZhbHVlKCJ0ZXN0S2V5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCB2YWwuZ2V0Q2xhc3NOYW1lcygpLmxlbmd0aCk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoImZvbyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsLmdldENsYXNzTmFtZXMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRDbGFzc05hbWVzKClbMF0pOworICAgICAgICBhc3NlcnROdWxsKHZhbC5nZXRQcm9wZXJ0aWVzKClbMF0pOworICAgICAgICB2YWwuc2V0U3RyaW5nKCJmb28oKSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsLmdldENsYXNzTmFtZXMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRDbGFzc05hbWVzKClbMF0pOworICAgICAgICBhc3NlcnROdWxsKHZhbC5nZXRQcm9wZXJ0aWVzKClbMF0pOworICAgICAgICB2YWwuc2V0U3RyaW5nKCJmb28oYT1iKSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsLmdldENsYXNzTmFtZXMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRDbGFzc05hbWVzKClbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9YiIsIHZhbC5nZXRQcm9wZXJ0aWVzKClbMF0pOworICAgICAgICB2YWwuc2V0U3RyaW5nKCJmb28oYT1iLCBjPVwiZCxlIGZcIiwgZz1cImhcIikiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbC5nZXRDbGFzc05hbWVzKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2YWwuZ2V0Q2xhc3NOYW1lcygpWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPWIsIGM9XCJkLGUgZlwiLCBnPVwiaFwiIiwgdmFsLmdldFByb3BlcnRpZXMoKVswXSk7CisgICAgICAgIHZhbC5zZXRTdHJpbmcoImZvbyhhPWIsIGM9XCJkLGUgZlwiKSwgYmFyLCBiaXooYT1jLCBkPWcpLCBiYXooKSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgdmFsLmdldENsYXNzTmFtZXMoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZhbC5nZXRDbGFzc05hbWVzKClbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9YiwgYz1cImQsZSBmXCIiLCB2YWwuZ2V0UHJvcGVydGllcygpWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCB2YWwuZ2V0Q2xhc3NOYW1lcygpWzFdKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh2YWwuZ2V0UHJvcGVydGllcygpWzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiaXoiLCB2YWwuZ2V0Q2xhc3NOYW1lcygpWzJdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPWMsIGQ9ZyIsIHZhbC5nZXRQcm9wZXJ0aWVzKClbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImJheiIsIHZhbC5nZXRDbGFzc05hbWVzKClbM10pOworICAgICAgICBhc3NlcnROdWxsKHZhbC5nZXRQcm9wZXJ0aWVzKClbM10pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVpcmVkIGJlY2F1c2Ugd2UgdXNlIGEgJ3Rlc3RLZXknIGR1bW15IHByb3BlcnR5IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0S2V5KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1aXJlZCBiZWNhdXNlIHdlIHVzZSBhICd0ZXN0S2V5JyBkdW1teSBwcm9wZXJ0eSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRlc3RLZXkoU3RyaW5nIGtleSkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbWFpbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL1Rlc3REZXB0aEZpcnN0QW5hbHlzaXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL1Rlc3REZXB0aEZpcnN0QW5hbHlzaXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2ZkYzk5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvVGVzdERlcHRoRmlyc3RBbmFseXNpcy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmdyYXBoOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnRlc3QuQWJzdHJhY3RUZXN0Q2FzZTsNCisNCisvKioNCisgKiA8cD5UZXN0cyB0aGUge0BsaW5rIERlcHRoRmlyc3RBbmFseXNpc30gdHlwZS48L3A+DQorICoNCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0RGVwdGhGaXJzdEFuYWx5c2lzDQorICAgIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQorDQorICAgIHByaXZhdGUgRGVwdGhGaXJzdEFuYWx5c2lzIF9kZmEgPSBudWxsOw0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCisgICAgICAgIEdyYXBoIGdyYXBoID0gbmV3IEdyYXBoKCk7DQorICAgICAgICBPYmplY3Qgbm9kZTEgPSBuZXcgT2JqZWN0KCk7DQorICAgICAgICBPYmplY3Qgbm9kZTIgPSBuZXcgT2JqZWN0KCk7DQorICAgICAgICBPYmplY3Qgbm9kZTMgPSBuZXcgT2JqZWN0KCk7DQorICAgICAgICBPYmplY3Qgbm9kZTQgPSBuZXcgT2JqZWN0KCk7DQorICAgICAgICBncmFwaC5hZGROb2RlKG5vZGUxKTsNCisgICAgICAgIGdyYXBoLmFkZE5vZGUobm9kZTIpOw0KKyAgICAgICAgZ3JhcGguYWRkTm9kZShub2RlMyk7DQorICAgICAgICBncmFwaC5hZGROb2RlKG5vZGU0KTsNCisgICAgICAgIGdyYXBoLmFkZEVkZ2UobmV3IEVkZ2Uobm9kZTEsIG5vZGUyLCB0cnVlKSk7DQorICAgICAgICBncmFwaC5hZGRFZGdlKG5ldyBFZGdlKG5vZGUyLCBub2RlMywgdHJ1ZSkpOw0KKyAgICAgICAgZ3JhcGguYWRkRWRnZShuZXcgRWRnZShub2RlMywgbm9kZTEsIHRydWUpKTsNCisgICAgICAgIGdyYXBoLmFkZEVkZ2UobmV3IEVkZ2Uobm9kZTMsIG5vZGU0LCB0cnVlKSk7DQorICAgICAgICBncmFwaC5hZGRFZGdlKG5ldyBFZGdlKG5vZGUyLCBub2RlMiwgdHJ1ZSkpOw0KKyAgICAgICAgX2RmYSA9IG5ldyBEZXB0aEZpcnN0QW5hbHlzaXMoZ3JhcGgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlU29ydGluZygpIHsNCisgICAgICAgIENvbGxlY3Rpb24gbm9kZXMgPSBfZGZhLmdldFNvcnRlZE5vZGVzKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoNCwgbm9kZXMuc2l6ZSgpKTsNCisNCisgICAgICAgIGludCB0aW1lID0gSW50ZWdlci5NQVhfVkFMVUU7DQorICAgICAgICBPYmplY3Qgbm9kZTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBub2RlID0gaXRyLm5leHQoKTsNCisgICAgICAgICAgICBhc3NlcnRUcnVlKHRpbWUgPj0gX2RmYS5nZXRGaW5pc2hlZFRpbWUobm9kZSkpOw0KKyAgICAgICAgICAgIHRpbWUgPSBfZGZhLmdldEZpbmlzaGVkVGltZShub2RlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWRnZVR5cGluZygpIHsNCisgICAgICAgIENvbGxlY3Rpb24gZWRnZXMgPSBfZGZhLmdldEVkZ2VzKEVkZ2UuVFlQRV9CQUNLKTsNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgSXRlcmF0b3IgaXRyID0gZWRnZXMuaXRlcmF0b3IoKTsNCisgICAgICAgIEVkZ2UgZWRnZTAgPSAoRWRnZSkgaXRyLm5leHQoKTsNCisgICAgICAgIEVkZ2UgZWRnZTEgPSAoRWRnZSkgaXRyLm5leHQoKTsNCisgICAgICAgIGFzc2VydFRydWUoKGVkZ2UwLmdldFRvKCkgPT0gZWRnZTAuZ2V0RnJvbSgpKQ0KKyAgICAgICAgICAgIHx8IGVkZ2UxLmdldFRvKCkgPT0gZWRnZTEuZ2V0RnJvbSgpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQorICAgICAgICBtYWluKFRlc3REZXB0aEZpcnN0QW5hbHlzaXMuY2xhc3MpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL1Rlc3RHcmFwaC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvZ3JhcGgvVGVzdEdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5Mzc1NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2dyYXBoL1Rlc3RHcmFwaC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5ncmFwaDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi50ZXN0LkFic3RyYWN0VGVzdENhc2U7DQorDQorLyoqDQorICogPHA+VGVzdHMgdGhlIHtAbGluayBHcmFwaH0gdHlwZSwgYW5kIGluIHNvIGRvaW5nIGltcGxpY2l0bHkgdGVzdHMgdGhlDQorICoge0BsaW5rIEVkZ2V9IGFzIHdlbGwuPC9wPg0KKyAqDQorICogQGF1dGhvciBBYmUgV2hpdGUNCisgKi8NCitwdWJsaWMgY2xhc3MgVGVzdEdyYXBoDQorICAgIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQorDQorICAgIHByaXZhdGUgR3JhcGggX2dyYXBoID0gbmV3IEdyYXBoKCk7DQorICAgIHByaXZhdGUgT2JqZWN0IF9ub2RlMSA9IG5ldyBPYmplY3QoKTsNCisgICAgcHJpdmF0ZSBPYmplY3QgX25vZGUyID0gbmV3IE9iamVjdCgpOw0KKyAgICBwcml2YXRlIE9iamVjdCBfbm9kZTMgPSBuZXcgT2JqZWN0KCk7DQorICAgIHByaXZhdGUgRWRnZSBfZWRnZTEgPSBuZXcgRWRnZShfbm9kZTEsIF9ub2RlMiwgdHJ1ZSk7DQorICAgIHByaXZhdGUgRWRnZSBfZWRnZTIgPSBuZXcgRWRnZShfbm9kZTIsIF9ub2RlMywgdHJ1ZSk7DQorICAgIHByaXZhdGUgRWRnZSBfZWRnZTMgPSBuZXcgRWRnZShfbm9kZTEsIF9ub2RlMywgZmFsc2UpOw0KKyAgICBwcml2YXRlIEVkZ2UgX2VkZ2U0ID0gbmV3IEVkZ2UoX25vZGUyLCBfbm9kZTIsIGZhbHNlKTsNCisNCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7DQorICAgICAgICBfZ3JhcGguYWRkTm9kZShfbm9kZTEpOw0KKyAgICAgICAgX2dyYXBoLmFkZE5vZGUoX25vZGUyKTsNCisgICAgICAgIF9ncmFwaC5hZGROb2RlKF9ub2RlMyk7DQorICAgICAgICBfZ3JhcGguYWRkRWRnZShfZWRnZTEpOw0KKyAgICAgICAgX2dyYXBoLmFkZEVkZ2UoX2VkZ2UyKTsNCisgICAgICAgIF9ncmFwaC5hZGRFZGdlKF9lZGdlMyk7DQorICAgICAgICBfZ3JhcGguYWRkRWRnZShfZWRnZTQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUZXN0cyBhZGRpbmcgYW5kIHJldHJpZXZpbmcgbm9kZXMgYW5kIGVkZ2VzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJldHJpZXZlKCkgew0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIF9ncmFwaC5nZXROb2RlcygpLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoNCwgX2dyYXBoLmdldEVkZ2VzKCkuc2l6ZSgpKTsNCisNCisgICAgICAgIENvbGxlY3Rpb24gZWRnZXMgPSBfZ3JhcGguZ2V0RWRnZXNGcm9tKF9ub2RlMSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZWRnZXMuc2l6ZSgpKTsNCisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGVkZ2VzLml0ZXJhdG9yKCk7DQorICAgICAgICBFZGdlIGVkZ2UwID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICBFZGdlIGVkZ2UxID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICBhc3NlcnRUcnVlKChlZGdlMCA9PSBfZWRnZTEgJiYgZWRnZTEgPT0gX2VkZ2UzKQ0KKyAgICAgICAgICAgIHx8IChlZGdlMCA9PSBfZWRnZTMgJiYgZWRnZTEgPT0gX2VkZ2UxKSk7DQorDQorICAgICAgICBlZGdlcyA9IF9ncmFwaC5nZXRFZGdlc1RvKF9ub2RlMSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZWRnZXMuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhfZWRnZTMsIGVkZ2VzLml0ZXJhdG9yKCkubmV4dCgpKTsNCisNCisgICAgICAgIGVkZ2VzID0gX2dyYXBoLmdldEVkZ2VzKF9ub2RlMSwgX25vZGUzKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9lZGdlMywgZWRnZXMuaXRlcmF0b3IoKS5uZXh0KCkpOw0KKyAgICAgICAgZWRnZXMgPSBfZ3JhcGguZ2V0RWRnZXMoX25vZGUzLCBfbm9kZTEpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkZ2VzLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoX2VkZ2UzLCBlZGdlcy5pdGVyYXRvcigpLm5leHQoKSk7DQorDQorICAgICAgICBlZGdlcyA9IF9ncmFwaC5nZXRFZGdlc0Zyb20oX25vZGUyKTsNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgaXRyID0gZWRnZXMuaXRlcmF0b3IoKTsNCisgICAgICAgIGVkZ2UwID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICBlZGdlMSA9IChFZGdlKSBpdHIubmV4dCgpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgoZWRnZTAgPT0gX2VkZ2UyICYmIGVkZ2UxID09IF9lZGdlNCkNCisgICAgICAgICAgICB8fCAoZWRnZTAgPT0gX2VkZ2U0ICYmIGVkZ2UxID09IF9lZGdlMikpOw0KKw0KKyAgICAgICAgZWRnZXMgPSBfZ3JhcGguZ2V0RWRnZXNUbyhfbm9kZTIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGVkZ2VzLnNpemUoKSk7DQorICAgICAgICBpdHIgPSBlZGdlcy5pdGVyYXRvcigpOw0KKyAgICAgICAgZWRnZTAgPSAoRWRnZSkgaXRyLm5leHQoKTsNCisgICAgICAgIGVkZ2UxID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICBhc3NlcnRUcnVlKChlZGdlMCA9PSBfZWRnZTEgJiYgZWRnZTEgPT0gX2VkZ2U0KQ0KKyAgICAgICAgICAgIHx8IChlZGdlMCA9PSBfZWRnZTQgJiYgZWRnZTEgPT0gX2VkZ2UxKSk7DQorDQorICAgICAgICBlZGdlcyA9IF9ncmFwaC5nZXRFZGdlcyhfbm9kZTIsIF9ub2RlMik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZWRnZXMuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhfZWRnZTQsIGVkZ2VzLml0ZXJhdG9yKCkubmV4dCgpKTsNCisNCisgICAgICAgIGVkZ2VzID0gX2dyYXBoLmdldEVkZ2VzRnJvbShfbm9kZTMpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkZ2VzLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoX2VkZ2UzLCBlZGdlcy5pdGVyYXRvcigpLm5leHQoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRlc3QgcmVtb3ZpbmcgZWRnZXMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWRnZXMoKSB7DQorICAgICAgICBhc3NlcnRUcnVlKF9ncmFwaC5yZW1vdmVFZGdlKF9lZGdlMikpOw0KKyAgICAgICAgQ29sbGVjdGlvbiBlZGdlcyA9IF9ncmFwaC5nZXRFZGdlc0Zyb20oX25vZGUyKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9lZGdlNCwgZWRnZXMuaXRlcmF0b3IoKS5uZXh0KCkpOw0KKw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShfZ3JhcGgucmVtb3ZlRWRnZShfZWRnZTMpKTsNCisgICAgICAgIGVkZ2VzID0gX2dyYXBoLmdldEVkZ2VzRnJvbShfbm9kZTEpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkZ2VzLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoX2VkZ2UxLCBlZGdlcy5pdGVyYXRvcigpLm5leHQoKSk7DQorICAgICAgICBlZGdlcyA9IF9ncmFwaC5nZXRFZGdlc1RvKF9ub2RlMSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZWRnZXMuc2l6ZSgpKTsNCisgICAgICAgIGVkZ2VzID0gX2dyYXBoLmdldEVkZ2VzVG8oX25vZGUzKTsNCisgICAgICAgIGFzc2VydEVxdWFscygwLCBlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgZWRnZXMgPSBfZ3JhcGguZ2V0RWRnZXNGcm9tKF9ub2RlMyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZWRnZXMuc2l6ZSgpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGVzdCByZW1vdmluZyBub2Rlcy4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlcygpIHsNCisgICAgICAgIGFzc2VydFRydWUoX2dyYXBoLnJlbW92ZU5vZGUoX25vZGUzKSk7DQorICAgICAgICBDb2xsZWN0aW9uIGVkZ2VzID0gX2dyYXBoLmdldEVkZ2VzKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZWRnZXMuc2l6ZSgpKTsNCisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGVkZ2VzLml0ZXJhdG9yKCk7DQorICAgICAgICBFZGdlIGVkZ2UwID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICBFZGdlIGVkZ2UxID0gKEVkZ2UpIGl0ci5uZXh0KCk7DQorICAgICAgICBhc3NlcnRUcnVlKChlZGdlMCA9PSBfZWRnZTEgJiYgZWRnZTEgPT0gX2VkZ2U0KQ0KKyAgICAgICAgICAgIHx8IChlZGdlMCA9PSBfZWRnZTQgJiYgZWRnZTEgPT0gX2VkZ2UxKSk7DQorICAgICAgICBlZGdlcyA9IF9ncmFwaC5nZXRFZGdlc0Zyb20oX25vZGUxKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBlZGdlcy5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9lZGdlMSwgZWRnZXMuaXRlcmF0b3IoKS5uZXh0KCkpOw0KKyAgICAgICAgZWRnZXMgPSBfZ3JhcGguZ2V0RWRnZXNUbyhfbm9kZTEpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVkZ2VzLnNpemUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KKyAgICAgICAgbWFpbihUZXN0R3JhcGguY2xhc3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRMaXN0VGVzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Jlc3VsdExpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzOTU1NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9SZXN1bHRMaXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudGVzdC5BYnN0cmFjdFRlc3RDYXNlOworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgUmVzdWx0TGlzdH0gaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXN1bHRMaXN0VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBSZXN1bHRMaXN0W10gX2xpc3RzID0gbnVsbDsKKworICAgIHB1YmxpYyBSZXN1bHRMaXN0VGVzdChTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSByZXN1bHQgbGlzdCB0byB1c2Ugd2l0aCB0aGUgZ2l2ZW4gcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlc3VsdExpc3QgZ2V0UmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciBwcm92aWRlcik7CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0byBjdXN0b21pemUgdGhlIHJlc3VsdCBvYmplY3QgcHJvdmlkZXIgYmVpbmcgdXNlZC4gWW91CisgICAgICogY2FuIHJldHVybiBtdWx0aXBsZSBwcm92aWRlcnMgdG8gdGVzdCB3aXRoIGVhY2guCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3VsdE9iamVjdFByb3ZpZGVyW10gZ2V0UmVzdWx0T2JqZWN0UHJvdmlkZXJzKExpc3QgbGlzdCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyW117CisgICAgICAgICAgICBuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGxpc3QpCisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgUmVzdWx0T2JqZWN0UHJvdmlkZXJbXSByb3BzID0gZ2V0UmVzdWx0T2JqZWN0UHJvdmlkZXJzKHJlc3VsdHMpOworICAgICAgICBfbGlzdHMgPSBuZXcgUmVzdWx0TGlzdFtyb3BzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgX2xpc3RzW2ldID0gZ2V0UmVzdWx0TGlzdChyb3BzW2ldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSBfbGlzdHNbaV0uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKDsgaXRyLmhhc05leHQoKTsgY291bnQrKykKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoY291bnQpLCBpdHIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAsIGNvdW50KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJBZnRlciBsYXN0LiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpb29iKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yTW9kaWZpY2F0aW9uKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSBfbGlzdHNbaV0uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJBbGxvd2VkIG1vZGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yRm9yd2FyZCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIExpc3RJdGVyYXRvciBpdHIgPSBfbGlzdHNbaV0ubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZm9yICg7IGl0ci5oYXNOZXh0KCk7IGNvdW50KyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQsIGl0ci5uZXh0SW5kZXgoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGNvdW50KSwgaXRyLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBjb3VudCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZmFpbCgiQWZ0ZXIgbGFzdC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW9vYikgeworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuc2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbmRleCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIExpc3RJdGVyYXRvciBpdHIgPSBfbGlzdHNbaV0ubGlzdEl0ZXJhdG9yKDUwKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDUwOworICAgICAgICAgICAgZm9yICg7IGl0ci5oYXNOZXh0KCk7IGNvdW50KyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQsIGl0ci5uZXh0SW5kZXgoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGNvdW50KSwgaXRyLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBjb3VudCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZmFpbCgiQWZ0ZXIgbGFzdC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW9vYikgeworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuc2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JSZXZlcnNlKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIGl0ciA9IF9saXN0c1tpXS5saXN0SXRlcmF0b3IoMTAwKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDk5OworICAgICAgICAgICAgZm9yICg7IGl0ci5oYXNQcmV2aW91cygpOyBjb3VudC0tKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LCBpdHIucHJldmlvdXNJbmRleCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoY291bnQpLCBpdHIucHJldmlvdXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGNvdW50KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXRyLnByZXZpb3VzKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiQmVmb3JlIGZpcnN0LiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpb29iKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck1vZGlmaWNhdGlvbigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIGl0ciA9IF9saXN0c1tpXS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGl0ci5zZXQoImZvbyIpOworICAgICAgICAgICAgICAgIGZhaWwoIkFsbG93ZWQgbW9kaWZpY2F0aW9uLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUl0ZXJhdGlvbnMoKSB7CisgICAgICAgIHRlc3RMaXN0SXRlcmF0b3JJbmRleCgpOworICAgICAgICB0ZXN0TGlzdEl0ZXJhdG9yRm9yd2FyZCgpOworICAgICAgICB0ZXN0TGlzdEl0ZXJhdG9yUmV2ZXJzZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoX2xpc3RzW2ldLmNvbnRhaW5zKCIwIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShfbGlzdHNbaV0uY29udGFpbnMoIjUwIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShfbGlzdHNbaV0uY29udGFpbnMoIjk5IikpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoX2xpc3RzW2ldLmNvbnRhaW5zKCItMSIpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKF9saXN0c1tpXS5jb250YWlucygiMTAwIikpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoX2xpc3RzW2ldLmNvbnRhaW5zKG51bGwpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoX2xpc3RzW2ldLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdCisgICAgICAgICAgICAgICAgeyAiMCIsICI1MCIsICI5OSIgfSkpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKF9saXN0c1tpXS5jb250YWluc0FsbChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXQorICAgICAgICAgICAgICAgIHsgIjAiLCAiLTEiLCAiOTkiIH0pKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZpY2F0aW9uKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfbGlzdHNbaV0uYWRkKCJmb28iKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJBbGxvd2VkIG1vZGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfbGlzdHNbaV0ucmVtb3ZlKCIxIik7CisgICAgICAgICAgICAgICAgZmFpbCgiQWxsb3dlZCBtb2RpZmljYXRpb24uIik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX2xpc3RzW2ldLnNldCgwLCAiZm9vIik7CisgICAgICAgICAgICAgICAgZmFpbCgiQWxsb3dlZCBtb2RpZmljYXRpb24uIik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCZWdpbigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaiksIF9saXN0c1tpXS5nZXQoaikpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfbGlzdHNbaV0uZ2V0KC0xKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJCZWZvcmUgYmVnaW4uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlvb2IpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbnNlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWlkZGxlKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGZvciAoaW50IGogPSA1MDsgaiA8IDYwOyBqKyspCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGopLCBfbGlzdHNbaV0uZ2V0KGopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RW5kKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDkwOyBqIDwgMTAwOyBqKyspCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGopLCBfbGlzdHNbaV0uZ2V0KGopKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgX2xpc3RzW2ldLmdldCgxMDApOworICAgICAgICAgICAgICAgIGZhaWwoIlBhc3QgZW5kLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpb29iKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJldmVyc2UoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDk5OyBqID4gLTE7IGotLSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaiksIF9saXN0c1tpXS5nZXQoaikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUdldCgpIHsKKyAgICAgICAgdGVzdEdldE1pZGRsZSgpOworICAgICAgICB0ZXN0R2V0QmVnaW4oKTsKKyAgICAgICAgdGVzdEdldEVuZCgpOworCisgICAgICAgIC8vIHRha2UgbGlzdCBzaXplIGFuZCB0cmF2ZXJzZSBsaXN0IHRvIGNhY2hlIHZhbHVlcyBpZiBub3QgYWxyZWFkeQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIF9saXN0c1tpXS5zaXplKCk7CisgICAgICAgIHRlc3RMaXN0SXRlcmF0b3JGb3J3YXJkKCk7CisKKyAgICAgICAgdGVzdEdldE1pZGRsZSgpOworICAgICAgICB0ZXN0R2V0QmVnaW4oKTsKKyAgICAgICAgdGVzdEdldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGFzc2VydFRydWUoX2xpc3RzW2ldLnNpemUoKSA9PSAxMDAKKyAgICAgICAgICAgICAgICB8fCBfbGlzdHNbaV0uc2l6ZSgpID09IEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyW10gcm9wcyA9IGdldFJlc3VsdE9iamVjdFByb3ZpZGVycworICAgICAgICAgICAgKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFJlc3VsdExpc3QgbGlzdCA9IGdldFJlc3VsdExpc3Qocm9wc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdEVhZ2VyUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RFYWdlclJlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE4MzBjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RFYWdlclJlc3VsdExpc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgRWFnZXJSZXN1bHRMaXN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdEVhZ2VyUmVzdWx0TGlzdCBleHRlbmRzIFJlc3VsdExpc3RUZXN0IHsKKworICAgIHB1YmxpYyBUZXN0RWFnZXJSZXN1bHRMaXN0KFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZXN1bHRMaXN0IGdldFJlc3VsdExpc3QoUmVzdWx0T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFYWdlclJlc3VsdExpc3QocHJvdmlkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbWFpbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0TGF6eUZvcndhcmRSZXN1bHRMaXN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdExhenlGb3J3YXJkUmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjIwOWYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdExhenlGb3J3YXJkUmVzdWx0TGlzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBMYXp5Rm9yd2FyZFJlc3VsdExpc3R9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TGF6eUZvcndhcmRSZXN1bHRMaXN0IGV4dGVuZHMgUmVzdWx0TGlzdFRlc3QgeworCisgICAgcHVibGljIFRlc3RMYXp5Rm9yd2FyZFJlc3VsdExpc3QoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlc3VsdExpc3QgZ2V0UmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICByZXR1cm4gbmV3IExhenlGb3J3YXJkUmVzdWx0TGlzdChwcm92aWRlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBtYWluKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RMaXN0UmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RMaXN0UmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDM1MzYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdExpc3RSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIExpc3RSZXN1bHRMaXN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdExpc3RSZXN1bHRMaXN0IGV4dGVuZHMgUmVzdWx0TGlzdFRlc3QgeworCisgICAgcHVibGljIFRlc3RMaXN0UmVzdWx0TGlzdChTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0TGlzdCBnZXRSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3VsdExpc3QoKChMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIpIHByb3ZpZGVyKS4KKyAgICAgICAgICAgIGdldERlbGVnYXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbWFpbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0TWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0TWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDkwMGJiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlciBleHRlbmRzIFJlc3VsdExpc3RUZXN0IHsKKworICAgIHB1YmxpYyBUZXN0TWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlc3VsdExpc3QgZ2V0UmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICByZXR1cm4gbmV3IFdpbmRvd1Jlc3VsdExpc3QocHJvdmlkZXIsIDEwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0T2JqZWN0UHJvdmlkZXJbXSBnZXRSZXN1bHRPYmplY3RQcm92aWRlcnMoTGlzdCBsaXN0KSB7CisgICAgICAgIC8vIHRlc3QgMyBtZXJnZXM6CisgICAgICAgIC8vIDEuIGZpcnN0IHJvcCBlbXB0eSwKKyAgICAgICAgLy8gMi4gbmVpdGhlciByb3AgZW1wdHkKKyAgICAgICAgLy8gMy4gYm90aCByb3BzIGVtcHR5CisgICAgICAgIFJlc3VsdE9iamVjdFByb3ZpZGVyW10gbWVyZ2VzID0gbmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyWzNdOworICAgICAgICBtZXJnZXNbMF0gPSBuZXcgTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIobmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyW117CisgICAgICAgICAgICBuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpLAorICAgICAgICAgICAgbmV3IExpc3RSZXN1bHRPYmplY3RQcm92aWRlcihsaXN0KSwgfSk7CisKKyAgICAgICAgaW50IG1pZCA9IGxpc3Quc2l6ZSgpIC8gMjsKKyAgICAgICAgTGlzdCBsaXN0MSA9IGxpc3Quc3ViTGlzdCgwLCBtaWQpOworICAgICAgICBMaXN0IGxpc3QyID0gbGlzdC5zdWJMaXN0KG1pZCwgbGlzdC5zaXplKCkpOworICAgICAgICBtZXJnZXNbMV0gPSBuZXcgTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIobmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyW117CisgICAgICAgICAgICBuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGxpc3QxKSwKKyAgICAgICAgICAgIG5ldyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIobGlzdDIpLCB9KTsKKworICAgICAgICBtZXJnZXNbMl0gPSBuZXcgTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIobmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyW117CisgICAgICAgICAgICBuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGxpc3QpLAorICAgICAgICAgICAgbmV3IExpc3RSZXN1bHRPYmplY3RQcm92aWRlcihDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSwgfSk7CisKKyAgICAgICAgcmV0dXJuIG1lcmdlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG1haW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdE9yZGVyZWRNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RPcmRlcmVkTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRlNmJlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RPcmRlcmVkTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RPcmRlcmVkTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIgZXh0ZW5kcyBSZXN1bHRMaXN0VGVzdCB7CisKKyAgICBwdWJsaWMgVGVzdE9yZGVyZWRNZXJnZWRSZXN1bHRPYmplY3RQcm92aWRlcihTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0TGlzdCBnZXRSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgV2luZG93UmVzdWx0TGlzdChwcm92aWRlciwgMTApOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZXN1bHRPYmplY3RQcm92aWRlcltdIGdldFJlc3VsdE9iamVjdFByb3ZpZGVycyhMaXN0IGxpc3QpIHsKKyAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0KTsKKyAgICAgICAgaW50IHF1YXJ0ID0gbGlzdC5zaXplKCkgLyA0OworICAgICAgICBMaXN0IGxpc3QxID0gbmV3IEFycmF5TGlzdChsaXN0LnN1Ykxpc3QoMCwgcXVhcnQpKTsKKyAgICAgICAgTGlzdCBsaXN0MiA9IG5ldyBBcnJheUxpc3QobGlzdC5zdWJMaXN0KHF1YXJ0LCBxdWFydCAqIDIpKTsKKyAgICAgICAgTGlzdCBsaXN0MyA9IG5ldyBBcnJheUxpc3QobGlzdC5zdWJMaXN0KHF1YXJ0ICogMiwgcXVhcnQgKiAzKSk7CisgICAgICAgIExpc3QgbGlzdDQgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc3ViTGlzdChxdWFydCAqIDMsIGxpc3Quc2l6ZSgpKSk7CisKKyAgICAgICAgQ29tcGFyYXRvciBjb21wID0gbmV3IEludFZhbHVlQ29tcGFyYXRvcigpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QxLCBjb21wKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0MiwgY29tcCk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdDMsIGNvbXApOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3Q0LCBjb21wKTsKKworICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlcltdIHJvcHMgPSBuZXcgUmVzdWx0T2JqZWN0UHJvdmlkZXJbXXsKKyAgICAgICAgICAgIG5ldyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIobGlzdDEpLAorICAgICAgICAgICAgbmV3IExpc3RSZXN1bHRPYmplY3RQcm92aWRlcihsaXN0MiksCisgICAgICAgICAgICBuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGxpc3QzKSwKKyAgICAgICAgICAgIG5ldyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIobGlzdDQpLCB9OworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdE9iamVjdFByb3ZpZGVyW117CisgICAgICAgICAgICBuZXcgTWVyZ2VkUmVzdWx0T2JqZWN0UHJvdmlkZXIocm9wcywgY29tcCkKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG1haW4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRWYWx1ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YobzEudG9TdHJpbmcoKSkuCisgICAgICAgICAgICAgICAgY29tcGFyZVRvKEludGVnZXIudmFsdWVPZihvMi50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdFJhbmRvbUFjY2Vzc1Jlc3VsdExpc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTcwOGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdFJhbmRvbUFjY2Vzc1Jlc3VsdExpc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgUmFuZG9tQWNjZXNzUmVzdWx0TGlzdH0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RSYW5kb21BY2Nlc3NSZXN1bHRMaXN0IGV4dGVuZHMgUmVzdWx0TGlzdFRlc3QgeworCisgICAgcHVibGljIFRlc3RSYW5kb21BY2Nlc3NSZXN1bHRMaXN0KFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZXN1bHRMaXN0IGdldFJlc3VsdExpc3QoUmVzdWx0T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSYW5kb21BY2Nlc3NSZXN1bHRMaXN0KHByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG1haW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0UmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzNmZTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlciBleHRlbmRzIFJlc3VsdExpc3RUZXN0IHsKKworICAgIHB1YmxpYyBUZXN0UmFuZ2VSZXN1bHRPYmplY3RQcm92aWRlcihTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0TGlzdCBnZXRSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgV2luZG93UmVzdWx0TGlzdChwcm92aWRlciwgMTApOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZXN1bHRPYmplY3RQcm92aWRlcltdIGdldFJlc3VsdE9iamVjdFByb3ZpZGVycyhMaXN0IGxpc3QpIHsKKyAgICAgICAgLy8gdGVzdCAzIHJhbmdlczoKKyAgICAgICAgLy8gMS4gMCB0byBpbmZpbml0ZQorICAgICAgICAvLyAyLiAwIHRvIE4KKyAgICAgICAgLy8gMy4gTiB0byBOICsgWAorICAgICAgICBSZXN1bHRPYmplY3RQcm92aWRlcltdIHJhbmdlcyA9IG5ldyBSZXN1bHRPYmplY3RQcm92aWRlclszXTsKKyAgICAgICAgcmFuZ2VzWzBdID0gbmV3IFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIKKyAgICAgICAgICAgIChuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGxpc3QpLCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisKKyAgICAgICAgTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdChsaXN0LnNpemUoKSArIDEwKTsKKyAgICAgICAgY29weS5hZGRBbGwobGlzdCk7CisgICAgICAgIGZvciAoaW50IGkgPSBsaXN0LnNpemUoKTsgaSA8IGxpc3Quc2l6ZSgpICsgMTA7IGkrKykKKyAgICAgICAgICAgIGNvcHkuYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgcmFuZ2VzWzFdID0gbmV3IFJhbmdlUmVzdWx0T2JqZWN0UHJvdmlkZXIKKyAgICAgICAgICAgIChuZXcgTGlzdFJlc3VsdE9iamVjdFByb3ZpZGVyKGNvcHkpLCAwLCBsaXN0LnNpemUoKSk7CisKKyAgICAgICAgY29weSA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkgKyAyMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAtMTA7IGkgPCAwOyBpKyspCisgICAgICAgICAgICBjb3B5LmFkZChTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgIGNvcHkuYWRkQWxsKGxpc3QpOworICAgICAgICBmb3IgKGludCBpID0gbGlzdC5zaXplKCk7IGkgPCBsaXN0LnNpemUoKSArIDEwOyBpKyspCisgICAgICAgICAgICBjb3B5LmFkZChTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgIHJhbmdlc1syXSA9IG5ldyBSYW5nZVJlc3VsdE9iamVjdFByb3ZpZGVyCisgICAgICAgICAgICAobmV3IExpc3RSZXN1bHRPYmplY3RQcm92aWRlcihjb3B5KSwgMTAsIGxpc3Quc2l6ZSgpICsgMTApOworCisgICAgICAgIHJldHVybiByYW5nZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBtYWluKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RTaW1wbGVSZXN1bHRMaXN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdFNpbXBsZVJlc3VsdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJlMDZkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RTaW1wbGVSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFNpbXBsZVJlc3VsdExpc3R9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2ltcGxlUmVzdWx0TGlzdCBleHRlbmRzIFJlc3VsdExpc3RUZXN0IHsKKworICAgIHB1YmxpYyBUZXN0U2ltcGxlUmVzdWx0TGlzdChTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0TGlzdCBnZXRSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVzdWx0TGlzdChwcm92aWRlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBtYWluKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RTb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RTb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvVGVzdFNvZnRSYW5kb21BY2Nlc3NSZXN1bHRMaXN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcDsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFNvZnRSYW5kb21BY2Nlc3NSZXN1bHRMaXN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFNvZnRSYW5kb21BY2Nlc3NSZXN1bHRMaXN0IGV4dGVuZHMgUmVzdWx0TGlzdFRlc3QgeworCisgICAgcHVibGljIFRlc3RTb2Z0UmFuZG9tQWNjZXNzUmVzdWx0TGlzdChTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzdWx0TGlzdCBnZXRSZXN1bHRMaXN0KFJlc3VsdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgU29mdFJhbmRvbUFjY2Vzc1Jlc3VsdExpc3QocHJvdmlkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbWFpbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0V2luZG93UmVzdWx0TGlzdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvcm9wL1Rlc3RXaW5kb3dSZXN1bHRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMGQ5YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3JvcC9UZXN0V2luZG93UmVzdWx0TGlzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3A7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBXaW5kb3dSZXN1bHRMaXN0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFdpbmRvd1Jlc3VsdExpc3QgZXh0ZW5kcyBSZXN1bHRMaXN0VGVzdCB7CisKKyAgICBwdWJsaWMgVGVzdFdpbmRvd1Jlc3VsdExpc3QoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlc3VsdExpc3QgZ2V0UmVzdWx0TGlzdChSZXN1bHRPYmplY3RQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICByZXR1cm4gbmV3IFdpbmRvd1Jlc3VsdExpc3QocHJvdmlkZXIsIDEwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG1haW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi90ZXN0L0Fic3RyYWN0VGVzdENhc2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3Rlc3QvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTQwMzcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi90ZXN0L0Fic3RyYWN0VGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDE1NjIgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi50ZXN0Ow0KKw0KK2ltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOw0KK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247DQoraW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsNCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7DQoraW1wb3J0IGphdmEubmV0LlVSTDsNCitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0Ow0KK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5yZWdleHAuUkU7DQoraW1wb3J0IG9yZy5hcGFjaGUucmVnZXhwLlJFU3ludGF4RXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnJlZ2V4cC5SRVV0aWw7DQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZ0ZhY3RvcnlJbXBsOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOw0KKw0KKy8qKg0KKyAqIFRlc3RDYXNlIGZyYW1ld29yayB0byBydW4gdmFyaW91cyB0ZXN0cyBhZ2FpbnN0IHNvbGFybWV0cmljIGNvZGUuDQorICogVGhpcyBjbGFzcyBjb250YWlucyB2YXJpb3VzIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6DQorICogPHVsPg0KKyAqIDxsaT5Vc2luZyBtdWx0aXBsZSwgaXNvbGF0ZWQgQ2xhc3NMb2FkZXJzPC9saT4NCisgKiA8bGk+UnVubmluZyBhIHRlc3QgaW4gbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzPC9saT4NCisgKiA8bGk+QXNzZXJ0aW9uIGhlbHBlcnM8L2xpPg0KKyAqIDxsaT5DcmVhdGluZyByYW5kb20gU3RyaW5ncywgbnVtYmVycywgZXRjLjwvbGk+DQorICogPC91bD4NCisgKg0KKyAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4DQorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NRVRIT0RTID0NCisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eShBYnN0cmFjdFRlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSArICIudGVzdE1ldGhvZHMiKTsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBMQVRGT1JNX0FMTCA9IDIgPDwgMTsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBMQVRGT1JNX1VOS05PV04gPSAyIDw8IDI7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVE9LRU4gPSAiU09MQVJTS0lQIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9ERUxJTUlURVIgPSAifCI7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0NCisgICAgICAgIExvY2FsaXplci5mb3JQYWNrYWdlKEFic3RyYWN0VGVzdENhc2UuY2xhc3MpOw0KKw0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG11bHRpVGhyZWFkRXhlY3V0aW5nID0gbnVsbDsNCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5UaW1lb3V0VGhyZWFkID0gZmFsc2U7DQorDQorICAgIHByaXZhdGUgTG9nIGxvZyA9IG51bGw7DQorDQorICAgIHByaXZhdGUgc3RhdGljIE1hcCBfdGltZXMgPSBuZXcgSGFzaE1hcCgpOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFRlc3RDYXNlIF9sYXN0VGVzdCA9IG51bGw7DQorDQorICAgIHByaXZhdGUgc3RhdGljIFdhdGNoZG9nVGhyZWFkIF93YXRjaGRvZyA9IG5ldyBXYXRjaGRvZ1RocmVhZCgpOw0KKyAgICBwcml2YXRlIGxvbmcgX3RpbWVvdXQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlIGEgdGVzdCBjYXNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KKyAgICAgKi8NCisgICAgcHVibGljIEFic3RyYWN0VGVzdENhc2UoU3RyaW5nIHRlc3QpIHsNCisgICAgICAgIHN1cGVyKHRlc3QpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBYnN0cmFjdFRlc3RDYXNlKCkgew0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgZ2V0TG9nKCkgew0KKyAgICAgICAgaWYgKGxvZyA9PSBudWxsKQ0KKyAgICAgICAgICAgIGxvZyA9IG5ld0xvZygpOw0KKyAgICAgICAgcmV0dXJuIGxvZzsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgTG9nIG5ld0xvZygpIHsNCisgICAgICAgIC8vIHRoaXMgaW1wbGVtZW50YXRpb24gbGVhdmVzIG11Y2ggdG8gYmUgZGVzaXJlZCwgYXMgaXQganVzdA0KKyAgICAgICAgLy8gY3JlYXRlcyBhIG5ldyBMb2dGYWN0b3J5SW1wbCBlYWNoIHRpbWUsIGFuZCBkb2VzIG5vdCBhcHBseQ0KKyAgICAgICAgLy8gYW55IGNvbmZpZ3VyYXRpb25zLg0KKyAgICAgICAgcmV0dXJuIG5ldyBMb2dGYWN0b3J5SW1wbCgpLmdldExvZyhnZXRMb2dOYW1lKCkpOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9nTmFtZSgpIHsNCisgICAgICAgIHJldHVybiAiY29tLnNvbGFybWV0cmljLlJ1bnRpbWUiOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSB3YXRjaGRvZyB0aHJlYWQgaXMgYWJvdXQgdG8ga2lsbCB0aGUgZW50aXJlDQorICAgICAqIEpWTSBkdWUgdG8gYSB0ZXN0IGNhc2UncyB0aW1lb3V0LiBUaGlzIG1ldGhvZCBvZmZlcnMgdGhlDQorICAgICAqIGFiaWxpdHkgdG8gdHJ5IHRvIHJlc29sdmUgd2hhdGV2ZXIgY29udGVudGlvbiBpcyB0YWtpbmcgcGxhY2UNCisgICAgICogaW4gdGhlIHRlc3QuIEl0IHdpbGwgYmUgZ2l2ZW4gMTAgc2Vjb25kcyB0byB0cnkgdG8gZW5kIHRoZQ0KKyAgICAgKiB0ZXN0IHBlYWNlZnVsbHkgYmVmb3JlIHRoZSB3YXRjaGRvZyBleGl0cyB0aGUgSlZNLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlVGltZW91dCgpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsNCisgICAgICAgIGlmIChza2lwVGVzdCgpKSB7DQorICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgdGVzdHMgd2Ugc2tpcCBzbyB0aGF0IHdlIGNhbiBnZXQgYW4NCisgICAgICAgICAgICAvLyBpZGVhIGluIHRoZSBhdXRvYnVpbGQgc3RhdHVzDQorICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFNLSVBfVE9LRU4gKyBTS0lQX0RFTElNSVRFUg0KKyAgICAgICAgICAgICAgICArICgiIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKQ0KKyAgICAgICAgICAgICAgICArICIuIiArIGdldE5hbWUoKSArIFNLSVBfREVMSU1JVEVSKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoX2xhc3RUZXN0ICE9IG51bGwgJiYgX2xhc3RUZXN0LmdldENsYXNzKCkgIT0gZ2V0Q2xhc3MoKSkgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIF9sYXN0VGVzdC50ZWFyRG93blRlc3RDbGFzcygpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQorICAgICAgICAgICAgICAgIGdldExvZygpLmVycm9yKG51bGwsIHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChfbGFzdFRlc3QgPT0gbnVsbCB8fCBfbGFzdFRlc3QuZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKSB7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgc2V0VXBUZXN0Q2xhc3MoKTsNCisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KKyAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcihudWxsLCB0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBfbGFzdFRlc3QgPSB0aGlzOw0KKw0KKyAgICAgICAgLy8gaW5mb3JtIHRoZSB3YXRjaGRvZyB0aHJlYWQgdGhhdCB3ZSBhcmUgZW50ZXJpbmcgdGhlIHRlc3QNCisgICAgICAgIF93YXRjaGRvZy5lbnRlcmluZ1Rlc3QodGhpcyk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHN1cGVyLnJ1bihyZXN1bHQpOw0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICBfd2F0Y2hkb2cubGVhdmluZ1Rlc3QodGhpcyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIElmIHRoaXMgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCBnaXZlbiB0aGUgY3VycmVudA0KKyAgICAgKiBlbnZpcm9ubWVudCwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LiBUaGlzIGFsbG93cyBhIHVuaXQgdGVzdA0KKyAgICAgKiBjbGFzcyB0byBkaXNhYmxlIHRlc3QgY2FzZXMgb24gYSBwZXItbWV0aG9kIGdyYW51bGFyaXR5LCBhbmQNCisgICAgICogcHJldmVudHMgdGhlIHRlc3QgZnJvbSBzaG93aW5nIHVwIGFzIGEgcGFzc2VkIHRlc3QganVzdA0KKyAgICAgKiBiZWNhdXNlIGl0IHdhcyBza2lwcGVkLg0KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZSBtZXRob2Qgc2hvdWxkIG5vdCBiZQ0KKyAgICAgKiBydW4gYWdhaW5zdCBhIGNlcnRhaW4gZGF0YWJhc2UsIHRoaXMgbWV0aG9kIGNvdWxkIGNoZWNrIHRoZQ0KKyAgICAgKiBuYW1lIG9mIHRoZSB0ZXN0IHJlc3VsdCBhbmQgdGhlIGN1cnJlbnQgZGF0YWJhc2UgY29uZmlndXJhdGlvbg0KKyAgICAgKiBpbiBvcmRlciB0byBtYWtlIHRoZSBkZWNpc2lvbjoNCisgICAgICogPHAvPg0KKyAgICAgKiA8Y29kZT4gcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFRlc3QoKSB7DQorICAgICAqIC8vIGRvbid0IHJ1biB3aXRoIHBvaW50YmFzZTogaXQgdXNlcyBhIERhdGFTb3VyY2UsIHdoaWNoDQorICAgICAqIC8vIGNhbid0IGJlIHRyYW5zbGF0ZWQgaW50byBhIEpCb3NzIERhdGFTb3VyY2UgY29uZmlndXJhdGlvbi4NCisgICAgICogaWYgKCJ0ZXN0SkJvc3MiLmVxdWFscyhnZXROYW1lKCkpICYmDQorICAgICAqIGdldEN1cnJlbnRQbGF0Zm9ybSgpID09IFBMQVRGT1JNX1BPSU5UQkFTRSkNCisgICAgICogcmV0dXJuIHRydWU7DQorICAgICAqIH0NCisgICAgICogPC9jb2RlPg0KKyAgICAgKiBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIGV4ZWN1dGlvbiBvZiBhbiBlbnRpcmUgdGVzdCBjYXNlDQorICAgICAqIGNsYXNzIGZvciBhIGdpdmVuIGRhdGFiYXNlLCB5b3UgbWlnaHQgd2FudCB0byBhZGQgdGhlIGNsYXNzIHRvDQorICAgICAqIHRoZSBleGNsdWRlZCB0ZXN0IGxpc3QgaW4gdGhhdCBkYXRhYmFzZSdzIHByb3BlcnRpZXMgZmlsZS4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBUZXN0KCkgew0KKyAgICAgICAgaWYgKFRFU1RfTUVUSE9EUyAhPSBudWxsICYmIFRFU1RfTUVUSE9EUy5sZW5ndGgoKSA+IDApDQorICAgICAgICAgICAgcmV0dXJuIFRFU1RfTUVUSE9EUy5pbmRleE9mKGdldE5hbWUoKSkgPT0gLTE7DQorDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNsYXNzDQorICAgICAqIGlzIGV4ZWN1dGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0VXBUZXN0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNsYXNzDQorICAgICAqIGlzIGV4ZWN1dGVkLiBJdCBjYW4gYmUgdXNlZCB0byBkbyB0aGluZ3MgbGlrZSBjbGVhbiB1cA0KKyAgICAgKiBsYXJnZSwgc2xvdyBwcm9jZXNzZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHN0YXJ0ZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93blRlc3RDbGFzcygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoIm1lbWluZm8iKSkpDQorICAgICAgICAgICAgcHJpbnRNZW1vcnlJbmZvKCk7DQorDQorICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KKyAgICB9DQorDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorICAgIC8vIEdlbmVyYXRpbmcgcmFuZG9tIGRhdGENCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisgICAgLyoqDQorICAgICAqIFN1cHBvcnQgbWV0aG9kIHRvIGdldCBhIHJhbmRvbSBJbnRlZ2VyIGZvciB0ZXN0aW5nLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHJhbmRvbUludCgpIHsNCisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcigoaW50KSAoTWF0aC5yYW5kb20oKSAqIEludGVnZXIuTUFYX1ZBTFVFKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN1cHBvcnQgbWV0aG9kIHRvIGdldCBhIHJhbmRvbSBDaGFyYWN0ZXIgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIENoYXJhY3RlciByYW5kb21DaGFyKCkgew0KKyAgICAgICAgY2hhciBbXSBURVNUX0NIQVJfQVJSQVkgPSBuZXcgY2hhciBbXXsNCisgICAgICAgICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLA0KKyAgICAgICAgICAgICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsDQorICAgICAgICAgICAgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICcxJywNCisgICAgICAgICAgICAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JyB9Ow0KKw0KKyAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoVEVTVF9DSEFSX0FSUkFZWw0KKyAgICAgICAgICAgIChpbnQpIChNYXRoLnJhbmRvbSgpICogVEVTVF9DSEFSX0FSUkFZLmxlbmd0aCldKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3VwcG9ydCBtZXRob2QgdG8gZ2V0IGEgcmFuZG9tIExvbmcgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIExvbmcgcmFuZG9tTG9uZygpIHsNCisgICAgICAgIHJldHVybiBuZXcgTG9uZygobG9uZykgKE1hdGgucmFuZG9tKCkgKiBMb25nLk1BWF9WQUxVRSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdXBwb3J0IG1ldGhvZCB0byBnZXQgYSByYW5kb20gU2hvcnQgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFNob3J0IHJhbmRvbVNob3J0KCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCgoc2hvcnQpIChNYXRoLnJhbmRvbSgpICogU2hvcnQuTUFYX1ZBTFVFKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN1cHBvcnQgbWV0aG9kIHRvIGdldCBhIHJhbmRvbSBEb3VibGUgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIERvdWJsZSByYW5kb21Eb3VibGUoKSB7DQorICAgICAgICByZXR1cm4gbmV3IERvdWJsZSgoZG91YmxlKSAoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogNTAwMGQpKSAvIDEwMDBkKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3VwcG9ydCBtZXRob2QgdG8gZ2V0IGEgcmFuZG9tIEZsb2F0IGZvciB0ZXN0aW5nLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBGbG9hdCByYW5kb21GbG9hdCgpIHsNCisgICAgICAgIHJldHVybiBuZXcgRmxvYXQoKGZsb2F0KSAoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogNTAwMGYpKSAvIDEwMDBmKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3VwcG9ydCBtZXRob2QgdG8gZ2V0IGEgcmFuZG9tIEJ5dGUgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGUgcmFuZG9tQnl0ZSgpIHsNCisgICAgICAgIHJldHVybiBuZXcgQnl0ZSgoYnl0ZSkgKE1hdGgucmFuZG9tKCkgKiBCeXRlLk1BWF9WQUxVRSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdXBwb3J0IG1ldGhvZCB0byBnZXQgYSByYW5kb20gQm9vbGVhbiBmb3IgdGVzdGluZy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiByYW5kb21Cb29sZWFuKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKE1hdGgucmFuZG9tKCkgPiAwLjUgPyB0cnVlIDogZmFsc2UpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdXBwb3J0IG1ldGhvZCB0byBnZXQgYSByYW5kb20gRGF0ZSBmb3IgdGVzdGluZy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSByYW5kb21EYXRlKCkgew0KKyAgICAgICAgbG9uZyBtaWxsaXMgPSAobG9uZykgKE1hdGgucmFuZG9tKCkgKiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQorDQorICAgICAgICAvLyByb3VuZCBtaWxsaXMgdG8gdGhlIG5lYXJlc3QgMTAwMDogdGhpcyBpcyBiZWNhdXNlIHNvbWUNCisgICAgICAgIC8vIGRhdGFiYXNlcyBkbyBub3Qgc3RvcmUgdGhlIG1pbGxpc2Vjb25kcyBjb3JyZWN0bHkoZS5nLiwgTXlTUUwpLg0KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJlYWxseSBhIGJ1ZyB3ZSBzaG91bGQgZml4LiBGQyAjMjcuDQorICAgICAgICBtaWxsaXMgLT0gKG1pbGxpcyAlIDEwMDApOw0KKw0KKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1pbGxpcyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN1cHBvcnQgbWV0aG9kIHRvIGdldCBhIHJhbmRvbSBTdHJpbmcgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByYW5kb21TdHJpbmcoKSB7DQorICAgICAgICAvLyBkZWZhdWx0IHRvIGEgc21hbGwgc3RyaW5nLCBpbiBjYXNlIGNvbHVtbiBzaXplcyBhcmUNCisgICAgICAgIC8vIGxpbWl0ZWQoc3VjaCBhcyB3aXRoIGEgc3RyaW5nIHByaW1hcnkga2V5KQ0KKyAgICAgICAgcmV0dXJuIHJhbmRvbVN0cmluZyg1MCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN1cHBvcnQgbWV0aG9kIHRvIGdldCBhIHJhbmRvbSBTdHJpbmcgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByYW5kb21TdHJpbmcoaW50IGxlbikgew0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgKE1hdGgucmFuZG9tKCkgKiBsZW4pICsgMTsgaSsrKQ0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocmFuZG9tQ2hhcigpKTsNCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3VwcG9ydCBtZXRob2QgdG8gZ2V0IGEgcmFuZG9tIGNsb2IgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByYW5kb21DbG9iKCkgew0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorICAgICAgICB3aGlsZSAoc2J1Zi5sZW5ndGgoKSA8ICg1ICogMTAyNCkpIHsgLy8gYXQgbGVhc3QgNUsNCisgICAgICAgICAgICBzYnVmLmFwcGVuZChyYW5kb21TdHJpbmcoMTAyNCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIHNidWYudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3VwcG9ydCBtZXRob2QgdG8gZ2V0IGEgcmFuZG9tIEJpZ0ludGVnZXIgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgcmFuZG9tQmlnSW50ZWdlcigpIHsNCisgICAgICAgIC8vIHRvbyBtYW55IG9mIG91ciB0ZXN0IGRhdGFiYXNlcyBkb24ndCBzdXBwb3J0IGJpZ2ludHMgPiBNQVhfTE9ORzoNCisgICAgICAgIC8vIEkgZG9uJ3QgbGlrZSBpdCwgYnV0IGZvciBub3csIGxldCdzIG9ubHkgdGVzdCBiZWxvdyBNQVhfTE9ORw0KKyAgICAgICAgQmlnSW50ZWdlciBsbmcgPSBuZXcgQmlnSW50ZWdlcigNCisgICAgICAgICAgICAoKGxvbmcpIChNYXRoLnJhbmRvbSgpICogTG9uZy5NQVhfVkFMVUUpKSArICIiKTsNCisNCisgICAgICAgIEJpZ0ludGVnZXIgbXVsdGlwbGllciA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7DQorICAgICAgICAvLyAoMSArIChpbnQpKE1hdGgucmFuZG9tKCkgKiAxMDAwMCkpICsgIiIpOw0KKyAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAwLjUpDQorICAgICAgICAgICAgbXVsdGlwbGllciA9IG11bHRpcGxpZXIubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoIi0xIikpOw0KKw0KKyAgICAgICAgcmV0dXJuIGxuZy5tdWx0aXBseShtdWx0aXBsaWVyKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3VwcG9ydCBtZXRob2QgdG8gZ2V0IGEgcmFuZG9tIEJpZ0RlY2ltYWwgZm9yIHRlc3RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgcmFuZG9tQmlnRGVjaW1hbCgpIHsNCisgICAgICAgIEJpZ0ludGVnZXIgc3RhcnQgPSByYW5kb21CaWdJbnRlZ2VyKCk7DQorICAgICAgICBTdHJpbmcgc3RyID0gc3RhcnQudG9TdHJpbmcoKTsNCisgICAgICAgIC8vIHRydW5jYXRlIG9mZiB0aGUgbGFzdCA4IGRpZ2l0czogd2Ugc3RpbGwgZ2V0IHNvbWUNCisgICAgICAgIC8vIG92ZXJmbG93cyB3aXRoIGxhbWUgZGF0YWJhc2VzLg0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspDQorICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGgoKSA+IDIpDQorICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCgpIC0gMSk7DQorICAgICAgICBzdGFydCA9IG5ldyBCaWdJbnRlZ2VyKHN0cik7DQorDQorICAgICAgICBTdHJpbmcgdmFsID0gc3RhcnQgKyAiLiIgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpDQorICAgICAgICAgICAgKyAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCkpOw0KKw0KKyAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHZhbCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN1cHBvcnQgbWV0aG9kIHRvIGdldCBhIHJhbmRvbSBibG9iIGZvciB0ZXN0aW5nLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gcmFuZG9tQmxvYigpIHsNCisgICAgICAgIC8vIHVwIHRvIDEwMEsgYmxvYg0KKyAgICAgICAgYnl0ZSBbXSBibG9iID0gbmV3IGJ5dGUgWyhpbnQpIChNYXRoLnJhbmRvbSgpICogMTAyNCAqIDEwMCldOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9iLmxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIGJsb2JbaV0gPSByYW5kb21CeXRlKCkuYnl0ZVZhbHVlKCk7DQorDQorICAgICAgICByZXR1cm4gYmxvYjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSW52b2tlIHNldHRlcnMgZm9yIHBpbWl0aXZlcyBhbmQgcHJpbWl0aXZlIHdyYXBwZXJzIG9uIHRoZQ0KKyAgICAgKiBzcGVjaWZpZWQgb2JqZWN0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgcmFuZG9taXplQmVhbihPYmplY3QgYmVhbikNCisgICAgICAgIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLA0KKyAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7DQorICAgICAgICBCZWFuSW5mbyBpbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW4uZ2V0Q2xhc3MoKSk7DQorICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgW10gcHJvcHMgPSBpbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBNZXRob2Qgd3JpdGUgPSBwcm9wc1tpXS5nZXRXcml0ZU1ldGhvZCgpOw0KKyAgICAgICAgICAgIGlmICh3cml0ZSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICAgICBDbGFzcyBbXSBwYXJhbXMgPSB3cml0ZS5nZXRQYXJhbWV0ZXJUeXBlcygpOw0KKyAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCB8fCBwYXJhbXMubGVuZ3RoICE9IDEpDQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZSA9IHBhcmFtc1swXTsNCisgICAgICAgICAgICBPYmplY3QgYXJnID0gbnVsbDsNCisNCisgICAgICAgICAgICBpZiAocGFyYW1UeXBlID09IGJvb2xlYW4uY2xhc3MgfHwgcGFyYW1UeXBlID09IEJvb2xlYW4uY2xhc3MpDQorICAgICAgICAgICAgICAgIGFyZyA9IHJhbmRvbUJvb2xlYW4oKTsNCisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbVR5cGUgPT0gYnl0ZS5jbGFzcyB8fCBwYXJhbVR5cGUgPT0gQnl0ZS5jbGFzcykNCisgICAgICAgICAgICAgICAgYXJnID0gcmFuZG9tQnl0ZSgpOw0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZSA9PSBjaGFyLmNsYXNzIHx8IHBhcmFtVHlwZSA9PSBDaGFyYWN0ZXIuY2xhc3MpDQorICAgICAgICAgICAgICAgIGFyZyA9IHJhbmRvbUNoYXIoKTsNCisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbVR5cGUgPT0gc2hvcnQuY2xhc3MgfHwgcGFyYW1UeXBlID09IFNob3J0LmNsYXNzKQ0KKyAgICAgICAgICAgICAgICBhcmcgPSByYW5kb21TaG9ydCgpOw0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZSA9PSBpbnQuY2xhc3MgfHwgcGFyYW1UeXBlID09IEludGVnZXIuY2xhc3MpDQorICAgICAgICAgICAgICAgIGFyZyA9IHJhbmRvbUludCgpOw0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZSA9PSBsb25nLmNsYXNzIHx8IHBhcmFtVHlwZSA9PSBMb25nLmNsYXNzKQ0KKyAgICAgICAgICAgICAgICBhcmcgPSByYW5kb21Mb25nKCk7DQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1UeXBlID09IGRvdWJsZS5jbGFzcyB8fCBwYXJhbVR5cGUgPT0gRG91YmxlLmNsYXNzKQ0KKyAgICAgICAgICAgICAgICBhcmcgPSByYW5kb21Eb3VibGUoKTsNCisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbVR5cGUgPT0gZmxvYXQuY2xhc3MgfHwgcGFyYW1UeXBlID09IEZsb2F0LmNsYXNzKQ0KKyAgICAgICAgICAgICAgICBhcmcgPSByYW5kb21GbG9hdCgpOw0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZSA9PSBTdHJpbmcuY2xhc3MpDQorICAgICAgICAgICAgICAgIGFyZyA9IHJhbmRvbVN0cmluZygpOw0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZSA9PSBCaWdJbnRlZ2VyLmNsYXNzKQ0KKyAgICAgICAgICAgICAgICBhcmcgPSByYW5kb21CaWdJbnRlZ2VyKCk7DQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1UeXBlID09IEJpZ0RlY2ltYWwuY2xhc3MpDQorICAgICAgICAgICAgICAgIGFyZyA9IHJhbmRvbUJpZ0RlY2ltYWwoKTsNCisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbVR5cGUgPT0gRGF0ZS5jbGFzcykNCisgICAgICAgICAgICAgICAgYXJnID0gcmFuZG9tRGF0ZSgpOw0KKw0KKyAgICAgICAgICAgIGlmIChhcmcgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgd3JpdGUuaW52b2tlKGJlYW4sIG5ldyBPYmplY3QgW117IGFyZyB9KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBiZWFuOw0KKyAgICB9DQorDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8NCisgICAgLy8gTXVsdGkgdGhyZWFkaW5nDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisgICAgLyoqDQorICAgICAqIFJlLWV4ZWN1dGUgdGhlIGludm9raW5nIG1ldGhvZCBhIHJhbmRvbSBudW1iZXIgb2YgdGltZXMNCisgICAgICogaW4gYSByYW5kb20gbnVtYmVyIG9mIFRocmVhZHMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtdHRlc3QoKSB0aHJvd3MgVGhyZWFkaW5nRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIDYgaXRlcmF0aW9ucyBpbiA4IHRocmVhZHMgaXMgYSBnb29kIHRyYWRlLW9mZiBiZXR3ZWVuDQorICAgICAgICAvLyB0ZXN0cyB0YWtpbmcgd2F5IHRvbyBsb25nIGFuZCBoYXZpbmcgYSBkZWNlbnQgY2hhbmNlIG9mDQorICAgICAgICAvLyBpZGVudGlmeWluZyBNVCBwcm9ibGVtcy4NCisgICAgICAgIGludCBpdGVyYXRpb25zID0gNjsNCisgICAgICAgIGludCB0aHJlYWRzID0gODsNCisNCisgICAgICAgIG10dGVzdCh0aHJlYWRzLCBpdGVyYXRpb25zKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRXhlY3V0ZSB0aGUgY2FsbGluZyBtZXRob2QgPGNvZGU+aXRlcmF0aW9uczwvY29kZT4NCisgICAgICogdGltZXMgaW4gPGNvZGU+dGhyZWFkczwvY29kZT4gVGhyZWFkcy4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIG10dGVzdChpbnQgdGhyZWFkcywgaW50IGl0ZXJhdGlvbnMpIHsNCisgICAgICAgIG10dGVzdCgwLCB0aHJlYWRzLCBpdGVyYXRpb25zKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBtdHRlc3QoaW50IHNlcmlhbENvdW50LCBpbnQgdGhyZWFkcywgaW50IGl0ZXJhdGlvbnMpDQorICAgICAgICB0aHJvd3MgVGhyZWFkaW5nRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gY2FsbGluZ01ldGhvZCgibXR0ZXN0Iik7DQorICAgICAgICBtdHRlc3Qoc2VyaWFsQ291bnQsIHRocmVhZHMsIGl0ZXJhdGlvbnMsIG1ldGhvZE5hbWUsIG5ldyBPYmplY3QgWzBdKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRXhlY3V0ZSBhIHRlc3QgbWV0aG9kIGluIG11bHRpcGxlIHRocmVhZHMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0aHJlYWRzIHRoZSBudW1iZXIgb2YgVGhyZWFkcyB0byBydW4gaW4NCisgICAgICogQHBhcmFtIGl0ZXJhdGlvbnMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgbWV0aG9kIHNob3VsZA0KKyAgICAgKiBiZSBleGVjdXRlIGluIGEgc2luZ2xlIFRocmVhZA0KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gZXhlY3V0ZQ0KKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZA0KKyAgICAgKiBAdGhyb3dzIFRocmVhZGluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvcnMgb2NjdXIgaW4NCisgICAgICogYW55IG9mIHRoZSBUaHJlYWRzLiBUaGUgYWN0dWFsIGV4Y2VwdGlvbnMNCisgICAgICogd2lsbCBiZSBlbWJlZGRlZCBpbiB0aGUgZXhjZXB0aW9uLiBOb3RlIHRoYXQNCisgICAgICogdGhpcyBtZWFucyB0aGF0IGFzc2VydCgpIGZhaWx1cmVzIHdpbGwgYmUNCisgICAgICogdHJlYXRlZCBhcyBlcnJvcnMgcmF0aGVyIHRoYW4gd2FybmluZ3MuDQorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtdHRlc3QoaW50IHRocmVhZHMsIGludCBpdGVyYXRpb25zLCBmaW5hbCBTdHJpbmcgbWV0aG9kLA0KKyAgICAgICAgZmluYWwgT2JqZWN0IFtdIGFyZ3MpIHRocm93cyBUaHJlYWRpbmdFeGNlcHRpb24gew0KKyAgICAgICAgbXR0ZXN0KDAsIHRocmVhZHMsIGl0ZXJhdGlvbnMsIG1ldGhvZCwgYXJncyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgbXR0ZXN0KGludCBzZXJpYWxDb3VudCwNCisgICAgICAgIGludCB0aHJlYWRzLCBpbnQgaXRlcmF0aW9ucywgZmluYWwgU3RyaW5nIG1ldGhvZCwgZmluYWwgT2JqZWN0IFtdIGFyZ3MpDQorICAgICAgICB0aHJvd3MgVGhyZWFkaW5nRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChtdWx0aVRocmVhZEV4ZWN1dGluZyAhPSBudWxsICYmIG11bHRpVGhyZWFkRXhlY3V0aW5nLmVxdWFscyhtZXRob2QpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIHdlIGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nIGluIG11bHRpLXRocmVhZGVkIG1vZGU6DQorICAgICAgICAgICAgLy8gZG9uJ3QgZGVhZGxvY2shDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbXVsdGlUaHJlYWRFeGVjdXRpbmcgPSBtZXRob2Q7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzIFtdIHBhcmFtQ2xhc3NlcyA9IG5ldyBDbGFzcyBbYXJncy5sZW5ndGhdOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1DbGFzc2VzLmxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICBwYXJhbUNsYXNzZXNbaV0gPSBhcmdzW2ldLmdldENsYXNzKCk7DQorDQorICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGg7DQorDQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgbWV0aCA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZCwgcGFyYW1DbGFzc2VzKTsNCisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGhyZWFkaW5nRXhjZXB0aW9uKG5zbWUudG9TdHJpbmcoKSwgbnNtZSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0aGl6ID0gdGhpczsNCisNCisgICAgICAgICAgICBtdHRlc3QoInJlZmxlY3Rpb24gaW52b2NhdGlvbjogKCIgKyBtZXRob2QgKyAiKSIsDQorICAgICAgICAgICAgICAgIHNlcmlhbENvdW50LCB0aHJlYWRzLCBpdGVyYXRpb25zLCBuZXcgVm9sYXRpbGVSdW5uYWJsZSgpIHsNCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICAgICAgICAgICAgICBtZXRoLmludm9rZSh0aGl6LCBhcmdzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0pOw0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICBtdWx0aVRocmVhZEV4ZWN1dGluZyA9IG51bGw7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgbXR0ZXN0KFN0cmluZyB0aXRsZSwgZmluYWwgaW50IHRocmVhZHMsIGZpbmFsIGludCBpdGVyYXRpb25zLA0KKyAgICAgICAgZmluYWwgVm9sYXRpbGVSdW5uYWJsZSBydW5uZXIpIHRocm93cyBUaHJlYWRpbmdFeGNlcHRpb24gew0KKyAgICAgICAgbXR0ZXN0KHRpdGxlLCAwLCB0aHJlYWRzLCBpdGVyYXRpb25zLCBydW5uZXIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBFeGVjdXRlIGEgdGVzdCBtZXRob2QgaW4gbXVsdGlwbGUgdGhyZWFkcy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHRpdGxlIGEgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QsIGZvciBpbmNsdXNpb24gaW4gdGhlDQorICAgICAqIGVycm9yIG1lc3NhZ2UNCisgICAgICogQHBhcmFtIHNlcmlhbENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcnVuIHRoZSBtZXRob2QNCisgICAgICogc2VyaWFsbHkgYmVmb3JlIHNwYXduaW5nIHRocmVhZHMuDQorICAgICAqIEBwYXJhbSB0aHJlYWRzIHRoZSBudW1iZXIgb2YgVGhyZWFkcyB0byBydW4gaW4NCisgICAgICogQHBhcmFtIGl0ZXJhdGlvbnMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgbWV0aG9kIHNob3VsZA0KKyAgICAgKiBAcGFyYW0gcnVubmVyIHRoZSBWb2xhdGlsZVJ1bm5hYmxlIHRoYXQgd2lsbCBleGVjdXRlDQorICAgICAqIHRoZSBhY3R1YWwgdGVzdCBmcm9tIHdpdGhpbiB0aGUgVGhyZWFkLg0KKyAgICAgKiBAdGhyb3dzIFRocmVhZGluZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvcnMgb2NjdXIgaW4NCisgICAgICogYW55IG9mIHRoZSBUaHJlYWRzLiBUaGUgYWN0dWFsIGV4Y2VwdGlvbnMNCisgICAgICogd2lsbCBiZSBlbWJlZGRlZCBpbiB0aGUgZXhjZXB0aW9uLiBOb3RlIHRoYXQNCisgICAgICogdGhpcyBtZWFucyB0aGF0IGFzc2VydCgpIGZhaWx1cmVzIHdpbGwgYmUNCisgICAgICogdHJlYXRlZCBhcyBlcnJvcnMgcmF0aGVyIHRoYW4gd2FybmluZ3MuDQorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4IGJlIGV4ZWN1dGUgaW4gYSBzaW5nbGUgVGhyZWFkDQorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtdHRlc3QoU3RyaW5nIHRpdGxlLCBmaW5hbCBpbnQgc2VyaWFsQ291bnQsDQorICAgICAgICBmaW5hbCBpbnQgdGhyZWFkcywgZmluYWwgaW50IGl0ZXJhdGlvbnMsIGZpbmFsIFZvbGF0aWxlUnVubmFibGUgcnVubmVyKQ0KKyAgICAgICAgdGhyb3dzIFRocmVhZGluZ0V4Y2VwdGlvbiB7DQorICAgICAgICBmaW5hbCBMaXN0IGV4Y2VwdGlvbnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBMaW5rZWRMaXN0KCkpOw0KKw0KKyAgICAgICAgVGhyZWFkIFtdIHJ1bm5lcnMgPSBuZXcgVGhyZWFkIFt0aHJlYWRzXTsNCisNCisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIDEwMDA7DQorDQorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSB0aHJlYWRzOyBpKyspIHsNCisgICAgICAgICAgICBmaW5hbCBpbnQgdGhpc1RocmVhZCA9IGk7DQorDQorICAgICAgICAgICAgcnVubmVyc1tpIC0gMV0gPQ0KKyAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKHRpdGxlICsgIiBbIiArIGkgKyAiIG9mICIgKyB0aHJlYWRzICsgIl0iKSB7DQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gb3VyIGJlc3QgdG8gaGF2ZSBhbGwgdGhyZWFkcyBzdGFydCBhdCB0aGUgZXhhY3QNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHRpbWUuIFRoaXMgaXMgaW1wZXJmZWN0LCBidXQgdGhlIGNsb3NlciB3ZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0byBldmVyeW9uZSBzdGFydGluZyBhdCB0aGUgc2FtZSB0aW1lLCB0aGUNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR0ZXIgY2hhbmNlIHdlIGhhdmUgZm9yIGlkZW50aWZ5aW5nIE1UIHByb2JsZW1zLg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IHN0YXJ0TWlsbGlzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCgpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aGlzSXRlcmF0aW9uID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdGhpc0l0ZXJhdGlvbiA8PSBpdGVyYXRpb25zOyB0aGlzSXRlcmF0aW9uKyspDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGdvIGdvIQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmVyLnJ1bigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGVycm9yKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZXhjZXB0aW9ucykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWQgdGhlIGV4Y2VwdGlvbiBpbnRvIHNvbWV0aGluZyB0aGF0IGdpdmVzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cyBzb21lIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRocmVhZGluZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBUaHJlYWRpbmdFeGNlcHRpb24oInRocmVhZD0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnRvU3RyaW5nKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7dGhyZWFkTnVtPSIgKyB0aGlzVGhyZWFkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiO21heFRocmVhZHM9IiArIHRocmVhZHMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7aXRlcmF0aW9uPSIgKyB0aGlzSXRlcmF0aW9uDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiO21heEl0ZXJhdGlvbnM9IiArIGl0ZXJhdGlvbnMsIGVycm9yKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH07DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBzdGFydCB0aGUgc2VyaWFsIHRlc3RzKGRvZXMgbm90IHNwYXduIHRoZSB0aHJlYWRzKQ0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJpYWxDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgcnVubmVyc1swXS5ydW4oKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIHN0YXJ0IHRoZSBtdWx0aXRocmVhZGVkDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHM7IGkrKykgew0KKyAgICAgICAgICAgIHJ1bm5lcnNbaV0uc3RhcnQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZW0gYWxsIHRvIGNvbXBsZXRlDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHM7IGkrKykgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIHJ1bm5lcnNbaV0uam9pbigpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoZXhjZXB0aW9ucy5zaXplKCkgPT0gMCkNCisgICAgICAgICAgICByZXR1cm47IC8vIHN3ZWVlZWVlZWV0OiBubyBlcnJvcnMNCisNCisgICAgICAgIC8vIGVtYmVkIGFsbCB0aGUgZXhjZXB0aW9ucyB0aGF0IHdlcmUgdGhyb3dzIGludG8gYQ0KKyAgICAgICAgLy8gVGhyZWFkaW5nRXhjZXB0aW9uDQorICAgICAgICBUaHJvd2FibGUgW10gZXJyb3JzID0gKFRocm93YWJsZSBbXSkgZXhjZXB0aW9ucy50b0FycmF5KA0KKyAgICAgICAgICAgIG5ldyBUaHJvd2FibGUgWzBdKTsNCisgICAgICAgIHRocm93IG5ldyBUaHJlYWRpbmdFeGNlcHRpb24oIlRoZSAiDQorICAgICAgICAgICAgKyBlcnJvcnMubGVuZ3RoICsgIiBlbWJlZGRlZCBlcnJvcnMgIg0KKyAgICAgICAgICAgICsgIm9jY3VyZWQgaW4gdGhlIGV4ZWN1dGlvbiBvZiAiICsgaXRlcmF0aW9ucyArICIgaXRlcmF0aW9ucyAiDQorICAgICAgICAgICAgKyAib2YgIiArIHRocmVhZHMgKyAiIHRocmVhZHM6IFsiICsgdGl0bGUgKyAiXSIsIGVycm9ycyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIHRvcC1sZXZlbCBleGVjdXRpb24gc3RhY2suDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3RUaHJlYWQoKSB7DQorICAgICAgICByZXR1cm4gbXVsdGlUaHJlYWRFeGVjdXRpbmcgPT0gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSBsYXN0IG1ldGhvZCBuYW1lIHRoYXQgY2FsbGVkIHRoaXMgb25lIGJ5DQorICAgICAqIHBhcnNpbmcgdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBleGNsdWRlIGEgbWV0aG9kIG5hbWUgdG8gc2tpcA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGUgY2FsbGluZyBtZXRob2QgY291bGQgbm90IGJlDQorICAgICAqIGlkZW50aWZpZWQuDQorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4DQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGNhbGxpbmdNZXRob2QoU3RyaW5nIGV4Y2x1ZGUpIHsNCisgICAgICAgIC8vIGRldGVybWluZSB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBtZXRob2QgYnkNCisgICAgICAgIC8vIGxvb2tpbmcgYXQgdGhlIHN0YWNrIHRyYWNrLiBIYWNraXNoLCBidXQgY29udmVuaWVudC4NCisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCisgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7DQorICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciBzdGFja1RyYWNlID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdy50b1N0cmluZygpLA0KKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7DQorICAgICAgICAgICAgc3RhY2tUcmFjZS5oYXNNb3JlVG9rZW5zKCk7KSB7DQorICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBzdGFja1RyYWNlLm5leHRUb2tlbigpLnRyaW0oKTsNCisNCisgICAgICAgICAgICAvLyBub3QgYSBzdGFjayB0cmFjZSBlbGVtZW50DQorICAgICAgICAgICAgaWYgKCEobGluZS5zdGFydHNXaXRoKCJhdCAiKSkpDQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgIFN0cmluZyBmdWxsTWV0aG9kTmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigiKCIpKTsNCisNCisgICAgICAgICAgICBTdHJpbmcgc2hvcnRNZXRob2ROYW1lID0gZnVsbE1ldGhvZE5hbWUuc3Vic3RyaW5nKA0KKyAgICAgICAgICAgICAgICBmdWxsTWV0aG9kTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQorDQorICAgICAgICAgICAgLy8gc2tpcCBvdXIgb3duIG1ldGhvZHMhDQorICAgICAgICAgICAgaWYgKHNob3J0TWV0aG9kTmFtZS5lcXVhbHMoImNhbGxpbmdNZXRob2QiKSkNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCAmJiBzaG9ydE1ldGhvZE5hbWUuZXF1YWxzKGV4Y2x1ZGUpKQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICAgICByZXR1cm4gc2hvcnRNZXRob2ROYW1lOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IGlkZW50aWZ5IGNhbGxpbmcgIg0KKyAgICAgICAgICAgICsgIm1ldGhvZCBpbiBzdGFjayB0cmFjZSIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBIFJ1bm5hYmxlIHRoYXQgY2FuIHRocm93IGFuIEV4Y2VwdGlvbjogdXNlZCB0byB0ZXN0IGNhc2VzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sYXRpbGVSdW5uYWJsZSB7DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBFeGNlcHRpb24gZm9yIGVycm9ycyBjYXVnaHQgZHVyaW5nIHRocmVhZGluZyB0ZXN0cy4NCisgICAgICovDQorICAgIHB1YmxpYyBjbGFzcyBUaHJlYWRpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsNCisNCisgICAgICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlW10gX25lc3RlZDsNCisNCisgICAgICAgIHB1YmxpYyBUaHJlYWRpbmdFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIG5lc3RlZCkgew0KKyAgICAgICAgICAgIHN1cGVyKG1zZyk7DQorICAgICAgICAgICAgaWYgKG5lc3RlZCA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICBfbmVzdGVkID0gbmV3IFRocm93YWJsZVswXTsNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIF9uZXN0ZWQgPSBuZXcgVGhyb3dhYmxlW117IG5lc3RlZCB9Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFRocmVhZGluZ0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGVbXSBuZXN0ZWQpIHsNCisgICAgICAgICAgICBzdXBlcihtc2cpOw0KKyAgICAgICAgICAgIGlmIChuZXN0ZWQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgX25lc3RlZCA9IG5ldyBUaHJvd2FibGVbMF07DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBfbmVzdGVkID0gbmVzdGVkOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgew0KKyAgICAgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBvdXQpIHsNCisgICAgICAgICAgICBwcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG91dCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIG91dCkgew0KKyAgICAgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX25lc3RlZC5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIk5lc3RlZCBUaHJvd2FibGUgIyIgKyAoaSArIDEpICsgIjogIik7DQorICAgICAgICAgICAgICAgIF9uZXN0ZWRbaV0ucHJpbnRTdGFja1RyYWNlKG91dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8vLy8vLy8vLy8NCisgICAgLy8gVGltaW5nDQorICAgIC8vLy8vLy8vLy8NCisNCisgICAgLyoqDQorICAgICAqIFNsZWVwIHRoZSBjdXJyZW50IFRocmVhZCBmb3IgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgZnJvbSAwLTEwMDAgbXMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzbGVlcFJhbmRvbSgpIHsNCisgICAgICAgIHNsZWVwUmFuZG9tKDEwMDApOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTbGVlcCB0aGUgY3VycmVudCBUaHJlYWQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGZyb20NCisgICAgICogMC08Y29kZT5tYXg8L2NvZGU+IG1zLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2xlZXBSYW5kb20oaW50IG1heCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKChsb25nKSAoTWF0aC5yYW5kb20oKSAqIG1heCkpOw0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmUtcnVuIHRoaXMgbWV0aG9kIGluIHRoZSBjdXJyZW50IHRocmVhZCwgdGltaW5nIG91dA0KKyAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzLg0KKyAgICAgKiBVc2FnZToNCisgICAgICogPHByZT4gcHVibGljIHZvaWQgdGltZU91dE9wZXJhdGlvbigpIHsgaWYgKHRpbWVvdXQoNSAqIDEwMDApKSByZXR1cm47DQorICAgICAqICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwICogMTAwMCk7IH0NCisgICAgICogPC9wcmU+DQorICAgICAqIDxwLz4NCisgICAgICogPHAvPg0KKyAgICAgKiA8c3Ryb25nPldhcm5pbmc8L3N0cm9uZz4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LA0KKyAgICAgKiBhbmQgb25seSB3aGVuIHlvdSBleHBlY3QgdGhhdCBhIHRpbWVvdXQgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPg0KKyAgICAgKiBvY2N1ci4gSXQgdXRpbGl6ZWQgdGhlIGRlcHJlY2F0ZWQge0BsaW5rIFRocmVhZCNzdG9wKCl9IGFuZA0KKyAgICAgKiB7QGxpbmsgVGhyZWFkI2ludGVycnVwdH0gbWV0aG9kcywgd2hpY2ggY2FuIGxlYXZlIG1vbml0b3JzIGluIGFuDQorICAgICAqIGludmFsaWQgc3RhdGUuIEl0IGlzIG9ubHkgdXNlZCBiZWNhdXNlIGl0IHByb3ZpZGVzIG1vcmUNCisgICAgICogbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbiB0aGFuIGp1c3Qgc2VlaW5nIHRoYXQgdGhlIGVudGlyZSBhdXRvYnVpbGQNCisgICAgICogdGltZWQgb3V0Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWlsbGlzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHNob3VsZCB3YWl0Lg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgYXJlIGFyZSBpbiB0aGUgdGhyZWFkIHRoYXQgcmVxdWVzdGVkIHRoZQ0KKyAgICAgKiAgICAgICAgIHRpbWVvdXQsIGZhbHNlIGlmIHdlIGFyZSBpbiB0aGUgdGltZW91dCB0aHJlYWQgaXRzZWxmLg0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gdGltZW91dChsb25nIG1pbGxpcykgdGhyb3dzIFRocm93YWJsZSB7DQorICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGNhbGxpbmdNZXRob2QoInRpbWVvdXQiKTsNCisgICAgICAgIHJldHVybiB0aW1lb3V0KG1pbGxpcywgbWV0aG9kTmFtZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBzZWUgI3RpbWVvdXQobG9uZykNCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIHRpbWVvdXQobG9uZyBtaWxsaXMsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsNCisgICAgICAgIC8vIHdlIGFyZSBpbiB0aGUgdGltaW5nIG91dC10aHJlYWQ6IGRvIG5vdGhpbmcgc28gdGhlDQorICAgICAgICAvLyBhY3R1YWwgdGVzdCBtZXRob2QgY2FuIHJ1bg0KKyAgICAgICAgaWYgKGluVGltZW91dFRocmVhZCkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorDQorICAgICAgICBpblRpbWVvdXRUaHJlYWQgPSB0cnVlOw0KKyAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBtaWxsaXM7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSBnZXRDbGFzcygpLg0KKyAgICAgICAgICAgICAgICBnZXRNZXRob2QobWV0aG9kTmFtZSwgKENsYXNzW10pIG51bGwpOw0KKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0aHogPSB0aGlzOw0KKw0KKyAgICAgICAgICAgIC8vIHNwYXduIHRocmVhZA0KKyAgICAgICAgICAgIFRpbWVPdXRUaHJlYWQgdG90ID0gbmV3IFRpbWVPdXRUaHJlYWQoIlRpbWVPdXRUaHJlYWQgWyINCisgICAgICAgICAgICAgICAgKyBtZXRob2ROYW1lICsgIl0gKCIgKyBtaWxsaXMgKyAibXMpIikgew0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQorICAgICAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UodGh6LCAoT2JqZWN0W10pIG51bGwpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSB0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfTsNCisNCisgICAgICAgICAgICB0b3Quc3RhcnQoKTsNCisNCisgICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvciBhIHRpbWVvdXQgdG8gb2NjdXINCisgICAgICAgICAgICB0b3Quam9pbihtaWxsaXMpOw0KKw0KKyAgICAgICAgICAgIC8vIGhhdmUgd2UgdGltZWQgb3V0PyBLaWxsIHRoZSB0aHJlYWQgYW5kIHRocm93IGFuIGV4Y2VwdGlvbg0KKyAgICAgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+PSBlbmRUaW1lKSB7DQorICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSB3YWl0aW5nIG9uIGEgbW9uaXRvciwgdGhpcyB3aWxsIGdpdmUNCisgICAgICAgICAgICAgICAgLy8gdXMgYSB1c2VmdWwgc3RhY2sgdHJhY2UuDQorICAgICAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgICAgICB0b3QuaW50ZXJydXB0KCk7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MDApOw0KKw0KKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8ga2lsbCB0aGUgdGhyZWFkDQorICAgICAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgICAgICB0b3Quc3RvcCgpOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgew0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoNTAwKTsNCisNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvblRpbWVkT3V0RXhjZXB0aW9uKCJFeGVjdXRpb24gb2YgXCIiDQorICAgICAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUgKyAiXCIgdGltZWQgb3V0IGFmdGVyICINCisgICAgICAgICAgICAgICAgICAgICsgbWlsbGlzICsgIiBtaWxsaXNlY29uZHMiLCB0b3QudGhyb3dhYmxlKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gdGhyb3cgYW55IGV4Y2VwdGlvbnMgdGhhdCBtYXkgaGF2ZSBvY2N1cmVkDQorICAgICAgICAgICAgaWYgKHRvdC50aHJvd2FibGUgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgdGhyb3cgdG90LnRocm93YWJsZTsNCisNCisgICAgICAgICAgICAvLyBJIGd1ZXNzIGV2ZXJ5dGhpbmcgd2FzIE9LDQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgICAgIGluVGltZW91dFRocmVhZCA9IGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBzdGFydCBhIHByb2ZpbGUuDQorICAgICAqDQorICAgICAqIEBzZWUgI2VuZFByb2ZpbGUoU3RyaW5nKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc3RhcnRQcm9maWxlKFN0cmluZyBuYW1lKSB7DQorICAgICAgICBfdGltZXMucHV0KG5hbWUsIG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFV0aWxpdHkgdG8gZW5kIHRoZSBwcm9maWxlIGFuZCBwcmludCBvdXQgdGhlIHRpbWUuIEV4YW1wbGUgdXNhZ2U6DQorICAgICAqIDxwLz4NCisgICAgICogPHByZT48Y29kZT4gc3RhcnRQcm9maWxlKCJTb21lIGxvbmcgdGFzayIpOyBkb1NvbWVMb25nVGFzaygpOw0KKyAgICAgKiBlbmRQcm9maWxlKCJTb21lIGxvbmcgdGFzayIpOw0KKyAgICAgKiA8L2NvZGU+PC9wcmU+DQorICAgICAqDQorICAgICAqIEBwYXJhbSBuYW1lDQorICAgICAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhpcyBwcm9maWxlIGludm9jYXRpb24gdG9vaywgb3INCisgICAgICogICAgICAgICAtMSBpZiA8Y29kZT5uYW1lPC9jb2RlPiB3YXMgbmV2ZXIgc3RhcnRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGVuZFByb2ZpbGUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIExvbmcgdGltZSA9IChMb25nKSBfdGltZXMucmVtb3ZlKG5hbWUpOw0KKw0KKyAgICAgICAgbG9uZyBlbGFwc2VkID0gLTE7DQorICAgICAgICBpZiAodGltZSAhPSBudWxsKQ0KKyAgICAgICAgICAgIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUubG9uZ1ZhbHVlKCk7DQorDQorICAgICAgICBnZXRMb2coKS5pbmZvKF9sb2MuZ2V0KCJwcm9maWxlLWluZm8iLCBuYW1lLA0KKyAgICAgICAgICAgICh0aW1lID09IG51bGwgPyAiPz8/IiA6ICIiICsgZWxhcHNlZCkpKTsNCisgICAgICAgIHJldHVybiBlbGFwc2VkOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRpbWVPdXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgew0KKw0KKyAgICAgICAgcHVibGljIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOw0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29tcGxldGVkID0gZmFsc2U7DQorDQorICAgICAgICBwdWJsaWMgVGltZU91dFRocmVhZChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgICAgIHN1cGVyKG5hbWUpOw0KKyAgICAgICAgICAgIHNldERhZW1vbih0cnVlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSW5kaWNhdGVzIHRoYXQgYSB0aW1lb3V0IG9jY3VyZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhdGlvblRpbWVkT3V0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7DQorDQorICAgICAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSBfZXJyOw0KKw0KKyAgICAgICAgcHVibGljIE9wZXJhdGlvblRpbWVkT3V0RXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsNCisgICAgICAgICAgICBzdXBlcihtc2cpOw0KKyAgICAgICAgICAgIF9lcnIgPSB0aHJvd2FibGU7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7DQorICAgICAgICAgICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgew0KKyAgICAgICAgICAgIHByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIob3V0KSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7DQorICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7DQorICAgICAgICAgICAgaWYgKF9lcnIgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIk5lc3RlZCBUaHJvd2FibGU6ICIpOw0KKyAgICAgICAgICAgICAgICBfZXJyLnByaW50U3RhY2tUcmFjZShvdXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorICAgIC8vIENsYXNzTG9hZGVyIGZ1bmN0aW9ucw0KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGUgYSBDbGFzc0xvYWRlciB0aGF0IHdpbGwgbm90IHVzZSB0aGUgcGFyZW50DQorICAgICAqIENsYXNzTG9hZGVyIHRvIHJlc29sdmUgY2xhc3Nlcy4gVGhpcyBpcyB1c2VmdWwgZm9yDQorICAgICAqIHRlc3RpbmcgaW50ZXJhY3Rpb25zIGJldHdlZW4gS29kbyBpbiBydW5uaW5nDQorICAgICAqIGluIENsYXNzTG9hZGVyQSBhbmQgaW5zdGFuY2VzIGluIENsYXNzTG9hZGVyQi4NCisgICAgICovDQorICAgIHB1YmxpYyBDbGFzc0xvYWRlciBjcmVhdGVJc29sYXRlZENsYXNzTG9hZGVyKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBJc29sYXRlZENsYXNzTG9hZGVyKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIE5lc3RlZENsYXNzTG9hZGVyIGNyZWF0ZU5lc3RlZENsYXNzTG9hZGVyKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBOZXN0ZWRDbGFzc0xvYWRlcihmYWxzZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIE5lc3RlZENsYXNzTG9hZGVyIGNyZWF0ZU5lc3RlZFBhcmVudENsYXNzTG9hZGVyKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBOZXN0ZWRDbGFzc0xvYWRlcih0cnVlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVsb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MgaW4gYW4gaXNvbGF0ZWQgQ2xhc3NMb2FkZXIuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBjbGFzcyB0byBsb2FkDQorICAgICAqIEByZXR1cm4gdGhlIENsYXNzIGFzIHJlbG9hZGVkIGluIGFuIG5ldyBDbGFzc0xvYWRlcg0KKyAgICAgKi8NCisgICAgcHVibGljIENsYXNzIGlzb2xhdGUoQ2xhc3MgdGFyZ2V0KSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQorICAgICAgICBDbGFzcyByZXN1bHQgPSBpc29sYXRlKHRhcmdldC5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gdGFyZ2V0KTsNCisgICAgICAgIGFzc2VydE5vdEVxdWFscyhyZXN1bHQsIHRhcmdldCk7DQorICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRDbGFzc0xvYWRlcigpICE9IHRhcmdldC5nZXRDbGFzc0xvYWRlcigpKTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgcHVibGljIENsYXNzIGlzb2xhdGUoU3RyaW5nIHRhcmdldCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KKyAgICAgICAgQ2xhc3NMb2FkZXIgaWwgPSBjcmVhdGVJc29sYXRlZENsYXNzTG9hZGVyKCk7DQorICAgICAgICBDbGFzcyByZXN1bHQgPSBpbC5sb2FkQ2xhc3ModGFyZ2V0KTsNCisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TmFtZSgpLCB0YXJnZXQpOw0KKw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ2xhc3MgbmVzdChDbGFzcyB0YXJnZXQpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCisgICAgICAgIENsYXNzTG9hZGVyIGlsID0gY3JlYXRlTmVzdGVkQ2xhc3NMb2FkZXIoKTsNCisgICAgICAgIENsYXNzIHJlc3VsdCA9IGlsLmxvYWRDbGFzcyh0YXJnZXQuZ2V0TmFtZSgpKTsNCisgICAgICAgIGFzc2VydFRydWUocmVzdWx0ICE9IHRhcmdldCk7DQorICAgICAgICBhc3NlcnROb3RFcXVhbHMocmVzdWx0LCB0YXJnZXQpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0Q2xhc3NMb2FkZXIoKSAhPSB0YXJnZXQuZ2V0Q2xhc3NMb2FkZXIoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldE5hbWUoKSwgdGFyZ2V0LmdldE5hbWUoKSk7DQorDQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgaXNvbGF0ZU5ldyhDbGFzcyB0YXJnZXQpDQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwNCisgICAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIGlzb2xhdGUodGFyZ2V0KS5uZXdJbnN0YW5jZSgpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZENsYXNzTG9hZGVyIGV4dGVuZHMgQW50Q2xhc3NMb2FkZXIgew0KKw0KKyAgICAgICAgcHVibGljIE5lc3RlZENsYXNzTG9hZGVyKGJvb2xlYW4gdXNlUGFyZW50KSB7DQorICAgICAgICAgICAgc3VwZXIoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSwgdXNlUGFyZW50KTsNCisNCisgICAgICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciBjbHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoDQorICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIiksIEZpbGUucGF0aFNlcGFyYXRvcik7DQorICAgICAgICAgICAgICAgIGNsdG9rLmhhc01vcmVUb2tlbnMoKTspIHsNCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjbHRvay5uZXh0VG9rZW4oKTsNCisNCisgICAgICAgICAgICAgICAgLy8gb25seSBsb2FkIHRlc3QgcGF0aHMsIG5vdCBqYXIgZmlsZXMNCisgICAgICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZigiLmphciIpICE9IC0xKQ0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi56aXAiKSAhPSAtMSkNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgICAgICBhZGRQYXRoRWxlbWVudChwYXRoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgaWYgKCF1c2VQYXJlbnQpIHsNCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobG9hZENsYXNzDQorICAgICAgICAgICAgICAgICAgICAgICAgKEFic3RyYWN0VGVzdENhc2UuY2xhc3MuZ2V0TmFtZSgpKS5nZXRDbGFzc0xvYWRlcigpDQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gQWJzdHJhY3RUZXN0Q2FzZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgew0KKyAgICAgICAgICAgICAgICBmYWlsKGNuZmUudG9TdHJpbmcoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KKyAgICAgICAgICAgIC8vIGRvbid0IGlzb2xhdGUgUEMgYW5kIHJlbGF0ZWQgY2xhc3NlcyBpbiBrb2RvLmVuaG5hY2UNCisgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCIuZW5oYW5jZS4iKSAhPSAtMSkNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7DQorICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiL2VuaGFuY2UvIikgIT0gLTEpDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOw0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5maW5kQ2xhc3MobmFtZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEEgQ2xhc3NMb2FkZXIgdGhhdCBpcyBjb21wbGV0ZWx5IGlzb2xhdGVkIHdpdGggcmVzcGVjdCB0bw0KKyAgICAgKiBhbnkgY2xhc3NlcyB0aGF0IGFyZSBsb2FkZWQgaW4gdGhlIFN5c3RlbSBDbGFzc0xvYWRlci4NCisgICAgICoNCisgICAgICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgNCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzb2xhdGVkQ2xhc3NMb2FkZXIgZXh0ZW5kcyBOZXN0ZWRDbGFzc0xvYWRlciB7DQorDQorICAgICAgICBwdWJsaWMgSXNvbGF0ZWRDbGFzc0xvYWRlcigpIHsNCisgICAgICAgICAgICBzdXBlcihmYWxzZSk7DQorICAgICAgICAgICAgc2V0SXNvbGF0ZWQoZmFsc2UpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8vLy8vLy8vLy8vLy8vLw0KKyAgICAvLyBDb2xsZWN0aW9ucw0KKyAgICAvLy8vLy8vLy8vLy8vLy8NCisNCisgICAgLyoqDQorICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIHNwZWNpZmllZCB7QGxpbmsgQ29sbGVjdGlvbn0gZnVsZmlsbHMgdGhlDQorICAgICAqIENvbGxlY3Rpb24gY29udHJhY3QgYXMgc3BlY2lmaWVkIGJ5IHRoZSBDb2xsZWN0aW9ucyBBUEkuDQorICAgICAqIDxwLz4NCisgICAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBkb2VzIG5vdCB2YWxpZGF0ZSBtdXRhYmxlIG9wZXJhdGlvbnMNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7DQorICAgICAgICBpbnQgc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZSgpOw0KKyAgICAgICAgaW50IGl0ZXJhdGVkID0gMDsNCisgICAgICAgIC8vIGVuc3VyZSB3ZSBjYW4gd2FsayBhbG9uZyB0aGUgaXRlcmF0b3INCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgaXRlcmF0ZWQrKzsNCisgICAgICAgICAgICBpLm5leHQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGVuc3VyZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpdGVyYXRlZCBpcyB0aGUgc2FtZSBhcyB0aGUgbGlzdCBzaXplDQorICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgaXRlcmF0ZWQpOw0KKw0KKyAgICAgICAgLy8gYWxzbyB2YWxpZGF0ZSB0aGUgbGlzdA0KKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0KSB7DQorICAgICAgICAgICAgTGlzdCBsbCA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQ0KKyAgICAgICAgICAgICAgICBsbC5hZGQobmV3IEludGVnZXIoaSkpOw0KKyAgICAgICAgICAgIHZhbGlkYXRlTGlzdCgoTGlzdCkgbGwpOw0KKyAgICAgICAgICAgIHZhbGlkYXRlTGlzdCgoTGlzdCkgY29sbGVjdGlvbik7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIHNwZWNpZmllZCB7QGxpbmsgTGlzdH0gZnVsZmlsbHMgdGhlDQorICAgICAqIExpc3QgY29udHJhY3QgYXMgc3BlY2lmaWVkIGJ5IHRoZSBDb2xsZWN0aW9ucyBBUEkuDQorICAgICAqIDxwLz4NCisgICAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBkb2VzIG5vdCB2YWxpZGF0ZSBtdXRhYmxlIG9wZXJhdGlvbnMNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxpc3QoTGlzdCBsaXN0KSB7DQorICAgICAgICBPYmplY3QgW10gY29yZVZhbHVlcyA9IGxpc3QudG9BcnJheSgpOw0KKyAgICAgICAgT2JqZWN0IFtdIHZhbHVlczEgPSBuZXcgT2JqZWN0IFtsaXN0LnNpemUoKV07DQorICAgICAgICBPYmplY3QgW10gdmFsdWVzMiA9IG5ldyBPYmplY3QgW2xpc3Quc2l6ZSgpXTsNCisgICAgICAgIE9iamVjdCBbXSB2YWx1ZXMzID0gbmV3IE9iamVjdCBbbGlzdC5zaXplKCldOw0KKyAgICAgICAgT2JqZWN0IFtdIHZhbHVlczQgPSBuZXcgT2JqZWN0IFtsaXN0LnNpemUoKV07DQorDQorICAgICAgICAvLyBmaWxsIHNlcXVlbnRpYWwgaW5kZXggYWNjZXNzIGxpc3QNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykNCisgICAgICAgICAgICB2YWx1ZXMxW2ldID0gbGlzdC5nZXQoaSk7DQorDQorICAgICAgICAvLyBmaWxsIHNlcXVlbnRpYWwgbGlzdA0KKyAgICAgICAgaW50IGluZGV4ID0gMDsNCisgICAgICAgIExpc3RJdGVyYXRvciBpdGVyOw0KKyAgICAgICAgZm9yIChpdGVyID0gbGlzdC5saXN0SXRlcmF0b3IoMCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbmRleCwgaXRlci5uZXh0SW5kZXgoKSk7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGluZGV4LCBpdGVyLnByZXZpb3VzSW5kZXgoKSArIDEpOw0KKyAgICAgICAgICAgIHZhbHVlczJbaW5kZXhdID0gaXRlci5uZXh0KCk7DQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKHZhbHVlczJbaW5kZXhdKSk7DQorICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGVuc3VyZSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlzIHRocm93biBhcyBhcHByb3ByaWF0ZQ0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBpdGVyLm5leHQoKTsNCisgICAgICAgICAgICBmYWlsKCJuZXh0KCkgc2hvdWxkIGhhdmUgcmVzdWx0ZWQgaW4gYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIik7DQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsNCisgICAgICAgIH0gLy8gYXMgZXhwZWN0ZWQNCisNCisgICAgICAgIC8vIGZpbGwgcmV2ZXJzZSBzZXF1ZW50aWFsIGxpc3QNCisgICAgICAgIGludCBiYWNrID0gMDsNCisgICAgICAgIGZvciAoaXRlciA9IGxpc3QubGlzdEl0ZXJhdG9yKGxpc3Quc2l6ZSgpKTsgaXRlci5oYXNQcmV2aW91cygpOykgew0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbmRleCwgaXRlci5wcmV2aW91c0luZGV4KCkgKyAxKTsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXgsIGl0ZXIubmV4dEluZGV4KCkpOw0KKyAgICAgICAgICAgIHZhbHVlczNbLS1pbmRleF0gPSBpdGVyLnByZXZpb3VzKCk7DQorICAgICAgICAgICAgYmFjaysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpLCBiYWNrKTsNCisNCisgICAgICAgIC8vIGVuc3VyZSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlzIHRocm93biBhcyBhcHByb3ByaWF0ZQ0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBpdGVyLnByZXZpb3VzKCk7DQorICAgICAgICAgICAgZmFpbCgicHJldmlvdXMoKSBzaG91bGQgaGF2ZSByZXN1bHRlZCBpbiBhICINCisgICAgICAgICAgICAgICAgKyAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIpOw0KKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICB9IC8vIGFzIGV4cGVjdGVkDQorDQorICAgICAgICAvLyBmaWxsIHJhbmRvbSBhY2Nlc3MgbGlzdA0KKyAgICAgICAgTGlzdCBpbmRpY2VzID0gbmV3IExpbmtlZExpc3QoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykNCisgICAgICAgICAgICBpbmRpY2VzLmFkZChuZXcgSW50ZWdlcihpKSk7DQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpbnQgcmFuZCA9IChpbnQpIChNYXRoLnJhbmRvbSgpICogaW5kaWNlcy5zaXplKCkpOw0KKyAgICAgICAgICAgIEludGVnZXIgcmFuZEluZGV4ID0gKEludGVnZXIpIGluZGljZXMucmVtb3ZlKHJhbmQpOw0KKyAgICAgICAgICAgIHZhbHVlczRbcmFuZEluZGV4LmludFZhbHVlKCldID0gbGlzdC5nZXQocmFuZEluZGV4LmludFZhbHVlKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzMSkpOw0KKyAgICAgICAgYXNzZXJ0SWRlbnRpY2FsKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzMSkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzMikpOw0KKyAgICAgICAgYXNzZXJ0SWRlbnRpY2FsKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzMikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzNCkpOw0KKyAgICAgICAgYXNzZXJ0SWRlbnRpY2FsKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzNCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzMykpOw0KKyAgICAgICAgYXNzZXJ0SWRlbnRpY2FsKEFycmF5cy5hc0xpc3QoY29yZVZhbHVlcyksIEFycmF5cy5hc0xpc3QodmFsdWVzMykpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gTGlzdCBjb250YWluIHRoZSBleGFjdCBzYW1lDQorICAgICAqIGVsZW1lbnRzLiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBub3JtYWwgTGlzdCBjb250cmFjdCwgd2hpY2gNCisgICAgICogc3RhdGVzIHRoYXQgbGlzdDEuZXF1YWxzKGxpc3QyKSBpZiBlYWNoIGVsZW1lbnQgZTEuZXF1YWxzKGUyKS4NCisgICAgICogVGhpcyBtZXRob2QgYXNzZXJ0cyB0aGF0IGUxID09IG4yLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydElkZW50aWNhbChMaXN0IGMxLCBMaXN0IGMyKSB7DQorICAgICAgICBhc3NlcnRFcXVhbHMoYzEuc2l6ZSgpLCBjMi5zaXplKCkpOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpMSA9IGMxLml0ZXJhdG9yKCksIGkyID0gYzIuaXRlcmF0b3IoKTsNCisgICAgICAgICAgICBpMS5oYXNOZXh0KCkgJiYgaTIuaGFzTmV4dCgpOykNCisgICAgICAgICAgICBhc3NlcnRUcnVlKGkxLm5leHQoKSA9PSBpMi5uZXh0KCkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgY29sbGVjdGlvbiBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBvcmRlcmVkDQorICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRPcmRlcmVkKENvbGxlY3Rpb24gYywgQ29tcGFyYXRvciBjb21wKSB7DQorICAgICAgICBMaXN0IGwxID0gbmV3IExpbmtlZExpc3QoYyk7DQorICAgICAgICBMaXN0IGwyID0gbmV3IExpbmtlZExpc3QoYyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsNCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobDIsIGNvbXApOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7DQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGwxLCBjb21wKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhsMSwgbDIpOw0KKyAgICB9DQorDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vDQorICAgIC8vIEFzc2VydGlvbiBIZWxwZXJzDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhPYmplY3QgYSwgT2JqZWN0IGIpIHsNCisgICAgICAgIGlmIChhID09IG51bGwgJiYgYiAhPSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGlmIChhICE9IG51bGwgJiYgYiA9PSBudWxsKQ0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGlmICghKGEuZXF1YWxzKGIpKSkNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICBpZiAoIShiLmVxdWFscyhhKSkpDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgZmFpbCgiZXhwZWN0ZWQgITwiICsgYSArICI+LmVxdWFscyg8IiArIGIgKyAiPikiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRTaXplKGludCBzaXplLCBPYmplY3Qgb2IpIHsNCisgICAgICAgIGlmIChvYiA9PSBudWxsKSB7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIDApOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChvYiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pDQorICAgICAgICAgICAgb2IgPSAoKENvbGxlY3Rpb24pIG9iKS5pdGVyYXRvcigpOw0KKyAgICAgICAgaWYgKG9iIGluc3RhbmNlb2YgSXRlcmF0b3IpIHsNCisgICAgICAgICAgICBJdGVyYXRvciBpID0gKEl0ZXJhdG9yKSBvYjsNCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOw0KKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgew0KKyAgICAgICAgICAgICAgICBjb3VudCsrOw0KKyAgICAgICAgICAgICAgICBpLm5leHQoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIGNvdW50KTsNCisgICAgICAgIH0gZWxzZQ0KKyAgICAgICAgICAgIGZhaWwoImFzc2VydFNpemU6IGV4cGVjdGVkIENvbGxlY3Rpb24sIEl0ZXJhdG9yLCAiDQorICAgICAgICAgICAgICAgICsgIlF1ZXJ5LCBvciBFeHRlbnQsIGJ1dCBnb3QgIiArIG9iLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCisgICAgfQ0KKw0KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisgICAgLy8gR2VuZXJpYyB1dGlsaXRpZXMNCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgIHB1YmxpYyB2b2lkIGNvcHkoRmlsZSBmcm9tLCBGaWxlIHRvKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgY29weShuZXcgRmlsZUlucHV0U3RyZWFtKGZyb20pLCB0byk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgRmlsZSB0bykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRvKTsNCisNCisgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07DQorDQorICAgICAgICBmb3IgKGludCBuID0gMDsgKG4gPSBpbi5yZWFkKGIpKSAhPSAtMTspDQorICAgICAgICAgICAgZm91dC53cml0ZShiLCAwLCBuKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUHJpbnQgb3V0IGluZm9ybWF0aW9uIG9uIG1lbW9yeSB1c2FnZS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHByaW50TWVtb3J5SW5mbygpIHsNCisgICAgICAgIFJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsNCisgICAgICAgIGxvbmcgdG90YWwgPSBydC50b3RhbE1lbW9yeSgpOw0KKyAgICAgICAgbG9uZyBmcmVlID0gcnQuZnJlZU1lbW9yeSgpOw0KKyAgICAgICAgbG9uZyB1c2VkID0gdG90YWwgLSBmcmVlOw0KKw0KKyAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7DQorICAgICAgICBnZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJtZW0taW5mbyIsDQorICAgICAgICAgICAgbmYuZm9ybWF0KHVzZWQpLA0KKyAgICAgICAgICAgIG5mLmZvcm1hdCh0b3RhbCksDQorICAgICAgICAgICAgbmYuZm9ybWF0KGZyZWUpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBpdGVyYXRlZCBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgaXRlcmF0b3JUb0xpc3QoSXRlcmF0b3IgaSkgew0KKyAgICAgICAgTGlua2VkTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsNCisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkNCisgICAgICAgICAgICBsaXN0LmFkZChpLm5leHQoKSk7DQorICAgICAgICByZXR1cm4gbGlzdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBvYmplY3RzIGl0ZXJhdGVkIGJ5IHRoZSBnaXZlbiBpdGVyYXRvci4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IFtdIGl0ZXJhdG9yVG9BcnJheShJdGVyYXRvciBpLCBDbGFzcyBbXSBjbGF6eikgew0KKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVG9MaXN0KGkpLnRvQXJyYXkoY2xhenopOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSdW4gYW50IG9uIHRoZSBzcGVjaWZpZWQgYnVpbGQgZmlsZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGJ1aWxkRmlsZSB0aGUgYnVpbGQgZmlsZSB0byB1c2UNCisgICAgICogQHBhcmFtIHRhcmdldCB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHRvIGludm9rZQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgYW50KEZpbGUgYnVpbGRGaWxlLCBTdHJpbmcgdGFyZ2V0KSB7DQorICAgICAgICBhc3NlcnRUcnVlKGJ1aWxkRmlsZS5pc0ZpbGUoKSk7DQorDQorICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOw0KKyAgICAgICAgcHJvamVjdC5pbml0KCk7DQorICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eSgiYW50LmZpbGUiLCBidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KKyAgICAgICAgUHJvamVjdEhlbHBlci5jb25maWd1cmVQcm9qZWN0KHByb2plY3QsIGJ1aWxkRmlsZSk7DQorICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSB0aGUgb2JqZWN0Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdmFsaWRhdGVFcXVhbGl0eSBtYWtlIHN1cmUgdGhlIGhhc2hDb2RlIGFuZCBlcXVhbHMNCisgICAgICogbWV0aG9kcyBob2xkIHRydWUNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHJvdW5kdHJpcChPYmplY3Qgb3JpZywgYm9vbGVhbiB2YWxpZGF0ZUVxdWFsaXR5KQ0KKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCisgICAgICAgIGFzc2VydE5vdE51bGwob3JpZyk7DQorDQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJvdXQpOw0KKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9yaWcpOw0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKA0KKyAgICAgICAgICAgIGJvdXQudG9CeXRlQXJyYXkoKSk7DQorICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiaW4pOw0KKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGluLnJlYWRPYmplY3QoKTsNCisNCisgICAgICAgIGlmICh2YWxpZGF0ZUVxdWFsaXR5KSB7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWcuaGFzaENvZGUoKSwgcmVzdWx0Lmhhc2hDb2RlKCkpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnLCByZXN1bHQpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHJlZ2V4Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHJlZ2V4LCBTdHJpbmcgaW5wdXQpDQorICAgICAgICB0aHJvd3MgUkVTeW50YXhFeGNlcHRpb24gew0KKyAgICAgICAgUkUgcmUgPSBSRVV0aWwuY3JlYXRlUkUocmVnZXgpOw0KKyAgICAgICAgcmV0dXJuIHJlLm1hdGNoKGlucHV0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0TWF0Y2hlcyhTdHJpbmcgcmVnZXgsIFN0cmluZyBpbnB1dCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBpZiAoIShtYXRjaGVzKHJlZ2V4LCBpbnB1dCkpKQ0KKyAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCByZWd1bGFyIGV4cHJlc3Npb246IDwiICsgcmVnZXggKyAiPiINCisgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IG1hdGNoOiA8IiArIGlucHV0ICsgIj4iKTsNCisgICAgICAgIH0gY2F0Y2ggKFJFU3ludGF4RXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE5vdE1hdGNoZXMoU3RyaW5nIHJlZ2V4LCBTdHJpbmcgaW5wdXQpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgaWYgKG1hdGNoZXMocmVnZXgsIGlucHV0KSkNCisgICAgICAgICAgICAgICAgZmFpbCgiUmVndWxhciBleHByZXNzaW9uOiA8IiArIHJlZ2V4ICsgIj4iDQorICAgICAgICAgICAgICAgICAgICArICIgc2hvdWxkIG5vdCBtYXRjaDogPCIgKyBpbnB1dCArICI+Iik7DQorICAgICAgICB9IGNhdGNoIChSRVN5bnRheEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDaGVjayB0aGUgbGlzdCBpZiBzdHJpbmdzIGFuZCByZXR1cm4gdGhlIG9uZXMgdGhhdCBtYXRjaA0KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG1hdGNoLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBMaXN0IG1hdGNoZXMoU3RyaW5nIHJlZ2V4LCBDb2xsZWN0aW9uIGlucHV0KQ0KKyAgICAgICAgdGhyb3dzIFJFU3ludGF4RXhjZXB0aW9uIHsNCisgICAgICAgIExpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGlucHV0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIFN0cmluZyBjaGVjayA9IChTdHJpbmcpIGkubmV4dCgpOw0KKyAgICAgICAgICAgIGlmIChtYXRjaGVzKHJlZ2V4LCBjaGVjaykpDQorICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKGNoZWNrKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBtYXRjaGVzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgU3RyaW5ncyBjb250YWlucyBhdCBsZWFzdA0KKyAgICAgKiBvbmUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRNYXRjaGVzKFN0cmluZyByZWdleCwgQ29sbGVjdGlvbiBpbnB1dCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBpZiAobWF0Y2hlcyhyZWdleCwgaW5wdXQpLnNpemUoKSA9PSAwKQ0KKyAgICAgICAgICAgICAgICBmYWlsKCJUaGUgc3BlY2lmaWVkIGxpc3Qgb2Ygc2l6ZSAiICsgaW5wdXQuc2l6ZSgpDQorICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjb250YWluIGFueSBzdHJpbmdzIHRoYXQgbWF0Y2ggdGhlIg0KKyAgICAgICAgICAgICAgICAgICAgKyAiIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24oXCIiICsgcmVnZXggKyAiXCIpIik7DQorICAgICAgICB9IGNhdGNoIChSRVN5bnRheEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgU3RyaW5ncyBkb2VzIG5vdCBtYXRjaA0KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROb3RNYXRjaGVzKFN0cmluZyByZWdleCwgQ29sbGVjdGlvbiBpbnB1dCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBMaXN0IG1hdGNoZXM7DQorDQorICAgICAgICAgICAgaWYgKCgobWF0Y2hlcyA9IG1hdGNoZXMocmVnZXgsIGlucHV0KSkpLnNpemUoKSA+IDApDQorICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBzcGVjaWZpZWQgbGlzdCBvZiBzaXplICIgKyBpbnB1dC5zaXplKCkNCisgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgY29udGFpbiBvbmUgb3IgbW9yZSBzdHJpbmdzIHRoYXQgbWF0Y2hzIHRoZSINCisgICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQgaWxsZWdhbCByZWd1bGFyIGV4cHJlc3Npb24iDQorICAgICAgICAgICAgICAgICAgICArICIgKFwiIiArIHJlZ2V4ICsgIlwiKS4iDQorICAgICAgICAgICAgICAgICAgICArICIgRmlyc3QgZXhhbXBsZSBvZiBhIG1hdGNoaW5nIG1lc3NhZ2UgaXM6ICINCisgICAgICAgICAgICAgICAgICAgICsgbWF0Y2hlcy5pdGVyYXRvcigpLm5leHQoKSk7DQorICAgICAgICB9IGNhdGNoIChSRVN5bnRheEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUbyBiZSBjYWxsZWQgYnkgdGhlIGNoaWxkLiBFLmcuOg0KKyAgICAgKiA8Y29kZT4gcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsgbWFpbihUZXN0QnVnMzc1LmNsYXNzKTsNCisgICAgICogfQ0KKyAgICAgKiA8L2NvZGU+DQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihDbGFzcyBjKSB7DQorICAgICAgICBUZXN0UnVubmVyLnJ1bihjKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVG8gYmUgY2FsbGVkIGJ5IGNoaWxkLiBGaWd1cmVzIG91dCB0aGUgY2xhc3MgZnJvbSB0aGUgY2FsbGluZyBjb250ZXh0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oKSB7DQorICAgICAgICBTdHJpbmcgY2FsbGVyID0gbmV3IFNlY3VyaXR5TWFuYWdlcigpIHsNCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NDb250ZXh0KClbMl0uZ2V0TmFtZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0udG9TdHJpbmcoKTsNCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgbWFpbihDbGFzcy5mb3JOYW1lKGNhbGxlcikpOw0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY25mZS50b1N0cmluZygpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgamFyIGZpbGUgaW4gd2hpY2ggdGhlIGNsYXNzIGlzIGNvbnRhaW5lZC4NCisgICAgICoNCisgICAgICogQHJldHVybiB0aGUgamFyIGZpbGUsIG9yIG5vbmUgaWYgdGhlIGNsYXNzIGlzIG5vdCBpbiBhIGphcg0KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgamFyIGZpbGUgY2Fubm90IGxvY2F0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRKYXJGaWxlKENsYXNzIGNsYXp6KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCisgICAgICAgIFVSTCB1cmwgPSBjbGF6ei5nZXRSZXNvdXJjZShjbGF6ei5nZXROYW1lKCkuc3Vic3RyaW5nKA0KKyAgICAgICAgICAgIGNsYXp6LmdldE5hbWUoKS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyAiLmNsYXNzIik7DQorICAgICAgICBpZiAodXJsID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihjbGF6ei50b1N0cmluZygpKTsNCisNCisgICAgICAgIFN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsNCisgICAgICAgIGlmIChmaWxlID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmwudG9TdHJpbmcoKSk7DQorICAgICAgICBpbnQgaW5kZXggPSBmaWxlLmluZGV4T2YoIiEiKTsNCisgICAgICAgIGlmIChpbmRleCA9PSAtMSkNCisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGZpbGUpOw0KKw0KKyAgICAgICAgZmlsZSA9IGZpbGUuc3Vic3RyaW5nKDAsIGluZGV4KTsNCisgICAgICAgIGZpbGUgPSBmaWxlLnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKTsNCisNCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGUpOw0KKyAgICAgICAgaWYgKCEoZi5pc0ZpbGUoKSkpDQorICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlKTsNCisNCisgICAgICAgIHJldHVybiBmLmdldEFic29sdXRlRmlsZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBlYWNoIHRlc3QgY2FzZSB3aWxsIGhhdmUgZm9yIGEgdGltZW91dC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7DQorICAgICAgICBfdGltZW91dCA9IHRpbWVvdXQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGVhY2ggdGVzdCBjYXNlIHdpbGwgaGF2ZSBmb3IgYSB0aW1lb3V0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0VGltZW91dCgpIHsNCisgICAgICAgIHJldHVybiBfdGltZW91dDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQSB3YXRjaGRvZyB0aGF0IGp1c3QgZXhpdHMgdGhlIEpWTSBpZiBhIHRlc3QgaGFzIG5vdCBjb21wbGV0ZWQgaW4NCisgICAgICogYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLiBUaGlzIHNwZWVkcyB1cCB0aGUgbWVjaGFuaXNtIG9mIGRldGVybWluaW5nDQorICAgICAqIGlmIGEgdGltZW91dCBoYXMgb2NjdXJyZWQsIHNpbmNlIHdlIGNhbiBleGl0IHRoZSBlbnRpcmUgdGVzdCBydW4NCisgICAgICogaWYgYSB0ZXN0IGhhc24ndCBjb21wbGV0ZWQgaW4gYSBzaG9ydGVkIGFtb3VudCBvZiB0aW1lIHRoYW4NCisgICAgICogdGhlIGdsb2JhbCB0ZXN0IHRpbWVvdXQuDQorICAgICAqDQorICAgICAqIEBhdXRob3IgTWFyYyBQcnVkJ2hvbW1lYXV4DQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXYXRjaGRvZ1RocmVhZCBleHRlbmRzIFRocmVhZCB7DQorDQorICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgX3RpbWVvdXRtczsNCisgICAgICAgIHByaXZhdGUgbG9uZyBfZW5kdGltZSA9IC0xOw0KKyAgICAgICAgcHJpdmF0ZSBBYnN0cmFjdFRlc3RDYXNlIF9jdXJ0ZXN0ID0gbnVsbDsNCisNCisgICAgICAgIHB1YmxpYyBXYXRjaGRvZ1RocmVhZCgpIHsNCisgICAgICAgICAgICBzdXBlcigiS29kbyB0ZXN0IGNhc2Ugd2F0Y2hkb2cgdGhyZWFkIik7DQorICAgICAgICAgICAgc2V0RGFlbW9uKHRydWUpOw0KKw0KKyAgICAgICAgICAgIGludCB0aW1lb3V0TWluID0gbmV3IEludGVnZXINCisgICAgICAgICAgICAgICAgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYXV0b2J1aWxkLnRlc3RjYXNlLnRpbWVvdXQiLCAiMjAiKSkNCisgICAgICAgICAgICAgICAgLmludFZhbHVlKCk7DQorDQorICAgICAgICAgICAgX3RpbWVvdXRtcyA9IHRpbWVvdXRNaW4gKiA2MCAqIDEwMDA7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQorICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIHNsZWVwKDIwMCk7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaWYgKF9lbmR0aW1lID4gMCAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IF9lbmR0aW1lKSB7DQorICAgICAgICAgICAgICAgICAgICBUaHJlYWQgcHJlVGltZW91dCA9IG5ldyBUaHJlYWQNCisgICAgICAgICAgICAgICAgICAgICAgICAoIkF0dGVtcHRpbmcgcHJlLXRpbWVvdXQgZm9yICIgKyBfY3VydGVzdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnRlc3QucHJlVGltZW91dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH07DQorICAgICAgICAgICAgICAgICAgICBwcmVUaW1lb3V0LnN0YXJ0KCk7DQorDQorICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGEgbGl0dGxlIHdoaWxlIGZvciB0aGUgcHJlLXRpbWVvdXQNCisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCB0byBjb21wbGV0ZQ0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVUaW1lb3V0LmpvaW4oMTAgKiAxMDAwKTsNCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGl0IGEgZmV3IG1vcmUgc2Vjb25kcy4uLg0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCg1ICogMTAwMCk7DQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGVuZHRpbWU/IHJlc3VtZS4uLg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgX2VuZHRpbWUpDQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCJ0ZXN0IGNhc2UgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgKF9jdXJ0ZXN0ICE9IG51bGwgPyBfY3VydGVzdC5nZXROYW1lKCkNCisgICAgICAgICAgICAgICAgICAgICAgICA6ICJVTktOT1dOIikgKyAiIHRpbWVkIG91dCBhZnRlciAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyBfdGltZW91dG1zICsgIm1zIikucHJpbnRTdGFja1RyYWNlKCk7DQorDQorICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJ1biAia2lsbGFsbCAtUVVJVCBqYXZhIiB0byB0cnkgdG8gZ3JhYg0KKyAgICAgICAgICAgICAgICAgICAgLy8gYSBzdGFjayB0cmFjZQ0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nW117ICJraWxsYWxsIiwgIi1RVUlUIiwgImphdmEiIH0pOw0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMTAwMCk7DQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgLy8gbm93IGFjdHVhbGx5IGV4aXQNCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDExMSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW50ZXJpbmdUZXN0KEFic3RyYWN0VGVzdENhc2UgdGVzdCkgew0KKyAgICAgICAgICAgIGxvbmcgdGltZW91dCA9IHRlc3QuZ2V0VGltZW91dCgpOw0KKyAgICAgICAgICAgIGlmICh0aW1lb3V0IDw9IDApDQorICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBfdGltZW91dG1zOw0KKw0KKyAgICAgICAgICAgIF9lbmR0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0Ow0KKyAgICAgICAgICAgIF9jdXJ0ZXN0ID0gdGVzdDsNCisNCisgICAgICAgICAgICBpZiAoIWlzQWxpdmUoKSkNCisgICAgICAgICAgICAgICAgc3RhcnQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsZWF2aW5nVGVzdChBYnN0cmFjdFRlc3RDYXNlIHRlc3QpIHsNCisgICAgICAgICAgICBfZW5kdGltZSA9IC0xOw0KKyAgICAgICAgICAgIF9jdXJ0ZXN0ID0gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RBYnN0cmFjdEV2ZW50TWFuYWdlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0QWJzdHJhY3RFdmVudE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDAxYmZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0QWJzdHJhY3RFdmVudE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgQWJzdHJhY3RFdmVudE1hbmFnZXJ9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QWJzdHJhY3RFdmVudE1hbmFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIEV2ZW50TWFuYWdlciBfZW0gPSBuZXcgRXZlbnRNYW5hZ2VyKCk7CisKKyAgICBwdWJsaWMgVGVzdEFic3RyYWN0RXZlbnRNYW5hZ2VyKFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWVudHJhbnRBZGQoKSB7CisgICAgICAgIExpc3RlbmVyIGwxID0gbmV3IExpc3RlbmVyKExpc3RlbmVyLkFERCk7CisgICAgICAgIExpc3RlbmVyIGwyID0gbmV3IExpc3RlbmVyKExpc3RlbmVyLk5PTkUpOworICAgICAgICBfZW0uYWRkTGlzdGVuZXIobDEpOworICAgICAgICBfZW0uYWRkTGlzdGVuZXIobDIpOworICAgICAgICBfZW0uZmlyZUV2ZW50KG5ldyBPYmplY3QoKSk7CisgICAgICAgIGFzc2VydFRydWUobDEuZmlyZWQpOworICAgICAgICBhc3NlcnRUcnVlKGwyLmZpcmVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIF9lbS5nZXRMaXN0ZW5lcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWVudHJhbnRSZW1vdmUoKSB7CisgICAgICAgIExpc3RlbmVyIGwxID0gbmV3IExpc3RlbmVyKExpc3RlbmVyLlJFTU9WRSk7CisgICAgICAgIExpc3RlbmVyIGwyID0gbmV3IExpc3RlbmVyKExpc3RlbmVyLk5PTkUpOworICAgICAgICBfZW0uYWRkTGlzdGVuZXIobDEpOworICAgICAgICBfZW0uYWRkTGlzdGVuZXIobDIpOworICAgICAgICBfZW0uZmlyZUV2ZW50KG5ldyBPYmplY3QoKSk7CisgICAgICAgIGFzc2VydFRydWUobDEuZmlyZWQpOworICAgICAgICBhc3NlcnRUcnVlKGwyLmZpcmVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIF9lbS5nZXRMaXN0ZW5lcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShfZW0uZ2V0TGlzdGVuZXJzKCkuY29udGFpbnMobDEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RBYnN0cmFjdEV2ZW50TWFuYWdlci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFdmVudE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50TWFuYWdlciB7CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmlyZUV2ZW50KE9iamVjdCBldmVudCwgT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAoKExpc3RlbmVyKSBsaXN0ZW5lcikuZmlyZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDI7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZmlyZWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IF9hY3Rpb247CisKKyAgICAgICAgcHVibGljIExpc3RlbmVyKGludCBhY3Rpb24pIHsKKyAgICAgICAgICAgIF9hY3Rpb24gPSBhY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaXJlKCkgeworICAgICAgICAgICAgZmlyZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKF9hY3Rpb24gPT0gQUREKQorICAgICAgICAgICAgICAgIF9lbS5hZGRMaXN0ZW5lcihuZXcgTGlzdGVuZXIoTk9ORSkpOworICAgICAgICAgICAgZWxzZSBpZiAoX2FjdGlvbiA9PSBSRU1PVkUpCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShfZW0ucmVtb3ZlTGlzdGVuZXIodGhpcykpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RMb2NhbGl6ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdExvY2FsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODczNzIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RMb2NhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwudGVzdGxvY2FsaXplci5Mb2NhbGl6ZXJUZXN0SGVscGVyOworCisvKioKKyAqIFRlc3RzIHRoZSBMb2NhbGl6ZXIuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RMb2NhbGl6ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIExvY2FsaXplciBfbG9jYWxzID0gbnVsbDsKKworICAgIHB1YmxpYyBUZXN0TG9jYWxpemVyKFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBfbG9jYWxzID0gTG9jYWxpemVyLmZvclBhY2thZ2UoTG9jYWxpemVyVGVzdEhlbHBlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBnZXR0aW5nIGEgc3RyaW5nIGZvciBhIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JDbGFzcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKExvY2FsZS5HRVJNQU5ZKQorICAgICAgICAgICAgPyAidmFsdWUxX2RlIiA6ICJ2YWx1ZTEiLCBfbG9jYWxzLmdldCgidGVzdC5sb2NhbDEiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBnZXR0aW5nIGEgc3RyaW5nIGZvciBhIG5vbi1kZWZhdWx0IGxvY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTG9jYWxlKCkgeworICAgICAgICBMb2NhbGl6ZXIgbG9jbCA9IExvY2FsaXplci5mb3JQYWNrYWdlKExvY2FsaXplclRlc3RIZWxwZXIuY2xhc3MsCisgICAgICAgICAgICBMb2NhbGUuR0VSTUFOWSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxX2RlIiwgbG9jbC5nZXQoInRlc3QubG9jYWwxIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaWYgYSBsb2NhbGUgaXMgbWlzc2luZyB0aGUgc3lzdGVtIGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZhbGxiYWNrTG9jYWxlKCkgeworICAgICAgICBMb2NhbGl6ZXIgbG9jbCA9IExvY2FsaXplci5mb3JQYWNrYWdlKExvY2FsaXplclRlc3RIZWxwZXIuY2xhc3MsCisgICAgICAgICAgICBMb2NhbGUuRlJBTkNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKExvY2FsZS5HRVJNQU5ZKQorICAgICAgICAgICAgPyAidmFsdWUxX2RlIiA6ICJ2YWx1ZTEiLCBsb2NsLmdldCgidGVzdC5sb2NhbDEiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhIG51bGwgY2xhc3MgYWNjZXNzZXMgdGhlIGxvY2FsaXplci5wcm9wZXJ0aWVzIGZpbGUKKyAgICAgKiBmb3IgdGhlIHRvcC1sZXZlbChubyBwYWNrYWdlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wTGV2ZWwoKSB7CisgICAgICAgIExvY2FsaXplciBzeXN0ZW0gPSBMb2NhbGl6ZXIuZm9yUGFja2FnZShudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeXN0ZW12YWx1ZTEiLCBzeXN0ZW0uZ2V0KCJ0ZXN0LnN5c3RlbWxvY2FsIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgbWVzc2FnZSBmb3JtYXR0aW5nIHdvcmtzIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUZvcm1hdCgpIHsKKyAgICAgICAgU3RyaW5nIHN1ZmZpeCA9IExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKExvY2FsZS5HRVJNQU5ZKSA/ICJfZGUiIDogIiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiICsgc3VmZml4ICsgIiB4IHNlcCB5IiwgX2xvY2Fscy5nZXQoInRlc3QubG9jYWwyIiwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsgIngiLCAieSIgfSkpOworCisgICAgICAgIC8vIHRlc3QgdGhhdCBpdCB0cmVhdGVzIHNpbmdsZSBvYmplY3RzIGFzIHNpbmdsZS1lbGVtZW50IGFycmF5cworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIgKyBzdWZmaXggKyAiIHggc2VwIHsxfSIsCisgICAgICAgICAgICBfbG9jYWxzLmdldCgidGVzdC5sb2NhbDIiLCAieCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYSB7QGxpbmsgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9ufSBpcyB0aHJvd24gZm9yIG1pc3NpbmcKKyAgICAgKiByZXNvdXJjZSBidW5kbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQnVuZGxlKCkgeworICAgICAgICBMb2NhbGl6ZXIgbWlzc2luZyA9IExvY2FsaXplci5mb3JQYWNrYWdlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vLmJhciIsIG1pc3NpbmcuZ2V0KCJmb28uYmFyIikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWlzc2luZy5nZXRGYXRhbCgiZm9vLmJhciIpOworICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIGZvciBmYXRhbCBnZXQgb24gbWlzc2luZyBidW5kbGUuIik7CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBhIHtAbGluayBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb259IGlzIHRocm93biBmb3IgbWlzc2luZyBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nS2V5KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImZvby5iYXIiLCBfbG9jYWxzLmdldCgiZm9vLmJhciIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9sb2NhbHMuZ2V0RmF0YWwoImZvby5iYXIiKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiBmb3IgZmF0YWwgZ2V0IG9uIG1pc3Npbmcga2V5LiIpOworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgcywgTWVzc2FnZSBtKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBtLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0TG9jYWxpemVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdE11bHRpQ2xhc3NMb2FkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdE11bHRpQ2xhc3NMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZjNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0TXVsdGlDbGFzc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgTXVsdGlDbGFzc0xvYWRlcn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RNdWx0aUNsYXNzTG9hZGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBTWVNURU1fTE9BREVSID0gTXVsdGlDbGFzc0xvYWRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworCisgICAgcHJpdmF0ZSBNdWx0aUNsYXNzTG9hZGVyIF9sb2FkZXIgPSBuZXcgTXVsdGlDbGFzc0xvYWRlcigpOworCisgICAgcHVibGljIFRlc3RNdWx0aUNsYXNzTG9hZGVyKFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBfbG9hZGVyLmFkZENsYXNzTG9hZGVyKE11bHRpQ2xhc3NMb2FkZXIuVEhSRUFEX0xPQURFUik7CisgICAgICAgIF9sb2FkZXIuYWRkQ2xhc3NMb2FkZXIoU1lTVEVNX0xPQURFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgYmFzaWMgYWRkL3JlbW92ZSBmdW5jdGlvbmFsaXR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIF9sb2FkZXIuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghX2xvYWRlci5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRUcnVlKF9sb2FkZXIuZ2V0Q2xhc3NMb2FkZXJzKClbMF0gPT0gU1lTVEVNX0xPQURFUik7CisgICAgICAgIGFzc2VydEVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgX2xvYWRlci5nZXRDbGFzc0xvYWRlcnMoKVsxXSk7CisgICAgICAgIGFzc2VydFRydWUoX2xvYWRlci5nZXRDbGFzc0xvYWRlcigwKSA9PSBTWVNURU1fTE9BREVSKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghX2xvYWRlci5hZGRDbGFzc0xvYWRlcihfbG9hZGVyLlRIUkVBRF9MT0FERVIpKTsKKworICAgICAgICBGb29Mb2FkZXIgZm9vID0gbmV3IEZvb0xvYWRlcigpOworICAgICAgICBhc3NlcnRUcnVlKF9sb2FkZXIuYWRkQ2xhc3NMb2FkZXIoZm9vKSk7CisgICAgICAgIGFzc2VydFRydWUoIV9sb2FkZXIuYWRkQ2xhc3NMb2FkZXIoZm9vKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBfbG9hZGVyLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb28sIF9sb2FkZXIuZ2V0Q2xhc3NMb2FkZXJzKClbMl0pOworCisgICAgICAgIGFzc2VydFRydWUoX2xvYWRlci5yZW1vdmVDbGFzc0xvYWRlcihfbG9hZGVyLlRIUkVBRF9MT0FERVIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghX2xvYWRlci5yZW1vdmVDbGFzc0xvYWRlcihfbG9hZGVyLlRIUkVBRF9MT0FERVIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIF9sb2FkZXIuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfbG9hZGVyLmdldENsYXNzTG9hZGVycygpWzBdID09IFNZU1RFTV9MT0FERVIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9vLCBfbG9hZGVyLmdldENsYXNzTG9hZGVycygpWzFdKTsKKworICAgICAgICBhc3NlcnRUcnVlKF9sb2FkZXIucmVtb3ZlQ2xhc3NMb2FkZXIoZm9vKSk7CisgICAgICAgIGFzc2VydFRydWUoX2xvYWRlci5yZW1vdmVDbGFzc0xvYWRlcihTWVNURU1fTE9BREVSKSk7CisgICAgICAgIGFzc2VydFRydWUoX2xvYWRlci5pc0VtcHR5KCkpOworCisgICAgICAgIE11bHRpQ2xhc3NMb2FkZXIgbG9hZGVyMiA9IG5ldyBNdWx0aUNsYXNzTG9hZGVyKCk7CisgICAgICAgIGxvYWRlcjIuYWRkQ2xhc3NMb2FkZXIoTXVsdGlDbGFzc0xvYWRlci5USFJFQURfTE9BREVSKTsKKyAgICAgICAgbG9hZGVyMi5hZGRDbGFzc0xvYWRlcihTWVNURU1fTE9BREVSKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfbG9hZGVyLmFkZENsYXNzTG9hZGVycyhsb2FkZXIyKSk7CisgICAgICAgIGFzc2VydFRydWUoIV9sb2FkZXIuYWRkQ2xhc3NMb2FkZXJzKGxvYWRlcjIpKTsKKyAgICAgICAgRm9vTG9hZGVyIGZvbzIgPSBuZXcgRm9vTG9hZGVyKCk7CisgICAgICAgIGxvYWRlcjIuYWRkQ2xhc3NMb2FkZXIoZm9vKTsKKyAgICAgICAgbG9hZGVyMi5hZGRDbGFzc0xvYWRlcihmb28yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfbG9hZGVyLmFkZENsYXNzTG9hZGVycygxLCBsb2FkZXIyKSk7CisgICAgICAgIENsYXNzTG9hZGVyW10gbG9hZGVycyA9IF9sb2FkZXIuZ2V0Q2xhc3NMb2FkZXJzKCk7CisgICAgICAgIGFzc2VydFRydWUobG9hZGVyc1swXSA9PSBTWVNURU1fTE9BREVSKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICBsb2FkZXJzWzNdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgbG9hZGVyc1sxXSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb28yLCBsb2FkZXJzWzJdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZpbmRpbmcgY2xhc3Nlcy4KKyAgICAgKi8KKy8qCisgcHVibGljIHZvaWQgdGVzdENsYXNzRm9yTmFtZSgpCisgdGhyb3dzIEV4Y2VwdGlvbgorIHsKKyBhc3NlcnRFcXVhbHMoTXVsdGlDbGFzc0xvYWRlci5jbGFzcywKKyBDbGFzcy5mb3JOYW1lKE11bHRpQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0TmFtZSgpLCB0cnVlLCBfbG9hZGVyKSk7CisgYXNzZXJ0VHJ1ZShfbG9hZGVyLnJlbW92ZUNsYXNzTG9hZGVyKFNZU1RFTV9MT0FERVIpKTsKKyBhc3NlcnRUcnVlKF9sb2FkZXIucmVtb3ZlQ2xhc3NMb2FkZXIoTXVsdGlDbGFzc0xvYWRlci5USFJFQURfTE9BREVSKSk7CisgdHJ5CisgeworIC8vIGhhdmUgdG8gc3dpdGNoIGNsYXNzZXMgaGVyZSBiL2Mgb3RoZXIgaXMgbm93IGNhY2hlZAorIGFzc2VydEVxdWFscyhUZXN0TXVsdGlDbGFzc0xvYWRlci5jbGFzcywgQ2xhc3MuZm9yTmFtZQorIChUZXN0TXVsdGlDbGFzc0xvYWRlci5jbGFzcy5nZXROYW1lKCksIHRydWUsIF9sb2FkZXIpKTsKKyBmYWlsKCJTeXN0ZW0gY2xhc3MgbGFvZGVyIHN0aWxsIHdvcmtpbmcuIik7CisgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKQorIHsKKyB9CisgdHJ5CisgeworIENsYXNzLmZvck5hbWUoImZvbyIsIHRydWUsIF9sb2FkZXIpOworIGZhaWwoIlNvbWVob3cgZm91bmQgJ2Zvbyc/Pz8iKTsKKyB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpCisgeworIH0KKyBfbG9hZGVyLmFkZENsYXNzTG9hZGVyKG5ldyBGb29Mb2FkZXIoKSk7CisgYXNzZXJ0RXF1YWxzKEludGVnZXIuY2xhc3MsIENsYXNzLmZvck5hbWUoImZvbyIsIHRydWUsIF9sb2FkZXIpKTsKKyB9CisqLworCisgICAgLyoqCisgICAgICogVGVzdCBmaW5kaW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2UoKSB7CisgICAgICAgIGFzc2VydE51bGwoX2xvYWRlci5nZXRSZXNvdXJjZSgiZm9vIikpOworICAgICAgICBfbG9hZGVyLmFkZENsYXNzTG9hZGVyKG5ldyBGb29Mb2FkZXIoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoX2xvYWRlci5nZXRSZXNvdXJjZSgiZm9vIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdE11bHRpQ2xhc3NMb2FkZXIuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRm9vTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgeworCisgICAgICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICgiZm9vIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuY2xhc3M7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBVUkwgZmluZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICgiZm9vIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKCJmaWxlOi8vL2Rldi9udWxsIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RPcHRpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1NDY4YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdE9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgT3B0aW9uc30gdHlwZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdE9wdGlvbnMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIE9wdGlvbnMgX29wdHMgPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBfYXJncyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgIi1pbnQiLCAiMTAiLCAiLWJvb2xlYW4iLCAiLXN0cmluZyIsICJTVFIsU1RSMiIsICItcmFuZ2UxIiwgIjEwLDEwMCIsCisgICAgICAgICItcmFuZ2UyIiwgIjEwIiwgIi1maWVsZFZhbCIsICIyMCIsICItRmllbGRWYWwyIiwgIjMwIiwKKyAgICAgICAgIi1pbm5lci5udWxsSW5uZXIucmFuZ2UxIiwgIjEwLDEwMCIsICJhcmcxIiwgImFyZzIiLCAiYXJnMyIgfTsKKworICAgIHB1YmxpYyBUZXN0T3B0aW9ucyhTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgUHJvcGVydGllcyBkZWZzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgZGVmcy5zZXRQcm9wZXJ0eSgiZGVmYXVsdCIsICJ2YWx1ZSIpOworICAgICAgICBfb3B0cyA9IG5ldyBPcHRpb25zKGRlZnMpOworICAgICAgICBfYXJncyA9IF9vcHRzLnNldEZyb21DbWRMaW5lKF9hcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbW1hbmQtbGluZSBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDbWRMaW5lUGFyc2luZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIF9hcmdzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXJnMSIsIF9hcmdzWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgX2FyZ3NbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzMiLCBfYXJnc1syXSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMCIsIF9vcHRzLmdldFByb3BlcnR5KCJpbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIF9vcHRzLmdldFByb3BlcnR5KCJib29sZWFuIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNUUixTVFIyIiwgX29wdHMuZ2V0UHJvcGVydHkoInN0cmluZyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMCIsIF9vcHRzLmdldFByb3BlcnR5KCJmaWVsZFZhbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMCIsIF9vcHRzLmdldFByb3BlcnR5KCJGaWVsZFZhbDIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTAsMTAwIiwgX29wdHMuZ2V0UHJvcGVydHkoInJhbmdlMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMCIsIF9vcHRzLmdldFByb3BlcnR5KCJyYW5nZTIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTAsMTAwIiwgX29wdHMuZ2V0UHJvcGVydHkoImlubmVyLm51bGxJbm5lci5yYW5nZTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBfb3B0cy5nZXRQcm9wZXJ0eSgiZGVmYXVsdCIpKTsKKworICAgICAgICBfYXJncyA9IF9vcHRzLnNldEZyb21DbWRMaW5lKG5ldyBTdHJpbmdbXXsgIi1kZWZhdWx0IiwgIm5ld1ZhbHVlIiB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIF9hcmdzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygibmV3VmFsdWUiLCBfb3B0cy5nZXRQcm9wZXJ0eSgiZGVmYXVsdCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgc2V0dGluZyBvZiBvcHRpb24gdmFsdWVzIGludG8gYmVhbiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3QoKSB7CisgICAgICAgIElubmVyIGlubmVyID0gbmV3IElubmVyKCk7CisgICAgICAgIF9vcHRzLnNldEludG8oaW5uZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgaW5uZXIuZ2V0SW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKGlubmVyLmdldEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU1RSLFNUUjIiLCBpbm5lci5nZXRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMCwgaW5uZXIuZmllbGRWYWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAsIGlubmVyLmZpZWxkVmFsMik7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgaW5uZXIuZ2V0UmFuZ2UxKClbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBpbm5lci5nZXRSYW5nZTEoKVsxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgaW5uZXIuZ2V0UmFuZ2UyKClbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5uZXIuZ2V0UmFuZ2UyKClbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgaW5uZXIuZ2V0RGVmYXVsdCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGlubmVyLmdldElubmVyKCkuZ2V0TnVsbElubmVyKCkuZ2V0UmFuZ2UxKClbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBpbm5lci5nZXRJbm5lcigpLmdldE51bGxJbm5lcigpLmdldFJhbmdlMSgpWzFdKTsKKworICAgICAgICBpbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBvcHRzLnNldFByb3BlcnR5KCJpbm5lciIsIElubmVyMi5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBvcHRzLnNldEludG8oaW5uZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW5uZXIyLmNsYXNzLCBpbm5lci5nZXRJbm5lcigpLmdldENsYXNzKCkpOworCisgICAgICAgIGlubmVyID0gbmV3IElubmVyKCk7CisgICAgICAgIG9wdHMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBvcHRzLnNldFByb3BlcnR5KCJtaXhlZCIsICJTVFIsMSIpOworICAgICAgICBvcHRzLnNldEludG8oaW5uZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5uZXIuZ2V0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNUUiIsIGlubmVyLmdldFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RPcHRpb25zLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgaW50ZXJuYWxseSBmb3IgdGVzdGluZzsgbXVzdCBiZSBwdWJsaWMgc28gT3B0aW9ucyBjYW4gY29uc3RydWN0IGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXIgeworCisgICAgICAgIHB1YmxpYyBpbnQgZmllbGRWYWwgPSAwOworICAgICAgICBwdWJsaWMgaW50IGZpZWxkVmFsMiA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2ludCA9IDA7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfYm9vbGVhbiA9IGZhbHNlOworICAgICAgICBwcml2YXRlIFN0cmluZyBfc3RyaW5nID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHQgPSBudWxsOworICAgICAgICBwcml2YXRlIElubmVyIF9pbm5lciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgSW5uZXIgX251bGxJbm5lciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50W10gX3JhbmdlMSA9IG5ldyBpbnRbMl07CisgICAgICAgIHByaXZhdGUgaW50W10gX3JhbmdlMiA9IG5ldyBpbnRbMl07CisKKyAgICAgICAgcHVibGljIElubmVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2ludDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEludChpbnQgaSkgeworICAgICAgICAgICAgX2ludCA9IGk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkgeworICAgICAgICAgICAgcmV0dXJuIF9ib29sZWFuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbihib29sZWFuIGIpIHsKKyAgICAgICAgICAgIF9ib29sZWFuID0gYjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIF9zdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIF9zdHJpbmcgPSBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgcykgeworICAgICAgICAgICAgX2RlZmF1bHQgPSBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludFtdIGdldFJhbmdlMSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmFuZ2UxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmFuZ2UxKGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgICAgIF9yYW5nZTFbMF0gPSBtaW47CisgICAgICAgICAgICBfcmFuZ2UxWzFdID0gbWF4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludFtdIGdldFJhbmdlMigpIHsKKyAgICAgICAgICAgIHJldHVybiBfcmFuZ2UyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmFuZ2UyKGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgICAgIF9yYW5nZTJbMF0gPSBtaW47CisgICAgICAgICAgICBfcmFuZ2UyWzFdID0gbWF4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWl4ZWQoU3RyaW5nIHMsIGludCBpKSB7CisgICAgICAgICAgICBfaW50ID0gaTsKKyAgICAgICAgICAgIF9zdHJpbmcgPSBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElubmVyIGdldElubmVyKCkgeworICAgICAgICAgICAgaWYgKF9pbm5lciA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9pbm5lciA9IG5ldyBJbm5lcigpOworICAgICAgICAgICAgcmV0dXJuIF9pbm5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElubmVyKElubmVyIGluKSB7CisgICAgICAgICAgICBfaW5uZXIgPSBpbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbm5lciBnZXROdWxsSW5uZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gX251bGxJbm5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE51bGxJbm5lcihJbm5lciBpbikgeworICAgICAgICAgICAgX251bGxJbm5lciA9IGluOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nOyBtdXN0IGJlIHB1YmxpYyBzbyBPcHRpb25zIGNhbiBjb25zdHJ1Y3QgaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lcjIgZXh0ZW5kcyBJbm5lciB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RQYXJhbWV0ZXJUZW1wbGF0ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0UGFyYW1ldGVyVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQ3MDA3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0UGFyYW1ldGVyVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgUGFyYW1ldGVyVGVtcGxhdGV9IHV0aWxpdHkgY2xhc3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RQYXJhbWV0ZXJUZW1wbGF0ZSBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUGFyYW1ldGVyVGVtcGxhdGUgdGVtcGwgPSBuZXcgUGFyYW1ldGVyVGVtcGxhdGUoKTsKKworICAgIHB1YmxpYyBUZXN0UGFyYW1ldGVyVGVtcGxhdGUoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHRlbXBsLmFwcGVuZCgie2ZvbyQke2Zvb31iYXJ7JHtiYXJ9fWJpeiBiYXokIik7CisgICAgICAgIHRlbXBsLmFwcGVuZCgie2Jvb3p9Ym9veiR7amF2YS5pby50bXBkaXJ9e2Fja30iKTsKKworICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImZvbyIsICJYIik7CisgICAgICAgIHRlbXBsLnNldFBhcmFtZXRlcigiYmFyIiwgIlkiKTsKKyAgICAgICAgdGVtcGwuc2V0UGFyYW1ldGVyKCJib296IiwgIloiKTsKKyAgICAgICAgU3RyaW5nIHRtcGRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7Zm9vJFhiYXJ7WX1iaXogYmF6WmJvb3oiICsgdG1wZGlyICsgInthY2t9IiwKKyAgICAgICAgICAgIHRlbXBsLnRvU3RyaW5nKCkpOworCisgICAgICAgIHRlbXBsLmNsZWFyUGFyYW1ldGVycygpOworICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImZvbyIsICJBQSIpOworICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImJhciIsICJCQiIpOworICAgICAgICB0ZW1wbC5zZXRQYXJhbWV0ZXIoImJvb3oiLCAiQ0MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7Zm9vJEFBYmFye0JCfWJpeiBiYXpDQ2Jvb3oiICsgdG1wZGlyICsgInthY2t9IiwKKyAgICAgICAgICAgIHRlbXBsLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFBhcmFtZXRlclRlbXBsYXRlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0UHJvcGVydGllc1BhcnNlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0UHJvcGVydGllc1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjUwZTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RQcm9wZXJ0aWVzUGFyc2VyLmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Gb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcy5EdXBsaWNhdGVLZXlFeGNlcHRpb247DQorDQorLy8gdGhpbmdzIHRvIHRlc3Q6DQorLy8gLSBkZWxpbWl0ZXJzIGluIGtleXMNCisvLyAtIGVzY2FwZSBjaGFycywgaW5jbHVkaW5nIFw6LCBcPSBpbiBmaWxlcyhhcyBnZW5lcmF0ZWQgYnkgUHJvcGVydGllcykNCisvLyAtIHVuaWNvZGUNCisvLyAtIG5vbi1TdHJpbmcga2V5cyAvIHZhbHMNCisvLyAtIGxpc3QoKSBtZXRob2QgYmVoYXZpb3INCisNCitwdWJsaWMgY2xhc3MgVGVzdFByb3BlcnRpZXNQYXJzZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOw0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyAgICAgICAgYnVmLmFwcGVuZCgia2V5OiB2YWx1ZSIgKyBMUyk7DQorICAgICAgICBidWYuYXBwZW5kKCJrZXkyOiB2YWx1ZTIiKTsgLy8gbm8gRU9MIC0tIHRoaXMgaXMgaW50ZW50aW9uYWwNCisgICAgICAgIFByb3BlcnRpZXMgcCA9IHRvUHJvcGVydGllcyhidWYudG9TdHJpbmcoKSk7DQorICAgICAgICBhc3NlcnRQcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXVtdew0KKyAgICAgICAgICAgIHsgImtleSIsICJ2YWx1ZSIgfSwgeyAia2V5MiIsICJ2YWx1ZTIiIH0gfSwgcCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorICAgICAgICBidWYuYXBwZW5kKCIjIHRoaXMgaXMgYSBjb21tZW50IiArIExTKTsNCisgICAgICAgIGJ1Zi5hcHBlbmQoIiAjIGFub3RoZXIgb25lLCB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZQkiICsgTFMpOw0KKyAgICAgICAgYnVmLmFwcGVuZCgiIAkjIAlhbmQgbW9yZSB3aXRoIGludGVyZXN0aW5nIHdoaXRlc3BhY2UJIiArIExTKTsNCisgICAgICAgIGJ1Zi5hcHBlbmQoIiEgYW5kIHdpdGggYSAhIGRlbGltaXRlciIgKyBMUyk7DQorICAgICAgICBidWYuYXBwZW5kKCIhIGFuZCB3aXRoIGVzY2FwZSBcdCBjaGFycyIgKyBMUyk7DQorICAgICAgICBidWYuYXBwZW5kKCIjYW5kIGEgY29tbWVudCB3aXRoIG5vIHdoaXRlc3BhY2UiICsgTFMpOw0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKGJ1Zi50b1N0cmluZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygwLCBwLnNpemUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyAgICAgICAgYnVmLmFwcGVuZCgiIyB0aGlzIGlzIGEgY29tbWVudCIgKyBMUyk7DQorICAgICAgICBidWYuYXBwZW5kKCIgIyBhbm90aGVyIG9uZSwgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UJIiArIExTKTsNCisgICAgICAgIGJ1Zi5hcHBlbmQoImZvbzogYmFyI2JheiIgKyBMUyk7DQorICAgICAgICBidWYuYXBwZW5kKCIhIGFuZCB3aXRoIGEgISBkZWxpbWl0ZXIiICsgTFMpOw0KKyAgICAgICAgYnVmLmFwcGVuZCgiISBhbmQgd2l0aCBlc2NhcGUgXHQgY2hhcnMiICsgTFMpOw0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKGJ1Zi50b1N0cmluZygpKTsNCisgICAgICAgIGFzc2VydFByb3BlcnRpZXMobmV3IFN0cmluZ1tdW117IHsgImZvbyIsICJiYXIjYmF6IiB9IH0sIHApOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUxpbmVJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgcyA9ICJmb286IGJhclxcIiArIExTICsgIm1vcmUgbGluZSBnb2VzIGhlcmUiOw0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKHMpOw0KKyAgICAgICAgYXNzZXJ0UHJvcGVydGllcygNCisgICAgICAgICAgICBuZXcgU3RyaW5nW11bXXsgeyAiZm9vIiwgImJhcm1vcmUgbGluZSBnb2VzIGhlcmUiIH0gfSwgcCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5TGluZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKExTICsgImZvbzogYmFyIiArIExTICsgTFMgKyAiYmF6OiB2YWwiKTsNCisgICAgICAgIGFzc2VydFByb3BlcnRpZXMobmV3IFN0cmluZ1tdW117IHsgImZvbyIsICJiYXIiIH0sIHsgImJheiIsICJ2YWwiIH0gfSwNCisgICAgICAgICAgICBwKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGxlZnQgb3V0IHRoZSB0cmFpbGluZyBlbmQgbGluZQ0KKyAgICAgICAgU3RyaW5nIHMgPSAiZm9vOiBiYXIiICsgTFMgKyAiYmF6OiB2YWwiOw0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKHMpOw0KKyAgICAgICAgYXNzZXJ0UHJvcGVydGllcyhuZXcgU3RyaW5nW11bXXsgeyAiZm9vIiwgImJhciIgfSwgeyAiYmF6IiwgInZhbCIgfSB9LA0KKyAgICAgICAgICAgIHApOw0KKw0KKyAgICAgICAgcC5wdXQoIm5ldy1rZXkiLCAidmFsMSIpOw0KKyAgICAgICAgcC5wdXQoIm5ldy1rZXktMiIsICJ2YWwyIik7DQorICAgICAgICBwLnB1dCgiYW5vdGhlci1uZXcta2V5IiwgInZhbDMiKTsNCisgICAgICAgIGFzc2VydFJvdW5kVHJpcChzICsgTFMgKyAibmV3LWtleTogdmFsMSIgKyBMUyArICJuZXcta2V5LTI6IHZhbDIiICsgTFMgKw0KKyAgICAgICAgICAgICJhbm90aGVyLW5ldy1rZXk6IHZhbDMiICsgTFMsIHApOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbmRNdXRhdGVQcm9wZXJ0aWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIGludGVudGlvbmFsbHkgbGVmdCBvdXQgdGhlIHRyYWlsaW5nIGVuZCBsaW5lDQorICAgICAgICBQcm9wZXJ0aWVzIHAgPSB0b1Byb3BlcnRpZXMoImZvbzogYmFyIiArIExTICsgImJhejogdmFsIik7DQorICAgICAgICBhc3NlcnRQcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXVtdeyB7ICJmb28iLCAiYmFyIiB9LCB7ICJiYXoiLCAidmFsIiB9IH0sDQorICAgICAgICAgICAgcCk7DQorDQorICAgICAgICBwLnB1dCgibmV3LWtleSIsICJuZXcgdmFsdWUiKTsNCisgICAgICAgIHAucHV0KCJmb28iLCAiYmFyYmFyIik7DQorICAgICAgICBhc3NlcnRSb3VuZFRyaXAoImZvbzogYmFyYmFyIiArIExTICsgImJhejogdmFsIiArIExTIA0KKyAgICAgICAgICAgICsgIm5ldy1rZXk6IG5ldyB2YWx1ZSIgKyBMUywgcCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEVzY2FwZWRFcXVhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKCJmb289YmFyXFw9V0FSTixiYXpcXD1UUkFDRSIpOw0KKyAgICAgICAgYXNzZXJ0UHJvcGVydGllcyhuZXcgU3RyaW5nW11bXXsgeyAiZm9vIiwgImJhcj1XQVJOLGJhej1UUkFDRSIgfSB9LCBwKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVR5cGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorICAgICAgICBidWYuYXBwZW5kKCIgICAhY29tbWVudCIgKyBMUyArICIgXHQgICIgKyBMUyArICJuYW1lID0gbm8iICsgTFMgKyAiICAgICINCisgICAgICAgICAgICArICIjbW9yZWNcdG9tbVxcIiArIExTICsgImVudHMiICsgTFMgKyBMUyArICIgIGRvZz1ub1xcY2F0ICAgIiArIExTIA0KKyAgICAgICAgICAgICsgImJ1cnBzICAgIDoiICsgTFMgKyAidGVzdD0iICsgTFMgKyAiZGF0ZSB0b2RheSIgKyBMUyArIExTICsgTFMgDQorICAgICAgICAgICAgKyAibG9uZ1xcIiArIExTICsgIiAgIHZhbHVlPXRyeWluIFxcIiArIExTICsgIiAiDQorICAgICAgICAgICAgKyAiZ3RvIiArIExTICsgIjQ6dmllciIgKyBMUyArICJ2aWVyICAgICA6NCIpOw0KKyAgICAgICAgUHJvcGVydGllcyBwID0gdG9Qcm9wZXJ0aWVzKGJ1Zi50b1N0cmluZygpKTsNCisgICAgICAgIGFzc2VydFByb3BlcnRpZXMobmV3IFN0cmluZ1tdW117DQorICAgICAgICAgICAgeyAibmFtZSIsICJubyIgfSwgeyAiZW50cyIsICIiIH0sIHsgImRvZyIsICJub2NhdCAgICIgfSwNCisgICAgICAgICAgICB7ICJidXJwcyIsICIiIH0sIHsgInRlc3QiLCAiIiB9LCB7ICJkYXRlIiwgInRvZGF5IiB9LA0KKyAgICAgICAgICAgIHsgImxvbmd2YWx1ZSIsICJ0cnlpbiBndG8iIH0sIHsgIjQiLCAidmllciIgfSwgeyAidmllciIsICI0IiB9LA0KKyAgICAgICAgfSwgcCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFNwZWNpYWxDaGFycygpIHRocm93cyBUaHJvd2FibGUgew0KKyAgICAgICAgdGVzdFNwZWNpYWxDaGFycyhmYWxzZSwgdHJ1ZSk7DQorICAgICAgICB0ZXN0U3BlY2lhbENoYXJzKHRydWUsIHRydWUpOw0KKyAgICAgICAgdGVzdFNwZWNpYWxDaGFycyhmYWxzZSwgZmFsc2UpOw0KKyAgICAgICAgdGVzdFNwZWNpYWxDaGFycyh0cnVlLCBmYWxzZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRlc3QgdGhhdCBzcGVjaWFsIGNoYXJhY3RlcnMgd29yay4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZvcm1hdHRpbmdQcm9wcyBpZiB0cnVlLCB0ZXN0IGFnYWluc3QgdGhlDQorICAgICAqIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzLCBvdGhlcndpc2UgdGVzdA0KKyAgICAgKiBhZ2FpbnN0IGEgbm9ybWFsIFByb3BlcnRpZXMgaW5zdGFuY2UoZm9yIHZhbGlkYXRpb24gb2YgdGhlIHRlc3QgY2FzZSkuDQorICAgICAqIEBwYXJhbSB2YWx1ZSB3aGV0aGVyIHRvIHRlc3QgdGhlIGtleSBvciB0aGUgdmFsdWUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsQ2hhcnMoYm9vbGVhbiBmb3JtYXR0aW5nUHJvcHMsIGJvb2xlYW4gdmFsdWUpDQorICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsNCisgICAgICAgIExpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsNCisgICAgICAgICAgICAieHh5eSIsICJ4eFxceXkiLCAieHgiICsgTFMgKyAieXkiLCAieHhcXG55eSIsICJ4eFx0eXkiLCAieHhcXHR5eSIsDQorICAgICAgICAgICAgInh4XHJ5eSIsICJ4eFxccnl5IiwgInh4XGZ5eSIsICJ4eFxcZnl5IiwgInh4XHIiICsgTFMgKyAiXFxcdFxyXHQiIA0KKyAgICAgICAgICAgICsgTFMgKyAieXkiLA0KKyAgICAgICAgICAgICJ4eFxcciIgKyBMUyArICJcXFx0XFxyXHRcXG55eSIsDQorICAgICAgICAgICAgInh4XHIiICsgTFMgKyAiXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcdFxyXHQiICsgTFMgKyAieXkiLA0KKyAgICAgICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlc1xcU29tZSBBcHBsaWNhdGlvblxcT3BlbkpQQVxcTXkgRmlsZS5kYXQiLCB9KSk7DQorDQorICAgICAgICAvLyBhbHNvIHN0b3JlIGV2ZXJ5IGluZGl2aWR1YWwgY2hhcmFjdGVyDQorICAgICAgICBmb3IgKGNoYXIgYyA9ICdhJzsgYyA8ICdaJzsgYysrKSB7DQorICAgICAgICAgICAgdmFsdWVMaXN0LmFkZChuZXcgU3RyaW5nKG5ldyBjaGFyW117IGMgfSkpOw0KKyAgICAgICAgICAgIHZhbHVlTGlzdC5hZGQobmV3IFN0cmluZyhuZXcgY2hhcltdeyBjLCAnXFwnLCBjIH0pKTsNCisgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKG5ldyBTdHJpbmcobmV3IGNoYXJbXXsgJ1xcJywgYyB9KSk7DQorICAgICAgICB9DQorDQorICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSAoU3RyaW5nW10pIHZhbHVlTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOw0KKw0KKyAgICAgICAgZmluYWwgU3RyaW5nIGR1bW15ID0gIlhYWCI7DQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIC8vIHRlc3Qgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGVpdGhlciBrZXlzIG9yIHZhbHVlcw0KKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSB2YWx1ZSA/IHZhbHVlc1tpXSA6IGR1bW15Ow0KKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSB2YWx1ZSA/IGR1bW15IDogdmFsdWVzW2ldOw0KKw0KKyAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IGZvcm1hdHRpbmdQcm9wcyA/DQorICAgICAgICAgICAgICAgIG5ldyBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcygpIDogbmV3IFByb3BlcnRpZXMoKTsNCisgICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzKSB7DQorICAgICAgICAgICAgICAgIC8vIHNldCB0aGVzZSBwcm9wZXJ0aWVzIHNvIHdlIGJlaGF2ZSB0aGUgc2FtZSB3YXkgYXMNCisgICAgICAgICAgICAgICAgLy8gamF2YS51dGlsLlByb3BlcnRpZXMNCisgICAgICAgICAgICAgICAgKChGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcykgcCkuc2V0RGVmYXVsdEVudHJ5RGVsaW1pdGVyKCc9Jyk7DQorICAgICAgICAgICAgICAgICgoRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMpIHApLg0KKyAgICAgICAgICAgICAgICAgICAgc2V0QWRkV2hpdGVzcGFjZUFmdGVyRGVsaW1pdGVyKGZhbHNlKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcC5zZXRQcm9wZXJ0eShrZXksIHZhbCk7DQorICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgICAgICBwLnN0b3JlKG91dCwgbnVsbCk7DQorDQorICAgICAgICAgICAgUHJvcGVydGllcyBjb3B5ID0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgICAgICAgICBjb3B5LnNldFByb3BlcnR5KGtleSwgdmFsKTsNCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29weU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgICAgICBjb3B5LnN0b3JlKGNvcHlPdXQsIG51bGwpOw0KKw0KKyAgICAgICAgICAgIHAgPSBmb3JtYXR0aW5nUHJvcHMgPw0KKyAgICAgICAgICAgICAgICBuZXcgRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMoKSA6IG5ldyBQcm9wZXJ0aWVzKCk7DQorDQorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbQ0KKyAgICAgICAgICAgICAgICAobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7DQorDQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIDIgcHJvcGVydGllcyBzZXJpYWxpemVkIGFyZSB0aGUgc2FtZQ0KKyAgICAgICAgICAgICAgICBTdHJpbmcgY29weU91dFN0cmluZyA9IHN0cmlwQ29tbWVudHMoY29weU91dC50b0J5dGVBcnJheSgpKTsNCisgICAgICAgICAgICAgICAgU3RyaW5nIG91dFN0cmluZyA9IHN0cmlwQ29tbWVudHMob3V0LnRvQnl0ZUFycmF5KCkpOw0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29weU91dFN0cmluZywgb3V0U3RyaW5nKTsNCisNCisgICAgICAgICAgICAgICAgcC5sb2FkKGluKTsNCisNCisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBudWxsIiwNCisgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoa2V5KSk7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwudHJpbSgpLCBwLmdldFByb3BlcnR5KGtleSkudHJpbSgpKTsNCisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgaW9lKSB7DQorICAgICAgICAgICAgICAgIGlmICghZm9ybWF0dGluZ1Byb3BzKQ0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW9lOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBidWcoMTIxMSwgaW9lLA0KKyAgICAgICAgICAgICAgICAvLyAiQ2Fubm90IHN0b3JlIGJhY2tzbGFzaCBpbiBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcyIpOw0KKyAgICAgICAgICAgICAgICB0aHJvdyBpb2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHN0YXRpYyBDaGFyYWN0ZXIgcmFuZG9tQ2hhcigpIHsNCisgICAgICAgIGNoYXIgW10gVEVTVF9DSEFSX0FSUkFZID0gbmV3IGNoYXIgW117DQorICAgICAgICAgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywNCisgICAgICAgICAgICAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLA0KKyAgICAgICAgICAgICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAnMScsDQorICAgICAgICAgICAgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScgfTsNCisNCisgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKFRFU1RfQ0hBUl9BUlJBWVsNCisgICAgICAgICAgICAoaW50KSAoTWF0aC5yYW5kb20oKSAqIFRFU1RfQ0hBUl9BUlJBWS5sZW5ndGgpXSk7DQorICAgIH0NCisNCisgICAgc3RhdGljIFN0cmluZyByYW5kb21TdHJpbmcoaW50IGxlbikgew0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgKE1hdGgucmFuZG9tKCkgKiBsZW4pICsgMTsgaSsrKQ0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocmFuZG9tQ2hhcigpKTsNCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1aXZhbGVudFN0b3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFByb3BlcnRpZXMgcDEgPSBuZXcgUHJvcGVydGllcygpOw0KKyAgICAgICAgRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMgcDIgPSBuZXcgRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMoKTsNCisNCisgICAgICAgICgoRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMpIHAyKS5zZXREZWZhdWx0RW50cnlEZWxpbWl0ZXIoJz0nKTsNCisgICAgICAgICgoRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMpIHAyKS5zZXRBZGRXaGl0ZXNwYWNlQWZ0ZXJEZWxpbWl0ZXIoZmFsc2UpOw0KKw0KKyAgICAgICAgU3RyaW5nW10gdmFsdWVzID0NCisgICAgICAgICAgICBuZXcgU3RyaW5nW10geyANCisgICAgICAgICAgICAgICAgIngiLCANCisgICAgICAgICAgICAgICAgIngiICsgTFMgKyAieSIsIA0KKyAgICAgICAgICAgICAgICAieFxcbnkiLCANCisgICAgICAgICAgICAgICAgInhcdHkiLCANCisgICAgICAgICAgICAgICAgInhcXHR5IiwNCisgICAgICAgICAgICAgICAgInhcZnkiLCANCisgICAgICAgICAgICAgICAgInhcXGZ5IiwgDQorICAgICAgICAgICAgICAgICJ4XHJ5IiwgDQorICAgICAgICAgICAgICAgICJ4XFxyeSIsIA0KKyAgICAgICAgICAgICAgICAiQzpcXEZvbyBCYXJcXEJheiIsDQorICAgICAgICAgICAgICAgIHJhbmRvbVN0cmluZyg1KS5yZXBsYWNlKCdhJywgJ1xcJyksDQorICAgICAgICAgICAgICAgIHJhbmRvbVN0cmluZyg1MDApLnJlcGxhY2UoJ2EnLCAnXFwnKSwNCisgICAgICAgICAgICAgICAgcmFuZG9tU3RyaW5nKDUwMDApLnJlcGxhY2UoJ2EnLCAnXFwnKSwgDQorICAgICAgICAgICAgICAgIH07DQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIHAxLmNsZWFyKCk7DQorICAgICAgICAgICAgcDIuY2xlYXIoKTsNCisNCisgICAgICAgICAgICBwMS5zZXRQcm9wZXJ0eSgieHh4IiwgdmFsdWVzW2ldKTsNCisgICAgICAgICAgICBwMi5zZXRQcm9wZXJ0eSgieHh4IiwgdmFsdWVzW2ldKTsNCisNCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0MSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0MiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisNCisgICAgICAgICAgICBwMS5zdG9yZShvdXQxLCBudWxsKTsNCisgICAgICAgICAgICBwMi5zdG9yZShvdXQyLCBudWxsKTsNCisNCisgICAgICAgICAgICBTdHJpbmcgczEgPSBuZXcgU3RyaW5nKG91dDEudG9CeXRlQXJyYXkoKSk7DQorICAgICAgICAgICAgU3RyaW5nIHMyID0gbmV3IFN0cmluZyhvdXQyLnRvQnl0ZUFycmF5KCkpOw0KKw0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIDwiICsgczEgKyAiPiBidXQgd2FzIDwiICsgczIgKyAiPiIsDQorICAgICAgICAgICAgICAgIHMxLmluZGV4T2YoczIpICE9IC0xKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBzdGF0aWMgU3RyaW5nIHN0cmlwQ29tbWVudHMoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcg0KKyAgICAgICAgICAgIChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKSk7DQorICAgICAgICBTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIFN0cmluZyBsaW5lOw0KKyAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCisgICAgICAgICAgICAvLyBza2lwIGNvbW1lbnRzDQorICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIiMiKSkNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgICAgc2J1Zi5hcHBlbmQobGluZSk7DQorICAgICAgICAgICAgc2J1Zi5hcHBlbmQoTFMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIHNidWYudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcyBwID0gbmV3IEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHRvUHJvcGVydGllcygiZm9vPWJhciIgKyBMUyArICJmb289YmF6IiwgcCk7DQorICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgZHVwbGljYXRlIGtleXMgdG8gY2F1c2UgZXhjZXB0aW9uIik7DQorICAgICAgICB9IGNhdGNoIChEdXBsaWNhdGVLZXlFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIC8vIGV4cGVjdGVkDQorICAgICAgICB9DQorDQorICAgICAgICAvLyBub3cgdGVzdCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3Igd2hlbiBkdXBsaWNhdGVzIGFyZSBhbGxvd2VkLg0KKyAgICAgICAgcCA9IG5ldyBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOw0KKyAgICAgICAgcC5zZXRBbGxvd0R1cGxpY2F0ZXModHJ1ZSk7DQorICAgICAgICB0b1Byb3BlcnRpZXMoImZvbz1iYXIiICsgTFMgKyAiZm9vPWJheiIsIHApOw0KKyAgICAgICAgYXNzZXJ0UHJvcGVydGllcyhuZXcgU3RyaW5nW11bXXsgeyAiZm9vIiwgImJheiIgfSB9LCBwKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVMb2FkcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgcHJvcHMgPSAiZm9vPWJhciIgKyBMUyArICJiYXo9cXV1eCI7DQorICAgICAgICBTdHJpbmcgcHJvcHMyID0gImE9YiIgKyBMUyArICJjPWQiOw0KKyAgICAgICAgUHJvcGVydGllcyB2YW5pbGxhID0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgICAgIHZhbmlsbGEubG9hZChuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbQ0KKyAgICAgICAgICAgIChuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0ocHJvcHMpKSk7DQorICAgICAgICB2YW5pbGxhLmxvYWQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0NCisgICAgICAgICAgICAobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHByb3BzMikpKTsNCisNCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOw0KKyAgICAgICAgcC5sb2FkKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShwcm9wcykpKTsNCisgICAgICAgIHAubG9hZChuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0ocHJvcHMyKSkpOw0KKyAgICAgICAgYXNzZXJ0UHJvcGVydGllc1NhbWUodmFuaWxsYSwgcCk7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzIHRvUHJvcGVydGllcyhTdHJpbmcgcykNCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gdG9Qcm9wZXJ0aWVzKHMsIG5ldyBGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcygpKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMgdG9Qcm9wZXJ0aWVzKFN0cmluZyBzLA0KKyAgICAgICAgRm9ybWF0UHJlc2VydmluZ1Byb3BlcnRpZXMgcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFByb3BlcnRpZXMgdmFuaWxsYSA9IG5ldyBQcm9wZXJ0aWVzKCk7DQorICAgICAgICB2YW5pbGxhLmxvYWQobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHMpKTsNCisNCisgICAgICAgIHAubG9hZChuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0ocykpOw0KKyAgICAgICAgYXNzZXJ0Um91bmRUcmlwKHMsIHApOw0KKw0KKyAgICAgICAgYXNzZXJ0UHJvcGVydGllc1NhbWUodmFuaWxsYSwgcCk7DQorDQorICAgICAgICByZXR1cm4gcDsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Um91bmRUcmlwKFN0cmluZyBzLCBQcm9wZXJ0aWVzIHApIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICAgICAgcC5zdG9yZShvdXQsIG51bGwpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIG91dC50b1N0cmluZygpKTsNCisNCisgICAgICAgIC8vIGFsc28gY2hlY2sgc2VyaWFsaXphYmxlDQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYm91dCkud3JpdGVPYmplY3QocCk7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIEZvcm1hdFByZXNlcnZpbmdQcm9wZXJ0aWVzIGRlc2VyaWFsaXplZCA9DQorICAgICAgICAgICAgICAgIChGb3JtYXRQcmVzZXJ2aW5nUHJvcGVydGllcykgbmV3IE9iamVjdElucHV0U3RyZWFtDQorICAgICAgICAgICAgICAgICAgICAobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvdXQudG9CeXRlQXJyYXkoKSkpLg0KKyAgICAgICAgICAgICAgICAgICAgcmVhZE9iamVjdCgpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwLCBkZXNlcmlhbGl6ZWQpOw0KKw0KKyAgICAgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgICAgICBkZXNlcmlhbGl6ZWQuc3RvcmUob3V0LCBudWxsKTsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocywgb3V0LnRvU3RyaW5nKCkpOw0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7DQorICAgICAgICAgICAgZmFpbChjbmZlICsgIiIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgYWN0dWFsKSB7DQorICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKQ0KKyAgICAgICAgICAgIHJldHVybjsNCisNCisgICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsIHx8ICFleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSkNCisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCA8IiArIGV4cGVjdGVkICsgIj4gYnV0IHdhcyA8IiArIGFjdHVhbCArICI+Iik7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFByb3BlcnRpZXNTYW1lKFByb3BlcnRpZXMgdmFuaWxsYSwgUHJvcGVydGllcyBwKSB7DQorICAgICAgICBhc3NlcnRFcXVhbHModmFuaWxsYSwgcCk7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJvcGVydGllcyhTdHJpbmdbXVtdIHN0cmluZ3MsIFByb3BlcnRpZXMgcCkgew0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzdHJpbmdzW2ldWzFdLCBwLmdldChzdHJpbmdzW2ldWzBdKSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoc3RyaW5ncy5sZW5ndGgsIHAuc2l6ZSgpKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RSZWZlcmVuY2VTZXQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdFJlZmVyZW5jZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGQ5NTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RSZWZlcmVuY2VTZXQuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBSZWZlcmVuY2VIYXNoU2V0fS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFJlZmVyZW5jZVNldCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUmVmZXJlbmNlSGFzaFNldCBfY29sbCA9IG5ldyBSZWZlcmVuY2VIYXNoU2V0CisgICAgICAgIChSZWZlcmVuY2VIYXNoU2V0LldFQUspOworCisgICAgcHJpdmF0ZSBPYmplY3QgX2hlbGRWYWx1ZSA9IG5ldyBJbnRlZ2VyKDIpOworCisgICAgcHVibGljIFRlc3RSZWZlcmVuY2VTZXQoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIF9jb2xsLmFkZChfaGVsZFZhbHVlKTsKKyAgICAgICAgX2NvbGwuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBiYXNpYyBhZGQvY29udGFpbnMvcmVtb3ZlIGZ1bmN0aW9uYWxpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljcygpIHsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gbmV3IFJlZmVyZW5jZUhhc2hTZXQoUmVmZXJlbmNlSGFzaFNldC5XRUFLKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvbGwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghY29sbC5jb250YWlucygiZm9vIikpOworCisgICAgICAgIGFzc2VydFRydWUoY29sbC5hZGQoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbGwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsLmNvbnRhaW5zKCJmb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgY29sbC5pdGVyYXRvcigpLm5leHQoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSghY29sbC5yZW1vdmUoImJhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbGwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2xsLnJlbW92ZSgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY29sbC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbGwuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdmFsdWVzIHdpdGggc3Ryb25nIHJlZmVyZW5jZXMgYXJlIG5vdCBnYydkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxkUmVmZXJlbmNlKCkgeworICAgICAgICBpZiAoSmF2YVZlcnNpb25zLlZFUlNJT04gPj0gNSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgIGFzc2VydFRydWUoX2NvbGwuY29udGFpbnMoX2hlbGRWYWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB3ZWFrIHJlZmVyZW5jZXMgYXJlIGdjJ2QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdlYWtSZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChKYXZhVmVyc2lvbnMuVkVSU0lPTiA+PSA1KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghX2NvbGwuY29udGFpbnMobmV3IEludGVnZXIoMSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIF9jb2xsLnNpemUoKSk7CisKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9jb2xsLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IHNpemUrKykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhfaGVsZFZhbHVlLCBpdHIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNpemUpOworCisgICAgICAgIC8vIHJ1biBhIG11dGF0b3IgbWV0aG9kIHRvIGVuc3VyZSBleHBpcmVkIGVsZW1lbnRzIGFyZSByZW1vdmVkCisgICAgICAgIF9jb2xsLmFkZCgiZm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBfY29sbC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKF9jb2xsLmNvbnRhaW5zKCJmb28iKSk7CisgICAgICAgIGFzc2VydFRydWUoX2NvbGwuY29udGFpbnMoX2hlbGRWYWx1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKCFfY29sbC5jb250YWlucyhuZXcgSW50ZWdlcigxKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gcmVwbGFjZWQgYXJlbid0IGV4cGlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZVZhbHVlKCkgeworICAgICAgICBpZiAoSmF2YVZlcnNpb25zLlZFUlNJT04gPj0gNSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBPYmplY3QgaGVsZCA9IG5ldyBJbnRlZ2VyKDEpOworICAgICAgICBhc3NlcnRUcnVlKF9jb2xsLnJlbW92ZShoZWxkKSk7CisgICAgICAgIGFzc2VydFRydWUoX2NvbGwuYWRkKGhlbGQpKTsKKyAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgIFN5c3RlbS5nYygpOworCisgICAgICAgIC8vIHJ1biBhIG11dGF0b3IgdG8gY2xlYXIgZXhwaXJlZCByZWZlcmVuY2VzCisgICAgICAgIF9jb2xsLmFkZCgiZm9vIik7CisgICAgICAgIGFzc2VydFRydWUoX2NvbGwuY29udGFpbnMoaGVsZCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdFNpbXBsZVJlZ2V4LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RTaW1wbGVSZWdleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmI0NjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RTaW1wbGVSZWdleC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIFRlc3RzIHNpbXBsZSByZWdleCBmb3IgdXNlIGluIGluLW1lbW9yeSBxdWVyeSBleGVjdXRpb24uCisgKgorICogQGF1dGhvciBHcmVnIENhbXBiZWxsCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2ltcGxlUmVnZXggZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hFeHByKFN0cmluZyB0YXJnZXQsIFN0cmluZyBleHByLCBib29sZWFuIGNhc2VJbnNlbnMpIHsKKyAgICAgICAgU2ltcGxlUmVnZXggcmUgPSBuZXcgU2ltcGxlUmVnZXgoZXhwciwgY2FzZUluc2Vucyk7CisgICAgICAgIHJldHVybiByZS5tYXRjaGVzKHRhcmdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkcygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXRjaEV4cHIoIkhlbGxvIiwgIkhlbGxvIiwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWF0Y2hFeHByKCJIZWxsbyIsICJCeWUiLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShtYXRjaEV4cHIoIkhlbGxvIiwgIkJ5ZUJ5ZSIsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hdGNoRXhwcigiSGVsbG8iLCAiSGVsbG9vbyIsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hdGNoRXhwcigiSGVsbG8iLCAiSEhlbGxvIiwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXRjaEV4cHIoIkhlbGxvIiwgIkgubGxvIiwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXRjaEV4cHIoIkhlbGxvIiwgIkhlbGwuKiIsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobWF0Y2hFeHByKCJZbyBIZWxsbyIsICIuKmVsbG8iLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiSGVsbG8iLCAiLiplbGxvIiwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXRjaEV4cHIoIkhlbGxvIiwgIi4qZWxsLioiLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiSGVsbG93IiwgIi4qZWxsLioiLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiSGVsbG8iLCAiSGVsLipsbyIsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobWF0Y2hFeHByKCJIZWxZb2xvIiwgIkhlbC4qbG8iLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiSGVsbG8iLCAiSC4qbG8iLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShtYXRjaEV4cHIoIkhlbGxvd2UiLCAiSC4qbG8iLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiSGVsbG8iLCAiaC4qbG8iLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hdGNoRXhwcigiSGVsbG8iLCAiaC4qbG8iLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2ciLAorICAgICAgICAgICAgIlRoZSAuKmJyb3duLipkb2ciLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2ciLAorICAgICAgICAgICAgIlRoZSAuKmJyLnduLipkLmciLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hdGNoRXhwcigidGhlIHF1aWNrIEJSb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2ciLAorICAgICAgICAgICAgIlRoZSAuKmJyLnduLipkLmciLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1hdGNoRXhwcigiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2ciLAorICAgICAgICAgICAgIlRoZSAuKmJyb3duLipkb2dnIiwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWF0Y2hFeHByKCJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZyIsCisgICAgICAgICAgICAiVFRoZSAuKmJyb3duLipkb2dnIiwgZmFsc2UpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtYXRjaEV4cHIoIllvIEhlbGxvdyIsICIuKmVsbG8iLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShtYXRjaEV4cHIoIkhlbGxvdyIsICIuKllvSGVsbG8iLCBmYWxzZSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdFNpbXBsZVJlZ2V4LmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RUZW1wb3JhcnlDbGFzc0xvYWRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0VGVtcG9yYXJ5Q2xhc3NMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmMyZmVmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9UZXN0VGVtcG9yYXJ5Q2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VGVtcG9yYXJ5Q2xhc3NMb2FkZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcG9yYXJ5Q2xhc3NMb2FkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0IHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFRlbXBvcmFyeUNsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuVGVtcENsYXNzIiwKKyAgICAgICAgICAgICAgICB0cnVlLCBsb2FkZXIpOworICAgICAgICAgICAgcy5hZGQoY2xzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsb2FkZXIsIGNscy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgcy5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBUZW1wQ2xhc3MgeworCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RUeXBlZFByb3BlcnRpZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdFR5cGVkUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGIxM2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RUeXBlZFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFR5cGVkUHJvcGVydGllc30gdHlwZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFR5cGVkUHJvcGVydGllcyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgVHlwZWRQcm9wZXJ0aWVzIF9wcm9wcyA9IG51bGw7CisgICAgcHJpdmF0ZSBUeXBlZFByb3BlcnRpZXMgX2RlZnMgPSBudWxsOworCisgICAgcHVibGljIFRlc3RUeXBlZFByb3BlcnRpZXMoU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIF9wcm9wcyA9IG5ldyBUeXBlZFByb3BlcnRpZXMoKTsKKyAgICAgICAgX3Byb3BzLnNldFByb3BlcnR5KCJib29sIiwgInRydWUiKTsKKyAgICAgICAgX3Byb3BzLnNldFByb3BlcnR5KCJpbnQiLCAiMSIpOworICAgICAgICBfcHJvcHMuc2V0UHJvcGVydHkoImxvbmciLCAiMiIpOworICAgICAgICBfcHJvcHMuc2V0UHJvcGVydHkoImZsb2F0IiwgIjEuMSIpOworICAgICAgICBfcHJvcHMuc2V0UHJvcGVydHkoImRvdWJsZSIsICIyLjIiKTsKKworICAgICAgICBfZGVmcyA9IG5ldyBUeXBlZFByb3BlcnRpZXMoX3Byb3BzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBiYXNpYyB0eXBlZCBnZXRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlcygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShfcHJvcHMuZ2V0Qm9vbGVhblByb3BlcnR5KCJib29sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgX3Byb3BzLmdldEludFByb3BlcnR5KCJpbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgX3Byb3BzLmdldExvbmdQcm9wZXJ0eSgibG9uZyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMUYsIF9wcm9wcy5nZXRGbG9hdFByb3BlcnR5KCJmbG9hdCIpLCAwLjAxRik7CisgICAgICAgIGFzc2VydEVxdWFscygyLjJELCBfcHJvcHMuZ2V0RG91YmxlUHJvcGVydHkoImRvdWJsZSIpLCAwLjAxRCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMi4yIiwgX3Byb3BzLmdldFByb3BlcnR5KCJkb3VibGUiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIGRlZmF1bHRzIHJldHVybmVkIGZvciBtaXNzaW5nIGtleXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdHMoKSB7CisgICAgICAgIGFzc2VydFRydWUoIV9wcm9wcy5nZXRCb29sZWFuUHJvcGVydHkoImJvb2wyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgX3Byb3BzLmdldEludFByb3BlcnR5KCJpbnQyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIF9wcm9wcy5nZXRMb25nUHJvcGVydHkoImxvbmcyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEYsIF9wcm9wcy5nZXRGbG9hdFByb3BlcnR5KCJmbG9hdDIiKSwgMEYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEQsIF9wcm9wcy5nZXREb3VibGVQcm9wZXJ0eSgiZG91YmxlMiIpLCAwRCk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBfcHJvcHMuZ2V0UHJvcGVydHkoImRvdWJsZTIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIGRlZmF1bHRzIHJldHVybmVkIGJ5IGtleXMgZm91bmQgaW4gdGhlIGRlZmF1bHQKKyAgICAgKiBiYWNraW5nIHByb3BlcnRpZXMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgeworICAgICAgICBhc3NlcnRUcnVlKF9kZWZzLmdldEJvb2xlYW5Qcm9wZXJ0eSgiYm9vbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIF9kZWZzLmdldEludFByb3BlcnR5KCJpbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgX2RlZnMuZ2V0TG9uZ1Byb3BlcnR5KCJsb25nIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4xRiwgX2RlZnMuZ2V0RmxvYXRQcm9wZXJ0eSgiZmxvYXQiKSwgMC4wMUYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi4yRCwgX2RlZnMuZ2V0RG91YmxlUHJvcGVydHkoImRvdWJsZSIpLCAwLjAxRCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMi4yIiwgX2RlZnMuZ2V0UHJvcGVydHkoImRvdWJsZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGdpdmVuIGRlZmF1bHRzIHdvcmtzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHaXZlbkRlZmF1bHRzKCkgeworICAgICAgICBhc3NlcnRUcnVlKF9wcm9wcy5nZXRCb29sZWFuUHJvcGVydHkoImJvb2wyIiwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgX3Byb3BzLmdldEludFByb3BlcnR5KCJpbnQyIiwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIF9wcm9wcy5nZXRMb25nUHJvcGVydHkoImxvbmcyIiwgMkwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMUYsIF9wcm9wcy5nZXRGbG9hdFByb3BlcnR5KCJmbG9hdDIiLCAxLjFGKSwgMC4wMUYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi4yRCwgX3Byb3BzLmdldERvdWJsZVByb3BlcnR5KCJkb3VibGUyIiwgMi4yRCksIDAuMDFEKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjIiLCBfcHJvcHMuZ2V0UHJvcGVydHkoImRvdWJsZTIiLCAiMi4yIikpOworCisgICAgICAgIGFzc2VydFRydWUoX2RlZnMuZ2V0Qm9vbGVhblByb3BlcnR5KCJib29sIiwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIF9kZWZzLmdldEludFByb3BlcnR5KCJpbnQiLCAyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgX2RlZnMuZ2V0TG9uZ1Byb3BlcnR5KCJsb25nIiwgM0wpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMUYsIF9kZWZzLmdldEZsb2F0UHJvcGVydHkoImZsb2F0IiwgMi4yRiksIDAuMDFGKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMkQsIF9kZWZzLmdldERvdWJsZVByb3BlcnR5KCJkb3VibGUiLCAzLjNEKSwgMC4wMUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIuMiIsIF9kZWZzLmdldFByb3BlcnR5KCJkb3VibGUiLCAiMy4zIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFR5cGVkUHJvcGVydGllcy5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RVVUlER2VuZXJhdG9yLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL1Rlc3RVVUlER2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNTZiYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvVGVzdFVVSURHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBVVUlEIGdlbmVyYXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RVVUlER2VuZXJhdG9yIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFVuaXF1ZVN0cmluZygpIHsKKyAgICAgICAgU2V0IHNlZW4gPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlZW4uYWRkKFVVSURHZW5lcmF0b3IubmV4dFN0cmluZygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVuaXF1ZUhleCgpIHsKKyAgICAgICAgU2V0IHNlZW4gPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlZW4uYWRkKFVVSURHZW5lcmF0b3IubmV4dEhleCgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1Rlc3RDb25jdXJyZW50TWFwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL2NvbmN1cnJlbnQvVGVzdENvbmN1cnJlbnRNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY1MDkyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC9jb25jdXJyZW50L1Rlc3RDb25jdXJyZW50TWFwLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5SZWZlcmVuY2VNYXA7CisKKy8qKgorICogVGVzdHMgdGhlIG1ldGhvZHMgb2Yge0BsaW5rIENvbmN1cnJlbnRNYXB9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29uY3VycmVudE1hcCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRSSUVTID0gMzMzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTEVFUCA9IDM7CisKKyAgICBwcml2YXRlIENvbmN1cnJlbnRNYXBbXSBfbWFwcyA9IG5ldyBDb25jdXJyZW50TWFwW117CisgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcCgpLAorICAgICAgICBuZXcgQ29uY3VycmVudFJlZmVyZW5jZUhhc2hNYXAoUmVmZXJlbmNlTWFwLkhBUkQsIFJlZmVyZW5jZU1hcC5IQVJEKSwgfTsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVOVFJJRVM7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfbWFwcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGludCBrZXkgPSBqICogRU5UUklFUyArIGk7CisgICAgICAgICAgICAgICAgX21hcHNbal0ucHV0KG5ldyBJbnRlZ2VyKGtleSksICJ2IiArIGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUmFuZG9tKCkgeworICAgICAgICBTZXQga2V5cyA9IG5ldyBUcmVlU2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRU5UUklFUzsgaSsrKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfbWFwcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlbW92ZVJhbmRvbShfbWFwc1tqXSwga2V5cykpOworICAgICAgICBwb3N0UmVtb3ZlVGVzdChrZXlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlbW92ZVJhbmRvbShDb25jdXJyZW50TWFwIG1hcCwgU2V0IGtleXMpIHsKKyAgICAgICAgTWFwLkVudHJ5IHJlbSA9IG1hcC5yZW1vdmVSYW5kb20oKTsKKyAgICAgICAgcmV0dXJuIHJlbSAhPSBudWxsICYmIHJlbS5nZXRWYWx1ZSgpLmVxdWFscygidiIgKyByZW0uZ2V0S2V5KCkpCisgICAgICAgICAgICAmJiBrZXlzLmFkZChyZW0uZ2V0S2V5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0UmVtb3ZlVGVzdChTZXQga2V5cykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKF9tYXBzW2ldLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCFfbWFwc1tpXS5jb250YWluc0tleShuZXcgSW50ZWdlcihFTlRSSUVTICogaSArIGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMudG9TdHJpbmcoKSwgRU5UUklFUyAqIF9tYXBzLmxlbmd0aCwga2V5cy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0ZXN0UmVtb3ZlUmFuZG9tVGhyZWFkZWQoKQorICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBTZXQga2V5cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgVHJlZVNldCgpKTsKKyAgICAgICAgUmVtb3ZlUmFuZG9tUnVubmFibGVbXSBydW5zID0KKyAgICAgICAgICAgIG5ldyBSZW1vdmVSYW5kb21SdW5uYWJsZVtFTlRSSUVTICogX21hcHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFTlRSSUVTOyBpKyspCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IF9tYXBzLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgIHJ1bnNbaiAqIEVOVFJJRVMgKyBpXSA9IG5ldyBSZW1vdmVSYW5kb21SdW5uYWJsZQorICAgICAgICAgICAgICAgICAgICAoX21hcHNbal0sIGtleXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBuZXcgVGhyZWFkKHJ1bnNbaV0pLnN0YXJ0KCk7CisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoU0xFRVAgKiBFTlRSSUVTICogX21hcHMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy52YWx1ZU9mKGkpLCAhcnVuc1tpXS5lcnJvcik7CisgICAgICAgICAgICBpZiAocnVuc1tpXS5pbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoaSkpOworICAgICAgICB9CisgICAgICAgIHBvc3RSZW1vdmVUZXN0KGtleXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRlKCkgeworICAgICAgICBpdGVyYXRpb25UZXN0KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgaXRlcmF0aW9uVGVzdChib29sZWFuIHJhbmRvbSkgeworICAgICAgICBTZXQga2V5cyA9IG5ldyBUcmVlU2V0KCk7CisgICAgICAgIExpc3Qgb3JkZXJlZCA9IG5ldyBBcnJheUxpc3QoMjAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gKHJhbmRvbSkgPyBfbWFwc1tpXS5yYW5kb21FbnRyeUl0ZXJhdG9yKCkKKyAgICAgICAgICAgICAgICA6IF9tYXBzW2ldLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInYiICsgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoa2V5cyArICI6OiAiICsgX21hcHNbaV0uZ2V0Q2xhc3MoKSArICI6OiIKKyAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRLZXkoKSArICI6OiIgKyBlbnRyeS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBrZXlzLmFkZChlbnRyeS5nZXRLZXkoKSkpOworICAgICAgICAgICAgICAgIG9yZGVyZWQuYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cy50b1N0cmluZygpLCBFTlRSSUVTICogX21hcHMubGVuZ3RoLCBrZXlzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBvcmRlcmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5kb21JdGVyYXRlKCkgeworICAgICAgICBMaXN0IGwxID0gaXRlcmF0aW9uVGVzdCh0cnVlKTsKKyAgICAgICAgTGlzdCBsMiA9IGl0ZXJhdGlvblRlc3QodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIWwxLmVxdWFscyhsMikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbW92ZVJhbmRvbVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVycm9yID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGludGVycnVwdGVkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwIF9tYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0IF9rZXlzOworCisgICAgICAgIHB1YmxpYyBSZW1vdmVSYW5kb21SdW5uYWJsZShDb25jdXJyZW50TWFwIG1hcCwgU2V0IGtleXMpIHsKKyAgICAgICAgICAgIF9tYXAgPSBtYXA7CisgICAgICAgICAgICBfa2V5cyA9IGtleXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKChsb25nKSAoTWF0aC5yYW5kb20oKSAqIFNMRUVQKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yID0gIXJlbW92ZVJhbmRvbShfbWFwLCBfa2V5cyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL3Rlc3Rsb2NhbGl6ZXIvTG9jYWxpemVyVGVzdEhlbHBlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC90ZXN0bG9jYWxpemVyL0xvY2FsaXplclRlc3RIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJkMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC90ZXN0bG9jYWxpemVyL0xvY2FsaXplclRlc3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC50ZXN0bG9jYWxpemVyOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB1c2VkIHNvIHRoYXQgdGhlIGxvY2FsaXplci5wcm9wZXJ0aWVzIGZpbGUgaW4gdGhpcyBwYWNrYWdlCisgKiBjYW4gYmUgYWNjZXNzZWQuIFRoZSBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBpbiB0aGUgc2FtZSBwYWNrYWdlKHNlcnAudXRpbCkKKyAqIGFzIHRoZSBtYWluIHRlc3RlciBjbGFzcyBiZWNhdXNlIG90aGVyIHV0aWxpdGllcyBpbiB0aGUgc291cmNlIGxpbmUgbWlnaHQKKyAqIGV2ZW50dWFsbHkgd2FudCB0byB1c2UgYSBsb2NhbGl6ZXIucHJvcGVydGllcyBmaWxlIGZvciB0aGF0IHBhY2thZ2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIExvY2FsaXplclRlc3RIZWxwZXIgeworCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvVGVzdERvY1R5cGVSZWFkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9UZXN0RG9jVHlwZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTdkZGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvVGVzdERvY1R5cGVSZWFkZXIuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnhtbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBEb2NUeXBlUmVhZGVyfSBieSBjb21wYXJpbmcgdGhlIHJlc3VsdHMgb2YgcGFzc2luZworICogdmFyaW91cyB4bWwgc3RyZWFtcyB0byB0aGUgZXhwZWN0ZWQgcmVzdWx0IHdpdGggaW5jbHVkZWQgZG9jIHR5cGUgaW5mby4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdERvY1R5cGVSZWFkZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBfZG9jVHlwZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbGlkWE1MID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfaW52YWxpZFhNTCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2V4cGVjdGVkWE1MID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfdmFsaWRIVE1MID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfZXhwZWN0ZWRIVE1MID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBfeG1sV2l0aERvY1R5cGUgPSBudWxsOworCisgICAgcHVibGljIFRlc3REb2NUeXBlUmVhZGVyKFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgZG9jVHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZG9jVHlwZS5hcHBlbmQoIjwhRE9DVFlQRSBmb28gW1xuIik7CisgICAgICAgIGRvY1R5cGUuYXBwZW5kKCJcdDwhRUxFTUVOVCBmb28gKGJhcik+XG4iKTsKKyAgICAgICAgZG9jVHlwZS5hcHBlbmQoIlx0PCFFTEVNRU5UIGJhciBFTVBUWT5cbiIpOworICAgICAgICBkb2NUeXBlLmFwcGVuZCgiXHQ8IUFUVExJU1QgYmFyIGF0dHIgQ0RBVEEgXCJ2YWx1ZVwiPlxuIik7CisgICAgICAgIGRvY1R5cGUuYXBwZW5kKCJcdDwhQVRUTElTVCBiYXIgYXR0cjIgQ0RBVEEgXCJ2YWx1ZTJcIj5cbiIpOworICAgICAgICBkb2NUeXBlLmFwcGVuZCgiXT5cbiIpOworICAgICAgICBfZG9jVHlwZSA9IGRvY1R5cGUudG9TdHJpbmcoKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWRYTUwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiI7CisgICAgICAgIFN0cmluZyBjb21tZW50ID0gIjwhLS0gc29tZSA8IC4uLiA+IDwhIGZ1bmt5IC0+IC0gY29tbWVudCAtLT5cbiI7CisgICAgICAgIGV4cGVjdGVkWE1MLmFwcGVuZChoZWFkZXIpOworICAgICAgICBleHBlY3RlZFhNTC5hcHBlbmQoY29tbWVudCk7CisgICAgICAgIGV4cGVjdGVkWE1MLmFwcGVuZChkb2NUeXBlLnRvU3RyaW5nKCkpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciB4bWxXaXRoRG9jVHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgeG1sV2l0aERvY1R5cGUuYXBwZW5kKGhlYWRlcik7CisgICAgICAgIHhtbFdpdGhEb2NUeXBlLmFwcGVuZChjb21tZW50KTsKKyAgICAgICAgeG1sV2l0aERvY1R5cGUuYXBwZW5kKGRvY1R5cGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZhbGlkWE1MID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB2YWxpZFhNTC5hcHBlbmQoIjxmb28+XG4iKTsKKyAgICAgICAgdmFsaWRYTUwuYXBwZW5kKCJcdDxiYXIgYXR0cj1cIm5ld1ZhbHVlXCIvPlxuIik7CisgICAgICAgIHZhbGlkWE1MLmFwcGVuZCgiPC9mb28+Iik7CisgICAgICAgIGV4cGVjdGVkWE1MLmFwcGVuZCh2YWxpZFhNTC50b1N0cmluZygpKTsKKyAgICAgICAgeG1sV2l0aERvY1R5cGUuYXBwZW5kKHZhbGlkWE1MLnRvU3RyaW5nKCkpOworICAgICAgICBfdmFsaWRYTUwgPSBoZWFkZXIgKyBjb21tZW50ICsgdmFsaWRYTUwudG9TdHJpbmcoKTsKKyAgICAgICAgX2V4cGVjdGVkWE1MID0gZXhwZWN0ZWRYTUwudG9TdHJpbmcoKTsKKyAgICAgICAgX3htbFdpdGhEb2NUeXBlID0geG1sV2l0aERvY1R5cGUudG9TdHJpbmcoKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgaW52YWxpZFhNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW52YWxpZFhNTC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4iKTsKKyAgICAgICAgaW52YWxpZFhNTC5hcHBlbmQoIjxmb28+XG4iKTsKKyAgICAgICAgaW52YWxpZFhNTC5hcHBlbmQoIlx0PHh4eCAvPlxuIik7CisgICAgICAgIGludmFsaWRYTUwuYXBwZW5kKCI8L2Zvbz4iKTsKKyAgICAgICAgX2ludmFsaWRYTUwgPSBpbnZhbGlkWE1MLnRvU3RyaW5nKCk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkSFRNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaGVhZGVyID0gIiAgIFxuICAiOworICAgICAgICBleHBlY3RlZEhUTUwuYXBwZW5kKGhlYWRlcik7CisgICAgICAgIGV4cGVjdGVkSFRNTC5hcHBlbmQoZG9jVHlwZS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZhbGlkSFRNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgdmFsaWRIVE1MLmFwcGVuZCgic29tZSBqdW5rIDxodG1sPjxib2R5PjwvYm9keT48L2h0bWw+ICAiKTsKKyAgICAgICAgZXhwZWN0ZWRIVE1MLmFwcGVuZCh2YWxpZEhUTUwudG9TdHJpbmcoKSk7CisgICAgICAgIF92YWxpZEhUTUwgPSBoZWFkZXIgKyB2YWxpZEhUTUwudG9TdHJpbmcoKTsKKyAgICAgICAgX2V4cGVjdGVkSFRNTCA9IGV4cGVjdGVkSFRNTC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYWdhaW5zdCBleHBlY3RlZCBkb2MgdHlwZSBpbmNsdXNpb24gYmVoYXZpb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluY2x1ZGVzRG9jVHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhfdmFsaWRYTUwsIGdldEluY2x1ZGVkU3RyaW5nKF92YWxpZFhNTCwgbnVsbCwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoX3ZhbGlkWE1MLCBnZXRJbmNsdWRlZFN0cmluZyhfdmFsaWRYTUwsIG51bGwsIDcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF92YWxpZEhUTUwsIGdldEluY2x1ZGVkU3RyaW5nKF92YWxpZEhUTUwsIG51bGwsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF92YWxpZEhUTUwsIGdldEluY2x1ZGVkU3RyaW5nKF92YWxpZEhUTUwsIG51bGwsIDcpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoX2V4cGVjdGVkWE1MLCBnZXRJbmNsdWRlZFN0cmluZyhfdmFsaWRYTUwsIF9kb2NUeXBlLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhfZXhwZWN0ZWRYTUwsIGdldEluY2x1ZGVkU3RyaW5nKF92YWxpZFhNTCwgX2RvY1R5cGUsIDcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9leHBlY3RlZEhUTUwsIGdldEluY2x1ZGVkU3RyaW5nCisgICAgICAgICAgICAoX3ZhbGlkSFRNTCwgX2RvY1R5cGUsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF9leHBlY3RlZEhUTUwsIGdldEluY2x1ZGVkU3RyaW5nCisgICAgICAgICAgICAoX3ZhbGlkSFRNTCwgX2RvY1R5cGUsIDcpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICIsIGdldEluY2x1ZGVkU3RyaW5nKCIgICAiLCBfZG9jVHlwZSwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICIsIGdldEluY2x1ZGVkU3RyaW5nKCIgICAiLCBfZG9jVHlwZSwgNykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgZG9jIHR5cGUgZGVjbGFyYXRpb24gaXMgbm90IGluY2x1ZGVkIGluIGZpbGVzIHdpdGgKKyAgICAgKiBkb2MgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbVdpdGhEb2NUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF94bWxXaXRoRG9jVHlwZSwgZ2V0SW5jbHVkZWRTdHJpbmcKKyAgICAgICAgICAgIChfeG1sV2l0aERvY1R5cGUsIG51bGwsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF94bWxXaXRoRG9jVHlwZSwgZ2V0SW5jbHVkZWRTdHJpbmcKKyAgICAgICAgICAgIChfeG1sV2l0aERvY1R5cGUsIG51bGwsIDcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKF94bWxXaXRoRG9jVHlwZSwgZ2V0SW5jbHVkZWRTdHJpbmcKKyAgICAgICAgICAgIChfeG1sV2l0aERvY1R5cGUsIF9kb2NUeXBlLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhfeG1sV2l0aERvY1R5cGUsIGdldEluY2x1ZGVkU3RyaW5nCisgICAgICAgICAgICAoX3htbFdpdGhEb2NUeXBlLCBfZG9jVHlwZSwgNykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzdWx0IG9mIGluY2x1ZGluZyB0aGUgZ2l2ZW4gZG9jIHR5cGUgZGVjbGFyYXRpb24gd2l0aGluCisgICAgICogdGhlIGdpdmVuIFhNTCBieSByZWFkaW5nIDxjb2RlPmJ1ZlNpemU8L2NvZGU+IGNoYXJzIGF0IGEgdGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRJbmNsdWRlZFN0cmluZyhTdHJpbmcgeG1sLCBTdHJpbmcgZG9jVHlwZSwgaW50IGJ1ZlNpemUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1JlYWRlciB4bWxSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHhtbCk7CisgICAgICAgIFN0cmluZ1JlYWRlciBkb2NSZWFkZXIgPSBudWxsOworICAgICAgICBpZiAoZG9jVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgZG9jUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihkb2NUeXBlKTsKKworICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IERvY1R5cGVSZWFkZXIoeG1sUmVhZGVyLCBkb2NSZWFkZXIpOworICAgICAgICBpZiAoYnVmU2l6ZSA9PSAxKQorICAgICAgICAgICAgZm9yIChpbnQgY2ggPSByZWFkZXIucmVhZCgpOyBjaCAhPSAtMTsgY2ggPSByZWFkZXIucmVhZCgpKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgoaW50KSBjaCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGNoOworICAgICAgICAgICAgaW50IHJlYWQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGNoID0gbmV3IGNoYXJbYnVmU2l6ZV07CisgICAgICAgICAgICAgICAgcmVhZCA9IHJlYWRlci5yZWFkKGNoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNoLCAwLCByZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdmFsaWRhdGlvbiBvY2N1cnMgY29ycmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gWE1MRmFjdG9yeS5nZXRTQVhQYXJzZXIoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKCk7CisKKyAgICAgICAgc291cmNlLnNldENoYXJhY3RlclN0cmVhbShuZXcgU3RyaW5nUmVhZGVyKF92YWxpZFhNTCkpOworICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlLCBuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgc291cmNlLnNldENoYXJhY3RlclN0cmVhbShuZXcgU3RyaW5nUmVhZGVyKF9pbnZhbGlkWE1MKSk7CisgICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UsIG5ldyBIYW5kbGVyKCkpOworCisgICAgICAgIHBhcnNlciA9IFhNTEZhY3RvcnkuZ2V0U0FYUGFyc2VyKHRydWUsIGZhbHNlKTsKKyAgICAgICAgc291cmNlLnNldENoYXJhY3RlclN0cmVhbShuZXcgRG9jVHlwZVJlYWRlcihuZXcgU3RyaW5nUmVhZGVyCisgICAgICAgICAgICAoX3ZhbGlkWE1MKSwgbmV3IFN0cmluZ1JlYWRlcihfZG9jVHlwZSkpKTsKKyAgICAgICAgcGFyc2VyLnBhcnNlKHNvdXJjZSwgbmV3IEhhbmRsZXIoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0obmV3IERvY1R5cGVSZWFkZXIobmV3IFN0cmluZ1JlYWRlcgorICAgICAgICAgICAgICAgIChfaW52YWxpZFhNTCksIG5ldyBTdHJpbmdSZWFkZXIoX2RvY1R5cGUpKSk7CisgICAgICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlLCBuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgICAgIGZhaWwoIlBhcnNlZCBpbnZhbGlkIGRvY3VtZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0RG9jVHlwZVJlYWRlci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBzcGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBzcGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvVGVzdFhNTFdyaXRlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1Rlc3RYTUxXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDY1NGFkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL1Rlc3RYTUxXcml0ZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFhNTFdyaXRlcn0gYnkgY29tcGFyaW5nIHRoZSByZXN1bHRzIG9mIHBhc3NpbmcgdGhlCisgKiByYXctc291cmNlLnhtbCBmaWxlIGluIHRoaXMgcGFja2FnZSB0aHJvdWdoIHRoZSB3cml0ZXIgdG8gdGhlIGNvcnJlY3QKKyAqIG91dHB1dCBpbiB0aGUgZm9ybWF0dGVkLXJlc3VsdC54bWwgZmlsZSwgYWxzbyBpbiB0aGlzIHBhY2thZ2UuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RYTUxXcml0ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgVGVzdFhNTFdyaXRlcihTdHJpbmcgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgZm9ybWF0dGluZyB3b3Jrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldHR5UHJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZ2V0IHRoZSByYXcgeG1sIGZyb20gYSBmaWxlCisgICAgICAgIFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlCisgICAgICAgICAgICAoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJyYXctc291cmNlLnhtbCIpKTsKKworICAgICAgICAvLyBhbmQgd3JpdGUgdGhlIGZvcm1hdHRlZCByZXN1bHQgdG8gYSBzdHJpbmcKKyAgICAgICAgU3RyaW5nV3JpdGVyIGZvcm1hdHRlZCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQobmV3IFhNTFdyaXRlcihmb3JtYXR0ZWQpKTsKKworICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgIHRyYW5zLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgY29ycmVjdCBvdXRwdXQgaW50byBhIGJ1ZmZlcgorICAgICAgICBTdHJpbmdCdWZmZXIgY29ycmVjdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyCisgICAgICAgICAgICAoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJmb3JtYXR0ZWQtcmVzdWx0LnhtbCIpKTsKKyAgICAgICAgZm9yIChpbnQgYzsgKGMgPSByZWFkZXIucmVhZCgpKSAhPSAtMTsgY29ycmVjdC5hcHBlbmQoKGNoYXIpIGMpKSA7CisKKyAgICAgICAgLy8gYXNzZXJ0VHJ1ZSB0aGUgZm9ybWF0dGVkIHJlc3VsdCBhbmQgYnVmZmVyIGFyZSBlcXVhbAorICAgICAgICBhc3NlcnRFcXVhbHMoZml4TmV3bGluZShjb3JyZWN0LnRvU3RyaW5nKCkudHJpbSgpKSwKKyAgICAgICAgICAgIGZpeE5ld2xpbmUoZm9ybWF0dGVkLnRvU3RyaW5nKCkudHJpbSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZml4TmV3bGluZShTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBzZXJwLnV0aWwuU3RyaW5ncy5qb2luKHNlcnAudXRpbC5TdHJpbmdzLnNwbGl0CisgICAgICAgICAgICAoc3RyLCAiXHJcbiIsIC0xKSwgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0WE1MV3JpdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbiBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGRlZTMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uCkBAIC0wLDAgKzEsMTcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCitvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYudGVzdC5Db25maWd1cmF0aW9uVGVzdFByb2R1Y3REZXJpdmF0aW9uCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTc4M2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK3Rlc3Quc3lzdGVtbG9jYWwJCXN5c3RlbXZhbHVlMQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL3Rlc3QvbG9jYWxpemVyLnByb3BlcnRpZXMgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL2NvbmYvdGVzdC9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ1MzZjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9jb25mL3Rlc3QvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCit0ZXN0S2V5LW5hbWU6IG5hbWUKK3Rlc3RLZXktZGVzYzogZGVzYwordGVzdEtleS10eXBlOiBHZW5lcmFsCitzeXNLZXktbmFtZTogbmFtZQorc3lzS2V5LWRlc2M6IGRlc2MKK3N5c0tleS10eXBlOiBHZW5lcmFsCitwbHVnaW5LZXktbmFtZTogbmFtZQorcGx1Z2luS2V5LWRlc2M6IGRlc2MKK3BsdWdpbktleS10eXBlOiBHZW5lcmFsCitvYmplY3RLZXktbmFtZTogbmFtZQorb2JqZWN0S2V5LWRlc2M6IGRlc2MKK29iamVjdEtleS10eXBlOiBHZW5lcmFsCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvdGVzdGxvY2FsaXplci9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC90ZXN0bG9jYWxpemVyL2xvY2FsaXplci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzU4OGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3V0aWwvdGVzdGxvY2FsaXplci9sb2NhbGl6ZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisKK3Rlc3QubG9jYWwxCQl2YWx1ZTEKK3Rlc3QubG9jYWwyCQl2YWx1ZTIgezB9IHNlcCB7MX0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC90ZXN0bG9jYWxpemVyL2xvY2FsaXplcl9kZV9ERS5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi91dGlsL3Rlc3Rsb2NhbGl6ZXIvbG9jYWxpemVyX2RlX0RFLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmZGE1OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdXRpbC90ZXN0bG9jYWxpemVyL2xvY2FsaXplcl9kZV9ERS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKwordGVzdC5sb2NhbDEJCXZhbHVlMV9kZQordGVzdC5sb2NhbDIJCXZhbHVlMl9kZSB7MH0gc2VwIHsxfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvZm9ybWF0dGVkLXJlc3VsdC54bWwgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9mb3JtYXR0ZWQtcmVzdWx0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTkwMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi94bWwvZm9ybWF0dGVkLXJlc3VsdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8cm9vdCBhdHRyMT0iMSIgYXR0cjI9IjIiPgorICAgIDxsaXN0Lz4KKyAgICA8bGlzdD4KKyAgICAgICAgdGV4dCAxCisgICAgPC9saXN0PgorICAgIDxsaXN0PgorICAgICAgICA8aW5uZXItbGlzdC8+CisgICAgICAgIDxpbm5lci1saXN0PgorICAgICAgICAgICAgdGV4dCAyCisgICAgICAgIDwvaW5uZXItbGlzdD4KKyAgICA8L2xpc3Q+Cis8L3Jvb3Q+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9yYXctc291cmNlLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1saWIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9saWIveG1sL3Jhdy1zb3VyY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOWNlYWEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3htbC9yYXctc291cmNlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8cm9vdCBhdHRyMT0iMSIgYXR0cjI9IjIiPjxsaXN0Lz48bGlzdD50ZXh0IDE8L2xpc3Q+PGxpc3Q+PGlubmVyLWxpc3QvPjxpbm5lci1saXN0PnRleHQgMjwvaW5uZXItbGlzdD48L2xpc3Q+PC9yb290PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIGIvMTAwMG1wMS9vcGVuanBhLWxpYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmY2NlMGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtbGliL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4gIAorCitvcGVuanBhLnRlc3RLZXk9dGVzdHZhbHVlCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9wb20ueG1sIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRkY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvcG9tLnhtbApAQCAtMCwwICsxLDQxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+T3BlbkpQQSBKUEEgSkRCQzwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+T3BlbkpQQSBKUEEgSkRCQzwvZGVzY3JpcHRpb24+CisgICAgPHVybD5odHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvcHJvamVjdHMvb3BlbmpwYTwvdXJsPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8b3BlbmpwYS5sb2dsZXZlbD5JTkZPPC9vcGVuanBhLmxvZ2xldmVsPgorICAgIDwvcHJvcGVydGllcz4KKyAgICA8cHJvZmlsZXM+CisKKyAgICAgICAgPCEtLSBQcm9maWxlIGZvciB0ZXN0aW5nIHdpdGggQXBhY2hlIERlcmJ5IC0tPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50ZXN0LWRlcmJ5PC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT48bmFtZT50ZXN0LWRlcmJ5PC9uYW1lPjwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmRlcmJ5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXJieTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MTAuMi4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKworICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Mb2c8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkRlZmF1bHRMZXZlbD0ke29wZW5qcGEubG9nbGV2ZWx9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQmFzaWNEYXRhU291cmNlPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGVyYnkuc3RyZWFtLmVycm9yLmZpbGU8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRhcmdldC9kZXJieS5sb2c8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5Ecml2ZXJDbGFzc05hbWU9b3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyLFVybD1qZGJjOmRlcmJ5OnRhcmdldC9kYXRhYmFzZS9vcGVuanBhLWRlcmJ5LWRhdGFiYXNlO2NyZWF0ZT10cnVlLE1heEFjdGl2ZT0xMDAsTWF4SWRsZT0wLE1heFdhaXQ9MTAwMDAsVGVzdE9uQm9ycm93PXRydWU8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisKKyAgICAgICAgPCEtLSBQcm9maWxlIGZvciB0ZXN0aW5nIHdpdGggSFNRTCBEQiAtLT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dGVzdC1oc3FsZGI8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+PHByb3BlcnR5PjxuYW1lPnRlc3QtaHNxbGRiPC9uYW1lPjwvcHJvcGVydHk+PC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aHNxbGRiPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oc3FsZGI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuOC4wLjc8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9wZW5qcGEuTG9nPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5EZWZhdWx0TGV2ZWw9JHtvcGVuanBhLmxvZ2xldmVsfTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkJhc2ljRGF0YVNvdXJjZTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXM8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkRyaXZlckNsYXNzTmFtZT1vcmcuaHNxbGRiLmpkYmNEcml2ZXIsVXJsPWpkYmM6aHNxbGRiOnRhcmdldC9kYXRhYmFzZS9vcGVuanBhLWhzcWxkYi1kYXRhYmFzZTtjcmVhdGU9dHJ1ZSxNYXhBY3RpdmU9MTAwLE1heFdhaXQ9MTAwMDAsVGVzdE9uQm9ycm93PXRydWU8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisKKyAgICAgICAgPCEtLSBQcm9maWxlIGZvciB0ZXN0aW5nIHdpdGggTXlTUUwgREIgLS0+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRlc3QtbXlzcWw8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+PHByb3BlcnR5PjxuYW1lPnRlc3QtbXlzcWw8L25hbWU+PC9wcm9wZXJ0eT48L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teXNxbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlzcWwtY29ubmVjdG9yLWphdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjUuMC40PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkxvZzwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RGVmYXVsdExldmVsPSR7b3BlbmpwYS5sb2dsZXZlbH08L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmNvbW1vbnMuZGJjcC5CYXNpY0RhdGFTb3VyY2U8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5Ecml2ZXJDbGFzc05hbWU9Y29tLm15c3FsLmpkYmMuRHJpdmVyLFVybD0ke29wZW5qcGEubXlzcWwudXJsfSxNYXhBY3RpdmU9MTAwLE1heFdhaXQ9MTAwMDAsVGVzdE9uQm9ycm93PXRydWUsVXNlcm5hbWU9JHtvcGVuanBhLm15c3FsLnVzZXJuYW1lfSxQYXNzd29yZD0ke29wZW5qcGEubXlzcWwucGFzc3dvcmR9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworCisgICAgICAgIDwhLS0gUHJvZmlsZSBmb3IgdGVzdGluZyB3aXRoIFBvc3RncmVTUUwgREIgLS0+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRlc3QtcG9zdGdyZXNxbDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj48cHJvcGVydHk+PG5hbWU+dGVzdC1wb3N0Z3Jlc3FsPC9uYW1lPjwvcHJvcGVydHk+PC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+cG9zdGdyZXNxbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cG9zdGdyZXNxbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+OC4xLTQwNy5qZGJjMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Mb2c8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkRlZmF1bHRMZXZlbD0ke29wZW5qcGEubG9nbGV2ZWx9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQmFzaWNEYXRhU291cmNlPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uUHJvcGVydGllczwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RHJpdmVyQ2xhc3NOYW1lPW9yZy5wb3N0Z3Jlc3FsLkRyaXZlcixVcmw9JHtvcGVuanBhLnBvc3RncmVzcWwudXJsfSxNYXhBY3RpdmU9MTAwLE1heFdhaXQ9MTAwMDAsVGVzdE9uQm9ycm93PXRydWUsVXNlcm5hbWU9JHtvcGVuanBhLnBvc3RncmVzcWwudXNlcm5hbWV9LFBhc3N3b3JkPSR7b3BlbmpwYS5wb3N0Z3Jlc3FsLnBhc3N3b3JkfTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKworICAgICAgICA8IS0tIFByb2ZpbGUgZm9yIHRlc3Rpbmcgd2l0aCBTUUxTZXJ2ZXIgREIgdXNpbmcgdGhlIGpURFMgZHJpdmVyIC0tPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50ZXN0LXNxbHNlcnZlcjwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj48cHJvcGVydHk+PG5hbWU+dGVzdC1zcWxzZXJ2ZXI8L25hbWU+PC9wcm9wZXJ0eT48L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5uZXQuc291cmNlZm9yZ2UuanRkczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anRkczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkxvZzwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RGVmYXVsdExldmVsPSR7b3BlbmpwYS5sb2dsZXZlbH08L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmNvbW1vbnMuZGJjcC5CYXNpY0RhdGFTb3VyY2U8L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcGVuanBhLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5Ecml2ZXJDbGFzc05hbWU9bmV0LnNvdXJjZWZvcmdlLmp0ZHMuamRiYy5Ecml2ZXIsVXJsPSR7b3BlbmpwYS5zcWxzZXJ2ZXIudXJsfSxNYXhBY3RpdmU9MTAwLE1heFdhaXQ9MTAwMDAsVGVzdE9uQm9ycm93PXRydWUsVXNlcm5hbWU9JHtvcGVuanBhLnNxbHNlcnZlci51c2VybmFtZX0sUGFzc3dvcmQ9JHtvcGVuanBhLnNxbHNlcnZlci5wYXNzd29yZH08L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisKKyAgICAgICAgPCEtLSBQcm9maWxlIGZvciB0ZXN0aW5nIHdpdGggU3liYXNlIERCIHVzaW5nIHRoZSBqVERTIGRyaXZlciAtLT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dGVzdC1zeWJhc2U8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+PHByb3BlcnR5PjxuYW1lPnRlc3Qtc3liYXNlPC9uYW1lPjwvcHJvcGVydHk+PC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNvdXJjZWZvcmdlLmp0ZHM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp0ZHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Mb2c8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkRlZmF1bHRMZXZlbD0ke29wZW5qcGEubG9nbGV2ZWx9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQmFzaWNEYXRhU291cmNlPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uUHJvcGVydGllczwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RHJpdmVyQ2xhc3NOYW1lPW5ldC5zb3VyY2Vmb3JnZS5qdGRzLmpkYmMuRHJpdmVyLFVybD0ke29wZW5qcGEuc3liYXNlLnVybH0sTWF4QWN0aXZlPTEwMCxNYXhXYWl0PTEwMDAwLFRlc3RPbkJvcnJvdz10cnVlLFVzZXJuYW1lPSR7b3BlbmpwYS5zeWJhc2UudXNlcm5hbWV9LFBhc3N3b3JkPSR7b3BlbmpwYS5zeWJhc2UucGFzc3dvcmR9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgICAgICA8IS0tIFByb2ZpbGUgZm9yIHRlc3Rpbmcgd2l0aCBhIGN1c3RvbSBEQiB1c2luZyBhIHN5c3RlbSBqYXIgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCB0byB0ZXN0IHdpdGggT3JhY2xlLCB5b3UgbWlnaHQgcnVuOgorICAgICAgICBtdm4gdGVzdCAtRHRlc3Q9VGVzdFBlcnNpc3RlbmNlIC1QdGVzdC1jdXN0b20gXAorICAgICAgICAgIC1Eb3BlbmpwYS5jdXN0b20uZHJpdmVyamFyPSQocHdkKS9kcml2ZXJzL2pkYmMtb3JhY2xlLTEwXzJfMF8xXzAuamFyIFwKKyAgICAgICAgICAtRG9wZW5qcGEuY3VzdG9tLmRyaXZlcmNsYXNzPW9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIgXAorICAgICAgICAgIC1Eb3BlbmpwYS5jdXN0b20udXJsPWpkYmM6b3JhY2xlOnRoaW46QEhPU1Q6UE9SVDpEQk5BTUUgXAorICAgICAgICAgIC1Eb3BlbmpwYS5jdXN0b20udXNlcm5hbWU9VVNFUk5BTUUgXAorICAgICAgICAgIC1Eb3BlbmpwYS5jdXN0b20ucGFzc3dvcmQ9UEFTU1dPUkQKKyAgICAgICAgLS0+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRlc3QtY3VzdG9tPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPjxwcm9wZXJ0eT48bmFtZT50ZXN0LWN1c3RvbTwvbmFtZT48L3Byb3BlcnR5PjwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9wZW5qcGEuY3VzdG9tZHJpdmVyPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLmN1c3RvbWRyaXZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+c3lzdGVtPC9zY29wZT4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVBhdGg+JHtvcGVuanBhLmN1c3RvbS5kcml2ZXJqYXJ9PC9zeXN0ZW1QYXRoPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Mb2c8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPkRlZmF1bHRMZXZlbD0ke29wZW5qcGEubG9nbGV2ZWx9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQmFzaWNEYXRhU291cmNlPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3BlbmpwYS5Db25uZWN0aW9uUHJvcGVydGllczwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+RHJpdmVyQ2xhc3NOYW1lPSR7b3BlbmpwYS5jdXN0b20uZHJpdmVyY2xhc3N9LFVybD0ke29wZW5qcGEuY3VzdG9tLnVybH0sTWF4QWN0aXZlPTEwMCxNYXhXYWl0PTEwMDAwLFRlc3RPbkJvcnJvdz10cnVlLFVzZXJuYW1lPSR7b3BlbmpwYS5jdXN0b20udXNlcm5hbWV9LFBhc3N3b3JkPSR7b3BlbmpwYS5jdXN0b20ucGFzc3dvcmR9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgIDwvcHJvZmlsZXM+CisKKworCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLWpkYmMtNTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYS1wZXJzaXN0ZW5jZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kYmNwPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kYmNwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0iY3AiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLnRlc3QuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uY29tcGlsZS5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisJCQkJCQkJCTx0YXNrZGVmIG5hbWU9Im9wZW5qcGFjIiBjbGFzc25hbWU9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5vcGVuanBhLmFudC5QQ0VuaGFuY2VyVGFzayI+CisJCQkJCQkJCQk8Y2xhc3NwYXRoIHJlZmlkPSJjcCIvPgorCQkJCQkJCQk8L3Rhc2tkZWY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJlbmhhbmNlLnBhdGgucmVmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSIke3Byb2plY3QuYnVpbGQudGVzdE91dHB1dERpcmVjdG9yeX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jbGFzcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisJCQkJCQkJCTxvcGVuanBhYz4KKwkJCQkJCQkJCTxjbGFzc3BhdGggcmVmaWQ9ImNwIi8+CisJCQkJCQkJCQk8ZmlsZXNldCByZWZpZD0iZW5oYW5jZS5wYXRoLnJlZiIvPgorCQkJCQkJCQk8L29wZW5qcGFjPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Bbm5vdGF0aW9uUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0Fubm90YXRpb25QZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjM4MTI2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Bbm5vdGF0aW9uUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMzM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGVzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtblJlc3VsdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JWYWx1ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlSZXN1bHQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW51bVR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GaWVsZFJlc3VsdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW5zOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuU2Vjb25kYXJ5VGFibGVzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlNxbFJlc3VsdFNldE1hcHBpbmc7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuU3FsUmVzdWx0U2V0TWFwcGluZ3M7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWw7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVW5pcXVlQ29uc3RyYWludDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkVhZ2VyRmV0Y2hNb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUXVlcnlSZXN1bHRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuU2VxdWVuY2VNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuVmFsdWVNYXBwaW5nSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5FbnVtVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkZsYXRDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkZ1bGxDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlZlcnRpY2FsQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLk1hcHBpbmdUYWcuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIFBlcnNpc3RlbmNlIGFubm90YXRpb24gbWFwcGluZyBwYXJzZXIuCisgKgorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIEFubm90YXRpb25QZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIKKyAgICBleHRlbmRzIEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRSVUUgPSAxOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZBTFNFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKEFubm90YXRpb25QZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBNYXBwaW5nVGFnPiBfdGFncyA9CisgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBNYXBwaW5nVGFnPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgX3RhZ3MucHV0KEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsIEFTU09DX09WRVJSSURFKTsKKyAgICAgICAgX3RhZ3MucHV0KEFzc29jaWF0aW9uT3ZlcnJpZGVzLmNsYXNzLCBBU1NPQ19PVkVSUklERVMpOworICAgICAgICBfdGFncy5wdXQoQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIEFUVFJfT1ZFUlJJREUpOworICAgICAgICBfdGFncy5wdXQoQXR0cmlidXRlT3ZlcnJpZGVzLmNsYXNzLCBBVFRSX09WRVJSSURFUyk7CisgICAgICAgIF90YWdzLnB1dChqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4uY2xhc3MsIENPTCk7CisgICAgICAgIF90YWdzLnB1dChDb2x1bW5SZXN1bHQuY2xhc3MsIENPTFVNTl9SRVNVTFQpOworICAgICAgICBfdGFncy5wdXQoRGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcywgRElTQ1JJTV9DT0wpOworICAgICAgICBfdGFncy5wdXQoRGlzY3JpbWluYXRvclZhbHVlLmNsYXNzLCBESVNDUklNX1ZBTCk7CisgICAgICAgIF90YWdzLnB1dChFbnRpdHlSZXN1bHQuY2xhc3MsIEVOVElUWV9SRVNVTFQpOworICAgICAgICBfdGFncy5wdXQoRW51bWVyYXRlZC5jbGFzcywgRU5VTUVSQVRFRCk7CisgICAgICAgIF90YWdzLnB1dChGaWVsZFJlc3VsdC5jbGFzcywgRklFTERfUkVTVUxUKTsKKyAgICAgICAgX3RhZ3MucHV0KEluaGVyaXRhbmNlLmNsYXNzLCBJTkhFUklUQU5DRSk7CisgICAgICAgIF90YWdzLnB1dChKb2luQ29sdW1uLmNsYXNzLCBKT0lOX0NPTCk7CisgICAgICAgIF90YWdzLnB1dChKb2luQ29sdW1ucy5jbGFzcywgSk9JTl9DT0xTKTsKKyAgICAgICAgX3RhZ3MucHV0KEpvaW5UYWJsZS5jbGFzcywgSk9JTl9UQUJMRSk7CisgICAgICAgIF90YWdzLnB1dChQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgUEtfSk9JTl9DT0wpOworICAgICAgICBfdGFncy5wdXQoUHJpbWFyeUtleUpvaW5Db2x1bW5zLmNsYXNzLCBQS19KT0lOX0NPTFMpOworICAgICAgICBfdGFncy5wdXQoU2Vjb25kYXJ5VGFibGUuY2xhc3MsIFNFQ09OREFSWV9UQUJMRSk7CisgICAgICAgIF90YWdzLnB1dChTZWNvbmRhcnlUYWJsZXMuY2xhc3MsIFNFQ09OREFSWV9UQUJMRVMpOworICAgICAgICBfdGFncy5wdXQoU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElORyk7CisgICAgICAgIF90YWdzLnB1dChTcWxSZXN1bHRTZXRNYXBwaW5ncy5jbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOworICAgICAgICBfdGFncy5wdXQoVGFibGUuY2xhc3MsIFRBQkxFKTsKKyAgICAgICAgX3RhZ3MucHV0KFRlbXBvcmFsLmNsYXNzLCBURU1QT1JBTCk7CisgICAgICAgIF90YWdzLnB1dChUYWJsZUdlbmVyYXRvci5jbGFzcywgVEFCTEVfR0VOKTsKKyAgICAgICAgX3RhZ3MucHV0KENsYXNzQ3JpdGVyaWEuY2xhc3MsIENMQVNTX0NSSVQpOworICAgICAgICBfdGFncy5wdXQoQ29sdW1ucy5jbGFzcywgQ09MUyk7CisgICAgICAgIF90YWdzLnB1dChDb250YWluZXJUYWJsZS5jbGFzcywgQ09OVEFJTkVSX1RBQkxFKTsKKyAgICAgICAgX3RhZ3MucHV0KERhdGFTdG9yZUlkQ29sdW1uLmNsYXNzLCBEQVRBU1RPUkVfSURfQ09MKTsKKyAgICAgICAgX3RhZ3MucHV0KERpc2NyaW1pbmF0b3JTdHJhdGVneS5jbGFzcywgRElTQ1JJTV9TVFJBVCk7CisgICAgICAgIF90YWdzLnB1dChFYWdlckZldGNoTW9kZS5jbGFzcywgRUFHRVJfRkVUQ0hfTU9ERSk7CisgICAgICAgIF90YWdzLnB1dChFbGVtZW50Q2xhc3NDcml0ZXJpYS5jbGFzcywgRUxFTV9DTEFTU19DUklUKTsKKyAgICAgICAgX3RhZ3MucHV0KEVsZW1lbnRGb3JlaWduS2V5LmNsYXNzLCBFTEVNX0ZLKTsKKyAgICAgICAgX3RhZ3MucHV0KEVsZW1lbnRJbmRleC5jbGFzcywgRUxFTV9JTkRFWCk7CisgICAgICAgIF90YWdzLnB1dChFbGVtZW50Sm9pbkNvbHVtbi5jbGFzcywgRUxFTV9KT0lOX0NPTCk7CisgICAgICAgIF90YWdzLnB1dChFbGVtZW50Sm9pbkNvbHVtbnMuY2xhc3MsIEVMRU1fSk9JTl9DT0xTKTsKKyAgICAgICAgX3RhZ3MucHV0KEVsZW1lbnROb25wb2x5bW9ycGhpYy5jbGFzcywgRUxFTV9OT05QT0xZKTsKKyAgICAgICAgX3RhZ3MucHV0KEVtYmVkZGVkTWFwcGluZy5jbGFzcywgRU1CRURERURfTUFQUElORyk7CisgICAgICAgIF90YWdzLnB1dChGb3JlaWduS2V5LmNsYXNzLCBGSyk7CisgICAgICAgIF90YWdzLnB1dChJbmRleC5jbGFzcywgSU5ERVgpOworICAgICAgICBfdGFncy5wdXQoTWFwcGluZ092ZXJyaWRlLmNsYXNzLCBNQVBQSU5HX09WRVJSSURFKTsKKyAgICAgICAgX3RhZ3MucHV0KE1hcHBpbmdPdmVycmlkZXMuY2xhc3MsIE1BUFBJTkdfT1ZFUlJJREVTKTsKKyAgICAgICAgX3RhZ3MucHV0KE5vbnBvbHltb3JwaGljLmNsYXNzLCBOT05QT0xZKTsKKyAgICAgICAgX3RhZ3MucHV0KE9yZGVyQ29sdW1uLmNsYXNzLCBPUkRFUl9DT0wpOworICAgICAgICBfdGFncy5wdXQoU3RyYXRlZ3kuY2xhc3MsIFNUUkFUKTsKKyAgICAgICAgX3RhZ3MucHV0KFN1YmNsYXNzRmV0Y2hNb2RlLmNsYXNzLCBTVUJDTEFTU19GRVRDSF9NT0RFKTsKKyAgICAgICAgX3RhZ3MucHV0KFVuaXF1ZS5jbGFzcywgVU5JUVVFKTsKKyAgICAgICAgX3RhZ3MucHV0KFZlcnNpb25Db2x1bW4uY2xhc3MsIFZFUlNJT05fQ09MKTsKKyAgICAgICAgX3RhZ3MucHV0KFZlcnNpb25Db2x1bW5zLmNsYXNzLCBWRVJTSU9OX0NPTFMpOworICAgICAgICBfdGFncy5wdXQoVmVyc2lvblN0cmF0ZWd5LmNsYXNzLCBWRVJTSU9OX1NUUkFUKTsKKyAgICAgICAgX3RhZ3MucHV0KFhKb2luQ29sdW1uLmNsYXNzLCBYX0pPSU5fQ09MKTsKKyAgICAgICAgX3RhZ3MucHV0KFhKb2luQ29sdW1ucy5jbGFzcywgWF9KT0lOX0NPTFMpOworICAgICAgICBfdGFncy5wdXQoWFNlY29uZGFyeVRhYmxlLmNsYXNzLCBYX1NFQ09OREFSWV9UQUJMRSk7CisgICAgICAgIF90YWdzLnB1dChYU2Vjb25kYXJ5VGFibGVzLmNsYXNzLCBYX1NFQ09OREFSWV9UQUJMRVMpOworICAgICAgICBfdGFncy5wdXQoWFRhYmxlLmNsYXNzLCBYX1RBQkxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvblBlcnNpc3RlbmNlTWFwcGluZ1BhcnNlcihKREJDQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHN1cGVyKGNvbmYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlUGFja2FnZU1hcHBpbmdBbm5vdGF0aW9ucyhQYWNrYWdlIHBrZykgeworICAgICAgICBNYXBwaW5nVGFnIHRhZzsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm8gOiBwa2cuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICB0YWcgPSBfdGFncy5nZXQoYW5uby5hbm5vdGF0aW9uVHlwZSgpKTsKKyAgICAgICAgICAgIGlmICh0YWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhbmRsZVVua25vd25QYWNrYWdlTWFwcGluZ0Fubm90YXRpb24ocGtnLCBhbm5vKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRBQkxFX0dFTjoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VUYWJsZUdlbmVyYXRvcihwa2csIChUYWJsZUdlbmVyYXRvcikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgidW5zdXBwb3J0ZWQiLCBwa2csCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHN1YmNsYXNzZXMgdG8gaGFuZGxlIHVua25vd24gYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVW5rbm93blBhY2thZ2VNYXBwaW5nQW5ub3RhdGlvbihQYWNrYWdlIHBrZywKKyAgICAgICAgQW5ub3RhdGlvbiBhbm5vKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAVGFibGVHZW5lcmF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlVGFibGVHZW5lcmF0b3IoQW5ub3RhdGVkRWxlbWVudCBlbCwgVGFibGVHZW5lcmF0b3IgZ2VuKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2VuLm5hbWUoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLWdlbi1uYW1lIiwgZWwpKTsKKworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgicGFyc2UtZ2VuIiwgbmFtZSkpOworCisgICAgICAgIFNlcXVlbmNlTWFwcGluZyBtZXRhID0gKFNlcXVlbmNlTWFwcGluZykgZ2V0UmVwb3NpdG9yeSgpLgorICAgICAgICAgICAgZ2V0Q2FjaGVkU2VxdWVuY2VNZXRhRGF0YShuYW1lKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImR1cC1nZW4iLCBuYW1lLCBlbCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbWV0YSA9IChTZXF1ZW5jZU1hcHBpbmcpIGdldFJlcG9zaXRvcnkoKS5hZGRTZXF1ZW5jZU1ldGFEYXRhKG5hbWUpOworICAgICAgICBtZXRhLnNldFNlcXVlbmNlUGx1Z2luKFNlcXVlbmNlTWFwcGluZy5JTVBMX1ZBTFVFX1RBQkxFKTsKKyAgICAgICAgbWV0YS5zZXRUYWJsZSh0b1RhYmxlTmFtZShnZW4uc2NoZW1hKCksIGdlbi50YWJsZSgpKSk7CisgICAgICAgIG1ldGEuc2V0UHJpbWFyeUtleUNvbHVtbihnZW4ucGtDb2x1bW5OYW1lKCkpOworICAgICAgICBtZXRhLnNldFNlcXVlbmNlQ29sdW1uKGdlbi52YWx1ZUNvbHVtbk5hbWUoKSk7CisgICAgICAgIG1ldGEuc2V0UHJpbWFyeUtleVZhbHVlKGdlbi5wa0NvbHVtblZhbHVlKCkpOworICAgICAgICBtZXRhLnNldEluaXRpYWxWYWx1ZShnZW4uaW5pdGlhbFZhbHVlKCkpOworICAgICAgICBtZXRhLnNldEFsbG9jYXRlKGdlbi5hbGxvY2F0aW9uU2l6ZSgpKTsKKyAgICAgICAgbWV0YS5zZXRTb3VyY2UoZ2V0U291cmNlRmlsZSgpLCAoZWwgaW5zdGFuY2VvZiBDbGFzcykgPyBlbCA6IG51bGwsCisgICAgICAgICAgICBtZXRhLlNSQ19BTk5PVEFUSU9OUyk7CisKKyAgICAgICAgLy8jIyMgRUpCMworICAgICAgICBpZiAoZ2VuLnVuaXF1ZUNvbnN0cmFpbnRzKCkubGVuZ3RoID4gMCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoInVuaXF1ZS1jb25zdHJhaW50cyIsIG5hbWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUNsYXNzTWFwcGluZ0Fubm90YXRpb25zKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBDbGFzc01hcHBpbmcgY20gPSAoQ2xhc3NNYXBwaW5nKSBtZXRhOworICAgICAgICBDbGFzcyBjbHMgPSBjbS5nZXREZXNjcmliZWRUeXBlKCk7CisKKyAgICAgICAgTWFwcGluZ1RhZyB0YWc7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vIDogY2xzLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgdGFnID0gX3RhZ3MuZ2V0KGFubm8uYW5ub3RhdGlvblR5cGUoKSk7CisgICAgICAgICAgICBpZiAodGFnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVVbmtub3duQ2xhc3NNYXBwaW5nQW5ub3RhdGlvbihjbSwgYW5ubyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ19PVkVSUklERToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VBc3NvY2lhdGlvbk92ZXJyaWRlcyhjbSwgKEFzc29jaWF0aW9uT3ZlcnJpZGUpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DX09WRVJSSURFUzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VBc3NvY2lhdGlvbk92ZXJyaWRlcyhjbSwgKChBc3NvY2lhdGlvbk92ZXJyaWRlcykgYW5ubykuCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVFRSX09WRVJSSURFOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUF0dHJpYnV0ZU92ZXJyaWRlcyhjbSwgKEF0dHJpYnV0ZU92ZXJyaWRlKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVFRSX09WRVJSSURFUzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VBdHRyaWJ1dGVPdmVycmlkZXMoY20sICgoQXR0cmlidXRlT3ZlcnJpZGVzKSBhbm5vKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NSSU1fQ09MOgorICAgICAgICAgICAgICAgICAgICBwYXJzZURpc2NyaW1pbmF0b3JDb2x1bW4oY20sIChEaXNjcmltaW5hdG9yQ29sdW1uKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDUklNX1ZBTDoKKyAgICAgICAgICAgICAgICAgICAgY20uZ2V0RGlzY3JpbWluYXRvcigpLmdldE1hcHBpbmdJbmZvKCkuc2V0VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERpc2NyaW1pbmF0b3JWYWx1ZSkgYW5ubykudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5IRVJJVEFOQ0U6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlSW5oZXJpdGFuY2UoY20sIChJbmhlcml0YW5jZSkgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEtfSk9JTl9DT0w6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlUHJpbWFyeUtleUpvaW5Db2x1bW5zKGNtLCAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBLX0pPSU5fQ09MUzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoY20sCisgICAgICAgICAgICAgICAgICAgICAgICAoKFByaW1hcnlLZXlKb2luQ29sdW1ucykgYW5ubykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VDT05EQVJZX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICBwYXJzZVNlY29uZGFyeVRhYmxlcyhjbSwgKFNlY29uZGFyeVRhYmxlKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRUNPTkRBUllfVEFCTEVTOgorICAgICAgICAgICAgICAgICAgICBwYXJzZVNlY29uZGFyeVRhYmxlcyhjbSwgKChTZWNvbmRhcnlUYWJsZXMpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNRTF9SRVNVTFRfU0VUX01BUFBJTkc6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlU1FMUmVzdWx0U2V0TWFwcGluZ3MoY20sIChTcWxSZXN1bHRTZXRNYXBwaW5nKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VTUUxSZXN1bHRTZXRNYXBwaW5ncyhjbSwgKChTcWxSZXN1bHRTZXRNYXBwaW5ncykgYW5ubykuCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VUYWJsZShjbSwgKFRhYmxlKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUQUJMRV9HRU46CisgICAgICAgICAgICAgICAgICAgIHBhcnNlVGFibGVHZW5lcmF0b3IoY2xzLCAoVGFibGVHZW5lcmF0b3IpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERBVEFTVE9SRV9JRF9DT0w6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlRGF0YVN0b3JlSWRDb2x1bW4oY20sIChEYXRhU3RvcmVJZENvbHVtbikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ1JJTV9TVFJBVDoKKyAgICAgICAgICAgICAgICAgICAgY20uZ2V0RGlzY3JpbWluYXRvcigpLmdldE1hcHBpbmdJbmZvKCkuc2V0U3RyYXRlZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERpc2NyaW1pbmF0b3JTdHJhdGVneSkgYW5ubykudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRks6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlRm9yZWlnbktleShjbS5nZXRNYXBwaW5nSW5mbygpLCAoRm9yZWlnbktleSkgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUFQUElOR19PVkVSUklERToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VNYXBwaW5nT3ZlcnJpZGVzKGNtLCAoTWFwcGluZ092ZXJyaWRlKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNQVBQSU5HX09WRVJSSURFUzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VNYXBwaW5nT3ZlcnJpZGVzKGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgKChNYXBwaW5nT3ZlcnJpZGVzKSBhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVFJBVDoKKyAgICAgICAgICAgICAgICAgICAgY20uZ2V0TWFwcGluZ0luZm8oKS5zZXRTdHJhdGVneSgoKFN0cmF0ZWd5KSBhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVUJDTEFTU19GRVRDSF9NT0RFOgorICAgICAgICAgICAgICAgICAgICBjbS5zZXRTdWJjbGFzc0ZldGNoTW9kZSh0b0VhZ2VyRmV0Y2hNb2RlQ29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKFN1YmNsYXNzRmV0Y2hNb2RlKSBhbm5vKS52YWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVkVSU0lPTl9DT0w6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlVmVyc2lvbkNvbHVtbnMoY20sIChWZXJzaW9uQ29sdW1uKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWRVJTSU9OX0NPTFM6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlVmVyc2lvbkNvbHVtbnMoY20sICgoVmVyc2lvbkNvbHVtbnMpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZFUlNJT05fU1RSQVQ6CisgICAgICAgICAgICAgICAgICAgIGNtLmdldFZlcnNpb24oKS5nZXRNYXBwaW5nSW5mbygpLnNldFN0cmF0ZWd5CisgICAgICAgICAgICAgICAgICAgICAgICAoKChWZXJzaW9uU3RyYXRlZ3kpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhfVEFCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBYX1NFQ09OREFSWV9UQUJMRToKKyAgICAgICAgICAgICAgICBjYXNlIFhfU0VDT05EQVJZX1RBQkxFUzoKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWs7IG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bnN1cHBvcnRlZCIsIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5ubykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3cgc3ViY2xhc3NlcyB0byBoYW5kbGUgdW5rbm93biBhbm5vdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duQ2xhc3NNYXBwaW5nQW5ub3RhdGlvbihDbGFzc01hcHBpbmcgY2xzLAorICAgICAgICBBbm5vdGF0aW9uIGFubm8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBBc3NvY2lhdGlvbk92ZXJyaWRlKHMpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUFzc29jaWF0aW9uT3ZlcnJpZGVzKENsYXNzTWFwcGluZyBjbSwKKyAgICAgICAgQXNzb2NpYXRpb25PdmVycmlkZS4uLiBhc3NvY3MpIHsKKyAgICAgICAgRmllbGRNYXBwaW5nIHN1cDsKKyAgICAgICAgSm9pbkNvbHVtbltdIHNjb2xzOworICAgICAgICBpbnQgdW5pcXVlOworICAgICAgICBMaXN0PENvbHVtbj4gamNvbHM7CisgICAgICAgIGZvciAoQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvYyA6IGFzc29jcykgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoYXNzb2MubmFtZSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLW92ZXJyaWRlLW5hbWUiLCBjbSkpOworICAgICAgICAgICAgc3VwID0gKEZpZWxkTWFwcGluZykgY20uZ2V0RGVmaW5lZFN1cGVyY2xhc3NGaWVsZChhc3NvYy5uYW1lKCkpOworICAgICAgICAgICAgaWYgKHN1cCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHN1cCA9IChGaWVsZE1hcHBpbmcpIGNtLmFkZERlZmluZWRTdXBlcmNsYXNzRmllbGQKKyAgICAgICAgICAgICAgICAgICAgKGFzc29jLm5hbWUoKSwgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgc2NvbHMgPSBhc3NvYy5qb2luQ29sdW1ucygpOworICAgICAgICAgICAgaWYgKHNjb2xzID09IG51bGwgfHwgc2NvbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGpjb2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KHNjb2xzLmxlbmd0aCk7CisgICAgICAgICAgICB1bmlxdWUgPSAwOworICAgICAgICAgICAgZm9yIChKb2luQ29sdW1uIHNjb2wgOiBzY29scykgeworICAgICAgICAgICAgICAgIHVuaXF1ZSB8PSAoc2NvbC51bmlxdWUoKSkgPyBUUlVFIDogRkFMU0U7CisgICAgICAgICAgICAgICAgamNvbHMuYWRkKG5ld0NvbHVtbihzY29sKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb2x1bW5zKHN1cCwgc3VwLmdldFZhbHVlSW5mbygpLCBqY29scywgdW5pcXVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBBdHRyaWJ1dGVPdmVycmlkZShzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VBdHRyaWJ1dGVPdmVycmlkZXMoQ2xhc3NNYXBwaW5nIGNtLAorICAgICAgICBBdHRyaWJ1dGVPdmVycmlkZS4uLiBhdHRycykgeworICAgICAgICBGaWVsZE1hcHBpbmcgc3VwOworICAgICAgICBmb3IgKEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHIgOiBhdHRycykgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoYXR0ci5uYW1lKCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tb3ZlcnJpZGUtbmFtZSIsIGNtKSk7CisgICAgICAgICAgICBzdXAgPSAoRmllbGRNYXBwaW5nKSBjbS5nZXREZWZpbmVkU3VwZXJjbGFzc0ZpZWxkKGF0dHIubmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChzdXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdXAgPSAoRmllbGRNYXBwaW5nKSBjbS5hZGREZWZpbmVkU3VwZXJjbGFzc0ZpZWxkKGF0dHIubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBpZiAoYXR0ci5jb2x1bW4oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhcnNlQ29sdW1ucyhzdXAsIGF0dHIuY29sdW1uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgaW5oZXJpdGFuY2UgQFByaW1hcnlLZXlKb2luQ29sdW1uKHMpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVByaW1hcnlLZXlKb2luQ29sdW1ucyhDbGFzc01hcHBpbmcgY20sCisgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uLi4uIGpvaW5zKSB7CisgICAgICAgIExpc3Q8Q29sdW1uPiBjb2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KGpvaW5zLmxlbmd0aCk7CisgICAgICAgIGZvciAoUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbiA6IGpvaW5zKQorICAgICAgICAgICAgY29scy5hZGQobmV3Q29sdW1uKGpvaW4pKTsKKyAgICAgICAgY20uZ2V0TWFwcGluZ0luZm8oKS5zZXRDb2x1bW5zKGNvbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBzY2hlbWEgY29sdW1uIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb2x1bW4gbmV3Q29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW4pIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgY29sLnNldEZsYWcoQ29sdW1uLkZMQUdfUEtfSk9JTiwgdHJ1ZSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShqb2luLm5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShqb2luLm5hbWUoKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShqb2luLmNvbHVtbkRlZmluaXRpb24oKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShqb2luLmNvbHVtbkRlZmluaXRpb24oKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShqb2luLnJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpKQorICAgICAgICAgICAgY29sLnNldFRhcmdldChqb2luLnJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworICAgICAgICByZXR1cm4gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBTZWNvbmRhcnlUYWJsZShzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VTZWNvbmRhcnlUYWJsZXMoQ2xhc3NNYXBwaW5nIGNtLAorICAgICAgICBTZWNvbmRhcnlUYWJsZS4uLiB0YWJsZXMpIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nSW5mbyBpbmZvID0gY20uZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgTG9nIGxvZyA9IGdldExvZygpOworCisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBMaXN0PENvbHVtbj4gam9pbnM7CisgICAgICAgIGJvb2xlYW4gd2FyblVuaXF1ZSA9IGZhbHNlOworICAgICAgICBmb3IgKFNlY29uZGFyeVRhYmxlIHRhYmxlIDogdGFibGVzKSB7CisgICAgICAgICAgICBuYW1lID0gdGFibGUubmFtZSgpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJzZWNvbmQtbmFtZSIsIGNtKSk7CisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkodGFibGUuc2NoZW1hKCkpKQorICAgICAgICAgICAgICAgIG5hbWUgPSB0YWJsZS5zY2hlbWEoKSArICIuIiArIG5hbWU7CisgICAgICAgICAgICBpZiAodGFibGUucGtKb2luQ29sdW1ucygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBqb2lucyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uPih0YWJsZS5wa0pvaW5Db2x1bW5zKCkubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW4gOiB0YWJsZS5wa0pvaW5Db2x1bW5zKCkpCisgICAgICAgICAgICAgICAgICAgIGpvaW5zLmFkZChuZXdDb2x1bW4oam9pbikpOworICAgICAgICAgICAgICAgIGluZm8uc2V0U2Vjb25kYXJ5VGFibGVKb2luQ29sdW1ucyhuYW1lLCBqb2lucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXJuVW5pcXVlIHw9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCkubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIyMjIEVKQjMKKyAgICAgICAgaWYgKHdhcm5VbmlxdWUgJiYgbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJ1bmlxdWUtY29uc3RyYWludHMiLCBjbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBjbGFzcyB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VUYWJsZShDbGFzc01hcHBpbmcgY20sIFRhYmxlIHRhYmxlKSB7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSB0b1RhYmxlTmFtZSh0YWJsZS5zY2hlbWEoKSwgdGFibGUubmFtZSgpKTsKKyAgICAgICAgaWYgKHRhYmxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgY20uZ2V0TWFwcGluZ0luZm8oKS5zZXRUYWJsZU5hbWUodGFibGVOYW1lKTsKKworICAgICAgICBmb3IgKFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludDp0YWJsZS51bmlxdWVDb25zdHJhaW50cygpKSB7CisgICAgICAgICAgICBVbmlxdWUgdW5pcXVlID0gbmV3VW5pcXVlKGNtLCBudWxsLCB1bmlxdWVDb25zdHJhaW50LmNvbHVtbk5hbWVzKCkpOworICAgICAgICAgICAgY20uZ2V0TWFwcGluZ0luZm8oKS5hZGRVbmlxdWUodW5pcXVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm0gYSBxdWFsaWZpZWQgdGFibGUgbmFtZSBmcm9tIGEgc2NoZW1hIGFuZCB0YWJsZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1RhYmxlTmFtZShTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFibGUpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkodGFibGUpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHNjaGVtYSkpCisgICAgICAgICAgICByZXR1cm4gdGFibGU7CisgICAgICAgIHJldHVybiBzY2hlbWEgKyAiLiIgKyB0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIGFubm90YXRpb24gdG8gY3JlYXRlIGFuZCBjYWNoZSBhCisgICAgICoge0BsaW5rIFNRTFJlc3VsdFNldE1hcHBpbmdNZXRhRGF0YX0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU1FMUmVzdWx0U2V0TWFwcGluZ3MoQ2xhc3NNYXBwaW5nIGNtLAorICAgICAgICBTcWxSZXN1bHRTZXRNYXBwaW5nLi4uIGFubm9zKSB7CisgICAgICAgIE1hcHBpbmdSZXBvc2l0b3J5IHJlcG9zID0gKE1hcHBpbmdSZXBvc2l0b3J5KSBnZXRSZXBvc2l0b3J5KCk7CisgICAgICAgIExvZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgZm9yIChTcWxSZXN1bHRTZXRNYXBwaW5nIGFubm8gOiBhbm5vcykgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgicGFyc2Utc3FscnNtYXBwaW5nIiwgYW5uby5uYW1lKCkpKTsKKworICAgICAgICAgICAgUXVlcnlSZXN1bHRNYXBwaW5nIHJlc3VsdCA9IHJlcG9zLmdldENhY2hlZFF1ZXJ5UmVzdWx0TWFwcGluZworICAgICAgICAgICAgICAgIChudWxsLCBhbm5vLm5hbWUoKSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoImR1cC1zcWxyc21hcHBpbmciLCBhbm5vLm5hbWUoKSwgY20pKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0ID0gcmVwb3MuYWRkUXVlcnlSZXN1bHRNYXBwaW5nKG51bGwsIGFubm8ubmFtZSgpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRTb3VyY2UoZ2V0U291cmNlRmlsZSgpLCBjbS5nZXREZXNjcmliZWRUeXBlKCksCisgICAgICAgICAgICAgICAgcmVzdWx0LlNSQ19BTk5PVEFUSU9OUyk7CisKKyAgICAgICAgICAgIGZvciAoRW50aXR5UmVzdWx0IGVudGl0eSA6IGFubm8uZW50aXRpZXMoKSkgeworICAgICAgICAgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZy5QQ1Jlc3VsdCBlbnRpdHlSZXN1bHQgPSByZXN1bHQuYWRkUENSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgKGVudGl0eS5lbnRpdHlDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoZW50aXR5LmRpc2NyaW1pbmF0b3JDb2x1bW4oKSkpCisgICAgICAgICAgICAgICAgICAgIGVudGl0eVJlc3VsdC5hZGRNYXBwaW5nKGVudGl0eVJlc3VsdC5ESVNDUklNSU5BVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LmRpc2NyaW1pbmF0b3JDb2x1bW4oKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEZpZWxkUmVzdWx0IGZpZWxkIDogZW50aXR5LmZpZWxkcygpKQorICAgICAgICAgICAgICAgICAgICBlbnRpdHlSZXN1bHQuYWRkTWFwcGluZyhmaWVsZC5uYW1lKCksIGZpZWxkLmNvbHVtbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ29sdW1uUmVzdWx0IGNvbHVtbiA6IGFubm8uY29sdW1ucygpKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRDb2x1bW5SZXN1bHQoY29sdW1uLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBARGlzY3JpbWluYXRvckNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VEaXNjcmltaW5hdG9yQ29sdW1uKENsYXNzTWFwcGluZyBjbSwKKyAgICAgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkY29sKSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShkY29sLm5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShkY29sLm5hbWUoKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShkY29sLmNvbHVtbkRlZmluaXRpb24oKSkpCisgICAgICAgICAgICBjb2wuc2V0VHlwZU5hbWUoZGNvbC5jb2x1bW5EZWZpbml0aW9uKCkpOworICAgICAgICBzd2l0Y2ggKGRjb2wuZGlzY3JpbWluYXRvclR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgICAgIGNvbC5zZXRKYXZhVHlwZShKYXZhVHlwZXMuQ0hBUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVEVHRVI6CisgICAgICAgICAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5JTlQpOworICAgICAgICAgICAgICAgIGlmIChkY29sLmxlbmd0aCgpICE9IDMxKQorICAgICAgICAgICAgICAgICAgICBjb2wuc2V0U2l6ZShkY29sLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5TVFJJTkcpOworICAgICAgICAgICAgICAgIGNvbC5zZXRTaXplKGRjb2wubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIGNtLmdldERpc2NyaW1pbmF0b3IoKS5nZXRNYXBwaW5nSW5mbygpLnNldENvbHVtbnMKKyAgICAgICAgICAgIChBcnJheXMuYXNMaXN0KG5ldyBDb2x1bW5bXXsgY29sIH0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBASW5oZXJpdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSW5oZXJpdGFuY2UoQ2xhc3NNYXBwaW5nIGNtLCBJbmhlcml0YW5jZSBpbmhlcml0KSB7CisgICAgICAgIENsYXNzTWFwcGluZ0luZm8gaW5mbyA9IGNtLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIHN3aXRjaCAoaW5oZXJpdC5zdHJhdGVneSgpKSB7CisgICAgICAgICAgICBjYXNlIFNJTkdMRV9UQUJMRToKKyAgICAgICAgICAgICAgICBpbmZvLnNldEhpZXJhcmNoeVN0cmF0ZWd5KEZsYXRDbGFzc1N0cmF0ZWd5LkFMSUFTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSk9JTkVEOgorICAgICAgICAgICAgICAgIGluZm8uc2V0SGllcmFyY2h5U3RyYXRlZ3koVmVydGljYWxDbGFzc1N0cmF0ZWd5LkFMSUFTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVEFCTEVfUEVSX0NMQVNTOgorICAgICAgICAgICAgICAgIGluZm8uc2V0SGllcmFyY2h5U3RyYXRlZ3koRnVsbENsYXNzU3RyYXRlZ3kuQUxJQVMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGNsYXNzLWxldmVsIEBNYXBwaW5nT3ZlcnJpZGUocykuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTWFwcGluZ092ZXJyaWRlcyhDbGFzc01hcHBpbmcgY20sCisgICAgICAgIE1hcHBpbmdPdmVycmlkZS4uLiBvdmVycykgeworICAgICAgICBGaWVsZE1hcHBpbmcgc3VwOworICAgICAgICBmb3IgKE1hcHBpbmdPdmVycmlkZSBvdmVyIDogb3ZlcnMpIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG92ZXIubmFtZSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLW92ZXJyaWRlLW5hbWUiLCBjbSkpOworICAgICAgICAgICAgc3VwID0gKEZpZWxkTWFwcGluZykgY20uZ2V0RGVmaW5lZFN1cGVyY2xhc3NGaWVsZChvdmVyLm5hbWUoKSk7CisgICAgICAgICAgICBpZiAoc3VwID09IG51bGwpCisgICAgICAgICAgICAgICAgc3VwID0gKEZpZWxkTWFwcGluZykgY20uYWRkRGVmaW5lZFN1cGVyY2xhc3NGaWVsZChvdmVyLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgcG9wdWxhdGUoc3VwLCBvdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHRoZSBnaXZlbiBmaWVsZCBmcm9tIG92ZXJyaWRlIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKEZpZWxkTWFwcGluZyBmbSwgTWFwcGluZ092ZXJyaWRlIG92ZXIpIHsKKyAgICAgICAgaWYgKG92ZXIuY29udGFpbmVyVGFibGUoKS5zcGVjaWZpZWQoKSkKKyAgICAgICAgICAgIHBhcnNlQ29udGFpbmVyVGFibGUoZm0sIG92ZXIuY29udGFpbmVyVGFibGUoKSk7CisgICAgICAgIHBhcnNlQ29sdW1ucyhmbSwgb3Zlci5jb2x1bW5zKCkpOworICAgICAgICBwYXJzZVhKb2luQ29sdW1ucyhmbSwgZm0uZ2V0VmFsdWVJbmZvKCksIHRydWUsIG92ZXIuam9pbkNvbHVtbnMoKSk7CisgICAgICAgIHBhcnNlRWxlbWVudEpvaW5Db2x1bW5zKGZtLCBvdmVyLmVsZW1lbnRKb2luQ29sdW1ucygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBkYXRhc3RvcmUgaWRlbnRpdHkgaW5mb3JtYXRpb24gaW4gQERhdGFTdG9yZUlkQ29sdW1uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZURhdGFTdG9yZUlkQ29sdW1uKENsYXNzTWFwcGluZyBjbSwgRGF0YVN0b3JlSWRDb2x1bW4gaWQpIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGlkLm5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShpZC5uYW1lKCkpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoaWQuY29sdW1uRGVmaW5pdGlvbigpKSkKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlTmFtZShpZC5jb2x1bW5EZWZpbml0aW9uKCkpOworICAgICAgICBpZiAoaWQucHJlY2lzaW9uKCkgIT0gMCkKKyAgICAgICAgICAgIGNvbC5zZXRTaXplKGlkLnByZWNpc2lvbigpKTsKKyAgICAgICAgY29sLnNldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFLCAhaWQuaW5zZXJ0YWJsZSgpKTsKKyAgICAgICAgY29sLnNldEZsYWcoQ29sdW1uLkZMQUdfVU5VUERBVEFCTEUsICFpZC51cGRhdGFibGUoKSk7CisgICAgICAgIGNtLmdldE1hcHBpbmdJbmZvKCkuc2V0Q29sdW1ucyhBcnJheXMuYXNMaXN0KG5ldyBDb2x1bW5bXXsgY29sIH0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRm9yZWlnbktleShNYXBwaW5nSW5mbyBpbmZvLCBGb3JlaWduS2V5IGZrKSB7CisgICAgICAgIHBhcnNlRm9yZWlnbktleShpbmZvLCBmay5uYW1lKCksIGZrLmVuYWJsZWQoKSwgZmsuZGVmZXJyZWQoKSwKKyAgICAgICAgICAgIGZrLmRlbGV0ZUFjdGlvbigpLCBmay51cGRhdGVBY3Rpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGZvcmVpZ24ga2V5IGRhdGEgb24gdGhlIGdpdmVuIG1hcHBpbmcgaW5mby4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUZvcmVpZ25LZXkoTWFwcGluZ0luZm8gaW5mbywgU3RyaW5nIG5hbWUsCisgICAgICAgIGJvb2xlYW4gZW5hYmxlZCwgYm9vbGVhbiBkZWZlcnJlZCwgRm9yZWlnbktleUFjdGlvbiBkZWxldGVBY3Rpb24sCisgICAgICAgIEZvcmVpZ25LZXlBY3Rpb24gdXBkYXRlQWN0aW9uKSB7CisgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgaW5mby5zZXRDYW5Gb3JlaWduS2V5KGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5IGZrID0KKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleSgpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCisgICAgICAgICAgICBmay5zZXROYW1lKG5hbWUpOworICAgICAgICBmay5zZXREZWZlcnJlZChkZWZlcnJlZCk7CisgICAgICAgIGZrLnNldERlbGV0ZUFjdGlvbih0b0ZvcmVpZ25LZXlBY3Rpb24oZGVsZXRlQWN0aW9uKSk7CisgICAgICAgIGZrLnNldFVwZGF0ZUFjdGlvbih0b0ZvcmVpZ25LZXlBY3Rpb24odXBkYXRlQWN0aW9uKSk7CisgICAgICAgIGluZm8uc2V0Rm9yZWlnbktleShmayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBvdXIgRksgYWN0aW9uIGVudW0gdG8gYW4gaW50ZXJuYWwgT3BlbkpQQSBhY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdG9Gb3JlaWduS2V5QWN0aW9uKEZvcmVpZ25LZXlBY3Rpb24gYWN0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIFJFU1RSSUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleS5BQ1RJT05fUkVTVFJJQ1Q7CisgICAgICAgICAgICBjYXNlIENBU0NBREU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Gb3JlaWduS2V5LkFDVElPTl9DQVNDQURFOworICAgICAgICAgICAgY2FzZSBOVUxMOgorICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuRm9yZWlnbktleS5BQ1RJT05fTlVMTDsKKyAgICAgICAgICAgIGNhc2UgREVGQVVMVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkZvcmVpZ25LZXkuQUNUSU9OX0RFRkFVTFQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUluZGV4KE1hcHBpbmdJbmZvIGluZm8sIEluZGV4IGlkeCkgeworICAgICAgICBwYXJzZUluZGV4KGluZm8sIGlkeC5uYW1lKCksIGlkeC5lbmFibGVkKCksIGlkeC51bmlxdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGluZGV4IGRhdGEgb24gdGhlIGdpdmVuIG1hcHBpbmcgaW5mby4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUluZGV4KE1hcHBpbmdJbmZvIGluZm8sIFN0cmluZyBuYW1lLAorICAgICAgICBib29sZWFuIGVuYWJsZWQsIGJvb2xlYW4gdW5pcXVlKSB7CisgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgaW5mby5zZXRDYW5JbmRleChmYWxzZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXggaWR4ID0KKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuSW5kZXgoKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KG5hbWUpKQorICAgICAgICAgICAgaWR4LnNldE5hbWUobmFtZSk7CisgICAgICAgIGlkeC5zZXRVbmlxdWUodW5pcXVlKTsKKyAgICAgICAgaW5mby5zZXRJbmRleChpZHgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1bmlxdWUgZGF0YSBvbiB0aGUgZ2l2ZW4gbWFwcGluZyBpbmZvLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVVuaXF1ZShGaWVsZE1hcHBpbmcgZm0sIAorICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5VbmlxdWUgYW5ubykgeworICAgICAgICBWYWx1ZU1hcHBpbmdJbmZvIGluZm8gPSBmbS5nZXRWYWx1ZUluZm8oKTsKKyAgICAgICAgaWYgKCFhbm5vLmVuYWJsZWQoKSkgeworICAgICAgICAgICAgaW5mby5zZXRDYW5VbmlxdWUoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlVuaXF1ZSB1bnEgPSAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlKCk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShhbm5vLm5hbWUoKSkpCisgICAgICAgICAgICB1bnEuc2V0TmFtZShhbm5vLm5hbWUoKSk7CisgICAgICAgIHVucS5zZXREZWZlcnJlZChhbm5vLmRlZmVycmVkKCkpOworICAgICAgICBpbmZvLnNldFVuaXF1ZSh1bnEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBWZXJzaW9uQ29sdW1uKHMpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVZlcnNpb25Db2x1bW5zKENsYXNzTWFwcGluZyBjbSwgVmVyc2lvbkNvbHVtbi4uLiB2Y29scykgeworICAgICAgICBpZiAodmNvbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTGlzdDxDb2x1bW4+IGNvbHMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbj4odmNvbHMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChWZXJzaW9uQ29sdW1uIHZjb2wgOiB2Y29scykKKyAgICAgICAgICAgIGNvbHMuYWRkKG5ld0NvbHVtbih2Y29sKSk7CisgICAgICAgIGNtLmdldFZlcnNpb24oKS5nZXRNYXBwaW5nSW5mbygpLnNldENvbHVtbnMoY29scyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHNjaGVtYSBjb2x1bW4gd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbHVtbiBuZXdDb2x1bW4oVmVyc2lvbkNvbHVtbiBhbm5vKSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShhbm5vLm5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShhbm5vLm5hbWUoKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShhbm5vLmNvbHVtbkRlZmluaXRpb24oKSkpCisgICAgICAgICAgICBjb2wuc2V0VHlwZU5hbWUoYW5uby5jb2x1bW5EZWZpbml0aW9uKCkpOworICAgICAgICBpZiAoYW5uby5wcmVjaXNpb24oKSAhPSAwKQorICAgICAgICAgICAgY29sLnNldFNpemUoYW5uby5wcmVjaXNpb24oKSk7CisgICAgICAgIGVsc2UgaWYgKGFubm8ubGVuZ3RoKCkgIT0gMjU1KQorICAgICAgICAgICAgY29sLnNldFNpemUoYW5uby5sZW5ndGgoKSk7CisgICAgICAgIGNvbC5zZXROb3ROdWxsKCFhbm5vLm51bGxhYmxlKCkpOworICAgICAgICBjb2wuc2V0RGVjaW1hbERpZ2l0cyhhbm5vLnNjYWxlKCkpOworICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19VTklOU0VSVEFCTEUsICFhbm5vLmluc2VydGFibGUoKSk7CisgICAgICAgIGNvbC5zZXRGbGFnKENvbHVtbi5GTEFHX1VOVVBEQVRBQkxFLCAhYW5uby51cGRhdGFibGUoKSk7CisgICAgICAgIHJldHVybiBjb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBmZXRjaCBtb2RlIGVudW0gdmFsdWUgdG8gdGhlIGludGVybmFsIE9wZW5KUEEgY29uc3RhbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRvRWFnZXJGZXRjaE1vZGVDb25zdGFudChFYWdlckZldGNoVHlwZSB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgICAgIHJldHVybiBFYWdlckZldGNoTW9kZXMuRUFHRVJfTk9ORTsKKyAgICAgICAgICAgIGNhc2UgSk9JTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRWFnZXJGZXRjaE1vZGVzLkVBR0VSX0pPSU47CisgICAgICAgICAgICBjYXNlIFBBUkFMTEVMOgorICAgICAgICAgICAgICAgIHJldHVybiBFYWdlckZldGNoTW9kZXMuRUFHRVJfUEFSQUxMRUw7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VMb2JNYXBwaW5nKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGlmIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpID09IEphdmFUeXBlcy5TVFJJTkcKKyAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBjaGFyW10uY2xhc3MKKyAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBDaGFyYWN0ZXJbXS5jbGFzcykKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlKFR5cGVzLkNMT0IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2wuc2V0VHlwZShUeXBlcy5CTE9CKTsKKyAgICAgICAgKChGaWVsZE1hcHBpbmcpIGZtZCkuZ2V0VmFsdWVJbmZvKCkuc2V0Q29sdW1ucyhBcnJheXMuYXNMaXN0CisgICAgICAgICAgICAobmV3IENvbHVtbltdeyBjb2wgfSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlTWVtYmVyTWFwcGluZ0Fubm90YXRpb25zKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIEZpZWxkTWFwcGluZyBmbSA9IChGaWVsZE1hcHBpbmcpIGZtZDsKKyAgICAgICAgQW5ub3RhdGVkRWxlbWVudCBlbCA9IChBbm5vdGF0ZWRFbGVtZW50KSBnZXRSZXBvc2l0b3J5KCkuCisgICAgICAgICAgICBnZXRNZXRhRGF0YUZhY3RvcnkoKS5nZXREZWZhdWx0cygpLmdldEJhY2tpbmdNZW1iZXIoZm1kKTsKKworICAgICAgICBNYXBwaW5nVGFnIHRhZzsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm8gOiBlbC5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIHRhZyA9IF90YWdzLmdldChhbm5vLmFubm90YXRpb25UeXBlKCkpOworICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlVW5rbm93bk1lbWJlck1hcHBpbmdBbm5vdGF0aW9uKGZtLCBhbm5vKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DX09WRVJSSURFOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUFzc29jaWF0aW9uT3ZlcnJpZGVzKGZtLCAoQXNzb2NpYXRpb25PdmVycmlkZSkgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NfT1ZFUlJJREVTOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUFzc29jaWF0aW9uT3ZlcnJpZGVzKGZtLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVzKSBhbm5vKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFUVFJfT1ZFUlJJREU6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQXR0cmlidXRlT3ZlcnJpZGVzKGZtLCAoQXR0cmlidXRlT3ZlcnJpZGUpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFUVFJfT1ZFUlJJREVTOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUF0dHJpYnV0ZU92ZXJyaWRlcyhmbSwgKChBdHRyaWJ1dGVPdmVycmlkZXMpIGFubm8pLgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09MOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUNvbHVtbnMoZm0sIChqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4pIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTFM6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQ29sdW1ucyhmbSwgKChDb2x1bW5zKSBhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTlVNRVJBVEVEOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUVudW1lcmF0ZWQoZm0sIChFbnVtZXJhdGVkKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKT0lOX0NPTDoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VKb2luQ29sdW1ucyhmbSwgZm0uZ2V0VmFsdWVJbmZvKCksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAoSm9pbkNvbHVtbikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSk9JTl9DT0xTOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUpvaW5Db2x1bW5zKGZtLCBmbS5nZXRWYWx1ZUluZm8oKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSm9pbkNvbHVtbnMpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEpPSU5fVEFCTEU6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlSm9pblRhYmxlKGZtLCAoSm9pblRhYmxlKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQS19KT0lOX0NPTDoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoZm0sIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEtfSk9JTl9DT0xTOgorICAgICAgICAgICAgICAgICAgICBwYXJzZVByaW1hcnlLZXlKb2luQ29sdW1ucyhmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoUHJpbWFyeUtleUpvaW5Db2x1bW5zKSBhbm5vKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUQUJMRV9HRU46CisgICAgICAgICAgICAgICAgICAgIHBhcnNlVGFibGVHZW5lcmF0b3IoZWwsIChUYWJsZUdlbmVyYXRvcikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVEVNUE9SQUw6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlVGVtcG9yYWwoZm0sIChUZW1wb3JhbCkgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0xBU1NfQ1JJVDoKKyAgICAgICAgICAgICAgICAgICAgZm0uZ2V0VmFsdWVJbmZvKCkuc2V0VXNlQ2xhc3NDcml0ZXJpYQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ2xhc3NDcml0ZXJpYSkgYW5ubykudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OVEFJTkVSX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUNvbnRhaW5lclRhYmxlKGZtLCAoQ29udGFpbmVyVGFibGUpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVBR0VSX0ZFVENIX01PREU6CisgICAgICAgICAgICAgICAgICAgIGZtLnNldEVhZ2VyRmV0Y2hNb2RlKHRvRWFnZXJGZXRjaE1vZGVDb25zdGFudAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRWFnZXJGZXRjaE1vZGUpIGFubm8pLnZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTEVNX0NMQVNTX0NSSVQ6CisgICAgICAgICAgICAgICAgICAgIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuc2V0VXNlQ2xhc3NDcml0ZXJpYQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRWxlbWVudENsYXNzQ3JpdGVyaWEpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVMRU1fRks6CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRGb3JlaWduS2V5IGVmayA9IChFbGVtZW50Rm9yZWlnbktleSkgYW5ubzsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VGb3JlaWduS2V5KGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICBlZmsubmFtZSgpLCBlZmsuZW5hYmxlZCgpLCBlZmsuZGVmZXJyZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmay5kZWxldGVBY3Rpb24oKSwgZWZrLnVwZGF0ZUFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTEVNX0lOREVYOgorICAgICAgICAgICAgICAgICAgICBFbGVtZW50SW5kZXggZWlkeCA9IChFbGVtZW50SW5kZXgpIGFubm87CisgICAgICAgICAgICAgICAgICAgIHBhcnNlSW5kZXgoZm0uZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVpZHgubmFtZSgpLCBlaWR4LmVuYWJsZWQoKSwgZWlkeC51bmlxdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRUxFTV9KT0lOX0NPTDoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VFbGVtZW50Sm9pbkNvbHVtbnMoZm0sIChFbGVtZW50Sm9pbkNvbHVtbikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRUxFTV9KT0lOX0NPTFM6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlRWxlbWVudEpvaW5Db2x1bW5zKGZtLCAoKEVsZW1lbnRKb2luQ29sdW1ucykgYW5ubykuCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTEVNX05PTlBPTFk6CisgICAgICAgICAgICAgICAgICAgIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuc2V0UG9seW1vcnBoaWModG9Qb2x5bW9ycGhpY0NvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICAoKChFbGVtZW50Tm9ucG9seW1vcnBoaWMpIGFubm8pLnZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTUJFRERFRF9NQVBQSU5HOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUVtYmVkZGVkTWFwcGluZyhmbSwgKEVtYmVkZGVkTWFwcGluZykgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRks6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlRm9yZWlnbktleShmbS5nZXRWYWx1ZUluZm8oKSwgKEZvcmVpZ25LZXkpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOREVYOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUluZGV4KGZtLmdldFZhbHVlSW5mbygpLCAoSW5kZXgpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5PTlBPTFk6CisgICAgICAgICAgICAgICAgICAgIGZtLnNldFBvbHltb3JwaGljKHRvUG9seW1vcnBoaWNDb25zdGFudAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoTm9ucG9seW1vcnBoaWMpIGFubm8pLnZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUkRFUl9DT0w6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlT3JkZXJDb2x1bW4oZm0sIChPcmRlckNvbHVtbikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RSQVQ6CisgICAgICAgICAgICAgICAgICAgIGZtLmdldFZhbHVlSW5mbygpLnNldFN0cmF0ZWd5KCgoU3RyYXRlZ3kpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVOSVFVRToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VVbmlxdWUoZm0sIAorICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlVuaXF1ZSkgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgWF9KT0lOX0NPTDoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VYSm9pbkNvbHVtbnMoZm0sIGZtLmdldFZhbHVlSW5mbygpLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgKFhKb2luQ29sdW1uKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYX0pPSU5fQ09MUzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VYSm9pbkNvbHVtbnMoZm0sIGZtLmdldFZhbHVlSW5mbygpLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgKChYSm9pbkNvbHVtbnMpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFeGNlcHRpb24oX2xvYy5nZXQoInVuc3VwcG9ydGVkIiwgZm0sCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHN1YmNsYXNzZXMgdG8gaGFuZGxlIHVua25vd24gYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVW5rbm93bk1lbWJlck1hcHBpbmdBbm5vdGF0aW9uKEZpZWxkTWFwcGluZyBmbSwKKyAgICAgICAgQW5ub3RhdGlvbiBhbm5vKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBWYWx1ZU1hcHBpbmd9IDxjb2RlPlBPTFlfKjwvY29kZT4gY29uc3RhbnQgZm9yCisgICAgICogdGhlIGdpdmVuIGVudW0gdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgdG9Qb2x5bW9ycGhpY0NvbnN0YW50KE5vbnBvbHltb3JwaGljVHlwZSB2YWwpIHsKKyAgICAgICAgc3dpdGNoICh2YWwpIHsKKyAgICAgICAgICAgIGNhc2UgRVhBQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlTWFwcGluZy5QT0xZX0ZBTFNFOworICAgICAgICAgICAgY2FzZSBKT0lOQUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsdWVNYXBwaW5nLlBPTFlfSk9JTkFCTEU7CisgICAgICAgICAgICBjYXNlIEZBTFNFOgorICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZU1hcHBpbmcuUE9MWV9UUlVFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGdpdmVuIEBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb25zIG9uIGFuIGVtYmVkZGVkIG1hcHBpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXNzb2NpYXRpb25PdmVycmlkZXMoRmllbGRNYXBwaW5nIGZtLAorICAgICAgICBBc3NvY2lhdGlvbk92ZXJyaWRlLi4uIGFzc29jcykgeworICAgICAgICBDbGFzc01hcHBpbmcgZW1iZWQgPSBmbS5nZXRFbWJlZGRlZE1hcHBpbmcoKTsKKyAgICAgICAgaWYgKGVtYmVkID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1lbWJlZGRlZCIsIGZtKSk7CisKKyAgICAgICAgRmllbGRNYXBwaW5nIGVmbTsKKyAgICAgICAgSm9pbkNvbHVtbltdIGVjb2xzOworICAgICAgICBpbnQgdW5pcXVlOworICAgICAgICBMaXN0PENvbHVtbj4gamNvbHM7CisgICAgICAgIGZvciAoQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvYyA6IGFzc29jcykgeworICAgICAgICAgICAgZWZtID0gZW1iZWQuZ2V0RmllbGRNYXBwaW5nKGFzc29jLm5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZWZtID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJlbWJlZC1vdmVycmlkZS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgZm0sIGFzc29jLm5hbWUoKSkpOworICAgICAgICAgICAgZWNvbHMgPSBhc3NvYy5qb2luQ29sdW1ucygpOworICAgICAgICAgICAgaWYgKGVjb2xzID09IG51bGwgfHwgZWNvbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHVuaXF1ZSA9IDA7CisgICAgICAgICAgICBqY29scyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uPihlY29scy5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChKb2luQ29sdW1uIGVjb2wgOiBlY29scykgeworICAgICAgICAgICAgICAgIHVuaXF1ZSB8PSAoZWNvbC51bmlxdWUoKSkgPyBUUlVFIDogRkFMU0U7CisgICAgICAgICAgICAgICAgamNvbHMuYWRkKG5ld0NvbHVtbihlY29sKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb2x1bW5zKGVmbSwgZWZtLmdldFZhbHVlSW5mbygpLCBqY29scywgdW5pcXVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGdpdmVuIEBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9ucyBvbiBhbiBlbWJlZGRlZCBtYXBwaW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUF0dHJpYnV0ZU92ZXJyaWRlcyhGaWVsZE1hcHBpbmcgZm0sCisgICAgICAgIEF0dHJpYnV0ZU92ZXJyaWRlLi4uIGF0dHJzKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBlbWJlZCA9IGZtLmdldEVtYmVkZGVkTWFwcGluZygpOworICAgICAgICBpZiAoZW1iZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWVtYmVkZGVkIiwgZm0pKTsKKworICAgICAgICBGaWVsZE1hcHBpbmcgZWZtOworICAgICAgICBmb3IgKEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHIgOiBhdHRycykgeworICAgICAgICAgICAgZWZtID0gZW1iZWQuZ2V0RmllbGRNYXBwaW5nKGF0dHIubmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChlZm0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImVtYmVkLW92ZXJyaWRlLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICBmbSwgYXR0ci5uYW1lKCkpKTsKKyAgICAgICAgICAgIGlmIChhdHRyLmNvbHVtbigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcGFyc2VDb2x1bW5zKGVmbSwgYXR0ci5jb2x1bW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBARW51bWVyYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFbnVtZXJhdGVkKEZpZWxkTWFwcGluZyBmbSwgRW51bWVyYXRlZCBhbm5vKSB7CisgICAgICAgIFN0cmluZyBzdHJhdCA9IEVudW1WYWx1ZUhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpICsgIihTdG9yZU9yZGluYWw9IgorICAgICAgICAgICAgKyBTdHJpbmcudmFsdWVPZihhbm5vLnZhbHVlKCkgPT0gRW51bVR5cGUuT1JESU5BTCkgKyAiKSI7CisgICAgICAgIGZtLmdldFZhbHVlSW5mbygpLnNldFN0cmF0ZWd5KHN0cmF0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAVGVtcG9yYWwuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlVGVtcG9yYWwoRmllbGRNYXBwaW5nIGZtLCBUZW1wb3JhbCBhbm5vKSB7CisgICAgICAgIExpc3QgY29scyA9IGZtLmdldFZhbHVlSW5mbygpLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKCFjb2xzLmlzRW1wdHkoKSAmJiBjb2xzLnNpemUoKSAhPSAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJudW0tY29scy1taXNtYXRjaCIsIGZtLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvbHMuc2l6ZSgpKSwgIjEiKSk7CisgICAgICAgIGlmIChjb2xzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbHMgPSBBcnJheXMuYXNMaXN0KG5ldyBDb2x1bW5bXXsgbmV3IENvbHVtbigpIH0pOworCisgICAgICAgIENvbHVtbiBjb2wgPSAoQ29sdW1uKSBjb2xzLmdldCgwKTsKKyAgICAgICAgc3dpdGNoIChhbm5vLnZhbHVlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgREFURToKKyAgICAgICAgICAgICAgICBjb2wuc2V0VHlwZShUeXBlcy5EQVRFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVElNRToKKyAgICAgICAgICAgICAgICBjb2wuc2V0VHlwZShUeXBlcy5USU1FKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIGNvbC5zZXRUeXBlKFR5cGVzLlRJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAQ29sdW1uKHMpLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlQ29sdW1ucyhGaWVsZE1hcHBpbmcgZm0sCisgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbi4uLiBwY29scykgeworICAgICAgICBpZiAocGNvbHMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gbWlnaHQgYWxyZWFkeSBoYXZlIHNvbWUgY29sdW1uIGluZm9ybWF0aW9uIGZyb20gbWFwcGluZyBhbm5vdGF0aW9uCisgICAgICAgIExpc3QgY29scyA9IGZtLmdldFZhbHVlSW5mbygpLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKCFjb2xzLmlzRW1wdHkoKSAmJiBjb2xzLnNpemUoKSAhPSBwY29scy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm51bS1jb2xzLW1pc21hdGNoIiwgZm0sCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoY29scy5zaXplKCkpLCBTdHJpbmcudmFsdWVPZihwY29scy5sZW5ndGgpKSk7CisKKyAgICAgICAgaW50IHVuaXF1ZSA9IDA7CisgICAgICAgIFN0cmluZyBzZWNvbmRhcnkgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBjb2xzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29scy5zaXplKCkgPiBpKQorICAgICAgICAgICAgICAgIHNldHVwQ29sdW1uKChDb2x1bW4pIGNvbHMuZ2V0KGkpLCBwY29sc1tpXSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY29scy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbHMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbj4ocGNvbHMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBjb2xzLmFkZChuZXdDb2x1bW4ocGNvbHNbaV0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdW5pcXVlIHw9IChwY29sc1tpXS51bmlxdWUoKSkgPyBUUlVFIDogRkFMU0U7CisgICAgICAgICAgICBzZWNvbmRhcnkgPSB0cmFja1NlY29uZGFyeVRhYmxlKGZtLCBzZWNvbmRhcnksCisgICAgICAgICAgICAgICAgcGNvbHNbaV0udGFibGUoKSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRDb2x1bW5zKGZtLCBmbS5nZXRWYWx1ZUluZm8oKSwgY29scywgdW5pcXVlKTsKKyAgICAgICAgaWYgKHNlY29uZGFyeSAhPSBudWxsKQorICAgICAgICAgICAgZm0uZ2V0TWFwcGluZ0luZm8oKS5zZXRUYWJsZU5hbWUoc2Vjb25kYXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2NoZW1hIGNvbHVtbiB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIGFubm90YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uIG5ld0NvbHVtbihqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4gYW5ubykgeworICAgICAgICBDb2x1bW4gY29sID0gbmV3IENvbHVtbigpOworICAgICAgICBzZXR1cENvbHVtbihjb2wsIGFubm8pOworICAgICAgICByZXR1cm4gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHVwIHRoZSBnaXZlbiBjb2x1bW4gd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBDb2x1bW4oQ29sdW1uIGNvbCwgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uIGFubm8pIHsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGFubm8ubmFtZSgpKSkKKyAgICAgICAgICAgIGNvbC5zZXROYW1lKGFubm8ubmFtZSgpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGFubm8uY29sdW1uRGVmaW5pdGlvbigpKSkKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlTmFtZShhbm5vLmNvbHVtbkRlZmluaXRpb24oKSk7CisgICAgICAgIGlmIChhbm5vLnByZWNpc2lvbigpICE9IDApCisgICAgICAgICAgICBjb2wuc2V0U2l6ZShhbm5vLnByZWNpc2lvbigpKTsKKyAgICAgICAgZWxzZSBpZiAoYW5uby5sZW5ndGgoKSAhPSAyNTUpCisgICAgICAgICAgICBjb2wuc2V0U2l6ZShhbm5vLmxlbmd0aCgpKTsKKyAgICAgICAgY29sLnNldE5vdE51bGwoIWFubm8ubnVsbGFibGUoKSk7CisgICAgICAgIGNvbC5zZXREZWNpbWFsRGlnaXRzKGFubm8uc2NhbGUoKSk7CisgICAgICAgIGNvbC5zZXRGbGFnKENvbHVtbi5GTEFHX1VOSU5TRVJUQUJMRSwgIWFubm8uaW5zZXJ0YWJsZSgpKTsKKyAgICAgICAgY29sLnNldEZsYWcoQ29sdW1uLkZMQUdfVU5VUERBVEFCTEUsICFhbm5vLnVwZGF0YWJsZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdpdmVuIGNvbHVtbnMgYXMgdGhlIGNvbHVtbnMgZm9yIDxjb2RlPmZtPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bmlxdWUgYml0d2lzZSBjb21iaW5hdGlvbiBvZiBUUlVFIGFuZCBGQUxTRSBmb3IgdGhlCisgICAgICogdW5pcXVlIGF0dHJpYnV0ZSBvZiBlYWNoIGNvbHVtbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldENvbHVtbnMoRmllbGRNYXBwaW5nIGZtLCBNYXBwaW5nSW5mbyBpbmZvLAorICAgICAgICBMaXN0PENvbHVtbj4gY29scywgaW50IHVuaXF1ZSkgeworICAgICAgICBpbmZvLnNldENvbHVtbnMoY29scyk7CisgICAgICAgIGlmICh1bmlxdWUgPT0gVFJVRSkKKyAgICAgICAgICAgIGluZm8uc2V0VW5pcXVlKG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlKCkpOworCisgICAgICAgIC8vIyMjIEVKQjMKKyAgICAgICAgTG9nIGxvZyA9IGdldExvZygpOworICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSAmJiB1bmlxdWUgPT0gKFRSVUUgfCBGQUxTRSkpCisgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgiaW5jb25zaXN0LWNvbC1hdHRycyIsIGZtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIHRvIHRyYWNrIHRoZSBzZWNvbmRhcnkgdGFibGUgZm9yIGEgc2V0IG9mIGNvbHVtbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vjb25kYXJ5IHNlY29uZGFyeSB0YWJsZSBmb3IgbGFzdCBjb2x1bW4KKyAgICAgKiBAcGFyYW0gY29sU2Vjb25kYXJ5IHNlY29uZGFyeSB0YWJsZSBmb3IgY3VycmVudCBjb2x1bW4KKyAgICAgKiBAcmV0dXJuIHNlY29uZGFyeSB0YWJsZSBmb3IgZmllbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0cmFja1NlY29uZGFyeVRhYmxlKEZpZWxkTWFwcGluZyBmbSwgU3RyaW5nIHNlY29uZGFyeSwKKyAgICAgICAgU3RyaW5nIGNvbFNlY29uZGFyeSwgaW50IGNvbCkgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShjb2xTZWNvbmRhcnkpKQorICAgICAgICAgICAgY29sU2Vjb25kYXJ5ID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbFNlY29uZGFyeTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5lcXVhbHNJZ25vcmVDYXNlKHNlY29uZGFyeSwgY29sU2Vjb25kYXJ5KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgic2Vjb25kLWluY29uc2lzdCIsIGZtKSk7CisgICAgICAgIHJldHVybiBzZWNvbmRhcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgQEpvaW5UYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VKb2luVGFibGUoRmllbGRNYXBwaW5nIGZtLCBKb2luVGFibGUgam9pbikgeworICAgICAgICBmbS5nZXRNYXBwaW5nSW5mbygpLnNldFRhYmxlTmFtZSh0b1RhYmxlTmFtZShqb2luLnNjaGVtYSgpLAorICAgICAgICAgICAgam9pbi5uYW1lKCkpKTsKKyAgICAgICAgcGFyc2VKb2luQ29sdW1ucyhmbSwgZm0uZ2V0TWFwcGluZ0luZm8oKSwgZmFsc2UsIGpvaW4uam9pbkNvbHVtbnMoKSk7CisgICAgICAgIHBhcnNlSm9pbkNvbHVtbnMoZm0sIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCksIGZhbHNlLAorICAgICAgICAgICAgam9pbi5pbnZlcnNlSm9pbkNvbHVtbnMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZ2l2ZW4gQEpvaW5Db2x1bW4gYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSm9pbkNvbHVtbnMoRmllbGRNYXBwaW5nIGZtLCBNYXBwaW5nSW5mbyBpbmZvLAorICAgICAgICBib29sZWFuIHNlY29uZGFyeUFsbG93ZWQsIEpvaW5Db2x1bW4uLi4gam9pbnMpIHsKKyAgICAgICAgaWYgKGpvaW5zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIExpc3Q8Q29sdW1uPiBjb2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KGpvaW5zLmxlbmd0aCk7CisgICAgICAgIGludCB1bmlxdWUgPSAwOworICAgICAgICBTdHJpbmcgc2Vjb25kYXJ5ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2lucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29scy5hZGQobmV3Q29sdW1uKGpvaW5zW2ldKSk7CisgICAgICAgICAgICB1bmlxdWUgfD0gKGpvaW5zW2ldLnVuaXF1ZSgpKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgICAgIHNlY29uZGFyeSA9IHRyYWNrU2Vjb25kYXJ5VGFibGUoZm0sIHNlY29uZGFyeSwKKyAgICAgICAgICAgICAgICBqb2luc1tpXS50YWJsZSgpLCBpKTsKKyAgICAgICAgICAgIGlmICghc2Vjb25kYXJ5QWxsb3dlZCAmJiBzZWNvbmRhcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1zZWNvbmQiLCBmbSkpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Q29sdW1ucyhmbSwgaW5mbywgY29scywgdW5pcXVlKTsKKyAgICAgICAgaWYgKHNlY29uZGFyeSAhPSBudWxsKQorICAgICAgICAgICAgZm0uZ2V0TWFwcGluZ0luZm8oKS5zZXRUYWJsZU5hbWUoc2Vjb25kYXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2NoZW1hIGNvbHVtbiB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIGFubm90YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uIG5ld0NvbHVtbihKb2luQ29sdW1uIGpvaW4pIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGpvaW4ubmFtZSgpKSkKKyAgICAgICAgICAgIGNvbC5zZXROYW1lKGpvaW4ubmFtZSgpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGpvaW4uY29sdW1uRGVmaW5pdGlvbigpKSkKKyAgICAgICAgICAgIGNvbC5zZXROYW1lKGpvaW4uY29sdW1uRGVmaW5pdGlvbigpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGpvaW4ucmVmZXJlbmNlZENvbHVtbk5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0VGFyZ2V0KGpvaW4ucmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisgICAgICAgIGNvbC5zZXROb3ROdWxsKCFqb2luLm51bGxhYmxlKCkpOworICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19VTklOU0VSVEFCTEUsICFqb2luLmluc2VydGFibGUoKSk7CisgICAgICAgIGNvbC5zZXRGbGFnKENvbHVtbi5GTEFHX1VOVVBEQVRBQkxFLCAham9pbi51cGRhdGFibGUoKSk7CisgICAgICAgIHJldHVybiBjb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZ2l2ZW4gQFByaW1hcnlLZXlKb2luQ29sdW1uIGFubm90YXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVByaW1hcnlLZXlKb2luQ29sdW1ucyhGaWVsZE1hcHBpbmcgZm0sCisgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uLi4uIGpvaW5zKSB7CisgICAgICAgIExpc3Q8Q29sdW1uPiBjb2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KGpvaW5zLmxlbmd0aCk7CisgICAgICAgIGZvciAoUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbiA6IGpvaW5zKQorICAgICAgICAgICAgY29scy5hZGQobmV3Q29sdW1uKGpvaW4pKTsKKyAgICAgICAgc2V0Q29sdW1ucyhmbSwgZm0uZ2V0VmFsdWVJbmZvKCksIGNvbHMsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGdpdmVuIEBYSm9pbkNvbHVtbiBhbm5vdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVhKb2luQ29sdW1ucyhGaWVsZE1hcHBpbmcgZm0sIE1hcHBpbmdJbmZvIGluZm8sCisgICAgICAgIGJvb2xlYW4gc2Vjb25kYXJ5QWxsb3dlZCwgWEpvaW5Db2x1bW4uLi4gam9pbnMpIHsKKyAgICAgICAgaWYgKGpvaW5zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIExpc3Q8Q29sdW1uPiBjb2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KGpvaW5zLmxlbmd0aCk7CisgICAgICAgIGludCB1bmlxdWUgPSAwOworICAgICAgICBTdHJpbmcgc2Vjb25kYXJ5ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2lucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29scy5hZGQobmV3Q29sdW1uKGpvaW5zW2ldKSk7CisgICAgICAgICAgICB1bmlxdWUgfD0gKGpvaW5zW2ldLnVuaXF1ZSgpKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgICAgIHNlY29uZGFyeSA9IHRyYWNrU2Vjb25kYXJ5VGFibGUoZm0sIHNlY29uZGFyeSwKKyAgICAgICAgICAgICAgICBqb2luc1tpXS50YWJsZSgpLCBpKTsKKyAgICAgICAgICAgIGlmICghc2Vjb25kYXJ5QWxsb3dlZCAmJiBzZWNvbmRhcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1zZWNvbmQiLCBmbSkpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Q29sdW1ucyhmbSwgaW5mbywgY29scywgdW5pcXVlKTsKKyAgICAgICAgaWYgKHNlY29uZGFyeSAhPSBudWxsKQorICAgICAgICAgICAgZm0uZ2V0TWFwcGluZ0luZm8oKS5zZXRUYWJsZU5hbWUoc2Vjb25kYXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2NoZW1hIGNvbHVtbiB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIGFubm90YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uIG5ld0NvbHVtbihYSm9pbkNvbHVtbiBqb2luKSB7CisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShqb2luLm5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShqb2luLm5hbWUoKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShqb2luLmNvbHVtbkRlZmluaXRpb24oKSkpCisgICAgICAgICAgICBjb2wuc2V0TmFtZShqb2luLmNvbHVtbkRlZmluaXRpb24oKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShqb2luLnJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpKQorICAgICAgICAgICAgY29sLnNldFRhcmdldChqb2luLnJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoam9pbi5yZWZlcmVuY2VkQXR0cmlidXRlTmFtZSgpKSkKKyAgICAgICAgICAgIGNvbC5zZXRUYXJnZXRGaWVsZChqb2luLnJlZmVyZW5jZWRBdHRyaWJ1dGVOYW1lKCkpOworICAgICAgICBjb2wuc2V0Tm90TnVsbCgham9pbi5udWxsYWJsZSgpKTsKKyAgICAgICAgY29sLnNldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFLCAham9pbi5pbnNlcnRhYmxlKCkpOworICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19VTlVQREFUQUJMRSwgIWpvaW4udXBkYXRhYmxlKCkpOworICAgICAgICByZXR1cm4gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGVtYmVkZGVkIGluZm8gZm9yIHRoZSBnaXZlbiBtYXBwaW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUVtYmVkZGVkTWFwcGluZyhGaWVsZE1hcHBpbmcgZm0sIEVtYmVkZGVkTWFwcGluZyBhbm5vKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBlbWJlZCA9IGZtLmdldEVtYmVkZGVkTWFwcGluZygpOworICAgICAgICBpZiAoZW1iZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm90LWVtYmVkZGVkIiwgZm0pKTsKKworICAgICAgICBGaWVsZE1hcHBpbmcgZWZtOworICAgICAgICBmb3IgKE1hcHBpbmdPdmVycmlkZSBvdmVyIDogYW5uby5vdmVycmlkZXMoKSkgeworICAgICAgICAgICAgZWZtID0gZW1iZWQuZ2V0RmllbGRNYXBwaW5nKG92ZXIubmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChlZm0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImVtYmVkLW92ZXJyaWRlLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICBmbSwgb3Zlci5uYW1lKCkpKTsKKyAgICAgICAgICAgIHBvcHVsYXRlKGVmbSwgb3Zlcik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbnVsbEluZCA9IG51bGw7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShhbm5vLm51bGxJbmRpY2F0b3JBdHRyaWJ1dGVOYW1lKCkpKQorICAgICAgICAgICAgbnVsbEluZCA9IGFubm8ubnVsbEluZGljYXRvckF0dHJpYnV0ZU5hbWUoKTsKKyAgICAgICAgZWxzZSBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoYW5uby5udWxsSW5kaWNhdG9yQ29sdW1uTmFtZSgpKSkKKyAgICAgICAgICAgIG51bGxJbmQgPSBhbm5vLm51bGxJbmRpY2F0b3JDb2x1bW5OYW1lKCk7CisgICAgICAgIGlmIChudWxsSW5kID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVmFsdWVNYXBwaW5nSW5mbyBpbmZvID0gZm0uZ2V0VmFsdWVJbmZvKCk7CisgICAgICAgIGlmICgiZmFsc2UiLmVxdWFscyhudWxsSW5kKSkKKyAgICAgICAgICAgIGluZm8uc2V0Q2FuSW5kaWNhdGVOdWxsKGZhbHNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDb2x1bW4gY29sID0gbmV3IENvbHVtbigpOworICAgICAgICAgICAgaWYgKCEidHJ1ZSIuZXF1YWxzKG51bGxJbmQpKQorICAgICAgICAgICAgICAgIGNvbC5zZXROYW1lKG51bGxJbmQpOworICAgICAgICAgICAgaW5mby5zZXRDb2x1bW5zKEFycmF5cy5hc0xpc3QobmV3IENvbHVtbltdeyBjb2wgfSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgQENvbnRhaW5lclRhYmxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlQ29udGFpbmVyVGFibGUoRmllbGRNYXBwaW5nIGZtLCBDb250YWluZXJUYWJsZSBjdGJsKSB7CisgICAgICAgIGZtLmdldE1hcHBpbmdJbmZvKCkuc2V0VGFibGVOYW1lKHRvVGFibGVOYW1lKGN0Ymwuc2NoZW1hKCksCisgICAgICAgICAgICBjdGJsLm5hbWUoKSkpOworICAgICAgICBwYXJzZVhKb2luQ29sdW1ucyhmbSwgZm0uZ2V0TWFwcGluZ0luZm8oKSwgZmFsc2UsIGN0Ymwuam9pbkNvbHVtbnMoKSk7CisgICAgICAgIGlmIChjdGJsLmpvaW5Gb3JlaWduS2V5KCkuc3BlY2lmaWVkKCkpCisgICAgICAgICAgICBwYXJzZUZvcmVpZ25LZXkoZm0uZ2V0TWFwcGluZ0luZm8oKSwgY3RibC5qb2luRm9yZWlnbktleSgpKTsKKyAgICAgICAgaWYgKGN0Ymwuam9pbkluZGV4KCkuc3BlY2lmaWVkKCkpCisgICAgICAgICAgICBwYXJzZUluZGV4KGZtLmdldE1hcHBpbmdJbmZvKCksIGN0Ymwuam9pbkluZGV4KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBPcmRlckNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VPcmRlckNvbHVtbihGaWVsZE1hcHBpbmcgZm0sIE9yZGVyQ29sdW1uIG9yZGVyKSB7CisgICAgICAgIGlmICghb3JkZXIuZW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmbS5nZXRNYXBwaW5nSW5mbygpLnNldENhbk9yZGVyQ29sdW1uKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENvbHVtbiBjb2wgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShvcmRlci5uYW1lKCkpKQorICAgICAgICAgICAgY29sLnNldE5hbWUob3JkZXIubmFtZSgpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KG9yZGVyLmNvbHVtbkRlZmluaXRpb24oKSkpCisgICAgICAgICAgICBjb2wuc2V0VHlwZU5hbWUob3JkZXIuY29sdW1uRGVmaW5pdGlvbigpKTsKKyAgICAgICAgaWYgKG9yZGVyLnByZWNpc2lvbigpICE9IDApCisgICAgICAgICAgICBjb2wuc2V0U2l6ZShvcmRlci5wcmVjaXNpb24oKSk7CisgICAgICAgIGNvbC5zZXRGbGFnKENvbHVtbi5GTEFHX1VOSU5TRVJUQUJMRSwgIW9yZGVyLmluc2VydGFibGUoKSk7CisgICAgICAgIGNvbC5zZXRGbGFnKENvbHVtbi5GTEFHX1VOVVBEQVRBQkxFLCAhb3JkZXIudXBkYXRhYmxlKCkpOworICAgICAgICBmbS5nZXRNYXBwaW5nSW5mbygpLnNldE9yZGVyQ29sdW1uKGNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgQEVsZW1lbnRKb2luQ29sdW1uKHMpLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlRWxlbWVudEpvaW5Db2x1bW5zKEZpZWxkTWFwcGluZyBmbSwKKyAgICAgICAgRWxlbWVudEpvaW5Db2x1bW4uLi4gam9pbnMpIHsKKyAgICAgICAgaWYgKGpvaW5zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIExpc3Q8Q29sdW1uPiBjb2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KGpvaW5zLmxlbmd0aCk7CisgICAgICAgIGludCB1bmlxdWUgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpvaW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2xzLmFkZChuZXdDb2x1bW4oam9pbnNbaV0pKTsKKyAgICAgICAgICAgIHVuaXF1ZSB8PSAoam9pbnNbaV0udW5pcXVlKCkpID8gVFJVRSA6IEZBTFNFOworICAgICAgICB9CisgICAgICAgIHNldENvbHVtbnMoZm0sIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCksIGNvbHMsIHVuaXF1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHNjaGVtYSBjb2x1bW4gd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbHVtbiBuZXdDb2x1bW4oRWxlbWVudEpvaW5Db2x1bW4gam9pbikgeworICAgICAgICBDb2x1bW4gY29sID0gbmV3IENvbHVtbigpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoam9pbi5uYW1lKCkpKQorICAgICAgICAgICAgY29sLnNldE5hbWUoam9pbi5uYW1lKCkpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoam9pbi5jb2x1bW5EZWZpbml0aW9uKCkpKQorICAgICAgICAgICAgY29sLnNldE5hbWUoam9pbi5jb2x1bW5EZWZpbml0aW9uKCkpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoam9pbi5yZWZlcmVuY2VkQ29sdW1uTmFtZSgpKSkKKyAgICAgICAgICAgIGNvbC5zZXRUYXJnZXQoam9pbi5yZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGpvaW4ucmVmZXJlbmNlZEF0dHJpYnV0ZU5hbWUoKSkpCisgICAgICAgICAgICBjb2wuc2V0VGFyZ2V0RmllbGQoam9pbi5yZWZlcmVuY2VkQXR0cmlidXRlTmFtZSgpKTsKKyAgICAgICAgY29sLnNldE5vdE51bGwoIWpvaW4ubnVsbGFibGUoKSk7CisgICAgICAgIGNvbC5zZXRGbGFnIChDb2x1bW4uRkxBR19VTklOU0VSVEFCTEUsICFqb2luLmluc2VydGFibGUgKCkpOworCQljb2wuc2V0RmxhZyAoQ29sdW1uLkZMQUdfVU5VUERBVEFCTEUsICFqb2luLnVwZGF0YWJsZSAoKSk7CisJCXJldHVybiBjb2w7CisJfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIFVuaXF1ZSBuZXdVbmlxdWUoQ2xhc3NNYXBwaW5nIGNtLCBTdHJpbmcgbmFtZSwgCisgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKSB7CisgICAgICAgIGlmIChjb2x1bW5OYW1lcyA9PSBudWxsIHx8IGNvbHVtbk5hbWVzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFVuaXF1ZSB1bmlxdWVDb25zdHJhaW50ID0gbmV3IFVuaXF1ZSgpOworICAgICAgICB1bmlxdWVDb25zdHJhaW50LnNldE5hbWUobmFtZSk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxjb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY29sdW1uTmFtZXNbaV0pKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKF9sb2MuZ2V0KCJlbXB0eS11bmlxdWUtY29sdW1uIiwgCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhjb2x1bW5OYW1lcyksIGNtKSk7CisgICAgICAgICAgICBDb2x1bW4gY29sdW1uID0gbmV3IENvbHVtbigpOworICAgICAgICAgICAgY29sdW1uLnNldE5hbWUoY29sdW1uTmFtZXNbaV0pOworICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludC5hZGRDb2x1bW4oY29sdW1uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NsYXNzQ3JpdGVyaWEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvQ2xhc3NDcml0ZXJpYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjMwYWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NsYXNzQ3JpdGVyaWEuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBzcGVjaWZ5aW5nIHRvIHVzZSB0aGUgZXhwZWN0ZWQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uCisgKiBhcyBjcml0ZXJpYSBpbiB0aGUgam9pbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBDbGFzc0NyaXRlcmlhIHsKKworICAgIGJvb2xlYW4gdmFsdWUoKSBkZWZhdWx0IHRydWU7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NvbHVtbnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvQ29sdW1ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmM3MjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NvbHVtbnMuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOworCisvKioKKyAqIEFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBtdWx0aXBsZSBjb2x1bW5zIGZvciBjb21wbGV4IG1hcHBpbmdzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIENvbHVtbnMgeworCisgICAgQ29sdW1uW10gdmFsdWUoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Db250YWluZXJUYWJsZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Db250YWluZXJUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDcwNDMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NvbnRhaW5lclRhYmxlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIFRhYmxlIGZvciBhcnJheSwgY29sbGVjdGlvbiwgb3IgbWFwIGVsZW1lbnRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIENvbnRhaW5lclRhYmxlIHsKKworICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKworICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKworICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworCisgICAgWEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307CisKKyAgICBGb3JlaWduS2V5IGpvaW5Gb3JlaWduS2V5KCkgZGVmYXVsdCBARm9yZWlnbktleShzcGVjaWZpZWQgPSBmYWxzZSk7CisKKyAgICBJbmRleCBqb2luSW5kZXgoKSBkZWZhdWx0IEBJbmRleChzcGVjaWZpZWQgPSBmYWxzZSk7CisKKyAgICBib29sZWFuIHNwZWNpZmllZCgpIGRlZmF1bHQgdHJ1ZTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRGF0YVN0b3JlSWRDb2x1bW4uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRGF0YVN0b3JlSWRDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZlZTZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9EYXRhU3RvcmVJZENvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBTdXJyb2dhdGUgZGF0YXN0b3JlIGlkZW50aXR5IGNvbHVtbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBEYXRhU3RvcmVJZENvbHVtbiB7CisKKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7CisKKyAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKworICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0Rpc2NyaW1pbmF0b3JTdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9EaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2JlM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9EaXNjcmltaW5hdG9yU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogRGlzY3JpbWluYXRvciBtYXBwaW5nIHN0cmF0ZWd5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JTdHJhdGVneSB7CisKKyAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FYWdlckZldGNoTW9kZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FYWdlckZldGNoTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTRkMDAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VhZ2VyRmV0Y2hNb2RlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIERldGVybWluZXMgaG93IHRvIGVhZ2VyLWZldGNoIGEgZmllbGQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRWFnZXJGZXRjaE1vZGUgeworCisgICAgRWFnZXJGZXRjaFR5cGUgdmFsdWUoKSBkZWZhdWx0IEVhZ2VyRmV0Y2hUeXBlLk5PTkU7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VhZ2VyRmV0Y2hUeXBlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VhZ2VyRmV0Y2hUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxOWE3OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWFnZXJGZXRjaFR5cGUuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCisvKioKKyAqIFR5cGUgb2YgZmV0Y2hpbmcgdG8gZW1wbG95LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGVudW0gRWFnZXJGZXRjaFR5cGUgeworCisgICAgTk9ORSwKKyAgICBKT0lOLAorICAgIFBBUkFMTEVMIH07CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VsZW1lbnRDbGFzc0NyaXRlcmlhLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VsZW1lbnRDbGFzc0NyaXRlcmlhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjYTMwNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudENsYXNzQ3JpdGVyaWEuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBzcGVjaWZ5aW5nIHRvIHVzZSB0aGUgZXhwZWN0ZWQgY2xhc3Mgb2YgdGhlIGFycmF5LAorICogY29sbGVjdGlvbiwgb3IgbWFwIGVsZW1lbnQgcmVsYXRpb24gYXMgY3JpdGVyaWEgaW4gdGhlIGpvaW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENsYXNzQ3JpdGVyaWEgeworCisgICAgYm9vbGVhbiB2YWx1ZSgpIGRlZmF1bHQgdHJ1ZTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudEZvcmVpZ25LZXkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudEZvcmVpZ25LZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTAyNTJmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50Rm9yZWlnbktleS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBGb3JlaWduIGtleSBvbiBhcnJheSwgY29sbGVjdGlvbiwgb3IgbWFwIGVsZW1lbnQgY29sdW1ucy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBFbGVtZW50Rm9yZWlnbktleSB7CisKKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgICBib29sZWFuIGRlZmVycmVkKCkgZGVmYXVsdCBmYWxzZTsKKworICAgIEZvcmVpZ25LZXlBY3Rpb24gZGVsZXRlQWN0aW9uKCkgZGVmYXVsdCBGb3JlaWduS2V5QWN0aW9uLlJFU1RSSUNUOworCisgICAgRm9yZWlnbktleUFjdGlvbiB1cGRhdGVBY3Rpb24oKSBkZWZhdWx0IEZvcmVpZ25LZXlBY3Rpb24uUkVTVFJJQ1Q7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VsZW1lbnRJbmRleC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50SW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDJkNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50SW5kZXguamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSW5kZXggb24gYXJyYXksIGNvbGxlY3Rpb24sIG9yIG1hcCBlbGVtZW50IGNvbHVtbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudEluZGV4IHsKKworICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKworICAgIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudEpvaW5Db2x1bW4uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudEpvaW5Db2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRmNWMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50Sm9pbkNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBBcnJheSwgY29sbGVjdGlvbiwgb3IgbWFwIGVsZW1lbnQgam9pbiBjb2x1bW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudEpvaW5Db2x1bW4geworCisgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKworICAgIFN0cmluZyByZWZlcmVuY2VkQXR0cmlidXRlTmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisKKyAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworCisgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworCisgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisKKyAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VsZW1lbnRKb2luQ29sdW1ucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50Sm9pbkNvbHVtbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJmNTMxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50Sm9pbkNvbHVtbnMuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIG11bHRpcGxlIGFycmF5LCBjb2xsZWN0aW9uLCBvciBtYXAgZWxlbWVudAorICogY29sdW1ucyBmb3IgY29tcG91bmQgam9pbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudEpvaW5Db2x1bW5zIHsKKworICAgIEVsZW1lbnRKb2luQ29sdW1uW10gdmFsdWUoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50Tm9ucG9seW1vcnBoaWMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudE5vbnBvbHltb3JwaGljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0YjM3ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudE5vbnBvbHltb3JwaGljLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBhbm5vdGF0ZWQgYXJyYXksIGNvbGxlY3Rpb24sIG9yIG1hcCdzIGVsZW1lbnRzIGFyZQorICogbm90IGVudGlyZWx5IHBvbHltb3JwaGljLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnROb25wb2x5bW9ycGhpYyB7CisKKyAgICBOb25wb2x5bW9ycGhpY1R5cGUgdmFsdWUoKSBkZWZhdWx0IE5vbnBvbHltb3JwaGljVHlwZS5FWEFDVDsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRW1iZWRkZWRNYXBwaW5nLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VtYmVkZGVkTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTVjMGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VtYmVkZGVkTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBFbWJlZGRlZCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkTWFwcGluZyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsKKworICAgIFN0cmluZyBudWxsSW5kaWNhdG9yQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBTdHJpbmcgbnVsbEluZGljYXRvckF0dHJpYnV0ZU5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgTWFwcGluZ092ZXJyaWRlW10gb3ZlcnJpZGVzKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRm9yZWlnbktleS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Gb3JlaWduS2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlMTQwZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRm9yZWlnbktleS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBGb3JlaWduIGtleSBkZWZpbml0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUsIE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEZvcmVpZ25LZXkgeworCisgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgICAgYm9vbGVhbiBkZWZlcnJlZCgpIGRlZmF1bHQgZmFsc2U7CisKKyAgICBGb3JlaWduS2V5QWN0aW9uIGRlbGV0ZUFjdGlvbigpIGRlZmF1bHQgRm9yZWlnbktleUFjdGlvbi5SRVNUUklDVDsKKworICAgIEZvcmVpZ25LZXlBY3Rpb24gdXBkYXRlQWN0aW9uKCkgZGVmYXVsdCBGb3JlaWduS2V5QWN0aW9uLlJFU1RSSUNUOworCisgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKSBkZWZhdWx0IHt9OworCisgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0ZvcmVpZ25LZXlBY3Rpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRm9yZWlnbktleUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGM4MzQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0ZvcmVpZ25LZXlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCisvKioKKyAqIEZvcmVpZ24ga2V5IGFjdGlvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgZW51bSBGb3JlaWduS2V5QWN0aW9uIHsKKworICAgIFJFU1RSSUNULAorICAgIENBU0NBREUsCisgICAgTlVMTCwKKyAgICBERUZBVUxUIH07CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0luZGV4LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0luZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4MGVhNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvSW5kZXguamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSW5kZXggZGVmaW5pdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBJbmRleCB7CisKKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisKKyAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpIGRlZmF1bHQge307CisKKyAgICBib29sZWFuIHNwZWNpZmllZCgpIGRlZmF1bHQgdHJ1ZTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvSXNvbGF0aW9uTGV2ZWwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvSXNvbGF0aW9uTGV2ZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY5NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Jc29sYXRpb25MZXZlbC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNGZXRjaENvbmZpZ3VyYXRpb247CisKKy8qKgorICogSXNvbGF0aW9uIGxldmVscyBmb3IgdXNlIGluIHtAbGluayBKREJDRmV0Y2hQbGFuI3NldElzb2xhdGlvbn0uCisgKgorICogQHNpbmNlIDAuOS43CisgKi8KK3B1YmxpYyBlbnVtIElzb2xhdGlvbkxldmVsIHsKKyAgICBERUZBVUxUKC0xKSwKKyAgICBOT05FKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fTk9ORSksCisgICAgUkVBRF9VTkNPTU1JVFRFRChDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQpLAorICAgIFJFQURfQ09NTUlUVEVEKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQpLAorICAgIFJFUEVBVEFCTEVfUkVBRChDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCksCisgICAgU0VSSUFMSVpBQkxFKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFKTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IF9jb25uZWN0aW9uQ29uc3RhbnQ7CisKKyAgICBwcml2YXRlIElzb2xhdGlvbkxldmVsKGludCBjb25uZWN0aW9uQ29uc3RhbnQpIHsKKyAgICAgICAgX2Nvbm5lY3Rpb25Db25zdGFudCA9IGNvbm5lY3Rpb25Db25zdGFudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldENvbm5lY3Rpb25Db25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIF9jb25uZWN0aW9uQ29uc3RhbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBJc29sYXRpb25MZXZlbCBmcm9tQ29ubmVjdGlvbkNvbnN0YW50KGludCBjb25zdGFudCkgeworICAgICAgICBzd2l0Y2goY29uc3RhbnQpIHsKKyAgICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBjYXNlIEpEQkNGZXRjaENvbmZpZ3VyYXRpb24uREVGQVVMVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVDsKKworICAgICAgICAgICAgY2FzZSBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX05PTkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisKKyAgICAgICAgICAgIGNhc2UgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBSRUFEX1VOQ09NTUlUVEVEOworCisgICAgICAgICAgICBjYXNlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJFQURfQ09NTUlUVEVEOworCisgICAgICAgICAgICBjYXNlIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVQRUFUQUJMRV9SRUFEOgorICAgICAgICAgICAgICAgIHJldHVybiBSRVBFQVRBQkxFX1JFQUQ7CisKKyAgICAgICAgICAgIGNhc2UgQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9TRVJJQUxJWkFCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNFUklBTElaQUJMRTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoY29uc3RhbnQpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9KREJDRmV0Y2hQbGFuLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0pEQkNGZXRjaFBsYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJmNGZlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9KREJDRmV0Y2hQbGFuLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuRWFnZXJGZXRjaE1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5MUlNTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSm9pblN5bnRheGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaFBsYW47CisKKy8qKgorICogSkRCQyBleHRlbnNpb25zIHRvIHRoZSBmZXRjaCBwbGFuLgorICoKKyAqIEBzaW5jZSAwLjQuMQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBhdXRob3IgUGluYWtpIFBvZGRhcgorICogQHB1Ymxpc2hlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEpEQkNGZXRjaFBsYW4KKyAgICBleHRlbmRzIEZldGNoUGxhbiwgRWFnZXJGZXRjaE1vZGVzLCBMUlNTaXplcywgSm9pblN5bnRheGVzIHsKKworICAgIC8qKgorICAgICAqIEVhZ2VyIGZldGNoIG1vZGUgaW4gbG9hZGluZyByZWxhdGlvbnMuCisgICAgICogCisgICAgICogQHNlZSBFYWdlckZldGNoTW9kZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEVhZ2VyRmV0Y2hNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBFYWdlciBmZXRjaCBtb2RlIGluIGxvYWRpbmcgcmVsYXRpb25zLgorICAgICAqIAorICAgICAqIEBzZWUgRWFnZXJGZXRjaE1vZGVzCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW4gc2V0RWFnZXJGZXRjaE1vZGUoaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogRWFnZXIgZmV0Y2ggbW9kZSBpbiBsb2FkaW5nIHN1YmNsYXNzZXMuCisgICAgICogCisgICAgICogQHNlZSBFYWdlckZldGNoTW9kZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN1YmNsYXNzRmV0Y2hNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBFYWdlciBmZXRjaCBtb2RlIGluIGxvYWRpbmcgc3ViY2xhc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlIEVhZ2VyRmV0Y2hNb2RlcworICAgICAqLworICAgIHB1YmxpYyBKREJDRmV0Y2hQbGFuIHNldFN1YmNsYXNzRmV0Y2hNb2RlKGludCBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFR5cGUgb2YgSkRCQyByZXN1bHQgc2V0IHRvIHVzZSBmb3IgcXVlcnkgcmVzdWx0cy4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0VHlwZSgpOworCisgICAgLyoqCisgICAgICogVHlwZSBvZiBKREJDIHJlc3VsdCBzZXQgdG8gdXNlIGZvciBxdWVyeSByZXN1bHRzLgorICAgICAqIAorICAgICAqIEBzZWUgamF2YS5zcWwuUmVzdWx0U2V0CisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW4gc2V0UmVzdWx0U2V0VHlwZShpbnQgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgc2V0IGZldGNoIGRpcmVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hEaXJlY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIFJlc3VsdCBzZXQgZmV0Y2ggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgamF2YS5zcWwuUmVzdWx0U2V0CisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW4gc2V0RmV0Y2hEaXJlY3Rpb24oaW50IGRpcmVjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBIb3cgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgbGFyZ2UgcmVzdWx0IHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExSU1NpemVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMUlNTaXplKCk7CisKKyAgICAvKioKKyAgICAgKiBIb3cgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgbGFyZ2UgcmVzdWx0IHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExSU1NpemVzCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW4gc2V0TFJTU2l6ZShpbnQgbHJzU2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBTUUwgam9pbiBzeW50YXguCisgICAgICoKKyAgICAgKiBAc2VlIEpvaW5TeW50YXhlcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Sm9pblN5bnRheCgpOworCisgICAgLyoqCisgICAgICogU1FMIGpvaW4gc3ludGF4LgorICAgICAqCisgICAgICogQHNlZSBKb2luU3ludGF4ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0ZldGNoUGxhbiBzZXRKb2luU3ludGF4KGludCBzeW50YXgpOworCisgICAgLyoqCisgICAgICogVGhlIGlzb2xhdGlvbiBsZXZlbCBmb3IgcXVlcmllcyBpc3N1ZWQgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIG92ZXJyaWRlcworICAgICAqIHRoZSBwZXJzaXN0ZW5jZS11bml0LXdpZGUgPGNvZGU+b3BlbmpwYS5qZGJjLlRyYW5zYWN0aW9uSXNvbGF0aW9uPC9jb2RlPgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHVibGljIElzb2xhdGlvbkxldmVsIGdldElzb2xhdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIGlzb2xhdGlvbiBsZXZlbCBmb3IgcXVlcmllcyBpc3N1ZWQgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIG92ZXJyaWRlcworICAgICAqIHRoZSBwZXJzaXN0ZW5jZS11bml0LXdpZGUgPGNvZGU+b3BlbmpwYS5qZGJjLlRyYW5zYWN0aW9uSXNvbGF0aW9uPC9jb2RlPgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW4gc2V0SXNvbGF0aW9uKElzb2xhdGlvbkxldmVsIGxldmVsKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvSkRCQ0ZldGNoUGxhbkltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvSkRCQ0ZldGNoUGxhbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM3MmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9KREJDRmV0Y2hQbGFuSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkRlbGVnYXRpbmdKREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRmV0Y2hQbGFuSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VFeGNlcHRpb25zOworCisvKioKKyAqIEpEQkMgZXh0ZW5zaW9ucyB0byB0aGUgZmV0Y2ggcGxhbi4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBKREJDRmV0Y2hQbGFuSW1wbAorICAgIGV4dGVuZHMgRmV0Y2hQbGFuSW1wbAorICAgIGltcGxlbWVudHMgSkRCQ0ZldGNoUGxhbiB7CisKKyAgICBwcml2YXRlIERlbGVnYXRpbmdKREJDRmV0Y2hDb25maWd1cmF0aW9uIF9mZXRjaDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW5JbXBsKEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBzdXBlcihmZXRjaCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24gbmV3RGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbgorICAgICAgICAoRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIF9mZXRjaCA9IG5ldyBEZWxlZ2F0aW5nSkRCQ0ZldGNoQ29uZmlndXJhdGlvbigoSkRCQ0ZldGNoQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIGZldGNoLCBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuVFJBTlNMQVRPUik7CisgICAgICAgIHJldHVybiBfZmV0Y2g7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRFYWdlckZldGNoTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRFYWdlckZldGNoTW9kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hQbGFuSW1wbCBzZXRFYWdlckZldGNoTW9kZShpbnQgbW9kZSkgeworICAgICAgICBfZmV0Y2guc2V0RWFnZXJGZXRjaE1vZGUobW9kZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKSB7CisgICAgICAgIHJldHVybiBfZmV0Y2guZ2V0U3ViY2xhc3NGZXRjaE1vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSkRCQ0ZldGNoUGxhbkltcGwgc2V0U3ViY2xhc3NGZXRjaE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgX2ZldGNoLnNldFN1YmNsYXNzRmV0Y2hNb2RlKG1vZGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc3VsdFNldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfZmV0Y2guZ2V0UmVzdWx0U2V0VHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hQbGFuSW1wbCBzZXRSZXN1bHRTZXRUeXBlKGludCB0eXBlKSB7CisgICAgICAgIF9mZXRjaC5zZXRSZXN1bHRTZXRUeXBlKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEZldGNoRGlyZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2ZldGNoLmdldEZldGNoRGlyZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW5JbXBsIHNldEZldGNoRGlyZWN0aW9uKGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgX2ZldGNoLnNldEZldGNoRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TFJTU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRMUlNTaXplKCk7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW5JbXBsIHNldExSU1NpemUoaW50IGxyc1NpemUpIHsKKyAgICAgICAgX2ZldGNoLnNldExSU1NpemUobHJzU2l6ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Sm9pblN5bnRheCgpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRKb2luU3ludGF4KCk7CisgICAgfQorCisgICAgcHVibGljIEpEQkNGZXRjaFBsYW5JbXBsIHNldEpvaW5TeW50YXgoaW50IHN5bnRheCkgeworICAgICAgICBfZmV0Y2guc2V0Sm9pblN5bnRheChzeW50YXgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgSXNvbGF0aW9uTGV2ZWwgZ2V0SXNvbGF0aW9uKCkgeworICAgICAgICByZXR1cm4gSXNvbGF0aW9uTGV2ZWwuZnJvbUNvbm5lY3Rpb25Db25zdGFudChfZmV0Y2guZ2V0SXNvbGF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBKREJDRmV0Y2hQbGFuIHNldElzb2xhdGlvbihJc29sYXRpb25MZXZlbCBsZXZlbCkgeworICAgICAgICBfZmV0Y2guc2V0SXNvbGF0aW9uKGxldmVsLmdldENvbm5lY3Rpb25Db25zdGFudCgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9KREJDUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9KREJDUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDRmM2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0pEQkNQZXJzaXN0ZW5jZVByb2R1Y3REZXJpdmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQVByb2R1Y3REZXJpdmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5KREJDU3RvcmVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5BYnN0cmFjdFByb2R1Y3REZXJpdmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaFBsYW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUHJvZHVjdERlcml2YXRpb247CisKKy8qKgorICogU2V0cyBKREJDLXNwZWNpZmljIEpQQSBzcGVjaWZpY2F0aW9uIGRlZmF1bHRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBKREJDUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbiAKKyAgICBleHRlbmRzIEFic3RyYWN0UHJvZHVjdERlcml2YXRpb24gCisgICAgaW1wbGVtZW50cyBPcGVuSlBBUHJvZHVjdERlcml2YXRpb24geworICAgIAorICAgIHB1YmxpYyB2b2lkIHB1dEJyb2tlckZhY3RvcnlBbGlhc2VzKE1hcCBtKSB7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVFlQRV9TUEVDX1NUT1JFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBKUEEgaXMgYXZhaWxhYmxlCisgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlQ29uZmlndXJhdGlvbkxvYWQoQ29uZmlndXJhdGlvbiBjKSB7CisgICAgICAgIGlmIChjIGluc3RhbmNlb2YgT3BlbkpQQUNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICgoT3BlbkpQQUNvbmZpZ3VyYXRpb24pIGMpLmdldFN0b3JlRmFjYWRlVHlwZVJlZ2lzdHJ5KCkuCisgICAgICAgICAgICAgICAgcmVnaXN0ZXJJbXBsZW1lbnRhdGlvbihGZXRjaFBsYW4uY2xhc3MsIEpEQkNTdG9yZU1hbmFnZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgIEpEQkNGZXRjaFBsYW5JbXBsLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShjIGluc3RhbmNlb2YgSkRCQ0NvbmZpZ3VyYXRpb25JbXBsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBKREJDQ29uZmlndXJhdGlvbkltcGwgY29uZiA9IChKREJDQ29uZmlndXJhdGlvbkltcGwpIGM7CisgICAgICAgIFN0cmluZyBqcGEgPSBQZXJzaXN0ZW5jZVByb2R1Y3REZXJpdmF0aW9uLlNQRUNfSlBBOworICAgICAgICBTdHJpbmcgZWpiID0gUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbi5BTElBU19FSkI7CisKKyAgICAgICAgY29uZi5tZXRhRmFjdG9yeVBsdWdpbi5zZXRBbGlhcyhlamIsCisgICAgICAgICAgICBQZXJzaXN0ZW5jZU1hcHBpbmdGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIGNvbmYubWV0YUZhY3RvcnlQbHVnaW4uc2V0QWxpYXMoanBhLAorICAgICAgICAgICAgUGVyc2lzdGVuY2VNYXBwaW5nRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIGNvbmYubWFwcGluZ0ZhY3RvcnlQbHVnaW4uc2V0QWxpYXMoZWpiLAorICAgICAgICAgICAgUGVyc2lzdGVuY2VNYXBwaW5nRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBjb25mLm1hcHBpbmdGYWN0b3J5UGx1Z2luLnNldEFsaWFzKGpwYSwKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlTWFwcGluZ0ZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBjb25mLm1hcHBpbmdEZWZhdWx0c1BsdWdpbi5zZXRBbGlhcyhlamIsCisgICAgICAgICAgICBQZXJzaXN0ZW5jZU1hcHBpbmdEZWZhdWx0cy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBjb25mLm1hcHBpbmdEZWZhdWx0c1BsdWdpbi5zZXRBbGlhcyhqcGEsCisgICAgICAgICAgICBQZXJzaXN0ZW5jZU1hcHBpbmdEZWZhdWx0cy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclNwZWNpZmljYXRpb25TZXQoQ29uZmlndXJhdGlvbiBjKSB7CisgICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBKREJDQ29uZmlndXJhdGlvbkltcGwpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBKREJDQ29uZmlndXJhdGlvbkltcGwgY29uZiA9IChKREJDQ29uZmlndXJhdGlvbkltcGwpIGM7CisgICAgICAgIFN0cmluZyBqcGEgPSBQZXJzaXN0ZW5jZVByb2R1Y3REZXJpdmF0aW9uLlNQRUNfSlBBOworICAgICAgICBpZiAoIWpwYS5lcXVhbHMoY29uZi5nZXRTcGVjaWZpY2F0aW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgY29uZi5tYXBwaW5nRGVmYXVsdHNQbHVnaW4uc2V0RGVmYXVsdChqcGEpOworICAgICAgICBjb25mLm1hcHBpbmdEZWZhdWx0c1BsdWdpbi5zZXRTdHJpbmcoanBhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9NYXBwaW5nT3ZlcnJpZGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTWFwcGluZ092ZXJyaWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiM2EzZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTWFwcGluZ092ZXJyaWRlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKKworLyoqCisgKiBBbGxvd3Mgb3ZlcnJpZGUgb2YgY29tcGxleCBlbWJlZGRlZCBvciBzdXBlcmNsYXNzIG1hcHBpbmdzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIE1hcHBpbmdPdmVycmlkZSB7CisKKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKKworICAgIFhKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworCisgICAgRWxlbWVudEpvaW5Db2x1bW5bXSBlbGVtZW50Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworCisgICAgQ29udGFpbmVyVGFibGUgY29udGFpbmVyVGFibGUoKSBkZWZhdWx0IEBDb250YWluZXJUYWJsZShzcGVjaWZpZWQgPSBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL01hcHBpbmdPdmVycmlkZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTWFwcGluZ092ZXJyaWRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTI5NTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL01hcHBpbmdPdmVycmlkZXMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQWxsb3dzIG92ZXJyaWRlIG9mIGNvbXBsZXggZW1iZWRkZWQgb3Igc3VwZXJjbGFzcyBtYXBwaW5ncy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBNYXBwaW5nT3ZlcnJpZGVzIHsKKworICAgIE1hcHBpbmdPdmVycmlkZVtdIHZhbHVlKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTWFwcGluZ1RhZy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9NYXBwaW5nVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MTgyNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTWFwcGluZ1RhZy5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogd2hlbiBhZGRpbmcgYSBuZXcgdHlwZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUKKy8vIHRhYmxlIGluIFBlcnNpc3RlbmNlTWFwcGluZ1BhcnNlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogU2V0IG9mIG1hcHBpbmcgdGFncyB1c2VkIGluIEpQQS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitlbnVtIE1hcHBpbmdUYWcgeworCisgICAgQVNTT0NfT1ZFUlJJREUsCisgICAgQVNTT0NfT1ZFUlJJREVTLAorICAgIEFUVFJfT1ZFUlJJREUsCisgICAgQVRUUl9PVkVSUklERVMsCisgICAgQ09MLAorICAgIENPTFVNTl9OQU1FLAorICAgIENPTFVNTl9SRVNVTFQsCisgICAgRElTQ1JJTV9DT0wsCisgICAgRElTQ1JJTV9WQUwsCisgICAgRU5USVRZX1JFU1VMVCwKKyAgICBFTlVNRVJBVEVELAorICAgIEZJRUxEX1JFU1VMVCwKKyAgICBHRU5fSURfVEFCTEUsCisgICAgSU5IRVJJVEFOQ0UsCisgICAgSk9JTl9DT0wsCisgICAgSk9JTl9DT0xTLAorICAgIEpPSU5fVEFCTEUsCisgICAgUEtfSk9JTl9DT0wsCisgICAgUEtfSk9JTl9DT0xTLAorICAgIFNFQ09OREFSWV9UQUJMRSwKKyAgICBTRUNPTkRBUllfVEFCTEVTLAorICAgIFNRTF9SRVNVTFRfU0VUX01BUFBJTkcsCisgICAgU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MsCisgICAgVEFCTEUsCisgICAgVEFCTEVfR0VOLAorICAgIFRFTVBPUkFMLAorICAgIC8vIG9wZW5qcGEgZXh0ZW5zaW9ucworICAgIENMQVNTX0NSSVQsCisgICAgQ09MUywKKyAgICBDT05UQUlORVJfVEFCTEUsCisgICAgREFUQVNUT1JFX0lEX0NPTCwKKyAgICBESVNDUklNX1NUUkFULAorICAgIEVBR0VSX0ZFVENIX01PREUsCisgICAgRUxFTV9DTEFTU19DUklULAorICAgIEVMRU1fRkssCisgICAgRUxFTV9JTkRFWCwKKyAgICBFTEVNX0pPSU5fQ09MLAorICAgIEVMRU1fSk9JTl9DT0xTLAorICAgIEVMRU1fTk9OUE9MWSwKKyAgICBFTUJFRERFRF9NQVBQSU5HLAorICAgIEZLLAorICAgIElOREVYLAorICAgIE1BUFBJTkdfT1ZFUlJJREUsCisgICAgTUFQUElOR19PVkVSUklERVMsCisgICAgTk9OUE9MWSwKKyAgICBPUkRFUl9DT0wsCisgICAgU1RSQVQsCisgICAgU1VCQ0xBU1NfRkVUQ0hfTU9ERSwKKyAgICBVTklRVUUsCisgICAgVkVSU0lPTl9DT0wsCisgICAgVkVSU0lPTl9DT0xTLAorICAgIFZFUlNJT05fU1RSQVQsCisgICAgWF9KT0lOX0NPTCwKKyAgICBYX0pPSU5fQ09MUywKKyAgICBYX1NFQ09OREFSWV9UQUJMRSwKKyAgICBYX1NFQ09OREFSWV9UQUJMRVMsCisgICAgWF9UQUJMRSwKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTm9ucG9seW1vcnBoaWMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTm9ucG9seW1vcnBoaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjRjM2NjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Ob25wb2x5bW9ycGhpYy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgYW5ub3RhdGVkIHJlbGF0aW9uIGlzIG5vdCBlbnRpcmVseSBwb2x5bW9ycGhpYy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBOb25wb2x5bW9ycGhpYyB7CisKKyAgICBOb25wb2x5bW9ycGhpY1R5cGUgdmFsdWUoKSBkZWZhdWx0IE5vbnBvbHltb3JwaGljVHlwZS5FWEFDVDsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTm9ucG9seW1vcnBoaWNUeXBlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL05vbnBvbHltb3JwaGljVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzlhNTEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL05vbnBvbHltb3JwaGljVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKKy8qKgorICogTm9ucG9seW1vcnBoaWMgc2V0dGluZ3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgZW51bSBOb25wb2x5bW9ycGhpY1R5cGUgeworCisgICAgRVhBQ1QsCisgICAgSk9JTkFCTEUsCisgICAgRkFMU0UgfTsKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvT3JkZXJDb2x1bW4uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvT3JkZXJDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDgzYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9PcmRlckNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBTdXJyb2dhdGUgb3JkZXIgY29sdW1uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKKworICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKworICAgIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworCisgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworCisgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvUGVyc2lzdGVuY2VNYXBwaW5nRGVmYXVsdHMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvUGVyc2lzdGVuY2VNYXBwaW5nRGVmYXVsdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZjOWUyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9QZXJzaXN0ZW5jZU1hcHBpbmdEZWZhdWx0cy5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5EaXNjcmltaW5hdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ0RlZmF1bHRzSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuRmxhdENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuTm9uZURpc2NyaW1pbmF0b3JTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5Ob25lVmVyc2lvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk51bWJlclZlcnNpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5TdWJjbGFzc0pvaW5EaXNjcmltaW5hdG9yU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuVmFsdWVNYXBEaXNjcmltaW5hdG9yU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuVmVydGljYWxDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Db2x1bW47CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkpvaW5TeW50YXhlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgc2VycC51dGlsLlN0cmluZ3M7CisKKy8qKgorICogU3VwcGxpZXMgZGVmYXVsdCBtYXBwaW5nIGluZm9ybWF0aW9uIGluIGFjY29yZGFuY2Ugd2l0aCBKUEEgc3BlYy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlTWFwcGluZ0RlZmF1bHRzCisgICAgZXh0ZW5kcyBNYXBwaW5nRGVmYXVsdHNJbXBsIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfcHJlcGVuZEZpZWxkTmFtZVRvSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zID0gdHJ1ZTsKKworICAgIHB1YmxpYyBQZXJzaXN0ZW5jZU1hcHBpbmdEZWZhdWx0cygpIHsKKyAgICAgICAgc2V0RGVmYXVsdE1pc3NpbmdJbmZvKHRydWUpOworICAgICAgICBzZXRTdG9yZUVudW1PcmRpbmFsKHRydWUpOworICAgICAgICBzZXRPcmRlckxpc3RzKGZhbHNlKTsKKyAgICAgICAgc2V0QWRkTnVsbEluZGljYXRvcihmYWxzZSk7CisgICAgICAgIHNldERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lKCJEVFlQRSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgZmllbGQgbmFtZSB0byB0aGUgZGVmYXVsdCBuYW1lIG9mIGludmVyc2Ugam9pbgorICAgICAqIGNvbHVtbnMgd2l0aGluIGpvaW4gdGFibGVzLiAgRGVmYXVsdHMgdG8gdHJ1ZSBwZXIgc3BlYywgYnV0IHNldCB0byBmYWxzZQorICAgICAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkpQQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcmVwZW5kRmllbGROYW1lVG9Kb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisgICAgICAgIHJldHVybiBfcHJlcGVuZEZpZWxkTmFtZVRvSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgZmllbGQgbmFtZSB0byB0aGUgZGVmYXVsdCBuYW1lIG9mIGludmVyc2Ugam9pbgorICAgICAqIGNvbHVtbnMgd2l0aGluIGpvaW4gdGFibGVzLiAgRGVmYXVsdHMgdG8gdHJ1ZSBwZXIgc3BlYywgYnV0IHNldCB0byBmYWxzZQorICAgICAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkpQQS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVwZW5kRmllbGROYW1lVG9Kb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMoYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgX3ByZXBlbmRGaWVsZE5hbWVUb0pvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucyA9IHZhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFN0cmF0ZWd5KFZlcnNpb24gdmVycywgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBPYmplY3Qgc3RyYXQgPSBzdXBlci5nZXRTdHJhdGVneSh2ZXJzLCBhZGFwdCk7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSB2ZXJzLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3RyYXQgIT0gbnVsbCB8fCBjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbAorICAgICAgICAgICAgfHwgY2xzLmdldFZlcnNpb25GaWVsZCgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gc3RyYXQ7CisKKyAgICAgICAgaWYgKHZlcnMuZ2V0TWFwcGluZ0luZm8oKS5nZXRDb2x1bW5zKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmVWZXJzaW9uU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJWZXJzaW9uU3RyYXRlZ3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFN0cmF0ZWd5KERpc2NyaW1pbmF0b3IgZGlzYywgYm9vbGVhbiBhZGFwdCkgeworICAgICAgICBPYmplY3Qgc3RyYXQgPSBzdXBlci5nZXRTdHJhdGVneShkaXNjLCBhZGFwdCk7CisgICAgICAgIENsYXNzTWFwcGluZyBjbHMgPSBkaXNjLmdldENsYXNzTWFwcGluZygpOworICAgICAgICBpZiAoc3RyYXQgIT0gbnVsbCB8fCBjbHMuZ2V0Sm9pbmFibGVQQ1N1cGVyY2xhc3NNYXBwaW5nKCkgIT0gbnVsbAorICAgICAgICAgICAgfHwgZGlzYy5nZXRNYXBwaW5nSW5mbygpLmdldFZhbHVlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBzdHJhdDsKKworICAgICAgICAvLyBkb24ndCB1c2UgYSBjb2x1bW4tYmFzZWQgZGlzY3JpbWluYXRvciBhcHByb2FjaCB1bmxlc3MgdXNlciBoYXMgc2V0CisgICAgICAgIC8vIGEgY29sdW1uIGV4cGxpY2l0bHkgb3IgaXMgdXNpbmcgZmxhdCBpbmhlcml0YW5jZSBleHBsaWNpdGx5CisgICAgICAgIGlmICghZGlzYy5nZXRNYXBwaW5nSW5mbygpLmdldENvbHVtbnMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlTWFwRGlzY3JpbWluYXRvclN0cmF0ZWd5KCk7CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGJhc2UgPSBjbHM7CisgICAgICAgIHdoaWxlIChiYXNlLmdldE1hcHBpbmdJbmZvKCkuZ2V0SGllcmFyY2h5U3RyYXRlZ3koKSA9PSBudWxsCisgICAgICAgICAgICAmJiBiYXNlLmdldFBDU3VwZXJjbGFzc01hcHBpbmcoKSAhPSBudWxsKQorICAgICAgICAgICAgYmFzZSA9IGJhc2UuZ2V0UENTdXBlcmNsYXNzTWFwcGluZygpOworCisgICAgICAgIHN0cmF0ID0gYmFzZS5nZXRNYXBwaW5nSW5mbygpLmdldEhpZXJhcmNoeVN0cmF0ZWd5KCk7CisgICAgICAgIGlmIChGbGF0Q2xhc3NTdHJhdGVneS5BTElBUy5lcXVhbHMoc3RyYXQpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZU1hcERpc2NyaW1pbmF0b3JTdHJhdGVneSgpOworICAgICAgICBpZiAoVmVydGljYWxDbGFzc1N0cmF0ZWd5LkFMSUFTLmVxdWFscyhzdHJhdCkKKyAgICAgICAgICAgICYmIGRpY3Quam9pblN5bnRheCAhPSBKb2luU3ludGF4ZXMuU1lOVEFYX1RSQURJVElPTkFMKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJjbGFzc0pvaW5EaXNjcmltaW5hdG9yU3RyYXRlZ3koKTsKKyAgICAgICAgcmV0dXJuIE5vbmVEaXNjcmltaW5hdG9yU3RyYXRlZ3kuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZShDbGFzc01hcHBpbmcgY2xzLCBTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIGlmIChjbHMuZ2V0VHlwZUFsaWFzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0VHlwZUFsaWFzKCk7CisgICAgICAgIHJldHVybiBTdHJpbmdzLmdldENsYXNzTmFtZShjbHMuZ2V0RGVzY3JpYmVkVHlwZSgpKS5yZXBsYWNlKCckJywgJ18nKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZShGaWVsZE1hcHBpbmcgZm0sIFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgLy8gYmFzZSBuYW1lIGlzIHRhYmxlIG9mIGRlZmluaW5nIHR5cGUgKyAnXycKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmbS5nZXREZWZpbmluZ01hcHBpbmcoKS5nZXRUYWJsZSgpLmdldE5hbWUoKSArICJfIjsKKworICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFzc29jYXRpb24gdGFibGUsIHNwZWMgc2F5cyB0byBzdWZmaXggd2l0aCB0YWJsZSBvZgorICAgICAgICAvLyB0aGUgcmVsYXRlZCB0eXBlLiBzcGVjIGRvZXNuJ3QgY292ZXIgb3RoZXIgY2FzZXM7IHdlJ3JlIGdvaW5nIHRvCisgICAgICAgIC8vIHN1ZmZpeCB3aXRoIHRoZSBmaWVsZCBuYW1lCisgICAgICAgIENsYXNzTWFwcGluZyByZWwgPSBmbS5nZXRFbGVtZW50TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7CisgICAgICAgIGJvb2xlYW4gYXNzb2MgPSByZWwgIT0gbnVsbCAmJiByZWwuZ2V0VGFibGUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBmbS5nZXRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5NQVA7CisgICAgICAgIGlmIChhc3NvYykKKyAgICAgICAgICAgIG5hbWUgKz0gcmVsLmdldFRhYmxlKCkuZ2V0TmFtZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuYW1lICs9IGZtLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnJCcsICdfJyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVKb2luQ29sdW1uKEZpZWxkTWFwcGluZyBmbSwgVGFibGUgbG9jYWwsIFRhYmxlIGZvcmVpZ24sCisgICAgICAgIENvbHVtbiBjb2wsIE9iamVjdCB0YXJnZXQsIGludCBwb3MsIGludCBjb2xzKSB7CisgICAgICAgIC8vIG9ubHkgdXNlIHNwZWMgZGVmYXVsdHMgd2l0aCBjb2x1bW4gdGFyZ2V0cworICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDb2x1bW4pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBiaWRpIHJlbGF0aW9uLCBwcmVmaXggd2l0aCBpbnZlcnNlIGZpZWxkIG5hbWUsIGVsc2UKKyAgICAgICAgLy8gcHJlZml4IHdpdGggb3duaW5nIGVudGl0eSBuYW1lCisgICAgICAgIEZpZWxkTWFwcGluZ1tdIGludmVyc2VzID0gZm0uZ2V0SW52ZXJzZU1hcHBpbmdzKCk7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBpZiAoaW52ZXJzZXMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIG5hbWUgPSBpbnZlcnNlc1swXS5nZXROYW1lKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5hbWUgPSBmbS5nZXREZWZpbmluZ01hcHBpbmcoKS5nZXRUeXBlQWxpYXMoKTsKKworICAgICAgICAvLyBzdWZmaXggd2l0aCAnXycgKyB0YXJnZXQgY29sdW1uCisgICAgICAgIG5hbWUgKz0gIl8iICsgKChDb2x1bW4pIHRhcmdldCkuZ2V0TmFtZSgpOworICAgICAgICBjb2wuc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUZvcmVpZ25LZXlDb2x1bW4oVmFsdWVNYXBwaW5nIHZtLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgVGFibGUgbG9jYWwsIFRhYmxlIGZvcmVpZ24sIENvbHVtbiBjb2wsIE9iamVjdCB0YXJnZXQsIGJvb2xlYW4gaW52ZXJzZSwKKyAgICAgICAgaW50IHBvcywgaW50IGNvbHMpIHsKKyAgICAgICAgYm9vbGVhbiBlbGVtID0gdm0gPT0gdm0uZ2V0RmllbGRNYXBwaW5nKCkuZ2V0RWxlbWVudCgpCisgICAgICAgICAgICAmJiB2bS5nZXRGaWVsZE1hcHBpbmcoKS5nZXRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5NQVA7CisKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhIG5vbi1pbnZlcnNlIGNvbGxlY3Rpb24gZWxlbWVudCBrZXksIGl0IG11c3QgYmUgaW4KKyAgICAgICAgLy8gYSBqb2luIHRhYmxlOiBpZiB3ZSdyZSBub3QgcHJlcGVuZGluZyB0aGUgZmllbGQgbmFtZSwgbGVhdmUgdGhlCisgICAgICAgIC8vIGRlZmF1bHQKKyAgICAgICAgaWYgKCFfcHJlcGVuZEZpZWxkTmFtZVRvSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zICYmICFpbnZlcnNlICYmIGVsZW0pCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGpwYSBhbHdheXMgdXNlcyA8ZmllbGQ+Xzxwa2NvbD4gZm9yIGNvbHVtbiBuYW1lLCBldmVuCisgICAgICAgIC8vIHdoZW4gb25seSBvbmUgY29sCisgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb2x1bW4pIHsKKyAgICAgICAgICAgIGlmIChlbGVtKQorICAgICAgICAgICAgICAgIG5hbWUgPSB2bS5nZXRGaWVsZE1hcHBpbmcoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBjb2wuc2V0TmFtZShuYW1lICsgIl8iICsgKChDb2x1bW4pIHRhcmdldCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29sdW1ucyhWZXJzaW9uIHZlcnMsIFRhYmxlIHRhYmxlLCBDb2x1bW5bXSBjb2xzKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciB2ZXJzaW9uIGZpZWxkIGFuZCB1c2UgaXRzIG5hbWUgYXMgY29sdW1uIG5hbWUKKyAgICAgICAgRmllbGRNYXBwaW5nIGZtID0gdmVycy5nZXRDbGFzc01hcHBpbmcoKS5nZXRWZXJzaW9uRmllbGRNYXBwaW5nKCk7CisgICAgICAgIGlmIChmbSAhPSBudWxsICYmIGNvbHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICBjb2xzWzBdLnNldE5hbWUoZm0uZ2V0TmFtZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VwZXIucG9wdWxhdGVDb2x1bW5zKHZlcnMsIHRhYmxlLCBjb2xzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1BlcnNpc3RlbmNlTWFwcGluZ0ZhY3RvcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvUGVyc2lzdGVuY2VNYXBwaW5nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTM3MTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1BlcnNpc3RlbmNlTWFwcGluZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5YTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5YTUxQZXJzaXN0ZW5jZU1ldGFEYXRhU2VyaWFsaXplcjsKKworLyoqCisgKiB7QGxpbmsgTWV0YURhdGFGYWN0b3J5fSBmb3IgSlBBIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VNYXBwaW5nRmFjdG9yeQorICAgIGV4dGVuZHMgUGVyc2lzdGVuY2VNZXRhRGF0YUZhY3RvcnkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIG5ld0Fubm90YXRpb25QYXJzZXIoKSB7CisgICAgICAgIEFubm90YXRpb25QZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIgcGFyc2VyID0KKyAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyKChKREJDQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICByZXBvcy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICAvLyBzdHJpY3QgbW9kZSBtZWFucyB3ZSdyZSB1c2luZyBhIHNlcGFyYXRlIG1hcHBpbmcgcGFyc2VyLCBzbyBpZgorICAgICAgICAvLyB3ZSdyZSBhZGFwdGluZyBwYXJzZSBtZXRhZGF0YSBoaW50cworICAgICAgICBpZiAoc3RyaWN0KQorICAgICAgICAgICAgcGFyc2VyLnNldE1hcHBpbmdPdmVycmlkZSgoKE1hcHBpbmdSZXBvc2l0b3J5KSByZXBvcykuCisgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3lJbnN0YWxsZXIoKS5pc0FkYXB0aW5nKCkpOworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIG5ld1hNTFBhcnNlcihib29sZWFuIGxvYWRpbmcpIHsKKyAgICAgICAgWE1MUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxQZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIKKyAgICAgICAgICAgICgoSkRCQ0NvbmZpZ3VyYXRpb24pIHJlcG9zLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIC8vIHN0cmljdCBtb2RlIG1lYW5zIHdlJ3JlIHVzaW5nIGEgc2VwYXJhdGUgbWFwcGluZyBwYXJzZXIsIHNvIGlmCisgICAgICAgIC8vIHdlJ3JlIGFkYXB0aW5nIHBhcnNlIG1ldGFkYXRhIGhpbnRzCisgICAgICAgIGlmIChzdHJpY3QgJiYgbG9hZGluZykKKyAgICAgICAgICAgIHBhcnNlci5zZXRNYXBwaW5nT3ZlcnJpZGUoKChNYXBwaW5nUmVwb3NpdG9yeSkgcmVwb3MpLgorICAgICAgICAgICAgICAgIGdldFN0cmF0ZWd5SW5zdGFsbGVyKCkuaXNBZGFwdGluZygpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVNlcmlhbGl6ZXIgbmV3WE1MU2VyaWFsaXplcigpIHsKKyAgICAgICAgWE1MUGVyc2lzdGVuY2VNYXBwaW5nU2VyaWFsaXplciBzZXIgPSAKKyAgICAgICAgICAgIG5ldyBYTUxQZXJzaXN0ZW5jZU1hcHBpbmdTZXJpYWxpemVyKChKREJDQ29uZmlndXJhdGlvbikgCisgICAgICAgICAgICByZXBvcy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICBzZXIuc2V0U3luY01hcHBpbmdJbmZvKHRydWUpOworICAgICAgICByZXR1cm4gc2VyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhlM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9TdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXBwaW5nIHN0cmF0ZWd5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUsIE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFN0cmF0ZWd5IHsKKworICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1N1YmNsYXNzRmV0Y2hNb2RlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1N1YmNsYXNzRmV0Y2hNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkNjg0NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvU3ViY2xhc3NGZXRjaE1vZGUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogRGV0ZXJtaW5lcyBob3cgdG8gZWFnZXItZmV0Y2ggc3ViY2xhc3MgZGF0YS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBTdWJjbGFzc0ZldGNoTW9kZSB7CisKKyAgICBFYWdlckZldGNoVHlwZSB2YWx1ZSgpIGRlZmF1bHQgRWFnZXJGZXRjaFR5cGUuTk9ORTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVW5pcXVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1VuaXF1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDY0ODgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1VuaXF1ZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBVbmlxdWUgY29uc3RyYWludCBkZWZpbml0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZSB7CisKKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgICBib29sZWFuIGRlZmVycmVkKCkgZGVmYXVsdCBmYWxzZTsKKworICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVmVyc2lvbkNvbHVtbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9WZXJzaW9uQ29sdW1uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyODFmOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVmVyc2lvbkNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBTdXJyb2dhdGUgdmVyc2lvbiBjb2x1bW4uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgVFlQRSB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbkNvbHVtbiB7CisKKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworCisgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworCisgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisKKyAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisKKyAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7CisKKyAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgorCisgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1ZlcnNpb25Db2x1bW5zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1ZlcnNpb25Db2x1bW5zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkZTZiZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVmVyc2lvbkNvbHVtbnMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIG11bHRpcGxlIHZlcnNpb24gY29sdW1ucyBmb3IgY29tcGxleCB2ZXJzaW9uaW5nLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb25Db2x1bW5zIHsKKworICAgIFZlcnNpb25Db2x1bW5bXSB2YWx1ZSgpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1ZlcnNpb25TdHJhdGVneS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9WZXJzaW9uU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM3NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9WZXJzaW9uU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVmVyc2lvbiBtYXBwaW5nIHN0cmF0ZWd5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb25TdHJhdGVneSB7CisKKyAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9YSm9pbkNvbHVtbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9YSm9pbkNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGU0MGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hKb2luQ29sdW1uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEV4dGVuZGVkIGpvaW4gY29sdW1uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFhKb2luQ29sdW1uIHsKKworICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKworICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICBTdHJpbmcgcmVmZXJlbmNlZEF0dHJpYnV0ZU5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworCisgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworCisgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworCisgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWEpvaW5Db2x1bW5zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hKb2luQ29sdW1ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDkzODEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hKb2luQ29sdW1ucy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBBbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgbXVsdGlwbGUgY29sdW1ucyBmb3IgY29tcG91bmQgam9pbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgWEpvaW5Db2x1bW5zIHsKKworICAgIFhKb2luQ29sdW1uW10gdmFsdWUoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9YTUxQZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWE1MUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyNWMxNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWE1MUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyLmphdmEKQEAgLTAsMCArMSw5MTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnVtVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZVR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLkNsYXNzTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5EaXNjcmltaW5hdG9yTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5GaWVsZE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlF1ZXJ5UmVzdWx0TWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlNlcXVlbmNlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5FbnVtVmFsdWVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkZsYXRDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLkZ1bGxDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLk5vbmVDbGFzc1N0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzLlZlcnRpY2FsQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5VbmlxdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlhNTFBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLk1hcHBpbmdUYWcuKjsKKworLyoqCisgKiBDdXN0b20gU0FYIHBhcnNlciB1c2VkIGJ5IHRoZSBzeXN0ZW0gdG8gcGFyc2UgcGVyc2lzdGVuY2UgbWFwcGluZyBmaWxlcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgWE1MUGVyc2lzdGVuY2VNYXBwaW5nUGFyc2VyCisgICAgZXh0ZW5kcyBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIE1hcHBpbmdUYWc+IF9lbGVtcyA9CisgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwcGluZ1RhZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIF9lbGVtcy5wdXQoImFzc29jaWF0aW9uLW92ZXJyaWRlIiwgQVNTT0NfT1ZFUlJJREUpOworICAgICAgICBfZWxlbXMucHV0KCJhdHRyaWJ1dGUtb3ZlcnJpZGUiLCBBVFRSX09WRVJSSURFKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiY29sdW1uIiwgQ09MKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiY29sdW1uLW5hbWUiLCBDT0xVTU5fTkFNRSk7CisgICAgICAgIF9lbGVtcy5wdXQoImNvbHVtbi1yZXN1bHQiLCBDT0xVTU5fUkVTVUxUKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiZGlzY3JpbWluYXRvci1jb2x1bW4iLCBESVNDUklNX0NPTCk7CisgICAgICAgIF9lbGVtcy5wdXQoImRpc2NyaW1pbmF0b3ItdmFsdWUiLCBESVNDUklNX1ZBTCk7CisgICAgICAgIF9lbGVtcy5wdXQoImVudGl0eS1yZXN1bHQiLCBFTlRJVFlfUkVTVUxUKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiZW51bWVyYXRlZCIsIEVOVU1FUkFURUQpOworICAgICAgICBfZWxlbXMucHV0KCJmaWVsZC1yZXN1bHQiLCBGSUVMRF9SRVNVTFQpOworICAgICAgICBfZWxlbXMucHV0KCJpbmhlcml0YW5jZSIsIElOSEVSSVRBTkNFKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiam9pbi1jb2x1bW4iLCBKT0lOX0NPTCk7CisgICAgICAgIF9lbGVtcy5wdXQoImludmVyc2Utam9pbi1jb2x1bW4iLCBDT0wpOworICAgICAgICBfZWxlbXMucHV0KCJqb2luLXRhYmxlIiwgSk9JTl9UQUJMRSk7CisgICAgICAgIF9lbGVtcy5wdXQoInByaW1hcnkta2V5LWpvaW4tY29sdW1uIiwgUEtfSk9JTl9DT0wpOworICAgICAgICBfZWxlbXMucHV0KCJzZWNvbmRhcnktdGFibGUiLCBTRUNPTkRBUllfVEFCTEUpOworICAgICAgICBfZWxlbXMucHV0KCJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiwgU1FMX1JFU1VMVF9TRVRfTUFQUElORyk7CisgICAgICAgIF9lbGVtcy5wdXQoInRhYmxlIiwgVEFCTEUpOworICAgICAgICBfZWxlbXMucHV0KCJ0YWJsZS1nZW5lcmF0b3IiLCBUQUJMRV9HRU4pOworICAgICAgICBfZWxlbXMucHV0KCJ0ZW1wb3JhbCIsIFRFTVBPUkFMKTsKKyAgICAgICAgX2VsZW1zLnB1dCgidW5pcXVlLWNvbnN0cmFpbnQiLCBVTklRVUUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFhNTFBlcnNpc3RlbmNlTWFwcGluZ1BhcnNlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIFN0cmluZyBfb3ZlcnJpZGUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9zY2hlbWEgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIF9jb2xUYWJsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3NlY29uZGFyeVRhYmxlID0gbnVsbDsKKyAgICBwcml2YXRlIExpc3Q8Q29sdW1uPiBfY29scyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaXN0PENvbHVtbj4gX2pvaW5Db2xzID0gbnVsbDsKKyAgICBwcml2YXRlIExpc3Q8Q29sdW1uPiBfc3VwSm9pbkNvbHMgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBfbG9iID0gZmFsc2U7CisgICAgcHJpdmF0ZSBUZW1wb3JhbFR5cGUgX3RlbXBvcmFsID0gbnVsbDsKKyAgICBwcml2YXRlIEVudW1TZXQ8VW5pcXVlRmxhZz4gX3VuaXF1ZSA9IEVudW1TZXQubm9uZU9mKFVuaXF1ZUZsYWcuY2xhc3MpOworICAgIHByaXZhdGUgRGlzY3JpbWluYXRvclR5cGUgX2Rpc2NUeXBlOworICAgIHByaXZhdGUgQ29sdW1uIF9kaXNjQ29sOworICAgIHByaXZhdGUgaW50IF9yZXN1bHRJZHggPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBYTUxQZXJzaXN0ZW5jZU1hcHBpbmdQYXJzZXIoSkRCQ0NvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBzdXBlcihjb25mKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgc3VwZXIucmVzZXQoKTsKKyAgICAgICAgY2xlYXJDb2x1bW5JbmZvKCk7CisgICAgICAgIGNsZWFyQ2xhc3NJbmZvKCk7CisgICAgICAgIGNsZWFyU2Vjb25kYXJ5VGFibGVJbmZvKCk7CisgICAgICAgIF9vdmVycmlkZSA9IG51bGw7CisgICAgICAgIF9zY2hlbWEgPSBudWxsOworICAgICAgICBfcmVzdWx0SWR4ID0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0U3lzdGVtTWFwcGluZ0VsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBNYXBwaW5nVGFnIHRhZyA9IF9lbGVtcy5nZXQobmFtZSk7CisgICAgICAgIGlmICh0YWcgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCJzY2hlbWEiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZXQ7CisgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICBjYXNlIFRBQkxFX0dFTjoKKyAgICAgICAgICAgICAgICByZXQgPSBzdGFydFRhYmxlR2VuZXJhdG9yKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMX1JFU1VMVF9TRVRfTUFQUElORzoKKyAgICAgICAgICAgICAgICByZXQgPSBzdGFydFNRTFJlc3VsdFNldE1hcHBpbmcoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTlRJVFlfUkVTVUxUOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0RW50aXR5UmVzdWx0KGF0dHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRklFTERfUkVTVUxUOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0RmllbGRSZXN1bHQoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT0xVTU5fUkVTVUxUOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0Q29sdW1uUmVzdWx0KGF0dHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXQpID8gdGFnIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRTeXN0ZW1NYXBwaW5nRWxlbWVudChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcHBpbmdUYWcgdGFnID0gX2VsZW1zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoInNjaGVtYSIuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIF9zY2hlbWEgPSBjdXJyZW50VGV4dCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgIGNhc2UgU1FMX1JFU1VMVF9TRVRfTUFQUElORzoKKyAgICAgICAgICAgICAgICBlbmRTUUxSZXN1bHRTZXRNYXBwaW5nKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVOVElUWV9SRVNVTFQ6CisgICAgICAgICAgICAgICAgZW5kRW50aXR5UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0Q2xhc3NNYXBwaW5nRWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcHBpbmdUYWcgdGFnID0gX2VsZW1zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYm9vbGVhbiByZXQ7CisgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICBjYXNlIFRBQkxFOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0VGFibGUoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRUNPTkRBUllfVEFCTEU6CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRTZWNvbmRhcnlUYWJsZShhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0NSSU1fQ09MOgorICAgICAgICAgICAgICAgIF9kaXNjQ29sID0gcGFyc2VDb2x1bW4oYXR0cnMpOworICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0NSSU1fVkFMOgorICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOSEVSSVRBTkNFOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0SW5oZXJpdGFuY2UoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBU1NPQ19PVkVSUklERToKKyAgICAgICAgICAgIGNhc2UgQVRUUl9PVkVSUklERToKKyAgICAgICAgICAgICAgICByZXQgPSBzdGFydEF0dHJpYnV0ZU92ZXJyaWRlKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEtfSk9JTl9DT0w6CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRQcmltYXJ5S2V5Sm9pbkNvbHVtbihhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTDoKKyAgICAgICAgICAgICAgICByZXQgPSBzdGFydENvbHVtbihhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpPSU5fQ09MOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0Sm9pbkNvbHVtbihhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpPSU5fVEFCTEU6CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRKb2luVGFibGUoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUQUJMRV9HRU46CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRUYWJsZUdlbmVyYXRvcihhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVOSVFVRToKKyAgICAgICAgICAgICAgICByZXQgPSBzdGFydFVuaXF1ZUNvbnN0cmFpbnQoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURU1QT1JBTDoKKyAgICAgICAgICAgIGNhc2UgRU5VTUVSQVRFRDoKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HOgorICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0U1FMUmVzdWx0U2V0TWFwcGluZyhhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVOVElUWV9SRVNVTFQ6CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRFbnRpdHlSZXN1bHQoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGSUVMRF9SRVNVTFQ6CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRGaWVsZFJlc3VsdChhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTFVNTl9SRVNVTFQ6CisgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRDb2x1bW5SZXN1bHQoYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT0xVTU5fTkFNRToKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJldCkgPyB0YWcgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZENsYXNzTWFwcGluZ0VsZW1lbnQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBNYXBwaW5nVGFnIHRhZyA9IF9lbGVtcy5nZXQobmFtZSk7CisgICAgICAgIGlmICh0YWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBTRUNPTkRBUllfVEFCTEU6CisgICAgICAgICAgICAgICAgZW5kU2Vjb25kYXJ5VGFibGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQ1JJTV9WQUw6CisgICAgICAgICAgICAgICAgZW5kRGlzY3JpbWluYXRvclZhbHVlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFUVFJfT1ZFUlJJREU6CisgICAgICAgICAgICAgICAgZW5kQXR0cmlidXRlT3ZlcnJpZGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSk9JTl9UQUJMRToKKyAgICAgICAgICAgICAgICBlbmRKb2luVGFibGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVEVNUE9SQUw6CisgICAgICAgICAgICAgICAgZW5kVGVtcG9yYWwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRU5VTUVSQVRFRDoKKyAgICAgICAgICAgICAgICBlbmRFbnVtZXJhdGVkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNRTF9SRVNVTFRfU0VUX01BUFBJTkc6CisgICAgICAgICAgICAgICAgZW5kU1FMUmVzdWx0U2V0TWFwcGluZygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTlRJVFlfUkVTVUxUOgorICAgICAgICAgICAgICAgIGVuZEVudGl0eVJlc3VsdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVTklRVUU6CisgICAgICAgICAgICAgICAgZW5kVW5pcXVlQ29uc3RyYWludCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT0xVTU5fTkFNRToKKyAgICAgICAgICAgICAgICBlbmRDb2x1bW5OYW1lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydENsYXNzTWFwcGluZyhDbGFzc01ldGFEYXRhIG1ldGEsIGJvb2xlYW4gbWFwcGVkU3VwZXIsCisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAobWFwcGVkU3VwZXIpCisgICAgICAgICAgICAoKENsYXNzTWFwcGluZykgbWV0YSkuZ2V0TWFwcGluZ0luZm8oKS5zZXRTdHJhdGVneQorICAgICAgICAgICAgICAgIChOb25lQ2xhc3NTdHJhdGVneS5BTElBUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kQ2xhc3NNYXBwaW5nKENsYXNzTWV0YURhdGEgbWV0YSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbSA9IChDbGFzc01hcHBpbmcpIG1ldGE7CisgICAgICAgIGlmIChfc2NoZW1hICE9IG51bGwpCisgICAgICAgICAgICBjbS5nZXRNYXBwaW5nSW5mbygpLnNldFNjaGVtYU5hbWUoX3NjaGVtYSk7CisKKyAgICAgICAgaWYgKF9zdXBKb2luQ29scyAhPSBudWxsKQorICAgICAgICAgICAgY20uZ2V0TWFwcGluZ0luZm8oKS5zZXRDb2x1bW5zKF9zdXBKb2luQ29scyk7CisKKyAgICAgICAgaWYgKF9kaXNjQ29sICE9IG51bGwpIHsKKyAgICAgICAgICAgIERpc2NyaW1pbmF0b3JNYXBwaW5nSW5mbyBkaW5mbyA9IGNtLmdldERpc2NyaW1pbmF0b3IoKS4KKyAgICAgICAgICAgICAgICBnZXRNYXBwaW5nSW5mbygpOworICAgICAgICAgICAgaWYgKF9kaXNjVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfZGlzY1R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgICAgICAgICAgICAgX2Rpc2NDb2wuc2V0SmF2YVR5cGUoSmF2YVR5cGVzLkNIQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kaXNjQ29sLnNldEphdmFUeXBlKEphdmFUeXBlcy5JTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBfZGlzY0NvbC5zZXRKYXZhVHlwZShKYXZhVHlwZXMuU1RSSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpbmZvLnNldENvbHVtbnMoQXJyYXlzLmFzTGlzdChuZXcgQ29sdW1uW117IF9kaXNjQ29sIH0pKTsKKyAgICAgICAgfQorICAgICAgICBjbGVhckNsYXNzSW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGNhY2hlZCBjbGFzcyBtYXBwaW5nIGluZm8uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyQ2xhc3NJbmZvKCkgeworICAgICAgICBfc3VwSm9pbkNvbHMgPSBudWxsOworICAgICAgICBfZGlzY0NvbCA9IG51bGw7CisgICAgICAgIF9kaXNjVHlwZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdHJhY2tpbmcgc2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIGFuZCBjb2x1bW5zCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2Vjb25kYXJ5VGFibGUoQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIF9zZWNvbmRhcnlUYWJsZSA9IHRvVGFibGVOYW1lKGF0dHJzLmdldFZhbHVlKCJzY2hlbWEiKSwKKyAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKCJuYW1lIikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSBvd25pbmcgY2xhc3MgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kU2Vjb25kYXJ5VGFibGUoKSB7CisgICAgICAgIENsYXNzTWFwcGluZyBjbSA9IChDbGFzc01hcHBpbmcpIGN1cnJlbnRFbGVtZW50KCk7CisgICAgICAgIENsYXNzTWFwcGluZ0luZm8gaW5mbyA9IGNtLmdldE1hcHBpbmdJbmZvKCk7CisgICAgICAgIGluZm8uc2V0U2Vjb25kYXJ5VGFibGVKb2luQ29sdW1ucyhfc2Vjb25kYXJ5VGFibGUsIF9qb2luQ29scyk7CisgICAgICAgIGNsZWFyU2Vjb25kYXJ5VGFibGVJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgY2FjaGVkIHNlY29uZGFyeSB0YWJsZSBpbmZvLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhclNlY29uZGFyeVRhYmxlSW5mbygpIHsKKyAgICAgICAgX2pvaW5Db2xzID0gbnVsbDsKKyAgICAgICAgX3NlY29uZGFyeVRhYmxlID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0YWJsZS1nZW5lcmF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0VGFibGVHZW5lcmF0b3IoQXR0cmlidXRlcyBhdHRycykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIExvZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJwYXJzZS1nZW4iLCBuYW1lKSk7CisgICAgICAgIGlmIChnZXRSZXBvc2l0b3J5KCkuZ2V0Q2FjaGVkU2VxdWVuY2VNZXRhRGF0YShuYW1lKSAhPSBudWxsCisgICAgICAgICAgICAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoIm92ZXJyaWRlLWdlbiIsIG5hbWUpKTsKKworICAgICAgICBTZXF1ZW5jZU1hcHBpbmcgc2VxID0gKFNlcXVlbmNlTWFwcGluZykgZ2V0UmVwb3NpdG9yeSgpLgorICAgICAgICAgICAgYWRkU2VxdWVuY2VNZXRhRGF0YShuYW1lKTsKKyAgICAgICAgc2VxLnNldFNlcXVlbmNlUGx1Z2luKFNlcXVlbmNlTWFwcGluZy5JTVBMX1ZBTFVFX1RBQkxFKTsKKyAgICAgICAgc2VxLnNldFRhYmxlKHRvVGFibGVOYW1lKGF0dHJzLmdldFZhbHVlKCJzY2hlbWEiKSwKKyAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKCJ0YWJsZSIpKSk7CisgICAgICAgIHNlcS5zZXRQcmltYXJ5S2V5Q29sdW1uKGF0dHJzLmdldFZhbHVlKCJway1jb2x1bW4tbmFtZSIpKTsKKyAgICAgICAgc2VxLnNldFNlcXVlbmNlQ29sdW1uKGF0dHJzLmdldFZhbHVlKCJ2YWx1ZS1jb2x1bW4tbmFtZSIpKTsKKyAgICAgICAgc2VxLnNldFByaW1hcnlLZXlWYWx1ZShhdHRycy5nZXRWYWx1ZSgicGstY29sdW1uLXZhbHVlIikpOworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImluaXRpYWwtdmFsdWUiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgc2VxLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnBhcnNlSW50KHZhbCkpOworICAgICAgICB2YWwgPSBhdHRycy5nZXRWYWx1ZSgiYWxsb2NhdGlvbi1zaXplIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHNlcS5zZXRBbGxvY2F0ZShJbnRlZ2VyLnBhcnNlSW50KHZhbCkpOworCisgICAgICAgIE9iamVjdCBjdXIgPSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBPYmplY3Qgc2NvcGUgPSAoY3VyIGluc3RhbmNlb2YgQ2xhc3NNZXRhRGF0YSkKKyAgICAgICAgICAgID8gKChDbGFzc01ldGFEYXRhKSBjdXIpLmdldERlc2NyaWJlZFR5cGUoKSA6IG51bGw7CisgICAgICAgIHNlcS5zZXRTb3VyY2UoZ2V0U291cmNlRmlsZSgpLCBzY29wZSwgc2VxLlNSQ19YTUwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBpbmhlcml0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRJbmhlcml0YW5jZShBdHRyaWJ1dGVzIGF0dHJzKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgic3RyYXRlZ3kiKTsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNtID0gKENsYXNzTWFwcGluZykgY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgQ2xhc3NNYXBwaW5nSW5mbyBpbmZvID0gY20uZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgc3dpdGNoIChFbnVtLnZhbHVlT2YoSW5oZXJpdGFuY2VUeXBlLmNsYXNzLCB2YWwpKSB7CisgICAgICAgICAgICBjYXNlIFNJTkdMRV9UQUJMRToKKyAgICAgICAgICAgICAgICBpbmZvLnNldEhpZXJhcmNoeVN0cmF0ZWd5KEZsYXRDbGFzc1N0cmF0ZWd5LkFMSUFTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSk9JTkVEOgorICAgICAgICAgICAgICAgIGluZm8uc2V0SGllcmFyY2h5U3RyYXRlZ3koVmVydGljYWxDbGFzc1N0cmF0ZWd5LkFMSUFTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVEFCTEVfUEVSX0NMQVNTOgorICAgICAgICAgICAgICAgIGluZm8uc2V0SGllcmFyY2h5U3RyYXRlZ3koRnVsbENsYXNzU3RyYXRlZ3kuQUxJQVMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGRpc2NyaW1pbmF0b3ItdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGN1cnJlbnRUZXh0KCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNtID0gKENsYXNzTWFwcGluZykgY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgY20uZ2V0RGlzY3JpbWluYXRvcigpLmdldE1hcHBpbmdJbmZvKCkuc2V0VmFsdWUodmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0ZW1wb3JhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kVGVtcG9yYWwoKSB7CisgICAgICAgIFN0cmluZyB0ZW1wID0gY3VycmVudFRleHQoKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KHRlbXApKQorICAgICAgICAgICAgX3RlbXBvcmFsID0gRW51bS52YWx1ZU9mKFRlbXBvcmFsVHlwZS5jbGFzcywgdGVtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZW51bWVyYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kRW51bWVyYXRlZCgpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBjdXJyZW50VGV4dCgpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh0ZXh0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRW51bVR5cGUgdHlwZSA9IEVudW0udmFsdWVPZihFbnVtVHlwZS5jbGFzcywgdGV4dCk7CisKKyAgICAgICAgRmllbGRNYXBwaW5nIGZtID0gKEZpZWxkTWFwcGluZykgY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgU3RyaW5nIHN0cmF0ID0gRW51bVZhbHVlSGFuZGxlci5jbGFzcy5nZXROYW1lKCkgKyAiKFN0b3JlT3JkaW5hbD0iCisgICAgICAgICAgICArIFN0cmluZy52YWx1ZU9mKHR5cGUgPT0gRW51bVR5cGUuT1JESU5BTCkgKyAiKSI7CisgICAgICAgIGZtLmdldFZhbHVlSW5mbygpLnNldFN0cmF0ZWd5KHN0cmF0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydExvYihBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN1cGVyLnN0YXJ0TG9iKGF0dHJzKSkgeworICAgICAgICAgICAgX2xvYiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW5kIHRvIGNsZWFyIGFubm90YXRpb24gbWFwcGluZyBpbmZvLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0RmllbGRNYXBwaW5nKEZpZWxkTWV0YURhdGEgZmllbGQsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydEZpZWxkTWFwcGluZyhmaWVsZCwgYXR0cnMpOworICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvblBhcnNlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkTWFwcGluZyBmbSA9IChGaWVsZE1hcHBpbmcpIGZpZWxkOworICAgICAgICAgICAgZm0uZ2V0TWFwcGluZ0luZm8oKS5jbGVhcigpOworICAgICAgICAgICAgZm0uZ2V0VmFsdWVJbmZvKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIGZtLmdldEtleU1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW5kIHRvIHNldCB0aGUgY29sdW1ucy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRGaWVsZE1hcHBpbmcoRmllbGRNZXRhRGF0YSBmaWVsZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldHVwIGNvbHVtbnMgd2l0aCBjYWNoZWQgbG9iIGFuZCB0ZW1wb3JhbCBpbmZvCisgICAgICAgIEZpZWxkTWFwcGluZyBmbSA9IChGaWVsZE1hcHBpbmcpIGZpZWxkOworICAgICAgICBpZiAoX2xvYiB8fCBfdGVtcG9yYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9jb2xzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfY29scyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uPigxKTsKKyAgICAgICAgICAgICAgICBfY29scy5hZGQobmV3IENvbHVtbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ29sdW1uIGNvbCA6IF9jb2xzKSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2IgJiYgKGZtLmdldERlY2xhcmVkVHlwZUNvZGUoKSA9PSBKYXZhVHlwZXMuU1RSSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IGZtLmdldERlY2xhcmVkVHlwZSgpID09IGNoYXJbXS5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBmbS5nZXREZWNsYXJlZFR5cGUoKSA9PSBDaGFyYWN0ZXJbXS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29sLnNldFNpemUoLTEpOworICAgICAgICAgICAgICAgICAgICBjb2wuc2V0VHlwZShUeXBlcy5DTE9CKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9sb2IpCisgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRUeXBlKFR5cGVzLkJMT0IpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF90ZW1wb3JhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRUeXBlKFR5cGVzLkRBVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUSU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRUeXBlKFR5cGVzLlRJTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUSU1FU1RBTVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnNldFR5cGUoVHlwZXMuVElNRVNUQU1QKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChfY29scyAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGZtLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBpZiAoZm0uZ2V0RGVjbGFyZWRUeXBlKCkgPT0gYnl0ZVtdLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBmbS5nZXREZWNsYXJlZFR5cGUoKSA9PSBjaGFyW10uY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtLmdldERlY2xhcmVkVHlwZSgpID09IENoYXJhY3RlcltdLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbS5nZXRWYWx1ZUluZm8oKS5zZXRDb2x1bW5zKF9jb2xzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugbm8gYnJlYWsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgZm0uZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKS5zZXRDb2x1bW5zKF9jb2xzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZm0uZ2V0VmFsdWVJbmZvKCkuc2V0Q29sdW1ucyhfY29scyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2NvbFRhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm0uZ2V0TWFwcGluZ0luZm8oKS5zZXRUYWJsZU5hbWUoX2NvbFRhYmxlKTsKKyAgICAgICAgICAgIHNldFVuaXF1ZShmbSk7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXJDb2x1bW5JbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVuaXF1ZSBmb3IgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFVuaXF1ZShGaWVsZE1hcHBpbmcgZm0pIHsKKyAgICAgICAgaWYgKF91bmlxdWUuc2l6ZSgpID09IDIpIC8vIGkuZS4gVFJVRSAmIEZBTFNFCisgICAgICAgICAgICBnZXRMb2coKS53YXJuKF9sb2MuZ2V0KCJpbmNvbnNpc3QtY29sLWF0dHJzIiwgZm0pKTsKKyAgICAgICAgZWxzZSBpZiAoX3VuaXF1ZS5jb250YWlucyhVbmlxdWVGbGFnLlRSVUUpKQorICAgICAgICAgICAgZm0uZ2V0VmFsdWVJbmZvKCkuc2V0VW5pcXVlKG5ldyBVbmlxdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgZmllbGQgbGV2ZWwgY29sdW1uIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhckNvbHVtbkluZm8oKSB7CisgICAgICAgIF9jb2xzID0gbnVsbDsKKyAgICAgICAgX2pvaW5Db2xzID0gbnVsbDsKKyAgICAgICAgX2NvbFRhYmxlID0gbnVsbDsKKyAgICAgICAgX2xvYiA9IGZhbHNlOworICAgICAgICBfdGVtcG9yYWwgPSBudWxsOworICAgICAgICBfdW5pcXVlLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYXR0cmlidXRlLW92ZXJyaWRlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydEF0dHJpYnV0ZU92ZXJyaWRlKEF0dHJpYnV0ZXMgYXR0cikgeworICAgICAgICBfb3ZlcnJpZGUgPSBhdHRyLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhdHRyaWJ1dGUgb3ZlcnJpZGUgaW50byBwcm9wZXIgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kQXR0cmlidXRlT3ZlcnJpZGUoKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IGVsZW0gPSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBGaWVsZE1hcHBpbmcgZm07CisgICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgQ2xhc3NNYXBwaW5nKQorICAgICAgICAgICAgZm0gPSBnZXRBdHRyaWJ1dGVPdmVycmlkZSgoQ2xhc3NNYXBwaW5nKSBlbGVtKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm0gPSBnZXRBdHRyaWJ1dGVPdmVycmlkZSgoRmllbGRNYXBwaW5nKSBlbGVtKTsKKyAgICAgICAgaWYgKF9jb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZtLmdldFZhbHVlSW5mbygpLnNldENvbHVtbnMoX2NvbHMpOworICAgICAgICAgICAgaWYgKF9jb2xUYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZtLmdldE1hcHBpbmdJbmZvKCkuc2V0VGFibGVOYW1lKF9jb2xUYWJsZSk7CisgICAgICAgICAgICBzZXRVbmlxdWUoZm0pOworICAgICAgICB9CisgICAgICAgIGNsZWFyQ29sdW1uSW5mbygpOworICAgICAgICBfb3ZlcnJpZGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvcGVyIG92ZXJyaWRlLgorICAgICAqLworICAgIHByaXZhdGUgRmllbGRNYXBwaW5nIGdldEF0dHJpYnV0ZU92ZXJyaWRlKENsYXNzTWFwcGluZyBjbSkgeworICAgICAgICBGaWVsZE1hcHBpbmcgc3VwID0gKEZpZWxkTWFwcGluZykgY20uZ2V0RGVmaW5lZFN1cGVyY2xhc3NGaWVsZAorICAgICAgICAgICAgKF9vdmVycmlkZSk7CisgICAgICAgIGlmIChzdXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHN1cCA9IChGaWVsZE1hcHBpbmcpIGNtLmFkZERlZmluZWRTdXBlcmNsYXNzRmllbGQoX292ZXJyaWRlLAorICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHN1cDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlciBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpZWxkTWFwcGluZyBnZXRBdHRyaWJ1dGVPdmVycmlkZShGaWVsZE1hcHBpbmcgZm0pCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBDbGFzc01hcHBpbmcgZW1iZWQgPSBmbS5nZXRFbWJlZGRlZE1hcHBpbmcoKTsKKyAgICAgICAgaWYgKGVtYmVkID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBnZXRFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1lbWJlZGRlZCIsIGZtKSk7CisKKyAgICAgICAgRmllbGRNYXBwaW5nIGVmbSA9IGVtYmVkLmdldEZpZWxkTWFwcGluZyhfb3ZlcnJpZGUpOworICAgICAgICBpZiAoZWZtID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBnZXRFeGNlcHRpb24oX2xvYy5nZXQoImVtYmVkLW92ZXJyaWRlLW5hbWUiLAorICAgICAgICAgICAgICAgIGZtLCBfb3ZlcnJpZGUpKTsKKyAgICAgICAgcmV0dXJuIGVmbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRUYWJsZShBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gdG9UYWJsZU5hbWUoYXR0cnMuZ2V0VmFsdWUoInNjaGVtYSIpLAorICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKSk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgKChDbGFzc01hcHBpbmcpIGN1cnJlbnRFbGVtZW50KCkpLmdldE1hcHBpbmdJbmZvKCkuc2V0VGFibGVOYW1lCisgICAgICAgICAgICAgICAgKHRhYmxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2Ugam9pbi10YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRKb2luVGFibGUoQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IHRvVGFibGVOYW1lKGF0dHJzLmdldFZhbHVlKCJzY2hlbWEiKSwKKyAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKCJuYW1lIikpOworICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgICgoRmllbGRNYXBwaW5nKSBjdXJyZW50RWxlbWVudCgpKS5nZXRNYXBwaW5nSW5mbygpLnNldFRhYmxlTmFtZQorICAgICAgICAgICAgICAgICh0YWJsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgam9pbiB0YWJsZSBpbmZvcm1hdGlvbiBiYWNrLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmRKb2luVGFibGUoKSB7CisgICAgICAgIEZpZWxkTWFwcGluZyBmbSA9IChGaWVsZE1hcHBpbmcpIGN1cnJlbnRFbGVtZW50KCk7CisgICAgICAgIGlmIChfam9pbkNvbHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZtLmdldE1hcHBpbmdJbmZvKCkuc2V0Q29sdW1ucyhfam9pbkNvbHMpOworICAgICAgICBpZiAoX2NvbHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZtLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCkuc2V0Q29sdW1ucyhfY29scyk7CisgICAgICAgIGNsZWFyQ29sdW1uSW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHByaW1hcnkta2V5LWpvaW4tY29sdW1uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydFByaW1hcnlLZXlKb2luQ29sdW1uKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBDb2x1bW4gY29sID0gcGFyc2VDb2x1bW4oYXR0cnMpOworICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19QS19KT0lOLCB0cnVlKTsKKyAgICAgICAgLy8gcGsgam9pbiBjb2x1bW5zIG9uIGZpZWxkcyBhY3QgYXMgZmllbGQgY29scworICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQoKSBpbnN0YW5jZW9mIEZpZWxkTWFwcGluZykgeworICAgICAgICAgICAgaWYgKF9jb2xzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2NvbHMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbj4oMyk7CisgICAgICAgICAgICBfY29scy5hZGQoY29sKTsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFyZW50KCkgPT0gU0VDT05EQVJZX1RBQkxFKSB7CisgICAgICAgICAgICAvLyBwayBqb2luIGNvbHVtbnMgaW4gc2Vjb25kYXJ5IHRhYmxlIGFjdHMgYXMgam9pbiBjb2xzCisgICAgICAgICAgICBpZiAoX2pvaW5Db2xzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2pvaW5Db2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KDMpOworICAgICAgICAgICAgX2pvaW5Db2xzLmFkZChjb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbXVzdCBiZSBwayBqb2luIGNvbHMgZnJvbSB0aGlzIGNsYXNzIHRvIHN1cGVyY2xhc3MKKyAgICAgICAgICAgIGlmIChfc3VwSm9pbkNvbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3VwSm9pbkNvbHMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbj4oMyk7CisgICAgICAgICAgICBfc3VwSm9pbkNvbHMuYWRkKGNvbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2Ugam9pbi1jb2x1bW4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0Sm9pbkNvbHVtbihBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gb25seSBqb2luIGNvbHMgaW4gYSBqb2luIHRhYmxlIGpvaW4gZmllbGQgdGFibGUgdG8gY2xhc3MgdGFibGU7CisgICAgICAgIC8vIG90aGVycyBhY3QgYXMgZGF0YSBmayBjb2xzCisgICAgICAgIGlmIChjdXJyZW50UGFyZW50KCkgIT0gSk9JTl9UQUJMRSkKKyAgICAgICAgICAgIHJldHVybiBzdGFydENvbHVtbihhdHRycyk7CisKKyAgICAgICAgaWYgKF9qb2luQ29scyA9PSBudWxsKQorICAgICAgICAgICAgX2pvaW5Db2xzID0gbmV3IEFycmF5TGlzdDxDb2x1bW4+KDMpOworICAgICAgICBfam9pbkNvbHMuYWRkKHBhcnNlQ29sdW1uKGF0dHJzKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRDb2x1bW4oQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfY29scyA9PSBudWxsKQorICAgICAgICAgICAgX2NvbHMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbj4oMyk7CisgICAgICAgIF9jb2xzLmFkZChwYXJzZUNvbHVtbihhdHRycykpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbHVtbiBwYXJzZUNvbHVtbihBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sdW1uIGNvbCA9IG5ldyBDb2x1bW4oKTsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbC5zZXROYW1lKHZhbCk7CisgICAgICAgIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbC5zZXRUYXJnZXQodmFsKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImNvbHVtbi1kZWZpbml0aW9uIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbC5zZXRUeXBlTmFtZSh2YWwpOworICAgICAgICB2YWwgPSBhdHRycy5nZXRWYWx1ZSgicHJlY2lzaW9uIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbC5zZXRTaXplKEludGVnZXIucGFyc2VJbnQodmFsKSk7CisgICAgICAgIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJsZW5ndGgiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgY29sLnNldFNpemUoSW50ZWdlci5wYXJzZUludCh2YWwpKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInNjYWxlIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGNvbC5zZXREZWNpbWFsRGlnaXRzKEludGVnZXIucGFyc2VJbnQodmFsKSk7CisgICAgICAgIHZhbCA9IGF0dHJzLmdldFZhbHVlKCJudWxsYWJsZSIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBjb2wuc2V0Tm90TnVsbCgiZmFsc2UiLmVxdWFscyh2YWwpKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImluc2VydGFibGUiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgY29sLnNldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFLCAiZmFsc2UiLmVxdWFscyh2YWwpKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInVwZGF0YWJsZSIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBjb2wuc2V0RmxhZyhDb2x1bW4uRkxBR19VTlVQREFUQUJMRSwgImZhbHNlIi5lcXVhbHModmFsKSk7CisKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInVuaXF1ZSIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBfdW5pcXVlLmFkZChFbnVtLnZhbHVlT2YoVW5pcXVlRmxhZy5jbGFzcywgdmFsLnRvVXBwZXJDYXNlKCkpKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInRhYmxlIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9jb2xUYWJsZSAhPSBudWxsICYmICFfY29sVGFibGUuZXF1YWxzKHZhbCkpCisgICAgICAgICAgICAgICAgdGhyb3cgZ2V0RXhjZXB0aW9uKF9sb2MuZ2V0KCJzZWNvbmQtaW5jb25zaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQoKSkpOworICAgICAgICAgICAgX2NvbFRhYmxlID0gdmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdGFibGUgbmFtZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9UYWJsZU5hbWUoU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhYmxlKSB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHRhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShzY2hlbWEpKQorICAgICAgICAgICAgc2NoZW1hID0gX3NjaGVtYTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdVdGlscy5pc0VtcHR5KHNjaGVtYSkpID8gdGFibGUgOiBzY2hlbWEgKyAiLiIgKyB0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBwcm9jZXNzaW5nIDxjb2RlPnNxbC1yZXN1bHQtc2V0LW1hcHBpbmc8L2NvZGU+IG5vZGUuCisgICAgICogUHVzaGVzIHRoZSB7QGxpbmsgUXVlcnlSZXN1bHRNYXBwaW5nfSBvbnRvIHRoZSBzdGFjayBhcyBjdXJyZW50IGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U1FMUmVzdWx0U2V0TWFwcGluZyhBdHRyaWJ1dGVzIGF0dHJzKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgTG9nIGxvZyA9IGdldExvZygpOworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInBhcnNlLXNxbHJzbWFwcGluZyIsIG5hbWUpKTsKKworICAgICAgICBNYXBwaW5nUmVwb3NpdG9yeSByZXBvcyA9IChNYXBwaW5nUmVwb3NpdG9yeSkgZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICBRdWVyeVJlc3VsdE1hcHBpbmcgcmVzdWx0ID0gcmVwb3MuZ2V0Q2FjaGVkUXVlcnlSZXN1bHRNYXBwaW5nCisgICAgICAgICAgICAobnVsbCwgbmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoIm92ZXJyaWRlLXNxbHJzbWFwcGluZyIsIG5hbWUsCisgICAgICAgICAgICAgICAgY3VycmVudExvY2F0aW9uKCkpKTsKKworICAgICAgICByZXN1bHQgPSByZXBvcy5hZGRRdWVyeVJlc3VsdE1hcHBpbmcobnVsbCwgbmFtZSk7CisgICAgICAgIHJlc3VsdC5zZXRMaXN0aW5nSW5kZXgoX3Jlc3VsdElkeCsrKTsKKyAgICAgICAgYWRkQ29tbWVudHMocmVzdWx0KTsKKworICAgICAgICBPYmplY3QgY3VyID0gY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgT2JqZWN0IHNjb3BlID0gKGN1ciBpbnN0YW5jZW9mIENsYXNzTWV0YURhdGEpCisgICAgICAgICAgICA/ICgoQ2xhc3NNZXRhRGF0YSkgY3VyKS5nZXREZXNjcmliZWRUeXBlKCkgOiBudWxsOworICAgICAgICByZXN1bHQuc2V0U291cmNlKGdldFNvdXJjZUZpbGUoKSwgc2NvcGUsIHJlc3VsdC5TUkNfWE1MKTsKKworICAgICAgICBwdXNoRWxlbWVudChyZXN1bHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kU1FMUmVzdWx0U2V0TWFwcGluZygpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBwb3BFbGVtZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgcHJvY2Vzc2luZyA8Y29kZT5lbnRpdHktcmVzdWx0PC9jb2RlPiBub2RlLgorICAgICAqIFB1c2hlcyB0aGUge0BsaW5rIFF1ZXJ5UmVzdWx0TWFwcGluZy5QQ1Jlc3VsdH0KKyAgICAgKiBvbnRvIHRoZSBzdGFjayBhcyBjdXJyZW50IGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0RW50aXR5UmVzdWx0KEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IGNsYXNzRm9yTmFtZShhdHRycy5nZXRWYWx1ZSgiZW50aXR5LWNsYXNzIikpOworICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvciA9IGF0dHJzLmdldFZhbHVlKCJkaXNjcmltaW5hdG9yLWNvbHVtbiIpOworCisgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZyBwYXJlbnQgPSAoUXVlcnlSZXN1bHRNYXBwaW5nKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBRdWVyeVJlc3VsdE1hcHBpbmcuUENSZXN1bHQgcmVzdWx0ID0gcGFyZW50LmFkZFBDUmVzdWx0KGVudGl0eUNsYXNzKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGRpc2NyaW1pbmF0b3IpKQorICAgICAgICAgICAgcmVzdWx0LmFkZE1hcHBpbmcocmVzdWx0LkRJU0NSSU1JTkFUT1IsIGRpc2NyaW1pbmF0b3IpOworICAgICAgICBwdXNoRWxlbWVudChyZXN1bHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kRW50aXR5UmVzdWx0KCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHBvcEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgPGNvZGU+ZmllbGQtcmVzdWx0PC9jb2RlPiBub2RlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydEZpZWxkUmVzdWx0KEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgU3RyaW5nIGNvbHVtbk5hbWUgPSBhdHRycy5nZXRWYWx1ZSgiY29sdW1uIik7CisKKyAgICAgICAgUXVlcnlSZXN1bHRNYXBwaW5nLlBDUmVzdWx0IHBhcmVudCA9IChRdWVyeVJlc3VsdE1hcHBpbmcuUENSZXN1bHQpCisgICAgICAgICAgICBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBwYXJlbnQuYWRkTWFwcGluZyhmaWVsZE5hbWUsIGNvbHVtbk5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgPGNvZGU+Y29sdW1uLXJlc3VsdDwvY29kZT4gbm9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRDb2x1bW5SZXN1bHQoQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZyBwYXJlbnQgPSAoUXVlcnlSZXN1bHRNYXBwaW5nKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBwYXJlbnQuYWRkQ29sdW1uUmVzdWx0KGF0dHJzLmdldFZhbHVlKCJuYW1lIikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogU3RhcnRzIHByb2Nlc3NpbmcgJmx0O3VuaXF1ZS1jb25zdHJhaW50Jmd0OyBwcm92aWRlZCB0aGUgdGFnIG9jY3VycworICAgICAqIHdpdGhpbiBhIENsYXNzTWFwcGluZyBlbGVtZW50IGFuZCA8ZW0+bm90PC9lbT4gd2l0aGluIGEgc2Vjb25kYXJ5CisgICAgICogdGFibGUuIAorICAgICAqIFB1c2hlcyB0aGUgVW5pcXVlIGVsZW1lbnQgaW4gdGhlIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydFVuaXF1ZUNvbnN0cmFpbnQoQXR0cmlidXRlcyBhdHRycykgCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBPYmplY3QgY3VycmVudCA9IGN1cnJlbnRFbGVtZW50KCk7CisgICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgQ2xhc3NNYXBwaW5nICYmIF9zZWNvbmRhcnlUYWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBVbmlxdWUgdW5pcXVlID0gbmV3IFVuaXF1ZSgpOworICAgICAgICAgICAgcHVzaEVsZW1lbnQodW5pcXVlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVuZHMgcHJvY2Vzc2luZyAmbHQ7dW5pcXVlLWNvbnN0cmFpbnQmZ3Q7IHByb3ZpZGVkIHRoZSB0YWcgb2NjdXJzCisgICAgICogd2l0aGluIGEgQ2xhc3NNYXBwaW5nIGVsZW1lbnQgYW5kIDxlbT5ub3Q8L2VtPiB3aXRoaW4gYSBzZWNvbmRhcnkKKyAgICAgKiB0YWJsZS4gVGhlIHN0YWNrIGlzIHBvcHBlZCBhbmQgdGhlIFVuaXF1ZSBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZQorICAgICAqIENsYXNzTWFwcGluZ0luZm8uIAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmRVbmlxdWVDb25zdHJhaW50KCkgeworICAgICAgICBVbmlxdWUgdW5pcXVlID0gKFVuaXF1ZSlwb3BFbGVtZW50KCk7CisgICAgICAgIE9iamVjdCBjdXJyZW50ID0gY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBDbGFzc01hcHBpbmcgJiYgX3NlY29uZGFyeVRhYmxlID09IG51bGwpCisgICAgICAgICAgICAoKENsYXNzTWFwcGluZyljdXJyZW50KS5nZXRNYXBwaW5nSW5mbygpLmFkZFVuaXF1ZSh1bmlxdWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFbmRzIHByb2Nlc3NpbmcgJmx0O2NvbHVtbi1uYW1lJmd0OyB0YWcgYnkgYWRkaW5nIHRoZSBjb2x1bW4gbmFtZSBpbgorICAgICAqIHRoZSBjdXJyZW50IFVuaXF1ZSBlbGVtZW50IHRoYXQgcmVzaWRlcyBpbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kQ29sdW1uTmFtZSgpIHsKKyAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFVuaXF1ZSkgeworICAgICAgICAgICAgVW5pcXVlIHVuaXF1ZSA9IChVbmlxdWUpY3VycmVudDsKKyAgICAgICAgICAgIENvbHVtbiBjb2x1bW4gPSBuZXcgQ29sdW1uKCk7CisgICAgICAgICAgICBjb2x1bW4uc2V0TmFtZSh0aGlzLmN1cnJlbnRUZXh0KCkpOworICAgICAgICAgICAgdW5pcXVlLmFkZENvbHVtbihjb2x1bW4pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUcmFjayB1bmlxdWUgY29sdW1uIHNldHRpbmdzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGVudW0gVW5pcXVlRmxhZworCXsKKwkJVFJVRSwKKwkJRkFMU0UKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hNTFBlcnNpc3RlbmNlTWFwcGluZ1NlcmlhbGl6ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWE1MUGVyc2lzdGVuY2VNYXBwaW5nU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjgwMDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hNTFBlcnNpc3RlbmNlTWFwcGluZ1NlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDcwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW51bVR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRGlzY3JpbWluYXRvck1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlF1ZXJ5UmVzdWx0TWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlNlcXVlbmNlTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlZhbHVlTWFwcGluZ0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMuRW51bVZhbHVlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5GbGF0Q2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5GdWxsQ2xhc3NTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0cy5WZXJ0aWNhbENsYXNzU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuVW5pcXVlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFNb2Rlcy5NT0RFX01BUFBJTkc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlNlcXVlbmNlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlhNTFBlcnNpc3RlbmNlTWV0YURhdGFTZXJpYWxpemVyOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIFNlcmlhbGl6ZXMgcGVyc2lzdGVuY2UgbWFwcGluZyB0byBYTUwuCisgKgorICogQHNpbmNlIDAuNC4wCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgWE1MUGVyc2lzdGVuY2VNYXBwaW5nU2VyaWFsaXplcgorICAgIGV4dGVuZHMgWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVNlcmlhbGl6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVTVUxUTUFQID0gVFlQRV9RVUVSWSArIDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q29sVHlwZSwgU3RyaW5nPiBfbmFtZXM7CisKKyAgICBzdGF0aWMgeworICAgICAgICBfbmFtZXMgPSBuZXcgRW51bU1hcDxDb2xUeXBlLCBTdHJpbmc+KENvbFR5cGUuY2xhc3MpOworICAgICAgICBfbmFtZXMucHV0KENvbFR5cGUuQ09MLCAiY29sdW1uIik7CisgICAgICAgIF9uYW1lcy5wdXQoQ29sVHlwZS5KT0lOLCAiam9pbi1jb2x1bW4iKTsKKyAgICAgICAgX25hbWVzLnB1dChDb2xUeXBlLklOVkVSU0UsICJpbnZlcnNlLWpvaW4tY29sdW1uIik7CisgICAgICAgIF9uYW1lcy5wdXQoQ29sVHlwZS5QS19KT0lOLCAicHJpbWFyeS1rZXktam9pbi1jb2x1bW4iKTsKKyAgICAgICAgX25hbWVzLnB1dChDb2xUeXBlLkRJU0MsICJkaXNjcmltaW5hdG9yLWNvbHVtbiIpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxRdWVyeVJlc3VsdE1hcHBpbmc+IF9yZXN1bHRzID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3N5bmMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MUGVyc2lzdGVuY2VNYXBwaW5nU2VyaWFsaXplcihKREJDQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIHN1cGVyKGNvbmYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZSBtYXBwaW5nIGluZm8gd2l0aCBkYXRhIGF2YWlsYWJsZQorICAgICAqIGZyb20gbWFwcGVkIGNvbXBvbmVudHMgYmVmb3JlIHNlcmlhbGl6YXRpb24uIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNNYXBwaW5nSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIF9zeW5jOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZSBtYXBwaW5nIGluZm8gd2l0aCBkYXRhIGF2YWlsYWJsZQorICAgICAqIGZyb20gbWFwcGVkIGNvbXBvbmVudHMgYmVmb3JlIHNlcmlhbGl6YXRpb24uIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5bmNNYXBwaW5nSW5mbyhib29sZWFuIHN5bmMpIHsKKyAgICAgICAgX3N5bmMgPSBzeW5jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIHJlc3VsdCBzZXQgbWFwcGluZyB0byBsb2NhbCBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRRdWVyeVJlc3VsdE1hcHBpbmcoUXVlcnlSZXN1bHRNYXBwaW5nIG1ldGEpIHsKKyAgICAgICAgaWYgKF9yZXN1bHRzID09IG51bGwpCisgICAgICAgICAgICBfcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8UXVlcnlSZXN1bHRNYXBwaW5nPigpOworICAgICAgICBfcmVzdWx0cy5hZGQobWV0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBnaXZlbiByZXN1bHQgc2V0IG1hcHBpbmcgZnJvbSB0aGUgbG9jYWwgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUXVlcnlSZXN1bHRNYXBwaW5nKFF1ZXJ5UmVzdWx0TWFwcGluZyBtZXRhKSB7CisgICAgICAgIHJldHVybiBfcmVzdWx0cyAhPSBudWxsICYmIF9yZXN1bHRzLnJlbW92ZShtZXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zKSB7CisgICAgICAgIHN1cGVyLmFkZEFsbChyZXBvcyk7CisgICAgICAgIGZvciAoUXVlcnlSZXN1bHRNYXBwaW5nIHJlcyA6ICgoTWFwcGluZ1JlcG9zaXRvcnkpIHJlcG9zKQorICAgICAgICAgICAgLmdldFF1ZXJ5UmVzdWx0TWFwcGluZ3MoKSkKKyAgICAgICAgICAgIGFkZFF1ZXJ5UmVzdWx0TWFwcGluZyhyZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gc3VwZXIucmVtb3ZlQWxsKHJlcG9zKTsKKyAgICAgICAgZm9yIChRdWVyeVJlc3VsdE1hcHBpbmcgcmVzIDogKChNYXBwaW5nUmVwb3NpdG9yeSkgcmVwb3MpCisgICAgICAgICAgICAuZ2V0UXVlcnlSZXN1bHRNYXBwaW5ncygpKQorICAgICAgICAgICAgcmVtb3ZlZCB8PSByZW1vdmVRdWVyeVJlc3VsdE1hcHBpbmcocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHN1cGVyLmNsZWFyKCk7CisgICAgICAgIGlmIChfcmVzdWx0cyAhPSBudWxsKQorICAgICAgICAgICAgX3Jlc3VsdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb21tbWVudHMoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc01hcHBpbmdNb2RlKCkgJiYgIWlzTWV0YURhdGFNb2RlKCkpIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDbGFzc01hcHBpbmcpCisgICAgICAgICAgICAgICAgb2JqID0gKChDbGFzc01hcHBpbmcpIG9iaikuZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEZpZWxkTWFwcGluZykKKyAgICAgICAgICAgICAgICBvYmogPSAoKEZpZWxkTWFwcGluZykgb2JqKS5nZXRNYXBwaW5nSW5mbygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmFkZENvbW1lbnRzKG9iaik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplQ2xhc3MoQ2xhc3NNZXRhRGF0YSBtZXRhLCBib29sZWFuIGFjY2VzcykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfc3luYyAmJiBpc01hcHBpbmdNb2RlKCkgJiYgbWV0YSBpbnN0YW5jZW9mIENsYXNzTWFwcGluZykgeworICAgICAgICAgICAgLy8gc3luYyBpZiByZXNvbHZlZCBhbmQgbWFwcGVkCisgICAgICAgICAgICBDbGFzc01hcHBpbmcgY2xzID0gKENsYXNzTWFwcGluZykgbWV0YTsKKyAgICAgICAgICAgIGlmICgoY2xzLmdldFJlc29sdmUoKSAmIE1PREVfTUFQUElORykgIT0gMCAmJiBjbHMuaXNNYXBwZWQoKSkgeworICAgICAgICAgICAgICAgIGNscy5zeW5jTWFwcGluZ0luZm8oKTsKKyAgICAgICAgICAgICAgICBjbHMuZ2V0RGlzY3JpbWluYXRvcigpLnN5bmNNYXBwaW5nSW5mbygpOworICAgICAgICAgICAgICAgIGNscy5nZXRWZXJzaW9uKCkuc3luY01hcHBpbmdJbmZvKCk7CisgICAgICAgICAgICAgICAgRmllbGRNYXBwaW5nW10gZmllbGRzOworICAgICAgICAgICAgICAgIGlmIChjbHMuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSBjbHMuZ2V0RGVmaW5lZEZpZWxkTWFwcGluZ3MoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IGNscy5nZXRGaWVsZE1hcHBpbmdzKCk7CisgICAgICAgICAgICAgICAgZm9yIChGaWVsZE1hcHBpbmcgZiA6IGZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgZi5zeW5jTWFwcGluZ0luZm8oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXJpYWxpemVDbGFzcyhtZXRhLCBhY2Nlc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZUNsYXNzTWFwcGluZ0NvbnRlbnQoQ2xhc3NNZXRhRGF0YSBtYXBwaW5nKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChDbGFzc01hcHBpbmcpIG1hcHBpbmc7CisgICAgICAgIENsYXNzTWFwcGluZ0luZm8gaW5mbyA9IGNscy5nZXRNYXBwaW5nSW5mbygpOworICAgICAgICBzZXJpYWxpemVUYWJsZShpbmZvLmdldFRhYmxlTmFtZSgpLCAidGFibGUiLCBTdHJpbmdzCisgICAgICAgICAgICAuZ2V0Q2xhc3NOYW1lKG1hcHBpbmcuZ2V0RGVzY3JpYmVkVHlwZSgpKSwgbnVsbCwgCisgICAgICAgICAgICBpbmZvLmdldFVuaXF1ZXMoKSk7CisgICAgICAgIGZvciAoU3RyaW5nIHNlY29uZCA6IGluZm8uZ2V0U2Vjb25kYXJ5VGFibGVOYW1lcygpKQorICAgICAgICAgICAgc2VyaWFsaXplVGFibGUoc2Vjb25kLCAic2Vjb25kYXJ5LXRhYmxlIiwgbnVsbCwgaW5mbywgbnVsbCk7CisgICAgICAgIHNlcmlhbGl6ZUNvbHVtbnMoaW5mbywgQ29sVHlwZS5QS19KT0lOLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemVJbmhlcml0YW5jZUNvbnRlbnQoQ2xhc3NNZXRhRGF0YSBtYXBwaW5nKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NNYXBwaW5nIGNscyA9IChDbGFzc01hcHBpbmcpIG1hcHBpbmc7CisgICAgICAgIENsYXNzTWFwcGluZ0luZm8gaW5mbyA9IGNscy5nZXRNYXBwaW5nSW5mbygpOworICAgICAgICBEaXNjcmltaW5hdG9yTWFwcGluZ0luZm8gZGluZm8gPSBjbHMuZ2V0RGlzY3JpbWluYXRvcigpCisgICAgICAgICAgICAuZ2V0TWFwcGluZ0luZm8oKTsKKyAgICAgICAgU3RyaW5nIHN0cmF0ID0gaW5mby5nZXRIaWVyYXJjaHlTdHJhdGVneSgpOworICAgICAgICBpZiAoRmxhdENsYXNzU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKHN0cmF0KSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgic3RyYXRlZ3kiLCAiU0lOR0xFX1RBQkxFIik7CisgICAgICAgIGVsc2UgaWYgKFZlcnRpY2FsQ2xhc3NTdHJhdGVneS5BTElBUy5lcXVhbHMoc3RyYXQpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJzdHJhdGVneSIsICJKT0lORUQiKTsKKyAgICAgICAgZWxzZSBpZiAoRnVsbENsYXNzU3RyYXRlZ3kuQUxJQVMuZXF1YWxzKHN0cmF0KSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgic3RyYXRlZ3kiLCAiVEFCTEVfUEVSX0NMQVNTIik7CisgICAgICAgIGlmIChzdHJhdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoImluaGVyaXRhbmNlIik7CisgICAgICAgICAgICBlbmRFbGVtZW50KCJpbmhlcml0YW5jZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChkaW5mby5nZXRWYWx1ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXJ0RWxlbWVudCgiZGlzY3JpbWluYXRvci12YWx1ZSIpOworICAgICAgICAgICAgYWRkVGV4dChkaW5mby5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoImRpc2NyaW1pbmF0b3ItdmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICBzZXJpYWxpemVDb2x1bW5zKGRpbmZvLCBDb2xUeXBlLkRJU0MsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSB0YWJsZSBvcHRpb25hbGx5IGxpc3RpbmcgcHJpbWFyeS1rZXktam9pbnMgc3RvcmVkCisgICAgICogaW4gdGhlIGdpdmVuIHtAbGluayBDbGFzc01hcHBpbmdJbmZvfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplVGFibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZWxlbWVudE5hbWUsCisgICAgICAgIFN0cmluZyBkZWZhdWx0TmFtZSwgQ2xhc3NNYXBwaW5nSW5mbyBzZWNvbmRhcnlJbmZvLCBVbmlxdWVbXSB1bmlxdWVzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxDb2x1bW4+IGNvbHMgPSBudWxsOworICAgICAgICBpZiAoc2Vjb25kYXJ5SW5mbyAhPSBudWxsKQorICAgICAgICAgICAgY29scyA9IChMaXN0PENvbHVtbj4pIHNlY29uZGFyeUluZm8uZ2V0U2Vjb25kYXJ5VGFibGVKb2luQ29sdW1ucworICAgICAgICAgICAgICAgICh0YWJsZSk7CisKKyAgICAgICAgYm9vbGVhbiBwcmludCA9IChjb2xzICE9IG51bGwgJiYgY29scy5zaXplKCkgPiAwKSB8fCAKKyAgICAgICAgICAgICh1bmlxdWVzICE9IG51bGwgJiYgdW5pcXVlcy5sZW5ndGggPiAwKTsKKyAgICAgICAgaWYgKHRhYmxlICE9IG51bGwKKyAgICAgICAgICAgICYmIChkZWZhdWx0TmFtZSA9PSBudWxsIHx8ICFkZWZhdWx0TmFtZS5lcXVhbHModGFibGUpKSkgeworICAgICAgICAgICAgcHJpbnQgPSB0cnVlOworICAgICAgICAgICAgaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCB0YWJsZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInNjaGVtYSIsIHRhYmxlLnN1YnN0cmluZygwLCBpbmRleCkpOworICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIHRhYmxlLnN1YnN0cmluZyhpbmRleCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHJpbnQpIHsKKyAgICAgICAgICAgIHN0YXJ0RWxlbWVudChlbGVtZW50TmFtZSk7CisgICAgICAgICAgICBpZiAoY29scyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChDb2x1bW4gY29sIDogY29scykKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplQ29sdW1uKGNvbCwgQ29sVHlwZS5QS19KT0lOLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodW5pcXVlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvciAoVW5pcXVlIHVuaXF1ZTogdW5pcXVlcykKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplVW5pcXVlQ29uc3RyYWludCh1bmlxdWUpOworICAgICAgICAgICAgZW5kRWxlbWVudChlbGVtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXJpYWxpemVBdHRyaWJ1dGVPdmVycmlkZShGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBvcmlnKSB7CisgICAgICAgIGlmIChvcmlnID09IG51bGwgfHwgZm1kID09IG9yaWcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkID0gKEZpZWxkTWFwcGluZykgZm1kOworICAgICAgICBGaWVsZE1hcHBpbmcgZmllbGQyID0gKEZpZWxkTWFwcGluZykgb3JpZzsKKyAgICAgICAgaWYgKGZpZWxkLmdldE1hcHBpbmdJbmZvKCkuaGFzU2NoZW1hQ29tcG9uZW50cygpCisgICAgICAgICAgICB8fCBmaWVsZDIuZ2V0TWFwcGluZ0luZm8oKS5oYXNTY2hlbWFDb21wb25lbnRzKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBWYWx1ZU1hcHBpbmdJbmZvIGluZm8gPSBmaWVsZC5nZXRWYWx1ZUluZm8oKTsKKyAgICAgICAgTGlzdDxDb2x1bW4+IGNvbHMgPSAoTGlzdDxDb2x1bW4+KSBpbmZvLmdldENvbHVtbnMoKTsKKyAgICAgICAgaWYgKGNvbHMgPT0gbnVsbCB8fCBjb2xzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBWYWx1ZU1hcHBpbmdJbmZvIGluZm8yID0gZmllbGQyLmdldFZhbHVlSW5mbygpOworICAgICAgICBMaXN0PENvbHVtbj4gY29sczIgPSAoTGlzdDxDb2x1bW4+KSBpbmZvMi5nZXRDb2x1bW5zKCk7CisgICAgICAgIGlmIChjb2xzMiA9PSBudWxsIHx8IGNvbHMyLnNpemUoKSAhPSBjb2xzLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoY29scy5zaXplKCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIENvbHVtbiBjb2w7CisgICAgICAgIENvbHVtbiBjb2wyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbCA9IGNvbHMuZ2V0KGkpOworICAgICAgICAgICAgY29sMiA9IGNvbHMyLmdldChpKTsKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuZXF1YWxzKGNvbC5nZXROYW1lKCksIGNvbDIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuZXF1YWxzKGNvbC5nZXRUeXBlTmFtZSgpLCBjb2wyLmdldFR5cGVOYW1lKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKGNvbC5nZXRTaXplKCkgIT0gY29sMi5nZXRTaXplKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoY29sLmdldERlY2ltYWxEaWdpdHMoKSAhPSBjb2wyLmdldERlY2ltYWxEaWdpdHMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChjb2wuZ2V0RmxhZyhDb2x1bW4uRkxBR19VTklOU0VSVEFCTEUpCisgICAgICAgICAgICAgICAgIT0gY29sMi5nZXRGbGFnKENvbHVtbi5GTEFHX1VOSU5TRVJUQUJMRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoY29sLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5VUERBVEFCTEUpCisgICAgICAgICAgICAgICAgIT0gY29sMi5nZXRGbGFnKENvbHVtbi5GTEFHX1VOVVBEQVRBQkxFKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplQXR0cmlidXRlT3ZlcnJpZGVNYXBwaW5nQ29udGVudChGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBvcmlnKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZtID0gKEZpZWxkTWFwcGluZykgZm1kOworICAgICAgICBzZXJpYWxpemVDb2x1bW5zKGZtLmdldFZhbHVlSW5mbygpLCBDb2xUeXBlLkNPTCwgZm0uZ2V0TWFwcGluZ0luZm8oKQorICAgICAgICAgICAgLmdldFRhYmxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUGVyc2lzdGVuY2VTdHJhdGVneSBnZXRTdHJhdGVneShGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBQZXJzaXN0ZW5jZVN0cmF0ZWd5IHN0cmF0ID0gc3VwZXIuZ2V0U3RyYXRlZ3koZm1kKTsKKyAgICAgICAgRmllbGRNYXBwaW5nIGZpZWxkID0gKEZpZWxkTWFwcGluZykgZm1kOworICAgICAgICBzd2l0Y2ggKHN0cmF0KSB7CisgICAgICAgICAgICBjYXNlIE1BTllfTUFOWToKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gZGlmZmVyZW50aWF0ZSBhIG9uZS1tYW55IGJ5IHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgICAgICAvLyBzZWNvbmRhcnkgdGFibGUgam9pbiwgb3IgdGhlIGZrIGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwZWRCeSgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgKGZpZWxkLmdldE1hcHBpbmdJbmZvKCkuZ2V0Sm9pbkRpcmVjdGlvbigpCisgICAgICAgICAgICAgICAgICAgID09IE1hcHBpbmdJbmZvLkpPSU5fTk9ORQorICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFZhbHVlSW5mbygpLmdldFVuaXF1ZSgpCisgICAgICAgICAgICAgICAgICAgICE9IG51bGwpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VTdHJhdGVneS5PTkVfTUFOWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUFOWV9PTkU6CisgICAgICAgICAgICAgICAgLy8gaW52ZXJzZSBqb2luIGNvbHMgb3IgdW5pcXVlIGZrPworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRWYWx1ZUluZm8oKS5nZXRKb2luRGlyZWN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgPT0gTWFwcGluZ0luZm8uSk9JTl9JTlZFUlNFCisgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkLmdldFZhbHVlSW5mbygpLmdldFVuaXF1ZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVN0cmF0ZWd5Lk9ORV9PTkU7CisKKyAgICAgICAgICAgICAgICAvLyBzY2FuIGZvciBwcmltYXJ5LWtleS1qb2luLWNvbHVtbgorICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uPiBjb2xzID0gZmllbGQuZ2V0VmFsdWVJbmZvKCkuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcGtKb2luID0gY29scyAhPSBudWxsICYmIGNvbHMuc2l6ZSgpID4gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgcGtKb2luICYmIGkgPCBjb2xzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBwa0pvaW4gPSBjb2xzLmdldChpKS5nZXRGbGFnKENvbHVtbi5GTEFHX1BLX0pPSU4pOworICAgICAgICAgICAgICAgIGlmIChwa0pvaW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVN0cmF0ZWd5Lk9ORV9PTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmF0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZUZpZWxkTWFwcGluZ0NvbnRlbnQoRmllbGRNZXRhRGF0YSBmbWQsCisgICAgICAgIFBlcnNpc3RlbmNlU3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoZm1kLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyB3aGlsZSBJJ2QgbGlrZSB0byBkbyBhdXRvIGRldGVjdGlvbiBiYXNlZCBvbiBqb2luIGRpcmVjdGlvbnMsIGV0Yy4KKyAgICAgICAgLy8gdGhlIGRpc3Rpbmd1aXNoZWQgY29sdW1uIC8gdGFibGUgLyBldGMgbmFtZXMgZm9yY2VzIG91ciBoYW5kCisgICAgICAgIC8vIGVzcCBmb3IgT3BlbkpQQSBjdXN0b20gbWFwcGluZ3MuCisgICAgICAgIEZpZWxkTWFwcGluZyBmaWVsZCA9IChGaWVsZE1hcHBpbmcpIGZtZDsKKyAgICAgICAgc3dpdGNoIChzdHJhdGVneSkgeworICAgICAgICAgICAgY2FzZSBPTkVfT05FOgorICAgICAgICAgICAgY2FzZSBNQU5ZX09ORToKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVDb2x1bW5zKGZpZWxkLmdldFZhbHVlSW5mbygpLCBDb2xUeXBlLkpPSU4sCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldE1hcHBpbmdJbmZvKCkuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgT05FX01BTlk6CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldE1hcHBpbmdJbmZvKCkuZ2V0Sm9pbkRpcmVjdGlvbigpID09CisgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJbmZvLkpPSU5fTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVDb2x1bW5zKGZpZWxkLmdldEVsZW1lbnRNYXBwaW5nKCkuZ2V0VmFsdWVJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xUeXBlLkpPSU4sIG51bGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVsc2Ugbm8gYnJlYWsKKyAgICAgICAgICAgIGNhc2UgTUFOWV9NQU5ZOgorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRNYXBwaW5nSW5mbygpLmhhc1NjaGVtYUNvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZC5nZXRFbGVtZW50TWFwcGluZygpLmdldFZhbHVlSW5mbygpCisgICAgICAgICAgICAgICAgICAgIC5oYXNTY2hlbWFDb21wb25lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlID0gZmllbGQuZ2V0TWFwcGluZ0luZm8oKS5nZXRUYWJsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJuYW1lIiwgdGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJzY2hlbWEiLCB0YWJsZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCB0YWJsZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhcnRFbGVtZW50KCJqb2luLXRhYmxlIik7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUNvbHVtbnMoZmllbGQuZ2V0TWFwcGluZ0luZm8oKSwgQ29sVHlwZS5KT0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUNvbHVtbnMoZmllbGQuZ2V0RWxlbWVudE1hcHBpbmcoKS5nZXRWYWx1ZUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbFR5cGUuSU5WRVJTRSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGVuZEVsZW1lbnQoImpvaW4tdGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2VyaWFsaXplQ29sdW1ucyhmaWVsZC5nZXRWYWx1ZUluZm8oKSwgQ29sVHlwZS5DT0wsCisgICAgICAgICAgICBmaWVsZC5nZXRNYXBwaW5nSW5mbygpLmdldFRhYmxlTmFtZSgpKTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFBlcnNpc3RlbmNlU3RyYXRlZ3kuQkFTSUMgJiYgaXNMb2IoZmllbGQpKSB7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoImxvYiIpOworICAgICAgICAgICAgZW5kRWxlbWVudCgibG9iIik7CisgICAgICAgIH0KKyAgICAgICAgVGVtcG9yYWxUeXBlIHRlbXBvcmFsID0gZ2V0VGVtcG9yYWwoZmllbGQpOworICAgICAgICBpZiAodGVtcG9yYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCJ0ZW1wb3JhbCIpOworICAgICAgICAgICAgYWRkVGV4dCh0ZW1wb3JhbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoInRlbXBvcmFsIik7CisgICAgICAgIH0KKworICAgICAgICBFbnVtVHlwZSBlbnVtVHlwZSA9IGdldEVudW1UeXBlKGZpZWxkKTsKKyAgICAgICAgaWYgKGVudW1UeXBlICE9IG51bGwgJiYgZW51bVR5cGUgIT0gRW51bVR5cGUuT1JESU5BTCkgeworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCJlbnVtZXJhdGVkIik7CisgICAgICAgICAgICBhZGRUZXh0KGVudW1UeXBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZW5kRWxlbWVudCgiZW51bWVyYXRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIHRoZSBmaWVsZCBpcyBhIGxvYi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2IoRmllbGRNYXBwaW5nIGZpZWxkKSB7CisgICAgICAgIGZvciAoQ29sdW1uIGNvbCA6IChMaXN0PENvbHVtbj4pIGZpZWxkLmdldFZhbHVlSW5mbygpLmdldENvbHVtbnMoKSkKKyAgICAgICAgICAgIGlmIChjb2wuZ2V0VHlwZSgpID09IFR5cGVzLkJMT0IgfHwgY29sLmdldFR5cGUoKSA9PSBUeXBlcy5DTE9CKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZpZWxkJ3MgdGVtcG9yYWwgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbChGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldERlY2xhcmVkVHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuREFURQorICAgICAgICAgICAgJiYgZmllbGQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5DQUxFTkRBUikKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gKChKREJDQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpKQorICAgICAgICAgICAgLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisgICAgICAgIGludCBkZWYgPSBkaWN0LmdldEpEQkNUeXBlKGZpZWxkLmdldFR5cGVDb2RlKCksIGZhbHNlKTsKKyAgICAgICAgZm9yIChDb2x1bW4gY29sIDogKExpc3Q8Q29sdW1uPikgZmllbGQuZ2V0VmFsdWVJbmZvKCkuZ2V0Q29sdW1ucygpKSB7CisgICAgICAgICAgICBpZiAoY29sLmdldFR5cGUoKSA9PSBkZWYpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZW1wb3JhbFR5cGUuREFURTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZW1wb3JhbFR5cGUuVElNRTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUVTVEFNUDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlbXBvcmFsVHlwZS5USU1FU1RBTVA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGVudW0gdHlwZSBmb3IgdGhlIGZpZWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCBFbnVtVHlwZSBnZXRFbnVtVHlwZShGaWVsZE1hcHBpbmcgZmllbGQpIHsKKyAgICAgICAgaWYgKGZpZWxkLmdldERlY2xhcmVkVHlwZUNvZGUoKSAhPSBKYXZhVHlwZXMuT0JKRUNUKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghKGZpZWxkLmdldEhhbmRsZXIoKSBpbnN0YW5jZW9mIEVudW1WYWx1ZUhhbmRsZXIpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiAoKEVudW1WYWx1ZUhhbmRsZXIpIGZpZWxkLmdldEhhbmRsZXIoKSkuZ2V0U3RvcmVPcmRpbmFsKCkKKyAgICAgICAgICAgID8gRW51bVR5cGUuT1JESU5BTCA6IEVudW1UeXBlLlNUUklORzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgdGhlIGNvbHVtbnMgaW4gdGhlIGdpdmVuIG1hcHBpbmcgaW5mby4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplQ29sdW1ucyhNYXBwaW5nSW5mbyBpbmZvLCBDb2xUeXBlIHR5cGUsCisgICAgICAgIFN0cmluZyBzZWNvbmRhcnkpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBMaXN0PENvbHVtbj4gY29scyA9IChMaXN0PENvbHVtbj4pIGluZm8uZ2V0Q29sdW1ucygpOworICAgICAgICBpZiAoY29scyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmb3IgKENvbHVtbiBjb2wgOiBjb2xzKQorICAgICAgICAgICAgc2VyaWFsaXplQ29sdW1uKGNvbCwgdHlwZSwgc2Vjb25kYXJ5LCBpbmZvLmdldFVuaXF1ZSgpICE9IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBhIHNpbmdsZSBjb2x1bW4uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUNvbHVtbihDb2x1bW4gY29sLCBDb2xUeXBlIHR5cGUsIFN0cmluZyBzZWNvbmRhcnksCisgICAgICAgIGJvb2xlYW4gdW5pcXVlKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNvbC5nZXROYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIGNvbC5nZXROYW1lKCkpOworICAgICAgICBpZiAoY29sLmdldFR5cGVOYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uLWRlZmluaXRpb24iLCBjb2wuZ2V0VHlwZU5hbWUoKSk7CisgICAgICAgIGlmIChjb2wuZ2V0VGFyZ2V0KCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgKHR5cGUgPT0gQ29sVHlwZS5KT0lOIHx8IHR5cGUgPT0gQ29sVHlwZS5JTlZFUlNFCisgICAgICAgICAgICB8fCB0eXBlID09IENvbFR5cGUuUEtfSk9JTikpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInJlZmVyZW5jZWQtY29sdW1uLW5hbWUiLCBjb2wuZ2V0VGFyZ2V0KCkpOworICAgICAgICBpZiAodHlwZSA9PSBDb2xUeXBlLkNPTCB8fCB0eXBlID09IENvbFR5cGUuSk9JTgorICAgICAgICAgICAgfHwgdHlwZSA9PSBDb2xUeXBlLlBLX0pPSU4pIHsKKyAgICAgICAgICAgIGlmICh1bmlxdWUpCisgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJ1bmlxdWUiLCAidHJ1ZSIpOworICAgICAgICAgICAgaWYgKGNvbC5pc05vdE51bGwoKSkKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm51bGxhYmxlIiwgImZhbHNlIik7CisgICAgICAgICAgICBpZiAoY29sLmdldEZsYWcoQ29sdW1uLkZMQUdfVU5JTlNFUlRBQkxFKSkKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImluc2VydGFibGUiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgIGlmIChjb2wuZ2V0RmxhZyhDb2x1bW4uRkxBR19VTlVQREFUQUJMRSkpCisgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJ1cGRhdGFibGUiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgIGlmIChzZWNvbmRhcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInRhYmxlIiwgc2Vjb25kYXJ5KTsKKworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ29sVHlwZS5DT0wpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sLmdldFNpemUoKSA+IDAgJiYgY29sLmdldFNpemUoKSAhPSAyNTUpCisgICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgibGVuZ3RoIiwgY29sLmdldFNpemUoKSArICIiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sLmdldERlY2ltYWxEaWdpdHMoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInNjYWxlIiwgY29sLmdldERlY2ltYWxEaWdpdHMoKSArICIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBDb2xUeXBlLkNPTCB8fCBnZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbC5nZXRGbGFnKENvbHVtbi5GTEFHX1BLX0pPSU4pID8gX25hbWVzCisgICAgICAgICAgICAgICAgLmdldChDb2xUeXBlLlBLX0pPSU4pIDogX25hbWVzLmdldCh0eXBlKTsKKyAgICAgICAgICAgIHN0YXJ0RWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplVW5pcXVlQ29uc3RyYWludChVbmlxdWUgdW5pcXVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRFbGVtZW50KCJ1bmlxdWUtY29uc3RyYWludCIpOworICAgICAgICBDb2x1bW5bXSBjb2x1bW5zID0gdW5pcXVlLmdldENvbHVtbnMoKTsKKyAgICAgICAgZm9yIChDb2x1bW4gY29sdW1uOmNvbHVtbnMpIHsKKyAgICAgICAgICAgIHN0YXJ0RWxlbWVudCgiY29sdW1uLW5hbWUiKTsKKyAgICAgICAgICAgIGFkZFRleHQoY29sdW1uLmdldE5hbWUoKSk7CisgICAgICAgICAgICBlbmRFbGVtZW50KCJjb2x1bW4tbmFtZSIpOworICAgICAgICB9CisgICAgICAgIGVuZEVsZW1lbnQoInVuaXF1ZS1jb25zdHJhaW50Iik7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZXJpYWxpemF0aW9uQ29tcGFyYXRvciBuZXdTZXJpYWxpemF0aW9uQ29tcGFyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXBwaW5nU2VyaWFsaXphdGlvbkNvbXBhcmF0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTeXN0ZW1NYXBwaW5nRWxlbWVudHMoQ29sbGVjdGlvbiB0b1NlcmlhbGl6ZSkgeworICAgICAgICBpZiAoaXNRdWVyeU1vZGUoKSkKKyAgICAgICAgICAgIHRvU2VyaWFsaXplLmFkZEFsbChnZXRRdWVyeVJlc3VsdE1hcHBpbmdzKG51bGwpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IHR5cGUoT2JqZWN0IG8pIHsKKyAgICAgICAgaW50IHR5cGUgPSBzdXBlci50eXBlKG8pOworICAgICAgICBpZiAodHlwZSA9PSAtMSAmJiBvIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRNYXBwaW5nKQorICAgICAgICAgICAgcmV0dXJuIFRZUEVfUkVTVUxUTUFQOworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdCBzZXQgbWFwcGluZ3MgZm9yIHRoZSBnaXZlbiBzY29wZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8UXVlcnlSZXN1bHRNYXBwaW5nPiBnZXRRdWVyeVJlc3VsdE1hcHBpbmdzKENsYXNzTWV0YURhdGEgY20pIHsKKyAgICAgICAgaWYgKF9yZXN1bHRzID09IG51bGwgfHwgX3Jlc3VsdHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIChMaXN0PFF1ZXJ5UmVzdWx0TWFwcGluZz4pIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisKKyAgICAgICAgTGlzdDxRdWVyeVJlc3VsdE1hcHBpbmc+IHJlc3VsdCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3Jlc3VsdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZyBlbGVtZW50ID0gX3Jlc3VsdHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKChjbSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0U291cmNlU2NvcGUoKSAhPSBudWxsKSB8fCAoY20gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGVsZW1lbnQuZ2V0U291cmNlU2NvcGUoKSAhPSBjbS5nZXREZXNjcmliZWRUeXBlKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxRdWVyeVJlc3VsdE1hcHBpbmc+KF9yZXN1bHRzLnNpemUoKSAtIGkpOworICAgICAgICAgICAgcmVzdWx0LmFkZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgPyAoTGlzdDxRdWVyeVJlc3VsdE1hcHBpbmc+KSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZVN5c3RlbU1hcHBpbmdFbGVtZW50KE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRNYXBwaW5nKQorICAgICAgICAgICAgc2VyaWFsaXplUXVlcnlSZXN1bHRNYXBwaW5nKChRdWVyeVJlc3VsdE1hcHBpbmcpIG9iaik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplUXVlcnlNYXBwaW5ncyhDbGFzc01ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBmb3IgKFF1ZXJ5UmVzdWx0TWFwcGluZyByZXMgOiBnZXRRdWVyeVJlc3VsdE1hcHBpbmdzKG1ldGEpKQorICAgICAgICAgICAgc2VyaWFsaXplUXVlcnlSZXN1bHRNYXBwaW5nKHJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIGdpdmVuIHJlc3VsdCBzZXQgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplUXVlcnlSZXN1bHRNYXBwaW5nKFF1ZXJ5UmVzdWx0TWFwcGluZyBtZXRhKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRTZXJpYWxpemVBbm5vdGF0aW9ucygpCisgICAgICAgICAgICAmJiBtZXRhLmdldFNvdXJjZVR5cGUoKSA9PSBtZXRhLlNSQ19BTk5PVEFUSU9OUykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBtZXRhLmdldE5hbWUoKSk7CisgICAgICAgIHN0YXJ0RWxlbWVudCgic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIpOworICAgICAgICBmb3IgKFF1ZXJ5UmVzdWx0TWFwcGluZy5QQ1Jlc3VsdCBwYyA6IG1ldGEuZ2V0UENSZXN1bHRzKCkpIHsKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiZW50aXR5LWNsYXNzIiwgcGMuZ2V0Q2FuZGlkYXRlVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBPYmplY3QgZGlzY3JpbSA9IHBjLmdldE1hcHBpbmcocGMuRElTQ1JJTUlOQVRPUik7CisgICAgICAgICAgICBpZiAoZGlzY3JpbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiZGlzY3JpbWluYXRvci1jb2x1bW4iLCBkaXNjcmltLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBzdGFydEVsZW1lbnQoImVudGl0eS1yZXN1bHQiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBwYy5nZXRNYXBwaW5nUGF0aHMoKSkgeworICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIHBhdGgpOworICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY29sdW1uIiwgcGMuZ2V0TWFwcGluZyhwYXRoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzdGFydEVsZW1lbnQoImZpZWxkLXJlc3VsdCIpOworICAgICAgICAgICAgICAgIGVuZEVsZW1lbnQoImZpZWxkLXJlc3VsdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kRWxlbWVudCgiZW50aXR5LXJlc3VsdCIpOworICAgICAgICB9CisgICAgICAgIGZvciAoT2JqZWN0IGNvbCA6IG1ldGEuZ2V0Q29sdW1uUmVzdWx0cygpKSB7CisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBjb2wudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoImNvbHVtbi1yZXN1bHQiKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoImNvbHVtbi1yZXN1bHQiKTsKKyAgICAgICAgfQorICAgICAgICBlbmRFbGVtZW50KCJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplU2VxdWVuY2UoU2VxdWVuY2VNZXRhRGF0YSBtZXRhKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRTZXJpYWxpemVBbm5vdGF0aW9ucygpCisgICAgICAgICAgICAmJiBtZXRhLmdldFNvdXJjZVR5cGUoKSA9PSBtZXRhLlNSQ19BTk5PVEFUSU9OUykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFNlcXVlbmNlTWFwcGluZy5JTVBMX1ZBTFVFX1RBQkxFLmVxdWFscyhtZXRhLmdldFNlcXVlbmNlUGx1Z2luKCkpKSB7CisgICAgICAgICAgICBzdXBlci5zZXJpYWxpemVTZXF1ZW5jZShtZXRhKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNlcXVlbmNlTWFwcGluZyBzZXEgPSAoU2VxdWVuY2VNYXBwaW5nKSBtZXRhOworICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBzZXEuZ2V0TmFtZSgpKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gc2VxLmdldFRhYmxlKCk7CisgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgZG90SWR4ID0gdGFibGUuaW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGRvdElkeCA9PSAtMSkKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInRhYmxlIiwgdGFibGUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJ0YWJsZSIsIHRhYmxlLnN1YnN0cmluZyhkb3RJZHggKyAxKSk7CisgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJzY2hlbWEiLCB0YWJsZS5zdWJzdHJpbmcoMCwgZG90SWR4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KHNlcS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJway1jb2x1bW4tbmFtZSIsIHNlcS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoc2VxLmdldFNlcXVlbmNlQ29sdW1uKCkpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJ2YWx1ZS1jb2x1bW4tbmFtZSIsIHNlcS5nZXRTZXF1ZW5jZUNvbHVtbigpKTsKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KHNlcS5nZXRQcmltYXJ5S2V5VmFsdWUoKSkpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInBrLWNvbHVtbi12YWx1ZSIsIHNlcS5nZXRQcmltYXJ5S2V5VmFsdWUoKSk7CisgICAgICAgIGlmIChzZXEuZ2V0QWxsb2NhdGUoKSAhPSA1MCAmJiBzZXEuZ2V0QWxsb2NhdGUoKSAhPSAtMSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiYWxsb2NhdGlvbi1zaXplIiwgc2VxLmdldEFsbG9jYXRlKCkgKyAiIik7CisgICAgICAgIGlmIChzZXEuZ2V0SW5pdGlhbFZhbHVlKCkgIT0gMCAmJiBzZXEuZ2V0SW5pdGlhbFZhbHVlKCkgIT0gLTEpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImluaXRpYWwtdmFsdWUiLCBzZXEuZ2V0SW5pdGlhbFZhbHVlKCkgKyAiIik7CisgICAgICAgIHN0YXJ0RWxlbWVudCgidGFibGUtZ2VuZXJhdG9yIik7CisgICAgICAgIGVuZEVsZW1lbnQoInRhYmxlLWdlbmVyYXRvciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbiB0eXBlcyBzZXJpYWxpemVkIHVuZGVyIGRpZmZlcmVudCBuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBlbnVtIENvbFR5cGUgeworCisgICAgICAgIENPTCwKKyAgICAgICAgSk9JTiwKKyAgICAgICAgSU5WRVJTRSwKKyAgICAgICAgUEtfSk9JTiwKKyAgICAgICAgRElTQworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dGVuZHMge0BsaW5rIFNlcmlhbGl6YXRpb25Db21wYXJhdG9yfSBmb3Igc3RvcmUtc3BlY2lmaWMgdGFncyBzdWNoCisgICAgICogYXMgJmx0O3NxbC1yZXN1bHQtc2V0LW1hcHBpbmcmZ3Q7LgorICAgICAqCisgICAgICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIE1hcHBpbmdTZXJpYWxpemF0aW9uQ29tcGFyYXRvcgorICAgICAgICBleHRlbmRzIFNlcmlhbGl6YXRpb25Db21wYXJhdG9yIHsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVVbmtub3duKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIFF1ZXJ5UmVzdWx0TWFwcGluZykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVVbmtub3duKG8xLCBvMik7CisKKyAgICAgICAgICAgIFF1ZXJ5UmVzdWx0TWFwcGluZyByZXMxID0gKFF1ZXJ5UmVzdWx0TWFwcGluZykgbzE7CisgICAgICAgICAgICBRdWVyeVJlc3VsdE1hcHBpbmcgcmVzMiA9IChRdWVyeVJlc3VsdE1hcHBpbmcpIG8yOworCisgICAgICAgICAgICAvLyBzeXN0ZW0gc2NvcGUgYmVmb3JlIGNsYXNzIHNjb3BlCisgICAgICAgICAgICBPYmplY3Qgc2NvcGUxID0gcmVzMS5nZXRTb3VyY2VTY29wZSgpOworICAgICAgICAgICAgT2JqZWN0IHNjb3BlMiA9IHJlczIuZ2V0U291cmNlU2NvcGUoKTsKKyAgICAgICAgICAgIGlmIChzY29wZTEgPT0gbnVsbCAmJiBzY29wZTIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoc2NvcGUxICE9IG51bGwgJiYgc2NvcGUyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgb24gbGlzdGluZyBpbmRleCwgb3IgaWYgbm9uZS9zYW1lLCB1c2UgbmFtZQorICAgICAgICAgICAgaW50IGxpc3RpbmdJbmRleDEgPSByZXMxLmdldExpc3RpbmdJbmRleCgpOworICAgICAgICAgICAgaW50IGxpc3RpbmdJbmRleDIgPSByZXMyLmdldExpc3RpbmdJbmRleCgpOworICAgICAgICAgICAgaWYgKGxpc3RpbmdJbmRleDEgIT0gbGlzdGluZ0luZGV4MikKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdGluZ0luZGV4MSAtIGxpc3RpbmdJbmRleDI7CisgICAgICAgICAgICByZXR1cm4gcmVzMS5nZXROYW1lICgpLmNvbXBhcmVUbyAocmVzMi5nZXROYW1lICgpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWFNlY29uZGFyeVRhYmxlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hTZWNvbmRhcnlUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Zjc1MGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hTZWNvbmRhcnlUYWJsZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKworLyoqCisgKiBFeHRlbmRlZCBzZWNvbmRhcnkgdGFibGUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgVFlQRSB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgWFNlY29uZGFyeVRhYmxlIHsKKworICAgIFN0cmluZyBuYW1lKCk7CisKKyAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisKKyAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKworICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307CisKKyAgICBJbmRleFtdIGluZGV4ZXMoKSBkZWZhdWx0IHt9OworCisgICAgRm9yZWlnbktleVtdIGZvcmVpZ25LZXlzKCkgZGVmYXVsdCB7fTsKKworICAgIFVuaXF1ZVtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWFNlY29uZGFyeVRhYmxlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9YU2Vjb25kYXJ5VGFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2NTI5YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWFNlY29uZGFyeVRhYmxlcy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBBbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgbXVsdGlwbGUgc2Vjb25kYXJ5IHRhYmxlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBYU2Vjb25kYXJ5VGFibGVzIHsKKworICAgIFhTZWNvbmRhcnlUYWJsZVtdIHZhbHVlKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWFRhYmxlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZGZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hUYWJsZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBFeHRlbmRlZCB0YWJsZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBYVGFibGUgeworCisgICAgU3RyaW5nIG5hbWUoKTsKKworICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKworICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworCisgICAgSW5kZXhbXSBpbmRleGVzKCkgZGVmYXVsdCB7fTsKKworICAgIEZvcmVpZ25LZXlbXSBmb3JlaWduS2V5cygpIGRlZmF1bHQge307CisKKyAgICBVbmlxdWVbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL3BhY2thZ2UuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMThlNzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+T3BlbkpQQSBKUEEtSkRCQzwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgSkRCQy1zcGVjaWZpYyBleHRlbnNpb25zIHRvIE9wZW5KUEEgSlBBIHJ1bnRpbWUuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU4YzZkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbgpAQCAtMCwwICsxLDE3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuSkRCQ1BlcnNpc3RlbmNlUHJvZHVjdERlcml2YXRpb24KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9sb2NhbGl6ZXIucHJvcGVydGllcyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGIzNTZhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL2xvY2FsaXplci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworcGFyc2UtZ2VuOiBQYXJzaW5nIHRhYmxlIGdlbmVyYXRvciAiezB9Ii4KK2R1cC1nZW46IEZvdW5kIGR1cGxpY2F0ZSBnZW5lcmF0b3IgInswfSIgaW4gInsxfSIuICBJZ25vcmluZy4KK292ZXJyaWRlLWdlbjogRm91bmQgZHVwbGljYXRlIGdlbmVyYXRvciAiezB9IiBpbiAiezF9Ii4gIE92ZXJyaWRpbmcgcHJldmlvdXMgXAorCWRlZmluaXRpb24uCituby1nZW4tbmFtZTogVGhlIHRhYmxlIGdlbmVyYXRvciBpbiAiezB9IiBtdXN0IGRlY2xhcmUgYSBuYW1lLgorcGFyc2Utc3FscnNtYXBwaW5nOiBQYXJzaW5nIHJlc3VsdCBzZXQgbWFwcGluZyAiezB9Ii4KK2R1cC1zcWxyc21hcHBpbmc6IEZvdW5kIGR1cGxpY2F0ZSByZXN1bHQgc2V0IG1hcHBpbmcgInswfSIgaW4gInsxfSIuICBJZ25vcmluZy4KK292ZXJyaWRlLXNxbHJzbWFwcGluZzogRm91bmQgZHVwbGljYXRlIHJlc3VsdCBzZXQgbWFwcGluZyAiezB9IiBpbiAiezF9Ii4gXAorCU92ZXJyaWRpbmcgcHJldmlvdXMgZGVmaW5pdGlvbi4KK3Vuc3VwcG9ydGVkOiBPcGVuSlBBIGRvZXMgbm90IHlldCBzdXBwb3J0ICJ7MX0iIGFzIHVzZWQgaW4gInswfSIuCitzZWNvbmQtbmFtZTogVHlwZSAiezB9IiBkZWNsYXJlcyBhbiB1bm5hbWVkIEBTZWNvbmRhcnlUYWJsZS4KK3NlY29uZC1pbmNvbnNpc3Q6ICJ7MH0iIGRlY2xhcmVzIGluY29uc2lzdGVudCBzZWNvbmRhcnkgdGFibGVzIG9uIGl0cyBqb2luIFwKKwljb2x1bW5zLgorYmFkLXNlY29uZDogInswfSIgZGVjbGFyZXMgYSBzZWNvbmRhcnkgdGFibGUgb24gY29sdW1ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFwKKwl0aGlzIGF0dHJpYnV0ZS4KK3VuaXF1ZS1jb25zdHJhaW50czogRGV0ZWN0ZWQgZGVjbGFyZWQgdW5pcXVlIGNvbnN0cmFpbnRzIG9uICJ7MH0iLiAgT3BlbkpQQSBcCisJZG9lcyBub3QgeWV0IHN1cHBvcnQgdGhlIEBVbmlxdWVDb25zdHJhaW50IGFubm90YXRpb24uCitpbmNvbnNpc3QtY29sLWF0dHJzOiBEZXRlY3RlZCBpbmNvbnNpc3RlbnQgdmFsdWVzIG9mICJ1bmlxdWUiIG9uIGRpZmZlcmVudCBcCisJY29sdW1ucyBvZiAiezB9Ii4gIE9wZW5KUEEgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlmZmVyZW50IHBlci1jb2x1bW4gXAorICAgIHVuaXF1ZSB2YWx1ZXMuICBBbGwgY29sdW1ucyBmb3IgdGhpcyBtYXBwaW5nIG11c3QgdXNlIHRoZSBzYW1lIHZhbHVlcy4KK3BrLWFzLWZrOiBUaGUgInVzZVBLYXNGSyIgYXR0cmlidXRlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAgTWFwcGluZyB5b3VyIFwKKwlPbmVUb09uZSB1c2luZyBKb2luQ29sdW1ucyB0aGF0IG1hdGNoIHlvdXIgaWQgcHJvcGVydHkgY29sdW1ucyB3aWxsIHdvcmsuCituby1vdmVycmlkZS1uYW1lOiBNaXNzaW5nICJuYW1lIiBwcm9wZXJ0eSBvbiBtYXBwaW5nIG92ZXJyaWRlIGZvciAiezB9Ii4KK2VtYmVkLW92ZXJyaWRlLW5hbWU6IEVtYmVkZGVkIHByb3BlcnR5ICJ7MH0iIGRlY2xhcmVzIGEgbWFwcGluZyBvdmVycmlkZSBmb3IgXAorCSJ7MX0iLCBidXQgdGhhdCBpcyBub3QgYSBwZXJzaXN0ZW50IHByb3BlcnR5IGluIHRoZSBlbWJlZGRlZCB0eXBlLgorbnVtLWNvbHMtbWlzbWF0Y2g6IEV4cGVjdGVkICJ7MH0iIHRvIGhhdmUgInsxfSIgY29sdW1uKHMpLCBidXQgeW91IHNwZWNpZmllZCBcCisJInsyfSIgY29sdW1uKHMpLgorc2Vjb25kLXZlcnNpb246IFZlcnNpb24gcHJvcGVydHkgInswfSIgY2Fubm90IG1hcCB0byBhIHNlY29uZGFyeSB0YWJsZSBjb2x1bW4uIFwKKwlWZXJzaW9uIGNvbHVtbnMgbXVzdCBhbHdheXMgYmUgaW4gdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIGNsYXNzLgorbm90LWVtYmVkZGVkOiBBdHRlbXB0IHRvIGRlY2xhcmUgbWFwcGluZyBvdmVycmlkZXMgb24gbm9uLWVtYmVkZGVkIGZpZWxkICJ7MH0iLgorbm8tZ2VuLXRhYmxlOiBObyBnZW5lcmF0ZWQgdGFibGUgZm91bmQgYXQgInswfSIuCitlbXB0eS11bmlxdWUtY29sdW1uOiBBIHVuaXF1ZSBjb25zdHJhaW50ICJ7MH0iIHNwZWNpZmllZCBpbiBtYXBwaW5nIG9mIGNsYXNzICBcCisgICAgInsxfSIgaW5jbHVkZXMgYW4gZW1wdHkgY29sdW1uLgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9UZXN0QXV0b0RldGFjaFByb3BlcnR5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL1Rlc3RBdXRvRGV0YWNoUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VmYTExCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9UZXN0QXV0b0RldGFjaFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BdXRvRGV0YWNoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCitwdWJsaWMgY2xhc3MgVGVzdEF1dG9EZXRhY2hQcm9wZXJ0eSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIEVudGl0eU1hbmFnZXIgZW07CisgICAgcHJpdmF0ZSBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWY7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBEb24ndCBtb2RpZnkgc3lzdGVtIHByb3BzLCBhcyB3ZSBhcmUgdHJ5aW5nIHRvIGdldCBhcyBjbG9zZSBhcworICAgICAgICAvLyBwb3NzaWJsZSB0byB0ZXN0aW5nIHByb3BzIGluIHBlcnNpc3RlbmNlLnhtbAorICAgICAgICBIYXNoTWFwIHByb3BzID0gbmV3IEhhc2hNYXAoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIHByb3BzLnB1dCgib3BlbmpwYS5BdXRvRGV0YWNoIiwgImNvbW1pdCxjbG9zZSxub250eC1yZWFkIik7CisgICAgICAgIGVtZiA9IChPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkpIFBlcnNpc3RlbmNlCisgICAgICAgICAgICAgICAgLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KCJ0ZXN0IiwgcHJvcHMpOworCisgICAgICAgIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbS5jbG9zZSgpOworICAgICAgICBlbSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzQXV0b0RldGFjaGluZ09uQ2xvc2UoKSB7CisgICAgICAgIGFzc2VydFRydWUoIm5vdCBhdXRvZGV0YWNoaW5nIG9uIGNsb3NlIGFzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICBpc0F1dG9EZXRhY2hpbmdPbkNsb3NlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0F1dG9EZXRhY2hpbmdPbkNvbW1pdCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm90IGF1dG9kZXRhY2hpbmcgb24gY29tbWl0IGFzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICBpc0F1dG9EZXRhY2hpbmdPbkNvbW1pdCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBdXRvRGV0YWNoaW5nT25Ob25UeFJlYWQoKSB7CisgICAgICAgIGFzc2VydFRydWUoIm5vdCBhdXRvZGV0YWNoaW5nIG9uIG5vbnRyYW5zYWN0aW9uYWwgcmVhZCBhcyBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgaXNBdXRvRGV0YWNoaW5nT25Ob25UeFJlYWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQXV0b0RldGFjaGluZ09uQ2xvc2UoKSB7CisgICAgICAgIGludCBhdXRvRGV0YWNoRmxhZ3MgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuZ2V0QXV0b0RldGFjaCgpOworICAgICAgICByZXR1cm4gKGF1dG9EZXRhY2hGbGFncyAmIEF1dG9EZXRhY2guREVUQUNIX0NMT1NFKSA+IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQXV0b0RldGFjaGluZ09uQ29tbWl0KCkgeworICAgICAgICBpbnQgYXV0b0RldGFjaEZsYWdzID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pLmdldEF1dG9EZXRhY2goKTsKKyAgICAgICAgcmV0dXJuIChhdXRvRGV0YWNoRmxhZ3MgJiBBdXRvRGV0YWNoLkRFVEFDSF9DT01NSVQpID4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvRGV0YWNoaW5nT25Ob25UeFJlYWQoKSB7CisgICAgICAgIGludCBhdXRvRGV0YWNoRmxhZ3MgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuZ2V0QXV0b0RldGFjaCgpOworICAgICAgICByZXR1cm4gKGF1dG9EZXRhY2hGbGFncyAmIEF1dG9EZXRhY2guREVUQUNIX05PTlRYUkVBRCkgPiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvVGVzdEJhZEF1dG9EZXRhY2hQcm9wZXJ0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9UZXN0QmFkQXV0b0RldGFjaFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNTA2YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvVGVzdEJhZEF1dG9EZXRhY2hQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmNvbmY7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworcHVibGljIGNsYXNzIFRlc3RCYWRBdXRvRGV0YWNoUHJvcGVydHkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5VmFsdWUoKSB7CisgICAgICAgIEhhc2hNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcChTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgcHJvcHMucHV0KCJvcGVuanBhLkF1dG9EZXRhY2giLCAiIik7CisgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZiA9IChPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkpIFBlcnNpc3RlbmNlCisgICAgICAgICAgICAgICAgLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KCJ0ZXN0IiwgcHJvcHMpOworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgZW1mLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbW1hT25seVZhbHVlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSGFzaE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICAgICAgcHJvcHMucHV0KCJvcGVuanBhLkF1dG9EZXRhY2giLCAiLCIpOworICAgICAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mID0gKE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSkgUGVyc2lzdGVuY2UKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KCJ0ZXN0IiwgcHJvcHMpOworICAgICAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICBlbS5jbG9zZSgpOworICAgICAgICAgICAgZW1mLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFBlcnNpc3RlbmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIHdoaWxlIChjYXVzZSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIGNhdXNlID0gKChQZXJzaXN0ZW5jZUV4Y2VwdGlvbikgY2F1c2UpLmdldENhdXNlKCk7CisgICAgICAgICAgICBpZiAoIShjYXVzZSBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiB3aG9zZSBjYXVzZSB3YXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBQYXJzZUV4Y2VwdGlvbi4gIiArICJJbnN0ZWFkIHRoZSBjYXVzZSB3YXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBhIFBlcnNpc3RlbmNlRXhjZXB0aW9uLCBpbnN0ZWFkIGNhdWdodDogIgorICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlbVZhbHVlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSGFzaE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICAgICAgcHJvcHMucHV0KCJvcGVuanBhLkF1dG9EZXRhY2giLCAiY2xvc2UsLGNvbW1pdCIpOworICAgICAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mID0gKE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSkgUGVyc2lzdGVuY2UKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KCJ0ZXN0IiwgcHJvcHMpOworICAgICAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICBlbS5jbG9zZSgpOworICAgICAgICAgICAgZW1mLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFBlcnNpc3RlbmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIHdoaWxlIChjYXVzZSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIGNhdXNlID0gKChQZXJzaXN0ZW5jZUV4Y2VwdGlvbikgY2F1c2UpLmdldENhdXNlKCk7CisgICAgICAgICAgICBpZiAoIShjYXVzZSBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiB3aG9zZSBjYXVzZSB3YXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBQYXJzZUV4Y2VwdGlvbi4gIiArICJJbnN0ZWFkIHRoZSBjYXVzZSB3YXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBhIFBlcnNpc3RlbmNlRXhjZXB0aW9uLCBpbnN0ZWFkIGNhdWdodDogIgorICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRW50aXR5QS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRW50aXR5QS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDMxNjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FbnRpdHlBLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGlvblR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuRm9yZWlnbktleTsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIEVudGl0eUEgew0KKw0KKyAgICBASWQNCisgICAgQENvbHVtbihuYW1lID0gImVudGl0eWFfaWQiLCBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkNCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBAT25lVG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCwgb3B0aW9uYWwgPSBmYWxzZSkNCisgICAgQEpvaW5Db2x1bW4obmFtZSA9ICJlbnRpdHliX2lkIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiZW50aXR5Yl9pZCIsDQorICAgICAgICBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBARm9yZWlnbktleQ0KKyAgICBwcml2YXRlIEVudGl0eUIgZW50aXR5QjsNCisNCisgICAgQFZlcnNpb24NCisgICAgcHJpdmF0ZSBJbnRlZ2VyIG9wdExvY2s7DQorDQorICAgIHB1YmxpYyBFbnRpdHlBKCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldElkKEludGVnZXIgaWQpIHsNCisgICAgICAgIHRoaXMuaWQgPSBpZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSW50ZWdlciBnZXRJZCgpIHsNCisgICAgICAgIHJldHVybiBpZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgRW50aXR5QiBnZXRFbnRpdHlCKCkgew0KKyAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5QjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlCKEVudGl0eUIgZW50aXR5Qikgew0KKyAgICAgICAgdGhpcy5lbnRpdHlCID0gZW50aXR5QjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gdGhpcy5uYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgIH0NCit9DQorDQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRW50aXR5Qi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRW50aXR5Qi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzhhMDIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FbnRpdHlCLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGlvblR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuRm9yZWlnbktleTsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIEVudGl0eUIgew0KKw0KKyAgICBASWQNCisgICAgQENvbHVtbihuYW1lID0gImVudGl0eWJfaWQiLCBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkNCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBAT25lVG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkNCisgICAgQEpvaW5Db2x1bW4obmFtZSA9ICJlbnRpdHljX2lkIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiZW50aXR5Y19pZCIsDQorICAgICAgICBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBARm9yZWlnbktleQ0KKyAgICBwcml2YXRlIEVudGl0eUMgZW50aXR5QzsNCisNCisgICAgQFZlcnNpb24NCisgICAgcHJpdmF0ZSBJbnRlZ2VyIG9wdExvY2s7DQorDQorICAgIHB1YmxpYyBFbnRpdHlCKCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldElkKEludGVnZXIgaWQpIHsNCisgICAgICAgIHRoaXMuaWQgPSBpZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSW50ZWdlciBnZXRJZCgpIHsNCisgICAgICAgIHJldHVybiBpZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgRW50aXR5QyBnZXRFbnRpdHlDKCkgew0KKyAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5QzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlDKEVudGl0eUMgZW50aXR5Qykgew0KKyAgICAgICAgdGhpcy5lbnRpdHlDID0gZW50aXR5QzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gdGhpcy5uYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgIH0NCit9DQorDQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRW50aXR5Qy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvRW50aXR5Qy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWE5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FbnRpdHlDLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbDsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGlvblR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkRlcGVuZGVudDsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuRm9yZWlnbktleTsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIEVudGl0eUMgew0KKw0KKyAgICBASWQNCisgICAgQENvbHVtbihuYW1lID0gImVudGl0eWNfaWQiLCBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkNCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBAT25lVG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkNCisgICAgQEpvaW5Db2x1bW4obmFtZSA9ICJlbnRpdHlkX2lkIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiZW50aXR5ZF9pZCIsDQorICAgICAgICBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBARm9yZWlnbktleQ0KKyAgICBARGVwZW5kZW50DQorICAgIHByaXZhdGUgRW50aXR5RCBlbnRpdHlEOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIEVudGl0eUMoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SWQoSW50ZWdlciBpZCkgew0KKyAgICAgICAgdGhpcy5pZCA9IGlkOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBJbnRlZ2VyIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIGlkOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFbnRpdHlEIGdldEVudGl0eUQoKSB7DQorICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlEOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eUQoRW50aXR5RCBlbnRpdHlEKSB7DQorICAgICAgICB0aGlzLmVudGl0eUQgPSBlbnRpdHlEOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCisgICAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FbnRpdHlELmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9FbnRpdHlELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1YzdlNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0VudGl0eUQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRpb25UeXBlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIEVudGl0eUQgew0KKw0KKyAgICBASWQNCisgICAgQENvbHVtbihuYW1lID0gImVudGl0eWRfaWQiLCBudWxsYWJsZSA9IGZhbHNlKQ0KKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkNCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIEVudGl0eUQoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SWQoSW50ZWdlciBpZCkgew0KKyAgICAgICAgdGhpcy5pZCA9IGlkOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBJbnRlZ2VyIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIGlkOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCisgICAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9UZXN0Tm9Gb3JlaWduS2V5VmlvbGF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9UZXN0Tm9Gb3JlaWduS2V5VmlvbGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyYTU1NwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1Rlc3ROb0ZvcmVpZ25LZXlWaW9sYXRpb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsNCisNCisvKioNCisgKiBUZXN0IHRoYXQgc3FsIHN0YXRlbWVudHMgZ2V0IGZsdXNoZWQgaW4gYW4gb3JkZXIgd2hpY2ggZG9lcyBub3QgdmlvbGF0ZQ0KKyAqIG5vbi1udWxsYWJsZSBmb3JlaWduIGtleSBjb25zdHJhaW50cyBvbiBpbnNlcnRzIGFuZCBkZWxldGVzLg0KKyAqDQorICogQGF1dGhvciBSZWVjZSBHYXJyZXR0DQorICovDQorcHVibGljIGNsYXNzIFRlc3ROb0ZvcmVpZ25LZXlWaW9sYXRpb24NCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7DQorDQorICAgIHByaXZhdGUgRW50aXR5QSBlbnRpdHlBOw0KKyAgICBwcml2YXRlIEVudGl0eUIgZW50aXR5QjsNCisgICAgcHJpdmF0ZSBFbnRpdHlDIGVudGl0eUM7DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgc2V0VXAoRW50aXR5QS5jbGFzcywgRW50aXR5Qi5jbGFzcywgRW50aXR5Qy5jbGFzcywgRW50aXR5RC5jbGFzcyk7DQorDQorICAgICAgICBlbnRpdHlBID0gbmV3IEVudGl0eUEoKTsNCisgICAgICAgIGVudGl0eUMgPSBuZXcgRW50aXR5QygpOw0KKyAgICAgICAgRW50aXR5RCBlbnRpdHlEID0gbmV3IEVudGl0eUQoKTsNCisgICAgICAgIGVudGl0eUEuc2V0TmFtZSgiZW50aXR5QSIpOw0KKyAgICAgICAgZW50aXR5QiA9IG5ldyBFbnRpdHlCKCk7DQorICAgICAgICBlbnRpdHlCLnNldE5hbWUoImVudGl0eUIiKTsNCisgICAgICAgIGVudGl0eUMuc2V0TmFtZSgiZW50aXR5QyIpOw0KKyAgICAgICAgZW50aXR5RC5zZXROYW1lKCJlbnRpdHlEIik7DQorICAgICAgICBlbnRpdHlBLnNldEVudGl0eUIoZW50aXR5Qik7DQorICAgICAgICBlbnRpdHlCLnNldEVudGl0eUMoZW50aXR5Qyk7DQorICAgICAgICBlbnRpdHlDLnNldEVudGl0eUQoZW50aXR5RCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFNxbE9yZGVyKCkgew0KKw0KKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsNCisgICAgICAgICAgICBlbS5wZXJzaXN0KGVudGl0eUEpOw0KKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7DQorDQorICAgICAgICAgICAgRW50aXR5RCBuZXdFbnRpdHlEID0gbmV3IEVudGl0eUQoKTsNCisgICAgICAgICAgICBuZXdFbnRpdHlELnNldE5hbWUoIm5ld0VudGl0eUQiKTsNCisgICAgICAgICAgICBlbnRpdHlDLnNldEVudGl0eUQobmV3RW50aXR5RCk7DQorDQorICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgICAgIGVtLm1lcmdlKGVudGl0eUMpOw0KKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7DQorDQorICAgICAgICAgICAgRW50aXR5QyBuZXdFbnRpdHlDID0gbmV3IEVudGl0eUMoKTsNCisgICAgICAgICAgICBuZXdFbnRpdHlDLnNldE5hbWUoIm5ld0VudGl0eUMiKTsNCisgICAgICAgICAgICBuZXdFbnRpdHlEID0gbmV3IEVudGl0eUQoKTsNCisgICAgICAgICAgICBuZXdFbnRpdHlELnNldE5hbWUoIm5ld0VudGl0eUQiKTsNCisgICAgICAgICAgICBuZXdFbnRpdHlDLnNldEVudGl0eUQobmV3RW50aXR5RCk7DQorICAgICAgICAgICAgZW50aXR5Qi5zZXRFbnRpdHlDKG5ld0VudGl0eUMpOw0KKw0KKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsNCisgICAgICAgICAgICBlbS5tZXJnZShlbnRpdHlCKTsNCisgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZmluYWxseSB7DQorICAgICAgICAgICAgaWYgKGVtLmdldFRyYW5zYWN0aW9uKCkuaXNBY3RpdmUoKSkNCisgICAgICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5yb2xsYmFjaygpOw0KKyAgICAgICAgICAgIGVtLmNsb3NlKCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1Rlc3RNYXBwaW5nVG9vbEF1dG9EZWxldGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9UZXN0TWFwcGluZ1Rvb2xBdXRvRGVsZXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2MjcwOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9UZXN0TWFwcGluZ1Rvb2xBdXRvRGVsZXRlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlLkFsbEZpZWxkVHlwZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworcHVibGljIGNsYXNzIFRlc3RNYXBwaW5nVG9vbEF1dG9EZWxldGUKKyAgICBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgSkRCQ0NvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mOworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICBwcm9wcy5wdXQoIm9wZW5qcGEuTWV0YURhdGFGYWN0b3J5IiwKKyAgICAgICAgICAgICJqcGEoVHlwZXM9IiArIEFsbEZpZWxkVHlwZXMuY2xhc3MuZ2V0TmFtZSgpICsgIikiKTsKKyAgICAgICAgZW1mID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoIAorICAgICAgICAgICAgUGVyc2lzdGVuY2UuY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkoInRlc3QiLCBwcm9wcykpOworICAgICAgICBfY29uZiA9IChKREJDQ29uZmlndXJhdGlvbikgZW1mLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QobmV3IEFsbEZpZWxkVHlwZXMoKSk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBlbWYuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ1Rvb2xBdXRvRGVsZXRlKCkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwcGluZ1Rvb2wuRmxhZ3MgZmxhZ3MgPSBuZXcgTWFwcGluZ1Rvb2wuRmxhZ3MoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGluZGlyZWN0IHZhbGlkYXRpb24gdGhhdCBjb21tYS1zZXBhcmF0ZWQgc2NoZW1hIGFjdGlvbnMgd29yaworICAgICAgICBmbGFncy5zY2hlbWFBY3Rpb24gPSBTY2hlbWFUb29sLkFDVElPTl9BREQgKyAiLCIgCisgICAgICAgICAgICArIFNjaGVtYVRvb2wuQUNUSU9OX0RFTEVURV9UQUJMRV9DT05URU5UUzsKKyAgICAgICAgCisgICAgICAgIE1hcHBpbmdUb29sLnJ1bihfY29uZiwgbmV3IFN0cmluZ1swXSwgZmxhZ3MsIG51bGwpOworCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDApLCAKKyAgICAgICAgICAgIGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgY291bnQobykgZnJvbSBBbGxGaWVsZFR5cGVzIG8iKQorICAgICAgICAgICAgICAgIC5nZXRTaW5nbGVSZXN1bHQoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1Rlc3RRdWVyeUNvbXBpbGF0aW9uQ2FjaGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UZXN0UXVlcnlDb21waWxhdGlvbkNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTBlZDJlMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9UZXN0UXVlcnlDb21waWxhdGlvbkNhY2hlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUltcGwuQ29tcGlsYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5qcHFsLkpQUUxFeHByZXNzaW9uQnVpbGRlci5QYXJzZWRKUFFMOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFRdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlLk5hbWVkRW50aXR5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBUZXN0UXVlcnlDb21waWxhdGlvbkNhY2hlCisgICAgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNKUFFMV2l0aE5hbWVkRW50aXR5KCkgeworICAgICAgICBNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcChTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgcHJvcHMucHV0KCJvcGVuanBhLk1ldGFEYXRhRmFjdG9yeSIsICJqcGEoVHlwZXM9IiAKKyAgICAgICAgICAgICsgTmFtZWRFbnRpdHkuY2xhc3MuZ2V0TmFtZSgpICsgIikiKTsKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZiA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KAorICAgICAgICAgICAgUGVyc2lzdGVuY2UuY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkoInRlc3QiLCBwcm9wcykpOworCisgICAgICAgIE1hcCBjYWNoZSA9IGVtZi5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UXVlcnlDb21waWxhdGlvbkNhY2hlSW5zdGFuY2UoKTsKKyAgICAgICAgY2FjaGUuY2xlYXIoKTsKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBPcGVuSlBBUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgbyBmcm9tIG5hbWVkIG8iKTsKKyAgICAgICAgcS5jb21waWxlKCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBhbiBlbnRyeSBpbiB0aGUgY2FjaGUgbm93CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjYWNoZS5zaXplKCkpOworICAgICAgICAKKyAgICAgICAgLy8gZGlnIGludG8gdGhlIGVudHJ5IGFuZCBjaGVjayBpdHMgaW50ZXJuYWwgc3RhdGUKKyAgICAgICAgQ29tcGlsYXRpb24gY29tcCA9IChDb21waWxhdGlvbikgY2FjaGUudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhOYW1lZEVudGl0eS5jbGFzcywKKyAgICAgICAgICAgICgoUGFyc2VkSlBRTCkgY29tcC5zdG9yZURhdGEpLmdldENhbmRpZGF0ZVR5cGUoKSk7CisgICAgICAgIAorICAgICAgICBlbWYuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9jYWxsYmFja3MvRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2NhbGxiYWNrcy9FeGNlcHRpb25zRnJvbUNhbGxiYWNrc0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9jYWxsYmFja3MvRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5jYWxsYmFja3M7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUG9zdExvYWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUHJlUGVyc2lzdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmVVcGRhdGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsKKworCitARW50aXR5CitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkgeworICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGhyb3dPblByZVBlcnNpc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIHRocm93T25QcmVVcGRhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIHRocm93T25Qb3N0TG9hZDsKKyAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGaWVsZDsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRUaHJvd09uUHJlUGVyc2lzdChib29sZWFuIGIpIHsKKyAgICAgICAgdGhyb3dPblByZVBlcnNpc3QgPSBiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRocm93T25Qb3N0TG9hZChib29sZWFuIGIpIHsKKyAgICAgICAgdGhyb3dPblBvc3RMb2FkID0gYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaHJvd09uUHJlVXBkYXRlKGJvb2xlYW4gYikgeworICAgICAgICB0aHJvd09uUHJlVXBkYXRlID0gYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdGaWVsZChTdHJpbmcgcykgeworICAgICAgICBzdHJpbmdGaWVsZCA9IHM7CisgICAgfQorCisgICAgQFByZVBlcnNpc3QKKyAgICBwdWJsaWMgdm9pZCBwcmVQZXJzaXN0KCkgeworICAgICAgICBpZiAodGhyb3dPblByZVBlcnNpc3QpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2FsbGJhY2tUZXN0RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQFByZVVwZGF0ZQorICAgIHB1YmxpYyB2b2lkIHByZVVwZGF0ZSgpIHsKKyAgICAgICAgaWYgKHRocm93T25QcmVVcGRhdGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2FsbGJhY2tUZXN0RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQFBvc3RMb2FkCisgICAgcHVibGljIHZvaWQgcG9zdExvYWQoKSB7CisgICAgICAgIGlmICh0aHJvd09uUG9zdExvYWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2FsbGJhY2tUZXN0RXhjZXB0aW9uKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBjbGFzcyBDYWxsYmFja1Rlc3RFeGNlcHRpb24KKyAgICAgICAgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9jYWxsYmFja3MvVGVzdEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9jYWxsYmFja3MvVGVzdEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZWRiZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2NhbGxiYWNrcy9UZXN0RXhjZXB0aW9uc0Zyb21DYWxsYmFja3MuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuY2FsbGJhY2tzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUm9sbGJhY2tFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQVBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5jYWxsYmFja3MuRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkuQ2FsbGJhY2tUZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNpbmdsZUVNRlRlc3RDYXNlOworCisvKioKKyAqIFRlc3RzIGFnYWluc3QgSlBBIHNlY3Rpb24gMy41J3MgZGVzY3JpcHRpb24gb2YgY2FsbGJhY2sgZXhjZXB0aW9uIGhhbmRsaW5nLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVQZXJzaXN0RXhjZXB0aW9uKCkgeworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBFeGNlcHRpb25zRnJvbUNhbGxiYWNrc0VudGl0eSBvID0gbmV3IEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzRW50aXR5KCk7CisgICAgICAgIG8uc2V0VGhyb3dPblByZVBlcnNpc3QodHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5wZXJzaXN0KG8pOworICAgICAgICAgICAgZmFpbCgicGVyc2lzdCBzaG91bGQgaGF2ZSBmYWlsZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FsbGJhY2tUZXN0RXhjZXB0aW9uIGN0ZSkgeworICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHN0aWxsIGFjdGl2ZSwgYnV0IG1hcmtlZCBmb3Igcm9sbGJhY2sKKyAgICAgICAgICAgIGFzc2VydFRydWUoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZW0uZ2V0VHJhbnNhY3Rpb24oKS5nZXRSb2xsYmFja09ubHkoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkucm9sbGJhY2soKTsKKyAgICAgICAgICAgIGVtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlVXBkYXRlRXhjZXB0aW9uRHVyaW5nRmx1c2goKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzRW50aXR5IG8gPSBuZXcgRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkoKTsKKyAgICAgICAgby5zZXRUaHJvd09uUHJlVXBkYXRlKHRydWUpOworICAgICAgICBlbS5wZXJzaXN0KG8pOworICAgICAgICBvLnNldFN0cmluZ0ZpZWxkKCJmb28iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmZsdXNoKCk7CisgICAgICAgICAgICBmYWlsKCJmbHVzaCBzaG91bGQgaGF2ZSBmYWlsZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FsbGJhY2tUZXN0RXhjZXB0aW9uIGN0ZSkgeworICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHN0aWxsIGFjdGl2ZSwgYnV0IG1hcmtlZCBmb3Igcm9sbGJhY2sKKyAgICAgICAgICAgIGFzc2VydFRydWUoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZW0uZ2V0VHJhbnNhY3Rpb24oKS5nZXRSb2xsYmFja09ubHkoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkucm9sbGJhY2soKTsKKyAgICAgICAgICAgIGVtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlVXBkYXRlRXhjZXB0aW9uRHVyaW5nQ29tbWl0KCkgeworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBFeGNlcHRpb25zRnJvbUNhbGxiYWNrc0VudGl0eSBvID0gbmV3IEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzRW50aXR5KCk7CisgICAgICAgIG8uc2V0VGhyb3dPblByZVVwZGF0ZSh0cnVlKTsKKyAgICAgICAgZW0ucGVyc2lzdChvKTsKKyAgICAgICAgby5zZXRTdHJpbmdGaWVsZCgiZm9vIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICAgICAgZmFpbCgiY29tbWl0IHNob3VsZCBoYXZlIGZhaWxlZCIpOworICAgICAgICB9IGNhdGNoIChSb2xsYmFja0V4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENhbGxiYWNrVGVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICByZS5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcm9sbGVkIGJhY2sgYXQgdGhpcyBwb2ludAorICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChlbS5nZXRUcmFuc2FjdGlvbigpLmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5yb2xsYmFjaygpOworICAgICAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdExvYWRFeGNlcHRpb24oKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzRW50aXR5IG8gPSBuZXcgRXhjZXB0aW9uc0Zyb21DYWxsYmFja3NFbnRpdHkoKTsKKyAgICAgICAgby5zZXRUaHJvd09uUG9zdExvYWQodHJ1ZSk7CisgICAgICAgIGVtLnBlcnNpc3Qobyk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIE9iamVjdCBvaWQgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuZ2V0T2JqZWN0SWQobyk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgICAgIAorICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG8gPSBlbS5maW5kKEV4Y2VwdGlvbnNGcm9tQ2FsbGJhY2tzRW50aXR5LmNsYXNzLCBvaWQpOworICAgICAgICAgICAgZmFpbCgiZmluZCBzaG91bGQgaGF2ZSBmYWlsZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FsbGJhY2tUZXN0RXhjZXB0aW9uIGN0ZSkgeworICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjdGl2ZSBidXQgbWFya2VkIGZvciByb2xsYmFjaworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbS5nZXRUcmFuc2FjdGlvbigpLmlzQWN0aXZlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbS5nZXRUcmFuc2FjdGlvbigpLmdldFJvbGxiYWNrT25seSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChlbS5nZXRUcmFuc2FjdGlvbigpLmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5yb2xsYmFjaygpOworICAgICAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9DYXNjYWRlQ2hpbGQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9DYXNjYWRlQ2hpbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGM0ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvZGF0YWNhY2hlL0Nhc2NhZGVDaGlsZC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmRhdGFjYWNoZTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKKworQEVudGl0eQorcHVibGljIGNsYXNzIENhc2NhZGVDaGlsZCB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IAorICAgICAgICByZXR1cm4gaWQ7IAorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgCisgICAgICAgIHJldHVybiBuYW1lOyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IAorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvQ2FzY2FkZVBhcmVudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvZGF0YWNhY2hlL0Nhc2NhZGVQYXJlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMTdlZDZkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvZGF0YWNhY2hlL0Nhc2NhZGVQYXJlbnQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBDYXNjYWRlUGFyZW50IHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAT25lVG9PbmUoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpCisgICAgcHJpdmF0ZSBDYXNjYWRlQ2hpbGQgY2hpbGQ7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsgCisgICAgICAgIHJldHVybiBpZDsgCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyAKKyAgICAgICAgcmV0dXJuIG5hbWU7IAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsgCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IAorICAgIH0KKworICAgIHB1YmxpYyBDYXNjYWRlQ2hpbGQgZ2V0Q2hpbGQoKSB7CisgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZChDYXNjYWRlQ2hpbGQgY2hpbGQpIHsKKyAgICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9PcHRpbWlzdGljTG9ja0luc3RhbmNlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvT3B0aW1pc3RpY0xvY2tJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTIxMjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvT3B0aW1pc3RpY0xvY2tJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmRhdGFjYWNoZTsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlOw0KKw0KK0BFbnRpdHkNCitAVGFibGUobmFtZT0iT1BUSU1JU1RJQ19MT0NLX0lOU1RBTkNFIikNCitwdWJsaWMgY2xhc3MgT3B0aW1pc3RpY0xvY2tJbnN0YW5jZSB7DQorICAgIEBJZCBAR2VuZXJhdGVkVmFsdWUgDQorICAgIHByaXZhdGUgaW50IHBrOw0KKw0KKyAgICBAVmVyc2lvbiANCisgICAgcHJpdmF0ZSBpbnQgb3Bsb2NrOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBzdHI7DQorDQorICAgIHByb3RlY3RlZCBPcHRpbWlzdGljTG9ja0luc3RhbmNlKCkgeyB9DQorDQorICAgIHB1YmxpYyBPcHRpbWlzdGljTG9ja0luc3RhbmNlKFN0cmluZyBzdHIpIHsNCisgICAgICAgIHRoaXMuc3RyID0gc3RyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0UEsoKSB7DQorICAgICAgICByZXR1cm4gcGs7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRPcExvY2soKSB7DQorICAgICAgICByZXR1cm4gb3Bsb2NrOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyKCkgew0KKyAgICAgICAgcmV0dXJuIHN0cjsNCisgICAgfQ0KK30NCisgIA0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9UZXN0QXJyYXlGaWVsZHNJbkRhdGFDYWNoZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvZGF0YWNhY2hlL1Rlc3RBcnJheUZpZWxkc0luRGF0YUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzNDZmMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9UZXN0QXJyYXlGaWVsZHNJbkRhdGFDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5kYXRhY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGF0YUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUENEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlLkFsbEZpZWxkVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QXJyYXlGaWVsZHNJbkRhdGFDYWNoZQorICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RSSU5HUyA9IG5ldyBTdHJpbmdbXXsgImEiLCAiYiIsICJjIiB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIElOVFMgPSBuZXcgaW50W117IDEsIDIsIDMgfTsKKworICAgIHByaXZhdGUgT2JqZWN0IGpwYU9pZDsKKyAgICBwcml2YXRlIE9iamVjdCBpbnRlcm5hbE9pZDsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcCgib3BlbmpwYS5EYXRhQ2FjaGUiLCAidHJ1ZSIsIAorICAgICAgICAgICAgIm9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIiLCAic2p2bSIsIAorICAgICAgICAgICAgQWxsRmllbGRUeXBlcy5jbGFzcyk7CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSBuZXcgQWxsRmllbGRUeXBlcygpOworICAgICAgICBhZnQuc2V0QXJyYXlPZlN0cmluZ3MoU1RSSU5HUyk7CisgICAgICAgIGFmdC5zZXRBcnJheU9mSW50cyhJTlRTKTsKKyAgICAgICAgZW0ucGVyc2lzdChhZnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworCisgICAgICAgIC8vIGdldCB0aGUgZXh0ZXJuYWwgYW5kIGludGVybmFsIGZvcm1zIG9mIHRoZSBJRCBmb3IgY2FjaGUKKyAgICAgICAgLy8gaW50ZXJyb2dhdGlvbiBhbmQgZGF0YSB2YWxpZGF0aW9uCisgICAgICAgIGpwYU9pZCA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKS5nZXRPYmplY3RJZChhZnQpOworICAgICAgICBpbnRlcm5hbE9pZCA9IE9wZW5KUEFQZXJzaXN0ZW5jZS50b0Jyb2tlcihlbSkuZ2V0T2JqZWN0SWQoYWZ0KTsKKworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheU9mU3RyaW5ncygpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgZGF0YSBjYWNoZSBjb250YWlucyBhbiBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24KKyAgICAgICAgRGF0YUNhY2hlIGNhY2hlID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW1mKS5nZXRTdG9yZUNhY2hlKCkKKyAgICAgICAgICAgIC5nZXREZWxlZ2F0ZSgpOworICAgICAgICBQQ0RhdGEgZGF0YSA9IGNhY2hlLmdldChpbnRlcm5hbE9pZCk7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5nZXRNZXRhRGF0YShlbWYsCisgICAgICAgICAgICBBbGxGaWVsZFR5cGVzLmNsYXNzKTsKKyAgICAgICAgT2JqZWN0IGNhY2hlZEZpZWxkRGF0YSA9CisgICAgICAgICAgICBkYXRhLmdldERhdGEobWV0YS5nZXRGaWVsZCgiYXJyYXlPZlN0cmluZ3MiKS5nZXRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWNoZWRGaWVsZERhdGEuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgY2FjaGVkRmllbGREYXRhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgcmVzdWx0cyBhcmUgY29ycmVjdAorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSBlbS5maW5kKEFsbEZpZWxkVHlwZXMuY2xhc3MsIGpwYU9pZCk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhTVFJJTkdTLCBhZnQuZ2V0QXJyYXlPZlN0cmluZ3MoKSkpOworICAgICAgICBhc3NlcnROb3RTYW1lKFNUUklOR1MsIGFmdC5nZXRBcnJheU9mU3RyaW5ncygpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlPZkludHMoKSB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGRhdGEgY2FjaGUgY29udGFpbnMgYW4gZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uCisgICAgICAgIERhdGFDYWNoZSBjYWNoZSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtZikuZ2V0U3RvcmVDYWNoZSgpCisgICAgICAgICAgICAuZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgUENEYXRhIGRhdGEgPSBjYWNoZS5nZXQoaW50ZXJuYWxPaWQpOworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBPcGVuSlBBUGVyc2lzdGVuY2UuZ2V0TWV0YURhdGEoZW1mLAorICAgICAgICAgICAgQWxsRmllbGRUeXBlcy5jbGFzcyk7CisgICAgICAgIE9iamVjdCBjYWNoZWRGaWVsZERhdGEgPQorICAgICAgICAgICAgZGF0YS5nZXREYXRhKG1ldGEuZ2V0RmllbGQoImFycmF5T2ZJbnRzIikuZ2V0SW5kZXgoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FjaGVkRmllbGREYXRhLmdldENsYXNzKCkuaXNBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgY2FjaGVkRmllbGREYXRhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgcmVzdWx0cyBhcmUgY29ycmVjdAorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSBlbS5maW5kKEFsbEZpZWxkVHlwZXMuY2xhc3MsIGpwYU9pZCk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhJTlRTLCBhZnQuZ2V0QXJyYXlPZkludHMoKSkpOworICAgICAgICBhc3NlcnROb3RTYW1lKElOVFMsIGFmdC5nZXRBcnJheU9mSW50cygpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvVGVzdEJ1bGtKUFFMQW5kRGF0YUNhY2hlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvVGVzdEJ1bGtKUFFMQW5kRGF0YUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNzAzNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9UZXN0QnVsa0pQUUxBbmREYXRhQ2FjaGUuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuZGF0YWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFFbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnNpbXBsZS5BbGxGaWVsZFR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNpbmdsZUVNRlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdEJ1bGtKUFFMQW5kRGF0YUNhY2hlCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIE9iamVjdCBvaWQ7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRVcCgib3BlbmpwYS5EYXRhQ2FjaGUiLCAidHJ1ZSIsCisgICAgICAgICAgICAib3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlciIsICJzanZtIiwKKyAgICAgICAgICAgIEFsbEZpZWxkVHlwZXMuY2xhc3MsIENhc2NhZGVQYXJlbnQuY2xhc3MsIENhc2NhZGVDaGlsZC5jbGFzcyk7CisKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIEFsbEZpZWxkVHlwZXMgcGMgPSBuZXcgQWxsRmllbGRUeXBlcygpOworICAgICAgICBwYy5zZXRTdHJpbmdGaWVsZCgiRGVsZXRlTWUiKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYyk7CisgICAgICAgIG9pZCA9IGVtLmdldE9iamVjdElkKHBjKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVsa0RlbGV0ZSgpIHsKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIExpc3QgcmVzdWx0ID0gZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCBvIEZST00gQWxsRmllbGRUeXBlcyBvIikKKyAgICAgICAgICAgIC5nZXRSZXN1bHRMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgZW0uY3JlYXRlUXVlcnkoIkRFTEVURSBGUk9NIEFsbEZpZWxkVHlwZXMgbyIpLmV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gdGhpcyBhc3N1bWVzIHRoYXQgd2UgaW52YWxpZGF0ZSB0aGUgY2FjaGUsIHJhdGhlciB0aGFuIHVwZGF0ZSBpdAorICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIGJ1bGsgcnVsZS4KKyAgICAgICAgYXNzZXJ0RmFsc2UoT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW1mKS5nZXRTdG9yZUNhY2hlKCkKKyAgICAgICAgICAgIC5jb250YWlucyhBbGxGaWVsZFR5cGVzLmNsYXNzLCBvaWQpKTsKKworICAgICAgICBhc3NlcnROdWxsKGVtLmZpbmQoQWxsRmllbGRUeXBlcy5jbGFzcywgb2lkKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ1bGtVcGRhdGUoKSB7CisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIExpc3QgcmVzdWx0ID0gZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCBvIEZST00gQWxsRmllbGRUeXBlcyBvICIKKyAgICAgICAgICAgICsgIldIRVJFIG8uaW50RmllbGQgPSAwIikuZ2V0UmVzdWx0TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIGVtLmNyZWF0ZVF1ZXJ5KCJVUERBVEUgQWxsRmllbGRUeXBlcyBvIFNFVCBvLmludEZpZWxkID0gMTAiKQorICAgICAgICAgICAgLmV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gdGhpcyBhc3N1bWVzIHRoYXQgd2UgaW52YWxpZGF0ZSB0aGUgY2FjaGUsIHJhdGhlciB0aGFuIHVwZGF0ZSBpdAorICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIGJ1bGsgcnVsZS4KKyAgICAgICAgYXNzZXJ0RmFsc2UoT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW1mKS5nZXRTdG9yZUNhY2hlKCkKKyAgICAgICAgICAgIC5jb250YWlucyhBbGxGaWVsZFR5cGVzLmNsYXNzLCBvaWQpKTsKKworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWxrRGVsZXRlT2ZDYXNjYWRpbmdFbnRpdHkoKSB7CisgICAgICAgIENhc2NhZGVQYXJlbnQgcGFyZW50ID0gbmV3IENhc2NhZGVQYXJlbnQoKTsKKyAgICAgICAgcGFyZW50LnNldE5hbWUoInBhcmVudCIpOworICAgICAgICBDYXNjYWRlQ2hpbGQgY2hpbGQgPSBuZXcgQ2FzY2FkZUNoaWxkKCk7CisgICAgICAgIGNoaWxkLnNldE5hbWUoImNoaWxkIik7CisgICAgICAgIHBhcmVudC5zZXRDaGlsZChjaGlsZCk7CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworCisgICAgICAgIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVtLmNyZWF0ZVF1ZXJ5KCJTRUxFQ1QgbyBGUk9NIENhc2NhZGVQYXJlbnQgbyIpLgorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBlbS5jcmVhdGVRdWVyeSgiU0VMRUNUIG8gRlJPTSBDYXNjYWRlQ2hpbGQgbyIpLgorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpLnNpemUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLmNyZWF0ZVF1ZXJ5KCJERUxFVEUgRlJPTSBDYXNjYWRlUGFyZW50IG8iKS5leGVjdXRlVXBkYXRlKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCBvIEZST00gQ2FzY2FkZVBhcmVudCBvIikuCisgICAgICAgICAgICBnZXRSZXN1bHRMaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVtLmNyZWF0ZVF1ZXJ5KCJTRUxFQ1QgbyBGUk9NIENhc2NhZGVDaGlsZCBvIikuCisgICAgICAgICAgICBnZXRSZXN1bHRMaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvVGVzdERhdGFDYWNoZU9wdGltaXN0aWNMb2NrUmVjb3ZlcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RhdGFjYWNoZS9UZXN0RGF0YUNhY2hlT3B0aW1pc3RpY0xvY2tSZWNvdmVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjRmZjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kYXRhY2FjaGUvVGVzdERhdGFDYWNoZU9wdGltaXN0aWNMb2NrUmVjb3ZlcnkuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuZGF0YWNhY2hlOw0KKw0KK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsNCitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Sb2xsYmFja0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTG9ja01vZGVUeXBlOw0KK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7DQorDQorcHVibGljIGNsYXNzIFRlc3REYXRhQ2FjaGVPcHRpbWlzdGljTG9ja1JlY292ZXJ5DQorICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2Ugew0KKw0KKyAgICBwcml2YXRlIGludCBwazsNCisNCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7DQorICAgICAgICBzZXRVcCgib3BlbmpwYS5EYXRhQ2FjaGUiLCAidHJ1ZSIsDQorICAgICAgICAgICAgIm9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIiLCAic2p2bSIsDQorICAgICAgICAgICAgT3B0aW1pc3RpY0xvY2tJbnN0YW5jZS5jbGFzcyk7DQorDQorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsNCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsNCisgICAgICAgIE9wdGltaXN0aWNMb2NrSW5zdGFuY2Ugb2xpID0gbmV3IE9wdGltaXN0aWNMb2NrSW5zdGFuY2UoImZvbyIpOw0KKyAgICAgICAgZW0ucGVyc2lzdChvbGkpOw0KKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsNCisgICAgICAgIHBrID0gb2xpLmdldFBLKCk7DQorICAgICAgICBlbS5jbG9zZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpbWlzdGljTG9ja1JlY292ZXJ5KCkgDQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisNCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW07DQorICAgICAgICANCisgICAgICAgIC8vIDEuIGdldCB0aGUgb3Bsb2NrIHZhbHVlIGZvciB0aGUgaW5zdGFuY2UgYWZ0ZXIgY29tbWl0IGFuZA0KKyAgICAgICAgLy8gZ2V0IGEgcmVhZCBsb2NrIHRvIGVuc3VyZSB0aGF0IHdlIGNoZWNrIGZvciB0aGUgb3B0aW1pc3RpYw0KKyAgICAgICAgLy8gbG9jayBjb2x1bW4gYXQgdHggY29tbWl0Lg0KKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOw0KKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgT3B0aW1pc3RpY0xvY2tJbnN0YW5jZSBvbGkgPSBlbS5maW5kKE9wdGltaXN0aWNMb2NrSW5zdGFuY2UuY2xhc3MsIHBrKTsNCisgICAgICAgIGludCBmaXJzdE9wTG9ja1ZhbHVlID0gb2xpLmdldE9wTG9jaygpOw0KKyAgICAgICAgZW0ubG9jayhvbGksIExvY2tNb2RlVHlwZS5SRUFEKTsNCisNCisgICAgICAgIC8vIDIuIG1ha2UgYSBjaGFuZ2UgdG8gdGhlIGluc3RhbmNlJ3Mgb3B0aW1pc3RpYyBsb2NrIGNvbHVtbg0KKyAgICAgICAgLy8gdmlhIGRpcmVjdCBTUUwgaW4gYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbg0KKyAgICAgICAgaW50IHNlY29uZE9wTG9ja1ZhbHVlID0gZmlyc3RPcExvY2tWYWx1ZSArIDE7DQorDQorICAgICAgICBEYXRhU291cmNlIGRzID0gKERhdGFTb3VyY2UpIE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKQ0KKyAgICAgICAgICAgIC5nZXRFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpLmdldENvbmZpZ3VyYXRpb24oKQ0KKyAgICAgICAgICAgIC5nZXRDb25uZWN0aW9uRmFjdG9yeSgpOw0KKyAgICAgICAgQ29ubmVjdGlvbiBjID0gZHMuZ2V0Q29ubmVjdGlvbigpOw0KKyAgICAgICAgYy5zZXRBdXRvQ29tbWl0KGZhbHNlKTsNCisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzID0gYy5wcmVwYXJlU3RhdGVtZW50KA0KKyAgICAgICAgICAgICJVUERBVEUgT1BUSU1JU1RJQ19MT0NLX0lOU1RBTkNFIFNFVCBPUExPQ0sgPSA/IFdIRVJFIFBLID0gPyIpOw0KKyAgICAgICAgcHMuc2V0SW50KDEsIHNlY29uZE9wTG9ja1ZhbHVlKTsNCisgICAgICAgIHBzLnNldEludCgyLCBwayk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHMuZXhlY3V0ZVVwZGF0ZSgpKTsNCisgICAgICAgIGMuY29tbWl0KCk7DQorICAgICAgICANCisgICAgICAgIC8vIDMuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24sIGNhdGNoaW5nIHRoZSBleHBlY3RlZCBvcGxvY2sNCisgICAgICAgIC8vIGV4Y2VwdGlvbg0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOw0KKyAgICAgICAgICAgIGZhaWwoInR4IHNob3VsZCBoYXZlIGZhaWxlZCBkdWUgdG8gb3V0LW9mLWJhbmQgb3Bsb2NrIGNoYW5nZSIpOw0KKyAgICAgICAgfSBjYXRjaCAoUm9sbGJhY2tFeGNlcHRpb24gcmUpIHsNCisgICAgICAgICAgICAvLyBleHBlY3RlZA0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICBpZiAoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKQ0KKyAgICAgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLnJvbGxiYWNrKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyA0LiBvYnRhaW4gdGhlIG9iamVjdCBpbiBhIG5ldyBwZXJzaXN0ZW5jZSBjb250ZXh0IGFuZA0KKyAgICAgICAgLy8gYXNzZXJ0IHRoYXQgdGhlIG9wbG9jayBjb2x1bW4gaXMgc2V0IHRvIHRoZSBvbmUgdGhhdA0KKyAgICAgICAgLy8gaGFwcGVuZWQgaW4gdGhlIG91dC1vZi1iYW5kIHRyYW5zYWN0aW9uDQorICAgICAgICBlbS5jbG9zZSgpOw0KKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOw0KKyAgICAgICAgb2xpID0gZW0uZmluZChPcHRpbWlzdGljTG9ja0luc3RhbmNlLmNsYXNzLCBwayk7DQorDQorICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCB0aGVuIHRoZSBkYXRhIGNhY2hlIGhhcyB0aGUgd3JvbmcgdmFsdWUuDQorICAgICAgICAvLyBUaGlzIGlzIHdoYXQgdGhpcyB0ZXN0IGNhc2UgaXMgZGVzaWduZWQgdG8gZXhlcmNpc2UuDQorICAgICAgICBhc3NlcnRFcXVhbHMoImRhdGEgY2FjaGUgaXMgbm90IGJlaW5nIGNsZWFyZWQgd2hlbiBvcGxvY2sgIg0KKyAgICAgICAgICAgICsgInZpb2xhdGlvbnMgb2NjdXIiLCBzZWNvbmRPcExvY2tWYWx1ZSwgb2xpLmdldE9wTG9jaygpKTsNCisNCisgICAgICAgIC8vIDUuIGdldCBhIHJlYWQgbG9jayBvbiB0aGUgaW5zdGFuY2UgYW5kIGNvbW1pdCB0aGUgdHg7IHRoaXMNCisgICAgICAgIC8vIHRpbWUgaXQgc2hvdWxkIGdvIHRocm91Z2gNCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsNCisgICAgICAgIGVtLmxvY2sob2xpLCBMb2NrTW9kZVR5cGUuUkVBRCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7DQorICAgICAgICB9IGNhdGNoIChSb2xsYmFja0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgICAgICB0aHJvdyBlOw0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICBpZiAoZW0uZ2V0VHJhbnNhY3Rpb24oKS5pc0FjdGl2ZSgpKQ0KKyAgICAgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLnJvbGxiYWNrKCk7DQorICAgICAgICB9DQorICAgICAgICBlbS5jbG9zZSgpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwZWN0ZWRPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbigpIHsNCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW07DQorICAgICAgICANCisgICAgICAgIC8vIDEuIHN0YXJ0IGEgbmV3IHR4DQorICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7DQorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7DQorICAgICAgICBlbS5sb2NrKGVtLmZpbmQoT3B0aW1pc3RpY0xvY2tJbnN0YW5jZS5jbGFzcywgcGspLCBMb2NrTW9kZVR5cGUuUkVBRCk7DQorICAgICAgICANCisgICAgICAgIC8vIDIuIHN0YXJ0IGFub3RoZXIgdHgsIGFuZCBjYXVzZSBhIHZlcnNpb24gaW5jcmVtZW50DQorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtMiA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7DQorICAgICAgICBlbTIuZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgZW0yLmxvY2soZW0yLmZpbmQoT3B0aW1pc3RpY0xvY2tJbnN0YW5jZS5jbGFzcywgcGspLCANCisgICAgICAgICAgICBMb2NrTW9kZVR5cGUuV1JJVEUpOw0KKyAgICAgICAgZW0yLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7DQorICAgICAgICBlbTIuY2xvc2UoKTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gMy4gdHJ5IHRvIGNvbW1pdC4gdGhpcyBzaG91bGQgZmFpbCwgYXMgdGhpcyBpcyBhIHJlZ3VsYXIgb3B0aW1pc3RpYw0KKyAgICAgICAgLy8gbG9jayBmYWlsdXJlIHNpdHVhdGlvbi4NCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsNCisgICAgICAgICAgICBmYWlsKCJ3cml0ZSBsb2NrIGluIGVtMiBzaG91bGQgdHJpZ2dlciBhbiBvcHRpbWlzdGljIGxvY2sgZmFpbHVyZSIpOw0KKyAgICAgICAgfSBjYXRjaCAoUm9sbGJhY2tFeGNlcHRpb24gcGUpIHsNCisgICAgICAgICAgICAvLyBleHBlY3RlZA0KKyAgICAgICAgfQ0KKyAgICAgICAgZW0uY2xvc2UoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L0RldGFjaG1lbnRPbmVNYW55Q2hpbGQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RldGFjaG1lbnQvRGV0YWNobWVudE9uZU1hbnlDaGlsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjM2RhMmUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L0RldGFjaG1lbnRPbmVNYW55Q2hpbGQuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5kZXRhY2htZW50Ow0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5Gb3JlaWduS2V5Ow0KKw0KK0BFbnRpdHkNCitwdWJsaWMgY2xhc3MgRGV0YWNobWVudE9uZU1hbnlDaGlsZCB7DQorDQorICAgIEBJZA0KKyAgICBAR2VuZXJhdGVkVmFsdWUNCisgICAgcHJpdmF0ZSBsb25nIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBATWFueVRvT25lKG9wdGlvbmFsPWZhbHNlKQ0KKyAgICBASm9pbkNvbHVtbihuYW1lPSJQQVJFTlRfSUQiLCBudWxsYWJsZT1mYWxzZSkNCisgICAgQEZvcmVpZ25LZXkNCisgICAgcHJpdmF0ZSBEZXRhY2htZW50T25lTWFueVBhcmVudCBwYXJlbnQ7DQorDQorICAgIEBWZXJzaW9uDQorICAgIHByaXZhdGUgSW50ZWdlciBvcHRMb2NrOw0KKw0KKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsgDQorICAgICAgICByZXR1cm4gaWQ7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgDQorICAgICAgICByZXR1cm4gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyANCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBEZXRhY2htZW50T25lTWFueVBhcmVudCBnZXRQYXJlbnQoKSB7IA0KKyAgICAgICAgcmV0dXJuIHBhcmVudDsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KERldGFjaG1lbnRPbmVNYW55UGFyZW50IHBhcmVudCkgeyANCisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L0RldGFjaG1lbnRPbmVNYW55UGFyZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L0RldGFjaG1lbnRPbmVNYW55UGFyZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjcyMjRmYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RldGFjaG1lbnQvRGV0YWNobWVudE9uZU1hbnlQYXJlbnQuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5kZXRhY2htZW50Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIERldGFjaG1lbnRPbmVNYW55UGFyZW50IHsNCisNCisgICAgQElkDQorICAgIEBHZW5lcmF0ZWRWYWx1ZQ0KKyAgICBwcml2YXRlIGxvbmcgaWQ7DQorDQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorDQorICAgIEBPbmVUb01hbnkobWFwcGVkQnk9InBhcmVudCIsIGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMLCANCisgICAgICAgIGZldGNoPUZldGNoVHlwZS5FQUdFUikNCisgICAgQE9yZGVyQnkoIm5hbWUgQVNDIikNCisgICAgcHJpdmF0ZSBMaXN0PERldGFjaG1lbnRPbmVNYW55Q2hpbGQ+IGNoaWxkcmVuID0gDQorICAgICAgICBuZXcgQXJyYXlMaXN0PERldGFjaG1lbnRPbmVNYW55Q2hpbGQ+KCk7DQorDQorICAgIEBWZXJzaW9uDQorICAgIHByaXZhdGUgSW50ZWdlciBvcHRMb2NrOw0KKw0KKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsgDQorICAgICAgICByZXR1cm4gaWQ7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBMaXN0PERldGFjaG1lbnRPbmVNYW55Q2hpbGQ+IGdldENoaWxkcmVuKCkgeyANCisgICAgICAgIHJldHVybiBjaGlsZHJlbjsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoRGV0YWNobWVudE9uZU1hbnlDaGlsZCBjaGlsZCkgew0KKyAgICAgICAgY2hpbGQuc2V0UGFyZW50KHRoaXMpOw0KKyAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IA0KKyAgICAgICAgcmV0dXJuIG5hbWU7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsgDQorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L1Rlc3RBdHRhY2hXaXRoTm9DaGFuZ2VzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L1Rlc3RBdHRhY2hXaXRoTm9DaGFuZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWFhMzNlMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RldGFjaG1lbnQvVGVzdEF0dGFjaFdpdGhOb0NoYW5nZXMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5kZXRhY2htZW50OworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PcHRpbWlzdGljTG9ja0V4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNpbmdsZUVNRlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgdGhhdCBhdHRhY2hpbmcgYW4gaW5zdGFuY2Ugd2l0aG91dCBoYXZpbmcgY2hhbmdlZCBpdCBzdGlsbCBvdmVyd3JpdGVzCisgKiBhbnkgY2hhbmdlcyB0byB0aGUgbWFuYWdlZCBjb3B5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXR0YWNoV2l0aE5vQ2hhbmdlcworICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKERldGFjaG1lbnRPbmVNYW55UGFyZW50LmNsYXNzLCBEZXRhY2htZW50T25lTWFueUNoaWxkLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNoV2l0aE5vQ2hhbmdlc0NoZWNrc1ZlcnNpb24oKSB7CisgICAgICAgIERldGFjaG1lbnRPbmVNYW55Q2hpbGQgZSA9IG5ldyBEZXRhY2htZW50T25lTWFueUNoaWxkKCk7CisgICAgICAgIERldGFjaG1lbnRPbmVNYW55UGFyZW50IHAgPSBuZXcgRGV0YWNobWVudE9uZU1hbnlQYXJlbnQoKTsKKyAgICAgICAgZS5zZXROYW1lKCJvcmlnIik7CisgICAgICAgIHAuYWRkQ2hpbGQoZSk7CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChwKTsKKyAgICAgICAgZW0ucGVyc2lzdChlKTsKKyAgICAgICAgZW0uZmx1c2goKTsKKyAgICAgICAgZW0uY2xlYXIoKTsKKyAgICAgICAgCisgICAgICAgIERldGFjaG1lbnRPbmVNYW55Q2hpbGQgY2hhbmdlZCA9IGVtLmZpbmQoRGV0YWNobWVudE9uZU1hbnlDaGlsZC5jbGFzcywKKyAgICAgICAgICAgIGUuZ2V0SWQoKSk7IAorICAgICAgICBjaGFuZ2VkLnNldE5hbWUoIm5ld25hbWUiKTsKKyAgICAgICAgZW0uZmx1c2goKTsKKworICAgICAgICBlbS5tZXJnZShlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmZsdXNoKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGJlIGFibGUgdG8gZmx1c2ggb2xkIHZlcnNpb24gb3ZlciBuZXcuIik7CisgICAgICAgIH0gY2F0Y2ggKE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uIG9sZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChlbS5nZXRUcmFuc2FjdGlvbigpLmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5yb2xsYmFjaygpOworICAgICAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdEF0dGFjaFdpdGhOb0NoYW5nZXMuY2xhc3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvZGV0YWNobWVudC9UZXN0RGV0YWNobWVudE9uZU1hbnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RldGFjaG1lbnQvVGVzdERldGFjaG1lbnRPbmVNYW55LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDVjMGVlOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RldGFjaG1lbnQvVGVzdERldGFjaG1lbnRPbmVNYW55LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmRldGFjaG1lbnQ7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BdXRvRGV0YWNoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgZGV0YWNobWVudCBmb3IgYmlkaXJlY3Rpb25hbCBvbmUtbWFueSByZWxhdGlvbnNoaXAKKyAqCisgKiBAYXV0aG9yIERhdmlkIEV6emlvCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RGV0YWNobWVudE9uZU1hbnkKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChEZXRhY2htZW50T25lTWFueVBhcmVudC5jbGFzcywgRGV0YWNobWVudE9uZU1hbnlDaGlsZC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGFjaG1lbnQoKSB7CisgICAgICAgIGxvbmcgaWQgPSBjcmVhdGVQYXJlbnRBbmRDaGlsZHJlbigpOworICAgIAorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pLnNldEF1dG9EZXRhY2goQXV0b0RldGFjaC5ERVRBQ0hfTk9OVFhSRUFEKTsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlQYXJlbnQgcGFyZW50ID0gZW0uZmluZChEZXRhY2htZW50T25lTWFueVBhcmVudC5jbGFzcywKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIHBhcmVudCB3YXMgbm90IGRldGFjaGVkIiwgZW0uY29udGFpbnMocGFyZW50KSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aERldGFjaCgpIHsKKyAgICAgICAgbG9uZyBpZCA9IGNyZWF0ZVBhcmVudEFuZENoaWxkcmVuKCk7CisgICAgIAorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pLnNldEF1dG9EZXRhY2goQXV0b0RldGFjaC5ERVRBQ0hfTk9OVFhSRUFEKTsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlQYXJlbnQgcGFyZW50ID0gZW0uZmluZChEZXRhY2htZW50T25lTWFueVBhcmVudC5jbGFzcywKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudCIsIHBhcmVudC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlDaGlsZCBjaGlsZDAgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7CisgICAgICAgIERldGFjaG1lbnRPbmVNYW55Q2hpbGQgY2hpbGQxID0gcGFyZW50LmdldENoaWxkcmVuKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJEaWQgbm90IGZpbmQgZXhwZWN0ZWQgZmlyc3QgY2hpbGQiLCBjaGlsZDApOworICAgICAgICBhc3NlcnROb3ROdWxsKCJEaWQgbm90IGZpbmQgZXhwZWN0ZWQgc2Vjb25kIGNoaWxkIiwgY2hpbGQxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZDAiLCBjaGlsZDAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBmaXJzdCBjaGlsZCB3YXMgbm90IGRldGFjaGVkIiwgZW0uY29udGFpbnMoY2hpbGQwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQxIiwgY2hpbGQxLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgc2Vjb25kIGNoaWxkIHdhcyBub3QgZGV0YWNoZWQiLCBlbS5jb250YWlucyhjaGlsZDEpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aERldGFjaEZvclRvT25lUmVsYXRpb25zaGlwKCkgeworICAgICAgICBsb25nIGlkID0gY3JlYXRlUGFyZW50QW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuc2V0QXV0b0RldGFjaChBdXRvRGV0YWNoLkRFVEFDSF9OT05UWFJFQUQpOworICAgICAgICBEZXRhY2htZW50T25lTWFueVBhcmVudCBwYXJlbnQgPSBlbS5maW5kKERldGFjaG1lbnRPbmVNYW55UGFyZW50LmNsYXNzLAorICAgICAgICAgICAgaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRvT25lIHJlbGF0aW9uc2hpcCB3YXMgbm90IGVhZ2VybHkgZmV0Y2hlZCIsIAorICAgICAgICAgICAgICBwYXJlbnQsIHBhcmVudC5nZXRDaGlsZHJlbigpLmdldCgwKS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbG9uZyBjcmVhdGVQYXJlbnRBbmRDaGlsZHJlbigpIHsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlQYXJlbnQgcGFyZW50ID0gbmV3IERldGFjaG1lbnRPbmVNYW55UGFyZW50KCk7CisgICAgICAgIHBhcmVudC5zZXROYW1lKCJwYXJlbnQiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIERldGFjaG1lbnRPbmVNYW55Q2hpbGQgY2hpbGQgPSBuZXcgRGV0YWNobWVudE9uZU1hbnlDaGlsZCgpOworICAgICAgICAgICAgY2hpbGQuc2V0TmFtZSgiY2hpbGQiICsgaSk7CisgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOworICAgICAgICB9CisgICAgICAKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBsb25nIGlkID0gcGFyZW50LmdldElkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldENoaWxkcmVuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmVudCBpcyBub3QgbWFuYWdlZCIsIGVtLmNvbnRhaW5zKHBhcmVudCkpOworICAgICAgICBEZXRhY2htZW50T25lTWFueUNoaWxkIGNoaWxkMCA9IHBhcmVudC5nZXRDaGlsZHJlbigpLmdldCgwKTsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlDaGlsZCBjaGlsZDEgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQwIiwgY2hpbGQwLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQxIiwgY2hpbGQxLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIGZpcnN0IGNoaWxkIGhhcyBubyByZWxhdGlvbnNoaXAgdG8gdGhlIHBhcmVudCIsIAorICAgICAgICAgICAgcGFyZW50LCBjaGlsZDAuZ2V0UGFyZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBzZWNvbmQgY2hpbGQgaGFzIG5vIHJlbGF0aW9uc2hpcCB0byB0aGUgcGFyZW50IiwgCisgICAgICAgICAgICBwYXJlbnQsIGNoaWxkMS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKFRlc3REZXRhY2htZW50T25lTWFueS5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L1Rlc3RHZXRSZWZlcmVuY2VBbmRJbXBsaWNpdERldGFjaG1lbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2RldGFjaG1lbnQvVGVzdEdldFJlZmVyZW5jZUFuZEltcGxpY2l0RGV0YWNobWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjU5NTMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9kZXRhY2htZW50L1Rlc3RHZXRSZWZlcmVuY2VBbmRJbXBsaWNpdERldGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuZGV0YWNobWVudDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUm9sbGJhY2tFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0R2V0UmVmZXJlbmNlQW5kSW1wbGljaXREZXRhY2htZW50CisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoIm9wZW5qcGEuRGV0YWNoU3RhdGUiLCAiZmV0Y2gtZ3JvdXBzIiwKKyAgICAgICAgICAgIERldGFjaG1lbnRPbmVNYW55UGFyZW50LmNsYXNzLCBEZXRhY2htZW50T25lTWFueUNoaWxkLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uZXhpc3RlbnRHZXRSZWZlcmVuY2VEZXRhY2htZW50SW5UeFdpdGhDb21taXQoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIERldGFjaG1lbnRPbmVNYW55UGFyZW50IG8gPSAKKyAgICAgICAgICAgIGVtLmdldFJlZmVyZW5jZShEZXRhY2htZW50T25lTWFueVBhcmVudC5jbGFzcywgMCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdGhlIGNsb3NlIGRldGFjaG1lbnQgc2hvdWxkIGxlYXZlIHRoZXNlIGludmFsaWQgb2JqZWN0cyBpbiBhIAorICAgICAgICAvLyB0cmFuc2llbnQgc3RhdGUKKyAgICAgICAgYXNzZXJ0RmFsc2UoKChQZXJzaXN0ZW5jZUNhcGFibGUpIG8pLnBjSXNUcmFuc2FjdGlvbmFsKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgbykucGNJc1BlcnNpc3RlbnQoKSk7CisgICAgICAgIC8vIHBjSXNEZXRhY2hlZCgpIHdpbGwgZ2l2ZSBhIGZhbHNlIHBvc2l0aXZlIGluIHRoaXMgY29uZmlndXJhdGlvbgorICAgICAgICAvLyBhc3NlcnRGYWxzZSgoKFBlcnNpc3RlbmNlQ2FwYWJsZSkgbykucGNJc0RldGFjaGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25leGlzdGVudEdldFJlZmVyZW5jZURldGFjaG1lbnRPdXRzaWRlVHgoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBEZXRhY2htZW50T25lTWFueVBhcmVudCBvID0gCisgICAgICAgICAgICBlbS5nZXRSZWZlcmVuY2UoRGV0YWNobWVudE9uZU1hbnlQYXJlbnQuY2xhc3MsIDApOworICAgICAgICBlbS5jbG9zZSgpOworCisgICAgICAgIC8vIHRoZSBjbG9zZSBkZXRhY2htZW50IHNob3VsZCBsZWF2ZSB0aGVzZSBpbnZhbGlkIG9iamVjdHMgaW4gYSAKKyAgICAgICAgLy8gdHJhbnNpZW50IHN0YXRlCisgICAgICAgIGFzc2VydEZhbHNlKCgoUGVyc2lzdGVuY2VDYXBhYmxlKSBvKS5wY0lzVHJhbnNhY3Rpb25hbCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoKChQZXJzaXN0ZW5jZUNhcGFibGUpIG8pLnBjSXNQZXJzaXN0ZW50KCkpOworICAgICAgICAvLyBwY0lzRGV0YWNoZWQoKSB3aWxsIGdpdmUgYSBmYWxzZSBwb3NpdGl2ZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gYXNzZXJ0RmFsc2UoKChQZXJzaXN0ZW5jZUNhcGFibGUpIG8pLnBjSXNEZXRhY2hlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uZXhpc3RlbnRHZXRSZWZlcmVuY2VEZXRhY2htZW50SW5UeFdpdGhSb2xsYmFjaygpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlQYXJlbnQgbyA9IAorICAgICAgICAgICAgZW0uZ2V0UmVmZXJlbmNlKERldGFjaG1lbnRPbmVNYW55UGFyZW50LmNsYXNzLCAwKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5yb2xsYmFjaygpOworCisgICAgICAgIC8vIHRoZSByb2xsYmFjayBzaG91bGQgY2F1c2UgYSBkZXRhY2htZW50CisgICAgICAgIGFzc2VydEZhbHNlKE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKS5pc1RyYW5zYWN0aW9uYWwobykpOworICAgICAgICBhc3NlcnRGYWxzZShPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuaXNQZXJzaXN0ZW50KG8pKTsKKyAgICAgICAgLy8gcGNJc0RldGFjaGVkKCkgd2lsbCBnaXZlIGEgZmFsc2UgcG9zaXRpdmUgaW4gdGhpcyBjb25maWd1cmF0aW9uCisgICAgICAgIC8vIGFzc2VydEZhbHNlKE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKS5pc0RldGFjaGVkKG8pKTsKKworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25leGlzdGVudEdldFJlZmVyZW5jZURldGFjaG1lbnRJblR4V2l0aEZhaWxlZENvbW1pdCgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgRGV0YWNobWVudE9uZU1hbnlQYXJlbnQgbyA9IAorICAgICAgICAgICAgZW0uZ2V0UmVmZXJlbmNlKERldGFjaG1lbnRPbmVNYW55UGFyZW50LmNsYXNzLCAwKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5zZXRSb2xsYmFja09ubHkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKFJvbGxiYWNrRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGZhaWxlZCBjb21taXQgc2hvdWxkIGNhdXNlIGEgZGV0YWNobWVudAorICAgICAgICBhc3NlcnRGYWxzZShPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuaXNUcmFuc2FjdGlvbmFsKG8pKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pLmlzUGVyc2lzdGVudChvKSk7CisgICAgICAgIC8vIHBjSXNEZXRhY2hlZCgpIHdpbGwgZ2l2ZSBhIGZhbHNlIHBvc2l0aXZlIGluIHRoaXMgY29uZmlndXJhdGlvbgorICAgICAgICAvLyBhc3NlcnRGYWxzZShPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSkuaXNEZXRhY2hlZChvKSk7CisKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pZGVudGl0eS9Eb3VibGVPYmpJZEVudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvRG91YmxlT2JqSWRFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzAyMzlmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvRG91YmxlT2JqSWRFbnRpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pZGVudGl0eTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKKworQEVudGl0eQorcHVibGljIGNsYXNzIERvdWJsZU9iaklkRW50aXR5IHsKKworICAgIEBJZAorICAgIHByaXZhdGUgRG91YmxlIGlkOworICAgIHByaXZhdGUgaW50IGRhdGE7CisKKyAgICBwdWJsaWMgRG91YmxlIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWQoRG91YmxlIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGEoaW50IGRhdGEpIHsKKyAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pZGVudGl0eS9GbG9hdElkRW50aXR5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pZGVudGl0eS9GbG9hdElkRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmMjliOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L0Zsb2F0SWRFbnRpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pZGVudGl0eTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKKworQEVudGl0eQorcHVibGljIGNsYXNzIEZsb2F0SWRFbnRpdHkgeworCisgICAgQElkCisgICAgcHJpdmF0ZSBmbG9hdCBpZDsKKyAgICBwcml2YXRlIGludCBkYXRhOworCisgICAgcHVibGljIGZsb2F0IGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWQoZmxvYXQgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgZGF0YSkgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L0lkZW50aXR5R2VuZXJhdGlvblR5cGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L0lkZW50aXR5R2VuZXJhdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNlZWRjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvSWRlbnRpdHlHZW5lcmF0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmlkZW50aXR5OworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRpb25UeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOworCisvKioKKyAqIFVzaW5nIGEgY2xhc3MgdHlwZSAoTG9uZykgaW5zdGVhZCBvZiBhIHByaW1pdGl2ZSB0eXBlIChsb25nKQorICogdXNlZCB0byBjYXVzZSBhIHByb2JsZW0gd2l0aCBhIEdlbmVyYXRpb25UeXBlIG9mIElERU5USVRZLgorICogVGhpcyB3YXMgcmVzb2x2ZWQgdmlhIHJldmlzaW9uIDQ1MzAxNi4gIFdlIGNhbiB1c2UgdGhpcyB0ZXN0Y2FzZQorICogZm9yIHJlZ3Jlc3Npb24gcHVycG9zZXMuCisgKgorICogQGF1dGhvciBLZXZpbiBTdXR0ZXIKKyAqLworQEVudGl0eQorcHVibGljIGNsYXNzIElkZW50aXR5R2VuZXJhdGlvblR5cGUgeworCisgICAgcHJpdmF0ZSBMb25nIG9yZGVySWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgc29tZURhdGE7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuSURFTlRJVFkpCisgICAgcHVibGljIExvbmcgZ2V0T3JkZXJJZCgpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVySWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE9yZGVySWQoTG9uZyBvcmRlcklkKSB7CisgICAgICAgIHRoaXMub3JkZXJJZCA9IG9yZGVySWQ7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29tZURhdGEoKSB7CisgICAgICAgIHJldHVybiBzb21lRGF0YTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0U29tZURhdGEoU3RyaW5nIHNvbWVEYXRhKSB7CisgICAgICAgIHRoaXMuc29tZURhdGEgPSBzb21lRGF0YTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L1NRTERhdGVJZEVudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvU1FMRGF0ZUlkRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhODBlNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L1NRTERhdGVJZEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmlkZW50aXR5OworCitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBTUUxEYXRlSWRFbnRpdHkgeworCisgICAgQElkCisgICAgcHJpdmF0ZSBEYXRlIGlkOworICAgIHByaXZhdGUgaW50IGRhdGE7CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKERhdGUgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgZGF0YSkgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L1Rlc3RGbG9hdGluZ1BvaW50SWRzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pZGVudGl0eS9UZXN0RmxvYXRpbmdQb2ludElkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWE1OWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pZGVudGl0eS9UZXN0RmxvYXRpbmdQb2ludElkcy5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmlkZW50aXR5OworCitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKKy8qKgorICogVGVzdCB0aGF0IGVudGl0aWVzIGNhbiB1c2UgZmxvYXRpbmcgcG9pbnQgaWRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RmxvYXRpbmdQb2ludElkcworICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKEZsb2F0SWRFbnRpdHkuY2xhc3MsIERvdWJsZU9iaklkRW50aXR5LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdEZsb2F0KCkgeworICAgICAgICBGbG9hdElkRW50aXR5IGUgPSBuZXcgRmxvYXRJZEVudGl0eSgpOworICAgICAgICBlLnNldElkKDNGKTsKKyAgICAgICAgZS5zZXREYXRhKDMzKTsKKworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KGUpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoM0YsIGUuZ2V0SWQoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlID0gZW0uZmluZChGbG9hdElkRW50aXR5LmNsYXNzLCAzRik7CisgICAgICAgIGFzc2VydEVxdWFscygzMywgZS5nZXREYXRhKCkpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0RG91YmxlT2JqKCkgeworICAgICAgICBEb3VibGVPYmpJZEVudGl0eSBlID0gbmV3IERvdWJsZU9iaklkRW50aXR5KCk7CisgICAgICAgIGUuc2V0SWQobmV3IERvdWJsZSg0RCkpOworICAgICAgICBlLnNldERhdGEoNDQpOworCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QoZSk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRG91YmxlKDREKSwgZS5nZXRJZCgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGUgPSBlbS5maW5kKERvdWJsZU9iaklkRW50aXR5LmNsYXNzLCBuZXcgRG91YmxlKDREKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NCwgZS5nZXREYXRhKCkpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdEZsb2F0aW5nUG9pbnRJZHMuY2xhc3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvVGVzdEdlbmVyYXRpb25UeXBlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pZGVudGl0eS9UZXN0R2VuZXJhdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJhOGYyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvVGVzdEdlbmVyYXRpb25UeXBlLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmlkZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlUcmFuc2FjdGlvbjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBTaW1wbGUgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIEdlbmVyYXRpb25UeXBlIGZvciBASWQuLi4KKyAqCisgKiBAYXV0aG9yIEtldmluIFN1dHRlcgorICovCitwdWJsaWMgY2xhc3MgVGVzdEdlbmVyYXRpb25UeXBlCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoSWRlbnRpdHlHZW5lcmF0aW9uVHlwZS5jbGFzcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIERCRGljdGlvbmFyeSBkb2Vzbid0IHN1cHBvcnQgQXV0b0Fzc2lnbihtZW50KSBvZiBjb2x1bW4KKyAgICAgICAgICogdmFsdWVzLCB0aGVuIG51bGwgb3V0IHRoZSBlbWYgaW5zdGFuY2UgdG8gcHJldmVudCB0aGUgcmVzdCBvZgorICAgICAgICAgKiB0aGUgdGVzdHMgZnJvbSBleGVjdXRpbmcuCisgICAgICAgICAqLworICAgICAgICBKREJDQ29uZmlndXJhdGlvbiBjb25mID0gKEpEQkNDb25maWd1cmF0aW9uKSBlbWYuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoIWNvbmYuZ2V0REJEaWN0aW9uYXJ5SW5zdGFuY2UoKS5zdXBwb3J0c0F1dG9Bc3NpZ24pIHsKKyAgICAgICAgICAgIGVtZiA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbnRpdHlNYW5hZ2VyKCkgeworICAgICAgICBpZiAoZW1mID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworCisgICAgICAgIEVudGl0eVRyYW5zYWN0aW9uIHQgPSBlbS5nZXRUcmFuc2FjdGlvbigpOworICAgICAgICBhc3NlcnROb3ROdWxsKHQpOworICAgICAgICB0LmJlZ2luKCk7CisgICAgICAgIHQuc2V0Um9sbGJhY2tPbmx5KCk7CisgICAgICAgIHQucm9sbGJhY2soKTsKKworICAgICAgICAvLyBvcGVuanBhLWZhY2FkZSB0ZXN0CisgICAgICAgIGFzc2VydFRydWUoZW0gaW5zdGFuY2VvZiBPcGVuSlBBRW50aXR5TWFuYWdlcik7CisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIG9qZW0gPSAoT3BlbkpQQUVudGl0eU1hbmFnZXIpIGVtOworICAgICAgICBvamVtLmdldEZldGNoUGxhbigpLnNldE1heEZldGNoRGVwdGgoLTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG9qZW0uZ2V0RmV0Y2hQbGFuKCkuZ2V0TWF4RmV0Y2hEZXB0aCgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdCgpIHsKKyAgICAgICAgaWYgKGVtZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KG5ldyBJZGVudGl0eUdlbmVyYXRpb25UeXBlKCkpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsKKyAgICAgICAgaWYgKGVtZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBJZGVudGl0eUdlbmVyYXRpb25UeXBlIGlndCA9IG5ldyBJZGVudGl0eUdlbmVyYXRpb25UeXBlKCk7CisgICAgICAgIGlndC5zZXRTb21lRGF0YSgiU29tZVN0cmluZyIpOworICAgICAgICBlbS5wZXJzaXN0KGlndCk7CisgICAgICAgIC8vIGFkZCBhbm90aGVyIElkZW50aXR5R2VuZXJhdGlvblR5cGUgb2JqZWN0CisgICAgICAgIGVtLnBlcnNpc3QobmV3IElkZW50aXR5R2VuZXJhdGlvblR5cGUoKSk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSB0d28gb2JqZWN0cy4uLgorICAgICAgICBRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCB4IGZyb20gSWRlbnRpdHlHZW5lcmF0aW9uVHlwZSB4Iik7CisgICAgICAgIExpc3QgbCA9IHEuZ2V0UmVzdWx0TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbC5zaXplKCkpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdEdlbmVyYXRpb25UeXBlLmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L1Rlc3RTUUxEYXRlSWQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2lkZW50aXR5L1Rlc3RTUUxEYXRlSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzNjNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaWRlbnRpdHkvVGVzdFNRTERhdGVJZC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmlkZW50aXR5OworCitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKKy8qKgorICogVGVzdCB0aGF0IGVudGl0aWVzIGNhbiB1c2UgU1FMIGRhdGVzIGFzIGlkZW50aXR5IHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFNRTERhdGVJZAorICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKFNRTERhdGVJZEVudGl0eS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3QoKSB7CisgICAgICAgIGxvbmcgdGltZSA9ICgobG9uZykgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMCkpICogMTAwMDsKKworICAgICAgICBTUUxEYXRlSWRFbnRpdHkgZSA9IG5ldyBTUUxEYXRlSWRFbnRpdHkoKTsKKyAgICAgICAgZS5zZXRJZChuZXcgRGF0ZSh0aW1lKSk7CisgICAgICAgIGUuc2V0RGF0YSgxKTsKKworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KGUpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBhc3NlcnRFcXVhbHModGltZSwgZS5nZXRJZCgpLmdldFRpbWUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlID0gZW0uZmluZChTUUxEYXRlSWRFbnRpdHkuY2xhc3MsIG5ldyBEYXRlKHRpbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGUuZ2V0RGF0YSgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKFNRTERhdGVJZEVudGl0eS5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9BYnN0cmFjdEJhc2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL0Fic3RyYWN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzY2IwOGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9BYnN0cmFjdEJhc2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZVR5cGU7CisKK0BFbnRpdHkKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuSk9JTkVEKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzZSB7CisKKyAgICBASWQKKyAgICBwcml2YXRlIFN0cmluZyBpZDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvQ29uY3JldGVTdWJjbGFzcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvQ29uY3JldGVTdWJjbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2E5NTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9Db25jcmV0ZVN1YmNsYXNzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2U7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CisKK0BFbnRpdHkgCitwdWJsaWMgY2xhc3MgQ29uY3JldGVTdWJjbGFzcyAKKyAgICBleHRlbmRzIEFic3RyYWN0QmFzZSB7CisKKyAgICBwcml2YXRlIGludCBzdWJjbGFzc0RhdGE7CisKKyAgICBwdWJsaWMgaW50IGdldFN1YmNsYXNzRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHN1YmNsYXNzRGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJjbGFzc0RhdGEoaW50IHN1YmNsYXNzRGF0YSkgeworICAgICAgICB0aGlzLnN1YmNsYXNzRGF0YSA9IHN1YmNsYXNzRGF0YTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL0VudGl0eUwzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9FbnRpdHlMMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTQwNmUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9FbnRpdHlMMy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworCitARW50aXR5IAorcHVibGljIGNsYXNzIEVudGl0eUwzIAorICAgIGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzc0wyIHsKKworICAgIHByaXZhdGUgaW50IGwzZGF0YTsKKworICAgIHB1YmxpYyBpbnQgZ2V0TDNEYXRhKCkgeworICAgICAgICByZXR1cm4gbDNkYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEwzRGF0YShpbnQgZGF0YSkgeworICAgICAgICBsM2RhdGEgPSBkYXRhOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvRW50aXR5TDNTaWJsaW5nLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9FbnRpdHlMM1NpYmxpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QwOTJmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvRW50aXR5TDNTaWJsaW5nLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2U7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CisKK0BFbnRpdHkgCitwdWJsaWMgY2xhc3MgRW50aXR5TDNTaWJsaW5nIAorICAgIGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzc0wyIHsKKworICAgIHByaXZhdGUgaW50IHNpYmxpbmdsM2RhdGE7CisKKyAgICBwdWJsaWMgaW50IGdldFNpYmxpbmdMM0RhdGEoKSB7CisgICAgICAgIHJldHVybiBzaWJsaW5nbDNkYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpYmxpbmdMM0RhdGEoaW50IGRhdGEpIHsKKyAgICAgICAgc2libGluZ2wzZGF0YSA9IGRhdGE7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9NYXBwZWRTdXBlcmNsYXNzQmFzZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvTWFwcGVkU3VwZXJjbGFzc0Jhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY2NjdkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvTWFwcGVkU3VwZXJjbGFzc0Jhc2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRpb25UeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hcHBlZFN1cGVyY2xhc3M7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc0Jhc2UgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL01hcHBlZFN1cGVyY2xhc3NMMi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvTWFwcGVkU3VwZXJjbGFzc0wyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNjIxMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL01hcHBlZFN1cGVyY2xhc3NMMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFwcGVkU3VwZXJjbGFzczsKKworQE1hcHBlZFN1cGVyY2xhc3MgCitwdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc0wyIAorICAgIGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzc0Jhc2UgeworCisgICAgcHJpdmF0ZSBpbnQgbDJkYXRhOworCisgICAgcHVibGljIGludCBnZXRMMkRhdGEoKSB7CisgICAgICAgIHJldHVybiBsMmRhdGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TDJEYXRhKGludCBkYXRhKSB7CisgICAgICAgIGwyZGF0YSA9IGRhdGE7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9UZXN0RmluZEFic3RyYWN0Q2xhc3MuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL1Rlc3RGaW5kQWJzdHJhY3RDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWE4MmUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9UZXN0RmluZEFic3RyYWN0Q2xhc3MuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHRoYXQgeW91IGNhbiBmaW5kIGEgY29uY3JldGUgc3ViY2xhc3MgcmVjb3JkIHdoZW4gcGFzc2luZyBpbiBpdHMKKyAqIGFic3RyYWN0IGJhc2UgY2xhc3MgdG8gRW50aXR5TWFuYWdlci5maW5kKCkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RGaW5kQWJzdHJhY3RDbGFzcworICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKEFic3RyYWN0QmFzZS5jbGFzcywgQ29uY3JldGVTdWJjbGFzcy5jbGFzcyk7CisKKyAgICAgICAgQ29uY3JldGVTdWJjbGFzcyBlID0gbmV3IENvbmNyZXRlU3ViY2xhc3MoKTsKKyAgICAgICAgZS5zZXRJZCgiaWQiKTsKKyAgICAgICAgZS5zZXRTdWJjbGFzc0RhdGEoMSk7IAorCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QoZSk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmQoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBBYnN0cmFjdEJhc2UgZSA9IGVtLmZpbmQoQWJzdHJhY3RCYXNlLmNsYXNzLCAiaWQiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ29uY3JldGVTdWJjbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCAoKENvbmNyZXRlU3ViY2xhc3MpIGUpLmdldFN1YmNsYXNzRGF0YSgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKFRlc3RGaW5kQWJzdHJhY3RDbGFzcy5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9UZXN0TXVsdGlwbGVNYXBwZWRTdXBlcmNsYXNzSGllcmFyY2h5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9UZXN0TXVsdGlwbGVNYXBwZWRTdXBlcmNsYXNzSGllcmFyY2h5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhMGMxZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL1Rlc3RNdWx0aXBsZU1hcHBlZFN1cGVyY2xhc3NIaWVyYXJjaHkuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBQZXJmb3JtIGJhc2ljIG9wZXJhdGlvbnMgb24gYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5IGludm9sdmluZyBtdWx0aXBsZQorICogQE1hcHBlZFN1cGVyY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdE11bHRpcGxlTWFwcGVkU3VwZXJjbGFzc0hpZXJhcmNoeQorICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKE1hcHBlZFN1cGVyY2xhc3NCYXNlLmNsYXNzLCBNYXBwZWRTdXBlcmNsYXNzTDIuY2xhc3MsCisgICAgICAgICAgICBFbnRpdHlMMy5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3QoKSB7CisgICAgICAgIEVudGl0eUwzIGVudCA9IG5ldyBFbnRpdHlMMygpOworICAgICAgICBlbnQuc2V0TDJEYXRhKDk5KTsgCisgICAgICAgIGVudC5zZXRMM0RhdGEoMTAwKTsKKworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KGVudCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGxvbmcgaWQgPSBlbnQuZ2V0SWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpZCAhPSAwKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVudCA9IGVtLmZpbmQoRW50aXR5TDMuY2xhc3MsIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTksIGVudC5nZXRMMkRhdGEoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIGVudC5nZXRMM0RhdGEoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0TXVsdGlwbGVNYXBwZWRTdXBlcmNsYXNzSGllcmFyY2h5LmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL1Rlc3RTaGFyZWRNYXBwZWRTdXBlcmNsYXNzSWRWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvVGVzdFNoYXJlZE1hcHBlZFN1cGVyY2xhc3NJZFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkMWU1MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL1Rlc3RTaGFyZWRNYXBwZWRTdXBlcmNsYXNzSWRWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNpbmdsZUVNRlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgdGhhdCBzaWJsaW5nIGNsYXNzZXMgd2l0aCBhIHNoYXJlZCBpZCB2YWx1ZSBkZWNsYXJlZCBpbiB0aGVpciAKKyAqIG1hcHBlZCBzdXBlcmNsYXNzIGFyZSBkaXN0aW5ndWlzaGVkIGNvcnJlY3RseS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdFNoYXJlZE1hcHBlZFN1cGVyY2xhc3NJZFZhbHVlCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoTWFwcGVkU3VwZXJjbGFzc0Jhc2UuY2xhc3MsIE1hcHBlZFN1cGVyY2xhc3NMMi5jbGFzcywKKyAgICAgICAgICAgIEVudGl0eUwzLmNsYXNzLCBFbnRpdHlMM1NpYmxpbmcuY2xhc3MpOworCisgICAgICAgIEVudGl0eUwzIGVudCA9IG5ldyBFbnRpdHlMMygpOworICAgICAgICBlbnQuc2V0SWQoMSk7CisgICAgICAgIGVudC5zZXRMMkRhdGEoOTkpOyAKKyAgICAgICAgZW50LnNldEwzRGF0YSgxMDApOworICAgICAgICBFbnRpdHlMM1NpYmxpbmcgc2liID0gbmV3IEVudGl0eUwzU2libGluZygpOworICAgICAgICBzaWIuc2V0SWQoMSk7CisgICAgICAgIHNpYi5zZXRMMkRhdGEoMTAwKTsgCisgICAgICAgIHNpYi5zZXRTaWJsaW5nTDNEYXRhKDEwMSk7CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChlbnQpOworICAgICAgICBlbS5wZXJzaXN0KHNpYik7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmQoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBFbnRpdHlMMyBlbnQgPSBlbS5maW5kKEVudGl0eUwzLmNsYXNzLCAxTCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDk5LCBlbnQuZ2V0TDJEYXRhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBlbnQuZ2V0TDNEYXRhKCkpOworCisgICAgICAgIEVudGl0eUwzU2libGluZyBzaWIgPSBlbS5maW5kKEVudGl0eUwzU2libGluZy5jbGFzcywgMUwpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNpYik7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHNpYi5nZXRMMkRhdGEoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDEsIHNpYi5nZXRTaWJsaW5nTDNEYXRhKCkpOworCisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZSgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIEVudGl0eUwzIGVudCA9IGVtLmdldFJlZmVyZW5jZShFbnRpdHlMMy5jbGFzcywgMUwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGVudCk7CisKKyAgICAgICAgRW50aXR5TDNTaWJsaW5nIHNpYiA9IGVtLmdldFJlZmVyZW5jZShFbnRpdHlMM1NpYmxpbmcuY2xhc3MsIDFMKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzaWIpOworCisgICAgICAgIGFzc2VydEVxdWFscyg5OSwgZW50LmdldEwyRGF0YSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgZW50LmdldEwzRGF0YSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgc2liLmdldEwyRGF0YSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMSwgc2liLmdldFNpYmxpbmdMM0RhdGEoKSk7CisKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKFRlc3RTaGFyZWRNYXBwZWRTdXBlcmNsYXNzSWRWYWx1ZS5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9UZXN0U2hhcmVkVW5xdWFsaWZpZWRDbGFzc05hbWVzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9UZXN0U2hhcmVkVW5xdWFsaWZpZWRDbGFzc05hbWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlNWZjNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL1Rlc3RTaGFyZWRVbnF1YWxpZmllZENsYXNzTmFtZXMuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BYnN0cmFjdEJyb2tlckZhY3Rvcnk7DQorDQorLyoqDQorICogVGVzdCB0aGF0IGVudGl0aWVzLCBtYXBwZWQgc3VwZXJjbGFzc2VzLCBhbmQgZW1iZWRkYWJsZXMgY2FuIGFsbCBzaGFyZQ0KKyAqIHRoZSBzYW1lIHNob3J0IG5hbWVzIHdpdGhvdXQgYW55IGNvbGxpc2lvbnMuDQorICovDQorcHVibGljIGNsYXNzIFRlc3RTaGFyZWRVbnF1YWxpZmllZENsYXNzTmFtZXMNCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgc2V0VXAob3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlLm1hcHBlZHN1cGVyY2xhc3MNCisgICAgICAgICAgICAgICAgLlNoYXJlZE5hbWUxLmNsYXNzLA0KKyAgICAgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZS5lbnRpdHkNCisgICAgICAgICAgICAgICAgLlNoYXJlZE5hbWUxLmNsYXNzLA0KKyAgICAgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZS5lbWJlZGRhYmxlDQorICAgICAgICAgICAgICAgIC5TaGFyZWROYW1lMi5jbGFzcywNCisgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2UuZW50aXR5DQorICAgICAgICAgICAgICAgIC5TaGFyZWROYW1lMi5jbGFzcyk7DQorICAgICAgICBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpLmNsb3NlKCk7DQorICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgew0KKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gZW1mLmdldENvbmZpZ3VyYXRpb24oKQ0KKyAgICAgICAgICAgIC5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpDQorICAgICAgICAgICAgLmdldE1ldGFEYXRhKCJTaGFyZWROYW1lMSIsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoDQorICAgICAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlLmVudGl0eS5TaGFyZWROYW1lMS5jbGFzcywNCisgICAgICAgICAgICBtZXRhLmdldERlc2NyaWJlZFR5cGUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEVtYmVkZGFibGUoKSB7DQorICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBlbWYuZ2V0Q29uZmlndXJhdGlvbigpDQorICAgICAgICAgICAgLmdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkNCisgICAgICAgICAgICAuZ2V0TWV0YURhdGEoIlNoYXJlZE5hbWUyIiwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLCB0cnVlKTsNCisgICAgICAgIGFzc2VydEVxdWFscygNCisgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2UuZW50aXR5LlNoYXJlZE5hbWUyLmNsYXNzLA0KKyAgICAgICAgICAgIG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9lbWJlZGRhYmxlL1NoYXJlZE5hbWUyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9lbWJlZGRhYmxlL1NoYXJlZE5hbWUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkODIyMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2luaGVyaXRhbmNlL2VtYmVkZGFibGUvU2hhcmVkTmFtZTIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlLmVtYmVkZGFibGU7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGU7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyBoYXMgdGhlIHNhbWUgbmFtZSBhcyB7QGxpbmsNCisgKiBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2UuZW50aXR5LlNoYXJlZE5hbWUyfQ0KKyAqLw0KK0BFbWJlZGRhYmxlDQorcHVibGljIGNsYXNzIFNoYXJlZE5hbWUyIHsNCisNCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvZW50aXR5L1NoYXJlZE5hbWUxLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9lbnRpdHkvU2hhcmVkTmFtZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGYyNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvZW50aXR5L1NoYXJlZE5hbWUxLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZS5lbnRpdHk7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyBoYXMgdGhlIHNhbWUgbmFtZSBhcyB7QGxpbmsNCisgKiBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2UubWFwcGVkc3VwZXJjbGFzcy5TaGFyZWROYW1lMX0NCisgKi8NCitARW50aXR5DQorcHVibGljIGNsYXNzIFNoYXJlZE5hbWUxIHsNCisNCisgICAgQElkDQorICAgIHByaXZhdGUgbG9uZyBpZDsNCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvZW50aXR5L1NoYXJlZE5hbWUyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9lbnRpdHkvU2hhcmVkTmFtZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlmNTAwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvZW50aXR5L1NoYXJlZE5hbWUyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZS5lbnRpdHk7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyBoYXMgdGhlIHNhbWUgbmFtZSBhcyB7QGxpbmsNCisgKiBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuaW5oZXJpdGFuY2UuZW1iZWRkYWJsZS5TaGFyZWROYW1lMn0NCisgKi8NCitARW50aXR5DQorcHVibGljIGNsYXNzIFNoYXJlZE5hbWUyIHsNCisNCisgICAgQElkDQorICAgIHByaXZhdGUgbG9uZyBpZDsNCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvbWFwcGVkc3VwZXJjbGFzcy9TaGFyZWROYW1lMS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvaW5oZXJpdGFuY2UvbWFwcGVkc3VwZXJjbGFzcy9TaGFyZWROYW1lMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTRjMDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9pbmhlcml0YW5jZS9tYXBwZWRzdXBlcmNsYXNzL1NoYXJlZE5hbWUxLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5pbmhlcml0YW5jZS5tYXBwZWRzdXBlcmNsYXNzOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaGFzIHRoZSBzYW1lIG5hbWUgYXMge0BsaW5rDQorICogb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmluaGVyaXRhbmNlLmVudGl0eS5TaGFyZWROYW1lMX0NCisgKi8NCitATWFwcGVkU3VwZXJjbGFzcw0KK3B1YmxpYyBjbGFzcyBTaGFyZWROYW1lMSB7DQorDQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVGVzdElzb2xhdGlvbkxldmVsT3ZlcnJpZGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVGVzdElzb2xhdGlvbkxldmVsT3ZlcnJpZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2MyNGZkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9UZXN0SXNvbGF0aW9uTGV2ZWxPdmVycmlkZS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TUUxMaXN0ZW5lclRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5zaW1wbGUuQWxsRmllbGRUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQVBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5JbnZhbGlkU3RhdGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRCRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREIyRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSFNRTERpY3Rpb25hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIFRlc3RJc29sYXRpb25MZXZlbE92ZXJyaWRlCisgICAgZXh0ZW5kcyBTUUxMaXN0ZW5lclRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChBbGxGaWVsZFR5cGVzLmNsYXNzLAorICAgICAgICAgICAgIm9wZW5qcGEuT3B0aW1pc3RpYyIsICJmYWxzZSIsCisgICAgICAgICAgICAib3BlbmpwYS5Mb2NrTWFuYWdlciIsICJwZXNzaW1pc3RpYyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc29sYXRpb25PdmVycmlkZVZpYUZldGNoUGxhbigpIHsKKyAgICAgICAgdGVzdElzb2xhdGlvbkxldmVsT3ZlcnJpZGUoZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNvbGF0aW9uT3ZlcnJpZGVWaWFIaW50KCkgeworICAgICAgICB0ZXN0SXNvbGF0aW9uTGV2ZWxPdmVycmlkZSh0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzb2xhdGlvbk92ZXJyaWRlVmlhU3RyaW5nSGludCgpIHsKKyAgICAgICAgdGVzdElzb2xhdGlvbkxldmVsT3ZlcnJpZGUodHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzb2xhdGlvbkxldmVsT3ZlcnJpZGUoYm9vbGVhbiB1c2VIaW50c0FuZFF1ZXJpZXMsCisgICAgICAgIGJvb2xlYW4gdXNlU3RyaW5nSGludHMpIHsKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPQorICAgICAgICAgICAgT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKSk7CisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gKChKREJDQ29uZmlndXJhdGlvbikgZW0uZ2V0Q29uZmlndXJhdGlvbigpKQorICAgICAgICAgICAgLmdldERCRGljdGlvbmFyeUluc3RhbmNlKCk7CisKKyAgICAgICAgLy8gaHNxbCBkb2Vzbid0IHN1cHBvcnQgbG9ja2luZzsgY2lyY3VtdmVudCB0aGUgdGVzdAorICAgICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIEhTUUxEaWN0aW9uYXJ5KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHNxbC5jbGVhcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICAgICAgaWYgKHVzZUhpbnRzQW5kUXVlcmllcykgeworICAgICAgICAgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgKKyAgICAgICAgICAgICAgICAic2VsZWN0IG8gZnJvbSBBbGxGaWVsZFR5cGVzIG8gd2hlcmUgby5pbnRGaWVsZCA9IDpwIik7CisgICAgICAgICAgICAgICAgcS5zZXRQYXJhbWV0ZXIoInAiLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlU3RyaW5nSGludHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcS5zZXRIaW50KCJvcGVuanBhLkZldGNoUGxhbi5Jc29sYXRpb24iLCAiU0VSSUFMSVpBQkxFIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcS5zZXRIaW50KCJvcGVuanBhLkZldGNoUGxhbi5Jc29sYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0aW9uTGV2ZWwuU0VSSUFMSVpBQkxFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSXNvbGF0aW9uTGV2ZWwuU0VSSUFMSVpBQkxFLAorICAgICAgICAgICAgICAgICAgICAoKEpEQkNGZXRjaFBsYW4pICgoT3BlbkpQQVF1ZXJ5KSBxKS5nZXRGZXRjaFBsYW4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJc29sYXRpb24oKSk7CisKKyAgICAgICAgICAgICAgICBxLmdldFJlc3VsdExpc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIERCMkRpY3Rpb25hcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoKERCMkRpY3Rpb25hcnkpZGljdCkuZ2V0RGIyU2VydmVyVHlwZSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKChEQjJEaWN0aW9uYXJ5KWRpY3QpLmdldERiMlNlcnZlclR5cGUoKT09IDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTUUwoIlNFTEVDVCB0MC5pZCwgdDAuYm9vbGVhbkZpZWxkLCB0MC5ieXRlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5jaGFyRmllbGQsIHQwLmRhdGVGaWVsZCwgdDAuZG91YmxlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5mbG9hdEZpZWxkLCB0MC5pbnRGaWVsZCwgdDAubG9uZ0ZpZWxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidDAuc2hvcnRGaWVsZCwgdDAuc3RyaW5nRmllbGQgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWxsRmllbGRUeXBlcyB0MCBXSEVSRSBcXCh0MC5pbnRGaWVsZCA9IFxcP1xcKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEZPUiBVUERBVEUgT0YiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBEQjIgdjgyIG9yIGxhdGVyCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgoKERCMkRpY3Rpb25hcnkpZGljdCkuZ2V0RGIyU2VydmVyVHlwZSgpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKChEQjJEaWN0aW9uYXJ5KWRpY3QpLmdldERiMlNlcnZlclR5cGUoKSA9PSA0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNxbC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U1FMKCJTRUxFQ1QgdDAuaWQsIHQwLmJvb2xlYW5GaWVsZCwgdDAuYnl0ZUZpZWxkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdDAuY2hhckZpZWxkLCB0MC5kYXRlRmllbGQsIHQwLmRvdWJsZUZpZWxkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdDAuZmxvYXRGaWVsZCwgdDAuaW50RmllbGQsIHQwLmxvbmdGaWVsZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInQwLnNob3J0RmllbGQsIHQwLnN0cmluZ0ZpZWxkIEZST00gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkFsbEZpZWxkVHlwZXMgdDAgV0hFUkUgXFwodDAuaW50RmllbGQgPSBcXD9cXCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBGT1IgUkVBRCBPTkxZIFdJVEggUlIgVVNFIEFORCBLRUVQICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVVBEQVRFIExPQ0tTIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKChEQjJEaWN0aW9uYXJ5KWRpY3QpLmdldERiMlNlcnZlclR5cGUoKSA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTUUwoIlNFTEVDVCB0MC5pZCwgdDAuYm9vbGVhbkZpZWxkLCB0MC5ieXRlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5jaGFyRmllbGQsIHQwLmRhdGVGaWVsZCwgdDAuZG91YmxlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5mbG9hdEZpZWxkLCB0MC5pbnRGaWVsZCwgdDAubG9uZ0ZpZWxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidDAuc2hvcnRGaWVsZCwgdDAuc3RyaW5nRmllbGQgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWxsRmllbGRUeXBlcyB0MCBXSEVSRSBcXCh0MC5pbnRGaWVsZCA9IFxcP1xcKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEZPUiBSRUFEIE9OTFkgV0lUSCBSUiBVU0UgQU5EIEtFRVAgRVhDTFVTSVZFICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTE9DS1MiKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJPcGVuSlBBIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJwZXItcXVlcnkgaXNvbGF0aW9uIGxldmVsIGNvbmZpZ3VyYXRpb24gb24gdGhlIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiBmb2xsb3dpbmcgZGF0YWJhc2VzOiBEQjIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICgoSkRCQ0ZldGNoUGxhbikgZW0uZ2V0RmV0Y2hQbGFuKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJc29sYXRpb24oSXNvbGF0aW9uTGV2ZWwuU0VSSUFMSVpBQkxFKTsKKyAgICAgICAgICAgICAgICBlbS5maW5kKEFsbEZpZWxkVHlwZXMuY2xhc3MsIDApOworICAgICAgICAgICAgICAgIGlmIChkaWN0IGluc3RhbmNlb2YgREIyRGljdGlvbmFyeSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoKERCMkRpY3Rpb25hcnkpZGljdCkuZ2V0RGIyU2VydmVyVHlwZSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKChEQjJEaWN0aW9uYXJ5KWRpY3QpLmdldERiMlNlcnZlclR5cGUoKT09IDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTUUwoIlNFTEVDVCB0MC5ib29sZWFuRmllbGQsIHQwLmJ5dGVGaWVsZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInQwLmNoYXJGaWVsZCwgdDAuZGF0ZUZpZWxkLCB0MC5kb3VibGVGaWVsZCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHQwLmZsb2F0RmllbGQsIHQwLmludEZpZWxkLCB0MC5sb25nRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5zaG9ydEZpZWxkLCB0MC5zdHJpbmdGaWVsZCBGUk9NICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJBbGxGaWVsZFR5cGVzIHQwIFdIRVJFIHQwLmlkID0gXFw/ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRk9SIFVQREFURSBPRiBvcHRpbWl6ZSBmb3IgMSByb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBEQjIgdjgyIG9yIGxhdGVyCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgoKERCMkRpY3Rpb25hcnkpZGljdCkuZ2V0RGIyU2VydmVyVHlwZSgpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKChEQjJEaWN0aW9uYXJ5KWRpY3QpLmdldERiMlNlcnZlclR5cGUoKSA9PSA0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNxbC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U1FMKCJTRUxFQ1QgdDAuYm9vbGVhbkZpZWxkLCB0MC5ieXRlRmllbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0MC5jaGFyRmllbGQsIHQwLmRhdGVGaWVsZCwgdDAuZG91YmxlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5mbG9hdEZpZWxkLCB0MC5pbnRGaWVsZCwgdDAubG9uZ0ZpZWxkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdDAuc2hvcnRGaWVsZCwgdDAuc3RyaW5nRmllbGQgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWxsRmllbGRUeXBlcyB0MCBXSEVSRSB0MC5pZCA9IFxcPyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEZPUiBSRUFEIE9OTFkgV0lUSCBSUiBVU0UgQU5EIEtFRVAgVVBEQVRFIExPQ0tTIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgb3B0aW1pemUgZm9yIDEgcm93Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKChEQjJEaWN0aW9uYXJ5KWRpY3QpLmdldERiMlNlcnZlclR5cGUoKSA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTUUwoIlNFTEVDVCB0MC5ib29sZWFuRmllbGQsIHQwLmJ5dGVGaWVsZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInQwLmNoYXJGaWVsZCwgdDAuZGF0ZUZpZWxkLCB0MC5kb3VibGVGaWVsZCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHQwLmZsb2F0RmllbGQsIHQwLmludEZpZWxkLCB0MC5sb25nRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0MC5zaG9ydEZpZWxkLCB0MC5zdHJpbmdGaWVsZCBGUk9NICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJBbGxGaWVsZFR5cGVzIHQwIFdIRVJFIHQwLmlkID0gXFw/ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRk9SIFJFQUQgT05MWSBXSVRIIFJSIFVTRSBBTkQgS0VFUCBFWENMVVNJVkUiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBMT0NLUyBvcHRpbWl6ZSBmb3IgMSByb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJPcGVuSlBBIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHBlci1xdWVyeSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgaXNvbGF0aW9uIGxldmVsIGNvbmZpZ3VyYXRpb24gb24gdGhlIGZvbGxvd2luZyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgZGF0YWJhc2VzOiBEQjIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRTdGF0ZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHVzaW5nIERCMiwgd2UgZXhwZWN0IGFuIEludmFsaWRTdGF0ZUV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGlmIChkaWN0IGluc3RhbmNlb2YgREIyRGljdGlvbmFyeSkKKyAgICAgICAgICAgICAgICB0aHJvdyBwZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkucm9sbGJhY2soKTsKKyAgICAgICAgICAgIGVtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1Rlc3RPcHRpbWl6ZUZvckNsYXVzZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9UZXN0T3B0aW1pemVGb3JDbGF1c2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY1M2RhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9UZXN0T3B0aW1pemVGb3JDbGF1c2UuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnk7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNRTExpc3RlbmVyVGVzdENhc2U7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5zaW1wbGUuQWxsRmllbGRUeXBlczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFFbnRpdHlNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQVF1ZXJ5Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuSW52YWxpZFN0YXRlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREIyRGljdGlvbmFyeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkhTUUxEaWN0aW9uYXJ5Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOw0KKw0KK3B1YmxpYyBjbGFzcyBUZXN0T3B0aW1pemVGb3JDbGF1c2UNCisgICAgZXh0ZW5kcyBTUUxMaXN0ZW5lclRlc3RDYXNlIHsNCisNCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7DQorICAgICAgICBzZXRVcChBbGxGaWVsZFR5cGVzLmNsYXNzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW1pemVGb3JDbGF1c2VWaWFIaW50KCkgew0KKyAgICAgICAgdGVzdE9wdGltaXplRm9yQ2xhdXNlKHRydWUsZmFsc2UsZmFsc2UpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpbWl6ZUZvckNsYXVzZVZpYUZpbmQoKSB7DQorICAgICAgICB0ZXN0T3B0aW1pemVGb3JDbGF1c2UoZmFsc2UsdHJ1ZSxmYWxzZSk7DQorICAgIH0NCisgICAgcHVibGljIHZvaWQgdGVzdE9wdGltaXplRm9yQ2xhdXNlVmlhUXVlcnlIaW50KCkgew0KKyAgICAgICAgdGVzdE9wdGltaXplRm9yQ2xhdXNlKGZhbHNlLHRydWUsdHJ1ZSk7DQorICAgIH0NCisgICAgcHVibGljIHZvaWQgdGVzdE9wdGltaXplRm9yQ2xhdXNlKGJvb2xlYW4gaGludCwNCisgICAgICAgIGJvb2xlYW4gZmluZCwgYm9vbGVhbiBxdWVyeUhpbnQpIHsNCisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGVtID0NCisgICAgICAgICAgICBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpKTsNCisgICAgICAgIERCRGljdGlvbmFyeSBkaWN0ID0gKChKREJDQ29uZmlndXJhdGlvbikgZW0uZ2V0Q29uZmlndXJhdGlvbigpKQ0KKyAgICAgICAgICAgIC5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOw0KKw0KKyAgICAgICAgLy8gaHNxbCBkb2Vzbid0IHN1cHBvcnQgb3B0aW1pemluZzsgY2lyY3VtdmVudCB0aGUgdGVzdA0KKyAgICAgICAgaWYgKGRpY3QgaW5zdGFuY2VvZiBIU1FMRGljdGlvbmFyeSkNCisgICAgICAgICAgICByZXR1cm47DQorDQorICAgICAgICBzcWwuY2xlYXIoKTsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgICAgIGlmIChoaW50IHx8IHF1ZXJ5SGludCkgew0KKyAgICAgICAgICAgICAgICBpZiAoaGludCkgew0KKyAgICAgICAgICAgICAgICAgICAgUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KA0KKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBvIGZyb20gQWxsRmllbGRUeXBlcyBvIHdoZXJlIG8uaW50RmllbGQgPSA6cCIpOw0KKyAgICAgICAgICAgICAgICAgICAgcS5zZXRQYXJhbWV0ZXIoInAiLCAwKTsNCisgICAgICAgICAgICAgICAgICAgIHEuc2V0SGludCgib3BlbmpwYS5oaW50Lk9wdGltaXplUmVzdWx0Q291bnQiDQorICAgICAgICAgICAgICAgICAgICAgICAgICxuZXcgSW50ZWdlcig4KSk7DQorICAgICAgICAgICAgICAgICAgICBxLmdldFJlc3VsdExpc3QoKTsNCisgICAgICAgICAgICAgICAgfSAgICANCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBPcGVuSlBBUXVlcnkgcSA9ICBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdCAoZW0uY3JlYXRlUXVlcnkgDQorICAgICAgICAgICAgICAgICAgICAgICAgKCJzZWxlY3QgbyBmcm9tIEFsbEZpZWxkVHlwZXMgbyB3aGVyZSBvLmludEZpZWxkICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiPSA6cCIpKTsNCisgICAgICAgICAgICAgICAgICAgIHEuc2V0UGFyYW1ldGVyKCJwIiwgMCk7DQorICAgICAgICAgICAgICAgICAgICBxLnNldEhpbnQocS5ISU5UX1JFU1VMVF9DT1VOVCwgbmV3IEludGVnZXIoOCkpOyANCisgICAgICAgICAgICAgICAgICAgIHEuZ2V0UmVzdWx0TGlzdCgpOw0KKyAgICAgICAgICAgICAgIH0gICAgIA0KKyAgICAgICAgICAgICAgIGlmIChkaWN0IGluc3RhbmNlb2YgREIyRGljdGlvbmFyeSkgew0KKyAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7DQorICAgICAgICAgICAgICAgICAgIGFzc2VydFNRTCgiU0VMRUNUIHQwLmlkLCB0MC5ib29sZWFuRmllbGQsIHQwLmJ5dGVGaWVsZCwiICsNCisgICAgICAgICAgICAgICAgICAgICAgICIgdDAuY2hhckZpZWxkLCB0MC5kYXRlRmllbGQsIHQwLmRvdWJsZUZpZWxkLCAiICsNCisgICAgICAgICAgICAgICAgICAgICAgICJ0MC5mbG9hdEZpZWxkLCB0MC5pbnRGaWVsZCwgdDAubG9uZ0ZpZWxkLCAiICsNCisgICAgICAgICAgICAgICAgICAgICAgICJ0MC5zaG9ydEZpZWxkLCB0MC5zdHJpbmdGaWVsZCBGUk9NIEFsbEZpZWxkVHlwZXMgIiArDQorICAgICAgICAgICAgICAgICAgICAgICAidDAgV0hFUkUgXFwodDAuaW50RmllbGQgPSBcXD9cXCkgIG9wdGltaXplIGZvciA4IHJvdyIpOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICBlbS5maW5kKEFsbEZpZWxkVHlwZXMuY2xhc3MsIDApOw0KKyAgICAgICAgICAgICAgICAgaWYgKGRpY3QgaW5zdGFuY2VvZiBEQjJEaWN0aW9uYXJ5ICkgew0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNxbC5zaXplKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U1FMKCJTRUxFQ1QgdDAuYm9vbGVhbkZpZWxkLCB0MC5ieXRlRmllbGQsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICJ0MC5jaGFyRmllbGQsIHQwLmRhdGVGaWVsZCwgdDAuZG91YmxlRmllbGQsICIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICJ0MC5mbG9hdEZpZWxkLCB0MC5pbnRGaWVsZCwgdDAubG9uZ0ZpZWxkLCAiICsNCisgICAgICAgICAgICAgICAgICAgICAgICAidDAuc2hvcnRGaWVsZCwgdDAuc3RyaW5nRmllbGQgRlJPTSBBbGxGaWVsZFR5cGVzIiArDQorICAgICAgICAgICAgICAgICAgICAgICAgIiB0MCBXSEVSRSB0MC5pZCA9IFxcPyAgb3B0aW1pemUgZm9yIDEgcm93Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFN0YXRlRXhjZXB0aW9uIHBlKSB7DQorICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHVzaW5nIERCMiwgd2UgZXhwZWN0IGFuIEludmFsaWRTdGF0ZUV4Y2VwdGlvbi4NCisgICAgICAgICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIERCMkRpY3Rpb25hcnkpDQorICAgICAgICAgICAgICAgIHRocm93IHBlOw0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLnJvbGxiYWNrKCk7DQorICAgICAgICAgICAgZW0uY2xvc2UoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1Rlc3RTZWxlY3RGb3JVcGRhdGVPdmVycmlkZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9UZXN0U2VsZWN0Rm9yVXBkYXRlT3ZlcnJpZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODlhMjRhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9UZXN0U2VsZWN0Rm9yVXBkYXRlT3ZlcnJpZGUuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYzsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTG9ja01vZGVUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU1FMTGlzdGVuZXJUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlLkFsbEZpZWxkVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRmV0Y2hQbGFuOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREIyRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuREJEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5IU1FMRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdFNlbGVjdEZvclVwZGF0ZU92ZXJyaWRlCisgICAgZXh0ZW5kcyBTUUxMaXN0ZW5lclRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChBbGxGaWVsZFR5cGVzLmNsYXNzLAorICAgICAgICAgICAgIm9wZW5qcGEuT3B0aW1pc3RpYyIsICJmYWxzZSIsCisgICAgICAgICAgICAib3BlbmpwYS5Mb2NrTWFuYWdlciIsICJwZXNzaW1pc3RpYyIsCisgICAgICAgICAgICAib3BlbmpwYS5SZWFkTG9ja0xldmVsIiwgIm5vbmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0Rm9yVXBkYXRlT3ZlcnJpZGUoKSB7CisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGVtID0KKyAgICAgICAgICAgIE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCkpOworICAgICAgICBEQkRpY3Rpb25hcnkgZGljdCA9ICgoSkRCQ0NvbmZpZ3VyYXRpb24pIGVtLmdldENvbmZpZ3VyYXRpb24oKSkKKyAgICAgICAgICAgIC5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpOworCisgICAgICAgIC8vIGhzcWwgZG9lc24ndCBzdXBwb3J0IGxvY2tpbmc7IGNpcmN1bXZlbnQgdGhlIHRlc3QKKyAgICAgICAgaWYgKGRpY3QgaW5zdGFuY2VvZiBIU1FMRGljdGlvbmFyeSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzcWwuY2xlYXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgICAgIE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKS5nZXRGZXRjaFBsYW4oKQorICAgICAgICAgICAgICAgIC5zZXRSZWFkTG9ja01vZGUoTG9ja01vZGVUeXBlLldSSVRFKTsKKyAgICAgICAgICAgIGVtLmZpbmQoQWxsRmllbGRUeXBlcy5jbGFzcywgMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIERCMkRpY3Rpb25hcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCgoREIyRGljdGlvbmFyeSlkaWN0KS5nZXREYjJTZXJ2ZXJUeXBlKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKCgoREIyRGljdGlvbmFyeSlkaWN0KS5nZXREYjJTZXJ2ZXJUeXBlKCk9PSAyKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFNRTCgiU0VMRUNUIHQwLmJvb2xlYW5GaWVsZCwgdDAuYnl0ZUZpZWxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ0MC5jaGFyRmllbGQsIHQwLmRhdGVGaWVsZCwgdDAuZG91YmxlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHQwLmZsb2F0RmllbGQsIHQwLmludEZpZWxkLCB0MC5sb25nRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHQwLnNob3J0RmllbGQsIHQwLnN0cmluZ0ZpZWxkIEZST00gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWxsRmllbGRUeXBlcyB0MCBXSEVSRSB0MC5pZCA9IFxcPyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgRk9SIFVQREFURSBPRiBvcHRpbWl6ZSBmb3IgMSByb3ciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaXQgaXMgREIyIHY4MiBvciBsYXRlcgorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgoKERCMkRpY3Rpb25hcnkpZGljdCkuZ2V0RGIyU2VydmVyVHlwZSgpID09IDMpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoKERCMkRpY3Rpb25hcnkpZGljdCkuZ2V0RGIyU2VydmVyVHlwZSgpID09IDQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzcWwuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U1FMKCJTRUxFQ1QgdDAuYm9vbGVhbkZpZWxkLCB0MC5ieXRlRmllbGQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInQwLmNoYXJGaWVsZCwgdDAuZGF0ZUZpZWxkLCB0MC5kb3VibGVGaWVsZCwiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdDAuZmxvYXRGaWVsZCwgdDAuaW50RmllbGQsIHQwLmxvbmdGaWVsZCwiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdDAuc2hvcnRGaWVsZCwgdDAuc3RyaW5nRmllbGQgRlJPTSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJBbGxGaWVsZFR5cGVzIHQwIFdIRVJFIHQwLmlkID0gXFw/ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBGT1IgUkVBRCBPTkxZIFdJVEggUlMgVVNFIEFORCBLRUVQIFVQREFURSBMT0NLUyIgCisgICAgICAgICAgICAgICAgICAgICAgICArICIgb3B0aW1pemUgZm9yIDEgcm93Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgoREIyRGljdGlvbmFyeSlkaWN0KS5nZXREYjJTZXJ2ZXJUeXBlKCkgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFNRTCgiU0VMRUNUIHQwLmJvb2xlYW5GaWVsZCwgdDAuYnl0ZUZpZWxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ0MC5jaGFyRmllbGQsIHQwLmRhdGVGaWVsZCwgdDAuZG91YmxlRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHQwLmZsb2F0RmllbGQsIHQwLmludEZpZWxkLCB0MC5sb25nRmllbGQsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHQwLnNob3J0RmllbGQsIHQwLnN0cmluZ0ZpZWxkIEZST00gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWxsRmllbGRUeXBlcyB0MCBXSEVSRSB0MC5pZCA9IFxcPyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgRk9SIFJFQUQgT05MWSBXSVRIIFJTIFVTRSBBTkQgS0VFUCBFWENMVVNJVkUgTE9DS1MiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgb3B0aW1pemUgZm9yIDEgcm93Iik7CisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiT3BlbkpQQSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBwZXItcXVlcnkgaXNvbGF0aW9uICIgCisgICAgICAgICAgICAgICAgICAgICAgICArICJsZXZlbCBjb25maWd1cmF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgZGF0YWJhc2VzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJEQjIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgIAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5yb2xsYmFjaygpOworICAgICAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0NvbXBhbnlNb2RlbFRlc3QuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0NvbXBhbnlNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJjOTRmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvQ29tcGFueU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueTsKKworaW1wb3J0IGphdmEuYmVhbnMuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC4qOworCisvKiogCisgKiBHZW5lcmljIHRlc3QgY2FzZSB0aGF0IHdpbGwgYmUgZXh0ZW5kZWQgYnkgYSBjb25jcmV0ZSBjb21wYW55CisgKiBtb2RlbCBzdWJjbGFzcy4KKyAqICAKKyAqIEBhdXRob3IgIE1hcmMgUHJ1ZCdob21tZWF1eAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcGFueU1vZGVsVGVzdCAKKyAgICBleHRlbmRzIFNpbmdsZUVNVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPENsYXNzLENsYXNzPiBmYWN0b3J5Q2xhc3NlczsKKyAgICBwcml2YXRlIE1hcDxDbGFzcyxDbGFzcz4gaW1wbHM7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgLy8gbWFrZSBhIG1hcCBvZiB0aGUgaW1wbGVtZW50YXRpb25zIGJhc2VkIG9uIHRoZSBjbGFzcyBuYW1lcyBpbgorICAgICAgICAvLyB0aGUgY3VycmVudCBwYWNrYWdlIG9mIHRoZSB0ZXN0IHN1YmNsYXNzCisgICAgICAgIGltcGxzID0gbmV3IEhhc2hNYXA8Q2xhc3MsQ2xhc3M+KCk7CisgICAgICAgIGltcGxzLnB1dChJQWRkcmVzcy5jbGFzcywgbG9jYWxDbGFzcygiQWRkcmVzcyIpKTsKKyAgICAgICAgaW1wbHMucHV0KElDb21wYW55LmNsYXNzLCBsb2NhbENsYXNzKCJDb21wYW55IikpOworICAgICAgICBpbXBscy5wdXQoSUN1c3RvbWVyLmNsYXNzLCBsb2NhbENsYXNzKCJDdXN0b21lciIpKTsKKyAgICAgICAgaW1wbHMucHV0KElQZXJzb24uY2xhc3MsIGxvY2FsQ2xhc3MoIlBlcnNvbiIpKTsKKyAgICAgICAgaW1wbHMucHV0KElFbXBsb3llZS5jbGFzcywgbG9jYWxDbGFzcygiRW1wbG95ZWUiKSk7CisgICAgICAgIGltcGxzLnB1dChJRnVsbFRpbWVFbXBsb3llZS5jbGFzcywgbG9jYWxDbGFzcygiRnVsbFRpbWVFbXBsb3llZSIpKTsKKyAgICAgICAgaW1wbHMucHV0KElMaW5lSXRlbS5jbGFzcywgbG9jYWxDbGFzcygiTGluZUl0ZW0iKSk7CisgICAgICAgIGltcGxzLnB1dChJUHJvZHVjdE9yZGVyLmNsYXNzLCBsb2NhbENsYXNzKCJQcm9kdWN0T3JkZXIiKSk7CisgICAgICAgIGltcGxzLnB1dChJUGFydFRpbWVFbXBsb3llZS5jbGFzcywgbG9jYWxDbGFzcygiUGFydFRpbWVFbXBsb3llZSIpKTsKKyAgICAgICAgaW1wbHMucHV0KElQcm9kdWN0LmNsYXNzLCBsb2NhbENsYXNzKCJQcm9kdWN0IikpOworCisgICAgICAgIHNldFVwKGltcGxzLnZhbHVlcygpLnRvQXJyYXkobmV3IENsYXNzW2ltcGxzLnNpemUoKV0pKTsKKyAgICAgICAgY2hlY2tNb2RlbCgpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3MgbG9jYWxDbGFzcyhTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgcGtnID0gZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUocGtnICsgIi4iICsgbmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJ1bnMgdGhyb3VnaCBiYXNpYyBxdWVyaWVzIGFnYWluc3QgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIGFsbAorICAgICAqIG9mIHRoZSBrbm93biBwZXJzaXN0ZW50IGNsYXNzZXMuIFdlJ3JlIGp1c3QgY2hlY2tpbmcgaGVyZSB0bworICAgICAqIG1ha2Ugc3VyZSB0aGUgcXVlcmllcyBjYW4gYmUgZXhlY3V0ZWQgd2l0aG91dCBwcm9ibGVtLiBRdWVyaWVzCisgICAgICogc2hvdWxkIGFsd2F5cyByZXR1cm4gYWxsIGtub3duIGluc3RhbmNlcyBpbiB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKENsYXNzIGMgOiBpbXBscy52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcGQgOgorICAgICAgICAgICAgICAgIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhjKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkpIHsKKworICAgICAgICAgICAgICAgIGlmIChwZC5nZXRXcml0ZU1ldGhvZCgpID09IG51bGwpIC8vIGlnbm9yZSByZWFkLW9ubHkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBxdWVyaWVzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIGdldEJhc2ljUXVlcmllcyhxdWVyaWVzLCBwZCwgInguIik7CisKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBpbmRpdmlkdWFsIHF1ZXJpZXMKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBxdWVyeSA6IHF1ZXJpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluZChjLCAid2hlcmUgIiArIHF1ZXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZChzdHIubGVuZ3RoKCkgPiAwID8gIiBvciAiIDogIiIpLmFwcGVuZChxdWVyeSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbm93IGV4ZWN1dGUgYWxsIHRoZSBxdWVyaWVzIGNvbWJpbmVkCisgICAgICAgICAgICAgICAgZmluZChjLCAid2hlcmUgIiArIHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGdldEJhc2ljUXVlcmllcyhTZXQ8U3RyaW5nPiBxdWVyaWVzLCBQcm9wZXJ0eURlc2NyaXB0b3IgcGQsCisgICAgICAgIFN0cmluZyBwcmVmaXgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIG1heCBsZXZlbCBvZiBmaWVsZCB0cmF2ZXJzYWw6IDMKKyAgICAgICAgLy8gIyMjIGlmIChwcmVmaXguc3BsaXQoIlxcLiIpLmxlbmd0aCA+IDMpCisgICAgICAgIGlmIChwcmVmaXguc3BsaXQoIlxcLiIpLmxlbmd0aCA+IDIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFByb3BlcnR5VHlwZSgpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICsgcGQuZ2V0TmFtZSgpOworCisgICAgICAgIGlmICghcXVlcmllcy5hZGQobmFtZSArICIgaXMgbm90IG51bGwiKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBxdWVyaWVzLmFkZChuYW1lICsgIiBpcyBudWxsIik7CisKKyAgICAgICAgaWYgKHR5cGUuaXNBc3NpZ25hYmxlRnJvbShOdW1iZXIuY2xhc3MpIHx8IHR5cGUgPT0gaW50LmNsYXNzIHx8CisgICAgICAgICAgICB0eXBlID09IGRvdWJsZS5jbGFzcyB8fCB0eXBlID09IGZsb2F0LmNsYXNzIHx8CisgICAgICAgICAgICB0eXBlID09IGxvbmcuY2xhc3MgfHwgdHlwZSA9PSBzaG9ydC5jbGFzcykgeworICAgICAgICAgICAgcXVlcmllcy5hZGQobmFtZSArICIgPSAwIik7CisgICAgICAgICAgICBxdWVyaWVzLmFkZChuYW1lICsgIiA8PiAwIik7CisgICAgICAgICAgICBxdWVyaWVzLmFkZChuYW1lICsgIiA+IDAiKTsKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKG5hbWUgKyAiIDwgMCIpOworICAgICAgICAgICAgcXVlcmllcy5hZGQobmFtZSArICIgPj0gMCIpOworICAgICAgICAgICAgcXVlcmllcy5hZGQobmFtZSArICIgPD0gMCIpOworICAgICAgICAgICAgcXVlcmllcy5hZGQoInNxcnQoIiArIG5hbWUgKyAiKSA8PiAwIik7CisgICAgICAgICAgICBxdWVyaWVzLmFkZCgiYWJzKCIgKyBuYW1lICsgIikgPD4gMCIpOworICAgICAgICAgICAgLy8gcXVlcmllcy5hZGQoIm1vZCgiICsgbmFtZSArICIsIDUpIDw+IDAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oQ29sbGVjdGlvbi5jbGFzcykpIHsKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKG5hbWUgKyAiIElTIEVNUFRZIik7CisgICAgICAgICAgICBxdWVyaWVzLmFkZChuYW1lICsgIiBJUyBOT1QgRU1QVFkiKTsKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKCJzaXplKCIgKyBuYW1lICsgIikgPD4gMCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUuaXNBc3NpZ25hYmxlRnJvbShTdHJpbmcuY2xhc3MpKSB7CisgICAgICAgICAgICBxdWVyaWVzLmFkZCgibG93ZXIoIiArIG5hbWUgKyAiKSA9ICd4JyIpOworICAgICAgICAgICAgcXVlcmllcy5hZGQoInVwcGVyKCIgKyBuYW1lICsgIikgPSAneCciKTsKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKCJjb25jYXQoIiArIG5hbWUgKyAiLCAiICsgbmFtZSArICIpID0gJ3gnIik7CisgICAgICAgICAgICBxdWVyaWVzLmFkZCgic3Vic3RyaW5nKCIgKyBuYW1lICsgIiwgMSwgMikgPSAneCciKTsKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKCJsZW5ndGgoIiArIG5hbWUgKyAiKSA+IDAiKTsKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKCJsb2NhdGUoIiArIG5hbWUgKyAiLCAneCcsIDEpID4gMCIpOworICAgICAgICAgICAgcXVlcmllcy5hZGQoInRyaW0obGVhZGluZyAnICcgZnJvbSAiICsgbmFtZSArICIpID0gJ3gnIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKERhdGUuY2xhc3MpKSB7CisgICAgICAgICAgICBxdWVyaWVzLmFkZChuYW1lICsgIiA8PiBDVVJSRU5UX1RJTUVTVEFNUCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVsYXRpb24gaXMgYW4gZW50aXR5IC4uLiBhZGQgYWxsIHRoZSByZWxhdGlvbnMKKyAgICAgICAgaWYgKGltcGxzLmNvbnRhaW5zS2V5KHR5cGUpIHx8IGltcGxzLmNvbnRhaW5zVmFsdWUodHlwZSkpIHsKKyAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIGRlc2MgOgorICAgICAgICAgICAgICAgIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyh0eXBlKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkpIHsKKworICAgICAgICAgICAgICAgIGlmIChkZXNjLmdldFdyaXRlTWV0aG9kKCkgPT0gbnVsbCkgLy8gaWdub3JlIHJlYWQtb25seQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmVjdXJzaW9uCisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi4iICsgZGVzYy5nZXROYW1lKCkgKyAiLiIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGdldEJhc2ljUXVlcmllcyhxdWVyaWVzLCBkZXNjLCBuYW1lICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2hlY2tNb2RlbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZlcmlmeU1vZGVsKCk7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBleGlzdGluZyBpbnN0YW5jZXMKKyAgICAgICAgICAgIGNsZWFyKGVtZiwgaW1wbHMudmFsdWVzKCkudG9BcnJheShuZXcgQ2xhc3NbaW1wbHMuc2l6ZSgpXSkpOworCisgICAgICAgICAgICAvLyBzaW5jZSB0aGUgZmFjdG9yeSBtZXRob2QgbmVlZHMgdG8gYmUgc3RhdGljLCB3ZSBuZWVkIHRvIHN0b3JlCisgICAgICAgICAgICAvLyB0aGUgY2xhc3NlcyBzdGF0aWNhbGx5CisgICAgICAgICAgICBmYWN0b3J5Q2xhc3NlcyA9IGltcGxzOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEV4Y2VwdGlvbj4gZXhjZXB0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PEV4Y2VwdGlvbj4oKTsKKyAgICAgICAgICAgICAgICBYTUxEZWNvZGVyIGRlY29kZXIgPSBuZXcgWE1MRGVjb2RlcihDb21wYW55TW9kZWxUZXN0LmNsYXNzLgorICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUFzU3RyZWFtKCJjb21wYW5pZXMueG1sIikpOworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0RXhjZXB0aW9uTGlzdGVuZXIobmV3IEV4Y2VwdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25UaHJvd24oRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBvYnMgPSAoQ29sbGVjdGlvbikgZGVjb2Rlci5yZWFkT2JqZWN0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhjZXB0aW9ucy5nZXQoMCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JzKTsKKworICAgICAgICAgICAgICAgIHBlcnNpc3Qob2JzLnRvQXJyYXkoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzc2VzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZlcmlmeU1vZGVsKCk7CisgICAgfQorCisgICAgaW50IHF1ZXJ5Q291bnQoQ2xhc3MgYywgU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBmaW5kKGMsIHF1ZXJ5LCBwYXJhbXMpLnNpemUoKTsKKyAgICB9CisKKyAgICBpbnQgcXVlcnlDb3VudChDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBmaW5kKGMsIG51bGwpLnNpemUoKTsKKyAgICB9CisKKyAgICBDbGFzcyBpbXBsKENsYXNzIGMpIHsKKyAgICAgICAgcmV0dXJuIGltcGxzLmdldChjKTsKKyAgICB9CisKKyAgICB2b2lkIHZlcmlmeU1vZGVsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcXVlcnlDb3VudChpbXBsKElDb21wYW55LmNsYXNzKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTEsIHF1ZXJ5Q291bnQoaW1wbChJQWRkcmVzcy5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHF1ZXJ5Q291bnQoaW1wbChJUHJvZHVjdC5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHF1ZXJ5Q291bnQoaW1wbChJUHJvZHVjdE9yZGVyLmNsYXNzKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcXVlcnlDb3VudChpbXBsKElMaW5lSXRlbS5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHF1ZXJ5Q291bnQoaW1wbChJUGFydFRpbWVFbXBsb3llZS5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHF1ZXJ5Q291bnQoaW1wbChJRnVsbFRpbWVFbXBsb3llZS5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHF1ZXJ5Q291bnQoaW1wbChJQ3VzdG9tZXIuY2xhc3MpKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHF1ZXJ5Q291bnQoaW1wbChJQWRkcmVzcy5jbGFzcyksCisgICAgICAgICAgICAid2hlcmUgeC5zdGF0ZSA9ICdDQSciKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHF1ZXJ5Q291bnQoaW1wbChJQ29tcGFueS5jbGFzcyksCisgICAgICAgICAgICAid2hlcmUgc2l6ZSh4LmVtcGxveWVlcykgPSA0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcXVlcnlDb3VudChpbXBsKElDb21wYW55LmNsYXNzKSwKKyAgICAgICAgICAgICJ3aGVyZSBzaXplKHguZW1wbG95ZWVzKSA9IDAiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHF1ZXJ5Q291bnQoaW1wbChJQ3VzdG9tZXIuY2xhc3MpLAorICAgICAgICAgICAgIndoZXJlIHNpemUoeC5vcmRlcnMpID0gMSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcXVlcnlDb3VudChpbXBsKElQcm9kdWN0T3JkZXIuY2xhc3MpLAorICAgICAgICAgICAgIndoZXJlIHguc2hpcHBlZERhdGUgaXMgbnVsbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHF1ZXJ5Q291bnQoaW1wbChJUHJvZHVjdE9yZGVyLmNsYXNzKSwKKyAgICAgICAgICAgICJ3aGVyZSB4LnNoaXBwZWREYXRlIGlzIG5vdCBudWxsIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBxdWVyeUNvdW50KGltcGwoSUVtcGxveWVlLmNsYXNzKSwKKyAgICAgICAgICAgICJ3aGVyZSB4Lm1hbmFnZXIgaXMgbnVsbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHF1ZXJ5Q291bnQoaW1wbChJRW1wbG95ZWUuY2xhc3MpLAorICAgICAgICAgICAgIndoZXJlIHgubWFuYWdlci5tYW5hZ2VyIGlzIG51bGwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBxdWVyeUNvdW50KGltcGwoSUVtcGxveWVlLmNsYXNzKSwKKyAgICAgICAgICAgICJ3aGVyZSB4Lm1hbmFnZXIubWFuYWdlci5tYW5hZ2VyIGlzIG51bGwiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHF1ZXJ5Q291bnQoaW1wbChJUGVyc29uLmNsYXNzKSwKKyAgICAgICAgICAgICJ3aGVyZSB4LmZpcnN0TmFtZSBsaWtlID8xIGFuZCB4Lmxhc3ROYW1lIGxpa2UgPzEiLCAiTSUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBxdWVyeUNvdW50KGltcGwoSVBlcnNvbi5jbGFzcyksCisgICAgICAgICAgICAid2hlcmUgeC5ob21lQWRkcmVzcy5zdGF0ZSA9ICdDQSciKSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcmlhbGl6ZWQgWE1MLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGUoQ2xhc3MgaW50ZikKKyAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZmFjdG9yeUNsYXNzZXMuZ2V0KGludGYpLm5ld0luc3RhbmNlKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JQWRkcmVzcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUFkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWE4MjRjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUFkZHJlc3MuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueTsKKworcHVibGljIGludGVyZmFjZSBJQWRkcmVzcyB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlZXRBZGRyZXNzKFN0cmluZyBzdHJlZXRBZGRyZXNzKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmVldEFkZHJlc3MoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2l0eSgpOworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGUoU3RyaW5nIHN0YXRlKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3N0YWxDb2RlKFN0cmluZyBwb3N0YWxDb2RlKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvc3RhbENvZGUoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFBob25lTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcik7CisgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZU51bWJlcigpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUNvbXBhbnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lDb21wYW55LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3N2JhZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lDb21wYW55LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGludGVyZmFjZSBJQ29tcGFueSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoSUFkZHJlc3MgYWRkcmVzcyk7CisgICAgcHVibGljIElBZGRyZXNzIGdldEFkZHJlc3MoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldEVtcGxveWVlcyhTZXQ8PyBleHRlbmRzIElFbXBsb3llZT4gZW1wbG95ZWVzKTsKKyAgICBwdWJsaWMgU2V0PD8gZXh0ZW5kcyBJRW1wbG95ZWU+IGdldEVtcGxveWVlcygpOworCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdHMoU2V0PD8gZXh0ZW5kcyBJUHJvZHVjdD4gcHJvZHVjdHMpOworICAgIHB1YmxpYyBTZXQ8PyBleHRlbmRzIElQcm9kdWN0PiBnZXRQcm9kdWN0cygpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUN1c3RvbWVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JQ3VzdG9tZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI1ODMyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUN1c3RvbWVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGludGVyZmFjZSBJQ3VzdG9tZXIgZXh0ZW5kcyBJUGVyc29uIHsKKworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJUHJvZHVjdE9yZGVyPiBvcmRlcnMpOworICAgIHB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJUHJvZHVjdE9yZGVyPiBnZXRPcmRlcnMoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFNoaXBwaW5nQWRkcmVzcyhJQWRkcmVzcyBzaGlwcGluZ0FkZHJlc3MpOworICAgIHB1YmxpYyBJQWRkcmVzcyBnZXRTaGlwcGluZ0FkZHJlc3MoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldEJpbGxpbmdBZGRyZXNzKElBZGRyZXNzIGJpbGxpbmdBZGRyZXNzKTsKKyAgICBwdWJsaWMgSUFkZHJlc3MgZ2V0QmlsbGluZ0FkZHJlc3MoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUVtcGxveWVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlZDFmMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lFbXBsb3llZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55OworCitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUVtcGxveWVlIGV4dGVuZHMgSVBlcnNvbiB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKElGdWxsVGltZUVtcGxveWVlIG1hbmFnZXIpOworICAgIHB1YmxpYyBJRnVsbFRpbWVFbXBsb3llZSBnZXRNYW5hZ2VyKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wYW55KElDb21wYW55IGNvbXBhbnkpOworICAgIHB1YmxpYyBJQ29tcGFueSBnZXRDb21wYW55KCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpOworICAgIHB1YmxpYyBEYXRlIGdldEhpcmVEYXRlKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JRnVsbFRpbWVFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUZ1bGxUaW1lRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg5NGI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSUZ1bGxUaW1lRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueTsKKworcHVibGljIGludGVyZmFjZSBJRnVsbFRpbWVFbXBsb3llZSBleHRlbmRzIElFbXBsb3llZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYWxhcnkoZmxvYXQgc2FsYXJ5KTsKKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2FsYXJ5KCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JTGluZUl0ZW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lMaW5lSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGZkZTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JTGluZUl0ZW0uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueTsKKworcHVibGljIGludGVyZmFjZSBJTGluZUl0ZW0geworCisgICAgcHVibGljIHZvaWQgc2V0UXVhbnRpdHkoaW50IHF1YW50aXR5KTsKKyAgICBwdWJsaWMgaW50IGdldFF1YW50aXR5KCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0KElQcm9kdWN0IHByb2R1Y3QpOworICAgIHB1YmxpYyBJUHJvZHVjdCBnZXRQcm9kdWN0KCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JUGFydFRpbWVFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSVBhcnRUaW1lRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Q2NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSVBhcnRUaW1lRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueTsKKworcHVibGljIGludGVyZmFjZSBJUGFydFRpbWVFbXBsb3llZSBleHRlbmRzIElFbXBsb3llZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWdlKGZsb2F0IHdhZ2UpOworICAgIHB1YmxpYyBmbG9hdCBnZXRXYWdlKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXZWVrbHlIb3VycyhpbnQgd2Vla2x5SG91cnMpOworICAgIHB1YmxpYyBpbnQgZ2V0V2Vla2x5SG91cnMoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lQZXJzb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lQZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWVjNmMyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSVBlcnNvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55OworCitwdWJsaWMgaW50ZXJmYWNlIElQZXJzb24geworCisgICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldEhvbWVBZGRyZXNzKElBZGRyZXNzIGhvbWVBZGRyZXNzKTsKKyAgICBwdWJsaWMgSUFkZHJlc3MgZ2V0SG9tZUFkZHJlc3MoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lQcm9kdWN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JUHJvZHVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjE2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9JUHJvZHVjdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55OworCitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3QgeworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZShieXRlW10gaW1hZ2UpOworICAgIHB1YmxpYyBieXRlW10gZ2V0SW1hZ2UoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFByaWNlKGZsb2F0IHByaWNlKTsKKyAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpY2UoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dG9ycyhTZXQ8PyBleHRlbmRzIElDb21wYW55PiBkaXN0cmlidXRvcnMpOworICAgIHB1YmxpYyBTZXQ8PyBleHRlbmRzIElDb21wYW55PiBnZXREaXN0cmlidXRvcnMoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lQcm9kdWN0T3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L0lQcm9kdWN0T3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I0NGNhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvSVByb2R1Y3RPcmRlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55OworCitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3RPcmRlciB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyhMaXN0PD8gZXh0ZW5kcyBJTGluZUl0ZW0+IGl0ZW1zKTsKKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgSUxpbmVJdGVtPiBnZXRJdGVtcygpOworCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJEYXRlKERhdGUgb3JkZXJEYXRlKTsKKyAgICBwdWJsaWMgRGF0ZSBnZXRPcmRlckRhdGUoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFNoaXBwZWREYXRlKERhdGUgc2hpcHBlZERhdGUpOworICAgIHB1YmxpYyBEYXRlIGdldFNoaXBwZWREYXRlKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21lcihJQ3VzdG9tZXIgY3VzdG9tZXIpOworICAgIHB1YmxpYyBJQ3VzdG9tZXIgZ2V0Q3VzdG9tZXIoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL0FkZHJlc3MuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL0FkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjkzYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvQWRkcmVzcy5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmJhc2ljOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJCQVNfQWRkcmVzcyIpCitwdWJsaWMgY2xhc3MgQWRkcmVzcyBpbXBsZW1lbnRzIElBZGRyZXNzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlkQ291bnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkID0gaWRDb3VudGVyKys7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBzdHJlZXRBZGRyZXNzOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgcG9zdGFsQ29kZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHBob25lTnVtYmVyOworCisgICAgcHVibGljIHZvaWQgc2V0U3RyZWV0QWRkcmVzcyhTdHJpbmcgc3RyZWV0QWRkcmVzcykgeworICAgICAgICB0aGlzLnN0cmVldEFkZHJlc3MgPSBzdHJlZXRBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyZWV0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWV0QWRkcmVzczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKKyAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNpdHk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShTdHJpbmcgc3RhdGUpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXRlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UG9zdGFsQ29kZShTdHJpbmcgcG9zdGFsQ29kZSkgeworICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBwb3N0YWxDb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdGFsQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucG9zdGFsQ29kZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFBob25lTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcikgeworICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gcGhvbmVOdW1iZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVOdW1iZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvQ29tcGFueS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvQ29tcGFueS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmFmYjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9Db21wYW55LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkJBU19Db21wYW55IikKK3B1YmxpYyBjbGFzcyBDb21wYW55IGltcGxlbWVudHMgSUNvbXBhbnkgeworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRDb3VudGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGxvbmcgaWQgPSBpZENvdW50ZXIrKzsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsKKworICAgIEBPbmVUb01hbnkobWFwcGVkQnk9ImNvbXBhbnkiKQorICAgIHByaXZhdGUgU2V0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgSGFzaFNldDxFbXBsb3llZT4oKTsKKworICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PSJkaXN0cmlidXRvcnMiKQorICAgIHByaXZhdGUgU2V0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IEhhc2hTZXQ8UHJvZHVjdD4oKTsKKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKElBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gKEFkZHJlc3MpIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3M7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbXBsb3llZXMoU2V0PD8gZXh0ZW5kcyBJRW1wbG95ZWU+IGVtcGxveWVlcykgeworICAgICAgICB0aGlzLmVtcGxveWVlcyA9IChTZXQ8RW1wbG95ZWU+KSBlbXBsb3llZXM7CisgICAgfQorCisgICAgcHVibGljIFNldDxFbXBsb3llZT4gZ2V0RW1wbG95ZWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbXBsb3llZXM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0cyhTZXQ8PyBleHRlbmRzIElQcm9kdWN0PiBwcm9kdWN0cykgeworICAgICAgICB0aGlzLnByb2R1Y3RzID0gKFNldDxQcm9kdWN0PikgcHJvZHVjdHM7CisgICAgfQorCisgICAgcHVibGljIFNldDxQcm9kdWN0PiBnZXRQcm9kdWN0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdHM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9DdXN0b21lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvQ3VzdG9tZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzFmMzNkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvQ3VzdG9tZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5iYXNpYzsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iQkFTX0N1c3RvbWVyIikKK3B1YmxpYyBjbGFzcyBDdXN0b21lciBleHRlbmRzIFBlcnNvbiBpbXBsZW1lbnRzIElDdXN0b21lciB7CisgICAgQE9uZVRvTWFueShtYXBwZWRCeT0iY3VzdG9tZXIiKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbjxQcm9kdWN0T3JkZXI+IG9yZGVycyA9IG5ldyBBcnJheUxpc3Q8UHJvZHVjdE9yZGVyPigpOworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBBZGRyZXNzIHNoaXBwaW5nQWRkcmVzczsKKworICAgIEBPbmVUb09uZQorICAgIHByaXZhdGUgQWRkcmVzcyBiaWxsaW5nQWRkcmVzczsKKworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJUHJvZHVjdE9yZGVyPiBvcmRlcnMpIHsKKyAgICAgICAgdGhpcy5vcmRlcnMgPSAoQ29sbGVjdGlvbjxQcm9kdWN0T3JkZXI+KSBvcmRlcnM7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248UHJvZHVjdE9yZGVyPiBnZXRPcmRlcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9yZGVyczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFNoaXBwaW5nQWRkcmVzcyhJQWRkcmVzcyBzaGlwcGluZ0FkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5zaGlwcGluZ0FkZHJlc3MgPSAoQWRkcmVzcykgc2hpcHBpbmdBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBJQWRkcmVzcyBnZXRTaGlwcGluZ0FkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNoaXBwaW5nQWRkcmVzczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEJpbGxpbmdBZGRyZXNzKElBZGRyZXNzIGJpbGxpbmdBZGRyZXNzKSB7CisgICAgICAgIHRoaXMuYmlsbGluZ0FkZHJlc3MgPSAoQWRkcmVzcykgYmlsbGluZ0FkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldEJpbGxpbmdBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nQWRkcmVzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9FbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTFmNTcwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5iYXNpYzsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iQkFTX0VtcGxveWVlIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbXBsb3llZSBleHRlbmRzIFBlcnNvbiBpbXBsZW1lbnRzIElFbXBsb3llZSB7CisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBGdWxsVGltZUVtcGxveWVlIG1hbmFnZXI7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIENvbXBhbnkgY29tcGFueTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBEYXRlIGhpcmVEYXRlOworCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihJRnVsbFRpbWVFbXBsb3llZSBtYW5hZ2VyKSB7CisgICAgICAgIHRoaXMubWFuYWdlciA9IChGdWxsVGltZUVtcGxveWVlKSBtYW5hZ2VyOworICAgIH0KKworICAgIHB1YmxpYyBJRnVsbFRpbWVFbXBsb3llZSBnZXRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFueShJQ29tcGFueSBjb21wYW55KSB7CisgICAgICAgIHRoaXMuY29tcGFueSA9IChDb21wYW55KSBjb21wYW55OworICAgIH0KKworICAgIHB1YmxpYyBJQ29tcGFueSBnZXRDb21wYW55KCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21wYW55OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGhpcy50aXRsZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKKyAgICAgICAgdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldEhpcmVEYXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oaXJlRGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9GdWxsVGltZUVtcGxveWVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9GdWxsVGltZUVtcGxveWVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0YTFiNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL0Z1bGxUaW1lRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5iYXNpYzsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iQkFTX0Z1bGxUaW1lRW1wbG95ZWUiKQorcHVibGljIGNsYXNzIEZ1bGxUaW1lRW1wbG95ZWUgZXh0ZW5kcyBFbXBsb3llZQorICAgIGltcGxlbWVudHMgSUZ1bGxUaW1lRW1wbG95ZWUgeworICAgIEBCYXNpYworICAgIHByaXZhdGUgZmxvYXQgc2FsYXJ5OworCisgICAgcHVibGljIHZvaWQgc2V0U2FsYXJ5KGZsb2F0IHNhbGFyeSkgeworICAgICAgICB0aGlzLnNhbGFyeSA9IHNhbGFyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2FsYXJ5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5zYWxhcnk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvTGluZUl0ZW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL0xpbmVJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYzU5NAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL0xpbmVJdGVtLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuYmFzaWM7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkJBU19MaW5lSXRlbSIpCitwdWJsaWMgY2xhc3MgTGluZUl0ZW0gaW1wbGVtZW50cyBJTGluZUl0ZW0geworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRDb3VudGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGxvbmcgaWQgPSBpZENvdW50ZXIrKzsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgaW50IHF1YW50aXR5OworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWFudGl0eShpbnQgcXVhbnRpdHkpIHsKKyAgICAgICAgdGhpcy5xdWFudGl0eSA9IHF1YW50aXR5OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UXVhbnRpdHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnF1YW50aXR5OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdChJUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgIHRoaXMucHJvZHVjdCA9IChQcm9kdWN0KSBwcm9kdWN0OworICAgIH0KKworICAgIHB1YmxpYyBJUHJvZHVjdCBnZXRQcm9kdWN0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvUGFydFRpbWVFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvUGFydFRpbWVFbXBsb3llZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjdmMjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9QYXJ0VGltZUVtcGxveWVlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuYmFzaWM7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkJBU19QYXJ0VGltZUVtcGxveWVlIikKK3B1YmxpYyBjbGFzcyBQYXJ0VGltZUVtcGxveWVlIGV4dGVuZHMgRW1wbG95ZWUKKyAgICBpbXBsZW1lbnRzIElQYXJ0VGltZUVtcGxveWVlIHsKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGZsb2F0IHdhZ2U7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGludCB3ZWVrbHlIb3VyczsKKworICAgIHB1YmxpYyB2b2lkIHNldFdhZ2UoZmxvYXQgd2FnZSkgeworICAgICAgICB0aGlzLndhZ2UgPSB3YWdlOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRXYWdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy53YWdlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0V2Vla2x5SG91cnMoaW50IHdlZWtseUhvdXJzKSB7CisgICAgICAgIHRoaXMud2Vla2x5SG91cnMgPSB3ZWVrbHlIb3VyczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdlZWtseUhvdXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy53ZWVrbHlIb3VyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9QZXJzb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTIxMDMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9QZXJzb24uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5iYXNpYzsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iQkFTX1BlcnNvbiIpCitASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSkKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzb24gaW1wbGVtZW50cyBJUGVyc29uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlkQ291bnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkID0gaWRDb3VudGVyKys7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKKworICAgIEBPbmVUb09uZQorICAgIHByaXZhdGUgQWRkcmVzcyBob21lQWRkcmVzczsKKworICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKSB7CisgICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5maXJzdE5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpIHsKKyAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxhc3ROYW1lOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SG9tZUFkZHJlc3MoSUFkZHJlc3MgaG9tZUFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5ob21lQWRkcmVzcyA9IChBZGRyZXNzKSBob21lQWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgSUFkZHJlc3MgZ2V0SG9tZUFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvbWVBZGRyZXNzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvUHJvZHVjdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvUHJvZHVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODUzNWMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9Qcm9kdWN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkJBU19Qcm9kdWN0IikKK3B1YmxpYyBjbGFzcyBQcm9kdWN0IGltcGxlbWVudHMgSVByb2R1Y3QgeworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRDb3VudGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGxvbmcgaWQgPSBpZENvdW50ZXIrKzsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGJ5dGVbXSBpbWFnZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgZmxvYXQgcHJpY2U7CisKKyAgICBATWFueVRvTWFueQorICAgIHByaXZhdGUgU2V0PENvbXBhbnk+IGRpc3RyaWJ1dG9ycyA9IG5ldyBIYXNoU2V0PENvbXBhbnk+KCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SW1hZ2UoYnl0ZVtdIGltYWdlKSB7CisgICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEltYWdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbWFnZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFByaWNlKGZsb2F0IHByaWNlKSB7CisgICAgICAgIHRoaXMucHJpY2UgPSBwcmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByaWNlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0b3JzKFNldDw/IGV4dGVuZHMgSUNvbXBhbnk+IGRpc3RyaWJ1dG9ycykgeworICAgICAgICB0aGlzLmRpc3RyaWJ1dG9ycyA9IChTZXQ8Q29tcGFueT4pIGRpc3RyaWJ1dG9yczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PENvbXBhbnk+IGdldERpc3RyaWJ1dG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGlzdHJpYnV0b3JzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvUHJvZHVjdE9yZGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9iYXNpYy9Qcm9kdWN0T3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU1ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvUHJvZHVjdE9yZGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkJBU19Qcm9kdWN0T3JkZXIiKQorcHVibGljIGNsYXNzIFByb2R1Y3RPcmRlciBpbXBsZW1lbnRzIElQcm9kdWN0T3JkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRDb3VudGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGxvbmcgaWQgPSBpZENvdW50ZXIrKzsKKworICAgIEBPbmVUb01hbnkKKyAgICBwcml2YXRlIExpc3Q8TGluZUl0ZW0+IGl0ZW1zID0gbmV3IExpbmtlZExpc3Q8TGluZUl0ZW0+KCk7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIERhdGUgb3JkZXJEYXRlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBEYXRlIHNoaXBwZWREYXRlOworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBDdXN0b21lciBjdXN0b21lcjsKKworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1zKExpc3Q8PyBleHRlbmRzIElMaW5lSXRlbT4gaXRlbXMpIHsKKyAgICAgICAgdGhpcy5pdGVtcyA9IChMaXN0PExpbmVJdGVtPikgaXRlbXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8TGluZUl0ZW0+IGdldEl0ZW1zKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pdGVtczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyRGF0ZShEYXRlIG9yZGVyRGF0ZSkgeworICAgICAgICB0aGlzLm9yZGVyRGF0ZSA9IG9yZGVyRGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRPcmRlckRhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9yZGVyRGF0ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFNoaXBwZWREYXRlKERhdGUgc2hpcHBlZERhdGUpIHsKKyAgICAgICAgdGhpcy5zaGlwcGVkRGF0ZSA9IHNoaXBwZWREYXRlOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldFNoaXBwZWREYXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zaGlwcGVkRGF0ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbWVyKElDdXN0b21lciBjdXN0b21lcikgeworICAgICAgICB0aGlzLmN1c3RvbWVyID0gKEN1c3RvbWVyKSBjdXN0b21lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgSUN1c3RvbWVyIGdldEN1c3RvbWVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21lcjsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL1Rlc3RCYXNpY0NvbXBhbnlNb2RlbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvYmFzaWMvVGVzdEJhc2ljQ29tcGFueU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4MGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2Jhc2ljL1Rlc3RCYXNpY0NvbXBhbnlNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmJhc2ljOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK3B1YmxpYyBjbGFzcyBUZXN0QmFzaWNDb21wYW55TW9kZWwgZXh0ZW5kcyBDb21wYW55TW9kZWxUZXN0IHsKK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L0FkZHJlc3MuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9BZGRyZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzNjBjOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9BZGRyZXNzLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuZmV0Y2hsYXp5OworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJMQVpfQWRkcmVzcyIpCitwdWJsaWMgY2xhc3MgQWRkcmVzcyBpbXBsZW1lbnRzIElBZGRyZXNzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlkQ291bnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkID0gaWRDb3VudGVyKys7CisKKyAgICBAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0QWRkcmVzczsKKworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIFN0cmluZyBjaXR5OworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGU7CisKKyAgICBAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBTdHJpbmcgcGhvbmVOdW1iZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlZXRBZGRyZXNzKFN0cmluZyBzdHJlZXRBZGRyZXNzKSB7CisgICAgICAgIHRoaXMuc3RyZWV0QWRkcmVzcyA9IHN0cmVldEFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJlZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdHJlZXRBZGRyZXNzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q2l0eShTdHJpbmcgY2l0eSkgeworICAgICAgICB0aGlzLmNpdHkgPSBjaXR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2l0eTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKFN0cmluZyBzdGF0ZSkgeworICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3N0YWxDb2RlKFN0cmluZyBwb3N0YWxDb2RlKSB7CisgICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IHBvc3RhbENvZGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQb3N0YWxDb2RlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wb3N0YWxDb2RlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UGhvbmVOdW1iZXIoU3RyaW5nIHBob25lTnVtYmVyKSB7CisgICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBob25lTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5waG9uZU51bWJlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9Db21wYW55LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvQ29tcGFueS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvQ29tcGFueS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmZldGNobGF6eTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iTEFaX0NvbXBhbnkiKQorcHVibGljIGNsYXNzIENvbXBhbnkgaW1wbGVtZW50cyBJQ29tcGFueSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZENvdW50ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IGlkQ291bnRlcisrOworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7CisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5PSJjb21wYW55IiwgZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBTZXQ8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBIYXNoU2V0PEVtcGxveWVlPigpOworCisgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9ImRpc3RyaWJ1dG9ycyIsIGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgU2V0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IEhhc2hTZXQ8UHJvZHVjdD4oKTsKKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKElBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gKEFkZHJlc3MpIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3M7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbXBsb3llZXMoU2V0PD8gZXh0ZW5kcyBJRW1wbG95ZWU+IGVtcGxveWVlcykgeworICAgICAgICB0aGlzLmVtcGxveWVlcyA9IChTZXQ8RW1wbG95ZWU+KSBlbXBsb3llZXM7CisgICAgfQorCisgICAgcHVibGljIFNldDxFbXBsb3llZT4gZ2V0RW1wbG95ZWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbXBsb3llZXM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0cyhTZXQ8PyBleHRlbmRzIElQcm9kdWN0PiBwcm9kdWN0cykgeworICAgICAgICB0aGlzLnByb2R1Y3RzID0gKFNldDxQcm9kdWN0PikgcHJvZHVjdHM7CisgICAgfQorCisgICAgcHVibGljIFNldDxQcm9kdWN0PiBnZXRQcm9kdWN0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdHM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvQ3VzdG9tZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9DdXN0b21lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZGZiNzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvQ3VzdG9tZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5mZXRjaGxhenk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkxBWl9DdXN0b21lciIpCitwdWJsaWMgY2xhc3MgQ3VzdG9tZXIgZXh0ZW5kcyBQZXJzb24gaW1wbGVtZW50cyBJQ3VzdG9tZXIgeworICAgIEBPbmVUb01hbnkobWFwcGVkQnk9ImN1c3RvbWVyIixmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIENvbGxlY3Rpb248UHJvZHVjdE9yZGVyPiBvcmRlcnMgPSBuZXcgQXJyYXlMaXN0PFByb2R1Y3RPcmRlcj4oKTsKKworICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIEFkZHJlc3Mgc2hpcHBpbmdBZGRyZXNzOworCisgICAgQE9uZVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgQWRkcmVzcyBiaWxsaW5nQWRkcmVzczsKKworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJUHJvZHVjdE9yZGVyPiBvcmRlcnMpIHsKKyAgICAgICAgdGhpcy5vcmRlcnMgPSAoQ29sbGVjdGlvbjxQcm9kdWN0T3JkZXI+KSBvcmRlcnM7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248UHJvZHVjdE9yZGVyPiBnZXRPcmRlcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9yZGVyczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFNoaXBwaW5nQWRkcmVzcyhJQWRkcmVzcyBzaGlwcGluZ0FkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5zaGlwcGluZ0FkZHJlc3MgPSAoQWRkcmVzcykgc2hpcHBpbmdBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBJQWRkcmVzcyBnZXRTaGlwcGluZ0FkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNoaXBwaW5nQWRkcmVzczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEJpbGxpbmdBZGRyZXNzKElBZGRyZXNzIGJpbGxpbmdBZGRyZXNzKSB7CisgICAgICAgIHRoaXMuYmlsbGluZ0FkZHJlc3MgPSAoQWRkcmVzcykgYmlsbGluZ0FkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldEJpbGxpbmdBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nQWRkcmVzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvRW1wbG95ZWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9FbXBsb3llZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjMwZDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5mZXRjaGxhenk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkxBWl9FbXBsb3llZSIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBQZXJzb24gaW1wbGVtZW50cyBJRW1wbG95ZWUgeworICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIEZ1bGxUaW1lRW1wbG95ZWUgbWFuYWdlcjsKKworICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIENvbXBhbnkgY29tcGFueTsKKworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIERhdGUgaGlyZURhdGU7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKElGdWxsVGltZUVtcGxveWVlIG1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gKEZ1bGxUaW1lRW1wbG95ZWUpIG1hbmFnZXI7CisgICAgfQorCisgICAgcHVibGljIElGdWxsVGltZUVtcGxveWVlIGdldE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wYW55KElDb21wYW55IGNvbXBhbnkpIHsKKyAgICAgICAgdGhpcy5jb21wYW55ID0gKENvbXBhbnkpIGNvbXBhbnk7CisgICAgfQorCisgICAgcHVibGljIElDb21wYW55IGdldENvbXBhbnkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbXBhbnk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRpdGxlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SGlyZURhdGUoRGF0ZSBoaXJlRGF0ZSkgeworICAgICAgICB0aGlzLmhpcmVEYXRlID0gaGlyZURhdGU7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0SGlyZURhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhpcmVEYXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9GdWxsVGltZUVtcGxveWVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvRnVsbFRpbWVFbXBsb3llZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDVmZTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvRnVsbFRpbWVFbXBsb3llZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmZldGNobGF6eTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iTEFaX0Z1bGxUaW1lRW1wbG95ZWUiKQorcHVibGljIGNsYXNzIEZ1bGxUaW1lRW1wbG95ZWUgZXh0ZW5kcyBFbXBsb3llZQorICAgIGltcGxlbWVudHMgSUZ1bGxUaW1lRW1wbG95ZWUgeworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIGZsb2F0IHNhbGFyeTsKKworICAgIHB1YmxpYyB2b2lkIHNldFNhbGFyeShmbG9hdCBzYWxhcnkpIHsKKyAgICAgICAgdGhpcy5zYWxhcnkgPSBzYWxhcnk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFNhbGFyeSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2FsYXJ5OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9MaW5lSXRlbS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L0xpbmVJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxN2U1OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9MaW5lSXRlbS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmZldGNobGF6eTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iTEFaX0xpbmVJdGVtIikKK3B1YmxpYyBjbGFzcyBMaW5lSXRlbSBpbXBsZW1lbnRzIElMaW5lSXRlbSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZENvdW50ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IGlkQ291bnRlcisrOworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgaW50IHF1YW50aXR5OworCisgICAgQE9uZVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgUHJvZHVjdCBwcm9kdWN0OworCisgICAgcHVibGljIHZvaWQgc2V0UXVhbnRpdHkoaW50IHF1YW50aXR5KSB7CisgICAgICAgIHRoaXMucXVhbnRpdHkgPSBxdWFudGl0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFF1YW50aXR5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5xdWFudGl0eTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3QoSVByb2R1Y3QgcHJvZHVjdCkgeworICAgICAgICB0aGlzLnByb2R1Y3QgPSAoUHJvZHVjdCkgcHJvZHVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgSVByb2R1Y3QgZ2V0UHJvZHVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9QYXJ0VGltZUVtcGxveWVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvUGFydFRpbWVFbXBsb3llZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTBjMjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvUGFydFRpbWVFbXBsb3llZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmZldGNobGF6eTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iTEFaX1BhcnRUaW1lRW1wbG95ZWUiKQorcHVibGljIGNsYXNzIFBhcnRUaW1lRW1wbG95ZWUgZXh0ZW5kcyBFbXBsb3llZQorICAgIGltcGxlbWVudHMgSVBhcnRUaW1lRW1wbG95ZWUgeworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIGZsb2F0IHdhZ2U7CisKKyAgICBAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBpbnQgd2Vla2x5SG91cnM7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWdlKGZsb2F0IHdhZ2UpIHsKKyAgICAgICAgdGhpcy53YWdlID0gd2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0V2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2FnZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFdlZWtseUhvdXJzKGludCB3ZWVrbHlIb3VycykgeworICAgICAgICB0aGlzLndlZWtseUhvdXJzID0gd2Vla2x5SG91cnM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXZWVrbHlIb3VycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2Vla2x5SG91cnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L1BlcnNvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MzYzZjkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvUGVyc29uLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuZmV0Y2hsYXp5OworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJMQVpfUGVyc29uIikKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKQorcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNvbiBpbXBsZW1lbnRzIElQZXJzb24geworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRDb3VudGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGxvbmcgaWQgPSBpZENvdW50ZXIrKzsKKworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisKKyAgICBAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7CisKKyAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBBZGRyZXNzIGhvbWVBZGRyZXNzOworCisgICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHsKKyAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZpcnN0TmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgeworICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGFzdE5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRIb21lQWRkcmVzcyhJQWRkcmVzcyBob21lQWRkcmVzcykgeworICAgICAgICB0aGlzLmhvbWVBZGRyZXNzID0gKEFkZHJlc3MpIGhvbWVBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBJQWRkcmVzcyBnZXRIb21lQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9tZUFkZHJlc3M7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9mZXRjaGxhenkvUHJvZHVjdC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L1Byb2R1Y3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTBmZjAzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L1Byb2R1Y3QuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5mZXRjaGxhenk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkxBWl9Qcm9kdWN0IikKK3B1YmxpYyBjbGFzcyBQcm9kdWN0IGltcGxlbWVudHMgSVByb2R1Y3QgeworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRDb3VudGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGxvbmcgaWQgPSBpZENvdW50ZXIrKzsKKworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgYnl0ZVtdIGltYWdlOworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgZmxvYXQgcHJpY2U7CisKKyAgICBATWFueVRvTWFueShmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIFNldDxDb21wYW55PiBkaXN0cmlidXRvcnMgPSBuZXcgSGFzaFNldDxDb21wYW55PigpOworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlKGJ5dGVbXSBpbWFnZSkgeworICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRJbWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmljZShmbG9hdCBwcmljZSkgeworICAgICAgICB0aGlzLnByaWNlID0gcHJpY2U7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFByaWNlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcmljZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dG9ycyhTZXQ8PyBleHRlbmRzIElDb21wYW55PiBkaXN0cmlidXRvcnMpIHsKKyAgICAgICAgdGhpcy5kaXN0cmlidXRvcnMgPSAoU2V0PENvbXBhbnk+KSBkaXN0cmlidXRvcnM7CisgICAgfQorCisgICAgcHVibGljIFNldDxDb21wYW55PiBnZXREaXN0cmlidXRvcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRpc3RyaWJ1dG9yczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9Qcm9kdWN0T3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9Qcm9kdWN0T3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTExNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L1Byb2R1Y3RPcmRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmZldGNobGF6eTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iTEFaX1Byb2R1Y3RPcmRlciIpCitwdWJsaWMgY2xhc3MgUHJvZHVjdE9yZGVyIGltcGxlbWVudHMgSVByb2R1Y3RPcmRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZENvdW50ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IGlkQ291bnRlcisrOworCisgICAgQE9uZVRvTWFueShmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIExpc3Q8TGluZUl0ZW0+IGl0ZW1zID0gbmV3IExpbmtlZExpc3Q8TGluZUl0ZW0+KCk7CisKKyAgICBAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBEYXRlIG9yZGVyRGF0ZTsKKworICAgIEBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIERhdGUgc2hpcHBlZERhdGU7CisKKyAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBDdXN0b21lciBjdXN0b21lcjsKKworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1zKExpc3Q8PyBleHRlbmRzIElMaW5lSXRlbT4gaXRlbXMpIHsKKyAgICAgICAgdGhpcy5pdGVtcyA9IChMaXN0PExpbmVJdGVtPikgaXRlbXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8TGluZUl0ZW0+IGdldEl0ZW1zKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pdGVtczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyRGF0ZShEYXRlIG9yZGVyRGF0ZSkgeworICAgICAgICB0aGlzLm9yZGVyRGF0ZSA9IG9yZGVyRGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRPcmRlckRhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9yZGVyRGF0ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFNoaXBwZWREYXRlKERhdGUgc2hpcHBlZERhdGUpIHsKKyAgICAgICAgdGhpcy5zaGlwcGVkRGF0ZSA9IHNoaXBwZWREYXRlOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldFNoaXBwZWREYXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zaGlwcGVkRGF0ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbWVyKElDdXN0b21lciBjdXN0b21lcikgeworICAgICAgICB0aGlzLmN1c3RvbWVyID0gKEN1c3RvbWVyKSBjdXN0b21lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgSUN1c3RvbWVyIGdldEN1c3RvbWVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21lcjsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9UZXN0TGF6eUNvbXBhbnlNb2RlbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvZmV0Y2hsYXp5L1Rlc3RMYXp5Q29tcGFueU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxNDMwOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2ZldGNobGF6eS9UZXN0TGF6eUNvbXBhbnlNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmZldGNobGF6eTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitwdWJsaWMgY2xhc3MgVGVzdExhenlDb21wYW55TW9kZWwgZXh0ZW5kcyBDb21wYW55TW9kZWxUZXN0IHsKK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9BZGRyZXNzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9pZGNsYXNzL0FkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVmZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9BZGRyZXNzLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuaWRjbGFzczsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSURDX0FkZHJlc3MiKQorcHVibGljIGNsYXNzIEFkZHJlc3MgaW1wbGVtZW50cyBJQWRkcmVzcyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlkcyA9IDE7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGludCBpZCA9ICsraWRzOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0QWRkcmVzczsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGU7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBwaG9uZU51bWJlcjsKKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmVldEFkZHJlc3MoU3RyaW5nIHN0cmVldEFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5zdHJlZXRBZGRyZXNzID0gc3RyZWV0QWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmVldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0cmVldEFkZHJlc3M7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyBjaXR5KSB7CisgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5jaXR5OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGUoU3RyaW5nIHN0YXRlKSB7CisgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFBvc3RhbENvZGUoU3RyaW5nIHBvc3RhbENvZGUpIHsKKyAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gcG9zdGFsQ29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvc3RhbENvZGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBvc3RhbENvZGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZU51bWJlcihTdHJpbmcgcGhvbmVOdW1iZXIpIHsKKyAgICAgICAgdGhpcy5waG9uZU51bWJlciA9IHBob25lTnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmVOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBob25lTnVtYmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvQ29tcGFueS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9Db21wYW55LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzM2IyYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvQ29tcGFueS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmlkY2xhc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IklEQ19Db21wYW55IikKK3B1YmxpYyBjbGFzcyBDb21wYW55IGltcGxlbWVudHMgSUNvbXBhbnkgeworICAgIHByaXZhdGUgc3RhdGljIGludCBpZHMgPSAxOworCisgICAgQElkCisgICAgcHJpdmF0ZSBpbnQgaWQgPSArK2lkczsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsKKworICAgIEBPbmVUb01hbnkobWFwcGVkQnk9ImNvbXBhbnkiKQorICAgIHByaXZhdGUgU2V0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgSGFzaFNldDxFbXBsb3llZT4oKTsKKworICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PSJkaXN0cmlidXRvcnMiKQorICAgIHByaXZhdGUgU2V0PFByb2R1Y3Q+IHByb2R1Y3RzID0gbmV3IEhhc2hTZXQ8UHJvZHVjdD4oKTsKKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKElBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gKEFkZHJlc3MpIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3M7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbXBsb3llZXMoU2V0PD8gZXh0ZW5kcyBJRW1wbG95ZWU+IGVtcGxveWVlcykgeworICAgICAgICB0aGlzLmVtcGxveWVlcyA9IChTZXQ8RW1wbG95ZWU+KSBlbXBsb3llZXM7CisgICAgfQorCisgICAgcHVibGljIFNldDxFbXBsb3llZT4gZ2V0RW1wbG95ZWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbXBsb3llZXM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0cyhTZXQ8PyBleHRlbmRzIElQcm9kdWN0PiBwcm9kdWN0cykgeworICAgICAgICB0aGlzLnByb2R1Y3RzID0gKFNldDxQcm9kdWN0PikgcHJvZHVjdHM7CisgICAgfQorCisgICAgcHVibGljIFNldDxQcm9kdWN0PiBnZXRQcm9kdWN0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9DdXN0b21lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9DdXN0b21lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzgwMmEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9pZGNsYXNzL0N1c3RvbWVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuaWRjbGFzczsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSURDX0N1c3RvbWVyIikKK3B1YmxpYyBjbGFzcyBDdXN0b21lciBleHRlbmRzIFBlcnNvbiBpbXBsZW1lbnRzIElDdXN0b21lciB7CisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5PSJjdXN0b21lciIpCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFByb2R1Y3RPcmRlcj4gb3JkZXJzID0gbmV3IEFycmF5TGlzdDxQcm9kdWN0T3JkZXI+KCk7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIEFkZHJlc3Mgc2hpcHBpbmdBZGRyZXNzOworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBBZGRyZXNzIGJpbGxpbmdBZGRyZXNzOworCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJzKENvbGxlY3Rpb248PyBleHRlbmRzIElQcm9kdWN0T3JkZXI+IG9yZGVycykgeworICAgICAgICB0aGlzLm9yZGVycyA9IChDb2xsZWN0aW9uPFByb2R1Y3RPcmRlcj4pIG9yZGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxQcm9kdWN0T3JkZXI+IGdldE9yZGVycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0U2hpcHBpbmdBZGRyZXNzKElBZGRyZXNzIHNoaXBwaW5nQWRkcmVzcykgeworICAgICAgICB0aGlzLnNoaXBwaW5nQWRkcmVzcyA9IChBZGRyZXNzKSBzaGlwcGluZ0FkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldFNoaXBwaW5nQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2hpcHBpbmdBZGRyZXNzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QmlsbGluZ0FkZHJlc3MoSUFkZHJlc3MgYmlsbGluZ0FkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5iaWxsaW5nQWRkcmVzcyA9IChBZGRyZXNzKSBiaWxsaW5nQWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgSUFkZHJlc3MgZ2V0QmlsbGluZ0FkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdBZGRyZXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvRW1wbG95ZWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk4MmEyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9FbXBsb3llZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmlkY2xhc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IklEQ19FbXBsb3llZSIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBQZXJzb24gaW1wbGVtZW50cyBJRW1wbG95ZWUgeworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBGdWxsVGltZUVtcGxveWVlIG1hbmFnZXI7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIENvbXBhbnkgY29tcGFueTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBEYXRlIGhpcmVEYXRlOworCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihJRnVsbFRpbWVFbXBsb3llZSBtYW5hZ2VyKSB7CisgICAgICAgIHRoaXMubWFuYWdlciA9IChGdWxsVGltZUVtcGxveWVlKSBtYW5hZ2VyOworICAgIH0KKworICAgIHB1YmxpYyBJRnVsbFRpbWVFbXBsb3llZSBnZXRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFueShJQ29tcGFueSBjb21wYW55KSB7CisgICAgICAgIHRoaXMuY29tcGFueSA9IChDb21wYW55KSBjb21wYW55OworICAgIH0KKworICAgIHB1YmxpYyBJQ29tcGFueSBnZXRDb21wYW55KCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21wYW55OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGhpcy50aXRsZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKKyAgICAgICAgdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldEhpcmVEYXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oaXJlRGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9pZGNsYXNzL0Z1bGxUaW1lRW1wbG95ZWUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvRnVsbFRpbWVFbXBsb3llZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjhiZWIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9pZGNsYXNzL0Z1bGxUaW1lRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5pZGNsYXNzOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJJRENfRnVsbFRpbWVFbXBsb3llZSIpCitwdWJsaWMgY2xhc3MgRnVsbFRpbWVFbXBsb3llZSBleHRlbmRzIEVtcGxveWVlCisgICAgaW1wbGVtZW50cyBJRnVsbFRpbWVFbXBsb3llZSB7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGZsb2F0IHNhbGFyeTsKKworICAgIHB1YmxpYyB2b2lkIHNldFNhbGFyeShmbG9hdCBzYWxhcnkpIHsKKyAgICAgICAgdGhpcy5zYWxhcnkgPSBzYWxhcnk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFNhbGFyeSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2FsYXJ5OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvTGluZUl0ZW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvTGluZUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNhMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9MaW5lSXRlbS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmlkY2xhc3M7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IklEQ19MaW5lSXRlbSIpCitwdWJsaWMgY2xhc3MgTGluZUl0ZW0gaW1wbGVtZW50cyBJTGluZUl0ZW0geworICAgIHByaXZhdGUgc3RhdGljIGludCBpZHMgPSAxOworCisgICAgQElkCisgICAgcHJpdmF0ZSBpbnQgaWQgPSArK2lkczsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgaW50IHF1YW50aXR5OworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWFudGl0eShpbnQgcXVhbnRpdHkpIHsKKyAgICAgICAgdGhpcy5xdWFudGl0eSA9IHF1YW50aXR5OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UXVhbnRpdHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnF1YW50aXR5OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UHJvZHVjdChJUHJvZHVjdCBwcm9kdWN0KSB7CisgICAgICAgIHRoaXMucHJvZHVjdCA9IChQcm9kdWN0KSBwcm9kdWN0OworICAgIH0KKworICAgIHB1YmxpYyBJUHJvZHVjdCBnZXRQcm9kdWN0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvUGFydFRpbWVFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9QYXJ0VGltZUVtcGxveWVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5ODQ2ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvUGFydFRpbWVFbXBsb3llZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmlkY2xhc3M7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IklEQ19QYXJ0VGltZUVtcGxveWVlIikKK3B1YmxpYyBjbGFzcyBQYXJ0VGltZUVtcGxveWVlIGV4dGVuZHMgRW1wbG95ZWUKKyAgICBpbXBsZW1lbnRzIElQYXJ0VGltZUVtcGxveWVlIHsKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGZsb2F0IHdhZ2U7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGludCB3ZWVrbHlIb3VyczsKKworICAgIHB1YmxpYyB2b2lkIHNldFdhZ2UoZmxvYXQgd2FnZSkgeworICAgICAgICB0aGlzLndhZ2UgPSB3YWdlOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRXYWdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy53YWdlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0V2Vla2x5SG91cnMoaW50IHdlZWtseUhvdXJzKSB7CisgICAgICAgIHRoaXMud2Vla2x5SG91cnMgPSB3ZWVrbHlIb3VyczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdlZWtseUhvdXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy53ZWVrbHlIb3VyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9pZGNsYXNzL1BlcnNvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDBiODlhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9QZXJzb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5pZGNsYXNzOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJJRENfUGVyc29uIikKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKQorcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNvbiBpbXBsZW1lbnRzIElQZXJzb24geworICAgIHByaXZhdGUgc3RhdGljIGludCBpZHMgPSAxOworCisgICAgQElkCisgICAgcHJpdmF0ZSBpbnQgaWQgPSArK2lkczsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBBZGRyZXNzIGhvbWVBZGRyZXNzOworCisgICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHsKKyAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZpcnN0TmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgeworICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGFzdE5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRIb21lQWRkcmVzcyhJQWRkcmVzcyBob21lQWRkcmVzcykgeworICAgICAgICB0aGlzLmhvbWVBZGRyZXNzID0gKEFkZHJlc3MpIGhvbWVBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBJQWRkcmVzcyBnZXRIb21lQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9tZUFkZHJlc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9Qcm9kdWN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9pZGNsYXNzL1Byb2R1Y3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QyZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9Qcm9kdWN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuaWRjbGFzczsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSURDX1Byb2R1Y3QiKQorcHVibGljIGNsYXNzIFByb2R1Y3QgaW1wbGVtZW50cyBJUHJvZHVjdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlkcyA9IDE7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGludCBpZCA9ICsraWRzOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgYnl0ZVtdIGltYWdlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBmbG9hdCBwcmljZTsKKworICAgIEBNYW55VG9NYW55CisgICAgcHJpdmF0ZSBTZXQ8Q29tcGFueT4gZGlzdHJpYnV0b3JzID0gbmV3IEhhc2hTZXQ8Q29tcGFueT4oKTsKKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZShieXRlW10gaW1hZ2UpIHsKKyAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0SW1hZ2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmltYWdlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UHJpY2UoZmxvYXQgcHJpY2UpIHsKKyAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRQcmljZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJpY2U7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRvcnMoU2V0PD8gZXh0ZW5kcyBJQ29tcGFueT4gZGlzdHJpYnV0b3JzKSB7CisgICAgICAgIHRoaXMuZGlzdHJpYnV0b3JzID0gKFNldDxDb21wYW55PikgZGlzdHJpYnV0b3JzOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8Q29tcGFueT4gZ2V0RGlzdHJpYnV0b3JzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kaXN0cmlidXRvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9Qcm9kdWN0T3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvUHJvZHVjdE9yZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmODU4YQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvUHJvZHVjdE9yZGVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuaWRjbGFzczsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSURDX1Byb2R1Y3RPcmRlciIpCitwdWJsaWMgY2xhc3MgUHJvZHVjdE9yZGVyIGltcGxlbWVudHMgSVByb2R1Y3RPcmRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlkcyA9IDE7CisKKyAgICBASWQKKyAgICBwcml2YXRlIGludCBpZCA9ICsraWRzOworCisgICAgQE9uZVRvTWFueQorICAgIHByaXZhdGUgTGlzdDxMaW5lSXRlbT4gaXRlbXMgPSBuZXcgTGlua2VkTGlzdDxMaW5lSXRlbT4oKTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgRGF0ZSBvcmRlckRhdGU7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIERhdGUgc2hpcHBlZERhdGU7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIEN1c3RvbWVyIGN1c3RvbWVyOworCisgICAgcHVibGljIHZvaWQgc2V0SXRlbXMoTGlzdDw/IGV4dGVuZHMgSUxpbmVJdGVtPiBpdGVtcykgeworICAgICAgICB0aGlzLml0ZW1zID0gKExpc3Q8TGluZUl0ZW0+KSBpdGVtczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxMaW5lSXRlbT4gZ2V0SXRlbXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLml0ZW1zOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJEYXRlKERhdGUgb3JkZXJEYXRlKSB7CisgICAgICAgIHRoaXMub3JkZXJEYXRlID0gb3JkZXJEYXRlOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldE9yZGVyRGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJEYXRlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0U2hpcHBlZERhdGUoRGF0ZSBzaGlwcGVkRGF0ZSkgeworICAgICAgICB0aGlzLnNoaXBwZWREYXRlID0gc2hpcHBlZERhdGU7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0U2hpcHBlZERhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNoaXBwZWREYXRlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tZXIoSUN1c3RvbWVyIGN1c3RvbWVyKSB7CisgICAgICAgIHRoaXMuY3VzdG9tZXIgPSAoQ3VzdG9tZXIpIGN1c3RvbWVyOworICAgIH0KKworICAgIHB1YmxpYyBJQ3VzdG9tZXIgZ2V0Q3VzdG9tZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbWVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvVGVzdElkQ2xhc3NDb21wYW55TW9kZWwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2lkY2xhc3MvVGVzdElkQ2xhc3NDb21wYW55TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmE3YTQzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvaWRjbGFzcy9UZXN0SWRDbGFzc0NvbXBhbnlNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmlkY2xhc3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworcHVibGljIGNsYXNzIFRlc3RJZENsYXNzQ29tcGFueU1vZGVsIGV4dGVuZHMgQ29tcGFueU1vZGVsVGVzdCB7Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9BZGRyZXNzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvQWRkcmVzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWUzZDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvQWRkcmVzcy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmpvaW5lZDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSklfQWRkcmVzcyIpCitwdWJsaWMgY2xhc3MgQWRkcmVzcyBpbXBsZW1lbnRzIElBZGRyZXNzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlkQ291bnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkID0gaWRDb3VudGVyKys7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBzdHJlZXRBZGRyZXNzOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgcG9zdGFsQ29kZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHBob25lTnVtYmVyOworCisgICAgcHVibGljIHZvaWQgc2V0U3RyZWV0QWRkcmVzcyhTdHJpbmcgc3RyZWV0QWRkcmVzcykgeworICAgICAgICB0aGlzLnN0cmVldEFkZHJlc3MgPSBzdHJlZXRBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyZWV0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWV0QWRkcmVzczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKKyAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNpdHk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShTdHJpbmcgc3RhdGUpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXRlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UG9zdGFsQ29kZShTdHJpbmcgcG9zdGFsQ29kZSkgeworICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBwb3N0YWxDb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdGFsQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucG9zdGFsQ29kZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFBob25lTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcikgeworICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gcGhvbmVOdW1iZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVOdW1iZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvQ29tcGFueS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0NvbXBhbnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE2YWRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0NvbXBhbnkuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5qb2luZWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkpJX0NvbXBhbnkiKQorcHVibGljIGNsYXNzIENvbXBhbnkgaW1wbGVtZW50cyBJQ29tcGFueSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZENvdW50ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IGlkQ291bnRlcisrOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBPbmVUb09uZQorICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOworCisgICAgQE9uZVRvTWFueShtYXBwZWRCeT0iY29tcGFueSIpCisgICAgcHJpdmF0ZSBTZXQ8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBIYXNoU2V0PEVtcGxveWVlPigpOworCisgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9ImRpc3RyaWJ1dG9ycyIpCisgICAgcHJpdmF0ZSBTZXQ8UHJvZHVjdD4gcHJvZHVjdHMgPSBuZXcgSGFzaFNldDxQcm9kdWN0PigpOworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoSUFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSAoQWRkcmVzcykgYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgSUFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEVtcGxveWVlcyhTZXQ8PyBleHRlbmRzIElFbXBsb3llZT4gZW1wbG95ZWVzKSB7CisgICAgICAgIHRoaXMuZW1wbG95ZWVzID0gKFNldDxFbXBsb3llZT4pIGVtcGxveWVlczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PEVtcGxveWVlPiBnZXRFbXBsb3llZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVtcGxveWVlczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RzKFNldDw/IGV4dGVuZHMgSVByb2R1Y3Q+IHByb2R1Y3RzKSB7CisgICAgICAgIHRoaXMucHJvZHVjdHMgPSAoU2V0PFByb2R1Y3Q+KSBwcm9kdWN0czsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFByb2R1Y3Q+IGdldFByb2R1Y3RzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0czsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9DdXN0b21lci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0N1c3RvbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyZjhmZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9DdXN0b21lci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmpvaW5lZDsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSklfQ3VzdG9tZXIiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitwdWJsaWMgY2xhc3MgQ3VzdG9tZXIgZXh0ZW5kcyBQZXJzb24gaW1wbGVtZW50cyBJQ3VzdG9tZXIgeworICAgIEBPbmVUb01hbnkobWFwcGVkQnk9ImN1c3RvbWVyIikKKyAgICBwcml2YXRlIENvbGxlY3Rpb248UHJvZHVjdE9yZGVyPiBvcmRlcnMgPSBuZXcgQXJyYXlMaXN0PFByb2R1Y3RPcmRlcj4oKTsKKworICAgIEBPbmVUb09uZQorICAgIHByaXZhdGUgQWRkcmVzcyBzaGlwcGluZ0FkZHJlc3M7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIEFkZHJlc3MgYmlsbGluZ0FkZHJlc3M7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlcnMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVByb2R1Y3RPcmRlcj4gb3JkZXJzKSB7CisgICAgICAgIHRoaXMub3JkZXJzID0gKENvbGxlY3Rpb248UHJvZHVjdE9yZGVyPikgb3JkZXJzOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFByb2R1Y3RPcmRlcj4gZ2V0T3JkZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vcmRlcnM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaGlwcGluZ0FkZHJlc3MoSUFkZHJlc3Mgc2hpcHBpbmdBZGRyZXNzKSB7CisgICAgICAgIHRoaXMuc2hpcHBpbmdBZGRyZXNzID0gKEFkZHJlc3MpIHNoaXBwaW5nQWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgSUFkZHJlc3MgZ2V0U2hpcHBpbmdBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zaGlwcGluZ0FkZHJlc3M7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRCaWxsaW5nQWRkcmVzcyhJQWRkcmVzcyBiaWxsaW5nQWRkcmVzcykgeworICAgICAgICB0aGlzLmJpbGxpbmdBZGRyZXNzID0gKEFkZHJlc3MpIGJpbGxpbmdBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBJQWRkcmVzcyBnZXRCaWxsaW5nQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ0FkZHJlc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0VtcGxveWVlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNlZTMyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0VtcGxveWVlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuam9pbmVkOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJKSV9FbXBsb3llZSIpCitASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLkpPSU5FRCkKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbXBsb3llZSBleHRlbmRzIFBlcnNvbiBpbXBsZW1lbnRzIElFbXBsb3llZSB7CisgICAgQE9uZVRvT25lCisgICAgcHJpdmF0ZSBGdWxsVGltZUVtcGxveWVlIG1hbmFnZXI7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIENvbXBhbnkgY29tcGFueTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBEYXRlIGhpcmVEYXRlOworCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihJRnVsbFRpbWVFbXBsb3llZSBtYW5hZ2VyKSB7CisgICAgICAgIHRoaXMubWFuYWdlciA9IChGdWxsVGltZUVtcGxveWVlKSBtYW5hZ2VyOworICAgIH0KKworICAgIHB1YmxpYyBJRnVsbFRpbWVFbXBsb3llZSBnZXRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFueShJQ29tcGFueSBjb21wYW55KSB7CisgICAgICAgIHRoaXMuY29tcGFueSA9IChDb21wYW55KSBjb21wYW55OworICAgIH0KKworICAgIHB1YmxpYyBJQ29tcGFueSBnZXRDb21wYW55KCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21wYW55OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGhpcy50aXRsZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKKyAgICAgICAgdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldEhpcmVEYXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oaXJlRGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvRnVsbFRpbWVFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0Z1bGxUaW1lRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ1NjFkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL0Z1bGxUaW1lRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5qb2luZWQ7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkpJX0Z1bGxUaW1lRW1wbG95ZWUiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitwdWJsaWMgY2xhc3MgRnVsbFRpbWVFbXBsb3llZSBleHRlbmRzIEVtcGxveWVlCisgICAgaW1wbGVtZW50cyBJRnVsbFRpbWVFbXBsb3llZSB7CisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBmbG9hdCBzYWxhcnk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYWxhcnkoZmxvYXQgc2FsYXJ5KSB7CisgICAgICAgIHRoaXMuc2FsYXJ5ID0gc2FsYXJ5OworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRTYWxhcnkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNhbGFyeTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvTGluZUl0ZW0uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9MaW5lSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDFkZDUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvTGluZUl0ZW0uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5qb2luZWQ7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkpJX0xpbmVJdGVtIikKK3B1YmxpYyBjbGFzcyBMaW5lSXRlbSBpbXBsZW1lbnRzIElMaW5lSXRlbSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZENvdW50ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IGlkQ291bnRlcisrOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBpbnQgcXVhbnRpdHk7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIFByb2R1Y3QgcHJvZHVjdDsKKworICAgIHB1YmxpYyB2b2lkIHNldFF1YW50aXR5KGludCBxdWFudGl0eSkgeworICAgICAgICB0aGlzLnF1YW50aXR5ID0gcXVhbnRpdHk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRRdWFudGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucXVhbnRpdHk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0KElQcm9kdWN0IHByb2R1Y3QpIHsKKyAgICAgICAgdGhpcy5wcm9kdWN0ID0gKFByb2R1Y3QpIHByb2R1Y3Q7CisgICAgfQorCisgICAgcHVibGljIElQcm9kdWN0IGdldFByb2R1Y3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3Q7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvUGFydFRpbWVFbXBsb3llZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1BhcnRUaW1lRW1wbG95ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWMzYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1BhcnRUaW1lRW1wbG95ZWUuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5qb2luZWQ7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS4qOworCitARW50aXR5KG5hbWU9IkpJX1BhcnRUaW1lRW1wbG95ZWUiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitwdWJsaWMgY2xhc3MgUGFydFRpbWVFbXBsb3llZSBleHRlbmRzIEVtcGxveWVlCisgICAgaW1wbGVtZW50cyBJUGFydFRpbWVFbXBsb3llZSB7CisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBmbG9hdCB3YWdlOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBpbnQgd2Vla2x5SG91cnM7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWdlKGZsb2F0IHdhZ2UpIHsKKyAgICAgICAgdGhpcy53YWdlID0gd2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0V2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2FnZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFdlZWtseUhvdXJzKGludCB3ZWVrbHlIb3VycykgeworICAgICAgICB0aGlzLndlZWtseUhvdXJzID0gd2Vla2x5SG91cnM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXZWVrbHlIb3VycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2Vla2x5SG91cnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1BlcnNvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjkxNTYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvUGVyc29uLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuam9pbmVkOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworQEVudGl0eShuYW1lPSJKSV9QZXJzb24iKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc29uIGltcGxlbWVudHMgSVBlcnNvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZENvdW50ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIEBJZAorICAgIHByaXZhdGUgbG9uZyBpZCA9IGlkQ291bnRlcisrOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7CisKKyAgICBAT25lVG9PbmUKKyAgICBwcml2YXRlIEFkZHJlc3MgaG9tZUFkZHJlc3M7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkgeworICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKSB7CisgICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5sYXN0TmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEhvbWVBZGRyZXNzKElBZGRyZXNzIGhvbWVBZGRyZXNzKSB7CisgICAgICAgIHRoaXMuaG9tZUFkZHJlc3MgPSAoQWRkcmVzcykgaG9tZUFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIElBZGRyZXNzIGdldEhvbWVBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ob21lQWRkcmVzczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9Qcm9kdWN0LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvUHJvZHVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGM5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvUHJvZHVjdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmpvaW5lZDsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSklfUHJvZHVjdCIpCitwdWJsaWMgY2xhc3MgUHJvZHVjdCBpbXBsZW1lbnRzIElQcm9kdWN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlkQ291bnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkID0gaWRDb3VudGVyKys7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBieXRlW10gaW1hZ2U7CisKKyAgICBAQmFzaWMKKyAgICBwcml2YXRlIGZsb2F0IHByaWNlOworCisgICAgQE1hbnlUb01hbnkKKyAgICBwcml2YXRlIFNldDxDb21wYW55PiBkaXN0cmlidXRvcnMgPSBuZXcgSGFzaFNldDxDb21wYW55PigpOworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlKGJ5dGVbXSBpbWFnZSkgeworICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRJbWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmljZShmbG9hdCBwcmljZSkgeworICAgICAgICB0aGlzLnByaWNlID0gcHJpY2U7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFByaWNlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcmljZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dG9ycyhTZXQ8PyBleHRlbmRzIElDb21wYW55PiBkaXN0cmlidXRvcnMpIHsKKyAgICAgICAgdGhpcy5kaXN0cmlidXRvcnMgPSAoU2V0PENvbXBhbnk+KSBkaXN0cmlidXRvcnM7CisgICAgfQorCisgICAgcHVibGljIFNldDxDb21wYW55PiBnZXREaXN0cmlidXRvcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRpc3RyaWJ1dG9yczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9Qcm9kdWN0T3JkZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL21vZGVscy9jb21wYW55L2pvaW5lZC9Qcm9kdWN0T3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM5MTAyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1Byb2R1Y3RPcmRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55LmpvaW5lZDsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Lio7CisKK0BFbnRpdHkobmFtZT0iSklfUHJvZHVjdE9yZGVyIikKK3B1YmxpYyBjbGFzcyBQcm9kdWN0T3JkZXIgaW1wbGVtZW50cyBJUHJvZHVjdE9yZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlkQ291bnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkID0gaWRDb3VudGVyKys7CisKKyAgICBAT25lVG9NYW55CisgICAgcHJpdmF0ZSBMaXN0PExpbmVJdGVtPiBpdGVtcyA9IG5ldyBMaW5rZWRMaXN0PExpbmVJdGVtPigpOworCisgICAgQEJhc2ljCisgICAgcHJpdmF0ZSBEYXRlIG9yZGVyRGF0ZTsKKworICAgIEBCYXNpYworICAgIHByaXZhdGUgRGF0ZSBzaGlwcGVkRGF0ZTsKKworICAgIEBPbmVUb09uZQorICAgIHByaXZhdGUgQ3VzdG9tZXIgY3VzdG9tZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyhMaXN0PD8gZXh0ZW5kcyBJTGluZUl0ZW0+IGl0ZW1zKSB7CisgICAgICAgIHRoaXMuaXRlbXMgPSAoTGlzdDxMaW5lSXRlbT4pIGl0ZW1zOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PExpbmVJdGVtPiBnZXRJdGVtcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckRhdGUoRGF0ZSBvcmRlckRhdGUpIHsKKyAgICAgICAgdGhpcy5vcmRlckRhdGUgPSBvcmRlckRhdGU7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0T3JkZXJEYXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vcmRlckRhdGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaGlwcGVkRGF0ZShEYXRlIHNoaXBwZWREYXRlKSB7CisgICAgICAgIHRoaXMuc2hpcHBlZERhdGUgPSBzaGlwcGVkRGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRTaGlwcGVkRGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2hpcHBlZERhdGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21lcihJQ3VzdG9tZXIgY3VzdG9tZXIpIHsKKyAgICAgICAgdGhpcy5jdXN0b21lciA9IChDdXN0b21lcikgY3VzdG9tZXI7CisgICAgfQorCisgICAgcHVibGljIElDdXN0b21lciBnZXRDdXN0b21lcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9qb2luZWQvVGVzdEpvaW5lZENvbXBhbnlNb2RlbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1Rlc3RKb2luZWRDb21wYW55TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQ3ODNiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvam9pbmVkL1Rlc3RKb2luZWRDb21wYW55TW9kZWwuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5tb2RlbHMuY29tcGFueS5qb2luZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuKjsKKworcHVibGljIGNsYXNzIFRlc3RKb2luZWRDb21wYW55TW9kZWwgZXh0ZW5kcyBDb21wYW55TW9kZWxUZXN0IHsKK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvTWFueU9uZUVudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvTWFueU9uZUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljMTllNTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9xdWVyeS9NYW55T25lRW50aXR5LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucXVlcnk7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNhc2NhZGVUeXBlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSW5oZXJpdGFuY2U7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkluaGVyaXRhbmNlVHlwZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uOw0KKw0KK0BFbnRpdHkNCitASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSkNCitwdWJsaWMgY2xhc3MgTWFueU9uZUVudGl0eSB7DQorDQorICAgIEBJZA0KKyAgICBAR2VuZXJhdGVkVmFsdWUNCisgICAgcHJpdmF0ZSBsb25nIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBATWFueVRvT25lKGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMKQ0KKyAgICBwcml2YXRlIE1hbnlPbmVFbnRpdHkgcmVsOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IA0KKyAgICAgICAgcmV0dXJuIGlkOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWFueU9uZUVudGl0eSBnZXRSZWwoKSB7DQorICAgICAgICByZXR1cm4gcmVsOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWwoTWFueU9uZUVudGl0eSByZWwpIHsNCisgICAgICAgIHRoaXMucmVsID0gcmVsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgDQorICAgICAgICByZXR1cm4gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyANCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3F1ZXJ5L01hbnlPbmVFbnRpdHlTdWIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3F1ZXJ5L01hbnlPbmVFbnRpdHlTdWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzQxNGQxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvTWFueU9uZUVudGl0eVN1Yi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnF1ZXJ5Ow0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQorDQorQEVudGl0eQ0KK3B1YmxpYyBjbGFzcyBNYW55T25lRW50aXR5U3ViIA0KKyAgICBleHRlbmRzIE1hbnlPbmVFbnRpdHkgew0KKw0KKyAgICBwcml2YXRlIGludCBzdWJJbnQ7DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0U3ViSW50KCkgeyANCisgICAgICAgIHJldHVybiBzdWJJbnQ7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFN1YkludChpbnQgc3ViSW50KSB7IA0KKyAgICAgICAgdGhpcy5zdWJJbnQgPSBzdWJJbnQ7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3F1ZXJ5L1NpbXBsZUVudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvU2ltcGxlRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ODAxZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3F1ZXJ5L1NpbXBsZUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnF1ZXJ5Ow0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eVJlc3VsdDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRmllbGRSZXN1bHQ7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyaWVzOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5TcWxSZXN1bHRTZXRNYXBwaW5nOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZTsNCisNCitATmFtZWROYXRpdmVRdWVyaWVzKCB7IA0KKyAgICBATmFtZWROYXRpdmVRdWVyeShuYW1lID0gImZpbmRTaW1wbGVFbnRpdGl0ZXMiLA0KKyAgICAgICAgcXVlcnkgPSAiU0VMRUNUIElELCBOQU1FLCBWQUxVRSBGUk9NIFNJTVBMRV9FTlRJVFkiLCANCisgICAgICAgIHJlc3VsdFNldE1hcHBpbmcgPSAic2ltcGxlRW50aXRpZXNSZXN1bHQiKSB9KQ0KKw0KK0BTcWxSZXN1bHRTZXRNYXBwaW5nKG5hbWUgPSAic2ltcGxlRW50aXRpZXNSZXN1bHQiLA0KKyAgICBlbnRpdGllcyA9IEBFbnRpdHlSZXN1bHQoDQorICAgIGVudGl0eUNsYXNzID0gb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnF1ZXJ5LlNpbXBsZUVudGl0eS5jbGFzcywgDQorICAgIGZpZWxkcyA9IHtARmllbGRSZXN1bHQobmFtZSA9ICJpZCIsIGNvbHVtbiA9ICJJRCIpLA0KKyAgICAgICAgQEZpZWxkUmVzdWx0KG5hbWUgPSAibmFtZSIsIGNvbHVtbiA9ICJOQU1FIiksDQorICAgICAgICBARmllbGRSZXN1bHQobmFtZSA9ICJ2YWx1ZSIsIGNvbHVtbiA9ICJWQUxVRSIpIH0pKQ0KK0BFbnRpdHkobmFtZSA9ICJzaW1wbGUiKQ0KK0BUYWJsZShuYW1lID0gIlNJTVBMRV9FTlRJVFkiKQ0KK3B1YmxpYyBjbGFzcyBTaW1wbGVFbnRpdHkgew0KKw0KKyAgICBASWQNCisgICAgQEdlbmVyYXRlZFZhbHVlDQorICAgIEBDb2x1bW4obmFtZSA9ICJJRCIpDQorICAgIHByaXZhdGUgbG9uZyBpZDsNCisNCisgICAgQEJhc2ljDQorICAgIEBDb2x1bW4obmFtZSA9ICJOQU1FIikNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgQEJhc2ljDQorICAgIEBDb2x1bW4obmFtZSA9ICJWQUxVRSIpDQorICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOw0KKw0KKyAgICBwdWJsaWMgU2ltcGxlRW50aXR5KCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTaW1wbGVFbnRpdHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgdGhpcygpOw0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsNCisgICAgICAgIHJldHVybiB0aGlzLmlkOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsNCisgICAgICAgIHRoaXMuaWQgPSBpZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7DQorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7DQorICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdEFic3RyYWN0U2NoZW1hTmFtZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdEFic3RyYWN0U2NoZW1hTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjhiZGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9xdWVyeS9UZXN0QWJzdHJhY3RTY2hlbWFOYW1lLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucXVlcnk7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5OworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnNpbXBsZS5OYW1lZEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHRoYXQgd2UgY2FuIHF1ZXJ5IGJ5IGFuIGVudGl0eSdzIGFic3RyYWN0IHNjaGVtYSBuYW1lLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QWJzdHJhY3RTY2hlbWFOYW1lCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoTmFtZWRFbnRpdHkuY2xhc3MpOworCisgICAgICAgIE5hbWVkRW50aXR5IGUgPSBuZXcgTmFtZWRFbnRpdHkoKTsKKyAgICAgICAgZS5zZXROYW1lKCJlIik7IAorCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QoZSk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5KCkgeworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgZSBmcm9tIG5hbWVkIGUiKTsKKyAgICAgICAgTmFtZWRFbnRpdHkgZSA9IChOYW1lZEVudGl0eSkgcS5nZXRTaW5nbGVSZXN1bHQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlIiwgZS5nZXROYW1lKCkpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdEFic3RyYWN0U2NoZW1hTmFtZS5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9xdWVyeS9UZXN0SW5NZW1vcnlRdWVyeU1hdGNoRXNjYXBlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdEluTWVtb3J5UXVlcnlNYXRjaEVzY2FwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjYzYmVkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdEluTWVtb3J5UXVlcnlNYXRjaEVzY2FwZXMuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5xdWVyeTsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRmx1c2hNb2RlVHlwZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFRdWVyeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnNpbXBsZS5BbGxGaWVsZFR5cGVzOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgVGVzdEluTWVtb3J5UXVlcnlNYXRjaEVzY2FwZXMNCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgc2V0VXAoQWxsRmllbGRUeXBlcy5jbGFzcyk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhYmFzZUVzY2FwZSgpIHsNCisgICAgICAgIE9wZW5KUEFRdWVyeSBxID0gZXNjYXBlSGVscGVyKGZhbHNlKTsNCisgICAgICAgIHEuc2V0Rmx1c2hNb2RlKEZsdXNoTW9kZVR5cGUuQVVUTyk7DQorICAgICAgICBxLmdldEVudGl0eU1hbmFnZXIoKS5mbHVzaCgpOw0KKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSAoQWxsRmllbGRUeXBlcykgcS5nZXRTaW5nbGVSZXN1bHQoKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vX2JhciIsIGFmdC5nZXRTdHJpbmdGaWVsZCgpKTsNCisgICAgICAgIHEuZ2V0RW50aXR5TWFuYWdlcigpLmdldFRyYW5zYWN0aW9uKCkucm9sbGJhY2soKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEluTWVtb3J5RXNjYXBlKCkgew0KKyAgICAgICAgT3BlbkpQQVF1ZXJ5IHEgPSBlc2NhcGVIZWxwZXIodHJ1ZSk7DQorICAgICAgICBxLnNldEZsdXNoTW9kZShGbHVzaE1vZGVUeXBlLkNPTU1JVCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHEuZ2V0U2luZ2xlUmVzdWx0KCk7DQorICAgICAgICAgICAgZmFpbCgiT3BlbkpQQSBkb2Vzbid0IHN1cHBvcnQgZXNjYXBlIHN5bnRheCBmb3IgaW4tbWVtIHF1ZXJpZXMiKTsNCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgLy8gZXhwZWN0ZWQNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBPcGVuSlBBUXVlcnkgZXNjYXBlSGVscGVyKGJvb2xlYW4gaW5NZW0pIHsNCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOw0KKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSBuZXcgQWxsRmllbGRUeXBlcygpOw0KKyAgICAgICAgYWZ0LnNldFN0cmluZ0ZpZWxkKCJmb29fYmFyIik7DQorICAgICAgICBlbS5wZXJzaXN0KGFmdCk7DQorICAgICAgICBhZnQgPSBuZXcgQWxsRmllbGRUeXBlcygpOw0KKyAgICAgICAgYWZ0LnNldFN0cmluZ0ZpZWxkKCJmb296YmFyIik7DQorICAgICAgICBlbS5wZXJzaXN0KGFmdCk7DQorDQorICAgICAgICByZXR1cm4gKE9wZW5KUEFRdWVyeSkgZW0uY3JlYXRlUXVlcnkoDQorICAgICAgICAgICAgInNlbGVjdCBlIGZyb20gQWxsRmllbGRUeXBlcyBlIHdoZXJlIGUuc3RyaW5nRmllbGQgIiArDQorICAgICAgICAgICAgImxpa2UgJ2Zvb3hfYmFyJyBlc2NhcGUgJ3gnIik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdFF1ZXJ5RXhjbHVkaW5nU3ViY2xhc3Nlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdFF1ZXJ5RXhjbHVkaW5nU3ViY2xhc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjQwOTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9xdWVyeS9UZXN0UXVlcnlFeGNsdWRpbmdTdWJjbGFzc2VzLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKKy8qKgorICogVGVzdCB0aGF0IHdlIGNhbiBleGNsdWRlIHN1YmNsYXNzIGluc3RhbmNlcyBmcm9tIHF1ZXJ5IHJlc3VsdHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RRdWVyeUV4Y2x1ZGluZ1N1YmNsYXNzZXMKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChNYW55T25lRW50aXR5LmNsYXNzLCBNYW55T25lRW50aXR5U3ViLmNsYXNzKTsKKworICAgICAgICBNYW55T25lRW50aXR5IGUxID0gbmV3IE1hbnlPbmVFbnRpdHkoKTsKKyAgICAgICAgZTEuc2V0TmFtZSgiZTEiKTsgCisgICAgICAgIE1hbnlPbmVFbnRpdHkgZTIgPSBuZXcgTWFueU9uZUVudGl0eSgpOworICAgICAgICBlMi5zZXROYW1lKCJlMiIpOyAKKyAgICAgICAgTWFueU9uZUVudGl0eSBpbnZhbGlkID0gbmV3IE1hbnlPbmVFbnRpdHkoKTsKKyAgICAgICAgaW52YWxpZC5zZXROYW1lKCJpbnZhbGlkIik7IAorICAgICAgICBNYW55T25lRW50aXR5U3ViIGVzdWIxID0gbmV3IE1hbnlPbmVFbnRpdHlTdWIoKTsKKyAgICAgICAgZXN1YjEuc2V0TmFtZSgiZXN1YjEiKTsgCisgICAgICAgIE1hbnlPbmVFbnRpdHlTdWIgZXN1YjIgPSBuZXcgTWFueU9uZUVudGl0eVN1YigpOworICAgICAgICBlc3ViMi5zZXROYW1lKCJlc3ViMiIpOyAKKyAgICAgICAgTWFueU9uZUVudGl0eVN1YiBpbnZhbGlkc3ViID0gbmV3IE1hbnlPbmVFbnRpdHlTdWIoKTsKKyAgICAgICAgaW52YWxpZHN1Yi5zZXROYW1lKCJpbnZhbGlkc3ViIik7IAorCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QoZTEpOworICAgICAgICBlbS5wZXJzaXN0KGUyKTsKKyAgICAgICAgZW0ucGVyc2lzdChpbnZhbGlkKTsKKyAgICAgICAgZW0ucGVyc2lzdChlc3ViMSk7CisgICAgICAgIGVtLnBlcnNpc3QoZXN1YjIpOworICAgICAgICBlbS5wZXJzaXN0KGludmFsaWRzdWIpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IGUgZnJvbSBNYW55T25lRW50aXR5IGUgIgorICAgICAgICAgICAgKyAid2hlcmUgZS5uYW1lIGxpa2UgJ2UlJyBvcmRlciBieSBlLm5hbWUgYXNjIik7CisgICAgICAgIExpc3Q8TWFueU9uZUVudGl0eT4gcmVzID0gKExpc3Q8TWFueU9uZUVudGl0eT4pIHEuZ2V0UmVzdWx0TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzLnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWFueU9uZUVudGl0eS5jbGFzcywgcmVzLmdldChpKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZSIgKyAoaSArIDEpLCByZXMuZ2V0KGkpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNYW55T25lRW50aXR5U3ViLmNsYXNzLCByZXMuZ2V0KGkgKyAyKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXN1YiIgKyAoaSArIDEpLCByZXMuZ2V0KGkgKyAyKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5RXhjbHVkaW5nU3ViY2xhc3NlcygpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IGUgZnJvbSBNYW55T25lRW50aXR5IGUgIgorICAgICAgICAgICAgKyAid2hlcmUgZS5uYW1lIGxpa2UgJ2UlJyBvcmRlciBieSBlLm5hbWUgYXNjIik7CisgICAgICAgICgoT3BlbkpQQVF1ZXJ5KSBxKS5zZXRTdWJjbGFzc2VzKGZhbHNlKTsKKyAgICAgICAgTGlzdDxNYW55T25lRW50aXR5PiByZXMgPSAoTGlzdDxNYW55T25lRW50aXR5PikgcS5nZXRSZXN1bHRMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNYW55T25lRW50aXR5LmNsYXNzLCByZXMuZ2V0KGkpLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlIiArIChpICsgMSksIHJlcy5nZXQoaSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdFF1ZXJ5RXhjbHVkaW5nU3ViY2xhc3Nlcy5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9xdWVyeS9UZXN0UXVlcnlJZE9mUmVsYXRpb25Eb2VzTm90Sm9pbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdFF1ZXJ5SWRPZlJlbGF0aW9uRG9lc05vdEpvaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGM1M2I4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdFF1ZXJ5SWRPZlJlbGF0aW9uRG9lc05vdEpvaW4uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnk7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHRoYXQgcXVlcnlpbmcgdGhlIGlkIG9mIGEgcmVsYXRlZCBtYW55LW9uZSAob3Igb25lLW9uZSkgZG9lcyBub3QgY3JlYXRlCisgKiBhIGpvaW4gYWNyb3NzIHRoZSB0YWJsZXMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RRdWVyeUlkT2ZSZWxhdGlvbkRvZXNOb3RKb2luCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIGxvbmcgZTNJZDsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChNYW55T25lRW50aXR5LmNsYXNzLCBNYW55T25lRW50aXR5U3ViLmNsYXNzKTsKKworICAgICAgICBNYW55T25lRW50aXR5IGUxID0gbmV3IE1hbnlPbmVFbnRpdHkoKTsKKyAgICAgICAgZTEuc2V0TmFtZSgiZTEiKTsKKyAgICAgICAgTWFueU9uZUVudGl0eSBlMiA9IG5ldyBNYW55T25lRW50aXR5KCk7CisgICAgICAgIGUyLnNldE5hbWUoImUyIik7CisgICAgICAgIE1hbnlPbmVFbnRpdHkgZTMgPSBuZXcgTWFueU9uZUVudGl0eSgpOworICAgICAgICBlMy5zZXROYW1lKCJlMyIpOworICAgICAgICBlMS5zZXRSZWwoZTMpOworICAgICAgICBlMi5zZXRSZWwoZTEpOworCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QoZTEpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlM0lkID0gZTMuZ2V0SWQoKTsKKworICAgICAgICAvLyB3ZSBpbnRlbnRpb25hbGx5IGNyZWF0ZSBhbiBvcnBoYW5lZCByZWZlcmVuY2Ugb24gZTEucmVsCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucmVtb3ZlKGUzKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnkoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCBlIGZyb20gTWFueU9uZUVudGl0eSBlICIKKyAgICAgICAgICAgICsgIndoZXJlIGUucmVsLmlkID0gOmlkIikuc2V0UGFyYW1ldGVyKCJpZCIsIGUzSWQpOworICAgICAgICBMaXN0IHJlcyA9IHEuZ2V0UmVzdWx0TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLnNpemUoKSk7CisKKyAgICAgICAgTWFueU9uZUVudGl0eSBlID0gKE1hbnlPbmVFbnRpdHkpIHJlcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZTEiLCBlLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwoZS5nZXRSZWwoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0UXVlcnlJZE9mUmVsYXRpb25Eb2VzTm90Sm9pbi5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9xdWVyeS9UZXN0UmVzdWx0U2V0TWFwcGluZy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdFJlc3VsdFNldE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQ2Njg1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcXVlcnkvVGVzdFJlc3VsdFNldE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5OworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVzdWx0U2V0TWFwcGluZyAKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChTaW1wbGVFbnRpdHkuY2xhc3MpOworCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QobmV3IFNpbXBsZUVudGl0eSgidE5hbWUiLCAidFZhbHVlIikpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVRdWVyeSgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVOYW1lZFF1ZXJ5KCJmaW5kU2ltcGxlRW50aXRpdGVzIik7CisgICAgICAgIExpc3QgcmVzID0gcS5nZXRSZXN1bHRMaXN0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciByZXN1bHRJdGVyID0gcmVzLml0ZXJhdG9yKCk7IHJlc3VsdEl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShyZXN1bHRJdGVyLm5leHQoKS5nZXRDbGFzcygpLCBTaW1wbGVFbnRpdHkuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0UmVzdWx0U2V0TWFwcGluZy5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0Jhc2ljRW50aXR5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvQmFzaWNFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTg4ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0Jhc2ljRW50aXR5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uOw0KKw0KK0BFbnRpdHkNCitwdWJsaWMgY2xhc3MgQmFzaWNFbnRpdHkgew0KKw0KKyAgICBASWQNCisgICAgQEdlbmVyYXRlZFZhbHVlDQorICAgIHByaXZhdGUgbG9uZyBpZDsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgQE1hbnlUb09uZQ0KKyAgICBwcml2YXRlIEJhc2ljRW50aXR5IHJlbDsNCisNCisgICAgQFZlcnNpb24NCisgICAgcHJpdmF0ZSBJbnRlZ2VyIG9wdExvY2s7DQorDQorICAgIHB1YmxpYyBsb25nIGdldElkKCkgeyANCisgICAgICAgIHJldHVybiBpZDsgDQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyANCisgICAgICAgIHJldHVybiBuYW1lOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IA0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIEJhc2ljRW50aXR5IGdldFJlbCgpIHsgDQorICAgICAgICByZXR1cm4gcmVsOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWwoQmFzaWNFbnRpdHkgcmVsKSB7IA0KKyAgICAgICAgdGhpcy5yZWwgPSByZWw7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9CaWRpQ2hpbGQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9CaWRpQ2hpbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNjY3MzQyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0JpZGlDaGlsZC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOworCitARW50aXR5CitwdWJsaWMgY2xhc3MgQmlkaUNoaWxkIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgQmlkaVBhcmVudCBvbmVUb01hbnlQYXJlbnQ7CisKKyAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgcHJpdmF0ZSBCaWRpUGFyZW50IG9uZVRvT25lUGFyZW50OworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IAorICAgICAgICByZXR1cm4gaWQ7IAorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgCisgICAgICAgIHJldHVybiBuYW1lOyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IAorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyAKKyAgICB9CisKKyAgICBwdWJsaWMgQmlkaVBhcmVudCBnZXRPbmVUb09uZVBhcmVudCgpIHsgCisgICAgICAgIHJldHVybiBvbmVUb09uZVBhcmVudDsgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T25lVG9PbmVQYXJlbnQoQmlkaVBhcmVudCBwYXJlbnQpIHsgCisgICAgICAgIG9uZVRvT25lUGFyZW50ID0gcGFyZW50OyAKKyAgICB9CisKKyAgICBwdWJsaWMgQmlkaVBhcmVudCBnZXRPbmVUb01hbnlQYXJlbnQoKSB7IAorICAgICAgICByZXR1cm4gb25lVG9NYW55UGFyZW50OyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPbmVUb01hbnlQYXJlbnQoQmlkaVBhcmVudCBwYXJlbnQpIHsgCisgICAgICAgIG9uZVRvTWFueVBhcmVudCA9IHBhcmVudDsgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0JpZGlQYXJlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9CaWRpUGFyZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQyZWFlYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9CaWRpUGFyZW50LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnk7CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBCaWRpUGFyZW50IHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5PSJvbmVUb01hbnlQYXJlbnQiKQorICAgIEBPcmRlckJ5KCJuYW1lIEFTQyIpCisgICAgcHJpdmF0ZSBMaXN0PEJpZGlDaGlsZD4gb25lVG9NYW55Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PEJpZGlDaGlsZD4oKTsKKworICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgbWFwcGVkQnk9Im9uZVRvT25lUGFyZW50IikKKyAgICBwcml2YXRlIEJpZGlDaGlsZCBvbmVUb09uZUNoaWxkOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IAorICAgICAgICByZXR1cm4gaWQ7IAorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgCisgICAgICAgIHJldHVybiBuYW1lOyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IAorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyAKKyAgICB9CisKKyAgICBwdWJsaWMgQmlkaUNoaWxkIGdldE9uZVRvT25lQ2hpbGQoKSB7IAorICAgICAgICByZXR1cm4gb25lVG9PbmVDaGlsZDsgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T25lVG9PbmVDaGlsZChCaWRpQ2hpbGQgY2hpbGQpIHsgCisgICAgICAgIG9uZVRvT25lQ2hpbGQgPSBjaGlsZDsgCisgICAgfQorCisgICAgcHVibGljIExpc3Q8QmlkaUNoaWxkPiBnZXRPbmVUb01hbnlDaGlsZHJlbigpIHsgCisgICAgICAgIHJldHVybiBvbmVUb01hbnlDaGlsZHJlbjsgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0Nhc2NhZGluZ09uZU1hbnlDaGlsZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0Nhc2NhZGluZ09uZU1hbnlDaGlsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzNjViOGYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvQ2FzY2FkaW5nT25lTWFueUNoaWxkLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5Gb3JlaWduS2V5Ow0KKw0KK0BFbnRpdHkNCitwdWJsaWMgY2xhc3MgQ2FzY2FkaW5nT25lTWFueUNoaWxkIHsNCisNCisgICAgQElkDQorICAgIEBHZW5lcmF0ZWRWYWx1ZQ0KKyAgICBwcml2YXRlIGxvbmcgaWQ7DQorDQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorDQorICAgIEBNYW55VG9PbmUob3B0aW9uYWw9ZmFsc2UpDQorICAgIEBKb2luQ29sdW1uKG5hbWU9IlBBUkVOVF9JRCIsIG51bGxhYmxlPWZhbHNlKQ0KKyAgICBARm9yZWlnbktleQ0KKyAgICBwcml2YXRlIENhc2NhZGluZ09uZU1hbnlQYXJlbnQgcGFyZW50Ow0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IA0KKyAgICAgICAgcmV0dXJuIGlkOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IA0KKyAgICAgICAgcmV0dXJuIG5hbWU7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsgDQorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ2FzY2FkaW5nT25lTWFueVBhcmVudCBnZXRQYXJlbnQoKSB7IA0KKyAgICAgICAgcmV0dXJuIHBhcmVudDsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KENhc2NhZGluZ09uZU1hbnlQYXJlbnQgcGFyZW50KSB7IA0KKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9DYXNjYWRpbmdPbmVNYW55UGFyZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvQ2FzY2FkaW5nT25lTWFueVBhcmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmZDUyMTMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvQ2FzY2FkaW5nT25lTWFueVBhcmVudC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNhc2NhZGVUeXBlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uOw0KKw0KK0BFbnRpdHkNCitwdWJsaWMgY2xhc3MgQ2FzY2FkaW5nT25lTWFueVBhcmVudCB7DQorDQorICAgIEBJZA0KKyAgICBAR2VuZXJhdGVkVmFsdWUNCisgICAgcHJpdmF0ZSBsb25nIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5PSJwYXJlbnQiLCBjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkNCisgICAgQE9yZGVyQnkoIm5hbWUgQVNDIikNCisgICAgcHJpdmF0ZSBMaXN0PENhc2NhZGluZ09uZU1hbnlDaGlsZD4gY2hpbGRyZW4gPSANCisgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2FzY2FkaW5nT25lTWFueUNoaWxkPigpOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IA0KKyAgICAgICAgcmV0dXJuIGlkOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTGlzdDxDYXNjYWRpbmdPbmVNYW55Q2hpbGQ+IGdldENoaWxkcmVuKCkgeyANCisgICAgICAgIHJldHVybiBjaGlsZHJlbjsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ2FzY2FkaW5nT25lTWFueUNoaWxkIGNoaWxkKSB7DQorICAgICAgICBjaGlsZC5zZXRQYXJlbnQodGhpcyk7DQorICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgDQorICAgICAgICByZXR1cm4gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyANCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9EYXRhU3RvcmVCYXNpY0VudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL0RhdGFTdG9yZUJhc2ljRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDI4ZWM2MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9EYXRhU3RvcmVCYXNpY0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb247DQorDQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5EYXRhU3RvcmVJZDsNCisNCitARW50aXR5DQorQERhdGFTdG9yZUlkDQorcHVibGljIGNsYXNzIERhdGFTdG9yZUJhc2ljRW50aXR5IHsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgQE1hbnlUb09uZQ0KKyAgICBwcml2YXRlIEJhc2ljRW50aXR5IHJlbDsNCisNCisgICAgQFZlcnNpb24NCisgICAgcHJpdmF0ZSBJbnRlZ2VyIG9wdExvY2s7DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgDQorICAgICAgICByZXR1cm4gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyANCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBCYXNpY0VudGl0eSBnZXRSZWwoKSB7IA0KKyAgICAgICAgcmV0dXJuIHJlbDsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UmVsKEJhc2ljRW50aXR5IHJlbCkgeyANCisgICAgICAgIHRoaXMucmVsID0gcmVsOyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvRGF0YVN0b3JlTWFueU9uZUlkT3duZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9EYXRhU3RvcmVNYW55T25lSWRPd25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2MGVjMzUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvRGF0YVN0b3JlTWFueU9uZUlkT3duZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIERhdGFTdG9yZU1hbnlPbmVJZE93bmVyIHsNCisNCisgICAgQElkDQorICAgIEBNYW55VG9PbmUNCisgICAgcHJpdmF0ZSBEYXRhU3RvcmVCYXNpY0VudGl0eSBpZDsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgQE1hbnlUb09uZQ0KKyAgICBwcml2YXRlIERhdGFTdG9yZU1hbnlPbmVJZE93bmVyIHNlbGZSZWw7DQorDQorICAgIEBWZXJzaW9uDQorICAgIHByaXZhdGUgSW50ZWdlciBvcHRMb2NrOw0KKw0KKyAgICBwdWJsaWMgRGF0YVN0b3JlQmFzaWNFbnRpdHkgZ2V0SWQoKSB7IA0KKyAgICAgICAgcmV0dXJuIGlkOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChEYXRhU3RvcmVCYXNpY0VudGl0eSBpZCkgeyANCisgICAgICAgIHRoaXMuaWQgPSBpZDsgDQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyANCisgICAgICAgIHJldHVybiBuYW1lOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IA0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIERhdGFTdG9yZU1hbnlPbmVJZE93bmVyIGdldFNlbGZSZWwoKSB7IA0KKyAgICAgICAgcmV0dXJuIHNlbGZSZWw7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFNlbGZSZWwoRGF0YVN0b3JlTWFueU9uZUlkT3duZXIgc2VsZlJlbCkgeyANCisgICAgICAgIHRoaXMuc2VsZlJlbCA9IHNlbGZSZWw7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9FbWJlZGRhYmxlV2l0aFJlbGF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvRW1iZWRkYWJsZVdpdGhSZWxhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxOTM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvRW1iZWRkYWJsZVdpdGhSZWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCisNCitARW1iZWRkYWJsZQ0KK3B1YmxpYyBjbGFzcyBFbWJlZGRhYmxlV2l0aFJlbGF0aW9uIHsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgQE1hbnlUb09uZShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkNCisgICAgcHJpdmF0ZSBNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkIHJlbDsNCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyANCisgICAgICAgIHJldHVybiBuYW1lOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IA0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIE11bHRpcGxlU2FtZVR5cGVkRW1iZWRkZWQgZ2V0UmVsKCkgeyANCisgICAgICAgIHJldHVybiByZWw7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFJlbChNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkIHJlbCkgeyANCisgICAgICAgIHRoaXMucmVsID0gcmVsOyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvSUZhY2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9JRmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzVhOTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvSUZhY2UuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUZhY2UgeworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvSWRPcmRlcmVkT25lTWFueUNoaWxkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvSWRPcmRlcmVkT25lTWFueUNoaWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JkYjJlNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9JZE9yZGVyZWRPbmVNYW55Q2hpbGQuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb247CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBJZE9yZGVyZWRPbmVNYW55Q2hpbGQgeworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBNYW55VG9PbmUKKyAgICBwcml2YXRlIElkT3JkZXJlZE9uZU1hbnlQYXJlbnQgZXhwbGljaXRQYXJlbnQ7CisKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBJZE9yZGVyZWRPbmVNYW55UGFyZW50IGltcGxpY2l0UGFyZW50OworCisgICAgQFZlcnNpb24KKyAgICBwcml2YXRlIGludCBvcHRMb2NrOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IAorICAgICAgICByZXR1cm4gaWQ7IAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsgCisgICAgICAgIHRoaXMuaWQgPSBpZDsgCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyAKKyAgICAgICAgcmV0dXJuIG5hbWU7IAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsgCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IAorICAgIH0KKworICAgIHB1YmxpYyBJZE9yZGVyZWRPbmVNYW55UGFyZW50IGdldEV4cGxpY2l0UGFyZW50KCkgeyAKKyAgICAgICAgcmV0dXJuIGV4cGxpY2l0UGFyZW50OyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBsaWNpdFBhcmVudChJZE9yZGVyZWRPbmVNYW55UGFyZW50IGV4cGxpY2l0UGFyZW50KSB7IAorICAgICAgICB0aGlzLmV4cGxpY2l0UGFyZW50ID0gZXhwbGljaXRQYXJlbnQ7IAorICAgIH0KKworICAgIHB1YmxpYyBJZE9yZGVyZWRPbmVNYW55UGFyZW50IGdldEltcGxpY2l0UGFyZW50KCkgeyAKKyAgICAgICAgcmV0dXJuIGltcGxpY2l0UGFyZW50OyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFBhcmVudChJZE9yZGVyZWRPbmVNYW55UGFyZW50IGltcGxpY2l0UGFyZW50KSB7IAorICAgICAgICB0aGlzLmltcGxpY2l0UGFyZW50ID0gaW1wbGljaXRQYXJlbnQ7IAorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9JZE9yZGVyZWRPbmVNYW55UGFyZW50LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvSWRPcmRlcmVkT25lTWFueVBhcmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhODZjOGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvSWRPcmRlcmVkT25lTWFueVBhcmVudC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsKKworQEVudGl0eQorcHVibGljIGNsYXNzIElkT3JkZXJlZE9uZU1hbnlQYXJlbnQgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBPbmVUb01hbnkobWFwcGVkQnk9ImV4cGxpY2l0UGFyZW50IikKKyAgICBAT3JkZXJCeSgiaWQgQVNDIikKKyAgICBwcml2YXRlIExpc3Q8SWRPcmRlcmVkT25lTWFueUNoaWxkPiBleHBsaWNpdENoaWxkcmVuID0gCisgICAgICAgIG5ldyBBcnJheUxpc3Q8SWRPcmRlcmVkT25lTWFueUNoaWxkPigpOworCisgICAgQE9uZVRvTWFueShtYXBwZWRCeT0iaW1wbGljaXRQYXJlbnQiKQorICAgIEBPcmRlckJ5CisgICAgcHJpdmF0ZSBMaXN0PElkT3JkZXJlZE9uZU1hbnlDaGlsZD4gaW1wbGljaXRDaGlsZHJlbiA9IAorICAgICAgICBuZXcgQXJyYXlMaXN0PElkT3JkZXJlZE9uZU1hbnlDaGlsZD4oKTsKKworICAgIEBWZXJzaW9uCisgICAgcHJpdmF0ZSBpbnQgb3B0TG9jazsKKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeyAKKyAgICAgICAgcmV0dXJuIGlkOyAKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxJZE9yZGVyZWRPbmVNYW55Q2hpbGQ+IGdldEV4cGxpY2l0Q2hpbGRyZW4oKSB7IAorICAgICAgICByZXR1cm4gZXhwbGljaXRDaGlsZHJlbjsgCisgICAgfQorCisgICAgcHVibGljIExpc3Q8SWRPcmRlcmVkT25lTWFueUNoaWxkPiBnZXRJbXBsaWNpdENoaWxkcmVuKCkgeyAKKyAgICAgICAgcmV0dXJuIGltcGxpY2l0Q2hpbGRyZW47IAorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgCisgICAgICAgIHJldHVybiBuYW1lOyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IAorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTFJTRW50aXR5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTFJTRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRjMTU5OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9MUlNFbnRpdHkuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9NYW55OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuTFJTOworCitARW50aXR5CitwdWJsaWMgY2xhc3MgTFJTRW50aXR5IHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBATWFueVRvTWFueQorICAgIEBPcmRlckJ5KCJuYW1lIEFTQyIpCisgICAgQExSUworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxCYXNpY0VudGl0eT4gbHJzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QmFzaWNFbnRpdHk+KCk7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsgCisgICAgICAgIHJldHVybiBpZDsgCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyAKKyAgICAgICAgcmV0dXJuIG5hbWU7IAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsgCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IAorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEJhc2ljRW50aXR5PiBnZXRMUlNMaXN0KCkgeyAKKyAgICAgICAgcmV0dXJuIGxyc0xpc3Q7IAorICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9NYW55T25lQ29tcG91bmRJZE93bmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTWFueU9uZUNvbXBvdW5kSWRPd25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkYTYwNTcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTWFueU9uZUNvbXBvdW5kSWRPd25lci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ow0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkQ2xhc3M7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitARW50aXR5DQorQElkQ2xhc3MoTWFueU9uZUNvbXBvdW5kSWRPd25lcklkLmNsYXNzKQ0KK3B1YmxpYyBjbGFzcyBNYW55T25lQ29tcG91bmRJZE93bmVyIHsNCisNCisgICAgQElkDQorICAgIEBHZW5lcmF0ZWRWYWx1ZQ0KKyAgICBwcml2YXRlIGxvbmcgbG9uZ0lkOw0KKw0KKyAgICBASWQNCisgICAgQE1hbnlUb09uZQ0KKyAgICBwcml2YXRlIEJhc2ljRW50aXR5IGVudGl0eUlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBATWFueVRvT25lDQorICAgIHByaXZhdGUgTWFueU9uZUNvbXBvdW5kSWRPd25lciBzZWxmUmVsOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZ0lkKCkgew0KKyAgICAgICAgcmV0dXJuIGxvbmdJZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQmFzaWNFbnRpdHkgZ2V0RW50aXR5SWQoKSB7IA0KKyAgICAgICAgcmV0dXJuIGVudGl0eUlkOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlJZChCYXNpY0VudGl0eSBlbnRpdHlJZCkgeyANCisgICAgICAgIHRoaXMuZW50aXR5SWQgPSBlbnRpdHlJZDsgDQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyANCisgICAgICAgIHJldHVybiBuYW1lOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IA0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIE1hbnlPbmVDb21wb3VuZElkT3duZXIgZ2V0U2VsZlJlbCgpIHsgDQorICAgICAgICByZXR1cm4gc2VsZlJlbDsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0U2VsZlJlbChNYW55T25lQ29tcG91bmRJZE93bmVyIHNlbGZSZWwpIHsgDQorICAgICAgICB0aGlzLnNlbGZSZWwgPSBzZWxmUmVsOyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTWFueU9uZUNvbXBvdW5kSWRPd25lcklkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTWFueU9uZUNvbXBvdW5kSWRPd25lcklkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNTFmNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9NYW55T25lQ29tcG91bmRJZE93bmVySWQuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmlvLio7CisKKy8qKgorICogQXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MgZm9yOiBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zLk1hbnlPbmVDb21wb3VuZElkT3duZXIKKyAqCisgKiBBdXRvLWdlbmVyYXRlZCBieToKKyAqIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkFwcGxpY2F0aW9uSWRUb29sCisgKi8KK3B1YmxpYyBjbGFzcyBNYW55T25lQ29tcG91bmRJZE93bmVySWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCXN0YXRpYyB7CisJCS8vIHJlZ2lzdGVyIHBlcnNpc3RlbnQgY2xhc3MgaW4gSlZNCisJCXRyeSB7IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnMuTWFueU9uZUNvbXBvdW5kSWRPd25lciIpOyB9CisJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7fQorCX0KKworCXB1YmxpYyBsb25nIGVudGl0eUlkOworCXB1YmxpYyBsb25nIGxvbmdJZDsKKworCXB1YmxpYyBNYW55T25lQ29tcG91bmRJZE93bmVySWQoKSB7CisJfQorCisJcHVibGljIE1hbnlPbmVDb21wb3VuZElkT3duZXJJZChTdHJpbmcgc3RyKSB7CisJCWZyb21TdHJpbmcoc3RyKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZW50aXR5SWQpCisJCQkrICI6OiIgKyBTdHJpbmcudmFsdWVPZihsb25nSWQpOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWludCBycyA9IDE3OworCQlycyA9IHJzICogMzcgKyAoaW50KSAoZW50aXR5SWQgXiAoZW50aXR5SWQgPj4+IDMyKSk7CisJCXJzID0gcnMgKiAzNyArIChpbnQpIChsb25nSWQgXiAobG9uZ0lkID4+PiAzMikpOworCQlyZXR1cm4gcnM7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYob2JqID09IG51bGwgfHwgb2JqLmdldENsYXNzKCkgIT0gZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlNYW55T25lQ29tcG91bmRJZE93bmVySWQgb3RoZXIgPSAoTWFueU9uZUNvbXBvdW5kSWRPd25lcklkKSBvYmo7CisJCXJldHVybiAoZW50aXR5SWQgPT0gb3RoZXIuZW50aXR5SWQpCisJCQkmJiAobG9uZ0lkID09IG90aGVyLmxvbmdJZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgeworCQlUb2tlbml6ZXIgdG9rZSA9IG5ldyBUb2tlbml6ZXIoc3RyKTsKKwkJc3RyID0gdG9rZS5uZXh0VG9rZW4oKTsKKwkJZW50aXR5SWQgPSBMb25nLnBhcnNlTG9uZyhzdHIpOworCQlzdHIgPSB0b2tlLm5leHRUb2tlbigpOworCQlsb25nSWQgPSBMb25nLnBhcnNlTG9uZyhzdHIpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVG9rZW5pemVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RyOworCQlwcml2YXRlIGludCBsYXN0OworCisJCXB1YmxpYyBUb2tlbml6ZXIgKFN0cmluZyBzdHIpIHsKKwkJCXRoaXMuc3RyID0gc3RyOworCQl9CisKKwkJcHVibGljIFN0cmluZyBuZXh0VG9rZW4gKCkgeworCQkJaW50IG5leHQgPSBzdHIuaW5kZXhPZigiOjoiLCBsYXN0KTsKKwkJCVN0cmluZyBwYXJ0OworCQkJaWYobmV4dCA9PSAtMSkgeworCQkJCXBhcnQgPSBzdHIuc3Vic3RyaW5nKGxhc3QpOworCQkJCWxhc3QgPSBzdHIubGVuZ3RoKCk7CisJCQl9IGVsc2UgeworCQkJCXBhcnQgPSBzdHIuc3Vic3RyaW5nKGxhc3QsIG5leHQpOworCQkJCWxhc3QgPSBuZXh0ICsgMjsKKwkJCX0KKwkJCXJldHVybiBwYXJ0OworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL01hbnlPbmVJZE93bmVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTWFueU9uZUlkT3duZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWZjNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL01hbnlPbmVJZE93bmVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb247DQorDQorQEVudGl0eQ0KK3B1YmxpYyBjbGFzcyBNYW55T25lSWRPd25lciB7DQorDQorICAgIEBJZA0KKyAgICBATWFueVRvT25lDQorICAgIHByaXZhdGUgQmFzaWNFbnRpdHkgaWQ7DQorDQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorDQorICAgIEBNYW55VG9PbmUNCisgICAgcHJpdmF0ZSBNYW55T25lSWRPd25lciBzZWxmUmVsOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIEJhc2ljRW50aXR5IGdldElkKCkgeyANCisgICAgICAgIHJldHVybiBpZDsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SWQoQmFzaWNFbnRpdHkgaWQpIHsgDQorICAgICAgICB0aGlzLmlkID0gaWQ7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgDQorICAgICAgICByZXR1cm4gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyANCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBNYW55T25lSWRPd25lciBnZXRTZWxmUmVsKCkgeyANCisgICAgICAgIHJldHVybiBzZWxmUmVsOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxmUmVsKE1hbnlPbmVJZE93bmVyIHNlbGZSZWwpIHsgDQorICAgICAgICB0aGlzLnNlbGZSZWwgPSBzZWxmUmVsOyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvTXVsdGlwbGVTYW1lVHlwZWRFbWJlZGRlZC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL011bHRpcGxlU2FtZVR5cGVkRW1iZWRkZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmY0OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL011bHRpcGxlU2FtZVR5cGVkRW1iZWRkZWQuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbjsNCisNCitARW50aXR5DQorcHVibGljIGNsYXNzIE11bHRpcGxlU2FtZVR5cGVkRW1iZWRkZWQgeyANCisNCisgICAgQElkDQorICAgIEBHZW5lcmF0ZWRWYWx1ZQ0KKyAgICBwcml2YXRlIGxvbmcgaWQ7DQorDQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorDQorICAgIEBFbWJlZGRlZA0KKyAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0ibmFtZSIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9IkUxX05BTUUiKSkNCisgICAgQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT0icmVsIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iRTFfUkVMIikpDQorICAgIHByaXZhdGUgRW1iZWRkYWJsZVdpdGhSZWxhdGlvbiBlbWJlZDE7DQorDQorICAgIEBFbWJlZGRlZA0KKyAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0ibmFtZSIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9IkUyX05BTUUiKSkNCisgICAgQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT0icmVsIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iRTJfUkVMIikpDQorICAgIHByaXZhdGUgRW1iZWRkYWJsZVdpdGhSZWxhdGlvbiBlbWJlZDI7DQorDQorICAgIEBWZXJzaW9uDQorICAgIHByaXZhdGUgSW50ZWdlciBvcHRMb2NrOw0KKw0KKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsgDQorICAgICAgICByZXR1cm4gaWQ7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFbWJlZGRhYmxlV2l0aFJlbGF0aW9uIGdldEVtYmVkMSgpIHsNCisgICAgICAgIHJldHVybiBlbWJlZDE7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEVtYmVkMShFbWJlZGRhYmxlV2l0aFJlbGF0aW9uIGVtYmVkMSkgew0KKyAgICAgICAgdGhpcy5lbWJlZDEgPSBlbWJlZDE7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFbWJlZGRhYmxlV2l0aFJlbGF0aW9uIGdldEVtYmVkMigpIHsNCisgICAgICAgIHJldHVybiBlbWJlZDI7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEVtYmVkMihFbWJlZGRhYmxlV2l0aFJlbGF0aW9uIGVtYmVkMikgew0KKyAgICAgICAgdGhpcy5lbWJlZDIgPSBlbWJlZDI7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgDQorICAgICAgICByZXR1cm4gbmFtZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyANCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7IA0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UYXJnZXRlZElGYWNlUmVsYXRpb25QYXJlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UYXJnZXRlZElGYWNlUmVsYXRpb25QYXJlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMzMxZjAxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL1RhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsNCisNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb247DQorDQorQEVudGl0eQ0KK3B1YmxpYyBjbGFzcyBUYXJnZXRlZElGYWNlUmVsYXRpb25QYXJlbnQgDQorICAgIGltcGxlbWVudHMgSUZhY2Ugew0KKw0KKyAgICBASWQNCisgICAgQEdlbmVyYXRlZFZhbHVlDQorICAgIHByaXZhdGUgbG9uZyBpZDsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgQE1hbnlUb09uZSh0YXJnZXRFbnRpdHk9VGFyZ2V0ZWRJRmFjZVJlbGF0aW9uUGFyZW50LmNsYXNzLA0KKyAgICAgICAgY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpDQorICAgIHByaXZhdGUgSUZhY2UgaWZhY2U7DQorDQorICAgIEBWZXJzaW9uDQorICAgIHByaXZhdGUgSW50ZWdlciBvcHRMb2NrOw0KKw0KKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsgDQorICAgICAgICByZXR1cm4gaWQ7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyBJRmFjZSBnZXRJRmFjZSgpIHsNCisgICAgICAgIHJldHVybiBpZmFjZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SUZhY2UoSUZhY2UgaWZhY2UpIHsNCisgICAgICAgIHRoaXMuaWZhY2UgPSBpZmFjZTsgDQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyANCisgICAgICAgIHJldHVybiBuYW1lOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IA0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgDQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL1Rlc3RDYXNjYWRpbmdPbmVNYW55V2l0aEZvcmVpZ25LZXkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0Q2FzY2FkaW5nT25lTWFueVdpdGhGb3JlaWduS2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExNDA0NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0Q2FzY2FkaW5nT25lTWFueVdpdGhGb3JlaWduS2V5LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyBhIGNhc2NhZGluZyBvbmUtbWFueSBiYWNrZWQgYnkgYSBmb3JlaWduIGtleS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdENhc2NhZGluZ09uZU1hbnlXaXRoRm9yZWlnbktleQorICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKENhc2NhZGluZ09uZU1hbnlQYXJlbnQuY2xhc3MsIENhc2NhZGluZ09uZU1hbnlDaGlsZC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3QoKSB7CisgICAgICAgIENhc2NhZGluZ09uZU1hbnlQYXJlbnQgcGFyZW50ID0gbmV3IENhc2NhZGluZ09uZU1hbnlQYXJlbnQoKTsKKyAgICAgICAgcGFyZW50LnNldE5hbWUoInBhcmVudCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgQ2FzY2FkaW5nT25lTWFueUNoaWxkIGNoaWxkID0gbmV3IENhc2NhZGluZ09uZU1hbnlDaGlsZCgpOworICAgICAgICAgICAgY2hpbGQuc2V0TmFtZSgiY2hpbGQiICsgaSk7CisgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBsb25nIGlkID0gcGFyZW50LmdldElkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkMCIsIHBhcmVudC5nZXRDaGlsZHJlbigpLmdldCgwKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkMSIsIHBhcmVudC5nZXRDaGlsZHJlbigpLmdldCgxKS5nZXROYW1lKCkpOworICAgICAgICBlbS5jbG9zZSgpOworCisgICAgICAgIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgcGFyZW50ID0gZW0uZmluZChDYXNjYWRpbmdPbmVNYW55UGFyZW50LmNsYXNzLCBpZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiLCBwYXJlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5nZXRDaGlsZHJlbigpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQwIiwgcGFyZW50LmdldENoaWxkcmVuKCkuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQxIiwgcGFyZW50LmdldENoaWxkcmVuKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHsKKyAgICAgICAgQ2FzY2FkaW5nT25lTWFueVBhcmVudCBwYXJlbnQgPSBuZXcgQ2FzY2FkaW5nT25lTWFueVBhcmVudCgpOworICAgICAgICBwYXJlbnQuc2V0TmFtZSgicGFyZW50Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBDYXNjYWRpbmdPbmVNYW55Q2hpbGQgY2hpbGQgPSBuZXcgQ2FzY2FkaW5nT25lTWFueUNoaWxkKCk7CisgICAgICAgICAgICBjaGlsZC5zZXROYW1lKCJjaGlsZCIgKyBpKTsKKyAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KHBhcmVudCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGxvbmcgaWQgPSBwYXJlbnQuZ2V0SWQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIHBhcmVudCA9IGVtLmZpbmQoQ2FzY2FkaW5nT25lTWFueVBhcmVudC5jbGFzcywgaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnJlbW92ZShwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBhc3NlcnRSZW1vdmVkKGVtLCBpZCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBhc3NlcnRSZW1vdmVkKGVtLCBpZCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlbW92ZWQoRW50aXR5TWFuYWdlciBlbSwgbG9uZyBpZCkgeworICAgICAgICBhc3NlcnROdWxsKGVtLmZpbmQoQ2FzY2FkaW5nT25lTWFueVBhcmVudC5jbGFzcywgaWQpKTsKKyAgICAgICAgTGlzdCByZXMgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IGMgZnJvbSBDYXNjYWRpbmdPbmVNYW55Q2hpbGQgYyIpLgorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmVpZ25LZXkoKSB7CisgICAgICAgIEpEQkNDb25maWd1cmF0aW9uIGNvbmYgPSAoSkRCQ0NvbmZpZ3VyYXRpb24pIGVtZi5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmICghY29uZi5nZXREQkRpY3Rpb25hcnlJbnN0YW5jZSgpLnN1cHBvcnRzRm9yZWlnbktleXMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2FzY2FkaW5nT25lTWFueVBhcmVudCBwYXJlbnQgPSBuZXcgQ2FzY2FkaW5nT25lTWFueVBhcmVudCgpOworICAgICAgICBwYXJlbnQuc2V0TmFtZSgicGFyZW50Iik7CisgICAgICAgIENhc2NhZGluZ09uZU1hbnlDaGlsZCBjaGlsZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGNoaWxkID0gbmV3IENhc2NhZGluZ09uZU1hbnlDaGlsZCgpOworICAgICAgICAgICAgY2hpbGQuc2V0TmFtZSgiY2hpbGQiICsgaSk7CisgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBsb25nIGlkID0gcGFyZW50LmdldElkKCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgb2VtID0gKE9wZW5KUEFFbnRpdHlNYW5hZ2VyKSBlbWYuCisgICAgICAgICAgICBjcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIHBhcmVudCA9IG9lbS5maW5kKENhc2NhZGluZ09uZU1hbnlQYXJlbnQuY2xhc3MsIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKKyAgICAgICAgY2hpbGQgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7IAorICAgICAgICBvZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBvZW0ucmVtb3ZlKHBhcmVudCk7CisgICAgICAgIC8vIHVuZGVsZXRlIG9uZSBjaGlsZAorICAgICAgICBhc3NlcnRUcnVlKG9lbS5pc1JlbW92ZWQoY2hpbGQpKTsKKyAgICAgICAgb2VtLnBlcnNpc3QoY2hpbGQpOworICAgICAgICBhc3NlcnRGYWxzZShvZW0uaXNSZW1vdmVkKGNoaWxkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIGNoaWxkLmdldFBhcmVudCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9lbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICAgICAgZmFpbCgiQ29tbWl0IHNob3VsZCBoYXZlIGZhaWxlZCBkdWUgdG8gRksgY29uc3RyYWludCB2aW9sYXRpb24uIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgb2VtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0Q2FzY2FkaW5nT25lTWFueVdpdGhGb3JlaWduS2V5LmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0RWFnZXJCaWRpU1FMLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdEVhZ2VyQmlkaVNRTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWU2YmYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdEVhZ2VyQmlkaVNRTC5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5yZWxhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFFbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU1FMTGlzdGVuZXJUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHRoYXQgd2hlbiBib3RoIHNpZGVzIG9mIGEgbWFwcGVkLWJ5IHJlbGF0aW9uIGFyZSBlYWdlciBmZXRjaGVkLCAKKyAqIHRyYXZlcnNpbmcgZnJvbSB0aGUgbWFwcGVkLWJ5IHNpZGUgdG8gdGhlIG1hcHBpbmcgc2lkZSBjdXRzIG9mZiAtLSB0aGF0CisgKiB3ZSBkb24ndCB0cmF2ZXJzZSBpbiBhIGxvb3AgYmFjayB0byB0aGUgbWFwcGVkLWJ5IHNpZGUgaW4gdGhlIGdlbmVyYXRlZAorICogU1FMLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RWFnZXJCaWRpU1FMCisgICAgZXh0ZW5kcyBTUUxMaXN0ZW5lclRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgbG9uZyBpZDE7CisgICAgcHJpdmF0ZSBsb25nIGlkMjsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChCaWRpUGFyZW50LmNsYXNzLCBCaWRpQ2hpbGQuY2xhc3MpOworICAgICAgICAKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAyOyBpKyspIHsKKyAgICAgICAgICAgIEJpZGlQYXJlbnQgcGFyZW50ID0gbmV3IEJpZGlQYXJlbnQoKTsKKyAgICAgICAgICAgIHBhcmVudC5zZXROYW1lKCJwYXJlbnQiICsgaSk7CisgICAgICAgICAgICBlbS5wZXJzaXN0KHBhcmVudCk7CisKKyAgICAgICAgICAgIEJpZGlDaGlsZCBvbmVPbmVDaGlsZCA9IG5ldyBCaWRpQ2hpbGQoKTsKKyAgICAgICAgICAgIG9uZU9uZUNoaWxkLnNldE5hbWUoIm9uZVRvT25lQ2hpbGQiICsgaSk7CisgICAgICAgICAgICBvbmVPbmVDaGlsZC5zZXRPbmVUb09uZVBhcmVudChwYXJlbnQpOworICAgICAgICAgICAgcGFyZW50LnNldE9uZVRvT25lQ2hpbGQob25lT25lQ2hpbGQpOworICAgICAgICAgICAgZW0ucGVyc2lzdChvbmVPbmVDaGlsZCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IDM7IGorKykgeworICAgICAgICAgICAgICAgIEJpZGlDaGlsZCBvbmVNYW55Q2hpbGQgPSBuZXcgQmlkaUNoaWxkKCk7CisgICAgICAgICAgICAgICAgb25lTWFueUNoaWxkLnNldE5hbWUoIm9uZVRvTWFueUNoaWxkIiArIGkgKyAiOjoiICsgaik7CisgICAgICAgICAgICAgICAgb25lTWFueUNoaWxkLnNldE9uZVRvTWFueVBhcmVudChwYXJlbnQpOworICAgICAgICAgICAgICAgIHBhcmVudC5nZXRPbmVUb01hbnlDaGlsZHJlbigpLmFkZChvbmVNYW55Q2hpbGQpOworICAgICAgICAgICAgICAgIGVtLnBlcnNpc3Qob25lTWFueUNoaWxkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgICAgICAgICBpZDEgPSBwYXJlbnQuZ2V0SWQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZDIgPSBwYXJlbnQuZ2V0SWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVhZ2VyT3duZXJPbmVUb01hbnlGaW5kKCkgeworICAgICAgICBzcWwuY2xlYXIoKTsKKworICAgICAgICBPcGVuSlBBRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldEZldGNoUGxhbigpLmFkZEZpZWxkKEJpZGlQYXJlbnQuY2xhc3MsICJvbmVUb01hbnlDaGlsZHJlbiIpOworICAgICAgICBlbS5nZXRGZXRjaFBsYW4oKS5hZGRGaWVsZChCaWRpQ2hpbGQuY2xhc3MsICJvbmVUb01hbnlQYXJlbnQiKTsKKyAgICAgICAgQmlkaVBhcmVudCBwYXJlbnQgPSBlbS5maW5kKEJpZGlQYXJlbnQuY2xhc3MsIGlkMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzcWwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90U1FMKCIuKiBMRUZUIE9VVEVSIEpPSU4gQmlkaVBhcmVudCAuKiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudDEiLCBwYXJlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHBhcmVudC5nZXRPbmVUb01hbnlDaGlsZHJlbigpLnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUNoaWxkMTo6IiArIChpICsgMSksIAorICAgICAgICAgICAgICAgIHBhcmVudC5nZXRPbmVUb01hbnlDaGlsZHJlbigpLmdldChpKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwKKyAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0T25lVG9NYW55Q2hpbGRyZW4oKS5nZXQoaSkuZ2V0T25lVG9NYW55UGFyZW50KCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzcWwuc2l6ZSgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWFnZXJPd25lck9uZVRvT25lRmluZCgpIHsKKyAgICAgICAgc3FsLmNsZWFyKCk7CisKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRGZXRjaFBsYW4oKS5hZGRGaWVsZChCaWRpUGFyZW50LmNsYXNzLCAib25lVG9PbmVDaGlsZCIpOworICAgICAgICBlbS5nZXRGZXRjaFBsYW4oKS5hZGRGaWVsZChCaWRpQ2hpbGQuY2xhc3MsICJvbmVUb09uZVBhcmVudCIpOworICAgICAgICBCaWRpUGFyZW50IHBhcmVudCA9IGVtLmZpbmQoQmlkaVBhcmVudC5jbGFzcywgaWQxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNxbC5zaXplKCkpOworICAgICAgICBhc3NlcnROb3RTUUwoIi4qIExFRlQgT1VURVIgSk9JTiBCaWRpUGFyZW50IC4qIik7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50MSIsIHBhcmVudC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudC5nZXRPbmVUb09uZUNoaWxkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZVRvT25lQ2hpbGQxIiwgcGFyZW50LmdldE9uZVRvT25lQ2hpbGQoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyZW50LCBwYXJlbnQuZ2V0T25lVG9PbmVDaGlsZCgpLmdldE9uZVRvT25lUGFyZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVhZ2VyT3duZXJPbmVUb01hbnlRdWVyeSgpIHsKKyAgICAgICAgc3FsLmNsZWFyKCk7CisKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBPcGVuSlBBUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJTRUxFQ1QgbyBGUk9NIEJpZGlQYXJlbnQgbyAiCisgICAgICAgICAgICArICJPUkRFUiBCWSBvLm5hbWUgQVNDIik7CisgICAgICAgIHEuZ2V0RmV0Y2hQbGFuKCkuYWRkRmllbGQoQmlkaVBhcmVudC5jbGFzcywgIm9uZVRvTWFueUNoaWxkcmVuIik7CisgICAgICAgIHEuZ2V0RmV0Y2hQbGFuKCkuYWRkRmllbGQoQmlkaUNoaWxkLmNsYXNzLCAib25lVG9NYW55UGFyZW50Iik7CisgICAgICAgIExpc3Q8QmlkaVBhcmVudD4gcmVzID0gKExpc3Q8QmlkaVBhcmVudD4pIHEuZ2V0UmVzdWx0TGlzdCgpOyAKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzcWwudG9TdHJpbmcoKSwgMiwgc3FsLnNpemUoKSk7CisgICAgICAgIGFzc2VydE5vdFNRTCgiLiogTEVGVCBPVVRFUiBKT0lOIEJpZGlQYXJlbnQgLioiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiICsgKGkgKyAxKSwgcmVzLmdldChpKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlcy5nZXQoaSkuZ2V0T25lVG9NYW55Q2hpbGRyZW4oKS5zaXplKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUNoaWxkIiArIChpICsgMSkgKyAiOjoiICsgKGogKyAxKSwgCisgICAgICAgICAgICAgICAgICAgIHJlcy5nZXQoaSkuZ2V0T25lVG9NYW55Q2hpbGRyZW4oKS5nZXQoaikuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzLmdldChpKSwgcmVzLmdldChpKS5nZXRPbmVUb01hbnlDaGlsZHJlbigpLgorICAgICAgICAgICAgICAgICAgICBnZXQoaikuZ2V0T25lVG9NYW55UGFyZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzcWwuc2l6ZSgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWFnZXJPd25lck9uZVRvT25lUXVlcnkoKSB7CisgICAgICAgIHNxbC5jbGVhcigpOworCisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgT3BlbkpQQVF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgiU0VMRUNUIG8gRlJPTSBCaWRpUGFyZW50IG8gIgorICAgICAgICAgICAgKyAiT1JERVIgQlkgby5uYW1lIEFTQyIpOworICAgICAgICBxLmdldEZldGNoUGxhbigpLmFkZEZpZWxkKEJpZGlQYXJlbnQuY2xhc3MsICJvbmVUb09uZUNoaWxkIik7CisgICAgICAgIHEuZ2V0RmV0Y2hQbGFuKCkuYWRkRmllbGQoQmlkaUNoaWxkLmNsYXNzLCAib25lVG9PbmVQYXJlbnQiKTsKKyAgICAgICAgTGlzdDxCaWRpUGFyZW50PiByZXMgPSAoTGlzdDxCaWRpUGFyZW50PikgcS5nZXRSZXN1bHRMaXN0KCk7IAorCisgICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNxbC5zaXplKCkpOworICAgICAgICBhc3NlcnROb3RTUUwoIi4qIExFRlQgT1VURVIgSk9JTiBCaWRpUGFyZW50IC4qIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiArIChpICsgMSksIHJlcy5nZXQoaSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzLmdldChpKS5nZXRPbmVUb09uZUNoaWxkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmVUb09uZUNoaWxkIiArIChpICsgMSksCisgICAgICAgICAgICAgICAgcmVzLmdldChpKS5nZXRPbmVUb09uZUNoaWxkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXMuZ2V0KGkpLCAKKyAgICAgICAgICAgICAgICByZXMuZ2V0KGkpLmdldE9uZVRvT25lQ2hpbGQoKS5nZXRPbmVUb09uZVBhcmVudCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVhZ2VyTm9uT3duZXJPbmVUb09uZVF1ZXJ5KCkgeworICAgICAgICBzcWwuY2xlYXIoKTsKKworICAgICAgICBPcGVuSlBBRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIE9wZW5KUEFRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCBvIEZST00gQmlkaVBhcmVudCBvICIKKyAgICAgICAgICAgICsgIk9SREVSIEJZIG8ubmFtZSBBU0MiKTsKKyAgICAgICAgcS5nZXRGZXRjaFBsYW4oKS5hZGRGaWVsZChCaWRpUGFyZW50LmNsYXNzLCAib25lVG9PbmVDaGlsZCIpOworICAgICAgICBxLmdldEZldGNoUGxhbigpLmFkZEZpZWxkKEJpZGlDaGlsZC5jbGFzcywgIm9uZVRvTWFueVBhcmVudCIpOworICAgICAgICBMaXN0PEJpZGlQYXJlbnQ+IHJlcyA9IChMaXN0PEJpZGlQYXJlbnQ+KSBxLmdldFJlc3VsdExpc3QoKTsgCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3FsLnNpemUoKSk7CisgICAgICAgIGFzc2VydFNRTCgiLiogTEVGVCBPVVRFUiBKT0lOIEJpZGlQYXJlbnQgLioiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiICsgKGkgKyAxKSwgcmVzLmdldChpKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMuZ2V0KGkpLmdldE9uZVRvT25lQ2hpbGQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZVRvT25lQ2hpbGQiICsgKGkgKyAxKSwKKyAgICAgICAgICAgICAgICByZXMuZ2V0KGkpLmdldE9uZVRvT25lQ2hpbGQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXMuZ2V0KGkpLmdldE9uZVRvT25lQ2hpbGQoKS5nZXRPbmVUb01hbnlQYXJlbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNxbC5zaXplKCkpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdEVhZ2VyQmlkaVNRTC5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdElkT3JkZXJlZE9uZU1hbnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0SWRPcmRlcmVkT25lTWFueS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdElkT3JkZXJlZE9uZU1hbnkuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNpbmdsZUVNRlRlc3RDYXNlOworCisvKioKKyAqIFRlc3Qgb3JkZXJpbmcgYSBvbmUtbWFueSBmaWVsZCBvbiB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlIHJlbGF0ZWQgZW50aXR5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0SWRPcmRlcmVkT25lTWFueQorICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKElkT3JkZXJlZE9uZU1hbnlQYXJlbnQuY2xhc3MsIElkT3JkZXJlZE9uZU1hbnlDaGlsZC5jbGFzcyk7CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKworICAgICAgICBJZE9yZGVyZWRPbmVNYW55UGFyZW50IHBhcmVudCA9IG5ldyBJZE9yZGVyZWRPbmVNYW55UGFyZW50KCk7CisgICAgICAgIHBhcmVudC5zZXROYW1lKCJwYXJlbnQiKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYXJlbnQpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBJZE9yZGVyZWRPbmVNYW55Q2hpbGQgZXhwbGljaXQgPSBuZXcgSWRPcmRlcmVkT25lTWFueUNoaWxkKCk7CisgICAgICAgICAgICBleHBsaWNpdC5zZXRJZCgzIC0gaSk7CisgICAgICAgICAgICBleHBsaWNpdC5zZXROYW1lKCJleHBsaWNpdCIgKyBleHBsaWNpdC5nZXRJZCgpKTsKKyAgICAgICAgICAgIGV4cGxpY2l0LnNldEV4cGxpY2l0UGFyZW50KHBhcmVudCk7CisgICAgICAgICAgICBwYXJlbnQuZ2V0RXhwbGljaXRDaGlsZHJlbigpLmFkZChleHBsaWNpdCk7CisgICAgICAgICAgICBlbS5wZXJzaXN0KGV4cGxpY2l0KTsKKworICAgICAgICAgICAgSWRPcmRlcmVkT25lTWFueUNoaWxkIGltcGxpY2l0ID0gbmV3IElkT3JkZXJlZE9uZU1hbnlDaGlsZCgpOworICAgICAgICAgICAgaW1wbGljaXQuc2V0SWQoMTAwIC0gaSk7CisgICAgICAgICAgICBpbXBsaWNpdC5zZXROYW1lKCJpbXBsaWNpdCIgKyBpbXBsaWNpdC5nZXRJZCgpKTsKKyAgICAgICAgICAgIGltcGxpY2l0LnNldEltcGxpY2l0UGFyZW50KHBhcmVudCk7CisgICAgICAgICAgICBwYXJlbnQuZ2V0SW1wbGljaXRDaGlsZHJlbigpLmFkZChpbXBsaWNpdCk7CisgICAgICAgICAgICBlbS5wZXJzaXN0KGltcGxpY2l0KTsKKyAgICAgICAgfQorCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGlkID0gcGFyZW50LmdldElkKCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0T3JkZXJpbmcoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBJZE9yZGVyZWRPbmVNYW55UGFyZW50IHBhcmVudCA9IGVtLmZpbmQoSWRPcmRlcmVkT25lTWFueVBhcmVudC5jbGFzcywgCisgICAgICAgICAgICBpZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiLCBwYXJlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHBhcmVudC5nZXRFeHBsaWNpdENoaWxkcmVuKCkuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgcGFyZW50LmdldEV4cGxpY2l0Q2hpbGRyZW4oKS5nZXQoaSkuZ2V0SWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImV4cGxpY2l0IiArIChpICsgMSksIHBhcmVudC5nZXRFeHBsaWNpdENoaWxkcmVuKCkuCisgICAgICAgICAgICAgICAgZ2V0KGkpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRPcmRlcmluZygpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIElkT3JkZXJlZE9uZU1hbnlQYXJlbnQgcGFyZW50ID0gZW0uZmluZChJZE9yZGVyZWRPbmVNYW55UGFyZW50LmNsYXNzLCAKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudCIsIHBhcmVudC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcGFyZW50LmdldEV4cGxpY2l0Q2hpbGRyZW4oKS5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyA5OCwgcGFyZW50LmdldEltcGxpY2l0Q2hpbGRyZW4oKS5nZXQoaSkuZ2V0SWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImltcGxpY2l0IiArIChpICsgOTgpLCBwYXJlbnQuZ2V0SW1wbGljaXRDaGlsZHJlbigpLgorICAgICAgICAgICAgICAgIGdldChpKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0SWRPcmRlcmVkT25lTWFueS5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdExSUy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL1Rlc3RMUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUxODVhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL1Rlc3RMUlMuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQUVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IExSUyByZWxhdGlvbnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGNsYXNzIFRlc3RMUlMKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChMUlNFbnRpdHkuY2xhc3MsIEJhc2ljRW50aXR5LmNsYXNzKTsKKyAgICAgICAgCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisKKyAgICAgICAgTFJTRW50aXR5IGxycyA9IG5ldyBMUlNFbnRpdHkoKTsKKyAgICAgICAgbHJzLnNldE5hbWUoImxycyIpOyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMzsgaSsrKSB7CisgICAgICAgICAgICBCYXNpY0VudGl0eSBiYXNpYyA9IG5ldyBCYXNpY0VudGl0eSgpOworICAgICAgICAgICAgYmFzaWMuc2V0TmFtZSgiYmFzaWMiICsgaSk7CisgICAgICAgICAgICBlbS5wZXJzaXN0KGJhc2ljKTsKKyAgICAgICAgICAgIGxycy5nZXRMUlNMaXN0KCkuYWRkKGJhc2ljKTsKKyAgICAgICAgfQorICAgICAgICBlbS5wZXJzaXN0KGxycyk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGlkID0gbHJzLmdldElkKCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVNQ2xlYXIoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBMUlNFbnRpdHkgbHJzID0gZW0uZmluZChMUlNFbnRpdHkuY2xhc3MsIGlkKTsKKyAgICAgICAgYXNzZXJ0TFJTKGxycywgImxycyIpOworICAgICAgICBlbS5jbGVhcigpOworICAgICAgICBhc3NlcnROdWxsKGxycy5nZXRMUlNMaXN0KCkpOworICAgICAgICBhc3NlcnRNZXJnZShscnMpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFTUNsb3NlKCkgeworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgTFJTRW50aXR5IGxycyA9IGVtLmZpbmQoTFJTRW50aXR5LmNsYXNzLCBpZCk7CisgICAgICAgIGFzc2VydExSUyhscnMsICJscnMiKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChscnMuZ2V0TFJTTGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0TWVyZ2UobHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWNoQ29weSgpIHsKKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBMUlNFbnRpdHkgbHJzID0gZW0uZmluZChMUlNFbnRpdHkuY2xhc3MsIGlkKTsKKyAgICAgICAgYXNzZXJ0TFJTKGxycywgImxycyIpOworICAgICAgICBscnMgPSBlbS5kZXRhY2gobHJzKTsgCisgICAgICAgIGFzc2VydEVxdWFscygibHJzIiwgbHJzLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwobHJzLmdldExSU0xpc3QoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgICAgIGFzc2VydE1lcmdlKGxycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydExSUyhMUlNFbnRpdHkgbHJzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGxycyk7CisgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLCBscnMuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxycy5nZXRMUlNMaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gbHJzLmdldExSU0xpc3QoKS5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaXRyLmhhc05leHQoKTsgaSsrKSB7CisgICAgICAgICAgICBCYXNpY0VudGl0eSBiYXNpYyA9IChCYXNpY0VudGl0eSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYmFzaWMiICsgaSwgYmFzaWMuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBPcGVuSlBBUGVyc2lzdGVuY2UuY2xvc2UoaXRyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVyZ2UoTFJTRW50aXR5IGxycykgeworICAgICAgICBscnMuc2V0TmFtZSgiY2hhbmdlZCIpOworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBhc3NlcnRMUlMoZW0ubWVyZ2UobHJzKSwgImNoYW5nZWQiKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGFzc2VydExSUyhlbS5maW5kKExSU0VudGl0eS5jbGFzcywgaWQpLCAiY2hhbmdlZCIpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdExSUy5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdE1hbnlPbmVBc0lkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9yZWxhdGlvbnMvVGVzdE1hbnlPbmVBc0lkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlMzVkZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0TWFueU9uZUFzSWQuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UucmVsYXRpb25zOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBQZXJmb3JtIGJhc2ljIG9wZXJhdGlvbnMgb24gYW4gZW50aXR5IHdpdGggYSBtYW55LW9uZSByZWxhdGlvbiBhcyBpdHMgaWQKKyAqIGZpZWxkLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TWFueU9uZUFzSWQKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgbG9uZyBpZDsKKyAgICBwcml2YXRlIGxvbmcgZHNpZDsKKyAgICBwcml2YXRlIGxvbmcgY2lkOworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKEJhc2ljRW50aXR5LmNsYXNzLCBEYXRhU3RvcmVCYXNpY0VudGl0eS5jbGFzcywKKyAgICAgICAgICAgIE1hbnlPbmVJZE93bmVyLmNsYXNzLCBEYXRhU3RvcmVNYW55T25lSWRPd25lci5jbGFzcywKKyAgICAgICAgICAgIE1hbnlPbmVDb21wb3VuZElkT3duZXIuY2xhc3MpOworCisgICAgICAgIEJhc2ljRW50aXR5IGlkMSA9IG5ldyBCYXNpY0VudGl0eSgpOworICAgICAgICBpZDEuc2V0TmFtZSgiaWQxIik7CisgICAgICAgIEJhc2ljRW50aXR5IGlkMiA9IG5ldyBCYXNpY0VudGl0eSgpOworICAgICAgICBpZDIuc2V0TmFtZSgiaWQyIik7CisgICAgICAgIGlkMS5zZXRSZWwoaWQyKTsKKyAgICAgICAgaWQyLnNldFJlbChpZDEpOworICAgICAgICBEYXRhU3RvcmVCYXNpY0VudGl0eSBkc2lkMSA9IG5ldyBEYXRhU3RvcmVCYXNpY0VudGl0eSgpOworICAgICAgICBkc2lkMS5zZXROYW1lKCJkc2lkMSIpOworICAgICAgICBkc2lkMS5zZXRSZWwoaWQxKTsKKyAgICAgICAgRGF0YVN0b3JlQmFzaWNFbnRpdHkgZHNpZDIgPSBuZXcgRGF0YVN0b3JlQmFzaWNFbnRpdHkoKTsKKyAgICAgICAgZHNpZDIuc2V0TmFtZSgiZHNpZDIiKTsKKyAgICAgICAgZHNpZDIuc2V0UmVsKGlkMik7CisKKyAgICAgICAgTWFueU9uZUlkT3duZXIgcGFyZW50ID0gbmV3IE1hbnlPbmVJZE93bmVyKCk7CisgICAgICAgIHBhcmVudC5zZXRJZChpZDEpOworICAgICAgICBwYXJlbnQuc2V0TmFtZSgicGFyZW50Iik7CisgICAgICAgIE1hbnlPbmVJZE93bmVyIGNoaWxkID0gbmV3IE1hbnlPbmVJZE93bmVyKCk7CisgICAgICAgIGNoaWxkLnNldElkKGlkMik7CisgICAgICAgIGNoaWxkLnNldE5hbWUoImNoaWxkIik7CisgICAgICAgIHBhcmVudC5zZXRTZWxmUmVsKGNoaWxkKTsKKyAgICAgICAgRGF0YVN0b3JlTWFueU9uZUlkT3duZXIgZHNwYXJlbnQgPSBuZXcgRGF0YVN0b3JlTWFueU9uZUlkT3duZXIoKTsKKyAgICAgICAgZHNwYXJlbnQuc2V0SWQoZHNpZDEpOworICAgICAgICBkc3BhcmVudC5zZXROYW1lKCJkc3BhcmVudCIpOworICAgICAgICBEYXRhU3RvcmVNYW55T25lSWRPd25lciBkc2NoaWxkID0gbmV3IERhdGFTdG9yZU1hbnlPbmVJZE93bmVyKCk7CisgICAgICAgIGRzY2hpbGQuc2V0SWQoZHNpZDIpOworICAgICAgICBkc2NoaWxkLnNldE5hbWUoImRzY2hpbGQiKTsKKyAgICAgICAgZHNwYXJlbnQuc2V0U2VsZlJlbChkc2NoaWxkKTsKKyAgICAgICAgTWFueU9uZUNvbXBvdW5kSWRPd25lciBjcGFyZW50ID0gbmV3IE1hbnlPbmVDb21wb3VuZElkT3duZXIoKTsKKyAgICAgICAgY3BhcmVudC5zZXRFbnRpdHlJZChpZDEpOworICAgICAgICBjcGFyZW50LnNldE5hbWUoImNwYXJlbnQiKTsKKyAgICAgICAgTWFueU9uZUNvbXBvdW5kSWRPd25lciBjY2hpbGQgPSBuZXcgTWFueU9uZUNvbXBvdW5kSWRPd25lcigpOworICAgICAgICBjY2hpbGQuc2V0RW50aXR5SWQoaWQyKTsKKyAgICAgICAgY2NoaWxkLnNldE5hbWUoImNjaGlsZCIpOworICAgICAgICBjcGFyZW50LnNldFNlbGZSZWwoY2NoaWxkKTsKKworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KGlkMSk7CisgICAgICAgIGVtLnBlcnNpc3QoaWQyKTsKKyAgICAgICAgZW0ucGVyc2lzdChkc2lkMSk7CisgICAgICAgIGVtLnBlcnNpc3QoZHNpZDIpOworICAgICAgICBlbS5wZXJzaXN0KHBhcmVudCk7CisgICAgICAgIGVtLnBlcnNpc3QoY2hpbGQpOworICAgICAgICBlbS5wZXJzaXN0KGRzcGFyZW50KTsKKyAgICAgICAgZW0ucGVyc2lzdChkc2NoaWxkKTsKKyAgICAgICAgZW0ucGVyc2lzdChjcGFyZW50KTsKKyAgICAgICAgZW0ucGVyc2lzdChjY2hpbGQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBpZCA9IGlkMS5nZXRJZCgpOworICAgICAgICBhc3NlcnRSZWxhdGlvbnMoZW0sIHBhcmVudCk7CisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIG9lbSA9IChPcGVuSlBBRW50aXR5TWFuYWdlcikgZW07CisgICAgICAgIGRzaWQgPSAoTG9uZykgb2VtLmdldE9iamVjdElkKGRzaWQxKTsKKyAgICAgICAgYXNzZXJ0RGF0YVN0b3JlUmVsYXRpb25zKG9lbSwgZHNwYXJlbnQpOworICAgICAgICBjaWQgPSBjcGFyZW50LmdldExvbmdJZCgpOworICAgICAgICBhc3NlcnRDb21wb3VuZFJlbGF0aW9ucyhvZW0sIGNwYXJlbnQpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWxhdGlvbnMoRW50aXR5TWFuYWdlciBlbSwgTWFueU9uZUlkT3duZXIgcGFyZW50KSB7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgcGFyZW50LmdldE5hbWUoKSk7CisgICAgICAgIEJhc2ljRW50aXR5IGlkMSA9IHBhcmVudC5nZXRJZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGlkMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpZCwgaWQxLmdldElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlkMSIsIGlkMS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKGlkMSA9PSBlbS5maW5kKEJhc2ljRW50aXR5LmNsYXNzLCBpZCkpOworICAgICAgICBNYW55T25lSWRPd25lciBjaGlsZCA9IHBhcmVudC5nZXRTZWxmUmVsKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2hpbGQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkIiwgY2hpbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgQmFzaWNFbnRpdHkgaWQyID0gY2hpbGQuZ2V0SWQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpZDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlkMiIsIGlkMi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKGlkMiA9PSBlbS5maW5kKEJhc2ljRW50aXR5LmNsYXNzLCBpZDIuZ2V0SWQoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGlkMiA9PSBpZDEuZ2V0UmVsKCkpOworICAgICAgICBhc3NlcnRUcnVlKGlkMSA9PSBpZDIuZ2V0UmVsKCkpOworICAgICAgICBhc3NlcnROdWxsKGNoaWxkLmdldFNlbGZSZWwoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERhdGFTdG9yZVJlbGF0aW9ucyhPcGVuSlBBRW50aXR5TWFuYWdlciBlbSwgCisgICAgICAgIERhdGFTdG9yZU1hbnlPbmVJZE93bmVyIGRzcGFyZW50KSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZHNwYXJlbnQiLCBkc3BhcmVudC5nZXROYW1lKCkpOworICAgICAgICBEYXRhU3RvcmVCYXNpY0VudGl0eSBkc2lkMSA9IGRzcGFyZW50LmdldElkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZHNpZDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoZHNpZCwgKChMb25nKSBlbS5nZXRPYmplY3RJZChkc2lkMSkpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkc2lkMSIsIGRzaWQxLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZHNpZDEgPT0gZW0uZmluZChEYXRhU3RvcmVCYXNpY0VudGl0eS5jbGFzcywgZHNpZCkpOworICAgICAgICBEYXRhU3RvcmVNYW55T25lSWRPd25lciBkc2NoaWxkID0gZHNwYXJlbnQuZ2V0U2VsZlJlbCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRzY2hpbGQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRzY2hpbGQiLCBkc2NoaWxkLmdldE5hbWUoKSk7CisgICAgICAgIERhdGFTdG9yZUJhc2ljRW50aXR5IGRzaWQyID0gZHNjaGlsZC5nZXRJZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRzaWQyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkc2lkMiIsIGRzaWQyLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZHNpZDIgPT0gZW0uZmluZChEYXRhU3RvcmVCYXNpY0VudGl0eS5jbGFzcywgCisgICAgICAgICAgICBlbS5nZXRPYmplY3RJZChkc2lkMikpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkc2NoaWxkLmdldFNlbGZSZWwoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbXBvdW5kUmVsYXRpb25zKE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGVtLCAKKyAgICAgICAgTWFueU9uZUNvbXBvdW5kSWRPd25lciBjcGFyZW50KSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY3BhcmVudCIsIGNwYXJlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgQmFzaWNFbnRpdHkgaWQxID0gY3BhcmVudC5nZXRFbnRpdHlJZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGlkMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpZCwgaWQxLmdldElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlkMSIsIGlkMS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKGlkMSA9PSBlbS5maW5kKEJhc2ljRW50aXR5LmNsYXNzLCBpZCkpOworICAgICAgICBNYW55T25lQ29tcG91bmRJZE93bmVyIGNjaGlsZCA9IGNwYXJlbnQuZ2V0U2VsZlJlbCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNjaGlsZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2NoaWxkIiwgY2NoaWxkLmdldE5hbWUoKSk7CisgICAgICAgIEJhc2ljRW50aXR5IGlkMiA9IGNjaGlsZC5nZXRFbnRpdHlJZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGlkMik7CisgICAgICAgIGFzc2VydEVxdWFscygiaWQyIiwgaWQyLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoaWQyID09IGVtLmZpbmQoQmFzaWNFbnRpdHkuY2xhc3MsIGlkMi5nZXRJZCgpKSk7CisgICAgICAgIGFzc2VydE51bGwoY2NoaWxkLmdldFNlbGZSZWwoKSk7CisgICAgICAgIE1hbnlPbmVDb21wb3VuZElkT3duZXJJZCBvaWQgPSAoTWFueU9uZUNvbXBvdW5kSWRPd25lcklkKSAKKyAgICAgICAgICAgIGVtLmdldE9iamVjdElkKGNwYXJlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIG9pZC5lbnRpdHlJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJldHJpZXZlV2l0aE1hbnlPbmVJZCgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIE1hbnlPbmVJZE93bmVyIHBhcmVudCA9IGVtLmZpbmQoTWFueU9uZUlkT3duZXIuY2xhc3MsIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOworICAgICAgICBhc3NlcnRSZWxhdGlvbnMoZW0sIHBhcmVudCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJldHJpZXZlV2l0aERhdGFTdG9yZU1hbnlPbmVJZCgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIERhdGFTdG9yZU1hbnlPbmVJZE93bmVyIGRzcGFyZW50ID0gCisgICAgICAgICAgICBlbS5maW5kKERhdGFTdG9yZU1hbnlPbmVJZE93bmVyLmNsYXNzLCBkc2lkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkc3BhcmVudCk7CisgICAgICAgIGFzc2VydERhdGFTdG9yZVJlbGF0aW9ucygoT3BlbkpQQUVudGl0eU1hbmFnZXIpIGVtLCBkc3BhcmVudCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJldHJpZXZlV2l0aENvbXBvdW5kTWFueU9uZUlkKCkgeworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgTWFueU9uZUNvbXBvdW5kSWRPd25lcklkIG9pZCA9IG5ldyBNYW55T25lQ29tcG91bmRJZE93bmVySWQoKTsKKyAgICAgICAgb2lkLmVudGl0eUlkID0gaWQ7CisgICAgICAgIG9pZC5sb25nSWQgPSBjaWQ7CisgICAgICAgIE1hbnlPbmVDb21wb3VuZElkT3duZXIgY3BhcmVudCA9IAorICAgICAgICAgICAgZW0uZmluZChNYW55T25lQ29tcG91bmRJZE93bmVyLmNsYXNzLCBvaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNwYXJlbnQpOworICAgICAgICBhc3NlcnRDb21wb3VuZFJlbGF0aW9ucygoT3BlbkpQQUVudGl0eU1hbmFnZXIpIGVtLCBjcGFyZW50KTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0ZW1wdFRvQ2hhbmdlTWFueU9uZSgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIE1hbnlPbmVJZE93bmVyIHBhcmVudCA9IGVtLmZpbmQoTWFueU9uZUlkT3duZXIuY2xhc3MsIGlkKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudC5nZXRTZWxmUmVsKCkpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJlbnQuc2V0SWQocGFyZW50LmdldFNlbGZSZWwoKS5nZXRJZCgpKTsgCisgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICAgICAgZmFpbCgiU3VjY2Vzc2Z1bGx5IGNoYW5nZWQgaWQgcmVsYXRpb24uIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgaWYgKGVtLmdldFRyYW5zYWN0aW9uKCkuaXNBY3RpdmUoKSkKKyAgICAgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLnJvbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUmVsYXRpb25Ub01hbnlPbmVPd25lcigpIHsKKyAgICAgICAgQmFzaWNFbnRpdHkgaWQzID0gbmV3IEJhc2ljRW50aXR5KCk7CisgICAgICAgIGlkMy5zZXROYW1lKCJpZDMiKTsKKyAgICAgICAgTWFueU9uZUlkT3duZXIgY2hpbGQyID0gbmV3IE1hbnlPbmVJZE93bmVyKCk7CisgICAgICAgIGNoaWxkMi5zZXROYW1lKCJjaGlsZDIiKTsKKyAgICAgICAgY2hpbGQyLnNldElkKGlkMyk7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3QoaWQzKTsKKyAgICAgICAgZW0ucGVyc2lzdChjaGlsZDIpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworCisgICAgICAgIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgTWFueU9uZUlkT3duZXIgcGFyZW50ID0gZW0uZmluZChNYW55T25lSWRPd25lci5jbGFzcywgaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgcGFyZW50LnNldFNlbGZSZWwoY2hpbGQyKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIHBhcmVudCA9IGVtLmZpbmQoTWFueU9uZUlkT3duZXIuY2xhc3MsIGlkKTsKKyAgICAgICAgY2hpbGQyID0gcGFyZW50LmdldFNlbGZSZWwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZDIiLCBjaGlsZDIuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlkMy5nZXRJZCgpLCBjaGlsZDIuZ2V0SWQoKS5nZXRJZCgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUmVsYXRpb25Ub0RhdGFTdG9yZU1hbnlPbmVPd25lcigpIHsKKyAgICAgICAgRGF0YVN0b3JlQmFzaWNFbnRpdHkgZHNpZDMgPSBuZXcgRGF0YVN0b3JlQmFzaWNFbnRpdHkoKTsKKyAgICAgICAgZHNpZDMuc2V0TmFtZSgiZHNpZDMiKTsKKyAgICAgICAgRGF0YVN0b3JlTWFueU9uZUlkT3duZXIgZHNjaGlsZDIgPSBuZXcgRGF0YVN0b3JlTWFueU9uZUlkT3duZXIoKTsKKyAgICAgICAgZHNjaGlsZDIuc2V0TmFtZSgiZHNjaGlsZDIiKTsKKyAgICAgICAgZHNjaGlsZDIuc2V0SWQoZHNpZDMpOworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KGRzaWQzKTsKKyAgICAgICAgZW0ucGVyc2lzdChkc2NoaWxkMik7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBEYXRhU3RvcmVNYW55T25lSWRPd25lciBkc3BhcmVudCA9IAorICAgICAgICAgICAgZW0uZmluZChEYXRhU3RvcmVNYW55T25lSWRPd25lci5jbGFzcywgZHNpZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZHNwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGRzcGFyZW50LnNldFNlbGZSZWwoZHNjaGlsZDIpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworCisgICAgICAgIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZHNwYXJlbnQgPSBlbS5maW5kKERhdGFTdG9yZU1hbnlPbmVJZE93bmVyLmNsYXNzLCBkc2lkKTsKKyAgICAgICAgZHNjaGlsZDIgPSBkc3BhcmVudC5nZXRTZWxmUmVsKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZHNjaGlsZDIiLCBkc2NoaWxkMi5nZXROYW1lKCkpOworICAgICAgICBPcGVuSlBBRW50aXR5TWFuYWdlciBvZW0gPSAoT3BlbkpQQUVudGl0eU1hbmFnZXIpIGVtOworICAgICAgICBhc3NlcnRFcXVhbHMob2VtLmdldE9iamVjdElkKGRzaWQzKSwgb2VtLmdldE9iamVjdElkKGRzY2hpbGQyLmdldElkKCkpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUmVsYXRpb25Ub0NvbXBvdW5kTWFueU9uZU93bmVyKCkgeworICAgICAgICBCYXNpY0VudGl0eSBpZDMgPSBuZXcgQmFzaWNFbnRpdHkoKTsKKyAgICAgICAgaWQzLnNldE5hbWUoImlkMyIpOworICAgICAgICBNYW55T25lQ29tcG91bmRJZE93bmVyIGNjaGlsZDIgPSBuZXcgTWFueU9uZUNvbXBvdW5kSWRPd25lcigpOworICAgICAgICBjY2hpbGQyLnNldE5hbWUoImNjaGlsZDIiKTsKKyAgICAgICAgY2NoaWxkMi5zZXRFbnRpdHlJZChpZDMpOworICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5wZXJzaXN0KGlkMyk7CisgICAgICAgIGVtLnBlcnNpc3QoY2NoaWxkMik7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBNYW55T25lQ29tcG91bmRJZE93bmVySWQgb2lkID0gbmV3IE1hbnlPbmVDb21wb3VuZElkT3duZXJJZCgpOworICAgICAgICBvaWQuZW50aXR5SWQgPSBpZDsKKyAgICAgICAgb2lkLmxvbmdJZCA9IGNpZDsgCisgICAgICAgIE1hbnlPbmVDb21wb3VuZElkT3duZXIgY3BhcmVudCA9IGVtLmZpbmQoTWFueU9uZUNvbXBvdW5kSWRPd25lci5jbGFzcywgCisgICAgICAgICAgICBvaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGNwYXJlbnQuc2V0U2VsZlJlbChjY2hpbGQyKTsKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGNwYXJlbnQgPSBlbS5maW5kKE1hbnlPbmVDb21wb3VuZElkT3duZXIuY2xhc3MsIG9pZCk7CisgICAgICAgIGNjaGlsZDIgPSBjcGFyZW50LmdldFNlbGZSZWwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjY2hpbGQyIiwgY2NoaWxkMi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaWQzLmdldElkKCksIGNjaGlsZDIuZ2V0RW50aXR5SWQoKS5nZXRJZCgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnkoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCBlIGZyb20gTWFueU9uZUlkT3duZXIgZSAiCisgICAgICAgICAgICArICJ3aGVyZSBlLmlkLmlkID0gOmlkIik7CisgICAgICAgIHEuc2V0UGFyYW1ldGVyKCJpZCIsIGlkKTsKKyAgICAgICAgTWFueU9uZUlkT3duZXIgcGMgPSAoTWFueU9uZUlkT3duZXIpIHEuZ2V0U2luZ2xlUmVzdWx0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudCIsIHBjLmdldE5hbWUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBCYXNpY0VudGl0eSBpZDEgPSBlbS5maW5kKEJhc2ljRW50aXR5LmNsYXNzLCBpZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaWQxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZDEiLCBpZDEuZ2V0TmFtZSgpKTsKKyAgICAgICAgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgZSBmcm9tIE1hbnlPbmVJZE93bmVyIGUgd2hlcmUgZS5pZCA9IDppZCIpOworICAgICAgICBxLnNldFBhcmFtZXRlcigiaWQiLCBpZDEpOworICAgICAgICBwYyA9IChNYW55T25lSWRPd25lcikgcS5nZXRTaW5nbGVSZXN1bHQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYyk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgcGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVN0b3JlUXVlcnkoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBEYXRhU3RvcmVCYXNpY0VudGl0eSBkc2lkMSA9IGVtLmZpbmQoRGF0YVN0b3JlQmFzaWNFbnRpdHkuY2xhc3MsIGRzaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRzaWQxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkc2lkMSIsIGRzaWQxLmdldE5hbWUoKSk7CisgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IGUgZnJvbSBEYXRhU3RvcmVNYW55T25lSWRPd25lciBlICIKKyAgICAgICAgICAgICsgIndoZXJlIGUuaWQgPSA6aWQiKTsKKyAgICAgICAgcS5zZXRQYXJhbWV0ZXIoImlkIiwgZHNpZDEpOworICAgICAgICBEYXRhU3RvcmVNYW55T25lSWRPd25lciBkc3BjID0gKERhdGFTdG9yZU1hbnlPbmVJZE93bmVyKSAKKyAgICAgICAgICAgIHEuZ2V0U2luZ2xlUmVzdWx0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZHNwYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZHNwYXJlbnQiLCBkc3BjLmdldE5hbWUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBvdW5kUXVlcnkoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCBlIGZyb20gTWFueU9uZUNvbXBvdW5kSWRPd25lciBlICIKKyAgICAgICAgICAgICsgIndoZXJlIGUubG9uZ0lkID0gOmNpZCBhbmQgZS5lbnRpdHlJZC5pZCA9IDppZCIpOworICAgICAgICBxLnNldFBhcmFtZXRlcigiY2lkIiwgY2lkKTsKKyAgICAgICAgcS5zZXRQYXJhbWV0ZXIoImlkIiwgaWQpOworICAgICAgICBNYW55T25lQ29tcG91bmRJZE93bmVyIHBjID0gKE1hbnlPbmVDb21wb3VuZElkT3duZXIpcS5nZXRTaW5nbGVSZXN1bHQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3BhcmVudCIsIHBjLmdldE5hbWUoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBCYXNpY0VudGl0eSBpZDEgPSBlbS5maW5kKEJhc2ljRW50aXR5LmNsYXNzLCBpZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaWQxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZDEiLCBpZDEuZ2V0TmFtZSgpKTsKKyAgICAgICAgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgZSBmcm9tIE1hbnlPbmVDb21wb3VuZElkT3duZXIgZSAiCisgICAgICAgICAgICArICJ3aGVyZSBlLmxvbmdJZCA9IDpjaWQgYW5kIGUuZW50aXR5SWQgPSA6aWQiKTsKKyAgICAgICAgcS5zZXRQYXJhbWV0ZXIoImNpZCIsIGNpZCk7CisgICAgICAgIHEuc2V0UGFyYW1ldGVyKCJpZCIsIGlkMSk7CisgICAgICAgIHBjID0gKE1hbnlPbmVDb21wb3VuZElkT3duZXIpIHEuZ2V0U2luZ2xlUmVzdWx0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNwYXJlbnQiLCBwYy5nZXROYW1lKCkpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdFJ1bm5lci5ydW4oVGVzdE1hbnlPbmVBc0lkLmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0TXVsdGlwbGVTYW1lVHlwZWRFbWJlZGRlZFdpdGhFYWdlclJlbGF0aW9ucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL1Rlc3RNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkV2l0aEVhZ2VyUmVsYXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YTEzNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0TXVsdGlwbGVTYW1lVHlwZWRFbWJlZGRlZFdpdGhFYWdlclJlbGF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnk7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHRoYXQgcXVlcnlpbmcgYW5kIHJldHJpZXZpbmcgZW50aXRpZXMgd2l0aCBtdWx0aXBsZSBzYW1lLXR5cGVkIGVtYmVkZGVkCisgKiByZWxhdGlvbnMsIHdoaWNoIHRoZW1zZWx2ZXMgaGF2ZSBlYWdlciByZWxhdGlvbnMsIHdvcmtzLiAKKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICovCitwdWJsaWMgY2xhc3MgVGVzdE11bHRpcGxlU2FtZVR5cGVkRW1iZWRkZWRXaXRoRWFnZXJSZWxhdGlvbnMKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChFbWJlZGRhYmxlV2l0aFJlbGF0aW9uLmNsYXNzLCBNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkLmNsYXNzKTsKKworICAgICAgICBFbWJlZGRhYmxlV2l0aFJlbGF0aW9uIGVtYmVkMSA9IG5ldyBFbWJlZGRhYmxlV2l0aFJlbGF0aW9uKCk7CisgICAgICAgIGVtYmVkMS5zZXROYW1lKCJlbWJlZDEiKTsKKyAgICAgICAgRW1iZWRkYWJsZVdpdGhSZWxhdGlvbiBlbWJlZDIgPSBuZXcgRW1iZWRkYWJsZVdpdGhSZWxhdGlvbigpOworICAgICAgICBlbWJlZDIuc2V0TmFtZSgiZW1iZWQyIik7CisKKyAgICAgICAgTXVsdGlwbGVTYW1lVHlwZWRFbWJlZGRlZCBtMSA9IG5ldyBNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkKCk7CisgICAgICAgIG0xLnNldE5hbWUoIm0xIik7CisgICAgICAgIG0xLnNldEVtYmVkMShlbWJlZDEpOworICAgICAgICBtMS5zZXRFbWJlZDIoZW1iZWQyKTsKKyAgICAgICAgTXVsdGlwbGVTYW1lVHlwZWRFbWJlZGRlZCBtMiA9IG5ldyBNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkKCk7CisgICAgICAgIG0yLnNldE5hbWUoIm0yIik7CisgICAgICAgIG0yLnNldEVtYmVkMShlbWJlZDIpOworICAgICAgICBtMi5zZXRFbWJlZDIoZW1iZWQxKTsKKworICAgICAgICBlbWJlZDEuc2V0UmVsKG0xKTsKKyAgICAgICAgZW1iZWQyLnNldFJlbChtMik7CisKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChtMSk7CisgICAgICAgIGVtLnBlcnNpc3QobTIpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IG0gZnJvbSBNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkIG0gIgorICAgICAgICAgICAgKyAid2hlcmUgbS5lbWJlZDEucmVsLm5hbWUgPSAnbTEnICIKKyAgICAgICAgICAgICsgImFuZCBtLmVtYmVkMi5yZWwubmFtZSA9ICdtMiciKTsKKyAgICAgICAgTGlzdCByZXMgPSBxLmdldFJlc3VsdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5zaXplKCkpOworCisgICAgICAgIE11bHRpcGxlU2FtZVR5cGVkRW1iZWRkZWQgbSA9IChNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkKSByZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm0xIiwgbS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVtYmVkMSIsIG0uZ2V0RW1iZWQxKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtMSIsIG0uZ2V0RW1iZWQxKCkuZ2V0UmVsKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbWJlZDIiLCBtLmdldEVtYmVkMigpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibTIiLCBtLmdldEVtYmVkMigpLmdldFJlbCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKFRlc3RNdWx0aXBsZVNhbWVUeXBlZEVtYmVkZGVkV2l0aEVhZ2VyUmVsYXRpb25zLmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0VGFyZ2V0ZWRJRmFjZVJlbGF0aW9ucy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcmVsYXRpb25zL1Rlc3RUYXJnZXRlZElGYWNlUmVsYXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzZjMyMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3JlbGF0aW9ucy9UZXN0VGFyZ2V0ZWRJRmFjZVJlbGF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnJlbGF0aW9uczsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworLyoqCisgKiBQZXJmb3JtIGJhc2ljIG9wZXJhdGlvbnMgb24gYW4gZW50aXR5IHdpdGggaW50ZXJmYWNlIHJlbGF0aW9ucyB0aGF0IHVzZQorICogdGhlIHRhcmdldEVudGl0eSBhdHRyaWJ1dGUgdG8gc2V0IGEgY29uY3JldGUgcmVsYXRlZCB0eXBlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGFyZ2V0ZWRJRmFjZVJlbGF0aW9ucworICAgIGV4dGVuZHMgU2luZ2xlRU1GVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKFRhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3QoKSB7CisgICAgICAgIFRhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudCBwYXJlbnQgPSBuZXcgVGFyZ2V0ZWRJRmFjZVJlbGF0aW9uUGFyZW50KCk7CisgICAgICAgIHBhcmVudC5zZXROYW1lKCJwYXJlbnQiKTsKKyAgICAgICAgVGFyZ2V0ZWRJRmFjZVJlbGF0aW9uUGFyZW50IGNoaWxkID0gbmV3IFRhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudCgpOworICAgICAgICBjaGlsZC5zZXROYW1lKCJjaGlsZCIpOworICAgICAgICBwYXJlbnQuc2V0SUZhY2UoY2hpbGQpOworICAgICAgICAKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKyAgICAgICAgZW0ucGVyc2lzdChwYXJlbnQpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBsb25nIGlkID0gcGFyZW50LmdldElkKCk7CisgICAgICAgIGFzc2VydFRydWUoaWQgIT0gMCk7CisgICAgICAgIGVtLmNsb3NlKCk7CisKKyAgICAgICAgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBwYXJlbnQgPSBlbS5maW5kKFRhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudC5jbGFzcywgaWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgcGFyZW50LmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldElGYWNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkIiwgcGFyZW50LmdldElGYWNlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudC5jbGFzcywgCisgICAgICAgICAgICBwYXJlbnQuZ2V0SUZhY2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgoKFRhcmdldGVkSUZhY2VSZWxhdGlvblBhcmVudCkgcGFyZW50LmdldElGYWNlKCkpLgorICAgICAgICAgICAgZ2V0SUZhY2UoKSk7CisgICAgICAgIGVtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0VGFyZ2V0ZWRJRmFjZVJlbGF0aW9ucy5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9zaW1wbGUvQWxsRmllbGRUeXBlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL0FsbEZpZWxkVHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU1YmJmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL0FsbEZpZWxkVHlwZXMuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVudENvbGxlY3Rpb247CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBBbGxGaWVsZFR5cGVzIHsKKworICAgIHByaXZhdGUgc2hvcnQgc2hvcnRGaWVsZDsKKyAgICBwcml2YXRlIGludCBpbnRGaWVsZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gYm9vbGVhbkZpZWxkOworICAgIHByaXZhdGUgbG9uZyBsb25nRmllbGQ7CisgICAgcHJpdmF0ZSBmbG9hdCBmbG9hdEZpZWxkOworICAgIHByaXZhdGUgY2hhciBjaGFyRmllbGQ7CisgICAgcHJpdmF0ZSBkb3VibGUgZG91YmxlRmllbGQ7CisgICAgcHJpdmF0ZSBieXRlIGJ5dGVGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGaWVsZDsKKyAgICBwcml2YXRlIERhdGUgZGF0ZUZpZWxkOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gc2V0T2ZTdHJpbmdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgU3RyaW5nW10gYXJyYXlPZlN0cmluZ3M7CisKKyAgICBAUGVyc2lzdGVudENvbGxlY3Rpb24KKyAgICBwcml2YXRlIGludFtdIGFycmF5T2ZJbnRzOworCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRGaWVsZChzaG9ydCBzaG9ydEZpZWxkKSB7CisgICAgICAgIHRoaXMuc2hvcnRGaWVsZCA9IHNob3J0RmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFNob3J0RmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNob3J0RmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50RmllbGQoaW50IGludEZpZWxkKSB7CisgICAgICAgIHRoaXMuaW50RmllbGQgPSBpbnRGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludEZpZWxkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbnRGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuRmllbGQoYm9vbGVhbiBib29sZWFuRmllbGQpIHsKKyAgICAgICAgdGhpcy5ib29sZWFuRmllbGQgPSBib29sZWFuRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZpZWxkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ib29sZWFuRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9uZ0ZpZWxkKGxvbmcgbG9uZ0ZpZWxkKSB7CisgICAgICAgIHRoaXMubG9uZ0ZpZWxkID0gbG9uZ0ZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvbmdGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubG9uZ0ZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0RmllbGQoZmxvYXQgZmxvYXRGaWVsZCkgeworICAgICAgICB0aGlzLmZsb2F0RmllbGQgPSBmbG9hdEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdEZpZWxkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mbG9hdEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJGaWVsZChjaGFyIGNoYXJGaWVsZCkgeworICAgICAgICB0aGlzLmNoYXJGaWVsZCA9IGNoYXJGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXRDaGFyRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNoYXJGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVGaWVsZChkb3VibGUgZG91YmxlRmllbGQpIHsKKyAgICAgICAgdGhpcy5kb3VibGVGaWVsZCA9IGRvdWJsZUZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvdWJsZUZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVGaWVsZChieXRlIGJ5dGVGaWVsZCkgeworICAgICAgICB0aGlzLmJ5dGVGaWVsZCA9IGJ5dGVGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ5dGVGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdGaWVsZChTdHJpbmcgc3RyaW5nRmllbGQpIHsKKyAgICAgICAgdGhpcy5zdHJpbmdGaWVsZCA9IHN0cmluZ0ZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ0ZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGVGaWVsZChEYXRlIGRhdGVGaWVsZCkgeworICAgICAgICB0aGlzLmRhdGVGaWVsZCA9IGRhdGVGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRhdGVGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXRPZlN0cmluZ3MoU2V0PFN0cmluZz4gc2V0T2ZTdHJpbmdzKSB7CisgICAgICAgIHRoaXMuc2V0T2ZTdHJpbmdzID0gc2V0T2ZTdHJpbmdzOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTZXRPZlN0cmluZ3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNldE9mU3RyaW5nczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnJheU9mU3RyaW5ncyhTdHJpbmdbXSBhcnJheU9mU3RyaW5ncykgeworICAgICAgICB0aGlzLmFycmF5T2ZTdHJpbmdzID0gYXJyYXlPZlN0cmluZ3M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFycmF5T2ZTdHJpbmdzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcnJheU9mU3RyaW5nczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnJheU9mSW50cyhpbnRbXSBhcnJheU9mSW50cykgeworICAgICAgICB0aGlzLmFycmF5T2ZJbnRzID0gYXJyYXlPZkludHM7CisgICAgfQorCisgICAgcHVibGljIGludFtdIGdldEFycmF5T2ZJbnRzKCkgeworICAgICAgICByZXR1cm4gYXJyYXlPZkludHM7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9zaW1wbGUvTmFtZWRFbnRpdHkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9OYW1lZEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxMjkzNGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9zaW1wbGUvTmFtZWRFbnRpdHkuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5zaW1wbGU7DQorDQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsNCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uOw0KKw0KK0BFbnRpdHkobmFtZT0ibmFtZWQiKQ0KK3B1YmxpYyBjbGFzcyBOYW1lZEVudGl0eSB7DQorDQorICAgIEBJZA0KKyAgICBAR2VuZXJhdGVkVmFsdWUNCisgICAgcHJpdmF0ZSBsb25nIGlkOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KKw0KKyAgICBAVmVyc2lvbg0KKyAgICBwcml2YXRlIEludGVnZXIgb3B0TG9jazsNCisNCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7IA0KKyAgICAgICAgcmV0dXJuIGlkOyANCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IA0KKyAgICAgICAgcmV0dXJuIG5hbWU7IA0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsgDQorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9zaW1wbGUvVGVzdENhc2VJbnNlbnNpdGl2ZUtleXdvcmRzSW5KUFFMLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9zaW1wbGUvVGVzdENhc2VJbnNlbnNpdGl2ZUtleXdvcmRzSW5KUFFMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5Zjk0ZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0Q2FzZUluc2Vuc2l0aXZlS2V5d29yZHNJbkpQUUwuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5zaW1wbGU7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZUluc2Vuc2l0aXZlS2V5d29yZHNJbkpQUUwKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChBbGxGaWVsZFR5cGVzLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZUluc2Vuc2l0aXZlQm9vbGVhbnMoKSB7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisKKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSBuZXcgQWxsRmllbGRUeXBlcygpOworICAgICAgICBlbS5wZXJzaXN0KGFmdCk7CisgICAgICAgIGFmdC5zZXRCb29sZWFuRmllbGQodHJ1ZSk7CisKKyAgICAgICAgYWZ0ID0gbmV3IEFsbEZpZWxkVHlwZXMoKTsKKyAgICAgICAgZW0ucGVyc2lzdChhZnQpOworICAgICAgICBhZnQuc2V0Qm9vbGVhbkZpZWxkKGZhbHNlKTsKKworICAgICAgICBlbS5mbHVzaCgpOworCisgICAgICAgIFF1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgKKyAgICAgICAgICAgICJzZWxlY3QgY291bnQobykgZnJvbSBBbGxGaWVsZFR5cGVzIG8gd2hlcmUgby5ib29sZWFuRmllbGQgPSBUclVlIik7CisgICAgICAgIE51bWJlciBuID0gKE51bWJlcikgcS5nZXRTaW5nbGVSZXN1bHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG4uaW50VmFsdWUoKSk7CisKKyAgICAgICAgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgY291bnQobykgZnJvbSBBbGxGaWVsZFR5cGVzIG8gIgorICAgICAgICAgICAgKyAid2hlcmUgby5ib29sZWFuRmllbGQgPSBmYWxTZSIpOworICAgICAgICBuID0gKE51bWJlcikgcS5nZXRTaW5nbGVSZXN1bHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG4uaW50VmFsdWUoKSk7CisgICAgICAgIAorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLnJvbGxiYWNrKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL1Rlc3RFbnRpdHlNYW5hZ2VyQ2xlYXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0RW50aXR5TWFuYWdlckNsZWFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlZmYxYwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0RW50aXR5TWFuYWdlckNsZWFyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0LlNpbmdsZUVNVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBjYXNlIHRvIGVuc3VyZSB0aGF0IHRoZSBwcm9wZXIgSlBBIGNsZWFyIHNlbWFudGljcyBhcmUgcHJvY2Vzc2VkLgorICoKKyAqIEBhdXRob3IgS2V2aW4gU3V0dGVyCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RW50aXR5TWFuYWdlckNsZWFyCisgICAgZXh0ZW5kcyBTaW5nbGVFTVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChBbGxGaWVsZFR5cGVzLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgICAgIC8vIENyZWF0ZSBFbnRpdHlNYW5hZ2VyIGFuZCBTdGFydCBhIHRyYW5zYWN0aW9uICgxKQorICAgICAgICBiZWdpbigpOworCisgICAgICAgIC8vIEluc2VydCBhIG5ldyBvYmplY3QgYW5kIGZsdXNoCisgICAgICAgIEFsbEZpZWxkVHlwZXMgdGVzdE9iamVjdDEgPSBuZXcgQWxsRmllbGRUeXBlcygpOworICAgICAgICB0ZXN0T2JqZWN0MS5zZXRTdHJpbmdGaWVsZCgibXkgdGVzdCBvYmplY3QxIik7CisgICAgICAgIHBlcnNpc3QodGVzdE9iamVjdDEpOworICAgICAgICBlbS5mbHVzaCgpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBQQyBmb3IgbmV3IG9iamVjdCAyCisgICAgICAgIEFsbEZpZWxkVHlwZXMgdGVzdE9iamVjdDIgPSBuZXcgQWxsRmllbGRUeXBlcygpOworICAgICAgICB0ZXN0T2JqZWN0MS5zZXRTdHJpbmdGaWVsZCgibXkgdGVzdCBvYmplY3QyIik7CisgICAgICAgIHBlcnNpc3QodGVzdE9iamVjdDIpOworICAgICAgICBlbS5jbGVhcigpOworCisgICAgICAgIC8vIENvbW1pdCB0aGUgdHJhbnNhY3Rpb24gKG9ubHkgb2JqZWN0IDEgc2hvdWxkIGJlIGluIGRhdGFiYXNlKQorICAgICAgICBjb21taXQoKTsKKworICAgICAgICAvLyBTdGFydCBhIG5ldyB0cmFuc2FjdGlvbgorICAgICAgICBiZWdpbigpOworCisgICAgICAgIC8vIEF0dGVtcHQgcmV0cmlldmUgb2YgT2JqZWN0MSBmcm9tIHByZXZpb3VzIFBDIChzaG91bGQgZXhpc3QpCisgICAgICAgIGFzc2VydEVxdWFscygxLCBxdWVyeSgic2VsZWN0IHggZnJvbSBBbGxGaWVsZFR5cGVzIHggIgorICAgICAgICAgICAgKyAid2hlcmUgeC5zdHJpbmdGaWVsZCA9ICdteSB0ZXN0IG9iamVjdDEnIikuCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpLnNpemUoKSk7CisKKyAgICAgICAgLy8gQXR0ZW1wdCByZXRyaWV2ZSBvZiBPYmplY3QyIGZyb20gcHJldmlvdXMgUEMgKHNob3VsZCBub3QgZXhpc3QpCisgICAgICAgIGFzc2VydEVxdWFscygwLCBxdWVyeSgic2VsZWN0IHggZnJvbSBBbGxGaWVsZFR5cGVzIHggIgorICAgICAgICAgICAgKyAid2hlcmUgeC5zdHJpbmdGaWVsZCA9ICdteSB0ZXN0IG9iamVjdDInIikuCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpLnNpemUoKSk7CisKKyAgICAgICAgLy8gUm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGFuZCBjbG9zZSBldmVyeXRoaW5nCisgICAgICAgIHJvbGxiYWNrKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0RW50aXR5TWFuYWdlckNsZWFyLmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0RW50aXR5TWFuYWdlck1ldGhvZHNUaHJvd0FmdGVyQ2xvc2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0RW50aXR5TWFuYWdlck1ldGhvZHNUaHJvd0FmdGVyQ2xvc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTEzMGZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL1Rlc3RFbnRpdHlNYW5hZ2VyTWV0aG9kc1Rocm93QWZ0ZXJDbG9zZS5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5zaW1wbGU7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkZsdXNoTW9kZVR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTG9ja01vZGVUeXBlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1UZXN0Q2FzZTsKKworLyoqCisgKiBOZWdhdGl2ZSB0ZXN0IGNhc2UgdG8gdmVyaWZ5IHRoYXQgRW50aXR5TWFuYWdlciB0aHJvd3MgcmVxdWlyZWQgZXhjZXB0aW9ucworICogYWZ0ZXIgY2xvc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSdXNzZWxsCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RW50aXR5TWFuYWdlck1ldGhvZHNUaHJvd0FmdGVyQ2xvc2UKKyAgICBleHRlbmRzIFNpbmdsZUVNVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBBbGxGaWVsZFR5cGVzIGFmdCA9IG5ldyBBbGxGaWVsZFR5cGVzKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoQWxsRmllbGRUeXBlcy5jbGFzcyk7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0ucGVyc2lzdChhZnQpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gIiArCisgICAgICAgICAgICAgICAgICAgICJ3aGVuIGNhbGxpbmcgZW0ucGVyc2lzdCAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlQWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLm1lcmdlKGFmdCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4gY2FsbGluZyBlbS5tZXJnZSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5yZW1vdmUoYWZ0KTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLnJlbW92ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uZmluZChBbGxGaWVsZFR5cGVzLmNsYXNzLCBJbnRlZ2VyLnZhbHVlT2YoMSkpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gIiArCisgICAgICAgICAgICAgICAgICAgICJ3aGVuIGNhbGxpbmcgZW0uZmluZCAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5nZXRSZWZlcmVuY2UoQWxsRmllbGRUeXBlcy5jbGFzcywgSW50ZWdlci52YWx1ZU9mKDEpKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLmdldFJlZmVyZW5jZSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZsdXNoQWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmZsdXNoKCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4gY2FsbGluZyBlbS5mbHVzaCAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEZsdXNoTW9kZUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5zZXRGbHVzaE1vZGUoRmx1c2hNb2RlVHlwZS5BVVRPKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLnNldEZsdXNoTW9kZSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsdXNoTW9kZUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5nZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLmdldEZsdXNoTW9kZSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2tBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0ubG9jayhhZnQsIExvY2tNb2RlVHlwZS5XUklURSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4gY2FsbGluZyBlbS5sb2NrICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmcmVzaEFmdGVyQ2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5yZWZyZXNoKGFmdCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4gY2FsbGluZyBlbS5yZWZyZXNoICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uY2xlYXIoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLmNsZWFyICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uY29udGFpbnMoYWZ0KTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLmNvbnRhaW5zICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUXVlcnlBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCBPYmplY3QoYWZ0KSBGUk9NIEFsbEZpZWxkVHlwZXMgYWZ0Iik7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4gY2FsbGluZyBlbS5jcmVhdGVRdWVyeSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU5hbWVkUXVlcnlBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uY3JlYXRlTmFtZWRRdWVyeSgiTmFtZWRRdWVyeSIpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gIiArCisgICAgICAgICAgICAgICAgICAgICJ3aGVuIGNhbGxpbmcgZW0uY3JlYXRlTmFtZWRRdWVyeSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU5hdGl2ZVF1ZXJ5QWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmNyZWF0ZU5hdGl2ZVF1ZXJ5KCJTRUxFQ1QgTk9USElOSyBGUk9NIE5PQk9EWVoiKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLmNyZWF0ZU5hdGl2ZVF1ZXJ5ICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTmF0aXZlUXVlcnlXaXRoTWFwcGluZ0FmdGVyQ2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5jcmVhdGVOYXRpdmVRdWVyeSgiU0VMRUNUIE5PVEhJTksgRlJPTSBOT0JPRFlaIiwgCisgICAgICAgICAgICAgICAgICAgIEFsbEZpZWxkVHlwZXMuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gIiArCisgICAgICAgICAgICAgICAgICAgICJ3aGVuIGNhbGxpbmcgZW0uY3JlYXRlTmF0aXZlUXVlcnkgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIE1hcHBpbmcgYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm9pblRyYW5zYWN0aW9uQWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmpvaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gIiArCisgICAgICAgICAgICAgICAgICAgICJ3aGVuIGNhbGxpbmcgZW0uam9pblRyYW5zYWN0aW9uICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVsZWdhdGVBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duICIgKworICAgICAgICAgICAgICAgICAgICAid2hlbiBjYWxsaW5nIGVtLmdldERlbGVnYXRlICIgKworICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgY2FsbGluZyBlbS5jbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBZnRlckNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIHdoZW4gY2FsbGluZyBlbS5jbG9zZSAiICsKKyAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNhbGxpbmcgZW0uY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihUZXN0RW50aXR5TWFuYWdlck1ldGhvZHNUaHJvd0FmdGVyQ2xvc2UuY2xhc3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL1Rlc3RQZXJzaXN0ZW5jZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL1Rlc3RQZXJzaXN0ZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGUzMDcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9zaW1wbGUvVGVzdFBlcnNpc3RlbmNlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlOw0KKw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlUcmFuc2FjdGlvbjsNCisNCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7DQorDQorLyoqDQorICogU2ltcGxlIHRlc3QgY2FzZSB0byBnZXQgYW4gRW50aXR5TWFuYWdlciBhbmQgcGVyZm9ybSBzb21lIGJhc2ljIG9wZXJhdGlvbnMuDQorICoNCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0UGVyc2lzdGVuY2UNCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgc2V0VXAoQWxsRmllbGRUeXBlcy5jbGFzcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVudGl0eU1hbmFnZXIoKSB7DQorICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsNCisNCisgICAgICAgIEVudGl0eVRyYW5zYWN0aW9uIHQgPSBlbS5nZXRUcmFuc2FjdGlvbigpOw0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0KTsNCisgICAgICAgIHQuYmVnaW4oKTsNCisgICAgICAgIHQuc2V0Um9sbGJhY2tPbmx5KCk7DQorICAgICAgICB0LnJvbGxiYWNrKCk7DQorDQorICAgICAgICAvLyBvcGVuanBhLWZhY2FkZSB0ZXN0DQorICAgICAgICBhc3NlcnRUcnVlKGVtIGluc3RhbmNlb2YgT3BlbkpQQUVudGl0eU1hbmFnZXIpOw0KKyAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgb2plbSA9IChPcGVuSlBBRW50aXR5TWFuYWdlcikgZW07DQorICAgICAgICBvamVtLmdldEZldGNoUGxhbigpLnNldE1heEZldGNoRGVwdGgoMSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb2plbS5nZXRGZXRjaFBsYW4oKS5nZXRNYXhGZXRjaERlcHRoKCkpOw0KKyAgICAgICAgZW0uY2xvc2UoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdCgpIHsNCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOw0KKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgZW0ucGVyc2lzdChuZXcgQWxsRmllbGRUeXBlcygpKTsNCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7DQorICAgICAgICBlbS5jbG9zZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsNCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOw0KKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOw0KKyAgICAgICAgQWxsRmllbGRUeXBlcyBhZnQgPSBuZXcgQWxsRmllbGRUeXBlcygpOw0KKyAgICAgICAgYWZ0LnNldFN0cmluZ0ZpZWxkKCJmb28iKTsNCisgICAgICAgIGFmdC5zZXRJbnRGaWVsZCgxMCk7DQorICAgICAgICBlbS5wZXJzaXN0KGFmdCk7DQorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOw0KKyAgICAgICAgZW0uY2xvc2UoKTsNCisNCisgICAgICAgIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsNCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBlbS5jcmVhdGVRdWVyeQ0KKyAgICAgICAgICAgICgic2VsZWN0IHggZnJvbSBBbGxGaWVsZFR5cGVzIHggd2hlcmUgeC5zdHJpbmdGaWVsZCA9ICdmb28nIikuDQorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZW0uY3JlYXRlUXVlcnkNCisgICAgICAgICAgICAoInNlbGVjdCB4IGZyb20gQWxsRmllbGRUeXBlcyB4IHdoZXJlIHguc3RyaW5nRmllbGQgPSAnYmFyJyIpLg0KKyAgICAgICAgICAgIGdldFJlc3VsdExpc3QoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVtLmNyZWF0ZVF1ZXJ5DQorICAgICAgICAgICAgKCJzZWxlY3QgeCBmcm9tIEFsbEZpZWxkVHlwZXMgeCB3aGVyZSB4LmludEZpZWxkID49IDEwIikuDQorICAgICAgICAgICAgZ2V0UmVzdWx0TGlzdCgpLnNpemUoKSk7DQorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLnJvbGxiYWNrKCk7DQorICAgICAgICBlbS5jbG9zZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisgICAgICAgIFRlc3RSdW5uZXIucnVuKFRlc3RQZXJzaXN0ZW5jZS5jbGFzcyk7DQorICAgIH0NCit9DQorDQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvc2ltcGxlL1Rlc3RUYWJsZU5hbWVzRGVmYXVsdFRvRW50aXR5TmFtZXMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0VGFibGVOYW1lc0RlZmF1bHRUb0VudGl0eU5hbWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjYWU1YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3NpbXBsZS9UZXN0VGFibGVOYW1lc0RlZmF1bHRUb0VudGl0eU5hbWVzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2Uuc2ltcGxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc01hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdC5TaW5nbGVFTUZUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RUYWJsZU5hbWVzRGVmYXVsdFRvRW50aXR5TmFtZXMKKyAgICBleHRlbmRzIFNpbmdsZUVNRlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzZXRVcChOYW1lZEVudGl0eS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eU5hbWVzKCkgeworICAgICAgICBDbGFzc01hcHBpbmcgY20gPSAoQ2xhc3NNYXBwaW5nKSBPcGVuSlBBUGVyc2lzdGVuY2UuZ2V0TWV0YURhdGEoCisgICAgICAgICAgICBlbWYsIE5hbWVkRW50aXR5LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lZCIsIGNtLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS90ZXN0L1BlcnNpc3RlbmNlVGVzdENhc2UuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3Rlc3QvUGVyc2lzdGVuY2VUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTc2MDQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS90ZXN0L1BlcnNpc3RlbmNlVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UudGVzdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkFic3RyYWN0QnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTsKKworLyoqCisgKiBCYXNlIHRlc3QgY2xhc3MgcHJvdmlkaW5nIHBlcnNpc3RlbmNlIHV0aWxpdGllcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbmNlVGVzdENhc2UKKyAgICBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIE1hcmtlciBvYmplY3QgeW91IGFuIHBhc3MgdG8ge0BsaW5rICNzZXRVcH0gdG8gaW5kaWNhdGUgdGhhdCB0aGUKKyAgICAgKiBkYXRhYmFzZSB0YWJsZXMgc2hvdWxkIGJlIGNsZWFyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0xFQVJfVEFCTEVTID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnkuIFB1dCB7QGxpbmsgI0NMRUFSX1RBQkxFU30gaW4KKyAgICAgKiB0aGlzIGxpc3QgdG8gdGVsbCB0aGUgdGVzdCBmcmFtZXdvcmsgdG8gZGVsZXRlIGFsbCB0YWJsZSBjb250ZW50cworICAgICAqIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wcyBsaXN0IG9mIHBlcnNpc3RlbnQgdHlwZXMgdXNlZCBpbiB0ZXN0aW5nIGFuZC9vciAKKyAgICAgKiBjb25maWd1cmF0aW9uIHZhbHVlcyBpbiB0aGUgZm9ybSBrZXksdmFsdWUsa2V5LHZhbHVlLi4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBjcmVhdGVFTUYoT2JqZWN0Li4uIHByb3BzKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcChTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgTGlzdDxDbGFzcz4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOworICAgICAgICBib29sZWFuIHByb3AgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHByb3ApIHsKKyAgICAgICAgICAgICAgICBtYXAucHV0KHByb3BzW2kgLSAxXSwgcHJvcHNbaV0pOworICAgICAgICAgICAgICAgIHByb3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcHNbaV0gPT0gQ0xFQVJfVEFCTEVTKSB7CisgICAgICAgICAgICAgICAgbWFwLnB1dCgib3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3MiLAorICAgICAgICAgICAgICAgICAgICAiYnVpbGRTY2hlbWEoRm9yZWlnbktleXM9dHJ1ZSwiIAorICAgICAgICAgICAgICAgICAgICArICJTY2hlbWFBY3Rpb249J2FkZCxkZWxldGVUYWJsZUNvbnRlbnRzJykiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcHNbaV0gaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgICAgICB0eXBlcy5hZGQoKENsYXNzKSBwcm9wc1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJvcCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXR5cGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGZvciAoQ2xhc3MgYyA6IHR5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcC5wdXQoIm9wZW5qcGEuTWV0YURhdGFGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAianBhKFR5cGVzPSIgKyBidWYudG9TdHJpbmcoKSArICIpIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSkgUGVyc2lzdGVuY2UuCisgICAgICAgICAgICBjcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeSgidGVzdCIsIG1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZWx5IGNsb3NlIHRoZSBnaXZlbiBmYWN0b3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNsb3NlRU1GKEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZikgeworICAgICAgICBpZiAoZW1mID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghZW1mLmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWJzdHJhY3RCcm9rZXJGYWN0b3J5KSBPcGVuSlBBUGVyc2lzdGVuY2UKKyAgICAgICAgICAgIC50b0Jyb2tlckZhY3RvcnkoZW1mKSkuZ2V0T3BlbkJyb2tlcnMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgQnJva2VyIGIgPSAoQnJva2VyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChiICE9IG51bGwgJiYgIWIuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBPcGVuSlBBUGVyc2lzdGVuY2UudG9FbnRpdHlNYW5hZ2VyKGIpOworICAgICAgICAgICAgICAgIGlmIChlbS5nZXRUcmFuc2FjdGlvbigpLmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkucm9sbGJhY2soKTsKKyAgICAgICAgICAgICAgICBlbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZW1mLmNsb3NlKCk7CisgICAgICAgIHJldHVybiAhZW1mLmlzT3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhbGwgaW5zdGFuY2VzIG9mIHRoZSBnaXZlbiB0eXBlcyB1c2luZyBidWxrIGRlbGV0ZSBxdWVyaWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyKEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZiwgQ2xhc3MuLi4gdHlwZXMpIHsKKyAgICAgICAgaWYgKGVtZiA9PSBudWxsIHx8IHR5cGVzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIExpc3Q8Q2xhc3NNZXRhRGF0YT4gbWV0YXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzTWV0YURhdGE+KHR5cGVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoQ2xhc3MgYyA6IHR5cGVzKSB7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBPcGVuSlBBUGVyc2lzdGVuY2UuZ2V0TWV0YURhdGEoZW1mLCBjKTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGwpCisgICAgICAgICAgICAgICAgbWV0YXMuYWRkKG1ldGEpOworICAgICAgICB9CisgICAgICAgIGNsZWFyKGVtZiwgbWV0YXMudG9BcnJheShuZXcgQ2xhc3NNZXRhRGF0YVttZXRhcy5zaXplKCldKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHBlcnNpc3RlbnQgdHlwZXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBnaXZlbgorICAgICAqIGZhY3RvcnkgdXNpbmcgYnVsayBkZWxldGUgcXVlcmllcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhcihFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYpIHsKKyAgICAgICAgaWYgKGVtZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjbGVhcihlbWYsICgoT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5KSBlbWYpLmdldENvbmZpZ3VyYXRpb24oKS4KKyAgICAgICAgICAgIGdldE1ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCkuZ2V0TWV0YURhdGFzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhbGwgaW5zdGFuY2VzIG9mIHRoZSBnaXZlbiB0eXBlcyB1c2luZyBidWxrIGRlbGV0ZSBxdWVyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhcihFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYsIENsYXNzTWV0YURhdGEuLi4gdHlwZXMpIHsKKyAgICAgICAgaWYgKGVtZiA9PSBudWxsIHx8IHR5cGVzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGZvciAoQ2xhc3NNZXRhRGF0YSBtZXRhIDogdHlwZXMpIHsKKyAgICAgICAgICAgIGlmICghbWV0YS5pc01hcHBlZCgpIHx8IG1ldGEuaXNFbWJlZGRlZE9ubHkoKSAKKyAgICAgICAgICAgICAgICB8fCBNb2RpZmllci5pc0Fic3RyYWN0KG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVtLmNyZWF0ZVF1ZXJ5KCJERUxFVEUgRlJPTSAiICsgbWV0YS5nZXRUeXBlQWxpYXMoKSArICIgbyIpLgorICAgICAgICAgICAgICAgIGV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgICAgICBlbS5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW50aXR5IG5hbWUgZm9yIHRoZSBnaXZlbiB0eXBlLiAgIAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW50aXR5TmFtZShFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYsIENsYXNzIGMpIHsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gT3BlbkpQQVBlcnNpc3RlbmNlLmdldE1ldGFEYXRhKGVtZiwgYyk7CisgICAgICAgIHJldHVybiAobWV0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhLmdldFR5cGVBbGlhcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3Rlc3QvU1FMTGlzdGVuZXJUZXN0Q2FzZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvdGVzdC9TUUxMaXN0ZW5lclRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkZWJkYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3Rlc3QvU1FMTGlzdGVuZXJUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuQWJzdHJhY3RKREJDTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjLkpEQkNFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuSkRCQ0xpc3RlbmVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHRlc3RzIHRoYXQgbmVlZCB0byBjaGVjayBnZW5lcmF0ZWQgU1FMLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMaW5za2V5CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTUUxMaXN0ZW5lclRlc3RDYXNlCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHNxbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoT2JqZWN0Li4uIHByb3BzKSB7CisgICAgICAgIE9iamVjdFtdIGNvcHkgPSBuZXcgT2JqZWN0W3Byb3BzLmxlbmd0aCArIDJdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByb3BzLCAwLCBjb3B5LCAwLCBwcm9wcy5sZW5ndGgpOworICAgICAgICBjb3B5W2NvcHkubGVuZ3RoIC0gMl0gPSAib3BlbmpwYS5qZGJjLkpEQkNMaXN0ZW5lcnMiOworICAgICAgICBjb3B5W2NvcHkubGVuZ3RoIC0gMV0gPSBuZXcgSkRCQ0xpc3RlbmVyW10geyBuZXcgTGlzdGVuZXIoKSB9OworICAgICAgICBzdXBlci5zZXRVcChjb3B5KTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlybSB0aGF0IHRoZSBzcGVjaWZpZWQgU1FMIGhhcyBiZWVuIGV4ZWN1dGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNxbEV4cCB0aGUgU1FMIGV4cHJlc3Npb24uIEUuZy4sICJTRUxFQ1QgRk9PIC4qIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydFNRTChTdHJpbmcgc3FsRXhwKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHN0YXRlbWVudCA6IHNxbCkgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5tYXRjaGVzKHNxbEV4cCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmFpbCgiRXhwZWN0ZWQgcmVndWxhciBleHByZXNzaW9uIDwiICsgc3FsRXhwICsgIj4gdG8gaGF2ZSIKKyAgICAgICAgICAgICsgIiBleGlzdGVkIGluIFNRTCBzdGF0ZW1lbnRzOiAiICsgc3FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maXJtIHRoYXQgdGhlIHNwZWNpZmllZCBTUUwgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNxbEV4cCB0aGUgU1FMIGV4cHJlc3Npb24uIEUuZy4sICJTRUxFQ1QgQkFEQ09MVU1OIC4qIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdFNRTChTdHJpbmcgc3FsRXhwKSB7CisgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChTdHJpbmcgc3RhdGVtZW50IDogc3FsKSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50Lm1hdGNoZXMoc3FsRXhwKSkKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICAgIGZhaWwoIlJlZ3VsYXIgZXhwcmVzc2lvbiA8IiArIHNxbEV4cCArICI+IgorICAgICAgICAgICAgICAgICsgIiBzaG91bGQgbm90IGhhdmUgYmVlbiBleGVjdXRlZCBpbiBTUUwgc3RhdGVtZW50czogIiArIHNxbCk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIExpc3RlbmVyCisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RKREJDTGlzdGVuZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVFeGVjdXRlU3RhdGVtZW50KEpEQkNFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNRTCgpICE9IG51bGwgJiYgc3FsICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3FsLmFkZChldmVudC5nZXRTUUwoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS90ZXN0L1NpbmdsZUVNRlRlc3RDYXNlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS90ZXN0L1NpbmdsZUVNRlRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3NmU3MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3Rlc3QvU2luZ2xlRU1GVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS50ZXN0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlRU1GVGVzdENhc2UKKyAgICBleHRlbmRzIFBlcnNpc3RlbmNlVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWY7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnkuIFB1dCB7QGxpbmsgI0NMRUFSX1RBQkxFU30gaW4KKyAgICAgKiB0aGlzIGxpc3QgdG8gdGVsbCB0aGUgdGVzdCBmcmFtZXdvcmsgdG8gZGVsZXRlIGFsbCB0YWJsZSBjb250ZW50cworICAgICAqIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wcyBsaXN0IG9mIHBlcnNpc3RlbnQgdHlwZXMgdXNlZCBpbiB0ZXN0aW5nIGFuZC9vciAKKyAgICAgKiBjb25maWd1cmF0aW9uIHZhbHVlcyBpbiB0aGUgZm9ybSBrZXksdmFsdWUsa2V5LHZhbHVlLi4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoT2JqZWN0Li4uIHByb3BzKSB7CisgICAgICAgIGVtZiA9IGNyZWF0ZUVNRihwcm9wcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBpZiAoZW1mID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsZWFyKGVtZik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZUVNRihlbWYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvdGVzdC9TaW5nbGVFTVRlc3RDYXNlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS90ZXN0L1NpbmdsZUVNVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQzZDAzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvdGVzdC9TaW5nbGVFTVRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5VHJhbnNhY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQUVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFRdWVyeTsKKworLyoqCisgKiBBIGJhc2UgdGVzdCBjYXNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IHRlc3Qgc2NlbmFyaW9zIHdoZXJlIHRoZXJlCisgKiBpcyBvbmx5IGEgc2luZ2xlIEVudGl0eU1hbmFnZXIgYXQgYW55IGdpdmVuIHRpbWUuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUVNVGVzdENhc2UgCisgICAgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcChPYmplY3QuLi4gcHJvcHMpIHsKKyAgICAgICAgc3VwZXIuc2V0VXAocHJvcHMpOworICAgICAgICBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7IAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICByb2xsYmFjaygpOworICAgICAgICBjbG9zZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBTdGFydCBhIG5ldyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpc24ndCBjdXJyZW50bHkgb25lIGFjdGl2ZS4gCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiBhIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLCBmYWxzZSBpZiBvbmUgYWxyZWFkeSBleGlzdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYmVnaW4oKSB7CisgICAgICAgIEVudGl0eVRyYW5zYWN0aW9uIHR4ID0gZW0uZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKHR4LmlzQWN0aXZlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdHguYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgaWYgaXQgaXMgYWN0aXZlLiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBjb21taXR0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21taXQoKSB7CisgICAgICAgIEVudGl0eVRyYW5zYWN0aW9uIHR4ID0gZW0uZ2V0VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKCF0eC5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHR4LmNvbW1pdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogUm9sbGJhY2sgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIGlmIGl0IGlzIGFjdGl2ZS4gCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiB3YXMgcm9sbGVkIGJhY2sKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByb2xsYmFjaygpIHsKKyAgICAgICAgRW50aXR5VHJhbnNhY3Rpb24gdHggPSBlbS5nZXRUcmFuc2FjdGlvbigpOworICAgICAgICBpZiAoIXR4LmlzQWN0aXZlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdHgucm9sbGJhY2soKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENsb3NlcyB0aGUgY3VycmVudCBFbnRpdHlNYW5hZ2VyIGlmIGl0IGlzIG9wZW4uIAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIEVudGl0eU1hbmFnZXIgd2FzIGFscmVhZHkgY2xvc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNsb3NlKCkgeworICAgICAgICBpZiAoZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByb2xsYmFjaygpOworCisgICAgICAgIGlmICghZW0uaXNPcGVuKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZW0uY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuICFlbS5pc09wZW4oKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogRGVsZXRlIGFsbCBvZiB0aGUgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogSWYgbm8gdHJhbnNhY3Rpb24gaXMgcnVubmluZywgdGhlbiBvbmUgd2lsbCBiZSBzdGFydGVkIGFuZCBjb21taXR0ZWQuCisgICAgICogT3RoZXJ3aXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgdGFrZSBwbGFjZSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0Li4uIG9icykgeworICAgICAgICBib29sZWFuIHR4ID0gYmVnaW4oKTsKKyAgICAgICAgZm9yIChPYmplY3Qgb2IgOiBvYnMpCisgICAgICAgICAgICBlbS5yZW1vdmUob2IpOworICAgICAgICBpZiAodHgpIAorICAgICAgICAgICAgY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFBlcnNpc3QgYWxsIG9mIHRoZSBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBJZiBubyB0cmFuc2FjdGlvbiBpcyBydW5uaW5nLCB0aGVuIG9uZSB3aWxsIGJlIHN0YXJ0ZWQgYW5kIGNvbW1pdHRlZC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBvcGVyYXRpb24gd2lsbCB0YWtlIHBsYWNlIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBlcnNpc3QoT2JqZWN0Li4uIG9icykgeworICAgICAgICBib29sZWFuIHR4ID0gYmVnaW4oKTsKKyAgICAgICAgZm9yIChPYmplY3Qgb2IgOiBvYnMpCisgICAgICAgICAgICBlbS5wZXJzaXN0KG9iKTsKKyAgICAgICAgaWYgKHR4KSAKKyAgICAgICAgICAgIGNvbW1pdCgpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDcmVhdGVzIGEgcXVlcnkgaW4gdGhlIGN1cnJlbnQgRW50aXR5TWFuYWdlciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3BlbkpQQVF1ZXJ5IHF1ZXJ5KFN0cmluZyBzdHIpIHsKKyAgICAgICAgcmV0dXJuIGVtLmNyZWF0ZVF1ZXJ5KHN0cik7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIENyZWF0ZSBhIHF1ZXJ5IGFnYWluc3QgdGhlIHNwZWNpZmllZCBjbGFzcywgd2hpY2ggd2lsbCBiZSBhbGlhc2VkCisgICAgICogYXMgIngiLiBGb3IgZXhhbXBsZSwgcXVlcnkoUGVyc29uLmNsYXNzLCAid2hlcmUgeC5hZ2UgPSAyMSIpIHdpbGwKKyAgICAgKiBjcmVhdGUgdGhlIHF1ZXJ5ICJzZWxlY3QgeCBmcm9tIFBlcnNvbiB4IHdoZXJlIHguYWdlID0gMjEiLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gIGMgIHRoZSBjbGFzcyB0byBxdWVyeSBhZ2FpbnN0CisgICAgICogQHBhcmFtICBzdHIgIHRoZSBxdWVyeSBzdWZmaXgKKyAgICAgKiBAcGFyYW0gIHBhcmFtcyAgdGhlIHBhcmFtZXRlcnMsIGlmIGFueQorICAgICAqIEByZXR1cm4gdGhlIFF1ZXJ5IG9iamVjdAorICAgICAqLworICAgIHByb3RlY3RlZCBPcGVuSlBBUXVlcnkgcXVlcnkoQ2xhc3MgYywgU3RyaW5nIHN0ciwgT2JqZWN0Li4uIHBhcmFtcykgeworICAgICAgICBTdHJpbmcgcXVlcnkgPSAic2VsZWN0IHggZnJvbSAiICsgZW50aXR5TmFtZShlbWYsIGMpICsgIiB4ICIKKyAgICAgICAgICAgICsgKHN0ciA9PSBudWxsID8gIiIgOiBzdHIpOworICAgICAgICBPcGVuSlBBUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IHBhcmFtcyAhPSBudWxsICYmIGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBxLnNldFBhcmFtZXRlcihpICsgMSwgcGFyYW1zW2ldKTsKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmljIGNsYXNzIGluIHRoZSBkYXRhYmFzZS4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2xhc3MgdG8gZmluZAorICAgICAqIEBwYXJhbSBxIHRoZSBxdWVyeSBzdHJpbmcgc3VmZml4IHRvIHVzZQorICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVyIGxpc3QgdmFsdWUKKyAgICAgKgorICAgICAqIEBzZWUgI3F1ZXJ5KGphdmEubGFuZy5DbGFzcyxqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHByb3RlY3RlZCA8RT4gTGlzdDxFPiBmaW5kKENsYXNzPEU+IGMsIFN0cmluZyBxLCBPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5jaGVja2VkTGlzdChxdWVyeShjLCBxLCBwYXJhbXMpLmdldFJlc3VsdExpc3QoKSwgYyk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmljIGNsYXNzIGluIHRoZSBkYXRhYmFzZS4gCisgICAgICovCisgICAgcHJvdGVjdGVkIDxFPiBMaXN0PEU+IGZpbmQoQ2xhc3M8RT4gYykgeworICAgICAgICByZXR1cm4gZmluZChjLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvU2ltcGxlWG1sRW50aXR5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvU2ltcGxlWG1sRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2YTYwYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3htbC9TaW1wbGVYbWxFbnRpdHkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS54bWw7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVYbWxFbnRpdHkgeworCisgICAgcHJpdmF0ZSBsb25nIGlkOworICAgIHByaXZhdGUgaW50IHZlcnNpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRmllbGQ7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0ZpZWxkKCkgeworICAgICAgICByZXR1cm4gc3RyaW5nRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nRmllbGQoU3RyaW5nIHN0cmluZ0ZpZWxkKSB7CisgICAgICAgIHRoaXMuc3RyaW5nRmllbGQgPSBzdHJpbmdGaWVsZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvVGVzdFNpbXBsZVhtbEVudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UveG1sL1Rlc3RTaW1wbGVYbWxFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM0YTBhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UveG1sL1Rlc3RTaW1wbGVYbWxFbnRpdHkuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS54bWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuQXJndW1lbnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RTaW1wbGVYbWxFbnRpdHkKKyAgICBleHRlbmRzIFNpbmdsZUVNVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNldFVwKFNpbXBsZVhtbEVudGl0eS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcnlJblhtbE5hbWVkRW50aXR5KCkgeworICAgICAgICBlbS5jcmVhdGVOYW1lZFF1ZXJ5KCJTaW1wbGVYbWwuZmluZEFsbCIpLmdldFJlc3VsdExpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZWRRdWVyeUluWG1sVXNpbmdTaG9ydENsYXNzTmFtZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtLmNyZWF0ZU5hbWVkUXVlcnkoIlNpbXBsZVhtbEVudGl0eS5maW5kQWxsIikuZ2V0UmVzdWx0TGlzdCgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIG5vdCBiZSBhYmxlIHRvIGV4ZWN1dGUgcXVlcnkgdXNpbmcgc2hvcnQgY2xhc3MgbmFtZSAiICsKKyAgICAgICAgICAgICAgICAiZm9yIGVudGl0eSB0aGF0IGhhcyBhbiBlbnRpdHkgbmFtZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24gYWUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZWRFbnRpdHlJbkR5bmFtaWNRdWVyeSgpIHsKKyAgICAgICAgZW0uY3JlYXRlUXVlcnkoInNlbGVjdCBvIGZyb20gU2ltcGxlWG1sIG8iKS5nZXRSZXN1bHRMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNob3J0Q2xhc3NOYW1lSW5EeW5hbWljUXVlcnkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IG8gZnJvbSBTaW1wbGVYbWxFbnRpdHkgbyIpLmdldFJlc3VsdExpc3QoKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBub3QgYmUgYWJsZSB0byBleGVjdXRlIHF1ZXJ5IHVzaW5nIHNob3J0IGNsYXNzIG5hbWUgIiArCisgICAgICAgICAgICAgICAgImZvciBlbnRpdHkgdGhhdCBoYXMgYW4gZW50aXR5IG5hbWUgc3BlY2lmaWVkIik7CisgICAgICAgIH0gY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uIGFlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UveG1sL1Rlc3RYbWxPdmVycmlkZUVudGl0eS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UveG1sL1Rlc3RYbWxPdmVycmlkZUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDhiNWQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvVGVzdFhtbE92ZXJyaWRlRW50aXR5LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UueG1sOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5JbnZhbGlkU3RhdGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLnRlc3QuU2luZ2xlRU1GVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0WG1sT3ZlcnJpZGVFbnRpdHkgZXh0ZW5kcyBTaW5nbGVFTUZUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc2V0VXAoWG1sT3ZlcnJpZGVFbnRpdHkuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG9wdGlvbmFsIGF0dHJpYnV0ZSBvbiBhIGJhc2ljIGZpZWxkIGNhbiBiZSBvdmVycmlkZWQgYnkKKyAgICAgKiBhbiB4bWwgZGVzY3JpcHRvci4gCisgICAgICogCisgICAgICogWG1sT3ZlcnJpZGVFbnRpdHkubmFtZSBpcyBhbm5vdGF0ZWQgd2l0aCBvcHRpb25hbD1mYWxzZQorICAgICAqIFhtbE92ZXJyaWRlRW50aXR5LmRlc2NyaXB0aW9uIGlzIGFubm90YXRlZCB3aXRoIG9wdGlvbmFsPXRydWUuIAorICAgICAqIAorICAgICAqIFRoZSBvcHRpb25hbCBhdHRyaWJ1dGVzIGFyZSByZXZlcnNlZCBpbiBvcm0ueG1sLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uYWxBdHRyaWJ1dGVPdmVycmlkZSgpIHsKKyAgICAgICAgRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgWG1sT3ZlcnJpZGVFbnRpdHkgb3B0aW9uYWwgPSBuZXcgWG1sT3ZlcnJpZGVFbnRpdHkoKTsKKworICAgICAgICBvcHRpb25hbC5zZXROYW1lKG51bGwpOworICAgICAgICBvcHRpb25hbC5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKKworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgIGVtLnBlcnNpc3Qob3B0aW9uYWwpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CisgICAgICAgICAgICBvcHRpb25hbC5zZXREZXNjcmlwdGlvbihudWxsKTsKKyAgICAgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisgICAgICAgICAgICBmYWlsKCJYbWxPcnZlcnJpZGVFbnRpdHkuZGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBvcHRpb25hbC4gIgorICAgICAgICAgICAgICAgICAgICArICJFeHBlY3RpbmcgYW4gSW52YWxpZFN0YXRlRXhjZXB0aW9uLiIpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworICAgICAgICBlbS5yZW1vdmUoZW0uZmluZChYbWxPdmVycmlkZUVudGl0eS5jbGFzcywgb3B0aW9uYWwuZ2V0SWQoKSkpOworICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UveG1sL1htbE92ZXJyaWRlRW50aXR5LmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvWG1sT3ZlcnJpZGVFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzExMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UveG1sL1htbE92ZXJyaWRlRW50aXR5LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UueG1sOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOworCitARW50aXR5CitwdWJsaWMgY2xhc3MgWG1sT3ZlcnJpZGVFbnRpdHkgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlCisgICAgaW50IGlkOworICAgIAorICAgIEBCYXNpYyhvcHRpb25hbD1mYWxzZSkKKyAgICBTdHJpbmcgbmFtZTsKKyAgICAKKyAgICBAQmFzaWMob3B0aW9uYWw9dHJ1ZSkKKyAgICBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9IAorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmU3YjgyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxwZXJzaXN0ZW5jZSB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB2ZXJzaW9uPSIxLjAiPgorCisgICAgPHBlcnNpc3RlbmNlLXVuaXQgbmFtZT0idGVzdCI+CisgICAgICAgIDwhLS0gCisgICAgICAgIDxwcm92aWRlcj4KKyAgICAgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVByb3ZpZGVySW1wbAorICAgICAgICA8L3Byb3ZpZGVyPgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICAgICAgVGhpcyBuZWVkcyB0byBiZSBsaXN0ZWQgYmVjYXVzZSB0aGUgT3BlbkpQQSB0ZXN0IGZyYW1ld29yaworICAgICAgICAgICAgZG9lcyBub3QgcHJvdmlkZSBhbnkgb3RoZXIgbWVhbnMgdG8gaW5jcmVtZW50YWxseSBlbmhhbmNlIGNsYXNzZXMKKyAgICAgICAgICAgIGZvciBwYXJ0aWN1bGFyIHRlc3QgY2FzZXMsIGFuZCB0aGUgWE1MIGRhdGEgbXVzdCBiZSBhdmFpbGFibGUgYXQKKyAgICAgICAgICAgIGVuaGFuY2UgdGltZSBmb3IgWE1MIGRhdGEgdG8gZ2V0IGluY29ycG9yYXRlZCBpbnRvIFBDUmVnaXN0cnkuCisgICAgICAgIC0tPgorICAgICAgICA8bWFwcGluZy1maWxlPm9yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvb3JtLnhtbDwvbWFwcGluZy1maWxlPgorICAgICAgICA8IS0tCisgICAgICAgICAgICBJbiBnZW5lcmFsLCBmb3IgcGVyc2lzdGVudCB0eXBlcyB0aGF0IHVzZSBhbm5vdGF0aW9ucywgeW91IHNob3VsZAorICAgICAgICAgICAgbm90IGxpc3QgdGhlIHBlcnNpc3RlbnQgdHlwZXMgaGVyZSwgYnV0IHJhdGhlciB1c2UgdGhlCisgICAgICAgICAgICBQZXJzaXN0ZW5jZVRlc3RDYXNlLnNldFVwKE9iamVjdC4uLikgbWV0aG9kIGluIHlvdXIgdGVzdCBjYXNlJ3MKKyAgICAgICAgICAgIHNldFVwKCkgbWV0aG9kLCBwYXNzaW5nIHRoZSBDbGFzcyBvYmplY3RzIGZvciB5b3VyIHBlcnNpc3RlbnQgdHlwZXMKKyAgICAgICAgICAgIHRvIHRoYXQgbWV0aG9kLgorICAgICAgICAtLT4KKyAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBpbnN0ZWFkIHBhc3NlZCB2aWEgU3lzdGVtIHByb3BlcnRpZXMKKworICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUiCisgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkJhc2ljRGF0YVNvdXJjZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMiCisgICAgICAgICAgICAgICAgdmFsdWU9IkRyaXZlckNsYXNzTmFtZT1vcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIsVXJsPWpkYmM6ZGVyYnk6dGFyZ2V0L2RhdGFiYXNlL29wZW5qcGEtdGVzdC1kYXRhYmFzZTtjcmVhdGU9dHJ1ZSxNYXhBY3RpdmU9MTAwLE1heFdhaXQ9MTAwMDAsVGVzdE9uQm9ycm93PXRydWUiLz4KKyAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wZW5qcGEuamRiYy5TeW5jaHJvbml6ZU1hcHBpbmdzIgorICAgICAgICAgICAgICAgIHZhbHVlPSJidWlsZFNjaGVtYShGb3JlaWduS2V5cz10cnVlKSIvPgorICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9wZXJzaXN0ZW5jZS11bml0PgorPC9wZXJzaXN0ZW5jZT4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvY29tcGFuaWVzLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS1qZGJjL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbW9kZWxzL2NvbXBhbnkvY29tcGFuaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA0NDdlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9tb2RlbHMvY29tcGFueS9jb21wYW5pZXMueG1sCkBAIC0wLDAgKzEsMzM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgamF2YSBbCisgICAgPCFFTlRJVFkgcGFja2FnZSAib3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLm1vZGVscy5jb21wYW55Ij4KKyAgICA8IUVOVElUWSBmYWN0b3J5ICJvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UubW9kZWxzLmNvbXBhbnkuQ29tcGFueU1vZGVsVGVzdCI+CitdPgorPGphdmEgdmVyc2lvbj0iMS41LjBfMDYiIGNsYXNzPSJqYXZhLmJlYW5zLlhNTERlY29kZXIiPiAKKyA8b2JqZWN0IGNsYXNzPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ij4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklBZGRyZXNzLTEiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklBZGRyZXNzPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RyZWV0QWRkcmVzcyI+PHN0cmluZz4xMSBPYWsgTGFuZTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImNpdHkiPjxzdHJpbmc+U2FuIEZyYW5jaXNjbzwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InN0YXRlIj48c3RyaW5nPkNBPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icG9zdGFsQ29kZSI+PHN0cmluZz4xMTExMTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBob25lTnVtYmVyIj48c3RyaW5nPjExMS0xMTEtMTExMTwvc3RyaW5nPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklBZGRyZXNzLTIiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklBZGRyZXNzPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RyZWV0QWRkcmVzcyI+PHN0cmluZz4yMiBQaW5lIFN0cmVldDwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImNpdHkiPjxzdHJpbmc+TmV3IFlvcms8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzdGF0ZSI+PHN0cmluZz5OWTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBvc3RhbENvZGUiPjxzdHJpbmc+MjIyMjI8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJwaG9uZU51bWJlciI+PHN0cmluZz4yMjItMjIyLTIyMjI8L3N0cmluZz48L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJQWRkcmVzcy0zIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQWRkcmVzczwvY2xhc3M+CisgICAgPHZvaWQgcHJvcGVydHk9InN0cmVldEFkZHJlc3MiPjxzdHJpbmc+MzMgQ2VkYXIgQmx2ZDwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImNpdHkiPjxzdHJpbmc+QmFuZ29yPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RhdGUiPjxzdHJpbmc+TWFpbmU8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJwb3N0YWxDb2RlIj48c3RyaW5nPjMzMzMzPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icGhvbmVOdW1iZXIiPjxzdHJpbmc+MzMzLTMzMy0zMzMzPC9zdHJpbmc+PC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSUFkZHJlc3MtNCIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUFkZHJlc3M8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJzdHJlZXRBZGRyZXNzIj48c3RyaW5nPjQ0IEZpciBEcml2ZTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImNpdHkiPjxzdHJpbmc+V2FzaGluZ3Rvbjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InN0YXRlIj48c3RyaW5nPkRDPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icG9zdGFsQ29kZSI+PHN0cmluZz40NDQ0NDwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBob25lTnVtYmVyIj48c3RyaW5nPjQ0NC00NDQtNDQ0NDwvc3RyaW5nPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklBZGRyZXNzLTUiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklBZGRyZXNzPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RyZWV0QWRkcmVzcyI+PHN0cmluZz41NSBCaXJjaCBDaXJjbGU8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJjaXR5Ij48c3RyaW5nPlBvcnRsYW5kPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RhdGUiPjxzdHJpbmc+T1I8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJwb3N0YWxDb2RlIj48c3RyaW5nPjU1NTU1PC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icGhvbmVOdW1iZXIiPjxzdHJpbmc+NTU1LTU1NS01NTU1PC9zdHJpbmc+PC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSUFkZHJlc3MtNiIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUFkZHJlc3M8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJzdHJlZXRBZGRyZXNzIj48c3RyaW5nPjY2IFBhbG0gTGFuZTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImNpdHkiPjxzdHJpbmc+Qm9zdG9uPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RhdGUiPjxzdHJpbmc+TUE8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJwb3N0YWxDb2RlIj48c3RyaW5nPjY2NjY2PC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icGhvbmVOdW1iZXIiPjxzdHJpbmc+NjY2LTY2Ni02NjY2PC9zdHJpbmc+PC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSUFkZHJlc3MtNyIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUFkZHJlc3M8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJzdHJlZXRBZGRyZXNzIj48c3RyaW5nPjc3IFJlZHdvb2QgRHJpdmU8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJjaXR5Ij48c3RyaW5nPkF1c3Rpbjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InN0YXRlIj48c3RyaW5nPlRYPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icG9zdGFsQ29kZSI+PHN0cmluZz43Nzc3Nzwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBob25lTnVtYmVyIj48c3RyaW5nPjc3Ny03NzctNzc3Nzwvc3RyaW5nPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklBZGRyZXNzLTgiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklBZGRyZXNzPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RyZWV0QWRkcmVzcyI+PHN0cmluZz44OCBNYWhvZ2FueSBSb3V0ZTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImNpdHkiPjxzdHJpbmc+Q2hpY2Fnbzwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InN0YXRlIj48c3RyaW5nPklMPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icG9zdGFsQ29kZSI+PHN0cmluZz44ODg4ODwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBob25lTnVtYmVyIj48c3RyaW5nPjg4OC04ODgtODg4ODwvc3RyaW5nPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklBZGRyZXNzLTkiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklBZGRyZXNzPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RyZWV0QWRkcmVzcyI+PHN0cmluZz45OSBUZWFrIFJvYWQ8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJjaXR5Ij48c3RyaW5nPkxvcyBBbmdlbGVzPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RhdGUiPjxzdHJpbmc+Q0E8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJwb3N0YWxDb2RlIj48c3RyaW5nPjk5OTk5PC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icGhvbmVOdW1iZXIiPjxzdHJpbmc+OTk5LTk5OS05OTk5PC9zdHJpbmc+PC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSUFkZHJlc3MtMTAiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklBZGRyZXNzPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ic3RyZWV0QWRkcmVzcyI+PHN0cmluZz4xMDEwIExpbmRlbiBTdHJlZXQ8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJjaXR5Ij48c3RyaW5nPlNhbiBEaWVnbzwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InN0YXRlIj48c3RyaW5nPkNBPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icG9zdGFsQ29kZSI+PHN0cmluZz4xMDEwMTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBob25lTnVtYmVyIj48c3RyaW5nPjEwMS0wMTAtMTAxMDwvc3RyaW5nPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklBZGRyZXNzLTExIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQWRkcmVzczwvY2xhc3M+CisgICAgPHZvaWQgcHJvcGVydHk9InN0cmVldEFkZHJlc3MiPjxzdHJpbmc+MTExMSBFdWNhbHlwdHVzIEJsdmQ8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJjaXR5Ij48c3RyaW5nPkJhciBIYXJib3I8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzdGF0ZSI+PHN0cmluZz5NRTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InBvc3RhbENvZGUiPjxzdHJpbmc+MTExMTE8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJwaG9uZU51bWJlciI+PHN0cmluZz4xMTEtMTExLTExMTE8L3N0cmluZz48L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJQ29tcGFueS0xIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQ29tcGFueTwvY2xhc3M+CisgICAgPHZvaWQgcHJvcGVydHk9Im5hbWUiPjxzdHJpbmc+QUNNRSBTb2Z0d2FyZTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTEiLz48L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJQ29tcGFueS0yIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQ29tcGFueTwvY2xhc3M+CisgICAgPHZvaWQgcHJvcGVydHk9Im5hbWUiPjxzdHJpbmc+Tm8gTmFtZSBTeXN0ZW1zPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iYWRkcmVzcyI+PG9iamVjdCBpZHJlZj0iSUFkZHJlc3MtMiIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklGdWxsVGltZUVtcGxveWVlLTEiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklGdWxsVGltZUVtcGxveWVlPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0iZmlyc3ROYW1lIj48c3RyaW5nPkJvYjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9Imxhc3ROYW1lIj48c3RyaW5nPkJhbGRyaWNoPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iaG9tZUFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTMiLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzYWxhcnkiPjxmbG9hdD4xNTAwMDAuMDA8L2Zsb2F0Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InRpdGxlIj48c3RyaW5nPlByZXNpZGVudDwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImhpcmVEYXRlIj48b2JqZWN0IGNsYXNzPSJqYXZhLnV0aWwuRGF0ZSI+PGxvbmc+MDwvbG9uZz48L29iamVjdD48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJjb21wYW55Ij48b2JqZWN0IGlkcmVmPSJJQ29tcGFueS0xIi8+PC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSUZ1bGxUaW1lRW1wbG95ZWUtMiIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUZ1bGxUaW1lRW1wbG95ZWU8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJmaXJzdE5hbWUiPjxzdHJpbmc+U2FyYTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9Imxhc3ROYW1lIj48c3RyaW5nPlNhdW5kZXJzPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iaG9tZUFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTQiLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzYWxhcnkiPjxmbG9hdD4xMDAwMDAuMDA8L2Zsb2F0Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InRpdGxlIj48c3RyaW5nPkNFTzwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImhpcmVEYXRlIj48b2JqZWN0IGNsYXNzPSJqYXZhLnV0aWwuRGF0ZSI+PGxvbmc+MTAwMDAwMDAwMDAwMDwvbG9uZz48L29iamVjdD48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJtYW5hZ2VyIj48b2JqZWN0IGlkcmVmPSJJRnVsbFRpbWVFbXBsb3llZS0xIi8+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iY29tcGFueSI+PG9iamVjdCBpZHJlZj0iSUNvbXBhbnktMSIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklGdWxsVGltZUVtcGxveWVlLTMiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklGdWxsVGltZUVtcGxveWVlPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0iZmlyc3ROYW1lIj48c3RyaW5nPk1lbHZpbjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9Imxhc3ROYW1lIj48c3RyaW5nPk1lZGZpZWxkPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iaG9tZUFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTUiLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzYWxhcnkiPjxmbG9hdD43NTAwMC4wMDwvZmxvYXQ+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0idGl0bGUiPjxzdHJpbmc+UHJvZ3JhbW1lcjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImhpcmVEYXRlIj48b2JqZWN0IGNsYXNzPSJqYXZhLnV0aWwuRGF0ZSI+PGxvbmc+MTE1MDAwMDAwMDAwMDwvbG9uZz48L29iamVjdD48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJtYW5hZ2VyIj48b2JqZWN0IGlkcmVmPSJJRnVsbFRpbWVFbXBsb3llZS0xIi8+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iY29tcGFueSI+PG9iamVjdCBpZHJlZj0iSUNvbXBhbnktMSIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklQYXJ0VGltZUVtcGxveWVlLTEiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklQYXJ0VGltZUVtcGxveWVlPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0iZmlyc3ROYW1lIj48c3RyaW5nPldpbGxpYW08L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJsYXN0TmFtZSI+PHN0cmluZz5XaGlsZTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImhvbWVBZGRyZXNzIj48b2JqZWN0IGlkcmVmPSJJQWRkcmVzcy02Ii8+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0id2FnZSI+PGZsb2F0PjE1LjAwPC9mbG9hdD48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJ3ZWVrbHlIb3VycyI+PGludD4zMDwvaW50Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InRpdGxlIj48c3RyaW5nPkFkbWluaXN0cmF0aXZlIEFzc2lzdGFudDwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImhpcmVEYXRlIj48b2JqZWN0IGNsYXNzPSJqYXZhLnV0aWwuRGF0ZSI+PGxvbmc+MTE2MDAwMDAwMDAwMDwvbG9uZz48L29iamVjdD48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJtYW5hZ2VyIj48b2JqZWN0IGlkcmVmPSJJRnVsbFRpbWVFbXBsb3llZS0yIi8+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iY29tcGFueSI+PG9iamVjdCBpZHJlZj0iSUNvbXBhbnktMSIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklQcm9kdWN0LTEiIG1ldGhvZD0iY3JlYXRlIiBjbGFzcz0iJmZhY3Rvcnk7Ij4KKyAgICA8Y2xhc3M+JnBhY2thZ2U7LklQcm9kdWN0PC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0ibmFtZSI+PHN0cmluZz5Eb3dubG9hZCBBY2NlbGVyYXRvcjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InByaWNlIj48ZmxvYXQ+MTkuOTU8L2Zsb2F0Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImRpc3RyaWJ1dG9ycyI+IAorICAgICA8dm9pZCBtZXRob2Q9ImFkZCI+PG9iamVjdCBpZHJlZj0iSUNvbXBhbnktMSIvPjwvdm9pZD4gCisgICAgPC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSVByb2R1Y3QtMiIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSVByb2R1Y3Q8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJuYW1lIj48c3RyaW5nPkJyb3dzZXIgU3BpZmZlci1VcHBlcjwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InByaWNlIj48ZmxvYXQ+MzEuNTA8L2Zsb2F0Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImRpc3RyaWJ1dG9ycyI+IAorICAgICA8dm9pZCBtZXRob2Q9ImFkZCI+PG9iamVjdCBpZHJlZj0iSUNvbXBhbnktMSIvPjwvdm9pZD4gCisgICAgPC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworICA8dm9pZCBtZXRob2Q9ImFkZCI+IAorICAgPG9iamVjdCBpZD0iSVByb2R1Y3QtMyIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSVByb2R1Y3Q8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJuYW1lIj48c3RyaW5nPldlYiBBZC1Bd2F5PC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0icHJpY2UiPjxmbG9hdD4xNS4wMDwvZmxvYXQ+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iZGlzdHJpYnV0b3JzIj4gCisgICAgIDx2b2lkIG1ldGhvZD0iYWRkIj48b2JqZWN0IGlkcmVmPSJJQ29tcGFueS0xIi8+PC92b2lkPiAKKyAgICA8L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJTGluZUl0ZW0tMSIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUxpbmVJdGVtPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0icXVhbnRpdHkiPjxpbnQ+MTwvaW50Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InByb2R1Y3QiPjxvYmplY3QgaWRyZWY9IklQcm9kdWN0LTEiLz48L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJTGluZUl0ZW0tMiIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUxpbmVJdGVtPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0icXVhbnRpdHkiPjxpbnQ+MjwvaW50Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InByb2R1Y3QiPjxvYmplY3QgaWRyZWY9IklQcm9kdWN0LTEiLz48L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJTGluZUl0ZW0tMyIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUxpbmVJdGVtPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0icXVhbnRpdHkiPjxpbnQ+MzwvaW50Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InByb2R1Y3QiPjxvYmplY3QgaWRyZWY9IklQcm9kdWN0LTIiLz48L3ZvaWQ+IAorICAgPC9vYmplY3Q+IAorICA8L3ZvaWQ+IAorCisgIDx2b2lkIG1ldGhvZD0iYWRkIj4gCisgICA8b2JqZWN0IGlkPSJJQ3VzdG9tZXItMSIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSUN1c3RvbWVyPC9jbGFzcz4KKyAgICA8dm9pZCBwcm9wZXJ0eT0iZmlyc3ROYW1lIj48c3RyaW5nPkVtaWx5PC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ibGFzdE5hbWUiPjxzdHJpbmc+RWFzdG9uPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iaG9tZUFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTciLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzaGlwcGluZ0FkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTciLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJiaWxsaW5nQWRkcmVzcyI+PG9iamVjdCBpZHJlZj0iSUFkZHJlc3MtNyIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklDdXN0b21lci0yIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQ3VzdG9tZXI8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJmaXJzdE5hbWUiPjxzdHJpbmc+TWFyY3VzPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ibGFzdE5hbWUiPjxzdHJpbmc+TXVycmF5PC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iaG9tZUFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTgiLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJzaGlwcGluZ0FkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTgiLz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJiaWxsaW5nQWRkcmVzcyI+PG9iamVjdCBpZHJlZj0iSUFkZHJlc3MtOCIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklDdXN0b21lci0zIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQ3VzdG9tZXI8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJmaXJzdE5hbWUiPjxzdHJpbmc+T3Jzb248L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJsYXN0TmFtZSI+PHN0cmluZz5PJ0ZhcnJlbGw8L3N0cmluZz48L3ZvaWQ+IAorICAgIDx2b2lkIHByb3BlcnR5PSJob21lQWRkcmVzcyI+PG9iamVjdCBpZHJlZj0iSUFkZHJlc3MtOSIvPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9InNoaXBwaW5nQWRkcmVzcyI+PG9iamVjdCBpZHJlZj0iSUFkZHJlc3MtOSIvPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImJpbGxpbmdBZGRyZXNzIj48b2JqZWN0IGlkcmVmPSJJQWRkcmVzcy0xMCIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklDdXN0b21lci0zIiBtZXRob2Q9ImNyZWF0ZSIgY2xhc3M9IiZmYWN0b3J5OyI+CisgICAgPGNsYXNzPiZwYWNrYWdlOy5JQ3VzdG9tZXI8L2NsYXNzPgorICAgIDx2b2lkIHByb3BlcnR5PSJmaXJzdE5hbWUiPjxzdHJpbmc+QW5keTwvc3RyaW5nPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9Imxhc3ROYW1lIj48c3RyaW5nPkFuZGVyc29uPC9zdHJpbmc+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iaG9tZUFkZHJlc3MiPjxvYmplY3QgaWRyZWY9IklBZGRyZXNzLTExIi8+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ic2hpcHBpbmdBZGRyZXNzIj48b2JqZWN0IGlkcmVmPSJJQWRkcmVzcy0xMSIvPjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImJpbGxpbmdBZGRyZXNzIj48b2JqZWN0IGlkcmVmPSJJQWRkcmVzcy0xMSIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklQcm9kdWN0T3JkZXItMSIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSVByb2R1Y3RPcmRlcjwvY2xhc3M+CisgICAgPHZvaWQgcHJvcGVydHk9Im9yZGVyRGF0ZSI+PG9iamVjdCBjbGFzcz0iamF2YS51dGlsLkRhdGUiPjxsb25nPjExNzAwMDAwMDAwMDA8L2xvbmc+PC9vYmplY3Q+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0ic2hpcHBlZERhdGUiPjxvYmplY3QgY2xhc3M9ImphdmEudXRpbC5EYXRlIj48bG9uZz4xMTgwMDAwMDAwMDAwPC9sb25nPjwvb2JqZWN0Pjwvdm9pZD4gCisgICAgPHZvaWQgcHJvcGVydHk9ImN1c3RvbWVyIj48b2JqZWN0IGlkcmVmPSJJQ3VzdG9tZXItMSIvPjwvdm9pZD4gCisgICA8L29iamVjdD4gCisgIDwvdm9pZD4gCisKKyAgPHZvaWQgbWV0aG9kPSJhZGQiPiAKKyAgIDxvYmplY3QgaWQ9IklQcm9kdWN0T3JkZXItMiIgbWV0aG9kPSJjcmVhdGUiIGNsYXNzPSImZmFjdG9yeTsiPgorICAgIDxjbGFzcz4mcGFja2FnZTsuSVByb2R1Y3RPcmRlcjwvY2xhc3M+CisgICAgPHZvaWQgcHJvcGVydHk9Im9yZGVyRGF0ZSI+PG9iamVjdCBjbGFzcz0iamF2YS51dGlsLkRhdGUiPjxsb25nPjExOTAwMDAwMDAwMDA8L2xvbmc+PC9vYmplY3Q+PC92b2lkPiAKKyAgICA8dm9pZCBwcm9wZXJ0eT0iY3VzdG9tZXIiPjxvYmplY3QgaWRyZWY9IklDdXN0b21lci0yIi8+PC92b2lkPiAKKyAgIDwvb2JqZWN0PiAKKyAgPC92b2lkPiAKKworIDwvb2JqZWN0PiAKKzwvamF2YT4gCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2UtamRiYy9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3htbC9vcm0ueG1sIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvb3JtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRmNzBlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlLWpkYmMvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS94bWwvb3JtLnhtbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIG9ybV8xXzAueHNkIgorICAgIHZlcnNpb249IjEuMCI+CisgICAgPHBhY2thZ2U+CisgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS54bWwKKyAgICA8L3BhY2thZ2U+CisgICAgPGVudGl0eSBuYW1lPSJTaW1wbGVYbWwiIGNsYXNzPSJTaW1wbGVYbWxFbnRpdHkiPgorICAgICAgICA8bmFtZWQtcXVlcnkgbmFtZT0iU2ltcGxlWG1sLmZpbmRBbGwiPgorICAgICAgICAgICAgPHF1ZXJ5PnNlbGVjdCBvIGZyb20gU2ltcGxlWG1sIG88L3F1ZXJ5PgorICAgICAgICA8L25hbWVkLXF1ZXJ5PgorICAgICAgICA8bmFtZWQtcXVlcnkgbmFtZT0iU2ltcGxlWG1sRW50aXR5LmZpbmRBbGwiPgorICAgICAgICAgICAgPHF1ZXJ5PnNlbGVjdCBvIGZyb20gU2ltcGxlWG1sRW50aXR5IG88L3F1ZXJ5PgorICAgICAgICA8L25hbWVkLXF1ZXJ5PgorICAgICAgICA8YXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxpZCBuYW1lPSJpZCIvPgorICAgICAgICAgICAgPGJhc2ljIG5hbWU9InN0cmluZ0ZpZWxkIi8+CisgICAgICAgICAgICA8dmVyc2lvbiBuYW1lPSJ2ZXJzaW9uIi8+CisgICAgICAgIDwvYXR0cmlidXRlcz4KKyAgICA8L2VudGl0eT4KKyAgICA8ZW50aXR5IG5hbWU9IlhtbE92ZXJyaWRlIiBjbGFzcz0iWG1sT3ZlcnJpZGVFbnRpdHkiPgorICAgIAk8YXR0cmlidXRlcz4KKwkgICAgPGJhc2ljIG5hbWU9Im5hbWUiIG9wdGlvbmFsPSJ0cnVlIj48L2Jhc2ljPgorCSAgICA8YmFzaWMgbmFtZT0iZGVzY3JpcHRpb24iIG9wdGlvbmFsPSJmYWxzZSI+PC9iYXNpYz4KKyAgICAJPC9hdHRyaWJ1dGVzPgorICAgIDwvZW50aXR5PgorPC9lbnRpdHktbWFwcGluZ3M+CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9wb20ueG1sIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMzA0OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9wb20ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtcGVyc2lzdGVuY2U8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5PcGVuSlBBIEpQQTwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+T3BlbkpQQSBKUEE8L2Rlc2NyaXB0aW9uPgorICAgIDx1cmw+aHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3Byb2plY3RzL29wZW5qcGE8L3VybD4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEta2VybmVsLTU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qcGFfMy4wX3NwZWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Bbm5vdGF0aW9uUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0Fubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhYjRmMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Bbm5vdGF0aW9uUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTYyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNhc2NhZGVUeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWRJZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TGlzdGVuZXJzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkZldGNoVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GbHVzaE1vZGVUeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRpb25UeXBlOworaW1wb3J0IHN0YXRpYyBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0aW9uVHlwZS5BVVRPOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkQ2xhc3M7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTG9iOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcmllczsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcmllczsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBvc3RMb2FkOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBvc3RQZXJzaXN0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBvc3RSZW1vdmU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUG9zdFVwZGF0ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmVQZXJzaXN0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlByZVJlbW92ZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmVVcGRhdGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnlIaW50OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuQmVhbkxpZmVjeWNsZUNhbGxiYWNrczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlQ2FsbGJhY2tzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTWV0aG9kTGlmZWN5Y2xlQ2FsbGJhY2tzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUXVlcnlMYW5ndWFnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5qcHFsLkpQUUxQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkphdmFUeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5MaWZlY3ljbGVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFNb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuUXVlcnlNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlVwZGF0ZVN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5WYWx1ZVN0cmF0ZWdpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFEZWZhdWx0czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk1ldGFEYXRhVGFnLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBzZXJwLnV0aWwuTnVtYmVyczsKK2ltcG9ydCBzZXJwLnV0aWwuU3RyaW5nczsKKworLyoqCisgKiBQZXJzaXN0ZW5jZSBhbm5vdGF0aW9uIG1ldGFkYXRhIHBhcnNlci4gQ3VycmVudGx5IGRvZXMgbm90IHBhcnNlCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIKKyAgICBpbXBsZW1lbnRzIE1ldGFEYXRhTW9kZXMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBNZXRhRGF0YVRhZz4gX3RhZ3MgPQorICAgICAgICBuZXcgSGFzaE1hcDxDbGFzcywgTWV0YURhdGFUYWc+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBfdGFncy5wdXQoRW1iZWRkZWRJZC5jbGFzcywgRU1CRURERURfSUQpOworICAgICAgICBfdGFncy5wdXQoRW50aXR5TGlzdGVuZXJzLmNsYXNzLCBFTlRJVFlfTElTVEVORVJTKTsKKyAgICAgICAgX3RhZ3MucHV0KEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzLmNsYXNzLCBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTKTsKKyAgICAgICAgX3RhZ3MucHV0KEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzLmNsYXNzLAorICAgICAgICAgICAgRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyk7CisgICAgICAgIF90YWdzLnB1dChGbHVzaE1vZGVUeXBlLmNsYXNzLCBGTFVTSF9NT0RFKTsKKyAgICAgICAgX3RhZ3MucHV0KEdlbmVyYXRlZFZhbHVlLmNsYXNzLCBHRU5FUkFURURfVkFMVUUpOworICAgICAgICBfdGFncy5wdXQoSWQuY2xhc3MsIElEKTsKKyAgICAgICAgX3RhZ3MucHV0KElkQ2xhc3MuY2xhc3MsIElEX0NMQVNTKTsKKyAgICAgICAgX3RhZ3MucHV0KE1hcEtleS5jbGFzcywgTUFQX0tFWSk7CisgICAgICAgIF90YWdzLnB1dChOYW1lZE5hdGl2ZVF1ZXJpZXMuY2xhc3MsIE5BVElWRV9RVUVSSUVTKTsKKyAgICAgICAgX3RhZ3MucHV0KE5hbWVkTmF0aXZlUXVlcnkuY2xhc3MsIE5BVElWRV9RVUVSWSk7CisgICAgICAgIF90YWdzLnB1dChOYW1lZFF1ZXJpZXMuY2xhc3MsIFFVRVJJRVMpOworICAgICAgICBfdGFncy5wdXQoTmFtZWRRdWVyeS5jbGFzcywgUVVFUlkpOworICAgICAgICBfdGFncy5wdXQoT3JkZXJCeS5jbGFzcywgT1JERVJfQlkpOworICAgICAgICBfdGFncy5wdXQoUG9zdExvYWQuY2xhc3MsIFBPU1RfTE9BRCk7CisgICAgICAgIF90YWdzLnB1dChQb3N0UGVyc2lzdC5jbGFzcywgUE9TVF9QRVJTSVNUKTsKKyAgICAgICAgX3RhZ3MucHV0KFBvc3RSZW1vdmUuY2xhc3MsIFBPU1RfUkVNT1ZFKTsKKyAgICAgICAgX3RhZ3MucHV0KFBvc3RVcGRhdGUuY2xhc3MsIFBPU1RfVVBEQVRFKTsKKyAgICAgICAgX3RhZ3MucHV0KFByZVBlcnNpc3QuY2xhc3MsIFBSRV9QRVJTSVNUKTsKKyAgICAgICAgX3RhZ3MucHV0KFByZVJlbW92ZS5jbGFzcywgUFJFX1JFTU9WRSk7CisgICAgICAgIF90YWdzLnB1dChQcmVVcGRhdGUuY2xhc3MsIFBSRV9VUERBVEUpOworICAgICAgICBfdGFncy5wdXQoU2VxdWVuY2VHZW5lcmF0b3IuY2xhc3MsIFNFUV9HRU5FUkFUT1IpOworICAgICAgICBfdGFncy5wdXQoVmVyc2lvbi5jbGFzcywgVkVSU0lPTik7CisgICAgICAgIF90YWdzLnB1dChEYXRhQ2FjaGUuY2xhc3MsIERBVEFfQ0FDSEUpOworICAgICAgICBfdGFncy5wdXQoRGF0YVN0b3JlSWQuY2xhc3MsIERBVEFTVE9SRV9JRCk7CisgICAgICAgIF90YWdzLnB1dChEZXBlbmRlbnQuY2xhc3MsIERFUEVOREVOVCk7CisgICAgICAgIF90YWdzLnB1dChEZXRhY2hlZFN0YXRlLmNsYXNzLCBERVRBQ0hFRF9TVEFURSk7CisgICAgICAgIF90YWdzLnB1dChFbGVtZW50RGVwZW5kZW50LmNsYXNzLCBFTEVNX0RFUEVOREVOVCk7CisgICAgICAgIF90YWdzLnB1dChFbGVtZW50VHlwZS5jbGFzcywgRUxFTV9UWVBFKTsKKyAgICAgICAgX3RhZ3MucHV0KEV4dGVybmFsVmFsdWVzLmNsYXNzLCBFWFRFUk5BTF9WQUxTKTsKKyAgICAgICAgX3RhZ3MucHV0KEV4dGVybmFsaXplci5jbGFzcywgRVhURVJOQUxJWkVSKTsKKyAgICAgICAgX3RhZ3MucHV0KEZhY3RvcnkuY2xhc3MsIEZBQ1RPUlkpOworICAgICAgICBfdGFncy5wdXQoRmV0Y2hHcm91cC5jbGFzcywgRkVUQ0hfR1JPVVApOworICAgICAgICBfdGFncy5wdXQoRmV0Y2hHcm91cHMuY2xhc3MsIEZFVENIX0dST1VQUyk7CisgICAgICAgIF90YWdzLnB1dChJbnZlcnNlTG9naWNhbC5jbGFzcywgSU5WRVJTRV9MT0dJQ0FMKTsKKyAgICAgICAgX3RhZ3MucHV0KEtleURlcGVuZGVudC5jbGFzcywgS0VZX0RFUEVOREVOVCk7CisgICAgICAgIF90YWdzLnB1dChLZXlUeXBlLmNsYXNzLCBLRVlfVFlQRSk7CisgICAgICAgIF90YWdzLnB1dChMb2FkRmV0Y2hHcm91cC5jbGFzcywgTE9BRF9GRVRDSF9HUk9VUCk7CisgICAgICAgIF90YWdzLnB1dChMUlMuY2xhc3MsIExSUyk7CisgICAgICAgIF90YWdzLnB1dChSZWFkT25seS5jbGFzcywgUkVBRF9PTkxZKTsKKyAgICAgICAgX3RhZ3MucHV0KFR5cGUuY2xhc3MsIFRZUEUpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgT3BlbkpQQUNvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgX2xvZzsKKyAgICBwcml2YXRlIE1ldGFEYXRhUmVwb3NpdG9yeSBfcmVwb3MgPSBudWxsOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2VudkxvYWRlciA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9vdmVycmlkZSA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IF9tb2RlID0gTU9ERV9OT05FOworCisgICAgLy8gcGFja2FnZXMgYW5kIHRoZWlyIHBhcnNlIG1vZGVzCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UGFja2FnZSwgSW50ZWdlcj4gX3BrZ3MgPSBuZXcgSGFzaE1hcDxQYWNrYWdlLCBJbnRlZ2VyPigpOworCisgICAgLy8gdGhlIGNsYXNzIHdlIHdlcmUgaW52b2tlZCB0byBwYXJzZQorICAgIHByaXZhdGUgQ2xhc3MgX2NscyA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIF9maWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIoT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgICAgIF9sb2cgPSBjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfTUVUQURBVEEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gc3VwcGxpZWQgb24gY29uc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2NvbmY7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0YWRhdGEgbG9nLgorICAgICAqLworICAgIHB1YmxpYyBMb2cgZ2V0TG9nKCkgeworICAgICAgICByZXR1cm4gX2xvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IGZvciB0aGlzIHBhcnNlci4gSWYgbm9uZSBoYXMgYmVlbiBzZXQsCisgICAgICogY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkgYW5kIHNldHMgaXQuCisgICAgICovCisgICAgcHVibGljIE1ldGFEYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgeworICAgICAgICBpZiAoX3JlcG9zID09IG51bGwpIHsKKyAgICAgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcyA9IF9jb25mLm5ld01ldGFEYXRhUmVwb3NpdG9yeUluc3RhbmNlKCk7CisgICAgICAgICAgICBNZXRhRGF0YUZhY3RvcnkgbWRmID0gcmVwb3MuZ2V0TWV0YURhdGFGYWN0b3J5KCk7CisgICAgICAgICAgICBpZiAobWRmIGluc3RhbmNlb2YgRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeSkKKyAgICAgICAgICAgICAgICBtZGYgPSAoKERlbGVnYXRpbmdNZXRhRGF0YUZhY3RvcnkpIG1kZikuZ2V0SW5uZXJtb3N0RGVsZWdhdGUoKTsKKyAgICAgICAgICAgIGlmIChtZGYgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZU1ldGFEYXRhRmFjdG9yeSkKKyAgICAgICAgICAgICAgICAoKFBlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5KSBtZGYpLnNldEFubm90YXRpb25QYXJzZXIodGhpcyk7CisgICAgICAgICAgICBfcmVwb3MgPSByZXBvczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3JlcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgX3JlcG9zID0gcmVwb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbnZpcm9ubWVudGFsIGNsYXNzIGxvYWRlciB0byBwYXNzIG9uIHRvIHBhcnNlZAorICAgICAqIG1ldGFkYXRhIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0RW52Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBfZW52TG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW52aXJvbm1lbnRhbCBjbGFzcyBsb2FkZXIgdG8gcGFzcyBvbiB0byBwYXJzZWQKKyAgICAgKiBtZXRhZGF0YSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW52Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIF9lbnZMb2FkZXIgPSBsb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbGxvdyBsYXRlciBwYXJzZXMgb2YgbWFwcGluZyBpbmZvcm1hdGlvbiB0byBvdmVycmlkZQorICAgICAqIGVhcmxpZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzYW1lIGNsYXNzLiBEZWZhdWx0cyB0byBmYWxzZS4gVXNlZnVsCisgICAgICogd2hlbiBhIHRvb2wgaXMgbWFwcGluZyBhIGNsYXNzLCBzbyB0aGF0IGFubm90YXRpb24gcGFydGlhbCBtYXBwaW5nCisgICAgICogaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgZXZlbiB3aGVuIG1hcHBpbmdzIGFyZSBzdG9yZWQgaW4gYW5vdGhlcgorICAgICAqIGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE1hcHBpbmdPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuIF9vdmVycmlkZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsbG93IGxhdGVyIHBhcnNlcyBvZiBtYXBwaW5nIGluZm9ybWF0aW9uIHRvIG92ZXJyaWRlCisgICAgICogZWFybGllciBpbmZvcm1hdGlvbiBmb3IgdGhlIHNhbWUgY2xhc3MuIERlZmF1bHRzIHRvIGZhbHNlLiBVc2VmdWwKKyAgICAgKiB3aGVuIGEgdG9vbCBpcyBtYXBwaW5nIGEgY2xhc3MsIHNvIHRoYXQgYW5ub3RhdGlvbiBwYXJ0aWFsIG1hcHBpbmcKKyAgICAgKiBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCBldmVuIHdoZW4gbWFwcGluZ3MgYXJlIHN0b3JlZCBpbiBhbm90aGVyCisgICAgICogbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGluZ092ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKyAgICAgICAgX292ZXJyaWRlID0gb3ZlcnJpZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBhcnNlIG1vZGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RlKCkgeworICAgICAgICByZXR1cm4gX21vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBhcnNlIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAobW9kZSA9PSBNT0RFX05PTkUpCisgICAgICAgICAgICBfbW9kZSA9IE1PREVfTk9ORTsKKyAgICAgICAgZWxzZSBpZiAob24pCisgICAgICAgICAgICBfbW9kZSB8PSBtb2RlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfbW9kZSAmPSB+bW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyc2UgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlKSB7CisgICAgICAgIF9tb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGludGVycHJldGluZyB7QGxpbmsgI2dldE1vZGV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWV0YURhdGFNb2RlKCkgeworICAgICAgICByZXR1cm4gKF9tb2RlICYgTU9ERV9NRVRBKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNRdWVyeU1vZGUoKSB7CisgICAgICAgIHJldHVybiAoX21vZGUgJiBNT0RFX1FVRVJZKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXBwaW5nTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIChfbW9kZSAmIE1PREVfTUFQUElORykgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgd2UncmUgaW4gbWFwcGluZyBtb2RlIG9yIGluIG1ldGFkYXRhIG1vZGUgd2l0aAorICAgICAqIG1hcHBpbmcgb3ZlcmlkZSBlbmFibGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzTWFwcGluZ01vZGUoKSB8fCAoX292ZXJyaWRlICYmIGlzTWV0YURhdGFNb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGNhY2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX2NscyA9IG51bGw7CisgICAgICAgIF9maWxlID0gbnVsbDsKKyAgICAgICAgX3BrZ3MuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKENsYXNzIGNscykgeworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGFyc2UtY2xhc3MiLCBjbHMuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgX2NscyA9IGNsczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlUGFja2FnZUFubm90YXRpb25zKCk7CisgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBwYXJzZUNsYXNzQW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgIHVwZGF0ZVNvdXJjZU1vZGUobWV0YSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfY2xzID0gbnVsbDsKKyAgICAgICAgICAgIF9maWxlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc291cmNlIG1vZGUgdG8gdGhlIGNsYXNzIHBhY2thZ2UgYW5kIGNsYXNzIHRvIGluZGljYXRlIHRoYXQKKyAgICAgKiB3ZSd2ZSBmdWxseSBwYXJzZWQgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU291cmNlTW9kZShDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKF9jbHMuZ2V0UGFja2FnZSgpICE9IG51bGwpCisgICAgICAgICAgICBhZGRTb3VyY2VNb2RlKF9jbHMuZ2V0UGFja2FnZSgpLCBfbW9kZSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGwpCisgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoX21vZGUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGluZm9ybWF0aW9uIGluIHBhY2thZ2UtbGV2ZWwgY2xhc3MgYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZUFubm90YXRpb25zKCkgeworICAgICAgICBQYWNrYWdlIHBrZyA9IF9jbHMuZ2V0UGFja2FnZSgpOworICAgICAgICBpZiAocGtnID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IHBrZ01vZGUgPSBnZXRTb3VyY2VNb2RlKHBrZyk7CisgICAgICAgIGlmIChwa2dNb2RlID09IDAgJiYgX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGFyc2UtcGFja2FnZSIsIF9jbHMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGlmICgocGtnTW9kZSAmIF9tb2RlKSA9PSBfbW9kZSkgLy8gYWxyZWFkeSB2aXNpdGVkCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTWV0YURhdGFUYWcgdGFnOworICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ubyA6IHBrZy5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIHRhZyA9IF90YWdzLmdldChhbm5vLmFubm90YXRpb25UeXBlKCkpOworICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlVW5rbm93blBhY2thZ2VBbm5vdGF0aW9uKHBrZywgYW5ubyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOQVRJVkVfUVVFUklFUzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUXVlcnlNb2RlKCkgJiYgKHBrZ01vZGUgJiBNT0RFX1FVRVJZKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VOYW1lZE5hdGl2ZVF1ZXJpZXMocGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTmFtZWROYXRpdmVRdWVyaWVzKSBhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOQVRJVkVfUVVFUlk6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJ5TW9kZSgpICYmIChwa2dNb2RlICYgTU9ERV9RVUVSWSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTmFtZWROYXRpdmVRdWVyaWVzKHBrZywgKE5hbWVkTmF0aXZlUXVlcnkpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJJRVM6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJ5TW9kZSgpICYmIChwa2dNb2RlICYgTU9ERV9RVUVSWSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTmFtZWRRdWVyaWVzKHBrZywgKChOYW1lZFF1ZXJpZXMpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNRdWVyeU1vZGUoKSAmJiAocGtnTW9kZSAmIE1PREVfUVVFUlkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5hbWVkUXVlcmllcyhwa2csIChOYW1lZFF1ZXJ5KSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVFfR0VORVJBVE9SOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwa2dNb2RlICYgTU9ERV9NQVBQSU5HKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VTZXF1ZW5jZUdlbmVyYXRvcihwa2csIChTZXF1ZW5jZUdlbmVyYXRvcikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgidW5zdXBwb3J0ZWQiLCBwa2csCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsd2F5cyBwYXJzZSBtYXBwaW5nIHN0dWZmIGFmdGVyIG1ldGFkYXRhIHN0dWZmLCBpbiBjYXNlIHRoZXJlIGFyZQorICAgICAgICAvLyBkZXBlbmRlbmNpZXMgb24gbWV0YWRhdGEKKyAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpICYmIChwa2dNb2RlICYgTU9ERV9NQVBQSU5HKSA9PSAwKQorICAgICAgICAgICAgcGFyc2VQYWNrYWdlTWFwcGluZ0Fubm90YXRpb25zKHBrZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgcGFja2FnZSBtYXBwaW5nIGFubm90YXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlUGFja2FnZU1hcHBpbmdBbm5vdGF0aW9ucyhQYWNrYWdlIHBrZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHN1YmNsYXNzZXMgdG8gaGFuZGxlIHVua25vd24gYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVW5rbm93blBhY2thZ2VBbm5vdGF0aW9uKFBhY2thZ2UgcGtnLAorICAgICAgICBBbm5vdGF0aW9uIGFubm8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgbW9kZSBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0U291cmNlTW9kZShQYWNrYWdlIHBrZykgeworICAgICAgICBOdW1iZXIgbnVtID0gX3BrZ3MuZ2V0KHBrZyk7CisgICAgICAgIHJldHVybiAobnVtID09IG51bGwpID8gMCA6IG51bS5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0byB0aGUgc291cmNlIG1vZGUgZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTb3VyY2VNb2RlKFBhY2thZ2UgcGtnLCBpbnQgbW9kZSkgeworICAgICAgICBJbnRlZ2VyIG51bSA9IF9wa2dzLmdldChwa2cpOworICAgICAgICBpZiAobnVtID09IG51bGwpCisgICAgICAgICAgICBudW0gPSBOdW1iZXJzLnZhbHVlT2YobW9kZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG51bSA9IE51bWJlcnMudmFsdWVPZihudW0uaW50VmFsdWUoKSB8IG1vZGUpOworICAgICAgICBfcGtncy5wdXQocGtnLCBudW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW5ub3RhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc01ldGFEYXRhIHBhcnNlQ2xhc3NBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgLy8gY2hlY2sgaW1tZWRpYXRlbHkgd2hldGhlciB0aGUgdXNlciBpcyB1c2luZyBhbnkgYW5ub3RhdGlvbnMsCisgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgbW9kZS4gIHRoaXMgcHJldmVudHMgYWRkaW5nIG5vbi1lbnRpdHkgY2xhc3NlcyB0bworICAgICAgICAvLyByZXBvc2l0b3J5IGlmIHdlJ3JlIGlnbm9yaW5nIHRoZXNlIGFubm90YXRpb25zIGluIG1hcHBpbmcgbW9kZQorICAgICAgICBpZiAoIV9jbHMuaXNBbm5vdGF0aW9uUHJlc2VudChFbnRpdHkuY2xhc3MpCisgICAgICAgICAgICAmJiAhX2Nscy5pc0Fubm90YXRpb25QcmVzZW50KEVtYmVkZGFibGUuY2xhc3MpCisgICAgICAgICAgICAmJiAhX2Nscy5pc0Fubm90YXRpb25QcmVzZW50KE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gZmluZCAvIGNyZWF0ZSBtZXRhZGF0YQorICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBnZXRNZXRhRGF0YSgpOworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIF9jbHMuZ2V0QW5ub3RhdGlvbihFbnRpdHkuY2xhc3MpOworICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkgeworICAgICAgICAgICAgLy8gd2hpbGUgdGhlIHNwZWMgb25seSBwcm92aWRlcyBmb3IgZW1iZWRkZWQgZXhjbHVzaXZlLCBpdCBkb2Vzbid0CisgICAgICAgICAgICAvLyBzZWVtIGhhcmQgdG8gc3VwcG9ydCBvdGhlcndpc2UKKyAgICAgICAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtZXRhLnNldEVtYmVkZGVkT25seSh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1ldGEuc2V0RW1iZWRkZWRPbmx5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoZW50aXR5Lm5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0VHlwZUFsaWFzKGVudGl0eS5uYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdHJhY2sgZmV0Y2ggZ3JvdXBzIHRvIHBhcnNlIHRoZW0gYWZ0ZXIgZmllbGRzLCBzaW5jZSB0aGV5CisgICAgICAgIC8vIHJlbHkgb24gZmllbGQgbWV0YWRhdGEKKyAgICAgICAgRmV0Y2hHcm91cFtdIGZncyA9IG51bGw7CisgICAgICAgIERldGFjaGVkU3RhdGUgZGV0YWNoZWQgPSBudWxsOworCisgICAgICAgIC8vIHRyYWNrIGxpc3RlbmVycyBzaW5jZSB3ZSBuZWVkIHRvIG1lcmdlIHRoZW0gd2l0aCBlbnRpdHkgY2FsbGJhY2tzCisgICAgICAgIENvbGxlY3Rpb248TGlmZWN5Y2xlQ2FsbGJhY2tzPltdIGxpc3RlbmVycyA9IG51bGw7CisgICAgICAgIE1ldGFEYXRhVGFnIHRhZzsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm8gOiBfY2xzLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgdGFnID0gX3RhZ3MuZ2V0KGFubm8uYW5ub3RhdGlvblR5cGUoKSk7CisgICAgICAgICAgICBpZiAodGFnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVVbmtub3duQ2xhc3NBbm5vdGF0aW9uKG1ldGEsIGFubm8pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgICAgIGNhc2UgRU5USVRZX0xJU1RFTkVSUzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBwYXJzZUVudGl0eUxpc3RlbmVycyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbnRpdHlMaXN0ZW5lcnMpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5nZXRMaWZlY3ljbGVNZXRhRGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldElnbm9yZVN5c3RlbUxpc3RlbmVycyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuZ2V0TGlmZWN5Y2xlTWV0YURhdGEoKS5zZXRJZ25vcmVTdXBlcmNsYXNzQ2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpZmVjeWNsZU1ldGFEYXRhLklHTk9SRV9ISUdIKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGTFVTSF9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5GbHVzaE1vZGUobWV0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSURfQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRPYmplY3RJZFR5cGUoKChJZENsYXNzKSBhbm5vKS52YWx1ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOQVRJVkVfUVVFUklFUzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUXVlcnlNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5hbWVkTmF0aXZlUXVlcmllcyhfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTmFtZWROYXRpdmVRdWVyaWVzKSBhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOQVRJVkVfUVVFUlk6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJ5TW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VOYW1lZE5hdGl2ZVF1ZXJpZXMoX2NscywgKE5hbWVkTmF0aXZlUXVlcnkpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJJRVM6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJ5TW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VOYW1lZFF1ZXJpZXMoX2NscywgKChOYW1lZFF1ZXJpZXMpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNRdWVyeU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTmFtZWRRdWVyaWVzKF9jbHMsIChOYW1lZFF1ZXJ5KSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVFfR0VORVJBVE9SOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVNlcXVlbmNlR2VuZXJhdG9yKF9jbHMsIChTZXF1ZW5jZUdlbmVyYXRvcikgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREFUQV9DQUNIRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURhdGFDYWNoZShtZXRhLCAoRGF0YUNhY2hlKSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEQVRBU1RPUkVfSUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEYXRhU3RvcmVJZChtZXRhLCAoRGF0YVN0b3JlSWQpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFVEFDSEVEX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCA9IChEZXRhY2hlZFN0YXRlKSBhbm5vOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZFVENIX0dST1VQOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZncyA9IG5ldyBGZXRjaEdyb3VwW117IChGZXRjaEdyb3VwKSBhbm5vIH07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRkVUQ0hfR1JPVVBTOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZncyA9ICgoRmV0Y2hHcm91cHMpIGFubm8pLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihfbG9jLmdldCgidW5zdXBwb3J0ZWQiLCBfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5uby50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkgeworICAgICAgICAgICAgcGFyc2VEZXRhY2hlZFN0YXRlKG1ldGEsIGRldGFjaGVkKTsKKworICAgICAgICAgICAgLy8gbWVyZ2UgY2FsbGJhY2sgbWV0aG9kcyB3aXRoIGRlY2xhcmVkIGxpc3RlbmVycworICAgICAgICAgICAgaW50W10gaGlnaHMgPSBudWxsOworICAgICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGlnaHMgPSBuZXcgaW50W2xpc3RlbmVycy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoc1tpXSA9IGxpc3RlbmVyc1tpXS5zaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWNvcmRDYWxsYmFja3MobWV0YSwgcGFyc2VDYWxsYmFja01ldGhvZHMoX2NscywgbGlzdGVuZXJzLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgZ2V0UmVwb3NpdG9yeSgpKSwgaGlnaHMsIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gc2NhbiBwb3NzaWJseSBub24tUEMgaGllcmFyY2h5IGZvciBjYWxsYmFja3MuCisgICAgICAgICAgICAvLyByZWR1bmRhbnQgZm9yIFBDIHN1cGVyY2xhc3MgYnV0IHdlIGRvbid0IGtub3cgdGhhdCB5ZXQKKyAgICAgICAgICAgIC8vIHNvIGxldCBMaWZlY3ljbGVNZXRhRGF0YSBkZXRlcm1pbmUgdGhhdAorICAgICAgICAgICAgaWYgKCFPYmplY3QuY2xhc3MuZXF1YWxzKF9jbHMuZ2V0U3VwZXJjbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJlY29yZENhbGxiYWNrcyhtZXRhLCBwYXJzZUNhbGxiYWNrTWV0aG9kcyhfY2xzLmdldFN1cGVyY2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSwgZmFsc2UsIGdldFJlcG9zaXRvcnkoKSksIG51bGwsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChGaWVsZE1ldGFEYXRhIGZtZCA6IG1ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKSkKKyAgICAgICAgICAgIGlmIChmbWQuZ2V0TWFuYWdlbWVudCgpID09IEZpZWxkTWV0YURhdGEuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgcGFyc2VNZW1iZXJBbm5vdGF0aW9ucyhmbWQpOworICAgICAgICAvLyBwYXJzZSBmZXRjaCBncm91cHMgYWZ0ZXIgZmllbGRzCisgICAgICAgIGlmIChmZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhcnNlRmV0Y2hHcm91cHMobWV0YSwgZmdzKTsKKworICAgICAgICAvLyBhbHdheXMgcGFyc2UgbWFwcGluZyBhZnRlciBtZXRhZGF0YSBpbiBjYXNlIHRoZXJlIGFyZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKSB7CisgICAgICAgICAgICBwYXJzZUNsYXNzTWFwcGluZ0Fubm90YXRpb25zKG1ldGEpOworICAgICAgICAgICAgZm9yIChGaWVsZE1ldGFEYXRhIGZtZCA6IG1ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKSkKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldE1hbmFnZW1lbnQoKSA9PSBGaWVsZE1ldGFEYXRhLk1BTkFHRV9QRVJTSVNURU5UKQorICAgICAgICAgICAgICAgICAgICBwYXJzZU1lbWJlck1hcHBpbmdBbm5vdGF0aW9ucyhmbWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGNsYXNzIG1hcHBpbmcgYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VDbGFzc01hcHBpbmdBbm5vdGF0aW9ucyhDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBzdWJjbGFzc2VzIHRvIGhhbmRsZSB1bmtub3duIGFubm90YXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVVua25vd25DbGFzc0Fubm90YXRpb24oQ2xhc3NNZXRhRGF0YSBtZXRhLAorICAgICAgICBBbm5vdGF0aW9uIGFubm8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3IgY3JlYXRlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gdHlwZS4gTWF5IHJldHVybiBudWxsIGlmCisgICAgICogdGhpcyBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCBmdWxseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IGdldFJlcG9zaXRvcnkoKS5nZXRDYWNoZWRNZXRhRGF0YShfY2xzKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCAmJgorICAgICAgICAgICAgKChpc01ldGFEYXRhTW9kZSgpICYmIChtZXRhLmdldFNvdXJjZU1vZGUoKSAmIE1PREVfTUVUQSkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoaXNNYXBwaW5nTW9kZSgpICYmCisgICAgICAgICAgICAgICAgICAgIChtZXRhLmdldFNvdXJjZU1vZGUoKSAmIE1PREVfTUFQUElORykgIT0gMCkpKSB7CisgICAgICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy53YXJuKF9sb2MuZ2V0KCJkdXAtbWV0YWRhdGEiLCBfY2xzLmdldE5hbWUoKSkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXRhID0gZ2V0UmVwb3NpdG9yeSgpLmFkZE1ldGFEYXRhKF9jbHMpOworICAgICAgICAgICAgbWV0YS5zZXRFbnZDbGFzc0xvYWRlcihfZW52TG9hZGVyKTsKKyAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX05PTkUpOworICAgICAgICAgICAgbWV0YS5zZXRTb3VyY2UoZ2V0U291cmNlRmlsZSgpLCBtZXRhLlNSQ19BTk5PVEFUSU9OUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBzb3VyY2UgZmlsZSB3ZSdyZSBwYXJzaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldFNvdXJjZUZpbGUoKSB7CisgICAgICAgIGlmIChfZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9maWxlOworCisgICAgICAgIENsYXNzIGNscyA9IF9jbHM7CisgICAgICAgIHdoaWxlIChjbHMuZ2V0RW5jbG9zaW5nQ2xhc3MoKSAhPSBudWxsKQorICAgICAgICAgICAgY2xzID0gY2xzLmdldEVuY2xvc2luZ0NsYXNzKCk7CisKKyAgICAgICAgU3RyaW5nIHJzcmMgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNscy5nZXROYW1lKCksICIuIiwgIi8iKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY2xzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBVUkwgdXJsID0gbG9hZGVyLmdldFJlc291cmNlKHJzcmMgKyAiLmphdmEiKTsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICB1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UocnNyYyArICIuY2xhc3MiKTsKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgX2ZpbGUgPSBuZXcgRmlsZSh1cmwudG9VUkkoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhyb3duIHdoZW4gdGhlIFVSSSBpcyBub24taGllcmFyY2hpY2FsIChha2EgSkJvc3MpCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9maWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBEYXRhU3RvcmVJZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VEYXRhU3RvcmVJZChDbGFzc01ldGFEYXRhIG1ldGEsIERhdGFTdG9yZUlkIGlkKSB7CisgICAgICAgIG1ldGEuc2V0SWRlbnRpdHlUeXBlKENsYXNzTWV0YURhdGEuSURfREFUQVNUT1JFKTsKKworICAgICAgICBpbnQgc3RyYXQgPSBnZXRHZW5lcmF0ZWRWYWx1ZVN0cmF0ZWd5KG1ldGEsIGlkLnN0cmF0ZWd5KCksCisgICAgICAgICAgICBpZC5nZW5lcmF0b3IoKSk7CisgICAgICAgIGlmIChzdHJhdCAhPSAtMSkKKyAgICAgICAgICAgIG1ldGEuc2V0SWRlbnRpdHlTdHJhdGVneShzdHJhdCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChpZC5zdHJhdGVneSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgICAgICBjYXNlIFNFUVVFTkNFOgorICAgICAgICAgICAgICAgICAgICAvLyB0ZWNobmljYWxseSB3ZSBzaG91bGQgaGF2ZSBzZXBhcmF0ZSBzeXN0ZW0gdGFibGUgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGJ1dCBpdCdzIGVhc2llciB0byBqdXN0IHJlbHkgb24KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN5c3RlbSBvcmcuYXBhY2hlLm9wZW5qcGEuU2VxdWVuY2Ugc2V0dGluZyBmb3IgYm90aAorICAgICAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShpZC5nZW5lcmF0b3IoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldElkZW50aXR5U2VxdWVuY2VOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTWV0YURhdGEuTkFNRV9TWVNURU0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldElkZW50aXR5U2VxdWVuY2VOYW1lKGlkLmdlbmVyYXRvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPOgorICAgICAgICAgICAgICAgICAgICBtZXRhLnNldElkZW50aXR5U3RyYXRlZ3koVmFsdWVTdHJhdGVnaWVzLk5BVElWRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSURFTlRJVFk6CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SWRlbnRpdHlTdHJhdGVneShWYWx1ZVN0cmF0ZWdpZXMuQVVUT0FTU0lHTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihpZC5zdHJhdGVneSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FybiB0aGF0IEBGbHVzaE1vZGUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FybkZsdXNoTW9kZShPYmplY3QgY29udGV4dCkgeworICAgICAgICBpZiAoX2xvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoInVuc3VwcG9ydGVkIiwgIkZsdXNoTW9kZSIsIGNvbnRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBARGF0YUNhY2hlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZURhdGFDYWNoZShDbGFzc01ldGFEYXRhIG1ldGEsIERhdGFDYWNoZSBjYWNoZSkgeworICAgICAgICBpZiAoY2FjaGUudGltZW91dCgpICE9IEludGVnZXIuTUlOX1ZBTFVFKQorICAgICAgICAgICAgbWV0YS5zZXREYXRhQ2FjaGVUaW1lb3V0KGNhY2hlLnRpbWVvdXQoKSk7CisgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShjYWNoZS5uYW1lKCkpKQorICAgICAgICAgICAgbWV0YS5zZXREYXRhQ2FjaGVOYW1lKGNhY2hlLm5hbWUoKSk7CisgICAgICAgIGVsc2UgaWYgKGNhY2hlLmVuYWJsZWQoKSkKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YUNhY2hlTmFtZSgKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZS5OQU1FX0RFRkFVTFQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZXRhLnNldERhdGFDYWNoZU5hbWUobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgQERldGFjaGVkU3RhdGUuIFRoZSBhbm5vdGF0aW9uIG1heSBiZSBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZURldGFjaGVkU3RhdGUoQ2xhc3NNZXRhRGF0YSBtZXRhLAorICAgICAgICBEZXRhY2hlZFN0YXRlIGRldGFjaGVkKSB7CisgICAgICAgIGlmIChkZXRhY2hlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWRldGFjaGVkLmVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldERldGFjaGVkU3RhdGUobnVsbCk7CisgICAgICAgICAgICBlbHNlIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShkZXRhY2hlZC5maWVsZE5hbWUoKSkpCisgICAgICAgICAgICAgICAgbWV0YS5zZXREZXRhY2hlZFN0YXRlKENsYXNzTWV0YURhdGEuU1lOVEhFVElDKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRhLnNldERldGFjaGVkU3RhdGUoZGV0YWNoZWQuZmllbGROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5pc0Fubm90YXRpb25QcmVzZW50KERldGFjaGVkU3RhdGUuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERldGFjaGVkU3RhdGUoZmllbGRzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBARW50aXR5TGlzdGVuZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPExpZmVjeWNsZUNhbGxiYWNrcz5bXSBwYXJzZUVudGl0eUxpc3RlbmVycworICAgICAgICAoQ2xhc3NNZXRhRGF0YSBtZXRhLCBFbnRpdHlMaXN0ZW5lcnMgbGlzdGVuZXJzKSB7CisgICAgICAgIENsYXNzW10gY2xhc3NlcyA9IGxpc3RlbmVycy52YWx1ZSgpOworICAgICAgICBDb2xsZWN0aW9uPExpZmVjeWNsZUNhbGxiYWNrcz5bXSBwYXJzZWQgPSBudWxsOworICAgICAgICBmb3IgKENsYXNzIGNscyA6IGNsYXNzZXMpCisgICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUNhbGxiYWNrTWV0aG9kcyhjbHMsIHBhcnNlZCwgdHJ1ZSwgdHJ1ZSwgCisgICAgICAgICAgICAgICAgZ2V0UmVwb3NpdG9yeSgpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBjYWxsYmFjayBtZXRob2RzIGludG8gdGhlIGdpdmVuIGFycmF5LCBhbmQgcmV0dXJuIHRoYXQgYXJyYXksCisgICAgICogY3JlYXRpbmcgb25lIGlmIG51bGwuIEVhY2ggaW5kZXggaW50byB0aGUgYXJyYXkgaXMgYSBjb2xsZWN0aW9uIG9mCisgICAgICogY2FsbGJhY2sgYWRhcHRlcnMgZm9yIHRoYXQgbnVtZXJpYyBldmVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHN1cHMgd2hldGhlciB0byBzY2FuIHN1cGVyY2xhc3NlcworICAgICAqIEBwYXJhbSBsaXN0ZW5lciB3aGV0aGVyIHRoaXMgaXMgYSBsaXN0ZW5lciBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248TGlmZWN5Y2xlQ2FsbGJhY2tzPltdIHBhcnNlQ2FsbGJhY2tNZXRob2RzCisgICAgICAgIChDbGFzcyBjbHMsIENvbGxlY3Rpb248TGlmZWN5Y2xlQ2FsbGJhY2tzPltdIGNhbGxiYWNrcywgYm9vbGVhbiBzdXBzLAorICAgICAgICBib29sZWFuIGxpc3RlbmVyLCBNZXRhRGF0YVJlcG9zaXRvcnkgcmVwb3MpIHsKKyAgICAgICAgLy8gZmlyc3Qgc29ydCAvIGZpbHRlciBiYXNlZCBvbiBpbmhlcml0YW5jZQorICAgICAgICBTZXQ8TWV0aG9kPiBtZXRob2RzID0gbmV3IFRyZWVTZXQ8TWV0aG9kPihNZXRob2RDb21wYXJhdG9yLgorICAgICAgICAgICAgZ2V0SW5zdGFuY2UoKSk7CisKKyAgICAgICAgaW50IG1vZHM7CisgICAgICAgIENsYXNzIHN1cCA9IGNsczsKKyAgICAgICAgTWV0aG9kS2V5IGtleTsKKyAgICAgICAgU2V0PE1ldGhvZEtleT4gc2VlbiA9IG5ldyBIYXNoU2V0PE1ldGhvZEtleT4oKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChNZXRob2QgbSA6IHN1cC5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIG1vZHMgPSBtLmdldE1vZGlmaWVycygpOworICAgICAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1N0YXRpYyhtb2RzKSB8fCBNb2RpZmllci5pc0ZpbmFsKG1vZHMpIHx8CisgICAgICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcy5lcXVhbHMobS5nZXREZWNsYXJpbmdDbGFzcygpKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBrZXkgPSBuZXcgTWV0aG9kS2V5KG0pOworICAgICAgICAgICAgICAgIGlmICghc2Vlbi5jb250YWlucyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKG0pOworICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cCA9IHN1cC5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKHN1cHMgJiYgIU9iamVjdC5jbGFzcy5lcXVhbHMoc3VwKSk7CisKKyAgICAgICAgTWV0YURhdGFEZWZhdWx0cyBkZWYgPSByZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKS5nZXREZWZhdWx0cygpOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogbWV0aG9kcykgeworICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm8gOiBtLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIE1ldGFEYXRhVGFnIHRhZyA9IF90YWdzLmdldChhbm5vLmFubm90YXRpb25UeXBlKCkpOworICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaW50W10gZXZlbnRzID0gTWV0YURhdGFQYXJzZXJzLmdldEV2ZW50VHlwZXModGFnKTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSAoQ29sbGVjdGlvbjxMaWZlY3ljbGVDYWxsYmFja3M+W10pCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sbGVjdGlvbltMaWZlY3ljbGVFdmVudC5BTExfRVZFTlRTLmxlbmd0aF07CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZSA9IGV2ZW50c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tlXSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2VdID0gbmV3IEFycmF5TGlzdCgzKTsKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFQYXJzZXJzLnZhbGlkYXRlTWV0aG9kc0ZvclNhbWVDYWxsYmFjayhjbHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2VdLCBtLCB0YWcsIGRlZiwgcmVwb3MuZ2V0TG9nKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tlXS5hZGQobmV3IEJlYW5MaWZlY3ljbGVDYWxsYmFja3MoY2xzLCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NbZV0uYWRkKG5ldyBNZXRob2RMaWZlY3ljbGVDYWxsYmFja3MobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjYWxsYmFja3M7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN0b3JlIGxpZmVjeWNsZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkQ2FsbGJhY2tzKENsYXNzTWV0YURhdGEgY2xzLAorICAgICAgICBDb2xsZWN0aW9uPExpZmVjeWNsZUNhbGxiYWNrcz5bXSBjYWxsYmFja3MsIGludFtdIGhpZ2hzLAorICAgICAgICBib29sZWFuIHN1cGVyQ2xhc3MpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBMaWZlY3ljbGVNZXRhRGF0YSBtZXRhID0gY2xzLmdldExpZmVjeWNsZU1ldGFEYXRhKCk7CisgICAgICAgIExpZmVjeWNsZUNhbGxiYWNrc1tdIGFycmF5OworICAgICAgICBmb3IgKGludCBldmVudCA6IExpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFMpIHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja3NbZXZlbnRdID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhcnJheSA9IGNhbGxiYWNrc1tldmVudF0udG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgTGlmZWN5Y2xlQ2FsbGJhY2tzW2NhbGxiYWNrc1tldmVudF0uc2l6ZSgpXSk7CisKKyAgICAgICAgICAgIGlmIChzdXBlckNsYXNzKSB7CisgICAgICAgICAgICAgICAgbWV0YS5zZXROb25QQ1N1cGVyY2xhc3NDYWxsYmFja3MoZXZlbnQsIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAoaGlnaHMgPT0gbnVsbCkgPyAwIDogaGlnaHNbZXZlbnRdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWV0YS5zZXREZWNsYXJlZENhbGxiYWNrcyhldmVudCwgYXJyYXksCisgICAgICAgICAgICAgICAgICAgIChoaWdocyA9PSBudWxsKSA/IDAgOiBoaWdoc1tldmVudF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGZldGNoIGdyb3Vwcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VGZXRjaEdyb3VwcyhDbGFzc01ldGFEYXRhIG1ldGEsIEZldGNoR3JvdXAuLi4gZ3JvdXBzKSB7CisgICAgICAgIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZldGNoR3JvdXAgZmc7CisgICAgICAgIGZvciAoRmV0Y2hHcm91cCBncm91cCA6IGdyb3VwcykgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZ3JvdXAubmFtZSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoInVubmFtZWQtZmciLCBtZXRhKSk7CisKKyAgICAgICAgICAgIGZnID0gbWV0YS5hZGREZWNsYXJlZEZldGNoR3JvdXAoZ3JvdXAubmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChncm91cC5wb3N0TG9hZCgpKQorICAgICAgICAgICAgICAgIGZnLnNldFBvc3RMb2FkKHRydWUpOyAKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBncm91cC5mZXRjaEdyb3VwcygpKQorICAgICAgICAgICAgICAgIGZnLmFkZERlY2xhcmVkSW5jbHVkZShzKTsKKyAgICAgICAgICAgIGZvciAoRmV0Y2hBdHRyaWJ1dGUgYXR0ciA6IGdyb3VwLmF0dHJpYnV0ZXMoKSkKKyAgICAgICAgICAgICAgICBwYXJzZUZldGNoQXR0cmlidXRlKG1ldGEsIGZnLCBhdHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGZpZWxkJ3MgZmV0Y2ggZ3JvdXAuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRmV0Y2hBdHRyaWJ1dGUoQ2xhc3NNZXRhRGF0YSBtZXRhLCAKKyAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmV0Y2hHcm91cCBmZywgRmV0Y2hBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBGaWVsZE1ldGFEYXRhIGZpZWxkID0gbWV0YS5nZXREZWNsYXJlZEZpZWxkKGF0dHIubmFtZSgpKTsKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGwKKyAgICAgICAgICAgIHx8IGZpZWxkLmdldE1hbmFnZW1lbnQoKSAhPSBGaWVsZE1ldGFEYXRhLk1BTkFHRV9QRVJTSVNURU5UKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtZmctZmllbGQiLCBmZy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgbWV0YSwgYXR0ci5uYW1lKCkpKTsKKworICAgICAgICBmaWVsZC5zZXRJbkZldGNoR3JvdXAoZmcuZ2V0TmFtZSgpLCB0cnVlKTsKKyAgICAgICAgaWYgKGF0dHIucmVjdXJzaW9uRGVwdGgoKSAhPSBJbnRlZ2VyLk1JTl9WQUxVRSkKKyAgICAgICAgICAgIGZnLnNldFJlY3Vyc2lvbkRlcHRoKGZpZWxkLCBhdHRyLnJlY3Vyc2lvbkRlcHRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW5ub3RhdGlvbnMgZm9yIHRoZSBnaXZlbiBtZW1iZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTWVtYmVyQW5ub3RhdGlvbnMoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgLy8gbG9vayBmb3IgcGVyc2lzdGVuY2Ugc3RyYXRlZ3kgaW4gYW5ub3RhdGlvbiB0YWJsZQorICAgICAgICBNZW1iZXIgbWVtYmVyID0gZ2V0UmVwb3NpdG9yeSgpLmdldE1ldGFEYXRhRmFjdG9yeSgpLmdldERlZmF1bHRzKCkuCisgICAgICAgICAgICBnZXRCYWNraW5nTWVtYmVyKGZtZCk7CisgICAgICAgIFBlcnNpc3RlbmNlU3RyYXRlZ3kgcHN0cmF0ID0gUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzLgorICAgICAgICAgICAgZ2V0UGVyc2lzdGVuY2VTdHJhdGVneShmbWQsIG1lbWJlcik7CisgICAgICAgIGlmIChwc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZm1kLnNldEV4cGxpY2l0KHRydWUpOworCisgICAgICAgIEFubm90YXRlZEVsZW1lbnQgZWwgPSAoQW5ub3RhdGVkRWxlbWVudCkgbWVtYmVyOworICAgICAgICBib29sZWFuIGxvYiA9IGVsLmlzQW5ub3RhdGlvblByZXNlbnQoTG9iLmNsYXNzKTsKKyAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHN0cmF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBCQVNJQzoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VCYXNpYyhmbWQsIChCYXNpYykgZWwuZ2V0QW5ub3RhdGlvbihCYXNpYy5jbGFzcyksIGxvYik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUFOWV9PTkU6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlTWFueVRvT25lKGZtZCwgKE1hbnlUb09uZSkgZWwuZ2V0QW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKE1hbnlUb09uZS5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9ORV9PTkU6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlT25lVG9PbmUoZm1kLCAoT25lVG9PbmUpIGVsLmdldEFubm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChPbmVUb09uZS5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVNQkVEREVEOgorICAgICAgICAgICAgICAgICAgICBwYXJzZUVtYmVkZGVkKGZtZCwgKEVtYmVkZGVkKSBlbC5nZXRBbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAoRW1iZWRkZWQuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPTkVfTUFOWToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VPbmVUb01hbnkoZm1kLCAoT25lVG9NYW55KSBlbC5nZXRBbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAoT25lVG9NYW55LmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUFOWV9NQU5ZOgorICAgICAgICAgICAgICAgICAgICBwYXJzZU1hbnlUb01hbnkoZm1kLCAoTWFueVRvTWFueSkgZWwuZ2V0QW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKE1hbnlUb01hbnkuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQRVJTOgorICAgICAgICAgICAgICAgICAgICBwYXJzZVBlcnNpc3RlbnQoZm1kLCAoUGVyc2lzdGVudCkgZWwuZ2V0QW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKFBlcnNpc3RlbnQuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQRVJTX0NPTEw6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlUGVyc2lzdGVudENvbGxlY3Rpb24oZm1kLCAoUGVyc2lzdGVudENvbGxlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBlbC5nZXRBbm5vdGF0aW9uKFBlcnNpc3RlbnRDb2xsZWN0aW9uLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEVSU19NQVA6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlUGVyc2lzdGVudE1hcChmbWQsIChQZXJzaXN0ZW50TWFwKQorICAgICAgICAgICAgICAgICAgICAgICAgZWwuZ2V0QW5ub3RhdGlvbihQZXJzaXN0ZW50TWFwLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc01hcHBpbmdPdmVycmlkZU1vZGUoKSAmJiBsb2IpCisgICAgICAgICAgICBwYXJzZUxvYk1hcHBpbmcoZm1kKTsKKworICAgICAgICAvLyBleHRlbnNpb25zCisgICAgICAgIE1ldGFEYXRhVGFnIHRhZzsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm8gOiBlbC5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIHRhZyA9IF90YWdzLmdldChhbm5vLmFubm90YXRpb25UeXBlKCkpOworICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlVW5rbm93bk1lbWJlckFubm90YXRpb24oZm1kLCBhbm5vKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZMVVNIX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgd2FybkZsdXNoTW9kZShmbWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdFTkVSQVRFRF9WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VHZW5lcmF0ZWRWYWx1ZShmbWQsIChHZW5lcmF0ZWRWYWx1ZSkgYW5ubyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgY2FzZSBFTUJFRERFRF9JRDoKKyAgICAgICAgICAgICAgICAgICAgZm1kLnNldFByaW1hcnlLZXkodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUFQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VNYXBLZXkoZm1kLCAoTWFwS2V5KSBhbm5vKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUkRFUl9CWToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VPcmRlckJ5KGZtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChPcmRlckJ5KSBlbC5nZXRBbm5vdGF0aW9uKE9yZGVyQnkuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVFfR0VORVJBVE9SOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVNlcXVlbmNlR2VuZXJhdG9yKGVsLCAoU2VxdWVuY2VHZW5lcmF0b3IpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZFUlNJT046CisgICAgICAgICAgICAgICAgICAgIGZtZC5zZXRWZXJzaW9uKHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFUEVOREVOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkgJiYgKChEZXBlbmRlbnQpIGFubm8pLnZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbWQuc2V0Q2FzY2FkZURlbGV0ZShWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRUxFTV9ERVBFTkRFTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpICYmICgoRWxlbWVudERlcGVuZGVudCkgYW5ubykudmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuc2V0Q2FzY2FkZURlbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWYWx1ZU1ldGFEYXRhLkNBU0NBREVfQVVUTyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRUxFTV9UWVBFOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuc2V0VHlwZU92ZXJyaWRlKHRvT3ZlcnJpZGVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoRWxlbWVudFR5cGUpIGFubm8pLnZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWFRFUk5BTF9WQUxTOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5zZXRFeHRlcm5hbFZhbHVlcyhTdHJpbmdzLmpvaW4oKChFeHRlcm5hbFZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vKS52YWx1ZSgpLCAiLCIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWFRFUk5BTElaRVI6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm1kLnNldEV4dGVybmFsaXplcigoKEV4dGVybmFsaXplcikgYW5ubykudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRkFDVE9SWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbWQuc2V0RmFjdG9yeSgoKEZhY3RvcnkpIGFubm8pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOVkVSU0VfTE9HSUNBTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbWQuc2V0SW52ZXJzZSgoKEludmVyc2VMb2dpY2FsKSBhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLRVlfREVQRU5ERU5UOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSAmJiAoKEtleURlcGVuZGVudCkgYW5ubykudmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5nZXRLZXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDYXNjYWRlRGVsZXRlKFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9BVVRPKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLRVlfVFlQRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbWQuZ2V0S2V5KCkuc2V0VHlwZU92ZXJyaWRlKHRvT3ZlcnJpZGVUeXBlKCgoS2V5VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vKS52YWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTE9BRF9GRVRDSF9HUk9VUDoKKyAgICAgICAgICAgICAgICAJaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgCQlmbWQuc2V0TG9hZEZldGNoR3JvdXAoKChMb2FkRmV0Y2hHcm91cClhbm5vKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMUlM6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm1kLnNldExSUygoKExSUykgYW5ubykudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVBRF9PTkxZOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUmVhZE9ubHkoZm1kLCAoUmVhZE9ubHkpIGFubm8pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm1kLnNldFR5cGVPdmVycmlkZSh0b092ZXJyaWRlVHlwZSgoKFR5cGUpIGFubm8pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bnN1cHBvcnRlZCIsIGZtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFubm8udG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgbWVtYmVyIG1hcHBpbmcgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZU1lbWJlck1hcHBpbmdBbm5vdGF0aW9ucyhGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHN1YmNsYXNzZXMgdG8gaGFuZGxlIHVua25vd24gYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVW5rbm93bk1lbWJlckFubm90YXRpb24oRmllbGRNZXRhRGF0YSBmbWQsCisgICAgICAgIEFubm90YXRpb24gYW5ubykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gY2xhc3MgdG8gaXRzIE9wZW5KUEEgdHlwZSBvdmVycmlkZSBlcXVpdmFsZW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHRvT3ZlcnJpZGVUeXBlKENsYXNzIGNscykgeworICAgICAgICByZXR1cm4gKGNscyA9PSBFbnRpdHkuY2xhc3MpCisgICAgICAgICAgICA/IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZS5jbGFzcyA6IGNsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAUmVhZE9ubHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVhZE9ubHkoRmllbGRNZXRhRGF0YSBmbWQsIFJlYWRPbmx5IHJvKSB7CisgICAgICAgIGlmIChyby52YWx1ZSgpID09IFVwZGF0ZUFjdGlvbi5SRVNUUklDVCkKKyAgICAgICAgICAgIGZtZC5zZXRVcGRhdGVTdHJhdGVneShVcGRhdGVTdHJhdGVnaWVzLlJFU1RSSUNUKTsKKyAgICAgICAgZWxzZSBpZiAocm8udmFsdWUoKSA9PSBVcGRhdGVBY3Rpb24uSUdOT1JFKQorICAgICAgICAgICAgZm1kLnNldFVwZGF0ZVN0cmF0ZWd5KFVwZGF0ZVN0cmF0ZWdpZXMuSUdOT1JFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB2YWx1ZSBnZW5lcmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlR2VuZXJhdGVkVmFsdWUoRmllbGRNZXRhRGF0YSBmbWQsIEdlbmVyYXRlZFZhbHVlIGdlbikgeworICAgICAgICBpbnQgc3RyYXQgPSBnZXRHZW5lcmF0ZWRWYWx1ZVN0cmF0ZWd5KGZtZCwgZ2VuLnN0cmF0ZWd5KCksCisgICAgICAgICAgICBnZW4uZ2VuZXJhdG9yKCkpOworICAgICAgICBpZiAoc3RyYXQgIT0gLTEpCisgICAgICAgICAgICBmbWQuc2V0VmFsdWVTdHJhdGVneShzdHJhdCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChnZW4uc3RyYXRlZ3koKSkgeworICAgICAgICAgICAgICAgIGNhc2UgVEFCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBTRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGhhdmUgc2VwYXJhdGUgc3lzdGVtIHRhYmxlIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBidXQgaXQncyBlYXNpZXIgdG8ganVzdCByZWx5IG9uCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzeXN0ZW0gb3JnLmFwYWNoZS5vcGVuanBhLlNlcXVlbmNlIHNldHRpbmcgZm9yIGJvdGgKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZ2VuLmdlbmVyYXRvcigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtZC5zZXRWYWx1ZVNlcXVlbmNlTmFtZShTZXF1ZW5jZU1ldGFEYXRhLk5BTUVfU1lTVEVNKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm1kLnNldFZhbHVlU2VxdWVuY2VOYW1lKGdlbi5nZW5lcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgZm1kLnNldFZhbHVlU2VxdWVuY2VOYW1lKFNlcXVlbmNlTWV0YURhdGEuTkFNRV9TWVNURU0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElERU5USVRZOgorICAgICAgICAgICAgICAgICAgICBmbWQuc2V0VmFsdWVTdHJhdGVneShWYWx1ZVN0cmF0ZWdpZXMuQVVUT0FTU0lHTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbihnZW4uc3RyYXRlZ3koKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgc3RyYXRlZ3kgZm9yIHRoZSBnaXZlbiBnZW5lcmF0b3IsIG9yIC0xIGlmIHRoZQorICAgICAqIHN0cmF0ZWd5IGRlcGVuZHMgb24gdGhlIDxjb2RlPkdlbmVyYXRpb25UeXBlPC9jb2RlPiByYXRoZXIgdGhhbiB0aGUKKyAgICAgKiBnZW5lcmF0b3IgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0R2VuZXJhdGVkVmFsdWVTdHJhdGVneShPYmplY3QgY29udGV4dCwKKyAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3ksIFN0cmluZyBnZW5lcmF0b3IpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IEFVVE8gfHwgU3RyaW5nVXRpbHMuaXNFbXB0eShnZW5lcmF0b3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmIChHZW5lcmF0b3IuVVVJRF9IRVguZXF1YWxzKGdlbmVyYXRvcikpCisgICAgICAgICAgICByZXR1cm4gVmFsdWVTdHJhdGVnaWVzLlVVSURfSEVYOworICAgICAgICBpZiAoR2VuZXJhdG9yLlVVSURfU1RSSU5HLmVxdWFscyhnZW5lcmF0b3IpKQorICAgICAgICAgICAgcmV0dXJuIFZhbHVlU3RyYXRlZ2llcy5VVUlEX1NUUklORzsKKyAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJnZW5lcmF0b3ItYmFkLXN0cmF0ZWd5IiwKKyAgICAgICAgICAgIGNvbnRleHQsIGdlbmVyYXRvcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBCYXNpYy4gR2l2ZW4gYW5ub3RhdGlvbiBtYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VCYXNpYyhGaWVsZE1ldGFEYXRhIGZtZCwgQmFzaWMgYW5ubywgYm9vbGVhbiBsb2IpIHsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGZtZC5nZXREZWNsYXJlZFR5cGUoKTsKKyAgICAgICAgaWYgKGxvYiAmJiB0eXBlICE9IFN0cmluZy5jbGFzcworICAgICAgICAgICAgJiYgdHlwZSAhPSBjaGFyW10uY2xhc3MgJiYgdHlwZSAhPSBDaGFyYWN0ZXJbXS5jbGFzcworICAgICAgICAgICAgJiYgdHlwZSAhPSBieXRlW10uY2xhc3MgJiYgdHlwZSAhPSBCeXRlW10uY2xhc3MpCisgICAgICAgICAgICBmbWQuc2V0U2VyaWFsaXplZCh0cnVlKTsKKyAgICAgICAgZWxzZSBpZiAoIWxvYikgeworICAgICAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICBpZiAoRW51bS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugbm8gYnJlYWsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQzoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5QQ19VTlRZUEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAoU2VyaWFsaXphYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbWQuc2V0U2VyaWFsaXplZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0YS1hbm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbWQsICJCYXNpYyIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGNoYXJbXS5jbGFzcyB8fCB0eXBlID09IENoYXJhY3RlcltdLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IGJ5dGVbXS5jbGFzcyB8fCB0eXBlID09IEJ5dGVbXS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoU2VyaWFsaXphYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlLmdldENvbXBvbmVudFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbWQuc2V0U2VyaWFsaXplZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0YS1hbm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbWQsICJCYXNpYyIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYW5ubyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmbWQuc2V0SW5EZWZhdWx0RmV0Y2hHcm91cChhbm5vLmZldGNoKCkgPT0gRmV0Y2hUeXBlLkVBR0VSKTsKKyAgICAgICAgaWYgKCFhbm5vLm9wdGlvbmFsKCkpCisgICAgICAgICAgICBmbWQuc2V0TnVsbFZhbHVlKEZpZWxkTWV0YURhdGEuTlVMTF9FWENFUFRJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBNYW55VG9PbmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTWFueVRvT25lKEZpZWxkTWV0YURhdGEgZm1kLCBNYW55VG9PbmUgYW5ubykgeworICAgICAgICBpZiAoIUphdmFUeXBlcy5tYXliZVBDKGZtZC5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLW1ldGEtYW5ubyIsIGZtZCwKKyAgICAgICAgICAgICAgICAiTWFueVRvT25lIikpOworCisgICAgICAgIC8vIGRvbid0IHNwZWNpZmljYWxseSBleGNsdWRlIHJlbGF0aW9uIGZyb20gREZHIGIvYyB0aGF0IHdpbGwgcHJldmVudAorICAgICAgICAvLyB1cyBmcm9tIGV2ZW4gcmVhZGluZyB0aGUgZmsgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByaW1hcnkgdGFibGUsCisgICAgICAgIC8vIHdoaWNoIGlzIG5vdCB3aGF0IG1vc3QgdXNlcnMgd2lsbCB3YW50CisgICAgICAgIGlmIChhbm5vLmZldGNoKCkgPT0gRmV0Y2hUeXBlLkVBR0VSKQorICAgICAgICAgICAgZm1kLnNldEluRGVmYXVsdEZldGNoR3JvdXAodHJ1ZSk7CisgICAgICAgIGlmICghYW5uby5vcHRpb25hbCgpKQorICAgICAgICAgICAgZm1kLnNldE51bGxWYWx1ZShGaWVsZE1ldGFEYXRhLk5VTExfRVhDRVBUSU9OKTsKKyAgICAgICAgaWYgKGFubm8udGFyZ2V0RW50aXR5KCkgIT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgIGZtZC5zZXRUeXBlT3ZlcnJpZGUoYW5uby50YXJnZXRFbnRpdHkoKSk7CisgICAgICAgIHNldENhc2NhZGVzKGZtZCwgYW5uby5jYXNjYWRlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBPbmVUb09uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VPbmVUb09uZShGaWVsZE1ldGFEYXRhIGZtZCwgT25lVG9PbmUgYW5ubykgeworICAgICAgICBpZiAoIUphdmFUeXBlcy5tYXliZVBDKGZtZC5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLW1ldGEtYW5ubyIsIGZtZCwKKyAgICAgICAgICAgICAgICAiT25lVG9PbmUiKSk7CisKKyAgICAgICAgLy8gZG9uJ3Qgc3BlY2lmaWNhbGx5IGV4Y2x1ZGUgcmVsYXRpb24gZnJvbSBERkcgYi9jIHRoYXQgd2lsbCBwcmV2ZW50CisgICAgICAgIC8vIHVzIGZyb20gZXZlbiByZWFkaW5nIHRoZSBmayB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgcHJpbWFyeSB0YWJsZSwKKyAgICAgICAgLy8gd2hpY2ggaXMgbm90IHdoYXQgbW9zdCB1c2VycyB3aWxsIHdhbnQKKyAgICAgICAgaWYgKGFubm8uZmV0Y2goKSA9PSBGZXRjaFR5cGUuRUFHRVIpCisgICAgICAgICAgICBmbWQuc2V0SW5EZWZhdWx0RmV0Y2hHcm91cCh0cnVlKTsKKyAgICAgICAgaWYgKCFhbm5vLm9wdGlvbmFsKCkpCisgICAgICAgICAgICBmbWQuc2V0TnVsbFZhbHVlKEZpZWxkTWV0YURhdGEuTlVMTF9FWENFUFRJT04pOworCisgICAgICAgIGlmIChpc01hcHBpbmdPdmVycmlkZU1vZGUoKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eShhbm5vLm1hcHBlZEJ5KCkpKQorICAgICAgICAgICAgZm1kLnNldE1hcHBlZEJ5KGFubm8ubWFwcGVkQnkoKSk7CisgICAgICAgIGlmIChhbm5vLnRhcmdldEVudGl0eSgpICE9IHZvaWQuY2xhc3MpCisgICAgICAgICAgICBmbWQuc2V0VHlwZU92ZXJyaWRlKGFubm8udGFyZ2V0RW50aXR5KCkpOworICAgICAgICBzZXRDYXNjYWRlcyhmbWQsIGFubm8uY2FzY2FkZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBARW1iZWRkZWQuIEdpdmVuIGFubm90YXRpb24gbWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRW1iZWRkZWQoRmllbGRNZXRhRGF0YSBmbWQsIEVtYmVkZGVkIGFubm8pIHsKKyAgICAgICAgaWYgKCFKYXZhVHlwZXMubWF5YmVQQyhmbWQuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tZXRhLWFubm8iLCBmbWQsCisgICAgICAgICAgICAgICAgIkVtYmVkZGVkIikpOworCisgICAgICAgIGZtZC5zZXRJbkRlZmF1bHRGZXRjaEdyb3VwKHRydWUpOworICAgICAgICBmbWQuc2V0RW1iZWRkZWQodHJ1ZSk7CisgICAgICAgIGlmIChmbWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpID09IG51bGwpCisgICAgICAgICAgICBmbWQuYWRkRW1iZWRkZWRNZXRhRGF0YSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEBPbmVUb01hbnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlT25lVG9NYW55KEZpZWxkTWV0YURhdGEgZm1kLCBPbmVUb01hbnkgYW5ubykgeworICAgICAgICBzd2l0Y2ggKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICBpZiAoSmF2YVR5cGVzLm1heWJlUEMoZm1kLmdldEVsZW1lbnQoKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLW1ldGEtYW5ubyIsIGZtZCwKKyAgICAgICAgICAgICAgICAgICAgIk9uZVRvTWFueSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZtZC5zZXRJbkRlZmF1bHRGZXRjaEdyb3VwKGFubm8uZmV0Y2goKSA9PSBGZXRjaFR5cGUuRUFHRVIpOworICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkgJiYgIVN0cmluZ1V0aWxzLmlzRW1wdHkoYW5uby5tYXBwZWRCeSgpKSkKKyAgICAgICAgICAgIGZtZC5zZXRNYXBwZWRCeShhbm5vLm1hcHBlZEJ5KCkpOworICAgICAgICBpZiAoYW5uby50YXJnZXRFbnRpdHkoKSAhPSB2b2lkLmNsYXNzKQorICAgICAgICAgICAgZm1kLmdldEVsZW1lbnQoKS5zZXREZWNsYXJlZFR5cGUoYW5uby50YXJnZXRFbnRpdHkoKSk7CisgICAgICAgIHNldENhc2NhZGVzKGZtZC5nZXRFbGVtZW50KCksIGFubm8uY2FzY2FkZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBATWFueVRvTWFueS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VNYW55VG9NYW55KEZpZWxkTWV0YURhdGEgZm1kLCBNYW55VG9NYW55IGFubm8pIHsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgaWYgKEphdmFUeXBlcy5tYXliZVBDKGZtZC5nZXRFbGVtZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tZXRhLWFubm8iLCBmbWQsCisgICAgICAgICAgICAgICAgICAgICJPbmVUb01hbnkiKSk7CisgICAgICAgIH0KKworICAgICAgICBmbWQuc2V0SW5EZWZhdWx0RmV0Y2hHcm91cChhbm5vLmZldGNoKCkgPT0gRmV0Y2hUeXBlLkVBR0VSKTsKKyAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KGFubm8ubWFwcGVkQnkoKSkpCisgICAgICAgICAgICBmbWQuc2V0TWFwcGVkQnkoYW5uby5tYXBwZWRCeSgpKTsKKyAgICAgICAgaWYgKGFubm8udGFyZ2V0RW50aXR5KCkgIT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuc2V0RGVjbGFyZWRUeXBlKGFubm8udGFyZ2V0RW50aXR5KCkpOworICAgICAgICBzZXRDYXNjYWRlcyhmbWQuZ2V0RWxlbWVudCgpLCBhbm5vLmNhc2NhZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgQE1hcEtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VNYXBLZXkoRmllbGRNZXRhRGF0YSBmbWQsIE1hcEtleSBhbm5vKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gYW5uby5uYW1lKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG5hbWUpKQorICAgICAgICAgICAgZm1kLmdldEtleSgpLnNldFZhbHVlTWFwcGVkQnkoVmFsdWVNZXRhRGF0YS5NQVBQRURfQllfUEspOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbWQuZ2V0S2V5KCkuc2V0VmFsdWVNYXBwZWRCeShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR1cCB0aGUgZmllbGQgYXMgYSBMT0IgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUxvYk1hcHBpbmcoRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAT3JkZXJCeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VPcmRlckJ5KEZpZWxkTWV0YURhdGEgZm1kLCBPcmRlckJ5IGFubm8pIHsKKyAgICAgICAgU3RyaW5nIGRlYyA9IGFubm8udmFsdWUoKTsKKyAgICAgICAgaWYgKGRlYy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgZGVjID0gT3JkZXIuRUxFTUVOVCArICIgYXNjIjsKKyAgICAgICAgZm1kLnNldE9yZGVyRGVjbGFyYXRpb24oZGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAUGVyc2lzdGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQZXJzaXN0ZW50KEZpZWxkTWV0YURhdGEgZm1kLCBQZXJzaXN0ZW50IGFubm8pIHsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldERlY2xhcmVkVHlwZSgpID09IGJ5dGVbXS5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBmbWQuZ2V0RGVjbGFyZWRUeXBlKCkgPT0gQnl0ZVtdLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBjaGFyW10uY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgZm1kLmdldERlY2xhcmVkVHlwZSgpID09IENoYXJhY3RlcltdLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tZXRhLWFubm8iLCBmbWQsCisgICAgICAgICAgICAgICAgICAgICJQZXJzaXN0ZW50IikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGFubm8ubWFwcGVkQnkoKSkpCisgICAgICAgICAgICBmbWQuc2V0TWFwcGVkQnkoYW5uby5tYXBwZWRCeSgpKTsKKyAgICAgICAgZm1kLnNldEluRGVmYXVsdEZldGNoR3JvdXAoYW5uby5mZXRjaCgpID09IEZldGNoVHlwZS5FQUdFUik7CisgICAgICAgIGlmICghYW5uby5vcHRpb25hbCgpKQorICAgICAgICAgICAgZm1kLnNldE51bGxWYWx1ZShGaWVsZE1ldGFEYXRhLk5VTExfRVhDRVBUSU9OKTsKKyAgICAgICAgc2V0Q2FzY2FkZXMoZm1kLCBhbm5vLmNhc2NhZGUoKSk7CisgICAgICAgIGlmIChhbm5vLmVtYmVkZGVkKCkpIHsKKyAgICAgICAgICAgIGlmICghSmF2YVR5cGVzLm1heWJlUEMoZm1kLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLW1ldGEtYW5ubyIsIGZtZCwKKyAgICAgICAgICAgICAgICAgICAgIlBlcnNpc3RlbnQoZW1iZWRkZWQ9dHJ1ZSkiKSk7CisgICAgICAgICAgICBmbWQuc2V0RW1iZWRkZWQodHJ1ZSk7CisgICAgICAgICAgICBpZiAoZm1kLmdldEVtYmVkZGVkTWV0YURhdGEoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZtZC5hZGRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAUGVyc2lzdGVudENvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGVyc2lzdGVudENvbGxlY3Rpb24oRmllbGRNZXRhRGF0YSBmbWQsCisgICAgICAgIFBlcnNpc3RlbnRDb2xsZWN0aW9uIGFubm8pIHsKKyAgICAgICAgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLkFSUkFZCisgICAgICAgICAgICAmJiBmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5DT0xMRUNUSU9OKQorICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0YS1hbm5vIiwgZm1kLAorICAgICAgICAgICAgICAgICJQZXJzaXN0ZW50Q29sbGVjdGlvbiIpKTsKKworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoYW5uby5tYXBwZWRCeSgpKSkKKyAgICAgICAgICAgIGZtZC5zZXRNYXBwZWRCeShhbm5vLm1hcHBlZEJ5KCkpOworICAgICAgICBmbWQuc2V0SW5EZWZhdWx0RmV0Y2hHcm91cChhbm5vLmZldGNoKCkgPT0gRmV0Y2hUeXBlLkVBR0VSKTsKKyAgICAgICAgaWYgKGFubm8uZWxlbWVudFR5cGUoKSAhPSB2b2lkLmNsYXNzKQorICAgICAgICAgICAgZm1kLmdldEVsZW1lbnQoKS5zZXREZWNsYXJlZFR5cGUoYW5uby5lbGVtZW50VHlwZSgpKTsKKyAgICAgICAgc2V0Q2FzY2FkZXMoZm1kLmdldEVsZW1lbnQoKSwgYW5uby5lbGVtZW50Q2FzY2FkZSgpKTsKKyAgICAgICAgaWYgKGFubm8uZWxlbWVudEVtYmVkZGVkKCkpIHsKKyAgICAgICAgICAgIGlmICghSmF2YVR5cGVzLm1heWJlUEMoZm1kLmdldEVsZW1lbnQoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0YS1hbm5vIiwgZm1kLAorICAgICAgICAgICAgICAgICAgICAiUGVyc2lzdGVudENvbGxlY3Rpb24oZW1iZWRkZWRFbGVtZW50PXRydWUpIikpOworICAgICAgICAgICAgZm1kLmdldEVsZW1lbnQoKS5zZXRFbWJlZGRlZCh0cnVlKTsKKyAgICAgICAgICAgIGlmIChmbWQuZ2V0RWxlbWVudCgpLmdldEVtYmVkZGVkTWV0YURhdGEoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuYWRkRW1iZWRkZWRNZXRhRGF0YSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgQFBlcnNpc3RlbnRNYXAuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGVyc2lzdGVudE1hcChGaWVsZE1ldGFEYXRhIGZtZCwgUGVyc2lzdGVudE1hcCBhbm5vKSB7CisgICAgICAgIGlmIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpICE9IEphdmFUeXBlcy5NQVApCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tZXRhLWFubm8iLCBmbWQsCisgICAgICAgICAgICAgICAgIlBlcnNpc3RlbnRNYXAiKSk7CisKKyAgICAgICAgZm1kLnNldEluRGVmYXVsdEZldGNoR3JvdXAoYW5uby5mZXRjaCgpID09IEZldGNoVHlwZS5FQUdFUik7CisgICAgICAgIGlmIChhbm5vLmtleVR5cGUoKSAhPSB2b2lkLmNsYXNzKQorICAgICAgICAgICAgZm1kLmdldEtleSgpLnNldERlY2xhcmVkVHlwZShhbm5vLmtleVR5cGUoKSk7CisgICAgICAgIGlmIChhbm5vLmVsZW1lbnRUeXBlKCkgIT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgIGZtZC5nZXRFbGVtZW50KCkuc2V0RGVjbGFyZWRUeXBlKGFubm8uZWxlbWVudFR5cGUoKSk7CisgICAgICAgIHNldENhc2NhZGVzKGZtZC5nZXRLZXkoKSwgYW5uby5rZXlDYXNjYWRlKCkpOworICAgICAgICBzZXRDYXNjYWRlcyhmbWQuZ2V0RWxlbWVudCgpLCBhbm5vLmVsZW1lbnRDYXNjYWRlKCkpOworICAgICAgICBpZiAoYW5uby5rZXlFbWJlZGRlZCgpKSB7CisgICAgICAgICAgICBpZiAoIUphdmFUeXBlcy5tYXliZVBDKGZtZC5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0YS1hbm5vIiwgZm1kLAorICAgICAgICAgICAgICAgICAgICAiUGVyc2lzdGVudE1hcChlbWJlZGRlZEtleT10cnVlKSIpKTsKKyAgICAgICAgICAgIGZtZC5nZXRLZXkoKS5zZXRFbWJlZGRlZCh0cnVlKTsKKyAgICAgICAgICAgIGlmIChmbWQuZ2V0S2V5KCkuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgZm1kLmdldEtleSgpLmFkZEVtYmVkZGVkTWV0YURhdGEoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYW5uby5lbGVtZW50RW1iZWRkZWQoKSkgeworICAgICAgICAgICAgaWYgKCFKYXZhVHlwZXMubWF5YmVQQyhmbWQuZ2V0RWxlbWVudCgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tZXRhLWFubm8iLCBmbWQsCisgICAgICAgICAgICAgICAgICAgICJQZXJzaXN0ZW50TWFwKGVtYmVkZGVkVmFsdWU9dHJ1ZSkiKSk7CisgICAgICAgICAgICBmbWQuZ2V0RWxlbWVudCgpLnNldEVtYmVkZGVkKHRydWUpOworICAgICAgICAgICAgaWYgKGZtZC5nZXRFbGVtZW50KCkuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgZm1kLmdldEVsZW1lbnQoKS5hZGRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY2FzY2FkZXMgb24gcmVsYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENhc2NhZGVzKFZhbHVlTWV0YURhdGEgdm1kLCBDYXNjYWRlVHlwZVtdIGNhc2NhZGVzKSB7CisgICAgICAgIGZvciAoQ2FzY2FkZVR5cGUgY2FzY2FkZSA6IGNhc2NhZGVzKSB7CisgICAgICAgICAgICBpZiAoY2FzY2FkZSA9PSBDYXNjYWRlVHlwZS5BTEwgfHwgY2FzY2FkZSA9PSBDYXNjYWRlVHlwZS5SRU1PVkUpCisgICAgICAgICAgICAgICAgdm1kLnNldENhc2NhZGVEZWxldGUoVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSk7CisgICAgICAgICAgICBpZiAoY2FzY2FkZSA9PSBDYXNjYWRlVHlwZS5BTEwgfHwgY2FzY2FkZSA9PSBDYXNjYWRlVHlwZS5QRVJTSVNUKQorICAgICAgICAgICAgICAgIHZtZC5zZXRDYXNjYWRlUGVyc2lzdChWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKTsKKyAgICAgICAgICAgIGlmIChjYXNjYWRlID09IENhc2NhZGVUeXBlLkFMTCB8fCBjYXNjYWRlID09IENhc2NhZGVUeXBlLk1FUkdFKQorICAgICAgICAgICAgICAgIHZtZC5zZXRDYXNjYWRlQXR0YWNoKFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9JTU1FRElBVEUpOworICAgICAgICAgICAgaWYgKGNhc2NhZGUgPT0gQ2FzY2FkZVR5cGUuQUxMIHx8IGNhc2NhZGUgPT0gQ2FzY2FkZVR5cGUuUkVGUkVTSCkKKyAgICAgICAgICAgICAgICB2bWQuc2V0Q2FzY2FkZVJlZnJlc2goVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBAU2VxdWVuY2VHZW5lcmF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2VxdWVuY2VHZW5lcmF0b3IoQW5ub3RhdGVkRWxlbWVudCBlbCwKKyAgICAgICAgU2VxdWVuY2VHZW5lcmF0b3IgZ2VuKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2VuLm5hbWUoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXNlcS1uYW1lIiwgZWwpKTsKKworICAgICAgICBpZiAoX2xvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGFyc2Utc2VxdWVuY2UiLCBuYW1lKSk7CisKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YSBtZXRhID0gZ2V0UmVwb3NpdG9yeSgpLmdldENhY2hlZFNlcXVlbmNlTWV0YURhdGEKKyAgICAgICAgICAgIChuYW1lKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIF9sb2cud2FybihfbG9jLmdldCgiZHVwLXNlcXVlbmNlIiwgbmFtZSwgZWwpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBuZXcgc2VxdWVuY2UKKyAgICAgICAgbWV0YSA9IGdldFJlcG9zaXRvcnkoKS5hZGRTZXF1ZW5jZU1ldGFEYXRhKG5hbWUpOworICAgICAgICBTdHJpbmcgc2VxID0gZ2VuLnNlcXVlbmNlTmFtZSgpOworICAgICAgICBpbnQgaW5pdGlhbCA9IGdlbi5pbml0aWFsVmFsdWUoKTsKKyAgICAgICAgaW50IGFsbG9jYXRlID0gZ2VuLmFsbG9jYXRpb25TaXplKCk7CisgICAgICAgIC8vIGRvbid0IGFsbG93IGluaXRpYWwgb2YgMCBiL2MgbG9va3MgbGlrZSBkZWYgdmFsdWUKKyAgICAgICAgaWYgKGluaXRpYWwgPT0gMCkKKyAgICAgICAgICAgIGluaXRpYWwgPSAxOworCisgICAgICAgIC8vIGNyZWF0ZSBwbHVnaW4gc3RyaW5nIGZyb20gaW5mbworICAgICAgICBTdHJpbmcgY2xzTmFtZSwgcHJvcHM7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHNlcSkpIHsKKyAgICAgICAgICAgIGNsc05hbWUgPSBTZXF1ZW5jZU1ldGFEYXRhLklNUExfTkFUSVZFOworICAgICAgICAgICAgcHJvcHMgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHNlcS5pbmRleE9mKCcoJykgIT0gLTEpIC8vIHBsdWdpbgorICAgICAgICB7CisgICAgICAgICAgICBjbHNOYW1lID0gQ29uZmlndXJhdGlvbnMuZ2V0Q2xhc3NOYW1lKHNlcSk7CisgICAgICAgICAgICBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLmdldFByb3BlcnRpZXMoc2VxKTsKKyAgICAgICAgICAgIHNlcSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbHNOYW1lID0gU2VxdWVuY2VNZXRhRGF0YS5JTVBMX05BVElWRTsKKyAgICAgICAgICAgIHByb3BzID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEuc2V0U2VxdWVuY2VQbHVnaW4oQ29uZmlndXJhdGlvbnMuZ2V0UGx1Z2luKGNsc05hbWUsIHByb3BzKSk7CisgICAgICAgIG1ldGEuc2V0U2VxdWVuY2Uoc2VxKTsKKyAgICAgICAgbWV0YS5zZXRJbml0aWFsVmFsdWUoaW5pdGlhbCk7CisgICAgICAgIG1ldGEuc2V0QWxsb2NhdGUoYWxsb2NhdGUpOworICAgICAgICBtZXRhLnNldFNvdXJjZShnZXRTb3VyY2VGaWxlKCksIChlbCBpbnN0YW5jZW9mIENsYXNzKSA/IGVsIDogbnVsbCwKKyAgICAgICAgICAgIG1ldGEuU1JDX0FOTk9UQVRJT05TKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBATmFtZWRRdWVyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VOYW1lZFF1ZXJpZXMoQW5ub3RhdGVkRWxlbWVudCBlbCwgTmFtZWRRdWVyeS4uLiBxdWVyaWVzKSB7CisgICAgICAgIFF1ZXJ5TWV0YURhdGEgbWV0YTsKKyAgICAgICAgZm9yIChOYW1lZFF1ZXJ5IHF1ZXJ5IDogcXVlcmllcykgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocXVlcnkubmFtZSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXF1ZXJ5LW5hbWUiLCBlbCkpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocXVlcnkucXVlcnkoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1xdWVyeS1zdHJpbmciLAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5uYW1lKCksIGVsKSk7CisKKyAgICAgICAgICAgIGlmIChfbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgX2xvZy50cmFjZShfbG9jLmdldCgicGFyc2UtcXVlcnkiLCBxdWVyeS5uYW1lKCkpKTsKKworICAgICAgICAgICAgbWV0YSA9IGdldFJlcG9zaXRvcnkoKS5nZXRDYWNoZWRRdWVyeU1ldGFEYXRhKG51bGwsIHF1ZXJ5Lm5hbWUoKSk7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImR1cC1xdWVyeSIsIHF1ZXJ5Lm5hbWUoKSwgZWwpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuYWRkUXVlcnlNZXRhRGF0YShudWxsLCBxdWVyeS5uYW1lKCkpOworICAgICAgICAgICAgbWV0YS5zZXRRdWVyeVN0cmluZyhxdWVyeS5xdWVyeSgpKTsKKyAgICAgICAgICAgIG1ldGEuc2V0TGFuZ3VhZ2UoSlBRTFBhcnNlci5MQU5HX0pQUUwpOworICAgICAgICAgICAgZm9yIChRdWVyeUhpbnQgaGludCA6IHF1ZXJ5LmhpbnRzKCkpCisgICAgICAgICAgICAgICAgbWV0YS5hZGRIaW50KGhpbnQubmFtZSgpLCBoaW50LnZhbHVlKCkpOworCisgICAgICAgICAgICBtZXRhLnNldFNvdXJjZShnZXRTb3VyY2VGaWxlKCksIChlbCBpbnN0YW5jZW9mIENsYXNzKSA/IGVsIDogbnVsbCwKKyAgICAgICAgICAgICAgICBtZXRhLlNSQ19BTk5PVEFUSU9OUyk7CisgICAgICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoTU9ERV9NRVRBKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoTU9ERV9NQVBQSU5HKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoTU9ERV9RVUVSWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBATmFtZWROYXRpdmVRdWVyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VOYW1lZE5hdGl2ZVF1ZXJpZXMoQW5ub3RhdGVkRWxlbWVudCBlbCwKKyAgICAgICAgTmFtZWROYXRpdmVRdWVyeS4uLiBxdWVyaWVzKSB7CisgICAgICAgIFF1ZXJ5TWV0YURhdGEgbWV0YTsKKyAgICAgICAgZm9yIChOYW1lZE5hdGl2ZVF1ZXJ5IHF1ZXJ5IDogcXVlcmllcykgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocXVlcnkubmFtZSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLW5hdGl2ZS1xdWVyeS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgZWwpKTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHF1ZXJ5LnF1ZXJ5KCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihfbG9jLmdldCgibm8tbmF0aXZlLXF1ZXJ5LXN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm5hbWUoKSwgZWwpKTsKKworICAgICAgICAgICAgaWYgKF9sb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBfbG9nLnRyYWNlKF9sb2MuZ2V0KCJwYXJzZS1uYXRpdmUtcXVlcnkiLCBxdWVyeS5uYW1lKCkpKTsKKworICAgICAgICAgICAgbWV0YSA9IGdldFJlcG9zaXRvcnkoKS5nZXRDYWNoZWRRdWVyeU1ldGFEYXRhKG51bGwsIHF1ZXJ5Lm5hbWUoKSk7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKF9sb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBfbG9nLndhcm4oX2xvYy5nZXQoImR1cC1xdWVyeSIsIHF1ZXJ5Lm5hbWUoKSwgZWwpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuYWRkUXVlcnlNZXRhRGF0YShudWxsLCBxdWVyeS5uYW1lKCkpOworICAgICAgICAgICAgbWV0YS5zZXRRdWVyeVN0cmluZyhxdWVyeS5xdWVyeSgpKTsKKyAgICAgICAgICAgIG1ldGEuc2V0TGFuZ3VhZ2UoUXVlcnlMYW5ndWFnZXMuTEFOR19TUUwpOworICAgICAgICAgICAgQ2xhc3MgcmVzID0gcXVlcnkucmVzdWx0Q2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChJbXBsSGVscGVyLmlzTWFuYWdlZFR5cGUocmVzKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldENhbmRpZGF0ZVR5cGUocmVzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCF2b2lkLmNsYXNzLmVxdWFscyhyZXMpKQorICAgICAgICAgICAgICAgIG1ldGEuc2V0UmVzdWx0VHlwZShyZXMpOworCisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkocXVlcnkucmVzdWx0U2V0TWFwcGluZygpKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldFJlc3VsdFNldE1hcHBpbmdOYW1lKHF1ZXJ5LnJlc3VsdFNldE1hcHBpbmcoKSk7CisKKyAgICAgICAgICAgIG1ldGEuc2V0U291cmNlKGdldFNvdXJjZUZpbGUoKSwgKGVsIGluc3RhbmNlb2YgQ2xhc3MpID8gZWwgOiBudWxsLAorICAgICAgICAgICAgICAgIG1ldGEuU1JDX0FOTk9UQVRJT05TKTsKKyAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX01FVEEpOworICAgICAgICAgICAgZWxzZSBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX01BUFBJTkcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX1FVRVJZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZEtleSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgX21ldGhvZDsKKworICAgICAgICBwdWJsaWMgTWV0aG9kS2V5KE1ldGhvZCBtKSB7CisgICAgICAgICAgICBfbWV0aG9kID0gbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgY29kZSA9IDQ2ICogMTIgKyBfbWV0aG9kLmdldE5hbWUoKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgZm9yIChDbGFzcyBwYXJhbSA6IF9tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSkKKyAgICAgICAgICAgICAgICBjb2RlID0gNDYgKiBjb2RlICsgcGFyYW0uaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiBjb2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWV0aG9kS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBNZXRob2Qgb3RoZXIgPSAoKE1ldGhvZEtleSkgbykuX21ldGhvZDsKKyAgICAgICAgICAgIGlmICghX21ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoX21ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLAorICAgICAgICAgICAgICAgIG90aGVyLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0aG9kQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZENvbXBhcmF0b3IgSU5TVEFOQ0UgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kQ29tcGFyYXRvciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIGlmIChJTlNUQU5DRSA9PSBudWxsKQorICAgICAgICAgICAgICAgIElOU1RBTkNFID0gbmV3IE1ldGhvZENvbXBhcmF0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgTWV0aG9kIG0xID0gKE1ldGhvZCkgbzE7CisgICAgICAgICAgICBNZXRob2QgbTIgPSAoTWV0aG9kKSBvMjsKKworICAgICAgICAgICAgQ2xhc3MgYzEgPSBtMS5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICAgICAgQ2xhc3MgYzIgPSBtMi5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICAgICAgaWYgKCFjMS5lcXVhbHMoYzIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMxLmlzQXNzaWduYWJsZUZyb20oYzIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgZWxzZQorCQkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWludCBjb21wYXJlID0gbTEuZ2V0TmFtZSAoKS5jb21wYXJlVG8gKG0yLmdldE5hbWUgKCkpOworCQkJaWYgKGNvbXBhcmUgPT0gMCkKKwkJCQlyZXR1cm4gbTEuaGFzaENvZGUgKCkgLSBtMi5oYXNoQ29kZSAoKTsKKwkJCXJldHVybiBjb21wYXJlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0FyZ3VtZW50RXhjZXB0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvQXJndW1lbnRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0FyZ3VtZW50RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKKworLyoqCisgKiBFeHRlbmRlZCB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBBcmd1bWVudEV4Y2VwdGlvbgorICAgIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIEV4Y2VwdGlvbkluZm8geworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfZmF0YWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgX2ZhaWxlZCA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVGhyb3dhYmxlW10gX25lc3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlW10gbmVzdGVkLCBPYmplY3QgZmFpbGVkLAorICAgICAgICBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIF9uZXN0ZWQgPSBuZXN0ZWQ7CisgICAgICAgIF9mYWlsZWQgPSBmYWlsZWQ7CisgICAgICAgIF9mYXRhbCA9IGZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlIG1zZywgVGhyb3dhYmxlW10gbmVzdGVkLCBPYmplY3QgZmFpbGVkLAorICAgICAgICBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHRoaXMobXNnLmdldE1lc3NhZ2UoKSwgbmVzdGVkLCBmYWlsZWQsIGZhdGFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBVU0VSOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGYXRhbCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VFeGNlcHRpb25zLmdldENhdXNlKF9uZXN0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGVbXSBnZXROZXN0ZWRUaHJvd2FibGVzKCkgeworICAgICAgICByZXR1cm4gKF9uZXN0ZWQgPT0gbnVsbCkgPyBFeGNlcHRpb25zLkVNUFRZX1RIUk9XQUJMRVMgOiBfbmVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmFpbGVkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gX2ZhaWxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gRXhjZXB0aW9ucy50b1N0cmluZyh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7CisgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIEV4Y2VwdGlvbnMucHJpbnROZXN0ZWRUaHJvd2FibGVzKHRoaXMsIG91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4oX2ZhdGFsKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KEV4Y2VwdGlvbnMucmVwbGFjZUZhaWxlZE9iamVjdChfZmFpbGVkKSk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VOZXN0ZWRUaHJvd2FibGVzKF9uZXN0ZWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgX2ZhdGFsID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgX2ZhaWxlZCA9IGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgX25lc3RlZCA9IChUaHJvd2FibGVbXSkgaW4ucmVhZE9iamVjdCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFDYWNoZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTQ1MjYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRGF0YUNhY2hlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBDYWNoaW5nIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhpcyBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBEYXRhQ2FjaGUgeworCisgICAgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgaW50IHRpbWVvdXQoKSBkZWZhdWx0IEludGVnZXIuTUlOX1ZBTFVFOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFTdG9yZUlkLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRGF0YVN0b3JlSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDY4YWVlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFTdG9yZUlkLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0aW9uVHlwZTsKKworLyoqCisgKiBEZXNjcmliZXMgaG93IHRvIGdlbmVyYXRlIGEgdmFsdWUgZm9yIGEgZmllbGQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgVFlQRSB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRGF0YVN0b3JlSWQgeworCisgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEdlbmVyYXRpb25UeXBlLkFVVE87CisKKyAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9EZXBlbmRlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9EZXBlbmRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ1Njc1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RlcGVuZGVudC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogRGVwZW5kZW50IGZpZWxkIG1hcmtlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBEZXBlbmRlbnQgeworCisgICAgYm9vbGVhbiB2YWx1ZSgpIGRlZmF1bHQgdHJ1ZTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9EZXRhY2hlZFN0YXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRGV0YWNoZWRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGJkYzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRGV0YWNoZWRTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIERldGFjaGVkIHN0YXRlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBEZXRhY2hlZFN0YXRlIHsKKworICAgIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIFN0cmluZyBmaWVsZE5hbWUoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0VsZW1lbnREZXBlbmRlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbGVtZW50RGVwZW5kZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0ZGI2OAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbGVtZW50RGVwZW5kZW50LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBEZXBlbmRlbnQgYXJyYXksIGNvbGxlY3Rpb24sIG9yIG1hcCBlbGVtZW50IG1hcmtlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBFbGVtZW50RGVwZW5kZW50IHsKKworICAgIGJvb2xlYW4gdmFsdWUoKSBkZWZhdWx0IHRydWU7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRWxlbWVudFR5cGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbGVtZW50VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDI0MjMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRWxlbWVudFR5cGUuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEluZGljYXRlcyB0aGUgcGVyc2lzdGVudCBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXksIGNvbGxlY3Rpb24sIG9yIG1hcAorICogZmllbGQsIGlmIGRpZmZlcmVudCB0aGFuIHRoZSBkZWNsYXJlZCBlbGVtZW50IHR5cGUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudFR5cGUgeworCisgICAgQ2xhc3MgdmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbnRpdHlFeGlzdHNFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbnRpdHlFeGlzdHNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdkZDBjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0VudGl0eUV4aXN0c0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CisKKy8qKgorICogQ29uZmxpY3Qgd2l0aCBleGlzdGluZyBlbnRpdHkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRW50aXR5RXhpc3RzRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlFeGlzdHNFeGNlcHRpb24KKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgRXhjZXB0aW9uSW5mbyB7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIF9mYXRhbCA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBfZmFpbGVkID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBUaHJvd2FibGVbXSBfbmVzdGVkID0gbnVsbDsKKworICAgIHB1YmxpYyBFbnRpdHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlW10gbmVzdGVkLAorICAgICAgICBPYmplY3QgZmFpbGVkLCBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIF9uZXN0ZWQgPSBuZXN0ZWQ7CisgICAgICAgIF9mYWlsZWQgPSBmYWlsZWQ7CisgICAgICAgIF9mYXRhbCA9IGZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFNUT1JFOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFN0b3JlRXhjZXB0aW9uLk9CSkVDVF9FWElTVFM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGYXRhbCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VFeGNlcHRpb25zLmdldENhdXNlKF9uZXN0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGVbXSBnZXROZXN0ZWRUaHJvd2FibGVzKCkgeworICAgICAgICByZXR1cm4gKF9uZXN0ZWQgPT0gbnVsbCkgPyBFeGNlcHRpb25zLkVNUFRZX1RIUk9XQUJMRVMgOiBfbmVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmFpbGVkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gX2ZhaWxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gRXhjZXB0aW9ucy50b1N0cmluZyh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7CisgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIEV4Y2VwdGlvbnMucHJpbnROZXN0ZWRUaHJvd2FibGVzKHRoaXMsIG91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4oX2ZhdGFsKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KEV4Y2VwdGlvbnMucmVwbGFjZUZhaWxlZE9iamVjdChfZmFpbGVkKSk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VOZXN0ZWRUaHJvd2FibGVzKF9uZXN0ZWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgX2ZhdGFsID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgX2ZhaWxlZCA9IGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgX25lc3RlZCA9IChUaHJvd2FibGVbXSkgaW4ucmVhZE9iamVjdCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjE0OGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlJlZmxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5BdXRvRGV0YWNoOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkRlbGVnYXRpbmdCcm9rZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBFbnRpdHlNYW5hZ2VyRmFjdG9yeX0gdGhhdCBhY3RzIGFzIGEKKyAqIGZhY2FkZSB0byBhIHtAbGluayBCcm9rZXJGYWN0b3J5fS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgUHJ1ZCdob21tZWF1eAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsCisgICAgaW1wbGVtZW50cyBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsLmNsYXNzKTsKKworICAgIHByaXZhdGUgRGVsZWdhdGluZ0Jyb2tlckZhY3RvcnkgX2ZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IENvbnN0cnVjdG9yPEZldGNoUGxhbj4gX3BsYW4gPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFN0b3JlQ2FjaGUgX2NhY2hlID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBRdWVyeVJlc3VsdENhY2hlIF9xdWVyeUNhY2hlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IgcHJvdmlkZWQgZm9yIGF1dG8taW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBseSBkZWxlZ2F0ZSBvbiBjb25zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHVibGljIEVudGl0eU1hbmFnZXJGYWN0b3J5SW1wbChCcm9rZXJGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgc2V0QnJva2VyRmFjdG9yeShmYWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnJva2VyRmFjdG9yeSBnZXRCcm9rZXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gX2ZhY3RvcnkuZ2V0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnJva2VyRmFjdG9yeShCcm9rZXJGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgX2ZhY3RvcnkgPSBuZXcgRGVsZWdhdGluZ0Jyb2tlckZhY3RvcnkoZmFjdG9yeSwKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5UUkFOU0xBVE9SKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9mYWN0b3J5LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gX2ZhY3RvcnkuZ2V0UHJvcGVydGllcygpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7CisgICAgICAgIHJldHVybiBfZmFjdG9yeS5wdXRVc2VyT2JqZWN0KGtleSwgdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gX2ZhY3RvcnkuZ2V0VXNlck9iamVjdChrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBTdG9yZUNhY2hlIGdldFN0b3JlQ2FjaGUoKSB7CisgICAgICAgIF9mYWN0b3J5LmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfY2FjaGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBfZmFjdG9yeS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgX2NhY2hlID0gbmV3IFN0b3JlQ2FjaGVJbXBsKHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbmYuZ2V0RGF0YUNhY2hlTWFuYWdlckluc3RhbmNlKCkuZ2V0U3lzdGVtRGF0YUNhY2hlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9jYWNoZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9mYWN0b3J5LnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0b3JlQ2FjaGUgZ2V0U3RvcmVDYWNoZShTdHJpbmcgY2FjaGVOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RvcmVDYWNoZUltcGwodGhpcywgX2ZhY3RvcnkuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0RGF0YUNhY2hlTWFuYWdlckluc3RhbmNlKCkuZ2V0RGF0YUNhY2hlKGNhY2hlTmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBRdWVyeVJlc3VsdENhY2hlIGdldFF1ZXJ5UmVzdWx0Q2FjaGUoKSB7CisgICAgICAgIF9mYWN0b3J5LmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfcXVlcnlDYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9xdWVyeUNhY2hlID0gbmV3IFF1ZXJ5UmVzdWx0Q2FjaGVJbXBsKF9mYWN0b3J5LgorICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0YUNhY2hlTWFuYWdlckluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVF1ZXJ5Q2FjaGUoKSk7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5Q2FjaGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfZmFjdG9yeS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBRW50aXR5TWFuYWdlciBjcmVhdGVFbnRpdHlNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5TWFuYWdlcihudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQUVudGl0eU1hbmFnZXIgY3JlYXRlRW50aXR5TWFuYWdlcihNYXAgcHJvcHMpIHsKKyAgICAgICAgaWYgKHByb3BzID09IG51bGwpCisgICAgICAgICAgICBwcm9wcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgZWxzZSBpZiAoIXByb3BzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHByb3BzID0gbmV3IEhhc2hNYXAocHJvcHMpOworCisgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBnZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIFN0cmluZyB1c2VyID0gKFN0cmluZykgQ29uZmlndXJhdGlvbnMucmVtb3ZlUHJvcGVydHkKKyAgICAgICAgICAgICgiQ29ubmVjdGlvblVzZXJOYW1lIiwgcHJvcHMpOworICAgICAgICBpZiAodXNlciA9PSBudWxsKQorICAgICAgICAgICAgdXNlciA9IGNvbmYuZ2V0Q29ubmVjdGlvblVzZXJOYW1lKCk7CisgICAgICAgIFN0cmluZyBwYXNzID0gKFN0cmluZykgQ29uZmlndXJhdGlvbnMucmVtb3ZlUHJvcGVydHkKKyAgICAgICAgICAgICgiQ29ubmVjdGlvblBhc3N3b3JkIiwgcHJvcHMpOworICAgICAgICBpZiAocGFzcyA9PSBudWxsKQorICAgICAgICAgICAgcGFzcyA9IGNvbmYuZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCk7CisKKyAgICAgICAgU3RyaW5nIHN0ciA9IChTdHJpbmcpIENvbmZpZ3VyYXRpb25zLnJlbW92ZVByb3BlcnR5CisgICAgICAgICAgICAoIlRyYW5zYWN0aW9uTW9kZSIsIHByb3BzKTsKKyAgICAgICAgYm9vbGVhbiBtYW5hZ2VkOworICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgICAgICBtYW5hZ2VkID0gY29uZi5pc1RyYW5zYWN0aW9uTW9kZU1hbmFnZWQoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBWYWx1ZSB2YWwgPSBjb25mLmdldFZhbHVlKCJUcmFuc2FjdGlvbk1vZGUiKTsKKyAgICAgICAgICAgIG1hbmFnZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWwudW5hbGlhcyhzdHIpKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBvYmogPSBDb25maWd1cmF0aW9ucy5yZW1vdmVQcm9wZXJ0eSgiQ29ubmVjdGlvblJldGFpbk1vZGUiLCAKKyAgICAgICAgICAgIHByb3BzKTsKKyAgICAgICAgaW50IHJldGFpbk1vZGU7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgICAgICByZXRhaW5Nb2RlID0gKChOdW1iZXIpIG9iaikuaW50VmFsdWUoKTsKKyAgICAgICAgZWxzZSBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXRhaW5Nb2RlID0gY29uZi5nZXRDb25uZWN0aW9uUmV0YWluTW9kZUNvbnN0YW50KCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgVmFsdWUgdmFsID0gY29uZi5nZXRWYWx1ZSgiQ29ubmVjdGlvblJldGFpbk1vZGUiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0YWluTW9kZSA9IEludGVnZXIucGFyc2VJbnQodmFsLnVuYWxpYXMoKFN0cmluZykgb2JqKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLWVtLXByb3AiLAorICAgICAgICAgICAgICAgICAgICAib3BlbmpwYS5Db25uZWN0aW9uUmV0YWluTW9kZSIsIG9iaiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJvd2FibGVbXXsgZSB9LCBvYmosIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQnJva2VyIGJyb2tlciA9IF9mYWN0b3J5Lm5ld0Jyb2tlcih1c2VyLCBwYXNzLCBtYW5hZ2VkLCByZXRhaW5Nb2RlLAorICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgCisgICAgICAgIC8vIGFkZCBhdXRvZGV0YWNoIGZvciBjbG9zZSBhbmQgcm9sbGJhY2sgY29uZGl0aW9ucyB0byB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICBicm9rZXIuc2V0QXV0b0RldGFjaChBdXRvRGV0YWNoLkRFVEFDSF9DTE9TRSwgdHJ1ZSk7CisgICAgICAgIGJyb2tlci5zZXRBdXRvRGV0YWNoKEF1dG9EZXRhY2guREVUQUNIX1JPTExCQUNLLCB0cnVlKTsKKyAgICAgICAgCisgICAgICAgIGJyb2tlci5zZXREZXRhY2hlZE5ldyhmYWxzZSk7CisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGVtID0gbmV3RW50aXR5TWFuYWdlckltcGwoYnJva2VyKTsKKworICAgICAgICAvLyBhbGxvdyBzZXR0aW5nIG9mIG90aGVyIGJlYW4gcHJvcGVydGllcyBvZiBFTQorICAgICAgICBTdHJpbmdbXSBwcmVmaXhlcyA9IFByb2R1Y3REZXJpdmF0aW9ucy5nZXRDb25maWd1cmF0aW9uUHJlZml4ZXMoKTsKKyAgICAgICAgTGlzdDxSdW50aW1lRXhjZXB0aW9uPiBlcnJzID0gbnVsbDsKKyAgICAgICAgTWV0aG9kIHNldHRlciA9IG51bGw7CisgICAgICAgIFN0cmluZyBwcm9wLCBwcmVmaXg7CisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIGZvciAoTWFwLkVudHJ5IGVudHJ5IDogKFNldDxNYXAuRW50cnk+KSBwcm9wcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBwcm9wID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeGVzW2ldICsgIi4iOworICAgICAgICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgocHJlZml4KSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbDsgCisgICAgICAgICAgICB9IAorICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgICAgIHByb3AgPSBwcm9wLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXR0ZXIgPSBSZWZsZWN0aW9uLmZpbmRTZXR0ZXIoZW0uZ2V0Q2xhc3MoKSwgcHJvcCwgdHJ1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXJycyA9IG5ldyBMaW5rZWRMaXN0PFJ1bnRpbWVFeGNlcHRpb24+KCk7CisgICAgICAgICAgICAgICAgZXJycy5hZGQoUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oa2UpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIm51bGwiLmVxdWFscyh2YWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gU3RyaW5ncy5wYXJzZSgoU3RyaW5nKSB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVyLmdldFBhcmFtZXRlclR5cGVzKClbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSZWZsZWN0aW9uLnNldChlbSwgc2V0dGVyLCB2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodC5nZXRDYXVzZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldENhdXNlKCk7CisgICAgICAgICAgICAgICAgQXJndW1lbnRFeGNlcHRpb24gZXJyID0gbmV3IEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgiYmFkLWVtLXByb3AiLCBwcm9wLCBlbnRyeS5nZXRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFRocm93YWJsZVtdeyB0IH0sIG51bGwsIHRydWUpOworICAgICAgICAgICAgICAgIGlmIChlcnJzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVycnMgPSBuZXcgTGlua2VkTGlzdDxSdW50aW1lRXhjZXB0aW9uPigpOworICAgICAgICAgICAgICAgIGVycnMuYWRkKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJycyAhPSBudWxsKSB7CisgICAgICAgICAgICBlbS5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGVycnMuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgZXJycy5nZXQoMCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1lbS1wcm9wcyIpLAorICAgICAgICAgICAgICAgIChUaHJvd2FibGVbXSkgZXJycy50b0FycmF5KG5ldyBUaHJvd2FibGVbZXJycy5zaXplKCldKSwKKyAgICAgICAgICAgICAgICBudWxsLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSBtYW5hZ2VyIGFyb3VuZCB0aGUgZ2l2ZW4gYnJva2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBFbnRpdHlNYW5hZ2VySW1wbCBuZXdFbnRpdHlNYW5hZ2VySW1wbChCcm9rZXIgYnJva2VyKSB7CisgICAgICAgIHJldHVybiBuZXcgRW50aXR5TWFuYWdlckltcGwodGhpcywgYnJva2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIsIENsYXNzLi4uIGNsYXNzZXMpIHsKKyAgICAgICAgX2ZhY3RvcnkuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIsIGNsYXNzZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgICAgICBfZmFjdG9yeS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIF9mYWN0b3J5LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gIV9mYWN0b3J5LmlzQ2xvc2VkKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWN0b3J5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEVudGl0eU1hbmFnZXJGYWN0b3J5SW1wbCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfZmFjdG9yeS5lcXVhbHMoKChFbnRpdHlNYW5hZ2VyRmFjdG9yeUltcGwpIG90aGVyKS5fZmFjdG9yeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc3RvcmUtc3BlY2lmaWMgZmFjYWRlIGZvciB0aGUgZ2l2ZW4gZmV0Y2ggY29uZmlndXJhdGlvbi4KKwkgKiBJZiBubyBmYWNhZGUgY2xhc3MgZXhpc3RzLCB3ZSB1c2UgdGhlIGRlZmF1bHQge0BsaW5rIEZldGNoUGxhbn0uCisgICAgICovCisgICAgRmV0Y2hQbGFuIHRvRmV0Y2hQbGFuKEJyb2tlciBicm9rZXIsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAoZmV0Y2ggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEZldGNoQ29uZmlndXJhdGlvbiBpbm5lciA9IGZldGNoOworICAgICAgICBpZiAoaW5uZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nRmV0Y2hDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgaW5uZXIgPSAoKERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24pIGlubmVyKS4KKyAgICAgICAgICAgICAgICBnZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX3BsYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHN0b3JlVHlwZSA9IChicm9rZXIgPT0gbnVsbCkgPyBudWxsIDogYnJva2VyLgorICAgICAgICAgICAgICAgICAgICBnZXRTdG9yZU1hbmFnZXIoKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gX2ZhY3RvcnkuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgICAgICAgICBnZXRTdG9yZUZhY2FkZVR5cGVSZWdpc3RyeSgpLgorICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRhdGlvbihGZXRjaFBsYW4uY2xhc3MsIHN0b3JlVHlwZSwgCisgICAgICAgICAgICAgICAgICAgIAkJRmV0Y2hQbGFuSW1wbC5jbGFzcyk7CisgICAgICAgICAgICAgICAgX3BsYW4gPSBjbHMuZ2V0Q29uc3RydWN0b3IoRmV0Y2hDb25maWd1cmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfcGxhbi5uZXdJbnN0YW5jZShmZXRjaCk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisgICAgICAgICAgICB0aHJvdyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMudG9QZXJzaXN0ZW5jZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlckZhY3RvcnlWYWx1ZS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXJGYWN0b3J5VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZjNjAxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXJGYWN0b3J5VmFsdWUuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUGx1Z2luVmFsdWU7CisKKy8qKgorICogUGx1Z2luIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIHtAbGluayBFbnRpdHlNYW5hZ2VyRmFjdG9yeX0uIAorICoKKyAqIEBzaW5jZSAwLjQuMQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRW50aXR5TWFuYWdlckZhY3RvcnlWYWx1ZQorICAgIGV4dGVuZHMgUGx1Z2luVmFsdWUgeworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0eSBrZXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gIkVudGl0eU1hbmFnZXJGYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUxJQVNFUyA9IHsKKyAgICAgICAgImRlZmF1bHQiLCBFbnRpdHlNYW5hZ2VyRmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmFjdG9yeSBvZiB0aGUgY29uZmlndXJlZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IG5ld0ZhY3RvcnkoQnJva2VyRmFjdG9yeSBiZikgeworICAgICAgICBPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mID0gYmYuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBQbHVnaW5WYWx1ZSB2YWwgPSAoUGx1Z2luVmFsdWUpIGNvbmYuZ2V0VmFsdWUoS0VZKTsgCisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBFbnRpdHlNYW5hZ2VyRmFjdG9yeUltcGwgZW1mID0gKEVudGl0eU1hbmFnZXJGYWN0b3J5SW1wbCkgdmFsLgorICAgICAgICAgICAgaW5zdGFudGlhdGUoRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsLmNsYXNzLCBjb25mLCB0cnVlKTsKKyAgICAgICAgZW1mLnNldEJyb2tlckZhY3RvcnkoYmYpOworICAgICAgICByZXR1cm4gZW1mOworICAgIH0KKworICAgIHB1YmxpYyBFbnRpdHlNYW5hZ2VyRmFjdG9yeVZhbHVlKCkgeworICAgICAgICBzdXBlcihLRVksIGZhbHNlKTsKKyAgICAgICAgc2V0QWxpYXNlcyhBTElBU0VTKTsKKyAgICAgICAgc2V0RGVmYXVsdChBTElBU0VTWzBdKTsKKyAgICAgICAgc2V0Q2xhc3NOYW1lKEFMSUFTRVNbMV0pOworICAgICAgICBzZXRTY29wZShnZXRDbGFzcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlckltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbnRpdHlNYW5hZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmZkMjQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlckltcGwuamF2YQpAQCAtMCwwICsxLDExMzAgQEAKKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eVRyYW5zYWN0aW9uOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GbHVzaE1vZGVUeXBlOw0KK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Mb2NrTW9kZVR5cGU7DQoraW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5Ow0KK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5SZXNvdXJjZUV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25NZXRhRGF0YTsNCitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLkludGVyYWN0aW9uOw0KK2ltcG9ydCBqYXZheC5yZXNvdXJjZS5jY2kuTG9jYWxUcmFuc2FjdGlvbjsNCitpbXBvcnQgamF2YXgucmVzb3VyY2UuY2NpLlJlc3VsdFNldEluZm87DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVlLk1hbmFnZWRSdW50aW1lOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5EZWxlZ2F0aW5nQnJva2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZpbmRDYWxsYmFja3M7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuTG9ja0xldmVsczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcENhbGxiYWNrczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5PcGVuSlBBU3RhdGVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5Rmx1c2hNb2RlczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeUxhbmd1YWdlczsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXE7DQoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuanBxbC5KUFFMUGFyc2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5GaWVsZE1ldGFEYXRhOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5RdWVyeU1ldGFEYXRhOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5SdW50aW1lRXhjZXB0aW9uVHJhbnNsYXRvcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsNCisNCisvKioNCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgRW50aXR5TWFuYWdlcn0gaW50ZXJmYWNlLg0KKyAqDQorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkNCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQ0KKyAqIEBub2phdmFkb2MNCisgKi8NCitwdWJsaWMgY2xhc3MgRW50aXR5TWFuYWdlckltcGwNCisgICAgaW1wbGVtZW50cyBPcGVuSlBBRW50aXR5TWFuYWdlciwgRmluZENhbGxiYWNrcywgT3BDYWxsYmFja3Mgew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlDQorICAgICAgICAoRW50aXR5TWFuYWdlckltcGwuY2xhc3MpOw0KKw0KKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdCcm9rZXIgX2Jyb2tlcjsNCisgICAgcHJpdmF0ZSBmaW5hbCBFbnRpdHlNYW5hZ2VyRmFjdG9yeUltcGwgX2VtZjsNCisgICAgcHJpdmF0ZSBGZXRjaFBsYW4gX2ZldGNoID0gbnVsbDsNCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgZmFjdG9yeSBhbmQgZGVsZWdhdGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgRW50aXR5TWFuYWdlckltcGwoRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsIGZhY3RvcnksDQorICAgICAgICBCcm9rZXIgYnJva2VyKSB7DQorICAgICAgICBfZW1mID0gZmFjdG9yeTsNCisgICAgICAgIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQ0KKyAgICAgICAgICAgIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5nZXRSb2xsYmFja1RyYW5zbGF0b3IodGhpcyk7DQorICAgICAgICBfYnJva2VyID0gbmV3IERlbGVnYXRpbmdCcm9rZXIoYnJva2VyLCB0cmFuc2xhdG9yKTsNCisgICAgICAgIF9icm9rZXIuc2V0SW1wbGljaXRCZWhhdmlvcih0aGlzLCB0cmFuc2xhdG9yKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQnJva2VyIGRlbGVnYXRlLg0KKyAgICAgKi8NCisgICAgcHVibGljIEJyb2tlciBnZXRCcm9rZXIoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXREZWxlZ2F0ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDb25uZWN0aW9uTWV0YURhdGEgZ2V0TWV0YURhdGEoKQ0KKyAgICAgICAgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldE1ldGFEYXRhKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEludGVyYWN0aW9uIGNyZWF0ZUludGVyYWN0aW9uKCkNCisgICAgICAgIHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbiB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmNyZWF0ZUludGVyYWN0aW9uKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIExvY2FsVHJhbnNhY3Rpb24gZ2V0TG9jYWxUcmFuc2FjdGlvbigpDQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisNCisgICAgcHVibGljIFJlc3VsdFNldEluZm8gZ2V0UmVzdWx0U2V0SW5mbygpDQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0UmVzdWx0U2V0SW5mbygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkgZ2V0RW50aXR5TWFuYWdlckZhY3RvcnkoKSB7DQorICAgICAgICByZXR1cm4gX2VtZjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT3BlbkpQQUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGdldEZldGNoUGxhbigpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5sb2NrKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGlmIChfZmV0Y2ggPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgX2ZldGNoID0gX2VtZi50b0ZldGNoUGxhbihfYnJva2VyLA0KKyAgICAgICAgICAgICAgICAgICAgX2Jyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKSk7DQorICAgICAgICAgICAgcmV0dXJuIF9mZXRjaDsNCisgICAgICAgIH0gZmluYWxseSB7DQorICAgICAgICAgICAgX2Jyb2tlci51bmxvY2soKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25SZXRhaW5Nb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Q29ubmVjdGlvblJldGFpbk1vZGUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWQoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5pc01hbmFnZWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWFuYWdlZFJ1bnRpbWUgZ2V0TWFuYWdlZFJ1bnRpbWUoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRNYW5hZ2VkUnVudGltZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucygpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFN5bmNXaXRoTWFuYWdlZFRyYW5zYWN0aW9ucyhib29sZWFuIHN5bmMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5zZXRTeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbnMoc3luYyk7DQorICAgIH0NCisNCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Vc2VyTmFtZSgpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldENvbm5lY3Rpb25Vc2VyTmFtZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TXVsdGl0aHJlYWRlZCgpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldE11bHRpdGhyZWFkZWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aXRocmVhZGVkKGJvb2xlYW4gbXVsdGl0aHJlYWRlZCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnNldE11bHRpdGhyZWFkZWQobXVsdGl0aHJlYWRlZCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlQ2hhbmdlcygpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldElnbm9yZUNoYW5nZXMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVDaGFuZ2VzKGJvb2xlYW4gdmFsKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0SWdub3JlQ2hhbmdlcyh2YWwpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGdldE5vbnRyYW5zYWN0aW9uYWxSZWFkKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Tm9udHJhbnNhY3Rpb25hbFJlYWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsUmVhZChib29sZWFuIHZhbCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnNldE5vbnRyYW5zYWN0aW9uYWxSZWFkKHZhbCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKGJvb2xlYW4gdmFsKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlKHZhbCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pc3RpYygpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldE9wdGltaXN0aWMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpbWlzdGljKGJvb2xlYW4gdmFsKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0T3B0aW1pc3RpYyh2YWwpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0UmVzdG9yZVN0YXRlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0UmVzdG9yZVN0YXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UmVzdG9yZVN0YXRlKGludCB2YWwpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5zZXRSZXN0b3JlU3RhdGUodmFsKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5TdGF0ZSgpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldFJldGFpblN0YXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluU3RhdGUoYm9vbGVhbiB2YWwpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5zZXRSZXRhaW5TdGF0ZSh2YWwpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXV0b0NsZWFyKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0QXV0b0NsZWFyKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0NsZWFyKGludCB2YWwpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5zZXRBdXRvQ2xlYXIodmFsKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldERldGFjaFN0YXRlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0RGV0YWNoU3RhdGUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hTdGF0ZShpbnQgbW9kZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnNldERldGFjaFN0YXRlKG1vZGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXV0b0RldGFjaCgpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldEF1dG9EZXRhY2goKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGV0YWNoKGludCBmbGFncykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnNldEF1dG9EZXRhY2goZmxhZ3MpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXRhY2goaW50IGZsYWcsIGJvb2xlYW4gb24pIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5zZXRBdXRvRGV0YWNoKGZsYWcsIG9uKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFdmljdEZyb21TdG9yZUNhY2hlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0RXZpY3RGcm9tRGF0YUNhY2hlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0RXZpY3RGcm9tU3RvcmVDYWNoZShib29sZWFuIGV2aWN0KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0RXZpY3RGcm9tRGF0YUNhY2hlKGV2aWN0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQb3B1bGF0ZVN0b3JlQ2FjaGUoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRQb3B1bGF0ZURhdGFDYWNoZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFBvcHVsYXRlU3RvcmVDYWNoZShib29sZWFuIGNhY2hlKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0UG9wdWxhdGVEYXRhQ2FjaGUoY2FjaGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzTGFyZ2VUcmFuc2FjdGlvbigpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmlzTGFyZ2VUcmFuc2FjdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldExhcmdlVHJhbnNhY3Rpb24oYm9vbGVhbiBsYXJnZVRyYW5zYWN0aW9uKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0TGFyZ2VUcmFuc2FjdGlvbihsYXJnZVRyYW5zYWN0aW9uKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0VXNlck9iamVjdChrZXkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIHJldHVybiBfYnJva2VyLnB1dFVzZXJPYmplY3Qoa2V5LCB2YWwpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zYWN0aW9uTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYWRkVHJhbnNhY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVHJhbnNhY3Rpb25MaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5yZW1vdmVUcmFuc2FjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldFRyYW5zYWN0aW9uTGlzdGVuZXJDYWxsYmFja01vZGUoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25MaXN0ZW5lckNhbGxiYWNrTW9kZShpbnQgbW9kZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnNldFRyYW5zYWN0aW9uTGlzdGVuZXJDYWxsYmFja01vZGUobW9kZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyLCBDbGFzcy4uLiBjbGFzc2VzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIsIGNsYXNzZXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldExpZmVjeWNsZUxpc3RlbmVyQ2FsbGJhY2tNb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVMaXN0ZW5lckNhbGxiYWNrTW9kZShpbnQgbW9kZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnNldExpZmVjeWNsZUxpc3RlbmVyQ2FsbGJhY2tNb2RlKG1vZGUpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0UmVmZXJlbmNlKENsYXNzPFQ+IGNscywgT2JqZWN0IG9pZCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBvaWQgPSBfYnJva2VyLm5ld09iamVjdElkKGNscywgb2lkKTsNCisgICAgICAgIHJldHVybiAoVCkgX2Jyb2tlci5maW5kKG9pZCwgZmFsc2UsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBwdWJsaWMgPFQ+IFQgZmluZChDbGFzczxUPiBjbHMsIE9iamVjdCBvaWQpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgb2lkID0gX2Jyb2tlci5uZXdPYmplY3RJZChjbHMsIG9pZCk7DQorICAgICAgICByZXR1cm4gKFQpIF9icm9rZXIuZmluZChvaWQsIHRydWUsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBwdWJsaWMgPFQ+IFRbXSBmaW5kQWxsKENsYXNzPFQ+IGNscywgT2JqZWN0Li4uIG9pZHMpIHsNCisgICAgICAgIGlmIChvaWRzLmxlbmd0aCA9PSAwKQ0KKyAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShjbHMsIDApOw0KKyAgICAgICAgQ29sbGVjdGlvbjxUPiByZXQgPSBmaW5kQWxsKGNscywgQXJyYXlzLmFzTGlzdChvaWRzKSk7DQorICAgICAgICByZXR1cm4gcmV0LnRvQXJyYXkoKFRbXSkgQXJyYXkubmV3SW5zdGFuY2UoY2xzLCByZXQuc2l6ZSgpKSk7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIHB1YmxpYyA8VD4gQ29sbGVjdGlvbjxUPiBmaW5kQWxsKGZpbmFsIENsYXNzPFQ+IGNscywgQ29sbGVjdGlvbiBvaWRzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIE9iamVjdFtdIG9ianMgPSBfYnJva2VyLmZpbmRBbGwob2lkcywgdHJ1ZSwgbmV3IEZpbmRDYWxsYmFja3MoKSB7DQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBwcm9jZXNzQXJndW1lbnQoT2JqZWN0IG9pZCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb2tlci5uZXdPYmplY3RJZChjbHMsIG9pZCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcHJvY2Vzc1JldHVybihPYmplY3Qgb2lkLCBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlNYW5hZ2VySW1wbC50aGlzLnByb2Nlc3NSZXR1cm4ob2lkLCBzbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSk7DQorICAgICAgICByZXR1cm4gKENvbGxlY3Rpb248VD4pIEFycmF5cy5hc0xpc3Qob2Jqcyk7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIHB1YmxpYyA8VD4gVCBmaW5kQ2FjaGVkKENsYXNzPFQ+IGNscywgT2JqZWN0IG9pZCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gKFQpIF9icm9rZXIuZmluZENhY2hlZChfYnJva2VyLm5ld09iamVjdElkKGNscywgb2lkKSwgdGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIENsYXNzIGdldE9iamVjdElkQ2xhc3MoQ2xhc3MgY2xzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIHJldHVybiBPcGVuSlBBUGVyc2lzdGVuY2UuZnJvbU9wZW5KUEFPYmplY3RJZENsYXNzDQorICAgICAgICAgICAgICAgIChfYnJva2VyLmdldE9iamVjdElkVHlwZShjbHMpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgRW50aXR5VHJhbnNhY3Rpb24gZ2V0VHJhbnNhY3Rpb24oKSB7DQorICAgICAgICBpZiAoX2Jyb2tlci5pc01hbmFnZWQoKSkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJnZXQtbWFuYWdlZC10cmFucyIpLA0KKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBmYWxzZSk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBqb2luVHJhbnNhY3Rpb24oKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIGlmICghX2Jyb2tlci5zeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbigpKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uKF9sb2MuZ2V0DQorICAgICAgICAgICAgICAgICgibm8tbWFuYWdlZC10cmFucyIpLCBudWxsLCBudWxsLCBmYWxzZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYmVnaW4oKSB7DQorICAgICAgICBfYnJva2VyLmJlZ2luKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgY29tbWl0KCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBfYnJva2VyLmNvbW1pdCgpOw0KKyAgICAgICAgfSBjYXRjaCAoUm9sbGJhY2tFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIHRocm93IGU7DQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIHRocm93IGU7DQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIC8vIFJvbGxiYWNrRXhjZXB0aW9ucyBhcmUgc3BlY2lhbCBhbmQgYXJlbid0IGhhbmRsZWQgYnkgdGhlDQorICAgICAgICAgICAgLy8gbm9ybWFsIGV4Y2VwdGlvbiB0cmFuc2xhdG9yLCBzaW5jZSB0aGUgc3BlYyBzYXlzIHRoZXkNCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgdGhyb3duIHdoZW5ldmVyIHRoZSBjb21taXQgZmFpbHMgZm9yIGFueSByZWFzb24gYXQNCisgICAgICAgICAgICAvLyBhbGwsIHdoZXJhcyB0aGUgZXhjZXB0aW9uIHRyYW5zbGF0b3IgaGFuZGxlcyBleGNlcHRpb25zIHRoYXQNCisgICAgICAgICAgICAvLyBhcmUgY2F1c2VkIGZvciBzcGVjaWZpYyByZWFzb25zDQorICAgICAgICAgICAgdGhyb3cgbmV3IFJvbGxiYWNrRXhjZXB0aW9uKGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgew0KKyAgICAgICAgX2Jyb2tlci5yb2xsYmFjaygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGNvbW1pdEFuZFJlc3VtZSgpIHsNCisgICAgICAgIF9icm9rZXIuY29tbWl0QW5kUmVzdW1lKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tBbmRSZXN1bWUoKSB7DQorICAgICAgICBfYnJva2VyLnJvbGxiYWNrQW5kUmVzdW1lKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFRocm93YWJsZSBnZXRSb2xsYmFja0NhdXNlKCkgew0KKyAgICAgICAgaWYgKCFpc0FjdGl2ZSgpKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXRyYW5zYWN0aW9uIikNCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7DQorDQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRSb2xsYmFja0NhdXNlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Um9sbGJhY2tPbmx5KCkgew0KKyAgICAgICAgaWYgKCFpc0FjdGl2ZSgpKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXRyYW5zYWN0aW9uIikNCisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7DQorDQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRSb2xsYmFja09ubHkoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoKSB7DQorICAgICAgICBfYnJva2VyLnNldFJvbGxiYWNrT25seSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFJvbGxiYWNrT25seShUaHJvd2FibGUgY2F1c2UpIHsNCisgICAgICAgIF9icm9rZXIuc2V0Um9sbGJhY2tPbmx5KGNhdXNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlcG9pbnQoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5zZXRTYXZlcG9pbnQobmFtZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludCgpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5yb2xsYmFja1RvU2F2ZXBvaW50KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnJvbGxiYWNrVG9TYXZlcG9pbnQobmFtZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludCgpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5yZWxlYXNlU2F2ZXBvaW50KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnJlbGVhc2VTYXZlcG9pbnQobmFtZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYXNzZXJ0T3BlbigpOw0KKyAgICAgICAgX2Jyb2tlci5hc3NlcnRBY3RpdmVUcmFuc2FjdGlvbigpOw0KKyAgICAgICAgX2Jyb2tlci5mbHVzaCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHByZUZsdXNoKCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnByZUZsdXNoKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDaGFuZ2VzKCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnZhbGlkYXRlQ2hhbmdlcygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgew0KKyAgICAgICAgcmV0dXJuIGlzT3BlbigpICYmIF9icm9rZXIuaXNBY3RpdmUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0b3JlQWN0aXZlKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuaXNTdG9yZUFjdGl2ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGJlZ2luU3RvcmUoKSB7DQorICAgICAgICBfYnJva2VyLmJlZ2luU3RvcmUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgZW50aXR5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gX2Jyb2tlci5nZXRTdGF0ZU1hbmFnZXIoZW50aXR5KTsNCisgICAgICAgIGlmIChzbSA9PSBudWxsICYmICFJbXBsSGVscGVyLmlzTWFuYWdlZFR5cGUoZW50aXR5LmdldENsYXNzKCkpKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihfbG9jLmdldCgibm90LWVudGl0eSIsDQorICAgICAgICAgICAgICAgIGVudGl0eS5nZXRDbGFzcygpKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7DQorICAgICAgICByZXR1cm4gc20gIT0gbnVsbCAmJiAhc20uaXNEZWxldGVkKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0Li4uIGVudGl0aWVzKSB7DQorICAgICAgICBmb3IgKE9iamVjdCBlbnRpdHkgOiBlbnRpdGllcykNCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGVudGl0eSkpDQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gZW50aXRpZXMpIHsNCisgICAgICAgIGZvciAoT2JqZWN0IGVudGl0eSA6IGVudGl0aWVzKQ0KKyAgICAgICAgICAgIGlmICghY29udGFpbnMoZW50aXR5KSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcGVyc2lzdChPYmplY3QgZW50aXR5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIucGVyc2lzdChlbnRpdHksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHBlcnNpc3RBbGwoT2JqZWN0Li4uIGVudGl0aWVzKSB7DQorICAgICAgICBwZXJzaXN0QWxsKEFycmF5cy5hc0xpc3QoZW50aXRpZXMpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBwZXJzaXN0QWxsKENvbGxlY3Rpb24gZW50aXRpZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5wZXJzaXN0QWxsKGVudGl0aWVzLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGVudGl0eSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLmRlbGV0ZShlbnRpdHksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbChPYmplY3QuLi4gZW50aXRpZXMpIHsNCisgICAgICAgIHJlbW92ZUFsbChBcnJheXMuYXNMaXN0KGVudGl0aWVzKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKENvbGxlY3Rpb24gZW50aXRpZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5kZWxldGVBbGwoZW50aXRpZXMsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoT2JqZWN0IGVudGl0eSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnJlbGVhc2UoZW50aXR5LCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQWxsKENvbGxlY3Rpb24gZW50aXRpZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5yZWxlYXNlQWxsKGVudGl0aWVzLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQWxsKE9iamVjdC4uLiBlbnRpdGllcykgew0KKyAgICAgICAgcmVsZWFzZUFsbChBcnJheXMuYXNMaXN0KGVudGl0aWVzKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgZW50aXR5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYXNzZXJ0V3JpdGVPcGVyYXRpb24oKTsNCisgICAgICAgIF9icm9rZXIucmVmcmVzaChlbnRpdHksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hBbGwoKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYXNzZXJ0V3JpdGVPcGVyYXRpb24oKTsNCisgICAgICAgIF9icm9rZXIucmVmcmVzaEFsbChfYnJva2VyLmdldFRyYW5zYWN0aW9uYWxPYmplY3RzKCksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hBbGwoQ29sbGVjdGlvbiBlbnRpdGllcykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLmFzc2VydFdyaXRlT3BlcmF0aW9uKCk7DQorICAgICAgICBfYnJva2VyLnJlZnJlc2hBbGwoZW50aXRpZXMsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hBbGwoT2JqZWN0Li4uIGVudGl0aWVzKSB7DQorICAgICAgICByZWZyZXNoQWxsKEFycmF5cy5hc0xpc3QoZW50aXRpZXMpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZXRyaWV2ZShPYmplY3QgZW50aXR5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIucmV0cmlldmUoZW50aXR5LCB0cnVlLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZXRyaWV2ZUFsbChDb2xsZWN0aW9uIGVudGl0aWVzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIucmV0cmlldmVBbGwoZW50aXRpZXMsIHRydWUsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlQWxsKE9iamVjdC4uLiBlbnRpdGllcykgew0KKyAgICAgICAgcmV0cmlldmVBbGwoQXJyYXlzLmFzTGlzdChlbnRpdGllcykpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGV2aWN0KE9iamVjdCBlbnRpdHkpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5ldmljdChlbnRpdHksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKENvbGxlY3Rpb24gZW50aXRpZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5ldmljdEFsbChlbnRpdGllcywgdGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoT2JqZWN0Li4uIGVudGl0aWVzKSB7DQorICAgICAgICBldmljdEFsbChBcnJheXMuYXNMaXN0KGVudGl0aWVzKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuZXZpY3RBbGwodGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuZXZpY3RBbGwoX2Jyb2tlci5uZXdFeHRlbnQoY2xzLCB0cnVlKSwgdGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoRXh0ZW50IGV4dGVudCkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLmV2aWN0QWxsKGV4dGVudC5nZXREZWxlZ2F0ZSgpLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgcHVibGljIDxUPiBUIGRldGFjaChUIGVudGl0eSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gKFQpIF9icm9rZXIuZGV0YWNoKGVudGl0eSwgdGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdFtdIGRldGFjaEFsbChPYmplY3QuLi4gZW50aXRpZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZGV0YWNoQWxsKEFycmF5cy5hc0xpc3QoZW50aXRpZXMpLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBkZXRhY2hBbGwoQ29sbGVjdGlvbiBlbnRpdGllcykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChfYnJva2VyLmRldGFjaEFsbChlbnRpdGllcywgdGhpcykpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBwdWJsaWMgPFQ+IFQgbWVyZ2UoVCBlbnRpdHkpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIChUKSBfYnJva2VyLmF0dGFjaChlbnRpdHksIHRydWUsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3RbXSBtZXJnZUFsbChPYmplY3QuLi4gZW50aXRpZXMpIHsNCisgICAgICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT0gMCkNCisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsNCisgICAgICAgIHJldHVybiBtZXJnZUFsbChBcnJheXMuYXNMaXN0KGVudGl0aWVzKSkudG9BcnJheSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIG1lcmdlQWxsKENvbGxlY3Rpb24gZW50aXRpZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoX2Jyb2tlci5hdHRhY2hBbGwoZW50aXRpZXMsIHRydWUsIHRoaXMpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsKE9iamVjdCBlbnRpdHksIGJvb2xlYW4gdXBkYXRlVmVyc2lvbikgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnRyYW5zYWN0aW9uYWwoZW50aXR5LCB1cGRhdGVWZXJzaW9uLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsQWxsKENvbGxlY3Rpb24gb2JqcywgYm9vbGVhbiB1cGRhdGVWZXJzaW9uKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIudHJhbnNhY3Rpb25hbEFsbChvYmpzLCB1cGRhdGVWZXJzaW9uLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsQWxsKE9iamVjdFtdIG9ianMsIGJvb2xlYW4gdXBkYXRlVmVyc2lvbikgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLnRyYW5zYWN0aW9uYWxBbGwoQXJyYXlzLmFzTGlzdChvYmpzKSwgdXBkYXRlVmVyc2lvbiwgdGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgbm9udHJhbnNhY3Rpb25hbChPYmplY3QgZW50aXR5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIubm9udHJhbnNhY3Rpb25hbChlbnRpdHksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIG5vbnRyYW5zYWN0aW9uYWxBbGwoQ29sbGVjdGlvbiBvYmpzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIubm9udHJhbnNhY3Rpb25hbEFsbChvYmpzLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBub250cmFuc2FjdGlvbmFsQWxsKE9iamVjdFtdIG9ianMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5ub250cmFuc2FjdGlvbmFsQWxsKEFycmF5cy5hc0xpc3Qob2JqcyksIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBHZW5lcmF0b3IgZ2V0TmFtZWRHZW5lcmF0b3IoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhIG1ldGEgPSBfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS4NCisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS5nZXRTZXF1ZW5jZU1ldGFEYXRhKG5hbWUsDQorICAgICAgICAgICAgICAgIF9icm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSk7DQorICAgICAgICAgICAgU2VxIHNlcSA9IG1ldGEuZ2V0SW5zdGFuY2UoX2Jyb2tlci5nZXRDbGFzc0xvYWRlcigpKTsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRvckltcGwoc2VxLCBuYW1lLCBfYnJva2VyLCBudWxsKTsNCisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsNCisgICAgICAgICAgICB0aHJvdyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMudG9QZXJzaXN0ZW5jZUV4Y2VwdGlvbihyZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIEdlbmVyYXRvciBnZXRJZEdlbmVyYXRvcihDbGFzcyBmb3JDbGFzcykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IF9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLg0KKyAgICAgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLmdldE1ldGFEYXRhKGZvckNsYXNzLA0KKyAgICAgICAgICAgICAgICBfYnJva2VyLmdldENsYXNzTG9hZGVyKCksIHRydWUpOw0KKyAgICAgICAgICAgIFNlcSBzZXEgPSBfYnJva2VyLmdldElkZW50aXR5U2VxdWVuY2UobWV0YSk7DQorICAgICAgICAgICAgcmV0dXJuIChzZXEgPT0gbnVsbCkgPyBudWxsIDogbmV3IEdlbmVyYXRvckltcGwoc2VxLCBudWxsLCBfYnJva2VyLA0KKyAgICAgICAgICAgICAgICBtZXRhKTsNCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIEdlbmVyYXRvciBnZXRGaWVsZEdlbmVyYXRvcihDbGFzcyBmb3JDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IF9icm9rZXIuZ2V0Q29uZmlndXJhdGlvbigpLg0KKyAgICAgICAgICAgICAgICBnZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLmdldE1ldGFEYXRhKGZvckNsYXNzLA0KKyAgICAgICAgICAgICAgICBfYnJva2VyLmdldENsYXNzTG9hZGVyKCksIHRydWUpOw0KKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gbWV0YS5nZXRGaWVsZChmaWVsZE5hbWUpOw0KKyAgICAgICAgICAgIGlmIChmbWQgPT0gbnVsbCkNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0KCJuby1uYW1lZC1maWVsZCIsDQorICAgICAgICAgICAgICAgICAgICBmb3JDbGFzcywgZmllbGROYW1lKSwgbnVsbCwgbnVsbCwgZmFsc2UpOw0KKw0KKyAgICAgICAgICAgIFNlcSBzZXEgPSBfYnJva2VyLmdldFZhbHVlU2VxdWVuY2UoZm1kKTsNCisgICAgICAgICAgICByZXR1cm4gKHNlcSA9PSBudWxsKSA/IG51bGwgOiBuZXcgR2VuZXJhdG9ySW1wbChzZXEsIG51bGwsIF9icm9rZXIsDQorICAgICAgICAgICAgICAgIG1ldGEpOw0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB0aHJvdyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMudG9QZXJzaXN0ZW5jZUV4Y2VwdGlvbihlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgPFQ+IEV4dGVudDxUPiBjcmVhdGVFeHRlbnQoQ2xhc3M8VD4gY2xzLCBib29sZWFuIHN1YmNsYXNzZXMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnRJbXBsPFQ+KHRoaXMsIF9icm9rZXIubmV3RXh0ZW50KGNscywgc3ViY2xhc3NlcykpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgY3JlYXRlUXVlcnkoU3RyaW5nIHF1ZXJ5KSB7DQorICAgICAgICByZXR1cm4gY3JlYXRlUXVlcnkoSlBRTFBhcnNlci5MQU5HX0pQUUwsIHF1ZXJ5KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNyZWF0ZVF1ZXJ5KFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIHF1ZXJ5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIHJldHVybiBuZXcgUXVlcnlJbXBsKHRoaXMsIF9icm9rZXIubmV3UXVlcnkobGFuZ3VhZ2UsIHF1ZXJ5KSk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBjcmVhdGVRdWVyeShRdWVyeSBxdWVyeSkgew0KKyAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVF1ZXJ5KChTdHJpbmcpIG51bGwpOw0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5IHEgPSAoKFF1ZXJ5SW1wbCkgcXVlcnkpLmdldERlbGVnYXRlKCk7DQorICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5SW1wbCh0aGlzLCBfYnJva2VyLm5ld1F1ZXJ5KHEuZ2V0TGFuZ3VhZ2UoKSwNCisgICAgICAgICAgICBxKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBjcmVhdGVOYW1lZFF1ZXJ5KFN0cmluZyBuYW1lKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYXNzZXJ0T3BlbigpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBRdWVyeU1ldGFEYXRhIG1ldGEgPSBfYnJva2VyLmdldENvbmZpZ3VyYXRpb24oKS4NCisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS5nZXRRdWVyeU1ldGFEYXRhKG51bGwsIG5hbWUsDQorICAgICAgICAgICAgICAgIF9icm9rZXIuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSk7DQorICAgICAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeSBkZWwgPQ0KKyAgICAgICAgICAgICAgICBfYnJva2VyLm5ld1F1ZXJ5KG1ldGEuZ2V0TGFuZ3VhZ2UoKSwgbnVsbCk7DQorICAgICAgICAgICAgbWV0YS5zZXRJbnRvKGRlbCk7DQorICAgICAgICAgICAgZGVsLmNvbXBpbGUoKTsNCisNCisgICAgICAgICAgICBPcGVuSlBBUXVlcnkgcSA9IG5ldyBRdWVyeUltcGwodGhpcywgZGVsKTsNCisgICAgICAgICAgICBTdHJpbmdbXSBoaW50cyA9IG1ldGEuZ2V0SGludEtleXMoKTsNCisgICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBtZXRhLmdldEhpbnRWYWx1ZXMoKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpbnRzLmxlbmd0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICBxLnNldEhpbnQoaGludHNbaV0sIHZhbHVlc1tpXSk7DQorICAgICAgICAgICAgcmV0dXJuIHE7DQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7DQorICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24ocmUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgY3JlYXRlTmF0aXZlUXVlcnkoU3RyaW5nIHF1ZXJ5KSB7DQorICAgICAgICB2YWxpZGF0ZVNRTChxdWVyeSk7DQorICAgICAgICByZXR1cm4gY3JlYXRlUXVlcnkoUXVlcnlMYW5ndWFnZXMuTEFOR19TUUwsIHF1ZXJ5KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBxdWVyeSwgQ2xhc3MgY2xzKSB7DQorICAgICAgICByZXR1cm4gY3JlYXRlTmF0aXZlUXVlcnkocXVlcnkpLnNldFJlc3VsdENsYXNzKGNscyk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgcXVlcnksIFN0cmluZyBtYXBwaW5nTmFtZSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICB2YWxpZGF0ZVNRTChxdWVyeSk7DQorICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5IGtlcm5lbFF1ZXJ5ID0gX2Jyb2tlci5uZXdRdWVyeSgNCisgICAgICAgICAgICBRdWVyeUxhbmd1YWdlcy5MQU5HX1NRTCwgcXVlcnkpOw0KKyAgICAgICAga2VybmVsUXVlcnkuc2V0UmVzdWx0TWFwcGluZyhudWxsLCBtYXBwaW5nTmFtZSk7DQorICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5SW1wbCh0aGlzLCBrZXJuZWxRdWVyeSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIHVzZXIgcHJvdmlkZWQgU1FMLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNRTChTdHJpbmcgcXVlcnkpIHsNCisgICAgICAgIGlmIChTdHJpbmdVdGlscy50cmltVG9OdWxsKHF1ZXJ5KSA9PSBudWxsKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihfbG9jLmdldCgibm8tc3FsIiksIG51bGwsIG51bGwsIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRGbHVzaE1vZGUoRmx1c2hNb2RlVHlwZSBmbHVzaE1vZGUpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5hc3NlcnRPcGVuKCk7DQorICAgICAgICBfYnJva2VyLmdldEZldGNoQ29uZmlndXJhdGlvbigpLnNldEZsdXNoQmVmb3JlUXVlcmllcw0KKyAgICAgICAgICAgICh0b0ZsdXNoQmVmb3JlUXVlcmllcyhmbHVzaE1vZGUpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgRmx1c2hNb2RlVHlwZSBnZXRGbHVzaE1vZGUoKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuYXNzZXJ0T3BlbigpOw0KKyAgICAgICAgcmV0dXJuIGZyb21GbHVzaEJlZm9yZVF1ZXJpZXMoX2Jyb2tlci5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKS4NCisgICAgICAgICAgICBnZXRGbHVzaEJlZm9yZVF1ZXJpZXMoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyYW5zbGF0ZSBvdXIgaW50ZXJuYWwgZmx1c2ggY29uc3RhbnQgdG8gYSBmbHVzaCBtb2RlIGVudW0gdmFsdWUuDQorICAgICAqLw0KKyAgICBzdGF0aWMgRmx1c2hNb2RlVHlwZSBmcm9tRmx1c2hCZWZvcmVRdWVyaWVzKGludCBmbHVzaCkgew0KKyAgICAgICAgc3dpdGNoIChmbHVzaCkgew0KKyAgICAgICAgICAgIGNhc2UgUXVlcnlGbHVzaE1vZGVzLkZMVVNIX1RSVUU6DQorICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaE1vZGVUeXBlLkFVVE87DQorICAgICAgICAgICAgY2FzZSBRdWVyeUZsdXNoTW9kZXMuRkxVU0hfRkFMU0U6DQorICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaE1vZGVUeXBlLkNPTU1JVDsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVHJhbnNsYXRlIGEgZmx1c2ggbW9kZSBlbnVtIHZhbHVlIHRvIG91ciBpbnRlcm5hbCBmbHVzaCBjb25zdGFudC4NCisgICAgICovDQorICAgIHN0YXRpYyBpbnQgdG9GbHVzaEJlZm9yZVF1ZXJpZXMoRmx1c2hNb2RlVHlwZSBmbHVzaE1vZGUpIHsNCisgICAgICAgIC8vIGNob29zZSBkZWZhdWx0IGZvciBudWxsDQorICAgICAgICBpZiAoZmx1c2hNb2RlID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIFF1ZXJ5Rmx1c2hNb2Rlcy5GTFVTSF9XSVRIX0NPTk5FQ1RJT047DQorICAgICAgICBpZiAoZmx1c2hNb2RlID09IEZsdXNoTW9kZVR5cGUuQVVUTykNCisgICAgICAgICAgICByZXR1cm4gUXVlcnlGbHVzaE1vZGVzLkZMVVNIX1RSVUU7DQorICAgICAgICBpZiAoZmx1c2hNb2RlID09IEZsdXNoTW9kZVR5cGUuQ09NTUlUKQ0KKyAgICAgICAgICAgIHJldHVybiBRdWVyeUZsdXNoTW9kZXMuRkxVU0hfRkFMU0U7DQorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oZmx1c2hNb2RlLnRvU3RyaW5nKCksIG51bGwsIG51bGwsIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5kZXRhY2hBbGwodGhpcywgZmFsc2UpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVsZWdhdGUoKSB7DQorICAgICAgICBfYnJva2VyLmFzc2VydE9wZW4oKTsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisNCisgICAgcHVibGljIExvY2tNb2RlVHlwZSBnZXRMb2NrTW9kZShPYmplY3QgZW50aXR5KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIHJldHVybiBmcm9tTG9ja0xldmVsKF9icm9rZXIuZ2V0TG9ja0xldmVsKGVudGl0eSkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IGVudGl0eSwgTG9ja01vZGVUeXBlIG1vZGUpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5sb2NrKGVudGl0eSwgdG9Mb2NrTGV2ZWwobW9kZSksIC0xLCB0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBsb2NrKE9iamVjdCBlbnRpdHkpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5sb2NrKGVudGl0eSwgdGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgbG9jayhPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbW9kZSwgaW50IHRpbWVvdXQpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgX2Jyb2tlci5sb2NrKGVudGl0eSwgdG9Mb2NrTGV2ZWwobW9kZSksIHRpbWVvdXQsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGxvY2tBbGwoQ29sbGVjdGlvbiBlbnRpdGllcykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICBfYnJva2VyLmxvY2tBbGwoZW50aXRpZXMsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGxvY2tBbGwoQ29sbGVjdGlvbiBlbnRpdGllcywgTG9ja01vZGVUeXBlIG1vZGUsIGludCB0aW1lb3V0KSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIubG9ja0FsbChlbnRpdGllcywgdG9Mb2NrTGV2ZWwobW9kZSksIHRpbWVvdXQsIHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGxvY2tBbGwoT2JqZWN0Li4uIGVudGl0aWVzKSB7DQorICAgICAgICBsb2NrQWxsKEFycmF5cy5hc0xpc3QoZW50aXRpZXMpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBsb2NrQWxsKE9iamVjdFtdIGVudGl0aWVzLCBMb2NrTW9kZVR5cGUgbW9kZSwgaW50IHRpbWVvdXQpIHsNCisgICAgICAgIGxvY2tBbGwoQXJyYXlzLmFzTGlzdChlbnRpdGllcyksIG1vZGUsIHRpbWVvdXQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUcmFuc2xhdGUgb3VyIGludGVybmFsIGxvY2sgbGV2ZWwgdG8gYSBqYXZheC5wZXJzaXN0ZW5jZSBlbnVtIHZhbHVlLg0KKyAgICAgKi8NCisgICAgc3RhdGljIExvY2tNb2RlVHlwZSBmcm9tTG9ja0xldmVsKGludCBsZXZlbCkgew0KKyAgICAgICAgaWYgKGxldmVsIDwgTG9ja0xldmVscy5MT0NLX1JFQUQpDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICBpZiAobGV2ZWwgPCBMb2NrTGV2ZWxzLkxPQ0tfV1JJVEUpDQorICAgICAgICAgICAgcmV0dXJuIExvY2tNb2RlVHlwZS5SRUFEOw0KKyAgICAgICAgcmV0dXJuIExvY2tNb2RlVHlwZS5XUklURTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVHJhbnNsYXRlIHRoZSBqYXZheC5wZXJzaXN0ZW5jZSBlbnVtIHZhbHVlIHRvIG91ciBpbnRlcm5hbCBsb2NrIGxldmVsLg0KKyAgICAgKi8NCisgICAgc3RhdGljIGludCB0b0xvY2tMZXZlbChMb2NrTW9kZVR5cGUgbW9kZSkgew0KKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkNCisgICAgICAgICAgICByZXR1cm4gTG9ja0xldmVscy5MT0NLX05PTkU7DQorICAgICAgICBpZiAobW9kZSA9PSBMb2NrTW9kZVR5cGUuUkVBRCkNCisgICAgICAgICAgICByZXR1cm4gTG9ja0xldmVscy5MT0NLX1JFQUQ7DQorICAgICAgICBpZiAobW9kZSA9PSBMb2NrTW9kZVR5cGUuV1JJVEUpDQorICAgICAgICAgICAgcmV0dXJuIExvY2tMZXZlbHMuTE9DS19XUklURTsNCisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihtb2RlLnRvU3RyaW5nKCksIG51bGwsIG51bGwsIHRydWUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbEFsbCgpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmNhbmNlbEFsbCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29ubmVjdGlvbigpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldENvbm5lY3Rpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNYW5hZ2VkT2JqZWN0cygpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldE1hbmFnZWRPYmplY3RzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0VHJhbnNhY3Rpb25hbE9iamVjdHMoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5nZXRUcmFuc2FjdGlvbmFsT2JqZWN0cygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBlbmRpbmdUcmFuc2FjdGlvbmFsT2JqZWN0cygpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldFBlbmRpbmdUcmFuc2FjdGlvbmFsT2JqZWN0cygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldERpcnR5T2JqZWN0cygpIHsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldERpcnR5T2JqZWN0cygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGdldE9yZGVyRGlydHlPYmplY3RzKCkgew0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZ2V0T3JkZXJEaXJ0eU9iamVjdHMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckRpcnR5T2JqZWN0cyhib29sZWFuIG9yZGVyKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuc2V0T3JkZXJEaXJ0eU9iamVjdHMob3JkZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGRpcnR5Q2xhc3MoQ2xhc3MgY2xzKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuZGlydHlUeXBlKGNscyk7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPENsYXNzPiBnZXRQZXJzaXN0ZWRDbGFzc2VzKCkgew0KKyAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uPENsYXNzPikgX2Jyb2tlci5nZXRQZXJzaXN0ZWRUeXBlcygpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxDbGFzcz4gZ2V0VXBkYXRlZENsYXNzZXMoKSB7DQorICAgICAgICByZXR1cm4gKENvbGxlY3Rpb248Q2xhc3M+KSBfYnJva2VyLmdldFVwZGF0ZWRUeXBlcygpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxDbGFzcz4gZ2V0UmVtb3ZlZENsYXNzZXMoKSB7DQorICAgICAgICByZXR1cm4gKENvbGxlY3Rpb248Q2xhc3M+KSBfYnJva2VyLmdldERlbGV0ZWRUeXBlcygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyA8VD4gVCBjcmVhdGVJbnN0YW5jZShDbGFzczxUPiBjbHMpIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIChUKSBfYnJva2VyLm5ld0luc3RhbmNlKGNscyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIF9icm9rZXIuY2xvc2UoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7DQorICAgICAgICByZXR1cm4gIV9icm9rZXIuaXNDbG9zZUludm9rZWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBkaXJ0eShPYmplY3QgbywgU3RyaW5nIGZpZWxkKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20gPSBfYnJva2VyLmdldFN0YXRlTWFuYWdlcihvKTsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpDQorICAgICAgICAgICAgICAgIHNtLmRpcnR5KGZpZWxkKTsNCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJZChPYmplY3Qgbykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gT3BlbkpQQVBlcnNpc3RlbmNlLmZyb21PcGVuSlBBT2JqZWN0SWQoX2Jyb2tlci5nZXRPYmplY3RJZChvKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eShPYmplY3Qgbykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5pc0RpcnR5KG8pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbChPYmplY3Qgbykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5pc1RyYW5zYWN0aW9uYWwobyk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KE9iamVjdCBvKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmlzUGVyc2lzdGVudChvKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05ld2x5UGVyc2lzdGVudChPYmplY3Qgbykgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5pc05ldyhvKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWQoT2JqZWN0IG8pIHsNCisgICAgICAgIGFzc2VydE5vdENsb3NlSW52b2tlZCgpOw0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuaXNEZWxldGVkKG8pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQoT2JqZWN0IGVudGl0eSkgew0KKyAgICAgICAgYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5pc0RldGFjaGVkKGVudGl0eSk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRWZXJzaW9uKE9iamVjdCBvKSB7DQorICAgICAgICBhc3NlcnROb3RDbG9zZUludm9rZWQoKTsNCisgICAgICAgIHJldHVybiBfYnJva2VyLmdldFZlcnNpb24obyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRocm93IGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBpZiBjbG9zZSBoYXMgYmVlbiBpbnZva2VkIGJ1dCB0aGUgYnJva2VyDQorICAgICAqIGlzIHN0aWxsIG9wZW4uICBXZSB0ZXN0IG9ubHkgZm9yIHRoaXMgYmVjYXVzZSBpZiB0aGUgYnJva2VyIGlzIGFscmVhZHkNCisgICAgICogY2xvc2VkLCBpdCB3aWxsIHRocm93IGl0cyBvd24gbW9yZSBpbmZvcm1hdGl2ZSBleGNlcHRpb24gd2hlbiB3ZSANCisgICAgICogZGVsZWdhdGUgdGhlIHBlbmRpbmcgb3BlcmF0aW9uIHRvIGl0Lg0KKyAgICAgKi8NCisgICAgdm9pZCBhc3NlcnROb3RDbG9zZUludm9rZWQoKSB7DQorICAgICAgICBpZiAoIV9icm9rZXIuaXNDbG9zZWQoKSAmJiBfYnJva2VyLmlzQ2xvc2VJbnZva2VkKCkpDQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldCgiY2xvc2UtaW52b2tlZCIpLCBudWxsLA0KKyAgICAgICAgICAgICAgICBudWxsLCB0cnVlKTsNCisgICAgfQ0KKw0KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyAgICAvLyBGaW5kQ2FsbGJhY2tzIGltcGxlbWVudGF0aW9uDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgIHB1YmxpYyBPYmplY3QgcHJvY2Vzc0FyZ3VtZW50KE9iamVjdCBhcmcpIHsNCisgICAgICAgIHJldHVybiBhcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBwcm9jZXNzUmV0dXJuKE9iamVjdCBvaWQsIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsNCisgICAgICAgIHJldHVybiAoc20gPT0gbnVsbCB8fCBzbS5pc0RlbGV0ZWQoKSkgPyBudWxsIDogc20uZ2V0TWFuYWdlZEluc3RhbmNlKCk7DQorICAgIH0NCisNCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorICAgIC8vIE9wQ2FsbGJhY2tzIGltcGxlbWVudGF0aW9uDQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKyAgICBwdWJsaWMgaW50IHByb2Nlc3NBcmd1bWVudChpbnQgb3AsIE9iamVjdCBvYmosIE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20pIHsNCisgICAgICAgIHN3aXRjaCAob3ApIHsNCisgICAgICAgICAgICBjYXNlIE9QX0RFTEVURToNCisgICAgICAgICAgICAgICAgLy8gY2FzY2FkZSB0aHJvdWdoIG5vbi1wZXJzaXN0ZW50IG5vbi1kZXRhY2hlZCBpbnN0YW5jZXMNCisgICAgICAgICAgICAgICAgaWYgKHNtID09IG51bGwgJiYgIV9icm9rZXIuaXNEZXRhY2hlZChvYmopKQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFDVF9DQVNDQURFOw0KKyAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiAhc20uaXNEZXRhY2hlZCgpICYmICFzbS5pc1BlcnNpc3RlbnQoKSkNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBQ1RfQ0FTQ0FERTsNCisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGRlbGV0ZWQgaW5zdGFuY2VzDQorICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsICYmIHNtLmlzRGVsZXRlZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFDVF9OT05FOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIE9QX0FUVEFDSDoNCisgICAgICAgICAgICAgICAgLy8gZGllIG9uIHJlbW92ZWQNCisgICAgICAgICAgICAgICAgaWYgKHNtICE9IG51bGwgJiYgc20uaXNEZWxldGVkKCkpDQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbihfbG9jLmdldCgicmVtb3ZlZCIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ucy50b1N0cmluZyhvYmopKSkuc2V0RmFpbGVkT2JqZWN0KG9iaik7DQorICAgICAgICAgICAgICAgIC8vIGNhc2NhZGUgdGhyb3VnaCBtYW5hZ2VkIGluc3RhbmNlcw0KKyAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCAmJiAhc20uaXNEZXRhY2hlZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFDVF9DQVNDQURFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIE9QX1JFRlJFU0g6DQorICAgICAgICAgICAgICAgIC8vIGRpZSBvbiB1bm1hbmFnZWQgaW5zdGFuY2VzDQorICAgICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24oX2xvYy5nZXQoIm5vdC1tYW5hZ2VkIiwNCisgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLnRvU3RyaW5nKG9iaikpKS5zZXRGYWlsZWRPYmplY3Qob2JqKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gQUNUX1JVTiB8IEFDVF9DQVNDQURFOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gX2Jyb2tlci5oYXNoQ29kZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsNCisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBFbnRpdHlNYW5hZ2VySW1wbCkpDQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgcmV0dXJuIF9icm9rZXIuZXF1YWxzKCgoRW50aXR5TWFuYWdlckltcGwpIG90aGVyKS5fYnJva2VyKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRW50aXR5Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZjNhOTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRW50aXR5Tm90Rm91bmRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworCisvKioKKyAqIE1pc3NpbmcgZW50aXR5LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBFeGNlcHRpb25JbmZvIHsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gX2ZhdGFsID0gZmFsc2U7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IF9mYWlsZWQgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFRocm93YWJsZVtdIF9uZXN0ZWQgPSBudWxsOworCisgICAgcHVibGljIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZVtdIG5lc3RlZCwKKyAgICAgICAgT2JqZWN0IGZhaWxlZCwgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBfbmVzdGVkID0gbmVzdGVkOworICAgICAgICBfZmFpbGVkID0gZmFpbGVkOworICAgICAgICBfZmF0YWwgPSBmYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBTVE9SRTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdG9yZUV4Y2VwdGlvbi5PQkpFQ1RfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWwoKSB7CisgICAgICAgIHJldHVybiBfZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5nZXRDYXVzZShfbmVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlW10gZ2V0TmVzdGVkVGhyb3dhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIChfbmVzdGVkID09IG51bGwpID8gRXhjZXB0aW9ucy5FTVBUWV9USFJPV0FCTEVTIDogX25lc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbnMudG9TdHJpbmcodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgeworICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVCb29sZWFuKF9mYXRhbCk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VGYWlsZWRPYmplY3QoX2ZhaWxlZCkpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlTmVzdGVkVGhyb3dhYmxlcyhfbmVzdGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIF9mYXRhbCA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIF9mYWlsZWQgPSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIF9uZXN0ZWQgPSAoVGhyb3dhYmxlW10pIGluLnJlYWRPYmplY3QoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI3M2FlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVudC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW4gZXh0ZW50IGlzIGEgbG9naWNhbCB2aWV3IG9mIGFsbCBpbnN0YW5jZXMgb2YgYSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKiBAcHVibGlzaGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZW50PFQ+CisgICAgZXh0ZW5kcyBJdGVyYWJsZTxUPiB7CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5FeHRlbnQgZ2V0RGVsZWdhdGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBleHRlbnQncyBlbGVtZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzPFQ+IGdldEVsZW1lbnRDbGFzcygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZXh0ZW50IGluY2x1ZGVzIHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViY2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogVGhlIG93bmluZyBlbnRpdHkgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQUVudGl0eU1hbmFnZXIgZ2V0RW50aXR5TWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogRmV0Y2ggY29uZmlndXJhdGlvbiBmb3IgY29udHJvbGxpbmcgaG93IGl0ZXJhdGVkIG9iamVjdHMgYXJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGdldEZldGNoUGxhbigpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZXh0ZW50IHNlZXMgaW5zZXJ0cyBhbmQgZGVsZXRlcyBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBleHRlbnQgc2VlcyBpbnNlcnRzIGFuZCBkZWxldGVzIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBpZ25vcmVDaGFuZ2VzKTsKKworICAgIC8qKgorICAgICAqIExpc3QgdGhlIGV4dGVudCBjb250ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUPiBsaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhbGwgb3BlbiBpdGVyYXRvcnMgdGhhdCBhcmUgY29uc3VtaW5nIGRhdGFiYXNlIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUFsbCgpOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVudEltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2OGJmOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlbnRJbXBsLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5EZWxlZ2F0aW5nRXh0ZW50OworCisvKioKKyAqIEFuIGV4dGVudCBpcyBhIGxvZ2ljYWwgdmlldyBvZiBhbGwgaW5zdGFuY2VzIG9mIGEgY2xhc3MuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgRXh0ZW50SW1wbDxUPgorICAgIGltcGxlbWVudHMgRXh0ZW50PFQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgRW50aXR5TWFuYWdlckltcGwgX2VtOworICAgIHByaXZhdGUgZmluYWwgRGVsZWdhdGluZ0V4dGVudCBfZXh0ZW50OworICAgIHByaXZhdGUgRmV0Y2hQbGFuIF9mZXRjaCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbnRJbXBsKEVudGl0eU1hbmFnZXJJbXBsIGVtLAorICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkV4dGVudCBleHRlbnQpIHsKKyAgICAgICAgX2VtID0gZW07CisgICAgICAgIF9leHRlbnQgPSBuZXcgRGVsZWdhdGluZ0V4dGVudChleHRlbnQsCisgICAgICAgICAgICBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuZ2V0Um9sbGJhY2tUcmFuc2xhdG9yKGVtKSk7CisgICAgfQorCisgICAgcHVibGljIG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRXh0ZW50IGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX2V4dGVudC5nZXREZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzczxUPiBnZXRFbGVtZW50Q2xhc3MoKSB7CisgICAgICAgIHJldHVybiBfZXh0ZW50LmdldEVsZW1lbnRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViY2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIF9leHRlbnQuaGFzU3ViY2xhc3NlcygpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBRW50aXR5TWFuYWdlciBnZXRFbnRpdHlNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gX2VtOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gZ2V0RmV0Y2hQbGFuKCkgeworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIF9leHRlbnQubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9mZXRjaCA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9mZXRjaCA9ICgoRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsKSBfZW0uCisgICAgICAgICAgICAgICAgICAgIGdldEVudGl0eU1hbmFnZXJGYWN0b3J5KCkpLnRvRmV0Y2hQbGFuKF9leHRlbnQuZ2V0QnJva2VyKCksCisgICAgICAgICAgICAgICAgICAgIF9leHRlbnQuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9leHRlbnQudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCkgeworICAgICAgICByZXR1cm4gX2V4dGVudC5nZXRJZ25vcmVDaGFuZ2VzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hhbmdlcyhib29sZWFuIGlnbm9yZUNoYW5nZXMpIHsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICBfZXh0ZW50LnNldElnbm9yZUNoYW5nZXMoaWdub3JlQ2hhbmdlcyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VD4gbGlzdCgpIHsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICByZXR1cm4gX2V4dGVudC5saXN0KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIHJldHVybiBfZXh0ZW50Lml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoKSB7CisgICAgICAgIF9leHRlbnQuY2xvc2VBbGwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gX2V4dGVudC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBFeHRlbnRJbXBsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9leHRlbnQuZXF1YWxzKCgoRXh0ZW50SW1wbCkgb3RoZXIpLl9leHRlbnQpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlcm5hbFZhbHVlcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVybmFsVmFsdWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4OWVkNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlcm5hbFZhbHVlcy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogTWFwcyBmaWVsZCB2YWx1ZXMgdG8gdGhlaXIgZGF0YXN0b3JlIGVxdWl2YWxlbnRzLiBFYWNoIGVsZW1lbnQgb2YKKyAqIHRoZSB2YWx1ZSBhcnJheSBzaG91bGQgYmUgYSBzdHJpbmcgaW4gdGhlIGZvcm06CisgKiA8Y29kZT4mbHQ7ZmllbGQgdmFsdWUmZ3Q7PSZsdDtkYXRhc3RvcmUgdmFsdWUmZ3Q7PC9jb2RlPgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEV4dGVybmFsVmFsdWVzIHsKKworICAgIFN0cmluZ1tdIHZhbHVlKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlcm5hbGl6ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9FeHRlcm5hbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU5ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVybmFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogRGVjbGFyZXMgYSBtZXRob2QgdGhhdCB0cmFuc2Zvcm1zIHRoZSBmaWVsZCB2YWx1ZSB0byBpdHMgZGF0YXN0b3JlCisgKiBlcXVpdmFsZW50LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEV4dGVybmFsaXplciB7CisKKyAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZhY3RvcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2MjJmNAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBEZWNsYXJlcyBhIG1ldGhvZCB0aGF0IHRyYW5zZm9ybXMgdGhlIGRhdGFzdG9yZSB2YWx1ZSB0byBpdHMgZmllbGQKKyAqIGVxdWl2YWxlbnQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRmFjdG9yeSB7CisKKyAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoQXR0cmlidXRlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRmV0Y2hBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODljOGZmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBJbmNsdWRlcyBhIHBlcnNpc3RlbnQgYXR0cmlidXRlIGluIGEge0BsaW5rIEZldGNoR3JvdXB9LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7fSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEZldGNoQXR0cmlidXRlIHsKKworICAgIC8qKgorICAgICAqIEluY2x1ZGVkIGZpZWxkL3Byb3BlcnR5IG5hbWUuCisgICAgICovCisgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogUmVjdXJzaW9uIGRlcHRoIGZvciByZWxhdGlvbiBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQgcmVjdXJzaW9uRGVwdGgoKSBkZWZhdWx0IEludGVnZXIuTUlOX1ZBTFVFOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoR3JvdXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaEdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYzhhOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaEdyb3VwLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBGZXRjaCBncm91cCBkZWZpbml0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IFRZUEUgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEZldGNoR3JvdXAgeworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBmZXRjaCBncm91cC4KKyAgICAgKi8KKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGxvYWRpbmcgdGhpcyBncm91cCByZXN1bHRzIGluIGEgcG9zdC1sb2FkIGNhbGxiYWNrLgorICAgICAqLworICAgIGJvb2xlYW4gcG9zdExvYWQoKSBkZWZhdWx0IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5jbHVkZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKSBkZWZhdWx0IHt9OworCisgICAgLyoqCisgICAgICogSW5jbHVkZWQgZmV0Y2ggZ3JvdXBzLgorICAgICAqLworICAgIFN0cmluZ1tdIGZldGNoR3JvdXBzKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaEdyb3Vwcy5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoR3JvdXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MjNmZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaEdyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogRmV0Y2ggZ3JvdXBzIGhvbGRlci4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBUWVBFIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwcyB7CisKKyAgICBGZXRjaEdyb3VwW10gdmFsdWUoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoUGxhbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoUGxhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGE3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRmV0Y2hQbGFuLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTG9ja01vZGVUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GZXRjaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmV0Y2hHcm91cDsKKworLyoqCisgKiBUaGUgZmV0Y2ggcGxhbiBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5IGFsdGVyIGVhZ2VyIGZldGNoaW5nCisgKiBjb25maWd1cmF0aW9uIGFuZCBvdGhlciBhc3BlY3RzIG9mIGRhdGEgbG9hZGluZy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgKiBAc2luY2UgMC40LjEKKyAqIEBwdWJsaXNoZWQKKyAqLworcHVibGljIGludGVyZmFjZSBGZXRjaFBsYW4geworCisgICAgLyoqCisgICAgICogRmV0Y2ggZ3JvdXAgcmVwcmVzZW50aW5nIGFsbCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfQUxMID0gRmV0Y2hHcm91cC5OQU1FX0FMTDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGZldGNoIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0RFRkFVTFQgPSBGZXRjaEdyb3VwLk5BTUVfREVGQVVMVDsKKworICAgIC8qKgorICAgICAqIEluZmluaXRlIGZldGNoIGRlcHRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFUFRIX0lORklOSVRFID0gRmV0Y2hHcm91cC5ERVBUSF9JTkZJTklURTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHRvIHJldmVydCBhbnkgc2V0dGluZyB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gRmV0Y2hDb25maWd1cmF0aW9uLkRFRkFVTFQ7CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGdldERlbGVnYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBmZXRjaCBkZXB0aCB3aGVuIGxvYWRpbmcgYW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4RmV0Y2hEZXB0aCgpOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gZmV0Y2ggZGVwdGggd2hlbiBsb2FkaW5nIGFuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHNldE1heEZldGNoRGVwdGgoaW50IGRlcHRoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmV0Y2ggYmF0Y2ggc2l6ZSBmb3IgbGFyZ2UgcmVzdWx0IHNldCBzdXBwb3J0LgorICAgICAqIERlZmF1bHRzIHRvIHRoZQk8Y29kZT5vcGVuanBhLkZldGNoQmF0Y2hTaXplPC9jb2RlPiBzZXR0aW5nLiBOb3RlCisgICAgICogdGhhdCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZCB1bmRlciBzb21lIGRhdGEgc3RvcmVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RmV0Y2hCYXRjaFNpemUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmV0Y2ggYmF0Y2ggc2l6ZSBmb3IgbGFyZ2UgcmVzdWx0IHNldCBzdXBwb3J0LgorICAgICAqIERlZmF1bHRzIHRvIHRoZQk8Y29kZT5vcGVuanBhLkZldGNoQmF0Y2hTaXplPC9jb2RlPiBzZXR0aW5nLiBOb3RlCisgICAgICogdGhhdCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZCB1bmRlciBzb21lIGRhdGEgc3RvcmVzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gc2V0RmV0Y2hCYXRjaFNpemUoaW50IGZldGNoQmF0Y2hTaXplKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBxdWVyeSBjYWNoaW5nIGlzIGVuYWJsZWQuIElmIHRoaXMgcmV0dXJucworICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGJ1dCB0aGUgZGF0YWNhY2hlIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkLCBjYWNoaW5nCisgICAgICogd2lsbCBub3QgYmUgZW5hYmxlZC4gSWYgdGhpcworICAgICAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBxdWVyeSBjYWNoaW5nIHdpbGwgbm90IGJlIHVzZWQKKyAgICAgKiBldmVuIGlmIHRoZSBkYXRhY2FjaGUgcGx1Z2luIGlzIGluc3RhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRRdWVyeVJlc3VsdENhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgb3Igbm90IHF1ZXJ5IGNhY2hpbmcgaXMgZW5hYmxlZC4gVGhpcyBoYXMgbm8gZWZmZWN0CisgICAgICogaWYgdGhlIGRhdGFjYWNoZSBwbHVnaW4gaXMgbm90IGluc3RhbGxlZCwgb3IgaWYgdGhlIHF1ZXJ5IGNhY2hlIHNpemUKKyAgICAgKiBpcyBzZXQgdG8gemVyby4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHNldFF1ZXJ5UmVzdWx0Q2FjaGUoYm9vbGVhbiBjYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZmV0Y2ggZ3JvdXBzIHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCB1c2UKKyAgICAgKiB3aGVuIGxvYWRpbmcgb2JqZWN0cy4gRGVmYXVsdHMgdG8gdGhlCisgICAgICogPGNvZGU+b3BlbmpwYS5GZXRjaEdyb3VwczwvY29kZT4gc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEZldGNoR3JvdXBzKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIDxjb2RlPmdyb3VwPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZldGNoIGdyb3VwIHRvCisgICAgICogdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApOworCisgICAgLyoqCisgICAgICogQWRkcyA8Y29kZT5ncm91cHM8L2NvZGU+IHRvIHRoZSBzZXQgb2YgZmV0Y2ggZ3JvdXAgbmFtZXMgdG8KKyAgICAgKiB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGZXRjaEdyb3VwcyhTdHJpbmcuLi4gZ3JvdXBzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgPGNvZGU+Z3JvdXBzPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZldGNoIGdyb3VwIG5hbWVzIHRvCisgICAgICogdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmV0Y2hHcm91cHMoQ29sbGVjdGlvbiBncm91cHMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBmZXRjaCBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZldGNoR3JvdXAoU3RyaW5nIGdyb3VwKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgPGNvZGU+Z3JvdXBzPC9jb2RlPiBmcm9tIHRoZSBzZXQgb2YgZmV0Y2ggZ3JvdXAgbmFtZXMKKyAgICAgKiB0byB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGZXRjaEdyb3VwcyhTdHJpbmcuLi4gZ3JvdXBzKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgPGNvZGU+Z3JvdXBzPC9jb2RlPiBmcm9tIHRoZSBzZXQgb2YgZmV0Y2ggZ3JvdXAgbmFtZXMKKyAgICAgKiB0byB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGZXRjaEdyb3VwcyhDb2xsZWN0aW9uIGdyb3Vwcyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIHNldCBvZiBmZXRjaCBncm91cCBuYW1lcyB0byB1c2Ugd2VuIGxvYWRpbmcKKyAgICAgKiBkYXRhLiBBZnRlciB0aGlzIG9wZXJhdGlvbiBpcyBpbnZva2VkLCBvbmx5IHRob3NlIGZpZWxkcyBpbgorICAgICAqIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIChhbmQgYW55IHJlcXVlc3RlZCBmaWVsZCkgd2lsbCBiZQorICAgICAqIGxvYWRlZCB3aGVuIGxvYWRpbmcgYW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gY2xlYXJGZXRjaEdyb3VwcygpOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBzZXQgb2YgZmV0Y2ggZ3JvdXBzIHRvIHRoZSBsaXN0IGluIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlc2V0RmV0Y2hHcm91cHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBvZiB0aGUgZmllbGRzIHRoYXQgdGhpcyBjb21wb25lbnQKKyAgICAgKiB3aWxsIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4gRGVmYXVsdHMgdG8gdGhlIGVtcHR5IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEZpZWxkcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGZpZWxkIGhhcyBiZWVuIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKFN0cmluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmllbGQgaGFzIGJlZW4gYWRkZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoQ2xhc3MgY2xzLCBTdHJpbmcgZmllbGQpOworCisgICAgLyoqCisgICAgICogQWRkcyA8Y29kZT5maWVsZDwvY29kZT4gdG8gdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMgdG8KKyAgICAgKiB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZChTdHJpbmcgZmllbGQpOworCisgICAgLyoqCisgICAgICogQWRkcyA8Y29kZT5maWVsZDwvY29kZT4gdG8gdGhlIHNldCBvZiBmaWVsZCBuYW1lcyB0bworICAgICAqIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGFkZEZpZWxkKENsYXNzIGNscywgU3RyaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgPGNvZGU+ZmllbGRzPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lcyB0bworICAgICAqIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGFkZEZpZWxkcyhTdHJpbmcuLi4gZmllbGRzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgPGNvZGU+ZmllbGRzPC9jb2RlPiB0byB0aGUgc2V0IG9mIGZpZWxkIG5hbWVzIHRvCisgICAgICogdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmllbGRzKENsYXNzIGNscywgU3RyaW5nLi4uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIDxjb2RlPmZpZWxkczwvY29kZT4gdG8gdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMgdG8KKyAgICAgKiB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZHMoQ29sbGVjdGlvbiBmaWVsZHMpOworCisgICAgLyoqCisgICAgICogQWRkcyA8Y29kZT5maWVsZHM8L2NvZGU+IHRvIHRoZSBzZXQgb2YgZmllbGQgbmFtZXMgdG8KKyAgICAgKiB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZHMoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkKFN0cmluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmllbGQoQ2xhc3MgY2xzLCBTdHJpbmcgZmllbGQpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyA8Y29kZT5maWVsZHM8L2NvZGU+IGZyb20gdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMKKyAgICAgKiB0byB1c2Ugd2hlbiBsb2FkaW5nIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGaWVsZHMoU3RyaW5nLi4uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIDxjb2RlPmZpZWxkczwvY29kZT4gZnJvbSB0aGUgc2V0IG9mIGZpZWxkIG5hbWVzCisgICAgICogdG8gdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmllbGRzKENsYXNzIGNscywgU3RyaW5nLi4uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIDxjb2RlPmZpZWxkczwvY29kZT4gZnJvbSB0aGUgc2V0IG9mIGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lcworICAgICAqIHRvIHVzZSB3aGVuIGxvYWRpbmcgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkcyhDb2xsZWN0aW9uIGZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIDxjb2RlPmZpZWxkczwvY29kZT4gZnJvbSB0aGUgc2V0IG9mIGZpZWxkIG5hbWVzCisgICAgICogdG8gdXNlIHdoZW4gbG9hZGluZyBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmllbGRzKENsYXNzIGNscywgQ29sbGVjdGlvbiBmaWVsZHMpOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBzZXQgb2YgZmllbGQgbmFtZXMgdG8gdXNlIHdlbiBsb2FkaW5nCisgICAgICogZGF0YS4gQWZ0ZXIgdGhpcyBvcGVyYXRpb24gaXMgaW52b2tlZCwgb25seSB0aG9zZSBmaWVsZHMgaW4KKyAgICAgKiB0aGUgY29uZmlndXJlZCBmZXRjaCBncm91cHMgd2lsbCBiZSBsb2FkZWQgd2hlbiBsb2FkaW5nIGFuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGNsZWFyRmllbGRzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhbiBvYmplY3QgbG9jaywgb3IgLTEgZm9yIG5vCisgICAgICogbGltaXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMb2NrVGltZW91dCgpOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYW4gb2JqZWN0IGxvY2ssIG9yIC0xIGZvciBubworICAgICAqIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gc2V0TG9ja1RpbWVvdXQoaW50IHRpbWVvdXQpOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2sgbGV2ZWwgdG8gdXNlIGZvciBsb2NraW5nIGxvYWRlZCBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0UmVhZExvY2tNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jayBsZXZlbCB0byB1c2UgZm9yIGxvY2tpbmcgbG9hZGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBzZXRSZWFkTG9ja01vZGUoTG9ja01vZGVUeXBlIG1vZGUpOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2sgbGV2ZWwgdG8gdXNlIGZvciBsb2NraW5nIGRpcnRpZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9ja01vZGVUeXBlIGdldFdyaXRlTG9ja01vZGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2NrIGxldmVsIHRvIHVzZSBmb3IgbG9ja2luZyBkaXJ0aWVkIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBzZXRXcml0ZUxvY2tNb2RlKExvY2tNb2RlVHlwZSBtb2RlKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaFBsYW5JbXBsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRmV0Y2hQbGFuSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjZiZTQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRmV0Y2hQbGFuSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTG9ja01vZGVUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5EZWxlZ2F0aW5nRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmV0Y2hDb25maWd1cmF0aW9uOworCisvKioKKyAqIEltcGxlbWVudHMgRmV0Y2hQbGFuIHZpYSBkZWxlZ2F0aW9uIHRvIEZldGNoQ29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgKiBAc2luY2UgMC40LjEKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIEZldGNoUGxhbkltcGwKKwlpbXBsZW1lbnRzIEZldGNoUGxhbiB7CisKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24gX2ZldGNoOworCisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hQbGFuSW1wbChGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgX2ZldGNoID0gbmV3RGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbihmZXRjaCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGV4Y2VwdGlvbi10cmFuc2xhdGluZyBkZWxlZ2F0aW5nIGZldGNoIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIERlbGVnYXRpbmdGZXRjaENvbmZpZ3VyYXRpb24gbmV3RGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbgorICAgICAgICAoRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoKSB7CisgICAgICAgIHJldHVybiBuZXcgRGVsZWdhdGluZ0ZldGNoQ29uZmlndXJhdGlvbihmZXRjaCwKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5UUkFOU0xBVE9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmV0Y2hDb25maWd1cmF0aW9uIGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX2ZldGNoLmdldERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhGZXRjaERlcHRoKCkgeworICAgICAgICByZXR1cm4gX2ZldGNoLmdldE1heEZldGNoRGVwdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHNldE1heEZldGNoRGVwdGgoaW50IGRlcHRoKSB7CisgICAgICAgIF9mZXRjaC5zZXRNYXhGZXRjaERlcHRoKGRlcHRoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGZXRjaEJhdGNoU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRGZXRjaEJhdGNoU2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gc2V0RmV0Y2hCYXRjaFNpemUoaW50IGZldGNoQmF0Y2hTaXplKSB7CisgICAgICAgIF9mZXRjaC5zZXRGZXRjaEJhdGNoU2l6ZShmZXRjaEJhdGNoU2l6ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFF1ZXJ5UmVzdWx0Q2FjaGUoKSB7CisgICAgICAgIHJldHVybiBfZmV0Y2guZ2V0UXVlcnlDYWNoZSgpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gc2V0UXVlcnlSZXN1bHRDYWNoZShib29sZWFuIGNhY2hlKSB7CisgICAgICAgIF9mZXRjaC5zZXRRdWVyeUNhY2hlKGNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRGZXRjaEdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuIF9mZXRjaC5nZXRGZXRjaEdyb3VwcygpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmV0Y2hHcm91cChTdHJpbmcgZ3JvdXApIHsKKyAgICAgICAgX2ZldGNoLmFkZEZldGNoR3JvdXAoZ3JvdXApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGFkZEZldGNoR3JvdXBzKFN0cmluZy4uLiBncm91cHMpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZldGNoR3JvdXBzKEFycmF5cy5hc0xpc3QoZ3JvdXBzKSk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGZXRjaEdyb3VwcyhDb2xsZWN0aW9uIGdyb3VwcykgeworICAgICAgICBfZmV0Y2guYWRkRmV0Y2hHcm91cHMoZ3JvdXBzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGZXRjaEdyb3VwKFN0cmluZyBncm91cCkgeworICAgICAgICBfZmV0Y2gucmVtb3ZlRmV0Y2hHcm91cChncm91cCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmV0Y2hHcm91cHMoU3RyaW5nLi4uIGdyb3VwcykgeworICAgICAgICByZXR1cm4gcmVtb3ZlRmV0Y2hHcm91cHMoQXJyYXlzLmFzTGlzdChncm91cHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZldGNoR3JvdXBzKENvbGxlY3Rpb24gZ3JvdXBzKSB7CisgICAgICAgIF9mZXRjaC5yZW1vdmVGZXRjaEdyb3Vwcyhncm91cHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGNsZWFyRmV0Y2hHcm91cHMoKSB7CisgICAgICAgIF9mZXRjaC5jbGVhckZldGNoR3JvdXBzKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gcmVzZXRGZXRjaEdyb3VwcygpIHsKKyAgICAgICAgX2ZldGNoLnJlc2V0RmV0Y2hHcm91cHMoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbjxTdHJpbmc+KSBfZmV0Y2guZ2V0RmllbGRzKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBfZmV0Y2guaGFzRmllbGQoZmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKENsYXNzIGNscywgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBoYXNGaWVsZCh0b0ZpZWxkTmFtZShjbHMsIGZpZWxkKSk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZChTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgX2ZldGNoLmFkZEZpZWxkKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZChDbGFzcyBjbHMsIFN0cmluZyBmaWVsZCkgeworICAgICAgICByZXR1cm4gYWRkRmllbGQodG9GaWVsZE5hbWUoY2xzLCBmaWVsZCkpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmllbGRzKFN0cmluZy4uLiBmaWVsZHMpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkcyhBcnJheXMuYXNMaXN0KGZpZWxkcykpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmllbGRzKENsYXNzIGNscywgU3RyaW5nLi4uIGZpZWxkcykgeworICAgICAgICByZXR1cm4gYWRkRmllbGRzKGNscywgQXJyYXlzLmFzTGlzdChmaWVsZHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIGFkZEZpZWxkcyhDb2xsZWN0aW9uIGZpZWxkcykgeworICAgICAgICBfZmV0Y2guYWRkRmllbGRzKGZpZWxkcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gYWRkRmllbGRzKENsYXNzIGNscywgQ29sbGVjdGlvbiBmaWVsZHMpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkcyh0b0ZpZWxkTmFtZXMoY2xzLCBmaWVsZHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkKFN0cmluZyBmaWVsZCkgeworICAgICAgICBfZmV0Y2gucmVtb3ZlRmllbGQoZmllbGQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkKENsYXNzIGNscywgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiByZW1vdmVGaWVsZCh0b0ZpZWxkTmFtZShjbHMsIGZpZWxkKSk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGaWVsZHMoU3RyaW5nLi4uIGZpZWxkcykgeworICAgICAgICByZXR1cm4gcmVtb3ZlRmllbGRzKEFycmF5cy5hc0xpc3QoZmllbGRzKSk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGaWVsZHMoQ2xhc3MgY2xzLCBTdHJpbmcuLi4gZmllbGRzKSB7CisgICAgICAgIHJldHVybiByZW1vdmVGaWVsZHMoY2xzLCBBcnJheXMuYXNMaXN0KGZpZWxkcykpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmllbGRzKENvbGxlY3Rpb24gZmllbGRzKSB7CisgICAgICAgIF9mZXRjaC5yZW1vdmVGaWVsZHMoZmllbGRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiByZW1vdmVGaWVsZHMoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIGZpZWxkcykgeworICAgICAgICByZXR1cm4gcmVtb3ZlRmllbGRzKHRvRmllbGROYW1lcyhjbHMsIGZpZWxkcykpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gY2xlYXJGaWVsZHMoKSB7CisgICAgICAgIF9mZXRjaC5jbGVhckZpZWxkcygpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9GaWVsZE5hbWUoQ2xhc3MgY2xzLCBTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGNscy5nZXROYW1lKCkgKyAiLiIgKyBmaWVsZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHRvRmllbGROYW1lcyhDbGFzcyBjbHMsIENvbGxlY3Rpb24gZmllbGRzKSB7CisgICAgICAgIGlmIChmaWVsZHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgICAgQ29sbGVjdGlvbiBuYW1lcyA9IG5ldyBBcnJheUxpc3QoZmllbGRzKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCisgICAgICAgICAgICBuYW1lcy5hZGQodG9GaWVsZE5hbWUoY2xzLCAoU3RyaW5nKSBpdHIubmV4dCgpKSk7CisgICAgICAgIHJldHVybiBuYW1lczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExvY2tUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gX2ZldGNoLmdldExvY2tUaW1lb3V0KCk7CisgICAgfQorCisgICAgcHVibGljIEZldGNoUGxhbiBzZXRMb2NrVGltZW91dChpbnQgdGltZW91dCkgeworICAgICAgICBfZmV0Y2guc2V0TG9ja1RpbWVvdXQodGltZW91dCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0UmVhZExvY2tNb2RlKCkgeworICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlckltcGwuZnJvbUxvY2tMZXZlbChfZmV0Y2guZ2V0UmVhZExvY2tMZXZlbCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmV0Y2hQbGFuIHNldFJlYWRMb2NrTW9kZShMb2NrTW9kZVR5cGUgbW9kZSkgeworICAgICAgICBfZmV0Y2guc2V0UmVhZExvY2tMZXZlbChFbnRpdHlNYW5hZ2VySW1wbC50b0xvY2tMZXZlbChtb2RlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0V3JpdGVMb2NrTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXJJbXBsLmZyb21Mb2NrTGV2ZWwoX2ZldGNoLmdldFdyaXRlTG9ja0xldmVsKCkpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gc2V0V3JpdGVMb2NrTW9kZShMb2NrTW9kZVR5cGUgbW9kZSkgeworICAgICAgICBfZmV0Y2guc2V0V3JpdGVMb2NrTGV2ZWwoRW50aXR5TWFuYWdlckltcGwudG9Mb2NrTGV2ZWwobW9kZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gX2ZldGNoLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZldGNoUGxhbkltcGwpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX2ZldGNoLmVxdWFscygoKEZldGNoUGxhbkltcGwpIG90aGVyKS5fZmV0Y2gpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9HZW5lcmF0b3IuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9HZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZmNjRlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0dlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXE7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHN0b3JlIHNlcXVlbmNlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjEKKyAqIEBwdWJsaXNoZWQKKyAqLworcHVibGljIGludGVyZmFjZSBHZW5lcmF0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVVJRF9IRVggPSAidXVpZC1oZXgiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVVSURfU1RSSU5HID0gInV1aWQtc3RyaW5nIjsKKworICAgIC8qKgorICAgICAqIERlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBTZXEgZ2V0RGVsZWdhdGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXF1ZW5jZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgc2VxdWVuY2UgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzZXF1ZW5jZSB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgc2VxdWVuY2UgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IGN1cnJlbnQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY3VycmVudCgpOworCisgICAgLyoqCisgICAgICogSGludCB0byB0aGUgc2VxdWVuY2UgdG8gYWxsb2NhdGUgYWRkaXRpb25hbCB2YWx1ZXMgdXAtZnJvbnQgZm9yCisgICAgICogZWZmaWNpZW5jeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbGxvY2F0ZShpbnQgYWRkaXRpb25hbCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvR2VuZXJhdG9ySW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0dlbmVyYXRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFjYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0dlbmVyYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGVsZWdhdGluZ1NlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlNlcTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzdG9yZSBzZXF1ZW5jZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4xCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmF0b3JJbXBsCisJaW1wbGVtZW50cyBHZW5lcmF0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBEZWxlZ2F0aW5nU2VxIF9zZXE7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX25hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdG9yZUNvbnRleHQgX2N0eDsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTWV0YURhdGEgX21ldGE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvcjsgc3VwcGx5IGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBHZW5lcmF0b3JJbXBsKFNlcSBzZXEsIFN0cmluZyBuYW1lLCBTdG9yZUNvbnRleHQgY3R4LAorICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgX3NlcSA9IG5ldyBEZWxlZ2F0aW5nU2VxKHNlcSwgUGVyc2lzdGVuY2VFeGNlcHRpb25zLlRSQU5TTEFUT1IpOworICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgIF9jdHggPSBjdHg7CisgICAgICAgIF9tZXRhID0gbWV0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VxIGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX3NlcS5nZXREZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIF9zZXEubmV4dChfY3R4LCBfbWV0YSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjdXJyZW50KCkgeworICAgICAgICByZXR1cm4gX3NlcS5jdXJyZW50KF9jdHgsIF9tZXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbGxvY2F0ZShpbnQgYWRkaXRpb25hbCkgeworICAgICAgICBfc2VxLmFsbG9jYXRlKGFkZGl0aW9uYWwsIF9jdHgsIF9tZXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gX3NlcS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBHZW5lcmF0b3JJbXBsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9zZXEuZXF1YWxzKCgoR2VuZXJhdG9ySW1wbCkgb3RoZXIpLl9zZXEpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9JbnZhbGlkU3RhdGVFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9JbnZhbGlkU3RhdGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQxNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ludmFsaWRTdGF0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyLk1lc3NhZ2U7CisKKy8qKgorICogRXh0ZW5kZWQge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgSW52YWxpZFN0YXRlRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgRXhjZXB0aW9uSW5mbyB7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIF9mYXRhbCA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBfZmFpbGVkID0gbnVsbDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBUaHJvd2FibGVbXSBfbmVzdGVkID0gbnVsbDsKKworICAgIHB1YmxpYyBJbnZhbGlkU3RhdGVFeGNlcHRpb24oTWVzc2FnZSBtc2csIFRocm93YWJsZVtdIG5lc3RlZCwgT2JqZWN0IGZhaWxlZCwKKyAgICAgICAgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICB0aGlzKG1zZy5nZXRNZXNzYWdlKCksIG5lc3RlZCwgZmFpbGVkLCBmYXRhbCk7CisgICAgfQorCisgICAgcHVibGljIEludmFsaWRTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGVbXSBuZXN0ZWQsIE9iamVjdCBmYWlsZWQsCisgICAgICAgIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgX25lc3RlZCA9IG5lc3RlZDsKKyAgICAgICAgX2ZhaWxlZCA9IGZhaWxlZDsKKyAgICAgICAgX2ZhdGFsID0gZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVVNFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBVc2VyRXhjZXB0aW9uLklOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGYXRhbCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VFeGNlcHRpb25zLmdldENhdXNlKF9uZXN0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGVbXSBnZXROZXN0ZWRUaHJvd2FibGVzKCkgeworICAgICAgICByZXR1cm4gKF9uZXN0ZWQgPT0gbnVsbCkgPyBFeGNlcHRpb25zLkVNUFRZX1RIUk9XQUJMRVMgOiBfbmVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmFpbGVkT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gX2ZhaWxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gRXhjZXB0aW9ucy50b1N0cmluZyh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7CisgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIEV4Y2VwdGlvbnMucHJpbnROZXN0ZWRUaHJvd2FibGVzKHRoaXMsIG91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUJvb2xlYW4oX2ZhdGFsKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KEV4Y2VwdGlvbnMucmVwbGFjZUZhaWxlZE9iamVjdChfZmFpbGVkKSk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VOZXN0ZWRUaHJvd2FibGVzKF9uZXN0ZWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgX2ZhdGFsID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgX2ZhaWxlZCA9IGluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgX25lc3RlZCA9IChUaHJvd2FibGVbXSkgaW4ucmVhZE9iamVjdCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ludmVyc2VMb2dpY2FsLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvSW52ZXJzZUxvZ2ljYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMzZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ludmVyc2VMb2dpY2FsLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBEZWNsYXJlcyB0aGUgbG9naWNhbCBpbnZlcnNlIG9mIGEgZmllbGQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgSW52ZXJzZUxvZ2ljYWwgeworCisgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9LZXlEZXBlbmRlbnQuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9LZXlEZXBlbmRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODMxMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0tleURlcGVuZGVudC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogRGVwZW5kZW50IG1hcCBrZXkgbWFya2VyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEtleURlcGVuZGVudCB7CisKKyAgICBib29sZWFuIHZhbHVlKCkgZGVmYXVsdCB0cnVlOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0tleVR5cGUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9LZXlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNjU2MQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9LZXlUeXBlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBJbmRpY2F0ZXMgdGhlIHBlcnNpc3RlbnQga2V5IHR5cGUgb2YgYSBtYXAgZmllbGQsIGlmIGRpZmZlcmVudCB0aGFuIHRoZQorICogZGVjbGFyZWQgdHlwZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBLZXlUeXBlIHsKKworICAgIENsYXNzIHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvTFJTLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvTFJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmZWMyOQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9MUlMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIExhcmdlIHJlc3VsdCBzZXQgZmllbGQgbWFya2VyLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIExSUyB7CisKKyAgICBib29sZWFuIHZhbHVlKCkgZGVmYXVsdCB0cnVlOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0xvYWRGZXRjaEdyb3VwLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvTG9hZEZldGNoR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmY0NDIzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0xvYWRGZXRjaEdyb3VwLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBGZXRjaCBncm91cCBsb2FkZWQgd2hlbiB0aGUgYW5ub3RhdGVkIGZpZWxkL3Byb3BlcnR5IGlzIGxvYWRlZC4gCisgKgorICogQGF1dGhvciBQaW5ha2kgUG9kZGFyCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBMb2FkRmV0Y2hHcm91cCB7CisKKyAgICBTdHJpbmcgdmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9NZXRhRGF0YVBhcnNlcnMuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9NZXRhRGF0YVBhcnNlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjFhOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL01ldGFEYXRhUGFyc2Vycy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVDYWxsYmFja3M7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5NZXRob2RMaWZlY3ljbGVDYWxsYmFja3M7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFEZWZhdWx0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Vc2VyRXhjZXB0aW9uOworCisvKioKKyAqIENvbW1vbiB1dGlsaXRpZXMgZm9yIHBlcnNpc3RlbmNlIG1ldGFkYXRhIHBhcnNlcnMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworY2xhc3MgTWV0YURhdGFQYXJzZXJzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKE1ldGFEYXRhUGFyc2Vycy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHR5cGUgY29uc3RhbnRzIGZvciB0aGUgZ2l2ZW4gdGFnLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZXRFdmVudFR5cGVzKE1ldGFEYXRhVGFnIHRhZykgeworICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBQUkVfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGludFtdeyBMaWZlY3ljbGVFdmVudC5CRUZPUkVfUEVSU0lTVCB9OworICAgICAgICAgICAgY2FzZSBQT1NUX1BFUlNJU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXXsgTGlmZWN5Y2xlRXZlbnQuQUZURVJfUEVSU0lTVCB9OworICAgICAgICAgICAgY2FzZSBQUkVfUkVNT1ZFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaW50W117IExpZmVjeWNsZUV2ZW50LkJFRk9SRV9ERUxFVEUgfTsKKyAgICAgICAgICAgIGNhc2UgUE9TVF9SRU1PVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXXsgTGlmZWN5Y2xlRXZlbnQuQUZURVJfREVMRVRFIH07CisgICAgICAgICAgICBjYXNlIFBSRV9VUERBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXXsgTGlmZWN5Y2xlRXZlbnQuQkVGT1JFX1NUT1JFIH07CisgICAgICAgICAgICBjYXNlIFBPU1RfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaW50W117IExpZmVjeWNsZUV2ZW50LkFGVEVSX1NUT1JFIH07CisgICAgICAgICAgICBjYXNlIFBPU1RfTE9BRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGludFtdeyBMaWZlY3ljbGVFdmVudC5BRlRFUl9MT0FELAorICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVFdmVudC5BRlRFUl9SRUZSRVNIIH07CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gbGlzdGVuZXIgY2xhc3MgZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBtZXRob2RzCisgICAgICogbGlzdGVuaW5nIGZvciB0aGUgc2FtZSBsaWZlY3ljbGUgZXZlbnQsIHdoaWNoIGlzIGZvcmJpZGRlbiBieSB0aGUgc3BlYy4gIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNGb3JTYW1lQ2FsbGJhY2soQ2xhc3MgY2xzLCAKKyAgICAgICAgQ29sbGVjdGlvbjxMaWZlY3ljbGVDYWxsYmFja3M+IGNhbGxiYWNrcywgTWV0aG9kIG1ldGhvZCwgCisgICAgICAgIE1ldGFEYXRhVGFnIHRhZywgTWV0YURhdGFEZWZhdWx0cyBkZWYsIExvZyBsb2cpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrcyA9PSBudWxsIHx8IGNhbGxiYWNrcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZm9yIChMaWZlY3ljbGVDYWxsYmFja3MgbGM6IGNhbGxiYWNrcykgeworICAgICAgICAgICAgaWYgKCEobGMgaW5zdGFuY2VvZiBNZXRob2RMaWZlY3ljbGVDYWxsYmFja3MpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgTWV0aG9kIGV4aXN0cyA9ICgoTWV0aG9kTGlmZWN5Y2xlQ2FsbGJhY2tzKWxjKS5nZXRDYWxsYmFja01ldGhvZCgpOworICAgICAgICAgICAgaWYgKCFleGlzdHMuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5lcXVhbHMobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBQZXJzaXN0ZW5jZU1ldGFEYXRhRGVmYXVsdHMgZGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZURlZmF1bHRzKGRlZik7CisgICAgICAgICAgICBMb2NhbGl6ZXIuTWVzc2FnZSBtc2cgPSBfbG9jLmdldCgibXVsdGlwbGUtbWV0aG9kcy1vbi1jYWxsYmFjayIsIAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSwgZXhpc3RzLmdldE5hbWUoKSwgdGFnLnRvU3RyaW5nKCkgfSk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdHMgPT0gbnVsbCAKKyAgICAgICAgICAgICAgICB8fCBkZWZhdWx0cy5nZXRBbGxvd3NNdWx0aXBsZU1ldGhvZHNGb3JTYW1lQ2FsbGJhY2soKSkKKyAgICAgICAgICAgICAgICBsb2cud2Fybihtc2cpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzfSBpbiB1c2UsIG9yIG51bGwgaWYgbm90CisgICAgICogdXNpbmcgSlBBIGRlZmF1bHRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFBlcnNpc3RlbmNlTWV0YURhdGFEZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZURlZmF1bHRzCisgICAgICAgIChNZXRhRGF0YURlZmF1bHRzIGRlZikgeworICAgICAgICBpZiAoZGVmIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzKQorICAgICAgICAgICAgcmV0dXJuIChQZXJzaXN0ZW5jZU1ldGFEYXRhRGVmYXVsdHMpIGRlZjsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL01ldGFEYXRhVGFnLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvTWV0YURhdGFUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmUwNWJkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL01ldGFEYXRhVGFnLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9URTogd2hlbiBhZGRpbmcgYSBuZXcgdHlwZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUKKy8vIHRhYmxlIGluIFBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFNldCBvZiBtZXRhZGF0YSB0YWdzIHVzZWQgaW4gSlBBLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBlbnVtIE1ldGFEYXRhVGFnIHsKKyAgICAvLyBzb3J0ZWQgYnkgWE1MIG9yZGVyCisgICAgTUFQUEVEX1NVUEVSQ0xBU1MsCisgICAgRU5USVRZLAorICAgIEVNQkVEREFCTEUsCisgICAgRU5USVRZX0xJU1RFTkVSUywKKyAgICBGTFVTSF9NT0RFLAorICAgIEdFTkVSQVRFRF9WQUxVRSwKKyAgICBJRCwKKyAgICBFTUJFRERFRF9JRCwKKyAgICBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTLAorICAgIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMsCisgICAgSURfQ0xBU1MsCisgICAgTE9CLAorICAgIE1BUF9LRVksCisgICAgTkFUSVZFX1FVRVJJRVMsCisgICAgTkFUSVZFX1FVRVJZLAorICAgIFFVRVJZX1NUUklORywKKyAgICBPUkRFUl9CWSwKKyAgICBRVUVSSUVTLAorICAgIFFVRVJZLAorICAgIFFVRVJZX0hJTlQsCisgICAgUE9TVF9MT0FELAorICAgIFBPU1RfUEVSU0lTVCwKKyAgICBQT1NUX1JFTU9WRSwKKyAgICBQT1NUX1VQREFURSwKKyAgICBQUkVfUEVSU0lTVCwKKyAgICBQUkVfUkVNT1ZFLAorICAgIFBSRV9VUERBVEUsCisgICAgU0VRX0dFTkVSQVRPUiwKKyAgICBWRVJTSU9OLAorICAgIC8vIG9wZW5qcGEgZXh0ZW5zaW9ucworICAgIERBVEFfQ0FDSEUsCisgICAgREFUQVNUT1JFX0lELAorICAgIERFUEVOREVOVCwKKyAgICBERVRBQ0hFRF9TVEFURSwKKyAgICBFTEVNX0RFUEVOREVOVCwKKyAgICBFTEVNX1RZUEUsCisgICAgRVhURVJOQUxfVkFMUywKKyAgICBFWFRFUk5BTElaRVIsCisgICAgRkFDVE9SWSwKKyAgICBGRVRDSF9HUk9VUCwKKyAgICBGRVRDSF9HUk9VUFMsCisgICAgSU5WRVJTRV9MT0dJQ0FMLAorICAgIEtFWV9ERVBFTkRFTlQsCisgICAgS0VZX1RZUEUsCisgICAgTE9BRF9GRVRDSF9HUk9VUCwKKyAgICBMUlMsCisgICAgUkVBRF9PTkxZLAorICAgIFRZUEUsCit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvTm9SZXN1bHRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Ob1Jlc3VsdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDBmNzQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvTm9SZXN1bHRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogVW5pcXVlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdHMuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgTm9SZXN1bHRFeGNlcHRpb24KKyAgICBleHRlbmRzIGphdmF4LnBlcnNpc3RlbmNlLk5vUmVzdWx0RXhjZXB0aW9uCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIEV4Y2VwdGlvbkluZm8geworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfZmF0YWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgX2ZhaWxlZCA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVGhyb3dhYmxlW10gX25lc3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgTm9SZXN1bHRFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlW10gbmVzdGVkLAorICAgICAgICBPYmplY3QgZmFpbGVkLCBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIF9uZXN0ZWQgPSBuZXN0ZWQ7CisgICAgICAgIF9mYWlsZWQgPSBmYWlsZWQ7CisgICAgICAgIF9mYXRhbCA9IGZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFVTRVI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgeworICAgICAgICByZXR1cm4gVXNlckV4Y2VwdGlvbi5JTlZBTElEX1NUQVRFOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWwoKSB7CisgICAgICAgIHJldHVybiBfZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5nZXRDYXVzZShfbmVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlW10gZ2V0TmVzdGVkVGhyb3dhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIChfbmVzdGVkID09IG51bGwpID8gRXhjZXB0aW9ucy5FTVBUWV9USFJPV0FCTEVTIDogX25lc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbnMudG9TdHJpbmcodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgeworICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVCb29sZWFuKF9mYXRhbCk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VGYWlsZWRPYmplY3QoX2ZhaWxlZCkpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlTmVzdGVkVGhyb3dhYmxlcyhfbmVzdGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIF9mYXRhbCA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIF9mYWlsZWQgPSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIF9uZXN0ZWQgPSAoVGhyb3dhYmxlW10pIGluLnJlYWRPYmplY3QoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Ob25VbmlxdWVSZXN1bHRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Ob25VbmlxdWVSZXN1bHRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg5Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL05vblVuaXF1ZVJlc3VsdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBVbmlxdWUgcXVlcnkgcmV0dXJuZWQgbXVsdGlwbCByZXN1bHRzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE5vblVuaXF1ZVJlc3VsdEV4Y2VwdGlvbgorICAgIGV4dGVuZHMgamF2YXgucGVyc2lzdGVuY2UuTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIEV4Y2VwdGlvbkluZm8geworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfZmF0YWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgX2ZhaWxlZCA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVGhyb3dhYmxlW10gX25lc3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZVtdIG5lc3RlZCwKKyAgICAgICAgT2JqZWN0IGZhaWxlZCwgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBfbmVzdGVkID0gbmVzdGVkOworICAgICAgICBfZmFpbGVkID0gZmFpbGVkOworICAgICAgICBfZmF0YWwgPSBmYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBVU0VSOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFVzZXJFeGNlcHRpb24uSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsKCkgeworICAgICAgICByZXR1cm4gX2ZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CisgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuZ2V0Q2F1c2UoX25lc3RlZCk7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZVtdIGdldE5lc3RlZFRocm93YWJsZXMoKSB7CisgICAgICAgIHJldHVybiAoX25lc3RlZCA9PSBudWxsKSA/IEV4Y2VwdGlvbnMuRU1QVFlfVEhST1dBQkxFUyA6IF9uZXN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGYWlsZWRPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBfZmFpbGVkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBFeGNlcHRpb25zLnRvU3RyaW5nKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKKyAgICAgICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIEV4Y2VwdGlvbnMucHJpbnROZXN0ZWRUaHJvd2FibGVzKHRoaXMsIG91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihfZmF0YWwpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlRmFpbGVkT2JqZWN0KF9mYWlsZWQpKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KEV4Y2VwdGlvbnMucmVwbGFjZU5lc3RlZFRocm93YWJsZXMoX25lc3RlZCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBfZmF0YWwgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICBfZmFpbGVkID0gaW4ucmVhZE9iamVjdCgpOworICAgICAgICBfbmVzdGVkID0gKFRocm93YWJsZVtdKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcGVuSlBBRW50aXR5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTdhZjgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eVRyYW5zYWN0aW9uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkxvY2tNb2RlVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lZS5NYW5hZ2VkUnVudGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuQ2FsbGJhY2tNb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkF1dG9DbGVhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkF1dG9EZXRhY2g7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Db25uZWN0aW9uUmV0YWluTW9kZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5EZXRhY2hTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlJlc3RvcmVTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuQ2xvc2VhYmxlOworCisvKioKKyAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBPcGVuSlBBIGVudGl0eSBtYW5hZ2Vycy4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAcHVibGlzaGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3BlbkpQQUVudGl0eU1hbmFnZXIKKyAgICBleHRlbmRzIEVudGl0eU1hbmFnZXIsIEVudGl0eVRyYW5zYWN0aW9uLCBqYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbiwKKyAgICBqYXZheC5yZXNvdXJjZS5jY2kuTG9jYWxUcmFuc2FjdGlvbiwgamF2YXgucmVzb3VyY2Uuc3BpLkxvY2FsVHJhbnNhY3Rpb24sCisgICAgQ2xvc2VhYmxlLCBDb25uZWN0aW9uUmV0YWluTW9kZXMsIERldGFjaFN0YXRlLCBSZXN0b3JlU3RhdGUsIEF1dG9EZXRhY2gsCisgICAgQXV0b0NsZWFyLCBDYWxsYmFja01vZGVzIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmFjdG9yeSB0aGF0IHByb2R1Y2VkIHRoaXMgZW50aXR5IG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBnZXRFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudGl0eSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIChtdXRhYmxlKSBmZXRjaCBwbGFuIGZvciBsb2FkaW5nIG9iamVjdHMgZnJvbSB0aGlzCisgICAgICogZW50aXR5IG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIEZldGNoUGxhbiBnZXRGZXRjaFBsYW4oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiByZXRhaW4gbW9kZSBmb3IgdGhpcyBlbnRpdHkgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBzZWUgQ29ubmVjdGlvblJldGFpbk1vZGVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUmV0YWluTW9kZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGVudGl0eSBtYW5hZ2VyIGlzIHVzaW5nIG1hbmFnZWQgdHJhbnNhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWFuYWdlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYW5hZ2VkIHJ1bnRpbWUgaW4gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VkUnVudGltZSBnZXRNYW5hZ2VkUnVudGltZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBjaGVjayBmb3IgYSBnbG9iYWwgdHJhbnNhY3Rpb24gdXBvbiBldmVyeSBtYW5hZ2VkLAorICAgICAqIG5vbi10cmFuc2FjdGlvbmFsIG9wZXJhdGlvbi4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3luY1dpdGhNYW5hZ2VkVHJhbnNhY3Rpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGNoZWNrIGZvciBhIGdsb2JhbCB0cmFuc2FjdGlvbiB1cG9uIGV2ZXJ5IG1hbmFnZWQsCisgICAgICogbm9uLXRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeW5jV2l0aE1hbmFnZWRUcmFuc2FjdGlvbnMoYm9vbGVhbiByZXN5bmMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIGNsYXNzIGxvYWRlciBhdCB0aGUgdGltZSB0aGlzIGVudGl0eQorICAgICAqIG1hbmFnZXIgd2FzIG9idGFpbmVkIGZyb20gdGhlIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gdXNlciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblVzZXJOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUGFzc3dvcmQoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGVudGl0eSBtYW5hZ2VyIG9yIGl0cyBtYW5hZ2VkIGluc3RhbmNlcyBhcmUgdXNlZCBpbiBhCisgICAgICogbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNdWx0aXRocmVhZGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBlbnRpdHkgbWFuYWdlciBvciBpdHMgbWFuYWdlZCBpbnN0YW5jZXMgYXJlIHVzZWQgaW4gYQorICAgICAqIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGl0aHJlYWRlZChib29sZWFuIG11bHRpKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdGFrZSBpbnRvIGFjY291bnQgY2hhbmdlcyBpbiB0aGUgdHJhbnNhY3Rpb24gd2hlbiBleGVjdXRpbmcKKyAgICAgKiBhIHF1ZXJ5IG9yIGl0ZXJhdGluZyBhbiBleHRlbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlQ2hhbmdlcygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB0YWtlIGludG8gYWNjb3VudCBjaGFuZ2VzIGluIHRoZSB0cmFuc2FjdGlvbiB3aGVuIGV4ZWN1dGluZworICAgICAqIGEgcXVlcnkgb3IgaXRlcmF0aW5nIGFuIGV4dGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVDaGFuZ2VzKGJvb2xlYW4gaWdub3JlKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9udHJhbnNhY3Rpb25hbCBhY2Nlc3MgdG8gcGVyc2lzdGVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb250cmFuc2FjdGlvbmFsUmVhZCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbGxvdyBub250cmFuc2FjdGlvbmFsIGFjY2VzcyB0byBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vbnRyYW5zYWN0aW9uYWxSZWFkKGJvb2xlYW4gcmVhZCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbnRyYW5zYWN0aW9uYWwgY2hhbmdlcyB0byBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vbnRyYW5zYWN0aW9uYWxXcml0ZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbGxvdyBub250cmFuc2FjdGlvbmFsIGNoYW5nZXMgdG8gcGVyc2lzdGVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb250cmFuc2FjdGlvbmFsV3JpdGUoYm9vbGVhbiB3cml0ZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBvcHRpbWlzdGljIHRyYW5zYWN0aW9uYWwgc2VtYW50aWNzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXN0aWMoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIG9wdGltaXN0aWMgdHJhbnNhY3Rpb25hbCBzZW1hbnRpY3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pc3RpYyhib29sZWFuIG9wdCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJlc3RvcmUgYW4gb2JqZWN0J3Mgb3JpZ2luYWwgc3RhdGUgb24gcm9sbGJhY2suCisgICAgICoKKyAgICAgKiBAc2VlIFJlc3RvcmVTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzdG9yZVN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJlc3RvcmUgYW4gb2JqZWN0J3Mgb3JpZ2luYWwgc3RhdGUgb24gcm9sbGJhY2suCisgICAgICoKKyAgICAgKiBAc2VlIFJlc3RvcmVTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3RvcmVTdGF0ZShpbnQgcmVzdG9yZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9iamVjdHMgcmV0YWluIHRoZWlyIHBlcnNpc3RlbnQgc3RhdGUgb24gdHJhbnNhY3Rpb24gY29tbWl0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJldGFpblN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9iamVjdHMgcmV0YWluIHRoZWlyIHBlcnNpc3RlbnQgc3RhdGUgb24gdHJhbnNhY3Rpb24gY29tbWl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldGFpblN0YXRlKGJvb2xlYW4gcmV0YWluKTsKKworICAgIC8qKgorICAgICAqIERldGFjaCBtb2RlIGNvbnN0YW50IHRvIGRldGVybWluZSB3aGljaCBmaWVsZHMgYXJlIHBhcnQgb2YgdGhlCisgICAgICogZGV0YWNoZWQgZ3JhcGguCisgICAgICoKKyAgICAgKiBAc2VlIERldGFjaFN0YXRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZXRhY2hTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogRGV0YWNoIG1vZGUgY29uc3RhbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyBhcmUgcGFydCBvZiB0aGUKKyAgICAgKiBkZXRhY2hlZCBncmFwaC4KKyAgICAgKgorICAgICAqIEBzZWUgRGV0YWNoU3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhY2hTdGF0ZShpbnQgbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGNsZWFyIHN0YXRlIHdoZW4gZW50ZXJpbmcgYSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgQXV0b0NsZWFyCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBdXRvQ2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY2xlYXIgc3RhdGUgd2hlbiBlbnRlcmluZyBhIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHNlZSBBdXRvQ2xlYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ2xlYXIoaW50IGNsZWFyKTsKKworICAgIC8qKgorICAgICAqIEJpdCBmbGFncyBtYXJrZWQgaW4ge0BsaW5rIEF1dG9EZXRhY2h9IHdoaWNoIGluZGljYXRlIHdoZW4gcGVyc2lzdGVudAorICAgICAqIG1hbmFnZWQgb2JqZWN0cyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRhY2hlZCBpbi1wbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEF1dG9EZXRhY2goKTsKKworICAgIC8qKgorICAgICAqIEJpdCBmbGFncyBtYXJrZWQgaW4ge0BsaW5rIEF1dG9EZXRhY2h9IHdoaWNoIGluZGljYXRlIHdoZW4gcGVyc2lzdGVudAorICAgICAqIG1hbmFnZWQgb2JqZWN0cyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRhY2hlZCBpbi1wbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGV0YWNoKGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBCaXQgZmxhZ3MgbWFya2VkIGluIHtAbGluayBBdXRvRGV0YWNofSB3aGljaCBpbmRpY2F0ZSB3aGVuIHBlcnNpc3RlbnQKKyAgICAgKiBtYW5hZ2VkIG9iamVjdHMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGV0YWNoZWQgaW4tcGxhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0RldGFjaChpbnQgZmxhZywgYm9vbGVhbiBvbik7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsc28gZXZpY3QgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlIGNhY2hlIHdoZW4gaXQgaXMKKyAgICAgKiBldmljdGVkIHRocm91Z2ggdGhpcyBlbnRpdHkgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFdmljdEZyb21TdG9yZUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsc28gZXZpY3QgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlIGNhY2hlIHdoZW4gaXQgaXMKKyAgICAgKiBldmljdGVkIHRocm91Z2ggdGhpcyBlbnRpdHkgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFdmljdEZyb21TdG9yZUNhY2hlKGJvb2xlYW4gZXZpY3QpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvYmplY3RzIGFjY2Vzc2VkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgICAgICogc3RvcmUgY2FjaGUuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQb3B1bGF0ZVN0b3JlQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcG9wdWxhdGUgdGhlIHN0b3JlIGNhY2hlIHdpdGggb2JqZWN0cyB1c2VkIGJ5IHRoaXMKKyAgICAgKiB0cmFuc2FjdGlvbi4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuNAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcHVsYXRlU3RvcmVDYWNoZShib29sZWFuIGNhY2hlKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgbWVtb3J5IHVzYWdlIGlzIHJlZHVjZWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24gYXQgdGhlIGV4cGVuc2UKKyAgICAgKiBvZiBwb3NzaWJseSBtb3JlIGFnZ3Jlc3NpdmUgZGF0YSBjYWNoZSBldmljdGlvbnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMC4zLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhcmdlVHJhbnNhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIElmIGEgbGFyZ2UgbnVtYmVyIG9mIG9iamVjdHMgd2lsbCBiZSBjcmVhdGVkLCBtb2RpZmllZCwgb3IgZGVsZXRlZAorICAgICAqIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gdHJ1ZSB3aWxsIHJlZHVjZSBtZW1vcnkKKyAgICAgKiB1c2FnZSBpZiB5b3UgcGVyZm9ybSBwZXJpb2RpYyBmbHVzaGVzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy40CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFyZ2VUcmFuc2FjdGlvbihib29sZWFuIGxhcmdlVHJhbnNhY3Rpb24pOworCisgICAgLyoqCisgICAgICogUHV0IHRoZSBzcGVjaWZpZWQga2V5LXZhbHVlIHBhaXIgaW50byB0aGUgbWFwIG9mIHVzZXIgb2JqZWN0cy4gVXNlCisgICAgICogYSB2YWx1ZSBvZiBudWxsIHRvIHJlbW92ZSB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcHV0VXNlck9iamVjdChPYmplY3Qga2V5LCBPYmplY3QgdmFsKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIG1hcCBvZiB1c2VyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRVc2VyT2JqZWN0KE9iamVjdCBrZXkpOworCisgICAgLy8vLy8vLy8vLworICAgIC8vIEV2ZW50cworICAgIC8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIHRyYW5zYWN0aW9uLXJlbGF0ZWQgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zYWN0aW9uTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciB0cmFuc2FjdGlvbi1yZWxhdGVkIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmFuc2FjdGlvbkxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIENhbGxiYWNrTW9kZXN9IGZsYWdzIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbiBsaXN0ZW5lcgorICAgICAqIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbkxpc3RlbmVyQ2FsbGJhY2tNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIENhbGxiYWNrTW9kZXN9IGZsYWdzIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbiBsaXN0ZW5lcgorICAgICAqIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25MaXN0ZW5lckNhbGxiYWNrTW9kZShpbnQgY2FsbGJhY2tNb2RlKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIGxpZmVjeWNsZS1yZWxhdGVkIGV2ZW50cyBvbiB0aGUgc3BlY2lmaWVkCisgICAgICogY2xhc3Nlcy4gSWYgdGhlIGNsYXNzZXMgYXJlIG51bGwsIGFsbCBldmVudHMgd2lsbCBiZSBwcm9wYWdhdGVkIHRvCisgICAgICogdGhlIGxpc3RlbmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lciwgQ2xhc3MuLi4gY2xhc3Nlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGlmZWN5Y2xlLXJlbGF0ZWQgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIENhbGxiYWNrTW9kZXN9IGZsYWdzIGZvciBoYW5kbGluZyBsaWZlY3ljbGUgbGlzdGVuZXIKKyAgICAgKiBleGNlcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQ2FsbGJhY2tNb2Rlc30gZmxhZ3MgZm9yIGhhbmRsaW5nIGxpZmVjeWNsZSBsaXN0ZW5lcgorICAgICAqIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlTGlzdGVuZXJDYWxsYmFja01vZGUoaW50IGNhbGxiYWNrTW9kZSk7CisKKyAgICAvLy8vLy8vLy8vLworICAgIC8vIExvb2t1cHMKKyAgICAvLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3RzIHdpdGggdGhlIGdpdmVuIG9pZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2lkcyB0aGUgb2lkcyBvZiB0aGUgb2JqZWN0cyB0byByZXR1cm4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3RzIHRoYXQgd2VyZSBsb29rZWQgdXAsIGluIHRoZQorICAgICAqIHNhbWUgb3JkZXIgYXMgdGhlIG9pZHMgcGFyYW1ldGVyLgorICAgICAqIEBzZWUgI2ZpbmQoQ2xhc3MsT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyA8VD4gVFtdIGZpbmRBbGwoQ2xhc3M8VD4gY2xzLCBPYmplY3QuLi4gb2lkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdHMgd2l0aCB0aGUgZ2l2ZW4gb2lkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvaWRzIHRoZSBvaWRzIG9mIHRoZSBvYmplY3RzIHRvIHJldHVybgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdHMgdGhhdCB3ZXJlIGxvb2tlZCB1cCwgaW4gdGhlCisgICAgICogc2FtZSBvcmRlciBhcyB0aGUgb2lkcyBwYXJhbWV0ZXIuCisgICAgICogQHNlZSAjZmluZChDbGFzcyxPYmplY3QpCisgICAgICovCisgICAgcHVibGljIDxUPiBDb2xsZWN0aW9uPFQ+IGZpbmRBbGwoQ2xhc3M8VD4gY2xzLCBDb2xsZWN0aW9uIG9pZHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYWNoZWQgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBvaWQvb2JqZWN0LCBvciBudWxsIGlmIG5vdAorICAgICAqIGNhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvaWQgdGhlIG9iamVjdCdzIGlkCisgICAgICogQHJldHVybiB0aGUgY2FjaGVkIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgY2FjaGVkCisgICAgICovCisgICAgcHVibGljIDxUPiBUIGZpbmRDYWNoZWQoQ2xhc3M8VD4gY2xzLCBPYmplY3Qgb2lkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MgdGhlIGdpdmVuIHBlcnNpc3RlbnQgY2xhc3MgdXNlcworICAgICAqIGZvciBvYmplY3QgaWRzLCBvciBudWxsIGlmIG5vdCBhIHR5cGUgdGhhdCB1c2VzIGFwcGxpY2F0aW9uIGlkZW50aXR5LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRPYmplY3RJZENsYXNzKENsYXNzIHBjQ2xhc3MpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRyYW5zYWN0aW9ucworICAgIC8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIElzc3VlIGEgY29tbWl0IGFuZCB0aGVuIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uLiBUaGlzIGlzIGlkZW50aWNhbCB0bzoKKyAgICAgKiA8cHJlPiBtYW5hZ2VyLmNvbW1pdCAoKTsgbWFuYWdlci5iZWdpbiAoKTsKKyAgICAgKiA8L3ByZT4gZXhjZXB0IHRoYXQgdGhlIGVudGl0eSBtYW5hZ2VyJ3MgaW50ZXJuYWwgYXRvbWljIGxvY2sgaXMgdXRpbGl6ZWQsCisgICAgICogc28gdGhpcyBtZXRob2QgY2FuIGJlIHNhZmVseSBleGVjdXRlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgICAgICoKKyAgICAgKiBAc2VlICNjb21taXQoKQorICAgICAqIEBzZWUgI2JlZ2luKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21taXRBbmRSZXN1bWUoKTsKKworICAgIC8qKgorICAgICAqIElzc3VlIGEgcm9sbGJhY2sgYW5kIHRoZW4gc3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24uIFRoaXMgaXMgaWRlbnRpY2FsIHRvOgorICAgICAqIDxwcmU+IG1hbmFnZXIucm9sbGJhY2sgKCk7IG1hbmFnZXIuYmVnaW4gKCk7CisgICAgICogPC9wcmU+IGV4Y2VwdCB0aGF0IHRoZSBlbnRpdHkgbWFuYWdlcidzIGludGVybmFsIGF0b21pYyBsb2NrIGlzIHV0aWxpemVkLAorICAgICAqIHNvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqCisgICAgICogQHNlZSAjcm9sbGJhY2soKQorICAgICAqIEBzZWUgI2JlZ2luKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByb2xsYmFja0FuZFJlc3VtZSgpOworCisgICAgLyoqCisgICAgICogTWFyayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBmb3Igcm9sbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sbGJhY2tPbmx5KCk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGZvciByb2xsYmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgY2F1c2UKKyAgICAgKiBvZiB0aGUgcm9sbGJhY2suCisgICAgICoKKyAgICAgKiBAc2luY2UgMC45LjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xsYmFja09ubHkoVGhyb3dhYmxlIGNhdXNlKTsKKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIHRyYW5zYWN0aW9uIHRvIGJlCisgICAgICogbWFya2VkIGZvciByb2xsYmFjay4gCisgICAgICogIAorICAgICAqIEByZXR1cm4gdGhlIFRocm93YWJsZSwgb3IgbnVsbCBpZiBub25lIHdhcyBnaXZlbgorICAgICAqCisgICAgICogQHNpbmNlIDAuOS43CisgICAgICovCisgICAgcHVibGljIFRocm93YWJsZSBnZXRSb2xsYmFja0NhdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBoYXMgYmVlbiBtYXJrZWQgZm9yIHJvbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJvbGxiYWNrT25seSgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgdHJhbnNhY3Rpb25hbCBzYXZlcG9pbnQgd2hlcmUgb3BlcmF0aW9ucyBhZnRlciB0aGlzIHNhdmVwb2ludAorICAgICAqIHdpbGwgYmUgcm9sbGVkIGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2F2ZXBvaW50KFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJvbGxiYWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIHRoZSBsYXN0IHNhdmVwb2ludC4KKyAgICAgKiBTYXZlcG9pbnRzIHNldCBhZnRlciB0aGlzIG9uZSB3aWxsIGJlY29tZSBpbnZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrVG9TYXZlcG9pbnQoKTsKKworICAgIC8qKgorICAgICAqIFJvbGxiYWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIHRoZSBnaXZlbiBzYXZlcG9pbnQgbmFtZS4KKyAgICAgKiBTYXZlcG9pbnRzIHNldCBhZnRlciB0aGlzIG9uZSB3aWxsIGJlY29tZSBpbnZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrVG9TYXZlcG9pbnQoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgbGFzdCBzZXQgc2F2ZXBvaW50IGFuZCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKiBUaGUgZ2l2ZW4gc2F2ZXBvaW50IGFuZCBhbnkgc2V0IGFmdGVyIGl0IHdpbGwgYmVjb21lIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludCgpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2F2ZXBvaW50IGFuZCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKiBUaGUgZ2l2ZW4gc2F2ZXBvaW50IGFuZCBhbnkgc2V0IGFmdGVyIGl0IHdpbGwgYmVjb21lIGludmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVNhdmVwb2ludChTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSdW4gcHJlLWZsdXNoIGFjdGlvbnMgb24gdHJhbnNhY3Rpb25hbCBvYmplY3RzLCBpbmNsdWRpbmcKKyAgICAgKiBwZXJzaXN0ZW5jZS1ieS1yZWFjaGFiaWxpdHksIGludmVyc2UgcmVsYXRpb25zaGlwIG1hbmFnZW1lbnQsCisgICAgICogZGVsZXRpb24gb2YgZGVwZW5kZW50IGluc3RhbmNlcywgYW5kIGluc3RhbmNlIGNhbGxiYWNrcy4KKyAgICAgKiBUcmFuc2FjdGlvbiBsaXN0ZW5lcnMgYXJlIG5vdCBpbnZva2VkLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJlRmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyB0cmFuc2FjdGlvbiwgcmVwb3J0aW5nIGFueSBvcHRpbWlzdGljCisgICAgICogdmlvbGF0aW9ucywgY29uc3RyYWludCB2aW9sYXRpb25zLCBldGMuIEluIGEgZGF0YXN0b3JlIHRyYW5zYWN0aW9uIG9yCisgICAgICogYSBmbHVzaGVkIG9wdGltaXN0aWMgdHJhbnNhY3Rpb24sIHRoaXMgbWV0aG9kIHdpbGwgYWN0IGp1c3QgbGlrZQorICAgICAqIHtAbGluayAjZmx1c2goKX0uIEluIGFuIG9wdGltaXN0aWMgdHJhbnNhY3Rpb24gdGhhdCBoYXMgbm90IHlldCBiZWd1biBhCisgICAgICogZGF0YXN0b3JlLWxldmVsIHRyYW5zYWN0aW9uLCBob3dldmVyLCBpdCB3aWxsIG9ubHkgcmVwb3J0IGV4Y2VwdGlvbnMKKyAgICAgKiB0aGF0IHdvdWxkIG9jY3VyIG9uIGZsdXNoLCB3aXRob3V0IHJldGFpbmluZyBhbnkgZGF0YXN0b3JlIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNoYW5nZXMoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgYSBzdG9yZSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdG9yZUFjdGl2ZSgpOworCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgc3RvcmUgdHJhbnNhY3Rpb24gaWYgb25lIGlzbid0IGFscmVhZHkgc3RhcnRlZC4gVGhlCisgICAgICogZW50aXR5IG1hbmFnZXIgbXVzdCBhbHJlYWR5IGJlIGluIGEgbG9naWNhbCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblN0b3JlKCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE9iamVjdCBMaWZlY3ljbGUKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0cyBhcmUgbWFuYWdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3QuLi4gcGNzKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdHMgYXJlIG1hbmFnZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBwY3MpOworCisgICAgLyoqCisgICAgICogUGVyc2lzdCB0aGUgZ2l2ZW4gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwZXJzaXN0QWxsKE9iamVjdC4uLiBwY3MpOworCisgICAgLyoqCisgICAgICogUGVyc2lzdCB0aGUgZ2l2ZW4gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwZXJzaXN0QWxsKENvbGxlY3Rpb24gcGNzKTsKKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgZ2l2ZW4gcGVyc2lzdGVudCBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbChPYmplY3QuLi4gcGNzKTsKKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgZ2l2ZW4gcGVyc2lzdGVudCBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbChDb2xsZWN0aW9uIHBjcyk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBnaXZlbiBvYmplY3QgZnJvbSBtYW5hZ2VtZW50LiBUaGlzIG9wZXJhdGlvbiBpcyBub3QKKyAgICAgKiByZWN1cnNpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZShPYmplY3QgcGMpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgZ2l2ZW4gb2JqZWN0IGZyb20gbWFuYWdlbWVudC4gVGhpcyBvcGVyYXRpb24gaXMgbm90CisgICAgICogcmVjdXJzaXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VBbGwoT2JqZWN0Li4uIHBjcyk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBnaXZlbiBvYmplY3RzIGZyb20gbWFuYWdlbWVudC4gVGhpcyBvcGVyYXRpb24gaXMgbm90CisgICAgICogcmVjdXJzaXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VBbGwoQ29sbGVjdGlvbiBwY3MpOworCisgICAgLyoqCisgICAgICogSW1tZWRpYXRlbHkgbG9hZCB0aGUgZ2l2ZW4gb2JqZWN0J3MgcGVyc2lzdGVudCBmaWVsZHMuIE9uZSBtaWdodAorICAgICAqIHVzZSB0aGlzIGFjdGlvbiB0byBtYWtlIHN1cmUgdGhhdCBhbiBpbnN0YW5jZSdzIGZpZWxkcyBhcmUgbG9hZGVkCisgICAgICogYmVmb3JlIHRyYW5zaXRpb25pbmcgaXQgdG8gdHJhbnNpZW50LiBOb3RlIHRoYXQgdGhpcyBhY3Rpb24gaXMgbm90CisgICAgICogcmVjdXJzaXZlLiBBbnkgcmVsYXRlZCBvYmplY3RzIHRoYXQgYXJlIGxvYWRlZCB3aWxsIG5vdCBuZWNlc3NhcmlseQorICAgICAqIGhhdmUgdGhlaXIgZmllbGRzIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXRyaWV2ZShPYmplY3QgcGMpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAc2VlICNyZXRyaWV2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlQWxsKE9iamVjdC4uLiBwY3MpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAc2VlICNyZXRyaWV2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldHJpZXZlQWxsKENvbGxlY3Rpb24gcGNzKTsKKworICAgIC8qKgorICAgICAqIFJlZnJlc2ggdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hBbGwoT2JqZWN0Li4uIHBjcyk7CisKKyAgICAvKioKKyAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoQWxsKENvbGxlY3Rpb24gcGNzKTsKKworICAgIC8qKgorICAgICAqIFJlZnJlc2ggYWxsIHRyYW5zYWN0aW9uYWwgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdCB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0KE9iamVjdCBwYyk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdCB0aGUgZ2l2ZW4gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBldmljdEFsbChPYmplY3QuLi4gcGNzKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0IHRoZSBnaXZlbiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKENvbGxlY3Rpb24gcGNzKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0IGFsbCBjbGVhbiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdCBhbGwgcGVyc2lzdGVudC1jbGVhbiBhbmQgcGVyc2lzdGVudC1ub250cmFuc2FjdGlvbmFsCisgICAgICogaW5zdGFuY2VzIGluIHRoZSBleHRlbnQgb2YgdGhlIGdpdmVuIGNsYXNzIChpbmNsdWRpbmcgc3ViY2xhc3NlcykuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0IGFsbCBwZXJzaXN0ZW50LWNsZWFuIGFuZCBwZXJzaXN0ZW50LW5vbnRyYW5zYWN0aW9uYWwKKyAgICAgKiBpbnN0YW5jZXMgaW4gdGhlIGdpdmVuIHtAbGluayBFeHRlbnR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKEV4dGVudCBleHRlbnQpOworCisgICAgLyoqCisgICAgICogRGV0YWNoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIGVudGl0eSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIHRoZSBpbnN0YW5jZSB0byBkZXRhY2gKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXRhY2hlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBkZXRhY2goVCBwYyk7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGVudGl0eSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHBjcyB0aGUgaW5zdGFuY2VzIHRvIGRldGFjaAorICAgICAqIEByZXR1cm4gdGhlIGRldGFjaGVkIGluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGRldGFjaEFsbChDb2xsZWN0aW9uIHBjcyk7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGVudGl0eSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHBjcyB0aGUgaW5zdGFuY2VzIHRvIGRldGFjaAorICAgICAqIEByZXR1cm4gdGhlIGRldGFjaGVkIGluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBkZXRhY2hBbGwoT2JqZWN0Li4uIHBjcyk7CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgaW50byB0aGUgZW50aXR5IG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGNzIGluc3RhbmNlcyB0byBpbXBvcnQKKyAgICAgKiBAcmV0dXJuIHRoZSByZS1hdHRhY2hlZCBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gbWVyZ2VBbGwoT2JqZWN0Li4uIHBjcyk7CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgc3BlY2lmaWVkIGRldGFjaGVkIG9iamVjdHMgaW50byB0aGUgZW50aXR5IG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGNzIENvbGxlY3Rpb24gb2YgaW5zdGFuY2VzIHRvIGltcG9ydAorICAgICAqIEByZXR1cm4gdGhlIHJlLWF0dGFjaGVkIGluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIG1lcmdlQWxsKENvbGxlY3Rpb24gcGNzKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIG9iamVjdCB0cmFuc2FjdGlvbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIGluc3RhbmNlIHRvIG1ha2UgdHJhbnNhY3Rpb25hbAorICAgICAqIEBwYXJhbSB1cGRhdGVWZXJzaW9uIGlmIHRydWUsIHRoZSBpbnN0YW5jZSdzIHZlcnNpb24gd2lsbCBiZQorICAgICAqIGluY3JlbWVudGVkIGF0IHRoZSBuZXh0IGZsdXNoCisgICAgICovCisgICAgcHVibGljIHZvaWQgdHJhbnNhY3Rpb25hbChPYmplY3QgcGMsIGJvb2xlYW4gdXBkYXRlVmVyc2lvbik7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBnaXZlbiBvYmplY3RzIHRyYW5zYWN0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqcyBpbnN0YW5jZXMgdG8gbWFrZSB0cmFuc2FjdGlvbmFsCisgICAgICogQHBhcmFtIHVwZGF0ZVZlcnNpb24gaWYgdHJ1ZSwgdGhlIGluc3RhbmNlJ3MgdmVyc2lvbiB3aWxsIGJlCisgICAgICogaW5jcmVtZW50ZWQgYXQgdGhlIG5leHQgZmx1c2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbmFsQWxsKENvbGxlY3Rpb24gb2JqcywgYm9vbGVhbiB1cGRhdGVWZXJzaW9uKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIG9iamVjdHMgdHJhbnNhY3Rpb25hbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpzIGluc3RhbmNlcyB0byBtYWtlIHRyYW5zYWN0aW9uYWwKKyAgICAgKiBAcGFyYW0gdXBkYXRlVmVyc2lvbiBpZiB0cnVlLCB0aGUgaW5zdGFuY2UncyB2ZXJzaW9uIHdpbGwgYmUKKyAgICAgKiBpbmNyZW1lbnRlZCBhdCB0aGUgbmV4dCBmbHVzaAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0aW9uYWxBbGwoT2JqZWN0W10gb2JqcywgYm9vbGVhbiB1cGRhdGVWZXJzaW9uKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIG9iamVjdCBub250cmFuc2FjdGlvbmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vbnRyYW5zYWN0aW9uYWwoT2JqZWN0IHBjKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIGdpdmVuIG9iamVjdHMgbm9udHJhbnNhY3Rpb25hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub250cmFuc2FjdGlvbmFsQWxsKENvbGxlY3Rpb24gb2Jqcyk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBnaXZlbiBvYmplY3RzIG5vbnRyYW5zYWN0aW9uYWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm9udHJhbnNhY3Rpb25hbEFsbChPYmplY3RbXSBvYmpzKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBFeHRlbnQsIFF1ZXJ5LCBHZW5lcmF0b3IKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVkIGdlbmVyYXRvciBkZWZpbmVkIGluIHRoZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJhdG9yIGdldE5hbWVkR2VuZXJhdG9yKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgR2VuZXJhdG9yfSBmb3IgdGhlIGRhdGFzdG9yZSBpZGVudGl0eSB2YWx1ZXMgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIHR5cGUsIG9yIG51bGwgaWYgdGhlIHR5cGUgaXMgdW5tYW5hZ2VkIG9yIGl0cyBpZGVudGl0eQorICAgICAqIGNhbm5vdCBiZSByZXByZXNlbnRlZCBieSBhIHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBHZW5lcmF0b3IgZ2V0SWRHZW5lcmF0b3IoQ2xhc3MgZm9yQ2xhc3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBHZW5lcmF0b3J9IGZvciB0aGUgZ2VuZXJhdGVkIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogdHlwZSwgb3IgbnVsbCBpZiB0aGUgZmllbGQgaXMgbm90IGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJhdG9yIGdldEZpZWxkR2VuZXJhdG9yKENsYXNzIGZvckNsYXNzLCBTdHJpbmcgZmllbGROYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBleHRlbnQgb2YgdGhlIGdpdmVuIGNsYXNzLCBvcHRpb25hbGx5IGluY2x1ZGluZyBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gRXh0ZW50PFQ+IGNyZWF0ZUV4dGVudChDbGFzczxUPiBjbHMsIGJvb2xlYW4gc3Vicyk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNyZWF0ZVF1ZXJ5KFN0cmluZyBxdWVyeSk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNyZWF0ZU5hbWVkUXVlcnkoU3RyaW5nIG5hbWUpOworCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsKTsKKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgY3JlYXRlTmF0aXZlUXVlcnkoU3RyaW5nIHNxbCwgQ2xhc3MgcmVzdWx0Q2xhc3MpOworCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsLCBTdHJpbmcgcmVzdWx0TWFwcGluZyk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgcXVlcnkgZnJvbSB0aGUgZ2l2ZW4gb25lLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgY3JlYXRlUXVlcnkoUXVlcnkgcXVlcnkpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHF1ZXJ5IGluIHRoZSBnaXZlbiBsYW5ndWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNyZWF0ZVF1ZXJ5KFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIHF1ZXJ5KTsKKworICAgIC8vLy8vLy8vLy8vCisgICAgLy8gTG9ja2luZworICAgIC8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2sgbW9kZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UsIG9yIG51bGwgaWYgbm90IGxvY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9ja01vZGVUeXBlIGdldExvY2tNb2RlKE9iamVjdCBwYyk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2UgaXMgbG9ja2VkIGF0IHRoZSBnaXZlbiBsb2NrIGxldmVsLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIHRoZSBvYmplY3QgdG8gbG9jaworICAgICAqIEBwYXJhbSBtb2RlIHRoZSBsb2NrIGxldmVsIHRvIHVzZQorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBsb2NrIGJlZm9yZQorICAgICAqIGdpdmluZyB1cCwgb3IgLTEgZm9yIG5vIGxpbWl0CisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9jayhPYmplY3QgcGMsIExvY2tNb2RlVHlwZSBtb2RlLCBpbnQgdGltZW91dCk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2UgaXMgbG9ja2VkIGF0IHRoZSBjdXJyZW50IGxvY2sgbGV2ZWwsIGFzCisgICAgICogc2V0IGluIHRoZSB7QGxpbmsgRmV0Y2hQbGFufSBmb3IgdGhlIGVudGl0eSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IHBjKTsKKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBpbnN0YW5jZXMgYXJlIGxvY2tlZCBhdCB0aGUgZ2l2ZW4gbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwY3MgdGhlIG9iamVjdHMgdG8gbG9jaworICAgICAqIEBwYXJhbSBtb2RlIHRoZSBsb2NrIGxldmVsIHRvIHVzZQorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBsb2NrIGJlZm9yZQorICAgICAqIGdpdmluZyB1cCwgb3IgLTEgZm9yIG5vIGxpbWl0CisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9ja0FsbChDb2xsZWN0aW9uIHBjcywgTG9ja01vZGVUeXBlIG1vZGUsIGludCB0aW1lb3V0KTsKKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBpbnN0YW5jZXMgYXJlIGxvY2tlZCBhdCB0aGUgY3VycmVudCBsb2NrIGxldmVsLAorICAgICAqIGFzIHNldCBpbiB0aGUge0BsaW5rIEZldGNoUGxhbn0gZm9yIHRoZSBlbnRpdHkgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2NrQWxsKENvbGxlY3Rpb24gcGNzKTsKKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBpbnN0YW5jZXMgYXJlIGxvY2tlZCBhdCB0aGUgZ2l2ZW4gbG9jayBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwY3MgdGhlIG9iamVjdHMgdG8gbG9jaworICAgICAqIEBwYXJhbSBtb2RlIHRoZSBsb2NrIGxldmVsIHRvIHVzZQorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBsb2NrIGJlZm9yZQorICAgICAqIGdpdmluZyB1cCwgb3IgLTEgZm9yIG5vIGxpbWl0CisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9ja0FsbChPYmplY3RbXSBwY3MsIExvY2tNb2RlVHlwZSBtb2RlLCBpbnQgdGltZW91dCk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2VzIGFyZSBsb2NrZWQgYXQgdGhlIGN1cnJlbnQgbG9jayBsZXZlbCwKKyAgICAgKiBhcyBzZXQgaW4gdGhlIHtAbGluayBGZXRjaFBsYW59IGZvciB0aGUgZW50aXR5IG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9ja0FsbChPYmplY3QuLi4gcGNzKTsKKworICAgIC8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29ubmVjdGlvbgorICAgIC8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYWxsIHBlbmRpbmcgZGF0YSBzdG9yZSBzdGF0ZW1lbnRzLiBJZiBzdGF0ZW1lbnRzIGFyZSBjYW5jZWxsZWQKKyAgICAgKiB3aGlsZSBhIGZsdXNoIGlzIGluIHByb2dyZXNzLCB0aGUgdHJhbnNhY3Rpb24gcm9sbGJhY2sgb25seSBmbGFnIHdpbGwKKyAgICAgKiBiZSBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IHN0YXRlbWVudHMgd2VyZSBjYW5jZWxsZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbEFsbCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIGluIHVzZSBieSB0aGUgZW50aXR5IG1hbmFnZXIsIG9yIGEgbmV3CisgICAgICogY29ubmVjdGlvbiBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29ubmVjdGlvbigpOworCisgICAgLy8vLy8vLy8vCisgICAgLy8gQ2FjaGUKKyAgICAvLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNldCBvZiBhbGwgbWFuYWdlZCBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0TWFuYWdlZE9iamVjdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNldCBvZiBjdXJyZW50IHRyYW5zYWN0aW9uIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRUcmFuc2FjdGlvbmFsT2JqZWN0cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2V0IG9mIGluc3RhbmNlcyB3aGljaCB3aWxsIGJlY29tZSB0cmFuc2FjdGlvbmFsIHVwb24KKyAgICAgKiB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQZW5kaW5nVHJhbnNhY3Rpb25hbE9iamVjdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNldCBvZiBjdXJyZW50IGRpcnR5IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXREaXJ0eU9iamVjdHMoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgZGlydHkgb2JqZWN0cyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGlydGllZC4KKyAgICAgKiBEZWZhdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIHN0b3JlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3JkZXJEaXJ0eU9iamVjdHMoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgZGlydHkgb2JqZWN0cyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGlydGllZC4KKyAgICAgKiBEZWZhdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIHN0b3JlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJEaXJ0eU9iamVjdHMoYm9vbGVhbiBvcmRlcik7CisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBnaXZlbiBjbGFzcyBhcyBkaXJ0eSB3aXRoaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlydHlDbGFzcyhDbGFzcyBjbHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHBlcnNpc3RlbnQgaW4gdGhlIGN1cnJlbnQKKyAgICAgKiB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxDbGFzcz4gZ2V0UGVyc2lzdGVkQ2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIGluIHRoZSBjdXJyZW50CisgICAgICogdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248Q2xhc3M+IGdldFJlbW92ZWRDbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjbGFzc2VzIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkCisgICAgICogaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248Q2xhc3M+IGdldFVwZGF0ZWRDbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdHlwZSA8Y29kZT5jbHM8L2NvZGU+LiBJZiA8Y29kZT5jbHM8L2NvZGU+IGlzCisgICAgICogYW4gaW50ZXJmYWNlIG9yIGFuIGFic3RyYWN0IGNsYXNzIHdob3NlIGFic3RyYWN0IG1ldGhvZHMgZm9sbG93IHRoZQorICAgICAqIEphdmFCZWFucyBjb252ZW50aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBtZXRhZGF0YSB0aGF0IGRlZmluZXMgdGhlIGNsYXNzLiBJZiA8Y29kZT5jbHM8L2NvZGU+CisgICAgICogaXMgYSBub24tZmluYWwgY29uY3JldGUgdHlwZSB0aGF0IGhhcyBtZXRhZGF0YSBidXQgZG9lcyBub3QgaW1wbGVtZW50CisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZX0sIHRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGEKKyAgICAgKiBzdWJjbGFzcyBvZiB0aGUgdHlwZSB0aGF0IGRvZXMgaW1wbGVtZW50CisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBlcnNpc3RlbmNlQ2FwYWJsZX0sCisgICAgICogZm9sbG93aW5nIHRoZSBwcm9wZXJ0eS1iYXNlZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBhY2Nlc3MgcnVsZXMsIG9yCisgICAgICogd2lsbCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGNsYXNzIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cworICAgICAqIGZvciBzdWJjbGFzc2luZy4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgY3JlYXRlSW5zdGFuY2UoQ2xhc3M8VD4gY2xzKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgdGhlIG5hbWVkIGZpZWxkIG9mIHRoZSBnaXZlbiBvYmplY3QgZGlydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlydHkoT2JqZWN0IG8sIFN0cmluZyBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9pZCBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJZChPYmplY3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGRpcnR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoT2JqZWN0IG8pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyB0cmFuc2FjdGlvbmFsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25hbChPYmplY3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIHBlcnNpc3RlbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KE9iamVjdCBvKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3Qgd2FzIG1hZGUgcGVyc2lzdGVudCBpbiB0aGUgY3VycmVudAorICAgICAqIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3bHlQZXJzaXN0ZW50KE9iamVjdCBvKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWQoT2JqZWN0IG8pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5wYzwvY29kZT4gaXMgYSBkZXRhY2hlZCBvYmplY3QKKwkgKiAob25lIHRoYXQgY2FuIGJlIHJlYXR0YWNoZWQgdG8gYSB7QGxpbmsgRW50aXR5TWFuYWdlcn0gdmlhIGEgY2FsbAorCSAqIHRvIHtAbGluayBFbnRpdHlNYW5hZ2VyI21lcmdlfSk7IG90aGVyd2lzZSByZXR1cm5zCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQgKE9iamVjdCBvKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVyc2lvbiBpbmRpY2F0b3IgZm9yIDxjb2RlPm88L2NvZGU+LgorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0VmVyc2lvbiAoT2JqZWN0IG8pOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTlmNWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQ29ubmVjdGlvblJldGFpbk1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5DbG9zZWFibGU7CisKKy8qKgorICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IE9wZW5KUEEgZW50aXR5IG1hbmFnZXIgZmFjdG9yaWVzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqIEBwdWJsaXNoZWQKKyAqLworcHVibGljIGludGVyZmFjZSBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICBleHRlbmRzIEVudGl0eU1hbmFnZXJGYWN0b3J5LCBDb25uZWN0aW9uUmV0YWluTW9kZXMsIENsb3NlYWJsZSwKKyAgICBTZXJpYWxpemFibGUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBwcm9wZXJ0aWVzIGRlc2NyaWJpbmcgdGhpcyBydW50aW1lLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFB1dCB0aGUgc3BlY2lmaWVkIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIG1hcCBvZiB1c2VyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXRVc2VyT2JqZWN0KE9iamVjdCBrZXksIE9iamVjdCB2YWwpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgbWFwIG9mIHVzZXIgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3MgdGhlIGxldmVsIDIgc3RvcmUgY2FjaGUuIFRoaXMgY2FjaGUgYWN0cyBhcyBhIHByb3h5IHRvIGFsbAorICAgICAqIG5hbWVkIGNhY2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVDYWNoZSBnZXRTdG9yZUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3MgYSBuYW1lZCBsZXZlbCAyIHN0b3JlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyBTdG9yZUNhY2hlIGdldFN0b3JlQ2FjaGUoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogQWNjZXNzIHF1ZXJ5IHJlc3VsdCBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlSZXN1bHRDYWNoZSBnZXRRdWVyeVJlc3VsdENhY2hlKCk7CisKKyAgICBwdWJsaWMgT3BlbkpQQUVudGl0eU1hbmFnZXIgY3JlYXRlRW50aXR5TWFuYWdlcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVudGl0eSBtYW5hZ2VyIHdpdGggdGhlIHByb3ZpZGVkIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbgorICAgICAqIHNldHRpbmdzLiBPcGVuSlBBIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGluIHRoaXMKKyAgICAgKiBtZXRob2Q6CisgICAgICogPHVsPgorICAgICAqIDxsaT5vcGVuanBhLkNvbm5lY3Rpb25Vc2VybmFtZTwvbGk+CisgICAgICogPGxpPm9wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkPC9saT4KKyAgICAgKiA8bGk+b3BlbmpwYS5Db25uZWN0aW9uUmV0YWluTW9kZTwvbGk+CisgICAgICogPGxpPm9wZW5qcGEuVHJhbnNhY3Rpb25Nb2RlPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBRW50aXR5TWFuYWdlciBjcmVhdGVFbnRpdHlNYW5hZ2VyKE1hcCBwcm9wcyk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBsaWZlY3ljbGUtcmVsYXRlZCBldmVudHMgb24gdGhlIHNwZWNpZmllZAorICAgICAqIGNsYXNzZXMuIElmIHRoZSBjbGFzc2VzIGFyZSBudWxsLCBhbGwgZXZlbnRzIHdpbGwgYmUgcHJvcGFnYXRlZCB0bworICAgICAqIHRoZSBsaXN0ZW5lci4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgcGFzc2VkIG9uIHRvIGFsbCBuZXcgZW50aXR5CisgICAgICogbWFuYWdlcnMuIFNlZSB0aGUgPGNvZGU+b3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50PC9jb2RlPiBwYWNrYWdlIGZvciAKKyAgICAgKiBsaXN0ZW5lciB0eXBlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAwLjMuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lciwgQ2xhc3MuLi4gY2xhc3Nlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGlmZWN5Y2xlLXJlbGF0ZWQgZXZlbnRzLgorICAgICAqCisgICAgICogQHNpbmNlIDAuMy4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIgKE9iamVjdCBsaXN0ZW5lcik7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQVBlcnNpc3RlbmNlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQVBlcnNpc3RlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkZGMzMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcGVuSlBBUGVyc2lzdGVuY2UuamF2YQpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnk7CitpbXBvcnQgamF2YXgucm1pLlBvcnRhYmxlUmVtb3RlT2JqZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUGVyc2lzdGVuY2VDYXBhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQm9vdHN0cmFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5CeXRlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQ2hhcklkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkRvdWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkZsb2F0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW1wbEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbnRJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Mb25nSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUlkOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlNob3J0SWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RyaW5nSWQ7CisKKy8qKgorICogU3RhdGljIGhlbHBlciBtZXRob2QgZm9yIEpQQSB1c2VycywgaW5jbHVkaW5nIHN3aXRjaGluZworICogYmV0d2VlbiBPcGVuSlBBIG5hdGl2ZSBhbmQgSmF2YSBQZXJzaXN0ZW5jZSBBUElzLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAcHVibGlzaGVkCisgKiBAc2luY2UgMC40LjAKKyAqLworcHVibGljIGNsYXNzIE9wZW5KUEFQZXJzaXN0ZW5jZQorICAgIGV4dGVuZHMgUGVyc2lzdGVuY2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1fS0VZID0KKyAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUZfS0VZID0KKyAgICAgICAgIm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGl6ZXIgX2xvYyA9CisgICAgICAgIExvY2FsaXplci5mb3JQYWNrYWdlKE9wZW5KUEFQZXJzaXN0ZW5jZS5jbGFzcyk7CisKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSB0b0VudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgKEJyb2tlckZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgZmFjdG9yeS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mID0gKE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgICAgICBmYWN0b3J5LmdldFVzZXJPYmplY3QoRU1GX0tFWSk7CisgICAgICAgICAgICBpZiAoZW1mID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbWYgPSBFbnRpdHlNYW5hZ2VyRmFjdG9yeVZhbHVlLm5ld0ZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5wdXRVc2VyT2JqZWN0KEVNRl9LRVksIGVtZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZW1mOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmYWN0b3J5LnVubG9jaygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdW5kZXJseWluZyBicm9rZXIgZmFjdG9yeSBmb3IgdGhlIGdpdmVuIHBlcnNpc3RlbmNlIG1hbmFnZXIKKyAgICAgKiBmYWN0b3J5IGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJyb2tlckZhY3RvcnkgdG9Ccm9rZXJGYWN0b3J5KEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZikgeworICAgICAgICBpZiAoZW1mID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCEoZW1mIGluc3RhbmNlb2YgRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsKSkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IGVtZi5nZXRDbGFzcygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgY2FzdCBoZXJlIG1heSBmYWlsCisgICAgICAgICAgICAgICAgZW1mID0gKEVudGl0eU1hbmFnZXJGYWN0b3J5SW1wbCkgKChPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgIGVtZikuZ2V0VXNlck9iamVjdChFTUZfS0VZKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oX2xvYy5nZXQKKyAgICAgICAgICAgICAgICAgICAgKCJjYW50LWNvbnZlcnQtYnJva2VyZmFjdG9yeSIsIGMpLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsKSBlbWYpLmdldEJyb2tlckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBwZXJzaXN0ZW5jZSBtYW5hZ2VyIGZhY2FkZSB0byB0aGUgZ2l2ZW4gYnJva2VyIHJldGFpbmluZworICAgICAqIHByZXZpb3VzbHkgYXNzb2NpYXRlZCBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPcGVuSlBBRW50aXR5TWFuYWdlciB0b0VudGl0eU1hbmFnZXIoQnJva2VyIGJyb2tlcikgeworICAgICAgICBpZiAoYnJva2VyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBicm9rZXIubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXIgZW0gPSAoT3BlbkpQQUVudGl0eU1hbmFnZXIpCisgICAgICAgICAgICAgICAgYnJva2VyLmdldFVzZXJPYmplY3QoRU1fS0VZKTsKKyAgICAgICAgICAgIGlmIChlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsIGVtZiA9IChFbnRpdHlNYW5hZ2VyRmFjdG9yeUltcGwpCisgICAgICAgICAgICAgICAgICAgIHRvRW50aXR5TWFuYWdlckZhY3RvcnkoYnJva2VyLmdldEJyb2tlckZhY3RvcnkoKSk7CisgICAgICAgICAgICAgICAgZW0gPSBlbWYubmV3RW50aXR5TWFuYWdlckltcGwoYnJva2VyKTsKKyAgICAgICAgICAgICAgICBicm9rZXIucHV0VXNlck9iamVjdChFTV9LRVksIGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlbTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IFBlcnNpc3RlbmNlRXhjZXB0aW9ucy50b1BlcnNpc3RlbmNlRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYnJva2VyLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGJyb2tlciBmb3IgdGhlIGdpdmVuIGVudGl0eSBtYW5hZ2VyIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJyb2tlciB0b0Jyb2tlcihFbnRpdHlNYW5hZ2VyIGVtKSB7CisgICAgICAgIGlmIChlbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghKGVtIGluc3RhbmNlb2YgRW50aXR5TWFuYWdlckltcGwpKSB7CisgICAgICAgICAgICBDbGFzcyBjID0gZW0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGNhc3QgaGVyZSBtYXkgZmFpbAorICAgICAgICAgICAgICAgIGVtID0gKEVudGl0eU1hbmFnZXJJbXBsKSAoKE9wZW5KUEFFbnRpdHlNYW5hZ2VyKSBlbSkuCisgICAgICAgICAgICAgICAgICAgIGdldFVzZXJPYmplY3QoRU1fS0VZKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oX2xvYy5nZXQoImNhbnQtY29udmVydC1icm9rZXIiLCBjKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEVudGl0eU1hbmFnZXJJbXBsKSBlbSkuZ2V0QnJva2VyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBPcGVuSlBBIGZhY2FkZSB0byB0aGUgZ2l2ZW4gZW50aXR5IG1hbmFnZXIgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBjYXN0KEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZikgeworICAgICAgICByZXR1cm4gKE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSkgZW1mOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgT3BlbkpQQSBmYWNhZGUgdG8gdGhlIGdpdmVuIGVudGl0eSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXIgY2FzdChFbnRpdHlNYW5hZ2VyIGVtKSB7CisgICAgICAgIGlmIChlbSBpbnN0YW5jZW9mIE9wZW5KUEFFbnRpdHlNYW5hZ2VyKQorICAgICAgICAgICAgcmV0dXJuIChPcGVuSlBBRW50aXR5TWFuYWdlcikgZW07CisgICAgICAgIHJldHVybiAoT3BlbkpQQUVudGl0eU1hbmFnZXIpIGVtLmdldERlbGVnYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBPcGVuSlBBIGZhY2FkZSB0byB0aGUgZ2l2ZW4gcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPcGVuSlBBUXVlcnkgY2FzdChRdWVyeSBxKSB7CisgICAgICAgIHJldHVybiAoT3BlbkpQQVF1ZXJ5KSBxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnl9IHNwZWNpZmllZCBieQorICAgICAqIHlvdXIgT3BlbkpQQSBkZWZhdWx0cy4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWUgbG9naWNhbCBmYWN0b3J5CisgICAgICogZm9yIGVhY2ggaW52b2NhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBnZXRFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVudGl0eU1hbmFnZXJGYWN0b3J5KG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnl9IHNwZWNpZmllZCBieQorICAgICAqIHlvdXIgT3BlbkpQQSBkZWZhdWx0cywgdXNpbmcgPGNvZGU+bWFwPC9jb2RlPiBhcyBvdmVycmlkZXMuIFRoaXMgbWV0aG9kCisgICAgICogd2lsbCByZXR1cm4gdGhlIHNhbWUgbG9naWNhbCBmYWN0b3J5IGZvciBpbnZvY2F0aW9ucyB3aXRoIHRoZSBzYW1lCisgICAgICogb3ZlcnJpZGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IGdldEVudGl0eU1hbmFnZXJGYWN0b3J5KE1hcCBtYXApIHsKKyAgICAgICAgQ29uZmlndXJhdGlvblByb3ZpZGVyIGNwID0gbmV3IFBlcnNpc3RlbmNlUHJvZHVjdERlcml2YXRpb24uCisgICAgICAgICAgICBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsKG1hcCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdG9FbnRpdHlNYW5hZ2VyRmFjdG9yeShCb290c3RyYXAuZ2V0QnJva2VyRmFjdG9yeShjcCwgbnVsbCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnl9IHNwZWNpZmllZCBieQorICAgICAqIDxjb2RlPm5hbWU8L2NvZGU+IGluIGFuIFhNTCBjb25maWd1cmF0aW9uIGZpbGUgYXQgdGhlIHJlc291cmNlIGxvY2F0aW9uCisgICAgICogPGNvZGU+cmVzb3VyY2U8L2NvZGU+LiBJZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdXNlcworICAgICAqIHRoZSBmaXJzdCByZXNvdXJjZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLCByZWdhcmRsZXNzIG9mIHRoZQorICAgICAqIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBYTUwgcmVzb3VyY2Ugb3IgdGhlIG5hbWUgb2YgdGhlIGphciB0aGF0IHRoZQorICAgICAqIHJlc291cmNlIGlzIGNvbnRhaW5lZCBpbi4gSWYgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LAorICAgICAqIHVzZXMgdGhlIHNwZWMtZGVmaW5lZCA8Y29kZT5NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IHJlc291cmNlLgorICAgICAqICBUaGlzIG1ldGhvZCBvbmx5IHJlc29sdmVzIHtAbGluayBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnl9IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBjcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeQorICAgICAgICAoU3RyaW5nIG5hbWUsIFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkobmFtZSwgcmVzb3VyY2UsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeX0gc3BlY2lmaWVkIGJ5CisgICAgICogPGNvZGU+bmFtZTwvY29kZT4gaW4gYW4gWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSBhdCB0aGUgcmVzb3VyY2UgbG9jYXRpb24KKyAgICAgKiA8Y29kZT5yZXNvdXJjZTwvY29kZT4sIGFwcGx5aW5nIHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbgorICAgICAqIDxjb2RlPm1hcDwvY29kZT4gYXMgb3ZlcnJpZGVzLiBJZiA8Y29kZT5uYW1lPC9jb2RlPiBpcworICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LCB1c2VzIHRoZSBmaXJzdCByZXNvdXJjZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogbG9jYXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBYTUwgcmVzb3VyY2Ugb3IgdGhlCisgICAgICogbmFtZSBvZiB0aGUgamFyIHRoYXQgdGhlIHJlc291cmNlIGlzIGNvbnRhaW5lZCBpbi4KKyAgICAgKiBJZiA8Y29kZT5yZXNvdXJjZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHVzZXMgdGhlIHNwZWMtZGVmaW5lZAorICAgICAqIDxjb2RlPk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbDwvY29kZT4gcmVzb3VyY2UuCisgICAgICogIFRoaXMgbWV0aG9kIG9ubHkgcmVzb2x2ZXMge0BsaW5rIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeX0gaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IGNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgIChTdHJpbmcgbmFtZSwgU3RyaW5nIHJlc291cmNlLCBNYXAgbWFwKSB7CisgICAgICAgIHJldHVybiAoT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5KSBuZXcgUGVyc2lzdGVuY2VQcm92aWRlckltcGwoKS4KKyAgICAgICAgICAgIGNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KG5hbWUsIHJlc291cmNlLCBtYXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlNYW5hZ2VyRmFjdG9yeX0gYXQgdGhlIEpOREkgbG9jYXRpb24gc3BlY2lmaWVkCisgICAgICogYnkgPGNvZGU+am5kaUxvY2F0aW9uPC9jb2RlPiBpbiB0aGUgY29udGV4dCA8Y29kZT5jb250ZXh0PC9jb2RlPi4gSWYKKyAgICAgKiA8Y29kZT5jb250ZXh0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5uZXcgSW5pdGlhbENvbnRleHQoKTwvY29kZT4gd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IGNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgIChTdHJpbmcgam5kaUxvY2F0aW9uLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGpuZGlMb2NhdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqbmRpTG9jYXRpb24gPT0gbnVsbCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKworICAgICAgICAgICAgT2JqZWN0IG8gPSBjb250ZXh0Lmxvb2t1cChqbmRpTG9jYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIChPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkpIFBvcnRhYmxlUmVtb3RlT2JqZWN0Lm5hcnJvdyhvLAorICAgICAgICAgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBuZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0KCJuYW1pbmctZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICBqbmRpTG9jYXRpb24pLCBuZXcgVGhyb3dhYmxlW117IG5lIH0sIG51bGwsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbnRpdHkgbWFuYWdlciBmb3IgdGhlIGdpdmVuIG9iamVjdCwgaWYgb25lIGNhbiBiZSBkZXRlcm1pbmVkCisgICAgICogZnJvbSBqdXN0IHRoZSBvYmplY3QgYWxvbmUuIFRoaXMgbWV0aG9kIHdpbGwgc3VjY2VlZCBmb3IgaW5zdGFuY2VzIHRoYXQKKyAgICAgKiBhcmUgZW5oYW5jZWQsIHRoYXQgd2VyZSBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UgKHJhdGhlciB0aGFuCisgICAgICogYmVpbmcgY29uc3RydWN0ZWQgd2l0aCA8Y29kZT5uZXc8L2NvZGU+KSwgb3IgdGhhdCB3ZXJlIGNyZWF0ZWQgdGhyb3VnaAorICAgICAqIHtAbGluayBPcGVuSlBBRW50aXR5TWFuYWdlciNjcmVhdGVJbnN0YW5jZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPcGVuSlBBRW50aXR5TWFuYWdlciBnZXRFbnRpdHlNYW5hZ2VyKE9iamVjdCBvKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlQ2FwYWJsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9FbnRpdHlNYW5hZ2VyKChCcm9rZXIpICgoUGVyc2lzdGVuY2VDYXBhYmxlKSBvKS4KKyAgICAgICAgICAgICAgICAgICAgcGNHZXRHZW5lcmljQ29udGV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2xhc3NNZXRhRGF0YX0gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHBlcnNpc3RlbnQgb2JqZWN0IDxjb2RlPm88L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NNZXRhRGF0YSBnZXRNZXRhRGF0YShPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIEVudGl0eU1hbmFnZXIgZW0gPSBnZXRFbnRpdHlNYW5hZ2VyKG8pOworICAgICAgICByZXR1cm4gKGVtID09IG51bGwpID8gbnVsbCA6IGdldE1ldGFEYXRhKGVtLCBvLmdldENsYXNzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBDbGFzc01ldGFEYXRhfSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogcGVyc2lzdGVudCB0eXBlIDxjb2RlPmNsczwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKEVudGl0eU1hbmFnZXIgZW0sIENsYXNzIGNscykgeworICAgICAgICBpZiAoZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW0gPT0gbnVsbCIpOworCisgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGtlbSA9IGNhc3QoZW0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGtlbS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICBnZXRNZXRhRGF0YShjbHMsIGtlbS5nZXRDbGFzc0xvYWRlcigpLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMudG9QZXJzaXN0ZW5jZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBDbGFzc01ldGFEYXRhfSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogcGVyc2lzdGVudCB0eXBlIDxjb2RlPmNsczwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc01ldGFEYXRhIGdldE1ldGFEYXRhKEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZiwKKyAgICAgICAgQ2xhc3MgY2xzKSB7CisgICAgICAgIGlmIChlbWYgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW1mID09IG51bGwiKTsKKworICAgICAgICBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnkga2VtZiA9IGNhc3QoZW1mKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBrZW1mLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhKGNscywgbnVsbCwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZ2l2ZW4gcmVzb3VyY2UuIFRoZSByZXNvdXJjZSBjYW4gYmUgYW4gZXh0ZW50IGl0ZXJhdG9yLAorICAgICAqIHF1ZXJ5IHJlc3VsdCwgbGFyZ2UgcmVzdWx0IHNldCByZWxhdGlvbiwgb3IgYW55IGNsb3NlYWJsZSBPcGVuSlBBCisgICAgICogY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShPYmplY3QgbykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1wbEhlbHBlci5jbG9zZShvKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IFBlcnNpc3RlbmNlRXhjZXB0aW9ucy50b1BlcnNpc3RlbmNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gZW50aXR5IG9yIGVtYmVkZGFibGUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYW5hZ2VkVHlwZShFbnRpdHlNYW5hZ2VyIGVtLCBDbGFzcyBjbHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbXBsSGVscGVyLmlzTWFuYWdlZFR5cGUoY2xzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IFBlcnNpc3RlbmNlRXhjZXB0aW9ucy50b1BlcnNpc3RlbmNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gZW50aXR5IG9yIGVtYmVkZGFibGUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYW5hZ2VkVHlwZShFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYsIENsYXNzIGNscykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEltcGxIZWxwZXIuaXNNYW5hZ2VkVHlwZShjbHMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgZnJvbSBhIE9wZW5KUEEgaWRlbnRpdHkgb2JqZWN0IHRvIGEgUGVyc2lzdGVuY2Ugb25lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGZyb21PcGVuSlBBT2JqZWN0SWQoT2JqZWN0IG9pZCkgeworICAgICAgICBpZiAob2lkIGluc3RhbmNlb2YgT3BlbkpQQUlkKQorICAgICAgICAgICAgcmV0dXJuICgoT3BlbkpQQUlkKSBvaWQpLmdldElkT2JqZWN0KCk7CisgICAgICAgIHJldHVybiBvaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIGZyb20gYSBQZXJzaXN0ZW5jZSBpZGVudGl0eSBvYmplY3QgdG8gYSBPcGVuSlBBIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0b09wZW5KUEFPYmplY3RJZChDbGFzc01ldGFEYXRhIG1ldGEsIE9iamVjdCBvaWQpIHsKKyAgICAgICAgaWYgKG9pZCA9PSBudWxsIHx8IG1ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENsYXNzIGNscyA9IG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpOworICAgICAgICBpZiAobWV0YS5nZXRJZGVudGl0eVR5cGUoKSA9PSBDbGFzc01ldGFEYXRhLklEX0RBVEFTVE9SRSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgSWQoY2xzLCAoKE51bWJlcikgb2lkKS5sb25nVmFsdWUoKSk7CisKKyAgICAgICAgaWYgKG9pZCBpbnN0YW5jZW9mIEJ5dGUpCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVJZChjbHMsIChCeXRlKSBvaWQpOworICAgICAgICBpZiAob2lkIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFySWQoY2xzLCAoQ2hhcmFjdGVyKSBvaWQpOworICAgICAgICBpZiAob2lkIGluc3RhbmNlb2YgRG91YmxlKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVJZChjbHMsIChEb3VibGUpIG9pZCk7CisgICAgICAgIGlmIChvaWQgaW5zdGFuY2VvZiBGbG9hdCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXRJZChjbHMsIChGbG9hdCkgb2lkKTsKKyAgICAgICAgaWYgKG9pZCBpbnN0YW5jZW9mIEludGVnZXIpCisgICAgICAgICAgICByZXR1cm4gbmV3IEludElkKGNscywgKEludGVnZXIpIG9pZCk7CisgICAgICAgIGlmIChvaWQgaW5zdGFuY2VvZiBMb25nKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nSWQoY2xzLCAoTG9uZykgb2lkKTsKKyAgICAgICAgaWYgKG9pZCBpbnN0YW5jZW9mIFNob3J0KQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydElkKGNscywgKFNob3J0KSBvaWQpOworICAgICAgICBpZiAob2lkIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdJZChjbHMsIChTdHJpbmcpIG9pZCk7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0SWQoY2xzLCBvaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBPcGVuSlBBIG9pZHMgZm9yIHRoZSBnaXZlbiBuYXRpdmUgb2lkIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gdG9PcGVuSlBBT2JqZWN0SWRzKENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgT2JqZWN0Li4uIG9pZHMpIHsKKyAgICAgICAgaWYgKG9pZHMgPT0gbnVsbCB8fCBvaWRzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG9pZHM7CisKKyAgICAgICAgLy8gc2luY2UgdGhlIGNsYXNzIGlmIGZpeGVkIGZvciBhbGwgb2lkcywgd2UgY2FuIHRlbGwgaWYgd2UgaGF2ZSB0bworICAgICAgICAvLyB0cmFuc2xhdGUgdGhlIGFycmF5IGJhc2VkIG9uIHdoZXRoZXIgdGhlIGZpcnN0IG9pZCBuZWVkcyB0cmFuc2xhdGluZworICAgICAgICBPYmplY3Qgb2lkID0gdG9PcGVuSlBBT2JqZWN0SWQobWV0YSwgb2lkc1swXSk7CisgICAgICAgIGlmIChvaWQgPT0gb2lkc1swXSkKKyAgICAgICAgICAgIHJldHVybiBvaWRzOworCisgICAgICAgIE9iamVjdFtdIGNvcHkgPSBuZXcgT2JqZWN0W29pZHMubGVuZ3RoXTsKKyAgICAgICAgY29weVswXSA9IG9pZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBvaWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29weVtpXSA9IHRvT3BlbkpQQU9iamVjdElkKG1ldGEsIG9pZHNbaV0pOworICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIE9wZW5KUEEgb2lkcyBmb3IgdGhlIGdpdmVuIG5hdGl2ZSBvaWQgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gdG9PcGVuSlBBT2JqZWN0SWRzKENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgQ29sbGVjdGlvbiBvaWRzKSB7CisgICAgICAgIGlmIChvaWRzID09IG51bGwgfHwgb2lkcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gb2lkczsKKworICAgICAgICAvLyBzaW5jZSB0aGUgY2xhc3MgaWYgZml4ZWQgZm9yIGFsbCBvaWRzLCB3ZSBjYW4gdGVsbCBpZiB3ZSBoYXZlIHRvCisgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgYXJyYXkgYmFzZWQgb24gd2hldGhlciB0aGUgZmlyc3Qgb2lkIG5lZWRzIHRyYW5zbGF0aW5nCisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IG9pZHMuaXRlcmF0b3IoKTsKKyAgICAgICAgT2JqZWN0IG9yaWcgPSBpdHIubmV4dCgpOworICAgICAgICBPYmplY3Qgb2lkID0gdG9PcGVuSlBBT2JqZWN0SWQobWV0YSwgb3JpZyk7CisgICAgICAgIGlmIChvaWQgPT0gb3JpZykKKyAgICAgICAgICAgIHJldHVybiBvaWRzOworCisgICAgICAgIENvbGxlY3Rpb24gY29weSA9IG5ldyBBcnJheUxpc3Qob2lkcy5zaXplKCkpOworICAgICAgICBjb3B5LmFkZChvaWQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKKyAgICAgICAgICAgIGNvcHkuYWRkKHRvT3BlbkpQQU9iamVjdElkKG1ldGEsIGl0ci5uZXh0KCkpKTsKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIGZyb20gYSBPcGVuSlBBIGlkZW50aXR5IGNsYXNzIHRvIGEgbmF0aXZlIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGZyb21PcGVuSlBBT2JqZWN0SWRDbGFzcyhDbGFzcyBvaWRDbGFzcykgeworICAgICAgICBpZiAob2lkQ2xhc3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob2lkQ2xhc3MgPT0gSWQuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gTG9uZy5jbGFzczsKKyAgICAgICAgaWYgKG9pZENsYXNzID09IEJ5dGVJZC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBCeXRlLmNsYXNzOworICAgICAgICBpZiAob2lkQ2xhc3MgPT0gQ2hhcklkLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci5jbGFzczsKKyAgICAgICAgaWYgKG9pZENsYXNzID09IERvdWJsZUlkLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5jbGFzczsKKyAgICAgICAgaWYgKG9pZENsYXNzID09IEZsb2F0SWQuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gRmxvYXQuY2xhc3M7CisgICAgICAgIGlmIChvaWRDbGFzcyA9PSBJbnRJZC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNsYXNzOworICAgICAgICBpZiAob2lkQ2xhc3MgPT0gTG9uZ0lkLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIExvbmcuY2xhc3M7CisgICAgICAgIGlmIChvaWRDbGFzcyA9PSBTaG9ydElkLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIFNob3J0LmNsYXNzOworICAgICAgICBpZiAob2lkQ2xhc3MgPT0gU3RyaW5nSWQuY2xhc3MpCisJCQlyZXR1cm4gU3RyaW5nLmNsYXNzOworCQlyZXR1cm4gb2lkQ2xhc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFRdWVyeS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTU3NjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQVF1ZXJ5LmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRmx1c2hNb2RlVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5Rmx1c2hNb2RlczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5SGludHM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeU9wZXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5leHBzLkFnZ3JlZ2F0ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5GaWx0ZXJMaXN0ZW5lcjsKKworLyoqCisgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgT3BlbkpQQSBxdWVyaWVzLgorICoKKyAqIEBzaW5jZSAwLjQuMAorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBwdWJsaXNoZWQKKyAqLworcHVibGljIGludGVyZmFjZSBPcGVuSlBBUXVlcnkKKyAgICBleHRlbmRzIFF1ZXJ5LCBRdWVyeU9wZXJhdGlvbnMsIFF1ZXJ5Rmx1c2hNb2RlcywgUXVlcnlIaW50cyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3duaW5nIGVudGl0eSBtYW5hZ2UuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGdldEVudGl0eU1hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGxhbmd1YWdlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IG9wZXJhdGlvbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCBwbGFuIGZvciBjb250cm9sbGluZyB0aGUgbG9hZGluZyBvZiByZXN1bHRzLgorICAgICAqLworICAgIHB1YmxpYyBGZXRjaFBsYW4gZ2V0RmV0Y2hQbGFuKCk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBpZ25vcmUgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGlnbm9yZSBjaGFuZ2VzIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0SWdub3JlQ2hhbmdlcyhib29sZWFuIGlnbm9yZSk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGZpbHRlciBsaXN0ZW5lciBmb3IgdGhlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgYWRkRmlsdGVyTGlzdGVuZXIoRmlsdGVyTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgZmlsdGVyIGxpc3RlbmVyIGZyb20gdGhlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgcmVtb3ZlRmlsdGVyTGlzdGVuZXIoRmlsdGVyTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gYWdncmVnYXRlIGxpc3RlbmVyIGZvciB0aGUgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBhZGRBZ2dyZWdhdGVMaXN0ZW5lcihBZ2dyZWdhdGVMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gYWdncmVnYXRlIGxpc3RlbmVyIGZyb20gdGhlIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgcmVtb3ZlQWdncmVnYXRlTGlzdGVuZXIoQWdncmVnYXRlTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYW5kaWRhdGUgY29sbGVjdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4KKyAgICAgKiBleHRlbnQgd2FzIHNwZWNpZmllZCBpbnN0ZWFkIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDYW5kaWRhdGVDb2xsZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZXMuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBzZXRDYW5kaWRhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb24gY29sbCk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSByZXN1bHQgZWxlbWVudCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRDbGFzcygpOworCisgICAgLyoqCisgICAgICogUXVlcnkgcmVzdWx0IGVsZW1lbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFJlc3VsdENsYXNzKENsYXNzIHR5cGUpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBzdWJjbGFzc2VzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJjbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHN1YmNsYXNzZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBxdWVyeSByZXN1bHRzLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0U3ViY2xhc3Nlcyhib29sZWFuIHN1YnMpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAwLWJhc2VkIHN0YXJ0IGluZGV4IGZvciB0aGUgcmV0dXJuZWQgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZpcnN0UmVzdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0cmlldmUuCisgICAgICogb3Ige0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfSBmb3Igbm8gbGltaXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhSZXN1bHRzKCk7CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlIHRoZSBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNvbXBpbGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBxdWVyeSBoYXMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Bvc2l0aW9uYWxQYXJhbWV0ZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgcXVlcnk7IGVtcHR5IGFycmF5IGlmIG5vbmUgb3IKKyAgICAgKiBpZiBxdWVyeSB1c2VzIG5hbWVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZWQgcGFyYW1ldGVycyBmb3IgdGhlIHF1ZXJ5OyBlbXB0eSBtYXAgaWYgbm9uZSBvcgorICAgICAqIGlmIHF1ZXJ5IHVzZXMgbmFtZWQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIGdldE5hbWVkUGFyYW1ldGVycygpOworCisgICAgLyoqCisgICAgICogU2V0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBzZXRQYXJhbWV0ZXJzKE1hcCBwYXJhbXMpOworCisgICAgLyoqCisgICAgICogU2V0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBzZXRQYXJhbWV0ZXJzKE9iamVjdC4uLiBwYXJhbXMpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYWxsIG9wZW4gcXVlcnkgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNsb3NlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmRzIHRoYXQgd2lsbCBiZSBzZW50IHRvCisgICAgICogdGhlIGRhdGFzdG9yZSBpbiBvcmRlciB0byBleGVjdXRlIHRoaXMgcXVlcnkuIFRoaXMgd2lsbAorICAgICAqIHR5cGljYWxseSBiZSBpbiB0aGUgbmF0aXZlIHF1ZXJ5IGxhbmd1YWdlIG9mIHRoZSBkYXRhYmFzZSAoZS5nLiwgU1FMKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIG5hbWVkIHBhcmFtZXRlciBtYXAgZm9yIHRoZSBxdWVyeSBpbnZvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERhdGFTdG9yZUFjdGlvbnMoTWFwIHBhcmFtcyk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldE1heFJlc3VsdHMoaW50IG1heFJlc3VsdCk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldEZpcnN0UmVzdWx0KGludCBzdGFydFBvc2l0aW9uKTsKKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0SGludChTdHJpbmcgaGludE5hbWUsIE9iamVjdCB2YWx1ZSk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBEYXRlIHZhbHVlLAorICAgICAgICBUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKTsKKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBDYWxlbmRhciB2YWx1ZSwKKyAgICAgICAgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihpbnQgcG9zaXRpb24sIE9iamVjdCB2YWx1ZSk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihpbnQgcG9zaXRpb24sIERhdGUgdmFsdWUsCisgICAgICAgIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpOworCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBzZXRQYXJhbWV0ZXIoaW50IHBvc2l0aW9uLCBDYWxlbmRhciB2YWx1ZSwKKyAgICAgICAgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldEZsdXNoTW9kZShGbHVzaE1vZGVUeXBlIGZsdXNoTW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZmx1c2ggbW9kZS4KKwkgKi8KKwlwdWJsaWMgRmx1c2hNb2RlVHlwZSBnZXRGbHVzaE1vZGUgKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcHRpbWlzdGljTG9ja0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTM1MTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworCisvKioKKyAqIE9wdGltaXN0aWMgY29uY3VycmVuY3kgdmlvbGF0aW9uLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBqYXZheC5wZXJzaXN0ZW5jZS5PcHRpbWlzdGljTG9ja0V4Y2VwdGlvbgorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBFeGNlcHRpb25JbmZvIHsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gX2ZhdGFsID0gZmFsc2U7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IF9mYWlsZWQgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFRocm93YWJsZVtdIF9uZXN0ZWQgPSBudWxsOworCisgICAgcHVibGljIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZVtdIG5lc3RlZCwKKyAgICAgICAgT2JqZWN0IGZhaWxlZCwgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBfbmVzdGVkID0gbmVzdGVkOworICAgICAgICBfZmFpbGVkID0gZmFpbGVkOworICAgICAgICBfZmF0YWwgPSBmYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBTVE9SRTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBTdG9yZUV4Y2VwdGlvbi5PUFRJTUlTVElDOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWwoKSB7CisgICAgICAgIHJldHVybiBfZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5nZXRDYXVzZShfbmVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlW10gZ2V0TmVzdGVkVGhyb3dhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIChfbmVzdGVkID09IG51bGwpID8gRXhjZXB0aW9ucy5FTVBUWV9USFJPV0FCTEVTIDogX25lc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbnMudG9TdHJpbmcodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgeworICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVCb29sZWFuKF9mYXRhbCk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VGYWlsZWRPYmplY3QoX2ZhaWxlZCkpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlTmVzdGVkVGhyb3dhYmxlcyhfbmVzdGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIF9mYXRhbCA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIF9mYWlsZWQgPSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIF9uZXN0ZWQgPSAoVGhyb3dhYmxlW10pIGluLnJlYWRPYmplY3QoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUV4Y2VwdGlvbi5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmYjQ1NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CisKKy8qKgorICogR2VuZXJhbCBwZXJzaXN0ZW5jZSBleGNlcHRpb24uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VFeGNlcHRpb24KKyAgICBleHRlbmRzIGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRXhjZXB0aW9uCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIEV4Y2VwdGlvbkluZm8geworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfZmF0YWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgX2ZhaWxlZCA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVGhyb3dhYmxlW10gX25lc3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlW10gbmVzdGVkLAorICAgICAgICBPYmplY3QgZmFpbGVkLCBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIF9uZXN0ZWQgPSBuZXN0ZWQ7CisgICAgICAgIF9mYWlsZWQgPSBmYWlsZWQ7CisgICAgICAgIF9mYXRhbCA9IGZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEdFTkVSQUw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsKCkgeworICAgICAgICByZXR1cm4gX2ZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CisgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuZ2V0Q2F1c2UoX25lc3RlZCk7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZVtdIGdldE5lc3RlZFRocm93YWJsZXMoKSB7CisgICAgICAgIHJldHVybiAoX25lc3RlZCA9PSBudWxsKSA/IEV4Y2VwdGlvbnMuRU1QVFlfVEhST1dBQkxFUyA6IF9uZXN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGYWlsZWRPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBfZmFpbGVkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBFeGNlcHRpb25zLnRvU3RyaW5nKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKKyAgICAgICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgIEV4Y2VwdGlvbnMucHJpbnROZXN0ZWRUaHJvd2FibGVzKHRoaXMsIG91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihfZmF0YWwpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlRmFpbGVkT2JqZWN0KF9mYWlsZWQpKTsKKyAgICAgICAgb3V0LndyaXRlT2JqZWN0KEV4Y2VwdGlvbnMucmVwbGFjZU5lc3RlZFRocm93YWJsZXMoX25lc3RlZCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBfZmF0YWwgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICBfZmFpbGVkID0gaW4ucmVhZE9iamVjdCgpOworICAgICAgICBfbmVzdGVkID0gKFRocm93YWJsZVtdKSBpbi5yZWFkT2JqZWN0KCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VFeGNlcHRpb25zLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VFeGNlcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2NDMzOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5PcGVuSlBBRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlN0b3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVzZXJFeGNlcHRpb247CisKKy8qKgorICogQ29udmVydHMgZnJvbSBPcGVuSlBBIHRvIHBlcnNpc3RlbmNlIGV4Y2VwdGlvbiB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRXhjZXB0aW9ucworICAgIGV4dGVuZHMgRXhjZXB0aW9ucyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yIFRSQU5TTEFUT1IgPQorICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgUnVudGltZUV4Y2VwdGlvbiB0cmFuc2xhdGUoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMudG9QZXJzaXN0ZW5jZUV4Y2VwdGlvbihyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yfSB0aGF0IHdpbGwgcGVyZm9ybQorICAgICAqIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiB0cmFuc2xhdGlvbiBhcyB3ZWxsIGFzIHJvbGwgYmFjayB0aGUKKyAgICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uIHdoZW4gZm9yIGFsbCBidXQge0BsaW5rIE5vUmVzdWx0RXhjZXB0aW9ufQorICAgICAqIGFuZCB7QGxpbmsgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9ufSBpbiBhY2NvcmRhbmNlIHdpdGgKKyAgICAgKiBzZWN0aW9uIDMuNyBvZiB0aGUgRUpCIDMuMCBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUnVudGltZUV4Y2VwdGlvblRyYW5zbGF0b3IgZ2V0Um9sbGJhY2tUcmFuc2xhdG9yCisgICAgICAgIChmaW5hbCBPcGVuSlBBRW50aXR5TWFuYWdlciBlbSkgeworICAgICAgICByZXR1cm4gbmV3IFJ1bnRpbWVFeGNlcHRpb25UcmFuc2xhdG9yKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRocm93aW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgIHB1YmxpYyBSdW50aW1lRXhjZXB0aW9uIHRyYW5zbGF0ZShSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBleCA9IHRvUGVyc2lzdGVuY2VFeGNlcHRpb24ocmUpOworICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAmJiAhKGV4IGluc3RhbmNlb2YgTm9SZXN1bHRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICYmICF0aHJvd2luZykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtLmlzT3BlbigpICYmIGVtLmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW0uc2V0Um9sbGJhY2tPbmx5KHJlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSByZS1lbnRyYW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiB0aHJvd2FibGUgdG8gdGhlIHByb3BlciBwZXJzaXN0ZW5jZSBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIHRvUGVyc2lzdGVuY2VFeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgcmV0dXJuIChSdW50aW1lRXhjZXB0aW9uKSB0cmFuc2xhdGVFeGNlcHRpb24odCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBnaXZlbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hlY2tlZCB3aGV0aGVyIHRvIHRyYW5zbGF0ZSBjaGVja2VkIGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgdHJhbnNsYXRlRXhjZXB0aW9uKFRocm93YWJsZSB0LCBib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVuY2VFeGNlcHRpb24odCkpCisgICAgICAgICAgICByZXR1cm4gdDsKKworICAgICAgICAvLyBpbW1lZGlhdGVseSB0aHJvdyBlcnJvcnMKKyAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBFcnJvcikKKyAgICAgICAgICAgIHRocm93IChFcnJvcikgdDsKKworICAgICAgICBPcGVuSlBBRXhjZXB0aW9uIGtlOworICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgT3BlbkpQQUV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIGlmICghY2hlY2tlZCB8fCB0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgICAgIGtlID0gbmV3IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb24odC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAga2Uuc2V0U3RhY2tUcmFjZSh0LmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4ga2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBvbmx5IG5lc3RlZCBleGNlcHRpb24gaXMgYSBwZXJzaXN0ZW5jZSBvbmUsIHJldHVybiBpdCBkaXJlY3RseQorICAgICAgICBrZSA9IChPcGVuSlBBRXhjZXB0aW9uKSB0OworICAgICAgICBpZiAoa2UuZ2V0TmVzdGVkVGhyb3dhYmxlcygpLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAmJiBpc1BlcnNpc3RlbmNlRXhjZXB0aW9uKGtlLmdldENhdXNlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGtlLmdldENhdXNlKCk7CisKKyAgICAgICAgLy8gUnVudGltZUV4Y2VwdGlvbnMgdGhyb3duIGZyb20gY2FsbGJhY2tzIHNob3VsZCBiZSB0aHJvd24gZGlyZWN0bHkKKyAgICAgICAgaWYgKGtlLmdldFR5cGUoKSA9PSBPcGVuSlBBRXhjZXB0aW9uLlVTRVIKKyAgICAgICAgICAgICYmIGtlLmdldFN1YnR5cGUoKSA9PSBVc2VyRXhjZXB0aW9uLkNBTExCQUNLCisgICAgICAgICAgICAmJiBrZS5nZXROZXN0ZWRUaHJvd2FibGVzKCkubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBlID0ga2UuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICBlID0gZS5nZXRDYXVzZSgpOworCisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBwZXJmb3JtIGludGVsbGlnZW50IHRyYW5zbGF0aW9uIG9mIG9wZW5qcGEgZXhjZXB0aW9ucworICAgICAgICBzd2l0Y2ggKGtlLmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBPcGVuSlBBRXhjZXB0aW9uLlNUT1JFOgorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdG9yZUV4Y2VwdGlvbihrZSk7CisgICAgICAgICAgICBjYXNlIE9wZW5KUEFFeGNlcHRpb24uVVNFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlVXNlckV4Y2VwdGlvbihrZSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVHZW5lcmFsRXhjZXB0aW9uKGtlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgZ2l2ZW4gc3RvcmUgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSB0cmFuc2xhdGVTdG9yZUV4Y2VwdGlvbihPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgIEV4Y2VwdGlvbiBlOworICAgICAgICBzd2l0Y2ggKGtlLmdldFN1YnR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBTdG9yZUV4Y2VwdGlvbi5PQkpFQ1RfTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgIGUgPSBuZXcgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkVudGl0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChrZS5nZXRNZXNzYWdlKCksIGdldE5lc3RlZFRocm93YWJsZXMoa2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmFpbGVkT2JqZWN0KGtlKSwga2UuaXNGYXRhbCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RvcmVFeGNlcHRpb24uT1BUSU1JU1RJQzoKKyAgICAgICAgICAgICAgICBlID0gbmV3IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcHRpbWlzdGljTG9ja0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoa2UuZ2V0TWVzc2FnZSgpLCBnZXROZXN0ZWRUaHJvd2FibGVzKGtlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZhaWxlZE9iamVjdChrZSksIGtlLmlzRmF0YWwoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0b3JlRXhjZXB0aW9uLk9CSkVDVF9FWElTVFM6CisgICAgICAgICAgICAgICAgZSA9IG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRW50aXR5RXhpc3RzRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChrZS5nZXRNZXNzYWdlKCksIGdldE5lc3RlZFRocm93YWJsZXMoa2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmFpbGVkT2JqZWN0KGtlKSwga2UuaXNGYXRhbCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZSA9IG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKGtlLmdldE1lc3NhZ2UoKSwgZ2V0TmVzdGVkVGhyb3dhYmxlcyhrZSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRGYWlsZWRPYmplY3Qoa2UpLCBrZS5pc0ZhdGFsKCkpOworICAgICAgICB9CisgICAgICAgIGUuc2V0U3RhY2tUcmFjZShrZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIGdpdmVuIHVzZXIgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEV4Y2VwdGlvbiB0cmFuc2xhdGVVc2VyRXhjZXB0aW9uKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgRXhjZXB0aW9uIGU7CisgICAgICAgIHN3aXRjaCAoa2UuZ2V0U3VidHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFVzZXJFeGNlcHRpb24uTk9fVFJBTlNBQ1RJT046CisgICAgICAgICAgICAgICAgZSA9IG5ldyAKKyAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChrZS5nZXRNZXNzYWdlKCksIGdldE5lc3RlZFRocm93YWJsZXMoa2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZhaWxlZE9iamVjdChrZSksIGtlLmlzRmF0YWwoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVzZXJFeGNlcHRpb24uTk9fUkVTVUxUOgorICAgICAgICAgICAgICAgIGUgPSBuZXcgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk5vUmVzdWx0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChrZS5nZXRNZXNzYWdlKCksIGdldE5lc3RlZFRocm93YWJsZXMoa2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmFpbGVkT2JqZWN0KGtlKSwga2UuaXNGYXRhbCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVXNlckV4Y2VwdGlvbi5OT05fVU5JUVVFX1JFU1VMVDoKKyAgICAgICAgICAgICAgICBlID0gbmV3IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5Ob25VbmlxdWVSZXN1bHRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKGtlLmdldE1lc3NhZ2UoKSwgZ2V0TmVzdGVkVGhyb3dhYmxlcyhrZSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRGYWlsZWRPYmplY3Qoa2UpLCBrZS5pc0ZhdGFsKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVc2VyRXhjZXB0aW9uLklOVkFMSURfU1RBVEU6CisgICAgICAgICAgICAgICAgZSA9IG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuSW52YWxpZFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChrZS5nZXRNZXNzYWdlKCksIGdldE5lc3RlZFRocm93YWJsZXMoa2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmFpbGVkT2JqZWN0KGtlKSwga2UuaXNGYXRhbCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZSA9IG5ldyBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKGtlLmdldE1lc3NhZ2UoKSwgZ2V0TmVzdGVkVGhyb3dhYmxlcyhrZSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRGYWlsZWRPYmplY3Qoa2UpLCBrZS5pc0ZhdGFsKCkpOworICAgICAgICB9CisgICAgICAgIGUuc2V0U3RhY2tUcmFjZShrZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgdGhlIGdpdmVuIGdlbmVyYWwgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSB0cmFuc2xhdGVHZW5lcmFsRXhjZXB0aW9uKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRXhjZXB0aW9uCisgICAgICAgICAgICAoa2UuZ2V0TWVzc2FnZSgpLCBnZXROZXN0ZWRUaHJvd2FibGVzKGtlKSwKKyAgICAgICAgICAgICAgICBnZXRGYWlsZWRPYmplY3Qoa2UpLCBrZS5pc0ZhdGFsKCkpOworICAgICAgICBlLnNldFN0YWNrVHJhY2Uoa2UuZ2V0U3RhY2tUcmFjZSgpKTsKKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGV4Y2VwdGlvbiBpcyBhIHBlcnNpc3RlbmNlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGVyc2lzdGVuY2VFeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgcmV0dXJuIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgIC5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIHRoZSBuZXN0ZWQgdGhyb3dhYmxlcyBvZiB0aGUgZ2l2ZW4gb3BlbmpwYSBleGNlcHRpb24gaW50bworICAgICAqIG5lc3RlZCB0aHJvd2FibGVzIGZvciBhIHBlcnNpc3RlbmNlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGVbXSBnZXROZXN0ZWRUaHJvd2FibGVzKE9wZW5KUEFFeGNlcHRpb24ga2UpIHsKKyAgICAgICAgVGhyb3dhYmxlW10gbmVzdGVkID0ga2UuZ2V0TmVzdGVkVGhyb3dhYmxlcygpOworICAgICAgICBpZiAobmVzdGVkLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG5lc3RlZDsKKworICAgICAgICBUaHJvd2FibGVbXSB0cmFucyA9IG5ldyBUaHJvd2FibGVbbmVzdGVkLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdHJhbnNbaV0gPSB0cmFuc2xhdGVFeGNlcHRpb24obmVzdGVkW2ldLCBmYWxzZSk7CisgICAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZhaWxlZCBvYmplY3QgZm9yIHRoZSBnaXZlbiBleGNlcHRpb24sIHBlcmZvcm1pbmcgYW55CisgICAgICogbmVjZXNzYXJ5IGNvbnZlcnNpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRGYWlsZWRPYmplY3QoT3BlbkpQQUV4Y2VwdGlvbiBrZSkgeworICAgICAgICBPYmplY3QgbyA9IGtlLmdldEZhaWxlZE9iamVjdCgpOworICAgICAgICBpZiAobyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQnJva2VyKQorICAgICAgICAgICAgcmV0dXJuIE9wZW5KUEFQZXJzaXN0ZW5jZS50b0VudGl0eU1hbmFnZXIoKEJyb2tlcikgbyk7CisgICAgICAgIHJldHVybiBPcGVuSlBBUGVyc2lzdGVuY2UuZnJvbU9wZW5KUEFPYmplY3RJZChvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGV4dHJhY3QgYSBuZXN0ZWQgZXhjZXB0aW9uIGZyb20gYW4gaW50ZXJuYWwgbmVzdGVkCisgICAgICogYXJyYXkgaW4gYSBzYWZlIHdheS4KKyAgICAgKi8KKyAgICBzdGF0aWMgVGhyb3dhYmxlIGdldENhdXNlKFRocm93YWJsZVtdIG5lc3RlZCkgeworICAgICAgICBpZiAobmVzdGVkID09IG51bGwgfHwgbmVzdGVkLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisJCXJldHVybiBuZXN0ZWRbMF07CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlTGlzdGVuZXJBZGFwdGVyLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VMaXN0ZW5lckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDczOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlTGlzdGVuZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5EZWxldGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlQ2FsbGJhY2tzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5ldmVudC5Mb2FkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlBlcnNpc3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuU3RvcmVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNhbGxiYWNrRXhjZXB0aW9uOworCitjbGFzcyBQZXJzaXN0ZW5jZUxpc3RlbmVyQWRhcHRlcgorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlRXZlbnRNYW5hZ2VyLkxpc3RlbmVyQWRhcHRlciwgUGVyc2lzdExpc3RlbmVyLAorICAgIExvYWRMaXN0ZW5lciwgU3RvcmVMaXN0ZW5lciwgRGVsZXRlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUGVyc2lzdGVuY2VMaXN0ZW5lckFkYXB0ZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaWZlY3ljbGVDYWxsYmFja3NbXVtdIF9jYWxsYmFja3M7CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VMaXN0ZW5lckFkYXB0ZXIoTGlmZWN5Y2xlQ2FsbGJhY2tzW11bXSBjYWxsYmFja3MpIHsKKyAgICAgICAgX2NhbGxiYWNrcyA9IGNhbGxiYWNrczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VMaXN0ZW5lckFkYXB0ZXIoQ29sbGVjdGlvbjxMaWZlY3ljbGVDYWxsYmFja3M+W10gY2FsbHMpIHsKKyAgICAgICAgX2NhbGxiYWNrcyA9IG5ldyBMaWZlY3ljbGVDYWxsYmFja3NbTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGhdW107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhbGxzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBfY2FsbGJhY2tzW2ldID0gY2FsbHNbaV0udG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgTGlmZWN5Y2xlQ2FsbGJhY2tzW2NhbGxzW2ldLnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVzcG9uZHNUbyhpbnQgZXZlbnRUeXBlKSB7CisgICAgICAgIHJldHVybiBfY2FsbGJhY2tzW2V2ZW50VHlwZV0gIT0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUNhbGxiYWNrKExpZmVjeWNsZUV2ZW50IGV2KSB7CisgICAgICAgIGludCBldmVudFR5cGUgPSBldi5nZXRUeXBlKCk7CisgICAgICAgIGlmIChfY2FsbGJhY2tzW2V2ZW50VHlwZV0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgT2JqZWN0IHNyYyA9IGV2LmdldFNvdXJjZSgpOworICAgICAgICBmb3IgKExpZmVjeWNsZUNhbGxiYWNrcyBjYWxsYmFjayA6IF9jYWxsYmFja3NbZXZlbnRUeXBlXSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5tYWtlQ2FsbGJhY2soc3JjLCBldi5nZXRSZWxhdGVkKCksIGV2ZW50VHlwZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbGxiYWNrRXhjZXB0aW9uKF9sb2MuZ2V0KCJzeXN0ZW0tbGlzdGVuZXItZXJyIiwKKyAgICAgICAgICAgICAgICAgICAgc3JjKSkuc2V0Q2F1c2UodCkuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVQZXJzaXN0KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIG1ha2VDYWxsYmFjayhldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJQZXJzaXN0KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIG1ha2VDYWxsYmFjayhldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJMb2FkKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIG1ha2VDYWxsYmFjayhldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJSZWZyZXNoKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIG1ha2VDYWxsYmFjayhldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVmb3JlU3RvcmUoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgbWFrZUNhbGxiYWNrKGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlclN0b3JlKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIG1ha2VDYWxsYmFjayhldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVmb3JlRGVsZXRlKExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIG1ha2VDYWxsYmFjayhldmVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJEZWxldGUoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgbWFrZUNhbGxiYWNrKGV2ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxNjMzMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZU1ldGFEYXRhRGVmYXVsdHMuamF2YQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Qb3N0TG9hZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Qb3N0UGVyc2lzdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Qb3N0UmVtb3ZlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBvc3RVcGRhdGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUHJlUGVyc2lzdDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QcmVSZW1vdmU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUHJlVXBkYXRlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQWJzdHJhY3RNZXRhRGF0YURlZmF1bHRzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVNZXRhRGF0YTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RyYXRlZ3kuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5NZXRhRGF0YUV4Y2VwdGlvbjsKKworLyoqCisgKiBKUEEtYmFzZWQgbWV0YWRhdGEgZGVmYXVsdHMuCisgKgorICogQGF1dGhvciBQYXRyaWNrIExpbnNrZXkKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZU1ldGFEYXRhRGVmYXVsdHMKKyAgICBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFEZWZhdWx0cyB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gX2FsbG93c011bHRpcGxlTWV0aG9kc0ZvclNhbWVDYWxsYmFjayA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgUGVyc2lzdGVuY2VTdHJhdGVneT4gX3N0cmF0cyA9CisgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBQZXJzaXN0ZW5jZVN0cmF0ZWd5PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IF9pZ25vcmVkQW5ub3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBfc3RyYXRzLnB1dChCYXNpYy5jbGFzcywgQkFTSUMpOworICAgICAgICBfc3RyYXRzLnB1dChNYW55VG9PbmUuY2xhc3MsIE1BTllfT05FKTsKKyAgICAgICAgX3N0cmF0cy5wdXQoT25lVG9PbmUuY2xhc3MsIE9ORV9PTkUpOworICAgICAgICBfc3RyYXRzLnB1dChFbWJlZGRlZC5jbGFzcywgRU1CRURERUQpOworICAgICAgICBfc3RyYXRzLnB1dChFbWJlZGRlZElkLmNsYXNzLCBFTUJFRERFRCk7CisgICAgICAgIF9zdHJhdHMucHV0KE9uZVRvTWFueS5jbGFzcywgT05FX01BTlkpOworICAgICAgICBfc3RyYXRzLnB1dChNYW55VG9NYW55LmNsYXNzLCBNQU5ZX01BTlkpOworICAgICAgICBfc3RyYXRzLnB1dChQZXJzaXN0ZW50LmNsYXNzLCBQRVJTKTsKKyAgICAgICAgX3N0cmF0cy5wdXQoUGVyc2lzdGVudENvbGxlY3Rpb24uY2xhc3MsIFBFUlNfQ09MTCk7CisgICAgICAgIF9zdHJhdHMucHV0KFBlcnNpc3RlbnRNYXAuY2xhc3MsIFBFUlNfTUFQKTsKKworICAgICAgICBfaWdub3JlZEFubm9zLmFkZChEZXRhY2hlZFN0YXRlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIF9pZ25vcmVkQW5ub3MuYWRkKFBvc3RMb2FkLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIF9pZ25vcmVkQW5ub3MuYWRkKFBvc3RQZXJzaXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIF9pZ25vcmVkQW5ub3MuYWRkKFBvc3RSZW1vdmUuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgX2lnbm9yZWRBbm5vcy5hZGQoUG9zdFVwZGF0ZS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBfaWdub3JlZEFubm9zLmFkZChQcmVQZXJzaXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIF9pZ25vcmVkQW5ub3MuYWRkKFByZVJlbW92ZS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBfaWdub3JlZEFubm9zLmFkZChQcmVVcGRhdGUuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzKCkgeworICAgICAgICBzZXRDYWxsYmFja01vZGUoQ0FMTEJBQ0tfUkVUSFJPVyB8IENBTExCQUNLX1JPTExCQUNLIHwKKyAgICAgICAgICAgIENBTExCQUNLX0ZBSUxfRkFTVCk7CisgICAgICAgIHNldERhdGFTdG9yZU9iamVjdElkRmllbGRVbndyYXBwZWQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2RlIGZvciB0aGUgc3RyYXRlZ3kgb2YgdGhlIGdpdmVuIG1lbWJlci4gUmV0dXJuIG51bGwgaWYKKyAgICAgKiBubyBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlU3RyYXRlZ3kgZ2V0UGVyc2lzdGVuY2VTdHJhdGVneQorICAgICAgICAoRmllbGRNZXRhRGF0YSBmbWQsIE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaWYgKG1lbWJlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIEFubm90YXRlZEVsZW1lbnQgZWwgPSAoQW5ub3RhdGVkRWxlbWVudCkgbWVtYmVyOworICAgICAgICBpZiAoZWwuaXNBbm5vdGF0aW9uUHJlc2VudChUcmFuc2llbnQuY2xhc3MpKQorICAgICAgICAgICAgcmV0dXJuIFRSQU5TSUVOVDsKKyAgICAgICAgaWYgKGZtZCAhPSBudWxsCisgICAgICAgICAgICAmJiBmbWQuZ2V0TWFuYWdlbWVudCgpICE9IEZpZWxkTWV0YURhdGEuTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBsb29rIGZvciBwZXJzaXN0ZW5jZSBzdHJhdGVneSBpbiBhbm5vdGF0aW9uIHRhYmxlCisgICAgICAgIFBlcnNpc3RlbmNlU3RyYXRlZ3kgcHN0cmF0ID0gbnVsbDsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm8gOiBlbC5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChwc3RyYXQgIT0gbnVsbCAmJiBfc3RyYXRzLmNvbnRhaW5zS2V5KGFubm8uYW5ub3RhdGlvblR5cGUoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKF9sb2MuZ2V0KCJhbHJlYWR5LXBlcnMiLCBtZW1iZXIpKTsKKyAgICAgICAgICAgIGlmIChwc3RyYXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwc3RyYXQgPSBfc3RyYXRzLmdldChhbm5vLmFubm90YXRpb25UeXBlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChwc3RyYXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwc3RyYXQ7CisKKyAgICAgICAgQ2xhc3MgdHlwZTsKKyAgICAgICAgaW50IGNvZGU7CisgICAgICAgIGlmIChmbWQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZSA9IGZtZC5nZXRUeXBlKCk7CisgICAgICAgICAgICBjb2RlID0gZm1kLmdldFR5cGVDb2RlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgRmllbGQpIHsKKyAgICAgICAgICAgIHR5cGUgPSAoKEZpZWxkKSBtZW1iZXIpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGNvZGUgPSBKYXZhVHlwZXMuZ2V0VHlwZUNvZGUodHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0eXBlID0gKChNZXRob2QpIG1lbWJlcikuZ2V0UmV0dXJuVHlwZSgpOworICAgICAgICAgICAgY29kZSA9IEphdmFUeXBlcy5nZXRUeXBlQ29kZSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gYnl0ZVtdLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gY2hhcltdLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gQnl0ZVtdLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gQ2hhcmFjdGVyW10uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQVNJQzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJZVEU6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVI6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRPVUJMRV9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVF9PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9OR19PQko6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNIT1JUX09CSjoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdJTlRFR0VSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFTSUM7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgaWYgKEVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBU0lDOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8jIyMgRUpCMzogd2hhdCBpZiBkZWZpbmVkIGluIFhNTD8KKyAgICAgICAgaWYgKHR5cGUuaXNBbm5vdGF0aW9uUHJlc2VudChFbWJlZGRhYmxlLmNsYXNzKSkKKyAgICAgICAgICAgIHJldHVybiBFTUJFRERFRDsKKyAgICAgICAgaWYgKFNlcmlhbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIEJBU0lDOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIEZsYWdzIGlmIG11bHRpcGxlIG1ldGhvZHMgb2YgdGhlIHNhbWUgY2xhc3MgY2FuIGhhbmRsZSB0aGUgc2FtZSAKKyAgICAgKiBjYWxsYmFjayBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd3NNdWx0aXBsZU1ldGhvZHNGb3JTYW1lQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBfYWxsb3dzTXVsdGlwbGVNZXRob2RzRm9yU2FtZUNhbGxiYWNrOworICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogRmxhZ3MgaWYgbXVsdGlwbGUgbWV0aG9kcyBvZiB0aGUgc2FtZSBjbGFzcyBjYW4gaGFuZGxlIHRoZSBzYW1lIAorICAgICAqIGNhbGxiYWNrIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsbG93c011bHRpcGxlTWV0aG9kc0ZvclNhbWVDYWxsYmFjayhib29sZWFuIGZsYWcpIHsKKyAgICAgICAgX2FsbG93c011bHRpcGxlTWV0aG9kc0ZvclNhbWVDYWxsYmFjayA9IGZsYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0by1jb25maWd1cmF0aW9uIG1ldGhvZCBmb3IgdGhlIGRlZmF1bHQgYWNjZXNzIHR5cGUgb2YgYmFzZSBjbGFzc2VzIAorICAgICAqIHdpdGggQUNDRVNTX1VOS05PV04KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0QWNjZXNzVHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoIlBST1BFUlRZIi5lcXVhbHModHlwZS50b1VwcGVyQ2FzZSgpKSkKKyAgICAgICAgICAgIHNldERlZmF1bHRBY2Nlc3NUeXBlKENsYXNzTWV0YURhdGEuQUNDRVNTX1BST1BFUlRZKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0RGVmYXVsdEFjY2Vzc1R5cGUoQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfRklFTEQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlKENsYXNzTWV0YURhdGEgbWV0YSwgaW50IGFjY2VzcykgeworICAgICAgICBzdXBlci5wb3B1bGF0ZShtZXRhLCBhY2Nlc3MpOworICAgICAgICBtZXRhLnNldERldGFjaGFibGUodHJ1ZSk7CisgICAgICAgIC8vIGRvIG5vdCBjYWxsIGdldCpGaWVsZHMgYXMgaXQgd2lsbCBsb2NrIGRvd24gdGhlIGZpZWxkcy4KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZShGaWVsZE1ldGFEYXRhIGZtZCkgeworICAgICAgICBzZXRDYXNjYWRlTm9uZShmbWQpOworICAgICAgICBzZXRDYXNjYWRlTm9uZShmbWQuZ2V0S2V5KCkpOworICAgICAgICBzZXRDYXNjYWRlTm9uZShmbWQuZ2V0RWxlbWVudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyBvZmYgYXV0byBjYXNjYWRpbmcgb2YgcGVyc2lzdCwgcmVmcmVzaCwgYXR0YWNoLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldENhc2NhZGVOb25lKFZhbHVlTWV0YURhdGEgdm1kKSB7CisgICAgICAgIHZtZC5zZXRDYXNjYWRlUGVyc2lzdChWYWx1ZU1ldGFEYXRhLkNBU0NBREVfTk9ORSk7CisgICAgICAgIHZtZC5zZXRDYXNjYWRlUmVmcmVzaChWYWx1ZU1ldGFEYXRhLkNBU0NBREVfTk9ORSk7CisgICAgICAgIHZtZC5zZXRDYXNjYWRlQXR0YWNoKFZhbHVlTWV0YURhdGEuQ0FTQ0FERV9OT05FKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldEFjY2Vzc1R5cGUoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHJldHVybiBnZXRBY2Nlc3NUeXBlKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmUgaGVscGVyIHRvIGRldGVybWluZSBhY2Nlc3MgdHlwZSBiYXNlZCBvbiBhbm5vdGF0aW9uIHBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRBY2Nlc3NUeXBlKENsYXNzIGNscykgeworICAgICAgICAvLyB0cmF2ZXJzZWQgZW50aXJlIGhpZXJhcmNoeSB3aXRob3V0IGZpbmRpbmcgYW5ub3RhdGlvbnMKKyAgICAgICAgaWYgKGNscyA9PSBudWxsIHx8IGNscyA9PSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfVU5LTk9XTjsKKworICAgICAgICBpbnQgYWNjZXNzID0gMDsKKyAgICAgICAgaWYgKHVzZXNBY2Nlc3MoY2xzLmdldERlY2xhcmVkRmllbGRzKCkpKQorICAgICAgICAgICAgYWNjZXNzIHw9IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEOworICAgICAgICBpZiAodXNlc0FjY2VzcyhjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCkpKQorICAgICAgICAgICAgYWNjZXNzIHw9IENsYXNzTWV0YURhdGEuQUNDRVNTX1BST1BFUlRZOworICAgICAgICByZXR1cm4gKGFjY2VzcyA9PSAwKSA/IGdldEFjY2Vzc1R5cGUoY2xzLmdldFN1cGVyY2xhc3MoKSkgOiBhY2Nlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG1lbWJlcnMgaGF2ZSBwZXJzaXN0ZW5jZSBhbm5vdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZXNBY2Nlc3MoQW5ub3RhdGVkRWxlbWVudFtdIG1lbWJlcnMpIHsKKyAgICAgICAgQW5ub3RhdGlvbltdIGFubm9zOworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhbm5vcyA9IG1lbWJlcnNbaV0uZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYW5ub3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gYW5ub3Nbal0uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lLnN0YXJ0c1dpdGgoImphdmF4LnBlcnNpc3RlbmNlLiIpCisgICAgICAgICAgICAgICAgICAgIHx8IG5hbWUuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLiIpKQorICAgICAgICAgICAgICAgICAgICAmJiAhX2lnbm9yZWRBbm5vcy5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdFBlcnNpc3RlbnQoQ2xhc3NNZXRhRGF0YSBtZXRhLCBNZW1iZXIgbWVtYmVyLAorICAgICAgICBTdHJpbmcgbmFtZSkgeworICAgICAgICBpbnQgbW9kcyA9IG1lbWJlci5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2QpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHNldHRlcnMgZm9yIG1ldGhvZHMKKyAgICAgICAgICAgICAgICBNZXRob2Qgc2V0dGVyID0gbWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2QoInNldCIKKyAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKG5hbWUpLCBuZXcgQ2xhc3NbXSB7IAorICAgICAgICAgICAgICAgICAgICAoKE1ldGhvZCkgbWVtYmVyKS5nZXRSZXR1cm5UeXBlKCkgfSk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGUuZy4sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFBlcnNpc3RlbmNlU3RyYXRlZ3kgc3RyYXQgPSBnZXRQZXJzaXN0ZW5jZVN0cmF0ZWd5KG51bGwsIG1lbWJlcik7CisgICAgICAgIGlmIChzdHJhdCA9PSBudWxsIHx8IHN0cmF0ID09IFBlcnNpc3RlbmNlU3RyYXRlZ3kuVFJBTlNJRU5UKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VNZXRhRGF0YUZhY3RvcnkuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZU1ldGFEYXRhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTZjMjgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VNZXRhRGF0YUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyaWVzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyaWVzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuU3FsUmVzdWx0U2V0TWFwcGluZzsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5TcWxSZXN1bHRTZXRNYXBwaW5nczsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkdlbmVyaWNDb25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNsYXNzQW5ub3RhdGlvbk1ldGFEYXRhRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5DbGFzc0FyZ1BhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuTWV0YURhdGFGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLk1ldGFEYXRhUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQWJzdHJhY3RDRk1ldGFEYXRhRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFEZWZhdWx0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuUXVlcnlNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkdlbmVyYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuTWV0YURhdGFFeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIE1ldGFEYXRhRmFjdG9yeX0gZm9yIEpQQSBtZXRhZGF0YS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEtpbQorICogQHNpbmNlIDAuNC4wCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZU1ldGFEYXRhRmFjdG9yeQorICAgIGV4dGVuZHMgQWJzdHJhY3RDRk1ldGFEYXRhRmFjdG9yeQorICAgIGltcGxlbWVudHMgQ29uZmlndXJhYmxlLCBHZW5lcmljQ29uZmlndXJhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFBlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5LmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzIF9kZWYgPSAKKyAgICAgICAgbmV3IFBlcnNpc3RlbmNlTWV0YURhdGFEZWZhdWx0cygpOworICAgIHByaXZhdGUgQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIgX2Fubm9QYXJzZXIgPSBudWxsOworICAgIHByaXZhdGUgWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlciBfeG1sUGFyc2VyID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcDxVUkwsIFNldD4gX3htbCA9IG51bGw7IC8vIHhtbCByc3JjIC0+IGNsYXNzIG5hbWVzCisgICAgcHJpdmF0ZSBTZXQ8VVJMPiBfdW5wYXJzZWQgPSBudWxsOyAvLyB4bWwgcnNyYworICAgIHByaXZhdGUgYm9vbGVhbiBfZmllbGRPdmVycmlkZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSBmaWVsZC1sZXZlbCBvdmVycmlkZSBvciBjbGFzcy1sZXZlbCBvdmVycmlkZS4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkT3ZlcnJpZGUoYm9vbGVhbiBmaWVsZCkgeworICAgICAgICBfZmllbGRPdmVycmlkZSA9IGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGZpZWxkLWxldmVsIG92ZXJyaWRlIG9yIGNsYXNzLWxldmVsIG92ZXJyaWRlLgorICAgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmllbGRPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE92ZXJyaWRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBtZXRhZGF0YSBwYXJzZXIsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIGdldEFubm90YXRpb25QYXJzZXIoKSB7CisgICAgICAgIGlmIChfYW5ub1BhcnNlciA9PSBudWxsKSB7CisgICAgICAgICAgICBfYW5ub1BhcnNlciA9IG5ld0Fubm90YXRpb25QYXJzZXIoKTsKKyAgICAgICAgICAgIF9hbm5vUGFyc2VyLnNldFJlcG9zaXRvcnkocmVwb3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfYW5ub1BhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1ldGFkYXRhIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUGFyc2VyKAorICAgICAgICBBbm5vdGF0aW9uUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgaWYgKF9hbm5vUGFyc2VyICE9IG51bGwpCisgICAgICAgICAgICBfYW5ub1BhcnNlci5zZXRSZXBvc2l0b3J5KG51bGwpOworICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpCisgICAgICAgICAgICBwYXJzZXIuc2V0UmVwb3NpdG9yeShyZXBvcyk7CisgICAgICAgIF9hbm5vUGFyc2VyID0gcGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtZXRhZGF0YSBwYXJzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIG5ld0Fubm90YXRpb25QYXJzZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIKKyAgICAgICAgICAgIChyZXBvcy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBYTUwgbWV0YWRhdGEgcGFyc2VyLCBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIGdldFhNTFBhcnNlcigpIHsKKyAgICAgICAgaWYgKF94bWxQYXJzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgX3htbFBhcnNlciA9IG5ld1hNTFBhcnNlcih0cnVlKTsKKyAgICAgICAgICAgIF94bWxQYXJzZXIuc2V0UmVwb3NpdG9yeShyZXBvcyk7CisgICAgICAgICAgICBpZiAoX2ZpZWxkT3ZlcnJpZGUpCisgICAgICAgICAgICAgICAgX3htbFBhcnNlci5zZXRBbm5vdGF0aW9uUGFyc2VyKGdldEFubm90YXRpb25QYXJzZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF94bWxQYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXRhZGF0YSBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WE1MUGFyc2VyKFhNTFBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIgcGFyc2VyKSB7CisgICAgICAgIGlmIChfeG1sUGFyc2VyICE9IG51bGwpCisgICAgICAgICAgICBfeG1sUGFyc2VyLnNldFJlcG9zaXRvcnkobnVsbCk7CisgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhcnNlci5zZXRSZXBvc2l0b3J5KHJlcG9zKTsKKyAgICAgICAgX3htbFBhcnNlciA9IHBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWV0YWRhdGEgcGFyc2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIG5ld1hNTFBhcnNlcihib29sZWFuIGxvYWRpbmcpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyKHJlcG9zLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHNlcmlhbGl6ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVNlcmlhbGl6ZXIgbmV3WE1MU2VyaWFsaXplcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhU2VyaWFsaXplcihyZXBvcy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoQ2xhc3MgY2xzLCBpbnQgbW9kZSwgQ2xhc3NMb2FkZXIgZW52TG9hZGVyKSB7CisgICAgICAgIGlmIChtb2RlID09IE1PREVfTk9ORSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCFzdHJpY3QgJiYgKG1vZGUgJiBNT0RFX01FVEEpICE9IDApCisgICAgICAgICAgICBtb2RlIHw9IE1PREVfTUFQUElORzsKKworICAgICAgICAvLyBnZXR0aW5nIHRoZSBsaXN0IG9mIHBlcnNpc3RlbnQgdHlwZXMgcnVucyBjYWxsYmFja3MgdG8KKyAgICAgICAgLy8gbWFwUGVyc2lzdGVudFR5cGVOYW1lcyBpZiBpdCBoYXNuJ3QgYmVlbiBjYWxsZWQgYWxyZWFkeSwgd2hpY2gKKyAgICAgICAgLy8gY2FjaGVzIFhNTCByZXNvdXJjZXMKKyAgICAgICAgZ2V0UGVyc2lzdGVudFR5cGVOYW1lcyhmYWxzZSwgZW52TG9hZGVyKTsKKyAgICAgICAgVVJMIHhtbCA9IGZpbmRYTUwoY2xzKTsKKworICAgICAgICAvLyB3ZSBoYXZlIHRvIHBhcnNlIG1ldGFkYXRhIHVwLWZyb250IHRvIHJlZ2lzdGVyIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgLy8gZGVmYXVsdHMgYW5kIHN5c3RlbSBjYWxsYmFja3MKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhOworICAgICAgICBib29sZWFuIHBhcnNlZFhNTCA9IGZhbHNlOworICAgICAgICBpZiAoX3VucGFyc2VkICE9IG51bGwgJiYgIV91bnBhcnNlZC5pc0VtcHR5KCkKKyAgICAgICAgICAgICYmIChtb2RlICYgTU9ERV9NRVRBKSAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKFVSTCB1cmwgOiBfdW5wYXJzZWQpCisgICAgICAgICAgICAgICAgcGFyc2VYTUwodXJsLCBjbHMsIG1vZGUsIGVudkxvYWRlcik7CisgICAgICAgICAgICBwYXJzZWRYTUwgPSBfdW5wYXJzZWQuY29udGFpbnMoeG1sKTsKKyAgICAgICAgICAgIF91bnBhcnNlZC5jbGVhcigpOworCisgICAgICAgICAgICAvLyBYTUwgcHJvY2VzcyBjaGVjaworICAgICAgICAgICAgbWV0YSA9IHJlcG9zLmdldENhY2hlZE1ldGFEYXRhKGNscyk7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBudWxsICYmIChtZXRhLmdldFNvdXJjZU1vZGUoKSAmIG1vZGUpID09IG1vZGUpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmF0ZWdpZXMobWV0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIGxvb2tpbmcgZm9yIHN5c3RlbS1sZXZlbCBxdWVyeQorICAgICAgICBpZiAoY2xzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gd2UgbWF5IHN0aWxsIG5lZWQgdG8gcGFyc2UgWE1MIGlmIHRoaXMgaXMgYSByZWRlcGxveSBvZiBhIGNsYXNzLCBvcgorICAgICAgICAvLyBpZiB3ZSdyZSBpbiBzdHJpY3QgcXVlcnktb25seSBtb2RlCisgICAgICAgIGlmICghcGFyc2VkWE1MICYmIHhtbCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJzZVhNTCh4bWwsIGNscywgbW9kZSwgZW52TG9hZGVyKTsKKyAgICAgICAgICAgIC8vIFhNTCBwcm9jZXNzIGNoZWNrCisgICAgICAgICAgICBtZXRhID0gcmVwb3MuZ2V0Q2FjaGVkTWV0YURhdGEoY2xzKTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGwgJiYgKG1ldGEuZ2V0U291cmNlTW9kZSgpICYgbW9kZSkgPT0gbW9kZSkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlU3RyYXRlZ2llcyhtZXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBbm5vdGF0aW9uUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlciBwYXJzZXIgPSBnZXRBbm5vdGF0aW9uUGFyc2VyKCk7CisgICAgICAgIHBhcnNlci5zZXRFbnZDbGFzc0xvYWRlcihlbnZMb2FkZXIpOworICAgICAgICBwYXJzZXIuc2V0TW9kZShtb2RlKTsKKyAgICAgICAgcGFyc2VyLnBhcnNlKGNscyk7CisKKyAgICAgICAgbWV0YSA9IHJlcG9zLmdldENhY2hlZE1ldGFEYXRhKGNscyk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGwgJiYgKG1ldGEuZ2V0U291cmNlTW9kZSgpICYgbW9kZSkgPT0gbW9kZSkKKyAgICAgICAgICAgIHZhbGlkYXRlU3RyYXRlZ2llcyhtZXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVhNTChVUkwgeG1sLCBDbGFzcyBjbHMsIGludCBtb2RlLCBDbGFzc0xvYWRlciBlbnZMb2FkZXIpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gcmVwb3MuZ2V0Q29uZmlndXJhdGlvbigpLgorICAgICAgICAgICAgZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuZ2V0Q2xhc3NMb2FkZXIoY2xzLCBlbnZMb2FkZXIpOworICAgICAgICBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIHhtbFBhcnNlciA9IGdldFhNTFBhcnNlcigpOworICAgICAgICB4bWxQYXJzZXIuc2V0Q2xhc3NMb2FkZXIoZW52TG9hZGVyICE9IG51bGwgPyBlbnZMb2FkZXIgOiBsb2FkZXIpOworICAgICAgICB4bWxQYXJzZXIuc2V0RW52Q2xhc3NMb2FkZXIoZW52TG9hZGVyKTsKKyAgICAgICAgeG1sUGFyc2VyLnNldE1vZGUobW9kZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4bWxQYXJzZXIucGFyc2UoeG1sKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9jYXRlIHRoZSBYTUwgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVSTCBmaW5kWE1MKENsYXNzIGNscykgeworICAgICAgICBpZiAoX3htbCAhPSBudWxsICYmIGNscyAhPSBudWxsKQorICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VVJMLCBTZXQ+IGVudHJ5IDogX3htbC5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmNvbnRhaW5zKGNscy5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG1hcFBlcnNpc3RlbnRUeXBlTmFtZXMoT2JqZWN0IHJzcmMsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIGlmIChyc3JjLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKAorICAgICAgICAgICAgICAgICAgICBfbG9jLmdldCgibWFwLXBlcnNpc3RlbnQtdHlwZXMtc2tpcHBpbmctY2xhc3MiLCByc3JjKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoIShyc3JjIGluc3RhbmNlb2YgVVJMKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgX2xvYy5nZXQoIm1hcC1wZXJzaXN0ZW50LXR5cGVzLXNraXBwaW5nLW5vbi11cmwiLCByc3JjKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoCisgICAgICAgICAgICAgICAgIm1hcC1wZXJzaXN0ZW50LXR5cGUtbmFtZXMiLCByc3JjLCBBcnJheXMuYXNMaXN0KG5hbWVzKSkpOworICAgICAgICAKKyAgICAgICAgaWYgKF94bWwgPT0gbnVsbCkKKyAgICAgICAgICAgIF94bWwgPSBuZXcgSGFzaE1hcDxVUkwsIFNldD4oKTsKKyAgICAgICAgX3htbC5wdXQoKFVSTCkgcnNyYywgbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChuYW1lcykpKTsKKyAgICAgICAgaWYgKF91bnBhcnNlZCA9PSBudWxsKQorICAgICAgICAgICAgX3VucGFyc2VkID0gbmV3IEhhc2hTZXQ8VVJMPigpOworICAgICAgICBfdW5wYXJzZWQuYWRkKChVUkwpIHJzcmMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzcyBnZXRRdWVyeVNjb3BlKFN0cmluZyBxdWVyeU5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBpZiAocXVlcnlOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgQ29sbGVjdGlvbiBjbGFzc2VzID0gcmVwb3MubG9hZFBlcnNpc3RlbnRUeXBlcyhmYWxzZSwgbG9hZGVyKTsKKyAgICAgICAgZm9yIChDbGFzcyBjbHMgOiAoQ29sbGVjdGlvbjxDbGFzcz4pIGNsYXNzZXMpIHsKKyAgICAgICAgICAgIGlmIChjbHMuaXNBbm5vdGF0aW9uUHJlc2VudChOYW1lZFF1ZXJ5LmNsYXNzKSAmJiBoYXNOYW1lZFF1ZXJ5CisgICAgICAgICAgICAgICAgKHF1ZXJ5TmFtZSwgKE5hbWVkUXVlcnkpIGNscy5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnkuY2xhc3MpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzOworICAgICAgICAgICAgaWYgKGNscy5pc0Fubm90YXRpb25QcmVzZW50KE5hbWVkUXVlcmllcy5jbGFzcykgJiYKKyAgICAgICAgICAgICAgICBoYXNOYW1lZFF1ZXJ5KHF1ZXJ5TmFtZSwgKChOYW1lZFF1ZXJpZXMpIGNscy4KKyAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJpZXMuY2xhc3MpKS52YWx1ZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzOworICAgICAgICAgICAgaWYgKGNscy5pc0Fubm90YXRpb25QcmVzZW50KE5hbWVkTmF0aXZlUXVlcnkuY2xhc3MpICYmCisgICAgICAgICAgICAgICAgaGFzTmFtZWROYXRpdmVRdWVyeShxdWVyeU5hbWUsIChOYW1lZE5hdGl2ZVF1ZXJ5KSBjbHMuCisgICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeS5jbGFzcykpKQorICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CisgICAgICAgICAgICBpZiAoY2xzLmlzQW5ub3RhdGlvblByZXNlbnQoTmFtZWROYXRpdmVRdWVyaWVzLmNsYXNzKSAmJgorICAgICAgICAgICAgICAgIGhhc05hbWVkTmF0aXZlUXVlcnkocXVlcnlOYW1lLCAoKE5hbWVkTmF0aXZlUXVlcmllcykgY2xzLgorICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcmllcy5jbGFzcykpLnZhbHVlKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzIGdldFJlc3VsdFNldE1hcHBpbmdTY29wZShTdHJpbmcgcnNNYXBwaW5nTmFtZSwKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIGlmIChyc01hcHBpbmdOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIENvbGxlY3Rpb24gY2xhc3NlcyA9IHJlcG9zLmxvYWRQZXJzaXN0ZW50VHlwZXMoZmFsc2UsIGxvYWRlcik7CisgICAgICAgIGZvciAoQ2xhc3MgY2xzIDogKENvbGxlY3Rpb248Q2xhc3M+KSBjbGFzc2VzKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjbHMuaXNBbm5vdGF0aW9uUHJlc2VudChTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzKSAmJiAKKyAgICAgICAgICAgICAgICBoYXNSU01hcHBpbmcocnNNYXBwaW5nTmFtZSwgKFNxbFJlc3VsdFNldE1hcHBpbmcpIGNscy4KKyAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKFNxbFJlc3VsdFNldE1hcHBpbmcuY2xhc3MpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoY2xzLmlzQW5ub3RhdGlvblByZXNlbnQoU3FsUmVzdWx0U2V0TWFwcGluZ3MuY2xhc3MpICYmIAorICAgICAgICAgICAgICAgIGhhc1JTTWFwcGluZyhyc01hcHBpbmdOYW1lLCAoKFNxbFJlc3VsdFNldE1hcHBpbmdzKSBjbHMuCisgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihTcWxSZXN1bHRTZXRNYXBwaW5ncy5jbGFzcykpLnZhbHVlKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc05hbWVkUXVlcnkoU3RyaW5nIHF1ZXJ5LCBOYW1lZFF1ZXJ5Li4uIHF1ZXJpZXMpIHsKKyAgICAgICAgZm9yIChOYW1lZFF1ZXJ5IHEgOiBxdWVyaWVzKSB7CisgICAgICAgICAgICBpZiAocXVlcnkuZXF1YWxzKHEubmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1JTTWFwcGluZyhTdHJpbmcgcnNNYXBwaW5nLAorICAgICAgICBTcWxSZXN1bHRTZXRNYXBwaW5nLi4uIG1hcHBpbmdzKSB7CisgICAgICAgIGZvciAoU3FsUmVzdWx0U2V0TWFwcGluZyBtIDogbWFwcGluZ3MpIHsKKyAgICAgICAgICAgIGlmIChyc01hcHBpbmcuZXF1YWxzKG0ubmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc05hbWVkTmF0aXZlUXVlcnkoU3RyaW5nIHF1ZXJ5LAorICAgICAgICBOYW1lZE5hdGl2ZVF1ZXJ5Li4uIHF1ZXJpZXMpIHsKKyAgICAgICAgZm9yIChOYW1lZE5hdGl2ZVF1ZXJ5IHEgOiBxdWVyaWVzKSB7CisgICAgICAgICAgICBpZiAocXVlcnkuZXF1YWxzKHEubmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE1ldGFEYXRhRmlsdGVyIG5ld01ldGFEYXRhRmlsdGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzQW5ub3RhdGlvbk1ldGFEYXRhRmlsdGVyKG5ldyBDbGFzc1tdeworICAgICAgICAgICAgRW50aXR5LmNsYXNzLCBFbWJlZGRhYmxlLmNsYXNzLCBNYXBwZWRTdXBlcmNsYXNzLmNsYXNzIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSBhbGwgZmllbGRzIGhhdmUgZGVjbGFyZWQgYSBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTdHJhdGVnaWVzKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKKyAgICAgICAgZm9yIChGaWVsZE1ldGFEYXRhIGZtZCA6IG1ldGEuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICAgICAgaWYgKCFmbWQuaXNFeHBsaWNpdCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZm1kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oX2xvYy5nZXQoIm5vLXBlcnMtc3RyYXQiLCBidWYpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YURhdGFEZWZhdWx0cyBnZXREZWZhdWx0cygpIHsKKyAgICAgICAgcmV0dXJuIF9kZWY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzQXJnUGFyc2VyIG5ld0NsYXNzQXJnUGFyc2VyKCkgeworICAgICAgICBDbGFzc0FyZ1BhcnNlciBwYXJzZXIgPSBuZXcgQ2xhc3NBcmdQYXJzZXIoKTsKKyAgICAgICAgcGFyc2VyLnNldE1ldGFEYXRhU3RydWN0dXJlKCJwYWNrYWdlIiwgbnVsbCwgbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgImVudGl0eSIsICJlbWJlZGRhYmxlIiwgIm1hcHBlZC1zdXBlcmNsYXNzIiB9LCAiY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgc3VwZXIuY2xlYXIoKTsKKyAgICAgICAgaWYgKF9hbm5vUGFyc2VyICE9IG51bGwpCisgICAgICAgICAgICBfYW5ub1BhcnNlci5jbGVhcigpOworICAgICAgICBpZiAoX3htbFBhcnNlciAhPSBudWxsKQorICAgICAgICAgICAgX3htbFBhcnNlci5jbGVhcigpOworICAgICAgICBpZiAoX3htbCAhPSBudWxsKQorICAgICAgICAgICAgX3htbC5jbGVhcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXJzZXIgbmV3UGFyc2VyKGJvb2xlYW4gbG9hZGluZykgeworICAgICAgICByZXR1cm4gbmV3WE1MUGFyc2VyKGxvYWRpbmcpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTZXJpYWxpemVyIG5ld1NlcmlhbGl6ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXdYTUxTZXJpYWxpemVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2UoTWV0YURhdGFQYXJzZXIgcGFyc2VyLCBDbGFzc1tdIGNscykgeworICAgICAgICBwYXJzZShwYXJzZXIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihkZWZhdWx0WE1MRmlsZSgpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpbGUgZGVmYXVsdFNvdXJjZUZpbGUoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0WE1MRmlsZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGRlZmF1bHRTb3VyY2VGaWxlKFF1ZXJ5TWV0YURhdGEgcXVlcnksIE1hcCBjbHNOYW1lcykgeworICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSBnZXREZWZpbmluZ01ldGFEYXRhKHF1ZXJ5LCBjbHNOYW1lcyk7CisgICAgICAgIEZpbGUgZmlsZSA9IChtZXRhID09IG51bGwpID8gbnVsbCA6IG1ldGEuZ2V0U291cmNlRmlsZSgpOworICAgICAgICBpZiAoZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgIHJldHVybiBkZWZhdWx0WE1MRmlsZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlIGRlZmF1bHRTb3VyY2VGaWxlKFNlcXVlbmNlTWV0YURhdGEgc2VxLCBNYXAgY2xzTmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRYTUxGaWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9vayBmb3IgTUVUQS1JTkYvb3JtLnhtbCwgYW5kIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGNob29zZSBhIGRlZmF1bHQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRlZmF1bHRYTUxGaWxlKCkgeworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSByZXBvcy5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICBnZXRDbGFzc1Jlc29sdmVySW5zdGFuY2UoKS5nZXRDbGFzc0xvYWRlcihnZXRDbGFzcygpLCBudWxsKTsKKyAgICAgICAgVVJMIHJzcmMgPSBsb2FkZXIuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL29ybS54bWwiKTsKKyAgICAgICAgaWYgKHJzcmMgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocnNyYy5nZXRGaWxlKCkpOworICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCJvcm0ueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbmZpZ3VyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgaWYgKHJzcmNzID09IG51bGwpCisgICAgICAgICAgICByc3JjcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbigiTUVUQS1JTkYvb3JtLnhtbCIpOworICAgICAgICBlbHNlCisJCQlyc3Jjcy5hZGQoIk1FVEEtSU5GL29ybS54bWwiKTsKKwl9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRvKE9wdGlvbnMgb3B0cykgeworICAgICAgICBvcHRzLmtleVNldCgpLnJldGFpbkFsbChvcHRzLnNldEludG8oX2RlZikua2V5U2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVByb2R1Y3REZXJpdmF0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWZlYTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLnNwaS5QZXJzaXN0ZW5jZVVuaXRJbmZvOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLnNwaS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQVByb2R1Y3REZXJpdmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5BYnN0cmFjdFByb2R1Y3REZXJpdmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5NYXBDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLlhNTE1ldGFEYXRhUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogU2V0cyBKUEEgc3BlY2lmaWNhdGlvbiBkZWZhdWx0cyBhbmQgcGFyc2VzIEpQQSBzcGVjaWZpY2F0aW9uIFhNTCBmaWxlcy4KKyAqIAorICogRm9yIGdsb2JhbHMsIGxvb2tzIGluIDxjb2RlPm9wZW5qcGEucHJvcGVydGllczwvY29kZT4gc3lzdGVtIHByb3BlcnR5IGZvcgorICogdGhlIGxvY2F0aW9uIG9mIGEgZmlsZSB0byBwYXJzZS4gSWYgbm8gc3lzdGVtIHByb3BlcnR5IGlzIGRlZmluZWQsIHRoZQorICogZGVmYXVsdCByZXNvdXJjZSBsb2NhdGlvbiBvZiA8Y29kZT5NRVRBLUlORi9vcGVuanBhLnhtbDwvY29kZT4gaXMgdXNlZC4KKyAqCisgKiBGb3IgZGVmYXVsdHMsIGxvb2tzIGZvciA8Y29kZT5NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LgorICogV2l0aGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4sIGxvb2sgZm9yIHRoZSBuYW1lZCBwZXJzaXN0ZW5jZSB1bml0LCBvcgorICogaWYgbm8gbmFtZSBnaXZlbiwgYW4gT3BlbkpQQSB1bml0IChwcmVmZXJyaW5nIGFuIHVubmFtZWQgT3BlbkpQQSB1bml0IHRvIAorICogYSBuYW1lZCBvbmUpLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVByb2R1Y3REZXJpdmF0aW9uIAorICAgIGV4dGVuZHMgQWJzdHJhY3RQcm9kdWN0RGVyaXZhdGlvbgorICAgIGltcGxlbWVudHMgT3BlbkpQQVByb2R1Y3REZXJpdmF0aW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNfSlBBID0gImpwYSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfRUpCID0gImVqYiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNSQ19HTE9CQUwgPSAiTUVUQS1JTkYvb3BlbmpwYS54bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTUkNfREVGQVVMVCA9ICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIF9sb2MgPSBMb2NhbGl6ZXIuZm9yUGFja2FnZQorICAgICAgICAoUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbi5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCBwdXRCcm9rZXJGYWN0b3J5QWxpYXNlcyhNYXAgbSkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfU1BFQzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgSlBBIGlzIGF2YWlsYWJsZQorICAgICAgICBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVDb25maWd1cmF0aW9uTG9hZChDb25maWd1cmF0aW9uIGMpIHsKKyAgICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIE9wZW5KUEFDb25maWd1cmF0aW9uSW1wbCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwgY29uZiA9IChPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwpIGM7CisgICAgICAgIGNvbmYubWV0YUZhY3RvcnlQbHVnaW4uc2V0QWxpYXMoQUxJQVNfRUpCLAorICAgICAgICAgICAgUGVyc2lzdGVuY2VNZXRhRGF0YUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgY29uZi5tZXRhRmFjdG9yeVBsdWdpbi5zZXRBbGlhcyhTUEVDX0pQQSwKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIAorICAgICAgICBjb25mLmFkZFZhbHVlKG5ldyBFbnRpdHlNYW5hZ2VyRmFjdG9yeVZhbHVlKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclNwZWNpZmljYXRpb25TZXQoQ29uZmlndXJhdGlvbiBjKSB7CisgICAgICBpZiAoIShjIGluc3RhbmNlb2YgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKQorICAgICAgICAgfHwgIVNQRUNfSlBBLmVxdWFscygoKE9wZW5KUEFDb25maWd1cmF0aW9uKWMpLmdldFNwZWNpZmljYXRpb24oKSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworIAorICAgICAgICBPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwgY29uZiA9IChPcGVuSlBBQ29uZmlndXJhdGlvbkltcGwpIGM7CisgICAgICAgIGNvbmYubWV0YUZhY3RvcnlQbHVnaW4uc2V0RGVmYXVsdChTUEVDX0pQQSk7CisgICAgICAgIGNvbmYubWV0YUZhY3RvcnlQbHVnaW4uc2V0U3RyaW5nKFNQRUNfSlBBKTsKKyAgICAgICAgY29uZi5sb2NrTWFuYWdlclBsdWdpbi5zZXREZWZhdWx0KCJ2ZXJzaW9uIik7CisgICAgICAgIGNvbmYubG9ja01hbmFnZXJQbHVnaW4uc2V0U3RyaW5nKCJ2ZXJzaW9uIik7CisgICAgICAgIGNvbmYubm9udHJhbnNhY3Rpb25hbFdyaXRlLnNldERlZmF1bHQoInRydWUiKTsKKyAgICAgICAgY29uZi5ub250cmFuc2FjdGlvbmFsV3JpdGUuc2V0KHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZ2l2ZW4gcGVyc2lzdGVuY2UgdW5pdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB1c2VyIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIENvbmZpZ3VyYXRpb25Qcm92aWRlciBsb2FkKFBlcnNpc3RlbmNlVW5pdEluZm8gcGluZm8sIE1hcCBtKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoIWlzT3BlbkpQQVBlcnNpc3RlbmNlUHJvdmlkZXIocGluZm8sIG51bGwpKSB7CisgICAgICAgICAgICB3YXJuVW5rbm93blByb3ZpZGVyKHBpbmZvKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlndXJhdGlvblByb3ZpZGVySW1wbCBjcCA9IG5ldyBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsKCk7CisgICAgICAgIGNwLmFkZFByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwudG9PcGVuSlBBUHJvcGVydGllcyhwaW5mbykpOworICAgICAgICBjcC5hZGRQcm9wZXJ0aWVzKG0pOworICAgICAgICBpZiAocGluZm8gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCkgeworICAgICAgICAgICAgUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwgaW1wbCA9IChQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCkgcGluZm87CisgICAgICAgICAgICBpZiAoaW1wbC5nZXRQZXJzaXN0ZW5jZVhtbEZpbGVVcmwoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNwLnNldFNvdXJjZShpbXBsLmdldFBlcnNpc3RlbmNlWG1sRmlsZVVybCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHVuaXQgbmFtZXMsIHdoaWNoIG1heQorICAgICAqIGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIENvbmZpZ3VyYXRpb25Qcm92aWRlciBsb2FkKFN0cmluZyByc3JjLCBTdHJpbmcgbmFtZSwgTWFwIG0pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gZXhwbGljaXQgPSAhU3RyaW5nVXRpbHMuaXNFbXB0eShyc3JjKTsKKyAgICAgICAgaWYgKCFleHBsaWNpdCkKKyAgICAgICAgICAgIHJzcmMgPSBSU1JDX0RFRkFVTFQ7CisgICAgICAgIAorICAgICAgICBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsIGNwID0gbmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwoKTsKKyAgICAgICAgQm9vbGVhbiByZXQgPSBsb2FkKGNwLCByc3JjLCBuYW1lLCBtLCBudWxsLCBleHBsaWNpdCk7CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAocmV0LmJvb2xlYW5WYWx1ZSgpKSA/IGNwIDogbnVsbDsKKyAgICAgICAgaWYgKGV4cGxpY2l0KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gcGVyc2lzdGVuY2UueG1sIGRvZXMgbm90IGV4aXN0OyBqdXN0IGxvYWQgbWFwCisgICAgICAgIFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsIHBpbmZvID0gbmV3IFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsKCk7CisgICAgICAgIHBpbmZvLmZyb21Vc2VyUHJvcGVydGllcyhtKTsKKyAgICAgICAgaWYgKCFpc09wZW5KUEFQZXJzaXN0ZW5jZVByb3ZpZGVyKHBpbmZvLCBudWxsKSkgeworICAgICAgICAgICAgd2FyblVua25vd25Qcm92aWRlcihwaW5mbyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBjcC5hZGRQcm9wZXJ0aWVzKHBpbmZvLnRvT3BlbkpQQVByb3BlcnRpZXMoKSk7CisgICAgICAgIHJldHVybiBjcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWQoU3RyaW5nIHJzcmMsIFN0cmluZyBhbmNob3IsIAorICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyc3JjICE9IG51bGwgJiYgIXJzcmMuZW5kc1dpdGgoIi54bWwiKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsIGNwID0gbmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwoKTsKKyAgICAgICAgaWYgKGxvYWQoY3AsIHJzcmMsIGFuY2hvciwgbnVsbCwgbG9hZGVyLCB0cnVlKSA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICByZXR1cm4gY3A7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25maWd1cmF0aW9uUHJvdmlkZXIgbG9hZChGaWxlIGZpbGUsIFN0cmluZyBhbmNob3IpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueG1sIikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDb25maWd1cmF0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBDb25maWd1cmF0aW9uUGFyc2VyKG51bGwpOworICAgICAgICBwYXJzZXIucGFyc2UoZmlsZSk7CisgICAgICAgIHJldHVybiBsb2FkKGZpbmRVbml0KChMaXN0PFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsPikgCisgICAgICAgICAgICBwYXJzZXIuZ2V0UmVzdWx0cygpLCBhbmNob3IsIG51bGwpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWRHbG9iYWxzKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gcHJlZml4ZXMgPSBQcm9kdWN0RGVyaXZhdGlvbnMuZ2V0Q29uZmlndXJhdGlvblByZWZpeGVzKCk7CisgICAgICAgIFN0cmluZyByc3JjID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGggJiYgU3RyaW5nVXRpbHMuaXNFbXB0eShyc3JjKTsgaSsrKQorICAgICAgICAgICByc3JjID0gU3lzdGVtLmdldFByb3BlcnR5KHByZWZpeGVzW2ldICsgIi5wcm9wZXJ0aWVzIik7IAorICAgICAgICBib29sZWFuIGV4cGxpY2l0ID0gIVN0cmluZ1V0aWxzLmlzRW1wdHkocnNyYyk7CisgICAgICAgIFN0cmluZyBhbmNob3IgPSBudWxsOworICAgICAgICBpbnQgaWR4ID0gKCFleHBsaWNpdCkgPyAtMSA6IHJzcmMubGFzdEluZGV4T2YoJyMnKTsKKyAgICAgICAgaWYgKGlkeCAhPSAtMSkgeworICAgICAgICAgICAgLy8gc2VwYXJhdGUgbmFtZSBmcm9tIDxyZXNyb3VjZT4jPG5hbWU+IHN0cmluZworICAgICAgICAgICAgaWYgKGlkeCA8IHJzcmMubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgIGFuY2hvciA9IHJzcmMuc3Vic3RyaW5nKGlkeCArIDEpOworICAgICAgICAgICAgcnNyYyA9IHJzcmMuc3Vic3RyaW5nKDAsIGlkeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocnNyYykpCisgICAgICAgICAgICByc3JjID0gUlNSQ19HTE9CQUw7CisgICAgICAgIGVsc2UgaWYgKCFyc3JjLmVuZHNXaXRoKCIueG1sIikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsIGNwID0gbmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwoKTsKKyAgICAgICAgaWYgKGxvYWQoY3AsIHJzcmMsIGFuY2hvciwgbnVsbCwgbG9hZGVyLCBleHBsaWNpdCkgPT0gQm9vbGVhbi5UUlVFKQorICAgICAgICAgICAgcmV0dXJuIGNwOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvblByb3ZpZGVyIGxvYWREZWZhdWx0cyhDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwgY3AgPSBuZXcgQ29uZmlndXJhdGlvblByb3ZpZGVySW1wbCgpOworICAgICAgICBpZiAobG9hZChjcCwgUlNSQ19ERUZBVUxULCBudWxsLCBudWxsLCBsb2FkZXIsIGZhbHNlKSA9PSBCb29sZWFuLlRSVUUpCisgICAgICAgICAgICByZXR1cm4gY3A7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIHRocm91Z2ggdGhlIHJlc291cmNlcyBhdCA8Y29kZT5yc3JjPC9jb2RlPiBmb3IgYSBjb25maWd1cmF0aW9uCisgICAgICogZmlsZSB0aGF0IG1hdGNoZXMgPGNvZGU+bmFtZTwvY29kZT4gKG9yIGFuIHVubmFtZWQgb25lIGlmCisgICAgICogPGNvZGU+bmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4pLCBhbmQgbG9hZHMgdGhlIFhNTCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBpbnRvIGEgbmV3IHtAbGluayBQZXJzaXN0ZW5jZVVuaXRJbmZvfS4gVGhlbiwgYXBwbGllcyB0aGUKKyAgICAgKiBvdmVycmlkZXMgaW4gPGNvZGU+bTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayBCb29sZWFuI1RSVUV9IGlmIHRoZSByZXNvdXJjZSB3YXMgbG9hZGVkLCBudWxsIGlmIGl0CisgICAgICogZG9lcyBub3QgZXhpc3QsIG9yIHtAbGluayBCb29sZWFuI0ZBTFNFfSBpZiBpdCBpcyBub3QgZm9yIE9wZW5KUEEKKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gbG9hZChDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsIGNwLCBTdHJpbmcgcnNyYywgCisgICAgICAgIFN0cmluZyBuYW1lLCBNYXAgbSwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBib29sZWFuIGV4cGxpY2l0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworCisgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gdXJscyA9IGxvYWRlci5nZXRSZXNvdXJjZXMocnNyYyk7CisgICAgICAgIGlmICghdXJscy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgaWYgKCFyc3JjLnN0YXJ0c1dpdGgoIk1FVEEtSU5GIikpCisgICAgICAgICAgICAgICAgdXJscyA9IGxvYWRlci5nZXRSZXNvdXJjZXMoIk1FVEEtSU5GLyIgKyByc3JjKTsKKyAgICAgICAgICAgIGlmICghdXJscy5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIENvbmZpZ3VyYXRpb25QYXJzZXIgcGFyc2VyID0gbmV3IENvbmZpZ3VyYXRpb25QYXJzZXIobSk7CisgICAgICAgIFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsIHBpbmZvID0gcGFyc2VSZXNvdXJjZXMocGFyc2VyLCB1cmxzLCBuYW1lLCAKKyAgICAgICAgICAgIGxvYWRlcik7CisgICAgICAgIGlmIChwaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWV4cGxpY2l0KQorICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihfbG9jLmdldCgibWlzc2luZy14bWwtY29uZmlnIiwgCisgICAgICAgICAgICAgICAgcnNyYywgU3RyaW5nLnZhbHVlT2YobmFtZSkpLmdldE1lc3NhZ2UoKSwgZ2V0Q2xhc3MoKS5nZXROYW1lKCksIAorICAgICAgICAgICAgICAgIHJzcmMpOworICAgICAgICB9IGVsc2UgaWYgKCFpc09wZW5KUEFQZXJzaXN0ZW5jZVByb3ZpZGVyKHBpbmZvLCBsb2FkZXIpKSB7CisgICAgICAgICAgICBpZiAoIWV4cGxpY2l0KSB7CisgICAgICAgICAgICAgICAgd2FyblVua25vd25Qcm92aWRlcihwaW5mbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKF9sb2MuZ2V0KCJ1bmtub3duLXByb3ZpZGVyIiwgCisgICAgICAgICAgICAgICAgcnNyYywgbmFtZSwgcGluZm8uZ2V0UGVyc2lzdGVuY2VQcm92aWRlckNsYXNzTmFtZSgpKS4KKyAgICAgICAgICAgICAgICBnZXRNZXNzYWdlKCksIGdldENsYXNzKCkuZ2V0TmFtZSgpLCByc3JjKTsKKyAgICAgICAgfQorICAgICAgICBjcC5hZGRQcm9wZXJ0aWVzKHBpbmZvLnRvT3BlbkpQQVByb3BlcnRpZXMoKSk7CisgICAgICAgIGNwLnNldFNvdXJjZShwaW5mby5nZXRQZXJzaXN0ZW5jZVhtbEZpbGVVcmwoKS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSByZXNvdXJjZXMgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBTZWFyY2hlcyBmb3IgYQorICAgICAqIFBlcnNpc3RlbmNlVW5pdEluZm8gd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWUsIG9yIGFuIE9wZW5KUEEgdW5pdCBpZgorICAgICAqIG5vIG5hbWUgZ2l2ZW4gKHByZWZlcnJpbmcgYW4gdW5uYW1lZCBPcGVuSlBBIHVuaXQgdG8gYSBuYW1lZCBvbmUpLgorICAgICAqLworICAgIHByaXZhdGUgUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwgcGFyc2VSZXNvdXJjZXMoQ29uZmlndXJhdGlvblBhcnNlciBwYXJzZXIsCisgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gdXJscywgU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbD4gcGluZm9zID0gCisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsPigpOworICAgICAgICBmb3IgKFVSTCB1cmwgOiBDb2xsZWN0aW9ucy5saXN0KHVybHMpKSB7CisgICAgICAgICAgICBwYXJzZXIucGFyc2UodXJsKTsKKyAgICAgICAgICAgIHBpbmZvcy5hZGRBbGwoKExpc3Q8UGVyc2lzdGVuY2VVbml0SW5mb0ltcGw+KSBwYXJzZXIuZ2V0UmVzdWx0cygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmluZFVuaXQocGluZm9zLCBuYW1lLCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgYW4gT3BlbkpQQSB1bml0IGlmIG5vIG5hbWUgaXMKKyAgICAgKiBnaXZlbiAocHJlZmVycmluZyBhbiB1bm5hbWVkIE9wZW5KUEEgdW5pdCB0byBhIG5hbWVkIG9uZSkuCisgICAgICovCisgICAgcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCBmaW5kVW5pdChMaXN0PFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsPiAKKyAgICAgICAgcGluZm9zLCBTdHJpbmcgbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsIG9qcGEgPSBudWxsOworICAgICAgICBmb3IgKFBlcnNpc3RlbmNlVW5pdEluZm9JbXBsIHBpbmZvIDogcGluZm9zKSB7CisgICAgICAgICAgICAvLyBmb3VuZCBuYW1lZCB1bml0PworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhwaW5mby5nZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGluZm87CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc09wZW5KUEFQZXJzaXN0ZW5jZVByb3ZpZGVyKHBpbmZvLCBsb2FkZXIpKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbm8gbmFtZSBnaXZlbiBhbmQgZm91bmQgdW5uYW1lZCB1bml0LCByZXR1cm4gaXQuICAKKyAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgcmVjb3JkIGFzIGRlZmF1bHQgdW5pdCB1bmxlc3Mgd2UgZmluZCBhIAorICAgICAgICAgICAgICAgIC8vIGJldHRlciBtYXRjaCBsYXRlcgorICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHBpbmZvLmdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwaW5mbzsKKyAgICAgICAgICAgICAgICBpZiAob2pwYSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBvanBhID0gcGluZm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9qcGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHBlcnNpc3RlbmNlIHVuaXQgdXNlcyBhbiBPcGVuSlBBIHByb3ZpZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPcGVuSlBBUGVyc2lzdGVuY2VQcm92aWRlcgorICAgICAgICAoUGVyc2lzdGVuY2VVbml0SW5mbyBwaW5mbywgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFN0cmluZyBwcm92aWRlciA9IHBpbmZvLmdldFBlcnNpc3RlbmNlUHJvdmlkZXJDbGFzc05hbWUoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocHJvdmlkZXIpIAorICAgICAgICAgICAgfHwgUGVyc2lzdGVuY2VQcm92aWRlckltcGwuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhwcm92aWRlcikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFBlcnNpc3RlbmNlUHJvdmlkZXJJbXBsLmNsYXNzLmlzQXNzaWduYWJsZUZyb20KKyAgICAgICAgICAgICAgICAoQ2xhc3MuZm9yTmFtZShwcm92aWRlciwgZmFsc2UsIGxvYWRlcikpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nKF9sb2MuZ2V0KCJ1bmxvYWRhYmxlLXByb3ZpZGVyIiwgcHJvdmlkZXIsIHQpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhcm4gdGhlIHVzZXIgdGhhdCB3ZSBjb3VsZCBvbmx5IGZpbmQgYW4gdW5yZWNvZ25pemVkIHBlcnNpc3RlbmNlIAorICAgICAqIHByb3ZpZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FyblVua25vd25Qcm92aWRlcihQZXJzaXN0ZW5jZVVuaXRJbmZvIHBpbmZvKSB7CisgICAgICAgIGxvZyhfbG9jLmdldCgidW5yZWNvZ25pemVkLXByb3ZpZGVyIiwgCisgICAgICAgICAgICBwaW5mby5nZXRQZXJzaXN0ZW5jZVByb3ZpZGVyQ2xhc3NOYW1lKCkpLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UuICAgCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICAvLyBhdCB0aGlzIHBvaW50IGxvZ2dpbmcgaXNuJ3QgY29uZmlndXJlZCB5ZXQKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXIuICAgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsCisgICAgICAgIGV4dGVuZHMgTWFwQ29uZmlndXJhdGlvblByb3ZpZGVyIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBfc291cmNlOworCisgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uUHJvdmlkZXJJbXBsKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwoTWFwIHByb3BzKSB7CisgICAgICAgICAgICBzdXBlcihwcm9wcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBzb3VyY2Ugb2YgaW5mb3JtYXRpb24gaW4gdGhpcyBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB7CisgICAgICAgICAgICBfc291cmNlID0gc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEludG8oQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgICAgICBpZiAoY29uZiBpbnN0YW5jZW9mIE9wZW5KUEFDb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgT3BlbkpQQUNvbmZpZ3VyYXRpb24gb2NvbmYgPSAoT3BlbkpQQUNvbmZpZ3VyYXRpb24pIGNvbmY7CisgICAgICAgICAgICAgICAgb2NvbmYuc2V0U3BlY2lmaWNhdGlvbihTUEVDX0pQQSk7CisKKyAgICAgICAgICAgICAgICAvLyB3ZSBtZXJnZSBzZXZlcmFsIHBlcnNpc3RlbmNlLnhtbCBlbGVtZW50cyBpbnRvIHRoZSAKKyAgICAgICAgICAgICAgICAvLyBNZXRhRGF0YUZhY3RvcnkgcHJvcGVydHkgaW1wbGljaXRseS4gIGlmIHRoZSB1c2VyIGhhcyBhCisgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIG9wZW5qcGEueG1sIHdpdGggdGhpcyBwcm9wZXJ0eSBzZXQsIGl0cyB2YWx1ZSB3aWxsCisgICAgICAgICAgICAgICAgLy8gZ2V0IG92ZXJ3cml0dGVuIGJ5IG91ciBpbXBsaWNpdCBzZXR0aW5nLiAgc28gaW5zdGVhZCwgY29tYmluZQorICAgICAgICAgICAgICAgIC8vIHRoZSBnbG9iYWwgdmFsdWUgd2l0aCBvdXIgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZyA9IG9jb25mLmdldE1ldGFEYXRhRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShvcmlnKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gUHJvZHVjdERlcml2YXRpb25zLmdldENvbmZpZ3VyYXRpb25LZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICgiTWV0YURhdGFGYWN0b3J5IiwgZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG92ZXJyaWRlID0gZ2V0UHJvcGVydGllcygpLmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGUgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShrZXksIENvbmZpZ3VyYXRpb25zLmNvbWJpbmVQbHVnaW5zKG9yaWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG92ZXJyaWRlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXBlci5zZXRJbnRvKGNvbmYsIG51bGwpOworICAgICAgICAgICAgTG9nIGxvZyA9IGNvbmYuZ2V0Q29uZmlndXJhdGlvbkxvZygpOworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNyYyA9IChfc291cmNlID09IG51bGwpID8gIj8iIDogX3NvdXJjZTsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoImNvbmYtbG9hZCIsIHNyYywgZ2V0UHJvcGVydGllcygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTQVggaGFuZGxlciBjYXBhYmxlIG9mIHBhcnNpbmcgYW4gSlBBIHBlcnNpc3RlbmNlLnhtbCBmaWxlLgorICAgICAqIFBhY2thZ2UtcHJvdGVjdGVkIGZvciB0ZXN0aW5nLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uUGFyc2VyCisgICAgICAgIGV4dGVuZHMgWE1MTWV0YURhdGFQYXJzZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwIF9tYXA7CisgICAgICAgIHByaXZhdGUgUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwgX2luZm8gPSBudWxsOworICAgICAgICBwcml2YXRlIFVSTCBfc291cmNlID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvblBhcnNlcihNYXAgbWFwKSB7CisgICAgICAgICAgICBfbWFwID0gbWFwOworICAgICAgICAgICAgc2V0Q2FjaGluZyhmYWxzZSk7CisgICAgICAgICAgICBzZXRWYWxpZGF0aW5nKHRydWUpOworICAgICAgICAgICAgc2V0UGFyc2VUZXh0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKFVSTCB1cmwpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgX3NvdXJjZSA9IHVybDsKKyAgICAgICAgICAgIHN1cGVyLnBhcnNlKHVybCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF9zb3VyY2UgPSBmaWxlLnRvVVJMKCk7CisgICAgICAgICAgICBzdXBlci5wYXJzZShmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNjaGVtYVNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oInBlcnNpc3RlbmNlLXhzZC5yc3JjIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBzdXBlci5yZXNldCgpOworICAgICAgICAgICAgX2luZm8gPSBudWxsOworICAgICAgICAgICAgX3NvdXJjZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50RGVwdGgoKSA9PSAxKQorICAgICAgICAgICAgICAgIHN0YXJ0UGVyc2lzdGVuY2VVbml0KGF0dHJzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnREZXB0aCgpID09IDMgJiYgInByb3BlcnR5Ii5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgX2luZm8uc2V0UHJvcGVydHkoYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoInZhbHVlIikpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY3VycmVudERlcHRoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIF9pbmZvLmZyb21Vc2VyUHJvcGVydGllcyhfbWFwKTsKKyAgICAgICAgICAgICAgICBhZGRSZXN1bHQoX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnREZXB0aCgpICE9IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBzd2l0Y2ggKG5hbWUuY2hhckF0KDApKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6IC8vIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIF9pbmZvLmFkZE1hbmFnZWRDbGFzc05hbWUoY3VycmVudFRleHQoKSk7CisgICAgICAgICAgICAgICAgY2FzZSAnZSc6IC8vIGV4Y2x1ZGUtdW5saXN0ZWQtY2xhc3NlcworICAgICAgICAgICAgICAgICAgICBfaW5mby5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudFRleHQoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdqJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJqdGEtZGF0YS1zb3VyY2UiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbmZvLnNldEp0YURhdGFTb3VyY2VOYW1lKGN1cnJlbnRUZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIGphci1maWxlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm8uYWRkSmFyRmlsZU5hbWUoY3VycmVudFRleHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZ2V0RXhjZXB0aW9uKGlhZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ20nOiAvLyBtYXBwaW5nLWZpbGUKKyAgICAgICAgICAgICAgICAgICAgX2luZm8uYWRkTWFwcGluZ0ZpbGVOYW1lKGN1cnJlbnRUZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICduJzogLy8gbm9uLWp0YS1kYXRhLXNvdXJjZQorICAgICAgICAgICAgICAgICAgICBfaW5mby5zZXROb25KdGFEYXRhU291cmNlTmFtZShjdXJyZW50VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICAgICAgICAgIGlmICgicHJvdmlkZXIiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbmZvLnNldFBlcnNpc3RlbmNlUHJvdmlkZXJDbGFzc05hbWUoY3VycmVudFRleHQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhcnNlIHBlcnNpc3RlbmNlLXVuaXQgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBzdGFydFBlcnNpc3RlbmNlVW5pdChBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfaW5mbyA9IG5ldyBQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCgpOworICAgICAgICAgICAgX2luZm8uc2V0UGVyc2lzdGVuY2VVbml0TmFtZShhdHRycy5nZXRWYWx1ZSgibmFtZSIpKTsKKworICAgICAgICAgICAgLy8gd2Ugb25seSBwYXJzZSB0aGlzIG91cnNlbHZlcyBvdXRzaWRlIGEgY29udGFpbmVyLCBzbyBkZWZhdWx0CisgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiB0eXBlIHRvIGxvY2FsCisgICAgICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInRyYW5zYWN0aW9uLXR5cGUiKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaW5mby5zZXRUcmFuc2FjdGlvblR5cGUKKyAgICAgICAgICAgICAgICAgICAgKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2luZm8uc2V0VHJhbnNhY3Rpb25UeXBlKEVudW0udmFsdWVPZgorICAgICAgICAgICAgICAgICAgICAoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmNsYXNzLCB2YWwpKTsKKworICAgICAgICAgICAgaWYgKF9zb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaW5mby5zZXRQZXJzaXN0ZW5jZVhtbEZpbGVVcmwoX3NvdXJjZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQcm92aWRlckltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVByb3ZpZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzYyZjEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQcm92aWRlckltcGwuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmxhbmcuaW5zdHJ1bWVudC5DbGFzc0ZpbGVUcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZhLmxhbmcuaW5zdHJ1bWVudC5JbGxlZ2FsQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5zcGkuQ2xhc3NUcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5zcGkuUGVyc2lzdGVuY2VQcm92aWRlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5zcGkuUGVyc2lzdGVuY2VVbml0SW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5Ccm9rZXJWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0NsYXNzRmlsZVRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQm9vdHN0cmFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuQ29uZmlndXJhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YU1vZGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DbGFzc1Jlc29sdmVyOworCisKKy8qKgorICogQm9vdHN0cmFwcGluZyBjbGFzcyB0aGF0IGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZC1hbG9uZQorICoge0BsaW5rIEVudGl0eU1hbmFnZXJ9LgorICoKKyAqIEBzZWUgUGVyc2lzdGVuY2UjY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkoU3RyaW5nLE1hcCkKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlUHJvdmlkZXJJbXBsCisgICAgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVByb3ZpZGVyIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfVFJBTlNGT1JNRVJfT1BUSU9OUyA9ICJDbGFzc1RyYW5zZm9ybWVyT3B0aW9ucyI7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZW50aXR5IG1hbmFnZXIgc3BlY2lmaWVkIGJ5IDxjb2RlPm5hbWU8L2NvZGU+LCBhcHBseWluZworICAgICAqIHRoZSBwcm9wZXJ0aWVzIGluIDxjb2RlPm08L2NvZGU+IGFzIG92ZXJyaWRlcyB0byB0aGUgcHJvcGVydGllcyBkZWZpbmVkCisgICAgICogaW4gdGhlIFhNTCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIDxjb2RlPm5hbWU8L2NvZGU+LiBJZiA8Y29kZT5uYW1lPC9jb2RlPgorICAgICAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGlzIG1ldGhvZCBsb2FkcyB0aGUgWE1MIGluIHRoZSByZXNvdXJjZQorICAgICAqIGlkZW50aWZpZWQgYnkgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LCBhbmQgdXNlcyB0aGUgZmlyc3QgcmVzb3VyY2UgZm91bmQKKyAgICAgKiB3aGVuIGRvaW5nIHRoaXMgbG9va3VwLCByZWdhcmRsZXNzIG9mIHRoZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUgWE1MCisgICAgICogcmVzb3VyY2Ugb3IgdGhlIG5hbWUgb2YgdGhlIGphciB0aGF0IHRoZSByZXNvdXJjZSBpcyBjb250YWluZWQgaW4uCisgICAgICogVGhpcyBkb2VzIG5vIHBvb2xpbmcgb2YgRW50aXR5TWFuYWdlcnNGYWN0b3JpZXMuCisgICAgICovCisgICAgcHVibGljIEVudGl0eU1hbmFnZXJGYWN0b3J5IGNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgcmVzb3VyY2UsIE1hcCBtKSB7CisgICAgICAgIFBlcnNpc3RlbmNlUHJvZHVjdERlcml2YXRpb24gcGQgPSBuZXcgUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29uZmlndXJhdGlvblByb3ZpZGVyIGNwID0gcGQubG9hZChyZXNvdXJjZSwgbmFtZSwgbSk7CisgICAgICAgICAgICBpZiAoY3AgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgQnJva2VyRmFjdG9yeSBmYWN0b3J5ID0gQm9vdHN0cmFwLm5ld0Jyb2tlckZhY3RvcnkoY3AsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIE9wZW5KUEFQZXJzaXN0ZW5jZS50b0VudGl0eU1hbmFnZXJGYWN0b3J5KGZhY3RvcnkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgUGVyc2lzdGVuY2VFeGNlcHRpb25zLnRvUGVyc2lzdGVuY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRW50aXR5TWFuYWdlckZhY3RvcnkgY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkoU3RyaW5nIG5hbWUsIE1hcCBtKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeShuYW1lLCBudWxsLCBtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRW50aXR5TWFuYWdlckZhY3RvcnkgY3JlYXRlQ29udGFpbmVyRW50aXR5TWFuYWdlckZhY3RvcnkoCisgICAgICAgIFBlcnNpc3RlbmNlVW5pdEluZm8gcHVpLCBNYXAgbSkgeworICAgICAgICBQZXJzaXN0ZW5jZVByb2R1Y3REZXJpdmF0aW9uIHBkID0gbmV3IFBlcnNpc3RlbmNlUHJvZHVjdERlcml2YXRpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Qcm92aWRlciBjcCA9IHBkLmxvYWQocHVpLCBtKTsKKyAgICAgICAgICAgIGlmIChjcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLyBhZGQgZW5oYW5jZXIKKyAgICAgICAgICAgIFN0cmluZyBjdE9wdHMgPSAoU3RyaW5nKSBDb25maWd1cmF0aW9ucy5nZXRQcm9wZXJ0eQorICAgICAgICAgICAgICAgIChDTEFTU19UUkFOU0ZPUk1FUl9PUFRJT05TLCBwdWkuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgIHB1aS5hZGRUcmFuc2Zvcm1lcihuZXcgQ2xhc3NUcmFuc2Zvcm1lckltcGwoY3AsIGN0T3B0cywgCisgICAgICAgICAgICAgICAgcHVpLmdldE5ld1RlbXBDbGFzc0xvYWRlcigpKSk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBCcm9rZXJJbXBsIGhhc24ndCBiZWVuIHNwZWNpZmllZCwgc3dpdGNoIHRvIHRoZQorICAgICAgICAgICAgLy8gbm9uLWZpbmFsaXppbmcgb25lLCBzaW5jZSBhbnl0aGluZyBjbGFpbWluZyB0byBiZSBhIGNvbnRhaW5lcgorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGRvaW5nIHByb3BlciByZXNvdXJjZSBtYW5hZ2VtZW50LgorICAgICAgICAgICAgaWYgKCFDb25maWd1cmF0aW9ucy5jb250YWluc1Byb3BlcnR5KEJyb2tlclZhbHVlLktFWSwKKyAgICAgICAgICAgICAgICBjcC5nZXRQcm9wZXJ0aWVzKCkpKSB7CisgICAgICAgICAgICAgICAgY3AuYWRkUHJvcGVydHkoIm9wZW5qcGEuIiArIEJyb2tlclZhbHVlLktFWSwgCisgICAgICAgICAgICAgICAgICAgIEJyb2tlclZhbHVlLk5PTl9GSU5BTElaSU5HX0FMSUFTKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnJva2VyRmFjdG9yeSBmYWN0b3J5ID0gQm9vdHN0cmFwLm5ld0Jyb2tlckZhY3RvcnkoY3AsIAorICAgICAgICAgICAgICAgIHB1aS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBPcGVuSlBBUGVyc2lzdGVuY2UudG9FbnRpdHlNYW5hZ2VyRmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IFBlcnNpc3RlbmNlRXhjZXB0aW9ucy50b1BlcnNpc3RlbmNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEphdmEgRUUgNSBjbGFzcyB0cmFuc2Zvcm1lci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc1RyYW5zZm9ybWVySW1wbAorICAgICAgICBpbXBsZW1lbnRzIENsYXNzVHJhbnNmb3JtZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3NGaWxlVHJhbnNmb3JtZXIgX3RyYW5zOworCisgICAgICAgIHByaXZhdGUgQ2xhc3NUcmFuc2Zvcm1lckltcGwoQ29uZmlndXJhdGlvblByb3ZpZGVyIGNwLCBTdHJpbmcgcHJvcHMsIAorICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgdG1wTG9hZGVyKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYW4gaW5kZXBlbmRlbnQgY29uZiBmb3IgZW5oYW5jZW1lbnQKKyAgICAgICAgICAgIE9wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsKCk7CisgICAgICAgICAgICBjcC5zZXRJbnRvKGNvbmYpOworICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGNvbmYuc2V0Q29ubmVjdGlvblVzZXJOYW1lKG51bGwpOworICAgICAgICAgICAgY29uZi5zZXRDb25uZWN0aW9uUGFzc3dvcmQobnVsbCk7CisgICAgICAgICAgICBjb25mLnNldENvbm5lY3Rpb25VUkwobnVsbCk7CisgICAgICAgICAgICBjb25mLnNldENvbm5lY3Rpb25Ecml2ZXJOYW1lKG51bGwpOworICAgICAgICAgICAgY29uZi5zZXRDb25uZWN0aW9uRmFjdG9yeU5hbWUobnVsbCk7CisgICAgICAgICAgICAvLyB1c2UgdGhlIHRtcCBsb2FkZXIgZm9yIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgIGNvbmYuc2V0Q2xhc3NSZXNvbHZlcihuZXcgQ2xhc3NSZXNvbHZlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoQ2xhc3MgY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGVudikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wTG9hZGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgY29uZi5zZXRSZWFkT25seSh0cnVlKTsKKworICAgICAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gY29uZi5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpOworICAgICAgICAgICAgcmVwb3Muc2V0UmVzb2x2ZShNZXRhRGF0YU1vZGVzLk1PREVfTUFQUElORywgZmFsc2UpOworICAgICAgICAgICAgX3RyYW5zID0gbmV3IFBDQ2xhc3NGaWxlVHJhbnNmb3JtZXIocmVwb3MsCisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbnMucGFyc2VQcm9wZXJ0aWVzKHByb3BzKSwgdG1wTG9hZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gdHJhbnNmb3JtKENsYXNzTG9hZGVyIGNsLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIENsYXNzPD8+IHByZXZpb3VzVmVyc2lvbiwgUHJvdGVjdGlvbkRvbWFpbiBwZCwgYnl0ZVtdIGJ5dGVzKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gX3RyYW5zLnRyYW5zZm9ybShjbCwgbmFtZSwgcHJldmlvdXNWZXJzaW9uLCBwZCwgYnl0ZXMpOworICAgICAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU3RyYXRlZ3kuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhZTQzNQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgbmV3IGNsYXNzaWZpY2F0aW9uLCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZQorLy8gdGFibGUgaW4gUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogU2V0IG9mIGZpZWxkIHBlcnNpc3RlbmNlIHN0cmF0ZWdpZXMgdXNlZCBpbiBKUEEuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqLworcHVibGljIGVudW0gUGVyc2lzdGVuY2VTdHJhdGVneSB7CisgICAgLy8gb3JkZXIgbWF0dGVycyB0byBtYXRjaCBYTUwgc3BlYworICAgIEJBU0lDLAorICAgIE1BTllfT05FLAorICAgIE9ORV9NQU5ZLAorICAgIE9ORV9PTkUsCisgICAgTUFOWV9NQU5ZLAorICAgIEVNQkVEREVELAorICAgIFRSQU5TSUVOVCwKKyAgICAvLyBvcGVuanBhIGV4dGVuc2lvbnMKKyAgICBQRVJTLAorICAgIFBFUlNfQ09MTCwKKyAgICBQRVJTX01BUCwKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdEluZm9JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhNmYwMwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2Uuc3BpLkNsYXNzVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2Uuc3BpLlBlcnNpc3RlbmNlVW5pdEluZm87CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2Uuc3BpLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUHJvZHVjdERlcml2YXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubWV0YS5Tb3VyY2VUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLk11bHRpQ2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLlRlbXBvcmFyeUNsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkNsYXNzUmVzb2x2ZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBQZXJzaXN0ZW5jZVVuaXRJbmZvfSBpbnRlcmZhY2UgdXNlZCBieSBPcGVuSlBBIAorICogd2hlbiBwYXJzaW5nIHBlcnNpc3RlbmNlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgKgorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwKKyAgICBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdEluZm8sIFNvdXJjZVRyYWNrZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1ZJREVSID0gImphdmF4LnBlcnNpc3RlbmNlLnByb3ZpZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBzX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbC5jbGFzcyk7CisKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgX3Byb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBwcml2YXRlIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBfdHJhbnNUeXBlID0KKyAgICAgICAgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOworCisgICAgcHJpdmF0ZSBTdHJpbmcgX3Byb3ZpZGVyQ2xhc3NOYW1lOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IF9tYXBwaW5nRmlsZU5hbWVzOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IF9lbnRpdHlDbGFzc05hbWVzOworICAgIHByaXZhdGUgTGlzdDxVUkw+IF9qYXJGaWxlczsKKyAgICBwcml2YXRlIFN0cmluZyBfanRhRGF0YVNvdXJjZU5hbWU7CisgICAgcHJpdmF0ZSBEYXRhU291cmNlIF9qdGFEYXRhU291cmNlOworICAgIHByaXZhdGUgU3RyaW5nIF9ub25KdGFEYXRhU291cmNlTmFtZTsKKyAgICBwcml2YXRlIERhdGFTb3VyY2UgX25vbkp0YURhdGFTb3VyY2U7CisgICAgcHJpdmF0ZSBib29sZWFuIF9leGNsdWRlVW5saXN0ZWQ7CisgICAgcHJpdmF0ZSBVUkwgX3BlcnNpc3RlbmNlWG1sRmlsZTsKKworICAgIC8vIEEgcGVyc2lzdGVuY2UgdW5pdCBpcyBkZWZpbmVkIGJ5IGEgcGVyc2lzdGVuY2UueG1sIGZpbGUuIFRoZSBqYXIKKyAgICAvLyBmaWxlIG9yIGRpcmVjdG9yeSB3aG9zZSBNRVRBLUlORiBkaXJlY3RvcnkgY29udGFpbnMgdGhlCisgICAgLy8gcGVyc2lzdGVuY2UueG1sIGZpbGUgaXMgdGVybWVkIHRoZSByb290IG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorICAgIC8vCisgICAgLy8gSW4gSmF2YSBFRSwgdGhlIHJvb3Qgb2YgYSBwZXJzaXN0ZW5jZSB1bml0IG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAvLyAtIGFuIEVKQi1KQVIgZmlsZQorICAgIC8vIC0gdGhlIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3Rvcnkgb2YgYSBXQVIgZmlsZVszOF0KKyAgICAvLyAtIGEgamFyIGZpbGUgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeSBvZiBhIFdBUiBmaWxlCisgICAgLy8gLSBhIGphciBmaWxlIGluIHRoZSByb290IG9mIHRoZSBFQVIKKyAgICAvLyAtIGEgamFyIGZpbGUgaW4gdGhlIEVBUiBsaWJyYXJ5IGRpcmVjdG9yeQorICAgIC8vIC0gYW4gYXBwbGljYXRpb24gY2xpZW50IGphciBmaWxlCisgICAgcHJpdmF0ZSBVUkwgX3Jvb3Q7CisKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXROZXdUZW1wQ2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVtcG9yYXJ5Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KKyAgICAgICAgICAgIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKFN0cmluZyBlbU5hbWUpIHsKKyAgICAgICAgX25hbWUgPSBlbU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVByb3ZpZGVyQ2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gX3Byb3ZpZGVyQ2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlUHJvdmlkZXJDbGFzc05hbWUoU3RyaW5nIHByb3ZpZGVyQ2xhc3NOYW1lKSB7CisgICAgICAgIF9wcm92aWRlckNsYXNzTmFtZSA9IHByb3ZpZGVyQ2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gX3RyYW5zVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRyYW5zVHlwZSkgeworICAgICAgICBfdHJhbnNUeXBlID0gdHJhbnNUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnRhRGF0YVNvdXJjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBfanRhRGF0YVNvdXJjZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SnRhRGF0YVNvdXJjZU5hbWUoU3RyaW5nIGp0YSkgeworICAgICAgICBfanRhRGF0YVNvdXJjZU5hbWUgPSBqdGE7CisgICAgICAgIGlmIChqdGEgIT0gbnVsbCkKKyAgICAgICAgICAgIF9qdGFEYXRhU291cmNlID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVNvdXJjZSBnZXRKdGFEYXRhU291cmNlKCkgeworICAgICAgICByZXR1cm4gX2p0YURhdGFTb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SnRhRGF0YVNvdXJjZShEYXRhU291cmNlIGRzKSB7CisgICAgICAgIF9qdGFEYXRhU291cmNlID0gZHM7CisgICAgICAgIGlmIChkcyAhPSBudWxsKQorICAgICAgICAgICAgX2p0YURhdGFTb3VyY2VOYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vbkp0YURhdGFTb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gX25vbkp0YURhdGFTb3VyY2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vbkp0YURhdGFTb3VyY2VOYW1lKFN0cmluZyBub25KdGEpIHsKKyAgICAgICAgX25vbkp0YURhdGFTb3VyY2VOYW1lID0gbm9uSnRhOworICAgICAgICBpZiAobm9uSnRhICE9IG51bGwpCisgICAgICAgICAgICBfbm9uSnRhRGF0YVNvdXJjZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIERhdGFTb3VyY2UgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIF9ub25KdGFEYXRhU291cmNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vbkp0YURhdGFTb3VyY2UoRGF0YVNvdXJjZSBkcykgeworICAgICAgICBfbm9uSnRhRGF0YVNvdXJjZSA9IGRzOworICAgICAgICBpZiAoZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9ub25KdGFEYXRhU291cmNlTmFtZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFVSTCBnZXRQZXJzaXN0ZW5jZVVuaXRSb290VXJsKCkgeworICAgICAgICByZXR1cm4gX3Jvb3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0Um9vdFVybChVUkwgcm9vdCkgeworICAgICAgICBfcm9vdCA9IHJvb3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIF9leGNsdWRlVW5saXN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyhib29sZWFuIGV4Y2x1ZGVVbmxpc3RlZCkgeworICAgICAgICBfZXhjbHVkZVVubGlzdGVkID0gZXhjbHVkZVVubGlzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWFwcGluZ0ZpbGVOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIChfbWFwcGluZ0ZpbGVOYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgPyAoTGlzdDxTdHJpbmc+KSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogX21hcHBpbmdGaWxlTmFtZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTWFwcGluZ0ZpbGVOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChfbWFwcGluZ0ZpbGVOYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgX21hcHBpbmdGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgX21hcHBpbmdGaWxlTmFtZXMuYWRkKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFVSTD4gZ2V0SmFyRmlsZVVybHMoKSB7CisgICAgICAgIHJldHVybiAoX2phckZpbGVzID09IG51bGwpID8gKExpc3Q8VVJMPikgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCAKKyAgICAgICAgICAgIDogX2phckZpbGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEphckZpbGUoVVJMIGphcikgeworICAgICAgICBpZiAoX2phckZpbGVzID09IG51bGwpCisgICAgICAgICAgICBfamFyRmlsZXMgPSBuZXcgQXJyYXlMaXN0PFVSTD4oKTsKKyAgICAgICAgX2phckZpbGVzLmFkZChqYXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEphckZpbGVOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE11bHRpQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IE11bHRpQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgbG9hZGVyLmFkZENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIGxvYWRlci5hZGRDbGFzc0xvYWRlcihNdWx0aUNsYXNzTG9hZGVyLlRIUkVBRF9MT0FERVIpOworICAgICAgICBVUkwgdXJsID0gbG9hZGVyLmdldFJlc291cmNlKG5hbWUpOworICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZEphckZpbGUodXJsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGphciBmaWxlIGlzIG5vdCBhIHJlc291cmNlOyBjaGVjayBjbGFzc3BhdGgKKyAgICAgICAgU3RyaW5nW10gY3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpLgorICAgICAgICAgICAgc3BsaXQoU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNwW2ldLmVxdWFscyhuYW1lKQorICAgICAgICAgICAgICAgIHx8IGNwW2ldLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yQ2hhciArIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWRkSmFyRmlsZShuZXcgRmlsZShjcFtpXSkudG9VUkwoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNfbG9jLmdldCgiYmFkLWphci1uYW1lIiwgbmFtZSkuCisgICAgICAgICAgICBnZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWFuYWdlZENsYXNzTmFtZXMoKSB7CisgICAgICAgIHJldHVybiAoX2VudGl0eUNsYXNzTmFtZXMgPT0gbnVsbCkKKyAgICAgICAgICAgID8gKExpc3Q8U3RyaW5nPikgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IF9lbnRpdHlDbGFzc05hbWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1hbmFnZWRDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKF9lbnRpdHlDbGFzc05hbWVzID09IG51bGwpCisgICAgICAgICAgICBfZW50aXR5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBfZW50aXR5Q2xhc3NOYW1lcy5hZGQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIF9wcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgX3Byb3BzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zZm9ybWVyKENsYXNzVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgcmVzb3VyY2UuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0UGVyc2lzdGVuY2VYbWxGaWxlVXJsKCkgeworICAgICAgICByZXR1cm4gX3BlcnNpc3RlbmNlWG1sRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCByZXNvdXJjZS4gTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VYbWxGaWxlVXJsKFVSTCB1cmwpIHsKKyAgICAgICAgX3BlcnNpc3RlbmNlWG1sRmlsZSA9IHVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBnaXZlbiB1c2VyLXN1cHBsaWVkIG1hcCBvZiBwcm9wZXJ0aWVzIGludG8gdGhpcyBwZXJzaXN0ZW5jZQorICAgICAqIHVuaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZnJvbVVzZXJQcm9wZXJ0aWVzKE1hcCBtYXApIHsKKyAgICAgICAgaWYgKG1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE9iamVjdCBrZXk7CisgICAgICAgIE9iamVjdCB2YWw7CisgICAgICAgIGZvciAoT2JqZWN0IG8gOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAga2V5ID0gKChNYXAuRW50cnkpIG8pLmdldEtleSgpOworICAgICAgICAgICAgdmFsID0gKChNYXAuRW50cnkpIG8pLmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoS0VZX1BST1ZJREVSLmVxdWFscyhrZXkpKQorICAgICAgICAgICAgICAgIHNldFBlcnNpc3RlbmNlUHJvdmlkZXJDbGFzc05hbWUoKFN0cmluZykgdmFsKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJqYXZheC5wZXJzaXN0ZW5jZS50cmFuc2FjdGlvblR5cGUiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHR0eXBlOworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHR0eXBlID0gRW51bS52YWx1ZU9mKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5jbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSB2YWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHR5cGUgPSAoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKSB2YWw7CisgICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25UeXBlKHR0eXBlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImphdmF4LnBlcnNpc3RlbmNlLmp0YURhdGFTb3VyY2UiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgc2V0SnRhRGF0YVNvdXJjZU5hbWUoKFN0cmluZykgdmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNldEp0YURhdGFTb3VyY2UoKERhdGFTb3VyY2UpIHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJqYXZheC5wZXJzaXN0ZW5jZS5ub25KdGFEYXRhU291cmNlIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHNldE5vbkp0YURhdGFTb3VyY2VOYW1lKChTdHJpbmcpIHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzZXROb25KdGFEYXRhU291cmNlKChEYXRhU291cmNlKSB2YWwpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX3Byb3BzLnB1dChrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB7QGxpbmsgTWFwfSBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSB0byBjcmVhdGUKKyAgICAgKiBhIHtAbGluayBDb25maWd1cmF0aW9ufSB0aGF0IHJlZmxlY3RzIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzCisgICAgICogcGVyc2lzdGVuY2UgdW5pdCBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgdG9PcGVuSlBBUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHRvT3BlbkpQQVByb3BlcnRpZXModGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEge0BsaW5rIE1hcH0gY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlCisgICAgICogYSB7QGxpbmsgQ29uZmlndXJhdGlvbn0gdGhhdCByZWZsZWN0cyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuCisgICAgICogcGVyc2lzdGVuY2UgdW5pdCBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwIHRvT3BlbkpQQVByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0SW5mbyBpbmZvKSB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBpZiAoaW5mby5nZXRUcmFuc2FjdGlvblR5cGUoKSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKQorICAgICAgICAgICAgbWFwLnB1dCgib3BlbmpwYS5UcmFuc2FjdGlvbk1vZGUiLCAibWFuYWdlZCIpOworCisgICAgICAgIGJvb2xlYW4gaGFzSnRhID0gZmFsc2U7CisgICAgICAgIERhdGFTb3VyY2UgZHMgPSBpbmZvLmdldEp0YURhdGFTb3VyY2UoKTsKKyAgICAgICAgaWYgKGRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hcC5wdXQoIm9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkiLCBkcyk7CisgICAgICAgICAgICBtYXAucHV0KCJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5TW9kZSIsICJtYW5hZ2VkIik7CisgICAgICAgICAgICBoYXNKdGEgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGluZm8gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbAorICAgICAgICAgICAgJiYgKChQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCkgaW5mbykuZ2V0SnRhRGF0YVNvdXJjZU5hbWUoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIG1hcC5wdXQoIm9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlOYW1lIiwgKChQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCkKKyAgICAgICAgICAgICAgICBpbmZvKS5nZXRKdGFEYXRhU291cmNlTmFtZSgpKTsKKyAgICAgICAgICAgIG1hcC5wdXQoIm9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlNb2RlIiwgIm1hbmFnZWQiKTsKKyAgICAgICAgICAgIGhhc0p0YSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBkcyA9IGluZm8uZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOworICAgICAgICBpZiAoZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFoYXNKdGEpCisgICAgICAgICAgICAgICAgbWFwLnB1dCgib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeSIsIGRzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXAucHV0KCJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5MiIsIGRzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbmZvIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwKKyAgICAgICAgICAgICYmICgoUGVyc2lzdGVuY2VVbml0SW5mb0ltcGwpIGluZm8pLmdldE5vbkp0YURhdGFTb3VyY2VOYW1lKCkKKyAgICAgICAgICAgICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBub25KdGFOYW1lID0gKChQZXJzaXN0ZW5jZVVuaXRJbmZvSW1wbCkgaW5mbykuCisgICAgICAgICAgICAgICAgZ2V0Tm9uSnRhRGF0YVNvdXJjZU5hbWUoKTsKKyAgICAgICAgICAgIGlmICghaGFzSnRhKQorICAgICAgICAgICAgICAgIG1hcC5wdXQoIm9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlOYW1lIiwgbm9uSnRhTmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWFwLnB1dCgib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTJOYW1lIiwgbm9uSnRhTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5mby5nZXRDbGFzc0xvYWRlcigpICE9IG51bGwpCisgICAgICAgICAgICBtYXAucHV0KCJvcGVuanBhLkNsYXNzUmVzb2x2ZXIiLCBuZXcgQ2xhc3NSZXNvbHZlckltcGwKKyAgICAgICAgICAgICAgICAoaW5mby5nZXRDbGFzc0xvYWRlcigpKSk7CisKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGluZm8uZ2V0UHJvcGVydGllcygpOworICAgICAgICBpZiAocHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFwLnB1dEFsbChwcm9wcyk7CisgICAgICAgICAgICAvLyB0aGlzIGlzbid0IGEgcmVhbCBjb25maWcgcHJvcGVydHk7IHJlbW92ZSBpdAorICAgICAgICAgICAgbWFwLnJlbW92ZShQZXJzaXN0ZW5jZVByb3ZpZGVySW1wbC5DTEFTU19UUkFOU0ZPUk1FUl9PUFRJT05TKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KCJvcGVuanBhLklkIikpCisgICAgICAgICAgICBtYXAucHV0KCJvcGVuanBhLklkIiwgaW5mby5nZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkpOworICAgICAgICAKKyAgICAgICAgUHJvcGVydGllcyBtZXRhRmFjdG9yeVByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKGluZm8uZ2V0TWFuYWdlZENsYXNzTmFtZXMoKSAhPSBudWxsIAorICAgICAgICAgICAgJiYgIWluZm8uZ2V0TWFuYWdlZENsYXNzTmFtZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0eXBlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBpbmZvLmdldE1hbmFnZWRDbGFzc05hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZXMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB0eXBlcy5hcHBlbmQoJzsnKTsKKyAgICAgICAgICAgICAgICB0eXBlcy5hcHBlbmQodHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhRmFjdG9yeVByb3BzLnB1dCgiVHlwZXMiLCB0eXBlcy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5mby5nZXRKYXJGaWxlVXJscygpICE9IG51bGwgJiYgIWluZm8uZ2V0SmFyRmlsZVVybHMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgIHx8ICghaW5mby5leGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKyAgICAgICAgICAgICYmIGluZm8uZ2V0UGVyc2lzdGVuY2VVbml0Um9vdFVybCgpICE9IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgamFycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghaW5mby5leGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKyAgICAgICAgICAgICAgICAmJiBpbmZvLmdldFBlcnNpc3RlbmNlVW5pdFJvb3RVcmwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVVJMIHVybCA9IGluZm8uZ2V0UGVyc2lzdGVuY2VVbml0Um9vdFVybCgpOworICAgICAgICAgICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgLy8gZXhwbG9kZWQgamFyPworICAgICAgICAgICAgICAgICAgICBmaWxlID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBqYXJzLmFwcGVuZCh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChVUkwgamFyIDogaW5mby5nZXRKYXJGaWxlVXJscygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGphcnMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICBqYXJzLmFwcGVuZCgnOycpOworICAgICAgICAgICAgICAgIGphcnMuYXBwZW5kKGphcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1ldGFGYWN0b3J5UHJvcHMucHV0KCJGaWxlcyIsIGZpbGUpOworICAgICAgICAgICAgaWYgKGphcnMubGVuZ3RoKCkgIT0gMCkKKyAgICAgICAgICAgICAgICBtZXRhRmFjdG9yeVByb3BzLnB1dCgiVVJMcyIsIGphcnMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZm8uZ2V0TWFwcGluZ0ZpbGVOYW1lcygpICE9IG51bGwKKyAgICAgICAgICAgICYmICFpbmZvLmdldE1hcHBpbmdGaWxlTmFtZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciByc3JjcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHJzcmMgOiBpbmZvLmdldE1hcHBpbmdGaWxlTmFtZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChyc3Jjcy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHJzcmNzLmFwcGVuZCgnOycpOworICAgICAgICAgICAgICAgIHJzcmNzLmFwcGVuZChyc3JjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGFGYWN0b3J5UHJvcHMucHV0KCJSZXNvdXJjZXMiLCByc3Jjcy50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBwZXJzaXN0ZW50IGNsYXNzIGxvY2F0aW9ucyBhcyBwcm9wZXJ0aWVzIG9mIG1ldGFkYXRhIGZhY3RvcnksCisgICAgICAgIC8vIGNvbWJpbmluZyB0aGVtIHdpdGggYW55IGV4aXN0aW5nIG1ldGFkYXRhIGZhY3RvcnkgcHJvcHMKKyAgICAgICAgaWYgKCFtZXRhRmFjdG9yeVByb3BzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IFByb2R1Y3REZXJpdmF0aW9ucy5nZXRDb25maWd1cmF0aW9uS2V5CisgICAgICAgICAgICAgICAgKCJNZXRhRGF0YUZhY3RvcnkiLCBtYXApOworICAgICAgICAgICAgbWFwLnB1dChrZXksIENvbmZpZ3VyYXRpb25zLmNvbWJpbmVQbHVnaW5zKChTdHJpbmcpIG1hcC5nZXQoa2V5KSwKKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9ucy5zZXJpYWxpemVQcm9wZXJ0aWVzKG1ldGFGYWN0b3J5UHJvcHMpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGFsd2F5cyByZWNvcmQgcHJvdmlkZXIgbmFtZSBmb3IgcHJvZHVjdCBkZXJpdmF0aW9ucyB0byBhY2Nlc3MKKyAgICAgICAgaWYgKGluZm8uZ2V0UGVyc2lzdGVuY2VQcm92aWRlckNsYXNzTmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICBtYXAucHV0KEtFWV9QUk9WSURFUiwgaW5mby5nZXRQZXJzaXN0ZW5jZVByb3ZpZGVyQ2xhc3NOYW1lKCkpOworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKCkgeworICAgICAgICBpZiAoX3BlcnNpc3RlbmNlWG1sRmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShfcGVyc2lzdGVuY2VYbWxGaWxlLnRvVVJJKCkpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFNSQ19YTUw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiUGVyc2lzdGVuY2VVbml0SW5mbzoiICsgX25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIGNsYXNzIHJlc29sdmVyIGJ1aWx0IGFyb3VuZCB0aGUgcGVyc2lzdGVuY2UgdW5pdCBsb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NSZXNvbHZlckltcGwKKyAgICAgICAgaW1wbGVtZW50cyBDbGFzc1Jlc29sdmVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIF9sb2FkZXI7CisKKyAgICAgICAgcHVibGljIENsYXNzUmVzb2x2ZXJJbXBsKENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAgICAgX2xvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihDbGFzcyBjdHgsIENsYXNzTG9hZGVyIGVudikgeworICAgICAgICAgICAgcmV0dXJuIF9sb2FkZXI7CisgICAgICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVudC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcyNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbnQuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNhc2NhZGVUeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkZldGNoVHlwZTsKKworLyoqCisgKiBNZXRhZGF0YSBhbm5vdGF0aW9uIGZvciBhIHBlcnNpc3RlbnQgZmllbGQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgUGVyc2lzdGVudCB7CisKKyAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworCisgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKworICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisKKyAgICBib29sZWFuIGVtYmVkZGVkKCkgZGVmYXVsdCBmYWxzZTsKKworICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkVBR0VSOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbnRDb2xsZWN0aW9uLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVudENvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2FmM2RiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbnRDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGU7CisKKy8qKgorICogTWV0YWRhdGEgYW5ub3RhdGlvbiBmb3IgYSBwZXJzaXN0ZW50IGNvbGxlY3Rpb24gZmllbGQuIFRoaXMgc2hvdWxkIGJlCisgKiB1c2VkIHRvIGFubm90YXRlIGFycmF5IGZpZWxkIHR5cGVzIGFzIHdlbGwgYXMgZmllbGRzIG9mIHR5cGUKKyAqIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0uCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgUGVyc2lzdGVudENvbGxlY3Rpb24geworCisgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKworICAgIENsYXNzIGVsZW1lbnRUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgQ2FzY2FkZVR5cGVbXSBlbGVtZW50Q2FzY2FkZSgpIGRlZmF1bHQge307CisKKyAgICBib29sZWFuIGVsZW1lbnRFbWJlZGRlZCgpIGRlZmF1bHQgZmFsc2U7CisKKyAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEZldGNoVHlwZS5MQVpZOworfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbnRNYXAuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW50TWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1OGM3YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW50TWFwLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGU7CisKKy8qKgorICogTWV0YWRhdGEgYW5ub3RhdGlvbiBmb3IgYSBwZXJzaXN0ZW50IG1hcCBmaWVsZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKi8KK0BUYXJnZXQoeyBNRVRIT0QsIEZJRUxEIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBQZXJzaXN0ZW50TWFwIHsKKworICAgIENsYXNzIGtleVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisKKyAgICBDbGFzcyBlbGVtZW50VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKworICAgIENhc2NhZGVUeXBlW10ga2V5Q2FzY2FkZSgpIGRlZmF1bHQge307CisKKyAgICBDYXNjYWRlVHlwZVtdIGVsZW1lbnRDYXNjYWRlKCkgZGVmYXVsdCB7fTsKKworICAgIGJvb2xlYW4ga2V5RW1iZWRkZWQoKSBkZWZhdWx0IGZhbHNlOworCisgICAgYm9vbGVhbiBlbGVtZW50RW1iZWRkZWQoKSBkZWZhdWx0IGZhbHNlOworCisgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBGZXRjaFR5cGUuTEFaWTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9RdWVyeUltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9RdWVyeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkxMjBiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1F1ZXJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GbHVzaE1vZGVUeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsVHlwZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGlua2VkTWFwOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGVsZWdhdGluZ1F1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRGVsZWdhdGluZ1Jlc3VsdExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GaWx0ZXJzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuZXhwcy5BZ2dyZWdhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLmV4cHMuRmlsdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5yb3AuUmVzdWx0TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlJlZmxlY3Rpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFF1ZXJ5fSBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBNYXJjIFBydWQnaG9tbWVhdXgKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeUltcGwKKyAgICBpbXBsZW1lbnRzIE9wZW5KUEFRdWVyeSwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFF1ZXJ5SW1wbC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdRdWVyeSBfcXVlcnk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRW50aXR5TWFuYWdlckltcGwgX2VtOworICAgIHByaXZhdGUgdHJhbnNpZW50IEZldGNoUGxhbiBfZmV0Y2g7CisKKyAgICBwcml2YXRlIE1hcCBfbmFtZWQ7CisgICAgcHJpdmF0ZSBMaXN0IF9wb3NpdGlvbmFsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBmYWN0b3J5IGFuZCBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlJbXBsKEVudGl0eU1hbmFnZXJJbXBsIGVtLAorICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIF9lbSA9IGVtOworICAgICAgICBfcXVlcnkgPSBuZXcgRGVsZWdhdGluZ1F1ZXJ5KHF1ZXJ5LAorICAgICAgICAgICAgUGVyc2lzdGVuY2VFeGNlcHRpb25zLmdldFJvbGxiYWNrVHJhbnNsYXRvcihlbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5IGdldERlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldERlbGVnYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGdldEVudGl0eU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBfZW07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRMYW5ndWFnZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldE9wZXJhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBGZXRjaFBsYW4gZ2V0RmV0Y2hQbGFuKCkgeworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIF9xdWVyeS5hc3NlcnROb3RTZXJpYWxpemVkKCk7CisgICAgICAgIF9xdWVyeS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoX2ZldGNoID09IG51bGwpCisgICAgICAgICAgICAgICAgX2ZldGNoID0gKChFbnRpdHlNYW5hZ2VyRmFjdG9yeUltcGwpIF9lbS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RW50aXR5TWFuYWdlckZhY3RvcnkoKSkudG9GZXRjaFBsYW4oX3F1ZXJ5LmdldEJyb2tlcigpLAorICAgICAgICAgICAgICAgICAgICBfcXVlcnkuZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIF9mZXRjaDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9xdWVyeS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVDaGFuZ2VzKCkgeworICAgICAgICByZXR1cm4gX3F1ZXJ5LmdldElnbm9yZUNoYW5nZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldElnbm9yZUNoYW5nZXMoYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICBfcXVlcnkuc2V0SWdub3JlQ2hhbmdlcyhpZ25vcmUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGFkZEZpbHRlckxpc3RlbmVyKEZpbHRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgX3F1ZXJ5LmFkZEZpbHRlckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSByZW1vdmVGaWx0ZXJMaXN0ZW5lcihGaWx0ZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIF9xdWVyeS5yZW1vdmVGaWx0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgYWRkQWdncmVnYXRlTGlzdGVuZXIoQWdncmVnYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICBfcXVlcnkuYWRkQWdncmVnYXRlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHJlbW92ZUFnZ3JlZ2F0ZUxpc3RlbmVyKEFnZ3JlZ2F0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgX3F1ZXJ5LnJlbW92ZUFnZ3JlZ2F0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2FuZGlkYXRlQ29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5nZXRDYW5kaWRhdGVDb2xsZWN0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBzZXRDYW5kaWRhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb24gY29sbCkgeworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIF9xdWVyeS5zZXRDYW5kaWRhdGVDb2xsZWN0aW9uKGNvbGwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0Q2xhc3MoKSB7CisgICAgICAgIENsYXNzIHJlcyA9IF9xdWVyeS5nZXRSZXN1bHRUeXBlKCk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0Q2FuZGlkYXRlVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0UmVzdWx0Q2xhc3MoQ2xhc3MgY2xzKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgaWYgKE9wZW5KUEFQZXJzaXN0ZW5jZS5pc01hbmFnZWRUeXBlKF9lbSwgY2xzKSkKKyAgICAgICAgICAgIF9xdWVyeS5zZXRDYW5kaWRhdGVUeXBlKGNscywgdHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9xdWVyeS5zZXRSZXN1bHRUeXBlKGNscyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N1YmNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkuaGFzU3ViY2xhc3NlcygpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0U3ViY2xhc3Nlcyhib29sZWFuIHN1YnMpIHsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICBDbGFzcyBjbHMgPSBfcXVlcnkuZ2V0Q2FuZGlkYXRlVHlwZSgpOworICAgICAgICBfcXVlcnkuc2V0Q2FuZGlkYXRlRXh0ZW50KF9xdWVyeS5nZXRCcm9rZXIoKS5uZXdFeHRlbnQoY2xzLCBzdWJzKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3RSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBhc0ludChfcXVlcnkuZ2V0U3RhcnRSYW5nZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldEZpcnN0UmVzdWx0KGludCBzdGFydFBvc2l0aW9uKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgX3F1ZXJ5LnNldFJhbmdlKHN0YXJ0UG9zaXRpb24sIF9xdWVyeS5nZXRFbmRSYW5nZSgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhSZXN1bHRzKCkgeworICAgICAgICByZXR1cm4gYXNJbnQoX3F1ZXJ5LmdldEVuZFJhbmdlKCkgLSBfcXVlcnkuZ2V0U3RhcnRSYW5nZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldE1heFJlc3VsdHMoaW50IG1heCkgeworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIGxvbmcgc3RhcnQgPSBfcXVlcnkuZ2V0U3RhcnRSYW5nZSgpOworICAgICAgICBpZiAobWF4ID09IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgX3F1ZXJ5LnNldFJhbmdlKHN0YXJ0LCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9xdWVyeS5zZXRSYW5nZShzdGFydCwgc3RhcnQgKyBtYXgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IGNvbXBpbGUoKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgX3F1ZXJ5LmNvbXBpbGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZXhlY3V0ZSgpIHsKKyAgICAgICAgaWYgKF9xdWVyeS5nZXRPcGVyYXRpb24oKSAhPSBPUF9TRUxFQ1QpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3Qtc2VsZWN0LXF1ZXJ5IiwKKyAgICAgICAgICAgICAgICBfcXVlcnkuZ2V0UXVlcnlTdHJpbmcoKSksIG51bGwsIG51bGwsIGZhbHNlKTsKKworICAgICAgICB2YWxpZGF0ZVBhcmFtZXRlcnMoKTsKKworICAgICAgICAvLyBoYW5kbGUgd2hpY2ggdHlwZXMgb2YgcGFyYW1ldGVycyB3ZSBhcmUgdXNpbmcsIGlmIGFueQorICAgICAgICBpZiAoX3Bvc2l0aW9uYWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfcXVlcnkuZXhlY3V0ZShfcG9zaXRpb25hbC50b0FycmF5KCkpOworICAgICAgICBpZiAoX25hbWVkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX3F1ZXJ5LmV4ZWN1dGUoX25hbWVkKTsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5leGVjdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFyYW1ldGVycygpIHsKKyAgICAgICAgaWYgKF9wb3NpdGlvbmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpbmtlZE1hcCB0eXBlcyA9IF9xdWVyeS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsCisgICAgICAgICAgICAgICAgc2l6ZSA9IE1hdGgubWluKF9wb3NpdGlvbmFsLnNpemUoKSwgdHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVyKFN0cmluZy52YWx1ZU9mKGkpLAorICAgICAgICAgICAgICAgICAgICAoQ2xhc3MpIHR5cGVzLmdldFZhbHVlKGkpLCBfcG9zaXRpb25hbC5nZXQoaSkpOworICAgICAgICB9IGVsc2UgaWYgKF9uYW1lZCAhPSBudWxsKSB7CisgICAgICAgICAgICBNYXAgdHlwZXMgPSBfcXVlcnkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9uYW1lZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVQYXJhbWV0ZXIobmFtZSwgKENsYXNzKSB0eXBlcy5nZXQobmFtZSksCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFyYW1ldGVyKFN0cmluZyBwYXJhbURlc2MsIENsYXNzIHR5cGUsIE9iamVjdCBwYXJhbSkgeworICAgICAgICAvLyBudWxsIHBhcmFtZXRlcnMgYXJlIGFsbG93ZWQsIHNvIGFyZSBub3QgdmFsaWRhdGVkCisgICAgICAgIGlmIChwYXJhbSA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBjaGVjayB0aGUgcGFyYW1ldGVyIGFnYWluc3QgdGhlIHdyYXBwZWQgdHlwZQorICAgICAgICBpZiAoIUZpbHRlcnMud3JhcCh0eXBlKS5pc0luc3RhbmNlKHBhcmFtKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXBhcmFtLXR5cGUiLAorICAgICAgICAgICAgICAgIHBhcmFtRGVzYywgcGFyYW0uZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHR5cGUuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0UmVzdWx0TGlzdCgpIHsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICBPYmplY3Qgb2IgPSBleGVjdXRlKCk7CisgICAgICAgIGlmIChvYiBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIExpc3QgcmV0ID0gKExpc3QpIG9iOworICAgICAgICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFJlc3VsdExpc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWxlZ2F0aW5nUmVzdWx0TGlzdCgoUmVzdWx0TGlzdCkgcmV0LAorICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuZ2V0Um9sbGJhY2tUcmFuc2xhdG9yKF9lbSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHF1ZXJ5IHRoYXQgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRTaW5nbGVSZXN1bHQoKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgLy8gdGVtcG9yYXJpbHkgc2V0IHF1ZXJ5IHRvIHVuaXF1ZSBzbyB0aGF0IGEgc2luZ2xlIHJlc3VsdCBpcyB2YWxpZGF0ZWQKKyAgICAgICAgLy8gYW5kIHJldHVybmVkOyB1bnNldCBhZ2FpbiBpbiBjYXNlIHRoZSB1c2VyIGV4ZWN1dGVzIHF1ZXJ5IGFnYWluCisgICAgICAgIC8vIHZpYSBnZXRSZXN1bHRMaXN0CisgICAgICAgIF9xdWVyeS5zZXRVbmlxdWUodHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX3F1ZXJ5LnNldFVuaXF1ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgaWYgKF9xdWVyeS5nZXRPcGVyYXRpb24oKSA9PSBPUF9ERUxFVEUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB3aGljaCB0eXBlcyBvZiBwYXJhbWV0ZXJzIHdlIGFyZSB1c2luZywgaWYgYW55CisgICAgICAgICAgICBpZiAoX3Bvc2l0aW9uYWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNJbnQoX3F1ZXJ5LmRlbGV0ZUFsbChfcG9zaXRpb25hbC50b0FycmF5KCkpKTsKKyAgICAgICAgICAgIGlmIChfbmFtZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNJbnQoX3F1ZXJ5LmRlbGV0ZUFsbChfbmFtZWQpKTsKKyAgICAgICAgICAgIHJldHVybiBhc0ludChfcXVlcnkuZGVsZXRlQWxsKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChfcXVlcnkuZ2V0T3BlcmF0aW9uKCkgPT0gT1BfVVBEQVRFKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgd2hpY2ggdHlwZXMgb2YgcGFyYW1ldGVycyB3ZSBhcmUgdXNpbmcsIGlmIGFueQorICAgICAgICAgICAgaWYgKF9wb3NpdGlvbmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFzSW50KF9xdWVyeS51cGRhdGVBbGwoX3Bvc2l0aW9uYWwudG9BcnJheSgpKSk7CisgICAgICAgICAgICBpZiAoX25hbWVkICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFzSW50KF9xdWVyeS51cGRhdGVBbGwoX25hbWVkKSk7CisgICAgICAgICAgICByZXR1cm4gYXNJbnQoX3F1ZXJ5LnVwZGF0ZUFsbCgpKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0KCJub3QtdXBkYXRlLWRlbGV0ZS1xdWVyeSIsCisgICAgICAgICAgICBfcXVlcnkuZ2V0UXVlcnlTdHJpbmcoKSksIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYXN0IHRoZSBzcGVjaWZpZWQgbG9uZyBkb3duIHRvIGFuIGludCwgZmlyc3QgY2hlY2tpbmcgZm9yIG92ZXJmbG93LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBhc0ludChsb25nIGwpIHsKKyAgICAgICAgaWYgKGwgPiBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgaWYgKGwgPCBJbnRlZ2VyLk1JTl9WQUxVRSkgLy8gdW5saWtlbHksIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIGNoZWNrCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgICAgIHJldHVybiAoaW50KSBsOworICAgIH0KKworICAgIHB1YmxpYyBGbHVzaE1vZGVUeXBlIGdldEZsdXNoTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXJJbXBsLmZyb21GbHVzaEJlZm9yZVF1ZXJpZXMoX3F1ZXJ5LgorICAgICAgICAgICAgZ2V0RmV0Y2hDb25maWd1cmF0aW9uKCkuZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0Rmx1c2hNb2RlKEZsdXNoTW9kZVR5cGUgZmx1c2hNb2RlKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgX3F1ZXJ5LmdldEZldGNoQ29uZmlndXJhdGlvbigpLnNldEZsdXNoQmVmb3JlUXVlcmllcworICAgICAgICAgICAgKEVudGl0eU1hbmFnZXJJbXBsLnRvRmx1c2hCZWZvcmVRdWVyaWVzKGZsdXNoTW9kZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldEhpbnQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8ICFrZXkuc3RhcnRzV2l0aCgib3BlbmpwYS4iKSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBTdHJpbmcgayA9IGtleS5zdWJzdHJpbmcoIm9wZW5qcGEuIi5sZW5ndGgoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgiU3ViY2xhc3NlcyIuZXF1YWxzKGspKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgc2V0U3ViY2xhc3NlcygoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJGaWx0ZXJMaXN0ZW5lciIuZXF1YWxzKGspKQorICAgICAgICAgICAgICAgIGFkZEZpbHRlckxpc3RlbmVyKEZpbHRlcnMuaGludFRvRmlsdGVyTGlzdGVuZXIodmFsdWUsCisgICAgICAgICAgICAgICAgICAgIF9xdWVyeS5nZXRCcm9rZXIoKS5nZXRDbGFzc0xvYWRlcigpKSk7CisgICAgICAgICAgICBlbHNlIGlmICgiRmlsdGVyTGlzdGVuZXJzIi5lcXVhbHMoaykpIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJMaXN0ZW5lcltdIGFyciA9IEZpbHRlcnMuaGludFRvRmlsdGVyTGlzdGVuZXJzKHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBfcXVlcnkuZ2V0QnJva2VyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGFkZEZpbHRlckxpc3RlbmVyKGFycltpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJBZ2dyZWdhdGVMaXN0ZW5lciIuZXF1YWxzKGspKQorICAgICAgICAgICAgICAgIGFkZEFnZ3JlZ2F0ZUxpc3RlbmVyKEZpbHRlcnMuaGludFRvQWdncmVnYXRlTGlzdGVuZXIodmFsdWUsCisgICAgICAgICAgICAgICAgICAgIF9xdWVyeS5nZXRCcm9rZXIoKS5nZXRDbGFzc0xvYWRlcigpKSk7CisgICAgICAgICAgICBlbHNlIGlmICgiRmlsdGVyTGlzdGVuZXJzIi5lcXVhbHMoaykpIHsKKyAgICAgICAgICAgICAgICBBZ2dyZWdhdGVMaXN0ZW5lcltdIGFyciA9IEZpbHRlcnMuaGludFRvQWdncmVnYXRlTGlzdGVuZXJzCisgICAgICAgICAgICAgICAgICAgICh2YWx1ZSwgX3F1ZXJ5LmdldEJyb2tlcigpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBhZGRBZ2dyZWdhdGVMaXN0ZW5lcihhcnJbaV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChrLnN0YXJ0c1dpdGgoIkZldGNoUGxhbi4iKSkgeworICAgICAgICAgICAgICAgIGsgPSBrLnN1YnN0cmluZygiRmV0Y2hQbGFuLiIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGhpbnRUb1NldHRlcihnZXRGZXRjaFBsYW4oKSwgaywgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChrLnN0YXJ0c1dpdGgoImhpbnQuIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoImhpbnQuT3B0aW1pemVSZXN1bHRDb3VudCIuZXF1YWxzKGspKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBJbnRlZ2VyKChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYWQtcXVlcnktaGludC12YWx1ZSIsIGtleSwgdmFsdWUpLCBudWxsLCBudWxsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9xdWVyeS5nZXRGZXRjaENvbmZpZ3VyYXRpb24oKS5zZXRIaW50KGtleSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihfbG9jLmdldCgiYmFkLXF1ZXJ5LWhpbnQiLCBrZXkpLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IFBlcnNpc3RlbmNlRXhjZXB0aW9ucy50b1BlcnNpc3RlbmNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhpbnRUb1NldHRlcihGZXRjaFBsYW4gZmV0Y2hQbGFuLCBTdHJpbmcgaywgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChmZXRjaFBsYW4gPT0gbnVsbCB8fCBrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTWV0aG9kIHNldHRlciA9IFJlZmxlY3Rpb24uZmluZFNldHRlcihmZXRjaFBsYW4uZ2V0Q2xhc3MoKSwgaywgdHJ1ZSk7CisgICAgICAgIENsYXNzIHBhcmFtVHlwZSA9IHNldHRlci5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdOworICAgICAgICBpZiAoRW51bS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtVHlwZSkgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICB2YWx1ZSA9IEVudW0udmFsdWVPZihwYXJhbVR5cGUsIChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgCisgICAgICAgIEZpbHRlcnMuaGludFRvU2V0dGVyKGZldGNoUGxhbiwgaywgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0UGFyYW1ldGVyKGludCBwb3NpdGlvbiwgQ2FsZW5kYXIgdmFsdWUsCisgICAgICAgIFRlbXBvcmFsVHlwZSB0KSB7CisgICAgICAgIHJldHVybiBzZXRQYXJhbWV0ZXIocG9zaXRpb24sIChPYmplY3QpIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihpbnQgcG9zaXRpb24sIERhdGUgdmFsdWUsCisgICAgICAgIFRlbXBvcmFsVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBzZXRQYXJhbWV0ZXIocG9zaXRpb24sIChPYmplY3QpIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihpbnQgcG9zaXRpb24sIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBfcXVlcnkuYXNzZXJ0T3BlbigpOworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIF9xdWVyeS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBub3QgYWxsb3dlZCB0byBtaXggcG9zaXRpb25hbCBhbmQgbmFtZWQgcGFyYW1ldGVycyAoRURSMiAzLjYuNCkKKyAgICAgICAgICAgIGlmIChfbmFtZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgibm8tcG9zLW5hbWVkLXBhcmFtcy1taXgiLCBfcXVlcnkuZ2V0UXVlcnlTdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlKTsKKworICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN0YXRlRXhjZXB0aW9uKF9sb2MuZ2V0CisgICAgICAgICAgICAgICAgICAgICgiaWxsZWdhbC1pbmRleCIsIHBvc2l0aW9uKSwgbnVsbCwgbnVsbCwgZmFsc2UpOworCisgICAgICAgICAgICBpZiAoX3Bvc2l0aW9uYWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfcG9zaXRpb25hbCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGlzIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgc2l6ZQorICAgICAgICAgICAgd2hpbGUgKF9wb3NpdGlvbmFsLnNpemUoKSA8IHBvc2l0aW9uKQorICAgICAgICAgICAgICAgIF9wb3NpdGlvbmFsLmFkZChudWxsKTsKKworICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGFkZCBpdCB0byBwb3NpdGlvbiAtIDEsIHNpbmNlIHNldFBvc2l0aW9uCisgICAgICAgICAgICAvLyBzdGFydHMgYXQgMSwgd2hpbGUgTGlzdCBzdGFydHMgYXQgMAorICAgICAgICAgICAgX3Bvc2l0aW9uYWwuc2V0KHBvc2l0aW9uIC0gMSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfcXVlcnkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgQ2FsZW5kYXIgdmFsdWUsCisgICAgICAgIFRlbXBvcmFsVHlwZSB0KSB7CisgICAgICAgIHJldHVybiBzZXRQYXJhbWV0ZXIobmFtZSwgKE9iamVjdCkgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBEYXRlIHZhbHVlLAorICAgICAgICBUZW1wb3JhbFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gc2V0UGFyYW1ldGVyKG5hbWUsIChPYmplY3QpIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIF9xdWVyeS5hc3NlcnRPcGVuKCk7CisgICAgICAgIF9lbS5hc3NlcnROb3RDbG9zZUludm9rZWQoKTsKKyAgICAgICAgX3F1ZXJ5LmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIG5vdCBhbGxvd2VkIHRvIG1peCBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIChFRFIyIDMuNi40KQorICAgICAgICAgICAgaWYgKF9wb3NpdGlvbmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdGF0ZUV4Y2VwdGlvbihfbG9jLmdldAorICAgICAgICAgICAgICAgICAgICAoIm5vLXBvcy1uYW1lZC1wYXJhbXMtbWl4IiwgX3F1ZXJ5LmdldFF1ZXJ5U3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGlmIChfbmFtZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfbmFtZWQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgX25hbWVkLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9xdWVyeS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Bvc2l0aW9uYWxQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gX3Bvc2l0aW9uYWwgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnMoKSB7CisgICAgICAgIF9xdWVyeS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKF9wb3NpdGlvbmFsID09IG51bGwpID8gRU1QVFlfQVJSQVkgOiBfcG9zaXRpb25hbC50b0FycmF5KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBfcXVlcnkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT3BlbkpQQVF1ZXJ5IHNldFBhcmFtZXRlcnMoT2JqZWN0Li4uIHBhcmFtcykgeworICAgICAgICBfcXVlcnkuYXNzZXJ0T3BlbigpOworICAgICAgICBfZW0uYXNzZXJ0Tm90Q2xvc2VJbnZva2VkKCk7CisgICAgICAgIF9xdWVyeS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfcG9zaXRpb25hbCA9IG51bGw7CisgICAgICAgICAgICBfbmFtZWQgPSBudWxsOworICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoaSArIDEsIHBhcmFtc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9xdWVyeS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0TmFtZWRQYXJhbWV0ZXJzKCkgeworICAgICAgICBfcXVlcnkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChfbmFtZWQgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9NQVAKKyAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChfbmFtZWQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgX3F1ZXJ5LnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9wZW5KUEFRdWVyeSBzZXRQYXJhbWV0ZXJzKE1hcCBwYXJhbXMpIHsKKyAgICAgICAgX3F1ZXJ5LmFzc2VydE9wZW4oKTsKKyAgICAgICAgX2VtLmFzc2VydE5vdENsb3NlSW52b2tlZCgpOworICAgICAgICBfcXVlcnkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgX3Bvc2l0aW9uYWwgPSBudWxsOworICAgICAgICAgICAgX25hbWVkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBlIDogKFNldDxNYXAuRW50cnk+KSBwYXJhbXMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKChTdHJpbmcpIGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9xdWVyeS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPcGVuSlBBUXVlcnkgY2xvc2VBbGwoKSB7CisgICAgICAgIF9xdWVyeS5jbG9zZUFsbCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGF0YVN0b3JlQWN0aW9ucyhNYXAgcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkuZ2V0RGF0YVN0b3JlQWN0aW9ucyhwYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBfcXVlcnkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUXVlcnlJbXBsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9xdWVyeS5lcXVhbHMoKChRdWVyeUltcGwpIG90aGVyKS5fcXVlcnkpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9RdWVyeVJlc3VsdENhY2hlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUXVlcnlSZXN1bHRDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTVjMDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUXVlcnlSZXN1bHRDYWNoZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUXVlcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLlF1ZXJ5Q2FjaGU7CisKKy8qKgorICogUXVlcnkgcmVzdWx0IGNhY2hlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjEKKyAqIEBwdWJsaXNoZWQKKyAqLworcHVibGljIGludGVyZmFjZSBRdWVyeVJlc3VsdENhY2hlIHsKKworICAgIC8qKgorICAgICAqIERlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBRdWVyeUNhY2hlIGdldERlbGVnYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBQaW4gdGhlIGdpdmVuIHF1ZXJ5J3MgcmVzdWx0IHRvIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwaW4oUXVlcnkgcSk7CisKKyAgICAvKioKKyAgICAgKiBVbnBpbiBhIHByZXZpb3VzbHktcGlubmVkIHF1ZXJ5IHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnBpbihRdWVyeSBxKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0IGEgcXVlcnkgcmVzdWx0IGZyb20gdGhlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0KFF1ZXJ5IHEpOworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdCBhbGwgcmVzdWx0IGZvciBxdWVyaWVzIGludm9sdmluZyB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9RdWVyeVJlc3VsdENhY2hlSW1wbC5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1F1ZXJ5UmVzdWx0Q2FjaGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4YWI1MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9RdWVyeVJlc3VsdENhY2hlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGVsZWdhdGluZ1F1ZXJ5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5RdWVyeUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuUXVlcnlLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5UeXBlc0NoYW5nZWRFdmVudDsKKworLyoqCisgKiBJbXBsZW1lbnRzIFF1ZXJ5IHJlc3VsdCBjYWNoZSB2aWEgZGVsZWdhdGlvbiB0byBRdWVyeUNhY2hlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjEKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UmVzdWx0Q2FjaGVJbXBsCisJaW1wbGVtZW50cyBRdWVyeVJlc3VsdENhY2hlIHsKKworICAgIHByaXZhdGUgZmluYWwgRGVsZWdhdGluZ1F1ZXJ5Q2FjaGUgX2NhY2hlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVlcnlSZXN1bHRDYWNoZUltcGwoUXVlcnlDYWNoZSBjYWNoZSkgeworICAgICAgICBfY2FjaGUgPSBuZXcgRGVsZWdhdGluZ1F1ZXJ5Q2FjaGUoY2FjaGUsCisgICAgICAgICAgICBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuVFJBTlNMQVRPUik7CisgICAgfQorCisgICAgcHVibGljIFF1ZXJ5Q2FjaGUgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBfY2FjaGUuZ2V0RGVsZWdhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwaW4oUXVlcnkgcSkgeworICAgICAgICBpZiAoX2NhY2hlLmdldERlbGVnYXRlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9jYWNoZS5waW4odG9RdWVyeUtleShxKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5waW4oUXVlcnkgcSkgeworICAgICAgICBpZiAoX2NhY2hlLmdldERlbGVnYXRlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9jYWNoZS51bnBpbih0b1F1ZXJ5S2V5KHEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdChRdWVyeSBxKSB7CisgICAgICAgIGlmIChfY2FjaGUuZ2V0RGVsZWdhdGUoKSAhPSBudWxsKQorICAgICAgICAgICAgX2NhY2hlLnJlbW92ZSh0b1F1ZXJ5S2V5KHEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdEFsbCgpIHsKKyAgICAgICAgX2NhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzKSB7CisgICAgICAgIF9jYWNoZS5vblR5cGVzQ2hhbmdlZChuZXcgVHlwZXNDaGFuZ2VkRXZlbnQodGhpcywKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihjbHMpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcXVlcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBRdWVyeUtleSB0b1F1ZXJ5S2V5KFF1ZXJ5IHEpIHsKKyAgICAgICAgUXVlcnlJbXBsIGltcGwgPSAoUXVlcnlJbXBsKSBxOworICAgICAgICBpZiAoaW1wbC5oYXNQb3NpdGlvbmFsUGFyYW1ldGVycygpKQorICAgICAgICAgICAgcmV0dXJuIFF1ZXJ5S2V5Lm5ld0luc3RhbmNlKGltcGwuZ2V0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICBpbXBsLmdldFBvc2l0aW9uYWxQYXJhbWV0ZXJzKCkpOworICAgICAgICByZXR1cm4gUXVlcnlLZXkubmV3SW5zdGFuY2UoaW1wbC5nZXREZWxlZ2F0ZSgpLAorICAgICAgICAgICAgaW1wbC5nZXROYW1lZFBhcmFtZXRlcnMoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBRdWVyeVJlc3VsdENhY2hlSW1wbCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfY2FjaGUuZXF1YWxzKCgoUXVlcnlSZXN1bHRDYWNoZUltcGwpIG90aGVyKS5fY2FjaGUpOworCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9SZWFkT25seS5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1JlYWRPbmx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYjlhYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9SZWFkT25seS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogTWFya3MgYSBmaWVsZCByZWFkLW9ubHkuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitAVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCB9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgUmVhZE9ubHkgeworCisgICAgVXBkYXRlQWN0aW9uIHZhbHVlKCkgZGVmYXVsdCBVcGRhdGVBY3Rpb24uUkVTVFJJQ1Q7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUm9sbGJhY2tFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Sb2xsYmFja0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWUxMzgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUm9sbGJhY2tFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuRXhjZXB0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25zOworCisvKioKKyAqIFJvbGxiYWNrIG9jY3VycmVkIG9uIGF0dGVtcHQgdG8gY29tbWl0LgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqIEBub2phdmFkb2MKKyAqLworcHVibGljIGNsYXNzIFJvbGxiYWNrRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBqYXZheC5wZXJzaXN0ZW5jZS5Sb2xsYmFja0V4Y2VwdGlvbgorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBFeGNlcHRpb25JbmZvIHsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IFRocm93YWJsZVtdIF9uZXN0ZWQ7CisKKyAgICBwdWJsaWMgUm9sbGJhY2tFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgc3VwZXIoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBfbmVzdGVkID0gbmV3IFRocm93YWJsZVtdeyBlIH07CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gU1RPUkU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgeworICAgICAgICByZXR1cm4gR0VORVJBTDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VFeGNlcHRpb25zLmdldENhdXNlKF9uZXN0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGVbXSBnZXROZXN0ZWRUaHJvd2FibGVzKCkgeworICAgICAgICByZXR1cm4gX25lc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbnMudG9TdHJpbmcodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgeworICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlTmVzdGVkVGhyb3dhYmxlcyhfbmVzdGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIF9uZXN0ZWQgPSAoVGhyb3dhYmxlW10pIGluLnJlYWRPYmplY3QoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9TdG9yZUNhY2hlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvU3RvcmVDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNWU2YjgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvU3RvcmVDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5EYXRhQ2FjaGU7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgTDIgY2FjaGUgb3ZlciB0aGUgZGF0YSBzdG9yZS4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4xCisgKiBAcHVibGlzaGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RvcmVDYWNoZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0RFRkFVTFQgPSBEYXRhQ2FjaGUuTkFNRV9ERUZBVUxUOworCisgICAgLyoqCisgICAgICogRGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIERhdGFDYWNoZSBnZXREZWxlZ2F0ZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgY2FjaGUgY29udGFpbnMgZGF0YSBmb3IgdGhlIGdpdmVuIG9pZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDbGFzcyBjbHMsIE9iamVjdCBvaWQpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgY2FjaGUgY29udGFpbnMgZGF0YSBmb3IgdGhlIGdpdmVuIG9pZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ2xhc3MgY2xzLCBPYmplY3QuLi4gb2lkcyk7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBjb250YWlucyBkYXRhIGZvciB0aGUgZ2l2ZW4gb2lkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDbGFzcyBjbHMsIENvbGxlY3Rpb24gb2lkcyk7CisKKyAgICAvKioKKyAgICAgKiBQaW4gdGhlIGRhdGEgZm9yIHRoZSBnaXZlbiBvaWQgdG8gdGhlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBpbihDbGFzcyBjbHMsIE9iamVjdCBvaWQpOworCisgICAgLyoqCisgICAgICogUGluIHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gb2lkcyB0byB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGluQWxsKENsYXNzIGNscywgT2JqZWN0Li4uIG9pZHMpOworCisgICAgLyoqCisgICAgICogUGluIHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gb2lkcyB0byB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGluQWxsKENsYXNzIGNscywgQ29sbGVjdGlvbiBvaWRzKTsKKworICAgIC8qKgorICAgICAqIFVucGluIHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gb2lkIGZyb20gdGhlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucGluKENsYXNzIGNscywgT2JqZWN0IG9pZCk7CisKKyAgICAvKioKKyAgICAgKiBVbnBpbiB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIG9pZHMgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5waW5BbGwoQ2xhc3MgY2xzLCBPYmplY3QuLi4gb2lkcyk7CisKKyAgICAvKioKKyAgICAgKiBVbnBpbiB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIG9pZHMgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5waW5BbGwoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIG9pZHMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRhdGEgZm9yIHRoZSBnaXZlbiBvaWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3QoQ2xhc3MgY2xzLCBPYmplY3Qgb2lkKTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZGF0YSBmb3IgdGhlIGdpdmVuIG9pZHMgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzLCBPYmplY3QuLi4gb2lkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZGF0YSBmb3IgdGhlIGdpdmVuIG9pZHMgZnJvbSB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIG9pZHMpOworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNhY2hlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKCk7Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvU3RvcmVDYWNoZUltcGwuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9TdG9yZUNhY2hlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjVhOTIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvU3RvcmVDYWNoZUltcGwuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkRlbGVnYXRpbmdEYXRhQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CisKKy8qKgorICogSW1wbGVtZW50cyB0aGUgTDIgY2FjaGUgb3ZlciB0aGUgZGF0YSBzdG9yZSB2aWEgZGVsZWdhdGlvbiB0byBEYXRhQ2FjaGUuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMQorICogQG5vamF2YWRvYworICovCitwdWJsaWMgY2xhc3MgU3RvcmVDYWNoZUltcGwgCisJaW1wbGVtZW50cyBTdG9yZUNhY2hlIHsKKworICAgIHByaXZhdGUgZmluYWwgTWV0YURhdGFSZXBvc2l0b3J5IF9yZXBvczsKKyAgICBwcml2YXRlIGZpbmFsIERlbGVnYXRpbmdEYXRhQ2FjaGUgX2NhY2hlOworCisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3I7IHN1cHBseSBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcmVDYWNoZUltcGwoRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsIGVtZiwgRGF0YUNhY2hlIGNhY2hlKSB7CisgICAgICAgIF9yZXBvcyA9IGVtZi5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKyAgICAgICAgX2NhY2hlID0gbmV3IERlbGVnYXRpbmdEYXRhQ2FjaGUoY2FjaGUsCisgICAgICAgICAgICBQZXJzaXN0ZW5jZUV4Y2VwdGlvbnMuVFJBTlNMQVRPUik7CisgICAgfQorCisgICAgcHVibGljIERhdGFDYWNoZSBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jYWNoZS5nZXREZWxlZ2F0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENsYXNzIGNscywgT2JqZWN0IG9pZCkgeworICAgICAgICByZXR1cm4gX2NhY2hlLmdldERlbGVnYXRlKCkgIT0gbnVsbCAmJiBfY2FjaGUuY29udGFpbnMKKyAgICAgICAgICAgIChPcGVuSlBBUGVyc2lzdGVuY2UudG9PcGVuSlBBT2JqZWN0SWQoZ2V0TWV0YURhdGEoY2xzKSwgb2lkKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ2xhc3MgY2xzLCBPYmplY3QuLi4gb2lkcykgeworICAgICAgICByZXR1cm4gY29udGFpbnNBbGwoY2xzLCBBcnJheXMuYXNMaXN0KG9pZHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDbGFzcyBjbHMsIENvbGxlY3Rpb24gb2lkcykgeworICAgICAgICBpZiAoX2NhY2hlLmdldERlbGVnYXRlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvaWRzLmlzRW1wdHkoKTsKKworICAgICAgICBCaXRTZXQgc2V0ID0gX2NhY2hlLmNvbnRhaW5zQWxsKE9wZW5KUEFQZXJzaXN0ZW5jZS50b09wZW5KUEFPYmplY3RJZHMKKyAgICAgICAgICAgIChnZXRNZXRhRGF0YShjbHMpLCBvaWRzKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2lkcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIGlmICghc2V0LmdldChpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBpbihDbGFzcyBjbHMsIE9iamVjdCBvaWQpIHsKKyAgICAgICAgaWYgKF9jYWNoZS5nZXREZWxlZ2F0ZSgpICE9IG51bGwpCisgICAgICAgICAgICBfY2FjaGUucGluKE9wZW5KUEFQZXJzaXN0ZW5jZS50b09wZW5KUEFPYmplY3RJZChnZXRNZXRhRGF0YShjbHMpLCAKKyAgICAgICAgICAgICAgICBvaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwaW5BbGwoQ2xhc3MgY2xzLCBPYmplY3QuLi4gb2lkcykgeworICAgICAgICBwaW5BbGwoY2xzLCBBcnJheXMuYXNMaXN0KG9pZHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwaW5BbGwoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZS5nZXREZWxlZ2F0ZSgpICE9IG51bGwpCisgICAgICAgICAgICBfY2FjaGUucGluQWxsKE9wZW5KUEFQZXJzaXN0ZW5jZS50b09wZW5KUEFPYmplY3RJZHMKKyAgICAgICAgICAgICAgICAoZ2V0TWV0YURhdGEoY2xzKSwgb2lkcykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucGluKENsYXNzIGNscywgT2JqZWN0IG9pZCkgeworICAgICAgICBpZiAoX2NhY2hlLmdldERlbGVnYXRlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9jYWNoZS51bnBpbihPcGVuSlBBUGVyc2lzdGVuY2UudG9PcGVuSlBBT2JqZWN0SWQoZ2V0TWV0YURhdGEoY2xzKSwKKyAgICAgICAgICAgICAgICBvaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnBpbkFsbChDbGFzcyBjbHMsIE9iamVjdC4uLiBvaWRzKSB7CisgICAgICAgIHVucGluQWxsKGNscywgQXJyYXlzLmFzTGlzdChvaWRzKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5waW5BbGwoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZS5nZXREZWxlZ2F0ZSgpICE9IG51bGwpCisgICAgICAgICAgICBfY2FjaGUudW5waW5BbGwoT3BlbkpQQVBlcnNpc3RlbmNlLnRvT3BlbkpQQU9iamVjdElkcworICAgICAgICAgICAgICAgIChnZXRNZXRhRGF0YShjbHMpLCBvaWRzKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZpY3QoQ2xhc3MgY2xzLCBPYmplY3Qgb2lkKSB7CisgICAgICAgIGlmIChfY2FjaGUuZ2V0RGVsZWdhdGUoKSAhPSBudWxsKQorICAgICAgICAgICAgX2NhY2hlLnJlbW92ZShPcGVuSlBBUGVyc2lzdGVuY2UudG9PcGVuSlBBT2JqZWN0SWQoZ2V0TWV0YURhdGEoY2xzKSwKKyAgICAgICAgICAgICAgICBvaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmljdEFsbChDbGFzcyBjbHMsIE9iamVjdC4uLiBvaWRzKSB7CisgICAgICAgIGV2aWN0QWxsKGNscywgQXJyYXlzLmFzTGlzdChvaWRzKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIG9pZHMpIHsKKyAgICAgICAgaWYgKF9jYWNoZS5nZXREZWxlZ2F0ZSgpICE9IG51bGwpCisgICAgICAgICAgICBfY2FjaGUucmVtb3ZlQWxsKE9wZW5KUEFQZXJzaXN0ZW5jZS50b09wZW5KUEFPYmplY3RJZHMKKyAgICAgICAgICAgICAgICAoZ2V0TWV0YURhdGEoY2xzKSwgb2lkcykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKCkgeworICAgICAgICBfY2FjaGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBjbGFzcywgdGhyb3dpbmcgdGhlIHByb3BlciBleGNlcHRpb24KKyAgICAgKiBpZiBub3QgcGVyc2lzdGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoQ2xhc3MgY2xzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gX3JlcG9zLmdldE1ldGFEYXRhKGNscywgbnVsbCwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IFBlcnNpc3RlbmNlRXhjZXB0aW9ucy50b1BlcnNpc3RlbmNlRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBfY2FjaGUuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU3RvcmVDYWNoZUltcGwpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX2NhY2hlLmVxdWFscyAoKChTdG9yZUNhY2hlSW1wbCkgb3RoZXIpLl9jYWNoZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1RyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9UcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjN2NiZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9UcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Mb2NhbGl6ZXIuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLkV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVXNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc2FjdGlvbiByZXF1aXJlZC4KKyAqCisgKiBAYXV0aG9yIEFiZSBXaGl0ZQorICogQHNpbmNlIDAuNC4wCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBqYXZheC5wZXJzaXN0ZW5jZS5UcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCisgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIEV4Y2VwdGlvbkluZm8geworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBfZmF0YWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgX2ZhaWxlZCA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVGhyb3dhYmxlW10gX25lc3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbihNZXNzYWdlIG1zZywgVGhyb3dhYmxlW10gbmVzdGVkLAorICAgICAgICBPYmplY3QgZmFpbGVkLCBib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHRoaXMobXNnLmdldE1lc3NhZ2UoKSwgbmVzdGVkLCBmYWlsZWQsIGZhdGFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGVbXSBuZXN0ZWQsCisgICAgICAgIE9iamVjdCBmYWlsZWQsIGJvb2xlYW4gZmF0YWwpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgX25lc3RlZCA9IG5lc3RlZDsKKyAgICAgICAgX2ZhaWxlZCA9IGZhaWxlZDsKKyAgICAgICAgX2ZhdGFsID0gZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVVNFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBVc2VyRXhjZXB0aW9uLk5PX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWwoKSB7CisgICAgICAgIHJldHVybiBfZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlRXhjZXB0aW9ucy5nZXRDYXVzZShfbmVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlW10gZ2V0TmVzdGVkVGhyb3dhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIChfbmVzdGVkID09IG51bGwpID8gRXhjZXB0aW9ucy5FTVBUWV9USFJPV0FCTEVTIDogX25lc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZhaWxlZE9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9mYWlsZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbnMudG9TdHJpbmcodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgeworICAgICAgICBwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgRXhjZXB0aW9ucy5wcmludE5lc3RlZFRocm93YWJsZXModGhpcywgb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICBFeGNlcHRpb25zLnByaW50TmVzdGVkVGhyb3dhYmxlcyh0aGlzLCBvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVCb29sZWFuKF9mYXRhbCk7CisgICAgICAgIG91dC53cml0ZU9iamVjdChFeGNlcHRpb25zLnJlcGxhY2VGYWlsZWRPYmplY3QoX2ZhaWxlZCkpOworICAgICAgICBvdXQud3JpdGVPYmplY3QoRXhjZXB0aW9ucy5yZXBsYWNlTmVzdGVkVGhyb3dhYmxlcyhfbmVzdGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIF9mYXRhbCA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIF9mYWlsZWQgPSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIF9uZXN0ZWQgPSAoVGhyb3dhYmxlW10pIGluLnJlYWRPYmplY3QoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9UeXBlLmphdmEgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDM5NTUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSW5kaWNhdGVzIHRoZSBwZXJzaXN0ZW50IHR5cGUgb2YgYSBmaWVsZCwgaWYgZGlmZmVyZW50IHRoYW4gdGhlCisgKiBkZWNsYXJlZCB0eXBlLgorICoKKyAqIEBhdXRob3IgQWJlIFdoaXRlCisgKiBAc2luY2UgMC40LjAKKyAqLworQFRhcmdldCh7IE1FVEhPRCwgRklFTEQgfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFR5cGUgeworCisgICAgQ2xhc3MgdmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9VcGRhdGVBY3Rpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9VcGRhdGVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2NhNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1VwZGF0ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCisvKioKKyAqIEFjdGlvbiB0byB0YWtlIHdoZW4gYSBmaWVsZCdzIHZhbHVlIGlzIGNoYW5nZWQuCisgKgorICogQGF1dGhvciBBYmUgV2hpdGUKKyAqIEBzaW5jZSAwLjQuMAorICovCitwdWJsaWMgZW51bSBVcGRhdGVBY3Rpb24geworCisgICAgSUdOT1JFLAorICAgIFJFU1RSSUNUIH07CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlci5qYXZhIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1hNTFBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg2MjUxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1hNTFBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIuamF2YQpAQCAtMCwwICsxLDE2ODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7CitpbXBvcnQgc3RhdGljIGphdmF4LnBlcnNpc3RlbmNlLkNhc2NhZGVUeXBlLio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QZXJzaXN0ZW5jZUNhcGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkJlYW5MaWZlY3ljbGVDYWxsYmFja3M7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxpZmVjeWNsZUNhbGxiYWNrczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50Lk1ldGhvZExpZmVjeWNsZUNhbGxiYWNrczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlF1ZXJ5TGFuZ3VhZ2VzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuanBxbC5KUFFMUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Db25maWd1cmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLmxvZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLkNGTWV0YURhdGFQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkRlbGVnYXRpbmdNZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTGlmZWN5Y2xlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFEZWZhdWx0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhTW9kZXMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuUXVlcnlNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuVmFsdWVTdHJhdGVnaWVzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuTWV0YURhdGFUYWcuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RyYXRlZ3kuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JbXBsSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLlVuc3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIEN1c3RvbSBTQVggcGFyc2VyIHVzZWQgYnkgdGhlIHN5c3RlbSB0byBxdWlja2x5IHBhcnNlIHBlcnNpc3RlbmNlIGkKKyAqIG1ldGFkYXRhIGZpbGVzLgorICoKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyCisgICAgZXh0ZW5kcyBDRk1ldGFEYXRhUGFyc2VyCisgICAgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZU1ldGFEYXRhRmFjdG9yeS5QYXJzZXIgeworCisgICAgLy8gcGFyc2UgY29uc3RhbnRzCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9QS0cgPSAicGFja2FnZSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BQ0NFU1MgPSAiYWNjZXNzIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FUVFJTID0gImF0dHJpYnV0ZXMiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTElTVEVORVIgPSAiZW50aXR5LWxpc3RlbmVyIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0NBU0NBREUgPSAiY2FzY2FkZSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DQVNDQURFX0FMTCA9ICJjYXNjYWRlLWFsbCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DQVNDQURFX1BFUiA9ICJjYXNjYWRlLXBlcnNpc3QiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ0FTQ0FERV9NRVIgPSAiY2FzY2FkZS1tZXJnZSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DQVNDQURFX1JFTSA9ICJjYXNjYWRlLXJlbW92ZSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DQVNDQURFX1JFRiA9ICJjYXNjYWRlLXJlZnJlc2giOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUFVfTUVUQSA9ICJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BVX0RFRiA9ICJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1hNTF9NQVBfTUVUQV9DT01QTEVURSA9CisgICAgICAgICJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IF9lbGVtcyA9CisgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgX2VsZW1zLnB1dChFTEVNX1BLRywgRUxFTV9QS0cpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fQUNDRVNTLCBFTEVNX0FDQ0VTUyk7CisgICAgICAgIF9lbGVtcy5wdXQoRUxFTV9BVFRSUywgRUxFTV9BVFRSUyk7CisgICAgICAgIF9lbGVtcy5wdXQoRUxFTV9MSVNURU5FUiwgRUxFTV9MSVNURU5FUik7CisgICAgICAgIF9lbGVtcy5wdXQoRUxFTV9DQVNDQURFLCBFTEVNX0NBU0NBREUpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fQ0FTQ0FERV9BTEwsIEVMRU1fQ0FTQ0FERV9BTEwpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fQ0FTQ0FERV9QRVIsIEVMRU1fQ0FTQ0FERV9QRVIpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fQ0FTQ0FERV9SRU0sIEVMRU1fQ0FTQ0FERV9SRU0pOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fQ0FTQ0FERV9NRVIsIEVMRU1fQ0FTQ0FERV9NRVIpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fQ0FTQ0FERV9SRUYsIEVMRU1fQ0FTQ0FERV9SRUYpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fUFVfTUVUQSwgRUxFTV9QVV9NRVRBKTsKKyAgICAgICAgX2VsZW1zLnB1dChFTEVNX1BVX0RFRiwgRUxFTV9QVV9ERUYpOworICAgICAgICBfZWxlbXMucHV0KEVMRU1fWE1MX01BUF9NRVRBX0NPTVBMRVRFLCBFTEVNX1hNTF9NQVBfTUVUQV9DT01QTEVURSk7CisKKyAgICAgICAgX2VsZW1zLnB1dCgiZW50aXR5LWxpc3RlbmVycyIsIEVOVElUWV9MSVNURU5FUlMpOworICAgICAgICBfZWxlbXMucHV0KCJwcmUtcGVyc2lzdCIsIFBSRV9QRVJTSVNUKTsKKyAgICAgICAgX2VsZW1zLnB1dCgicG9zdC1wZXJzaXN0IiwgUE9TVF9QRVJTSVNUKTsKKyAgICAgICAgX2VsZW1zLnB1dCgicHJlLXJlbW92ZSIsIFBSRV9SRU1PVkUpOworICAgICAgICBfZWxlbXMucHV0KCJwb3N0LXJlbW92ZSIsIFBPU1RfUkVNT1ZFKTsKKyAgICAgICAgX2VsZW1zLnB1dCgicHJlLXVwZGF0ZSIsIFBSRV9VUERBVEUpOworICAgICAgICBfZWxlbXMucHV0KCJwb3N0LXVwZGF0ZSIsIFBPU1RfVVBEQVRFKTsKKyAgICAgICAgX2VsZW1zLnB1dCgicG9zdC1sb2FkIiwgUE9TVF9MT0FEKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIsIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMpOworICAgICAgICBfZWxlbXMucHV0KCJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiwKKyAgICAgICAgICAgIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMpOworCisgICAgICAgIF9lbGVtcy5wdXQoIm5hbWVkLXF1ZXJ5IiwgUVVFUlkpOworICAgICAgICBfZWxlbXMucHV0KCJuYW1lZC1uYXRpdmUtcXVlcnkiLCBOQVRJVkVfUVVFUlkpOworICAgICAgICBfZWxlbXMucHV0KCJxdWVyeS1oaW50IiwgUVVFUllfSElOVCk7CisgICAgICAgIF9lbGVtcy5wdXQoInF1ZXJ5IiwgUVVFUllfU1RSSU5HKTsKKworICAgICAgICBfZWxlbXMucHV0KCJmbHVzaC1tb2RlIiwgRkxVU0hfTU9ERSk7CisgICAgICAgIF9lbGVtcy5wdXQoInNlcXVlbmNlLWdlbmVyYXRvciIsIFNFUV9HRU5FUkFUT1IpOworCisgICAgICAgIF9lbGVtcy5wdXQoImlkIiwgSUQpOworICAgICAgICBfZWxlbXMucHV0KCJpZC1jbGFzcyIsIElEX0NMQVNTKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiZW1iZWRkZWQtaWQiLCBFTUJFRERFRF9JRCk7CisgICAgICAgIF9lbGVtcy5wdXQoInZlcnNpb24iLCBWRVJTSU9OKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiZ2VuZXJhdGVkLXZhbHVlIiwgR0VORVJBVEVEX1ZBTFVFKTsKKyAgICAgICAgX2VsZW1zLnB1dCgibWFwLWtleSIsIE1BUF9LRVkpOworICAgICAgICBfZWxlbXMucHV0KCJvcmRlci1ieSIsIE9SREVSX0JZKTsKKyAgICAgICAgX2VsZW1zLnB1dCgibG9iIiwgTE9CKTsKKworICAgICAgICBfZWxlbXMucHV0KCJiYXNpYyIsIEJBU0lDKTsKKyAgICAgICAgX2VsZW1zLnB1dCgibWFueS10by1vbmUiLCBNQU5ZX09ORSk7CisgICAgICAgIF9lbGVtcy5wdXQoIm9uZS10by1vbmUiLCBPTkVfT05FKTsKKyAgICAgICAgX2VsZW1zLnB1dCgiZW1iZWRkZWQiLCBFTUJFRERFRCk7CisgICAgICAgIF9lbGVtcy5wdXQoIm9uZS10by1tYW55IiwgT05FX01BTlkpOworICAgICAgICBfZWxlbXMucHV0KCJtYW55LXRvLW1hbnkiLCBNQU5ZX01BTlkpOworICAgICAgICBfZWxlbXMucHV0KCJ0cmFuc2llbnQiLCBUUkFOU0lFTlQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsaXplciBfbG9jID0gTG9jYWxpemVyLmZvclBhY2thZ2UKKyAgICAgICAgKFhNTFBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPcGVuSlBBQ29uZmlndXJhdGlvbiBfY29uZjsKKyAgICBwcml2YXRlIE1ldGFEYXRhUmVwb3NpdG9yeSBfcmVwb3MgPSBudWxsOworICAgIHByaXZhdGUgQW5ub3RhdGlvblBlcnNpc3RlbmNlTWV0YURhdGFQYXJzZXIgX3BhcnNlciA9IG51bGw7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfZW52TG9hZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfbW9kZSA9IE1PREVfTk9ORTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX292ZXJyaWRlID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YWNrIF9lbGVtZW50cyA9IG5ldyBTdGFjaygpOworICAgIHByaXZhdGUgZmluYWwgU3RhY2sgX3BhcmVudHMgPSBuZXcgU3RhY2soKTsKKworICAgIHByaXZhdGUgQ2xhc3MgX2NscyA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgX2ZpZWxkUG9zID0gMDsKKyAgICBwcml2YXRlIGludCBfY2xzUG9zID0gMDsKKyAgICBwcml2YXRlIGludCBfYWNjZXNzID0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfVU5LTk9XTjsKKyAgICBwcml2YXRlIFBlcnNpc3RlbmNlU3RyYXRlZ3kgX3N0cmF0ZWd5ID0gbnVsbDsKKyAgICBwcml2YXRlIFNldDxDYXNjYWRlVHlwZT4gX2Nhc2NhZGVzID0gbnVsbDsKKyAgICBwcml2YXRlIFNldDxDYXNjYWRlVHlwZT4gX3BrZ0Nhc2NhZGVzID0gbnVsbDsKKworICAgIHByaXZhdGUgQ2xhc3MgX2xpc3RlbmVyID0gbnVsbDsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248TGlmZWN5Y2xlQ2FsbGJhY2tzPltdIF9jYWxsYmFja3MgPSBudWxsOworICAgIHByaXZhdGUgaW50W10gX2hpZ2hzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlcihPcGVuSlBBQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gY29uZjsKKyAgICAgICAgc2V0VmFsaWRhdGluZyh0cnVlKTsKKyAgICAgICAgc2V0TG9nKGNvbmYuZ2V0TG9nKE9wZW5KUEFDb25maWd1cmF0aW9uLkxPR19NRVRBREFUQSkpOworICAgICAgICBzZXRQYXJzZUNvbW1lbnRzKHRydWUpOworICAgICAgICBzZXRNb2RlKE1PREVfTUVUQSB8IE1PREVfTUFQUElORyB8IE1PREVfUVVFUlkpOworICAgICAgICBzZXRQYXJzZVRleHQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBzdXBwbGllZCBvbiBjb25zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHVibGljIE9wZW5KUEFDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfY29uZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW5ub3RhdGlvbiBwYXJzZXIuIFdoZW4gY2xhc3MgaXMgZGlzY292ZXJlZCBpbiBhbiBYTUwgZmlsZSwKKyAgICAgKiB3ZSBmaXJzdCBwYXJzZSBhbnkgYW5ub3RhdGlvbnMgcHJlc2VudCwgdGhlbiBvdmVycmlkZSB3aXRoIHRoZSBYTUwuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIGdldEFubm90YXRpb25QYXJzZXIoKSB7CisgICAgICAgIHJldHVybiBfcGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbm5vdGF0aW9uIHBhcnNlci4gV2hlbiBjbGFzcyBpcyBkaXNjb3ZlcmVkIGluIGFuIFhNTCBmaWxlLAorICAgICAqIHdlIGZpcnN0IHBhcnNlIGFueSBhbm5vdGF0aW9ucyBwcmVzZW50LCB0aGVuIG92ZXJyaWRlIHdpdGggdGhlIFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUGFyc2VyKEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyIHBhcnNlcil7CisgICAgICAgIF9wYXJzZXIgPSBwYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYXJzZXIuIElmIG5vbmUgaGFzIGJlZW4gc2V0LCBjcmVhdGVzCisgICAgICogYSBuZXcgcmVwb3NpdG9yeSBhbmQgc2V0cyBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YURhdGFSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CisgICAgICAgIGlmIChfcmVwb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zID0gX2NvbmYubmV3TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIE1ldGFEYXRhRmFjdG9yeSBtZGYgPSByZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKTsKKyAgICAgICAgICAgIGlmIChtZGYgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nTWV0YURhdGFGYWN0b3J5KQorICAgICAgICAgICAgICAgIG1kZiA9ICgoRGVsZWdhdGluZ01ldGFEYXRhRmFjdG9yeSkgbWRmKS5nZXRJbm5lcm1vc3REZWxlZ2F0ZSgpOworICAgICAgICAgICAgaWYgKG1kZiBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5KQorICAgICAgICAgICAgICAgICgoUGVyc2lzdGVuY2VNZXRhRGF0YUZhY3RvcnkpIG1kZikuc2V0WE1MUGFyc2VyKHRoaXMpOworICAgICAgICAgICAgX3JlcG9zID0gcmVwb3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1ldGFkYXRhIHJlcG9zaXRvcnkgZm9yIHRoaXMgcGFyc2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnkoTWV0YURhdGFSZXBvc2l0b3J5IHJlcG9zKSB7CisgICAgICAgIF9yZXBvcyA9IHJlcG9zOworICAgICAgICBpZiAocmVwb3MgIT0gbnVsbAorICAgICAgICAgICAgJiYgKHJlcG9zLmdldFZhbGlkYXRlKCkgJiByZXBvcy5WQUxJREFURV9SVU5USU1FKSAhPSAwKQorICAgICAgICAgICAgc2V0UGFyc2VDb21tZW50cyhmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbnZpcm9ubWVudGFsIGNsYXNzIGxvYWRlciB0byBwYXNzIG9uIHRvIHBhcnNlZAorICAgICAqIG1ldGFkYXRhIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0RW52Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBfZW52TG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW52aXJvbm1lbnRhbCBjbGFzcyBsb2FkZXIgdG8gcGFzcyBvbiB0byBwYXJzZWQKKyAgICAgKiBtZXRhZGF0YSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW52Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIF9lbnZMb2FkZXIgPSBsb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbGxvdyBsYXRlciBwYXJzZXMgb2YgbWFwcGluZyBpbmZvcm1hdGlvbiB0byBvdmVycmlkZQorICAgICAqIGVhcmxpZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzYW1lIGNsYXNzLiBEZWZhdWx0cyB0byBmYWxzZS4gVXNlZnVsCisgICAgICogd2hlbiBhIHRvb2wgaXMgbWFwcGluZyBhIGNsYXNzLCBzbyB0aGF0IC5qZG8gZmlsZSBwYXJ0aWFsIG1hcHBpbmcKKyAgICAgKiBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCBldmVuIHdoZW4gbWFwcGluZ3MgYXJlIHN0b3JlZCBpbiAub3JtIGZpbGVzCisgICAgICogb3Igb3RoZXIgbG9jYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE1hcHBpbmdPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuIF9vdmVycmlkZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsbG93IGxhdGVyIHBhcnNlcyBvZiBtYXBwaW5nIGluZm9ybWF0aW9uIHRvIG92ZXJyaWRlCisgICAgICogZWFybGllciBpbmZvcm1hdGlvbiBmb3IgdGhlIHNhbWUgY2xhc3MuIERlZmF1bHRzIHRvIGZhbHNlLiBVc2VmdWwKKyAgICAgKiB3aGVuIGEgdG9vbCBpcyBtYXBwaW5nIGEgY2xhc3MsIHNvIHRoYXQgLmpkbyBmaWxlIHBhcnRpYWwgbWFwcGluZworICAgICAqIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIGV2ZW4gd2hlbiBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIC5vcm0gZmlsZXMKKyAgICAgKiBvciBvdGhlciBsb2NhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGluZ092ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKyAgICAgICAgX292ZXJyaWRlID0gb3ZlcnJpZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBhcnNlIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBleHBlY3RlZCBkb2N1bWVudCB0eXBlLiBUaGUKKyAgICAgKiBtb2RlIGNvbnN0YW50cyBhY3QgYXMgYml0IGZsYWdzLCBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjb21iaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGUoKSB7CisgICAgICAgIHJldHVybiBfbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyc2UgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIGV4cGVjdGVkIGRvY3VtZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAobW9kZSA9PSBNT0RFX05PTkUpCisgICAgICAgICAgICBzZXRNb2RlKE1PREVfTk9ORSk7CisgICAgICAgIGVsc2UgaWYgKG9uKQorICAgICAgICAgICAgc2V0TW9kZShfbW9kZSB8IG1vZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRNb2RlKF9tb2RlICYgfm1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwYXJzZSBtb2RlIGFjY29yZGluZyB0byB0aGUgZXhwZWN0ZWQgZG9jdW1lbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlKSB7CisgICAgICAgIF9tb2RlID0gbW9kZTsKKyAgICAgICAgaWYgKF9wYXJzZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF9wYXJzZXIuc2V0TW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGludGVycHJldGluZyB7QGxpbmsgI2dldE1vZGV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWV0YURhdGFNb2RlKCkgeworICAgICAgICByZXR1cm4gKF9tb2RlICYgTU9ERV9NRVRBKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNRdWVyeU1vZGUoKSB7CisgICAgICAgIHJldHVybiAoX21vZGUgJiBNT0RFX1FVRVJZKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXBwaW5nTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIChfbW9kZSAmIE1PREVfTUFQUElORykgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgd2UncmUgaW4gbWFwcGluZyBtb2RlIG9yIGluIG1ldGFkYXRhIG1vZGUgd2l0aAorICAgICAqIG1hcHBpbmcgb3ZlcnJpZGUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcHBpbmdPdmVycmlkZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBpc01hcHBpbmdNb2RlKCkgfHwgKF9vdmVycmlkZSAmJiBpc01ldGFEYXRhTW9kZSgpKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBYTUwgcGFyc2luZworICAgIC8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogUHVzaCBhIHBhcnNlIGVsZW1lbnQgb250byB0aGUgc3RhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHVzaEVsZW1lbnQoT2JqZWN0IGVsZW0pIHsKKyAgICAgICAgX2VsZW1lbnRzLnB1c2goZWxlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIGEgcGFyc2UgZWxlbWVudCBmcm9tIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHBvcEVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcGFyc2VkLiBNYXkgYmUgYSBjbGFzcyBtZXRhZGF0YSwKKyAgICAgKiBmaWVsZCBtZXRhZGF0YSwgcXVlcnkgbWV0YWRhdGEsIGV0Yy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGN1cnJlbnRFbGVtZW50KCkgeworICAgICAgICBpZiAoX2VsZW1lbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLnBlZWsoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQge0BsaW5rIFBlcnNpc3RlbmNlU3RyYXRlZ3l9IGlmIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGVyc2lzdGVuY2VTdHJhdGVneSBjdXJyZW50U3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBfc3RyYXRlZ3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWcgb2YgdGhlIGN1cnJlbnQgcGFyZW50IGVsZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50UGFyZW50KCkgeworICAgICAgICBpZiAoX3BhcmVudHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBfcGFyZW50cy5wZWVrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgd2UncmUgcnVubmluZyB0aGUgcGFyc2VyIGF0IHJ1bnRpbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSdW50aW1lKCkgeworICAgICAgICByZXR1cm4gKGdldFJlcG9zaXRvcnkoKS5nZXRWYWxpZGF0ZSgpCisgICAgICAgICAgICAmIE1ldGFEYXRhUmVwb3NpdG9yeS5WQUxJREFURV9SVU5USU1FKSAhPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U2NoZW1hU291cmNlKCkgeworICAgICAgICByZXR1cm4gWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtCisgICAgICAgICAgICAoIm9ybS14c2QucnNyYyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZUF0dHJpYnV0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NBdHRyaWJ1dGVOYW1lKCkgeworICAgICAgICByZXR1cm4gImNsYXNzIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldENsYXNzRWxlbWVudERlcHRoKCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzRWxlbWVudE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICJlbnRpdHkiLmVxdWFscyhuYW1lKQorICAgICAgICAgICAgfHwgImVtYmVkZGFibGUiLmVxdWFscyhuYW1lKQorICAgICAgICAgICAgfHwgIm1hcHBlZC1zdXBlcmNsYXNzIi5lcXVhbHMobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgICAgIF9lbGVtZW50cy5jbGVhcigpOworICAgICAgICBfcGFyZW50cy5jbGVhcigpOworICAgICAgICBfY2xzID0gbnVsbDsKKyAgICAgICAgX2ZpZWxkUG9zID0gMDsKKyAgICAgICAgX2Nsc1BvcyA9IDA7CisKKyAgICAgICAgX2FjY2VzcyA9IENsYXNzTWV0YURhdGEuQUNDRVNTX1VOS05PV047CisgICAgICAgIF9zdHJhdGVneSA9IG51bGw7CisgICAgICAgIF9saXN0ZW5lciA9IG51bGw7CisgICAgICAgIF9jYWxsYmFja3MgPSBudWxsOworICAgICAgICBfaGlnaHMgPSBudWxsOworICAgICAgICBfY2FzY2FkZXMgPSBudWxsOworICAgICAgICBfcGtnQ2FzY2FkZXMgPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0U3lzdGVtRWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCB0YWcgPSAoT2JqZWN0KSBfZWxlbXMuZ2V0KG5hbWUpOworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpZiAodGFnID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpc01hcHBpbmdPdmVycmlkZU1vZGUoKSkKKyAgICAgICAgICAgICAgICB0YWcgPSBzdGFydFN5c3RlbU1hcHBpbmdFbGVtZW50KG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgIHJldCA9IHRhZyAhPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHRhZyBpbnN0YW5jZW9mIE1ldGFEYXRhVGFnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKChNZXRhRGF0YVRhZykgdGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBRVUVSWToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnROYW1lZFF1ZXJ5KGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBRVUVSWV9ISU5UOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydFF1ZXJ5SGludChhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkFUSVZFX1FVRVJZOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydE5hbWVkTmF0aXZlUXVlcnkoYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRRdWVyeVN0cmluZyhhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VRX0dFTkVSQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRTZXF1ZW5jZUdlbmVyYXRvcihhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRGbHVzaE1vZGUoYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVOVElUWV9MSVNURU5FUlM6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0RW50aXR5TGlzdGVuZXJzKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBPU1RfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBSRV9SRU1PVkU6CisgICAgICAgICAgICAgICAgY2FzZSBQT1NUX1JFTU9WRToKKyAgICAgICAgICAgICAgICBjYXNlIFBSRV9VUERBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBQT1NUX1VQREFURToKKyAgICAgICAgICAgICAgICBjYXNlIFBPU1RfTE9BRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRDYWxsYmFjaygoTWV0YURhdGFUYWcpIHRhZywgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB3YXJuVW5zdXBwb3J0ZWRUYWcobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IEVMRU1fUFVfTUVUQSB8fCB0YWcgPT0gRUxFTV9QVV9ERUYpCisgICAgICAgICAgICByZXQgPSBpc01ldGFEYXRhTW9kZSgpOworICAgICAgICBlbHNlIGlmICh0YWcgPT0gRUxFTV9YTUxfTUFQX01FVEFfQ09NUExFVEUpCisgICAgICAgICAgICBzZXRBbm5vdGF0aW9uUGFyc2VyKG51bGwpOworICAgICAgICBlbHNlIGlmICh0YWcgPT0gRUxFTV9BQ0NFU1MpCisgICAgICAgICAgICByZXQgPSBfbW9kZSAhPSBNT0RFX1FVRVJZOworICAgICAgICBlbHNlIGlmICh0YWcgPT0gRUxFTV9MSVNURU5FUikKKyAgICAgICAgICAgIHJldCA9IHN0YXJ0RW50aXR5TGlzdGVuZXIoYXR0cnMpOworICAgICAgICBlbHNlIGlmICh0YWcgPT0gRUxFTV9DQVNDQURFKQorICAgICAgICAgICAgcmV0ID0gaXNNZXRhRGF0YU1vZGUoKTsKKyAgICAgICAgZWxzZSBpZiAodGFnID09IEVMRU1fQ0FTQ0FERV9BTEwgfHwgdGFnID09IEVMRU1fQ0FTQ0FERV9QRVIKKyAgICAgICAgICAgIHx8IHRhZyA9PSBFTEVNX0NBU0NBREVfTUVSIHx8IHRhZyA9PSBFTEVNX0NBU0NBREVfUkVNCisgICAgICAgICAgICB8fCB0YWcgPT0gRUxFTV9DQVNDQURFX1JFRikKKyAgICAgICAgICAgIHJldCA9IHN0YXJ0Q2FzY2FkZSh0YWcsIGF0dHJzKTsKKworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgX3BhcmVudHMucHVzaCh0YWcpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVuZFN5c3RlbUVsZW1lbnQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdGFnID0gX2VsZW1zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxsICYmIGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKQorICAgICAgICAgICAgZW5kU3lzdGVtTWFwcGluZ0VsZW1lbnQobmFtZSk7CisgICAgICAgIGVsc2UgaWYgKHRhZyBpbnN0YW5jZW9mIE1ldGFEYXRhVGFnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKChNZXRhRGF0YVRhZykgdGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBRVUVSWToKKyAgICAgICAgICAgICAgICAgICAgZW5kTmFtZWRRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZX0hJTlQ6CisgICAgICAgICAgICAgICAgICAgIGVuZFF1ZXJ5SGludCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5BVElWRV9RVUVSWToKKyAgICAgICAgICAgICAgICAgICAgZW5kTmFtZWROYXRpdmVRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgZW5kUXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVFfR0VORVJBVE9SOgorICAgICAgICAgICAgICAgICAgICBlbmRTZXF1ZW5jZUdlbmVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gRUxFTV9BQ0NFU1MpCisgICAgICAgICAgICBlbmRBY2Nlc3MoKTsKKyAgICAgICAgZWxzZSBpZiAodGFnID09IEVMRU1fTElTVEVORVIpCisgICAgICAgICAgICBlbmRFbnRpdHlMaXN0ZW5lcigpOworCisgICAgICAgIF9wYXJlbnRzLnBvcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0byBwYXJzZSBhIG1hcHBpbmcgZWxlbWVudCBvdXRzaWRlIG9mIGFueSBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhZyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIG9yIG51bGwgdG8gc2tpcCB0aGUgZWxlbWVudAorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3Qgc3RhcnRTeXN0ZW1NYXBwaW5nRWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0byBwYXJzZSBhIG1hcHBpbmcgZWxlbWVudCBvdXRzaWRlIG9mIGFueSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRTeXN0ZW1NYXBwaW5nRWxlbWVudChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRDbGFzc0VsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdGFnID0gKE9iamVjdCkgX2VsZW1zLmdldChuYW1lKTsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkpCisgICAgICAgICAgICAgICAgdGFnID0gc3RhcnRDbGFzc01hcHBpbmdFbGVtZW50KG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgIHJldCA9IHRhZyAhPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHRhZyBpbnN0YW5jZW9mIE1ldGFEYXRhVGFnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKChNZXRhRGF0YVRhZykgdGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBHRU5FUkFURURfVkFMVUU6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0R2VuZXJhdGVkVmFsdWUoYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydElkKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTUJFRERFRF9JRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRFbWJlZGRlZElkKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJRF9DTEFTUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRJZENsYXNzKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMT0I6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0TG9iKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBRVUVSWToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnROYW1lZFF1ZXJ5KGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBRVUVSWV9ISU5UOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydFF1ZXJ5SGludChhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkFUSVZFX1FVRVJZOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydE5hbWVkTmF0aXZlUXVlcnkoYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRRdWVyeVN0cmluZyhhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VRX0dFTkVSQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRTZXF1ZW5jZUdlbmVyYXRvcihhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVkVSU0lPTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRWZXJzaW9uKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNQVBfS0VZOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydE1hcEtleShhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRGbHVzaE1vZGUoYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9SREVSX0JZOgorICAgICAgICAgICAgICAgIGNhc2UgRU5USVRZX0xJU1RFTkVSUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaXNNZXRhRGF0YU1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTOgorICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBPU1RfUEVSU0lTVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBSRV9SRU1PVkU6CisgICAgICAgICAgICAgICAgY2FzZSBQT1NUX1JFTU9WRToKKyAgICAgICAgICAgICAgICBjYXNlIFBSRV9VUERBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBQT1NUX1VQREFURToKKyAgICAgICAgICAgICAgICBjYXNlIFBPU1RfTE9BRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRDYWxsYmFjaygoTWV0YURhdGFUYWcpIHRhZywgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB3YXJuVW5zdXBwb3J0ZWRUYWcobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodGFnIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VTdHJhdGVneSkgeworICAgICAgICAgICAgUGVyc2lzdGVuY2VTdHJhdGVneSBwcyA9IChQZXJzaXN0ZW5jZVN0cmF0ZWd5KSB0YWc7CisgICAgICAgICAgICByZXQgPSBzdGFydFN0cmF0ZWd5KHBzLCBhdHRycyk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIF9zdHJhdGVneSA9IHBzOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBFTEVNX0xJU1RFTkVSKQorICAgICAgICAgICAgcmV0ID0gc3RhcnRFbnRpdHlMaXN0ZW5lcihhdHRycyk7CisgICAgICAgIGVsc2UgaWYgKHRhZyA9PSBFTEVNX0FUVFJTKQorICAgICAgICAgICAgcmV0ID0gX21vZGUgIT0gTU9ERV9RVUVSWTsKKyAgICAgICAgZWxzZSBpZiAodGFnID09IEVMRU1fQ0FTQ0FERSkKKyAgICAgICAgICAgIHJldCA9IGlzTWV0YURhdGFNb2RlKCk7CisgICAgICAgIGVsc2UgaWYgKHRhZyA9PSBFTEVNX0NBU0NBREVfQUxMIHx8IHRhZyA9PSBFTEVNX0NBU0NBREVfUEVSCisgICAgICAgICAgICB8fCB0YWcgPT0gRUxFTV9DQVNDQURFX01FUiB8fCB0YWcgPT0gRUxFTV9DQVNDQURFX1JFTQorICAgICAgICAgICAgfHwgdGFnID09IEVMRU1fQ0FTQ0FERV9SRUYpCisgICAgICAgICAgICByZXQgPSBzdGFydENhc2NhZGUodGFnLCBhdHRycyk7CisKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIF9wYXJlbnRzLnB1c2godGFnKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRDbGFzc0VsZW1lbnQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdGFnID0gX2VsZW1zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxsICYmIGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKQorICAgICAgICAgICAgZW5kQ2xhc3NNYXBwaW5nRWxlbWVudChuYW1lKTsKKyAgICAgICAgZWxzZSBpZiAodGFnIGluc3RhbmNlb2YgTWV0YURhdGFUYWcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKE1ldGFEYXRhVGFnKSB0YWcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdFTkVSQVRFRF9WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgZW5kR2VuZXJhdGVkVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAgICAgZW5kSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFTUJFRERFRF9JRDoKKyAgICAgICAgICAgICAgICAgICAgZW5kRW1iZWRkZWRJZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElEX0NMQVNTOgorICAgICAgICAgICAgICAgICAgICBlbmRJZENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTE9COgorICAgICAgICAgICAgICAgICAgICBlbmRMb2IoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBRVUVSWToKKyAgICAgICAgICAgICAgICAgICAgZW5kTmFtZWRRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZX0hJTlQ6CisgICAgICAgICAgICAgICAgICAgIGVuZFF1ZXJ5SGludCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5BVElWRV9RVUVSWToKKyAgICAgICAgICAgICAgICAgICAgZW5kTmFtZWROYXRpdmVRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFFVRVJZX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgZW5kUXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVFfR0VORVJBVE9SOgorICAgICAgICAgICAgICAgICAgICBlbmRTZXF1ZW5jZUdlbmVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZFUlNJT046CisgICAgICAgICAgICAgICAgICAgIGVuZFZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUkRFUl9CWToKKyAgICAgICAgICAgICAgICAgICAgZW5kT3JkZXJCeSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0YWcgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVN0cmF0ZWd5KQorICAgICAgICAgICAgZW5kU3RyYXRlZ3koKFBlcnNpc3RlbmNlU3RyYXRlZ3kpIHRhZyk7CisgICAgICAgIGVsc2UgaWYgKHRhZyA9PSBFTEVNX0FDQ0VTUykKKyAgICAgICAgICAgIGVuZEFjY2VzcygpOworICAgICAgICBlbHNlIGlmICh0YWcgPT0gRUxFTV9MSVNURU5FUikKKyAgICAgICAgICAgIGVuZEVudGl0eUxpc3RlbmVyKCk7CisKKyAgICAgICAgX3BhcmVudHMucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIHdhcm5pbmcgYWJvdXQgYW4gdW5zdXBwb3J0ZWQgdGFnLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YXJuVW5zdXBwb3J0ZWRUYWcoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgTG9nIGxvZyA9IGdldExvZygpOworICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgidW5zdXBwb3J0ZWQtdGFnIiwgbmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0byBwYXJzZSBhIG1hcHBpbmcgZWxlbWVudCB3aXRoaW4gYSBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhZyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIG9yIG51bGwgdG8gc2tpcCBlbGVtZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBzdGFydENsYXNzTWFwcGluZ0VsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdG8gcGFyc2UgYSBtYXBwaW5nIGVsZW1lbnQgd2l0aGluIGEgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kQ2xhc3NNYXBwaW5nRWxlbWVudChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRDbGFzcyhTdHJpbmcgZWxlbSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnN0YXJ0Q2xhc3MoZWxlbSwgYXR0cnMpOworCisgICAgICAgIC8vIHF1ZXJ5IG1vZGUgb25seT8KKyAgICAgICAgX2NscyA9IGNsYXNzRm9yTmFtZShjdXJyZW50Q2xhc3NOYW1lKCkpOworICAgICAgICBpZiAoX21vZGUgPT0gTU9ERV9RVUVSWSkgeworICAgICAgICAgICAgaWYgKF9wYXJzZXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICEidHJ1ZSIuZXF1YWxzKGF0dHJzLmdldFZhbHVlKCJtZXRhZGF0YS1jb21wbGV0ZSIpKSkKKyAgICAgICAgICAgICAgICBfcGFyc2VyLnBhcnNlKF9jbHMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgicGFyc2UtY2xhc3MiLCBfY2xzLmdldE5hbWUoKSkpOworCisgICAgICAgIE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcyA9IGdldFJlcG9zaXRvcnkoKTsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gcmVwb3MuZ2V0Q2FjaGVkTWV0YURhdGEoX2Nscyk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGwKKyAgICAgICAgICAgICYmICgoaXNNZXRhRGF0YU1vZGUoKSAmJiAobWV0YS5nZXRTb3VyY2VNb2RlKCkgJiBNT0RFX01FVEEpICE9IDApCisgICAgICAgICAgICB8fCAoaXNNYXBwaW5nTW9kZSgpICYmIChtZXRhLmdldFNvdXJjZU1vZGUoKSAmIE1PREVfTUFQUElORykgIT0gMCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cud2FybihfbG9jLmdldCgiZHVwLW1ldGFkYXRhIiwgX2NscywgZ2V0U291cmNlTmFtZSgpKSk7CisgICAgICAgICAgICBfY2xzID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGRvbid0IGtub3cgdGhlIGFjY2VzcyB0eXBlLCBjaGVjayB0byBzZWUgaWYgYSBzdXBlcmNsYXNzCisgICAgICAgIC8vIGhhcyBhbHJlYWR5IGRlZmluZWQgdGhlIGFjY2VzcyB0eXBlCisgICAgICAgIGludCBkZWZhdWx0QWNjZXNzID0gX2FjY2VzczsKKyAgICAgICAgaWYgKGRlZmF1bHRBY2Nlc3MgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfVU5LTk9XTikgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSByZXBvcy5nZXRDYWNoZWRNZXRhRGF0YShfY2xzLmdldFN1cGVyY2xhc3MoKSk7CisgICAgICAgICAgICBpZiAoc3VwICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGVmYXVsdEFjY2VzcyA9IHN1cC5nZXRBY2Nlc3NUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBhZGQgbWV0YWRhdGEgZm9yIHRoaXMgdHlwZQorICAgICAgICAgICAgaW50IGFjY2VzcyA9IHRvQWNjZXNzVHlwZShhdHRycy5nZXRWYWx1ZSgiYWNjZXNzIiksIGRlZmF1bHRBY2Nlc3MpOworICAgICAgICAgICAgbWV0YSA9IHJlcG9zLmFkZE1ldGFEYXRhKF9jbHMsIGFjY2Vzcyk7CisgICAgICAgICAgICBtZXRhLnNldEVudkNsYXNzTG9hZGVyKF9lbnZMb2FkZXIpOworICAgICAgICAgICAgbWV0YS5zZXRTb3VyY2VNb2RlKE1PREVfTk9ORSk7CisKKyAgICAgICAgICAgIC8vIHBhcnNlIGFubm90YXRpb25zIGZpcnN0IHNvIFhNTCBvdmVycmlkZXMgdGhlbQorICAgICAgICAgICAgaWYgKF9wYXJzZXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICEidHJ1ZSIuZXF1YWxzKGF0dHJzLmdldFZhbHVlKCJtZXRhZGF0YS1jb21wbGV0ZSIpKSkKKyAgICAgICAgICAgICAgICBfcGFyc2VyLnBhcnNlKF9jbHMpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBtYXBwZWRTdXBlciA9ICJtYXBwZWQtc3VwZXJjbGFzcyIuZXF1YWxzKGVsZW0pOworICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkgeworICAgICAgICAgICAgbWV0YS5zZXRTb3VyY2UoZ2V0U291cmNlRmlsZSgpLCBtZXRhLlNSQ19YTUwpOworICAgICAgICAgICAgbWV0YS5zZXRTb3VyY2VNb2RlKE1PREVfTUVUQSwgdHJ1ZSk7CisgICAgICAgICAgICBtZXRhLnNldExpc3RpbmdJbmRleChfY2xzUG9zKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eShuYW1lKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldFR5cGVBbGlhcyhuYW1lKTsKKyAgICAgICAgICAgIG1ldGEuc2V0RW1iZWRkZWRPbmx5KG1hcHBlZFN1cGVyIHx8ICJlbWJlZGRhYmxlIi5lcXVhbHMoZWxlbSkpOworICAgICAgICAgICAgaWYgKG1hcHBlZFN1cGVyKQorICAgICAgICAgICAgICAgIG1ldGEuc2V0SWRlbnRpdHlUeXBlKG1ldGEuSURfVU5LTk9XTik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX01BUFBJTkcsIHRydWUpOworICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkpCisgICAgICAgICAgICBzdGFydENsYXNzTWFwcGluZyhtZXRhLCBtYXBwZWRTdXBlciwgYXR0cnMpOworICAgICAgICBpZiAoaXNRdWVyeU1vZGUoKSkKKyAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX1FVRVJZLCB0cnVlKTsKKworICAgICAgICBfY2xzUG9zKys7CisgICAgICAgIF9maWVsZFBvcyA9IDA7CisgICAgICAgIGFkZENvbW1lbnRzKG1ldGEpOworICAgICAgICBwdXNoRWxlbWVudChtZXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kQ2xhc3MoU3RyaW5nIGVsZW0pCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoX21vZGUgIT0gTU9ERV9RVUVSWSkgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gKENsYXNzTWV0YURhdGEpIHBvcEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHN0b3JlQ2FsbGJhY2tzKG1ldGEpOworICAgICAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKQorICAgICAgICAgICAgICAgIGVuZENsYXNzTWFwcGluZyhtZXRhKTsKKyAgICAgICAgfQorICAgICAgICBfY2xzID0gbnVsbDsKKyAgICAgICAgc3VwZXIuZW5kQ2xhc3MoZWxlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRvIGFkZCBtYXBwaW5nIGF0dHJpYnV0ZXMgdG8gY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRDbGFzc01hcHBpbmcoQ2xhc3NNZXRhRGF0YSBtYXBwaW5nLAorICAgICAgICBib29sZWFuIG1hcHBlZFN1cGVyLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdG8gZmluYWxpemUgY2xhc3MgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRDbGFzc01hcHBpbmcoQ2xhc3NNZXRhRGF0YSBtYXBwaW5nKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGFjY2VzcyBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmRBY2Nlc3MoKSB7CisgICAgICAgIF9hY2Nlc3MgPSB0b0FjY2Vzc1R5cGUoY3VycmVudFRleHQoKSwgQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfVU5LTk9XTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGdpdmVuIHN0cmluZyBhcyBhbiBlbnRpdHkgYWNjZXNzIHR5cGUsIGRlZmF1bHRpbmcgdG8gZ2l2ZW4KKyAgICAgKiBkZWZhdWx0IGlmIHN0cmluZyBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB0b0FjY2Vzc1R5cGUoU3RyaW5nIHN0ciwgaW50IGRlZikgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShzdHIpKQorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgaWYgKCJQUk9QRVJUWSIuZXF1YWxzKHN0cikpCisgICAgICAgICAgICByZXR1cm4gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfUFJPUEVSVFk7CisgICAgICAgIHJldHVybiBDbGFzc01ldGFEYXRhLkFDQ0VTU19GSUVMRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBmbHVzaC1tb2RlIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0Rmx1c2hNb2RlKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoInVuc3VwcG9ydGVkIiwgImZsdXNoLW1vZGUiLCBnZXRTb3VyY2VOYW1lKCkpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHNlcXVlbmNlLWdlbmVyYXRvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydFNlcXVlbmNlR2VuZXJhdG9yKEF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgaWYgKCFpc01hcHBpbmdPdmVycmlkZU1vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIExvZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLnRyYWNlKF9sb2MuZ2V0KCJwYXJzZS1zZXF1ZW5jZSIsIG5hbWUpKTsKKworICAgICAgICBTZXF1ZW5jZU1ldGFEYXRhIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0Q2FjaGVkU2VxdWVuY2VNZXRhRGF0YShuYW1lKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoIm92ZXJyaWRlLXNlcXVlbmNlIiwgbmFtZSkpOworCisgICAgICAgIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuYWRkU2VxdWVuY2VNZXRhRGF0YShuYW1lKTsKKyAgICAgICAgU3RyaW5nIHNlcSA9IGF0dHJzLmdldFZhbHVlKCJzZXF1ZW5jZS1uYW1lIik7CisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgiaW5pdGlhbC12YWx1ZSIpOworICAgICAgICBpbnQgaW5pdGlhbCA9IHZhbCA9PSBudWxsID8gMSA6IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImFsbG9jYXRpb24tc2l6ZSIpOworICAgICAgICBpbnQgYWxsb2NhdGUgPSB2YWwgPT0gbnVsbCA/IDUwIDogSW50ZWdlci5wYXJzZUludCh2YWwpOworCisgICAgICAgIFN0cmluZyBjbHNOYW1lLCBwcm9wczsKKyAgICAgICAgaWYgKHNlcSA9PSBudWxsIHx8IHNlcS5pbmRleE9mKCcoJykgPT0gLTEpIHsKKyAgICAgICAgICAgIGNsc05hbWUgPSBTZXF1ZW5jZU1ldGFEYXRhLklNUExfTkFUSVZFOworICAgICAgICAgICAgcHJvcHMgPSBudWxsOworICAgICAgICB9IGVsc2UgeyAvLyBwbHVnaW4KKyAgICAgICAgICAgIGNsc05hbWUgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUoc2VxKTsKKyAgICAgICAgICAgIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhzZXEpOworICAgICAgICAgICAgc2VxID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEuc2V0U2VxdWVuY2VQbHVnaW4oQ29uZmlndXJhdGlvbnMuZ2V0UGx1Z2luKGNsc05hbWUsIHByb3BzKSk7CisgICAgICAgIG1ldGEuc2V0U2VxdWVuY2Uoc2VxKTsKKyAgICAgICAgbWV0YS5zZXRJbml0aWFsVmFsdWUoaW5pdGlhbCk7CisgICAgICAgIG1ldGEuc2V0QWxsb2NhdGUoYWxsb2NhdGUpOworCisgICAgICAgIE9iamVjdCBjdXIgPSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBPYmplY3Qgc2NvcGUgPSAoY3VyIGluc3RhbmNlb2YgQ2xhc3NNZXRhRGF0YSkKKyAgICAgICAgICAgID8gKChDbGFzc01ldGFEYXRhKSBjdXIpLmdldERlc2NyaWJlZFR5cGUoKSA6IG51bGw7CisgICAgICAgIG1ldGEuc2V0U291cmNlKGdldFNvdXJjZUZpbGUoKSwgc2NvcGUsIG1ldGEuU1JDX1hNTCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZFNlcXVlbmNlR2VuZXJhdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGlkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0SWQoQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kID0gcGFyc2VGaWVsZChhdHRycyk7CisgICAgICAgIGZtZC5zZXRFeHBsaWNpdCh0cnVlKTsKKyAgICAgICAgZm1kLnNldFByaW1hcnlLZXkodHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZElkKCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmlzaEZpZWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZW1iZWRkZWQtaWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRFbWJlZGRlZElkKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IHBhcnNlRmllbGQoYXR0cnMpOworICAgICAgICBmbWQuc2V0RXhwbGljaXQodHJ1ZSk7CisgICAgICAgIGZtZC5zZXRQcmltYXJ5S2V5KHRydWUpOworICAgICAgICBmbWQuc2V0RW1iZWRkZWQodHJ1ZSk7CisgICAgICAgIGlmIChmbWQuZ2V0RW1iZWRkZWRNZXRhRGF0YSgpID09IG51bGwpCisgICAgICAgICAgICBmbWQuYWRkRW1iZWRkZWRNZXRhRGF0YSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRFbWJlZGRlZElkKCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmlzaEZpZWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgaWQtY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRJZENsYXNzKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gKENsYXNzTWV0YURhdGEpIGN1cnJlbnRFbGVtZW50KCk7CisgICAgICAgIFN0cmluZyBjbHMgPSBhdHRycy5nZXRWYWx1ZSgiY2xhc3MiKTsKKyAgICAgICAgQ2xhc3MgaWRDbHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWRDbHMgPSBjbGFzc0Zvck5hbWUoY2xzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IGdldEV4Y2VwdGlvbihfbG9jLmdldCgiaW52YWxpZC1pZC1jbGFzcyIsIG1ldGEsIGNscyksIHQpOworICAgICAgICB9CisgICAgICAgIG1ldGEuc2V0T2JqZWN0SWRUeXBlKGlkQ2xzLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kSWRDbGFzcygpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGxvYi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydExvYihBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSAoRmllbGRNZXRhRGF0YSkgY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgaWYgKGZtZC5nZXREZWNsYXJlZFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlNUUklORworICAgICAgICAgICAgJiYgZm1kLmdldERlY2xhcmVkVHlwZSgpICE9IGNoYXJbXS5jbGFzcworICAgICAgICAgICAgJiYgZm1kLmdldERlY2xhcmVkVHlwZSgpICE9IENoYXJhY3RlcltdLmNsYXNzCisgICAgICAgICAgICAmJiBmbWQuZ2V0RGVjbGFyZWRUeXBlKCkgIT0gYnl0ZVtdLmNsYXNzCisgICAgICAgICAgICAmJiBmbWQuZ2V0RGVjbGFyZWRUeXBlKCkgIT0gQnl0ZVtdLmNsYXNzKQorICAgICAgICAgICAgZm1kLnNldFNlcmlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZExvYigpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGdlbmVyYXRlZC12YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydEdlbmVyYXRlZFZhbHVlKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFN0cmluZyBzdHJhdGVneSA9IGF0dHJzLmdldFZhbHVlKCJzdHJhdGVneSIpOworICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yID0gYXR0cnMuZ2V0VmFsdWUoImdlbmVyYXRvciIpOworCisgICAgICAgIC8vIFRPRE8gVVVJRF9IRVggLyBVVUlEX1NUUklORworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IChGaWVsZE1ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShzdHJhdGVneSkgfHwgIkFVVE8iLmVxdWFscyhzdHJhdGVneSkpCisgICAgICAgICAgICBmbWQuc2V0VmFsdWVTZXF1ZW5jZU5hbWUoU2VxdWVuY2VNZXRhRGF0YS5OQU1FX1NZU1RFTSk7CisgICAgICAgIGVsc2UgaWYgKCJUQUJMRSIuZXF1YWxzKHN0cmF0ZWd5KSB8fCAiU0VRVUVOQ0UiLmVxdWFscyhzdHJhdGVneSkpIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGdlbmVyYXRvcikpCisgICAgICAgICAgICAgICAgZm1kLnNldFZhbHVlU2VxdWVuY2VOYW1lKFNlcXVlbmNlTWV0YURhdGEuTkFNRV9TWVNURU0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZtZC5zZXRWYWx1ZVNlcXVlbmNlTmFtZShnZW5lcmF0b3IpOworICAgICAgICB9IGVsc2UgaWYgKCJJREVOVElUWSIuZXF1YWxzKHN0cmF0ZWd5KSkKKyAgICAgICAgICAgIGZtZC5zZXRWYWx1ZVN0cmF0ZWd5KFZhbHVlU3RyYXRlZ2llcy5BVVRPQVNTSUdOKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kR2VuZXJhdGVkVmFsdWUoKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXppbHkgcGFyc2UgY2FzY2FkZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRDYXNjYWRlKE9iamVjdCB0YWcsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU2V0PENhc2NhZGVUeXBlPiBjYXNjYWRlcyA9IG51bGw7CisgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCgpIGluc3RhbmNlb2YgRmllbGRNZXRhRGF0YSkgeworICAgICAgICAgICAgaWYgKF9jYXNjYWRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9jYXNjYWRlcyA9IEVudW1TZXQubm9uZU9mKENhc2NhZGVUeXBlLmNsYXNzKTsKKyAgICAgICAgICAgIGNhc2NhZGVzID0gX2Nhc2NhZGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKF9wa2dDYXNjYWRlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9wa2dDYXNjYWRlcyA9IEVudW1TZXQubm9uZU9mKENhc2NhZGVUeXBlLmNsYXNzKTsKKyAgICAgICAgICAgIGNhc2NhZGVzID0gX3BrZ0Nhc2NhZGVzOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gYWxsID0gRUxFTV9DQVNDQURFX0FMTCA9PSB0YWc7CisgICAgICAgIGlmIChhbGwgfHwgRUxFTV9DQVNDQURFX1BFUiA9PSB0YWcpCisgICAgICAgICAgICBjYXNjYWRlcy5hZGQoUEVSU0lTVCk7CisgICAgICAgIGlmIChhbGwgfHwgRUxFTV9DQVNDQURFX1JFTSA9PSB0YWcpCisgICAgICAgICAgICBjYXNjYWRlcy5hZGQoUkVNT1ZFKTsKKyAgICAgICAgaWYgKGFsbCB8fCBFTEVNX0NBU0NBREVfTUVSID09IHRhZykKKyAgICAgICAgICAgIGNhc2NhZGVzLmFkZChNRVJHRSk7CisgICAgICAgIGlmIChhbGwgfHwgRUxFTV9DQVNDQURFX1JFRiA9PSB0YWcpCisgICAgICAgICAgICBjYXNjYWRlcy5hZGQoUkVGUkVTSCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FjaGVkIGNhc2NhZGVzIGludG8gdGhlIGZpZWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldENhc2NhZGVzKEZpZWxkTWV0YURhdGEgZm1kKSB7CisgICAgICAgIFNldDxDYXNjYWRlVHlwZT4gY2FzY2FkZXMgPSBfY2FzY2FkZXM7CisgICAgICAgIGlmIChfY2FzY2FkZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGNhc2NhZGVzID0gX3BrZ0Nhc2NhZGVzOworICAgICAgICBpZiAoY2FzY2FkZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBWYWx1ZU1ldGFEYXRhIHZtZCA9IGZtZDsKKyAgICAgICAgc3dpdGNoIChfc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIGNhc2UgT05FX01BTlk6CisgICAgICAgICAgICBjYXNlIE1BTllfTUFOWToKKyAgICAgICAgICAgICAgICB2bWQgPSBmbWQuZ2V0RWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoQ2FzY2FkZVR5cGUgY2FzY2FkZSA6IGNhc2NhZGVzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhc2NhZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBFUlNJU1Q6CisgICAgICAgICAgICAgICAgICAgIHZtZC5zZXRDYXNjYWRlUGVyc2lzdChWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNRVJHRToKKyAgICAgICAgICAgICAgICAgICAgdm1kLnNldENhc2NhZGVBdHRhY2goVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFOgorICAgICAgICAgICAgICAgICAgICB2bWQuc2V0Q2FzY2FkZURlbGV0ZShWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRUZSRVNIOgorICAgICAgICAgICAgICAgICAgICB2bWQuc2V0Q2FzY2FkZVJlZnJlc2goVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9jYXNjYWRlcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgY29tbW9uIGZpZWxkIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWVsZE1ldGFEYXRhIHBhcnNlRmllbGQoQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IChDbGFzc01ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIEZpZWxkTWV0YURhdGEgZmllbGQgPSBtZXRhLmdldERlY2xhcmVkRmllbGQobmFtZSk7CisgICAgICAgIGlmICgoZmllbGQgPT0gbnVsbCB8fCBmaWVsZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICAmJiBtZXRhLmdldERlc2NyaWJlZFR5cGUoKSAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBudWxsOworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IG51bGw7CisgICAgICAgICAgICBpbnQgZGVmID0gX3JlcG9zLmdldE1ldGFEYXRhRmFjdG9yeSgpLmdldERlZmF1bHRzKCkuCisgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX1BST1BFUlRZCisgICAgICAgICAgICAgICAgICAgIHx8IChtZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19VTktOT1dOCisgICAgICAgICAgICAgICAgICAgICYmIGRlZiA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19QUk9QRVJUWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhcCA9IFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciA9IHR5cGUuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBjYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzW10pIG51bGwpOyAvLyB2YXJhcmdzIGRpc2FtYmlndWF0ZQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyID0gdHlwZS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXhjZXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICgoTWV0aG9kKSBtZW1iZXIpLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1iZXIgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXREZWNsYXJlZEZpZWxkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICB0eXBlID0gKChGaWVsZCkgbWVtYmVyKS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBnZXRFeGNlcHRpb24oX2xvYy5nZXQoImludmFsaWQtYXR0ciIsIG5hbWUsIG1ldGEpLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaWVsZCA9IG1ldGEuYWRkRGVjbGFyZWRGaWVsZChuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZU1ldGFEYXRhRGVmYXVsdHMuc2V0Q2FzY2FkZU5vbmUoZmllbGQpOworICAgICAgICAgICAgICAgIFBlcnNpc3RlbmNlTWV0YURhdGFEZWZhdWx0cy5zZXRDYXNjYWRlTm9uZShmaWVsZC5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzLnNldENhc2NhZGVOb25lKGZpZWxkLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWVsZC5iYWNraW5nTWVtYmVyKG1lbWJlcik7CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmllbGQgPSBtZXRhLmFkZERlY2xhcmVkRmllbGQobmFtZSwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgIFBlcnNpc3RlbmNlTWV0YURhdGFEZWZhdWx0cy5zZXRDYXNjYWRlTm9uZShmaWVsZCk7CisgICAgICAgICAgICBQZXJzaXN0ZW5jZU1ldGFEYXRhRGVmYXVsdHMuc2V0Q2FzY2FkZU5vbmUoZmllbGQuZ2V0S2V5KCkpOworICAgICAgICAgICAgUGVyc2lzdGVuY2VNZXRhRGF0YURlZmF1bHRzLnNldENhc2NhZGVOb25lKGZpZWxkLmdldEVsZW1lbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgIGZpZWxkLnNldExpc3RpbmdJbmRleChfZmllbGRQb3MpOworCisgICAgICAgIF9maWVsZFBvcysrOworICAgICAgICBwdXNoRWxlbWVudChmaWVsZCk7CisgICAgICAgIGFkZENvbW1lbnRzKGZpZWxkKTsKKworICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkpCisgICAgICAgICAgICBzdGFydEZpZWxkTWFwcGluZyhmaWVsZCwgYXR0cnMpOworICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wcyBmaWVsZCBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaW5pc2hGaWVsZCgpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBGaWVsZE1ldGFEYXRhIGZpZWxkID0gKEZpZWxkTWV0YURhdGEpIHBvcEVsZW1lbnQoKTsKKyAgICAgICAgc2V0Q2FzY2FkZXMoZmllbGQpOworICAgICAgICBpZiAoaXNNYXBwaW5nT3ZlcnJpZGVNb2RlKCkpCisgICAgICAgICAgICBlbmRGaWVsZE1hcHBpbmcoZmllbGQpOworICAgICAgICBfc3RyYXRlZ3kgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0byBhZGQgZmllbGQgbWFwcGluZyBkYXRhLiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEZpZWxkTWFwcGluZyhGaWVsZE1ldGFEYXRhIGZpZWxkLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdG8gZmluYWxpemUgZmllbGQgbWFwcGluZy4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kRmllbGRNYXBwaW5nKEZpZWxkTWV0YURhdGEgZmllbGQpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHZlcnNpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRWZXJzaW9uKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IHBhcnNlRmllbGQoYXR0cnMpOworICAgICAgICBmbWQuc2V0RXhwbGljaXQodHJ1ZSk7CisgICAgICAgIGZtZC5zZXRWZXJzaW9uKHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRWZXJzaW9uKCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmlzaEZpZWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2Ugc3RyYXRlZ3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRTdHJhdGVneShQZXJzaXN0ZW5jZVN0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQgPSBwYXJzZUZpZWxkKGF0dHJzKTsKKyAgICAgICAgZm1kLnNldEV4cGxpY2l0KHRydWUpOworICAgICAgICBmbWQuc2V0TWFuYWdlbWVudChGaWVsZE1ldGFEYXRhLk1BTkFHRV9QRVJTSVNURU5UKTsKKworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoImZldGNoIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKKyAgICAgICAgICAgIGZtZC5zZXRJbkRlZmF1bHRGZXRjaEdyb3VwKCJFQUdFUiIuZXF1YWxzKHZhbCkpOworICAgICAgICB2YWwgPSBhdHRycy5nZXRWYWx1ZSgib3B0aW9uYWwiKTsKKyAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHZhbCkpCisgICAgICAgICAgICBmbWQuc2V0TnVsbFZhbHVlKEZpZWxkTWV0YURhdGEuTlVMTF9FWENFUFRJT04pOworICAgICAgICBlbHNlIGlmICgidHJ1ZSIuZXF1YWxzKHZhbCkKKyAgICAgICAgICAgICAgICAmJiBmbWQuZ2V0TnVsbFZhbHVlKCkgPT0gRmllbGRNZXRhRGF0YS5OVUxMX0VYQ0VQVElPTikgeworICAgICAgICAgICAgLy8gUmVzZXQgdmFsdWUgaWYgdGhlIGZpZWxkIHdhcyBhbm5vdGF0ZWQgd2l0aCBvcHRpb25hbD1mYWxzZS4gCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgbGVhdmUgaXQgYWxvbmUuCisgICAgICAgICAgICBmbWQuc2V0TnVsbFZhbHVlKEZpZWxkTWV0YURhdGEuTlVMTF9VTlNFVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWFwcGluZ092ZXJyaWRlTW9kZSgpKSB7CisgICAgICAgICAgICB2YWwgPSBhdHRycy5nZXRWYWx1ZSgibWFwcGVkLWJ5Iik7CisgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgZm1kLnNldE1hcHBlZEJ5KHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcGFyc2VTdHJhdGVneShmbWQsIHN0cmF0ZWd5LCBhdHRycyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRTdHJhdGVneShQZXJzaXN0ZW5jZVN0cmF0ZWd5IHN0cmF0ZWd5KQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgZmluaXNoRmllbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBzdHJhdGVneSBzcGVjaWZpYyBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVN0cmF0ZWd5KEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBQZXJzaXN0ZW5jZVN0cmF0ZWd5IHN0cmF0ZWd5LCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChzdHJhdGVneSkgeworICAgICAgICAgICAgY2FzZSBCQVNJQzoKKyAgICAgICAgICAgICAgICBwYXJzZUJhc2ljKGZtZCwgYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTUJFRERFRDoKKyAgICAgICAgICAgICAgICBwYXJzZUVtYmVkZGVkKGZtZCwgYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTkVfT05FOgorICAgICAgICAgICAgICAgIHBhcnNlT25lVG9PbmUoZm1kLCBhdHRycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1BTllfT05FOgorICAgICAgICAgICAgICAgIHBhcnNlTWFueVRvT25lKGZtZCwgYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNQU5ZX01BTlk6CisgICAgICAgICAgICAgICAgcGFyc2VNYW55VG9NYW55KGZtZCwgYXR0cnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTkVfTUFOWToKKyAgICAgICAgICAgICAgICBwYXJzZU9uZVRvTWFueShmbWQsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgICAgICAgICAgIGZtZC5zZXRNYW5hZ2VtZW50KEZpZWxkTWV0YURhdGEuTUFOQUdFX05PTkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYmFzaWMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VCYXNpYyhGaWVsZE1ldGFEYXRhIGZtZCwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZW1iZWRkZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VFbWJlZGRlZChGaWVsZE1ldGFEYXRhIGZtZCwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFBDKGZtZCwgIkVtYmVkZGVkIik7CisgICAgICAgIGZtZC5zZXRFbWJlZGRlZCh0cnVlKTsKKyAgICAgICAgZm1kLnNldFNlcmlhbGl6ZWQoZmFsc2UpOyAvLyBvdmVycmlkZSBhbnkgTG9iIGFubm90YXRpb24KKyAgICAgICAgaWYgKGZtZC5nZXRFbWJlZGRlZE1ldGFEYXRhKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGZtZC5hZGRFbWJlZGRlZE1ldGFEYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3cgcHJvcGVyIGV4Y2VwdGlvbiBpZiBnaXZlbiB2YWx1ZSBpcyBub3QgcG9zc2libHkgcGVyc2lzdGVuY2UKKyAgICAgKiBjYXBhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQQyhGaWVsZE1ldGFEYXRhIGZtZCwgU3RyaW5nIGF0dHIpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIUphdmFUeXBlcy5tYXliZVBDKGZtZCkpCisgICAgICAgICAgICB0aHJvdyBnZXRFeGNlcHRpb24oX2xvYy5nZXQoImJhZC1tZXRhLWFubm8iLCBmbWQsIGF0dHIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBvbmUtdG8tb25lLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlT25lVG9PbmUoRmllbGRNZXRhRGF0YSBmbWQsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInRhcmdldC1lbnRpdHkiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgZm1kLnNldFR5cGVPdmVycmlkZShjbGFzc0Zvck5hbWUodmFsKSk7CisgICAgICAgIGFzc2VydFBDKGZtZCwgIk9uZVRvT25lIik7CisgICAgICAgIGZtZC5zZXRTZXJpYWxpemVkKGZhbHNlKTsgLy8gb3ZlcnJpZGUgYW55IExvYiBhbm5vdGF0aW9uCisgICAgICAgIGlmICghZm1kLmlzRGVmYXVsdEZldGNoR3JvdXBFeHBsaWNpdCgpKQorICAgICAgICAgICAgZm1kLnNldEluRGVmYXVsdEZldGNoR3JvdXAodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgbWFueS10by1vbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VNYW55VG9PbmUoRmllbGRNZXRhRGF0YSBmbWQsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInRhcmdldC1lbnRpdHkiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgZm1kLnNldFR5cGVPdmVycmlkZShjbGFzc0Zvck5hbWUodmFsKSk7CisgICAgICAgIGFzc2VydFBDKGZtZCwgIk1hbnlUb09uZSIpOworICAgICAgICBmbWQuc2V0U2VyaWFsaXplZChmYWxzZSk7IC8vIG92ZXJyaWRlIGFueSBMb2IgYW5ub3RhdGlvbgorICAgICAgICBpZiAoIWZtZC5pc0RlZmF1bHRGZXRjaEdyb3VwRXhwbGljaXQoKSkKKyAgICAgICAgICAgIGZtZC5zZXRJbkRlZmF1bHRGZXRjaEdyb3VwKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIG1hbnktdG8tbWFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZU1hbnlUb01hbnkoRmllbGRNZXRhRGF0YSBmbWQsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInRhcmdldC1lbnRpdHkiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKQorICAgICAgICAgICAgZm1kLmdldEVsZW1lbnQoKS5zZXREZWNsYXJlZFR5cGUoY2xhc3NGb3JOYW1lKHZhbCkpOworICAgICAgICBhc3NlcnRQQ0NvbGxlY3Rpb24oZm1kLCAiTWFueVRvTWFueSIpOworICAgICAgICBmbWQuc2V0U2VyaWFsaXplZChmYWxzZSk7IC8vIG92ZXJyaWRlIExvYiBpbiBhbm5vdGF0aW9uCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3cgZXhjZXB0aW9uIGlmIGdpdmVuIGZpZWxkIG5vdCBhIGNvbGxlY3Rpb24gb2YgcG9zc2libGUgcGVyc2lzdGVuY2UKKyAgICAgKiBjYXBhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UENDb2xsZWN0aW9uKEZpZWxkTWV0YURhdGEgZm1kLCBTdHJpbmcgYXR0cikKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgIGlmIChKYXZhVHlwZXMubWF5YmVQQyhmbWQuZ2V0RWxlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgZ2V0RXhjZXB0aW9uKF9sb2MuZ2V0KCJiYWQtbWV0YS1hbm5vIiwgZm1kLCBhdHRyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBvbmUtdG8tbWFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZU9uZVRvTWFueShGaWVsZE1ldGFEYXRhIGZtZCwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgidGFyZ2V0LWVudGl0eSIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBmbWQuZ2V0RWxlbWVudCgpLnNldERlY2xhcmVkVHlwZShjbGFzc0Zvck5hbWUodmFsKSk7CisgICAgICAgIGFzc2VydFBDQ29sbGVjdGlvbihmbWQsICJPbmVUb01hbnkiKTsKKyAgICAgICAgZm1kLnNldFNlcmlhbGl6ZWQoZmFsc2UpOyAvLyBvdmVycmlkZSBhbnkgTG9iIGFubm90YXRpb24KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBtYXAta2V5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydE1hcEtleShBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc01hcHBpbmdPdmVycmlkZU1vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IChGaWVsZE1ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgbWFwS2V5ID0gYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgaWYgKG1hcEtleSA9PSBudWxsKQorICAgICAgICAgICAgZm1kLmdldEtleSgpLnNldFZhbHVlTWFwcGVkQnkoVmFsdWVNZXRhRGF0YS5NQVBQRURfQllfUEspOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbWQuZ2V0S2V5KCkuc2V0VmFsdWVNYXBwZWRCeShtYXBLZXkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBvcmRlci1ieS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kT3JkZXJCeSgpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZCA9IChGaWVsZE1ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgZGVjID0gY3VycmVudFRleHQoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZGVjKSkKKyAgICAgICAgICAgIGRlYyA9IE9yZGVyLkVMRU1FTlQgKyAiIGFzYyI7CisgICAgICAgIGZtZC5zZXRPcmRlckRlY2xhcmF0aW9uKGRlYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgbmFtZWQtcXVlcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnROYW1lZFF1ZXJ5KEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzUXVlcnlNb2RlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRycy5nZXRWYWx1ZSgibmFtZSIpOworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZShfbG9jLmdldCgicGFyc2UtcXVlcnkiLCBuYW1lKSk7CisKKyAgICAgICAgUXVlcnlNZXRhRGF0YSBtZXRhID0gZ2V0UmVwb3NpdG9yeSgpLmdldENhY2hlZFF1ZXJ5TWV0YURhdGEobnVsbCwgbmFtZSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGwgJiYgbG9nLmlzV2FybkVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy53YXJuKF9sb2MuZ2V0KCJvdmVycmlkZS1xdWVyeSIsIG5hbWUsIGN1cnJlbnRMb2NhdGlvbigpKSk7CisKKyAgICAgICAgbWV0YSA9IGdldFJlcG9zaXRvcnkoKS5hZGRRdWVyeU1ldGFEYXRhKG51bGwsIG5hbWUpOworICAgICAgICBtZXRhLnNldERlZmluaW5nVHlwZShfY2xzKTsKKyAgICAgICAgbWV0YS5zZXRRdWVyeVN0cmluZyhhdHRycy5nZXRWYWx1ZSgicXVlcnkiKSk7CisgICAgICAgIG1ldGEuc2V0TGFuZ3VhZ2UoSlBRTFBhcnNlci5MQU5HX0pQUUwpOworCisgICAgICAgIE9iamVjdCBjdXIgPSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBPYmplY3Qgc2NvcGUgPSAoY3VyIGluc3RhbmNlb2YgQ2xhc3NNZXRhRGF0YSkKKyAgICAgICAgICAgID8gKChDbGFzc01ldGFEYXRhKSBjdXIpLmdldERlc2NyaWJlZFR5cGUoKSA6IG51bGw7CisgICAgICAgIG1ldGEuc2V0U291cmNlKGdldFNvdXJjZUZpbGUoKSwgc2NvcGUsIG1ldGEuU1JDX1hNTCk7CisgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgbWV0YS5zZXRTb3VyY2VNb2RlKE1PREVfTUVUQSk7CisgICAgICAgIGVsc2UgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX01BUFBJTkcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoTU9ERV9RVUVSWSk7CisgICAgICAgIHB1c2hFbGVtZW50KG1ldGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmROYW1lZFF1ZXJ5KCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHBvcEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydFF1ZXJ5U3RyaW5nKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRRdWVyeVN0cmluZygpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBRdWVyeU1ldGFEYXRhIG1ldGEgPSAoUXVlcnlNZXRhRGF0YSkgY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgbWV0YS5zZXRRdWVyeVN0cmluZyhjdXJyZW50VGV4dCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBxdWVyeS1oaW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0UXVlcnlIaW50KEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBRdWVyeU1ldGFEYXRhIG1ldGEgPSAoUXVlcnlNZXRhRGF0YSkgY3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgbWV0YS5hZGRIaW50KGF0dHJzLmdldFZhbHVlKCJuYW1lIiksIGF0dHJzLmdldFZhbHVlKCJ2YWx1ZSIpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kUXVlcnlIaW50KCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgbmF0aXZlLW5hbWVkLXF1ZXJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0TmFtZWROYXRpdmVRdWVyeShBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1F1ZXJ5TW9kZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgTG9nIGxvZyA9IGdldExvZygpOworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cudHJhY2UoX2xvYy5nZXQoInBhcnNlLW5hdGl2ZS1xdWVyeSIsIG5hbWUpKTsKKworICAgICAgICBRdWVyeU1ldGFEYXRhIG1ldGEgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0Q2FjaGVkUXVlcnlNZXRhRGF0YShudWxsLCBuYW1lKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLndhcm4oX2xvYy5nZXQoIm92ZXJyaWRlLXF1ZXJ5IiwgbmFtZSwgY3VycmVudExvY2F0aW9uKCkpKTsKKworICAgICAgICBtZXRhID0gZ2V0UmVwb3NpdG9yeSgpLmFkZFF1ZXJ5TWV0YURhdGEobnVsbCwgbmFtZSk7CisgICAgICAgIG1ldGEuc2V0RGVmaW5pbmdUeXBlKF9jbHMpOworICAgICAgICBtZXRhLnNldFF1ZXJ5U3RyaW5nKGF0dHJzLmdldFZhbHVlKCJxdWVyeSIpKTsKKyAgICAgICAgbWV0YS5zZXRMYW5ndWFnZShRdWVyeUxhbmd1YWdlcy5MQU5HX1NRTCk7CisgICAgICAgIFN0cmluZyB2YWwgPSBhdHRycy5nZXRWYWx1ZSgicmVzdWx0LWNsYXNzIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGNsYXNzRm9yTmFtZSh2YWwpOworICAgICAgICAgICAgaWYgKEltcGxIZWxwZXIuaXNNYW5hZ2VkVHlwZSh0eXBlKSkKKyAgICAgICAgICAgICAgICBtZXRhLnNldENhbmRpZGF0ZVR5cGUodHlwZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0YS5zZXRSZXN1bHRUeXBlKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXR0cnMuZ2V0VmFsdWUoInJlc3VsdC1zZXQtbWFwcGluZyIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpCisgICAgICAgICAgICBtZXRhLnNldFJlc3VsdFNldE1hcHBpbmdOYW1lKHZhbCk7CisKKyAgICAgICAgT2JqZWN0IGN1ciA9IGN1cnJlbnRFbGVtZW50KCk7CisgICAgICAgIE9iamVjdCBzY29wZSA9IChjdXIgaW5zdGFuY2VvZiBDbGFzc01ldGFEYXRhKQorICAgICAgICAgICAgPyAoKENsYXNzTWV0YURhdGEpIGN1cikuZ2V0RGVzY3JpYmVkVHlwZSgpIDogbnVsbDsKKyAgICAgICAgbWV0YS5zZXRTb3VyY2UoZ2V0U291cmNlRmlsZSgpLCBzY29wZSwgbWV0YS5TUkNfWE1MKTsKKyAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICBtZXRhLnNldFNvdXJjZU1vZGUoTU9ERV9NRVRBKTsKKyAgICAgICAgZWxzZSBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgbWV0YS5zZXRTb3VyY2VNb2RlKE1PREVfTUFQUElORyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1ldGEuc2V0U291cmNlTW9kZShNT0RFX1FVRVJZKTsKKyAgICAgICAgcHVzaEVsZW1lbnQobWV0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZE5hbWVkTmF0aXZlUXVlcnkoKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcG9wRWxlbWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGVudGl0eS1saXN0ZW5lcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRFbnRpdHlMaXN0ZW5lcnMoQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNNZXRhRGF0YU1vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIHJlc2V0IGxpc3RlbmVycyBkZWNsYXJlZCBpbiBhbm5vdGF0aW9ucy4KKyAgICAgICAgTGlmZWN5Y2xlTWV0YURhdGEgbWV0YSA9ICgoQ2xhc3NNZXRhRGF0YSkgY3VycmVudEVsZW1lbnQoKSkuCisgICAgICAgICAgICBnZXRMaWZlY3ljbGVNZXRhRGF0YSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBtZXRhLnNldERlY2xhcmVkQ2FsbGJhY2tzKGksIG51bGwsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IChDbGFzc01ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBtZXRhLmdldExpZmVjeWNsZU1ldGFEYXRhKCkuc2V0SWdub3JlU3lzdGVtTGlzdGVuZXJzKHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IChDbGFzc01ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpOworICAgICAgICBtZXRhLmdldExpZmVjeWNsZU1ldGFEYXRhKCkuc2V0SWdub3JlU3VwZXJjbGFzc0NhbGxiYWNrcworICAgICAgICAgICAgKExpZmVjeWNsZU1ldGFEYXRhLklHTk9SRV9ISUdIKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZW50aXR5LWxpc3RlbmVyLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydEVudGl0eUxpc3RlbmVyKEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBfbGlzdGVuZXIgPSBjbGFzc0Zvck5hbWUoYXR0cnMuZ2V0VmFsdWUoImNsYXNzIikpOworICAgICAgICBib29sZWFuIHN5c3RlbSA9IGN1cnJlbnRFbGVtZW50KCkgPT0gbnVsbDsKKyAgICAgICAgQ29sbGVjdGlvbjxMaWZlY3ljbGVDYWxsYmFja3M+W10gcGFyc2VkID0KKyAgICAgICAgICAgIEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyLnBhcnNlQ2FsbGJhY2tNZXRob2RzKF9saXN0ZW5lciwKKyAgICAgICAgICAgICAgICBudWxsLCB0cnVlLCB0cnVlLCBfcmVwb3MpOworICAgICAgICBpZiAocGFyc2VkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAoX2NhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICBfY2FsbGJhY2tzID0gKENvbGxlY3Rpb248TGlmZWN5Y2xlQ2FsbGJhY2tzPltdKQorICAgICAgICAgICAgICAgIG5ldyBDb2xsZWN0aW9uW0xpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFMubGVuZ3RoXTsKKyAgICAgICAgICAgIGlmICghc3lzdGVtKQorICAgICAgICAgICAgICAgIF9oaWdocyA9IG5ldyBpbnRbTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGhdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFyc2VkW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoX2NhbGxiYWNrc1tpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9jYWxsYmFja3NbaV0gPSBwYXJzZWRbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2NhbGxiYWNrc1tpXS5hZGRBbGwocGFyc2VkW2ldKTsKKyAgICAgICAgICAgIGlmICghc3lzdGVtKQorICAgICAgICAgICAgICAgIF9oaWdoc1tpXSArPSBwYXJzZWRbaV0uc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRFbnRpdHlMaXN0ZW5lcigpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAvLyBzaG91bGQgYmUgaW4gZW5kRW50aXR5TGlzdGVuZXJzIEkgdGhpbmsgdG8gbWVyZ2UgY2FsbGJhY2tzCisgICAgICAgIC8vIGludG8gYSBzaW5nbGUgbGlzdGVuZXIuICBCdXQgdGhlbiB0aGUgdXNlciBjYW5ub3QgcmVtb3ZlLgorICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQoKSA9PSBudWxsICYmIF9jYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgX3JlcG9zLmFkZFN5c3RlbUxpc3RlbmVyKG5ldyBQZXJzaXN0ZW5jZUxpc3RlbmVyQWRhcHRlcgorICAgICAgICAgICAgICAgIChfY2FsbGJhY2tzKSk7CisgICAgICAgICAgICBfY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBfbGlzdGVuZXIgPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydENhbGxiYWNrKE1ldGFEYXRhVGFnIGNhbGxiYWNrLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpbnRbXSBldmVudHMgPSBNZXRhRGF0YVBhcnNlcnMuZ2V0RXZlbnRUeXBlcyhjYWxsYmFjayk7CisgICAgICAgIGlmIChldmVudHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBib29sZWFuIHN5c3RlbSA9IGN1cnJlbnRFbGVtZW50KCkgPT0gbnVsbDsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGN1cnJlbnRFbGVtZW50KCkgPT0gbnVsbCA/IG51bGwgOgorICAgICAgICAgICAgKChDbGFzc01ldGFEYXRhKSBjdXJyZW50RWxlbWVudCgpKS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0eXBlID0gT2JqZWN0LmNsYXNzOworCisgICAgICAgIGlmIChfY2FsbGJhY2tzID09IG51bGwpIHsKKyAgICAgICAgICAgIF9jYWxsYmFja3MgPSAoQ29sbGVjdGlvbjxMaWZlY3ljbGVDYWxsYmFja3M+W10pCisgICAgICAgICAgICAgICAgbmV3IENvbGxlY3Rpb25bTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUy5sZW5ndGhdOworICAgICAgICAgICAgaWYgKCFzeXN0ZW0pCisgICAgICAgICAgICAgICAgX2hpZ2hzID0gbmV3IGludFtMaWZlY3ljbGVFdmVudC5BTExfRVZFTlRTLmxlbmd0aF07CisgICAgICAgIH0KKworICAgICAgICBNZXRhRGF0YURlZmF1bHRzIGRlZiA9IF9yZXBvcy5nZXRNZXRhRGF0YUZhY3RvcnkoKS5nZXREZWZhdWx0cygpOworICAgICAgICBMaWZlY3ljbGVDYWxsYmFja3MgYWRhcHRlcjsKKyAgICAgICAgaWYgKF9saXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgYWRhcHRlciA9IG5ldyBCZWFuTGlmZWN5Y2xlQ2FsbGJhY2tzKF9saXN0ZW5lciwKKyAgICAgICAgICAgICAgICBhdHRycy5nZXRWYWx1ZSgibWV0aG9kLW5hbWUiKSwgZmFsc2UsIHR5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGFwdGVyID0gbmV3IE1ldGhvZExpZmVjeWNsZUNhbGxiYWNrcyhfY2xzLAorICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKCJtZXRob2QtbmFtZSIpLCBmYWxzZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBldmVudCA9IGV2ZW50c1tpXTsKKyAgICAgICAgICAgIGlmIChfbGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1ldGFEYXRhUGFyc2Vycy52YWxpZGF0ZU1ldGhvZHNGb3JTYW1lQ2FsbGJhY2soX2xpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICBfY2FsbGJhY2tzW2V2ZW50XSwgKChCZWFuTGlmZWN5Y2xlQ2FsbGJhY2tzKSBhZGFwdGVyKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FsbGJhY2tNZXRob2QoKSwgY2FsbGJhY2ssIGRlZiwgZ2V0TG9nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRhRGF0YVBhcnNlcnMudmFsaWRhdGVNZXRob2RzRm9yU2FtZUNhbGxiYWNrKF9jbHMsCisgICAgICAgICAgICAgICAgICAgIF9jYWxsYmFja3NbZXZlbnRdLCAoKE1ldGhvZExpZmVjeWNsZUNhbGxiYWNrcykgYWRhcHRlcikuCisgICAgICAgICAgICAgICAgICAgIGdldENhbGxiYWNrTWV0aG9kKCksIGNhbGxiYWNrLCBkZWYsIGdldExvZygpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9jYWxsYmFja3NbZXZlbnRdID09IG51bGwpCisgICAgICAgICAgICAgICAgX2NhbGxiYWNrc1tldmVudF0gPSBuZXcgQXJyYXlMaXN0PExpZmVjeWNsZUNhbGxiYWNrcz4oMyk7CisgICAgICAgICAgICBfY2FsbGJhY2tzW2V2ZW50XS5hZGQoYWRhcHRlcik7CisgICAgICAgICAgICBpZiAoIXN5c3RlbSAmJiBfbGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaGlnaHNbZXZlbnRdKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgbGlmZWN5Y2xlIG1ldGFkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZUNhbGxiYWNrcyhDbGFzc01ldGFEYXRhIGNscykgeworICAgICAgICBMaWZlY3ljbGVNZXRhRGF0YSBtZXRhID0gY2xzLmdldExpZmVjeWNsZU1ldGFEYXRhKCk7CisgICAgICAgIENsYXNzIHN1cENscyA9IGNscy5nZXREZXNjcmliZWRUeXBlKCkuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBDb2xsZWN0aW9uPExpZmVjeWNsZUNhbGxiYWNrcz5bXSBzdXBDYWxscyA9IG51bGw7CisgICAgICAgIGlmICghT2JqZWN0LmNsYXNzLmVxdWFscyhzdXBDbHMpKSB7CisgICAgICAgICAgICBzdXBDYWxscyA9IEFubm90YXRpb25QZXJzaXN0ZW5jZU1ldGFEYXRhUGFyc2VyLnBhcnNlQ2FsbGJhY2tNZXRob2RzCisgICAgICAgICAgICAgICAgKHN1cENscywgbnVsbCwgdHJ1ZSwgZmFsc2UsIF9yZXBvcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1cENhbGxzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGV2ZW50IDogTGlmZWN5Y2xlRXZlbnQuQUxMX0VWRU5UUykgeworICAgICAgICAgICAgICAgIGlmIChzdXBDYWxsc1tldmVudF0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgbWV0YS5zZXROb25QQ1N1cGVyY2xhc3NDYWxsYmFja3MoZXZlbnQsIHN1cENhbGxzW2V2ZW50XS50b0FycmF5CisgICAgICAgICAgICAgICAgICAgIChuZXcgTGlmZWN5Y2xlQ2FsbGJhY2tzW3N1cENhbGxzW2V2ZW50XS5zaXplKCldKSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9jYWxsYmFja3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBldmVudCA6IExpZmVjeWNsZUV2ZW50LkFMTF9FVkVOVFMpIHsKKyAgICAgICAgICAgIGlmIChfY2FsbGJhY2tzW2V2ZW50XSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbWV0YS5zZXREZWNsYXJlZENhbGxiYWNrcyhldmVudCwgKExpZmVjeWNsZUNhbGxiYWNrc1tdKQorICAgICAgICAgICAgICAgIF9jYWxsYmFja3NbZXZlbnRdLnRvQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBMaWZlY3ljbGVDYWxsYmFja3NbX2NhbGxiYWNrc1tldmVudF0uc2l6ZSgpXSksCisgICAgICAgICAgICAgICAgX2hpZ2hzW2V2ZW50XSk7CisgICAgICAgIH0KKyAgICAgICAgX2NhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIF9oaWdocyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIGdpdmVuIGNsYXNzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBkZWZhdWx0IHBhY2thZ2UuCisJICovCisJcHJvdGVjdGVkIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkKKwkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCWlmICgiRW50aXR5Ii5lcXVhbHMobmFtZSkpCisJCQlyZXR1cm4gUGVyc2lzdGVuY2VDYXBhYmxlLmNsYXNzOworCQlyZXR1cm4gc3VwZXIuY2xhc3NGb3JOYW1lKG5hbWUsIGlzUnVudGltZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVNlcmlhbGl6ZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9YTUxQZXJzaXN0ZW5jZU1ldGFEYXRhU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTFjNzAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDE0NDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuUXVlcnlMYW5ndWFnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLkNvbmZpZ3VyYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIubG9nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLm1ldGEuQ0ZNZXRhRGF0YVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5tZXRhLlNvdXJjZVRyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi51dGlsLkphdmFWZXJzaW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnV0aWwuTG9jYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuTWV0YURhdGFJbmhlcml0YW5jZUNvbXBhcmF0b3I7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhTW9kZXMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuUXVlcnlNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5TZXF1ZW5jZU1ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IHNlcnAudXRpbC5TdHJpbmdzOworCisvKioKKyAqIFNlcmlhbGl6ZXMgcGVyc2lzdGVuY2UgbWV0YWRhdGEgYmFjayB0byBYTUwuCisgKiBUaGlzIGNsYXNzIHByb2Nlc3NlcyBhbGwgb2JqZWN0IGxldmVsIHRhZ3MgdGhhdCBhcmUgc3RvcmUtYWdub3N0aWMuCisgKiBIb3dldmVyLCBpdCBwcm92aWRlcyBob29rcyBmb3IgdGhlIHN1YmNsYXNzZXMgdG8gaW5jbHVkZSBzdG9yZS1zcGVjaWZpYworICogdGFncyB0byBiZSBzZXJpYWxpemVkIGJvdGggYXQgJmx0O2VudGl0eS1tYXBwaW5ncyZndDsgYW5kCisgKiAmbHQ7ZW50aXR5Jmd0OyBsZXZlbC4KKyAqCisgKiBAc2luY2UgMC40LjAKKyAqIEBhdXRob3IgU3RldmUgS2ltCisgKiBAbm9qYXZhZG9jCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhU2VyaWFsaXplcgorICAgIGV4dGVuZHMgQ0ZNZXRhRGF0YVNlcmlhbGl6ZXIKKyAgICBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5LlNlcmlhbGl6ZXIgeworCisgICAgLy8gTk9URTogb3JkZXIgaXMgaW1wb3J0YW50ISB0aGVzZSBjb25zdGFudHMgbXVzdCBiZSBtYWludGFpbmVkIGluCisgICAgLy8gc2VyaWFsaXphdGlvbiBvcmRlci4gY29uc3RhbnRzIGFyZSBzcGFjZWQgc28gdGhhdCBzdWJjbGFzc2VzIGNhbgorICAgIC8vIHNsaXAgdGFncyBpbi1iZXR3ZWVuCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRVEgPSAxMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUWVBFX1FVRVJZID0gMjA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NRVRBID0gMzA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DTEFTU19TRVFTID0gNDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DTEFTU19RVUVSSUVTID0gNTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgX2xvYyA9IExvY2FsaXplci5mb3JQYWNrYWdlCisgICAgICAgIChYTUxQZXJzaXN0ZW5jZU1ldGFEYXRhU2VyaWFsaXplci5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIE9wZW5KUEFDb25maWd1cmF0aW9uIF9jb25mOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ2xhc3NNZXRhRGF0YT4gX21ldGFzID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q+IF9xdWVyaWVzID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q+IF9zZXFzID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBfbW9kZSA9IE1PREVfTk9ORTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Fubm9zID0gdHJ1ZTsKKyAgICBwcml2YXRlIFNlcmlhbGl6YXRpb25Db21wYXJhdG9yIF9jb21wID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBTdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MUGVyc2lzdGVuY2VNZXRhRGF0YVNlcmlhbGl6ZXIoT3BlbkpQQUNvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgICAgIHNldExvZyhjb25mLmdldExvZyhPcGVuSlBBQ29uZmlndXJhdGlvbi5MT0dfTUVUQURBVEEpKTsKKyAgICAgICAgc2V0TW9kZShNT0RFX01FVEEgfCBNT0RFX01BUFBJTkcgfCBNT0RFX1FVRVJZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPcGVuSlBBQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gX2NvbmY7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBzZXJpYWxpemUgY29udGVudCBvcmlnaW5hbGx5IHNwZWNpZmllZCBpbiBhbm5vdGF0aW9ucy4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFNlcmlhbGl6ZUFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gX2Fubm9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc2VyaWFsaXplIGNvbnRlbnQgb3JpZ2luYWxseSBzcGVjaWZpZWQgaW4gYW5ub3RhdGlvbnMuCisgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJpYWxpemVBbm5vdGF0aW9ucyhib29sZWFuIGFubm9zKSB7CisgICAgICAgIF9hbm5vcyA9IGFubm9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJpYWxpemF0aW9uIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBleHBlY3RlZCBkb2N1bWVudCB0eXBlLiBUaGUKKyAgICAgKiBtb2RlIGNvbnN0YW50cyBhY3QgYXMgYml0IGZsYWdzLCBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjb21iaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGUoKSB7CisgICAgICAgIHJldHVybiBfbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VyaWFsaXphdGlvbiBtb2RlIGFjY29yZGluZyB0byB0aGUgZXhwZWN0ZWQgZG9jdW1lbnQgdHlwZS4gVGhlCisgICAgICogbW9kZSBjb25zdGFudHMgYWN0IGFzIGJpdCBmbGFncywgYW5kIHRoZXJlZm9yZSBjYW4gYmUgY29tYmluZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBfbW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcmlhbGl6YXRpb24gbW9kZSBhY2NvcmRpbmcgdG8gdGhlIGV4cGVjdGVkIGRvY3VtZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSwgYm9vbGVhbiBvbikgeworICAgICAgICBpZiAobW9kZSA9PSBNT0RFX05PTkUpCisgICAgICAgICAgICBzZXRNb2RlKE1PREVfTk9ORSk7CisgICAgICAgIGVsc2UgaWYgKG9uKQorICAgICAgICAgICAgc2V0TW9kZShfbW9kZSB8IG1vZGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRNb2RlKF9tb2RlICYgfm1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRvIG5vdCBvdmVyd3JpdGUgYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRmlsZShPYmplY3Qgb2JqKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IHN1cGVyLmdldFNvdXJjZUZpbGUob2JqKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKQorICAgICAgICAgICAgfHwgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhRGF0YU1vZGUoKSB7CisgICAgICAgIHJldHVybiAoX21vZGUgJiBNT0RFX01FVEEpICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbnRlcnByZXRpbmcge0BsaW5rICNnZXRNb2RlfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1ZXJ5TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIChfbW9kZSAmIE1PREVfUVVFUlkpICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbnRlcnByZXRpbmcge0BsaW5rICNnZXRNb2RlfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcHBpbmdNb2RlKCkgeworICAgICAgICByZXR1cm4gKF9tb2RlICYgTU9ERV9NQVBQSU5HKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uIFRha2VzIGludG8KKyAgICAgKiBhY2NvdW50IHdoZXRoZXIgbWFwcGluZyBpbmZvcm1hdGlvbiBpcyBsb2FkZWQgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcHBpbmdNb2RlKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gaXNNYXBwaW5nTW9kZSgpICYmIChtZXRhLmdldFNvdXJjZU1vZGUoKSAmIE1PREVfTUFQUElORykgIT0gMAorICAgICAgICAgICAgJiYgKG1ldGEuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSAhPSBudWxsCisgICAgICAgICAgICB8fCAhbWV0YS5pc0VtYmVkZGVkT25seSgpKQorICAgICAgICAgICAgJiYgKG1ldGEuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSA9PSBudWxsCisgICAgICAgICAgICB8fCBpc01hcHBpbmdNb2RlKG1ldGEuZ2V0RW1iZWRkaW5nTWV0YURhdGEoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW50ZXJwcmV0aW5nIHtAbGluayAjZ2V0TW9kZX0uIFRha2VzIGludG8KKyAgICAgKiBhY2NvdW50IHdoZXRoZXIgbWFwcGluZyBpbmZvcm1hdGlvbiBpcyBsb2FkZWQgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcHBpbmdNb2RlKFZhbHVlTWV0YURhdGEgdm1kKSB7CisgICAgICAgIHJldHVybiBpc01hcHBpbmdNb2RlKHZtZC5nZXRGaWVsZE1ldGFEYXRhKCkuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjbGFzcyBtZXRhIGRhdGEgdG8gdGhlIHNldCB0byBiZSBzZXJpYWxpemVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAobWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChfbWV0YXMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9tZXRhcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3NNZXRhRGF0YT4oKTsKKyAgICAgICAgX21ldGFzLnB1dChtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCksIG1ldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlcXVlbmNlIG1ldGEgZGF0YSB0byB0aGUgc2V0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VxdWVuY2VNZXRhRGF0YShTZXF1ZW5jZU1ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBMaXN0IHNlcXMgPSBudWxsOworICAgICAgICBTdHJpbmcgZGVmTmFtZSA9IG51bGw7CisgICAgICAgIGlmIChtZXRhLmdldFNvdXJjZVNjb3BlKCkgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIGRlZk5hbWUgPSAoKENsYXNzKSBtZXRhLmdldFNvdXJjZVNjb3BlKCkpLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKF9zZXFzID09IG51bGwpCisgICAgICAgICAgICBfc2VxcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdD4oKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VxcyA9IF9zZXFzLmdldChkZWZOYW1lKTsKKworICAgICAgICBpZiAoc2VxcyA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXFzID0gbmV3IEFycmF5TGlzdCgzKTsgLy8gZG9uJ3QgZXhwZWN0IG1hbnkgc2VxcyAvIGNsYXNzCisgICAgICAgICAgICBzZXFzLmFkZChtZXRhKTsKKyAgICAgICAgICAgIF9zZXFzLnB1dChkZWZOYW1lLCBzZXFzKTsKKyAgICAgICAgfSBlbHNlIGlmICghc2Vxcy5jb250YWlucyhtZXRhKSkKKyAgICAgICAgICAgIHNlcXMuYWRkKG1ldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHF1ZXJ5IG1ldGEgZGF0YSB0byB0aGUgc2V0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUXVlcnlNZXRhRGF0YShRdWVyeU1ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBMaXN0IHF1ZXJpZXMgPSBudWxsOworICAgICAgICBTdHJpbmcgZGVmTmFtZSA9IG51bGw7CisgICAgICAgIGlmIChtZXRhLmdldFNvdXJjZVNjb3BlKCkgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIGRlZk5hbWUgPSAoKENsYXNzKSBtZXRhLmdldFNvdXJjZVNjb3BlKCkpLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKF9xdWVyaWVzID09IG51bGwpCisgICAgICAgICAgICBfcXVlcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdD4oKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcXVlcmllcyA9IF9xdWVyaWVzLmdldChkZWZOYW1lKTsKKworICAgICAgICBpZiAocXVlcmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICBxdWVyaWVzID0gbmV3IEFycmF5TGlzdCgzKTsgLy8gZG9uJ3QgZXhwZWN0IG1hbnkgcXVlcmllcyAvIGNsYXNzCisgICAgICAgICAgICBxdWVyaWVzLmFkZChtZXRhKTsKKyAgICAgICAgICAgIF9xdWVyaWVzLnB1dChkZWZOYW1lLCBxdWVyaWVzKTsKKyAgICAgICAgfSBlbHNlIGlmICghcXVlcmllcy5jb250YWlucyhtZXRhKSkKKyAgICAgICAgICAgIHF1ZXJpZXMuYWRkKG1ldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbGwgY29tcG9uZW50cyBpbiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSB0byB0aGUgc2V0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxsKE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBpZiAocmVwb3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKENsYXNzTWV0YURhdGEgbWV0YSA6IHJlcG9zLmdldE1ldGFEYXRhcygpKQorICAgICAgICAgICAgYWRkTWV0YURhdGEobWV0YSk7CisgICAgICAgIGZvciAoU2VxdWVuY2VNZXRhRGF0YSBzZXEgOiByZXBvcy5nZXRTZXF1ZW5jZU1ldGFEYXRhcygpKQorICAgICAgICAgICAgYWRkU2VxdWVuY2VNZXRhRGF0YShzZXEpOworICAgICAgICBmb3IgKFF1ZXJ5TWV0YURhdGEgcXVlcnkgOiByZXBvcy5nZXRRdWVyeU1ldGFEYXRhcygpKQorICAgICAgICAgICAgYWRkUXVlcnlNZXRhRGF0YShxdWVyeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbWV0YWRhdGEgZnJvbSB0aGUgc2V0IHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGluIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU1ldGFEYXRhKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICByZXR1cm4gX21ldGFzICE9IG51bGwgJiYgbWV0YSAhPSBudWxsCisgICAgICAgICAgICAmJiBfbWV0YXMucmVtb3ZlKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE5hbWUoKSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzZXF1ZW5jZSBtZXRhZGF0YSBmcm9tIHRoZSBzZXQgdG8gYmUgc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByZW1vdmVkLCBmYWxzZSBpZiBub3QgaW4gc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlU2VxdWVuY2VNZXRhRGF0YShTZXF1ZW5jZU1ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgaWYgKF9zZXFzID09IG51bGwgfHwgbWV0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgZGVmTmFtZSA9IG51bGw7CisgICAgICAgIGlmIChtZXRhLmdldFNvdXJjZVNjb3BlKCkgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgIGRlZk5hbWUgPSAoKENsYXNzKSBtZXRhLmdldFNvdXJjZVNjb3BlKCkpLmdldE5hbWUoKTsKKyAgICAgICAgTGlzdCBzZXFzID0gX3NlcXMuZ2V0KGRlZk5hbWUpOworICAgICAgICBpZiAoc2VxcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXNlcXMucmVtb3ZlKG1ldGEpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoc2Vxcy5pc0VtcHR5KCkpCisgICAgICAgICAgICBfc2Vxcy5yZW1vdmUoZGVmTmFtZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHF1ZXJ5IG1ldGFkYXRhIGZyb20gdGhlIHNldCB0byBiZSBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBpbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVRdWVyeU1ldGFEYXRhKFF1ZXJ5TWV0YURhdGEgbWV0YSkgeworICAgICAgICBpZiAoX3F1ZXJpZXMgPT0gbnVsbCB8fCBtZXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFN0cmluZyBkZWZOYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKG1ldGEuZ2V0U291cmNlU2NvcGUoKSBpbnN0YW5jZW9mIENsYXNzKQorICAgICAgICAgICAgZGVmTmFtZSA9ICgoQ2xhc3MpIG1ldGEuZ2V0U291cmNlU2NvcGUoKSkuZ2V0TmFtZSgpOworICAgICAgICBMaXN0IHF1ZXJpZXMgPSBfcXVlcmllcy5nZXQoZGVmTmFtZSk7CisgICAgICAgIGlmIChxdWVyaWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghcXVlcmllcy5yZW1vdmUobWV0YSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChxdWVyaWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIF9xdWVyaWVzLnJlbW92ZShkZWZOYW1lKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB0aGUgY29tcG9uZW50cyBpbiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBmcm9tIHRoZSBzZXQgdG8gYmUKKyAgICAgKiBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBjb21wb25lbnRzIHJlbW92ZWQsIGZhbHNlIGlmIG5vbmUgaW4gc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKE1ldGFEYXRhUmVwb3NpdG9yeSByZXBvcykgeworICAgICAgICBpZiAocmVwb3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgQ2xhc3NNZXRhRGF0YVtdIG1ldGFzID0gcmVwb3MuZ2V0TWV0YURhdGFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVkIHw9IHJlbW92ZU1ldGFEYXRhKG1ldGFzW2ldKTsKKyAgICAgICAgU2VxdWVuY2VNZXRhRGF0YVtdIHNlcXMgPSByZXBvcy5nZXRTZXF1ZW5jZU1ldGFEYXRhcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZW1vdmVkIHw9IHJlbW92ZVNlcXVlbmNlTWV0YURhdGEoc2Vxc1tpXSk7CisgICAgICAgIFF1ZXJ5TWV0YURhdGFbXSBxdWVyaWVzID0gcmVwb3MuZ2V0UXVlcnlNZXRhRGF0YXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVtb3ZlZCB8PSByZW1vdmVRdWVyeU1ldGFEYXRhKHF1ZXJpZXNbaV0pOworICAgICAgICByZXR1cm4gcmVtb3ZlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgc2V0IG9mIG1ldGFkYXRhcyB0byBiZSBzZXJpYWxpemVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBpZiAoX21ldGFzICE9IG51bGwpCisgICAgICAgICAgICBfbWV0YXMuY2xlYXIoKTsKKyAgICAgICAgaWYgKF9zZXFzICE9IG51bGwpCisgICAgICAgICAgICBfc2Vxcy5jbGVhcigpOworICAgICAgICBpZiAoX3F1ZXJpZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9xdWVyaWVzLmNsZWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0T2JqZWN0cygpIHsKKyAgICAgICAgTGlzdCBhbGwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChpc1F1ZXJ5TW9kZSgpKQorICAgICAgICAgICAgYWRkUXVlcnlNZXRhRGF0YXMoYWxsKTsKKyAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgIGFkZFNlcXVlbmNlTWV0YURhdGFzKGFsbCk7CisgICAgICAgIGlmICgoaXNNZXRhRGF0YU1vZGUoKSB8fCBpc01hcHBpbmdNb2RlKCkpICYmIF9tZXRhcyAhPSBudWxsKQorICAgICAgICAgICAgYWxsLmFkZEFsbChfbWV0YXMudmFsdWVzKCkpOworICAgICAgICBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgYWRkU3lzdGVtTWFwcGluZ0VsZW1lbnRzKGFsbCk7CisgICAgICAgIHNlcmlhbGl6YXRpb25Tb3J0KGFsbCk7CisgICAgICAgIHJldHVybiBhbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHN5c3RlbS1sZXZlbCBtYXBwaW5nIGVsZW1lbnRzIHRvIGJlIHNlcmlhbGl6ZWQuIERvZXMgbm90aGluZworICAgICAqIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkU3lzdGVtTWFwcGluZ0VsZW1lbnRzKENvbGxlY3Rpb24gdG9TZXJpYWxpemUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb3J0IHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gYmUgc2VyaWFsaXplZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXphdGlvblNvcnQoTGlzdCBvYmpzKSB7CisgICAgICAgIGlmIChvYmpzID09IG51bGwgfHwgb2Jqcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChfY29tcCA9PSBudWxsKQorICAgICAgICAgICAgX2NvbXAgPSBuZXdTZXJpYWxpemF0aW9uQ29tcGFyYXRvcigpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG9ianMsIF9jb21wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY29tcGFyYXRvciBmb3Igb3JkZXJpbmcgb2JqZWN0cyB0aGF0IGFyZSB0byBiZSBzZXJpYWxpemVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXJpYWxpemF0aW9uQ29tcGFyYXRvciBuZXdTZXJpYWxpemF0aW9uQ29tcGFyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIF9jb21wOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBzZXF1ZW5jZSBtZXRhZGF0YSB0byB0aGUgZ2l2ZW4gbWV0YWRhdGFzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFNlcXVlbmNlTWV0YURhdGFzKENvbGxlY3Rpb24gYWxsKSB7CisgICAgICAgIGlmIChfc2VxcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoTWFwLkVudHJ5IGVudHJ5IDogX3NlcXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgYWxsLmFkZEFsbCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBlbHNlIGlmIChfbWV0YXMgPT0gbnVsbCB8fCAhX21ldGFzLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICBhbGwuYWRkKG5ldyBDbGFzc1NlcXMoKExpc3Q8U2VxdWVuY2VNZXRhRGF0YT4pCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBxdWVyeSBtZXRhZGF0YSB0byB0aGUgZ2l2ZW4gbWV0YWRhdGFzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFF1ZXJ5TWV0YURhdGFzKENvbGxlY3Rpb24gYWxsKSB7CisgICAgICAgIGlmIChfcXVlcmllcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoTWFwLkVudHJ5IGVudHJ5IDogX3F1ZXJpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgYWxsLmFkZEFsbCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBlbHNlIGlmIChfbW9kZSA9PSBNT0RFX1FVRVJZIHx8IF9tZXRhcyA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgIV9tZXRhcy5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgYWxsLmFkZChuZXcgQ2xhc3NRdWVyaWVzKChMaXN0PFF1ZXJ5TWV0YURhdGE+KQorICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoQ29sbGVjdGlvbiBvYmplY3RzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29weSBjb2xsZWN0aW9uIHRvIGF2b2lkIG11dGF0aW9uCisgICAgICAgIE9iamVjdCBtZXRhOworICAgICAgICBib29sZWFuIHVuaXF1ZSA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gZmllbGRBY2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBwcm9wZXJ0eUFjY2VzcyA9IGZhbHNlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBtZXRhID0gaXQubmV4dCgpOworICAgICAgICAgICAgc3dpdGNoICh0eXBlKG1ldGEpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX01FVEE6CisgICAgICAgICAgICAgICAgICAgIENsYXNzTWV0YURhdGEgY2xzID0gKENsYXNzTWV0YURhdGEpIG1ldGE7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbHMuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRBY2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZSAmJiBnZXRQYWNrYWdlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhY2thZ2UoZ2V0UGFja2FnZShtZXRhKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaXF1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlID0gZ2V0UGFja2FnZSgpLmVxdWFscyhnZXRQYWNrYWdlKG1ldGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pcXVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhY2thZ2UobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNlcmlhbGl6ZU5hbWVzcGFjZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgc3RhcnRFbGVtZW50KCJlbnRpdHktbWFwcGluZ3MiKTsKKyAgICAgICAgaWYgKGdldFBhY2thZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoInBhY2thZ2UiKTsKKyAgICAgICAgICAgIGFkZFRleHQoZ2V0UGFja2FnZSgpKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoInBhY2thZ2UiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGRBY2Nlc3MgIT0gcHJvcGVydHlBY2Nlc3MpIC8vIGkuZS4gb25seSBvbmUKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlZiA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRNZXRhRGF0YVJlcG9zaXRvcnlJbnN0YW5jZSgpLgorICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhRmFjdG9yeSgpLmdldERlZmF1bHRzKCkuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBhY2Nlc3MgPSBudWxsOworICAgICAgICAgICAgaWYgKGZpZWxkQWNjZXNzICYmIGRlZiA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19QUk9QRVJUWSkKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSAiRklFTEQiOworICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlBY2Nlc3MgJiYgZGVmID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKQorICAgICAgICAgICAgICAgIGFjY2VzcyA9ICJQUk9QRVJUWSI7CisgICAgICAgICAgICBpZiAoYWNjZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFydEVsZW1lbnQoImFjY2VzcyIpOworICAgICAgICAgICAgICAgIGFkZFRleHQoYWNjZXNzKTsKKyAgICAgICAgICAgICAgICBlbmRFbGVtZW50KCJhY2Nlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBvYmplY3RzKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IHR5cGUob2JqKTsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9NRVRBOgorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVDbGFzcygoQ2xhc3NNZXRhRGF0YSkgb2JqLCBmaWVsZEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgJiYgcHJvcGVydHlBY2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0VROgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplU2VxdWVuY2UoKFNlcXVlbmNlTWV0YURhdGEpIG9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1FVRVJZOgorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVRdWVyeSgoUXVlcnlNZXRhRGF0YSkgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0NMQVNTX1FVRVJJRVM6CisgICAgICAgICAgICAgICAgICAgIGZvciAoUXVlcnlNZXRhRGF0YSBxdWVyeSA6ICgoQ2xhc3NRdWVyaWVzKSBvYmopCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UXVlcmllcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplUXVlcnkocXVlcnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfQ0xBU1NfU0VRUzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU2VxdWVuY2VNZXRhRGF0YSBzZXEgOiAoKENsYXNzU2Vxcykgb2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXF1ZW5jZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVTZXF1ZW5jZShzZXEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplU3lzdGVtTWFwcGluZ0VsZW1lbnQob2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW5kRWxlbWVudCgiZW50aXR5LW1hcHBpbmdzIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlKE9iamVjdCBvYmopIHsKKyAgICAgICAgaW50IHR5cGUgPSB0eXBlKG9iaik7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUWVBFX01FVEE6CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoKChDbGFzc01ldGFEYXRhKSBvYmopLgorICAgICAgICAgICAgICAgICAgICBnZXREZXNjcmliZWRUeXBlKCkpOworICAgICAgICAgICAgY2FzZSBUWVBFX1FVRVJZOgorICAgICAgICAgICAgY2FzZSBUWVBFX1NFUToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DTEFTU19RVUVSSUVTOgorICAgICAgICAgICAgY2FzZSBUWVBFX0NMQVNTX1NFUVM6CisgICAgICAgICAgICAgICAgU291cmNlVHJhY2tlciBzdCA9IChTb3VyY2VUcmFja2VyKSBvYmo7CisgICAgICAgICAgICAgICAgaWYgKHN0LmdldFNvdXJjZVNjb3BlKCkgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ3MuZ2V0UGFja2FnZU5hbWUoKENsYXNzKSBzdC5nZXRTb3VyY2VTY29wZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR5cGUgY29uc3RhbnQgZm9yIHRoZSBnaXZlbiBvYmplY3QgYmFzZWQgb24gaXRzIHJ1bnRpbWUKKyAgICAgKiBjbGFzcy4gSWYgdGhlIHJ1bnRpbWUgY2xhc3MgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgb2YgdGhlIGtub3duCisgICAgICogdHlwZXMgdGhlbiByZXR1cm5zIC0xLiBUaGlzIGNhbiBoYXBwZW4gZm9yIHRhZ3MKKyAgICAgKiB0aGF0IGFyZSBub3QgaGFuZGxlZCBhdCB0aGlzIHN0b3JlLWFnbm9zdGljIGxldmVsLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgdHlwZShPYmplY3QgbykgeworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIENsYXNzTWV0YURhdGEpCisgICAgICAgICAgICByZXR1cm4gVFlQRV9NRVRBOworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFF1ZXJ5TWV0YURhdGEpCisgICAgICAgICAgICByZXR1cm4gVFlQRV9RVUVSWTsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTZXF1ZW5jZU1ldGFEYXRhKQorICAgICAgICAgICAgcmV0dXJuIFRZUEVfU0VROworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIENsYXNzUXVlcmllcykKKyAgICAgICAgICAgIHJldHVybiBUWVBFX0NMQVNTX1FVRVJJRVM7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2xhc3NTZXFzKQorICAgICAgICAgICAgcmV0dXJuIFRZUEVfQ0xBU1NfU0VRUzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBuYW1lc3BhY2UgYXR0cmlidXRlcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVOYW1lc3BhY2VBdHRyaWJ1dGVzKCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgieG1sbnMiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIik7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgieG1sbnM6eHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgieHNpOnNjaGVtYUxvY2F0aW9uIiwKKyAgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0gb3JtXzFfMC54c2QiKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjEuMCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSB1bmtub3duIG1hcHBpbmcgZWxlbWVudCBhdCBzeXN0ZW0gbGV2ZWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplU3lzdGVtTWFwcGluZ0VsZW1lbnQoT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHF1ZXJ5IG1ldGFkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVRdWVyeShRdWVyeU1ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIV9hbm5vcyAmJiBtZXRhLmdldFNvdXJjZVR5cGUoKSA9PSBtZXRhLlNSQ19BTk5PVEFUSU9OUykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAobWV0YS5nZXRTb3VyY2VTY29wZSgpIGluc3RhbmNlb2YgQ2xhc3MpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInNlci1jbHMtcXVlcnkiLAorICAgICAgICAgICAgICAgICAgICBtZXRhLmdldFNvdXJjZVNjb3BlKCksIG1ldGEuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInNlci1xdWVyeSIsIG1ldGEuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRDb21tZW50cyhtZXRhKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJuYW1lIiwgbWV0YS5nZXROYW1lKCkpOworICAgICAgICBhZGRBdHRyaWJ1dGUoInF1ZXJ5IiwgbWV0YS5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgaWYgKFF1ZXJ5TGFuZ3VhZ2VzLkxBTkdfU1FMLmVxdWFscyhtZXRhLmdldExhbmd1YWdlKCkpKSB7CisgICAgICAgICAgICBpZiAobWV0YS5nZXRSZXN1bHRUeXBlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInJlc3VsdC1jbGFzcyIsIG1ldGEuZ2V0UmVzdWx0VHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoIm5hbWVkLW5hdGl2ZS1xdWVyeSIpOworICAgICAgICAgICAgc2VyaWFsaXplUXVlcnlIaW50cyhtZXRhKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoIm5hbWVkLW5hdGl2ZS1xdWVyeSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCJuYW1lZC1xdWVyeSIpOworICAgICAgICAgICAgc2VyaWFsaXplUXVlcnlIaW50cyhtZXRhKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoIm5hbWVkLXF1ZXJ5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgcXVlcnkgaGludHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZVF1ZXJ5SGludHMoUXVlcnlNZXRhRGF0YSBtZXRhKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gaGludHMgPSBtZXRhLmdldEhpbnRLZXlzKCk7CisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG1ldGEuZ2V0SGludFZhbHVlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBoaW50c1tpXSk7CisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInZhbHVlIiwgU3RyaW5nLnZhbHVlT2YodmFsdWVzW2ldKSk7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoInF1ZXJ5LWhpbnQiKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoInF1ZXJ5LWhpbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBzZXF1ZW5jZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemVTZXF1ZW5jZShTZXF1ZW5jZU1ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIV9hbm5vcyAmJiBtZXRhLmdldFNvdXJjZVR5cGUoKSA9PSBtZXRhLlNSQ19BTk5PVEFUSU9OUykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInNlci1zZXF1ZW5jZSIsIG1ldGEuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgYWRkQ29tbWVudHMobWV0YSk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIG1ldGEuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBwYXJzZSBvdXQgdGhlIGRhdGFzdG9yZSBzZXF1ZW5jZSBuYW1lLCBpZiBhbnkKKyAgICAgICAgU3RyaW5nIHBsdWdpbiA9IG1ldGEuZ2V0U2VxdWVuY2VQbHVnaW4oKTsKKyAgICAgICAgU3RyaW5nIGNsc05hbWUgPSBDb25maWd1cmF0aW9ucy5nZXRDbGFzc05hbWUocGx1Z2luKTsKKyAgICAgICAgU3RyaW5nIHByb3BzID0gQ29uZmlndXJhdGlvbnMuZ2V0UHJvcGVydGllcyhwbHVnaW4pOworICAgICAgICBTdHJpbmcgZHMgPSBudWxsOworICAgICAgICBpZiAocHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgUHJvcGVydGllcyBtYXAgPSBDb25maWd1cmF0aW9ucy5wYXJzZVByb3BlcnRpZXMocHJvcHMpOworICAgICAgICAgICAgZHMgPSAoU3RyaW5nKSBtYXAucmVtb3ZlKCJTZXF1ZW5jZSIpOworICAgICAgICAgICAgaWYgKGRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9wcyA9IENvbmZpZ3VyYXRpb25zLnNlcmlhbGl6ZVByb3BlcnRpZXMobWFwKTsKKyAgICAgICAgICAgICAgICBwbHVnaW4gPSBDb25maWd1cmF0aW9ucy5nZXRQbHVnaW4oY2xzTmFtZSwgcHJvcHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzICE9IG51bGwpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInNlcXVlbmNlLW5hbWUiLCBkcyk7CisgICAgICAgIGVsc2UgaWYgKHBsdWdpbiAhPSBudWxsICYmICFTZXF1ZW5jZU1ldGFEYXRhLklNUExfTkFUSVZFLmVxdWFscworICAgICAgICAgICAgKHBsdWdpbikpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInNlcXVlbmNlLW5hbWUiLCBwbHVnaW4pOworICAgICAgICBpZiAobWV0YS5nZXRJbml0aWFsVmFsdWUoKSAhPSAwICYmIG1ldGEuZ2V0SW5pdGlhbFZhbHVlKCkgIT0gLTEpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImluaXRpYWwtdmFsdWUiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG1ldGEuZ2V0SW5pdGlhbFZhbHVlKCkpKTsKKyAgICAgICAgaWYgKG1ldGEuZ2V0QWxsb2NhdGUoKSAhPSA1MCAmJiBtZXRhLmdldEFsbG9jYXRlKCkgIT0gLTEpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImFsbG9jYXRpb24tc2l6ZSIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YobWV0YS5nZXRBbGxvY2F0ZSgpKSk7CisKKyAgICAgICAgc3RhcnRFbGVtZW50KCJzZXF1ZW5jZS1nZW5lcmF0b3IiKTsKKyAgICAgICAgZW5kRWxlbWVudCgic2VxdWVuY2UtZ2VuZXJhdG9yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIGNsYXNzIG1ldGFkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZUNsYXNzKENsYXNzTWV0YURhdGEgbWV0YSwgYm9vbGVhbiBhY2Nlc3MpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIV9hbm5vcyAmJiBtZXRhLmdldFNvdXJjZVR5cGUoKSA9PSBtZXRhLlNSQ19BTk5PVEFUSU9OUykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmluZm8oX2xvYy5nZXQoInNlci1jbGFzcyIsIG1ldGEpKTsKKworICAgICAgICBhZGRDb21tZW50cyhtZXRhKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJjbGFzcyIsIGdldENsYXNzTmFtZShtZXRhLmdldERlc2NyaWJlZFR5cGUoKS4KKyAgICAgICAgICAgIGdldE5hbWUoKSkpOworCisgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpCisgICAgICAgICAgICAmJiAhbWV0YS5nZXRUeXBlQWxpYXMoKS5lcXVhbHMoU3RyaW5ncy5nZXRDbGFzc05hbWUobWV0YS4KKyAgICAgICAgICAgIGdldERlc2NyaWJlZFR5cGUoKSkpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJuYW1lIiwgbWV0YS5nZXRUeXBlQWxpYXMoKSk7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRFbnRpdHlFbGVtZW50TmFtZShtZXRhKTsKKyAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICBhZGRDbGFzc0F0dHJpYnV0ZXMobWV0YSwgYWNjZXNzKTsKKyAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgIGFkZENsYXNzTWFwcGluZ0F0dHJpYnV0ZXMobWV0YSk7CisKKyAgICAgICAgc3RhcnRFbGVtZW50KG5hbWUpOworICAgICAgICBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgc2VyaWFsaXplQ2xhc3NNYXBwaW5nQ29udGVudChtZXRhKTsKKyAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICBzZXJpYWxpemVJZENsYXNzKG1ldGEpOworICAgICAgICBpZiAoaXNNYXBwaW5nTW9kZSgpKQorICAgICAgICAgICAgc2VyaWFsaXplSW5oZXJpdGFuY2VDb250ZW50KG1ldGEpOworCisgICAgICAgIGlmIChpc01hcHBpbmdNb2RlKCkpIHsKKyAgICAgICAgICAgIExpc3Qgc2VxcyA9IChfc2VxcyA9PSBudWxsKSA/IG51bGwgOiBfc2Vxcy5nZXQKKyAgICAgICAgICAgICAgICAobWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChzZXFzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uU29ydChzZXFzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcXMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVNlcXVlbmNlKChTZXF1ZW5jZU1ldGFEYXRhKSBzZXFzLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNRdWVyeU1vZGUoKSkgeworICAgICAgICAgICAgTGlzdCBxdWVyaWVzID0gKF9xdWVyaWVzID09IG51bGwpID8gbnVsbCA6IF9xdWVyaWVzLmdldAorICAgICAgICAgICAgICAgIChtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKHF1ZXJpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb25Tb3J0KHF1ZXJpZXMpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplUXVlcnkoKFF1ZXJ5TWV0YURhdGEpIHF1ZXJpZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc01hcHBpbmdNb2RlKCkpCisgICAgICAgICAgICAgICAgc2VyaWFsaXplUXVlcnlNYXBwaW5ncyhtZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8RmllbGRNZXRhRGF0YT4gZmllbGRzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0CisgICAgICAgICAgICAobWV0YS5nZXREZWZpbmVkRmllbGRzSW5MaXN0aW5nT3JkZXIoKSkpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGZpZWxkcywgbmV3IEZpZWxkQ29tcGFyYXRvcigpKTsKKworICAgICAgICAvLyBzZXJpYWxpemUgYXR0ci1vdmVycmlkZQorICAgICAgICBpZiAoaXNNYXBwaW5nTW9kZSgpKSB7CisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhIGZtZDsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgb3JpZzsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RmllbGRNZXRhRGF0YT4gaXQgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbWQgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEuZ2V0RGVmaW5lZFN1cGVyY2xhc3NGaWVsZChmbWQuZ2V0TmFtZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBvcmlnID0gbWV0YS5nZXRQQ1N1cGVyY2xhc3NNZXRhRGF0YSgpLmdldEZpZWxkKGZtZC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVBdHRyaWJ1dGVPdmVycmlkZShmbWQsIG9yaWcpKQorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVBdHRyaWJ1dGVPdmVycmlkZUNvbnRlbnQoZm1kLCBvcmlnKTsKKyAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCAmJiAoaXNNZXRhRGF0YU1vZGUoKSB8fCBpc01hcHBpbmdNb2RlKCkpKSB7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoImF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgb3JpZzsKKyAgICAgICAgICAgIGZvciAoRmllbGRNZXRhRGF0YSBmbWQgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm1kLmdldERlY2xhcmluZ1R5cGUoKSAhPSBmbWQuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLgorICAgICAgICAgICAgICAgICAgICBnZXREZXNjcmliZWRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3JpZyA9IGZtZC5nZXREZWNsYXJpbmdNZXRhRGF0YSgpLmdldERlY2xhcmVkRmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbWQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3JpZyA9IG51bGw7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplRmllbGQoZm1kLCBvcmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZEVsZW1lbnQoImF0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBlbmRFbGVtZW50KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW50aXR5IGVsZW1lbnQgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW50aXR5RWxlbWVudE5hbWUoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0RW50aXR5VGFnKG1ldGEpKSB7CisgICAgICAgICAgICBjYXNlIEVOVElUWToKKyAgICAgICAgICAgICAgICByZXR1cm4gImVudGl0eSI7CisgICAgICAgICAgICBjYXNlIEVNQkVEREFCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbWJlZGRhYmxlIjsKKyAgICAgICAgICAgIGNhc2UgTUFQUEVEX1NVUEVSQ0xBU1M6CisgICAgICAgICAgICAgICAgcmV0dXJuICJtYXBwZWQtc3VwZXJjbGFzcyI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWV0YURhdGFUYWcgZm9yIHRoZSBnaXZlbiBjbGFzcyBtZXRhIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0YURhdGFUYWcgZ2V0RW50aXR5VGFnKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICAvLyBARW1iZWRkYWJsZSBjbGFzc2VzIGNhbid0IGRlY2xhcmUgSWQgZmllbGRzCisgICAgICAgIGlmIChtZXRhLmlzRW1iZWRkZWRPbmx5KCkgJiYgbWV0YS5nZXRQcmltYXJ5S2V5RmllbGRzKCkubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gTWV0YURhdGFUYWcuRU1CRUREQUJMRTsKKyAgICAgICAgaWYgKG1ldGEuaXNNYXBwZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBNZXRhRGF0YVRhZy5FTlRJVFk7CisgICAgICAgIHJldHVybiBNZXRhRGF0YVRhZy5NQVBQRURfU1VQRVJDTEFTUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY2xhc3MgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3Mgd2hldGhlciB0byB3cml0ZSBhY2Nlc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkQ2xhc3NBdHRyaWJ1dGVzKENsYXNzTWV0YURhdGEgbWV0YSwgYm9vbGVhbiBhY2Nlc3MpIHsKKyAgICAgICAgaWYgKCFhY2Nlc3MpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGludCBkZWYgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgIGdldE1ldGFEYXRhRmFjdG9yeSgpLmdldERlZmF1bHRzKCkuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKTsKKyAgICAgICAgaWYgKG1ldGEuZ2V0QWNjZXNzVHlwZSgpID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxECisgICAgICAgICAgICAmJiBkZWYgPT0gQ2xhc3NNZXRhRGF0YS5BQ0NFU1NfUFJPUEVSVFkpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoImFjY2VzcyIsICJGSUVMRCIpOworICAgICAgICBlbHNlIGlmIChtZXRhLmdldEFjY2Vzc1R5cGUoKSA9PSBDbGFzc01ldGFEYXRhLkFDQ0VTU19QUk9QRVJUWQorICAgICAgICAgICAgJiYgZGVmID09IENsYXNzTWV0YURhdGEuQUNDRVNTX0ZJRUxEKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJhY2Nlc3MiLCAiUFJPUEVSVFkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbWFwcGluZyBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gY2xhc3MuIERvZXMgbm90aGluZyBieSBkZWZhdWx0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2xhc3NNYXBwaW5nQXR0cmlidXRlcyhDbGFzc01ldGFEYXRhIG1hcHBpbmcpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBpZC1jbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplSWRDbGFzcyhDbGFzc01ldGFEYXRhIG1ldGEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAobWV0YS5nZXRJZGVudGl0eVR5cGUoKSAhPSBDbGFzc01ldGFEYXRhLklEX0FQUExJQ0FUSU9OCisgICAgICAgICAgICB8fCBtZXRhLmlzT3BlbkpQQUlkZW50aXR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2xhc3NNZXRhRGF0YSBzdXAgPSBtZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgIENsYXNzIG9pZCA9IG1ldGEuZ2V0T2JqZWN0SWRUeXBlKCk7CisgICAgICAgIGlmIChvaWQgIT0gbnVsbCAmJiAoc3VwID09IG51bGwgfHwgb2lkICE9IHN1cC5nZXRPYmplY3RJZFR5cGUoKSkpIHsKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiY2xhc3MiLCBnZXRDbGFzc05hbWUob2lkLmdldE5hbWUoKSkpOworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCJpZC1jbGFzcyIpOworICAgICAgICAgICAgZW5kRWxlbWVudCgiaWQtY2xhc3MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBjbGFzcyBtYXBwaW5nIGNvbnRlbnQuIERvZXMgbm90aGluZyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZUNsYXNzTWFwcGluZ0NvbnRlbnQoQ2xhc3NNZXRhRGF0YSBtYXBwaW5nKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgaW5oZXJpdGFuY2UgY29udGVudC4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplSW5oZXJpdGFuY2VDb250ZW50KENsYXNzTWV0YURhdGEgbWFwcGluZykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHF1ZXJ5IG1hcHBpbmdzLiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemVRdWVyeU1hcHBpbmdzKENsYXNzTWV0YURhdGEgbWV0YSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIHRoZSBnaXZlbiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplRmllbGQoRmllbGRNZXRhRGF0YSBmbWQsIEZpZWxkTWV0YURhdGEgb3JpZykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmbWQuZ2V0TWFuYWdlbWVudCgpICE9IEZpZWxkTWV0YURhdGEuTUFOQUdFX1BFUlNJU1RFTlQKKyAgICAgICAgICAgICYmICFmbWQuaXNFeHBsaWNpdCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGFkZENvbW1lbnRzKGZtZCk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIGZtZC5nZXROYW1lKCkpOworCisgICAgICAgIFN0cmluZyBzdHJhdGVneSA9IG51bGw7CisgICAgICAgIFBlcnNpc3RlbmNlU3RyYXRlZ3kgc3RyYXQgPSBnZXRTdHJhdGVneShmbWQpOworICAgICAgICBWYWx1ZU1ldGFEYXRhIGNhc2NhZGVzID0gbnVsbDsKKyAgICAgICAgaWYgKGZtZC5pc1ByaW1hcnlLZXkoKSAmJiBzdHJhdCA9PSBQZXJzaXN0ZW5jZVN0cmF0ZWd5LkVNQkVEREVEKQorICAgICAgICAgICAgc3RyYXRlZ3kgPSAiZW1iZWRkZWQtaWQiOworICAgICAgICBlbHNlIGlmIChmbWQuaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICBzdHJhdGVneSA9ICJpZCI7CisgICAgICAgIGVsc2UgaWYgKGZtZC5pc1ZlcnNpb24oKSkKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gInZlcnNpb24iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RyYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPSAidHJhbnNpZW50IjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQVNJQzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRCYXNpY0F0dHJpYnV0ZXMoZm1kKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPSAiYmFzaWMiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVNQkVEREVEOgorICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9ICJlbWJlZGRlZCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUFOWV9PTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWFueVRvT25lQXR0cmlidXRlcyhmbWQpOworICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9ICJtYW55LXRvLW9uZSI7CisgICAgICAgICAgICAgICAgICAgIGNhc2NhZGVzID0gZm1kOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9ORV9PTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc01ldGFEYXRhTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25lVG9PbmVBdHRyaWJ1dGVzKGZtZCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID0gIm9uZS10by1vbmUiOworICAgICAgICAgICAgICAgICAgICBjYXNjYWRlcyA9IGZtZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPTkVfTUFOWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRPbmVUb01hbnlBdHRyaWJ1dGVzKGZtZCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID0gIm9uZS10by1tYW55IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzY2FkZXMgPSBmbWQuZ2V0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1BTllfTUFOWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRNYW55VG9NYW55QXR0cmlidXRlcyhmbWQpOworICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9ICJtYW55LXRvLW1hbnkiOworICAgICAgICAgICAgICAgICAgICBjYXNjYWRlcyA9IGZtZC5nZXRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoKSkKKyAgICAgICAgICAgICAgICBhZGRTdHJhdGVneU1hcHBpbmdBdHRyaWJ1dGVzKGZtZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoZm1kKSkKKyAgICAgICAgICAgIGFkZEZpZWxkTWFwcGluZ0F0dHJpYnV0ZXMoZm1kLCBvcmlnKTsKKworICAgICAgICBzdGFydEVsZW1lbnQoc3RyYXRlZ3kpOworICAgICAgICBpZiAoZm1kLmdldE9yZGVyRGVjbGFyYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoIm9yZGVyLWJ5Iik7CisgICAgICAgICAgICBpZiAoIShPcmRlci5FTEVNRU5UICsgIiBhc2MiKS5lcXVhbHMoZm1kLmdldE9yZGVyRGVjbGFyYXRpb24oKSkpCisgICAgICAgICAgICAgICAgYWRkVGV4dChmbWQuZ2V0T3JkZXJEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgIGVuZEVsZW1lbnQoIm9yZGVyLWJ5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoKSAmJiBmbWQuZ2V0S2V5KCkuZ2V0VmFsdWVNYXBwZWRCeSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgbWFwQnkgPSBmbWQuZ2V0S2V5KCkuZ2V0VmFsdWVNYXBwZWRCeU1ldGFEYXRhKCk7CisgICAgICAgICAgICBpZiAoIW1hcEJ5LmlzUHJpbWFyeUtleSgpIHx8CisgICAgICAgICAgICAgICAgbWFwQnkuZ2V0RGVmaW5pbmdNZXRhRGF0YSgpLmdldFByaW1hcnlLZXlGaWVsZHMoKS5sZW5ndGggIT0gMSkgeworICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgibmFtZSIsIGZtZC5nZXRLZXkoKS5nZXRWYWx1ZU1hcHBlZEJ5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnRFbGVtZW50KCJtYXAta2V5Iik7CisgICAgICAgICAgICBlbmRFbGVtZW50KCJtYXAta2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWFwcGluZ01vZGUoZm1kKSkKKyAgICAgICAgICAgIHNlcmlhbGl6ZUZpZWxkTWFwcGluZ0NvbnRlbnQoZm1kLCBzdHJhdCk7CisgICAgICAgIGlmIChjYXNjYWRlcyAhPSBudWxsICYmIGlzTWV0YURhdGFNb2RlKCkpCisgICAgICAgICAgICBzZXJpYWxpemVDYXNjYWRlcyhjYXNjYWRlcyk7CisgICAgICAgIGlmIChpc01hcHBpbmdNb2RlKCkgJiYgc3RyYXQgPT0gUGVyc2lzdGVuY2VTdHJhdGVneS5FTUJFRERFRCkgeworICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gZm1kLmdldEVtYmVkZGVkTWV0YURhdGEoKTsKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgb3duZXIgPSBnZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS5nZXRNZXRhRGF0YQorICAgICAgICAgICAgICAgIChtZXRhLmdldERlc2NyaWJlZFR5cGUoKSwgbWV0YS5nZXRFbnZDbGFzc0xvYWRlcigpLCB0cnVlKTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZW9yaWc7CisgICAgICAgICAgICBmb3IgKEZpZWxkTWV0YURhdGEgZWZtZCA6IG1ldGEuZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgICAgICAgICBlb3JpZyA9IG93bmVyLmdldEZpZWxkKGVmbWQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplQXR0cmlidXRlT3ZlcnJpZGUoZWZtZCwgZW9yaWcpKQorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVBdHRyaWJ1dGVPdmVycmlkZUNvbnRlbnQoZWZtZCwgZW9yaWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVuZEVsZW1lbnQoc3RyYXRlZ3kpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBtYXBwaW5nIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBmaWVsZC4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRNYXBwaW5nQXR0cmlidXRlcyhGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBvcmlnKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgcmV0dXJucyBmYWxzZSBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlcmlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlKEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBGaWVsZE1ldGFEYXRhIG9yaWcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplQXR0cmlidXRlT3ZlcnJpZGVDb250ZW50KEZpZWxkTWV0YURhdGEgZm1kLAorICAgICAgICBGaWVsZE1ldGFEYXRhIG9yaWcpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBhZGRBdHRyaWJ1dGUoIm5hbWUiLCBmbWQuZ2V0TmFtZSgpKTsKKyAgICAgICAgc3RhcnRFbGVtZW50KCJhdHRyaWJ1dGUtb3ZlcnJpZGUiKTsKKyAgICAgICAgc2VyaWFsaXplQXR0cmlidXRlT3ZlcnJpZGVNYXBwaW5nQ29udGVudChmbWQsIG9yaWcpOworICAgICAgICBlbmRFbGVtZW50KCJhdHRyaWJ1dGUtb3ZlcnJpZGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgYXR0cmlidXRlIG92ZXJyaWRlIG1hcHBpbmcgY29udGVudC4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQsCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplQXR0cmlidXRlT3ZlcnJpZGVNYXBwaW5nQ29udGVudAorICAgICAgICAoRmllbGRNZXRhRGF0YSBmbWQsIEZpZWxkTWV0YURhdGEgb3JpZykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplIGNhc2NhZGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVDYXNjYWRlcyhWYWx1ZU1ldGFEYXRhIHZtZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBjYXNjYWRlcyA9IG51bGw7CisgICAgICAgIGlmICh2bWQuZ2V0Q2FzY2FkZVBlcnNpc3QoKSA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKSB7CisgICAgICAgICAgICBpZiAoY2FzY2FkZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjYXNjYWRlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgY2FzY2FkZXMuYWRkKCJjYXNjYWRlLXBlcnNpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodm1kLmdldENhc2NhZGVBdHRhY2goKSA9PSBWYWx1ZU1ldGFEYXRhLkNBU0NBREVfSU1NRURJQVRFKSB7CisgICAgICAgICAgICBpZiAoY2FzY2FkZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjYXNjYWRlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgY2FzY2FkZXMuYWRkKCJjYXNjYWRlLW1lcmdlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZtZC5nZXRDYXNjYWRlRGVsZXRlKCkgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSkgeworICAgICAgICAgICAgaWYgKGNhc2NhZGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgY2FzY2FkZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGNhc2NhZGVzLmFkZCgiY2FzY2FkZS1yZW1vdmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodm1kLmdldENhc2NhZGVSZWZyZXNoKCkgPT0gVmFsdWVNZXRhRGF0YS5DQVNDQURFX0lNTUVESUFURSkgeworICAgICAgICAgICAgaWYgKGNhc2NhZGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgY2FzY2FkZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGNhc2NhZGVzLmFkZCgiY2FzY2FkZS1yZWZyZXNoIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhc2NhZGVzICE9IG51bGwgJiYgY2FzY2FkZXMuc2l6ZSgpID09IDQpIC8vIEFMTAorICAgICAgICB7CisgICAgICAgICAgICBjYXNjYWRlcy5jbGVhcigpOworICAgICAgICAgICAgY2FzY2FkZXMuYWRkKCJjYXNjYWRlLWFsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjYXNjYWRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoImNhc2NhZGUiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhc2NhZGUgOiBjYXNjYWRlcykgeworICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudChjYXNjYWRlKTsKKyAgICAgICAgICAgICAgICBlbmRFbGVtZW50KGNhc2NhZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kRWxlbWVudCgiY2FzY2FkZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJpYWxpemVkIHN0cmF0ZWd5IG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFBlcnNpc3RlbmNlU3RyYXRlZ3kgZ2V0U3RyYXRlZ3koRmllbGRNZXRhRGF0YSBmbWQpIHsKKyAgICAgICAgaWYgKGZtZC5nZXRNYW5hZ2VtZW50KCkgPT0gZm1kLk1BTkFHRV9OT05FKQorICAgICAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlU3RyYXRlZ3kuVFJBTlNJRU5UOworCisgICAgICAgIGlmIChmbWQuaXNTZXJpYWxpemVkKCkKKyAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBieXRlW10uY2xhc3MKKyAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBCeXRlW10uY2xhc3MKKyAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBjaGFyW10uY2xhc3MKKyAgICAgICAgICAgIHx8IGZtZC5nZXREZWNsYXJlZFR5cGUoKSA9PSBDaGFyYWN0ZXJbXS5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVN0cmF0ZWd5LkJBU0lDOworCisgICAgICAgIEZpZWxkTWV0YURhdGEgbWFwcGVkQnk7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldERlY2xhcmVkVHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgaWYgKGZtZC5pc0VtYmVkZGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVN0cmF0ZWd5LkVNQkVEREVEOworICAgICAgICAgICAgICAgIGlmIChmbWQuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VTdHJhdGVneS5PTkVfT05FOworICAgICAgICAgICAgICAgIEZpZWxkTWV0YURhdGFbXSBpbnZlcnNlcyA9IGZtZC5nZXRJbnZlcnNlTWV0YURhdGFzKCk7CisgICAgICAgICAgICAgICAgaWYgKGludmVyc2VzLmxlbmd0aCA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgIGludmVyc2VzWzBdLmdldFR5cGVDb2RlKCkgPT0gSmF2YVR5cGVzLlBDICYmCisgICAgICAgICAgICAgICAgICAgIGludmVyc2VzWzBdLmdldE1hcHBlZEJ5TWV0YURhdGEoKSA9PSBmbWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlU3RyYXRlZ3kuT05FX09ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlU3RyYXRlZ3kuTUFOWV9PTkU7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgbWFwcGVkQnkgPSBmbWQuZ2V0TWFwcGVkQnlNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIGlmIChtYXBwZWRCeSA9PSBudWxsIHx8IG1hcHBlZEJ5LmdldFR5cGVDb2RlKCkgIT0gSmF2YVR5cGVzLlBDKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyc2lzdGVuY2VTdHJhdGVneS5NQU5ZX01BTlk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlU3RyYXRlZ3kuT05FX01BTlk7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PSUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFBlcnNpc3RlbmNlU3RyYXRlZ3kuRU1CRURERUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVN0cmF0ZWd5LkJBU0lDOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGJhc2ljIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEJhc2ljQXR0cmlidXRlcyhGaWVsZE1ldGFEYXRhIGZtZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZm1kLmlzSW5EZWZhdWx0RmV0Y2hHcm91cCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJmZXRjaCIsICJMQVpZIik7CisgICAgICAgIGlmIChmbWQuZ2V0TnVsbFZhbHVlKCkgPT0gRmllbGRNZXRhRGF0YS5OVUxMX0VYQ0VQVElPTikKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgib3B0aW9uYWwiLCAiZmFsc2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbWFueS10by1vbmUgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkTWFueVRvT25lQXR0cmlidXRlcyhGaWVsZE1ldGFEYXRhIGZtZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZm1kLmlzSW5EZWZhdWx0RmV0Y2hHcm91cCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJmZXRjaCIsICJMQVpZIik7CisgICAgICAgIGlmIChmbWQuZ2V0TnVsbFZhbHVlKCkgPT0gRmllbGRNZXRhRGF0YS5OVUxMX0VYQ0VQVElPTikKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgib3B0aW9uYWwiLCAiZmFsc2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgb25lLXRvLW9uZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRPbmVUb09uZUF0dHJpYnV0ZXMoRmllbGRNZXRhRGF0YSBmbWQpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWZtZC5pc0luRGVmYXVsdEZldGNoR3JvdXAoKSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiZmV0Y2giLCAiTEFaWSIpOworICAgICAgICBpZiAoZm1kLmdldE51bGxWYWx1ZSgpID09IEZpZWxkTWV0YURhdGEuTlVMTF9FWENFUFRJT04pCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoIm9wdGlvbmFsIiwgImZhbHNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG9uZS10by1tYW55IGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZE9uZVRvTWFueUF0dHJpYnV0ZXMoRmllbGRNZXRhRGF0YSBmbWQpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoZm1kLmlzSW5EZWZhdWx0RmV0Y2hHcm91cCgpKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJmZXRjaCIsICJFQUdFUiIpOworICAgICAgICBhZGRUYXJnZXRFbnRpdHlBdHRyaWJ1dGUoZm1kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbWFueS10by1tYW55IGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZE1hbnlUb01hbnlBdHRyaWJ1dGVzKEZpZWxkTWV0YURhdGEgZm1kKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZtZC5pc0luRGVmYXVsdEZldGNoR3JvdXAoKSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgiZmV0Y2giLCAiRUFHRVIiKTsKKyAgICAgICAgYWRkVGFyZ2V0RW50aXR5QXR0cmlidXRlKGZtZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdGFyZ2V0LWVudGl0eSBhdHRyaWJ1dGUgdG8gY29sbGVjdGlvbiBhbmQgbWFwIGZpZWxkcyB0aGF0IGRvCisgICAgICogbm90IHVzZSBnZW5lcmljcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkVGFyZ2V0RW50aXR5QXR0cmlidXRlKEZpZWxkTWV0YURhdGEgZm1kKSAKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIE1lbWJlciBtZW1iZXIgPSBmbWQuZ2V0QmFja2luZ01lbWJlcigpOworICAgICAgICBDbGFzc1tdIHR5cGVzOworICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgRmllbGQpCisgICAgICAgICAgICB0eXBlcyA9IEphdmFWZXJzaW9ucy5nZXRQYXJhbWV0ZXJpemVkVHlwZXMoKEZpZWxkKSBtZW1iZXIpOworICAgICAgICBlbHNlIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2QpCisgICAgICAgICAgICB0eXBlcyA9IEphdmFWZXJzaW9ucy5nZXRQYXJhbWV0ZXJpemVkVHlwZXMoKE1ldGhvZCkgbWVtYmVyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZXMgPSBuZXcgQ2xhc3NbMF07CisKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0RGVjbGFyZWRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJ0YXJnZXQtZW50aXR5IiwgZm1kLmdldEVsZW1lbnQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlY2xhcmVkVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCAhPSAyKQorICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoInRhcmdldC1lbnRpdHkiLCBmbWQuZ2V0RWxlbWVudCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjbGFyZWRUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSBmaWVsZCBtYXBwaW5nIGNvbnRlbnQ7IHRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICoge0BsaW5rICNzZXJpYWxpemVWYWx1ZU1hcHBpbmdDb250ZW50fS4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplRmllbGRNYXBwaW5nQ29udGVudChGaWVsZE1ldGFEYXRhIGZtZCwKKyAgICAgICAgUGVyc2lzdGVuY2VTdHJhdGVneSBzdHJhdGVneSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG1hcHBpbmcgYXR0cmlidXRlcyBmb3Igc3RyYXRlZ3kuIFNldHMgbWFwcGVkLWJ5IGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkU3RyYXRlZ3lNYXBwaW5nQXR0cmlidXRlcyhGaWVsZE1ldGFEYXRhIGZtZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmbWQuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKQorICAgICAgICAgICAgYWRkQXR0cmlidXRlKCJtYXBwZWQtYnkiLCBmbWQuZ2V0TWFwcGVkQnkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBvcmRlcmVkIHNldCBvZiB7QGxpbmsgU2VxdWVuY2VNZXRhRGF0YX1zIHdpdGggYQorICAgICAqIGNvbW1vbiBjbGFzcyBzY29wZS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgU3RlcGhlbiBLaW0KKyAgICAgKiBAYXV0aG9yIFBpbmFraSBQb2RkYXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc1NlcXMKKyAgICAgICAgaW1wbGVtZW50cyBTb3VyY2VUcmFja2VyLCBDb21wYXJhYmxlPENsYXNzU2Vxcz4sCisgICAgICAgIENvbXBhcmF0b3I8U2VxdWVuY2VNZXRhRGF0YT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU2VxdWVuY2VNZXRhRGF0YVtdIF9zZXFzOworCisgICAgICAgIHB1YmxpYyBDbGFzc1NlcXMoTGlzdDxTZXF1ZW5jZU1ldGFEYXRhPiBzZXFzKSB7CisgICAgICAgICAgICBpZiAoc2VxcyA9PSBudWxsIHx8IHNlcXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBfc2VxcyA9IChTZXF1ZW5jZU1ldGFEYXRhW10pIHNlcXMudG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgU2VxdWVuY2VNZXRhRGF0YVtzZXFzLnNpemUoKV0pOworICAgICAgICAgICAgQXJyYXlzLnNvcnQoX3NlcXMsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcXVlbmNlTWV0YURhdGFbXSBnZXRTZXF1ZW5jZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gX3NlcXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyZSBzZXF1ZW5jZSBtZXRhZGF0YSBvbiBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNlcXVlbmNlTWV0YURhdGEgbzEsIFNlcXVlbmNlTWV0YURhdGEgbzIpIHsKKyAgICAgICAgICAgIHJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9zZXFzWzBdLmdldFNvdXJjZUZpbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlU2NvcGUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3NlcXNbMF0uZ2V0U291cmNlU2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfc2Vxc1swXS5nZXRTb3VyY2VUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfc2Vxc1swXS5nZXRSZXNvdXJjZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENsYXNzU2VxcyBvdGhlcikgeworICAgICAgICAgICAgaWYgKG90aGVyID09IHRoaXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBDbGFzcyBzY29wZSA9IChDbGFzcykgZ2V0U291cmNlU2NvcGUoKTsKKyAgICAgICAgICAgIENsYXNzIG9zY29wZSA9IChDbGFzcykgb3RoZXIuZ2V0U291cmNlU2NvcGUoKTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZS5nZXROYW1lKCkuY29tcGFyZVRvKG9zY29wZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBvcmRlcmVkIHNldCBvZiB7QGxpbmsgUXVlcnlNZXRhRGF0YX1zIHdpdGggYQorICAgICAqIGNvbW1vbiBjbGFzcyBzY29wZS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgU3RlcGhlbiBLaW0KKyAgICAgKiBAYXV0aG9yIFBpbmFraSBQb2RkYXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc1F1ZXJpZXMKKyAgICAgICAgaW1wbGVtZW50cyBTb3VyY2VUcmFja2VyLCBDb21wYXJhYmxlPENsYXNzUXVlcmllcz4sCisgICAgICAgIENvbXBhcmF0b3I8UXVlcnlNZXRhRGF0YT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUXVlcnlNZXRhRGF0YVtdIF9xdWVyaWVzOworCisgICAgICAgIHB1YmxpYyBDbGFzc1F1ZXJpZXMoTGlzdDxRdWVyeU1ldGFEYXRhPiBxdWVyaWVzKSB7CisgICAgICAgICAgICBpZiAocXVlcmllcyA9PSBudWxsIHx8IHF1ZXJpZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBfcXVlcmllcyA9IChRdWVyeU1ldGFEYXRhW10pIHF1ZXJpZXMudG9BcnJheQorICAgICAgICAgICAgICAgIChuZXcgUXVlcnlNZXRhRGF0YVtxdWVyaWVzLnNpemUoKV0pOworICAgICAgICAgICAgQXJyYXlzLnNvcnQoX3F1ZXJpZXMsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFF1ZXJ5TWV0YURhdGFbXSBnZXRRdWVyaWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyaWVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgcXVlcnkgbWV0YWRhdGEuIE5vcm1hbCBxdWVyaWVzIGFwcGVhciBiZWZvcmUgbmF0aXZlIHF1ZXJpZXMuCisgICAgICAgICAqIElmIHRoZSBnaXZlbiBxdWVyaWVzIHVzZSBzYW1lIGxhbmd1YWdlLCB0aGVuIHRoZWlyIG5hbWVzIGFyZQorICAgICAgICAgKiBjb21wYXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShRdWVyeU1ldGFEYXRhIG8xLCBRdWVyeU1ldGFEYXRhIG8yKSB7CisgICAgICAgICAgICAvLyBub3JtYWwgcXVlcmllcyBiZWZvcmUgbmF0aXZlCisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmVxdWFscyhvMS5nZXRMYW5ndWFnZSgpLCBvMi5nZXRMYW5ndWFnZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChRdWVyeUxhbmd1YWdlcy5MQU5HX1NRTC5lcXVhbHMobzEuZ2V0TGFuZ3VhZ2UoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gX3F1ZXJpZXNbMF0uZ2V0U291cmNlRmlsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2VTY29wZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfcXVlcmllc1swXS5nZXRTb3VyY2VTY29wZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRTb3VyY2VUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyaWVzWzBdLmdldFNvdXJjZVR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIF9xdWVyaWVzWzBdLmdldFJlc291cmNlTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oQ2xhc3NRdWVyaWVzIG90aGVyKSB7CisgICAgICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIENsYXNzIHNjb3BlID0gKENsYXNzKSBnZXRTb3VyY2VTY29wZSgpOworICAgICAgICAgICAgQ2xhc3Mgb3Njb3BlID0gKENsYXNzKSBvdGhlci5nZXRTb3VyY2VTY29wZSgpOworICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmdldE5hbWUoKS5jb21wYXJlVG8ob3Njb3BlLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBjbGFzZXMsIHNlcXVlbmNlcywgYW5kIHF1ZXJpZXMgdG8gb3JkZXIgdGhlbSBmb3Igc2VyaWFsaXphdGlvbi4KKyAgICAgKiBQbGFjZXMgc2VxdWVuY2VzIGZpcnN0LCB0aGVuIGNsYXNzZXMsIHRoZW4gcXVlcmllcy4gU2VxdWVuY2VzIGFuZAorICAgICAqIHF1ZXJpZXMgYXJlIG9yZGVyZWQgYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4gQ2xhc3NlcyBhcmUgcGxhY2VkIGluCisgICAgICogbGlzdGluZyBvcmRlciwgaW4gaW5oZXJpdGFuY2Ugb3JkZXIgd2l0aGluIHRoYXQsIGFuZCBpbiBhbHBoYWJldGljYWwKKyAgICAgKiBvcmRlciB3aXRoaW4gdGhhdC4KKyAgICAgKgorICAgICAqIEBhdXRob3IgU3RlcGhlbiBLaW0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgU2VyaWFsaXphdGlvbkNvbXBhcmF0b3IKKyAgICAgICAgZXh0ZW5kcyBNZXRhRGF0YUluaGVyaXRhbmNlQ29tcGFyYXRvciB7CisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICBpZiAobzEgPT0gbzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAobzEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmIChvMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgaW50IHQxID0gdHlwZShvMSk7CisgICAgICAgICAgICBpbnQgdDIgPSB0eXBlKG8yKTsKKyAgICAgICAgICAgIGlmICh0MSAhPSB0MikKKyAgICAgICAgICAgICAgICByZXR1cm4gdDEgLSB0MjsKKworICAgICAgICAgICAgc3dpdGNoICh0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9NRVRBOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZSgoQ2xhc3NNZXRhRGF0YSkgbzEsIChDbGFzc01ldGFEYXRhKSBvMik7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1FVRVJZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZSgoUXVlcnlNZXRhRGF0YSkgbzEsIChRdWVyeU1ldGFEYXRhKSBvMik7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1NFUToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoKFNlcXVlbmNlTWV0YURhdGEpIG8xLAorICAgICAgICAgICAgICAgICAgICAgICAgKFNlcXVlbmNlTWV0YURhdGEpIG8yKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfQ0xBU1NfUVVFUklFUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSkgbzEpLmNvbXBhcmVUbyhvMik7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0NMQVNTX1NFUVM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8obzIpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVW5rbm93bihvMSwgbzIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgdHdvIHVucmVjb2duaXplZCBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlLiBUaHJvd3MKKyAgICAgICAgICogZXhjZXB0aW9uIGJ5IGRlZmF1bHQuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVVbmtub3duKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJlIGJldHdlZW4gdHdvIGNsYXNzIG1ldGFkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZShDbGFzc01ldGFEYXRhIG8xLCBDbGFzc01ldGFEYXRhIG8yKSB7CisgICAgICAgICAgICBpbnQgbGkxID0gbzEuZ2V0TGlzdGluZ0luZGV4KCk7CisgICAgICAgICAgICBpbnQgbGkyID0gbzIuZ2V0TGlzdGluZ0luZGV4KCk7CisgICAgICAgICAgICBpZiAobGkxID09IC0xICYmIGxpMiA9PSAtMSkgeworICAgICAgICAgICAgICAgIE1ldGFEYXRhVGFnIHQxID0gZ2V0RW50aXR5VGFnKG8xKTsKKyAgICAgICAgICAgICAgICBNZXRhRGF0YVRhZyB0MiA9IGdldEVudGl0eVRhZyhvMik7CisgICAgICAgICAgICAgICAgaWYgKHQxLmNvbXBhcmVUbyh0MikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQxLmNvbXBhcmVUbyh0Mik7CisgICAgICAgICAgICAgICAgaW50IGluaGVyID0gc3VwZXIuY29tcGFyZShvMSwgbzIpOworICAgICAgICAgICAgICAgIGlmIChpbmhlciAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5oZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCkuY29tcGFyZVRvCisgICAgICAgICAgICAgICAgICAgIChvMi5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxpMSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmIChsaTIgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIGxpMSAtIGxpMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJlIHF1ZXJ5IG1ldGFkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZShRdWVyeU1ldGFEYXRhIG8xLCBRdWVyeU1ldGFEYXRhIG8yKSB7CisgICAgICAgICAgICAvLyBub3JtYWwgcXVlcmllcyBiZWZvcmUgbmF0aXZlCisgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmVxdWFscyhvMS5nZXRMYW5ndWFnZSgpLCBvMi5nZXRMYW5ndWFnZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChRdWVyeUxhbmd1YWdlcy5MQU5HX1NRTC5lcXVhbHMobzEuZ2V0TGFuZ3VhZ2UoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJlIHNlcXVlbmNlIG1ldGFkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZShTZXF1ZW5jZU1ldGFEYXRhIG8xLCBTZXF1ZW5jZU1ldGFEYXRhIG8yKSB7CisgICAgICAgICAgICByZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU29ydHMgZmllbGRzIGFjY29yZGluZyB0byBsaXN0aW5nIG9yZGVyLCB0aGVuIFhTRCBzdHJhdGVneSBvcmRlciwKKyAgICAgKiB0aGVuIG5hbWUgb3JkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBGaWVsZENvbXBhcmF0b3IKKyAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kMSA9IChGaWVsZE1ldGFEYXRhKSBvMTsKKyAgICAgICAgICAgIEZpZWxkTWV0YURhdGEgZm1kMiA9IChGaWVsZE1ldGFEYXRhKSBvMjsKKyAgICAgICAgICAgIGlmIChmbWQxLmlzUHJpbWFyeUtleSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZtZDIuaXNQcmltYXJ5S2V5KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbWQxLmNvbXBhcmVUbyhmbWQyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm1kMi5pc1ByaW1hcnlLZXkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgaWYgKGZtZDEuaXNWZXJzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm1kMi5pc1ZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVMaXN0aW5nT3JkZXIoZm1kMSwgZm1kMik7CisJCQkJcmV0dXJuIGdldFN0cmF0ZWd5KGZtZDIpID09IFBlcnNpc3RlbmNlU3RyYXRlZ3kuQkFTSUMgPyAxIDogLTE7CisJCQl9CisJCQlpZiAoZm1kMi5pc1ZlcnNpb24oKSkKKwkJCQlyZXR1cm4gZ2V0U3RyYXRlZ3koZm1kMSkgPT0gUGVyc2lzdGVuY2VTdHJhdGVneS5CQVNJQyA/IC0xIDogMTsKKworCQkJaW50IHN0Y21wID0gZ2V0U3RyYXRlZ3koZm1kMSkuY29tcGFyZVRvKGdldFN0cmF0ZWd5KGZtZDIpKTsKKyAgICAgICAgICAgIGlmIChzdGNtcCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGNtcDsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlTGlzdGluZ09yZGVyKGZtZDEsIGZtZDIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZUxpc3RpbmdPcmRlcihGaWVsZE1ldGFEYXRhIGZtZDEsIEZpZWxkTWV0YURhdGEgZm1kMil7CisgICAgICAgICAgICBpbnQgbGNtcCA9IGZtZDEuZ2V0TGlzdGluZ0luZGV4KCkgLSBmbWQyLmdldExpc3RpbmdJbmRleCgpOworICAgICAgICAgICAgaWYgKGxjbXAgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGNtcDsKKyAgICAgICAgICAgIHJldHVybiBmbWQxLmNvbXBhcmVUbyhmbWQyKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjE4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8aHRtbD4KKzxib2R5PgorPHA+PHN0cm9uZz5PcGVuSlBBIEpQQTwvc3Ryb25nPjwvcD4KKworPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFuIEpQQSBmYWNhZGUgdG8gT3BlbkpQQS4gQWxsIG1ham9yIE9wZW5KUEEKKyAgICBydW50aW1lIGNvbXBvbmVudHMgaGF2ZSBKUEEtZmxhdm9yZWQgZmFjYWRlcyBpbiB0aGlzIHBhY2thZ2UuCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnBlcnNpc3RlbmNlLnNwaS5QZXJzaXN0ZW5jZVByb3ZpZGVyIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5wZXJzaXN0ZW5jZS5zcGkuUGVyc2lzdGVuY2VQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FkYzYwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5wZXJzaXN0ZW5jZS5zcGkuUGVyc2lzdGVuY2VQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQcm92aWRlckltcGwKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm9wZW5qcGEubGliLmNvbmYuUHJvZHVjdERlcml2YXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNGI2MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5jb25mLlByb2R1Y3REZXJpdmF0aW9uCkBAIC0wLDAgKzEsMTcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQcm9kdWN0RGVyaXZhdGlvbgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbG9jYWxpemVyLnByb3BlcnRpZXMgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9sb2NhbGl6ZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc3OWIzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvbG9jYWxpemVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMzIgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAKKworY2xvc2UtaW52b2tlZDogWW91IGhhdmUgY2xvc2VkIHRoZSBFbnRpdHlNYW5hZ2VyLCB0aG91Z2ggdGhlIHBlcnNpc3RlbmNlIFwKKyAgICBjb250ZXh0IHdpbGwgcmVtYWluIGFjdGl2ZSB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBjb21taXRzLgorbm8tbWFuYWdlZC10cmFuczogVGhlcmUgaXMgbm8gbWFuYWdlZCB0cmFuc2FjdGlvbiBpbiBwcm9ncmVzcyB0byBzeW5jIHRoaXMgXAorCUVudGl0eU1hbmFnZXIgd2l0aC4KK2dldC1tYW5hZ2VkLXRyYW5zOiBZb3UgY2Fubm90IGFjY2VzcyB0aGUgRW50aXR5VHJhbnNhY3Rpb24gd2hlbiB1c2luZyBtYW5hZ2VkIFwKKwl0cmFuc2FjdGlvbnMuCit0cmFucy1jdHgtbm90YWN0aXZlOiBXaGVuIHVzaW5nIGEgcGVyc2lzdGVuY2UgY29udGV4dCB0eXBlIG9mIFRSQU5TQUNUSU9OLCB5b3UgXAorCWNhbiBvbmx5IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZHVyaW5nIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbi4gCitub3QtZW50aXR5OiBUaGUgY2xhc3MgInswfSIgaXMgbm90IGFuIGVudGl0eS4KK25vdC1tYW5hZ2VkOiBPYmplY3QgInswfSIgaXMgbm90IG1hbmFnZWQgYnkgdGhpcyBjb250ZXh0LgorcGFyc2UtY2xhc3M6IFBhcnNpbmcgY2xhc3MgInswfSIuCitwYXJzZS1wYWNrYWdlOiBQYXJzaW5nIHBhY2thZ2UgInswfSIuCitwYXJzZS1zZXF1ZW5jZTogUGFyc2luZyBzZXF1ZW5jZSAiezB9Ii4KK3BhcnNlLXF1ZXJ5OiBQYXJzaW5nIHF1ZXJ5ICJ7MH0iLgorcGFyc2UtbmF0aXZlLXF1ZXJ5OiBQYXJzaW5nIG5hdGl2ZSBxdWVyeSAiezB9Ii4KK2R1cC1tZXRhZGF0YTogRm91bmQgZHVwbGljYXRlIG1ldGFkYXRhIG9yIG1hcHBpbmcgZm9yICJ7MH0iLiAgSWdub3JpbmcuCitkdXAtc2VxdWVuY2U6IEZvdW5kIGR1cGxpY2F0ZSBnZW5lcmF0b3IgInswfSIgaW4gInsxfSIuICBJZ25vcmluZy4KK292ZXJyaWRlLXNlcXVlbmNlOiBGb3VuZCBkdXBsaWNhdGUgZ2VuZXJhdG9yICJ7MH0iIGluICJ7MX0iLiAgT3ZlcnJpZGluZyBcCisJcHJldmlvdXMgZGVmaW5pdGlvbi4KK2R1cC1xdWVyeTogRm91bmQgZHVwbGljYXRlIHF1ZXJ5ICJ7MH0iIGluICJ7MX0iLiAgSWdub3JpbmcuCitvdmVycmlkZS1xdWVyeTogRm91bmQgZHVwbGljYXRlIHF1ZXJ5ICJ7MH0iIGluICJ7MX0iLiAgT3ZlcnJpZGluZyBwcmV2aW91cyBcCisJZGVmaW5pdGlvbi4KK25vLXNlcS1uYW1lOiBUaGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGluICJ7MH0iIG11c3QgZGVjbGFyZSBhIG5hbWUuCituby1xdWVyeS1uYW1lOiBUaGUgbmFtZWQgcXVlcnkgaW4gInswfSIgbXVzdCBkZWNsYXJlIGEgbmFtZS4KK25vLW5hdGl2ZS1xdWVyeS1uYW1lOiBUaGUgbmFtZWQgbmF0aXZlIHF1ZXJ5IGluICJ7MH0iIG11c3QgZGVjbGFyZSBhIG5hbWUuCituby1xdWVyeS1zdHJpbmc6IFRoZSBuYW1lZCBxdWVyeSAiezB9IiBpbiAiezF9IiBtdXN0IGRlY2xhcmUgYSBxdWVyeSBzdHJpbmcuCituby1uYXRpdmUtcXVlcnktc3RyaW5nOiBUaGUgbmFtZWQgbmF0aXZlIHF1ZXJ5ICJ7MH0iIGluICJ7MX0iIG11c3QgZGVjbGFyZSBhIFwKKwlxdWVyeSBzdHJpbmcuCithbHJlYWR5LXBlcnM6IEZpZWxkICJ7MH0iIGNhbm5vdCBiZSBhbm5vdGF0ZWQgYnkgdHdvIHBlcnNpc3RlbmNlIHN0cmF0ZWd5IFwKKwlhbm5vdGF0aW9ucy4KK3Vuc3VwcG9ydGVkOiBPcGVuSlBBIGRvZXMgbm90IHlldCBzdXBwb3J0ICJ7MX0iIGFzIHVzZWQgaW4gInswfSIuCitiYWQtbWV0YS1hbm5vOiBUaGUgdHlwZSBvZiBmaWVsZCAiezB9IiBpc24nJ3Qgc3VwcG9ydGVkIGJ5IGRlY2xhcmVkIFwKKwlwZXJzaXN0ZW5jZSBzdHJhdGVneSAiezF9Ii4gIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCituby1wZXJzLXN0cmF0OiBGaWVsZHMgInswfSIgYXJlIG5vdCBhIGRlZmF1bHQgcGVyc2lzdGVudCB0eXBlLCBhbmQgZG8gbm90IFwKKwloYXZlIGFueSBhbm5vdGF0aW9ucyBpbmRpY2F0aW5nIHRoZWlyIHBlcnNpc3RlbmNlIHN0cmF0ZWd5LiAgSWYgeW91IGRvIFwKKwlub3Qgd2FudCB0aGVzZSBmaWVsZHMgdG8gYmUgcGVyc2lzdGVkLCBhbm5vdGF0ZSB0aGVtIHdpdGggQFRyYW5zaWVudC4KK2dlbmVyYXRvci1iYWQtc3RyYXRlZ3k6ICJ7MH0iIGRlY2xhcmVzIGdlbmVyYXRvciBuYW1lICJ7MX0iLCBidXQgdXNlcyB0aGUgQVVUTyBcCisJZ2VuZXJhdGlvbiB0eXBlLiAgVGhlIG9ubHkgdmFsaWQgZ2VuZXJhdG9yIG5hbWVzIHVuZGVyIEFVVE8gYXJlICJ1dWlkLWhleCIgXAorCWFuZCAidXVpZC1zdHJpbmciLiAKK3VubmFtZWQtZmc6ICJ7MH0iIGRlY2xhcmVzIGFuIHVubmFtZWQgZmV0Y2ggZ3JvdXAuICBBbGwgZmV0Y2ggZ3JvdXBzIFwKKwltdXN0IGhhdmUgbmFtZXMuCitiYWQtZmctZmllbGQ6IEZldGNoIGdyb3VwICJ7MH0iIGluIHR5cGUgInsxfSIgaW5jbHVkZXMgZmllbGQgInsyfSIsIGJ1dCBcCisJdGhpcyBmaWVsZCBpcyBub3QgZGVjbGFyZWQgaW4gInsxfSIsIG9yIGlzIG5vdCBwZXJzaXN0ZW50LiAgQ3VycmVudGx5LCBcCisJT3BlbkpQQSBvbmx5IHN1cHBvcnRzIGRlY2xhcmVkIGZpZWxkcyBpbiBmZXRjaCBncm91cHMuCitub3QtdXBkYXRlLWRlbGV0ZS1xdWVyeTogQ2Fubm90IHBlcmZvcm0gYW4gdXBkYXRlIG9yIGRlbGV0ZSBvcGVyYXRpb24gXAorCW9uIHNlbGVjdCBxdWVyeTogInswfSIuCitub3Qtc2VsZWN0LXF1ZXJ5OiBDYW5ub3QgcGVyZm9ybSBhIHNlbGVjdCBvbiB1cGRhdGUgb3IgZGVsZXRlIHF1ZXJ5OiAiezB9Ii4KK25vLXJlc3VsdHM6IFF1ZXJ5IGRpZCBub3QgcmV0dXJuIGFueSByZXN1bHRzOiAiezB9Ii4KK211bHQtcmVzdWx0czogUXVlcnkgcmV0dXJuZWQgbXVsdGlwbGUgcmVzdWx0czogInswfSIuCituby1wb3MtbmFtZWQtcGFyYW1zLW1peDogQ2Fubm90IG1peCBuYW1lZCBhbmQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGluIHF1ZXJ5IFwKKwkiezB9Ii4KK2JhZC1xdWVyeS1oaW50OiAiezB9IiBpcyBub3QgYSByZWNvZ25pemVkIHF1ZXJ5IGhpbnQuCitiYWQtcXVlcnktaGludC12YWx1ZTogSW52YWxpZCB2YWx1ZSBzcGVjaWZpZWQgZm9yIHF1ZXJ5IGhpbnQgInswfSI6IHsxfQorZGV0YWNoZWQ6IENhbm5vdCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIG9uIGRldGFjaGVkIGVudGl0eSAiezB9Ii4KK3JlbW92ZWQ6IENhbm5vdCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIG9uIHJlbW92ZWQgZW50aXR5ICJ7MH0iLgorYmFkLWFsaWFzOiBUaGVyZSBpcyBubyBrbm93biBlbnRpdHkgY2xhc3MgZm9yIGVudGl0eSBuYW1lICJ7MH0iLiAgSXQgaXMgXAorCXBvc3NpYmxlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBcCisJSlZNLgorbmFtaW5nLWV4Y2VwdGlvbjogQSBOYW1pbmdFeGNlcHRpb24gd2FzIHRocm93biB3aGlsZSBvYnRhaW5pbmcgdGhlIFwKKwlmYWN0b3J5IGF0ICJ7MH0iIGZyb20gSk5ESS4KK2JhZC1qYXItbmFtZTogVGhlIGphciByZXNvdXJjZSAiezB9IiBjYW5ub3QgYmUgbG9hZGVkLgorbWlzc2luZy14bWwtY29uZmlnOiBUaGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZSAiezB9IiBmb3IgcGVyc2lzdGVuY2UgdW5pdCBcCisJInsxfSIgY2FuJyd0IGJlIGZvdW5kIGluIHlvdXIgY2xhc3MgcGF0aC4KK2NhbnRsb2FkLXhtbC1jb25maWc6IFRoZSBzcGVjaWZpZWQgWE1MIHJlc291cmNlICJ7MH0iIGZvciBwZXJzaXN0ZW5jZSB1bml0IFwKKwkiezF9IiBjYW4nJ3QgYmUgcGFyc2VkLgordW5rbm93bi1wcm92aWRlcjogUGVyc2lzdGVuY2UgcHJvdmlkZXIgInsyfSIgc3BlY2lmaWVkIGluIHBlcnNpc3RlbmNlIHVuaXQgXAorCSJ7MX0iIGluICJ7MH0iIGlzIG5vdCBhIHJlY29nbml6ZWQgcHJvdmlkZXIuCitpbGxlZ2FsLWluZGV4OiBUaGUgcGFyYW1ldGVyIGluZGV4IHswfSBpcyBpbnZhbGlkLiBQYXJhbWV0ZXJzIG11c3QgYmUgXAorCWludGVnZXJzIHN0YXJ0aW5nIGF0IDEuCitjb25mLWxvYWQ6IFNldHRpbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZyb20gInswfSIgaW50byBjb25maWd1cmF0aW9uOiB7MX0KK25vLW5hbWVkLWZpZWxkOiBUeXBlICJ7MH0iIGRvZXMgbm90IGhhdmUgYSBtYW5hZ2VkIGZpZWxkIG5hbWVkICJ7MX0iLgordW5zdXBwb3J0ZWQtdGFnOiBPcGVuSlBBIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IFhNTCBlbGVtZW50ICJ7MH0iLiBJZ25vcmluZy4KK25vLWNsYXNzOiBObyBjbGFzcyBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZC4KK2ludmFsaWQtaWQtY2xhc3M6IENvdWxkIG5vdCBsb2FkIGlkIGNsYXNzICJ7MX0iIGZvciB0eXBlICJ7MH0iLgoraW52YWxpZC1hdHRyOiBDb3VsZCBub3QgZmluZCBwcm9wZXJ0eS9maWVsZCB3aXRoIHRoZSBuYW1lICJ7MH0iIGluIHR5cGUgInsxfSIuCitzZXItY2xhc3M6IFdyaXRpbmcgY2xhc3MgInswfSIuCitzZXItY2xzLXF1ZXJ5OiBXcml0aW5nIHF1ZXJ5ICJ7MX0iIGluIGNsYXNzICJ7MH0iLgorc2VyLXF1ZXJ5OiBXcml0aW5nIHF1ZXJ5ICJ7MX0iLgorc2VyLXNlcXVlbmNlOiBXcml0aW5nIHNlcXVlbmNlICJ7MH0iLgorbm8tc3FsOiBZb3UgbXVzdCBwcm92aWRlIGEgU1FMIHN0cmluZyB3aGVuIGNyZWF0aW5nIGEgbmF0aXZlIHF1ZXJ5LgorYmFkLXBhcmFtLXR5cGU6IFRoZSBwYXJhbWV0ZXIgInswfSIgaXMgb2YgdHlwZSAiezF9IiwgYnV0IHRoZSBcCisJZGVjbGFyYXRpb24gaW4gdGhlIHF1ZXJ5IGlzIGZvciB0eXBlICJ7Mn0iLiAKK2JhZC1lbS1wcm9wOiBJbnZhbGlkIEVudGl0eU1hbmFnZXIgcHJvcGVydHkgcGFzc2VkIHRvIGNyZWF0ZUVudGl0eU1hbmFnZXIuIFwKKwlLZXk6ICJ7MH0iLCBWYWx1ZTogInsxfSIuCitiYWQtZW0tcHJvcHM6IEludmFsaWQgRW50aXR5TWFuYWdlciBwcm9wZXJ0aWVzIHBhc3NlZCB0byBjcmVhdGVFbnRpdHlNYW5hZ2VyLiBcCisJU2VlIG5lc3RlZCBleGNlcHRpb25zIGZvciBkZXRhaWxzLgorc3lzdGVtLWxpc3RlbmVyLWVycjogQW4gZXJyb3Igb2NjdXJyZWQgaW52b2tpbmcgc3lzdGVtIGVudGl0eSBsaXN0ZW5lciBcCisJY2FsbGJhY2sgb24gaW5zdGFuY2UgInswfSIuCituby10cmFuc2FjdGlvbjogQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIHdpdGggbm8gdHJhbnNhY3Rpb24uCittdWx0aXBsZS1tZXRob2RzLW9uLWNhbGxiYWNrOiBDbGFzcyAiezB9IiBkZWNsYXJlcyBtZXRob2QgInsxfSIgYXMgd2VsbCBcCisJYXMgInsyfSIgZm9yIGhhbmRsaW5nIHRoZSBzYW1lICJ7M30iIGNhbGxiYWNrLiAKK3VubG9hZGFibGUtcHJvdmlkZXI6IFdBUk5JTkc6IFVuYWJsZSB0byBsb2FkIHBlcnNpc3RlbmNlIHByb3ZpZGVyICJ7MH0iIGR1ZSBcCisgICAgdG8gInsxfSIKK3VucmVjb2duaXplZC1wcm92aWRlcjogV0FSTklORzogRm91bmQgdW5yZWNvZ25pemVkIHBlcnNpc3RlbmNlIHByb3ZpZGVyICJ7MH0iIFwKKyAgICBpbiBwbGFjZSBvZiBPcGVuSlBBIHByb3ZpZGVyLiAgVGhpcyBwcm92aWRlcidzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgdXNlZC4KK2NhbnQtY29udmVydC1icm9rZXJmYWN0b3J5OiBVbmFibGUgdG8gY29udmVydCBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBvZiB0eXBlIFwKKyAgICAiezB9IiBpbnRvIGEgQnJva2VyRmFjdG9yeS4KK2NhbnQtY29udmVydC1icm9rZXI6IFVuYWJsZSB0byBjb252ZXJ0IEVudGl0eU1hbmFnZXIgb2YgdHlwZSAiezB9IiBpbnRvIGEgXAorICAgIEJyb2tlci4KK21hcC1wZXJzaXN0ZW50LXR5cGUtbmFtZXM6IE1hcHBpbmcgcmVzb3VyY2UgbG9jYXRpb24gInswfSIgdG8gcGVyc2lzdGVudCBcCisJdHlwZXMgInsxfSIuCittYXAtcGVyc2lzdGVudC10eXBlcy1za2lwcGluZy1ub24tdXJsOiBTa2lwcGluZyBwZXJzaXN0ZW50IHR5cGUgbG9jYXRpb24gXAorICAgIGFzc29jaWF0aW9uIGZvciBsb2NhdGlvbiAiezB9IiBzaW5jZSBpdCBpcyBub3QgYSBVUkwuCittYXAtcGVyc2lzdGVudC10eXBlcy1za2lwcGluZy1jbGFzczogU2tpcHBpbmcgcGVyc2lzdGVudCB0eXBlIGxvY2F0aW9uIFwKKyAgICBhc3NvY2lhdGlvbiBmb3IgbG9jYXRpb24gInswfSIgc2luY2UgaXQgaXMgYSBjbGFzcywgYW5kIHdpbGwgbm90IFwKKyAgICBuZWVkIHRvIGJlIHJlLXBhcnNlZCBsYXRlci4KKyAgICAKK0VudGl0eU1hbmFnZXJGYWN0b3J5LW5hbWU6IEVudGl0eU1hbmFnZXJGYWN0b3J5IGltcGxlbWVudGF0aW9uCitFbnRpdHlNYW5hZ2VyRmFjdG9yeS1kZXNjOiBBbGxvd3MgZXh0ZW5zaW9uIG9mIHN0YW5kYXJkIFwKKyAgICBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlckZhY3RvcnlJbXBsIGZvciBjdXN0b20gYmVoYXZpb3IuCitFbnRpdHlNYW5hZ2VyRmFjdG9yeS10eXBlOiBHZW5lcmFsCitFbnRpdHlNYW5hZ2VyRmFjdG9yeS1jYXQ6IFBlcnNpc3RlbmNlLkFkdmFuY2VkCitFbnRpdHlNYW5hZ2VyRmFjdG9yeS1kaXNwbGF5b3JkZXI6IDUwCitFbnRpdHlNYW5hZ2VyRmFjdG9yeS1leHBlcnQ6IHRydWUKK0VudGl0eU1hbmFnZXJGYWN0b3J5LWludGVyZmFjZTogb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvb3JtLXhzZC5yc3JjIGIvMTAwMG1wMS9vcGVuanBhLXBlcnNpc3RlbmNlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2Uvb3JtLXhzZC5yc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMGQxZGQKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9vcm0teHNkLnJzcmMKQEAgLTAsMCArMSwxNTE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgorPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczpvcm09Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCisgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAorICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCisgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCisgIHZlcnNpb249IjEuMCI+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIEAoIylvcm1fMV8wLnhzZCAxLjAgIEZlYiAxNCAyMDA2CisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPHhzZDphbm5vdGF0aW9uPgorICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCisKKyAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2Ugb2JqZWN0LXJlbGF0aW9uYWwgCisgICAgICAgbWFwcGluZyBmaWxlLgorICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlIAorICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZSAKKyAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgorCisgICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKKyAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgorCisgICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKKyAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAorICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KKyAgICAgICAgCisgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKKyAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgorICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCisKKyAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKKyAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKKyAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCisgICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKKyAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSBvciBuYW1lZC1uYXRpdmUtcXVlcnkKKyAgICAgICAgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIAorICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCisgICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKKyAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKKyAgICAgICAgYmUgcGFydGlhbC4KKworICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgCisgICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4wIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCisgICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKKworICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQgdGhlbiAKKyAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKKyAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKKyAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCisgICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAorICAgICAgICAKKyAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKKyAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcworICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgorICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKKyAgICAgICAgICAgIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAorICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCisgICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KKyAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKKyAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcworICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCisgICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKKyAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCisgICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQorICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQorICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCisgICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCisgICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKKyAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cworICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKKyAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKKyAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307CisgICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307CisgICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKKyAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOworICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgIH0KKworICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKKyAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OworICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCisgICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgQ29sdW1uIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7CisgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKKyAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7CisgICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgeworICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKKyAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCisgICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgorICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+CisgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgorICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKKyAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7CisgICAgICAgICAgT1JESU5BTCwKKyAgICAgICAgICBTVFJJTkcKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7CisgICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOworICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOworICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKKyAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKKyAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluaGVyaXRhbmNlIHsKKyAgICAgICAgICBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTppbmhlcml0YW5jZS10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEluaGVyaXRhbmNlVHlwZQorICAgICAgICAgIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTU307CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7CisgICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAorICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAorICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCisgICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKKyAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKKyAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06ZW1iZWRkYWJsZS1hdHRyaWJ1dGVzIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUtYXR0cmlidXRlcyI+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMgCisgICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCisgICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKKyAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAorICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseSAKKyAgICAgICAgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKKyAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7CisgICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKworCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZS14c2QucnNyYyBiLzEwMDBtcDEvb3BlbmpwYS1wZXJzaXN0ZW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlLXhzZC5yc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTYxYTkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcGVyc2lzdGVuY2Uvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZS14c2QucnNyYwpAQCAtMCwwICsxLDI2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gcGVyc2lzdGVuY2UueG1sIHNjaGVtYSAtLT4KKzx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiIAorICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICB4bWxuczpwZXJzaXN0ZW5jZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCisgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKKyAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKKyAgdmVyc2lvbj0iMS4wIj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKXBlcnNpc3RlbmNlXzFfMC54c2QgIDEuMCAgRmViIDkgMjAwNgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisgICA8eHNkOmFubm90YXRpb24+CisgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKKworICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICBUaGUgZmlsZSBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluIHRoZSAKKyAgICAgcGVyc2lzdGVuY2UgYXJjaGl2ZS4KKyAgICAgUGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGluZGljYXRlCisgICAgIHRoZSBwZXJzaXN0ZW5jZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKKworICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQorCisgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5CisgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6CisKKyAgICAgIDxwZXJzaXN0ZW5jZSB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKKyAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIgorICAgICAgICB2ZXJzaW9uPSIxLjAiPgorICAgICAgICAgIC4uLgorICAgICAgPC9wZXJzaXN0ZW5jZT4KKworICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZSI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisKKyAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gb2YgYSBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKworICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdmlkZXIiIHR5cGU9InhzZDpzdHJpbmciIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXIgY2xhc3MgdGhhdCBzdXBwbGllcyBFbnRpdHlNYW5hZ2VycyBmb3IgdGhpcyAKKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiB0aGUgSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub24tanRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiBhIG5vbi1KVEEgZGF0YXNvdXJjZSB0byB1c2UuCisKKyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBpbmctZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluaW5nIG1hcHBpbmcgaW5mb3JtYXRpb24uIExvYWRlZCBhcyBhIHJlc291cmNlIAorICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuCisKKyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imphci1maWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBKYXIgZmlsZSB0aGF0IHNob3VsZCBiZSBzY2FubmVkIGZvciBlbnRpdGllcy4gCisgICAgICAgICAgICAgICAgICAgIE5vdCBhcHBsaWNhYmxlIHRvIEphdmEgU0UgcGVyc2lzdGVuY2UgdW5pdHMuCisKKyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBDbGFzcyB0byBzY2FuIGZvciBhbm5vdGF0aW9ucy4gIEl0IHNob3VsZCBiZSBhbm5vdGF0ZWQgCisgICAgICAgICAgICAgICAgICAgIHdpdGggZWl0aGVyIEBFbnRpdHksIEBFbWJlZGRhYmxlIG9yIEBNYXBwZWRTdXBlcmNsYXNzLgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBXaGVuIHNldCB0byB0cnVlIHRoZW4gb25seSBsaXN0ZWQgY2xhc3NlcyBhbmQgamFycyB3aWxsIAorICAgICAgICAgICAgICAgICAgICBiZSBzY2FubmVkIGZvciBwZXJzaXN0ZW50IGNsYXNzZXMsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIAorICAgICAgICAgICAgICAgICAgICBqYXIgb3IgZGlyZWN0b3J5IHdpbGwgYWxzbyBiZSBzY2FubmVkLiBOb3QgYXBwbGljYWJsZSB0byAKKyAgICAgICAgICAgICAgICAgICAgSmF2YSBTRSBwZXJzaXN0ZW5jZSB1bml0cy4KKworICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgQSBsaXN0IG9mIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgIEEgbmFtZS12YWx1ZSBwYWlyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKworICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgTmFtZSB1c2VkIGluIGNvZGUgdG8gcmVmZXJlbmNlIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+CisKKyAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwZXJzaXN0ZW5jZTpwZXJzaXN0ZW5jZS11bml0LXRyYW5zYWN0aW9uLXR5cGUiPgorICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICBUeXBlIG9mIHRyYW5zYWN0aW9ucyB1c2VkIGJ5IEVudGl0eU1hbmFnZXJzIGZyb20gdGhpcyAKKyAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgorCisgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InBlcnNpc3RlbmNlOnZlcnNpb25UeXBlIiAKKyAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjAiIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtdHJhbnNhY3Rpb24tdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIFRyYW5zYWN0aW9uVHlwZSB7IEpUQSwgUkVTT1VSQ0VfTE9DQUwgfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpUQSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1VSQ0VfTE9DQUwiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9CVUlMRElORy50eHQgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9CVUlMRElORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0Y2U1MAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L0JVSUxESU5HLnR4dApAQCAtMCwwICsxLDE2NSBAQAorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIAorICAgICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgT3BlbkpQQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmUgaG93IHRvIGJ1aWxkIE9wZW5KUEEgZnJvbSBzb3VyY2UgY29kZSB1c2luZyB0aGUKK0FwYWNoZSBNYXZlbiAyIGJ1aWxkIHRvby4gVGhleSBhcmUgd3JpdHRlbiBmb3IgdXNlIGZyb20gdGhlIGNvbnNvbGUsIGFuZCBhcmUgCitrbm93biB0byB3b3JrIG9uIExpbnV4IGFuZCBNYWMgT1NYLiBUaGV5IGFyZSBhbHNvIHJlcG9ydGVkIHRvIHdvcmsgZnJvbSBXaW5kb3dzLgorCitUaGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBiZSBmb3VuZCBvbiB0aGUgT3BlbkpQQSAKK3dlYnNpdGUgYXQgaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL29wZW5qcGEvYnVpbGRpbmctb3BlbmpwYS5odG1sCisKKyAgIDEuIEVuc3VyZSB0aGF0IHlvdSBoYXZlIEphdmEgMS41IGluc3RhbGxlZCBhbmQgaW4geW91ciBwYXRoIGJ5IHJ1bm5pbmc6CisgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICBPcGVuSlBBIHJlcXVpcmVzIEphdmEgMS41IGJ1dCB3aWxsIG5vdCBjb21waWxlIHdpdGggSmF2YSA2LiBGb3IgbW9yZQorICAgICAgZGV0YWlsIHBsZWFzZSBzZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNS4KKyAgIDIuIEluc3RhbGwgdGhlIGJ1aWxkIHRvb2wgQXBhY2hlIE1hdmVuIDIuMC40LCBmcm9tIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLy4KKyAgICAgIElmIGl0IGlzIGluc3RhbGxlZCBjb3JyZWN0bHksIHR5cGluZyBtdm4gLXYgZnJvbSB0aGUgY29uc29sZSB3aWxsIHJlc3VsdAorICAgICAgaW4gdGhlIHRleHQgIk1hdmVuIHZlcnNpb246IDIuMC40IgorICAgMy4gRXh0cmFjdCB0aGUgc291cmNlIGFyY2hpdmUgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgZG9uZSBzby4gCisgICAgICBUaGUgc291cmNlIHdpbGwgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBuYW1lZDoKKyAgICAgIG9wZW5qcGEtcHJvamVjdC0ke3ZlcnNpb259LXNvdXJjZS4gV2hlcmUgJHt2ZXJzaW9ufSBpcyB0aGUgb3BlbmpwYSAKKyAgICAgIHZlcnNpb24sIGZvciBleGFtcGxlIG9wZW5qcGEtcHJvamVjdC0wLjkuNy1pbmN1YmF0aW5nLXNvdXJjZS4KKyAgIDQuIENoYW5nZSB0byB0aGUgb3BlbmpwYSBzb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4KKyAgICAgIHRoZSBwcmV2aW91cyBzdGVwLgorICAgNS4gQnVpbGQgT3BlbkpQQSBieSBydW5uaW5nOiBtdm4gcGFja2FnZSBvciBiZXR0ZXIgbXZuIGluc3RhbGwuIAorICAgICAgVGhlIGZpcnN0IHRpbWUgeW91IHJ1biB0aGUgYnVpbGQsIG1hbnkgZGVwZW5kZW5jaWVzIGFyZSBhdXRvbWF0aWNhbGx5IAorICAgICAgcmVzb2x2ZWQgYW5kIGRvd25sb2FkZWQuIEl0IGlzIGNvbW1vbiBmb3IgZGVwZW5kZW5jeSBkb3dubG9hZGluZyB0byBmYWlsCisgICAgICB0aGUgZmlyc3QgdGltZSwgd2hpY2ggd2lsbCBmYWlsIHRoZSBidWlsZC4gSWYgYW55IG9mIHRoZXNlIGRlcGVuZGVuY3kgCisgICAgICBkb3dubG9hZHMgZmFpbCwganVzdCByZS1ydW4gdGhlIGNvbW1hbmQuIFlvdSBtYXkgYWxzbyBhZGQgdGhlIGZvbGxvd2luZyAKKyAgICAgIHRvIHlvdXIgfi8ubTIvc2V0dGluZy54bWwgZmlsZQorICAgICAgKHNlZSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvbWluaS9ndWlkZS1taXJyb3Itc2V0dGluZ3MuaHRtbCkKKworICAgICAgIDxzZXR0aW5ncz4KKyAgICAgICAgICAgPG1pcnJvcnM+CisgICAgICAgICAgICAgICA8bWlycm9yPgorICAgICAgICAgICAgICAgICAgIDxpZD5yZXBvLm1lcmdlcmUuY29tPC9pZD4KKyAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvLm1lcmdlcmUuY29tL21hdmVuMjwvdXJsPgorICAgICAgICAgICAgICAgICAgIDxtaXJyb3JPZj5jZW50cmFsPC9taXJyb3JPZj4KKyAgICAgICAgICAgICAgICAgICA8L21pcnJvcj4KKyAgICAgICAgICAgPC9taXJyb3JzPgorICAgICAgICA8L3NldHRpbmdzPgorCisgICAgICAgIElmIGFueSB0ZXN0cyBmYWlsLCBhbmQgeW91IHdhbnQgdG8gaWdub3JlIHRoZSBmYWlsdXJlcywgaW5zdGVhZCBydW46CisgICAgICAgIG12biBwYWNrYWdlIC1EdGVzdD1mYWxzZQorCitBbiBleGFtcGxlIHNlc3Npb24gYXMgYXMgZm9sbG93czoKKworJCBjZCAvdG1wLworCiskIGphdmEgLXZlcnNpb24KKworamF2YSB2ZXJzaW9uICIxLjUuMF8wNiIKK0phdmEoVE0pIDIgUnVudGltZSBFbnZpcm9ubWVudCwgU3RhbmRhcmQgRWRpdGlvbiAoYnVpbGQgMS41LjBfMDYtMTEyKQorSmF2YSBIb3RTcG90KFRNKSBDbGllbnQgVk0gKGJ1aWxkIDEuNS4wXzA2LTY0LCBtaXhlZCBtb2RlLCBzaGFyaW5nKQorCiskIG12biAtdgorCitNYXZlbiB2ZXJzaW9uOiAyLjAuNAorCiskIHN2biAtLXZlcnNpb24KKworc3ZuLCB2ZXJzaW9uIDEuMS40IChyMTM4MzgpCisgICBjb21waWxlZCBKdWwgMTAgMjAwNiwgMjI6MTc6NDMKKworJCBzdm4gY28gaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvaW5jdWJhdG9yL29wZW5qcGEvdHJ1bmsvCisKK0EgIHRydW5rL29wZW5qcGEtbGliCitBICB0cnVuay9vcGVuanBhLWxpYi9zcmMKK0EgIHRydW5rL29wZW5qcGEtbGliL3NyYy90ZXN0CitBICB0cnVuay9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhCitBICB0cnVuay9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZworQSAgdHJ1bmsvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlCitBICB0cnVuay9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYQorQSAgdHJ1bmsvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliCitBICB0cnVuay9vcGVuanBhLWxpYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvdGVzdAorQSAgdHJ1bmsvb3BlbmpwYS1saWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL29wZW5qcGEvbGliL3Rlc3QvQWJzdHJhY3RUZXN0Q2FzZS4KK2phdmEKKworIC4uLgorCitBICB0cnVuay9vcGVuanBhLXBlcnNpc3RlbmNlL3BvbS54bWwKK0NoZWNrZWQgb3V0IHJldmlzaW9uIDQyMTM4MS4KKworJCBjZCB0cnVuay8KKworJCBtdm4gY29tcGlsZQorCitbSU5GT10gU2Nhbm5pbmcgZm9yIHByb2plY3RzLi4uCitbSU5GT10gUmVhY3RvciBidWlsZCBvcmRlcjogCitbSU5GT10gICBPcGVuSlBBCitbSU5GT10gICBVdGlsaXRpZXMKK1tJTkZPXSAgIEtlcm5lbAorW0lORk9dICAgSkRCQworW0lORk9dICAgWE1MIFN0b3JlCitbSU5GT10gICBKREJDIDEuNQorW0lORk9dICAgS2VybmVsIDEuNQorW0lORk9dICAgSlBBCitbSU5GT10gICBKUEEgSkRCQworW0lORk9dICAgT3BlbkpQQSBQcm9qZWN0CitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW0lORk9dIEJ1aWxkaW5nIE9wZW5KUEEKK1tJTkZPXSAgICB0YXNrLXNlZ21lbnQ6IFtjb21waWxlXQorW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIC4uLgorCitbSU5GT10gCitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbSU5GT10gUmVhY3RvciBTdW1tYXJ5OgorW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW0lORk9dIE9wZW5KUEEgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gU1VDQ0VTUyBbMC43ODlzXQorW0lORk9dIFV0aWxpdGllcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gU1VDQ0VTUyBbMy40ODlzXQorW0lORk9dIEtlcm5lbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gU1VDQ0VTUyBbOS4zNDdzXQorW0lORk9dIEpEQkMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gU1VDQ0VTUyBbMTIuMjA4c10KK1tJTkZPXSBYTUwgU3RvcmUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzEuMTY2c10KK1tJTkZPXSBKREJDIDEuNSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzEuNTE5c10KK1tJTkZPXSBLZXJuZWwgMS41IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzAuNTM4c10KK1tJTkZPXSBKUEEgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzIuNzc3c10KK1tJTkZPXSBKUEEgSkRCQyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzIuMTUxc10KK1tJTkZPXSBPcGVuSlBBIFByb2plY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzEuNDk1c10KK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSBCVUlMRCBTVUNDRVNTRlVMCitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbSU5GT10gVG90YWwgdGltZTogMzcgc2Vjb25kcworW0lORk9dIEZpbmlzaGVkIGF0OiBXZWQgSnVsIDI2IDExOjQ0OjMzIFBEVCAyMDA2CitbSU5GT10gRmluYWwgTWVtb3J5OiAxME0vNDFNCitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworJCBtdm4gcGFja2FnZSAtRHRlc3Q9ZmFsc2UKKworW0lORk9dIFNjYW5uaW5nIGZvciBwcm9qZWN0cy4uLgorCisuLi4KKworW0lORk9dIFthc3NlbWJseTphc3NlbWJseSB7ZXhlY3V0aW9uOiBiaW59XQorW0lORk9dIEJ1aWxkaW5nIHppcDogL3RtcC9vcGVuanBhdGVzdGJ1aWxkL3RydW5rL29wZW5qcGEtcHJvamVjdC90YXJnZXQvZmlsdGVyZWQKKy1zaXRlL3Jlc291cmNlcy9kb3dubG9hZHMvb3BlbmpwYS0wLjkuMC56aXAKKworLi4uIAorCisKKyQgbHMgLWxoIG9wZW5qcGEtcHJvamVjdC90YXJnZXQvZmlsdGVyZWQtc2l0ZS9yZXNvdXJjZXMvZG93bmxvYWRzLworCit0b3RhbCA5LjJNCistcnctci0tci0tICAgIDEgbXBydWRob20gd2hlZWwgICAgICAgNC4wTSBKdWwgMjYgMTE6NDYgb3BlbmpwYS0wLjkuMC1zb3VyY2VzLnppcAorLXJ3LXItLXItLSAgICAxIG1wcnVkaG9tIHdoZWVsICAgICAgIDUuMk0gSnVsIDI2IDExOjQ2IG9wZW5qcGEtMC45LjAuemlwCisKKyAKZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L0NIQU5HRVMudHh0IGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvQ0hBTkdFUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0NDA2OQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L0NIQU5HRVMudHh0CkBAIC0wLDAgKzEsODggQEAKK0NoYW5nZXMgaW4gT3BlbkpQQSAwLjkuNworCitBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgY2hhbmdlIGNhbiBiZSBmb3VuZCBpbiB0aGUgT3BlbkpQQSAKK3Byb2plY3QncyBpc3N1ZSB0cmFja2VyIGF0IGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBCisKKyoqIEJ1Z3MKKyAgICAqIFtPUEVOSlBBLTE2XSAtIE5QRSBpbiBjcmVhdGVRdWVyeSBmb3IgRUpCIFFMIHdpdGggbmVzdGVkIGNvcnJlbGF0ZWQgc3VicXVlcmllcworICAgICogW09QRU5KUEEtMjFdIC0gVGltZSBpcyBtaXNzaW5nIGZyb20gbGlzdCBvZiBtdXRhYmxlIGNsYXNzZXMuCisgICAgKiBbT1BFTkpQQS0yMl0gLSBsb2NhdGUgJiBzdWJzdHJpbmcgcXVlcmllcyBmYWlsIGJvdGggZGIyICYgZGVyYnksIGNhbm5vdCB1c2UgcGFyYW1ldGVyIG1hcmtlcnMgaW4gZXhwcmVzc2lvbiA/LT8KKyAgICAqIFtPUEVOSlBBLTIzXSAtIC00MTggc3FsZXhjZXB0aW9uIHVzaW5nIERCMiBhbmQgRUpCIFFMIHdpdGggU1FSVCBvciBNT0QKKyAgICAqIFtPUEVOSlBBLTI0XSAtIEFsbG93IE9wZW5KUEEgdG8gYmUgZXh0ZW5zaWJsZQorICAgICogW09QRU5KUEEtMjVdIC0gSW5jb3JyZWN0IFNRTCBnZW5lcmF0ZWQgZm9yIHF1ZXJpZXMgaW52b2x2aW5nIG1vcmUgdGhhbiBvbmUgQWJzdHJhY3RTY2hlbWFOYW1lcywgZ2VuZXJhdGVkIFNRTCBGUk9NIGNsYXVzZSBpcyBtaXNzaW5nICdUYWJsZSBhbGlhcycKKyAgICAqIFtPUEVOSlBBLTM1XSAtIEluLW1lbW9yeSBEZWxldGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYWN0aXZlIERhdGFDYWNoZQorICAgICogW09QRU5KUEEtNDFdIC0gdHJhbnNmb3JtaW5nIGNsYXNzZXMgZG9lc24ndCB3b3JrCisgICAgKiBbT1BFTkpQQS00OF0gLSAgcGFyc2luZyBlcnJvciAtIGNhc3Qgb2Ygc3Vic2VsZWN0IGRvZXMgbm90IHdvcmsKKyAgICAqIFtPUEVOSlBBLTUwXSAtIGJhZCBzcWwgcHVzaGRvd24sIGNhc3QgY2hhbmdlcyBkYXRhdHlwZQorICAgICogW09QRU5KUEEtNTNdIC0gIGJhZCBzcWwgcHVzaGRvd24gZm9yIG5lc3RlZCBzdWJzZWxlY3RzLCBtaXNzaW5nIG5lc3RlZCBzdWJzZWxlY3QKKyAgICAqIFtPUEVOSlBBLTU0XSAtIGJhZCBzcWwgcHVzaGRvd24sIHNob3VsZCB1c2UgYWxsIHN5bnRheAorICAgICogW09QRU5KUEEtNTZdIC0gaW4gZGVyYnkgY29uY2F0IHdpdGggaW5wdXQgcGFyYW1ldGVyIG5lZWRzIGEgY2FzdCwgb3RoZXJ3aXNlIGJlY29tZXMgbG9uZyB2YXJjaGFyIGFuZCBzb21lIG9wZXJhdGlvbnMgZG8gbm90IHdvcmsKKyAgICAqIFtPUEVOSlBBLTYwXSAtIFNwZWNpZnlpbmcgdGhlIHdyb25nIHBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uIGluIHBlcnNpc3RlbmNlLnhtbCBsZWFkcyB0byBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2UKKyAgICAqIFtPUEVOSlBBLTYyXSAtIEVqYnFsIGpvaW4gcXVlcmllcyBzaG93IGludmFsaWQgbnVsbCBFbnRpdGllcyB3aGVuIHJ1biBpbiBhIG5ldyBwZXJzaXN0ZW5jZSBjb250ZXh0IHdoZXJlIG5vIGVudGl0eSBpbnN0YW5jZXMgZXhpc3QuCisgICAgKiBbT1BFTkpQQS03MV0gLSBDYWNoaW5nIHByaW1pdGl2ZSBhcnJheSB0eXBlcyBjb25zdW1lcyBleGNlc3NpdmUgbWVtb3J5CisgICAgKiBbT1BFTkpQQS03N10gLSBQcm9ibGVtcyBpbiBkZWZhdWx0IHNldHRpbmcgaW4gREIyRGljdGlvbmFyeSAsIGFsc28gbWlzc2luZyBzdXBwb3J0IGZvciBEQjIgei9PUyBwbGF0Zm9ybXMKKyAgICAqIFtPUEVOSlBBLTgwXSAtIEJhZCBFc2NhcGluZyBmb3IgTElLRSBpbiBNeVNRTAorICAgICogW09QRU5KUEEtOThdIC0gSmF2YSBkZWFkbG9jayB3aGVuIGluc2VydCBpbiB0MSBhbmQgZmluZCBpbiB0MiB3aGVuIHVzaW5nIElCTSBKVk0gMS41LjAKKyAgICAqIFtPUEVOSlBBLTEwMF0gLSA8amFyLWZpbGU+IGVudHJpZXMgZmFpbGluZyB0byBiZSBwcm9jZXNzZWQgZm9yIHBlcnNpc3RlbmNlIHVuaXQgcm9vdGVkIGluIGFuIEVBUgorICAgICogW09QRU5KUEEtMTAyXSAtIEpUQSB0cmFuc2FjdGlvbiByb2xsYmFjaywgbm9uZXhpc3RhbnQgaW5zdGFuY2VzLCB0cmFuc2FjdGlvbmFsIHBlcnNpc3RlbmNlIGNvbnRleHQgPT4gZmFpbHVyZXMgZHVyaW5nIGFmdGVyQ29tcGxldGlvbigpIGFuZCBjbG9zZSgpCisgICAgKiBbT1BFTkpQQS0xMDNdIC0gRGVmYXVsdCBMaXN0ZW5lcnMgbm90IGJlaW5nIHByb2Nlc3NlZCBjb3JyZWN0bHkKKyAgICAqIFtPUEVOSlBBLTEwNF0gLSBPcGVuSlBBIGRvZXMgbm90IGRldGFjaCBpbnN0YW5jZXMgb24gcm9sbGJhY2soKQorICAgICogW09QRU5KUEEtMTA3XSAtIEBTcWxSZXN1bHRTZXRNYXBwaW5ncyBmYWlscyBpbiBtYXBwaW5nIHRvb2wgd2l0aCBqYXZhLmxhbmcuQXJyYXlTdG9yZUV4Y2VwdGlvbgorICAgICogW09QRU5KUEEtMTA4XSAtIEBBdHRyaWJ1dGVPdmVycmlkZXMgZmFpbHMgaW4gbWFwcGluZyB0b29sIHdpdGggamF2YS5sYW5nLkFycmF5U3RvcmVFeGNlcHRpb24KKyAgICAqIFtPUEVOSlBBLTEwOV0gLSBldmVyeSBOYXRpdmVRdWVyeSB1c2luZyBTcWxSZXN1bHRTZXRNYXBwaW5nIGZhaWxzIGF0IHJ1bnRpbWUgd2l0aCBUaGVyZSBpcyBubyBxdWVyeSByZXN1bHQgbWFwcGluZyBmb3IgIm51bGwiIHdpdGggbmFtZSAieHh4IiB3aGVuIHRoZSBlbnRpdHkgaXMgcGVyc2lzdGVkIGluIGEgZGlmZmVyZW50IG1ldGhvZCB0aGFuIHRoZSBtZXRob2QgZG9pbmcgdGhlIHF1ZXJ5LiAgCisgICAgKiBbT1BFTkpQQS0xMTBdIC0gRXZlcnkgTmFtZWROYXRpdmVRdWVyeSB1c2luZyBSZXN1bHRTZXRNYXBwaW5nIGZhaWxzIGF0IHJ1bnRpbWUgd2l0aCBjbGFzcyBjYXN0IGV4Y2VwdGlvbiB3aGVuIHRyeSB0byBpdGVyYXRlIG92ZXIgbGlzdDxTb21lIEVudGl0eT4KKyAgICAqIFtPUEVOSlBBLTExMV0gLSBuYXRpdmUgcXVlcmllcyBmYWlsIHdoZW4gdXNlIG5hbWVkIHBhcmFtZXRlcnMKKyAgICAqIFtPUEVOSlBBLTExNV0gLSBCb3R0bGVuZWNrKHMpIHdpdGggdXNpbmcgT3BlbkpQQSBpbiBhIENvbnRhaW5lci1tYW5hZ2VkIGVudmlyb25tZW50CisgICAgKiBbT1BFTkpQQS0xMTZdIC0gRW50aXR5TWFuYWdlci5nZXREZWxlZ2F0ZSBzaG91bGQgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIAorICAgICogW09QRU5KUEEtMTE4XSAtIEF1dG9EZXRhY2ggcHJvcGVydHkgaGFzIG5vIGVmZmVjdAorICAgICogW09QRU5KUEEtMTE5XSAtIEVudGl0eU1hbmFnZXIuY2xlYXIoKSBzaG91bGQgbm90IGltcGxpY2l0bHkgaW52b2tlIHRoZSBmbHVzaCBvcGVyYXRpb24KKyAgICAqIFtPUEVOSlBBLTEyMV0gLSBUYWJsZSBuYW1lIGRlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGluc3RlYWQgb2YgdGhlIGVudGl0eSBuYW1lCisgICAgKiBbT1BFTkpQQS0xMjJdIC0gRW50aXR5TWFuYWdlciBkb2VzIG5vdCB0aHJvdyBleGNlcHRpb25zIGFmdGVyIGNsb3NlKCkgaW4gcmVxdWlyZWQgY2FzZXMKKyAgICAqIFtPUEVOSlBBLTEzMl0gLSBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXJyb3IgZm9yIGVudGl0eSB3aXRoIElEIG9mIHR5cGUgamF2YS5zcWwuRGF0ZQorICAgICogW09QRU5KUEEtMTMzXSAtIENhbid0IGZpbmQgbm9uLXB1YmxpYyBjYWxsYmFjayBtZXRob2RzIHdpdGggc3VwZXJjbGFzcyBvciBpbnRlcmZhY2UgcGFyYW1ldGVycworICAgICogW09QRU5KUEEtMTM0XSAtIEV4dHJhIHVubmVlZGVkIFNRTCBqb2lucyBmb3IgT25lVG9NYW55IHJlbGF0aW9uc2hpcCB3aXRoIGZldGNoIHR5cGUgRUFHRVIKKyAgICAqIFtPUEVOSlBBLTEzOV0gLSBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBtZXJnaW5nIGFuIGVudGl0eSB3aXRoIGEgQ2FsZW5kYXIgZmllbGQuIAorICAgICogW09QRU5KUEEtMTQwXSAtIFdyb25nIHBhY2thZ2UgbmFtZSBpbiB0ZXN0IGNsYXNzZXMKKyAgICAqIFtPUEVOSlBBLTE0Ml0gLSBFbnRpdHkgbmFtZSBpcyBpZ25vcmVkIHdoZW4gc3BlY2lmaWVkIGluIHRoZSBvcm0ueG1sIGZpbGUKKyAgICAqIFtPUEVOSlBBLTE0NF0gLSBKREJDQ29uZmlndXJhdGlvbkltcGwgZG9lcyBub3Qgc3VwcG9ydCBKTkRJIGxvb2t1cCBmb3Igbm9uLWp0YS1kYXRhLXNvdXJjZS4gIAorICAgICogW09QRU5KUEEtMTQ2XSAtIEVudGl0eSBlbmhhbmNlbWVudCBmYWlscyB3aGlsZSB1c2luZyBFbWJlZGRlZElkIG9uIGEgTWFwcGVkU3VwZXJjbGFzcworICAgICogW09QRU5KUEEtMTUwXSAtIEBDb2x1bW4gaW4gQEF0dHJpYnV0ZU92ZXJyaWRlIG5vdCBob25vcmluZyB0YWJsZSBhdHRyaWJ1dGUgdGhhdCBtYXBzIHRvIGEgc2Vjb25kYXJ5IHRhYmxlIGluIG1hcHBlZHN1cGVyY2xhc3MgZW50aXR5CisgICAgKiBbT1BFTkpQQS0xNTRdIC0gT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24gd29ya2luZyB3aXRoICBTYXZlcG9pbnRzCisgICAgKiBbT1BFTkpQQS0xNTVdIC0gIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZHVyaW5nIGNvbW1pdAorICAgICogW09QRU5KUEEtMTU3XSAtIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcnVubmluZyBxdWVyeSB3aXRoIG51bGwgcGFyYW1ldGVyCisgICAgKiBbT1BFTkpQQS0xNjJdIC0gQE9yZGVyQnkgb24gQE9uZVRvTWFueSBkb2VzIG5vdCBhbGxvdyBvcmRlcmluZyBieSBASWQgdmFsdWUKKyAgICAqIFtPUEVOSlBBLTE3NF0gLSBlcnJvciB3aGVuIGZpbmQoKSdpbmcgYW4gYWJzdHJhY3QgY2xhc3MKKyAgICAqIFtPUEVOSlBBLTE3NV0gLSBFYWdlciBzZWxlY3RzIGJ5IFBhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyIG1heSBub3QgdXNlIHRoZSBGZXRjaEJhdGNoU2l6ZQorICAgICogW09QRU5KUEEtMTc5XSAtIFNjaGVtYXMgZGVmaW5lZCBpbiBvcm0ueG1sIGFyZSBvbmx5IGFwcGxpZWQgd2hlbiBhIG5hbWUgaXMgYWxzbyBzcGVjaWZpZWQuIAorICAgICogW09QRU5KUEEtMTgxXSAtIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIGV4ZWN1dGluZyBidWxrIGRlbGV0ZSBvbiBhbiBlbnRpdHkgdGhhdCBvd25zIGEgT25lVG9PbmUgd2l0aCBhIENhc2NhZGUuREVMRVRFIHdoZW4gRGF0YUNhY2hlIGlzIG9uCisgICAgKiBbT1BFTkpQQS0xODVdIC0gb3B0aW9uYWwgYXR0cmlidXRlIGlzIG5vdCBvdmVycmlkZW4gYnkgeG1sIGRlc2NyaXB0b3IKKyAgICAqIFtPUEVOSlBBLTE4Nl0gLSBCdWlsZCBmYWlsdXJlIG9mIE9wZW5KUEEgc291cmNlcyBmcm9tIHRydW5rCisgICAgKiBbT1BFTkpQQS0yMDJdIC0gYWZ0ZXIgaW52b2tpbmcgTFJTIHByb2Nlc3NpbmcgaW4gYSBjbGllbnQgYnkgY2FsbGluZyBhbiBATFJTIGFubm90YXRlZCByZWxhdGlvbnNoaXAsIHRoZSBuZXh0IGVtLmNsZWFyKCkvZW0uY2xvc2UoKSBnZXRzIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5JbnZhbGlkU3RhdGVFeGNlcHRpb246IFlvdSBjYW5ub3QgdHJhbnNmZXIgbGFyZ2UgcmVzdWx0IHNldCBmaWVsZHMgZnJvbSBvbmUgb2JqZWN0IG9yIGZpZWxkIHRvIGFub3RoZXIKKyAgICAqIFtPUEVOSlBBLTIwOF0gLSBOb1Jlc3VsdEV4Y2VwdGlvbiBhbmQgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uIGFyZSBub3QgdGhyb3duIHdoZW4gZXhwZWN0ZWQKKyAgICAqIFtPUEVOSlBBLTIxNF0gLSBOZWVkIHRvIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgcHJpbWFyeSBrZXlzCisKKyoqIEltcHJvdmVtZW50cworICAgICogW09QRU5KUEEtMTBdIC0gcGVyc2lzdGVuY2UgdW5pdCBuYW1lIHNob3VsZCBiZSBkZWZhdWx0IGRpYWdub3N0aWMgY29udGV4dCBmb3Igc3RhbmRhcmQgT3BlbkpQQSBsb2cgaW1wbAorICAgICogW09QRU5KUEEtMzddIC0gU3VwcG9ydCBhbnQgdHlwZWRlZnMgZm9yIE9wZW5KUEEgdGFza3MKKyAgICAqIFtPUEVOSlBBLTU1XSAtIEFsbG93IGV4ZWN1dGVVcGRhdGUoKSBpbnZvY2F0aW9ucyBvbiBuYXRpdmUgcXVlcmllcworICAgICogW09QRU5KUEEtNTddIC0gcGVyc2lzdGVuY2VfMV8wLnhzZCBpcyBtaXNzaW5nCisgICAgKiBbT1BFTkpQQS02M10gLSBCZXR0ZXIgcGVzc2ltaXN0aWMgbG9jayBzdXBwb3J0IGZvciBEQjIgdjguMisKKyAgICAqIFtPUEVOSlBBLTE1MV0gLSBBZGRlZCBmaWVsZCBpbiBlbmhhbmNlZCB2ZXNyaW9uIG9mIGEgY2xhc3MgaXMgbm90IHNlcmlhbGl6ZWQuIEhlbmNlIHRoZSBjaGFuZ2UgaW4gZGV0YWNoZWQrc2VyaWFsaXplZCBpbnN0YW5jZXMgaXMgbm90IHJlZ2lzdGVyZWQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiAgCisgICAgKiBbT1BFTkpQQS0xNTNdIC0gV2ViU3BoZXJlIGFuZCBub24tanRhLWRhdGEtc291cmNlIGFuZCBkZWZhdWx0IE1hbmFnZWRSdW50aW1lCisgICAgKiBbT1BFTkpQQS0xNThdIC0gT3BlbkpQQSBsb2dzIG92ZXJseS12ZXJib3NlIGF0IElORk8gbGV2ZWwKKyAgICAqIFtPUEVOSlBBLTE2MV0gLSBPdmVydXNlIG9mIHN5bmNocm9uaXphdGlvbiBpbiBBYnN0cmFjdEJyb2tlckZhY3RvcnkKKyAgICAqIFtPUEVOSlBBLTE2Nl0gLSBUcmFjayB0aGUgcmVhc29uIHdoeSBhIHNldFJvbGxiYWNrT25seSBpbnZvY2F0aW9uIHdhcyBtYWRlCisgICAgKiBbT1BFTkpQQS0xNzZdIC0gRXhjZXB0aW9uIHByZWZpeGVzIHNob3VsZCBiZSBodW1hbi1yZWFkYWJsZQorICAgICogW09QRU5KUEEtMTk2XSAtIEVhc2UgdGhlIHJlc3RyaWN0aW9ucyBvbiBmb3JjaW5nIGEgbWF0Y2hlIGJldHdlZW4gdGhlIG51bWJlciBvZiBkZWNsYXJlZCBhbmQgYXNzaWduZWQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzCisKKyoqIE5ldyBGZWF0dXJlcworICAgICogW09QRU5KUEEtOTJdIC0gU3VwcG9ydCBmb3IgSDIgRGF0YWJhc2UgRW5naW5lCisgICAgKiBbT1BFTkpQQS05M10gLSBTZXF1ZW5jZSBnZW5lcmF0aW9uIGluIGEgSlRBIGVudmlyb25tZW50IHNob3VsZCBub3QgcmVxdWlyZSBub24tSlRBIGRhdGFzb3VyY2UKKyAgICAqIFtPUEVOSlBBLTk0XSAtIEFsbG93IE1hcHBpbmdUb29sIGFuZCBwZXJzaXN0ZW5jZS54bWwgdG8gc3VwcG9ydCBkcm9wLWNyZWF0ZSBmb3IgZGF0YWJhc2Ugc2NoZW1hCisgICAgKiBbT1BFTkpQQS0xODJdIC0gZGIyIHVwZGF0ZSBsb2NrIHN5bnRheCBXSVRIIDxpc29sYXRpb24+IFVTRSBBTkQgS0VFUCBVUERBVEUgTE9DS1MKKworKiogVGFza3MKKyAgICAqIFtPUEVOSlBBLTM2XSAtIEFkZCBjd2lraSB1cmwgdG8gaW5jdWJhdG9yIHN0YXR1cyBwYWdlCisKKyoqIFRlc3RzCisgICAgKiBbT1BFTkpQQS00MF0gLSBUZXN0aW5nIE9wZW5KUEEgYW5kIFNwcmluZyBpbnRlZ3JhdGlvbiBmYWlscwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvRElTQ0xBSU1FUi50eHQgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9ESVNDTEFJTUVSLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDRlNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvRElTQ0xBSU1FUi50eHQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvTElDRU5TRS50eHQgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU3ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvTElDRU5TRS50eHQKQEAgLTAsMCArMSwzNzYgQEAKKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCisNCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCisNCisgICAxLiBEZWZpbml0aW9ucy4NCisNCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KKw0KKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KKw0KKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQorDQorICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQorDQorICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQorDQorICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCisNCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KKw0KKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQorICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQorDQorICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQorICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KKw0KKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQorDQorICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCisNCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQorICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQorICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KKw0KKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCisNCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KKw0KKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQorDQorICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQorICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQorDQorICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQorICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCisNCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQorICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQorDQorICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KKw0KKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQorDQorICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQorICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCisNCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KKw0KKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCisNCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCisNCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQorDQorICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQorDQorICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQorDQorICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgIExJQ0VOU0VTIEZPUiBJTkNMVURFRCBERVBFTkRFTkNJRVMNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK0FsbCB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBPcGVuSlBBIHByb2plY3QgaXMgcmVsZWFzZWQgdW5kZXIgdGhlDQorbGljZW5zZSBhYm92ZS4gQWRkaXRpb25hbGx5LCB0aGUgT3BlbkpQQSBiaW5hcnkgZGlzdHJpYnV0aW9uDQoraW5jbHVkZXMgYSBudW1iZXIgb2YgdGhpcmQtcGFydHkgZmlsZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4NCitvcmRlciB0byB0aGUgc29mdHdhcmUgdG8gZnVuY3Rpb24uIFVubGVzcyBub3RlZCBiZWxvdywgdGhlc2UgamFycw0KK2FuZCByZXNvdXJjZSBmaWxlcyBhcmUgYWxzbyByZWxlYXNlZCB1bmRlciB0aGUgQVNGIGxpY2Vuc2UgYWJvdmUuDQorDQorVGhlIGV4Y2VwdGlvbnMgYXJlIGFzIGZvbGxvd3M6DQorDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICBvcm0teHNkLnJzcmMgLSBpbmNsdWRlZCBpbiB0aGUgb3BlbmpwYSBqYXIsIHRha2VuIGZyb206DQorICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8xXzAueHNkKQ0KKyAgcGVyc2lzdGVuY2UteHNkLnJzcmMgLSBpbmNsdWRlZCBpbiB0aGUgb3BlbmpwYSBqYXIsIHRha2VuIGZyb206DQorICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QpDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjANCisNCisxLiBEZWZpbml0aW9ucy4NCisNCisxLjEuIENvbnRyaWJ1dG9yIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLg0KKw0KKzEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLg0KKw0KKzEuMy4gQ292ZXJlZCBTb2Z0d2FyZSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuDQorDQorMS40LiBFeGVjdXRhYmxlIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuDQorDQorMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLg0KKw0KKzEuNi4gTGFyZ2VyIFdvcmsgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQorDQorMS43LiBMaWNlbnNlIG1lYW5zIHRoaXMgZG9jdW1lbnQuDQorDQorMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLg0KKw0KKzEuOS4gTW9kaWZpY2F0aW9ucyBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoNCisNCitBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7DQorDQorQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3INCisNCitDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCisNCisxLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuDQorDQorMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4NCisNCisxLjEyLiBTb3VyY2UgQ29kZSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4NCisNCisxLjEzLiBZb3UgKG9yIFlvdXIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgWW91IGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBjb250cm9sIG1lYW5zIChhKeF0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIp4W93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KKw0KKzIuIExpY2Vuc2UgR3JhbnRzLg0KKw0KKzIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50Lg0KK0NvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6DQorKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kDQorKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4NCisoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQorKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLg0KKw0KKzIuMi4gQ29udHJpYnV0b3IgR3JhbnQuDQorQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6DQorKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kDQorKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSnhTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4NCisoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuDQorKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKeFmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKeF0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSnhdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMynhdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4NCisNCiszLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuDQorDQorMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuDQorDQorQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4NCisNCiszLjIuIE1vZGlmaWNhdGlvbnMuDQorDQorVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4NCisNCiszLjMuIFJlcXVpcmVkIE5vdGljZXMuDQorWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucyB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4NCisNCiszLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuDQorWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLg0KKw0KKzMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuDQorWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4NCisNCiszLjYuIExhcmdlciBXb3Jrcy4NCitZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4NCisNCis0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4NCisNCis0LjEuIE5ldyBWZXJzaW9ucy4NCitTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4NCisNCis0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuDQorDQorWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZyBkaXN0cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4NCis0LjMuIE1vZGlmaWVkIFZlcnNpb25zLg0KKw0KK1doZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKeFyZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp4W90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLg0KKw0KKzUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuDQorDQorQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gQVMgSVMgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuDQorDQorNi4gVEVSTUlOQVRJT04uDQorDQorNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLg0KKw0KKzYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzIFBhcnRpY2lwYW50KSBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvciBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9uc+EyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4NCisNCis2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9uc+E2LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLg0KKw0KKzcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLg0KKw0KK1VOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLg0KKw0KKzguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuDQorDQorVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSBjb21tZXJjaWFsIGl0ZW0sIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluIDQ44UMuRi5SLuEyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4g4TI1Mi4yMjctNzAxNChhKSgxKSkgYW5kIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ44UMuRi5SLuExMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4NCisNCis5LiBNSVNDRUxMQU5FT1VTLg0KKw0KK1RoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9ucyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZSBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQgY29udHJvbCBsYXdzIGFuZCByZWd1bGF0aW9uIG9mIGFueSBvdGhlciBjb3VudHJpZXMpIHdoZW4gWW91IHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuDQorDQorMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuDQorDQorQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5Lg0KKw0KK05PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpDQorVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIA0KKw0KKw0KKz09PT09PT09PT09PT09PT09PT0NCisgIHNlcnAtMS4xMS4wLmphcg0KKz09PT09PT09PT09PT09PT09PT0NCisNCitDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiwgQS4gQWJyYW0gV2hpdGUNCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCANCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCisNCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyANCisgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCANCisgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gDQorICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisqIE5laXRoZXIgdGhlIG5hbWUgb2YgJ3NlcnAnIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkNCisgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgDQorICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorDQorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORA0KK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIA0KK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgDQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUg0KK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyANCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IA0KK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiANCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCANCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyANCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisNCisNCisNCisNCisNCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9OT1RJQ0UudHh0IGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvTk9USUNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZkMjFmCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvTk9USUNFLnR4dApAQCAtMCwwICsxLDE5IEBACisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY3Rpb24gNCBkIG9mICAgICAgICAgICAgICAgICAgICA9PQ0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0NCisgICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE9wZW5KUEEgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgID09DQorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCisgICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KKw0KK0NPUFlSSUdIVCBOT1RJQ0VTDQorDQorKiBPcGVuSlBBIGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgU0VSUCBwcm9qZWN0DQorICAgIENvcHlyaWdodCAoYykgMjAwMi0yMDA2LCBBLiBBYnJhbSBXaGl0ZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisNCisqIE9wZW5KUEEgaXMgYnVuZGxlZCB3aXRoIHRoZSBiaW5hcmllcyBmcm9tIHRoZSBKUEEgc3BlY2lmaWNhdGlvbiwgYnkNCisgICAgU3VuIE1pY3Jvc3lzdGVtcyBhbmQgbGljZW5zZWQgdW5kZXIgdGhlIENEREwgMS4wLiBUaGUgc291cmNlIGNvZGUgaXMNCisgICAgYXZhaWxhYmxlIGF0OiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvc291cmNlL2Jyb3dzZS9nbGFzc2Zpc2gvDQorDQorDQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvUkVBRE1FLnR4dCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjNjYwZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L1JFQURNRS50eHQKQEAgLTAsMCArMSw2IEBACisNCitUaGFuayB5b3UgZm9yIGRvd25sb2FkaW5nIHRoaXMgaW5jdWJhdG9yIHJlbGVhc2Ugb2YgT3BlbkpQQS4gRm9yDQorZG9jdW1lbnRhdGlvbiBhbmQgcHJvamVjdCBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZToNCisNCisgIGh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9vcGVuanBhLw0KKw0KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L1JFTEVBU0UtTk9URVMuaHRtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L1JFTEVBU0UtTk9URVMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVlYzAzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvUkVMRUFTRS1OT1RFUy5odG1sCkBAIC0wLDAgKzEsMTk5IEBACis8aHRtbD4KKzx0aXRsZT5SZWxlYXNlIE5vdGVzIGZvciBPcGVuSlBBIC0gMC45Ljc8L3RpdGxlPgorPGJvZHk+Cis8aDE+UmVsZWFzZSBOb3RlcyBmb3IgT3BlbkpQQSAtIDAuOS43PC9oMT4KKworPHVsPgorPGxpPjxhIGhyZWY9IiNPdmVydmlldyI+T3ZlcnZpZXc8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjTGljZW5zZSI+TGljZW5zZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNQcmVyZXF1aXNpdGVzIj5QcmVyZXF1aXNpdGVzPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0RvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb248L2E+PC9saT4KKzxsaT48YSBocmVmPSIjR2V0SW52b2x2ZWQiPkdldHRpbmcgSW52b2x2ZWQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjQnVncyI+QnVnczwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNJbXByb3ZlbWVudHMiPkltcHJvdmVtZW50czwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNOZXcgRmVhdHVyZXMiPk5ldyBGZWF0dXJlczwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNUYXNrIj5UYXNrPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI1Rlc3QiPlRlc3Q8L2E+PC9saT4KKzwvdWw+CisKKzxoMj48YSBuYW1lPSJPdmVydmlldyI+PC9hPk92ZXJ2aWV3PC9oMj4KKworPHA+IFRoZXNlIG5vdGVzIGRlc2NyaWJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gT3BlbkpQQSByZWxlYXNlIDAuOS43IGFuZCB0aGUgCitwcmVjZWRpbmcgcmVsZWFzZSwgMC45LjYuIDAuOS43IGlzIGEgZmVhdHVyZSByZWxlYXNlIGFuZCBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZQord2l0aCByZWxlYXNlIDAuOS42LiAKKzxQPgorT3BlbkpQQSBhaW1zIHRvIGJlIGEgZmVhdHVyZS1yaWNoIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwZXJzaXN0ZW5jZSBwYXJ0IG9mIAorSmF2YSBDb21tdW5pdHkgUHJvY2VzcyAKKyBKU1ItMjIwIChFbnRlcnByaXNlIEphdmFCZWFucyAzLjApLCB3aGljaCBpcyBrbm93biBhcyB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgCisoSlBBKS4gT3BlbkpQQSBjYW4gYmUgdXNlZCBhcyBhIHN0YW5kLWFsb25lIFBPSk8gcGVyc2lzdGVuY2UgbGF5ZXIsIG9yIGl0IGNhbiBiZQorIGludGVncmF0ZWQgaW50byBhbnkgRUpCMy4wIGNvbXBsaWFudCBjb250YWluZXIgYW5kIG1hbnkgbGlnaHR3ZWlnaHQgZnJhbWV3b3Jrcy4KKzwvcD4KKworPHA+CitBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSBPcGVuSlBBIHByb2plY3QgbWF5IGJlIGZvdW5kIGF0IHRoZSBwcm9qZWN0IHdlYiAKK3NpdGU6IDxhIGhyZWY9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9vcGVuanBhLyI+CitodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvb3BlbmpwYS88L2E+CisKKzxoMj48YSBuYW1lPSJMaWNlbnNlIj48L2E+TGljZW5zZTwvaDI+Cis8UD5MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKzxCUj48UD48YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPgoraHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPgorCis8QlI+PFA+VW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworPEJSPjxQPlRoZSBsaWNlbnNlIG1heSBhbHNvIGJlIGZvdW5kIGluIExJQ0VOU0UudHh0IHdoaWNoIGlzIGluY2x1ZGVkIAoraW4gZWFjaCByZWxlYXNlIG9mIE9wZW5KUEEuIAorCis8aDI+PGEgbmFtZT0iUHJlcmVxdWlzaXRlcyI+PC9hPlByZXJlcXVpc2l0ZXM8L2gyPgorPFA+CitPcGVuSlBBIHJlcXVpcmVzIEphdmEgMS41IGJ1dCB3aWxsIG5vdCBjb21waWxlIHdpdGggSmF2YSA2LiBGb3IgbW9yZQorZGV0YWlsIHBsZWFzZSBzZWUgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNSI+CitodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS01PC9hPgorCis8aDI+PGEgbmFtZT0iRG9jdW1lbnRhdGlvbiI+PC9hPkRvY3VtZW50YXRpb248L2gyPgorPHA+SWYgeW91IGhhdmUgcXVlc3Rpb25zIGFib3V0IE9wZW5KUEEsIGEgZ29vZCBzb3VyY2Ugb2YgaW5mb3JtYXRpb24gaXMgdGhlIAorb25saW5lIHByb2R1Y3QgbWFudWFsLiBZb3UgY2FuIGZpbmQgdGhlIG1hbnVhbCBmb3IgdGhlIGN1cnJlbnQgcmVsZWFzZSBhcyB3ZWxsCithcyBvbGRlciByZWxlYXNlcyBvZiBPcGVuSlBBIGF0IAorPGEgaHJlZj0iaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL29wZW5qcGEvZG9jdW1lbnRhdGlvbi5odG1sIj4KK2h0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9vcGVuanBhL2RvY3VtZW50YXRpb24uaHRtbDwvYT4KKzxwPklmIHlvdSBjYW4ndCBmaW5kIHdoYXQgeW91J3JlIGxvb2tpbmcgZm9yIGluIHRoZSBtYW51YWwgb3Igd291bGQgbGlrZSBtb3JlCitjbGFyaWZpY2F0aW9uIHlvdSBwbGVhc2UgcG9zdCB0byB0aGUgT3BlbkpQQSBkZXZlbG9wbWVudCBtYWlsaW5nIGxpc3QuCitJbmZvcm1hdGlvbiBvbiBhbGwgb2YgdGhlIE9wZW5KUEEgbWFpbGluZyBsaXN0cyBtYXkgYmUgZm91bmQgaGVyZToKKzxhIGhyZWY9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9vcGVuanBhL21haWxpbmctbGlzdHMuaHRtbCI+CitodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvb3BlbmpwYS9tYWlsaW5nLWxpc3RzLmh0bWw8L2E+CisKKzxwPgorPGgyPjxhIG5hbWU9IkdldEludm9sdmVkIj48L2E+R2V0dGluZyBJbnZvbHZlZDwvaDI+Cis8cD4KK1RoZSBBcGFjaGUgT3BlbkpQQSBwcm9qZWN0IGlzIGJlaW5nIGJ1aWx0IGJ5IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgZm9yIHRoZSAKK29wZW4gc291cmNlIGNvbW11bml0eSAtIHdlIHdlbGNvbWUgeW91ciBpbnB1dCBhbmQgY29udHJpYnV0aW9ucyEKKzxQPgorV2hhdCB3ZSBhcmUgbG9va2luZyBmb3IKKzx1bD4KKyAgICA8bGk+IFNvdXJjZSBjb2RlIGFuZCBmaXhlcyBjb250cmlidXRpb25zIDwvbGk+CisgICAgPGxpPiBEb2N1bWVudGF0aW9uIGFzc2lzdGFuY2UgPC9saT4KKyAgICA8bGk+IFByb2R1Y3QgYW5kIGZlYXR1cmUgc3VnZ2VzdGlvbnMgPC9saT4KKyAgICA8bGk+IERldGFpbGVkIGFuZCBjb25zdHJ1Y3RpdmUgZmVlZGJhY2sgPC9saT4KKyAgICA8bGk+IEFydGljbGVzIGFuZCB3aGl0ZXBhcGVycyA8L2xpPgorPC91bD4KKzxwPgorSG93IGRvIEkgQ29udHJpYnV0ZT8KKzx1bD4KKyAgICA8bGk+IFRvIGRpc2N1c3MgQXBhY2hlIE9wZW5KUEEgdG9waWNzIGNoZWNrIG91dCB0aGUgbWFpbGluZyBsaXN0cy4gPC9saT4KKyAgICA8bGk+IEluZm9ybWFsIGRpc2N1c3Npb24gYWxzbyBvY2N1cnMgb24gdGhlICNvcGVuanBhIElSQyBjaGFubmVsIG9uIAorICAgICAgICAgZnJlZW5vZGUubmV0LiA8L2xpPgorICAgIDxsaT4gQnVncyBhbmQgb3RoZXIgaXNzdWVzIGNhbiBiZSBwb3N0ZWQgb24gdGhlIHByb2plY3QgSklSQS4gPC9saT4KKzwvdWw+CisKKyAgICAKKzxoMj48YSBuYW1lPSJCdWdzIjwvYT5CdWdzPC9oMj4KK1RoZSBmb2xsb3dpbmcgYnVncyBoYXZlIGJlZW4gZml4ZWQgc2luY2UgcmVsZWFzZSAwLjkuNgorPHVsPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTYnPk9QRU5KUEEtMTY8L2E+XSAtIE5QRSBpbiBjcmVhdGVRdWVyeSBmb3IgRUpCIFFMIHdpdGggbmVzdGVkIGNvcnJlbGF0ZWQgc3VicXVlcmllczwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0yMSc+T1BFTkpQQS0yMTwvYT5dIC0gVGltZSBpcyBtaXNzaW5nIGZyb20gbGlzdCBvZiBtdXRhYmxlIGNsYXNzZXMuPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTIyJz5PUEVOSlBBLTIyPC9hPl0gLSBsb2NhdGUgJiBzdWJzdHJpbmcgcXVlcmllcyBmYWlsIGJvdGggZGIyICYgZGVyYnksIGNhbm5vdCB1c2UgcGFyYW1ldGVyIG1hcmtlcnMgaW4gZXhwcmVzc2lvbiA/LT88L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMjMnPk9QRU5KUEEtMjM8L2E+XSAtIC00MTggc3FsZXhjZXB0aW9uIHVzaW5nIERCMiBhbmQgRUpCIFFMIHdpdGggU1FSVCBvciBNT0Q8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMjQnPk9QRU5KUEEtMjQ8L2E+XSAtIEFsbG93IE9wZW5KUEEgdG8gYmUgZXh0ZW5zaWJsZTwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0yNSc+T1BFTkpQQS0yNTwvYT5dIC0gSW5jb3JyZWN0IFNRTCBnZW5lcmF0ZWQgZm9yIHF1ZXJpZXMgaW52b2x2aW5nIG1vcmUgdGhhbiBvbmUgQWJzdHJhY3RTY2hlbWFOYW1lcywgZ2VuZXJhdGVkIFNRTCBGUk9NIGNsYXVzZSBpcyBtaXNzaW5nICdUYWJsZSBhbGlhcyc8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMzUnPk9QRU5KUEEtMzU8L2E+XSAtIEluLW1lbW9yeSBEZWxldGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYWN0aXZlIERhdGFDYWNoZTwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS00MSc+T1BFTkpQQS00MTwvYT5dIC0gdHJhbnNmb3JtaW5nIGNsYXNzZXMgZG9lc24ndCB3b3JrPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTQ4Jz5PUEVOSlBBLTQ4PC9hPl0gLSAgcGFyc2luZyBlcnJvciAtIGNhc3Qgb2Ygc3Vic2VsZWN0IGRvZXMgbm90IHdvcms8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNTAnPk9QRU5KUEEtNTA8L2E+XSAtIGJhZCBzcWwgcHVzaGRvd24sIGNhc3QgY2hhbmdlcyBkYXRhdHlwZTwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS01Myc+T1BFTkpQQS01MzwvYT5dIC0gIGJhZCBzcWwgcHVzaGRvd24gZm9yIG5lc3RlZCBzdWJzZWxlY3RzLCBtaXNzaW5nIG5lc3RlZCBzdWJzZWxlY3Q8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNTQnPk9QRU5KUEEtNTQ8L2E+XSAtIGJhZCBzcWwgcHVzaGRvd24sIHNob3VsZCB1c2UgYWxsIHN5bnRheDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS01Nic+T1BFTkpQQS01NjwvYT5dIC0gaW4gZGVyYnkgY29uY2F0IHdpdGggaW5wdXQgcGFyYW1ldGVyIG5lZWRzIGEgY2FzdCwgb3RoZXJ3aXNlIGJlY29tZXMgbG9uZyB2YXJjaGFyIGFuZCBzb21lIG9wZXJhdGlvbnMgZG8gbm90IHdvcms8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNjAnPk9QRU5KUEEtNjA8L2E+XSAtIFNwZWNpZnlpbmcgdGhlIHdyb25nIHBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uIGluIHBlcnNpc3RlbmNlLnhtbCBsZWFkcyB0byBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2U8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNjInPk9QRU5KUEEtNjI8L2E+XSAtIEVqYnFsIGpvaW4gcXVlcmllcyBzaG93IGludmFsaWQgbnVsbCBFbnRpdGllcyB3aGVuIHJ1biBpbiBhIG5ldyBwZXJzaXN0ZW5jZSBjb250ZXh0IHdoZXJlIG5vIGVudGl0eSBpbnN0YW5jZXMgZXhpc3QuPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTcxJz5PUEVOSlBBLTcxPC9hPl0gLSBDYWNoaW5nIHByaW1pdGl2ZSBhcnJheSB0eXBlcyBjb25zdW1lcyBleGNlc3NpdmUgbWVtb3J5PC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTc3Jz5PUEVOSlBBLTc3PC9hPl0gLSBQcm9ibGVtcyBpbiBkZWZhdWx0IHNldHRpbmcgaW4gREIyRGljdGlvbmFyeSAsIGFsc28gbWlzc2luZyBzdXBwb3J0IGZvciBEQjIgei9PUyBwbGF0Zm9ybXM8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtODAnPk9QRU5KUEEtODA8L2E+XSAtIEJhZCBFc2NhcGluZyBmb3IgTElLRSBpbiBNeVNRTDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS05OCc+T1BFTkpQQS05ODwvYT5dIC0gSmF2YSBkZWFkbG9jayB3aGVuIGluc2VydCBpbiB0MSBhbmQgZmluZCBpbiB0MiB3aGVuIHVzaW5nIElCTSBKVk0gMS41LjA8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTAwJz5PUEVOSlBBLTEwMDwvYT5dIC0gPGphci1maWxlPiBlbnRyaWVzIGZhaWxpbmcgdG8gYmUgcHJvY2Vzc2VkIGZvciBwZXJzaXN0ZW5jZSB1bml0IHJvb3RlZCBpbiBhbiBFQVI8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTAyJz5PUEVOSlBBLTEwMjwvYT5dIC0gSlRBIHRyYW5zYWN0aW9uIHJvbGxiYWNrLCBub25leGlzdGFudCBpbnN0YW5jZXMsIHRyYW5zYWN0aW9uYWwgcGVyc2lzdGVuY2UgY29udGV4dCA9PiBmYWlsdXJlcyBkdXJpbmcgYWZ0ZXJDb21wbGV0aW9uKCkgYW5kIGNsb3NlKCk8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTAzJz5PUEVOSlBBLTEwMzwvYT5dIC0gRGVmYXVsdCBMaXN0ZW5lcnMgbm90IGJlaW5nIHByb2Nlc3NlZCBjb3JyZWN0bHk8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTA0Jz5PUEVOSlBBLTEwNDwvYT5dIC0gT3BlbkpQQSBkb2VzIG5vdCBkZXRhY2ggaW5zdGFuY2VzIG9uIHJvbGxiYWNrKCk8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTA3Jz5PUEVOSlBBLTEwNzwvYT5dIC0gQFNxbFJlc3VsdFNldE1hcHBpbmdzIGZhaWxzIGluIG1hcHBpbmcgdG9vbCB3aXRoIGphdmEubGFuZy5BcnJheVN0b3JlRXhjZXB0aW9uPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTEwOCc+T1BFTkpQQS0xMDg8L2E+XSAtIEBBdHRyaWJ1dGVPdmVycmlkZXMgZmFpbHMgaW4gbWFwcGluZyB0b29sIHdpdGggamF2YS5sYW5nLkFycmF5U3RvcmVFeGNlcHRpb248L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTA5Jz5PUEVOSlBBLTEwOTwvYT5dIC0gZXZlcnkgTmF0aXZlUXVlcnkgdXNpbmcgU3FsUmVzdWx0U2V0TWFwcGluZyBmYWlscyBhdCBydW50aW1lIHdpdGggVGhlcmUgaXMgbm8gcXVlcnkgcmVzdWx0IG1hcHBpbmcgZm9yICJudWxsIiB3aXRoIG5hbWUgInh4eCIgd2hlbiB0aGUgZW50aXR5IGlzIHBlcnNpc3RlZCBpbiBhIGRpZmZlcmVudCBtZXRob2QgdGhhbiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBxdWVyeS4gIDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xMTAnPk9QRU5KUEEtMTEwPC9hPl0gLSBFdmVyeSBOYW1lZE5hdGl2ZVF1ZXJ5IHVzaW5nIFJlc3VsdFNldE1hcHBpbmcgZmFpbHMgYXQgcnVudGltZSB3aXRoIGNsYXNzIGNhc3QgZXhjZXB0aW9uIHdoZW4gdHJ5IHRvIGl0ZXJhdGUgb3ZlciBsaXN0PFNvbWUgRW50aXR5PjwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xMTEnPk9QRU5KUEEtMTExPC9hPl0gLSBuYXRpdmUgcXVlcmllcyBmYWlsIHdoZW4gdXNlIG5hbWVkIHBhcmFtZXRlcnM8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTE1Jz5PUEVOSlBBLTExNTwvYT5dIC0gQm90dGxlbmVjayhzKSB3aXRoIHVzaW5nIE9wZW5KUEEgaW4gYSBDb250YWluZXItbWFuYWdlZCBlbnZpcm9ubWVudDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xMTYnPk9QRU5KUEEtMTE2PC9hPl0gLSBFbnRpdHlNYW5hZ2VyLmdldERlbGVnYXRlIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTExOCc+T1BFTkpQQS0xMTg8L2E+XSAtIEF1dG9EZXRhY2ggcHJvcGVydHkgaGFzIG5vIGVmZmVjdDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xMTknPk9QRU5KUEEtMTE5PC9hPl0gLSBFbnRpdHlNYW5hZ2VyLmNsZWFyKCkgc2hvdWxkIG5vdCBpbXBsaWNpdGx5IGludm9rZSB0aGUgZmx1c2ggb3BlcmF0aW9uPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTEyMSc+T1BFTkpQQS0xMjE8L2E+XSAtIFRhYmxlIG5hbWUgZGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgaW5zdGVhZCBvZiB0aGUgZW50aXR5IG5hbWU8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTIyJz5PUEVOSlBBLTEyMjwvYT5dIC0gRW50aXR5TWFuYWdlciBkb2VzIG5vdCB0aHJvdyBleGNlcHRpb25zIGFmdGVyIGNsb3NlKCkgaW4gcmVxdWlyZWQgY2FzZXM8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTMyJz5PUEVOSlBBLTEzMjwvYT5dIC0gamF2YS5sYW5nLk5vU3VjaE1ldGhvZEVycm9yIGZvciBlbnRpdHkgd2l0aCBJRCBvZiB0eXBlIGphdmEuc3FsLkRhdGU8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTMzJz5PUEVOSlBBLTEzMzwvYT5dIC0gQ2FuJ3QgZmluZCBub24tcHVibGljIGNhbGxiYWNrIG1ldGhvZHMgd2l0aCBzdXBlcmNsYXNzIG9yIGludGVyZmFjZSBwYXJhbWV0ZXJzPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTEzNCc+T1BFTkpQQS0xMzQ8L2E+XSAtIEV4dHJhIHVubmVlZGVkIFNRTCBqb2lucyBmb3IgT25lVG9NYW55IHJlbGF0aW9uc2hpcCB3aXRoIGZldGNoIHR5cGUgRUFHRVI8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTM5Jz5PUEVOSlBBLTEzOTwvYT5dIC0gUGVyc2lzdGVuY2VFeGNlcHRpb24gbWVyZ2luZyBhbiBlbnRpdHkgd2l0aCBhIENhbGVuZGFyIGZpZWxkLiA8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTQwJz5PUEVOSlBBLTE0MDwvYT5dIC0gV3JvbmcgcGFja2FnZSBuYW1lIGluIHRlc3QgY2xhc3NlczwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xNDInPk9QRU5KUEEtMTQyPC9hPl0gLSBFbnRpdHkgbmFtZSBpcyBpZ25vcmVkIHdoZW4gc3BlY2lmaWVkIGluIHRoZSBvcm0ueG1sIGZpbGU8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTQ0Jz5PUEVOSlBBLTE0NDwvYT5dIC0gSkRCQ0NvbmZpZ3VyYXRpb25JbXBsIGRvZXMgbm90IHN1cHBvcnQgSk5ESSBsb29rdXAgZm9yIG5vbi1qdGEtZGF0YS1zb3VyY2UuICA8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTQ2Jz5PUEVOSlBBLTE0NjwvYT5dIC0gRW50aXR5IGVuaGFuY2VtZW50IGZhaWxzIHdoaWxlIHVzaW5nIEVtYmVkZGVkSWQgb24gYSBNYXBwZWRTdXBlcmNsYXNzPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTE1MCc+T1BFTkpQQS0xNTA8L2E+XSAtIEBDb2x1bW4gaW4gQEF0dHJpYnV0ZU92ZXJyaWRlIG5vdCBob25vcmluZyB0YWJsZSBhdHRyaWJ1dGUgdGhhdCBtYXBzIHRvIGEgc2Vjb25kYXJ5IHRhYmxlIGluIG1hcHBlZHN1cGVyY2xhc3MgZW50aXR5PC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTE1NCc+T1BFTkpQQS0xNTQ8L2E+XSAtIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uIHdvcmtpbmcgd2l0aCAgU2F2ZXBvaW50czwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xNTUnPk9QRU5KUEEtMTU1PC9hPl0gLSAgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBkdXJpbmcgY29tbWl0PC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTE1Nyc+T1BFTkpQQS0xNTc8L2E+XSAtIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcnVubmluZyBxdWVyeSB3aXRoIG51bGwgcGFyYW1ldGVyPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTE2Mic+T1BFTkpQQS0xNjI8L2E+XSAtIEBPcmRlckJ5IG9uIEBPbmVUb01hbnkgZG9lcyBub3QgYWxsb3cgb3JkZXJpbmcgYnkgQElkIHZhbHVlPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTE3NCc+T1BFTkpQQS0xNzQ8L2E+XSAtIGVycm9yIHdoZW4gZmluZCgpJ2luZyBhbiBhYnN0cmFjdCBjbGFzczwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xNzUnPk9QRU5KUEEtMTc1PC9hPl0gLSBFYWdlciBzZWxlY3RzIGJ5IFBhZ2luZ1Jlc3VsdE9iamVjdFByb3ZpZGVyIG1heSBub3QgdXNlIHRoZSBGZXRjaEJhdGNoU2l6ZTwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xNzknPk9QRU5KUEEtMTc5PC9hPl0gLSBTY2hlbWFzIGRlZmluZWQgaW4gb3JtLnhtbCBhcmUgb25seSBhcHBsaWVkIHdoZW4gYSBuYW1lIGlzIGFsc28gc3BlY2lmaWVkLiA8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTgxJz5PUEVOSlBBLTE4MTwvYT5dIC0gQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gZXhlY3V0aW5nIGJ1bGsgZGVsZXRlIG9uIGFuIGVudGl0eSB0aGF0IG93bnMgYSBPbmVUb09uZSB3aXRoIGEgQ2FzY2FkZS5ERUxFVEUgd2hlbiBEYXRhQ2FjaGUgaXMgb248L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTg1Jz5PUEVOSlBBLTE4NTwvYT5dIC0gb3B0aW9uYWwgYXR0cmlidXRlIGlzIG5vdCBvdmVycmlkZW4gYnkgeG1sIGRlc2NyaXB0b3I8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTg2Jz5PUEVOSlBBLTE4NjwvYT5dIC0gQnVpbGQgZmFpbHVyZSBvZiBPcGVuSlBBIHNvdXJjZXMgZnJvbSB0cnVuazwvbGk+Cis8L3VsPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMjAyJz5PUEVOSlBBLTIwMjwvYT5dIC0gYWZ0ZXIgaW52b2tpbmcgTFJTIHByb2Nlc3NpbmcgaW4gYSBjbGllbnQgYnkgY2FsbGluZyBhbiBATFJTIGFubm90YXRlZCByZWxhdGlvbnNoaXAsIHRoZSBuZXh0IGVtLmNsZWFyKCkvZW0uY2xvc2UoKSBnZXRzIG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5JbnZhbGlkU3RhdGVFeGNlcHRpb246IFlvdSBjYW5ub3QgdHJhbnNmZXIgbGFyZ2UgcmVzdWx0IHNldCBmaWVsZHMgZnJvbSBvbmUgb2JqZWN0IG9yIGZpZWxkIHRvIGFub3RoZXI8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMjA4Jz5PUEVOSlBBLTIwODwvYT5dIC0gTm9SZXN1bHRFeGNlcHRpb24gYW5kIE5vblVuaXF1ZVJlc3VsdEV4Y2VwdGlvbiBhcmUgbm90IHRocm93biB3aGVuIGV4cGVjdGVkPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTIxNCc+T1BFTkpQQS0yMTQ8L2E+XSAtIE5lZWQgdG8gc3VwcG9ydCBmbG9hdGluZyBwb2ludCBwcmltYXJ5IGtleXM8L2xpPgorPC91bD4KKyAgICAKKzxoMj48YSBuYW1lPSJJbXByb3ZlbWVudHMiPC9hPkltcHJvdmVtZW50czwvaDI+CitJbXByb3ZlbWVudHMgbWFkZSBzaW5jZSByZWxlYXNlIDAuOS42Cis8dWw+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xMCc+T1BFTkpQQS0xMDwvYT5dIC0gcGVyc2lzdGVuY2UgdW5pdCBuYW1lIHNob3VsZCBiZSBkZWZhdWx0IGRpYWdub3N0aWMgY29udGV4dCBmb3Igc3RhbmRhcmQgT3BlbkpQQSBsb2cgaW1wbDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0zNyc+T1BFTkpQQS0zNzwvYT5dIC0gU3VwcG9ydCBhbnQgdHlwZWRlZnMgZm9yIE9wZW5KUEEgdGFza3M8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtNTUnPk9QRU5KUEEtNTU8L2E+XSAtIEFsbG93IGV4ZWN1dGVVcGRhdGUoKSBpbnZvY2F0aW9ucyBvbiBuYXRpdmUgcXVlcmllczwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS01Nyc+T1BFTkpQQS01NzwvYT5dIC0gcGVyc2lzdGVuY2VfMV8wLnhzZCBpcyBtaXNzaW5nPC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTYzJz5PUEVOSlBBLTYzPC9hPl0gLSBCZXR0ZXIgcGVzc2ltaXN0aWMgbG9jayBzdXBwb3J0IGZvciBEQjIgdjguMis8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTUxJz5PUEVOSlBBLTE1MTwvYT5dIC0gQWRkZWQgZmllbGQgaW4gZW5oYW5jZWQgdmVzcmlvbiBvZiBhIGNsYXNzIGlzIG5vdCBzZXJpYWxpemVkLiBIZW5jZSB0aGUgY2hhbmdlIGluIGRldGFjaGVkK3NlcmlhbGl6ZWQgaW5zdGFuY2VzIGlzIG5vdCByZWdpc3RlcmVkIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gIDwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xNTMnPk9QRU5KUEEtMTUzPC9hPl0gLSBXZWJTcGhlcmUgYW5kIG5vbi1qdGEtZGF0YS1zb3VyY2UgYW5kIGRlZmF1bHQgTWFuYWdlZFJ1bnRpbWU8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTU4Jz5PUEVOSlBBLTE1ODwvYT5dIC0gT3BlbkpQQSBsb2dzIG92ZXJseS12ZXJib3NlIGF0IElORk8gbGV2ZWw8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTYxJz5PUEVOSlBBLTE2MTwvYT5dIC0gT3ZlcnVzZSBvZiBzeW5jaHJvbml6YXRpb24gaW4gQWJzdHJhY3RCcm9rZXJGYWN0b3J5PC9saT4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTE2Nic+T1BFTkpQQS0xNjY8L2E+XSAtIFRyYWNrIHRoZSByZWFzb24gd2h5IGEgc2V0Um9sbGJhY2tPbmx5IGludm9jYXRpb24gd2FzIG1hZGU8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTc2Jz5PUEVOSlBBLTE3NjwvYT5dIC0gRXhjZXB0aW9uIHByZWZpeGVzIHNob3VsZCBiZSBodW1hbi1yZWFkYWJsZTwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0xOTYnPk9QRU5KUEEtMTk2PC9hPl0gLSBFYXNlIHRoZSByZXN0cmljdGlvbnMgb24gZm9yY2luZyBhIG1hdGNoZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZGVjbGFyZWQgYW5kIGFzc2lnbmVkIHBvc2l0aW9uYWwgcGFyYW1ldGVyczwvbGk+Cis8L3VsPgorICAgIAorPGgyPjxhIG5hbWU9Ik5ldyBGZWF0dXJlcyI8L2E+TmV3IEZlYXR1cmVzPC9oMj4KK0ZlYXR1cmVzIGFkZGVkIHNpbmNlIHJlbGVhc2UgMC45LjYKKzx1bD4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTkyJz5PUEVOSlBBLTkyPC9hPl0gLSBTdXBwb3J0IGZvciBIMiBEYXRhYmFzZSBFbmdpbmU8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtOTMnPk9QRU5KUEEtOTM8L2E+XSAtIFNlcXVlbmNlIGdlbmVyYXRpb24gaW4gYSBKVEEgZW52aXJvbm1lbnQgc2hvdWxkIG5vdCByZXF1aXJlIG5vbi1KVEEgZGF0YXNvdXJjZTwvbGk+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS05NCc+T1BFTkpQQS05NDwvYT5dIC0gQWxsb3cgTWFwcGluZ1Rvb2wgYW5kIHBlcnNpc3RlbmNlLnhtbCB0byBzdXBwb3J0IGRyb3AtY3JlYXRlIGZvciBkYXRhYmFzZSBzY2hlbWE8L2xpPgorPGxpPls8YSBocmVmPSdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEtMTgyJz5PUEVOSlBBLTE4MjwvYT5dIC0gZGIyIHVwZGF0ZSBsb2NrIHN5bnRheCBXSVRIIDxpc29sYXRpb24+IFVTRSBBTkQgS0VFUCBVUERBVEUgTE9DS1M8L2xpPgorPC91bD4KKworPGgyPjxhIG5hbWU9IlRhc2siPC9hPlRhc2s8L2gyPgorVGFza3MgZG9uZSBzaW5jZSByZWxlYXNlIDAuOS42Cis8dWw+Cis8bGk+WzxhIGhyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvT1BFTkpQQS0zNic+T1BFTkpQQS0zNjwvYT5dIC0gQWRkIGN3aWtpIHVybCB0byBpbmN1YmF0b3Igc3RhdHVzIHBhZ2U8L2xpPgorPC91bD4KKyAgICAKKzxoMj48YSBuYW1lPSJUZXN0IjwvYT5UZXN0PC9oMj4KK0FkZGl0aW9uYWwgdGVzdGluZyBkb25lIHNpbmNlIHJlbGVhc2UgMC45LjYKKzx1bD4KKzxsaT5bPGEgaHJlZj0naHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBLTQwJz5PUEVOSlBBLTQwPC9hPl0gLSBUZXN0aW5nIE9wZW5KUEEgYW5kIFNwcmluZyBpbnRlZ3JhdGlvbiBmYWlsczwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvYXNzZW1ibHkueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZThhMzMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9hc3NlbWJseS54bWwKQEAgLTAsMCArMSwxMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIA0KKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgDQorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorIHVuZGVyIHRoZSBMaWNlbnNlLiAgIA0KKy0tPg0KKzxhc3NlbWJseT4NCisgICAgPGlkPmJpbmFyeTwvaWQ+DQorICAgIDxmb3JtYXRzPg0KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCisgICAgPC9mb3JtYXRzPg0KKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQorICAgIDxmaWxlU2V0cz4NCisgICAgICAgIDxmaWxlU2V0Pg0KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2FnZ3JlZ2F0ZTwvZGlyZWN0b3J5Pg0KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICAgICAgPC9maWxlU2V0Pg0KKyAgICAgICAgPGZpbGVTZXQ+DQorICAgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUFETUU8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkRJU0NMQUlNRVI8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPlNUQVRVUzwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUFETUUudHh0PC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5ESVNDTEFJTUVSLnR4dDwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPlNUQVRVUy50eHQ8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFTEVBU0UtTk9URVM8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFTEVBU0UtTk9URVMuaHRtbDwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+UkVMRUFTRS1OT1RFUy50eHQ8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkNIQU5HRVM8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2ZpbGVTZXQ+DQorICAgICAgICA8IS0tDQorICAgICAgICA8ZmlsZVNldD4NCisgICAgICAgICAgICA8ZGlyZWN0b3J5PmxpY2Vuc2VzPC9kaXJlY3Rvcnk+DQorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2ZpbGVTZXQ+DQorICAgICAgICA8ZmlsZVNldD4NCisgICAgICAgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9leGFtcGxlczwvZGlyZWN0b3J5Pg0KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2V4YW1wbGVzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgICA8L2ZpbGVTZXQ+DQorICAgICAgICAtLT4NCisgICAgICAgIDxmaWxlU2V0Pg0KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L21hbnVhbDwvZGlyZWN0b3J5Pg0KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jcy9tYW51YWw8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgIDwvZmlsZVNldD4NCisgICAgICAgIDxmaWxlU2V0Pg0KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL2RvYy9tYW51YWwvaW1nPC9kaXJlY3Rvcnk+DQorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2NzL21hbnVhbC9pbWc8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgIDwvZmlsZVNldD4NCisgICAgICAgIDxmaWxlU2V0Pg0KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL2RvYy9tYW51YWwvY3NzPC9kaXJlY3Rvcnk+DQorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2NzL21hbnVhbC9jc3M8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgIDwvZmlsZVNldD4NCisgICAgICAgIDxmaWxlU2V0Pg0KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vdGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5Pg0KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jcy9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgICA8L2ZpbGVTZXQ+DQorICAgICAgICA8ZmlsZVNldD4NCisgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL29wZW5qcGEtZXhhbXBsZXMvc3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXhhbXBsZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgIDwvZmlsZVNldD4NCisgICAgPC9maWxlU2V0cz4NCisgICAgPGRlcGVuZGVuY3lTZXRzPg0KKyAgICAgICAgPGRlcGVuZGVuY3lTZXQ+DQorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPg0KKyAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCisgICAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUub3BlbmpwYTpvcGVuanBhPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+DQorICAgICAgICA8ZGVwZW5kZW5jeVNldD4NCisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+DQorICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+bmV0LnNvdXJjZWZvcmdlLnNlcnA6c2VycDwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5kZXJieTpkZXJieTwvaW5jbHVkZT4NCisNCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tbW9ucy1sb2dnaW5nOmNvbW1vbnMtbG9nZ2luZzwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tbW9ucy1sYW5nOmNvbW1vbnMtbGFuZzwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tbW9ucy1jb2xsZWN0aW9uczpjb21tb25zLWNvbGxlY3Rpb25zPC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5jb21tb25zLXBvb2w6Y29tbW9ucy1wb29sPC9pbmNsdWRlPg0KKw0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzOmdlcm9uaW1vLWptc18xLjFfc3BlYzwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczpnZXJvbmltby1qdGFfMS4wLjFCX3NwZWM8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tanBhXzMuMF9zcGVjPC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzOmdlcm9uaW1vLWoyZWUtY29ubmVjdG9yXzEuNV9zcGVjPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+DQorICAgIDwvZGVwZW5kZW5jeVNldHM+DQorPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9wb20ueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQxMzkyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3QvcG9tLnhtbApAQCAtMCwwICsxLDM3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgDQorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyANCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjANCisgICAgICAgIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgICA8IS0tDQorICAgICAgICBUbyBidWlsZCB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzIGZyb20gcHJvamVjdCByb290Og0KKw0KKyAgICAgICAgbXZuIGNsZWFuIGNvbXBpbGUgcGFja2FnZSAtRHRlc3Q9ZmFsc2UNCisNCisgICAgICAgIFRvIGJ1aWxkIGFuZCBkZXBsb3kgYSBmdWxsIGRpZ25lZCByZWxlYXNlIHdpdGggZG9jcywgcnVuOg0KKw0KKyAgICAgICAgICAgIG12biBjbGVhbiBkZXBsb3kgLVBqYXZhZG9jLXByb2ZpbGUsZG9jYm9vay1wcm9maWxlLHNpZ24tcmVsZWFzZQ0KKw0KKyAgICAgICAgTm90ZSB0aGF0IHRvIHNpZ24gdGhlIHJlbGVhc2UsIHlvdSBuZWVkIHRvIGhhdmUgImdwZyIgaW5zdGFsbGVkIGFuZA0KKyAgICAgICAgY3JlYXRlIGEga2V5LiBTZWUgaHR0cDovL2FwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZy5odG1sDQorICAgIC0tPg0KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICAgIDxhcnRpZmFjdElkPmFwYWNoZS1vcGVuanBhPC9hcnRpZmFjdElkPg0KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KKyAgICA8bmFtZT5PcGVuSlBBIERpc3RyaWJ1dGlvbjwvbmFtZT4NCisgICAgPHBhcmVudD4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgIDwvcGFyZW50Pg0KKw0KKyAgICA8cHJvcGVydGllcz4NCisgICAgICAgIDxzY20uZGlyPnN2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vcGVuanBhL3RydW5rL29wZW5qcGEtcHJvamVjdDwvc2NtLmRpcj4NCisgICAgICAgIDxvcGVuanBhLnJlbGVhc2Uua2V5QWxpYXM+DQorICAgICAgICAgICAgJHt1c2VyLm5hbWV9QGFwYWNoZS5vcmcNCisgICAgICAgIDwvb3BlbmpwYS5yZWxlYXNlLmtleUFsaWFzPg0KKyAgICAgICAgPG9wZW5qcGEuYXNzZW1ibHkuZmluYWxOYW1lPg0KKyAgICAgICAgICAgICR7YXJ0aWZhY3RJZH0tJHt2ZXJzaW9ufTwvb3BlbmpwYS5hc3NlbWJseS5maW5hbE5hbWU+DQorICAgICAgICA8b3BlbmpwYS5hc3NlbWJseS5vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgJHtwcm9qZWN0LmJhc2VkaXJ9L3RhcmdldC9hc3NlbWJseQ0KKyAgICAgICAgPC9vcGVuanBhLmFzc2VtYmx5Lm91dHB1dERpcmVjdG9yeT4NCisNCisgICAgICAgIDxvcGVuanBhLmFzc2VtYmx5LmJpbmFyeVN1ZmZpeD5iaW5hcnk8L29wZW5qcGEuYXNzZW1ibHkuYmluYXJ5U3VmZml4Pg0KKyAgICAgICAgPG9wZW5qcGEuYXNzZW1ibHkuYmluYXJ5QmFzZT4NCisgICAgICAgICAgICAke29wZW5qcGEuYXNzZW1ibHkub3V0cHV0RGlyZWN0b3J5fS8ke29wZW5qcGEuYXNzZW1ibHkuZmluYWxOYW1lfS0ke29wZW5qcGEuYXNzZW1ibHkuYmluYXJ5U3VmZml4fQ0KKyAgICAgICAgPC9vcGVuanBhLmFzc2VtYmx5LmJpbmFyeUJhc2U+DQorICAgICAgICA8b3BlbmpwYS5hc3NlbWJseS5iaW5hcnlGaWxlPg0KKyAgICAgICAgICAgICR7b3BlbmpwYS5hc3NlbWJseS5iaW5hcnlCYXNlfS56aXANCisgICAgICAgIDwvb3BlbmpwYS5hc3NlbWJseS5iaW5hcnlGaWxlPg0KKw0KKyAgICAgICAgPG9wZW5qcGEuYXNzZW1ibHkuc291cmNlU3VmZml4PnNvdXJjZTwvb3BlbmpwYS5hc3NlbWJseS5zb3VyY2VTdWZmaXg+DQorICAgICAgICA8b3BlbmpwYS5hc3NlbWJseS5zb3VyY2VCYXNlPg0KKyAgICAgICAgICAgICR7b3BlbmpwYS5hc3NlbWJseS5vdXRwdXREaXJlY3Rvcnl9LyR7b3BlbmpwYS5hc3NlbWJseS5maW5hbE5hbWV9LSR7b3BlbmpwYS5hc3NlbWJseS5zb3VyY2VTdWZmaXh9DQorICAgICAgICA8L29wZW5qcGEuYXNzZW1ibHkuc291cmNlQmFzZT4NCisgICAgICAgIDxvcGVuanBhLmFzc2VtYmx5LnNvdXJjZUZpbGU+DQorICAgICAgICAgICAgJHtvcGVuanBhLmFzc2VtYmx5LnNvdXJjZUJhc2V9LnppcA0KKyAgICAgICAgPC9vcGVuanBhLmFzc2VtYmx5LnNvdXJjZUZpbGU+DQorDQorICAgICAgICA8ZG9jYm9vay5zb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9kb2MvbWFudWFsPC9kb2Nib29rLnNvdXJjZT4NCisgICAgICAgIDxkb2Nib29rLnRhcmdldD4ke3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L21hbnVhbDwvZG9jYm9vay50YXJnZXQ+DQorICAgICAgICA8ZG9jYm9vay52ZXJzaW9uPjEuNjcuMjwvZG9jYm9vay52ZXJzaW9uPg0KKyAgICAgICAgPGxvY2FsLnJlcG9zaXRvcnk+JHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9PC9sb2NhbC5yZXBvc2l0b3J5Pg0KKyAgICA8L3Byb3BlcnRpZXM+DQorDQorICAgIDxzY20+DQorICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly8ke3NjbS5kaXJ9PC9jb25uZWN0aW9uPg0KKyAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovLyR7c2NtLmRpcn08L2RldmVsb3BlckNvbm5lY3Rpb24+DQorICAgICAgICA8dXJsPmh0dHBzOi8vJHtzY20uZGlyfTwvdXJsPg0KKyAgICA8L3NjbT4NCisNCisgICAgPGJ1aWxkPg0KKyAgICAgICAgPCEtLSBuZWVkZWQgdG8gbGV0IG1hdmVuIHBhc3MgdGhlICJjb21waWxlIiBwaGFzZSAtLT4NCisgICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi9ub25lLzwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisNCisgICAgICAgIDwhLS0gZmlsdGVyIHNpdGUgcmVzb3VyY2VzIC0tPg0KKyAgICAgICAgPHJlc291cmNlcz4NCisgICAgICAgICAgICA8cmVzb3VyY2U+DQorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9zaXRlPC9kaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgIDwhLS0gdGFyZ2V0UGF0aCBpcyByZWxhdGl2ZSB0byB0YXJnZXQvY2xhc3Nlcy8gLS0+DQorICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL2ZpbHRlcmVkLXNpdGU8L3RhcmdldFBhdGg+DQorICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4NCisgICAgICAgICAgICA8L3Jlc291cmNlPg0KKyAgICAgICAgPC9yZXNvdXJjZXM+DQorDQorICAgICAgICA8cGx1Z2lucz4NCisgICAgICAgICAgICA8cGx1Z2luPg0KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YmluPC9pZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtvcGVuanBhLmFzc2VtYmx5Lm91dHB1dERpcmVjdG9yeX08L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L3dvcms8L3dvcmtEaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zb3VyY2VzPC9pZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zb3VyY2UtYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS90YXJnZXQvYXNzZW1ibHk8L291dHB1dERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L3dvcms8L3dvcmtEaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCisgICAgICAgICAgICA8L3BsdWdpbj4NCisNCisgICAgICAgICAgICA8IS0tDQorICAgICAgICAgICAgICAgIENvcHkgb3ZlciBzaXRlIGZpbGVzIGZyb20gc3JjL3NpdGUgdG8gdGFyZ2V0L2ZpbHRlcmVkLXNpdGUNCisgICAgICAgICAgICAgICAgc28gd2UgY2FuIGZpbHRlciByZXNvdXJjZXMgYW5kIGluY2x1ZGUgb3RoZXIgZ2VuZXJhdGVkDQorICAgICAgICAgICAgICAgIGNvbnRlbnQgZnJvbSB0aGUgb3BlbmpwYS1wcm9qZWN0IG1vZHVsZS4NCisgICAgICAgICAgICAtLT4NCisgICAgICAgICAgICA8cGx1Z2luPg0KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnByZWZpbHRlci1zaXRlPC9pZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+c2l0ZTwvcGhhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5yZXNvdXJjZXM8L2dvYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQorICAgICAgICAgICAgPC9wbHVnaW4+DQorDQorICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtNTwvdmVyc2lvbj4NCisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICA8c2l0ZURpcmVjdG9yeT50YXJnZXQvZmlsdGVyZWQtc2l0ZTwvc2l0ZURpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgIDwvcGx1Z2luPg0KKyAgICAgICAgPC9wbHVnaW5zPg0KKyAgICA8L2J1aWxkPg0KKw0KKyAgICA8cHJvZmlsZXM+DQorICAgICAgICA8IS0tDQorICAgICAgICAgICAgRG9jYm9vayBwcm9maWxlLiBEb2NzIGNhbiBiZSBidWlsdCBieSBydW5uaW5nOg0KKyAgICAgICAgICAgIE1BVkVOX09QVFM9LVhteDUxMm0NCisgICAgICAgICAgICBtdm4gLWYgb3BlbmpwYS1wcm9qZWN0L3BvbS54bWwgcHJvY2Vzcy1yZXNvdXJjZXMgLVBkb2Nib29rLXByb2ZpbGUNCisgICAgICAgIC0tPg0KKyAgICAgICAgPHByb2ZpbGU+DQorICAgICAgICAgICAgPGlkPmRvY2Jvb2stcHJvZmlsZTwvaWQ+DQorICAgICAgICAgICAgPGJ1aWxkPg0KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCisgICAgICAgICAgICAgICAgICAgIDwhLS0gYnVpbGQgdGhlIGRvY3Mgd2hlbiBwcm9jZXNzaW5nIHJlc291cmNlcyAtLT4NCisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmFnaWxlamF2YS5kb2Nia3g8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZG9jYmt4LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZC1wZGYtZG9jPC9pZD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXJlc291cmNlczwvcGhhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+Z2VuZXJhdGUtcGRmPC9nb2FsPjwvZ29hbHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlRGlyZWN0b3J5Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2RvY2Jvb2suc291cmNlfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZG9jYm9vay50YXJnZXR9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPm1hbnVhbC54bWw8L2luY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb0N1c3RvbWl6YXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZG9jYm9vay5zb3VyY2V9L21hbnVhbC1wZGYueHNsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb0N1c3RvbWl6YXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1NyY1BhdGg+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZG9jYm9vay5zb3VyY2V9Lw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW1nU3JjUGF0aD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YnVpbGQtY2h1bmtlZC1kb2M8L2lkPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtcmVzb3VyY2VzPC9waGFzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz48Z29hbD5nZW5lcmF0ZS1odG1sPC9nb2FsPjwvZ29hbHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlRGlyZWN0b3J5Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2RvY2Jvb2suc291cmNlfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZG9jYm9vay50YXJnZXR9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXREaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPm1hbnVhbC54bWw8L2luY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaHVua2VkT3V0cHV0PnRydWU8L2NodW5rZWRPdXRwdXQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNodW5rUXVpZXRseT5mYWxzZTwvY2h1bmtRdWlldGx5Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxodG1sQ3VzdG9taXphdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkb2Nib29rLnNvdXJjZX0vbWFudWFsLXhodG1sLWNodW5rLnhzbA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHRtbEN1c3RvbWl6YXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvc3RQcm9jZXNzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJlbmFtZSBtYW51YWwgdG8gaW5kZXggLS0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtb3ZlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9IiR7ZG9jYm9vay50YXJnZXR9L21hbnVhbC5odG1sIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9IiR7ZG9jYm9vay50YXJnZXR9L2luZGV4Lmh0bWwiLz4NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb3B5IG92ZXIgaW1hZ2VzIGFuZCBzdHlsZXMgLS0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7ZG9jYm9vay50YXJnZXR9L2ltZyIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtkb2Nib29rLnRhcmdldH0vaW1nIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSIke2RvY2Jvb2suc291cmNlfS9pbWciPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouKiIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7ZG9jYm9vay50YXJnZXR9L2NzcyIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtkb2Nib29rLnRhcmdldH0vY3NzIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSIke2RvY2Jvb2suc291cmNlfS9jc3MiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouKiIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb3N0UHJvY2Vzcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YnVpbGQtc2luZ2xlLWRvYzwvaWQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPjxnb2FsPmdlbmVyYXRlLWh0bWw8L2dvYWw+PC9nb2Fscz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZG9jYm9vay5zb3VyY2V9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkb2Nib29rLnRhcmdldH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhcmdldERpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+bWFudWFsLnhtbDwvaW5jbHVkZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNodW5rZWRPdXRwdXQ+ZmFsc2U8L2NodW5rZWRPdXRwdXQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh0bWxDdXN0b21pemF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2RvY2Jvb2suc291cmNlfS9tYW51YWwteGh0bWwueHNsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9odG1sQ3VzdG9taXphdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5kb2Nib29rPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kb2Nib29rLXhtbDwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+NC40PC92ZXJzaW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCisgICAgICAgICAgICA8L2J1aWxkPg0KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQorICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWlsZGRvY3M8L25hbWU+DQorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+DQorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KKyAgICAgICAgICAgIDxwbHVnaW5SZXBvc2l0b3JpZXM+DQorICAgICAgICAgICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5Pg0KKyAgICAgICAgICAgICAgICAgICAgPGlkPmFnaWxlamF2YTwvaWQ+DQorICAgICAgICAgICAgICAgICAgICA8bmFtZT5BZ2lsZWphdmEgcmVwb3NpdG9yeSAoRG9jYm9vayBwbHVnaW4pPC9uYW1lPg0KKyAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwOi8vYWdpbGVqYXZhLmNvbS9tYXZlbjwvdXJsPg0KKyAgICAgICAgICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQorICAgICAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+DQorICAgICAgICA8L3Byb2ZpbGU+DQorDQorICAgICAgICA8IS0tIHNpZ24gdGhlIHJlbGVhc2UgZmlsZXMgLS0+DQorICAgICAgICA8cHJvZmlsZT4NCisgICAgICAgICAgICA8aWQ+c2lnbi1yZWxlYXNlPC9pZD4NCisgICAgICAgICAgICA8YnVpbGQ+DQorICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+U2lnbmluZyByZWxlYXNlIGZpbGVzLi4uPC9lY2hvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWNyb2RlZiBuYW1lPSJzaWduLWZpbGUiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIC8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW50aWFsPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGZhaWxvbmVycm9yPSJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9IkB7ZmlsZX0uYXNjIi8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImdwZyINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tYmF0Y2giLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdmVyYm9zZSIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1kZWZhdWx0LWtleSIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtvcGVuanBhLnJlbGVhc2Uua2V5QWxpYXN9Ii8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWFybW9yIi8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWRldGFjaC1zaWciLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9IkB7ZmlsZX0iLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbnRpYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYWNyb2RlZj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2lnbi1maWxlIGZpbGU9IiR7b3BlbmpwYS5hc3NlbWJseS5iaW5hcnlGaWxlfSIvPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaWduLWZpbGUgZmlsZT0iJHtvcGVuanBhLmFzc2VtYmx5LnNvdXJjZUZpbGV9Ii8+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCisNCisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc2lnbmF0dXJlLWFydGlmYWN0czwvaWQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2gtYXJ0aWZhY3Q8L2dvYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHtvcGVuanBhLmFzc2VtYmx5LmJpbmFyeUZpbGV9LmFzYzwvZmlsZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPiR7b3BlbmpwYS5hc3NlbWJseS5iaW5hcnlTdWZmaXh9LnppcDwvY2xhc3NpZmllcj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmFzYzwvdHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHtvcGVuanBhLmFzc2VtYmx5LnNvdXJjZUZpbGV9LmFzYzwvZmlsZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPiR7b3BlbmpwYS5hc3NlbWJseS5zb3VyY2VTdWZmaXh9LnppcDwvY2xhc3NpZmllcj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmFzYzwvdHlwZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0cz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCisgICAgICAgICAgICA8L2J1aWxkPg0KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQorICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaWduPC9uYW1lPg0KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPg0KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCisgICAgICAgIDwvcHJvZmlsZT4NCisgICAgPC9wcm9maWxlcz4NCisNCisgICAgPCEtLSBuZWVkIHRvIGV4cGxpY2l0bHkgbGlzdCBkZXBlbmRlbmNpZXMgZm9yIGFzc2VtYmx5IHRvIHdvcmsgLS0+DQorICAgIDxkZXBlbmRlbmNpZXM+DQorICAgICAgICA8ZGVwZW5kZW5jeT4NCisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW5qcGE8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbmpwYTwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisNCisgICAgICAgIDwhLS0gaW5jbHVkZWQgc28gd2UgY2FuIGluY2x1ZGUgaXQgaW4gdGhlIGRpc3RyaWJ1dGlvbiAtLT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZGVyYnk8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVyYnk8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+MTAuMi4yLjA8L3ZlcnNpb24+DQorICAgICAgICA8L2RlcGVuZGVuY3k+DQorICAgIDwvZGVwZW5kZW5jaWVzPg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zb3VyY2UtYXNzZW1ibHkueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc291cmNlLWFzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NjZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc291cmNlLWFzc2VtYmx5LnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxhc3NlbWJseT4KKyAgICA8aWQ+c291cmNlPC9pZD4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPCEtLQorICAgICAgICByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlIGJhc2UgZGlyZWN0b3J5ICh3aGljaCB3b3VsZCBjYXVzZSB0aGlzCisgICAgICAgIGFyY2hpdmUgdG8gdW5wYWNrIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBiaW5hcnkKKyAgICAgICAgZGlzdHJpYnV0aW9uKSwgd2Ugc3BlY2lmeSB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdG8gcHV0CisgICAgICAgIHNvdXJjZXMgYmVsb3csIGluIHRoZSA8b3V0cHV0RGlyZWN0b3J5PiB0YWdzCisgICAgLS0+CisgICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT4uLjwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2FydGlmYWN0SWR9LSR7dmVyc2lvbn0tc291cmNlPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovdGFyZ2V0LyoqPC9leGNsdWRlPgorICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9maWxlU2V0PgorCisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIEFsc28gcHV0IHRoZSBzdGFuZGFyZCBsaWNlbnNlIGFuZCBub3RpY2UgZmlsZXMgYXQgdGhlIHRvcAorICAgICAgICAgICAgb2YgdGhlIHppcC4gRXZlbiB0aG9zZSB0aGVzZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorICAgICAgICAgICAgb3BlbmpwYS1wcm9qZWN0IHN1Yi1kaXJlY3RvcnksIHRoZSBBcGFjaGUgcnVsZXMgc2F5IHRoYXQKKyAgICAgICAgICAgIGl0IG5lZWRzIHRvIGJlIGluIHRoZSB0b3AtbGV2ZWwgb2YgdGhlIGFydGlmYWN0LiBTZWU6CisKKyAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGVnYWwvc3JjLWhlYWRlcnMuaHRtbCNub3RpY2UKKyAgICAgICAgLS0+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2FydGlmYWN0SWR9LSR7dmVyc2lvbn0tc291cmNlPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+UkVBRE1FPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkRJU0NMQUlNRVI8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5TVEFUVVM8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFQURNRS50eHQ8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+RElTQ0xBSU1FUi50eHQ8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+U1RBVFVTLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkJVSUxESU5HPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkJVSUxESU5HLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUxFQVNFLU5PVEVTPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFTEVBU0UtTk9URVMuaHRtbDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUxFQVNFLU5PVEVTLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5DSEFOR0VTPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvY3NzL2RvY2Jvb2suY3NzIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvY3NzL2RvY2Jvb2suY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjE1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9jc3MvZG9jYm9vay5jc3MKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgCisgKi8KKworLyogY29udGVudCBzdHlsZXMgKi8KK2h0bWwgeworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworCWNvbG9yOiBibGFjazsKKwlmb250LWZhbWlseTogQXJpYWwsIEx1Y2lkYSBHcmFuZGUsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAwLjg1ZW07CisJbGluZS1oZWlnaHQ6IDEuMjVlbTsKK30KKworCisvKiBsaW5rcyAqLworYTpob3ZlciB7Y29sb3I6ICMwMDQ0QjM7fQorYSB7Y29sb3I6ICM1OTdCQjM7fQorYS5ub25leGlzdGVudCwgYS5iYWRpbnRlcndpa2kge2NvbG9yOiBncmF5O30KKworLyogSGVhZGluZ3MgKi8KKworaDEgYSB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOyAgICAKKwljb2xvcjogYmxhY2s7Cit9CitsaSBwIHsKKwltYXJnaW46IC4yNWVtIDA7Cit9CitsaS5nYXAgeworCW1hcmdpbi10b3A6IDAuNWVtOworfQorYSwgaW1nLCBpbWcuZHJhd2luZyB7CisJYm9yZGVyOiAwOworfQorZHQgeworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitwcmUgeworCXBhZGRpbmc6IDAuNWVtOworCWZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CisJYm9yZGVyOiAxcHQgc29saWQgI2MwYzBjMDsKKwltYXJnaW4tbGVmdDogMWVtOworCWJhY2tncm91bmQ6ICNGMEVDRTY7CisJd2hpdGUtc3BhY2U6IHByZTsKKwkvKiBiZWdpbiBjc3MgMyBvciBicm93c2VyIHNwZWNpZmljIHJ1bGVzIC0gZG8gbm90IHJlbW92ZSEKKwlzZWU6IGh0dHA6Ly9mb3J1bXMudGVjaGd1eS5vcmcvYXJjaGl2ZS9pbmRleC5waHAvdC0yNDk4NDkuaHRtbCAqLworICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKKyAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CisgICAgd2hpdGUtc3BhY2U6IC1tb3otcHJlLXdyYXA7CisgICAgd2hpdGUtc3BhY2U6IC1wcmUtd3JhcDsKKyAgICB3aGl0ZS1zcGFjZTogLW8tcHJlLXdyYXA7CisgICAgLyogZW5kIGNzcyAzIG9yIGJyb3dzZXIgc3BlY2lmaWMgcnVsZXMgKi8KK30KKwordGFibGUKK3sKKwltYXJnaW46IDAuNWVtIDA7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKK30KKwordGQKK3sKKwlwYWRkaW5nOiAwLjI1ZW07CisJYm9yZGVyOiAxcHggc29saWQgI0FEQjlDQzsKK30KKwordGQgcCB7CisJbWFyZ2luOiAwOworCXBhZGRpbmc6IDA7Cit9CisKKy8qIHN0YW5kYXJkIHJ1bGUgLS0tLSAqLworaHIgeworCWhlaWdodDogMXB4OworCWJhY2tncm91bmQtY29sb3I6ICNjMGMwYzA7CisJYm9yZGVyOiBub25lOworfQorCisvKiBjdXN0b20gcnVsZXMgLS0tLS0gdG8gLS0tLS0tLS0tLSAqLworLmhyMSB7aGVpZ2h0OiAycHg7fQorLmhyMiB7aGVpZ2h0OiAzcHg7fQorLmhyMyB7aGVpZ2h0OiA0cHg7fQorLmhyNCB7aGVpZ2h0OiA1cHg7fQorLmhyNSB7aGVpZ2h0OiA2cHg7fQorLmhyNiB7aGVpZ2h0OiA3cHg7fQorCisvKiBSZXBsYWNlbWVudCBmb3IgaHRtbCAzIHUgdGFnICovCisudSB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fQorCisuZm9vdG5vdGVzIHVsIHsKKwlwYWRkaW5nOiAwIDJlbTsKKwltYXJnaW46IDAgMCAxZW07Cit9CisKKy5mb290bm90ZXMgbGkgeworCWxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKKy5pbmZvIHsKKyAgICBmb250LXNpemU6IDAuODVlbTsKKyAgICBjb2xvcjogZ3JheTsKK30KKworI3BhZ2VpbmZvIHsKKyAgICBtYXJnaW4tdG9wOiAyZW07Cit9CisKKy8qIGV5ZSBjYXRjaGVycyAqLworLndhcm5pbmcgCit7CisJY29sb3I6IHJlZDsKK30KKworLmVycm9yIAoreworCWNvbG9yOiByZWQ7Cit9CisKK3N0cm9uZy5oaWdobGlnaHQgCit7CisJYmFja2dyb3VuZC1jb2xvcjogI0NDRTBGRjsKKwlwYWRkaW5nOiAxcHQ7Cit9CisKKyNjcmVkaXRzIGltZyB7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLyogUmVjZW50IGNoYW5nZXMgKi8KKworLnJlY2VudGNoYW5nZXMgcCB7CisJbWFyZ2luOiAwLjI1ZW07Cit9CisKKy5yZWNlbnRjaGFuZ2VzIHRkIHsKKwl2ZXJ0aWNhbC1hbGlnbjogdG9wOworCWJvcmRlcjogbm9uZTsKKwlib3JkZXItYm90dG9tOiAxcHQgc29saWQgI0YwRUNFNjsKKwliYWNrZ3JvdW5kOiAjRjdGNkYyOworfQorCisucmNkYXlicmVhayB0ZCB7CisJYmFja2dyb3VuZDogI0I4QzVEOTsKKwlib3JkZXI6IG5vbmU7Cit9CisKKy5yY2RheWJyZWFrIHRkIGEgeworCWZvbnQtc2l6ZTogMC44OGVtOworfQorCisucmNpY29uMSwgLnJjaWNvbjIgeworCXRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnJjcGFnZWxpbmsgeworCXdpZHRoOiAzMyU7Cit9CisKKy5yY3RpbWUgeworCWZvbnQtc2l6ZTogMC44OGVtOworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5yY2VkaXRvciB7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwlmb250LXNpemU6IDAuODhlbTsKK30KKworLnJjY29tbWVudCB7CisJd2lkdGg6IDY2JTsKKwljb2xvcjogZ3JheTsKKwlmb250LXNpemU6IDAuODhlbTsKK30KKworLnJjcnNzIHsKKwlmbG9hdDogcmlnaHQ7Cit9CisKKy5yZWNlbnRjaGFuZ2VzW2Rpcj0icnRsIl0gLnJjcnNzIHsKKwlmbG9hdDogbGVmdDsKK30KKworLyogVXNlciBQcmVmZXJlbmNlcyAqLworCisudXNlcnByZWYgdGFibGUsIC51c2VycHJlZiB0ZCB7CisJYm9yZGVyOiBub25lOworfQorCisKKy8qIENTUyBmb3IgbmV3IGNvZGVfYXJlYSBtYXJrdXAgdXNlZCBieSBDb2xvcml6ZXIgYW5kIFBhcnNlckJhc2UgKi8KKworZGl2LmNvZGVhcmVhIHsgLyogdGhlIGRpdiBtYWtlcyB0aGUgYm9yZGVyICovCisJbWFyZ2luOiAwLjVlbSAwOworCXBhZGRpbmc6IDA7CisJYm9yZGVyOiAxcHQgc29saWQgI0FFQkRDQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNUY3OworCWNvbG9yOiBibGFjazsKK30KKworZGl2LmNvZGVhcmVhIHByZSB7IC8qIHRoZSBwcmUgaGFzIG5vIGJvcmRlciBhbmQgaXMgaW5zaWRlIHRoZSBkaXYgKi8KKwltYXJnaW46IDA7CisJcGFkZGluZzogMTBwdDsKKwlib3JkZXI6IG5vbmU7Cit9CisKK2EuY29kZW51bWJlcnMgeyAvKiBmb3JtYXQgb2YgdGhlIGxpbmUgbnVtYmVyaW5nIGxpbmsgKi8KKwltYXJnaW46IDAgMTBwdDsKKwlmb250LXNpemU6IDAuODVlbTsKKwljb2xvcjogZ3JheTsKK30KKworLyogZm9ybWF0IG9mIGNlcnRhaW4gc3ludGF4IHNwYW5zICovCitkaXYuY29kZWFyZWEgcHJlIHNwYW4uTGluZU51bWJlciB7Y29sb3I6IGdyYXk7fQorZGl2LmNvZGVhcmVhIHByZSBzcGFuLklEICAgICAgICAge2NvbG9yOiAjMDAwMDAwO30KK2Rpdi5jb2RlYXJlYSBwcmUgc3Bhbi5PcGVyYXRvciAgIHtjb2xvcjogIzAwMDBDMDt9CitkaXYuY29kZWFyZWEgcHJlIHNwYW4uQ2hhciAgICAgICB7Y29sb3I6ICMwMDQwODA7fQorZGl2LmNvZGVhcmVhIHByZSBzcGFuLkNvbW1lbnQgICAge2NvbG9yOiAjMDA4MDAwO30KK2Rpdi5jb2RlYXJlYSBwcmUgc3Bhbi5OdW1iZXIgICAgIHtjb2xvcjogIzAwODBDMDt9CitkaXYuY29kZWFyZWEgcHJlIHNwYW4uU3RyaW5nICAgICB7Y29sb3I6ICMwMDQwODA7fQorZGl2LmNvZGVhcmVhIHByZSBzcGFuLlNQQ2hhciAgICAge2NvbG9yOiAjMDAwMEMwO30KK2Rpdi5jb2RlYXJlYSBwcmUgc3Bhbi5SZXNXb3JkICAgIHtjb2xvcjogI0EwMDAwMDt9CitkaXYuY29kZWFyZWEgcHJlIHNwYW4uQ29uc1dvcmQgICB7Y29sb3I6ICMwMDgwODA7IGZvbnQtd2VpZ2h0OiBib2xkO30KK2Rpdi5jb2RlYXJlYSBwcmUgc3Bhbi5FcnJvciAgICAgIHtjb2xvcjogI0ZGODA4MDsgYm9yZGVyOiBzb2xpZCAxLjVwdCAjRkYwMDAwO30KK2Rpdi5jb2RlYXJlYSBwcmUgc3Bhbi5SZXNXb3JkMiAgIHtjb2xvcjogIzAwODBmZjsgZm9udC13ZWlnaHQ6IGJvbGQ7fQorZGl2LmNvZGVhcmVhIHByZSBzcGFuLlNwZWNpYWwgICAge2NvbG9yOiAjMDAwMGZmO30KK2Rpdi5jb2RlYXJlYSBwcmUgc3Bhbi5QcmVwcmMgICAgIHtjb2xvcjogIzgwMzk5OTt9CisKKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2FwcGlkLWhpZXJhcmNoeS5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvYXBwaWQtaGllcmFyY2h5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFlZmNkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2FwcGlkLWhpZXJhcmNoeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2Jhc2ljLWNvbGwucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2Jhc2ljLWNvbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTFjNTMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvYmFzaWMtY29sbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2VtYmVkZGVkLWNvbGwucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2VtYmVkZGVkLWNvbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjFmMDUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvZW1iZWRkZWQtY29sbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2VuaGFuY2VtZW50LnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9lbmhhbmNlbWVudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkZDdkZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9lbmhhbmNlbWVudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2VudGl0eW1hbmFnZXIucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2VudGl0eW1hbmFnZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODE0MzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvZW50aXR5bWFuYWdlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2VudGl0eW1hbmFnZXJmYWN0b3J5LnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9lbnRpdHltYW5hZ2VyZmFjdG9yeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlN2U0MwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9lbnRpdHltYW5hZ2VyZmFjdG9yeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2luaGVyLXN1cGVyY2xhc3MtdGFibGUucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2luaGVyLXN1cGVyY2xhc3MtdGFibGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMmY1NTAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvaW5oZXItc3VwZXJjbGFzcy10YWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2luaGVyLXRwYy5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvaW5oZXItdHBjLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU4ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2luaGVyLXRwYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2ludi1rZXktY29sbC5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvaW52LWtleS1jb2xsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzNjZWFkCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2ludi1rZXktY29sbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pvaW5zLWNvbnN0YW50LnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qb2lucy1jb25zdGFudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4ZDg1ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qb2lucy1jb25zdGFudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1hcmNoLnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtYXJjaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YmNmZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtYXJjaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1hc3NvYy10YWJsZS5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWFzc29jLXRhYmxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE1YzIxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1hc3NvYy10YWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1iYXNpYy1maWVsZC5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWJhc2ljLWZpZWxkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJjNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1iYXNpYy1maWVsZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1kYXRhLW1vZGVsLnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtZGF0YS1tb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjMzc4MgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtZGF0YS1tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1kaXJlY3QtcmVsYXRpb24ucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1kaXJlY3QtcmVsYXRpb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTEwMDcKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWRpcmVjdC1yZWxhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1kaXNjcmltLWFsbC5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWRpc2NyaW0tYWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzE1ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1kaXNjcmltLWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1lbWJlZGRlZC5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWVtYmVkZGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjljMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1lbWJlZGRlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1leGNlcHRpb25zLnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtZXhjZXB0aW9ucy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1ODE0NQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtZXhjZXB0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1pbmhlci1hbGwucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1pbmhlci1hbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDBiYzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWluaGVyLWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1pbmhlci1qb2luZWQucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1pbmhlci1qb2luZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWExZWUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLWluaGVyLWpvaW5lZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1tYXAucG5nIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1tYXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4N2U1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLW1hcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1tYXBwaW5nLWlkZW50aXR5LnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtbWFwcGluZy1pZGVudGl0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4OTcwNgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtbWFwcGluZy1pZGVudGl0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1tZXRhLW1vZGVsLnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtbWV0YS1tb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiZDEzMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9qcGEtbWV0YS1tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1xdWVyeS5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLXF1ZXJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzVhNTMxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1xdWVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1zdGF0ZS10cmFuc2l0aW9ucy5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLXN0YXRlLXRyYW5zaXRpb25zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODgwMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS1zdGF0ZS10cmFuc2l0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS10cmFuc2FjdGlvbi5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvanBhLXRyYW5zYWN0aW9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVmZDVjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL2pwYS10cmFuc2FjdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL3BlcnNpc3RlbmNlLnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9wZXJzaXN0ZW5jZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3ZjRmZAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9wZXJzaXN0ZW5jZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL3NlY29uZGFyeS10YWJsZS5wbmcgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9pbWcvc2Vjb25kYXJ5LXRhYmxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzFiNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL3NlY29uZGFyeS10YWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvaW1nL3NxbHF1ZXJ5LW1vZGVsLnBuZyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9zcWxxdWVyeS1tb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGY3OGFjMAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2ltZy9zcWxxdWVyeS1tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X2FyY2gueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X2FyY2gueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTc5N2EKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfYXJjaC54bWwKQEAgLTAsMCArMSwzMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19hcmNoIj4KKyAgICA8dGl0bGU+CisgICAgICAgIEphdmEgUGVyc2lzdGVuY2UgQVBJIEFyY2hpdGVjdHVyZQorICAgIDwvdGl0bGU+CisgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfYXJjaCI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgSlBBCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgIGFyY2hpdGVjdHVyZQorICAgICAgICA8L3NlY29uZGFyeT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8cGFyYT4KK1RoZSBkaWFncmFtIGJlbG93IGlsbHVzdHJhdGVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHByaW1hcnkgY29tcG9uZW50cworb2YgdGhlIEpQQSBhcmNoaXRlY3R1cmUuCisgICAgPC9wYXJhPgorICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSA0MDAgeCAyNTYgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWcvanBhLWFyY2gucG5nIiB3aWR0aD0iMjY3cHgiLz4KKyAgICAgICAgICAgIAorICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICA8dGV4dG9iamVjdD4KKyAgICAgICAgICAgIDxwaHJhc2U+CisgICAgICAgICAgICAgICAgSlBBIGFyY2hpdGVjdHVyZQorICAgICAgICAgICAgPC9waHJhc2U+CisgICAgICAgIDwvdGV4dG9iamVjdD4KKyAgICA8L21lZGlhb2JqZWN0PgorICAgIDxub3RlPgorICAgICAgICA8cGFyYT4KK0EgbnVtYmVyIG9mIHRoZSBkZXBpY3RlZCBpbnRlcmZhY2VzIGFyZSBvbmx5IHJlcXVpcmVkIG91dHNpZGUgb2YgYW4KK0VKQjMtY29tcGxpYW50IGFwcGxpY2F0aW9uIHNlcnZlci4gSW4gYW4gYXBwbGljYXRpb24gc2VydmVyLCA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpbnN0YW5jZXMgYXJlIHR5cGljYWxseSBpbmplY3RlZCwgcmVuZGVyaW5nIHRoZQorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY2xhc3NuYW1lPiB1bm5lY2Vzc2FyeS4gQWxzbywgdHJhbnNhY3Rpb25zCit3aXRoaW4gYW4gYXBwbGljYXRpb24gc2VydmVyIGFyZSBoYW5kbGVkIHVzaW5nIHN0YW5kYXJkIGFwcGxpY2F0aW9uIHNlcnZlcgordHJhbnNhY3Rpb24gY29udHJvbHMuIFRodXMsIHRoZSA8Y2xhc3NuYW1lPkVudGl0eVRyYW5zYWN0aW9uPC9jbGFzc25hbWU+IGFsc28KK2dvZXMgdW51c2VkLgorICAgICAgICA8L3BhcmE+CisgICAgPC9ub3RlPgorICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2UKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj48bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UiPjxjbGFzc25hbWU+CitQZXJzaXN0ZW5jZTwvY2xhc3NuYW1lPjwvbGluaz48L2VtcGhhc2lzPjogVGhlIDxjbGFzc25hbWU+CitqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTwvY2xhc3NuYW1lPiBjbGFzcyBjb250YWlucyBzdGF0aWMgaGVscGVyIG1ldGhvZHMKK3RvIG9idGFpbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGluc3RhbmNlcyBpbiBhCit2ZW5kb3ItbmV1dHJhbCBmYXNoaW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+PGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X2VtZmFjdG9yeSI+PGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+PC9saW5rPjwvZW1waGFzaXM+OiBUaGUgPGNsYXNzbmFtZT4KK2phdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IKKzxjbGFzc25hbWU+IEVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+PGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X2VtIj48Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPjwvbGluaz48L2VtcGhhc2lzPjogVGhlIDxjbGFzc25hbWU+amF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+IGlzIHRoZSBwcmltYXJ5IEpQQSBpbnRlcmZhY2UgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEVhY2gKKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBtYW5hZ2VzIGEgc2V0IG9mIHBlcnNpc3RlbnQgb2JqZWN0cywgYW5kCitoYXMgQVBJcyB0byBpbnNlcnQgbmV3IG9iamVjdHMgYW5kIGRlbGV0ZSBleGlzdGluZyBvbmVzLiBXaGVuIHVzZWQgb3V0c2lkZSB0aGUKK2NvbnRhaW5lciwgdGhlcmUgaXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuIDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGFuZCBhbiA8Y2xhc3NuYW1lPiBFbnRpdHlUcmFuc2FjdGlvbjwvY2xhc3NuYW1lPi4KKzxjbGFzc25hbWU+IEVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zIGFsc28gYWN0IGFzIGZhY3RvcmllcyBmb3IgPGNsYXNzbmFtZT4KK1F1ZXJ5PC9jbGFzc25hbWU+IGluc3RhbmNlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj48bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGMiPjxjbGFzc25hbWU+RW50aXR5Cis8L2NsYXNzbmFtZT48L2xpbms+PC9lbXBoYXNpcz46IEVudGl0ZXMgYXJlIHBlcnNpc3RlbnQgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorZGF0YXN0b3JlIHJlY29yZHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW50aXR5VHJhbnNhY3Rpb24KKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj48bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfdHJhbnMiPjxjbGFzc25hbWU+CitFbnRpdHlUcmFuc2FjdGlvbjwvY2xhc3NuYW1lPjwvbGluaz48L2VtcGhhc2lzPjogRWFjaCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPiBoYXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uIHdpdGggYSBzaW5nbGUgPGNsYXNzbmFtZT4KK2phdmF4LnBlcnNpc3RlbmNlLkVudGl0eVRyYW5zYWN0aW9uPC9jbGFzc25hbWU+LiA8Y2xhc3NuYW1lPgorRW50aXR5VHJhbnNhY3Rpb248L2NsYXNzbmFtZT5zIGFsbG93IG9wZXJhdGlvbnMgb24gcGVyc2lzdGVudCBkYXRhIHRvIGJlIAorZ3JvdXBlZCBpbnRvIHVuaXRzIG9mIHdvcmsgdGhhdCBlaXRoZXIgY29tcGxldGVseSBzdWNjZWVkIG9yIGNvbXBsZXRlbHkgZmFpbCwgCitsZWF2aW5nIHRoZSBkYXRhc3RvcmUgaW4gaXRzIG9yaWdpbmFsIHN0YXRlLiBUaGVzZSBhbGwtb3Itbm90aGluZyBvcGVyYXRpb25zIAorYXJlIGltcG9ydGFudCBmb3IgbWFpbnRhaW5pbmcgZGF0YSBpbnRlZ3JpdHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEphdmEgUGVyc2lzdGVuY2UgUXVlcnkgTGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTAorICAgICAgICAgICAgICAgIDwvc2VlPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBKUFFMCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBKUEEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgcXVlcnkgbGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgICAgICBKUFFMCisgICAgICAgICAgICAgICAgPC9zZWU+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZWQgUXVlcnkgTGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICAgICAgU1FMCisgICAgICAgICAgICAgICAgPC9zZWU+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPjxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19xdWVyeSI+PGNsYXNzbmFtZT5RdWVyeQorPC9jbGFzc25hbWU+PC9saW5rPjwvZW1waGFzaXM+OiBUaGUgPGNsYXNzbmFtZT5qYXZheC5wZXJzaXN0ZW5jZS5RdWVyeQorPC9jbGFzc25hbWU+IGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBlYWNoIEpQQSB2ZW5kb3IgdG8gZmluZCBwZXJzaXN0ZW50CitvYmplY3RzIHRoYXQgbWVldCBjZXJ0YWluIGNyaXRlcmlhLiBKUEEgc3RhbmRhcmRpemVzIHN1cHBvcnQgZm9yIHF1ZXJpZXMgdXNpbmcKK2JvdGggdGhlIEphdmEgUGVyc2lzdGVuY2UgUXVlcnkgTGFuZ3VhZ2UgKEpQUUwpIGFuZCB0aGUgU3RydWN0dXJlZCBRdWVyeSAKK0xhbmd1YWdlIChTUUwpLiBZb3Ugb2J0YWluIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gaW5zdGFuY2VzIGZyb20gYW4gCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPHBhcmE+CitUaGUgZXhhbXBsZSBiZWxvdyBpbGx1c3RyYXRlcyBob3cgdGhlIEpQQSBpbnRlcmZhY2VzIGludGVyYWN0IHRvIGV4ZWN1dGUgYSBKUFFMCitxdWVyeSBhbmQgdXBkYXRlIHBlcnNpc3RlbnQgb2JqZWN0cy4gVGhlIGV4YW1wbGUgYXNzdW1lcyBleGVjdXRpb24gb3V0c2lkZSBhCitjb250YWluZXIuCisgICAgPC9wYXJhPgorICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfYXJjaF9pbnRlcmFjdF9vdXRzaWRlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSW50ZXJhY3Rpb24gb2YgSW50ZXJmYWNlcyBPdXRzaWRlIENvbnRhaW5lcgorICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorLy8gZ2V0IGFuIEVudGl0eU1hbmFnZXJGYWN0b3J5IHVzaW5nIHRoZSBQZXJzaXN0ZW5jZSBjbGFzczsgdHlwaWNhbGx5IAorLy8gdGhlIGZhY3RvcnkgaXMgY2FjaGVkIGZvciBlYXN5IHJlcGVhdGVkIHVzZQorRW50aXR5TWFuYWdlckZhY3RvcnkgZmFjdG9yeSA9IFBlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KG51bGwpOworCisvLyBnZXQgYW4gRW50aXR5TWFuYWdlciBmcm9tIHRoZSBmYWN0b3J5CitFbnRpdHlNYW5hZ2VyIGVtID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlNYW5hZ2VyKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuRVhURU5ERUQpOworCisvLyB1cGRhdGVzIHRha2UgcGxhY2Ugd2l0aGluIHRyYW5zYWN0aW9ucworRW50aXR5VHJhbnNhY3Rpb24gdHggPSBlbS5nZXRUcmFuc2FjdGlvbigpOwordHguYmVnaW4oKTsKKworLy8gcXVlcnkgZm9yIGFsbCBlbXBsb3llZXMgd2hvIHdvcmsgaW4gb3VyIHJlc2VhcmNoIGRpdmlzaW9uCisvLyBhbmQgcHV0IGluIG92ZXIgNDAgaG91cnMgYSB3ZWVrIGF2ZXJhZ2UKK1F1ZXJ5IHF1ZXJ5ID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCBlIGZyb20gRW1wbG95ZWUgZSB3aGVyZSAiCisgICAgKyAiZS5kaXZpc2lvbi5uYW1lID0gJ1Jlc2VhcmNoJyBBTkQgZS5hdmdIb3VycyAmZ3Q7IDQwIik7CitMaXN0IHJlc3VsdHMgPSBxdWVyeS5nZXRSZXN1bHRMaXN0ICgpOworCisvLyBnaXZlIGFsbCB0aG9zZSBoYXJkLXdvcmtpbmcgZW1wbG95ZWVzIGEgcmFpc2UKK2ZvciAoT2JqZWN0IHJlcyA6IHJlc3VsdHMpIHsKKyAgICBFbXBsb3llZSBlbXAgPSAoRW1wbG95ZWUpIHJlczsKKyAgICBlbXAuc2V0U2FsYXJ5KGVtcC5nZXRTYWxhcnkoKSAqIDEuMSk7Cit9CisKKy8vIGNvbW1pdCB0aGUgdXBkYXRlcyBhbmQgZnJlZSByZXNvdXJjZXMKK3R4LmNvbW1pdCgpOworZW0uY2xvc2UoKTsKK2ZhY3RvcnkuY2xvc2UoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9leGFtcGxlPgorICAgIDxwYXJhPgorV2l0aGluIGEgY29udGFpbmVyLCB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHdpbGwgYmUgaW5qZWN0ZWQKK2FuZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGRlY2xhcmF0aXZlbHkuIFRodXMsIHRoZSBpbi1jb250YWluZXIgdmVyc2lvbiAKK29mIHRoZSBleGFtcGxlIGNvbnNpc3RzIGVudGlyZWx5IG9mIGJ1c2luZXNzIGxvZ2ljOgorICAgIDwvcGFyYT4KKyAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X2FyY2hfaW50ZXJhY3RfaW5zaWRlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSW50ZXJhY3Rpb24gb2YgSW50ZXJmYWNlcyBJbnNpZGUgQ29udGFpbmVyCisgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvLyBxdWVyeSBmb3IgYWxsIGVtcGxveWVlcyB3aG8gd29yayBpbiBvdXIgcmVzZWFyY2ggZGl2aXNpb24KKy8vIGFuZCBwdXQgaW4gb3ZlciA0MCBob3VycyBhIHdlZWsgYXZlcmFnZSAtIG5vdGUgdGhhdCB0aGUgRW50aXR5TWFuYWdlciBlbQorLy8gaXMgaW5qZWN0ZWQgdXNpbmcgYSBAUmVzb3VyY2UgYW5ub3RhdGlvbgorUXVlcnkgcXVlcnkgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IGUgZnJvbSBFbXBsb3llZSBlIHdoZXJlICIKKyAgICArICJlLmRpdmlzaW9uLm5hbWUgPSAnUmVzZWFyY2gnIGFuZCBlLmF2Z0hvdXJzICZndDsgNDAiKTsKK0xpc3QgcmVzdWx0cyA9IHF1ZXJ5LmdldFJlc3VsdExpc3QoKTsKKworLy8gZ2l2ZSBhbGwgdGhvc2UgaGFyZC13b3JraW5nIGVtcGxveWVlcyBhIHJhaXNlCitmb3IgKE9iamVjdCByZXMgOiByZXN1bHRzKSB7CisgICAgZW1wID0gKEVtcGxveWVlKSByZXM7CisgICAgZW1wLnNldFNhbGFyeShlbXAuZ2V0U2FsYXJ5KCkgKiAxLjEpOworfSAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9leGFtcGxlPgorICAgIDxwYXJhPgorVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGV4cGxvcmVzIHRoZSBKUEEgaW50ZXJmYWNlcyBpbiBkZXRhaWwuIFdlIHByZXNlbnQKK3RoZW0gaW4gcm91Z2hseSB0aGUgb3JkZXIgdGhhdCB5b3Ugd2lsbCB1c2UgdGhlbSBhcyB5b3UgZGV2ZWxvcCB5b3VyCithcHBsaWNhdGlvbi4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19hcmNoX2V4Y2VwdGlvbnMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBKUEEgRXhjZXB0aW9ucworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19hcmNoX2V4Y2VwdGlvbnMiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgZXhjZXB0aW9ucworICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA0MjcgeCAzNTUgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1leGNlcHRpb25zLnBuZyIgd2lkdGg9IjI4NXB4Ii8+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICAgICAgPHRleHRvYmplY3Q+CisgICAgICAgICAgICAgICAgPHBocmFzZT4KKyAgICAgICAgICAgICAgICAgICAgSlBBIGV4Y2VwdGlvbiBhcmNoaXRlY3R1cmUKKyAgICAgICAgICAgICAgICA8L3BocmFzZT4KKyAgICAgICAgICAgIDwvdGV4dG9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPHBhcmE+CitUaGUgZGlhZ3JhbSBhYm92ZSBkZXBpY3RzIHRoZSBKUEEgZXhjZXB0aW9uIGFyY2hpdGVjdHVyZS4gQWxsCitleGNlcHRpb25zIGFyZSB1bmNoZWNrZWQuIEpQQSB1c2VzIHN0YW5kYXJkIGV4Y2VwdGlvbnMgd2hlcmUKK2FwcHJvcHJpYXRlLCBtb3N0IG5vdGFibHkgPGNsYXNzbmFtZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NsYXNzbmFtZT5zIGFuZAorPGNsYXNzbmFtZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NsYXNzbmFtZT5zLiBUaGUgc3BlY2lmaWNhdGlvbiBhbHNvIHByb3ZpZGVzCithIGZldyBKUEEtc3BlY2lmaWMgZXhjZXB0aW9ucyBpbiB0aGUgPGxpdGVyYWw+amF2YXgucGVyc2lzdGVuY2U8L2xpdGVyYWw+CitwYWNrYWdlLiBUaGVzZSBleGNlcHRpb25zIHNob3VsZCBiZSBzZWxmLWV4cGxhbmF0b3J5LiBTZWUgdGhlCis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS81L2RvY3MvYXBpIj5KYXZhZG9jPC91bGluaz4gZm9yCithZGRpdGlvbmFsIGRldGFpbHMgb24gSlBBIGV4Y2VwdGlvbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KK0FsbCBleGNlcHRpb25zIHRocm93biBieSBPcGVuSlBBIGltcGxlbWVudAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9FeGNlcHRpb25JbmZvLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5FeGNlcHRpb25JbmZvPC9jbGFzc25hbWU+PC91bGluaz4gdG8gcHJvdmlkZSB5b3Ugd2l0aAorYWRkaXRpb25hbCBlcnJvciBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19jb25jbHVzaW9uLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19jb25jbHVzaW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzI1NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X2NvbmNsdXNpb24ueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19jb25jbHVzaW9uIj4KKyAgICA8dGl0bGU+CisgICAgICAgIENvbmNsdXNpb24KKyAgICA8L3RpdGxlPgorICAgIDxwYXJhPgorVGhpcyBjb25jbHVkZXMgb3VyIG92ZXJ2aWV3IG9mIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4gCis8IS0tCisjIyMgVFVUT1JJQUwKK1RoZSA8bGluayBsaW5rZW5kPSJqcGFfdHV0b3JpYWxzX2ludHJvIj5PcGVuSlBBIFR1dG9yaWFsczwvbGluaz4gY29udGludWUgeW91cgorSlBBIGVkdWNhdGlvbiB3aXRoIHN0ZXAtYnktc3RlcCBpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHNpbXBsZSBKUEEKK2FwcGxpY2F0aW9ucy4gCistLT4KK1RoZSA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfaW50cm8iPk9wZW5KUEEgUmVmZXJlbmNlIEd1aWRlPC9saW5rPgorY29udGFpbnMgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvbiBhbGwgYXNwZWN0cyBvZiB0aGUgT3BlbkpQQSBpbXBsZW1lbnRhdGlvbiAKK2FuZCBjb3JlIGRldmVsb3BtZW50IHRvb2xzLgorICAgIDwvcGFyYT4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19lbS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTIxOGYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfZW0ueG1sCkBAIC0wLDAgKzEsMTA2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0ianBhX292ZXJ2aWV3X2VtIj4KKyAgICA8dGl0bGU+CisgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X2VtIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDI4MyB4IDM5MSAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9lbnRpdHltYW5hZ2VyLnBuZyIgd2lkdGg9IjE4OXB4Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICA8L21lZGlhb2JqZWN0PgorICAgIDxwYXJhPgorVGhlIGRpYWdyYW0gYWJvdmUgcHJlc2VudHMgYW4gb3ZlcnZpZXcgb2YgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+IGludGVyZmFjZS4gRm9yIGEgY29tcGxldGUgdHJlYXRtZW50IG9mIHRoZSA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBBUEksIHNlZSB0aGUKKzx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YWVlLzUvZG9jcy9hcGkvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlci5odG1sIj4KK0phdmFkb2M8L3VsaW5rPiBkb2N1bWVudGF0aW9uLiBNZXRob2RzIHdob3NlIHBhcmFtZXRlciBzaWduYXR1cmVzIGNvbnNpc3Qgb2YgCithbiBlbGxpcHNpcyAoLi4uKSBhcmUgb3ZlcmxvYWRlZCB0byB0YWtlIG11bHRpcGxlIHBhcmFtZXRlciB0eXBlcy4KKyAgICA8L3BhcmE+CisgICAgPG5vdGU+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBleHRlbmRzIHRoZSBzdGFuZGFyZCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaW50ZXJmYWNlIHdpdGgKK3RoZSAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4KKzwvdWxpbms+IGludGVyZmFjZSB0byBwcm92aWRlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvbm90ZT4KKyAgICA8cGFyYT4KK1RoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIHVzZWQgYnkKK2FwcGxpY2F0aW9uIGRldmVsb3BlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgSlBBIHJ1bnRpbWUuIFRoZSBtZXRob2RzCitvZiB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGNhbiBiZSBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZworZnVuY3Rpb25hbCBjYXRlZ29yaWVzOgorICAgIDwvcGFyYT4KKyAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+VHJhbnNhY3Rpb248L2NsYXNzbmFtZT4gYXNzb2NpYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorRW50aXR5IGxpZmVjeWNsZSBtYW5hZ2VtZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KK0VudGl0eSBpZGVudGl0eSBtYW5hZ2VtZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KK0NhY2hlIG1hbmFnZW1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiBmYWN0b3J5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KK0Nsb3NpbmcuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19lbV90cmFucyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFRyYW5zYWN0aW9uIEFzc29jaWF0aW9uCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X2VtX3RyYW5zIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBUcmFuc2FjdGlvbgorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X2VtX3RyYW5zIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIG9idGFpbmluZyBmcm9tIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBFbnRpdHlUcmFuc2FjdGlvbiBnZXRUcmFuc2FjdGlvbiAoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorRXZlcnkgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGhhcyBhIG9uZS10by1vbmUgcmVsYXRpb24gd2l0aCBhbgorPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X3RyYW5zIj48Y2xhc3NuYW1lPkVudGl0eVRyYW5zYWN0aW9uPC9jbGFzc25hbWU+Cis8L2xpbms+IGluc3RhbmNlLiBJbiBmYWN0LCBtYW55IHZlbmRvcnMgdXNlIGEgc2luZ2xlIGNsYXNzIHRvIGltcGxlbWVudCBib3RoIHRoZQorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGFuZCA8Y2xhc3NuYW1lPkVudGl0eVRyYW5zYWN0aW9uCis8L2NsYXNzbmFtZT4gaW50ZXJmYWNlcy4gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBtdWx0aXBsZSBjb25jdXJyZW50Cit0cmFuc2FjdGlvbnMsIHlvdSB3aWxsIHVzZSBtdWx0aXBsZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorWW91IGNhbiByZXRyaWV2ZSB0aGUgPGNsYXNzbmFtZT5FbnRpdHlUcmFuc2FjdGlvbjwvY2xhc3NuYW1lPiBhc3NvY2lhdGVkIHdpdGggYW4KKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiB0aHJvdWdoIHRoZSA8bWV0aG9kbmFtZT5nZXRUcmFuc2FjdGlvbgorPC9tZXRob2RuYW1lPiBtZXRob2QuIE5vdGUgdGhhdCBtb3N0IG1vc3QgSlBBIGltcGxlbWVudGF0aW9ucyBjYW4KK2ludGVncmF0ZSB3aXRoIGFuIGFwcGxpY2F0aW9uIHNlcnZlcidzIG1hbmFnZWQgdHJhbnNhY3Rpb25zLiBJZiB5b3UgdGFrZQorYWR2YW50YWdlIG9mIHRoaXMgZmVhdHVyZSwgeW91IHdpbGwgY29udHJvbCB0cmFuc2FjdGlvbnMgYnkgZGVjbGFyYXRpdmUKK2RlbWFyY2F0aW9uIG9yIHRocm91Z2ggdGhlIEphdmEgVHJhbnNhY3Rpb24gQVBJIChKVEEpIHJhdGhlciB0aGFuIHRocm91Z2ggdGhlCis8Y2xhc3NuYW1lPkVudGl0eVRyYW5zYWN0aW9uPC9jbGFzc25hbWU+LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfZW1fbGlmZWN5Y2xlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRW50aXR5IExpZmVjeWNsZSBNYW5hZ2VtZW50CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X2VtX2xpZmVjeWNsZSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBvcGVyYXRpb25zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBwZXJmb3JtIHNldmVyYWwgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUKK2xpZmVjeWNsZSBzdGF0ZSBvZiBlbnRpdHkgaW5zdGFuY2VzLgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgdm9pZCBwZXJzaXN0KE9iamVjdCBlbnRpdHkpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHBlcnNpc3QKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHBlcnNpc3QKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IG9iamVjdHMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcGVyc2lzdGluZworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorVHJhbnNpdGlvbnMgbmV3IGluc3RhbmNlcyB0byBtYW5hZ2VkLiBPbiB0aGUgbmV4dCBmbHVzaCBvciBjb21taXQsIHRoZSBuZXdseQorcGVyc2lzdGVkIGluc3RhbmNlcyB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0ZvciBhIGdpdmVuIGVudGl0eSA8bGl0ZXJhbD5BPC9saXRlcmFsPiwgdGhlIDxtZXRob2RuYW1lPnBlcnNpc3Q8L21ldGhvZG5hbWU+CittZXRob2QgYmVoYXZlcyBhcyBmb2xsb3dzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhIG5ldyBlbnRpdHksIGl0IGJlY29tZXMgbWFuYWdlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgYW4gZXhpc3RpbmcgbWFuYWdlZCBlbnRpdHksIGl0IGlzIGlnbm9yZWQuIEhvd2V2ZXIsCit0aGUgcGVyc2lzdCBvcGVyYXRpb24gY2FzY2FkZXMgYXMgZGVmaW5lZCBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgYSByZW1vdmVkIGVudGl0eSwgaXQgYmVjb21lcyBtYW5hZ2VkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhIGRldGFjaGVkIGVudGl0eSwgYW4gPGNsYXNzbmFtZT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY2xhc3NuYW1lPiBpcyB0aHJvd24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBwZXJzaXN0IG9wZXJhdGlvbiByZWN1cnNlcyBvbiBhbGwgcmVsYXRpb24gZmllbGRzIG9mIDxsaXRlcmFsPkE8L2xpdGVyYWw+Cit3aG9zZSA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9jYXNjYWRlIj5jYXNjYWRlczwvbGluaz4gaW5jbHVkZQorPGxpdGVyYWw+Q2FzY2FkZVR5cGUuUEVSU0lTVDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgZW50aXR5KTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICByZW1vdmUKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHJlbW92ZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgb2JqZWN0cworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBkZWxldGluZworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorVHJhbnNpdGlvbnMgbWFuYWdlZCBpbnN0YW5jZXMgdG8gcmVtb3ZlZC4gVGhlIGluc3RhbmNlcyB3aWxsIGJlIGRlbGV0ZWQgZnJvbSB0aGUKK2RhdGFzdG9yZSBvbiB0aGUgbmV4dCBmbHVzaCBvciBjb21taXQuIEFjY2Vzc2luZyBhIHJlbW92ZWQgZW50aXR5IGhhcyB1bmRlZmluZWQKK3Jlc3VsdHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitGb3IgYSBnaXZlbiBlbnRpdHkgPGxpdGVyYWw+QTwvbGl0ZXJhbD4sIHRoZSA8bWV0aG9kbmFtZT5yZW1vdmU8L21ldGhvZG5hbWU+CittZXRob2QgYmVoYXZlcyBhcyBmb2xsb3dzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhIG5ldyBlbnRpdHksIGl0IGlzIGlnbm9yZWQuIEhvd2V2ZXIsIHRoZSByZW1vdmUKK29wZXJhdGlvbiBjYXNjYWRlcyBhcyBkZWZpbmVkIGJlbG93LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhbiBleGlzdGluZyBtYW5hZ2VkIGVudGl0eSwgaXQgYmVjb21lcyByZW1vdmVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhIHJlbW92ZWQgZW50aXR5LCBpdCBpcyBpZ25vcmVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhIGRldGFjaGVkIGVudGl0eSwgYW4gPGNsYXNzbmFtZT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY2xhc3NuYW1lPiBpcyB0aHJvd24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSByZW1vdmUgb3BlcmF0aW9uIHJlY3Vyc2VzIG9uIGFsbCByZWxhdGlvbiBmaWVsZHMgb2YgPGxpdGVyYWw+QTwvbGl0ZXJhbD4KK3dob3NlIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiPmNhc2NhZGVzPC9saW5rPiBpbmNsdWRlCis8bGl0ZXJhbD5DYXNjYWRlVHlwZS5SRU1PVkU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4gYWN0aXZlIHRyYW5zYWN0aW9uLgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbnRpdHkpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHJlZnJlc2gKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHJlZnJlc2gKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IG9iamVjdHMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcmVmcmVzaGluZyBzdGF0ZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIG9wdGltaXN0aWMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK1VzZSB0aGUgPG1ldGhvZG5hbWU+cmVmcmVzaDwvbWV0aG9kbmFtZT4gYWN0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgcGVyc2lzdGVudAorc3RhdGUgb2YgYW4gaW5zdGFuY2UgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIHZhbHVlcyBpbiB0aGUgZGF0YXN0b3JlLgorPG1ldGhvZG5hbWU+cmVmcmVzaDwvbWV0aG9kbmFtZT4gaXMgaW50ZW5kZWQgZm9yIGxvbmctcnVubmluZyBvcHRpbWlzdGljCit0cmFuc2FjdGlvbnMgaW4gd2hpY2ggdGhlcmUgaXMgYSBkYW5nZXIgb2Ygc2VlaW5nIHN0YWxlIGRhdGEuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitGb3IgYSBnaXZlbiBlbnRpdHkgPGxpdGVyYWw+QTwvbGl0ZXJhbD4sIHRoZSA8bWV0aG9kbmFtZT5yZWZyZXNoPC9tZXRob2RuYW1lPgorbWV0aG9kIGJlaGF2ZXMgYXMgZm9sbG93czoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgYSBuZXcgZW50aXR5LCBpdCBpcyBpZ25vcmVkLiBIb3dldmVyLCB0aGUgcmVmcmVzaAorb3BlcmF0aW9uIGNhc2NhZGVzIGFzIGRlZmluZWQgYmVsb3cuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIDxsaXRlcmFsPkE8L2xpdGVyYWw+IGlzIGFuIGV4aXN0aW5nIG1hbmFnZWQgZW50aXR5LCBpdHMgc3RhdGUgaXMgcmVmcmVzaGVkCitmcm9tIHRoZSBkYXRhc3RvcmUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIDxsaXRlcmFsPkE8L2xpdGVyYWw+IGlzIGEgcmVtb3ZlZCBlbnRpdHksIGl0IGlzIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIDxsaXRlcmFsPkE8L2xpdGVyYWw+IGlzIGEgZGV0YWNoZWQgZW50aXR5LCBhbiA8Y2xhc3NuYW1lPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jbGFzc25hbWU+IGlzIHRocm93bi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHJlZnJlc2ggb3BlcmF0aW9uIHJlY3Vyc2VzIG9uIGFsbCByZWxhdGlvbiBmaWVsZHMgb2YgPGxpdGVyYWw+QTwvbGl0ZXJhbD4KK3dob3NlIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiPmNhc2NhZGVzPC9saW5rPiBpbmNsdWRlCis8bGl0ZXJhbD5DYXNjYWRlVHlwZS5SRUZSRVNIPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBPYmplY3QgbWVyZ2UoT2JqZWN0IGVudGl0eSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbWVyZ2UKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgZGV0YWNobWVudAorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGRldGFjaG1lbnQKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtZXJnZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgZGV0YWNobWVudAorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgb2JqZWN0CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgdmFsdWUgb2JqZWN0CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorQSBjb21tb24gdXNlIGNhc2UgZm9yIGFuIGFwcGxpY2F0aW9uIHJ1bm5pbmcgaW4gYSBzZXJ2bGV0IG9yIGFwcGxpY2F0aW9uIHNlcnZlcgoraXMgdG8gImRldGFjaCIgb2JqZWN0cyBmcm9tIGFsbCBzZXJ2ZXIgcmVzb3VyY2VzLCBtb2RpZnkgdGhlbSwgYW5kIHRoZW4gImF0dGFjaCIKK3RoZW0gYWdhaW4uIEZvciBleGFtcGxlLCBhIHNlcnZsZXQgbWlnaHQgc3RvcmUgcGVyc2lzdGVudCBkYXRhIGluIGEgdXNlciBzZXNzaW9uCitiZXR3ZWVuIGEgbW9kaWZpY2F0aW9uIGJhc2VkIG9uIGEgc2VyaWVzIG9mIHdlYiBmb3Jtcy4gQmV0d2VlbiBlYWNoIGZvcm0KK3JlcXVlc3QsIHRoZSB3ZWIgY29udGFpbmVyIG1pZ2h0IGRlY2lkZSB0byBzZXJpYWxpemUgdGhlIHNlc3Npb24sIHJlcXVpcmluZyB0aGF0Cit0aGUgc3RvcmVkIHBlcnNpc3RlbnQgc3RhdGUgYmUgZGlzYXNzb2NpYXRlZCBmcm9tIGFueSBvdGhlciByZXNvdXJjZXMuCitTaW1pbGFybHksIGEgY2xpZW50L3NlcnZlciBhcHBsaWNhdGlvbiBtaWdodCB0cmFuc2ZlciBwZXJzaXN0ZW50IG9iamVjdHMgdG8gYQorY2xpZW50IHZpYSBzZXJpYWxpemF0aW9uLCBhbGxvdyB0aGUgY2xpZW50IHRvIG1vZGlmeSB0aGVpciBzdGF0ZSwgYW5kIHRoZW4gaGF2ZQordGhlIGNsaWVudCByZXR1cm4gdGhlIG1vZGlmaWVkIGRhdGEgaW4gb3JkZXIgdG8gYmUgc2F2ZWQuIFRoaXMgaXMgc29tZXRpbWVzCityZWZlcnJlZCB0byBhcyB0aGUgPGVtcGhhc2lzPmRhdGEgdHJhbnNmZXIgb2JqZWN0PC9lbXBoYXNpcz4gb3IgPGVtcGhhc2lzPnZhbHVlCitvYmplY3Q8L2VtcGhhc2lzPiBwYXR0ZXJuLCBhbmQgaXQgYWxsb3dzIGZpbmUtZ3JhaW5lZCBtYW5pcHVsYXRpb24gb2YgZGF0YQorb2JqZWN0cyB3aXRob3V0IGluY3VycmluZyB0aGUgb3ZlcmhlYWQgb2YgbXVsdGlwbGUgcmVtb3RlIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0pQQSBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGlzIHBhdHRlcm4gYnkgYXV0b21hdGljYWxseSBkZXRhY2hpbmcKK2VudGl0aWVzIHdoZW4gdGhleSBhcmUgc2VyaWFsaXplZCBvciB3aGVuIGEgcGVyc2lzdGVuY2UgY29udGV4dCBlbmRzIChzZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19lbWZhY3RvcnlfcGVyc2NvbnRleHQiLz4gZm9yIGFuIGV4cGxvcmF0aW9uIG9mCitwZXJzaXN0ZW5jZSBjb250ZXh0cykuIFRoZSBKUEEgPGVtcGhhc2lzPm1lcmdlPC9lbXBoYXNpcz4gQVBJCityZS1hdHRhY2hlcyBkZXRhY2hlZCBlbnRpdGllcy4gVGhpcyBhbGxvd3MgeW91IHRvIGRldGFjaCBhIHBlcnNpc3RlbnQgaW5zdGFuY2UsCittb2RpZnkgdGhlIGRldGFjaGVkIGluc3RhbmNlIG9mZmxpbmUsIGFuZCBtZXJnZSB0aGUgaW5zdGFuY2UgYmFjayBpbnRvIGFuCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gKGVpdGhlciB0aGUgc2FtZSBvbmUgdGhhdCBkZXRhY2hlZCB0aGUKK2luc3RhbmNlLCBvciBhIG5ldyBvbmUpLiBUaGUgY2hhbmdlcyB3aWxsIHRoZW4gYmUgYXBwbGllZCB0byB0aGUgZXhpc3RpbmcKK2luc3RhbmNlIGZyb20gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0EgZGV0YWNoZWQgZW50aXR5IG1haW50YWlucyBpdHMgcGVyc2lzdGVudCBpZGVudGl0eSwgYnV0IGNhbm5vdCBsb2FkIGFkZGl0aW9uYWwKK3N0YXRlIGZyb20gdGhlIGRhdGFzdG9yZS4gQWNjZXNzaW5nIGFueSBwZXJzaXN0ZW50IGZpZWxkIG9yIHByb3BlcnR5IHRoYXQgd2FzCitub3QgbG9hZGVkIGF0IHRoZSB0aW1lIG9mIGRldGFjaG1lbnQgaGFzIHVuZGVmaW5lZCByZXN1bHRzLiBBbHNvLCBiZSBzdXJlIG5vdCB0bworYWx0ZXIgdGhlIHZlcnNpb24gb3IgaWRlbnRpdHkgZmllbGRzIG9mIGRldGFjaGVkIGluc3RhbmNlcyBpZiB5b3UgcGxhbiBvbgorbWVyZ2luZyB0aGVtIGxhdGVyLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIDxtZXRob2RuYW1lPm1lcmdlPC9tZXRob2RuYW1lPiBtZXRob2QgcmV0dXJucyBhIG1hbmFnZWQgY29weSBvZiB0aGUgZ2l2ZW4KK2RldGFjaGVkIGVudGl0eS4gQ2hhbmdlcyBtYWRlIHRvIHRoZSBwZXJzaXN0ZW50IHN0YXRlIG9mIHRoZSBkZXRhY2hlZCBlbnRpdHkgYXJlCithcHBsaWVkIHRvIHRoaXMgbWFuYWdlZCBpbnN0YW5jZS4gQmVjYXVzZSBtZXJnaW5nIGludm9sdmVzIGNoYW5naW5nIHBlcnNpc3RlbnQKK3N0YXRlLCB5b3UgY2FuIG9ubHkgbWVyZ2Ugd2l0aGluIGEgdHJhbnNhY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitJZiB5b3UgYXR0ZW1wdCB0byBtZXJnZSBhbiBpbnN0YW5jZSB3aG9zZSByZXByZXNlbnRhdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUKK2RhdGFzdG9yZSBzaW5jZSBkZXRhY2htZW50LCB0aGUgbWVyZ2Ugb3BlcmF0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBvciB0aGUKK3RyYW5zYWN0aW9uIGluIHdoaWNoIHlvdSBwZXJmb3JtIHRoZSBtZXJnZSB3aWxsIGZhaWwgb24gY29tbWl0LCBqdXN0IGFzIGlmIGEKK25vcm1hbCBvcHRpbWlzdGljIGNvbmZsaWN0IHdlcmUgZGV0ZWN0ZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgb2ZmZXJzIGVuaGFuY2VtZW50cyB0byBKUEEgZGV0YWNobWVudCBmdW5jdGlvbmFsaXR5LAoraW5jbHVkaW5nIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBjb250cm9sIHdoaWNoIGZpZWxkcyBhcmUgZGV0YWNoZWQuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2RldGFjaCIvPiBpbiB0aGUgUmVmZXJlbmNlIEd1aWRlIGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisgICAgICAgIDxwYXJhPgorRm9yIGEgZ2l2ZW4gZW50aXR5IDxsaXRlcmFsPkE8L2xpdGVyYWw+LCB0aGUgPG1ldGhvZG5hbWU+bWVyZ2U8L21ldGhvZG5hbWU+CittZXRob2QgYmVoYXZlcyBhcyBmb2xsb3dzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiA8bGl0ZXJhbD5BPC9saXRlcmFsPiBpcyBhIGRldGFjaGVkIGVudGl0eSwgaXRzIHN0YXRlIGlzIGNvcGllZCBpbnRvIGV4aXN0aW5nCittYW5hZ2VkIGluc3RhbmNlIDxsaXRlcmFsPkEnPC9saXRlcmFsPiBvZiB0aGUgc2FtZSBlbnRpdHkgaWRlbnRpdHksIG9yIGEgbmV3CittYW5hZ2VkIGNvcHkgb2YgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgY3JlYXRlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgYSBuZXcgZW50aXR5LCBhIG5ldyBtYW5hZ2VkIGVudGl0eSA8bGl0ZXJhbD5BJworPC9saXRlcmFsPiBpcyBjcmVhdGVkIGFuZCB0aGUgc3RhdGUgb2YgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgY29waWVkIGludG8KKzxsaXRlcmFsPkEnPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gaXMgYW4gZXhpc3RpbmcgbWFuYWdlZCBlbnRpdHksIGl0IGlzIGlnbm9yZWQuIEhvd2V2ZXIsCit0aGUgbWVyZ2Ugb3BlcmF0aW9uIHN0aWxsIGNhc2NhZGVzIGFzIGRlZmluZWQgYmVsb3cuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIDxsaXRlcmFsPkE8L2xpdGVyYWw+IGlzIGEgcmVtb3ZlZCBlbnRpdHksIGFuIDxjbGFzc25hbWU+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NsYXNzbmFtZT4gaXMgdGhyb3duLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgbWVyZ2Ugb3BlcmF0aW9uIHJlY3Vyc2VzIG9uIGFsbCByZWxhdGlvbiBmaWVsZHMgb2YgPGxpdGVyYWw+QTwvbGl0ZXJhbD4KK3dob3NlIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiPmNhc2NhZGVzPC9saW5rPiBpbmNsdWRlCis8bGl0ZXJhbD5DYXNjYWRlVHlwZS5NRVJHRTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgdm9pZCBsb2NrIChPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbW9kZSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbG9jaworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KK1RoaXMgbWV0aG9kIGxvY2tzIHRoZSBnaXZlbiBlbnRpdHkgdXNpbmcgdGhlIG5hbWVkIG1vZGUuIFRoZQorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9Mb2NrbW9kZVR5cGUuaHRtbCI+Cis8Y2xhc3NuYW1lPmphdmF4LnBlcnNpc3RlbmNlLkxvY2tNb2RlVHlwZTwvY2xhc3NuYW1lPjwvdWxpbms+IGVudW0gZGVmaW5lcyB0d28KK21vZGVzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5SRUFEPC9saXRlcmFsPjogT3RoZXIgdHJhbnNhY3Rpb25zIG1heSBjb25jdXJyZW50bHkgcmVhZCB0aGUgb2JqZWN0LAorYnV0IGNhbm5vdCBjb25jdXJyZW50bHkgdXBkYXRlIGl0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5XUklURTwvbGl0ZXJhbD46IE90aGVyIHRyYW5zYWN0aW9ucyBjYW5ub3QgY29uY3VycmVudGx5IHJlYWQgb3Igd3JpdGUKK3RoZSBvYmplY3QuIFdoZW4gYSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgdGhhdCBob2xkcyBXUklURSBsb2NrcyBvbiBhbnkKK2VudGl0ZXMsIHRob3NlIGVudGl0ZXMgd2lsbCBoYXZlIHRoZWlyIHZlcnNpb24gaW5jcmVtZW50ZWQgZXZlbiBpZiB0aGUgZW50aXRpZXMKK3RoZW1zZWx2ZXMgZGlkIG5vdCBjaGFuZ2UgaW4gdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBoYXMgYWRkaXRpb25hbCBBUElzIGZvciBjb250cm9sbGluZyBvYmplY3QgbG9ja2luZy4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbG9ja2luZyIvPiBpbiB0aGUgUmVmZXJlbmNlIEd1aWRlIGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBkaWFncmFtIGlsbHVzdHJhdGVzIHRoZSBsaWZlY3ljbGUgb2YgYW4gZW50aXR5IHdpdGggcmVzcGVjdCB0byB0aGUKK0FQSXMgcHJlc2VudGVkIGluIHRoaXMgc2VjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNDQ1IHggMzM3IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9qcGEtc3RhdGUtdHJhbnNpdGlvbnMucG5nIiB3aWR0aD0iMjk3cHgiLz4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfZW1fbGlmZWV4YW1wbGVzIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgTGlmZWN5Y2xlIEV4YW1wbGVzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhlIGV4YW1wbGVzIGJlbG93IGRlbW9uc3RyYXRlIGhvdyB0byB1c2UgdGhlIGxpZmVjeWNsZSBtZXRob2RzIHByZXNlbnRlZCBpbiB0aGUKK3ByZXZpb3VzIHNlY3Rpb24uIFRoZSBleGFtcGxlcyBhcmUgYXBwcm9wcmlhdGUgZm9yIG91dC1vZi1jb250YWluZXIgdXNlLiBXaXRoaW4KK2EgY29udGFpbmVyLCA8Y2xhc3NuYW1lPiBFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBhcmUgdXN1YWxseSBpbmplY3RlZCwgYW5kCit0cmFuc2FjdGlvbnMgYXJlIHVzdWFsbHkgbWFuYWdlZC4gWW91IHdvdWxkIHRoZXJlZm9yZSBvbWl0IHRoZSA8bWV0aG9kbmFtZT4KK2NyZWF0ZUVudGl0eU1hbmFnZXI8L21ldGhvZG5hbWU+IGFuZCA8bWV0aG9kbmFtZT5jbG9zZTwvbWV0aG9kbmFtZT4gY2FsbHMsIGFzCit3ZWxsIGFzIGFsbCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBjb2RlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfZW1fbGlmZWN5Y2xlX3BlcnNpc3QiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFBlcnNpc3RpbmcgT2JqZWN0cworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgb2JqZWN0cworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0aW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBleGFtcGxlCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPHByb2dyYW1saXN0aW5nPgorLy8gY3JlYXRlIHNvbWUgb2JqZWN0cworTWFnYXppbmUgbWFnID0gbmV3IE1hZ2F6aW5lKCIxQjc4LVlVOUwiLCAiSmF2YVdvcmxkIik7CisKK0NvbXBhbnkgcHViID0gbmV3IENvbXBhbnkoIldlc3RvbiBIb3VzZSIpOworcHViLnNldFJldmVudWUoMTc1MDAwMEQpOworbWFnLnNldFB1Ymxpc2hlcihwdWIpOworcHViLmFkZE1hZ2F6aW5lKG1hZyk7CisKK0FydGljbGUgYXJ0ID0gbmV3IEFydGljbGUoIkpQQSBSdWxlcyEiLCAiVHJhbnNwYXJlbnQgT2JqZWN0IFBlcnNpc3RlbmNlIik7CithcnQuYWRkQXV0aG9yKG5ldyBBdXRob3IoIkZyZWQiLCAiSG95bGUiKSk7CittYWcuYWRkQXJ0aWNsZShhcnQpOworCisvLyBwZXJzaXN0CitFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTsKK2VtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKK2VtLnBlcnNpc3QobWFnKTsKK2VtLnBlcnNpc3QocHViKTsKK2VtLnBlcnNpc3QoYXJ0KTsKK2VtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisKKy8vIG9yIHdlIGNvdWxkIGNvbnRpbnVlIHVzaW5nIHRoZSBFbnRpdHlNYW5hZ2VyLi4uCitlbS5jbG9zZSgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X2VtX2xpZmVjeWNsZV91cGRhdGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFVwZGF0aW5nIE9iamVjdHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IG9iamVjdHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRpbmcKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8cHJvZ3JhbWxpc3Rpbmc+CitNYWdhemluZS5NYWdhemluZUlkIG1pID0gbmV3IE1hZ2F6aW5lLk1hZ2F6aW5lSWQoKTsKK21pLmlzYm4gPSAiMUI3OC1ZVTlMIjsKK21pLnRpdGxlID0gIkphdmFXb3JsZCI7CisKKy8vIHVwZGF0ZXMgc2hvdWxkIGFsd2F5cyBiZSBtYWRlIHdpdGhpbiB0cmFuc2FjdGlvbnM7IG5vdGUgdGhhdAorLy8gdGhlcmUgaXMgbm8gY29kZSBleHBsaWNpdGx5IGxpbmtpbmcgdGhlIG1hZ2F6aW5lIG9yIGNvbXBhbnkKKy8vIHdpdGggdGhlIHRyYW5zYWN0aW9uOyBKUEEgYXV0b21hdGljYWxseSB0cmFja3MgYWxsIGNoYW5nZXMKK0VudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworTWFnYXppbmUgbWFnID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWkpOworbWFnLnNldFByaWNlKDUuOTkpOworQ29tcGFueSBwdWIgPSBtYWcuZ2V0UHVibGlzaGVyKCk7CitwdWIuc2V0UmV2ZW51ZSgxNzUwMDAwRCk7CitlbS5nZXRUcmFuc2FjdGlvbigpLmNvbW1pdCgpOworCisvLyBvciB3ZSBjb3VsZCBjb250aW51ZSB1c2luZyB0aGUgRW50aXR5TWFuYWdlci4uLgorZW0uY2xvc2UoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19lbV9saWZlY3ljbGVfZGVsZXRlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBSZW1vdmluZyBPYmplY3RzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBvYmplY3RzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGRlbGV0aW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBleGFtcGxlCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPHByb2dyYW1saXN0aW5nPgorLy8gYXNzdW1lIHdlIGhhdmUgYW4gb2JqZWN0IGlkIGZvciB0aGUgY29tcGFueSB3aG9zZSBzdWJzY3JpcHRpb25zCisvLyB3ZSB3YW50IHRvIGRlbGV0ZQorT2JqZWN0IG9pZCA9IC4uLjsKKworLy8gZGVsZXRlcyBzaG91bGQgYWx3YXlzIGJlIG1hZGUgd2l0aGluIHRyYW5zYWN0aW9ucworRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CitlbS5nZXRUcmFuc2FjdGlvbigpLmJlZ2luKCk7CitDb21wYW55IHB1YiA9IChDb21wYW55KSBlbS5maW5kKENvbXBhbnkuY2xhc3MsIG9pZCk7Citmb3IgKFN1YnNjcmlwdGlvbiBzdWIgOiBwdWIuZ2V0U3Vic2NyaXB0aW9ucygpKQorICAgIGVtLnJlbW92ZShzdWIpOworcHViLmdldFN1YnNjcmlwdGlvbnMoKS5jbGVhcigpOworZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKworLy8gb3Igd2UgY291bGQgY29udGludWUgdXNpbmcgdGhlIEVudGl0eU1hbmFnZXIuLi4KK2VtLmNsb3NlKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfZW1fZGV0YWNoZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERldGFjaGluZyBhbmQgTWVyZ2luZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBhIGNvbW1vbiBjbGllbnQvc2VydmVyIHNjZW5hcmlvLiBUaGUgY2xpZW50IHJlcXVlc3RzCitvYmplY3RzIGFuZCBtYWtlcyBjaGFuZ2VzIHRvIHRoZW0sIHdoaWxlIHRoZSBzZXJ2ZXIgaGFuZGxlcyB0aGUgb2JqZWN0IGxvb2t1cHMKK2FuZCB0cmFuc2FjdGlvbnMuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvLyBDTElFTlQ6CisvLyByZXF1ZXN0cyBhbiBvYmplY3Qgd2l0aCBhIGdpdmVuIG9pZAorUmVjb3JkIGRldGFjaGVkID0gKFJlY29yZCkgZ2V0RnJvbVNlcnZlcihvaWQpOworCisuLi4KKworLy8gU0VSVkVSOgorLy8gc2VuZCBvYmplY3QgdG8gY2xpZW50OyBvYmplY3QgZGV0YWNoZXMgb24gRU0gY2xvc2UKK09iamVjdCBvaWQgPSBwcm9jZXNzQ2xpZW50UmVxdWVzdCgpOworRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CitSZWNvcmQgcmVjb3JkID0gZW0uZmluZChSZWNvcmQuY2xhc3MsIG9pZCk7CitlbS5jbG9zZSgpOworc2VuZFRvQ2xpZW50KHJlY29yZCk7CisKKy4uLgorCisvLyBDTElFTlQ6CisvLyBtYWtlcyBzb21lIG1vZGlmaWNhdGlvbnMgYW5kIHNlbmRzIGJhY2sgdG8gc2VydmVyCitkZXRhY2hlZC5zZXRTb21lRmllbGQoImJhciIpOworc2VuZFRvU2VydmVyKGRldGFjaGVkKTsKKworLi4uCisKKy8vIFNFUlZFUjoKKy8vIG1lcmdlcyB0aGUgaW5zdGFuY2UgYW5kIGNvbW1pdCB0aGUgY2hhbmdlcworUmVjb3JkIG1vZGlmaWVkID0gKFJlY29yZCkgcHJvY2Vzc0NsaWVudFJlcXVlc3QoKTsKK0VudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOworUmVjb3JkIG1lcmdlZCA9IChSZWNvcmQpIGVtLm1lcmdlKG1vZGlmaWVkKTsKK21lcmdlZC5zZXRMYXN0TW9kaWZpZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworbWVyZ2VkLnNldE1vZGlmaWVyKGdldENsaWVudElkZW50aXR5Q29kZSgpKTsKK2VtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CitlbS5jbG9zZSgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X2VtX2lkZW50aXR5Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRW50aXR5IElkZW50aXR5IE1hbmFnZW1lbnQKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CitFYWNoIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCitwZXJzaXN0ZW50IGlkZW50aXRpZXMgb2YgdGhlIG1hbmFnZWQgb2JqZWN0cyBpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dC4gVGhlCitmb2xsb3dpbmcgbWV0aG9kcyBhbGxvdyB5b3UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgbWFuYWdlbWVudCBvZiBwZXJzaXN0ZW50CitpZGVudGl0aWVzLiBUaGUgYmVoYXZpb3Igb2YgdGhlc2UgbWV0aG9kcyBpcyBkZWVwbHkgYWZmZWN0ZWQgYnkgdGhlIHBlcnNpc3RlbmNlCitjb250ZXh0IHR5cGUgb2YgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPjsgc2VlCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X3BlcnNjb250ZXh0Ii8+IGZvciBhbiBleHBsYW5hdGlvbiBvZgorcGVyc2lzdGVuY2UgY29udGV4dHMuCisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyAmbHQ7VCZndDsgVCBmaW5kKENsYXNzJmx0O1QmZ3Q7IGNscywgT2JqZWN0IG9pZCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZmluZAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGZpbmQKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICByZXRyaWV2aW5nIG9iamVjdHMgYnkgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK1RoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBlcnNpc3RlbnQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4KK3BlcnNpc3RlbnQgaWRlbnRpdHkuIElmIHRoZSBpbnN0YW5jZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGN1cnJlbnQKK3BlcnNpc3RlbmNlIGNvbnRleHQsIHRoZSBjYWNoZWQgdmVyc2lvbiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgbmV3CitpbnN0YW5jZSB3aWxsIGJlIGNvbnN0cnVjdGVkIGFuZCBsb2FkZWQgd2l0aCBzdGF0ZSBmcm9tIHRoZSBkYXRhc3RvcmUuIElmIG5vCitlbnRpdHkgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgaWRlbnRpdHkgZXhpc3RzIGluIHRoZSBkYXRhc3RvcmUsIHRoaXMgbWV0aG9kCityZXR1cm5zIG51bGwuCisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyAmbHQ7VCZndDsgVCBnZXRSZWZlcmVuY2UoQ2xhc3MmbHQ7VCZndDsgY2xzLCBPYmplY3Qgb2lkKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICByZXRyaWV2aW5nIG9iamVjdHMgYnkgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byA8bWV0aG9kbmFtZT5maW5kPC9tZXRob2RuYW1lPiwgYnV0IGRvZXMgbm90CituZWNlc3NhcmlseSBnbyB0byB0aGUgZGF0YWJhc2Ugd2hlbiB0aGUgZW50aXR5IGlzIG5vdCBmb3VuZCBpbiBjYWNoZS4gVGhlCitpbXBsZW1lbnRhdGlvbiBtYXkgY29uc3RydWN0IGEgPGVtcGhhc2lzPmhvbGxvdzwvZW1waGFzaXM+IGVudGl0eSBhbmQgcmV0dXJuIGl0Cit0byB5b3UgaW5zdGVhZC4gSG9sbG93IGVudGl0aWVzIGRvIG5vdCBoYXZlIGFueSBzdGF0ZSBsb2FkZWQuIFRoZSBzdGF0ZSBvbmx5CitnZXRzIGxvYWRlZCB3aGVuIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBhIHBlcnNpc3RlbnQgZmllbGQuIEF0IHRoYXQgdGltZSwgdGhlCitpbXBsZW1lbnRhdGlvbiBtYXkgdGhyb3cgYW4gPGNsYXNzbmFtZT5FbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbjwvY2xhc3NuYW1lPiBpZiBpdAorZGlzY292ZXJzIHRoYXQgdGhlIGVudGl0eSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YXN0b3JlLiBUaGUgaW1wbGVtZW50YXRpb24KK21heSBhbHNvIHRocm93IGFuIDxjbGFzc25hbWU+RW50aXR5Tm90Rm91bmRFeGNlcHRpb248L2NsYXNzbmFtZT4gZnJvbSB0aGUKKzxtZXRob2RuYW1lPmdldFJlZmVyZW5jZTwvbWV0aG9kbmFtZT4gbWV0aG9kIGl0c2VsZi4gVW5saWtlIDxtZXRob2RuYW1lPgorZmluZDwvbWV0aG9kbmFtZT4sIDxtZXRob2RuYW1lPmdldFJlZmVyZW5jZTwvbWV0aG9kbmFtZT4gZG9lcyBub3QgcmV0dXJuIG51bGwuCisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBlbnRpdHkpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGNvbnRhaW5zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBjb250YWlucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KK1JldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZW50aXR5IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgcGVyc2lzdGVuY2UgY29udGV4dCwgYW5kCitmYWxzZSBvdGhlcndpc2UuIFJlbW92ZWQgZW50aXRpZXMgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGN1cnJlbnQKK3BlcnNpc3RlbmNlIGNvbnRleHQuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19lbV9jYWNoZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIENhY2hlIE1hbmFnZW1lbnQKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfZW1fY2FjaGUiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjYWNoZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIHZvaWQgZmx1c2goKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBmbHVzaAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgZmx1c2gKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZmx1c2hpbmcgY2hhbmdlcyBiZWZvcmUgY29tbWl0CisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CitUaGUgPG1ldGhvZG5hbWU+Zmx1c2g8L21ldGhvZG5hbWU+IG1ldGhvZCB3cml0ZXMgYW55IGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZQoraW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gdGhlIGRhdGFzdG9yZS4gSWYgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFzdG9yZSwgaXQgb2J0YWlucyBvbmUKK2ZvciB0aGUgZmx1c2ggYW5kIHJldGFpbnMgaXQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uIEFueSBleGNlcHRpb25zCitkdXJpbmcgZmx1c2ggY2F1c2UgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIG1hcmtlZCBmb3Igcm9sbGJhY2suIFNlZQorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3RyYW5zIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorRmx1c2hpbmcgcmVxdWlyZXMgYW4gYWN0aXZlIHRyYW5zYWN0aW9uLiBJZiB0aGVyZSBpc24ndCBhIHRyYW5zYWN0aW9uIGluCitwcm9ncmVzcywgdGhlIDxtZXRob2RuYW1lPmZsdXNoPC9tZXRob2RuYW1lPiBtZXRob2QgdGhyb3dzIGEgPGNsYXNzbmFtZT4KK1RyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb248L2NsYXNzbmFtZT4uCisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBGbHVzaE1vZGVUeXBlIGdldEZsdXNoTW9kZSgpOworcHVibGljIHZvaWQgc2V0Rmx1c2hNb2RlKEZsdXNoTW9kZVR5cGUgZmx1c2hNb2RlKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBGbHVzaE1vZGUKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEZsdXNoTW9kZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK1RoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4ncyA8bGl0ZXJhbD5GbHVzaE1vZGU8L2xpdGVyYWw+IHByb3BlcnR5Citjb250cm9scyB3aGV0aGVyIHRvIGZsdXNoIHRyYW5zYWN0aW9uYWwgY2hhbmdlcyBiZWZvcmUgZXhlY3V0aW5nIHF1ZXJpZXMuIFRoaXMKK2FsbG93cyB0aGUgcXVlcnkgcmVzdWx0cyB0byB0YWtlIGludG8gYWNjb3VudCBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgZHVyaW5nIHRoZQorY3VycmVudCB0cmFuc2FjdGlvbi4gQXZhaWxhYmxlCis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS81L2RvY3MvYXBpL2phdmF4L3BlcnNpc3RlbmNlL0ZsdXNoTW9kZVR5cGUuaHRtbCI+Cis8Y2xhc3NuYW1lPmphdmF4LnBlcnNpc3RlbmNlLkZsdXNoTW9kZVR5cGU8L2NsYXNzbmFtZT48L3VsaW5rPiBjb25zdGFudHMgYXJlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DT01NSVQ8L2xpdGVyYWw+OiBPbmx5IGZsdXNoIHdoZW4gY29tbWl0dGluZywgb3Igd2hlbiB0b2xkIHRvIGRvIHNvCit0aHJvdWdoIHRoZSA8bWV0aG9kbmFtZT5mbHVzaDwvbWV0aG9kbmFtZT4gbWV0aG9kLiBRdWVyeSByZXN1bHRzIG1heSBub3QgdGFrZQoraW50byBhY2NvdW50IGNoYW5nZXMgbWFkZSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QVVUTzwvbGl0ZXJhbD46IFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBwZXJtaXR0ZWQgdG8gZmx1c2ggYmVmb3JlCitxdWVyaWVzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHRzIHJlZmxlY3QgdGhlIG1vc3QgcmVjZW50IG9iamVjdCBzdGF0ZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitZb3UgY2FuIGFsc28gc2V0IHRoZSBmbHVzaCBtb2RlIG9uIGluZGl2aWR1YWwKKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19xdWVyeSI+PGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPjwvbGluaz4KK2luc3RhbmNlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBvbmx5IGZsdXNoZXMgYmVmb3JlIGEgcXVlcnkgaWYgdGhlIHF1ZXJ5IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IGRhdGEKK2NoYW5nZWQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIEFkZGl0aW9uYWxseSwgT3BlbkpQQSBhbGxvd3MgZmluZS1ncmFpbmVkCitjb250cm9sIG92ZXIgZmx1c2hpbmcgYmVoYXZpb3IuIFNlZSB0aGUgUmVmZXJlbmNlIEd1aWRlJ3MKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX3JldGFpbiIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIHZvaWQgY2xlYXIoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjbGVhcgorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgY2xlYXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CitDbGVhcmluZyB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGVmZmVjdGl2ZWx5IGVuZHMgdGhlCitwZXJzaXN0ZW5jZSBjb250ZXh0LiBBbGwgZW50aXRpZXMgbWFuYWdlZCBieSB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyCis8L2NsYXNzbmFtZT4gYmVjb21lIGRldGFjaGVkLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfZW1fcXVlcnkiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBRdWVyeSBGYWN0b3J5CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X2VtX3F1ZXJ5Ij4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgYXMgUXVlcnkgZmFjdG9yeQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBRdWVyeQorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfZW1fcXVlcnkiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgY3JlYXRpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeShTdHJpbmcgcXVlcnkpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IG9iamVjdHMgYXJlIHVzZWQgdG8gZmluZCBlbnRpdGllcyBtYXRjaGluZyBjZXJ0YWluCitjcml0ZXJpYS4gVGhlIDxtZXRob2RuYW1lPmNyZWF0ZVF1ZXJ5PC9tZXRob2RuYW1lPiBtZXRob2QgY3JlYXRlcyBhIHF1ZXJ5IHVzaW5nCit0aGUgZ2l2ZW4gSmF2YSBQZXJzaXN0ZW5jZSBRdWVyeSBMYW5ndWFnZSAoSlBRTCkgc3RyaW5nLiBTZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19xdWVyeSIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIFF1ZXJ5IGNyZWF0ZU5hbWVkUXVlcnkoU3RyaW5nIG5hbWUpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CitUaGlzIG1ldGhvZCByZXRyaWV2ZXMgYSBxdWVyeSBkZWZpbmVkIGluIG1ldGFkYXRhIGJ5IG5hbWUuIFRoZSByZXR1cm5lZAorPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBpbmZvcm1hdGlvbgorZGVjbGFyZWQgaW4gbWV0YWRhdGEuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG5hbWVkIHF1ZXJpZXMsIHJlYWQKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19xdWVyeV9uYW1lZCIvPi4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIFF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBzcWwpOworcHVibGljIFF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBzcWwsIENsYXNzIHJlc3VsdENscyk7CitwdWJsaWMgUXVlcnkgY3JlYXRlTmF0aXZlUXVlcnkoU3RyaW5nIHNxbCwgU3RyaW5nIHJlc3VsdE1hcHBpbmcpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+TmF0aXZlPC9lbXBoYXNpcz4gcXVlcmllcyBhcmUgcXVlcmllcyBpbiB0aGUgZGF0YXN0b3JlJ3MgbmF0aXZlCitsYW5ndWFnZS4gRm9yIHJlbGF0aW9uYWwgZGF0YWJhc2VzLCB0aGlzIHRoZSBTdHJ1Y3R1cmVkIFF1ZXJ5IExhbmd1YWdlIChTUUwpLgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3NxbHF1ZXJ5Ii8+IGVsYWJvcmF0ZXMgb24gSlBBJ3MKK25hdGl2ZSBxdWVyeSBzdXBwb3J0LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfZW1fY2xvc2luZyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIENsb3NpbmcKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfZW1fY2xvc2luZyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGNsb3NpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBib29sZWFuIGlzT3BlbigpOworcHVibGljIHZvaWQgY2xvc2UoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorV2hlbiBhbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaXMgbm8gbG9uZ2VyIG5lZWRlZCwgeW91IHNob3VsZAorY2FsbCBpdHMgPG1ldGhvZG5hbWU+Y2xvc2U8L21ldGhvZG5hbWU+IG1ldGhvZC4gQ2xvc2luZyBhbiA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiByZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGl0IGlzIHVzaW5nLiBUaGUgcGVyc2lzdGVuY2UKK2NvbnRleHQgZW5kcywgYW5kIHRoZSBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPiBiZWNvbWUgZGV0YWNoZWQuIEFueSA8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IGluc3RhbmNlcyB0aGUKKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBjcmVhdGVkIGJlY29tZSBpbnZhbGlkLiBDYWxsaW5nIGFueSBtZXRob2QKK290aGVyIHRoYW4gPG1ldGhvZG5hbWU+aXNPcGVuPC9tZXRob2RuYW1lPiBvbiBhIGNsb3NlZCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPiByZXN1bHRzIGluIGFuIDxjbGFzc25hbWU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jbGFzc25hbWU+LiBZb3UKK2Nhbm5vdCBjbG9zZSBhIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiB0aGF0IGlzIGluIHRoZSBtaWRkbGUgb2YgYQordHJhbnNhY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitJZiB5b3UgYXJlIGluIGEgbWFuYWdlZCBlbnZpcm9ubWVudCB1c2luZyBpbmplY3RlZCBlbnRpdHkgbWFuYWdlcnMsIHlvdSBzaG91bGQKK25vdCBjbG9zZSB0aGVtLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X2VtZmFjdG9yeS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfZW1mYWN0b3J5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc3Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X2VtZmFjdG9yeS54bWwKQEAgLTAsMCArMSw0MTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19lbWZhY3RvcnkiPgorICAgIDx0aXRsZT4KKyAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X2VtZmFjdG9yeSI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNDE4IHggMjc0IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2VudGl0eW1hbmFnZXJmYWN0b3J5LnBuZyIgd2lkdGg9IjI3OXB4Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICA8L21lZGlhb2JqZWN0PgorICAgIDxwYXJhPgorVGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gY3JlYXRlcyA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpbnN0YW5jZXMgZm9yIGFwcGxpY2F0aW9uIHVzZS4KKyAgICA8L3BhcmE+CisgICAgPG5vdGU+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBleHRlbmRzIHRoZSBzdGFuZGFyZCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+CitpbnRlcmZhY2Ugd2l0aCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeS5odG1sIj4KKzxjbGFzc25hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+PC91bGluaz4gdG8gcHJvdmlkZSBhZGRpdGlvbmFsCitmdW5jdGlvbmFsaXR5LgorICAgICAgICA8L3BhcmE+CisgICAgPC9ub3RlPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X29idGFpbiI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE9idGFpbmluZyBhbiBFbnRpdHlNYW5hZ2VyRmFjdG9yeQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19lbWZhY3Rvcnlfb2J0YWluIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGNvbnN0cnVjdGlvbgorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgSmF2YSBDb25uZWN0b3IgQXJjaGl0ZWN0dXJlCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgIEpDQQorICAgICAgICAgICAgPC9zZWU+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgSkNBCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1dpdGhpbiBhIGNvbnRhaW5lciwgeW91IHdpbGwgdHlwaWNhbGx5IHVzZSA8ZW1waGFzaXM+aW5qZWN0aW9uPC9lbXBoYXNpcz4gdG8KK2FjY2VzcyBhbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+LiBUaGVyZSBhcmUsIGhvd2V2ZXIsCithbHRlcm5hdGl2ZSBtZWNoYW5pc21zIGZvciA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+Citjb25zdHJ1Y3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitTb21lIHZlbmRvcnMgbWF5IHN1cHBseSBwdWJsaWMgY29uc3RydWN0b3JzIGZvciB0aGVpciA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gaW1wbGVtZW50YXRpb25zLCBidXQgd2UgcmVjb21tZW5kIHVzaW5nIHRoZQorSmF2YSBDb25uZWN0b3IgQXJjaGl0ZWN0dXJlIChKQ0EpIGluIGEgbWFuYWdlZCBlbnZpcm9ubWVudCwgb3IgdGhlIDxjbGFzc25hbWU+CitQZXJzaXN0ZW5jZTwvY2xhc3NuYW1lPiBjbGFzcycgPG1ldGhvZG5hbWU+Y3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkKKzwvbWV0aG9kbmFtZT4gbWV0aG9kcyBpbiBhbiB1bm1hbmFnZWQgZW52aXJvbm1lbnQsIGFzIGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3BlcnNpc3RlbmNlIi8+LiBUaGVzZSBzdHJhdGVnaWVzIGFsbG93Cit2ZW5kb3JzIHRvIHBvb2wgZmFjdG9yaWVzLCBjdXR0aW5nIGRvd24gb24gcmVzb3VyY2UgdXRpbGl6YXRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBKTkRJCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorSlBBIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBjb25maWd1cmUgYW4gPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+LCB0aGVuIHN0b3JlIGl0IGluIGEgSmF2YSBOYW1pbmcgYW5kIERpcmVjdG9yeSAKK0ludGVyZmFjZSAoSk5ESSkgdHJlZSBmb3IgbGF0ZXIgcmV0cmlldmFsIGFuZCB1c2UuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19lbWZhY3RvcnlfZW0iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBPYnRhaW5pbmcgRW50aXR5TWFuYWdlcnMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X2VtIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgb2J0YWluaW5nCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19lbWZhY3RvcnlfZW0iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgb2J0YWluaW5nIEVudGl0eU1hbmFnZXJzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgRW50aXR5TWFuYWdlciBjcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CitwdWJsaWMgRW50aXR5TWFuYWdlciBjcmVhdGVFbnRpdHlNYW5hZ2VyKE1hcCBtYXApOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CitUaGUgdHdvIDxtZXRob2RuYW1lPmNyZWF0ZUVudGl0eU1hbmFnZXI8L21ldGhvZG5hbWU+IG1ldGhvZHMgYWJvdmUgY3JlYXRlIGEgbmV3Cis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gZWFjaCB0aW1lIHRoZXkgYXJlIGludm9rZWQuIFRoZSBvcHRpb25hbAorPGNsYXNzbmFtZT5NYXA8L2NsYXNzbmFtZT4gaXMgdXNlZCB0byB0byBzdXBwbHkgdmVuZG9yLXNwZWNpZmljIHNldHRpbmdzLiBJZiB5b3UKK2hhdmUgY29uZmlndXJlZCB5b3VyIGltcGxlbWVudGF0aW9uIGZvciBKVEEgdHJhbnNhY3Rpb25zIGFuZCBhIEpUQSB0cmFuc2FjdGlvbgoraXMgYWN0aXZlLCB0aGUgcmV0dXJuZWQgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHdpbGwgYmUgCitzeW5jaHJvbml6ZWQgd2l0aCB0aGF0IHRyYW5zYWN0aW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBzdHJpbmcga2V5cyBpbiB0aGUgbWFwIHN1cHBsaWVkIHRvIDxtZXRob2RuYW1lPgorY3JlYXRlRW50aXR5TWFuYWdlcjwvbWV0aG9kbmFtZT46CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb25Vc2VyTmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uUmV0YWluTW9kZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm9wZW5qcGEuVHJhbnNhY3Rpb25Nb2RlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+b3BlbmpwYS4mbHQ7cHJvcGVydHkmZ3Q7PC9saXRlcmFsPiwgd2hlcmUgPGVtcGhhc2lzPiZsdDtwcm9wZXJ0eSZndDsKKzwvZW1waGFzaXM+IGlzIGFueSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyLmh0bWwiPgorPGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPjwvdWxpbms+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUaGUgbGFzdCBvcHRpb24gdXNlcyByZWZsZWN0aW9uIHRvIGNvbmZpZ3VyZSBhbnkgcHJvcGVydHkgb2YgT3BlbkpQQSdzCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgdmFsdWUgc3VwcGxpZWQgaW4KK3lvdXIgbWFwLiBUaGUgZmlyc3Qgb3B0aW9ucyBjb3JyZXNwb25kIGV4YWN0bHkgdG8gdGhlIHNhbWUtbmFtZWQgT3BlbkpQQQorY29uZmlndXJhdGlvbiBrZXlzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZiIvPiBvZiB0aGUKK1JlZmVyZW5jZSBHdWlkZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X2VtZmFjdG9yeV9wZXJzY29udGV4dCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFBlcnNpc3RlbmNlIENvbnRleHQKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X3BlcnNjb250ZXh0Ij4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIGNvbnRleHQKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIGNvbnRleHQKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitBIHBlcnNpc3RlbmNlIGNvbnRleHQgaXMgYSBzZXQgb2YgZW50aXRpZXMgc3VjaCB0aGF0IGZvciBhbnkgcGVyc2lzdGVudCBpZGVudGl0eQordGhlcmUgaXMgYSB1bmlxdWUgZW50aXR5IGluc3RhbmNlLiBXaXRoaW4gYSBwZXJzaXN0ZW5jZSBjb250ZXh0LCBlbnRpdGllcyBhcmUKKzxlbXBoYXNpcz5tYW5hZ2VkPC9lbXBoYXNpcz4uIFRoZSA8Y2xhc3NuYW1lPiBFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGNvbnRyb2xzCit0aGVpciBsaWZlY3ljbGUsIGFuZCB0aGV5IGNhbiBhY2Nlc3MgZGF0YXN0b3JlIHJlc291cmNlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1doZW4gYSBwZXJzaXN0ZW5jZSBjb250ZXh0IGVuZHMsIHByZXZpb3VzbHktbWFuYWdlZCBlbnRpdGllcyBiZWNvbWUgPGVtcGhhc2lzPgorZGV0YWNoZWQ8L2VtcGhhc2lzPi4gQSBkZXRhY2hlZCBlbnRpdHkgaXMgbm8gbG9uZ2VyIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+LCBhbmQgbm8gbG9uZ2VyIGhhcyBhY2Nlc3MgdG8gZGF0YXN0b3JlCityZXNvdXJjZXMuIFdlIGRpc2N1c3MgZGV0YWNobWVudCBpcyBkZXRhaWwgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19lbV9saWZlY3ljbGUiLz4uIEZvciBub3csIGl0IGlzIHN1ZmZpY2llbnQgdG8KK2tub3cgdGhhdCBkZXRhY2htZW50IGFzIGhhcyB0d28gb2J2aW91cyBjb25zZXF1ZW5jZXM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGRldGFjaGVkIGVudGl0eSBjYW5ub3QgbG9hZCBhbnkgYWRkaXRpb25hbCBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHdpbGwgbm90IHJldHVybiB0aGUgZGV0YWNoZWQgZW50aXR5Citmcm9tIDxtZXRob2RuYW1lPmZpbmQ8L21ldGhvZG5hbWU+LCBub3Igd2lsbCBxdWVyaWVzIGluY2x1ZGUgdGhlIGRldGFjaGVkCitlbnRpdHkgaW4gdGhlaXIgcmVzdWx0cy4gSW5zdGVhZCwgPG1ldGhvZG5hbWU+ZmluZDwvbWV0aG9kbmFtZT4gbWV0aG9kCitpbnZvY2F0aW9ucyBhbmQgcXVlcnkgZXhlY3V0aW9ucyB0aGF0IHdvdWxkIG5vcm1hbGx5IGluY29ycG9yYXRlIHRoZSBkZXRhY2hlZAorZW50aXR5IHdpbGwgY3JlYXRlIGEgbmV3IG1hbmFnZWQgZW50aXR5IHdpdGggdGhlIHNhbWUgaWRlbnRpdHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgb2ZmZXJzIHNldmVyYWwgZmVhdHVyZXMgcmVsYXRlZCB0byBkZXRhY2hpbmcgZW50aXRpZXMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2RldGFjaCIvPiBpbiB0aGUgUmVmZXJlbmNlIEd1aWRlLgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2RldGFjaF9ncmFwaCIvPiBpbiBwYXJ0aWN1bGFyIGRlc2NyaWJlcyBob3cgdG8KK3VzZSB0aGUgPGxpdGVyYWw+RGV0YWNoU3RhdGU8L2xpdGVyYWw+IHNldHRpbmcgdG8gYm9vc3QgdGhlIHBlcmZvcm1hbmNlIG9mCittZXJnaW5nIGRldGFjaGVkIGVudGl0aWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisgICAgICAgIDxwYXJhPgorSW5qZWN0ZWQgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBoYXZlIHVzZSBhIDxlbXBoYXNpcz50cmFuc2FjdGlvbgorPC9lbXBoYXNpcz4sIHdoaWxlIDxjbGFzc25hbWU+IEVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zIG9idGFpbmVkIHRocm91Z2ggdGhlCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGhhdmUgYW4gPGVtcGhhc2lzPmV4dGVuZGVkCis8L2VtcGhhc2lzPiBwZXJzaXN0ZW5jZSBjb250ZXh0LiBXZSBkZXNjcmliZSB0aGVzZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGVzCitiZWxvdy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X2VtZmFjdG9yeV9wZXJzY29udGV4dF90cmFucyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24gUGVyc2lzdGVuY2UgQ29udGV4dAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVW5kZXIgdGhlIHRyYW5zYWN0aW9uIHBlcnNpc3RlbmNlIGNvbnRleHQgbW9kZWwsIGFuIDxjbGFzc25hbWU+IEVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPiBiZWdpbnMgYSBuZXcgcGVyc2lzdGVuY2UgY29udGV4dCB3aXRoIGVhY2ggdHJhbnNhY3Rpb24sIGFuZCBlbmRzCit0aGUgY29udGV4dCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzIG9yIHJvbGxzIGJhY2suIFdpdGhpbiB0aGUgdHJhbnNhY3Rpb24sCitlbnRpdGllcyB5b3UgcmV0cmlldmUgdGhyb3VnaCB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IG9yIHZpYQorPGNsYXNzbmFtZT5RdWVyaWVzPC9jbGFzc25hbWU+IGFyZSBtYW5hZ2VkIGVudGl0aWVzLiBUaGV5IGNhbiBhY2Nlc3MgZGF0YXN0b3JlCityZXNvdXJjZXMgdG8gbGF6eS1sb2FkIGFkZGl0aW9uYWwgcGVyc2lzdGVudCBzdGF0ZSBhcyBuZWVkZWQsIGFuZCBvbmx5IG9uZQorZW50aXR5IG1heSBleGlzdCBmb3IgYW55IHBlcnNpc3RlbnQgaWRlbnRpdHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcywgYWxsIGVudGl0aWVzIGxvc2UgdGhlaXIgYXNzb2NpYXRpb24gd2l0aCB0aGUKKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBhbmQgYmVjb21lIGRldGFjaGVkLiBUcmF2ZXJzaW5nIGEKK3BlcnNpc3RlbnQgZmllbGQgdGhhdCB3YXNuJ3QgYWxyZWFkeSBsb2FkZWQgbm93IGhhcyB1bmRlZmluZWQgcmVzdWx0cy4gQW5kIHVzaW5nCit0aGUgPGNsYXNzbmFtZT4gRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBvciBhIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gdG8KK3JldHJpZXZlIGFkZGl0aW9uYWwgb2JqZWN0cyBtYXkgbm93IGNyZWF0ZSBuZXcgaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUKK3BlcnNpc3RlbnQgaWRlbnRpdGllcyBhcyBkZXRhY2hlZCBpbnN0YW5jZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdSB1c2UgYW4gPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHdpdGggYSB0cmFuc2FjdGlvbgorcGVyc2lzdGVuY2UgY29udGV4dCBtb2RlbCBvdXRzaWRlIG9mIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiwgZWFjaCBtZXRob2QKK2ludm9jYXRpb24gY3JlYXRlcyBhIG5ldyBwZXJzaXN0ZW5jZSBjb250ZXh0LCBwZXJmb3JtcyB0aGUgbWV0aG9kIGFjdGlvbiwgYW5kCitlbmRzIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdXNpbmcgdGhlIDxtZXRob2RuYW1lPgorRW50aXR5TWFuYWdlci5maW5kPC9tZXRob2RuYW1lPiBtZXRob2Qgb3V0c2lkZSBvZiBhIHRyYW5zYWN0aW9uLiBUaGUgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgcGVyc2lzdGVuY2UgY29udGV4dCwgcGVyZm9ybQordGhlIGZpbmQgb3BlcmF0aW9uLCBlbmQgdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQsIGFuZCByZXR1cm4gdGhlIGRldGFjaGVkIHJlc3VsdAorb2JqZWN0IHRvIHlvdS4gQSBzZWNvbmQgY2FsbCB3aXRoIHRoZSBzYW1lIGlkIHdpbGwgcmV0dXJuIGEgc2Vjb25kIGRldGFjaGVkCitvYmplY3QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gdGhlIG5leHQgdHJhbnNhY3Rpb24gYmVnaW5zLCB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHdpbGwKK2JlZ2luIGEgbmV3IHBlcnNpc3RlbmNlIGNvbnRleHQsIGFuZCB3aWxsIGFnYWluIHN0YXJ0IHJldHVybmluZyBtYW5hZ2VkCitlbnRpdGllcy4gQXMgeW91J2xsIHNlZSBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfZW0iLz4sIHlvdSBjYW4KK2Fsc28gbWVyZ2UgdGhlIHByZXZpb3VzbHktZGV0YWNoZWQgZW50aXRlcyBiYWNrIGludG8gdGhlIG5ldyBwZXJzaXN0ZW5jZQorY29udGV4dC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X3BlcnNjb250ZXh0X3RyYW5zZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3Igb2YgVHJhbnNhY3Rpb24gUGVyc2lzdGVuY2UgQ29udGV4dAorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZm9sbG93aW5nIGNvZGUgaWxsdXN0cmF0ZXMgdGhlIGJlaGF2aW9yIG9mIGVudGl0ZXMgdW5kZXIgYW4gPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gdXNpbmcgYSB0cmFuc2FjdGlvbiBwZXJzaXN0ZW5jZSBjb250ZXh0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0VudGl0eU1hbmFnZXIgZW07IC8vIGluamVjdGVkCisuLi4KKworLy8gb3V0c2lkZSBhIHRyYW5zYWN0aW9uOgorCisvLyBlYWNoIG9wZXJhdGlvbiBvY2N1cnMgaW4gYSBzZXBhcmF0ZSBwZXJzaXN0ZW5jZSBjb250ZXh0LCBhbmQgcmV0dXJucyAKKy8vIGEgbmV3IGRldGFjaGVkIGluc3RhbmNlCitNYWdhemluZSBtYWcxID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWFnSWQpOworTWFnYXppbmUgbWFnMiA9IGVtLmZpbmQoTWFnYXppbmUuY2xhc3MsIG1hZ0lkKTsKK2Fzc2VydFRydWUobWFnMiAhPSBtYWcxKTsKKy4uLgorCisvLyB0cmFuc2FjdGlvbiBiZWdpbnM6CisKKy8vIHdpdGhpbiBhIHRyYW5zYWN0aW9uLCBhIHN1YnNlcXVlbnQgbG9va3VwIGRvZXNuJ3QgcmV0dXJuIGFueSBvZiB0aGUKKy8vIGRldGFjaGVkIG9iamVjdHMuICBob3dldmVyLCB0d28gbG9va3VwcyB3aXRoaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24KKy8vIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSwgYmVjYXVzZSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCBzcGFucyB0aGUKKy8vIHRyYW5zYWN0aW9uCitNYWdhemluZSBtYWczID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWFnSWQpOworYXNzZXJ0VHJ1ZShtYWczICE9IG1hZzEgJmFtcDsmYW1wOyBtYWczICE9IG1hZzIpOworTWFnYXppbmUgbWFnNCA9IGVtLmZpbmQoTWFnYXppbmUuY2xhc3MgKG1hZ0lkKTsKK2Fzc2VydFRydWUobWFnNCA9PSBtYWczKTsKKy4uLgorCisvLyB0cmFuc2FjdGlvbiBjb21taXRzOgorCisvLyBvbmNlIGFnYWluLCBlYWNoIG9wZXJhdGlvbiByZXR1cm5zIGEgbmV3IGluc3RhbmNlCitNYWdhemluZSBtYWc1ID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWFnSWQpOworYXNzZXJ0VHJ1ZShtYWc1ICE9IG1hZzMpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X2VtZmFjdG9yeV9wZXJzY29udGV4dF9leHRlbmQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4dGVuZGVkIFBlcnNpc3RlbmNlIENvbnRleHQKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0FuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiB1c2luZyBhbiBleHRlbmRlZCBwZXJzaXN0ZW5jZSBjb250ZXh0CittYWludGFpbnMgdGhlIHNhbWUgcGVyc2lzdGVuY2UgY29udGV4dCBmb3IgaXRzIGVudGlyZSBsaWZlY3ljbGUuIFdoZXRoZXIgaW5zaWRlCithIHRyYW5zYWN0aW9uIG9yIG5vdCwgYWxsIGVudGl0aWVzIHJldHVybmVkIGZyb20gdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+IGFyZSBtYW5hZ2VkLCBhbmQgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBuZXZlcgorY3JlYXRlcyB0d28gZW50aXR5IGluc3RhbmNlcyB0byByZXByZXNlbnQgdGhlIHNhbWUgcGVyc2lzdGVudCBpZGVudGl0eS4gRW50aXRpZXMKK29ubHkgYmVjb21lIGRldGFjaGVkIHdoZW4geW91IGZpbmFsbHkgY2xvc2UgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+IChvciB3aGVuIHRoZXkgYXJlIHNlcmlhbGl6ZWQpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19lbWZhY3RvcnlfcGVyc2NvbnRleHRfZXh0ZW5kZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3Igb2YgRXh0ZW5kZWQgUGVyc2lzdGVuY2UgQ29udGV4dAorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZm9sbG93aW5nIGNvZGUgaWxsdXN0cmF0ZXMgdGhlIGJlaGF2aW9yIG9mIGVudGl0ZXMgdW5kZXIgYW4gPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gdXNpbmcgYW4gZXh0ZW5kZWQgcGVyc2lzdGVuY2UgY29udGV4dC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYgPSAuLi4KK0VudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworCisvLyBwZXJzaXN0ZW5jZSBjb250ZXh0IGFjdGl2ZSBmb3IgZW50aXJlIGxpZmUgb2YgRU0sIHNvIG9ubHkgb25lIGVudGl0eQorLy8gZm9yIGEgZ2l2ZW4gcGVyc2lzdGVudCBpZGVudGl0eQorTWFnYXppbmUgbWFnMSA9IGVtLmZpbmQoTWFnYXppbmUuY2xhc3MsIG1hZ0lkKTsKK01hZ2F6aW5lIG1hZzIgPSBlbS5maW5kKE1hZ2F6aW5lLmNsYXNzLCBtYWdJZCk7Cithc3NlcnRUcnVlKG1hZzIgPT0gbWFnMSk7CisKK2VtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKworLy8gc2FtZSBwZXJzaXN0ZW5jZSBjb250ZXh0IGFjdGl2ZSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uCitNYWdhemluZSBtYWczID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWFnSWQpOworYXNzZXJ0VHJ1ZShtYWczID09IG1hZzEpOworTWFnYXppbmUgbWFnNCA9IGVtLmZpbmQoTWFnYXppbmUuY2xhc3MgKG1hZ0lkKTsKK2Fzc2VydFRydWUobWFnNCA9PSBtYWcxKTsKKworZW0uZ2V0VHJhbnNhY3Rpb24uY29tbWl0ICgpOworCisvLyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLCBpbnN0YW5jZSBzdGlsbCBtYW5hZ2VkCitNYWdhemluZSBtYWc1ID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWFnSWQpOworYXNzZXJ0VHJ1ZShtYWc1ID09IG1hZzEpOworCisvLyBpbnN0YW5jZSBmaW5hbGx5IGJlY29tZXMgZGV0YWNoZWQgd2hlbiBFTSBjbG9zZXMKK2VtLmNsb3NlKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X2Nsb3NlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgQ2xvc2luZyB0aGUgRW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X2Nsb3NlIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGNsb3NpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBib29sZWFuIGlzT3BlbiAoKTsKK3B1YmxpYyB2b2lkIGNsb3NlICgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGluc3RhbmNlcyBhcmUgaGVhdnl3ZWlnaHQgb2JqZWN0cy4KK0VhY2ggZmFjdG9yeSBtaWdodCBtYWludGFpbiBhIG1ldGFkYXRhIGNhY2hlLCBvYmplY3Qgc3RhdGUgY2FjaGUsIDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHBvb2wsIGNvbm5lY3Rpb24gcG9vbCwgYW5kIG1vcmUuIElmIHlvdXIgYXBwbGljYXRpb24KK25vIGxvbmdlciBuZWVkcyBhbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+LCB5b3Ugc2hvdWxkCitjbG9zZSBpdCB0byBmcmVlIHRoZXNlIHJlc291cmNlcy4gV2hlbiBhbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5Cis8L2NsYXNzbmFtZT4gY2xvc2VzLCBhbGwgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBmcm9tIHRoYXQKK2ZhY3RvcnksIGFuZCBieSBleHRlbnNpb24gYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhvc2UgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gcywgYmVjb21lIGludmFsaWQuIEF0dGVtcHRpbmcgdG8gY2xvc2UgYW4gPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IHdoaWxlIG9uZSBvciBtb3JlIG9mIGl0cyA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPnMgaGFzIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiBtYXkgcmVzdWx0IGluIGFuCis8Y2xhc3NuYW1lPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY2xhc3NuYW1lPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0Nsb3NpbmcgYW4gPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY2xhc3NuYW1lPiBzaG91bGQgbm90IGJlIHRha2VuCitsaWdodGx5LiBJdCBpcyBtdWNoIGJldHRlciB0byBrZWVwIGEgZmFjdG9yeSBvcGVuIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgdGhhbgordG8gcmVwZWF0ZWRseSBjcmVhdGUgYW5kIGNsb3NlIG5ldyBmYWN0b3JpZXMuIFRodXMsIG1vc3QgYXBwbGljYXRpb25zIHdpbGwgbmV2ZXIKK2Nsb3NlIHRoZSBmYWN0b3J5LCBvciBvbmx5IGNsb3NlIGl0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGV4aXRpbmcuIE9ubHkKK2FwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgbXVsdGlwbGUgZmFjdG9yaWVzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGhhdmUKK2FuIG9idmlvdXMgcmVhc29uIHRvIGNyZWF0ZSBhbmQgY2xvc2UgbXVsdGlwbGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeQorPC9jbGFzc25hbWU+IGluc3RhbmNlcy4gT25jZSBhIGZhY3RvcnkgaXMgY2xvc2VkLCBhbGwgbWV0aG9kcyBleGNlcHQKKzxtZXRob2RuYW1lPmlzT3BlbjwvbWV0aG9kbmFtZT4gdGhyb3cgYW4gPGNsYXNzbmFtZT4KK0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY2xhc3NuYW1lPi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19pbnRyby54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfaW50cm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NmZjZGMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfaW50cm8ueG1sCkBAIC0wLDAgKzEsOTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19pbnRybyI+CisgICAgPHRpdGxlPgorICAgICAgICBJbnRyb2R1Y3Rpb24KKyAgICA8L3RpdGxlPgorICAgIDxwYXJhPgorICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgRUpCMyBQZXJzaXN0ZW5jZQorICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWU+CisgICAgICAgICAgICBKUEEKKyAgICAgICAgPC9zZWU+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBKUEEKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorVGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGlzIGEgc3BlY2lmaWNhdGlvbiBmcm9tCitTdW4gTWljcm9zeXN0ZW1zIGZvciB0aGUgcGVyc2lzdGVuY2Ugb2YgSmF2YSBvYmplY3RzIHRvIGFueSByZWxhdGlvbmFsCitkYXRhc3RvcmUuIEpQQSByZXF1aXJlcyBKMlNFIDEuNSAoYWxzbyByZWZlcnJlZCB0byBhcyAiSmF2YSA1Iikgb3IKK2hpZ2hlciwgYXMgaXQgbWFrZXMgaGVhdnkgdXNlIG9mIG5ldyBKYXZhIGxhbmd1YWdlIGZlYXR1cmVzIHN1Y2ggYXMgYW5ub3RhdGlvbnMKK2FuZCBnZW5lcmljcy4gVGhpcyBkb2N1bWVudCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBKUEEuIFVubGVzcworb3RoZXJ3aXNlIG5vdGVkLCB0aGUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGFwcGxpZXMgdG8gYWxsIEpQQSBpbXBsZW1lbnRhdGlvbnMuCisgICAgPC9wYXJhPgorICAgIDxub3RlPgorICAgICAgICA8cGFyYT4KK0ZvciBjb3ZlcmFnZSBvZiBPcGVuSlBBJ3MgbWFueSBleHRlbnNpb25zIHRvIHRoZSBKUEEgc3BlY2lmaWNhdGlvbiwKK3NlZSB0aGUgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2ludHJvIj5SZWZlcmVuY2UgR3VpZGU8L2xpbms+LgorICAgICAgICA8L3BhcmE+CisgICAgPC9ub3RlPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfaW50cm9fYXVkaWVuY2UiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBJbnRlbmRlZCBBdWRpZW5jZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8cGFyYT4KK1RoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gbGVhcm4gYWJvdXQgSlBBCitpbiBvcmRlciB0byB1c2UgaXQgaW4gdGhlaXIgYXBwbGljYXRpb25zLiBJdCBhc3N1bWVzIHRoYXQgeW91IGhhdmUgYSBzdHJvbmcKK2tub3dsZWRnZSBvZiBvYmplY3Qtb3JpZW50ZWQgY29uY2VwdHMgYW5kIEphdmEsIGluY2x1ZGluZyBKYXZhIDUgYW5ub3RhdGlvbnMgYW5kCitnZW5lcmljcy4gSXQgYWxzbyBhc3N1bWVzIHNvbWUgZXhwZXJpZW5jZSB3aXRoIHJlbGF0aW9uYWwgZGF0YWJhc2VzIGFuZCB0aGUKK1N0cnVjdHVyZWQgUXVlcnkgTGFuZ3VhZ2UgKFNRTCkuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19pbnRyb190cmFuc3BlcnMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBMaWdodHdlaWdodCBQZXJzaXN0ZW5jZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19pbnRyb190cmFuc3BlcnMiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbGlnaHR3ZWlnaHQgcGVyc2lzdGVuY2UKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorPGVtcGhhc2lzPlBlcnNpc3RlbnQgZGF0YTwvZW1waGFzaXM+IGlzIGluZm9ybWF0aW9uIHRoYXQgY2FuIG91dGxpdmUgdGhlIHByb2dyYW0KK3RoYXQgY3JlYXRlcyBpdC4gVGhlIG1ham9yaXR5IG9mIGNvbXBsZXggcHJvZ3JhbXMgdXNlIHBlcnNpc3RlbnQgZGF0YTogR1VJCithcHBsaWNhdGlvbnMgbmVlZCB0byBzdG9yZSB1c2VyIHByZWZlcmVuY2VzIGFjcm9zcyBwcm9ncmFtIGludm9jYXRpb25zLCB3ZWIKK2FwcGxpY2F0aW9ucyB0cmFjayB1c2VyIG1vdmVtZW50cyBhbmQgb3JkZXJzIG92ZXIgbG9uZyBwZXJpb2RzIG9mIHRpbWUsIGV0Yy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5MaWdodHdlaWdodCBwZXJzaXN0ZW5jZTwvZW1waGFzaXM+IGlzIHRoZSBzdG9yYWdlIGFuZCByZXRyaWV2YWwgb2YKK3BlcnNpc3RlbnQgZGF0YSB3aXRoIGxpdHRsZSBvciBubyB3b3JrIGZyb20geW91LCB0aGUgZGV2ZWxvcGVyLiBGb3IgZXhhbXBsZSwKK0phdmEgc2VyaWFsaXphdGlvbgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK2lzIGEgZm9ybSBvZiBsaWdodHdlaWdodCBwZXJzaXN0ZW5jZSBiZWNhdXNlIGl0IGNhbiBiZSB1c2VkIHRvIHBlcnNpc3QgSmF2YQorb2JqZWN0cyBkaXJlY3RseSB0byBhIGZpbGUgd2l0aCB2ZXJ5IGxpdHRsZSBlZmZvcnQuIFNlcmlhbGl6YXRpb24ncyBjYXBhYmlsaXRpZXMKK2FzIGEgbGlnaHR3ZWlnaHQgcGVyc2lzdGVuY2UgbWVjaGFuaXNtIHBhbGUgaW4gY29tcGFyaXNvbiB0byB0aG9zZSBwcm92aWRlZCBieQorSlBBLCBob3dldmVyLiBUaGUgbmV4dCBjaGFwdGVyIGNvbXBhcmVzIEpQQSB0byBzZXJpYWxpemF0aW9uIGFuZCBvdGhlciBhdmFpbGFibGUKK3BlcnNpc3RlbmNlIG1lY2hhbmlzbXMuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfbWFwcGluZy54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfbWFwcGluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ODliMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19tYXBwaW5nLnhtbApAQCAtMCwwICsxLDQ4MjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nIj4KKyAgICA8dGl0bGU+CisgICAgICAgIE1hcHBpbmcgTWV0YWRhdGEKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmciPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgZW50aXRpZXMKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgbWFwcGluZyB0byBkYXRhYmFzZQorICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPHNlZT4KKyAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgPC9zZWU+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8c2VlPgorICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICA8L3NlZT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8aW5kZXh0ZXJtPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIE9STQorICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICA8L3NlZWFsc28+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgSlBBCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcKKyAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICA8L3NlZWFsc28+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHBhcmE+Cis8ZW1waGFzaXM+T2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZzwvZW1waGFzaXM+IGlzIHRoZSBwcm9jZXNzIG9mIG1hcHBpbmcKK2VudGl0aWVzIHRvIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLiBJbiBKUEEsIHlvdSBwZXJmb3JtCitvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIHRocm91Z2ggPGVtcGhhc2lzPm1hcHBpbmcgbWV0YWRhdGE8L2VtcGhhc2lzPi4KK01hcHBpbmcgbWV0YWRhdGEgdXNlcyBhbm5vdGF0aW9ucyB0byBkZXNjcmliZSBob3cgdG8gbGluayB5b3VyIG9iamVjdCBtb2RlbCB0bworeW91ciByZWxhdGlvbmFsIG1vZGVsLgorICAgIDwvcGFyYT4KKyAgICA8bm90ZT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBIG9mZmVycyB0b29scyB0byBhdXRvbWF0ZSBtYXBwaW5nIGFuZCBzY2hlbWEgY3JlYXRpb24uIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmciLz4gaW4gdGhlIFJlZmVyZW5jZSBHdWlkZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvbm90ZT4KKyAgICA8cGFyYT4KK1Rocm91Z2hvdXQgdGhpcyBjaGFwdGVyLCB3ZSB3aWxsIGRyYXcgb24gdGhlIG9iamVjdCBtb2RlbCBpbnRyb2R1Y2VkIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YSIvPi4gV2UgcHJlc2VudCB0aGF0IG1vZGVsIGFnYWluIGJlbG93LgorQXMgd2UgZGlzY3VzcyB2YXJpb3VzIGFzcGVjdHMgb2YgbWFwcGluZyBtZXRhZGF0YSwgd2Ugd2lsbCB6b29tIGluIG9uIHNwZWNpZmljCithcmVhcyBvZiB0aGUgbW9kZWwgYW5kIHNob3cgaG93IHdlIG1hcCB0aGUgb2JqZWN0IGxheWVyIHRvIHRoZSByZWxhdGlvbmFsIGxheWVyLgorICAgIDwvcGFyYT4KKyAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDU1MyB4IDU4MCAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9qcGEtbWV0YS1tb2RlbC5wbmciIHdpZHRoPSIzNjlweCIvPgorICAgICAgICAgICAgCisgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgPC9tZWRpYW9iamVjdD4KKyAgICA8cGFyYT4KK0FsbCBtYXBwaW5nIG1ldGFkYXRhIGlzIG9wdGlvbmFsLiBXaGVyZSBubyBleHBsaWNpdCBtYXBwaW5nIG1ldGFkYXRhIGlzIGdpdmVuLAorSlBBIHVzZXMgdGhlIGRlZmF1bHRzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmljYXRpb24uIEFzIHdlIHByZXNlbnQKK2VhY2ggbWFwcGluZyB0aHJvdWdob3V0IHRoaXMgY2hhcHRlciwgd2UgYWxzbyBkZXNjcmliZSB0aGUgZGVmYXVsdHMgdGhhdCBhcHBseQord2hlbiB0aGUgbWFwcGluZyBpcyBhYnNlbnQuCisgICAgPC9wYXJhPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ190YWJsZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFRhYmxlCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfdGFibGUiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjbGFzcworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgdGFibGUgYXR0cmlidXRlCisgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5UYWJsZTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIHNwZWNpZmllcyB0aGUgdGFibGUgZm9yIGFuIGVudGl0eQorY2xhc3MuIElmIHlvdSBvbWl0IHRoZSA8Y2xhc3NuYW1lPlRhYmxlPC9jbGFzc25hbWU+IGFubm90YXRpb24sIGJhc2UgZW50aXR5CitjbGFzc2VzIGRlZmF1bHQgdG8gYSB0YWJsZSB3aXRoIHRoZWlyIHVucXVhbGlmaWVkIGNsYXNzIG5hbWUuIFRoZSBkZWZhdWx0IHRhYmxlCitvZiBhbiBlbnRpdHkgc3ViY2xhc3MgZGVwZW5kcyBvbiB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3ksIGFzIHlvdSB3aWxsIHNlZSBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXIiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPlRhYmxlPC9jbGFzc25hbWU+cyBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgdGFibGUuIERlZmF1bHRzIHRvIHRoZQordW5xdWFsaWZpZWQgZW50aXR5IGNsYXNzIG5hbWUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBzY2hlbWE8L2xpdGVyYWw+OiBUaGUgdGFibGUncyBzY2hlbWEuIElmIHlvdSBkbyBub3QgbmFtZSBhCitzY2hlbWEsIEpQQSB1c2VzIHRoZSBkZWZhdWx0IHNjaGVtYSBmb3IgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBjYXRhbG9nPC9saXRlcmFsPjogVGhlIHRhYmxlJ3MgY2F0YWxvZy4gSWYgeW91IGRvIG5vdCBuYW1lIGEKK2NhdGFsb2csIEpQQSB1c2VzIHRoZSBkZWZhdWx0IGNhdGFsb2cgZm9yIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5VbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHM8L2xpdGVyYWw+OiBBbiBhcnJheSBvZiB1bmlxdWUKK2NvbnN0cmFpbnRzIHRvIHBsYWNlIG9uIHRoZSB0YWJsZS4gV2UgY292ZXIgdW5pcXVlIGNvbnN0cmFpbnRzIGJlbG93LiBEZWZhdWx0cwordG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIGVxdWl2YWxlbnQgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+dGFibGU8L2xpdGVyYWw+LiBJdCBoYXMgdGhlIGZvbGxvd2luZworYXR0cmlidXRlcywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgYW5ub3RhdGlvbiBwcm9wZXJ0aWVzIGFib3ZlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5uYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5zY2hlbWE8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmNhdGFsb2c8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPiBlbGVtZW50IGFsc28gYWNjZXB0cyBuZXN0ZWQgPGxpdGVyYWw+Cit1bmlxdWUtY29uc3RyYWludDwvbGl0ZXJhbD4gZWxlbWVudHMgcmVwcmVzZW50aW5nIHVuaXF1ZSBjb25zdHJhaW50cy4gV2Ugd2lsbAorZGV0YWlsIHVuaXF1ZSBjb25zdHJhaW50cyBzaG9ydGx5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorU29tZXRpbWVzLCBzb21lIG9mIHRoZSBmaWVsZHMgaW4gYSBjbGFzcyBhcmUgbWFwcGVkIHRvIHNlY29uZGFyeSB0YWJsZXMuIEluIHRoYXQKK2Nhc2UsIHVzZSB0aGUgY2xhc3MnIDxjbGFzc25hbWU+VGFibGU8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiB0byBuYW1lIHdoYXQgeW91Citjb25zaWRlciB0aGUgY2xhc3MnIHByaW1hcnkgdGFibGUuIExhdGVyLCB3ZSB3aWxsIHNlZSBob3cgdG8gbWFwIGNlcnRhaW4gZmllbGRzCit0byBvdGhlciB0YWJsZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitUaGUgZXhhbXBsZSBiZWxvdyBtYXBzIGNsYXNzZXMgdG8gdGFibGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGRpYWdyYW0uIFRoZQorPGxpdGVyYWw+Q09OVFJBQ1Q8L2xpdGVyYWw+LCA8bGl0ZXJhbD5TVUI8L2xpdGVyYWw+LCBhbmQgPGxpdGVyYWw+TElORV9JVEVNCis8L2xpdGVyYWw+IHRhYmxlcyBhcmUgaW4gdGhlIDxsaXRlcmFsPkNOVFJDVDwvbGl0ZXJhbD4gc2NoZW1hOyBhbGwgb3RoZXIgdGFibGVzCithcmUgaW4gdGhlIGRlZmF1bHQgc2NoZW1hLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA1MTMgeCA0MTAgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL21hcHBpbmctdGFibGVzLnBuZyIgd2lkdGg9IjM0MXB4Ii8+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICA8cGFyYT4KK05vdGUgdGhhdCB0aGUgZGlhZ3JhbSBkb2VzIG5vdCBpbmNsdWRlIG91ciBtb2RlbCdzIDxjbGFzc25hbWU+RG9jdW1lbnQKKzwvY2xhc3NuYW1lPiBhbmQgPGNsYXNzbmFtZT5BZGRyZXNzPC9jbGFzc25hbWU+IGNsYXNzZXMuIE1hcHBlZCBzdXBlcmNsYXNzZXMgYW5kCitlbWJlZGRhYmxlIGNsYXNzZXMgYXJlIG5ldmVyIG1hcHBlZCB0byB0YWJsZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2NsYXNzZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE1hcHBpbmcgQ2xhc3NlcworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3BhY2thZ2Ugb3JnLm1hZzsKKworQEVudGl0eQorQElkQ2xhc3MoTWFnYXppbmUuTWFnYXppbmVJZC5jbGFzcykKK0BUYWJsZShuYW1lPSJNQUciKQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKyAgICAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFnYXppbmVJZCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFSVCIpCitwdWJsaWMgY2xhc3MgQXJ0aWNsZSB7CisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnB1YjsKKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkNPTVAiKQorcHVibGljIGNsYXNzIENvbXBhbnkgeworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iQVVUSCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yIHsKKyAgICAuLi4KK30KKworQEVtYmVkZGFibGUKK3B1YmxpYyBjbGFzcyBBZGRyZXNzIHsKKyAgICAuLi4KK30KKworCitwYWNrYWdlIG9yZy5tYWcuc3Vic2NyaWJlOworCitATWFwcGVkU3VwZXJjbGFzcworcHVibGljIGFic3RyYWN0IGNsYXNzIERvY3VtZW50IHsKKyAgICAuLi4KK30KKworQEVudGl0eQorQFRhYmxlKHNjaGVtYT0iQ05UUkNUIikKK3B1YmxpYyBjbGFzcyBDb250cmFjdAorICAgIGV4dGVuZHMgRG9jdW1lbnQgeworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iU1VCIiwgc2NoZW1hPSJDTlRSQ1QiKQorcHVibGljIGNsYXNzIFN1YnNjcmlwdGlvbiB7CisgICAgLi4uCisKKyAgICBARW50aXR5CisgICAgQFRhYmxlKG5hbWU9IkxJTkVfSVRFTSIsIHNjaGVtYT0iQ05UUkNUIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbmVJdGVtCisgICAgICAgIGV4dGVuZHMgQ29udHJhY3QgeworICAgICAgICAuLi4KKyAgICB9Cit9CisKK0BFbnRpdHkobmFtZT0iTGlmZXRpbWUiKQorcHVibGljIGNsYXNzIExpZmV0aW1lU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorCitARW50aXR5KG5hbWU9IlRyaWFsIikKK3B1YmxpYyBjbGFzcyBUcmlhbFN1YnNjcmlwdGlvbgorICAgIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBzYW1lIG1hcHBpbmcgaW5mb3JtYXRpb24gZXhwcmVzc2VkIGluIFhNTDoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0gb3JtXzFfMC54c2QiCisgICAgdmVyc2lvbj0iMS4wIiZndDsKKyAgICAmbHQ7bWFwcGVkLXN1cGVyY2xhc3MgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLkRvY3VtZW50IiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9tYXBwZWQtc3VwZXJjbGFzcyZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLk1hZ2F6aW5lIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9Ik1BRyIvJmd0OworICAgICAgICAmbHQ7aWQtY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUuTWFnYXppbmVJZCIvJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLkFydGljbGUiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVJUIi8mZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcucHViLkNvbXBhbnkiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQ09NUCIvJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnB1Yi5BdXRob3IiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVVUSCIvJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLkNvbnRyYWN0IiZndDsKKyAgICAgICAgJmx0O3RhYmxlIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3ViY3JpYmUuU3Vic2NyaXB0aW9uIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IlNVQiIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuU3Vic2NyaXB0aW9uLkxpbmVJdGVtIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkxJTkVfSVRFTSIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGlmZXRpbWVTdWJzY3JpcHRpb24iIG5hbWU9IkxpZmV0aW1lIiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuVHJpYWxTdWJzY3JpcHRpb24iIG5hbWU9IlRyaWFsIiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VtYmVkZGFibGUgY2xhc3M9Im9yZy5tYWcucHViLkFkZHJlc3MiJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VtYmVkZGFibGUmZ3Q7CismbHQ7L2VudGl0eS1tYXBwaW5ncyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX3VucSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFVuaXF1ZSBDb25zdHJhaW50cworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX3VucSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHVuaXF1ZSBjb25zdHJhaW50cworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICB1bmlxdWUgY29uc3RyYWludHMKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfdW5xIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHVuaXF1ZSBjb25zdHJhaW50cworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitVbmlxdWUgY29uc3RyYWludHMgZW5zdXJlIHRoYXQgdGhlIGRhdGEgaW4gYSBjb2x1bW4gb3IgY29tYmluYXRpb24gb2YgY29sdW1ucyBpcwordW5pcXVlIGZvciBlYWNoIHJvdy4gQSB0YWJsZSdzIHByaW1hcnkga2V5LCBmb3IgZXhhbXBsZSwgZnVuY3Rpb25zIGFzIGFuCitpbXBsaWNpdCB1bmlxdWUgY29uc3RyYWludC4gSW4gSlBBLCB5b3UgcmVwcmVzZW50IG90aGVyIHVuaXF1ZQorY29uc3RyYWludHMgd2l0aCBhbiBhcnJheSBvZiA8Y2xhc3NuYW1lPiBVbmlxdWVDb25zdHJhaW50PC9jbGFzc25hbWU+Cithbm5vdGF0aW9ucyB3aXRoaW4gdGhlIHRhYmxlIGFubm90YXRpb24uIFRoZSB1bmlxdWUgY29uc3RyYWludHMgeW91IGRlZmluZSBhcmUKK3VzZWQgZHVyaW5nIHRhYmxlIGNyZWF0aW9uIHRvIGdlbmVyYXRlIHRoZSBwcm9wZXIgZGF0YWJhc2UgY29uc3RyYWludHMsIGFuZCBtYXkKK2Fsc28gYmUgdXNlZCBhdCBydW50aW1lIHRvIG9yZGVyIDxsaXRlcmFsPklOU0VSVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlVQREFURQorPC9saXRlcmFsPiwgYW5kIDxsaXRlcmFsPkRFTEVURTwvbGl0ZXJhbD4gc3RhdGVtZW50cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUKK2lzIGEgdW5pcXVlIGNvbnN0cmFpbnQgb24gdGhlIGNvbHVtbnMgb2YgZmllbGQgPGxpdGVyYWw+RjwvbGl0ZXJhbD4uIEluIHRoZQorc2FtZSB0cmFuc2FjdGlvbiwgeW91IHJlbW92ZSBhbiBvYmplY3QgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gYW5kIHBlcnNpc3QgYSBuZXcKK29iamVjdCA8bGl0ZXJhbD5CPC9saXRlcmFsPiwgYm90aCB3aXRoIHRoZSBzYW1lIDxsaXRlcmFsPkY8L2xpdGVyYWw+IHZhbHVlLiBUaGUKK0pQQSBydW50aW1lIG11c3QgZW5zdXJlIHRoYXQgdGhlIFNRTCBkZWxldGluZyA8bGl0ZXJhbD5BPC9saXRlcmFsPgoraXMgc2VudCB0byB0aGUgZGF0YWJhc2UgYmVmb3JlIHRoZSBTUUwgaW5zZXJ0aW5nIDxsaXRlcmFsPkI8L2xpdGVyYWw+IHRvIGF2b2lkIGEKK3VuaXF1ZSBjb25zdHJhaW50IHZpb2xhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+VW5pcXVlQ29uc3RyYWludDwvY2xhc3NuYW1lPiBoYXMgYSBzaW5nbGUgcHJvcGVydHk6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZ1tdIGNvbHVtbk5hbWVzPC9saXRlcmFsPjogVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIHRoZQorY29uc3RyYWludCBzcGFucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitJbiBYTUwsIHVuaXF1ZSBjb25zdHJhaW50cyBhcmUgcmVwcmVzZW50ZWQgYnkgbmVzdGluZyA8bGl0ZXJhbD4KK3VuaXF1ZS1jb25zdHJhaW50PC9saXRlcmFsPiBlbGVtZW50cyB3aXRoaW4gdGhlIDxsaXRlcmFsPiB0YWJsZTwvbGl0ZXJhbD4KK2VsZW1lbnQuIEVhY2ggPGxpdGVyYWw+dW5pcXVlLWNvbnN0cmFpbnQ8L2xpdGVyYWw+IGVsZW1lbnQgaW4gdHVybiBuZXN0cworPGxpdGVyYWw+Y29sdW1uLW5hbWU8L2xpdGVyYWw+IHRleHQgZWxlbWVudHMgdG8gZW51bWVyYXRlIHRoZSBjb250cmFpbnQncworY29sdW1ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfdW5xX2F0dHJleCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRGVmaW5pbmcgYSBVbmlxdWUgQ29uc3RyYWludAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBkZWZpbmVzIGEgdW5pcXVlIGNvbnN0cmFpbnQgb24gdGhlIDxsaXRlcmFsPiBUSVRMRTwvbGl0ZXJhbD4KK2NvbHVtbiBvZiB0aGUgPGxpdGVyYWw+QVJUPC9saXRlcmFsPiB0YWJsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBUlQiLCB1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlKGNvbHVtbk5hbWVzPSJUSVRMRSIpKQorcHVibGljIGNsYXNzIEFydGljbGUgeworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHNhbWUgbWV0YWRhdGEgZXhwcmVzc2VkIGluIFhNTCBmb3JtOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5BcnRpY2xlIiZndDsKKyAgICAmbHQ7dGFibGUgbmFtZT0iQVJUIiZndDsKKyAgICAgICAgJmx0O3VuaXF1ZS1jb25zdHJhaW50Jmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbi1uYW1lJmd0O1RJVExFJmx0Oy9jb2x1bW4tbmFtZSZndDsKKyAgICAgICAgJmx0Oy91bmlxdWUtY29uc3RyYWludCZndDsKKyAgICAmbHQ7L3RhYmxlJmd0OworICAgIC4uLgorJmx0Oy9lbnRpdHkmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19jb2x1bW4iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBDb2x1bW4KKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19jb2x1bW4iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBDb2x1bW4KKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19jb2x1bW4iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgQ29sdW1uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGluIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitJbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgd2Ugc2F3IHRoYXQgYSA8Y2xhc3NuYW1lPlVuaXF1ZUNvbnN0cmFpbnQ8L2NsYXNzbmFtZT4KK3VzZXMgYW4gYXJyYXkgb2YgY29sdW1uIG5hbWVzLiBGaWVsZCBtYXBwaW5ncywgaG93ZXZlciwgdXNlIGZ1bGwtZmxlZGdlZAorPGNsYXNzbmFtZT5Db2x1bW48L2NsYXNzbmFtZT4gYW5ub3RhdGlvbnMuIENvbHVtbiBhbm5vdGF0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdHJpbmcgbmFtZTwvbGl0ZXJhbD46IFRoZSBjb2x1bW4gbmFtZS4gRGVmYXVsdHMgdG8gdGhlIGZpZWxkIG5hbWUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdHJpbmcgY29sdW1uRGVmaW5pdGlvbjwvbGl0ZXJhbD46IFRoZSBkYXRhYmFzZS1zcGVjaWZpYyBjb2x1bW4gdHlwZQorbmFtZS4gVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHVzZWQgYnkgdmVuZG9ycyB0aGF0IHN1cHBvcnQgY3JlYXRpbmcgdGFibGVzIGZyb20KK3lvdXIgbWFwcGluZyBtZXRhZGF0YS4gRHVyaW5nIHRhYmxlIGNyZWF0aW9uLCB0aGUgdmVuZG9yIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZgordGhlIDxsaXRlcmFsPmNvbHVtbkRlZmluaXRpb248L2xpdGVyYWw+IGFzIHRoZSBkZWNsYXJlZCBjb2x1bW4gdHlwZS4gSWYgbm8KKzxsaXRlcmFsPmNvbHVtbkRlZmluaXRpb248L2xpdGVyYWw+IGlzIGdpdmVuLCB0aGUgdmVuZG9yIHdpbGwgY2hvb3NlIGFuCithcHByb3ByaWF0ZSBkZWZhdWx0IGJhc2VkIG9uIHRoZSBmaWVsZCB0eXBlIGNvbWJpbmVkIHdpdGggdGhlIGNvbHVtbidzIGxlbmd0aCwKK3ByZWNpc2lvbiwgYW5kIHNjYWxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbgorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5pbnQgbGVuZ3RoPC9saXRlcmFsPjogVGhlIGNvbHVtbiBsZW5ndGguIFRoaXMgcHJvcGVydHkgaXMgdHlwaWNhbGx5Citvbmx5IHVzZWQgZHVyaW5nIHRhYmxlIGNyZWF0aW9uLCB0aG91Z2ggc29tZSB2ZW5kb3JzIG1pZ2h0IHVzZSBpdCB0byB2YWxpZGF0ZQorZGF0YSBiZWZvcmUgZmx1c2hpbmcuIDxsaXRlcmFsPkNIQVI8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5WQVJDSEFSPC9saXRlcmFsPgorY29sdW1ucyB0eXBpY2FsbHkgZGVmYXVsdCB0byBhIGxlbmd0aCBvZiAyNTU7IG90aGVyIGNvbHVtbiB0eXBlcyB1c2UgdGhlCitkYXRhYmFzZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbgorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5pbnQgcHJlY2lzaW9uPC9saXRlcmFsPjogVGhlIHByZWNpc2lvbiBvZiBhIG51bWVyaWMgY29sdW1uLiBUaGlzCitwcm9wZXJ0eSBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggPGxpdGVyYWw+c2NhbGU8L2xpdGVyYWw+IHRvIGZvcm0gdGhlCitwcm9wZXIgY29sdW1uIHR5cGUgbmFtZSBkdXJpbmcgdGFibGUgY3JlYXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+aW50IHNjYWxlPC9saXRlcmFsPjogVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBhIG51bWVyaWMgY29sdW1uIGNhbgoraG9sZC4gVGhpcyBwcm9wZXJ0eSBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggPGxpdGVyYWw+cHJlY2lzaW9uCis8L2xpdGVyYWw+IHRvIGZvcm0gdGhlIHByb3BlciBjb2x1bW4gdHlwZSBuYW1lIGR1cmluZyB0YWJsZSBjcmVhdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5ib29sZWFuIG51bGxhYmxlPC9saXRlcmFsPjogV2hldGhlciB0aGUgY29sdW1uIGNhbiBzdG9yZSBudWxsIHZhbHVlcy4KK1ZlbmRvcnMgbWF5IHVzZSB0aGlzIHByb3BlcnR5IGJvdGggZm9yIHRhYmxlIGNyZWF0aW9uIGFuZCBhdCBydW50aW1lOyBob3dldmVyLAoraXQgaXMgbmV2ZXIgcmVxdWlyZWQuIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbgorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0YWJsZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Ym9vbGVhbiBpbnNlcnRhYmxlPC9saXRlcmFsPjogQnkgc2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIDxsaXRlcmFsPgorZmFsc2U8L2xpdGVyYWw+LCB5b3UgY2FuIG9taXQgdGhlIGNvbHVtbiBmcm9tIFNRTCA8bGl0ZXJhbD5JTlNFUlQ8L2xpdGVyYWw+CitzdGF0ZW1lbnRzLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0YWJsZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Ym9vbGVhbiB1cGRhdGFibGU8L2xpdGVyYWw+OiBCeSBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gPGxpdGVyYWw+CitmYWxzZTwvbGl0ZXJhbD4sIHlvdSBjYW4gb21pdCB0aGUgY29sdW1uIGZyb20gU1FMIDxsaXRlcmFsPlVQREFURTwvbGl0ZXJhbD4KK3N0YXRlbWVudHMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbgorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN0cmluZyB0YWJsZTwvbGl0ZXJhbD46IFNvbWV0aW1lcyB5b3Ugd2lsbCBuZWVkIHRvIG1hcCBmaWVsZHMgdG8KK3RhYmxlcyBvdGhlciB0aGFuIHRoZSBwcmltYXJ5IHRhYmxlLiBUaGlzIHByb3BlcnR5IGFsbG93cyB5b3Ugc3BlY2lmeSB0aGF0IHRoZQorY29sdW1uIHJlc2lkZXMgaW4gYSBzZWNvbmRhcnkgdGFibGUuIFdlIHdpbGwgc2VlIGhvdyB0byBtYXAgZmllbGRzIHRvIHNlY29uZGFyeQordGFibGVzIGxhdGVyIGluIHRoZSBjaGFwdGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmNvbHVtbjwvbGl0ZXJhbD4uIFRoaXMgZWxlbWVudCBoYXMKK2F0dHJpYnV0ZXMgdGhhdCBhcmUgZXhhY3RseSBlcXVpdmFsZW50IHRvIHRoZSA8Y2xhc3NuYW1lPiBDb2x1bW48L2NsYXNzbmFtZT4KK2Fubm90YXRpb24ncyBwcm9wZXJ0aWVzIGRlc2NyaWJlZCBhYm92ZToKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Y29sdW1uLWRlZmluaXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmxlbmd0aDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+cHJlY2lzaW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5zY2FsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+aW5zZXJ0YWJsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dXBkYXRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD50YWJsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2lkIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSWRlbnRpdHkgTWFwcGluZworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2lkIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIElkCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2lkIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pZCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorV2l0aCBvdXIgbmV3IGtub3dsZWRnZSBvZiBjb2x1bW5zLCB3ZSBjYW4gbWFwIHRoZSBpZGVudGl0eSBmaWVsZHMgb2Ygb3VyCitlbnRpdGllcy4gVGhlIGRpYWdyYW0gYmVsb3cgbm93IGluY2x1ZGVzIHByaW1hcnkga2V5IGNvbHVtbnMgZm9yIG91ciBtb2RlbCdzCit0YWJsZXMuIFRoZSBwcmltYXJ5IGtleSBjb2x1bW4gZm9yIDxjbGFzc25hbWU+QXV0aG9yPC9jbGFzc25hbWU+IHVzZXMKK25vbnN0YW5kYXJkIHR5cGUgPGxpdGVyYWw+IElOVEVHRVI2NDwvbGl0ZXJhbD4sIGFuZCB0aGUgPGxpdGVyYWw+TWFnYXppbmUuaXNibgorPC9saXRlcmFsPiBmaWVsZCBpcyBtYXBwZWQgdG8gYSA8bGl0ZXJhbD5WQVJDSEFSKDkpPC9saXRlcmFsPiBjb2x1bW4gaW5zdGVhZCBvZgorYSA8bGl0ZXJhbD5WQVJDSEFSKDI1NSk8L2xpdGVyYWw+IGNvbHVtbiwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIHN0cmluZworZmllbGRzLiBXZSBkbyBub3QgbmVlZCB0byBwb2ludCBvdXQgZWl0aGVyIG9uZSBvZiB0aGVzZSBvZGRpdGllcyB0byB0aGUgSlBBCitpbXBsZW1lbnRhdGlvbiBmb3IgcnVudGltZSB1c2UuIElmLCBob3dldmVyLCB3ZSB3YW50IHRvIHVzZSB0aGUgSlBBCitpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgb3VyIHRhYmxlcyBmb3IgdXMsIGl0IG5lZWRzIHRvIGtub3cgYWJvdXQKK2FueSBkZXNpcmVkIG5vbi1kZWZhdWx0IGNvbHVtbiB0eXBlcy4gVGhlcmVmb3JlLCB0aGUgZXhhbXBsZSBmb2xsb3dpbmcgdGhlCitkaWFncmFtIGluY2x1ZGVzIHRoaXMgZGF0YSBpbiBpdHMgZW5jb2Rpbmcgb2Ygb3VyIG1hcHBpbmdzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA1MTMgeCA0MTAgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1tYXBwaW5nLWlkZW50aXR5LnBuZyIgd2lkdGg9IjM0MXB4Ii8+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICA8cGFyYT4KK05vdGUgdGhhdCBtYW55IG9mIG91ciBpZGVudGl0eSBmaWVsZHMgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBjb2x1bW4gaW5mb3JtYXRpb24sCitiZWNhdXNlIHRoZXkgdXNlIHRoZSBkZWZhdWx0IGNvbHVtbiBuYW1lIGFuZCB0eXBlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pZGVudGl0eWV4Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBJZGVudGl0eSBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitASWRDbGFzcyhNYWdhemluZS5NYWdhemluZUlkLmNsYXNzKQorQFRhYmxlKG5hbWU9Ik1BRyIpCitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgQENvbHVtbihsZW5ndGg9OSkKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgaXNibjsKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKyAgICAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFnYXppbmVJZCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFSVCIsIHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWUoY29sdW1uTmFtZXM9IlRJVExFIikpCitwdWJsaWMgY2xhc3MgQXJ0aWNsZSB7CisKKyAgICBASWQgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnB1YjsKKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkNPTVAiKQorcHVibGljIGNsYXNzIENvbXBhbnkgeworCisgICAgQENvbHVtbihuYW1lPSJDSUQiKQorICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICAuLi4KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFVVEgiKQorcHVibGljIGNsYXNzIEF1dGhvciB7CisKKyAgICBAQ29sdW1uKG5hbWU9IkFJRCIsIGNvbHVtbkRlZmluaXRpb249IklOVEVHRVI2NCIpCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCitARW1iZWRkYWJsZQorcHVibGljIGNsYXNzIEFkZHJlc3MgeworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5zdWJzY3JpYmU7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnQgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUoc2NoZW1hPSJDTlRSQ1QiKQorcHVibGljIGNsYXNzIENvbnRyYWN0CisgICAgZXh0ZW5kcyBEb2N1bWVudCB7CisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJTVUIiLCBzY2hlbWE9IkNOVFJDVCIpCitwdWJsaWMgY2xhc3MgU3Vic2NyaXB0aW9uIHsKKworICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICAuLi4KKworICAgIEBFbnRpdHkKKyAgICBAVGFibGUobmFtZT0iTElORV9JVEVNIiwgc2NoZW1hPSJDTlRSQ1QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGluZUl0ZW0KKyAgICAgICAgZXh0ZW5kcyBDb250cmFjdCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eShuYW1lPSJMaWZldGltZSIpCitwdWJsaWMgY2xhc3MgTGlmZXRpbWVTdWJzY3JpcHRpb24KKyAgICBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CisgICAgLi4uCit9CisKK0BFbnRpdHkobmFtZT0iVHJpYWwiKQorcHVibGljIGNsYXNzIFRyaWFsU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHNhbWUgbWV0YWRhdGEgZm9yIDxsaXRlcmFsPk1hZ2F6aW5lPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+Q29tcGFueTwvbGl0ZXJhbD4KK2V4cHJlc3NlZCBpbiBYTUwgZm9ybToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUiJmd0OworICAgICZsdDtpZC1jbGFzcyBjbGFzcz0ib3JnLm1hZy5NYWdhemluZS5NYWdhemluZS5NYWdhemluZUlkIi8mZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9Ik1BRyIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0iaXNibiImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIGxlbmd0aD0iOSIvJmd0OworICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0idGl0bGUiLyZndDsKKyAgICAgIC4uLiAgCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnB1Yi5Db21wYW55IiZndDsKKyAgICAmbHQ7dGFibGUgbmFtZT0iQ09NUCIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJDSUQiLyZndDsKKyAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEdlbmVyYXRvcnMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBnZW5lcmF0b3JzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgVGFibGVHZW5lcmF0b3IKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIFNlcXVlbmNlR2VuZXJhdG9yCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK09uZSBhc3BlY3Qgb2YgaWRlbnRpdHkgbWFwcGluZyBub3QgY292ZXJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBpcyBKUEEncworYWJpbGl0eSB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhIHZhbHVlIHRvIHlvdXIgbnVtZXJpYyBpZGVudGl0eSBmaWVsZHMgdXNpbmcKKzxlbXBoYXNpcz5nZW5lcmF0b3JzPC9lbXBoYXNpcz4uIFdlIGRpc2N1c3NlZCB0aGUgYXZhaWxhYmxlIGdlbmVyYXRvciB0eXBlcyBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfaWQiLz4uIE5vdyB3ZSBzaG93IHlvdSBob3cgdG8gZGVmaW5lCituYW1lZCBnZW5lcmF0b3JzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZV9zZXFnZW4iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNlcXVlbmNlIEdlbmVyYXRvcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2VxdWVuY2Vfc2VxZ2VuIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZUdlbmVyYXRvcgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX3NlcXVlbmNlX3NlcWdlbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK01vc3QgZGF0YWJhc2VzIGFsbG93IHlvdSB0byBjcmVhdGUgbmF0aXZlIHNlcXVlbmNlcy4gVGhlc2UgYXJlIGRhdGFiYXNlCitzdHJ1Y3R1cmVzIHRoYXQgZ2VuZXJhdGUgaW5jcmVhc2luZyBudW1lcmljIHZhbHVlcy4gVGhlIDxjbGFzc25hbWU+CitTZXF1ZW5jZUdlbmVyYXRvcjwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIHJlcHJlc2VudHMgYSBuYW1lZCBkYXRhYmFzZSBzZXF1ZW5jZS4KK1lvdSBjYW4gcGxhY2UgdGhlIGFubm90YXRpb24gb24gYW55IHBhY2thZ2UsIGVudGl0eSBjbGFzcywgcGVyc2lzdGVudCBmaWVsZAorZGVjbGFyYXRpb24gKGlmIHlvdXIgZW50aXR5IHVzZXMgZmllbGQgYWNjZXNzKSwgb3IgZ2V0dGVyIG1ldGhvZCBmb3IgYQorcGVyc2lzdGVudCBwcm9wZXJ0eSAoaWYgeW91ciBlbnRpdHkgdXNlcyBwcm9wZXJ0eSBhY2Nlc3MpLiA8Y2xhc3NuYW1lPgorU2VxdWVuY2VHZW5lcmF0b3I8L2NsYXNzbmFtZT4gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIGdlbmVyYXRvciBuYW1lLiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VHZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOYW1lIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdHJpbmcgc2VxdWVuY2VOYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHNlcXVlbmNlLiBJZgoreW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBkYXRhYmFzZSBzZXF1ZW5jZSwgeW91ciB2ZW5kb3Igd2lsbCBjaG9vc2UgYW4gYXBwcm9wcmlhdGUKK2RlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZUdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmludCBpbml0aWFsVmFsdWU8L2xpdGVyYWw+OiBUaGUgaW5pdGlhbCBzZXF1ZW5jZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25TaXplIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5pbnQgYWxsb2NhdGlvblNpemU8L2xpdGVyYWw+OiBTb21lIGRhdGFiYXNlcyBjYW4gcHJlLWFsbG9jYXRlIGdyb3Vwcworb2Ygc2VxdWVuY2UgdmFsdWVzLiBUaGlzIGFsbG93cyB0aGUgZGF0YWJhc2UgdG8gc2VydmljZSBzZXF1ZW5jZSByZXF1ZXN0cyBmcm9tCitjYWNoZSwgcmF0aGVyIHRoYW4gcGh5c2ljYWxseSBpbmNyZW1lbnRpbmcgdGhlIHNlcXVlbmNlIHdpdGggZXZlcnkgcmVxdWVzdC4gVGhpcworYWxsb2NhdGlvbiBzaXplIGRlZmF1bHRzIHRvIDUwLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGFsbG93cyB5b3UgdG8gdXNlIGRlc2NyaWJlIG9uZSBvZiBPcGVuSlBBJ3MgYnVpbHQtaW4gZ2VuZXJhdG9yCitpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIDxsaXRlcmFsPnNlcXVlbmNlTmFtZTwvbGl0ZXJhbD4gcHJvcGVydHkuIFlvdSBjYW4gYWxzbworc2V0IHRoZSA8bGl0ZXJhbD5zZXF1ZW5jZU5hbWU8L2xpdGVyYWw+IHRvIDxsaXRlcmFsPnN5c3RlbTwvbGl0ZXJhbD4gdG8gdXNlIHRoZQorc3lzdGVtIHNlcXVlbmNlIGRlZmluZWQgYnkgdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuU2VxdWVuY2UiPjxsaXRlcmFsPgorb3BlbmpwYS5TZXF1ZW5jZTwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIFNlZSB0aGUgUmVmZXJlbmNlCitHdWlkZSdzIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9zZXF1ZW5jZSIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBYTUwgZWxlbWVudCBmb3IgYSBzZXF1ZW5jZSBnZW5lcmF0b3IgaXMgPGxpdGVyYWw+c2VxdWVuY2UtZ2VuZXJhdG9yCis8L2xpdGVyYWw+LiBJdHMgYXR0cmlidXRlcyBtaXJyb3IgdGhlIGFib3ZlIGFubm90YXRpb24ncyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnNlcXVlbmNlLW5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5pbml0aWFsLXZhbHVlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+YWxsb2NhdGlvbi1zaXplPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUbyB1c2UgYSBzZXF1ZW5jZSBnZW5lcmF0b3IsIHNldCB5b3VyIDxjbGFzc25hbWU+R2VuZXJhdGVkVmFsdWU8L2NsYXNzbmFtZT4KK2Fubm90YXRpb24ncyA8bGl0ZXJhbD5zdHJhdGVneTwvbGl0ZXJhbD4gcHJvcGVydHkgdG8gPGxpdGVyYWw+CitHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRTwvbGl0ZXJhbD4sIGFuZCBpdHMgPGxpdGVyYWw+Z2VuZXJhdG9yPC9saXRlcmFsPiBwcm9wZXJ0eQordG8gdGhlIHNlcXVlbmNlIGdlbmVyYXRvcidzIGRlY2xhcmVkIG5hbWUuIE9yIGVxdWl2YWxlbnRseSwgc2V0IHlvdXIgPGxpdGVyYWw+CitnZW5lcmF0ZWQtdmFsdWU8L2xpdGVyYWw+IFhNTCBlbGVtZW50J3MgPGxpdGVyYWw+c3RyYXRlZ3k8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0bworPGxpdGVyYWw+U0VRVUVOQ0U8L2xpdGVyYWw+IGFuZCBpdHMgPGxpdGVyYWw+Z2VuZXJhdG9yPC9saXRlcmFsPiBhdHRyaWJ1dGUgdG8KK3RoZSBnZW5lcmF0b3IgbmFtZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2VxdWVuY2VfdGFibGVnZW4iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFRhYmxlR2VuZXJhdG9yCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZV90YWJsZWdlbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgVGFibGVHZW5lcmF0b3IKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZV90YWJsZWdlbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFRhYmxlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0EgPGNsYXNzbmFtZT5UYWJsZUdlbmVyYXRvcjwvY2xhc3NuYW1lPiByZWZlcnMgdG8gYSBkYXRhYmFzZSB0YWJsZSB1c2VkIHRvIHN0b3JlCitpbmNyZWFzaW5nIHNlcXVlbmNlIHZhbHVlcyBmb3Igb25lIG9yIG1vcmUgZW50aXRpZXMuIEFzIHdpdGggPGNsYXNzbmFtZT4KK1NlcXVlbmNlR2VuZXJhdG9yPC9jbGFzc25hbWU+LCB5b3UgY2FuIHBsYWNlIHRoZSA8Y2xhc3NuYW1lPlRhYmxlR2VuZXJhdG9yCis8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBvbiBhbnkgcGFja2FnZSwgZW50aXR5IGNsYXNzLCBwZXJzaXN0ZW50IGZpZWxkCitkZWNsYXJhdGlvbiAoaWYgeW91ciBlbnRpdHkgdXNlcyBmaWVsZCBhY2Nlc3MpLCBvciBnZXR0ZXIgbWV0aG9kIGZvciBhCitwZXJzaXN0ZW50IHByb3BlcnR5IChpZiB5b3VyIGVudGl0eSB1c2VzIHByb3BlcnR5IGFjY2VzcykuIDxjbGFzc25hbWU+CitUYWJsZUdlbmVyYXRvcjwvY2xhc3NuYW1lPiBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVHZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RyaW5nIG5hbWU8L2xpdGVyYWw+OiBUaGUgZ2VuZXJhdG9yIG5hbWUuIFRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RyaW5nIHRhYmxlPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRvciB0YWJsZS4gSWYgbGVmdAordW5zcGVjaWZpZWQsIHlvdXIgdmVuZG9yIHdpbGwgY2hvb3NlIGEgZGVmYXVsdCB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RyaW5nIHNjaGVtYTwvbGl0ZXJhbD46IFRoZSBuYW1lZCB0YWJsZSdzIHNjaGVtYS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN0cmluZyBjYXRhbG9nPC9saXRlcmFsPjogVGhlIG5hbWVkIHRhYmxlJ3MgY2F0YWxvZy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrQ29sdW1uTmFtZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RyaW5nIHBrQ29sdW1uTmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gaW4KK3RoZSBnZW5lcmF0b3IgdGFibGUuIElmIHVuc3BlY2lmaWVkLCB5b3VyIGltcGxlbWVudGF0aW9uIHdpbGwgY2hvb3NlIGEgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlR2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ29sdW1uTmFtZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RyaW5nIHZhbHVlQ29sdW1uTmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdGhhdCBob2xkcwordGhlIHNlcXVlbmNlIHZhbHVlLiBJZiB1bnNwZWNpZmllZCwgeW91ciBpbXBsZW1lbnRhdGlvbiB3aWxsIGNob29zZSBhIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa0NvbHVtblZhbHVlIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdHJpbmcgcGtDb2x1bW5WYWx1ZTwvbGl0ZXJhbD46IFRoZSBwcmltYXJ5IGtleSBjb2x1bW4gdmFsdWUgb2YgdGhlCityb3cgaW4gdGhlIGdlbmVyYXRvciB0YWJsZSBob2xkaW5nIHRoaXMgc2VxdWVuY2UgdmFsdWUuIFlvdSBjYW4gdXNlIHRoZSBzYW1lCitnZW5lcmF0b3IgdGFibGUgZm9yIG11bHRpcGxlIGxvZ2ljYWwgc2VxdWVuY2VzIGJ5IHN1cHBseWluZyBkaWZmZXJlbnQgPGxpdGVyYWw+Citwa0NvbHVtblZhbHVlPC9saXRlcmFsPiBzLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB2YWx1ZSwgdGhlIGltcGxlbWVudGF0aW9uCit3aWxsIHN1cHBseSBhIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmludCBpbml0aWFsVmFsdWU8L2xpdGVyYWw+OiBUaGUgdmFsdWUgb2YgdGhlIGdlbmVyYXRvcidzIGZpcnN0IGlzc3VlZAorbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVHZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvblNpemUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmludCBhbGxvY2F0aW9uU2l6ZTwvbGl0ZXJhbD46IFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGFsbG9jYXRlIGluCittZW1vcnkgZm9yIGVhY2ggdHJpcCB0byB0aGUgZGF0YWJhc2UuIEFsbG9jYXRpbmcgdmFsdWVzIGluIG1lbW9yeSBhbGxvd3MgdGhlIEpQQQorcnVudGltZSB0byBhdm9pZCBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIGZvciBldmVyeSBzZXF1ZW5jZSByZXF1ZXN0LgorVGhpcyBudW1iZXIgYWxzbyBzcGVjaWZpZXMgdGhlIGFtb3VudCB0aGF0IHRoZSBzZXF1ZW5jZSB2YWx1ZSBpcyBpbmNyZW1lbnRlZAorZWFjaCB0aW1lIHRoZSBnZW5lcmF0b3IgdGFibGUgaXMgdXBkYXRlZC4gRGVmYXVsdHMgdG8gNTAuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBYTUwgZXF1aXZhbGVudCBpcyB0aGUgPGxpdGVyYWw+dGFibGUtZ2VuZXJhdG9yPC9saXRlcmFsPiBlbGVtZW50LiBUaGlzCitlbGVtZW50J3MgYXR0cmlidXRlcyBjb3JyZXNwb25kIGV4YWN0bHkgdG8gdGhlIGFib3ZlIGFubm90YXRpb24ncyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2NoZW1hPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Y2F0YWxvZzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnBrLWNvbHVtbi1uYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dmFsdWUtY29sdW1uLW5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5way1jb2x1bW4tdmFsdWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5pbml0aWFsLXZhbHVlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+YWxsb2NhdGlvbi1zaXplPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUbyB1c2UgYSB0YWJsZSBnZW5lcmF0b3IsIHNldCB5b3VyIDxjbGFzc25hbWU+R2VuZXJhdGVkVmFsdWU8L2NsYXNzbmFtZT4KK2Fubm90YXRpb24ncyA8bGl0ZXJhbD5zdHJhdGVneTwvbGl0ZXJhbD4gcHJvcGVydHkgdG8gPGxpdGVyYWw+CitHZW5lcmF0aW9uVHlwZS5UQUJMRTwvbGl0ZXJhbD4sIGFuZCBpdHMgPGxpdGVyYWw+Z2VuZXJhdG9yPC9saXRlcmFsPiBwcm9wZXJ0eSB0bwordGhlIHRhYmxlIGdlbmVyYXRvcidzIGRlY2xhcmVkIG5hbWUuIE9yIGVxdWl2YWxlbnRseSwgc2V0IHlvdXIgPGxpdGVyYWw+CitnZW5lcmF0ZWQtdmFsdWU8L2xpdGVyYWw+IFhNTCBlbGVtZW50J3MgPGxpdGVyYWw+c3RyYXRlZ3k8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0bworPGxpdGVyYWw+VEFCTEU8L2xpdGVyYWw+IGFuZCBpdHMgPGxpdGVyYWw+Z2VuZXJhdG9yPC9saXRlcmFsPiBhdHRyaWJ1dGUgdG8gdGhlCitnZW5lcmF0b3IgbmFtZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2VxdWVuY2VfZ2VuZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0xldCdzIHRha2UgYWR2YW50YWdlIG9mIGdlbmVyYXRvcnMgaW4gb3VyIGVudGl0eSBtb2RlbC4gSGVyZSBhcmUgb3VyIHVwZGF0ZWQKK21hcHBpbmdzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX3NlcXVlbmNlZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yIE1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitASWRDbGFzcyhNYWdhemluZS5NYWdhemluZUlkLmNsYXNzKQorQFRhYmxlKG5hbWU9Ik1BRyIpCitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgQENvbHVtbihsZW5ndGg9OSkKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgaXNibjsKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKyAgICAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFnYXppbmVJZCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFSVCIsIHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWUoY29sdW1uTmFtZXM9IlRJVExFIikpCitAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT0iQXJ0aWNsZVNlcSIsIHNlcXVlbmNlTmFtZT0iQVJUX1NFUSIpCitwdWJsaWMgY2xhc3MgQXJ0aWNsZSB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIGdlbmVyYXRvcj0iQXJ0aWNsZVNlcSIpIAorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5wdWI7CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJDT01QIikKK3B1YmxpYyBjbGFzcyBDb21wYW55IHsKKworICAgIEBDb2x1bW4obmFtZT0iQ0lEIikKKyAgICBASWQgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBVVRIIikKK3B1YmxpYyBjbGFzcyBBdXRob3IgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlRBQkxFLCBnZW5lcmF0b3I9IkF1dGhvckdlbiIpCisgICAgQFRhYmxlR2VuZXJhdG9yKG5hbWU9IkF1dGhvckdlbiIsIHRhYmxlPSJBVVRIX0dFTiIsIHBrQ29sdW1uTmFtZT0iUEsiLAorICAgICAgICB2YWx1ZUNvbHVtbk5hbWU9IkFJRCIpCisgICAgQENvbHVtbihuYW1lPSJBSUQiLCBjb2x1bW5EZWZpbml0aW9uPSJJTlRFR0VSNjQiKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCitARW1iZWRkYWJsZQorcHVibGljIGNsYXNzIEFkZHJlc3MgeworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5zdWJzY3JpYmU7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnQgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKGdlbmVyYXRlPUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKyAKKyAgICAuLi4KK30KKworQEVudGl0eQorQFRhYmxlKHNjaGVtYT0iQ05UUkNUIikKK3B1YmxpYyBjbGFzcyBDb250cmFjdAorICAgIGV4dGVuZHMgRG9jdW1lbnQgeworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJTVUIiLCBzY2hlbWE9IkNOVFJDVCIpCitwdWJsaWMgY2xhc3MgU3Vic2NyaXB0aW9uIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0aW9uVHlwZS5JREVOVElUWSkKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICAuLi4KKworICAgIEBFbnRpdHkKKyAgICBAVGFibGUobmFtZT0iTElORV9JVEVNIiwgc2NoZW1hPSJDTlRSQ1QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGluZUl0ZW0KKyAgICAgICAgZXh0ZW5kcyBDb250cmFjdCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eShuYW1lPSJMaWZldGltZSIpCitwdWJsaWMgY2xhc3MgTGlmZXRpbWVTdWJzY3JpcHRpb24KKyAgICBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CisgICAgLi4uCit9CisKK0BFbnRpdHkobmFtZT0iVHJpYWwiKQorcHVibGljIGNsYXNzIFRyaWFsU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzYW1lIG1ldGFkYXRhIGZvciA8bGl0ZXJhbD5BcnRpY2xlPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+QXV0aG9yPC9saXRlcmFsPgorZXhwcmVzc2VkIGluIFhNTCBmb3JtOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuQXJ0aWNsZSImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IkFSVCImZ3Q7CisgICAgICAgICZsdDt1bmlxdWUtY29uc3RyYWludCZndDsKKyAgICAgICAgICAgICZsdDtjb2x1bW4tbmFtZSZndDtUSVRMRSZsdDsvY29sdW1uLW5hbWUmZ3Q7CisgICAgICAgICZsdDsvdW5pcXVlLWNvbnN0cmFpbnQmZ3Q7CisgICAgJmx0Oy90YWJsZSZndDsKKyAgICAmbHQ7c2VxdWVuY2UtZ2VuZXJhdG9yIG5hbWU9IkFydGljbGVTZXEiIHNlcXVlbmNlLW5hbWU9IkFSVF9TRVEiLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IlNFUVVFTkNFIiBnZW5lcmF0b3I9IkFydGljbGVTZXEiLyZndDsKKyAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnB1Yi5BdXRob3IiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJBVVRIIi8mZ3Q7CisgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICZsdDtpZCBuYW1lPSJpZCImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkFJRCIgY29sdW1uLWRlZmluaXRpb249IklOVEVHRVI2NCIvJmd0OworICAgICAgICAgICAgJmx0O2dlbmVyYXRlZC12YWx1ZSBzdHJhdGVneT0iVEFCTEUiIGdlbmVyYXRvcj0iQXV0aG9yR2VuIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7dGFibGUtZ2VuZXJhdG9yIG5hbWU9IkF1dGhvckdlbiIgdGFibGU9IkFVVEhfR0VOIiAKKyAgICAgICAgICAgICAgICBway1jb2x1bW4tbmFtZT0iUEsiIHZhbHVlLWNvbHVtbi1uYW1lPSJBSUQiLyZndDsKKyAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlciI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEluaGVyaXRhbmNlCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXIiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlciI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXIiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgZW50aXRpZXMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpbXBlZGFuY2UgbWlzbWF0Y2gKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorSW4gdGhlIDE5OTAncyBwcm9ncmFtbWVycyBjb2luZWQgdGhlIHRlcm0gPGVtcGhhc2lzPmltcGVkYW5jZSBtaXNtYXRjaAorPC9lbXBoYXNpcz4gdG8gZGVzY3JpYmUgdGhlIGRpZmZpY3VsdGllcyBpbiBicmlkZ2luZyB0aGUgb2JqZWN0IGFuZCByZWxhdGlvbmFsCit3b3JsZHMuIFBlcmhhcHMgbm8gZmVhdHVyZSBvZiBvYmplY3QgbW9kZWxpbmcgaGlnaGxpZ2h0cyB0aGUgaW1wZWRhbmNlIG1pc21hdGNoCitiZXR0ZXIgdGhhbiBpbmhlcml0YW5jZS4gVGhlcmUgaXMgbm8gbmF0dXJhbCwgZWZmaWNpZW50IHdheSB0byByZXByZXNlbnQgYW4KK2luaGVyaXRhbmNlIHJlbGF0aW9uc2hpcCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICBzdHJhdGVneSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorTHVja2lseSwgSlBBIGdpdmVzIHlvdSBhIGNob2ljZSBvZiBpbmhlcml0YW5jZSBzdHJhdGVnaWVzLCBtYWtpbmcKK3RoZSBiZXN0IG9mIGEgYmFkIHNpdHVhdGlvbi4gVGhlIGJhc2UgZW50aXR5IGNsYXNzIGRlZmluZXMgdGhlIGluaGVyaXRhbmNlCitzdHJhdGVneSBmb3IgdGhlIGhpZXJhcmNoeSB3aXRoIHRoZSA8Y2xhc3NuYW1lPkluaGVyaXRhbmNlPC9jbGFzc25hbWU+Cithbm5vdGF0aW9uLiA8Y2xhc3NuYW1lPkluaGVyaXRhbmNlPC9jbGFzc25hbWU+IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkluaGVyaXRhbmNlVHlwZSBzdHJhdGVneTwvbGl0ZXJhbD46IEVudW0gdmFsdWUgZGVjbGFyaW5nIHRoZQoraW5oZXJpdGFuY2Ugc3RyYXRlZ3kgZm9yIHRoZSBoaWVyYXJjaHkuIERlZmF1bHRzIHRvIDxsaXRlcmFsPgorSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRTwvbGl0ZXJhbD4uIFdlIGRldGFpbCBlYWNoIG9mIHRoZSBhdmFpbGFibGUKK3N0cmF0ZWdpZXMgYmVsb3cuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIGNvcnJlc3BvbmRpbmcgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+aW5oZXJpdGFuY2U8L2xpdGVyYWw+LCB3aGljaCBoYXMgYQorc2luZ2xlIGF0dHJpYnV0ZToKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c3RyYXRlZ3k8L2xpdGVyYWw+OiBPbmUgb2YgPGxpdGVyYWw+U0lOR0xFX1RBQkxFPC9saXRlcmFsPiwgPGxpdGVyYWw+CitKT0lORUQ8L2xpdGVyYWw+LCBvciA8bGl0ZXJhbD5UQUJMRV9QRVJfQ0xBU1M8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgSlBBJ3Mgc3RhbmRhcmQgaW5oZXJpdGFuY2Ugc3RyYXRlZ2llcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBhbGxvd3MgeW91IHRvIHZhcnkgeW91ciBpbmhlcml0YW5jZSBzdHJhdGVneSBmb3IgZWFjaCBjbGFzcywgcmF0aGVyIHRoYW4KK2ZvcmNpbmcgYSBzaW5nbGUgc3RyYXRlZ3kgcGVyIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGEiLz4gaW4gdGhlIFJlZmVyZW5jZSBHdWlkZSBmb3IKK2RldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3NpbmdsZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU2luZ2xlIFRhYmxlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlcl9zaW5nbGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBTSU5HTEVfVEFCTEUgc3RyYXRlZ3kKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3NpbmdsZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFNJTkdMRV9UQUJMRSBzdHJhdGVneQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFPC9saXRlcmFsPiBzdHJhdGVneSBtYXBzIGFsbCBjbGFzc2VzIGluCit0aGUgaGllcmFyY2h5IHRvIHRoZSBiYXNlIGNsYXNzJyB0YWJsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDI2NiB4IDIwMyAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2luaGVyLXN1cGVyY2xhc3MtdGFibGUucG5nIiB3aWR0aD0iMTc3cHgiLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8cGFyYT4KK0luIG91ciBtb2RlbCwgPGNsYXNzbmFtZT5TdWJzY3JpcHRpb248L2NsYXNzbmFtZT4gaXMgbWFwcGVkIHRvIHRoZSA8bGl0ZXJhbD4KK0NOVFJDVC5TVUI8L2xpdGVyYWw+IHRhYmxlLiA8Y2xhc3NuYW1lPiBMaWZldGltZVN1YnNjcmlwdGlvbjwvY2xhc3NuYW1lPiwgd2hpY2gKK2V4dGVuZHMgPGNsYXNzbmFtZT4gU3Vic2NyaXB0aW9uPC9jbGFzc25hbWU+LCBhZGRzIGl0cyBmaWVsZCBkYXRhIHRvIHRoaXMgdGFibGUKK2FzIHdlbGwuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfc2luZ2xlZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlIFRhYmxlIE1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorQEVudGl0eQorQFRhYmxlKG5hbWU9IlNVQiIsIHNjaGVtYT0iQ05UUkNUIikKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKQorcHVibGljIGNsYXNzIFN1YnNjcmlwdGlvbiB7CisgICAgLi4uCit9CisKK0BFbnRpdHkobmFtZT0iTGlmZXRpbWUiKQorcHVibGljIGNsYXNzIExpZmV0aW1lU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzYW1lIG1ldGFkYXRhIGV4cHJlc3NlZCBpbiBYTUwgZm9ybToKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLlN1YnNjcmlwdGlvbiImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IlNVQiIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAmbHQ7aW5oZXJpdGFuY2Ugc3RyYXRlZ3k9IlNJTkdMRV9UQUJMRSIvJmd0OworICAgIC4uLgorJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5MaWZldGltZVN1YnNjcmlwdGlvbiImZ3Q7CisgICAgLi4uCismbHQ7L2VudGl0eSZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK1NpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBpcyB0aGUgZGVmYXVsdCBzdHJhdGVneS4gVGh1cywgd2UgY291bGQgb21pdCB0aGUKKzxsaXRlcmFsPkBJbmhlcml0YW5jZTwvbGl0ZXJhbD4gYW5ub3RhdGlvbiBpbiB0aGUgZXhhbXBsZSBhYm92ZSBhbmQgZ2V0IHRoZSBzYW1lCityZXN1bHQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYXQKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBmbGF0CisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CitNYXBwaW5nIHN1YmNsYXNzIHN0YXRlIHRvIHRoZSBzdXBlcmNsYXNzIHRhYmxlIGlzIG9mdGVuIGNhbGxlZCA8ZW1waGFzaXM+ZmxhdAorPC9lbXBoYXNpcz4gaW5oZXJpdGFuY2UgbWFwcGluZy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfc2luZ2xlX2FkdiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBBZHZhbnRhZ2VzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3NpbmdsZV9hZHYiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNJTkdMRV9UQUJMRSBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW50YWdlcworICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorU2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIG1hcHBpbmcgaXMgdGhlIGZhc3Rlc3Qgb2YgYWxsIGluaGVyaXRhbmNlIG1vZGVscywgc2luY2UKK2l0IG5ldmVyIHJlcXVpcmVzIGEgam9pbiB0byByZXRyaWV2ZSBhIHBlcnNpc3RlbnQgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UuCitTaW1pbGFybHksIHBlcnNpc3Rpbmcgb3IgdXBkYXRpbmcgYSBwZXJzaXN0ZW50IGluc3RhbmNlIHJlcXVpcmVzIG9ubHkgYSBzaW5nbGUKKzxsaXRlcmFsPklOU0VSVDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+VVBEQVRFPC9saXRlcmFsPiBzdGF0ZW1lbnQuIEZpbmFsbHksCityZWxhdGlvbnMgdG8gYW55IGNsYXNzIHdpdGhpbiBhIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgYXJlIGp1c3QgYXMKK2VmZmljaWVudCBhcyByZWxhdGlvbnMgdG8gYSBiYXNlIGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlcl9zaW5nbGVfZGlzYWR2Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERpc2FkdmFudGFnZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfc2luZ2xlX2Rpc2FkdiI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgU0lOR0xFX1RBQkxFIHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNhZHZhbnRhZ2VzCisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgbGFyZ2VyIHRoZSBpbmhlcml0YW5jZSBtb2RlbCBnZXRzLCB0aGUgIndpZGVyIiB0aGUgbWFwcGVkIHRhYmxlIGdldHMsIGluCit0aGF0IGZvciBldmVyeSBmaWVsZCBpbiB0aGUgZW50aXJlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgYSBjb2x1bW4gbXVzdCBleGlzdCBpbgordGhlIG1hcHBlZCB0YWJsZS4gVGhpcyBtYXkgaGF2ZSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZSBvbiB0aGUgZGF0YWJhc2Ugc2l6ZSwKK3NpbmNlIGEgd2lkZSBvciBkZWVwIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0YWJsZXMgd2l0aCBtYW55Cittb3N0bHktZW1wdHkgY29sdW1ucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX2pvaW5lZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSm9pbmVkCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlcl9qb2luZWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBKT0lORUQgc3RyYXRlZ3kKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX2pvaW5lZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEpPSU5FRCBzdHJhdGVneQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5Jbmhlcml0YW5jZVR5cGUuSk9JTkVEPC9saXRlcmFsPiBzdHJhdGVneSB1c2VzIGEgZGlmZmVyZW50IHRhYmxlCitmb3IgZWFjaCBjbGFzcyBpbiB0aGUgaGllcmFyY2h5LiBFYWNoIHRhYmxlIG9ubHkgaW5jbHVkZXMgc3RhdGUgZGVjbGFyZWQgaW4gaXRzCitjbGFzcy4gVGh1cyB0byBsb2FkIGEgc3ViY2xhc3MgaW5zdGFuY2UsIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbXVzdAorcmVhZCBmcm9tIHRoZSBzdWJjbGFzcyB0YWJsZSBhcyB3ZWxsIGFzIHRoZSB0YWJsZSBvZiBlYWNoIGFuY2VzdG9yIGNsYXNzLCB1cCB0bwordGhlIGJhc2UgZW50aXR5IGNsYXNzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbAorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CitVc2luZyBqb2luZWQgc3ViY2xhc3MgdGFibGVzIGlzIGFsc28gY2FsbGVkIDxlbXBoYXNpcz52ZXJ0aWNhbDwvZW1waGFzaXM+Citpbmhlcml0YW5jZSBtYXBwaW5nLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDI1NiB4IDIyOSAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1pbmhlci1qb2luZWQucG5nIiB3aWR0aD0iMTcxcHgiLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+UHJpbWFyeUtleUpvaW5Db2x1bW48L2NsYXNzbmFtZT4gYW5ub3RhdGlvbnMgdGVsbCB0aGUgSlBBCitpbXBsZW1lbnRhdGlvbiBob3cgdG8gam9pbiBlYWNoIHN1YmNsYXNzIHRhYmxlIHJlY29yZCB0byB0aGUgY29ycmVzcG9uZGluZworcmVjb3JkIGluIGl0cyBkaXJlY3Qgc3VwZXJjbGFzcyB0YWJsZS4gSW4gb3VyIG1vZGVsLCB0aGUgPGxpdGVyYWw+TElORV9JVEVNLklECis8L2xpdGVyYWw+IGNvbHVtbiBqb2lucyB0byB0aGUgPGxpdGVyYWw+Q09OVFJBQ1QuSUQ8L2xpdGVyYWw+IGNvbHVtbi4gVGhlCis8Y2xhc3NuYW1lPlByaW1hcnlLZXlKb2luQ29sdW1uPC9jbGFzc25hbWU+IGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgbmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBzdWJjbGFzcyB0YWJsZSBjb2x1bW4uIFdoZW4KK3RoZXJlIGlzIGEgc2luZ2xlIGlkZW50aXR5IGZpZWxkLCBkZWZhdWx0cyB0byB0aGF0IGZpZWxkJ3MgY29sdW1uIG5hbWUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcwordGFibGUgY29sdW1uIHRoaXMgc3ViY2xhc3MgdGFibGUgY29sdW1uIGpvaW5zIHRvLiBXaGVuIHRoZXJlIGlzIGEgc2luZ2xlCitpZGVudGl0eSBmaWVsZCwgZGVmYXVsdHMgdG8gdGhhdCBmaWVsZCdzIGNvbHVtbiBuYW1lLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIGNvbHVtbkRlZmluaXRpb248L2xpdGVyYWw+OiBUaGlzIHByb3BlcnR5IGhhcyB0aGUgc2FtZSBtZWFuaW5nCithcyB0aGUgPGxpdGVyYWw+Y29sdW1uRGVmaW5pdGlvbjwvbGl0ZXJhbD4gcHJvcGVydHkgb24gdGhlIDxjbGFzc25hbWU+Q29sdW1uCis8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiwgZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19jb2x1bW4iLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBYTUwgZXF1aXZhbGVudCBpcyB0aGUgPGxpdGVyYWw+cHJpbWFyeS1rZXktam9pbi1jb2x1bW48L2xpdGVyYWw+IGVsZW1lbnQuCitJdHMgYXR0cmlidXRlcyBtaXJyb3IgdGhlIGFubm90YXRpb24gcHJvcGVydGllcyBkZXNjcmliZWQgYWJvdmU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5uYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+cmVmZXJlbmNlZC1jb2x1bW4tbmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmNvbHVtbi1kZWZpbml0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgd2UgdXNlIDxsaXRlcmFsPkluaGVyaXRhbmNlVGFibGUuSk9JTkVEPC9saXRlcmFsPgorYW5kIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gdG8gbWFwIG91ciBzYW1wbGUgbW9kZWwgYWNjb3JkaW5nIHRvIHRoZSBkaWFncmFtCithYm92ZS4gTm90ZSB0aGF0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gaXMgbm90IHN0cmljdGx5IG5lZWRlZCwgYmVjYXVzZSB0aGVyZQoraXMgb25seSBvbmUgaWRlbnRpdHkgY29sdW1uLCBhbmQgdGhlIHN1YmNsYXNzIHRhYmxlIGNvbHVtbiBoYXMgdGhlIHNhbWUgbmFtZSBhcwordGhlIHN1cGVyY2xhc3MgdGFibGUgY29sdW1uLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGRlZmF1bHRzIHN1ZmZpY2UuIEhvd2V2ZXIsCit3ZSBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX2pvaW5lZGV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpvaW5lZCBTdWJjbGFzcyBUYWJsZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorQEVudGl0eQorQFRhYmxlKHNjaGVtYT0iQ05UUkNUIikKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuSk9JTkVEKQorcHVibGljIGNsYXNzIENvbnRyYWN0CisgICAgZXh0ZW5kcyBEb2N1bWVudCB7CisgICAgLi4uCit9CisKK3B1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorCisgICAgQEVudGl0eQorICAgIEBUYWJsZShuYW1lPSJMSU5FX0lURU0iLCBzY2hlbWE9IkNOVFJDVCIpCisgICAgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9IklEIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IklEIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbmVJdGVtCisgICAgICAgIGV4dGVuZHMgQ29udHJhY3QgeworICAgICAgICAuLi4KKyAgICB9Cit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHNhbWUgbWV0YWRhdGEgZXhwcmVzc2VkIGluIFhNTCBmb3JtOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3ViY3JpYmUuQ29udHJhY3QiJmd0OworICAgICZsdDt0YWJsZSBzY2hlbWE9IkNOVFJDVCIvJmd0OworICAgICZsdDtpbmhlcml0YW5jZSBzdHJhdGVneT0iSk9JTkVEIi8mZ3Q7CisgICAgLi4uCismbHQ7L2VudGl0eSZndDsKKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlN1YnNjcmlwdGlvbi5MaW5lSXRlbSImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IkxJTkVfSVRFTSIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAmbHQ7cHJpbWFyeS1rZXktam9pbi1jb2x1bW4gbmFtZT0iSUQiIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IlBLIi8mZ3Q7CisgICAgLi4uCismbHQ7L2VudGl0eSZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gdGhlcmUgYXJlIG11bHRpcGxlIGlkZW50aXR5IGNvbHVtbnMsIHlvdSBtdXN0IGRlZmluZSBtdWx0aXBsZSA8Y2xhc3NuYW1lPgorUHJpbWFyeUtleUpvaW5Db2x1bW48L2NsYXNzbmFtZT5zIHVzaW5nIHRoZSBhcHRseS1uYW1lZCA8Y2xhc3NuYW1lPgorUHJpbWFyeUtleUpvaW5Db2x1bW5zPC9jbGFzc25hbWU+IGFubm90YXRpb24uIFRoaXMgYW5ub3RhdGlvbidzIHZhbHVlIGlzIGFuCithcnJheSBvZiA8Y2xhc3NuYW1lPiBQcmltYXJ5S2V5Sm9pbkNvbHVtbjwvY2xhc3NuYW1lPiBzLiBXZSBjb3VsZCByZXdyaXRlCis8Y2xhc3NuYW1lPkxpbmVJdGVtPC9jbGFzc25hbWU+J3MgbWFwcGluZyBhczoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJMSU5FX0lURU0iLCBzY2hlbWE9IkNOVFJDVCIpCitAUHJpbWFyeUtleUpvaW5Db2x1bW5zKHsKKyAgICBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iSUQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iSUQiKQorfSkKK3B1YmxpYyBzdGF0aWMgY2xhc3MgTGluZUl0ZW0KKyAgICBleHRlbmRzIENvbnRyYWN0IHsKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK0luIFhNTCwgc2ltcGx5IGxpc3QgYXMgbWFueSA8bGl0ZXJhbD4gcHJpbWFyeS1rZXktam9pbi1jb2x1bW48L2xpdGVyYWw+IGVsZW1lbnRzCithcyBuZWNlc3NhcnkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfam9pbmVkX2FkdiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBBZHZhbnRhZ2VzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX2pvaW5lZF9hZHYiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpPSU5FRCBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW50YWdlcworICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGpvaW5lZCBzdHJhdGVneSBoYXMgdGhlIGZvbGxvd2luZyBhZHZhbnRhZ2VzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorVXNpbmcgam9pbmVkIHN1YmNsYXNzIHRhYmxlcyByZXN1bHRzIGluIHRoZSBtb3N0IDxlbXBoYXNpcz5ub3JtYWxpemVkPC9lbXBoYXNpcz4KK2RhdGFiYXNlIHNjaGVtYSwgbWVhbmluZyB0aGUgc2NoZW1hIHdpdGggdGhlIGxlYXN0IHNwdXJpb3VzIG9yIHJlZHVuZGFudCBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FzIG1vcmUgc3ViY2xhc3NlcyBhcmUgYWRkZWQgdG8gdGhlIGRhdGEgbW9kZWwgb3ZlciB0aW1lLCB0aGUgb25seSBzY2hlbWEKK21vZGlmaWNhdGlvbiB0aGF0IG5lZWRzIHRvIGJlIG1hZGUgaXMgdGhlIGFkZGl0aW9uIG9mIGNvcnJlc3BvbmRpbmcgc3ViY2xhc3MKK3RhYmxlcyBpbiB0aGUgZGF0YWJhc2UgKHJhdGhlciB0aGFuIGhhdmluZyB0byBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBvZiBleGlzdGluZwordGFibGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitSZWxhdGlvbnMgdG8gYSBiYXNlIGNsYXNzIHVzaW5nIHRoaXMgc3RyYXRlZ3kgY2FuIGJlIGxvYWRlZCB0aHJvdWdoIHN0YW5kYXJkCitqb2lucyBhbmQgY2FuIHVzZSBzdGFuZGFyZCBmb3JlaWduIGtleXMsIGFzIG9wcG9zZWQgdG8gdGhlIG1hY2hpbmF0aW9ucyByZXF1aXJlZAordG8gbG9hZCBwb2x5bW9ycGhpYyByZWxhdGlvbnMgdG8gdGFibGUtcGVyLWNsYXNzIGJhc2UgdHlwZXMsIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX2pvaW5lZF9kaXNhZHYiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRGlzYWR2YW50YWdlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlcl9qb2luZWRfZGlzYWR2Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBKT0lORUQgc3RyYXRlZ3kKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FkdmFudGFnZXMKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FzaWRlIGZyb20gY2VydGFpbiB1c2VzIG9mIHRoZSB0YWJsZS1wZXItY2xhc3Mgc3RyYXRlZ3kgZGVzY3JpYmVkIGJlbG93LCB0aGUKK2pvaW5lZCBzdHJhdGVneSBpcyBvZnRlbiB0aGUgc2xvd2VzdCBvZiB0aGUgaW5oZXJpdGFuY2UgbW9kZWxzLiBSZXRyaWV2aW5nIGFueQorc3ViY2xhc3MgcmVxdWlyZXMgb25lIG9yIG1vcmUgZGF0YWJhc2Ugam9pbnMsIGFuZCBzdG9yaW5nIHN1YmNsYXNzZXMgcmVxdWlyZXMKK211bHRpcGxlIDxsaXRlcmFsPklOU0VSVDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+VVBEQVRFPC9saXRlcmFsPiBzdGF0ZW1lbnRzLiBUaGlzCitpcyBvbmx5IHRoZSBjYXNlIHdoZW4gcGVyc2lzdGVuY2Ugb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIHN1YmNsYXNzZXM7IGlmCittb3N0IG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbGVhc3QtZGVyaXZlZCBwZXJzaXN0ZW50IHN1cGVyY2xhc3MsIHRoZW4KK3RoaXMgbWFwcGluZyBpcyB2ZXJ5IGZhc3QuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1doZW4gZXhlY3V0aW5nIGEgc2VsZWN0IGFnYWluc3QgYSBoaWVyYXJjaHkgdGhhdCB1c2VzIGpvaW5lZCBzdWJjbGFzcyB0YWJsZQoraW5oZXJpdGFuY2UsIHlvdSBtdXN0IGNvbnNpZGVyIGhvdyB0byBsb2FkIHN1YmNsYXNzIHN0YXRlLgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BlcmZwYWNrX2VhZ2VyIi8+IGluIHRoZSBSZWZlcmVuY2UgR3VpZGUKK2Rlc2NyaWJlcyBPcGVuSlBBJ3Mgb3B0aW9ucyBmb3IgZWZmaWNpZW50IGRhdGEgbG9hZGluZy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfdHBjIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBUYWJsZSBQZXIgQ2xhc3MKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3RwYyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIFRBQkxFX1BFUl9DTEFTUyBzdHJhdGVneQorICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfdHBjIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgVEFCTEVfUEVSX0NMQVNTIHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorTGlrZSB0aGUgPGxpdGVyYWw+Sk9JTkVEPC9saXRlcmFsPiBzdHJhdGVneSwgdGhlIDxsaXRlcmFsPgorSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUzwvbGl0ZXJhbD4gc3RyYXRlZ3kgdXNlcyBhIGRpZmZlcmVudCB0YWJsZSBmb3IKK2VhY2ggY2xhc3MgaW4gdGhlIGhpZXJhcmNoeS4gVW5saWtlIHRoZSA8bGl0ZXJhbD5KT0lORUQ8L2xpdGVyYWw+IHN0cmF0ZWd5LAoraG93ZXZlciwgZWFjaCB0YWJsZSBpbmNsdWRlcyBhbGwgc3RhdGUgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSBjb3JyZXNwb25kaW5nCitjbGFzcy4gVGh1cyB0byBsb2FkIGEgc3ViY2xhc3MgaW5zdGFuY2UsIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbXVzdAorb25seSByZWFkIGZyb20gdGhlIHN1YmNsYXNzIHRhYmxlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGpvaW4gdG8gc3VwZXJjbGFzcwordGFibGVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgMjgzIHggMjQ3IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWcvaW5oZXItdHBjLnBuZyIgd2lkdGg9IjE4OXB4Ii8+CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICAgICAgPHBhcmE+CitTdXBwb3NlIHRoYXQgb3VyIHNhbXBsZSBtb2RlbCdzIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4gY2xhc3MgaGFzIGEKK3N1YmNsYXNzIDxjbGFzc25hbWU+VGFibG9pZDwvY2xhc3NuYW1lPi4gVGhlIGNsYXNzZXMgYXJlIG1hcHBlZCB1c2luZyB0aGUKK3RhYmxlLXBlci1jbGFzcyBzdHJhdGVneSwgYXMgaW4gdGhlIGRpYWdyYW0gYWJvdmUuIEluIGEgdGFibGUtcGVyLWNsYXNzIG1hcHBpbmcsCis8Y2xhc3NuYW1lPiBNYWdhemluZTwvY2xhc3NuYW1lPidzIHRhYmxlIDxsaXRlcmFsPk1BRzwvbGl0ZXJhbD4gY29udGFpbnMgYWxsCitzdGF0ZSBkZWNsYXJlZCBpbiB0aGUgYmFzZSA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+IGNsYXNzLiA8Y2xhc3NuYW1lPgorVGFibG9pZDwvY2xhc3NuYW1lPiBtYXBzIHRvIGEgc2VwYXJhdGUgdGFibGUsIDxsaXRlcmFsPiBUQUJMT0lEPC9saXRlcmFsPi4gVGhpcwordGFibGUgY29udGFpbnMgbm90IG9ubHkgdGhlIHN0YXRlIGRlY2xhcmVkIGluIHRoZSA8Y2xhc3NuYW1lPlRhYmxvaWQ8L2NsYXNzbmFtZT4KK3N1YmNsYXNzLCBidXQgYWxsIHRoZSBiYXNlIGNsYXNzIHN0YXRlIGZyb20gPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPiBhcword2VsbC4gVGh1cyB0aGUgPGxpdGVyYWw+VEFCTE9JRDwvbGl0ZXJhbD4gdGFibGUgd291bGQgY29udGFpbiBjb2x1bW5zIGZvcgorPGxpdGVyYWw+aXNibjwvbGl0ZXJhbD4sIDxsaXRlcmFsPnRpdGxlPC9saXRlcmFsPiwgYW5kIG90aGVyIDxjbGFzc25hbWU+CitNYWdhemluZTwvY2xhc3NuYW1lPiBmaWVsZHMuIFRoZXNlIGNvbHVtbnMgd291bGQgZGVmYXVsdCB0byB0aGUgbmFtZXMgdXNlZCBpbgorPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPidzIG1hcHBpbmcgbWV0YWRhdGEuCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19lbWJlZCIvPiB3aWxsIHNob3cgeW91IGhvdyB0byB1c2UKKzxsaXRlcmFsPkF0dHJpYnV0ZU92ZXJyaWRlPC9saXRlcmFsPnMgYW5kIDxsaXRlcmFsPkFzc29jaWF0aW9uT3ZlcnJpZGU8L2xpdGVyYWw+CitzIHRvIG92ZXJyaWRlIHN1cGVyY2xhc3MgZmllbGQgbWFwcGluZ3MuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfdHBjZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVGFibGUgUGVyIENsYXNzIE1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorQEVudGl0eQorQFRhYmxlKG5hbWU9Ik1BRyIpCitASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykKK3B1YmxpYyBjbGFzcyBNYWdhemluZSB7CisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJUQUJMT0lEIikKK3B1YmxpYyBjbGFzcyBUYWJsb2lkCisgICAgZXh0ZW5kcyBNYWdhemluZSB7CisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQW5kIHRoZSBzYW1lIGNsYXNzZXMgaW4gWE1MOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJNQUciLyZndDsKKyAgICAmbHQ7aW5oZXJpdGFuY2Ugc3RyYXRlZ3k9IlRBQkxFX1BFUl9DTEFTUyIvJmd0OworICAgIC4uLgorJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLlRhYmxvaWQiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJUQUJMT0lEIi8mZ3Q7CisgICAgLi4uCismbHQ7L2VudGl0eSZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfdHBjX2FkdiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBBZHZhbnRhZ2VzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3RwY19hZHYiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRBQkxFX1BFUl9DTEFTUyBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW50YWdlcworICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHRhYmxlLXBlci1jbGFzcyBzdHJhdGVneSBpcyB2ZXJ5IGVmZmljaWVudCB3aGVuIG9wZXJhdGluZyBvbiBpbnN0YW5jZXMgb2YgYQora25vd24gY2xhc3MuIFVuZGVyIHRoZXNlIGNvbmRpdGlvbnMsIHRoZSBzdHJhdGVneSBuZXZlciByZXF1aXJlcyBqb2luaW5nIHRvCitzdXBlcmNsYXNzIG9yIHN1YmNsYXNzIHRhYmxlcy4gUmVhZHMsIGpvaW5zLCBpbnNlcnRzLCB1cGRhdGVzLCBhbmQgZGVsZXRlcyBhcmUKK2FsbCBlZmZpY2llbnQgaW4gdGhlIGFic2VuY2Ugb2YgcG9seW1vcnBoaWMgYmVoYXZpb3IuIEFsc28sIGFzIGluIHRoZSBqb2luZWQKK3N0cmF0ZWd5LCBhZGRpbmcgYWRkaXRpb25hbCBjbGFzc2VzIHRvIHRoZSBoaWVyYXJjaHkgZG9lcyBub3QgcmVxdWlyZSBtb2RpZnlpbmcKK2V4aXN0aW5nIGNsYXNzIHRhYmxlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaW5oZXJfdHBjX2Rpc2FkdiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBEaXNhZHZhbnRhZ2VzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3RwY19kaXNhZHYiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRBQkxFX1BFUl9DTEFTUyBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWR2YW50YWdlcworICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorUG9seW1vcnBoaWMgcmVsYXRpb25zIHRvIG5vbi1sZWFmIGNsYXNzZXMgaW4gYSB0YWJsZS1wZXItY2xhc3MgaGllcmFyY2h5IGhhdmUKK21hbnkgbGltaXRhdGlvbnMuIFdoZW4gdGhlIGNvbmNyZXRlIHN1YmNsYXNzIGlzIG5vdCBrbm93biwgdGhlIHJlbGF0ZWQgb2JqZWN0Citjb3VsZCBiZSBpbiBhbnkgb2YgdGhlIHN1YmNsYXNzIHRhYmxlcywgbWFraW5nIGpvaW5zIHRocm91Z2ggdGhlIHJlbGF0aW9uCitpbXBvc3NpYmxlLiBUaGlzIGFtYmlndWl0eSBhbHNvIGFmZmVjdHMgaWRlbnRpdHkgbG9va3VwcyBhbmQgcXVlcmllczsgdGhlc2UKK29wZXJhdGlvbnMgcmVxdWlyZSBtdWx0aXBsZSBTUUwgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPnMgKG9uZSBmb3IgZWFjaAorcG9zc2libGUgc3ViY2xhc3MpLCBvciBhIGNvbXBsZXggPGxpdGVyYWw+VU5JT048L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19saW1pdHNfdHBjIi8+IGluIHRoZSBSZWZlcmVuY2UgR3VpZGUKK2Rlc2NyaWJlcyB0aGUgbGltaXRhdGlvbnMgT3BlbkpQQSBwbGFjZXMgb24gdGFibGUtcGVyLWNsYXNzIG1hcHBpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3RvZ2V0aGVyIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBQdXR0aW5nIGl0IEFsbCBUb2dldGhlcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorTm93IHRoYXQgd2UgaGF2ZSBjb3ZlcmVkIEpQQSdzIGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMsIHdlIGNhbiB1cGRhdGUgb3VyIG1hcHBpbmcKK2RvY3VtZW50IHdpdGggaW5oZXJpdGFuY2UgaW5mb3JtYXRpb24uIEhlcmUgaXMgdGhlIGNvbXBsZXRlIG1vZGVsOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNTEzIHggNDEwIChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWcvanBhLWluaGVyLWFsbC5wbmciIHdpZHRoPSIzNDFweCIvPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxwYXJhPgorQW5kIGhlcmUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBtZXRhZGF0YToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlcl90b2dldGhlcmV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEluaGVyaXRhbmNlIE1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitASWRDbGFzcyhNYWdhemluZS5NYWdhemluZUlkLmNsYXNzKQorQFRhYmxlKG5hbWU9Ik1BRyIpCitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgQENvbHVtbihsZW5ndGg9OSkKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgaXNibjsKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKyAgICAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFnYXppbmVJZCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFSVCIsIHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWUoY29sdW1uTmFtZXM9IlRJVExFIikpCitAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT0iQXJ0aWNsZVNlcSIsIHNlcXVlbmNlTmFtZT0iQVJUX1NFUSIpCitwdWJsaWMgY2xhc3MgQXJ0aWNsZSB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIGdlbmVyYXRvcj0iQXJ0aWNsZVNlcSIpIAorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5wdWI7CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJDT01QIikKK3B1YmxpYyBjbGFzcyBDb21wYW55IHsKKworICAgIEBDb2x1bW4obmFtZT0iQ0lEIikKKyAgICBASWQgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBVVRIIikKK3B1YmxpYyBjbGFzcyBBdXRob3IgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlRBQkxFLCBnZW5lcmF0b3I9IkF1dGhvckdlbiIpCisgICAgQFRhYmxlR2VuZXJhdG9yKG5hbWU9IkF1dGhvckdlbiIsIHRhYmxlPSJBVVRIX0dFTiIsIHBrQ29sdW1uTmFtZT0iUEsiLAorICAgICAgICB2YWx1ZUNvbHVtbk5hbWU9IkFJRCIpCisgICAgQENvbHVtbihuYW1lPSJBSUQiLCBjb2x1bW5EZWZpbml0aW9uPSJJTlRFR0VSNjQiKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCitARW1iZWRkYWJsZQorcHVibGljIGNsYXNzIEFkZHJlc3MgeworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5zdWJzY3JpYmU7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnQgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUoc2NoZW1hPSJDTlRSQ1QiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitwdWJsaWMgY2xhc3MgQ29udHJhY3QKKyAgICBleHRlbmRzIERvY3VtZW50IHsKKyAgICAuLi4KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IlNVQiIsIHNjaGVtYT0iQ05UUkNUIikKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKQorcHVibGljIGNsYXNzIFN1YnNjcmlwdGlvbiB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuSURFTlRJVFkpCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCisKKyAgICBARW50aXR5CisgICAgQFRhYmxlKG5hbWU9IkxJTkVfSVRFTSIsIHNjaGVtYT0iQ05UUkNUIikKKyAgICBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iSUQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iSUQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGluZUl0ZW0KKyAgICAgICAgZXh0ZW5kcyBDb250cmFjdCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eShuYW1lPSJMaWZldGltZSIpCitwdWJsaWMgY2xhc3MgTGlmZXRpbWVTdWJzY3JpcHRpb24KKyAgICBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CisgICAgLi4uCit9CisKK0BFbnRpdHkobmFtZT0iVHJpYWwiKQorcHVibGljIGNsYXNzIFRyaWFsU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzYW1lIG1ldGFkYXRhIGV4cHJlc3NlZCBpbiBYTUwgZm9ybToKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIG9ybV8xXzAueHNkIgorICAgIHZlcnNpb249IjEuMCImZ3Q7CisgICAgJmx0O21hcHBlZC1zdXBlcmNsYXNzIGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5Eb2N1bWVudCImZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Z2VuZXJhdGVkLXZhbHVlIHN0cmF0ZWd5PSJJREVOVElUWSIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9tYXBwZWQtc3VwZXJjbGFzcyZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLk1hZ2F6aW5lIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9Ik1BRyIvJmd0OworICAgICAgICAmbHQ7aWQtY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUuTWFnYXppbmVJZCIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpc2JuIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIGxlbmd0aD0iOSIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJ0aXRsZSIvJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLkFydGljbGUiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVJUIiZndDsKKyAgICAgICAgICAgICZsdDt1bmlxdWUtY29uc3RyYWludCZndDsKKyAgICAgICAgICAgICAgICZsdDtjb2x1bW4tbmFtZSZndDtUSVRMRSZsdDsvY29sdW1uLW5hbWUmZ3Q7CisgICAgICAgICAgICAmbHQ7L3VuaXF1ZS1jb25zdHJhaW50Jmd0OworICAgICAgICAmbHQ7L3RhYmxlJmd0OworICAgICAgICAmbHQ7c2VxdWVuY2UtZ2VuZXJhdG9yIG5hbWU9IkFydGljbGVTZXEiIHNlcXVlbmNlLW5hbWU9IkFSVF9TRVEiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IlNFUVVFTkNFIiBnZW5lcmF0b3I9IkFydGljbGVTZXEiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQ29tcGFueSImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJDT01QIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkNJRCIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQXV0aG9yIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkFVVEgiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQUlEIiBjb2x1bW4tZGVmaW5pdGlvbj0iSU5URUdFUjY0Ii8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2dlbmVyYXRlZC12YWx1ZSBzdHJhdGVneT0iVEFCTEUiIGdlbmVyYXRvcj0iQXV0aG9yR2VuIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3RhYmxlLWdlbmVyYXRvciBuYW1lPSJBdXRob3JHZW4iIHRhYmxlPSJBVVRIX0dFTiIgCisgICAgICAgICAgICAgICAgICAgIHBrLWNvbHVtbi1uYW1lPSJQSyIgdmFsdWUtY29sdW1uLW5hbWU9IkFJRCIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJjcmliZS5Db250cmFjdCImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBzY2hlbWE9IkNOVFJDVCIvJmd0OworICAgICAgICAmbHQ7aW5oZXJpdGFuY2Ugc3RyYXRlZ3k9IkpPSU5FRCIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJjcmliZS5TdWJzY3JpcHRpb24iJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iU1VCIiBzY2hlbWE9IkNOVFJDVCIvJmd0OworICAgICAgICAmbHQ7aW5oZXJpdGFuY2Ugc3RyYXRlZ3k9IlNJTkdMRV9UQUJMRSIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpZCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2dlbmVyYXRlZC12YWx1ZSBzdHJhdGVneT0iSURFTlRJVFkiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlN1YnNjcmlwdGlvbi5MaW5lSXRlbSImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJMSU5FX0lURU0iIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgICAgICZsdDtwcmltYXJ5LWtleS1qb2luLWNvbHVtbiBuYW1lPSJJRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iUEsiLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGlmZXRpbWVTdWJzY3JpcHRpb24iIG5hbWU9IkxpZmV0aW1lIiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuVHJpYWxTdWJzY3JpcHRpb24iIG5hbWU9IlRyaWFsIiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7L2VudGl0eS1tYXBwaW5ncyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2Rpc2NyaW0iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBEaXNjcmltaW5hdG9yCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfZGlzY3JpbSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2Rpc2NyaW0iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfZGlzY3JpbSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX3NpbmdsZSI+c2luZ2xlIHRhYmxlPC9saW5rPgoraW5oZXJpdGFuY2Ugc3RyYXRlZ3kgcmVzdWx0cyBpbiBhIHNpbmdsZSB0YWJsZSBjb250YWluaW5nIHJlY29yZHMgZm9yIHR3byBvcgorbW9yZSBkaWZmZXJlbnQgY2xhc3NlcyBpbiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFNpbWlsYXJseSwgdXNpbmcgdGhlCis8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19pbmhlcl9qb2luZWQiPiBqb2luZWQ8L2xpbms+IHN0cmF0ZWd5CityZXN1bHRzIGluIHRoZSBzdXBlcmNsYXNzIHRhYmxlIGhvbGRpbmcgcmVjb3JkcyBmb3Igc3VwZXJjbGFzcyBpbnN0YW5jZXMgYXMgd2VsbAorYXMgZm9yIHRoZSBzdXBlcmNsYXNzIHN0YXRlIG9mIHN1YmNsYXNzIGluc3RhbmNlcy4gV2hlbiBzZWxlY3RpbmcgZGF0YSwgSlBBCituZWVkcyBhIHdheSB0byBkaWZmZXJlbnRpYXRlIGEgcm93IHJlcHJlc2VudGluZyBhbiBvYmplY3Qgb2Ygb25lIGNsYXNzIGZyb20gYQorcm93IHJlcHJlc2VudGluZyBhbiBvYmplY3Qgb2YgYW5vdGhlci4gVGhhdCBpcyB0aGUgam9iIG9mIHRoZSA8ZW1waGFzaXM+CitkaXNjcmltaW5hdG9yPC9lbXBoYXNpcz4gY29sdW1uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGlzIGFsd2F5cyBpbiB0aGUgdGFibGUgb2YgdGhlIGJhc2UgZW50aXR5LiBJdCBob2xkcyBhCitkaWZmZXJlbnQgdmFsdWUgZm9yIHJlY29yZHMgb2YgZWFjaCBjbGFzcywgYWxsb3dpbmcgdGhlIEpQQSBydW50aW1lCit0byBkZXRlcm1pbmUgd2hhdCBjbGFzcyBvZiBvYmplY3QgZWFjaCByb3cgcmVwcmVzZW50cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RoZSA8Y2xhc3NuYW1lPkRpc2NyaW1pbmF0b3JDb2x1bW48L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiByZXByZXNlbnRzIGEKK2Rpc2NyaW1pbmF0b3IgY29sdW1uLiBJdCBoYXMgdGhlc2UgcHJvcGVydGllczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG5hbWU8L2xpdGVyYWw+OiBUaGUgY29sdW1uIG5hbWUuIERlZmF1bHRzIHRvIDxsaXRlcmFsPkRUWVBFCis8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5sZW5ndGg8L2xpdGVyYWw+OiBGb3Igc3RyaW5nIGRpc2NyaW1pbmF0b3IgdmFsdWVzLCB0aGUgbGVuZ3RoIG9mIHRoZQorY29sdW1uLiBEZWZhdWx0cyB0byAzMS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIGNvbHVtbkRlZmluaXRpb248L2xpdGVyYWw+OiBUaGlzIHByb3BlcnR5IGhhcyB0aGUgc2FtZSBtZWFuaW5nCithcyB0aGUgPGxpdGVyYWw+Y29sdW1uRGVmaW5pdGlvbjwvbGl0ZXJhbD4gcHJvcGVydHkgb24gdGhlIDxjbGFzc25hbWU+Q29sdW1uCis8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiwgZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19jb2x1bW4iLz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkRpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlPC9saXRlcmFsPjogRW51bSB2YWx1ZSBkZWNsYXJpbmcKK3RoZSBkaXNjcmltaW5hdG9yIHN0cmF0ZWd5IG9mIHRoZSBoaWVyYXJjaHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIGNvcnJlc3BvbmRpbmcgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+IGRpc2NyaW1pbmF0b3ItY29sdW1uPC9saXRlcmFsPi4gSXRzCithdHRyaWJ1ZXMgbWlycm9yIHRoZSBhbm5vdGF0aW9uIHByb3BlcnRpZXMgYWJvdmU6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmxlbmd0aDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Y29sdW1uLWRlZmluaXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmRpc2NyaW1pbmF0b3ItdHlwZTwvbGl0ZXJhbD46IE9uZSBvZiA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+LAorPGxpdGVyYWw+Q0hBUjwvbGl0ZXJhbD4sIG9yIDxsaXRlcmFsPklOVEVHRVI8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSA8Y2xhc3NuYW1lPkRpc2NyaW1pbmF0b3JWYWx1ZTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIHNwZWNpZmllcyB0aGUKK2Rpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGVhY2ggY2xhc3MuIFRob3VnaCB0aGlzIGFubm90YXRpb24ncyB2YWx1ZSBpcyBhbHdheXMgYQorc3RyaW5nLCB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCBwYXJzZSBpdCBhY2NvcmRpbmcgdG8gdGhlIDxjbGFzc25hbWU+CitEaXNjcmltaW5hdG9yQ29sdW1uPC9jbGFzc25hbWU+J3MgPGxpdGVyYWw+ZGlzY3JpbWluYXRvclR5cGU8L2xpdGVyYWw+IHByb3BlcnR5CithYm92ZS4gVGhlIHR5cGUgZGVmYXVsdHMgdG8gPGxpdGVyYWw+RGlzY3JpbWluYXRvclR5cGUuU1RSSU5HPC9saXRlcmFsPiwgYnV0CittYXkgYmUgPGxpdGVyYWw+IERpc2NyaW1pbmF0b3JUeXBlLkNIQVI8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPgorRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUjwvbGl0ZXJhbD4uIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIDxjbGFzc25hbWU+CitEaXNjcmltaW5hdG9yVmFsdWU8L2NsYXNzbmFtZT4sIHRoZSBwcm92aWRlciB3aWxsIGNob29zZSBhbiBhcHByb3ByaWF0ZQorZGVmYXVsdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RoZSBjb3JyZXNwb25kaW5nIFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmRpc2NyaW1pbmF0b3ItdmFsdWU8L2xpdGVyYWw+LiBUaGUKK3RleHQgd2l0aGluIHRoaXMgZWxlbWVudCBpcyBwYXJzZWQgYXMgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYXNzdW1lcyB5b3VyIG1vZGVsIGVtcGxveXMgYSBkaXNjcmltaW5hdG9yIGNvbHVtbiBpZiBhbnkgb2YgdGhlCitmb2xsb3dpbmcgYXJlIHRydWU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBiYXNlIGVudGl0eSBleHBsaWNpdGx5IGRlY2xhcmVzIGFuIGluaGVyaXRhbmNlIHR5cGUgb2YgPGxpdGVyYWw+CitTSU5HTEVfVEFCTEU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGJhc2UgZW50aXR5IHNldHMgYSBkaXNjcmltaW5hdG9yIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGJhc2UgZW50aXR5IGRlY2xhcmVzIGEgZGlzY3JpbWluYXRvciBjb2x1bW4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorT25seSA8bGl0ZXJhbD5TSU5HTEVfVEFCTEU8L2xpdGVyYWw+IGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIHJlcXVpcmUgYQorZGlzY3JpbWluYXRvciBjb2x1bW4gYW5kIHZhbHVlcy4gPGxpdGVyYWw+IEpPSU5FRDwvbGl0ZXJhbD4gaGllcmFyY2hpZXMgY2FuIHVzZQorYSBkaXNjcmltaW5hdG9yIHRvIG1ha2Ugc29tZSBvcGVyYXRpb25zIG1vcmUgZWZmaWNpZW50LCBidXQgZG8gbm90IHJlcXVpcmUgb25lLgorPGxpdGVyYWw+VEFCTEVfUEVSX0NMQVNTPC9saXRlcmFsPiBoaWVyYXJjaGllcyBoYXZlIG5vIHVzZSBmb3IgYSBkaXNjcmltaW5hdG9yLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGRlZmluZXMgYWRkaXRpb25hbCBkaXNjcmltaW5hdG9yIHN0cmF0ZWdpZXM7IHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfanBhIi8+IGluIHRoZSBSZWZlcmVuY2UgR3VpZGUgZm9yCitkZXRhaWxzLiBPcGVuSlBBIGFsc28gc3VwcG9ydHMgZmluYWwgZW50aXR5IGNsYXNzZXMuIE9wZW5KUEEgZG9lcyBub3QgdXNlIGEKK2Rpc2NyaW1pbmF0b3Igb24gZmluYWwgY2xhc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgICAgICA8cGFyYT4KK1dlIGNhbiBub3cgdHJhbnNsYXRlIG91ciBuZXdmb3VuZCBrbm93bGVkZ2Ugb2YgSlBBIGRpc2NyaW1pbmF0b3JzIGludG8gY29uY3JldGUKK0pQQSBtYXBwaW5ncy4gV2UgZmlyc3QgZXh0ZW5kIG91ciBkaWFncmFtIHdpdGggZGlzY3JpbWluYXRvciBjb2x1bW5zOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA1MTMgeCA0MTAgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1kaXNjcmltLWFsbC5wbmciIHdpZHRoPSIzNDFweCIvPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPHBhcmE+CitOZXh0LCB3ZSBwcmVzZW50IHRoZSB1cGRhdGVkIG1hcHBpbmcgZG9jdW1lbnQuIE5vdGljZSB0aGF0IGluIHRoaXMgdmVyc2lvbiwgd2UKK2hhdmUgcmVtb3ZlZCBleHBsaWNpdCBpbmhlcml0YW5jZSBhbm5vdGF0aW9ucyB3aGVuIHRoZSBkZWZhdWx0cyBzdWZmaWNlZC4gQWxzbywKK25vdGljZSB0aGF0IGVudGl0aWVzIHVzaW5nIHRoZSBkZWZhdWx0IDxsaXRlcmFsPkRUWVBFPC9saXRlcmFsPiBkaXNjcmltaW5hdG9yCitjb2x1bW4gbWFwcGluZyBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCA8Y2xhc3NuYW1lPkRpc2NyaW1pbmF0b3JDb2x1bW4KKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19kaXNjcmltZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERpc2NyaW1pbmF0b3IgTWFwcGluZworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3BhY2thZ2Ugb3JnLm1hZzsKKworQEVudGl0eQorQElkQ2xhc3MoTWFnYXppbmUuTWFnYXppbmVJZC5jbGFzcykKK0BUYWJsZShuYW1lPSJNQUciKQorQERpc2NyaW1pbmF0b3JWYWx1ZSgiTWFnIikKK3B1YmxpYyBjbGFzcyBNYWdhemluZSB7CisKKyAgICBAQ29sdW1uKGxlbmd0aD05KQorICAgIEBJZCBwcml2YXRlIFN0cmluZyBpc2JuOworICAgIEBJZCBwcml2YXRlIFN0cmluZyB0aXRsZTsKKworICAgIC4uLgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWdhemluZUlkIHsKKyAgICAgICAgLi4uCisgICAgfQorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iQVJUIiwgdW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZShjb2x1bW5OYW1lcz0iVElUTEUiKSkKK0BTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSJBcnRpY2xlU2VxIiwgc2VxdWVuY2VOYW1lPSJBUlRfU0VRIikKK3B1YmxpYyBjbGFzcyBBcnRpY2xlIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgZ2VuZXJhdG9yPSJBcnRpY2xlU2VxIikgCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnB1YjsKKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkNPTVAiKQorcHVibGljIGNsYXNzIENvbXBhbnkgeworCisgICAgQENvbHVtbihuYW1lPSJDSUQiKQorICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICAuLi4KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFVVEgiKQorcHVibGljIGNsYXNzIEF1dGhvciB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuVEFCTEUsIGdlbmVyYXRvcj0iQXV0aG9yR2VuIikKKyAgICBAVGFibGVHZW5lcmF0b3IobmFtZT0iQXV0aG9yR2VuIiwgdGFibGU9IkFVVEhfR0VOIiwgcGtDb2x1bW5OYW1lPSJQSyIsCisgICAgICAgIHZhbHVlQ29sdW1uTmFtZT0iQUlEIikKKyAgICBAQ29sdW1uKG5hbWU9IkFJRCIsIGNvbHVtbkRlZmluaXRpb249IklOVEVHRVI2NCIpCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKK0BFbWJlZGRhYmxlCitwdWJsaWMgY2xhc3MgQWRkcmVzcyB7CisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnN1YnNjcmliZTsKKworQE1hcHBlZFN1cGVyY2xhc3MKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb2N1bWVudCB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuSURFTlRJVFkpCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShzY2hlbWE9IkNOVFJDVCIpCitASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLkpPSU5FRCkKK0BEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9IkNUWVBFIikKK3B1YmxpYyBjbGFzcyBDb250cmFjdAorICAgIGV4dGVuZHMgRG9jdW1lbnQgeworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iU1VCIiwgc2NoZW1hPSJDTlRSQ1QiKQorQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT0iS0lORCIsIGRpc2NyaW1pbmF0b3JUeXBlPURpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpCitARGlzY3JpbWluYXRvclZhbHVlKCIxIikKK3B1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb24geworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIC4uLgorCisgICAgQEVudGl0eQorICAgIEBUYWJsZShuYW1lPSJMSU5FX0lURU0iLCBzY2hlbWE9IkNOVFJDVCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lSXRlbQorICAgICAgICBleHRlbmRzIENvbnRyYWN0IHsKKyAgICAgICAgLi4uCisgICAgfQorfQorCitARW50aXR5KG5hbWU9IkxpZmV0aW1lIikKK0BEaXNjcmltaW5hdG9yVmFsdWUoIjIiKQorcHVibGljIGNsYXNzIExpZmV0aW1lU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorCitARW50aXR5KG5hbWU9IlRyaWFsIikKK0BEaXNjcmltaW5hdG9yVmFsdWUoIjMiKQorcHVibGljIGNsYXNzIFRyaWFsU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHNhbWUgbWV0YWRhdGEgZXhwcmVzc2VkIGluIFhNTDoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0gb3JtXzFfMC54c2QiCisgICAgdmVyc2lvbj0iMS4wIiZndDsKKyAgICAmbHQ7bWFwcGVkLXN1cGVyY2xhc3MgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLkRvY3VtZW50IiZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IklERU5USVRZIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L21hcHBlZC1zdXBlcmNsYXNzJmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iTUFHIi8mZ3Q7CisgICAgICAgICZsdDtpZC1jbGFzcz0ib3JnLm1hZy5NYWdhemluZS5NYWdhemluZUlkIi8mZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLXZhbHVlJmd0O01hZyZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaXNibiImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBsZW5ndGg9IjkiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0idGl0bGUiLyZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5BcnRpY2xlIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkFSVCImZ3Q7CisgICAgICAgICAgICAmbHQ7dW5pcXVlLWNvbnN0cmFpbnQmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbi1uYW1lJmd0O1RJVExFJmx0Oy9jb2x1bW4tbmFtZSZndDsKKyAgICAgICAgICAgICZsdDsvdW5pcXVlLWNvbnN0cmFpbnQmZ3Q7CisgICAgICAgICZsdDsvdGFibGUmZ3Q7CisgICAgICAgICZsdDtzZXF1ZW5jZS1nZW5lcmF0b3IgbmFtZT0iQXJ0aWNsZVNlcSIgc2VxdWVuY2UtbmFtZT0iQVJUX1NFUSIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpZCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2dlbmVyYXRlZC12YWx1ZSBzdHJhdGVneT0iU0VRVUVOQ0UiIGdlbmVyYXRvcj0iQXJ0aWNsZVNlcSIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQ29tcGFueSImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJDT01QIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkNJRCIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQXV0aG9yIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkFVVEgiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQUlEIiBjb2x1bW4tZGVmaW5pdGlvbj0iSU5URUdFUjY0Ii8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2dlbmVyYXRlZC12YWx1ZSBzdHJhdGVneT0iVEFCTEUiIGdlbmVyYXRvcj0iQXV0aG9yR2VuIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3RhYmxlLWdlbmVyYXRvciBuYW1lPSJBdXRob3JHZW4iIHRhYmxlPSJBVVRIX0dFTiIgCisgICAgICAgICAgICAgICAgICAgIHBrLWNvbHVtbi1uYW1lPSJQSyIgdmFsdWUtY29sdW1uLW5hbWU9IkFJRCIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJjcmliZS5Db250cmFjdCImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBzY2hlbWE9IkNOVFJDVCIvJmd0OworICAgICAgICAmbHQ7aW5oZXJpdGFuY2Ugc3RyYXRlZ3k9IkpPSU5FRCIvJmd0OworICAgICAgICAmbHQ7ZGlzY3JpbWluYXRvci1jb2x1bW4gbmFtZT0iQ1RZUEUiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3ViY3JpYmUuU3Vic2NyaXB0aW9uIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IlNVQiIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAgICAgJmx0O2luaGVyaXRhbmNlIHN0cmF0ZWd5PSJTSU5HTEVfVEFCTEUiLyZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7MSZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItY29sdW1uIG5hbWU9IktJTkQiIGRpc2NyaW1pbmF0b3ItdHlwZT0iSU5URUdFUiIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpZCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2dlbmVyYXRlZC12YWx1ZSBzdHJhdGVneT0iSURFTlRJVFkiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlN1YnNjcmlwdGlvbi5MaW5lSXRlbSImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJMSU5FX0lURU0iIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgICAgICZsdDtwcmltYXJ5LWtleS1qb2luLWNvbHVtbiBuYW1lPSJJRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iUEsiLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGlmZXRpbWVTdWJzY3JpcHRpb24iIG5hbWU9IkxpZmV0aW1lIiZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7MiZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuVHJpYWxTdWJzY3JpcHRpb24iIG5hbWU9IlRyaWFsIiZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7MyZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7L2VudGl0eS1tYXBwaW5ncyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2ZpZWxkIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRmllbGQgTWFwcGluZworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2ZpZWxkIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZmllbGQgbWFwcGluZworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19maWVsZCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBlbnVtZXJhdGUgdGhlIG15cmlhZCBvZiBmaWVsZCBtYXBwaW5ncyBKUEEKK3N1cHBvcnRzLiBKUEEgYXVnbWVudHMgdGhlIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGNvdmVyZWQgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhIi8+IHdpdGggbWFueSBuZXcgb2JqZWN0LXJlbGF0aW9uYWwKK2Fubm90YXRpb25zLiBBcyB3ZSBleHBsb3JlIHRoZSBsaWJyYXJ5IG9mIHN0YW5kYXJkIG1hcHBpbmdzLCB3ZSBpbnRyb2R1Y2UgZWFjaAorb2YgdGhlc2UgZW5oYW5jZW1lbnRzIGluIGNvbnRleHQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgc3VwcG9ydHMgbWFueSBhZGRpdGlvbmFsIGZpZWxkIHR5cGVzLCBhbmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgY3VzdG9tCittYXBwaW5ncyBmb3IgdW5zdXBwb3J0ZWQgZmllbGQgdHlwZXMgb3IgZGF0YWJhc2Ugc2NoZW1hcy4gU2VlIHRoZSBSZWZlcmVuY2UKK0d1aWRlJ3MgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmciLz4gZm9yIGNvbXBsZXRlIGNvdmVyYWdlIG9mCitPcGVuSlBBJ3MgbWFwcGluZyBjYXBhYmlsaXRpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2Jhc2ljIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBCYXNpYyBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19iYXNpYyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYmFzaWMgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2Jhc2ljIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYmFzaWMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitBIDxlbXBoYXNpcz5iYXNpYzwvZW1waGFzaXM+IGZpZWxkIG1hcHBpbmcgc3RvcmVzIHRoZSBmaWVsZCB2YWx1ZSBkaXJlY3RseSBpbnRvCithIGRhdGFiYXNlIGNvbHVtbi4gVGhlIGZvbGxvd2luZyBmaWVsZCBtZXRhZGF0YSB0eXBlcyB1c2UgYmFzaWMgbWFwcGluZy4gVGhlc2UKK3R5cGVzIHdlcmUgZGVmaW5lZCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9maWVsZCIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2lkIj48Y2xhc3NuYW1lPklkPC9jbGFzc25hbWU+PC9saW5rPiBmaWVsZHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV92ZXJzaW9uIj48Y2xhc3NuYW1lPiBWZXJzaW9uPC9jbGFzc25hbWU+PC9saW5rPgorZmllbGRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfYmFzaWMiPjxjbGFzc25hbWU+QmFzaWM8L2NsYXNzbmFtZT48L2xpbms+CitmaWVsZHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0luIGZhY3QsIHlvdSBoYXZlIGFscmVhZHkgc2VlbiBleGFtcGxlcyBvZiBiYXNpYyBmaWVsZCBtYXBwaW5ncyBpbiB0aGlzIGNoYXB0ZXIKKy0gdGhlIG1hcHBpbmcgb2YgYWxsIGlkZW50aXR5IGZpZWxkcyBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfaWRlbnRpdHlleCIvPi4gQXMgeW91IHNhdyBpbiB0aGF0CitzZWN0aW9uLCB0byB3cml0ZSBhIGJhc2ljIGZpZWxkIG1hcHBpbmcgeW91IHVzZSB0aGUgPGNsYXNzbmFtZT5Db2x1bW4KKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIHRvIGRlc2NyaWJlIHRoZSBjb2x1bW4gdGhlIGZpZWxkIHZhbHVlIGlzIHN0b3JlZCBpbi4gV2UKK2Rpc2N1c3NlZCB0aGUgPGNsYXNzbmFtZT5Db2x1bW48L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfY29sdW1uIi8+LiBSZWNhbGwgdGhhdCB0aGUgbmFtZSBvZgordGhlIGNvbHVtbiBkZWZhdWx0cyB0byB0aGUgZmllbGQgbmFtZSwgYW5kIHRoZSB0eXBlIG9mIHRoZSBjb2x1bW4gZGVmYXVsdHMgdG8gYW4KK2FwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBmaWVsZCB0eXBlLiBUaGVzZSBkZWZhdWx0cyBhbGxvdyB5b3UgdG8gc29tZXRpbWVzIG9taXQKK3RoZSBhbm5vdGF0aW9uIGFsdG9nZXRoZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfbG9iIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIExPQnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfbG9iIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBMT0IKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfbG9iIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIExPQiB0eXBlcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2xvYiI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgTG9iCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQWRkaW5nIHRoZSA8Y2xhc3NuYW1lPkxvYjwvY2xhc3NuYW1lPiBtYXJrZXIgYW5ub3RhdGlvbiB0byBhIGJhc2ljIGZpZWxkIHNpZ25hbHMKK3RoYXQgdGhlIGRhdGEgaXMgdG8gYmUgc3RvcmVkIGFzIGEgTE9CIChMYXJnZSBPQmplY3QpLiBJZiB0aGUgZmllbGQgaG9sZHMgc3RyaW5nCitvciBjaGFyYWN0ZXIgZGF0YSwgaXQgd2lsbCBtYXAgdG8gYSA8bGl0ZXJhbD5DTE9CPC9saXRlcmFsPiAoQ2hhcmFjdGVyIExhcmdlCitPQmplY3QpIGRhdGFiYXNlIGNvbHVtbi4gSWYgdGhlIGZpZWxkIGhvbGRzIGFueSBvdGhlciBkYXRhIHR5cGUsIGl0IHdpbGwgYmUKK3N0b3JlZCBhcyBiaW5hcnkgZGF0YSBpbiBhIDxsaXRlcmFsPkJMT0I8L2xpdGVyYWw+IChCaW5hcnkgTGFyZ2UgT0JqZWN0KSBjb2x1bW4uCitUaGUgaW1wbGVtZW50YXRpb24gd2lsbCBzZXJpYWxpemUgdGhlIEphdmEgdmFsdWUgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmxvYjwvbGl0ZXJhbD4sIHdoaWNoIGhhcyBubyBjaGlsZHJlbiBvcgorYXR0cmlidXRlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfZW51bSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGVkCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2VudW0iPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfZW51bSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2VudW0iPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGFwcGx5IHRoZSA8Y2xhc3NuYW1lPkVudW1lcmF0ZWQ8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiB0byB5b3VyCis8Y2xhc3NuYW1lPkVudW08L2NsYXNzbmFtZT4gZmllbGRzIHRvIGNvbnRyb2wgaG93IHRoZXkgbWFwIHRvIHRoZSBkYXRhYmFzZS4gVGhlCis8Y2xhc3NuYW1lPkVudW1lcmF0ZWQ8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbidzIHZhbHVlIG9uZSBvZiB0aGUgZm9sbG93aW5nCitjb25zdGFudHMgZnJvbSB0aGUgPGNsYXNzbmFtZT5FbnVtVHlwZTwvY2xhc3NuYW1lPiBlbnVtOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkVudW1UeXBlLk9SRElOQUw8L2xpdGVyYWw+OiBUaGUgZGVmYXVsdC4gVGhlIHBlcnNpc3RlbmNlCitpbXBsZW1lbnRhdGlvbiBwbGFjZXMgdGhlIG9yZGluYWwgdmFsdWUgb2YgdGhlIGVudW0gaW4gYSBudW1lcmljIGNvbHVtbi4gVGhpcyBpcworYW4gZWZmaWNpZW50IG1hcHBpbmcsIGJ1dCBtYXkgYnJlYWsgaWYgeW91IHJlYXJyYW5nZSB0aGUgSmF2YSBlbnVtIGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkVudW1UeXBlLlNUUklORzwvbGl0ZXJhbD46IFN0b3JlIHRoZSBuYW1lIG9mIHRoZSBlbnVtIHZhbHVlIHJhdGhlcgordGhhbiB0aGUgb3JkaW5hbC4gVGhpcyBtYXBwaW5nIHVzZXMgYSA8bGl0ZXJhbD5WQVJDSEFSPC9saXRlcmFsPiBjb2x1bW4gcmF0aGVyCit0aGFuIGEgbnVtZXJpYyBvbmUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5FbnVtZXJhdGVkPC9jbGFzc25hbWU+IGFubm90YXRpb24gaXMgb3B0aW9uYWwuIEFueSB1bi1hbm5vdGF0ZWQKK2VudW1lcmF0aW9uIGZpZWxkIGRlZmF1bHRzIHRvIDxsaXRlcmFsPk9SRElOQUw8L2xpdGVyYWw+IG1hcHBpbmcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGNvcnJlc3BvbmRpbmcgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+ZW51bWVyYXRlZDwvbGl0ZXJhbD4uIEl0cyBlbWJlZGRlZAordGV4dCBtdXN0IGJlIG9uZSBvZiA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPk9SSURJTkFMPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfdGVtcG9yYWwiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVGVtcG9yYWwgVHlwZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfdGVtcG9yYWwiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWwgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ190ZW1wb3JhbCI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWwKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5UZW1wb3JhbDwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGRldGVybWluZXMgaG93IHRoZSBpbXBsZW1lbnRhdGlvbgoraGFuZGxlcyB5b3VyIGJhc2ljIDxjbGFzc25hbWU+IGphdmEudXRpbC5EYXRlPC9jbGFzc25hbWU+IGFuZCA8Y2xhc3NuYW1lPgoramF2YS51dGlsLkNhbGVuZGFyPC9jbGFzc25hbWU+IGZpZWxkcyBhdCB0aGUgSkRCQyBsZXZlbC4gVGhlIDxjbGFzc25hbWU+CitUZW1wb3JhbDwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uJ3MgdmFsdWUgaXMgYSBjb25zdGFudCBmcm9tIHRoZSA8Y2xhc3NuYW1lPgorVGVtcG9yYWxUeXBlPC9jbGFzc25hbWU+IGVudW0uIEF2YWlsYWJsZSB2YWx1ZXMgYXJlOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlRlbXBvcmFsVHlwZS5USU1FU1RBTVA8L2xpdGVyYWw+OiBUaGUgZGVmYXVsdC4gVXNlIEpEQkMncyB0aW1lc3RhbXAKK0FQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgY29sdW1uIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+VGVtcG9yYWxUeXBlLkRBVEU8L2xpdGVyYWw+OiBVc2UgSkRCQydzIFNRTCBkYXRlIEFQSXMgdG8gbWFuaXB1bGF0ZQordGhlIGNvbHVtbiBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlRlbXBvcmFsVHlwZS5USU1FPC9saXRlcmFsPjogVXNlIEpEQkMncyB0aW1lIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUKK2NvbHVtbiBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgdGhlIDxjbGFzc25hbWU+VGVtcG9yYWw8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBpcyBvbWl0dGVkLCB0aGUgaW1wbGVtZW50YXRpb24KK3dpbGwgdHJlYXQgdGhlIGRhdGEgYXMgYSB0aW1lc3RhbXAuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGNvcnJlc3BvbmRpbmcgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+dGVtcG9yYWw8L2xpdGVyYWw+LCB3aG9zZSB0ZXh0IHZhbHVlCittdXN0IGJlIG9uZSBvZjogPGxpdGVyYWw+VElNRTwvbGl0ZXJhbD4sIDxsaXRlcmFsPkRBVEU8L2xpdGVyYWw+LCBvciA8bGl0ZXJhbD4KK1RJTUVTVEFNUDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2Jhc2ljX2V4YW1wbGUiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIFVwZGF0ZWQgTWFwcGluZ3MKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQmVsb3cgd2UgcHJlc2VudCBhbiB1cGRhdGVkIGRpYWdyYW0gb2Ygb3VyIG1vZGVsIGFuZCBpdHMgYXNzb2NpYXRlZCBkYXRhYmFzZQorc2NoZW1hLCBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyBtYXBwaW5nIG1ldGFkYXRhLiBOb3RlIHRoYXQgdGhlIG1hcHBpbmcKK21ldGFkYXRhIHJlbGllcyBvbiBkZWZhdWx0cyB3aGVyZSBwb3NzaWJsZS4gQWxzbyBub3RlIHRoYXQgYXMgYSBtYXBwZWQKK3N1cGVyY2xhc3MsIDxjbGFzc25hbWU+RG9jdW1lbnQ8L2NsYXNzbmFtZT4gY2FuIGRlZmluZSBtYXBwaW5ncyB0aGF0IHdpbGwKK2F1dG9tYXRpY2FsbHkgdHJhbnNmZXIgdG8gaXRzIHN1YmNsYXNzJyB0YWJsZXMuIEluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19lbWJlZCIvPiwgeW91IHdpbGwgc2VlIGhvdyBhIHN1YmNsYXNzCitjYW4gb3ZlcnJpZGUgaXRzIG1hcHBlZCBzdXBlcmNsYXNzJyBtYXBwaW5ncy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA1ODAgeCA1NTMgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWcvanBhLWJhc2ljLWZpZWxkLnBuZyIgd2lkdGg9IjM4N3B4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19iYXNpY2V4Ij4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWMgRmllbGQgTWFwcGluZworICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitASWRDbGFzcyhNYWdhemluZS5NYWdhemluZUlkLmNsYXNzKQorQFRhYmxlKG5hbWU9Ik1BRyIpCitARGlzY3JpbWluYXRvclZhbHVlKCJNYWciKQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKworICAgIEBDb2x1bW4obGVuZ3RoPTkpCisgICAgQElkIHByaXZhdGUgU3RyaW5nIGlzYm47CisgICAgQElkIHByaXZhdGUgU3RyaW5nIHRpdGxlOworCisgICAgQENvbHVtbihuYW1lPSJWRVJTIikKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBkb3VibGUgcHJpY2U7CisKKyAgICBAQ29sdW1uKG5hbWU9IkNPUElFUyIpCisgICAgcHJpdmF0ZSBpbnQgY29waWVzU29sZDsKKworICAgIC4uLgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWdhemluZUlkIHsKKyAgICAgICAgLi4uCisgICAgfQorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iQVJUIiwgdW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZShjb2x1bW5OYW1lcz0iVElUTEUiKSkKK0BTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSJBcnRpY2xlU2VxIiwgc2VxdWVuY2VOYW1lPSJBUlRfU0VRIikKK3B1YmxpYyBjbGFzcyBBcnRpY2xlIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgZ2VuZXJhdG9yPSJBcnRpY2xlU2VxIikgCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgQENvbHVtbihuYW1lPSJWRVJTIikKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgICAgcHJpdmF0ZSBieXRlW10gY29udGVudDsKKworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5wdWI7CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJDT01QIikKK3B1YmxpYyBjbGFzcyBDb21wYW55IHsKKworICAgIEBDb2x1bW4obmFtZT0iQ0lEIikKKyAgICBASWQgcHJpdmF0ZSBsb25nIGlkOworCisgICAgQENvbHVtbihuYW1lPSJWRVJTIikKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBDb2x1bW4obmFtZT0iUkVWIikKKyAgICBwcml2YXRlIGRvdWJsZSByZXZlbnVlOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBVVRIIikKK3B1YmxpYyBjbGFzcyBBdXRob3IgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlRBQkxFLCBnZW5lcmF0b3I9IkF1dGhvckdlbiIpCisgICAgQFRhYmxlR2VuZXJhdG9yKG5hbWU9IkF1dGhvckdlbiIsIHRhYmxlPSJBVVRIX0dFTiIsIHBrQ29sdW1uTmFtZT0iUEsiLAorICAgICAgICB2YWx1ZUNvbHVtbk5hbWU9IkFJRCIpCisgICAgQENvbHVtbihuYW1lPSJBSUQiLCBjb2x1bW5EZWZpbml0aW9uPSJJTlRFR0VSNjQiKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIEBDb2x1bW4obmFtZT0iRk5BTUUiKQorICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKKworICAgIEBDb2x1bW4obmFtZT0iTE5BTUUiKQorICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCisgICAgLi4uCit9CisKK0BFbWJlZGRhYmxlCitwdWJsaWMgY2xhc3MgQWRkcmVzcyB7CisgICAgLi4uCit9CisKK3BhY2thZ2Ugb3JnLm1hZy5zdWJzY3JpYmU7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnQgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUoc2NoZW1hPSJDTlRSQ1QiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSJDVFlQRSIpCitwdWJsaWMgY2xhc3MgQ29udHJhY3QKKyAgICBleHRlbmRzIERvY3VtZW50IHsKKworICAgIEBMb2IKKyAgICBwcml2YXRlIFN0cmluZyB0ZXJtczsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iU1VCIiwgc2NoZW1hPSJDTlRSQ1QiKQorQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT0iS0lORCIsIGRpc2NyaW1pbmF0b3JUeXBlPURpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpCitARGlzY3JpbWluYXRvclZhbHVlKCIxIikKK3B1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb24geworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIEBDb2x1bW4obmFtZT0iU1RBUlQiKQorICAgIHByaXZhdGUgRGF0ZSBzdGFydERhdGU7CisKKyAgICBAQ29sdW1uKG5hbWU9IlBBWSIpCisgICAgcHJpdmF0ZSBkb3VibGUgcGF5bWVudDsKKworICAgIC4uLgorCisgICAgQEVudGl0eQorICAgIEBUYWJsZShuYW1lPSJMSU5FX0lURU0iLCBzY2hlbWE9IkNOVFJDVCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lSXRlbQorICAgICAgICBleHRlbmRzIENvbnRyYWN0IHsKKworICAgICAgICBAQ29sdW1uKG5hbWU9IkNPTU0iKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjb21tZW50czsKKworICAgICAgICBwcml2YXRlIGRvdWJsZSBwcmljZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG51bTsKKyAgICAgICAgLi4uCisgICAgfQorfQorCitARW50aXR5KG5hbWU9IkxpZmV0aW1lIikKK0BEaXNjcmltaW5hdG9yVmFsdWUoIjIiKQorcHVibGljIGNsYXNzIExpZmV0aW1lU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIEBDb2x1bW4obmFtZT0iRUxJVEUiKQorICAgIHByaXZhdGUgYm9vbGVhbiBnZXRFbGl0ZUNsdWIgKCkgeyAuLi4gfQorICAgIHB1YmxpYyB2b2lkIHNldEVsaXRlQ2x1YiAoYm9vbGVhbiBlbGl0ZSkgeyAuLi4gfQorCisgICAgLi4uCit9CisKK0BFbnRpdHkobmFtZT0iVHJpYWwiKQorQERpc2NyaW1pbmF0b3JWYWx1ZSgiMyIpCitwdWJsaWMgY2xhc3MgVHJpYWxTdWJzY3JpcHRpb24KKyAgICBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CisKKyAgICBAQ29sdW1uKG5hbWU9IkVORCIpCisgICAgcHVibGljIERhdGUgZ2V0RW5kRGF0ZSAoKSB7IC4uLiB9CisgICAgcHVibGljIHZvaWQgc2V0RW5kRGF0ZSAoRGF0ZSBlbmQpIHsgLi4uIH0KKworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBleHByZXNzZWQgaW4gWE1MOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIG9ybV8xXzAueHNkIgorICAgIHZlcnNpb249IjEuMCImZ3Q7CisgICAgJmx0O21hcHBlZC1zdXBlcmNsYXNzIGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5Eb2N1bWVudCImZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Z2VuZXJhdGVkLXZhbHVlIHN0cmF0ZWd5PSJJREVOVElUWSIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L21hcHBlZC1zdXBlcmNsYXNzJmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iTUFHIi8mZ3Q7CisgICAgICAgICZsdDtpZC1jbGFzcz0ib3JnLm1hZy5NYWdhemluZS5NYWdhemluZUlkIi8mZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLXZhbHVlJmd0O01hZyZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaXNibiImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBsZW5ndGg9IjkiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0idGl0bGUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJuYW1lIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0icHJpY2UiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjb3BpZXNTb2xkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkNPUElFUyIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLkFydGljbGUiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVJUIiZndDsKKyAgICAgICAgICAgICZsdDt1bmlxdWUtY29uc3RyYWludCZndDsKKyAgICAgICAgICAgICAgICZsdDtjb2x1bW4tbmFtZSZndDtUSVRMRSZsdDsvY29sdW1uLW5hbWUmZ3Q7CisgICAgICAgICAgICAmbHQ7L3VuaXF1ZS1jb25zdHJhaW50Jmd0OworICAgICAgICAmbHQ7L3RhYmxlJmd0OworICAgICAgICAmbHQ7c2VxdWVuY2UtZ2VuZXJhdG9yIG5hbWU9IkFydGljbGVTZXEiLCBzZXF1ZW5jZU5hbWU9IkFSVF9TRVEiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IlNFUVVFTkNFIiBnZW5lcmF0b3I9IkFydGljbGVTZXEiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0idGl0bGUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjb250ZW50Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7dmVyc2lvbiBuYW1lPSJ2ZXJzaW9uIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IlZFUlMiLyZndDsKKyAgICAgICAgICAgICZsdDsvdmVyc2lvbiZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQ29tcGFueSImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJDT01QIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkNJRCIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJuYW1lIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0icmV2ZW51ZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJSRVYiLyZndDsKKyAgICAgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnB1Yi5BdXRob3IiJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVVUSCIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpZCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJBSUQiIGNvbHVtbi1kZWZpbml0aW9uPSJJTlRFR0VSNjQiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Z2VuZXJhdGVkLXZhbHVlIHN0cmF0ZWd5PSJUQUJMRSIgZ2VuZXJhdG9yPSJBdXRob3JHZW4iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7dGFibGUtZ2VuZXJhdG9yIG5hbWU9IkF1dGhvckdlbiIgdGFibGU9IkFVVEhfR0VOIiAKKyAgICAgICAgICAgICAgICAgICAgcGstY29sdW1uLW5hbWU9IlBLIiB2YWx1ZS1jb2x1bW4tbmFtZT0iQUlEIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9ImZpcnN0TmFtZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJGTkFNRSIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJsYXN0TmFtZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJMTkFNRSIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLkNvbnRyYWN0IiZndDsKKyAgICAgICAgJmx0O3RhYmxlIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgICAgICZsdDtpbmhlcml0YW5jZSBzdHJhdGVneT0iSk9JTkVEIi8mZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLWNvbHVtbiBuYW1lPSJDVFlQRSIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJ0ZXJtcyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2xvYi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLlN1YnNjcmlwdGlvbiImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJTVUIiIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgICAgICZsdDtpbmhlcml0YW5jZSBzdHJhdGVneT0iU0lOR0xFX1RBQkxFIi8mZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLXZhbHVlJmd0OzEmbHQ7L2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLWNvbHVtbiBuYW1lPSJLSU5EIiBkaXNjcmltaW5hdG9yLXR5cGU9IklOVEVHRVIiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IklERU5USVRZIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InBheW1lbnQiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iUEFZIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InN0YXJ0RGF0ZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJTVEFSVCIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5TdWJzY3JpcHRpb24uTGluZUl0ZW0iJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iTElORV9JVEVNIiBzY2hlbWE9IkNOVFJDVCIvJmd0OworICAgICAgICAmbHQ7cHJpbWFyeS1rZXktam9pbi1jb2x1bW4gbmFtZT0iSUQiIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IlBLIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9ImNvbW1lbnRzIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkNPTU0iLyZndDsKKyAgICAgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0icHJpY2UiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJudW0iLyZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGlmZXRpbWVTdWJzY3JpcHRpb24iIG5hbWU9IkxpZmV0aW1lIiZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7MiZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iZWxpdGVDbHViIiBmZXRjaD0iTEFaWSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJFTElURSIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuVHJpYWxTdWJzY3JpcHRpb24iIG5hbWU9IlRyaWFsIiZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7MyZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iZW5kRGF0ZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJFTkQiLyZndDsKKyAgICAgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworJmx0Oy9lbnRpdHktbWFwcGluZ3MmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTZWNvbmRhcnkgVGFibGVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZWNvbmRhcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeSB0YWJsZSBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2Vjb25kYXJ5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgaW4gc2Vjb25kYXJ5IHRhYmxlcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1NvbWV0aW1lcyBhIGEgbG9naWNhbCByZWNvcmQgaXMgc3ByZWFkIG92ZXIgbXVsdGlwbGUgZGF0YWJhc2UgdGFibGVzLiBKUEEKK2NhbGxzIGEgY2xhc3MnIGRlY2xhcmVkIHRhYmxlIHRoZSA8ZW1waGFzaXM+cHJpbWFyeTwvZW1waGFzaXM+Cit0YWJsZSwgYW5kIGNhbGxzIG90aGVyIHRhYmxlcyB0aGF0IG1ha2UgdXAgYSBsb2dpY2FsIHJlY29yZCA8ZW1waGFzaXM+c2Vjb25kYXJ5Cis8L2VtcGhhc2lzPiB0YWJsZXMuIFlvdSBjYW4gbWFwIGFueSBwZXJzaXN0ZW50IGZpZWxkIHRvIGEgc2Vjb25kYXJ5IHRhYmxlLiBKdXN0Cit3cml0ZSB0aGUgc3RhbmRhcmQgZmllbGQgbWFwcGluZywgdGhlbiBwZXJmb3JtIHRoZXNlIHR3byBhZGRpdGlvbmFsIHN0ZXBzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitTZXQgdGhlIDxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPiBhdHRyaWJ1dGUgb2YgZWFjaCBvZiB0aGUgZmllbGQncyBjb2x1bW5zIG9yCitqb2luIGNvbHVtbnMgdG8gdGhlIG5hbWUgb2YgdGhlIHNlY29uZGFyeSB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0RlZmluZSB0aGUgc2Vjb25kYXJ5IHRhYmxlIG9uIHRoZSBlbnRpdHkgY2xhc3MgZGVjbGFyYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGRlZmluZSBzZWNvbmRhcnkgdGFibGVzIHdpdGggdGhlIDxjbGFzc25hbWU+U2Vjb25kYXJ5VGFibGU8L2NsYXNzbmFtZT4KK2Fubm90YXRpb24uIFRoaXMgYW5ub3RhdGlvbiBoYXMgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSA8Y2xhc3NuYW1lPlRhYmxlCis8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBjb3ZlcmVkIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX3RhYmxlIi8+CissIHBsdXMgYSA8bGl0ZXJhbD4gcGtKb2luQ29sdW1uczwvbGl0ZXJhbD4gcHJvcGVydHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5wa0pvaW5Db2x1bW5zPC9saXRlcmFsPiBwcm9wZXJ0eSBpcyBhbiBhcnJheSBvZiA8Y2xhc3NuYW1lPgorUHJpbWFyeUtleUpvaW5Db2x1bW48L2NsYXNzbmFtZT5zIGRpY3RhdGluZyBob3cgdG8gam9pbiBzZWNvbmRhcnkgdGFibGUgcmVjb3JkcwordG8gdGhlaXIgb3duaW5nIHByaW1hcnkgdGFibGUgcmVjb3Jkcy4gRWFjaCA8Y2xhc3NuYW1lPlByaW1hcnlLZXlKb2luQ29sdW1uCis8L2NsYXNzbmFtZT4gam9pbnMgYSBzZWNvbmRhcnkgdGFibGUgY29sdW1uIHRvIGEgcHJpbWFyeSBrZXkgY29sdW1uIGluIHRoZQorcHJpbWFyeSB0YWJsZS4gU2VlIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2luaGVyX2pvaW5lZCIvPgorYWJvdmUgZm9yIGNvdmVyYWdlIG9mIDxjbGFzc25hbWU+UHJpbWFyeUtleUpvaW5Db2x1bW48L2NsYXNzbmFtZT4ncyBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgY29ycmVzcG9uZGluZyBYTUwgZWxlbWVudCBpcyA8bGl0ZXJhbD5zZWNvbmRhcnktdGFibGU8L2xpdGVyYWw+LiBUaGlzCitlbGVtZW50IGhhcyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIDxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPiBlbGVtZW50LCBidXQgYWxzbworYWNjZXB0cyBuZXN0ZWQgPGxpdGVyYWw+cHJpbWFyeS1rZXktam9pbi1jb2x1bW48L2xpdGVyYWw+IGVsZW1lbnRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdlIG1vdmUgdGhlIDxsaXRlcmFsPkFydGljbGUuY29udGVudDwvbGl0ZXJhbD4gZmllbGQKK3dlIG1hcHBlZCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19iYXNpYyIvPiBpbnRvIGEgam9pbmVkCitzZWNvbmRhcnkgdGFibGUsIGxpa2Ugc286CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCAyODQgeCAxNjcgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9zZWNvbmRhcnktdGFibGUucG5nIiB3aWR0aD0iMTg5cHgiLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2Vjb25kYXJ5ZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgU2Vjb25kYXJ5IFRhYmxlIEZpZWxkIE1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitAVGFibGUobmFtZT0iQVJUIikKK0BTZWNvbmRhcnlUYWJsZShuYW1lPSJBUlRfREFUQSIsIAorICAgIHBrSm9pbkNvbHVtbnM9QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9IkFSVF9JRCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSJJRCIpKQorcHVibGljIGNsYXNzIEFydGljbGUgeworCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4odGFibGU9IkFSVF9EQVRBIikKKyAgICBwcml2YXRlIGJ5dGVbXSBjb250ZW50OworCisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQW5kIGluIFhNTDoKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLkFydGljbGUiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJBUlQiJmd0OworICAgICZsdDtzZWNvbmRhcnktdGFibGUgbmFtZT0iQVJUX0RBVEEiJmd0OworICAgICAgICAmbHQ7cHJpbWFyeS1rZXktam9pbi1jb2x1bW4gbmFtZT0iQVJUX0lEIiByZWZlcmVuY2VkLWNvbHVtbi1uYW1lPSJJRCIvJmd0OworICAgICZsdDsvc2Vjb25kYXJ5LXRhYmxlJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiLyZndDsKKyAgICAgICAgJmx0O2Jhc2ljIG5hbWU9ImNvbnRlbnQiJmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbiB0YWJsZT0iQVJUX0RBVEEiLyZndDsKKyAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19lbWJlZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRW1iZWRkZWQgTWFwcGluZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfZW1iZWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkIGZpZWxkcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZAorICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19lbWJlZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgZW1iZWRkZWQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGEiLz4gZGVzY3JpYmVzIEpQQSdzIGNvbmNlcHQgb2YgPGVtcGhhc2lzPgorZW1iZWRkYWJsZTwvZW1waGFzaXM+IG9iamVjdHMuIFRoZSBmaWVsZCB2YWx1ZXMgb2YgZW1iZWRkZWQgb2JqZWN0cyBhcmUgc3RvcmVkCithcyBwYXJ0IG9mIHRoZSBvd25pbmcgcmVjb3JkLCByYXRoZXIgdGhhbiBhcyBhIHNlcGFyYXRlIGRhdGFiYXNlIHJlY29yZC4gVGh1cywKK2luc3RlYWQgb2YgbWFwcGluZyBhIHJlbGF0aW9uIHRvIGFuIGVtYmVkZGFibGUgb2JqZWN0IGFzIGEgZm9yZWlnbiBrZXksIHlvdSBtYXAKK2FsbCB0aGUgZmllbGRzIG9mIHRoZSBlbWJlZGRhYmxlIGluc3RhbmNlIHRvIGNvbHVtbnMgaW4gdGhlIG93bmluZyBmaWVsZCdzCit0YWJsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDQ2NCB4IDIwMyAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1lbWJlZGRlZC5wbmciIHdpZHRoPSIzMDlweCIvPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxwYXJhPgorSlBBIGRlZmF1bHRzIHRoZSBlbWJlZGRlZCBjb2x1bW4gbmFtZXMgYW5kIGRlc2NyaXB0aW9ucyB0byB0aG9zZSBvZgordGhlIGVtYmVkZGFibGUgY2xhc3MnIGZpZWxkIG1hcHBpbmdzLiBUaGUgPGNsYXNzbmFtZT4gQXR0cmlidXRlT3ZlcnJpZGUKKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIG92ZXJyaWRlcyBhIGJhc2ljIGVtYmVkZGVkIG1hcHBpbmcuIFRoaXMgYW5ub3RhdGlvbiBoYXMKK3RoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGVtYmVkZGVkIGNsYXNzJyBmaWVsZCBiZWluZworbWFwcGVkIHRvIHRoaXMgY2xhc3MnIHRhYmxlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q29sdW1uIGNvbHVtbjwvbGl0ZXJhbD46IFRoZSBjb2x1bW4gZGVmaW5pbmcgdGhlIG1hcHBpbmcgb2YgdGhlCitlbWJlZGRlZCBjbGFzcycgZmllbGQgdG8gdGhpcyBjbGFzcycgdGFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBjb3JyZXNwb25kaW5nIFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPiBhdHRyaWJ1dGUtb3ZlcnJpZGU8L2xpdGVyYWw+LiBJdCBoYXMKK2Egc2luZ2xlIDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0byBuYW1lIHRoZSBmaWVsZCBiZWluZyBvdmVycmlkZGVuLAorYW5kIGEgc2luZ2xlIDxsaXRlcmFsPmNvbHVtbjwvbGl0ZXJhbD4gY2hpbGQgZWxlbWVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gZGVjbGFyZSBtdWx0aXBsZSBvdmVycmlkZXMsIHVzZSB0aGUgPGNsYXNzbmFtZT5BdHRyaWJ1dGVPdmVycmlkZXM8L2NsYXNzbmFtZT4KK2Fubm90YXRpb24sIHdob3NlIHZhbHVlIGlzIGFuIGFycmF5IG9mIDxjbGFzc25hbWU+QXR0cmlidXRlT3ZlcnJpZGU8L2NsYXNzbmFtZT4KK3MuIEluIFhNTCwgc2ltcGx5IGxpc3QgbXVsdGlwbGUgPGxpdGVyYWw+YXR0cmlidXRlLW92ZXJyaWRlPC9saXRlcmFsPiBlbGVtZW50cworaW4gc3VjY2Vzc2lvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gb3ZlcnJpZGUgYSBtYW55IHRvIG9uZSBvciBvbmUgdG8gb25lIHJlbGF0aW9uc2hpcCwgdXNlIHRoZSA8Y2xhc3NuYW1lPgorQXNzb2NpYXRpb25PdmVycmlkZTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGluIHBsYWNlIG9mIDxjbGFzc25hbWU+CitBdHRyaWJ1dGVPdmVycmlkZTwvY2xhc3NuYW1lPi4gPGNsYXNzbmFtZT4gQXNzb2NpYXRpb25PdmVycmlkZTwvY2xhc3NuYW1lPiBoYXMKK3RoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGVtYmVkZGVkIGNsYXNzJyBmaWVsZCBiZWluZworbWFwcGVkIHRvIHRoaXMgY2xhc3MnIHRhYmxlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Sm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zPC9saXRlcmFsPjogVGhlIGZvcmVpZ24ga2V5IGNvbHVtbnMgam9pbmluZyB0bwordGhlIHJlbGF0ZWQgcmVjb3JkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUaGUgY29ycmVzcG9uZGluZyBYTUwgZWxlbWVudCBpcyA8bGl0ZXJhbD4gYXNzb2NpYXRpb24tb3ZlcnJpZGU8L2xpdGVyYWw+LiBJdAoraGFzIGEgc2luZ2xlIDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0byBuYW1lIHRoZSBmaWVsZCBiZWluZworb3ZlcnJpZGRlbiwgYW5kIG9uZSBvciBtb3JlIDxsaXRlcmFsPmpvaW4tY29sdW1uPC9saXRlcmFsPiBjaGlsZCBlbGVtZW50cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gZGVjbGFyZSBtdWx0aXBsZSByZWxhdGlvbiBvdmVycmlkZXMsIHVzZSB0aGUgPGNsYXNzbmFtZT4gQXNzb2NpYXRpb25PdmVycmlkZXMKKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLCB3aG9zZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiA8Y2xhc3NuYW1lPgorQXNzb2NpYXRpb25PdmVycmlkZTwvY2xhc3NuYW1lPiBzLiBJbiBYTUwsIHNpbXBseSBsaXN0IG11bHRpcGxlIDxsaXRlcmFsPgorYXNzb2NpYXRpb24tb3ZlcnJpZGU8L2xpdGVyYWw+IGVsZW1lbnRzIGluIHN1Y2Nlc3Npb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfZW1iZWRleCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZCBGaWVsZCBNYXBwaW5nCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0luIHRoaXMgZXhhbXBsZSwgPGNsYXNzbmFtZT5Db21wYW55PC9jbGFzc25hbWU+IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBtYXBwaW5nIG9mCis8bGl0ZXJhbD5BZGRyZXNzLnN0cmVldDwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkFkZHJlc3MuY2l0eTwvbGl0ZXJhbD4uIEFsbAorb3RoZXIgZW1iZWRkZWQgbWFwcGluZ3MgYXJlIHRha2VuIGZyb20gdGhlIDxjbGFzc25hbWU+QWRkcmVzczwvY2xhc3NuYW1lPgorZW1iZWRkYWJsZSBjbGFzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwYWNrYWdlIG9yZy5tYWcucHViOworCitARW50aXR5CitAVGFibGUobmFtZT0iQ09NUCIpCitwdWJsaWMgY2xhc3MgQ29tcGFueSB7CisKKyAgICBARW1iZWRkZWQKKyAgICBAQXR0cmlidXRlT3ZlcnJpZGVzKHsKKyAgICAgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9InN0cmVldCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9IlNUUlQiKSksCisgICAgICAgIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJjaXR5IiwgY29sdW1uPUBDb2x1bW4obmFtZT0iQUNJVFkiKSkKKyAgICB9KQorICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOworICAgIAorICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iQVVUSCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yIHsKKworICAgIC8vIHVzZSBhbGwgZGVmYXVsdHMgZnJvbSBBZGRyZXNzIGNsYXNzIG1hcHBpbmdzCisgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7CisgICAgCisgICAgLi4uCit9CisKK0BFbWJlZGRhYmxlCitwdWJsaWMgY2xhc3MgQWRkcmVzcyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKKyAgICBAQ29sdW1uKGNvbHVtbkRlZmluaXRpb249IkNIQVIoMikiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOworICAgIHByaXZhdGUgU3RyaW5nIHppcDsKK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBleHByZXNzZWQgaW4gWE1MOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcucHViLkNvbXBhbnkiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJDT01QIi8mZ3Q7CisgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgIC4uLgorICAgICAgICAmbHQ7ZW1iZWRkZWQgbmFtZT0iYWRkcmVzcyImZ3Q7CisgICAgICAgICAgICAmbHQ7YXR0cmlidXRlLW92ZXJyaWRlIG5hbWU9InN0cmVldCImZ3Q7CisgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IlNUUlQiLyZndDsKKyAgICAgICAgICAgICZsdDsvYXR0cmlidXRlLW92ZXJyaWRlJmd0OworICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZS1vdmVycmlkZSBuYW1lPSJjaXR5IiZndDsKKyAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQUNJVFkiLyZndDsKKyAgICAgICAgICAgICZsdDsvYXR0cmlidXRlLW92ZXJyaWRlJmd0OworICAgICAgICAmbHQ7L2VtYmVkZGVkJmd0OworICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyZsdDsvZW50aXR5Jmd0OworJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQXV0aG9yIiZndDsKKyAgICAmbHQ7dGFibGUgbmFtZT0iQVVUSCIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7ZW1iZWRkZWQgbmFtZT0iYWRkcmVzcyImZ3Q7CisgICAgICAgICAgICAmbHQ7IS0tIHVzZSBhbGwgZGVmYXVsdHMgZnJvbSBBZGRyZXNzIC0tJmd0OworICAgICAgICAmbHQ7L2VtYmVkZGVkJmd0OworICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyZsdDsvZW50aXR5Jmd0OworJmx0O2VtYmVkZGFibGUgY2xhc3M9Im9yZy5tYWcucHViLkFkZHJlc3MiJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7YmFzaWMgbmFtZT0ic3RyZWV0Ii8mZ3Q7CisgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjaXR5Ii8mZ3Q7CisgICAgICAgICZsdDtiYXNpYyBuYW1lPSJzdGF0ZSImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIGNvbHVtbi1kZWZpbml0aW9uPSJDSEFSKDIpIi8mZ3Q7CisgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICZsdDtiYXNpYyBuYW1lPSJ6aXAiLyZndDsKKyAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CismbHQ7L2VtYmVkZGFibGUmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGFsc28gdXNlIGF0dHJpYnV0ZSBvdmVycmlkZXMgb24gYW4gZW50aXR5IGNsYXNzIHRvIG92ZXJyaWRlIG1hcHBpbmdzCitkZWZpbmVkIGJ5IGl0cyBtYXBwZWQgc3VwZXJjbGFzcyBvciB0YWJsZS1wZXItY2xhc3Mgc3VwZXJjbGFzcy4gVGhlIGV4YW1wbGUKK2JlbG93IHJlLW1hcHMgdGhlIDxsaXRlcmFsPkRvY3VtZW50LnZlcnNpb248L2xpdGVyYWw+IGZpZWxkIHRvIHRoZSA8Y2xhc3NuYW1lPgorQ29udHJhY3Q8L2NsYXNzbmFtZT4gdGFibGUncyA8bGl0ZXJhbD5DVkVSU0lPTjwvbGl0ZXJhbD4gY29sdW1uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2pvaW5lZF9vdmVyZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgTWFwcGluZyBNYXBwZWQgU3VwZXJjbGFzcyBGaWVsZAorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitATWFwcGVkU3VwZXJjbGFzcworcHVibGljIGFic3RyYWN0IGNsYXNzIERvY3VtZW50IHsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUoc2NoZW1hPSJDTlRSQ1QiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSJDVFlQRSIpCitAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0idmVyc2lvbiIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9IkNWRVJTSU9OIikpCitwdWJsaWMgY2xhc3MgQ29udHJhY3QKKyAgICBleHRlbmRzIERvY3VtZW50IHsKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBleHByZXNzZWQgaW4gWE1MIGZvcm06CisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O21hcHBlZC1zdXBlcmNsYXNzIGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLkRvY3VtZW50IiZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgJmx0O3ZlcnNpb24gbmFtZT0idmVyc2lvbiImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IlZFUlMiJmd0OworICAgICAgICAmbHQ7L3ZlcnNpb24mZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyZsdDsvbWFwcGVkLXN1cGVyY2xhc3MmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLkNvbnRyYWN0IiZndDsKKyAgICAmbHQ7dGFibGUgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAmbHQ7aW5oZXJpdGFuY2Ugc3RyYXRlZ3k9IkpPSU5FRCIvJmd0OworICAgICZsdDtkaXNjcmltaW5hdG9yLWNvbHVtbiBuYW1lPSJDVFlQRSIvJmd0OworICAgICZsdDthdHRyaWJ1dGUtb3ZlcnJpZGUgbmFtZT0idmVyc2lvbiImZ3Q7CisgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQ1ZFUlNJT04iLyZndDsKKyAgICAmbHQ7L2F0dHJpYnV0ZS1vdmVycmlkZSZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19yZWwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERpcmVjdCBSZWxhdGlvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX3JlbCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0IHJlbGF0aW9uIGZpZWxkcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19yZWwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBkaXJlY3QgcmVsYXRpb25zCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfcmVsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgb25lLW9uZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfcmVsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFueS1vbmUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0EgZGlyZWN0IHJlbGF0aW9uIGlzIGEgbm9uLWVtYmVkZGVkIHBlcnNpc3RlbnQgZmllbGQgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0bworYW5vdGhlciBlbnRpdHkuIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hbnl0b29uZSI+bWFueSB0byBvbmU8L2xpbms+CithbmQgPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfb25ldG9vbmUiPm9uZSB0byBvbmU8L2xpbms+IG1ldGFkYXRhIGZpZWxkCit0eXBlcyBhcmUgbWFwcGVkIGFzIGRpcmVjdCByZWxhdGlvbnMuIE91ciBtb2RlbCBoYXMgdGhyZWUgZGlyZWN0IHJlbGF0aW9uczoKKzxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4ncyA8bGl0ZXJhbD5wdWJsaXNoZXI8L2xpdGVyYWw+IGZpZWxkIGlzIGEgZGlyZWN0CityZWxhdGlvbiB0byBhIDxjbGFzc25hbWU+Q29tcGFueTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPidzCis8bGl0ZXJhbD5jb3ZlckFydGljbGU8L2xpdGVyYWw+IGZpZWxkIGlzIGEgZGlyZWN0IHJlbGF0aW9uIHRvIDxjbGFzc25hbWU+CitBcnRpY2xlPC9jbGFzc25hbWU+LCBhbmQgdGhlIDxsaXRlcmFsPkxpbmVJdGVtLm1hZ2F6aW5lPC9saXRlcmFsPiBmaWVsZCBpcyBhCitkaXJlY3QgcmVsYXRpb24gdG8gYSA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+LiBEaXJlY3QgcmVsYXRpb25zIGFyZQorcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGFiYXNlIGJ5IGZvcmVpZ24ga2V5IGNvbHVtbnM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCAzNzQgeCAzODYgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9qcGEtZGlyZWN0LXJlbGF0aW9uLnBuZyIgd2lkdGg9IjI0OXB4Ii8+CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICAgICAgPHBhcmE+CitZb3UgdHlwaWNhbGx5IG1hcCBhIGRpcmVjdCByZWxhdGlvbiB3aXRoIDxjbGFzc25hbWU+Sm9pbkNvbHVtbjwvY2xhc3NuYW1lPgorYW5ub3RhdGlvbnMgZGVzY3JpYmluZyBob3cgdGhlIGxvY2FsIGZvcmVpZ24ga2V5IGNvbHVtbnMgam9pbiB0byB0aGUgcHJpbWFyeSBrZXkKK2NvbHVtbnMgb2YgdGhlIHJlbGF0ZWQgcmVjb3JkLiBUaGUgPGNsYXNzbmFtZT5Kb2luQ29sdW1uPC9jbGFzc25hbWU+IGFubm90YXRpb24KK2V4cG9zZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLiBEZWZhdWx0cyB0bwordGhlIHJlbGF0aW9uIGZpZWxkIG5hbWUsIHBsdXMgYW4gdW5kZXJzY29yZSwgcGx1cyB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZAorcHJpbWFyeSBrZXkgY29sdW1uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5Citjb2x1bW4gYmVpbmcgam9pbmVkIHRvLiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBpZGVudGl0eSBmaWVsZCBpbiB0aGUgcmVsYXRlZAorZW50aXR5IGNsYXNzLCB0aGUgam9pbiBjb2x1bW4gbmFtZSBkZWZhdWx0cyB0byB0aGUgbmFtZSBvZiB0aGUgaWRlbnRpdHkgZmllbGQncworY29sdW1uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiB1bmlxdWU8L2xpdGVyYWw+OiBXaGV0aGVyIHRoaXMgY29sdW1uIGlzIGd1YXJhbnRlZWQgdG8gaG9sZAordW5pcXVlIHZhbHVlcyBmb3IgYWxsIHJvd3MuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPkpvaW5Db2x1bW48L2NsYXNzbmFtZT4gYWxzbyBoYXMgdGhlIHNhbWUgPGxpdGVyYWw+IG51bGxhYmxlPC9saXRlcmFsPgorLCA8bGl0ZXJhbD5pbnNlcnRhYmxlPC9saXRlcmFsPiwgPGxpdGVyYWw+IHVwZGF0YWJsZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPgorY29sdW1uRGVmaW5pdGlvbjwvbGl0ZXJhbD4sIGFuZCA8bGl0ZXJhbD50YWJsZTwvbGl0ZXJhbD4gcHJvcGVydGllcyBhcyB0aGUKKzxjbGFzc25hbWU+IENvbHVtbjwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLiBTZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2NvbHVtbiIvPiBmb3IgZGV0YWlscyBvbiB0aGVzZQorcHJvcGVydGllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPmpvaW4tY29sdW1uPC9saXRlcmFsPiBlbGVtZW50IHJlcHJlc2VudHMgYSBqb2luIGNvbHVtbiBpbiBYTUwuIEl0cworYXR0cmlidXRlcyBtaXJyb3IgdGhlIGFib3ZlIGFubm90YXRpb24ncyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnJlZmVyZW5jZWQtY29sdW1uLW5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD51bmlxdWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5udWxsYWJsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmluc2VydGFibGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD51cGRhdGFibGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5jb2x1bW4tZGVmaW5pdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2x1bW5zIGludm9sdmVkIGluIHRoZSBqb2luLCBhcyB3aGVuIGEgPGNsYXNzbmFtZT4KK0xpbmVJdGVtPC9jbGFzc25hbWU+IHJlZmVyZW5jZXMgYSA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+IGluIG91ciBtb2RlbCwKK3RoZSA8Y2xhc3NuYW1lPkpvaW5Db2x1bW5zPC9jbGFzc25hbWU+IGFubm90YXRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuIGFycmF5CitvZiA8Y2xhc3NuYW1lPkpvaW5Db2x1bW48L2NsYXNzbmFtZT4gdmFsdWVzLiBJbiBYTUwsIHNpbXBseSBsaXN0IG11bHRpcGxlCis8bGl0ZXJhbD5qb2luLWNvbHVtbjwvbGl0ZXJhbD4gZWxlbWVudHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgc3VwcG9ydHMgbWFueSBub24tc3RhbmRhcmQgam9pbnMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfbm90ZXNfbm9uc3Rkam9pbnMiLz4gaW4gdGhlIFJlZmVyZW5jZQorR3VpZGUgZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX3JlbGV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERpcmVjdCBSZWxhdGlvbiBGaWVsZCBNYXBwaW5nCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3BhY2thZ2Ugb3JnLm1hZzsKKworQFRhYmxlKG5hbWU9IkFVVEgiKQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKworICAgIEBDb2x1bW4obGVuZ3RoPTkpCisgICAgQElkIHByaXZhdGUgU3RyaW5nIGlzYm47CisgICAgQElkIHByaXZhdGUgU3RyaW5nIHRpdGxlOworCisgICAgQE9uZVRvT25lCisgICAgQEpvaW5Db2x1bW4obmFtZT0iQ09WRVJfSUQiIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSJJRCIpCisgICAgcHJpdmF0ZSBBcnRpY2xlIGNvdmVyQXJ0aWNsZTsKKworICAgIEBNYW55VG9PbmUKKyAgICBASm9pbkNvbHVtbihuYW1lPSJQVUJfSUQiIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSJDSUQiKQorICAgIHByaXZhdGUgQ29tcGFueSBwdWJsaXNoZXI7CisKKyAgICAuLi4KK30KKworQFRhYmxlKG5hbWU9IkFSVCIpCitwdWJsaWMgY2xhc3MgQXJ0aWNsZSB7CisKKyAgICBASWQgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnB1YjsKKworQFRhYmxlKG5hbWU9IkNPTVAiKQorcHVibGljIGNsYXNzIENvbXBhbnkgeworCisgICAgQENvbHVtbihuYW1lPSJDSUQiKQorICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICAuLi4KK30KKworCitwYWNrYWdlIG9yZy5tYWcuc3Vic2NyaWJlOworCitwdWJsaWMgY2xhc3MgU3Vic2NyaXB0aW9uIHsKKyAgICAuLi4KKworICAgIEBUYWJsZShuYW1lPSJMSU5FX0lURU0iLCBzY2hlbWE9IkNOVFJDVCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lSXRlbQorICAgICAgICBleHRlbmRzIENvbnRyYWN0IHsKKworICAgICAgICBATWFueVRvT25lCisgICAgICAgIEBKb2luQ29sdW1ucyh7CisgICAgICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJNQUdfSVNCTiIgcmVmZXJlbmNlZENvbHVtbk5hbWU9IklTQk4iKSwKKyAgICAgICAgICAgIEBKb2luQ29sdW1uKG5hbWU9Ik1BR19USVRMRSIgcmVmZXJlbmNlZENvbHVtbk5hbWU9IlRJVExFIikKKyAgICAgICAgfSkKKyAgICAgICAgcHJpdmF0ZSBNYWdhemluZSBtYWdhemluZTsKKworICAgICAgICAuLi4KKyAgICB9Cit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHNhbWUgbWV0YWRhdGEgZXhwcmVzc2VkIGluIFhNTCBmb3JtOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJNQUciLyZndDsKKyAgICAmbHQ7aWQtY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUuTWFnYXppbmVJZCIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0iaXNibiImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIGxlbmd0aD0iOSIvJmd0OworICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0idGl0bGUiLyZndDsKKyAgICAgICAgJmx0O29uZS10by1vbmUgbmFtZT0iY292ZXJBcnRpY2xlIiZndDsKKyAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJDT1ZFUl9JRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iSUQiLyZndDsKKyAgICAgICAgJmx0Oy9vbmUtdG8tb25lJmd0OworICAgICAgICAmbHQ7bWFueS10by1vbmUgbmFtZT0icHVibGlzaGVyIiZndDsKKyAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJQVUJfSUMiIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IkNJRCIvJmd0OworICAgICAgICAmbHQ7L21hbnktdG8tb25lJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CismbHQ7L2VudGl0eSZndDsKKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuQXJ0aWNsZSImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IkFSVCIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnB1Yi5Db21wYW55IiZndDsKKyAgICAmbHQ7dGFibGUgbmFtZT0iQ09NUCIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJDSUQiLyZndDsKKyAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7CismbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5TdWJzY3JpcHRpb24uTGluZUl0ZW0iJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJMSU5FX0lURU0iIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgJmx0O3ByaW1hcnkta2V5LWpvaW4tY29sdW1uIG5hbWU9IklEIiByZWZlcmVuY2VkLWNvbHVtbi1uYW1lPSJQSyIvJmd0OworICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAmbHQ7bWFueS10by1vbmUgbmFtZT0ibWFnYXppbmUiJmd0OworICAgICAgICAgICAgJmx0O2pvaW4tY29sdW1uIG5hbWU9Ik1BR19JU0JOIiByZWZlcmVuY2VkLWNvbHVtbi1uYW1lPSJJU0JOIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7am9pbi1jb2x1bW4gbmFtZT0iTUFHX1RJVExFIiByZWZlcmVuY2VkLWNvbHVtbi1uYW1lPSJUSVRMRSIvJmd0OworICAgICAgICAmbHQ7L21hbnktdG8tb25lJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CismbHQ7L2VudGl0eSZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gdGhlIGVudGl0aWVzIGluIGEgb25lIHRvIG9uZSByZWxhdGlvbiBqb2luIG9uIHNoYXJlZCBwcmltYXJ5IGtleSB2YWx1ZXMKK3JhdGhlciB0aGFuIHNlcGFyYXRlIGZvcmVpZ24ga2V5IGNvbHVtbnMsIHVzZSB0aGUgPGNsYXNzbmFtZT4KK1ByaW1hcnlLZXlKb2luQ29sdW1uKHMpPC9jbGFzc25hbWU+IGFubm90YXRpb24gb3IgPGxpdGVyYWw+CitwcmltYXJ5LWtleS1qb2luLWNvbHVtbjwvbGl0ZXJhbD4gZWxlbWVudHMgaW4gcGxhY2Ugb2YgPGNsYXNzbmFtZT5Kb2luQ29sdW1uKHMpCis8L2NsYXNzbmFtZT4gLyA8bGl0ZXJhbD4gam9pbi1jb2x1bW48L2xpdGVyYWw+IGVsZW1lbnRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19hc3NvY2NvbGwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEpvaW4gVGFibGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2Fzc29jY29sbCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRpb24gdGFibGUgY29sbGVjdGlvbiBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21hcHBpbmdfYXNzb2Njb2xsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgam9pbiB0YWJsZSBjb2xsZWN0aW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBqb2luIHRhYmxlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tYXBwaW5nX2Fzc29jY29sbCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG9uZS1tYW55CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19hc3NvY2NvbGwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYW55LW1hbnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0EgPGVtcGhhc2lzPmpvaW4gdGFibGU8L2VtcGhhc2lzPiBjb25zaXN0cyBvZiB0d28gZm9yZWlnbiBrZXlzLiBFYWNoIHJvdyBvZiBhCitqb2luIHRhYmxlIGFzc29jaWF0ZXMgdHdvIG9iamVjdHMgdG9nZXRoZXIuIEpQQSB1c2VzIGpvaW4gdGFibGVzIHRvCityZXByZXNlbnQgY29sbGVjdGlvbnMgb2YgZW50aXR5IG9iamVjdHM6IG9uZSBmb3JlaWduIGtleSByZWZlcnMgYmFjayB0byB0aGUKK2NvbGxlY3Rpb24ncyBvd25lciwgYW5kIHRoZSBvdGhlciByZWZlcnMgdG8gYSBjb2xsZWN0aW9uIGVsZW1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX29uZXRvbWFueSI+b25lIHRvIG1hbnk8L2xpbms+IGFuZAorPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfbWFueXRvbWFueSI+bWFueSB0byBtYW55PC9saW5rPiBtZXRhZGF0YSBmaWVsZAordHlwZXMgY2FuIG1hcCB0byBqb2luIHRhYmxlcy4gU2V2ZXJhbCBmaWVsZHMgaW4gb3VyIG1vZGVsIHVzZSBqb2luIHRhYmxlCittYXBwaW5ncywgaW5jbHVkaW5nIDxsaXRlcmFsPk1hZ2F6aW5lLmFydGljbGVzPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+CitBcnRpY2xlLmF1dGhvcnM8L2xpdGVyYWw+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgMzkxIHggNDA3IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWcvanBhLWFzc29jLXRhYmxlLnBuZyIgd2lkdGg9IjI2MXB4Ii8+CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICAgICAgPHBhcmE+CitZb3UgZGVmaW5lIGpvaW4gdGFibGVzIHdpdGggdGhlIDxjbGFzc25hbWU+Sm9pblRhYmxlPC9jbGFzc25hbWU+IGFubm90YXRpb24uCitUaGlzIGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGFibGUgbmFtZS4gSWYgbm90IGdpdmVuLCB0aGUgbmFtZSBvZiB0aGUgdGFibGUKK2RlZmF1bHRzIHRvIHRoZSBuYW1lIG9mIHRoZSBvd25pbmcgZW50aXR5J3MgdGFibGUsIHBsdXMgYW4gdW5kZXJzY29yZSwgcGx1cyB0aGUKK25hbWUgb2YgdGhlIHJlbGF0ZWQgZW50aXR5J3MgdGFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgY2F0YWxvZzwvbGl0ZXJhbD46IFRhYmxlIGNhdGFsb2cuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgc2NoZW1hPC9saXRlcmFsPjogVGFibGUgc2NoZW1hLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Sm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zPC9saXRlcmFsPjogQXJyYXkgb2YgPGNsYXNzbmFtZT5Kb2luQ29sdW1uCis8L2NsYXNzbmFtZT4gc3Nob3dpbmcgaG93IHRvIGFzc29jaWF0ZSBqb2luIHRhYmxlIHJlY29yZHMgd2l0aCB0aGUgb3duaW5nIHJvdyBpbgordGhlIHByaW1hcnkgdGFibGUuIFRoaXMgcHJvcGVydHkgbWlycm9ycyB0aGUgPGxpdGVyYWw+cGtKb2luQ29sdW1uczwvbGl0ZXJhbD4KK3Byb3BlcnR5IG9mIHRoZSA8Y2xhc3NuYW1lPiBTZWNvbmRhcnlUYWJsZTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGluCitmdW5jdGlvbmFsaXR5LiBTZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfc2Vjb25kYXJ5Ii8+IHRvCityZWZyZXNoIHlvdXIgbWVtb3J5IG9uIHNlY29uZGFyeSB0YWJsZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJZiB0aGlzIGlzIGEgYmlkaXJlY3Rpb25hbCByZWxhdGlvbiAoc2VlCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYXBwZWRieSIvPiApLCB0aGUgbmFtZSBvZiBhIGpvaW4gY29sdW1uCitkZWZhdWx0cyB0byB0aGUgaW52ZXJzZSBmaWVsZCBuYW1lLCBwbHVzIGFuIHVuZGVyc2NvcmUsIHBsdXMgdGhlIHJlZmVyZW5jZWQKK3ByaW1hcnkga2V5IGNvbHVtbiBuYW1lLiBPdGhlcndpc2UsIHRoZSBqb2luIGNvbHVtbiBuYW1lIGRlZmF1bHRzIHRvIHRoZSBmaWVsZCdzCitvd25pbmcgZW50aXR5IG5hbWUsIHBsdXMgYW4gdW5kZXJzY29yZSwgcGx1cyB0aGUgcmVmZXJlbmNlZCBwcmltYXJ5IGtleSBjb2x1bW4KK25hbWUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5Kb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zPC9saXRlcmFsPjogQXJyYXkgb2YgPGNsYXNzbmFtZT4KK0pvaW5Db2x1bW5zPC9jbGFzc25hbWU+IHNob3dpbmcgaG93IHRvIGFzc29jaWF0ZSBqb2luIHRhYmxlIHJlY29yZHMgd2l0aCB0aGUKK3JlY29yZHMgdGhhdCBmb3JtIHRoZSBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbi4gVGhlc2Ugam9pbiBjb2x1bW5zIGFyZSB1c2VkCitqdXN0IGxpa2UgdGhlIGpvaW4gY29sdW1ucyBmb3IgZGlyZWN0IHJlbGF0aW9ucywgYW5kIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1pbmcKK2RlZmF1bHRzLiBSZWFkIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX3JlbCIvPiBmb3IgYSByZXZpZXcgb2YKK2RpcmVjdCByZWxhdGlvbiBtYXBwaW5nLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5qb2luLXRhYmxlPC9saXRlcmFsPiBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgZWxlbWVudC4gSXQgaGFzIHRoZSBzYW1lCithdHRyaWJ1dGVzIGFzIHRoZSA8bGl0ZXJhbD50YWJsZTwvbGl0ZXJhbD4gZWxlbWVudCwgYnV0IGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvCituZXN0IDxsaXRlcmFsPmpvaW4tY29sdW1uPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+aW52ZXJzZS1qb2luLWNvbHVtbjwvbGl0ZXJhbD4KK2VsZW1lbnRzIGFzIGNoaWxkcmVuLiBXZSBoYXZlIHNlZW4gPGxpdGVyYWw+am9pbi1jb2x1bW48L2xpdGVyYWw+IGVsZW1lbnRzCithbHJlYWR5OyA8bGl0ZXJhbD5pbnZlcnNlLWpvaW4tY29sdW1uPC9saXRlcmFsPiBlbGVtZW50cyBoYXZlIHRoZSBzYW1lCithdHRyaWJ1dGVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitIZXJlIGFyZSB0aGUgam9pbiB0YWJsZSBtYXBwaW5ncyBmb3IgdGhlIGRpYWdyYW0gYWJvdmUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfYXNzb2Njb2xsZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSm9pbiBUYWJsZSBNYXBwaW5nCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3BhY2thZ2Ugb3JnLm1hZzsKKworQEVudGl0eQorQFRhYmxlKG5hbWU9Ik1BRyIpCitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgQENvbHVtbihsZW5ndGg9OSkKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgaXNibjsKKyAgICBASWQgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKyAgICBAT25lVG9NYW55KC4uLikKKyAgICBAT3JkZXJCeQorICAgIEBKb2luVGFibGUobmFtZT0iTUFHX0FSVFMiLAorICAgICAgICBqb2luQ29sdW1ucz17CisgICAgICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJNQUdfSVNCTiIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSJJU0JOIiksCisgICAgICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJNQUdfVElUTEUiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iVElUTEUiKQorICAgICAgICB9LAorICAgICAgICBpbnZlcnNlSm9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iQVJUX0lEIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IklEIikpCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uJmx0O0FydGljbGUmZ3Q7IGFydGljbGVzOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBUlQiKQorcHVibGljIGNsYXNzIEFydGljbGUgeworCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBNYW55VG9NYW55KGNhc2NhZGU9Q2FzY2FkZVR5cGUuUEVSU0lTVCkKKyAgICBAT3JkZXJCeSgibGFzdE5hbWUsIGZpcnN0TmFtZSIpCisgICAgQEpvaW5UYWJsZShuYW1lPSJBUlRfQVVUSFMiLAorICAgICAgICBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSJBUlRfSUQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iSUQiKSwKKyAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IkFVVEhfSUQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iQUlEIikpCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uJmx0O0F1dGhvciZndDsgYXV0aG9yczsKKworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5wdWI7CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBVVRIIikKK3B1YmxpYyBjbGFzcyBBdXRob3IgeworCisgICAgQENvbHVtbihuYW1lPSJBSUQiLCBjb2x1bW5EZWZpbml0aW9uPSJJTlRFR0VSNjQiKQorICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBleHByZXNzZWQgaW4gWE1MOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUiJmd0OworICAgICZsdDt0YWJsZSBuYW1lPSJNQUciLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgJmx0O2lkIG5hbWU9ImlzYm4iJmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbiBsZW5ndGg9IjkiLyZndDsKKyAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgJmx0O2lkIG5hbWU9InRpdGxlIi8mZ3Q7CisgICAgICAgICZsdDtvbmUtdG8tbWFueSBuYW1lPSJhcnRpY2xlcyImZ3Q7CisgICAgICAgICAgICAmbHQ7b3JkZXItYnkvJmd0OworICAgICAgICAgICAgJmx0O2pvaW4tdGFibGUgbmFtZT0iTUFHX0FSVFMiJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJNQUdfSVNCTiIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iSVNCTiIvJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJNQUdfVElUTEUiIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IlRJVExFIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2pvaW4tdGFibGUmZ3Q7CisgICAgICAgICZsdDsvb25lLXRvLW1hbnkmZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyZsdDsvZW50aXR5Jmd0OworJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5BcnRpY2xlIiZndDsKKyAgICAmbHQ7dGFibGUgbmFtZT0iQVJUIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7bWFueS10by1tYW55IG5hbWU9ImFydGljbGVzIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7b3JkZXItYnkmZ3Q7bGFzdE5hbWUsIGZpcnN0TmFtZSZsdDsvb3JkZXItYnkmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2pvaW4tdGFibGUgbmFtZT0iQVJUX0FVVEhTIiZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2pvaW4tY29sdW1uIG5hbWU9IkFSVF9JRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iSUQiLyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2ludmVyc2Utam9pbi1jb2x1bW4gbmFtZT0iQVVUSF9JRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iQUlEIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9qb2luLXRhYmxlJmd0OworICAgICAgICAgICAgJmx0Oy9tYW55LXRvLW1hbnkmZ3Q7CisgICAgICAgICAgICAuLi4KKyAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CismbHQ7L2VudGl0eSZndDsKKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcucHViLkF1dGhvciImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IkFVVEgiLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQUlEIiBjb2x1bW4tZGVmaW5pdGlvbj0iSU5URUdFUjY0Ii8mZ3Q7CisgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyZsdDsvZW50aXR5Jmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfYmlkaSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQmlkaXJlY3Rpb25hbCBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19iaWRpIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hcHBlZGJ5Ii8+IGludHJvZHVjZWQgYmlkaXJlY3Rpb25hbAorcmVsYXRpb25zLiBUbyBtYXAgYSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLCB5b3UgbWFwIG9uZSBmaWVsZCBub3JtYWxseSB1c2luZyB0aGUKK2Fubm90YXRpb25zIHdlIGhhdmUgY292ZXJlZCB0aHJvdWdob3V0IHRoaXMgY2hhcHRlci4gVGhlbiB5b3UgdXNlIHRoZSA8bGl0ZXJhbD4KK21hcHBlZEJ5PC9saXRlcmFsPiBwcm9wZXJ0eSBvZiB0aGUgb3RoZXIgZmllbGQncyBtZXRhZGF0YSBhbm5vdGF0aW9uIG9yIHRoZQorY29ycmVzcG9uZGluZyA8bGl0ZXJhbD5tYXBwZWQtYnk8L2xpdGVyYWw+IFhNTCBhdHRyaWJ1dGUgdG8gcmVmZXIgdG8gdGhlIG1hcHBlZAorZmllbGQuIExvb2sgZm9yIHRoaXMgcGF0dGVybiBpbiB0aGVzZSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9ucyBhcyB5b3UgcGVydXNlIHRoZQorY29tcGxldGUgbWFwcGluZ3MgYmVsb3c6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5NYWdhemluZS5wdWJsaXNoZXI8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5Db21wYW55LmFnczwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5BcnRpY2xlLmF1dGhvcnM8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5BdXRob3IuYXJ0aWNsZXM8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19tYXAiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE1hcCBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19tYXAiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19tYXAiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQWxsIG1hcCBmaWVsZHMgaW4gSlBBIGFyZSBtb2RlbGVkIG9uIGVpdGhlciBvbmUgdG8gbWFueSBvciBtYW55IHRvCittYW55IGFzc29jaWF0aW9ucy4gVGhlIG1hcCBrZXkgaXMgYWx3YXlzIGRlcml2ZWQgZnJvbSBhbiBhc3NvY2lhdGVkIGVudGl0eSdzCitmaWVsZC4gVGh1cyBtYXAgZmllbGRzIHVzZSB0aGUgc2FtZSBtYXBwaW5ncyBhcyBhbnkgb25lIHRvIG1hbnkgb3IgbWFueSB0byBtYW55CitmaWVsZHMsIG5hbWVseSBkZWRpY2F0ZWQgPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfYXNzb2Njb2xsIj5qb2luCit0YWJsZXM8L2xpbms+IG9yIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2JpZGkiPmJpZGlyZWN0aW9uYWwKK3JlbGF0aW9uczwvbGluaz4uIFRoZSBvbmx5IGFkZGl0aW9ucyBhcmUgdGhlIDxjbGFzc25hbWU+TWFwS2V5PC9jbGFzc25hbWU+Cithbm5vdGF0aW9uIGFuZCA8bGl0ZXJhbD5tYXAta2V5PC9saXRlcmFsPiBlbGVtZW50IHRvIGRlY2xhcmUgdGhlIGtleSBmaWVsZC4gV2UKK2NvdmVyZWQgdGhlc2UgYWRkaXRpb25zIGluIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hcGtleSIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDM4MiB4IDI3NCAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1tYXAucG5nIiB3aWR0aD0iMjU1cHgiLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBleGFtcGxlIGJlbG93IG1hcHMgPGNsYXNzbmFtZT5TdWJzY3JpcHRpb248L2NsYXNzbmFtZT4ncyBtYXAgb2YgPGNsYXNzbmFtZT4KK0xpbmVJdGVtPC9jbGFzc25hbWU+cyB0byB0aGUgPGxpdGVyYWw+U1VCX0lURU1TPC9saXRlcmFsPiBqb2luIHRhYmxlLiBUaGUga2V5Citmb3IgZWFjaCBtYXAgZW50cnkgaXMgdGhlIDxjbGFzc25hbWU+IExpbmVJdGVtPC9jbGFzc25hbWU+J3MgPGxpdGVyYWw+bnVtCis8L2xpdGVyYWw+IGZpZWxkIHZhbHVlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19tYXBwaW5nX21hcGV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpvaW4gVGFibGUgTWFwIE1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnLnN1YnNjcmliZTsKKworQEVudGl0eQorQFRhYmxlKG5hbWU9IlNVQiIsIHNjaGVtYT0iQ05UUkNUIikKK3B1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb24geworCisgICAgQE9uZVRvTWFueShjYXNjYWRlPXtDYXNjYWRlVHlwZS5QRVJTSVNULENhc2NhZGVUeXBlLlJFTU9WRX0pCisgICAgQE1hcEtleShuYW1lPSJudW0iKQorICAgIEBKb2luVGFibGUobmFtZT0iU1VCX0lURU1TIiwgc2NoZW1hPSJDTlRSQ1QiLAorICAgICAgICBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSJTVUJfSUQiKSwKKyAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IklURU1fSUQiKSkKKyAgICBwcml2YXRlIE1hcCZsdDtMb25nLExpbmVJdGVtJmd0OyBpdGVtczsKKworICAgIC4uLgorCisgICAgQEVudGl0eQorICAgIEBUYWJsZShuYW1lPSJMSU5FX0lURU0iLCBzY2hlbWE9IkNOVFJDVCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lSXRlbQorICAgICAgICBleHRlbmRzIENvbnRyYWN0IHsKKworICAgICAgICBwcml2YXRlIGxvbmcgbnVtOworCisgICAgICAgIC4uLgorICAgIH0KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBleHByZXNzZWQgaW4gWE1MOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlN1YnNjcmlwdGlvbiImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IlNVQiIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgLi4uCisgICAgICAgICZsdDtvbmUtdG8tbWFueSBuYW1lPSJpdGVtcyImZ3Q7CisgICAgICAgICAgICAmbHQ7bWFwLWtleSBuYW1lPSJudW0iJmd0OworICAgICAgICAgICAgJmx0O2pvaW4tdGFibGUgbmFtZT0iTUFHX0FSVFMiJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJNQUdfSVNCTiIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iSVNCTiIvJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJNQUdfVElUTEUiIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IlRJVExFIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2pvaW4tdGFibGUmZ3Q7CisgICAgICAgICAgICAmbHQ7Y2FzY2FkZSZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1yZW1vdmUvJmd0OworICAgICAgICAgICAgJmx0Oy9jYXNjYWRlJmd0OworICAgICAgICAmbHQ7L29uZS10by1tYW55Jmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CismbHQ7L2VudGl0eSZndDsKKyZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlN1YnNjcmlwdGlvbi5MaW5lSXRlbSImZ3Q7CisgICAgJmx0O3RhYmxlIG5hbWU9IkxJTkVfSVRFTSIgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgLi4uCisgICAgICAgICZsdDtiYXNpYyBuYW1lPSJudW0iLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworJmx0Oy9lbnRpdHkmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19mdWxsIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgVGhlIENvbXBsZXRlIE1hcHBpbmdzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorV2UgYmVnYW4gdGhpcyBjaGFwdGVyIHdpdGggdGhlIGdvYWwgb2YgbWFwcGluZyB0aGUgZm9sbG93aW5nIG9iamVjdCBtb2RlbDoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNTUzIHggNTgwIChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9qcGEtbWV0YS1tb2RlbC5wbmciIHdpZHRoPSIzNjlweCIvPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPHBhcmE+CitUaGF0IGdvYWwgaGFzIG5vdyBiZWVuIG1ldC4gSW4gdGhlIGNvdXJzZSBvZiBleHBsYWluaW5nIEpQQSdzIG9iamVjdC1yZWxhdGlvbmFsCittYXBwaW5nIG1ldGFkYXRhLCB3ZSBzbG93bHkgYnVpbHQgdGhlIHJlcXVpc2l0ZSBzY2hlbWEgYW5kIG1hcHBpbmdzIGZvciB0aGUKK2NvbXBsZXRlIG1vZGVsLiBGaXJzdCwgdGhlIGRhdGFiYXNlIHNjaGVtYToKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNDkwIHggNjYyIChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9qcGEtZGF0YS1tb2RlbC5wbmciIHdpZHRoPSIzMjZweCIvPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPHBhcmE+CitBbmQgZmluYWxseSwgdGhlIGNvbXBsZXRlIGVudGl0eSBtYXBwaW5ncy4gV2UgaGF2ZSB0cmltbWVkIHRoZSBtYXBwaW5ncyB0byB0YWtlCithZHZhbnRhZ2Ugb2YgSlBBIGRlZmF1bHRzIHdoZXJlIHBvc3NpYmxlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19mdWxsZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEZ1bGwgRW50aXR5IE1hcHBpbmdzCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitASWRDbGFzcyhNYWdhemluZS5NYWdhemluZUlkLmNsYXNzKQorQFRhYmxlKG5hbWU9Ik1BRyIpCitARGlzY3JpbWluYXRvclZhbHVlKCJNYWciKQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKworICAgIEBDb2x1bW4obGVuZ3RoPTkpCisgICAgQElkIHByaXZhdGUgU3RyaW5nIGlzYm47CisgICAgQElkIHByaXZhdGUgU3RyaW5nIHRpdGxlOworCisgICAgQENvbHVtbihuYW1lPSJWRVJTIikKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBkb3VibGUgcHJpY2U7CisKKyAgICBAQ29sdW1uKG5hbWU9IkNPUElFUyIpCisgICAgcHJpdmF0ZSBpbnQgY29waWVzU29sZDsKKworICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgCisgICAgICAgIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLlBFUlNJU1QsQ2FzY2FkZVR5cGUuUkVNT1ZFfSkKKyAgICBASm9pbkNvbHVtbihuYW1lPSJDT1ZFUl9JRCIpCisgICAgcHJpdmF0ZSBBcnRpY2xlIGNvdmVyQXJ0aWNsZTsKKworICAgIEBPbmVUb01hbnkoY2FzY2FkZT17Q2FzY2FkZVR5cGUuUEVSU0lTVCxDYXNjYWRlVHlwZS5SRU1PVkV9KQorICAgIEBPcmRlckJ5CisgICAgQEpvaW5UYWJsZShuYW1lPSJNQUdfQVJUUyIsCisgICAgICAgIGpvaW5Db2x1bW5zPXsKKyAgICAgICAgICAgIEBKb2luQ29sdW1uKG5hbWU9Ik1BR19JU0JOIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IklTQk4iKSwKKyAgICAgICAgICAgIEBKb2luQ29sdW1uKG5hbWU9Ik1BR19USVRMRSIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSJUSVRMRSIpCisgICAgICAgIH0sCisgICAgICAgIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSJBUlRfSUQiKSkKKyAgICBwcml2YXRlIENvbGxlY3Rpb24mbHQ7QXJ0aWNsZSZndDsgYXJ0aWNsZXM7CisKKyAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBjYXNjYWRlPUNhc2NhZGVUeXBlLlBFUlNJU1QpCisgICAgQEpvaW5Db2x1bW4obmFtZT0iUFVCX0lEIikKKyAgICBwcml2YXRlIENvbXBhbnkgcHVibGlzaGVyOyAKKworICAgIEBUcmFuc2llbnQgcHJpdmF0ZSBieXRlW10gZGF0YTsKKworCisgICAgLi4uCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hZ2F6aW5lSWQgeworICAgICAgICAuLi4KKyAgICB9Cit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBUlQiLCB1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlKGNvbHVtbk5hbWVzPSJUSVRMRSIpKQorQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IkFydGljbGVTZXEiLCBzZXF1ZW5jZU5hbWU9IkFSVF9TRVEiKQorcHVibGljIGNsYXNzIEFydGljbGUgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBnZW5lcmF0b3I9IkFydGljbGVTZXEiKSAKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICBAQ29sdW1uKG5hbWU9IlZFUlMiKQorICAgIEBWZXJzaW9uIHByaXZhdGUgaW50IHZlcnNpb247CisKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKyAgICBwcml2YXRlIGJ5dGVbXSBjb250ZW50OworCisgICAgQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS5QRVJTSVNUKQorICAgIEBPcmRlckJ5KCJsYXN0TmFtZSwgZmlyc3ROYW1lIikKKyAgICBASm9pblRhYmxlKG5hbWU9IkFSVF9BVVRIUyIsCisgICAgICAgIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IkFSVF9JRCIpLAorICAgICAgICBpbnZlcnNlSm9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iQVVUSF9JRCIpKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtBdXRob3ImZ3Q7IGF1dGhvcnM7CisKKyAgICAuLi4KK30KKworCitwYWNrYWdlIG9yZy5tYWcucHViOworCitARW50aXR5CitAVGFibGUobmFtZT0iQ09NUCIpCitwdWJsaWMgY2xhc3MgQ29tcGFueSB7CisKKyAgICBAQ29sdW1uKG5hbWU9IkNJRCIpCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAQ29sdW1uKG5hbWU9IlJFViIpCisgICAgcHJpdmF0ZSBkb3VibGUgcmV2ZW51ZTsKKworICAgIEBFbWJlZGRlZAorICAgIEBBdHRyaWJ1dGVPdmVycmlkZXMoeworICAgICAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0ic3RyZWV0IiwgY29sdW1uPUBDb2x1bW4obmFtZT0iU1RSVCIpKSwKKyAgICAgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9ImNpdHkiLCBjb2x1bW49QENvbHVtbihuYW1lPSJBQ0lUWSIpKQorICAgIH0pCisgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7CisgICAgCisgICAgQE9uZVRvTWFueShtYXBwZWRCeT0icHVibGlzaGVyIiwgY2FzY2FkZT1DYXNjYWRlVHlwZS5QRVJTSVNUKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtNYWdhemluZSZndDsgbWFnczsKKworICAgIEBPbmVUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS5QRVJTSVNULENhc2NhZGVUeXBlLlJFTU9WRSkKKyAgICBASm9pblRhYmxlKG5hbWU9IkNPTVBfU1VCUyIsCisgICAgICAgIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IkNPTVBfSUQiKSwKKyAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IlNVQl9JRCIpKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtTdWJzY3JpcHRpb24mZ3Q7IHN1YnNjcmlwdGlvbnM7CisKKyAgICAuLi4KK30KKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkFVVEgiKQorcHVibGljIGNsYXNzIEF1dGhvciB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuVEFCTEUsIGdlbmVyYXRvcj0iQXV0aG9yR2VuIikKKyAgICBAVGFibGVHZW5lcmF0b3IobmFtZT0iQXV0aG9yR2VuIiwgdGFibGVOYW1lPSJBVVRIX0dFTiIsIHBrQ29sdW1uTmFtZT0iUEsiLAorICAgICAgICB2YWx1ZUNvbHVtbk5hbWU9IkFJRCIpCisgICAgQENvbHVtbihuYW1lPSJBSUQiLCBjb2x1bW5EZWZpbml0aW9uPSJJTlRFR0VSNjQiKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIEBDb2x1bW4obmFtZT0iRk5BTUUiKQorICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKKworICAgIEBDb2x1bW4obmFtZT0iTE5BTUUiKQorICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCisgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7CisgICAgCisgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9ImF1dGhvcnMiLCBjYXNjYWRlPUNhc2NhZGVUeXBlLlBFUlNJU1QpCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uJmx0O0FydGljbGUmZ3Q7IGFydHM7CisKKyAgICAuLi4KK30KKworQEVtYmVkZGFibGUKK3B1YmxpYyBjbGFzcyBBZGRyZXNzIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsKKyAgICBwcml2YXRlIFN0cmluZyBjaXR5OworICAgIEBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbj0iQ0hBUigyKSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgemlwOworfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5zdWJzY3JpYmU7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnQgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUoc2NoZW1hPSJDTlRSQ1QiKQorQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpCitARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSJDVFlQRSIpCitwdWJsaWMgY2xhc3MgQ29udHJhY3QKKyAgICBleHRlbmRzIERvY3VtZW50IHsKKworICAgIEBMb2IKKyAgICBwcml2YXRlIFN0cmluZyB0ZXJtczsKKworICAgIC4uLgorfQorCitARW50aXR5CitAVGFibGUobmFtZT0iU1VCIiwgc2NoZW1hPSJDTlRSQ1QiKQorQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT0iS0lORCIsIGRpc2NyaW1pbmF0b3JUeXBlPURpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpCitARGlzY3JpbWluYXRvclZhbHVlKCIxIikKK3B1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb24geworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLklERU5USVRZKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBDb2x1bW4obmFtZT0iVkVSUyIpCisgICAgQFZlcnNpb24gcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIEBDb2x1bW4obmFtZT0iU1RBUlQiKQorICAgIHByaXZhdGUgRGF0ZSBzdGFydERhdGU7CisKKyAgICBAQ29sdW1uKG5hbWU9IlBBWSIpCisgICAgcHJpdmF0ZSBkb3VibGUgcGF5bWVudDsKKworICAgIEBPbmVUb01hbnkoY2FzY2FkZT17Q2FzY2FkZVR5cGUuUEVSU0lTVCxDYXNjYWRlVHlwZS5SRU1PVkV9KQorICAgIEBNYXBLZXkobmFtZT0ibnVtIikKKyAgICBASm9pblRhYmxlKG5hbWU9IlNVQl9JVEVNUyIsIHNjaGVtYT0iQ05UUkNUIiwKKyAgICAgICAgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iU1VCX0lEIiksCisgICAgICAgIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSJJVEVNX0lEIikpCisgICAgcHJpdmF0ZSBNYXAmbHQ7TG9uZyxMaW5lSXRlbSZndDsgaXRlbXM7CisKKyAgICAuLi4KKworICAgIEBFbnRpdHkKKyAgICBAVGFibGUobmFtZT0iTElORV9JVEVNIiwgc2NoZW1hPSJDTlRSQ1QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGluZUl0ZW0KKyAgICAgICAgZXh0ZW5kcyBDb250cmFjdCB7CisKKyAgICAgICAgQENvbHVtbihuYW1lPSJDT01NIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudHM7CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgcHJpY2U7CisgICAgICAgIHByaXZhdGUgbG9uZyBudW07CisKKyAgICAgICAgQE1hbnlUb09uZQorICAgICAgICBASm9pbkNvbHVtbnMoeworICAgICAgICAgICAgIEBKb2luQ29sdW1uKG5hbWU9Ik1BR19JU0JOIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IklTQk4iKSwKKyAgICAgICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJNQUdfVElUTEUiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iVElUTEUiKQorICAgICAgICB9KQorICAgICAgICBwcml2YXRlIE1hZ2F6aW5lIG1hZ2F6aW5lOworICAgICAgICAuLi4KKyAgICB9Cit9CisKK0BFbnRpdHkobmFtZT0iTGlmZXRpbWUiKQorQERpc2NyaW1pbmF0b3JWYWx1ZSgiMiIpCitwdWJsaWMgY2xhc3MgTGlmZXRpbWVTdWJzY3JpcHRpb24KKyAgICBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CisKKyAgICBAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICAgQENvbHVtbihuYW1lPSJFTElURSIpCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEVsaXRlQ2x1YiAoKSB7IC4uLiB9CisgICAgcHVibGljIHZvaWQgc2V0RWxpdGVDbHViIChib29sZWFuIGVsaXRlKSB7IC4uLiB9CisKKyAgICAuLi4KK30KKworQEVudGl0eShuYW1lPSJUcmlhbCIpCitARGlzY3JpbWluYXRvclZhbHVlKCIzIikKK3B1YmxpYyBjbGFzcyBUcmlhbFN1YnNjcmlwdGlvbgorICAgIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKKworICAgIEBDb2x1bW4obmFtZT0iRU5EIikKKyAgICBwdWJsaWMgRGF0ZSBnZXRFbmREYXRlICgpIHsgLi4uIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmREYXRlIChEYXRlIGVuZCkgeyAuLi4gfQorCisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBleHByZXNzZWQgaW4gWE1MIGZvcm06CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIG9ybV8xXzAueHNkIgorICAgIHZlcnNpb249IjEuMCImZ3Q7CisgICAgJmx0O21hcHBlZC1zdXBlcmNsYXNzIGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5Eb2N1bWVudCImZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Z2VuZXJhdGVkLXZhbHVlIHN0cmF0ZWd5PSJJREVOVElUWSIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9tYXBwZWQtc3VwZXJjbGFzcyZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLk1hZ2F6aW5lIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9Ik1BRyIvJmd0OworICAgICAgICAmbHQ7aWQtY2xhc3M9Im9yZy5tYWcuTWFnYXppbmUuTWFnYXppbmVJZCIvJmd0OworICAgICAgICAmbHQ7ZGlzY3JpbWluYXRvci12YWx1ZSZndDtNYWcmbHQ7L2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlzYm4iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbGVuZ3RoPSI5Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9InRpdGxlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0ibmFtZSIvJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InByaWNlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iY29waWVzU29sZCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJDT1BJRVMiLyZndDsKKyAgICAgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICAgICAmbHQ7dmVyc2lvbiBuYW1lPSJ2ZXJzaW9uIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IlZFUlMiLyZndDsKKyAgICAgICAgICAgICZsdDsvdmVyc2lvbiZndDsKKyAgICAgICAgICAgICZsdDttYW55LXRvLW9uZSBuYW1lPSJwdWJsaXNoZXIiIGZldGNoPSJMQVpZIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7am9pbi1jb2x1bW4gbmFtZT0iUFVCX0lEIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXBlcnNpc3QvJmd0OworICAgICAgICAgICAgICAgICZsdDsvY2FzY2FkZSZndDsKKyAgICAgICAgICAgICZsdDsvbWFueS10by1vbmUmZ3Q7CisgICAgICAgICAgICAmbHQ7b25lLXRvLW1hbnkgbmFtZT0iYXJ0aWNsZXMiJmd0OworICAgICAgICAgICAgICAgICZsdDtvcmRlci1ieS8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2pvaW4tdGFibGUgbmFtZT0iTUFHX0FSVFMiJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7am9pbi1jb2x1bW4gbmFtZT0iTUFHX0lTQk4iIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IklTQk4iLyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2pvaW4tY29sdW1uIG5hbWU9Ik1BR19USVRMRSIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iVElUTEUiLyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2ludmVyc2Utam9pbi1jb2x1bW4gbmFtZT0iQVJUX0lEIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9qb2luLXRhYmxlJmd0OworICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcmVtb3ZlLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAmbHQ7L29uZS10by1tYW55Jmd0OworICAgICAgICAgICAgJmx0O29uZS10by1vbmUgbmFtZT0iY292ZXJBcnRpY2xlIiBmZXRjaD0iTEFaWSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2pvaW4tY29sdW1uIG5hbWU9IkNPVkVSX0lEIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXBlcnNpc3QvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1yZW1vdmUvJmd0OworICAgICAgICAgICAgICAgICZsdDsvY2FzY2FkZSZndDsKKyAgICAgICAgICAgICZsdDsvb25lLXRvLW9uZSZndDsKKyAgICAgICAgICAgICZsdDt0cmFuc2llbnQgbmFtZT0iZGF0YSIvJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5BcnRpY2xlIiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkFSVCImZ3Q7CisgICAgICAgICAgICAmbHQ7dW5pcXVlLWNvbnN0cmFpbnQmZ3Q7CisgICAgICAgICAgICAgICAmbHQ7Y29sdW1uLW5hbWUmZ3Q7VElUTEUmbHQ7L2NvbHVtbi1uYW1lJmd0OworICAgICAgICAgICAgJmx0Oy91bmlxdWUtY29uc3RyYWludCZndDsKKyAgICAgICAgJmx0Oy90YWJsZSZndDsKKyAgICAgICAgJmx0O3NlcXVlbmNlLWdlbmVyYXRvciBuYW1lPSJBcnRpY2xlU2VxIiwgc2VxdWVuY2VOYW1lPSJBUlRfU0VRIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Z2VuZXJhdGVkLXZhbHVlIHN0cmF0ZWd5PSJTRVFVRU5DRSIgZ2VuZXJhdG9yPSJBcnRpY2xlU2VxIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InRpdGxlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iY29udGVudCIvJmd0OworICAgICAgICAgICAgJmx0O3ZlcnNpb24gbmFtZT0idmVyc2lvbiImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJWRVJTIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3ZlcnNpb24mZ3Q7CisgICAgICAgICAgICAmbHQ7bWFueS10by1tYW55IG5hbWU9ImFydGljbGVzIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7b3JkZXItYnkmZ3Q7bGFzdE5hbWUsIGZpcnN0TmFtZSZsdDsvb3JkZXItYnkmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2pvaW4tdGFibGUgbmFtZT0iQVJUX0FVVEhTIiZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2pvaW4tY29sdW1uIG5hbWU9IkFSVF9JRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iSUQiLyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2ludmVyc2Utam9pbi1jb2x1bW4gbmFtZT0iQVVUSF9JRCIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iQUlEIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9qb2luLXRhYmxlJmd0OworICAgICAgICAgICAgJmx0Oy9tYW55LXRvLW1hbnkmZ3Q7CisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnB1Yi5Db21wYW55IiZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkNPTVAiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQ0lEIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9Im5hbWUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJyZXZlbnVlIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IlJFViIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAgICAgJmx0O29uZS10by1tYW55IG5hbWU9Im1hZ3MiIG1hcHBlZC1ieT0icHVibGlzaGVyIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcGVyc2lzdC8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9jYXNjYWRlJmd0OworICAgICAgICAgICAgJmx0Oy9vbmUtdG8tbWFueSZndDsKKyAgICAgICAgICAgICZsdDtvbmUtdG8tbWFueSBuYW1lPSJzdWJzY3JpcHRpb25zIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7am9pbi10YWJsZSBuYW1lPSJDT01QX1NVQlMiJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7am9pbi1jb2x1bW4gbmFtZT0iQ09NUF9JRCIvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7aW52ZXJzZS1qb2luLWNvbHVtbiBuYW1lPSJTVUJfSUQiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2pvaW4tdGFibGUmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXBlcnNpc3QvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1yZW1vdmUvJmd0OworICAgICAgICAgICAgICAgICZsdDsvY2FzY2FkZSZndDsKKyAgICAgICAgICAgICZsdDsvb25lLXRvLW1hbnkmZ3Q7CisgICAgICAgICAgICAmbHQ7ZW1iZWRkZWQgbmFtZT0iYWRkcmVzcyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZS1vdmVycmlkZSBuYW1lPSJzdHJlZXQiJmd0OworICAgICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iU1RSVCIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvYXR0cmlidXRlLW92ZXJyaWRlJmd0OworICAgICAgICAgICAgICAgICZsdDthdHRyaWJ1dGUtb3ZlcnJpZGUgbmFtZT0iY2l0eSImZ3Q7CisgICAgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJBQ0lUWSIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvYXR0cmlidXRlLW92ZXJyaWRlJmd0OworICAgICAgICAgICAgJmx0Oy9lbWJlZGRlZCZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcucHViLkF1dGhvciImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJBVVRIIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkFJRCIgY29sdW1uLWRlZmluaXRpb249IklOVEVHRVI2NCIvJmd0OworICAgICAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IlRBQkxFIiBnZW5lcmF0b3I9IkF1dGhvckdlbiIvJmd0OworICAgICAgICAgICAgICAgICZsdDt0YWJsZS1nZW5lcmF0b3IgbmFtZT0iQXV0aG9yR2VuIiB0YWJsZT0iQVVUSF9HRU4iIAorICAgICAgICAgICAgICAgICAgICBway1jb2x1bW4tbmFtZT0iUEsiIHZhbHVlLWNvbHVtbi1uYW1lPSJBSUQiLyZndDsKKyAgICAgICAgICAgICZsdDsvaWQmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iZmlyc3ROYW1lIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkZOQU1FIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9Imxhc3ROYW1lIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkxOQU1FIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAgICAgJmx0O3ZlcnNpb24gbmFtZT0idmVyc2lvbiImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJWRVJTIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3ZlcnNpb24mZ3Q7CisgICAgICAgICAgICAmbHQ7bWFueS10by1tYW55IG5hbWU9ImFydHMiIG1hcHBlZC1ieT0iYXV0aG9ycyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXBlcnNpc3QvJmd0OworICAgICAgICAgICAgICAgICZsdDsvY2FzY2FkZSZndDsKKyAgICAgICAgICAgICZsdDsvbWFueS10by1tYW55Jmd0OworICAgICAgICAgICAgJmx0O2VtYmVkZGVkIG5hbWU9ImFkZHJlc3MiLyZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3ViY3JpYmUuQ29udHJhY3QiJmd0OworICAgICAgICAmbHQ7dGFibGUgc2NoZW1hPSJDTlRSQ1QiLyZndDsKKyAgICAgICAgJmx0O2luaGVyaXRhbmNlIHN0cmF0ZWd5PSJKT0lORUQiLyZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItY29sdW1uIG5hbWU9IkNUWVBFIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InRlcm1zIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7bG9iLyZndDsKKyAgICAgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YmNyaWJlLlN1YnNjcmlwdGlvbiImZ3Q7CisgICAgICAgICZsdDt0YWJsZSBuYW1lPSJTVUIiIHNjaGVtYT0iQ05UUkNUIi8mZ3Q7CisgICAgICAgICZsdDtpbmhlcml0YW5jZSBzdHJhdGVneT0iU0lOR0xFX1RBQkxFIi8mZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLXZhbHVlJmd0OzEmbHQ7L2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLWNvbHVtbiBuYW1lPSJLSU5EIiBkaXNjcmltaW5hdG9yLXR5cGU9IklOVEVHRVIiLyZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiJmd0OworICAgICAgICAgICAgICAgICZsdDtnZW5lcmF0ZWQtdmFsdWUgc3RyYXRlZ3k9IklERU5USVRZIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2lkJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InBheW1lbnQiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iUEFZIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InN0YXJ0RGF0ZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJTVEFSVCIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iVkVSUyIvJmd0OworICAgICAgICAgICAgJmx0Oy92ZXJzaW9uJmd0OworICAgICAgICAgICAgJmx0O29uZS10by1tYW55IG5hbWU9Iml0ZW1zIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7bWFwLWtleSBuYW1lPSJudW0iJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLXRhYmxlIG5hbWU9IlNVQl9JVEVNUyIgc2NoZW1hPSJDTlRSQ1QiJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7am9pbi1jb2x1bW4gbmFtZT0iU1VCX0lEIi8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtpbnZlcnNlLWpvaW4tY29sdW1uIG5hbWU9IklURU1fSUQiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2pvaW4tdGFibGUmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXBlcnNpc3QvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1yZW1vdmUvJmd0OworICAgICAgICAgICAgICAgICZsdDsvY2FzY2FkZSZndDsKKyAgICAgICAgICAgICZsdDsvb25lLXRvLW1hbnkmZ3Q7CisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5TdWJzY3JpcHRpb24uTGluZUl0ZW0iJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iTElORV9JVEVNIiBzY2hlbWE9IkNOVFJDVCIvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjb21tZW50cyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJDT01NIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InByaWNlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0ibnVtIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7bWFueS10by1vbmUgbmFtZT0ibWFnYXppbmUiJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJNQUdfSVNCTiIgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZT0iSVNCTiIvJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luLWNvbHVtbiBuYW1lPSJNQUdfVElUTEUiIHJlZmVyZW5jZWQtY29sdW1uLW5hbWU9IlRJVExFIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21hbnktdG8tb25lJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGlmZXRpbWVTdWJzY3JpcHRpb24iIG5hbWU9IkxpZmV0aW1lIiZndDsKKyAgICAgICAgJmx0O2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7MiZsdDsvZGlzY3JpbWluYXRvci12YWx1ZSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iZWxpdGVDbHViIiBmZXRjaD0iTEFaWSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJFTElURSIvJmd0OworICAgICAgICAgICAgJmx0Oy9iYXNpYyZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlRyaWFsU3Vic2NyaXB0aW9uIiBuYW1lPSJUcmlhbCImZ3Q7CisgICAgICAgICZsdDtkaXNjcmltaW5hdG9yLXZhbHVlJmd0OzMmbHQ7L2Rpc2NyaW1pbmF0b3ItdmFsdWUmZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9ImVuZERhdGUiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iRU5EIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Jhc2ljJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VtYmVkZGFibGUgY2xhc3M9Im9yZy5tYWcucHViLkFkZHJlc3MiJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJzdHJlZXQiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjaXR5Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0ic3RhdGUiJmd0OworICAgICAgICAgICAgICAgICZsdDtjb2x1bW4gY29sdW1uLWRlZmluaXRpb249IkNIQVIoMikiLyZndDsKKyAgICAgICAgICAgICZsdDsvYmFzaWMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iemlwIi8mZ3Q7CisgICAgICAgICZsdDsvYXR0cmlidXRlcyZndDsKKyAgICAmbHQ7L2VtYmVkZGFibGUmZ3Q7CismbHQ7L2VudGl0eS1tYXBwaW5ncyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfbWV0YS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfbWV0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmN2U3YwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19tZXRhLnhtbApAQCAtMCwwICsxLDM4MjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19tZXRhIj4KKyAgICA8dGl0bGU+CisgICAgICAgIE1ldGFkYXRhCisgICAgPC90aXRsZT4KKyAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YSI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgSlBBCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgIDwvc2VlYWxzbz4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8cGFyYT4KK0pQQSByZXF1aXJlcyB0aGF0IHlvdSBhY2NvbXBhbnkgZWFjaCBwZXJzaXN0ZW50IGNsYXNzIHdpdGggcGVyc2lzdGVuY2UgbWV0YWRhdGEuCitUaGlzIG1ldGFkYXRhIHNlcnZlcyB0aHJlZSBwcmltYXJ5IHB1cnBvc2VzOgorICAgIDwvcGFyYT4KKyAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gaWRlbnRpZnkgcGVyc2lzdGVudCBjbGFzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KK1RvIG92ZXJyaWRlIGRlZmF1bHQgSlBBIGJlaGF2aW9yLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KK1RvIHByb3ZpZGUgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiB3aXRoIGluZm9ybWF0aW9uIHRoYXQgaXQgY2Fubm90IGdsZWFuIGZyb20KK3NpbXBseSByZWZsZWN0aW5nIG9uIHRoZSBwZXJzaXN0ZW50IGNsYXNzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgPHBhcmE+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CitQZXJzaXN0ZW5jZSBtZXRhZGF0YSBpcyBzcGVjaWZpZWQgdXNpbmcgZWl0aGVyIHRoZSBKYXZhIDUgYW5ub3RhdGlvbnMgZGVmaW5lZCBpbgordGhlIDxsaXRlcmFsPmphdmF4LnBlcnNpc3RlbmNlPC9saXRlcmFsPiBwYWNrYWdlLCBYTUwgbWFwcGluZyBmaWxlcywgb3IgYQorbWl4dHVyZSBvZiBib3RoLiBJbiB0aGUgbGF0dGVyIGNhc2UsIFhNTCBkZWNsYXJhdGlvbnMgb3ZlcnJpZGUgY29uZmxpY3RpbmcKK2Fubm90YXRpb25zLiBJZiB5b3UgY2hvb3NlIHRvIHVzZSBYTUwgbWV0YWRhdGEsIHRoZSBYTUwgZmlsZXMgbXVzdCBiZSBhdmFpbGFibGUKK2F0IGRldmVsb3BtZW50IGFuZCBydW50aW1lLCBhbmQgbXVzdCBiZSBkaXNjb3ZlcmFibGUgdmlhIGVpdGhlciBvZiB0d28KK3N0cmF0ZWdpZXM6CisgICAgPC9wYXJhPgorICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CitJbiBhIHJlc291cmNlIG5hbWVkIDxmaWxlbmFtZT5vcm0ueG1sPC9maWxlbmFtZT4gcGxhY2VkIGluIGEgPGZpbGVuYW1lPgorTUVUQS1JTkY8L2ZpbGVuYW1lPiBkaXJlY3Rvcnkgd2l0aGluIGEgZGlyZWN0b3J5IGluIHlvdXIgY2xhc3NwYXRoIG9yIHdpdGhpbiBhIAoramFyIGFyY2hpdmUgY29udGFpbmluZyB5b3VyIHBlcnNpc3RlbnQgY2xhc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CitEZWNsYXJlZCBpbiB5b3VyIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19wZXJzaXN0ZW5jZV94bWwiPjxmaWxlbmFtZT4KK3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+PC9saW5rPiBjb25maWd1cmF0aW9uIGZpbGUuIEluIHRoaXMgY2FzZSwgZWFjaCBYTUwKK21ldGFkYXRhIGZpbGUgbXVzdCBiZSBsaXN0ZWQgaW4gYSA8bGl0ZXJhbD5tYXBwaW5nLWZpbGU8L2xpdGVyYWw+IGVsZW1lbnQgd2hvc2UKK2NvbnRlbnQgaXMgZWl0aGVyIGEgcGF0aCB0byB0aGUgZ2l2ZW4gZmlsZSBvciBhIHJlc291cmNlIGxvY2F0aW9uIGF2YWlsYWJsZSB0bwordGhlIGNsYXNzJyBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgPC9vcmRlcmVkbGlzdD4KKyAgICA8cGFyYT4KK1dlIGRlc2NyaWJlIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBhbm5vdGF0aW9ucyBhbmQgWE1MIGVxdWl2YWxlbnRzIHRocm91Z2hvdXQKK3RoaXMgY2hhcHRlci4gVGhlIGZ1bGwgc2NoZW1hIGZvciBYTUwgbWFwcGluZyBmaWxlcyBpcyBhdmFpbGFibGUgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX3htbCIvPi4gSlBBIGFsc28gc3RhbmRhcmRpemVzIHJlbGF0aW9uYWwKK21hcHBpbmcgbWV0YWRhdGEgYW5kIG5hbWVkIHF1ZXJ5IG1ldGFkYXRhLCB3aGljaCB3ZSBkaXNjdXNzIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPiBhbmQKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19xdWVyeV9uYW1lZCIvPiByZXNwZWN0aXZlbHkuCisgICAgPC9wYXJhPgorICAgIDxub3RlPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgZGVmaW5lcyBtYW55IHVzZWZ1bCBhbm5vdGF0aW9ucyBiZXlvbmQgdGhlIHN0YW5kYXJkIHNldC4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWV0YV9qcGEiLz4gYW5kCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWV0YV9leHQiLz4KK2luIHRoZSBSZWZlcmVuY2UgR3VpZGUgZm9yIGRldGFpbHMuIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gWE1MIGVxdWl2YWxlbnRzIGZvcgordGhlc2UgZXh0ZW5zaW9uIGFubm90YXRpb25zLgorICAgICAgICA8L3BhcmE+CisgICAgPC9ub3RlPgorICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNTUzIHggNTgwIChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1tZXRhLW1vZGVsLnBuZyIgd2lkdGg9IjM2OSIvPgorICAgICAgICAgICAgCisgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgPC9tZWRpYW9iamVjdD4KKyAgICA8cGFyYT4KK1Rocm91Z2ggdGhlIGNvdXJzZSBvZiB0aGlzIGNoYXB0ZXIsIHdlIHdpbGwgY3JlYXRlIHRoZSBwZXJzaXN0ZW50IG9iamVjdCBtb2RlbAorYWJvdmUuCisgICAgPC9wYXJhPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9jbGFzcyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIENsYXNzIE1ldGFkYXRhCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBtZXRhZGF0YSBhbm5vdGF0aW9ucyBhbmQgWE1MIGVsZW1lbnRzIGFwcGx5IHRvIHBlcnNpc3RlbnQgY2xhc3MKK2RlY2xhcmF0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfZW50aXR5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbnRpdHkKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VudGl0eSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEVudGl0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW50aXR5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW50aXR5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxjbGFzc25hbWU+RW50aXR5PC9jbGFzc25hbWU+IGFubm90YXRpb24gZGVub3RlcyBhbiBlbnRpdHkgY2xhc3MuIEFsbCBlbnRpdHkKK2NsYXNzZXMgbXVzdCBoYXZlIHRoaXMgYW5ub3RhdGlvbi4gVGhlIDxjbGFzc25hbWU+RW50aXR5PC9jbGFzc25hbWU+IGFubm90YXRpb24KK3Rha2VzIG9uZSBvcHRpb25hbCBwcm9wZXJ0eToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogTmFtZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBlbnRpdHkgaW4gcXVlcmllcy4KK011c3Qgbm90IGJlIGEgcmVzZXJ2ZWQgbGl0ZXJhbCBpbiBKUFFMLiBEZWZhdWx0cyB0byB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUKK2VudGl0eSBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGVxdWl2YWxlbnQgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+ZW50aXR5PC9saXRlcmFsPi4gSXQgaGFzIHRoZSBmb2xsb3dpbmcKK2F0dHJpYnV0ZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5jbGFzczwvbGl0ZXJhbD46IFRoZSBlbnRpdHkgY2xhc3MuIFRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IE5hbWVkIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIGluIHF1ZXJpZXMuIFNlZSB0aGUKK25hbWUgcHJvcGVydHkgYWJvdmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5hY2Nlc3M8L2xpdGVyYWw+OiBUaGUgYWNjZXNzIHR5cGUgdG8gdXNlIGZvciB0aGUgY2xhc3MuIE11c3QgZWl0aGVyIGJlCis8bGl0ZXJhbD5GSUVMRDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+UFJPUEVSVFk8L2xpdGVyYWw+LiBGb3IgZGV0YWlscyBvbiBhY2Nlc3MKK3R5cGVzLCBzZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfZmllbGQiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgdXNlcyBhIHByb2Nlc3MgY2FsbGVkIDxlbXBoYXNpcz5lbmhhbmNlbWVudDwvZW1waGFzaXM+IHRvIG1vZGlmeSB0aGUKK2J5dGVjb2RlIG9mIGVudGl0aWVzIGZvciB0cmFuc3BhcmVudCBsYXp5IGxvYWRpbmcgYW5kIGltbWVkaWF0ZSBkaXJ0eSB0cmFja2luZy4KK1NlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSIvPiBpbiB0aGUgUmVmZXJlbmNlIEd1aWRlIGZvcgorZGV0YWlscyBvbiBlbmhhbmNlbWVudC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2lkY2xhc3MiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIElkIENsYXNzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9pZGNsYXNzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSWRDbGFzcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9pZGNsYXNzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgSWRDbGFzcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2lkY2xhc3MiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBJZENsYXNzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQXMgd2UgZGlzY3Vzc2VkIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19wY19pZGVudGl0eWNscyIvPiwKK2VudGl0aWVzIHdpdGggbXVsdGlwbGUgaWRlbnRpdHkgZmllbGRzIG11c3QgdXNlIGFuIDxlbXBoYXNpcz4gaWRlbnRpdHkgY2xhc3MKKzwvZW1waGFzaXM+IHRvIGVuY2Fwc3VsYXRlIHRoZWlyIHBlcnNpc3RlbnQgaWRlbnRpdHkuIFRoZSA8Y2xhc3NuYW1lPklkQ2xhc3MKKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIHNwZWNpZmllcyB0aGlzIGNsYXNzLiBJdCBhY2NlcHRzIGEgc2luZ2xlIDxjbGFzc25hbWU+CitqYXZhLmxhbmcuQ2xhc3M8L2NsYXNzbmFtZT4gdmFsdWUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmlkLWNsYXNzPC9saXRlcmFsPiwgd2hpY2ggaGFzIGEgc2luZ2xlCithdHRyaWJ1dGU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5jbGFzczwvbGl0ZXJhbD46IFNldCB0aGlzIHJlcXVpcmVkIGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUKK2lkZW50aXR5IGNsYXNzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbWJlZGRhYmxlc3VwZXIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE1hcHBlZCBTdXBlcmNsYXNzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbWJlZGRhYmxlc3VwZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXBwZWRTdXBlcmNsYXNzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkZGFibGVzdXBlciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE1hcHBlZFN1cGVyY2xhc3MKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbWJlZGRhYmxlc3VwZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXBwZWRTdXBlcmNsYXNzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQSA8ZW1waGFzaXM+bWFwcGVkIHN1cGVyY2xhc3M8L2VtcGhhc2lzPiBpcyBhIG5vbi1lbnRpdHkgY2xhc3MgdGhhdCBjYW4gZGVmaW5lCitwZXJzaXN0ZW50IHN0YXRlIGFuZCBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBlbnRpdHkgc3ViY2xhc3Nlcy4gTWFwcGVkCitzdXBlcmNsYXNzZXMgYXJlIHVzdWFsbHkgYWJzdHJhY3QuIFVubGlrZSB0cnVlIGVudGl0aWVzLCB5b3UgY2Fubm90IHF1ZXJ5IGEKK21hcHBlZCBzdXBlcmNsYXNzLCBwYXNzIGEgbWFwcGVkIHN1cGVyY2xhc3MgaW5zdGFuY2UgdG8gYW55IDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IG9yIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gbWV0aG9kcywgb3IgZGVjbGFyZSBhCitwZXJzaXN0ZW50IHJlbGF0aW9uIHdpdGggYSBtYXBwZWQgc3VwZXJjbGFzcyB0YXJnZXQuIFlvdSBkZW5vdGUgYSBtYXBwZWQKK3N1cGVyY2xhc3Mgd2l0aCB0aGUgPGNsYXNzbmFtZT5NYXBwZWRTdXBlcmNsYXNzPC9jbGFzc25hbWU+IG1hcmtlciBhbm5vdGF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZXF1aXZhbGVudCBYTUwgZWxlbWVudCBpcyA8bGl0ZXJhbD5tYXBwZWQtc3VwZXJjbGFzczwvbGl0ZXJhbD4uIEl0IGV4cGVjdHMKK3RoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmNsYXNzPC9saXRlcmFsPjogVGhlIGVudGl0eSBjbGFzcy4gVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5hY2Nlc3M8L2xpdGVyYWw+OiBUaGUgYWNjZXNzIHR5cGUgdG8gdXNlIGZvciB0aGUgY2xhc3MuIE11c3QgZWl0aGVyIGJlCis8bGl0ZXJhbD5GSUVMRDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+UFJPUEVSVFk8L2xpdGVyYWw+LiBGb3IgZGV0YWlscyBvbiBhY2Nlc3MKK3R5cGVzLCBzZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfZmllbGQiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxsb3dzIHlvdSB0byBxdWVyeSBvbiBtYXBwZWQgc3VwZXJjbGFzc2VzLiBBIHF1ZXJ5IG9uIGEgbWFwcGVkCitzdXBlcmNsYXNzIHdpbGwgcmV0dXJuIGFsbCBtYXRjaGluZyBzdWJjbGFzcyBpbnN0YW5jZXMuIE9wZW5KUEEgYWxzbyBhbGxvd3MgeW91Cit0byBkZWNsYXJlIHJlbGF0aW9ucyB0byBtYXBwZWQgc3VwZXJjbGFzcyB0eXBlczsgaG93ZXZlciwgeW91IGNhbm5vdCBxdWVyeQorYWNyb3NzIHRoZXNlIHJlbGF0aW9ucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkZGFibGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEVtYmVkZGFibGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkZGFibGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbWJlZGRhYmxlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkZGFibGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbWJlZGRhYmxlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW1iZWRkYWJsZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEVtYmVkZGFibGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5FbWJlZGRhYmxlPC9jbGFzc25hbWU+IGFubm90YXRpb24gZGVzaWduYXRlcyBhbiBlbWJlZGRhYmxlCitwZXJzaXN0ZW50IGNsYXNzLiBFbWJlZGRhYmxlIGluc3RhbmNlcyBhcmUgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIHJlY29yZCBvZiB0aGVpcgorb3duaW5nIGluc3RhbmNlLiBBbGwgZW1iZWRkYWJsZSBjbGFzc2VzIG11c3QgaGF2ZSB0aGlzIGFubm90YXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0EgcGVyc2lzdGVudCBjbGFzcyBjYW4gZWl0aGVyIGJlIGFuIGVudGl0eSBvciBhbiBlbWJlZGRhYmxlIGNsYXNzLCBidXQgbm90IGJvdGguCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmVtYmVkZGFibGU8L2xpdGVyYWw+LiBJdCB1bmRlcnN0YW5kcyB0aGUKK2ZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Y2xhc3M8L2xpdGVyYWw+OiBUaGUgZW50aXR5IGNsYXNzLiBUaGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmFjY2VzczwvbGl0ZXJhbD46IFRoZSBhY2Nlc3MgdHlwZSB0byB1c2UgZm9yIHRoZSBjbGFzcy4gTXVzdCBlaXRoZXIgYmUKKzxsaXRlcmFsPkZJRUxEPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5QUk9QRVJUWTwvbGl0ZXJhbD4uIEZvciBkZXRhaWxzIG9uIGFjY2VzcwordHlwZXMsIHNlZSA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9maWVsZCIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBhbGxvd3MgYSBwZXJzaXN0ZW50IGNsYXNzIHRvIGJlIGJvdGggYW4gZW50aXR5IGFuZCBhbiBlbWJlZGRhYmxlIGNsYXNzLgorSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyB3aWxsIGFjdCBhcyBlbnRpdGVzIHdoZW4gcGVyc2lzdGVkIGV4cGxpY2l0bHkgb3IgYXNzaWduZWQKK3RvIG5vbi1lbWJlZGRlZCBmaWVsZHMgb2YgZW50aXRpZXMuIEluc3RhbmNlcyB3aWxsIGFjdCBhcyBlbWJlZGRlZCB2YWx1ZXMgd2hlbgorYXNzaWduZWQgdG8gZW1iZWRkZWQgZmllbGRzIG9mIGVudGl0aWVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RvIHNpZ25hbCB0aGF0IGEgY2xhc3MgaXMgYm90aCBhbiBlbnRpdHkgYW5kIGFuIGVtYmVkZGFibGUgY2xhc3MgaW4gT3BlbkpQQSwKK3NpbXBseSBhZGQgYm90aCB0aGUgPGxpdGVyYWw+QEVudGl0eTwvbGl0ZXJhbD4gYW5kIHRoZSA8bGl0ZXJhbD5ARW1iZWRkYWJsZQorPC9saXRlcmFsPiBhbm5vdGF0aW9ucyB0byB0aGUgY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbnRpdHlfbGlzdGVuZXJzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbnRpdHlMaXN0ZW5lcnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VudGl0eV9saXN0ZW5lcnMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbnRpdHlMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW50aXR5X2xpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVudGl0eS1saXN0ZW5lcnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW50aXR5X2xpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEVudGl0eUxpc3RlbmVycworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VudGl0eV9saXN0ZW5lcnMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbnRpdHlMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitBbiBlbnRpdHkgbWF5IGxpc3QgaXRzIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgaW4gdGhlIDxjbGFzc25hbWU+CitFbnRpdHlMaXN0ZW5lcnM8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbi4gVGhpcyB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24gaXMgYW4KK2FycmF5IG9mIHRoZSBsaXN0ZW5lciA8Y2xhc3NuYW1lPkNsYXNzPC9jbGFzc25hbWU+IGVzIGZvciB0aGUgZW50aXR5LiBUaGUKK2VxdWl2YWxlbnQgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+ZW50aXR5LWxpc3RlbmVyczwvbGl0ZXJhbD4uIEZvciBtb3JlIGRldGFpbHMKK29uIGVudGl0eSBsaXN0ZW5lcnMsIHNlZSA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGNfY2FsbGJhY2tzIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9jbGFzc2V4Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitIZXJlIGFyZSB0aGUgY2xhc3MgZGVjbGFyYXRpb25zIGZvciBvdXIgcGVyc2lzdGVudCBvYmplY3QgbW9kZWwsIGFubm90YXRlZCB3aXRoCit0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UgbWV0YWRhdGEuIE5vdGUgdGhhdCA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+CitkZWNsYXJlcyBhbiBpZGVudGl0eSBjbGFzcywgYW5kIHRoYXQgPGNsYXNzbmFtZT5Eb2N1bWVudDwvY2xhc3NuYW1lPiBhbmQKKzxjbGFzc25hbWU+QWRkcmVzczwvY2xhc3NuYW1lPiBhcmUgYSBtYXBwZWQgc3VwZXJjbGFzcyBhbmQgYW4gZW1iZWRkYWJsZSBjbGFzcywKK3Jlc3BlY3RpdmVseS4gPGNsYXNzbmFtZT5MaWZldGltZVN1YnNjcmlwdGlvbjwvY2xhc3NuYW1lPiBhbmQgPGNsYXNzbmFtZT4KK1RyaWFsU3Vic2NyaXB0aW9uPC9jbGFzc25hbWU+IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVudGl0eSBuYW1lIHRvIHN1cHBseSBhCitzaG9ydGVyIGFsaWFzIGZvciB1c2UgaW4gcXVlcmllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9jbGFzc2xpc3RpbmciPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgTWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBvcmcubWFnOworCitARW50aXR5CitASWRDbGFzcyhNYWdhemluZS5NYWdhemluZUlkLmNsYXNzKQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKyAgICAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFnYXppbmVJZCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eQorcHVibGljIGNsYXNzIEFydGljbGUgeworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5wdWI7CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBDb21wYW55IHsKKyAgICAuLi4KK30KKworQEVudGl0eQorcHVibGljIGNsYXNzIEF1dGhvciB7CisgICAgLi4uCit9CisKK0BFbWJlZGRhYmxlCitwdWJsaWMgY2xhc3MgQWRkcmVzcyB7CisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnN1YnNjcmliZTsKKworQE1hcHBlZFN1cGVyY2xhc3MKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb2N1bWVudCB7CisgICAgLi4uCit9CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBDb250cmFjdAorICAgIGV4dGVuZHMgRG9jdW1lbnQgeworICAgIC4uLgorfQorCitARW50aXR5CitwdWJsaWMgY2xhc3MgU3Vic2NyaXB0aW9uIHsKKyAgICAuLi4KKworICAgIEBFbnRpdHkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbmVJdGVtCisgICAgICAgIGV4dGVuZHMgQ29udHJhY3QgeworICAgICAgICAuLi4KKyAgICB9Cit9CisKK0BFbnRpdHkobmFtZT0iTGlmZXRpbWUiKQorcHVibGljIGNsYXNzIExpZmV0aW1lU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworICAgIC4uLgorfQorCitARW50aXR5KG5hbWU9IlRyaWFsIikKK3B1YmxpYyBjbGFzcyBUcmlhbFN1YnNjcmlwdGlvbgorICAgIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZXF1aXZhbGVudCBkZWNsYXJhdGlvbnMgaW4gWE1MOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0gb3JtXzFfMC54c2QiCisgICAgdmVyc2lvbj0iMS4wIiZndDsKKyAgICAmbHQ7bWFwcGVkLXN1cGVyY2xhc3MgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLkRvY3VtZW50IiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9tYXBwZWQtc3VwZXJjbGFzcyZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLk1hZ2F6aW5lIiZndDsKKyAgICAgICAgJmx0O2lkLWNsYXNzIGNsYXNzPSJvcmcubWFnLk1hZ2F6aW5lJE1hZ2F6aW5lSWQiLyZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5BcnRpY2xlIiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQ29tcGFueSImZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcucHViLkF1dGhvciImZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLkNvbnRyYWN0IiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGluZUl0ZW0iJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5MaWZldGltZVN1YnNjcmlwdGlvbiIgbmFtZT0iTGlmZXRpbWUiJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW50aXR5IGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5UcmlhbFN1YnNjcmlwdGlvbiIgbmFtZT0iVHJpYWwiJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L2VudGl0eSZndDsKKyAgICAmbHQ7ZW1iZWRkYWJsZSBjbGFzcz0ib3JnLm1hZy5wdWIuQWRkcmVzcyImZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvZW1iZWRkYWJsZSZndDsKKyZsdDsvZW50aXR5LW1hcHBpbmdzJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfZmllbGQiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBGaWVsZCBhbmQgUHJvcGVydHkgTWV0YWRhdGEKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CitUaGUgcGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBhYmxlIHRvIHJldHJpZXZlIGFuZCBzZXQgdGhlIHBlcnNpc3RlbnQKK3N0YXRlIG9mIHlvdXIgZW50aXRpZXMsIG1hcHBlZCBzdXBlcmNsYXNzZXMsIGFuZCBlbWJlZGRhYmxlIHR5cGVzLiBKUEEgb2ZmZXJzCit0d28gbW9kZXMgb2YgcGVyc2lzdGVudCBzdGF0ZSBhY2Nlc3M6IDxlbXBoYXNpcz5maWVsZCBhY2Nlc3M8L2VtcGhhc2lzPiwgYW5kCis8ZW1waGFzaXM+cHJvcGVydHkgYWNjZXNzPC9lbXBoYXNpcz4uIFVuZGVyIGZpZWxkIGFjY2VzcywgdGhlIGltcGxlbWVudGF0aW9uCitpbmplY3RzIHN0YXRlIGRpcmVjdGx5IGludG8geW91ciBwZXJzaXN0ZW50IGZpZWxkcywgYW5kIHJldHJpZXZlcyBjaGFuZ2VkIHN0YXRlCitmcm9tIHlvdXIgZmllbGRzIGFzIHdlbGwuIFRvIGRlY2xhcmUgZmllbGQgYWNjZXNzIG9uIGFuIGVudGl0eSB3aXRoIFhNTAorbWV0YWRhdGEsIHNldCB0aGUgPGxpdGVyYWw+YWNjZXNzPC9saXRlcmFsPiBhdHRyaWJ1dGUgb2YgeW91ciA8bGl0ZXJhbD5lbnRpdHkKKzwvbGl0ZXJhbD4gWE1MIGVsZW1lbnQgdG8gPGxpdGVyYWw+RklFTEQ8L2xpdGVyYWw+LiBUbyB1c2UgZmllbGQgYWNjZXNzIGZvciBhbgorZW50aXR5IHVzaW5nIGFubm90YXRpb24gbWV0YWRhdGEsIHNpbXBseSBwbGFjZSB5b3VyIG1ldGFkYXRhIGFuZCBtYXBwaW5nCithbm5vdGF0aW9ucyBvbiB5b3VyIGZpZWxkIGRlY2xhcmF0aW9uczoKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorQE1hbnlUb09uZQorcHJpdmF0ZSBDb21wYW55IHB1Ymxpc2hlcjsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcHJvcGVydHkgYWNjZXNzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcHJvcGVydHkgYWNjZXNzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IHByb3BlcnRpZXMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorUHJvcGVydHkgYWNjZXNzLCBvbiB0aGUgb3RoZXIgaGFuZCwgcmV0cmlldmVzIGFuZCBsb2FkcyBzdGF0ZSB0aHJvdWdoIEphdmFCZWFuCisiZ2V0dGVyIiBhbmQgInNldHRlciIgbWV0aG9kcy4gRm9yIGEgcHJvcGVydHkgPGxpdGVyYWw+cDwvbGl0ZXJhbD4gb2YgdHlwZQorPGxpdGVyYWw+VDwvbGl0ZXJhbD4sIHlvdSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIGdldHRlciBtZXRob2Q6CisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1QgZ2V0UCgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CitGb3IgYm9vbGVhbiBwcm9wZXJ0aWVzLCB0aGlzIGlzIGFsc28gYWNjZXB0YWJsZToKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorYm9vbGVhbiBpc1AoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorWW91IG11c3QgYWxzbyBkZWZpbmUgdGhlIGZvbGxvd2luZyBzZXR0ZXIgbWV0aG9kOgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit2b2lkIHNldFAoVCB2YWx1ZSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1RvIHVzZSBwcm9wZXJ0eSBhY2Nlc3MsIHNldCB5b3VyIDxsaXRlcmFsPmVudGl0eTwvbGl0ZXJhbD4gZWxlbWVudCdzIDxsaXRlcmFsPgorYWNjZXNzPC9saXRlcmFsPiBhdHRyaWJ1dGUgdG8gPGxpdGVyYWw+UFJPUEVSVFk8L2xpdGVyYWw+LCBvciBwbGFjZSB5b3VyCittZXRhZGF0YSBhbmQgbWFwcGluZyBhbm5vdGF0aW9ucyBvbiB0aGUgZ2V0dGVyIG1ldGhvZDoKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorQE1hbnlUb09uZQorcHJpdmF0ZSBDb21wYW55IGdldFB1Ymxpc2hlcigpIHsgLi4uIH0KKworcHJpdmF0ZSB2b2lkIHNldFB1Ymxpc2hlcihDb21wYW55IHB1Ymxpc2hlcikgeyAuLi4gfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHdhcm5pbmc+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gdXNpbmcgcHJvcGVydHkgYWNjZXNzLCBvbmx5IHRoZSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2QgZm9yIGEgcHJvcGVydHkKK3Nob3VsZCBldmVyIGFjY2VzcyB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW50IGZpZWxkIGRpcmVjdGx5LiBPdGhlciBtZXRob2RzLAoraW5jbHVkaW5nIGludGVybmFsIGJ1c2luZXNzIG1ldGhvZHMgaW4gdGhlIHBlcnNpc3RlbnQgY2xhc3MsIHNob3VsZCBnbyB0aHJvdWdoCit0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyB3aGVuIG1hbmlwdWxhdGluZyBwZXJzaXN0ZW50IHN0YXRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitBbHNvLCB0YWtlIGNhcmUgd2hlbiBhZGRpbmcgYnVzaW5lc3MgbG9naWMgdG8geW91ciBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzLgorQ29uc2lkZXIgdGhhdCB0aGV5IGFyZSBpbnZva2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSBpbXBsZW1lbnRhdGlvbiB0byBsb2FkIGFuZAorcmV0cmlldmUgYWxsIHBlcnNpc3RlbnQgc3RhdGU7IG90aGVyIHNpZGUgZWZmZWN0cyBtaWdodCBub3QgYmUgZGVzaXJhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3dhcm5pbmc+CisgICAgICAgIDxwYXJhPgorRWFjaCBjbGFzcyBtdXN0IHVzZSBlaXRoZXIgZmllbGQgYWNjZXNzIG9yIHByb3BlcnR5IGFjY2VzcyBmb3IgYWxsIHN0YXRlOyB5b3UKK2Nhbm5vdCB1c2UgYm90aCBhY2Nlc3MgdHlwZXMgd2l0aGluIHRoZSBzYW1lIGNsYXNzLiBBZGRpdGlvbmFsbHksIGEgc3ViY2xhc3MKK211c3QgdXNlIHRoZSBzYW1lIGFjY2VzcyB0eXBlIGFzIGl0cyBzdXBlcmNsYXNzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IHVzZXMgdGhlIHRlcm0gInBlcnNpc3RlbnQgZmllbGQiIHRvIHJlZmVyIHRvCitlaXRoZXIgYSBwZXJzaXN0ZW50IGZpZWxkIG9yIGEgcGVyc2lzdGVudCBwcm9wZXJ0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfdHJhbnNpZW50Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBUcmFuc2llbnQKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX3RyYW5zaWVudCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFRyYW5zaWVudAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV90cmFuc2llbnQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBUcmFuc2llbnQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV90cmFuc2llbnQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBUcmFuc2llbnQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5UcmFuc2llbnQ8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBzcGVjaWZpZXMgdGhhdCBhIGZpZWxkIGlzCitub24tcGVyc2lzdGVudC4gVXNlIGl0IHRvIGV4Y2x1ZGUgZmllbGRzIGZyb20gbWFuYWdlbWVudCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZQorcGVyc2lzdGVudC4gPGNsYXNzbmFtZT5UcmFuc2llbnQ8L2NsYXNzbmFtZT4gaXMgYSBtYXJrZXIgYW5ub3RhdGlvbiBvbmx5OyBpdAoraGFzIG5vIHByb3BlcnRpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPnRyYW5zaWVudDwvbGl0ZXJhbD4uIEl0IGhhcyBhIHNpbmdsZQorYXR0cmlidXRlOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IFRoZSB0cmFuc2llbnQgZmllbGQgb3IgcHJvcGVydHkgbmFtZS4gVGhpcyBhdHRyaWJ1dGUKK2lzIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9pZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSWQKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2lkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSWQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfaWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBJZAorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2lkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgSWQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitBbm5vdGF0ZSB5b3VyIHNpbXBsZSBpZGVudGl0eSBmaWVsZHMgd2l0aCA8Y2xhc3NuYW1lPklkPC9jbGFzc25hbWU+LiBUaGlzCithbm5vdGF0aW9uIGhhcyBubyBwcm9wZXJ0aWVzLiBXZSBleHBsb3JlIGVudGl0eSBpZGVudGl0eSBhbmQgaWRlbnRpdHkgZmllbGRzIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGNfaWQiLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmlkPC9saXRlcmFsPi4gSXQgaGFzIG9uZSByZXF1aXJlZAorYXR0cmlidXRlOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBpZGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfZ2VuIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgVmFsdWUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2dlbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlZFZhbHVlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2dlbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlZFZhbHVlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZ2VuIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkVmFsdWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgcHJldmlvdXMgc2VjdGlvbiBzaG93ZWQgeW91IGhvdyB0byBkZWNsYXJlIHlvdXIgaWRlbnRpdHkgZmllbGRzIHdpdGggdGhlCis8Y2xhc3NuYW1lPklkPC9jbGFzc25hbWU+IGFubm90YXRpb24uIEl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYWxsb3cgdGhlCitwZXJzaXN0ZW5jZSBpbXBsZW1lbnRhdGlvbiB0byBhc3NpZ24gYSB1bmlxdWUgdmFsdWUgdG8geW91ciBpZGVudGl0eSBmaWVsZHMKK2F1dG9tYXRpY2FsbHkuIEpQQSBpbmNsdWRlcyB0aGUgdGhlIDxjbGFzc25hbWU+R2VuZXJhdGVkVmFsdWU8L2NsYXNzbmFtZT4KK2Fubm90YXRpb24gZm9yIHRoaXMgcHVycG9zZS4gSXQgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5PC9saXRlcmFsPjogRW51bSB2YWx1ZSBzcGVjaWZ5aW5nIGhvdyB0bworYXV0by1nZW5lcmF0ZSB0aGUgZmllbGQgdmFsdWUuIFRoZSA8Y2xhc3NuYW1lPkdlbmVyYXRpb25UeXBlPC9jbGFzc25hbWU+IGVudW0KK2hhcyB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+R2VuZXJhdG9yVHlwZS5BVVRPPC9saXRlcmFsPjogVGhlIGRlZmF1bHQuIEFzc2lnbiB0aGUgZmllbGQgYQorZ2VuZXJhdGVkIHZhbHVlLCBsZWF2aW5nIHRoZSBkZXRhaWxzIHRvIHRoZSBKUEEgdmVuZG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5HZW5lcmF0aW9uVHlwZS5JREVOVElUWTwvbGl0ZXJhbD46IFRoZSBkYXRhYmFzZSB3aWxsIGFzc2lnbiBhbgoraWRlbnRpdHkgdmFsdWUgb24gaW5zZXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5HZW5lcmF0aW9uVHlwZS5TRVFVRU5DRTwvbGl0ZXJhbD46IFVzZSBhIGRhdGFzdG9yZSBzZXF1ZW5jZSB0bworZ2VuZXJhdGUgYSBmaWVsZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+R2VuZXJhdGlvblR5cGUuVEFCTEU8L2xpdGVyYWw+OiBVc2UgYSBzZXF1ZW5jZSB0YWJsZSB0byBnZW5lcmF0ZSBhCitmaWVsZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgZ2VuZXJhdG9yPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgYSBnZW5lcmF0b3IgZGVmaW5lZCBpbiBtYXBwaW5nCittZXRhZGF0YS4gV2Ugc2hvdyB5b3UgaG93IHRvIGRlZmluZSBuYW1lZCBnZW5lcmF0b3JzIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19zZXF1ZW5jZSIvPi4gSWYgdGhlIDxjbGFzc25hbWU+CitHZW5lcmF0aW9uVHlwZTwvY2xhc3NuYW1lPiBpcyBzZXQgYnV0IHRoaXMgcHJvcGVydHkgaXMgdW5zZXQsIHRoZSBKUEEKK2ltcGxlbWVudGF0aW9uIHVzZXMgYXBwcm9wcmlhdGUgZGVmYXVsdHMgZm9yIHRoZSBzZWxlY3RlZCBnZW5lcmF0aW9uIHR5cGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmdlbmVyYXRlZC12YWx1ZTwvbGl0ZXJhbD4sIHdoaWNoCitpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5zdHJhdGVneTwvbGl0ZXJhbD46IE9uZSBvZiA8bGl0ZXJhbD4gVEFCTEU8L2xpdGVyYWw+LCA8bGl0ZXJhbD4KK1NFUVVFTkNFPC9saXRlcmFsPiwgPGxpdGVyYWw+IElERU5USVRZPC9saXRlcmFsPiwgb3IgPGxpdGVyYWw+QVVUTzwvbGl0ZXJhbD4sCitkZWZhdWx0aW5nIHRvIDxsaXRlcmFsPkFVVE88L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Z2VuZXJhdG9yPC9saXRlcmFsPjogRXF1aXZhbGVudCB0byB0aGUgZ2VuZXJhdG9yIHByb3BlcnR5IGxpc3RlZAorYWJvdmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxsb3dzIHlvdSB0byB1c2UgdGhlIDxjbGFzc25hbWU+R2VuZXJhdGVkVmFsdWU8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbgorb24gYW55IGZpZWxkLCBub3QganVzdCBpZGVudGl0eSBmaWVsZHMuIEJlZm9yZSB1c2luZyB0aGUgPGxpdGVyYWw+SURFTlRJVFkKKzwvbGl0ZXJhbD4gZ2VuZXJhdGlvbiBzdHJhdGVneSwgaG93ZXZlciwgcmVhZAorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX29pZF9wa2dlbl9hdXRvaW5jIi8+IGluIHRoZSBSZWZlcmVuY2UgR3VpZGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBhbHNvIG9mZmVycyB0d28gYWRkaXRpb25hbCBnZW5lcmF0b3Igc3RyYXRlZ2llcyBmb3Igbm9uLW51bWVyaWMgZmllbGRzLAord2hpY2ggeW91IGNhbiBhY2Nlc3MgYnkgc2V0dGluZyA8bGl0ZXJhbD5zdHJhdGVneTwvbGl0ZXJhbD4gdG8gPGxpdGVyYWw+QVVUTworPC9saXRlcmFsPiAodGhlIGRlZmF1bHQpLCBhbmQgc2V0dGluZyB0aGUgPGxpdGVyYWw+Z2VuZXJhdG9yPC9saXRlcmFsPiBzdHJpbmcKK3RvOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZC1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZC1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPnV1aWQtc3RyaW5nPC9saXRlcmFsPjogT3BlbkpQQSB3aWxsIGdlbmVyYXRlIGEgMTI4LWJpdCBVVUlEIHVuaXF1ZQord2l0aGluIHRoZSBuZXR3b3JrLCByZXByZXNlbnRlZCBhcyBhIDE2LWNoYXJhY3RlciBzdHJpbmcuIEZvciBtb3JlIGluZm9ybWF0aW9uCitvbiBVVUlEcywgc2VlIHRoZSBJRVRGIFVVSUQgZHJhZnQgc3BlY2lmaWNhdGlvbiBhdDoKKzx1bGluayB1cmw9Imh0dHA6Ly93d3cxLmljcy51Y2kuZWR1L35lancvYXV0aG9yaW5nL3V1aWQtZ3VpZC8iPgoraHR0cDovL3d3dzEuaWNzLnVjaS5lZHUvfmVqdy9hdXRob3JpbmcvdXVpZC1ndWlkLzwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkLWhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkLWhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+dXVpZC1oZXg8L2xpdGVyYWw+OiBTYW1lIGFzIDxsaXRlcmFsPiB1dWlkLXN0cmluZzwvbGl0ZXJhbD4sIGJ1dAorcmVwcmVzZW50cyB0aGUgVVVJRCBhcyBhIDMyLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGVzZSBzdHJpbmcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9HZW5lcmF0b3IuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5HZW5lcmF0b3I8L2NsYXNzbmFtZT48L3VsaW5rPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkaWQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEVtYmVkZGVkIElkCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbWJlZGlkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRJZAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbWJlZGlkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRJZAorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkaWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZElkCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorSWYgeW91ciBlbnRpdHkgaGFzIG11bHRpcGxlIGlkZW50aXR5IHZhbHVlcywgeW91IG1heSBkZWNsYXJlIG11bHRpcGxlIDxsaXRlcmFsPgorQElkPC9saXRlcmFsPiBmaWVsZHMsIG9yIHlvdSBtYXkgZGVjbGFyZSBhIHNpbmdsZSA8bGl0ZXJhbD5ARW1iZWRkZWRJZDwvbGl0ZXJhbD4KK2ZpZWxkLiBUaGUgdHlwZSBvZiBhIGZpZWxkIGFubm90YXRlZCB3aXRoIDxjbGFzc25hbWU+RW1iZWRkZWRJZDwvY2xhc3NuYW1lPiBtdXN0CitiZSBhbiBlbWJlZGRhYmxlIGVudGl0eSBjbGFzcy4gVGhlIGZpZWxkcyBvZiB0aGlzIGVtYmVkZGFibGUgY2xhc3MgYXJlCitjb25zaWRlcmVkIHRoZSBpZGVudGl0eSB2YWx1ZXMgb2YgdGhlIG93bmluZyBlbnRpdHkuIFdlIGV4cGxvcmUgZW50aXR5IGlkZW50aXR5CithbmQgaWRlbnRpdHkgZmllbGRzIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19wY19pZCIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxjbGFzc25hbWU+RW1iZWRkZWRJZDwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGhhcyBubyBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZXF1aXZhbGVudCBYTUwgZWxlbWVudCBpcyA8bGl0ZXJhbD5lbWJlZGRlZC1pZDwvbGl0ZXJhbD4uIEl0IGhhcyBvbmUKK3JlcXVpcmVkIGF0dHJpYnV0ZToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgaWRlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX3ZlcnNpb24iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFZlcnNpb24KKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX3ZlcnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBWZXJzaW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX3ZlcnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBWZXJzaW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfdmVyc2lvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFZlcnNpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitVc2UgdGhlIDxjbGFzc25hbWU+VmVyc2lvbjwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIHRvIGRlc2lnbmF0ZSBhIHZlcnNpb24gZmllbGQuCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGNfdmVyc2lvbiIvPiBleHBsYWluZWQgdGhlIGltcG9ydGFuY2Ugb2YKK3ZlcnNpb24gZmllbGRzIHRvIEpQQS4gVGhpcyBpcyBhIG1hcmtlciBhbm5vdGF0aW9uOyBpdCBoYXMgbm8gcHJvcGVydGllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGVxdWl2YWxlbnQgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+dmVyc2lvbjwvbGl0ZXJhbD4sIHdoaWNoIGhhcyBhIHNpbmdsZQorYXR0cmlidXRlOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSB2ZXJzaW9uIGZpZWxkIG9yIHByb3BlcnR5LiBUaGlzCithdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2Jhc2ljIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBCYXNpYworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfYmFzaWMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBCYXNpYworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9iYXNpYyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEJhc2ljCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfYmFzaWMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBCYXNpYworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+QmFzaWM8L2NsYXNzbmFtZT4gc2lnbmlmaWVzIGEgc3RhbmRhcmQgdmFsdWUgcGVyc2lzdGVkIGFzLWlzIHRvIHRoZQorZGF0YXN0b3JlLiBZb3UgY2FuIHVzZSB0aGUgPGNsYXNzbmFtZT5CYXNpYzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIG9uIHBlcnNpc3RlbnQKK2ZpZWxkcyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiBwcmltaXRpdmVzLCBwcmltaXRpdmUgd3JhcHBlcnMsIDxjbGFzc25hbWU+CitqYXZhLmxhbmcuU3RyaW5nPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPmJ5dGVbXTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT4KK0J5dGVbXTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT5jaGFyW108L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+CitDaGFyYWN0ZXJbXTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT5qYXZhLm1hdGguQmlnRGVjaW1hbDwvY2xhc3NuYW1lPiwgCis8Y2xhc3NuYW1lPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPgoramF2YS51dGlsLkRhdGU8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+amF2YS51dGlsLkNhbGVuZGFyPC9jbGFzc25hbWU+LCAKKzxjbGFzc25hbWU+amF2YS5zcWwuRGF0ZTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NsYXNzbmFtZT4sCis8Y2xhc3NuYW1lPkVudW08L2NsYXNzbmFtZT5zLCBhbmQgPGNsYXNzbmFtZT5TZXJpYWxpemFibGU8L2NsYXNzbmFtZT4gdHlwZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+QmFzaWM8L2NsYXNzbmFtZT4gZGVjbGFyZXMgdGhlc2UgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZldGNoVHlwZSBmZXRjaDwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gbG9hZCB0aGUgZmllbGQgZWFnZXJseSAKKyg8bGl0ZXJhbD5GZXRjaFR5cGUuRUFHRVI8L2xpdGVyYWw+KSBvciBsYXppbHkgKDxsaXRlcmFsPgorRmV0Y2hUeXBlLkxBWlk8L2xpdGVyYWw+KS4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+RmV0Y2hUeXBlLkVBR0VSPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gb3B0aW9uYWw8L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSBkYXRhc3RvcmUgYWxsb3dzIG51bGwgdmFsdWVzLgorRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGVxdWl2YWxlbnQgWE1MIGVsZW1lbnQgaXMgPGxpdGVyYWw+YmFzaWM8L2xpdGVyYWw+LiBJdCBoYXMgdGhlIGZvbGxvd2luZworYXR0cmlidXRlczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkuIFRoaXMgYXR0cmlidXRlIGlzCityZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZldGNoPC9saXRlcmFsPjogT25lIG9mIDxsaXRlcmFsPkVBR0VSPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5MQVpZCis8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+b3B0aW9uYWw8L2xpdGVyYWw+OiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmllbGQgdmFsdWUgbWF5IGJlCitudWxsLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2ZldGNoIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEZldGNoIFR5cGUKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZmV0Y2giPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZldGNoVHlwZQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2ZldGNoIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaFR5cGUKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2ZldGNoIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaFR5cGUKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitNYW55IG1ldGFkYXRhIGFubm90YXRpb25zIGluIEpQQSBoYXZlIGEgPGxpdGVyYWw+ZmV0Y2g8L2xpdGVyYWw+IHByb3BlcnR5LiBUaGlzCitwcm9wZXJ0eSBjYW4gdGFrZSBvbiBvbmUgb2YgdHdvIHZhbHVlczogPGxpdGVyYWw+RmV0Y2hUeXBlLkVBR0VSPC9saXRlcmFsPiBvcgorPGxpdGVyYWw+RmV0Y2hUeXBlLkxBWlk8L2xpdGVyYWw+LiA8bGl0ZXJhbD5GZXRjaFR5cGUuRUFHRVI8L2xpdGVyYWw+IG1lYW5zIHRoYXQKK3RoZSBmaWVsZCBpcyBsb2FkZWQgYnkgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBiZWZvcmUgaXQgcmV0dXJucyB0aGUgcGVyc2lzdGVudAorb2JqZWN0IHRvIHlvdS4gV2hlbmV2ZXIgeW91IHJldHJpZXZlIGFuIGVudGl0eSBmcm9tIGEgcXVlcnkgb3IgZnJvbSB0aGUKKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiwgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIGl0cyBlYWdlcgorZmllbGRzIGFyZSBwb3B1bGF0ZWQgd2l0aCBkYXRhc3RvcmUgZGF0YS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5GZXRjaFR5cGUuTEFaWTwvbGl0ZXJhbD4gaXMgYSBoaW50IHRvIHRoZSBKUEEgcnVudGltZSB0aGF0IHlvdSB3YW50IHRvCitkZWZlciBsb2FkaW5nIG9mIHRoZSBmaWVsZCB1bnRpbCB5b3UgYWNjZXNzIGl0LiBUaGlzIGlzIGNhbGxlZCA8ZW1waGFzaXM+bGF6eQorbG9hZGluZzwvZW1waGFzaXM+LiBMYXp5IGxvYWRpbmcgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudDsgd2hlbiB5b3UgYXR0ZW1wdCB0bworcmVhZCB0aGUgZmllbGQgZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGUgSlBBIHJ1bnRpbWUgd2lsbCBsb2FkIHRoZSB2YWx1ZSBmcm9tIHRoZQorZGF0YXN0b3JlIGFuZCBwb3B1bGF0ZSB0aGUgZmllbGQgYXV0b21hdGljYWxseS4gTGF6eSBsb2FkaW5nIGlzIG9ubHkgYSBoaW50IGFuZAorbm90IGEgZGlyZWN0aXZlIGJlY2F1c2Ugc29tZSBKUEEgaW1wbGVtZW50YXRpb25zIGNhbm5vdCBsYXp5LWxvYWQgY2VydGFpbiBmaWVsZAordHlwZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2l0aCBhIG1peCBvZiBlYWdlciBhbmQgbGF6aWx5LWxvYWRlZCBmaWVsZHMsIHlvdSBjYW4gZW5zdXJlIHRoYXQgY29tbW9ubHktdXNlZAorZmllbGRzIGxvYWQgZWZmaWNpZW50bHksIGFuZCB0aGF0IG90aGVyIHN0YXRlIGxvYWRzIHRyYW5zcGFyZW50bHkgd2hlbiBhY2Nlc3NlZC4KK0FzIHlvdSB3aWxsIHNlZSBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X3BlcnNjb250ZXh0Ii8+LAoreW91IGNhbiBhbHNvIHVzZSBlYWdlciBmZXRjaGluZyB0byBlbnN1cmUgdGhhdCBlbnRpdGVzIGhhdmUgYWxsIG5lZWRlZCBkYXRhCitsb2FkZWQgYmVmb3JlIHRoZXkgYmVjb21lIDxlbXBoYXNpcz5kZXRhY2hlZDwvZW1waGFzaXM+IGF0IHRoZSBlbmQgb2YgYQorcGVyc2lzdGVuY2UgY29udGV4dC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBjYW4gbGF6eS1sb2FkIGFueSBmaWVsZCB0eXBlLiBPcGVuSlBBIGFsc28gYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseQorY2hhbmdlIHdoaWNoIGZpZWxkcyBhcmUgZWFnZXJseSBvciBsYXppbHkgbG9hZGVkIGF0IHJ1bnRpbWUuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoIi8+IGluIHRoZSBSZWZlcmVuY2UgR3VpZGUgZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgUmVmZXJlbmNlIEd1aWRlIGRldGFpbHMgT3BlbkpQQSdzIGVhZ2VyIGZldGNoaW5nIGJlaGF2aW9yIGluCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXIiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkZGVkIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbWJlZGRlZAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW1iZWRkZWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9lbWJlZGRlZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfZW1iZWRkZWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZAorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1VzZSB0aGUgPGNsYXNzbmFtZT5FbWJlZGRlZDwvY2xhc3NuYW1lPiBtYXJrZXIgYW5ub3RhdGlvbiBvbiBlbWJlZGRhYmxlIGZpZWxkCit0eXBlcy4gRW1iZWRkZWQgZmllbGRzIGFyZSBtYXBwZWQgYXMgcGFydCBvZiB0aGUgZGF0YXN0b3JlIHJlY29yZCBvZiB0aGUKK2RlY2xhcmluZyBlbnRpdHkuIEluIG91ciBzYW1wbGUgbW9kZWwsIDxjbGFzc25hbWU+QXV0aG9yPC9jbGFzc25hbWU+IGFuZAorPGNsYXNzbmFtZT5Db21wYW55PC9jbGFzc25hbWU+IGVhY2ggZW1iZWQgdGhlaXIgPGNsYXNzbmFtZT5BZGRyZXNzPC9jbGFzc25hbWU+LAorcmF0aGVyIHRoYW4gZm9ybWluZyBhIHJlbGF0aW9uIHRvIGFuIDxjbGFzc25hbWU+QWRkcmVzczwvY2xhc3NuYW1lPiBhcyBhCitzZXBhcmF0ZSBlbnRpdHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPmVtYmVkZGVkPC9saXRlcmFsPiwgd2hpY2ggZXhwZWN0cyBhCitzaW5nbGUgYXR0cmlidXRlOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eS4gVGhpcyBhdHRyaWJ1dGUgaXMKK3JlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYW55dG9vbmUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE1hbnkgVG8gT25lCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYW55dG9vbmUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYW55VG9PbmUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfbWFueXRvb25lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgTWFueVRvT25lCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfbWFueXRvb25lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgTWFueVRvT25lCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiBhbiBlbnRpdHkgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gcmVmZXJlbmNlcyBhIHNpbmdsZSBlbnRpdHkgPGxpdGVyYWw+CitCPC9saXRlcmFsPiwgYW5kIG90aGVyIDxsaXRlcmFsPkE8L2xpdGVyYWw+cyBtaWdodCBhbHNvIHJlZmVyZW5jZSB0aGUgc2FtZQorPGxpdGVyYWw+QjwvbGl0ZXJhbD4sIHdlIHNheSB0aGVyZSBpcyBhIDxlbXBoYXNpcz5tYW55IHRvIG9uZTwvZW1waGFzaXM+CityZWxhdGlvbiBmcm9tIDxsaXRlcmFsPkE8L2xpdGVyYWw+IHRvIDxsaXRlcmFsPkI8L2xpdGVyYWw+LiBJbiBvdXIgc2FtcGxlCittb2RlbCwgZm9yIGV4YW1wbGUsIGVhY2ggbWFnYXppbmUgaGFzIGEgcmVmZXJlbmNlIHRvIGl0cyBwdWJsaXNoZXIuIE11bHRpcGxlCittYWdhemluZXMgbWlnaHQgaGF2ZSB0aGUgc2FtZSBwdWJsaXNoZXIuIFdlIHNheSwgdGhlbiwgdGhhdCB0aGUgPGxpdGVyYWw+CitNYWdhemluZS5wdWJsaXNoZXI8L2xpdGVyYWw+IGZpZWxkIGlzIGEgbWFueSB0byBvbmUgcmVsYXRpb24gZnJvbSBtYWdhemluZXMgdG8KK3B1Ymxpc2hlcnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSBpbmRpY2F0ZXMgbWFueSB0byBvbmUgcmVsYXRpb25zIGJldHdlZW4gZW50aXRpZXMgd2l0aCB0aGUgPGNsYXNzbmFtZT4KK01hbnlUb09uZTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLiBUaGlzIGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNsYXNzIHRhcmdldEVudGl0eTwvbGl0ZXJhbD46IFRoZSBjbGFzcyBvZiB0aGUgcmVsYXRlZCBlbnRpdHkgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNhc2NhZGVUeXBlW10gY2FzY2FkZTwvbGl0ZXJhbD46IEFycmF5IG9mIGVudW0gdmFsdWVzIGRlZmluaW5nIGNhc2NhZGUKK2JlaGF2aW9yIGZvciB0aGlzIGZpZWxkLiBXZSBleHBsb3JlIGNhc2NhZGVzIGJlbG93LiBEZWZhdWx0cyB0byBhbiBlbXB0eSBhcnJheS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZldGNoVHlwZSBmZXRjaDwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gbG9hZCB0aGUgZmllbGQgZWFnZXJseSAKKyg8bGl0ZXJhbD5GZXRjaFR5cGUuRUFHRVI8L2xpdGVyYWw+KSBvciBsYXppbHkgCisoPGxpdGVyYWw+RmV0Y2hUeXBlLkxBWlk8L2xpdGVyYWw+KS4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+CitGZXRjaFR5cGUuRUFHRVI8L2xpdGVyYWw+LiBTZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfZmV0Y2giLz4gYWJvdmUgCitmb3IgZGV0YWlscyBvbiBmZXRjaCB0eXBlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gb3B0aW9uYWw8L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSByZWxhdGVkIG9iamVjdCBtdXN0IGV4aXN0LiBJZgorPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCB0aGlzIGZpZWxkIGNhbm5vdCBiZSBudWxsLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK3RydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZXF1aXZhbGVudCBYTUwgZWxlbWVudCBpcyA8bGl0ZXJhbD5tYW55LXRvLW9uZTwvbGl0ZXJhbD4uIEl0IGFjY2VwdHMgdGhlCitmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkuIFRoaXMgYXR0cmlidXRlIGlzCityZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRhcmdldC1lbnRpdHk8L2xpdGVyYWw+OiBUaGUgY2xhc3Mgb2YgdGhlIHJlbGF0ZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZldGNoPC9saXRlcmFsPjogT25lIG9mIDxsaXRlcmFsPkVBR0VSPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4KK0xBWlk8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+b3B0aW9uYWw8L2xpdGVyYWw+OiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmllbGQgdmFsdWUgbWF5IGJlCitudWxsLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ2FzY2FkZSBUeXBlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENhc2NhZGVUeXBlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENhc2NhZGVUeXBlCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2UgaW50cm9kdWNlIHRoZSBKUEEgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfZW0iLz4uIFRoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPiBoYXMgQVBJcyB0byBwZXJzaXN0IG5ldyBlbnRpdGllcywgcmVtb3ZlIChkZWxldGUpIGV4aXN0aW5nCitlbnRpdGllcywgcmVmcmVzaCBlbnRpdHkgc3RhdGUgZnJvbSB0aGUgZGF0YXN0b3JlLCBhbmQgbWVyZ2UgPGVtcGhhc2lzPmRldGFjaGVkCis8L2VtcGhhc2lzPiBlbnRpdHkgc3RhdGUgYmFjayBpbnRvIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LiBXZSBleHBsb3JlIGFsbCBvZgordGhlc2UgQVBJcyBpbiBkZXRhaWwgbGF0ZXIgaW4gdGhlIG92ZXJ2aWV3LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1doZW4gdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpcyBwZXJmb3JtaW5nIHRoZSBhYm92ZQorb3BlcmF0aW9ucywgeW91IGNhbiBpbnN0cnVjdCBpdCB0byBhdXRvbWF0aWNhbGx5IGNhc2NhZGUgdGhlIG9wZXJhdGlvbiB0byB0aGUKK2VudGl0aWVzIGhlbGQgaW4gYSBwZXJzaXN0ZW50IGZpZWxkIHdpdGggdGhlIDxsaXRlcmFsPmNhc2NhZGU8L2xpdGVyYWw+IHByb3BlcnR5CitvZiB5b3VyIG1ldGFkYXRhIGFubm90YXRpb24uIFRoaXMgcHJvY2VzcyBpcyByZWN1cnNpdmUuIFRoZSA8bGl0ZXJhbD5jYXNjYWRlCis8L2xpdGVyYWw+IHByb3BlcnR5IGFjY2VwdHMgYW4gYXJyYXkgb2YgPGNsYXNzbmFtZT5DYXNjYWRlVHlwZTwvY2xhc3NuYW1lPiBlbnVtCit2YWx1ZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q2FzY2FkZVR5cGUuUEVSU0lTVDwvbGl0ZXJhbD46IFdoZW4gcGVyc2lzdGluZyBhbiBlbnRpdHksIGFsc28gcGVyc2lzdAordGhlIGVudGl0aWVzIGhlbGQgaW4gdGhpcyBmaWVsZC4gV2Ugc3VnZ2VzdCBsaWJlcmFsIGFwcGxpY2F0aW9uIG9mIHRoaXMgY2FzY2FkZQorcnVsZSwgYmVjYXVzZSBpZiB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGZpbmRzIGEgZmllbGQgdGhhdAorcmVmZXJlbmNlcyBhIG5ldyBlbnRpdHkgZHVyaW5nIGZsdXNoLCBhbmQgdGhlIGZpZWxkIGRvZXMgbm90IHVzZSA8bGl0ZXJhbD4KK0Nhc2NhZGVUeXBlLlBFUlNJU1Q8L2xpdGVyYWw+LCBpdCBpcyBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DYXNjYWRlVHlwZS5SRU1PVkU8L2xpdGVyYWw+OiBXaGVuIGRlbGV0aW5nIGFuIGVudGl0eSwgYWxzbyBkZWxldGUgdGhlCitlbnRpdGllcyBoZWxkIGluIHRoaXMgZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q2FzY2FkZVR5cGUuUkVGUkVTSDwvbGl0ZXJhbD46IFdoZW4gcmVmcmVzaGluZyBhbiBlbnRpdHksIGFsc28gcmVmcmVzaAordGhlIGVudGl0aWVzIGhlbGQgaW4gdGhpcyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DYXNjYWRlVHlwZS5NRVJHRTwvbGl0ZXJhbD46IFdoZW4gbWVyZ2luZyBlbnRpdHkgc3RhdGUsIGFsc28gbWVyZ2UgdGhlCitlbnRpdGllcyBoZWxkIGluIHRoaXMgZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgCTxwYXJhPgorT3BlbkpQQSBvZmZlcnMgZW5oYW5jZW1lbnRzIHRvIEpQQSdzIENhc2NhZGVUeXBlLlJFTU9WRSBmdW5jdGlvbmFsaXR5LAoraW5jbHVkaW5nIGFkZGl0aW9uYWwgYW5ub3RhdGlvbnMgdG8gY29udHJvbCBob3cgYW5kIHdoZW4gZGVwZW5kZW50IGZpZWxkcyB3aWxsCitiZSByZW1vdmVkLiAgU2VlIDx4cmVmIGxpbmtlbmQ9ImRlcGVuZGVudCIvPiBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICAgICAgICAgIAk8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5DYXNjYWRlVHlwZTwvY2xhc3NuYW1lPiBkZWZpbmVzIG9uZSBhZGRpdGlvbmFsIHZhbHVlLCA8bGl0ZXJhbD4KK0Nhc2NhZGVUeXBlLkFMTDwvbGl0ZXJhbD4sIHRoYXQgYWN0cyBhcyBhIHNob3J0Y3V0IGZvciBhbGwgb2YgdGhlIHZhbHVlcyBhYm92ZS4KK1RoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgYXJlIGVxdWl2YWxlbnQ6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorQE1hbnlUb09uZShjYXNjYWRlPXtDYXNjYWRlVHlwZS5QRVJTSVNULENhc2NhZGVUeXBlLlJFTU9WRSwKKyAgICBDYXNjYWRlVHlwZS5SRUZSRVNILENhc2NhZGVUeXBlLk1FUkdFfSkKK3ByaXZhdGUgQ29tcGFueSBwdWJsaXNoZXI7Cis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorQE1hbnlUb09uZShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkKK3ByaXZhdGUgQ29tcGFueSBwdWJsaXNoZXI7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSW4gWE1MLCB0aGVzZSBlbnVtZXJhdGlvbiBjb25zdGFudHMgYXJlIGF2YWlsYWJsZSBhcyBjaGlsZCBlbGVtZW50cyBvZiB0aGUKKzxsaXRlcmFsPmNhc2NhZGU8L2xpdGVyYWw+IGVsZW1lbnQuIFRoZSA8bGl0ZXJhbD5jYXNjYWRlPC9saXRlcmFsPiBlbGVtZW50IGlzCitpdHNlbGYgYSBjaGlsZCBvZiA8bGl0ZXJhbD5tYW55LXRvLW9uZTwvbGl0ZXJhbD4uIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlCitlcXVpdmFsZW50OgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDttYW55LXRvLW9uZSBuYW1lPSJwdWJsaXNoZXIiJmd0OworICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgJmx0O2Nhc2NhZGUtbWVyZ2UvJmd0OworICAgICAgICAmbHQ7Y2FzY2FkZS1yZW1vdmUvJmd0OworICAgICAgICAmbHQ7Y2FzY2FkZS1yZWZyZXNoLyZndDsKKyAgICAmbHQ7L2Nhc2NhZGUmZ3Q7CismbHQ7L21hbnktdG8tb25lJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDttYW55LXRvLW9uZSBuYW1lPSJwdWJsaXNoZXIiJmd0OworICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAmbHQ7Y2FzY2FkZS1hbGwvJmd0OworICAgICZsdDsvY2FzY2FkZSZndDsKKyZsdDsvbWFueS10by1vbmUmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9vbmV0b21hbnkiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE9uZSBUbyBNYW55CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9vbmV0b21hbnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBPbmVUb01hbnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfb25ldG9tYW55Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgT25lVG9NYW55CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfb25ldG9tYW55Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgT25lVG9NYW55CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiBhbiBlbnRpdHkgPGxpdGVyYWw+QTwvbGl0ZXJhbD4gcmVmZXJlbmNlcyBtdWx0aXBsZSA8bGl0ZXJhbD5CPC9saXRlcmFsPgorZW50aXRpZXMsIGFuZCBubyB0d28gPGxpdGVyYWw+QTwvbGl0ZXJhbD5zIHJlZmVyZW5jZSB0aGUgc2FtZSA8bGl0ZXJhbD4KK0I8L2xpdGVyYWw+LCB3ZSBzYXkgdGhlcmUgaXMgYSA8ZW1waGFzaXM+b25lIHRvIG1hbnk8L2VtcGhhc2lzPiByZWxhdGlvbiBmcm9tCis8bGl0ZXJhbD5BPC9saXRlcmFsPiB0byA8bGl0ZXJhbD5CPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorT25lIHRvIG1hbnkgcmVsYXRpb25zIGFyZSB0aGUgZXhhY3QgaW52ZXJzZSBvZiB0aGUgbWFueSB0byBvbmUgcmVsYXRpb25zIHdlCitkZXRhaWxlZCBpbiB0aGUgcHJlY2VkaW5nIHNlY3Rpb24uIEluIHRoYXQgc2VjdGlvbiwgd2Ugc2FpZCB0aGF0IHRoZSA8bGl0ZXJhbD4KK01hZ2F6aW5lLnB1Ymxpc2hlcjwvbGl0ZXJhbD4gZmllbGQgaXMgYSBtYW55IHRvIG9uZSByZWxhdGlvbiBmcm9tIG1hZ2F6aW5lcyB0bworcHVibGlzaGVycy4gTm93LCB3ZSBzZWUgdGhhdCB0aGUgPGxpdGVyYWw+Q29tcGFueS5tYWdzPC9saXRlcmFsPiBmaWVsZCBpcyB0aGUKK2ludmVyc2UgLSBhIG9uZSB0byBtYW55IHJlbGF0aW9uIGZyb20gcHVibGlzaGVycyB0byBtYWdhemluZXMuIEVhY2ggY29tcGFueSBtYXkKK3B1Ymxpc2ggbXVsdGlwbGUgbWFnYXppbmVzLCBidXQgZWFjaCBtYWdhemluZSBjYW4gaGF2ZSBvbmx5IG9uZSBwdWJsaXNoZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSBpbmRpY2F0ZXMgb25lIHRvIG1hbnkgcmVsYXRpb25zIGJldHdlZW4gZW50aXRpZXMgd2l0aCB0aGUgPGNsYXNzbmFtZT4KK09uZVRvTWFueTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLiBUaGlzIGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNsYXNzIHRhcmdldEVudGl0eTwvbGl0ZXJhbD46IFRoZSBjbGFzcyBvZiB0aGUgcmVsYXRlZCBlbnRpdHkgdHlwZS4KK1RoaXMgaW5mb3JtYXRpb24gaXMgdXN1YWxseSB0YWtlbiBmcm9tIHRoZSBwYXJhbWV0ZXJpemVkIGNvbGxlY3Rpb24gb3IgbWFwCitlbGVtZW50IHR5cGUuIFlvdSBtdXN0IHN1cHBseSBpdCBleHBsaWNpdGx5LCBob3dldmVyLCBpZiB5b3VyIGZpZWxkIGlzbid0IGEKK3BhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBtYXBwZWRCeTwvbGl0ZXJhbD46IE5hbWVzIHRoZSBtYW55IHRvIG9uZSBmaWVsZCBpbiB0aGUgcmVsYXRlZAorZW50aXR5IHRoYXQgbWFwcyB0aGlzIGJpZGlyZWN0aW9uYWwgcmVsYXRpb24uIFdlIGV4cGxhaW4gYmlkaXJlY3Rpb25hbCByZWxhdGlvbnMKK2JlbG93LiBMZWF2aW5nIHRoaXMgcHJvcGVydHkgdW5zZXQgc2lnbmFscyB0aGF0IHRoaXMgaXMgYSBzdGFuZGFyZAordW5pZGlyZWN0aW9uYWwgcmVsYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DYXNjYWRlVHlwZVtdIGNhc2NhZGU8L2xpdGVyYWw+OiBBcnJheSBvZiBlbnVtIHZhbHVlcyBkZWZpbmluZyBjYXNjYWRlCitiZWhhdmlvciBmb3IgdGhlIGNvbGxlY3Rpb24gZWxlbWVudHMuIFdlIGV4cGxvcmUgY2FzY2FkZXMgYWJvdmUgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiLz4uIERlZmF1bHRzIHRvIGFuIGVtcHR5IGFycmF5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RmV0Y2hUeXBlIGZldGNoPC9saXRlcmFsPjogV2hldGhlciB0byBsb2FkIHRoZSBmaWVsZCBlYWdlcmx5IAorKDxsaXRlcmFsPkZldGNoVHlwZS5FQUdFUjwvbGl0ZXJhbD4pIG9yIGxhemlseSAKKyg8bGl0ZXJhbD5GZXRjaFR5cGUuTEFaWTwvbGl0ZXJhbD4pLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK0ZldGNoVHlwZS5MQVpZPC9saXRlcmFsPi4gU2VlIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2ZldGNoIi8+IGFib3ZlIAorZm9yIGRldGFpbHMgb24gZmV0Y2ggdHlwZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPm9uZS10by1tYW55PC9saXRlcmFsPiwgd2hpY2ggaW5jbHVkZXMKK3RoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkuIFRoaXMgYXR0cmlidXRlIGlzCityZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRhcmdldC1lbnRpdHk8L2xpdGVyYWw+OiBUaGUgY2xhc3Mgb2YgdGhlIHJlbGF0ZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZldGNoPC9saXRlcmFsPjogT25lIG9mIDxsaXRlcmFsPkVBR0VSPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4KK0xBWlk8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bWFwcGVkLWJ5PC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IHRoYXQgb3ducyB0aGUKK3JlbGF0aW9uLiBTZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfZmllbGQiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBtYXkgYWxzbyBuZXN0IHRoZSA8bGl0ZXJhbD5jYXNjYWRlPC9saXRlcmFsPiBlbGVtZW50IHdpdGhpbiBhIDxsaXRlcmFsPgorb25lLXRvLW1hbnk8L2xpdGVyYWw+IGVsZW1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfbWFwcGVkYnkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQmlkaXJlY3Rpb25hbCBSZWxhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfbWFwcGVkYnkiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX21hcHBlZGJ5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRCeQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYXBwZWRieSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkQnkgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiB0d28gZmllbGRzIGFyZSBsb2dpY2FsIGludmVyc2VzIG9mIGVhY2ggb3RoZXIsIHRoZXkgZm9ybSBhIDxlbXBoYXNpcz4KK2JpZGlyZWN0aW9uYWwgcmVsYXRpb248L2VtcGhhc2lzPi4gT3VyIG1vZGVsIGNvbnRhaW5zIHR3byBiaWRpcmVjdGlvbmFsCityZWxhdGlvbnM6IDxsaXRlcmFsPk1hZ2F6aW5lLnB1Ymxpc2hlcjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkNvbXBhbnkubWFncworPC9saXRlcmFsPiBmb3JtIG9uZSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLCBhbmQgPGxpdGVyYWw+QXJ0aWNsZS5hdXRob3JzCis8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5BdXRob3IuYXJ0aWNsZXM8L2xpdGVyYWw+IGZvcm0gdGhlIG90aGVyLiBJbiBib3RoIGNhc2VzLAordGhlcmUgaXMgYSBjbGVhciBsaW5rIGJldHdlZW4gdGhlIHR3byBmaWVsZHMgdGhhdCBmb3JtIHRoZSByZWxhdGlvbnNoaXAuIEEKK21hZ2F6aW5lIHJlZmVycyB0byBpdHMgcHVibGlzaGVyIHdoaWxlIHRoZSBwdWJsaXNoZXIgcmVmZXJzIHRvIGFsbCBpdHMgcHVibGlzaGVkCittYWdhemluZXMuIEFuIGFydGljbGUgcmVmZXJzIHRvIGl0cyBhdXRob3JzIHdoaWxlIGVhY2ggYXV0aG9yIHJlZmVycyB0byBoZXIKK3dyaXR0ZW4gYXJ0aWNsZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiB0aGUgdHdvIGZpZWxkcyBvZiBhIGJpZGlyZWN0aW9uYWwgcmVsYXRpb24gc2hhcmUgdGhlIHNhbWUgZGF0YXN0b3JlCittYXBwaW5nLCBKUEEgZm9ybWFsaXplcyB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSA8bGl0ZXJhbD5tYXBwZWRCeTwvbGl0ZXJhbD4KK3Byb3BlcnR5LiBNYXJraW5nIDxsaXRlcmFsPkNvbXBhbnkubWFnczwvbGl0ZXJhbD4gYXMgPGxpdGVyYWw+bWFwcGVkQnk8L2xpdGVyYWw+Cis8bGl0ZXJhbD5NYWdhemluZS5wdWJsaXNoZXI8L2xpdGVyYWw+IG1lYW5zIHR3byB0aGluZ3M6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5Db21wYW55Lm1hZ3M8L2xpdGVyYWw+IHVzZXMgdGhlIGRhdGFzdG9yZSBtYXBwaW5nIGZvciA8bGl0ZXJhbD4KK01hZ2F6aW5lLnB1Ymxpc2hlcjwvbGl0ZXJhbD4sIGJ1dCBpbnZlcnNlcyBpdC4gSW4gZmFjdCwgaXQgaXMgaWxsZWdhbCB0bworc3BlY2lmeSBhbnkgYWRkaXRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uIHdoZW4geW91IHVzZSB0aGUgPGxpdGVyYWw+bWFwcGVkQnkKKzwvbGl0ZXJhbD4gcHJvcGVydHkuIEFsbCBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIHJlYWQgZnJvbSB0aGUgcmVmZXJlbmNlZCBmaWVsZC4KK1dlIGV4cGxvcmUgbWFwcGluZyBpbiBkZXB0aCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5NYWdhemluZS5wdWJsaXNoZXI8L2xpdGVyYWw+IGlzIHRoZSAib3duZXIiIG9mIHRoZSByZWxhdGlvbi4gVGhlIGZpZWxkCit0aGF0IHNwZWNpZmllcyB0aGUgbWFwcGluZyBkYXRhIGlzIGFsd2F5cyB0aGUgb3duZXIuIFRoaXMgbWVhbnMgdGhhdCBjaGFuZ2VzIHRvCit0aGUgPGxpdGVyYWw+TWFnYXppbmUucHVibGlzaGVyPC9saXRlcmFsPiBmaWVsZCBhcmUgcmVmbGVjdGVkIGluIHRoZSBkYXRhc3RvcmUsCit3aGlsZSBjaGFuZ2VzIHRvIHRoZSA8bGl0ZXJhbD5Db21wYW55Lm1hZ3M8L2xpdGVyYWw+IGZpZWxkIGFsb25lIGFyZSBub3QuCitDaGFuZ2VzIHRvIDxsaXRlcmFsPkNvbXBhbnkubWFnczwvbGl0ZXJhbD4gbWF5IHN0aWxsIGFmZmVjdCB0aGUgSlBBCitpbXBsZW1lbnRhdGlvbidzIGNhY2hlLCBob3dldmVyLiBUaHVzLCBpdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdSBrZWVwIHlvdXIKK29iamVjdCBtb2RlbCBjb25zaXN0ZW50IGJ5IHByb3Blcmx5IG1haW50YWluaW5nIGJvdGggc2lkZXMgb2YgeW91ciBiaWRpcmVjdGlvbmFsCityZWxhdGlvbnMgYXQgYWxsIHRpbWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3Ugc2hvdWxkIGFsd2F5cyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgPGxpdGVyYWw+bWFwcGVkQnk8L2xpdGVyYWw+IHByb3BlcnR5CityYXRoZXIgdGhhbiBtYXBwaW5nIGVhY2ggZmllbGQgb2YgYSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uIGluZGVwZW5kZW50bHkuCitGYWlsaW5nIHRvIGRvIHNvIG1heSByZXN1bHQgaW4gdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiB0cnlpbmcgdG8gdXBkYXRlIHRoZQorZGF0YWJhc2Ugd2l0aCBjb25mbGljdGluZyBkYXRhLiBCZSBjYXJlZnVsIHRvIG9ubHkgbWFyayBvbmUgc2lkZSBvZiB0aGUgcmVsYXRpb24KK2FzIDxsaXRlcmFsPm1hcHBlZEJ5PC9saXRlcmFsPiwgaG93ZXZlci4gT25lIHNpZGUgaGFzIHRvIGFjdHVhbGx5IGRvIHRoZQorbWFwcGluZyEKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBjb25maWd1cmUgT3BlbkpQQSB0byBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplIGJvdGggc2lkZXMgb2YgYQorYmlkaXJlY3Rpb25hbCByZWxhdGlvbiwgb3IgdG8gcGVyZm9ybSB2YXJpb3VzIGFjdGlvbnMgd2hlbiBpdCBkZXRlY3RzCitpbmNvbnNpc3RlbnQgcmVsYXRpb25zLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ludmVyc2VzIi8+IGluIHRoZQorUmVmZXJlbmNlIEd1aWRlIGZvciBkZXRhaWxzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9vbmV0b29uZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgT25lIFRvIE9uZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfb25ldG9vbmUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBPbmVUb09uZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9vbmV0b29uZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE9uZVRvT25lCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfb25ldG9vbmUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBPbmVUb09uZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gYW4gZW50aXR5IDxsaXRlcmFsPkE8L2xpdGVyYWw+IHJlZmVyZW5jZXMgYSBzaW5nbGUgZW50aXR5IDxsaXRlcmFsPgorQjwvbGl0ZXJhbD4sIGFuZCBubyBvdGhlciA8bGl0ZXJhbD5BPC9saXRlcmFsPnMgY2FuIHJlZmVyZW5jZSB0aGUgc2FtZSA8bGl0ZXJhbD4KK0I8L2xpdGVyYWw+LCB3ZSBzYXkgdGhlcmUgaXMgYSA8ZW1waGFzaXM+b25lIHRvIG9uZTwvZW1waGFzaXM+IHJlbGF0aW9uIGJldHdlZW4KKzxsaXRlcmFsPkE8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5CPC9saXRlcmFsPi4gSW4gb3VyIHNhbXBsZSBtb2RlbCwgPGNsYXNzbmFtZT4KK01hZ2F6aW5lPC9jbGFzc25hbWU+IGhhcyBhIG9uZSB0byBvbmUgcmVsYXRpb24gdG8gPGNsYXNzbmFtZT5BcnRpY2xlPC9jbGFzc25hbWU+Cit0aHJvdWdoIHRoZSA8bGl0ZXJhbD5NYWdhemluZS5jb3ZlckFydGljbGU8L2xpdGVyYWw+IGZpZWxkLiBObyB0d28gbWFnYXppbmVzIGNhbgoraGF2ZSB0aGUgc2FtZSBjb3ZlciBhcnRpY2xlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitKUEEgaW5kaWNhdGVzIG9uZSB0byBvbmUgcmVsYXRpb25zIGJldHdlZW4gZW50aXRpZXMgd2l0aCB0aGUgPGNsYXNzbmFtZT4KK09uZVRvT25lPC9jbGFzc25hbWU+IGFubm90YXRpb24uIFRoaXMgYW5ub3RhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q2xhc3MgdGFyZ2V0RW50aXR5PC9saXRlcmFsPjogVGhlIGNsYXNzIG9mIHRoZSByZWxhdGVkIGVudGl0eSB0eXBlLgorVGhpcyBpbmZvcm1hdGlvbiBpcyB1c3VhbGx5IHRha2VuIGZyb20gdGhlIGZpZWxkIHR5cGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgbWFwcGVkQnk8L2xpdGVyYWw+OiBOYW1lcyB0aGUgZmllbGQgaW4gdGhlIHJlbGF0ZWQgZW50aXR5IHRoYXQKK21hcHMgdGhpcyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLiBXZSBleHBsYWluIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYXBwZWRieSIvPiBhYm92ZS4gTGVhdmluZyB0aGlzIHByb3BlcnR5Cit1bnNldCBzaWduYWxzIHRoYXQgdGhpcyBpcyBhIHN0YW5kYXJkIHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q2FzY2FkZVR5cGVbXSBjYXNjYWRlPC9saXRlcmFsPjogQXJyYXkgb2YgZW51bSB2YWx1ZXMgZGVmaW5pbmcgY2FzY2FkZQorYmVoYXZpb3IgZm9yIHRoaXMgZmllbGQuIFdlIGV4cGxvcmUgY2FzY2FkZXMgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiLz4gYWJvdmUuIERlZmF1bHRzIHRvIGFuIGVtcHR5CithcnJheS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZldGNoVHlwZSBmZXRjaDwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gbG9hZCB0aGUgZmllbGQgZWFnZXJseSAKKyg8bGl0ZXJhbD5GZXRjaFR5cGUuRUFHRVI8L2xpdGVyYWw+KSBvciBsYXppbHkgCisoPGxpdGVyYWw+RmV0Y2hUeXBlLkxBWlk8L2xpdGVyYWw+KS4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+CitGZXRjaFR5cGUuRUFHRVI8L2xpdGVyYWw+LiBTZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfZmV0Y2giLz4gYWJvdmUgCitmb3IgZGV0YWlscyBvbiBmZXRjaCB0eXBlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gb3B0aW9uYWw8L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSByZWxhdGVkIG9iamVjdCBtdXN0IGV4aXN0LiBJZgorPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCB0aGlzIGZpZWxkIGNhbm5vdCBiZSBudWxsLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK3RydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZXF1aXZhbGVudCBYTUwgZWxlbWVudCBpcyA8bGl0ZXJhbD5vbmUtdG8tb25lPC9saXRlcmFsPiB3aGljaCB1bmRlcnN0YW5kcwordGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eS4gVGhpcyBhdHRyaWJ1dGUgaXMKK3JlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dGFyZ2V0LWVudGl0eTwvbGl0ZXJhbD46IFRoZSBjbGFzcyBvZiB0aGUgcmVsYXRlZCB0eXBlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+ZmV0Y2g8L2xpdGVyYWw+OiBPbmUgb2YgPGxpdGVyYWw+RUFHRVI8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPgorTEFaWTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5tYXBwZWQtYnk8L2xpdGVyYWw+OiBUaGUgZmllbGQgdGhhdCBvd25zIHRoZSByZWxhdGlvbi4gU2VlCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9maWVsZCIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IG1heSBhbHNvIG5lc3QgdGhlIDxsaXRlcmFsPmNhc2NhZGU8L2xpdGVyYWw+IGVsZW1lbnQgd2l0aGluIGEgPGxpdGVyYWw+CitvbmUtdG8tb25lPC9saXRlcmFsPiBlbGVtZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYW55dG9tYW55Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBNYW55IFRvIE1hbnkKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX21hbnl0b21hbnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYW55VG9NYW55CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19tZXRhX21hbnl0b21hbnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYW55VG9NYW55CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfbWFueXRvbWFueSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE1hbnlUb01hbnkKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitXaGVuIGFuIGVudGl0eSA8bGl0ZXJhbD5BPC9saXRlcmFsPiByZWZlcmVuY2VzIG11bHRpcGxlIDxsaXRlcmFsPkI8L2xpdGVyYWw+CitlbnRpdGllcywgYW5kIG90aGVyIDxsaXRlcmFsPkE8L2xpdGVyYWw+cyBtaWdodCByZWZlcmVuY2Ugc29tZSBvZiB0aGUgc2FtZQorPGxpdGVyYWw+QjwvbGl0ZXJhbD5zLCB3ZSBzYXkgdGhlcmUgaXMgYSA8ZW1waGFzaXM+bWFueSB0byBtYW55PC9lbXBoYXNpcz4KK3JlbGF0aW9uIGJldHdlZW4gPGxpdGVyYWw+QTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkI8L2xpdGVyYWw+LiBJbiBvdXIgc2FtcGxlCittb2RlbCwgZm9yIGV4YW1wbGUsIGVhY2ggYXJ0aWNsZSBoYXMgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSBhdXRob3JzIHRoYXQKK2NvbnRyaWJ1dGVkIHRvIHRoZSBhcnRpY2xlLiBPdGhlciBhcnRpY2xlcyBtaWdodCBoYXZlIHNvbWUgb2YgdGhlIHNhbWUgYXV0aG9ycy4KK1dlIHNheSwgdGhlbiwgdGhhdCA8Y2xhc3NuYW1lPkFydGljbGU8L2NsYXNzbmFtZT4gYW5kIDxjbGFzc25hbWU+QXV0aG9yCis8L2NsYXNzbmFtZT4gaGF2ZSBhIG1hbnkgdG8gbWFueSByZWxhdGlvbiB0aHJvdWdoIHRoZSA8bGl0ZXJhbD5BcnRpY2xlLmF1dGhvcnMKKzwvbGl0ZXJhbD4gZmllbGQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSBpbmRpY2F0ZXMgbWFueSB0byBtYW55IHJlbGF0aW9ucyBiZXR3ZWVuIGVudGl0aWVzIHdpdGggdGhlIDxjbGFzc25hbWU+CitNYW55VG9NYW55PC9jbGFzc25hbWU+IGFubm90YXRpb24uIFRoaXMgYW5ub3RhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q2xhc3MgdGFyZ2V0RW50aXR5PC9saXRlcmFsPjogVGhlIGNsYXNzIG9mIHRoZSByZWxhdGVkIGVudGl0eSB0eXBlLgorVGhpcyBpbmZvcm1hdGlvbiBpcyB1c3VhbGx5IHRha2VuIGZyb20gdGhlIHBhcmFtZXRlcml6ZWQgY29sbGVjdGlvbiBvciBtYXAKK2VsZW1lbnQgdHlwZS4gWW91IG11c3Qgc3VwcGx5IGl0IGV4cGxpY2l0bHksIGhvd2V2ZXIsIGlmIHlvdXIgZmllbGQgaXNuJ3QgYQorcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG1hcHBlZEJ5PC9saXRlcmFsPjogTmFtZXMgdGhlIG1hbnkgdG8gbWFueSBmaWVsZCBpbiB0aGUgcmVsYXRlZAorZW50aXR5IHRoYXQgbWFwcyB0aGlzIGJpZGlyZWN0aW9uYWwgcmVsYXRpb24uIFdlIGV4cGxhaW4gYmlkaXJlY3Rpb25hbCByZWxhdGlvbnMKK2luIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hcHBlZGJ5Ii8+IGFib3ZlLiBMZWF2aW5nIHRoaXMKK3Byb3BlcnR5IHVuc2V0IHNpZ25hbHMgdGhhdCB0aGlzIGlzIGEgc3RhbmRhcmQgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DYXNjYWRlVHlwZVtdIGNhc2NhZGU8L2xpdGVyYWw+OiBBcnJheSBvZiBlbnVtIHZhbHVlcyBkZWZpbmluZyBjYXNjYWRlCitiZWhhdmlvciBmb3IgdGhlIGNvbGxlY3Rpb24gZWxlbWVudHMuIFdlIGV4cGxvcmUgY2FzY2FkZXMgYWJvdmUgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiLz4uIERlZmF1bHRzIHRvIGFuIGVtcHR5IGFycmF5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RmV0Y2hUeXBlIGZldGNoPC9saXRlcmFsPjogV2hldGhlciB0byBsb2FkIHRoZSBmaWVsZCBlYWdlcmx5IAorKDxsaXRlcmFsPkZldGNoVHlwZS5FQUdFUjwvbGl0ZXJhbD4pIG9yIGxhemlseSAKKyg8bGl0ZXJhbD5GZXRjaFR5cGUuTEFaWTwvbGl0ZXJhbD4pLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK0ZldGNoVHlwZS5MQVpZPC9saXRlcmFsPi4gU2VlIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2ZldGNoIi8+IGFib3ZlIAorZm9yIGRldGFpbHMgb24gZmV0Y2ggdHlwZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPm1hbnktdG8tbWFueTwvbGl0ZXJhbD4uIEl0IGFjY2VwdHMgdGhlCitmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkuIFRoaXMgYXR0cmlidXRlIGlzCityZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRhcmdldC1lbnRpdHk8L2xpdGVyYWw+OiBUaGUgY2xhc3Mgb2YgdGhlIHJlbGF0ZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZldGNoPC9saXRlcmFsPjogT25lIG9mIDxsaXRlcmFsPkVBR0VSPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4KK0xBWlk8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bWFwcGVkLWJ5PC9saXRlcmFsPjogVGhlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb24uIFNlZQorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfZmllbGQiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBtYXkgYWxzbyBuZXN0IHRoZSA8bGl0ZXJhbD5jYXNjYWRlPC9saXRlcmFsPiBlbGVtZW50IHdpdGhpbiBhIDxsaXRlcmFsPgorbWFueS10by1tYW55PC9saXRlcmFsPiBlbGVtZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9vcmRlcmJ5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBPcmRlciBCeQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfb3JkZXJieSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9yZGVyQnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfb3JkZXJieSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE9yZGVyQnkKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9vcmRlcmJ5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgT3JkZXJCeQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0RhdGFzdG9yZXMgc3VjaCBhcyByZWxhdGlvbmFsIGRhdGFiYXNlcyBkbyBub3QgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHJlY29yZHMuCitZb3VyIHBlcnNpc3RlbnQgPGNsYXNzbmFtZT5MaXN0PC9jbGFzc25hbWU+IGZpZWxkcyBtaWdodCBiZSBvcmRlcmVkIG9uZSB3YXkgdGhlCitmaXJzdCB0aW1lIHlvdSByZXRyaWV2ZSBhbiBvYmplY3QgZnJvbSB0aGUgZGF0YXN0b3JlLCBhbmQgYSBjb21wbGV0ZWx5IGRpZmZlcmVudAord2F5IHRoZSBuZXh0LiBUbyBlbnN1cmUgY29uc2lzdGVudCBvcmRlcmluZyBvZiBjb2xsZWN0aW9uIGZpZWxkcywgeW91IG11c3QgdXNlCit0aGUgPGNsYXNzbmFtZT5PcmRlckJ5PC9jbGFzc25hbWU+IGFubm90YXRpb24uIFRoZSA8Y2xhc3NuYW1lPk9yZGVyQnkKKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uJ3MgdmFsdWUgaXMgYSBzdHJpbmcgZGVmaW5pbmcgdGhlIG9yZGVyIG9mIHRoZSBjb2xsZWN0aW9uCitlbGVtZW50cy4gQW4gZW1wdHkgdmFsdWUgbWVhbnMgdG8gc29ydCBvbiB0aGUgaWRlbnRpdHkgdmFsdWUocykgb2YgdGhlIGVsZW1lbnRzCitpbiBhc2NlbmRpbmcgb3JkZXIuIEFueSBvdGhlciB2YWx1ZSBtdXN0IGJlIG9mIHRoZSBmb3JtOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O2ZpZWxkIG5hbWUmZ3Q7WyBBU0N8REVTQ11bLCAuLi5dCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitFYWNoIDxsaXRlcmFsPiZsdDtmaWVsZCBuYW1lJmd0OzwvbGl0ZXJhbD4gaXMgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW50IGZpZWxkIGluCit0aGUgY29sbGVjdGlvbidzIGVsZW1lbnQgdHlwZS4gWW91IGNhbiBvcHRpb25hbGx5IGZvbGxvdyBlYWNoIGZpZWxkIGJ5IHRoZQora2V5d29yZCA8bGl0ZXJhbD5BU0M8L2xpdGVyYWw+IGZvciBhc2NlbmRpbmcgb3JkZXIsIG9yIDxsaXRlcmFsPkRFU0M8L2xpdGVyYWw+Citmb3IgZGVzY2VuZGluZyBvcmRlci4gSWYgdGhlIGRpcmVjdGlvbiBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhc2NlbmRpbmcuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPm9yZGVyLWJ5PC9saXRlcmFsPiB3aGljaCBjYW4gYmUgbGlzdGVkIGFzCithIHN1Yi1lbGVtZW50IG9mIHRoZSA8bGl0ZXJhbD5vbmUtdG8tbWFueTwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+bWFueS10by1tYW55Cis8L2xpdGVyYWw+IGVsZW1lbnRzLiBUaGUgdGV4dCB3aXRoaW4gdGhpcyBlbGVtZW50IGlzIHBhcnNlZCBhcyB0aGUgb3JkZXIgYnkKK3N0cmluZy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfbWFwa2V5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBNYXAgS2V5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYXBrZXkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXBLZXkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfbWFwa2V5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgTWFwS2V5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X21ldGFfbWFwa2V5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgTWFwS2V5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorSlBBIHN1cHBvcnRzIHBlcnNpc3RlbnQgPGNsYXNzbmFtZT5NYXA8L2NsYXNzbmFtZT4gZmllbGRzIHRocm91Z2ggZWl0aGVyIGEKKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX29uZXRvbWFueSI+PGNsYXNzbmFtZT4gT25lVG9NYW55PC9jbGFzc25hbWU+Cis8L2xpbms+IG9yIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hbnl0b21hbnkiPjxjbGFzc25hbWU+TWFueVRvTWFueQorPC9jbGFzc25hbWU+PC9saW5rPiBhc3NvY2lhdGlvbi4gVGhlIHJlbGF0ZWQgZW50aXRpZXMgZm9ybSB0aGUgbWFwIHZhbHVlcy4gSlBBCitkZXJpdmVzIHRoZSBtYXAga2V5cyBieSBleHRyYWN0aW5nIGEgZmllbGQgZnJvbSBlYWNoIGVudGl0eSB2YWx1ZS4gVGhlCis8Y2xhc3NuYW1lPk1hcEtleTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGRlc2lnbmF0ZXMgdGhlIGZpZWxkIHRoYXQgaXMgdXNlZCBhcwordGhlIGtleS4gSXQgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgYSBmaWVsZCBpbiB0aGUgcmVsYXRlZCBlbnRpdHkgY2xhc3MKK3RvIHVzZSBhcyB0aGUgbWFwIGtleS4gSWYgbm8gbmFtZSBpcyBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGlkZW50aXR5IGZpZWxkIG9mCit0aGUgcmVsYXRlZCBlbnRpdHkgY2xhc3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlcXVpdmFsZW50IFhNTCBlbGVtZW50IGlzIDxsaXRlcmFsPm1hcC1rZXk8L2xpdGVyYWw+IHdoaWNoIGNhbiBiZSBsaXN0ZWQgYXMKK2Egc3ViLWVsZW1lbnQgb2YgdGhlIDxsaXRlcmFsPm9uZS10by1tYW55PC9saXRlcmFsPiBvciA8bGl0ZXJhbD5tYW55LXRvLW1hbnkKKzwvbGl0ZXJhbD4gZWxlbWVudHMuIFRoZSA8bGl0ZXJhbD5tYXAta2V5PC9saXRlcmFsPiBlbGVtZW50IGhhcyB0aGUgZm9sbG93aW5nCithdHRyaWJ1dGVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgcmVsYXRlZCBlbnRpdHkgY2xhc3MgdG8KK3VzZSBhcyB0aGUgbWFwIGtleS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfZmllbGRkZWZhdWx0cyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgUGVyc2lzdGVudCBGaWVsZCBEZWZhdWx0cworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gdGhlIGFic2VuY2Ugb2YgYW55IG9mIHRoZSBhbm5vdGF0aW9ucyBhYm92ZSwgSlBBIGRlZmluZXMgdGhlIGZvbGxvd2luZworZGVmYXVsdCBiZWhhdmlvciBmb3IgZGVjbGFyZWQgZmllbGRzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGaWVsZHMgZGVjbGFyZWQgPGxpdGVyYWw+c3RhdGljLCB0cmFuc2llbnQ8L2xpdGVyYWw+LCBvciA8bGl0ZXJhbD5maW5hbAorPC9saXRlcmFsPiBkZWZhdWx0IHRvIG5vbi1wZXJzaXN0ZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRmllbGRzIG9mIGFueSBwcmltaXRpdmUgdHlwZSwgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZSwgPGNsYXNzbmFtZT4KK2phdmEubGFuZy5TdHJpbmc8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+Ynl0ZVtdPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPgorQnl0ZVtdPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPmNoYXJbXTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT4KK0NoYXJhY3RlcltdPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jbGFzc25hbWU+LCAKKzxjbGFzc25hbWU+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+CitqYXZhLnV0aWwuRGF0ZTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT4gamF2YS51dGlsLkNhbGVuZGFyPC9jbGFzc25hbWU+LCAKKzxjbGFzc25hbWU+amF2YS5zcWwuRGF0ZTwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NsYXNzbmFtZT4sCitvciBhbnkgPGNsYXNzbmFtZT5TZXJpYWxpemFibGU8L2NsYXNzbmFtZT4gdHlwZSBkZWZhdWx0IHRvIHBlcnNpc3RlbnQsIGFzIGlmIAorYW5ub3RhdGVkIHdpdGggPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfYmFzaWMiPjxsaXRlcmFsPgorQEJhc2ljPC9saXRlcmFsPjwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGaWVsZHMgb2YgYW4gZW1iZWRkYWJsZSB0eXBlIGRlZmF1bHQgdG8gcGVyc2lzdGVudCwgYXMgaWYgYW5ub3RhdGVkIHdpdGgKKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2VtYmVkZGVkIj48bGl0ZXJhbD5ARW1iZWRkZWQ8L2xpdGVyYWw+PC9saW5rPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FsbCBvdGhlciBmaWVsZHMgZGVmYXVsdCB0byBub24tcGVyc2lzdGVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitOb3RlIHRoYXQgYWNjb3JkaW5nIHRvIHRoZXNlIGRlZmF1bHRzLCBhbGwgcmVsYXRpb25zIGJldHdlZW4gZW50aXRpZXMgbXVzdCBiZQorYW5ub3RhdGVkIGV4cGxpY2l0bHkuIFdpdGhvdXQgYW4gYW5ub3RhdGlvbiwgYSByZWxhdGlvbiBmaWVsZCB3aWxsIGRlZmF1bHQgdG8KK3NlcmlhbGl6ZWQgc3RvcmFnZSBpZiB0aGUgcmVsYXRlZCBlbnRpdHkgdHlwZSBpcyBzZXJpYWxpemFibGUsIG9yIHdpbGwgZGVmYXVsdAordG8gYmVpbmcgbm9uLXBlcnNpc3RlbnQgaWYgbm90LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV94bWwiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBYTUwgU2NoZW1hCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBYU0QKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEpQQQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgWE1MCisgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorV2UgcHJlc2VudCB0aGUgY29tcGxldGUgWE1MIHNjaGVtYSBiZWxvdy4gTWFueSBvZiB0aGUgZWxlbWVudHMgcmVsYXRlIHRvCitvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIHJhdGhlciB0aGFuIG1ldGFkYXRhOyB0aGVzZSBlbGVtZW50cyBhcmUgZGlzY3Vzc2VkIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPi4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKKyZsdDt4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIiAKKyAgeG1sbnM6b3JtPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKKyAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAorICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAorICB2ZXJzaW9uPSIxLjAiJmd0OworCisgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgICBAKCMpb3JtXzFfMC54c2QgMS4wICBGZWIgMTQgMjAwNgorICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIHBlcnNpc3RlbmNlIG9iamVjdC1yZWxhdGlvbmFsIAorICAgICAgIG1hcHBpbmcgZmlsZS4KKyAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL29ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZSAKKyAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUgCisgICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KKworICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8mZ3Q7CisKKyAgJmx0O3hzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIiZndDsKKyAgICAmbHQ7eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiImZ3Q7CisgICAgICAmbHQ7eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8mZ3Q7CisgICAgJmx0Oy94c2Q6cmVzdHJpY3Rpb24mZ3Q7CisgICZsdDsveHNkOnNpbXBsZVR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiJmd0OworICAgICZsdDt4c2Q6Y29tcGxleFR5cGUmZ3Q7CisgICAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCisgICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKKworICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCisgICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgIAorICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCisgICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KKyAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgorCisgICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCisgICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCisgICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCisgICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQorICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCisgICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnkgb3IgbmFtZWQtbmF0aXZlLXF1ZXJ5CisgICAgICAgIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSAKKyAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQorICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCisgICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5CisgICAgICAgIGJlIHBhcnRpYWwuCisKKyAgICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAorICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAorICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAorICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMCIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworICAmbHQ7L3hzZDplbGVtZW50Jmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAorICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCisKKyAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkIHRoZW4gCisgICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCisgICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCisgICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAorICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKKyAgICAgICAgCisgICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCisgICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKKyAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KKyAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCisgICAgICAgICAgICBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKKyAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQorICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCisgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCisgICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKKyAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAorICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCisgICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCisKKyAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgorICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKKyAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKKyAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZworICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmNob2ljZSZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDsveHNkOmNob2ljZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQorICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLyZndDsKKyAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8mZ3Q7CisgICAgJmx0Oy94c2Q6cmVzdHJpY3Rpb24mZ3Q7CisgICZsdDsveHNkOnNpbXBsZVR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7CisgICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKKyAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7CisgICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7CisgICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7CisgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKKyAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307CisgICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgICB9CisKKyAgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCisgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7CisgICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCisgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKKyAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgorICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQorICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OworCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLyZndDsKKyAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvJmd0OworICAgICZsdDsveHNkOnJlc3RyaWN0aW9uJmd0OworICAmbHQ7L3hzZDpzaW1wbGVUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgorICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgeworICAgICAgICAgIENsYXNzIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgeworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDpjaG9pY2UmZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7L3hzZDpjaG9pY2UmZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OworCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLyZndDsKKyAgICAmbHQ7L3hzZDpyZXN0cmljdGlvbiZndDsKKyAgJmx0Oy94c2Q6c2ltcGxlVHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgeworICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8mZ3Q7CisgICZsdDsveHNkOnNpbXBsZVR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKKyAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCisgICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQorICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiImZ3Q7CisgICAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvJmd0OworICAgICAgICAmbHQ7eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLyZndDsKKyAgICAgJmx0Oy94c2Q6cmVzdHJpY3Rpb24mZ3Q7CisgICZsdDsveHNkOnNpbXBsZVR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7CisgICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvJmd0OworICAmbHQ7L3hzZDpzaW1wbGVUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgeworICAgICAgICAgIE9SRElOQUwsCisgICAgICAgICAgU1RSSU5HCisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIiZndDsKKyAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLyZndDsKKyAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvJmd0OworICAgICZsdDsveHNkOnJlc3RyaWN0aW9uJmd0OworICAmbHQ7L3hzZDpzaW1wbGVUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOworICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmNob2ljZSZndDsgICAgICAgCisgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0Oy94c2Q6Y2hvaWNlJmd0OyAgICAgICAKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOworICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6Y2hvaWNlJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7L3hzZDpjaG9pY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6Y2hvaWNlJmd0OyAgICAgICAKKyAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAmbHQ7L3hzZDpjaG9pY2UmZ3Q7ICAgICAgIAorICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55IiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7CisgICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOworICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOworICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7CisgICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87CisgICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5IiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICZsdDsveHNkOnNpbXBsZVR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7CisgICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKKyAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OworCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLyZndDsKKyAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvJmd0OworICAgICZsdDsveHNkOnJlc3RyaWN0aW9uJmd0OworICAmbHQ7L3hzZDpzaW1wbGVUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvJmd0OworICAmbHQ7L3hzZDpzaW1wbGVUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKKworICAgICAgJmx0Oy94c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAmbHQ7L3hzZDphbm5vdGF0aW9uJmd0OworICAgICZsdDt4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIiZndDsKKyAgICAgICZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvJmd0OworICAgICAgJmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvJmd0OworICAgICZsdDsveHNkOnJlc3RyaWN0aW9uJmd0OworICAmbHQ7L3hzZDpzaW1wbGVUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiZndDsKKyAgICAmbHQ7eHNkOmFubm90YXRpb24mZ3Q7CisgICAgICAmbHQ7eHNkOmRvY3VtZW50YXRpb24mZ3Q7CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOworICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOworICAgICAgICB9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKKyAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKKyAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAorICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCisgICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCisgICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmVtYmVkZGFibGUtYXR0cmlidXRlcyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlLWF0dHJpYnV0ZXMiJmd0OworICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKKworICAmbHQ7IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0mZ3Q7CisKKyAgJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9CisKKyAgICAgICZsdDsveHNkOmRvY3VtZW50YXRpb24mZ3Q7CisgICAgJmx0Oy94c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvJmd0OworICAgICZsdDsveHNkOnNlcXVlbmNlJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLyZndDsKKyAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7CisKKyAgJmx0OyEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tJmd0OworCisgICZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiJmd0OworICAgICZsdDt4c2Q6YW5ub3RhdGlvbiZndDsKKyAgICAgICZsdDt4c2Q6ZG9jdW1lbnRhdGlvbiZndDsKKworICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAorICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAorICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCisgICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKKyAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCisgICAgICAgIGFwcGxpZWQuCisKKyAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvJmd0OworICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLyZndDsKKyAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7CisgICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCisgICZsdDshLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLSZndDsKKworICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciImZ3Q7CisgICAgJmx0O3hzZDphbm5vdGF0aW9uJmd0OworICAgICAgJmx0O3hzZDpkb2N1bWVudGF0aW9uJmd0OworCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOworICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICAmbHQ7L3hzZDpkb2N1bWVudGF0aW9uJmd0OworICAgICZsdDsveHNkOmFubm90YXRpb24mZ3Q7CisgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKKyAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0OworICAgICZsdDt4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsKKyAgICAmbHQ7eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7CisgICAgJmx0O3hzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7CisgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OworCismbHQ7L3hzZDpzY2hlbWEmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X21ldGFfY29tcGxldGUiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBDb25jbHVzaW9uCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhhdCBleGhhdXN0cyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBhbm5vdGF0aW9ucy4gV2UgcHJlc2VudCB0aGUgY2xhc3MgZGVmaW5pdGlvbnMKK2ZvciBvdXIgc2FtcGxlIG1vZGVsIGJlbG93OgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfbWV0YV9jb21wbGV0ZV9leCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ29tcGxldGUgTWV0YWRhdGEKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwYWNrYWdlIG9yZy5tYWc7CisKK0BFbnRpdHkKK0BJZENsYXNzKE1hZ2F6aW5lLk1hZ2F6aW5lSWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgQElkIHByaXZhdGUgU3RyaW5nIGlzYm47CisgICAgQElkIHByaXZhdGUgU3RyaW5nIHRpdGxlOworICAgIEBWZXJzaW9uIHByaXZhdGUgaW50IHZlcnNpb247CisKKyAgICBwcml2YXRlIGRvdWJsZSBwcmljZTsgICAvLyBkZWZhdWx0cyB0byBAQmFzaWMKKyAgICBwcml2YXRlIGludCBjb3BpZXNTb2xkOyAvLyBkZWZhdWx0cyB0byBAQmFzaWMKKworICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgCisgICAgICAgIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLlBFUlNJU1QsQ2FzY2FkZVR5cGUuUkVNT1ZFfSkKKyAgICBwcml2YXRlIEFydGljbGUgY292ZXJBcnRpY2xlOworCisgICAgQE9uZVRvTWFueShjYXNjYWRlPXtDYXNjYWRlVHlwZS5QRVJTSVNULENhc2NhZGVUeXBlLlJFTU9WRX0pCisgICAgQE9yZGVyQnkKKyAgICBwcml2YXRlIENvbGxlY3Rpb24mbHQ7QXJ0aWNsZSZndDsgYXJ0aWNsZXM7CisKKyAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBjYXNjYWRlPUNhc2NhZGVUeXBlLlBFUlNJU1QpCisgICAgcHJpdmF0ZSBDb21wYW55IHB1Ymxpc2hlcjsgCisKKyAgICBAVHJhbnNpZW50IHByaXZhdGUgYnl0ZVtdIGRhdGE7CisKKyAgICAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFnYXppbmVJZCB7CisgICAgICAgIC4uLgorICAgIH0KK30KKworQEVudGl0eQorcHVibGljIGNsYXNzIEFydGljbGUgeworCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOyAgIC8vIGRlZmF1bHRzIHRvIEBCYXNpYworICAgIHByaXZhdGUgYnl0ZVtdIGNvbnRlbnQ7IC8vIGRlZmF1bHRzIHRvIEBCYXNpYworCisgICAgQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS5QRVJTSVNUKQorICAgIEBPcmRlckJ5KCJsYXN0TmFtZSwgZmlyc3ROYW1lIikKKyAgICBwcml2YXRlIENvbGxlY3Rpb24mbHQ7QXV0aG9yJmd0OyBhdXRob3JzOworCisgICAgLi4uCit9CisKKworcGFja2FnZSBvcmcubWFnLnB1YjsKKworQEVudGl0eQorcHVibGljIGNsYXNzIENvbXBhbnkgeworCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsgICAgIC8vIGRlZmF1bHRzIHRvIEBCYXNpYworICAgIHByaXZhdGUgZG91YmxlIHJldmVudWU7ICAvLyBkZWZhdWx0cyB0byBAQmFzaWMKKyAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsgLy8gZGVmYXVsdHMgdG8gQEVtYmVkZGVkCisgICAgCisgICAgQE9uZVRvTWFueShtYXBwZWRCeT0icHVibGlzaGVyIiwgY2FzY2FkZT1DYXNjYWRlVHlwZS5QRVJTSVNUKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtNYWdhemluZSZndDsgbWFnczsKKworICAgIEBPbmVUb01hbnkoY2FzY2FkZT17Q2FzY2FkZVR5cGUuUEVSU0lTVCxDYXNjYWRlVHlwZS5SRU1PVkV9KQorICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtTdWJzY3JpcHRpb24mZ3Q7IHN1YnNjcmlwdGlvbnM7CisKKyAgICAuLi4KK30KKworQEVudGl0eQorcHVibGljIGNsYXNzIEF1dGhvciB7CisKKyAgICBASWQgcHJpdmF0ZSBsb25nIGlkOworICAgIEBWZXJzaW9uIHByaXZhdGUgaW50IHZlcnNpb247CisKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7IC8vIGRlZmF1bHRzIHRvIEBCYXNpYworICAgIHByaXZhdGUgZG91YmxlIGxhc3ROYW1lOyAgLy8gZGVmYXVsdHMgdG8gQEJhc2ljCisgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7ICAvLyBkZWZhdWx0cyB0byBARW1iZWRkZWQKKyAgICAKKyAgICBATWFueVRvTWFueShtYXBwZWRCeT0iYXV0aG9ycyIsIGNhc2NhZGU9Q2FzY2FkZVR5cGUuUEVSU0lTVCkKKyAgICBwcml2YXRlIENvbGxlY3Rpb24mbHQ7QXJ0aWNsZSZndDsgYXJ0czsKKworICAgIC4uLgorfQorCitARW1iZWRkYWJsZQorcHVibGljIGNsYXNzIEFkZHJlc3MgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyAvLyBkZWZhdWx0cyB0byBAQmFzaWMKKyAgICBwcml2YXRlIFN0cmluZyBjaXR5OyAgIC8vIGRlZmF1bHRzIHRvIEBCYXNpYworICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyAgLy8gZGVmYXVsdHMgdG8gQEJhc2ljCisgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyAgICAvLyBkZWZhdWx0cyB0byBAQmFzaWMKKworICAgIC4uLgorfQorCisKK3BhY2thZ2Ugb3JnLm1hZy5zdWJzY3JpYmU7CisKK0BNYXBwZWRTdXBlcmNsYXNzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnQgeworCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBDb250cmFjdAorICAgIGV4dGVuZHMgRG9jdW1lbnQgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGVybXM7IC8vIGRlZmF1bHRzIHRvIEBCYXNpYworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb24geworCisgICAgQElkIHByaXZhdGUgbG9uZyBpZDsKKyAgICBAVmVyc2lvbiBwcml2YXRlIGludCB2ZXJzaW9uOworCisgICAgcHJpdmF0ZSBEYXRlIHN0YXJ0RGF0ZTsgLy8gZGVmYXVsdHMgdG8gQEJhc2ljCisgICAgcHJpdmF0ZSBkb3VibGUgcGF5bWVudDsgLy8gZGVmYXVsdHMgdG8gQEJhc2ljCisKKyAgICBAT25lVG9NYW55KGNhc2NhZGU9e0Nhc2NhZGVUeXBlLlBFUlNJU1QsQ2FzY2FkZVR5cGUuUkVNT1ZFfSkKKyAgICBATWFwS2V5KG5hbWU9Im51bSIpCisgICAgcHJpdmF0ZSBNYXAmbHQ7TG9uZyxMaW5lSXRlbSZndDsgbGluZUl0ZW1zOworCisgICAgLi4uCisKKyAgICBARW50aXR5CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lSXRlbQorICAgICAgICBleHRlbmRzIENvbnRyYWN0IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBjb21tZW50czsgLy8gZGVmYXVsdHMgdG8gQEJhc2ljCisgICAgICAgIHByaXZhdGUgZG91YmxlIHByaWNlOyAgICAvLyBkZWZhdWx0cyB0byBAQmFzaWMKKyAgICAgICAgcHJpdmF0ZSBsb25nIG51bTsgICAgICAgIC8vIGRlZmF1bHRzIHRvIEBCYXNpYworCisgICAgICAgIEBNYW55VG9PbmUKKyAgICAgICAgcHJpdmF0ZSBNYWdhemluZSBtYWdhemluZTsKKworICAgICAgICAuLi4KKyAgICB9Cit9CisKK0BFbnRpdHkobmFtZT0iTGlmZXRpbWUiKQorcHVibGljIGNsYXNzIExpZmV0aW1lU3Vic2NyaXB0aW9uCisgICAgZXh0ZW5kcyBTdWJzY3JpcHRpb24geworCisgICAgQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZKQorICAgIHByaXZhdGUgYm9vbGVhbiBnZXRFbGl0ZUNsdWIoKSB7IC4uLiB9CisgICAgcHVibGljIHZvaWQgc2V0RWxpdGVDbHViKGJvb2xlYW4gZWxpdGUpIHsgLi4uIH0KKworICAgIC4uLgorfQorCitARW50aXR5KG5hbWU9IlRyaWFsIikKK3B1YmxpYyBjbGFzcyBUcmlhbFN1YnNjcmlwdGlvbgorICAgIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKKworICAgIHB1YmxpYyBEYXRlIGdldEVuZERhdGUoKSB7IC4uLiB9CisgICAgcHVibGljIHZvaWQgc2V0RW5kRGF0ZShEYXRlIGVuZCkgeyAuLi4gfQorCisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtZSBtZXRhZGF0YSBkZWNsYXJhdGlvbnMgaW4gWE1MOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O2VudGl0eS1tYXBwaW5ncyZndDsKKyAgICAmbHQ7IS0tIGRlY2xhcmVzIGEgZGVmYXVsdCBhY2Nlc3MgdHlwZSBmb3IgYWxsIGVudGl0aWVzIC0tJmd0OworICAgICZsdDthY2Nlc3MtdHlwZSZndDtGSUVMRCZsdDsvYWNjZXNzLXR5cGUmZ3Q7CisgICAgJmx0O21hcHBlZC1zdXBlcmNsYXNzIGNsYXNzPSJvcmcubWFnLnN1YnNjcmliZS5Eb2N1bWVudCImZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Z2VuZXJhdGVkLXZhbHVlIHN0cmF0ZWd5PSJJREVOVElUWSIvJmd0OworICAgICAgICAgICAgJmx0Oy9pZCZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iLyZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvbWFwcGVkLXN1cGVyY2xhc3MmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5NYWdhemluZSImZ3Q7CisgICAgICAgICZsdDtpZC1jbGFzcz0ib3JnLm1hZy5NYWdhemluZSRNYWdhemluZUlkIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlzYm4iLyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJ0aXRsZSIvJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9Im5hbWUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJwcmljZSIvJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9ImNvcGllc1NvbGQiLyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iLyZndDsKKyAgICAgICAgICAgICZsdDttYW55LXRvLW9uZSBuYW1lPSJwdWJsaXNoZXIiIGZldGNoPSJMQVpZIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcGVyc2lzdC8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9jYXNjYWRlJmd0OworICAgICAgICAgICAgJmx0Oy9tYW55LXRvLW9uZSZndDsKKyAgICAgICAgICAgICZsdDtvbmUtdG8tbWFueSBuYW1lPSJhcnRpY2xlcyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O29yZGVyLWJ5LyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcGVyc2lzdC8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXJlbW92ZS8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9jYXNjYWRlJmd0OworICAgICAgICAgICAgJmx0Oy9vbmUtdG8tbWFueSZndDsKKyAgICAgICAgICAgICZsdDtvbmUtdG8tb25lIG5hbWU9ImNvdmVyQXJ0aWNsZSIgZmV0Y2g9IkxBWlkiJmd0OworICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcmVtb3ZlLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAmbHQ7L29uZS10by1vbmUmZ3Q7CisgICAgICAgICAgICAmbHQ7dHJhbnNpZW50IG5hbWU9ImRhdGEiLyZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuQXJ0aWNsZSImZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2lkIG5hbWU9ImlkIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0idGl0bGUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjb250ZW50Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7dmVyc2lvbiBuYW1lPSJ2ZXJzaW9uIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7bWFueS10by1tYW55IG5hbWU9ImFydGljbGVzIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7b3JkZXItYnkmZ3Q7bGFzdE5hbWUsIGZpcnN0TmFtZSZsdDsvb3JkZXItYnkmZ3Q7CisgICAgICAgICAgICAmbHQ7L21hbnktdG8tbWFueSZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcucHViLkNvbXBhbnkiJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpZCIvJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9Im5hbWUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJyZXZlbnVlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7dmVyc2lvbiBuYW1lPSJ2ZXJzaW9uIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7b25lLXRvLW1hbnkgbmFtZT0ibWFncyIgbWFwcGVkLWJ5PSJwdWJsaXNoZXIiJmd0OworICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAmbHQ7L29uZS10by1tYW55Jmd0OworICAgICAgICAgICAgJmx0O29uZS10by1tYW55IG5hbWU9InN1YnNjcmlwdGlvbnMiJmd0OworICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcmVtb3ZlLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAmbHQ7L29uZS10by1tYW55Jmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5wdWIuQXV0aG9yIiZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7aWQgbmFtZT0iaWQiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJmaXJzdE5hbWUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJsYXN0TmFtZSIvJmd0OworICAgICAgICAgICAgJmx0O3ZlcnNpb24gbmFtZT0idmVyc2lvbiIvJmd0OworICAgICAgICAgICAgJmx0O21hbnktdG8tbWFueSBuYW1lPSJhcnRzIiBtYXBwZWQtYnk9ImF1dGhvcnMiJmd0OworICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZS1wZXJzaXN0LyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L2Nhc2NhZGUmZ3Q7CisgICAgICAgICAgICAmbHQ7L21hbnktdG8tbWFueSZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3ViY3JpYmUuQ29udHJhY3QiJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJ0ZXJtcyIvJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJjcmliZS5TdWJzY3JpcHRpb24iJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtpZCBuYW1lPSJpZCIvJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9InBheW1lbnQiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJzdGFydERhdGUiLyZndDsKKyAgICAgICAgICAgICZsdDt2ZXJzaW9uIG5hbWU9InZlcnNpb24iLyZndDsKKyAgICAgICAgICAgICZsdDtvbmUtdG8tbWFueSBuYW1lPSJpdGVtcyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O21hcC1rZXkgbmFtZT0ibnVtIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y2FzY2FkZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O2Nhc2NhZGUtcGVyc2lzdC8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtjYXNjYWRlLXJlbW92ZS8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9jYXNjYWRlJmd0OworICAgICAgICAgICAgJmx0Oy9vbmUtdG8tbWFueSZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW50aXR5Jmd0OworICAgICZsdDtlbnRpdHkgY2xhc3M9Im9yZy5tYWcuc3Vic2NyaWJlLlN1YnNjcmlwdGlvbi5MaW5lSXRlbSImZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGVzJmd0OworICAgICAgICAgICAgJmx0O2Jhc2ljIG5hbWU9ImNvbW1lbnRzIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0icHJpY2UiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJudW0iLyZndDsKKyAgICAgICAgICAgICZsdDttYW55LXRvLW9uZSBuYW1lPSJtYWdhemluZSIvJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuTGlmZXRpbWVTdWJzY3JpcHRpb24iIG5hbWU9IkxpZmV0aW1lIgorICAgICAgICBhY2Nlc3M9IlBST1BFUlRZIiZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iZWxpdGVDbHViIiBmZXRjaD0iTEFaWSIvJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VudGl0eSBjbGFzcz0ib3JnLm1hZy5zdWJzY3JpYmUuVHJpYWxTdWJzY3JpcHRpb24iIG5hbWU9IlRyaWFsIiZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZXMmZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0iZW5kRGF0ZSIvJmd0OworICAgICAgICAmbHQ7L2F0dHJpYnV0ZXMmZ3Q7CisgICAgJmx0Oy9lbnRpdHkmZ3Q7CisgICAgJmx0O2VtYmVkZGFibGUgY2xhc3M9Im9yZy5tYWcucHViLkFkZHJlc3MiJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlcyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJzdHJlZXQiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJjaXR5Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmFzaWMgbmFtZT0ic3RhdGUiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXNpYyBuYW1lPSJ6aXAiLyZndDsKKyAgICAgICAgJmx0Oy9hdHRyaWJ1dGVzJmd0OworICAgICZsdDsvZW1iZWRkYWJsZSZndDsKKyZsdDsvZW50aXR5LW1hcHBpbmdzJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8cGFyYT4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nIi8+IHdpbGwgc2hvdyB5b3UgaG93IHRvIG1hcCB5b3VyCitwZXJzaXN0ZW50IGNsYXNzZXMgdG8gdGhlIGRhdGFzdG9yZSB1c2luZyBhZGRpdGlvbmFsIGFubm90YXRpb25zIGFuZCBYTUwgbWFya3VwLgorRmlyc3QsIGhvd2V2ZXIsIHdlIHR1cm4gdG8gdGhlIEpQQSBydW50aW1lIEFQSXMuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfcGMueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3BjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJlZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3BjLnhtbApAQCAtMCwwICsxLDEzNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19wYyI+CisgICAgPHRpdGxlPgorICAgICAgICBFbnRpdHkKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBFbnRpdHkKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgIHBlcnNpc3RlbnQgY2xhc3NlcworICAgICAgICA8L3NlZWFsc28+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBjbGFzcworICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICBwZXJzaXN0ZW50CisgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8c2VlPgorICAgICAgICAgICAgcGVyc2lzdGVudCBjbGFzc2VzCisgICAgICAgIDwvc2VlPgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgcGVyc2lzdGVuY2UgY2FwYWJsZQorICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWU+CisgICAgICAgICAgICBFbnRpdHkKKyAgICAgICAgPC9zZWU+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHBhcmE+CitKUEEgcmVjb2duaXplcyB0d28gdHlwZXMgb2YgcGVyc2lzdGVudCBjbGFzc2VzOiA8ZW1waGFzaXM+ZW50aXR5PC9lbXBoYXNpcz4KK2NsYXNzZXMgYW5kIDxlbXBoYXNpcz5lbWJlZGRhYmxlPC9lbXBoYXNpcz4gY2xhc3Nlcy4gRWFjaCBwZXJzaXN0ZW50IGluc3RhbmNlIG9mCithbiBlbnRpdHkgY2xhc3MgLSBlYWNoIDxlbXBoYXNpcz5lbnRpdHk8L2VtcGhhc2lzPiAtIHJlcHJlc2VudHMgYSB1bmlxdWUKK2RhdGFzdG9yZSByZWNvcmQuIFlvdSBjYW4gdXNlIHRoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gdG8gZmluZAorYW4gZW50aXR5IGJ5IGl0cyBwZXJzaXN0ZW50IGlkZW50aXR5IChjb3ZlcmVkIGxhdGVyIGluIHRoaXMgY2hhcHRlciksIG9yIHVzZSBhCis8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IHRvIGZpbmQgZW50aXRpZXMgbWF0Y2hpbmcgY2VydGFpbiBjcml0ZXJpYS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CitBbiBpbnN0YW5jZSBvZiBhbiBlbWJlZGRhYmxlIGNsYXNzLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgb25seSBzdG9yZWQgYXMgcGFydCBvZgorYSBzZXBhcmF0ZSBlbnRpdHkuIEVtYmVkZGFibGUgaW5zdGFuY2VzIGhhdmUgbm8gcGVyc2lzdGVudCBpZGVudGl0eSwgYW5kIGFyZQorbmV2ZXIgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IG9yIGZyb20gYQorPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPi4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CitEZXNwaXRlIHRoZXNlIGRpZmZlcmVuY2VzLCB0aGVyZSBhcmUgZmV3IGRpc3RpbmN0aW9ucyBiZXR3ZWVuIGVudGl0eSBjbGFzc2VzIGFuZAorZW1iZWRkYWJsZSBjbGFzc2VzLiBJbiBmYWN0LCB3cml0aW5nIGVpdGhlciB0eXBlIG9mIHBlcnNpc3RlbnQgY2xhc3MgaXMgYSBsb3QKK2xpa2Ugd3JpdGluZyBhbnkgb3RoZXIgY2xhc3MuIFRoZXJlIGFyZSBubyBzcGVjaWFsIHBhcmVudCBjbGFzc2VzIHRvCitleHRlbmQgZnJvbSwgZmllbGQgdHlwZXMgdG8gdXNlLCBvciBtZXRob2RzIHRvIHdyaXRlLiBUaGlzIGlzIG9uZSBpbXBvcnRhbnQgd2F5CitpbiB3aGljaCBKUEEgbWFrZXMgcGVyc2lzdGVuY2UgdHJhbnNwYXJlbnQgdG8geW91LCB0aGUgZGV2ZWxvcGVyLgorICAgIDwvcGFyYT4KKyAgICA8bm90ZT4KKyAgICAgICAgPHBhcmE+CitKUEEgc3VwcG9ydHMgYm90aCBmaWVsZHMgYW5kIEphdmFCZWFuIHByb3BlcnRpZXMgYXMgcGVyc2lzdGVudCBzdGF0ZS4gRm9yCitzaW1wbGljaXR5LCBob3dldmVyLCB3ZSB3aWxsIHJlZmVyIHRvIGFsbCBwZXJzaXN0ZW50IHN0YXRlIGFzIHBlcnNpc3RlbnQgZmllbGRzLAordW5sZXNzIHdlIHdhbnQgdG8gbm90ZSBhIHVuaXF1ZSBhc3BlY3Qgb2YgcGVyc2lzdGVudCBwcm9wZXJ0aWVzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9ub3RlPgorICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfcGNfcGNjbGFzcyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFBlcnNpc3RlbnQgQ2xhc3MKKyAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3BhY2thZ2Ugb3JnLm1hZzsKKworLyoqCisgKiBFeGFtcGxlIHBlcnNpc3RlbnQgY2xhc3MuICBOb3RpY2UgdGhhdCBpdCBsb29rcyBleGFjdGx5IGxpa2UgYW55IG90aGVyCisgKiBjbGFzcy4gIEpQQSBtYWtlcyB3cml0aW5nIHBlcnNpc3RlbnQgY2xhc3NlcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgaXNibjsKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKyAgICBwcml2YXRlIFNldCBhcnRpY2xlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBBcnRpY2xlIGNvdmVyQXJ0aWNsZTsKKyAgICBwcml2YXRlIGludCBjb3BpZXNTb2xkOworICAgIHByaXZhdGUgZG91YmxlIHByaWNlOworICAgIHByaXZhdGUgQ29tcGFueSBwdWJsaXNoZXI7CisgICAgcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIHByb3RlY3RlZCBNYWdhemluZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFnYXppbmUoU3RyaW5nIHRpdGxlLCBTdHJpbmcgaXNibikgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuaXNibiA9IGlzYm47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHVibGlzaChDb21wYW55IHB1Ymxpc2hlciwgZG91YmxlIHByaWNlKSB7CisgICAgICAgIHRoaXMucHVibGlzaGVyID0gcHVibGlzaGVyOworICAgICAgICBwdWJsaXNoZXIuYWRkTWFnYXppbmUodGhpcyk7CisgICAgICAgIHRoaXMucHJpY2UgPSBwcmljZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2VsbCgpIHsKKyAgICAgICAgY29waWVzU29sZCsrOworICAgICAgICBwdWJsaXNoZXIuYWRkUmV2ZW51ZShwcmljZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQXJ0aWNsZShBcnRpY2xlIGFydGljbGUpIHsKKyAgICAgICAgYXJ0aWNsZXMuYWRkKGFydGljbGUpOworICAgIH0KKworICAgIC8vIHJlc3Qgb2YgbWV0aG9kcyBvbWl0dGVkCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvZXhhbXBsZT4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BjX3Jlc3RyaWN0Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgUmVzdHJpY3Rpb25zIG9uIFBlcnNpc3RlbnQgQ2xhc3NlcworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19wY19yZXN0cmljdCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25zIG9uCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlcmUgYXJlIHZlcnkgZmV3IHJlc3RyaWN0aW9ucyBwbGFjZWQgb24gcGVyc2lzdGVudCBjbGFzc2VzLiBTdGlsbCwgaXQgbmV2ZXIKK2h1cnRzIHRvIGZhbWlsaWFyaXplIHlvdXJzZWxmIHdpdGggZXhhY3RseSB3aGF0IEpQQSBkb2VzIGFuZCBkb2VzIG5vdCBzdXBwb3J0LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcGNfbm9fYXJnIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IG9yIE5vLUFyZyBDb25zdHJ1Y3RvcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX25vX2FyZyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgY2xhc3NlcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBuby1hcmcgY29uc3RydWN0b3IgcmVxdWlyZW1lbnQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgbm8tYXJnIGNvbnN0cnVjdG9yIHJlcXVpcmVtZW50CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIEpQQSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoYXQgYWxsIHBlcnNpc3RlbnQgY2xhc3NlcyBoYXZlIGEgbm8tYXJnCitjb25zdHJ1Y3Rvci4gVGhpcyBjb25zdHJ1Y3RvciBtYXkgYmUgcHVibGljIG9yIHByb3RlY3RlZC4gQmVjYXVzZSB0aGUgY29tcGlsZXIKK2F1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGRlZmF1bHQgbm8tYXJnIGNvbnN0cnVjdG9yIHdoZW4gbm8gb3RoZXIgY29uc3RydWN0b3IgaXMKK2RlZmluZWQsIG9ubHkgY2xhc3NlcyB0aGF0IGRlZmluZSBjb25zdHJ1Y3RvcnMgbXVzdCBhbHNvIGluY2x1ZGUgYSBuby1hcmcKK2NvbnN0cnVjdG9yLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBJ3MgPGVtcGhhc2lzPmVuaGFuY2VyPC9lbXBoYXNpcz4gd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBhIHByb3RlY3RlZAorbm8tYXJnIGNvbnN0cnVjdG9yIHRvIHlvdXIgY2xhc3Mgd2hlbiByZXF1aXJlZC4gVGhlcmVmb3JlLCB0aGlzIHJlc3RyaWN0aW9uIGRvZXMKK25vdCBhcHBseSB3aGVuIHVzaW5nIE9wZW5KUEEuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSIvPgorb2YgdGhlIFJlZmVyZW5jZSBHdWlkZSBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19wY19maW5hbCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRmluYWwKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0VudGl0eSBjbGFzc2VzIG1heSBub3QgYmUgZmluYWwuIE5vIG1ldGhvZCBvZiBhbiBlbnRpdHkgY2xhc3MgY2FuIGJlIGZpbmFsLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIHN1cHBvcnRzIGZpbmFsIGNsYXNzZXMgYW5kIGZpbmFsIG1ldGhvZHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcGNfaWQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIElkZW50aXR5IEZpZWxkcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX2lkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkgZmllbGRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGNfaWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgSlBBIGlkIHJlcXVpcmVtZW50CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQWxsIGVudGl0eSBjbGFzc2VzIG11c3QgZGVjbGFyZSBvbmUgb3IgbW9yZSBmaWVsZHMgd2hpY2ggdG9nZXRoZXIgZm9ybSB0aGUKK3BlcnNpc3RlbnQgaWRlbnRpdHkgb2YgYW4gaW5zdGFuY2UuIFRoZXNlIGFyZSBjYWxsZWQgPGVtcGhhc2lzPmlkZW50aXR5Cis8L2VtcGhhc2lzPiBvciA8ZW1waGFzaXM+cHJpbWFyeSBrZXk8L2VtcGhhc2lzPiBmaWVsZHMuIEluIG91ciA8Y2xhc3NuYW1lPgorTWFnYXppbmU8L2NsYXNzbmFtZT4gY2xhc3MsIDxsaXRlcmFsPmlzYm48L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD50aXRsZTwvbGl0ZXJhbD4KK2FyZSBpZGVudGl0eSBmaWVsZHMsIGJlY2F1c2Ugbm8gdHdvIG1hZ2F6aW5lIHJlY29yZHMgaW4gdGhlIGRhdGFzdG9yZSBjYW4gaGF2ZQordGhlIHNhbWUgPGxpdGVyYWw+aXNibjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPnRpdGxlPC9saXRlcmFsPiB2YWx1ZXMuCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9pZCIvPiB3aWxsIHNob3cgeW91IGhvdyB0byBkZW5vdGUgeW91cgoraWRlbnRpdHkgZmllbGRzIGluIEpQQSBtZXRhZGF0YS4gPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3BjX2lkZW50aXR5Ii8+CitiZWxvdyBleGFtaW5lcyBwZXJzaXN0ZW50IGlkZW50aXR5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGZ1bGx5IHN1cHBvcnRzIGlkZW50aXR5IGZpZWxkcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlbS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfb2lkIi8+IG9mIHRoZSBSZWZlcmVuY2UgR3VpZGUgZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcGNfdmVyc2lvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgVmVyc2lvbiBGaWVsZAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX3ZlcnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX3ZlcnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgSlBBIHZlcnNpb24gcmVxdWlyZW1lbnQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+dmVyc2lvbjwvbGl0ZXJhbD4gZmllbGQgaW4gb3VyIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4KK2NsYXNzIG1heSBzZWVtIG91dCBvZiBwbGFjZS4gSlBBIHVzZXMgYSB2ZXJzaW9uIGZpZWxkIGluIHlvdXIgZW50aXRpZXMgdG8gZGV0ZWN0Citjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHNhbWUgZGF0YXN0b3JlIHJlY29yZC4gV2hlbiB0aGUgSlBBIHJ1bnRpbWUKK2RldGVjdHMgYW4gYXR0ZW1wdCB0byBjb25jdXJyZW50bHkgbW9kaWZ5IHRoZSBzYW1lIHJlY29yZCwgaXQgdGhyb3dzIGFuCitleGNlcHRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIGF0dGVtcHRpbmcgdG8gY29tbWl0IGxhc3QuIFRoaXMgcHJldmVudHMKK292ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBjb21taXQgd2l0aCBzdGFsZSBkYXRhLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitBIHZlcnNpb24gZmllbGQgaXMgbm90IHJlcXVpcmVkLCBidXQgd2l0aG91dCBvbmUgY29uY3VycmVudCB0aHJlYWRzIG9yCitwcm9jZXNzZXMgbWlnaHQgc3VjY2VlZCBpbiBtYWtpbmcgY29uZmxpY3RpbmcgY2hhbmdlcyB0byB0aGUgc2FtZSByZWNvcmQgYXQgdGhlCitzYW1lIHRpbWUuIFRoaXMgaXMgdW5hY2NlcHRhYmxlIHRvIG1vc3QgYXBwbGljYXRpb25zLgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfdmVyc2lvbiIvPiBzaG93cyB5b3UgaG93IHRvIGRlc2lnbmF0ZSBhCit2ZXJzaW9uIGZpZWxkIGluIEpQQSBtZXRhZGF0YS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZSBhbiBpbnRlZ3JhbCB0eXBlICg8Y2xhc3NuYW1lPiBpbnQ8L2NsYXNzbmFtZT4sCis8Y2xhc3NuYW1lPkxvbmc8L2NsYXNzbmFtZT4sIGV0Yykgb3IgYSA8Y2xhc3NuYW1lPgoramF2YS5zcWwuVGltZXN0YW1wPC9jbGFzc25hbWU+LiBZb3Ugc2hvdWxkIGNvbnNpZGVyIHZlcnNpb24gZmllbGRzIGltbXV0YWJsZS4gCitDaGFuZ2luZyB0aGUgZmllbGQgdmFsdWUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGZ1bGx5IHN1cHBvcnRzIHZlcnNpb24gZmllbGRzLCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGVtIGZvciBjb25jdXJyZW5jeQorZGV0ZWN0aW9uLiBPcGVuSlBBIGNhbiBtYWludGFpbiBzdXJyb2dhdGUgdmVyc2lvbiB2YWx1ZXMgb3IgdXNlIHN0YXRlCitjb21wYXJpc29ucyB0byBkZXRlY3QgY29uY3VycmVudCBtb2RpZmljYXRpb25zLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYSIvPiBpbiB0aGUgUmVmZXJlbmNlIEd1aWRlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BjX3Jlc3RyaWN0X2luaGVyaXRhbmNlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBJbmhlcml0YW5jZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX3Jlc3RyaWN0X2luaGVyaXRhbmNlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBjbGFzc2VzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlIG9mCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBvZiBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitKUEEgZnVsbHkgc3VwcG9ydHMgaW5oZXJpdGFuY2UgaW4gcGVyc2lzdGVudCBjbGFzc2VzLiBJdCBhbGxvd3MgcGVyc2lzdGVudAorY2xhc3NlcyB0byBpbmhlcml0IGZyb20gbm9uLXBlcnNpc3RlbnQgY2xhc3NlcywgcGVyc2lzdGVudCBjbGFzc2VzIHRvIGluaGVyaXQKK2Zyb20gb3RoZXIgcGVyc2lzdGVudCBjbGFzc2VzLCBhbmQgbm9uLXBlcnNpc3RlbnQgY2xhc3NlcyB0byBpbmhlcml0IGZyb20KK3BlcnNpc3RlbnQgY2xhc3Nlcy4gSXQgaXMgZXZlbiBwb3NzaWJsZSB0byBmb3JtIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGluIHdoaWNoCitwZXJzaXN0ZW5jZSBza2lwcyBnZW5lcmF0aW9ucy4gVGhlcmUgYXJlLCBob3dldmVyLCBhIGZldyBpbXBvcnRhbnQgbGltaXRhdGlvbnM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitQZXJzaXN0ZW50IGNsYXNzZXMgY2Fubm90IGluaGVyaXQgZnJvbSBjZXJ0YWluIG5hdGl2ZWx5LWltcGxlbWVudGVkIHN5c3RlbQorY2xhc3NlcyBzdWNoIGFzIDxjbGFzc25hbWU+amF2YS5uZXQuU29ja2V0PC9jbGFzc25hbWU+IGFuZCA8Y2xhc3NuYW1lPgoramF2YS5sYW5nLlRocmVhZDwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIGEgcGVyc2lzdGVudCBjbGFzcyBpbmhlcml0cyBmcm9tIGEgbm9uLXBlcnNpc3RlbnQgY2xhc3MsIHRoZSBmaWVsZHMgb2YgdGhlCitub24tcGVyc2lzdGVudCBzdXBlcmNsYXNzIGNhbm5vdCBiZSBwZXJzaXN0ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBbGwgY2xhc3NlcyBpbiBhbiBpbmhlcml0YW5jZSB0cmVlIG11c3QgdXNlIHRoZSBzYW1lIGlkZW50aXR5IHR5cGUuIFdlIGNvdmVyCitlbnRpdHkgaWRlbnRpdHkgaW4gPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3BjX2lkZW50aXR5Ii8+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcGNfcmVzdHJpY3RfZmllbGRzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBQZXJzaXN0ZW50IEZpZWxkcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX3Jlc3RyaWN0X2ZpZWxkcyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgY2xhc3NlcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBmaWVsZCByZXN0cmljdGlvbnMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGZpZWxkCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvc2VlPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19wY19yZXN0cmljdF9maWVsZHMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbnMgb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitKUEEgbWFuYWdlcyB0aGUgc3RhdGUgb2YgYWxsIHBlcnNpc3RlbnQgZmllbGRzLiBCZWZvcmUgeW91IGFjY2VzcyBwZXJzaXN0ZW50CitzdGF0ZSwgdGhlIEpQQSBydW50aW1lIG1ha2VzIHN1cmUgdGhhdCBpdCBoYXMgYmVlbiBsb2FkZWQgZnJvbSB0aGUgZGF0YXN0b3JlLgorV2hlbiB5b3Ugc2V0IGEgZmllbGQsIHRoZSBydW50aW1lIHJlY29yZHMgdGhhdCBpdCBoYXMgY2hhbmdlZCBzbyB0aGF0IHRoZSBuZXcKK3ZhbHVlIHdpbGwgYmUgcGVyc2lzdGVkLiBUaGlzIGFsbG93cyB5b3UgdG8gdHJlYXQgdGhlIGZpZWxkIGluIGV4YWN0bHkgdGhlIHNhbWUKK3dheSB5b3UgdHJlYXQgYW55IG90aGVyIGZpZWxkIC0gYW5vdGhlciBhc3BlY3Qgb2YgSlBBJ3MgdHJhbnNwYXJlbmN5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitKUEEgZG9lcyBub3Qgc3VwcG9ydCBzdGF0aWMgb3IgZmluYWwgZmllbGRzLiBJdCBkb2VzLCBob3dldmVyLCBpbmNsdWRlIGJ1aWx0LWluCitzdXBwb3J0IGZvciBtb3N0IGNvbW1vbiBmaWVsZCB0eXBlcy4gVGhlc2UgdHlwZXMgY2FuIGJlIHJvdWdobHkgZGl2aWRlZCBpbnRvCit0aHJlZSBjYXRlZ29yaWVzOiBpbW11dGFibGUgdHlwZXMsIG11dGFibGUgdHlwZXMsIGFuZCByZWxhdGlvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGltbXV0YWJsZSB0eXBlcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBpbW11dGFibGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZCB0eXBlcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8ZW1waGFzaXM+SW1tdXRhYmxlPC9lbXBoYXNpcz4gdHlwZXMsIG9uY2UgY3JlYXRlZCwgY2Fubm90IGJlIGNoYW5nZWQuIFRoZSBvbmx5Cit3YXkgdG8gYWx0ZXIgYSBwZXJzaXN0ZW50IGZpZWxkIG9mIGFuIGltbXV0YWJsZSB0eXBlIGlzIHRvIGFzc2lnbiBhIG5ldyB2YWx1ZSB0bwordGhlIGZpZWxkLiBKUEEgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBpbW11dGFibGUgdHlwZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBbGwgcHJpbWl0aXZlcyAoPGNsYXNzbmFtZT5pbnQsIGZsb2F0LCBieXRlPC9jbGFzc25hbWU+LCBldGMpCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBbGwgcHJpbWl0aXZlIHdyYXBwZXJzICg8Y2xhc3NuYW1lPmphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRmxvYXQsCitqYXZhLmxhbmcuQnl0ZTwvY2xhc3NuYW1lPiwgZXRjKQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSBhbHNvIHN1cHBvcnRzIDxjbGFzc25hbWU+Ynl0ZVtdPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPkJ5dGVbXTwvY2xhc3NuYW1lPiwKKzxjbGFzc25hbWU+Y2hhcltdPC9jbGFzc25hbWU+LCBhbmQgPGNsYXNzbmFtZT5DaGFyYWN0ZXJbXTwvY2xhc3NuYW1lPiBhcyAKK2ltbXV0YWJsZSB0eXBlcy4gVGhhdCBpcywgeW91IGNhbiBwZXJzaXN0IGZpZWxkcyBvZiB0aGVzZSB0eXBlcywKK2J1dCB5b3Ugc2hvdWxkIG5vdCBtYW5pcHVsYXRlIGluZGl2aWR1YWwgYXJyYXkgaW5kZXhlcyB3aXRob3V0IHJlc2V0dGluZyB0aGUKK2FycmF5IGludG8gdGhlIHBlcnNpc3RlbnQgZmllbGQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG11dGFibGUgdHlwZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcHJveGllcworICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbXV0YWJsZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkIHR5cGVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBwcm94aWVzCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgdXNlci1kZWZpbmVkCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGQgdHlwZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK1BlcnNpc3RlbnQgZmllbGRzIG9mIDxlbXBoYXNpcz5tdXRhYmxlPC9lbXBoYXNpcz4gdHlwZXMgY2FuIGJlIGFsdGVyZWQgd2l0aG91dAorYXNzaWduaW5nIHRoZSBmaWVsZCBhIG5ldyB2YWx1ZS4gTXV0YWJsZSB0eXBlcyBjYW4gYmUgbW9kaWZpZWQgZGlyZWN0bHkgdGhyb3VnaAordGhlaXIgb3duIG1ldGhvZHMuIFRoZSBKUEEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGF0IGltcGxlbWVudGF0aW9ucyBzdXBwb3J0Cit0aGUgZm9sbG93aW5nIG11dGFibGUgZmllbGQgdHlwZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEudXRpbC5EYXRlPC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEudXRpbC5DYWxlbmRhcjwvY2xhc3NuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5qYXZhLnNxbC5EYXRlPC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEuc3FsLlRpbWVzdGFtcDwvY2xhc3NuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5qYXZhLnNxbC5UaW1lPC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitFbnVtcworICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRW50aXR5IHR5cGVzIChyZWxhdGlvbnMgYmV0d2VlbiBlbnRpdGllcykKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0VtYmVkZGFibGUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+amF2YS51dGlsLkNvbGxlY3Rpb248L2NsYXNzbmFtZT5zIG9mIGVudGl0aWVzCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEudXRpbC5TZXQ8L2NsYXNzbmFtZT5zIG9mIGVudGl0aWVzCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmEudXRpbC5MaXN0PC9jbGFzc25hbWU+cyBvZiBlbnRpdGllcworICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5qYXZhLnV0aWwuTWFwPC9jbGFzc25hbWU+cyBpbiB3aGljaCBlYWNoIGVudHJ5IG1hcHMgdGhlIHZhbHVlIG9mIG9uZQorb2YgYSByZWxhdGVkIGVudGl0eSdzIGZpZWxkcyB0byB0aGF0IGVudGl0eS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorQ29sbGVjdGlvbiBhbmQgbWFwIHR5cGVzIG1heSBiZSBwYXJhbWV0ZXJpemVkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBvZiB1bmtub3duIHR5cGVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9iamVjdAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBhcyBwZXJzaXN0ZW50IGZpZWxkIHR5cGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK01vc3QgSlBBIGltcGxlbWVudGF0aW9ucyBhbHNvIGhhdmUgc3VwcG9ydCBmb3IgcGVyc2lzdGluZyBzZXJpYWxpemFibGUgdmFsdWVzIGFzCitiaW5hcnkgZGF0YSBpbiB0aGUgZGF0YXN0b3JlLiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YSIvPiBoYXMgbW9yZQoraW5mb3JtYXRpb24gb24gcGVyc2lzdGluZyBzZXJpYWxpemFibGUgdHlwZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxzbyBzdXBwb3J0cyBhcnJheXMsIDxjbGFzc25hbWU+amF2YS5sYW5nLk51bWJlcjwvY2xhc3NuYW1lPiwKKzxjbGFzc25hbWU+amF2YS51dGlsLkxvY2FsZTwvY2xhc3NuYW1lPiwgYWxsIEpESyAxLjIgPGNsYXNzbmFtZT5TZXQ8L2NsYXNzbmFtZT4sCis8Y2xhc3NuYW1lPkxpc3Q8L2NsYXNzbmFtZT4sIGFuZCA8Y2xhc3NuYW1lPk1hcDwvY2xhc3NuYW1lPiB0eXBlcywgCithbmQgbWFueSBvdGhlciBtdXRhYmxlIGFuZCBpbW11dGFibGUgZmllbGQgdHlwZXMuIE9wZW5KUEEgYWxzbyBhbGxvd3MgeW91IHRvCitwbHVnIGluIHN1cHBvcnQgZm9yIGN1c3RvbSB0eXBlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19wY19yZXN0cmljdF9jb25jbHVzaW9uIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBDb25jbHVzaW9ucworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBzZWN0aW9uIGRldGFpbGVkIGFsbCBvZiB0aGUgcmVzdHJpY3Rpb25zIEpQQSBwbGFjZXMgb24gcGVyc2lzdGVudCBjbGFzc2VzLgorV2hpbGUgaXQgbWF5IHNlZW0gbGlrZSB3ZSBwcmVzZW50ZWQgYSBsb3Qgb2YgaW5mb3JtYXRpb24sIHlvdSB3aWxsIHNlbGRvbSBmaW5kCit5b3Vyc2VsZiBoaW5kZXJlZCBieSB0aGVzZSByZXN0cmljdGlvbnMgaW4gcHJhY3RpY2UuIEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlCitvZnRlbiB3YXlzIG9mIHVzaW5nIEpQQSdzIG90aGVyIGZlYXR1cmVzIHRvIGNpcmN1bXZlbnQgYW55IGxpbWl0YXRpb25zIHlvdSBydW4KK2ludG8uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19wY19pZGVudGl0eSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEVudGl0eSBJZGVudGl0eQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19wY19pZGVudGl0eSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBKUEEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBlbnRpdHkgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGNfaWRlbnRpdHkiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbnVtZXJpYworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcXVhbGl0YXRpdmUKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG51bWVyaWMgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIGlkZW50aXR5CisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgcXVhbGl0YXRpdmUgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIGlkZW50aXR5CisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorSmF2YSByZWNvZ25pemVzIHR3byBmb3JtcyBvZiBvYmplY3QgaWRlbnRpdHk6IG51bWVyaWMgaWRlbnRpdHkgYW5kIHF1YWxpdGF0aXZlCitpZGVudGl0eS4gSWYgdHdvIHJlZmVyZW5jZXMgYXJlIDxlbXBoYXNpcz5udW1lcmljYWxseTwvZW1waGFzaXM+IGlkZW50aWNhbCwgdGhlbgordGhleSByZWZlciB0byB0aGUgc2FtZSBKVk0gaW5zdGFuY2UgaW4gbWVtb3J5LiBZb3UgY2FuIHRlc3QgZm9yIHRoaXMgdXNpbmcgdGhlCis8bGl0ZXJhbD49PTwvbGl0ZXJhbD4gb3BlcmF0b3IuIDxlbXBoYXNpcz5RdWFsaXRhdGl2ZTwvZW1waGFzaXM+IGlkZW50aXR5LCBvbgordGhlIG90aGVyIGhhbmQsIHJlbGllcyBvbiBzb21lIHVzZXItZGVmaW5lZCBjcml0ZXJpYSB0byBkZXRlcm1pbmUgd2hldGhlciB0d28KK29iamVjdHMgYXJlICJlcXVhbCIuIFlvdSB0ZXN0IGZvciBxdWFsaXRhdGl2ZSBpZGVudGl0eSB1c2luZyB0aGUgPG1ldGhvZG5hbWU+CitlcXVhbHM8L21ldGhvZG5hbWU+IG1ldGhvZC4gQnkgZGVmYXVsdCwgdGhpcyBtZXRob2Qgc2ltcGx5IHJlbGllcyBvbiBudW1lcmljCitpZGVudGl0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0pQQSBpbnRyb2R1Y2VzIGFub3RoZXIgZm9ybSBvZiBvYmplY3QgaWRlbnRpdHksIGNhbGxlZCA8ZW1waGFzaXM+ZW50aXR5CitpZGVudGl0eTwvZW1waGFzaXM+IG9yIDxlbXBoYXNpcz5wZXJzaXN0ZW50IGlkZW50aXR5PC9lbXBoYXNpcz4uIEVudGl0eQoraWRlbnRpdHkgdGVzdHMgd2hldGhlciB0d28gcGVyc2lzdGVudCBvYmplY3RzIHJlcHJlc2VudCB0aGUgc2FtZSBzdGF0ZSBpbiB0aGUKK2RhdGFzdG9yZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGlkCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBpZAorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBmaWVsZHMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CitUaGUgZW50aXR5IGlkZW50aXR5IG9mIGVhY2ggcGVyc2lzdGVudCBpbnN0YW5jZSBpcyBlbmNhcHN1bGF0ZWQgaW4gaXRzCis8ZW1waGFzaXM+aWRlbnRpdHkgZmllbGQocyk8L2VtcGhhc2lzPi4gSWYgdHdvIGVudGl0aWVzIG9mIHRoZSBzYW1lIHR5cGUgaGF2ZQordGhlIHNhbWUgaWRlbnRpdHkgZmllbGQgdmFsdWVzLCB0aGVuIHRoZSB0d28gZW50aXRpZXMgcmVwcmVzZW50IHRoZSBzYW1lIHN0YXRlCitpbiB0aGUgZGF0YXN0b3JlLiBFYWNoIGVudGl0eSdzIGlkZW50aXR5IGZpZWxkIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwKK290aGVyIGVudGl0ZXMgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0lkZW50aXR5IGZpZWxkcyBtdXN0IGJlIHByaW1pdGl2ZXMsIHByaW1pdGl2ZSB3cmFwcGVycywgPGNsYXNzbmFtZT4KK1N0cmluZzwvY2xhc3NuYW1lPnMsIDxjbGFzc25hbWU+RGF0ZTwvY2xhc3NuYW1lPnMsIDxjbGFzc25hbWU+CitUaW1lc3RhbXA8L2NsYXNzbmFtZT5zLCBvciBlbWJlZGRhYmxlIHR5cGVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIHN1cHBvcnRzIGVudGl0aWVzIGFzIGlkZW50aXR5IGZpZWxkcywgYXMgdGhlIFJlZmVyZW5jZSBHdWlkZSBkaXNjdXNzZXMKK2luIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19vaWRfZW50aXR5cGsiLz4uICBGb3IgbGVnYWN5IHNjaGVtYXMgd2l0aCBiaW5hcnkKK3ByaW1hcnkga2V5IGNvbHVtbnMsIE9wZW5KUEEgYWxzbyBzdXBwb3J0cyB1c2luZyBpZGVudGl0eSBmaWVsZHMgb2YgdHlwZSAKKzxjbGFzc25hbWU+Ynl0ZVtdPC9jbGFzc25hbWU+LiBXaGVuIHlvdSB1c2UgYSA8Y2xhc3NuYW1lPmJ5dGVbXTwvY2xhc3NuYW1lPiAKK2lkZW50aXR5IGZpZWxkLCB5b3UgbXVzdCBjcmVhdGUgYW4gaWRlbnRpdHkgY2xhc3MuICBJZGVudGl0eSBjbGFzc2VzIGFyZSAKK2NvdmVyZWQgYmVsb3cuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPHdhcm5pbmc+CisgICAgICAgICAgICA8cGFyYT4KK0NoYW5naW5nIHRoZSBmaWVsZHMgb2YgYW4gZW1iZWRkYWJsZSBpbnN0YW5jZSB3aGlsZSBpdCBpcyBhc3NpZ25lZCB0byBhbgoraWRlbnRpdHkgZmllbGQgaGFzIHVuZGVmaW5lZCByZXN1bHRzLiBBbHdheXMgdHJlYXQgZW1iZWRkYWJsZSBpZGVudGl0eSBpbnN0YW5jZXMKK2FzIGltbXV0YWJsZSBvYmplY3RzIGluIHlvdXIgYXBwbGljYXRpb25zLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3dhcm5pbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgdW5pcXVlbmVzcyByZXF1aXJlbWVudAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgdW5pcXVuZXNzIHJlcXVpcmVtZW50CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KK0lmIHlvdSBhcmUgZGVhbGluZyB3aXRoIGEgc2luZ2xlIHBlcnNpc3RlbmNlIGNvbnRleHQgKHNlZQorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X2VtZmFjdG9yeV9wZXJzY29udGV4dCIvPiksIHRoZW4geW91IGRvIG5vdAoraGF2ZSB0byBjb21wYXJlIGlkZW50aXR5IGZpZWxkcyB0byB0ZXN0IHdoZXRoZXIgdHdvIGVudGl0eSByZWZlcmVuY2VzIHJlcHJlc2VudAordGhlIHNhbWUgc3RhdGUgaW4gdGhlIGRhdGFzdG9yZS4gVGhlcmUgaXMgYSBtdWNoIGVhc2llciB3YXk6IHRoZSA8bGl0ZXJhbD49PQorPC9saXRlcmFsPiBvcGVyYXRvci4gSlBBIHJlcXVpcmVzIHRoYXQgZWFjaCBwZXJzaXN0ZW5jZSBjb250ZXh0IG1haW50YWluIG9ubHkKK29uZSBKVk0gb2JqZWN0IHRvIHJlcHJlc2VudCBlYWNoIHVuaXF1ZSBkYXRhc3RvcmUgcmVjb3JkLiBUaHVzLCBlbnRpdHkgaWRlbnRpdHkKK2lzIGVxdWl2YWxlbnQgdG8gbnVtZXJpYyBpZGVudGl0eSB3aXRoaW4gYSBwZXJzaXN0ZW5jZSBjb250ZXh0LiBUaGlzIGlzIHJlZmVycmVkCit0byBhcyB0aGUgPGVtcGhhc2lzPnVuaXF1ZW5lc3MgcmVxdWlyZW1lbnQ8L2VtcGhhc2lzPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RoZSB1bmlxdWVuZXNzIHJlcXVpcmVtZW50IGlzIGV4dHJlbWVseSBpbXBvcnRhbnQgLSB3aXRob3V0IGl0LCBpdCB3b3VsZCBiZQoraW1wb3NzaWJsZSB0byBtYWludGFpbiBkYXRhIGludGVncml0eS4gVGhpbmsgb2Ygd2hhdCBjb3VsZCBoYXBwZW4gaWYgdHdvCitkaWZmZXJlbnQgb2JqZWN0cyBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiB3ZXJlIGFsbG93ZWQgdG8gcmVwcmVzZW50IHRoZSBzYW1lCitwZXJzaXN0ZW50IGRhdGEuIElmIHlvdSBtYWRlIGRpZmZlcmVudCBtb2RpZmljYXRpb25zIHRvIGVhY2ggb2YgdGhlc2Ugb2JqZWN0cywKK3doaWNoIHNldCBvZiBjaGFuZ2VzIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBkYXRhc3RvcmU/IEhvdyB3b3VsZCB5b3VyCithcHBsaWNhdGlvbiBsb2dpYyBoYW5kbGUgc2VlaW5nIHR3byBkaWZmZXJlbnQgInZlcnNpb25zIiBvZiB0aGUgc2FtZSBkYXRhPworVGhhbmtzIHRvIHRoZSB1bmlxdWVuZXNzIHJlcXVpcmVtZW50LCB0aGVzZSBxdWVzdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUKK2Fuc3dlcmVkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcGNfaWRlbnRpdHljbHMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIElkZW50aXR5IENsYXNzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19wY19pZGVudGl0eWNscyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5IGNsYXNzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGNfaWRlbnRpdHljbHMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBpZGVudGl0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBjbGFzcyByZXF1aXJlbWVudHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorSWYgeW91ciBlbnRpdHkgaGFzIG9ubHkgb25lIGlkZW50aXR5IGZpZWxkLCB5b3UgY2FuIHVzZSB0aGUgdmFsdWUgb2YgdGhhdCBmaWVsZAorYXMgdGhlIGVudGl0eSdzIGlkZW50aXR5IG9iamVjdCBpbiBhbGwgPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X2VtIj4KKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPjwvbGluaz4gQVBJcy4gT3RoZXJ3aXNlLCB5b3UgbXVzdCBzdXBwbHkgYW4KK2lkZW50aXR5IGNsYXNzIHRvIHVzZSBmb3IgaWRlbnRpdHkgb2JqZWN0cy4gWW91ciBpZGVudGl0eSBjbGFzcyBtdXN0IG1lZXQgdGhlCitmb2xsb3dpbmcgY3JpdGVyaWE6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgY2xhc3MgbXVzdCBiZSBwdWJsaWMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIG5vLWFyZ3MgY29uc3RydWN0b3IuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgbmFtZXMgb2YgdGhlIG5vbi1zdGF0aWMgZmllbGRzIG9yIHByb3BlcnRpZXMgb2YgdGhlIGNsYXNzIG11c3QgYmUgdGhlIHNhbWUKK2FzIHRoZSBuYW1lcyBvZiB0aGUgaWRlbnRpdHkgZmllbGRzIG9yIHByb3BlcnRpZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5CitjbGFzcywgYW5kIHRoZSB0eXBlcyBtdXN0IGJlIGlkZW50aWNhbC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bWV0aG9kbmFtZT5lcXVhbHM8L21ldGhvZG5hbWU+IGFuZCA8bWV0aG9kbmFtZT5oYXNoQ29kZTwvbWV0aG9kbmFtZT4KK21ldGhvZHMgb2YgdGhlIGNsYXNzIG11c3QgdXNlIHRoZSB2YWx1ZXMgb2YgYWxsIGZpZWxkcyBvciBwcm9wZXJ0aWVzCitjb3JyZXNwb25kaW5nIHRvIGlkZW50aXR5IGZpZWxkcyBvciBwcm9wZXJ0aWVzIGluIHRoZSBlbnRpdHkgY2xhc3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJZiB0aGUgY2xhc3MgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgYmUgPGxpdGVyYWw+c3RhdGljPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FsbCBlbnRpdHkgY2xhc3NlcyByZWxhdGVkIGJ5IGluaGVyaXRhbmNlIG11c3QgdXNlIHRoZSBzYW1lIGlkZW50aXR5IGNsYXNzLCBvcgorZWxzZSBlYWNoIGVudGl0eSBjbGFzcyBtdXN0IGhhdmUgaXRzIG93biBpZGVudGl0eSBjbGFzcyB3aG9zZSBpbmhlcml0YW5jZQoraGllcmFyY2h5IG1pcnJvcnMgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiB0aGUgb3duaW5nIGVudGl0eSBjbGFzc2VzIChzZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19wY19pZGVudGl0eV9oaWVyYXJjaHkiLz4pLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaG91Z2ggeW91IG1heSBzdGlsbCBjcmVhdGUgaWRlbnRpdHkgY2xhc3NlcyBieSBoYW5kLCBPcGVuSlBBIHByb3ZpZGVzIHRoZQorPGNsYXNzbmFtZT5hcHBpZHRvb2w8L2NsYXNzbmFtZT4gdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBwcm9wZXIgaWRlbnRpdHkKK2NsYXNzZXMgYmFzZWQgb24geW91ciBpZGVudGl0eSBmaWVsZHMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX29pZF9hcHBsaWNhdGlvbiIvPiBvZiB0aGUgUmVmZXJlbmNlIEd1aWRlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfcGNfaWRlbnRpdHlfYXBwaWRjb2RlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIElkZW50aXR5IENsYXNzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIHByb3BlciBpZGVudGl0eSBjbGFzcyBmb3IgYW4gZW50aXR5IHdpdGggbXVsdGlwbGUKK2lkZW50aXR5IGZpZWxkcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvKioKKyAqIFBlcnNpc3RlbnQgY2xhc3MgdXNpbmcgYXBwbGljYXRpb24gaWRlbnRpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWdhemluZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBpc2JuOyAgICAvLyBpZGVudGl0eSBmaWVsZAorICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOyAgIC8vIGlkZW50aXR5IGZpZWxkCisKKyAgICAvLyByZXN0IG9mIGZpZWxkcyBhbmQgbWV0aG9kcyBvbWl0dGVkCisKKworICAgIC8qKgorICAgICAqIEFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzIGZvciBNYWdhemluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hZ2F6aW5lSWQgeworCisgICAgICAgIC8vIGVhY2ggaWRlbnRpdHkgZmllbGQgaW4gdGhlIE1hZ2F6aW5lIGNsYXNzIG11c3QgaGF2ZSBhCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIGlkZW50aXR5IGNsYXNzCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaXNibjsKKyAgICAgICAgcHVibGljIFN0cmluZyB0aXRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXF1YWxpdHkgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBpZGVudGl0eSBmaWVsZAorICAgICAgICAgKiBlcXVhbGl0eSwgYW5kIG11c3QgdXNlIGluc3RhbmNlb2YgcmF0aGVyIHRoYW4gY29tcGFyaW5nIAorICAgICAgICAgKiBjbGFzc2VzIGRpcmVjdGx5IChzb21lIEpQQSBpbXBsZW1lbnRhdGlvbnMgbWF5IHN1YmNsYXNzIHRoZQorICAgICAgICAgKiBpZGVudGl0eSBjbGFzcykuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTWFnYXppbmVJZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgTWFnYXppbmVJZCBtaSA9IChNYWdhemluZUlkKSBvdGhlcjsKKyAgICAgICAgICAgIHJldHVybiAoaXNibiA9PSBtaS5pc2JuCisgICAgICAgICAgICAgICAgfHwgKGlzYm4gIT0gbnVsbCAmYW1wOyZhbXA7IGlzYm4uZXF1YWxzKG1pLmlzYm4pKSkKKyAgICAgICAgICAgICAgICAmYW1wOyZhbXA7ICh0aXRsZSA9PSBtaS50aXRsZQorICAgICAgICAgICAgICAgIHx8ICh0aXRsZSAhPSBudWxsICZhbXA7JmFtcDsgdGl0bGUuZXF1YWxzKG1pLnRpdGxlKSkpOworICAgICAgICB9CisgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogSGFzaGNvZGUgbXVzdCBhbHNvIGRlcGVuZCBvbiBpZGVudGl0eSB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuICgoaXNibiA9PSBudWxsKSA/IDAgOiBpc2JuLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAgICAgXiAoKHRpdGxlID09IG51bGwpID8gMCA6IHRpdGxlLmhhc2hDb2RlKCkpOworICAgICAgICB9IAorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gaXNibiArICI6IiArIHRpdGxlOworICAgICAgICB9CisgICAgfQorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcGNfaWRlbnRpdHlfaGllcmFyY2h5Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIElkZW50aXR5IEhpZXJhcmNoaWVzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19wY19pZGVudGl0eV9oaWVyYXJjaHkiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5CisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDMyMCB4IDI2NyAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9hcHBpZC1oaWVyYXJjaHkucG5nIiB3aWR0aD0iMjEzcHgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBbiBhbHRlcm5hdGl2ZSB0byBoYXZpbmcgYSBzaW5nbGUgaWRlbnRpdHkgY2xhc3MgZm9yIGFuIGVudGlyZSBpbmhlcml0YW5jZQoraGllcmFyY2h5IGlzIHRvIGhhdmUgb25lIGlkZW50aXR5IGNsYXNzIHBlciBsZXZlbCBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorVGhlIHJlcXVpcmVtZW50cyBmb3IgdXNpbmcgYSBoaWVyYXJjaHkgb2YgaWRlbnRpdHkgY2xhc3NlcyBhcmUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mIGlkZW50aXR5IGNsYXNzZXMgbXVzdCBleGFjdGx5IG1pcnJvciB0aGUgaGllcmFyY2h5CitvZiB0aGUgcGVyc2lzdGVudCBjbGFzc2VzIHRoYXQgdGhleSBpZGVudGlmeS4gSW4gdGhlIGV4YW1wbGUgcGljdHVyZWQgYWJvdmUsCithYnN0cmFjdCBjbGFzcyA8Y2xhc3NuYW1lPlBlcnNvbjwvY2xhc3NuYW1lPiBpcyBleHRlbmRlZCBieSBhYnN0cmFjdCBjbGFzcworPGNsYXNzbmFtZT5FbXBsb3llZTwvY2xhc3NuYW1lPiwgd2hpY2ggaXMgZXh0ZW5kZWQgYnkgbm9uLWFic3RyYWN0IGNsYXNzCis8Y2xhc3NuYW1lPiBGdWxsVGltZUVtcGxveWVlPC9jbGFzc25hbWU+LCB3aGljaCBpcyBleHRlbmRlZCBieSBub24tYWJzdHJhY3QKK2NsYXNzIDxjbGFzc25hbWU+TWFuYWdlcjwvY2xhc3NuYW1lPi4gVGhlIGNvcnJlc3BvbmRpbmcgaWRlbnRpdHkgY2xhc3NlcywgdGhlbiwKK2FyZSBhbiBhYnN0cmFjdCA8Y2xhc3NuYW1lPlBlcnNvbklkPC9jbGFzc25hbWU+IGNsYXNzLCBleHRlbmRlZCBieSBhbiBhYnN0cmFjdAorPGNsYXNzbmFtZT5FbXBsb3llZUlkPC9jbGFzc25hbWU+IGNsYXNzLCBleHRlbmRlZCBieSBhIG5vbi1hYnN0cmFjdCA8Y2xhc3NuYW1lPgorRnVsbFRpbWVFbXBsb3llZUlkPC9jbGFzc25hbWU+IGNsYXNzLCBleHRlbmRlZCBieSBhIG5vbi1hYnN0cmFjdCA8Y2xhc3NuYW1lPgorTWFuYWdlcklkPC9jbGFzc25hbWU+IGNsYXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1N1YmNsYXNzZXMgaW4gdGhlIGlkZW50aXR5IGhpZXJhcmNoeSBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgaWRlbnRpdHkgZmllbGRzIHVudGlsCit0aGUgaGllcmFyY2h5IGJlY29tZXMgbm9uLWFic3RyYWN0LiBJbiB0aGUgYWZvcmVtZW50aW9uZWQgZXhhbXBsZSwgPGNsYXNzbmFtZT4KK1BlcnNvbjwvY2xhc3NuYW1lPiBkZWZpbmVzIGFuIGlkZW50aXR5IGZpZWxkIDxsaXRlcmFsPnNzbjwvbGl0ZXJhbD4sIDxjbGFzc25hbWU+CitFbXBsb3llZTwvY2xhc3NuYW1lPiBkZWZpbmVzIGFkZGl0aW9uYWwgaWRlbnRpdHkgZmllbGQgPGxpdGVyYWw+dXNlck5hbWUKKzwvbGl0ZXJhbD4sIGFuZCA8Y2xhc3NuYW1lPkZ1bGxUaW1lRW1wbG95ZWU8L2NsYXNzbmFtZT4gYWRkcyBhIGZpbmFsIGlkZW50aXR5CitmaWVsZCwgPGxpdGVyYWw+ZW1wSWQ8L2xpdGVyYWw+LiBIb3dldmVyLCA8Y2xhc3NuYW1lPk1hbmFnZXI8L2NsYXNzbmFtZT4gbWF5IG5vdAorZGVmaW5lIGFueSBhZGRpdGlvbmFsIGlkZW50aXR5IGZpZWxkcywgc2luY2UgaXQgaXMgYSBzdWJjbGFzcyBvZiBhIG5vbi1hYnN0cmFjdAorY2xhc3MuIFRoZSBoaWVyYXJjaHkgb2YgaWRlbnRpdHkgY2xhc3Nlcywgb2YgY291cnNlLCBtdXN0IG1hdGNoIHRoZSBpZGVudGl0eQorZmllbGQgZGVmaW5pdGlvbnMgb2YgdGhlIHBlcnNpc3RlbnQgY2xhc3MgaGllcmFyY2h5LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0l0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIGVhY2ggYWJzdHJhY3QgY2xhc3MgdG8gZGVjbGFyZSBpZGVudGl0eSBmaWVsZHMuIEluIHRoZQorcHJldmlvdXMgZXhhbXBsZSwgdGhlIGFic3RyYWN0IDxjbGFzc25hbWU+UGVyc29uPC9jbGFzc25hbWU+IGFuZCA8Y2xhc3NuYW1lPgorRW1wbG95ZWU8L2NsYXNzbmFtZT4gY2xhc3NlcyBjb3VsZCBkZWNsYXJlIG5vIGlkZW50aXR5IGZpZWxkcywgYW5kIHRoZSBmaXJzdAorY29uY3JldGUgc3ViY2xhc3MgPGNsYXNzbmFtZT5GdWxsVGltZUVtcGxveWVlPC9jbGFzc25hbWU+IGNvdWxkIGRlZmluZSBvbmUgb3IKK21vcmUgaWRlbnRpdHkgZmllbGRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FsbCBzdWJjbGFzc2VzIG9mIGEgY29uY3JldGUgaWRlbnRpdHkgY2xhc3MgbXVzdCBiZSA8bWV0aG9kbmFtZT5lcXVhbHMKKzwvbWV0aG9kbmFtZT4gYW5kIDxtZXRob2RuYW1lPmhhc2hDb2RlPC9tZXRob2RuYW1lPi1jb21wYXRpYmxlIHdpdGggdGhlCitjb25jcmV0ZSBzdXBlcmNsYXNzLiBUaGlzIG1lYW5zIHRoYXQgaW4gb3VyIGV4YW1wbGUsIGEgPGNsYXNzbmFtZT5NYW5hZ2VySWQKKzwvY2xhc3NuYW1lPiBpbnN0YW5jZSBhbmQgYSA8Y2xhc3NuYW1lPkZ1bGxUaW1lRW1wbG95ZWVJZDwvY2xhc3NuYW1lPiBpbnN0YW5jZQord2l0aCB0aGUgc2FtZSBpZGVudGl0eSBmaWVsZCB2YWx1ZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLCBhbmQgc2hvdWxkCitjb21wYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIgdXNpbmcgdGhlIDxtZXRob2RuYW1lPmVxdWFsczwvbWV0aG9kbmFtZT4gbWV0aG9kIG9mCitlaXRoZXIgb25lLiBJbiBwcmFjdGljZSwgdGhpcyByZXF1aXJlbWVudCByZWR1Y2VzIHRvIHRoZSBmb2xsb3dpbmcgY29kaW5nCitwcmFjdGljZXM6CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1VzZSA8bGl0ZXJhbD5pbnN0YW5jZW9mPC9saXRlcmFsPiBpbnN0ZWFkIG9mIGNvbXBhcmluZyA8Y2xhc3NuYW1lPkNsYXNzCis8L2NsYXNzbmFtZT4gb2JqZWN0cyBpbiB0aGUgPG1ldGhvZG5hbWU+ZXF1YWxzPC9tZXRob2RuYW1lPiBtZXRob2RzIG9mIHlvdXIKK2lkZW50aXR5IGNsYXNzZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBbiBpZGVudGl0eSBjbGFzcyB0aGF0IGV4dGVuZHMgYW5vdGhlciBub24tYWJzdHJhY3QgaWRlbnRpdHkgY2xhc3Mgc2hvdWxkIG5vdAorb3ZlcnJpZGUgPG1ldGhvZG5hbWU+ZXF1YWxzPC9tZXRob2RuYW1lPiBvciA8bWV0aG9kbmFtZT5oYXNoQ29kZTwvbWV0aG9kbmFtZT4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BjX2NhbGxiYWNrcyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIExpZmVjeWNsZSBDYWxsYmFja3MKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGNfY2FsbGJhY2tzIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBjYWxsYmFja3MKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BjX2NhbGxiYWNrcyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlIGNhbGxiYWNrcworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBsaWZlY3ljbGUgY2FsbGJhY2tzCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0l0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHZhcmlvdXMgYWN0aW9ucyBhdCBkaWZmZXJlbnQgc3RhZ2VzIG9mIGEKK3BlcnNpc3RlbnQgb2JqZWN0J3MgbGlmZWN5Y2xlLiBKUEEgaW5jbHVkZXMgYSB2YXJpZXR5IG9mIGNhbGxiYWNrcyBtZXRob2RzIGZvcgorbW9uaXRvcmluZyBjaGFuZ2VzIGluIHRoZSBsaWZlY3ljbGUgb2YgeW91ciBwZXJzaXN0ZW50IG9iamVjdHMuIFRoZXNlIGNhbGxiYWNrcworY2FuIGJlIGRlZmluZWQgb24gdGhlIHBlcnNpc3RlbnQgY2xhc3NlcyB0aGVtc2VsdmVzIGFuZCBvbiBub24tcGVyc2lzdGVudAorbGlzdGVuZXIgY2xhc3Nlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BjX2NhbGxiYWNrc19tZXRob2RzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBDYWxsYmFjayBNZXRob2RzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGNfY2FsbGJhY2tzX21ldGhvZHMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIG1ldGhvZHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGNfY2FsbGJhY2tzX21ldGhvZHMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgbWV0aG9kcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0V2ZXJ5IHBlcnNpc3RlbmNlIGV2ZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgbWV0aG9kIG1hcmtlci4gVGhlc2UKK21hcmtlcnMgYXJlIHNoYXJlZCBiZXR3ZWVuIHBlcnNpc3RlbnQgY2xhc3NlcyBhbmQgdGhlaXIgbGlzdGVuZXJzLiBZb3UgY2FuIHVzZQordGhlc2UgbWFya2VycyB0byBkZXNpZ25hdGUgYSBtZXRob2QgZm9yIGNhbGxiYWNrIGVpdGhlciBieSBhbm5vdGF0aW5nIHRoYXQKK21ldGhvZCBvciBieSBsaXN0aW5nIHRoZSBtZXRob2QgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGUgZm9yIGEgZ2l2ZW4gY2xhc3MuIFRoZQorbGlmZWN5Y2xlIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBtZXRob2QgbWFya2VycyBhcmU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVQZXJzaXN0CisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9QcmVQZXJzaXN0Lmh0bWwiPgorPGNsYXNzbmFtZT5QcmVQZXJzaXN0PC9jbGFzc25hbWU+PC91bGluaz46IE1ldGhvZHMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uCit3aWxsIGJlIGludm9rZWQgYmVmb3JlIGFuIG9iamVjdCBpcyBwZXJzaXN0ZWQuIFRoaXMgY291bGQgYmUgdXNlZCBmb3IgYXNzaWduaW5nCitwcmltYXJ5IGtleSB2YWx1ZXMgdG8gcGVyc2lzdGVudCBvYmplY3RzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFhNTCBlbGVtZW50Cit0YWcgPGxpdGVyYWw+cHJlLXBlcnNpc3Q8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdFBlcnNpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS81L2RvY3MvYXBpL2phdmF4L3BlcnNpc3RlbmNlL1Bvc3RQZXJzaXN0Lmh0bWwiPgorPGNsYXNzbmFtZT5Qb3N0UGVyc2lzdDwvY2xhc3NuYW1lPjwvdWxpbms+OiBNZXRob2RzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbgord2lsbCBiZSBpbnZva2VkIGFmdGVyIGFuIG9iamVjdCBoYXMgdHJhbnNpdGlvbmVkIHRvIHRoZSBwZXJzaXN0ZW50IHN0YXRlLiBZb3UKK21pZ2h0IHdhbnQgdG8gdXNlIHN1Y2ggbWV0aG9kcyB0byB1cGRhdGUgYSBzY3JlZW4gYWZ0ZXIgYSBuZXcgcm93IGlzIGFkZGVkLiBUaGlzCitpcyBlcXVpdmFsZW50IHRvIHRoZSBYTUwgZWxlbWVudCB0YWcgPGxpdGVyYWw+cG9zdC1wZXJzaXN0PC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RMb2FkCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9Qb3N0TG9hZC5odG1sIj4KKzxjbGFzc25hbWU+UG9zdExvYWQ8L2NsYXNzbmFtZT48L3VsaW5rPjogTWV0aG9kcyBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24KK3dpbGwgYmUgaW52b2tlZCBhZnRlciBhbGwgZWFnZXJseSBmZXRjaGVkIGZpZWxkcyBvZiB5b3VyIGNsYXNzIGhhdmUgYmVlbiBsb2FkZWQKK2Zyb20gdGhlIGRhdGFzdG9yZS4gTm8gb3RoZXIgcGVyc2lzdGVudCBmaWVsZHMgY2FuIGJlIGFjY2Vzc2VkIGluIHRoaXMgbWV0aG9kLgorVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBYTUwgZWxlbWVudCB0YWcgPGxpdGVyYWw+cG9zdC1sb2FkPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+UG9zdExvYWQ8L2NsYXNzbmFtZT4gaXMgb2Z0ZW4gdXNlZCB0byBpbml0aWFsaXplIG5vbi1wZXJzaXN0ZW50CitmaWVsZHMgd2hvc2UgdmFsdWVzIGRlcGVuZCBvbiB0aGUgdmFsdWVzIG9mIHBlcnNpc3RlbnQgZmllbGRzLCBzdWNoIGFzIGEgY29tcGxleAorZGF0YXN0cnVjdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZVVwZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlIGNhbGxiYWNrcworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YWVlLzUvZG9jcy9hcGkvamF2YXgvcGVyc2lzdGVuY2UvUHJlVXBkYXRlLmh0bWwiPgorPGNsYXNzbmFtZT5QcmVVcGRhdGU8L2NsYXNzbmFtZT48L3VsaW5rPjogTWV0aG9kcyBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24KK3dpbGwgYmUgaW52b2tlZCBqdXN0IHRoZSBwZXJzaXN0ZW50IHZhbHVlcyBpbiB5b3VyIG9iamVjdHMgYXJlIGZsdXNoZWQgdG8gdGhlCitkYXRhc3RvcmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgWE1MIGVsZW1lbnQgdGFnIDxsaXRlcmFsPgorcHJlLXVwZGF0ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPlByZVVwZGF0ZTwvY2xhc3NuYW1lPiBpcyB0aGUgY29tcGxlbWVudCB0byA8Y2xhc3NuYW1lPlBvc3RMb2FkCis8L2NsYXNzbmFtZT4uIFdoaWxlIG1ldGhvZHMgbWFya2VkIHdpdGggPGNsYXNzbmFtZT5Qb3N0TG9hZDwvY2xhc3NuYW1lPiBhcmUgbW9zdAorb2Z0ZW4gdXNlZCB0byBpbml0aWFsaXplIG5vbi1wZXJzaXN0ZW50IHZhbHVlcyBmcm9tIHBlcnNpc3RlbnQgZGF0YSwgbWV0aG9kcworYW5ub3RhdGVkIHdpdGggPGNsYXNzbmFtZT5QcmVVcGRhdGU8L2NsYXNzbmFtZT4gaXMgbm9ybWFsbHkgdXNlZCB0byBzZXQKK3BlcnNpc3RlbnQgZmllbGRzIHdpdGggaW5mb3JtYXRpb24gY2FjaGVkIGluIG5vbi1wZXJzaXN0ZW50IGRhdGEuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3N0VXBkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9Qb3N0VXBkYXRlLmh0bWwiPgorPGNsYXNzbmFtZT5Qb3N0VXBkYXRlPC9jbGFzc25hbWU+PC91bGluaz46IE1ldGhvZHMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uCit3aWxsIGJlIGludm9rZWQgYWZ0ZXIgY2hhbmdlcyB0byBhIGdpdmVuIGluc3RhbmNlIGhhdmUgYmVlbiBzdG9yZWQgdG8gdGhlCitkYXRhc3RvcmUuIFRoaXMgaXMgdXNlZnVsIGZvciBjbGVhcmluZyBzdGFsZSBkYXRhIGNhY2hlZCBhdCB0aGUgYXBwbGljYXRpb24KK2xheWVyLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFhNTCBlbGVtZW50IHRhZyA8bGl0ZXJhbD5wb3N0LXVwZGF0ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVSZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS81L2RvY3MvYXBpL2phdmF4L3BlcnNpc3RlbmNlL1ByZVJlbW92ZS5odG1sIj4KKzxjbGFzc25hbWU+UHJlUmVtb3ZlPC9jbGFzc25hbWU+PC91bGluaz46IE1ldGhvZHMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uCit3aWxsIGJlIGludm9rZWQgYmVmb3JlIGFuIG9iamVjdCB0cmFuc2FjdGlvbnMgdG8gdGhlIGRlbGV0ZWQgc3RhdGUuIEFjY2VzcyB0bworcGVyc2lzdGVudCBmaWVsZHMgaXMgdmFsaWQgd2l0aGluIHRoaXMgbWV0aG9kLiBZb3UgbWlnaHQgdXNlIHRoaXMgbWV0aG9kIHRvCitjYXNjYWRlIHRoZSBkZWxldGlvbiB0byByZWxhdGVkIG9iamVjdHMgYmFzZWQgb24gY29tcGxleCBjcml0ZXJpYSwgb3IgdG8gcGVyZm9ybQorb3RoZXIgY2xlYW51cC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBYTUwgZWxlbWVudCB0YWcgPGxpdGVyYWw+CitwcmUtcmVtb3ZlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RSZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS81L2RvY3MvYXBpL2phdmF4L3BlcnNpc3RlbmNlL1Bvc3RSZW1vdmUuaHRtbCI+Cis8Y2xhc3NuYW1lPlBvc3RSZW1vdmU8L2NsYXNzbmFtZT48L3VsaW5rPjogTWV0aG9kcyBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24KK3dpbGwgYmUgaW52b2tlZCBhZnRlciBhbiBvYmplY3QgaGFzIGJlZW4gbWFya2VkIGFzIHRvIGJlIGRlbGV0ZWQuIFRoaXMgaXMKK2VxdWl2YWxlbnQgdG8gdGhlIFhNTCBlbGVtZW50IHRhZyA8bGl0ZXJhbD5wb3N0LXJlbW92ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19jYWxsYmFja3NfdXNpbmciPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFVzaW5nIENhbGxiYWNrIE1ldGhvZHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gZGVjbGFyaW5nIGNhbGxiYWNrIG1ldGhvZHMgb24gYSBwZXJzaXN0ZW50IGNsYXNzLCBhbnkgbWV0aG9kIG1heSBiZSB1c2VkCit3aGljaCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIGlzIG5vdCBzaGFyZWQgd2l0aCBhbnkgcHJvcGVydHkgYWNjZXNzIGZpZWxkcy4KK011bHRpcGxlIGV2ZW50cyBjYW4gYmUgYXNzaWduZWQgdG8gYSBzaW5nbGUgbWV0aG9kIGFzIHdlbGwuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0JlbG93IGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGRlY2xhcmUgY2FsbGJhY2sgbWV0aG9kcyBvbiBwZXJzaXN0ZW50IGNsYXNzZXM6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvKioKKyAqIEV4YW1wbGUgcGVyc2lzdGVudCBjbGFzcyBkZWNsYXJpbmcgb3VyIGVudGl0eSBsaXN0ZW5lci4KKyAqLworQEVudGl0eQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKworICAgIEBUcmFuc2llbnQgCisgICAgcHJpdmF0ZSBieXRlW11bXSBkYXRhOworCisgICAgQE1hbnlUb01hbnkKKyAgICBwcml2YXRlIExpc3QmbHQ7UGhvdG8mZ3Q7IHBob3RvczsKKworICAgIEBQb3N0TG9hZAorICAgIHB1YmxpYyB2b2lkIGNvbnZlcnRQaG90b3MoKSB7CisgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtwaG90b3Muc2l6ZSgpXVtdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IHBob3Rvcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIGRhdGFbaV0gPSBwaG90b3MuZ2V0KGkpLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgQFByZURlbGV0ZQorICAgIHB1YmxpYyB2b2lkIGxvZ01hZ2F6aW5lRGVsZXRpb24oKSB7CisgICAgICAgIGdldExvZygpLmRlYnVnKCJkZWxldGluZyBtYWdhemluZSBjb250YWluaW5nIiArIHBob3Rvcy5zaXplKCkgCisgICAgICAgICAgICArICIgcGhvdG9zLiIpOworICAgIH0KK30KKworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gYW4gWE1MIG1hcHBpbmcgZmlsZSwgd2UgY2FuIGRlZmluZSB0aGUgc2FtZSBtZXRob2RzIHdpdGhvdXQgYW5ub3RhdGlvbnM6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7ZW50aXR5IGNsYXNzPSJNYWdhemluZSImZ3Q7CisgICAgJmx0O3ByZS1yZW1vdmUmZ3Q7bG9nTWFnYXppbmVEZWxldGlvbiZsdDsvcHJlLXJlbW92ZSZndDsKKyAgICAmbHQ7cG9zdC1sb2FkJmd0O2NvbnZlcnRQaG90b3MmbHQ7L3Bvc3QtbG9hZCZndDsKKyZsdDsvZW50aXR5Jmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2UgZnVsbHkgZXhwbG9yZSBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBhbm5vdGF0aW9ucyBhbmQgWE1MIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YSIvPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19lbnRpdHlfbGlzdGVuZXJzX3VzaW5nIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBVc2luZyBFbnRpdHkgTGlzdGVuZXJzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitNaXhpbmcgbGlmZWN5Y2xlIGV2ZW50IGNvZGUgaW50byB5b3VyIHBlcnNpc3RlbnQgY2xhc3NlcyBpcyBub3QgYWx3YXlzIGlkZWFsLiBJdAoraXMgb2Z0ZW4gbW9yZSBlbGVnYW50IHRvIGhhbmRsZSBjcm9zcy1jdXR0aW5nIGxpZmVjeWNsZSBldmVudHMgaW4gYQorbm9uLXBlcnNpc3RlbnQgbGlzdGVuZXIgY2xhc3MuIEpQQSBhbGxvd3MgZm9yIHRoaXMsIHJlcXVpcmluZyBvbmx5IHRoYXQgbGlzdGVuZXIKK2NsYXNzZXMgaGF2ZSBhIHB1YmxpYyBuby1hcmcgY29uc3RydWN0b3IuIExpa2UgcGVyc2lzdGVudCBjbGFzc2VzLCB5b3VyIGxpc3RlbmVyCitjbGFzc2VzIGNhbiBjb25zdW1lIGFueSBudW1iZXIgb2YgY2FsbGJhY2tzLiBUaGUgY2FsbGJhY2sgbWV0aG9kcyBtdXN0IHRha2UgaW4gYQorc2luZ2xlIDxjbGFzc25hbWU+amF2YS5sYW5nLk9iamVjdDwvY2xhc3NuYW1lPiBhcmd1bWVudCB3aGljaCByZXByZXNlbnRzIHRoZQorcGVyc2lzdGVudCBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitFbnRpdGllcyBjYW4gZW51bWVyYXRlIGxpc3RlbmVycyB1c2luZyB0aGUgPGNsYXNzbmFtZT5FbnRpdHlMaXN0ZW5lcnMKKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLiBUaGlzIGFubm90YXRpb24gdGFrZXMgYW4gYXJyYXkgb2YgbGlzdGVuZXIgY2xhc3NlcyBhcworaXRzIHZhbHVlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBkZWNsYXJlIGFuIGVudGl0eSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgbGlzdGVuZXIKK2NsYXNzZXMuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvKioKKyAqIEV4YW1wbGUgcGVyc2lzdGVudCBjbGFzcyBkZWNsYXJpbmcgb3VyIGVudGl0eSBsaXN0ZW5lci4KKyAqLworQEVudGl0eQorQEVudGl0eUxpc3RlbmVycyh7IE1hZ2F6aW5lTG9nZ2VyLmNsYXNzLCAuLi4gfSkKK3B1YmxpYyBjbGFzcyBNYWdhemluZSB7CisKKyAgICAvLyAuLi4gLy8KK30KKworCisvKioKKyAqIEV4YW1wbGUgZW50aXR5IGxpc3RlbmVyLgorICovCitwdWJsaWMgY2xhc3MgTWFnYXppbmVMb2dnZXIgeworCisgICAgQFBvc3RQZXJzaXN0CisgICAgcHVibGljIHZvaWQgbG9nQWRkaXRpb24oT2JqZWN0IHBjKSB7CisgICAgICAgIGdldExvZyAoKS5kZWJ1ZyAoIkFkZGVkIG5ldyBtYWdhemluZToiICsgKChNYWdhemluZSkgcGMpLmdldFRpdGxlICgpKTsKKyAgICB9CisKKworICAgIEBQcmVSZW1vdmUKKyAgICBwdWJsaWMgdm9pZCBsb2dEZWxldGlvbihPYmplY3QgcGMpIHsKKyAgICAgICAgZ2V0TG9nKCkuZGVidWcoIlJlbW92aW5nIGZyb20gY2lyY3VsYXRpb246IiArIAorICAgICAgICAgICAgKChNYWdhemluZSkgcGMpLmdldFRpdGxlKCkpOworICAgIH0KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK0luIFhNTCwgd2UgZGVmaW5lIGJvdGggdGhlIGxpc3RlbmVycyBhbmQgdGhlaXIgY2FsbGJhY2sgbWV0aG9kcyBhcyBzbzoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtlbnRpdHkgY2xhc3M9Ik1hZ2F6aW5lIiZndDsKKyAgICAmbHQ7ZW50aXR5LWxpc3RlbmVycyZndDsKKyAgICAgICAgJmx0O2VudGl0eS1saXN0ZW5lciBjbGFzcz0iTWFnYXppbmVMb2dnZXIiJmd0OworICAgICAgICAgICAgJmx0O3Bvc3QtcGVyc2lzdCZndDtsb2dBZGRpdGlvbiZsdDsvcG9zdC1wZXJzaXN0Jmd0OworICAgICAgICAgICAgJmx0O3ByZS1yZW1vdmUmZ3Q7bG9nRGVsZXRpb24mbHQ7L3ByZS1yZW1vdmUmZ3Q7CisgICAgICAgICZsdDsvZW50aXR5LWxpc3RlbmVyJmd0OworICAgICZsdDsvZW50aXR5LWxpc3RlbmVycyZndDsKKyZsdDsvZW50aXR5Jmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X2VudGl0eV9saXN0ZW5lcnNfZXhjbHVkZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRW50aXR5IExpc3RlbmVycyBIaWVyYXJjaHkKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19lbnRpdHlfbGlzdGVuZXJzX2V4Y2x1ZGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUgbGlzdGVuZXJzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0VudGl0eSBsaXN0ZW5lciBtZXRob2RzIGFyZSBpbnZva2VkIGluIGEgc3BlY2lmaWMgb3JkZXIgd2hlbiBhIGdpdmVuIGV2ZW50IGlzCitmaXJlZC4gU28tY2FsbGVkIDxlbXBoYXNpcz5kZWZhdWx0PC9lbXBoYXNpcz4gbGlzdGVuZXJzIGFyZSBpbnZva2VkIGZpcnN0OiB0aGVzZQorYXJlIGxpc3RlbmVycyB3aGljaCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBhIHBhY2thZ2UgYW5ub3RhdGlvbiBvciBpbiB0aGUgcm9vdAorZWxlbWVudCBvZiBYTUwgbWFwcGluZyBmaWxlcy4gTmV4dCwgZW50aXR5IGxpc3RlbmVycyBhcmUgaW52b2tlZCBpbiB0aGUgb3JkZXIgb2YKK3RoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHdpdGggc3VwZXJjbGFzcyBsaXN0ZW5lcnMgYmVpbmcgaW52b2tlZCBiZWZvcmUKK3N1YmNsYXNzIGxpc3RlbmVycy4gRmluYWxseSwgaWYgYW4gZW50aXR5IGhhcyBtdWx0aXBsZSBsaXN0ZW5lcnMgZm9yIHRoZSBzYW1lCitldmVudCwgdGhlIGxpc3RlbmVycyBhcmUgaW52b2tlZCBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBleGNsdWRlIGRlZmF1bHQgbGlzdGVuZXJzIGFuZCBsaXN0ZW5lcnMgZGVmaW5lZCBpbiBzdXBlcmNsYXNzZXMgZnJvbSB0aGUKK2ludm9jYXRpb24gY2hhaW4gdGhyb3VnaCB0aGUgdXNlIG9mIHR3byBjbGFzcy1sZXZlbCBhbm5vdGF0aW9uczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnM8L2NsYXNzbmFtZT46IFRoaXMgYW5ub3RhdGlvbiBpbmRpY2F0ZXMgdGhhdAorbm8gZGVmYXVsdCBsaXN0ZW5lcnMgd2lsbCBiZSBpbnZva2VkIGZvciB0aGlzIGNsYXNzLCBvciBhbnkgb2YgaXRzIHN1YmNsYXNzZXMuCitUaGUgWE1MIGVxdWl2YWxlbnQgaXMgdGhlIGVtcHR5IDxsaXRlcmFsPmV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnM8L2xpdGVyYWw+CitlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyczwvY2xhc3NuYW1lPjogVGhpcyBhbm5vdGF0aW9uIHdpbGwgY2F1c2UKK09wZW5KUEEgdG8gc2tpcCBpbnZva2luZyBhbnkgbGlzdGVuZXJzIGRlY2xhcmVkIGluIHN1cGVyY2xhc3Nlcy4gVGhlIFhNTAorZXF1aXZhbGVudCBpcyBlbXB0eSB0aGUgPGxpdGVyYWw+ZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVyczwvbGl0ZXJhbD4gZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BjX2NvbmNsdXNpb24iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBDb25jbHVzaW9ucworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8cGFyYT4KK1RoaXMgY2hhcHRlciBjb3ZlcmVkIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byB3cml0ZSBwZXJzaXN0ZW50IGNsYXNzCitkZWZpbml0aW9ucyBpbiBKUEEuIEpQQSBjYW5ub3QgdXNlIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzLCBob3dldmVyLCB1bnRpbCB5b3UKK2NvbXBsZXRlIG9uZSBhZGRpdGlvbmFsIHN0ZXA6IHlvdSBtdXN0IGRlZmluZSB0aGUgcGVyc2lzdGVuY2UgbWV0YWRhdGEuIFRoZSBuZXh0CitjaGFwdGVyIGV4cGxvcmVzIG1ldGFkYXRhIGluIGRldGFpbC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19wZXJzaXN0ZW5jZS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTc5OWYKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UueG1sCkBAIC0wLDAgKzEsMjYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxjaGFwdGVyIGlkPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UiPgorICAgIDx0aXRsZT4KKyAgICAgICAgUGVyc2lzdGVuY2UKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3BlcnNpc3RlbmNlIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBQZXJzaXN0ZW5jZQorICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UiPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgIGNvbnN0cnVjdGlvbgorICAgICAgICA8L3NlY29uZGFyeT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld19wZXJzaXN0ZW5jZSI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgUGVyc2lzdGVuY2UKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgZ2V0RW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UiPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIGdldEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICBQZXJzaXN0ZW5jZQorICAgICAgICA8L3NlZWFsc28+CisgICAgPC9pbmRleHRlcm0+CisgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA0MjcgeCAxMjEgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWcvcGVyc2lzdGVuY2UucG5nIiB3aWR0aD0iMjg1cHgiLz4KKyAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICA8L21lZGlhb2JqZWN0PgorICAgIDxub3RlPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxzbyBpbmNsdWRlcyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFQZXJzaXN0ZW5jZS5odG1sIj4KKzxjbGFzc25hbWU+T3BlbkpQQVBlcnNpc3RlbmNlPC9jbGFzc25hbWU+PC91bGluaz4gaGVscGVyIGNsYXNzIHRvIHByb3ZpZGUKK2FkZGl0aW9uYWwgdXRpbGl0eSBtZXRob2RzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9ub3RlPgorICAgIDxwYXJhPgorV2l0aGluIGEgY29udGFpbmVyLCB5b3Ugd2lsbCB0eXBpY2FsbHkgdXNlIDxlbXBoYXNpcz5pbmplY3Rpb248L2VtcGhhc2lzPiB0bworYWNjZXNzIGFuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4uIEFwcGxpY2F0aW9ucyBvcGVyYXRpbmcKK29mIGEgY29udGFpbmVyLCBob3dldmVyLCBjYW4gdXNlIHRoZQorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5odG1sIj4KKzxjbGFzc25hbWU+UGVyc2lzdGVuY2U8L2NsYXNzbmFtZT48L3VsaW5rPiBjbGFzcyB0byBvYnRhaW4gPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IG9iamVjdHMgaW4gYSB2ZW5kb3ItbmV1dHJhbCBmYXNoaW9uLgorICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBzdGF0aWMgRW50aXR5TWFuYWdlckZhY3RvcnkgY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkoU3RyaW5nIG5hbWUpOworcHVibGljIHN0YXRpYyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBjcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeShTdHJpbmcgbmFtZSwgTWFwIHByb3BzKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPHBhcmE+CitFYWNoIDxtZXRob2RuYW1lPmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5PC9tZXRob2RuYW1lPiBtZXRob2Qgc2VhcmNoZXMgdGhlCitzeXN0ZW0gZm9yIGFuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gZGVmaW5pdGlvbiB3aXRoIHRoZQorZ2l2ZW4gbmFtZS4gVXNlIDxsaXRlcmFsPm51bGw8L2xpdGVyYWw+IGZvciBhbiB1bm5hbWVkIGZhY3RvcnkuIFRoZSBvcHRpb25hbCBtYXAKK2NvbnRhaW5zIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0eSBzZXR0aW5ncyB1c2VkIHRvIGZ1cnRoZXIgY29uZmlndXJlIHRoZQorZmFjdG9yeS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+Cis8ZmlsZW5hbWU+cGVyc2lzdGVuY2UueG1sPC9maWxlbmFtZT4gZmlsZXMgZGVmaW5lIDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyRmFjdG9yaWVzPC9jbGFzc25hbWU+LiBUaGUgPG1ldGhvZG5hbWU+Y3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkKKzwvbWV0aG9kbmFtZT4gbWV0aG9kcyBzZWFyY2ggZm9yIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPiBmaWxlcword2l0aGluIHRoZSA8ZmlsZW5hbWU+TUVUQS1JTkY8L2ZpbGVuYW1lPiBkaXJlY3Rvcnkgb2YgYW55IDxsaXRlcmFsPkNMQVNTUEFUSAorPC9saXRlcmFsPiBlbGVtZW50LiBGb3IgZXhhbXBsZSwgaWYgeW91ciA8bGl0ZXJhbD5DTEFTU1BBVEg8L2xpdGVyYWw+IGNvbnRhaW5zCit0aGUgPGZpbGVuYW1lPmNvbmY8L2ZpbGVuYW1lPiBkaXJlY3RvcnksIHlvdSBjb3VsZCBwbGFjZSBhbiA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gZGVmaW5pdGlvbiBpbiA8ZmlsZW5hbWU+Citjb25mL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+LgorICAgIDwvcGFyYT4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BlcnNpc3RlbmNlX3htbCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIHBlcnNpc3RlbmNlLnhtbAorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8cGFyYT4KK1RoZSA8ZmlsZW5hbWU+cGVyc2lzdGVuY2UueG1sPC9maWxlbmFtZT4gZmlsZSBmb3JtYXQgb2JleXMgdGhlIGZvbGxvd2luZworRG9jdW1lbnQgVHlwZSBEZXNjcmlwdG9yIChEVEQpOgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7IUVMRU1FTlQgcGVyc2lzdGVuY2UgKHBlcnNpc3RlbmNlLXVuaXQqKSZndDsKKyZsdDshRUxFTUVOVCBwZXJzaXN0ZW5jZS11bml0IChkZXNjcmlwdGlvbj8scHJvdmlkZXI/LGp0YS1kYXRhLXNvdXJjZT8sCisgIG5vbi1qdGEtZGF0YS1zb3VyY2U/LChjbGFzc3xqYXItZmlsZXxtYXBwaW5nLWZpbGUpKiwKKyAgZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzPyxwcm9wZXJ0aWVzPykmZ3Q7CismbHQ7IUFUVExJU1QgcGVyc2lzdGVuY2UtdW5pdCBuYW1lIENEQVRBICNSRVFVSVJFRCZndDsKKyZsdDshQVRUTElTVCBwZXJzaXN0ZW5jZS11bml0IHRyYW5zYWN0aW9uLXR5cGUgKEpUQXxSRVNPVVJDRV9MT0NBTCkgIkpUQSImZ3Q7CismbHQ7IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpJmd0OworJmx0OyFFTEVNRU5UIHByb3ZpZGVyICgjUENEQVRBKSZndDsKKyZsdDshRUxFTUVOVCBqdGEtZGF0YS1zb3VyY2UgKCNQQ0RBVEEpJmd0OworJmx0OyFFTEVNRU5UIG5vbi1qdGEtZGF0YS1zb3VyY2UgKCNQQ0RBVEEpJmd0OworJmx0OyFFTEVNRU5UIG1hcHBpbmctZmlsZSAoI1BDREFUQSkmZ3Q7CismbHQ7IUVMRU1FTlQgamFyLWZpbGUgKCNQQ0RBVEEpJmd0OworJmx0OyFFTEVNRU5UIGNsYXNzICgjUENEQVRBKSZndDsKKyZsdDshRUxFTUVOVCBleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMgRU1QVFkmZ3Q7CismbHQ7IUVMRU1FTlQgcHJvcGVydGllcyAocHJvcGVydHkqKSZndDsKKyZsdDshRUxFTUVOVCBwcm9wZXJ0eSBFTVBUWSZndDsKKyZsdDshQVRUTElTVCBwcm9wZXJ0eSBuYW1lIENEQVRBICNSRVFVSVJFRCZndDsKKyZsdDshQVRUTElTVCBwcm9wZXJ0eSB2YWx1ZSBDREFUQSAjUkVRVUlSRUQmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1RoZSByb290IGVsZW1lbnQgb2YgYSA8ZmlsZW5hbWU+cGVyc2lzdGVuY2UueG1sPC9maWxlbmFtZT4gZmlsZSBpcyA8bGl0ZXJhbD4KK3BlcnNpc3RlbmNlPC9saXRlcmFsPiwgd2hpY2ggdGhlbiBjb250YWlucyBvbmUgb3IgbW9yZSA8bGl0ZXJhbD4KK3BlcnNpc3RlbmNlLXVuaXQ8L2xpdGVyYWw+IGRlZmluaXRpb25zLiBFYWNoIHBlcnNpc3RlbmNlIHVuaXQgZGVzY3JpYmVzIHRoZQorY29uZmlndXJhdGlvbiBmb3IgdGhlIGVudGl0eSBtYW5hZ2VycyBjcmVhdGVkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgZW50aXR5CittYW5hZ2VyIGZhY3RvcnkuIFRoZSBwZXJzaXN0ZW5jZSB1bml0IGNhbiBzcGVjaWZ5IHRoZXNlIGVsZW1lbnRzIGFuZCBhdHRyaWJ0dWVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5uYW1lPC9saXRlcmFsPjogVGhpcyBpcyB0aGUgbmFtZSB5b3UgcGFzcyB0byB0aGUgPG1ldGhvZG5hbWU+CitQZXJzaXN0ZW5jZS5jcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeTwvbWV0aG9kbmFtZT4gbWV0aG9kcyBkZXNjcmliZWQgYWJvdmUuIFRoZQorbmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRyYW5zYWN0aW9uLXR5cGU8L2xpdGVyYWw+OiBXaGV0aGVyIHRvIHVzZSBtYW5hZ2VkCisoPGxpdGVyYWw+SlRBPC9saXRlcmFsPikgb3IgbG9jYWwgKDxsaXRlcmFsPlJFU09VUkNFX0xPQ0FMPC9saXRlcmFsPikKK3RyYW5zYWN0aW9uIG1hbmFnZW1lbnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnByb3ZpZGVyPC9saXRlcmFsPjogSWYgeW91IGFyZSB1c2luZyBhIHRoaXJkLXBhcnR5IEpQQSB2ZW5kb3IsIHRoaXMKK2VsZW1lbnQgbmFtZXMgaXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZQorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9zcGkvUGVyc2lzdGVuY2VQcm92aWRlci5odG1sIj4KKzxjbGFzc25hbWU+UGVyc2lzdGVuY2VQcm92aWRlcjwvY2xhc3NuYW1lPjwvdWxpbms+IGJvb3RzdHJhcHBpbmcgaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitTZXQgdGhlIDxsaXRlcmFsPnByb3ZpZGVyPC9saXRlcmFsPiB0byA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUHJvdmlkZXJJbXBsPC9jbGFzc25hbWU+IHRvIHVzZQorT3BlbkpQQS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5qdGEtZGF0YS1zb3VyY2U8L2xpdGVyYWw+OiBUaGUgSk5ESSBuYW1lIG9mIGEgSkRCQyA8Y2xhc3NuYW1lPgorRGF0YVNvdXJjZTwvY2xhc3NuYW1lPiB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgZW5saXN0ZWQgaW4gSlRBIHRyYW5zYWN0aW9ucy4gVGhpcworbWF5IGJlIGFuIFhBIDxjbGFzc25hbWU+RGF0YVNvdXJjZTwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bm9uLWp0YS1kYXRhLXNvdXJjZTwvbGl0ZXJhbD46IFRoZSBKTkRJIG5hbWUgb2YgYSBKREJDIDxjbGFzc25hbWU+CitEYXRhU291cmNlPC9jbGFzc25hbWU+IHRoYXQgaXMgbm90IGVubGlzdGVkIGluIEpUQSB0cmFuc2FjdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm1hcHBpbmctZmlsZTwvbGl0ZXJhbD4qOiBUaGUgcmVzb3VyY2UgbmFtZXMgb2YgWE1MIG1hcHBpbmcgZmlsZXMgZm9yCitlbnRpdGllcyBhbmQgZW1iZWRkYWJsZSBjbGFzc2VzLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBtYXBwaW5nIGluZm9ybWF0aW9uIGluIGFuCis8ZmlsZW5hbWU+b3JtLnhtbDwvZmlsZW5hbWU+IGZpbGUgaW4geW91ciA8ZmlsZW5hbWU+TUVUQS1JTkY8L2ZpbGVuYW1lPgorZGlyZWN0b3J5LiBJZiBwcmVzZW50LCB0aGUgPGZpbGVuYW1lPm9ybS54bWw8L2ZpbGVuYW1lPiBtYXBwaW5nIGZpbGUgd2lsbCBiZQorcmVhZCBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5qYXItZmlsZTwvbGl0ZXJhbD4qOiBUaGUgbmFtZXMgb2YgamFyIGZpbGVzIGNvbnRhaW5pbmcgZW50aXRpZXMgYW5kCitlbWJlZGRhYmxlIGNsYXNzZXMuIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHNjYW4gdGhlIGphciBmb3IgYW5ub3RhdGVkIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmNsYXNzPC9saXRlcmFsPio6IFRoZSBjbGFzcyBuYW1lcyBvZiBlbnRpdGllcyBhbmQgZW1iZWRkYWJsZSBjbGFzc2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5wcm9wZXJ0aWVzPC9saXRlcmFsPjogVGhpcyBlbGVtZW50IGNvbnRhaW5zIG5lc3RlZCA8bGl0ZXJhbD5wcm9wZXJ0eQorPC9saXRlcmFsPiBlbGVtZW50cyB1c2VkIHRvIHNwZWNpZnkgdmVuZG9yLXNwZWNpZmljIHNldHRpbmdzLiBFYWNoIDxsaXRlcmFsPgorcHJvcGVydHk8L2xpdGVyYWw+IGhhcyBhIG5hbWUgYXR0cmlidXRlIGFuZCBhIHZhbHVlIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIFJlZmVyZW5jZSBHdWlkZSdzIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mIi8+IGRlc2NyaWJlcyBPcGVuSlBBJ3MKK2NvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK0hlcmUgaXMgYSB0eXBpY2FsIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPiBmaWxlIGZvciBhIG5vbi1FRQorZW52aXJvbm1lbnQ6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19wZXJzaXN0ZW5jZV94bWxleCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UueG1sCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7CismbHQ7cGVyc2lzdGVuY2UmZ3Q7CisgICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9Im9wZW5qcGEiJmd0OworICAgICZsdDtwcm92aWRlciZndDtvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQcm92aWRlckltcGwmbHQ7L3Byb3ZpZGVyJmd0OworICAgICZsdDtjbGFzcyZndDt0dXRvcmlhbC5BbmltYWwmbHQ7L2NsYXNzJmd0OworICAgICZsdDtjbGFzcyZndDt0dXRvcmlhbC5Eb2cmbHQ7L2NsYXNzJmd0OworICAgICZsdDtjbGFzcyZndDt0dXRvcmlhbC5SYWJiaXQmbHQ7L2NsYXNzJmd0OworICAgICZsdDtjbGFzcyZndDt0dXRvcmlhbC5TbmFrZSZsdDsvY2xhc3MmZ3Q7CisgICAgJmx0O3Byb3BlcnRpZXMmZ3Q7CisgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uVVJMIiB2YWx1ZT0iamRiYzpoc3FsZGI6dHV0b3JpYWxfZGF0YWJhc2UiLyZndDsKKyAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lIiB2YWx1ZT0ib3JnLmhzcWxkYi5qZGJjRHJpdmVyIi8mZ3Q7CisgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiIHZhbHVlPSJzYSIvJmd0OworICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkIiB2YWx1ZT0iIi8mZ3Q7CisgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Mb2ciIHZhbHVlPSJEZWZhdWx0TGV2ZWw9V0FSTiwgVG9vbD1JTkZPIi8mZ3Q7CisgICAgJmx0Oy9wcm9wZXJ0aWVzJmd0OworICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQmZ3Q7CismbHQ7L3BlcnNpc3RlbmNlJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3BlcnNpc3RlbmNlX3VzZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE5vbi1FRSBVc2UKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CitUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIDxjbGFzc25hbWU+UGVyc2lzdGVuY2U8L2NsYXNzbmFtZT4gY2xhc3MgaW4KK2FjdGlvbi4gWW91IHdpbGwgdHlwaWNhbGx5IGV4ZWN1dGUgY29kZSBsaWtlIHRoaXMgb24gYXBwbGljYXRpb24gc3RhcnR1cCwgdGhlbgorY2FjaGUgdGhlIHJlc3VsdGluZyBmYWN0b3J5IGZvciBmdXR1cmUgdXNlLiBUaGlzIGJvb3RzdHJhcHBpbmcgY29kZSBpcyBvbmx5CituZWNlc3NhcnkgaW4gbm9uLUVFIGVudmlyb25tZW50czsgaW4gYW4gRUUgZW52aXJvbm1lbnQgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3JpZXM8L2NsYXNzbmFtZT4gYXJlIHR5cGljYWxseSBpbmplY3RlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X3BlcnNpc3RlbmNlX2dldGVtZmFjdG9yeSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgT2J0YWluaW5nIGFuIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorLy8gaWYgeW91ciBwZXJzaXN0ZW5jZS54bWwgZmlsZSBkb2VzIG5vdCBjb250YWluIGFsbCBzZXR0aW5ncyBhbHJlYWR5LCB5b3UKKy8vIGNhbiBhZGQgdmVuZG9yIHNldHRpbmdzIHRvIGEgbWFwCitQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKy4uLgorCisvLyBjcmVhdGUgdGhlIGZhY3RvcnkgZGVmaW5lZCBieSB0aGUgIm9wZW5qcGEiIGVudGl0eS1tYW5hZ2VyIGVudHJ5CitFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYgPSBQZXJzaXN0ZW5jZS5jcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeSgib3BlbmpwYSIsIHByb3BzKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfcXVlcnkueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3F1ZXJ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDU4YmIxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3F1ZXJ5LnhtbApAQCAtMCwwICsxLDMzMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld19xdWVyeSI+CisgICAgPHRpdGxlPgorICAgICAgICBKUEEgUXVlcnkKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3F1ZXJ5Ij4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBKUCBRdWVyeQorICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgSlBRTAorICAgICAgICA8L3NlZWFsc28+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBxdWVyaWVzCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlZT4KKyAgICAgICAgICAgIFF1ZXJ5CisgICAgICAgIDwvc2VlPgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgMjkyIHggMjY1IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pwYS1xdWVyeS5wbmciIHdpZHRoPSIxOTVweCIvPgorICAgICAgICAgICAgCisgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgPC9tZWRpYW9iamVjdD4KKyAgICA8cGFyYT4KK1RoZSA8Y2xhc3NuYW1lPmphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5PC9jbGFzc25hbWU+IGludGVyZmFjZSBpcyB0aGUgbWVjaGFuaXNtCitmb3IgaXNzdWluZyBxdWVyaWVzIGluIEpQQS4gVGhlIHByaW1hcnkgcXVlcnkgbGFuZ3VhZ2UgdXNlZCBpcyB0aGUgSmF2YQorUGVyc2lzdGVuY2UgUXVlcnkgTGFuZ3VhZ2UsIG9yIDxsaXRlcmFsPkpQUUw8L2xpdGVyYWw+LiBKUFFMIGlzIHN5bnRhY3RpY2FsbHkKK3Zlcnkgc2ltaWxhciB0byBTUUwsIGJ1dCBpcyBvYmplY3Qtb3JpZW50ZWQgcmF0aGVyIHRoYW4gdGFibGUtb3JpZW50ZWQuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorVGhlIEFQSSBmb3IgZXhlY3V0aW5nIEpQUUwgcXVlcmllcyB3aWxsIGJlIGRpc2N1c3NlZCBpbgorPHhyZWYgbGlua2VuZD0ianBhX3F1ZXJ5X2FwaSIvPiwgYW5kIGEgZnVsbCBsYW5ndWFnZSByZWZlcmVuY2Ugd2lsbCBiZQorY292ZXJlZCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfbGFuZ3JlZiIvPi4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9xdWVyeV9hcGkiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBKUFFMIEFQSQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X2Jhc2ljIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBRdWVyeSBCYXNpY3MKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIHggRlJPTSBNYWdhemluZSB4Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgcHJlY2VkaW5nIGlzIGEgc2ltcGxlIEpQUUwgcXVlcnkgZm9yIGFsbCA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+CitlbnRpdGllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeShTdHJpbmcganBxbCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGUKKzx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YWVlLzUvZG9jcy9hcGkvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlci5odG1sIj4KKzxtZXRob2RuYW1lPkVudGl0eU1hbmFnZXIuY3JlYXRlUXVlcnk8L21ldGhvZG5hbWU+PC91bGluaz4gbWV0aG9kIGNyZWF0ZXMgYQorPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiBpbnN0YW5jZSBmcm9tIGEgZ2l2ZW4gSlBRTCBzdHJpbmcuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgTGlzdCBnZXRSZXN1bHRMaXN0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitJbnZva2luZworPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeS5odG1sI2dldFJlc3VsdExpc3QoKSI+Cis8bWV0aG9kbmFtZT5RdWVyeS5nZXRSZXN1bHRMaXN0PC9tZXRob2RuYW1lPjwvdWxpbms+IGV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQKK3JldHVybnMgYSA8Y2xhc3NuYW1lPkxpc3Q8L2NsYXNzbmFtZT4gY29udGFpbmluZyB0aGUgbWF0Y2hpbmcgb2JqZWN0cy4gVGhlCitmb2xsb3dpbmcgZXhhbXBsZSBleGVjdXRlcyBvdXIgPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPiBxdWVyeSBhYm92ZToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0VudGl0eU1hbmFnZXIgZW0gPSAuLi4KK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgiU0VMRUNUIHggRlJPTSBNYWdhemluZSB4Iik7CitMaXN0Jmx0O01hZ2F6aW5lJmd0OyByZXN1bHRzID0gKExpc3QmbHQ7TWFnYXppbmUmZ3Q7KSBxLmdldFJlc3VsdExpc3QoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK0EgSlBRTCBxdWVyeSBoYXMgYW4gaW50ZXJuYWwgbmFtZXNwYWNlIGRlY2xhcmVkIGluIHRoZSA8bGl0ZXJhbD5mcm9tPC9saXRlcmFsPgorY2xhdXNlIG9mIHRoZSBxdWVyeS4gQXJiaXRyYXJ5IGlkZW50aWZpZXJzIGFyZSBhc3NpZ25lZCB0byBlbnRpdGllcyBzbyB0aGF0IHRoZXkKK2NhbiBiZSByZWZlcmVuY2VkIGVsc2V3aGVyZSBpbiB0aGUgcXVlcnkuIEluIHRoZSBxdWVyeSBleGFtcGxlIGFib3ZlLCB0aGUKK2lkZW50aWZpZXIgPGxpdGVyYWw+eDwvbGl0ZXJhbD4gaXMgYXNzaWduZWQgdG8gdGhlIGVudGl0eSA8Y2xhc3NuYW1lPiBNYWdhemluZQorPC9jbGFzc25hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+YXM8L2xpdGVyYWw+IGtleXdvcmQgY2FuIG9wdGlvbmFsbHkgYmUgdXNlZCB3aGVuIGRlY2xhcmluZworaWRlbnRpZmllcnMgaW4gdGhlIDxsaXRlcmFsPmZyb208L2xpdGVyYWw+IGNsYXVzZS4gPGxpdGVyYWw+U0VMRUNUIHggRlJPTQorTWFnYXppbmUgeDwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlNFTEVDVCB4IEZST00gTWFnYXppbmUgQVMgeDwvbGl0ZXJhbD4gYXJlCitzeW5vbnltb3VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorRm9sbG93aW5nIHRoZSA8bGl0ZXJhbD5zZWxlY3Q8L2xpdGVyYWw+IGNsYXVzZSBvZiB0aGUgcXVlcnkgaXMgdGhlIG9iamVjdCBvcgorb2JqZWN0cyB0aGF0IHRoZSBxdWVyeSByZXR1cm5zLiBJbiB0aGUgY2FzZSBvZiB0aGUgcXVlcnkgYWJvdmUsIHRoZSBxdWVyeSdzCityZXN1bHQgbGlzdCB3aWxsIGNvbnRhaW4gaW5zdGFuY2VzIG9mIHRoZSA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+IGNsYXNzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIHNlbGVjdGluZyBlbnRpdGllcywgeW91IGNhbiBvcHRpb25hbCB1c2UgdGhlIGtleXdvcmQgPGxpdGVyYWw+b2JqZWN0Cis8L2xpdGVyYWw+LiBUaGUgY2xhdXNlcyA8bGl0ZXJhbD5zZWxlY3QgeDwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlNFTEVDVAorT0JKRUNUKHgpPC9saXRlcmFsPiBhcmUgc3lub255bW91cy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBvcHRpb25hbCA8bGl0ZXJhbD53aGVyZTwvbGl0ZXJhbD4gY2xhdXNlIHBsYWNlcyBjcml0ZXJpYSBvbiBtYXRjaGluZworcmVzdWx0cy4gRm9yIGV4YW1wbGU6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIHgudGl0bGUgPSAnSkRKJzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK0tleXdvcmRzIGluIEpQUUwgZXhwcmVzc2lvbnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGJ1dCBlbnRpdHksIGlkZW50aWZpZXIsIGFuZAorbWVtYmVyIG5hbWVzIGFyZSBub3QuIEZvciBleGFtcGxlLCB0aGUgZXhwcmVzc2lvbiBhYm92ZSBjb3VsZCBhbHNvIGJlIGV4cHJlc3NlZAorYXM6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIHgudGl0bGUgPSAnSkRKJzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK0J1dCBpdCBjb3VsZCBub3QgYmUgZXhwcmVzc2VkIGFzOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPlNFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LlRJVExFID0gJ0pESic8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitBcyB3aXRoIHRoZSA8bGl0ZXJhbD5zZWxlY3Q8L2xpdGVyYWw+IGNsYXVzZSwgYWxpYXMgbmFtZXMgaW4gdGhlIDxsaXRlcmFsPndoZXJlCis8L2xpdGVyYWw+IGNsYXVzZSBhcmUgcmVzb2x2ZWQgdG8gdGhlIGVudGl0eSBkZWNsYXJlZCBpbiB0aGUgPGxpdGVyYWw+ZnJvbQorPC9saXRlcmFsPiBjbGF1c2UuIFRoZSBxdWVyeSBhYm92ZSBjb3VsZCBiZSBkZXNjcmliZWQgaW4gRW5nbGlzaCBhcyAiZm9yIGFsbAorPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPiBpbnN0YW5jZXMgPGxpdGVyYWw+eDwvbGl0ZXJhbD4sIHJldHVybiBhIGxpc3QKK29mIGV2ZXJ5IDxsaXRlcmFsPng8L2xpdGVyYWw+IHN1Y2ggdGhhdCA8bGl0ZXJhbD54PC9saXRlcmFsPidzIDxsaXRlcmFsPnRpdGxlCis8L2xpdGVyYWw+IGZpZWxkIGlzIGVxdWFsIHRvICdKREonIi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSlBRTCB1c2VzIFNRTC1saWtlIHN5bnRheCBmb3IgcXVlcnkgY3JpdGVyaWEuIFRoZSA8bGl0ZXJhbD5hbmQ8L2xpdGVyYWw+IGFuZAorPGxpdGVyYWw+b3I8L2xpdGVyYWw+IGxvZ2ljYWwgb3BlcmF0b3JzIGNoYWluIG11bHRpcGxlIGNyaXRlcmlhIHRvZ2V0aGVyOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIHgudGl0bGUgPSAnSkRKJyBPUiB4LnRpdGxlID0gJ0phdmFQcm8nCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+PTwvbGl0ZXJhbD4gb3BlcmF0b3IgdGVzdHMgZm9yIGVxdWFsaXR5LiA8bGl0ZXJhbD4mbHQ7Jmd0OworPC9saXRlcmFsPiB0ZXN0cyBmb3IgaW5lcXVhbGl0eS4gSlBRTCBhbHNvIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXJpdGhtZXRpYworb3BlcmF0b3JzIGZvciBudW1lcmljIGNvbXBhcmlzb25zOiA8bGl0ZXJhbD4mZ3Q7LCAmZ3Q7PSwgJmx0OywgJmx0Oz08L2xpdGVyYWw+LgorRm9yIGV4YW1wbGU6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5wcmljZSAmZ3Q7IDMuMDAgQU5EIHgucHJpY2UgJmx0Oz0gNS4wMAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBxdWVyeSByZXR1cm5zIGFsbCBtYWdhemluZXMgd2hvc2UgcHJpY2UgaXMgZ3JlYXRlciB0aGFuIDMuMDAgYW5kIGxlc3MgdGhhbgorb3IgZXF1YWwgdG8gNS4wMC4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnByaWNlICZsdDsmZ3Q7IDMuMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgcXVlcnkgcmV0dXJucyBhbGwgTWFnYXppbmVzIHdob3NlIHByaWNlIGlzIG5vdCBlcXVhbHMgdG8gMy4wMC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBncm91cCBleHByZXNzaW9ucyB0b2dldGhlciB1c2luZyBwYXJlbnRoZXNlcyBpbiBvcmRlciB0byBzcGVjaWZ5IGhvdwordGhleSBhcmUgZXZhbHVhdGVkLiBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IHBhcmVudGhlc2VzIGFyZSB1c2VkIGluIEphdmEuIEZvcgorZXhhbXBsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSAoeC5wcmljZSAmZ3Q7IDMuMDAgQU5EIHgucHJpY2UgJmx0Oz0gNS4wMCkgT1IgeC5wcmljZSA9IDcuMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgZXhwcmVzc2lvbiB3b3VsZCBtYXRjaCBtYWdhemluZXMgd2hvc2UgcHJpY2UgaXMgNC4wMCwgNS4wMCwgb3IgNy4wMCwgYnV0Citub3QgNi4wMC4gQWx0ZXJuYXRlbHk6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5wcmljZSAmZ3Q7IDMuMDAgQU5EICh4LnByaWNlICZsdDs9IDUuMDAgT1IgeC5wcmljZSA9IDcuMDApCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGlzIGV4cHJlc3Npb24gd2lsbCBtYWdhemluZXMgd2hvc2UgcHJpY2UgaXMgNS4wMCBvciA3LjAwLCBidXQgbm90IDQuMDAgb3IKKzYuMDAuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0pQUUwgYWxzbyBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbmFsczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVFdFRU4gZXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5bTk9UXSBCRVRXRUVOPC9saXRlcmFsPjogU2hvcnRoYW5kIGZvciBleHByZXNzaW5nIHRoYXQgYSB2YWx1ZSBmYWxscworYmV0d2VlbiB0d28gb3RoZXIgdmFsdWVzLiBUaGUgZm9sbG93aW5nIHR3byBzdGF0ZW1lbnRzIGFyZSBzeW5vbnltb3VzOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5wcmljZSAmZ3Q7PSAzLjAwIEFORCB4LnByaWNlICZsdDs9IDUuMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5wcmljZSBCRVRXRUVOIDMuMDAgQU5EIDUuMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElLRSBleHByZXNzaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPltOT1RdIExJS0U8L2xpdGVyYWw+OiBQZXJmb3JtcyBhIHN0cmluZyBjb21wYXJpc29uIHdpdGggd2lsZGNhcmQKK3N1cHBvcnQuIFRoZSBzcGVjaWFsIGNoYXJhY3RlciAnXycgaW4gdGhlIHBhcmFtZXRlciBtZWFucyB0byBtYXRjaCBhbnkgc2luZ2xlCitjaGFyYWN0ZXIsIGFuZCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXIgJyUnIG1lYW5zIHRvIG1hdGNoIGFueSBzZXF1ZW5jZSBvZgorY2hhcmFjdGVycy4gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgbWF0Y2hlcyB0aXRsZSBmaWVsZHMgIkpESiIgYW5kICJKYXZhUHJvIiwKK2J1dCBub3QgIklUIEluc2lkZXIiOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC50aXRsZSBMSUtFICdKJScKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgbWF0Y2hlcyB0aGUgdGl0bGUgZmllbGQgIkpESiIgYnV0IG5vdCAiSmF2YVBybyI6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlIExJS0UgJ0pfXycKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU4gZXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5bTk9UXSBJTjwvbGl0ZXJhbD46IFNwZWNpZmllcyB0aGF0IHRoZSBtZW1iZXIgbXVzdCBiZSBlcXVhbCB0byBvbmUKK2VsZW1lbnQgb2YgdGhlIHByb3ZpZGVkIGxpc3QuIFRoZSBmb2xsb3dpbmcgdHdvIHN0YXRlbWVudHMgYXJlIHN5bm9ueW1vdXM6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlIElOICgnSkRKJywgJ0phdmFQcm8nLCAnSVQgSW5zaWRlcicpCis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPlNFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlID0gJ0pESicgT1IgeC50aXRsZSA9ICdKYXZhUHJvJyBPUiB4LnRpdGxlID0gJ0lUIEluc2lkZXInCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTIEVNUFRZIGV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+SVMgW05PVF0gRU1QVFk8L2xpdGVyYWw+OiBTcGVjaWZpZXMgdGhhdCB0aGUgY29sbGVjdGlvbiBmaWVsZCBob2xkcyBubworZWxlbWVudHMuIEZvciBleGFtcGxlOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5hcnRpY2xlcyBpcyBlbXB0eQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGlzIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbGwgbWFnYXppbmVzIHdob3NlIDxsaXRlcmFsPiBhcnRpY2xlczwvbGl0ZXJhbD4KK21lbWJlciBjb250YWlucyBubyBlbGVtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTIE5VTEwgZXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5JUyBbTk9UXSBOVUxMPC9saXRlcmFsPjogU3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkIGlzIGVxdWFsIHRvIG51bGwuCitGb3IgZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIHgucHVibGlzaGVyIGlzIG51bGwKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYWxsIE1hZ2F6aW5lIGluc3RhbmNlcyB3aG9zZSAicHVibGlzaGVyIiBmaWVsZCBpcyBzZXQKK3RvIDxsaXRlcmFsPm51bGw8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UIGV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Tk9UPC9saXRlcmFsPjogTmVnYXRlcyB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24uIEZvciBleGFtcGxlLCB0aGUKK2ZvbGxvd2luZyB0d28gc3RhdGVtZW50cyBhcmUgc3lub255bW91czoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIE5PVCh4LnByaWNlID0gMTAuMCkKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5wcmljZSAmbHQ7Jmd0OyAxMC4wCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X3JlbGF0aW9ucyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgUmVsYXRpb24gVHJhdmVyc2FsCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitSZWxhdGlvbnMgYmV0d2VlbiBvYmplY3RzIGNhbiBiZSB0cmF2ZXJzZWQgdXNpbmcgSmF2YS1saWtlIHN5bnRheC4gRm9yIGV4YW1wbGUsCitpZiB0aGUgTWFnYXppbmUgY2xhc3MgaGFzIGEgZmllbGQgbmFtZWQgInB1Ymxpc2hlciIgb3IgdHlwZSBDb21wYW55LCB0aGF0CityZWxhdGlvbiBjYW4gYmUgcXVlcmllZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIHgucHVibGlzaGVyLm5hbWUgPSAnUmFuZG9tIEhvdXNlJworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBxdWVyeSByZXR1cm5zIGFsbCA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+IGluc3RhbmNlcyB3aG9zZSA8bGl0ZXJhbD4KK3B1Ymxpc2hlcjwvbGl0ZXJhbD4gZmllbGQgaXMgc2V0IHRvIGEgPGNsYXNzbmFtZT5Db21wYW55PC9jbGFzc25hbWU+IGluc3RhbmNlCit3aG9zZSBuYW1lIGlzICJSYW5kb20gSG91c2UiLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitTaW5nbGUtdmFsdWVkIHJlbGF0aW9uIHRyYXZlcnNhbCBpbXBsaWVzIHRoYXQgdGhlIHJlbGF0aW9uIGlzIG5vdCBudWxsLiBJbiBTUUwKK3Rlcm1zLCB0aGlzIGlzIGtub3duIGFzIGFuIDxlbXBoYXNpcz5pbm5lciBqb2luPC9lbXBoYXNpcz4uIElmIHlvdSB3YW50IHRvIGFsc28KK2luY2x1ZGUgcmVsYXRpb25zIHRoYXQgYXJlIG51bGwsIHlvdSBjYW4gc3BlY2lmeToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnB1Ymxpc2hlci5uYW1lID0gJ1JhbmRvbSBIb3VzZScgb3IgeC5wdWJsaXNoZXIgaXMgbnVsbAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBhbHNvIHRyYXZlcnNlIGNvbGxlY3Rpb24gZmllbGRzIGluIHF1ZXJpZXMsIGJ1dCB5b3UgbXVzdCBkZWNsYXJlIGVhY2gKK3RyYXZlcnNhbCBpbiB0aGUgPGxpdGVyYWw+ZnJvbTwvbGl0ZXJhbD4gY2xhdXNlLiBDb25zaWRlcjoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCwgSU4oeC5hcnRpY2xlcykgeSBXSEVSRSB5LmF1dGhvck5hbWUgPSAnSm9obiBEb2UnCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGlzIHF1ZXJ5IHNheXMgdGhhdCBmb3IgZWFjaCA8Y2xhc3NuYW1lPk1hZ2F6aW5lPC9jbGFzc25hbWU+PGxpdGVyYWw+IHgKKzwvbGl0ZXJhbD4sIHRyYXZlcnNlIHRoZSA8bGl0ZXJhbD5hcnRpY2xlczwvbGl0ZXJhbD4gcmVsYXRpb24gYW5kIGNoZWNrIGVhY2gKKzxjbGFzc25hbWU+QXJ0aWNsZTwvY2xhc3NuYW1lPjxsaXRlcmFsPnk8L2xpdGVyYWw+LCBhbmQgcGFzcyB0aGUgZmlsdGVyIGlmCis8bGl0ZXJhbD55PC9saXRlcmFsPidzIDxsaXRlcmFsPmF1dGhvck5hbWU8L2xpdGVyYWw+IGZpZWxkIGlzIGVxdWFsIHRvICJKb2huCitEb2UiLiBJbiBzaG9ydCwgdGhpcyBxdWVyeSB3aWxsIHJldHVybiBhbGwgbWFnYXppbmVzIHRoYXQgaGF2ZSBhbnkgYXJ0aWNsZXMKK3dyaXR0ZW4gYnkgSm9obiBEb2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5JTigpPC9saXRlcmFsPiBzeW50YXggY2FuIGFsc28gYmUgZXhwcmVzc2VkIHdpdGggdGhlIGtleXdvcmRzCis8bGl0ZXJhbD5pbm5lciBqb2luPC9saXRlcmFsPi4gVGhlIHN0YXRlbWVudHMgPGxpdGVyYWw+U0VMRUNUIHggRlJPTSBNYWdhemluZQoreCwgSU4oeC5hcnRpY2xlcykgeSBXSEVSRSB5LmF1dGhvck5hbWUgPSAnSm9obiBEb2UnPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggaW5uZXIgam9pbiB4LmFydGljbGVzIHkgV0hFUkUgeS5hdXRob3JOYW1lID0gJ0pvaG4gRG9lJworPC9saXRlcmFsPiBhcmUgc3lub255bW91cy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19qb2luX2ZldGNoIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBGZXRjaCBKb2lucworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorSlBRTCBxdWVyaWVzIG1heSBzcGVjaWZ5IG9uZSBvciBtb3JlIDxsaXRlcmFsPmpvaW4gZmV0Y2g8L2xpdGVyYWw+IGRlY2xhcmF0aW9ucywKK3doaWNoIGFsbG93IHRoZSBxdWVyeSB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgYmUKK3ByZS1mZXRjaGVkLgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IGpvaW4gZmV0Y2ggeC5hcnRpY2xlcyBXSEVSRSB4LnRpdGxlID0gJ0pESicKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBxdWVyeSBhYm92ZSByZXR1cm5zIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4gaW5zdGFuY2VzIGFuZCBndWFyYW50ZWVzCit0aGF0IHRoZSA8bGl0ZXJhbD5hcnRpY2xlczwvbGl0ZXJhbD4gZmllbGQgd2lsbCBhbHJlYWR5IGJlIGZldGNoZWQgaW4gdGhlCityZXR1cm5lZCBpbnN0YW5jZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK011bHRpcGxlIGZpZWxkcyBtYXkgYmUgc3BlY2lmaWVkIGluIHNlcGFyYXRlIDxsaXRlcmFsPmpvaW4gZmV0Y2g8L2xpdGVyYWw+CitkZWNsYXJhdGlvbnM6IDxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCB4IEZST00gTWFnYXppbmUgeCBqb2luIGZldGNoIHguYXJ0aWNsZXMgam9pbiBmZXRjaCB4LmF1dGhvcnMgV0hFUkUgeC50aXRsZSA9ICdKREonCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8bm90ZT48cGFyYT4gU3BlY2lmeWluZyB0aGUgPGxpdGVyYWw+am9pbiBmZXRjaDwvbGl0ZXJhbD4gZGVjbGFyYXRpb24gaXMKK2Z1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGFkZGluZyB0aGUgZmllbGRzIHRvIHRoZSBRdWVyeSdzIDxjbGFzc25hbWU+CitGZXRjaENvbmZpZ3VyYXRpb248L2NsYXNzbmFtZT4uIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZmV0Y2giLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19xdWVyeV9mdW5jdGlvbnMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEpQUUwgRnVuY3Rpb25zCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitBcyB3ZWxsIGFzIHN1cHBvcnRpbmcgZGlyZWN0IGZpZWxkIGFuZCByZWxhdGlvbiBjb21wYXJpc29ucywgSlBRTCBzdXBwb3J0cyBhCitwcmUtZGVmaW5lZCBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgeW91IGNhbiBhcHBseS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNBVCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkNPTkNBVChzdHJpbmcxLCBzdHJpbmcyKTwvbGl0ZXJhbD46IENvbmNhdGVuYXRlcyB0d28gc3RyaW5nIGZpZWxkcyBvcgorbGl0ZXJhbHMuIEZvciBleGFtcGxlOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgQ09OQ0FUKHgudGl0bGUsICdzJykgPSAnSkRKcycKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RSSU5HIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U1VCU1RSSU5HKHN0cmluZywgc3RhcnRJbmRleCwgbGVuZ3RoKTwvbGl0ZXJhbD46IFJldHVybnMgdGhlIHBhcnQgb2YKK3RoZSA8bGl0ZXJhbD5zdHJpbmc8L2xpdGVyYWw+IGFyZ3VtZW50IHN0YXJ0aW5nIGF0IDxsaXRlcmFsPnN0YXJ0SW5kZXg8L2xpdGVyYWw+CisoMS1iYXNlZCkgYW5kIGVuZGluZyBhdCA8bGl0ZXJhbD5sZW5ndGg8L2xpdGVyYWw+IGNoYXJhY3RlcnMgcGFzdCA8bGl0ZXJhbD4KK3N0YXJ0SW5kZXg8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgU1VCU1RSSU5HKHgudGl0bGUsIDEsIDEpID0gJ0onCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU0gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5UUklNKFtMRUFESU5HIHwgVFJBSUxJTkcgfCBCT1RIXSBbY2hhcmFjdGVyIEZST01dIHN0cmluZzwvbGl0ZXJhbD46CitUcmltcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmcm9tIGVpdGhlciB0aGUgYmVnaW5uaW5nICggPGxpdGVyYWw+TEVBRElORworPC9saXRlcmFsPikgZW5kICggPGxpdGVyYWw+VFJBSUxJTkc8L2xpdGVyYWw+KSBvciBib3RoICggPGxpdGVyYWw+IEJPVEgKKzwvbGl0ZXJhbD4pIG9mIHRoZSBzdHJpbmcgYXJndW1lbnQuIElmIG5vIHRyaW0gY2hhcmFjdGVyIGlzIHNwZWNpZmllZCwgdGhlCitzcGFjZSBjaGFyYWN0ZXIgd2lsbCBiZSB0cmltbWVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgVFJJTShCT1RIICdKJyBGUk9NIHgudGl0bGUpID0gJ0QnCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV0VSIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+TE9XRVIoc3RyaW5nKTwvbGl0ZXJhbD46IFJldHVybnMgdGhlIGxvd2VyLWNhc2Ugb2YgdGhlIHNwZWNpZmllZAorc3RyaW5nIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgTE9XRVIoeC50aXRsZSkgPSAnamRqJworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUFBFUiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlVQUEVSKHN0cmluZyk8L2xpdGVyYWw+OiBSZXR1cm5zIHRoZSB1cHBlci1jYXNlIG9mIHRoZSBzcGVjaWZpZWQKK3N0cmluZyBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIFVQUEVSKHgudGl0bGUpID0gJ0pBVkFQUk8nCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkxFTkdUSChzdHJpbmcpPC9saXRlcmFsPjogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlCitzcGVjaWZpZWQgc3RyaW5nIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgTEVOR1RIKHgudGl0bGUpID0gMworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NBVEUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5MT0NBVEUoc2VhcmNoU3RyaW5nLCBjYW5kaWRhdGVTdHJpbmcgWywgc3RhcnRJbmRleF0pPC9saXRlcmFsPjoKK1JldHVybnMgdGhlIGZpcnN0IGluZGV4IG9mIDxsaXRlcmFsPnNlYXJjaFN0cmluZzwvbGl0ZXJhbD4gaW4gPGxpdGVyYWw+CitjYW5kaWRhdGVTdHJpbmc8L2xpdGVyYWw+LiBQb3NpdGlvbnMgYXJlIDEtYmFzZWQuIElmIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kLAorcmV0dXJucyAwLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgTE9DQVRFKCdEJywgeC50aXRsZSkgPSAyCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkFCUyhudW1iZXIpPC9saXRlcmFsPjogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgQUJTKHgucHJpY2UpICZndDs9IDUuMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FSVCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlNRUlQobnVtYmVyKTwvbGl0ZXJhbD46IFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIFNRUlQoeC5wcmljZSkgJmd0Oz0gMS4wMAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0QgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5NT0QobnVtYmVyLCBkaXZpc29yKTwvbGl0ZXJhbD46IFJldHVybnMgdGhlIG1vZHVsbyBvZiA8bGl0ZXJhbD5udW1iZXIKKzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmRpdmlzb3I8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgTU9EKHgucHJpY2UsIDEwKSA9IDAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9EQVRFIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Q1VSUkVOVF9EQVRFPC9saXRlcmFsPjogUmV0dXJucyB0aGUgY3VycmVudCBkYXRlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9USU1FIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Q1VSUkVOVF9USU1FPC9saXRlcmFsPjogUmV0dXJucyB0aGUgY3VycmVudCB0aW1lLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9USU1FU1RBTVAgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5DVVJSRU5UX1RJTUVTVEFNUDwvbGl0ZXJhbD46IFJldHVybnMgdGhlIGN1cnJlbnQgdGltZXN0YW1wLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcXVlcnlfaW5oZXJpdGFuY2UiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFBvbHltb3JwaGljIFF1ZXJpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0FsbCBKUFFMIHF1ZXJpZXMgYXJlIHBvbHltb3JwaGljLCB3aGljaCBtZWFucyB0aGUgPGxpdGVyYWw+ZnJvbTwvbGl0ZXJhbD4gY2xhdXNlCitvZiBhIHF1ZXJ5IGluY2x1ZGVzIG5vdCBvbmx5IGluc3RhbmNlcyBvZiB0aGUgc3BlY2lmaWMgZW50aXR5IGNsYXNzIHRvIHdoaWNoIGl0CityZWZlcnMsIGJ1dCBhbGwgc3ViY2xhc3NlcyBvZiB0aGF0IGNsYXNzIGFzIHdlbGwuIFRoZSBpbnN0YW5jZXMgcmV0dXJuZWQgYnkgYQorcXVlcnkgaW5jbHVkZSBpbnN0YW5jZXMgb2YgdGhlIHN1YmNsYXNzZXMgdGhhdCBzYXRpc2Z5IHRoZSBxdWVyeSBjb25kaXRpb25zLiBGb3IKK2V4YW1wbGUsIHRoZSBmb2xsb3dpbmcgcXVlcnkgbWF5IHJldHVybiBpbnN0YW5jZXMgb2YgPGNsYXNzbmFtZT4gTWFnYXppbmUKKzwvY2xhc3NuYW1lPiwgYXMgd2VsbCBhcyA8Y2xhc3NuYW1lPlRhYmxvaWQ8L2NsYXNzbmFtZT4gYW5kIDxjbGFzc25hbWU+RGlnZXN0Cis8L2NsYXNzbmFtZT4gaW5zdGFuY2VzLCB3aGVyZSA8Y2xhc3NuYW1lPlRhYmxvaWQ8L2NsYXNzbmFtZT4gYW5kIDxjbGFzc25hbWU+CitEaWdlc3Q8L2NsYXNzbmFtZT4gYXJlIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4gc3ViY2xhc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz5TRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggV0hFUkUgeC5wcmljZSAmbHQ7IDU8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfcXVlcnlfcGFyYW1zIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBRdWVyeSBQYXJhbWV0ZXJzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitKUFFMIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgcXVlcmllcy4gRWl0aGVyIG5hbWVkIHBhcmFtZXRlcnMgb3IKK3Bvc2l0aW9uYWwgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkIGluIHRoZSBxdWVyeSBzdHJpbmcuIFBhcmFtZXRlcnMgYWxsb3cgeW91Cit0byByZS11c2UgcXVlcnkgdGVtcGxhdGVzIHdoZXJlIG9ubHkgdGhlIGlucHV0IHBhcmFtZXRlcnMgdmFyeS4gQSBzaW5nbGUgcXVlcnkKK2NhbiBkZWNsYXJlIGVpdGhlciBuYW1lZCBwYXJhbWV0ZXJzIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgYnV0IGlzIG5vdCBhbGxvd2VkCit0byBkZWNsYXJlIGJvdGggbmFtZWQgYW5kIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBRdWVyeSBzZXRQYXJhbWV0ZXIgKGludCBwb3MsIE9iamVjdCB2YWx1ZSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitTcGVjaWZ5IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBpbiB5b3VyIEpQUUwgc3RyaW5nIHVzaW5nIGFuIGludGVnZXIgcHJlZml4ZWQgYnkgYQorcXVlc3Rpb24gbWFyay4gWW91IGNhbiB0aGVuIHBvcHVsYXRlIHRoZSA8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IG9iamVjdAord2l0aCBwb3NpdGlvbmFsIHBhcmFtZXRlciB2YWx1ZXMgdmlhIGNhbGxzIHRvIHRoZSA8bWV0aG9kbmFtZT5zZXRQYXJhbWV0ZXIKKzwvbWV0aG9kbmFtZT4gbWV0aG9kIGFib3ZlLiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4KK2luc3RhbmNlIGZvciBvcHRpb25hbCBtZXRob2QgY2hhaW5pbmcuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitFbnRpdHlNYW5hZ2VyIGVtID0gLi4uCitRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlID0gPzEgYW5kIHgucHJpY2UgJmd0OyA/MiIpOworcS5zZXRQYXJhbWV0ZXIoMSwgIkpESiIpLnNldFBhcmFtZXRlcigyLCA1LjApOworTGlzdCZsdDtNYWdhemluZSZndDsgcmVzdWx0cyA9IChMaXN0Jmx0O01hZ2F6aW5lJmd0OykgcS5nZXRSZXN1bHRMaXN0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGlzIGNvZGUgd2lsbCBzdWJzdGl0dXRlIDxsaXRlcmFsPkpESjwvbGl0ZXJhbD4gZm9yIHRoZSA8bGl0ZXJhbD4/MTwvbGl0ZXJhbD4KK3BhcmFtZXRlciBhbmQgPGxpdGVyYWw+NS4wPC9saXRlcmFsPiBmb3IgdGhlIDxsaXRlcmFsPj8yPC9saXRlcmFsPiBwYXJhbWV0ZXIsCit0aGVuIGV4ZWN1dGUgdGhlIHF1ZXJ5IHdpdGggdGhvc2UgdmFsdWVzLgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIFF1ZXJ5IHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK05hbWVkIHBhcmFtZXRlciBhcmUgZGVub3RlZCBieSBwcmVmaXhpbmcgYW4gYXJiaXRyYXJ5IG5hbWUgd2l0aCBhIGNvbG9uIGluIHlvdXIKK0pQUUwgc3RyaW5nLiBZb3UgY2FuIHRoZW4gcG9wdWxhdGUgdGhlIDxjbGFzc25hbWU+IFF1ZXJ5PC9jbGFzc25hbWU+IG9iamVjdCB3aXRoCitwYXJhbWV0ZXIgdmFsdWVzIHVzaW5nIHRoZSBtZXRob2QgYWJvdmUuIExpa2UgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG1ldGhvZCwKK3RoaXMgbWV0aG9kIHJldHVybnMgdGhlIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gaW5zdGFuY2UgZm9yIG9wdGlvbmFsCittZXRob2QgY2hhaW5pbmcuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitFbnRpdHlNYW5hZ2VyIGVtID0gLi4uCitRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoIlNFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlID0gOnRpdGxlUGFyYW0gYW5kIHgucHJpY2UgJmd0OyA6cHJpY2VQYXJhbSIpOworcS5zZXRQYXJhbWV0ZXIoInRpdGxlUGFyYW0iLCAiSkRKIikuc2V0UGFyYW1ldGVyKCJwcmljZVBhcmFtIiwgNS4wKTsKK0xpc3QmbHQ7TWFnYXppbmUmZ3Q7IHJlc3VsdHMgPSAoTGlzdCZsdDtNYWdhemluZSZndDspIHEuZ2V0UmVzdWx0TGlzdCgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBjb2RlIHN1YnN0aXR1dGVzIDxsaXRlcmFsPkpESjwvbGl0ZXJhbD4gZm9yIHRoZSA8bGl0ZXJhbD4gOnRpdGxlUGFyYW0KKzwvbGl0ZXJhbD4gcGFyYW1ldGVyIGFuZCA8bGl0ZXJhbD41LjA8L2xpdGVyYWw+IGZvciB0aGUgPGxpdGVyYWw+OnByaWNlUGFyYW0KKzwvbGl0ZXJhbD4gcGFyYW1ldGVyLCB0aGVuIGV4ZWN1dGVzIHRoZSBxdWVyeSB3aXRoIHRob3NlIHZhbHVlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X29yZGVyaW5nIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBPcmRlcmluZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorSlBRTCBxdWVyaWVzIG1heSBvcHRpb25hbGx5IGNvbnRhaW4gYW4gPGxpdGVyYWw+b3JkZXIgYnk8L2xpdGVyYWw+IGNsYXVzZSB3aGljaAorc3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpZWxkcyB0byBvcmRlciBieSB3aGVuIHJldHVybmluZyBxdWVyeSByZXN1bHRzLiBZb3UgbWF5Citmb2xsb3cgdGhlIDxsaXRlcmFsPm9yZGVyIGJ5IGZpZWxkPC9saXRlcmFsPiBjbGF1c2Ugd2l0aCB0aGUgPGxpdGVyYWw+YXNjCis8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPmRlc2M8L2xpdGVyYWw+IGtleXdvcmRzLCB3aGljaCBpbmRpY2F0ZSB0aGF0IG9yZGVyaW5nCitzaG91bGQgYmUgYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcsIHJlc3BlY3RpdmVseS4gSWYgdGhlIGRpcmVjdGlvbiBpcyBvbWl0dGVkLAorb3JkZXJpbmcgaXMgYXNjZW5kaW5nIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgeCBGUk9NIE1hZ2F6aW5lIHggb3JkZXIgYnkgeC50aXRsZSBhc2MsIHgucHJpY2UgZGVzYworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHF1ZXJ5IGFib3ZlIHJldHVybnMgPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPiBpbnN0YW5jZXMgc29ydGVkIGJ5Cit0aGVpciB0aXRsZSBpbiBhc2NlbmRpbmcgb3JkZXIuIEluIGNhc2VzIHdoZXJlIHRoZSB0aXRsZXMgb2YgdHdvIG9yIG1vcmUKK21hZ2F6aW5lcyBhcmUgdGhlIHNhbWUsIHRob3NlIGluc3RhbmNlcyB3aWxsIGJlIHNvcnRlZCBieSBwcmljZSBpbiBkZXNjZW5kaW5nCitvcmRlci4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X2FnZ3JlZ2F0ZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0pQUUwgcXVlcmllcyBjYW4gc2VsZWN0IGFnZ3JlZ2F0ZSBkYXRhIGFzIHdlbGwgYXMgb2JqZWN0cy4gSlBRTCBpbmNsdWRlcyB0aGUKKzxsaXRlcmFsPm1pbjwvbGl0ZXJhbD4sIDxsaXRlcmFsPm1heDwvbGl0ZXJhbD4sIDxsaXRlcmFsPmF2ZzwvbGl0ZXJhbD4sIGFuZAorPGxpdGVyYWw+Y291bnQ8L2xpdGVyYWw+IGFnZ3JlZ2F0ZXMuIFRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBmb3IgcmVwb3J0aW5nCithbmQgc3VtbWFyeSBxdWVyaWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZm9sbG93aW5nIHF1ZXJ5IHdpbGwgcmV0dXJuIHRoZSBhdmVyYWdlIG9mIGFsbCB0aGUgcHJpY2VzIG9mIGFsbCB0aGUKK21hZ2F6aW5lczoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0VudGl0eU1hbmFnZXIgZW0gPSAuLi4KK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgiU0VMRUNUIEFWRyh4LnByaWNlKSBGUk9NIE1hZ2F6aW5lIHgiKTsKK051bWJlciByZXN1bHQgPSAoTnVtYmVyKSBxLmdldFNpbmdsZVJlc3VsdCgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBxdWVyeSB3aWxsIHJldHVybiB0aGUgaGlnaGVzdCBwcmljZSBvZiBhbGwgdGhlIG1hZ2F6aW5lcyB0aXRsZWQKKyJKREoiOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorRW50aXR5TWFuYWdlciBlbSA9IC4uLgorUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJTRUxFQ1QgTUFYKHgucHJpY2UpIEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlID0gJ0pESiciKTsKK051bWJlciByZXN1bHQgPSAoTnVtYmVyKSBxLmdldFNpbmdsZVJlc3VsdCgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X25hbWVkIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBOYW1lZCBRdWVyaWVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitRdWVyeSB0ZW1wbGF0ZXMgY2FuIGJlIHN0YXRpY2FsbHkgZGVjbGFyZWQgdXNpbmcgdGhlIDxsaXRlcmFsPiBOYW1lZFF1ZXJ5Cis8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5OYW1lZFF1ZXJpZXM8L2xpdGVyYWw+IGFubm90YXRpb25zLiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0BFbnRpdHkKK0BOYW1lZFF1ZXJpZXMoeworICAgIEBOYW1lZFF1ZXJ5KG5hbWU9Im1hZ3NPdmVyUHJpY2UiLAorICAgICAgICBxdWVyeT0iU0VMRUNUIHggRlJPTSBNYWdhemluZSB4IFdIRVJFIHgucHJpY2UgJmd0OyA/MSIpLAorICAgIEBOYW1lZFF1ZXJ5KG5hbWU9Im1hZ3NCeVRpdGxlIiwKKyAgICAgICAgcXVlcnk9IlNFTEVDVCB4IEZST00gTWFnYXppbmUgeCBXSEVSRSB4LnRpdGxlID0gOnRpdGxlUGFyYW0iKQorfSkKK3B1YmxpYyBjbGFzcyBNYWdhemluZSB7CisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBkZWZpbmUgdHdvIG5hbWVkIHF1ZXJpZXMgY2FsbGVkIDxsaXRlcmFsPm1hZ3NPdmVyUHJpY2UKKzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPm1hZ3NCeVRpdGxlPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBRdWVyeSBjcmVhdGVOYW1lZFF1ZXJ5KFN0cmluZyBuYW1lKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSByZXRyaWV2ZSBuYW1lZCBxdWVyaWVzIHdpdGggdGhlIGFib3ZlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPgorbWV0aG9kLiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0VudGl0eU1hbmFnZXIgZW0gPSAuLi4KK1F1ZXJ5IHEgPSBlbS5jcmVhdGVOYW1lZFF1ZXJ5KCJtYWdzT3ZlclByaWNlIik7CitxLnNldFBhcmFtZXRlcigxLCA1LjBmKTsKK0xpc3QmbHQ7TWFnYXppbmUmZ3Q7IHJlc3VsdHMgPSAoTGlzdCZsdDtNYWdhemluZSZndDspIHEuZ2V0UmVzdWx0TGlzdCgpOworPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KK0VudGl0eU1hbmFnZXIgZW0gPSAuLi4KK1F1ZXJ5IHEgPSBlbS5jcmVhdGVOYW1lZFF1ZXJ5KCJtYWdzQnlUaXRsZSIpOworcS5zZXRQYXJhbWV0ZXIoInRpdGxlUGFyYW0iLCAiSkRKIik7CitMaXN0Jmx0O01hZ2F6aW5lJmd0OyByZXN1bHRzID0gKExpc3QmbHQ7TWFnYXppbmUmZ3Q7KSBxLmdldFJlc3VsdExpc3QoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld19xdWVyeV9kZWxldGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERlbGV0ZSBCeSBRdWVyeQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorUXVlcmllcyBhcmUgdXNlZnVsIG5vdCBvbmx5IGZvciBmaW5kaW5nIG9iamVjdHMsIGJ1dCBmb3IgZWZmaWNpZW50bHkgZGVsZXRpbmcKK3RoZW0gYXMgd2VsbC4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBkZWxldGUgYWxsIHJlY29yZHMgY3JlYXRlZCBiZWZvcmUgYSBjZXJ0YWluCitkYXRlLiBSYXRoZXIgdGhhbiBicmluZyB0aGVzZSBvYmplY3RzIGludG8gbWVtb3J5IGFuZCBkZWxldGUgdGhlbSBpbmRpdmlkdWFsbHksCitKUEEgYWxsb3dzIHlvdSB0byBwZXJmb3JtIGEgc2luZ2xlIGJ1bGsgZGVsZXRlIGJhc2VkIG9uIEpQUUwgY3JpdGVyaWEuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0RlbGV0ZSBieSBxdWVyeSB1c2VzIHRoZSBzYW1lIEpQUUwgc3ludGF4IGFzIG5vcm1hbCBxdWVyaWVzLCB3aXRoIG9uZSBleGNlcHRpb246CitiZWdpbiB5b3VyIHF1ZXJ5IHN0cmluZyB3aXRoIHRoZSA8bGl0ZXJhbD5kZWxldGU8L2xpdGVyYWw+IGtleXdvcmQgaW5zdGVhZCBvZgordGhlIDxsaXRlcmFsPnNlbGVjdDwvbGl0ZXJhbD4ga2V5d29yZC4gVG8gdGhlbiBleGVjdXRlIHRoZSBkZWxldGUsIHlvdSBjYWxsIHRoZQorZm9sbG93aW5nIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gbWV0aG9kOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIGludCBleGVjdXRlVXBkYXRlKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBkZWxldGVkLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVsZXRlcworYWxsIHN1YnNjcmlwdGlvbnMgd2hvc2UgZXhwaXJhdGlvbiBkYXRlIGhhcyBwYXNzZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X2RlbGV0ZWV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBieSBRdWVyeQorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoIkRFTEVURSBGUk9NIFN1YnNjcmlwdGlvbiBzIFdIRVJFIHMuc3Vic2NyaXB0aW9uRGF0ZSAmbHQ7IDp0b2RheSIpOworcS5zZXRQYXJhbWV0ZXIoInRvZGF5IiwgbmV3IERhdGUoKSk7CitpbnQgZGVsZXRlZCA9IHEuZXhlY3V0ZVVwZGF0ZSgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3F1ZXJ5X3VwZGF0ZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgVXBkYXRlIEJ5IFF1ZXJ5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitTaW1pbGFyIHRvIGJ1bGsgZGVsZXRlcywgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHVwZGF0ZXMgYWdhaW5zdCBhCitsYXJnZSBudW1iZXIgb2YgcXVlcmllcyBpbiBhIHNpbmdsZSBvcGVyYXRpb24sIHdpdGhvdXQgaGF2aW5nIHRvIGJyaW5nIGFsbCB0aGUKK2luc3RhbmNlcyBkb3duIHRvIHRoZSBjbGllbnQuIFJhdGhlciB0aGFuIGJyaW5nIHRoZXNlIG9iamVjdHMgaW50byBtZW1vcnkgYW5kCittb2RpZnlpbmcgdGhlbSBpbmRpdmlkdWFsbHksIEpQQSBhbGxvd3MgeW91IHRvIHBlcmZvcm0gYSBzaW5nbGUgYnVsayB1cGRhdGUKK2Jhc2VkIG9uIEpQUUwgY3JpdGVyaWEuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1VwZGF0ZSBieSBxdWVyeSB1c2VzIHRoZSBzYW1lIEpQUUwgc3ludGF4IGFzIG5vcm1hbCBxdWVyaWVzLCBleGNlcHQgdGhhdCB0aGUKK3F1ZXJ5IHN0cmluZyBiZWdpbnMgd2l0aCB0aGUgPGxpdGVyYWw+dXBkYXRlPC9saXRlcmFsPiBrZXl3b3JkIGluc3RlYWQgb2YKKzxsaXRlcmFsPnNlbGVjdDwvbGl0ZXJhbD4uIFRvIGV4ZWN1dGUgdGhlIHVwZGF0ZSwgeW91IGNhbGwgdGhlIGZvbGxvd2luZworPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiBtZXRob2Q6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBvYmplY3RzIHVwZGF0ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1cGRhdGVzCithbGwgc3Vic2NyaXB0aW9ucyB3aG9zZSBleHBpcmF0aW9uIGRhdGUgaGFzIHBhc3NlZCB0byBoYXZlIHRoZSAicGFpZCIgZmllbGQgc2V0Cit0byB0cnVlLi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfcXVlcnlfdXBkYXRlZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlIGJ5IFF1ZXJ5CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgiVVBEQVRFIFN1YnNjcmlwdGlvbiBzIFNFVCBzLnBhaWQgPSA6cGFpZCBXSEVSRSBzLnN1YnNjcmlwdGlvbkRhdGUgJmx0OyA6dG9kYXkiKTsKK3Euc2V0UGFyYW1ldGVyKCJ0b2RheSIsIG5ldyBEYXRlKCkpOworcS5zZXRQYXJhbWV0ZXIoInBhaWQiLCB0cnVlKTsKK2ludCB1cGRhdGVkID0gcS5leGVjdXRlVXBkYXRlKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZiI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEpQUUwgTGFuZ3VhZ2UgUmVmZXJlbmNlCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhlIEphdmEgUGVyc2lzdGVuY2UgUXVlcnkgTGFuZ3VhZ2UgKEpQUUwpIGlzIHVzZWQgdG8gZGVmaW5lIHNlYXJjaGVzIGFnYWluc3QKK3BlcnNpc3RlbnQgZW50aXRpZXMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHN0b3JlIHRob3NlIGVudGl0aWVzLgorQXMgc3VjaCwgSlBRTCBpcyAicG9ydGFibGUiLCBhbmQgbm90IGNvbnN0cmFpbmVkIHRvIGFueSBwYXJ0aWN1bGFyIGRhdGEgc3RvcmUuCitUaGUgSmF2YSBQZXJzaXN0ZW5jZSBxdWVyeSBsYW5ndWFnZSBpcyBhbiBleHRlbnNpb24gb2YgdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zCitxdWVyeSBsYW5ndWFnZSwgPGxpdGVyYWw+RUpCIFFMPC9saXRlcmFsPiwgYWRkaW5nIG9wZXJhdGlvbnMgc3VjaCBhcyBidWxrCitkZWxldGVzIGFuZCB1cGRhdGVzLCBqb2luIG9wZXJhdGlvbnMsIGFnZ3JlZ2F0ZXMsIHByb2plY3Rpb25zLCBhbmQgc3VicXVlcmllcy4KK0Z1cnRoZXJtb3JlLCBKUFFMIHF1ZXJpZXMgY2FuIGJlIGRlY2xhcmVkIHN0YXRpY2FsbHkgaW4gbWV0YWRhdGEsIG9yIGNhbiBiZQorZHluYW1pY2FsbHkgYnVpbHQgaW4gY29kZS4gVGhpcyBjaGFwdGVyIHByb3ZpZGVzIHRoZSBmdWxsIGRlZmluaXRpb24gb2YgdGhlCitsYW5ndWFnZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPiAKK011Y2ggb2YgdGhpcyBzZWN0aW9uIGlzIHBhcmFwaHJhc2VkIG9yIHRha2VuIGRpcmVjdGx5IGZyb20gQ2hhcHRlciA0IG9mIHRoZSAKK0pTUiAyMjAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfc3RtbnR0eXBlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSlBRTCBTdGF0ZW1lbnQgVHlwZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0EgSlBRTCBzdGF0ZW1lbnQgbWF5IGJlIGVpdGhlciBhIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gc3RhdGVtZW50LCBhbgorPGxpdGVyYWw+VVBEQVRFPC9saXRlcmFsPiBzdGF0ZW1lbnQsIG9yIGEgPGxpdGVyYWw+REVMRVRFPC9saXRlcmFsPiBzdGF0ZW1lbnQuCitUaGlzIGNoYXB0ZXIgcmVmZXJzIHRvIGFsbCBzdWNoIHN0YXRlbWVudHMgYXMgInF1ZXJpZXMiLiBXaGVyZSBpdCBpcyBpbXBvcnRhbnQKK3RvIGRpc3Rpbmd1aXNoIGFtb25nIHN0YXRlbWVudCB0eXBlcywgdGhlIHNwZWNpZmljIHN0YXRlbWVudCB0eXBlIGlzIHJlZmVyZW5jZWQuCitJbiBCTkYgc3ludGF4LCBhIHF1ZXJ5IGxhbmd1YWdlIHN0YXRlbWVudCBpcyBkZWZpbmVkIGFzOiAKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1FMX3N0YXRlbWVudCA6Oj0gc2VsZWN0X3N0YXRlbWVudCB8IHVwZGF0ZV9zdGF0ZW1lbnQgfCBkZWxldGVfc3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4gCitUaGUgY29tcGxldGUgQk5GIGZvciBKUFFMIGlzIGRlZmluZWQgaW4gPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfYm5mIi8+LgorQW55IEpQUUwgc3RhdGVtZW50IG1heSBiZSBjb25zdHJ1Y3RlZCBkeW5hbWljYWxseSBvciBtYXkgYmUgc3RhdGljYWxseSBkZWZpbmVkIAoraW4gYSBtZXRhZGF0YSBhbm5vdGF0aW9uIG9yIFhNTCBkZXNjcmlwdG9yIGVsZW1lbnQuIEFsbCBzdGF0ZW1lbnQgdHlwZXMgbWF5IAoraGF2ZSBwYXJhbWV0ZXJzLCBhcyBkaXNjdXNzZWQgaW4gPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfaW5wdXRfcGFyYW1zIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX3NlbGVjdCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIFNlbGVjdCBTdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQSBzZWxlY3Qgc3RhdGVtZW50IGlzIGEgc3RyaW5nIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgY2xhdXNlczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+IAorYSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGNsYXVzZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0cyAKK29yIHZhbHVlcyB0byBiZSBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CithIDxsaXRlcmFsPkZST008L2xpdGVyYWw+IGNsYXVzZSwgd2hpY2ggcHJvdmlkZXMgZGVjbGFyYXRpb25zIHRoYXQgZGVzaWduYXRlIHRoZQorZG9tYWluIHRvIHdoaWNoIHRoZSBleHByZXNzaW9ucyBzcGVjaWZpZWQgaW4gdGhlIG90aGVyIGNsYXVzZXMgb2YgdGhlIHF1ZXJ5CithcHBseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CithbiBvcHRpb25hbCA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXN0cmljdCB0aGUKK3Jlc3VsdHMgdGhhdCBhcmUgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2FuIG9wdGlvbmFsIDxsaXRlcmFsPkdST1VQIEJZPC9saXRlcmFsPiBjbGF1c2UsIHdoaWNoIGFsbG93cyBxdWVyeSByZXN1bHRzIHRvIGJlCithZ2dyZWdhdGVkIGluIHRlcm1zIG9mIGdyb3Vwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CithbiBvcHRpb25hbCA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+IGNsYXVzZSwgd2hpY2ggYWxsb3dzIGZpbHRlcmluZyBvdmVyCithZ2dyZWdhdGVkIGdyb3Vwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CithbiBvcHRpb25hbCA8bGl0ZXJhbD5PUkRFUiBCWTwvbGl0ZXJhbD4gY2xhdXNlLCB3aGljaCBtYXkgYmUgdXNlZCB0byBvcmRlciB0aGUKK3Jlc3VsdHMgdGhhdCBhcmUgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorSW4gQk5GIHN5bnRheCwgYSBzZWxlY3Qgc3RhdGVtZW50IGlzIGRlZmluZWQgYXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2VsZWN0X3N0YXRlbWVudCA6Oj0gc2VsZWN0X2NsYXVzZSBmcm9tX2NsYXVzZSBbd2hlcmVfY2xhdXNlXSBbZ3JvdXBieV9jbGF1c2VdCitbaGF2aW5nX2NsYXVzZV0gW29yZGVyYnlfY2xhdXNlXQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPiAgICAKK0Egc2VsZWN0IHN0YXRlbWVudCBtdXN0IGFsd2F5cyBoYXZlIGEgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBhbmQgYSAKKzxsaXRlcmFsPkZST008L2xpdGVyYWw+IGNsYXVzZS4gVGhlIHNxdWFyZSBicmFja2V0cyBbXSBpbmRpY2F0ZSB0aGF0IHRoZSBvdGhlciAKK2NsYXVzZXMgYXJlIG9wdGlvbmFsLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9idWxrIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgVXBkYXRlIGFuZCBEZWxldGUgU3RhdGVtZW50cworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitVcGRhdGUgYW5kIGRlbGV0ZSBzdGF0ZW1lbnRzIHByb3ZpZGUgYnVsayBvcGVyYXRpb25zIG92ZXIgc2V0cyBvZiBlbnRpdGllcy4gSW4KK0JORiBzeW50YXgsIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgYXM6IAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3VwZGF0ZV9zdGF0ZW1lbnQgOjo9IHVwZGF0ZV9jbGF1c2UgW3doZXJlX2NsYXVzZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitkZWxldGVfc3RhdGVtZW50IDo6PSBkZWxldGVfY2xhdXNlIFt3aGVyZV9jbGF1c2VdCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+IAorVGhlIHVwZGF0ZSBhbmQgZGVsZXRlIGNsYXVzZXMgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBlbnRpdGllcyB0byBiZSB1cGRhdGVkIAorb3IgZGVsZXRlZC4gIFRoZSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIG1heSBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSAKK3Njb3BlIG9mIHRoZSB1cGRhdGUgb3IgZGVsZXRlIG9wZXJhdGlvbi4gVXBkYXRlIGFuZCBkZWxldGUgc3RhdGVtZW50cyBhcmUgCitkZXNjcmliZWQgZnVydGhlciBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfbGFuZ3JlZl9idWxrX29wcyIvPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX3NjaGVtYXR5cGVzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBKUFFMIEFic3RyYWN0IFNjaGVtYSBUeXBlcyBhbmQgUXVlcnkgRG9tYWlucworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkgbGFuZ3VhZ2UgaXMgYSB0eXBlZCBsYW5ndWFnZSwgYW5kIGV2ZXJ5IGV4cHJlc3Npb24KK2hhcyBhIHR5cGUuIFRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCitleHByZXNzaW9uLCB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGVzIG9mIHRoZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZQorZGVjbGFyYXRpb25zLCB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIHBlcnNpc3RlbnQgZmllbGRzIGFuZCByZWxhdGlvbnNoaXBzCitldmFsdWF0ZSwgYW5kIHRoZSB0eXBlcyBvZiBsaXRlcmFscy4gVGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBpcworZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgY2xhc3MgYW5kIHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBKYXZhCitsYW5ndWFnZSBhbm5vdGF0aW9ucyBvciBpbiB0aGUgWE1MIGRlc2NyaXB0b3IuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0luZm9ybWFsbHksIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMKK2ZvbGxvd3M6IAorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiAKK0ZvciBldmVyeSBwZXJzaXN0ZW50IGZpZWxkIG9yIGdldAorYWNjZXNzb3IgbWV0aG9kIChmb3IgYSBwZXJzaXN0ZW50IHByb3BlcnR5KSBvZiB0aGUgZW50aXR5IGNsYXNzLCB0aGVyZSBpcyBhCitmaWVsZCAoInN0YXRlLWZpZWxkIikgd2hvc2UgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhhdCBvZiB0aGUKK2ZpZWxkIG9yIHRoZSByZXN1bHQgdHlwZSBvZiB0aGUgYWNjZXNzb3IgbWV0aG9kLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRm9yIGV2ZXJ5IHBlcnNpc3RlbnQgcmVsYXRpb25zaGlwIGZpZWxkIG9yIGdldCBhY2Nlc3NvciBtZXRob2QgKGZvciBhIHBlcnNpc3RlbnQKK3JlbGF0aW9uc2hpcCBwcm9wZXJ0eSkgb2YgdGhlIGVudGl0eSBjbGFzcywgdGhlcmUgaXMgYSBmaWVsZAorKCJhc3NvY2lhdGlvbi1maWVsZCIpIHdob3NlIHR5cGUgaXMgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIHRoZSByZWxhdGVkCitlbnRpdHkgKG9yLCBpZiB0aGUgcmVsYXRpb25zaGlwIGlzIGEgb25lLXRvLW1hbnkgb3IgbWFueS10by1tYW55LCBhIGNvbGxlY3Rpb24KK29mIHN1Y2gpLiBBYnN0cmFjdCBzY2hlbWEgdHlwZXMgYXJlIHNwZWNpZmljIHRvIHRoZSBxdWVyeSBsYW5ndWFnZSBkYXRhIG1vZGVsLgorVGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGlzIG5vdCByZXF1aXJlZCB0byBpbXBsZW1lbnQgb3Igb3RoZXJ3aXNlIG1hdGVyaWFsaXplCithbiBhYnN0cmFjdCBzY2hlbWEgdHlwZS4gVGhlIGRvbWFpbiBvZiBhIHF1ZXJ5IGNvbnNpc3RzIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEKK3R5cGVzIG9mIGFsbCBlbnRpdGllcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuIFRoZSBkb21haW4KK29mIGEgcXVlcnkgbWF5IGJlIHJlc3RyaWN0ZWQgYnkgdGhlIG5hdmlnYWJpbGl0eSBvZiB0aGUgcmVsYXRpb25zaGlwcyBvZiB0aGUKK2VudGl0eSBvbiB3aGljaCBpdCBpcyBiYXNlZC4gVGhlIGFzc29jaWF0aW9uLWZpZWxkcyBvZiBhbiBlbnRpdHkncyBhYnN0cmFjdAorc2NoZW1hIHR5cGUgZGV0ZXJtaW5lIG5hdmlnYWJpbGl0eS4gVXNpbmcgdGhlIGFzc29jaWF0aW9uLWZpZWxkcyBhbmQgdGhlaXIKK3ZhbHVlcywgYSBxdWVyeSBjYW4gc2VsZWN0IHJlbGF0ZWQgZW50aXRpZXMgYW5kIHVzZSB0aGVpciBhYnN0cmFjdCBzY2hlbWEgdHlwZXMKK2luIHRoZSBxdWVyeS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9zY2hlbWFuYW1pbmciPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBFbnRpdHkgTmFtaW5nCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0VudGl0aWVzIGFyZSBkZXNpZ25hdGVkIGluIHF1ZXJ5IHN0cmluZ3MgYnkgdGhlaXIgZW50aXR5IG5hbWVzLiBUaGUgZW50aXR5IG5hbWUKK2lzIGRlZmluZWQgYnkgdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgRW50aXR5IGFubm90YXRpb24gKG9yIHRoZSBlbnRpdHktbmFtZSBYTUwKK2Rlc2NyaXB0b3IgZWxlbWVudCksIGFuZCBkZWZhdWx0cyB0byB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50aXR5IGNsYXNzLgorRW50aXR5IG5hbWVzIGFyZSBzY29wZWQgd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KK3RoZSBwZXJzaXN0ZW5jZSB1bml0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9zY2hlbWFleGFtcGxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgU2NoZW1hIEV4YW1wbGUKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBleGFtcGxlIGFzc3VtZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHByb3ZpZGVzIHNldmVyYWwgZW50aXR5CitjbGFzc2VzLCByZXByZXNlbnRpbmcgbWFnYXppbmVzLCBwdWJsaXNoZXJzLCBhdXRob3JzLCBhbmQgYXJ0aWNsZXMuIFRoZSBhYnN0cmFjdAorc2NoZW1hIHR5cGVzIGZvciB0aGVzZSBlbnRpdGllcyBhcmUgPGxpdGVyYWw+TWFnYXppbmU8L2xpdGVyYWw+LCA8bGl0ZXJhbD4KK1B1Ymxpc2hlcjwvbGl0ZXJhbD4sIDxsaXRlcmFsPkF1dGhvcjwvbGl0ZXJhbD4sIGFuZCA8bGl0ZXJhbD5BcnRpY2xlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitTZXZlcmFsIEVudGl0aWVzIHdpdGggQWJzdHJhY3QgUGVyc2lzdGVuY2UgU2NoZW1hcyBEZWZpbmVkIGluIHRoZSBTYW1lCitQZXJzaXN0ZW5jZSBVbml0LiBUaGUgZW50aXR5IDxsaXRlcmFsPlB1Ymxpc2hlcjwvbGl0ZXJhbD4gaGFzIGEgb25lLXRvLW1hbnkKK3JlbGF0aW9uc2hpcHMgd2l0aCA8bGl0ZXJhbD5NYWdhemluZTwvbGl0ZXJhbD4uIFRoZXJlIGlzIGFsc28gYSBvbmUtdG8tbWFueQorcmVsYXRpb25zaGlwIGJldHdlZW4gPGxpdGVyYWw+TWFnYXppbmU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5BcnRpY2xlPC9saXRlcmFsPgorLiBUaGUgZW50aXR5IDxsaXRlcmFsPkFydGljbGU8L2xpdGVyYWw+IGlzIHJlbGF0ZWQgdG8gPGxpdGVyYWw+QXV0aG9yPC9saXRlcmFsPgoraW4gYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitRdWVyaWVzIHRvIHNlbGVjdCBtYWdhemluZXMgY2FuIGJlIGRlZmluZWQgYnkgbmF2aWdhdGluZyBvdmVyIHRoZQorYXNzb2NpYXRpb24tZmllbGRzIGFuZCBzdGF0ZS1maWVsZHMgZGVmaW5lZCBieSBNYWdhemluZSBhbmQgQXV0aG9yLiBBIHF1ZXJ5IHRvCitmaW5kIGFsbCBtYWdhemluZXMgdGhhdCBoYXZlIHVucHVibGlzaGVkIGFydGljbGVzIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIERJU1RJTkNUIG1hZyBGUk9NIE1hZ2F6aW5lIEFTIG1hZyBKT0lOIG1hZy5hcnRpY2xlcyBBUyBhcnQgV0hFUkUgYXJ0LnB1Ymxpc2hlZCA9IEZBTFNFCis8L3Byb2dyYW1saXN0aW5nPiAKKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgcXVlcnkgbmF2aWdhdGVzIG92ZXIgdGhlIGFzc29jaWF0aW9uLWZpZWxkIGF1dGhvcnMgb2YgdGhlCithYnN0cmFjdCBzY2hlbWEgdHlwZSA8bGl0ZXJhbD5NYWdhemluZTwvbGl0ZXJhbD4gdG8gZmluZCBhcnRpY2xlcywgYW5kIHVzZXMgdGhlCitzdGF0ZS1maWVsZCA8bGl0ZXJhbD5wdWJsaXNoZWQ8L2xpdGVyYWw+IG9mIDxsaXRlcmFsPkFydGljbGU8L2xpdGVyYWw+IHRvIHNlbGVjdAordGhvc2UgbWFnYXppbmVzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgYXJ0aWNsZSB0aGF0IGlzIHB1Ymxpc2hlZC4gQWx0aG91Z2gKK3ByZWRlZmluZWQgcmVzZXJ2ZWQgaWRlbnRpZmllcnMsIHN1Y2ggYXMgPGxpdGVyYWw+RElTVElOQ1Q8L2xpdGVyYWw+LCA8bGl0ZXJhbD4KK0ZST008L2xpdGVyYWw+LCA8bGl0ZXJhbD5BUzwvbGl0ZXJhbD4sIDxsaXRlcmFsPkpPSU48L2xpdGVyYWw+LCA8bGl0ZXJhbD4KK1dIRVJFPC9saXRlcmFsPiwgYW5kIDxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPiBhcHBlYXIgaW4gdXBwZXIgY2FzZSBpbiB0aGlzIAorZXhhbXBsZSwgcHJlZGVmaW5lZCByZXNlcnZlZCBpZGVudGlmaWVycyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gVGhlIDxsaXRlcmFsPgorU0VMRUNUPC9saXRlcmFsPiBjbGF1c2Ugb2YgdGhpcyBleGFtcGxlIGRlc2lnbmF0ZXMgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgCitxdWVyeSB0byBiZSBvZiB0eXBlIE1hZ2F6aW5lLiBCZWNhdXNlIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lcyB0aGUgCithYnN0cmFjdCBwZXJzaXN0ZW5jZSBzY2hlbWFzIG9mIHRoZSByZWxhdGVkIGVudGl0aWVzLCB0aGUgZGV2ZWxvcGVyIGNhbiBhbHNvIAorc3BlY2lmeSBhIHF1ZXJ5IG92ZXIgPGxpdGVyYWw+YXJ0aWNsZXM8L2xpdGVyYWw+IHRoYXQgdXRpbGl6ZXMgdGhlIGFic3RyYWN0IAorc2NoZW1hIHR5cGUgZm9yIHByb2R1Y3RzLCBhbmQgaGVuY2UgdGhlIHN0YXRlLWZpZWxkcyBhbmQgYXNzb2NpYXRpb24tZmllbGRzIG9mIAorYm90aCB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGVzIE1hZ2F6aW5lIGFuZCBBdXRob3IuIEZvciBleGFtcGxlLCBpZiB0aGUgCithYnN0cmFjdCBzY2hlbWEgdHlwZSBBdXRob3IgaGFzIGEgc3RhdGUtZmllbGQgbmFtZWQgZmlyc3ROYW1lLCBhIHF1ZXJ5IG92ZXIgCithcnRpY2xlcyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoaXMgc3RhdGUtZmllbGQuIFN1Y2ggYSBxdWVyeSBtaWdodCBiZSB0byAKK2ZpbmQgYWxsIG1hZ2F6aW5lcyB0aGF0IGhhdmUgYXJ0aWNsZXMgYXV0aG9yZWQgYnkgc29tZW9uZSB3aXRoIHRoZSBmaXJzdCBuYW1lIAorIkpvaG4iLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCBESVNUSU5DVCBtYWcgRlJPTSBNYWdhemluZSBtYWcgSk9JTiBtYWcuYXJ0aWNsZXMgYXJ0IEpPSU4gYXJ0LmF1dGhvciBhdXRoIFdIRVJFIGF1dGguZmlyc3ROYW1lID0gJ0pvaG4nCis8L3Byb2dyYW1saXN0aW5nPiAKKyAgICAgICAgICAgICAgICA8cGFyYT4KK0JlY2F1c2UgTWFnYXppbmUgaXMgcmVsYXRlZCB0byBBdXRob3IgYnkgbWVhbnMgb2YgdGhlCityZWxhdGlvbnNoaXBzIGJldHdlZW4gTWFnYXppbmUgYW5kIEFydGljbGUgYW5kIGJldHdlZW4gQXJ0aWNsZSBhbmQgQXV0aG9yLAorbmF2aWdhdGlvbiB1c2luZyB0aGUgYXNzb2NpYXRpb24tZmllbGRzIGF1dGhvcnMgYW5kIHByb2R1Y3QgaXMgdXNlZCB0byBleHByZXNzCit0aGUgcXVlcnkuIFRoaXMgcXVlcnkgaXMgc3BlY2lmaWVkIGJ5IHVzaW5nIHRoZSBhYnN0cmFjdCBzY2hlbWEgbmFtZSBNYWdhemluZSwKK3doaWNoIGRlc2lnbmF0ZXMgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG92ZXIgd2hpY2ggdGhlIHF1ZXJ5IHJhbmdlcy4gVGhlIGJhc2lzCitmb3IgdGhlIG5hdmlnYXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlIGFzc29jaWF0aW9uLWZpZWxkcyBhdXRob3JzIGFuZCBwcm9kdWN0IG9mCit0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGVzIE1hZ2F6aW5lIGFuZCBBcnRpY2xlIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2Zyb21jbGF1c2UiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEpQUUwgRlJPTSBDbGF1c2UgYW5kIE5hdmlnYXRpb25hbCBEZWNsYXJhdGlvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBjbGF1c2Ugb2YgYSBxdWVyeSBkZWZpbmVzIHRoZSBkb21haW4gb2YgdGhlIHF1ZXJ5IGJ5CitkZWNsYXJpbmcgaWRlbnRpZmljYXRpb24gdmFyaWFibGVzLiBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBpcyBhbiBpZGVudGlmaWVyCitkZWNsYXJlZCBpbiB0aGUgPGxpdGVyYWw+RlJPTTwvbGl0ZXJhbD4gY2xhdXNlIG9mIGEgcXVlcnkuIFRoZSBkb21haW4gb2YgdGhlCitxdWVyeSBtYXkgYmUgY29uc3RyYWluZWQgYnkgcGF0aCBleHByZXNzaW9ucy4gSWRlbnRpZmljYXRpb24gdmFyaWFibGVzIGRlc2lnbmF0ZQoraW5zdGFuY2VzIG9mIGEgcGFydGljdWxhciBlbnRpdHkgYWJzdHJhY3Qgc2NoZW1hIHR5cGUuIFRoZSA8bGl0ZXJhbD5GUk9NCis8L2xpdGVyYWw+IGNsYXVzZSBjYW4gY29udGFpbiBtdWx0aXBsZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKK3NlcGFyYXRlZCBieSBhIGNvbW1hICgsKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2Zyb21fY2xhdXNlIDo6PSBGUk9NIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIHssIAore2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIHwgY29sbGVjdGlvbl9tZW1iZXJfZGVjbGFyYXRpb259fSoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIDo6PSByYW5nZV92YXJpYWJsZV9kZWNsYXJhdGlvbiB7IGpvaW4gfAorZmV0Y2hfam9pbiB9KgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorcmFuZ2VfdmFyaWFibGVfZGVjbGFyYXRpb24gOjo9IGFic3RyYWN0X3NjaGVtYV9uYW1lIFtBU10gaWRlbnRpZmljYXRpb25fdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2pvaW4gOjo9IGpvaW5fc3BlYyBqb2luX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbiBbQVNdIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitmZXRjaF9qb2luIDo6PSBqb2luX3NwZWMgRkVUQ0ggam9pbl9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2pvaW5fYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIDo6PSBqb2luX2NvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8Citqb2luX3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citqb2luX3NwZWMgOjo9IFsgTEVGVCBbT1VURVJdIHwgSU5ORVIgXSBKT0lOCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29sbGVjdGlvbl9tZW1iZXJfZGVjbGFyYXRpb24gOjo9IElOIChjb2xsZWN0aW9uX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24pIFtBU10KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfZnJvbV9pZGVudGlmaWVycyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEZST00gSWRlbnRpZmllcnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQW4gaWRlbnRpZmllciBpcyBhIGNoYXJhY3RlciBzZXF1ZW5jZSBvZiB1bmxpbWl0ZWQgbGVuZ3RoLiBUaGUgY2hhcmFjdGVyCitzZXF1ZW5jZSBtdXN0IGJlZ2luIHdpdGggYSBKYXZhIGlkZW50aWZpZXIgc3RhcnQgY2hhcmFjdGVyLCBhbmQgYWxsIG90aGVyCitjaGFyYWN0ZXJzIG11c3QgYmUgSmF2YSBpZGVudGlmaWVyIHBhcnQgY2hhcmFjdGVycy4gQW4gaWRlbnRpZmllciBzdGFydAorY2hhcmFjdGVyIGlzIGFueSBjaGFyYWN0ZXIgZm9yIHdoaWNoIHRoZSBtZXRob2QgPG1ldGhvZG5hbWU+CitDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0PC9tZXRob2RuYW1lPiByZXR1cm5zIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorVGhpcyBpbmNsdWRlcyB0aGUgdW5kZXJzY29yZSAoXykgY2hhcmFjdGVyIGFuZCB0aGUgZG9sbGFyIHNpZ24gKCQpIGNoYXJhY3Rlci4gQW4KK2lkZW50aWZpZXIgcGFydCBjaGFyYWN0ZXIgaXMgYW55IGNoYXJhY3RlciBmb3Igd2hpY2ggdGhlIG1ldGhvZCA8bWV0aG9kbmFtZT4KK0NoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydDwvbWV0aG9kbmFtZT4gcmV0dXJucyA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KK1RoZSBxdWVzdGlvbiBtYXJrICg/KSBjaGFyYWN0ZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgSmF2YSBQZXJzaXN0ZW5jZQorcXVlcnkgbGFuZ3VhZ2UuIFRoZSBmb2xsb3dpbmcgYXJlIHJlc2VydmVkIGlkZW50aWZpZXJzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPldIRVJFPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlVQREFURTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ERUxFVEU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Sk9JTjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5PVVRFUjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5JTk5FUjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5MRUZUPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkdST1VQPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkJZPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkhBVklORzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5GRVRDSDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ESVNUSU5DVDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5PQkpFQ1Q8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5UUlVFPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5BTkQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+T1I8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QkVUV0VFTjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5MSUtFPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPklOPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkFTPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlVOS05PV048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RU1QVFk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk9GPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPklTPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkFWRzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+TUFYPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5NSU48L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlNVTTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q09VTlQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk9SREVSPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5CWTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QVNDPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ERVNDPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5NT0Q8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlVQUEVSPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5MT1dFUjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+VFJJTTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+UE9TSVRJT048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNIQVJBQ1RFUl9MRU5HVEg8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNIQVJfTEVOR1RIPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5CSVRfTEVOR1RIPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DVVJSRU5UX1RJTUU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNVUlJFTlRfREFURTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q1VSUkVOVF9USU1FU1RBTVA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk5FVzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RVhJU1RTPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5BTEw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkFOWTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U09NRTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4gICAgCitSZXNlcnZlZCBpZGVudGlmaWVycyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gUmVzZXJ2ZWQgaWRlbnRpZmllcnMgbXVzdCBub3QgYmUgCit1c2VkIGFzIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlcy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBvdGhlciBTUUwgcmVzZXJ2ZWQgCit3b3JkcyBhbHNvIG5vdCBiZSBhcyBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMgaW4gcXVlcmllcyBiZWNhdXNlIHRoZXkgbWF5IGJlIAordXNlZCBhcyByZXNlcnZlZCBpZGVudGlmaWVycyBpbiBmdXR1cmUgcmVsZWFzZXMgb2YgdGhlIHNwZWNpZmljYXRpb24uICAKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfZnJvbV92YXJzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgSWRlbnRpZmljYXRpb24gVmFyaWFibGVzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIGlzIGEgdmFsaWQgaWRlbnRpZmllciBkZWNsYXJlZCBpbiB0aGUgPGxpdGVyYWw+RlJPTQorPC9saXRlcmFsPiBjbGF1c2Ugb2YgYSBxdWVyeS4gQWxsIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIGluCit0aGUgPGxpdGVyYWw+RlJPTTwvbGl0ZXJhbD4gY2xhdXNlLiBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMgY2Fubm90IGJlIGRlY2xhcmVkCitpbiBvdGhlciBjbGF1c2VzLiBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBtdXN0IG5vdCBiZSBhIHJlc2VydmVkIGlkZW50aWZpZXIKK29yIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhbnkgZW50aXR5IGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQ6IElkZW50aWZpY2F0aW9uCit2YXJpYWJsZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuIEFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIGV2YWx1YXRlcyB0byBhIHZhbHVlCitvZiB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiB1c2VkIGluIGRlY2xhcmluZyB0aGUgdmFyaWFibGUuIEZvciBleGFtcGxlLAorY29uc2lkZXIgdGhlIHByZXZpb3VzIHF1ZXJ5OiA8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIERJU1RJTkNUIG1hZyBGUk9NIE1hZ2F6aW5lIG1hZyBKT0lOIG1hZy5hcnRpY2xlcyBhcnQgSk9JTiBhcnQuYXV0aG9yIGF1dGggV0hFUkUgYXV0aC5maXJzdE5hbWUgPSAnSm9obicKKzwvcHJvZ3JhbWxpc3Rpbmc+IEluIHRoZSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBjbGF1c2UgZGVjbGFyYXRpb24gPGxpdGVyYWw+CittYWcuYXJ0aWNsZXM8L2xpdGVyYWw+PGxpdGVyYWw+YXJ0PC9saXRlcmFsPiwgdGhlIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlCis8bGl0ZXJhbD5hcnQ8L2xpdGVyYWw+IGV2YWx1YXRlcyB0byBhbnkgPGxpdGVyYWw+QXJ0aWNsZTwvbGl0ZXJhbD4gdmFsdWUKK2RpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIDxsaXRlcmFsPk1hZ2F6aW5lPC9saXRlcmFsPi4gVGhlIGFzc29jaWF0aW9uLWZpZWxkCis8bGl0ZXJhbD5hcnRpY2xlczwvbGl0ZXJhbD4gaXMgYSBjb2xsZWN0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hCit0eXBlIDxsaXRlcmFsPkFydGljbGU8L2xpdGVyYWw+IGFuZCB0aGUgaWRlbnRpZmljYXRpb24gdmFyaWFibGUgPGxpdGVyYWw+YXJ0Cis8L2xpdGVyYWw+IHJlZmVycyB0byBhbiBlbGVtZW50IG9mIHRoaXMgY29sbGVjdGlvbi4gVGhlIHR5cGUgb2YgPGxpdGVyYWw+YXV0aAorPC9saXRlcmFsPiBpcyB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgPGxpdGVyYWw+QXV0aG9yPC9saXRlcmFsPi4gQW4KK2lkZW50aWZpY2F0aW9uIHZhcmlhYmxlIHJhbmdlcyBvdmVyIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkuIEFuCitpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBkZXNpZ25hdGVzIGFuIGluc3RhbmNlIG9mIGFuIGVudGl0eSBhYnN0cmFjdCBzY2hlbWEgdHlwZQorb3IgYW4gZWxlbWVudCBvZiBhIGNvbGxlY3Rpb24gb2YgZW50aXR5IGFic3RyYWN0IHNjaGVtYSB0eXBlIGluc3RhbmNlcy4KK0lkZW50aWZpY2F0aW9uIHZhcmlhYmxlcyBhcmUgZXhpc3RlbnRpYWxseSBxdWFudGlmaWVkIGluIGEgcXVlcnkuIEFuCitpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBhbHdheXMgZGVzaWduYXRlcyBhIHJlZmVyZW5jZSB0byBhIHNpbmdsZSB2YWx1ZS4gSXQgaXMKK2RlY2xhcmVkIGluIG9uZSBvZiB0aHJlZSB3YXlzOiBpbiBhIHJhbmdlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLCBpbiBhIGpvaW4KK2NsYXVzZSwgb3IgaW4gYSBjb2xsZWN0aW9uIG1lbWJlciBkZWNsYXJhdGlvbi4gVGhlIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlCitkZWNsYXJhdGlvbnMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgaW4gdGhlIDxsaXRlcmFsPkZST008L2xpdGVyYWw+CitjbGF1c2UsIGFuZCBhbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBjYW4gdXNlIHRoZSByZXN1bHQgb2YgYQorcHJlY2VkaW5nIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIHRoZSBxdWVyeSBzdHJpbmcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX3JhbmdlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgUmFuZ2UgRGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzeW50YXggZm9yIGRlY2xhcmluZyBhbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBhcyBhIHJhbmdlIHZhcmlhYmxlIGlzCitzaW1pbGFyIHRvIHRoYXQgb2YgU1FMOyBvcHRpb25hbGx5LCBpdCB1c2VzIHRoZSBBUyBrZXl3b3JkLiAKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CityYW5nZV92YXJpYWJsZV9kZWNsYXJhdGlvbiA6Oj0gYWJzdHJhY3Rfc2NoZW1hX25hbWUgW0FTXQoraWRlbnRpZmljYXRpb25fdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1JhbmdlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhbGxvdyB0aGUgZGV2ZWxvcGVyIHRvIGRlc2lnbmF0ZSBhICJyb290IiBmb3IKK29iamVjdHMgd2hpY2ggbWF5IG5vdCBiZSByZWFjaGFibGUgYnkgbmF2aWdhdGlvbi4gSW4gb3JkZXIgdG8gc2VsZWN0IHZhbHVlcyBieQorY29tcGFyaW5nIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgYW4gZW50aXR5IGFic3RyYWN0IHNjaGVtYSB0eXBlLCBtb3JlIHRoYW4KK29uZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSByYW5naW5nIG92ZXIgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIGlzIG5lZWRlZCBpbgordGhlIDxsaXRlcmFsPkZST008L2xpdGVyYWw+IGNsYXVzZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZm9sbG93aW5nIHF1ZXJ5IHJldHVybnMgbWFnYXppbmVzIHdob3NlIHByaWNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcHJpY2Ugb2YKK21hZ2F6aW5lcyBwdWJsaXNoZWQgYnkgIkFkdmVudHVyZSIgcHVibGlzaGVycy4gVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSB1c2UKK29mIHR3byBkaWZmZXJlbnQgaWRlbnRpZmljYXRpb24gdmFyaWFibGVzIGluIHRoZSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBjbGF1c2UsCitib3RoIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBNYWdhemluZS4gVGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gY2xhdXNlCitvZiB0aGlzIHF1ZXJ5IGRldGVybWluZXMgdGhhdCBpdCBpcyB0aGUgbWFnYXppbmVzIHdpdGggcHJpY2VzIGdyZWF0ZXIgdGhhbiB0aG9zZQorb2YgIkFkdmVudHVyZSIgcHVibGlzaGVyJ3MgdGhhdCBhcmUgcmV0dXJuZWQuIAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK1NFTEVDVCBESVNUSU5DVCBtYWcxIEZST00gTWFnYXppbmUgbWFnMSwgTWFnYXppbmUgbWFnMgorV0hFUkUgbWFnMS5wcmljZSAmZ3Q7IG1hZzIucHJpY2UgQU5EIG1hZzIucHVibGlzaGVyLm5hbWUgPSAnQWR2ZW50dXJlJworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9wYXRoIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgUGF0aCBFeHByZXNzaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBmb2xsb3dlZCBieSB0aGUgbmF2aWdhdGlvbiBvcGVyYXRvciAoLikgYW5kIGEKK3N0YXRlLWZpZWxkIG9yIGFzc29jaWF0aW9uLWZpZWxkIGlzIGEgcGF0aCBleHByZXNzaW9uLiBUaGUgdHlwZSBvZiB0aGUgcGF0aAorZXhwcmVzc2lvbiBpcyB0aGUgdHlwZSBjb21wdXRlZCBhcyB0aGUgcmVzdWx0IG9mIG5hdmlnYXRpb247IHRoYXQgaXMsIHRoZSB0eXBlCitvZiB0aGUgc3RhdGUtZmllbGQgb3IgYXNzb2NpYXRpb24tZmllbGQgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gbmF2aWdhdGVzLgorRGVwZW5kaW5nIG9uIG5hdmlnYWJpbGl0eSwgYSBwYXRoIGV4cHJlc3Npb24gdGhhdCBsZWFkcyB0byBhIGFzc29jaWF0aW9uLWZpZWxkCittYXkgYmUgZnVydGhlciBjb21wb3NlZC4gUGF0aCBleHByZXNzaW9ucyBjYW4gYmUgY29tcG9zZWQgZnJvbSBvdGhlciBwYXRoCitleHByZXNzaW9ucyBpZiB0aGUgb3JpZ2luYWwgcGF0aCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHNpbmdsZS12YWx1ZWQgdHlwZQorKG5vdCBhIGNvbGxlY3Rpb24pIGNvcnJlc3BvbmRpbmcgdG8gYSBhc3NvY2lhdGlvbi1maWVsZC4gUGF0aCBleHByZXNzaW9uCituYXZpZ2FiaWxpdHkgaXMgY29tcG9zZWQgdXNpbmcgImlubmVyIGpvaW4iIHNlbWFudGljcy4gVGhhdCBpcywgaWYgdGhlIHZhbHVlIG9mCithIG5vbi10ZXJtaW5hbCBhc3NvY2lhdGlvbi1maWVsZCBpbiB0aGUgcGF0aCBleHByZXNzaW9uIGlzIG51bGwsIHRoZSBwYXRoIGlzCitjb25zaWRlcmVkIHRvIGhhdmUgbm8gdmFsdWUsIGFuZCBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgZGV0ZXJtaW5hdGlvbiBvZgordGhlIHJlc3VsdC4gVGhlIHN5bnRheCBmb3Igc2luZ2xlLXZhbHVlZCBwYXRoIGV4cHJlc3Npb25zIGFuZCBjb2xsZWN0aW9uIHZhbHVlZAorcGF0aCBleHByZXNzaW9ucyBpcyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NpbmdsZV92YWx1ZWRfcGF0aF9leHByZXNzaW9uIDo6PSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gfCAKK3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3N0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbiA6Oj0ge2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlIHwKK3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9ufS5zdGF0ZV9maWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzaW5nbGVfdmFsdWVkX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbiA6Oj0KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlLntzaW5nbGVfdmFsdWVkX2Fzc29jaWF0aW9uX2ZpZWxkLn0qc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citjb2xsZWN0aW9uX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gOjo9CitpZGVudGlmaWNhdGlvbl92YXJpYWJsZS57c2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZC59KmNvbGxlY3Rpb25fdmFsdWVkX2Fzc29jaWF0aW9uX2ZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3N0YXRlX2ZpZWxkIDo6PSB7ZW1iZWRkZWRfY2xhc3Nfc3RhdGVfZmllbGQufSpzaW1wbGVfc3RhdGVfZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0Egc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZCBpcyBkZXNpZ25hdGVkIGJ5IHRoZSBuYW1lIG9mIGFuCithc3NvY2lhdGlvbi1maWVsZCBpbiBhIG9uZS10by1vbmUgb3IgbWFueS10by1vbmUgcmVsYXRpb25zaGlwLiBUaGUgdHlwZSBvZiBhCitzaW5nbGVfdmFsdWVkX2Fzc29jaWF0aW9uX2ZpZWxkIGFuZCB0aHVzIGEKK3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIGlzIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiB0aGUKK3JlbGF0ZWQgZW50aXR5LiBBIGNvbGxlY3Rpb25fdmFsdWVkX2Fzc29jaWF0aW9uX2ZpZWxkIGlzIGRlc2lnbmF0ZWQgYnkgdGhlIG5hbWUKK29mIGFuIGFzc29jaWF0aW9uLWZpZWxkIGluIGEgb25lLXRvLW1hbnkgb3IgYSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwLiBUaGUKK3R5cGUgb2YgYSBjb2xsZWN0aW9uX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZCBpcyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzIG9mIHRoZQorYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgdGhlIHJlbGF0ZWQgZW50aXR5LiBBbiBlbWJlZGRlZF9jbGFzc19zdGF0ZSBfZmllbGQgaXMKK2Rlc2lnbmF0ZWQgYnkgdGhlIG5hbWUgb2YgYW4gZW50aXR5IHN0YXRlIGZpZWxkIHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZW1iZWRkZWQKK2NsYXNzLiBOYXZpZ2F0aW9uIHRvIGEgcmVsYXRlZCBlbnRpdHkgcmVzdWx0cyBpbiBhIHZhbHVlIG9mIHRoZSByZWxhdGVkIGVudGl0eSdzCithYnN0cmFjdCBzY2hlbWEgdHlwZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZXZhbHVhdGlvbiBvZiBhIHBhdGggZXhwcmVzc2lvbiB0ZXJtaW5hdGluZyBpbiBhIHN0YXRlLWZpZWxkIHJlc3VsdHMgaW4gdGhlCithYnN0cmFjdCBzY2hlbWEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBKYXZhIHR5cGUgZGVzaWduYXRlZCBieSB0aGUKK3N0YXRlLWZpZWxkLiBJdCBpcyBzeW50YWN0aWNhbGx5IGlsbGVnYWwgdG8gY29tcG9zZSBhIHBhdGggZXhwcmVzc2lvbiBmcm9tIGEKK3BhdGggZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBhIGNvbGxlY3Rpb24uIEZvciBleGFtcGxlLCBpZiA8bGl0ZXJhbD5tYWcKKzwvbGl0ZXJhbD4gZGVzaWduYXRlcyA8bGl0ZXJhbD5NYWdhemluZTwvbGl0ZXJhbD4sIHRoZSBwYXRoIGV4cHJlc3Npb24gPGxpdGVyYWw+CittYWcuYXJ0aWNsZXMuYXV0aG9yPC9saXRlcmFsPiBpcyBpbGxlZ2FsIHNpbmNlIG5hdmlnYXRpb24gdG8gYXV0aG9ycyByZXN1bHRzIGluCithIGNvbGxlY3Rpb24uIFRoaXMgY2FzZSBzaG91bGQgcHJvZHVjZSBhbiBlcnJvciB3aGVuIHRoZSBxdWVyeSBzdHJpbmcgaXMKK3ZlcmlmaWVkLiBUbyBoYW5kbGUgc3VjaCBhIG5hdmlnYXRpb24sIGFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIG11c3QgYmUKK2RlY2xhcmVkIGluIHRoZSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBjbGF1c2UgdG8gcmFuZ2Ugb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlCis8bGl0ZXJhbD5hcnRpY2xlczwvbGl0ZXJhbD4gY29sbGVjdGlvbi4gQW5vdGhlciBwYXRoIGV4cHJlc3Npb24gbXVzdCBiZSB1c2VkIHRvCituYXZpZ2F0ZSBvdmVyIGVhY2ggc3VjaCBlbGVtZW50IGluIHRoZSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIG9mIHRoZQorcXVlcnksIGFzIGluIHRoZSBmb2xsb3dpbmcgcXVlcnkgd2hpY2ggcmV0dXJucyBhbGwgYXV0aG9ycyB0aGF0IGhhdmUgYW55CithcnRpY2xlcyBpbiBhbnkgbWFnYXppbmVzOiA8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIERJU1RJTkNUIGFydC5hdXRob3IgRlJPTSBNYWdhemluZSBBUyBtYWcsIElOKG1hZy5hcnRpY2xlcykgYXJ0Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9Kb2lucyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEpvaW5zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FuIGlubmVyIGpvaW4gbWF5IGJlIGltcGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2Ugb2YgYSBjYXJ0ZXNpYW4gcHJvZHVjdCBpbgordGhlIDxsaXRlcmFsPkZST008L2xpdGVyYWw+IGNsYXVzZSBhbmQgYSBqb2luIGNvbmRpdGlvbiBpbiB0aGUgPGxpdGVyYWw+V0hFUkUKKzwvbGl0ZXJhbD4gY2xhdXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzeW50YXggZm9yIGV4cGxpY2l0IGpvaW4gb3BlcmF0aW9ucyBpcyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2pvaW4gOjo9IGpvaW5fc3BlYyBqb2luX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbiBbQVNdIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZmV0Y2hfam9pbiA6Oj0gam9pbl9zcGVjIEZFVENIIGpvaW5fYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2pvaW5fYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIDo6PSBqb2luX2NvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8Citqb2luX3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2pvaW5fc3BlYyA6Oj0gWyBMRUZUIFtPVVRFUl0gfCBJTk5FUiBdIEpPSU4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgaW5uZXIgYW5kIG91dGVyIGpvaW4gb3BlcmF0aW9uIHR5cGVzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9pbm5lcl9qb2lucyI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwgSW5uZXIgSm9pbnMgKFJlbGF0aW9uc2hpcCBKb2lucykKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc3ludGF4IGZvciB0aGUgaW5uZXIgam9pbiBvcGVyYXRpb24gaXMgPHByb2dyYW1saXN0aW5nPgorWyBJTk5FUiBdIEpPSU4gam9pbl9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24gW0FTXSBpZGVudGlmaWNhdGlvbl92YXJpYWJsZQorPC9wcm9ncmFtbGlzdGluZz4gRm9yIGV4YW1wbGUsIHRoZSBxdWVyeSBiZWxvdyBqb2lucyBvdmVyIHRoZSByZWxhdGlvbnNoaXAKK2JldHdlZW4gcHVibGlzaGVycyBhbmQgbWFnYXppbmVzLiBUaGlzIHR5cGUgb2Ygam9pbiB0eXBpY2FsbHkgZXF1YXRlcyB0byBhIGpvaW4KK292ZXIgYSBmb3JlaWduIGtleSByZWxhdGlvbnNoaXAgaW4gdGhlIGRhdGFiYXNlLiAKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHB1YiBGUk9NIFB1Ymxpc2hlciBwdWIgSk9JTiBwdWIubWFnYXppbmVzIG1hZyBXSEVSRSBwdWIucmV2ZW51ZSAmZ3Q7IDEwMDAwMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGtleXdvcmQgPGxpdGVyYWw+SU5ORVI8L2xpdGVyYWw+IG1heSBvcHRpb25hbGx5IGJlIHVzZWQ6IAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitTRUxFQ1QgcHViIEZST00gUHVibGlzaGVyIHB1YiBJTk5FUiBKT0lOIHB1Yi5tYWdhemluZXMgbWFnIFdIRVJFIHB1Yi5yZXZlbnVlICZndDsgMTAwMDAwMAorPC9wcm9ncmFtbGlzdGluZz4gCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgcXVlcnkgdXNpbmcgdGhlIGVhcmxpZXIKKzxsaXRlcmFsPklOPC9saXRlcmFsPiBjb25zdHJ1Y3QuIEl0IHNlbGVjdHMgdGhvc2UgcHVibGlzaGVycyB3aXRoIHJldmVudWUgb2YKK292ZXIgMSBtaWxsaW9uIGZvciB3aGljaCBhdCBsZWFzdCBvbmUgbWFnYXppbmUgZXhpc3RzOiAKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIE9CSkVDVChwdWIpIEZST00gUHVibGlzaGVyIHB1YiwgSU4ocHViLm1hZ2F6aW5lcykgbWFnIFdIRVJFIHB1Yi5yZXZlbnVlICZndDsgMTAwMDAwMAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX291dGVyX2pvaW5zIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgSlBRTCBPdXRlciBKb2lucworICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkxFRlQgSk9JTjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkxFRlQgT1VURVIgSk9JTjwvbGl0ZXJhbD4gYXJlCitzeW5vbnltb3VzLiBUaGV5IGVuYWJsZSB0aGUgcmV0cmlldmFsIG9mIGEgc2V0IG9mIGVudGl0aWVzIHdoZXJlIG1hdGNoaW5nIHZhbHVlcworaW4gdGhlIGpvaW4gY29uZGl0aW9uIG1heSBiZSBhYnNlbnQuIFRoZSBzeW50YXggZm9yIGEgbGVmdCBvdXRlciBqb2luIGlzOgorPHByb2dyYW1saXN0aW5nPkxFRlQgW09VVEVSXSBKT0lOIGpvaW5fYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIFtBU10gaWRlbnRpZmljYXRpb25fdmFyaWFibGUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGb3IgZXhhbXBsZTogPHByb2dyYW1saXN0aW5nPlNFTEVDVCBwdWIgRlJPTSBQdWJsaXNoZXIgcHViIExFRlQgSk9JTiBwdWIubWFnYXppbmVzIG1hZyBXSEVSRSBwdWIucmV2ZW51ZSAmZ3Q7IDEwMDAwMDAKKzwvcHJvZ3JhbWxpc3Rpbmc+IFRoZSBrZXl3b3JkIDxsaXRlcmFsPk9VVEVSPC9saXRlcmFsPiBtYXkgb3B0aW9uYWxseSBiZSB1c2VkOgorPHByb2dyYW1saXN0aW5nPlNFTEVDVCBwdWIgRlJPTSBQdWJsaXNoZXIgcHViIExFRlQgT1VURVIgSk9JTiBwdWIubWFnYXppbmVzIG1hZ3MgV0hFUkUgcHViLnJldmVudWUgJmd0OyAxMDAwMDAwCis8L3Byb2dyYW1saXN0aW5nPiBBbiBpbXBvcnRhbnQgdXNlIGNhc2UgZm9yIDxsaXRlcmFsPkxFRlQgSk9JTjwvbGl0ZXJhbD4gaXMgaW4KK2VuYWJsaW5nIHRoZSBwcmVmZXRjaGluZyBvZiByZWxhdGVkIGRhdGEgaXRlbXMgYXMgYSBzaWRlIGVmZmVjdCBvZiBhIHF1ZXJ5LiBUaGlzCitpcyBhY2NvbXBsaXNoZWQgYnkgc3BlY2lmeWluZyB0aGUgPGxpdGVyYWw+TEVGVCBKT0lOPC9saXRlcmFsPiBhcyBhIDxsaXRlcmFsPgorRkVUQ0ggSk9JTjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2ZldGNoX2pvaW5zIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgSlBRTCBGZXRjaCBKb2lucworICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0EgPGxpdGVyYWw+RkVUQ0ggSk9JTjwvbGl0ZXJhbD4gZW5hYmxlcyB0aGUgZmV0Y2hpbmcgb2YgYW4gYXNzb2NpYXRpb24gYXMgYSBzaWRlCitlZmZlY3Qgb2YgdGhlIGV4ZWN1dGlvbiBvZiBhIHF1ZXJ5LiBBIDxsaXRlcmFsPkZFVENIIEpPSU48L2xpdGVyYWw+IGlzIHNwZWNpZmllZAorb3ZlciBhbiBlbnRpdHkgYW5kIGl0cyByZWxhdGVkIGVudGl0aWVzLiBUaGUgc3ludGF4IGZvciBhIGZldGNoIGpvaW4gaXMKKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPmZldGNoX2pvaW4gOjo9IFsgTEVGVCBbT1VURVJdIHwgSU5ORVIgXSBKT0lOCitGRVRDSCBqb2luX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGFzc29jaWF0aW9uIHJlZmVyZW5jZWQgYnkgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIDxsaXRlcmFsPkZFVENIIEpPSU4KKzwvbGl0ZXJhbD4gY2xhdXNlIG11c3QgYmUgYW4gYXNzb2NpYXRpb24gdGhhdCBiZWxvbmdzIHRvIGFuIGVudGl0eSB0aGF0IGlzCityZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiB0aGUgcXVlcnkuIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8gc3BlY2lmeSBhbgoraWRlbnRpZmljYXRpb24gdmFyaWFibGUgZm9yIHRoZSBlbnRpdGllcyByZWZlcmVuY2VkIGJ5IHRoZSByaWdodCBzaWRlIG9mIHRoZQorPGxpdGVyYWw+RkVUQ0ggSk9JTjwvbGl0ZXJhbD4gY2xhdXNlLCBhbmQgaGVuY2UgcmVmZXJlbmNlcyB0byB0aGUgaW1wbGljaXRseQorZmV0Y2hlZCBlbnRpdGllcyBjYW5ub3QgYXBwZWFyIGVsc2V3aGVyZSBpbiB0aGUgcXVlcnkuIFRoZSBmb2xsb3dpbmcgcXVlcnkKK3JldHVybnMgYSBzZXQgb2YgbWFnYXppbmVzLiBBcyBhIHNpZGUgZWZmZWN0LCB0aGUgYXNzb2NpYXRlZCBhcnRpY2xlcyBmb3IgdGhvc2UKK21hZ2F6aW5lcyBhcmUgYWxzbyByZXRyaWV2ZWQsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBleHBsaWNpdAorcXVlcnkgcmVzdWx0LiBUaGUgcGVyc2lzdGVudCBmaWVsZHMgb3IgcHJvcGVydGllcyBvZiB0aGUgYXJ0aWNsZXMgdGhhdCBhcmUKK2VhZ2VybHkgZmV0Y2hlZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmVsYXRpb25zaGlwCitwcm9wZXJ0aWVzIG9mIHRoZSA8bGl0ZXJhbD5hcnRpY2xlczwvbGl0ZXJhbD4gdGhhdCBhcmUgcmV0cmlldmVkIGlzIGRldGVybWluZWQKK2J5IHRoZSBtZXRhZGF0YSBmb3IgdGhlIDxsaXRlcmFsPkFydGljbGU8L2xpdGVyYWw+IGVudGl0eSBjbGFzcy4KKzxwcm9ncmFtbGlzdGluZz5TRUxFQ1QgbWFnIEZST00gTWFnYXppbmUgbWFnIExFRlQgSk9JTiBGRVRDSCBtYWcuYXJ0aWNsZXMgV0hFUkUgbWFnLmlkID0gMQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0EgZmV0Y2ggam9pbiBoYXMgdGhlIHNhbWUgam9pbiBzZW1hbnRpY3MgYXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIgb3Igb3V0ZXIKK2pvaW4sIGV4Y2VwdCB0aGF0IHRoZSByZWxhdGVkIG9iamVjdHMgc3BlY2lmaWVkIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlCitqb2luIG9wZXJhdGlvbiBhcmUgbm90IHJldHVybmVkIGluIHRoZSBxdWVyeSByZXN1bHQgb3Igb3RoZXJ3aXNlIHJlZmVyZW5jZWQgaW4KK3RoZSBxdWVyeS4gSGVuY2UsIGZvciBleGFtcGxlLCBpZiBtYWdhemluZSBpZCAxIGhhcyBmaXZlIGFydGljbGVzLCB0aGUgYWJvdmUKK3F1ZXJ5IHJldHVybnMgZml2ZSByZWZlcmVuY2VzIHRvIHRoZSBtYWdhemluZSAxIGVudGl0eS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9jb2xsZWN0aW9uX2RlYyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIENvbGxlY3Rpb24gTWVtYmVyIERlY2xhcmF0aW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBkZWNsYXJlZCBieSBhIGNvbGxlY3Rpb25fbWVtYmVyX2RlY2xhcmF0aW9uIHJhbmdlcworb3ZlciB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uIG9idGFpbmVkIGJ5IG5hdmlnYXRpb24gdXNpbmcgYSBwYXRoIGV4cHJlc3Npb24uIFN1Y2gKK2EgcGF0aCBleHByZXNzaW9uIHJlcHJlc2VudHMgYSBuYXZpZ2F0aW9uIGludm9sdmluZyB0aGUgYXNzb2NpYXRpb24tZmllbGRzIG9mIGFuCitlbnRpdHkgYWJzdHJhY3Qgc2NoZW1hIHR5cGUuIEJlY2F1c2UgYSBwYXRoIGV4cHJlc3Npb24gY2FuIGJlIGJhc2VkIG9uIGFub3RoZXIKK3BhdGggZXhwcmVzc2lvbiwgdGhlIG5hdmlnYXRpb24gY2FuIHVzZSB0aGUgYXNzb2NpYXRpb24tZmllbGRzIG9mIHJlbGF0ZWQKK2VudGl0aWVzLiBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBvZiBhIGNvbGxlY3Rpb24gbWVtYmVyIGRlY2xhcmF0aW9uIGlzCitkZWNsYXJlZCB1c2luZyBhIHNwZWNpYWwgb3BlcmF0b3IsIHRoZSByZXNlcnZlZCBpZGVudGlmaWVyIDxsaXRlcmFsPklOPC9saXRlcmFsPgorLiBUaGUgYXJndW1lbnQgdG8gdGhlIDxsaXRlcmFsPklOPC9saXRlcmFsPiBvcGVyYXRvciBpcyBhIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGgKK2V4cHJlc3Npb24uIFRoZSBwYXRoIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgY29sbGVjdGlvbiB0eXBlIHNwZWNpZmllZCBhcyBhCityZXN1bHQgb2YgbmF2aWdhdGlvbiB0byBhIGNvbGxlY3Rpb24tdmFsdWVkIGFzc29jaWF0aW9uLWZpZWxkIG9mIGFuIGVudGl0eQorYWJzdHJhY3Qgc2NoZW1hIHR5cGUuIFRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBhIGNvbGxlY3Rpb24gbWVtYmVyCitpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBpcyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPmNvbGxlY3Rpb25fbWVtYmVyX2RlY2xhcmF0aW9uIDo6PSBJTgorKGNvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbikgW0FTXSBpZGVudGlmaWNhdGlvbl92YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0ZvciBleGFtcGxlLCB0aGUgcXVlcnkgPHByb2dyYW1saXN0aW5nPlNFTEVDVCBESVNUSU5DVCBtYWcgRlJPTSBNYWdhemluZSBtYWcKKyAgICBKT0lOIG1hZy5hcnRpY2xlcyBhcnQKKyAgICBKT0lOIGFydC5hdXRob3IgYXV0aAorICAgIFdIRVJFIGF1dGgubGFzdE5hbWUgPSAnR3Jpc2hhbSc8L3Byb2dyYW1saXN0aW5nPiBtYXkgZXF1aXZhbGVudGx5IGJlCitleHByZXNzZWQgYXMgZm9sbG93cywgdXNpbmcgdGhlIDxsaXRlcmFsPklOPC9saXRlcmFsPiBvcGVyYXRvcjogPHByb2dyYW1saXN0aW5nPlNFTEVDVCBESVNUSU5DVCBtYWcgRlJPTSBNYWdhemluZSBtYWcsCisgICAgSU4obWFnLmFydGljbGVzKSBhcnQKKyAgICBXSEVSRSBhcnQuYXV0aG9yLmxhc3ROYW1lID0gJ0dyaXNoYW0nPC9wcm9ncmFtbGlzdGluZz4gSW4gdGhpcyBleGFtcGxlLAorPGxpdGVyYWw+YXJ0aWNsZXM8L2xpdGVyYWw+IGlzIHRoZSBuYW1lIG9mIGFuIGFzc29jaWF0aW9uLWZpZWxkIHdob3NlIHZhbHVlIGlzIGEKK2NvbGxlY3Rpb24gb2YgaW5zdGFuY2VzIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSA8bGl0ZXJhbD5BcnRpY2xlPC9saXRlcmFsPi4KK1RoZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSA8bGl0ZXJhbD5hcnQ8L2xpdGVyYWw+IGRlc2lnbmF0ZXMgYSBtZW1iZXIgb2YgdGhpcworY29sbGVjdGlvbiwgYSBzaW5nbGUgPGxpdGVyYWw+QXJ0aWNsZTwvbGl0ZXJhbD4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgaW5zdGFuY2UuCitJbiB0aGlzIGV4YW1wbGUsIDxsaXRlcmFsPm1hZzwvbGl0ZXJhbD4gaXMgYW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgb2YgdGhlCithYnN0cmFjdCBzY2hlbWEgdHlwZSA8bGl0ZXJhbD5NYWdhemluZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX3BvbHltb3JwaCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIFBvbHltb3JwaGlzbQorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitKYXZhIFBlcnNpc3RlbmNlIHF1ZXJpZXMgYXJlIGF1dG9tYXRpY2FsbHkgcG9seW1vcnBoaWMuIFRoZSA8bGl0ZXJhbD5GUk9NCis8L2xpdGVyYWw+IGNsYXVzZSBvZiBhIHF1ZXJ5IGRlc2lnbmF0ZXMgbm90IG9ubHkgaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpYworZW50aXR5IGNsYXNzZXMgdG8gd2hpY2ggZXhwbGljaXRseSByZWZlcnMgYnV0IG9mIHN1YmNsYXNzZXMgYXMgd2VsbC4gVGhlCitpbnN0YW5jZXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBpbmNsdWRlIGluc3RhbmNlcyBvZiB0aGUgc3ViY2xhc3NlcyB0aGF0IHNhdGlzZnkKK3RoZSBxdWVyeSBjcml0ZXJpYS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX3doZXJlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBKUFFMIFdIRVJFIENsYXVzZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBjbGF1c2Ugb2YgYSBxdWVyeSBjb25zaXN0cyBvZiBhIGNvbmRpdGlvbmFsCitleHByZXNzaW9uIHVzZWQgdG8gc2VsZWN0IG9iamVjdHMgb3IgdmFsdWVzIHRoYXQgc2F0aXNmeSB0aGUgZXhwcmVzc2lvbi4gVGhlCis8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIHJlc3RyaWN0cyB0aGUgcmVzdWx0IG9mIGEgc2VsZWN0IHN0YXRlbWVudCBvcgordGhlIHNjb3BlIG9mIGFuIHVwZGF0ZSBvciBkZWxldGUgb3BlcmF0aW9uLiBBIDxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBjbGF1c2UgaXMKK2RlZmluZWQgYXMgZm9sbG93czogPGl0ZW1pemVkbGlzdD48bGlzdGl0ZW0+PHBhcmE+d2hlcmVfY2xhdXNlIDo6PSBXSEVSRQorY29uZGl0aW9uYWxfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+R1JPVVAgQlk8L2xpdGVyYWw+IGNvbnN0cnVjdCBlbmFibGVzIHRoZSBhZ2dyZWdhdGlvbiBvZiB2YWx1ZXMKK2FjY29yZGluZyB0byB0aGUgcHJvcGVydGllcyBvZiBhbiBlbnRpdHkgY2xhc3MuIFRoZSA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+Citjb25zdHJ1Y3QgZW5hYmxlcyBjb25kaXRpb25zIHRvIGJlIHNwZWNpZmllZCB0aGF0IGZ1cnRoZXIgcmVzdHJpY3QgdGhlIHF1ZXJ5CityZXN1bHQgYXMgcmVzdHJpY3Rpb25zIHVwb24gdGhlIGdyb3Vwcy4gVGhlIHN5bnRheCBvZiB0aGUgPGxpdGVyYWw+SEFWSU5HCis8L2xpdGVyYWw+IGNsYXVzZSBpcyBhcyBmb2xsb3dzOiA8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT5oYXZpbmdfY2xhdXNlCis6Oj0gSEFWSU5HIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPkdST1VQIEJZPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+SEFWSU5HPC9saXRlcmFsPiBjb25zdHJ1Y3RzIGFyZQorZnVydGhlciBkaXNjdXNzZWQgaW4gPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfZ3JvdXAiLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2NvbmQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEpQUUwgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgdGhlIGxhbmd1YWdlIGNvbnN0cnVjdHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhCitjb25kaXRpb25hbCBleHByZXNzaW9uIG9mIHRoZSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIG9yIDxsaXRlcmFsPgorSEFWSU5HPC9saXRlcmFsPiBjbGF1c2UuIFN0YXRlLWZpZWxkcyB0aGF0IGFyZSBtYXBwZWQgaW4gc2VyaWFsaXplZCBmb3JtIG9yIGFzCitsb2JzIG1heSBub3QgYmUgcG9ydGFibHkgdXNlZCBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ucy4gPG5vdGU+PHBhcmE+IFRoZQoraW1wbGVtZW50YXRpb24gaXMgbm90IGV4cGVjdGVkIHRvIHBlcmZvcm0gc3VjaCBxdWVyeSBvcGVyYXRpb25zIGludm9sdmluZyBzdWNoCitmaWVsZHMgaW4gbWVtb3J5IHJhdGhlciB0aGFuIGluIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9saXQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBMaXRlcmFscworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBIHN0cmluZyBsaXRlcmFsIGlzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMtLWZvciBleGFtcGxlOiAnbGl0ZXJhbCcuIEEgc3RyaW5nCitsaXRlcmFsIHRoYXQgaW5jbHVkZXMgYSBzaW5nbGUgcXVvdGUgaXMgcmVwcmVzZW50ZWQgYnkgdHdvIHNpbmdsZSBxdW90ZXMtLWZvcgorZXhhbXBsZTogJ2xpdGVyYWwnJ3MnLiBTdHJpbmcgbGl0ZXJhbHMgaW4gcXVlcmllcywgbGlrZSBKYXZhIFN0cmluZyBsaXRlcmFscywKK3VzZSB1bmljb2RlIGNoYXJhY3RlciBlbmNvZGluZy4gVGhlIHVzZSBvZiBKYXZhIGVzY2FwZSBub3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCitpbiBxdWVyeSBzdHJpbmcgbGl0ZXJhbHMgRXhhY3QgbnVtZXJpYyBsaXRlcmFscyBzdXBwb3J0IHRoZSB1c2Ugb2YgSmF2YSBpbnRlZ2VyCitsaXRlcmFsIHN5bnRheCBhcyB3ZWxsIGFzIFNRTCBleGFjdCBudW1lcmljIGxpdGVyYWwgc3ludGF4LiBBcHByb3hpbWF0ZSBsaXRlcmFscworc3VwcG9ydCB0aGUgdXNlIEphdmEgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbCBzeW50YXggYXMgd2VsbCBhcyBTUUwgYXBwcm94aW1hdGUKK251bWVyaWMgbGl0ZXJhbCBzeW50YXguIEVudW0gbGl0ZXJhbHMgc3VwcG9ydCB0aGUgdXNlIG9mIEphdmEgZW51bSBsaXRlcmFsCitzeW50YXguIFRoZSBlbnVtIGNsYXNzIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIEFwcHJvcHJpYXRlIHN1ZmZpeGVzIG1heSBiZSB1c2VkCit0byBpbmRpY2F0ZSB0aGUgc3BlY2lmaWMgdHlwZSBvZiBhIG51bWVyaWMgbGl0ZXJhbCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEphdmEKK0xhbmd1YWdlIFNwZWNpZmljYXRpb24uIFRoZSBib29sZWFuIGxpdGVyYWxzIGFyZSA8bGl0ZXJhbD5UUlVFPC9saXRlcmFsPiBhbmQKKzxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPi4gQWx0aG91Z2ggcHJlZGVmaW5lZCByZXNlcnZlZCBsaXRlcmFscyBhcHBlYXIgaW4gdXBwZXIKK2Nhc2UsIHRoZXkgYXJlIGNhc2UgaW5zZW5zaXRpdmUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2lkdmFyIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgSWRlbnRpZmljYXRpb24gVmFyaWFibGVzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FsbCBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPgorSEFWSU5HPC9saXRlcmFsPiBjbGF1c2Ugb2YgYSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkRFTEVURQorPC9saXRlcmFsPiBzdGF0ZW1lbnQgbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgPGxpdGVyYWw+RlJPTTwvbGl0ZXJhbD4gY2xhdXNlLCBhcworZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV9sYW5ncmVmX2Zyb21fdmFycyIvPi4gVGhlIGlkZW50aWZpY2F0aW9uCit2YXJpYWJsZXMgdXNlZCBpbiB0aGUgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IGNsYXVzZSBvZiBhbiA8bGl0ZXJhbD5VUERBVEUKKzwvbGl0ZXJhbD4gc3RhdGVtZW50IG11c3QgYmUgZGVjbGFyZWQgaW4gdGhlIDxsaXRlcmFsPlVQREFURTwvbGl0ZXJhbD4gY2xhdXNlLgorSWRlbnRpZmljYXRpb24gdmFyaWFibGVzIGFyZSBleGlzdGVudGlhbGx5IHF1YW50aWZpZWQgaW4gdGhlIDxsaXRlcmFsPldIRVJFCis8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+IGNsYXVzZS4gVGhpcyBtZWFucyB0aGF0IGFuCitpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSByZXByZXNlbnRzIGEgbWVtYmVyIG9mIGEgY29sbGVjdGlvbiBvciBhbiBpbnN0YW5jZSBvZiBhbgorZW50aXR5J3MgYWJzdHJhY3Qgc2NoZW1hIHR5cGUuIEFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIG5ldmVyIGRlc2lnbmF0ZXMgYQorY29sbGVjdGlvbiBpbiBpdHMgZW50aXJldHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX3BhdGhfZXhwIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgUGF0aCBFeHByZXNzaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJdCBpcyBpbGxlZ2FsIHRvIHVzZSBhIGNvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB3aXRoaW4gYSA8bGl0ZXJhbD4KK1dIRVJFPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+IGNsYXVzZSBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwKK2V4cHJlc3Npb24gZXhjZXB0IGluIGFuIGVtcHR5X2NvbGxlY3Rpb25fY29tcGFyaXNvbl9leHByZXNzaW9uLCBpbiBhCitjb2xsZWN0aW9uX21lbWJlcl9leHByZXNzaW9uLCBvciBhcyBhbiBhcmd1bWVudCB0byB0aGUgPGxpdGVyYWw+U0laRTwvbGl0ZXJhbD4KK29wZXJhdG9yLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9pbnB1dF9wYXJhbXMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBJbnB1dCBQYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0VpdGhlciBwb3NpdGlvbmFsIG9yIG5hbWVkIHBhcmFtZXRlcnMgbWF5IGJlIHVzZWQuIFBvc2l0aW9uYWwgYW5kIG5hbWVkCitwYXJhbWV0ZXJzIG1heSBub3QgYmUgbWl4ZWQgaW4gYSBzaW5nbGUgcXVlcnkuIElucHV0IHBhcmFtZXRlcnMgY2FuIG9ubHkgYmUgdXNlZAoraW4gdGhlIDxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBjbGF1c2Ugb3IgPGxpdGVyYWw+SEFWSU5HPC9saXRlcmFsPiBjbGF1c2Ugb2YgYQorcXVlcnkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorTm90ZSB0aGF0IGlmIGFuIGlucHV0IHBhcmFtZXRlciB2YWx1ZSBpcyBudWxsLCBjb21wYXJpc29uIG9wZXJhdGlvbnMgb3IKK2FyaXRobWV0aWMgb3BlcmF0aW9ucyBpbnZvbHZpbmcgdGhlIGlucHV0IHBhcmFtZXRlciB3aWxsIHJldHVybiBhbiB1bmtub3duCit2YWx1ZS4gU2VlIDx4cmVmIGxpbmtlbmQ9ImpwYV9sYW5ncmVmX251bGxfdmFsdWVzIi8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfcG9zX3BhcmFtcyI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwgUG9zaXRpb25hbCBQYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSB0byBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuIDxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPgorPHBhcmE+IElucHV0IHBhcmFtZXRlcnMgYXJlIGRlc2lnbmF0ZWQgYnkgdGhlIHF1ZXN0aW9uIG1hcmsgKD8pIHByZWZpeCBmb2xsb3dlZAorYnkgYW4gaW50ZWdlci4gRm9yIGV4YW1wbGU6ID8xLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorSW5wdXQgcGFyYW1ldGVycyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxLiBOb3RlIHRoYXQgdGhlIHNhbWUgcGFyYW1ldGVyIGNhbgorYmUgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGF0IHRoZSBvcmRlcmluZyBvZiB0aGUgdXNlIG9mCitwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgcXVlcnkgc3RyaW5nIG5lZWQgbm90IGNvbmZvcm0gdG8gdGhlIG9yZGVyIG9mIHRoZQorcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9uYW1lZF9wYXJhbXMiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICBKUFFMIE5hbWVkIFBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBIG5hbWVkIHBhcmFtZXRlciBpcyBhbiBpZGVudGlmaWVyIHRoYXQgaXMgcHJlZml4ZWQgYnkgdGhlICI6IiBzeW1ib2wuIEl0Citmb2xsb3dzIHRoZSBydWxlcyBmb3IgaWRlbnRpZmllcnMgZGVmaW5lZCBpbgorPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfZnJvbV9pZGVudGlmaWVycyIvPi4gTmFtZWQgcGFyYW1ldGVycyBhcmUgY2FzZQorc2Vuc2l0aXZlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRXhhbXBsZTogPHByb2dyYW1saXN0aW5nPlNFTEVDVCBwdWIgRlJPTSBQdWJsaXNoZXIgcHViIFdIRVJFIHB1Yi5yZXZlbnVlICZndDsgOnJldgorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9jb25kX2NvbXAiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBDb25kaXRpb25hbCBFeHByZXNzaW9uIENvbXBvc2l0aW9uCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0NvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGFyZSBjb21wb3NlZCBvZiBvdGhlciBjb25kaXRpb25hbCBleHByZXNzaW9ucywKK2NvbXBhcmlzb24gb3BlcmF0aW9ucywgbG9naWNhbCBvcGVyYXRpb25zLCBwYXRoIGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8KK2Jvb2xlYW4gdmFsdWVzLCBib29sZWFuIGxpdGVyYWxzLCBhbmQgYm9vbGVhbiBpbnB1dCBwYXJhbWV0ZXJzLiBBcml0aG1ldGljCitleHByZXNzaW9ucyBjYW4gYmUgdXNlZCBpbiBjb21wYXJpc29uIGV4cHJlc3Npb25zLiBBcml0aG1ldGljIGV4cHJlc3Npb25zIGFyZQorY29tcG9zZWQgb2Ygb3RoZXIgYXJpdGhtZXRpYyBleHByZXNzaW9ucywgYXJpdGhtZXRpYyBvcGVyYXRpb25zLCBwYXRoCitleHByZXNzaW9ucyB0aGF0IGV2YWx1YXRlIHRvIG51bWVyaWMgdmFsdWVzLCBudW1lcmljIGxpdGVyYWxzLCBhbmQgbnVtZXJpYyBpbnB1dAorcGFyYW1ldGVycy4gQXJpdGhtZXRpYyBvcGVyYXRpb25zIHVzZSBudW1lcmljIHByb21vdGlvbi4gU3RhbmRhcmQgYnJhY2tldGluZyAoKQorZm9yIG9yZGVyaW5nIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBpcyBzdXBwb3J0ZWQuIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGFyZQorZGVmaW5lZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPmNvbmRpdGlvbmFsX2V4cHJlc3Npb24gOjo9IGNvbmRpdGlvbmFsX3Rlcm0gfAorY29uZGl0aW9uYWxfZXhwcmVzc2lvbiBPUiBjb25kaXRpb25hbF90ZXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2NvbmRpdGlvbmFsX3Rlcm0gOjo9IGNvbmRpdGlvbmFsX2ZhY3RvciB8IGNvbmRpdGlvbmFsX3Rlcm0gQU5ECitjb25kaXRpb25hbF9mYWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uZGl0aW9uYWxfZmFjdG9yIDo6PSBbIE5PVCBdIGNvbmRpdGlvbmFsX3ByaW1hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uZGl0aW9uYWxfcHJpbWFyeSA6Oj0gc2ltcGxlX2NvbmRfZXhwcmVzc2lvbiB8IChjb25kaXRpb25hbF9leHByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzaW1wbGVfY29uZF9leHByZXNzaW9uIDo6PSBjb21wYXJpc29uX2V4cHJlc3Npb24gfCBiZXR3ZWVuX2V4cHJlc3Npb24gfAorbGlrZV9leHByZXNzaW9uIHwgaW5fZXhwcmVzc2lvbiB8IG51bGxfY29tcGFyaXNvbl9leHByZXNzaW9uIHwKK2VtcHR5X2NvbGxlY3Rpb25fY29tcGFyaXNvbl9leHByZXNzaW9uIHwgY29sbGVjdGlvbl9tZW1iZXJfZXhwcmVzc2lvbiB8CitleGlzdHNfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FnZ3JlZ2F0ZSBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ucyBpbiBhIDxsaXRlcmFsPgorSEFWSU5HPC9saXRlcmFsPiBjbGF1c2UuIFNlZSA8eHJlZiBsaW5rZW5kPSJqcGFfbGFuZ3JlZl9ncm91cCIvPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfb3BlcmF0b3JzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgT3BlcmF0b3JzIGFuZCBPcGVyYXRvciBQcmVjZWRlbmNlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBvcGVyYXRvcnMgYXJlIGxpc3RlZCBiZWxvdyBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIHByZWNlZGVuY2UuIDxpdGVtaXplZGxpc3Q+Cis8bGlzdGl0ZW0+PHBhcmE+IE5hdmlnYXRpb24gb3BlcmF0b3IgKC4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FyaXRobWV0aWMgb3BlcmF0b3JzOiArLCAtIHVuYXJ5ICosIC8gbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uICssIC0gYWRkaXRpb24KK2FuZCBzdWJ0cmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitDb21wYXJpc29uIG9wZXJhdG9yczogPSwgJmd0OywgJmd0Oz0sICZsdDssICZsdDs9LCAmbHQ7Jmd0OyAobm90IGVxdWFsKSwgWworPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdIDxsaXRlcmFsPkJFVFdFRU48L2xpdGVyYWw+LCBbIDxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4gXQorPGxpdGVyYWw+TElLRTwvbGl0ZXJhbD4sIFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdIDxsaXRlcmFsPklOPC9saXRlcmFsPiwKKzxsaXRlcmFsPklTPC9saXRlcmFsPiBbIDxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4gXSA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiwKKzxsaXRlcmFsPklTPC9saXRlcmFsPiBbIDxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4gXSA8bGl0ZXJhbD5FTVBUWTwvbGl0ZXJhbD4sIFsKKzxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4gXSA8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+IFsgPGxpdGVyYWw+T0Y8L2xpdGVyYWw+IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTG9naWNhbCBvcGVyYXRvcnM6IDxsaXRlcmFsPk5PVDwvbGl0ZXJhbD48bGl0ZXJhbD5BTkQ8L2xpdGVyYWw+PGxpdGVyYWw+T1IKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgb3RoZXIgb3BlcmF0b3JzIHVzZWQgaW4gc3BlY2lmaWMgZXhwcmVzc2lvbnMuCisgICAgICAKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfYmV0d2VlbiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEJldHdlZW4gRXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHN5bnRheCBmb3IgdGhlIHVzZSBvZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBbIDxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4gXQorPGxpdGVyYWw+QkVUV0VFTjwvbGl0ZXJhbD4gaW4gYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorYXJpdGhtZXRpY19leHByZXNzaW9uIFtOT1RdIEJFVFdFRU4gYXJpdGhtZXRpY19leHByZXNzaW9uIEFORAorYXJpdGhtZXRpY19leHByZXNzaW9uIHwgc3RyaW5nX2V4cHJlc3Npb24gW05PVF0gQkVUV0VFTiBzdHJpbmdfZXhwcmVzc2lvbiBBTkQKK3N0cmluZ19leHByZXNzaW9uIHwgZGF0ZXRpbWVfZXhwcmVzc2lvbiBbTk9UXSBCRVRXRUVOIGRhdGV0aW1lX2V4cHJlc3Npb24gQU5ECitkYXRldGltZV9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIEJFVFdFRU4gZXhwcmVzc2lvbiA8cHJvZ3JhbWxpc3Rpbmc+eCBCRVRXRUVOIHkgQU5EIHo8L3Byb2dyYW1saXN0aW5nPiBpcworc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86IDxwcm9ncmFtbGlzdGluZz55ICZsdDs9IHggQU5EIHggJmx0Oz0gegorPC9wcm9ncmFtbGlzdGluZz4gVGhlIHJ1bGVzIGZvciB1bmtub3duIGFuZCA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiB2YWx1ZXMgaW4KK2NvbXBhcmlzb24gb3BlcmF0aW9ucyBhcHBseS4gU2VlIDx4cmVmIGxpbmtlbmQ9ImpwYV9sYW5ncmVmX251bGxfdmFsdWVzIi8+CisuIEV4YW1wbGVzIGFyZTogPHByb2dyYW1saXN0aW5nPnAuYWdlIEJFVFdFRU4gMTUgYW5kIDE5PC9wcm9ncmFtbGlzdGluZz4gaXMKK2VxdWl2YWxlbnQgdG8gPHByb2dyYW1saXN0aW5nPnAuYWdlICZndDs9IDE1IEFORCBwLmFnZSAmbHQ7PSAxOTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPHByb2dyYW1saXN0aW5nPnAuYWdlIE5PVCBCRVRXRUVOIDE1IGFuZCAxOTwvcHJvZ3JhbWxpc3Rpbmc+IGlzIGVxdWl2YWxlbnQgdG8KKzxwcm9ncmFtbGlzdGluZz5wLmFnZSAmbHQ7IDE1IE9SIHAuYWdlICZndDsgMTk8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9pbiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEluIEV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzeW50YXggZm9yIHRoZSB1c2Ugb2YgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgWyA8bGl0ZXJhbD5OT1Q8L2xpdGVyYWw+IF0KKzxsaXRlcmFsPklOPC9saXRlcmFsPiBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT5pbl9leHByZXNzaW9uIDo6PSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24KK1tOT1RdIElOICggaW5faXRlbSB7LCBpbl9pdGVtfSogfCBzdWJxdWVyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgoraW5faXRlbSA6Oj0gbGl0ZXJhbCB8IGlucHV0X3BhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gbXVzdCBoYXZlIGEgc3RyaW5nLCBudW1lcmljLCBvciBlbnVtIHZhbHVlLiBUaGUKK2xpdGVyYWwgYW5kL29yIGlucHV0X3BhcmFtZXRlciB2YWx1ZXMgbXVzdCBiZSBsaWtlIHRoZSBzYW1lIGFic3RyYWN0IHNjaGVtYSB0eXBlCitvZiB0aGUgc3RhdGVfZmllbGRfcGF0aF9leHByZXNzaW9uIGluIHR5cGUuIChTZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9sYW5ncmVmX2VxdWFsaXR5Ii8+ICkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHJlc3VsdHMgb2YgdGhlIHN1YnF1ZXJ5IG11c3QgYmUgbGlrZSB0aGUgc2FtZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiB0aGUKK3N0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbiBpbiB0eXBlLiBTdWJxdWVyaWVzIGFyZSBkaXNjdXNzZWQgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9sYW5ncmVmX3N1YnF1ZXJpZXMiLz4uIEV4YW1wbGVzIGFyZTogPHByb2dyYW1saXN0aW5nPm8uY291bnRyeSBJTiAoJ1VLJywgJ1VTJywgJ0ZyYW5jZScpCis8L3Byb2dyYW1saXN0aW5nPiBpcyB0cnVlIGZvciBVSyBhbmQgZmFsc2UgZm9yIFBlcnUsIGFuZCBpcyBlcXVpdmFsZW50IHRvIHRoZQorZXhwcmVzc2lvbjogPHByb2dyYW1saXN0aW5nPihvLmNvdW50cnkgPSAnVUsnKSBPUiAoby5jb3VudHJ5ID0gJ1VTJykgT1IgKG8uY291bnRyeSA9ICcgRnJhbmNlJykKKzwvcHJvZ3JhbWxpc3Rpbmc+IEluIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbjogPHByb2dyYW1saXN0aW5nPm8uY291bnRyeSBOT1QgSU4gKCdVSycsICdVUycsICdGcmFuY2UnKQorPC9wcm9ncmFtbGlzdGluZz4gaXMgZmFsc2UgZm9yIFVLIGFuZCB0cnVlIGZvciBQZXJ1LCBhbmQgaXMgZXF1aXZhbGVudCB0byB0aGUKK2V4cHJlc3Npb246IDxwcm9ncmFtbGlzdGluZz5OT1QgKChvLmNvdW50cnkgPSAnVUsnKSBPUiAoby5jb3VudHJ5ID0gJ1VTJykgT1IgKG8uY291bnRyeSA9ICdGcmFuY2UnKSkKKzwvcHJvZ3JhbWxpc3Rpbmc+IFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0Cit0aGF0IGRlZmluZXMgdGhlIHNldCBvZiB2YWx1ZXMgZm9yIHRoZSA8bGl0ZXJhbD5JTjwvbGl0ZXJhbD4gZXhwcmVzc2lvbi4gSWYgdGhlCit2YWx1ZSBvZiBhIHN0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbiBpbiBhbiA8bGl0ZXJhbD5JTjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+CitOT1QgSU48L2xpdGVyYWw+IGV4cHJlc3Npb24gaXMgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4gb3IgdW5rbm93biwgdGhlIHZhbHVlIG9mCit0aGUgZXhwcmVzc2lvbiBpcyB1bmtub3duLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9saWtlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgTGlrZSBFeHByZXNzaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc3ludGF4IGZvciB0aGUgdXNlIG9mIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdCis8bGl0ZXJhbD5MSUtFPC9saXRlcmFsPiBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitzdHJpbmdfZXhwcmVzc2lvbiBbTk9UXSBMSUtFIHBhdHRlcm5fdmFsdWUgW0VTQ0FQRSBlc2NhcGVfY2hhcmFjdGVyXQorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzdHJpbmdfZXhwcmVzc2lvbiBtdXN0IGhhdmUgYSBzdHJpbmcgdmFsdWUuIFRoZSBwYXR0ZXJuX3ZhbHVlIGlzIGEgc3RyaW5nCitsaXRlcmFsIG9yIGEgc3RyaW5nLXZhbHVlZCBpbnB1dCBwYXJhbWV0ZXIgaW4gd2hpY2ggYW4gdW5kZXJzY29yZSAoXykgc3RhbmRzIGZvcgorYW55IHNpbmdsZSBjaGFyYWN0ZXIsIGEgcGVyY2VudCAoJSkgY2hhcmFjdGVyIHN0YW5kcyBmb3IgYW55IHNlcXVlbmNlIG9mCitjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIGVtcHR5IHNlcXVlbmNlKSwgYW5kIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHN0YW5kIGZvcgordGhlbXNlbHZlcy4gVGhlIG9wdGlvbmFsIGVzY2FwZV9jaGFyYWN0ZXIgaXMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBsaXRlcmFsCitvciBhIGNoYXJhY3Rlci12YWx1ZWQgaW5wdXQgcGFyYW1ldGVyIChpLmUuLCBjaGFyIG9yIENoYXJhY3RlcikgYW5kIGlzIHVzZWQgdG8KK2VzY2FwZSB0aGUgc3BlY2lhbCBtZWFuaW5nIG9mIHRoZSB1bmRlcnNjb3JlIGFuZCBwZXJjZW50IGNoYXJhY3RlcnMgaW4KK3BhdHRlcm5fdmFsdWUuIEV4YW1wbGVzIGFyZToKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT48cHJvZ3JhbWxpc3Rpbmc+YWRkcmVzcy5waG9uZSBMSUtFICcxMiUzJworPC9wcm9ncmFtbGlzdGluZz4gaXMgdHJ1ZSBmb3IgJzEyMycgJzEyOTkzJyBhbmQgZmFsc2UgZm9yICcxMjM0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+YXNlbnRlbmNlLndvcmQgTElLRSAnbF9zZSc8L3Byb2dyYW1saXN0aW5nPiBpcyB0cnVlIGZvciAnbG9zZScKK2FuZCBmYWxzZSBmb3IgJ2xvb3NlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+YXdvcmQudW5kZXJzY29yZWQgTElLRSAnXF8lJyBFU0NBUEUgJ1wnPC9wcm9ncmFtbGlzdGluZz4gaXMgdHJ1ZQorZm9yICdfZm9vJyBhbmQgZmFsc2UgZm9yICdiYXInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxwcm9ncmFtbGlzdGluZz5hZGRyZXNzLnBob25lIE5PVCBMSUtFICcxMiUzJzwvcHJvZ3JhbWxpc3Rpbmc+IGlzIGZhbHNlIGZvcgorJzEyMycgYW5kICcxMjk5MycgYW5kIHRydWUgZm9yICcxMjM0JyBJZiB0aGUgdmFsdWUgb2YgdGhlIHN0cmluZ19leHByZXNzaW9uIG9yCitwYXR0ZXJuX3ZhbHVlIGlzIDxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+IG9yIHVua25vd24sIHRoZSB2YWx1ZSBvZiB0aGUgPGxpdGVyYWw+CitMSUtFPC9saXRlcmFsPiBleHByZXNzaW9uIGlzIHVua25vd24uIElmIHRoZSBlc2NhcGVfY2hhcmFjdGVyIGlzIHNwZWNpZmllZCBhbmQKK2lzIDxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+LCB0aGUgdmFsdWUgb2YgdGhlIDxsaXRlcmFsPkxJS0U8L2xpdGVyYWw+IGV4cHJlc3Npb24KK2lzIHVua25vd24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX251bGwiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBOdWxsIENvbXBhcmlzb24gRXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHN5bnRheCBmb3IgdGhlIHVzZSBvZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciA8bGl0ZXJhbD5JUyBOVUxMPC9saXRlcmFsPiBpbgorYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgore3NpbmdsZV92YWx1ZWRfcGF0aF9leHByZXNzaW9uIHwgaW5wdXRfcGFyYW1ldGVyIH0gSVMgW05PVF0gTlVMTAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0EgbnVsbCBjb21wYXJpc29uIGV4cHJlc3Npb24gdGVzdHMgd2hldGhlciBvciBub3QgdGhlIHNpbmdsZS12YWx1ZWQgcGF0aAorZXhwcmVzc2lvbiBvciBpbnB1dCBwYXJhbWV0ZXIgaXMgYSA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiB2YWx1ZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfZW1wdHlfY29tcCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEVtcHR5IENvbGxlY3Rpb24gQ29tcGFyaXNvbiBFeHByZXNzaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgc3ludGF4IGZvciB0aGUgdXNlIG9mIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIDxsaXRlcmFsPklTIEVNUFRZPC9saXRlcmFsPiBpbgorYW4gZW1wdHlfY29sbGVjdGlvbl9jb21wYXJpc29uX2V4cHJlc3Npb24gaXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+Citjb2xsZWN0aW9uX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gSVMgW05PVF0gRU1QVFkKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGlzIGV4cHJlc3Npb24gdGVzdHMgd2hldGhlciBvciBub3QgdGhlIGNvbGxlY3Rpb24gZGVzaWduYXRlZCBieSB0aGUKK2NvbGxlY3Rpb24tdmFsdWVkIHBhdGggZXhwcmVzc2lvbiBpcyBlbXB0eSAoaS5lLCBoYXMgbm8gZWxlbWVudHMpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHF1ZXJ5IHdpbGwgcmV0dXJuIGFsbCBtYWdhemluZXMgdGhhdCBkb24ndCBoYXZlIGFueQorYXJ0aWNsZXMgYXQgYWxsOiA8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIG1hZyBGUk9NIE1hZ2F6aW5lIG1hZyBXSEVSRSBtYWcuYXJ0aWNsZXMgSVMgRU1QVFkKKzwvcHJvZ3JhbWxpc3Rpbmc+IElmIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGVjdGlvbi12YWx1ZWQgcGF0aCBleHByZXNzaW9uIGluIGFuCitlbXB0eSBjb2xsZWN0aW9uIGNvbXBhcmlzb24gZXhwcmVzc2lvbiBpcyB1bmtub3duLCB0aGUgdmFsdWUgb2YgdGhlIGVtcHR5Citjb21wYXJpc29uIGV4cHJlc3Npb24gaXMgdW5rbm93bi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfY29sbGVjdGlvbl9tZW1iZXIiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBDb2xsZWN0aW9uIE1lbWJlciBFeHByZXNzaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgdXNlIG9mIHRoZSBjb21wYXJpc29uIGNvbGxlY3Rpb25fbWVtYmVyX2V4cHJlc3Npb24gaXMgYXMgZm9sbG93czogc3ludGF4IGZvcgordGhlIG9wZXJhdG9yIDxsaXRlcmFsPk1FTUJFUiBPRjwvbGl0ZXJhbD4gaW4gYW4gPGl0ZW1pemVkbGlzdD48bGlzdGl0ZW0+PHBhcmE+Citjb2xsZWN0aW9uX21lbWJlcl9leHByZXNzaW9uIDo6PSBlbnRpdHlfZXhwcmVzc2lvbiBbTk9UXSBNRU1CRVIgW09GXQorY29sbGVjdGlvbl92YWx1ZWRfcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2VudGl0eV9leHByZXNzaW9uIDo6PSBzaW5nbGVfdmFsdWVkX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbiB8CitzaW1wbGVfZW50aXR5X2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2ltcGxlX2VudGl0eV9leHByZXNzaW9uIDo6PSBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSB8IGlucHV0X3BhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgZXhwcmVzc2lvbiB0ZXN0cyB3aGV0aGVyIHRoZSBkZXNpZ25hdGVkIHZhbHVlIGlzIGEgbWVtYmVyIG9mIHRoZSBjb2xsZWN0aW9uCitzcGVjaWZpZWQgYnkgdGhlIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggZXhwcmVzc2lvbi4gSWYgdGhlIGNvbGxlY3Rpb24gdmFsdWVkCitwYXRoIGV4cHJlc3Npb24gZGVzaWduYXRlcyBhbiBlbXB0eSBjb2xsZWN0aW9uLCB0aGUgdmFsdWUgb2YgdGhlIDxsaXRlcmFsPgorTUVNQkVSIE9GPC9saXRlcmFsPiBleHByZXNzaW9uIGlzIDxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPiBhbmQgdGhlIHZhbHVlIG9mIHRoZQorPGxpdGVyYWw+Tk9UIE1FTUJFUiBPRjwvbGl0ZXJhbD4gZXhwcmVzc2lvbiBpcyA8bGl0ZXJhbD5UUlVFPC9saXRlcmFsPi4KK090aGVyd2lzZSwgaWYgdGhlIHZhbHVlIG9mIHRoZSBjb2xsZWN0aW9uLXZhbHVlZCBwYXRoIGV4cHJlc3Npb24gb3IKK3NpbmdsZS12YWx1ZWQgYXNzb2NpYXRpb24tZmllbGQgcGF0aCBleHByZXNzaW9uIGluIHRoZSBjb2xsZWN0aW9uIG1lbWJlcgorZXhwcmVzc2lvbiBpcyA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiBvciB1bmtub3duLCB0aGUgdmFsdWUgb2YgdGhlIGNvbGxlY3Rpb24KK21lbWJlciBleHByZXNzaW9uIGlzIHVua25vd24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2V4aXN0cyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEV4aXN0cyBFeHByZXNzaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBbiA8bGl0ZXJhbD5FWElTVFM8L2xpdGVyYWw+IGV4cHJlc3Npb24gaXMgYSBwcmVkaWNhdGUgdGhhdCBpcyB0cnVlIG9ubHkgaWYgdGhlCityZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHZhbHVlcyBhbmQgdGhhdCBpcyBmYWxzZQorb3RoZXJ3aXNlLiBUaGUgc3ludGF4IG9mIGFuIGV4aXN0cyBleHByZXNzaW9uIGlzIDxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPgorZXhpc3RzX2V4cHJlc3Npb24gOjo9IFtOT1RdIEVYSVNUUyAoc3VicXVlcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHVzZSBvZiB0aGUgcmVzZXJ2ZWQgd29yZCBPRiBpcyBvcHRpb25hbCBpbiB0aGlzIGV4cHJlc3Npb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorRXhhbXBsZTogPHByb2dyYW1saXN0aW5nPlNFTEVDVCBESVNUSU5DVCBhdXRoIEZST00gQXV0aG9yIGF1dGgKKyAgICBXSEVSRSBFWElTVFMKKyAgICAgICAgKFNFTEVDVCBzcG91c2VBdXRob3IgRlJPTSBBdXRob3Igc3BvdXNlQXV0aG9yIFdIRVJFIHNwb3VzZUF1dGhvciA9IGF1dGguc3BvdXNlKQorPC9wcm9ncmFtbGlzdGluZz4gVGhlIHJlc3VsdCBvZiB0aGlzIHF1ZXJ5IGNvbnNpc3RzIG9mIGFsbCBhdXRob3JzIHdob3NlIHNwb3VzZQoraXMgYWxzbyBhbiBhdXRob3IuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2FsbF9hbnkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBBbGwgb3IgQW55IEV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FuIDxsaXRlcmFsPkFMTDwvbGl0ZXJhbD4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBhIHByZWRpY2F0ZSB0aGF0IGlzIHRydWUgaWYKK3RoZSBjb21wYXJpc29uIG9wZXJhdGlvbiBpcyB0cnVlIGZvciBhbGwgdmFsdWVzIGluIHRoZSByZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5IG9yCit0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBpcyBlbXB0eS4gQW4gPGxpdGVyYWw+QUxMPC9saXRlcmFsPiBjb25kaXRpb25hbAorZXhwcmVzc2lvbiBpcyBmYWxzZSBpZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIGZhbHNlIGZvciBhdCBsZWFzdCBvbmUKK3JvdywgYW5kIGlzIHVua25vd24gaWYgbmVpdGhlciB0cnVlIG5vciBmYWxzZS4gQW4gPGxpdGVyYWw+QU5ZPC9saXRlcmFsPgorY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBhIHByZWRpY2F0ZSB0aGF0IGlzIHRydWUgaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0aW9uCitpcyB0cnVlIGZvciBzb21lIHZhbHVlIGluIHRoZSByZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5LiBBbiA8bGl0ZXJhbD5BTlk8L2xpdGVyYWw+Citjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGZhbHNlIGlmIHRoZSByZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5IGlzIGVtcHR5IG9yIGlmIHRoZQorY29tcGFyaXNvbiBvcGVyYXRpb24gaXMgZmFsc2UgZm9yIGV2ZXJ5IHZhbHVlIGluIHRoZSByZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5LCBhbmQKK2lzIHVua25vd24gaWYgbmVpdGhlciB0cnVlIG5vciBmYWxzZS4gVGhlIGtleXdvcmQgPGxpdGVyYWw+U09NRTwvbGl0ZXJhbD4gaXMKK3N5bm9ueW1vdXMgd2l0aCA8bGl0ZXJhbD5BTlk8L2xpdGVyYWw+LiBUaGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgdXNlZCB3aXRoCis8bGl0ZXJhbD5BTEw8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkFOWTwvbGl0ZXJhbD4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgYXJlID0sCismbHQ7LCAmbHQ7PSwgJmd0OywgJmd0Oz0sICZsdDsmZ3Q7LiBUaGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBtdXN0IGJlIGxpa2UgdGhhdAorb2YgdGhlIG90aGVyIGFyZ3VtZW50IHRvIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGluIHR5cGUuIFNlZQorPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfZXF1YWxpdHkiLz4uIFRoZSBzeW50YXggb2YgYW4gPGxpdGVyYWw+QUxMCis8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkFOWTwvbGl0ZXJhbD4gZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQgYXMgZm9sbG93czoKKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPmFsbF9vcl9hbnlfZXhwcmVzc2lvbiA6Oj0geyBBTEwgfCBBTlkgfCBTT01FfQorKHN1YnF1ZXJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZWxlY3QgdGhlIGF1dGhvcnMgd2hvIG1ha2UgdGhlIGhpZ2hlc3Qgc2FsYXJ5IGZvciB0aGVpcgorbWFnYXppbmU6IDxwcm9ncmFtbGlzdGluZz5TRUxFQ1QgYXV0aCBGUk9NIEF1dGhvciBhdXRoCisgICAgV0hFUkUgYXV0aC5zYWxhcnkgJmd0Oz0gQUxMKFNFTEVDVCBhLnNhbGFyeSBGUk9NIEF1dGhvciBhIFdIRVJFIGEubWFnYXppbmUgPSBhdXRoLm1hZ2F6aW5lKQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfc3VicXVlcmllcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIFN1YnF1ZXJpZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorU3VicXVlcmllcyBtYXkgYmUgdXNlZCBpbiB0aGUgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkhBVklORworPC9saXRlcmFsPiBjbGF1c2UuIFRoZSBzeW50YXggZm9yIHN1YnF1ZXJpZXMgaXMgYXMgZm9sbG93czogPGl0ZW1pemVkbGlzdD4KKzxsaXN0aXRlbT48cGFyYT5zdWJxdWVyeSA6Oj0gc2ltcGxlX3NlbGVjdF9jbGF1c2Ugc3VicXVlcnlfZnJvbV9jbGF1c2UKK1t3aGVyZV9jbGF1c2VdIFtncm91cGJ5X2NsYXVzZV0gW2hhdmluZ19jbGF1c2VdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorU3VicXVlcmllcyBhcmUgcmVzdHJpY3RlZCB0byB0aGUgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5IQVZJTkcKKzwvbGl0ZXJhbD4gY2xhdXNlcyBpbiB0aGlzIHJlbGVhc2UuIFN1cHBvcnQgZm9yIHN1YnF1ZXJpZXMgaW4gdGhlIDxsaXRlcmFsPkZST00KKzwvbGl0ZXJhbD4gY2xhdXNlIHdpbGwgYmUgY29uc2lkZXJlZCBpbiBhIGxhdGVyIHJlbGVhc2Ugb2YgdGhlIHNwZWNpZmljYXRpb24uCis8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT5zaW1wbGVfc2VsZWN0X2NsYXVzZSA6Oj0gU0VMRUNUIFtESVNUSU5DVF0KK3NpbXBsZV9zZWxlY3RfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzdWJxdWVyeV9mcm9tX2NsYXVzZSA6Oj0gRlJPTSBzdWJzZWxlY3RfaWRlbnRpZmljYXRpb25fdmFyaWFibGVfZGVjbGFyYXRpb24geywKK3N1YnNlbGVjdF9pZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbn0qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3N1YnNlbGVjdF9pZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbiA6Oj0KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIHwgYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIFtBU10KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlIHwgY29sbGVjdGlvbl9tZW1iZXJfZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2ltcGxlX3NlbGVjdF9leHByZXNzaW9uIDo6PSBzaW5nbGVfdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8CithZ2dyZWdhdGVfZXhwcmVzc2lvbiB8IGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorRXhhbXBsZXM6IDxwcm9ncmFtbGlzdGluZz5TRUxFQ1QgRElTVElOQ1QgYXV0aCBGUk9NIEF1dGhvciBhdXRoCisgICAgV0hFUkUgRVhJU1RTIChTRUxFQ1Qgc3BvdXNlQXV0aCBGUk9NIEF1dGhvciBzcG91c2VBdXRoIFdIRVJFIHNwb3VzZUF1dGggPSBhdXRoLnNwb3VzZSkKKzwvcHJvZ3JhbWxpc3Rpbmc+PHByb2dyYW1saXN0aW5nPlNFTEVDVCBtYWcgRlJPTSBNYWdhemluZSBtYWcKKyAgICBXSEVSRSAoU0VMRUNUIENPVU5UKGFydCkgRlJPTSBtYWcuYXJ0aWNsZXMgYXJ0KSAmZ3Q7IDEwPC9wcm9ncmFtbGlzdGluZz4KK05vdGUgdGhhdCBzb21lIGNvbnRleHRzIGluIHdoaWNoIGEgc3VicXVlcnkgY2FuIGJlIHVzZWQgcmVxdWlyZSB0aGF0IHRoZQorc3VicXVlcnkgYmUgYSBzY2FsYXIgc3VicXVlcnkgKGkuZS4sIHByb2R1Y2UgYSBzaW5nbGUgcmVzdWx0KS4gVGhpcyBpcworaWxsdXN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGludm9sdmluZyBhIG51bWVyaWMgY29tcGFyaXNvbiBvcGVyYXRpb24uCis8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIGdvb2RQdWJsaXNoZXIgRlJPTSBQdWJsaXNoZXIgZ29vZFB1Ymxpc2hlcgorICAgIFdIRVJFIGdvb2RQdWJsaXNoZXIucmV2ZW51ZSAmbHQ7IChTRUxFQ1QgQVZHKHAucmV2ZW51ZSkgRlJPTSBQdWJsaXNoZXIgcCkKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2Z1bmN0aW9uYWwiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBGdW5jdGlvbmFsIEV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBKUFFMIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgYnVpbHQtaW4gZnVuY3Rpb25zLCB3aGljaCBtYXkgYmUgdXNlZCBpbiB0aGUKKzxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+IGNsYXVzZSBvZiBhIHF1ZXJ5LiBJZiB0aGUKK3ZhbHVlIG9mIGFueSBhcmd1bWVudCB0byBhIGZ1bmN0aW9uYWwgZXhwcmVzc2lvbiBpcyBudWxsIG9yIHVua25vd24sIHRoZSB2YWx1ZQorb2YgdGhlIGZ1bmN0aW9uYWwgZXhwcmVzc2lvbiBpcyB1bmtub3duLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfc3RyaW5nX2Z1biI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwgU3RyaW5nIEZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPmZ1bmN0aW9uc19yZXR1cm5pbmdfc3RyaW5ncyA6Oj0KK0NPTkNBVChzdHJpbmdfcHJpbWFyIHksIHN0cmluZ19wcmltYXJ5KSB8IFNVQlNUUklORyhzdHJpbmdfcHJpbWFyIHksCitzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uLCBzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uKSB8CitUUklNKFtbdHJpbV9zcGVjaWZpY2F0aW9uXSBbdHJpbV9jaGFyYWN0ZXJdIEZST01dIHN0cmluZ19wcmltYXJ5KSB8CitMT1dFUihzdHJpbmdfcHJpbWFyIHkpIHwgVVBQRVIoc3RyaW5nX3ByaW1hciB5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgordHJpbV9zcGVjaWZpY2F0aW9uIDo6PSBMRUFESU5HIHwgVFJBSUxJTkcgfCBCT1RICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitmdW5jdGlvbnNfcmV0dXJuaW5nX251bWVyaWNzIDo6PSBMRU5HVEgoc3RyaW5nX3ByaW1hciB5KSB8IExPQ0FURShzdHJpbmdfcHJpbWFyCit5LCBzdHJpbmdfcHJpbWFyIHlbLCBzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5DT05DQVQ8L2xpdGVyYWw+IGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBhIGNvbmNhdGVuYXRpb24KK29mIGl0cyBhcmd1bWVudHMuIFRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50cyBvZiB0aGUgPGxpdGVyYWw+U1VCU1RSSU5HCis8L2xpdGVyYWw+IGZ1bmN0aW9uIGRlbm90ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gYW5kIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIHRvCitiZSByZXR1cm5lZC4gVGhlc2UgYXJndW1lbnRzIGFyZSBpbnRlZ2Vycy4gVGhlIGZpcnN0IHBvc2l0aW9uIG9mIGEgc3RyaW5nIGlzCitkZW5vdGVkIGJ5IDEuIFRoZSA8bGl0ZXJhbD5TVUJTVFJJTkc8L2xpdGVyYWw+IGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcuIFRoZQorPGxpdGVyYWw+VFJJTTwvbGl0ZXJhbD4gZnVuY3Rpb24gdHJpbXMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZnJvbSBhIHN0cmluZy4gSWYKK3RoZSBjaGFyYWN0ZXIgdG8gYmUgdHJpbW1lZCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHNwYWNlIChvcgorYmxhbmspLiBUaGUgb3B0aW9uYWwgdHJpbV9jaGFyYWN0ZXIgaXMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBsaXRlcmFsIG9yIGEKK2NoYXJhY3Rlci12YWx1ZWQgaW5wdXQgcGFyYW1ldGVyIChpLmUuLCBjaGFyIG9yIENoYXJhY3RlcikuIElmIGEgdHJpbQorc3BlY2lmaWNhdGlvbiBpcyBub3QgcHJvdmlkZWQsIDxsaXRlcmFsPkJPVEg8L2xpdGVyYWw+IGlzIGFzc3VtZWQuIFRoZSA8bGl0ZXJhbD4KK1RSSU08L2xpdGVyYWw+IGZ1bmN0aW9uIHJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLiBUaGUgPGxpdGVyYWw+TE9XRVI8L2xpdGVyYWw+CithbmQgPGxpdGVyYWw+VVBQRVI8L2xpdGVyYWw+IGZ1bmN0aW9ucyBjb252ZXJ0IGEgc3RyaW5nIHRvIGxvd2VyIGFuZCB1cHBlciBjYXNlLAorcmVzcGVjdGl2ZWx5LiBUaGV5IHJldHVybiBhIHN0cmluZy4gVGhlIDxsaXRlcmFsPkxPQ0FURTwvbGl0ZXJhbD4gZnVuY3Rpb24KK3JldHVybnMgdGhlIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gc3RyaW5nIHdpdGhpbiBhIHN0cmluZywgc3RhcnRpbmcgdGhlIHNlYXJjaCBhdCBhCitzcGVjaWZpZWQgcG9zaXRpb24uIEl0IHJldHVybnMgdGhlIGZpcnN0IHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBzdHJpbmcgd2FzIGZvdW5kCithcyBhbiBpbnRlZ2VyLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHN0cmluZyB0byBiZSBsb2NhdGVkOyB0aGUgc2Vjb25kCithcmd1bWVudCBpcyB0aGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkOyB0aGUgb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaXMgYW4gaW50ZWdlcgordGhhdCByZXByZXNlbnRzIHRoZSBzdHJpbmcgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHNlYXJjaCBpcyBzdGFydGVkIChieSBkZWZhdWx0LAordGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkKS4gVGhlIGZpcnN0IHBvc2l0aW9uIGluIGEgc3RyaW5nIGlzCitkZW5vdGVkIGJ5IDEuIElmIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kLCAwIGlzIHJldHVybmVkLiBUaGUgPGxpdGVyYWw+TEVOR1RICis8L2xpdGVyYWw+IGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGNoYXJhY3RlcnMgYXMgYW4KK2ludGVnZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2FyaXRobWV0aWMiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICBKUFFMIEFyaXRobWV0aWMgRnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGl0ZW1pemVkbGlzdD48bGlzdGl0ZW0+PHBhcmE+ZnVuY3Rpb25zX3JldHVybmluZ19udW1lcmljcyA6Oj0KK0FCUyhzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uKSB8IFNRUlQoc2ltcGxlX2FyaXRobWV0aWNfZXhwcmVzc2lvbikgfAorTU9EKHNpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24sIHNpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24pIHwKK1NJWkUoY29sbGVjdGlvbl92YWx1ZWRfcGF0aF9leHByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPkFCUzwvbGl0ZXJhbD4gZnVuY3Rpb24gdGFrZXMgYSBudW1lcmljIGFyZ3VtZW50IGFuZCByZXR1cm5zIGEKK251bWJlciAoaW50ZWdlciwgZmxvYXQsIG9yIGRvdWJsZSkgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgYXJndW1lbnQgdG8gdGhlCitmdW5jdGlvbi4gVGhlIDxsaXRlcmFsPlNRUlQ8L2xpdGVyYWw+IGZ1bmN0aW9uIHRha2VzIGEgbnVtZXJpYyBhcmd1bWVudCBhbmQKK3JldHVybnMgYSBkb3VibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitOb3RlIHRoYXQgbm90IGFsbCBkYXRhYmFzZXMgc3VwcG9ydCB0aGUgdXNlIG9mIGEgdHJpbSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiB0aGUKK3NwYWNlIGNoYXJhY3RlcjsgdXNlIG9mIHRoaXMgYXJndW1lbnQgbWF5IHJlc3VsdCBpbiBxdWVyaWVzIHRoYXQgYXJlIG5vdAorcG9ydGFibGUuIE5vdGUgdGhhdCBub3QgYWxsIGRhdGFiYXNlcyBzdXBwb3J0IHRoZSB1c2Ugb2YgdGhlIHRoaXJkIGFyZ3VtZW50IHRvCis8bGl0ZXJhbD5MT0NBVEU8L2xpdGVyYWw+OyB1c2Ugb2YgdGhpcyBhcmd1bWVudCBtYXkgcmVzdWx0IGluIHF1ZXJpZXMgdGhhdCBhcmUKK25vdCBwb3J0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5NT0Q8L2xpdGVyYWw+IGZ1bmN0aW9uIHRha2VzIHR3byBpbnRlZ2VyIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhbgoraW50ZWdlci4gVGhlIDxsaXRlcmFsPlNJWkU8L2xpdGVyYWw+IGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSwgdGhlCitudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LCB0aGUgPGxpdGVyYWw+CitTSVpFPC9saXRlcmFsPiBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gemVyby4gTnVtZXJpYyBhcmd1bWVudHMgdG8gdGhlc2UgZnVuY3Rpb25zCittYXkgY29ycmVzcG9uZCB0byB0aGUgbnVtZXJpYyBKYXZhIG9iamVjdCB0eXBlcyBhcyB3ZWxsIGFzIHRoZSBwcmltaXRpdmUgbnVtZXJpYwordHlwZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2RhdGV0aW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgSlBRTCBEYXRldGltZSBGdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitmdW5jdGlvbnNfcmV0dXJuaW5nX2RhdGV0aW1lOj0gQ1VSUkVOVF9EQVRFIHwgQ1VSUkVOVF9USU1FIHwgQ1VSUkVOVF9USU1FU1RBTVAKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBkYXRldGltZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSB2YWx1ZSBvZiBjdXJyZW50IGRhdGUsIHRpbWUsIGFuZCB0aW1lc3RhbXAgb24KK3RoZSBkYXRhYmFzZSBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2dyb3VwIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBKUFFMIEdST1VQIEJZLCBIQVZJTkcKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5HUk9VUCBCWTwvbGl0ZXJhbD4gY29uc3RydWN0IGVuYWJsZXMgdGhlIGFnZ3JlZ2F0aW9uIG9mIHZhbHVlcworYWNjb3JkaW5nIHRvIGEgc2V0IG9mIHByb3BlcnRpZXMuIFRoZSA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+IGNvbnN0cnVjdAorZW5hYmxlcyBjb25kaXRpb25zIHRvIGJlIHNwZWNpZmllZCB0aGF0IGZ1cnRoZXIgcmVzdHJpY3QgdGhlIHF1ZXJ5IHJlc3VsdC4gU3VjaAorY29uZGl0aW9ucyBhcmUgcmVzdHJpY3Rpb25zIHVwb24gdGhlIGdyb3Vwcy4gVGhlIHN5bnRheCBvZiB0aGUgPGxpdGVyYWw+R1JPVVAKK0JZPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+SEFWSU5HPC9saXRlcmFsPiBjbGF1c2VzIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPmdyb3VwYnlfY2xhdXNlIDo6PSBHUk9VUCBCWSBncm91cGJ5X2l0ZW0geywKK2dyb3VwYnlfaXRlbX0qCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZ3JvdXBieV9pdGVtIDo6PSBzaW5nbGVfdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8IGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgoraGF2aW5nX2NsYXVzZSA6Oj0gSEFWSU5HIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSWYgYSBxdWVyeSBjb250YWlucyBib3RoIGEgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IGNsYXVzZSBhbmQgYSA8bGl0ZXJhbD5HUk9VUAorQlk8L2xpdGVyYWw+IGNsYXVzZSwgdGhlIGVmZmVjdCBpcyB0aGF0IG9mIGZpcnN0IGFwcGx5aW5nIHRoZSB3aGVyZSBjbGF1c2UsIGFuZAordGhlbiBmb3JtaW5nIHRoZSBncm91cHMgYW5kIGZpbHRlcmluZyB0aGVtIGFjY29yZGluZyB0byB0aGUgPGxpdGVyYWw+SEFWSU5HCis8L2xpdGVyYWw+IGNsYXVzZS4gVGhlIDxsaXRlcmFsPkhBVklORzwvbGl0ZXJhbD4gY2xhdXNlIGNhdXNlcyB0aG9zZSBncm91cHMgdG8KK2JlIHJldGFpbmVkIHRoYXQgc2F0aXNmeSB0aGUgY29uZGl0aW9uIG9mIHRoZSA8bGl0ZXJhbD5IQVZJTkc8L2xpdGVyYWw+IGNsYXVzZS4KK1RoZSByZXF1aXJlbWVudHMgZm9yIHRoZSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGNsYXVzZSB3aGVuIDxsaXRlcmFsPkdST1VQCitCWTwvbGl0ZXJhbD4gaXMgdXNlZCBmb2xsb3cgdGhvc2Ugb2YgU1FMOiBuYW1lbHksIGFueSBpdGVtIHRoYXQgYXBwZWFycyBpbiB0aGUKKzxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gY2xhdXNlIChvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHRvIGFuIGFnZ3JlZ2F0ZQorZnVuY3Rpb24pIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlIDxsaXRlcmFsPkdST1VQIEJZPC9saXRlcmFsPiBjbGF1c2UuIEluIGZvcm1pbmcKK3RoZSBncm91cHMsIG51bGwgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHRoZSBzYW1lIGZvciBncm91cGluZyBwdXJwb3Nlcy4gR3JvdXBpbmcKK2J5IGFuIGVudGl0eSBpcyBwZXJtaXR0ZWQuIEluIHRoaXMgY2FzZSwgdGhlIGVudGl0eSBtdXN0IGNvbnRhaW4gbm8gc2VyaWFsaXplZAorc3RhdGUgZmllbGRzIG9yIGxvYi12YWx1ZWQgc3RhdGUgZmllbGRzLiBUaGUgPGxpdGVyYWw+SEFWSU5HPC9saXRlcmFsPiBjbGF1c2UKK211c3Qgc3BlY2lmeSBzZWFyY2ggY29uZGl0aW9ucyBvdmVyIHRoZSBncm91cGluZyBpdGVtcyBvciBhZ2dyZWdhdGUgZnVuY3Rpb25zCit0aGF0IGFwcGx5IHRvIGdyb3VwaW5nIGl0ZW1zLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitJZiB0aGVyZSBpcyBubyA8bGl0ZXJhbD5HUk9VUCBCWTwvbGl0ZXJhbD4gY2xhdXNlIGFuZCB0aGUgPGxpdGVyYWw+SEFWSU5HCis8L2xpdGVyYWw+IGNsYXVzZSBpcyB1c2VkLCB0aGUgcmVzdWx0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgZ3JvdXAsIGFuZCB0aGUKK3NlbGVjdCBsaXN0IGNhbiBvbmx5IGNvbnNpc3Qgb2YgYWdncmVnYXRlIGZ1bmN0aW9ucy4gV2hlbiBhIHF1ZXJ5IGRlY2xhcmVzIGEKKzxsaXRlcmFsPkhBVklORzwvbGl0ZXJhbD4gY2xhdXNlLCBpdCBtdXN0IGFsd2F5cyBhbHNvIGRlY2xhcmUgYSA8bGl0ZXJhbD5HUk9VUAorQlk8L2xpdGVyYWw+IGNsYXVzZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfc2VsZWN0X2NsYXVzZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSlBRTCBTRUxFQ1QgQ2xhdXNlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBjbGF1c2UgZGVub3RlcyB0aGUgcXVlcnkgcmVzdWx0LiBNb3JlIHRoYW4gb25lCit2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBjbGF1c2Ugb2YgYSBxdWVyeS4gVGhlCis8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGNsYXVzZSBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nCitlbGVtZW50czogYSBzaW5nbGUgcmFuZ2UgdmFyaWFibGUgb3IgaWRlbnRpZmljYXRpb24gdmFyaWFibGUgdGhhdCByYW5nZXMgb3ZlciBhbgorZW50aXR5IGFic3RyYWN0IHNjaGVtYSB0eXBlLCBhIHNpbmdsZS12YWx1ZWQgcGF0aCBleHByZXNzaW9uLCBhbiBhZ2dyZWdhdGUKK3NlbGVjdCBleHByZXNzaW9uLCBhIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uIFRoZSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+CitjbGF1c2UgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT5zZWxlY3RfY2xhdXNlIDo6PSBTRUxFQ1QgW0RJU1RJTkNUXQorc2VsZWN0X2V4cHJlc3Npb24geywgc2VsZWN0X2V4cHJlc3Npb259KgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NlbGVjdF9leHByZXNzaW9uIDo6PSBzaW5nbGVfdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8IGFnZ3JlZ2F0ZV9leHByZXNzaW9uIHwKK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlIHwgT0JKRUNUKGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKSB8Citjb25zdHJ1Y3Rvcl9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uc3RydWN0b3JfZXhwcmVzc2lvbiA6Oj0gTkVXIGNvbnN0cnVjdG9yX25hbWUgKCBjb25zdHJ1Y3Rvcl9pdGVtIHssCitjb25zdHJ1Y3Rvcl9pdGVtfSopCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uc3RydWN0b3JfaXRlbSA6Oj0gc2luZ2xlX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gfCBhZ2dyZWdhdGVfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2FnZ3JlZ2F0ZV9leHByZXNzaW9uIDo6PSB7IEFWRyB8IE1BWCB8IE1JTiB8IFNVTSB9IChbRElTVElOQ1RdCitzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24pIHwgQ09VTlQgKFtESVNUSU5DVF0gaWRlbnRpZmljYXRpb25fdmFyaWFibGUgfAorc3RhdGVfZmllbGRfcGF0aF9leHByZXNzaW9uIHwgc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0ZvciBleGFtcGxlOiA8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIHB1Yi5pZCwgcHViLnJldmVudWUKKyAgICBGUk9NIFB1Ymxpc2hlciBwdWIgSk9JTiBwdWIubWFnYXppbmVzIG1hZyBXSEVSRSBtYWcucHJpY2UgJmd0OyA1LjAwCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitOb3RlIHRoYXQgdGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gY2xhdXNlIG11c3QgYmUgc3BlY2lmaWVkIHRvIHJldHVybiBvbmx5CitzaW5nbGUtdmFsdWVkIGV4cHJlc3Npb25zLiBUaGUgcXVlcnkgYmVsb3cgaXMgdGhlcmVmb3JlIG5vdCB2YWxpZDoKKzxwcm9ncmFtbGlzdGluZz5TRUxFQ1QgbWFnLmF1dGhvcnMgRlJPTSBNYWdhemluZSBBUyBtYWc8L3Byb2dyYW1saXN0aW5nPiBUaGUKKzxsaXRlcmFsPkRJU1RJTkNUPC9saXRlcmFsPiBrZXl3b3JkIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0IGR1cGxpY2F0ZSB2YWx1ZXMKK211c3QgYmUgZWxpbWluYXRlZCBmcm9tIHRoZSBxdWVyeSByZXN1bHQuIElmIDxsaXRlcmFsPkRJU1RJTkNUPC9saXRlcmFsPiBpcyBub3QKK3NwZWNpZmllZCwgZHVwbGljYXRlIHZhbHVlcyBhcmUgbm90IGVsaW1pbmF0ZWQuIFN0YW5kYWxvbmUgaWRlbnRpZmljYXRpb24KK3ZhcmlhYmxlcyBpbiB0aGUgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBjbGF1c2UgbWF5IG9wdGlvbmFsbHkgYmUgcXVhbGlmaWVkIGJ5Cit0aGUgPGxpdGVyYWw+T0JKRUNUPC9saXRlcmFsPiBvcGVyYXRvci4gVGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gY2xhdXNlCittdXN0IG5vdCB1c2UgdGhlIE9CSkVDVCBvcGVyYXRvciB0byBxdWFsaWZ5IHBhdGggZXhwcmVzc2lvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfcmVzdWx0dHlwZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIFJlc3VsdCBUeXBlIG9mIHRoZSBTRUxFQ1QgQ2xhdXNlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSB0eXBlIG9mIHRoZSBxdWVyeSByZXN1bHQgc3BlY2lmaWVkIGJ5IHRoZSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGNsYXVzZQorb2YgYSBxdWVyeSBpcyBhbiBlbnRpdHkgYWJzdHJhY3Qgc2NoZW1hIHR5cGUsIGEgc3RhdGUtZmllbGQgdHlwZSwgdGhlIHJlc3VsdCBvZgorYW4gYWdncmVnYXRlIGZ1bmN0aW9uLCB0aGUgcmVzdWx0IG9mIGEgY29uc3RydWN0aW9uIG9wZXJhdGlvbiwgb3Igc29tZSBzZXF1ZW5jZQorb2YgdGhlc2UuIFRoZSByZXN1bHQgdHlwZSBvZiB0aGUgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBjbGF1c2UgaXMgZGVmaW5lZCBieQordGhlIHRoZSByZXN1bHQgdHlwZXMgb2YgdGhlIHNlbGVjdF9leHByZXNzaW9ucyBjb250YWluZWQgaW4gaXQuIFdoZW4gbXVsdGlwbGUKK3NlbGVjdF9leHByZXNzaW9ucyBhcmUgdXNlZCBpbiB0aGUgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBjbGF1c2UsIHRoZSByZXN1bHQKK29mIHRoZSBxdWVyeSBpcyBvZiB0eXBlIE9iamVjdFtdLCBhbmQgdGhlIGVsZW1lbnRzIGluIHRoaXMgcmVzdWx0IGNvcnJlc3BvbmQgaW4KK29yZGVyIHRvIHRoZSBvcmRlciBvZiB0aGVpciBzcGVjaWZpY2F0aW9uIGluIHRoZSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+CitjbGF1c2UgYW5kIGluIHR5cGUgdG8gdGhlIHJlc3VsdCB0eXBlcyBvZiBlYWNoIG9mIHRoZSBzZWxlY3RfZXhwcmVzc2lvbnMuIFRoZQordHlwZSBvZiB0aGUgcmVzdWx0IG9mIGEgc2VsZWN0X2V4cHJlc3Npb24gaXMgYXMgZm9sbG93czogPGl0ZW1pemVkbGlzdD4KKzxsaXN0aXRlbT48cGFyYT4gQSBzaW5nbGVfdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB0aGF0IGlzIGEKK3N0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbiByZXN1bHRzIGluIGFuIG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZQorY29ycmVzcG9uZGluZyBzdGF0ZSBmaWVsZCBvZiB0aGUgZW50aXR5LiBJZiB0aGUgc3RhdGUgZmllbGQgb2YgdGhlIGVudGl0eSBpcyBhCitwcmltaXRpdmUgdHlwZSwgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0IHR5cGUgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NpbmdsZV92YWx1ZWRfcGF0aF9leHByZXNzaW9uIHRoYXQgaXMgYQorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24gcmVzdWx0cyBpbiBhbiBlbnRpdHkgb2JqZWN0IG9mIHRoZQordHlwZSBvZiB0aGUgcmVsYXRpb25zaGlwIGZpZWxkIG9yIHRoZSBzdWJ0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAgZmllbGQgb2YgdGhlCitlbnRpdHkgb2JqZWN0IGFzIGRldGVybWluZWQgYnkgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSByZXN1bHQgdHlwZSBvZiBhbiBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSBpcyB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIHdoaWNoCit0aGF0IGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIGNvcnJlc3BvbmRzIG9yIGEgc3VidHlwZSBhcyBkZXRlcm1pbmVkIGJ5IHRoZQorb2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHJlc3VsdCB0eXBlIG9mIGFnZ3JlZ2F0ZV9leHByZXNzaW9uIGlzIGRlZmluZWQgaW4gc2VjdGlvbgorPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfYWdncmVnYXRlcyIvPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIHJlc3VsdCB0eXBlIG9mIGEgY29uc3RydWN0b3JfZXhwcmVzc2lvbiBpcyB0aGUgdHlwZSBvZiB0aGUgY2xhc3MgZm9yIHdoaWNoCit0aGUgY29uc3RydWN0b3IgaXMgZGVmaW5lZC4gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yIGFyZQorZGVmaW5lZCBieSB0aGUgYWJvdmUgcnVsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2NvbnN0cnVjdG9yIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQUUwgQ29uc3RydWN0b3IgRXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgoraW4gdGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gQ2xhdXNlIEEgY29uc3RydWN0b3IgbWF5IGJlIHVzZWQgaW4gdGhlCis8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGxpc3QgdG8gcmV0dXJuIG9uZSBvciBtb3JlIEphdmEgaW5zdGFuY2VzLiBUaGUKK3NwZWNpZmllZCBjbGFzcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgYW4gZW50aXR5IG9yIHRvIGJlIG1hcHBlZCB0byB0aGUgZGF0YWJhc2UuCitUaGUgY29uc3RydWN0b3IgbmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiBhbiBlbnRpdHkgY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxsaXRlcmFsPlNFTEVDVCBORVc8L2xpdGVyYWw+CitjbGF1c2UsIHRoZSByZXN1bHRpbmcgZW50aXR5IGluc3RhbmNlcyBhcmUgaW4gdGhlIG5ldyBzdGF0ZS4gPHByb2dyYW1saXN0aW5nPlNFTEVDVCBORVcgY29tLmNvbXBhbnkuUHVibGlzaGVySW5mbyhwdWIuaWQsIHB1Yi5yZXZlbnVlLCBtYWcucHJpY2UpCisgICAgRlJPTSBQdWJsaXNoZXIgcHViIEpPSU4gcHViLm1hZ2F6aW5lcyBtYWcgV0hFUkUgbWFnLnByaWNlICZndDsgNS4wMAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfbnVsbF9zZWxlY3QiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSlBRTCBOdWxsIFZhbHVlcyBpbiB0aGUgUXVlcnkgUmVzdWx0CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIHRoZSByZXN1bHQgb2YgYSBxdWVyeSBjb3JyZXNwb25kcyB0byBhIGFzc29jaWF0aW9uLWZpZWxkIG9yIHN0YXRlLWZpZWxkIHdob3NlCit2YWx1ZSBpcyBudWxsLCB0aGF0IG51bGwgdmFsdWUgaXMgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgbWV0aG9kLgorVGhlIDxsaXRlcmFsPklTIE5PVCBOVUxMPC9saXRlcmFsPiBjb25zdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gZWxpbWluYXRlIHN1Y2ggbnVsbAordmFsdWVzIGZyb20gdGhlIHJlc3VsdCBzZXQgb2YgdGhlIHF1ZXJ5LiBOb3RlLCBob3dldmVyLCB0aGF0IHN0YXRlLWZpZWxkIHR5cGVzCitkZWZpbmVkIGluIHRlcm1zIG9mIEphdmEgbnVtZXJpYyBwcmltaXRpdmUgdHlwZXMgY2Fubm90IHByb2R1Y2UgPGxpdGVyYWw+TlVMTAorPC9saXRlcmFsPiB2YWx1ZXMgaW4gdGhlIHF1ZXJ5IHJlc3VsdC4gQSBxdWVyeSB0aGF0IHJldHVybnMgc3VjaCBhIHN0YXRlLWZpZWxkCit0eXBlIGFzIGEgcmVzdWx0IHR5cGUgbXVzdCBub3QgcmV0dXJuIGEgbnVsbCB2YWx1ZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2xhbmdyZWZfYWdncmVnYXRlcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKUFFMIEFnZ3JlZ2F0ZSBGdW5jdGlvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgoraW4gdGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gQ2xhdXNlIFRoZSByZXN1bHQgb2YgYSBxdWVyeSBtYXkgYmUgdGhlIHJlc3VsdAorb2YgYW4gYWdncmVnYXRlIGZ1bmN0aW9uIGFwcGxpZWQgdG8gYSBwYXRoIGV4cHJlc3Npb24uIFRoZSBmb2xsb3dpbmcgYWdncmVnYXRlCitmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gdGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gY2xhdXNlIG9mIGEgcXVlcnk6Cis8bGl0ZXJhbD5BVkc8L2xpdGVyYWw+LCA8bGl0ZXJhbD5DT1VOVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1BWDwvbGl0ZXJhbD4sCis8bGl0ZXJhbD5NSU48L2xpdGVyYWw+LCA8bGl0ZXJhbD5TVU08L2xpdGVyYWw+LiBGb3IgYWxsIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMKK2V4Y2VwdCA8bGl0ZXJhbD5DT1VOVDwvbGl0ZXJhbD4sIHRoZSBwYXRoIGV4cHJlc3Npb24gdGhhdCBpcyB0aGUgYXJndW1lbnQgdG8KK3RoZSBhZ2dyZWdhdGUgZnVuY3Rpb24gbXVzdCB0ZXJtaW5hdGUgaW4gYSBzdGF0ZS1maWVsZC4gVGhlIHBhdGggZXhwcmVzc2lvbgorYXJndW1lbnQgdG8gPGxpdGVyYWw+Q09VTlQ8L2xpdGVyYWw+IG1heSB0ZXJtaW5hdGUgaW4gZWl0aGVyIGEgc3RhdGUtZmllbGQgb3IgYQorYXNzb2NpYXRpb24tZmllbGQsIG9yIHRoZSBhcmd1bWVudCB0byA8bGl0ZXJhbD5DT1VOVDwvbGl0ZXJhbD4gbWF5IGJlIGFuCitpZGVudGlmaWNhdGlvbiB2YXJpYWJsZS4gQXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbnMgPGxpdGVyYWw+U1VNPC9saXRlcmFsPiBhbmQKKzxsaXRlcmFsPkFWRzwvbGl0ZXJhbD4gbXVzdCBiZSBudW1lcmljLiBBcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9ucyA8bGl0ZXJhbD5NQVgKKzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPk1JTjwvbGl0ZXJhbD4gbXVzdCBjb3JyZXNwb25kIHRvIG9yZGVyYWJsZSBzdGF0ZS1maWVsZAordHlwZXMgKGkuZS4sIG51bWVyaWMgdHlwZXMsIHN0cmluZyB0eXBlcywgY2hhcmFjdGVyIHR5cGVzLCBvciBkYXRlIHR5cGVzKS4gVGhlCitKYXZhIHR5cGUgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5IHVzaW5nIGFuIGFnZ3JlZ2F0ZSBmdW5jdGlvbgoraXMgYXMgZm9sbG93czogPGl0ZW1pemVkbGlzdD48bGlzdGl0ZW0+PHBhcmE+PGxpdGVyYWw+Q09VTlQ8L2xpdGVyYWw+IHJldHVybnMKK0xvbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk1BWDwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1JTjwvbGl0ZXJhbD4gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZQorc3RhdGUtZmllbGQgdG8gd2hpY2ggdGhleSBhcmUgYXBwbGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QVZHPC9saXRlcmFsPiByZXR1cm5zIERvdWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U1VNPC9saXRlcmFsPiByZXR1cm5zIExvbmcgd2hlbiBhcHBsaWVkIHRvIHN0YXRlLWZpZWxkcyBvZiBpbnRlZ3JhbAordHlwZXMgKG90aGVyIHRoYW4gQmlnSW50ZWdlcik7IERvdWJsZSB3aGVuIGFwcGxpZWQgdG8gc3RhdGUtZmllbGRzIG9mIGZsb2F0aW5nCitwb2ludCB0eXBlczsgQmlnSW50ZWdlciB3aGVuIGFwcGxpZWQgdG8gc3RhdGUtZmllbGRzIG9mIHR5cGUgQmlnSW50ZWdlcjsgYW5kCitCaWdEZWNpbWFsIHdoZW4gYXBwbGllZCB0byBzdGF0ZS1maWVsZHMgb2YgdHlwZSBCaWdEZWNpbWFsLiBJZiA8bGl0ZXJhbD5TVU0KKzwvbGl0ZXJhbD4sIDxsaXRlcmFsPkFWRzwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1BWDwvbGl0ZXJhbD4sIG9yIDxsaXRlcmFsPk1JTgorPC9saXRlcmFsPiBpcyB1c2VkLCBhbmQgdGhlcmUgYXJlIG5vIHZhbHVlcyB0byB3aGljaCB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uIGNhbgorYmUgYXBwbGllZCwgdGhlIHJlc3VsdCBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uIGlzIDxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+LiBJZgorPGxpdGVyYWw+Q09VTlQ8L2xpdGVyYWw+IGlzIHVzZWQsIGFuZCB0aGVyZSBhcmUgbm8gdmFsdWVzIHRvIHdoaWNoIDxsaXRlcmFsPgorQ09VTlQ8L2xpdGVyYWw+IGNhbiBiZSBhcHBsaWVkLCB0aGUgcmVzdWx0IG9mIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgYXJndW1lbnQgdG8gYW4gYWdncmVnYXRlIGZ1bmN0aW9uIG1heSBiZSBwcmVjZWRlZCBieSB0aGUga2V5d29yZCA8bGl0ZXJhbD4KK0RJU1RJTkNUPC9saXRlcmFsPiB0byBzcGVjaWZ5IHRoYXQgZHVwbGljYXRlIHZhbHVlcyBhcmUgdG8gYmUgZWxpbWluYXRlZCBiZWZvcmUKK3RoZSBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgYXBwbGllZC4gTnVsbCB2YWx1ZXMgYXJlIGVsaW1pbmF0ZWQgYmVmb3JlIHRoZQorYWdncmVnYXRlIGZ1bmN0aW9uIGlzIGFwcGxpZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUga2V5d29yZCA8bGl0ZXJhbD4KK0RJU1RJTkNUPC9saXRlcmFsPiBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9hZ2dfZXhhbXBsZXMiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICBKUFFMIEFnZ3JlZ2F0ZSBFeGFtcGxlcworICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0V4YW1wbGVzIFRoZSBmb2xsb3dpbmcgcXVlcnkgcmV0dXJucyB0aGUgYXZlcmFnZSBwcmljZSBvZiBhbGwgbWFnYXppbmVzOgorPHByb2dyYW1saXN0aW5nPlNFTEVDVCBBVkcobWFnLnByaWNlKSBGUk9NIE1hZ2F6aW5lIG1hZzwvcHJvZ3JhbWxpc3Rpbmc+IFRoZQorZm9sbG93aW5nIHF1ZXJ5IHJldHVybnMgdGhlIHN1bSB0b3RhbCBjb3N0IG9mIGFsbCB0aGUgcHJpY2VzIGZyb20gYWxsIHRoZQorbWFnYXppbmVzIHB1Ymxpc2hlZCBieSAnTGFycnknOiA8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIFNVTShtYWcucHJpY2UpIEZST00gUHVibGlzaGVyIHB1YiBKT0lOIHB1Yi5tYWdhemluZXMgbWFnIHB1Yi5maXJzdE5hbWUgPSAnTGFycnknCis8L3Byb2dyYW1saXN0aW5nPiBUaGUgZm9sbG93aW5nIHF1ZXJ5IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBtYWdhemluZXM6Cis8cHJvZ3JhbWxpc3Rpbmc+U0VMRUNUIENPVU5UKG1hZykgRlJPTSBNYWdhemluZSBtYWc8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9vcmRlcmJ5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBKUFFMIE9SREVSIEJZIENsYXVzZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPk9SREVSIEJZPC9saXRlcmFsPiBjbGF1c2UgYWxsb3dzIHRoZSBvYmplY3RzIG9yIHZhbHVlcyB0aGF0IGFyZQorcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5IHRvIGJlIG9yZGVyZWQuIFRoZSBzeW50YXggb2YgdGhlIDxsaXRlcmFsPk9SREVSIEJZCis8L2xpdGVyYWw+IGNsYXVzZSBpcworICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT5vcmRlcmJ5X2NsYXVzZSA6Oj0gT1JERVIgQlkgb3JkZXJieV9pdGVtIHssCitvcmRlcmJ5X2l0ZW19KgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK29yZGVyYnlfaXRlbSA6Oj0gc3RhdGVfZmllbGRfcGF0aF9leHByZXNzaW9uIFtBU0MgfCBERVNDXQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitJdCBpcyBsZWdhbCB0byBzcGVjaWZ5IDxsaXRlcmFsPkRJU1RJTkNUPC9saXRlcmFsPiB3aXRoIDxsaXRlcmFsPk1BWDwvbGl0ZXJhbD4KK29yIDxsaXRlcmFsPk1JTjwvbGl0ZXJhbD4sIGJ1dCBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHJlc3VsdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiB0aGUgPGxpdGVyYWw+T1JERVIgQlk8L2xpdGVyYWw+IGNsYXVzZSBpcyB1c2VkIGluIGEgcXVlcnksIGVhY2ggZWxlbWVudCBvZgordGhlIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4gY2xhdXNlIG9mIHRoZSBxdWVyeSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorYW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgeCwgb3B0aW9uYWxseSBkZW5vdGVkIGFzIDxsaXRlcmFsPk9CSkVDVCh4KTwvbGl0ZXJhbD4KKywgYSBzaW5nbGVfdmFsdWVkX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbiwgb3IgYSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24uCitGb3IgZXhhbXBsZTogPHByb2dyYW1saXN0aW5nPgorU0VMRUNUIHB1YiBGUk9NIFB1Ymxpc2hlciBwdWIgSk9JTiBwdWIubWFnYXppbmVzIG1hZyBPUkRFUiBCWSBvLnJldmVudWUsIG8ubmFtZQorPC9wcm9ncmFtbGlzdGluZz4gSWYgbW9yZSB0aGFuIG9uZSBvcmRlcmJ5X2l0ZW0gaXMgc3BlY2lmaWVkLCB0aGUgbGVmdC10by1yaWdodAorc2VxdWVuY2Ugb2YgdGhlIG9yZGVyYnlfaXRlbSBlbGVtZW50cyBkZXRlcm1pbmVzIHRoZSBwcmVjZWRlbmNlLCB3aGVyZWJ5IHRoZQorbGVmdG1vc3Qgb3JkZXJieV9pdGVtIGhhcyBoaWdoZXN0IHByZWNlZGVuY2UuIFRoZSBrZXl3b3JkIDxsaXRlcmFsPkFTQzwvbGl0ZXJhbD4KK3NwZWNpZmllcyB0aGF0IGFzY2VuZGluZyBvcmRlcmluZyBiZSB1c2VkOyB0aGUga2V5d29yZCA8bGl0ZXJhbD5ERVNDPC9saXRlcmFsPgorc3BlY2lmaWVzIHRoYXQgZGVzY2VuZGluZyBvcmRlcmluZyBiZSB1c2VkLiBBc2NlbmRpbmcgb3JkZXJpbmcgaXMgdGhlIGRlZmF1bHQuCitTUUwgcnVsZXMgZm9yIHRoZSBvcmRlcmluZyBvZiBudWxsIHZhbHVlcyBhcHBseTogdGhhdCBpcywgYWxsIG51bGwgdmFsdWVzIG11c3QKK2FwcGVhciBiZWZvcmUgYWxsIG5vbi1udWxsIHZhbHVlcyBpbiB0aGUgb3JkZXJpbmcgb3IgYWxsIG51bGwgdmFsdWVzIG11c3QgYXBwZWFyCithZnRlciBhbGwgbm9uLW51bGwgdmFsdWVzIGluIHRoZSBvcmRlcmluZywgYnV0IGl0IGlzIG5vdCBzcGVjaWZpZWQgd2hpY2guIFRoZQorb3JkZXJpbmcgb2YgdGhlIHF1ZXJ5IHJlc3VsdCBpcyBwcmVzZXJ2ZWQgaW4gdGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgbWV0aG9kIGlmCit0aGUgPGxpdGVyYWw+T1JERVIgQlk8L2xpdGVyYWw+IGNsYXVzZSBpcyB1c2VkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9idWxrX29wcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSlBRTCBCdWxrIFVwZGF0ZSBhbmQgRGVsZXRlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitPcGVyYXRpb25zIEJ1bGsgdXBkYXRlIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBhcHBseSB0byBlbnRpdGllcyBvZiBhIHNpbmdsZQorZW50aXR5IGNsYXNzICh0b2dldGhlciB3aXRoIGl0cyBzdWJjbGFzc2VzLCBpZiBhbnkpLiBPbmx5IG9uZSBlbnRpdHkgYWJzdHJhY3QKK3NjaGVtYSB0eXBlIG1heSBiZSBzcGVjaWZpZWQgaW4gdGhlIDxsaXRlcmFsPkZST008L2xpdGVyYWw+IG9yIDxsaXRlcmFsPlVQREFURQorPC9saXRlcmFsPiBjbGF1c2UuIFRoZSBzeW50YXggb2YgdGhlc2Ugb3BlcmF0aW9ucyBpcyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT48cGFyYT51cGRhdGVfc3RhdGVtZW50IDo6PSB1cGRhdGVfY2xhdXNlIFt3aGVyZV9jbGF1c2VdCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgordXBkYXRlX2NsYXVzZSA6Oj0gVVBEQVRFIGFic3RyYWN0X3NjaGVtYV9uYW1lIFtbQVNdIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlXSBTRVQKK3VwZGF0ZV9pdGVtIHssIHVwZGF0ZV9pdGVtfSoKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cit1cGRhdGVfaXRlbSA6Oj0gW2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlLl17c3RhdGVfZmllbGQgfAorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZH0gPSBuZXdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CituZXdfdmFsdWUgOjo9IHNpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24gfCBzdHJpbmdfcHJpbWFyeSB8IGRhdGV0aW1lX3ByaW1hcnkgfAorYm9vbGVhbl9wcmltYXJ5IHwgZW51bV9wcmltYXJ5IHNpbXBsZV9lbnRpdHlfZXhwcmVzc2lvbiB8IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitkZWxldGVfc3RhdGVtZW50IDo6PSBkZWxldGVfY2xhdXNlIFt3aGVyZV9jbGF1c2VdCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZGVsZXRlX2NsYXVzZSA6Oj0gREVMRVRFIEZST00gYWJzdHJhY3Rfc2NoZW1hX25hbWUgW1tBU10KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlXQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgc3ludGF4IG9mIHRoZSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIGlzIGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ianBhX2xhbmdyZWZfd2hlcmUiLz4uIEEgZGVsZXRlIG9wZXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8KK2VudGl0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzLiBJdCBkb2VzIG5vdCBjYXNjYWRlIHRvCityZWxhdGVkIGVudGl0aWVzLiBUaGUgbmV3X3ZhbHVlIHNwZWNpZmllZCBmb3IgYW4gdXBkYXRlIG9wZXJhdGlvbiBtdXN0IGJlCitjb21wYXRpYmxlIGluIHR5cGUgd2l0aCB0aGUgc3RhdGUtZmllbGQgdG8gd2hpY2ggaXQgaXMgYXNzaWduZWQuIEJ1bGsgdXBkYXRlCittYXBzIGRpcmVjdGx5IHRvIGEgZGF0YWJhc2UgdXBkYXRlIG9wZXJhdGlvbiwgYnlwYXNzaW5nIG9wdGltaXN0aWMgbG9ja2luZworY2hlY2tzLiBQb3J0YWJsZSBhcHBsaWNhdGlvbnMgbXVzdCBtYW51YWxseSB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSB2ZXJzaW9uCitjb2x1bW4sIGlmIGRlc2lyZWQsIGFuZC9vciBtYW51YWxseSB2YWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHZlcnNpb24gY29sdW1uLgorVGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGJ1bGsgdXBkYXRlCitvciBkZWxldGUuIENhdXRpb24gc2hvdWxkIGJlIHVzZWQgd2hlbiBleGVjdXRpbmcgYnVsayB1cGRhdGUgb3IgZGVsZXRlCitvcGVyYXRpb25zIGJlY2F1c2UgdGhleSBtYXkgcmVzdWx0IGluIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHRoZSBkYXRhYmFzZSBhbmQKK3RoZSBlbnRpdGllcyBpbiB0aGUgYWN0aXZlIHBlcnNpc3RlbmNlIGNvbnRleHQuIEluIGdlbmVyYWwsIGJ1bGsgdXBkYXRlIGFuZAorZGVsZXRlIG9wZXJhdGlvbnMgc2hvdWxkIG9ubHkgYmUgcGVyZm9ybWVkIHdpdGhpbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uIG9yIGF0Cit0aGUgYmVnaW5uaW5nIG9mIGEgdHJhbnNhY3Rpb24gKGJlZm9yZSBlbnRpdGllcyBoYXZlIGJlZW4gYWNjZXNzZWQgd2hvc2Ugc3RhdGUKK21pZ2h0IGJlIGFmZmVjdGVkIGJ5IHN1Y2ggb3BlcmF0aW9ucykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0V4YW1wbGVzOiA8cHJvZ3JhbWxpc3Rpbmc+REVMRVRFIEZST00gUHVibGlzaGVyIHB1YiBXSEVSRSBwdWIucmV2ZW51ZSAmZ3Q7IDEwMDAwMDAuMAorPC9wcm9ncmFtbGlzdGluZz48cHJvZ3JhbWxpc3Rpbmc+REVMRVRFIEZST00gUHVibGlzaGVyIHB1YiBXSEVSRSBwdWIucmV2ZW51ZSA9IDAgQU5EIHB1Yi5tYWdhemluZXMgSVMgRU1QVFkKKzwvcHJvZ3JhbWxpc3Rpbmc+PHByb2dyYW1saXN0aW5nPlVQREFURSBQdWJsaXNoZXIgcHViIFNFVCBwdWIuc3RhdHVzID0gJ291dHN0YW5kaW5nJworICAgIFdIRVJFIHB1Yi5yZXZlbnVlICZsdDsgMTAwMDAwMCBBTkQgMjAgJmd0OyAoU0VMRUNUIENPVU5UKG1hZykgRlJPTSBwdWIubWFnYXppbmVzIG1hZykKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX251bGxfdmFsdWVzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBKUFFMIE51bGwgVmFsdWVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitXaGVuIHRoZSB0YXJnZXQgb2YgYSByZWZlcmVuY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCBpdHMgdmFsdWUgaXMKK3JlZ2FyZGVkIGFzIDxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+LiBTUUwgOTIgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4gc2VtYW50aWNzCitkZWZpbmVzIHRoZSBldmFsdWF0aW9uIG9mIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPGxpdGVyYWw+TlVMTAorPC9saXRlcmFsPiB2YWx1ZXMuIFRoZSBmb2xsb3dpbmcgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGVzZSBzZW1hbnRpY3M6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxpdGVtaXplZGxpc3Q+PGxpc3RpdGVtPjxwYXJhPiBDb21wYXJpc29uIG9yIGFyaXRobWV0aWMgb3BlcmF0aW9ucyB3aXRoIGEKKzxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+IHZhbHVlIGFsd2F5cyB5aWVsZCBhbiB1bmtub3duIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1R3byA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiB2YWx1ZXMgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIGVxdWFsLCB0aGUKK2NvbXBhcmlzb24geWllbGRzIGFuIHVua25vd24gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQ29tcGFyaXNvbiBvciBhcml0aG1ldGljIG9wZXJhdGlvbnMgd2l0aCBhbiB1bmtub3duIHZhbHVlIGFsd2F5cyB5aWVsZCBhbgordW5rbm93biB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+SVMgTlVMTDwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPklTIE5PVCBOVUxMPC9saXRlcmFsPiBvcGVyYXRvcnMKK2NvbnZlcnQgYSA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiBzdGF0ZS1maWVsZCBvciBzaW5nbGUtdmFsdWVkIGFzc29jaWF0aW9uLWZpZWxkCit2YWx1ZSBpbnRvIHRoZSByZXNwZWN0aXZlIDxsaXRlcmFsPlRSVUU8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPgordmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK05vdGU6IFRoZSBKUFFMIGRlZmluZXMgdGhlIGVtcHR5IHN0cmluZywgIiIsIGFzIGEgc3RyaW5nIHdpdGggMCBsZW5ndGgsIHdoaWNoIGlzCitub3QgZXF1YWwgdG8gYSA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiB2YWx1ZS4gSG93ZXZlciwgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4KK3ZhbHVlcyBhbmQgZW1wdHkgc3RyaW5ncyBtYXkgbm90IGFsd2F5cyBiZSBkaXN0aW5ndWlzaGVkIHdoZW4gcXVlcmllcyBhcmUgbWFwcGVkCit0byBzb21lIGRhdGFiYXNlcy4gQXBwbGljYXRpb24gZGV2ZWxvcGVycyBzaG91bGQgdGhlcmVmb3JlIG5vdCByZWx5IG9uIHRoZQorc2VtYW50aWNzIG9mIHF1ZXJ5IGNvbXBhcmlzb25zIGludm9sdmluZyB0aGUgZW1wdHkgc3RyaW5nIGFuZCA8bGl0ZXJhbD5OVUxMCis8L2xpdGVyYWw+IHZhbHVlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfbGFuZ3JlZl9lcXVhbGl0eSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSlBRTCBFcXVhbGl0eSBhbmQgQ29tcGFyaXNvbiBTZW1hbnRpY3MKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09ubHkgdGhlIHZhbHVlcyBvZiBsaWtlIHR5cGVzIGFyZSBwZXJtaXR0ZWQgdG8gYmUgY29tcGFyZWQuIEEgdHlwZSBpcyBsaWtlCithbm90aGVyIHR5cGUgaWYgdGhleSBjb3JyZXNwb25kIHRvIHRoZSBzYW1lIEphdmEgbGFuZ3VhZ2UgdHlwZSwgb3IgaWYgb25lIGlzIGEKK3ByaW1pdGl2ZSBKYXZhIGxhbmd1YWdlIHR5cGUgYW5kIHRoZSBvdGhlciBpcyB0aGUgd3JhcHBlcmVkIEphdmEgY2xhc3MgdHlwZQorZXF1aXZhbGVudCAoZS5nLiwgaW50IGFuZCBJbnRlZ2VyIGFyZSBsaWtlIHR5cGVzIGluIHRoaXMgc2Vuc2UpLiBUaGVyZSBpcyBvbmUKK2V4Y2VwdGlvbiB0byB0aGlzIHJ1bGU6IGl0IGlzIHZhbGlkIHRvIGNvbXBhcmUgbnVtZXJpYyB2YWx1ZXMgZm9yIHdoaWNoIHRoZQorcnVsZXMgb2YgbnVtZXJpYyBwcm9tb3Rpb24gYXBwbHkuIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGF0dGVtcHRpbmcgdG8gY29tcGFyZQorbm9uLWxpa2UgdHlwZSB2YWx1ZXMgYXJlIGRpc2FsbG93ZWQgZXhjZXB0IGZvciB0aGlzIG51bWVyaWMgY2FzZS4gTm90ZSB0aGF0IHRoZQorYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFyZSBwZXJtaXR0ZWQgdG8gYmUgYXBwbGllZCB0bworc3RhdGUtZmllbGRzIGFuZCBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSB3cmFwcGVyZWQgSmF2YSBjbGFzcyBlcXVpdmFsZW50cyB0byB0aGUKK3ByaW1pdGl2ZSBudW1lcmljIEphdmEgdHlwZXMuIFR3byBlbnRpdGllcyBvZiB0aGUgc2FtZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBhcmUKK2VxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBwcmltYXJ5IGtleSB2YWx1ZS4gT25seQorZXF1YWxpdHkvaW5lcXVhbGl0eSBjb21wYXJpc29ucyBvdmVyIGVudW1zIGFyZSByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9sYW5ncmVmX2JuZiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSlBRTCBCTkYKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgaXMgdGhlIEJORiBmb3IgdGhlIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkgbGFuZ3VhZ2UsIGZyb20gc2VjdGlvbgorNC4xNCBvZiB0aGUgSlNSIDIyMCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorUUxfc3RhdGVtZW50IDo6PSBzZWxlY3Rfc3RhdGVtZW50IHwgdXBkYXRlX3N0YXRlbWVudCB8IGRlbGV0ZV9zdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NlbGVjdF9zdGF0ZW1lbnQgOjo9IHNlbGVjdF9jbGF1c2UgZnJvbV9jbGF1c2UgW3doZXJlX2NsYXVzZV0gW2dyb3VwYnlfY2xhdXNlXQorW2hhdmluZ19jbGF1c2VdIFtvcmRlcmJ5X2NsYXVzZV0KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3VwZGF0ZV9zdGF0ZW1lbnQgOjo9IHVwZGF0ZV9jbGF1c2UgW3doZXJlX2NsYXVzZV0KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2RlbGV0ZV9zdGF0ZW1lbnQgOjo9IGRlbGV0ZV9jbGF1c2UgW3doZXJlX2NsYXVzZV0KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2Zyb21fY2xhdXNlIDo6PSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBpZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbiB7LAore2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIHwgY29sbGVjdGlvbl9tZW1iZXJfZGVjbGFyYXRpb259fSoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIDo6PSByYW5nZV92YXJpYWJsZV9kZWNsYXJhdGlvbiB7IGpvaW4gfAorZmV0Y2hfam9pbiB9KgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorcmFuZ2VfdmFyaWFibGVfZGVjbGFyYXRpb24gOjo9IGFic3RyYWN0X3NjaGVtYV9uYW1lIFsgPGxpdGVyYWw+QVM8L2xpdGVyYWw+IF0KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citqb2luIDo6PSBqb2luX3NwZWMgam9pbl9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24gWyA8bGl0ZXJhbD5BUzwvbGl0ZXJhbD4gXQoraWRlbnRpZmljYXRpb25fdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2ZldGNoX2pvaW4gOjo9IGpvaW5fc3BlYyA8bGl0ZXJhbD5GRVRDSDwvbGl0ZXJhbD4KK2pvaW5fYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cithc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24gOjo9IGNvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8CitzaW5nbGVfdmFsdWVkX2Fzc29jaWF0aW9uX3BhdGhfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgoram9pbl9zcGVjIDo6PSBbIDxsaXRlcmFsPkxFRlQ8L2xpdGVyYWw+IFsgPGxpdGVyYWw+T1VURVI8L2xpdGVyYWw+IF18IDxsaXRlcmFsPgorSU5ORVI8L2xpdGVyYWw+IF0gPGxpdGVyYWw+Sk9JTjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2pvaW5fYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIDo6PSBqb2luX2NvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiB8Citqb2luX3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citqb2luX2NvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbiA6Oj0KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlLmNvbGxlY3Rpb25fdmFsdWVkX2Fzc29jaWF0aW9uX2ZpZWxkCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citqb2luX3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIDo6PQoraWRlbnRpZmljYXRpb25fdmFyaWFibGUuc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29sbGVjdGlvbl9tZW1iZXJfZGVjbGFyYXRpb24gOjo9IDxsaXRlcmFsPklOPC9saXRlcmFsPgorKGNvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbikgWyA8bGl0ZXJhbD5BUzwvbGl0ZXJhbD4gXQoraWRlbnRpZmljYXRpb25fdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NpbmdsZV92YWx1ZWRfcGF0aF9leHByZXNzaW9uIDo6PSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gfAorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3N0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbiA6Oj0ge2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlIHwKK3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9ufS5zdGF0ZV9maWVsZAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24gOjo9CitpZGVudGlmaWNhdGlvbl92YXJpYWJsZS57c2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZC59Kgorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29sbGVjdGlvbl92YWx1ZWRfcGF0aF9leHByZXNzaW9uIDo6PQoraWRlbnRpZmljYXRpb25fdmFyaWFibGUue3NpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fZmllbGQufSpjb2xsZWN0aW9uX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc3RhdGVfZmllbGQgOjo9IHtlbWJlZGRlZF9jbGFzc19zdGF0ZV9maWVsZC59KnNpbXBsZV9zdGF0ZV9maWVsZAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgordXBkYXRlX2NsYXVzZSA6Oj0gPGxpdGVyYWw+VVBEQVRFPC9saXRlcmFsPiBhYnN0cmFjdF9zY2hlbWFfbmFtZSBbWyA8bGl0ZXJhbD5BUworPC9saXRlcmFsPiBdIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlXSA8bGl0ZXJhbD5TRVQ8L2xpdGVyYWw+IHVwZGF0ZV9pdGVtIHssCit1cGRhdGVfaXRlbX0qCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cit1cGRhdGVfaXRlbSA6Oj0gW2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlLl17c3RhdGVfZmllbGQgfAorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9maWVsZH09IG5ld192YWx1ZQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorbmV3X3ZhbHVlIDo6PSBzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uIHwgc3RyaW5nX3ByaW1hcnkgfCBkYXRldGltZV9wcmltYXJ5IHwKK2Jvb2xlYW5fcHJpbWFyeSB8IGVudW1fcHJpbWFyeSBzaW1wbGVfZW50aXR5X2V4cHJlc3Npb24gfCA8bGl0ZXJhbD5OVUxMCis8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitkZWxldGVfY2xhdXNlIDo6PSA8bGl0ZXJhbD5ERUxFVEU8L2xpdGVyYWw+PGxpdGVyYWw+RlJPTTwvbGl0ZXJhbD4KK2Fic3RyYWN0X3NjaGVtYV9uYW1lIFtbIDxsaXRlcmFsPkFTPC9saXRlcmFsPiBdIGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlXQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2VsZWN0X2NsYXVzZSA6Oj0gPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBbIDxsaXRlcmFsPkRJU1RJTkNUPC9saXRlcmFsPiBdCitzZWxlY3RfZXhwcmVzc2lvbiB7LCBzZWxlY3RfZXhwcmVzc2lvbn0qCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzZWxlY3RfZXhwcmVzc2lvbiA6Oj0gc2luZ2xlX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gfCBhZ2dyZWdhdGVfZXhwcmVzc2lvbiB8CitpZGVudGlmaWNhdGlvbl92YXJpYWJsZSB8IDxsaXRlcmFsPk9CSkVDVDwvbGl0ZXJhbD4gKGlkZW50aWZpY2F0aW9uX3ZhcmlhYmxlKXwKK2NvbnN0cnVjdG9yX2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2NvbnN0cnVjdG9yX2V4cHJlc3Npb24gOjo9IDxsaXRlcmFsPk5FVzwvbGl0ZXJhbD4gY29uc3RydWN0b3JfbmFtZSgKK2NvbnN0cnVjdG9yX2l0ZW0geywgY29uc3RydWN0b3JfaXRlbX0qKQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uc3RydWN0b3JfaXRlbSA6Oj0gc2luZ2xlX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gfCBhZ2dyZWdhdGVfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorYWdncmVnYXRlX2V4cHJlc3Npb24gOjo9IHsgPGxpdGVyYWw+QVZHPC9saXRlcmFsPiB8IDxsaXRlcmFsPk1BWDwvbGl0ZXJhbD4gfAorPGxpdGVyYWw+TUlOPC9saXRlcmFsPiB8IDxsaXRlcmFsPlNVTTwvbGl0ZXJhbD4gfShbIDxsaXRlcmFsPkRJU1RJTkNUPC9saXRlcmFsPgorXSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24pIHwgPGxpdGVyYWw+Q09VTlQ8L2xpdGVyYWw+IChbIDxsaXRlcmFsPkRJU1RJTkNUCis8L2xpdGVyYWw+IF0gaWRlbnRpZmljYXRpb25fdmFyaWFibGUgfCBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gfAorc2luZ2xlX3ZhbHVlZF9hc3NvY2lhdGlvbl9wYXRoX2V4cHJlc3Npb24pCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cit3aGVyZV9jbGF1c2UgOjo9IDxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBjb25kaXRpb25hbF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citncm91cGJ5X2NsYXVzZSA6Oj0gPGxpdGVyYWw+R1JPVVA8L2xpdGVyYWw+PGxpdGVyYWw+Qlk8L2xpdGVyYWw+IGdyb3VwYnlfaXRlbSB7LAorZ3JvdXBieV9pdGVtfSoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2dyb3VwYnlfaXRlbSA6Oj0gc2luZ2xlX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gfCBpZGVudGlmaWNhdGlvbl92YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgoraGF2aW5nX2NsYXVzZSA6Oj0gPGxpdGVyYWw+SEFWSU5HPC9saXRlcmFsPiBjb25kaXRpb25hbF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitvcmRlcmJ5X2NsYXVzZSA6Oj0gPGxpdGVyYWw+T1JERVI8L2xpdGVyYWw+PGxpdGVyYWw+Qlk8L2xpdGVyYWw+IG9yZGVyYnlfaXRlbSB7LAorb3JkZXJieV9pdGVtfSoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK29yZGVyYnlfaXRlbSA6Oj0gc3RhdGVfZmllbGRfcGF0aF9leHByZXNzaW9uIFsgPGxpdGVyYWw+QVNDPC9saXRlcmFsPiB8Cis8bGl0ZXJhbD5ERVNDPC9saXRlcmFsPiBdCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzdWJxdWVyeSA6Oj0gc2ltcGxlX3NlbGVjdF9jbGF1c2Ugc3VicXVlcnlfZnJvbV9jbGF1c2UgW3doZXJlX2NsYXVzZV0KK1tncm91cGJ5X2NsYXVzZV0gW2hhdmluZ19jbGF1c2VdCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzdWJxdWVyeV9mcm9tX2NsYXVzZSA6Oj0gPGxpdGVyYWw+RlJPTTwvbGl0ZXJhbD4KK3N1YnNlbGVjdF9pZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbiB7LAorc3Vic2VsZWN0X2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9ufSoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3N1YnNlbGVjdF9pZGVudGlmaWNhdGlvbl92YXJpYWJsZV9kZWNsYXJhdGlvbiA6Oj0KK2lkZW50aWZpY2F0aW9uX3ZhcmlhYmxlX2RlY2xhcmF0aW9uIHwgYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIFsgPGxpdGVyYWw+QVMKKzwvbGl0ZXJhbD4gXSBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSB8IGNvbGxlY3Rpb25fbWVtYmVyX2RlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzaW1wbGVfc2VsZWN0X2NsYXVzZSA6Oj0gPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPiBbIDxsaXRlcmFsPkRJU1RJTkNUPC9saXRlcmFsPgorXSBzaW1wbGVfc2VsZWN0X2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NpbXBsZV9zZWxlY3RfZXhwcmVzc2lvbiA6Oj0gc2luZ2xlX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gfAorYWdncmVnYXRlX2V4cHJlc3Npb24gfCBpZGVudGlmaWNhdGlvbl92YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uZGl0aW9uYWxfZXhwcmVzc2lvbiA6Oj0gY29uZGl0aW9uYWxfdGVybSB8IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gPGxpdGVyYWw+CitPUjwvbGl0ZXJhbD4gY29uZGl0aW9uYWxfdGVybQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29uZGl0aW9uYWxfdGVybSA6Oj0gY29uZGl0aW9uYWxfZmFjdG9yIHwgY29uZGl0aW9uYWxfdGVybSA8bGl0ZXJhbD5BTkQKKzwvbGl0ZXJhbD4gY29uZGl0aW9uYWxfZmFjdG9yCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citjb25kaXRpb25hbF9mYWN0b3IgOjo9IFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdIGNvbmRpdGlvbmFsX3ByaW1hcnkKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2NvbmRpdGlvbmFsX3ByaW1hcnkgOjo9IHNpbXBsZV9jb25kX2V4cHJlc3Npb24gfChjb25kaXRpb25hbF9leHByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2ltcGxlX2NvbmRfZXhwcmVzc2lvbiA6Oj0gY29tcGFyaXNvbl9leHByZXNzaW9uIHwgYmV0d2Vlbl9leHByZXNzaW9uIHwKK2xpa2VfZXhwcmVzc2lvbiB8IGluX2V4cHJlc3Npb24gfCBudWxsX2NvbXBhcmlzb25fZXhwcmVzc2lvbiB8CitlbXB0eV9jb2xsZWN0aW9uX2NvbXBhcmlzb25fZXhwcmVzc2lvbiB8IGNvbGxlY3Rpb25fbWVtYmVyX2V4cHJlc3Npb24gfAorZXhpc3RzX2V4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2JldHdlZW5fZXhwcmVzc2lvbiA6Oj0gYXJpdGhtZXRpY19leHByZXNzaW9uIFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdCis8bGl0ZXJhbD5CRVRXRUVOPC9saXRlcmFsPiBhcml0aG1ldGljX2V4cHJlc3Npb24gPGxpdGVyYWw+QU5EPC9saXRlcmFsPgorYXJpdGhtZXRpY19leHByZXNzaW9uIHwgc3RyaW5nX2V4cHJlc3Npb24gWyA8bGl0ZXJhbD5OT1Q8L2xpdGVyYWw+IF0gPGxpdGVyYWw+CitCRVRXRUVOPC9saXRlcmFsPiBzdHJpbmdfZXhwcmVzc2lvbiA8bGl0ZXJhbD5BTkQ8L2xpdGVyYWw+IHN0cmluZ19leHByZXNzaW9uIHwKK2RhdGV0aW1lX2V4cHJlc3Npb24gWyA8bGl0ZXJhbD5OT1Q8L2xpdGVyYWw+IF0gPGxpdGVyYWw+QkVUV0VFTjwvbGl0ZXJhbD4KK2RhdGV0aW1lX2V4cHJlc3Npb24gPGxpdGVyYWw+QU5EPC9saXRlcmFsPiBkYXRldGltZV9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citpbl9leHByZXNzaW9uIDo6PSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gWyA8bGl0ZXJhbD5OT1Q8L2xpdGVyYWw+IF0KKzxsaXRlcmFsPklOPC9saXRlcmFsPiAoIGluX2l0ZW0geywgaW5faXRlbX0qIHwgc3VicXVlcnkpCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Citpbl9pdGVtIDo6PSBsaXRlcmFsIHwgaW5wdXRfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitsaWtlX2V4cHJlc3Npb24gOjo9IHN0cmluZ19leHByZXNzaW9uIFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdIDxsaXRlcmFsPkxJS0UKKzwvbGl0ZXJhbD4gcGF0dGVybl92YWx1ZSBbIDxsaXRlcmFsPkVTQ0FQRTwvbGl0ZXJhbD4gZXNjYXBlX2NoYXJhY3Rlcl0KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK251bGxfY29tcGFyaXNvbl9leHByZXNzaW9uIDo6PSB7c2luZ2xlX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24gfCBpbnB1dF9wYXJhbWV0ZXJ9Cis8bGl0ZXJhbD5JUzwvbGl0ZXJhbD4gWyA8bGl0ZXJhbD5OT1Q8L2xpdGVyYWw+IF0gPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2VtcHR5X2NvbGxlY3Rpb25fY29tcGFyaXNvbl9leHByZXNzaW9uIDo6PSBjb2xsZWN0aW9uX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24KKzxsaXRlcmFsPklTPC9saXRlcmFsPiBbIDxsaXRlcmFsPk5PVDwvbGl0ZXJhbD4gXSA8bGl0ZXJhbD5FTVBUWTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2NvbGxlY3Rpb25fbWVtYmVyX2V4cHJlc3Npb24gOjo9IGVudGl0eV9leHByZXNzaW9uIFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdCis8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+IFsgPGxpdGVyYWw+T0Y8L2xpdGVyYWw+IF0KK2NvbGxlY3Rpb25fdmFsdWVkX3BhdGhfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZXhpc3RzX2V4cHJlc3Npb24gOjo9IFsgPGxpdGVyYWw+Tk9UPC9saXRlcmFsPiBdIDxsaXRlcmFsPkVYSVNUUzwvbGl0ZXJhbD4KKyhzdWJxdWVyeSkKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2FsbF9vcl9hbnlfZXhwcmVzc2lvbiA6Oj0geyA8bGl0ZXJhbD5BTEw8L2xpdGVyYWw+IHwgPGxpdGVyYWw+QU5ZPC9saXRlcmFsPiB8Cis8bGl0ZXJhbD5TT01FPC9saXRlcmFsPiB9KHN1YnF1ZXJ5KQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29tcGFyaXNvbl9leHByZXNzaW9uIDo6PQorc3RyaW5nX2V4cHJlc3Npb25jb21wYXJpc29uX29wZXJhdG9ye3N0cmluZ19leHByZXNzaW9ufGFsbF9vcl9hbnlfZXhwcmVzc2lvbn18Citib29sZWFuX2V4cHJlc3Npb24gez18Jmx0OyZndDt9IHtib29sZWFuX2V4cHJlc3Npb24gfCBhbGxfb3JfYW55X2V4cHJlc3Npb259IHwKK2VudW1fZXhwcmVzc2lvbiB7PXwmbHQ7Jmd0O30ge2VudW1fZXhwcmVzc2lvbiB8IGFsbF9vcl9hbnlfZXhwcmVzc2lvbn0gfAorZGF0ZXRpbWVfZXhwcmVzc2lvbiBjb21wYXJpc29uX29wZXJhdG9yIHtkYXRldGltZV9leHByZXNzaW9uIHwKK2FsbF9vcl9hbnlfZXhwcmVzc2lvbn0gfCBlbnRpdHlfZXhwcmVzc2lvbiB7PSB8Jmx0OyZndDsgfSB7ZW50aXR5X2V4cHJlc3Npb24gfAorYWxsX29yX2FueV9leHByZXNzaW9ufSB8IGFyaXRobWV0aWNfZXhwcmVzc2lvbiBjb21wYXJpc29uX29wZXJhdG9yCit7YXJpdGhtZXRpY19leHByZXNzaW9uIHwgYWxsX29yX2FueV9leHByZXNzaW9ufQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorY29tcGFyaXNvbl9vcGVyYXRvciA6Oj09IHwmZ3Q7IHwmZ3Q7PSB8Jmx0OyB8Jmx0Oz0gfCZsdDsmZ3Q7CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cithcml0aG1ldGljX2V4cHJlc3Npb24gOjo9IHNpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24gfChzdWJxdWVyeSkKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3NpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24gOjo9IGFyaXRobWV0aWNfdGVybSB8IHNpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24KK3srIHwtIH0gYXJpdGhtZXRpY190ZXJtCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cithcml0aG1ldGljX3Rlcm0gOjo9IGFyaXRobWV0aWNfZmFjdG9yIHwgYXJpdGhtZXRpY190ZXJtIHsqIHwvIH0KK2FyaXRobWV0aWNfZmFjdG9yCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cithcml0aG1ldGljX2ZhY3RvciA6Oj0gW3srIHwtfV0gYXJpdGhtZXRpY19wcmltYXJ5CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cithcml0aG1ldGljX3ByaW1hcnkgOjo9IHN0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbiB8IG51bWVyaWNfbGl0ZXJhbCB8Cisoc2ltcGxlX2FyaXRobWV0aWNfZXhwcmVzc2lvbikgfCBpbnB1dF9wYXJhbWV0ZXIgfCBmdW5jdGlvbnNfcmV0dXJuaW5nX251bWVyaWNzCit8IGFnZ3JlZ2F0ZV9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitzdHJpbmdfZXhwcmVzc2lvbiA6Oj0gc3RyaW5nX3ByaW1hcnkgfChzdWJxdWVyeSkKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3N0cmluZ19wcmltYXJ5IDo6PSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gfCBzdHJpbmdfbGl0ZXJhbCB8CitpbnB1dF9wYXJhbWV0ZXIgfCBmdW5jdGlvbnNfcmV0dXJuaW5nX3N0cmluZ3MgfCBhZ2dyZWdhdGVfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZGF0ZXRpbWVfZXhwcmVzc2lvbiA6Oj0gZGF0ZXRpbWVfcHJpbWFyeSB8KHN1YnF1ZXJ5KQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZGF0ZXRpbWVfcHJpbWFyeSA6Oj0gc3RhdGVfZmllbGRfcGF0aF9leHByZXNzaW9uIHwgaW5wdXRfcGFyYW1ldGVyIHwKK2Z1bmN0aW9uc19yZXR1cm5pbmdfZGF0ZXRpbWUgfCBhZ2dyZWdhdGVfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorYm9vbGVhbl9leHByZXNzaW9uIDo6PSBib29sZWFuX3ByaW1hcnkgfChzdWJxdWVyeSkKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK2Jvb2xlYW5fcHJpbWFyeSA6Oj0gc3RhdGVfZmllbGRfcGF0aF9leHByZXNzaW9uIHwgYm9vbGVhbl9saXRlcmFsIHwKK2lucHV0X3BhcmFtZXRlciB8CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitlbnVtX2V4cHJlc3Npb24gOjo9IGVudW1fcHJpbWFyeSB8KHN1YnF1ZXJ5KQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZW51bV9wcmltYXJ5IDo6PSBzdGF0ZV9maWVsZF9wYXRoX2V4cHJlc3Npb24gfCBlbnVtX2xpdGVyYWwgfCBpbnB1dF9wYXJhbWV0ZXIgfAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZW50aXR5X2V4cHJlc3Npb24gOjo9IHNpbmdsZV92YWx1ZWRfYXNzb2NpYXRpb25fcGF0aF9leHByZXNzaW9uIHwKK3NpbXBsZV9lbnRpdHlfZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorc2ltcGxlX2VudGl0eV9leHByZXNzaW9uIDo6PSBpZGVudGlmaWNhdGlvbl92YXJpYWJsZSB8IGlucHV0X3BhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorZnVuY3Rpb25zX3JldHVybmluZ19udW1lcmljcyA6Oj0gPGxpdGVyYWw+TEVOR1RIPC9saXRlcmFsPiAoc3RyaW5nX3ByaW1hcnkpfAorPGxpdGVyYWw+TE9DQVRFPC9saXRlcmFsPiAoc3RyaW5nX3ByaW1hcnksc3RyaW5nX3ByaW1hcnkgWywKK3NpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb25dKSB8IDxsaXRlcmFsPkFCUzwvbGl0ZXJhbD4KKyhzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uKSB8IDxsaXRlcmFsPlNRUlQ8L2xpdGVyYWw+Cisoc2ltcGxlX2FyaXRobWV0aWNfZXhwcmVzc2lvbikgfCA8bGl0ZXJhbD5NT0Q8L2xpdGVyYWw+Cisoc2ltcGxlX2FyaXRobWV0aWNfZXhwcmVzc2lvbiwgc2ltcGxlX2FyaXRobWV0aWNfZXhwcmVzc2lvbikgfCA8bGl0ZXJhbD5TSVpFCis8L2xpdGVyYWw+IChjb2xsZWN0aW9uX3ZhbHVlZF9wYXRoX2V4cHJlc3Npb24pCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitmdW5jdGlvbnNfcmV0dXJuaW5nX2RhdGV0aW1lIDo6PSA8bGl0ZXJhbD5DVVJSRU5UX0RBVEU8L2xpdGVyYWw+IHwgPGxpdGVyYWw+CitDVVJSRU5UX1RJTUU8L2xpdGVyYWw+IHwgPGxpdGVyYWw+Q1VSUkVOVF9USU1FU1RBTVA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitmdW5jdGlvbnNfcmV0dXJuaW5nX3N0cmluZ3MgOjo9IDxsaXRlcmFsPkNPTkNBVDwvbGl0ZXJhbD4gKHN0cmluZ19wcmltYXJ5LAorc3RyaW5nX3ByaW1hcnkpIHwgPGxpdGVyYWw+U1VCU1RSSU5HPC9saXRlcmFsPiAoc3RyaW5nX3ByaW1hcnksCitzaW1wbGVfYXJpdGhtZXRpY19leHByZXNzaW9uLHNpbXBsZV9hcml0aG1ldGljX2V4cHJlc3Npb24pfCA8bGl0ZXJhbD5UUklNCis8L2xpdGVyYWw+IChbW3RyaW1fc3BlY2lmaWNhdGlvbl0gW3RyaW1fY2hhcmFjdGVyXSA8bGl0ZXJhbD5GUk9NPC9saXRlcmFsPiBdCitzdHJpbmdfcHJpbWFyeSkgfCA8bGl0ZXJhbD5MT1dFUjwvbGl0ZXJhbD4gKHN0cmluZ19wcmltYXJ5KSB8IDxsaXRlcmFsPlVQUEVSCis8L2xpdGVyYWw+IChzdHJpbmdfcHJpbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK3RyaW1fc3BlY2lmaWNhdGlvbiA6Oj0gPGxpdGVyYWw+TEVBRElORzwvbGl0ZXJhbD4gfCA8bGl0ZXJhbD5UUkFJTElORzwvbGl0ZXJhbD4KK3wgPGxpdGVyYWw+Qk9USDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld19zcWxxdWVyeS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfc3FscXVlcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzMzNGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfc3FscXVlcnkueG1sCkBAIC0wLDAgKzEsMjYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxjaGFwdGVyIGlkPSJqcGFfb3ZlcnZpZXdfc3FscXVlcnkiPgorICAgIDx0aXRsZT4KKyAgICAgICAgU1FMIFF1ZXJpZXMKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3NxbHF1ZXJ5Ij4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBTUUwgcXVlcmllcworICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgPC9zZWVhbHNvPgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgU1FMCisgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8c2VlPgorICAgICAgICAgICAgU1FMIHF1ZXJpZXMKKyAgICAgICAgPC9zZWU+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBTUUwKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgcXVlcmllcworICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPHNlZT4KKyAgICAgICAgICAgIFNRTCBxdWVyaWVzCisgICAgICAgIDwvc2VlPgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgTmF0aXZlCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgIHF1ZXJpZXMKKyAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDxzZWU+CisgICAgICAgICAgICBTUUwgcXVlcmllcworICAgICAgICA8L3NlZT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8cGFyYT4KK0pQUUwgaXMgYSBwb3dlcmZ1bCBxdWVyeSBsYW5ndWFnZSwgYnV0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIGl0IGlzIG5vdCBlbm91Z2guCitNYXliZSB5b3UncmUgbWlncmF0aW5nIGEgSkRCQyBhcHBsaWNhdGlvbiB0byBKUEEgb24gYSBzdHJpY3QgZGVhZGxpbmUsIGFuZCB5b3UKK2Rvbid0IGhhdmUgdGltZSB0byB0cmFuc2xhdGUgeW91ciBleGlzdGluZyBTUUwgc2VsZWN0cyB0byBKUFFMLiBPciBtYXliZSBhCitjZXJ0YWluIHF1ZXJ5IHJlcXVpcmVzIGRhdGFiYXNlLXNwZWNpZmljIFNRTCB5b3VyIEpQQSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0CitzdXBwb3J0LiBPciBtYXliZSB5b3VyIERCQSBoYXMgc3BlbnQgaG91cnMgY3JhZnRpbmcgdGhlIHBlcmZlY3Qgc2VsZWN0IHN0YXRlbWVudAorZm9yIGEgcXVlcnkgaW4geW91ciBhcHBsaWNhdGlvbidzIGNyaXRpY2FsIHBhdGguIFdoYXRldmVyIHRoZSByZWFzb24sIFNRTAorcXVlcmllcyBjYW4gcmVtYWluIGFuIGVzc2VudGlhbCBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KK1lvdSBhcmUgcHJvYmFibHkgZmFtaWxpYXIgd2l0aCBleGVjdXRpbmcgU1FMIHF1ZXJpZXMgYnkgb2J0YWluaW5nIGEgPGNsYXNzbmFtZT4KK2phdmEuc3FsLkNvbm5lY3Rpb248L2NsYXNzbmFtZT4sIHVzaW5nIHRoZSBKREJDIEFQSXMgdG8gY3JlYXRlIGEgPGNsYXNzbmFtZT4KK1N0YXRlbWVudDwvY2xhc3NuYW1lPiwgYW5kIGV4ZWN1dGluZyB0aGF0IDxjbGFzc25hbWU+U3RhdGVtZW50PC9jbGFzc25hbWU+IHRvCitvYnRhaW4gYSA8Y2xhc3NuYW1lPlJlc3VsdFNldDwvY2xhc3NuYW1lPi4gQW5kIG9mIGNvdXJzZSwgeW91IGFyZSBmcmVlIHRvCitjb250aW51ZSB1c2luZyB0aGlzIGxvdy1sZXZlbCBhcHByb2FjaCB0byBTUUwgZXhlY3V0aW9uIGluIHlvdXIgSlBBCithcHBsaWNhdGlvbnMuIEhvd2V2ZXIsIEpQQSBhbHNvIHN1cHBvcnRzIGV4ZWN1dGluZyBTUUwgcXVlcmllcyB0aHJvdWdoIHRoZQorPGNsYXNzbmFtZT5qYXZheC5wZXJzaXN0ZW5jZS5RdWVyeTwvY2xhc3NuYW1lPiBpbnRlcmZhY2UgaW50cm9kdWNlZCBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3F1ZXJ5Ii8+LiBVc2luZyBhIEpQQSBTUUwgcXVlcnksIHlvdSBjYW4KK3JldHJpZXZlIGVpdGhlciBwZXJzaXN0ZW50IG9iamVjdHMgb3IgcHJvamVjdGlvbnMgb2YgY29sdW1uIHZhbHVlcy4gVGhlCitmb2xsb3dpbmcgc2VjdGlvbnMgZGV0YWlsIGVhY2ggdXNlLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3NxbHF1ZXJ5X2NyZWF0ZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIENyZWF0aW5nIFNRTCBRdWVyaWVzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3NxbHF1ZXJ5X2NyZWF0ZSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBTUUwgcXVlcmllcworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjcmVhdGluZworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1RoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaGFzIHR3byBmYWN0b3J5IG1ldGhvZHMgc3VpdGFibGUgZm9yCitjcmVhdGluZyBTUUwgcXVlcmllczoKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIFF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBzcWxTdHJpbmcsIENsYXNzIHJlc3VsdENsYXNzKTsKK3B1YmxpYyBRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsU3RyaW5nLCBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1RoZSBmaXJzdCBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiBpbnN0YW5jZQordGhhdCB3aWxsIHJldHVybiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RoZSBzZWNvbmQgbWV0aG9kIHVzZXMgYSA8bGl0ZXJhbD5TcWxSZXN1bHRTZXRNYXBwaW5nPC9saXRlcmFsPiB0byBkZXRlcm1pbmUgdGhlCit0eXBlIG9mIG9iamVjdCBvciBvYmplY3RzIHRvIHJldHVybi4gVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgdGhlc2UgbWV0aG9kcyBpbgorYWN0aW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfc3FscXVlcnlfY3JlYXRlZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIENyZWF0aW5nIGEgU1FMIFF1ZXJ5CisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorRW50aXR5TWFuYWdlciBlbSA9IC4uLjsKK1F1ZXJ5IHF1ZXJ5ID0gZW0uY3JlYXRlTmF0aXZlUXVlcnkoIlNFTEVDVCAqIEZST00gTUFHIiwgTWFnYXppbmUuY2xhc3MpOworcHJvY2Vzc01hZ2F6aW5lcyhxdWVyeS5nZXRSZXN1bHRMaXN0KCkpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgU1FMIHF1ZXJpZXMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkIHByb2NlZHVyZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkIHByb2NlZHVyZXMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXMgcXVlcmllcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBRdWVyeQorICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorSW4gYWRkaXRpb24gdG8gU0VMRUNUIHN0YXRlbWVudHMsIE9wZW5KUEEgc3VwcG9ydHMgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9ucworYXMgU1FMIHF1ZXJpZXMuIE9wZW5KUEEgd2lsbCBhc3N1bWUgYW55IFNRTCB0aGF0IGRvZXMgbm90IGJlZ2luIHdpdGggdGhlCis8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGtleXdvcmQgKGlnbm9yaW5nIGNhc2UpIGlzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsLAorYW5kIGludm9rZSBpdCBhcyBzdWNoIGF0IHRoZSBKREJDIGxldmVsLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJqcGFfb3ZlcnZpZXdfc3FscXVlcnlfb2JqIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgUmV0cmlldmluZyBQZXJzaXN0ZW50IE9iamVjdHMgd2l0aCBTUUwKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfc3FscXVlcnlfb2JqIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFNRTCBxdWVyaWVzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHJldHJpZXZpbmcgcGVyc2lzdGVudCBvYmplY3RzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3NxbHF1ZXJ5X29iaiI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IG9iamVjdHMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcmV0cmlldmluZyB3aXRoIFNRTAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBTUUwgcXVlcmllcworICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitXaGVuIHlvdSBnaXZlIGEgU1FMIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gYSBjYW5kaWRhdGUgY2xhc3MsIGl0IHdpbGwKK3JldHVybiBwZXJzaXN0ZW50IGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzLiBBdCBhIG1pbmltdW0sIHlvdXIgU1FMIG11c3Qgc2VsZWN0Cit0aGUgY2xhc3MnIHByaW1hcnkga2V5IGNvbHVtbnMsIGRpc2NyaW1pbmF0b3IgY29sdW1uIChpZiBtYXBwZWQpLCBhbmQgdmVyc2lvbgorY29sdW1uIChhbHNvIGlmIG1hcHBlZCkuIFRoZSBKUEEgcnVudGltZSB1c2VzIHRoZSB2YWx1ZXMgb2YgdGhlIHByaW1hcnkga2V5Citjb2x1bW5zIHRvIGNvbnN0cnVjdCBlYWNoIHJlc3VsdCBvYmplY3QncyBpZGVudGl0eSwgYW5kIHBvc3NpYmx5IHRvIG1hdGNoIGl0Cit3aXRoIGEgcGVyc2lzdGVudCBvYmplY3QgYWxyZWFkeSBpbiB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+J3MKK2NhY2hlLiBXaGVuIGFuIG9iamVjdCBpcyBub3QgYWxyZWFkeSBjYWNoZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGEgbmV3CitvYmplY3QgdG8gcmVwcmVzZW50IHRoZSBjdXJyZW50IHJlc3VsdCByb3cuIEl0IG1pZ2h0IHVzZSB0aGUgZGlzY3JpbWluYXRvcgorY29sdW1uIHZhbHVlIHRvIG1ha2Ugc3VyZSBpdCBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiB0aGUgY29ycmVjdCBzdWJjbGFzcy4KK0ZpbmFsbHksIHRoZSBxdWVyeSByZWNvcmRzIGF2YWlsYWJsZSB2ZXJzaW9uIGNvbHVtbiBkYXRhIGZvciB1c2UgaW4gb3B0aW1pc3RpYworY29uY3VycmVuY3kgY2hlY2tpbmcsIHNob3VsZCB5b3UgbGF0ZXIgY2hhbmdlIHRoZSByZXN1bHQgb2JqZWN0IGFuZCBmbHVzaCBpdAorYmFjayB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitBc2lkZSBmcm9tIHRoZSBwcmltYXJ5IGtleSwgZGlzY3JpbWluYXRvciwgYW5kIHZlcnNpb24gY29sdW1ucywgYW55IGNvbHVtbnMgeW91CitzZWxlY3QgYXJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHBlcnNpc3RlbnQgZmllbGRzIG9mIGVhY2ggcmVzdWx0IG9iamVjdC4gSlBBCitpbXBsZW1lbnRhdGlvbnMgd2lsbCBjb21wZXRlIG9uIGhvdyBlZmZlY3RpdmVseSB0aGV5IG1hcCB5b3VyIHNlbGVjdGVkIGRhdGEgdG8KK3lvdXIgcGVyc2lzdGVudCBpbnN0YW5jZSBmaWVsZHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitMZXQncyBtYWtlIHRoZSBkaXNjdXNzaW9uIGFib3ZlIGNvbmNyZXRlIHdpdGggYW4gZXhhbXBsZS4gSXQgdXNlcyB0aGUgZm9sbG93aW5nCitzaW1wbGUgbWFwcGluZyBiZXR3ZWVuIGEgY2xhc3MgYW5kIHRoZSBkYXRhYmFzZToKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgMzIwIHggMTQ5IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9zcWxxdWVyeS1tb2RlbC5wbmciIHdpZHRoPSIyMTNweCIvPgorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImpwYV9vdmVydmlld19zcWxxdWVyeV9vYmpleCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgUmV0cmlldmluZyBQZXJzaXN0ZW50IE9iamVjdHMKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitRdWVyeSBxdWVyeSA9IGVtLmNyZWF0ZU5hdGl2ZVF1ZXJ5KCJTRUxFQ1QgSVNCTiwgVElUTEUsIFBSSUNFLCAiCisgICAgKyAiVkVSUyBGUk9NIE1BRyBXSEVSRSBQUklDRSAmZ3Q7IDUgQU5EIFBSSUNFICZsdDsgMTAiLCBNYWdhemluZS5jbGFzcyk7CitMaXN0Jmx0O01hZ2F6aW5lJmd0OyByZXN1bHRzID0gKExpc3QmbHQ7TWFnYXppbmUmZ3Q7KSBxdWVyeS5nZXRSZXN1bHRMaXN0KCk7Citmb3IgKE1hZ2F6aW5lIG1hZyA6IHJlc3VsdHMpCisgICAgcHJvY2Vzc01hZ2F6aW5lKG1hZyk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxwYXJhPgorVGhlIHF1ZXJ5IGFib3ZlIHdvcmtzIGFzIGFkdmVydGlzZWQsIGJ1dCBpc24ndCB2ZXJ5IGZsZXhpYmxlLiBMZXQncyB1cGRhdGUgaXQgdG8KK3Rha2UgaW4gcGFyYW1ldGVycyBmb3IgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gcHJpY2UsIHNvIHdlIGNhbiByZXVzZSBpdCB0byBmaW5kCittYWdhemluZXMgaW4gYW55IHByaWNlIHJhbmdlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJqcGFfb3ZlcnZpZXdfc3FscXVlcnlfb2JqX3BhcmFtZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNRTCBRdWVyeSBQYXJhbWV0ZXJzCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorUXVlcnkgcXVlcnkgPSBlbS5jcmVhdGVOYXRpdmVRdWVyeSgiU0VMRUNUIElTQk4sIFRJVExFLCBQUklDRSwgIgorICAgICsgIlZFUlMgRlJPTSBNQUcgV0hFUkUgUFJJQ0UgJmd0OyA/MSBBTkQgUFJJQ0UgJmx0OyA/MiIsIE1hZ2F6aW5lLmNsYXNzKTsKKworcXVlcnkuc2V0UGFyYW1ldGVyKDEsIDVkKTsKK3F1ZXJ5LnNldFBhcmFtZXRlcigyLCAxMGQpOworCitMaXN0Jmx0O01hZ2F6aW5lJmd0OyByZXN1bHRzID0gKExpc3QmbHQ7TWFnYXppbmUmZ3Q7KSBxdWVyeS5nZXRSZXN1bHRMaXN0KCk7Citmb3IgKE1hZ2F6aW5lIG1hZyA6IHJlc3VsdHMpCisgICAgcHJvY2Vzc01hZ2F6aW5lIChtYWcpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFNRTCBxdWVyaWVzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgaW4gU1FMIHF1ZXJpZXMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgU1FMIHF1ZXJpZXMKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CitMaWtlIEpEQkMgcHJlcGFyZWQgc3RhdGVtZW50cywgU1FMIHF1ZXJpZXMgcmVwcmVzZW50IHBhcmFtZXRlcnMgd2l0aCBxdWVzdGlvbgorbWFya3MsIGJ1dCBhcmUgZm9sbG93ZWQgYnkgYW4gaW50ZWdlciB0byByZXByZXNlbnQgaXRzIGluZGV4LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3RyYW5zLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld190cmFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0NDMxMQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV9vdmVydmlld190cmFucy54bWwKQEAgLTAsMCArMSw0MzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld190cmFucyI+CisgICAgPHRpdGxlPgorICAgICAgICBUcmFuc2FjdGlvbgorICAgIDwvdGl0bGU+CisgICAgPGluZGV4dGVybSB6b25lPSJqcGFfb3ZlcnZpZXdfdHJhbnMiPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIHRyYW5zYWN0aW9ucworICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgVHJhbnNhY3Rpb24KKyAgICAgICAgPC9zZWVhbHNvPgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxwYXJhPgorVHJhbnNhY3Rpb25zIGFyZSBjcml0aWNhbCB0byBtYWludGFpbmluZyBkYXRhIGludGVncml0eS4gVGhleSBhcmUgdXNlZCB0byBncm91cAorb3BlcmF0aW9ucyBpbnRvIHVuaXRzIG9mIHdvcmsgdGhhdCBhY3QgaW4gYW4gYWxsLW9yLW5vdGhpbmcgZmFzaGlvbi4KK1RyYW5zYWN0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgcXVhbGl0aWVzOgorICAgIDwvcGFyYT4KKyAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGF0b21pY2l0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXRvbWljaXR5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcz5BdG9taWNpdHk8L2VtcGhhc2lzPi4gQXRvbWljaXR5IHJlZmVycyB0byB0aGUgYWxsLW9yLW5vdGhpbmcgcHJvcGVydHkKK29mIHRyYW5zYWN0aW9ucy4gRWl0aGVyIGV2ZXJ5IGRhdGEgdXBkYXRlIGluIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0ZXMKK3N1Y2Nlc3NmdWxseSwgb3IgdGhleSBhbGwgZmFpbCwgbGVhdmluZyB0aGUgZGF0YXN0b3JlIGluIGl0cyBvcmlnaW5hbCBzdGF0ZS4gQQordHJhbnNhY3Rpb24gY2Fubm90IGJlIG9ubHkgcGFydGlhbGx5IHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29uc2lzdGVuY3kKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGNvbnNpc3RlbmN5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcz5Db25zaXN0ZW5jeTwvZW1waGFzaXM+LiBFYWNoIHRyYW5zYWN0aW9uIHRha2VzIHRoZSBkYXRhc3RvcmUgZnJvbSBvbmUKK2NvbnNpc3RlbnQgc3RhdGUgdG8gYW5vdGhlciBjb25zaXN0ZW50IHN0YXRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGlzb2xhdGlvbgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgaXNvbGF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcz5Jc29sYXRpb248L2VtcGhhc2lzPi4gVHJhbnNhY3Rpb25zIGFyZSBpc29sYXRlZCBmcm9tIGVhY2ggb3RoZXIuIFdoZW4KK3lvdSBhcmUgcmVhZGluZyBwZXJzaXN0ZW50IGRhdGEgaW4gb25lIHRyYW5zYWN0aW9uLCB5b3UgY2Fubm90ICJzZWUiIHRoZSBjaGFuZ2VzCit0aGF0IGFyZSBiZWluZyBtYWRlIHRvIHRoYXQgZGF0YSBpbiBvdGhlciB0cmFuc2FjdGlvbnMuIFNpbWlsYXJseSwgdGhlIHVwZGF0ZXMKK3lvdSBtYWtlIGluIG9uZSB0cmFuc2FjdGlvbiBjYW5ub3QgY29uZmxpY3Qgd2l0aCB1cGRhdGVzIG1hZGUgaW4gY29uY3VycmVudAordHJhbnNhY3Rpb25zLiBUaGUgZm9ybSBvZiBjb25mbGljdCByZXNvbHV0aW9uIGVtcGxveWVkIGRlcGVuZHMgb24gd2hldGhlciB5b3UKK2FyZSB1c2luZyBwZXNzaW1pc3RpYyBvciBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucy4gQm90aCB0eXBlcyBhcmUgZGVzY3JpYmVkIGxhdGVyCitpbiB0aGlzIGNoYXB0ZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZHVyYWJpbGl0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZHVyYWJpbGl0eQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8ZW1waGFzaXM+RHVyYWJpbGl0eTwvZW1waGFzaXM+LiBUaGUgZWZmZWN0cyBvZiBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyBhcmUKK2R1cmFibGU7IHRoZSB1cGRhdGVzIG1hZGUgdG8gcGVyc2lzdGVudCBkYXRhIGxhc3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKK2RhdGFzdG9yZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8cGFyYT4KKyAgICA8aW5kZXh0ZXJtPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIEFDSUQKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgIHRyYW5zYWN0aW9ucworICAgICAgICA8L3NlZWFsc28+CisgICAgPC9pbmRleHRlcm0+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgQUNJRAorICAgICAgICA8L3NlY29uZGFyeT4KKyAgICA8L2luZGV4dGVybT4KK1RvZ2V0aGVyLCB0aGVzZSBxdWFsaXRpZXMgYXJlIGNhbGxlZCB0aGUgQUNJRCBwcm9wZXJ0aWVzIG9mIHRyYW5zYWN0aW9ucy4gVG8KK3VuZGVyc3RhbmQgd2h5IHRoZXNlIHByb3BlcnRpZXMgYXJlIHNvIGltcG9ydGFudCB0byBtYWludGFpbmluZyBkYXRhIGludGVncml0eSwKK2NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CitTdXBwb3NlIHlvdSBjcmVhdGUgYW4gYXBwbGljYXRpb24gdG8gbWFuYWdlIGJhbmsgYWNjb3VudHMuIFRoZSBhcHBsaWNhdGlvbgoraW5jbHVkZXMgYSBtZXRob2QgdG8gdHJhbnNmZXIgZnVuZHMgZnJvbSBvbmUgdXNlciB0byBhbm90aGVyLCBhbmQgaXQgbG9va3MKK3NvbWV0aGluZyBsaWtlIHRoaXM6CisgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIHZvaWQgdHJhbnNmZXJGdW5kcyhVc2VyIGZyb20sIFVzZXIgdG8sIGRvdWJsZSBhbW50KSB7CisgICAgZnJvbS5kZWNyZW1lbnRBY2NvdW50KGFtbnQpOworICAgIHRvLmluY3JlbWVudEFjY291bnQoYW1udCk7Cit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgIDxwYXJhPgorTm93IHN1cHBvc2UgdGhhdCB1c2VyIEFsaWNlIHdhbnRzIHRvIHRyYW5zZmVyIDEwMCBkb2xsYXJzIHRvIHVzZXIgQm9iLiBObworcHJvYmxlbTsgeW91IHNpbXBseSBpbnZva2UgeW91ciA8bWV0aG9kbmFtZT50cmFuc2ZlckZ1bmRzPC9tZXRob2RuYW1lPiBtZXRob2QsCitzdXBwbHlpbmcgQWxpY2UgaW4gdGhlIDxsaXRlcmFsPmZyb208L2xpdGVyYWw+IHBhcmFtZXRlciwgQm9iIGluIHRoZSA8bGl0ZXJhbD4KK3RvPC9saXRlcmFsPiBwYXJhbWV0ZXIsIGFuZCA8bGl0ZXJhbD4xMDAuMDA8L2xpdGVyYWw+IGFzIHRoZSA8bGl0ZXJhbD5hbW50Cis8L2xpdGVyYWw+LiBUaGUgZmlyc3QgbGluZSBvZiB0aGUgbWV0aG9kIGlzIGV4ZWN1dGVkLCBhbmQgMTAwIGRvbGxhcnMgaXMKK3N1YnRyYWN0ZWQgZnJvbSBBbGljZSdzIGFjY291bnQuIEJ1dCB0aGVuLCBzb21ldGhpbmcgZ29lcyB3cm9uZy4gQW4gdW5leHBlY3RlZAorZXhjZXB0aW9uIG9jY3Vycywgb3IgdGhlIGhhcmR3YXJlIGZhaWxzLCBhbmQgeW91ciBtZXRob2QgbmV2ZXIgY29tcGxldGVzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KK1lvdSBhcmUgbGVmdCB3aXRoIGEgc2l0dWF0aW9uIGluIHdoaWNoIHRoZSAxMDAgZG9sbGFycyBoYXMgc2ltcGx5IGRpc2FwcGVhcmVkLgorVGhhbmtzIHRvIHRoZSBmaXJzdCBsaW5lIG9mIHlvdXIgbWV0aG9kLCBpdCBpcyBubyBsb25nZXIgaW4gQWxpY2UncyBhY2NvdW50LCBhbmQKK3lldCBpdCB3YXMgbmV2ZXIgdHJhbnNmZXJyZWQgdG8gQm9iJ3MgYWNjb3VudCBlaXRoZXIuIFRoZSBkYXRhc3RvcmUgaXMgaW4gYW4KK2luY29uc2lzdGVudCBzdGF0ZS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CitUaGUgaW1wb3J0YW5jZSBvZiB0cmFuc2FjdGlvbnMgc2hvdWxkIG5vdyBiZSBjbGVhci4gSWYgdGhlIHR3byBsaW5lcyBvZiB0aGUKKzxtZXRob2RuYW1lPnRyYW5zZmVyRnVuZHM8L21ldGhvZG5hbWU+IG1ldGhvZCBoYWQgYmVlbiBwbGFjZWQgdG9nZXRoZXIgaW4gYQordHJhbnNhY3Rpb24sIGl0IHdvdWxkIGJlIGltcG9zc2libGUgZm9yIG9ubHkgdGhlIGZpcnN0IGxpbmUgdG8gc3VjY2VlZC4gRWl0aGVyCit0aGUgZnVuZHMgd291bGQgYmUgdHJhbnNmZXJyZWQgcHJvcGVybHkgb3IgdGhleSB3b3VsZCBub3QgYmUgdHJhbnNmZXJyZWQgYXQgYWxsLAorYW5kIGFuIGV4Y2VwdGlvbiB3b3VsZCBiZSB0aHJvd24uIE1vbmV5IGNvdWxkIG5ldmVyIHZhbmlzaCBpbnRvIHRoaW4gYWlyLCBhbmQKK3RoZSBkYXRhIHN0b3JlIGNvdWxkIG5ldmVyIGdldCBpbnRvIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV9vdmVydmlld190cmFuc190eXBlcyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFRyYW5zYWN0aW9uIFR5cGVzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3RyYW5zX3R5cGVzIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICB0eXBlcworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1RoZXJlIGFyZSB0d28gbWFqb3IgdHlwZXMgb2YgdHJhbnNhY3Rpb25zOiBwZXNzaW1pc3RpYyB0cmFuc2FjdGlvbnMgYW5kCitvcHRpbWlzdGljIHRyYW5zYWN0aW9ucy4gRWFjaCB0eXBlIGhhcyBib3RoIGFkdmFudGFnZXMgYW5kIGRpc2FkdmFudGFnZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcGVzc2ltaXN0aWMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHBlc3NpbWlzdGljIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMsIHBlc3NpbWlzdGljCisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBkZWFkbG9jaworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorUGVzc2ltaXN0aWMgdHJhbnNhY3Rpb25zIGdlbmVyYWxseSBsb2NrIHRoZSBkYXRhc3RvcmUgcmVjb3JkcyB0aGV5IGFjdCBvbiwKK3ByZXZlbnRpbmcgb3RoZXIgY29uY3VycmVudCB0cmFuc2FjdGlvbnMgZnJvbSB1c2luZyB0aGUgc2FtZSBkYXRhLiBUaGlzIGF2b2lkcworY29uZmxpY3RzIGJldHdlZW4gdHJhbnNhY3Rpb25zLCBidXQgY29uc3VtZXMgZGF0YWJhc2UgcmVzb3VyY2VzLiBBZGRpdGlvbmFsbHksCitsb2NraW5nIHJlY29yZHMgY2FuIHJlc3VsdCBpbiA8ZW1waGFzaXM+ZGVhZGxvY2s8L2VtcGhhc2lzPiwgYSBzaXR1YXRpb24gaW4KK3doaWNoIHR3byB0cmFuc2FjdGlvbnMgYXJlIGJvdGggd2FpdGluZyBmb3IgdGhlIG90aGVyIHRvIHJlbGVhc2UgaXRzIGxvY2tzCitiZWZvcmUgY29tcGxldGluZy4gVGhlIHJlc3VsdHMgb2YgYSBkZWFkbG9jayBhcmUgZGF0YXN0b3JlLWRlcGVuZGVudDsgdXN1YWxseQorb25lIHRyYW5zYWN0aW9uIGlzIGZvcmNlZnVsbHkgcm9sbGVkIGJhY2sgYWZ0ZXIgc29tZSBzcGVjaWZpZWQgdGltZW91dCBpbnRlcnZhbCwKK2FuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGRhdGFzdG9yZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgZGF0YXN0b3JlIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMsIGRhdGFzdG9yZQorICAgICAgICAgICAgPC9zZWU+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorVGhpcyBkb2N1bWVudCB3aWxsIG9mdGVuIHVzZSB0aGUgdGVybSA8ZW1waGFzaXM+ZGF0YXN0b3JlPC9lbXBoYXNpcz4gdHJhbnNhY3Rpb24KK2luIHBsYWNlIG9mIDxlbXBoYXNpcz5wZXNzaW1pc3RpYzwvZW1waGFzaXM+IHRyYW5zYWN0aW9uLiBUaGlzIGlzIHRvIGFja25vd2xlZGdlCit0aGF0IHNvbWUgZGF0YXN0b3JlcyBkbyBub3Qgc3VwcG9ydCBwZXNzaW1pc3RpYyBzZW1hbnRpY3MsIGFuZCB0aGF0IHRoZSBleGFjdAorbWVhbmluZyBvZiBhIG5vbi1vcHRpbWlzdGljIEpQQSB0cmFuc2FjdGlvbiBpcyBkZXBlbmRlbnQgb24gdGhlIGRhdGFzdG9yZS4gTW9zdAorb2YgdGhlIHRpbWUsIGEgZGF0YXN0b3JlIHRyYW5zYWN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYSBwZXNzaW1pc3RpYyB0cmFuc2FjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBvcHRpbWlzdGljCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMsIG9wdGltaXN0aWMKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KK09wdGltaXN0aWMgdHJhbnNhY3Rpb25zIGNvbnN1bWUgbGVzcyByZXNvdXJjZXMgdGhhbiBwZXNzaW1pc3RpYy9kYXRhc3RvcmUKK3RyYW5zYWN0aW9ucywgYnV0IG9ubHkgYXQgdGhlIGV4cGVuc2Ugb2YgcmVsaWFiaWxpdHkuIEJlY2F1c2Ugb3B0aW1pc3RpYwordHJhbnNhY3Rpb25zIGRvIG5vdCBsb2NrIGRhdGFzdG9yZSByZWNvcmRzLCB0d28gdHJhbnNhY3Rpb25zIG1pZ2h0IGNoYW5nZSB0aGUKK3NhbWUgcGVyc2lzdGVudCBpbmZvcm1hdGlvbiBhdCB0aGUgc2FtZSB0aW1lLCBhbmQgdGhlIGNvbmZsaWN0IHdpbGwgbm90IGJlCitkZXRlY3RlZCB1bnRpbCB0aGUgc2Vjb25kIHRyYW5zYWN0aW9uIGF0dGVtcHRzIHRvIGZsdXNoIG9yIGNvbW1pdC4gQXQgdGhpcyB0aW1lLAordGhlIHNlY29uZCB0cmFuc2FjdGlvbiB3aWxsIHJlYWxpemUgdGhhdCBhbm90aGVyIHRyYW5zYWN0aW9uIGhhcyBjb25jdXJyZW50bHkKK21vZGlmaWVkIHRoZSBzYW1lIHJlY29yZHMgKHVzdWFsbHkgdGhyb3VnaCBhIHRpbWVzdGFtcCBvciB2ZXJzaW9uaW5nIHN5c3RlbSksCithbmQgd2lsbCB0aHJvdyBhbiBhcHByb3ByaWF0ZSBleGNlcHRpb24uIE5vdGUgdGhhdCBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucyBzdGlsbAorbWFpbnRhaW4gZGF0YSBpbnRlZ3JpdHk7IHRoZXkgYXJlIHNpbXBseSBtb3JlIGxpa2VseSB0byBmYWlsIGluIGhlYXZpbHkKK2NvbmN1cnJlbnQgc2l0dWF0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0Rlc3BpdGUgdGhlaXIgZHJhd2JhY2tzLCBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucyBhcmUgdGhlIGJlc3QgY2hvaWNlIGZvciBtb3N0CithcHBsaWNhdGlvbnMuIFRoZXkgb2ZmZXIgYmV0dGVyIHBlcmZvcm1hbmNlLCBiZXR0ZXIgc2NhbGFiaWxpdHksIGFuZCBsb3dlciByaXNrCitvZiBoYW5naW5nIGR1ZSB0byBkZWFkbG9jay4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSB1c2VzIG9wdGltaXN0aWMgc2VtYW50aWNzIGJ5IGRlZmF1bHQsIGJ1dCBzdXBwb3J0cyBib3RoIG9wdGltaXN0aWMgYW5kCitkYXRhc3RvcmUgdHJhbnNhY3Rpb25zLiBPcGVuSlBBIGFsc28gb2ZmZXJzIGFkdmFuY2VkIGxvY2tpbmcgYW5kIHZlcnNpb25pbmcgQVBJcworZm9yIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgZGF0YWJhc2UgcmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgb2JqZWN0Cit2ZXJzaW9uaW5nLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2xvY2tpbmciLz4gb2YgdGhlIFJlZmVyZW5jZSBHdWlkZSBmb3IgCitkZXRhaWxzIG9uIGxvY2tpbmcuIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX3ZlcnNpb24iLz4KK29mIHRoaXMgZG9jdW1lbnQgY292ZXJzIHN0YW5kYXJkIG9iamVjdCB2ZXJzaW9uaW5nLCB3aGlsZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfanBhIi8+IG9mIHRoZSBSZWZlcmVuY2UgR3VpZGUgZGlzY3Vzc2VzCithZGRpdGlvbmFsIHZlcnNpb25pbmcgc3RyYXRlZ2llcyBhdmFpbGFibGUgaW4gT3BlbkpQQS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX292ZXJ2aWV3X3RyYW5zX2xvY2FsIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgVGhlIEVudGl0eVRyYW5zYWN0aW9uIEludGVyZmFjZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImpwYV9vdmVydmlld190cmFuc19sb2NhbCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgMTkzIHggMTU3IChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9qcGEtdHJhbnNhY3Rpb24ucG5nIiB3aWR0aD0iMTI5cHgiLz4KKworICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPHBhcmE+CitKUEEgaW50ZWdyYXRlcyB3aXRoIHlvdXIgY29udGFpbmVyJ3MgPGVtcGhhc2lzPm1hbmFnZWQ8L2VtcGhhc2lzPiB0cmFuc2FjdGlvbnMsCithbGxvd2luZyB5b3UgdG8gdXNlIHRoZSBjb250YWluZXIncyBkZWNsYXJhdGl2ZSB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBhbmQgaXRzCitKYXZhIFRyYW5zYWN0aW9uIEFQSSAoSlRBKSBpbXBsZW1lbnRhdGlvbiBmb3IgdHJhbnNhY3Rpb24gbWFuYWdlbWVudC4gT3V0c2lkZSBvZgorYSBjb250YWluZXIsIHRob3VnaCwgeW91IG11c3QgZGVtYXJjYXRlIHRyYW5zYWN0aW9ucyBtYW51YWxseSB0aHJvdWdoIEpQQS4gVGhlCis8Y2xhc3NuYW1lPkVudGl0eVRyYW5zYWN0aW9uPC9jbGFzc25hbWU+IGludGVyZmFjZSBjb250cm9scyB1bm1hbmFnZWQKK3RyYW5zYWN0aW9ucyBpbiBKUEEuCisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyB2b2lkIGJlZ2luKCk7CitwdWJsaWMgdm9pZCBjb21taXQoKTsKK3B1YmxpYyB2b2lkIHJvbGxiYWNrKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGRlbWFyY2F0aW9uCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZGVtYXJjYXRpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjb21taXQKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHJvbGxiYWNrCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CitUaGUgPG1ldGhvZG5hbWU+YmVnaW48L21ldGhvZG5hbWU+LCA8bWV0aG9kbmFtZT5jb21taXQ8L21ldGhvZG5hbWU+LCBhbmQKKzxtZXRob2RuYW1lPnJvbGxiYWNrPC9tZXRob2RuYW1lPiBtZXRob2RzIGRlbWFyY2F0ZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzLiBUaGUKK21ldGhvZHMgc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnk6IDxtZXRob2RuYW1lPmJlZ2luPC9tZXRob2RuYW1lPiBzdGFydHMgYQordHJhbnNhY3Rpb24sIDxtZXRob2RuYW1lPmNvbW1pdDwvbWV0aG9kbmFtZT4gYXR0ZW1wdHMgdG8gY29tbWl0IHRoZQordHJhbnNhY3Rpb24ncyBjaGFuZ2VzIHRvIHRoZSBkYXRhc3RvcmUsIGFuZCA8bWV0aG9kbmFtZT5yb2xsYmFjazwvbWV0aG9kbmFtZT4KK2Fib3J0cyB0aGUgdHJhbnNhY3Rpb24sIGluIHdoaWNoIGNhc2UgdGhlIGRhdGFzdG9yZSBpcyAicm9sbGVkIGJhY2siIHRvIGl0cworcHJldmlvdXMgc3RhdGUuIEpQQSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IHJvbGwgYmFjayB0cmFuc2FjdGlvbnMgaWYKK2FueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyB0aGUgY29tbWl0IHByb2Nlc3MuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitVbmxlc3MgeW91IGFyZSB1c2luZyBhbiBleHRlbmRlZCBwZXJzaXN0ZW5jZSBjb250ZXh0LCBjb21taXR0aW5nIG9yIHJvbGxpbmcgYmFjaworYWxzbyBlbmRzIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LiBBbGwgbWFuYWdlZCBlbnRpdGVzIHdpbGwgYmUgZGV0YWNoZWQgZnJvbSB0aGUKKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPi4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24KKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgaXNBY3RpdmUKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK0ZpbmFsbHksIHRoZSA8bWV0aG9kbmFtZT5pc0FjdGl2ZTwvbWV0aG9kbmFtZT4gbWV0aG9kIHJldHVybnMgPGxpdGVyYWw+dHJ1ZQorPC9saXRlcmFsPiBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MgKDxtZXRob2RuYW1lPmJlZ2luPC9tZXRob2RuYW1lPgoraGFzIGJlZW4gY2FsbGVkIG1vcmUgcmVjZW50bHkgdGhhbiA8bWV0aG9kbmFtZT5jb21taXQ8L21ldGhvZG5hbWU+IG9yCis8bWV0aG9kbmFtZT5yb2xsYmFjazwvbWV0aG9kbmFtZT4pLCBhbmQgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+IG90aGVyd2lzZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0ianBhX292ZXJ2aWV3X3RyYW5zX2dyb3VwIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBHcm91cGluZyBPcGVyYXRpb25zIHdpdGggVHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIHZvaWQgdHJhbnNmZXJGdW5kcyhFbnRpdHlNYW5hZ2VyIGVtLCBVc2VyIGZyb20sIFVzZXIgdG8sIGRvdWJsZSBhbW50KSB7CisgICAgLy8gbm90ZTogaXQgd291bGQgYmUgYmV0dGVyIHByYWN0aWNlIHRvIG1vdmUgdGhlIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uCisgICAgLy8gY29kZSBvdXQgb2YgdGhpcyBtZXRob2QsIGJ1dCBmb3IgdGhlIHB1cnBvc2VzIG9mIGV4YW1wbGUuLi4KKyAgICBUcmFuc2FjdGlvbiB0cmFucyA9IGVtLmdldFRyYW5zYWN0aW9uKCk7CisgICAgdHJhbnMuYmVnaW4oKTsKKyAgICB0cnkKKyAgICB7CisgICAgICAgIGZyb20uZGVjcmVtZW50QWNjb3VudChhbW50KTsKKyAgICAgICAgdG8uaW5jcmVtZW50QWNjb3VudChhbW50KTsKKyAgICAgICAgdHJhbnMuY29tbWl0KCk7CisgICAgfQorICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKQorICAgIHsKKyAgICAgICAgaWYgKHRyYW5zLmlzQWN0aXZlKCkpCisgICAgICAgICAgICB0cmFucy5yb2xsYmFjaygpOyAgIC8vIG9yIGNvdWxkIGF0dGVtcHQgdG8gZml4IGVycm9yIGFuZCByZXRyeQorICAgICAgICB0aHJvdyByZTsKKyAgICB9Cit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3doeS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfb3ZlcnZpZXdfd2h5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzkzMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX292ZXJ2aWV3X3doeS54bWwKQEAgLTAsMCArMSw2NzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9ImpwYV9vdmVydmlld193aHkiPgorICAgIDx0aXRsZT4KKyAgICAgICAgV2h5IEpQQT8KKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0ianBhX292ZXJ2aWV3X3doeSI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgSlBBCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgIHdoeQorICAgICAgICA8L3NlY29uZGFyeT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8cGFyYT4KK0phdmEgZGV2ZWxvcGVycyB3aG8gbmVlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgcGVyc2lzdGVudCBkYXRhIGFscmVhZHkgaGF2ZQorc2V2ZXJhbCBvcHRpb25zIGF2YWlsYWJsZSB0byB0aGVtOiBzZXJpYWxpemF0aW9uLCBKREJDLCBKRE8sIHByb3ByaWV0YXJ5CitvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIHRvb2xzLCBvYmplY3QgZGF0YWJhc2VzLCBhbmQgRUpCIDIgZW50aXR5IGJlYW5zLiBXaHkKK2ludHJvZHVjZSB5ZXQgYW5vdGhlciBwZXJzaXN0ZW5jZSBmcmFtZXdvcms/IFRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBpcyB0aGF0Cit3aXRoIHRoZSBleGNlcHRpb24gb2YgSkRPLCBlYWNoIG9mIHRoZSBhZm9yZW1lbnRpb25lZCBwZXJzaXN0ZW5jZSBzb2x1dGlvbnMgaGFzCitzZXZlcmUgbGltaXRhdGlvbnMuIEpQQSBhdHRlbXB0cyB0byBvdmVyY29tZSB0aGVzZSBsaW1pdGF0aW9ucywgYXMgaWxsdXN0cmF0ZWQKK2J5IHRoZSB0YWJsZSBiZWxvdy4KKyAgICA8L3BhcmE+CisgICAgPHRhYmxlIHRvY2VudHJ5PSIxIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgUGVyc2lzdGVuY2UgTWVjaGFuaXNtcworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8dGdyb3VwIGNvbHM9IjgiIGFsaWduPSJsZWZ0IiBjb2xzZXA9IjEiIHJvd3NlcD0iMSI+CisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJzdXAiLz4gCisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJzZXIiLz4gCisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJqZGJjIi8+IAorICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0ib3IiLz4gCisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJvYmpkYiIvPiAKKyAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9ImVqYjIiLz4gCisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJqZG8iLz4gCisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJqcGEiLz4gCisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9InN1cCI+CisgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0czoKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9InNlciI+CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqZGJjIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9STQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ib2JqZGIiPgorICAgICAgICAgICAgICAgICAgICAgICAgT0RCCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJlamIyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVKQiAyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqZG8iPgorICAgICAgICAgICAgICAgICAgICAgICAgSkRPCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzdXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgSmF2YSBPYmplY3RzCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkYmMiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvYmpkYiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZWpiMiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIE9PIENvbmNlcHRzCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkYmMiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvYmpkYiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZWpiMiI+CisgICAgICAgICAgICAgICAgICAgICAgICBObworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWwgSW50ZWdyaXR5CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkYmMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvYmpkYiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZWpiMiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbmN5CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkYmMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvYmpkYiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZWpiMiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIExhcmdlIERhdGEgU2V0cworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic2VyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqZGJjIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ib2JqZGIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImVqYjIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkbyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ianBhIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9InN1cCI+CisgICAgICAgICAgICAgICAgICAgICAgICBFeGlzdGluZyBTY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9InNlciI+CisgICAgICAgICAgICAgICAgICAgICAgICBObworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRiYyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ib3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9iamRiIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJlamIyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqZG8iPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpwYSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzdXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25hbCBhbmQgTm9uLVJlbGF0aW9uYWwgU3RvcmVzCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkYmMiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvYmpkYiI+CisgICAgICAgICAgICAgICAgICAgICAgICBObworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZWpiMiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJpZXMKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9InNlciI+CisgICAgICAgICAgICAgICAgICAgICAgICBObworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRiYyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ib3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9iamRiIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJlamIyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqZG8iPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpwYSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzdXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWN0IFN0YW5kYXJkcyAvIFBvcnRhYmlsaXR5CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJzZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpkYmMiPgorICAgICAgICAgICAgICAgICAgICAgICAgTm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJvYmpkYiI+CisgICAgICAgICAgICAgICAgICAgICAgICBObworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZWpiMiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqcGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ic3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsaWNpdHkKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9InNlciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iamRiYyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ib3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im9iamRiIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJlamIyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJqZG8iPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImpwYSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKyAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpQQQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB2cyBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxlbXBoYXNpcz5TZXJpYWxpemF0aW9uPC9lbXBoYXNpcz4gaXMgSmF2YSdzIGJ1aWx0LWluIG1lY2hhbmlzbSBmb3IgdHJhbnNmb3JtaW5nCithbiBvYmplY3QgZ3JhcGggaW50byBhIHNlcmllcyBvZiBieXRlcywgd2hpY2ggY2FuIHRoZW4gYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrCitvciBzdG9yZWQgaW4gYSBmaWxlLiBTZXJpYWxpemF0aW9uIGlzIHZlcnkgZWFzeSB0byB1c2UsIGJ1dCBpdCBpcyBhbHNvIHZlcnkKK2xpbWl0ZWQuIEl0IG11c3Qgc3RvcmUgYW5kIHJldHJpZXZlIHRoZSBlbnRpcmUgb2JqZWN0IGdyYXBoIGF0IG9uY2UsIG1ha2luZyBpdAordW5zdWl0YWJsZSBmb3IgZGVhbGluZyB3aXRoIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4gSXQgY2Fubm90IHVuZG8gY2hhbmdlcyB0aGF0CithcmUgbWFkZSB0byBvYmplY3RzIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB1cGRhdGluZyBpbmZvcm1hdGlvbiwgbWFraW5nIGl0Cit1bnN1aXRhYmxlIGZvciBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIHN0cmljdCBkYXRhIGludGVncml0eS4gTXVsdGlwbGUgdGhyZWFkcworb3IgcHJvZ3JhbXMgY2Fubm90IHJlYWQgYW5kIHdyaXRlIHRoZSBzYW1lIHNlcmlhbGl6ZWQgZGF0YSBjb25jdXJyZW50bHkgd2l0aG91dAorY29uZmxpY3Rpbmcgd2l0aCBlYWNoIG90aGVyLiBJdCBwcm92aWRlcyBubyBxdWVyeSBjYXBhYmlsaXRpZXMuIEFsbCB0aGVzZQorZmFjdG9ycyBtYWtlIHNlcmlhbGl6YXRpb24gdXNlbGVzcyBmb3IgYWxsIGJ1dCB0aGUgbW9zdCB0cml2aWFsIHBlcnNpc3RlbmNlCituZWVkcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBKYXZhIERhdGFiYXNlIENvbm5lY3Rpdml0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgICAgICBKREJDCisgICAgICAgICAgICAgICAgPC9zZWU+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpQQQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB2cyBKREJDCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK01hbnkgZGV2ZWxvcGVycyB1c2UgdGhlIDxlbXBoYXNpcz5KYXZhIERhdGFiYXNlIENvbm5lY3Rpdml0eTwvZW1waGFzaXM+IChKREJDKQorQVBJcyB0byBtYW5pcHVsYXRlIHBlcnNpc3RlbnQgZGF0YSBpbiByZWxhdGlvbmFsIGRhdGFiYXNlcy4gSkRCQyBvdmVyY29tZXMgbW9zdAorb2YgdGhlIHNob3J0Y29taW5ncyBvZiBzZXJpYWxpemF0aW9uOiBpdCBjYW4gaGFuZGxlIGxhcmdlIGFtb3VudHMgb2YgZGF0YSwgaGFzCittZWNoYW5pc21zIHRvIGVuc3VyZSBkYXRhIGludGVncml0eSwgc3VwcG9ydHMgY29uY3VycmVudCBhY2Nlc3MgdG8gaW5mb3JtYXRpb24sCithbmQgaGFzIGEgc29waGlzdGljYXRlZCBxdWVyeSBsYW5ndWFnZSBpbiBTUUwuIFVuZm9ydHVuYXRlbHksIEpEQkMgZG9lcyBub3QKK2R1cGxpY2F0ZSBzZXJpYWxpemF0aW9uJ3MgZWFzZSBvZiB1c2UuIFRoZSByZWxhdGlvbmFsIHBhcmFkaWdtIHVzZWQgYnkgSkRCQyB3YXMKK25vdCBkZXNpZ25lZCBmb3Igc3RvcmluZyBvYmplY3RzLCBhbmQgdGhlcmVmb3JlIGZvcmNlcyB5b3UgdG8gZWl0aGVyIGFiYW5kb24KK29iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyBmb3IgdGhlIHBvcnRpb25zIG9mIHlvdXIgY29kZSB0aGF0IGRlYWwgd2l0aAorcGVyc2lzdGVudCBkYXRhLCBvciB0byBmaW5kIGEgd2F5IG9mIG1hcHBpbmcgb2JqZWN0LW9yaWVudGVkIGNvbmNlcHRzIGxpa2UKK2luaGVyaXRhbmNlIHRvIHJlbGF0aW9uYWwgZGF0YWJhc2VzIHlvdXJzZWxmLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICAgICAgT1JNCisgICAgICAgICAgICAgICAgPC9zZWU+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9STQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHZzIE9STSBwcm9kdWN0cworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CitUaGVyZSBhcmUgbWFueSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBwcm9kdWN0cyB0aGF0IGNhbiBwZXJmb3JtIHRoZSBtYXBwaW5nCitiZXR3ZWVuIG9iamVjdHMgYW5kIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzIGZvciB5b3UuIFRoZXNlIDxlbXBoYXNpcz4KK29iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmc8L2VtcGhhc2lzPiAoT1JNKSBmcmFtZXdvcmtzIGFsbG93IHlvdSB0byBmb2N1cyBvbiB0aGUKK29iamVjdCBtb2RlbCBhbmQgbm90IGNvbmNlcm4geW91cnNlbGYgd2l0aCB0aGUgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKK29iamVjdC1vcmllbnRlZCBhbmQgcmVsYXRpb25hbCBwYXJhZGlnbXMuIFVuZm9ydHVuYXRlbHksIGVhY2ggb2YgdGhlc2UgcHJvZHVjdAoraGFzIGl0cyBvd24gc2V0IG9mIEFQSXMuIFlvdXIgY29kZSBiZWNvbWVzIHRpZWQgdG8gdGhlIHByb3ByaWV0YXJ5IGludGVyZmFjZXMgb2YKK2Egc2luZ2xlIHZlbmRvci4gSWYgdGhlIHZlbmRvciByYWlzZXMgcHJpY2VzLCBmYWlscyB0byBmaXggc2hvdy1zdG9wcGluZyBidWdzLAorb3IgZmFsbHMgYmVoaW5kIGluIGZlYXR1cmVzLCB5b3UgY2Fubm90IHN3aXRjaCB0byBhbm90aGVyIHByb2R1Y3Qgd2l0aG91dAorcmV3cml0aW5nIGFsbCBvZiB5b3VyIHBlcnNpc3RlbmNlIGNvZGUuIFRoaXMgaXMgcmVmZXJyZWQgdG8gYXMgdmVuZG9yIGxvY2staW4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGRhdGFiYXNlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIE9EQgorICAgICAgICAgICAgICAgIDwvc2VlPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBPREIKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpQQQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB2cyBPREJzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9EQk1HCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CitSYXRoZXIgdGhhbiBtYXAgb2JqZWN0cyB0byByZWxhdGlvbmFsIGRhdGFiYXNlcywgc29tZSBzb2Z0d2FyZSBjb21wYW5pZXMgaGF2ZQorZGV2ZWxvcGVkIGEgZm9ybSBvZiBkYXRhYmFzZSBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgdG8gc3RvcmUgb2JqZWN0cy4gVGhlc2UKKzxlbXBoYXNpcz5vYmplY3QgZGF0YWJhc2VzPC9lbXBoYXNpcz4gKE9EQnMpIGFyZSBvZnRlbiBtdWNoIGVhc2llciB0byB1c2UgdGhhbgorb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBzb2Z0d2FyZS4gVGhlIE9iamVjdCBEYXRhYmFzZSBNYW5hZ2VtZW50IEdyb3VwIChPRE1HKQord2FzIGZvcm1lZCB0byBjcmVhdGUgYSBzdGFuZGFyZCBBUEkgZm9yIGFjY2Vzc2luZyBvYmplY3QgZGF0YWJhc2VzOyBmZXcgb2JqZWN0CitkYXRhYmFzZSB2ZW5kb3JzLCBob3dldmVyLCBjb21wbHkgd2l0aCB0aGUgT0RNRydzIHJlY29tbWVuZGF0aW9ucy4gVGh1cywgdmVuZG9yCitsb2NrLWluIHBsYWd1ZXMgb2JqZWN0IGRhdGFiYXNlcyBhcyB3ZWxsLiBNYW55IGNvbXBhbmllcyBhcmUgYWxzbyBoZXNpdGFudCB0bworc3dpdGNoIGZyb20gdHJpZWQtYW5kLXRydWUgcmVsYXRpb25hbCBzeXN0ZW1zIHRvIHRoZSByZWxhdGl2ZWx5IHVua25vd24gb2JqZWN0CitkYXRhYmFzZSB0ZWNobm9sb2d5LiBGZXdlciBkYXRhLWFuYWx5c2lzIHRvb2xzIGFyZSBhdmFpbGFibGUgZm9yIG9iamVjdCBkYXRhYmFzZQorc3lzdGVtcywgYW5kIHRoZXJlIGFyZSB2YXN0IHF1YW50aXRpZXMgb2YgZGF0YSBhbHJlYWR5IHN0b3JlZCBpbiBvbGRlcgorcmVsYXRpb25hbCBkYXRhYmFzZXMuIEZvciBhbGwgb2YgdGhlc2UgcmVhc29ucyBhbmQgbW9yZSwgb2JqZWN0IGRhdGFiYXNlcyBoYXZlCitub3QgY2F1Z2h0IG9uIGFzIHdlbGwgYXMgdGhlaXIgY3JlYXRvcnMgaG9wZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW50ZXJwcmlzZSBKYXZhIEJlYW5zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIEVKQgorICAgICAgICAgICAgICAgIDwvc2VlPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFSkIKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpQQQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB2cyBFSkIgMgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CitUaGUgRW50ZXJwcmlzZSBFZGl0aW9uIG9mIHRoZSBKYXZhIHBsYXRmb3JtIGludHJvZHVjZWQgZW50aXR5IEVudGVycHJpc2UgSmF2YQorQmVhbnMgKEVKQnMpLiBFSkIgMi54IGVudGl0aWVzIGFyZSBjb21wb25lbnRzIHRoYXQgcmVwcmVzZW50IHBlcnNpc3RlbnQKK2luZm9ybWF0aW9uIGluIGEgZGF0YXN0b3JlLiBMaWtlIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgc29sdXRpb25zLCBFSkIgMi54CitlbnRpdGllcyBwcm92aWRlIGFuIG9iamVjdC1vcmllbnRlZCB2aWV3IG9mIHBlcnNpc3RlbnQgZGF0YS4gVW5saWtlCitvYmplY3QtcmVsYXRpb25hbCBzb2Z0d2FyZSwgaG93ZXZlciwgRUpCIDIueCBlbnRpdGllcyBhcmUgbm90IGxpbWl0ZWQgdG8KK3JlbGF0aW9uYWwgZGF0YWJhc2VzOyB0aGUgcGVyc2lzdGVudCBpbmZvcm1hdGlvbiB0aGV5IHJlcHJlc2VudCBtYXkgY29tZSBmcm9tIGFuCitFbnRlcnByaXNlIEluZm9ybWF0aW9uIFN5c3RlbSAoRUlTKSBvciBvdGhlciBzdG9yYWdlIGRldmljZS4gQWxzbywgRUpCIDIueAorZW50aXRpZXMgdXNlIGEgc3RyaWN0IHN0YW5kYXJkLCBtYWtpbmcgdGhlbSBwb3J0YWJsZSBhY3Jvc3MgdmVuZG9ycy4KK1VuZm9ydHVuYXRlbHksIHRoZSBFSkIgMi54IHN0YW5kYXJkIGlzIHNvbWV3aGF0IGxpbWl0ZWQgaW4gdGhlIG9iamVjdC1vcmllbnRlZAorY29uY2VwdHMgaXQgY2FuIHJlcHJlc2VudC4gQWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBpbmhlcml0YW5jZSwgcG9seW1vcnBoaXNtLCBhbmQKK2NvbXBsZXggcmVsYXRpb25zIGFyZSBhYnNlbnQuIEFkZGl0aW9uYWxseSwgRUJKIDIueCBlbnRpdGllcyBhcmUgZGlmZmljdWx0IHRvCitjb2RlLCBhbmQgdGhleSByZXF1aXJlIGhlYXZ5d2VpZ2h0IGFuZCBvZnRlbiBleHBlbnNpdmUgYXBwbGljYXRpb24gc2VydmVycyB0bworcnVuLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpETworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSlBBCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHZzIEpETworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CitUaGUgSkRPIHNwZWNpZmljYXRpb24gdXNlcyBhbiBBUEkgdGhhdCBpcyBzdHJpa2luZ2x5IHNpbWlsYXIgdG8gSlBBLiBKRE8sCitob3dldmVyLCBzdXBwb3J0cyBub24tcmVsYXRpb25hbCBkYXRhYmFzZXMsIGEgZmVhdHVyZSB0aGF0IHNvbWUgYXJndWUgZGlsdXRlcwordGhlIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPHBhcmE+CisgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBKUEEKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorSlBBIGNvbWJpbmVzIHRoZSBiZXN0IGZlYXR1cmVzIGZyb20gZWFjaCBvZiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtcyBsaXN0ZWQKK2Fib3ZlLiBDcmVhdGluZyBlbnRpdGllcyB1bmRlciBKUEEgaXMgYXMgc2ltcGxlIGFzIGNyZWF0aW5nIHNlcmlhbGl6YWJsZQorY2xhc3Nlcy4gSlBBIHN1cHBvcnRzIHRoZSBsYXJnZSBkYXRhIHNldHMsIGRhdGEgY29uc2lzdGVuY3ksIGNvbmN1cnJlbnQgdXNlLCBhbmQKK3F1ZXJ5IGNhcGFiaWxpdGllcyBvZiBKREJDLiBMaWtlIG9iamVjdC1yZWxhdGlvbmFsIHNvZnR3YXJlIGFuZCBvYmplY3QKK2RhdGFiYXNlcywgSlBBIGFsbG93cyB0aGUgdXNlIG9mIGFkdmFuY2VkIG9iamVjdC1vcmllbnRlZCBjb25jZXB0cyBzdWNoIGFzCitpbmhlcml0YW5jZS4gSlBBIGF2b2lkcyB2ZW5kb3IgbG9jay1pbiBieSByZWx5aW5nIG9uIGEgc3RyaWN0IHNwZWNpZmljYXRpb24gbGlrZQorSkRPIGFuZCBFSkIgMi54IGVudGl0aWVzLiBKUEEgZm9jdXNlcyBvbiByZWxhdGlvbmFsIGRhdGFiYXNlcy4gQW5kIGxpa2UgSkRPLCBKUEEKK2lzIGV4dHJlbWVseSBlYXN5IHRvIHVzZS4KKyAgICA8L3BhcmE+CisgICAgPG5vdGU+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSB0eXBpY2FsbHkgc3RvcmVzIGRhdGEgaW4gcmVsYXRpb25hbCBkYXRhYmFzZXMsIGJ1dCBjYW4gYmUgY3VzdG9taXplZCBmb3IKK3VzZSB3aXRoIG5vbi1yZWxhdGlvbmFsIGRhdGFzdG9yZXMgYXMgd2VsbC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvbm90ZT4KKyAgICA8cGFyYT4KK0pQQSBpcyBub3QgaWRlYWwgZm9yIGV2ZXJ5IGFwcGxpY2F0aW9uLiBGb3IgbWFueSBhcHBsaWNhdGlvbnMsIHRob3VnaCwgaXQKK3Byb3ZpZGVzIGFuIGV4Y2l0aW5nIGFsdGVybmF0aXZlIHRvIG90aGVyIHBlcnNpc3RlbmNlIG1lY2hhbmlzbXMuCisgICAgPC9wYXJhPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX3Jlc291cmNlcy54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9qcGFfcmVzb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY3NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX3Jlc291cmNlcy54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8YXBwZW5kaXggaWQ9ImpwYV9yZXNvdXJjZXMiPgorICAgIDx0aXRsZT4KKyAgICAgICAgSlBBIFJlc291cmNlcworICAgIDwvdGl0bGU+CisgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2Fib3V0SmF2YS9jb21tdW5pdHlwcm9jZXNzL2pzci9qc3JfMjIwX2RhdGFvYmouaHRtbCI+CitFSkIgMyBKU1IgcGFnZTwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIiPlN1biBFSkIgcGFnZTwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9pbmRleC5odG1sIj4KK2phdmF4LnBlcnNpc3RlbmNlIEphdmFkb2M8L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2MvaW5kZXguaHRtbCI+T3BlbkpQQSBKYXZhZG9jPC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSJQZXJzaXN0ZW5jZS5wZGYiPkxvY2FsbHkgbWlycm9yZWQgSlBBIHNwZWNpZmljYXRpb248L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorPC9hcHBlbmRpeD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV90dXRvcmlhbHMueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvanBhX3R1dG9yaWFscy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZjNjMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL2pwYV90dXRvcmlhbHMueG1sCkBAIC0wLDAgKzEsMTU0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0ianBhX3R1dG9yaWFscyI+CisgICAgPHRpdGxlPgorICAgICAgICBKUEEgVHV0b3JpYWxzCisgICAgPC90aXRsZT4KKyAgICA8c2VjdGlvbiBpZD0ianBhX3R1dG9yaWFsc19pbnRybyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE9wZW5KUEEgVHV0b3JpYWxzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhlc2UgdHV0b3JpYWxzIHByb3ZpZGUgc3RlcC1ieS1zdGVwIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdmFyaW91cyBmYWNldHMgb2YKK3RoZSBPcGVuSlBBIHN5c3RlbS4gVGhleSBhc3N1bWUgYSBnZW5lcmFsIGtub3dsZWRnZSBvZiBKUEEgYW5kIEphdmEuIEZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiB0aGVzZSBzdWJqZWN0cywgc2VlIHRoZSBmb2xsb3dpbmcgVVJMczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS8iPlN1bidzIEphdmEgc2l0ZTwvdWxpbms+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19pbnRybyI+SlBBIE92ZXJ2aWV3IERvY3VtZW50PC9saW5rPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGluayBsaW5rZW5kPSJqcGFfcmVzb3VyY2VzIj5MaW5rcyB0byBKUEE8L2xpbms+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfcmVxdWlyZW1lbnRzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBUdXRvcmlhbCBSZXF1aXJlbWVudHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZXNlIHR1dG9yaWFscyByZXF1aXJlIHRoYXQgSkRLIDEuNSBvciBncmVhdGVyIGJlIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyLAorYW5kIHRoYXQgPGxpdGVyYWw+amF2YTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmphdmFjPC9saXRlcmFsPiBhcmUgaW4geW91cgorPGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD4gd2hlbiB5b3Ugb3BlbiBhIGNvbW1hbmQgc2hlbGwuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImpwYV90dXRvcmlhbCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE9wZW5KUEEgVHV0b3JpYWwKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CitJbiB0aGlzIHR1dG9yaWFsIHlvdSB3aWxsIGJlY29tZSBmYW1pbGlhciB3aXRoIHRoZSBiYXNpYyB0b29scyBhbmQgZGV2ZWxvcG1lbnQKK3Byb2Nlc3NlcyB1bmRlciBPcGVuSlBBIGJ5IGNyZWF0aW5nIGEgc2ltcGxlIEpQQSBhcHBsaWNhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX3R1dG9yaWFsX2NoYXB0ZXIxIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBUaGUgUGV0IFNob3AKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0ltYWdpbmUgdGhhdCB5b3UgaGF2ZSBkZWNpZGVkIHRvIGNyZWF0ZSBhIHNvZnR3YXJlIHRvb2xraXQgdG8gYmUgdXNlZCBieSBwZXQKK3Nob3Agb3BlcmF0b3JzLiBUaGlzIHRvb2xraXQgbXVzdCBwcm92aWRlIGEgbnVtYmVyIG9mIHNvbHV0aW9ucyB0byBjb21tb24KK3Byb2JsZW1zIGVuY291bnRlcmVkIGF0IHBldCBzaG9wcy4gSW5kdXN0cnkgYW5hbHlzdHMgaW5kaWNhdGUgdGhhdCB0aGUgdGhyZWUKK21vc3QgZGVzaXJlZCBmZWF0dXJlcyBhcmUgaW52ZW50b3J5IG1haW50ZW5hbmNlLCBpbnZlbnRvcnkgZ3Jvd3RoIHNpbXVsYXRpb24sCithbmQgYmVoYXZpb3JhbCBhbmFseXNpcy4gTm90IG9uZSB0byBxdWVzdGlvbiB0aGUgc2FnZSBhZHZpY2Ugb2YgZXhwZXJ0cywgeW91CitjaG9vc2UgdG8gYXR0YWNrIHRoZXNlIHRocmVlIHByb2JsZW1zIGZpcnN0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitBY2NvcmRpbmcgdG8gdGhlIGFmb3JlbWVudGlvbmVkIGV4cGVydHMsIG1vc3QgcGV0IHNob3BzIGZvY3VzIG9uIHRocmVlIHR5cGVzIG9mCithbmltYWxzIG9ubHk6IGRvZ3MsIHJhYmJpdHMsIGFuZCBzbmFrZXMuIFRoaXMgb250b2xvZ3kgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZworY2xhc3MgaGllcmFyY2h5OgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8c2NyZWVuPiBBbmltYWwgXiB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLSsgfCB8IHwgRG9nIFJhYmJpdCBTbmFrZTwvc2NyZWVuPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV90dXRvcmlhbF9maWxlcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBJbmNsdWRlZCBGaWxlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitXZSBoYXZlIHByb3ZpZGVkIGFuIGltcGxlbWVudGF0aW9uIG9mIDxjbGFzc25hbWU+QW5pbWFsPC9jbGFzc25hbWU+IGFuZAorPGNsYXNzbmFtZT5Eb2c8L2NsYXNzbmFtZT4gY2xhc3NlcywgcGx1cyBzb21lIGhlbHBlciBjbGFzc2VzIGFuZCBmaWxlcyB0byBjcmVhdGUKK3RoZSBpbml0aWFsIHNjaGVtYSBhbmQgcG9wdWxhdGUgdGhlIGRhdGFiYXNlIHdpdGggc29tZSBzYW1wbGUgZG9ncy4gTGV0J3MgdGFrZSBhCitjbG9zZXIgbG9vayBhdCB0aGVzZSBjbGFzc2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uLy4uLy4uL3R1dG9yaWFsL3BlcnNpc3RlbmNlL0FuaW1hbE1haW50ZW5hbmNlLmphdmEiPjxjbGFzc25hbWU+Cit0dXRvcmlhbC5wZXJzaXN0ZW5jZS5BbmltYWxNYWludGVuYW5jZTwvY2xhc3NuYW1lPjwvdWxpbms+OiBQcm92aWRlcyBzb21lCit1dGlsaXR5IG1ldGhvZHMgZm9yIGV4YW1pbmluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZSBhbmltYWxzIHN0b3JlZCBpbiB0aGUKK2RhdGFiYXNlLiBXZSB3aWxsIGZpbGwgaW4gbWV0aG9kIGRlZmluaXRpb25zIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjMiLz4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iLi4vLi4vLi4vdHV0b3JpYWwvcGVyc2lzdGVuY2UvQW5pbWFsLmphdmEiPjxjbGFzc25hbWU+Cit0dXRvcmlhbC5wZXJzaXN0ZW5jZS5BbmltYWw8L2NsYXNzbmFtZT48L3VsaW5rPjogVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBvZiBhbGwKK2FuaW1hbHMgdGhhdCB0aGlzIHBldCBzdG9yZSBzb2Z0d2FyZSBjYW4gaGFuZGxlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uLy4uLy4uL3R1dG9yaWFsL3BlcnNpc3RlbmNlL0RvZy5qYXZhIj48Y2xhc3NuYW1lPgordHV0b3JpYWwucGVyc2lzdGVuY2UuRG9nPC9jbGFzc25hbWU+PC91bGluaz46IENvbnRhaW5zIGRhdGEgYW5kIG1ldGhvZHMKK3NwZWNpZmljIHRvIGRvZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iLi4vLi4vLi4vdHV0b3JpYWwvcGVyc2lzdGVuY2UvUmFiYml0LmphdmEiPjxjbGFzc25hbWU+Cit0dXRvcmlhbC5wZXJzaXN0ZW5jZS5SYWJiaXQ8L2NsYXNzbmFtZT48L3VsaW5rPjogQ29udGFpbnMgZGF0YSBhbmQgbWV0aG9kcworc3BlY2lmaWMgdG8gcmFiYml0cy4gSXQgd2lsbCBiZSB1c2VkIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV90dXRvcmlhbF9jaGFwdGVyNCIvPgorLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uLy4uLy4uL3R1dG9yaWFsL3BlcnNpc3RlbmNlL1NuYWtlLmphdmEiPjxjbGFzc25hbWU+Cit0dXRvcmlhbC5wZXJzaXN0ZW5jZS5TbmFrZTwvY2xhc3NuYW1lPjwvdWxpbms+OiBDb250YWlucyBkYXRhIGFuZCBtZXRob2RzCitzcGVjaWZpYyB0byBzbmFrZXMuIEl0IHdpbGwgYmUgdXNlZCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjUiLz4KKy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSIuLi8uLi8uLi9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiPjxmaWxlbmFtZT4KKy4uLy4uL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+PC91bGluaz46IFRoaXMgWE1MIGZpbGUgY29udGFpbnMKK09wZW5KUEEtc3BlY2lmaWMgYW5kIHN0YW5kYXJkIEpQQSBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJdCBpcyBpbXBvcnRhbnQgdG8gbG9hZCBhbGwgcGVyc2lzdGVudCBlbnRpdHkgY2xhc3NlcyBhdCBzdGFydHVwIHNvIHRoYXQgT3BlbkpQQQorY2FuIG1hdGNoIGRhdGFiYXNlIGRpc2NyaW1pbmF0b3IgdmFsdWVzIHRvIGVudGl0eSBjbGFzc2VzLiBPZnRlbiB0aGlzIGhhcHBlbnMKK2F1dG9tYXRpY2FsbHkuIFNvbWUgcGFydHMgb2YgdGhpcyB0dXRvcmlhbCwgaG93ZXZlciwgZG8gcmVxdWlyZSB0aGF0IGFsbCBlbnRpdHkKK2NsYXNzZXMgYmUgbG9hZGVkIGV4cGxpY2l0bHkuIFRoZSBKUEEgc3RhbmRhcmQgaW5jbHVkZXMgcGVyc2lzdGVudCBjbGFzcworbGlzdGluZ3MgaW4gaXRzIFhNTCBjb25maWd1cmF0aW9uIGZvcm1hdC4gQWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gPGZpbGVuYW1lPgorLi4vLi4vTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sPC9maWxlbmFtZT4gYmV0d2VlbiB0aGUgPGxpdGVyYWw+Jmx0O3Byb3ZpZGVyJmd0OworPC9saXRlcmFsPiBhbmQgdGhlIDxsaXRlcmFsPiZsdDtwcm9wZXJ0aWVzJmd0OzwvbGl0ZXJhbD4gZWxlbWVudHM6CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7Y2xhc3MmZ3Q7dHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsJmx0Oy9jbGFzcyZndDsKKyZsdDtjbGFzcyZndDt0dXRvcmlhbC5wZXJzaXN0ZW5jZS5Eb2cmbHQ7L2NsYXNzJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSIuLi8uLi8uLi90dXRvcmlhbC9wZXJzaXN0ZW5jZS9zb2x1dGlvbnMiPjxmaWxlbmFtZT5zb2x1dGlvbnMKKzwvZmlsZW5hbWU+PC91bGluaz46IFRoZSBzb2x1dGlvbnMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBzb2x1dGlvbnMgdG8KK3RoaXMgdHV0b3JpYWwsIGluY2x1ZGluZyBmaW5pc2hlZCB2ZXJzaW9ucyBvZiB0aGUgPGZpbGVuYW1lPi5qYXZhPC9maWxlbmFtZT4KK2ZpbGVzIGxpc3RlZCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfdXRpbGl0aWVzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEltcG9ydGFudCBVdGlsaXRpZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNvbW1hbmQ+amF2YTwvY29tbWFuZD46IFJ1bnMgbWFpbiBtZXRob2RzIGluIHNwZWNpZmllZCBKYXZhIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNvbW1hbmQ+amF2YWM8L2NvbW1hbmQ+OiBDb21waWxlcyA8ZmlsZW5hbWU+LmphdmE8L2ZpbGVuYW1lPiBmaWxlcyBpbnRvCis8ZmlsZW5hbWU+LmNsYXNzPC9maWxlbmFtZT4gZmlsZXMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYnkgPGNvbW1hbmQ+amF2YQorPC9jb21tYW5kPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8Y29tbWFuZD5vcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyPC9jb21tYW5kPjoKK1J1bnMgdGhlIE9wZW5KUEEgZW5oYW5jZXIgYWdhaW5zdCB0aGUgc3BlY2lmaWVkCitjbGFzc2VzLiBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSIvPgorIG9mIHRoZSBSZWZlcmVuY2UgR3VpZGUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGNvbW1hbmQ+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbDwvY29tbWFuZD46CitBIHV0aWxpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kCittYWludGFpbiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZ3MgYW5kIHNjaGVtYSBvZiBhbGwgcGVyc2lzdGVudCBjbGFzc2VzIGluCithIEpEQkMtY29tcGxpYW50IGRhdGFzdG9yZS4gVGhpcyBmdW5jdGlvbmFsaXR5IGFsbG93cyB0aGUgdW5kZXJseWluZyBtYXBwaW5ncworYW5kIHNjaGVtYSB0byBiZSBlYXNpbHkga2VwdCB1cC10by1kYXRlIHdpdGggdGhlIEphdmEgY2xhc3NlcyBpbiB0aGUgc3lzdGVtLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nIi8+IG9mIHRoZSBSZWZlcmVuY2UgR3VpZGUgZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEdldHRpbmcgU3RhcnRlZAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorTGV0J3MgY29tcGlsZSB0aGUgaW5pdGlhbCBjbGFzc2VzIGFuZCBzZWUgdGhlbSBpbiBhY3Rpb24uIFRvIGRvIHNvLCB3ZSBtdXN0Citjb21waWxlIHRoZSA8ZmlsZW5hbWU+LmphdmE8L2ZpbGVuYW1lPiBmaWxlcywgYXMgd2Ugd291bGQgd2l0aCBhbnkgSmF2YSBwcm9qZWN0LAorYW5kIHRoZW4gcGFzcyB0aGUgcmVzdWx0aW5nIGNsYXNzZXMgdGhyb3VnaCB0aGUgT3BlbkpQQSBlbmhhbmNlcjoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ0xBU1NQQVRICisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KK0JlIHN1cmUgdGhhdCB5b3VyIDxlbnZhcj5DTEFTU1BBVEg8L2VudmFyPiBpcyBzZXQgY29ycmVjdGx5LiBOb3RlIHRoYXQgeW91cgorT3BlbkpQQSBpbnN0YWxsIGRpcmVjdG9yeSBzaG91bGQgYmUgaW4gdGhlIDxlbnZhcj5DTEFTU1BBVEg8L2VudmFyPiwgYXMgdGhlCit0dXRvcmlhbCBjbGFzc2VzIGFyZSBsb2NhdGVkIGluIHRoZSA8bGl0ZXJhbD4gdHV0b3JpYWwvcGVyc2lzdGVuY2U8L2xpdGVyYWw+CitkaXJlY3RvcnkgdW5kZXIgeW91ciBPcGVuSlBBIGluc3RhbGwgZGlyZWN0b3J5LCBhbmQgYXJlIGluIHRoZSA8bGl0ZXJhbD4KK3R1dG9yaWFsLnBlcnNpc3RlbmNlPC9saXRlcmFsPiBwYWNrYWdlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxmaWxlbmFtZT4gdHV0b3JpYWwvcGVyc2lzdGVuY2U8L2ZpbGVuYW1lPiBkaXJlY3RvcnkuCitBbGwgZXhhbXBsZXMgdGhyb3VnaG91dCB0aGUgdHV0b3JpYWwgYXNzdW1lIHRoYXQgeW91IGFyZSBpbiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0V4YW1pbmUgPGZpbGVuYW1lPkFuaW1hbC5qYXZhPC9maWxlbmFtZT4sIDxmaWxlbmFtZT5Eb2cuamF2YTwvZmlsZW5hbWU+LCBhbmQKKzxmaWxlbmFtZT5TZWVkRGF0YWJhc2UuamF2YTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGVzZSBmaWxlcyBhcmUgZ29vZCBleGFtcGxlcyBvZiB0aGUgc2ltcGxpY2l0eSBKUEEgZW5nZW5kZXJzLiBBcyBub3RlZCBlYXJsaWVyLAorcGVyc2lzdGluZyBhbiBvYmplY3Qgb3IgbWFuaXB1bGF0aW5nIGFuIG9iamVjdCdzIHBlcnNpc3RlbnQgZGF0YSByZXF1aXJlcyBhbG1vc3QKK25vIEpQQS1zcGVjaWZpYyBjb2RlLiBGb3IgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIG9mIGNyZWF0aW5nIHBlcnNpc3RlbnQgb2JqZWN0cywKK3BsZWFzZSBzZWUgdGhlIDxsaXRlcmFsPnNlZWQ8L2xpdGVyYWw+IG1ldGhvZCBvZiA8ZmlsZW5hbWU+U2VlZERhdGFiYXNlLmphdmEKKzwvZmlsZW5hbWU+LiBOb3RlIHRoZSBvYmplY3RzIGFyZSBjcmVhdGVkIHdpdGggbm9ybWFsIEphdmEgY29uc3RydWN0b3JzLiBUaGUKK2ZpbGVzIDxmaWxlbmFtZT5BbmltYWwuamF2YTwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+RG9nLmphdmE8L2ZpbGVuYW1lPiBhcmUKK2Fsc28gZ29vZCBleGFtcGxlcyBvZiBob3cgSlBBIGFsbG93cyB5b3UgdG8gbWFuaXB1bGF0ZSBwZXJzaXN0ZW50IGRhdGEgd2l0aG91dAord3JpdGluZyBhbnkgc3BlY2lmaWMgSlBBIGNvZGUsIGJ5IHByb3ZpZGluZyBzaW1wbGUgYW5ub3RhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgPGZpbGVuYW1lPkFuaW1hbC5qYXZhPC9maWxlbmFtZT4gZmlsZS4gTm90aWNlIHRoYXQgdGhlCitjbGFzcyBpcyBhIFBsYWluIE9sZCBKYXZhIE9iamVjdCAoUE9KTyksIHdpdGggc2V2ZXJhbCBhbm5vdGF0aW9ucyBkZXNjcmliaW5nIGhvdwordGhlIGNsYXNzIGlzIG1hcHBlZCBpbnRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4gRmlyc3QsIGxldCdzIGV4YW1pbmUgdGhlIGNsYXNzCitsZXZlbCBhbm5vdGF0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorQEVudGl0eShuYW1lPSJBbmltYWwiKQorQFRhYmxlKG5hbWU9IkpQQV9UVVRfQU5JTUFMIikKK0BJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKQorQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT0iU1BFQ0lFUyIsIGxlbmd0aD0xMDApCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWFsCit7CisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBhbm5vdGF0aW9ucyBzZXJ2ZSB0byBtYXAgdGhlIGNsYXNzIGludG8gdGhlIGRhdGFiYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgorb24gdGhlc2UgYW5kIG90aGVyIGFubm90YXRpb25zLCBzZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGEiLz4KK2FuZCA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y29tbWFuZD5ARW50aXR5PC9jb21tYW5kPjogVGhpcyBhbm5vdGF0aW9uIGluZGljYXRlcyB0aGF0IGluc3RhbmNlcyBvZiB0aGlzCitjbGFzcyBtYXkgYmUgcGVyc2lzdGVudCBlbnRpdGllcy4gVGhlIHZhbHVlIG9mIHRoZSA8Y29tbWFuZD5uYW1lPC9jb21tYW5kPgorYXR0cmlidXRlIGlzIHRoZSBlbnRpdHkgbmFtZSwgYW5kIGlzIHVzZWQgaW4gcXVlcmllcywgZXRjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y29tbWFuZD5AVGFibGU8L2NvbW1hbmQ+OiBUaGlzIGFubm90YXRpb24gaXMgdXNlZCB0byBtYXAgdGhlIGVudGl0eSB0byBhCitwcmltYXJ5IHRhYmxlLiBUaGUgdmFsdWUgb2YgdGhlIDxjb21tYW5kPm5hbWU8L2NvbW1hbmQ+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlCituYW1lIG9mIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHVzZSBhcyB0aGUgcHJpbWFyeSB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNvbW1hbmQ+QEluaGVyaXRhbmNlPC9jb21tYW5kPjogV2hlbiBtdWx0aXBsZSBjbGFzc2VzIGluIGFuIGluaGVyaXRhbmNlCitoaWVyYXJjaHkgYXJlIHBlcnNpc3RlbnQgZW50aXR5IHR5cGVzLCBpdCBpcyBpbXBvcnRhbnQgdG8gZGVzY3JpYmUgaG93IHRoZQoraW5oZXJpdGFuY2UgaGllcmFyY2h5IGlzIG1hcHBlZC4gU2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIDxjb21tYW5kPnN0cmF0ZWd5Cis8L2NvbW1hbmQ+IGF0dHJpYnV0ZSB0byA8Y29tbWFuZD5Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFPC9jb21tYW5kPgoraW5kaWNhdGVzIHRoYXQgdGhlIHByaW1hcnkgdGFibGUgZm9yIGFsbCBzdWJjbGFzc2VzIHNoYWxsIGJlIHRoZSBzYW1lIHRhYmxlIGFzCitmb3IgdGhlIHN1cGVyY2xhc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxjb21tYW5kPkBEaXNjcmltaW5hdG9yQ29sdW1uPC9jb21tYW5kPjogV2l0aCBhIDxjb21tYW5kPlNJTkdMRV9UQUJMRTwvY29tbWFuZD4KK2luaGVyaXRhbmNlIG1hcHBpbmcgc3RyYXRlZ3ksIGluc3RhbmNlcyBvZiBtdWx0aXBsZSBjbGFzc2VzIHdpbGwgYmUgc3RvcmVkIGluCit0aGUgc2FtZSB0YWJsZS4gVGhpcyBhbm5vdGF0aW9uIGRlc2NyaWJlcyBhIGNvbHVtbiBpbiB0aGF0IHRhYmxlIHRoYXQgaXMgdXNlZCB0bworZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIGluc3RhbmNlIHdob3NlIGRhdGEgaXMgc3RvcmVkIGluIGEgcGFydGljdWxhciByb3cuIFRoZQorPGNvbW1hbmQ+bmFtZTwvY29tbWFuZD4gYXR0cmlidXRlIGlzIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4sIGFuZCB0aGUgPGNvbW1hbmQ+CitsZW5ndGg8L2NvbW1hbmQ+IGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIGNvbHVtbi4gQnkgZGVmYXVsdCwgdGhlCit1bnF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaW5zdGFuY2UgaXMgc3RvcmVkIGluIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbi4KK1RvIHN0b3JlIGEgZGlmZmVyZW50IHZhbHVlIGZvciBhIHR5cGUsIHVzZSB0aGUgPGNvbW1hbmQ+QERpc2NyaW1pbmF0b3JWYWx1ZQorPC9jb21tYW5kPiBhbm5vdGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTGV0J3MgdGFrZSBhIGxvb2sgYXQgb3VyIGNsYXNzJyBmaWVsZCBhbm5vdGF0aW9ucy4gV2UgaGF2ZSBjaG9zZW4gdG8gdXNlCis8ZW1waGFzaXM+ZmllbGQgYWNjZXNzPC9lbXBoYXNpcz4gZm9yIG91ciBlbnRpdGllcywgbWVhbmluZyB0aGUgcGVyc2lzdGVuY2UKK2ltcGxlbWVudGF0aW9uIHdpbGwgZ2V0IGFuZCBzZXQgcGVyc2lzdGVudCBzdGF0ZSBkaXJlY3RseSB0aHJvdWdoIG91ciBjbGFzcycKK2RlY2xhcmVkIGZpZWxkcy4gV2UgY291bGQgaGF2ZSBjaG9zZW4gdG8gdXNlIDxlbXBoYXNpcz4gcHJvcGVydHkgYWNjZXNzCis8L2VtcGhhc2lzPiwgaW4gd2hpY2ggdGhlIGltcGxlbWVudGF0aW9uIGFjY2Vzc2VzIHBlcnNpc3RlbnQgc3RhdGUgdGhyb3VnaCBvdXIKK0phdmFCZWFuIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSBhbm5vdGF0ZWQgb3VyCitnZXR0ZXIgbWV0aG9kcyByYXRoZXIgdGhhbiBvdXIgZmllbGRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitASWQKK0BHZW5lcmF0ZWRWYWx1ZQorQENvbHVtbihuYW1lPSJJRCIpCitwcml2YXRlIGxvbmcgaWQ7CisKK0BCYXNpYyBAQ29sdW1uKG5hbWU9IkFOSU1BTF9OQU1FIikKK3ByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCitAQmFzaWMgQENvbHVtbihuYW1lPSJDT1NUIikKK3ByaXZhdGUgZmxvYXQgcHJpY2UgPSAwZjsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGFubm90YXRpb25zIHNlcnZlIHRvIG1hcCB0aGUgZmllbGRzIGludG8gdGhlIGRhdGFiYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgorb24gdGhlc2UgYW5kIG90aGVyIGFubm90YXRpb25zLCBzZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGEiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNvbW1hbmQ+QElkPC9jb21tYW5kPjogVGhpcyBhbm5vdGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyB0byBiZQorbWFwcGVkIHRvIGEgcHJpbWFyeSBrZXkgY29sdW1uIGluIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNvbW1hbmQ+QEdlbmVyYXRlZFZhbHVlPC9jb21tYW5kPjogSW5kaWNhdGVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwKK2dlbmVyYXRlIGEgdmFsdWUgZm9yIHRoZSBmaWVsZCBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y29tbWFuZD5AQ29sdW1uPC9jb21tYW5kPjogVGhpcyBhbm5vdGF0aW9uIGRlc2NyaWJlcyB0aGUgY29sdW1uIHRvIHdoaWNoIHRoZQorZmllbGQgd2lsbCBiZSBtYXBwZWQuIFRoZSA8Y29tbWFuZD5uYW1lPC9jb21tYW5kPiBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBuYW1lCitvZiB0aGUgY29sdW1uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y29tbWFuZD5AQmFzaWM8L2NvbW1hbmQ+OiBUaGlzIGFubm90YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIGlzIHNpbXBseQorbWFwcGVkIGludG8gYSBjb2x1bW4uIFRoZXJlIGFyZSBvdGhlciBhbm5vdGF0aW9ucyB0aGF0IGluZGljYXRlIGVudGl0eQorcmVsYXRpb25zaGlwcyBhbmQgb3RoZXIgbW9yZSBjb21wbGV4IG1hcHBpbmdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQ29tcGlsZSB0aGUgPGZpbGVuYW1lPi5qYXZhPC9maWxlbmFtZT4gZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmFjICouamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIHVzZSBhbnkgamF2YSBjb21waWxlciBpbnN0ZWFkIG9mIDxjb21tYW5kPmphdmFjPC9jb21tYW5kPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0VuaGFuY2UgdGhlIHBlcnNpc3RlbnQgY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyIEFuaW1hbC5qYXZhIERvZy5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgc3RlcCBydW5zIHRoZSBPcGVuSlBBIGVuaGFuY2VyIG9uIHRoZSA8ZmlsZW5hbWU+QW5pbWFsLmphdmE8L2ZpbGVuYW1lPiBhbmQKKzxmaWxlbmFtZT5Eb2cuamF2YTwvZmlsZW5hbWU+IGZpbGVzIG1lbnRpb25lZCBhYm92ZS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSIvPiBvZiB0aGUgUmVmZXJlbmNlIEd1aWRlIGZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiB0aGUgZW5oYW5jZXIsIGluY2x1ZGluZyBob3cgdG8gdXNlIGF1dG9tYXRpYyBydW50aW1lIGVuaGFuY2VtZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+LXA8L2xpdGVyYWw+IGZsYWcgcG9pbnRzIHRoZSBlbmhhbmNlciB0byB5b3VyIDxmaWxlbmFtZT4KK3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+IGNvbmZpZ3VyYXRpb24gZmlsZS4gQWxsIE9wZW5KUEEgdG9vbHMgbG9vayBmb3IKK2RlZmF1bHQgY29uZmlndXJhdGlvbiBpbiBhIHJlc291cmNlIGNhbGxlZCA8ZmlsZW5hbWU+b3BlbmpwYS54bWw8L2ZpbGVuYW1lPiBvcgorPGZpbGVuYW1lPk1FVEEtSU5GL29wZW5qcGEueG1sPC9maWxlbmFtZT4uIFRodXMgeW91IGNhbiBhdm9pZCBwYXNzaW5nIHRoZQorPGxpdGVyYWw+LXA8L2xpdGVyYWw+IGFyZ3VtZW50IHRvIHRvb2xzIGJ5IHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgaW4KK3BsYWNlIG9mIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPi4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZiIvPiBpbiB0aGUgUmVmZXJlbmNlIEd1aWRlIGZvciBkZXRhaWxzIG9uCitPcGVuSlBBIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjJfZGF0YXN0b3JlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHRoZSBEYXRhc3RvcmUKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorTm93IHRoYXQgd2UndmUgY29tcGlsZWQgdGhlIHNvdXJjZSBmaWxlcyBhbmQgZW5oYW5jZWQgdGhlIHBlcnNpc3RlbnQgY2xhc3NlcywKK3dlJ3JlIHJlYWR5IHRvIHNldCB1cCB0aGUgZGF0YWJhc2UuIDx1bGluayB1cmw9Imh0dHA6Ly9oc3FsZGIuc291cmNlZm9yZ2UubmV0Ij4KK0h5cGVyc29uaWMgU1FMPC91bGluaz4sIGEgcHVyZSBKYXZhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGlzIGluY2x1ZGVkIGluIHRoZQorT3BlbkpQQSBkaXN0cmlidXRpb24uIFdlIGhhdmUgaW5jbHVkZWQgdGhpcyBkYXRhYmFzZSBiZWNhdXNlIGl0IGlzIHNpbXBsZSB0byBzZXQKK3VwIGFuZCBoYXMgYSBzbWFsbCBtZW1vcnkgZm9vdHByaW50OyBob3dldmVyLCB5b3UgY2FuIHVzZSB0aGlzIHR1dG9yaWFsIHdpdGggYW55CitvZiB0aGUgcmVsYXRpb25hbCBkYXRhYmFzZXMgdGhhdCB3ZSBzdXBwb3J0LiBZb3UgY2FuIGFsc28gd3JpdGUgeW91ciBvd24gcGx1Z2luCitmb3IgYW55IGRhdGFiYXNlIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQuIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCB0aGlzCit0dXRvcmlhbCBvbmx5IGRlc2NyaWJlcyBob3cgdG8gc2V0IHVwIGNvbm5lY3Rpdml0eSB0byBhIEh5cGVyc29uaWMgU1FMIGRhdGFiYXNlLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbm5lY3QgdG8gYSBkaWZmZXJlbnQgZGF0YWJhc2Ugb3IgaG93IHRvIGFkZAorc3VwcG9ydCBmb3Igb3RoZXIgZGF0YWJhc2VzLCBzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXAiLz4gb2YKK3RoZSBSZWZlcmVuY2UgR3VpZGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdUb29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CitDcmVhdGUgdGhlIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmdzIGFuZCBkYXRhYmFzZSBzY2hlbWEuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgQW5pbWFsLmphdmEgRG9nLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgY29tbWFuZCBwcm9wYWdhdGVzIHRoZSBuZWNlc3Nhcnkgc2NoZW1hIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzZXMgdG8gdGhlCitkYXRhYmFzZSBjb25maWd1cmVkIGluIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPi4gSWYgeW91IGFyZSB1c2luZwordGhlIGRlZmF1bHQgSHlwZXJzb25pYyBTUUwgc2V0dXAsIHRoZSBmaXJzdCB0aW1lIHlvdSBydW4gdGhlIG1hcHBpbmcgdG9vbAorSHlwZXJzb25pYyB3aWxsIGNyZWF0ZSA8ZmlsZW5hbWU+dHV0b3JpYWxfZGF0YWJhc2UucHJvcGVydGllczwvZmlsZW5hbWU+IGFuZAorPGZpbGVuYW1lPnR1dG9yaWFsX2RhdGFiYXNlLnNjcmlwdDwvZmlsZW5hbWU+IGRhdGFiYXNlIGZpbGVzIGluIHlvdXIgY3VycmVudAorZGlyZWN0b3J5LiBUbyBkZWxldGUgdGhlIGRhdGFiYXNlLCBqdXN0IGRlbGV0ZSB0aGVzZSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQnkgZGVmYXVsdCwgSlBBIHVzZXMgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYW5ub3RhdGlvbnMKK2luIHlvdXIgc291cmNlIGZpbGVzLiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPiBvZiB0aGUgSlBBCitPdmVydmlldyB3aWxsIGhlbHAgeW91IHVuZGVyc3RhbmQgbWFwcGluZyBhbm5vdGF0aW9ucy4gQWRkaXRpb25hbGx5LAorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmciLz4gb2YgdGhlIFJlZmVyZW5jZSBHdWlkZSBkZXNjcmliZXMgeW91cgorb3RoZXIgbWFwcGluZyBvcHRpb25zIGluIGRldGFpbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJZiB5b3UgYXJlIGN1cmlvdXMsIHlvdSBjYW4gdmlldyB0aGUgc2NoZW1hIE9wZW5KUEEgY3JlYXRlZCBmb3IgdGhlIHR1dG9yaWFsCitjbGFzc2VzIHdpdGggT3BlbkpQQSdzIHNjaGVtYSB0b29sOgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hVG9vbCAtYSByZWZsZWN0IC1mIHRtcC5zY2hlbWEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgd2lsbCBjcmVhdGUgYSA8ZmlsZW5hbWU+dG1wLnNjaGVtYTwvZmlsZW5hbWU+IGZpbGUgd2l0aCBhbiBYTUwKK3JlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhYmFzZSBzY2hlbWEuIFRoZSBYTUwgc2hvdWxkIGJlIHNlbGYgZXhwbGFuYXRvcnk7IHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV94bWwiLz4gb2YgdGhlIFJlZmVyZW5jZSBHdWlkZSBmb3IgZGV0YWlscy4KK1lvdSBtYXkgZGVsZXRlIHRoZSA8ZmlsZW5hbWU+dG1wLnNjaGVtYTwvZmlsZW5hbWU+IGZpbGUgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorUG9wdWxhdGUgdGhlIGRhdGFiYXNlIHdpdGggc2FtcGxlIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLlNlZWREYXRhYmFzZQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBub3cgY3JlYXRlZCBhbiBKUEEtYWNjZXNzaWJsZSBwZXJzaXN0ZW50IHN0b3JlLCBhbmQKK3NlZWRlZCBpdCB3aXRoIHNvbWUgc2FtcGxlIGRhdGEuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEludmVudG9yeSBNYWludGVuYW5jZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIG1vc3QgaW1wb3J0YW50IGVsZW1lbnQgb2YgYSBzdWNjZXNzZnVsIHBldCBzdG9yZSBwcm9kdWN0LCBzYXkgdGhlIGV4cGVydHMsCitpcyBhbiBpbnZlbnRvcnkgbWFpbnRlbmFuY2UgbWVjaGFuaXNtLiBTbywgbGV0J3Mgd29yayBvbiB0aGUgPGNsYXNzbmFtZT5BbmltYWwKKzwvY2xhc3NuYW1lPiBhbmQgPGNsYXNzbmFtZT5Eb2c8L2NsYXNzbmFtZT4gY2xhc3NlcyBhIGJpdCB0byBwZXJtaXQgdXNlcgoraW50ZXJhY3Rpb24gd2l0aCB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgY2hhcHRlciBzaG91bGQgZmFtaWxpYXJpemUgeW91IHdpdGggc29tZSBvZiB0aGUgYmFzaWNzIG9mIHRoZQorPHVsaW5rIHVybD0iLi4vLi4vZWpiLTNfMC1wci1zcGVjLXBlcnNpc3RlbmNlLnBkZiI+SlBBIHNwZWNpZmljYXRpb248L3VsaW5rPiBhbmQKK3RoZSBtZWNoYW5pY3Mgb2YgY29tcGlsaW5nIGFuZCBlbmhhbmNpbmcgcGVyc2lzdGVudCBjbGFzc2VzLiBZb3Ugd2lsbCBhbHNvCitiZWNvbWUgZmFtaWxpYXIgd2l0aCB0aGUgbWFwcGluZyB0b29sIGZvciBwcm9wYWdhdGluZyB0aGUgcGVyc2lzdGVudCBzY2hlbWEgaW50bwordGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitGaXJzdCwgbGV0J3MgYWRkIHNvbWUgY29kZSB0byA8ZmlsZW5hbWU+QW5pbWFsTWFpbnRlbmFuY2UuamF2YTwvZmlsZW5hbWU+IHRoYXQKK2FsbG93cyB1cyB0byBleGFtaW5lIHRoZSBhbmltYWxzIGN1cnJlbnRseSBpbiB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FkZCBjb2RlIHRvIDxmaWxlbmFtZT5BbmltYWxNYWludGVuYW5jZS5qYXZhPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNb2RpZnkgdGhlIDxtZXRob2RuYW1lPmdldEFuaW1hbHM8L21ldGhvZG5hbWU+IG1ldGhvZCBvZiA8ZmlsZW5hbWU+CitBbmltYWxNYWludGVuYW5jZS5qYXZhPC9maWxlbmFtZT4gdG8gbG9vayBsaWtlIHRoaXM6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyAgICAvKioKKyAgICAgKiAgUmV0dXJuIGEgbGlzdCBvZiBhbmltYWxzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBxdWVyeSBmaWx0ZXIuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBmaWx0ZXIgICAgICB0aGUgSlBRTCBmaWx0ZXIgdG8gYXBwbHkgdG8gdGhlIHF1ZXJ5CisgICAgICogIEBwYXJhbSAgY2xzICAgICAgICAgdGhlIGNsYXNzIG9mIGFuaW1hbCB0byBxdWVyeSBvbgorICAgICAqICBAcGFyYW0gIGVtICAgICAgICAgIHRoZSBFbnRpdHlNYW5hZ2VyIHRvIG9idGFpbiB0aGUgcXVlcnkgZnJvbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbmltYWxzIChTdHJpbmcgZmlsdGVyLCBFbnRpdHlNYW5hZ2VyIGVtKQorICAgIHsKKyAgICAgICAgLy8gRXhlY3V0ZSBhIHF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlci4KKyAgICAgICAgUXVlcnkgcXVlcnkgPSBlbS5jcmVhdGVRdWVyeSAoZmlsdGVyKTsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5LmdldFJlc3VsdExpc3QgKCk7CisgICAgfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitDb21waWxlIDxmaWxlbmFtZT5BbmltYWxNYWludGVuYW5jZS5qYXZhPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmFjIEFuaW1hbE1haW50ZW5hbmNlLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGFrZSBhIGxvb2sgYXQgdGhlIGFuaW1hbHMgaW4gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGxpc3QgQW5pbWFsCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK05vdGljZSB0aGF0IDxtZXRob2RuYW1lPmxpc3Q8L21ldGhvZG5hbWU+IG9wdGlvbmFsbHkgdGFrZXMgYSBxdWVyeSBmaWx0ZXIuIExldCdzCitleHBsb3JlIHRoZSBkYXRhYmFzZSBzb21lIG1vcmUsIHRoaXMgdGltZSB1c2luZyBmaWx0ZXJzOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGxpc3QgInNlbGVjdCBhIGZyb20gQW5pbWFsIGEgd2hlcmUgYS5uYW1lID0gJ0Jpbm5leSciCitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGxpc3QgInNlbGVjdCBhIGZyb20gQW5pbWFsIGEgd2hlcmUgYS5wcmljZSAmbHQ7PSA1MCIKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIEphdmEgUGVyc2lzdGVuY2UgUXVlcnkgTGFuZ3VhZ2UgKEpQUUwpIGlzIGRlc2lnbmVkIHRvIGxvb2sgYW5kIGJlaGF2ZSBtdWNoCitsaWtlIGFuIG9iamVjdCBvcmllbnRlZCBTUUwgZGlhbGVjdC4gVGhlIDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD4KK3ByaWNlPC9saXRlcmFsPiBmaWVsZHMgaWRlbnRpZmllZCBpbiB0aGUgYWJvdmUgcXVlcmllcyBtYXAgdG8gdGhlIG1lbWJlciBmaWVsZHMKK29mIHRob3NlIG5hbWVzIGluIDxjbGFzc25hbWU+IHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbDwvY2xhc3NuYW1lPi4gTW9yZQorZGV0YWlscyBvbiBKUFFMIHN5bnRheCBpcyBhdmFpbGFibGUgaW4gPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X3F1ZXJ5Ii8+Cisgb2YgdGhlIEpQQSBPdmVydmlldy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitHcmVhdCEgTm93IHRoYXQgd2UgY2FuIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlLCBsZXQncyBhZGQgc29tZSBjb2RlCit0aGF0IGxldHMgdXMgYWRkIGFuZCByZW1vdmUgYW5pbWFscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjNfcGVyc2lzdCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBQZXJzaXN0aW5nIE9iamVjdHMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQXMgbmV3IGRvZ3MgYXJlIGJvcm4gb3IgYWNxdWlyZWQsIHRoZSBzdG9yZSBvd25lciB3aWxsIG5lZWQgdG8gYWRkIG5ldyByZWNvcmRzCit0byB0aGUgaW52ZW50b3J5IGRhdGFiYXNlLiBJbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIHdyaXRlIHRoZSBjb2RlIHRvIGhhbmRsZQorYWRkaXRpb25zIHRocm91Z2ggdGhlIDxjbGFzc25hbWU+dHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2UKKzwvY2xhc3NuYW1lPiBjbGFzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGlzIHNlY3Rpb24gd2lsbCBmYW1pbGlhcml6ZSB5b3Ugd2l0aCB0aGUgbWVjaGFuaXNtIGZvciBzdG9yaW5nIHBlcnNpc3RlbnQKK2luc3RhbmNlcyBpbiBhIEpQQSBlbnRpdHkgbWFuYWdlci4gV2Ugd2lsbCBjcmVhdGUgYSBuZXcgZG9nLCBvYnRhaW4gYQorPGNsYXNzbmFtZT5UcmFuc2FjdGlvbjwvY2xhc3NuYW1lPiBmcm9tIGEgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+LAorYW5kLCB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLCBtYWtlIHRoZSBuZXcgZG9nIG9iamVjdCBwZXJzaXN0ZW50LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+dHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2U8L2NsYXNzbmFtZT4gcHJvdmlkZXMgYQorcmVmbGVjdGlvbi1iYXNlZCBmYWNpbGl0eSBmb3IgY3JlYXRpbmcgYW55IHR5cGUgb2YgYW5pbWFsLCBwcm92aWRlZCB0aGF0IHRoZQorYW5pbWFsIGhhcyBhIHR3by1hcmd1bWVudCBjb25zdHJ1Y3RvciB3aG9zZSBmaXJzdCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUKK25hbWUgb2YgdGhlIGFuaW1hbCBhbmQgd2hvc2Ugc2Vjb25kIGFyZ3VtZW50IGlzIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljCitwcmltaXRpdmUuIFRoaXMgcmVmbGVjdGlvbi1iYXNlZCBzeXN0ZW0gaXMgaW4gcGxhY2UgdG8ga2VlcCB0aGlzIHR1dG9yaWFsIHNob3J0CithbmQgcmVtb3ZlIHJlcGV0aXRpdmUgY3JlYXRpb24gbWVjaGFuaXNtcy4gSXQgaXMgbm90IGEgcmVxdWlyZWQgcGFydCBvZiB0aGUgSlBBCitzcGVjaWZpY2F0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQWRkIHRoZSBmb2xsb3dpbmcgY29kZSB0byA8ZmlsZW5hbWU+IEFuaW1hbE1haW50ZW5hbmNlLmphdmE8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTW9kaWZ5IHRoZSA8bWV0aG9kbmFtZT5wZXJzaXN0T2JqZWN0PC9tZXRob2RuYW1lPiBtZXRob2Qgb2YgPGZpbGVuYW1lPgorQW5pbWFsTWFpbnRlbmFuY2UuamF2YTwvZmlsZW5hbWU+IHRvIGxvb2sgbGlrZSB0aGlzOgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorICAgIC8qKgorICAgICAqICBQZXJmb3JtcyB0aGUgYWN0dWFsIEpQQSB3b3JrIG9mIHB1dHRpbmcgJmx0O2NvZGUmZ3Q7b2JqZWN0Jmx0Oy9jb2RlJmd0OworICAgICAqICBpbnRvIHRoZSBkYXRhIHN0b3JlLgorICAgICAqCisgICAgICogIEBwYXJhbSAgb2JqZWN0ICB0aGUgb2JqZWN0IHRvIHBlcnNpc3QgaW4gdGhlIGRhdGEgc3RvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyc2lzdE9iamVjdCAoRW50aXR5TWFuYWdlciBlbSwgT2JqZWN0IG9iamVjdCkKKyAgICB7CisgICAgICAgIC8vIE1hcmsgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5pdCBvZiB3b3JrIGJvdW5kYXJ5LgorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbiAoKS5iZWdpbiAoKTsKKworICAgICAgICBlbS5wZXJzaXN0IChvYmplY3QpOworCisgICAgICAgIC8vIE1hcmsgdGhlIGVuZCBvZiB0aGUgdW5pdCBvZiB3b3JrIGJvdW5kYXJ5LAorICAgICAgICAvLyBhbmQgcmVjb3JkIGFsbCBpbnNlcnRzIGluIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgZW0uZ2V0VHJhbnNhY3Rpb24gKCkuY29tbWl0ICgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJBZGRlZCAiICsgb2JqZWN0KTsKKyAgICB9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJbiB0aGUgYWJvdmUgY29kZSwgd2UgcGFzcyBpbiBhbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4uCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zIG1heSBiZSBlaXRoZXIgY29udGFpbmVyIG1hbmFnZWQgb3IKK2FwcGxpY2F0aW9uIG1hbmFnZWQuIEluIHRoaXMgdHV0b3JpYWwsIGJlY2F1c2Ugd2UncmUgb3BlcmF0aW5nIG91dHNpZGUgYQorY29udGFpbmVyLCB3ZSdyZSB1c2luZyBhcHBsaWNhdGlvbiBtYW5hZ2VkIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPgorcy4gSW4gbWFuYWdlZCBlbnZpcm9ubWVudHMsIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPnMgYXJlIHR5cGljYWxseQorY29udGFpbmVyIG1hbmFnZWQsIGFuZCB0aHVzIGluamVjdGVkIG9yIGxvb2tlZCB1cCB2aWEgSk5ESS4gQXBwbGljYXRpb24gbWFuYWdlZAorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBjYW4gYmUgdXNlZCBpbiBib3RoIG1hbmFnZWQgYW5kIHVubWFuYWdlZAorZW52aXJvbm1lbnRzLCBhbmQgYXJlIGNyZWF0ZWQgYnkgYW4gPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY2xhc3NuYW1lPgorLiBBbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZQorPGNsYXNzbmFtZT5qYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTwvY2xhc3NuYW1lPiBjbGFzcy4gVGhpcyBjbGFzcyBwcm92aWRlcworc29tZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBvYnRhaW5pbmcgYW4gPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeQorPC9jbGFzc25hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitSZWNvbXBpbGUgPGZpbGVuYW1lPkFuaW1hbE1haW50ZW5hbmNlLmphdmE8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmFjIEFuaW1hbE1haW50ZW5hbmNlLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1lvdSBub3cgaGF2ZSBhIG1lY2hhbmlzbSBmb3IgYWRkaW5nIG5ldyBkb2dzIHRvIHRoZSBkYXRhYmFzZS4gR28gYWhlYWQgYW5kIGFkZAorc29tZSBieSBydW5uaW5nIDxjb21tYW5kPmphdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2UgYWRkIERvZworJmx0O25hbWUmZ3Q7ICZsdDtwcmljZSZndDs8L2NvbW1hbmQ+IEZvciBleGFtcGxlOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2UgYWRkIERvZyBGbHVmZnkgMzUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIHZpZXcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhYmFzZSB3aXRoOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2UgbGlzdCBEb2cKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX3R1dG9yaWFsX2NoYXB0ZXIzX2RlbGV0ZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBEZWxldGluZyBPYmplY3RzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1doYXQgaWYgc29tZW9uZSBkZWNpZGVzIHRvIGJ1eSBvbmUgb2YgdGhlIGRvZ3M/IFRoZSBzdG9yZSBvd25lciB3aWxsIG5lZWQgdG8KK3JlbW92ZSB0aGF0IGFuaW1hbCBmcm9tIHRoZSBkYXRhYmFzZSwgc2luY2UgaXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBpbnZlbnRvcnkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBzZWN0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVtb3ZlIGRhdGEgZnJvbSB0aGUgZGF0YXN0b3JlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQWRkIHRoZSBmb2xsb3dpbmcgY29kZSB0byA8ZmlsZW5hbWU+QW5pbWFsTWFpbnRlbmFuY2UuamF2YTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNb2RpZnkgdGhlIDxtZXRob2RuYW1lPmRlbGV0ZU9iamVjdHM8L21ldGhvZG5hbWU+IG1ldGhvZCBvZiA8ZmlsZW5hbWU+CitBbmltYWxNYWludGVuYW5jZS5qYXZhPC9maWxlbmFtZT4gdG8gbG9vayBsaWtlIHRoaXM6CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgICAgLyoqCisgICAgICogIFBlcmZvcm1zIHRoZSBhY3R1YWwgSlBBIHdvcmsgb2YgcmVtb3ZpbmcgCisgICAgICogICZsdDtjb2RlJmd0O29iamVjdHMmbHQ7L2NvZGUmZ3Q7IGZyb20gdGhlIGRhdGFzdG9yZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIG9iamVjdHMgICAgIHRoZSBvYmplY3RzIHRvIHBlcnNpc3QgaW4gdGhlIGRhdGFzdG9yZQorICAgICAqICBAcGFyYW0gIGVtICAgICAgICAgIHRoZSBFbnRpdHlNYW5hZ2VyIHRvIGRlbGV0ZSB3aXRoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU9iamVjdHMgKENvbGxlY3Rpb24gb2JqZWN0cywgRW50aXR5TWFuYWdlciBlbSkKKyAgICB7CisgICAgICAgIC8vIE1hcmsgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5pdCBvZiB3b3JrIGJvdW5kYXJ5LgorICAgICAgICBlbS5nZXRUcmFuc2FjdGlvbiAoKS5iZWdpbiAoKTsKKworICAgICAgICAvLyBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBvYmplY3RzIGluICdvYmplY3RzJyBmcm9tIHRoZSBkYXRhIHN0b3JlLgorICAgICAgICBmb3IgKE9iamVjdCBvYiA6IG9iamVjdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIlJlbW92ZWQgYW5pbWFsOiAiICsgb2IpOworICAgICAgICAgICAgZW0ucmVtb3ZlIChvYik7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXJrIHRoZSBlbmQgb2YgdGhlIHVuaXQgb2Ygd29yayBib3VuZGFyeSwgYW5kIHJlY29yZCBhbGwKKyAgICAgICAgLy8gZGVsZXRlcyBpbiB0aGUgZGF0YWJhc2UuCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uICgpLmNvbW1pdCAoKTsKKyAgICB9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1JlY29tcGlsZSA8ZmlsZW5hbWU+QW5pbWFsTWFpbnRlbmFuY2UuamF2YTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YWMgQW5pbWFsTWFpbnRlbmFuY2UuamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitSZW1vdmUgc29tZSBhbmltYWxzIGZyb20gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSB0dXRvcmlhbC5wZXJzaXN0ZW5jZS5BbmltYWxNYWludGVuYW5jZSByZW1vdmUgJmx0O3F1ZXJ5Jmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlcmUgPHJlcGxhY2VhYmxlPiZsdDtxdWVyeSZndDs8L3JlcGxhY2VhYmxlPiBpcyBhIHF1ZXJ5IHN0cmluZyBsaWtlIHRob3NlIHVzZWQKK2ZvciBsaXN0aW5nIGFuaW1hbHMgYWJvdmUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FsbCByaWdodC4gV2Ugbm93IGhhdmUgYSBiYXNpYyBwZXQgc2hvcCBpbnZlbnRvcnkgbWFuYWdlbWVudCBzeXN0ZW0uIEZyb20gdGhpcworYmFzZSwgd2Ugd2lsbCBhZGQgc29tZSBvZiB0aGUgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBzdWdnZXN0ZWQgYnkgb3VyIGluZHVzdHJ5CitleHBlcnRzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX3R1dG9yaWFsX2NoYXB0ZXI0Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBJbnZlbnRvcnkgR3Jvd3RoCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitOb3cgdGhhdCB3ZSBoYXZlIHRoZSBiYXNpYyBwZXQgc3RvcmUgZnJhbWV3b3JrIGluIHBsYWNlLCBsZXQncyBhZGQgc3VwcG9ydCBmb3IKK3RoZSBuZXh0IHBldCBpbiBvdXIgbGlzdDogdGhlIHJhYmJpdC4gVGhlIHJhYmJpdCBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiB0aGUKK2RvZzsgcGV0IHN0b3JlcyBzZWxsIHRoZW0gYWxsIGZvciB0aGUgc2FtZSBwcmljZSwgYnV0IGdlbmRlciBpcyBjcml0aWNhbGx5CitpbXBvcnRhbnQgc2luY2UgcmFiYml0cyByZXByb2R1Y2UgcmF0aGVyIGVhc2lseSBhbmQgcXVpY2tseS4gTGV0J3MgcHV0IHRvZ2V0aGVyCithIGNsYXNzIHJlcHJlc2VudGluZyBhIHJhYmJpdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gdGhpcyBjaGFwdGVyLCB5b3Ugd2lsbCBzZWUgc29tZSBtb3JlIHF1ZXJpZXMgYW5kIHdyaXRlIGEgYmlkaXJlY3Rpb25hbAorcmVsYXRpb24gYmV0d2VlbiBvYmplY3RzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitQcm92aWRlZCB3aXRoIHRoaXMgdHV0b3JpYWwgaXMgYSBmaWxlIGNhbGxlZCA8ZmlsZW5hbWU+UmFiYml0LmphdmE8L2ZpbGVuYW1lPgord2hpY2ggY29udGFpbnMgYSBzYW1wbGUgPGNsYXNzbmFtZT5SYWJiaXQ8L2NsYXNzbmFtZT4gaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0V4YW1pbmUgPGZpbGVuYW1lPlJhYmJpdC5qYXZhPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgUmFiYml0IGNsYXNzIGFib3ZlIGNvbnRhaW5zIGEgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBwYXJlbnRzIGFuZAorY2hpbGRyZW4uIEZyb20gdGhlIEphdmEgc2lkZSBvZiB0aGluZ3MsIGEgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgaXMgc2ltcGx5IGEKK3BhaXIgb2YgZmllbGRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBsaW5rZWQuIFRoZXJlIGlzIG5vIHNwZWNpYWwgSmF2YSB3b3JrCituZWNlc3NhcnkgdG8gZXhwcmVzcyBiaWRpcmVjdGlvbmFsaXR5LiBIb3dldmVyLCB5b3UgbXVzdCBpZGVudGlmeSB0aGUKK3JlbGF0aW9uc2hpcCBhcyBiaWRpcmVjdGlvbmFsIHVzaW5nIEpQQSA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YSI+Cithbm5vdGF0aW9uczwvbGluaz4gc28gdGhlIG1hcHBpbmcgdG9vbCBjYW4gY3JlYXRlIHRoZSBtb3N0IGVmZmljaWVudCBzY2hlbWEuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJbnNlcnQgdGhpcyBzbmlwcGV0IG9mIGNvZGUgaW1tZWRpYXRlbHkgPGVtcGhhc2lzPmJlZm9yZTwvZW1waGFzaXM+IHRoZQorPGxpdGVyYWw+Y2hpbGRyZW48L2xpdGVyYWw+IGZpZWxkIGRlY2xhcmF0aW9uIGluIHRoZSA8ZmlsZW5hbWU+UmFiYml0LmphdmEKKzwvZmlsZW5hbWU+IGZpbGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyAgICBATWFueVRvTWFueQorICAgIEBKb2luVGFibGUobmFtZT0iUkFCQklUX0NISUxEUkVOIiwKKyAgICAgICAgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iUEFSRU5UX0lEIiksCisgICAgICAgIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSJDSElMRF9JRCIpKQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+QE1hbnlUb01hbnk8L2xpdGVyYWw+IGFubm90YXRpb24gaW5kaWNhdGVzIHRoYXQgPGxpdGVyYWw+Y2hpbGRyZW4KKzwvbGl0ZXJhbD4gaXMgb25lIHNpZGUgb2YgYSBtYW55LXRvLW1hbnkgcmVsYXRpb24uIDxsaXRlcmFsPkBKb2luVGFibGU8L2xpdGVyYWw+CitkZXNjcmliZXMgaG93IHRoaXMgcmVsYXRpb24gbWFwcyB0byBhIGRhdGFiYXNlIGpvaW4gdGFibGUuIFRoZSBhbm5vdGF0aW9uJ3MKKzxsaXRlcmFsPmpvaW5Db2x1bW5zPC9saXRlcmFsPiBuYW1lIHRoZSBqb2luIHRhYmxlJ3MgZm9yZWlnbiBrZXkgY29sdW1ucyBsaW5raW5nCit0byB0aGUgb3duaW5nIGluc3RhbmNlICh0aGUgcGFyZW50KS4gSW4gdGhpcyBjYXNlLCBjb2x1bW4gPGxpdGVyYWw+CitSQUJCSVRfQ0hJTERSRU4uUEFSRU5UX0lEPC9saXRlcmFsPiBpcyBhIGZvcmVpZ24ga2V5IHRvIHRoZSBwYXJlbnQncyA8bGl0ZXJhbD4KK0lEPC9saXRlcmFsPiBwcmltYXJ5IGtleSBjb2x1bW4uIFNpbWlsYXJseSwgdGhlIDxsaXRlcmFsPmludmVyc2VKb2luQ29sdW1ucworPC9saXRlcmFsPiBhdHRyaWJ1dGUgZGVub3RlcyB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucyBsaW5raW5nIHRvIHRoZSBjb2xsZWN0aW9uCitlbGVtZW50cyAodGhlIGNoaWxkcmVuKS4gRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgPGxpdGVyYWw+QEpvaW5UYWJsZTwvbGl0ZXJhbD4KK2Fubm90YXRpb24sIHNlZSA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPiBvZiB0aGUgSlBBCitPdmVydmlldy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK05vdyB3ZSdsbCBtYXAgdGhlIG90aGVyIHNpZGUgb2YgdGhpcyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLCB0aGUgPGxpdGVyYWw+CitwYXJlbnRzPC9saXRlcmFsPiBmaWVsZC4gSW5zZXJ0IHRoZSBmb2xsb3dpbmcgc25pcHBldCBvZiBjb2RlIGltbWVkaWF0ZWx5Cis8ZW1waGFzaXM+YmVmb3JlPC9lbXBoYXNpcz4gdGhlIDxjb21tYW5kPnBhcmVudHM8L2NvbW1hbmQ+IGZpZWxkIGRlY2xhcmF0aW9uIGluCit0aGUgPGZpbGVuYW1lPlJhYmJpdC5qYXZhPC9maWxlbmFtZT4gZmlsZS4gVGhlIDxsaXRlcmFsPm1hcHBlZEJ5PC9saXRlcmFsPgorYXR0cmlidXRlIGlkZW50aWZpZXMgdGhlIG5hbWUgb2YgdGhlIG93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PSJjaGlsZHJlbiIpCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0NvbXBpbGUgPGZpbGVuYW1lPlJhYmJpdC5qYXZhPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmFjIFJhYmJpdC5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0VuaGFuY2UgdGhlIDxjbGFzc25hbWU+UmFiYml0PC9jbGFzc25hbWU+IGNsYXNzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRW5oYW5jZXIgUmFiYml0LmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorUmVmcmVzaCB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZ3MgYW5kIGRhdGFiYXNlIHNjaGVtYS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdUb29sIFJhYmJpdC5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitOb3cgdGhhdCB3ZSBoYXZlIGEgUmFiYml0IGNsYXNzLCBsZXQncyBnZXQgc29tZSBwcmVsaW1pbmFyeSByYWJiaXQgZGF0YSBpbnRvIHRoZQorZGF0YWJhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FkZCBhIDxsaXRlcmFsPiZsdDtjbGFzcyZndDs8L2xpdGVyYWw+IGVudHJ5IGZvciA8Y2xhc3NuYW1lPiBSYWJiaXQ8L2NsYXNzbmFtZT4KK3RvIDxmaWxlbmFtZT4uLi8uLi9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O2NsYXNzJmd0O3R1dG9yaWFsLnBlcnNpc3RlbmNlLlJhYmJpdCZsdDsvY2xhc3MmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0NyZWF0ZSBzb21lIHJhYmJpdHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhIGZldyB0aW1lcyB0byBhZGQgc29tZSBtYWxlIGFuZCBmZW1hbGUgcmFiYml0cyB0bwordGhlIGRhdGFiYXNlOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGFkZCBSYWJiaXQgJmx0O25hbWUmZ3Q7IGZhbHNlCitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGFkZCBSYWJiaXQgJmx0O25hbWUmZ3Q7IHRydWUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTm93IHJ1biBzb21lIGJyZWVkaW5nIGl0ZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuUmFiYml0IGJyZWVkIDIKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTG9vayBhdCB5b3VyIG5ldyByYWJiaXRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGxpc3QgUmFiYml0CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGRldGFpbHMgInNlbGVjdCByIGZyb20gUmFiYml0IHIgd2hlcmUgci5uYW1lID0gJyZsdDtuYW1lJmd0OyciCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWxfY2hhcHRlcjUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEJlaGF2aW9yYWwgQW5hbHlzaXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09mdGVuLCBwZXQgc3RvcmVzIHNlbGwgc25ha2VzIGFzIHdlbGwgYXMgcmFiYml0cyBhbmQgZG9ncy4gUGV0IHN0b3JlcyBhcmUKK3ByaW1hcmlseSBjb25jZXJuZWQgd2l0aCBhIHNuYWtlJ3MgbGVuZ3RoOyBtdWNoIGxpa2UgcmFiYml0cywgcGV0IHN0b3JlCitvcGVyYXRvcnMgdXN1YWxseSBzZWxsIHRoZW0gYWxsIGZvciBhIGZsYXQgcmF0ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBjaGFwdGVyIGRlbW9uc3RyYXRlcyBtb3JlIHF1ZXJpZXMsIHNjaGVtYSBtYW5pcHVsYXRpb24sIGFuZCBhZGRpdGlvbmFsCityZWxhdGlvbiB0eXBlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorUHJvdmlkZWQgd2l0aCB0aGlzIHR1dG9yaWFsIGlzIGEgZmlsZSBjYWxsZWQgPGZpbGVuYW1lPlNuYWtlLmphdmE8L2ZpbGVuYW1lPgord2hpY2ggY29udGFpbnMgYSBzYW1wbGUgPGNsYXNzbmFtZT5TbmFrZTwvY2xhc3NuYW1lPiBpbXBsZW1lbnRhdGlvbi4gTGV0J3MgZ2V0CitpdCBjb21waWxlZCBhbmQgbG9hZGVkOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitFeGFtaW5lIGFuZCBjb21waWxlIDxmaWxlbmFtZT5TbmFrZS5qYXZhPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmFjIFNuYWtlLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRW5oYW5jZSB0aGUgY2xhc3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuUENFbmhhbmNlciBTbmFrZS5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1JlZnJlc2ggdGhlIG1hcHBpbmdzIGFuZCBkYXRhYmFzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FzIHdlIGhhdmUgY3JlYXRlZCBhIG5ldyBwZXJzaXN0ZW50IGNsYXNzLCB3ZSBtdXN0IG1hcCBpdCB0byB0aGUgZGF0YWJhc2UgYW5kCitjaGFuZ2UgdGhlIHNjaGVtYSB0byBtYXRjaC4gU28gcnVuIHRoZSBtYXBwaW5nIHRvb2w6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCBTbmFrZS5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0FkZCBhIDxsaXRlcmFsPiZsdDtjbGFzcyZndDs8L2xpdGVyYWw+IGVudHJ5IGZvciA8Y2xhc3NuYW1lPiBTbmFrZTwvY2xhc3NuYW1lPgordG8gPGZpbGVuYW1lPi4uLy4uL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7Y2xhc3MmZ3Q7dHV0b3JpYWwucGVyc2lzdGVuY2UuU25ha2UmbHQ7L2NsYXNzJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorT25jZSB5b3UgaGF2ZSBjb21waWxlZCBldmVyeXRoaW5nLCBhZGQgYSBmZXcgc25ha2VzIHRvIHRoZSBkYXRhYmFzZSB1c2luZzoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2UgYWRkIFNuYWtlICJuYW1lIiAmbHQ7bGVuZ3RoJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlcmUgPHJlcGxhY2VhYmxlPiZsdDtsZW5ndGgmZ3Q7PC9yZXBsYWNlYWJsZT4gaXMgdGhlIGxlbmd0aCBpbiBmZWV0IGZvciB0aGUKK25ldyBzbmFrZS4gVG8gc2VlIHRoZSBuZXcgc25ha2VzIGluIHRoZSBkYXRhYmFzZSwgcnVuOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSB0dXRvcmlhbC5wZXJzaXN0ZW5jZS5BbmltYWxNYWludGVuYW5jZSBsaXN0IFNuYWtlCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitVbmZvcnR1bmF0ZWx5IGZvciB0aGUgbWFzc2l2ZWx5IGRldmVsb3BpbmcgcmFiYml0IHBvcHVsYXRpb24sIHNuYWtlcyBvZnRlbiBlYXQKK3JhYmJpdHMuIEFueSBnb29kIGludmVudG9yeSBzeXN0ZW0gc2hvdWxkIGJlIGFibGUgdG8gY2FwdHVyZSB0aGlzIGJlaGF2aW9yLiBTbywKK2xldCdzIGFkZCBzb21lIGNvZGUgdG8gPGZpbGVuYW1lPlNuYWtlLmphdmE8L2ZpbGVuYW1lPiB0byBzdXBwb3J0IHRoZSBzbmFrZSdzCitlYXRpbmcgYmVoYXZpb3IuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0ZpcnN0LCBsZXQncyBtb2RpZnkgPGZpbGVuYW1lPlNuYWtlLmphdmE8L2ZpbGVuYW1lPiB0byBjb250YWluIGEgbGlzdCBvZiBlYXRlbgorcmFiYml0cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQWRkIHRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0cyB0byA8ZmlsZW5hbWU+U25ha2UuamF2YTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgICAgLy8gVGhpcyBsaXN0IHdpbGwgYmUgcGVyc2lzdGVkIGludG8gdGhlIGRhdGFiYXNlIGFzCisgICAgLy8gYSBvbmUtdG8tbWFueSByZWxhdGlvbi4KKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5PSJlYXRlciIpCisgICAgcHJpdmF0ZSBTZXQmbHQ7UmFiYml0Jmd0OyBnaVRyYWN0ID0gbmV3IEhhc2hTZXQmbHQ7UmFiYml0Jmd0OyAoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTm90ZSB0aGF0IHdlIHNwZWNpZmllZCBhIDxsaXRlcmFsPm1hcHBlZEJ5PC9saXRlcmFsPiBhdHRyaWJ1dGUgaW4gdGhpcyBleGFtcGxlLgorVGhpcyBpcyBiZWNhdXNlIHRoZSByZWxhdGlvbiBpcyBiaWRpcmVjdGlvbmFsOyB0aGF0IGlzLCB0aGUgcmFiYml0IGhhcyBrbm93bGVkZ2UKK29mIHdoaWNoIHNuYWtlIGF0ZSBpdC4gV2UgY291bGQgaGF2ZSBsZWZ0IG91dCB0aGUgPGxpdGVyYWw+ZWF0ZXI8L2xpdGVyYWw+IGZpZWxkCithbmQgaW5zdGVhZCBjcmVhdGVkIGEgc3RhbmRhcmQgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb24uIEluIGZhY3QsIGluIGEKK2JpZGlyZWN0aW9uYWwgbWFueS10by1vbmUgcmVsYXRpb24sIHRoZSBtYW55IHNpZGUgbXVzdCBhbHdheXMgYmUgdGhlIG93bmVyLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdHlwZXMgb2YgcmVsYXRpb25zLCBzZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2ZpZWxkIi8+IG9mIHRoZSBKUEEgT3ZlcnZpZXcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNb2RpZnkgdGhlIDxsaXRlcmFsPnRvU3RyaW5nIChib29sZWFuKTwvbGl0ZXJhbD4gbWV0aG9kIHRvIG91dHB1dCB0aGUgZ2lUcmFjdAorbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKGJvb2xlYW4gZGV0YWlsZWQpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlciAoMTAyNCk7CisgICAgICAgIGJ1Zi5hcHBlbmQgKCJTbmFrZSAiKS5hcHBlbmQgKGdldE5hbWUgKCkpOworCisgICAgICAgIGlmIChkZXRhaWxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLmFwcGVuZCAoIiAoIikuYXBwZW5kIChsZW5ndGgpLmFwcGVuZCAoIiBmZWV0IGxvbmcpIHNlbGxzIGZvciAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKGdldFByaWNlICgpKS5hcHBlbmQgKCIgZG9sbGFycy4iKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCIgIEl0cyBnYXN0cm9pbnRlc3RpbmFsIHRyYWN0IGNvbnRhaW5zOlxuIik7CisgICAgICAgICAgICBmb3IgKFJhYmJpdCByYWJiaXQgOiBnaVRyYWN0KQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCJcdCIpLmFwcGVuZCAocmFiYml0KS5hcHBlbmQgKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCI7IGF0ZSAiICsgZ2lUcmFjdC5zaXplICgpICsgIiByYWJiaXRzLiIpOworCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcgKCk7CisgICAgfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBZGQgdGhlIGZvbGxvd2luZyBtZXRob2RzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgICAgLyoqCisgICAgICogIEtpbGxzIHRoZSBzcGVjaWZpZWQgcmFiYml0IGFuZCBlYXRzIGl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVhdCAoUmFiYml0IGRpbm5lcikKKyAgICB7CisgICAgICAgIC8vIENvbnN1bWUgdGhlIHJhYmJpdC4KKyAgICAgICAgZGlubmVyLmtpbGwgKCk7CisgICAgICAgIGRpbm5lci5zZXRFYXRlciAodGhpcyk7CisgICAgICAgIGdpVHJhY3QuYWRkIChkaW5uZXIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJTbmFrZSAiICsgZ2V0TmFtZSAoKSArICIgYXRlIHJhYmJpdCAiIAorICAgICAgICAgICAgKyBkaW5uZXIuZ2V0TmFtZSAoKSArICIuIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgTG9jYXRlcyB0aGUgc3BlY2lmaWVkIHNuYWtlIGFuZCB0ZWxscyBpdCB0byBlYXQgYSByYWJiaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVhdCAoRW50aXR5TWFuYWdlciBlbSwgU3RyaW5nIGZpbHRlcikKKyAgICB7CisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uICgpLmJlZ2luICgpOworCisgICAgICAgIC8vIEZpbmQgdGhlIGRlc2lyZWQgc25ha2UocykgaW4gdGhlIGRhdGEgc3RvcmUuCisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gZW0uY3JlYXRlUXVlcnkgKGZpbHRlcik7CisgICAgICAgIExpc3QmbHQ7U25ha2UmZ3Q7IHJlc3VsdHMgPSBxdWVyeS5nZXRSZXN1bHRMaXN0ICgpOworICAgICAgICBpZiAocmVzdWx0cy5pc0VtcHR5ICgpKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJObyBzbmFrZXMgbWF0Y2hpbmcgJyIgKyBmaWx0ZXIgKyAiJyBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUXVlcnkgdW5lYXRlblF1ZXJ5ID0gZW0uY3JlYXRlUXVlcnkKKyAgICAgICAgICAgICgic2VsZWN0IHIgZnJvbSBSYWJiaXQgciB3aGVyZSByLmlzRGVhZCA9IGZhbHNlIik7CisgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tICgpOworICAgICAgICBmb3IgKFNuYWtlIHNuYWtlIDogcmVzdWx0cykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUnVuIGEgcXVlcnkgZm9yIGEgcmFiYml0IHdob3NlICdpc0RlYWQnIGZpZWxkIGluZGljYXRlcworICAgICAgICAgICAgLy8gdGhhdCBpdCBpcyBhbGl2ZS4KKyAgICAgICAgICAgIExpc3QmbHQ7UmFiYml0Jmd0OyBtZW51ID0gdW5lYXRlblF1ZXJ5LmdldFJlc3VsdExpc3QgKCk7CisgICAgICAgICAgICBpZiAobWVudS5pc0VtcHR5ICgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIk5vIGxpdmUgcmFiYml0cyBpbiBEQi4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VsZWN0IGEgcmFuZG9tIHJhYmJpdCBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgICAgUmFiYml0IGRpbm5lciA9IG1lbnUuZ2V0IChyYW5kb20ubmV4dEludCAobWVudS5zaXplICgpKSk7CisKKyAgICAgICAgICAgIC8vIFBlcmZvcm0gdGhlIGVhdGluZy4KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoc25ha2UgKyAiIGlzIGVhdGluZzoiKTsKKyAgICAgICAgICAgIHNuYWtlLmVhdCAoZGlubmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGVtLmdldFRyYW5zYWN0aW9uICgpLmNvbW1pdCAoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIgJmFtcDsmYW1wOyBhcmdzWzBdLmVxdWFscyAoImVhdCIpKQorICAgICAgICB7CisgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWYgPSBQZXJzaXN0ZW5jZS4KKyAgICAgICAgICAgICAgICBjcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeSAobnVsbCk7CisgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyIGVtID0gZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIgKCk7CisgICAgICAgICAgICBlYXQgKGVtLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGVtLmNsb3NlICgpOworICAgICAgICAgICAgZW1mLmNsb3NlICgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJVc2FnZToiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgiICBqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLlNuYWtlIGVhdCAiCisgICAgICAgICAgICArICJcInNuYWtlcXVlcnlcIiIpOworICAgIH0KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQWRkIGFuIDxsaXRlcmFsPmVhdGVyPC9saXRlcmFsPiBmaWVsZCB0byA8ZmlsZW5hbWU+UmFiYml0LmphdmE8L2ZpbGVuYW1lPiwgYW5kCithIGdldHRlciBhbmQgc2V0dGVyLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgICAgQE1hbnlUb09uZSBASm9pbkNvbHVtbihuYW1lPSJFQVRFUl9JRCIpCisgICAgcHJpdmF0ZSBTbmFrZSBlYXRlcjsKKworICAgIC4uLgorCisgICAgcHVibGljIFNuYWtlIGdldEVhdGVyICgpCisgICAgeworICAgICAgICByZXR1cm4gZWF0ZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRFYXRlciAoU25ha2Ugc25ha2UpCisgICAgeworICAgICAgICBlYXRlciA9IHNuYWtlOworICAgIH0KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPkBNYW55VG9PbmU8L2xpdGVyYWw+IGFubm90YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyB0aGUgbWFueQorc2lkZSBvZiB0aGUgYmlkaXJlY3Rpb25hbCByZWxhdGlvbi4gVGhlIG1hbnkgc2lkZSBtdXN0IGFsd2F5cyBiZSB0aGUgb3duZXIgaW4KK3RoaXMgdHlwZSBvZiByZWxhdGlvbi4gVGhlIDxsaXRlcmFsPkBKb2luQ29sdW1uPC9saXRlcmFsPiBkZXNjcmliZXMgdGhlIGZvcmVpZ24KK2tleSB0aGF0IGpvaW5zIHRoZSByYWJiaXQgdGFibGUgdG8gdGhlIHNuYWtlIHRhYmxlLiBUaGUgcmFiYml0IHRhYmxlIGhhcyBhbgorPGxpdGVyYWw+RUFURVJfSUQ8L2xpdGVyYWw+IGNvbHVtbiB0aGF0IGlzIGEgZm9yZWlnbiBrZXkgdG8gdGhlIDxsaXRlcmFsPklECis8L2xpdGVyYWw+IHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgc25ha2UgdGFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitDb21waWxlIDxmaWxlbmFtZT5TbmFrZS5qYXZhPC9maWxlbmFtZT4gYW5kIDxmaWxlbmFtZT5SYWJiaXQuamF2YTwvZmlsZW5hbWU+IGFuZAorZW5oYW5jZSB0aGUgY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YWMgU25ha2UuamF2YSBSYWJiaXQuamF2YQoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyIFNuYWtlLmphdmEgUmFiYml0LmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorUmVmcmVzaCB0aGUgbWFwcGluZ3MgYW5kIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgU25ha2UuamF2YSBSYWJiaXQuamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorTm93LCBleHBlcmltZW50IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuU25ha2UgZWF0ICJzZWxlY3QgcyBmcm9tIFNuYWtlIHMgd2hlcmUgcy5uYW1lID0gJyZsdDtuYW1lJmd0OyciCitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGRldGFpbHMgInNlbGVjdCBzIGZyb20gU25ha2UgcyB3aGVyZSBzLm5hbWUgPSAnJmx0O25hbWUmZ3Q7JyIKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX3R1dG9yaWFsX2NoYXB0ZXI1X3F1ZXJ5Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbXBsZXggUXVlcmllcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJbWFnaW5lIHRoYXQgb25lIG9mIHRoZSBzbmFrZXMgaW4gdGhlIGRhdGFiYXNlIHdhcyBuYW1lZCBLaWxsZXIuIFRvIGZpbmQgb3V0Cit3aGljaCByYWJiaXRzIEtpbGxlciBhdGUsIHdlIGNvdWxkIHJ1biBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0d28gcXVlcmllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGRldGFpbHMgInNlbGVjdCBzIGZyb20gU25ha2UgcyB3aGVyZSBzLm5hbWUgPSAnS2lsbGVyJyIKK2phdmEgdHV0b3JpYWwucGVyc2lzdGVuY2UuQW5pbWFsTWFpbnRlbmFuY2UgbGlzdCAic2VsZWN0IHIgZnJvbSBSYWJiaXQgciB3aGVyZSByLmVhdGVyLm5hbWUgPSAnS2lsbGVyJyIKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZmlyc3QgcXVlcnkgaXMgc25ha2UtY2VudHJpYyAtIHRoZSBxdWVyeSBydW5zIGFnYWluc3QgdGhlIDxjbGFzc25hbWU+U25ha2UKKzwvY2xhc3NuYW1lPiBjbGFzcywgbG9va2luZyBmb3IgYWxsIHNuYWtlcyBuYW1lZCBLaWxsZXIgYW5kIHByb3ZpZGluZyBhIGRldGFpbGVkCitsaXN0aW5nIG9mIHRoZW0uIFRoZSBzZWNvbmQgaXMgcmFiYml0LWNlbnRyaWMgLSBpdCBleGFtaW5lcyB0aGUgcmFiYml0cyBpbiB0aGUKK2RhdGFiYXNlIGZvciBpbnN0YW5jZXMgd2hvc2UgPGxpdGVyYWw+ZWF0ZXI8L2xpdGVyYWw+IGlzIG5hbWVkIEtpbGxlci4gVGhpcworc2Vjb25kIHF1ZXJ5IGRlbW9uc3RyYXRlcyB0aGUgdGhhdCBzaW1wbGUgamF2YSAnZG90JyBzeW50YXggaXMgdXNlZCB3aGVuCit0cmF2ZXJzaW5nIGFuIHRvLW9uZSBmaWVsZCBpbiBhIHF1ZXJ5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0l0IGlzIGFsc28gcG9zc2libGUgdG8gdHJhdmVyc2UgY29sbGVjdGlvbiBmaWVsZHMuIEltYWdpbmUgdGhhdCB0aGVyZSB3YXMgYQorcmFiYml0IGNhbGxlZCBSb2dlciBpbiB0aGUgZGF0YXN0b3JlIGFuZCB0aGF0IG9uZSBvZiB0aGUgc25ha2VzIGF0ZSBpdC4gSW4gb3JkZXIKK3RvIGRldGVybWluZSB3aG8gYXRlIFJvZ2VyIFJhYmJpdCwgeW91IGNvdWxkIHJ1biBhIHF1ZXJ5IGxpa2UgdGhpczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIHR1dG9yaWFsLnBlcnNpc3RlbmNlLkFuaW1hbE1haW50ZW5hbmNlIGRldGFpbHMgInNlbGVjdCBzIGZyb20gU25ha2UgcyBpbm5lciBqb2luIHMuZ2lUcmFjdCByIHdoZXJlIHIubmFtZSA9ICdSb2dlciciCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfdHV0b3JpYWwtY2hhcHRlcjYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4dHJhIEZlYXR1cmVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitDb25ncmF0dWxhdGlvbnMhIFlvdSBhcmUgbm93IHRoZSBwcm91ZCBhdXRob3Igb2YgYSBwZXQgc3RvcmUgaW52ZW50b3J5IHN1aXRlLgorTm93IHRoYXQgeW91IGhhdmUgYWxsIHRoZSBtYWpvciBmZWF0dXJlcyBvZiB0aGUgcGV0IHN0b3JlIHNvZnR3YXJlIGltcGxlbWVudGVkLAoraXQncyB0aW1lIHRvIGFkZCBzb21lIGV4dHJhIGZlYXR1cmVzLiBZb3UncmUgb24geW91ciBvd247IHRoaW5rIG9mIHNvbWUgZmVhdHVyZXMKK3RoYXQgeW91IHRoaW5rIGEgcGV0IHN0b3JlIHNob3VsZCBoYXZlLCBvciBqdXN0IGV4cGxvcmUgdGhlIGZlYXR1cmVzIG9mIEpQQS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSGVyZSBhcmUgYSBjb3VwbGUgb2Ygc3VnZ2VzdGlvbnMgdG8gZ2V0IHlvdSBzdGFydGVkOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQW5pbWFsIHByaWNpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNb2RpZnkgPGNsYXNzbmFtZT5BbmltYWw8L2NsYXNzbmFtZT4gdG8gY29udGFpbiBhbiBpbnZlbnRvcnkgY29zdCBhbmQgYSByZXNhbGUKK3ByaWNlLiBDYWxjdWxhdGUgdGhlIHJlYWwgZG9sbGFyIGFtb3VudCBlYXRlbiBieSB0aGUgc25ha2VzICh0aGUgc3VtIG9mIHRoZQoraW52ZW50b3J5IGNvc3RzIG9mIGFsbCB0aGUgY29uc3VtZWQgcmFiYml0cyksIGFuZCB0aGUgY29zdCBhc3N1bWluZyB0aGF0IGFsbCB0aGUKK2VhdGVuIHJhYmJpdHMgd291bGQgaGF2ZSBiZWVuIHNvbGQgaGFkIHRoZXkgYmVlbiBhbGl2ZS4gSWdub3JlIHRoZSBmYWN0IHRoYXQgdGhlCityYWJiaXRzLCBoYWQgdGhleSBsaXZlZCwgd291bGQgaGF2ZSBjcmVhdGVkIG1vcmUgcmFiYml0cywgYW5kIHRoZSBpbXBsaWNhdGlvbnMKK29mIHRoZSByZWR1Y2VkIGZvb2QgY29zdHMgZHVlIHRvIHRoZSBub3QtcXVpdGUtYXMtaHVuZ3J5IHNuYWtlcyBhbmQgdGhlIHNtYWxsZXIKK251bWJlciBvZiByYWJiaXRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRG9nIGNhdGVnb3JpemF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTW9kaWZ5IDxjbGFzc25hbWU+RG9nPC9jbGFzc25hbWU+IHRvIGhhdmUgYSByZWxhdGlvbiB0byBhIG5ldyBjbGFzcyBjYWxsZWQKKzxjbGFzc25hbWU+QnJlZWQ8L2NsYXNzbmFtZT4sIHdoaWNoIGNvbnRhaW5zIGEgbmFtZSBpZGVudGlmeWluZyB0aGUgYnJlZWQgb2YKK3RoZSBkb2cgYW5kIGEgZGVzY3JpcHRpb24gb2YgdGhlIGJyZWVkLiBQdXQgdG9nZXRoZXIgYW4gYWRtaW4gdG9vbCBmb3IgYnJlZWRzCithbmQgZm9yIGFzc29jaWF0aW5nIGRvZ3MgYW5kIGJyZWVkcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ianBhX2oyZWVfdHV0b3JpYWwiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBKMkVFIFR1dG9yaWFsCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorQnkgZGVwbG95aW5nIE9wZW5KUEEgaW50byBhIEoyRUUgZW52aXJvbm1lbnQsIHlvdSBjYW4gbWFpbnRhaW4gdGhlIHNpbXBsaWNpdHkKK2FuZCBwZXJmb3JtYW5jZSBvZiBPcGVuSlBBLCB3aGlsZSBsZXZlcmFnaW5nIEoyRUUgdGVjaG5vbG9naWVzIHN1Y2ggYXMgY29udGFpbmVyCittYW5hZ2VkIHRyYW5zYWN0aW9ucyAoSlRBL0pUUyksIGVudGVycHJpc2Ugb2JqZWN0cyB3aXRoIHJlbW90ZSBpbnZvY2F0aW9uIChFSkIpLAorYW5kIG1hbmFnZWQgZGVwbG95bWVudCBvZiBtdWx0aS10aWVyZWQgYXBwbGljYXRpb25zIHZpYSBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIuCitUaGlzIHR1dG9yaWFsIHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGRlcGxveSBPcGVuSlBBLWJhc2VkIEoyRUUgYXBwbGljYXRpb25zIGFuZAorc2hvd2Nhc2Ugc29tZSBiYXNpYyBlbnRlcnByaXNlIEpQQSBkZXNpZ24gdGVjaG5pcXVlcy4gVGhlIHR1dG9yaWFsJ3Mgc2FtcGxlCithcHBsaWNhdGlvbiBtb2RlbHMgYSBiYXNpYyBnYXJhZ2UgY2F0YWxvZyBzeXN0ZW0uIFdoaWxlIHRoZSBhcHBsaWNhdGlvbiBpcworcmVsYXRpdmVseSB0cml2aWFsLCB0aGUgY29kZSBoYXMgYmVlbiBjb25zdHJ1Y3RlZCB0byBpbGx1c3RyYXRlIHNpbXBsZSBwYXR0ZXJucworYW5kIHNvbHV0aW9ucyB0byBjb21tb24gcHJvYmxlbXMgd2hlbiB1c2luZyBPcGVuSlBBIGluIGFuIGVudGVycHJpc2UKK2Vudmlyb25tZW50LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfajJlZV90dXRvcmlhbF9yZXF1aXJlbWVudHMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFByZXJlcXVpc2l0ZXMgZm9yIHRoZSBPcGVuSlBBIEoyRUUgVHV0b3JpYWwKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgdHV0b3JpYWwgYXNzdW1lcyB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBPcGVuSlBBIGFuZCBzZXR1cCB5b3VyIGNsYXNzcGF0aAorYWNjb3JkaW5nIHRvIHRoZSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGFwcHJvcHJpYXRlIGZvciB5b3VyIHBsYXRmb3JtLiBJbgorYWRkaXRpb24sIHRoaXMgdHV0b3JpYWwgcmVxdWlyZXMgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgYQorSjJFRS1jb21wbGlhbnQgYXBwbGljYXRpb24gc2VydmVyLCBzdWNoIGFzIFdlYkxvZ2ljIG9yIEpCb3NzLCBydW5uaW5nIG9uIEpESworMS41LiBJZiB5b3UgdXNlIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNlcnZlciBub3QgbGlzdGVkIGhlcmUsIHRoaXMgdHV0b3JpYWwKK21heSBiZSBhZGFwdGFibGUgdG8geW91ciBhcHBsaWNhdGlvbiBzZXJ2ZXIgd2l0aCBzbWFsbCBjaGFuZ2VzOyByZWZlciB0byB5b3VyCithcHBsaWNhdGlvbiBzZXJ2ZXIncyBkb2N1bWVudGF0aW9uIGZvciBhbnkgc3BlY2lmaWMgY2xhc3NwYXRoIGFuZCBkZXBsb3ltZW50CitkZXNjcmlwdG9yIHJlcXVpcmVtZW50cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyB0dXRvcmlhbCBhc3N1bWVzIGEgcmVhc29uYWJsZSBsZXZlbCBvZiBleHBlcmllbmNlIHdpdGggT3BlbkpQQSBhbmQgSlBBLiBXZQorcHJvdmlkZSBhIG51bWJlciBvZiBvdGhlciB0dXRvcmlhbHMgZm9yIGJhc2ljIGNvbmNlcHRzLCBpbmNsdWRpbmcgZW5oYW5jZW1lbnQsCitzY2hlbWEgbWFwcGluZywgYW5kIGNvbmZpZ3VyYXRpb24uIFRoaXMgdHV0b3JpYWwgYWxzbyBhc3N1bWVzIGEgYmFzaWMgbGV2ZWwgb2YKK2V4cGVyaWVuY2Ugd2l0aCBKMkVFIGNvbXBvbmVudHMsIGluY2x1ZGluZyBzZXNzaW9uIGJlYW5zLCBKTkRJLCBKU1AsIGFuZAorRUFSL1dBUi9KQVIgcGFja2FnaW5nLiBTdW4gYW5kL29yIHlvdXIgYXBwbGljYXRpb24gc2VydmVyIGNvbXBhbnkgbWF5IHByb3ZpZGUKK3R1dG9yaWFscyB0byBnZXQgZmFtaWxpYXIgd2l0aCB0aGVzZSBjb21wb25lbnRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitJbiBhZGRpdGlvbiwgdGhpcyB0dXRvcmlhbCB1c2VzIEFudCB0byBidWlsZCB0aGUgZGVwbG95bWVudCBhcmNoaXZlcy4gV2hpbGUgdGhpcworaXMgdGhlIHByZWZlcnJlZCB3YXkgb2YgYnVpbGRpbmcgYSBkZXBsb3ltZW50IG9mIHRoZSB0dXRvcmlhbCwgb25lIGNhbiBlYXNpbHkKK2J1aWxkIHRoZSBhcHByb3ByaWF0ZSBKQVIsIFdBUiwgYW5kIEVBUiBmaWxlcyBieSBoYW5kLCBhbHRob3VnaCB0aGF0IGlzIG91dHNpZGUKK3RoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfajJlZV90dXRvcmlhbF9pbnN0YWxsYXRpb25fdHlwZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEoyRUUgSW5zdGFsbGF0aW9uIFR5cGVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitFdmVyeSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaGFzIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBwcm9jZXNzIGZvciBpbnN0YWxsaW5nCitKMkVFIGNvbXBvbmVudHMuIE9wZW5KUEEgY2FuIGJlIGluc3RhbGxlZCBpbiBhIG51bWJlciBvZiB3YXlzLCB3aGljaCBtYXkgb3IgbWF5Citub3QgYmUgYXBwcm9wcmlhdGUgdG8geW91ciBhcHBsaWNhdGlvbiBzZXJ2ZXIuIFdoaWxlIHRoaXMgZG9jdW1lbnQgZm9jdXNlcworbWFpbmx5IHVwb24gdXNpbmcgT3BlbkpQQSBhcyBhIEpDQSByZXNvdXJjZSwgdGhlcmUgYXJlIG90aGVyIHdheXMgdG8gdXNlIE9wZW5KUEEKK2luIGEgSjJFRSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkpQQTwvbGl0ZXJhbD46IEoyRUUgNSBhbGxvd3MgZm9yIHRoZSBhdXRvbWF0aWMgaW5qZWN0aW9uIG9mIDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGluc3RhbmNlcyBpbnRvIHRoZSBKMkVFIGNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNYW51YWwgQmluZGluZyBpbnRvIEpOREk6IFlvdXIgYXBwbGljYXRpb24gbWF5IHJlcXVpcmUgc29tZSBuZWVkcyBpbgoraW5pdGlhbGl6aW5nIE9wZW5KUEEgdGhhdCBnbyBiZXlvbmQgdGhlIEpQQSBhbmQgSkNBIHNwZWNpZmljYXRpb25zLiBJbiB0aGlzCitjYXNlLCB5b3UgY2FuIG1hbnVhbGx5IGluc3RhbnRpYXRlIE9wZW5KUEEgYW5kIHBsYWNlIGl0IGludG8gdGhlIEpOREkgdHJlZS4gVGhpcworcHJvY2VzcywgaG93ZXZlciwgaXMgbm90IHNlYW1sZXNzIGFuZCBjYW4gcmVxdWlyZSBhIGZhaXIgYml0IG9mIGN1c3RvbQorYXBwbGljYXRpb24gc2VydmVyIGNvZGUgdG8gYmluZCBhbiBpbnN0YW5jZSBvZiA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5SW1wbDwvY2xhc3NuYW1lPiBpbnRvIEpOREkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9qMmVlX3R1dG9yaWFsX2luc3RhbGxpbmdfc2FtcGxlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBJbnN0YWxsaW5nIHRoZSBKMkVFIFNhbXBsZSBBcHBsaWNhdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorSW5zdGFsbGluZyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGludm9sdmVzIGZpcnN0IGNvbXBpbGluZyBhbmQgYnVpbGRpbmcgYQorZGVwbG95bWVudCBhcmNoaXZlICguZWFyKSBmaWxlLiBUaGlzIGZpbGUgdGhlbiBuZWVkcyB0byBiZSBkZXBsb3llZCBpbnRvIHlvdXIKK2FwcGxpY2F0aW9uIHNlcnZlci4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfajJlZV90dXRvcmlhbF9idWlsZGluZ19zYW1wbGUiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ29tcGlsaW5nIGFuZCBCdWlsZGluZyBUaGUgU2FtcGxlIEFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK05hdmlnYXRlIHRvIHRoZSA8ZmlsZW5hbWU+c2FtcGxlcy9wZXJzaXN0ZW5jZS9qMmVlPC9maWxlbmFtZT4gZGlyZWN0b3J5IG9mIHlvdXIKK09wZW5KUEEgaW5zdGFsbGF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0Vuc3VyZSB0aGF0IHRoZSBKTkRJIG5hbWUgaW4gdGhlIHNldFNlc3Npb25Db250ZXh0KCkgbWV0aG9kIGluIGVqYi9DYXJCZWFuLmphdmEKK21hdGNoZXMgeW91ciBKQ0EgaW5zdGFsbGF0aW9uLiBUaGlzIGRlZmF1bHRzIHRvIDxsaXRlcmFsPmphdmE6L29wZW5qcGEtZWpiCis8L2xpdGVyYWw+LCBidXQgdGhlIGFjdHVhbCB2YWx1ZSB3aWxsIGRlcGVuZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB5b3VyIEpDQQorZGVwbG95IGFuZCB5b3VyIGFwcGxpY2F0aW9uIHNlcnZlcidzIEpOREkgY29udGV4dC4gRS5nLiB0aGUgZGVmYXVsdCBuYW1lIGZvciBhCitXZWJMb2dpYyA5IGluc3RhbGwgd291bGQgYmUgc2ltcGx5IDxsaXRlcmFsPm9wZW5qcGEtZWpiPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitDb21waWxlIHRoZSBzb3VyY2UgZmlsZXMgaW4gcGxhY2UgYm90aCBpbiB0aGlzIGJhc2UgZGlyZWN0b3J5IGFzIHdlbGwgYXMgdGhlCituZXN0ZWQgPGZpbGVuYW1lPmVqYjwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+anNwPC9maWxlbmFtZT4gZGlyZWN0b3JpZXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YWMgKi5qYXZhICBlamIvKi5qYXZhIGpzcC8qLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitFbmhhbmNlIHRoZSBDYXIgY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyIENhci5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorUnVuIHRoZSBtYXBwaW5nIHRvb2w7IG1ha2Ugc3VyZSB0aGF0IHlvdXIgPGZpbGVuYW1lPiBNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwKKzwvZmlsZW5hbWU+IGZpbGUgaW5jbHVkZXMgdGhlIHNhbWUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiAoZS5nLiBEcml2ZXIsIFVSTCwKK2V0Yy4pIGFzIHlvdXIgSkNBIGluc3RhbGxhdGlvbi4gWW91IHNob3VsZCB1cGRhdGUgeW91ciBKQ0EgY29uZmlndXJhdGlvbiB0bworaW5jbHVkZSA8Y2xhc3NuYW1lPnNhbXBsZXMucGVyc2lzdGVuY2UuajJlZS5DYXI8L2NsYXNzbmFtZT4gaW4gdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLk1ldGFEYXRhRmFjdG9yeSI+TWV0YURhdGFGYWN0b3J5PC9saW5rPiBwcm9wZXJ0eToKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7Y29uZmlnLXByb3BlcnR5IG5hbWU9Ik1ldGFEYXRhRmFjdG9yeSImZ3Q7VHlwZXM9c2FtcGxlcy5wZXJzaXN0ZW5jZS5qMmVlLkNhciZsdDsvY29uZmlnLXByb3BlcnR5LyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgQ2FyLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitCdWlsZCBhbiBKMkVFIGFwcGxpY2F0aW9uIGFyY2hpdmUgYnkgcnVubmluZyBBbnQgYWdhaW5zdCB0aGUgPGZpbGVuYW1lPgorYnVpbGQueG1sPC9maWxlbmFtZT4uIFRoaXMgd2lsbCBjcmVhdGUgPGZpbGVuYW1lPgorb3BlbmpwYS1wZXJzaXN0ZW5jZS1qMmVlLXNhbXBsZS5lYXI8L2ZpbGVuYW1lPi4gVGhpcyBlYXIgY2FuIG5vdyBiZSBkZXBsb3llZCB0bworeW91ciBhcHBzZXJ2ZXIuIEJlIHN1cmUgdG8gYWRkIHRoZSBjbGFzcyA8Y2xhc3NuYW1lPnNhbXBsZXMuajJlZS5DYXI8L2NsYXNzbmFtZT4KK3RvIHRoZSA8bGl0ZXJhbD5vcGVuanBhLlBlcnNpc3RlbnRDbGFzc2VzPC9saXRlcmFsPiBPcGVuSlBBIGNvbmZpZ3VyYXRpb24KK3Byb3BlcnR5LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSByZWdpc3RlciB0aGUgRW50aXR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2FudCAtZiBidWlsZC54bWwKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2oyZWVfdHV0b3JpYWxfc2FtcGxlX2pib3NzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERlcGxveWluZyBTYW1wbGUgVG8gSkJvc3MKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorUGxhY2UgdGhlIGVhciBmaWxlIGluIHRoZSA8ZmlsZW5hbWU+ZGVwbG95PC9maWxlbmFtZT4gZGlyZWN0b3J5IG9mIHlvdXIgSkJvc3MKK2luc3RhbGxhdGlvbi4gWW91IGNhbiB1c2UgdGhlIGFib3ZlIGhpbnRzIHRvIHZpZXcgdGhlIEpOREkgdHJlZSB0byBzZWUgaWYKKzxjbGFzc25hbWU+c2FtcGxlcy5qMmVlLmVqYi5DYXJIb21lPC9jbGFzc25hbWU+IHdhcyBkZXBsb3llZCB0byBKTkRJLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJqcGFfajJlZV90dXRvcmlhbF9zYW1wbGVfd2VibG9naWMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRGVwbG95aW5nIFNhbXBsZSBUbyBXZWJMb2dpYyA5CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1BsYWNlIHRoZSBlYXIgZmlsZSBpbiB0aGUgPGZpbGVuYW1lPmF1dG9kZXBsb3k8L2ZpbGVuYW1lPiBkaXJlY3Rvcnkgb2YgeW91cgorV2ViTG9naWMgZG9tYWluLiBQcm9kdWN0aW9uIG1vZGUgKHNlZSB5b3VyIHN0YXJ0V2ViTG9naWMuc2gvY21kIGZpbGUpIHNob3VsZCBiZQorc2V0IHRvIGZhbHNlIHRvIGVuYWJsZSBhdXRvLWRlcGxveW1lbnQuIElmIHRoZSBhcHBsaWNhdGlvbiB3YXMgaW5zdGFsbGVkCitjb3JyZWN0bHksIHlvdSBzaG91bGQgc2VlIDxjb21wdXRlcm91dHB1dD5vcGVuanBhLXBlcnNpc3RlbmNlLWoyZWUtc2FtcGxlCis8L2NvbXB1dGVyb3V0cHV0PiBsaXN0ZWQgaW4gdGhlIERlcGxveW1lbnRzIHNlY3Rpb24gb2YgdGhlIGFkbWluIGNvbnNvbGUuIEluCithZGRpdGlvbiB5b3Ugc2hvdWxkIGZpbmQgPGxpdGVyYWw+Q2FySG9tZTwvbGl0ZXJhbD4gbGlzdGVkIGluIHRoZSBKTkRJIHRyZWUKK3VuZGVyIDxjb21wdXRlcm91dHB1dD5BZG1pblNlcnZlci0mZ3Q7c2FtcGxlcy0mZ3Q7ajJlZS0mZ3Q7ZWpiPC9jb21wdXRlcm91dHB1dD4KKy4gRW5zdXJlIHRoYXQgeW91IGhhdmUgYWRkZWQgdGhlIGNsYXNzIDxjbGFzc25hbWU+c2FtcGxlcy5qMmVlLkNhcjwvY2xhc3NuYW1lPgordG8gdGhlIDxsaXRlcmFsPm9wZW5qcGEuUGVyc2lzdGVudENsYXNzZXM8L2xpdGVyYWw+IE9wZW5KUEEgY29uZmlndXJhdGlvbgorcHJvcGVydHkgaW4gdGhlIDxsaXRlcmFsPk1FVEEtSU5GL3JhLnhtbDwvbGl0ZXJhbD4gZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9qMmVlX3R1dG9yaWFsX3VzaW5nIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBVc2luZyBUaGUgU2FtcGxlIEFwcGxpY2F0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgc2FtcGxlIGFwcGxpY2F0aW9uIGluc3RhbGxzIGl0c2VsZiBpbnRvIHRoZSB3ZWIgbGF5ZXIgYXQgdGhlIGNvbnRleHQgcm9vdCBvZgorc2FtcGxlLiBCeSBicm93c2luZyB0byA8Y29tcHV0ZXJvdXRwdXQ+CitodHRwOi8veW91cnNlcnZlcjp5b3VycG9ydC9vcGVuanBhLXBlcnNpc3RlbmNlLWoyZWUtc2FtcGxlPC9jb21wdXRlcm91dHB1dD4sCit5b3Ugc2hvdWxkIGJlIHByZXNlbnRlZCB3aXRoIGEgc2ltcGxlIGxpc3QgcGFnZSB3aXRoIG5vIGNhcnMuIFlvdSBjYW4gZWRpdCwgYWRkLAorZGVsZXRlIGNhciBpbnN0YW5jZXMuIEluIGFkZGl0aW9uLCB5b3UgY2FuIHF1ZXJ5IG9uIHRoZSB1bmRlcmx5aW5nIDxjbGFzc25hbWU+CitDYXI8L2NsYXNzbmFtZT4gaW5zdGFuY2VzIGJ5IHBhc3NpbmcgaW4gYW4gSlBRTCBxdWVyeSBpbnRvIHRoZSBtYXJrZWQgZm9ybSAoc3VjaAorYXMgPGNvbXB1dGVyb3V0cHV0PnNlbGVjdCBjYXIgZnJvbSBDYXIgY2FyIHdoZXJlIGNhci5tb2RlbD0iU29tZSBNb2RlbCIKKzwvY29tcHV0ZXJvdXRwdXQ+ICkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImpwYV9qMmVlX3R1dG9yaWFsX2FyY2hpdGVjdHVyZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU2FtcGxlIEFyY2hpdGVjdHVyZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGdhcmFnZSBhcHBsaWNhdGlvbiBpcyBhIHNpbXBsZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIHNvbWUKK29mIHRoZSBiYXNpYyBjb25jZXB0cyBuZWNlc3Nhcnkgd2hlbiB1c2luZyBPcGVuSlBBIGluIHRoZSBlbnRlcnByaXNlIGxheWVyLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgY29yZSBtb2RlbCB3cmFwcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gZmFjYWRlIGFyb3VuZCBhbiBlbnRpdHkuIFVzaW5nIGEKK3Nlc3Npb24gYmVhbiBwcm92aWRlcyBib3RoIGEgcmVtb3RlIGludGVyZmFjZSBmb3IgdmFyaW91cyBjbGllbnRzIGFzIHdlbGwgYXMKK3Byb3ZpZGluZyBhIHRyYW5zYWN0aW9uYWwgY29udGV4dCBpbiB3aGljaCB0byB3b3JrIChhbmQgdGh1cyBhdm9pZGluZyBhbnkKK2V4cGxpY2l0IHRyYW5zYWN0aW9uYWwgY29kZSkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgc2Vzc2lvbiBiZWFuIHVzZXMgdGhlIEpQQSdzIGRldGFjaG1lbnQgY2FwYWJpbGl0aWVzIHRvIHByb3ZpZGUgYW4gYXV0b21hdGljCitEYXRhIFRyYW5zZmVyIE9iamVjdCBtZWNoYW5pc20gZm9yIHRoZSBwcmltYXJ5IGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUKK2FwcGxpY2F0aW9uIHNlcnZlciBhbmQgdGhlIChwb3NzaWJseSByZW1vdGUpIGNsaWVudC4gVGhlIDxjbGFzc25hbWU+Q2FyCis8L2NsYXNzbmFtZT4gaW5zdGFuY2Ugd2lsbCBiZSB1c2VkIGFzIHRoZSBwcmltYXJ5IG9iamVjdCB1cG9uIHdoaWNoIHRoZSBjbGllbnQKK3dpbGwgd29yay4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnNhbXBsZXMvcGVyc2lzdGVuY2UvajJlZS9DYXIuamF2YTwvbGl0ZXJhbD46IFRoZSBjb3JlIG9mIHRoZSBzYW1wbGUKK2FwcGxpY2F0aW9uLiBUaGlzIGlzIHRoZSBlbnRpdHkgY2xhc3MgdGhhdCBPcGVuSlBBIHdpbGwgdXNlIHRvIHBlcnNpc3QgdGhlCithcHBsaWNhdGlvbiBkYXRhLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3aWxsIGFsc28gZmlsbCB0aGUgcm9sZSBvZiBkYXRhCit0cmFuc2ZlciBvYmplY3QgKERUTykgZm9yIEVKQiBjbGllbnRzLiBUbyBhY2NvbXBsaXNoIHRoaXMsIDxjbGFzc25hbWU+Q2FyCis8L2NsYXNzbmFtZT4gaW1wbGVtZW50cyA8Y2xhc3NuYW1lPmphdmEuaW8uU2VyaWFsaXphYmxlPC9jbGFzc25hbWU+IHNvIHRoYXQKK3JlbW90ZSBjbGllbnRzIGNhbiBhY2Nlc3MgY2FycyBhcyBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzIGZyb20gdGhlIEVKQi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPiBzYW1wbGVzL3BlcnNpc3RlbmNlL2oyZWUvanNwL1NhbXBsZVV0aWxpdGllcy5qYXZhPC9saXRlcmFsPjogVGhpcyBpcworYSBzaW1wbGUgZmFjYWRlIHRvIGFnZ3JlZ2F0ZSBzb21lIGNvbW1vbiBKMkVFIGJlaGF2aW9yIGludG8gc29tZSBzdGF0aWMgbWV0aG9kcy4KK0J5IHBsYWNpbmcgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGludG8gYSBzaW5nbGUgZmFjYWRlIGNsYXNzLCB3ZSBjYW4gcmVkdWNlCitjb2RlIG1haW50ZW5hbmNlIG9mIG91ciBKU1BzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2FtcGxlcy9wZXJzaXN0ZW5jZS9qMmVlL2VqYi9DYXIqLmphdmE8L2xpdGVyYWw+OiBUaGUgc291cmNlIGZvciB0aGUKKzxjbGFzc25hbWU+Q2FyRUpCPC9jbGFzc25hbWU+IHNlc3Npb24gYmVhbi4gQ2xpZW50cyBjYW4gdXNlIHRoZSA8Y2xhc3NuYW1lPgorQ2FySG9tZTwvY2xhc3NuYW1lPiBhbmQgPGNsYXNzbmFtZT5DYXJSZW1vdGU8L2NsYXNzbmFtZT4gaW50ZXJmYWNlcyB0byBmaW5kLAorbWFuaXB1bGF0ZSwgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byA8Y2xhc3NuYW1lPkNhcjwvY2xhc3NuYW1lPiB0cmFuc2ZlciBvYmplY3QKK2luc3RhbmNlcy4gQnkgdXNpbmcgSjJFRSB0cmFuc2FjdGlvbmFsIGZlYXR1cmVzLCB0aGUgaW1wbGVtZW50YXRpb24gY29kZSBpbgorPGZpbGVuYW1lPkNhckJlYW4uamF2YTwvZmlsZW5hbWU+IGNhbiBiZSBmb2N1c2VkIGFsbW9zdCBlbnRpcmVseSB1cG9uIGJ1c2luZXNzCithbmQgcGVyc2lzdGVuY2UgbG9naWMgd2l0aG91dCB3b3JyeWluZyBhYm91dCB0cmFuc2FjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5zYW1wbGVzL3BlcnNpc3RlbmNlL2oyZWUvanNwLyouanNwPC9saXRlcmFsPjogVGhlIHdlYiBwcmVzZW50YXRpb24KK2NsaWVudC4gVGhlc2UgSlNQcyBhcmUgbm90IGF3YXJlIG9mIHRoZSBKUEE7IHRoZXkgc2ltcGx5IHVzZSB0aGUgPGNsYXNzbmFtZT4KK0NhckVKQjwvY2xhc3NuYW1lPiBzZXNzaW9uIGJlYW4gYW5kIHRoZSA8Y2xhc3NuYW1lPkNhcjwvY2xhc3NuYW1lPiB0cmFuc2Zlcgorb2JqZWN0IHRvIGRvIGFsbCB0aGUgd29yay4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnNhbXBsZXMvcGVyc2lzdGVuY2UvajJlZS9yZXNvdXJjZXMvKjwvbGl0ZXJhbD46IEZpbGVzIHJlcXVpcmVkIHRvCitkZXBsb3kgdG8gdGhlIHZhcmlvdXMgYXBwc2VydmVycywgaW5jbHVkaW5nIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgV0FSLworRUpCLyBFQVIgZGVzY3JpcHRvcnMsIGFzIHdlbGwgYXMgYXBwc2VydmVyIHNwZWNpZmljIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2FtcGxlcy9wZXJzaXN0ZW5jZS9qMmVlL2J1aWxkLnhtbDwvbGl0ZXJhbD46IEEgc2ltcGxlIEFudCBidWlsZCBmaWxlCit0byBoZWxwIGluIGNyZWF0aW5nIGEgSjJFRSBFQVIgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ianBhX2oyZWVfdHV0b3JpYWxfbm90ZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIENvZGUgTm90ZXMgYW5kIEoyRUUgVGlwcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRW50aXR5IGNsYXNzZXMgYXJlIGV4Y2VsbGVudCBjYW5kaWRhdGVzIGZvciB0aGUgRGF0YSBUcmFuc2ZlciBPYmplY3QgUGF0dGVybi4KK1RoaXMgcGF0dGVybiBhdHRlbXB0cyB0byByZWR1Y2UgbmV0d29yayBsb2FkLCBhcyB3ZWxsIGFzIGdyb3VwIGJ1c2luZXNzIGxvZ2ljCitpbnRvIGNvbmNpc2UgdW5pdHMuIEZvciBleGFtcGxlLCA8bWV0aG9kbmFtZT5DYXJCZWFuLmVkaXQ8L21ldGhvZG5hbWU+IGFsbG93cworeW91IHRvIGVuc3VyZSB0aGF0IGFsbCB2YWx1ZXMgYXJlIGNvcnJlY3QgYmVmb3JlIGNvbW1pdHRpbmcgYSB0cmFuc2FjdGlvbiwKK2luc3RlYWQgb2Ygc2VxdWVudGlhbGx5IGNhbGxpbmcgZ2V0dGVycyBhbmQgc2V0dGVycyBvbiB0aGUgc2Vzc2lvbiBmYWNhZGUuIFRoaXMKK2lzIGVzcGVjaWFsbHkgdHJ1ZSB3aGVuIHVzaW5nIFJNSSBzdWNoIGFzIGZyb20gYSBTd2luZyBiYXNlZCBhcHBsaWNhdGlvbgorY29ubmVjdGluZyB0byBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPkNhckVKQjwvY2xhc3NuYW1lPiB3b3JrcyBhcyBhIHNlc3Npb24gYmVhbiBmYWNhZGUgdG8gZGVtYXJjYXRlCit0cmFuc2FjdGlvbnMsIHByb3ZpZGUgZmluZGVyIG1ldGhvZHMsIGFuZCBlbmNhcHN1bGF0ZSBjb21wbGV4IGJ1c2luZXNzIGxvZ2ljIGF0Cit0aGUgc2VydmVyIGxldmVsLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPG1ldGhvZG5hbWU+RW50aXR5TWFuYWdlci5jbG9zZSgpPC9tZXRob2RuYW1lPiBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBlbmQgb2YKK2V2ZXJ5IEVKQiBtZXRob2QuIEluIGFkZGl0aW9uIHRvIGVuc3VyaW5nIHRoYXQgeW91ciBjb2RlIHdpbGwgbm90IGF0dGVtcHQgdG8KK2FjY2VzcyBhIGNsb3NlZCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4sIGl0IGFsbG93cyBPcGVuSlBBIHRvIGZyZWUKK3VwIHVudXNlZCByZXNvdXJjZXMuIFNpbmNlIGFuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpcyBjcmVhdGVkCitmb3IgZXZlcnkgdHJhbnNhY3Rpb24sIHRoaXMgY2FuIGluY3JlYXNlIHRoZSBzY2FsYWJpbGl0eSBvZiB5b3VyIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IHNob3VsZCBub3QgdXNlIDxtZXRob2RuYW1lPiBFbnRpdHlNYW5hZ2VyLmdldFRyYW5zYWN0aW9uKCk8L21ldGhvZG5hbWU+IHdoZW4KK3VzaW5nIEpUQSB0byBtYW5hZ2UgeW91ciB0cmFuc2FjdGlvbnMuIEluc3RlYWQsIE9wZW5KUEEgd2lsbCBpbnRlZ3JhdGUgd2l0aCBKVEEKK3RvIGF1dG9tYXRpY2FsbHkgZ292ZXJuIHRyYW5zYWN0aW9ucyBiYXNlZCBvbiB5b3VyIEVKQiB0cmFuc2FjdGlvbgorY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1doaWxlIHNlcmlhbGl6YXRpb24gb2YgZW50aXR5IGluc3RhbmNlcyBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCwgdGhlcmUgYXJlCitzZXZlcmFsIHRoaW5ncyB0byBrZWVwIGluIG1pbmQ6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1doaWxlICJkZWZhdWx0IGZldGNoIGdyb3VwIiB2YWx1ZXMgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCB1cG9uCitzZXJpYWxpemF0aW9uLCBsYXppbHkgbG9hZGVkIGZpZWxkcyB3aWxsIG5vdCBhcyB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyCis8L2NsYXNzbmFtZT4gd2lsbCBoYXZlIGJlZW4gY2xvc2VkIGJlZm9yZSB0aG9zZSBmaWVsZHMgYXR0ZW1wdCB0byBzZXJpYWxpemUuIFlvdQorY2FuIGVpdGhlciBhY2Nlc3MgdGhvc2UgZmllbGRzIGJlZm9yZSBzZXJpYWxpemF0aW9uLCBjb25maWd1cmUgdGhlIGZldGNoIHR5cGUgb2YKK3RoZSByZWxhdGlvbnNoaXBzLCBvciBjb25maWd1cmUgeW91ciBKUFFMIHF1ZXJpZXMgdG8gZWFnZXJseSBmZXRjaCBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0l0IGlzIG5vdCBuZWNlc3NhcmlseSByZXF1aXJlZCB0aGF0IHlvdSB1c2UgRUpCcyBhbmQgY29udGFpbmVyLW1hbmFnZWQKK3RyYW5zYWN0aW9ucyB0byBkZW1hcmNhdGUgdHJhbnNhY3Rpb25zLCBhbHRob3VnaCB0aGF0IGlzIHByb2JhYmx5IHRoZSBtb3N0Citjb21tb24gbWV0aG9kLiBJbiBFSkJzIHVzaW5nIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gY29udHJvbAordHJhbnNhY3Rpb25zIHRocm91Z2ggdGhlIDxjbGFzc25hbWU+amF2YXgudHJhbnNhY3Rpb24uVXNlclRyYW5zYWN0aW9uCis8L2NsYXNzbmFtZT4gaW50ZXJmYWNlLiBGdXJ0aGVybW9yZSwgb3V0c2lkZSBvZiBzZXNzaW9uIGJlYW5zIHlvdSBjYW4gY29udHJvbAordGhlIEpQQSBsYXllcidzIHRyYW5zYWN0aW9uIHZpYSB0aGUgPGNsYXNzbmFtZT4KK2phdmF4LnBlcnNpc3RlbmNlLkVudGl0eVRyYW5zYWN0aW9uPC9jbGFzc25hbWU+IGludGVyZmFjZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPnMgYXJlIGFsbG9jYXRlZCBvbiBhIHBlci1UcmFuc2FjdGlvbiBiYXNpcy4KK0NhbGxpbmcgPG1ldGhvZG5hbWU+Z2V0RW50aXR5TWFuYWdlcjwvbWV0aG9kbmFtZT4gZnJvbSB0aGUgc2FtZSA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gd2l0aGluIHRoZSBzYW1lIEVKQiBtZXRob2QgY2FsbCB3aWxsIGFsd2F5cworcmV0dXJuIHRoZSBzYW1lIGVudGl0eSBtYW5hZ2VyLCBhbHRob3VnaCB0aGUgdXNlci12aXNpYmxlIG9iamVjdCBtYXkgYmUgcHJveGllZCwKK3NvIG1pZ2h0IG5vdCBjb21wYXJlIGVxdWFsIHVzaW5nIHRoZSA8bGl0ZXJhbD49PTwvbGl0ZXJhbD4gb3BlcmF0b3IuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL21hbnVhbC1wZGYueHNsIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvbWFudWFsLXBkZi54c2wKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EyMGE0ZgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL21hbnVhbC1wZGYueHNsCkBAIC0wLDAgKzEsMzQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKwl4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0IgorCXZlcnNpb249JzEuMCc+CisgICAgPCEtLSB1c2VkIGJ5IGRvY2JreC1tYXZlbi1wbHVnaW4gdG8gcmVmZXJlbmNlIHRoZSBjb3JlIHN0eWxlcyAtLT4KKyAgICA8eHNsOmltcG9ydCBocmVmPSJ1cm46ZG9jYmt4OnN0eWxlc2hlZXQiLz4KKworCTwhLS0gbm8gcGljdHVyZXMgaW4gbm90ZS93YXJuL2NhdXRpb24gcGFyZ3MgLS0+CisJPHhzbDpwYXJhbSBuYW1lPSJhZG1vbi5ncmFwaGljcyIgc2VsZWN0PSIwIiAvPgorCTx4c2w6cGFyYW0gbmFtZT0iYXV0b3RvYy5sYWJlbC5zZXBhcmF0b3IiIHNlbGVjdD0iJy4gJyIvPgorCTx4c2w6cGFyYW0gbmFtZT0idG9jLmluZGVudC53aWR0aCIgc2VsZWN0PSIyNCIvPgorCisJPCEtLSByZXF1aXJlZCBmb3IgUERGIGJvb2ttYXJrcyBhbmQgc29tZSBvdGhlciBzdHVmZiAtLT4KKwk8eHNsOnBhcmFtIG5hbWU9ImZvcC5leHRlbnNpb25zIiBzZWxlY3Q9IjEiLz4KKwk8IS0tIDx4c2w6cGFyYW0gbmFtZT0idXNlLmV4dGVuc2lvbnMiIHNlbGVjdD0iMSIvPiAtLT4KKworCTx4c2w6cGFyYW0gbmFtZT0idWxpbmsuaHlwaGVuYXRlIiBzZWxlY3Q9IicnIi8+CisKKwk8IS0tIGRvbid0IHNob3cgbGluayBzb3VyY2UgLS0+CisJPHhzbDpwYXJhbSBuYW1lPSJ1bGluay5zaG93IiBzZWxlY3Q9IjAiLz4KKworCisJPCEtLSA8eHNsOnBhcmFtIG5hbWU9InVsaW5rLmZvb3Rub3RlcyIgc2VsZWN0PSIxIi8+IC0tPgorCTwhLS0gPHhzbDpwYXJhbSBuYW1lPSJ1bGluay5oeXBoZW5hdGUiIHNlbGVjdD0iMSIvPiAtLT4KKworCTwhLS0gZG9uJ3QgZXZlciBoeXBoZW5hdGUgd29yZHMgLS0+CisJPCEtLSA8eHNsOnBhcmFtIG5hbWU9Imh5cGhlbmF0ZSI+ZmFsc2U8L3hzbDpwYXJhbT4gLS0+CisKKwk8IS0tIGxlZnQganVzdGlmeSAtLT4KKwk8eHNsOnBhcmFtIG5hbWU9ImFsaWdubWVudCI+bGVmdDwveHNsOnBhcmFtPgorCisJPCEtLSBwcmludCBwYWdlIG51bWJlcnMgaW4gcmVmZXJlbmNlcyAtLT4KKwk8eHNsOnBhcmFtIG5hbWU9Imluc2VydC54cmVmLnBhZ2UubnVtYmVyIiBzZWxlY3Q9IjEiLz4KKworCTwhLS0gbWFrZSBhbGwgY3Jvc3MtcmVmZXJuY2UgbGlua3MgYXBwZWFyIGluIGJvbGQgYW5kIGRhcmsgYmx1ZSAtLT4KKwk8eHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0ieHJlZi5wcm9wZXJ0aWVzIj4KKwkJPCEtLSA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xvciI+I0FGQUZBRjwveHNsOmF0dHJpYnV0ZT4gLS0+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbG9yIj4jMTcxODRBPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmb250LXdlaWdodCI+Ym9sZDwveHNsOmF0dHJpYnV0ZT4KKwk8L3hzbDphdHRyaWJ1dGUtc2V0PgorCisKKwk8IS0tIHBhZ2UgYnJlYWsgYmVmb3JlIGxldmVsMSBzZWN0aW9ucyAtLT4KKwk8IS0teHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0ic2VjdGlvbi5sZXZlbDEucHJvcGVydGllcyI+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImJyZWFrLWJlZm9yZSI+cGFnZTwveHNsOmF0dHJpYnV0ZT4KKwk8L3hzbDphdHRyaWJ1dGUtc2V0LS0+CisKKwk8IS0tIENoYXB0ZXJzOiB3aGl0ZSBmb250IG9uIGxpZ2h0IGJsdWUgYmFja2dyb3VucyAtLT4KKwk8eHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0idGl0bGUucHJvcGVydGllcyI+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbG9yIj4jMDAwMDAwPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmb250LXdlaWdodCI+Ym9sZDwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYmFja2dyb3VuZC1jb2xvciI+IzMzNjZDQzwveHNsOmF0dHJpYnV0ZT4KKwk8L3hzbDphdHRyaWJ1dGUtc2V0PgorCisKKwk8IS0tIFNlY3Rpb24gdGl0bGU6IHVuZGVybGluZSAtLT4KKwk8eHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0ic2VjdGlvbi50aXRsZS5wcm9wZXJ0aWVzIj4KKwkJPCEtLSA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xvciI+IzAwNUJBNjwveHNsOmF0dHJpYnV0ZT4gLS0+CisKKwkJPCEtLSBzaW11bGF0ZSB1bmRlcmxpbmUgd2l0aCBib3JkZXIgb2YgMXB4IGJvdHRvbSAtLT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCI+MXB4PC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItdG9wLXdpZHRoIj4wcHg8L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIj4wcHg8L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCI+MHB4PC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItc3R5bGUiPnNvbGlkPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItd2lkdGgiPjFweDwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWNvbG9yIj4jMTcxODRBPC94c2w6YXR0cmlidXRlPgorCTwveHNsOmF0dHJpYnV0ZS1zZXQ+CisKKworCTwhLS0gRXhhbXBsZXMgYW5kIG90aGVyIGZvbWFsIHNlY3Rpb25zOiBpdGFsaWMgLS0+CisJPHhzbDphdHRyaWJ1dGUtc2V0IG5hbWU9ImZvcm1hbC50aXRsZS5wcm9wZXJ0aWVzIj4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iZm9udC1zaXplIj4KKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYm9keS5mb250Lm1hc3RlciAqIDEuMiIvPgorCQkJPHhzbDp0ZXh0PnB0PC94c2w6dGV4dD4KKwkJPC94c2w6YXR0cmlidXRlPgorCisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImZvbnQtc3R5bGUiPml0YWxpYzwveHNsOmF0dHJpYnV0ZT4KKwk8L3hzbDphdHRyaWJ1dGUtc2V0PgorCisKKwk8eHNsOnBhcmFtIG5hbWU9InNlZ21lbnRlZGxpc3QuYXMudGFibGUiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0idmFyaWFibGVsaXN0LmFzLmJsb2NrcyIgc2VsZWN0PSIxIi8+CisKKwk8eHNsOnBhcmFtIG5hbWU9Imh0bWwuc3R5bGVzaGVldCI+ZG9jdW1lbnRhdGlvbi5jc3M8L3hzbDpwYXJhbT4KKwk8eHNsOnBhcmFtIG5hbWU9ImFubm90YXRlLnRvYyIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJ0b2Muc2VjdGlvbi5kZXB0aCIgc2VsZWN0PSI4Ii8+CisJPHhzbDpwYXJhbSBuYW1lPSJnZW5lcmF0ZS5zZWN0aW9uLnRvYy5sZXZlbCIgc2VsZWN0PSI4Ii8+CisJPHhzbDpwYXJhbSBuYW1lPSJnZW5lcmF0ZS5pbmRleCIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJjaGFwdGVyLmF1dG9sYWJlbCIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJhcHBlbmRpeC5hdXRvbGFiZWwiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0icGFydC5hdXRvbGFiZWwiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0icHJlZmFjZS5hdXRvbGFiZWwiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0icWFuZGFkaXYuYXV0b2xhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9InNlY3Rpb24uYXV0b2xhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9InNlY3Rpb24ubGFiZWwuaW5jbHVkZXMuY29tcG9uZW50LmxhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9ImxhYmVsLmZyb20ucGFydCIgc2VsZWN0PSIxIi8+CisKKwk8eHNsOnBhcmFtIG5hbWU9ImdlbmVyYXRlLnRvYyI+CisJCS9hcHBlbmRpeCAgdG9jICAgIAorCQlhcnRpY2xlICAgdG9jICAgIAorCQlib29rICAgICAgdG9jLGZpZ3VyZSx0YWJsZSxleGFtcGxlLGVxdWF0aW9uCisJCS9jaGFwdGVyICAgdG9jICAgIAorCQlwYXJ0ICAgICAgdG9jICAgIAorCQkvcHJlZmFjZSAgIHRvYyAgICAKKwkJcWFuZGFkaXYgIHRvYyAgICAKKwkJcWFuZGFzZXQgIHRvYyAgICAKKwkJcmVmZXJlbmNlIHRvYyAgICAKKwkJL3NlY3Rpb24gICB0b2MgICAgCisJCXNldCAgICAgICB0b2MgICAgCisJPC94c2w6cGFyYW0+ICAgICAKKworCisJPCEtLSBzbWFsbCBtYXJnaW5zIGZvciB0aGUgUERGIC0tPgorCTx4c2w6cGFyYW0gbmFtZT0icGFnZS5tYXJnaW4uaW5uZXIiPjAuM2luPC94c2w6cGFyYW0+CisJPHhzbDpwYXJhbSBuYW1lPSJwYWdlLm1hcmdpbi5vdXRlciI+MC4zaW48L3hzbDpwYXJhbT4KKworCisJPCEtLSB3aXRob3V0IHRoaXMsIHNvbWUgcGFydHMgb2YgdGhlIGJvZHkgc2VlbSB0byBvdmVycmluIHRoZSAtLT4KKwk8IS0tIHBhZ2UgbnVtYmVyIHBhcnQgb2YgdGhlIGZvb3RlciAtLT4KKwk8eHNsOnBhcmFtIG5hbWU9ImJvZHkubWFyZ2luLmJvdHRvbSI+MC44OGluPC94c2w6cGFyYW0+CisJPHhzbDpwYXJhbSBuYW1lPSJwYWdlLm1hcmdpbi5ib3R0b20iPjAuMDFpbjwveHNsOnBhcmFtPgorCisJPCEtLSBtYWtlIHNvdXJjZSBjb2RlIGxpc3RpbmdzIGJlIGJveGVkIGFuZCBoYXZlIGEgZ3JleSBiYWNrZ3JvdW5kIC0tPgorCTx4c2w6YXR0cmlidXRlLXNldCBuYW1lPSJtb25vc3BhY2UudmVyYmF0aW0ucHJvcGVydGllcyIKKwkJdXNlLWF0dHJpYnV0ZS1zZXRzPSJ2ZXJiYXRpbS5wcm9wZXJ0aWVzIj4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iZm9udC1mYW1pbHkiPgorCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb25vc3BhY2UuZm9udC5mYW1pbHkiLz4KKwkJPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmb250LXNpemUiPgorCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRib2R5LmZvbnQubWFzdGVyICogMC43Ii8+CisJCQk8eHNsOnRleHQ+cHQ8L3hzbDp0ZXh0PgorCQk8L3hzbDphdHRyaWJ1dGU+CisKKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYmFja2dyb3VuZC1jb2xvciI+I0YwRjBGMDwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWNvbG9yIj4jMDAwMDAwPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItc3R5bGUiPnNvbGlkPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItd2lkdGgiPjFweDwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icGFkZGluZy10b3AiPjAuNWNtPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYWRkaW5nLWJvdHRvbSI+MC41Y208L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9InBhZGRpbmctbGVmdCI+MC41Y208L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9InBhZGRpbmctcmlnaHQiPjAuNWNtPC94c2w6YXR0cmlidXRlPgorCTwveHNsOmF0dHJpYnV0ZS1zZXQ+CisKKworCTwhLS0gYWRtb25pdGlvbiAobm90ZS93YXJuL2NhdXRpb24pIHRpdGxlIHByb3BlcnRpZXM6IGl0YWxpY3MsCQktLT4KKwk8IS0tIHdpdGggYSBibHVlIGJhY2tncm91bmQgYW5kIHdoaXRlIHRleHQJCQkJCQkJLS0+CisJPHhzbDphdHRyaWJ1dGUtc2V0IG5hbWU9ImFkbW9uaXRpb24udGl0bGUucHJvcGVydGllcyI+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImZvbnQtc2l6ZSI+CisJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJvZHkuZm9udC5tYXN0ZXIgKiAxLjUiLz4KKwkJCTx4c2w6dGV4dD5wdDwveHNsOnRleHQ+CisJCTwveHNsOmF0dHJpYnV0ZT4KKworCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmb250LXN0eWxlIj5ib2xkPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0ZXh0LWFsaWduIj5jZW50ZXI8L3hzbDphdHRyaWJ1dGU+CisKKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sb3IiPiNGRkZGRkY8L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImJhY2tncm91bmQtY29sb3IiPiMxNzE4NEE8L3hzbDphdHRyaWJ1dGU+CisKKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWNvbG9yIj4jMDAwMDAwPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItc3R5bGUiPnNvbGlkPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItd2lkdGgiPjBweDwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icGFkZGluZy1sZWZ0Ij4wLjJjbTwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icGFkZGluZy1yaWdodCI+MC4yY208L3hzbDphdHRyaWJ1dGU+CisJPC94c2w6YXR0cmlidXRlLXNldD4KKworCTwhLS0gYWRtb25pdGlvbiAobm90ZS93YXJuL2NhdXRpb24pIHByb3BlcnRpZXM6IGdyYXkgYmFja2dyb3VuZCAtLT4KKwk8eHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0iYWRtb25pdGlvbi5wcm9wZXJ0aWVzIj4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYmFja2dyb3VuZC1jb2xvciI+I0IwQjNCMjwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWNvbG9yIj4jMDAwMDAwPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItc3R5bGUiPnNvbGlkPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItd2lkdGgiPjBweDwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icGFkZGluZy10b3AiPjAuMmNtPC94c2w6YXR0cmlidXRlPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYWRkaW5nLWJvdHRvbSI+MC4yY208L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9InBhZGRpbmctbGVmdCI+MC4yY208L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9InBhZGRpbmctcmlnaHQiPjAuMmNtPC94c2w6YXR0cmlidXRlPgorCTwveHNsOmF0dHJpYnV0ZS1zZXQ+CisKKwk8eHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0iYm9vay50aXRsZXBhZ2UucmVjdG8uc3R5bGUiPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmb250LXNpemUiPjE4cHg8L3hzbDphdHRyaWJ1dGU+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9InRleHQtYWxpZ24iPmNlbnRlcjwveHNsOmF0dHJpYnV0ZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icGFkZGluZy10b3AiPjNjbTwveHNsOmF0dHJpYnV0ZT4KKwk8L3hzbDphdHRyaWJ1dGUtc2V0PgorCisKKworCTwhLS0gcGF0Y2hlcyBhbmQgZml4ZXMgZm9yIHN0eWxlc2hlZXQgYnVncyAtLT4KKworCisJPCEtLQorCQlmaXggZm9yIGR1cGxpY2F0ZSBpZHMgZ2VuZXJhdGVkIGJ5IDxxYW5kYXNldD4gYXR0cmlidXRlcworCQlvdmVycmlkZXMgZG9jYm9vay14c2wvZm8vcWFuZGFzZXQueHNsCisKKyAgICAJU2VlOiBodHRwOi8vbGlzdHMub2FzaXMtb3Blbi5vcmcvYXJjaGl2ZXMvZG9jYm9vay8yMDAzMDkvbXNnMDAwNzAuaHRtbAorCS0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icXVlc3Rpb24iPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlkIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib2JqZWN0LmlkIi8+PC94c2w6dmFyaWFibGU+CisKKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnRyeS5pZCI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im9iamVjdC5pZCI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ib2JqZWN0IiBzZWxlY3Q9InBhcmVudDo6KiIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnZhcmlhYmxlPgorCisgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGVmbGFiZWwiPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9ImFuY2VzdG9yLW9yLXNlbGY6OipbQGRlZmF1bHRsYWJlbF0iPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKGFuY2VzdG9yLW9yLXNlbGY6OipbQGRlZmF1bHRsYWJlbF0pW2xhc3QoKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9AZGVmYXVsdGxhYmVsIi8+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcWFuZGEuZGVmYXVsdGxhYmVsIi8+CisgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICA8L3hzbDp2YXJpYWJsZT4KKworICA8Zm86bGlzdC1pdGVtIGlkPSJ7JGVudHJ5LmlkfSIgeHNsOnVzZS1hdHRyaWJ1dGUtc2V0cz0ibGlzdC5pdGVtLnNwYWNpbmciPgorICAgIDwhLS0KKyAgICBUaGlzIGFkZHMgZHVwbGljYXRlIGlkIGF0dHJpYnV0ZXMgZm9yIHNvbWUgcmVhc29uCisgICAgU2VlOiBodHRwOi8vbGlzdHMub2FzaXMtb3Blbi5vcmcvYXJjaGl2ZXMvZG9jYm9vay8yMDAzMDkvbXNnMDAwNzAuaHRtbAorICAgIDxmbzpsaXN0LWl0ZW0tbGFiZWwgaWQ9InskaWR9IiBlbmQtaW5kZW50PSJsYWJlbC1lbmQoKSI+CisgICAgLS0+CisgICAgPGZvOmxpc3QtaXRlbS1sYWJlbCBlbmQtaW5kZW50PSJsYWJlbC1lbmQoKSI+CisgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRkZWZsYWJlbCA9ICdub25lJyI+CisgICAgICAgICAgPGZvOmJsb2NrLz4KKyAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgPGZvOmJsb2NrPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJsYWJlbC5tYXJrdXAiLz4KKwkgICAgPHhzbDppZiB0ZXN0PSIkZGVmbGFiZWwgPSAnbnVtYmVyJyBhbmQgbm90KGxhYmVsKSI+CisgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iaW50cmFsYWJlbC5wdW5jdHVhdGlvbiIvPgorCSAgICA8L3hzbDppZj4KKyAgICAgICAgICA8L2ZvOmJsb2NrPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICA8L3hzbDpjaG9vc2U+CisgICAgPC9mbzpsaXN0LWl0ZW0tbGFiZWw+CisgICAgPGZvOmxpc3QtaXRlbS1ib2R5IHN0YXJ0LWluZGVudD0iYm9keS1zdGFydCgpIj4KKyAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGRlZmxhYmVsID0gJ25vbmUnIj4KKyAgICAgICAgICA8Zm86YmxvY2sgZm9udC13ZWlnaHQ9ImJvbGQiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIqW2xvY2FsLW5hbWUoLikhPSdsYWJlbCddIi8+CisgICAgICAgICAgPC9mbzpibG9jaz4KKyAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIqW2xvY2FsLW5hbWUoLikhPSdsYWJlbCddIi8+CisgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgIDwveHNsOmNob29zZT4KKyAgICA8L2ZvOmxpc3QtaXRlbS1ib2R5PgorICA8L2ZvOmxpc3QtaXRlbT4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFuc3dlciI+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iaWQiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvYmplY3QuaWQiLz48L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnRyeS5pZCI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im9iamVjdC5pZCI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ib2JqZWN0IiBzZWxlY3Q9InBhcmVudDo6KiIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnZhcmlhYmxlPgorICAgICAgCisgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGVmbGFiZWwiPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9ImFuY2VzdG9yLW9yLXNlbGY6OipbQGRlZmF1bHRsYWJlbF0iPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKGFuY2VzdG9yLW9yLXNlbGY6OipbQGRlZmF1bHRsYWJlbF0pW2xhc3QoKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9AZGVmYXVsdGxhYmVsIi8+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcWFuZGEuZGVmYXVsdGxhYmVsIi8+CisgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICA8L3hzbDp2YXJpYWJsZT4KKyAgPGZvOmxpc3QtaXRlbSB4c2w6dXNlLWF0dHJpYnV0ZS1zZXRzPSJsaXN0Lml0ZW0uc3BhY2luZyI+CisgICAgPCEtLQorICAgIFRoaXMgYWRkcyBkdXBsaWNhdGUgaWQgYXR0cmlidXRlcyBmb3Igc29tZSByZWFzb24KKyAgICBTZWU6IGh0dHA6Ly9saXN0cy5vYXNpcy1vcGVuLm9yZy9hcmNoaXZlcy9kb2Nib29rLzIwMDMwOS9tc2cwMDA3MC5odG1sCisgICAgPGZvOmxpc3QtaXRlbS1sYWJlbCBpZD0ieyRpZH0iIGVuZC1pbmRlbnQ9ImxhYmVsLWVuZCgpIj4KKyAgICAtLT4KKyAgICA8Zm86bGlzdC1pdGVtLWxhYmVsIGVuZC1pbmRlbnQ9ImxhYmVsLWVuZCgpIj4KKyAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGRlZmxhYmVsID0gJ25vbmUnIj4KKyAgICAgICAgICA8Zm86YmxvY2svPgorICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICA8Zm86YmxvY2s+CisgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFuc3dlci5sYWJlbCI+CisgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ibGFiZWwubWFya3VwIi8+CisgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IiRhbnN3ZXIubGFiZWwiLz4KKyAgICAgICAgICA8L2ZvOmJsb2NrPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICA8L3hzbDpjaG9vc2U+CisgICAgPC9mbzpsaXN0LWl0ZW0tbGFiZWw+CisgICAgPGZvOmxpc3QtaXRlbS1ib2R5IHN0YXJ0LWluZGVudD0iYm9keS1zdGFydCgpIj4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKltsb2NhbC1uYW1lKC4pIT0nbGFiZWwnXSIvPgorICAgIDwvZm86bGlzdC1pdGVtLWJvZHk+CisgIDwvZm86bGlzdC1pdGVtPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSB0aGUgZGVmYXVsdCBzdHlsZXNoZWV0cyBtb3ZlIHRoZSBhbHBoYWJldCBsZXR0ZXIgb3V0IG9mIHRoZSBmbworCWJsb2NrLiB0aGlzIGZpeGVzIHRoYXQuIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleGRpdi50aXRsZSI+CisgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZWNvbnRlbnQiLz4KKworICA8Zm86YmxvY2sgCisJICAgIGZvbnQtc2l6ZT0iMTQuNHB0IgorICAgICAgICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisgICAgICAgICAgICBmb250LXdlaWdodD0iYm9sZCIKKyAgICAgICAgICAgIGtlZXAtd2l0aC1uZXh0LndpdGhpbi1jb2x1bW49ImFsd2F5cyIKKyAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSJ7JGJvZHkuZm9udC5tYXN0ZXJ9cHQiCisgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0ieyRib2R5LmZvbnQubWFzdGVyICogMC44fXB0IgorICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1heGltdW09InskYm9keS5mb250Lm1hc3RlciAqIDEuMn1wdCI+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICA8eHNsOndoZW4gdGVzdD0iJHRpdGxlIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvYmplY3QudGl0bGUubWFya3VwIj4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iYWxsb3ctYW5jaG9ycyIgc2VsZWN0PSIxIi8+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgIDwveHNsOndoZW4+CisgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iJHRpdGxlY29udGVudCIvPgorICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgPC9mbzpibG9jaz4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgorCmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9tYW51YWwteGh0bWwtY2h1bmsueHNsIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvbWFudWFsLXhodG1sLWNodW5rLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Y2NGYzCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvbWFudWFsLXhodG1sLWNodW5rLnhzbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0nMS4wJz4KKworICAgIDwhLS0gZG9jYm9vayBzdHlsZXNoZWV0IGN1c3RvbWl6YXRpb25zIGZvciBvcGVuanBhIG1hbnVhbCAtLT4KKwk8IS0tIDx4c2w6aW1wb3J0IGhyZWY9Imh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC9kb2Nib29rLXhzbC0xLjY3LjIvaHRtbC9jaHVuay54c2wiLz4gLS0+CisgICAgPCEtLSBsb2NhbGx5IGRvd25sb2FkZWQgY2FjaGUgb2Ygc3R5bGVzaGVldHMgLS0+CisJPCEtLSA8eHNsOmltcG9ydCBocmVmPSIuLi8uLi8uLi90YXJnZXQvc3R5bGVzaGVldHMvZG9jYm9vay14c2wtMS42Ny4yL2h0bWwvY2h1bmsueHNsIi8+IC0tPgorCisgICAgPCEtLSB1c2VkIGJ5IGRvY2JreC1tYXZlbi1wbHVnaW4gdG8gcmVmZXJlbmNlIHRoZSBjb3JlIHN0eWxlcyAtLT4KKyAgICA8eHNsOmltcG9ydCBocmVmPSJ1cm46ZG9jYmt4OnN0eWxlc2hlZXQiLz4KKworCTx4c2w6cGFyYW0gbmFtZT0iaHRtbC5zdHlsZXNoZWV0Ij5jc3MvZG9jYm9vay5jc3M8L3hzbDpwYXJhbT4KKworCTx4c2w6cGFyYW0gbmFtZT0iaHRtbC5jbGVhbnVwIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9ImxhYmVsLmZyb20ucGFydCIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJhbm5vdGF0ZS50b2MiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0idG9jLnNlY3Rpb24uZGVwdGgiPjU8L3hzbDpwYXJhbT4KKwk8eHNsOnBhcmFtIG5hbWU9ImdlbmVyYXRlLnNlY3Rpb24udG9jLmxldmVsIiBzZWxlY3Q9IjgiLz4KKwk8eHNsOnBhcmFtIG5hbWU9ImdlbmVyYXRlLmlkLmF0dHJpYnV0ZXMiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0iZ2VuZXJhdGUuaW5kZXgiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0iY2hhcHRlci5hdXRvbGFiZWwiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0iYXBwZW5kaXguYXV0b2xhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9InBhcnQuYXV0b2xhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9InByZWZhY2UuYXV0b2xhYmVsIiBzZWxlY3Q9IjAiLz4KKwk8eHNsOnBhcmFtIG5hbWU9InFhbmRhZGl2LmF1dG9sYWJlbCIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJzZWN0aW9uLmF1dG9sYWJlbCIgc2VsZWN0PSIxIi8+CisKKwk8eHNsOnBhcmFtIG5hbWU9InVzZS5pZC5hcy5maWxlbmFtZSIgc2VsZWN0PSInMSciLz4KKwk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MuaW1hZ2UuYXR0cmlidXRlcyIvPgorPC94c2w6c3R5bGVzaGVldD4KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvbWFudWFsLXhodG1sLnhzbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL21hbnVhbC14aHRtbC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0ZTUyYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL21hbnVhbC14aHRtbC54c2wKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249JzEuMCc+CisKKyAgICA8IS0tIGRvY2Jvb2sgc3R5bGVzaGVldCBjdXN0b21pemF0aW9ucyBmb3Igb3BlbmpwYSBtYW51YWwgLS0+CisJPCEtLSA8eHNsOmltcG9ydCBocmVmPSJodHRwOi8vZG9jYm9vay5zb3VyY2Vmb3JnZS5uZXQvcmVsZWFzZS94c2wvZG9jYm9vay14c2wtMS42Ny4yL2h0bWwvZG9jYm9vay54c2wiLz4gLS0+CisgICAgPCEtLSBsb2NhbGx5IGRvd25sb2FkZWQgY2FjaGUgb2Ygc3R5bGVzaGVldHMgLS0+CisJPCEtLSA8eHNsOmltcG9ydCBocmVmPSIuLi8uLi8uLi90YXJnZXQvc3R5bGVzaGVldHMvZG9jYm9vay14c2wtMS42Ny4yL2h0bWwvZG9jYm9vay54c2wiLz4gLS0+CisKKyAgICA8IS0tIHVzZWQgYnkgZG9jYmt4LW1hdmVuLXBsdWdpbiB0byByZWZlcmVuY2UgdGhlIGNvcmUgc3R5bGVzIC0tPgorICAgIDx4c2w6aW1wb3J0IGhyZWY9InVybjpkb2Nia3g6c3R5bGVzaGVldCIvPgorCisJPHhzbDpwYXJhbSBuYW1lPSJodG1sLnN0eWxlc2hlZXQiPmNzcy9kb2Nib29rLmNzczwveHNsOnBhcmFtPgorCisJPHhzbDpwYXJhbSBuYW1lPSJodG1sLmNsZWFudXAiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0ibGFiZWwuZnJvbS5wYXJ0IiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9ImFubm90YXRlLnRvYyIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJ0b2Muc2VjdGlvbi5kZXB0aCI+NTwveHNsOnBhcmFtPgorCTx4c2w6cGFyYW0gbmFtZT0iZ2VuZXJhdGUuc2VjdGlvbi50b2MubGV2ZWwiIHNlbGVjdD0iOCIvPgorCTx4c2w6cGFyYW0gbmFtZT0iZ2VuZXJhdGUuaWQuYXR0cmlidXRlcyIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJnZW5lcmF0ZS5pbmRleCIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJjaGFwdGVyLmF1dG9sYWJlbCIgc2VsZWN0PSIxIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJhcHBlbmRpeC5hdXRvbGFiZWwiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0icGFydC5hdXRvbGFiZWwiIHNlbGVjdD0iMSIvPgorCTx4c2w6cGFyYW0gbmFtZT0icHJlZmFjZS5hdXRvbGFiZWwiIHNlbGVjdD0iMCIvPgorCTx4c2w6cGFyYW0gbmFtZT0icWFuZGFkaXYuYXV0b2xhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnBhcmFtIG5hbWU9InNlY3Rpb24uYXV0b2xhYmVsIiBzZWxlY3Q9IjEiLz4KKwk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MuaW1hZ2UuYXR0cmlidXRlcyIvPgorPC94c2w6c3R5bGVzaGVldD4KKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvbWFudWFsLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL21hbnVhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMTM3ZQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL21hbnVhbC54bWwKQEAgLTAsMCArMSwxMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPCFET0NUWVBFIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiIFsKKyAgICA8IUVOVElUWSBvcGVuanBhLXZlcnNpb24gIlZFUlNJT04iPgorCisgICAgPCFFTlRJVFkgb3BlbmpwYV9pbnRyby54bWwgU1lTVEVNICJvcGVuanBhX2ludHJvLnhtbCI+CisgICAgPCFFTlRJVFkganBhX292ZXJ2aWV3X2ludHJvLnhtbCBTWVNURU0gImpwYV9vdmVydmlld19pbnRyby54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld193aHkueG1sIFNZU1RFTSAianBhX292ZXJ2aWV3X3doeS54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld19hcmNoLnhtbCBTWVNURU0gImpwYV9vdmVydmlld19hcmNoLnhtbCI+CisgICAgPCFFTlRJVFkganBhX292ZXJ2aWV3X3BjLnhtbCBTWVNURU0gImpwYV9vdmVydmlld19wYy54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld19tZXRhLnhtbCBTWVNURU0gImpwYV9vdmVydmlld19tZXRhLnhtbCI+CisgICAgPCFFTlRJVFkganBhX292ZXJ2aWV3X3BlcnNpc3RlbmNlLnhtbCBTWVNURU0gImpwYV9vdmVydmlld19wZXJzaXN0ZW5jZS54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld19lbWZhY3RvcnkueG1sIFNZU1RFTSAianBhX292ZXJ2aWV3X2VtZmFjdG9yeS54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld19lbS54bWwgU1lTVEVNICJqcGFfb3ZlcnZpZXdfZW0ueG1sIj4KKyAgICA8IUVOVElUWSBqcGFfb3ZlcnZpZXdfdHJhbnMueG1sIFNZU1RFTSAianBhX292ZXJ2aWV3X3RyYW5zLnhtbCI+CisgICAgPCFFTlRJVFkganBhX292ZXJ2aWV3X3F1ZXJ5LnhtbCBTWVNURU0gImpwYV9vdmVydmlld19xdWVyeS54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld19zcWxxdWVyeS54bWwgU1lTVEVNICJqcGFfb3ZlcnZpZXdfc3FscXVlcnkueG1sIj4KKyAgICA8IUVOVElUWSBqcGFfb3ZlcnZpZXdfbWFwcGluZy54bWwgU1lTVEVNICJqcGFfb3ZlcnZpZXdfbWFwcGluZy54bWwiPgorICAgIDwhRU5USVRZIGpwYV9vdmVydmlld19jb25jbHVzaW9uLnhtbCBTWVNURU0gImpwYV9vdmVydmlld19jb25jbHVzaW9uLnhtbCI+CisgICAgPCFFTlRJVFkganBhX3R1dG9yaWFscy54bWwgU1lTVEVNICJqcGFfdHV0b3JpYWxzLnhtbCI+CisgICAgPCFFTlRJVFkgcmVmX2d1aWRlX2ludHJvLnhtbCBTWVNURU0gInJlZl9ndWlkZV9pbnRyby54bWwiPgorICAgIDwhRU5USVRZIHJlZl9ndWlkZV9jb25mLnhtbCBTWVNURU0gInJlZl9ndWlkZV9jb25mLnhtbCI+CisgICAgPCFFTlRJVFkgcmVmX2d1aWRlX2xvZ2dpbmcueG1sIFNZU1RFTSAicmVmX2d1aWRlX2xvZ2dpbmcueG1sIj4KKyAgICA8IUVOVElUWSByZWZfZ3VpZGVfZGJzZXR1cC54bWwgU1lTVEVNICJyZWZfZ3VpZGVfZGJzZXR1cC54bWwiPgorICAgIDwhRU5USVRZIHJlZl9ndWlkZV9wYy54bWwgU1lTVEVNICJyZWZfZ3VpZGVfcGMueG1sIj4KKyAgICA8IUVOVElUWSByZWZfZ3VpZGVfbWV0YS54bWwgU1lTVEVNICJyZWZfZ3VpZGVfbWV0YS54bWwiPgorICAgIDwhRU5USVRZIHJlZl9ndWlkZV9tYXBwaW5nLnhtbCBTWVNURU0gInJlZl9ndWlkZV9tYXBwaW5nLnhtbCI+CisgICAgPCFFTlRJVFkgcmVmX2d1aWRlX2RlcGxveS54bWwgU1lTVEVNICJyZWZfZ3VpZGVfZGVwbG95LnhtbCI+CisgICAgPCFFTlRJVFkgcmVmX2d1aWRlX3J1bnRpbWUueG1sIFNZU1RFTSAicmVmX2d1aWRlX3J1bnRpbWUueG1sIj4KKyAgICA8IUVOVElUWSByZWZfZ3VpZGVfY2FjaGluZy54bWwgU1lTVEVNICJyZWZfZ3VpZGVfY2FjaGluZy54bWwiPgorICAgIDwhRU5USVRZIHJlZl9ndWlkZV9yZW1vdGUueG1sIFNZU1RFTSAicmVmX2d1aWRlX3JlbW90ZS54bWwiPgorICAgIDwhRU5USVRZIHJlZl9ndWlkZV9pbnRlZ3JhdGlvbi54bWwgU1lTVEVNICJyZWZfZ3VpZGVfaW50ZWdyYXRpb24ueG1sIj4KKyAgICA8IUVOVElUWSByZWZfZ3VpZGVfb3B0aW1pemF0aW9uLnhtbCBTWVNURU0gInJlZl9ndWlkZV9vcHRpbWl6YXRpb24ueG1sIj4KKyAgICA8IUVOVElUWSBzYW1wbGVzX2d1aWRlLnhtbCBTWVNURU0gInNhbXBsZXNfZ3VpZGUueG1sIj4KKyAgICA8IUVOVElUWSBqcGFfcmVzb3VyY2VzLnhtbCBTWVNURU0gImpwYV9yZXNvdXJjZXMueG1sIj4KKyAgICA8IUVOVElUWSBzdXBwb3J0ZWRfZGF0YWJhc2VzLnhtbCBTWVNURU0gInN1cHBvcnRlZF9kYXRhYmFzZXMueG1sIj4KK10+Cis8Ym9vayBpZD0ibWFudWFsIj4KKyAgICA8Ym9va2luZm8+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgT3BlbkpQQSBVc2VyJ3MgR3VpZGU8L3RpdGxlPgorICAgIDwvYm9va2luZm8+CisKKyAgICA8cGFydCBpZD0iaW50cm9kdWN0aW9uIj4KKyAgICAgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgICAgICZvcGVuanBhX2ludHJvLnhtbDsKKyAgICA8L3BhcnQ+CisKKyAgICA8cGFydCBpZD0ianBhX292ZXJ2aWV3Ij4KKyAgICAgICAgPHRpdGxlPkphdmEgUGVyc2lzdGVuY2UgQVBJPC90aXRsZT4KKyAgICAgICAgJmpwYV9vdmVydmlld19pbnRyby54bWw7CisgICAgICAgICZqcGFfb3ZlcnZpZXdfd2h5LnhtbDsKKyAgICAgICAgJmpwYV9vdmVydmlld19hcmNoLnhtbDsKKyAgICAgICAgJmpwYV9vdmVydmlld19wYy54bWw7CisgICAgICAgICZqcGFfb3ZlcnZpZXdfbWV0YS54bWw7CisgICAgICAgICZqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UueG1sOworICAgICAgICAmanBhX292ZXJ2aWV3X2VtZmFjdG9yeS54bWw7CisgICAgICAgICZqcGFfb3ZlcnZpZXdfZW0ueG1sOworICAgICAgICAmanBhX292ZXJ2aWV3X3RyYW5zLnhtbDsKKyAgICAgICAgJmpwYV9vdmVydmlld19xdWVyeS54bWw7CisgICAgICAgICZqcGFfb3ZlcnZpZXdfc3FscXVlcnkueG1sOworICAgICAgICAmanBhX292ZXJ2aWV3X21hcHBpbmcueG1sOworICAgICAgICAmanBhX292ZXJ2aWV3X2NvbmNsdXNpb24ueG1sOworICAgIDwvcGFydD4KKworICAgIDwhLS0KKyAgICAjIyMgVFVUT1JJQUwKKyAgICA8cGFydCBpZD0idHV0b3JpYWxzIj4KKyAgICAgICAgPHRpdGxlPlR1dG9yaWFsczwvdGl0bGU+CisgICAgICAgICZqcGFfdHV0b3JpYWxzLnhtbDsKKyAgICA8L3BhcnQ+CisgICAgLS0+CisKKyAgICA8cGFydCBpZD0icmVmX2d1aWRlIj4KKyAgICAgICAgPHRpdGxlPlJlZmVyZW5jZSBHdWlkZTwvdGl0bGU+CisgICAgICAgICZyZWZfZ3VpZGVfaW50cm8ueG1sOworICAgICAgICAmcmVmX2d1aWRlX2NvbmYueG1sOworICAgICAgICAmcmVmX2d1aWRlX2xvZ2dpbmcueG1sOworICAgICAgICAmcmVmX2d1aWRlX2Ric2V0dXAueG1sOworICAgICAgICAmcmVmX2d1aWRlX3BjLnhtbDsKKyAgICAgICAgJnJlZl9ndWlkZV9tZXRhLnhtbDsKKyAgICAgICAgJnJlZl9ndWlkZV9tYXBwaW5nLnhtbDsKKyAgICAgICAgJnJlZl9ndWlkZV9kZXBsb3kueG1sOworICAgICAgICAmcmVmX2d1aWRlX3J1bnRpbWUueG1sOworICAgICAgICAmcmVmX2d1aWRlX2NhY2hpbmcueG1sOworICAgICAgICAmcmVmX2d1aWRlX3JlbW90ZS54bWw7CisgICAgICAgICZyZWZfZ3VpZGVfaW50ZWdyYXRpb24ueG1sOworICAgICAgICAmcmVmX2d1aWRlX29wdGltaXphdGlvbi54bWw7CisgICAgPC9wYXJ0PgorCisgICAgPCEtLQorICAgIDxwYXJ0IGlkPSJzYW1wbGVzX2d1aWRlX3BhcnQiPgorICAgICAgICA8dGl0bGU+U2FtcGxlczwvdGl0bGU+CisgICAgICAgICZzYW1wbGVzX2d1aWRlLnhtbDsKKyAgICA8L3BhcnQ+CisgICAgLS0+CisKKyAgICAmanBhX3Jlc291cmNlcy54bWw7CisgICAgJnN1cHBvcnRlZF9kYXRhYmFzZXMueG1sOworPC9ib29rPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvb3BlbmpwYV9pbnRyby54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9vcGVuanBhX2ludHJvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI0MjVlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvb3BlbmpwYV9pbnRyby54bWwKQEAgLTAsMCArMSw4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0ib3BlbmpwYV9pbnRybyI+CisgICAgPHRpdGxlPgorICAgICAgICBPcGVuSlBBIAorICAgIDwvdGl0bGU+CisgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhX2ludHJvIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBPcGVuSlBBIAorICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHBhcmE+CitPcGVuSlBBIGlzIEFwYWNoZSdzIGltcGxlbWVudGF0aW9uIG9mIFN1bidzIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpCitzcGVjaWZpY2F0aW9uIGZvciB0aGUgdHJhbnNwYXJlbnQgcGVyc2lzdGVuY2Ugb2YgSmF2YSBvYmplY3RzLiBUaGlzCitkb2N1bWVudCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgSlBBIHN0YW5kYXJkIGFuZCB0ZWNobmljYWwKK2RldGFpbHMgb24gdGhlIHVzZSBvZiBPcGVuSlBBLgorICAgIDwvcGFyYT4KKzwhLS0gCisjIyMgVFVUT1JJQUwKKyAgICA8cGFyYT4KK1RvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgd2l0aCBPcGVuSlBBLCB5b3UgbWF5IHdhbnQgdG8gYmVnaW4gYXQKKzx4cmVmIGxpbmtlbmQ9ImpwYV90dXRvcmlhbCIvPi4gSWYgeW91IHdvdWxkIHByZWZlciB0byBzdGFydCB3aXRoIGFuCitpbnRyb2R1Y3Rpb24gdG8gdGhlIEpQQSBzcGVjaWZpY2F0aW9uLCBiZWdpbiB3aXRoCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfaW50cm8iLz4uCisgICAgPC9wYXJhPgorLS0+CisgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGFfaW50cm9fYWJvdXQiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBBYm91dCBUaGlzIERvY3VtZW50CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCBmb3IgT3BlbkpQQSB1c2Vycy4gSXQgaXMgZGl2aWRlZCBpbnRvIHNldmVyYWwgcGFydHM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfaW50cm8iPkpQQSBPdmVydmlldzwvbGluaz4gZGVzY3JpYmVzIHRoZQorZnVuZGFtZW50YWxzIG9mIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorPCEtLSAKKyMjIyBUVVRPUklBTAorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSW4gdGhlIDxsaW5rIGxpbmtlbmQ9InR1dG9yaWFscyI+T3BlbkpQQSBUdXRvcmlhbHM8L2xpbms+IHlvdSB3aWxsIGRldmVsb3AgCitzaW1wbGUgcGVyc2lzdGVudCBhcHBsaWNhdGlvbnMgdXNpbmcgT3BlbkpQQS4gVGhyb3VnaCB0aGUKK3R1dG9yaWFscycgaGFuZHMtb24gYXBwcm9hY2gsIHlvdSB3aWxsIGJlY29tZSBjb21mb3J0YWJsZSB3aXRoIHRoZSBjb3JlIHRvb2xzCithbmQgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzIHVuZGVyIE9wZW5KUEEuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKy0tPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9pbnRybyI+T3BlbkpQQSBSZWZlcmVuY2UgR3VpZGU8L2xpbms+IGNvbnRhaW5zIAorZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvbiBhbGwgYXNwZWN0cyBvZiBPcGVuSlBBLiAgQnJvd3NlIHRocm91Z2ggdGhpcyBndWlkZSAKK3RvIGZhbWlsaWFyaXplIHlvdXJzZWxmIHdpdGggdGhlIG1hbnkgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIGN1c3RvbWl6YXRpb24gCitvcHBvcnR1bml0aWVzIE9wZW5KUEEgcHJvdmlkZXMuIExhdGVyLCB5b3UgY2FuIHVzZSB0aGUgZ3VpZGUgd2hlbiB5b3UgbmVlZCAKK2RldGFpbHMgb24gYSBzcGVjaWZpYyBhc3BlY3Qgb2YgT3BlbkpQQS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfY2FjaGluZy54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfY2FjaGluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4OGMyNwotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9jYWNoaW5nLnhtbApAQCAtMCwwICsxLDg4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0icmVmX2d1aWRlX2NhY2hpbmciPgorICAgIDx0aXRsZT4KKyAgICAgICAgQ2FjaGluZworICAgIDwvdGl0bGU+CisgICAgPHBhcmE+CitPcGVuSlBBIHV0aWxpemVzIHNldmVyYWwgY29uZmlndXJhYmxlIGNhY2hlcyB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZS4gVGhpcworY2hhcHRlciBleHBsb3JlcyBPcGVuSlBBJ3MgZGF0YSBjYWNoZSwgcXVlcnkgY2FjaGUsIGFuZCBxdWVyeSBjb21waWxhdGlvbiBjYWNoZS4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jYWNoZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIERhdGEgQ2FjaGUKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfY2FjaGUiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBkYXRhIGNhY2hlCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEgZGF0YSBjYWNoZSBpcyBhbiBvcHRpb25hbCBjYWNoZSBvZiBwZXJzaXN0ZW50IG9iamVjdCBkYXRhIHRoYXQKK29wZXJhdGVzIGF0IHRoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGxldmVsLiBUaGlzIGNhY2hlIGlzCitkZXNpZ25lZCB0byBzaWduaWZpY2FudGx5IGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoaWxlIHJlbWFpbmluZyBpbiBmdWxsCitjb21wbGlhbmNlIHdpdGggdGhlIEpQQSBzdGFuZGFyZC4gVGhpcyBtZWFucyB0aGF0IHR1cm5pbmcgb24gdGhlIGNhY2hpbmcgb3B0aW9uCitjYW4gdHJhbnNwYXJlbnRseSBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgeW91ciBhcHBsaWNhdGlvbiwgd2l0aCBubyBjaGFuZ2VzCit0byB5b3VyIGNvZGUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBJ3MgZGF0YSBjYWNoZSBpcyBub3QgcmVsYXRlZCB0byB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+CitjYWNoZSBkaWN0YXRlZCBieSB0aGUgSlBBIHNwZWNpZmljYXRpb24uIFRoZSBKUEEgc3BlY2lmaWNhdGlvbiBtYW5kYXRlcyBiZWhhdmlvcgorZm9yIHRoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gY2FjaGUgYWltZWQgYXQgZ3VhcmFudGVlaW5nCit0cmFuc2FjdGlvbiBpc29sYXRpb24gd2hlbiBvcGVyYXRpbmcgb24gcGVyc2lzdGVudCBvYmplY3RzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSdzIGRhdGEgY2FjaGUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbmNyZWFzZXMKK292ZXIgY2FjaGVsZXNzIG9wZXJhdGlvbiwgd2hpbGUgZ3VhcmFudGVlaW5nIHRoYXQgYmVoYXZpb3Igd2lsbCBiZSBpZGVudGljYWwgaW4KK2JvdGggY2FjaGUtZW5hYmxlZCBhbmQgY2FjaGVsZXNzIG9wZXJhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RoZXJlIGFyZSBmaXZlIHdheXMgdG8gYWNjZXNzIGRhdGEgdmlhIHRoZSBPcGVuSlBBIEFQSXM6IHN0YW5kYXJkIHJlbGF0aW9uCit0cmF2ZXJzYWwsIGxhcmdlIHJlc3VsdCBzZXQgcmVsYXRpb24gdHJhdmVyc2FsLCBxdWVyaWVzLCBsb29raW5nIHVwIGFuIG9iamVjdCBieQoraWQsIGFuZCBpdGVyYXRpb24gb3ZlciBhbiA8Y2xhc3NuYW1lPkV4dGVudDwvY2xhc3NuYW1lPi4gT3BlbkpQQSdzIGNhY2hlIHBsdWdpbgorYWNjZWxlcmF0ZXMgdGhyZWUgb2YgdGhlc2UgbWVjaGFuaXNtcy4gSXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgY2FjaGluZyBvZiBsYXJnZQorcmVzdWx0IHNldCByZWxhdGlvbnMgb3IgPGNsYXNzbmFtZT5FeHRlbnQ8L2NsYXNzbmFtZT4gaXRlcmF0b3JzLiBJZiB5b3UgZmluZAoreW91cnNlbGYgaW4gbmVlZCBvZiBoaWdoZXItcGVyZm9ybWFuY2UgPGNsYXNzbmFtZT5FeHRlbnQ8L2NsYXNzbmFtZT4gaXRlcmF0aW9uLAorc2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jYWNoZV9saW1pdHNfZXh0ZW50Ii8+LiAKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRGF0YSBhY2Nlc3MgbWV0aG9kcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiIGNvbHNlcD0iMSIgcm93c2VwPSIxIj4KKyAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJhY2Nlc3MtbWV0aG9kIi8+PGNvbHNwZWMgY29sbmFtZT0iY2FjaGVhYmxlIi8+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImFjY2Vzcy1tZXRob2QiPkFjY2VzcyBtZXRob2Q8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNhY2hlYWJsZSI+VXNlcyBjYWNoZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImFjY2Vzcy1tZXRob2QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkIHJlbGF0aW9uIHRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjYWNoZWFibGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iYWNjZXNzLW1ldGhvZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFyZ2UgcmVzdWx0IHNldCByZWxhdGlvbiB0cmF2ZXJzYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY2FjaGVhYmxlIj5ObzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImFjY2Vzcy1tZXRob2QiPlF1ZXJ5PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjYWNoZWFibGUiPlllczwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImFjY2Vzcy1tZXRob2QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cHMgYnkgb2JqZWN0IGlkCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNhY2hlYWJsZSI+WWVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iYWNjZXNzLW1ldGhvZCI+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdGlvbiBvdmVyIGFuIDxjbGFzc25hbWU+RXh0ZW50PC9jbGFzc25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNhY2hlYWJsZSI+Tm88L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDxwYXJhPgorV2hlbiBlbmFibGVkLCB0aGUgY2FjaGUgaXMgY2hlY2tlZCBiZWZvcmUgbWFraW5nIGEgdHJpcCB0byB0aGUgZGF0YXN0b3JlLiBEYXRhCitpcyBzdG9yZWQgaW4gdGhlIGNhY2hlIHdoZW4gb2JqZWN0cyBhcmUgY29tbWl0dGVkIGFuZCB3aGVuIHBlcnNpc3RlbnQgb2JqZWN0cworYXJlIGxvYWRlZCBmcm9tIHRoZSBkYXRhc3RvcmUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBJ3MgZGF0YSBjYWNoZSBjYW4gaW4gYm90aCBzaW5nbGUtSlZNIGFuZCBtdWx0aS1KVk0gZW52aXJvbm1lbnRzLgorTXVsdGktSlZNIGNhY2hpbmcgaXMgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBkaXN0cmlidXRlZCBldmVudAorbm90aWZpY2F0aW9uIGZyYW1ld29yayBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2V2ZW50Ii8+LCBvcgordGhyb3VnaCBjdXN0b20gaW50ZWdyYXRpb25zIHdpdGggYSB0aGlyZC1wYXJ0eSBkaXN0cmlidXRlZCBjYWNoZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RoZSBzaW5nbGUgSlZNIG1vZGUgb2Ygb3BlcmF0aW9uIG1haW50YWlucyBhbmQgc2hhcmVzIGEgZGF0YSBjYWNoZSBhY3Jvc3MgYWxsCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaW5zdGFuY2VzIG9idGFpbmVkIGZyb20gYSBwYXJ0aWN1bGFyCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+LiBUaGlzIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIGluCithIGRpc3RyaWJ1dGVkIGVudmlyb25tZW50LCBhcyBjYWNoZXMgaW4gZGlmZmVyZW50IEpWTXMgb3IgY3JlYXRlZCBmcm9tIGRpZmZlcmVudAorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY2xhc3NuYW1lPiBvYmplY3RzIHdpbGwgbm90IGJlIHN5bmNocm9uaXplZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2NhY2hlX2NvbmYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERhdGEgQ2FjaGUgQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gZW5hYmxlIHRoZSBiYXNpYyBzaW5nbGUtZmFjdG9yeSBjYWNoZSBzZXQgdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkRhdGFDYWNoZSI+PGxpdGVyYWw+b3BlbmpwYS5EYXRhQ2FjaGU8L2xpdGVyYWw+PC9saW5rPgorcHJvcGVydHkgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4sIGFuZCBzZXQgdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLlJlbW90ZUNvbW1pdFByb3ZpZGVyIj48bGl0ZXJhbD4KK29wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXI8L2xpdGVyYWw+PC9saW5rPiBwcm9wZXJ0eSB0byA8bGl0ZXJhbD5zanZtCis8L2xpdGVyYWw+OgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9jYWNoZV9jb25mX3Nqdm0iPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlLUpWTSBEYXRhIENhY2hlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkRhdGFDYWNoZSIgdmFsdWU9InRydWUiLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLlJlbW90ZUNvbW1pdFByb3ZpZGVyIiB2YWx1ZT0ic2p2bSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gY29uZmlndXJlIHRoZSBkYXRhIGNhY2hlIHRvIHJlbWFpbiB1cC10by1kYXRlIGluIGEgZGlzdHJpYnV0ZWQgZW52aXJvbm1lbnQsCitzZXQgdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIiPjxsaXRlcmFsPgorb3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlcjwvbGl0ZXJhbD48L2xpbms+IHByb3BlcnR5IGFwcHJvcHJpYXRlbHksIG9yCitpbnRlZ3JhdGUgT3BlbkpQQSB3aXRoIGEgdGhpcmQtcGFydHkgY2FjaGluZyBzb2x1dGlvbi4gUmVtb3RlIGNvbW1pdCBwcm92aWRlcnMKK2FyZSBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2V2ZW50Ii8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHNpemUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorT3BlbkpQQSdzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIGEgbWFwIG9mIG9iamVjdAoraWRzIHRvIGNhY2hlIGRhdGEuIEJ5IGRlZmF1bHQsIDEwMDAgZWxlbWVudHMgYXJlIGtlcHQgaW4gY2FjaGUuIFdoZW4gdGhlIGNhY2hlCitvdmVyZmxvd3MsIHJhbmRvbSBlbnRyaWVzIGFyZSBldmljdGVkLiAgVGhlIG1heGltdW0gY2FjaGUgc2l6ZSBjYW4gYmUKK2FkanVzdGVkIGJ5IHNldHRpbmcgdGhlIDxsaXRlcmFsPkNhY2hlU2l6ZTwvbGl0ZXJhbD4gcHJvcGVydHkgaW4geW91ciBwbHVnaW4KK3N0cmluZyAtIHNlZSBiZWxvdyBmb3IgYW4gZXhhbXBsZS4gT2JqZWN0cyB0aGF0IGFyZSBwaW5uZWQgaW50byB0aGUgY2FjaGUgYXJlCitub3QgY291bnRlZCB3aGVuIGRldGVybWluaW5nIGlmIHRoZSBjYWNoZSBzaXplIGV4Y2VlZHMgaXRzIG1heGltdW0gc2l6ZS4gIAorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitFeHBpcmVkIG9iamVjdHMgYXJlIG1vdmVkIHRvIGEgc29mdCByZWZlcmVuY2UgbWFwLCBzbyB0aGV5IG1heSBzdGljayBhcm91bmQgZm9yCithIGxpdHRsZSB3aGlsZSBsb25nZXIuIFlvdSBjYW4gY29udHJvbCB0aGUgbnVtYmVyIG9mIHNvZnQgcmVmZXJlbmNlcyBPcGVuSlBBCitrZWVwcyB3aXRoIHRoZSA8bGl0ZXJhbD5Tb2Z0UmVmZXJlbmNlU2l6ZTwvbGl0ZXJhbD4gcHJvcGVydHkuIFNvZnQgcmVmZXJlbmNlcworYXJlIHVubGltaXRlZCBieSBkZWZhdWx0LiBTZXQgdG8gMCB0byBkaXNhYmxlIHNvZnQgcmVmZXJlbmNlcyBjb21wbGV0ZWx5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9jYWNoZV9jb25mX3NpemUiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRGF0YSBDYWNoZSBTaXplCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkRhdGFDYWNoZSIgdmFsdWU9InRydWUoQ2FjaGVTaXplPTUwMDAsIFNvZnRSZWZlcmVuY2VTaXplPTApIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorWW91IGNhbiBzcGVjaWZ5IGEgY2FjaGUgdGltZW91dCB2YWx1ZSBmb3IgYSBjbGFzcyBieSBzZXR0aW5nIHRoZSB0aW1lb3V0Cis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfbWV0YV9leHQiPm1ldGFkYXRhIGV4dGVuc2lvbjwvbGluaz4gdG8gdGhlIGFtb3VudCBvZgordGltZSBpbiBtaWxsaXNlY29uZHMgYSBjbGFzcydzIGRhdGEgaXMgdmFsaWQuIFVzZSBhIHZhbHVlIG9mIC0xIGZvciBubworZXhwaXJhdGlvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJleF90aW1lb3V0X2NhY2hlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERhdGEgQ2FjaGUgVGltZW91dAorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaW1lb3V0IDxjbGFzc25hbWU+RW1wbG95ZWU8L2NsYXNzbmFtZT4gb2JqZWN0cyBhZnRlciAxMCBzZWNvbmRzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0BFbnRpdHkKK0BEYXRhQ2FjaGUodGltZW91dD0xMDAwMCkKK3B1YmxpYyBjbGFzcyBFbXBsb3llZSB7CisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitTZWUgdGhlIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFDYWNoZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkRhdGFDYWNoZTwvY2xhc3NuYW1lPjwvdWxpbms+IEphdmFkb2MKK2ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSA8Y2xhc3NuYW1lPkRhdGFDYWNoZTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGNyb24tc3R5bGUgaW52YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK0EgY2FjaGUgY2FuIHNwZWNpZnkgdGhhdCBpdCBzaG91bGQgYmUgY2xlYXJlZCBhdCBjZXJ0YWluIHRpbWVzIHJhdGhlciB0aGFuIHVzaW5nCitkYXRhIHRpbWVvdXRzLiBUaGUgPGxpdGVyYWw+RXZpY3Rpb25TY2hlZHVsZTwvbGl0ZXJhbD4gcHJvcGVydHkgb2YgT3BlbkpQQSdzCitjYWNoZSBpbXBsZW1lbnRhdGlvbiBhY2NlcHRzIGEgPGxpdGVyYWw+Y3JvbjwvbGl0ZXJhbD4gc3R5bGUgZXZpY3Rpb24gc2NoZWR1bGUuCitUaGUgZm9ybWF0IG9mIHRoaXMgcHJvcGVydHkgaXMgYSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZpdmUgdG9rZW5zLCB3aGVyZQordGhlIDxsaXRlcmFsPio8L2xpdGVyYWw+IHN5bWJvbCAoYXN0ZXJpc2spLCBpbmRpY2F0ZXMgbWF0Y2ggYWxsLiBUaGUgdG9rZW5zIGFyZSwKK2luIG9yZGVyOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorTWludXRlCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitIb3VyIG9mIERheQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRGF5IG9mIE1vbnRoCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNb250aAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRGF5IG9mIFdlZWsKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgPGxpdGVyYWw+b3BlbmpwYS5EYXRhQ2FjaGU8L2xpdGVyYWw+IHNldHRpbmcKK3NjaGVkdWxlcyB0aGUgZGVmYXVsdCBjYWNoZSB0byBldmljdCB2YWx1ZXMgZnJvbSB0aGUgY2FjaGUgYXQgMTUgYW5kIDQ1IG1pbnV0ZXMKK3Bhc3QgMyBQTSBvbiBTdW5kYXkuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0cnVlKEV2aWN0aW9uU2NoZWR1bGU9JzE1LDQ1IDE1ICogKiAxJykKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jYWNoZV91c2UiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERhdGEgQ2FjaGUgVXNhZ2UKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5vcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlPC9saXRlcmFsPiBwYWNrYWdlIGRlZmluZXMgT3BlbkpQQSdzCitkYXRhIGNhY2hpbmcgZnJhbWV3b3JrLiBXaGlsZSB5b3UgbWF5IHVzZSB0aGlzIGZyYW1ld29yayBkaXJlY3RseSAoc2VlIGl0cworPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KK0phdmFkb2M8L3VsaW5rPiBmb3IgZGV0YWlscyksIGl0cyBBUElzIGFyZSBtZWFudCBwcmltYXJpbHkgZm9yIHNlcnZpY2UKK3Byb3ZpZGVycy4gSW4gZmFjdCwgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NhY2hlX2V4dGVuc2lvbiIvPiBiZWxvdyBoYXMKK3RpcHMgb24gaG93IHRvIHVzZSB0aGlzIHBhY2thZ2UgdG8gZXh0ZW5kIE9wZW5KUEEncyBjYWNoaW5nIHNlcnZpY2UgeW91cnNlbGYuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1JhdGhlciB0aGFuIHVzZSB0aGUgbG93LWxldmVsIDxsaXRlcmFsPm9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGU8L2xpdGVyYWw+CitwYWNrYWdlIEFQSXMsIEpQQSB1c2VycyBzaG91bGQgdHlwaWNhbGx5IGFjY2VzcyB0aGUgZGF0YSBjYWNoZSB0aHJvdWdoIE9wZW5KUEEncworaGlnaC1sZXZlbCAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1N0b3JlQ2FjaGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5TdG9yZUNhY2hlPC9jbGFzc25hbWU+PC91bGluaz4gZmFjYWRlLgorVGhpcyBmYWNhZGUgaGFzIG1ldGhvZHMgdG8gcGluIGFuZCB1bnBpbiByZWNvcmRzLCBldmljdCBkYXRhIGZyb20gdGhlIGNhY2hlLCBhbmQKK21vcmUuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgU3RvcmVDYWNoZSBnZXRTdG9yZUNhY2hlKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitZb3Ugb2J0YWluIHRoZSA8Y2xhc3NuYW1lPlN0b3JlQ2FjaGU8L2NsYXNzbmFtZT4gdGhyb3VnaCB0aGUgPG1ldGhvZG5hbWU+CitPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkuZ2V0U3RvcmVDYWNoZTwvbWV0aG9kbmFtZT4gbWV0aG9kLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9jYWNoZV9hY2Nlc3NfanBhIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2luZyB0aGUgU3RvcmVDYWNoZQorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy4uLgorCitPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnkgb2VtZiA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtZik7CitTdG9yZUNhY2hlIGNhY2hlID0gb2VtZi5nZXRTdG9yZUNhY2hlKCk7CisuLi4KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgdm9pZCBldmljdChDbGFzcyBjbHMsIE9iamVjdCBvaWQpOworcHVibGljIHZvaWQgZXZpY3RBbGwoKTsKK3B1YmxpYyB2b2lkIGV2aWN0QWxsKENsYXNzIGNscywgT2JqZWN0Li4uIG9pZHMpOworcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIG9pZHMpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxtZXRob2RuYW1lPmV2aWN0PC9tZXRob2RuYW1lPiBtZXRob2RzIHRlbGwgdGhlIGNhY2hlIHRvIHJlbGVhc2UgZGF0YS4gRWFjaAorbWV0aG9kIHRha2VzIGFuIGVudGl0eSBjbGFzcyBhbmQgb25lIG9yIG1vcmUgaWRlbnRpdHkgdmFsdWVzLCBhbmQgcmVsZWFzZXMgdGhlCitjYWNoZWQgZGF0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGVyc2lzdGVudCBpbnN0YW5jZXMuIFRoZSA8bWV0aG9kbmFtZT4KK2V2aWN0QWxsPC9tZXRob2RuYW1lPiBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMgY2xlYXJzIHRoZSBjYWNoZS4gRXZpY3Rpb24gaXMKK3VzZWZ1bCB3aGVuIHRoZSBkYXRhc3RvcmUgaXMgY2hhbmdlZCBieSBhIHNlcGFyYXRlIHByb2Nlc3Mgb3V0c2lkZSBPcGVuSlBBJ3MKK2NvbnRyb2wuIEluIHRoaXMgc2NlbmFyaW8sIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byBtYW51YWxseSBldmljdCB0aGUgZGF0YSBmcm9tCit0aGUgZGF0YXN0b3JlIGNhY2hlOyBvdGhlcndpc2UgdGhlIE9wZW5KUEEgcnVudGltZSwgb2JsaXZpb3VzIHRvIHRoZSBjaGFuZ2VzLAord2lsbCBtYWludGFpbiBpdHMgc3RhbGUgY29weS4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyB2b2lkIHBpbihDbGFzcyBjbHMsIE9iamVjdCBvaWQpOworcHVibGljIHZvaWQgcGluQWxsKENsYXNzIGNscywgT2JqZWN0Li4uIG9pZHMpOworcHVibGljIHZvaWQgcGluQWxsKENsYXNzIGNscywgQ29sbGVjdGlvbiBvaWRzKTsKK3B1YmxpYyB2b2lkIHVucGluKENsYXNzIGNscywgT2JqZWN0IG9pZCk7CitwdWJsaWMgdm9pZCB1bnBpbkFsbChDbGFzcyBjbHMsIE9iamVjdC4uLiBvaWRzKTsKK3B1YmxpYyB2b2lkIHVucGluQWxsKENsYXNzIGNscywgQ29sbGVjdGlvbiBvaWRzKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK01vc3QgY2FjaGVzIGFyZSBvZiBsaW1pdGVkIHNpemUuIFBpbm5pbmcgYW4gaWRlbnRpdHkgdG8gdGhlIGNhY2hlIGVuc3VyZXMgdGhhdAordGhlIGNhY2hlIHdpbGwgbWlsbCBub3Qga2ljayB0aGUgZGF0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2Ugb3V0IG9mIHRoZQorY2FjaGUsIHVubGVzcyB5b3UgbWFudWFsbHkgZXZpY3QgaXQuIE5vdGUgdGhhdCBldmVuIGFmdGVyIG1hbnVhbCBldmljdGlvbiwgdGhlCitkYXRhIHdpbGwgZ2V0IHBpbm5lZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGl0IGlzIGZldGNoZWQgZnJvbSB0aGUgc3RvcmUuIFlvdSBjYW4KK29ubHkgcmVtb3ZlIGEgcGluIGFuZCBtYWtlIHRoZSBkYXRhIG9uY2UgYWdhaW4gYXZhaWxhYmxlIGZvciBub3JtYWwgY2FjaGUKK292ZXJmbG93IGV2aWN0aW9uIHRocm91Z2ggdGhlIDxtZXRob2RuYW1lPnVucGluPC9tZXRob2RuYW1lPiBtZXRob2RzLiBVc2UKK3Bpbm5pbmcgd2hlbiB5b3Ugd2FudCBhIGd1YXJhbnRlZSB0aGF0IGEgY2VydGFpbiBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYXZhaWxhYmxlCitmcm9tIGNhY2hlLCByYXRoZXIgdGhhbiByZXF1aXJpbmcgYSBkYXRhc3RvcmUgdHJpcC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfY2FjaGVfdXNlX2pwYSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBTdG9yZUNhY2hlIFVzYWdlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK09wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBvZW1mID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW1mKTsKK1N0b3JlQ2FjaGUgY2FjaGUgPSBvZW1mLmdldFN0b3JlQ2FjaGUoKTsKK2NhY2hlLnBpbihNYWdhemluZS5jbGFzcywgcG9wdWxhck1hZy5nZXRJZCgpKTsKK2NhY2hlLmV2aWN0KE1hZ2F6aW5lLmNsYXNzLCBjaGFuZ2VkTWFnLmdldElkKCkpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorU2VlIHRoZSA8Y2xhc3NuYW1lPlN0b3JlQ2FjaGU8L2NsYXNzbmFtZT4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1N0b3JlQ2FjaGUuaHRtbCI+CitKYXZhZG9jPC91bGluaz4gZm9yIGluZm9ybWF0aW9uIG9uIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlcy4gQWxzbywKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9ydW50aW1lIi8+IGRpc2N1c3NlcyBPcGVuSlBBJ3Mgb3RoZXIgZXh0ZW5zaW9ucwordG8gdGhlIHN0YW5kYXJkIHNldCBvZiBKUEEgcnVudGltZSBpbnRlcmZhY2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZXhhbXBsZXMgYWJvdmUgaW5jbHVkZSBjYWxscyB0byA8bWV0aG9kbmFtZT5ldmljdDwvbWV0aG9kbmFtZT4gdG8gbWFudWFsbHkKK3JlbW92ZSBkYXRhIGZyb20gdGhlIGRhdGEgY2FjaGUuIFJhdGhlciB0aGFuIGV2aWN0aW5nIG9iamVjdHMgZnJvbSB0aGUgZGF0YQorY2FjaGUgZGlyZWN0bHksIHlvdSBjYW4gYWxzbyBjb25maWd1cmUgT3BlbkpQQSB0byBhdXRvbWF0aWNhbGx5IGV2aWN0IG9iamVjdHMKK2Zyb20gdGhlIGRhdGEgY2FjaGUgd2hlbiB5b3UgdXNlIHRoZSA8Y2xhc3NuYW1lPgorT3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4ncyBldmljdGlvbiBBUElzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9jYWNoZV9wbWV2aWN0Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEF1dG9tYXRpYyBEYXRhIENhY2hlIEV2aWN0aW9uCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkJyb2tlckltcGwiIHZhbHVlPSJFdmljdEZyb21EYXRhQ2FjaGU9dHJ1ZSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK09wZW5KUEFFbnRpdHlNYW5hZ2VyIG9lbSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKTsKK29lbS5ldmljdChjaGFuZ2VkTWFnKTsgIC8vIHdpbGwgZXZpY3QgZnJvbSBkYXRhIGNhY2hlIGFsc28KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jYWNoZV9xdWVyeSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgUXVlcnkgQ2FjaGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9jYWNoZV9xdWVyeSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGNhY2hpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgcXVlcnkgY2FjaGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfY2FjaGVfcXVlcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBRdWVyeQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgY2FjaGluZworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0luIGFkZGl0aW9uIHRvIHRoZSBkYXRhIGNhY2hlLCB0aGUgPGxpdGVyYWw+b3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZQorPC9saXRlcmFsPiBwYWNrYWdlIGRlZmluZXMgc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2VzIGZvciBhIHF1ZXJ5IGNhY2hlLiBUaGUKK3F1ZXJ5IGNhY2hlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCB3aGVuIHRoZSBkYXRhIGNhY2hlIGlzIGVuYWJsZWQuIFRoZSBxdWVyeQorY2FjaGUgc3RvcmVzIHRoZSBvYmplY3QgaWRzIHJldHVybmVkIGJ5IHF1ZXJ5IGV4ZWN1dGlvbnMuIFdoZW4geW91IHJ1biBhIHF1ZXJ5LAorT3BlbkpQQSBhc3NlbWJsZXMgYSBrZXkgYmFzZWQgb24gdGhlIHF1ZXJ5IHByb3BlcnRpZXMgYW5kIHRoZSBwYXJhbWV0ZXJzIHVzZWQgYXQKK2V4ZWN1dGlvbiB0aW1lLCBhbmQgY2hlY2tzIGZvciBhIGNhY2hlZCBxdWVyeSByZXN1bHQuIElmIG9uZSBpcyBmb3VuZCwgdGhlCitvYmplY3QgaWRzIGluIHRoZSBjYWNoZWQgcmVzdWx0IGFyZSBsb29rZWQgdXAsIGFuZCB0aGUgcmVzdWx0YW50CitwZXJzaXN0ZW5jZS1jYXBhYmxlIG9iamVjdHMgYXJlIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBxdWVyeSBpcyBleGVjdXRlZAorYWdhaW5zdCB0aGUgZGF0YWJhc2UsIGFuZCB0aGUgb2JqZWN0IGlkcyBsb2FkZWQgYnkgdGhlIHF1ZXJ5IGFyZSBwdXQgaW50byB0aGUKK2NhY2hlLiBUaGUgb2JqZWN0IGlkIGxpc3QgaXMgbm90IGNhY2hlZCB1bnRpbCB0aGUgbGlzdCByZXR1cm5lZCBhdCBxdWVyeQorZXhlY3V0aW9uIHRpbWUgaXMgZnVsbHkgdHJhdmVyc2VkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGV4cG9zZXMgYSBoaWdoLWxldmVsIGludGVyZmFjZSB0byB0aGUgcXVlcnkgY2FjaGUgdGhyb3VnaCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1F1ZXJ5UmVzdWx0Q2FjaGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5RdWVyeVJlc3VsdENhY2hlPC9jbGFzc25hbWU+PC91bGluaz4gCitjbGFzcy4gWW91IGNhbiBhY2Nlc3MgdGhpcyBjbGFzcyB0aHJvdWdoIHRoZSA8Y2xhc3NuYW1lPgorT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9jYWNoZV9xdWVyeWFjY2VzcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpbmcgdGhlIFF1ZXJ5UmVzdWx0Q2FjaGUKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCisuLi4KKworT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IG9lbWYgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbWYpOworUXVlcnlSZXN1bHRDYWNoZSBxY2FjaGUgPSBvZW1mLmdldFF1ZXJ5UmVzdWx0Q2FjaGUoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBkZWZhdWx0IHF1ZXJ5IGNhY2hlIGltcGxlbWVudGF0aW9uIGNhY2hlcyAxMDAgcXVlcnkgZXhlY3V0aW9ucyBpbiBhCitsZWFzdC1yZWNlbnRseS11c2VkIGNhY2hlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgdGhlIGNhY2hlIHNpemUgaW4gdGhlCis8bGl0ZXJhbD5DYWNoZVNpemU8L2xpdGVyYWw+IHBsdWdpbiBwcm9wZXJ0eS4gTGlrZSB0aGUgZGF0YSBjYWNoZSwgdGhlIHF1ZXJ5CitjYWNoZSBhbHNvIGhhcyBhIGJhY2tpbmcgc29mdCByZWZlcmVuY2UgbWFwLiBUaGUgPGxpdGVyYWw+U29mdFJlZmVyZW5jZVNpemUKKzwvbGl0ZXJhbD4gcHJvcGVydHkgY29udHJvbHMgdGhlIHNpemUgb2YgdGhpcyBtYXAuIEl0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2NhY2hlX2NhY2hlc2l6ZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBRdWVyeSBDYWNoZSBTaXplCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLlF1ZXJ5Q2FjaGUiIHZhbHVlPSJDYWNoZVNpemU9MTAwMCwgU29mdFJlZmVyZW5jZVNpemU9MTAwIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitUbyBkaXNhYmxlIHRoZSBxdWVyeSBjYWNoZSBjb21wbGV0ZWx5LCBzZXQgdGhlIDxsaXRlcmFsPm9wZW5qcGEuUXVlcnlDYWNoZQorPC9saXRlcmFsPiBwcm9wZXJ0eSB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD46CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2NhY2hlX2Rpc2FibGVxdWVyeSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBEaXNhYmxpbmcgdGhlIFF1ZXJ5IENhY2hlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLlF1ZXJ5Q2FjaGUiIHZhbHVlPSJmYWxzZSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlcmUgYXJlIGNlcnRhaW4gc2l0dWF0aW9ucyBpbiB3aGljaCB0aGUgcXVlcnkgY2FjaGUgaXMgYnlwYXNzZWQ6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitDYWNoaW5nIGlzIG5vdCB1c2VkIGZvciBpbi1tZW1vcnkgcXVlcmllcyAocXVlcmllcyBpbiB3aGljaCB0aGUgY2FuZGlkYXRlcyBhcmUgYQorY29sbGVjdGlvbiBpbnN0ZWFkIG9mIGEgY2xhc3Mgb3IgPGNsYXNzbmFtZT5FeHRlbnQ8L2NsYXNzbmFtZT4pLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQ2FjaGluZyBpcyBub3QgdXNlZCBpbiB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIDxsaXRlcmFsPklnbm9yZUNoYW5nZXM8L2xpdGVyYWw+CitzZXQgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+IGFuZCBpbiB3aGljaCBtb2RpZmljYXRpb25zIHRvIGNsYXNzZXMgaW4gdGhlCitxdWVyeSdzIGFjY2VzcyBwYXRoIGhhdmUgb2NjdXJyZWQuIElmIG5vbmUgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGFjY2VzcyBwYXRoCitoYXZlIGJlZW4gdG91Y2hlZCwgdGhlbiBjYWNoZWQgcmVzdWx0cyBhcmUgc3RpbGwgdmFsaWQgYW5kIGFyZSB1c2VkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorQ2FjaGluZyBpcyBub3QgdXNlZCBpbiBwZXNzaW1pc3RpYyB0cmFuc2FjdGlvbnMsIHNpbmNlIE9wZW5KUEEgbXVzdCBnbyB0byB0aGUKK2RhdGFiYXNlIHRvIGxvY2sgdGhlIGFwcHJvcHJpYXRlIHJvd3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitDYWNoaW5nIGlzIG5vdCB1c2VkIHdoZW4gdGhlIHRoZSBkYXRhIGNhY2hlIGRvZXMgbm90IGhhdmUgYW55IGNhY2hlZCBkYXRhIGZvciBhbgoraWQgaW4gYSBxdWVyeSByZXN1bHQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitRdWVyaWVzIHRoYXQgdXNlIHBlcnNpc3RlbmNlLWNhcGFibGUgb2JqZWN0cyBhcyBwYXJhbWV0ZXJzIGFyZSBvbmx5IGNhY2hlZCBpZgordGhlIHBhcmFtZXRlciBpcyBkaXJlY3RseSBjb21wYXJlZCB0byBmaWVsZCwgYXMgaW46CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3NlbGVjdCBlIGZyb20gRW1wbG95ZWUgZSB3aGVyZSBlLmNvbXBhbnkuYWRkcmVzcyA9IDphZGRyCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdSBleHRyYWN0IGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBwYXJhbWV0ZXIgaW4geW91ciBxdWVyeSBzdHJpbmcsIG9yIGlmIHRoZQorcGFyYW1ldGVyIGlzIHVzZWQgaW4gY29sbGVjdGlvbiBlbGVtZW50IGNvbXBhcmlzb25zLCB0aGUgcXVlcnkgaXMgbm90IGNhY2hlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1F1ZXJpZXMgdGhhdCByZXN1bHQgaW4gcHJvamVjdGlvbnMgb2YgY3VzdG9tIGZpZWxkIHR5cGVzIG9yIDxjbGFzc25hbWU+CitCaWdEZWNpbWFsPC9jbGFzc25hbWU+IG9yIDxjbGFzc25hbWU+QmlnSW50ZWdlcjwvY2xhc3NuYW1lPiBmaWVsZHMgYXJlIG5vdAorY2FjaGVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitDYWNoZSByZXN1bHRzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gaW5zdGFuY2VzIG9mIGNsYXNzZXMgaW4gYSBjYWNoZWQKK3F1ZXJ5J3MgYWNjZXNzIHBhdGggYXJlIHRvdWNoZWQuIFRoYXQgaXMsIGlmIGEgcXVlcnkgYWNjZXNzZXMgZGF0YSBpbiBjbGFzcworPGNsYXNzbmFtZT5BPC9jbGFzc25hbWU+LCBhbmQgaW5zdGFuY2VzIG9mIGNsYXNzIDxjbGFzc25hbWU+QTwvY2xhc3NuYW1lPiBhcmUKK21vZGlmaWVkLCBkZWxldGVkLCBvciBpbnNlcnRlZCwgdGhlbiB0aGUgY2FjaGVkIHF1ZXJ5IHJlc3VsdCBpcyBkcm9wcGVkIGZyb20gdGhlCitjYWNoZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSXQgaXMgcG9zc2libGUgdG8gdGVsbCB0aGUgcXVlcnkgY2FjaGUgdGhhdCBhIGNsYXNzIGhhcyBiZWVuIGFsdGVyZWQuIFRoaXMgaXMKK29ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIGNoYW5nZXMgb2NjdXIgdmlhIGRpcmVjdCBtb2RpZmljYXRpb24gb2YgdGhlIGRhdGFiYXNlCitvdXRzaWRlIG9mIE9wZW5KUEEncyBjb250cm9sLiBZb3UgY2FuIGFsc28gZXZpY3QgaW5kaXZpZHVhbCBxdWVyaWVzLCBvciBjbGVhcgordGhlIGVudGlyZSBjYWNoZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyB2b2lkIGV2aWN0KFF1ZXJ5IHEpOworcHVibGljIHZvaWQgZXZpY3RBbGwoQ2xhc3MgY2xzKTsKK3B1YmxpYyB2b2lkIGV2aWN0QWxsKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitGb3IgSlBBIHF1ZXJpZXMgd2l0aCBwYXJhbWV0ZXJzLCBzZXQgdGhlIGRlc2lyZWQgcGFyYW1ldGVyIHZhbHVlcyBpbnRvIHRoZQorPHVsaW5rIHVybD0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNS9kb2NzL2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeS5odG1sIj4KKzxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT48L3VsaW5rPiBpbnN0YW5jZSBiZWZvcmUgY2FsbGluZyB0aGUgYWJvdmUgbWV0aG9kcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfY2FjaGVfcXVlcnlfY2xhc3NjaGFuZ2UiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRXZpY3RpbmcgUXVlcmllcworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy4uLgorCitPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnkgb2VtZiA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtZik7CitRdWVyeVJlc3VsdENhY2hlIHFjYWNoZSA9IG9lbWYuZ2V0UXVlcnlSZXN1bHRDYWNoZSgpOworCisvLyBldmljdCBhbGwgcXVlcmllcyB0aGF0IGNhbiBiZSBhZmZlY3RlZCBieSBjaGFuZ2VzIHRvIE1hZ2F6aW5lcworcWNhY2hlLmV2aWN0QWxsKE1hZ2F6aW5lLmNsYXNzKTsKKworLy8gZXZpY3QgYW4gaW5kaXZpZHVhbCBxdWVyeSB3aXRoIHBhcmFtZXRlcnMKK0VudGl0eU1hbmFnZXIgZW0gPSBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpOworUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KC4uLikuCisgICAgc2V0UGFyYW1ldGVyKDAsIHBhcmFtVmFsMCkuCisgICAgc2V0UGFyYW1ldGVyKDEsIHBhcmFtVmFsMSk7CitxY2FjaGUuZXZpY3QgKHEpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiB1c2luZyBvbmUgb2YgT3BlbkpQQSdzIGRpc3RyaWJ1dGVkIGNhY2hlIGltcGxlbWVudGF0aW9ucywgaXQgaXMgbmVjZXNzYXJ5Cit0byBwZXJmb3JtIHRoaXMgaW4gZXZlcnkgSlZNIC0gdGhlIGNoYW5nZSBub3RpZmljYXRpb24gaXMgbm90IHByb3BhZ2F0ZWQKK2F1dG9tYXRpY2FsbHkuIFdoZW4gdXNpbmcgYSB0aGlyZC1wYXJ0eSBjb2hlcmVudCBjYWNoaW5nIHNvbHV0aW9uLAoraXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkbyB0aGlzIGluIGV2ZXJ5IEpWTSAoYWx0aG91Z2ggaXQgd29uJ3QgaHVydCB0byBkbyBzbyksCithcyB0aGUgY2FjaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBjb2hlcmVudCBjYWNoZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorUXVlcmllcyBjYW4gYWxzbyBiZSBwaW5uZWQgYW5kIHVucGlubmVkIHRocm91Z2ggdGhlIDxjbGFzc25hbWU+CitRdWVyeVJlc3VsdENhY2hlPC9jbGFzc25hbWU+LiBUaGUgc2VtYW50aWNzIG9mIHRoZXNlIG9wZXJhdGlvbnMgYXJlIHRoZSBzYW1lIAorYXMgcGlubmluZyBhbmQgdW5waW5uaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBjYWNoZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyB2b2lkIHBpbihRdWVyeSBxKTsKK3B1YmxpYyB2b2lkIHVucGluKFF1ZXJ5IHEpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorRm9yIEpQQSBxdWVyaWVzIHdpdGggcGFyYW1ldGVycywgc2V0IHRoZSBkZXNpcmVkIHBhcmFtZXRlciB2YWx1ZXMgaW50byB0aGUKKzx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YWVlLzUvZG9jcy9hcGkvamF2YXgvcGVyc2lzdGVuY2UvUXVlcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+PC91bGluaz4gaW5zdGFuY2UgYmVmb3JlIGNhbGxpbmcgdGhlIGFib3ZlIG1ldGhvZHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGVzZSBBUElzIGluIGFjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfY2FjaGVfcXVlcnlfcGluIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFBpbm5pbmcsIGFuZCBVbnBpbm5pbmcgUXVlcnkgUmVzdWx0cworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy4uLgorCitPcGVuSlBBRW50aXR5TWFuYWdlckZhY3Rvcnkgb2VtZiA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtZik7CitRdWVyeVJlc3VsdENhY2hlIHFjYWNoZSA9IG9lbWYuZ2V0UXVlcnlSZXN1bHRDYWNoZSgpOworRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCk7CisKK1F1ZXJ5IHBpblF1ZXJ5ID0gZW0uY3JlYXRlUXVlcnkoLi4uKS4KKyAgICBzZXRQYXJhbWV0ZXIoMCwgcGFyYW1WYWwwKS4KKyAgICBzZXRQYXJhbWV0ZXIoMSwgcGFyYW1WYWwxKTsKK3FjYWNoZS5waW4ocGluUXVlcnkpOworUXVlcnkgdW5waW5RdWVyeSA9IGVtLmNyZWF0ZVF1ZXJ5KC4uLikuCisgICAgc2V0UGFyYW1ldGVyKDAsIHBhcmFtVmFsMCkuCisgICAgc2V0UGFyYW1ldGVyKDEsIHBhcmFtVmFsMSk7CitxY2FjaGUudW5waW4odW5waW5RdWVyeSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitQaW5uaW5nIGRhdGEgaW50byB0aGUgY2FjaGUgaW5zdHJ1Y3RzIHRoZSBjYWNoZSB0byBub3QgZXhwaXJlIHRoZSBwaW5uZWQgcmVzdWx0cword2hlbiBjYWNoZSBmbHVzaGluZyBvY2N1cnMuIEhvd2V2ZXIsIHBpbm5lZCByZXN1bHRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorY2FjaGUgaWYgYW4gZXZlbnQgb2NjdXJzIHRoYXQgaW52YWxpZGF0ZXMgdGhlIHJlc3VsdHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gZGlzYWJsZSBjYWNoaW5nIG9uIGEgcGVyLTxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBvciAKK3Blci08Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IGJhc2lzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9jYWNoZV9xdWVyeV9kaXNhYmxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERpc2FibGluZyBhbmQgRW5hYmxpbmcgUXVlcnkgQ2FjaGluZworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy4uLgorCisvLyB0ZW1wb3JhcmlseSBkaXNhYmxlIHF1ZXJ5IGNhY2hpbmcgZm9yIGFsbCBxdWVyaWVzIGNyZWF0ZWQgZnJvbSBlbQorT3BlbkpQQUVudGl0eU1hbmFnZXIgb2VtID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pOworb2VtLmdldEZldGNoUGxhbiAoKS5zZXRRdWVyeVJlc3VsdENhY2hlKGZhbHNlKTsKKworLy8gcmUtZW5hYmxlIGNhY2hpbmcgZm9yIGEgcGFydGljdWxhciBxdWVyeQorT3BlbkpQQVF1ZXJ5IG9xID0gb2VtLmNyZWF0ZVF1ZXJ5KC4uLik7CitvcS5nZXRGZXRjaFBsYW4oKS5zZXRRdWVyeVJlc3VsdENhY2hlKHRydWUpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2NhY2hlX2V4dGVuc2lvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ2FjaGUgRXh0ZW5zaW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfY2FjaGVfZXh0ZW5zaW9uIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBkYXRhIGNhY2hlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24KKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9jYWNoZV9leHRlbnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IGNhY2hlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24KKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBwcm92aWRlZCBkYXRhIGNhY2hlIGNsYXNzZXMgY2FuIGJlIGVhc2lseSBleHRlbmRlZCB0byBhZGQgYWRkaXRpb25hbAorZnVuY3Rpb25hbGl0eS4gSWYgeW91IGFyZSBhZGRpbmcgbmV3IGJlaGF2aW9yLCB5b3Ugc2hvdWxkIGV4dGVuZCA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5EYXRhQ2FjaGVJbXBsPC9jbGFzc25hbWU+LiBUbyB1c2UgeW91ciBvd24gc3RvcmFnZQorbWVjaGFuaXNtLCBleHRlbmQgPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuZGF0YWNhY2hlLkFic3RyYWN0RGF0YUNhY2hlCis8L2NsYXNzbmFtZT4sIG9yIGltcGxlbWVudCA8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGF0YUNhY2hlCis8L2NsYXNzbmFtZT4gZGlyZWN0bHkuIElmIHlvdSB3YW50IHRvIGltcGxlbWVudCBhIGRpc3RyaWJ1dGVkIGNhY2hlIHRoYXQgdXNlcyBhbgordW5zdXBwb3J0ZWQgbWV0aG9kIGZvciBjb21tdW5pY2F0aW9ucywgY3JlYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIDxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuUmVtb3RlQ29tbWl0UHJvdmlkZXI8L2NsYXNzbmFtZT4uIFRoaXMgcHJvY2VzcyBpcworZGVzY3JpYmVkIGluIGdyZWF0ZXIgZGV0YWlsIGluIAorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2V2ZW50X2N1c3RvbWl6YXRpb24iLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBxdWVyeSBjYWNoZSBpcyBqdXN0IGFzIGVhc3kgdG8gZXh0ZW5kLiBBZGQgZnVuY3Rpb25hbGl0eSBieSBleHRlbmRpbmcgdGhlCitkZWZhdWx0IDxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5RdWVyeUNhY2hlSW1wbDwvY2xhc3NuYW1lPi4KK0ltcGxlbWVudCB5b3VyIG93biBzdG9yYWdlIG1lY2hhbmlzbSBmb3IgcXVlcnkgcmVzdWx0cyBieSBleHRlbmRpbmcgPGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuQWJzdHJhY3RRdWVyeUNhY2hlPC9jbGFzc25hbWU+IG9yIGltcGxlbWVudGluZyB0aGUKKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5RdWVyeUNhY2hlPC9jbGFzc25hbWU+IGludGVyZmFjZQorZGlyZWN0bHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jYWNoZV9ub3RlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSW1wb3J0YW50IE5vdGVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGRlZmF1bHQgY2FjaGUgaW1wbGVtZW50YXRpb25zIDxlbXBoYXNpcz5kbyBub3Q8L2VtcGhhc2lzPiBhdXRvbWF0aWNhbGx5CityZWZyZXNoIG9iamVjdHMgaW4gb3RoZXIgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyB3aGVuIHRoZSBjYWNoZQoraXMgdXBkYXRlZCBvciBpbnZhbGlkYXRlZC4gVGhpcyBiZWhhdmlvciB3b3VsZCBub3QgYmUgY29tcGxpYW50IHdpdGggdGhlIEpQQQorc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0ludm9raW5nIDxtZXRob2RuYW1lPk9wZW5KUEFFbnRpdHlNYW5hZ2VyLmV2aWN0PC9tZXRob2RuYW1lPjxlbXBoYXNpcz5kb2VzIG5vdAorPC9lbXBoYXNpcz4gcmVzdWx0IGluIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYmVpbmcgZHJvcHBlZCBmcm9tIHRoZSBkYXRhIGNhY2hlLAordW5sZXNzIHlvdSBoYXZlIHNldCB0aGUgcHJvcGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcyBleHBsYWluZWQgYWJvdmUgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NhY2hlX3BtZXZpY3QiLz4pLiBPdGhlciBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlCis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gY2FjaGUgYWxzbyBkbyBub3QgZWZmZWN0IHRoZSBkYXRhIGNhY2hlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGRhdGEgY2FjaGUgYXNzdW1lcyB0aGF0IGl0IGlzIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBkYXRhc3RvcmUsIHNvCitpdCBpcyBlZmZlY3RpdmVseSBhbiBpbi1tZW1vcnkgZXh0ZW5zaW9uIG9mIHRoZSBkYXRhYmFzZS4gVG8gbWFuaXB1bGF0ZSB0aGUgZGF0YQorY2FjaGUsIHlvdSBzaG91bGQgZ2VuZXJhbGx5IHVzZSB0aGUgZGF0YSBjYWNoZSBmYWNhZGVzIHByZXNlbnRlZCBpbiB0aGlzCitjaGFwdGVyLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IG11c3Qgc3BlY2lmeSBhIDxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlJlbW90ZUNvbW1pdFByb3ZpZGVyCis8L2NsYXNzbmFtZT4gKHZpYSB0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlciI+PGxpdGVyYWw+CitvcGVuanBhLlJlbW90ZUNvbW1pdFByb3ZpZGVyPC9saXRlcmFsPjwvbGluaz4gcHJvcGVydHkpIGluIG9yZGVyIHRvIHVzZSB0aGUgZGF0YQorY2FjaGUsIGV2ZW4gd2hlbiB1c2luZyB0aGUgY2FjaGUgaW4gYSBzaW5nbGUtSlZNIG1vZGUuIFdoZW4gdXNpbmcgaXQgaW4gYQorc2luZ2xlLUpWTSBjb250ZXh0LCBzZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD5zanZtPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0iZGF0YXN0b3JlX2NhY2hlX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9ucworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0iZGF0YXN0b3JlX2NhY2hlX2lzc3VlcyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGNhY2hpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgaXNzdWVzIGFuZCBsaW1pdGF0aW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIHVzaW5nIGRhdGFzdG9yZSAocGVzc2ltaXN0aWMpIHRyYW5zYWN0aW9ucyBpbiBjb25jZXJ0IHdpdGggdGhlIGRpc3RyaWJ1dGVkCitjYWNoaW5nIGltcGxlbWVudGF0aW9ucywgaXQgaXMgcG9zc2libGUgdG8gcmVhZCBzdGFsZSBkYXRhIHdoZW4gcmVhZGluZyBkYXRhCitvdXRzaWRlIGEgdHJhbnNhY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEpWTXMgKEpWTSBBIGFuZCBKVk0gQikgYm90aCBjb21tdW5pY2F0aW5nIHdpdGggZWFjaAorb3RoZXIsIGFuZCBKVk0gQSBvYnRhaW5zIGEgZGF0YSBzdG9yZSBsb2NrIG9uIGEgcGFydGljdWxhciBvYmplY3QncyB1bmRlcmx5aW5nCitkYXRhLCBpdCBpcyBwb3NzaWJsZSBmb3IgSlZNIEIgdG8gbG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBjYWNoZSB3aXRob3V0IGdvaW5nIHRvCit0aGUgZGF0YXN0b3JlLCBhbmQgdGhlcmVmb3JlIGxvYWQgZGF0YSB0aGF0IHNob3VsZCBiZSBsb2NrZWQuIFRoaXMgd2lsbCBvbmx5CitoYXBwZW4gaWYgSlZNIEIgYXR0ZW1wdHMgdG8gcmVhZCBkYXRhIHRoYXQgaXMgYWxyZWFkeSBpbiBpdHMgY2FjaGUgZHVyaW5nIHRoZQorcGVyaW9kIGJldHdlZW4gd2hlbiBKVk0gQSBsb2NrZWQgdGhlIGRhdGEgYW5kIEpWTSBCIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQgdGhlCitpbnZhbGlkYXRpb24gbm90aWZpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBwcm9ibGVtIGlzIGltcG9zc2libGUgdG8gc29sdmUgd2l0aG91dCBwdXR0aW5nIHRvZ2V0aGVyIGEgdHdvLXBoYXNlIGNvbW1pdAorc3lzdGVtIGZvciBjYWNoZSBub3RpZmljYXRpb25zLCB3aGljaCB3b3VsZCBhZGQgc2lnbmlmaWNhbnQgb3ZlcmhlYWQgdG8gdGhlCitjYWNoaW5nIGltcGxlbWVudGF0aW9uLiBBcyBhIHJlc3VsdCwgd2UgcmVjb21tZW5kIHRoYXQgcGVvcGxlIHVzZSBvcHRpbWlzdGljCitsb2NraW5nIHdoZW4gdXNpbmcgZGF0YSBjYWNoaW5nLiBJZiB5b3UgZG8gbm90LCB0aGVuIHVuZGVyc3RhbmQgdGhhdCBzb21lIG9mCit5b3VyIG5vbi10cmFuc2FjdGlvbmFsIGRhdGEgbWF5IG5vdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK05vdGUgdGhhdCB3aGVuIGxvYWRpbmcgb2JqZWN0cyBpbiBhIHRyYW5zYWN0aW9uLCB0aGUgYXBwcm9wcmlhdGUgZGF0YXN0b3JlCit0cmFuc2FjdGlvbnMgd2lsbCBiZSBvYnRhaW5lZC4gU28sIHRyYW5zYWN0aW9uYWwgY29kZSB3aWxsIG1haW50YWluIGl0cworaW50ZWdyaXR5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGNsYXNzbmFtZT5FeHRlbnQ8L2NsYXNzbmFtZT5zIGFyZSBub3QgY2FjaGVkLiBTbywgaWYgeW91IHBsYW4gb24gaXRlcmF0aW5nCitvdmVyIGEgbGlzdCBvZiBhbGwgdGhlIG9iamVjdHMgaW4gYW4gPGNsYXNzbmFtZT5FeHRlbnQ8L2NsYXNzbmFtZT4gb24gYSByZWd1bGFyCitiYXNpcywgeW91IHdpbGwgb25seSBiZW5lZml0IGZyb20gY2FjaGluZyBpZiB5b3UgZG8gc28gd2l0aCBhIDxjbGFzc25hbWU+UXVlcnkKKzwvY2xhc3NuYW1lPiBpbnN0ZWFkOgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfY2FjaGVfbGltaXRzX2V4dGVudCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnkgUmVwbGFjZXMgRXh0ZW50CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCisuLi4KKworT3BlbkpQQUVudGl0eU1hbmFnZXIgb2VtID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pOworRXh0ZW50IGV4dGVudCA9IG9lbS5nZXRFeHRlbnQoTWFnYXppbmUuY2xhc3MsIGZhbHNlKTsKKworLy8gVGhpcyBpdGVyYXRvciBkb2VzIG5vdCBiZW5lZml0IGZyb20gY2FjaGluZy4uLgorSXRlcmF0b3IgdW5jYWNoZWRJdGVyYXRvciA9IGV4dGVudC5pdGVyYXRvcigpOworCisvLyAuLi4gYnV0IHRoaXMgb25lIGRvZXMuCitPcGVuSlBBUXVlcnkgZXh0ZW50UXVlcnkgPSBvZW0uY3JlYXRlUXVlcnkoLi4uKTsKK2V4dGVudFF1ZXJ5LnNldFN1YmNsYXNzZXMoZmFsc2UpOworSXRlcmF0b3IgY2FjaGVkSXRlcmF0b3IgPSBleHRlbnRRdWVyeS5nZXRSZXN1bHRMaXN0KCkuaXRlcmF0b3IoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jYWNoZV9xdWVyeWNvbXAiPgorCQk8dGl0bGU+CisgICAgICAgICAgICBRdWVyeSBDb21waWxhdGlvbiBDYWNoZQorICAgICAgICA8L3RpdGxlPgorCQk8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9jYWNoZV9xdWVyeWNvbXAiPgorCQkJPHByaW1hcnk+CisgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgPC9wcmltYXJ5PgorCQkJPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBxdWVyeSBjb21waWxhdGlvbiBjYWNoZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisJCTwvaW5kZXh0ZXJtPgorCQk8cGFyYT4KK1RoZSBxdWVyeSBjb21waWxhdGlvbiBjYWNoZSBpcyBhIDxjbGFzc25hbWU+TWFwPC9jbGFzc25hbWU+IHVzZWQgdG8gY2FjaGUgCitwYXJzZWQgcXVlcnkgc3RyaW5ncy4gIEFzIGEgcmVzdWx0LCBtb3N0IHF1ZXJpZXMgYXJlIG9ubHkgcGFyc2VkIG9uY2UgaW4gCitPcGVuSlBBLCBhbmQgY2FjaGVkIHRoZXJlYWZ0ZXIuICBZb3UgY2FuIGNvbnRyb2wgdGhlIGNvbXBpbGF0aW9uIGNhY2hlIHRocm91Z2ggCit0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5RdWVyeUNvbXBpbGF0aW9uQ2FjaGUiPjxsaXRlcmFsPgorb3BlbmpwYS5RdWVyeUNvbXBpbGF0aW9uQ2FjaGU8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LiAgVGhpcyAKK3Byb3BlcnR5IGFjY2VwdHMgYSBwbHVnaW4gc3RyaW5nIChzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikKK2Rlc2NyaWJpbmcgdGhlIDxjbGFzc25hbWU+TWFwPC9jbGFzc25hbWU+IHVzZWQgdG8gYXNzb2NpYXRlIHF1ZXJ5IHN0cmluZ3MgYW5kIAordGhlaXIgcGFyc2VkIGZvcm0uICBUaGlzIHByb3BlcnR5IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhbGlhc2VzOgorCQk8L3BhcmE+CisJCTx0YWJsZT4KKwkJCTx0aXRsZT4KKyAgICAgICAgICAgICAgICBQcmUtZGVmaW5lZCBhbGlhc2VzCisgICAgICAgICAgICA8L3RpdGxlPgorCQkJPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCIgY29sc2VwPSIxIiByb3dzZXA9IjEiPgorCQkJCTxjb2xzcGVjIGNvbG5hbWU9ImFsaWFzIi8+CisJCQkJPGNvbHNwZWMgY29sbmFtZT0idmFsdWUiLz4KKwkJCQk8Y29sc3BlYyBjb2xuYW1lPSJub3RlcyIvPgorCQkJCTx0aGVhZD4KKwkJCQkJPHJvdz4KKwkJCQkJCTxlbnRyeSBjb2xuYW1lPSJhbGlhcyI+QWxpYXM8L2VudHJ5PgorCQkJCQkJPGVudHJ5IGNvbG5hbWU9InZhbHVlIj5WYWx1ZTwvZW50cnk+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0ibm90ZXMiPk5vdGVzPC9lbnRyeT4KKwkJCQkJPC9yb3c+CisJCQkJPC90aGVhZD4KKwkJCQk8dGJvZHk+CisJCQkJCTxyb3c+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0iYWxpYXMiPgorPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4KKwkJCQkJCTwvZW50cnk+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0idmFsdWUiPgorPGxpdGVyYWw+b3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuQ2FjaGVNYXA8L2xpdGVyYWw+CisJCQkJCQk8L2VudHJ5PgorCQkJCQkJPGVudHJ5IGNvbG5hbWU9Im5vdGVzIj4KK1RoZSBkZWZhdWx0IG9wdGlvbi4gIFVzZXMgYSAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvQ2FjaGVNYXAuaHRtbCI+IAorPGxpdGVyYWw+Q2FjaGVNYXA8L2xpdGVyYWw+PC91bGluaz4gdG8gc3RvcmUgY29tcGlsYXRpb24gZGF0YS4gIAorPGxpdGVyYWw+Q2FjaGVNYXA8L2xpdGVyYWw+IG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBjYWNoZSBlbnRyaWVzLCBhbmQgYW4gCitvcHRpb25hbCBzb2Z0IHJlZmVyZW5jZSBtYXAgZm9yIGVudHJpZXMgdGhhdCBhcmUgbW92ZWQgb3V0IG9mIHRoZSBMUlUgc3BhY2UuIAorU28sIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG51bWJlciBvZiBkaXN0aW5jdCAKK3F1ZXJpZXMsIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IGEgZml4ZWQgYW1vdW50IG9mIG1lbW9yeSBpcyAKK3VzZWQgYnkgdGhlIGNhY2hlLgorCQkJCQkJPC9lbnRyeT4KKwkJCQkJPC9yb3c+CisJCQkJCTxyb3c+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0iYWxpYXMiPjxsaXRlcmFsPmFsbDwvbGl0ZXJhbD48L2VudHJ5PgorCQkJCQkJPGVudHJ5IGNvbG5hbWU9InZhbHVlIj4KKzxsaXRlcmFsPm9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5Db25jdXJyZW50SGFzaE1hcDwvbGl0ZXJhbD4KKwkJCQkJCTwvZW50cnk+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0ibm90ZXMiPgorVGhpcyBpcyB0aGUgZmFzdGVzdCBvcHRpb24sIGJ1dCBjb21waWxhdGlvbiBkYXRhIGlzIG5ldmVyIGRyb3BwZWQgZnJvbSB0aGUgCitjYWNoZSwgc28gaWYgeW91IHVzZSBhIGxhcmdlIG51bWJlciBvZiBkeW5hbWljIHF1ZXJpZXMsIHRoaXMgb3B0aW9uIG1heSByZXN1bHQgCitpbiBldmVyLWluY3JlYXNpbmcgbWVtb3J5IHVzYWdlLiBOb3RlIHRoYXQgaWYgeW91ciBxdWVyaWVzIG9ubHkgZGlmZmVyIGluIHRoZSAKK3ZhbHVlcyBvZiB0aGUgcGFyYW1ldGVycywgdGhpcyBzaG91bGQgbm90IGJlIGFuIGlzc3VlLgorCQkJCQkJPC9lbnRyeT4KKwkJCQkJPC9yb3c+CisJCQkJCTxyb3c+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0iYWxpYXMiPjxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPjwvZW50cnk+CisJCQkJCQk8ZW50cnkgY29sbmFtZT0idmFsdWUiPjxlbXBoYXNpcz5ub25lPC9lbXBoYXNpcz48L2VudHJ5PgorCQkJCQkJPGVudHJ5IGNvbG5hbWU9Im5vdGVzIj4KK0Rpc2FibGVzIHRoZSBjb21waWxhdGlvbiBjYWNoZS4KKwkJCQkJCTwvZW50cnk+CisJCQkJCTwvcm93PgorCQkJCTwvdGJvZHk+CisJCQk8L3Rncm91cD4KKwkJPC90YWJsZT4KKwk8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfY29uZi54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExNTBiOAotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9jb25mLnhtbApAQCAtMCwwICsxLDM3MTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9InJlZl9ndWlkZV9jb25mIj4KKyAgICA8dGl0bGU+CisgICAgICAgIENvbmZpZ3VyYXRpb24KKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgY29uZmlndXJhdGlvbgorICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jb25mX2ludHJvIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSW50cm9kdWN0aW9uCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgT3BlbkpQQSBjb25maWd1cmF0aW9uIGZyYW1ld29yay4gSXQgY29uY2x1ZGVzIHdpdGgKK2Rlc2NyaXB0aW9ucyBvZiBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyByZWNvZ25pemVkIGJ5IE9wZW5KUEEuIFlvdSBtYXkKK3dhbnQgdG8gYnJvd3NlIHRoZXNlIHByb3BlcnRpZXMgbm93LCBidXQgaXQgaXMgbm90IG5lY2Vzc2FyeS4gTW9zdCBvZiB0aGVtIHdpbGwKK2JlIHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgd2UgZXhwbGFpbiB0aGUgdmFyaW91cyBmZWF0dXJlcyB0aGV5CithcHBseSB0by4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2NvbmZfc3BlY2lmeSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFJ1bnRpbWUgQ29uZmlndXJhdGlvbgorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9jb25mX3NwZWNpZnkiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBydW50aW1lCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEgcnVudGltZSBpbmNsdWRlcyBhIGNvbXByZWhlbnNpdmUgc3lzdGVtIG9mIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMKK2FuZCBvdmVycmlkZXM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5qcGEueG1sCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KK09wZW5KUEEgZmlyc3QgbG9va3MgZm9yIGFuIG9wdGlvbmFsIDxmaWxlbmFtZT5vcGVuanBhLnhtbDwvZmlsZW5hbWU+IHJlc291cmNlLgorT3BlbkpQQSBzZWFyY2hlcyBmb3IgdGhpcyByZXNvdXJjZSBpbiBlYWNoIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgeW91ciA8bGl0ZXJhbD4KK0NMQVNTUEFUSDwvbGl0ZXJhbD4uIE9wZW5KUEEgd2lsbCBhbHNvIGZpbmQgdGhlIHJlc291cmNlIGlmIHlvdSBwbGFjZSBpdCB3aXRoaW4KK2EgPGZpbGVuYW1lPk1FVEEtSU5GPC9maWxlbmFtZT4gZGlyZWN0b3J5IGluIGFueSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZQorPGxpdGVyYWw+Q0xBU1NQQVRIPC9saXRlcmFsPi4gVGhlIDxmaWxlbmFtZT5vcGVuanBhLnhtbDwvZmlsZW5hbWU+IHJlc291cmNlCitjb250YWlucyBwcm9wZXJ0eSBzZXR0aW5ncyBpbiA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2VfeG1sIj4KK0pQQSdzIFhNTCBmb3JtYXQ8L2xpbms+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgbmFtZSBvciBsb2NhdGlvbiBvZiB0aGUgYWJvdmUgcmVzb3VyY2UgYnkgc3BlY2lmeWluZyB0aGUKK2NvcnJlY3QgcmVzb3VyY2UgcGF0aCBpbiB0aGUgPGxpdGVyYWw+b3BlbmpwYS5wcm9wZXJ0aWVzPC9saXRlcmFsPiBTeXN0ZW0KK3Byb3BlcnR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIG92ZXJyaWRlIGFueSB2YWx1ZSBkZWZpbmVkIGluIHRoZSBhYm92ZSByZXNvdXJjZSBieSBzZXR0aW5nIHRoZSBTeXN0ZW0KK3Byb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUgdG8gdGhlIGRlc2lyZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbmNlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorSW4gSlBBLCB0aGUgdmFsdWVzIGluIHRoZSBzdGFuZGFyZCA8ZmlsZW5hbWU+IE1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbAorPC9maWxlbmFtZT4gYm9vdHN0cmFwcGluZyBmaWxlIHVzZWQgYnkgdGhlCis8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2UiPjxjbGFzc25hbWU+UGVyc2lzdGVuY2U8L2NsYXNzbmFtZT4KKzwvbGluaz4gY2xhc3MgYXQgcnVudGltZSBvdmVycmlkZSB0aGUgdmFsdWVzIGluIHRoZSBhYm92ZSByZXNvdXJjZSwgYXMgd2VsbCBhcworYW55IFN5c3RlbSBwcm9wZXJ0eSBzZXR0aW5ncy4gVGhlIDxjbGFzc25hbWU+TWFwPC9jbGFzc25hbWU+IHBhc3NlZCB0bworPG1ldGhvZG5hbWU+UGVyc2lzdGVuY2UuY3JlYXRlRW50aXR5TWFuYWdlckZhY3Rvcnk8L21ldGhvZG5hbWU+IGF0IHJ1bnRpbWUgYWxzbworb3ZlcnJpZGVzIHByZXZpb3VzIHNldHRpbmdzLCBpbmNsdWRpbmcgcHJvcGVydGllcyBkZWZpbmVkIGluIDxmaWxlbmFtZT4KK3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIHVzaW5nIEpDQSBkZXBsb3ltZW50IHRoZSA8bGl0ZXJhbD5jb25maWctcHJvcGVydHk8L2xpdGVyYWw+IHZhbHVlcyBpbiB5b3VyCis8ZmlsZW5hbWU+cmEueG1sPC9maWxlbmFtZT4gZmlsZSBvdmVycmlkZSBvdGhlciBzZXR0aW5ncy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQWxsIE9wZW5KUEEgY29tbWFuZC1saW5lIHRvb2xzIGFjY2VwdCBmbGFncyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRoZQorY29uZmlndXJhdGlvbiByZXNvdXJjZSB0byB1c2UsIGFuZCB0byBvdmVycmlkZSBhbnkgcHJvcGVydHkuCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9kZXZ0b29scyIvPiBkZXNjcmliZXMgdGhlc2UgZmxhZ3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CitJbnRlcm5hbGx5LCB0aGUgT3BlbkpQQSBydW50aW1lIGVudmlyb25tZW50IGFuZCBkZXZlbG9wbWVudAordG9vbHMgbWFuaXB1bGF0ZSBwcm9wZXJ0eSBzZXR0aW5ncyB0aHJvdWdoIGEgZ2VuZXJhbAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9SZXN1bHRPYmplY3RQcm92aWRlci9saWIvY29uZi9Db25maWd1cmF0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT5Db25maWd1cmF0aW9uPC9jbGFzc25hbWU+PC91bGluaz4gaW50ZXJmYWNlLCBhbmQgaW4gcGFydGljdWxhciBpdHMKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCI+Cis8Y2xhc3NuYW1lPk9wZW5KUEFDb25maWd1cmF0aW9uPC9jbGFzc25hbWU+PC91bGluaz4gYW5kCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb24uaHRtbCI+Cis8Y2xhc3NuYW1lPkpEQkNDb25maWd1cmF0aW9uPC9jbGFzc25hbWU+PC91bGluaz4gc3ViY2xhc3Nlcy4gRm9yIGFkdmFuY2VkCitjdXN0b21pemF0aW9uLCBPcGVuSlBBJ3MgZXh0ZW5kZWQgcnVudGltZSBpbnRlcmZhY2VzIGFuZCBpdHMgZGV2ZWxvcG1lbnQgdG9vbHMKK2FsbG93IHlvdSB0byBhY2Nlc3MgdGhlc2UgaW50ZXJmYWNlcyBkaXJlY3RseS4gU2VlIHRoZSA8dWxpbmsgdXJsPSIuLi9qYXZhZG9jIj4KK0phdmFkb2M8L3VsaW5rPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2NvbmZfZGV2dG9vbHMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBDb21tYW5kIExpbmUgQ29uZmlndXJhdGlvbgorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBkZXZlbG9wbWVudCB0b29scyBzaGFyZSB0aGUgc2FtZSBzZXQgb2YgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBhbmQKK292ZXJyaWRlcyBhcyB0aGUgcnVudGltZSBzeXN0ZW0uIFRoZXkgYWxzbyBhbGxvdyB5b3UgdG8gc3BlY2lmeSBwcm9wZXJ0eSB2YWx1ZXMKK29uIHRoZSBjb21tYW5kIGxpbmU6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1wcm9wZXJ0aWVzLy1wICZsdDtjb25maWd1cmF0aW9uIGZpbGUgb3IgcmVzb3VyY2UmZ3Q7PC9saXRlcmFsPjogVXNlCit0aGUgPGxpdGVyYWw+LXByb3BlcnRpZXM8L2xpdGVyYWw+IGZsYWcsIG9yIGl0cyBzaG9ydGVyIDxsaXRlcmFsPi1wPC9saXRlcmFsPgorZm9ybSwgdG8gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UuIE5vdGUgdGhhdCBPcGVuSlBBIGFsd2F5cyBzZWFyY2hlcwordGhlIGRlZmF1bHQgZmlsZSBsb2NhdGlvbnMgZGVzY3JpYmVkIGFib3ZlLCBzbyB0aGlzIGZsYWcgaXMgb25seSBuZWVkZWQgd2hlbiB5b3UKK2RvIG5vdCBoYXZlIGEgZGVmYXVsdCByZXNvdXJjZSBpbiBwbGFjZSwgb3Igd2hlbiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUKK2RlZmF1bHRzLiBUaGUgZ2l2ZW4gdmFsdWUgY2FuIGJlIHRoZSBwYXRoIHRvIGEgZmlsZSwgb3IgdGhlIHJlc291cmNlIG5hbWUgb2YgYQorZmlsZSBzb21ld2hlcmUgaW4gdGhlIDxsaXRlcmFsPkNMQVNTUEFUSDwvbGl0ZXJhbD4uIE9wZW5KUEEgd2lsbCBzZWFyY2ggdGhlCitnaXZlbiBsb2NhdGlvbiBhcyB3ZWxsIGFzIHRoZSBsb2NhdGlvbiBwcmVmaXhlZCBieSA8ZmlsZW5hbWU+IE1FVEEtSU5GLworPC9maWxlbmFtZT4uIFRodXMsIHRvIHBvaW50IGEgT3BlbkpQQSB0b29sIGF0IDxmaWxlbmFtZT4KK01FVEEtSU5GL215LXBlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+LCB5b3UgY2FuIHVzZToKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7dG9vbCZndDsgLXAgbXktcGVyc2lzdGVuY2UueG1sCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi0mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvbGl0ZXJhbD46IEFueQorY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYmUKK292ZXJyaWRkZW4gd2l0aCBhIGNvbW1hbmQgbGluZSBmbGFnLiBUaGUgZmxhZyBuYW1lIGlzIGFsd2F5cyB0aGUgbGFzdCB0b2tlbiBvZgordGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgbmFtZSwgd2l0aCB0aGUgZmlyc3QgbGV0dGVyIGluIGVpdGhlciB1cHBlciBvciBsb3dlcgorY2FzZS4gRm9yIGV4YW1wbGUsIHRvIG92ZXJyaWRlIHRoZSA8bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb25Vc2VyTmFtZTwvbGl0ZXJhbD4KK3Byb3BlcnR5LCB5b3UgY291bGQgcGFzcyB0aGUgPGxpdGVyYWw+LWNvbm5lY3Rpb25Vc2VyTmFtZSAmbHQ7dmFsdWUmZ3Q7Cis8L2xpdGVyYWw+IGZsYWcgdG8gYW55IHRvb2wuIFZhbHVlcyBzZXQgdGhpcyB3YXkgb3ZlcnJpZGUgYm90aCB0aGUgdmFsdWVzIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlIGFuZCB2YWx1ZXMgc2V0IHZpYSBTeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzX2Zvcm1hdCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ29kZSBGb3JtYXR0aW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfY29uZl9kZXZ0b29sc19mb3JtYXQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb2RlIGZvcm1hdHRpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorU29tZSBPcGVuSlBBIGRldmVsb3BtZW50IHRvb2xzIGdlbmVyYXRlIEphdmEgY29kZS4gVGhlc2UgdG9vbHMgc2hhcmUgYSBjb21tb24KK3NldCBvZiBjb21tYW5kLWxpbmUgZmxhZ3MgZm9yIGZvcm1hdHRpbmcgdGhlaXIgb3V0cHV0IHRvIG1hdGNoIHlvdXIgY29kaW5nCitzdHlsZS4gQWxsIGNvZGUgZm9ybWF0dGluZyBmbGFncyBjYW4gYmVnaW4gd2l0aCBlaXRoZXIgdGhlIDxsaXRlcmFsPmNvZGVGb3JtYXQKKzwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+Y2Y8L2xpdGVyYWw+IHByZWZpeC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1jb2RlRm9ybWF0Li8tY2YudGFiU3BhY2VzICZsdDtzcGFjZXMmZ3Q7PC9saXRlcmFsPjogVGhlIG51bWJlciBvZgorc3BhY2VzIHRoYXQgbWFrZSB1cCBhIHRhYiwgb3IgMCB0byB1c2UgdGFiIGNoYXJhY3RlcnMuIERlZmF1bHRzIHRvIHVzaW5nIHRhYgorY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1jb2RlRm9ybWF0Li8tY2Yuc3BhY2VCZWZvcmVQYXJlbiAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OgorV2hldGhlciBvciBub3QgdG8gcGxhY2UgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcyBvbiBtZXRob2QgY2FsbHMsIGlmCitzdGF0ZW1lbnRzLCBsb29wcywgZXRjLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tY29kZUZvcm1hdC4vLWNmLnNwYWNlSW5QYXJlbiAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OgorV2hldGhlciBvciBub3QgdG8gcGxhY2UgYSBzcGFjZSB3aXRoaW4gcGFyZW50aGVzZXM7IGkuZS4gPGxpdGVyYWw+bWV0aG9kKCBhcmcpCis8L2xpdGVyYWw+LiBEZWZhdWx0cyB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tY29kZUZvcm1hdC4vLWNmLmJyYWNlT25TYW1lTGluZSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OgorV2hldGhlciBvciBub3QgdG8gcGxhY2Ugb3BlbmluZyBicmFjZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZGVjbGFyYXRpb24gdGhhdAorYmVnaW5zIHRoZSBjb2RlIGJsb2NrLCBvciBvbiB0aGUgbmV4dCBsaW5lLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPgorLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWNvZGVGb3JtYXQuLy1jZi5icmFjZUF0U2FtZVRhYkxldmVsICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD4KKzogV2hlbiB0aGUgPGxpdGVyYWw+YnJhY2VPblNhbWVMaW5lPC9saXRlcmFsPiBvcHRpb24gaXMgZGlzYWJsZWQsIHlvdSBjYW4gY2hvb3NlCit3aGV0aGVyIHRvIHBsYWNlIHRoZSBicmFjZSBhdCB0aGUgc2FtZSB0YWIgbGV2ZWwgb2YgdGhlIGNvbnRhaW5lZCBjb2RlLiBEZWZhdWx0cwordG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWNvZGVGb3JtYXQuLy1jZi5zY29yZUJlZm9yZUZpZWxkTmFtZSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDsKKzwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gcHJlZml4IGFuIHVuZGVyc2NvcmUgdG8gbmFtZXMgb2YgcHJpdmF0ZSBtZW1iZXIKK3ZhcmlhYmxlcy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWNvZGVGb3JtYXQuLy1jZi5saW5lc0JldHdlZW5TZWN0aW9ucyAmbHQ7bGluZXMmZ3Q7PC9saXRlcmFsPjogVGhlCitudW1iZXIgb2YgbGluZXMgdG8gc2tpcCBiZXR3ZWVuIHNlY3Rpb25zIG9mIGNvZGUuIERlZmF1bHRzIHRvIDEuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2NvbmZfZGV2dG9vbHNfZm9ybWF0X2V4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvZGUgRm9ybWF0dGluZyB3aXRoIHRoZSBBcHBsaWNhdGlvbiBJZCBUb29sCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuQXBwbGljYXRpb25JZFRvb2wgLWNmLnNwYWNlQmVmb3JlUGFyZW4gdHJ1ZSAtY2YudGFiU3BhY2VzIDQKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBQbHVnaW4gQ29uZmlndXJhdGlvbgorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBwbHVnaW5zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwbHVnaW5zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitCZWNhdXNlIE9wZW5KUEEgaXMgYSBoaWdobHkgY3VzdG9taXphYmxlIGVudmlyb25tZW50LCBtYW55IGNvbmZpZ3VyYXRpb24KK3Byb3BlcnRpZXMgcmVsYXRlIHRvIHRoZSBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBzeXN0ZW0gcGx1Z2lucy4gUGx1Z2luCitwcm9wZXJ0aWVzIGhhdmUgYSBzeW50YXggdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgSmF2YSA1IGFubm90YXRpb25zLiBUaGV5IGFsbG93Cit5b3UgdG8gc3BlY2lmeSBib3RoIHdoYXQgY2xhc3MgdG8gdXNlIGZvciB0aGUgcGx1Z2luIGFuZCBob3cgdG8gY29uZmlndXJlIHRoZQorcHVibGljIGZpZWxkcyBvciBiZWFuIHByb3BlcnRpZXMgb2YgdGhlIGluc3RhbnRpYXRlZCBwbHVnaW4gaW5zdGFuY2UuIFRoZQorZWFzaWVzdCB3YXkgdG8gZGVzY3JpYmUgdGhlIHBsdWdpbiBzeW50YXggaXMgYnkgZXhhbXBsZToKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgaGFzIGEgcGx1Z2dhYmxlIEwyIGNhY2hpbmcgbWVjaGFuaXNtIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgPGxpdGVyYWw+CitvcGVuanBhLkRhdGFDYWNoZTwvbGl0ZXJhbD4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gU3VwcG9zZSB0aGF0IHlvdSBoYXZlCitjcmVhdGVkIGEgbmV3IGNsYXNzLCA8Y2xhc3NuYW1lPmNvbS54eXouTXlEYXRhQ2FjaGU8L2NsYXNzbmFtZT4sIHRoYXQgeW91IHdhbnQKK09wZW5KUEEgdG8gdXNlIGZvciBjYWNoaW5nLiBZb3UndmUgbWFkZSBpbnN0YW5jZXMgb2YgPGxpdGVyYWw+TXlEYXRhQ2FjaGUKKzwvbGl0ZXJhbD4gY29uZmlndXJhYmxlIHZpYSB0d28gbWV0aG9kcywgPG1ldGhvZG5hbWU+c2V0Q2FjaGVTaXplKGludCBzaXplKQorPC9tZXRob2RuYW1lPiBhbmQgPG1ldGhvZG5hbWU+c2V0UmVtb3RlSG9zdChTdHJpbmcgaG9zdCk8L21ldGhvZG5hbWU+LiBUaGUKK3NhbXBsZSBiZWxvdyBzaG93cyBob3cgeW91IHdvdWxkIHRlbGwgT3BlbkpQQSB0byB1c2UgYW4gaW5zdGFuY2Ugb2YgeW91ciBjdXN0b20KK3BsdWdpbiB3aXRoIGEgbWF4IHNpemUgb2YgMTAwMCBhbmQgYSByZW1vdGUgaG9zdCBvZiA8bGl0ZXJhbD5jYWNoZXNlcnZlcgorPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuRGF0YUNhY2hlIiAKKyAgICB2YWx1ZT0iY29tLnh5ei5NeURhdGFDYWNoZShDYWNoZVNpemU9MTAwMCwgUmVtb3RlSG9zdD1jYWNoZXNlcnZlcikiLyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorQXMgeW91IGNhbiBzZWUsIHBsdWdpbiBwcm9wZXJ0aWVzIHRha2UgYSBjbGFzcyBuYW1lLCBmb2xsb3dlZCBieSBhCitjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBwbHVnaW4ncyBwdWJsaWMgZmllbGRzIG9yIGJlYW4gcHJvcGVydGllcworaW4gcGFyZW50aGVzZXMuIE9wZW5KUEEgd2lsbCBtYXRjaCBlYWNoIG5hbWVkIHByb3BlcnR5IHRvIGEgZmllbGQgb3Igc2V0dGVyCittZXRob2QgaW4gdGhlIGluc3RhbnRpYXRlZCBwbHVnaW4gaW5zdGFuY2UsIGFuZCBzZXQgdGhlIGZpZWxkIG9yIGludm9rZSB0aGUKK21ldGhvZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSAoYWZ0ZXIgY29udmVydGluZyB0aGUgdmFsdWUgdG8gdGhlIHJpZ2h0IHR5cGUsIG9mCitjb3Vyc2UpLiBUaGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyCitjYXNlLiBUaGUgZm9sbG93aW5nIHdvdWxkIGFsc28gaGF2ZSBiZWVuIHZhbGlkOgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Citjb20ueHl6Lk15RGF0YUNhY2hlKGNhY2hlU2l6ZT0xMDAwLCByZW1vdGVIb3N0PWNhY2hlc2VydmVyKQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CitJZiB5b3UgZG8gbm90IG5lZWQgdG8gcGFzcyBhbnkgcHJvcGVydHkgc2V0dGluZ3MgdG8gYSBwbHVnaW4sIHlvdSBjYW4ganVzdCBuYW1lCit0aGUgY2xhc3MgdG8gdXNlOgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Citjb20ueHl6Lk15RGF0YUNhY2hlCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1NpbWlsYXJseSwgaWYgdGhlIHBsdWdpbiBoYXMgYSBkZWZhdWx0IGNsYXNzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIGNoYW5nZSwgeW91CitjYW4gc2ltcGx5IHNwZWNpZnkgYSBsaXN0IG9mIHByb3BlcnR5IHNldHRpbmdzLCB3aXRob3V0IGEgY2xhc3MgbmFtZS4gRm9yCitleGFtcGxlLCBPcGVuSlBBJ3MgcXVlcnkgY2FjaGUgY29tcGFuaW9uIHRvIHRoZSBkYXRhIGNhY2hlIGhhcyBhIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIHN1aXRhYmxlIHRvIG1vc3QgdXNlcnMsIGJ1dCB5b3Ugc3RpbGwgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlCitxdWVyeSBjYWNoZSdzIHNpemUuIEl0IGhhcyBhIDxsaXRlcmFsPkNhY2hlU2l6ZTwvbGl0ZXJhbD4gcHJvcGVydHkgZm9yIHRoaXMKK3B1cnBvc2U6CisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0NhY2hlU2l6ZT0xMDAwCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK0ZpbmFsbHksIG1hbnkgb2YgT3BlbkpQQSdzIGJ1aWx0LWluIG9wdGlvbnMgZm9yIHBsdWdpbnMgaGF2ZSBzaG9ydCBhbGlhcyBuYW1lcwordGhhdCB5b3UgY2FuIHVzZSBpbiBwbGFjZSBvZiB0aGUgZnVsbCBjbGFzcyBuYW1lLiBUaGUgZGF0YSBjYWNoZSBwcm9wZXJ0eSwgZm9yCitleGFtcGxlLCBoYXMgYW4gYXZhaWxhYmxlIGFsaWFzIG9mIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IGZvciB0aGUgc3RhbmRhcmQKK2NhY2hlIGltcGxlbWVudGF0aW9uLiBUaGUgcHJvcGVydHkgdmFsdWUgc2ltcGx5IGJlY29tZXM6CisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3RydWUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorVGhlIHN0YW5kYXJkIGNhY2hlIGltcGxlbWVudGF0aW9uIGNsYXNzIGFsc28gaGFzIGEgPGxpdGVyYWw+Q2FjaGVTaXplPC9saXRlcmFsPgorcHJvcGVydHksIHNvIHRvIHVzZSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gYW5kIGNvbmZpZ3VyZSB0aGUgc2l6ZSwgc3BlY2lmeToKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgordHJ1ZShDYWNoZVNpemU9MTAwMCkKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwYXJhPgorVGhlIHJlbWFpbmRlciBvZiB0aGlzIGNoYXB0ZXIgcmV2aWV3cyB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcworT3BlbkpQQSByZWNvZ25pemVzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfY29uZl9vcGVuanBhIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgT3BlbkpQQSBQcm9wZXJ0aWVzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2NvbmZfb3BlbmpwYSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIG9mIE9wZW5KUEEgcHJvcGVydGllcworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgZGVmaW5lcyBtYW55IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4gTW9zdCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZQorcHJvdmlkZWQgZm9yIGFkdmFuY2VkIHVzZXJzIHdobyB3aXNoIHRvIGN1c3RvbWl6ZSBPcGVuSlBBJ3MgYmVoYXZpb3I7IHRoZQorbWFqb3JpdHkgb2YgZGV2ZWxvcGVycyBjYW4gb21pdCB0aGVtLiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXBwbHkgdG8gYW55CitPcGVuSlBBIGJhY2stZW5kLCB0aG91Z2ggdGhlIGdpdmVuIGRlc2NyaXB0aW9ucyBhcmUgdGFpbG9yZWQgdG8gT3BlbkpQQSdzCitkZWZhdWx0IEpEQkMgc3RvcmUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPCEtLQorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5BZ2dyZWdhdGVMaXN0ZW5lcnMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuQWdncmVnYXRlTGlzdGVuZXJzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkFnZ3JlZ2F0ZUxpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZUxpc3RlbmVycworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkFnZ3JlZ2F0ZUxpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZUxpc3RlbmVycworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5BZ2dyZWdhdGVMaXN0ZW5lcnM8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldEFnZ3JlZ2F0ZUxpc3RlbmVycyI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRBZ2dyZWdhdGVMaXN0ZW5lcnMKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitBZ2dyZWdhdGVMaXN0ZW5lcnM8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGx1Z2luCitzdHJpbmdzIChzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyBjdXN0b20KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL2V4cHMvSkRCQ0FnZ3JlZ2F0ZUxpc3RlbmVyLmh0bWwiPgorPGNsYXNzbmFtZT4gb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLmV4cHMuSkRCQ0FnZ3JlZ2F0ZUxpc3RlbmVyCis8L2NsYXNzbmFtZT48L3VsaW5rPnMgdG8gbWFrZSBhdmFpbGFibGUgdG8gYWxsIHF1ZXJpZXMsIGluIGFkZGl0aW9uIHRvIHRoZQorc3RhbmRhcmQgc2V0IG9mIGxpc3RlbmVycy4gU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3F1ZXJ5ZXh0Ii8+CisgZm9yIGRldGFpbHMgb24gYWdncmVnYXRlIGxpc3RlbmVycy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAtLT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQXV0b0NsZWFyIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkF1dG9DbGVhcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5BdXRvQ2xlYXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBdXRvQ2xlYXIKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5BdXRvQ2xlYXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQXV0b0NsZWFyCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBBdXRvQ2xlYXIKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuQXV0b0NsZWFyCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldEF1dG9DbGVhciI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRBdXRvQ2xlYXIKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitBdXRvQ2xlYXI8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmRhdGFzdG9yZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5kYXRhc3RvcmU8L2xpdGVyYWw+LAorPGxpdGVyYWw+YWxsPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gV2hlbiB0byBhdXRvbWF0aWNhbGx5IGNsZWFyCitpbnN0YW5jZSBzdGF0ZTogb24gZW50ZXJpbmcgYSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24sIG9yIG9uIGVudGVyaW5nIGFueQordHJhbnNhY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQXV0b0RldGFjaCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5BdXRvRGV0YWNoCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkF1dG9EZXRhY2giPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBdXRvRGV0YWNoCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQXV0b0RldGFjaCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGRldGFjaAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBBdXRvRGV0YWNoCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBBdXRvRGV0YWNoCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLkF1dG9EZXRhY2gKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0QXV0b0RldGFjaCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRBdXRvRGV0YWNoCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQXV0b0RldGFjaDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPmNsb3NlPC9saXRlcmFsPiwKKzxsaXRlcmFsPmNvbW1pdDwvbGl0ZXJhbD4sIDxsaXRlcmFsPm5vbnR4LXJlYWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50cword2hlbiBtYW5hZ2VkIGluc3RhbmNlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0YWNoZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQnJva2VyRmFjdG9yeSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Ccm9rZXJGYWN0b3J5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkJyb2tlckZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBCcm9rZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuQnJva2VyRmFjdG9yeQorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRCcm9rZXJGYWN0b3J5Ij4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldEJyb2tlckZhY3RvcnkKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitCcm9rZXJGYWN0b3J5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5qZGJjPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPmpkYmM8L2xpdGVyYWw+LAorPGxpdGVyYWw+YWJzdHJhY3RzdG9yZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPnJlbW90ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jyb2tlckZhY3RvcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+IHR5cGUgdG8KK3VzZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5Ccm9rZXJJbXBsIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkJyb2tlckltcGwKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQnJva2VySW1wbCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEJyb2tlckltcGwKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Ccm9rZXJJbXBsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQnJva2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEJyb2tlckltcGwKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLkJyb2tlckltcGwKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0QnJva2VySW1wbCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRCcm9rZXJJbXBsCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQnJva2VySW1wbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZGVmYXVsdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL0Jyb2tlci5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXI8L2NsYXNzbmFtZT48L3VsaW5rPiB0eXBlIHRvIHVzZSBhdCBydW50aW1lLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9ydW50aW1lX2Jyb2tlcl9leHRlbnNpb24iLz4gb24gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ2xhc3NSZXNvbHZlciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5DbGFzc1Jlc29sdmVyCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNsYXNzUmVzb2x2ZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDbGFzc1Jlc29sdmVyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjbGFzcyBsb2FkaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIENsYXNzUmVzb2x2ZXIKKyAgICAgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLkNsYXNzUmVzb2x2ZXIKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q2xhc3NSZXNvbHZlciI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDbGFzc1Jlc29sdmVyCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ2xhc3NSZXNvbHZlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZGVmYXVsdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9DbGFzc1Jlc29sdmVyLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5DbGFzc1Jlc29sdmVyPC9jbGFzc25hbWU+PC91bGluaz4gaW1wbGVtZW50YXRpb24gdG8gdXNlCitmb3IgY2xhc3MgbmFtZSByZXNvbHV0aW9uLiBZb3UgbWF5IHdpc2ggdG8gcGx1ZyBpbiB5b3VyIG93biByZXNvbHZlciBpZiB5b3UgaGF2ZQorc3BlY2lhbCBjbGFzc2xvYWRpbmcgbmVlZHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29tcGF0aWJpbGl0eSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db21wYXRpYmlsaXR5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbXBhdGliaWxpdHkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29tcGF0aWJpbGl0eSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuQ29tcGF0aWJpbGl0eQorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb21wYXRpYmlsaXR5Ij4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldENvbXBhdGliaWxpdHkKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb21wYXRpYmlsaXR5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBFbmNhcHN1bGF0ZXMgb3B0aW9ucyB0byBtaW1pYyB0aGUKK2JlaGF2aW9yIG9mIHByZXZpb3VzIE9wZW5KUEEgcmVsZWFzZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRHJpdmVyTmFtZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRyaXZlck5hbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldENvbm5lY3Rpb25Ecml2ZXJOYW1lIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbkRyaXZlck5hbWUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uRHJpdmVyTmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiBlaXRoZXIgdGhlCitKREJDIDxjbGFzc25hbWU+amF2YS5zcWwuRHJpdmVyPC9jbGFzc25hbWU+LCBvciBhIDxjbGFzc25hbWU+CitqYXZheC5zcWwuRGF0YVNvdXJjZTwvY2xhc3NuYW1lPiBpbXBsZW1lbnRhdGlvbiB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUKK2RhdGFiYXNlLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXAiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbjJEcml2ZXJOYW1lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkNvbm5lY3Rpb24yRHJpdmVyTmFtZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uMkRyaXZlck5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uMkRyaXZlck5hbWUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uMkRyaXZlck5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uMkRyaXZlck5hbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbjJEcml2ZXJOYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uMkRyaXZlck5hbWUiPgorPG1ldGhvZG5hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uMkRyaXZlck5hbWUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uMkRyaXZlck5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoaXMgcHJvcGVydHkgaXMgZXF1aXZhbGVudCB0byB0aGUKKzxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU8L2xpdGVyYWw+IHByb3BlcnR5IGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ib3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZSIvPiwgYnV0IGFwcGxpZXMgdG8gdGhlCithbHRlcm5hdGUgY29ubmVjdGlvbiBmYWN0b3J5IHVzZWQgZm9yIHVubWFuYWdlZCBjb25uZWN0aW9ucy4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF90aGlyZHBhcnR5X2VubGlzdCIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvbkZhY3RvcnkiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbkZhY3RvcnkKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uRmFjdG9yeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSA8Y2xhc3NuYW1lPmphdmF4LnNxbC5EYXRhU291cmNlCis8L2NsYXNzbmFtZT4gdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5MiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkyIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkyIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkyCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5MjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvbkZhY3RvcnkyIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldENvbm5lY3Rpb25GYWN0b3J5MgorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0Nvbm5lY3Rpb25GYWN0b3J5MjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQW4gdW5tYW5hZ2VkIDxjbGFzc25hbWU+CitqYXZheC5zcWwuRGF0YVNvdXJjZTwvY2xhc3NuYW1lPiB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXAiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlOYW1lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5TmFtZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeU5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeU5hbWUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeU5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeU5hbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlOYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uRmFjdG9yeU5hbWUiPgorPG1ldGhvZG5hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uRmFjdG9yeU5hbWUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uRmFjdG9yeU5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBKTkRJIGxvY2F0aW9uIG9mIGEgPGNsYXNzbmFtZT4KK2phdmF4LnNxbC5EYXRhU291cmNlPC9jbGFzc25hbWU+IHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cCIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTJOYW1lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5Mk5hbWUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkyTmFtZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5Mk5hbWUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTJOYW1lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkyTmFtZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTJOYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uRmFjdG9yeTJOYW1lIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbkZhY3RvcnkyTmFtZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0Nvbm5lY3Rpb25GYWN0b3J5Mk5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBKTkRJIGxvY2F0aW9uIG9mIGFuIHVubWFuYWdlZAorPGNsYXNzbmFtZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvY2xhc3NuYW1lPiB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCitTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2VudGVycHJpc2VfeGEiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlNb2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5TW9kZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeU1vZGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeU1vZGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeU1vZGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeU1vZGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlNb2RlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uRmFjdG9yeU1vZGUiPgorPG1ldGhvZG5hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uRmFjdG9yeU1vZGUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uRmFjdG9yeU1vZGU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmxvY2FsPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPmxvY2FsPC9saXRlcmFsPiwKKzxsaXRlcmFsPm1hbmFnZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IG1vZGUgdG8gdXNlCit3aGVuIGludGVncmF0aW5nIHdpdGggdGhlIGFwcGxpY2F0aW9uIHNlcnZlcidzIG1hbmFnZWQgdHJhbnNhY3Rpb25zLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX3RoaXJkcGFydHlfZW5saXN0Ii8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBBIHBsdWdpbiBzdHJpbmcgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgbGlzdGluZyBwcm9wZXJ0aWVzIGZvcgorY29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YXNvdXJjZSBpbiB1c2UuIFNlZSB0aGUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXM8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldENvbm5lY3Rpb25GYWN0b3J5MlByb3BlcnRpZXMiPgorPG1ldGhvZG5hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uRmFjdG9yeTJQcm9wZXJ0aWVzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvbkZhY3RvcnkyUHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhpcyBwcm9wZXJ0eSBpcyBlcXVpdmFsZW50IHRvIHRoZQorPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXM8L2xpdGVyYWw+IHByb3BlcnR5IGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMiLz4sIGJ1dCBhcHBsaWVzIHRvIHRoZQorYWx0ZXJuYXRlIGNvbm5lY3Rpb24gZmFjdG9yeSB1c2VkIGZvciB1bm1hbmFnZWQgY29ubmVjdGlvbnMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9lbmxpc3QiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkNvbm5lY3Rpb25QYXNzd29yZAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUGFzc3dvcmQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUGFzc3dvcmQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uUGFzc3dvcmQiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvblBhc3N3b3JkCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvblBhc3N3b3JkPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyCitzcGVjaWZpZWQgaW4gdGhlIDxsaXRlcmFsPkNvbm5lY3Rpb25Vc2VyTmFtZTwvbGl0ZXJhbD4gcHJvcGVydHkuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXAiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbjJQYXNzd29yZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uMlBhc3N3b3JkCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb24yUGFzc3dvcmQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uMlBhc3N3b3JkCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbjJQYXNzd29yZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24yUGFzc3dvcmQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbjJQYXNzd29yZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvbjJQYXNzd29yZCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uMlBhc3N3b3JkCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvbjJQYXNzd29yZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhpcyBwcm9wZXJ0eSBpcyBlcXVpdmFsZW50IHRvIHRoZQorPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQ8L2xpdGVyYWw+IHByb3BlcnR5IGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ib3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQiLz4sIGJ1dCBhcHBsaWVzIHRvIHRoZQorYWx0ZXJuYXRlIGNvbm5lY3Rpb24gZmFjdG9yeSB1c2VkIGZvciB1bm1hbmFnZWQgY29ubmVjdGlvbnMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9lbmxpc3QiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUHJvcGVydGllcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXM8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldENvbm5lY3Rpb25Qcm9wZXJ0aWVzIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uUHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBwbHVnaW4gc3RyaW5nIChzZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIGxpc3RpbmcgcHJvcGVydGllcyB0byBjb25maWd1cmUKK3RoZSBkcml2ZXIgbGlzdGVkIGluIHRoZSA8bGl0ZXJhbD5Db25uZWN0aW9uRHJpdmVyTmFtZTwvbGl0ZXJhbD4gcHJvcGVydHkKK2Rlc2NyaWJlZCBiZWxvdy4gU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkNvbm5lY3Rpb24yUHJvcGVydGllcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uMlByb3BlcnRpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbjJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbjJQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbjJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbjJQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLkNvbm5lY3Rpb24yUHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvbjJQcm9wZXJ0aWVzIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbjJQcm9wZXJ0aWVzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvbjJQcm9wZXJ0aWVzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGlzIHByb3BlcnR5IGlzIGVxdWl2YWxlbnQgdG8gdGhlCis8bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzPC9saXRlcmFsPiBwcm9wZXJ0eSBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9Im9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMiLz4sIGJ1dCBhcHBsaWVzIHRvIHRoZQorYWx0ZXJuYXRlIGNvbm5lY3Rpb24gZmFjdG9yeSB1c2VkIGZvciB1bm1hbmFnZWQgY29ubmVjdGlvbnMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9lbmxpc3QiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvblVSTCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uVVJMCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb25VUkwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uVVJMCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvblVSTCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25VUkwKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb25VUkwKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvblVSTCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uVVJMCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvblVSTDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhlIEpEQkMgVVJMIGZvciB0aGUgZGF0YWJhc2UuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXAiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbjJVUkwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuQ29ubmVjdGlvbjJVUkwKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbjJVUkwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uMlVSTAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb24yVVJMIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbjJVUkwKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb24yVVJMCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldENvbm5lY3Rpb24yVVJMIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldENvbm5lY3Rpb24yVVJMCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvbjJVUkw8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoaXMgcHJvcGVydHkgaXMgZXF1aXZhbGVudCB0byB0aGUKKzxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvblVSTDwvbGl0ZXJhbD4gcHJvcGVydHkgZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25VUkwiLz4sIGJ1dCBhcHBsaWVzIHRvIHRoZSBhbHRlcm5hdGUKK2Nvbm5lY3Rpb24gZmFjdG9yeSB1c2VkIGZvciB1bm1hbmFnZWQgY29ubmVjdGlvbnMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9lbmxpc3QiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvblVzZXJOYW1lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkNvbm5lY3Rpb25Vc2VyTmFtZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uVXNlck5hbWUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uVXNlck5hbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvblVzZXJOYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uVXNlck5hbWUiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvblVzZXJOYW1lCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvblVzZXJOYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgdXNlciBuYW1lIHRvIHVzZSB3aGVuCitjb25uZWN0aW5nIHRvIHRoZSBkYXRhYmFzZS4gU2VlIHRoZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cCIvPgorZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvbjJVc2VyTmFtZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Db25uZWN0aW9uMlVzZXJOYW1lCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb24yVXNlck5hbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uMlVzZXJOYW1lCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvbjJVc2VyTmFtZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24yVXNlck5hbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbjJVc2VyTmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Q29ubmVjdGlvbjJVc2VyTmFtZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uMlVzZXJOYW1lCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorQ29ubmVjdGlvbjJVc2VyTmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhpcyBwcm9wZXJ0eSBpcyBlcXVpdmFsZW50IHRvIHRoZQorPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWU8L2xpdGVyYWw+IHByb3BlcnR5IGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiLz4sIGJ1dCBhcHBsaWVzIHRvIHRoZQorYWx0ZXJuYXRlIGNvbm5lY3Rpb24gZmFjdG9yeSB1c2VkIGZvciB1bm1hbmFnZWQgY29ubmVjdGlvbnMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9lbmxpc3QiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuQ29ubmVjdGlvblJldGFpbk1vZGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuQ29ubmVjdGlvblJldGFpbk1vZGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuQ29ubmVjdGlvblJldGFpbk1vZGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmV0YWluTW9kZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkNvbm5lY3Rpb25SZXRhaW5Nb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJldGFpbk1vZGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvblJldGFpbk1vZGU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldENvbm5lY3Rpb25SZXRhaW5Nb2RlIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvblJldGFpbk1vZGUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uUmV0YWluTW9kZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+b24tZGVtYW5kPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQ29udHJvbHMgaG93IE9wZW5KUEEgdXNlcworZGF0YXN0b3JlIGNvbm5lY3Rpb25zLiBUaGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBmb3IgaW5kaXZpZHVhbAorc2Vzc2lvbnMuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF9yZXRhaW4iLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuRGF0YUNhY2hlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkRhdGFDYWNoZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5EYXRhQ2FjaGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBEYXRhQ2FjaGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5EYXRhQ2FjaGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIERhdGFDYWNoZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuRGF0YUNhY2hlCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldERhdGFDYWNoZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXREYXRhQ2FjaGUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitEYXRhQ2FjaGU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBwbHVnaW4gbGlzdCBzdHJpbmcgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2RhdGFjYWNoZS9EYXRhQ2FjaGUuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuRGF0YUNhY2hlPC9jbGFzc25hbWU+PC91bGluaz5zIHRvIHVzZSBmb3IgZGF0YQorY2FjaGluZy4gU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jYWNoZV9jb25mIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkRhdGFDYWNoZU1hbmFnZXIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuRGF0YUNhY2hlTWFuYWdlcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5EYXRhQ2FjaGVNYW5hZ2VyIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRGF0YUNhY2hlTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkRhdGFDYWNoZU1hbmFnZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIERhdGFDYWNoZU1hbmFnZXIKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuRGF0YUNhY2hlTWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0RGF0YUNhY2hlTWFuYWdlciI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXREYXRhQ2FjaGVNYW5hZ2VyCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorRGF0YUNhY2hlTWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZGVmYXVsdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL0RhdGFDYWNoZU1hbmFnZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9wZW5qcGEuZGF0YWNhY2hlLkRhdGFDYWNoZU1hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPiB0aGF0IG1hbmFnZXMKK3RoZSBzeXN0ZW0gZGF0YSBjYWNoZXMuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGUiLz4gZm9yIGRldGFpbHMKK29uIGRhdGEgY2FjaGluZy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5EYXRhQ2FjaGVUaW1lb3V0Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkRhdGFDYWNoZVRpbWVvdXQKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuRGF0YUNhY2hlVGltZW91dCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIERhdGFDYWNoZVRpbWVvdXQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5EYXRhQ2FjaGVUaW1lb3V0Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBEYXRhQ2FjaGVUaW1lb3V0CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLkRhdGFDYWNoZVRpbWVvdXQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldERhdGFDYWNoZVRpbWVvdXQiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0RGF0YUNhY2hlVGltZW91dAorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0RhdGFDYWNoZVRpbWVvdXQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPi0xPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdAorZGF0YSBpbiB0aGUgZGF0YSBjYWNoZSBpcyB2YWxpZC4gU2V0IHRoaXMgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCBkYXRhIHNob3VsZCBub3QKK2V4cGlyZSBmcm9tIHRoZSBjYWNoZS4gVGhpcyBwcm9wZXJ0eSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgZm9yIGluZGl2aWR1YWwKK2NsYXNzZXMuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGVfY29uZiIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5EZXRhY2hTdGF0ZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5EZXRhY2hTdGF0ZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5BdXRvRGV0YWNoIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRGV0YWNoU3RhdGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5BdXRvRGV0YWNoIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZGV0YWNoCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIERldGFjaFN0YXRlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBEZXRhY2hTdGF0ZQorICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5EZXRhY2hTdGF0ZQorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXREZXRhY2hTdGF0ZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXREZXRhY2hTdGF0ZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0RldGFjaFN0YXRlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5sb2FkZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qb3NzaWJsZSB2YWx1ZXM6IDwvZW1waGFzaXM+PGxpdGVyYWw+bG9hZGVkPC9saXRlcmFsPiwKKzxsaXRlcmFsPmZldGNoLWdyb3VwczwvbGl0ZXJhbD4sIDxsaXRlcmFsPmFsbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IERldGVybWluZXMgd2hpY2ggZmllbGRzIGFyZSBwYXJ0CitvZiB0aGUgZGV0YWNoZWQgZ3JhcGggYW5kIHJlbGF0ZWQgb3B0aW9ucy4gRm9yIG1vcmUgZGV0YWlscywgc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGV0YWNoX2dyYXBoIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkR5bmFtaWNEYXRhU3RydWN0cyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5EeW5hbWljRGF0YVN0cnVjdHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuRHluYW1pY0RhdGFTdHJ1Y3RzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRHluYW1pY0RhdGFTdHJ1Y3RzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuRHluYW1pY0RhdGFTdHJ1Y3RzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBEeW5hbWljRGF0YVN0cnVjdHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkR5bmFtaWNEYXRhU3RydWN0cyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBEeW5hbWljRGF0YVN0cnVjdHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuRHluYW1pY0RhdGFTdHJ1Y3RzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXREeW5hbWljRGF0YVN0cnVjdHMiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0RHluYW1pY0RhdGFTdHJ1Y3RzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorRHluYW1pY0RhdGFTdHJ1Y3RzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFdoZXRoZXIgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUKK2N1c3RvbWl6ZWQgc3RydWN0cyB0byBob2xkIHBlcnNpc3RlbnQgZGF0YS4gQm90aCB0aGUgT3BlbkpQQSBkYXRhIGNhY2hlIGFuZCB0aGUKK3JlbW90ZSBmcmFtZXdvcmsgcmVseSBvbiBkYXRhIHN0cnVjdHMgdG8gY2FjaGUgYW5kIHRyYW5zZmVyIHBlcnNpc3RlbnQgc3RhdGUuCitXaXRoIGR5bmFtaWMgc3RydWN0cywgT3BlbkpQQSBjYW4gY3VzdG9taXplIGRhdGEgc3RvcmFnZSBmb3IgZWFjaCBjbGFzcywKK2VsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGdlbmVyYXRlIHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHMuIFRoaXMgc2F2ZXMgbWVtb3J5CithbmQgc3BlZWRzIHVwIGNlcnRhaW4gcnVudGltZSBvcGVyYXRpb25zLiBUaGUgcHJpY2UgaXMgYSBsb25nZXIgd2FybS11cCB0aW1lIGZvcgordGhlIGFwcGxpY2F0aW9uIC0gZ2VuZXJhdGluZyBhbmQgbG9hZGluZyBjdXN0b20gY2xhc3NlcyBpbnRvIHRoZSBKVk0gdGFrZXMgdGltZS4KK1RoZXJlZm9yZSwgb25seSBzZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBpZiB5b3UgaGF2ZSBhCitsb25nLXJ1bm5pbmcgYXBwbGljYXRpb24gd2hlcmUgdGhlIGluaXRpYWwgY29zdCBvZiBjbGFzcyBnZW5lcmF0aW9uIGlzIG9mZnNldCBieQorbWVtb3J5IGFuZCBzcGVlZCBvcHRpbWl6YXRpb24gb3ZlciB0aW1lLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkZldGNoQmF0Y2hTaXplIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkZldGNoQmF0Y2hTaXplCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkZldGNoQmF0Y2hTaXplIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRmV0Y2hCYXRjaFNpemUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5GZXRjaEJhdGNoU2l6ZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEZldGNoQmF0Y2hTaXplCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5GZXRjaEJhdGNoU2l6ZQorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRGZXRjaEJhdGNoU2l6ZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRGZXRjaEJhdGNoU2l6ZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0ZldGNoQmF0Y2hTaXplPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD4tMTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBhdAorb25jZSB3aGVuIHNjcm9sbGluZyB0aHJvdWdoIGEgcmVzdWx0IHNldC4gVGhlIGZldGNoIHNpemUgY2FuIGFsc28gYmUgc2V0IGF0CitydW50aW1lLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfbHJzIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkZldGNoR3JvdXBzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkZldGNoR3JvdXBzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkZldGNoR3JvdXBzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZmV0Y2ggZ3JvdXBzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEZldGNoR3JvdXBzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5GZXRjaEdyb3VwcworPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRGZXRjaEdyb3VwcyI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRGZXRjaEdyb3VwcworPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0ZldGNoR3JvdXBzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZldGNoCitncm91cCBuYW1lcyB0aGF0IGFyZSB0byBiZSBsb2FkZWQgd2hlbiByZXRyaWV2aW5nIG9iamVjdHMgZnJvbSB0aGUgZGF0YXN0b3JlLgorRmV0Y2ggZ3JvdXBzIGNhbiBhbHNvIGJlIHNldCBhdCBydW50aW1lLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoIi8+CisgZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPCEtLQorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5GaWx0ZXJMaXN0ZW5lcnMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuRmlsdGVyTGlzdGVuZXJzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkZpbHRlckxpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEZpbHRlckxpc3RlbmVycworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkZpbHRlckxpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEZpbHRlckxpc3RlbmVycworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuRmlsdGVyTGlzdGVuZXJzCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldEZpbHRlckxpc3RlbmVycyI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRGaWx0ZXJMaXN0ZW5lcnMKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitGaWx0ZXJMaXN0ZW5lcnM8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZnVsbAorcGx1Z2luIHN0cmluZ3MgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBmb3IgY3VzdG9tCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzL0pEQkNGaWx0ZXJMaXN0ZW5lci5odG1sIj4KKzxjbGFzc25hbWU+IG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkpEQkNGaWx0ZXJMaXN0ZW5lcjwvY2xhc3NuYW1lPgorPC91bGluaz5zIHRvIG1ha2UgYXZhaWxhYmxlIHRvIGFsbCBxdWVyaWVzLCBpbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgc2V0IG9mCitsaXN0ZW5lcnMuIFlvdSBjYW4gYWxzbyBhZGQgZmlsdGVyIGxpc3RlbmVycyB0byBpbmRpdmlkdWFsIHF1ZXJpZXMuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2VudGVycHJpc2VfcXVlcnlleHQiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgLS0+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLkZsdXNoQmVmb3JlUXVlcmllcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5GbHVzaEJlZm9yZVF1ZXJpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuRmx1c2hCZWZvcmVRdWVyaWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRmx1c2hCZWZvcmVRdWVyaWVzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuRmx1c2hCZWZvcmVRdWVyaWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgRmx1c2hCZWZvcmVRdWVyaWVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5GbHVzaEJlZm9yZVF1ZXJpZXMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBmbHVzaAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBGbHVzaEJlZm9yZVF1ZXJpZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuRmx1c2hCZWZvcmVRdWVyaWVzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuRmx1c2hCZWZvcmVRdWVyaWVzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRGbHVzaEJlZm9yZVF1ZXJpZXMiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Rmx1c2hCZWZvcmVRdWVyaWVzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorRmx1c2hCZWZvcmVRdWVyaWVzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD50cnVlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gV2hldGhlciBvciBub3QgdG8gZmx1c2ggYW55CitjaGFuZ2VzIG1hZGUgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gdGhlIGRhdGFzdG9yZSBiZWZvcmUgZXhlY3V0aW5nIGEKK3F1ZXJ5LiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfcmV0YWluIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLklnbm9yZUNoYW5nZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuSWdub3JlQ2hhbmdlcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5JZ25vcmVDaGFuZ2VzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSWdub3JlQ2hhbmdlcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLklnbm9yZUNoYW5nZXMKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0SWdub3JlQ2hhbmdlcyI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRJZ25vcmVDaGFuZ2VzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorSWdub3JlQ2hhbmdlczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBXaGV0aGVyIHRvIGNvbnNpZGVyIG1vZGlmaWNhdGlvbnMKK3RvIHBlcnNpc3RlbnQgb2JqZWN0cyBtYWRlIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHdoZW4gZXZhbHVhdGluZyBxdWVyaWVzLgorU2V0dGluZyB0aGlzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IGFsbG93cyBPcGVuSlBBIHRvIGlnbm9yZSBjaGFuZ2VzIGFuZAorZXhlY3V0ZSB0aGUgcXVlcnkgZGlyZWN0bHkgYWdhaW5zdCB0aGUgZGF0YXN0b3JlLiBBIHZhbHVlIG9mIDxsaXRlcmFsPmZhbHNlCis8L2xpdGVyYWw+IGZvcmNlcyBPcGVuSlBBIHRvIGNvbnNpZGVyIHdoZXRoZXIgdGhlIGNoYW5nZXMgaW4gdGhlIGN1cnJlbnQKK3RyYW5zYWN0aW9uIGFmZmVjdCB0aGUgcXVlcnksIGFuZCBpZiBzbyB0byBlaXRoZXIgZXZhbHVhdGUgdGhlIHF1ZXJ5IGluLW1lbW9yeQorb3IgZmx1c2ggYmVmb3JlIHJ1bm5pbmcgaXQgYWdhaW5zdCB0aGUgZGF0YXN0b3JlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLklkIj4KKyAgICAgICAgICAgIDx0aXRsZT5vcGVuanBhLklkPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5JZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+SWQ8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgIDxsaXRlcmFsPm9wZW5qcGEuSWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgPGxpdGVyYWw+SWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IG5vbmUKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEFuCisgICAgICAgICAgICBlbnZpcm9ubWVudC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uIFRoaXMKKyAgICAgICAgICAgIG1pZ2h0IGNvcnJlc3BvbmQgdG8gYSBKUEEgcGVyc2lzdGVuY2UtdW5pdCBuYW1lLCBvciB0byBzb21lIG90aGVyCisgICAgICAgICAgICBtb3JlLXVuaXF1ZSB2YWx1ZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuSW52ZXJzZU1hbmFnZXIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuSW52ZXJzZU1hbmFnZXIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuSW52ZXJzZU1hbmFnZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBJbnZlcnNlTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkludmVyc2VNYW5hZ2VyIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbCByZWxhdGlvbgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBJbnZlcnNlTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuSW52ZXJzZU1hbmFnZXIKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0SW52ZXJzZU1hbmFnZXIiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0SW52ZXJzZU1hbmFnZXIKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitJbnZlcnNlTWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qb3NzaWJsZSB2YWx1ZXM6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LAorPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIGEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9JbnZlcnNlTWFuYWdlci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5JbnZlcnNlTWFuYWdlcjwvY2xhc3NuYW1lPjwvdWxpbms+IHRvIHVzZQorZm9yIG1hbmFnaW5nIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zIHVwb24gYSBmbHVzaC4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfaW52ZXJzZXMiLz4gZm9yIHVzYWdlIGRvY3VtZW50YXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTG9ja01hbmFnZXIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuTG9ja01hbmFnZXIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuTG9ja01hbmFnZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBMb2NrTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLkxvY2tNYW5hZ2VyIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBMb2NrTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuTG9ja01hbmFnZXIKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0TG9ja01hbmFnZXIiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0TG9ja01hbmFnZXIKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitMb2NrTWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+dmVyc2lvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5ub25lPC9saXRlcmFsPiwKKzxsaXRlcmFsPnNqdm08L2xpdGVyYWw+LCA8bGl0ZXJhbD5wZXNzaW1pc3RpYzwvbGl0ZXJhbD4sIAorPGxpdGVyYWw+dmVyc2lvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIGEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Mb2NrTWFuYWdlci5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Mb2NrTWFuYWdlcjwvY2xhc3NuYW1lPjwvdWxpbms+IHRvIHVzZSBmb3IgYWNxdWlyaW5nCitsb2NrcyBvbiBwZXJzaXN0ZW50IGluc3RhbmNlcyBkdXJpbmcgdHJhbnNhY3Rpb25zLiAgU2VlIAorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2xvY2tpbmdfbG9ja21nciIvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5Mb2NrVGltZW91dCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5Mb2NrVGltZW91dAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Mb2NrVGltZW91dCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIExvY2tUaW1lb3V0CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuTG9ja1RpbWVvdXQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIExvY2tUaW1lb3V0CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5Mb2NrVGltZW91dAorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRMb2NrVGltZW91dCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRMb2NrVGltZW91dAorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0xvY2tUaW1lb3V0PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD4tMTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQKK2ZvciBhbiBvYmplY3QgbG9jayBiZWZvcmUgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLCBvciAtMSBmb3Igbm8gbGltaXQuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2xvY2tpbmciLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTG9nIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLkxvZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Mb2ciPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBMb2cKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Mb2ciPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIExvZworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuTG9nPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRMb2ciPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0TG9nPC9tZXRob2RuYW1lPgorPC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPkxvZworPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD50cnVlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGE8L2xpdGVyYWw+LAorPGxpdGVyYWw+Y29tbW9uczwvbGl0ZXJhbD4sIDxsaXRlcmFsPmxvZzRqPC9saXRlcmFsPiwgPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIGEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nRmFjdG9yeS5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+IHRvIHVzZSBmb3IgbG9nZ2luZy4KK0ZvciBkZXRhaWxzIG9uIGxvZ2dpbmcsIHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbG9nZ2luZyIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5NYW5hZ2VkUnVudGltZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5NYW5hZ2VkUnVudGltZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5NYW5hZ2VkUnVudGltZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE1hbmFnZWRSdW50aW1lCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuTWFuYWdlZFJ1bnRpbWUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlZAorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgTWFuYWdlZFJ1bnRpbWUKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuTWFuYWdlZFJ1bnRpbWUKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0TWFuYWdlZFJ1bnRpbWUiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0TWFuYWdlZFJ1bnRpbWUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitNYW5hZ2VkUnVudGltZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+YXV0bzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZWUvTWFuYWdlZFJ1bnRpbWUuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5lZS5NYW5hZ2VkUnVudGltZTwvY2xhc3NuYW1lPjwvdWxpbms+IGltcGxlbWVudGF0aW9uIHRvIHVzZQorZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgPGNsYXNzbmFtZT5UcmFuc2FjdGlvbk1hbmFnZXI8L2NsYXNzbmFtZT4gaW4gYW4KK2VudGVycHJpc2UgZW52aXJvbm1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTWFwcGluZyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5NYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLk1hcHBpbmciPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXBwaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuTWFwcGluZworPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRNYXBwaW5nIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldE1hcHBpbmc8L21ldGhvZG5hbWU+Cis8L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitNYXBwaW5nPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgc3ltYm9saWMgbmFtZSBvZiB0aGUKK29iamVjdC10by1kYXRhc3RvcmUgbWFwcGluZyB0byB1c2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTWF4RmV0Y2hEZXB0aCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5NYXhGZXRjaERlcHRoCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLk1heEZldGNoRGVwdGgiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXhGZXRjaERlcHRoCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuTWF4RmV0Y2hEZXB0aCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE1heEZldGNoRGVwdGgKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLk1heEZldGNoRGVwdGgKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0TWF4RmV0Y2hEZXB0aCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRNYXhGZXRjaERlcHRoCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorTWF4RmV0Y2hEZXB0aDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+LTE8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgbWF4aW11bSBkZXB0aCBvZiByZWxhdGlvbnMgdG8KK3RyYXZlcnNlIHdoZW4gZWFnZXIgZmV0Y2hpbmcuIFVzZSAtMSBmb3Igbm8gbGltaXQuIERlZmF1bHRzIHRvIG5vIGxpbWl0LiAgU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXIiLz4gZm9yIGRldGFpbHMgb24gZWFnZXIgZmV0Y2hpbmcuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTWV0YURhdGFGYWN0b3J5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLk1ldGFEYXRhRmFjdG9yeQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5NZXRhRGF0YUZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUZhY3RvcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5NZXRhRGF0YUZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUZhY3RvcnkKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLk1ldGFEYXRhRmFjdG9yeQorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRNZXRhRGF0YUZhY3RvcnkiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0TWV0YURhdGFGYWN0b3J5Cis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorTWV0YURhdGFGYWN0b3J5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiA8bGl0ZXJhbD5qcGE8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBBIHBsdWdpbiBzdHJpbmcgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFGYWN0b3J5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcGVuanBhLm1ldGEuTWV0YURhdGFGYWN0b3J5PC9jbGFzc25hbWU+PC91bGluaz4gdG8gdXNlIHRvIHN0b3JlIGFuZAorcmV0cmlldmUgbWV0YWRhdGEgZm9yIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tZXRhX2ZhY3RvcnkiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTXVsdGl0aHJlYWRlZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5NdWx0aXRocmVhZGVkCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLk11bHRpdGhyZWFkZWQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNdWx0aXRocmVhZGVkCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuTXVsdGl0aHJlYWRlZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHRocmVhZGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBNdWx0aXRocmVhZGVkCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5NdWx0aXRocmVhZGVkCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldE11bHRpdGhyZWFkZWQiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0TXVsdGl0aHJlYWRlZAorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK011bHRpdGhyZWFkZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gV2hldGhlciBwZXJzaXN0ZW50IGluc3RhbmNlcyBhbmQKK09wZW5KUEEgY29tcG9uZW50cyBvdGhlciB0aGFuIHRoZSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+Cit3aWxsIGJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRocmVhZHMgYXQgb25jZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5PcHRpbWlzdGljIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLk9wdGltaXN0aWMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuT3B0aW1pc3RpYyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9wdGltaXN0aWMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5PcHRpbWlzdGljIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG9wdGltaXN0aWMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLk9wdGltaXN0aWMKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0T3B0aW1pc3RpYyI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRPcHRpbWlzdGljCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorT3B0aW1pc3RpYzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFNlbGVjdHMgYmV0d2VlbiBvcHRpbWlzdGljIGFuZAorcGVzc2ltaXN0aWMgKGRhdGFzdG9yZSkgdHJhbnNhY3Rpb25hbCBtb2Rlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5PcnBoYW5lZEtleUFjdGlvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5PcnBoYW5lZEtleUFjdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5PcnBoYW5lZEtleUFjdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9ycGhhbmVkS2V5QWN0aW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuT3JwaGFuZWRLZXlBY3Rpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleXMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgT3JwaGFuZWRLZXlBY3Rpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuT3JwaGFuZWRLZXlBY3Rpb248L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldE9ycGhhbmVkS2V5QWN0aW9uIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldE9ycGhhbmVkS2V5QWN0aW9uCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorT3JwaGFuZWRLZXlBY3Rpb248L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmxvZzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5sb2c8L2xpdGVyYWw+LAorPGxpdGVyYWw+ZXhjZXB0aW9uPC9saXRlcmFsPiwgPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIGEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L09ycGhhbmVkS2V5QWN0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuT3JwaGFuZWRLZXlBY3Rpb248L2NsYXNzbmFtZT48L3VsaW5rPiB0bworaW52b2tlIHdoZW4gT3BlbkpQQSBkaXNjb3ZlcnMgYW4gb3JwaGFuZWQgZGF0YXN0b3JlIGtleS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfb3JwaGFuIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLk5vbnRyYW5zYWN0aW9uYWxSZWFkIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLk5vbnRyYW5zYWN0aW9uYWxSZWFkCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLk5vbnRyYW5zYWN0aW9uYWxSZWFkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgTm9udHJhbnNhY3Rpb25hbFJlYWQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLk5vbnRyYW5zYWN0aW9uYWxSZWFkPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXROb250cmFuc2FjdGlvbmFsUmVhZCI+Cis8bWV0aG9kbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldE5vbnRyYW5zYWN0aW9uYWxSZWFkCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorTm9udHJhbnNhY3Rpb25hbFJlYWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPnRydWU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBXaGV0aGVyIHRoZSBPcGVuSlBBIHJ1bnRpbWUgd2lsbAorYWxsb3cgeW91IHRvIHJlYWQgZGF0YSBvdXRzaWRlIG9mIGEgdHJhbnNhY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuTm9udHJhbnNhY3Rpb25hbFdyaXRlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLk5vbnRyYW5zYWN0aW9uYWxXcml0ZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Ob250cmFuc2FjdGlvbmFsV3JpdGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBOb250cmFuc2FjdGlvbmFsV3JpdGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLk5vbnRyYW5zYWN0aW9uYWxXcml0ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlIj4KKzxtZXRob2RuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0Tm9udHJhbnNhY3Rpb25hbFdyaXRlCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorTm9udHJhbnNhY3Rpb25hbFdyaXRlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFdoZXRoZXIgeW91IGNhbiBtb2RpZnkgcGVyc2lzdGVudAorb2JqZWN0cyBhbmQgcGVyZm9ybSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zIG91dHNpZGUgb2YgYSB0cmFuc2FjdGlvbi4gQ2hhbmdlcword2lsbCB0YWtlIGVmZmVjdCBvbiB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5Qcm94eU1hbmFnZXIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuUHJveHlNYW5hZ2VyCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLlByb3h5TWFuYWdlciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFByb3h5TWFuYWdlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLlByb3h5TWFuYWdlciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHByb3hpZXMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgUHJveHlNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5Qcm94eU1hbmFnZXIKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0UHJveHlNYW5hZ2VyIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldFByb3h5TWFuYWdlcgorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK1Byb3h5TWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZGVmYXVsdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIGEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3V0aWwvUHJveHlNYW5hZ2VyLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5Qcm94eU1hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPiB0byB1c2UgZm9yIHByb3h5aW5nCittdXRhYmxlIHNlY29uZCBjbGFzcyBvYmplY3RzLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5X2N1c3RvbSIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5RdWVyeUNhY2hlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLlF1ZXJ5Q2FjaGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuUXVlcnlDYWNoZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5Q2FjaGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5RdWVyeUNhY2hlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBRdWVyeUNhY2hlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5RdWVyeUNhY2hlCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldFF1ZXJ5Q2FjaGUiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuT3BlbkpQQUNvbmZpZ3VyYXRpb24uZ2V0UXVlcnlDYWNoZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK1F1ZXJ5Q2FjaGU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LCB3aGVuIHRoZSBkYXRhCitjYWNoZSAoc2VlIDx4cmVmIGxpbmtlbmQ9Im9wZW5qcGEuRGF0YUNhY2hlIi8+KSBpcyBhbHNvIGVuYWJsZWQsIDxsaXRlcmFsPgorZmFsc2U8L2xpdGVyYWw+IG90aGVyd2lzZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZGF0YWNhY2hlL1F1ZXJ5Q2FjaGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5kYXRhY2FjaGUuUXVlcnlDYWNoZTwvY2xhc3NuYW1lPjwvdWxpbms+CitpbXBsZW1lbnRhdGlvbiB0byB1c2UgZm9yIGNhY2hpbmcgb2YgcXVlcmllcyBsb2FkZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGVfcXVlcnkiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9Im9wZW5qcGEuUXVlcnlDb21waWxhdGlvbkNhY2hlIj4KKwkJCTx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLlF1ZXJ5Q29tcGlsYXRpb25DYWNoZQorICAgICAgICAgICAgPC90aXRsZT4KKwkJCTxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5RdWVyeUNvbXBpbGF0aW9uQ2FjaGUiPgorCQkJCTxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBRdWVyeUNvbXBpbGF0aW9uQ2FjaGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisJCQk8L2luZGV4dGVybT4KKwkJCTxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5RdWVyeUNvbXBpbGF0aW9uQ2FjaGUiPgorCQkJCTxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorCQkJCTxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFF1ZXJ5Q29tcGlsYXRpb25DYWNoZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorCQkJPC9pbmRleHRlcm0+CisJCQk8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOjwvZW1waGFzaXM+Cis8bGl0ZXJhbD5vcGVuanBhLlF1ZXJ5Q29tcGlsYXRpb25DYWNoZTwvbGl0ZXJhbD4KKwkJCTwvcGFyYT4KKwkJCTxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OjwvZW1waGFzaXM+IAorPGxpdGVyYWw+UXVlcnlDb21waWxhdGlvbkNhY2hlPC9saXRlcmFsPgorCQkJPC9wYXJhPgorCQkJPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKwkJCTwvcGFyYT4KKwkJCTxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlIAorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyB0aGUgCis8Y2xhc3NuYW1lPmphdmEudXRpbC5NYXA8L2NsYXNzbmFtZT4gdG8gdXNlIGZvciBjYWNoaW5nIG9mIGRhdGEgdXNlZCBkdXJpbmcgCitxdWVyeSBjb21waWxhdGlvbi4gIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGVfcXVlcnljb21wIi8+IGZvciBkZXRhaWxzLgorCQkJPC9wYXJhPgorCQk8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLlJlYWRMb2NrTGV2ZWwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuUmVhZExvY2tMZXZlbAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5SZWFkTG9ja0xldmVsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUmVhZExvY2tMZXZlbAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLlJlYWRMb2NrTGV2ZWwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFJlYWRMb2NrTGV2ZWwKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLlJlYWRMb2NrTGV2ZWwKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0UmVhZExvY2tMZXZlbCI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRSZWFkTG9ja0xldmVsCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorUmVhZExvY2tMZXZlbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+cmVhZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5ub25lPC9saXRlcmFsPiwKKzxsaXRlcmFsPnJlYWQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD53cml0ZTwvbGl0ZXJhbD4sIG51bWVyaWMgdmFsdWVzIGZvcgorbG9jay1tYW5hZ2VyIHNwZWNpZmljIGxvY2sgbGV2ZWxzCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgZGVmYXVsdCBsZXZlbCBhdCB3aGljaCB0byBsb2NrCitvYmplY3RzIHJldHJpZXZlZCBkdXJpbmcgYSBub24tb3B0aW1pc3RpYyB0cmFuc2FjdGlvbi4gTm90ZSB0aGF0IGZvciB0aGUgZGVmYXVsdAorSkRCQyBsb2NrIG1hbmFnZXIsIDxsaXRlcmFsPiByZWFkPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+d3JpdGU8L2xpdGVyYWw+IGxvY2sKK2xldmVscyBhcmUgZXF1aXZhbGVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1pdFByb3ZpZGVyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYWNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1pdFByb3ZpZGVyCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBSZW1vdGVDb21taXRQcm92aWRlcgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0UmVtb3RlQ29tbWl0UHJvdmlkZXIiPgorPG1ldGhvZG5hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRSZW1vdGVDb21taXRQcm92aWRlcgorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK1JlbW90ZUNvbW1pdFByb3ZpZGVyPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBBIHBsdWdpbiBzdHJpbmcgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1JlbW90ZUNvbW1pdFByb3ZpZGVyLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuUmVtb3RlQ29tbWl0UHJvdmlkZXI8L2NsYXNzbmFtZT48L3VsaW5rPgoraW1wbGVtZW50YXRpb24gdG8gdXNlIGZvciBkaXN0cmlidXRlZCBldmVudCBub3RpZmljYXRpb24uIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2V2ZW50X2NvbmYiLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuUmVzdG9yZVN0YXRlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLlJlc3RvcmVTdGF0ZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5SZXN0b3JlU3RhdGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBSZXN0b3JlU3RhdGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5SZXN0b3JlU3RhdGUKKzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0UmVzdG9yZVN0YXRlIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldFJlc3RvcmVTdGF0ZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK1Jlc3RvcmVTdGF0ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5ub25lPC9saXRlcmFsPiwKKzxsaXRlcmFsPmltbXV0YWJsZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPmFsbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFdoZXRoZXIgdG8gcmVzdG9yZSBtYW5hZ2VkIGZpZWxkcwordG8gdGhlaXIgcHJlLXRyYW5zYWN0aW9uIHZhbHVlcyB3aGVuIGEgcm9sbGJhY2sgb2NjdXJzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLlJldGFpblN0YXRlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLlJldGFpblN0YXRlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLlJldGFpblN0YXRlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUmV0YWluU3RhdGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+b3BlbmpwYS5SZXRhaW5TdGF0ZQorPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2NvbmYvT3BlbkpQQUNvbmZpZ3VyYXRpb24uaHRtbCNnZXRSZXRhaW5TdGF0ZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRSZXRhaW5TdGF0ZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK1JldGFpblN0YXRlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD50cnVlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gV2hldGhlciBwZXJzaXN0ZW50IGZpZWxkcyByZXRhaW4KK3RoZWlyIHZhbHVlcyBvbiB0cmFuc2FjdGlvbiBjb21taXQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuUmV0cnlDbGFzc1JlZ2lzdHJhdGlvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5SZXRyeUNsYXNzUmVnaXN0cmF0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLlJldHJ5Q2xhc3NSZWdpc3RyYXRpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBSZXRyeUNsYXNzUmVnaXN0cmF0aW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuUmV0cnlDbGFzc1JlZ2lzdHJhdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuUmV0cnlDbGFzc1JlZ2lzdHJhdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0UmV0cnlDbGFzc1JlZ2lzdHJhdGlvbiI+Cis8bWV0aG9kbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldFJldHJ5Q2xhc3NSZWdpc3RyYXRpb24KKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitSZXRyeUNsYXNzUmVnaXN0cmF0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IENvbnRyb2xzIHdoZXRoZXIgdG8gbG9nIGEgd2FybmluZworYW5kIGRlZmVyIHJlZ2lzdHJhdGlvbiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB3aGVuIGEgcGVyc2lzdGVudCBjbGFzcworY2Fubm90IGJlIGZ1bGx5IHByb2Nlc3NlZC4gVGhpcyBwcm9wZXJ0eSBzaG91bGQgPGVtcGhhc2lzPm9ubHk8L2VtcGhhc2lzPiBiZQordXNlZCBpbiBjb21wbGV4IGNsYXNzbG9hZGVyIHNpdHVhdGlvbnMgd2hlcmUgc2VjdXJpdHkgaXMgcHJldmVudGluZyBPcGVuSlBBIGZyb20KK3JlYWRpbmcgcmVnaXN0ZXJlZCBjbGFzc2VzLiBTZXR0aW5nIHRoaXMgdG8gdHJ1ZSB1bm5lY2Vzc2FyaWx5IG1heSBvYnNjdXJlIG1vcmUKK3NlcmlvdXMgcHJvYmxlbXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuU2F2ZXBvaW50TWFuYWdlciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5TYXZlcG9pbnRNYW5hZ2VyCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuU2F2ZXBvaW50TWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9jb25mL09wZW5KUEFDb25maWd1cmF0aW9uLmh0bWwjZ2V0U2F2ZXBvaW50TWFuYWdlciI+CitvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRTYXZlcG9pbnRNYW5hZ2VyPC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OjwvZW1waGFzaXM+CitTYXZlcG9pbnRNYW5hZ2VyCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmluLW1lbTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5pbi1tZW08L2xpdGVyYWw+LAorPGxpdGVyYWw+amRiYzwvbGl0ZXJhbD4sIDxsaXRlcmFsPm9yYWNsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIGEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TYXZlcG9pbnRNYW5hZ2VyLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlNhdmVwb2ludE1hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPiB0byAKK3VzZSBmb3IgbWFuYWdpbmcgdHJhbnNhY3Rpb24gc2F2ZXBvaW50cy4gU2VlIAorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3NhdmVwb2ludHMiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuU2VxdWVuY2UiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuU2VxdWVuY2UKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuU2VxdWVuY2UiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLlNlcXVlbmNlCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldFNlcXVlbmNlIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldFNlcXVlbmNlCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorU2VxdWVuY2U8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBwbHVnaW4gc3RyaW5nIChzZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIGRlc2NyaWJpbmcgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2VxLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlNlcTwvY2xhc3NuYW1lPjwvdWxpbms+IGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgdGhlCitzeXN0ZW0gc2VxdWVuY2UuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfc2VxdWVuY2UiLz4gZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLlRyYW5zYWN0aW9uTW9kZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5UcmFuc2FjdGlvbk1vZGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuVHJhbnNhY3Rpb25Nb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Nb2RlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuVHJhbnNhY3Rpb25Nb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uTW9kZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuVHJhbnNhY3Rpb25Nb2RlCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldFRyYW5zYWN0aW9uTW9kZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbi5nZXRUcmFuc2FjdGlvbk1vZGUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitUcmFuc2FjdGlvbk1vZGU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPmxvY2FsPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPmxvY2FsPC9saXRlcmFsPiwKKzxsaXRlcmFsPm1hbmFnZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgZGVmYXVsdCB0cmFuc2FjdGlvbiBtb2RlIHRvCit1c2UuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIHBlci1zZXNzaW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLldyaXRlTG9ja0xldmVsIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLldyaXRlTG9ja0xldmVsCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLldyaXRlTG9ja0xldmVsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVMb2NrTGV2ZWwKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5Xcml0ZUxvY2tMZXZlbCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGxvY2tpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVMb2NrTGV2ZWwKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLldyaXRlTG9ja0xldmVsCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvY29uZi9PcGVuSlBBQ29uZmlndXJhdGlvbi5odG1sI2dldFdyaXRlTG9ja0xldmVsIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5jb25mLk9wZW5KUEFDb25maWd1cmF0aW9uLmdldFdyaXRlTG9ja0xldmVsCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorV3JpdGVMb2NrTGV2ZWw8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPndyaXRlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm5vbmU8L2xpdGVyYWw+LAorPGxpdGVyYWw+cmVhZDwvbGl0ZXJhbD4sIDxsaXRlcmFsPndyaXRlPC9saXRlcmFsPiwgbnVtZXJpYyB2YWx1ZXMgZm9yCitsb2NrLW1hbmFnZXIgc3BlY2lmaWMgbG9jayBsZXZlbHMKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBkZWZhdWx0IGxldmVsIGF0IHdoaWNoIHRvIGxvY2sKK29iamVjdHMgY2hhbmdlZCBkdXJpbmcgYSBub24tb3B0aW1pc3RpYyB0cmFuc2FjdGlvbi4gTm90ZSB0aGF0IGZvciB0aGUgZGVmYXVsdAorSkRCQyBsb2NrIG1hbmFnZXIsIDxsaXRlcmFsPiByZWFkPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+d3JpdGU8L2xpdGVyYWw+IGxvY2sKK2xldmVscyBhcmUgZXF1aXZhbGVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2NvbmZfamRiYyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE9wZW5KUEEgSkRCQyBQcm9wZXJ0aWVzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2NvbmZfamRiYyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIG9mIEpEQkMgcHJvcGVydGllcworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcHBseSBleGNsdXNpdmVseSB0byB0aGUgT3BlbkpQQSBKREJDIGJhY2stZW5kLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuQ29ubmVjdGlvbkRlY29yYXRvcnMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuamRiYy5Db25uZWN0aW9uRGVjb3JhdG9ycworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkNvbm5lY3Rpb25EZWNvcmF0b3JzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRlY29yYXRvcnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkNvbm5lY3Rpb25EZWNvcmF0b3JzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRlY29yYXRvcnMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5Db25uZWN0aW9uRGVjb3JhdG9yczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb24uaHRtbCNnZXRDb25uZWN0aW9uRGVjb3JhdG9ycyI+Cis8bWV0aG9kbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbkRlY29yYXRvcnMKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitDb25uZWN0aW9uRGVjb3JhdG9yczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwbHVnaW4KK3N0cmluZ3MgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9Db25uZWN0aW9uRGVjb3JhdG9yLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEubGliLmpkYmMuQ29ubmVjdGlvbkRlY29yYXRvcjwvY2xhc3NuYW1lPjwvdWxpbms+CitpbnN0YW5jZXMgdG8gaW5zdGFsbCBvbiB0aGUgY29ubmVjdGlvbiBmYWN0b3J5LiBUaGVzZSBkZWNvcmF0b3JzIGNhbiB3cmFwCitjb25uZWN0aW9ucyBwYXNzZWQgZnJvbSB0aGUgdW5kZXJseWluZyA8Y2xhc3NuYW1lPkRhdGFTb3VyY2U8L2NsYXNzbmFtZT4gdG8gYWRkCitmdW5jdGlvbmFsaXR5LiBPcGVuSlBBIHdpbGwgcGFzcyBhbGwgY29ubmVjdGlvbnMgdGhyb3VnaCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzCitiZWZvcmUgdXNpbmcgdGhlbS4gTm90ZSB0aGF0IGJ5IGRlZmF1bHQgT3BlbkpQQSBlbXBsb3lzIGFsbAorb2YgdGhlIGJ1aWx0LWluIGRlY29yYXRvcnMgaW4gdGhlIDxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmxpYi5qZGJjCis8L2NsYXNzbmFtZT4gcGFja2FnZSBhbHJlYWR5OyB5b3UgZG8gbm90IG5lZWQgdG8gbGlzdCB0aGVtIGhlcmUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBEQkRpY3Rpb25hcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgREJEaWN0aW9uYXJ5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sI2dldERCRGljdGlvbmFyeSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uLmdldERCRGljdGlvbmFyeQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0RCRGljdGlvbmFyeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gQmFzZWQgb24gdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25VUkwiPjxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvblVSTDwvbGl0ZXJhbD4KKzwvbGluaz48bGluayBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lIj48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU8L2xpdGVyYWw+PC9saW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBwbHVnaW4gc3RyaW5nIChzZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIGRlc2NyaWJpbmcgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9EQkRpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk8L2NsYXNzbmFtZT48L3VsaW5rPiB0byB1c2UKK2ZvciBkYXRhYmFzZSBpbnRlcmFjdGlvbi4gT3BlbkpQQSB0eXBpY2FsbHkgYXV0by1jb25maWd1cmVzIHRoZSBkaWN0aW9uYXJ5IGJhc2VkCitvbiB0aGUgSkRCQyBVUkwsIGJ1dCB5b3UgbWF5IGhhdmUgdG8gc2V0IHRoaXMgcHJvcGVydHkgZXhwbGljaXRseSBpZiB5b3UgYXJlCit1c2luZyBhbiB1bnJlY29nbml6ZWQgZHJpdmVyLCBvciB0byBwbHVnIGluIHlvdXIgb3duIGRpY3Rpb25hcnkgZm9yIGEgZGF0YWJhc2UKK09wZW5KUEEgZG9lcyBub3Qgc3VwcG9ydCBvdXQtb2YtdGhlLWJveC4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF9kYnN1cHBvcnQiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuamRiYy5Ecml2ZXJEYXRhU291cmNlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLmpkYmMuRHJpdmVyRGF0YVNvdXJjZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkRyaXZlckRhdGFTb3VyY2UiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBEcml2ZXJEYXRhU291cmNlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5Ecml2ZXJEYXRhU291cmNlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSkRCQworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBEcml2ZXJEYXRhU291cmNlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuRHJpdmVyRGF0YVNvdXJjZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb24uaHRtbCNnZXREcml2ZXJEYXRhU291cmNlIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0RHJpdmVyRGF0YVNvdXJjZQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0RyaXZlckRhdGFTb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPnBvb2xpbmc8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgYWxpYXMgb3IgZnVsbCBjbGFzcyBuYW1lIG9mCit0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0RyaXZlckRhdGFTb3VyY2UuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5Ecml2ZXJEYXRhU291cmNlPC9jbGFzc25hbWU+PC91bGluaz4KK2ltcGxlbWVudGF0aW9uIHRvIHVzZSB0byB3cmFwIEpEQkMgRHJpdmVyIGNsYXNzZXMgd2l0aCBqYXZheC5zcWwuRGF0YVNvdXJjZQoraW5zdGFuY2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuRWFnZXJGZXRjaE1vZGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuamRiYy5FYWdlckZldGNoTW9kZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkVhZ2VyRmV0Y2hNb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRWFnZXJGZXRjaE1vZGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkVhZ2VyRmV0Y2hNb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgRWFnZXJGZXRjaE1vZGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5FYWdlckZldGNoTW9kZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb24uaHRtbCNnZXRFYWdlckZldGNoTW9kZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uLmdldEVhZ2VyRmV0Y2hNb2RlCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorRWFnZXJGZXRjaE1vZGU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OiA8L2VtcGhhc2lzPjxsaXRlcmFsPnBhcmFsbGVsPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPnBhcmFsbGVsPC9saXRlcmFsPiwKKzxsaXRlcmFsPmpvaW48L2xpdGVyYWw+LCA8bGl0ZXJhbD5ub25lPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gT3B0aW1pemVzIGhvdyBPcGVuSlBBIGxvYWRzCitwZXJzaXN0ZW50IHJlbGF0aW9ucy4gVGhpcyBzZXR0aW5nIGNhbiBhbHNvIGJlIHZhcmllZCBhdCBydW50aW1lLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wZXJmcGFja19lYWdlciIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5qZGJjLkZldGNoRGlyZWN0aW9uIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLmpkYmMuRmV0Y2hEaXJlY3Rpb24KKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5GZXRjaERpcmVjdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEZldGNoRGlyZWN0aW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5GZXRjaERpcmVjdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEZldGNoRGlyZWN0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuRmV0Y2hEaXJlY3Rpb248L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0RmV0Y2hEaXJlY3Rpb24iPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbi5nZXRGZXRjaERpcmVjdGlvbgorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK0ZldGNoRGlyZWN0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5mb3J3YXJkPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPmZvcndhcmQ8L2xpdGVyYWw+LAorPGxpdGVyYWw+cmV2ZXJzZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPnVua25vd248L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgZXhwZWN0ZWQgb3JkZXIgaW4gd2hpY2ggcXVlcnkKK3Jlc3VsdCBsaXN0cyB3aWxsIGJlIGFjY2Vzc2VkLiBUaGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHZhcmllZCBhdCBydW50aW1lLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX2xycyIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5qZGJjLkpEQkNMaXN0ZW5lcnMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuamRiYy5KREJDTGlzdGVuZXJzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuSkRCQ0xpc3RlbmVycyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpEQkNMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkpEQkNMaXN0ZW5lcnMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBKREJDCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEpEQkNMaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5KREJDTGlzdGVuZXJzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sI2dldEpEQkNMaXN0ZW5lcnMiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbi5nZXRKREJDTGlzdGVuZXJzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorSkRCQ0xpc3RlbmVyczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwbHVnaW4KK3N0cmluZ3MgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9saWIvamRiYy9KREJDTGlzdGVuZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5saWIuamRiYy5KREJDTGlzdGVuZXI8L2NsYXNzbmFtZT48L3VsaW5rPiBldmVudAorbGlzdGVuZXJzIHRvIGluc3RhbGwuIFRoZXNlIGxpc3RlbmVycyB3aWxsIGJlIG5vdGlmaWVkIG9uIHZhcmlvdXMgSkRCQy1yZWxhdGVkCitldmVudHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuamRiYy5MUlNTaXplIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLmpkYmMuTFJTU2l6ZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLkxSU1NpemUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBMUlNTaXplCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5MUlNTaXplIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbGFyZ2UgcmVzdWx0IHNldHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgTFJTU2l6ZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuamRiYy5MUlNTaXplCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0TFJTU2l6ZSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uLmdldExSU1NpemUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitMUlNTaXplPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5xdWVyeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5xdWVyeTwvbGl0ZXJhbD4sCis8bGl0ZXJhbD5sYXN0PC9saXRlcmFsPiwgPGxpdGVyYWw+dW5rbm93bjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBzdHJhdGVneSB0byB1c2UgdG8gY2FsY3VsYXRlCit0aGUgc2l6ZSBvZiBhIHJlc3VsdCBsaXN0LiBUaGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHZhcmllZCBhdCBydW50aW1lLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX2xycyIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5qZGJjLk1hcHBpbmdEZWZhdWx0cyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLk1hcHBpbmdEZWZhdWx0cworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLk1hcHBpbmdEZWZhdWx0cyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdEZWZhdWx0cworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuTWFwcGluZ0RlZmF1bHRzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXBwaW5nRGVmYXVsdHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5NYXBwaW5nRGVmYXVsdHM8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0TWFwcGluZ0RlZmF1bHRzIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0TWFwcGluZ0RlZmF1bHRzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorTWFwcGluZ0RlZmF1bHRzPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiBqcGEKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL01hcHBpbmdEZWZhdWx0cy5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nRGVmYXVsdHM8L2NsYXNzbmFtZT48L3VsaW5rPiB0bwordXNlIHRvIGRlZmluZSBkZWZhdWx0IGNvbHVtbiBuYW1lcywgdGFibGUgbmFtZXMsIGFuZCBjb25zdHJhaW50cyBmb3IgeW91cgorcGVyc2lzdGVudCBjbGFzc2VzLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfZmFjdG9yeSIvPiBmb3IKK2RldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuamRiYy5NYXBwaW5nRmFjdG9yeSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLk1hcHBpbmdGYWN0b3J5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuTWFwcGluZ0ZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNYXBwaW5nRmFjdG9yeQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuTWFwcGluZ0ZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdGYWN0b3J5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlByb3BlcnR5IG5hbWU6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuTWFwcGluZ0ZhY3Rvcnk8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0TWFwcGluZ0ZhY3RvcnkiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbi5nZXRNYXBwaW5nRmFjdG9yeQorPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK01hcHBpbmdGYWN0b3J5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBBIHBsdWdpbiBzdHJpbmcgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvTWV0YURhdGFGYWN0b3J5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5NZXRhRGF0YUZhY3Rvcnk8L2NsYXNzbmFtZT48L3VsaW5rPiB0byB1c2UgdG8KK3N0b3JlIGFuZCByZXRyaWV2ZSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB5b3VyIHBlcnNpc3RlbnQKK2NsYXNzZXMuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19mYWN0b3J5Ii8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuUmVzdWx0U2V0VHlwZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLlJlc3VsdFNldFR5cGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5SZXN1bHRTZXRUeXBlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0U2V0VHlwZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuUmVzdWx0U2V0VHlwZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFJlc3VsdFNldFR5cGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5SZXN1bHRTZXRUeXBlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sI2dldFJlc3VsdFNldFR5cGUiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbi5nZXRSZXN1bHRTZXRUeXBlCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorUmVzdWx0U2V0VHlwZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+Zm9yd2FyZC1vbmx5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UG9zc2libGUgdmFsdWVzOiA8L2VtcGhhc2lzPjxsaXRlcmFsPmZvcndhcmQtb25seTwvbGl0ZXJhbD4KKywgPGxpdGVyYWw+c2Nyb2xsLXNlbnNpdGl2ZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPnNjcm9sbC1pbnNlbnNpdGl2ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IFRoZSBKREJDIHJlc3VsdCBzZXQgdHlwZSB0byB1c2UKK3doZW4gZmV0Y2hpbmcgcmVzdWx0IGxpc3RzLiBUaGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlIHZhcmllZCBhdCBydW50aW1lLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX2xycyIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5qZGJjLlNjaGVtYSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLlNjaGVtYQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLlNjaGVtYSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBTY2hlbWEKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLmpkYmMuU2NoZW1hCis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0U2NoZW1hIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0U2NoZW1hCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorU2NoZW1hPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDo8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBUaGUgZGVmYXVsdCBzY2hlbWEgbmFtZSB0byBwcmVwZW5kCit0byB1bnF1YWxpZmllZCB0YWJsZSBuYW1lcy4gQWxzbywgdGhlIHNjaGVtYSBpbiB3aGljaCBPcGVuSlBBIHdpbGwgY3JlYXRlIG5ldwordGFibGVzLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV9kZWYiLz4gZm9yIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9Im9wZW5qcGEuamRiYy5TY2hlbWFGYWN0b3J5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLmpkYmMuU2NoZW1hRmFjdG9yeQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLlNjaGVtYUZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBTY2hlbWFGYWN0b3J5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5TY2hlbWFGYWN0b3J5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYUZhY3RvcnkKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5TY2hlbWFGYWN0b3J5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sI2dldFNjaGVtYUZhY3RvcnkiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbi5nZXRTY2hlbWFGYWN0b3J5Cis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorU2NoZW1hRmFjdG9yeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZHluYW1pYzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5keW5hbWljPC9saXRlcmFsPiwKKzxsaXRlcmFsPm5hdGl2ZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPmZpbGU8L2xpdGVyYWw+LCA8bGl0ZXJhbD50YWJsZTwvbGl0ZXJhbD4sCitvdGhlcnMKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IEEgcGx1Z2luIHN0cmluZyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hRmFjdG9yeS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYUZhY3Rvcnk8L2NsYXNzbmFtZT48L3VsaW5rPiB0bwordXNlIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YWJhc2Ugc2NoZW1hLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfaW5mb19mYWN0b3J5Ii8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuU2NoZW1hcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLlNjaGVtYXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5TY2hlbWFzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD5vcGVuanBhLmpkYmMuU2NoZW1hcworPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sI2dldFNjaGVtYXMiPgorPG1ldGhvZG5hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuY29uZi5KREJDQ29uZmlndXJhdGlvbi5nZXRTY2hlbWFzCis8L21ldGhvZG5hbWU+PC91bGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlJlc291cmNlIGFkYXB0b3IgY29uZmlnLXByb3BlcnR5OiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorU2NoZW1hczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUKK3NjaGVtYXMgYW5kL29yIHRhYmxlcyB1c2VkIGZvciB5b3VyIHBlcnNpc3RlbnQgZGF0YS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfc2NoZW1hX2luZm9fbGlzdCIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5qZGJjLlNRTEZhY3RvcnkiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuamRiYy5TUUxGYWN0b3J5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuU1FMRmFjdG9yeSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFNRTEZhY3RvcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLlNRTEZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBTUUwKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgU1FMRmFjdG9yeQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPm9wZW5qcGEuamRiYy5TUUxGYWN0b3J5Cis8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0U1FMRmFjdG9yeSI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uLmdldFNRTEZhY3RvcnkKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitTUUxGYWN0b3J5PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5kZWZhdWx0PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gQSBwbHVnaW4gc3RyaW5nIChzZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIGRlc2NyaWJpbmcgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9TUUxGYWN0b3J5Lmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuU1FMRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+IHRvIHVzZSB0byBhYnN0cmFjdAorY29tbW9uIFNRTCBjb25zdHJ1Y3RzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuU3ViY2xhc3NGZXRjaE1vZGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIG9wZW5qcGEuamRiYy5TdWJjbGFzc0ZldGNoTW9kZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLlN1YmNsYXNzRmV0Y2hNb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgU3ViY2xhc3NGZXRjaE1vZGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ib3BlbmpwYS5qZGJjLlN1YmNsYXNzRmV0Y2hNb2RlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgU3ViY2xhc3NGZXRjaE1vZGUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuU3ViY2xhc3NGZXRjaE1vZGUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBTdWJjbGFzc0ZldGNoTW9kZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLlN1YmNsYXNzRmV0Y2hNb2RlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Q29uZmlndXJhdGlvbiBBUEk6PC9lbXBoYXNpcz4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sI2dldFN1YmNsYXNzRmV0Y2hNb2RlIj4KKzxtZXRob2RuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0U3ViY2xhc3NGZXRjaE1vZGUKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitTdWJjbGFzc0ZldGNoTW9kZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+cGFyYWxsZWw8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qb3NzaWJsZSB2YWx1ZXM6IDwvZW1waGFzaXM+PGxpdGVyYWw+cGFyYWxsZWw8L2xpdGVyYWw+LAorPGxpdGVyYWw+am9pbjwvbGl0ZXJhbD4sIDxsaXRlcmFsPm5vbmU8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZXNjcmlwdGlvbjo8L2VtcGhhc2lzPiBIb3cgdG8gc2VsZWN0IHN1YmNsYXNzIGRhdGEgd2hlbgoraXQgaXMgaW4gb3RoZXIgdGFibGVzLiBUaGlzIHNldHRpbmcgY2FuIGFsc28gYmUgdmFyaWVkIGF0IHJ1bnRpbWUuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BlcmZwYWNrX2VhZ2VyIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuU3luY2hyb25pemVNYXBwaW5ncyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3MKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5TeW5jaHJvbml6ZU1hcHBpbmdzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgU3luY2hyb25pemVNYXBwaW5ncworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuU3luY2hyb25pemVNYXBwaW5ncyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgU3luY2hyb25pemVNYXBwaW5ncworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3M8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0U3luY2hyb25pemVNYXBwaW5ncyI+Cis8bWV0aG9kbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0U3luY2hyb25pemVNYXBwaW5ncworPC9tZXRob2RuYW1lPjwvdWxpbms+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5SZXNvdXJjZSBhZGFwdG9yIGNvbmZpZy1wcm9wZXJ0eTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK1N5bmNocm9uaXplTWFwcGluZ3M8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5EZWZhdWx0OjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlc2NyaXB0aW9uOjwvZW1waGFzaXM+IENvbnRyb2xzIHdoZXRoZXIgT3BlbkpQQSB3aWxsCithdHRlbXB0IHRvIHJ1biB0aGUgbWFwcGluZyB0b29sIG9uIGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgdG8gc3luY2hyb25pemUgdGhlaXIKK21hcHBpbmdzIGFuZCBzY2hlbWEgYXQgcnVudGltZS4gVXNlZnVsIGZvciByYXBpZCB0ZXN0L2RlYnVnIGN5Y2xlcy4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19zeW5jaCIvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0ib3BlbmpwYS5qZGJjLlRyYW5zYWN0aW9uSXNvbGF0aW9uIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBvcGVuanBhLmpkYmMuVHJhbnNhY3Rpb25Jc29sYXRpb24KKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5UcmFuc2FjdGlvbklzb2xhdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSXNvbGF0aW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5UcmFuc2FjdGlvbklzb2xhdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklzb2xhdGlvbgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5UcmFuc2FjdGlvbklzb2xhdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Jc29sYXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UHJvcGVydHkgbmFtZTogPC9lbXBoYXNpcz48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5UcmFuc2FjdGlvbklzb2xhdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkNvbmZpZ3VyYXRpb24gQVBJOjwvZW1waGFzaXM+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2NvbmYvSkRCQ0NvbmZpZ3VyYXRpb24uaHRtbCNnZXRUcmFuc2FjdGlvbklzb2xhdGlvbiI+Cis8bWV0aG9kbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmNvbmYuSkRCQ0NvbmZpZ3VyYXRpb24uZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb24KKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitUcmFuc2FjdGlvbklzb2xhdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPkRlZmF1bHQ6IDwvZW1waGFzaXM+PGxpdGVyYWw+ZGVmYXVsdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlBvc3NpYmxlIHZhbHVlczogPC9lbXBoYXNpcz48bGl0ZXJhbD5kZWZhdWx0PC9saXRlcmFsPiwKKzxsaXRlcmFsPm5vbmU8L2xpdGVyYWw+LCA8bGl0ZXJhbD5yZWFkLWNvbW1pdHRlZDwvbGl0ZXJhbD4sIDxsaXRlcmFsPgorcmVhZC11bmNvbW1pdHRlZDwvbGl0ZXJhbD4sIDxsaXRlcmFsPnJlcGVhdGFibGUtcmVhZDwvbGl0ZXJhbD4sIDxsaXRlcmFsPgorc2VyaWFsaXphYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhlIEpEQkMgdHJhbnNhY3Rpb24gaXNvbGF0aW9uCitsZXZlbCB0byB1c2UuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF9pc29sYXRpb24iLz4gZm9yCitkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJvcGVuanBhLmpkYmMuVXBkYXRlTWFuYWdlciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgb3BlbmpwYS5qZGJjLlVwZGF0ZU1hbmFnZXIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9Im9wZW5qcGEuamRiYy5VcGRhdGVNYW5hZ2VyIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJvcGVuanBhLmpkYmMuVXBkYXRlTWFuYWdlciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlTWFuYWdlcgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9wZXJ0eSBuYW1lOiA8L2VtcGhhc2lzPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLlVwZGF0ZU1hbmFnZXI8L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcyByb2xlPSJib2xkIj5Db25maWd1cmF0aW9uIEFQSTo8L2VtcGhhc2lzPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9jb25mL0pEQkNDb25maWd1cmF0aW9uLmh0bWwjZ2V0VXBkYXRlTWFuYWdlciI+Cis8bWV0aG9kbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5jb25mLkpEQkNDb25maWd1cmF0aW9uLmdldFVwZGF0ZU1hbmFnZXIKKzwvbWV0aG9kbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+UmVzb3VyY2UgYWRhcHRvciBjb25maWctcHJvcGVydHk6IDwvZW1waGFzaXM+PGxpdGVyYWw+CitVcGRhdGVNYW5hZ2VyPC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVmYXVsdDogPC9lbXBoYXNpcz48bGl0ZXJhbD5kZWZhdWx0PC9saXRlcmFsPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+RGVzY3JpcHRpb246PC9lbXBoYXNpcz4gVGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1VwZGF0ZU1hbmFnZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5VcGRhdGVNYW5hZ2VyPC9jbGFzc25hbWU+PC91bGluaz4gdG8KK3VzZSB0byBmbHVzaCBwZXJzaXN0ZW50IG9iamVjdCBjaGFuZ2VzIHRvIHRoZSBkYXRhc3RvcmUuIFRoZSBwcm92aWRlZCBkZWZhdWx0CitpbXBsZW1lbnRhdGlvbiBpcworPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvT3BlcmF0aW9uT3JkZXJVcGRhdGVNYW5hZ2VyIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLk9wZXJhdGlvbk9yZGVyVXBkYXRlTWFuYWdlcjwvY2xhc3NuYW1lPgorPC91bGluaz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfZGJzZXR1cC54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfZGJzZXR1cC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyYmI3NgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9kYnNldHVwLnhtbApAQCAtMCwwICsxLDQwMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9InJlZl9ndWlkZV9kYnNldHVwIj4KKyAgICA8dGl0bGU+CisgICAgICAgIEpEQkMKKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2Ric2V0dXAiPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIEpEQkMKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxwYXJhPgorT3BlbkpQQSB1c2VzIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBmb3Igb2JqZWN0IHBlcnNpc3RlbmNlLgorSXQgY29tbXVuaWNhdGVzIHdpdGggdGhlIGRhdGFiYXNlIHVzaW5nIHRoZSBKYXZhIERhdGFCYXNlIENvbm5lY3Rpdml0eSAoSkRCQykKK0FQSXMuIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgaG93IHRvIGNvbmZpZ3VyZSBPcGVuSlBBIHRvIHdvcmsgd2l0aCB0aGUgSkRCQworZHJpdmVyIGZvciB5b3VyIGRhdGFiYXNlLCBhbmQgaG93IHRvIGFjY2VzcyBKREJDIGZ1bmN0aW9uYWxpdHkgYXQgcnVudGltZS4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kYnNldHVwX2J1aWx0aW4iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBVc2luZyB0aGUgT3BlbkpQQSBEYXRhU291cmNlCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2Ric2V0dXBfYnVpbHRpbiI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBEYXRhU291cmNlCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIE9wZW5KUEEKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBEYXRhU291cmNlCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgaW5jbHVkZXMgaXRzIG93biBzaW1wbGUgPGNsYXNzbmFtZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvY2xhc3NuYW1lPgoraW1wbGVtZW50YXRpb24uICBJZiB5b3UgY2hvb3NlIHRvIHVzZSBPcGVuSlBBJ3MgPGNsYXNzbmFtZT5EYXRhU291cmNlCis8L2NsYXNzbmFtZT4sIHRoZW4geW91IG11c3Qgc3BlY2lmeSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25Vc2VyTmFtZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb25Vc2VyTmFtZTwvbGl0ZXJhbD46IFRoZSBKREJDIHVzZXIgbmFtZSBmb3IKK2Nvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQ8L2xpdGVyYWw+OiBUaGUgSkRCQyBwYXNzd29yZCBmb3IgdGhlIGFib3ZlCit1c2VyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uVVJMCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvblVSTDwvbGl0ZXJhbD46IFRoZSBKREJDIFVSTCBmb3IgdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRHJpdmVyTmFtZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lPC9saXRlcmFsPjogVGhlIEpEQkMgZHJpdmVyIGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RvIGNvbmZpZ3VyZSBhZHZhbmNlZCBmZWF0dXJlcywgdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwKK3Byb3BlcnRpZXMuIFRoZSBzeW50YXggb2YgdGhlc2UgcHJvcGVydHkgc3RyaW5ncyBmb2xsb3dzIHRoZSBzeW50YXggb2YgT3BlbkpQQQorcGx1Z2luIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25Qcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMiPjxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uUHJvcGVydGllczwvbGl0ZXJhbD48L2xpbms+OiBJZiB0aGUgbGlzdGVkIGRyaXZlciBpcyBhbgoraW5zdGFuY2Ugb2YgPGNsYXNzbmFtZT5qYXZhLnNxbC5Ecml2ZXI8L2NsYXNzbmFtZT4sIHRoaXMgc3RyaW5nIHdpbGwgYmUgcGFyc2VkCitpbnRvIGEgPGNsYXNzbmFtZT5Qcm9wZXJ0aWVzPC9jbGFzc25hbWU+IGluc3RhbmNlLCB3aGljaCB3aWxsIHRoZW4gYmUgdXNlZCB0bworb2J0YWluIGRhdGFiYXNlIGNvbm5lY3Rpb25zIHRocm91Z2ggdGhlIDxtZXRob2RuYW1lPkRyaXZlci5jb25uZWN0KFN0cmluZyB1cmwsCitQcm9wZXJ0aWVzIHByb3BzKTwvbWV0aG9kbmFtZT4gbWV0aG9kLiBJZiwgb24gdGhlIG90aGVyIGhhbmQsIHRoZSBsaXN0ZWQgZHJpdmVyCitpcyBhIDxjbGFzc25hbWU+IGphdmF4LnNxbC5EYXRhU291cmNlPC9jbGFzc25hbWU+LCB0aGUgc3RyaW5nIHdpbGwgYmUgdHJlYXRlZAorYXMgYSBwbHVnaW4gcHJvcGVydGllcyBzdHJpbmcsIGFuZCBtYXRjaGVkIHRvIHRoZSBiZWFuIHNldHRlciBtZXRob2RzIG9mIHRoZQorPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+IGluc3RhbmNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXMiPjxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeVByb3BlcnRpZXM8L2xpdGVyYWw+PC9saW5rPjogT3BlbkpQQSdzIGJ1aWx0LWluCis8Y2xhc3NuYW1lPkRhdGFTb3VyY2U8L2NsYXNzbmFtZT4gYWxsb3dzIHlvdSB0byBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb25zIHZpYQordGhpcyBwbHVnaW4gc3RyaW5nOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlF1ZXJ5VGltZW91dDwvbGl0ZXJhbD46IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRoZSBKREJDIGRyaXZlcgord2lsbCB3YWl0IGZvciBhIHN0YXRlbWVudCB0byBleGVjdXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV0dHlQcmludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5QcmV0dHlQcmludDwvbGl0ZXJhbD46IEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHByZXR0eS1wcmludAorbG9nZ2VkIFNRTCBzdGF0ZW1lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV0dHlQcmludExpbmVMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+UHJldHR5UHJpbnRMaW5lTGVuZ3RoPC9saXRlcmFsPjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4KK2VhY2ggcHJldHR5LXByaW50ZWQgU1FMIGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9kYnNldHVwX2J1aWx0aW5fZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgZm9yIHRoZSBPcGVuSlBBIERhdGFTb3VyY2UKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uVXNlck5hbWUiIHZhbHVlPSJ1c2VyIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uUGFzc3dvcmQiIHZhbHVlPSJwYXNzIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uVVJMIiB2YWx1ZT0iamRiYzpoc3FsZGI6ZGItaHlwZXJzb25pYyIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUiIHZhbHVlPSJvcmcuaHNxbGRiLmpkYmNEcml2ZXIiLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcyIgCisgICAgdmFsdWU9IlByZXR0eVByaW50PXRydWUsIFByZXR0eVByaW50TGluZUxlbmd0aD04MCIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFVzaW5nIGEgVGhpcmQtUGFydHkgRGF0YVNvdXJjZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kYnNldHVwX2J1aWx0aW4iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICB0aGlyZCBwYXJ0eQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1lvdSBjYW4gdXNlIE9wZW5KUEEgd2l0aCBhbnkgdGhpcmQtcGFydHkgPGNsYXNzbmFtZT5qYXZheC5zcWwuRGF0YVNvdXJjZQorPC9jbGFzc25hbWU+LiBUaGVyZSBhcmUgbXVsdGlwbGUgd2F5cyBvZiB0ZWxsaW5nIE9wZW5KUEEgYWJvdXQgYSA8Y2xhc3NuYW1lPgorRGF0YVNvdXJjZTwvY2xhc3NuYW1lPjoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorU2V0IHRoZSA8Y2xhc3NuYW1lPkRhdGFTb3VyY2U8L2NsYXNzbmFtZT4gaW50byB0aGUgbWFwIHBhc3NlZCB0byA8bWV0aG9kbmFtZT4KK1BlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5PC9tZXRob2RuYW1lPiB1bmRlciB0aGUKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkiPjxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnkKKzwvbGl0ZXJhbD48L2xpbms+IGtleS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnlOYW1lCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KK0JpbmQgdGhlIDxjbGFzc25hbWU+RGF0YVNvdXJjZTwvY2xhc3NuYW1lPiBpbnRvIEpOREksIGFuZCB0aGVuIHNwZWNpZnkgaXRzCitsb2NhdGlvbiBpbiB0aGUgPGxpdGVyYWw+anRhLWRhdGEtc291cmNlPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4KK25vbi1qdGEtZGF0YS1zb3VyY2U8L2xpdGVyYWw+IGVsZW1lbnQgb2YgdGhlCis8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2VfeG1sIj5KUEEgWE1MIGZvcm1hdDwvbGluaz4gKGRlcGVuZGluZyBvbgord2hldGhlciB0aGUgPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+IGlzIG1hbmFnZWQgYnkgSlRBKSwgb3IgaW4gdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5TmFtZSI+PGxpdGVyYWw+CitvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5TmFtZTwvbGl0ZXJhbD48L2xpbms+IHByb3BlcnR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRHJpdmVyTmFtZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CitTcGVjaWZ5IHRoZSBmdWxsIGNsYXNzIG5hbWUgb2YgdGhlIDxjbGFzc25hbWU+RGF0YVNvdXJjZTwvY2xhc3NuYW1lPgoraW1wbGVtZW50YXRpb24gaW4gdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWUiPjxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTwvbGl0ZXJhbD48L2xpbms+IHByb3BlcnR5IGluIHBsYWNlIG9mIGEgSkRCQworZHJpdmVyLiBJbiB0aGlzIGNvbmZpZ3VyYXRpb24gT3BlbkpQQSB3aWxsIGluc3RhbnRpYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZAorY2xhc3MgdmlhIHJlZmxlY3Rpb24uIEl0IHdpbGwgdGhlbiBjb25maWd1cmUgdGhlIDxjbGFzc25hbWU+RGF0YVNvdXJjZQorPC9jbGFzc25hbWU+IHdpdGggdGhlIHByb3BlcnRpZXMgaW4gdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzIj48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXM8L2xpdGVyYWw+PC9saW5rPiBzZXR0aW5nLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSBmZWF0dXJlcyBvZiBPcGVuSlBBJ3Mgb3duIDxjbGFzc25hbWU+RGF0YVNvdXJjZTwvY2xhc3NuYW1lPiBjYW4KK2Fsc28gYmUgdXNlZCB3aXRoIHRoaXJkLXBhcnR5IGltcGxlbWVudGF0aW9ucy4gT3BlbkpQQSBsYXllcnMgb24gdG9wIG9mIHRoZQordGhpcmQtcGFydHkgPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+IHRvIHByb3ZpZGUgdGhlIGV4dHJhCitmdW5jdGlvbmFsaXR5LiBUbyBjb25maWd1cmUgdGhlc2UgZmVhdHVyZXMgdXNlIHRoZSAKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzIj4KKzxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzPC9saXRlcmFsPjwvbGluaz4gcHJvcGVydHkgZGVzY3JpYmVkCitpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9leCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBGaWxlIGZvciBhIFRoaXJkLVBhcnR5IERhdGFTb3VyY2UKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZSIgdmFsdWU9Im9yYWNsZS5qZGJjLnBvb2wuT3JhY2xlRGF0YVNvdXJjZSIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuQ29ubmVjdGlvblByb3BlcnRpZXMiIAorICAgIHZhbHVlPSJQb3J0TnVtYmVyPTE1MjEsIFNlcnZlck5hbWU9c2F0dXJuLCBEYXRhYmFzZU5hbWU9c29sYXJzaWQsIERyaXZlclR5cGU9dGhpbiIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzIiB2YWx1ZT0iUXVlcnlUaW1lb3V0PTUwMDAiLyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kYnNldHVwX3RoaXJkcGFydHlfZW5saXN0Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBNYW5hZ2VkIGFuZCBYQSBEYXRhU291cmNlcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2Ric2V0dXBfdGhpcmRwYXJ0eV9lbmxpc3QiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF90aGlyZHBhcnR5X2VubGlzdCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2UKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgWEEKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeU1vZGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK0NlcnRhaW4gYXBwbGljYXRpb24gc2VydmVycyBhdXRvbWF0aWNhbGx5IGVubGlzdCB0aGVpciA8Y2xhc3NuYW1lPiBEYXRhU291cmNlCis8L2NsYXNzbmFtZT5zIGluIGdsb2JhbCB0cmFuc2FjdGlvbnMuIFdoZW4gdGhpcyBpcyB0aGUgY2FzZSwgT3BlbkpQQSBzaG91bGQgbm90CithdHRlbXB0IHRvIGNvbW1pdCB0aGUgdW5kZXJseWluZyBjb25uZWN0aW9uLCBsZWF2aW5nIEpEQkMgdHJhbnNhY3Rpb24gY29tcGxldGlvbgordG8gdGhlIGFwcGxpY2F0aW9uIHNlcnZlci4gVG8gbm90aWZ5IE9wZW5KUEEgdGhhdCB5b3VyIHRoaXJkLXBhcnR5IDxjbGFzc25hbWU+CitEYXRhU291cmNlPC9jbGFzc25hbWU+IGlzIG1hbmFnZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciwgdXNlIHRoZSAKKzxsaXRlcmFsPmp0YS1kYXRhLXNvdXJjZTwvbGl0ZXJhbD4gZWxlbWVudCBvZiB5b3VyIDxmaWxlbmFtZT4KK3BlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+IGZpbGUgb3Igc2V0IHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeU1vZGUiPjxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeU1vZGU8L2xpdGVyYWw+PC9saW5rPiBwcm9wZXJ0eSB0byA8bGl0ZXJhbD4KK21hbmFnZWQ8L2xpdGVyYWw+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitOb3RlIHRoYXQgT3BlbkpQQSBjYW4gb25seSB1c2UgbWFuYWdlZCA8Y2xhc3NuYW1lPkRhdGFTb3VyY2U8L2NsYXNzbmFtZT5zIHdoZW4KK2l0IGlzIGFsc28gaW50ZWdyYXRpbmcgd2l0aCB0aGUgYXBwbGljYXRpb24gc2VydmVyJ3MgbWFuYWdlZCB0cmFuc2FjdGlvbnMuIEFsc28KK25vdGUgdGhhdCBhbGwgWEEgPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+cyBhcmUgZW5saXN0ZWQsIGFuZCB5b3UgbXVzdAorc2V0IHRoaXMgcHJvcGVydHkgd2hlbiB1c2luZyBhbnkgWEEgPGNsYXNzbmFtZT4gRGF0YVNvdXJjZTwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiB1c2luZyBhIG1hbmFnZWQgPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+LCB5b3Ugc2hvdWxkIGFsc28KK2NvbmZpZ3VyZSBhIHNlY29uZCB1bm1hbmFnZWQgPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+IHRoYXQgT3BlbkpQQSBjYW4KK3VzZSB0byBwZXJmb3JtIHRhc2tzIHRoYXQgYXJlIGluZGVwZW5kZW50IG9mIHRoZSBnbG9iYWwgdHJhbnNhY3Rpb24uIFRoZSBtb3N0Citjb21tb24gb2YgdGhlc2UgdGFza3MgaXMgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIHRhYmxlIE9wZW5KUEEgdXNlcyB0byBnZW5lcmF0ZQordW5pcXVlIHByaW1hcnkga2V5IHZhbHVlcyBmb3IgeW91ciBkYXRhc3RvcmUgaWRlbnRpdHkgb2JqZWN0cy4gQ29uZmlndXJlIHRoZQorc2Vjb25kIDxjbGFzc25hbWU+RGF0YVNvdXJjZTwvY2xhc3NuYW1lPiB1c2luZyB0aGUgPGxpdGVyYWw+bm9uLWp0YS1kYXRhLXNvdXJjZQorPC9saXRlcmFsPiA8ZmlsZW5hbWU+cGVyc2lzdGVuY2UueG1sPC9maWxlbmFtZT4gZWxlbWVudCwgb3IgT3BlbkpQQSdzIHZhcmlvdXMKKyIyIiBjb25uZWN0aW9uIHByb3BlcnRpZXMsIHN1Y2ggYXMgPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uRmFjdG9yeTJOYW1lCis8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvbjJEcml2ZXJOYW1lPC9saXRlcmFsPi4gVGhlc2UKK3Byb3BlcnRpZXMgYXJlIG91dGxpbmVkIGluIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3hhX2NvbmZfZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgTWFuYWdlZCBEYXRhU291cmNlIENvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0OyEtLSBtYW5hZ2VkIERhdGFTb3VyY2UgLS0mZ3Q7CismbHQ7anRhLWRhdGEtc291cmNlJmd0O2phdmE6L09yYWNsZVhBU291cmNlJmx0Oy9qdGEtZGF0YS1zb3VyY2UmZ3Q7CismbHQ7cHJvcGVydGllcyZndDsKKyAgICAmbHQ7IS0tIHVzZSBPcGVuSlBBJ3MgYnVpbHQtaW4gRGF0YVNvdXJjZSBmb3IgdW5tYW5hZ2VkIGNvbm5lY3Rpb25zIC0tJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb24yVXNlck5hbWUiIHZhbHVlPSJzY290dCIvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb24yUGFzc3dvcmQiIHZhbHVlPSJ0aWdlciIvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb24yVVJMIiB2YWx1ZT0iamRiYzpvcmFjbGU6dGhpbjpAQ1JPTToxNTIxOk9wZW5KUEFEQiIvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb24yRHJpdmVyTmFtZSIgdmFsdWU9Im9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiLyZndDsKKyZsdDsvcHJvcGVydGllcyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kYnNldHVwX3NxbGNvbm4iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBSdW50aW1lIEFjY2VzcyB0byBEYXRhU291cmNlCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2Ric2V0dXBfc3FsY29ubiI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBhY2Nlc3NpbmcgRGF0YVNvdXJjZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kYnNldHVwX3NxbGNvbm4iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgSkRCQworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBhY2Nlc3NpbmcgRGF0YVNvdXJjZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1RoZSBKUEEgc3RhbmRhcmQgZGVmaW5lcyBob3cgdG8gYWNjZXNzIEpEQkMgY29ubmVjdGlvbnMgZnJvbSBlbnRlcnByaXNlIGJlYW5zLgorT3BlbkpQQSBhbHNvIHByb3ZpZGVzIEFQSXMgdG8gYWNjZXNzIGFuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPidzCitjb25uZWN0aW9uLCBvciB0byByZXRyaWV2ZSBhIGNvbm5lY3Rpb24gZGlyZWN0bHkgZnJvbSB0aGUgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+J3MgPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuaHRtbCI+Cis8bWV0aG9kbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlci5nZXRDb25uZWN0aW9uPC9tZXRob2RuYW1lPjwvdWxpbms+IG1ldGhvZAorcmV0dXJucyBhbiA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4ncyBjb25uZWN0aW9uLiBJZiB0aGUgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgY29ubmVjdGlvbiwgaXQgd2lsbCBvYnRhaW4KK29uZS4gVGhlIHJldHVybmVkIGNvbm5lY3Rpb24gaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHRyYW5zYWN0aW9uYWxseSBjb25zaXN0ZW50Cit3aXRoIG90aGVyIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBvcGVyYXRpb25zIGlmIHRoZSA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpcyBpbiBhIG1hbmFnZWQgb3Igbm9uLW9wdGltaXN0aWMgdHJhbnNhY3Rpb24sIGlmIHRoZQorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IGhhcyBmbHVzaGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBvcgoraWYgeW91IGhhdmUgdXNlZCB0aGUgPG1ldGhvZG5hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXIuYmVnaW5TdG9yZTwvbWV0aG9kbmFtZT4KK21ldGhvZCB0byBlbnN1cmUgdGhhdCBhIGRhdGFzdG9yZSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy4gQWx3YXlzIGNsb3NlIHRoZQorcmV0dXJuZWQgY29ubmVjdGlvbiBiZWZvcmUgYXR0ZW1wdGluZyBhbnkgb3RoZXIgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyCis8L2NsYXNzbmFtZT4gb3BlcmF0aW9ucy4gT3BlbkpQQSB3aWxsIGVuc3VyZSB0aGF0IHRoZSB1bmRlcmx5aW5nIG5hdGl2ZQorY29ubmVjdGlvbiBpcyBub3QgcmVsZWFzZWQgaWYgYSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9kYnNldHVwX2Nvbm5fanBhIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBVc2luZyB0aGUgRW50aXR5TWFuYWdlcidzIENvbm5lY3Rpb24KKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgamF2YS5zcWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK09wZW5KUEFFbnRpdHlNYW5hZ2VyIGtlbSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKTsKK0Nvbm5lY3Rpb24gY29ubiA9IChDb25uZWN0aW9uKSBrZW0uZ2V0Q29ubmVjdGlvbigpOworCisvLyBkbyBKREJDIHN0dWZmCisKK2Nvbm4uY2xvc2UoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CitUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgdG8gdXNlIGEgY29ubmVjdGlvbiBkaXJlY3RseSBmcm9tIHRoZSA8Y2xhc3NuYW1lPgorRGF0YVNvdXJjZTwvY2xhc3NuYW1lPiwgcmF0aGVyIHRoYW4gdXNpbmcgYW4gPGNsYXNzbmFtZT4gRW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+J3MgY29ubmVjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2Ric2V0dXBfY29ubl9mcm9tX2ZhY3RvcnlfanBhIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBVc2luZyB0aGUgRW50aXR5TWFuYWdlckZhY3RvcnkncyBEYXRhU291cmNlCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IGphdmEuc3FsLio7CitpbXBvcnQgamF2YXguc3FsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmNvbmYuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK09wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeSBrZW1mID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW1mKTsKK09wZW5KUEFDb25maWd1cmF0aW9uIGNvbmYgPSBrZW1mLmdldENvbmZpZ3VyYXRpb24oKTsKK0RhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IChEYXRhU291cmNlKSBjb25mLmdldENvbm5lY3Rpb25GYWN0b3J5KCk7CitDb25uZWN0aW9uIGNvbm4gPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKTsKKworLy8gZG8gSkRCQyBzdHVmZgorCitjb25uLmNsb3NlKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZGJzZXR1cF9kYnN1cHBvcnQiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBEYXRhYmFzZSBTdXBwb3J0CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2Ric2V0dXBfZGJzdXBwb3J0Ij4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIERCRGljdGlvbmFyeQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF9kYnN1cHBvcnQiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgcmVsYXRpb25hbCBkYXRhYmFzZQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBPcGVuSlBBIHN1cHBvcnQKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgREJEaWN0aW9uYXJ5CisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgY2FuIHRha2UgYWR2YW50YWdlIG9mIGFueSBKREJDIDIueCBjb21wbGlhbnQKK2RyaXZlciwgbWFraW5nIGFsbW9zdCBhbnkgbWFqb3IgZGF0YWJhc2UgYSBjYW5kaWRhdGUgZm9yIHVzZS4gU2VlIG91ciBvZmZpY2lhbGx5CitzdXBwb3J0ZWQgZGF0YWJhc2UgbGlzdCBpbiA8eHJlZiBsaW5rZW5kPSJzdXBwb3J0ZWRfZGF0YWJhc2VzIi8+IGZvciBtb3JlCitpbmZvcm1hdGlvbi4gVHlwaWNhbGx5LCBPcGVuSlBBIGF1dG8tY29uZmlndXJlcyBpdHMgSkRCQyBiZWhhdmlvciBhbmQgU1FMCitkaWFsZWN0IGZvciB5b3VyIGRhdGFiYXNlLCBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIHlvdXIgY29ubmVjdGlvbi1yZWxhdGVkCitjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitJZiBPcGVuSlBBIGNhbm5vdCBkZXRlY3Qgd2hhdCB0eXBlIG9mIGRhdGFiYXNlIHlvdSBhcmUgdXNpbmcsIG9yIGlmIHlvdSBhcmUKK3VzaW5nIGFuIHVuc3VwcG9ydGVkIGRhdGFiYXNlLCB5b3Ugd2lsbCBoYXZlIHRvIHRlbGwgT3BlbkpQQSB3aGF0Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9EQkRpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQkRpY3Rpb25hcnk8L2NsYXNzbmFtZT48L3VsaW5rPiB0byB1c2UuCitUaGUgPGNsYXNzbmFtZT5EQkRpY3Rpb25hcnk8L2NsYXNzbmFtZT4gYWJzdHJhY3RzIGF3YXkgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KK2RhdGFiYXNlcy4gWW91IGNhbiBwbHVnIGEgZGljdGlvbmFyeSBpbnRvIE9wZW5KUEEgdXNpbmcgdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5Ij48bGl0ZXJhbD5vcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5Cis8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBUaGUgYnVpbHQtaW4gZGljdGlvbmFyaWVzIGFyZSBsaXN0ZWQKK2JlbG93LiBJZiB5b3UgYXJlIHVzaW5nIGFuIHVuc3VwcG9ydGVkIGRhdGFiYXNlLCB5b3UgbWF5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24KKzxjbGFzc25hbWU+REJEaWN0aW9uYXJ5PC9jbGFzc25hbWU+IHN1YmNsYXNzLCBhIHNpbXBsZSBwcm9jZXNzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmFjY2VzczwvbGl0ZXJhbD46IERpY3Rpb25hcnkgZm9yIE1pY3Jvc29mdCBBY2Nlc3MuIFRoaXMgaXMgYW4gYWxpYXMKK2ZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0FjY2Vzc0RpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5BY2Nlc3NEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBEQjIKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+ZGIyPC9saXRlcmFsPjogRGljdGlvbmFyeSBmb3IgSUJNJ3MgREIyIGRhdGFiYXNlLiBUaGlzIGlzIGFuIGFsaWFzIGZvcgordGhlIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RCMkRpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5EQjJEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC91bGluaz4gY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIERlcmJ5CisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmRlcmJ5PC9saXRlcmFsPjogRGljdGlvbmFyeSBmb3IgdGhlIEFwYWNoZSBEZXJieSBkYXRhYmFzZS4gVGhpcyBpcyBhbgorYWxpYXMgZm9yIHRoZSAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0RlcmJ5RGljdGlvbmFyeS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLkRlcmJ5RGljdGlvbmFyeTwvY2xhc3NuYW1lPiBjbGFzcy4KKzwvdWxpbms+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVtcHJlc3MKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+ZW1wcmVzczwvbGl0ZXJhbD46IERpY3Rpb25hcnkgZm9yIEVtcHJlc3MgZGF0YWJhc2UgVGhpcyBpcyBhbiBhbGlhcworZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvRW1wcmVzc0RpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5FbXByZXNzRGljdGlvbmFyeTwvY2xhc3NuYW1lPjwvdWxpbms+CitjbGFzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgRm94UHJvCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmZveHBybzwvbGl0ZXJhbD46IERpY3Rpb25hcnkgZm9yIE1pY3Jvc29mdCBWaXN1YWwgRm94UHJvLiBUaGlzIGlzIGFuCithbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Gb3hQcm9EaWN0aW9uYXJ5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuRm94UHJvRGljdGlvbmFyeTwvY2xhc3NuYW1lPjwvdWxpbms+CitjbGFzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgSHlwZXJzb25pYyBTUUwKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+aHNxbDwvbGl0ZXJhbD46IERpY3Rpb25hcnkgZm9yIHRoZSBIeXBlcnNvbmljIFNRTCBkYXRhYmFzZS4gVGhpcyBpcyBhbgorYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSFNRTERpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5IU1FMRGljdGlvbmFyeTwvY2xhc3NuYW1lPjwvdWxpbms+IGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1peAorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5pbmZvcm1peDwvbGl0ZXJhbD46IERpY3Rpb25hcnkgZm9yIHRoZSBJbmZvcm1peCBkYXRhYmFzZS4gVGhpcyBpcyBhbgorYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvSW5mb3JtaXhEaWN0aW9uYXJ5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSW5mb3JtaXhEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBKRGF0YVN0b3JlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmpkYXRhc3RvcmU8L2xpdGVyYWw+OiBEaWN0aW9uYXJ5IGZvciBCb3JsYW5kIEpEYXRhU3RvcmUuIFRoaXMgaXMgYW4KK2FsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL0pEYXRhU3RvcmVEaWN0aW9uYXJ5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zcWwuSkRhdGFTdG9yZURpY3Rpb25hcnk8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE15U1FMCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPm15c3FsPC9saXRlcmFsPjogRGljdGlvbmFyeSBmb3IgdGhlIE15U1FMIGRhdGFiYXNlLiBUaGlzIGlzIGFuIGFsaWFzCitmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9NeVNRTERpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5NeVNRTERpY3Rpb25hcnk8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9yYWNsZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcmFjbGU8L2xpdGVyYWw+OiBEaWN0aW9uYXJ5IGZvciBPcmFjbGUuIFRoaXMgaXMgYW4gYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zcWwvT3JhY2xlRGljdGlvbmFyeS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLk9yYWNsZURpY3Rpb25hcnk8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50YmFzZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5wb2ludGJhc2U8L2xpdGVyYWw+OiBEaWN0aW9uYXJ5IGZvciBQb2ludGJhc2UgRW1iZWRkZWQgZGF0YWJhc2UuIFRoaXMKK2lzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1BvaW50YmFzZURpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Qb2ludGJhc2VEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBQb3N0Z3JlU1FMCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPnBvc3RncmVzPC9saXRlcmFsPjogRGljdGlvbmFyeSBmb3IgUG9zdGdyZVNRTC4gVGhpcyBpcyBhbiBhbGlhcyBmb3IKK3RoZSA8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NxbC9Qb3N0Z3Jlc0RpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5Qb3N0Z3Jlc0RpY3Rpb25hcnk8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNRTFNlcnZlcgorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5zcWxzZXJ2ZXI8L2xpdGVyYWw+OiBEaWN0aW9uYXJ5IGZvciBNaWNyb3NvZnQncyBTUUxTZXJ2ZXIgZGF0YWJhc2UuCitUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1NRTFNlcnZlckRpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TUUxTZXJ2ZXJEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBTeWJhc2UKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+c3liYXNlPC9saXRlcmFsPjogRGljdGlvbmFyeSBmb3IgU3liYXNlLiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc3FsL1N5YmFzZURpY3Rpb25hcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5TeWJhc2VEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSBleGFtcGxlIGJlbG93IGRlbW9uc3RyYXRlcyBob3cgdG8gc2V0IGEgZGljdGlvbmFyeSBhbmQgY29uZmlndXJlIGl0cworcHJvcGVydGllcyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlIDxsaXRlcmFsPkRCRGljdGlvbmFyeTwvbGl0ZXJhbD4KK3Byb3BlcnR5IHVzZXMgT3BlbkpQQSdzIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiPnBsdWdpbiBzeW50YXgKKzwvbGluaz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9kYnNldHVwX2RiZGljdCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3BlY2lmeWluZyBhIERCRGljdGlvbmFyeQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5IiB2YWx1ZT0iaHNxbChTaW11bGF0ZUxvY2tpbmc9dHJ1ZSkiLyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kYnNldHVwX2RiZGljdHByb3BzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBEQkRpY3Rpb25hcnkgUHJvcGVydGllcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHN0YW5kYXJkIGRpY3Rpb25hcmllcyBhbGwgcmVjb2duaXplIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcy4gVGhlc2UKK3Byb3BlcnRpZXMgd2lsbCB1c3VhbGx5IG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4sIHNpbmNlIHRoZSBkaWN0aW9uYXJ5CitpbXBsZW1lbnRhdGlvbiBzaG91bGQgdXNlIHRoZSBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlcyBmb3IgeW91ciBkYXRhYmFzZS4gWW91Cit0eXBpY2FsbHkgd29uJ3QgdXNlIHRoZXNlIHByb3BlcnRpZXMgdW5sZXNzIHlvdSBhcmUgZGVzaWduaW5nIHlvdXIgb3duCis8Y2xhc3NuYW1lPkRCRGljdGlvbmFyeTwvY2xhc3NuYW1lPiBmb3IgYW4gdW5zdXBwb3J0ZWQgZGF0YWJhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkRyaXZlclZlbmRvciI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJWZW5kb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkRyaXZlclZlbmRvcjwvbGl0ZXJhbD46IFRoZSB2ZW5kb3Igb2YgdGhlIHBhcnRpY3VsYXIgSkRCQyBkcml2ZXIgeW91CithcmUgdXNpbmcuIFNvbWUgZGljdGlvbmFyaWVzIG11c3QgYWx0ZXIgdGhlaXIgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSBkcml2ZXIKK3ZlbmRvci4gU2VlIHRoZSA8bGl0ZXJhbD5WRU5ET1JfWFhYPC9saXRlcmFsPiBjb25zdGFudHMgZGVmaW5lZCBpbiB5b3VyCitkaWN0aW9uYXJ5J3MgSmF2YWRvYyBmb3IgYXZhaWxhYmxlIG9wdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkNhdGFsb2dTZXBhcmF0b3IiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRhbG9nU2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5DYXRhbG9nU2VwYXJhdG9yPC9saXRlcmFsPjogVGhlIHN0cmluZyB0aGUgZGF0YWJhc2UgdXNlcyB0byBkZWxpbWl0CitiZXR3ZWVuIHRoZSBzY2hlbWEgbmFtZSBhbmQgdGhlIHRhYmxlIG5hbWUuIFRoaXMgaXMgdHlwaWNhbGx5IDxsaXRlcmFsPiIuIgorPC9saXRlcmFsPiwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkNyZWF0ZVByaW1hcnlLZXlzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUHJpbWFyeUtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkNyZWF0ZVByaW1hcnlLZXlzPC9saXRlcmFsPjogSWYgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCB0aGVuIGRvIG5vdAorY3JlYXRlIGRhdGFiYXNlIHByaW1hcnkga2V5cyBmb3IgaWRlbnRpZmllcnMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWUKKzwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkNvbnN0cmFpbnROYW1lTW9kZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnROYW1lTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Q29uc3RyYWludE5hbWVNb2RlPC9saXRlcmFsPjogV2hlbiBjcmVhdGluZyBjb25zdHJhaW50cywgd2hldGhlciB0bworcHV0IHRoZSBjb25zdHJhaW50IG5hbWUgYmVmb3JlIHRoZSBkZWZpbml0aW9uICg8bGl0ZXJhbD5iZWZvcmU8L2xpdGVyYWw+KSwKK2p1c3QgYWZ0ZXIgdGhlIGNvbnN0cmFpbnQgdHlwZSBuYW1lICg8bGl0ZXJhbD5taWQ8L2xpdGVyYWw+KSwgb3IgYWZ0ZXIgdGhlCitjb25zdHJhaW50IGRlZmluaXRpb24gKDxsaXRlcmFsPmFmdGVyPC9saXRlcmFsPikuIERlZmF1bHRzIHRvIDxsaXRlcmFsPmJlZm9yZQorPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTWF4VGFibGVOYW1lTGVuZ3RoIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4VGFibGVOYW1lTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5NYXhUYWJsZU5hbWVMZW5ndGg8L2xpdGVyYWw+OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhCit0YWJsZSBuYW1lLiBEZWZhdWx0cyB0byAxMjguCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5Lk1heENvbHVtbk5hbWVMZW5ndGgiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhDb2x1bW5OYW1lTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5NYXhDb2x1bW5OYW1lTGVuZ3RoPC9saXRlcmFsPjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYQorY29sdW1uIG5hbWUuIERlZmF1bHRzIHRvIDEyOC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTWF4Q29uc3RyYWludE5hbWVMZW5ndGgiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhDb25zdHJhaW50TmFtZUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+TWF4Q29uc3RyYWludE5hbWVMZW5ndGg8L2xpdGVyYWw+OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbgorYSBjb25zdHJhaW50IG5hbWUuIERlZmF1bHRzIHRvIDEyOC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTWF4SW5kZXhOYW1lTGVuZ3RoIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4SW5kZXhOYW1lTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEluZGV4TmFtZUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+TWF4SW5kZXhOYW1lTGVuZ3RoPC9saXRlcmFsPjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4KK2luZGV4IG5hbWUuIERlZmF1bHRzIHRvIDEyOC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTWF4QXV0b0Fzc2lnbk5hbWVMZW5ndGgiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhBdXRvQXNzaWduTmFtZUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+TWF4QXV0b0Fzc2lnbk5hbWVMZW5ndGg8L2xpdGVyYWw+OiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgbWF4aW11bQorbGVuZ3RoIG9mIG5hbWUgZm9yIHNlcXVlbmNlcyB1c2VkIGZvciBhdXRvLWluY3JlbWVudCBjb2x1bW5zLiBOYW1lcyBsb25nZXIgdGhhbgordGhpcyB2YWx1ZSBhcmUgdHJ1bmNhdGVkLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4zMTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5Lk1heEluZGV4ZXNQZXJUYWJsZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhJbmRleGVzUGVyVGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPk1heEluZGV4ZXNQZXJUYWJsZTwvbGl0ZXJhbD46IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRleGVzIHRoYXQgY2FuCitiZSBwbGFjZWQgb24gYSBzaW5nbGUgdGFibGUuIERlZmF1bHRzIHRvIG5vIGxpbWl0LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdXBwb3J0c0ZvcmVpZ25LZXlzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNGb3JlaWduS2V5cworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNGb3JlaWduS2V5czwvbGl0ZXJhbD46IFdoZXRoZXIgdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGZvcmVpZ24KK2tleXMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzVGltZXN0YW1wTmFub3MiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzVGltZXN0YW1wTmFub3MKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c1RpbWVzdGFtcE5hbm9zPC9saXRlcmFsPjogV2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgbmFub3NlY29uZHMgd2l0aCBUSU1FU1RBTVAgY29sdW1ucy4gIERlZmF1bHRzIHRvIHRydWUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzVW5pcXVlQ29uc3RyYWludHMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSBjb25zdHJhaW50cworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c1VuaXF1ZUNvbnN0cmFpbnRzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c1VuaXF1ZUNvbnN0cmFpbnRzPC9saXRlcmFsPjogV2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMKK3VuaXF1ZSBjb25zdHJhaW50cy4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNEZWZlcnJlZENvbnN0cmFpbnRzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c0RlZmVycmVkQ29uc3RyYWludHM8L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cworZGVmZXJyZWQgY29uc3RyYWludHMuIERlZmF1bHRzIHRvIHRydWUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzUmVzdHJpY3REZWxldGVBY3Rpb24iPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ24ga2V5cworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c1Jlc3RyaWN0RGVsZXRlQWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c1Jlc3RyaWN0RGVsZXRlQWN0aW9uPC9saXRlcmFsPjogV2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMKK3RoZSBSRVNUUklDVCBmb3JlaWduIGtleSBkZWxldGUgYWN0aW9uLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNDYXNjYWRlRGVsZXRlQWN0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNDYXNjYWRlRGVsZXRlQWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c0Nhc2NhZGVEZWxldGVBY3Rpb248L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cwordGhlIENBU0NBREUgZm9yZWlnbiBrZXkgZGVsZXRlIGFjdGlvbi4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzTnVsbERlbGV0ZUFjdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbiBrZXlzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzTnVsbERlbGV0ZUFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNOdWxsRGVsZXRlQWN0aW9uPC9saXRlcmFsPjogV2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgdGhlCitTRVQgTlVMTCBmb3JlaWduIGtleSBkZWxldGUgYWN0aW9uLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNEZWZhdWx0RGVsZXRlQWN0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNEZWZhdWx0RGVsZXRlQWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c0RlZmF1bHREZWxldGVBY3Rpb248L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cwordGhlIFNFVCBERUZBVUxUIGZvcmVpZ24ga2V5IGRlbGV0ZSBhY3Rpb24uIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdXBwb3J0c0FsdGVyVGFibGVXaXRoQWRkQ29sdW1uIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNBbHRlclRhYmxlV2l0aEFkZENvbHVtbjwvbGl0ZXJhbD46IFdoZXRoZXIgdGhlIGRhdGFiYXNlCitzdXBwb3J0cyBhZGRpbmcgYSBuZXcgY29sdW1uIGluIGFuIEFMVEVSIFRBQkxFIHN0YXRlbWVudC4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+Cit0cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNBbHRlclRhYmxlV2l0aERyb3BDb2x1bW4iPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNBbHRlclRhYmxlV2l0aERyb3BDb2x1bW48L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSBkYXRhYmFzZQorc3VwcG9ydHMgZHJvcHBpbmcgYSBjb2x1bW4gaW4gYW4gQUxURVIgVEFCTEUgc3RhdGVtZW50LiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK3RydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5SZXNlcnZlZFdvcmRzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRXb3JkcworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+UmVzZXJ2ZWRXb3JkczwvbGl0ZXJhbD46IEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVzZXJ2ZWQgd29yZHMgZm9yCit0aGlzIGRhdGFiYXNlLCBiZXlvbmQgdGhlIHN0YW5kYXJkIFNRTDkyIGtleXdvcmRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TeXN0ZW1UYWJsZXMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3lzdGVtVGFibGVzPC9saXRlcmFsPjogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YWJsZSBuYW1lcyB0aGF0CitzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3lzdGVtU2NoZW1hcyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVNjaGVtYXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3lzdGVtU2NoZW1hczwvbGl0ZXJhbD46IEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc2NoZW1hIG5hbWVzIHRoYXQKK3Nob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TY2hlbWFDYXNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TY2hlbWFDYXNlPC9saXRlcmFsPjogVGhlIGNhc2UgdG8gdXNlIHdoZW4gcXVlcnlpbmcgdGhlIGRhdGFiYXNlCittZXRhZGF0YSBhYm91dCBzY2hlbWEgY29tcG9uZW50cy4gRGVmYXVsdHMgdG8gbWFraW5nIGFsbCBuYW1lcyB1cHBlciBjYXNlLgorQXZhaWxhYmxlIHZhbHVlcyBhcmU6IDxsaXRlcmFsPnVwcGVyLCBsb3dlciwgcHJlc2VydmU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5WYWxpZGF0aW9uU1FMIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblNRTAorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VmFsaWRhdGlvblNRTDwvbGl0ZXJhbD46IFRoZSBTUUwgdXNlZCB0byB2YWxpZGF0ZSB0aGF0IGEgY29ubmVjdGlvbiBpcworc3RpbGwgaW4gYSB2YWxpZCBzdGF0ZS4gRm9yIGV4YW1wbGUsICIgPGxpdGVyYWw+U0VMRUNUIFNZU0RBVEUgRlJPTSBEVUFMCis8L2xpdGVyYWw+ICIgZm9yIE9yYWNsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuSW5pdGlhbGl6YXRpb25TUUwiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uU1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb25TUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkluaXRpYWxpemF0aW9uU1FMPC9saXRlcmFsPjogQSBwaWVjZSBvZiBTUUwgdG8gaXNzdWUgYWdhaW5zdCB0aGUKK2RhdGFiYXNlIHdoZW5ldmVyIGEgY29ubmVjdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgPGNsYXNzbmFtZT5EYXRhU291cmNlCis8L2NsYXNzbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkpvaW5TeW50YXgiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5zCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5TeW50YXgKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkpvaW5TeW50YXg8L2xpdGVyYWw+OiBUaGUgU1FMIGpvaW4gc3ludGF4IHRvIHVzZSBpbiBzZWxlY3Qgc3RhdGVtZW50cy4KK1NlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF9zcWw5MiIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQ3Jvc3NKb2luQ2xhdXNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2lucworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc0pvaW5DbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkNyb3NzSm9pbkNsYXVzZTwvbGl0ZXJhbD46IFRoZSBjbGF1c2UgdG8gdXNlIGZvciBhIGNyb3NzIGpvaW4KKyhjYXJ0ZXNpYW4gcHJvZHVjdCkuIERlZmF1bHRzIHRvIDxsaXRlcmFsPkNST1NTIEpPSU48L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5Jbm5lckpvaW5DbGF1c2UiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5zCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubmVySm9pbkNsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+SW5uZXJKb2luQ2xhdXNlPC9saXRlcmFsPjogVGhlIGNsYXVzZSB0byB1c2UgZm9yIGFuIGlubmVyIGpvaW4uCitEZWZhdWx0cyB0byA8bGl0ZXJhbD5JTk5FUiBKT0lOPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuT3V0ZXJKb2luQ2xhdXNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2lucworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRlckpvaW5DbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPk91dGVySm9pbkNsYXVzZTwvbGl0ZXJhbD46IFRoZSBjbGF1c2UgdG8gdXNlIGZvciBhbiBsZWZ0IG91dGVyIGpvaW4uCitEZWZhdWx0cyB0byA8bGl0ZXJhbD5MRUZUIE9VVEVSIEpPSU48L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5SZXF1aXJlc0NvbmRpdGlvbkZvckNyb3NzSm9pbiI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXNDb25kaXRpb25Gb3JDcm9zc0pvaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlJlcXVpcmVzQ29uZGl0aW9uRm9yQ3Jvc3NKb2luPC9saXRlcmFsPjogU29tZSBkYXRhYmFzZXMgcmVxdWlyZSB0aGF0Cit0aGVyZSBhbHdheXMgYmUgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgZm9yIGEgY3Jvc3Mgam9pbi4gSWYgc2V0LCB0aGlzIHBhcmFtZXRlcgorZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYWx3YXlzIGJlIHNvbWUgY29uZGl0aW9uIHRvIHRoZSBqb2luIGNsYXVzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVG9VcHBlckNhc2VGdW5jdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvVXBwZXJDYXNlRnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlRvVXBwZXJDYXNlRnVuY3Rpb248L2xpdGVyYWw+OiBTUUwgZnVuY3Rpb24gY2FsbCBmb3IgZm9yIGNvbnZlcnRpbmcgYQorc3RyaW5nIHRvIHVwcGVyIGNhc2UuIFVzZSB0aGUgdG9rZW4gPGxpdGVyYWw+ezB9PC9saXRlcmFsPiB0byByZXByZXNlbnQgdGhlCithcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVG9Mb3dlckNhc2VGdW5jdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG93ZXJDYXNlRnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlRvTG93ZXJDYXNlRnVuY3Rpb248L2xpdGVyYWw+OiBOYW1lIG9mIHRoZSBTUUwgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcKK2Egc3RyaW5nIHRvIGxvd2VyIGNhc2UuIFVzZSB0aGUgdG9rZW4gPGxpdGVyYWw+ezB9PC9saXRlcmFsPiB0byByZXByZXNlbnQgdGhlCithcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3RyaW5nTGVuZ3RoRnVuY3Rpb24iPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMZW5ndGhGdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RyaW5nTGVuZ3RoRnVuY3Rpb248L2xpdGVyYWw+OiBOYW1lIG9mIHRoZSBTUUwgZnVuY3Rpb24gZm9yIGdldHRpbmcKK3RoZSBsZW5ndGggb2YgYSBzdHJpbmcuIFVzZSB0aGUgdG9rZW4gPGxpdGVyYWw+ezB9PC9saXRlcmFsPiB0byByZXByZXNlbnQgdGhlCithcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3Vic3RyaW5nRnVuY3Rpb25OYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RyaW5nRnVuY3Rpb25OYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdWJzdHJpbmdGdW5jdGlvbk5hbWU8L2xpdGVyYWw+OiBOYW1lIG9mIHRoZSBTUUwgZnVuY3Rpb24gZm9yIGdldHRpbmcKK3RoZSBzdWJzdHJpbmcgb2YgYSBzdHJpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkRpc3RpbmN0Q291bnRDb2x1bW5TZXBhcmF0b3IiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0aW5jdENvdW50Q29sdW1uU2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5EaXN0aW5jdENvdW50Q29sdW1uU2VwYXJhdG9yPC9saXRlcmFsPjogVGhlIHN0cmluZyB0aGUgZGF0YWJhc2UgdXNlcwordG8gZGVsaW1pdCBiZXR3ZWVuIGNvbHVtbiBleHByZXNzaW9ucyBpbiBhIDxsaXRlcmFsPlNFTEVDVCBDT1VOVChESVNUSU5DVAorY29sdW1uLWxpc3QpPC9saXRlcmFsPiBjbGF1c2UuIERlZmF1bHRzIHRvIG51bGwgZm9yIG1vc3QgZGF0YWJhc2VzLCBtZWFuaW5nIHRoYXQKK211bHRpcGxlIGNvbHVtbnMgaW4gYSBkaXN0aW5jdCBDT1VOVCBjbGF1c2UgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkZvclVwZGF0ZUNsYXVzZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvclVwZGF0ZUNsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JVcGRhdGVDbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkZvclVwZGF0ZUNsYXVzZTwvbGl0ZXJhbD46IFRoZSBjbGF1c2UgdG8gYXBwZW5kIHRvIDxsaXRlcmFsPlNFTEVDVAorPC9saXRlcmFsPiBzdGF0ZW1lbnRzIHRvIGlzc3VlIHF1ZXJpZXMgdGhhdCBvYnRhaW4gcGVzc2ltaXN0aWMgbG9ja3MuIERlZmF1bHRzCit0byA8bGl0ZXJhbD5GT1IgVVBEQVRFPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVGFibGVGb3JVcGRhdGVDbGF1c2UiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUZvclVwZGF0ZUNsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUZvclVwZGF0ZUNsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VGFibGVGb3JVcGRhdGVDbGF1c2U8L2xpdGVyYWw+OiBUaGUgY2xhdXNlIHRvIGFwcGVuZCB0byB0aGUgZW5kIG9mCitlYWNoIHRhYmxlIGFsaWFzIGluIHF1ZXJpZXMgdGhhdCBvYnRhaW4gcGVzc2ltaXN0aWMgbG9ja3MuIERlZmF1bHRzIHRvIG51bGwuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c1NlbGVjdEZvclVwZGF0ZTwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlIGRhdGFiYXNlIHN1cHBvcnRzCis8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IHN0YXRlbWVudHMgd2l0aCBhIHBlc3NpbWlzdGljIGxvY2tpbmcgY2xhdXNlLiBEZWZhdWx0cwordG8gdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNMb2NraW5nV2l0aERpc3RpbmN0Q2xhdXNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzTG9ja2luZ1dpdGhEaXN0aW5jdENsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNMb2NraW5nV2l0aERpc3RpbmN0Q2xhdXNlPC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbiB0aGUKK2RhdGFiYXNlIHN1cHBvcnRzIDxsaXRlcmFsPkZPUiBVUERBVEU8L2xpdGVyYWw+IHNlbGVjdCBjbGF1c2VzIHdpdGggPGxpdGVyYWw+CitESVNUSU5DVDwvbGl0ZXJhbD4gY2xhdXNlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNMb2NraW5nV2l0aE91dGVySm9pbiI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c0xvY2tpbmdXaXRoT3V0ZXJKb2luCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c0xvY2tpbmdXaXRoT3V0ZXJKb2luPC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbiB0aGUgZGF0YWJhc2UKK3N1cHBvcnRzIDxsaXRlcmFsPkZPUiBVUERBVEU8L2xpdGVyYWw+IHNlbGVjdCBjbGF1c2VzIHdpdGggb3V0ZXIgam9pbiBxdWVyaWVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdXBwb3J0c0xvY2tpbmdXaXRoSW5uZXJKb2luIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzTG9ja2luZ1dpdGhJbm5lckpvaW48L2xpdGVyYWw+OiBJZiB0cnVlLCB0aGVuIHRoZSBkYXRhYmFzZQorc3VwcG9ydHMgPGxpdGVyYWw+Rk9SIFVQREFURTwvbGl0ZXJhbD4gc2VsZWN0IGNsYXVzZXMgd2l0aCBpbm5lciBqb2luIHF1ZXJpZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzTG9ja2luZ1dpdGhNdWx0aXBsZVRhYmxlcyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c0xvY2tpbmdXaXRoTXVsdGlwbGVUYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzTG9ja2luZ1dpdGhNdWx0aXBsZVRhYmxlczwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlCitkYXRhYmFzZSBzdXBwb3J0cyA8bGl0ZXJhbD5GT1IgVVBEQVRFPC9saXRlcmFsPiBzZWxlY3QgY2xhdXNlcyB0aGF0IHNlbGVjdCBmcm9tCittdWx0aXBsZSB0YWJsZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzTG9ja2luZ1dpdGhPcmRlckNsYXVzZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c0xvY2tpbmdXaXRoT3JkZXJDbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzTG9ja2luZ1dpdGhPcmRlckNsYXVzZTwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlIGRhdGFiYXNlCitzdXBwb3J0cyA8bGl0ZXJhbD5GT1IgVVBEQVRFPC9saXRlcmFsPiBzZWxlY3QgY2xhdXNlcyB3aXRoIDxsaXRlcmFsPk9SREVSIEJZCis8L2xpdGVyYWw+IGNsYXVzZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzTG9ja2luZ1dpdGhTZWxlY3RSYW5nZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c0xvY2tpbmdXaXRoU2VsZWN0UmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzTG9ja2luZ1dpdGhTZWxlY3RSYW5nZTwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlIGRhdGFiYXNlCitzdXBwb3J0cyA8bGl0ZXJhbD5GT1IgVVBEQVRFPC9saXRlcmFsPiBzZWxlY3QgY2xhdXNlcyB3aXRoIHF1ZXJpZXMgdGhhdCBzZWxlY3QgYQorcmFuZ2Ugb2YgZGF0YSB1c2luZyA8bGl0ZXJhbD5MSU1JVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlRPUDwvbGl0ZXJhbD4gb3IgdGhlCitkYXRhYmFzZSBlcXVpdmFsZW50LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TaW11bGF0ZUxvY2tpbmciPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltdWxhdGVMb2NraW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TaW11bGF0ZUxvY2tpbmc8L2xpdGVyYWw+OiBTb21lIGRhdGFiYXNlcyBkbyBub3Qgc3VwcG9ydCBwZXNzaW1pc3RpYworbG9ja2luZywgd2hpY2ggd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIHdoZW4geW91IGF0dGVtcHQgYSBwZXNzaW1pc3RpYwordHJhbnNhY3Rpb24uIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBieXBhc3NlcyB0aGUKK2xvY2tpbmcgY2hlY2sgdG8gYWxsb3cgcGVzc2ltaXN0aWMgdHJhbnNhY3Rpb25zIGV2ZW4gb24gZGF0YWJhc2VzIHRoYXQgZG8gbm90CitzdXBwb3J0IGxvY2tpbmcuIERlZmF1bHRzIHRvIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNRdWVyeVRpbWVvdXQiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c1F1ZXJ5VGltZW91dAorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c1F1ZXJ5VGltZW91dDwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlIEpEQkMgZHJpdmVyIHN1cHBvcnRzCitjYWxscyB0byA8bWV0aG9kbmFtZT4gamF2YS5zcWwuU3RhdGVtZW50LnNldFF1ZXJ5VGltZW91dDwvbWV0aG9kbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzSGF2aW5nIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNIYXZpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNIYXZpbmc8L2xpdGVyYWw+OiBXaGV0aGVyIHRoaXMgZGF0YWJhc2Ugc3VwcG9ydHMgSEFWSU5HCitjbGF1c2VzIGluIHNlbGVjdHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzU2VsZWN0U3RhcnRJbmRleCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c1NlbGVjdFN0YXJ0SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNTZWxlY3RTdGFydEluZGV4PC9saXRlcmFsPjogV2hldGhlciB0aGlzIGRhdGFiYXNlIGNhbiBjcmVhdGUgYQorc2VsZWN0IHRoYXQgc2tpcHMgdGhlIGZpcnN0IE4gcmVzdWx0cy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNTZWxlY3RFbmRJbmRleCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c1NlbGVjdEVuZEluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzU2VsZWN0RW5kSW5kZXg8L2xpdGVyYWw+OiBXaGV0aGVyIHRoaXMgZGF0YWJhc2UgY2FuIGNyZWF0ZSBhCitzZWxlY3QgdGhhdCBpcyBsaW1pdGVkIHRvIHRoZSBmaXJzdCBOIHJlc3VsdHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzU3Vic2VsZWN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNTdWJzZWxlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VsZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNTdWJzZWxlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNTdWJzZWxlY3Q8L2xpdGVyYWw+OiBXaGV0aGVyIHRoaXMgZGF0YWJhc2Ugc3VwcG9ydHMgc3Vic2VsZWN0cworaW4gcXVlcmllcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuUmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzQWxpYXNGb3JTdWJzZWxlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VsZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXNBbGlhc0ZvclN1YnNlbGVjdAorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5SZXF1aXJlc0FsaWFzRm9yU3Vic2VsZWN0PC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbiB0aGUgZGF0YWJhc2UKK3JlcXVpcmVzIHRoYXQgc3Vic2VsZWN0cyBpbiBhIEZST00gY2xhdXNlIGJlIGFzc2lnbmVkIGFuIGFsaWFzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdXBwb3J0c011bHRpcGxlTm9udHJhbnNhY3Rpb25hbFJlc3VsdFNldHMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN1cHBvcnRzTXVsdGlwbGVOb250cmFuc2FjdGlvbmFsUmVzdWx0U2V0czwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gYQorbm9udHJhbnNhY3Rpb25hbCBjb25uZWN0aW9uIGlzIGNhcGFibGUgb2YgaGF2aW5nIG11bHRpcGxlIG9wZW4gPGNsYXNzbmFtZT4KK1Jlc3VsdFNldDwvY2xhc3NuYW1lPiBpbnN0YW5jZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN0b3JhZ2VMaW1pdGF0aW9uc0ZhdGFsIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTGltaXRhdGlvbnNGYXRhbAorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RvcmFnZUxpbWl0YXRpb25zRmF0YWw8L2xpdGVyYWw+OiBJZiB0cnVlLCB0aGVuIGFueSBkYXRhCit0cnVuY2F0aW9uL3JvdW5kaW5nIHRoYXQgaXMgcGVyZm9ybWVkIGJ5IHRoZSBkaWN0aW9uYXJ5IGluIG9yZGVyIHRvIHN0b3JlIGEKK3ZhbHVlIGluIHRoZSBkYXRhYmFzZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBmYXRhbCBlcnJvciwgcmF0aGVyIHRoYW4ganVzdCBpc3N1aW5nCithIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN0b3JlTGFyZ2VOdW1iZXJzQXNTdHJpbmdzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZUxhcmdlTnVtYmVyc0FzU3RyaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3RvcmVMYXJnZU51bWJlcnNBc1N0cmluZ3M8L2xpdGVyYWw+OiBNYW55IGRhdGFiYXNlcyBoYXZlIGxpbWl0YXRpb25zCitvbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSBudW1lcmljIGZpZWxkIChmb3IgZXhhbXBsZSwKK09yYWNsZSBjYW4gb25seSBzdG9yZSAzOCBkaWdpdHMpLiBGb3IgYXBwbGljYXRpb25zIHRoYXQgb3BlcmF0ZSBvbiB2ZXJ5IGxhcmdlCis8Y2xhc3NuYW1lPkJpZ0ludGVnZXI8L2NsYXNzbmFtZT4gYW5kIDxjbGFzc25hbWU+QmlnRGVjaW1hbDwvY2xhc3NuYW1lPiB2YWx1ZXMsCitpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZXNlIG9iamVjdHMgYXMgc3RyaW5nIGZpZWxkcyByYXRoZXIgdGhhbiB0aGUKK2RhdGFiYXNlJ3MgbnVtZXJpYyB0eXBlLiBOb3RlIHRoYXQgdGhpcyBtYXkgcHJldmVudCBtZWFuaW5nZnVsIG51bWVyaWMgcXVlcmllcworZnJvbSBiZWluZyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdG9yZUNoYXJzQXNOdW1iZXJzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZUNoYXJzQXNOdW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdG9yZUNoYXJzQXNOdW1iZXJzPC9saXRlcmFsPjogU2V0IHRoaXMgcHJvcGVydHkgdG8gPGxpdGVyYWw+ZmFsc2UKKzwvbGl0ZXJhbD4gdG8gc3RvcmUgSmF2YSA8bGl0ZXJhbD5jaGFyPC9saXRlcmFsPiBmaWVsZHMgYXMgPGxpdGVyYWw+Q0hBUgorPC9saXRlcmFsPiB2YWx1ZXMgcmF0aGVyIHRoYW4gbnVtYmVycy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlVzZUdldEJ5dGVzRm9yQmxvYnMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0IKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlR2V0Qnl0ZXNGb3JCbG9icworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VXNlR2V0Qnl0ZXNGb3JCbG9iczwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gPG1ldGhvZG5hbWU+CitSZXN1bHRTZXQuZ2V0Qnl0ZXM8L21ldGhvZG5hbWU+IHdpbGwgYmUgdXNlZCB0byBvYnRhaW4gYmxvYiBkYXRhIHJhdGhlciB0aGFuCis8bWV0aG9kbmFtZT5SZXN1bHRTZXQuZ2V0QmluYXJ5U3RyZWFtPC9tZXRob2RuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVXNlR2V0T2JqZWN0Rm9yQmxvYnMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0IKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlR2V0T2JqZWN0Rm9yQmxvYnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlVzZUdldE9iamVjdEZvckJsb2JzPC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbiA8bWV0aG9kbmFtZT4KK1Jlc3VsdFNldC5nZXRPYmplY3Q8L21ldGhvZG5hbWU+IHdpbGwgYmUgdXNlZCB0byBvYnRhaW4gYmxvYiBkYXRhIHJhdGhlciB0aGFuCis8bWV0aG9kbmFtZT5SZXN1bHRTZXQuZ2V0QmluYXJ5U3RyZWFtPC9tZXRob2RuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVXNlU2V0Qnl0ZXNGb3JCbG9icyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VTZXRCeXRlc0ZvckJsb2JzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VTZXRCeXRlc0ZvckJsb2JzPC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbiA8bWV0aG9kbmFtZT4KK1ByZXBhcmVkU3RhdGVtZW50LnNldEJ5dGVzPC9tZXRob2RuYW1lPiB3aWxsIGJlIHVzZWQgdG8gc2V0IGJsb2IgZGF0YSwgcmF0aGVyCit0aGFuIDxtZXRob2RuYW1lPlByZXBhcmVkU3RhdGVtZW50LnNldEJpbmFyeVN0cmVhbTwvbWV0aG9kbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlVzZUdldFN0cmluZ0ZvckNsb2JzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9CCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUdldFN0cmluZ0ZvckNsb2JzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VHZXRTdHJpbmdGb3JDbG9iczwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gPG1ldGhvZG5hbWU+CitSZXN1bHRTZXQuZ2V0U3RyaW5nPC9tZXRob2RuYW1lPiB3aWxsIGJlIHVzZWQgdG8gb2J0YWluIGNsb2IgZGF0YSByYXRoZXIgdGhhbgorPG1ldGhvZG5hbWU+UmVzdWx0U2V0LmdldENoYXJhY3RlclN0cmVhbTwvbWV0aG9kbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlVzZVNldFN0cmluZ0ZvckNsb2JzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9CCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVNldFN0cmluZ0ZvckNsb2JzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VTZXRTdHJpbmdGb3JDbG9iczwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gPG1ldGhvZG5hbWU+CitQcmVwYXJlZFN0YXRlbWVudC5zZXRTdHJpbmc8L21ldGhvZG5hbWU+IHdpbGwgYmUgdXNlZCB0byBzZXQgY2xvYiBkYXRhLCByYXRoZXIKK3RoYW4gPG1ldGhvZG5hbWU+UHJlcGFyZWRTdGF0ZW1lbnQuc2V0Q2hhcmFjdGVyU3RyZWFtPC9tZXRob2RuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQ2hhcmFjdGVyQ29sdW1uU2l6ZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlckNvbHVtblNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkNoYXJhY3RlckNvbHVtblNpemU8L2xpdGVyYWw+OiBUaGUgZGVmYXVsdCBzaXplIG9mIDxsaXRlcmFsPnZhcmNoYXIKKzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmNoYXI8L2xpdGVyYWw+IGNvbHVtbnMuIFR5cGljYWxseSAyNTUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkFycmF5VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5BcnJheVR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLkFSUkFZPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQmlnaW50VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdpbnRUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+QmlnaW50VHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuQklHSU5UPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQmluYXJ5VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+QmluYXJ5VHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuQklOQVJZPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQml0VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Qml0VHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvciA8bGl0ZXJhbD4KK2phdmEuc3FsLlR5cGVzLkJJVDwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcyBnZW5lcmF0ZWQgYnkKK3RoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkJsb2JUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2JUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9iVHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkJsb2JUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5CTE9CPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQ2hhclR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5DaGFyVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuQ0hBUjwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkNsb2JUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb2JUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPQgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9iVHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkNsb2JUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5DTE9CPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuRGF0ZVR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5EYXRlVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuREFURTwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkRlY2ltYWxUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+RGVjaW1hbFR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLkRFQ0lNQUw8L2xpdGVyYWw+LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzY2hlbWEgaXMKK2dlbmVyYXRlZCBieSB0aGUgPGxpdGVyYWw+bWFwcGluZ3Rvb2w8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5EaXN0aW5jdFR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdGluY3RUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+RGlzdGluY3RUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5ESVNUSU5DVDwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYQoraXMgZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkRvdWJsZVR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlVHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkRvdWJsZVR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLkRPVUJMRTwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkZsb2F0VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5GbG9hdFR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLkZMT0FUPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuSW50ZWdlclR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlclR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5JbnRlZ2VyVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuSU5URUdFUjwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkphdmFPYmplY3RUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3RUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+SmF2YU9iamVjdFR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLkpBVkFPQkpFQ1Q8L2xpdGVyYWw+LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzY2hlbWEKK2lzIGdlbmVyYXRlZCBieSB0aGUgPGxpdGVyYWw+bWFwcGluZ3Rvb2w8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5Mb25nVmFyYmluYXJ5VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nVmFyYmluYXJ5VHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkxvbmdWYXJiaW5hcnlUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUKK2ZvciA8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5MT05HVkFSQklOQVJZPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUKK3NjaGVtYSBpcyBnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTG9uZ1ZhcmNoYXJUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmdWYXJjaGFyVHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkxvbmdWYXJjaGFyVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuTE9OR1ZBUkNIQVI8L2xpdGVyYWw+LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZQorc2NoZW1hIGlzIGdlbmVyYXRlZCBieSB0aGUgPGxpdGVyYWw+bWFwcGluZ3Rvb2w8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5OdWxsVHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsVHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPk51bGxUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5OVUxMPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTnVtZXJpY1R5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtZXJpY1R5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5OdW1lcmljVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuTlVNRVJJQzwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5Lk90aGVyVHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlclR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5PdGhlclR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLk9USEVSPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuUmVhbFR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5SZWFsVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuUkVBTDwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlJlZlR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmVHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlJlZlR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IgPGxpdGVyYWw+CitqYXZhLnNxbC5UeXBlcy5SRUY8L2xpdGVyYWw+LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzY2hlbWEgaXMgZ2VuZXJhdGVkIGJ5Cit0aGUgPGxpdGVyYWw+bWFwcGluZ3Rvb2w8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TbWFsbGludFR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxpbnRUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U21hbGxpbnRUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5TTUFMTElOVDwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYQoraXMgZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN0cnVjdFR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0VHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN0cnVjdFR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLlNUUlVDVDwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlRpbWVUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VGltZVR5cGVOYW1lPC9saXRlcmFsPjogVGhlIG92ZXJyaWRkZW4gZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IKKzxsaXRlcmFsPmphdmEuc3FsLlR5cGVzLlRJTUU8L2xpdGVyYWw+LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzY2hlbWEgaXMKK2dlbmVyYXRlZCBieSB0aGUgPGxpdGVyYWw+bWFwcGluZ3Rvb2w8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5UaW1lc3RhbXBUeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcFR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5UaW1lc3RhbXBUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5USU1FU1RBTVA8L2xpdGVyYWw+LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzY2hlbWEKK2lzIGdlbmVyYXRlZCBieSB0aGUgPGxpdGVyYWw+bWFwcGluZ3Rvb2w8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5UaW55aW50VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW55aW50VHlwZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlRpbnlpbnRUeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBvdmVycmlkZGVuIGRlZmF1bHQgY29sdW1uIHR5cGUgZm9yCis8bGl0ZXJhbD5qYXZhLnNxbC5UeXBlcy5USU5ZSU5UPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hIGlzCitnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVmFyYmluYXJ5VHlwZU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJiaW5hcnlUeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VmFyYmluYXJ5VHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuVkFSQklOQVJZPC9saXRlcmFsPi4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2NoZW1hCitpcyBnZW5lcmF0ZWQgYnkgdGhlIDxsaXRlcmFsPm1hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVmFyY2hhclR5cGVOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyY2hhclR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5WYXJjaGFyVHlwZU5hbWU8L2xpdGVyYWw+OiBUaGUgb3ZlcnJpZGRlbiBkZWZhdWx0IGNvbHVtbiB0eXBlIGZvcgorPGxpdGVyYWw+amF2YS5zcWwuVHlwZXMuVkFSQ0hBUjwvbGl0ZXJhbD4uIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcworZ2VuZXJhdGVkIGJ5IHRoZSA8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlVzZVNjaGVtYU5hbWUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VTY2hlbWFOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VTY2hlbWFOYW1lPC9saXRlcmFsPjogSWYgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCB0aGVuIGF2b2lkCitpbmNsdWRpbmcgdGhlIHNjaGVtYSBuYW1lIGluIHRhYmxlIG5hbWUgcmVmZXJlbmNlcy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+dHJ1ZQorPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuVGFibGVUeXBlcyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VGFibGVUeXBlczwvbGl0ZXJhbD46IENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhYmxlIHR5cGVzIHRvIHVzZSB3aGVuCitsb29raW5nIGZvciB0YWJsZXMgZHVyaW5nIHNjaGVtYSByZWZsZWN0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSA8bWV0aG9kbmFtZT4KK2phdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEuZ2V0VGFibGVJbmZvPC9tZXRob2RuYW1lPiBKREJDIG1ldGhvZC4gQW4gZXhhbXBsZSBpczoKKzxsaXRlcmFsPiJUQUJMRSxWSUVXLEFMSUFTIjwvbGl0ZXJhbD4uIERlZmF1bHRzIHRvIDxsaXRlcmFsPiJUQUJMRSI8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdXBwb3J0c1NjaGVtYUZvckdldFRhYmxlcyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzU2NoZW1hRm9yR2V0VGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzU2NoZW1hRm9yR2V0VGFibGVzPC9saXRlcmFsPjogSWYgZmFsc2UsIHRoZW4gdGhlIGRhdGFiYXNlCitkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2luZyB0aGUgc2NoZW1hIG5hbWUgZm9yIHNjaGVtYSByZWZsZWN0aW9uIG9uIHRhYmxlCituYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNTY2hlbWFGb3JHZXRDb2x1bW5zIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNTY2hlbWFGb3JHZXRDb2x1bW5zCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPlN1cHBvcnRzU2NoZW1hRm9yR2V0Q29sdW1uczwvbGl0ZXJhbD46IElmIGZhbHNlLCB0aGVuIHRoZSBkYXRhYmFzZQorZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdXNpbmcgdGhlIHNjaGVtYSBuYW1lIGZvciBzY2hlbWEgcmVmbGVjdGlvbiBvbiBjb2x1bW4KK25hbWVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5TdXBwb3J0c051bGxUYWJsZUZvckdldENvbHVtbnMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c051bGxUYWJsZUZvckdldENvbHVtbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNOdWxsVGFibGVGb3JHZXRDb2x1bW5zPC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbiB0aGUgZGF0YWJhc2UKK3N1cHBvcnRzIHBhc3NpbmcgYSA8bGl0ZXJhbD5udWxsPC9saXRlcmFsPiBwYXJhbWV0ZXIgdG8gPG1ldGhvZG5hbWU+CitEYXRhYmFzZU1ldGFEYXRhLmdldENvbHVtbnM8L21ldGhvZG5hbWU+IGFzIGFuIG9wdGltaXphdGlvbiB0byBnZXQgaW5mb3JtYXRpb24KK2Fib3V0IGFsbCB0aGUgdGFibGVzLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNOdWxsVGFibGVGb3JHZXRQcmltYXJ5S2V5cyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRzTnVsbFRhYmxlRm9yR2V0UHJpbWFyeUtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNOdWxsVGFibGVGb3JHZXRQcmltYXJ5S2V5czwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlCitkYXRhYmFzZSBzdXBwb3J0cyBwYXNzaW5nIGEgPGxpdGVyYWw+bnVsbDwvbGl0ZXJhbD4gcGFyYW1ldGVyIHRvIDxtZXRob2RuYW1lPgorRGF0YWJhc2VNZXRhRGF0YS5nZXRQcmltYXJ5S2V5czwvbWV0aG9kbmFtZT4gYXMgYW4gb3B0aW1pemF0aW9uIHRvIGdldAoraW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSB0YWJsZXMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuU3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbmRleEluZm8iPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0c051bGxUYWJsZUZvckdldEluZGV4SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5TdXBwb3J0c051bGxUYWJsZUZvckdldEluZGV4SW5mbzwvbGl0ZXJhbD46IElmIHRydWUsIHRoZW4gdGhlIGRhdGFiYXNlCitzdXBwb3J0cyBwYXNzaW5nIGEgPGxpdGVyYWw+bnVsbDwvbGl0ZXJhbD4gcGFyYW1ldGVyIHRvIDxtZXRob2RuYW1lPgorRGF0YWJhc2VNZXRhRGF0YS5nZXRJbmRleEluZm88L21ldGhvZG5hbWU+IGFzIGFuIG9wdGltaXphdGlvbiB0byBnZXQgaW5mb3JtYXRpb24KK2Fib3V0IGFsbCB0aGUgdGFibGVzLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlN1cHBvcnRzTnVsbFRhYmxlRm9yR2V0SW1wb3J0ZWRLZXlzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbXBvcnRlZEtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+U3VwcG9ydHNOdWxsVGFibGVGb3JHZXRJbXBvcnRlZEtleXM8L2xpdGVyYWw+OiBJZiB0cnVlLCB0aGVuIHRoZQorZGF0YWJhc2Ugc3VwcG9ydHMgcGFzc2luZyBhIDxsaXRlcmFsPm51bGw8L2xpdGVyYWw+IHBhcmFtZXRlciB0byA8bWV0aG9kbmFtZT4KK0RhdGFiYXNlTWV0YURhdGEuZ2V0SW1wb3J0ZWRLZXlzPC9tZXRob2RuYW1lPiBhcyBhbiBvcHRpbWl6YXRpb24gdG8gZ2V0CitpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlIHRhYmxlcy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5Vc2VHZXRCZXN0Um93SWRlbnRpZmllckZvclByaW1hcnlLZXlzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlR2V0QmVzdFJvd0lkZW50aWZpZXJGb3JQcmltYXJ5S2V5cworICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VHZXRCZXN0Um93SWRlbnRpZmllckZvclByaW1hcnlLZXlzPC9saXRlcmFsPjogSWYgdHJ1ZSwgdGhlbgorbWV0YWRhdGEgcXVlcmllcyB3aWxsIHVzZSA8bWV0aG9kbmFtZT5EYXRhYmFzZU1ldGFEYXRhLmdldEJlc3RSb3dJZGVudGlmaWVyCis8L21ldGhvZG5hbWU+IHRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBwcmltYXJ5IGtleXMsIHJhdGhlciB0aGFuIDxtZXRob2RuYW1lPgorRGF0YWJhc2VNZXRhRGF0YS5nZXRQcmltYXJ5S2V5czwvbWV0aG9kbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LlJlcXVpcmVzQXV0b0NvbW1pdEZvck1ldGFkYXRhIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZXNBdXRvQ29tbWl0Rm9yTWV0YURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+UmVxdWlyZXNBdXRvQ29tbWl0Rm9yTWV0YWRhdGE8L2xpdGVyYWw+OiBJZiB0cnVlLCB0aGVuIHRoZSBKREJDIGRyaXZlcgorcmVxdWlyZXMgdGhhdCBhdXRvY29tbWl0IGJlIGVuYWJsZWQgYmVmb3JlIGFueSBzY2hlbWEgaW50ZXJyb2dhdGlvbiBvcGVyYXRpb25zCitjYW4gdGFrZSBwbGFjZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuQXV0b0Fzc2lnbkNsYXVzZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGZpZWxkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0Fzc2lnbkNsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5BdXRvQXNzaWduQ2xhdXNlPC9saXRlcmFsPjogVGhlIGNvbHVtbiBkZWZpbml0aW9uIGNsYXVzZSB0byBhcHBlbmQgdG8KK2EgY3JlYXRpb24gc3RhdGVtZW50LiBGb3IgZXhhbXBsZSwgIiA8bGl0ZXJhbD5BVVRPX0lOQ1JFTUVOVDwvbGl0ZXJhbD4gIiBmb3IKK015U1FMLiBUaGlzIHByb3BlcnR5IGlzIHNldCBhdXRvbWF0aWNhbGx5IGluIHRoZSBkaWN0aW9uYXJ5LCBhbmQgc2hvdWxkIG5vdCBuZWVkCit0byBiZSBvdmVycmlkZGVuLCBhbmQgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNjaGVtYSBpcyBnZW5lcmF0ZWQgdXNpbmcgdGhlCis8bGl0ZXJhbD5tYXBwaW5ndG9vbDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iREJEaWN0aW9uYXJ5LkF1dG9Bc3NpZ25UeXBlTmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9Bc3NpZ25UeXBlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGZpZWxkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0Fzc2lnblR5cGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPkF1dG9Bc3NpZ25UeXBlTmFtZTwvbGl0ZXJhbD46IFRoZSBjb2x1bW4gdHlwZSBuYW1lIGZvciBhdXRvLWluY3JlbWVudAorY29sdW1ucy4gRm9yIGV4YW1wbGUsICIgPGxpdGVyYWw+U0VSSUFMPC9saXRlcmFsPiAiIGZvciBQb3N0Z3JlU1FMLiBUaGlzCitwcm9wZXJ0eSBpcyBzZXQgYXV0b21hdGljYWxseSBpbiB0aGUgZGljdGlvbmFyeSwgYW5kIHNob3VsZCBub3QgbmVlZCB0byBiZQorb3ZlcnJpZGRlbiwgYW5kIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzY2hlbWEgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSA8bGl0ZXJhbD4KK21hcHBpbmd0b29sPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJEQkRpY3Rpb25hcnkuTGFzdEdlbmVyYXRlZEtleVF1ZXJ5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgZmllbGQgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0R2VuZXJhdGVkS2V5UXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+TGFzdEdlbmVyYXRlZEtleVF1ZXJ5PC9saXRlcmFsPjogVGhlIHF1ZXJ5IHRvIGlzc3VlIHRvIG9idGFpbiB0aGUgbGFzdAorYXV0b21hdGljYWxseSBnZW5lcmF0ZWQga2V5IGZvciBhbiBhdXRvLWluY3JlbWVudCBjb2x1bW4uIEZvciBleGFtcGxlLCAiCis8bGl0ZXJhbD5zZWxlY3QgQEBpZGVudGl0eTwvbGl0ZXJhbD4gIiBmb3IgU3liYXNlLiBUaGlzIHByb3BlcnR5IGlzIHNldAorYXV0b21hdGljYWxseSBpbiB0aGUgZGljdGlvbmFyeSwgYW5kIHNob3VsZCBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9IkRCRGljdGlvbmFyeS5OZXh0U2VxdWVuY2VRdWVyeSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFNlcXVlbmNlUXVlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPk5leHRTZXF1ZW5jZVF1ZXJ5PC9saXRlcmFsPjogQSBTUUwgc3RyaW5nIGZvciBvYnRhaW5pbmcgYSBuYXRpdmUKK3NlcXVlbmNlIHZhbHVlLiBNYXkgdXNlIGEgcGxhY2Vob2xkZXIgb2YgPGxpdGVyYWw+ezB9PC9saXRlcmFsPiBmb3IgdGhlIHZhcmlhYmxlCitzZXF1ZW5jZSBuYW1lLiBEZWZhdWx0cyB0byBhIGRhdGFiYXNlLWFwcHJvcHJpYXRlIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZGJzZXR1cF9kYnN1cHBvcnRfbXlzcWwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE15U1FMRGljdGlvbmFyeSBQcm9wZXJ0aWVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF9kYnN1cHBvcnRfbXlzcWwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNeVNRTAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgREJEaWN0aW9uYXJ5CisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5teXNxbDwvbGl0ZXJhbD4gZGljdGlvbmFyeSBhbHNvIHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iTXlTUUxEaWN0aW9uYXJ5LkRyaXZlckRlc2VyaWFsaXplc0Jsb2JzIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeVNRTAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJEZXNlcmlhbGl6ZXNCbG9icworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+RHJpdmVyRGVzZXJpYWxpemVzQmxvYnM8L2xpdGVyYWw+OiBNYW55IE15U1FMIGRyaXZlcnMgYXV0b21hdGljYWxseQorZGVzZXJpYWxpemUgQkxPQnMgb24gY2FsbHMgdG8gPG1ldGhvZG5hbWU+UmVzdWx0U2V0LmdldE9iamVjdDwvbWV0aG9kbmFtZT4uIFRoZQorPGNsYXNzbmFtZT5NeVNRTERpY3Rpb25hcnk8L2NsYXNzbmFtZT4gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZCA8bWV0aG9kbmFtZT4KK0RCRGljdGlvbmFyeS5nZXRCbG9iT2JqZWN0PC9tZXRob2RuYW1lPiBtZXRob2QgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudC4gSWYKK3lvdXIgZHJpdmVyIGRvZXMgbm90IGRlc2VyaWFsaXplIGF1dG9tYXRpY2FsbHksIHNldCB0aGlzIHByb3BlcnR5IHRvIDxsaXRlcmFsPgorZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0gaWQ9Ik15U1FMRGljdGlvbmFyeS5UYWJsZVR5cGUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15U1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+VGFibGVUeXBlPC9saXRlcmFsPjogVGhlIE15U1FMIHRhYmxlIHR5cGUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGFibGVzLgorRGVmYXVsdHMgdG8gPGxpdGVyYWw+aW5ub2RiPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJNeVNRTERpY3Rpb25hcnkuVXNlQ2xvYnMiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15U1FMCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUNsb2JzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VDbG9iczwvbGl0ZXJhbD46IFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgTXlTUUwgZG8gbm90IGhhbmRsZSBjbG9icworY29ycmVjdGx5LiBUbyBlbmFibGUgY2xvYiBmdW5jdGlvbmFsaXR5LCBzZXQgdGhpcyB0byB0cnVlLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK2ZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJNeVNRTERpY3Rpb25hcnkuT3B0aW1pemVNdWx0aVRhYmxlRGVsZXRlcyI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlTUUwKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemVNdWx0aVRhYmxlRGVsZXRlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+T3B0aW1pemVNdWx0aVRhYmxlRGVsZXRlczwvbGl0ZXJhbD46IE15U1FMIGFzIG9mIHZlcnNpb24gNC4wLjAKK3N1cHBvcnRzIG11bHRpcGxlIHRhYmxlcyBpbiA8bGl0ZXJhbD5ERUxFVEU8L2xpdGVyYWw+IHN0YXRlbWVudHMuIFdoZW4KK3RoaXMgb3B0aW9uIGlzIHNldCwgT3BlbkpQQSB3aWxsIHVzZSB0aGF0IHN5bnRheCB3aGVuIGRvaW5nIGJ1bGsgZGVsZXRlcworZnJvbSBtdWx0aXBsZSB0YWJsZXMuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZQorPGxpdGVyYWw+ZGVsZXRlVGFibGVDb250ZW50czwvbGl0ZXJhbD4gPGxpdGVyYWw+U2NoZW1hVG9vbDwvbGl0ZXJhbD4KK2FjdGlvbiBpcyB1c2VkLiAoU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfc2NoZW1hdG9vbCIvPiBmb3IKK21vcmUgaW5mbyBhYm91dCA8bGl0ZXJhbD5kZWxldGVUYWJsZUNvbnRlbnRzPC9saXRlcmFsPi4pIERlZmF1bHRzIHRvCis8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIHNpbmNlIHRoZSBzdGF0ZW1lbnQgbWF5IGZhaWwgaWYgdXNpbmcgSW5ub0RCCit0YWJsZXMgYW5kIGRlbGV0ZSBjb25zdHJhaW50cy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2Ric2V0dXBfZGJzdXBwb3J0X29yYWNsZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgT3JhY2xlRGljdGlvbmFyeSBQcm9wZXJ0aWVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF9kYnN1cHBvcnRfb3JhY2xlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgT3JhY2xlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICBEQkRpY3Rpb25hcnkKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPm9yYWNsZTwvbGl0ZXJhbD4gZGljdGlvbmFyeSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKK3Byb3BlcnRpZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iT3JhY2xlRGljdGlvbmFyeS5Vc2VUcmlnZ2Vyc0ZvckF1dG9Bc3NpZ24iPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yYWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VUcmlnZ2Vyc0ZvckF1dG9Bc3NpZ24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpYyBmaWVsZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVRyaWdnZXJzRm9yQXV0b0Fzc2lnbgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5Vc2VUcmlnZ2Vyc0ZvckF1dG9Bc3NpZ248L2xpdGVyYWw+OiBJZiB0cnVlLCB0aGVuIE9wZW5KUEEgd2lsbCBhbGxvdworc2ltdWxhdGlvbiBvZiBhdXRvLWluY3JlbWVudCBjb2x1bW5zIGJ5IHRoZSB1c2Ugb2YgT3JhY2xlIHRyaWdnZXJzLiBPcGVuSlBBIHdpbGwKK2Fzc3VtZSB0aGF0IHRoZSBjdXJyZW50IHNlcXVlbmNlIHZhbHVlIGZyb20gdGhlIHNlcXVlbmNlIHNwZWNpZmllZCBpbiB0aGUKKzxsaXRlcmFsPkF1dG9Bc3NpZ25TZXF1ZW5jZU5hbWU8L2xpdGVyYWw+IHBhcmFtZXRlciB3aWxsIGhvbGQgdGhlIHZhbHVlIG9mIHRoZQorbmV3IHByaW1hcnkga2V5IGZvciByb3dzIHRoYXQgaGF2ZSBiZWVuIGluc2VydGVkLiBGb3IgbW9yZSBkZXRhaWxzIG9uCithdXRvLWluY3JlbWVudCBzdXBwb3J0LCBzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX29pZF9wa2dlbl9hdXRvaW5jIi8+CisuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iT3JhY2xlRGljdGlvbmFyeS5BdXRvQXNzaWduU2VxdWVuY2VOYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmFjbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0Fzc2lnblNlcXVlbmNlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGZpZWxkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0Fzc2lnblNlcXVlbmNlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5BdXRvQXNzaWduU2VxdWVuY2VOYW1lPC9saXRlcmFsPjogVGhlIGdsb2JhbCBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0aGF0CitPcGVuSlBBIHdpbGwgYXNzdW1lIHRvIGhvbGQgdGhlIHZhbHVlIG9mIHByaW1hcnkga2V5IHZhbHVlIGZvciByb3dzIHRoYXQgdXNlCithdXRvLWluY3JlbWVudC4gSWYgbGVmdCB1bnNldCwgT3BlbkpQQSB3aWxsIHVzZSBhIHRoZSBzZXF1ZW5jZSBuYW1lZCA8bGl0ZXJhbD4KKyJTRVFfJmx0O3RhYmxlIG5hbWUmZ3Q7IjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iT3JhY2xlRGljdGlvbmFyeS5NYXhFbWJlZGRlZEJsb2JTaXplIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmFjbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4RW1iZWRkZWRCbG9iU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhFbWJlZGRlZEJsb2JTaXplCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5NYXhFbWJlZGRlZEJsb2JTaXplPC9saXRlcmFsPjogT3JhY2xlIGlzIHVuYWJsZSB0byBwZXJzaXN0IEJMT0JzIHVzaW5nCit0aGUgZW1iZWRkZWQgdXBkYXRlIG1ldGhvZCB3aGVuIEJMT0JzIGdldCBvdmVyIGEgY2VydGFpbiBzaXplLiBUaGUgc2l6ZSBkZXBlbmRzCitvbiBkYXRhYmFzZSBjb25maWd1cmF0aW9uLCBlLmcuIGVuY29kaW5nLiBUaGlzIHByb3BlcnR5IGRlZmluZXMgdGhlIG1heGltdW0gc2l6ZQorQkxPQiB0byBwZXJzaXN0IHdpdGggdGhlIGVtYmVkZGVkIG1ldGhvZC4gRGVmYXVsdHMgdG8gNDAwMCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtIGlkPSJPcmFjbGVEaWN0aW9uYXJ5Lk1heEVtYmVkZGVkQ2xvYlNpemUiPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yYWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhFbWJlZGRlZENsb2JTaXplCisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9CCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEVtYmVkZGVkQ2xvYlNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPk1heEVtYmVkZGVkQ2xvYlNpemU8L2xpdGVyYWw+OiBPcmFjbGUgaXMgdW5hYmxlIHRvIHBlcnNpc3QgQ0xPQnMgdXNpbmcKK3RoZSBlbWJlZGRlZCB1cGRhdGUgbWV0aG9kIHdoZW4gQ2xvYnMgZ2V0IG92ZXIgYSBjZXJ0YWluIHNpemUuIFRoZSBzaXplIGRlcGVuZHMKK29uIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24sIGUuZy4gZW5jb2RpbmcuIFRoaXMgcHJvcGVydHkgZGVmaW5lcyB0aGUgbWF4aW11bSBzaXplCitDTE9CIHRvIHBlcnNpc3Qgd2l0aCB0aGUgZW1iZWRkZWQgbWV0aG9kLiBEZWZhdWx0cyB0byA0MDAwIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbSBpZD0iT3JhY2xlRGljdGlvbmFyeS5Vc2VTZXRGb3JtT2ZVc2VGb3JVbmljb2RlIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5Vc2VTZXRGb3JtT2ZVc2VGb3JVbmljb2RlPC9saXRlcmFsPjogUHJpb3IgdG8gT3JhY2xlIDEwaSwgc3RhdGVtZW50cworZXhlY3V0ZWQgYWdhaW5zdCB1bmljb2RlIGNhcGFibGUgY29sdW1ucyAodGhlIDxsaXRlcmFsPk5DSEFSPC9saXRlcmFsPiwKKzxsaXRlcmFsPk5WQVJDSEFSPC9saXRlcmFsPiwgPGxpdGVyYWw+TkNMT0I8L2xpdGVyYWw+IE9yYWNsZSB0eXBlcykgcmVxdWlyZWQKK3NwZWNpYWwgaGFuZGxpbmcgdG8gYmUgYWJsZSB0byBzdG9yZSB1bmljb2RlIHZhbHVlcy4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvCit0cnVlICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSBPcGVuSlBBIHRvIGF0dGVtcHQgdG8gZGV0ZWN0IHdoZW4gdGhlIGNvbHVtbiBvZgorb25lIG9mIHRoZXNlIHR5cGVzLCBhbmQgaWYgc28sIHdpbGwgYXR0ZW1wdCB0byBjb3JyZWN0bHkgY29uZmlndXJlIHRoZSBzdGF0ZW1lbnQKK3VzaW5nIHRoZSA8bWV0aG9kbmFtZT4gT3JhY2xlUHJlcGFyZWRTdGF0ZW1lbnQuc2V0Rm9ybU9mVXNlPC9tZXRob2RuYW1lPi4gRm9yCittb3JlIGRldGFpbHMsIHNlZSB0aGUgT3JhY2xlCis8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5vbG9neS9zYW1wbGVfY29kZS90ZWNoL2phdmEvY29kZXNuaXBwZXQvamRiYy9uY2hhci9yZWFkbWUuaHRtbCI+CitSZWFkbWUgRm9yIE5DaGFyPC91bGluaz4uIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IHdvcmsgaWYgT3BlbkpQQSBpcyBhYmxlIHRvCithY2Nlc3MgdGhlIHVuZGVybHlpbmcgPGNsYXNzbmFtZT5PcmFjbGVQcmVwYXJlZFN0YXRlbWVudDwvY2xhc3NuYW1lPiBpbnN0YW5jZSwKK3doaWNoIG1heSBub3QgYmUgcG9zc2libGUgd2hlbiB1c2luZyBzb21lIHRoaXJkLXBhcnR5IGRhdGFzb3VyY2VzLiBJZiBPcGVuSlBBCitkZXRlY3RzIHRoYXQgdGhpcyBpcyB0aGUgY2FzZSwgYSB3YXJuaW5nIHdpbGwgYmUgbG9nZ2VkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZGJzZXR1cF9pc29sYXRpb24iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBTZXR0aW5nIHRoZSBUcmFuc2FjdGlvbiBJc29sYXRpb24KKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF9pc29sYXRpb24iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGlzb2xhdGlvbgorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kYnNldHVwX2lzb2xhdGlvbiI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBKREJDCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGlzb2xhdGlvbgorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Jc29sYXRpb24KKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSB0eXBpY2FsbHkgcmV0YWlucyB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgb2YgdGhlIEpEQkMKK2RyaXZlci4gSG93ZXZlciwgeW91IGNhbiBzcGVjaWZ5IGEgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsIHRvIHVzZSB0aHJvdWdoCit0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5qZGJjLlRyYW5zYWN0aW9uSXNvbGF0aW9uIj48bGl0ZXJhbD4KK29wZW5qcGEuamRiYy5UcmFuc2FjdGlvbklzb2xhdGlvbjwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIFRoZQorZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzdGFuZGFyZCBpc29sYXRpb24gbGV2ZWxzLiBOb3RlIHRoYXQgbm90IGFsbCBkYXRhYmFzZXMKK3N1cHBvcnQgYWxsIGlzb2xhdGlvbiBsZXZlbHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmRlZmF1bHQ8L2xpdGVyYWw+OiBVc2UgdGhlIEpEQkMgZHJpdmVyJ3MgZGVmYXVsdCBpc29sYXRpb24gbGV2ZWwuCitPcGVuSlBBIHVzZXMgdGhpcyBvcHRpb24gaWYgeW91IGRvIG5vdCBleHBsaWNpdGx5IHNwZWNpZnkgYW55IG90aGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ub25lPC9saXRlcmFsPjogTm8gdHJhbnNhY3Rpb24gaXNvbGF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5yZWFkLWNvbW1pdHRlZDwvbGl0ZXJhbD46IERpcnR5IHJlYWRzIGFyZSBwcmV2ZW50ZWQ7IG5vbi1yZXBlYXRhYmxlCityZWFkcyBhbmQgcGhhbnRvbSByZWFkcyBjYW4gb2NjdXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnJlYWQtdW5jb21taXR0ZWQ8L2xpdGVyYWw+OiBEaXJ0eSByZWFkcywgbm9uLXJlcGVhdGFibGUgcmVhZHMgYW5kCitwaGFudG9tIHJlYWRzIGNhbiBvY2N1ci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+cmVwZWF0YWJsZS1yZWFkPC9saXRlcmFsPjogRGlydHkgcmVhZHMgYW5kIG5vbi1yZXBlYXRhYmxlIHJlYWRzIGFyZQorcHJldmVudGVkOyBwaGFudG9tIHJlYWRzIGNhbiBvY2N1ci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2VyaWFsaXphYmxlPC9saXRlcmFsPjogRGlydHkgcmVhZHMsIG5vbi1yZXBlYXRhYmxlIHJlYWRzLCBhbmQgcGhhbnRvbQorcmVhZHMgYXJlIHByZXZlbnRlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9kYnNldHVwX2lzb2V4Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTcGVjaWZ5aW5nIGEgVHJhbnNhY3Rpb24gSXNvbGF0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuamRiYy5UcmFuc2FjdGlvbklzb2xhdGlvbiIgdmFsdWU9InJlcGVhdGFibGUtcmVhZCIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2Ric2V0dXBfc3FsOTIiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBTZXR0aW5nIHRoZSBTUUwgSm9pbiBTeW50YXgKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF9zcWw5MiI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBqb2lucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBzeW50YXggb3B0aW9ucworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kYnNldHVwX3NxbDkyIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBqb2luIHN5bnRheAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK09iamVjdCBxdWVyaWVzIG9mdGVuIGludm9sdmUgdXNpbmcgU1FMIGpvaW5zIGJlaGluZCB0aGUgc2NlbmVzLiBZb3UgY2FuCitjb25maWd1cmUgT3BlbkpQQSB0byB1c2UgZWl0aGVyIFNRTCA5Mi1zdHlsZSBqb2luIHN5bnRheCwgaW4gd2hpY2ggam9pbnMgYXJlCitwbGFjZWQgaW4gdGhlIFNRTCBGUk9NIGNsYXVzZSwgdGhlIHRyYWRpdGlvbmFsIGpvaW4gc3ludGF4LCBpbiB3aGljaCBqb2luCitjcml0ZXJpYSBhcmUgcGFydCBvZiB0aGUgV0hFUkUgY2xhdXNlLCBvciBhIGRhdGFiYXNlLXNwZWNpZmljIGpvaW4gc3ludGF4CittYW5kYXRlZCBieSB0aGUgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfZGJkaWN0Ij48Y2xhc3NuYW1lPgorREJEaWN0aW9uYXJ5PC9jbGFzc25hbWU+PC9saW5rPi4gT3BlbkpQQSBvbmx5IHN1cHBvcnRzIG91dGVyIGpvaW5zIHdoZW4gdXNpbmcKK1NRTCA5MiBzeW50YXggb3IgYSBkYXRhYmFzZS1zcGVjaWZpYyBzeW50YXggd2l0aCBvdXRlciBqb2luIHN1cHBvcnQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitUaGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeSI+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5PC9saXRlcmFsPjwvbGluaz4gcGx1Z2luIGFjY2VwdHMgdGhlIHRoZSA8bGl0ZXJhbD4KK0pvaW5TeW50YXg8L2xpdGVyYWw+IHByb3BlcnR5IHRvIHNldCB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBzeW50YXguIFRoZSBhdmFpbGFibGUKK3ZhbHVlcyBhcmU6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRyYWRpdGlvbmFsPC9saXRlcmFsPjogVHJhZGl0aW9uYWwgU1FMIGpvaW4gc3ludGF4OyBvdXRlciBqb2lucyBhcmUKK25vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmRhdGFiYXNlPC9saXRlcmFsPjogVGhlIGRhdGFiYXNlJ3MgbmF0aXZlIGpvaW4gc3ludGF4LiBEYXRhYmFzZXMgdGhhdAorZG8gbm90IGhhdmUgYSBuYXRpdmUgc3ludGF4IHdpbGwgZGVmYXVsdCB0byBvbmUgb2YgdGhlIG90aGVyIG9wdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnNxbDkyPC9saXRlcmFsPjogQU5TSSBTUUw5MiBqb2luIHN5bnRheC4gT3V0ZXIgam9pbnMgYXJlIHN1cHBvcnRlZC4KK05vdCBhbGwgZGF0YWJhc2VzIHN1cHBvcnQgdGhpcyBzeW50YXguCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorWW91IGNhbiBjaGFuZ2UgdGhlIGpvaW4gc3ludGF4IGF0IHJ1bnRpbWUgdGhyb3VnaCB0aGUgT3BlbkpQQSBmZXRjaAorY29uZmlndXJhdGlvbiBBUEksIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZSIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2Ric2V0dXBfc3FsOTJfY29uZiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3BlY2lmeWluZyB0aGUgSm9pbiBTeW50YXggRGVmYXVsdAorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5IiB2YWx1ZT0iSm9pblN5bnRheD1zcWw5MiIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2Ric2V0dXBfc3FsOTJfZmV0Y2giPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgdGhlIEpvaW4gU3ludGF4IGF0IFJ1bnRpbWUKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuKjsgCisKKy4uLiAKKworUXVlcnkgcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgbSBmcm9tIE1hZ2F6aW5lIG0gd2hlcmUgbS50aXRsZSA9ICdKREonIik7CitPcGVuSlBBUXVlcnkga3EgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChxKTsKK0pEQkNGZXRjaFBsYW4gZmV0Y2ggPSAoSkRCQ0ZldGNoUGxhbikga3EuZ2V0RmV0Y2hQbGFuICgpOworZmV0Y2guc2V0Sm9pblN5bnRheChKREJDRmV0Y2hQbGFuLkpPSU5fU1lOVEFYX1NRTDkyKTsKK0xpc3QgcmVzdWx0cyA9IHEuZ2V0UmVzdWx0TGlzdCgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2Ric2V0dXBfbXVsdGlkYiI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEFjY2Vzc2luZyBNdWx0aXBsZSBEYXRhYmFzZXMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGJzZXR1cF9tdWx0aWRiIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHJlbGF0aW9uYWwgZGF0YWJhc2UKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgYWNjZXNzaW5nIG11bHRpcGxlIGRhdGFiYXNlcworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1Rocm91Z2ggdGhlIHByb3BlcnRpZXMgd2UndmUgY292ZXJlZCB0aHVzIGZhciwgeW91IGNhbiBjb25maWd1cmUgZWFjaCAKKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gdG8gYWNjZXNzIGEgZGlmZmVyZW50CitkYXRhYmFzZS4gSWYgeW91ciBhcHBsaWNhdGlvbiBhY2Nlc3NlcyBtdWx0aXBsZSBkYXRhYmFzZXMsIHdlIHJlY29tbWVuZCB0aGF0IHlvdQorbWFpbnRhaW4gYSBzZXBhcmF0ZSBwZXJzaXN0ZW5jZSB1bml0IGZvciBlYWNoIG9uZS4gVGhpcyB3aWxsIGFsbG93IHlvdSB0byBlYXNpbHkKK2xvYWQgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZvciBlYWNoIGRhdGFiYXNlIGF0IHJ1bnRpbWUsIGFuZCB0byBnaXZlIHRoZQorY29ycmVjdCBjb25maWd1cmF0aW9uIGZpbGUgdG8gT3BlbkpQQSdzIGNvbW1hbmQtbGluZSB0b29scyBkdXJpbmcgZGV2ZWxvcG1lbnQuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kYnNldHVwX3JldGFpbiI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIENvbmZpZ3VyaW5nIHRoZSBVc2Ugb2YgSkRCQyBDb25uZWN0aW9ucworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kYnNldHVwX3JldGFpbiI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICB1c2FnZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0luIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIE9wZW5KUEEgb2J0YWlucyBKREJDIGNvbm5lY3Rpb25zIG9uIGFuIGFzLW5lZWRlZAorYmFzaXMuIE9wZW5KUEEgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBkbyBub3QgcmV0YWluIGEgY29ubmVjdGlvbgordG8gdGhlIGRhdGFiYXNlIHVubGVzcyB0aGV5IGFyZSBpbiBhIGRhdGFzdG9yZSB0cmFuc2FjdGlvbiBvciB0aGVyZSBhcmUgb3BlbgorPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiByZXN1bHRzIHRoYXQgYXJlIHVzaW5nIGEgbGl2ZSBKREJDIHJlc3VsdCBzZXQuIEF0CithbGwgb3RoZXIgdGltZXMsIGluY2x1ZGluZyBkdXJpbmcgb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMsIDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyByZXF1ZXN0IGEgY29ubmVjdGlvbiBmb3IgZWFjaCBxdWVyeSwgdGhlbgoraW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJldGFpbk1vZGUKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CitJbiBzb21lIGNhc2VzLCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gcmV0YWluIGNvbm5lY3Rpb25zIGZvciBsb25nZXIgcGVyaW9kcworb2YgdGltZS4gWW91IGNhbiBjb25maWd1cmUgT3BlbkpQQSdzIHVzZSBvZiBKREJDIGNvbm5lY3Rpb25zIHRocm91Z2ggdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25SZXRhaW5Nb2RlIj48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvblJldGFpbk1vZGU8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBUaGUKK3Byb3BlcnR5IGFjY2VwdHMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmFsd2F5czwvbGl0ZXJhbD46IEVhY2ggPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IG9idGFpbnMgYQorc2luZ2xlIGNvbm5lY3Rpb24gYW5kIHVzZXMgaXQgdW50aWwgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPgorY2xvc2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD50cmFuc2FjdGlvbjwvbGl0ZXJhbD46IEEgY29ubmVjdGlvbiBpcyBvYnRhaW5lZCB3aGVuIGVhY2ggdHJhbnNhY3Rpb24KK2JlZ2lucyAob3B0aW1pc3RpYyBvciBkYXRhc3RvcmUpLCBhbmQgaXMgcmVsZWFzZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24KK2NvbXBsZXRlcy4gTm9uLXRyYW5zYWN0aW9uYWwgY29ubmVjdGlvbnMgYXJlIG9idGFpbmVkIG9uLWRlbWFuZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+b24tZGVtYW5kPC9saXRlcmFsPjogQ29ubmVjdGlvbnMgYXJlIG9idGFpbmVkIG9ubHkgd2hlbiBuZWVkZWQuIFRoaXMKK29wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSA8bGl0ZXJhbD50cmFuc2FjdGlvbjwvbGl0ZXJhbD4gb3B0aW9uIHdoZW4gZGF0YXN0b3JlCit0cmFuc2FjdGlvbnMgYXJlIHVzZWQuIEZvciBvcHRpbWlzdGljIHRyYW5zYWN0aW9ucywgdGhvdWdoLCBpdCBtZWFucyB0aGF0IGEKK2Nvbm5lY3Rpb24gd2lsbCBiZSByZXRhaW5lZCBvbmx5IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGRhdGFzdG9yZSBmbHVzaCBhbmQKK2NvbW1pdCBwcm9jZXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1lvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBjb25uZWN0aW9uIHJldGFpbiBtb2RlIG9mIGluZGl2aWR1YWwgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zIHdoZW4geW91IHJldHJpZXZlIHRoZW0gZnJvbSB0aGUgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+LiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9ydW50aW1lX2VtZmFjdG9yeSIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIEZsdXNoQmVmb3JlUXVlcmllcworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK1RoZSA8bGluayBsaW5rZW5kPSJvcGVuanBhLkZsdXNoQmVmb3JlUXVlcmllcyI+PGxpdGVyYWw+CitvcGVuanBhLkZsdXNoQmVmb3JlUXVlcmllczwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgY29udHJvbHMKK2Fub3RoZXIgYXNwZWN0IG9mIGNvbm5lY3Rpb24gdXNhZ2U6IHdoZXRoZXIgdG8gZmx1c2ggdHJhbnNhY3Rpb25hbCBjaGFuZ2VzCitiZWZvcmUgZXhlY3V0aW5nIG9iamVjdCBxdWVyaWVzLiBUaGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIHF1ZXJpZXMgdGhhdCB3b3VsZAorb3RoZXJ3aXNlIGhhdmUgdG8gYmUgZXhlY3V0ZWQgaW4tbWVtb3J5IGJlY2F1c2UgdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLklnbm9yZUNoYW5nZXMiPjxsaXRlcmFsPklnbm9yZUNoYW5nZXM8L2xpdGVyYWw+PC9saW5rPgorcHJvcGVydHkgaXMgc2V0IHRvIGZhbHNlIGFuZCB0aGUgcXVlcnkgbWF5IGludm9sdmUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbgorY2hhbmdlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gTGVnYWwgdmFsdWVzIGFyZToKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD46IEFsd2F5cyBmbHVzaCByYXRoZXIgdGhhbiBleGVjdXRpbmcgdGhlIHF1ZXJ5Citpbi1tZW1vcnkuIElmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIG9wdGltaXN0aWMsIE9wZW5KUEEgd2lsbCBiZWdpbiBhCitub24tbG9ja2luZyBkYXRhc3RvcmUgdHJhbnNhY3Rpb24uIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPjogTmV2ZXIgZmx1c2ggYmVmb3JlIGEgcXVlcnkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPndpdGgtY29ubmVjdGlvbjwvbGl0ZXJhbD46IEZsdXNoIG9ubHkgaWYgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcgorPC9jbGFzc25hbWU+IGhhcyBhbHJlYWR5IGVzdGFibGlzaGVkIGEgZGVkaWNhdGVkIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFzdG9yZSwKK290aGVyd2lzZSBleGVjdXRlIHRoZSBxdWVyeSBpbi1tZW1vcnkuCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgeW91IHVzZSBsb25nLXJ1bm5pbmcgb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMgYW5kIHdhbnQKK3RvIGVuc3VyZSB0aGF0IHRoZXNlIHRyYW5zYWN0aW9ucyBkbyBub3QgY29uc3VtZSBkYXRhYmFzZSByZXNvdXJjZXMgdW50aWwKK2NvbW1pdC4gT3BlbkpQQSdzIGJlaGF2aW9yIHdpdGggdGhpcyBvcHRpb24gaXMgZGVwZW5kZW50IG9uIHRoZSB0cmFuc2FjdGlvbgorc3RhdHVzIGFuZCBtb2RlLCBhcyB3ZWxsIGFzIHRoZSBjb25maWd1cmVkIGNvbm5lY3Rpb24gcmV0YWluIG1vZGUgZGVzY3JpYmVkCitlYXJsaWVyIGluIHRoaXMgc2VjdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitUaGUgZmx1c2ggbW9kZSBjYW4gYWxzbyBiZSB2YXJpZWQgYXQgcnVudGltZSB1c2luZyB0aGUgT3BlbkpQQSBmZXRjaAorY29uZmlndXJhdGlvbiBBUEksIGRpc2N1c3NlZCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZSIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGZsdXNoCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGF1dG9tYXRpYworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorVGhlIHRhYmxlIGJlbG93IGRlc2NyaWJlcyB0aGUgYmVoYXZpb3Igb2YgYXV0b21hdGljIGZsdXNoaW5nIGluIHZhcmlvdXMKK3NpdHVhdGlvbnMuIEluIGFsbCBjYXNlcywgZmx1c2hpbmcgd2lsbCBvbmx5IG9jY3VyIGlmIE9wZW5KUEEgZGV0ZWN0cyB0aGF0IHlvdQoraGF2ZSBtYWRlIG1vZGlmaWNhdGlvbnMgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdGhhdCBtYXkgYWZmZWN0IHRoZSBxdWVyeSdzCityZXN1bHRzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBPcGVuSlBBIEF1dG9tYXRpYyBGbHVzaCBCZWhhdmlvcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgcm93c2VwPSIxIiBjb2xzZXA9IjEiIGFsaWduPSJsZWZ0IiBjb2xzPSI1Ij4KKyAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJjb2wxIi8+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0iY29sMiIvPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9ImNvbDMiLz4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJjb2w0Ii8+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0iY29sNSIvPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sMiI+CitGbHVzaEJlZm9yZVF1ZXJpZXMgPSBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wzIj4KK0ZsdXNoQmVmb3JlUXVlcmllcyA9IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sNCI+CitGbHVzaEJlZm9yZVF1ZXJpZXMgPSB3aXRoLWNvbm5lY3Rpb247IAorQ29ubmVjdGlvblJldGFpbk1vZGUgPSBvbi1kZW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sNSI+CitGbHVzaEJlZm9yZVF1ZXJpZXMgPSB3aXRoLWNvbm5lY3Rpb247IAorQ29ubmVjdGlvblJldGFpbk1vZGUgPSB0cmFuc2FjdGlvbiBvciBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNvbDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KK0lnbm9yZUNoYW5nZXMgPSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sMiI+CitubyBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wzIj4KK25vIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNvbDQiPgorbm8gZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sNSI+CitubyBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorSWdub3JlQ2hhbmdlcyA9IGZhbHNlOyBubyB0eCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wyIj4KK25vIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNvbDMiPgorbm8gZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sNCI+CitubyBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2w1Ij4KK25vIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CitJZ25vcmVDaGFuZ2VzID0gZmFsc2U7IGRhdGFzdG9yZSB0eCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wyIj4KK25vIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNvbDMiPgorZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sNCI+CitmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2w1Ij4KK2ZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CitJZ25vcmVDaGFuZ2VzID0gZmFsc2U7IG9wdGltaXN0aWMgdHggYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sMiI+CitubyBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJjb2wzIj4KK2ZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImNvbDQiPgorbm8gZmx1c2ggdW5sZXNzIDxtZXRob2RuYW1lPmZsdXNoPC9tZXRob2RuYW1lPiBoYXMgYWxyZWFkeSBiZWVuIGludm9rZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iY29sNSI+CitmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2Ric2V0dXBfc3FsOTJfcmV0YWluX2NvbmYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgQ29ubmVjdGlvbiBVc2FnZSBEZWZhdWx0cworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb25SZXRhaW5Nb2RlIiB2YWx1ZT0ib24tZGVtYW5kIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5GbHVzaEJlZm9yZVF1ZXJpZXMiIHZhbHVlPSJ0cnVlIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfZGJzZXR1cF9zcWw5Ml9yZXRhaW5fcnVudGltZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3BlY2lmeWluZyBDb25uZWN0aW9uIFVzYWdlIGF0IFJ1bnRpbWUKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy8vIG9idGFpbmluZyBhbiBlbSB3aXRoIGEgY2VydGFpbiBjb25uZWN0aW9uIHJldGFpbiBtb2RlCitNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcCgpOworcHJvcHMucHV0KCJvcGVuanBhLkNvbm5lY3Rpb25SZXRhaW5Nb2RlIiwgImFsd2F5cyIpOworRW50aXR5TWFuYWdlciBlbSA9IGVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKHByb3BzKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kYnNldHVwX2xycyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIExhcmdlIFJlc3VsdCBTZXRzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2Ric2V0dXBfbHJzIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgSkRCQworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBsYXJnZSByZXN1bHQgc2V0cworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorQnkgZGVmYXVsdCwgT3BlbkpQQSB1c2VzIHN0YW5kYXJkIGZvcndhcmQtb25seSBKREJDIHJlc3VsdCBzZXRzLCBhbmQgY29tcGxldGVseQoraW5zdGFudGlhdGVzIHRoZSByZXN1bHRzIG9mIGRhdGFiYXNlIHF1ZXJpZXMgb24gZXhlY3V0aW9uLiBXaGVuIHVzaW5nIGEgSkRCQworZHJpdmVyIHRoYXQgc3VwcG9ydHMgdmVyc2lvbiAyLjAgb3IgaGlnaGVyIG9mIHRoZSBKREJDIHNwZWNpZmljYXRpb24sIGhvd2V2ZXIsCit5b3UgY2FuIGNvbmZpZ3VyZSBPcGVuSlBBIHRvIHVzZSBzY3JvbGxpbmcgcmVzdWx0IHNldHMgdGhhdCBtYXkgbm90IGJyaW5nIGFsbAorcmVzdWx0cyBpbnRvIG1lbW9yeSBhdCBvbmNlLiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBudW1iZXIgb2YgcmVzdWx0IG9iamVjdHMKK09wZW5KUEEga2VlcHMgcmVmZXJlbmNlcyB0bywgYWxsb3dpbmcgeW91IHRvIHRyYXZlcnNlIHBvdGVudGlhbGx5IGVub3Jtb3VzCithbW91bnRzIG9mIGRhdGEgd2l0aG91dCBleGhhdXN0aW5nIEpWTSBtZW1vcnkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gYWxzbyBjb25maWd1cmUgb24tZGVtYW5kIGxvYWRpbmcgZm9yIGluZGl2aWR1YWwgY29sbGVjdGlvbiBhbmQgbWFwCitmaWVsZHMgdmlhIGxhcmdlIHJlc3VsdCBzZXQgcHJveGllcy4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfc2Nvc19wcm94eV9scnMiLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPHBhcmE+CitVc2UgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBPcGVuSlBBJ3MgaGFuZGxpbmcgb2YgcmVzdWx0IHNldHM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZldGNoQmF0Y2hTaXplCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuRmV0Y2hCYXRjaFNpemUiPjxsaXRlcmFsPm9wZW5qcGEuRmV0Y2hCYXRjaFNpemU8L2xpdGVyYWw+Cis8L2xpbms+OiBUaGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gaW5zdGFudGlhdGUgYXQgb25jZSB3aGVuIHRyYXZlcnNpbmcgYSByZXN1bHQKK3NldC4gVGhpcyBudW1iZXIgd2lsbCBiZSBzZXQgYXMgdGhlIGZldGNoIHNpemUgb24gSkRCQyA8Y2xhc3NuYW1lPlN0YXRlbWVudAorPC9jbGFzc25hbWU+IG9iamVjdHMgdXNlZCB0byBvYnRhaW4gcmVzdWx0IHNldHMuIEl0IGFsc28gZmFjdG9ycyBpbiB0byB0aGUKK251bWJlciBvZiBvYmplY3RzIE9wZW5KUEEgd2lsbCBtYWludGFpbiBhIGhhcmQgcmVmZXJlbmNlIHRvIHdoZW4gdHJhdmVyc2luZyBhCitxdWVyeSByZXN1bHQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGZldGNoIHNpemUgZGVmYXVsdHMgdG8gLTEsIG1lYW5pbmcgYWxsIHJlc3VsdHMgd2lsbCBiZSBpbnN0YW50aWF0ZWQKK2ltbWVkaWF0ZWx5IG9uIHF1ZXJ5IGV4ZWN1dGlvbi4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRvIHVzZSB0aGUgSkRCQyBkcml2ZXIncworZGVmYXVsdCBiYXRjaCBzaXplLiBUaHVzIHRvIGVuYWJsZSBsYXJnZSByZXN1bHQgc2V0IGhhbmRsaW5nLCB5b3UgbXVzdCBzZXQgdGhpcworcHJvcGVydHkgdG8gMCBvciB0byBhIHBvc2l0aXZlIG51bWJlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0U2V0VHlwZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuUmVzdWx0U2V0VHlwZSI+PGxpdGVyYWw+IG9wZW5qcGEuamRiYy5SZXN1bHRTZXRUeXBlCis8L2xpdGVyYWw+PC9saW5rPjogVGhlIHR5cGUgb2YgcmVzdWx0IHNldCB0byB1c2Ugd2hlbiBleGVjdXRpbmcgZGF0YWJhc2UKK3F1ZXJpZXMuIFRoaXMgcHJvcGVydHkgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhbHVlcywgZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcworZXhhY3RseSB0byB0aGUgc2FtZS1uYW1lZCA8Y2xhc3NuYW1lPmphdmEuc3FsLlJlc3VsdFNldDwvY2xhc3NuYW1lPiBjb25zdGFudDoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5mb3J3YXJkLW9ubHk8L2xpdGVyYWw+OiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnNjcm9sbC1zZW5zaXRpdmU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2Nyb2xsLWluc2Vuc2l0aXZlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorRGlmZmVyZW50IEpEQkMgZHJpdmVycyB0cmVhdCB0aGUgZGlmZmVyZW50IHJlc3VsdCBzZXQgdHlwZXMgZGlmZmVyZW50bHkuIE5vdCBhbGwKK2RyaXZlcnMgc3VwcG9ydCBhbGwgdHlwZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZldGNoRGlyZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5GZXRjaERpcmVjdGlvbiI+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuRmV0Y2hEaXJlY3Rpb248L2xpdGVyYWw+PC9saW5rPjogVGhlIGV4cGVjdGVkIG9yZGVyIGluIHdoaWNoIHlvdQord2lsbCBhY2Nlc3MgdGhlIHF1ZXJ5IHJlc3VsdHMuIFRoaXMgcHJvcGVydHkgYWZmZWN0cyB0aGUgdHlwZSBvZiBkYXRhc3RydWN0dXJlCitPcGVuSlBBIHdpbGwgdXNlIHRvIGhvbGQgdGhlIHJlc3VsdHMsIGFuZCBpcyBhbHNvIGdpdmVuIHRvIHRoZSBKREJDIGRyaXZlciBpbgorY2FzZSBpdCBjYW4gb3B0aW1pemUgZm9yIGNlcnRhaW4gYWNjZXNzIHBhdHRlcm5zLiBUaGlzIHByb3BlcnR5IGFjY2VwdHMgdGhlCitmb2xsb3dpbmcgdmFsdWVzLCBlYWNoIG9mIHdoaWNoIGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIHNhbWUtbmFtZWQKKzxjbGFzc25hbWU+amF2YS5zcWwuUmVzdWx0U2V0PC9jbGFzc25hbWU+IEZFVENIIGNvbnN0YW50OgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZvcndhcmQ8L2xpdGVyYWw+OiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnJldmVyc2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dW5rbm93bjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK05vdCBhbGwgZHJpdmVycyBzdXBwb3J0IGFsbCBmZXRjaCBkaXJlY3Rpb25zLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBMUlNTaXplCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5MUlNTaXplIj48bGl0ZXJhbD4gb3BlbmpwYS5qZGJjLkxSU1NpemU8L2xpdGVyYWw+Cis8L2xpbms+OiBUaGUgc3RyYXRlZ3kgT3BlbkpQQSB3aWxsIHVzZSB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgcmVzdWx0IHNldHMuCitUaGlzIHByb3BlcnR5IGlzIDxlbXBoYXNpcyByb2xlPSJib2xkIj5vbmx5PC9lbXBoYXNpcz4gdXNlZCBpZiB5b3UgY2hhbmdlIHRoZQorZmV0Y2ggYmF0Y2ggc2l6ZSBmcm9tIGl0cyBkZWZhdWx0IG9mIC0xLCBzbyB0aGF0IE9wZW5KUEEgYmVnaW5zIHRvIHVzZSBvbi1kZW1hbmQKK3Jlc3VsdCBsb2FkaW5nLiBBdmFpbGFibGUgdmFsdWVzIGFyZToKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5xdWVyeTwvbGl0ZXJhbD46IFRoaXMgaXMgdGhlIGRlZmF1bHQuIFRoZSBmaXJzdCB0aW1lIHlvdSBhc2sgZm9yIHRoZQorc2l6ZSBvZiBhIHF1ZXJ5IHJlc3VsdCwgT3BlbkpQQSB3aWxsIHBlcmZvcm0gYSA8bGl0ZXJhbD5TRUxFQ1QgQ09VTlQoKikKKzwvbGl0ZXJhbD4gcXVlcnkgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgcmVzdWx0cy4gTm90ZSB0aGF0CitkZXBlbmRpbmcgb24gdHJhbnNhY3Rpb24gc3RhdHVzIGFuZCBzZXR0aW5ncywgdGhpcyBjYW4gbWVhbiB0aGF0IHRoZSByZXBvcnRlZAorc2l6ZSBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiByZXN1bHRzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5sYXN0PC9saXRlcmFsPjogSWYgeW91IGhhdmUgY2hvc2VuIGEgc2Nyb2xsYWJsZSByZXN1bHQgc2V0IHR5cGUsIHRoaXMKK3NldHRpbmcgd2lsbCB1c2UgdGhlIDxtZXRob2RuYW1lPlJlc3VsdFNldC5sYXN0PC9tZXRob2RuYW1lPiBtZXRob2QgdG8gbW92ZSB0bwordGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcmVzdWx0IHNldCBhbmQgZ2V0IGl0cyBpbmRleC4gVW5mb3J0dW5hdGVseSwgc29tZSBKREJDCitkcml2ZXJzIHdpbGwgYnJpbmcgYWxsIHJlc3VsdHMgaW50byBtZW1vcnkgaW4gb3JkZXIgdG8gYWNjZXNzIHRoZSBsYXN0IG9uZS4gTm90ZQordGhhdCBpZiB5b3UgZG8gbm90IGNob29zZSBhIHNjcm9sbGFibGUgcmVzdWx0IHNldCB0eXBlLCB0aGVuIHRoaXMgd2lsbCBiZWhhdmUKK2V4YWN0bHkgbGlrZSA8bGl0ZXJhbD51bmtub3duPC9saXRlcmFsPi4gVGhlIGRlZmF1bHQgcmVzdWx0IHNldCB0eXBlIGlzCis8bGl0ZXJhbD5mb3J3YXJkLW9ubHk8L2xpdGVyYWw+LCBzbyB5b3UgbXVzdCBjaGFuZ2UgdGhlIHJlc3VsdCBzZXQgdHlwZSBpbgorb3JkZXIgZm9yIHRoaXMgcHJvcGVydHkgdG8gaGF2ZSBhbiBlZmZlY3QuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dW5rbm93bjwvbGl0ZXJhbD46IFVuZGVyIHRoaXMgc2V0dGluZyBPcGVuSlBBIHdpbGwgcmV0dXJuIDxsaXRlcmFsPgorSW50ZWdlci5NQVhfVkFMVUU8L2xpdGVyYWw+IGFzIHRoZSBzaXplIGZvciBhbnkgcXVlcnkgcmVzdWx0IHRoYXQgdXNlcyBvbi1kZW1hbmQKK2xvYWRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9kYnNldHVwX2xyc19kZWYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgUmVzdWx0IFNldCBEZWZhdWx0cworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkZldGNoQmF0Y2hTaXplIiB2YWx1ZT0iMjAiLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLmpkYmMuUmVzdWx0U2V0VHlwZSIgdmFsdWU9InNjcm9sbC1pbnNlbnNpdGl2ZSIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuamRiYy5GZXRjaERpcmVjdGlvbiIgdmFsdWU9ImZvcndhcmQiLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLmpkYmMuTFJTU2l6ZSIgdmFsdWU9Imxhc3QiLyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CitNYW55IDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9ydW50aW1lIj5PcGVuSlBBIHJ1bnRpbWUgY29tcG9uZW50czwvbGluaz4gYWxzbworaGF2ZSBtZXRob2RzIHRvIGNvbmZpZ3VyZSB0aGVzZSBwcm9wZXJ0aWVzIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzIHRocm91Z2ggdGhlaXIKK2ZldGNoIGNvbmZpZ3VyYXRpb24uIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZSIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2Ric2V0dXBfbHJzX3J1bnRpbWUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgUmVzdWx0IFNldCBCZWhhdmlvciBhdCBSdW50aW1lCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IGphdmEuc3FsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuKjsKKworLi4uCisKK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IG0gZnJvbSBNYWdhemluZSBtIHdoZXJlIG0udGl0bGUgPSAnSkRKJyIpOworT3BlbkpQQVF1ZXJ5IGtxID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QocSk7CitKREJDRmV0Y2hQbGFuIGZldGNoID0gKEpEQkNGZXRjaFBsYW4pIGtxLmdldEZldGNoUGxhbigpOworZmV0Y2guc2V0RmV0Y2hTaXplKDIwKTsKK2ZldGNoLnNldFJlc3VsdFNldFR5cGUoUmVzdWx0U2V0LlRZUEVfU0NST0xMX0lOU0VOU0lUSVZFKTsKK2ZldGNoLnNldEZldGNoRGlyZWN0aW9uKFJlc3VsdFNldC5GRVRDSF9GT1JXQVJEKTsKK2ZldGNoLnNldExSU1NpemUoSkRCQ0ZldGNoUGxhbi5TSVpFX0xBU1QpOworTGlzdCByZXN1bHRzID0gcS5nZXRSZXN1bHRMaXN0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfc2NoZW1hX2RlZiI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIERlZmF1bHQgU2NoZW1hCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3NjaGVtYV9kZWYiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGRlZmF1bHQKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitJdCBpcyBjb21tb24gdG8gZHVwbGljYXRlIGEgZGF0YWJhc2UgbW9kZWwgaW4gbXVsdGlwbGUgc2NoZW1hcy4gWW91IG1heSBoYXZlIG9uZQorc2NoZW1hIGZvciBkZXZlbG9wbWVudCBhbmQgYW5vdGhlciBmb3IgcHJvZHVjdGlvbiwgb3IgZGlmZmVyZW50IGRhdGFiYXNlIHVzZXJzCittYXkgYWNjZXNzIGRpZmZlcmVudCBzY2hlbWFzLiBPcGVuSlBBIGZhY2lsaXRhdGVzIHRoZXNlIHBhdHRlcm5zIHdpdGggdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuU2NoZW1hIj48bGl0ZXJhbD5vcGVuanBhLmpkYmMuU2NoZW1hPC9saXRlcmFsPgorPC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IGVzdGFibGlzaGVzIGEgZGVmYXVsdCBzY2hlbWEgZm9yCithbnkgdW5xdWFsaWZpZWQgdGFibGUgbmFtZXMsIGFsbG93aW5nIHlvdSB0byBsZWF2ZSBzY2hlbWEgbmFtZXMgb3V0IG9mIHlvdXIKK21hcHBpbmcgZGVmaW5pdGlvbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+U2NoZW1hPC9saXRlcmFsPiBwcm9wZXJ0eSBhbHNvIGVzdGFibGlzaGVzIHRoZSBkZWZhdWx0IHNjaGVtYSBmb3IKK25ldyB0YWJsZXMgY3JlYXRlZCB0aHJvdWdoIE9wZW5KUEEgdG9vbHMsIHN1Y2ggYXMgdGhlIG1hcHBpbmcgdG9vbCBjb3ZlcmVkIGluCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19tYXBwaW5ndG9vbCIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3NjaGVtYV9pbmZvIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgU2NoZW1hIFJlZmxlY3Rpb24KKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX2luZm8iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24KKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBIG5lZWRzIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgZGF0YWJhc2Ugc2NoZW1hIGZvciB0d28gcmVhc29ucy4gRmlyc3QsIGl0CitjYW4gdXNlIHNjaGVtYSBpbmZvcm1hdGlvbiBhdCBydW50aW1lIHRvIHZhbGlkYXRlIHRoYXQgeW91ciBzY2hlbWEgaXMgY29tcGF0aWJsZQord2l0aCB5b3VyIHBlcnNpc3RlbnQgY2xhc3MgZGVmaW5pdGlvbnMuIFNlY29uZCwgT3BlbkpQQSByZXF1aXJlcyBzY2hlbWEKK2luZm9ybWF0aW9uIGR1cmluZyBkZXZlbG9wbWVudCBzbyB0aGF0IGl0IGNhbiBtYW5pcHVsYXRlIHRoZSBzY2hlbWEgdG8gbWF0Y2gKK3lvdXIgb2JqZWN0IG1vZGVsLiBPcGVuSlBBIHVzZXMgdGhlIDxsaXRlcmFsPlNjaGVtYUZhY3Rvcnk8L2xpdGVyYWw+IGludGVyZmFjZQordG8gcHJvdmlkZSBydW50aW1lIG1hcHBpbmcgaW5mb3JtYXRpb24sIGFuZCB0aGUgPGNsYXNzbmFtZT5TY2hlbWFUb29sCis8L2NsYXNzbmFtZT4gZm9yIGRldmVsb3BtZW50LXRpbWUgZGF0YS4gRWFjaCBpcyBwcmVzZW50ZWQgYmVsb3cuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9zY2hlbWFfaW5mb19saXN0Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTY2hlbWFzIExpc3QKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9zY2hlbWFfaW5mb19saXN0Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX2luZm9fbGlzdCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBzY2hlbWFzIGxpc3QKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitCeSBkZWZhdWx0LCBzY2hlbWEgcmVmbGVjdGlvbiBhY3RzIG9uIGFsbCB0aGUgc2NoZW1hcyB5b3VyIEpEQkMgZHJpdmVyIGNhbgorInNlZSIuIFlvdSBjYW4gbGltaXQgdGhlIHNjaGVtYXMgYW5kIHRhYmxlcyBPcGVuSlBBIGFjdHMgb24gd2l0aCB0aGUgPGxpdGVyYWw+CitvcGVuanBhLmpkYmMuU2NoZW1hczwvbGl0ZXJhbD4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGEKK2NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHNjaGVtYXMgYW5kIHRhYmxlcy4gVG8gbGlzdCBhIHNjaGVtYSwgbGlzdCBpdHMgbmFtZS4gVG8KK2xpc3QgYSB0YWJsZSwgbGlzdCBpdHMgZnVsbCBuYW1lIGluIHRoZSBmb3JtIDxsaXRlcmFsPgorJmx0O3NjaGVtYS1uYW1lJmd0Oy4mbHQ7dGFibGUtbmFtZSZndDs8L2xpdGVyYWw+LiBJZiBhIHRhYmxlIGRvZXMgbm90IGhhdmUgYQorc2NoZW1hIG9yIHlvdSBkbyBub3Qga25vdyBpdHMgc2NoZW1hLCBsaXN0IGl0cyBuYW1lIGFzIDxsaXRlcmFsPgorLiZsdDt0YWJsZS1uYW1lJmd0OzwvbGl0ZXJhbD4gKG5vdGljZSB0aGUgcHJlY2VkaW5nICcuJykuIEZvciBleGFtcGxlLCB0byBsaXN0Cit0aGUgPGxpdGVyYWw+QlVTT0JKUzwvbGl0ZXJhbD4gc2NoZW1hLCB0aGUgPGxpdGVyYWw+QUREUkVTUzwvbGl0ZXJhbD4gdGFibGUgaW4KK3RoZSA8bGl0ZXJhbD5HRU5FUkFMPC9saXRlcmFsPiBzY2hlbWEsIGFuZCB0aGUgPGxpdGVyYWw+U1lTVEVNX0lORk88L2xpdGVyYWw+Cit0YWJsZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHNjaGVtYSBpdCBpcyBpbiwgdXNlIHRoZSBzdHJpbmc6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitCVVNPQkpTLEdFTkVSQUwuQUREUkVTUywuU1lTVEVNX0lORk8KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1NvbWUgZGF0YWJhc2VzIGFyZSBjYXNlLXNlbnNpdGl2ZSB3aXRoIHJlc3BlY3QgdG8gc2NoZW1hIGFuZCB0YWJsZSBuYW1lcy4KK09yYWNsZSwgZm9yIGV4YW1wbGUsIHJlcXVpcmVzIG5hbWVzIGluIGFsbCB1cHBlciBjYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3NjaGVtYV9pbmZvX2ZhY3RvcnkiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNjaGVtYSBGYWN0b3J5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX2luZm9fZmFjdG9yeSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBTY2hlbWFGYWN0b3J5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSByZWxpZXMgb24gdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9TY2hlbWFGYWN0b3J5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcGVuanBhLmpkYmMuU2NoZW1hRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+IGludGVyZmFjZSBmb3IgcnVudGltZQorc2NoZW1hIGluZm9ybWF0aW9uLiBZb3UgY2FuIGNvbnRyb2wgdGhlIHNjaGVtYSBmYWN0b3J5IE9wZW5KUEEgdXNlcyB0aHJvdWdoIHRoZQorPGxpdGVyYWw+b3BlbmpwYS5qZGJjLlNjaGVtYUZhY3Rvcnk8L2xpdGVyYWw+IHByb3BlcnR5LiBUaGVyZSBhcmUgc2V2ZXJhbAorYnVpbHQtaW4gb3B0aW9ucyB0byBjaG9vc2UgZnJvbToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmR5bmFtaWM8L2xpdGVyYWw+OiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcuIEl0IGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvc2NoZW1hL0R5bmFtaWNTY2hlbWFGYWN0b3J5Lmh0bWwiPgorPGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5EeW5hbWljU2NoZW1hRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+LiBUaGUgCis8Y2xhc3NuYW1lPkR5bmFtaWNTY2hlbWFGYWN0b3J5PC9jbGFzc25hbWU+IGlzIHRoZSBtb3N0IHBlcmZvcm1hbnQKK3NjaGVtYSBmYWN0b3J5LCBiZWNhdXNlIGl0IGRvZXMgbm90IHZhbGlkYXRlIG1hcHBpbmcgaW5mb3JtYXRpb24gYWdhaW5zdCB0aGUKK2RhdGFiYXNlLiBJbnN0ZWFkLCBpdCBhc3N1bWVzIGFsbCBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uIGlzCitjb3JyZWN0LCBhbmQgZHluYW1pY2FsbHkgYnVpbGRzIGFuIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NoZW1hIGZyb20KK3lvdXIgbWFwcGluZyBtZXRhZGF0YS4gV2hlbiB1c2luZyB0aGlzIGZhY3RvcnksIGl0IGlzIGltcG9ydGFudCB0aGF0IHlvdXIKK21hcHBpbmcgbWV0YWRhdGEgY29ycmVjdGx5IHJlcHJlc2VudCB5b3VyIGRhdGFiYXNlJ3MgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgc28KK3RoYXQgT3BlbkpQQSBjYW4gb3JkZXIgaXRzIFNRTCBzdGF0ZW1lbnRzIHRvIG1lZXQgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5hdGl2ZTwvbGl0ZXJhbD46IFRoaXMgaXMgYW4gYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvTGF6eVNjaGVtYUZhY3RvcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5MYXp5U2NoZW1hRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+CisuIEFzIHBlcnNpc3RlbnQgY2xhc3NlcyBhcmUgbG9hZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgT3BlbkpQQSByZWFkcyB0aGVpcgorbWV0YWRhdGEgYW5kIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoaXMgZmFjdG9yeSB1c2VzIHRoZQorPGNsYXNzbmFtZT5qYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhPC9jbGFzc25hbWU+IGludGVyZmFjZSB0byByZWZsZWN0IG9uIHRoZQorc2NoZW1hIGFuZCBlbnN1cmUgdGhhdCBpdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG1hcHBpbmcgZGF0YSBiZWluZyByZWFkLgorVXNlIHRoaXMgZmFjdG9yeSBpZiB5b3Ugd2FudCB1cC1mcm9udCB2YWxpZGF0aW9uIHRoYXQgeW91ciBtYXBwaW5nIG1ldGFkYXRhIGlzIAorY29uc2lzdGVudCB3aXRoIHRoZSBkYXRhYmFzZSBkdXJpbmcgZGV2ZWxvcG1lbnQuIFRoaXMgZmFjdG9yeSBhY2NlcHRzIHRoZSAKK2ZvbGxvd2luZyBpbXBvcnRhbnQgcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Rm9yZWlnbktleXM8L2xpdGVyYWw+OiBTZXQgdG8gPGxpdGVyYWw+IHRydWU8L2xpdGVyYWw+IHRvIGF1dG9tYXRpY2FsbHkKK3JlYWQgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24gZHVyaW5nIHNjaGVtYSB2YWxpZGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPjogVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL3NjaGVtYS9UYWJsZVNjaGVtYUZhY3RvcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5UYWJsZVNjaGVtYUZhY3Rvcnk8L2NsYXNzbmFtZT48L3VsaW5rPgorLiBUaGlzIHNjaGVtYSBmYWN0b3J5IHN0b3JlcyBzY2hlbWEgaW5mb3JtYXRpb24gYXMgYW4gWE1MIGRvY3VtZW50IGluIGEgZGF0YWJhc2UKK3RhYmxlIGl0IGNyZWF0ZXMgZm9yIHRoaXMgcHVycG9zZS4gSWYgeW91ciBKREJDIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgdGhlCis8Y2xhc3NuYW1lPmphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE8L2NsYXNzbmFtZT4gc3RhbmRhcmQgaW50ZXJmYWNlLCBidXQgeW91CitzdGlsbCB3YW50IHNvbWUgc2NoZW1hIHZhbGlkYXRpb24gdG8gb2NjdXIgYXQgcnVudGltZSwgeW91IG1pZ2h0IHVzZSB0aGlzCitmYWN0b3J5LiBJdCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIG1vc3QgdXNlcnMsIHRob3VnaCwgYmVjYXVzZSBpdCBpcyBlYXN5IGZvcgordGhlIHN0b3JlZCBYTUwgc2NoZW1hIGRlZmluaXRpb24gdG8gZ2V0IG91dC1vZi1zeW5jaCB3aXRoIHRoZSBhY3R1YWwgZGF0YWJhc2UuCitUaGlzIGZhY3RvcnkgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlRhYmxlPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGNyZWF0ZSB0byBzdG9yZSBzY2hlbWEKK2luZm9ybWF0aW9uLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD5PUEVOSlBBX1NDSEVNQTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlByaW1hcnlLZXlDb2x1bW48L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgdGFibGUncyBudW1lcmljIHByaW1hcnkKK2tleSBjb2x1bW4uIERlZmF1bHRzIHRvIDxsaXRlcmFsPklEPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U2NoZW1hQ29sdW1uPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIHRhYmxlJ3Mgc3RyaW5nIGNvbHVtbiBmb3IKK2hvbGRpbmcgdGhlIHNjaGVtYSBkZWZpbml0aW9uIGFzIGFuIFhNTCBzdHJpbmcuIERlZmF1bHRzIHRvIDxsaXRlcmFsPlNDSEVNQV9ERUYKKzwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+ZmlsZTwvbGl0ZXJhbD46IFRoaXMgaXMgYW4gYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvRmlsZVNjaGVtYUZhY3RvcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5GaWxlU2NoZW1hRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+CisuIFRoaXMgZmFjdG9yeSBpcyBhIGxvdCBsaWtlIHRoZSA8Y2xhc3NuYW1lPlRhYmxlU2NoZW1hRmFjdG9yeTwvY2xhc3NuYW1lPiwgYW5kCitoYXMgdGhlIHNhbWUgYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlcy4gSW5zdGVhZCBvZiBzdG9yaW5nIGl0cyBYTUwgc2NoZW1hCitkZWZpbml0aW9uIGluIGEgZGF0YWJhc2UgdGFibGUsIHRob3VnaCwgaXQgc3RvcmVzIGl0IGluIGEgZmlsZS4gVGhpcyBmYWN0b3J5CithY2NlcHRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RmlsZTwvbGl0ZXJhbD46IFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUuIEJ5IGRlZmF1bHQsCit0aGUgZmFjdG9yeSBsb29rcyBmb3IgYSByZXNvdXJjZSBjYWxsZWQgPGZpbGVuYW1lPiBwYWNrYWdlLnNjaGVtYTwvZmlsZW5hbWU+LAorbG9jYXRlZCBpbiBhbnkgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUgPGxpdGVyYWw+Q0xBU1NQQVRIPC9saXRlcmFsPiBvciBpbiB0aGUKK3RvcCBsZXZlbCBvZiBhbnkgamFyIGluIHlvdXIgPGxpdGVyYWw+Q0xBU1NQQVRIPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gc3dpdGNoIGZyZWVseSBiZXR3ZWVuIHNjaGVtYSBmYWN0b3JpZXMgYXQgYW55IHRpbWUuIFRoZSBYTUwgZmlsZSBmb3JtYXQKK3VzZWQgYnkgc29tZSBmYWN0b3JpZXMgaXMgZGV0YWlsZWQgaW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV94bWwiLz4KKy4gQXMgd2l0aCBhbnkgT3BlbkpQQSBwbHVnaW4sIHlvdSBjYW4gY2FuIGFsc28gaW1wbGVtZW50IHlvdXIgb3duIHNjaGVtYQorZmFjdG9yeSBpZiB5b3UgaGF2ZSBuZWVkcyBub3QgbWV0IGJ5IHRoZSBleGlzdGluZyBvcHRpb25zLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2wiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBTY2hlbWEgVG9vbAorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9zY2hlbWFfc2NoZW1hdG9vbCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgc2NoZW1hIHRvb2wKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICBEREwKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2wiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgRERMCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIHdpdGggc2NoZW1hIHRvb2wKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitNb3N0IHVzZXJzIHdpbGwgb25seSBhY2Nlc3MgdGhlIHNjaGVtYSB0b29sIGluZGlyZWN0bHksIHRocm91Z2ggdGhlIGludGVyZmFjZXMKK3Byb3ZpZGVkIGJ5IG90aGVyIHRvb2xzLiBZb3UgbWF5IGZpbmQsIGhvd2V2ZXIsIHRoYXQgdGhlIHNjaGVtYSB0b29sIGlzIGEKK3Bvd2VyZnVsIHV0aWxpdHkgaW4gaXRzIG93biByaWdodC4gVGhlIHNjaGVtYSB0b29sIGhhcyB0d28gZnVuY3Rpb25zOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RvIHJlZmxlY3Qgb24gdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hLCBvcHRpb25hbGx5IHRyYW5zbGF0aW5nIGl0IHRvIGFuIFhNTAorcmVwcmVzZW50YXRpb24gZm9yIGZ1cnRoZXIgbWFuaXB1bGF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUbyB0YWtlIGluIGFuIFhNTCBzY2hlbWEgZGVmaW5pdGlvbiwgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBYTUwKK2FuZCB0aGUgZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLCBhbmQgYXBwbHkgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIG1ha2UgdGhlCitkYXRhYmFzZSBtYXRjaCB0aGUgWE1MLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfeG1sIj5YTUwgZm9ybWF0PC9saW5rPiB1c2VkIGJ5IHRoZSBzY2hlbWEKK3Rvb2wgYWJzdHJhY3RzIGF3YXkgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gU1FMIGRpYWxlY3RzIHVzZWQgYnkgZGlmZmVyZW50CitkYXRhYmFzZSB2ZW5kb3JzLiBUaGUgdG9vbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRhcHRzIGl0cyBTUUwgdG8gbWVldCBmb3JlaWduIGtleQorZGVwZW5kZW5jaWVzLiBUaHVzIHRoZSBzY2hlbWEgdG9vbCBpcyB1c2VmdWwgYXMgYSBnZW5lcmFsIHdheSB0byBtYW5pcHVsYXRlCitzY2hlbWFzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorWW91IGNhbiBpbnZva2UgdGhlIHNjaGVtYSB0b29sIHRocm91Z2ggaXRzIEphdmEgY2xhc3MsIAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9zY2hlbWEvU2NoZW1hVG9vbC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2w8L2NsYXNzbmFtZT48L3VsaW5rPi4gSW4KK2FkZGl0aW9uIHRvIHRoZSB1bml2ZXJzYWwgZmxhZ3Mgb2YgdGhlIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mIj4KK2NvbmZpZ3VyYXRpb24gZnJhbWV3b3JrPC9saW5rPiwgdGhlIHNjaGVtYSB0b29sIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjb21tYW5kCitsaW5lIGFyZ3VtZW50czoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWlnbm9yZUVycm9ycy8taSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBJZiA8bGl0ZXJhbD5mYWxzZQorPC9saXRlcmFsPiwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSB0b29sIGVuY291bnRlcnMgYW55IGRhdGFiYXNlCitlcnJvcnMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWZpbGUvLWYgJmx0O3N0ZG91dCB8IG91dHB1dCBmaWxlJmd0OzwvbGl0ZXJhbD46IFVzZSB0aGlzIG9wdGlvbiB0bword3JpdGUgYSBTUUwgc2NyaXB0IGZvciB0aGUgcGxhbm5lZCBzY2hlbWEgbW9kaWZpY2F0aW9ucywgcmF0aGVyIHRoZW0gY29tbWl0dGluZwordGhlbSB0byB0aGUgZGF0YWJhc2UuIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSA8bGl0ZXJhbD5leHBvcnQKKzwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+cmVmbGVjdDwvbGl0ZXJhbD4gYWN0aW9ucywgdGhlIG5hbWVkIGZpbGUgd2lsbCBiZSB1c2VkIHRvCit3cml0ZSB0aGUgZXhwb3J0ZWQgc2NoZW1hIFhNTC4gSWYgdGhlIGZpbGUgbmFtZXMgYSByZXNvdXJjZSBpbiB0aGUgPGxpdGVyYWw+CitDTEFTU1BBVEg8L2xpdGVyYWw+LCBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0byB0aGF0IHJlc291cmNlLiBVc2UgPGxpdGVyYWw+c3Rkb3V0Cis8L2xpdGVyYWw+IHRvIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dC4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+c3Rkb3V0PC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LW9wZW5qcGFUYWJsZXMvLW90ICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFdoZW4gcmVmbGVjdGluZworb24gdGhlIHNjaGVtYSwgd2hldGhlciB0byByZWZsZWN0IG9uIHRhYmxlcyBhbmQgc2VxdWVuY2VzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKKzxsaXRlcmFsPk9QRU5KUEFfPC9saXRlcmFsPi4gQ2VydGFpbiBPcGVuSlBBIGNvbXBvbmVudHMgbWF5IHVzZSBzdWNoIHRhYmxlcyAtCitmb3IgZXhhbXBsZSwgdGhlIDxsaXRlcmFsPnRhYmxlPC9saXRlcmFsPiBzY2hlbWEgZmFjdG9yeSBvcHRpb24gY292ZXJlZCBpbgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV9pbmZvX2ZhY3RvcnkiLz4uIFdoZW4gdXNpbmcgb3RoZXIKK2FjdGlvbnMsIDxsaXRlcmFsPm9wZW5qcGFUYWJsZXM8L2xpdGVyYWw+IGNvbnRyb2xzIHdoZXRoZXIgdGhlc2UgdGFibGVzIGNhbiBiZQorZHJvcHBlZC4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tZHJvcFRhYmxlcy8tZHQgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogU2V0IHRoaXMgb3B0aW9uIHRvCis8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0byBkcm9wIHRhYmxlcyB0aGF0IGFwcGVhciB0byBiZSB1bnVzZWQgZHVyaW5nIDxsaXRlcmFsPgorcmV0YWluPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+cmVmcmVzaDwvbGl0ZXJhbD4gYWN0aW9ucy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+Cit0cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWRyb3BTZXF1ZW5jZXMvLWRzcSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBTZXQgdGhpcworb3B0aW9uIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IHRvIGRyb3Agc2VxdWVuY2VzIHRoYXQgYXBwZWFyIHRvIGJlIHVudXNlZAorZHVyaW5nIDxsaXRlcmFsPnJldGFpbjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPnJlZnJlc2g8L2xpdGVyYWw+IGFjdGlvbnMuCitEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXNlcXVlbmNlcy8tc3EgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogV2hldGhlciB0bworbWFuaXB1bGF0ZSBzZXF1ZW5jZXMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4taW5kZXhlcy8taXggJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogV2hldGhlciB0byBtYW5pcHVsYXRlCitpbmRleGVzIG9uIGV4aXN0aW5nIHRhYmxlcy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1wcmltYXJ5S2V5cy8tcGsgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogV2hldGhlciB0bworbWFuaXB1bGF0ZSBwcmltYXJ5IGtleXMgb24gZXhpc3RpbmcgdGFibGVzLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWZvcmVpZ25LZXlzLy1mayAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBXaGV0aGVyIHRvCittYW5pcHVsYXRlIGZvcmVpZ24ga2V5cyBvbiBleGlzdGluZyB0YWJsZXMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tcmVjb3JkLy1yICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFVzZSA8bGl0ZXJhbD5mYWxzZQorPC9saXRlcmFsPiB0byBwcmV2ZW50IHdyaXRpbmcgdGhlIHNjaGVtYSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRvb2wgdG8gdGhlIGN1cnJlbnQKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfaW5mb19mYWN0b3J5Ij48bGl0ZXJhbD5zY2hlbWEgCitmYWN0b3J5PC9saXRlcmFsPjwvbGluaz4uIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tc2NoZW1hcy8tcyAmbHQ7c2NoZW1hIGxpc3QmZ3Q7PC9saXRlcmFsPjogQSBsaXN0IG9mIHNjaGVtYSBhbmQgdGFibGUKK25hbWVzIHRoYXQgT3BlbkpQQSBzaG91bGQgYWNjZXNzIGR1cmluZyB0aGlzIHJ1biBvZiB0aGUgc2NoZW1hIHRvb2wuIFRoaXMgaXMKK2VxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5qZGJjLlNjaGVtYXMiPgorb3BlbmpwYS5qZGJjLlNjaGVtYXM8L2xpbms+IHByb3BlcnR5IGZvciBhIHNpbmdsZSBydW4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIHNjaGVtYSB0b29sIGFsc28gYWNjZXB0cyBhbiA8bGl0ZXJhbD4tYWN0aW9uPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4tYQorPC9saXRlcmFsPiBmbGFnLiBNdWx0aXBsZSBhY3Rpb25zIGNhbiBiZSBjb21wb3NlZCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiAKK1RoZSBhdmFpbGFibGUgYWN0aW9ucyBhcmU6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmFkZDwvbGl0ZXJhbD46IFRoaXMgaXMgdGhlIGRlZmF1bHQgYWN0aW9uIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBvbmUuCitJdCBicmluZ3MgdGhlIHNjaGVtYSB1cC10by1kYXRlIHdpdGggdGhlIGdpdmVuIFhNTCBkb2N1bWVudCBieSBhZGRpbmcgdGFibGVzLAorY29sdW1ucywgaW5kZXhlcywgZXRjLiBUaGlzIGFjdGlvbiBuZXZlciBkcm9wcyBhbnkgc2NoZW1hIGNvbXBvbmVudHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnJldGFpbjwvbGl0ZXJhbD46IEtlZXAgYWxsIHNjaGVtYSBjb21wb25lbnRzIGluIHRoZSBnaXZlbiBYTUwKK2RlZmluaXRpb24sIGJ1dCBkcm9wIHRoZSByZXN0IGZyb20gdGhlIGRhdGFiYXNlLiBUaGlzIGFjdGlvbiBuZXZlciBhZGRzIGFueQorc2NoZW1hIGNvbXBvbmVudHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmRyb3A8L2xpdGVyYWw+OiBEcm9wIGFsbCBzY2hlbWEgY29tcG9uZW50cyBpbiB0aGUgc2NoZW1hIFhNTC4gVGFibGVzCit3aWxsIG9ubHkgYmUgZHJvcHBlZCBpZiB0aGV5IHdvdWxkIGhhdmUgMCBjb2x1bW5zIGFmdGVyIGRyb3BwaW5nIGFsbCBjb2x1bW5zCitsaXN0ZWQgaW4gdGhlIFhNTC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+cmVmcmVzaDwvbGl0ZXJhbD46IEVxdWl2YWxlbnQgdG8gPGxpdGVyYWw+cmV0YWluPC9saXRlcmFsPiwgdGhlbgorPGxpdGVyYWw+YWRkPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+YnVpbGQ8L2xpdGVyYWw+OiBHZW5lcmF0ZSBTUUwgdG8gYnVpbGQgYSBzY2hlbWEgbWF0Y2hpbmcgdGhlIG9uZSBpbgordGhlIGdpdmVuIFhNTCBmaWxlLiBVbmxpa2UgPGxpdGVyYWw+YWRkPC9saXRlcmFsPiwgdGhpcyBvcHRpb24gZG9lcyBub3QgdGFrZQoraW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgcGFydCBvZiB0aGUgc2NoZW1hIGRlZmluZWQgaW4gdGhlIFhNTCBmaWxlIG1pZ2h0CithbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZS4gVGhlcmVmb3JlLCB0aGlzIGFjdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBpbgorY29uanVuY3Rpb24gd2l0aCB0aGUgPGxpdGVyYWw+LWZpbGU8L2xpdGVyYWw+IGZsYWcgdG8gd3JpdGUgYSBTUUwgc2NyaXB0LiBUaGlzCitzY3JpcHQgY2FuIGxhdGVyIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIHNjaGVtYSBpbiB0aGUgWE1MLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5yZWZsZWN0PC9saXRlcmFsPjogR2VuZXJhdGUgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50CitkYXRhYmFzZSBzY2hlbWEuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmNyZWF0ZURCPC9saXRlcmFsPjogR2VuZXJhdGUgU1FMIHRvIHJlLWNyZWF0ZSB0aGUgY3VycmVudCBkYXRhYmFzZS4KK1RoaXMgYWN0aW9uIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxsaXRlcmFsPi1maWxlPC9saXRlcmFsPgorZmxhZyB0byB3cml0ZSBhIFNRTCBzY3JpcHQgdGhhdCBjYW4gYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBzY2hlbWEgb24gYQorZnJlc2ggZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmRyb3BEQjwvbGl0ZXJhbD46IEdlbmVyYXRlIFNRTCB0byBkcm9wIHRoZSBjdXJyZW50IGRhdGFiYXNlLiBMaWtlCis8bGl0ZXJhbD5jcmVhdGVEQjwvbGl0ZXJhbD4sIHRoaXMgYWN0aW9uIGNhbiBiZSB1c2VkIHdpdGggdGhlIDxsaXRlcmFsPi1maWxlCis8L2xpdGVyYWw+IGZsYWcgdG8gc2NyaXB0IGEgZGF0YWJhc2UgZHJvcCByYXRoZXIgdGhhbiBwZXJmb3JtIGl0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5pbXBvcnQ8L2xpdGVyYWw+OiBJbXBvcnQgdGhlIGdpdmVuIFhNTCBzY2hlbWEgZGVmaW5pdGlvbiBpbnRvIHRoZQorY3VycmVudCBzY2hlbWEgZmFjdG9yeS4gRG9lcyBub3RoaW5nIGlmIHRoZSBmYWN0b3J5IGRvZXMgbm90IHN0b3JlIGEgcmVjb3JkIG9mCit0aGUgc2NoZW1hLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5leHBvcnQ8L2xpdGVyYWw+OiBFeHBvcnQgdGhlIGN1cnJlbnQgc2NoZW1hIGZhY3RvcnkncyBzdG9yZWQgc2NoZW1hCitkZWZpbml0aW9uIHRvIFhNTC4gTWF5IHByb2R1Y2UgYW4gZW1wdHkgZmlsZSBpZiB0aGUgZmFjdG9yeSBkb2VzIG5vdCBzdG9yZSBhCityZWNvcmQgb2YgdGhlIHNjaGVtYS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+ZGVsZXRlVGFibGVDb250ZW50czwvbGl0ZXJhbD46IEV4ZWN1dGUgU1FMIHRvIGRlbGV0ZSBhbGwgcm93cyBmcm9tIAorYWxsIHRhYmxlcyB0aGF0IE9wZW5KUEEga25vd3MgYWJvdXQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgc2NoZW1hIHRvb2wgbWFuaXB1bGF0ZXMgdGFibGVzLCBjb2x1bW5zLCBpbmRleGVzLCBjb25zdHJhaW50cywgYW5kCitzZXF1ZW5jZXMuIEl0IGNhbm5vdCBjcmVhdGUgb3IgZHJvcCB0aGUgZGF0YWJhc2Ugc2NoZW1hIG9iamVjdHMgaW4gd2hpY2ggdGhlCit0YWJsZXMgcmVzaWRlLCBob3dldmVyLiBJZiB5b3VyIFhNTCBkb2N1bWVudHMgcmVmZXIgdG8gbmFtZWQgZGF0YWJhc2Ugc2NoZW1hcywKK3Rob3NlIHNjaGVtYXMgbXVzdCBleGlzdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgICAgICA8cGFyYT4KK1dlIHByZXNlbnQgc29tZSBleGFtcGxlcyBvZiBzY2hlbWEgdG9vbCB1c2FnZSBiZWxvdy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3NjaGVtYV9zY2hlbWF0b29sX2NyZWF0ZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU2NoZW1hIENyZWF0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2xfY3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB3aXRoIHNjaGVtYSB0b29sCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQWRkIHRoZSBuZWNlc3Nhcnkgc2NoZW1hIGNvbXBvbmVudHMgdG8gdGhlIGRhdGFiYXNlIHRvIG1hdGNoIHRoZSBnaXZlbiBYTUwKK2RvY3VtZW50LCBidXQgZG9uJ3QgZHJvcCBhbnkgZGF0YToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2wgdGFyZ2V0U2NoZW1hLnhtbAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3NjaGVtYV9zY2hlbWF0b29sX3NjcmlwdCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU1FMIFNjcmlwdGluZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorUmVwZWF0IHRoZSBzYW1lIGFjdGlvbiBhcyB0aGUgZmlyc3QgZXhhbXBsZSwgYnV0IHRoaXMgdGltZSBkb24ndCBjaGFuZ2UgdGhlCitkYXRhYmFzZS4gSW5zdGVhZCwgd3JpdGUgYW55IHBsYW5uZWQgY2hhbmdlcyB0byBhIFNRTCBzY3JpcHQ6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIC1mIHNjcmlwdC5zcWwgdGFyZ2V0U2NoZW1hLnhtbAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorV3JpdGUgYSBTUUwgc2NyaXB0IHRoYXQgd2lsbCByZS1jcmVhdGUgdGhlIGN1cnJlbnQgZGF0YWJhc2U6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIC1hIGNyZWF0ZURCIC1mIHNjcmlwdC5zcWwKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9zY2hlbWFfc2NoZW1hdG9vbF90YWJsZV9jbGVhbnVwIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBUYWJsZSBDbGVhbnVwCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2xfdGFibGVfY2xlYW51cCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICByZWZyZXNoIHNjaGVtYSBhbmQgZGVsZXRlIGFsbCBjb250ZW50cyBvZiBhbGwgdGFibGVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3NjaGVtYV9zY2hlbWF0b29sX3RhYmxlX2NsZWFudXAiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggc2NoZW1hIGFuZCBkZWxldGUgYWxsIGNvbnRlbnRzIG9mIGFsbCB0YWJsZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitSZWZyZXNoIHRoZSBzY2hlbWEgYW5kIGRlbGV0ZSBhbGwgY29udGVudHMgb2YgYWxsIHRhYmxlcyB0aGF0IE9wZW5KUEEgCitrbm93cyBhYm91dDoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc2NoZW1hLlNjaGVtYVRvb2wgLWEgcmVmcmVzaCxkZWxldGVUYWJsZUNvbnRlbnRzCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2xfZHJvcCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU2NoZW1hIERyb3AKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0Ryb3AgdGhlIGN1cnJlbnQgZGF0YWJhc2U6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIC1hIGRyb3BEQgorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3NjaGVtYV9zY2hlbWF0b29sX3JlZmxlY3QiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNjaGVtYSBSZWZsZWN0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2xfcmVmbGVjdCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHNjaGVtYQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICB3aXRoIHNjaGVtYSB0b29sCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitXcml0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2NoZW1hIHRvIGZpbGUgPGZpbGVuYW1lPnNjaGVtYS54bWwKKzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hVG9vbCAtYSByZWZsZWN0IC1mIHNjaGVtYS54bWwKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9zY2hlbWFfeG1sIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgWE1MIFNjaGVtYSBGb3JtYXQKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2NoZW1hX3htbCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgWE1MIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfc2NoZW1hdG9vbCI+c2NoZW1hIHRvb2w8L2xpbms+IGFuZAorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV9pbmZvX2ZhY3RvcnkiPiBzY2hlbWEgZmFjdG9yaWVzPC9saW5rPiBhbGwgdXNlCit0aGUgc2FtZSBYTUwgZm9ybWF0IHRvIHJlcHJlc2VudCBkYXRhYmFzZSBzY2hlbWEuIFRoZSBEb2N1bWVudCBUeXBlIERlZmluaXRpb24KKyhEVEQpIGZvciBzY2hlbWEgaW5mb3JtYXRpb24gaXMgcHJlc2VudGVkIGJlbG93LCBmb2xsb3dlZCBieSBleGFtcGxlcyBvZiBzY2hlbWEKK2RlZmluaXRpb25zIGluIFhNTC4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0OyFFTEVNRU5UIHNjaGVtYXMgKHNjaGVtYSkrJmd0OworJmx0OyFFTEVNRU5UIHNjaGVtYSAodGFibGV8c2VxdWVuY2UpKyZndDsKKyZsdDshQVRUTElTVCBzY2hlbWEgbmFtZSBDREFUQSAjSU1QTElFRCZndDsKKworJmx0OyFFTEVNRU5UIHNlcXVlbmNlIEVNUFRZJmd0OworJmx0OyFBVFRMSVNUIHNlcXVlbmNlIG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OworJmx0OyFBVFRMSVNUIHNlcXVlbmNlIGluaXRpYWwtdmFsdWUgQ0RBVEEgI0lNUExJRUQmZ3Q7CismbHQ7IUFUVExJU1Qgc2VxdWVuY2UgaW5jcmVtZW50IENEQVRBICNJTVBMSUVEJmd0OworJmx0OyFBVFRMSVNUIHNlcXVlbmNlIGFsbG9jYXRlIENEQVRBICNJTVBMSUVEJmd0OworCismbHQ7IUVMRU1FTlQgdGFibGUgKGNvbHVtbnxpbmRleHxwa3xma3x1bmlxdWUpKyZndDsKKyZsdDshQVRUTElTVCB0YWJsZSBuYW1lIENEQVRBICNSRVFVSVJFRCZndDsKKworJmx0OyFFTEVNRU5UIGNvbHVtbiBFTVBUWSZndDsKKyZsdDshQVRUTElTVCBjb2x1bW4gbmFtZSBDREFUQSAjUkVRVUlSRUQmZ3Q7IAorJmx0OyFBVFRMSVNUIGNvbHVtbiB0eXBlIChhcnJheSB8IGJpZ2ludCB8IGJpbmFyeSB8IGJpdCB8IGJsb2IgfCBjaGFyIHwgY2xvYiAKKyAgICB8IGRhdGUgfCBkZWNpbWFsIHwgZGlzdGluY3QgfCBkb3VibGUgfCBmbG9hdCB8IGludGVnZXIgfCBqYXZhX29iamVjdCAKKyAgICB8IGxvbmd2YXJiaW5hcnkgfCBsb25ndmFyY2hhciB8IG51bGwgfCBudW1lcmljIHwgb3RoZXIgfCByZWFsIHwgcmVmIAorICAgIHwgc21hbGxpbnQgfCBzdHJ1Y3QgfCB0aW1lIHwgdGltZXN0YW1wIHwgdGlueWludCB8IHZhcmJpbmFyeSB8IHZhcmNoYXIpIAorICAgICNSRVFVSVJFRCZndDsKKyZsdDshQVRUTElTVCBjb2x1bW4gbm90LW51bGwgKHRydWV8ZmFsc2UpICJmYWxzZSImZ3Q7CismbHQ7IUFUVExJU1QgY29sdW1uIGF1dG8tYXNzaWduICh0cnVlfGZhbHNlKSAiZmFsc2UiJmd0OworJmx0OyFBVFRMSVNUIGNvbHVtbiBkZWZhdWx0IENEQVRBICNJTVBMSUVEJmd0OworJmx0OyFBVFRMSVNUIGNvbHVtbiBzaXplIENEQVRBICNJTVBMSUVEJmd0OworJmx0OyFBVFRMSVNUIGNvbHVtbiBkZWNpbWFsLWRpZ2l0cyBDREFUQSAjSU1QTElFRCZndDsKKworJmx0OyEtLSB0aGUgdHlwZS1uYW1lIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB3aGVuIHlvdSB3YW50IE9wZW5KUEEgdG8gICAtLSZndDsKKyZsdDshLS0gdXNlIGEgcGFydGljdWxhciBTUUwgdHlwZSBkZWNsYXJhdGlvbiB3aGVuIGNyZWF0aW5nIHRoZSAgICAgLS0mZ3Q7CismbHQ7IS0tIGNvbHVtbi4gSXQgaXMgdXAgdG8geW91IHRvIGVuc3VyZSB0aGF0IHRoaXMgdHlwZSBpcyAgICAgICAgIC0tJmd0OworJmx0OyEtLSBjb21wYXRpYmxlIHdpdGggdGhlIEpEQkMgdHlwZSB1c2VkIGluIHRoZSB0eXBlIGF0dHJpYnV0ZS4gICAtLSZndDsKKyZsdDshQVRUTElTVCBjb2x1bW4gdHlwZS1uYW1lIENEQVRBICNJTVBMSUVEJmd0OworCismbHQ7IS0tIHRoZSAnY29sdW1uJyBhdHRyaWJ1dGUgb2YgaW5kZXhlcywgcGtzLCBhbmQgZmtzIGNhbiBiZSB1c2VkIC0tJmd0OworJmx0OyEtLSB3aGVuIHRoZSBlbGVtZW50IGhhcyBvbmx5IG9uZSBjb2x1bW4gKG9yIGZvciBmb3JlaWduIGtleXMsICAtLSZndDsKKyZsdDshLS0gb25seSBvbmUgbG9jYWwgY29sdW1uKTsgaW4gdGhlc2UgY2FzZXMgdGhlIG9uL2pvaW4gY2hpbGQgICAgLS0mZ3Q7CismbHQ7IS0tIGVsZW1lbnRzIGNhbiBiZSBvbWl0dGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tJmd0OworJmx0OyFFTEVNRU5UIGluZGV4IChvbikqJmd0OworJmx0OyFBVFRMSVNUIGluZGV4IG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OworJmx0OyFBVFRMSVNUIGluZGV4IGNvbHVtbiBDREFUQSAjSU1QTElFRCZndDsKKyZsdDshQVRUTElTVCBpbmRleCB1bmlxdWUgKHRydWV8ZmFsc2UpICJmYWxzZSImZ3Q7CisKKyZsdDshLS0gdGhlICdsb2dpY2FsJyBhdHRyaWJ1dGUgb2YgcGtzIHNob3VsZCBiZSBzZXQgdG8gJ3RydWUnIGlmICAgLS0mZ3Q7IAorJmx0OyEtLSB0aGUgcHJpbWFyeSBrZXkgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCAgICAtLSZndDsgCismbHQ7IS0tIGJ1dCB0aGUgZ2l2ZW4gY29sdW1uIHNob3VsZCBiZSB1c2VkIGFzIGEgcHJpbWFyeSBrZXkgZm9yICAgIC0tJmd0OworJmx0OyEtLSBPLVIgcHVycG9zZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSZndDsKKyZsdDshRUxFTUVOVCBwayAob24pKiZndDsKKyZsdDshQVRUTElTVCBwayBuYW1lIENEQVRBICNJTVBMSUVEJmd0OworJmx0OyFBVFRMSVNUIHBrIGNvbHVtbiBDREFUQSAjSU1QTElFRCZndDsKKyZsdDshQVRUTElTVCBwayBsb2dpY2FsICh0cnVlfGZhbHNlKSAiZmFsc2UiJmd0OworCismbHQ7IUVMRU1FTlQgb24gRU1QVFkmZ3Q7CismbHQ7IUFUVExJU1Qgb24gY29sdW1uIENEQVRBICNSRVFVSVJFRCZndDsKKworJmx0OyEtLSBma3Mgd2l0aCBhIGRlbGV0ZS1hY3Rpb24gb2YgJ25vbmUnIGFyZSBzaW1pbGFyIHRvIGxvZ2ljYWwgICAtLSZndDsKKyZsdDshLS0gcGtzOyB0aGV5IGRvIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgZGF0YWJhc2UsIGJ1dCAgICAgICAgLS0mZ3Q7CismbHQ7IS0tIHJlcHJlc2VudCBhIGxvZ2ljYWwgcmVsYXRpb24gYmV0d2VlbiB0YWJsZXMgKG9yIHRoZWlyICAgICAgIC0tJmd0OworJmx0OyEtLSBjb3JyZXNwb25kaW5nIEphdmEgY2xhc3NlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSZndDsKKyZsdDshRUxFTUVOVCBmayAoam9pbikqJmd0OworJmx0OyFBVFRMSVNUIGZrIG5hbWUgQ0RBVEEgI0lNUExJRUQmZ3Q7CismbHQ7IUFUVExJU1QgZmsgZGVmZXJyZWQgKHRydWV8ZmFsc2UpICJmYWxzZSImZ3Q7CismbHQ7IUFUVExJU1QgZmsgdG8tdGFibGUgQ0RBVEEgI1JFUVVJUkVEJmd0OworJmx0OyFBVFRMSVNUIGZrIGNvbHVtbiBDREFUQSAjSU1QTElFRCZndDsKKyZsdDshQVRUTElTVCBmayBkZWxldGUtYWN0aW9uIChjYXNjYWRlfGRlZmF1bHR8ZXhjZXB0aW9ufG5vbmV8bnVsbCkgIm5vbmUiJmd0OworCismbHQ7IUVMRU1FTlQgam9pbiBFTVBUWSZndDsKKyZsdDshQVRUTElTVCBqb2luIGNvbHVtbiBDREFUQSAjUkVRVUlSRUQmZ3Q7CismbHQ7IUFUVExJU1Qgam9pbiB0by1jb2x1bW4gQ0RBVEEgI1JFUVVJUkVEJmd0OworJmx0OyFBVFRMSVNUIGpvaW4gdmFsdWUgQ0RBVEEgI0lNUExJRUQmZ3Q7CisKKyZsdDshLS0gdW5pcXVlIGNvbnN0cmFpbnQgLS0mZ3Q7CismbHQ7IUVMRU1FTlQgdW5pcXVlIChvbikqJmd0OworJmx0OyFBVFRMSVNUIHVuaXF1ZSBuYW1lIENEQVRBICNJTVBMSUVEJmd0OworJmx0OyFBVFRMSVNUIHVuaXF1ZSBjb2x1bW4gQ0RBVEEgI0lNUExJRUQmZ3Q7CismbHQ7IUFUVExJU1QgdW5pcXVlIGRlZmVycmVkICh0cnVlfGZhbHNlKSAiZmFsc2UiJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9zY2hlbWFfeG1sX2Jhc2ljIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBCYXNpYyBTY2hlbWEKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0EgdmVyeSBiYXNpYyBzY2hlbWEgZGVmaW5pdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtzY2hlbWFzJmd0OworICAgICZsdDtzY2hlbWEmZ3Q7CisgICAgICAgICZsdDtzZXF1ZW5jZSBuYW1lPSJTX0FSVFMiLyZndDsKKyAgICAgICAgJmx0O3RhYmxlIG5hbWU9IkFSVElDTEUiJmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJUSVRMRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjU1IiBub3QtbnVsbD0idHJ1ZSIvJmd0OworICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJBVVRIT1JfRk5BTUUiIHR5cGU9InZhcmNoYXIiIHNpemU9IjI4IiZndDsgCisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkFVVEhPUl9MTkFNRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjgiJmd0OyAKKyAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQ09OVEVOVCIgdHlwZT0iY2xvYiImZ3Q7IAorICAgICAgICAmbHQ7L3RhYmxlJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVVUSE9SIiZndDsKKyAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iRklSU1RfTkFNRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjgiIG5vdC1udWxsPSJ0cnVlIiZndDsgCisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkxBU1RfTkFNRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjgiIG5vdC1udWxsPSJ0cnVlIiZndDsgCisgICAgICAgICZsdDsvdGFibGUmZ3Q7CisgICAgJmx0Oy9zY2hlbWEmZ3Q7CismbHQ7L3NjaGVtYXMmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfc2NoZW1hX3htbF9mdWxsIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBGdWxsIFNjaGVtYQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorRXhwYW5zaW9uIG9mIHRoZSBhYm92ZSBzY2hlbWEgd2l0aCBwcmltYXJ5IGtleXMsIGNvbnN0cmFpbnRzLCBhbmQgaW5kZXhlcywgc29tZQorb2Ygd2hpY2ggc3BhbiBtdWx0aXBsZSBjb2x1bW5zLgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3NjaGVtYXMmZ3Q7CisgICAgJmx0O3NjaGVtYSZndDsKKyAgICAgICAgJmx0O3NlcXVlbmNlIG5hbWU9IlNfQVJUUyIvJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVJUSUNMRSImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IlRJVExFIiB0eXBlPSJ2YXJjaGFyIiBzaXplPSIyNTUiIG5vdC1udWxsPSJ0cnVlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkFVVEhPUl9GTkFNRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjgiJmd0OyAKKyAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iQVVUSE9SX0xOQU1FIiB0eXBlPSJ2YXJjaGFyIiBzaXplPSIyOCImZ3Q7IAorICAgICAgICAgICAgJmx0O2NvbHVtbiBuYW1lPSJDT05URU5UIiB0eXBlPSJjbG9iIiZndDsgCisgICAgICAgICAgICAmbHQ7cGsgY29sdW1uPSJUSVRMRSIvJmd0OworICAgICAgICAgICAgJmx0O2ZrIHRvLXRhYmxlPSJBVVRIT1IiIGRlbGV0ZS1hY3Rpb249ImV4Y2VwdGlvbiImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2pvaW4gY29sdW1uPSJBVVRIT1JfRk5BTUUiIHRvLWNvbHVtbj0iRklSU1RfTkFNRSIvJmd0OworICAgICAgICAgICAgICAgICZsdDtqb2luIGNvbHVtbj0iQVVUSE9SX0xOQU1FIiB0by1jb2x1bW49IkxBU1RfTkFNRSIvJmd0OworICAgICAgICAgICAgJmx0Oy9mayZndDsKKyAgICAgICAgICAgICZsdDtpbmRleCBuYW1lPSJBUlRJQ0xFX0FVVEhPUiImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O29uIGNvbHVtbj0iQVVUSE9SX0ZOQU1FIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O29uIGNvbHVtbj0iQVVUSE9SX0xOQU1FIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2luZGV4Jmd0OworICAgICAgICAmbHQ7L3RhYmxlJmd0OworICAgICAgICAmbHQ7dGFibGUgbmFtZT0iQVVUSE9SIiZndDsKKyAgICAgICAgICAgICZsdDtjb2x1bW4gbmFtZT0iRklSU1RfTkFNRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjgiIG5vdC1udWxsPSJ0cnVlIiZndDsgCisgICAgICAgICAgICAmbHQ7Y29sdW1uIG5hbWU9IkxBU1RfTkFNRSIgdHlwZT0idmFyY2hhciIgc2l6ZT0iMjgiIG5vdC1udWxsPSJ0cnVlIiZndDsgCisgICAgICAgICAgICAmbHQ7cGsmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O29uIGNvbHVtbj0iRklSU1RfTkFNRSIvJmd0OworICAgICAgICAgICAgICAgICZsdDtvbiBjb2x1bW49IkxBU1RfTkFNRSIvJmd0OworICAgICAgICAgICAgJmx0Oy9wayZndDsKKyAgICAgICAgJmx0Oy90YWJsZSZndDsKKyAgICAmbHQ7L3NjaGVtYSZndDsKKyZsdDsvc2NoZW1hcyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfZGVwbG95LnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9kZXBsb3kueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiY2YxZGUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfZGVwbG95LnhtbApAQCAtMCwwICsxLDMxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0icmVmX2d1aWRlX2RlcGxveSI+CisgICAgPHRpdGxlPgorICAgICAgICBEZXBsb3ltZW50CisgICAgPC90aXRsZT4KKyAgICA8cGFyYT4KK09wZW5KUEEgZGVwbG95bWVudCBpbmNsdWRlcyBjaG9vc2luZyBhIGZhY3RvcnkgZGVwbG95bWVudCBzdHJhdGVneSwgYW5kIGluIGEKK21hbmFnZWQgZW52aXJvbm1lbnQsIG9wdGlvbmFsbHkgaW50ZWdyYXRpbmcgd2l0aCB5b3VyIGFwcGxpY2F0aW9uIHNlcnZlcidzCittYW5hZ2VkIGFuZCBYQSB0cmFuc2FjdGlvbnMuIFRoaXMgY2hhcHRlciBleGFtaW5lcyBlYWNoIGFzcGVjdCBvZiBkZXBsb3ltZW50IGluCit0dXJuLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2RlcGxveV9mYWN0b3J5Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRmFjdG9yeSBEZXBsb3ltZW50CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBvZmZlcnMgdHdvIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4KK2RlcGxveW1lbnQgb3B0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2RlcGxveV9mYWN0b3J5X3N0YW5kYWxvbmUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFN0YW5kYWxvbmUgRGVwbG95bWVudAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2RlcGxveV9mYWN0b3J5X3N0YW5kYWxvbmUiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHN0YW5kYWxvbmUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2UKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIEpQQSBPdmVydmlldyBkZXNjcmliZXMgdGhlIDxjbGFzc25hbWU+amF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UKKzwvY2xhc3NuYW1lPiBjbGFzcy4gWW91IGNhbiB1c2UgPGNsYXNzbmFtZT5QZXJzaXN0ZW5jZTwvY2xhc3NuYW1lPiB0byBvYnRhaW4KKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4gaW5zdGFuY2VzLCBhcyBkZW1vbnN0cmF0ZWQgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19wZXJzaXN0ZW5jZSIvPi4gT3BlbkpQQSBhbHNvIGV4dGVuZHMKKzxjbGFzc25hbWU+UGVyc2lzdGVuY2U8L2NsYXNzbmFtZT4gdG8gYWRkIGFkZGl0aW9uYWwgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGNyZWF0aW9uIG1ldGhvZHMuIFRoZSA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFQZXJzaXN0ZW5jZTwvY2xhc3NuYW1lPiBjbGFzcworPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQVBlcnNpc3RlbmNlLmh0bWwiPgorSmF2YWRvYzwvdWxpbms+IGRldGFpbHMgdGhlc2UgZXh0ZW5zaW9ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorQWZ0ZXIgb2J0YWluaW5nIHRoZSBmYWN0b3J5LCB5b3UgY2FuIGNhY2hlIGl0IGZvciBhbGwgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gY3JlYXRpb24gZHV0aWVzLiAgT3BlbkpQQSBmYWN0b3JpZXMgc3VwcG9ydCBiZWluZyAKK2JvdW5kIHRvIEpOREkgYXMgd2VsbC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2RlcGxveV9pbmplY3QiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIgSW5qZWN0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitKYXZhIEVFIDUgYXBwbGljYXRpb24gc2VydmVycyBhbGxvdyB5b3UgdG8gPGVtcGhhc2lzPmluamVjdDwvZW1waGFzaXM+IAorZW50aXR5IG1hbmFnZXJzIGludG8geW91ciBzZXNzaW9uIGJlYW5zIHVzaW5nIHRoZSA8bGl0ZXJhbD5QZXJzaXN0ZW5jZUNvbnRleHQKKzwvbGl0ZXJhbD4gYW5ub3RhdGlvbi4gIFNlZSB5b3VyIGFwcGxpY2F0aW9uIHNlcnZlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV90cmFucyI+CisJCTx0aXRsZT4KKyAgICAgICAgICAgIEludGVncmF0aW5nIHdpdGggdGhlIFRyYW5zYWN0aW9uIE1hbmFnZXIKKyAgICAgICAgPC90aXRsZT4KKwkJPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV90cmFucyI+CisJCQk8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKwkJCTxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbWFuYWdlZAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisJCTwvaW5kZXh0ZXJtPgorCQk8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9lbnRlcnByaXNlX3RyYW5zIj4KKwkJCTxwcmltYXJ5PgorICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorCQkJPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbgorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisJCTwvaW5kZXh0ZXJtPgorCQk8aW5kZXh0ZXJtPgorCQkJPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWFuYWdlZCB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKwkJCTxzZWU+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3NlZT4KKwkJPC9pbmRleHRlcm0+CisJCTxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbk1vZGUKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisJCTxwYXJhPgorT3BlbkpQQSA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zIGhhdmUgdGhlIGFiaWxpdHkgdG8gYXV0b21hdGljYWxseQorc3luY2hyb25pemUgdGhlaXIgdHJhbnNhY3Rpb25zIHdpdGggYW4gZXh0ZXJuYWwgdHJhbnNhY3Rpb24gbWFuYWdlci4gIFdoZXRoZXIgCitvciBub3QgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBmcm9tIGEgZ2l2ZW4gPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IGV4aGliaXQgdGhpcyBiZWhhdmlvciBieSBkZWZhdWx0IGRlcGVuZHMgb24gCit0aGUgdHJhbnNhY3Rpb24gdHlwZSB5b3Ugc2V0IGZvciB0aGUgZmFjdG9yeSdzIHBlcnNpc3RlbmNlIHVuaXQgaW4KK3lvdXIgPGZpbGVuYW1lPnBlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+IGZpbGUuICBPcGVuSlBBIHVzZXMgdGhlIGdpdmVuCit0cmFuc2FjdGlvbiB0eXBlIGludGVybmFsbHkgdG8gc2V0IHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5UcmFuc2FjdGlvbk1vZGUiPjxsaXRlcmFsPm9wZW5qcGEuVHJhbnNhY3Rpb25Nb2RlCis8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LiAgVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcKK21vZGVzOgorICAgICAgICA8L3BhcmE+CisJCTxpdGVtaXplZGxpc3Q+IAorCQkJPGxpc3RpdGVtPgorCQkJCTxwYXJhPgorPGxpdGVyYWw+bG9jYWw8L2xpdGVyYWw+OiBQZXJmb3JtIHRyYW5zYWN0aW9uIG9wZXJhdGlvbnMgbG9jYWxseS4KKwkJCQk8L3BhcmE+CisJCQk8L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPgorCQkJCTxwYXJhPgorPGxpdGVyYWw+bWFuYWdlZDwvbGl0ZXJhbD46IEludGVncmF0ZSB3aXRoIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIncyBtYW5hZ2VkIAorZ2xvYmFsIHRyYW5zYWN0aW9ucy4gIAorCQkJCTwvcGFyYT4KKwkJCTwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PiAKKyAgICAgICAgPHBhcmE+CitZb3UgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgdHJhbnNhY3Rpb24gbW9kZSBzZXR0aW5nIHdoZW4geW91IG9idGFpbiBhbgorPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHVzaW5nIHRoZSAKKzx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YWVlLzUvZG9jcy9hcGkvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlckZhY3RvcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+PC91bGluaz4ncworPG1ldGhvZG5hbWU+Y3JlYXRlRW50aXR5TWFuYWdlcihNYXAgcHJvcHMpPC9tZXRob2RuYW1lPiBtZXRob2QuICBTaW1wbHkgc2V0IHRoZQorPGxpdGVyYWw+b3BlbmpwYS5UcmFuc2FjdGlvbk1vZGU8L2xpdGVyYWw+IGtleSBvZiB0aGUgZ2l2ZW4gPGNsYXNzbmFtZT5NYXAKKzwvY2xhc3NuYW1lPiB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gIAorCQk8L3BhcmE+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGFsc28gb3ZlcnJpZGUgdGhlIDxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvblVzZXJOYW1lPC9saXRlcmFsPiwKKzxsaXRlcmFsPm9wZW5qcGEuQ29ubmVjdGlvblBhc3N3b3JkPC9saXRlcmFsPiwgYW5kIDxsaXRlcmFsPgorb3BlbmpwYS5Db25uZWN0aW9uUmV0YWluTW9kZTwvbGl0ZXJhbD4gc2V0dGluZ3MgdXNpbmcgdGhlIGdpdmVuIDxjbGFzc25hbWU+CitNYXA8L2NsYXNzbmFtZT4uIAorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisJCTxwYXJhPgorPGluZGV4dGVybT48cHJpbWFyeT5NYW5hZ2VkUnVudGltZTwvcHJpbWFyeT48L2luZGV4dGVybT4KK0luIG9yZGVyIHRvIHVzZSBnbG9iYWwgdHJhbnNhY3Rpb25zLCBPcGVuSlBBIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIAorYXBwbGljYXRpb24gc2VydmVyJ3MgPGNsYXNzbmFtZT4KK2phdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uTWFuYWdlcjwvY2xhc3NuYW1lPi4gIE9wZW5KUEEgY2FuIGF1dG9tYXRpY2FsbHkgCitkaXNjb3ZlciB0aGUgdHJhbnNhY3Rpb24gbWFuYWdlciBmb3IgbW9zdCBtYWpvciBhcHBsaWNhdGlvbiBzZXJ2ZXJzLiAgCitPY2Nhc2lvbmFsbHksIGhvd2V2ZXIsIHlvdSBtaWdodCBoYXZlIHRvIHBvaW50IE9wZW5KUEEgdG8gdGhlIHRyYW5zYWN0aW9uIAorbWFuYWdlciBmb3IgYW4gdW5yZWNvZ25pemVkIG9yIG5vbi1zdGFuZGFyZCBhcHBsaWNhdGlvbiBzZXJ2ZXIgc2V0dXAuICBUaGlzIGlzIAorYWNjb21wbGlzaGVkIHRocm91Z2ggdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuTWFuYWdlZFJ1bnRpbWUiPjxsaXRlcmFsPgorb3BlbmpwYS5NYW5hZ2VkUnVudGltZTwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuICBUaGlzCitwcm9wZXJ0eSBkZXNjcmliZXMgYW4gCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9NYW5hZ2VkUnVudGltZS5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmVlLk1hbmFnZWRSdW50aW1lPC9jbGFzc25hbWU+PC91bGluaz4gaW1wbGVtZW50YXRpb24gdG8gdXNlCitmb3IgdHJhbnNhY3Rpb24gbWFuYWdlciBkaXNjb3ZlcnkuICBZb3UgY2FuIHNwZWNpZnkgeW91ciBvd24gaW1wbGVtZW50YXRpb24sIAorb3IgdXNlIG9uZSBvZiB0aGUgYnVpbHQtaW5zOgorCQk8L3BhcmE+CisJCTxpdGVtaXplZGxpc3Q+CisJCQk8bGlzdGl0ZW0+CisJCQkJPHBhcmE+Cis8bGl0ZXJhbD5hdXRvPC9saXRlcmFsPjogVGhpcyBpcyB0aGUgZGVmYXVsdC4gIEl0IGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2VlL0F1dG9tYXRpY01hbmFnZWRSdW50aW1lLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuZWUuQXV0b21hdGljTWFuYWdlZFJ1bnRpbWU8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuICBUaGlzIG1hbmFnZWQgcnVudGltZSBpcyBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgaW50ZWdyYXRlIHdpdGggc2V2ZXJhbCAKK2NvbW1vbiBhcHBsaWNhdGlvbiBzZXJ2ZXJzLgorCQkJCTwvcGFyYT4KKwkJCTwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+CisJCQkJPHBhcmE+Cis8bGl0ZXJhbD5pbnZvY2F0aW9uPC9saXRlcmFsPjogQW4gYWxpYXMgZm9yIHRoZSAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2VlL0ludm9jYXRpb25NYW5hZ2VkUnVudGltZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmVlLkludm9jYXRpb25NYW5hZ2VkUnVudGltZTwvY2xhc3NuYW1lPjwvdWxpbms+CitjbGFzcy4gIFlvdSBjYW4gY29uZmlndXJlIHRoaXMgcnVudGltZSB0byBpbnZva2UgYW55IHN0YXRpYworbWV0aG9kIGluIG9yZGVyIHRvIG9idGFpbiB0aGUgYXBwc2VydmVyJ3MgdHJhbnNhY3Rpb24gbWFuYWdlci4KKwkJCQk8L3BhcmE+CisJCQk8L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPgorCQkJCTxwYXJhPgorPGxpdGVyYWw+am5kaTwvbGl0ZXJhbD46IEFuIGFsaWFzIGZvciB0aGUgCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9lZS9KTkRJTWFuYWdlZFJ1bnRpbWUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5lZS5KTkRJTWFuYWdlZFJ1bnRpbWU8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuICBZb3UgY2FuIGNvbmZpZ3VyZSB0aGlzIHJ1bnRpbWUgdG8gbG9vayB1cCB0aGUgdHJhbnNhY3Rpb24gbWFuYWdlciBhdCAKK2FueSBKTkRJIGxvY2F0aW9uLgorCQkJCTwvcGFyYT4KKwkJCTwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PgorCQk8cGFyYT4KK1NlZSB0aGUgSmF2YWRvYyBmb3Igb2YgZWFjaCBjbGFzcyBmb3IgZGV0YWlscyBvbiB0aGUgYmVhbiBwcm9wZXJ0aWVzIAoreW91IGNhbiBwYXNzIHRvIHRoZXNlIHBsdWdpbnMgaW4geW91ciBjb25maWd1cmF0aW9uIHN0cmluZy4gIAorCQk8L3BhcmE+CisJCTxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV90cmFuc2V4Ij4KKwkJCTx0aXRsZT5Db25maWd1cmluZyBUcmFuc2FjdGlvbiBNYW5hZ2VyIEludGVncmF0aW9uPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKzwhW0NEQVRBWzxwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLlRyYW5zYWN0aW9uTW9kZSIgdmFsdWU9Im1hbmFnZWQiLz4KKzxwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLk1hbmFnZWRSdW50aW1lIiB2YWx1ZT0iam5kaShUcmFuc2FjdGlvbk1hbmFnZXJOYW1lPWphdmE6L1RyYW5zYWN0aW9uTWFuYWdlcikiLz5dXT4KKzwvcHJvZ3JhbWxpc3Rpbmc+CisJCTwvZXhhbXBsZT4KKwk8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3hhIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgWEEgVHJhbnNhY3Rpb25zCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2VudGVycHJpc2VfeGEiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIFhBCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBYQSB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIFgvT3BlbiBEaXN0cmlidXRlZCBUcmFuc2FjdGlvbiBQcm9jZXNzaW5nIChYL09wZW4gRFRQKSBtb2RlbCwgZGVzaWduZWQgYnkKKzx1bGluayB1cmw9Imh0dHA6Ly93d3cueG9wZW4ub3JnIj5PcGVuIEdyb3VwPC91bGluaz4gKGEgdmVuZG9yIGNvbnNvcnRpdW0pLAorZGVmaW5lcyBhIHN0YW5kYXJkIGNvbW11bmljYXRpb24gYXJjaGl0ZWN0dXJlIHRoYXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQ29uY3VycmVudCBleGVjdXRpb24gb2YgYXBwbGljYXRpb25zIG9uIHNoYXJlZCByZXNvdXJjZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0Nvb3JkaW5hdGlvbiBvZiB0cmFuc2FjdGlvbnMgYWNyb3NzIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQ29tcG9uZW50cywgaW50ZXJmYWNlcywgYW5kIHByb3RvY29scyB0aGF0IGRlZmluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBwcm92aWRlCitwb3J0YWJpbGl0eSBvZiBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0F0b21pY2l0eSBvZiB0cmFuc2FjdGlvbiBzeXN0ZW1zLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitTaW5nbGUtdGhyZWFkIGNvbnRyb2wgYW5kIHNlcXVlbnRpYWwgZnVuY3Rpb24tY2FsbGluZy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitUaGUgWC9PcGVuIERUUCBYQSBzdGFuZGFyZCBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzIHRoYXQgYQorcmVzb3VyY2UgbWFuYWdlciB1c2VzIHRvIGNvbW11bmljYXRlIHdpdGggYSB0cmFuc2FjdGlvbiBtYW5hZ2VyLiBUaGUgWEEKK2ludGVyZmFjZXMgZW5hYmxlIHJlc291cmNlIG1hbmFnZXJzIHRvIGpvaW4gdHJhbnNhY3Rpb25zLCB0byBwZXJmb3JtIHR3by1waGFzZQorY29tbWl0LCBhbmQgdG8gcmVjb3ZlciBpbi1kb3VidCB0cmFuc2FjdGlvbnMgZm9sbG93aW5nIGEgZmFpbHVyZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2VudGVycHJpc2VfeGFfcmVxIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBVc2luZyBPcGVuSlBBIHdpdGggWEEgVHJhbnNhY3Rpb25zCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIHN1cHBvcnRzIFhBLWNvbXBsaWFudCB0cmFuc2FjdGlvbnMgd2hlbiB1c2VkIGluIGEgcHJvcGVybHkgY29uZmlndXJlZAorbWFuYWdlZCBlbnZpcm9ubWVudC4gVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIGFyZSByZXF1aXJlZDoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0EgbWFuYWdlZCBlbnZpcm9ubWVudCB0aGF0IHByb3ZpZGVzIGFuIFhBIGNvbXBsaWFudCB0cmFuc2FjdGlvbiBtYW5hZ2VyLgorRXhhbXBsZXMgb2YgdGhpcyBhcmUgYXBwbGljYXRpb24gc2VydmVycyBzdWNoIGFzIFdlYkxvZ2ljIG9yIEpCb3NzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorSW5zdGFuY2VzIG9mIGEgPGNsYXNzbmFtZT5qYXZheC5zcWwuWEFEYXRhU291cmNlPC9jbGFzc25hbWU+IGZvciBlYWNoIG9mIHRoZQorPGNsYXNzbmFtZT5EYXRhU291cmNlPC9jbGFzc25hbWU+cyB0aGF0IE9wZW5KUEEgd2lsbCB1c2UuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0dpdmVuIHRoZXNlIGNvbXBvbmVudHMsIHNldHRpbmcgdXAgT3BlbkpQQSB0byBwYXJ0aWNpcGF0ZSBpbiBkaXN0cmlidXRlZAordHJhbnNhY3Rpb25zIGlzIGEgc2ltcGxlIHR3by1zdGVwIHByb2Nlc3M6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisJCQkJPGxpc3RpdGVtPgorCQkJCQk8cGFyYT4KK0ludGVncmF0ZSBPcGVuSlBBIHdpdGggeW91ciBhcHBsaWNhdGlvbiBzZXJ2ZXIncyB0cmFuc2FjdGlvbiBtYW5hZ2VyLCBhcyAKK2RldGFpbGVkIGluIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3RyYW5zIi8+IGFib3ZlLgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorUG9pbnQgT3BlbkpQQSBhdCBhbiBlbmxpc3RlZCA8Y2xhc3NuYW1lPlhBRGF0YVNvdXJjZTwvY2xhc3NuYW1lPiwgYW5kIGNvbmZpZ3VyZQorYSBzZWNvbmQgbm9uLWVubGlzdGVkIGRhdGEgc291cmNlLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX3RoaXJkcGFydHlfZW5saXN0Ii8+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfaW50ZWdyYXRpb24ueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX2ludGVncmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjY3YmNjCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX2ludGVncmF0aW9uLnhtbApAQCAtMCwwICsxLDQ5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0icmVmX2d1aWRlX2ludGVncmF0aW9uIj4KKyAgICA8dGl0bGU+CisgICAgICAgIFRoaXJkIFBhcnR5IEludGVncmF0aW9uCisgICAgPC90aXRsZT4KKyAgICA8cGFyYT4KK09wZW5KUEEgcHJvdmlkZXMgYSBudW1iZXIgb2YgbWVjaGFuaXNtcyBmb3IgaW50ZWdyYXRpbmcgd2l0aCB0aGlyZC1wYXJ0eSB0b29scy4KK1RoZSBmb2xsb3dpbmcgY2hhcHRlciB3aWxsIGlsbHVzdHJhdGUgdGhlc2UgaW50ZWdyYXRpb24gZmVhdHVyZXMuCisgICAgPC9wYXJhPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fYW50Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgQXBhY2hlIEFudAorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9hbnQiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgQW50CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0FudCBpcyBhIHZlcnkgcG9wdWxhciB0b29sIGZvciBidWlsZGluZyBKYXZhIHByb2plY3RzLiBJdCBpcyBzaW1pbGFyIHRvIHRoZQorPGxpdGVyYWw+bWFrZTwvbGl0ZXJhbD4gY29tbWFuZCwgYnV0IGlzIEphdmEtY2VudHJpYyBhbmQgaGFzIG1vcmUgbW9kZXJuCitmZWF0dXJlcy4gQW50IGlzIG9wZW4gc291cmNlLCBhbmQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBBcGFjaGUncyBBbnQgd2ViIHBhZ2UKK2F0IDx1bGluayB1cmw9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50LyI+IGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50LworPC91bGluaz4uIEFudCBoYXMgYmVjb21lIHRoZSBkZS1mYWN0byBzdGFuZGFyZCBidWlsZCB0b29sIGZvciBKYXZhLCBhbmQgbWFueQorY29tbWVyY2lhbCBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBwcm92aWRlIHNvbWUgc3VwcG9ydCBmb3IgdXNpbmcKK2FudCBidWlsZCBmaWxlcy4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIHNlY3Rpb24gYXNzdW1lcyBmYW1pbGlhcml0eSB3aXRoIHdyaXRpbmcKK0FudCA8ZmlsZW5hbWU+YnVpbGQueG1sPC9maWxlbmFtZT4gZmlsZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBIHByb3ZpZGVzIHByZS1idWlsdCBBbnQgdGFzayBkZWZpbml0aW9ucyBmb3IgYWxsIGJ1bmRsZWQgdG9vbHM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9lbmhhbmNlIj5FbmhhbmNlciBUYXNrPC9saW5rPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fYXBwaWR0b29sIj5BcHBsaWNhdGlvbiBJZGVudGl0eSBUb29sIFRhc2sKKzwvbGluaz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2ludGVncmF0aW9uX21hcHBpbmd0b29sIj5NYXBwaW5nIFRvb2wgVGFzazwvbGluaz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2ludGVncmF0aW9uX3Jldm1hcHBpbmd0b29sIj5SZXZlcnNlIE1hcHBpbmcgVG9vbCBUYXNrCis8L2xpbms+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9zY2hlbWF0b29sIj5TY2hlbWEgVG9vbCBUYXNrPC9saW5rPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSBzb3VyY2UgY29kZSBmb3IgYWxsIHRoZSBhbnQgdGFza3MgaXMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIHVuZGVyCit0aGUgPGZpbGVuYW1lPnNyYzwvZmlsZW5hbWU+IGRpcmVjdG9yeS4gVGhpcyBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSB2YXJpb3VzCithc3BlY3RzIG9mIHRoZSBhbnQgdGFza3MgaW4gb3JkZXIgdG8gYmV0dGVyIGludGVncmF0ZSBpbnRvIHlvdXIgZGV2ZWxvcG1lbnQKK2Vudmlyb25tZW50LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fY29uZiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ29tbW9uIEFudCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBbnQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvcHRpb25zCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQWxsIE9wZW5KUEEgdGFza3MgYWNjZXB0IGEgbmVzdGVkIDxsaXRlcmFsPmNvbmZpZzwvbGl0ZXJhbD4gZWxlbWVudCwgd2hpY2gKK2RlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIHNwZWNpZmllZCB0YXNrIHdpbGwgcnVuLiBUaGUKK2F0dHJpYnV0ZXMgZm9yIHRoZSA8bGl0ZXJhbD5jb25maWc8L2xpdGVyYWw+IHRhZyBhcmUgZGVmaW5lZCBieSB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvY29uZi9KREJDQ29uZmlndXJhdGlvbi5odG1sIj4KKzxjbGFzc25hbWU+SkRCQ0NvbmZpZ3VyYXRpb248L2NsYXNzbmFtZT48L3VsaW5rPiBiZWFuIG1ldGhvZHMuIE5vdGUgdGhhdAorZXhjbHVkaW5nIHRoZSA8bGl0ZXJhbD5jb25maWc8L2xpdGVyYWw+IGVsZW1lbnQgd2lsbCBjYXVzZSB0aGUgQW50IHRhc2sgdG8gdXNlCit0aGUgZGVmYXVsdCBzeXN0ZW0gY29uZmlndXJhdGlvbiBtZWNoYW5pc20sIHN1Y2ggYXMgdGhlIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBpbgordGhlIDxmaWxlbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEueG1sPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgbmVzdGVkIDxsaXRlcmFsPmNvbmZpZzwvbGl0ZXJhbD4gdGFnCitpbiBhIDxmaWxlbmFtZT5idWlsZC54bWw8L2ZpbGVuYW1lPiBmaWxlOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9jb25mX2NvbmZpZyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVc2luZyB0aGUgJmx0O2NvbmZpZyZndDsgQW50IFRhZworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7bWFwcGluZ3Rvb2wmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSImZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovbW9kZWwvKi5qYXZhIiAvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtjb25maWcgY29ubmVjdGlvblVzZXJOYW1lPSJzY290dCIgY29ubmVjdGlvblBhc3N3b3JkPSJ0aWdlciIKKyAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm9yYWNsZTp0aGluOkBzYXR1cm46MTUyMTpzb2xhcnNpZCIKKyAgICBjb25uZWN0aW9uRHJpdmVyTmFtZT0ib3JhY2xlLmpkYmMuZHJpdmVyLk9yYWNsZURyaXZlciIgLyZndDsKKyZsdDsvbWFwcGluZ3Rvb2wmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSA8bGl0ZXJhbD5wcm9wZXJ0aWVzPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4KK3Byb3BlcnRpZXNGaWxlPC9saXRlcmFsPiBhdHRyaWJ1dGUgb24gdGhlIDxsaXRlcmFsPmNvbmZpZzwvbGl0ZXJhbD4gdGFnLCB3aGljaAord2lsbCBiZSB1c2VkIHRvIGxvY2F0ZSBhIHByb3BlcnRpZXMgcmVzb3VyY2Ugb3IgZmlsZS4gVGhlIHJlc291cmNlIHdpbGwgYmUKK2xvYWRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBDTEFTU1BBVEguCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2ludGVncmF0aW9uX3Byb3BzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoZSBQcm9wZXJ0aWVzIEF0dHJpYnV0ZSBvZiB0aGUgJmx0O2NvbmZpZyZndDsgVGFnCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDttYXBwaW5ndG9vbCZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi9tb2RlbC8qLmphdmEiLyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7Y29uZmlnIHByb3BlcnRpZXM9Im9wZW5qcGEtZGV2LnhtbCIvJmd0OworJmx0Oy9tYXBwaW5ndG9vbCZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2ludGVncmF0aW9uX3Byb3BzZmlsZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVc2luZyB0aGUgUHJvcGVydGllc0ZpbGUgQXR0cmlidXRlIG9mIHRoZSAmbHQ7Y29uZmlnJmd0OyBUYWcKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O21hcHBpbmd0b29sJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9IioqL21vZGVsLyouamF2YSIvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtjb25maWcgcHJvcGVydGllc0ZpbGU9Ii4uL2NvbmYvb3BlbmpwYS1kZXYueG1sIi8mZ3Q7CismbHQ7L21hcHBpbmd0b29sJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGFza3MgYWxzbyBhY2NlcHQgYSBuZXN0ZWQgPGxpdGVyYWw+Y2xhc3NwYXRoPC9saXRlcmFsPiBlbGVtZW50LCB3aGljaCB5b3UgY2FuCit1c2UgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgY2xhc3NwYXRoLiBUaGUgPGxpdGVyYWw+Y2xhc3NwYXRoPC9saXRlcmFsPiBhcmd1bWVudAorYmVoYXZlcyB0aGUgc2FtZSBhcyBpdCBkb2VzIGZvciBBbnQncyBzdGFuZGFyZCA8bGl0ZXJhbD5qYXZhYzwvbGl0ZXJhbD4gZWxlbWVudC4KK0l0IGlzIHNvbWV0aW1lcyB0aGUgY2FzZSB0aGF0IHByb2plY3RzIGFyZSBjb21waWxlZCB0byBhIHNlcGFyYXRlIGRpcmVjdG9yeSB0aGFuCit0aGUgc291cmNlIHRyZWUuIElmIHRoZSB0YXJnZXQgcGF0aCBmb3IgY29tcGlsZWQgY2xhc3NlcyBpcyBub3QgaW5jbHVkZWQgaW4gdGhlCitwcm9qZWN0J3MgY2xhc3NwYXRoLCB0aGVuIGEgPGxpdGVyYWw+Y2xhc3NwYXRoPC9saXRlcmFsPiBlbGVtZW50IHRoYXQgaW5jbHVkZXMKK3RoZSB0YXJnZXQgY2xhc3MgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGluY2x1ZGVkIHNvIHRoZSBlbmhhbmNlciBhbmQgbWFwcGluZyB0b29sCitjYW4gbG9jYXRlIHRoZSByZWxldmFudCBjbGFzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBhIDxsaXRlcmFsPmNsYXNzcGF0aDwvbGl0ZXJhbD4gdGFnOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9jb25mX2NsYXNzcGF0aCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVc2luZyB0aGUgJmx0O2NsYXNzcGF0aCZndDsgQW50IFRhZworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7b3BlbmpwYWMmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9zb3VyY2UiJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9IioqL21vZGVsLyouamF2YSIgLyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtiYXNlZGlyfS9jbGFzc2VzIi8mZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NvdXJjZSIvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLyZndDsKKyAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CismbHQ7L29wZW5qcGFjJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorRmluYWxseSwgdGFza3MgdGhhdCBpbnZva2UgY29kZS1nZW5lcmF0aW9uIHRvb2xzIGxpa2UgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5Cit0b29sIGFuZCByZXZlcnNlIG1hcHBpbmcgdG9vbCBhY2NlcHQgYSBuZXN0ZWQgPGxpdGVyYWw+Y29kZWZvcm1hdDwvbGl0ZXJhbD4KK2VsZW1lbnQuIFNlZSB0aGUgY29kZSBmb3JtYXR0aW5nIGRvY3VtZW50YXRpb24gaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzX2Zvcm1hdCIvPiBmb3IgYSBsaXN0IG9mIGNvZGUKK2Zvcm1hdHRpbmcgYXR0cmlidXRlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fY29uZl9jb2RlZm9ybWF0Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoZSAmbHQ7Y29kZWZvcm1hdCZndDsgQW50IFRhZworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cmV2ZXJzZW1hcHBpbmd0b29sIHBhY2thZ2U9ImNvbS54eXouamRvIiBkaXJlY3Rvcnk9IiR7YmFzZWRpcn0vc3JjIiZndDsKKyAgJmx0O2NvZGVmb3JtYXQgdGFiU3BhY2VzPSI0IiBzcGFjZUJlZm9yZVBhcmVuPSJ0cnVlIiBicmFjZU9uU2FtZUxpbmU9ImZhbHNlIi8mZ3Q7CismbHQ7L3JldmVyc2VtYXBwaW5ndG9vbCZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9lbmhhbmNlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbmhhbmNlciBBbnQgVGFzaworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2ludGVncmF0aW9uX2VuaGFuY2UiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBbnQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZW5oYW5jZXIgdGFzaworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9lbmhhbmNlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZW5oYW5jZXIKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQW50IHRhc2sKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZW5oYW5jZXIgdGFzayBhbGxvd3MgeW91IHRvIGludm9rZSB0aGUgT3BlbkpQQSBlbmhhbmNlciBkaXJlY3RseSBmcm9tIHdpdGhpbgordGhlIEFudCBidWlsZCBwcm9jZXNzLiBUaGUgdGFzaydzIHBhcmFtZXRlcnMgY29ycmVzcG9uZCBleGFjdGx5IHRvIHRoZSBsb25nCit2ZXJzaW9ucyBvZiB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byB0aGUgCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRW5oYW5jZXI8L2NsYXNzbmFtZT48L2xpbms+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgZW5oYW5jZXIgdGFzayBhY2NlcHRzIGEgbmVzdGVkIDxsaXRlcmFsPmZpbGVzZXQ8L2xpdGVyYWw+IHRhZyB0byBzcGVjaWZ5IHRoZQorZmlsZXMgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkLiBZb3UgY2FuIHNwZWNpZnkgPGZpbGVuYW1lPi5qYXZhPC9maWxlbmFtZT4gb3IKKzxmaWxlbmFtZT4uY2xhc3M8L2ZpbGVuYW1lPiBmaWxlcy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBmaWxlcywgdGhlIHRhc2sKK3dpbGwgcnVuIG9uIHRoZSBjbGFzc2VzIGxpc3RlZCBpbiB5b3VyIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPiBvcgorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5NZXRhRGF0YUZhY3RvcnkiPjxsaXRlcmFsPgorb3BlbmpwYS5NZXRhRGF0YUZhY3Rvcnk8L2xpdGVyYWw+PC9saW5rPiBwcm9wZXJ0eS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGVuaGFuY2VyIHRhc2sgaW4gYSA8ZmlsZW5hbWU+YnVpbGQueG1sCis8L2ZpbGVuYW1lPiBmaWxlOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9lbmhhbmNlX3Rhc2siPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSW52b2tpbmcgdGhlIEVuaGFuY2VyIGZyb20gQW50CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDt0YXJnZXQgbmFtZT0iZW5oYW5jZSImZ3Q7CisgICZsdDshLS0gZGVmaW5lIHRoZSBvcGVuanBhYyB0YXNrOyB0aGlzIGNhbiBiZSBkb25lIGF0IHRoZSB0b3Agb2YgdGhlICAgIC0tJmd0OworICAmbHQ7IS0tIGJ1aWxkLnhtbCBmaWxlLCBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIHRhcmdldHMgICAgICAtLSZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0ib3BlbmpwYWMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmFudC5QQ0VuaGFuY2VyVGFzayIvJmd0OworCisgICZsdDshLS0gaW52b2tlIGVuaGFuY2VyIG9uIGFsbCAuamF2YSBmaWxlcyBiZWxvdyB0aGUgbW9kZWwgZGlyZWN0b3J5IC0tJmd0OworICAmbHQ7b3BlbmpwYWMmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIiZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqL21vZGVsLyouamF2YSIgLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvb3BlbmpwYWMmZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9hcHBpZHRvb2wiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIElkZW50aXR5IFRvb2wgQW50IFRhc2sKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9lbmhhbmNlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgQW50CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGlkZW50aXR5IHRvb2wgdGFzaworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9lbmhhbmNlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBBbnQgdGFzaworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBhcHBsaWNhdGlvbiBpZGVudGl0eSB0b29sIHRhc2sgYWxsb3dzIHlvdSB0byBpbnZva2UgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5Cit0b29sIGRpcmVjdGx5IGZyb20gd2l0aGluIHRoZSBBbnQgYnVpbGQgcHJvY2Vzcy4gVGhlIHRhc2sncyBwYXJhbWV0ZXJzCitjb3JyZXNwb25kIGV4YWN0bHkgdG8gdGhlIGxvbmcgdmVyc2lvbnMgb2YgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gdGhlCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfYXBwaWRfYXBwaWR0b29sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuQXBwbGljYXRpb25JZFRvb2w8L2NsYXNzbmFtZT48L2xpbms+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgYXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbCB0YXNrIGFjY2VwdHMgYSBuZXN0ZWQgPGxpdGVyYWw+ZmlsZXNldDwvbGl0ZXJhbD4KK3RhZyB0byBzcGVjaWZ5IHRoZSBmaWxlcyB0aGF0IHNob3VsZCBiZSBwcm9jZXNzZWQuIFlvdSBjYW4gc3BlY2lmeSA8ZmlsZW5hbWU+CisuamF2YTwvZmlsZW5hbWU+IG9yIDxmaWxlbmFtZT4uY2xhc3M8L2ZpbGVuYW1lPiBmaWxlcy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueQorZmlsZXMsIHRoZSB0YXNrIHdpbGwgcnVuIG9uIHRoZSBjbGFzc2VzIGxpc3RlZCBpbiB5b3VyIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWwKKzwvZmlsZW5hbWU+IGZpbGUgb3IgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5NZXRhRGF0YUZhY3RvcnkiPjxsaXRlcmFsPgorb3BlbmpwYS5NZXRhRGF0YUZhY3Rvcnk8L2xpdGVyYWw+PC9saW5rPiBwcm9wZXJ0eS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IHRvb2wgdGFzayBpbiBhCis8ZmlsZW5hbWU+YnVpbGQueG1sPC9maWxlbmFtZT4gZmlsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fYXBwaWR0b29sX3Rhc2siPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSW52b2tpbmcgdGhlIEFwcGxpY2F0aW9uIElkZW50aXR5IFRvb2wgZnJvbSBBbnQKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3RhcmdldCBuYW1lPSJhcHBpZHMiJmd0OworICAmbHQ7IS0tIGRlZmluZSB0aGUgYXBwaWR0b29sIHRhc2s7IHRoaXMgY2FuIGJlIGRvbmUgYXQgdGhlIHRvcCBvZiAgICAgLS0mZ3Q7CisgICZsdDshLS0gdGhlIGJ1aWxkLnhtbCBmaWxlLCBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIHRhcmdldHMgICAtLSZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0iYXBwaWR0b29sIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUub3BlbmpwYS5hbnQuQXBwbGljYXRpb25JZFRvb2xUYXNrIi8mZ3Q7CisKKyAgJmx0OyEtLSBpbnZva2UgdG9vbCBvbiBhbGwgLmpkbyBmaWxlcyBiZWxvdyB0aGUgY3VycmVudCBkaXJlY3RvcnkgICAgIC0tJmd0OworICAmbHQ7YXBwaWR0b29sJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iLiImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi9tb2RlbC8qLmphdmEiIC8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICZsdDtjb2RlZm9ybWF0IHNwYWNlQmVmb3JlUGFyZW49InRydWUiIGJyYWNlT25TYW1lTGluZT0iZmFsc2UiLyZndDsKKyAgJmx0Oy9hcHBpZHRvb2wmZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9tYXBwaW5ndG9vbCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgTWFwcGluZyBUb29sIEFudCBUYXNrCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fbWFwcGluZ3Rvb2wiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBbnQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyB0b29sIHRhc2sKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fbWFwcGluZ3Rvb2wiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIHRvb2wKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQW50IHRhc2sKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgbWFwcGluZyB0b29sIHRhc2sgYWxsb3dzIHlvdSB0byBkaXJlY3RseSBpbnZva2UgdGhlIG1hcHBpbmcgdG9vbCBmcm9tIHdpdGhpbgordGhlIEFudCBidWlsZCBwcm9jZXNzLiBJdCBpcyB1c2VmdWwgZm9yIG1ha2luZyBzdXJlIHRoYXQgdGhlIGRhdGFiYXNlIHNjaGVtYSBhbmQKK29iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZGF0YSBpcyBhbHdheXMgc3luY2hyb25pemVkIHdpdGggeW91ciBwZXJzaXN0ZW50IGNsYXNzCitkZWZpbml0aW9ucywgd2l0aG91dCBuZWVkaW5nIHRvIHJlbWVtYmVyIHRvIGludm9rZSB0aGUgbWFwcGluZyB0b29sIG1hbnVhbGx5LgorVGhlIHRhc2sncyBwYXJhbWV0ZXJzIGNvcnJlc3BvbmQgZXhhY3RseSB0byB0aGUgbG9uZyB2ZXJzaW9ucyBvZiB0aGUKK2NvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gdGhlIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbDwvY2xhc3NuYW1lPjwvbGluaz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBtYXBwaW5nIHRvb2wgdGFzayBhY2NlcHRzIGEgbmVzdGVkIDxsaXRlcmFsPmZpbGVzZXQ8L2xpdGVyYWw+IHRhZyB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkLiBZb3UgY2FuIHNwZWNpZnkgPGZpbGVuYW1lPi5qYXZhPC9maWxlbmFtZT4KK29yIDxmaWxlbmFtZT4uY2xhc3M8L2ZpbGVuYW1lPiBmaWxlcy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBmaWxlcywgdGhlIHRhc2sKK3dpbGwgcnVuIG9uIHRoZSBjbGFzc2VzIGxpc3RlZCBpbiB5b3VyIDxmaWxlbmFtZT5wZXJzaXN0ZW5jZS54bWw8L2ZpbGVuYW1lPiBmaWxlCitvciA8bGluayBsaW5rZW5kPSJvcGVuanBhLk1ldGFEYXRhRmFjdG9yeSI+PGxpdGVyYWw+CitvcGVuanBhLk1ldGFEYXRhRmFjdG9yeTwvbGl0ZXJhbD48L2xpbms+IHByb3BlcnR5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIDxmaWxlbmFtZT5idWlsZC54bWw8L2ZpbGVuYW1lPiB0YXJnZXQgdGhhdCBpbnZva2VzCit0aGUgbWFwcGluZyB0b29sOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9tYXBwaW5ndG9vbF90YXNrIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEludm9raW5nIHRoZSBNYXBwaW5nIFRvb2wgZnJvbSBBbnQKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3RhcmdldCBuYW1lPSJyZWZyZXNoIiZndDsKKyAgJmx0OyEtLSBkZWZpbmUgdGhlIG1hcHBpbmd0b29sIHRhc2s7IHRoaXMgY2FuIGJlIGRvbmUgYXQgdGhlIHRvcCBvZiAtLSZndDsKKyAgJmx0OyEtLSB0aGUgYnVpbGQueG1sIGZpbGUsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciBhbGwgdGFyZ2V0cyAtLSZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0ibWFwcGluZ3Rvb2wiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuYW50Lk1hcHBpbmdUb29sVGFzayIvJmd0OworCisgICZsdDshLS0gYWRkIHRoZSBzY2hlbWEgY29tcG9uZW50cyBmb3IgYWxsIC5qZG8gZmlsZXMgYmVsb3cgdGhlICAgICAgLS0mZ3Q7CisgICZsdDshLS0gY3VycmVudCBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0mZ3Q7CisgICZsdDttYXBwaW5ndG9vbCBhY3Rpb249ImJ1aWxkU2NoZW1hIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9Ii4iJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5qZG8iIC8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L21hcHBpbmd0b29sJmd0OworJmx0Oy90YXJnZXQmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fcmV2bWFwcGluZ3Rvb2wiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFJldmVyc2UgTWFwcGluZyBUb29sIEFudCBUYXNrCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fcmV2bWFwcGluZ3Rvb2wiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBbnQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZSBtYXBwaW5nIHRvb2wgdGFzaworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9yZXZtYXBwaW5ndG9vbCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHJldmVyc2UgbWFwcGluZyB0b29sCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEFudCB0YXNrCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHJldmVyc2UgbWFwcGluZyB0b29sIHRhc2sgYWxsb3dzIHlvdSB0byBkaXJlY3RseSBpbnZva2UgdGhlIHJldmVyc2UgbWFwcGluZwordG9vbCBmcm9tIHdpdGhpbiBBbnQuIFdoaWxlIG1hbnkgdXNlcnMgd2lsbCBvbmx5IHJ1biB0aGUgcmV2ZXJzZSBtYXBwaW5nIHByb2Nlc3MKK29uY2UsIG90aGVycyB3aWxsIG1ha2UgaXQgcGFydCBvZiB0aGVpciBidWlsZCBwcm9jZXNzLiBUaGUgdGFzaydzIHBhcmFtZXRlcnMKK2NvcnJlc3BvbmQgZXhhY3RseSB0byB0aGUgbG9uZyB2ZXJzaW9ucyBvZiB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byB0aGUKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19yZXZlcnNlX3JldmVyc2VtYXBwaW5ndG9vbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUmV2ZXJzZU1hcHBpbmdUb29sPC9jbGFzc25hbWU+PC9saW5rPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSA8ZmlsZW5hbWU+YnVpbGQueG1sPC9maWxlbmFtZT4gdGFyZ2V0IHRoYXQgaW52b2tlcwordGhlIHJldmVyc2UgbWFwcGluZyB0b29sOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9yZXZtYXBwaW5ndG9vbF90YXNrIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEludm9raW5nIHRoZSBSZXZlcnNlIE1hcHBpbmcgVG9vbCBmcm9tIEFudAorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7dGFyZ2V0IG5hbWU9InJldmVyc2VtYXAiJmd0OworICAmbHQ7IS0tIGRlZmluZSB0aGUgcmV2ZXJzZW1hcHBpbmd0b29sIHRhc2s7IHRoaXMgY2FuIGJlIGRvbmUgYXQgdGhlIHRvcCBvZiAtLSZndDsKKyAgJmx0OyEtLSB0aGUgYnVpbGQueG1sIGZpbGUsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciBhbGwgdGFyZ2V0cyAgICAgICAgLS0mZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9InJldmVyc2VtYXBwaW5ndG9vbCIgCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5hbnQuUmV2ZXJzZU1hcHBpbmdUb29sVGFzayIvJmd0OworCisgICZsdDshLS0gcmV2ZXJzZSBtYXAgdGhlIGVudGlyZSBkYXRhYmFzZSAtLSZndDsKKyAgJmx0O3JldmVyc2VtYXBwaW5ndG9vbCBwYWNrYWdlPSJjb20ueHl6Lm1vZGVsIiBkaXJlY3Rvcnk9IiR7YmFzZWRpcn0vc3JjIgorICAgIGN1c3RvbWl6ZXJQcm9wZXJ0aWVzPSIke2Jhc2VkaXJ9L2NvbmYvcmV2ZXJzZS5wcm9wZXJ0aWVzIiZndDsKKyAgICAmbHQ7Y29kZWZvcm1hdCB0YWJTcGFjZXM9IjQiIHNwYWNlQmVmb3JlUGFyZW49InRydWUiIGJyYWNlT25TYW1lTGluZT0iZmFsc2UiLyZndDsKKyAgJmx0Oy9yZXZlcnNlbWFwcGluZ3Rvb2wmZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9zY2hlbWF0b29sIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTY2hlbWEgVG9vbCBBbnQgVGFzaworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2ludGVncmF0aW9uX3NjaGVtYXRvb2wiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBBbnQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hIHRvb2wgdGFzaworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9zY2hlbWF0b29sIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hIHRvb2wKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgQW50IHRhc2sKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgc2NoZW1hIHRvb2wgdGFzayBhbGxvd3MgeW91IHRvIGRpcmVjdGx5IGludm9rZSB0aGUgc2NoZW1hIHRvb2wgZnJvbSB3aXRoaW4KK3RoZSBBbnQgYnVpbGQgcHJvY2Vzcy4gVGhlIHRhc2sncyBwYXJhbWV0ZXJzIGNvcnJlc3BvbmQgZXhhY3RseSB0byB0aGUgbG9uZwordmVyc2lvbnMgb2YgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gdGhlCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2wiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5zY2hlbWEuU2NoZW1hVG9vbDwvY2xhc3NuYW1lPjwvbGluaz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0ZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgPGZpbGVuYW1lPmJ1aWxkLnhtbDwvZmlsZW5hbWU+IHRhcmdldCB0aGF0IGludm9rZXMKK3RoZSBzY2hlbWEgdG9vbDoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fc2NoZW1hdG9vbF90YXNrIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEludm9raW5nIHRoZSBTY2hlbWEgVG9vbCBmcm9tIEFudAorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7dGFyZ2V0IG5hbWU9InNjaGVtYSImZ3Q7CisgICZsdDshLS0gZGVmaW5lIHRoZSBzY2hlbWF0b29sIHRhc2s7IHRoaXMgY2FuIGJlIGRvbmUgYXQgdGhlIHRvcCBvZiAgLS0mZ3Q7CisgICZsdDshLS0gdGhlIGJ1aWxkLnhtbCBmaWxlLCBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIHRhcmdldHMgLS0mZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9InNjaGVtYXRvb2wiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuYW50LlNjaGVtYVRvb2xUYXNrIi8mZ3Q7CisKKyAgJmx0OyEtLSBhZGQgdGhlIHNjaGVtYSBjb21wb25lbnRzIGZvciBhbGwgLnNjaGVtYSBmaWxlcyBiZWxvdyB0aGUgICAtLSZndDsKKyAgJmx0OyEtLSBjdXJyZW50IGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSZndDsKKyAgJmx0O3NjaGVtYXRvb2wgYWN0aW9uPSJhZGQiJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iLiImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLnNjaGVtYSIgLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvc2NoZW1hdG9vbCZndDsKKyZsdDsvdGFyZ2V0Jmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9pbnRyby54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfaW50cm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjQxMjgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfaW50cm8ueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9InJlZl9ndWlkZV9pbnRybyI+CisgICAgPHRpdGxlPgorICAgICAgICBJbnRyb2R1Y3Rpb24KKyAgICA8L3RpdGxlPgorICAgIDxwYXJhPgorT3BlbkpQQSBpcyBhIEpEQkMtYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpQQSBzdGFuZGFyZC4KK1RoaXMgZG9jdW1lbnQgaXMgYSByZWZlcmVuY2UgZm9yIHRoZSBjb25maWd1cmF0aW9uIGFuZCB1c2Ugb2YgT3BlbkpQQS4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9pbnRyb19hdWRpZW5jZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEludGVuZGVkIEF1ZGllbmNlCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCBmb3IgT3BlbkpQQSBkZXZlbG9wZXJzLiBJdAorYXNzdW1lcyBzdHJvbmcga25vd2xlZGdlIG9mIEphdmEsIGZhbWlsaWFyaXR5IHdpdGggdGhlIGVYdGVuc2libGUgTWFya3VwCitMYW5ndWFnZSAoWE1MKSwgYW5kIGFuIHVuZGVyc3RhbmRpbmcgb2YgSlBBLiBJZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIEpQQSwKK3BsZWFzZSByZWFkIHRoZSA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfaW50cm8iPkpQQSBPdmVydmlldzwvbGluaz4gYmVmb3JlCitwcm9jZWVkaW5nLiAKKzwhLS0gCisjIyMgVFVUT1JJQUwKK1dlIGFsc28gc3Ryb25nbHkgcmVjb21tZW5kIHRha2luZyBPcGVuSlBBJ3MgaGFuZHMtb24KKzxsaW5rIGxpbmtlbmQ9InR1dG9yaWFscyI+dHV0b3JpYWxzPC9saW5rPiB0byBnZXQgY29tZm9ydGFibGUgd2l0aCBPcGVuSlBBCitiYXNpY3MuCistLT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0NlcnRhaW4gc2VjdGlvbnMgb2YgdGhpcyBndWlkZSBjb3ZlciBhZHZhbmNlZCB0b3BpY3Mgc3VjaCBhcyBjdXN0b20KK29iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcsIGVudGVycHJpc2UgaW50ZWdyYXRpb24sIGFuZCB1c2luZyBPcGVuSlBBIHdpdGgKK3RoaXJkLXBhcnR5IHRvb2xzLiBUaGVzZSBzZWN0aW9ucyBhc3N1bWUgcHJpb3IgZXhwZXJpZW5jZSB3aXRoIHRoZSByZWxldmFudAorc3ViamVjdC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9sb2dnaW5nLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9sb2dnaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg0NjFlCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX2xvZ2dpbmcueG1sCkBAIC0wLDAgKzEsNTYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxjaGFwdGVyIGlkPSJyZWZfZ3VpZGVfbG9nZ2luZyI+CisgICAgPHRpdGxlPgorICAgICAgICBMb2dnaW5nCisgICAgPC90aXRsZT4KKyAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9sb2dnaW5nIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBsb2dnaW5nCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9sb2dnaW5nIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBMb2cKKyAgICAgICAgPC9wcmltYXJ5PgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxwYXJhPgorTG9nZ2luZyBpcyBhbiBpbXBvcnRhbnQgbWVhbnMgb2YgZ2FpbmluZyBpbnNpZ2h0IGludG8geW91ciBhcHBsaWNhdGlvbidzIHJ1bnRpbWUKK2JlaGF2aW9yLiBPcGVuSlBBIHByb3ZpZGVzIGEgZmxleGlibGUgbG9nZ2luZyBzeXN0ZW0gdGhhdCBpbnRlZ3JhdGVzIHdpdGggbWFueQorZXhpc3RpbmcgcnVudGltZSBzeXN0ZW1zLCBzdWNoIGFzIGFwcGxpY2F0aW9uIHNlcnZlcnMgYW5kIHNlcnZsZXQgcnVubmVycy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CitUaGVyZSBhcmUgZm91ciBidWlsdC1pbiBsb2dnaW5nIHBsdWdpbnM6IGEKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9sb2dnaW5nX29wZW5qcGEiPmRlZmF1bHQgbG9nZ2luZyBmcmFtZXdvcms8L2xpbms+IHRoYXQKK2NvdmVycyBtb3N0IG5lZWRzLCBhIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9sb2dnaW5nX2xvZzRqIj4gTG9nNEo8L2xpbms+CitkZWxlZ2F0ZSwgYW4gPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2xvZ2dpbmdfY29tbW9ucyI+IEFwYWNoZSBDb21tb25zIExvZ2dpbmcKKzwvbGluaz4gZGVsZWdhdGUsIGFuZCBhIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9sb2dnaW5nX25vb3AiPm5vLW9wPC9saW5rPgoraW1wbGVtZW50YXRpb24gZm9yIGRpc2FibGluZyBsb2dnaW5nLgorICAgIDwvcGFyYT4KKyAgICA8d2FybmluZz4KKyAgICAgICAgPHBhcmE+CitMb2dnaW5nIGNhbiBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLiBEaXNhYmxlIHZlcmJvc2UgbG9nZ2luZyAoc3VjaAorYXMgbG9nZ2luZyBvZiBTUUwgc3RhdGVtZW50cykgYmVmb3JlIHJ1bm5pbmcgYW55IHBlcmZvcm1hbmNlIHRlc3RzLiBJdCBpcworYWR2aXNhYmxlIHRvIGxpbWl0IG9yIGRpc2FibGUgbG9nZ2luZyBmb3IgYSBwcm9kdWN0aW9uIHN5c3RlbS4gWW91IGNhbiBkaXNhYmxlCitsb2dnaW5nIGFsdG9nZXRoZXIgYnkgc2V0dGluZyB0aGUgPGxpdGVyYWw+b3BlbmpwYS5Mb2c8L2xpdGVyYWw+IHByb3BlcnR5IHRvCis8bGl0ZXJhbD5ub25lPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvd2FybmluZz4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2xvZ2dpbmdfY2hhbm5lbHMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBMb2dnaW5nIENoYW5uZWxzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2xvZ2dpbmdfY2hhbm5lbHMiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbG9nZ2luZworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjaGFubmVscworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0xvZ2dpbmcgaXMgZG9uZSBvdmVyIGEgbnVtYmVyIG9mIDxlbXBoYXNpcz5sb2dnaW5nIGNoYW5uZWxzPC9lbXBoYXNpcz4sIGVhY2ggb2YKK3doaWNoIGhhcyBhIDxlbXBoYXNpcz5sb2dnaW5nIGxldmVsPC9lbXBoYXNpcz4gd2hpY2ggY29udHJvbHMgdGhlIHZlcmJvc2l0eSBvZgorbG9nIG1lc3NhZ2VzIHJlY29yZGVkIGZvciB0aGUgY2hhbm5lbC4gT3BlbkpQQSB1c2VzIHRoZSBmb2xsb3dpbmcgbG9nZ2luZworY2hhbm5lbHM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm9wZW5qcGEuVG9vbDwvbGl0ZXJhbD46IE1lc3NhZ2VzIGlzc3VlZCBieSB0aGUgT3BlbkpQQSBjb21tYW5kIGxpbmUKK2FuZCBBbnQgdG9vbHMuIE1vc3QgbWVzc2FnZXMgYXJlIGJhc2ljIHN0YXRlbWVudHMgZGV0YWlsaW5nIHdoaWNoIGNsYXNzZXMgb3IKK2ZpbGVzIHRoZSB0b29scyBhcmUgcnVubmluZyBvbi4gRGV0YWlsZWQgb3V0cHV0IGlzIG9ubHkgYXZhaWxhYmxlIHZpYSB0aGUKK2xvZ2dpbmcgY2F0ZWdvcnkgdGhlIHRvb2wgYmVsb25ncyB0bywgc3VjaCBhcyA8bGl0ZXJhbD5vcGVuanBhLkVuaGFuY2U8L2xpdGVyYWw+Citmb3IgdGhlIGVuaGFuY2VyIChzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX2VuaGFuY2UiLz4pIG9yIDxsaXRlcmFsPgorb3BlbmpwYS5NZXRhRGF0YTwvbGl0ZXJhbD4gZm9yIHRoZSBtYXBwaW5nIHRvb2wgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfbWFwcGluZ3Rvb2wiLz4pLiBUaGlzIGxvZ2dpbmcgY2F0ZWdvcnkKK2lzIHByb3ZpZGVkIHNvIHRoYXQgeW91IGNhbiBnZXQgYSBnZW5lcmFsIGlkZWEgb2Ygd2hhdCBhIHRvb2wgaXMgZG9pbmcgd2l0aG91dAoraGF2aW5nIHRvIG1hbmlwdWxhdGUgbG9nZ2luZyBzZXR0aW5ncyB0aGF0IG1pZ2h0IGFsc28gYWZmZWN0IHJ1bnRpbWUgYmVoYXZpb3IuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+b3BlbmpwYS5Db25maWd1cmF0aW9uPC9saXRlcmFsPjogTWVzc2FnZXMgaXNzdWVkIGJ5IHRoZSBjb25maWd1cmF0aW9uCitmcmFtZXdvcmsuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50CisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPm9wZW5qcGEuRW5oYW5jZTwvbGl0ZXJhbD46IE1lc3NhZ2VzIHBlcnRhaW5pbmcgdG8gZW5oYW5jZW1lbnQgYW5kCitydW50aW1lIGNsYXNzIGdlbmVyYXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPm9wZW5qcGEuTWV0YURhdGE8L2xpdGVyYWw+OiBEZXRhaWxzIGFib3V0IHRoZSBnZW5lcmF0aW9uIG9mIG1ldGFkYXRhCithbmQgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZ3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm9wZW5qcGEuUnVudGltZTwvbGl0ZXJhbD46IEdlbmVyYWwgT3BlbkpQQSBydW50aW1lIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcGVuanBhLlF1ZXJ5PC9saXRlcmFsPjogTWVzc2FnZXMgYWJvdXQgcXVlcmllcy4gUXVlcnkgc3RyaW5ncyBhbmQgYW55CitwYXJhbWV0ZXIgdmFsdWVzLCBpZiBhcHBsaWNhYmxlLCB3aWxsIGJlIGxvZ2dlZCB0byB0aGUgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+CitsZXZlbCBhdCBleGVjdXRpb24gdGltZS4gSW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgcGVyZm9ybWFuY2UgY29uY2VybnMgd2lsbCBiZQorbG9nZ2VkIHRvIHRoZSA8bGl0ZXJhbD5JTkZPPC9saXRlcmFsPiBsZXZlbC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGluZworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcGVuanBhLkRhdGFDYWNoZTwvbGl0ZXJhbD46IE1lc3NhZ2VzIGZyb20gdGhlIEwyIGRhdGEgY2FjaGUgcGx1Z2lucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgSkRCQworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcGVuanBhLmpkYmMuSkRCQzwvbGl0ZXJhbD46IEpEQkMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gR2VuZXJhbCBKREJDCitpbmZvcm1hdGlvbiB3aWxsIGJlIGxvZ2dlZCB0byB0aGUgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IGxldmVsLiBJbmZvcm1hdGlvbgorYWJvdXQgcG9zc2libGUgcGVyZm9ybWFuY2UgY29uY2VybnMgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIDxsaXRlcmFsPklORk8KKzwvbGl0ZXJhbD4gbGV2ZWwuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNRTAorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5vcGVuanBhLmpkYmMuU1FMPC9saXRlcmFsPjogVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gbG9nZ2luZyBjaGFubmVsIHRvCit1c2UuIERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGVjdXRpb24gb2YgU1FMIHN0YXRlbWVudHMgd2lsbCBiZSBzZW50IHRvCit0aGUgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IGxldmVsLiBJdCBpcyB1c2VmdWwgdG8gZW5hYmxlIHRoaXMgY2hhbm5lbCBpZiB5b3UKK2FyZSBjdXJpb3VzIGFib3V0IHRoZSBleGFjdCBTUUwgdGhhdCBPcGVuSlBBIGlzc3VlcyB0byB0aGUgZGF0YXN0b3JlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1doZW4gdXNpbmcgdGhlIGJ1aWx0LWluIE9wZW5KUEEgbG9nZ2luZyBmYWNpbGl0aWVzLCB5b3UgY2FuIGVuYWJsZSBTUUwgbG9nZ2luZworYnkgYWRkaW5nIDxsaXRlcmFsPlNRTD1UUkFDRTwvbGl0ZXJhbD4gdG8geW91ciA8bGl0ZXJhbD5vcGVuanBhLkxvZzwvbGl0ZXJhbD4KK3Byb3BlcnR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgY2FuIG9wdGlvbmFsbHkgcmVmb3JtYXQgdGhlIGxvZ2dlZCBTUUwgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZC4gVG8KK2VuYWJsZSBwcmV0dHktcHJpbnRpbmcsIGFkZCA8bGl0ZXJhbD5QcmV0dHlQcmludD10cnVlPC9saXRlcmFsPiB0byB0aGUKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzIj48bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzPC9saXRlcmFsPjwvbGluaz4gcHJvcGVydHkuIFlvdSBjYW4gY29udHJvbAoraG93IG1hbnkgY29sdW1ucyB3aWRlIHRoZSBwcmV0dHktcHJpbnRlZCBTUUwgd2lsbCBiZSB3aXRoIHRoZSA8bGl0ZXJhbD4KK1ByZXR0eVByaW50TGluZUxlbmd0aDwvbGl0ZXJhbD4gcHJvcGVydHkuIFRoZSBkZWZhdWx0IGxpbmUgbGVuZ3RoIGlzIDYwIGNvbHVtbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2hpbGUgcHJldHR5IHByaW50aW5nIG1ha2VzIHRoaW5ncyBlYXNpZXIgdG8gcmVhZCwgaXQgY2FuIG1ha2Ugb3V0cHV0IGhhcmRlciB0bworcHJvY2VzcyB3aXRoIHRvb2xzIGxpa2UgZ3JlcC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitQcmV0dHktcHJpbnRpbmcgcHJvcGVydGllcyBjb25maWd1cmF0aW9uIG1pZ2h0IGxvb2sgbGlrZSBzbzoKKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Mb2ciIHZhbHVlPSJTUUw9VFJBQ0UiLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkNvbm5lY3Rpb25GYWN0b3J5UHJvcGVydGllcyIgCisgICAgdmFsdWU9IlByZXR0eVByaW50PXRydWUsIFByZXR0eVByaW50TGluZUxlbmd0aD03MiIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+b3BlbmpwYS5qZGJjLlNjaGVtYTwvbGl0ZXJhbD46IERldGFpbHMgYWJvdXQgb3BlcmF0aW9ucyBvbiB0aGUKK2RhdGFiYXNlIHNjaGVtYS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9sb2dnaW5nX29wZW5qcGEiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBPcGVuSlBBIExvZ2dpbmcKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9nZ2luZ19vcGVuanBhIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGxvZ2dpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZGVmYXVsdAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0J5IGRlZmF1bHQsIE9wZW5KUEEgdXNlcyBhIGJhc2ljIGxvZ2dpbmcgZnJhbWV3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQKK2Zvcm1hdDoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm1pbGxpczwvbGl0ZXJhbD4mbmJzcDsmbmJzcDs8bGl0ZXJhbD5kaWFnbm9zdGljIGNvbnRleHQ8L2xpdGVyYWw+Jm5ic3A7Jm5ic3A7PGxpdGVyYWw+bGV2ZWw8L2xpdGVyYWw+Jm5ic3A7Jm5ic3A7WzxsaXRlcmFsPnRocmVhZCBuYW1lPC9saXRlcmFsPl0mbmJzcDsmbmJzcDs8bGl0ZXJhbD5jaGFubmVsPC9saXRlcmFsPiAtIDxsaXRlcmFsPm1lc3NhZ2U8L2xpdGVyYWw+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitGb3IgZXhhbXBsZSwgd2hlbiBsb2FkaW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBPcGVuSlBBLCBhIG1lc3NhZ2UgbGlrZSB0aGUKK2ZvbGxvd2luZyB3aWxsIGJlIHNlbnQgdG8gdGhlIDxsaXRlcmFsPm9wZW5qcGEuUnVudGltZTwvbGl0ZXJhbD4gY2hhbm5lbDoKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorMjEwNyAgSU5GTyAgIFttYWluXSBvcGVuanBhLlJ1bnRpbWUgLSBTdGFydGluZyBPcGVuSlBBIDAuOS43Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1RoZSBkZWZhdWx0IGxvZ2dpbmcgc3lzdGVtIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5GaWxlPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9nIHRvLCBvciA8bGl0ZXJhbD5zdGRvdXQKKzwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+c3RkZXJyPC9saXRlcmFsPiB0byBzZW5kIG1lc3NhZ2VzIHRvIHN0YW5kYXJkIG91dCBhbmQKK3N0YW5kYXJkIGVycm9yLCByZXNwZWN0aXZlbHkuIEJ5IGRlZmF1bHQsIE9wZW5KUEEgc2VuZHMgbG9nIG1lc3NhZ2VzIHRvIHN0YW5kYXJkCitlcnJvci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RGVmYXVsdExldmVsPC9saXRlcmFsPjogVGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBvZiB1bmNvbmZpZ3VyZWQKK2NoYW5uZWxzLiBSZWNvZ25pemVkIHZhbHVlcyBhcmUgPGxpdGVyYWw+IFRSQUNFLCBERUJVRywgSU5GTywgV0FSTiw8L2xpdGVyYWw+CithbmQgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+LiBEZWZhdWx0cyB0byA8bGl0ZXJhbD5JTkZPPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RGlhZ25vc3RpY0NvbnRleHQ8L2xpdGVyYWw+OiBBIHN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGFsbAorbG9nIG1lc3NhZ2VzLiBJZiB0aGlzIGlzIG5vdCBzdXBwbGllZCBhbmQgYSA8bGl0ZXJhbD5vcGVuanBhLklkPC9saXRlcmFsPgorcHJvcGVydHkgdmFsdWUgaXMgYXZhaWxhYmxlLCB0aGF0IHZhbHVlIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Jmx0O2NoYW5uZWwmZ3Q7PC9saXRlcmFsPjogVXNpbmcgdGhlIGxhc3QgdG9rZW4gb2YgdGhlCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfbG9nZ2luZ19jaGFubmVscyI+bG9nZ2luZyBjaGFubmVsPC9saW5rPiBuYW1lLCB5b3UgY2FuCitjb25maWd1cmUgdGhlIGxvZyBsZXZlbCB0byB1c2UgZm9yIHRoYXQgY2hhbm5lbC4gU2VlIHRoZSBleGFtcGxlcyBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9sb2dnaW5nX29wZW5qcGFfc3RkX2V4Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTdGFuZGFyZCBPcGVuSlBBIExvZyBDb25maWd1cmF0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuTG9nIiB2YWx1ZT0iRGVmYXVsdExldmVsPVdBUk4sIFJ1bnRpbWU9SU5GTywgVG9vbD1JTkZPIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9nZ2luZ19vcGVuanBhX3NxbF9leCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3RhbmRhcmQgT3BlbkpQQSBMb2cgQ29uZmlndXJhdGlvbiArIEFsbCBTUUwgU3RhdGVtZW50cworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkxvZyIgdmFsdWU9IkRlZmF1bHRMZXZlbD1XQVJOLCBSdW50aW1lPUlORk8sIFRvb2w9SU5GTywgU1FMPVRSQUNFIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9nZ2luZ19vcGVuanBhX2ZpbGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIExvZ2dpbmcgdG8gYSBGaWxlCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuTG9nIiB2YWx1ZT0iRmlsZT0vdG1wL29yZy5hcGFjaGUub3BlbmpwYS5sb2csIERlZmF1bHRMZXZlbD1XQVJOLCBSdW50aW1lPUlORk8sIFRvb2w9SU5GTyIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2xvZ2dpbmdfbm9vcCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIERpc2FibGluZyBMb2dnaW5nCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2xvZ2dpbmdfbm9vcCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBsb2dnaW5nCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGRpc2FibGluZworICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0Rpc2FibGluZyBsb2dnaW5nIGNhbiBiZSB1c2VmdWwgdG8gYW5hbHl6ZSBwZXJmb3JtYW5jZSB3aXRob3V0IGFueSBJL08gb3ZlcmhlYWQKK29yIHRvIHJlZHVjZSB2ZXJib3NpdHkgYXQgdGhlIGNvbnNvbGUuIFRvIGRvIHRoaXMsIHNldCB0aGUgPGxpdGVyYWw+b3BlbmpwYS5Mb2cKKzwvbGl0ZXJhbD4gcHJvcGVydHkgdG8gPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitEaXNhYmxpbmcgbG9nZ2luZyBwZXJtYW5lbnRseSwgaG93ZXZlciwgd2lsbCBjYXVzZSBhbGwgd2FybmluZ3MgdG8gYmUgY29uc3VtZWQuCitXZSByZWNvbW1lbmQgdXNpbmcgb25lIG9mIHRoZSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWVjaGFuaXNtcyBkZXNjcmliZWQgaW4gdGhpcworY2hhcHRlci4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2xvZ2dpbmdfbG9nNGoiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBMb2c0SgorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9sb2dnaW5nX2xvZzRqIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGxvZ2dpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgTG9nNGoKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitXaGVuIDxsaXRlcmFsPm9wZW5qcGEuTG9nPC9saXRlcmFsPiBpcyBzZXQgdG8gPGxpdGVyYWw+bG9nNGo8L2xpdGVyYWw+LCBPcGVuSlBBCit3aWxsIGRlbGVnYXRlIHRvIExvZzRKIGZvciBsb2dnaW5nLiBJbiBhIHN0YW5kYWxvbmUgYXBwbGljYXRpb24sIExvZzRKIGxvZ2dpbmcKK2xldmVscyBhcmUgY29udHJvbGxlZCBieSBhIHJlc291cmNlIG5hbWVkIDxmaWxlbmFtZT5sb2c0ai5wcm9wZXJ0aWVzPC9maWxlbmFtZT4KKywgd2hpY2ggc2hvdWxkIGJlIGF2YWlsYWJsZSBhcyBhIHRvcC1sZXZlbCByZXNvdXJjZSAoZWl0aGVyIGF0IHRoZSB0b3AgbGV2ZWwgb2YKK2EgamFyIGZpbGUsIG9yIGluIHRoZSByb290IG9mIG9uZSBvZiB0aGUgPGxpdGVyYWw+Q0xBU1NQQVRIPC9saXRlcmFsPgorZGlyZWN0b3JpZXMpLiBXaGVuIGRlcGxveWluZyB0byBhIHdlYiBvciBFSkIgYXBwbGljYXRpb24gc2VydmVyLCBMb2c0SgorY29uZmlndXJhdGlvbiBpcyBvZnRlbiBwZXJmb3JtZWQgaW4gYSA8ZmlsZW5hbWU+bG9nNGoueG1sPC9maWxlbmFtZT4gZmlsZQoraW5zdGVhZCBvZiBhIHByb3BlcnRpZXMgZmlsZS4gRm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBjb25maWd1cmluZyBMb2c0SiwgcGxlYXNlCitzZWUgdGhlIDx1bGluayB1cmw9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9tYW51YWwuaHRtbCI+TG9nNEoKK01hbnVhbDwvdWxpbms+LiBXZSBwcmVzZW50IGFuIGV4YW1wbGUgPGZpbGVuYW1lPmxvZzRqLnByb3BlcnRpZXM8L2ZpbGVuYW1lPiBmaWxlCitiZWxvdy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2xvZ2dpbmdfbG9nNGpfZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFN0YW5kYXJkIExvZzRKIExvZ2dpbmcKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Citsb2c0ai5yb290Q2F0ZWdvcnk9V0FSTiwgY29uc29sZQorbG9nNGouY2F0ZWdvcnkub3BlbmpwYS5Ub29sPUlORk8KK2xvZzRqLmNhdGVnb3J5Lm9wZW5qcGEuUnVudGltZT1JTkZPCitsb2c0ai5jYXRlZ29yeS5vcGVuanBhLlJlbW90ZT1XQVJOCitsb2c0ai5jYXRlZ29yeS5vcGVuanBhLkRhdGFDYWNoZT1XQVJOCitsb2c0ai5jYXRlZ29yeS5vcGVuanBhLk1ldGFEYXRhPVdBUk4KK2xvZzRqLmNhdGVnb3J5Lm9wZW5qcGEuRW5oYW5jZT1XQVJOCitsb2c0ai5jYXRlZ29yeS5vcGVuanBhLlF1ZXJ5PVdBUk4KK2xvZzRqLmNhdGVnb3J5Lm9wZW5qcGEuamRiYy5TUUw9V0FSTgorbG9nNGouY2F0ZWdvcnkub3BlbmpwYS5qZGJjLkpEQkM9V0FSTgorbG9nNGouY2F0ZWdvcnkub3BlbmpwYS5qZGJjLlNjaGVtYT1XQVJOCisKK2xvZzRqLmFwcGVuZGVyLmNvbnNvbGU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9sb2dnaW5nX2NvbW1vbnMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBBcGFjaGUgQ29tbW9ucyBMb2dnaW5nCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2xvZ2dpbmdfY29tbW9ucyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBsb2dnaW5nCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIEFwYWNoZSBDb21tb25zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorU2V0IHRoZSA8bGl0ZXJhbD5vcGVuanBhLkxvZzwvbGl0ZXJhbD4gcHJvcGVydHkgdG8gPGxpdGVyYWw+Y29tbW9uczwvbGl0ZXJhbD4gdG8KK3VzZSB0aGUgPHVsaW5rIHVybD0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2xvZ2dpbmcuaHRtbCI+IEFwYWNoZQorSmFrYXJ0YSBDb21tb25zIExvZ2dpbmc8L3VsaW5rPiB0aGluIGxpYnJhcnkgZm9yIGlzc3VpbmcgbG9nIG1lc3NhZ2VzLiBUaGUKK0NvbW1vbnMgTG9nZ2luZyBsaWJyYXJpZXMgYWN0IGFzIGEgd3JhcHBlciBhcm91bmQgYSBudW1iZXIgb2YgcG9wdWxhciBsb2dnaW5nCitBUElzLCBpbmNsdWRpbmcgdGhlCis8dWxpbmsgdXJsPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqL2RvY3MvaW5kZXguaHRtbCI+IEpha2FydGEgTG9nNEoKKzwvdWxpbms+IHByb2plY3QsIGFuZCB0aGUgbmF0aXZlCis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40L2RvY3MvYXBpL2phdmEvdXRpbC9sb2dnaW5nL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KK2phdmEudXRpbC5sb2dnaW5nPC91bGluaz4gcGFja2FnZSBpbiBKREsgMS40LiBJZiBuZWl0aGVyIG9mIHRoZXNlIGxpYnJhcmllcyBhcmUKK2F2YWlsYWJsZSwgdGhlbiBsb2dnaW5nIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHNpbXBsZSBjb25zb2xlIGxvZ2dpbmcuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitXaGVuIHVzaW5nIHRoZSBDb21tb25zIExvZ2dpbmcgZnJhbWV3b3JrIGluIGNvbmp1bmN0aW9uIHdpdGggTG9nNEosCitjb25maWd1cmF0aW9uIHdpbGwgYmUgdGhlIHNhbWUgYXMgd2FzIGRpc2N1c3NlZCBpbiB0aGUgTG9nNEogc2VjdGlvbiBhYm92ZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2xvZ2dpbmdfamRrMTQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEpESyAxLjQgamF2YS51dGlsLmxvZ2dpbmcKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9sb2dnaW5nX2pkazE0Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBKREsgMS40CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiB1c2luZyBKREsgMS40IG9yIGhpZ2hlciBpbiBjb25qdW5jdGlvbiB3aXRoIE9wZW5KUEEncyBDb21tb25zIExvZ2dpbmcKK3N1cHBvcnQsIGxvZ2dpbmcgd2lsbCBwcm9jZWVkIHRocm91Z2ggSmF2YSdzIGJ1aWx0LWluIGxvZ2dpbmcgcHJvdmlkZWQgYnkgdGhlCis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40L2RvY3MvYXBpL2phdmEvdXRpbC9sb2dnaW5nL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KK2phdmEudXRpbC5sb2dnaW5nPC91bGluaz4gcGFja2FnZS4gRm9yIGRldGFpbHMgb24gY29uZmlndXJpbmcgdGhlIGJ1aWx0LWluCitsb2dnaW5nIHN5c3RlbSwgcGxlYXNlIHNlZSB0aGUKKzx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9ndWlkZS91dGlsL2xvZ2dpbmcvb3ZlcnZpZXcuaHRtbCI+CitKYXZhIExvZ2dpbmcgT3ZlcnZpZXc8L3VsaW5rPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorQnkgZGVmYXVsdCwgSkRLIDEuNCdzIGxvZ2dpbmcgcGFja2FnZSBsb29rcyBpbiB0aGUgPGZpbGVuYW1lPgorSkFWQV9IT01FL2xpYi9sb2dnaW5nLnByb3BlcnRpZXM8L2ZpbGVuYW1lPiBmaWxlIGZvciBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uIFRoaXMKK2NhbiBiZSBvdmVycmlkZGVuIHdpdGggdGhlIDxsaXRlcmFsPiBqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZTwvbGl0ZXJhbD4KK3N5c3RlbSBwcm9wZXJ0eS4gRm9yIGV4YW1wbGU6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIC1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU9bXlsb2dnaW5nLnByb3BlcnRpZXMgY29tLmNvbXBhbnkuTXlDbGFzcworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9nZ2luZ19qZGsxNF9wcm9wZmlsZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKREsgMS40IExvZyBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyMgc3BlY2lmeSB0aGUgaGFuZGxlcnMgdG8gY3JlYXRlIGluIHRoZSByb290IGxvZ2dlcgorIyAoYWxsIGxvZ2dlcnMgYXJlIGNoaWxkcmVuIG9mIHRoZSByb290IGxvZ2dlcikKKyMgdGhlIGZvbGxvd2luZyBjcmVhdGVzIHR3byBoYW5kbGVycworaGFuZGxlcnM9amF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIsIGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyCisgICAgCisjIHNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciB0aGUgcm9vdCBsb2dnZXIKKy5sZXZlbD1BTEwKKyAgICAKKyMgc2V0IHRoZSBkZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgZm9yIG5ldyBDb25zb2xlSGFuZGxlciBpbnN0YW5jZXMKK2phdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmxldmVsPUlORk8KKworIyBzZXQgdGhlIGRlZmF1bHQgbG9nZ2luZyBsZXZlbCBmb3IgbmV3IEZpbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWw9QUxMCisKKyMgc2V0IHRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgbmV3IENvbnNvbGVIYW5kbGVyIGluc3RhbmNlcworamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyPWphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcgorCisjIHNldCB0aGUgZGVmYXVsdCBsb2dnaW5nIGxldmVsIGZvciBhbGwgT3BlbkpQQSBsb2dzCitvcGVuanBhLlRvb2wubGV2ZWw9SU5GTworb3BlbmpwYS5SdW50aW1lLmxldmVsPUlORk8KK29wZW5qcGEuUmVtb3RlLmxldmVsPUlORk8KK29wZW5qcGEuRGF0YUNhY2hlLmxldmVsPUlORk8KK29wZW5qcGEuTWV0YURhdGEubGV2ZWw9SU5GTworb3BlbmpwYS5FbmhhbmNlLmxldmVsPUlORk8KK29wZW5qcGEuUXVlcnkubGV2ZWw9SU5GTworb3BlbmpwYS5qZGJjLlNRTC5sZXZlbD1JTkZPCitvcGVuanBhLmpkYmMuSkRCQy5sZXZlbD1JTkZPCitvcGVuanBhLmpkYmMuU2NoZW1hLmxldmVsPUlORk8KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9sb2dnaW5nX2N1c3RvbSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEN1c3RvbSBMb2cKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9nZ2luZ19jdXN0b20iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbG9nZ2luZworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBjdXN0b20KKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitJZiBub25lIG9mIGF2YWlsYWJsZSBsb2dnaW5nIHN5c3RlbXMgbWVldCB5b3VyIG5lZWRzLCB5b3UgY2FuIGNvbmZpZ3VyZSB0aGUKK2xvZ2dpbmcgc3lzdGVtIHdpdGggYSBjdXN0b20gbG9nZ2VyLiBZb3UgbWlnaHQgdXNlIGN1c3RvbSBsb2dnaW5nIHRvIGludGVncmF0ZQord2l0aCBhIHByb3ByaWV0YXJ5IGxvZ2dpbmcgZnJhbWV3b3JrIHVzZWQgYnkgc29tZSBhcHBsaWNhdGlvbnMgc2VydmVycywgb3IgZm9yCitsb2dnaW5nIHRvIGEgZ3JhcGhpY2FsIGNvbXBvbmVudCBmb3IgR1VJIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0EgY3VzdG9tIGxvZ2dpbmcgZnJhbWV3b3JrIG11c3QgaW5jbHVkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9sb2cvTG9nRmFjdG9yeS5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuTG9nRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+IGludGVyZmFjZS4gV2UgcHJlc2VudAorYSBjdXN0b20gPGNsYXNzbmFtZT5Mb2dGYWN0b3J5PC9jbGFzc25hbWU+IGJlbG93LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9nZ2luZ19jdXN0b21fZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEN1c3RvbSBMb2dnaW5nIENsYXNzCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcGFja2FnZSBjb20ueHl6OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi5sb2cuKjsKKworcHVibGljIGNsYXNzIEN1c3RvbUxvZ0ZhY3RvcnkKKyAgICBpbXBsZW1lbnRzIExvZ0ZhY3RvcnkgeyAgIAorCisgICAgcHJpdmF0ZSBTdHJpbmcgX3ByZWZpeCA9ICJDVVNUT00gTE9HIjsKKworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeCAoU3RyaW5nIHByZWZpeCkgeworICAgICAgICBfcHJlZml4ID0gcHJlZml4OworICAgIH0KKyAKKyAgICBwdWJsaWMgTG9nIGdldExvZyhTdHJpbmcgY2hhbm5lbCkgeworICAgICAgICAvLyBSZXR1cm4gYSBzaW1wbGUgZXh0ZW5zaW9uIG9mIEFic3RyYWN0TG9nIHRoYXQgd2lsbCBsb2cKKyAgICAgICAgLy8gZXZlcnl0aGluZyB0byB0aGUgU3lzdGVtLmVyciBzdHJlYW0uIE5vdGUgdGhhdCB0aGlzIGlzIAorICAgICAgICAvLyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gT3BlbkpQQSdzIGRlZmF1bHQgbG9nZ2luZyBiZWhhdmlvci4KKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdExvZygpIHsKKworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKHNob3J0IGxvZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gbG9nIGFsbCBsZXZlbHMKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgbG9nIChzaG9ydCB0eXBlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBqdXN0IHNlbmQgZXZlcnl0aGluZyB0byBTeXN0ZW0uZXJyCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKF9wcmVmaXggKyAiOiAiICsgdHlwZSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlICsgIjogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CitUbyBtYWtlIE9wZW5KUEEgdXNlIHlvdXIgY3VzdG9tIGxvZyBmYWN0b3J5LCBzZXQgdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkxvZyI+PGxpdGVyYWw+b3BlbmpwYS5Mb2c8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uCitwcm9wZXJ0eSB0byB5b3VyIGZhY3RvcnkncyBmdWxsIGNsYXNzIG5hbWUuIEJlY2F1c2UgdGhpcyBwcm9wZXJ0eSBpcyBhIHBsdWdpbgorcHJvcGVydHkgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+ICksIHlvdSBjYW4gYWxzbworcGFzcyBwYXJhbWV0ZXJzIHRvIHlvdXIgZmFjdG9yeS4gRm9yIGV4YW1wbGUsIHRvIHVzZSB0aGUgZXhhbXBsZSBmYWN0b3J5IGFib3ZlCithbmQgc2V0IGl0cyBwcmVmaXggdG8gIkxPRyBNU0ciLCB5b3Ugd291bGQgc2V0IHRoZSA8bGl0ZXJhbD5vcGVuanBhLkxvZworPC9saXRlcmFsPiBwcm9wZXJ0eSB0byB0aGUgZm9sbG93aW5nIHN0cmluZzoKKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorY29tLnh5ei5DdXN0b21Mb2dGYWN0b3J5KFByZWZpeD0iTE9HIE1TRyIpCis8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9tYXBwaW5nLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9tYXBwaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDgyM2IyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX21hcHBpbmcueG1sCkBAIC0wLDAgKzEsMzAwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0icmVmX2d1aWRlX21hcHBpbmciPgorICAgIDx0aXRsZT4KKyAgICAgICAgTWFwcGluZworICAgIDwvdGl0bGU+CisgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZyI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHBhcmE+CitUaGUgSlBBIE92ZXJ2aWV3J3MgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmciLz4gZXhwbGFpbnMKK29iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgdW5kZXIgSlBBLiBUaGlzIGNoYXB0ZXIgcmV2aWV3cyB0aGUgbWFwcGluZyB1dGlsaXRpZXMKK09wZW5KUEEgcHJvdmlkZXMgYW5kIGV4YW1pbmVzIE9wZW5KUEEgZmVhdHVyZXMgdGhhdCBnbyBiZXlvbmQgdGhlIEpQQQorc3BlY2lmaWNhdGlvbi4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRm9yd2FyZCBNYXBwaW5nCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfbWFwcGluZ3Rvb2wiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgZm9yd2FyZCBtYXBwaW5nCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgdG9vbAorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgZm9yd2FyZCBtYXBwaW5nCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBmb3J3YXJkIG1hcHBpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICBmb3J3YXJkIG1hcHBpbmcKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+Rm9yd2FyZCBtYXBwaW5nPC9lbXBoYXNpcz4gaXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgbWFwcGluZ3MgYW5kCit0aGVpciBjb3JyZXNwb25kaW5nIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHlvdXIgb2JqZWN0IG1vZGVsLiBPcGVuSlBBIHN1cHBvcnRzCitmb3J3YXJkIG1hcHBpbmcgdGhyb3VnaCB0aGUgPGVtcGhhc2lzPm1hcHBpbmcgdG9vbDwvZW1waGFzaXM+LiBUaGUgbmV4dCBzZWN0aW9uCitwcmVzZW50cyBzZXZlcmFsIGNvbW1vbiBtYXBwaW5nIHRvb2wgdXNlIGNhc2VzLiBZb3UgY2FuIGludm9rZSB0aGUgdG9vbCB0aHJvdWdoCitpdHMgSmF2YSBjbGFzcywKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nVG9vbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2w8L2NsYXNzbmFtZT48L3VsaW5rPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ludGVncmF0aW9uX21hcHBpbmd0b29sIi8+IGRlc2NyaWJlcyB0aGUgbWFwcGluZwordG9vbCBBbnQgdGFzay4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX21hcHBpbmdfbWFwcGluZ3Rvb2xfdHlwaWNhbCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgVXNpbmcgdGhlIE1hcHBpbmcgVG9vbAorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCBNYWdhemluZS5qYXZhCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxwYXJhPgorSW4gYWRkaXRpb24gdG8gdGhlIHVuaXZlcnNhbCBmbGFncyBvZiB0aGUKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzIj5jb25maWd1cmF0aW9uIGZyYW1ld29yazwvbGluaz4sIHRoZQorbWFwcGluZyB0b29sIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgYXJndW1lbnRzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tc2NoZW1hQWN0aW9uLy1zYSAmbHQ7YWRkIHwgcmVmcmVzaCB8IGRyb3AgfCBidWlsZCB8IHJldGFpbiB8IHJlZmxlY3QgfCBjcmVhdGVEQiB8IGRyb3BEQiB8IGltcG9ydCB8IGV4cG9ydCB8IG5vbmUmZ3Q7Cis8L2xpdGVyYWw+OiBUaGUgYWN0aW9uIHRvIHRha2Ugb24gdGhlIHNjaGVtYS4gVGhlc2Ugb3B0aW9ucyBjb3JyZXNwb25kIHRvIHRoZQorc2FtZS1uYW1lZCBhY3Rpb25zIG9uIHRoZSBzY2hlbWEgdG9vbCBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfc2NoZW1hdG9vbCIvPi4gQWN0aW9ucyBjYW4gYmUgY29tcG9zZWQgaW4gYQorY29tbWEtc2VwYXJhdGVkIGxpc3QuIFVubGVzcyB5b3UgYXJlIHJ1bm5pbmcgdGhlIG1hcHBpbmcgdG9vbCBvbiBhbGwgb2YKK3lvdXIgcGVyc2lzdGVudCB0eXBlcyBhdCBvbmNlIG9yIGRyb3BwaW5nIGEgbWFwcGluZywgd2Ugc3Ryb25nbHkKK3JlY29tbWVuZCB5b3UgdXNlIHRoZSBkZWZhdWx0IDxsaXRlcmFsPmFkZDwvbGl0ZXJhbD4gYWN0aW9uIG9yIHRoZQorPGxpdGVyYWw+YnVpbGQ8L2xpdGVyYWw+IGFjdGlvbi4gT3RoZXJ3aXNlIHlvdSBtYXkgZW5kIHVwIGluYWR2ZXJ0ZW50bHkKK2Ryb3BwaW5nIHNjaGVtYSBjb21wb25lbnRzIHRoYXQgYXJlIHVzZWQgYnkgY2xhc3NlcyB5b3UgYXJlIG5vdAorY3VycmVudGx5IHJ1bm5pbmcgdGhlIHRvb2wgb3Zlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXNjaGVtYUZpbGUvLXNmICZsdDtzdGRvdXQgfCBvdXRwdXQgZmlsZSZndDs8L2xpdGVyYWw+OiBVc2UgdGhpcworb3B0aW9uIHRvIHdyaXRlIHRoZSBwbGFubmVkIHNjaGVtYSB0byBhbiBYTUwgZG9jdW1lbnQgcmF0aGVyIHRoYW4gbW9kaWZ5IHRoZQorZGF0YWJhc2UuIFRoZSBkb2N1bWVudCBjYW4gdGhlbiBiZSBtYW5pcHVsYXRlZCBhbmQgY29tbWl0dGVkIHRvIHRoZSBkYXRhYmFzZQord2l0aCB0aGUgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV9zY2hlbWF0b29sIj4gc2NoZW1hIHRvb2w8L2xpbms+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tc3FsRmlsZS8tc3FsICZsdDtzdGRvdXQgfCBvdXRwdXQgZmlsZSZndDs8L2xpdGVyYWw+OiBVc2UgdGhpcyBvcHRpb24KK3RvIHdyaXRlIHRoZSBwbGFubmVkIHNjaGVtYSBtb2RpZmljYXRpb25zIHRvIGEgU1FMIHNjcmlwdCByYXRoZXIgdGhhbiBtb2RpZnkgdGhlCitkYXRhYmFzZS4gQ29tYmluZSB0aGlzIHdpdGggYSA8bGl0ZXJhbD5zY2hlbWFBY3Rpb248L2xpdGVyYWw+IG9mIDxsaXRlcmFsPmJ1aWxkCis8L2xpdGVyYWw+IHRvIGdlbmVyYXRlIGEgc2NyaXB0IHRoYXQgcmVjcmVhdGVzIHRoZSBzY2hlbWEgZm9yIHRoZSBjdXJyZW50CittYXBwaW5ncywgZXZlbiBpZiB0aGUgc2NoZW1hIGFscmVhZHkgZXhpc3RzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tZHJvcFRhYmxlcy8tZHQgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogQ29ycmVzcG9uZHMgdG8gdGhlCitzYW1lLW5hbWVkIG9wdGlvbiBvbiB0aGUgc2NoZW1hIHRvb2wuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1kcm9wU2VxdWVuY2VzLy1kc3EgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogQ29ycmVzcG9uZHMgdG8KK3RoZSBzYW1lLW5hbWVkIG9wdGlvbiBvbiB0aGUgc2NoZW1hIHRvb2wuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1vcGVuanBhVGFibGVzLy1vdCAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBDb3JyZXNwb25kcyB0bwordGhlIHNhbWUtbmFtZWQgb3B0aW9uIG9uIHRoZSBzY2hlbWEgdG9vbC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWlnbm9yZUVycm9ycy8taSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBDb3JyZXNwb25kcyB0bwordGhlIHNhbWUtbmFtZWQgb3B0aW9uIG9uIHRoZSBzY2hlbWEgdG9vbC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXNjaGVtYXMvLXMgJmx0O3NjaGVtYSBhbmQgdGFibGUgbmFtZXMmZ3Q7PC9saXRlcmFsPjogQ29ycmVzcG9uZHMgdG8KK3RoZSBzYW1lLW5hbWVkIG9wdGlvbiBvbiB0aGUgc2NoZW1hIHRvb2wuIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgPGxpdGVyYWw+CityZWFkU2NoZW1hPC9saXRlcmFsPiBpcyBub3Qgc2V0IHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tcmVhZFNjaGVtYS8tcnMgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogU2V0IHRoaXMgb3B0aW9uIHRvCis8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0byByZWFkIHRoZSBlbnRpcmUgZXhpc3Rpbmcgc2NoZW1hIHdoZW4gdGhlIHRvb2wgcnVucy4KK1JlYWRpbmcgdGhlIGV4aXN0aW5nIHNjaGVtYSBlbnN1cmVzIHRoYXQgT3BlbkpQQSBkb2VzIG5vdCBnZW5lcmF0ZSBhbnkgbWFwcGluZ3MKK3RoYXQgdXNlIHRhYmxlLCBpbmRleCwgcHJpbWFyeSBrZXksIG9yIGZvcmVpZ24ga2V5IG5hbWVzIHRoYXQgY29uZmxpY3Qgd2l0aAorZXhpc3RpbmcgbmFtZXMuIERlcGVuZGluZyBvbiB0aGUgSkRCQyBkcml2ZXIsIHRob3VnaCwgaXQgY2FuIGJlIGEgc2xvdyBwcm9jZXNzCitmb3IgbGFyZ2Ugc2NoZW1hcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXByaW1hcnlLZXlzLy1wayAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBXaGV0aGVyIHRvIHJlYWQKK2FuZCBtYW5pcHVsYXRlIHByaW1hcnkga2V5IGluZm9ybWF0aW9uIG9mIGV4aXN0aW5nIHRhYmxlcy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1mb3JlaWduS2V5cy8tZmsgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogV2hldGhlciB0byByZWFkCithbmQgbWFuaXB1bGF0ZSBmb3JlaWduIGtleSBpbmZvcm1hdGlvbiBvZiBleGlzdGluZyB0YWJsZXMuIERlZmF1bHRzIHRvIGZhbHNlLgorVGhpcyBtZWFucyB0aGF0IHRvIGFkZCBhbnkgbmV3IGZvcmVpZ24ga2V5cyB0byBhIGNsYXNzIHRoYXQgaGFzIGFscmVhZHkgYmVlbgorbWFwcGVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWluZGV4ZXMvLWl4ICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gcmVhZCBhbmQKK21hbmlwdWxhdGUgaW5kZXggaW5mb3JtYXRpb24gb2YgZXhpc3RpbmcgdGFibGVzLiBEZWZhdWx0cyB0byBmYWxzZS4gVGhpcyBtZWFucwordGhhdCB0byBhZGQgYW55IG5ldyBpbmRleGVzIHRvIGEgY2xhc3MgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIG1hcHBlZCBvbmNlLCB5b3UKK211c3QgZXhwbGljaXRseSBzZXQgdGhpcyBmbGFnIHRvIHRydWUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1zZXF1ZW5jZXMvLXNxICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFdoZXRoZXIgdG8KK21hbmlwdWxhdGUgc2VxdWVuY2VzLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tbWV0YS8tbSAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBXaGV0aGVyIHRoZSBnaXZlbiBhY3Rpb24KK2FwcGxpZXMgdG8gbWV0YWRhdGEgcmF0aGVyIHRoYW4gb3IgaW4gYWRkaXRpb24gdG8gbWFwcGluZ3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorVGhlIG1hcHBpbmcgdG9vbCBhbHNvIHVzZXMgYW4gPGxpdGVyYWw+LWFjdGlvbi8tYTwvbGl0ZXJhbD4gYXJndW1lbnQgdG8gc3BlY2lmeQordGhlIGFjdGlvbiB0byB0YWtlIG9uIGVhY2ggY2xhc3MuIFRoZSBhdmFpbGFibGUgYWN0aW9ucyBhcmU6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJ1aWxkU2NoZW1hPC9saXRlcmFsPjogVGhpcyBpcyB0aGUgZGVmYXVsdCBhY3Rpb24uIEl0CittYWtlcyB0aGUgZGF0YWJhc2Ugc2NoZW1hIG1hdGNoIHlvdXIgZXhpc3RpbmcgbWFwcGluZ3MuIElmIHlvdXIgcHJvdmlkZWQKK21hcHBpbmdzIGNvbmZsaWN0IHdpdGggeW91ciBjbGFzcyBkZWZpbml0aW9ucywgT3BlbkpQQSB3aWxsIGZhaWwgd2l0aCBhbiAKK2luZm9ybWF0aXZlIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dmFsaWRhdGU8L2xpdGVyYWw+OiBFbnN1cmUgdGhhdCB0aGUgbWFwcGluZ3MgZm9yIHRoZSBnaXZlbiBjbGFzc2VzIGFyZQordmFsaWQgYW5kIHRoYXQgdGhleSBtYXRjaCB0aGUgc2NoZW1hLiBObyBtYXBwaW5ncyBvciB0YWJsZXMgd2lsbCBiZSBjaGFuZ2VkLiBBbgorZXhjZXB0aW9uIGlzIHRocm93biBpZiBhbnkgbWFwcGluZ3MgYXJlIGludmFsaWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorRWFjaCBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHRoZSB0b29sIHNob3VsZCBiZSBvbmUgb2Y6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmdWxsIG5hbWUgb2YgYSBwZXJzaXN0ZW50IGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgLmphdmEgZmlsZSBmb3IgYSBwZXJzaXN0ZW50IGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGZpbGVuYW1lPi5jbGFzczwvZmlsZW5hbWU+IGZpbGUgb2YgYSBwZXJzaXN0ZW50IGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK0lmIHlvdSBkbyBub3Qgc3VwcGx5IGFueSBhcmd1bWVudHMgdG8gdGhlIG1hcHBpbmcgdG9vbCwgaXQgd2lsbCBydW4gb24gdGhlCitjbGFzc2VzIGluIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzIGxpc3QgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX3BjY2xhc3NlcyIvPikuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitUaGUgbWFwcGluZ3MgZ2VuZXJhdGVkIGJ5IHRoZSBtYXBwaW5nIHRvb2wgYXJlIHN0b3JlZCBieSB0aGUgc3lzdGVtIDxlbXBoYXNpcz4KK21hcHBpbmcgZmFjdG9yeTwvZW1waGFzaXM+LiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19mYWN0b3J5Ii8+CitkaXNjdXNzZXMgeW91ciBtYXBwaW5nIGZhY3Rvcnkgb3B0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21hcHBpbmdfbWFwcGluZ3Rvb2xfZXhhbXBsZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFVzaW5nIHRoZSBNYXBwaW5nIFRvb2wKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sX2V4YW1wbGVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyB0b29sCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHVzZSBjYXNlcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBKUEEgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YgZGVmYXVsdHMgZm9yIG1pc3NpbmcKK21hcHBpbmcgaW5mb3JtYXRpb24uIFRodXMsIGZvcndhcmQgbWFwcGluZyBpbiBKUEEgaXMgdmlydHVhbGx5IGF1dG9tYXRpYy4gQWZ0ZXIKK3VzaW5nIHRoZSBtYXBwaW5nIGFubm90YXRpb25zIGNvdmVyZWQgaW4gPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmciLz4KK29mIHRoZSBKUEEgT3ZlcnZpZXcgdG8gb3ZlcnJpZGUgYW55IHVuc2F0aXNmYWN0b3J5IGRlZmF1bHRzLCBydW4gdGhlCittYXBwaW5nIHRvb2wgb24geW91ciBwZXJzaXN0ZW50IGNsYXNzZXMuICBUaGUgZGVmYXVsdCA8bGl0ZXJhbD5idWlsZFNjaGVtYQorPC9saXRlcmFsPiBtYXBwaW5nIHRvb2wgYWN0aW9uIG1hbmlwdWxhdGVzIHRoZSBkYXRhYmFzZSBzY2hlbWEgdG8KK21hdGNoIHlvdXIgbWFwcGluZ3MuIEl0IGZhaWxzIGlmIGFueSBvZiB5b3VyIG1hcHBpbmdzIGRvbid0IG1hdGNoIHlvdXIgb2JqZWN0Cittb2RlbC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19tYXBwaW5ndG9vbF9idWlsZHNjaGVtYSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBDcmVhdGluZyB0aGUgUmVsYXRpb25hbCBTY2hlbWEgZnJvbSBNYXBwaW5ncworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgTWFnYXppbmUuamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVG8gZHJvcCB0aGUgc2NoZW1hIGZvciBhIHBlcnNpc3RlbnQgY2xhc3MsIHNldCB0aGUgbWFwcGluZyB0b29sJ3MgPGxpdGVyYWw+CitzY2hlbWFBY3Rpb248L2xpdGVyYWw+IHRvIDxsaXRlcmFsPmRyb3A8L2xpdGVyYWw+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sX2NsZWFudXBfdGFibGVzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hpbmcgZW50aXJlIHNjaGVtYSBhbmQgY2xlYW5pbmcgb3V0IHRhYmxlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisJICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19tYXBwaW5ndG9vbF9jbGVhbnVwX3RhYmxlcyI+CisgICAgCSAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAJICAgICAgICAgICAgdGVzdGluZworICAgICAgICAgICAgCSAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgCTxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIAlSZWJ1aWxkIG1hcHBpbmdzIGFuZCBjbGVhbiB0YWJsZXMKKwkgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgCSAgICAgICAgPC9pbmRleHRlcm0+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgLXNhIGFkZCxkZWxldGVUYWJsZUNvbnRlbnRzCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sX2Ryb3BzY2hlbWEiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRHJvcHBpbmcgTWFwcGluZ3MgYW5kIEFzc29jaWF0aW9uIFNjaGVtYQorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgLXNhIGRyb3AgTWFnYXppbmUuamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2RkbF9leGFtcGxlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgR2VuZXJhdGluZyBEREwgU1FMCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGRsX2V4YW1wbGVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyB0b29sCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIERETCBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2RkbF9leGFtcGxlcyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIERETAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB3aXRoIG1hcHBpbmcgdG9vbAorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBleGFtcGxlcyBiZWxvdyBzaG93IGhvdyB0byB1c2UgdGhlIG1hcHBpbmcgdG9vbCB0byBnZW5lcmF0ZSBEREwgU1FMIHNjcmlwdHMsCityYXRoZXIgdGhhbiBtb2RpZnlpbmcgdGhlIGRhdGFiYXNlIGRpcmVjdGx5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkX21hcHBpbmdfZGRsX2Z1bGxfZGRsIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBEREwgZm9yIEN1cnJlbnQgTWFwcGluZ3MKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBleGFtcGxlIHVzZXMgeW91ciBleGlzdGluZyBtYXBwaW5ncyB0byBkZXRlcm1pbmUgdGhlIG5lZWRlZCBzY2hlbWEsIHRoZW4KK3dyaXRlcyB0aGUgU1FMIHRvIGNyZWF0ZSB0aGF0IHNjaGVtYSB0byA8ZmlsZW5hbWU+Y3JlYXRlLnNxbDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCAtc2EgYnVpbGQgLXNxbCBjcmVhdGUuc3FsIE1hZ2F6aW5lLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRfbWFwcGluZ19kZGxfcGFydF9kZGwiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIERETCB0byBVcGRhdGUgRGF0YWJhc2UgZm9yIEN1cnJlbnQgTWFwcGluZ3MKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBleGFtcGxlIHVzZXMgeW91ciBleGlzdGluZyBtYXBwaW5ncyB0byBkZXRlcm1pbmUgdGhlIG5lZWRlZCBzY2hlbWEuIEl0IHRoZW4KK3dyaXRlcyB0aGUgU1FMIHRvIGFkZCBhbnkgbWlzc2luZyB0YWJsZXMgYW5kIGNvbHVtbnMgdG8gdGhlIGN1cnJlbnQgc2NoZW1hIHRvCis8ZmlsZW5hbWU+dXBkYXRlLnNxbDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCAtc3FsIHVwZGF0ZS5zcWwgTWFnYXppbmUuamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21hcHBpbmdfc3luY2giPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFJ1bnRpbWUgRm9yd2FyZCBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19zeW5jaCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGZvcndhcmQgbWFwcGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgcnVudGltZSBtYXBwaW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfc3luY2giPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpYyBydW50aW1lIG1hcHBpbmcKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGNvbmZpZ3VyZSBPcGVuSlBBIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHRoZSBtYXBwaW5nIHRvb2wgYXQgcnVudGltZQordGhyb3VnaCB0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3MiPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3M8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBVc2luZwordGhpcyBwcm9wZXJ0eSBzYXZlcyB5b3UgdGhlIHRyb3VibGUgb2YgcnVubmluZyB0aGUgbWFwcGluZyB0b29sIG1hbnVhbGx5LCBhbmQgaXMKK21lYW50IGZvciB1c2UgZHVyaW5nIHJhcGlkIHRlc3QvZGVidWcgY3ljbGVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitJbiBvcmRlciB0byBlbmFibGUgYXV0b21hdGljIHJ1bnRpbWUgbWFwcGluZywgeW91IG11c3QgZmlyc3QgbGlzdCBhbGwgeW91cgorcGVyc2lzdGVudCBjbGFzc2VzIGFzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfcGNjbGFzc2VzIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIHdpbGwgcnVuIHRoZSBtYXBwaW5nIHRvb2wgb24gdGhlc2UgY2xhc3NlcyB3aGVuIHlvdXIgYXBwbGljYXRpb24gb2J0YWlucworaXRzIGZpcnN0IDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxsaXRlcmFsPm9wZW5qcGEuamRiYy5TeW5jaHJvbml6ZU1hcHBpbmdzPC9saXRlcmFsPiBwcm9wZXJ0eSBpcyBhIHBsdWdpbgorc3RyaW5nIChzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgd2hlcmUgdGhlIGNsYXNzCituYW1lIGlzIHRoZSBtYXBwaW5nIHRvb2wgYWN0aW9uIHRvIGludm9rZSwgYW5kIHRoZSBwcm9wZXJ0aWVzIGFyZSB0aGUKKzxjbGFzc25hbWU+TWFwcGluZ1Rvb2w8L2NsYXNzbmFtZT4gY2xhc3MnIEphdmFCZWFuIHByb3BlcnRpZXMuIFRoZXNlIHByb3BlcnRpZXMKK2NvcnJlc3BvbmQgZ28gdGhlIGxvbmcgdmVyc2lvbnMgb2YgdGhlIHRvb2wncyBjb21tYW5kIGxpbmUgZmxhZ3MuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX21hcHBpbmdfc3luY2hleCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBDb25maWd1cmluZyBSdW50aW1lIEZvcndhcmQgTWFwcGluZworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5qZGJjLlN5bmNocm9uaXplTWFwcGluZ3MiIHZhbHVlPSJidWlsZFNjaGVtYShGb3JlaWduS2V5cz10cnVlKSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBzZXR0aW5nIGFib3ZlIGNvcnJlc3BvbmRzIHRvIHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5NYXBwaW5nVG9vbCAtYSBidWlsZFNjaGVtYSAtZmsgdHJ1ZQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BjX3JldmVyc2UiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBSZXZlcnNlIE1hcHBpbmcKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfcmV2ZXJzZSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICByZXZlcnNlIG1hcHBpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3JldmVyc2UiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgcmV2ZXJzZSBtYXBwaW5nIHRvb2wKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIHJldmVyc2UgbWFwcGluZworICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBpbmNsdWRlcyBhIDxlbXBoYXNpcz5yZXZlcnNlIG1hcHBpbmc8L2VtcGhhc2lzPiB0b29sIGZvciBnZW5lcmF0aW5nCitwZXJzaXN0ZW50IGNsYXNzIGRlZmluaXRpb25zLCBjb21wbGV0ZSB3aXRoIG1ldGFkYXRhLCBmcm9tIGFuIGV4aXN0aW5nIGRhdGFiYXNlCitzY2hlbWEuIFlvdSBkbyBub3QgaGF2ZSB0byB1c2UgdGhlIHJldmVyc2UgbWFwcGluZyB0b29sIHRvIGFjY2VzcyBhbiBleGlzdGluZworc2NoZW1hOyB5b3UgYXJlIGZyZWUgdG8gd3JpdGUgeW91ciBjbGFzc2VzIGFuZCBtYXBwaW5ncyB5b3Vyc2VsZiwgYXMgZGVzY3JpYmVkCitpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19taWRkbGUiLz4uIFRoZSByZXZlcnNlIG1hcHBpbmcgdG9vbCwKK2hvd2V2ZXIsIGNhbiBnaXZlIHlvdSBhbiBleGNlbGxlbnQgc3RhcnRpbmcgcG9pbnQgZnJvbSB3aGljaCB0byBncm93IHlvdXIKK3BlcnNpc3RlbnQgY2xhc3Nlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1RvIHVzZSB0aGUgcmV2ZXJzZSBtYXBwaW5nIHRvb2wsIGZvbGxvdyB0aGUgc3RlcHMgYmVsb3c6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVXNlIHRoZSA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfc2NoZW1hX3NjaGVtYXRvb2wiPiBzY2hlbWEgdG9vbDwvbGluaz4gdG8KK2V4cG9ydCB5b3VyIGN1cnJlbnQgc2NoZW1hIHRvIGFuIFhNTCBzY2hlbWEgZmlsZS4gWW91IGNhbiBza2lwIHRoaXMgc3RlcCBhbmQgdGhlCituZXh0IHN0ZXAgaWYgeW91IHdhbnQgdG8gcnVuIHRoZSByZXZlcnNlIG1hcHBpbmcgdG9vbCBkaXJlY3RseSBhZ2FpbnN0IHRoZQorZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfcmV2ZXJzZV9zY2hlbWFnZW4iPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uIHdpdGggdGhlIFNjaGVtYSBUb29sCisgICAgICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNjaGVtYS5TY2hlbWFUb29sIC1hIHJlZmxlY3QgLWYgc2NoZW1hLnhtbAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorRXhhbWluZSB0aGUgZ2VuZXJhdGVkIHNjaGVtYSBmaWxlLiBKREJDIGRyaXZlcnMgb2Z0ZW4gcHJvdmlkZSBpbmNvbXBsZXRlIG9yCitmYXVsdHkgbWV0YWRhdGEsIGluIHdoaWNoIGNhc2UgdGhlIGZpbGUgd2lsbCBub3QgZXhhY3RseSBtYXRjaCB0aGUgYWN0dWFsCitzY2hlbWEuIEFsdGVyIHRoZSBYTUwgZmlsZSB0byBtYXRjaCB0aGUgdHJ1ZSBzY2hlbWEuIFRoZSBYTUwgZm9ybWF0IGZvciB0aGUKK3NjaGVtYSBmaWxlIGlzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfc2NoZW1hX3htbCIvPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBZnRlciBmaXhpbmcgYW55IGVycm9ycyBpbiB0aGUgc2NoZW1hIGZpbGUsIG1vZGlmeSB0aGUgWE1MIHRvIGluY2x1ZGUgZm9yZWlnbgora2V5cyBiZXR3ZWVuIGFsbCByZWxhdGlvbnMuIFRoZSBzY2hlbWEgdG9vbCB3aWxsIGhhdmUgYXV0b21hdGljYWxseSBkZXRlY3RlZAorZXhpc3RpbmcgZm9yZWlnbiBrZXkgY29uc3RyYWludHM7IG1hbnkgc2NoZW1hcywgaG93ZXZlciwgZG8gbm90IGVtcGxveSBkYXRhYmFzZQorZm9yZWlnbiBrZXlzIGZvciBldmVyeSByZWxhdGlvbi4gQnkgbWFudWFsbHkgYWRkaW5nIGFueSBtaXNzaW5nIGZvcmVpZ24ga2V5cywKK3lvdSB3aWxsIGdpdmUgdGhlIHJldmVyc2UgbWFwcGluZyB0b29sIHRoZSBpbmZvcm1hdGlvbiBpdCBuZWVkcyB0byBnZW5lcmF0ZSB0aGUKK3Byb3BlciByZWxhdGlvbnMgYmV0d2VlbiB0aGUgcGVyc2lzdGVudCBjbGFzc2VzIGl0IGNyZWF0ZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1J1biB0aGUgcmV2ZXJzZSBtYXBwaW5nIHRvb2wgb24gdGhlIGZpbmlzaGVkIHNjaGVtYSBmaWxlLiBJZiB5b3UgZG8gbm90IHN1cHBseQordGhlIHNjaGVtYSBmaWxlIHRvIHJldmVyc2UgbWFwLCB0aGUgdG9vbCB3aWxsIHJ1biBkaXJlY3RseSBhZ2FpbnN0IHRoZSBzY2hlbWEgaW4KK3RoZSBkYXRhYmFzZS4gVGhlIHRvb2wgY2FuIGJlIHJ1biB2aWEgaXRzIEphdmEgY2xhc3MsCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmV2ZXJzZU1hcHBpbmdUb29sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5SZXZlcnNlTWFwcGluZ1Rvb2w8L2NsYXNzbmFtZT48L3VsaW5rPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9wY19yZXZlcnNlX3JldmVyc2VtYXBwaW5ndG9vbCI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoZSBSZXZlcnNlIE1hcHBpbmcgVG9vbAorICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlJldmVyc2VNYXBwaW5nVG9vbCAtcGtnIGNvbS54eXogLWQgfi9zcmMgLWNwIGN1c3RvbWl6ZXIucHJvcGVydGllcyBzY2hlbWEueG1sCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0luIGFkZGl0aW9uIHRvIE9wZW5KUEEncyA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9kZXZ0b29scyI+c3RhbmRhcmQKK2NvbmZpZ3VyYXRpb24gZmxhZ3M8L2xpbms+LCBpbmNsdWRpbmcKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzX2Zvcm1hdCI+Y29kZSBmb3JtYXR0aW5nIG9wdGlvbnM8L2xpbms+LAordGhlIHJldmVyc2UgbWFwcGluZyB0b29sIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgYXJndW1lbnRzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1zY2hlbWFzLy1zICZsdDtzY2hlbWEgYW5kIHRhYmxlIG5hbWVzJmd0OzwvbGl0ZXJhbD46IEEKK2NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHNjaGVtYSBhbmQgdGFibGUgbmFtZXMgdG8gcmV2ZXJzZSBtYXAsIGlmIG5vIFhNTCBzY2hlbWEKK2ZpbGUgaXMgc3VwcGxpZWQuIEVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdCBtdXN0IGZvbGxvdyB0aGUgbmFtaW5nIGNvbnZlbnRpb25zCitmb3IgdGhlIDxsaXRlcmFsPm9wZW5qcGEuamRiYy5TY2hlbWFzPC9saXRlcmFsPiBwcm9wZXJ0eSBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfaW5mb19saXN0Ii8+LiBJbiBmYWN0LCBpZiB0aGlzIGZsYWcgaXMKK29taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgPGxpdGVyYWw+U2NoZW1hczwvbGl0ZXJhbD4gcHJvcGVydHkuIElmCit0aGUgPGxpdGVyYWw+U2NoZW1hczwvbGl0ZXJhbD4gcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGFsbCBzY2hlbWFzIHdpbGwgYmUKK3JldmVyc2UtbWFwcGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1wYWNrYWdlLy1wa2cgJmx0O3BhY2thZ2UgbmFtZSZndDs8L2xpdGVyYWw+OiBUaGUgcGFja2FnZSBuYW1lIG9mIHRoZQorZ2VuZXJhdGVkIGNsYXNzZXMuIElmIG5vIHBhY2thZ2UgbmFtZSBpcyBnaXZlbiwgdGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgbm90Citjb250YWluIHBhY2thZ2UgZGVjbGFyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1kaXJlY3RvcnkvLWQgJmx0O291dHB1dCBkaXJlY3RvcnkmZ3Q7PC9saXRlcmFsPjogQWxsIGdlbmVyYXRlZCBjb2RlCithbmQgbWV0YWRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBkaXJlY3RvcnkgYXQgdGhpcyBwYXRoLiBJZiB0aGUgcGF0aCBkb2VzIG5vdAorbWF0Y2ggdGhlIHBhY2thZ2Ugb2YgYSBjbGFzcywgdGhlIHBhY2thZ2Ugc3RydWN0dXJlIHdpbGwgYmUgY3JlYXRlZCBiZW5lYXRoIHRoaXMKK2RpcmVjdG9yeS4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi11c2VTY2hlbWFOYW1lLy1zbiAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBTZXQgdGhpcyBmbGFnCit0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0byBpbmNsdWRlIHRoZSBzY2hlbWEgYXMgd2VsbCBhcyB0YWJsZSBuYW1lIGluIHRoZQorbmFtZSBvZiBlYWNoIGdlbmVyYXRlZCBjbGFzcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIG11bHRpcGxlCitzY2hlbWFzIHdpdGggc2FtZS1uYW1lZCB0YWJsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXVzZUZvcmVpZ25LZXlOYW1lLy1ma24gJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogU2V0IHRoaXMKK2ZsYWcgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gaWYgeW91IHdvdWxkIGxpa2UgZmllbGQgbmFtZXMgZm9yIHJlbGF0aW9ucyB0bworYmUgYmFzZWQgb24gdGhlIGRhdGFiYXNlIGZvcmVpZ24ga2V5IG5hbWUuIEJ5IGRlZmF1bHQsIHJlbGF0aW9uIGZpZWxkIG5hbWVzIGFyZQorZGVyaXZlZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSByZWxhdGVkIGNsYXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1udWxsYWJsZUFzT2JqZWN0Ly1ubyAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBCeSBkZWZhdWx0LAorYWxsIG5vbi1mb3JlaWduIGtleSBjb2x1bW5zIGFyZSBtYXBwZWQgdG8gcHJpbWl0aXZlcy4gU2V0IHRoaXMgZmxhZyB0byA8bGl0ZXJhbD4KK3RydWU8L2xpdGVyYWw+IHRvIGdlbmVyYXRlIHByaW1pdGl2ZSB3cmFwcGVyIGZpZWxkcyBpbnN0ZWFkIGZvciBjb2x1bW5zIHRoYXQKK2FsbG93IG51bGwgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1ibG9iQXNPYmplY3QvLWJvICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IEJ5IGRlZmF1bHQsIGFsbAorYmluYXJ5IGNvbHVtbnMgYXJlIG1hcHBlZCB0byA8Y2xhc3NuYW1lPmJ5dGVbXTwvY2xhc3NuYW1lPiBmaWVsZHMuIFNldCB0aGlzIGZsYWcKK3RvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IHRvIG1hcCB0aGVtIHRvIDxjbGFzc25hbWU+T2JqZWN0PC9jbGFzc25hbWU+IGZpZWxkcworaW5zdGVhZC4gTm90ZSB0aGF0IHdoZW4gbWFwcGVkIHRoaXMgd2F5LCB0aGUgY29sdW1uIGlzIHByZXN1bWVkIHRvIGNvbnRhaW4gYQorc2VyaWFsaXplZCBKYXZhIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tcHJpbWFyeUtleU9uSm9pbi8tcGtqICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFRoZQorc3RhbmRhcmQgcmV2ZXJzZSBtYXBwaW5nIHRvb2wgYmVoYXZpb3IgaXMgdG8gbWFwIGFsbCB0YWJsZXMgd2l0aCBwcmltYXJ5IGtleXMgdG8KK3BlcnNpc3RlbnQgY2xhc3Nlcy4gSWYgeW91ciBzY2hlbWEgaGFzIHByaW1hcnkga2V5cyBvbiBtYW55LW1hbnkgam9pbiB0YWJsZXMgYXMKK3dlbGwsIHNldCB0aGlzIGZsYWcgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gdG8gYXZvaWQgY3JlYXRpbmcgY2xhc3NlcyBmb3IKK3Rob3NlIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4taW52ZXJzZVJlbGF0aW9ucy8taXIgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogU2V0IHRvCis8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4gdG8gcHJldmVudCB0aGUgY3JlYXRpb24gb2YgaW52ZXJzZSAxLW1hbnkvMS0xIHJlbGF0aW9ucworZm9yIGV2ZXJ5IG1hbnktMS8xLTEgcmVsYXRpb24gZGV0ZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXVzZURhdGFzdG9yZUlkZW50aXR5Ly1kcyAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OiBTZXQgdG8KKzxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IHRvIHVzZSBkYXRhc3RvcmUgaWRlbnRpdHkgZm9yIHRhYmxlcyB0aGF0IGhhdmUgc2luZ2xlCitudW1lcmljIHByaW1hcnkga2V5IGNvbHVtbnMuIFRoZSB0b29sIHR5cGljYWxseSB1c2VzIGFwcGxpY2F0aW9uIGlkZW50aXR5IGZvcgorYWxsIGdlbmVyYXRlZCBjbGFzc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi11c2VCdWlsdGluSWRlbnRpdHlDbGFzcy8tYmljICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFNldAordG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+IHRvIHByZXZlbnQgdGhlIHRvb2wgZnJvbSB1c2luZyBidWlsdC1pbiBhcHBsaWNhdGlvbgoraWRlbnRpdHkgY2xhc3NlcyB3aGVuIHBvc3NpYmxlLiBUaGlzIHdpbGwgZm9yY2UgdGhlIHRvb2wgdG8gdG8gY3JlYXRlIGN1c3RvbQorYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3NlcyBldmVuIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgcHJpbWFyeSBrZXkgY29sdW1uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1pbm5lcklkZW50aXR5Q2xhc3Nlcy8taW5uICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFNldCB0bworPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gdG8gaGF2ZSBhbnkgZ2VuZXJhdGVkIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzZXMgYmUKK2NyZWF0ZWQgYXMgc3RhdGljIGlubmVyIGNsYXNzZXMgd2l0aGluIHRoZSBwZXJzaXN0ZW50IGNsYXNzZXMuIERlZmF1bHRzIHRvCis8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWlkZW50aXR5Q2xhc3NTdWZmaXgvLWlzICZsdDtzdWZmaXgmZ3Q7PC9saXRlcmFsPjogU3VmZml4IHRvIGFwcGVuZCB0bworY2xhc3MgbmFtZXMgdG8gZm9ybSBhcHBsaWNhdGlvbiBpZGVudGl0eSBjbGFzcyBuYW1lcywgb3IgZm9yIGlubmVyIGlkZW50aXR5CitjbGFzc2VzLCB0aGUgaW5uZXIgY2xhc3MgbmFtZS4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+SWQ8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi10eXBlTWFwLy10eXAgJmx0O3R5cGUgbWFwcGluZyZndDs8L2xpdGVyYWw+OiBBIHN0cmluZyB0aGF0IHNwZWNpZmllcwordGhlIGRlZmF1bHQgSmF2YSBjbGFzc2VzIHRvIGdlbmVyYXRlIGZvciBlYWNoIFNRTCB0eXBlIHRoYXQgaXMgc2VlbiBpbiB0aGUKK3NjaGVtYS4gVGhlIGZvcm1hdCBpcyA8bGl0ZXJhbD4gU1FMVFlQRTE9SmF2YUNsYXNzMSxTUUxUWVBFMj1KYXZhQ2xhc3MyCis8L2xpdGVyYWw+LiBUaGUgU1FMIHR5cGUgbmFtZSBmaXJzdCBsb29rcyBmb3IgYSBjdXN0b21pemF0aW9uIGJhc2VkIG9uIDxsaXRlcmFsPgorU1FMVFlQRShTSVpFLFBSRUNJU0lPTik8L2xpdGVyYWw+LCB0aGVuIDxsaXRlcmFsPlNRTFRZUEUoU0laRSk8L2xpdGVyYWw+LCB0aGVuCis8bGl0ZXJhbD5TUUxUWVBFKFNJWkUsUFJFQ0lTSU9OKTwvbGl0ZXJhbD4uIFNvIGlmIGEgY29sdW1uIHdob3NlIHR5cGUgbmFtZSBpcworPGxpdGVyYWw+Q0hBUjwvbGl0ZXJhbD4gaXMgZm91bmQsIGl0IHdpbGwgZmlyc3QgbG9vayBmb3IgdGhlIDxsaXRlcmFsPgorQ0hBUig1MCwwKTwvbGl0ZXJhbD4gdHlwZSBuYW1lIHNwZWNpZmljYXRpb24sIHRoZW4gaXQgd2lsbCBsb29rIGZvciA8bGl0ZXJhbD4KK0NIQVIoNTApPC9saXRlcmFsPiwgYW5kIGZpbmFsbHkgaXQgd2lsbCBqdXN0IGxvb2sgZm9yIDxsaXRlcmFsPkNIQVI8L2xpdGVyYWw+LgorRm9yIGV4YW1wbGUsIHRvIGdlbmVyYXRlIGEgY2hhciBhcnJheSBmb3IgZXZlcnkgPGxpdGVyYWw+Q0hBUjwvbGl0ZXJhbD4gY29sdW1uCit3aG9zZSBzaXplIGlzIGV4YWN0bHkgNTAsIGFuZCB0byBnZW5lcmF0ZSBhIDxsaXRlcmFsPnNob3J0PC9saXRlcmFsPiBmb3IgZXZlcnkKK3R5cGUgbmFtZSBvZiA8bGl0ZXJhbD5JTlRFR0VSPC9saXRlcmFsPiwgeW91IG1pZ2h0IHNwZWNpZnk6IDxsaXRlcmFsPgorQ0hBUig1MCk9Y2hhcltdLElOVEVHRVI9c2hvcnQ8L2xpdGVyYWw+LiBOb3RlIHRoYXQgc2luY2UgdmFyaW91cyBkYXRhYmFzZXMKK3JlcG9ydCBkaWZmZXJlbnQgdHlwZSBuYW1lcyBkaWZmZXJlbnRseSwgb25lIGRhdGFiYXNlJ3MgdHlwZSBuYW1lIHNwZWNpZmljYXRpb24KK21pZ2h0IG5vdCB3b3JrIGZvciBhbm90aGVyIGRhdGFiYXNlLiBFbmFibGUgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IGxldmVsCitsb2dnaW5nIG9uIHRoZSA8bGl0ZXJhbD5NZXRhRGF0YTwvbGl0ZXJhbD4gY2hhbm5lbCB0byB0cmFjayB3aGljaCB0eXBlIG5hbWVzCitPcGVuSlBBIGlzIGV4YW1pbmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tY3VzdG9taXplckNsYXNzLy1jYyAmbHQ7Y2xhc3MgbmFtZSZndDs8L2xpdGVyYWw+OiBUaGUgZnVsbCBjbGFzcyBuYW1lCitvZiBhCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmV2ZXJzZUN1c3RvbWl6ZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuUmV2ZXJzZUN1c3RvbWl6ZXI8L2NsYXNzbmFtZT48L3VsaW5rPgorY3VzdG9taXphdGlvbiBwbHVnaW4uIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHJldmVyc2UgY3VzdG9taXplciBvZiB5b3VyIG93biwKK3RoZSBzeXN0ZW0gZGVmYXVsdHMgdG8gYQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1Byb3BlcnRpZXNSZXZlcnNlQ3VzdG9taXplci5odG1sIj4KKzxjbGFzc25hbWU+UHJvcGVydGllc1JldmVyc2VDdXN0b21pemVyPC9jbGFzc25hbWU+PC91bGluaz4uIFRoaXMgY3VzdG9taXplcgorYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHNpbXBsZSBjdXN0b21pemF0aW9uIG9wdGlvbnMgaW4gdGhlIHByb3BlcnRpZXMgZmlsZSBnaXZlbgord2l0aCB0aGUgPGxpdGVyYWw+LWN1c3RvbWl6ZXJQcm9wZXJ0aWVzPC9saXRlcmFsPiBmbGFnIGJlbG93LiBXZSBwcmVzZW50IHRoZQorYXZhaWxhYmxlIHByb3BlcnR5IGtleXMgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3BjX3JldmVyc2VfY3VzdG9tIj4gCitiZWxvdzwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWN1c3RvbWl6ZXJQcm9wZXJ0aWVzLy1jcCAmbHQ7cHJvcGVydGllcyBmaWxlIG9yIHJlc291cmNlJmd0OzwvbGl0ZXJhbD4KKzogVGhlIHBhdGggb3IgcmVzb3VyY2UgbmFtZSBvZiBhIHByb3BlcnRpZXMgZmlsZSB0byBwYXNzIHRvIHRoZSByZXZlcnNlCitjdXN0b21pemVyIG9uIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1jdXN0b21pemVyLi8tYy4mbHQ7cHJvcGVydHkgbmFtZSZndDsgJmx0O3Byb3BlcnR5IHZhbHVlJmd0OzwvbGl0ZXJhbD4KKzogVGhlIGdpdmVuIHByb3BlcnR5IG5hbWUgd2lsbCBiZSBtYXRjaGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBiZWFuCitwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHJldmVyc2UgY3VzdG9taXplciwgYW5kIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitSdW5uaW5nIHRoZSB0b29sIHdpbGwgZ2VuZXJhdGUgPGZpbGVuYW1lPi5qYXZhPC9maWxlbmFtZT4gZmlsZXMgZm9yIGVhY2gKK2dlbmVyYXRlZCBjbGFzcyAoYW5kIGl0cyBhcHBsaWNhdGlvbiBpZGVudGl0eSBjbGFzcywgaWYgYXBwbGljYWJsZSksIGFsb25nIHdpdGgKK2FuIDxmaWxlbmFtZT5vcm0ueG1sPC9maWxlbmFtZT4gZmlsZSBjb250YWluaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBlcnNpc3RlbmNlIAorbWV0YWRhdGEuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0V4YW1pbmUgdGhlIGdlbmVyYXRlZCBjbGFzcywgbWV0YWRhdGEsIGFuZCBtYXBwaW5nIGluZm9ybWF0aW9uLCBhbmQgbW9kaWZ5IGl0IGFzCituZWNlc3NhcnkuIFJlbWVtYmVyIHRoYXQgdGhlIHJldmVyc2UgbWFwcGluZyB0b29sIG9ubHkgcHJvdmlkZXMgYSBzdGFydGluZworcG9pbnQsIGFuZCB5b3UgYXJlIGZyZWUgdG8gbWFrZSB3aGF0ZXZlciBtb2RpZmljYXRpb25zIHlvdSBsaWtlIHRvIHRoZSBjb2RlIGl0CitnZW5lcmF0ZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorQWZ0ZXIgeW91IGFyZSBzYXRpc2ZpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIHRoZWlyIG1hcHBpbmdzLCB5b3UKK3Nob3VsZCBmaXJzdCBjb21waWxlIHRoZSBjbGFzc2VzIHdpdGggPGxpdGVyYWw+amF2YWM8L2xpdGVyYWw+LCA8bGl0ZXJhbD4KK2ppa2VzPC9saXRlcmFsPiwgb3IgeW91ciBmYXZvcml0ZSBKYXZhIGNvbXBpbGVyLiBNYWtlIHN1cmUgdGhlIGNsYXNzZXMgYXJlIAorbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIDxsaXRlcmFsPi1wYWNrYWdlPC9saXRlcmFsPiBmbGFnIAoreW91IGdhdmUgdGhlIHJldmVyc2UgbWFwcGluZyB0b29sLiAgTmV4dCwgbW92ZSB0aGUgZ2VuZXJhdGVkIDxmaWxlbmFtZT4KK29ybS54bWw8L2ZpbGVuYW1lPiBmaWxlIHRvIGEgPGZpbGVuYW1lPk1FVEEtSU5GPC9maWxlbmFtZT4gZGlyZWN0b3J5IHdpdGhpbiBhCitkaXJlY3RvcnkgaW4geW91ciBjbGFzc3BhdGguICBGaW5hbGx5LCBlbmhhbmNlIHRoZSBjbGFzc2VzCitpZiBuZWNlc3NhcnkgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSIvPiApLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgIDxwYXJhPgorWW91ciBwZXJzaXN0ZW50IGNsYXNzZXMgYXJlIG5vdyByZWFkeSB0byBhY2Nlc3MgeW91ciBleGlzdGluZyBzY2hlbWEuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19yZXZlcnNlX2N1c3RvbSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ3VzdG9taXppbmcgUmV2ZXJzZSBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlJldmVyc2VDdXN0b21pemVyPC9jbGFzc25hbWU+IHBsdWdpbgoraW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gY3VzdG9temUgdGhlIHJldmVyc2UgbWFwcGluZyBwcm9jZXNzLiBTZWUgdGhlIGNsYXNzCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvUmV2ZXJzZUN1c3RvbWl6ZXIuaHRtbCI+CitKYXZhZG9jPC91bGluaz4gZm9yIGRldGFpbHMgb24gdGhlIGhvb2tzIHRoYXQgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMuIFNwZWNpZnkKK3RoZSBjb25jcmV0ZSBwbHVnaW4gaW1wbGVtZW50YXRpb24gdG8gdXNlIHdpdGggdGhlIDxsaXRlcmFsPgorLWN1c3RvbWl6ZXJDbGFzcy8tY2M8L2xpdGVyYWw+IGNvbW1hbmQtbGluZSBmbGFnLCBkZXNjcmliZWQgaW4gdGhlIHByZWNlZGluZworc2VjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorQnkgZGVmYXVsdCwgdGhlIHJldmVyc2UgbWFwcGluZyB0b29sIHVzZXMgYQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1Byb3BlcnRpZXNSZXZlcnNlQ3VzdG9taXplci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5Qcm9wZXJ0aWVzUmV2ZXJzZUN1c3RvbWl6ZXI8L2NsYXNzbmFtZT4KKzwvdWxpbms+LiBUaGlzIGN1c3RvbWl6ZXIgYWxsb3dzIHlvdSB0byBwZXJmb3JtIHJlbGF0aXZlbHkgc2ltcGxlCitjdXN0b21pemF0aW9ucyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbmFtZWQgd2l0aCB0aGUgPGxpdGVyYWw+CistY3VzdG9taXplclByb3BlcnRpZXM8L2xpdGVyYWw+IHRvb2wgZmxhZy4gVGhlIGN1c3RvbWl6ZXIgcmVjb2duaXplcyB0aGUKK2ZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Jmx0O3RhYmxlIG5hbWUmZ3Q7LnRhYmxlLXR5cGUgJmx0O3R5cGUmZ3Q7PC9saXRlcmFsPjogT3ZlcnJpZGUgdGhlCitkZWZhdWx0IHR5cGUgb2YgdGhlIHRhYmxlIHdpdGggbmFtZSA8bGl0ZXJhbD4mbHQ7dGFibGUgbmFtZSZndDs8L2xpdGVyYWw+LgorTGVnYWwgdmFsdWVzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+YmFzZTwvbGl0ZXJhbD46IFByaW1hcnkgdGFibGUgZm9yIGEgYmFzZSBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2Vjb25kYXJ5PC9saXRlcmFsPjogU2Vjb25kYXJ5IHRhYmxlIGZvciBhIGNsYXNzLiBUaGUgdGFibGUgbXVzdCBoYXZlCithIGZvcmVpZ24ga2V5IGpvaW5pbmcgdG8gYSBjbGFzcyB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c2Vjb25kYXJ5LW91dGVyPC9saXRlcmFsPjogT3V0ZXItam9pbmVkIHNlY29uZGFyeSB0YWJsZSBmb3IgYSBjbGFzcy4KK1RoZSB0YWJsZSBtdXN0IGhhdmUgYSBmb3JlaWduIGtleSBqb2luaW5nIHRvIGEgY2xhc3MgdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmFzc29jaWF0aW9uPC9saXRlcmFsPjogQXNzb2NpYXRpb24gdGFibGUuIFRoZSB0YWJsZSBtdXN0IGhhdmUgdHdvCitmb3JlaWduIGtleXMgdG8gY2xhc3MgdGFibGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5jb2xsZWN0aW9uPC9saXRlcmFsPjogQ29sbGVjdGlvbiB0YWJsZS4gVGhlIHRhYmxlIG11c3QgaGF2ZSBvbmUKK2ZvcmVpZ24ga2V5IHRvIGEgY2xhc3MgdGFibGUgYW5kIG9uZSBkYXRhIGNvbHVtbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+c3ViY2xhc3M8L2xpdGVyYWw+OiBBIGpvaW5lZCBzdWJjbGFzcyB0YWJsZS4gVGhlIHRhYmxlIG11c3QgaGF2ZSBhCitmb3JlaWduIGtleSB0byB0aGUgc3VwZXJjbGFzcycgdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPm5vbmU8L2xpdGVyYWw+OiBUaGUgdGFibGUgc2hvdWxkIG5vdCBiZSByZXZlcnNlLW1hcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4mbHQ7Y2xhc3MgbmFtZSZndDsucmVuYW1lICZsdDtuZXcgY2xhc3MgbmFtZSZndDs8L2xpdGVyYWw+OiBPdmVycmlkZQordGhlIGdpdmVuIHRvb2wtZ2VuZXJhdGVkIG5hbWUgPGxpdGVyYWw+Jmx0O2NsYXNzIG5hbWUmZ3Q7PC9saXRlcmFsPiB3aXRoIGEgbmV3Cit2YWx1ZS4gVXNlIGZ1bGwgY2xhc3MgbmFtZXMsIGluY2x1ZGluZyBwYWNrYWdlLiBZb3UgYXJlIGZyZWUgdG8gcmVuYW1lIGEgY2xhc3MKK3RvIGEgbmV3IHBhY2thZ2UuIFNwZWNpZnkgYSB2YWx1ZSBvZiA8bGl0ZXJhbD5ub25lPC9saXRlcmFsPiB0byByZWplY3QgdGhlIGNsYXNzCithbmQgbGVhdmUgdGhlIGNvcnJlc3BvbmRpbmcgdGFibGUgdW5tYXBwZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4mbHQ7dGFibGUgbmFtZSZndDsuY2xhc3MtbmFtZSAmbHQ7bmV3IGNsYXNzIG5hbWUmZ3Q7PC9saXRlcmFsPjogQXNzaWduCit0aGUgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gdGhlIHR5cGUgY3JlYXRlZCBmcm9tIHRoZSB0YWJsZSB3aXRoCituYW1lIDxsaXRlcmFsPiZsdDt0YWJsZSBuYW1lJmd0OzwvbGl0ZXJhbD4uIFVzZSBhIHZhbHVlIG9mIDxsaXRlcmFsPm5vbmUKKzwvbGl0ZXJhbD4gdG8gcHJldmVudCByZXZlcnNlIG1hcHBpbmcgdGhpcyB0YWJsZS4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBpbgorcGxhY2Ugb2YgdGhlIDxsaXRlcmFsPnJlbmFtZTwvbGl0ZXJhbD4gcHJvcGVydHkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4mbHQ7Y2xhc3MgbmFtZSZndDsuaWRlbnRpdHkgJmx0O2RhdGFzdG9yZSB8IGJ1aWx0aW4gfCBpZGVudGl0eSBjbGFzcworbmFtZSZndDs8L2xpdGVyYWw+OiBTZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD5kYXRhc3RvcmU8L2xpdGVyYWw+IHRvIHVzZQorZGF0YXN0b3JlIGlkZW50aXR5IGZvciB0aGUgY2xhc3MgPGxpdGVyYWw+Jmx0O2NsYXNzIG5hbWUmZ3Q7PC9saXRlcmFsPiwKKzxsaXRlcmFsPmJ1aWx0aW48L2xpdGVyYWw+IHRvIHVzZSBhIGJ1aWx0LWluIGlkZW50aXR5IGNsYXNzLCBvciB0aGUgZGVzaXJlZAorYXBwbGljYXRpb24gaWRlbnRpdHkgY2xhc3MgbmFtZS4gR2l2ZSBmdWxsIGNsYXNzIG5hbWVzLCBpbmNsdWRpbmcgcGFja2FnZS4gWW91CithcmUgZnJlZSB0byBjaGFuZ2UgdGhlIHBhY2thZ2Ugb2YgdGhlIGlkZW50aXR5IGNsYXNzIHRoaXMgd2F5LiBJZiB0aGUgcGVyc2lzdGVudAorY2xhc3MgaGFzIGJlZW4gcmVuYW1lZCwgdXNlIHRoZSBuZXcgY2xhc3MgbmFtZSBmb3IgdGhpcyBwcm9wZXJ0eSBrZXkuIFJlbWVtYmVyCit0aGF0IGRhdGFzdG9yZSBpZGVudGl0eSByZXF1aXJlcyBhIHRhYmxlIHdpdGggYSBzaW5nbGUgbnVtZXJpYyBwcmltYXJ5IGtleQorY29sdW1uLCBhbmQgYnVpbHQtaW4gaWRlbnRpdHkgcmVxdWlyZXMgYSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIGFueSB0eXBlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Jmx0O2NsYXNzIG5hbWUmZ3Q7LiZsdDtmaWVsZCBuYW1lJmd0Oy5yZW5hbWUgJmx0O25ldyBmaWVsZCBuYW1lJmd0OworPC9saXRlcmFsPjogT3ZlcnJpZGUgdGhlIHRvb2wtZ2VuZXJhdGVkIDxsaXRlcmFsPiZsdDtmaWVsZCBuYW1lJmd0OzwvbGl0ZXJhbD4gaW4KK2NsYXNzIDxsaXRlcmFsPiZsdDtjbGFzcyBuYW1lJmd0OzwvbGl0ZXJhbD4gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVXNlIHRoZSBmaWVsZAorb3duZXIncyBmdWxsIGNsYXNzIG5hbWUgaW4gdGhlIHByb3BlcnR5IGtleS4gSWYgdGhlIGZpZWxkIG93bmVyJ3MgY2xhc3Mgd2FzCityZW5hbWVkLCB1c2UgdGhlIG5ldyBjbGFzcyBuYW1lLiBUaGUgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIHRoZSBuZXcgZmllbGQKK25hbWUsIHdpdGhvdXQgdGhlIHByZWNlZGluZyBjbGFzcyBuYW1lLiBVc2UgYSB2YWx1ZSBvZiA8bGl0ZXJhbD5ub25lPC9saXRlcmFsPgordG8gcmVqZWN0IHRoZSBnZW5lcmF0ZWQgbWFwcGluZyBhbmQgcmVtb3ZlIHRoZSBmaWVsZCBmcm9tIHRoZSBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPiZsdDt0YWJsZSBuYW1lJmd0Oy4mbHQ7Y29sdW1uIG5hbWUmZ3Q7LmZpZWxkLW5hbWUgJmx0O25ldyBmaWVsZAorbmFtZSZndDs8L2xpdGVyYWw+OiBTZXQgdGhlIGdlbmVyYXRlZCBmaWVsZCBuYW1lIGZvciB0aGUgPGxpdGVyYWw+Jmx0O3RhYmxlCituYW1lJmd0OzwvbGl0ZXJhbD4gdGFibGUncyA8bGl0ZXJhbD4mbHQ7Y29sdW1uIG5hbWUmZ3Q7PC9saXRlcmFsPiBjb2x1bW4uIElmCit0aGlzIGlzIGEgbXVsdGktY29sdW1uIG1hcHBpbmcsIGFueSBvZiB0aGUgY29sdW1ucyBjYW4gYmUgdXNlZC4gVXNlIGEgdmFsdWUgb2YKKzxsaXRlcmFsPm5vbmU8L2xpdGVyYWw+IHRvIHByZXZlbnQgdGhlIGNvbHVtbiBhbmQgaXRzIGFzc29jaWF0ZWQgY29sdW1ucyBmcm9tCitiZWluZyByZXZlcnNlLW1hcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPiZsdDtjbGFzcyBuYW1lJmd0Oy4mbHQ7ZmllbGQgbmFtZSZndDsudHlwZSAmbHQ7ZmllbGQgdHlwZSZndDs8L2xpdGVyYWw+Cis6IFRoZSB0eXBlIHRvIGdpdmUgdGhlIG5hbWVkIGZpZWxkLiBVc2UgZnVsbCBjbGFzcyBuYW1lcy4gSWYgdGhlIGZpZWxkIG9yIHRoZQorZmllbGQncyBvd25lciBjbGFzcyBoYXMgYmVlbiByZW5hbWVkLCB1c2UgdGhlIG5ldyBuYW1lLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Jmx0O2NsYXNzIG5hbWUmZ3Q7LiZsdDtmaWVsZCBuYW1lJmd0Oy52YWx1ZTwvbGl0ZXJhbD46IFRoZSBpbml0aWFsCit2YWx1ZSBmb3IgdGhlIG5hbWVkIGZpZWxkLiBUaGUgZ2l2ZW4gc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGFzLWlzIGluIHRoZQorZ2VuZXJhdGVkIEphdmEgY29kZSwgc28gYmUgc3VyZSBpdCBpcyB2YWxpZCBKYXZhLiBJZiB0aGUgZmllbGQgb3IgdGhlIGZpZWxkJ3MKK293bmVyIGNsYXNzIGhhcyBiZWVuIHJlbmFtZWQsIHVzZSB0aGUgbmV3IG5hbWUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0FsbCBwcm9wZXJ0eSBrZXlzIGFyZSBvcHRpb25hbDsgaWYgbm90IHNwZWNpZmllZCwgdGhlIGN1c3RvbWl6ZXIga2VlcHMgdGhlCitkZWZhdWx0IHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgcmV2ZXJzZSBtYXBwaW5nIHRvb2wuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3BjX3JldmVyc2VfY3VzdG9tX2V4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEN1c3RvbWl6aW5nIFJldmVyc2UgTWFwcGluZyB3aXRoIFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLlJldmVyc2VNYXBwaW5nVG9vbCAtcGtnIGNvbS54eXogLWNwIGN1c3RvbS5wcm9wZXJ0aWVzIHNjaGVtYS54bWwKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitFeGFtcGxlIDxmaWxlbmFtZT5jdXN0b20ucHJvcGVydGllczwvZmlsZW5hbWU+OgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2NvbS54eXouVGJsTWFnYXppbmUucmVuYW1lOiAgICAgICAgICAgICBjb20ueHl6Lk1hZ2F6aW5lCitjb20ueHl6LlRibEFydGljbGUucmVuYW1lOiAgICAgICAgICAgICAgY29tLnh5ei5BcnRpY2xlCitjb20ueHl6LlRibFB1YkNvbXBhbnkucmVuYW1lOiAgICAgICAgICAgY29tLnh5ei5wdWIuQ29tcGFueQorY29tLnh5ei5UYmxTeXNJbmZvLnJlbmFtZTogICAgICAgICAgICAgIG5vbmUKKworY29tLnh5ei5NYWdhemluZS5hbGxBcnRpY2xlcy5yZW5hbWU6ICAgIGFydGljbGVzCitjb20ueHl6Lk1hZ2F6aW5lLmFydGljbGVzLnR5cGU6ICAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24KK2NvbS54eXouTWFnYXppbmUuYXJ0aWNsZXMudmFsdWU6ICAgICAgICBuZXcgVHJlZVNldCgpCitjb20ueHl6Lk1hZ2F6aW5lLmlkZW50aXR5OiAgICAgICAgICAgICAgZGF0YXN0b3JlCisKK2NvbS54eXoucHViLkNvbXBhbnkuaWRlbnRpdHk6ICAgICAgICAgICBjb20ueHl6LnB1Yi5Db21wYW55SWQKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX21pZGRsZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE1lZXQtaW4tdGhlLU1pZGRsZSBNYXBwaW5nCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3JldmVyc2UiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgbWVldC1pbi10aGUtbWlkZGxlIG1hcHBpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3JldmVyc2UiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgcmV2ZXJzZSBtYXBwaW5nIHRvb2wKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIHJldmVyc2UgbWFwcGluZworICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbWVldC1pbi10aGUtbWlkZGxlIG1hcHBpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICBtZWV0LWluLXRoZS1taWRkbGUgbWFwcGluZworICAgICAgICAgICAgPC9zZWU+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0luIHRoZSA8ZW1waGFzaXM+bWVldC1pbi10aGUtbWlkZGxlPC9lbXBoYXNpcz4KK21hcHBpbmcgYXBwcm9hY2gsIHlvdSBjb250cm9sIGJvdGggdGhlIHJlbGF0aW9uYWwgbW9kZWwgYW5kIHRoZSBvYmplY3QgbW9kZWwuIEl0CitpcyB1cCB0byB5b3UgdG8gZGVmaW5lIHRoZSBtYXBwaW5ncyBiZXR3ZWVuIHRoZXNlIG1vZGVscy4gIFRoZSBtYXBwaW5nCit0b29sJ3MgPGxpdGVyYWw+dmFsaWRhdGU8L2xpdGVyYWw+IGFjdGlvbiBpcyB1c2VmdWwgdG8gbWVldC1pbi10aGUtbWlkZGxlCittYXBwZXJzLiBUaGlzIGFjdGlvbiB2ZXJpZmllcyB0aGF0IHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIGNsYXNzIG1hdGNoZXMgCit0aGUgY2xhc3MgZGVmaW5pdGlvbiBhbmQgdGhlIGV4aXN0aW5nIHNjaGVtYS4gSXQgdGhyb3dzIGFuIGluZm9ybWF0aXZlIGV4Y2VwdGlvbgord2hlbiB5b3VyIG1hcHBpbmdzIGFyZSBpbmNvcnJlY3QuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sX3ZhbGlkYXRlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBWYWxpZGF0aW5nIE1hcHBpbmdzCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdUb29sIC1hIHZhbGlkYXRlIE1hZ2F6aW5lLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+YnVpbGRTY2hlbWE8L2xpdGVyYWw+IGFjdGlvbiB3ZSBkaXNjdXNzZWQgaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX21hcHBpbmd0b29sIi8+IGlzIGFsc28gc29tZXdoYXQgdXNlZnVsCitkdXJpbmcgbWVldC1pbi10aGUtbWlkZGxlIG1hcHBpbmcuIFVubGlrZSB0aGUgPGxpdGVyYWw+dmFsaWRhdGU8L2xpdGVyYWw+CithY3Rpb24sIHdoaWNoIHRocm93cyBhbiBleGNlcHRpb24gaWYgeW91ciBtYXBwaW5nIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlCitleGlzdGluZyBzY2hlbWEsIHRoZSA8bGl0ZXJhbD5idWlsZFNjaGVtYTwvbGl0ZXJhbD4gYWN0aW9uIGFzc3VtZXMgeW91ciBtYXBwaW5nCitkYXRhIGlzIGNvcnJlY3QsIGFuZCBtb2RpZmllcyB0aGUgc2NoZW1hIHRvIG1hdGNoIHlvdXIgbWFwcGluZ3MuIFRoaXMgbGV0cyB5b3UKK21vZGlmeSB5b3VyIG1hcHBpbmcgZGF0YSBtYW51YWxseSwgYnV0IHNhdmVzIHlvdSB0aGUgaGFzc2xlIG9mIHVzaW5nIHlvdXIKK2RhdGFiYXNlJ3MgdG9vbHMgdG8gYnJpbmcgdGhlIHNjaGVtYSB1cC10by1kYXRlLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19kZWZhdWx0cyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE1hcHBpbmcgRGVmYXVsdHMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19kZWZhdWx0cyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBNYXBwaW5nRGVmYXVsdHMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGRlZmF1bHRzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgTWFwcGluZ0RlZmF1bHRzCisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIHByZXZpb3VzIHNlY3Rpb25zIHNob3dlZCBob3cgdG8gdXNlIHRoZSBtYXBwaW5nIHRvb2wgdG8gZ2VuZXJhdGUgZGVmYXVsdAorbWFwcGluZ3MuIEJ1dCBob3cgZG9lcyB0aGUgbWFwcGluZyB0b29sIGtub3cgd2hhdCBtYXBwaW5ncyB0byBnZW5lcmF0ZT8gVGhlCithbnN3ZXIgbGllcyBpbiB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nRGVmYXVsdHMuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ0RlZmF1bHRzPC9jbGFzc25hbWU+PC91bGluaz4KK2ludGVyZmFjZS4gT3BlbkpQQSB1c2VzIGFuIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIHRvIGRlY2lkZSBob3cgdG8gbmFtZQordGFibGVzIGFuZCBjb2x1bW5zLCB3aGVyZSB0byBwdXQgZm9yZWlnbiBrZXlzLCBhbmQgZ2VuZXJhbGx5IGhvdyB0byBjcmVhdGUgYQorc2NoZW1hIHRoYXQgbWF0Y2hlcyB5b3VyIG9iamVjdCBtb2RlbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW1wb3J0YW50PgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIHJlbGllcyBvbiBmb3JlaWduIGtleSBjb25zdHJhaW50IGluZm9ybWF0aW9uIGF0IHJ1bnRpbWUgdG8gb3JkZXIgU1FMCithcHByb3ByaWF0ZWx5LiBCZSBzdXJlIHRvIHNldCB5b3VyIG1hcHBpbmcgZGVmYXVsdHMgdG8gcmVmbGVjdCB5b3VyIGV4aXN0aW5nCitkYXRhYmFzZSBjb25zdHJhaW50cywgc2V0IHRoZSBzY2hlbWEgZmFjdG9yeSB0byByZWZsZWN0IG9uIHRoZSBkYXRhYmFzZSBmb3IgCitjb25zdHJhaW50IGluZm9ybWF0aW9uIChzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3NjaGVtYV9pbmZvX2ZhY3RvcnkiLz4pLCAKK29yIHVzZSBleHBsaWNpdCBmb3JlaWduIGtleSBtYXBwaW5ncyBhcyBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9mayIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9pbXBvcnRhbnQ+CisgICAgICAgIDxwYXJhPgorVGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5NYXBwaW5nRGVmYXVsdHMiPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLk1hcHBpbmdEZWZhdWx0czwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgY29udHJvbHMKK3RoZSA8Y2xhc3NuYW1lPk1hcHBpbmdEZWZhdWx0czwvY2xhc3NuYW1lPiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gaW4gdXNlLiBUaGlzCitpcyBhIHBsdWdpbiBwcm9wZXJ0eSAoc2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pLCBzbworeW91IGNhbiBzdWJzdGl0dXRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9yIGNvbmZpZ3VyZSB0aGUgZXhpc3Rpbmcgb25lcy4KK09wZW5KUEEgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmpwYTwvbGl0ZXJhbD46IFByb3ZpZGVzIGRlZmF1bHRzIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgSlBBIHN0YW5kYXJkLgorVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1BlcnNpc3RlbmNlTWFwcGluZ0RlZmF1bHRzLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5QZXJzaXN0ZW5jZU1hcHBpbmdEZWZhdWx0cworPC9jbGFzc25hbWU+PC91bGluaz4gY2xhc3MuIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgPGNsYXNzbmFtZT4KK01hcHBpbmdEZWZhdWx0c0ltcGw8L2NsYXNzbmFtZT4gY2xhc3MgZGVzY3JpYmVkIGJlbG93LCBzbyBpdCBoYXMgYWxsIHRoZSBzYW1lCitwcm9wZXJ0aWVzICh0aG91Z2ggd2l0aCBkaWZmZXJlbnQgZGVmYXVsdCB2YWx1ZXMpLCBhcyB3ZWxsIGFzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlByZXBlbmRGaWVsZE5hbWVUb0pvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uczwvbGl0ZXJhbD46IFdoZXRoZXIgdG8KK3ByZXBlbmQgdGhlIG93bmluZyBmaWVsZCBuYW1lIHRvIHRoZSBuYW1lcyBvZiBpbnZlcnNlIGpvaW4gY29sdW1ucyBpbiBqb2luIAordGFibGVzLiAgRGVmYXVsdHMgdG8gdHJ1ZSBwZXIgdGhlIEpQQSBzcGVjaWZpY2F0aW9uLiAgU2V0IHRvIGZhbHNlIGZvcgorY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIE9wZW5KUEEgdmVyc2lvbnMgd2hpY2ggZGlkIG5vdCBwcmVwZW5kIHRoZSBmaWVsZCBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmRlZmF1bHQ8L2xpdGVyYWw+OiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9NYXBwaW5nRGVmYXVsdHNJbXBsLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdEZWZhdWx0c0ltcGw8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBoaWdobHkgY29uZmlndXJhYmxlLiBJdCBoYXMgdGhlIGZvbGxvd2luZworcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5EZWZhdWx0TWlzc2luZ0luZm88L2xpdGVyYWw+OiBXaGV0aGVyIHRvIGRlZmF1bHQgbWlzc2luZyBjb2x1bW4gYW5kCit0YWJsZSBuYW1lcyByYXRoZXIgdGhhbiB0aHJvdyBhbiBleGNlcHRpb24uIElmIHNldCB0byBmYWxzZSwgZnVsbCBleHBsaWNpdAorbWFwcGluZ3MgYXJlIHJlcXVpcmVkIGF0IHJ1bnRpbWUgYW5kIHdoZW4gdXNpbmcgbWFwcGluZyB0b29sIGFjdGlvbnMgbGlrZQorPGxpdGVyYWw+YnVpbGRTY2hlbWE8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD52YWxpZGF0ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QmFzZUNsYXNzU3RyYXRlZ3k8L2xpdGVyYWw+OiBUaGUgZGVmYXVsdCBtYXBwaW5nIHN0cmF0ZWd5IGZvciBiYXNlCitjbGFzc2VzLiBZb3UgY2FuIHNwZWNpZnkgYSBidWlsdC1pbiBzdHJhdGVneSBhbGlhcyBvciB0aGUgZnVsbCBjbGFzcyBuYW1lIG9mIGEKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV9jbGFzcyI+Y3VzdG9tIGNsYXNzIHN0cmF0ZWd5PC9saW5rPi4KK1lvdSBjYW4gYWxzbyB1c2UgT3BlbkpQQSdzIHBsdWdpbiBmb3JtYXQgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlCitzdHJhdGVneSBpbnN0YW5jZS4gU2VlIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Cis8bGl0ZXJhbD5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czwvbGl0ZXJhbD48L3VsaW5rPiBwYWNrYWdlIGZvcgorYXZhaWxhYmxlIHN0cmF0ZWdpZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3ViY2xhc3NTdHJhdGVneTwvbGl0ZXJhbD46IFRoZSBkZWZhdWx0IG1hcHBpbmcgc3RyYXRlZ3kgZm9yCitzdWJjbGFzc2VzLiBZb3UgY2FuIHNwZWNpZnkgYSBidWlsdGluIHN0cmF0ZWd5IGFsaWFzIG9yIHRoZSBmdWxsIGNsYXNzIG5hbWUgb2YgYQorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfY3VzdG9tX2NsYXNzIj4gY3VzdG9tIGNsYXNzIHN0cmF0ZWd5PC9saW5rPi4KK1lvdSBjYW4gYWxzbyB1c2UgT3BlbkpQQSdzIHBsdWdpbiBmb3JtYXQgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlCitzdHJhdGVneSBpbnN0YW5jZS4gQ29tbW9uIHN0cmF0ZWdpZXMgYXJlIDxsaXRlcmFsPnZlcnRpY2FsPC9saXRlcmFsPiBhbmQKKzxsaXRlcmFsPmZsYXQ8L2xpdGVyYWw+LCB0aGUgZGVmYXVsdC4gU2VlIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Cis8bGl0ZXJhbD5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czwvbGl0ZXJhbD48L3VsaW5rPiBwYWNrYWdlIGZvciBhbGwKK2F2YWlsYWJsZSBzdHJhdGVnaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlZlcnNpb25TdHJhdGVneTwvbGl0ZXJhbD46IFRoZSBkZWZhdWx0IHZlcnNpb24gc3RyYXRlZ3kgZm9yIGNsYXNzZXMKK3dpdGhvdXQgYSB2ZXJzaW9uIGZpZWxkLiBZb3UgY2FuIHNwZWNpZnkgYSBidWlsdGluIHN0cmF0ZWd5IGFsaWFzIG9yIHRoZSBmdWxsCitjbGFzcyBuYW1lIG9mIGEgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfY3VzdG9tX3ZlcnNkaXNjcmltIj4gY3VzdG9tCit2ZXJzaW9uIHN0cmF0ZWd5PC9saW5rPi4gWW91IGNhbiBhbHNvIHVzZSBPcGVuSlBBJ3MgcGx1Z2luIGZvcm1hdCAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUKK3N0cmF0ZWd5IGluc3RhbmNlLiBDb21tb24gc3RyYXRlZ2llcyBhcmUgPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPgorc3RhdGUtY29tcGFyaXNvbjwvbGl0ZXJhbD4sIDxsaXRlcmFsPiB0aW1lc3RhbXA8L2xpdGVyYWw+LCBhbmQgPGxpdGVyYWw+Cit2ZXJzaW9uLW51bWJlcjwvbGl0ZXJhbD4sIHRoZSBkZWZhdWx0LiBTZWUgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KKzxsaXRlcmFsPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuc3RyYXRzPC9saXRlcmFsPjwvdWxpbms+IHBhY2thZ2UgZm9yIGFsbAorYXZhaWxhYmxlIHN0cmF0ZWdpZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RGlzY3JpbWluYXRvclN0cmF0ZWd5PC9saXRlcmFsPjogVGhlIGRlZmF1bHQgZGlzY3JpbWluYXRvciBzdHJhdGVneQord2hlbiBubyBkaXNjcmltaW5hdG9yIHZhbHVlIGlzIGdpdmVuLiBZb3UgY2FuIHNwZWNpZnkgYSBidWlsdGluIHN0cmF0ZWd5IGFsaWFzCitvciB0aGUgZnVsbCBjbGFzcyBuYW1lIG9mIGEKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV92ZXJzZGlzY3JpbSI+IGN1c3RvbSBkaXNjcmltaW5hdG9yCitzdHJhdGVneTwvbGluaz4uIFlvdSBjYW4gYWxzbyB1c2UgT3BlbkpQQSdzIHBsdWdpbiBmb3JtYXQgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlCitzdHJhdGVneSBpbnN0YW5jZS4gQ29tbW9uIHN0cmF0ZWdpZXMgYXJlIDxsaXRlcmFsPmZpbmFsPC9saXRlcmFsPiBmb3IgYSBiYXNlCitjbGFzcyB3aXRob3V0IHN1YmNsYXNzZXMsIDxsaXRlcmFsPm5vbmU8L2xpdGVyYWw+IHRvIHVzZSBqb2lucyB0byBzdWJjbGFzcwordGFibGVzIHJhdGhlciB0aGFuIGEgZGlzY3JpbWluYXRvciBjb2x1bW4sIGFuZCA8bGl0ZXJhbD4gY2xhc3MtbmFtZTwvbGl0ZXJhbD4sCit0aGUgZGVmYXVsdC4gU2VlIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL3N0cmF0cy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Cis8bGl0ZXJhbD5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLnN0cmF0czwvbGl0ZXJhbD48L3VsaW5rPiBwYWNrYWdlIGZvciBhbGwKK2F2YWlsYWJsZSBzdHJhdGVnaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZpZWxkU3RyYXRlZ2llczwvbGl0ZXJhbD46IFRoaXMgcHJvcGVydHkgYXNzb2NpYXRlcyBmaWVsZCB0eXBlcyB3aXRoCitjdXN0b20gc3RyYXRlZ2llcy4gVGhlIGZvcm1hdCBvZiB0aGlzIHByb3BlcnR5IGlzIHNpbWlsYXIgdG8gdGhhdCBvZiBwbHVnaW4KK3N0cmluZ3MgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+ICksIHdpdGhvdXQgdGhlIGNsYXNzCituYW1lLiBJdCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGtleS92YWx1ZSBwYWlycywgd2hlcmUgZWFjaCBrZXkgaXMgYQorcG9zc2libGUgZmllbGQgdHlwZSwgYW5kIGVhY2ggdmFsdWUgaXMgaXRzZWxmIGEgcGx1Z2luIHN0cmluZyBkZXNjcmliaW5nIHRoZQorc3RyYXRlZ3kgZm9yIHRoYXQgdHlwZS4gV2UgcHJlc2VudCBhbiBleGFtcGxlIGJlbG93LiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV9maWVsZCIvPiBmb3IgaW5mb3JtYXRpb24gb24gY3VzdHVtCitmaWVsZCBzdHJhdGVnaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZvcmVpZ25LZXlEZWxldGVBY3Rpb248L2xpdGVyYWw+OiBUaGUgZGVmYXVsdCBkZWxldGUgYWN0aW9uIG9mIGZvcmVpZ24KK2tleXMgcmVwcmVzZW50aW5nIHJlbGF0aW9ucyB0byBvdGhlciBvYmplY3RzLiBSZWNvZ25pemVkIHZhbHVlcyBpbmNsdWRlCis8bGl0ZXJhbD5yZXN0cmljdDwvbGl0ZXJhbD4sIDxsaXRlcmFsPmNhc2NhZGU8L2xpdGVyYWw+LCA8bGl0ZXJhbD5udWxsPC9saXRlcmFsPgorLCA8bGl0ZXJhbD5kZWZhdWx0PC9saXRlcmFsPi4gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgZXhhY3RseSB0byB0aGUgc3RhbmRhcmQKK2RhdGFiYXNlIGZvcmVpZ24ga2V5IGFjdGlvbnMgb2YgdGhlIHNhbWUgbmFtZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSB2YWx1ZSA8bGl0ZXJhbD5ub25lPC9saXRlcmFsPiB0ZWxscyBPcGVuSlBBIG5vdCB0byBjcmVhdGUgZGF0YWJhc2UgZm9yZWlnbgora2V5cyBvbiByZWxhdGlvbiBjb2x1bW5zLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkpvaW5Gb3JlaWduS2V5RGVsZXRlQWN0aW9uPC9saXRlcmFsPjogVGhlIGRlZnVhbHQgZGVsZXRlIGFjdGlvbiBvZgorZm9yZWlnbiBrZXlzIHRoYXQgam9pbiBqb2luIHNlY29uZGFyeSwgY29sbGVjdGlvbiwgbWFwLCBvciBzdWJjbGFzcyB0YWJsZXMgdG8KK3RoZSBwcmltYXJ5IHRhYmxlLiBBY2NlcHRzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgPGxpdGVyYWw+CitGb3JlaWduS2V5RGVsZXRlQWN0aW9uPC9saXRlcmFsPiBwcm9wZXJ0eSBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5EZWZlckNvbnN0cmFpbnRzPC9saXRlcmFsPjogV2hldGhlciB0byB1c2UgZGVmZXJyZWQgZGF0YWJhc2UKK2NvbnN0cmFpbnRzIGlmIHBvc3NpYmxlLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5JbmRleExvZ2ljYWxGb3JlaWduS2V5czwvbGl0ZXJhbD46IEJvb2xlYW4gcHJvcGVydHkgY29udHJvbGxpbmcKK3doZXRoZXIgdG8gY3JlYXRlIGluZGV4ZXMgb24gbG9naWNhbCBmb3JlaWduIGtleXMuIExvZ2ljYWwgZm9yZWlnbiBrZXlzIGFyZQorY29sdW1ucyB0aGF0IHJlcHJlc2VudCBhIGxpbmsgYmV0d2VlbiB0YWJsZXMsIGJ1dCBoYXZlIGJlZW4gY29uZmlndXJlZCB0aHJvdWdoCit0aGUgPGxpdGVyYWw+Rm9yZWlnbktleTwvbGl0ZXJhbD4gcHJvcGVydGllcyBhYm92ZSBub3QgdG8gdXNlIGEgcGh5c2ljYWwKK2RhdGFiYXNlIGZvcmVpZ24ga2V5LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkRhdGFTdG9yZUlkQ29sdW1uTmFtZTwvbGl0ZXJhbD46IFRoZSBkZWZhdWx0IG5hbWUgb2YgZGF0YXN0b3JlCitpZGVudGl0eSBjb2x1bW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lPC9saXRlcmFsPjogVGhlIGRlZmF1bHQgbmFtZSBvZiBkaXNjcmltaW5hdG9yCitjb2x1bW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkluZGV4RGlzY3JpbWluYXRvcjwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gaW5kZXggdGhlIGRpc2NyaW1pbmF0b3IKK2NvbHVtbi4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5WZXJzaW9uQ29sdW1uTmFtZTwvbGl0ZXJhbD46IFRoZSBkZWZhdWx0IG5hbWUgb2YgdmVyc2lvbiBjb2x1bW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkluZGV4VmVyc2lvbjwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gaW5kZXggdGhlIHZlcnNpb24gY29sdW1uLiBEZWZhdWx0cwordG8gZmFsc2UuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QWRkTnVsbEluZGljYXRvcjwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gY3JlYXRlIGEgc3ludGhldGljIG51bGwKK2luZGljYXRvciBjb2x1bW4gZm9yIGVtYmVkZGVkIG1hcHBpbmdzLiBUaGUgbnVsbCBpbmRpY2F0b3IgY29sdW1uIGFsbG93cyBPcGVuSlBBCit0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbnVsbCBlbWJlZGRlZCBvYmplY3QgYW5kIG9uZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvcgorYWxsIHBlcnNpc3RlbnQgZmllbGRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk51bGxJbmRpY2F0b3JDb2x1bW5OYW1lPC9saXRlcmFsPjogVGhlIGRlZmF1bHQgbmFtZSBvZiBzeW50aGV0aWMgbnVsbAoraW5kaWNhdG9yIGNvbHVtbnMgZm9yIGVtYmVkZGVkIG9iamVjdHMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+T3JkZXJMaXN0czwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gY3JlYXRlIGEgZGF0YWJhc2Ugb3JkZXJpbmcgY29sdW1uIGZvcgorbWFpbnRhaW5pbmcgdGhlIG9yZGVyIG9mIHBlcnNpc3RlbnQgbGlzdHMgYW5kIGFycmF5cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5PcmRlckNvbHVtbk5hbWU8L2xpdGVyYWw+OiBUaGUgZGVmYXVsdCBuYW1lIG9mIGNvbGxlY3Rpb24gYW5kIGFycmF5CitvcmRlcmluZyBjb2x1bW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0b3JlRW51bU9yZGluYWw8L2xpdGVyYWw+OiBTZXQgdG8gdHJ1ZSB0byBzdG9yZSBlbnVtIGZpZWxkcyBhcworbnVtZXJpYyBvcmRpbmFsIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuIFRoZSBkZWZhdWx0IGlzIHRvIHN0b3JlIHRoZSBlbnVtIHZhbHVlCituYW1lIGFzIGEgc3RyaW5nLCB3aGljaCBpcyBtb3JlIHJvYnVzdCBpZiB0aGUgSmF2YSBlbnVtIGRlY2xhcmF0aW9uIG1pZ2h0IGJlCityZWFycmFuZ2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0b3JlVW5tYXBwZWRPYmplY3RJZFN0cmluZzwvbGl0ZXJhbD46IFNldCB0byB0cnVlIHRvIHN0b3JlIHRoZQorc3RyaW5naWZpZWQgaWRlbnRpdHkgb2YgcmVsYXRlZCBvYmplY3RzIHdoZW4gdGhlIGRlY2xhcmVkIHJlbGF0ZWQgdHlwZSBpcwordW5tYXBwZWQuIEJ5IGRlZmF1bHQsIE9wZW5KUEEgc3RvcmVzIHRoZSByZWxhdGVkIG9iamVjdCdzIHByaW1hcnkga2V5IHZhbHVlKHMpLgorSG93ZXZlciwgdGhpcyBicmVha3MgZG93biBpZiBkaWZmZXJlbnQgc3ViY2xhc3NlcyBvZiB0aGUgcmVsYXRlZCB0eXBlIHVzZQoraW5jb21wYXRpYmxlIHByaW1hcnkga2V5IHN0cnVjdHVyZXMuIEluIHRoYXQgY2FzZSwgc3RyaW5naWZ5aW5nIHRoZSBpZGVudGl0eQordmFsdWUgaXMgdGhlIGJldHRlciBjaG9pY2UuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitUaGUgZXhhbXBsZSBiZWxvdyB0dXJucyBvbiBmb3JlaWduIGtleSBnZW5lcmF0aW9uIGR1cmluZyBzY2hlbWEgY3JlYXRpb24gYW5kCithc3NvY2lhdGVzIHRoZSA8Y2xhc3NuYW1lPm9yZy5tYWcuZGF0YS5JbmZvU3RydWN0PC9jbGFzc25hbWU+IGZpZWxkIHR5cGUgd2l0aAordGhlIGN1c3RvbSA8Y2xhc3NuYW1lPm9yZy5tYWcubWFwcGluZy5JbmZvU3RydWN0SGFuZGxlcjwvY2xhc3NuYW1lPiB2YWx1ZQoraGFuZGxlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX21hcHBpbmdfZGVmYXVsdHNfY29uZiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgTWFwcGluZyBEZWZhdWx0cworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLmpkYmMuTWFwcGluZ0RlZmF1bHRzIgorICAgIHZhbHVlPSJGb3JlaWduS2V5RGVsZXRlQWN0aW9uPXJlc3RyaWN0LAorICAgIEZpZWxkU3RyYXRlZ2llcz0nb3JnLm1hZy5kYXRhLkluZm9TdHJ1Y3Q9b3JnLm1hZy5tYXBwaW5nLkluZm9TdHJ1Y3RIYW5kbGVyJyIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21hcHBpbmdfZmFjdG9yeSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE1hcHBpbmcgRmFjdG9yeQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2ZhY3RvcnkiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgTWFwcGluZ0ZhY3RvcnkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGxvYWRpbmcgYW5kIHN0b3JpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICBNYXBwaW5nRmFjdG9yeQorICAgICAgICAgICAgPC9zZWU+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0FuIGltcG9ydGFudCBkZWNpc2lvbiBpbiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBwcm9jZXNzIGlzIGhvdyBhbmQgd2hlcmUKK3RvIHN0b3JlIHRoZSBkYXRhIG5lY2Vzc2FyeSB0byBtYXAgeW91ciBwZXJzaXN0ZW50IGNsYXNzZXMgdG8gdGhlIGRhdGFiYXNlCitzY2hlbWEuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+Cis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWV0YV9mYWN0b3J5Ii8+IGludHJvZHVjZWQgT3BlbkpQQSdzIDxjbGFzc25hbWU+CitNZXRhRGF0YUZhY3Rvcnk8L2NsYXNzbmFtZT4gaW50ZXJmYWNlLiBPcGVuSlBBIHVzZXMgdGhpcyBzYW1lIGludGVyZmFjZSB0bworYWJzdHJhY3QgdGhlIHN0b3JhZ2UgYW5kIHJldHJpZXZhbCBvZiBtYXBwaW5nIGluZm9ybWF0aW9uLiBPcGVuSlBBIGluY2x1ZGVzIHRoZQorYnVpbHQtaW4gbWFwcGluZyBmYWN0b3JpZXMgYmVsb3csIGFuZCB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biBmYWN0b3J5IGlmIHlvdQoraGF2ZSBjdXN0b20gbmVlZHMuIFlvdSBjb250cm9sIHdoaWNoIG1hcHBpbmcgZmFjdG9yeSBPcGVuSlBBIHVzZXMgd2l0aCB0aGUKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5NYXBwaW5nRmFjdG9yeSI+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuTWFwcGluZ0ZhY3Rvcnk8L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIGJ1bmRsZWQgbWFwcGluZyBmYWN0b3JpZXMgYXJlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4tPC9saXRlcmFsPjogTGVhdmluZyB0aGUgPGxpdGVyYWw+IG9wZW5qcGEuamRiYy5NYXBwaW5nRmFjdG9yeQorPC9saXRlcmFsPiBwcm9wZXJ0eSB1bnNldCBhbGxvd3MgeW91ciBtZXRhZGF0YSBmYWN0b3J5IHRvIHRha2Ugb3ZlciBtYXBwaW5ncyBhcword2VsbC4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgPGxpdGVyYWw+anBhPC9saXRlcmFsPiBtZXRhZGF0YSBmYWN0b3J5LCAKK09wZW5KUEEgd2lsbCByZWFkIG1hcHBpbmcgaW5mb3JtYXRpb24gZnJvbSB5b3VyIGFubm90YXRpb25zIGFuZCAKKzxmaWxlbmFtZT5vcm0ueG1sPC9maWxlbmFtZT4gd2hlbiB5b3UgbGVhdmUgdGhlIG1hcHBpbmcgZmFjdG9yeSB1bnNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2ZhY3RvcnlfanBhIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTdGFuZGFyZCBKUEEgQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gdGhlIHN0YW5kYXJkIEpQQSBjb25maWd1cmF0aW9uLCB0aGUgbWFwcGluZyBmYWN0b3J5IGlzIGxlZnQgdW5zZXQuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5NZXRhRGF0YUZhY3RvcnkiIHZhbHVlPSJqcGEiLyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX25vdGVzX25vbnN0ZGpvaW5zIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgTm9uLVN0YW5kYXJkIEpvaW5zCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfbm90ZXNfbm9uc3Rkam9pbnMiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgam9pbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbm9uLXN0YW5kYXJkCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIEpQQSBPdmVydmlldydzIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nIi8+IGV4cGxhaW5zIGpvaW4KK21hcHBpbmcuIEFsbCBvZiB0aGUgZXhhbXBsZXMgaW4gdGhhdCBkb2N1bWVudCwgaG93ZXZlciwgdXNlICJzdGFuZGFyZCIgam9pbnMsIGluCit0aGF0IHRoZXJlIGlzIG9uZSBmb3JlaWduIGtleSBjb2x1bW4gZm9yIGVhY2ggcHJpbWFyeSBrZXkgY29sdW1uIGluIHRoZSB0YXJnZXQKK3RhYmxlLiBPcGVuSlBBIHN1cHBvcnRzIGFkZGl0aW9uYWwgam9pbiBwYXR0ZXJucywgaW5jbHVkaW5nIHBhcnRpYWwgcHJpbWFyeSBrZXkKK2pvaW5zLCBub24tcHJpbWFyeSBrZXkgam9pbnMsIGFuZCBqb2lucyB1c2luZyBjb25zdGFudCB2YWx1ZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBqb2lucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBwYXJ0aWFsIHByaW1hcnkga2V5CisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CitJbiBhIHBhcnRpYWwgcHJpbWFyeSBrZXkgam9pbiwgdGhlIHNvdXJjZSB0YWJsZSBvbmx5IGhhcyBmb3JlaWduIGtleSBjb2x1bW5zIGZvcgorYSBzdWJzZXQgb2YgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgaW4gdGhlIHRhcmdldCB0YWJsZS4gU28gbG9uZyBhcyB0aGlzIHN1YnNldAorb2YgY29sdW1ucyBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgcHJvcGVyIHJvdyhzKSBpbiB0aGUgcmVmZXJlbmNlZCB0YWJsZSwKK09wZW5KUEEgd2lsbCBmdW5jdGlvbiBwcm9wZXJseS4gVGhlcmUgaXMgbm8gc3BlY2lhbCBzeW50YXggZm9yIGV4cHJlc3NpbmcgYQorcGFydGlhbCBwcmltYXJ5IGtleSBqb2luIC0ganVzdCBkbyBub3QgaW5jbHVkZSBjb2x1bW4gZGVmaW5pdGlvbnMgZm9yIG1pc3NpbmcKK2ZvcmVpZ24ga2V5IGNvbHVtbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBqb2lucworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBub24tcHJpbWFyeSBrZXkKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK0luIGEgbm9uLXByaW1hcnkga2V5IGpvaW4sIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGFyZ2V0IGNvbHVtbnMgaXMgbm90IGEgcHJpbWFyeQora2V5LiBPbmNlIGFnYWluLCBPcGVuSlBBIHN1cHBvcnRzIHRoaXMgam9pbiB0eXBlIHdpdGggdGhlIHNhbWUgc3ludGF4IGFzIGEKK3ByaW1hcnkga2V5IGpvaW4uIFRoZXJlIGlzIG9uZSByZXN0cmljdGlvbiwgaG93ZXZlcjogZWFjaCBub24tcHJpbWFyeSBrZXkgY29sdW1uCit5b3UgYXJlIGpvaW5pbmcgdG8gbXVzdCBiZSBjb250cm9sbGVkIGJ5IGEgZmllbGQgbWFwcGluZyB0aGF0IGltcGxlbWVudHMgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvSm9pbmFibGUuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuSm9pbmFibGU8L2NsYXNzbmFtZT48L3VsaW5rPiBpbnRlcmZhY2UuIEFsbCBidWlsdAoraW4gYmFzaWMgbWFwcGluZ3MgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBpbmNsdWRpbmcgYmFzaWMgZmllbGRzIG9mIGVtYmVkZGVkCitvYmplY3RzLiBPcGVuSlBBIHdpbGwgYWxzbyByZXNwZWN0IGFueSBjdXN0b20gbWFwcGluZ3MgdGhhdCBpbXBsZW1lbnQgdGhpcworaW50ZXJmYWNlLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfY3VzdG9tIi8+IGZvciBhbgorZXhhbWluYXRpb24gb2YgY3VzdG9tIG1hcHBpbmdzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgam9pbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgY29uc3RhbnQKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK05vdCBhbGwgam9pbnMgY29uc2lzdCBvZiBvbmx5IGxpbmtzIGJldHdlZW4gY29sdW1ucy4gSW4gc29tZSBjYXNlcyB5b3UgbWlnaHQKK2hhdmUgYSBzY2hlbWEgaW4gd2hpY2ggb25lIG9mIHRoZSBqb2luIGNyaXRlcmlhIGlzIHRoYXQgYSBjb2x1bW4gaW4gdGhlIHNvdXJjZQorb3IgdGFyZ2V0IHRhYmxlIG11c3QgaGF2ZSBzb21lIGNvbnN0YW50IHZhbHVlLiBPcGVuSlBBIGNhbGxzIGpvaW5zIGludm9sdmluZworY29uc3RhbnQgdmFsdWVzIDxlbXBoYXNpcz5jb25zdGFudCBqb2luczwvZW1waGFzaXM+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVG8gZm9ybSBhIGNvbnN0YW50IGpvaW4gaW4gSlBBIG1hcHBpbmcsIGZpcnN0IHNldCB0aGUgPGxpdGVyYWw+Sm9pbkNvbHVtbgorPC9saXRlcmFsPidzIDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUgY29sdW1uLiBJZiB0aGUKK2NvbHVtbiB3aXRoIHRoZSBjb25zdGFudCB2YWx1ZSBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBqb2luLCBnaXZlIGl0cyBmdWxseQorcXVhbGlmaWVkIG5hbWUgaW4gdGhlIGZvcm0gPGxpdGVyYWw+Jmx0O3RhYmxlIG5hbWUmZ3Q7LiZsdDtjb2x1bW4gbmFtZSZndDsKKzwvbGl0ZXJhbD4uIE5leHQsIHNldCB0aGUgPGxpdGVyYWw+cmVmZXJlbmNlZENvbHVtbk5hbWU8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0bwordGhlIGNvbnN0YW50IHZhbHVlLiBJZiB0aGUgY29uc3RhbnQgdmFsdWUgaXMgYSBzdHJpbmcsIHBsYWNlIGl0IGluIHNpbmdsZSBxdW90ZXMKK3RvIGRpZmZlcmVudGlhdGUgaXQgZnJvbSBhIGNvbHVtbiBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8IS0tIFBORyBpbWFnZSBkYXRhLCA0MjcgeCAyMTEgKHNlZSBSRUFETUUpIC0tPgorICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2pvaW5zLWNvbnN0YW50LnBuZyIgd2lkdGg9IjI4NXB4Ii8+CisKKyAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgIDxwYXJhPgorQ29uc2lkZXIgdGhlIHRhYmxlcyBhYm92ZS4gRmlyc3QsIHdlIHdhbnQgdG8gam9pbiByb3cgPGxpdGVyYWw+VDEuUjE8L2xpdGVyYWw+Cit0byByb3cgPGxpdGVyYWw+VDIuUjE8L2xpdGVyYWw+LiBJZiB3ZSBqdXN0IGpvaW4gY29sdW1uIDxsaXRlcmFsPlQxLkZLPC9saXRlcmFsPgordG8gPGxpdGVyYWw+VDIuUEsxPC9saXRlcmFsPiwgd2Ugd2lsbCB3aW5kIHVwIG1hdGNoaW5nIGJvdGggPGxpdGVyYWw+VDIuUjEKKzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPiBUMi5SMjwvbGl0ZXJhbD4uIFNvIGluIGFkZGl0aW9uIHRvIGpvaW5pbmcgPGxpdGVyYWw+CitUMS5GSzwvbGl0ZXJhbD4gdG8gPGxpdGVyYWw+VDIuUEsxPC9saXRlcmFsPiwgd2UgYWxzbyBoYXZlIHRvIHNwZWNpZnkgdGhhdAorPGxpdGVyYWw+VDIuUEsyPC9saXRlcmFsPiBoYXMgdGhlIHZhbHVlIDxsaXRlcmFsPmE8L2xpdGVyYWw+LiBIZXJlIGlzIGhvdyB3ZSdkCithY2NvbXBsaXNoIHRoaXMgaW4gbWFwcGluZyBtZXRhZGF0YS4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorQEVudGl0eQorQFRhYmxlKG5hbWU9IlQxIikKK3B1YmxpYyBjbGFzcyAuLi4gIHsKKworICAgIEBNYW55VG9PbmUKKyAgICBASm9pbkNvbHVtbnMoeworICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJGSyIgcmVmZXJlbmNlZENvbHVtbk5hbWU9IlBLMSIpLAorICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJUMi5QSzIiIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSInYSciKQorICAgIH0pOworICAgIHByaXZhdGUgLi4uOworfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CitOb3RpY2UgdGhhdCB3ZSBoYWQgdG8gZnVsbHkgcXVhbGlmeSB0aGUgbmFtZSBvZiBjb2x1bW4gPGxpdGVyYWw+UEsyPC9saXRlcmFsPgorYmVjYXVzZSBpdCBpcyBpbiB0aGUgdGFyZ2V0IHRhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHdlIHB1dCBzaW5nbGUgcXVvdGVzIGFyb3VuZAordGhlIGNvbnN0YW50IHZhbHVlIHNvIHRoYXQgaXQgd29uJ3QgYmUgY29uZnVzZWQgd2l0aCBhIGNvbHVtbiBuYW1lLiBZb3UgZG8gbm90CituZWVkIHNpbmdsZSBxdW90ZXMgZm9yIG51bWVyaWMgY29uc3RhbnRzLiBGb3IgZXhhbXBsZSwgdGhlIHN5bnRheCB0byBqb2luCis8bGl0ZXJhbD5UMS5SMjwvbGl0ZXJhbD4gdG8gPGxpdGVyYWw+VDIuUjQ8L2xpdGVyYWw+IGlzOgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitARW50aXR5CitAVGFibGUobmFtZT0iVDEiKQorcHVibGljIGNsYXNzIC4uLiAgeworCisgICAgQE1hbnlUb09uZQorICAgIEBKb2luQ29sdW1ucyh7CisgICAgICAgIEBKb2luQ29sdW1uKG5hbWU9IkZLIiByZWZlcmVuY2VkQ29sdW1uTmFtZT0iUEsyIiksCisgICAgICAgIEBKb2luQ29sdW1uKG5hbWU9IlQyLlBLMSIgcmVmZXJlbmNlZENvbHVtbk5hbWU9IjIiKQorICAgIH0pOworICAgIHByaXZhdGUgLi4uOworfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHBhcmE+CitGaW5hbGx5LCBmcm9tIHRoZSBpbnZlcnNlIGRpcmVjdGlvbiwgdGhlc2Ugam9pbnMgd291bGQgbG9vayBsaWtlIHRoaXM6CisgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJUMiIpCitwdWJsaWMgY2xhc3MgLi4uICB7CisKKyAgICBATWFueVRvT25lCisgICAgQEpvaW5Db2x1bW5zKHsKKyAgICAgICAgQEpvaW5Db2x1bW4obmFtZT0iVDEuRksiIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSJQSzEiKSwKKyAgICAgICAgQEpvaW5Db2x1bW4obmFtZT0iUEsyIiByZWZlcmVuY2VkQ29sdW1uTmFtZT0iJ2EnIikKKyAgICB9KTsKKyAgICBwcml2YXRlIC4uLjsKKworICAgIEBNYW55VG9PbmUKKyAgICBASm9pbkNvbHVtbnMoeworICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJUMS5GSyIgcmVmZXJlbmNlZENvbHVtbk5hbWU9IlBLMiIpLAorICAgICAgICBASm9pbkNvbHVtbihuYW1lPSJQSzEiIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSIyIikKKyAgICB9KTsKKyAgICBwcml2YXRlIC4uLjsKK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGEiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBBZGRpdGlvbmFsIEpQQSBNYXBwaW5ncworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIEpQQSBhZGRpdGlvbnMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBIHN1cHBvcnRzIG1hbnkgcGVyc2lzdGVuY2Ugc3RyYXRlZ2llcyBiZXlvbmQgdGhvc2Ugb2YgdGhlIEpQQQorc3BlY2lmaWNhdGlvbi4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21ldGFfanBhIi8+IGNvdmVyZWQgdGhlIGxvZ2ljYWwKK21ldGFkYXRhIGZvciBPcGVuSlBBJ3MgYWRkaXRpb25hbCBwZXJzaXN0ZW5jZSBzdHJhdGVnaWVzLiBXZSBub3cgZGVtb25zdHJhdGUgaG93Cit0byBtYXAgZW50aXRpZXMgdXNpbmcgdGhlc2Ugc3RyYXRlZ2llcyB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9kYXRhc3RvcmVpZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRGF0YXN0b3JlIElkZW50aXR5IE1hcHBpbmcKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9kYXRhc3RvcmVpZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGRhdGFzdG9yZSBpZGVudGl0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX2RhdGFzdG9yZWlkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBkYXRhc3RvcmUgaWRlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX2RhdGFzdG9yZWlkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRGF0YVN0b3JlSWRDb2x1bW4KKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHByaW1hcnkga2V5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19vaWQiLz4gZGVzY3JpYmVzIGhvdyB0byB1c2UgZGF0YXN0b3JlIGlkZW50aXR5CitpbiBKUEEuIE9wZW5KUEEgcmVxdWlyZXMgYSBzaW5nbGUgbnVtZXJpYyBwcmltYXJ5IGtleSBjb2x1bW4gdG8gaG9sZCBkYXRhc3RvcmUKK2lkZW50aXR5IHZhbHVlcy4gVGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0RhdGFTdG9yZUlkQ29sdW1uLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5EYXRhU3RvcmVJZENvbHVtbjwvY2xhc3NuYW1lPgorPC91bGluaz4gYW5ub3RhdGlvbiBjdXN0b21pemVzIHRoZSBkYXRhc3RvcmUgaWRlbnRpdHkgY29sdW1uLiBUaGlzIGFubm90YXRpb24KK2hhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgbmFtZTwvbGl0ZXJhbD46IERlZmF1bHRzIHRvIDxsaXRlcmFsPklEPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmludCBwcmVjaXNpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgY29sdW1uRGVmaW5pdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gaW5zZXJ0YWJsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gdXBkYXRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitBbGwgcHJvcGVydGllcyBjb3JyZXNwb25kIGV4YWN0bHkgdG8gdGhlIHNhbWUtbmFtZWQgcHJvcGVydGllcyBvbiB0aGUgc3RhbmRhcmQKKzxjbGFzc25hbWU+Q29sdW1uPC9jbGFzc25hbWU+IGFubm90YXRpb24sIGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfY29sdW1uIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9kYXRhc3RvcmVpZGV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERhdGFzdG9yZSBJZGVudGl0eSBNYXBwaW5nCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy4qOworCitARW50aXR5CitAVGFibGUobmFtZT0iTE9HUyIpCitARGF0YVN0b3JlSWRDb2x1bW4obmFtZT0iRU5UUlkiKQorcHVibGljIGNsYXNzIExvZ0VudHJ5IHsKKworICAgIEBMb2IKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50OworCisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfdmVyc2lvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3Vycm9nYXRlIFZlcnNpb24gTWFwcGluZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX2RhdGFzdG9yZWlkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX3ZlcnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbgorICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfdmVyc2lvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFZlcnNpb25Db2x1bW4KKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBzdXBwb3J0cyB2ZXJzaW9uIGZpZWxkcyBhcyBkZWZpbmVkIGJ5IHRoZSBKUEEgc3BlY2lmaWNhdGlvbiwgYnV0IGFsbG93cworeW91IHRvIHVzZSBhIHN1cnJvZ2F0ZSB2ZXJzaW9uIGNvbHVtbiBpbiBwbGFjZSBvZiBhIHZlcnNpb24gZmllbGQgaWYgeW91IGxpa2UuCitZb3UgbWFwIHRoZSBzdXJyb2dhdGUgdmVyc2lvbiBjb2x1bW4gd2l0aCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVmVyc2lvbkNvbHVtbi5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuVmVyc2lvbkNvbHVtbjwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uLiBZb3UgY2FuIGFsc28gdXNlIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9WZXJzaW9uQ29sdW1ucy5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuVmVyc2lvbkNvbHVtbnM8L2NsYXNzbmFtZT4KKzwvdWxpbms+IGFubm90YXRpb24gdG8gZGVjbGFyZSBhbiBhcnJheSBvZiA8Y2xhc3NuYW1lPlZlcnNpb25Db2x1bW48L2NsYXNzbmFtZT4KK3ZhbHVlcy4gRWFjaCA8Y2xhc3NuYW1lPlZlcnNpb25Db2x1bW48L2NsYXNzbmFtZT4gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogRGVmYXVsdHMgdG8gPGxpdGVyYWw+VkVSU048L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+aW50IGxlbmd0aDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmludCBwcmVjaXNpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5pbnQgc2NhbGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgY29sdW1uRGVmaW5pdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gbnVsbGFibGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGluc2VydGFibGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIHVwZGF0YWJsZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorQWxsIHByb3BlcnRpZXMgY29ycmVzcG9uZCBleGFjdGx5IHRvIHRoZSBzYW1lLW5hbWVkIHByb3BlcnRpZXMgb24gdGhlIHN0YW5kYXJkCis8Y2xhc3NuYW1lPkNvbHVtbjwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLCBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2NvbHVtbiIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorQnkgZGVmYXVsdCwgT3BlbkpQQSBhc3N1bWVzIHRoYXQgc3Vycm9nYXRlIHZlcnNpb25pbmcgdXNlcyBhIHZlcnNpb24gbnVtYmVyCitzdHJhdGVneS4gWW91IGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgc3RyYXRlZ3kgd2l0aCB0aGUgPGNsYXNzbmFtZT4KK1ZlcnNpb25TdHJhdGVneTwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGRlc2NyaWJlZCBpbgorPHhyZWYgbGlua2VuZD0idmVyc2lvbi1zdHJhdGVneSIvPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX2NvbHVtbnMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE11bHRpLUNvbHVtbiBNYXBwaW5ncworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX2NvbHVtbnMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb2x1bW5zIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBtdWx0aS1jb2x1bW4gbWFwcGluZ3MKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sdW1ucyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIENvbHVtbnMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBtYWtlcyBpdCBlYXN5IHRvIGNyZWF0ZSBtdWx0aS1jb2x1bW4KKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV9maWVsZCI+Y3VzdG9tIG1hcHBpbmdzPC9saW5rPi4gVGhlIEpQQQorc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhIDxjbGFzc25hbWU+Q29sdW1uPC9jbGFzc25hbWU+IGFubm90YXRpb24sIGJ1dCBpcworbWlzc2luZyBhIHdheSB0byBkZWNsYXJlIG11bHRpcGxlIGNvbHVtbnMgZm9yIGEgc2luZ2xlIGZpZWxkLiBPcGVuSlBBIHJlbWVkaWVzCit0aGlzIHdpdGggdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NvbHVtbnMuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLkNvbHVtbnM8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiwgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgPGNsYXNzbmFtZT5Db2x1bW48L2NsYXNzbmFtZT4gdmFsdWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitSZW1lbWJlciB0byBhbm5vdGF0ZSBjdXN0b20gZmllbGQgdHlwZXMgd2l0aCA8Y2xhc3NuYW1lPlBlcnNpc3RlbnQ8L2NsYXNzbmFtZT4sCithcyBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21ldGFfanBhX3BlcnNpc3RlbnQiLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9maWVsZGpvaW4iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEpvaW4gQ29sdW1uIEF0dHJpYnV0ZSBUYXJnZXRzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Cis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19yZWwiLz4gaW4gdGhlIEpQQSBPdmVydmlldyBpbnRyb2R1Y2VkCit5b3UgdG8gdGhlIDxjbGFzc25hbWU+Sm9pbkNvbHVtbjwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLiBBIDxjbGFzc25hbWU+CitKb2luQ29sdW1uPC9jbGFzc25hbWU+J3MgPGxpdGVyYWw+IHJlZmVyZW5jZWRDb2x1bW5OYW1lPC9saXRlcmFsPiBwcm9wZXJ0eQorZGVjbGFyZXMgd2hpY2ggY29sdW1uIGluIHRoZSB0YWJsZSBvZiB0aGUgcmVsYXRlZCB0eXBlIHRoaXMgam9pbiBjb2x1bW4gbGlua3MKK3RvLiBTdXBwb3NlLCBob3dldmVyLCB0aGF0IHRoZSByZWxhdGVkIHR5cGUgaXMgdW5tYXBwZWQsIG9yIHRoYXQgaXQgaXMgcGFydCBvZiBhCit0YWJsZS1wZXItY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBFYWNoIHN1YmNsYXNzIHRoYXQgbWlnaHQgYmUgYXNzaWduZWQgdG8KK3RoZSBmaWVsZCBjb3VsZCByZXNpZGUgaW4gYSBkaWZmZXJlbnQgdGFibGUsIGFuZCBjb3VsZCB1c2UgZW50aXJlbHkgZGlmZmVyZW50CituYW1lcyBmb3IgaXRzIHByaW1hcnkga2V5IGNvbHVtbnMuIEl0IGJlY29tZXMgaW1wb3NzaWJsZSB0byBzdXBwbHkgYSBzaW5nbGUKKzxsaXRlcmFsPnJlZmVyZW5jZWRDb2x1bW5OYW1lPC9saXRlcmFsPiB0aGF0IHdvcmtzIGZvciBhbGwgc3ViY2xhc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSByZWN0aWZpZXMgdGhpcyBieSBhbGxvd2luZyB5b3UgdG8gZGVjbGFyZSB3aGljaCA8ZW1waGFzaXM+YXR0cmlidXRlCis8L2VtcGhhc2lzPiBpbiB0aGUgcmVsYXRlZCB0eXBlIGVhY2ggam9pbiBjb2x1bW4gbGlua3MgdG8sIHJhdGhlciB0aGFuIHdoaWNoCitjb2x1bW4uIElmIHRoZSBhdHRyaWJ1dGUgaXMgbWFwcGVkIGRpZmZlcmVudGx5IGluIHZhcmlvdXMgc3ViY2xhc3MgdGFibGVzLAorT3BlbkpQQSBhdXRvbWF0aWNhbGx5IGZvcm1zIHRoZSBwcm9wZXIgam9pbiBmb3IgdGhlIHN1YmNsYXNzIHJlY29yZCBhdCBoYW5kLiBUaGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvWEpvaW5Db2x1bW4uaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlhKb2luQ29sdW1uPC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24gaGFzIGFsbCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBzdGFuZGFyZCA8Y2xhc3NuYW1lPkpvaW5Db2x1bW4KKzwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uLCBidXQgYWRkcyBhbiBhZGRpdGlvbmFsIDxsaXRlcmFsPgorcmVmZXJlbmNlZEF0dHJpYnV0ZU5hbWU8L2xpdGVyYWw+IHByb3BlcnR5IGZvciB0aGlzIHB1cnBvc2UuIFNpbXBseSB1c2UgYQorPGNsYXNzbmFtZT5YSm9pbkNvbHVtbjwvY2xhc3NuYW1lPiBpbiBwbGFjZSBvZiBhIDxjbGFzc25hbWU+Sm9pbkNvbHVtbgorPC9jbGFzc25hbWU+IHdoZW5ldmVyIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGlzIGFkZGVkIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0ZvciBjb21wb3VuZCBrZXlzLCB1c2UgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1hKb2luQ29sdW1ucy5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuWEpvaW5Db2x1bW5zPC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24uIFRoZSB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24gaXMgYW4gYXJyYXkgb2YgaW5kaXZpZHVhbCA8Y2xhc3NuYW1lPgorWEpvaW5Db2x1bW48L2NsYXNzbmFtZT5zLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfZW1iZWQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEVtYmVkZGVkIE1hcHBpbmcKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSB1c2VzIHRoZSA8Y2xhc3NuYW1lPkF0dHJpYnV0ZU92ZXJyaWRlPC9jbGFzc25hbWU+IGFubm90YXRpb24gdG8gb3ZlcnJpZGUgdGhlCitkZWZhdWx0IG1hcHBpbmdzIG9mIGFuIGVtYmVkZGFibGUgY2xhc3MuIFRoZSBKUEEgT3ZlcnZpZXcgZGV0YWlscyB0aGlzIHByb2Nlc3MKK2luIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX2VtYmVkIi8+LiA8Y2xhc3NuYW1lPgorQXR0cmlidXRlT3ZlcnJpZGU8L2NsYXNzbmFtZT5zIHN1ZmZpY2UgZm9yIHNpbXBsZSBtYXBwaW5ncywgYnV0IGRvIG5vdCBhbGxvdworeW91IHRvIG92ZXJyaWRlIGNvbXBsZXggbWFwcGluZ3MuIEFsc28sIEpQQSBoYXMgbm8gd2F5IHRvIGRpZmZlcmVudGl0YXRlIGJldHdlZW4KK2EgbnVsbCBlbWJlZGRlZCBvYmplY3QgYW5kIG9uZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgb2YgaXRzIGZpZWxkcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBvdmVyY29tZXMgdGhlc2Ugc2hvcnRjb21pbmdzIHdpdGggdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VtYmVkZGVkTWFwcGluZy5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuRW1iZWRkZWRNYXBwaW5nPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBhbm5vdGF0aW9uLiBUaGlzIGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBudWxsSW5kaWNhdG9yQ29sdW1uTmFtZTwvbGl0ZXJhbD46IElmIHRoZSBuYW1lZCBjb2x1bW4ncyB2YWx1ZQoraXMgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4sIHRoZW4gdGhlIGVtYmVkZGVkIG9iamVjdCBpcyBhc3N1bWVkIHRvIGJlIG51bGwuIElmCit0aGUgbmFtZWQgY29sdW1uIGhhcyBhIG5vbi0gPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4gdmFsdWUsIHRoZW4gdGhlIGVtYmVkZGVkCitvYmplY3Qgd2lsbCBnZXQgbG9hZGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIG90aGVyIGVtYmVkZGVkIGZpZWxkcy4KK1RoaXMgcHJvcGVydHkgaXMgZW50aXJlbHkgb3B0aW9uYWwuIEJ5IGRlZmF1bHQsIE9wZW5KUEEgYWx3YXlzIGFzc3VtZXMgdGhlCitlbWJlZGRlZCBvYmplY3QgaXMgbm9uLW51bGwsIGp1c3QgYXMgaW4gc3RhbmRhcmQgSlBBIG1hcHBpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJZiB0aGUgY29sdW1uIHlvdSBuYW1lIGRvZXMgbm90IGJlbG9uZyB0byBhbnkgZmllbGRzIG9mIHRoZSBlbWJlZGRlZCBvYmplY3QsCitPcGVuSlBBIHdpbGwgY3JlYXRlIGEgc3ludGhldGljIG51bGwtaW5kaWNhdG9yIGNvbHVtbiB3aXRoIHRoaXMgbmFtZS4gSW4gZmFjdCwKK3lvdSBjYW4gc3BlY2lmeSBhIHZhbHVlIG9mIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IHRvIHNpbXBseSBpbmRpY2F0ZSB0aGF0IHlvdQord2FudCBhIHN5bnRoZXRpYyBudWxsLWluZGljYXRvciBjb2x1bW4sIHdpdGhvdXQgaGF2aW5nIHRvIGNvbWUgdXAgd2l0aCBhIG5hbWUKK2ZvciBpdC4gQSB2YWx1ZSBvZiA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4gc2lnbmFscyB0aGF0IHlvdSBleHBsaWNpdGx5IGRvIG5vdAord2FudCBhIG51bGwtaW5kaWNhdG9yIGNvbHVtbiBjcmVhdGVkIGZvciB0aGlzIG1hcHBpbmcgKGluIGNhc2UgeW91IGhhdmUKK2NvbmZpZ3VyZWQgeW91ciA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19kZWZhdWx0cyI+bWFwcGluZyBkZWZhdWx0cworPC9saW5rPiB0byBjcmVhdGUgb25lIGJ5IGRlZmF1bHQpLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG51bGxJbmRpY2F0b3JGaWVsZE5hbWU8L2xpdGVyYWw+OiBSYXRoZXIgdGhhbiBuYW1lIGEgbnVsbAoraW5kaWNhdG9yIGNvbHVtbiwgeW91IGNhbiBuYW1lIGEgZmllbGQgb2YgdGhlIGVtYmVkZGVkIHR5cGUuIE9wZW5KUEEgd2lsbCB1c2UKK3RoZSBjb2x1bW4gb2YgdGhpcyBmaWVsZCBhcyB0aGUgbnVsbC1pbmRpY2F0b3IgY29sdW1uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+TWFwcGluZ092ZXJyaWRlW10gb3ZlcnJpZGVzPC9saXRlcmFsPjogVGhpcyBhcnJheSBhbGxvd3MgeW91IHRvCitvdmVycmlkZSBhbnkgbWFwcGluZyBvZiB0aGUgZW1iZWRkZWQgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitUaGUgPGNsYXNzbmFtZT5FbWJlZGRlZE1hcHBpbmc8L2NsYXNzbmFtZT4ncyA8bGl0ZXJhbD5vdmVycmlkZXM8L2xpdGVyYWw+IGFycmF5CitzZXJ2ZXMgdGhlIHNhbWUgcHVycG9zZSBhcyBzdGFuZGFyZCBKUEEncyA8Y2xhc3NuYW1lPkF0dHJpYnV0ZU92ZXJyaWRlCis8L2NsYXNzbmFtZT5zIGFuZCA8Y2xhc3NuYW1lPkFzc29jaWF0aW9uT3ZlcnJpZGU8L2NsYXNzbmFtZT4gcy4gSW4gZmFjdCwgeW91IGNhbgorYWxzbyB1c2UgdGhlIDxjbGFzc25hbWU+TWFwcGluZ092ZXJyaWRlPC9jbGFzc25hbWU+IGFubm90YXRpb24gb24gYW4gZW50aXR5CitjbGFzcyB0byBvdmVycmlkZSBhIGNvbXBsZXggbWFwcGluZyBvZiBpdHMgbWFwcGVkIHN1cGVyY2xhc3MsIGp1c3QgYXMgeW91IGNhbgord2l0aCA8Y2xhc3NuYW1lPiBBdHRyaWJ1dGVPdmVycmlkZTwvY2xhc3NuYW1lPiBhbmQgPGNsYXNzbmFtZT4KK0Fzc29jaWF0aW9uT3ZlcnJpZGU8L2NsYXNzbmFtZT4gcy4gVGhlIDxjbGFzc25hbWU+TWFwcGluZ092ZXJyaWRlczwvY2xhc3NuYW1lPgorYW5ub3RhdGlvbiwgd2hvc2UgdmFsdWUgaXMgYW4gYXJyYXkgb2YgPGNsYXNzbmFtZT5NYXBwaW5nT3ZlcnJpZGU8L2NsYXNzbmFtZT4gcywKK2FsbG93cyB5b3UgdG8gb3ZlcmlkZSBtdWx0aXBsZSBtYXBwZWQgc3VwZXJjbGFzcyBtYXBwaW5ncy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorRWFjaAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9NYXBwaW5nT3ZlcnJpZGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLk1hcHBpbmdPdmVycmlkZTwvY2xhc3NuYW1lPgorPC91bGluaz4gYW5ub3RhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdGhhdCBpcyBiZWluZyBvdmVycmlkZGVuLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q29sdW1uW10gY29sdW1uczwvbGl0ZXJhbD46IENvbHVtbnMgZm9yIHRoZSBuZXcgZmllbGQgbWFwcGluZy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlhKb2luQ29sdW1uW10gam9pbkNvbHVtbnM8L2xpdGVyYWw+OiBKb2luIGNvbHVtbnMgZm9yIHRoZSBuZXcgZmllbGQKK21hcHBpbmcsIGlmIGl0IGlzIGEgcmVsYXRpb24gZmllbGQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5Db250YWluZXJUYWJsZSBjb250YWluZXJUYWJsZTwvbGl0ZXJhbD46IFRhYmxlIGZvciB0aGUgbmV3IGNvbGxlY3Rpb24KK29yIG1hcCBmaWVsZCBtYXBwaW5nLiBXZSBjb3ZlciBjb2xsZWN0aW9uIG1hcHBpbmdzIGluCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbCIvPiwgYW5kIG1hcCBtYXBwaW5ncyBpbgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX21hcCIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkVsZW1lbnRKb2luQ29sdW1uW10gZWxlbWVudEpvaW5Db2x1bW5zPC9saXRlcmFsPjogRWxlbWVudCBqb2luIGNvbHVtbnMKK2ZvciB0aGUgbmV3IGNvbGxlY3Rpb24gb3IgbWFwIGZpZWxkIG1hcHBpbmcuIFlvdSB3aWxsIHNlZSBob3cgdG8gdXNlIGVsZW1lbnQKK2pvaW4gY29sdW1ucyBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbF9qb2luY29scyIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYW4gZW1iZWRkYWJsZSA8Y2xhc3NuYW1lPiBQYXRoQ29vcmRpbmF0ZQorPC9jbGFzc25hbWU+IGNsYXNzIHdpdGggYSBjdXN0b20gbWFwcGluZyBvZiBhIDxjbGFzc25hbWU+amF2YS5hd3QuUG9pbnQKKzwvY2xhc3NuYW1lPiBmaWVsZCB0byB0d28gY29sdW1ucy4gSXQgdGhlbiBkZWZpbmVzIGFuIGVudGl0eSB3aGljaCBlbWJlZHMgYQorPGNsYXNzbmFtZT4gUG9pbnRDb29yZGluYXRlPC9jbGFzc25hbWU+IGFuZCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbWFwcGluZyBmb3IKK3RoZSBwb2ludCBmaWVsZC4gVGhlIGVudGl0eSBhbHNvIGRlY2xhcmVzIHRoYXQgaWYgdGhlIDxjbGFzc25hbWU+UGF0aENvb3JkaW5hdGUKKzwvY2xhc3NuYW1lPidzIDxsaXRlcmFsPnNpdGVOYW1lPC9saXRlcmFsPiBmaWVsZCBjb2x1bW4gaXMgbnVsbCwgaXQgbWVhbnMgdGhhdAorbm8gPGNsYXNzbmFtZT5QYXRoQ29vcmRpbmF0ZTwvY2xhc3NuYW1lPiBpcyBzdG9yZWQgaW4gdGhlIGVtYmVkZGVkIHJlY29yZDsgdGhlCitvd25pbmcgZmllbGQgd2lsbCBsb2FkIGFzIG51bGwuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX2VtYmVkZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGluZyBDb21wbGV4IE1hcHBpbmdzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy4qOworCitARW1iZWRkYWJsZQorcHVibGljIGNsYXNzIFBhdGhDb29yZGluYXRlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHNpdGVOYW1lOworCisgICAgQFBlcnNpc3RlbnQKKyAgICBAU3RyYXRlZ3koImNvbS54eXoub3BlbmpwYS5Qb2ludFZhbHVlSGFuZGxlciIpCisgICAgcHJpdmF0ZSBQb2ludCBwb2ludDsKKworICAgIC4uLgorfQorCitARW50aXR5CitwdWJsaWMgY2xhc3MgUGF0aCB7CisKKyAgICBARW1iZWRkZWQKKyAgICBARW1iZWRkZWRNYXBwaW5nKG51bGxJbmRpY2F0b3JGaWVsZE5hbWU9InNpdGVOYW1lIiwgb3ZlcnJpZGVzPXsKKyAgICAgICAgQE1hcHBpbmdPdmVycmlkZShuYW1lPSJzaXRlTmFtZSIsIGNvbHVtbnM9QENvbHVtbihuYW1lPSJTVEFSVF9TSVRFIikpLAorICAgICAgICBATWFwcGluZ092ZXJyaWRlKG5hbWU9InBvaW50IiwgY29sdW1ucz17CisgICAgICAgICAgICBAQ29sdW1uKG5hbWU9IlNUQVJUX1giKSwKKyAgICAgICAgICAgIEBDb2x1bW4obmFtZT0iU1RBUlRfWSIpCisgICAgICAgIH0pCisgICAgfSkKKyAgICBwcml2YXRlIFBhdGhDb29yZGluYXRlIHN0YXJ0OworCisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb2xsIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0luIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tZXRhX2pwYV9wZXJzaXN0ZW50X2NvbGwiLz4sIHdlIGV4cGxvcmVkIHRoZQorPGNsYXNzbmFtZT5QZXJzaXN0ZW50Q29sbGVjdGlvbjwvY2xhc3NuYW1lPiBhbm5vdGF0aW9uIGZvciBwZXJzaXN0ZW50IGNvbGxlY3Rpb24KK2ZpZWxkcyB0aGF0IGFyZW4ndCBhIHN0YW5kYXJkIDxsaXRlcmFsPk9uZVRvTWFueTwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+CitNYW55VG9NYW55PC9saXRlcmFsPiByZWxhdGlvbi4gVG8gbWFwIHRoZXNlIG5vbi1zdGFuZGFyZCBjb2xsZWN0aW9ucywgY29tYmluZQorT3BlbkpQQSdzIDxjbGFzc25hbWU+Q29udGFpbmVyVGFibGU8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiB3aXRoCis8Y2xhc3NuYW1lPkVsZW1lbnRKb2luQ29sdW1uPC9jbGFzc25hbWU+cy4KK1dlIGV4cGxvcmUgdGhlIGFubm90YXRpb25zIGJlbG93LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb2xsX3RhYmxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBUYWJsZQorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbF90YWJsZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyVGFibGUKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0NvbnRhaW5lclRhYmxlLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5Db250YWluZXJUYWJsZTwvY2xhc3NuYW1lPgorPC91bGluaz4gYW5ub3RhdGlvbiBkZXNjcmliZXMgYSBkYXRhYmFzZSB0YWJsZSB0aGF0IGhvbGRzIGNvbGxlY3Rpb24gKG9yIG1hcCkKK2VsZW1lbnRzLiBUaGlzIGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgbmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgY2F0YWxvZzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgc2NoZW1hPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlhKb2luQ29sdW1uW10gam9pbkNvbHVtbnM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Rm9yZWlnbktleSBqb2luRm9yZWlnbktleTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5JbmRleCBqb2luSW5kZXg8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPmNhdGFsb2c8L2xpdGVyYWw+LCA8bGl0ZXJhbD5zY2hlbWEKKzwvbGl0ZXJhbD4sIGFuZCA8bGl0ZXJhbD5qb2luQ29sdW1uczwvbGl0ZXJhbD4gcHJvcGVydGllcyBkZXNjcmliZSB0aGUgY29udGFpbmVyCit0YWJsZSBhbmQgaG93IGl0IGpvaW5zIHRvIHRoZSBvd25pbmcgZW50aXR5J3MgdGFibGUuIFRoZXNlIHByb3BlcnRpZXMgY29ycmVzcG9uZAordG8gdGhlIHNhbWUtbmFtZWQgcHJvcGVydGllcyBvbiB0aGUgc3RhbmRhcmQgPGNsYXNzbmFtZT4gSm9pblRhYmxlPC9jbGFzc25hbWU+Cithbm5vdGF0aW9uLCBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfYXNzb2Njb2xsIi8+CisuIElmIGxlZnQgdW5zcGVjaWZpZWQsIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBkZWZhdWx0cyB0byB0aGUgZmlyc3QgZml2ZQorY2hhcmFjdGVycyBvZiB0aGUgZW50aXR5IHRhYmxlIG5hbWUsIHBsdXMgYW4gdW5kZXJzY29yZSwgcGx1cyB0aGUgZmllbGQgbmFtZS4KK1RoZSA8bGl0ZXJhbD5qb2luRm9yZWlnbktleTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPiBqb2luSW5kZXg8L2xpdGVyYWw+Citwcm9wZXJ0aWVzIG92ZXJyaWRlIGRlZmF1bHQgZm9yZWlnbiBrZXkgYW5kIGluZGV4IGdlbmVyYXRpb24gZm9yIHRoZSBqb2luCitjb2x1bW5zLiBXZSBleHBsb3JlIGZvcmVpZ24ga2V5cyBhbmQgaW5kZXhlcyBsYXRlciBpbiB0aGlzIGNoYXB0ZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IG1heSBub3RpY2UgdGhhdCB0aGUgY29udGFpbmVyIHRhYmxlIGRvZXMgbm90IGRlZmluZSBob3cgdG8gc3RvcmUgdGhlCitjb2xsZWN0aW9uIGVsZW1lbnRzLiBUaGF0IGlzIGxlZnQgdG8gc2VwYXJhdGUgYW5ub3RhdGlvbnMsIHdoaWNoIGFyZSB0aGUgc3ViamVjdAorb2YgdGhlIG5leHQgc2VjdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb2xsX2pvaW5jb2xzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgSm9pbiBDb2x1bW5zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb2xsX2pvaW5jb2xzIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50Sm9pbkNvbHVtbgorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitFbGVtZW50IGpvaW4gY29sdW1ucyBhcmUgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBKUEEgam9pbiBjb2x1bW5zLCBleGNlcHQgdGhhdAordGhleSByZXByZXNlbnQgYSBqb2luIHRvIGEgY29sbGVjdGlvbiBvciBtYXAgZWxlbWVudCBlbnRpdHkgcmF0aGVyIHRoYW4gYSBkaXJlY3QKK3JlbGF0aW9uLiBZb3UgcmVwcmVzZW50IGFuIGVsZW1lbnQgam9pbiBjb2x1bW4gd2l0aCBPcGVuSlBBJ3MKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudEpvaW5Db2x1bW4uaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLkVsZW1lbnRKb2luQ29sdW1uPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBhbm5vdGF0aW9uLiBUbyBkZWNsYXJlIGEgY29tcG91bmQgam9pbiwgZW5jbG9zZSBhbiBhcnJheSBvZiA8Y2xhc3NuYW1lPgorRWxlbWVudEpvaW5Db2x1bW48L2NsYXNzbmFtZT5zIGluIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9FbGVtZW50Sm9pbkNvbHVtbnMuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLkVsZW1lbnRKb2luQ29sdW1uczwvY2xhc3NuYW1lPgorPC91bGluaz4gYW5ub3RhdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBbiA8Y2xhc3NuYW1lPkVsZW1lbnRKb2luQ29sdW1uPC9jbGFzc25hbWU+IGFsd2F5cyByZXNpZGVzIGluIGEgY29udGFpbmVyIHRhYmxlLAorc28gaXQgZG9lcyBub3QgaGF2ZSB0aGUgPGxpdGVyYWw+IHRhYmxlPC9saXRlcmFsPiBwcm9wZXJ0eSBvZiBhIHN0YW5kYXJkCis8Y2xhc3NuYW1lPiBKb2luQ29sdW1uPC9jbGFzc25hbWU+LiBMaWtlIDxjbGFzc25hbWU+IFhKb2luQ29sdW1uPC9jbGFzc25hbWU+cworYWJvdmUsIDxjbGFzc25hbWU+IEVsZW1lbnRKb2luQ29sdW1uPC9jbGFzc25hbWU+cyBjYW4gcmVmZXJlbmNlIGEgbGlua2VkCithdHRyaWJ1dGUgcmF0aGVyIHRoYW4gYSBzdGF0aWMgbGlua2VkIGNvbHVtbi4gT3RoZXJ3aXNlLCB0aGUgPGNsYXNzbmFtZT4KK0VsZW1lbnRKb2luQ29sdW1uPC9jbGFzc25hbWU+IGFuZCBzdGFuZGFyZCA8Y2xhc3NuYW1lPkpvaW5Db2x1bW48L2NsYXNzbmFtZT4KK2Fubm90YXRpb25zIGFyZSBlcXVpdmFsZW50LiBTZWUgPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfcmVsIi8+CitpbiB0aGUgSlBBIE92ZXJ2aWV3IGZvciBhIHJldmlldyBvZiB0aGUgPGNsYXNzbmFtZT5Kb2luQ29sdW1uPC9jbGFzc25hbWU+Cithbm5vdGF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbF9vcmRlciI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBPcmRlciBDb2x1bW4KKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX2NvbGxfb3JkZXIiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyQ29sdW1uCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1JlbGF0aW9uYWwgZGF0YWJhc2VzIGRvIG5vdCBndWFyYW50ZWUgdGhhdCByZWNvcmRzIGFyZSByZXR1cm5lZCBpbiBpbnNlcnRpb24KK29yZGVyLiBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIGNvbGxlY3Rpb24gZWxlbWVudHMgYXJlIGxvYWRlZCBpbiB0aGUKK3NhbWUgb3JkZXIgdGhleSB3ZXJlIGluIHdoZW4gbGFzdCBzdG9yZWQsIHlvdSBtdXN0IGRlY2xhcmUgYW4gb3JkZXIgY29sdW1uLgorT3BlbkpQQSdzCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL09yZGVyQ29sdW1uIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuT3JkZXJDb2x1bW48L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogRGVmYXVsdHMgdG8gPGxpdGVyYWw+T1JEUjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBlbmFibGVkPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmludCBwcmVjaXNpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIGNvbHVtbkRlZmluaXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBpbnNlcnRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gdXBkYXRhYmxlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3JkZXIgY29sdW1ucyBhcmUgYWx3YXlzIGluIHRoZSBjb250YWluZXIgdGFibGUuIFlvdSBjYW4gZXhwbGljaXRseSB0dXJuIG9mZgorb3JkZXJpbmcgKGlmIHlvdSBoYXZlIGVuYWJsZWQgaXQgYnkgZGVmYXVsdCB2aWEgeW91cgorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfZGVmYXVsdHMiPiBtYXBwaW5nIGRlZmF1bHRzPC9saW5rPikgYnkgc2V0dGluZwordGhlIDxsaXRlcmFsPmVuYWJsZWQ8L2xpdGVyYWw+IHByb3BlcnR5IHRvIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4gQWxsIG90aGVyCitwcm9wZXJ0aWVzIGNvcnJlc3BvbmQgZXhhY3RseSB0byB0aGUgc2FtZS1uYW1lZCBwcm9wZXJ0aWVzIG9uIHRoZSBzdGFuZGFyZAorPGNsYXNzbmFtZT5Db2x1bW48L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiwgZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZ19jb2x1bW4iLz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfb25lbWFueSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgT25lLVNpZGVkIE9uZS1NYW55IE1hcHBpbmcKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9vbmVtYW55Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgSlBBIG9uZS1zaWRlZCBvbmUtbWFueQorICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHByZXZpb3VzIHNlY3Rpb24gY292ZXJlZCB0aGUgdXNlIG9mIDxjbGFzc25hbWU+RWxlbWVudEpvaW5Db2x1bW48L2NsYXNzbmFtZT4KK2Fubm90YXRpb25zIGluIGNvbmp1bmN0aW9uIHdpdGggYSA8Y2xhc3NuYW1lPkNvbnRhaW5lclRhYmxlPC9jbGFzc25hbWU+IGZvcgorbWFwcGluZyBjb2xsZWN0aW9ucyB0byBkZWRpY2F0ZSB0YWJsZXMuIDxjbGFzc25hbWU+RWxlbWVudEpvaW5Db2x1bW48L2NsYXNzbmFtZT4KK3MsIGhvd2V2ZXIsIGhhdmUgb25lIGFkZGl0aW9uYWwgdXNlOiB0byBjcmVhdGUgYSBvbmUtc2lkZWQgb25lLW1hbnkgbWFwcGluZy4KK1N0YW5kYXJkIEpQQSBzdXBwb3J0cyA8Y2xhc3NuYW1lPk9uZVRvTWFueTwvY2xhc3NuYW1lPiBmaWVsZHMgd2l0aG91dCBhCis8bGl0ZXJhbD5tYXBwZWRCeTwvbGl0ZXJhbD4gaW52ZXJzZSwgYnV0IG9ubHkgYnkgbWFwcGluZyB0aGVzZSBmaWVsZHMgdG8gYQorPGNsYXNzbmFtZT5Kb2luVGFibGU8L2NsYXNzbmFtZT4gKHNlZQorPHhyZWYgbGlua2VuZD0ianBhX292ZXJ2aWV3X21hcHBpbmdfYXNzb2Njb2xsIi8+IGluIHRoZSBKUEEgT3ZlcnZpZXcgZm9yCitkZXRhaWxzKS4gT2Z0ZW4sIHlvdSdkIGxpa2UgdG8gY3JlYXRlIGEgb25lLW1hbnkgYXNzb2NpYXRpb24gYmFzZWQgb24gYW4gaW52ZXJzZQorZm9yZWlnbiBrZXkgKGxvZ2ljYWwgb3IgYWN0dWFsKSBpbiB0aGUgdGFibGUgb2YgdGhlIHJlbGF0ZWQgdHlwZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gUE5HIGltYWdlIGRhdGEsIDM5MiB4IDE5MiAoc2VlIFJFQURNRSkgLS0+CisgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1nL2ludi1rZXktY29sbC5wbmciIHdpZHRoPSIyNjEiLz4KKworICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICAgICAgPHBhcmE+CitDb25zaWRlciB0aGUgbW9kZWwgYWJvdmUuIDxjbGFzc25hbWU+U3Vic2NyaXB0aW9uPC9jbGFzc25hbWU+IGhhcyBhIGNvbGxlY3Rpb24KK29mIDxjbGFzc25hbWU+TGluZUl0ZW08L2NsYXNzbmFtZT4gcywgYnV0IDxjbGFzc25hbWU+TGluZUl0ZW08L2NsYXNzbmFtZT4gaGFzCitubyBpbnZlcnNlIHJlbGF0aW9uIHRvIDxjbGFzc25hbWU+U3Vic2NyaXB0aW9uPC9jbGFzc25hbWU+LiBUbyByZXRyaWV2ZSBhbGwgb2YKK3RoZSA8Y2xhc3NuYW1lPkxpbmVJdGVtPC9jbGFzc25hbWU+IHJlY29yZHMgZm9yIGEgPGNsYXNzbmFtZT5TdWJzY3JpcHRpb24KKzwvY2xhc3NuYW1lPiwgd2Ugam9pbiB0aGUgPGxpdGVyYWw+U1VCX0lEPC9saXRlcmFsPiBpbnZlcnNlIGZvcmVpZ24ga2V5IGNvbHVtbgoraW4gdGhlIDxsaXRlcmFsPkxJTkVfSVRFTTwvbGl0ZXJhbD4gdGFibGUgdG8gdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUKKzxsaXRlcmFsPlNVQjwvbGl0ZXJhbD4gdGFibGUuIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyB0byByZXByZXNlbnQgdGhpcworbW9kZWwgaW4gbWFwcGluZyBhbm5vdGF0aW9ucy4gTm90ZSB0aGF0IE9wZW5KUEEgYXV0b21hdGljYWxseSBhc3N1bWVzIGFuIGludmVyc2UKK2ZvcmVpZ24ga2V5IG1hcHBpbmcgd2hlbiBlbGVtZW50IGpvaW4gY29sdW1ucyBhcmUgZ2l2ZW4sIGJ1dCBubyBjb250YWluZXIgb3IKK2pvaW4gdGFibGUgaXMgZ2l2ZW4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX29uZW1hbnlleCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBPbmUtU2lkZWQgT25lLU1hbnkgTWFwcGluZworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwYWNrYWdlIG9yZy5tYWcuc3Vic2NyaWJlOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuKjsKKworQEVudGl0eQorQFRhYmxlKG5hbWU9IkxJTkVfSVRFTSIsIHNjaGVtYT0iQ05UUkNUIikKK3B1YmxpYyBjbGFzcyBMaW5lSXRlbSB7CisgICAgLi4uCit9CisKK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJTVUIiLCBzY2hlbWE9IkNOVFJDVCIpCitwdWJsaWMgY2xhc3MgU3Vic2NyaXB0aW9uIHsKKworICAgIEBJZCBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICBAT25lVG9NYW55CisgICAgQEVsZW1lbnRKb2luQ29sdW1uKG5hbWU9IlNVQl9JRCIsIHRhcmdldD0iSUQiKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtMaW5lSXRlbSZndDsgaXRlbXM7CisKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9tYXAiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE1hcHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9tYXAiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG1hcHMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitXZSBkZXRhaWxlZCB0aGUgPGxpdGVyYWw+Q29udGFpbmVyVGFibGU8L2xpdGVyYWw+IGFubm90YXRpb24gaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb2xsX3RhYmxlIi8+LiBDdXN0b20gbWFwIG1hcHBpbmdzIG1heSAKK2Fsc28gdXNlIHRoaXMgYW5ub3RhdGlvbiB0byByZXByZXNlbnQgYSBtYXAgdGFibGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9jb25zdHJhaW50cyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgSW5kZXhlcyBhbmQgQ29uc3RyYWludHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgdXNlcyBpbmRleCBpbmZvcm1hdGlvbiBkdXJpbmcgc2NoZW1hIGdlbmVyYXRpb24gdG8gaW5kZXggdGhlIHByb3BlcgorY29sdW1ucy4gT3BlbkpQQSB1c2VzIGZvcmVpZ24ga2V5IGFuZCB1bmlxdWUgY29uc3RyYWludCBpbmZvcm1hdGlvbiBkdXJpbmcKK3NjaGVtYSBjcmVhdGlvbiB0byBnZW5lcmF0ZSB0aGUgcHJvcGVyIGRhdGFiYXNlIGNvbnN0cmFpbnRzLCBhbmQgYWxzbyBhdCBydW50aW1lCit0byBvcmRlciBTUUwgc3RhdGVtZW50cyB0byBhdm9pZCBjb25zdHJhaW50IHZpb2xhdGlvbnMgd2hpbGUgbWF4aW1pemluZyBTUUwKK2JhdGNoIHNpemUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYXNzdW1lcyBjZXJ0YWluIGNvbHVtbnMgaGF2ZSBpbmRleGVzIG9yIGNvbnN0cmFpbnRzIGJhc2VkIG9uIHlvdXIKK21hcHBpbmcgZGVmYXVsdHMsIGFzIGRldGFpbGVkIGluIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2RlZmF1bHRzIi8+LiAKK1lvdSBjYW4gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdHMgb24gaW5kaXZpZHVhbCBqb2lucywgZmllbGQKK3ZhbHVlcywgY29sbGVjdGlvbiBlbGVtZW50cywgbWFwIGtleXMsIG9yIG1hcCB2YWx1ZXMgdXNpbmcgdGhlIGFubm90YXRpb25zCitwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfaW5kZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSW5kZXhlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9pbmRleCI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9JbmRleC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuSW5kZXg8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiByZXByZXNlbnRzIGFuIGluZGV4IG9uIHRoZSBjb2x1bW5zIG9mIGEgZmllbGQuIEl0IGlzIGFsc28gdXNlZCB3aXRoaW4KK3RoZSA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbF90YWJsZSI+PGNsYXNzbmFtZT5Db250YWluZXJUYWJsZQorPC9jbGFzc25hbWU+PC9saW5rPiBhbm5vdGF0aW9uIHRvIGluZGV4IGpvaW4gY29sdW1ucy4KK1RvIGluZGV4IHRoZSBjb2x1bW5zIG9mIGEgY29sbGVjdGlvbiBlbGVtZW50LCB1c2UgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VsZW1lbnRJbmRleC5odG1sIj4KKzxjbGFzc25hbWU+IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLkVsZW1lbnRJbmRleDwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uLiBUaGVzZSBhbm5vdGF0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGVuYWJsZWQ8L2xpdGVyYWw+OiBTZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD5mYWxzZQorPC9saXRlcmFsPiB0byBleHBsaWNpdGx5IHRlbGwgT3BlbkpQQSBub3QgdG8gaW5kZXggdGhlc2UgY29sdW1ucywgd2hlbiBPcGVuSlBBCit3b3VsZCBvdGhlcndpc2UgZG8gc28uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U3RyaW5nIG5hbWU8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgaW5kZXguIE9wZW5KUEEgd2lsbCBjaG9vc2UgYQorbmFtZSBpZiB5b3UgZG8gbm90IHByb3ZpZGUgb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gdW5pcXVlPC9saXRlcmFsPjogV2hldGhlciB0byBjcmVhdGUgYSB1bmlxdWUgaW5kZXguIERlZmF1bHRzCit0byBmYWxzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfZmsiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRm9yZWlnbiBLZXlzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tYXBwaW5nX2pwYV9mayI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleXMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfZmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ24ga2V5cworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Gb3JlaWduS2V5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5Gb3JlaWduS2V5PC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24gcmVwcmVzZW50cyBhIGZvcmVpZ24ga2V5IG9uIHRoZSBjb2x1bW5zIG9mIGEgZmllbGQuIEl0IGlzIGFsc28gdXNlZAord2l0aGluIHRoZSA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfY29sbF90YWJsZSI+PGNsYXNzbmFtZT4KK0NvbnRhaW5lclRhYmxlPC9jbGFzc25hbWU+PC9saW5rPiBhbm5vdGF0aW9uIHRvIHNldCBhIGRhdGFiYXNlIGZvcmVpZ24ga2V5IG9uCitqb2luIGNvbHVtbnMuICBUbyBzZXQgYSBjb25zdHJhaW50IHRvIHRoZSBjb2x1bW5zIG9mIGEgY29sbGVjdGlvbiBlbGVtZW50LCB1c2UgCit0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudEZvcmVpZ25LZXkuaHRtbCI+Cis8Y2xhc3NuYW1lPiBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5FbGVtZW50Rm9yZWlnbktleTwvY2xhc3NuYW1lPgorPC91bGluaz4gYW5ub3RhdGlvbi4gVGhlc2UgYW5ub3RhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBlbmFibGVkPC9saXRlcmFsPjogU2V0IHRoaXMgcHJvcGVydHkgdG8gPGxpdGVyYWw+ZmFsc2UKKzwvbGl0ZXJhbD4gdG8gZXhwbGljaXRseSB0ZWxsIE9wZW5KUEEgbm90IHRvIHNldCBhIGZvcmVpZ24ga2V5IG9uIHRoZXNlIGNvbHVtbnMsCit3aGVuIE9wZW5KUEEgd291bGQgb3RoZXJ3aXNlIGRvIHNvLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGZvcmVpZ24ga2V5LiBPcGVuSlBBIHdpbGwKK2Nob29zZSBhIG5hbWUgaWYgeW91IGRvIG5vdCBwcm92aWRlIG9uZSwgb3Igd2lsbCBjcmVhdGUgYW4gYW5vbnltb3VzIGtleS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGRlZmVycmVkPC9saXRlcmFsPjogV2hldGhlciB0byBjcmVhdGUgYSBkZWZlcnJlZCBrZXkgaWYKK3N1cHBvcnRlZCBieSB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Rm9yZWlnbktleUFjdGlvbiBkZWxldGVBY3Rpb248L2xpdGVyYWw+OiBWYWx1ZSBmcm9tIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9Gb3JlaWduS2V5QWN0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5Gb3JlaWduS2V5QWN0aW9uPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBlbnVtIGlkZW50aWZ5aW5nIHRoZSBkZXNpcmVkIGRlbGV0ZSBhY3Rpb24uIERlZmF1bHRzIHRvIDxsaXRlcmFsPgorUkVTVFJJQ1Q8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkZvcmVpZ25LZXlBY3Rpb24gdXBkYXRlQWN0aW9uPC9saXRlcmFsPjogVmFsdWUgZnJvbSB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRm9yZWlnbktleUFjdGlvbi5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuRm9yZWlnbktleUFjdGlvbjwvY2xhc3NuYW1lPgorPC91bGluaz4gZW51bSBpZGVudGlmeWluZyB0aGUgZGVzaXJlZCB1cGRhdGUgYWN0aW9uLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK1JFU1RSSUNUPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0tlZXAgaW4gbWluZCB0aGF0IE9wZW5KUEEgdXNlcyBmb3JlaWduIGtleSBpbmZvcm1hdGlvbiBhdCBydW50aW1lIHRvIGF2b2lkCitjb25zdHJhaW50IHZpb2xhdGlvbnM7IGl0IGlzIGltcG9ydGFudCwgdGhlcmVmb3JlLCB0aGF0IHlvdXIKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2RlZmF1bHRzIj5tYXBwaW5nIGRlZmF1bHRzPC9saW5rPiBhbmQgZm9yZWlnbgora2V5IGFubm90YXRpb25zIGNvbWJpbmUgdG8gYWNjdXJhdGVseSByZWZsZWN0IHlvdXIgZXhpc3RpbmcgZGF0YWJhc2UKK2NvbnN0cmFpbnRzLCBvciB0aGF0ICB5b3UgY29uZmlndXJlIE9wZW5KUEEgdG8gcmVmbGVjdCBvbiB5b3VyIGRhdGFiYXNlIHNjaGVtYQordG8gZGlzY292ZXIgZXhpc3RpbmcgZm9yZWlnbiBrZXlzIChzZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9zY2hlbWFfaW5mb19mYWN0b3J5Ii8+KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX3VuaXF1ZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVbmlxdWUgQ29uc3RyYWludHMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfanBhX3VuaXF1ZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUgY29uc3RyYWludHMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfdW5pcXVlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUgY29uc3RyYWludHMKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvVW5pcXVlLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5VbmlxdWU8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiByZXByZXNlbnRzIGEgdW5xaXVlIGNvbnN0cmFpbnQgb24gdGhlIGNvbHVtbnMgb2YgYSBmaWVsZC4gSXQgaXMgbW9yZQorY29udmVuaWVudCB0aGFuIHVzaW5nIHRoZSA8bGl0ZXJhbD51bmlxdWVDb25zdHJhaW50czwvbGl0ZXJhbD4gcHJvcGVydHkgb2YKK3N0YW5kYXJkIEpQQSA8Y2xhc3NuYW1lPlRhYmxlPC9jbGFzc25hbWU+IGFuZCA8Y2xhc3NuYW1lPlNlY29uZGFyeVRhYmxlCis8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbnMsIGJlY2F1c2UgeW91IGNhbiBhcHBseSBpdCBkaXJlY3RseSB0byB0aGUgY29uc3RyYWluZWQKK2ZpZWxkLiBUaGUgPGNsYXNzbmFtZT5VbmlxdWU8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBoYXMgdGhlIGZvbGxvd2luZworcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGVuYWJsZWQ8L2xpdGVyYWw+OiBTZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD5mYWxzZQorPC9saXRlcmFsPiB0byBleHBsaWNpdGx5IHRlbGwgT3BlbkpQQSBub3QgdG8gY29uc3RyYWluIHRoZXNlIGNvbHVtbnMsIHdoZW4KK09wZW5KUEEgd291bGQgb3RoZXJ3aXNlIGRvIHNvLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQuIE9wZW5KUEEgd2lsbCBjaG9vc2UKK2EgbmFtZSBpZiB5b3UgZG8gbm90IHByb3ZpZGUgb25lLCBvciB3aWxsIGNyZWF0ZSBhbiBhbm9ueW1vdXMgY29uc3RyYWludC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGRlZmVycmVkPC9saXRlcmFsPjogV2hldGhlciB0byBjcmVhdGUgYSBkZWZlcnJlZCBjb25zdHJhaW50IGlmCitzdXBwb3J0ZWQgYnkgdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19saW1pdHMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBNYXBwaW5nIExpbWl0YXRpb25zCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfbGltaXRzIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbGltaXRhdGlvbnMKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitUaGUgZm9sbG93aW5nIHNlY3Rpb25zIG91dGxpbmUgdGhlIGxpbWl0YXRpb25zIE9wZW5KUEEgcGxhY2VzIG9uIHNwZWNpZmljCittYXBwaW5nIHN0cmF0ZWdpZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2xpbWl0c190cGMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFRhYmxlIFBlciBDbGFzcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfbGltaXRzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBsaW1pdGF0aW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgdGFibGUtcGVyLWNsYXNzCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitUYWJsZS1wZXItY2xhc3MgaW5oZXJpdGFuY2UgbWFwcGluZyBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW5ub3QgdHJhdmVyc2UgcG9seW1vcnBoaWMgcmVsYXRpb25zIHRvIG5vbi1sZWFmIGNsYXNzZXMgaW4gYQordGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBpbiBxdWVyaWVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbm5vdCBtYXAgYSBvbmUtc2lkZWQgcG9seW1vcnBoaWMgcmVsYXRpb24gdG8gYSBub24tbGVhZiBjbGFzcyBpbiBhCit0YWJsZS1wZXItY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IHVzaW5nIGFuIGludmVyc2UgZm9yZWlnbiBrZXkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2Fubm90IHVzZSBhbiBvcmRlciBjb2x1bW4gaW4gYSBwb2x5bW9ycGhpYyByZWxhdGlvbiB0byBhIG5vbi1sZWFmIGNsYXNzIGluCithIHRhYmxlLXBlci1jbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgbWFwcGVkIHdpdGggYW4gaW52ZXJzZSBmb3JlaWduIGtleS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RhYmxlLXBlci1jbGFzcyBoaWVyYXJjaGllcyBpbXBvc2UgbGltaXRhdGlvbnMgb24gZWFnZXIgZmV0Y2hpbmcuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BlcmZwYWNrX2VhZ2VyX2NvbnNpZGVyIi8+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitOb24tcG9seW1vcnBoaWMgcmVsYXRpb25zIGRvIG5vdCBzdWZmZXIgZnJvbSB0aGVzZSBsaW1pdGF0aW9ucy4gWW91IGNhbiBkZWNsYXJlCithIG5vbi1wb2x5bW9ycGhpYyByZWxhdGlvbiB1c2luZyB0aGUgZXh0ZW5zaW9ucyBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9Im5vbnBvbHltb3JwaGljIi8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21hcHBpbmdfZXh0Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgTWFwcGluZyBFeHRlbnNpb25zCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorTWFwcGluZyBleHRlbnNpb25zIGFsbG93IHlvdSB0byBhY2Nlc3MgT3BlbkpQQS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5IGZyb20geW91cgorbWFwcGluZ3MuIE5vdGUgdGhhdCBhbGwgZXh0ZW5zaW9ucyBiZWxvdyBhcmUgc3BlY2lmaWMgdG8gbWFwcGluZ3MuIElmIHlvdSBzdG9yZQoreW91ciBtYXBwaW5ncyBzZXBhcmF0ZWx5IGZyb20geW91ciBwZXJzaXN0ZW5jZSBtZXRhZGF0YSwgdGhlc2UgZXh0ZW5zaW9ucyBtdXN0CitiZSBzcGVjaWZpZWQgYWxvbmcgd2l0aCB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiwgbm90IHRoZSBwZXJzaXN0ZW5jZSBtZXRhZGF0YQoraW5mb3JtYXRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2V4dF9jbHMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIENsYXNzIEV4dGVuc2lvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGNsYXNzIGV4dGVuc2lvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ic3ViY2xhc3MtZmV0Y2gtbW9kZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBTdWJjbGFzcyBGZXRjaCBNb2RlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InN1YmNsYXNzLWZldGNoLW1vZGUiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3MgZmV0Y2ggbW9kZQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgZXh0ZW5zaW9uIHNwZWNpZmllcyBob3cgdG8gZWFnZXJseSBmZXRjaCBzdWJjbGFzcyBzdGF0ZS4gSXQgb3ZlcnJpZGVzIHRoZQorZ2xvYmFsIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5TdWJjbGFzc0ZldGNoTW9kZSI+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuU3ViY2xhc3NGZXRjaE1vZGU8L2xpdGVyYWw+PC9saW5rPiBwcm9wZXJ0eS4gU2V0IHRoZSBKUEEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvU3ViY2xhc3NGZXRjaE1vZGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlN1YmNsYXNzRmV0Y2hNb2RlPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBhbm5vdGF0aW9uIHRvIGEgdmFsdWUgZnJvbSB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWFnZXJGZXRjaFR5cGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLkVhZ2VyRmV0Y2hUeXBlPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBlbnVtOiA8bGl0ZXJhbD5KT0lOPC9saXRlcmFsPiwgPGxpdGVyYWw+UEFSQUxMRUw8L2xpdGVyYWw+LCBvcgorPGxpdGVyYWw+Tk9ORTwvbGl0ZXJhbD4uIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXIiLz4KKyBmb3IgYSBkaXNjdXNzaW9uIG9mIGVhZ2VyIGZldGNoaW5nLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJjbGFzcy1zdHJhdGVneSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBTdHJhdGVneQorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJzdHJhdGVneSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL1N0cmF0ZWd5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5TdHJhdGVneTwvY2xhc3NuYW1lPjwvdWxpbms+CitjbGFzcyBhbm5vdGF0aW9uIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGN1c3RvbSBtYXBwaW5nIHN0cmF0ZWd5IGZvciB5b3VyIGNsYXNzLgorU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbSIvPiBmb3IgaW5mb3JtYXRpb24gb24gY3VzdG9tCittYXBwaW5ncy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iZGlzY3JpbWluYXRvci1zdHJhdGVneSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBEaXNjcmltaW5hdG9yIFN0cmF0ZWd5CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InN0cmF0ZWd5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gbWFwcGluZworICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRGlzY3JpbWluYXRvclN0cmF0ZWd5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5EaXNjcmltaW5hdG9yU3RyYXRlZ3k8L2NsYXNzbmFtZT4KKzwvdWxpbms+IGNsYXNzIGFubm90YXRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgY3VzdG9tIGRpc2NyaW1pbmF0b3Igc3RyYXRlZ3kuCitTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfY3VzdG9tIi8+IGZvciBpbmZvcm1hdGlvbiBvbiBjdXN0b20KK21hcHBpbmdzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJ2ZXJzaW9uLXN0cmF0ZWd5Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gU3RyYXRlZ3kKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ic3RyYXRlZ3kiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9WZXJzaW9uU3RyYXRlZ3kuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlZlcnNpb25TdHJhdGVneTwvY2xhc3NuYW1lPgorPC91bGluaz4gY2xhc3MgYW5ub3RhdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjdXN0b20gdmVyc2lvbiBzdHJhdGVneS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b20iLz4gZm9yIGluZm9ybWF0aW9uIG9uIGN1c3RvbQorbWFwcGluZ3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19leHRfZmllbGQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEZpZWxkIEV4dGVuc2lvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGZpZWxkIGV4dGVuc2lvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iZWFnZXItZmV0Y2gtbW9kZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBFYWdlciBGZXRjaCBNb2RlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImVhZ2VyLWZldGNoLW1vZGUiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXIgZmV0Y2ggbW9kZQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgZXh0ZW5zaW9uIHNwZWNpZmllcyBob3cgdG8gZWFnZXJseSBmZXRjaCByZWxhdGVkIG9iamVjdHMuIEl0IG92ZXJyaWRlcyB0aGUKK2dsb2JhbCA8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuRWFnZXJGZXRjaE1vZGUiPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLkVhZ2VyRmV0Y2hNb2RlPC9saXRlcmFsPjwvbGluaz4gcHJvcGVydHkuIFNldCB0aGUgSlBBCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VhZ2VyRmV0Y2hNb2RlLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5FYWdlckZldGNoTW9kZTwvY2xhc3NuYW1lPgorPC91bGluaz4gYW5ub3RhdGlvbiB0byBhIHZhbHVlIGZyb20gdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VhZ2VyRmV0Y2hUeXBlLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5FYWdlckZldGNoVHlwZTwvY2xhc3NuYW1lPgorPC91bGluaz4gZW51bTogPGxpdGVyYWw+Sk9JTjwvbGl0ZXJhbD4sIDxsaXRlcmFsPlBBUkFMTEVMPC9saXRlcmFsPiwgb3IKKzxsaXRlcmFsPk5PTkU8L2xpdGVyYWw+LiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BlcmZwYWNrX2VhZ2VyIi8+CisgZm9yIGEgZGlzY3Vzc2lvbiBvZiBlYWdlciBmZXRjaGluZy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0ibm9ucG9seW1vcnBoaWMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgTm9ucG9seW1vcnBoaWMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ibm9ucG9seW1vcnBoaWMiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbm9ucG9seW1vcnBoaWMKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FsbCBmaWVsZHMgaW4gSmF2YSBhcmUgcG9seW1vcnBoaWMuIElmIHlvdSBkZWNsYXJlIGEgZmllbGQgb2YgdHlwZSA8bGl0ZXJhbD5UCis8L2xpdGVyYWw+LCB5b3UgY2FuIGFzc2lnbiBhbnkgc3ViY2xhc3Mgb2YgPGxpdGVyYWw+VDwvbGl0ZXJhbD4gdG8gdGhlIGZpZWxkIGFzCit3ZWxsLiBUaGlzIGlzIHZlcnkgY29udmVuaWVudCwgYnV0IGNhbiBtYWtlIHJlbGF0aW9uIHRyYXZlcnNhbCB2ZXJ5IGluZWZmaWNpZW50Cit1bmRlciBzb21lIGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMuIEl0IGNhbiBldmVuIG1ha2UgcXVlcnlpbmcgYWNyb3NzIHRoZSBmaWVsZAoraW1wb3NzaWJsZS4gT2Z0ZW4sIHlvdSBrbm93IHRoYXQgY2VydGFpbiBmaWVsZHMgZG8gbm90IG5lZWQgdG8gYmUgZW50aXJlbHkKK3BvbHltb3JwaGljLiBCeSB0ZWxsaW5nIE9wZW5KUEEgYWJvdXQgc3VjaCBmaWVsZHMsIHlvdSBjYW4gaW1wcm92ZSB0aGUKK2VmZmljaWVuY3kgb2YgeW91ciByZWxhdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxzbyBpbmNsdWRlcyB0aGUgPGxpdGVyYWw+dHlwZTwvbGl0ZXJhbD4gbWV0YWRhdGEgZXh0ZW5zaW9uIGZvcgorbmFycm93aW5nIHRoZSBkZWNsYXJlZCB0eXBlIG9mIGEgZmllbGQuIFNlZSA8eHJlZiBsaW5rZW5kPSJ0eXBlIi8+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyBmb3Igbm9ucG9seW1vcnBoaWMgdmFsdWVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvTm9ucG9seW1vcnBoaWMuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLk5vbnBvbHltb3JwaGljPC9jbGFzc25hbWU+Cis8L3VsaW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRWxlbWVudE5vbnBvbHltb3JwaGljLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5FbGVtZW50Tm9ucG9seW1vcnBoaWM8L2NsYXNzbmFtZT4KKzwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgdmFsdWUgb2YgdGhlc2UgZXh0ZW5zaW9ucyBpcyBhIGNvbnN0YW50IGZyb20gdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL05vbnBvbHltb3JwaGljVHlwZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuTm9ucG9seW1vcnBoaWNUeXBlPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBlbnVtZXJhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUsIDxsaXRlcmFsPkVYQUNUPC9saXRlcmFsPiwgaW5kaWNhdGVzCit0aGF0IHRoZSByZWxhdGlvbiB3aWxsIGFsd2F5cyBiZSBvZiB0aGUgZXhhY3QgZGVjbGFyZWQgdHlwZS4gQSB2YWx1ZSBvZgorPGxpdGVyYWw+Sk9JTkFCTEU8L2xpdGVyYWw+LCBvbiB0aGUgb3RoZXIgaGFuZCwgbWVhbnMgdGhhdCB0aGUgcmVsYXRpb24gbWlnaHQKK2JlIHRvIGFueSBqb2luYWJsZSBzdWJjbGFzcyBvZiB0aGUgZGVjbGFyZWQgdHlwZS4gVGhpcyB2YWx1ZSBvbmx5IGV4Y2x1ZGVzCit0YWJsZS1wZXItY2xhc3Mgc3ViY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iY2xhc3MtY3JpdGVyaWEiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgQ3JpdGVyaWEKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0iZWFnZXItZmV0Y2gtbW9kZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBjcml0ZXJpYQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5zCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImVhZ2VyLWZldGNoLW1vZGUiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5zCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGNyaXRlcmlhCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBmYW1pbHkgb2YgYm9vbGVhbiBleHRlbnNpb25zIGRldGVybWluZXMgd2hldGhlciBPcGVuSlBBIHdpbGwgdXNlIHRoZQorZXhwZWN0ZWQgY2xhc3Mgb2YgcmVsYXRlZCBvYmplY3RzIGFzIGNyaXRlcmlhIGluIHRoZSBTUUwgaXQgaXNzdWVzIHRvIGxvYWQgYQorcmVsYXRpb24gZmllbGQuIFR5cGljYWxseSwgdGhpcyBpcyBub3QgbmVlZGVkLiBUaGUgZm9yZWlnbiBrZXkgdmFsdWVzIHVuaXF1ZWx5CitpZGVudGlmeSB0aGUgcmVjb3JkIGZvciB0aGUgcmVsYXRlZCBvYmplY3QuIFVuZGVyIHNvbWUgcmFyZSBtYXBwaW5ncywgaG93ZXZlciwKK3lvdSBtYXkgbmVlZCB0byBjb25zaWRlciBib3RoIGZvcmVpZ24ga2V5IHZhbHVlcyBhbmQgdGhlIGV4cGVjdGVkIGNsYXNzIG9mIHRoZQorcmVsYXRlZCBvYmplY3QgLSBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gaW52ZXJzZSByZWxhdGlvbiB0aGF0IHNoYXJlcyB0aGUKK2ZvcmVpZ24ga2V5IHdpdGggYW5vdGhlciBpbnZlcnNlIHJlbGF0aW9uIHRvIGFuIG9iamVjdCBvZiBhIGRpZmZlcmVudCBzdWJjbGFzcy4KK0luIHRoZXNlIGNhc2VzLCBzZXQgdGhlIHByb3BlciBjbGFzcyBjcml0ZXJhIGV4dGVuc2lvbiB0byA8bGl0ZXJhbD50cnVlCis8L2xpdGVyYWw+IHRvIGZvcmNlIE9wZW5KUEEgdG8gYXBwZW5kIGNsYXNzIGNyaXRlcmlhIHRvIGl0cyBzZWxlY3QgU1FMLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzIGNyaXRlcmlhIGFubm90YXRpb25zIGZvciBmaWVsZCByZWxhdGlvbnMgYW5kCithcnJheSBvciBjb2xsZWN0aW9uIGVsZW1lbnQgcmVsYXRpb25zLCByZXNwZWN0aXZlbHk6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9DbGFzc0NyaXRlcmlhLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5DbGFzc0NyaXRlcmlhPC9jbGFzc25hbWU+PC91bGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9qZGJjL0VsZW1lbnRDbGFzc0NyaXRlcmlhLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5FbGVtZW50Q2xhc3NDcml0ZXJpYTwvY2xhc3NuYW1lPgorPC91bGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJzdHJhdGVneSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBTdHJhdGVneQorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJzdHJhdGVneSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEncyAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvU3RyYXRlZ3kuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlN0cmF0ZWd5PC9jbGFzc25hbWU+PC91bGluaz4KK2V4dGVuc2lvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjdXN0b20gbWFwcGluZworc3RyYXRlZ3kgb3IgdmFsdWUgaGFuZGxlciBmb3IgYSBmaWVsZC4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b20iLz4gZm9yIGluZm9ybWF0aW9uIG9uIGN1c3RvbQorbWFwcGluZ3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b20iPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBDdXN0b20gTWFwcGluZ3MKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b20iPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgY3VzdG9tIG1hcHBpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtYXBwaW5nIG1ldGFkYXRhCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGN1c3RvbSBtYXBwaW5nCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgY3VzdG9tIG1hcHBpbmcKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitJbiBPcGVuSlBBLCB5b3UgYXJlIG5vdCBsaW1pdGVkIHRvIHRoZSBzZXQgb2Ygc3RhbmRhcmQgbWFwcGluZ3MgZGVmaW5lZCBieSB0aGUKK3NwZWNpZmljYXRpb24uIE9wZW5KUEEgYWxsb3dzIHlvdSB0byBkZWZpbmUgY3VzdG9tIGNsYXNzLCBkaXNjcmltaW5hdG9yLAordmVyc2lvbiwgYW5kIGZpZWxkIG1hcHBpbmcgc3RyYXRlZ2llcyB3aXRoIGFsbCB0aGUgcG93ZXIgb2YgT3BlbkpQQSdzIGJ1aWx0LWluCitzdHJhdGVnaWVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b21fY2xhc3MiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEN1c3RvbSBDbGFzcyBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitUbyBjcmVhdGUgYSBjdXN0b20gY2xhc3MgbWFwcGluZywgd3JpdGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvQ2xhc3NTdHJhdGVneS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5DbGFzc1N0cmF0ZWd5PC9jbGFzc25hbWU+PC91bGluaz4KK2ludGVyZmFjZS4gWW91IHdpbGwgcHJvYmFibHkgd2FudCB0byBleHRlbmQgb25lIG9mIHRoZSBleGlzdGluZyBhYnN0cmFjdCBvcgorY29uY3JldGUgc3RyYXRlZ2llcyBpbiB0aGUgPGxpdGVyYWw+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMKKzwvbGl0ZXJhbD4gcGFja2FnZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvU3RyYXRlZ3kuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlN0cmF0ZWd5PC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24gYWxsb3dzIHlvdSB0byBkZWNsYXJlIGEgY3VzdG9tIGNsYXNzIG1hcHBpbmcgc3RyYXRlZ3kgaW4gSlBBIG1hcHBpbmcKK21ldGFkYXRhLiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBmdWxsIGNsYXNzIG5hbWUgb2YgeW91ciBjdXN0b20KK3N0cmF0ZWd5LiBZb3UgY2FuIGNvbmZpZ3VyZSB5b3VyIHN0cmF0ZWd5IGNsYXNzJyBiZWFuIHByb3BlcnRpZXMgdXNpbmcKK09wZW5KUEEncyBwbHVnaW4gc3ludGF4LCBkZXRhaWxlZCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b21fdmVyc2Rpc2NyaW0iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEN1c3RvbSBEaXNjcmltaW5hdG9yIGFuZCBWZXJzaW9uIFN0cmF0ZWdpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RvIGRlZmluZSBhIGN1c3RvbSBkaXNjcmltaW5hdG9yIG9yIHZlcnNpb24gc3RyYXRlZ3ksIGltcGxlbWVudCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMvbWV0YS9EaXNjcmltaW5hdG9yU3RyYXRlZ3kuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRGlzY3JpbWluYXRvclN0cmF0ZWd5PC9jbGFzc25hbWU+Cis8L3VsaW5rPiBvcgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9tZXRhL1ZlcnNpb25TdHJhdGVneS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WZXJzaW9uU3RyYXRlZ3k8L2NsYXNzbmFtZT48L3VsaW5rPgoraW50ZXJmYWNlLCByZXNwZWN0aXZlbHkuIFlvdSBtaWdodCBleHRlbmQgb25lIG9mIHRoZSBleGlzdGluZyBhYnN0cmFjdCBvcgorY29uY3JldGUgc3RyYXRlZ2llcyBpbiB0aGUgPGxpdGVyYWw+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHMKKzwvbGl0ZXJhbD4gcGFja2FnZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBpbmNsdWRlcyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL2pkYmMvRGlzY3JpbWluYXRvclN0cmF0ZWd5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5EaXNjcmltaW5hdG9yU3RyYXRlZ3k8L2NsYXNzbmFtZT4KKzwvdWxpbms+IGFuZAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9WZXJzaW9uU3RyYXRlZ3kuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5qZGJjLlZlcnNpb25TdHJhdGVneTwvY2xhc3NuYW1lPgorPC91bGluaz4gY2xhc3MgYW5ub3RhdGlvbnMgZm9yIGRlY2xhcmluZyBhIGN1c3RvbSBkaXNjcmltaW5hdG9yIG9yIHZlcnNpb24KK3N0cmF0ZWd5IGluIEpQQSBtYXBwaW5nIG1ldGFkYXRhLiBTZXQgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGVzZSBhbm5vdGF0aW9ucyB0bwordGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB5b3VyIGltcGxlbWVudGF0aW9uLCBvciB0byB0aGUgY2xhc3MgbmFtZSBvciBhbGlhcyBvZiBhbgorZXhpc3RpbmcgT3BlbkpQQSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorQXMgd2l0aCBjdXN0b20gY2xhc3MgbWFwcGluZ3MsIHlvdSBjYW4gY29uZmlndXJlIHlvdXIgc3RyYXRlZ3kgY2xhc3MnIGJlYW4KK3Byb3BlcnRpZXMgdXNpbmcgT3BlbkpQQSdzIHBsdWdpbiBzeW50YXgsIGRldGFpbGVkIGluCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b21fZmllbGQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEN1c3RvbSBGaWVsZCBNYXBwaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b21fZmllbGQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBjdXN0b20gbWFwcGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBmaWVsZCBtYXBwaW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hpbGUgY3VzdG9tIGNsYXNzLCBkaXNjcmltaW5hdG9yLCBhbmQgdmVyc2lvbiBtYXBwaW5nIGNhbiBiZSB1c2VmdWwsIGN1c3RvbQorZmllbGQgbWFwcGluZ3MgYXJlIGZhciBtb3JlIGNvbW1vbi4gT3BlbkpQQSBvZmZlcnMgdHdvIHR5cGVzIG9mIGN1c3RvbSBmaWVsZAorbWFwcGluZ3M6IHZhbHVlIGhhbmRsZXJzLCBhbmQgZnVsbCBjdXN0b20gZmllbGQgc3RyYXRlZ2llcy4gVGhlIGZvbGxvd2luZworc2VjdGlvbnMgZXhhbWluZSBlYWNoLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV92aGFuZGxlciI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBWYWx1ZSBIYW5kbGVycworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWFwcGluZ19jdXN0b21fZmllbGRzdHJhdCI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgbWFwcGluZworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVmFsdWUgaGFuZGxlcnMgbWFrZSBpdCB0cml2aWFsIHRvIG1hcCBhbnkgdHlwZSB0aGF0IHlvdSBjYW4gYnJlYWsgZG93biBpbnRvIG9uZQorb3IgbW9yZSBzaW1wbGUgdmFsdWVzLiBBbGwgdmFsdWUgaGFuZGxlcnMgaW1wbGVtZW50IHRoZSA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5WYWx1ZUhhbmRsZXI8L2NsYXNzbmFtZT4gaW50ZXJmYWNlOyBzZWUgaXRzCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvVmFsdWVIYW5kbGVyLmh0bWwiPiBKYXZhZG9jCis8L3VsaW5rPiBmb3IgZGV0YWlscy4gIEFsc28sIGV4YW1pbmUgdGhlIGJ1aWx0LWluIGhhbmRsZXJzIGluIHRoZSA8ZmlsZW5hbWU+CitzcmMvb3BlbmpwYS9qZGJjL21ldGEvc3RyYXRzPC9maWxlbmFtZT4gZGlyZWN0b3J5IG9mIHlvdXIgT3BlbkpQQSBzb3VyY2UgCitkaXN0cmlidXRpb24uICBVc2UgdGhlc2UgZnVuY3Rpb25hbCBpbXBsZW1lbnRhdGlvbnMgYXMgZXhhbXBsZXMgd2hlbiB5b3UgCitjcmVhdGUgeW91ciBvd24gdmFsdWUgaGFuZGxlcnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV9maWVsZHN0cmF0Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEZpZWxkIFN0cmF0ZWdpZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfY3VzdG9tX2ZpZWxkc3RyYXQiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGludGVyYWN0cyB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIHRocm91Z2ggdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL21ldGEvRmllbGRTdHJhdGVneSI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuRmllbGRTdHJhdGVneTwvY2xhc3NuYW1lPjwvdWxpbms+IGludGVyZmFjZS4gWW91CitjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHlvdXJzZWxmIHRvIGNyZWF0ZSBhIGN1c3RvbSBmaWVsZCBzdHJhdGVneSwgb3IKK2V4dGVuZCBvbmUgb2YgdGhlIGV4aXN0aW5nIGFic3RyYWN0IG9yIGNvbmNyZXRlIHN0cmF0ZWdpZXMgaW4gdGhlIDxsaXRlcmFsPgorb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMubWV0YS5zdHJhdHM8L2xpdGVyYWw+IHBhY2thZ2UuIENyZWF0aW5nIGEgY3VzdG9tIGZpZWxkCitzdHJhdGVneSBpcyBtb3JlIGRpZmZpY3VsdCB0aGFuIHdyaXRpbmcgYSBjdXN0b20gdmFsdWUgaGFuZGxlciwgYnV0IGdpdmVzIHlvdQorbW9yZSBmcmVlZG9tIGluIGhvdyB5b3UgaW50ZXJhY3Qgd2l0aCB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV9maWVsZF9jb25mIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21hcHBpbmdfY3VzdG9tX2ZpZWxkX2NvbmYiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgZ2l2ZXMgeW91IHR3byB3YXlzIHRvIGNvbmZpZ3VyZSB5b3VyIGN1c3RvbSBmaWVsZCBtYXBwaW5ncy4gVGhlCis8bGl0ZXJhbD5GaWVsZFN0cmF0ZWdpZXM8L2xpdGVyYWw+IHByb3BlcnR5IG9mIHRoZSBidWlsdC1pbiA8Y2xhc3NuYW1lPgorTWFwcGluZ0RlZmF1bHRzPC9jbGFzc25hbWU+IGltcGxlbWVudGF0aW9ucyBhbGxvd3MgeW91IHRvIGdsb2JhbGx5IGFzc29jaWF0ZQorZmllbGQgdHlwZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGN1c3RvbSB2YWx1ZSBoYW5kbGVyIG9yIHN0cmF0ZWd5LiBPcGVuSlBBCit3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHlvdXIgY3VzdG9tIHN0cmF0ZWdpZXMgd2hlbiBpdCBlbmNvdW50ZXJzIGEgZmllbGQgb2YgdGhlCithc3NvY2lhdGVkIHR5cGUuIE9wZW5KUEEgd2lsbCB1c2UgeW91ciBjdXN0b20gdmFsdWUgaGFuZGxlcnMgd2hlbmV2ZXIgaXQKK2VuY291bnRlcnMgYSBmaWVsZCBvZiB0aGUgYXNzb2NpYXRlZCB0eXBlLiAKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2RlZmF1bHRzIi8+IGRlc2NyaWJlZCBtYXBwaW5nCitkZWZhdWx0cyBpbiBkZXRhaWwuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorWW91ciBvdGhlciBvcHRpb24gaXMgdG8gZXhwbGljaXRseSBpbnN0YWxsIGEgY3VzdG9tIHZhbHVlIGhhbmRsZXIgb3Igc3RyYXRlZ3kgb24KK2EgcGFydGljdWxhciBmaWVsZC4gVG8gZG8gc28sIHNwZWNpZnkgdGhlIGZ1bGwgbmFtZSBvZiB5b3VyIGltcGxlbWVudGF0aW9uIGNsYXNzCitpbiB0aGUgcHJvcGVyIG1hcHBpbmcgbWV0YWRhdGEgZXh0ZW5zaW9uLiBPcGVuSlBBIGluY2x1ZGVzIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9TdHJhdGVneS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuU3RyYXRlZ3k8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbi4gWW91IGNhbiBjb25maWd1cmUgdGhlIG5hbWVkIHN0cmF0ZWd5IG9yIGhhbmRsZXIncyBiZWFuCitwcm9wZXJ0aWVzIGluIHRoZXNlIGV4dGVuc2lvbnMgdXNpbmcgT3BlbkpQQSdzIHBsdWdpbiBmb3JtYXQgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfb3JwaGFuIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgT3JwaGFuZWQgS2V5cworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8cGFyYT4KK1VubGVzcyB5b3UgYXBwbHkgZGF0YWJhc2UgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgZXh0ZW5zaXZlbHksIGl0IGlzIHBvc3NpYmxlIHRvCitlbmQgdXAgd2l0aCBvcnBoYW5lZCBrZXlzIGluIHlvdXIgZGF0YWJhc2UuIEZvciBleGFtcGxlLCBzdXBwb3NlIDxjbGFzc25hbWU+CitNYWdhemluZTwvY2xhc3NuYW1lPjxsaXRlcmFsPm08L2xpdGVyYWw+IGhhcyBhIHJlZmVyZW5jZSB0byA8Y2xhc3NuYW1lPkFydGljbGUKKzwvY2xhc3NuYW1lPjxsaXRlcmFsPmE8L2xpdGVyYWw+LiBJZiB5b3UgZGVsZXRlIDxsaXRlcmFsPmE8L2xpdGVyYWw+IHdpdGhvdXQKK251bGxpbmcgPGxpdGVyYWw+bTwvbGl0ZXJhbD4ncyByZWZlcmVuY2UsIDxsaXRlcmFsPm08L2xpdGVyYWw+J3MgZGF0YWJhc2UKK3JlY29yZCB3aWxsIHdpbmQgdXAgd2l0aCBhbiBvcnBoYW5lZCBrZXkgdG8gdGhlIG5vbi1leGlzdGVudCA8bGl0ZXJhbD5hCis8L2xpdGVyYWw+IHJlY29yZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorT25lIHdheSBvZiBhdm9pZGluZyBvcnBoYW5lZCBrZXlzIGlzIHRvIHVzZSA8ZW1waGFzaXM+ZGVwZW5kZW50PC9lbXBoYXNpcz4KK2ZpZWxkcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEncyA8bGluayBsaW5rZW5kPSJvcGVuanBhLk9ycGhhbmVkS2V5QWN0aW9uIj48bGl0ZXJhbD4KK29wZW5qcGEuT3JwaGFuZWRLZXlBY3Rpb248L2xpdGVyYWw+PC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5IGNvbnRyb2xzIHdoYXQKK2FjdGlvbiB0byB0YWtlIHdoZW4gT3BlbkpQQSBlbmNvdW50ZXJzIGFuIG9ycGhhbmVkIGtleS4gWW91IGNhbiBzZXQgdGhpcyBwbHVnaW4KK3N0cmluZyAoc2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIHRvIGEgY3VzdG9tCitpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L09ycGhhbmVkS2V5QWN0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT4gb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50Lk9ycGhhbmVkS2V5QWN0aW9uPC9jbGFzc25hbWU+PC91bGluaz4KK2ludGVyZmFjZSwgb3IgdXNlIG9uZSBvZiB0aGUgYnVpbHQtaW4gb3B0aW9uczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bG9nPC9saXRlcmFsPjogVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nLiBUaGlzIG9wdGlvbiBsb2dzIGEgbWVzc2FnZQorZm9yIGVhY2ggb3JwaGFuZWQga2V5LiBJdCBpcyBhbiBhbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9Mb2dPcnBoYW5lZEtleUFjdGlvbi5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LkxvZ09ycGhhbmVkS2V5QWN0aW9uPC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Q2hhbm5lbDwvbGl0ZXJhbD46IFRoZSBjaGFubmVsIHRvIGxvZyB0by4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+CitvcGVuanBhLlJ1bnRpbWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkxldmVsPC9saXRlcmFsPjogVGhlIGxldmVsIHRvIGxvZyBhdC4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+V0FSTgorPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5leGNlcHRpb248L2xpdGVyYWw+OiBUaHJvdyBhbiA8Y2xhc3NuYW1lPgorRW50aXR5Tm90Rm91bmRFeGNlcHRpb248L2NsYXNzbmFtZT4gd2hlbiBPcGVuSlBBIGRpc2NvdmVycyBhbgorb3JwaGFuZWQga2V5LiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L0V4Y2VwdGlvbk9ycGhhbmVkS2V5QWN0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuRXhjZXB0aW9uT3JwaGFuZWRLZXlBY3Rpb248L2NsYXNzbmFtZT4KKzwvdWxpbms+IGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ub25lPC9saXRlcmFsPjogSWdub3JlIG9ycGhhbmVkIGtleXMuIFRoaXMgaXMgYW4gYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvTm9uZU9ycGhhbmVkS2V5QWN0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQuTm9uZU9ycGhhbmVkS2V5QWN0aW9uPC9jbGFzc25hbWU+PC91bGluaz4KK2NsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX29ycGhhbl9sb2dleCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ3VzdG9tIExvZ2dpbmcgT3JwaGFuZWQgS2V5cworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLk9ycGhhbmVkS2V5QWN0aW9uIiB2YWx1ZT0ibG9nKENoYW5uZWw9T3JwaGFucywgTGV2ZWw9REVCVUcpIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX21ldGEueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX21ldGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTE2YzEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfbWV0YS54bWwKQEAgLTAsMCArMSw5NTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9InJlZl9ndWlkZV9tZXRhIj4KKyAgICA8dGl0bGU+CisgICAgICAgIE1ldGFkYXRhCisgICAgPC90aXRsZT4KKyAgICA8cGFyYT4KK1RoZSBKUEEgT3ZlcnZpZXcgY292ZXJzIEpQQSBtZXRhZGF0YSBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YSIvPi4gCitUaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIE9wZW5KUEEncyBleHRlbnNpb25zIHRvIHN0YW5kYXJkIEpQQSBtZXRhZGF0YS4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tZXRhX2ZhY3RvcnkiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBNZXRhZGF0YSBGYWN0b3J5CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21ldGFfZmFjdG9yeSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBsb2FkaW5nIGFuZCBzdG9yaW5nCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgTWV0YURhdGFGYWN0b3J5CisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuTWV0YURhdGFGYWN0b3J5Ij48bGl0ZXJhbD5vcGVuanBhLk1ldGFEYXRhRmFjdG9yeQorPC9saXRlcmFsPjwvbGluaz4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBjb250cm9scyBtZXRhZGF0YSBsb2FkaW5nIGFuZCBzdG9yaW5nLgorVGhpcyBwcm9wZXJ0eSB0YWtlcyBhIHBsdWdpbiBzdHJpbmcgKHNlZSAKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIGRlc2NyaWJpbmcgYSBjb25jcmV0ZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvbWV0YS9NZXRhRGF0YUZhY3RvcnkuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLk1ldGFEYXRhRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+CitpbXBsZW1lbnRhdGlvbi4gQSBtZXRhZGF0YSBmYWN0b3J5IGNhbiBsb2FkIG1hcHBpbmcgaW5mb3JtYXRpb24gYXMgd2VsbCBhcworcGVyc2lzdGVuY2UgbWV0YWRhdGEsIG9yIGl0IGNhbiBsZWF2ZSBtYXBwaW5nIGluZm9ybWF0aW9uIHRvIGEgc2VwYXJhdGUKKzxlbXBoYXNpcz5tYXBwaW5nIGZhY3Rvcnk8L2VtcGhhc2lzPiAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19mYWN0b3J5Ii8+KS4gT3BlbkpQQSByZWNvZ25pemVzIHRoZQorZm9sbG93aW5nIGJ1aWx0LWluIG1ldGFkYXRhIGZhY3RvcmllczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+anBhPC9saXRlcmFsPjogU3RhbmRhcmQgSlBBIG1ldGFkYXRhLiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlTWV0YURhdGFGYWN0b3J5Lmh0bWwiPgorPGNsYXNzbmFtZT4gCitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VNZXRhRGF0YUZhY3Rvcnk8L2NsYXNzbmFtZT48L3VsaW5rPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitKUEEgaGFzIGJ1aWx0LWluIHNldHRpbmdzIGZvciBsaXN0aW5nIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzLCB3aGljaCAKK3RoZSA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2VfeG1sIj5KUEEgT3ZlcnZpZXc8L2xpbms+IGRlc2NyaWJlcy4KK09wZW5KUEEgc3VwcG9ydHMgdGhlc2UgSlBBIHN0YW5kYXJkIHNldHRpbmdzIGJ5IHRyYW5zbGF0aW5nIHRoZW0gaW50byBpdHMgb3duCitpbnRlcm5hbCBtZXRhZGF0YSBmYWN0b3J5IHByb3BlcnRpZXMuICBFYWNoIGludGVybmFsIHByb3BlcnR5IHJlcHJlc2VudHMgYSAKK2RpZmZlcmVudCBtZWNoYW5pc20gZm9yIGxvY2F0aW5nIHBlcnNpc3RlbnQgdHlwZXM7IHlvdSBjYW4gY2hvb3NlIHRoZSBtZWNoYW5pc20KK29yIGNvbWJpbmF0aW9uIG9mIG1lY2hhbmlzbXMgdGhhdCBhcmUgbW9zdCBjb252ZW5pZW50LiBTZWUgCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfcGNjbGFzc2VzIi8+IGZvciBhIGRpc2N1c3Npb24gb2Ygd2hlbiBpdCBpcyAKK25lY2Vzc2FyeSB0byBsaXN0IHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5UeXBlczwvbGl0ZXJhbD46IEEgc2VtaWNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGZ1bGx5LXF1YWxpZmllZAorcGVyc2lzdGVudCBjbGFzcyBuYW1lcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+UmVzb3VyY2VzPC9saXRlcmFsPjogQSBzZW1pY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcmVzb3VyY2UgcGF0aHMgdG8KK21ldGFkYXRhIGZpbGVzIG9yIGphciBhcmNoaXZlcy4gRWFjaCBqYXIgYXJjaGl2ZSB3aWxsIGJlIHNjYW5uZWQgZm9yIAorYW5ub3RhdGVkIEpQQSBlbnRpdGllcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+VVJMczwvbGl0ZXJhbD46IEEgc2VtaWNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIFVSTHMgb2YgbWV0YWRhdGEgZmlsZXMKK29yIGphciBhcmNoaXZlcy4gRWFjaCBqYXIgYXJjaGl2ZSB3aWxsIGJlIHNjYW5uZWQgZm9yIGFubm90YXRlZCBKUEEKK2VudGl0aWVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5DbGFzc3BhdGhTY2FuPC9saXRlcmFsPjogQSBzZW1pY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb3IKK2phciBhcmNoaXZlcyBsaXN0ZWQgaW4geW91ciBjbGFzc3BhdGguIEVhY2ggZGlyZWN0b3J5IGFuZCBqYXIgYXJjaGl2ZSB3aWxsIGJlCitzY2FubmVkIGZvciBhbm5vdGF0ZWQgSlBBIGVudGl0aWVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX21ldGFfc3RkZmFjdG9yeWV4Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTZXR0aW5nIGEgU3RhbmRhcmQgTWV0YWRhdGEgRmFjdG9yeQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLk1ldGFEYXRhRmFjdG9yeSIgdmFsdWU9ImpwYShDbGFzc3BhdGhTY2FuPWJ1aWxkO2xpYi5qYXIpIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbWV0YV9jdXN0b21mYWN0b3J5ZXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNldHRpbmcgYSBDdXN0b20gTWV0YWRhdGEgRmFjdG9yeQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLk1ldGFEYXRhRmFjdG9yeSIgdmFsdWU9ImNvbS54eXouQ3VzdG9tTWV0YURhdGFGYWN0b3J5Ii8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWV0YV9qcGEiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBBZGRpdGlvbmFsIEpQQSBNZXRhZGF0YQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tZXRhX2pwYSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBKUEEgYWRkaXRpb25zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBPcGVuSlBBJ3MgY29yZSBhZGRpdGlvbnMgdG8gc3RhbmRhcmQgZW50aXR5IG1ldGFkYXRhLiBXZQorcHJlc2VudCB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBzeW50YXggdG8gc3VwcG9ydCB0aGVzZSBhZGRpdGlvbnMgaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2pwYSIvPi4gRmluYWxseSwKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9tZXRhX2V4dCIvPiBjb3ZlcnMgYWRkaXRpb25hbCBleHRlbnNpb25zIHRvIEpQQQorbWV0YWRhdGEgdGhhdCBhbGxvdyB5b3UgdG8gYWNjZXNzIGF1eGlsaWFyeSBPcGVuSlBBIGZlYXR1cmVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbWV0YV9qcGFfZGF0YXN0b3JlaWQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERhdGFzdG9yZSBJZGVudGl0eQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21ldGFfanBhX2RhdGFzdG9yZWlkIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZGF0YXN0b3JlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorSlBBIHR5cGljYWxseSByZXF1aXJlcyB5b3UgdG8gZGVjbGFyZSBvbmUgb3IgbW9yZSA8bGl0ZXJhbD5JZDwvbGl0ZXJhbD4gZmllbGRzCit0byBhY3QgYXMgcHJpbWFyeSBrZXlzLiBPcGVuSlBBLCBob3dldmVyLCBjYW4gY3JlYXRlIGFuZCBtYWludGFpbiBhIHN1cnJvZ2F0ZQorcHJpbWFyeSBrZXkgdmFsdWUgd2hlbiB5b3UgZG8gbm90IGRlY2xhcmUgYW55IDxsaXRlcmFsPklkPC9saXRlcmFsPiBmaWVsZHMuIFRoaXMKK2Zvcm0gb2YgcGVyc2lzdGVudCBpZGVudGl0eSBpcyBjYWxsZWQgPGVtcGhhc2lzPmRhdGFzdG9yZSBpZGVudGl0eTwvZW1waGFzaXM+LgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX29pZCIvPiBkaXNjdXNzZXMgT3BlbkpQQSdzIHN1cHBvcnQgZm9yCitkYXRhc3RvcmUgaWRlbnRpdHkgaW4gSlBBLiBXZSBjb3ZlciBob3cgdG8gbWFwIHlvdXIgZGF0YXN0b3JlIGlkZW50aXR5IHByaW1hcnkKK2tleSBjb2x1bW4gaW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX2RhdGFzdG9yZWlkIi8+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tZXRhX2pwYV92ZXJzaW9uIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTdXJyb2dhdGUgVmVyc2lvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21ldGFfanBhX3ZlcnNpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0p1c3QgYXMgT3BlbkpQQSBjYW4gbWFpbnRhaW4geW91ciBlbnRpdHkncyBpZGVudGl0eSB3aXRob3V0IGFueSA8bGl0ZXJhbD5JZAorPC9saXRlcmFsPiBmaWVsZHMsIE9wZW5KUEEgY2FuIG1haW50YWluIHlvdXIgZW50aXR5J3Mgb3B0aW1pc3RpYyB2ZXJzaW9uIHdpdGhvdXQKK2FueSA8bGl0ZXJhbD5WZXJzaW9uPC9saXRlcmFsPiBmaWVsZHMuCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19qcGFfdmVyc2lvbiIvPiBzaG93cyB5b3UgaG93IHRvIG1hcAorc3Vycm9nYXRlIHZlcnNpb24gY29sdW1ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21ldGFfanBhX3BlcnNpc3RlbnQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQgRmllbGQgVmFsdWVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbWV0YV9qcGFfcGVyc2lzdGVudCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSBkZWZpbmVzIDxsaXRlcmFsPkJhc2ljPC9saXRlcmFsPiwgPGxpdGVyYWw+TG9iPC9saXRlcmFsPiwgPGxpdGVyYWw+RW1iZWRkZWQKKzwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1hbnlUb09uZTwvbGl0ZXJhbD4sIGFuZCA8bGl0ZXJhbD5PbmVUb09uZTwvbGl0ZXJhbD4KK3BlcnNpc3RlbmNlIHN0cmF0ZWdpZXMgZm9yIGRpcmVjdCBmaWVsZCB2YWx1ZXMuIE9wZW5KUEEgc3VwcG9ydHMgYWxsIG9mIHRoZXNlCitzdGFuZGFyZCBzdHJhdGVnaWVzLCBidXQgYWRkcyBvbmUgb2YgaXRzIG93bjogPGxpdGVyYWw+UGVyc2lzdGVudDwvbGl0ZXJhbD4uCitUaGUgPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvUGVyc2lzdGVudC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbnQ8L2NsYXNzbmFtZT48L3VsaW5rPgorbWV0YWRhdGEgYW5ub3RhdGlvbiBjYW4gcmVwcmVzZW50IGFueSBkaXJlY3QgZmllbGQgdmFsdWUsIGluY2x1ZGluZyBjdXN0b20KK3R5cGVzLiBJdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RmV0Y2hUeXBlIGZldGNoPC9saXRlcmFsPjogV2hldGhlciB0byBsb2FkIHRoZSBmaWVsZCBlYWdlcmx5IG9yCitsYXppbHkuIENvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIHNhbWUtbmFtZWQgcHJvcGVydHkgb2Ygc3RhbmRhcmQgSlBBCithbm5vdGF0aW9ucyBzdWNoIGFzIDxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Jhc2ljIj48Y2xhc3NuYW1lPiBCYXNpYworPC9jbGFzc25hbWU+PC9saW5rPi4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+RmV0Y2hUeXBlLkVBR0VSPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkNhc2NhZGVUeXBlW10gY2FzY2FkZTwvbGl0ZXJhbD46IEFycmF5IG9mIGVudW0gdmFsdWVzIGRlZmluaW5nIGNhc2NhZGUKK2JlaGF2aW9yIGZvciB0aGlzIGZpZWxkLiBDb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSBzYW1lLW5hbWVkIHByb3BlcnR5IG9mCitzdGFuZGFyZCBKUEEgYW5ub3RhdGlvbnMgc3VjaCBhcyA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYW55dG9vbmUiPgorPGNsYXNzbmFtZT4gTWFueVRvT25lPC9jbGFzc25hbWU+PC9saW5rPi4gRGVmYXVsdHMgdG8gZW1wdHkgYXJyYXkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgbWFwcGVkQnk8L2xpdGVyYWw+OiBOYW1lcyB0aGUgZmllbGQgaW4gdGhlIHJlbGF0ZWQgZW50aXR5IHRoYXQKK21hcHMgdGhpcyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLiBDb3JyZXNwb25kcyB0byB0aGUgc2FtZS1uYW1lZCBwcm9wZXJ0eSBvZgorc3RhbmRhcmQgSlBBIGFubm90YXRpb25zIHN1Y2ggYXMgPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfb25ldG9vbmUiPgorPGNsYXNzbmFtZT4gT25lVG9PbmU8L2NsYXNzbmFtZT48L2xpbms+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBvcHRpb25hbDwvbGl0ZXJhbD46IFdoZXRoZXIgdGhlIHZhbHVlIGNhbiBiZSBudWxsLiBDb3JyZXNwb25kcwordG8gdGhlIHNhbWUtbmFtZWQgcHJvcGVydHkgb2Ygc3RhbmRhcmQgSlBBIGFubm90YXRpb25zIHN1Y2ggYXMKKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hbnl0b29uZSI+PGNsYXNzbmFtZT4gTWFueVRvT25lPC9jbGFzc25hbWU+Cis8L2xpbms+LCBidXQgY2FuIGFwcGx5IHRvIG5vbi1lbnRpdHkgb2JqZWN0IHZhbHVlcyBhcyB3ZWxsLiBEZWZhdWx0cyB0bworPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGVtYmVkZGVkPC9saXRlcmFsPjogU2V0IHRoaXMgcHJvcGVydHkgdG8gPGxpdGVyYWw+dHJ1ZQorPC9saXRlcmFsPiBpZiB0aGUgZmllbGQgdmFsdWUgaXMgc3RvcmVkIGFzIGFuIGVtYmVkZGVkIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorVGhvdWdoIHlvdSBjYW4gdXNlIHRoZSA8Y2xhc3NuYW1lPlBlcnNpc3RlbnQ8L2NsYXNzbmFtZT4gYW5ub3RhdGlvbiBpbiBwbGFjZSBvZgorbW9zdCBvZiB0aGUgc3RhbmRhcmQgZGlyZWN0IGZpZWxkIGFubm90YXRpb25zIG1lbnRpb25lZCBhYm92ZSwgd2UgcmVjb21tZW5kCitwcmltYXJpbHkgdXNpbmcgaXQgZm9yIG5vbi1zdGFuZGFyZCBhbmQgY3VzdG9tIHR5cGVzIGZvciB3aGljaCBubyBzdGFuZGFyZCBKUEEKK2Fubm90YXRpb24gZXhpc3RzLiBGb3IgZXhhbXBsZSwgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfanBhX2NvbHVtbnMiLz4KKyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgPGNsYXNzbmFtZT5QZXJzaXN0ZW50PC9jbGFzc25hbWU+IGFubm90YXRpb24KK3RvIGRlbm90ZSBhIHBlcnNpc3RlbnQgPGNsYXNzbmFtZT5qYXZhLmF3dC5Qb2ludDwvY2xhc3NuYW1lPiBmaWVsZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21ldGFfanBhX3BlcnNpc3RlbnRfY29sbCI+CisJCQk8dGl0bGU+UGVyc2lzdGVudCBDb2xsZWN0aW9uIEZpZWxkczwvdGl0bGU+CisJCQk8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tZXRhX2pwYV9wZXJzaXN0ZW50X2NvbGwiPgorCQkJCTxwcmltYXJ5PnBlcnNpc3RlbnQgZmllbGRzPC9wcmltYXJ5PgorCQkJCTxzZWNvbmRhcnk+Y29sbGVjdGlvbiBtZXRhZGF0YTwvc2Vjb25kYXJ5PgorCQkJPC9pbmRleHRlcm0+CisJCQk8cGFyYT4KK0pQQSBzdGFuZGFyZGl6ZXMgc3VwcG9ydCBmb3IgY29sbGVjdGlvbnMgb2YgZW50aXRpZXMgd2l0aCB0aGUgPGxpdGVyYWw+CitPbmVUb01hbnk8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5NYW55VG9NYW55PC9saXRlcmFsPiBwZXJzaXN0ZW5jZSBzdHJhdGVnaWVzLiAgCitPcGVuSlBBIHN1cHBvcnRzIHRoZXNlIHN0cmF0ZWdpZXMsIGFuZCBtYXkgYmUgZXh0ZW5kZWQgZm9yIG90aGVyIHN0cmF0ZWdpZXMgYXMgCit3ZWxsLiAgRm9yIGV4dGVuZGVkIHN0cmF0ZWdpZXMsIHVzZSB0aGUgCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW50Q29sbGVjdGlvbi5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlBlcnNpc3RlbnRDb2xsZWN0aW9uPC9jbGFzc25hbWU+PC91bGluaz4gbWV0YWRhdGEgCithbm5vdGF0aW9uIHRvIHJlcHJlc2VudHMgYW55IHBlcnNpc3RlbnQgY29sbGVjdGlvbiBmaWVsZC4gIEl0IGhhcyB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzOgorCQkJPC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdD4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+Q2xhc3MgZWxlbWVudFR5cGU8L2xpdGVyYWw+OiBUaGUgY2xhc3Mgb2YgdGhlIGNvbGxlY3Rpb24gZWxlbWVudHMuICAKK1RoaXMgaW5mb3JtYXRpb24gaXMgdXN1YWxseSB0YWtlbiBmcm9tIHRoZSBwYXJhbWV0ZXJpemVkIGNvbGxlY3Rpb24gZWxlbWVudCAKK3R5cGUuICBZb3UgbXVzdCBzdXBwbHkgaXQgZXhwbGljaXRseSwgaG93ZXZlciwgaWYgeW91ciBmaWVsZCBpc24ndCBhIAorcGFyYW1ldGVyaXplZCB0eXBlLgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+RmV0Y2hUeXBlIGZldGNoPC9saXRlcmFsPjogV2hldGhlciB0byBsb2FkIHRoZSBjb2xsZWN0aW9uIGVhZ2VybHkgb3IgCitsYXppbHkuICBDb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSBzYW1lLW5hbWVkIHByb3BlcnR5IG9mIHN0YW5kYXJkIEpQQSAKK2Fubm90YXRpb25zIHN1Y2ggYXMgPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfYmFzaWMiPjxjbGFzc25hbWU+CitCYXNpYzwvY2xhc3NuYW1lPjwvbGluaz4uIERlZmF1bHRzIHRvIDxsaXRlcmFsPkZldGNoVHlwZS5MQVpZPC9saXRlcmFsPi4KKwkJCQkJPC9wYXJhPgorCQkJCTwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPgorCQkJCQk8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBtYXBwZWRCeTwvbGl0ZXJhbD46IE5hbWVzIHRoZSBmaWVsZCBpbiB0aGUgcmVsYXRlZCBlbnRpdHkgdGhhdCAKK21hcHMgdGhpcyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLiAgQ29ycmVzcG9uZHMgdG8gdGhlIHNhbWUtbmFtZWQgcHJvcGVydHkgb2YgCitzdGFuZGFyZCBKUEEgYW5ub3RhdGlvbnMgc3VjaCBhcyA8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYW55dG9tYW55Ij4KKzxjbGFzc25hbWU+TWFueVRvTWFueTwvY2xhc3NuYW1lPjwvbGluaz4uCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT4KKwkJCQkJPHBhcmE+Cis8bGl0ZXJhbD5DYXNjYWRlVHlwZVtdIGVsZW1lbnRDYXNjYWRlPC9saXRlcmFsPjogQXJyYXkgb2YgZW51bSB2YWx1ZXMgZGVmaW5pbmcgCitjYXNjYWRlIGJlaGF2aW9yIGZvciB0aGUgY29sbGVjdGlvbiBlbGVtZW50cy4gIENvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIAorPGxpdGVyYWw+Y2FzY2FkZTwvbGl0ZXJhbD4gcHJvcGVydHkgb2Ygc3RhbmRhcmQgSlBBIGFubm90YXRpb25zIHN1Y2ggYXMgCis8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9tYW55dG9tYW55Ij48Y2xhc3NuYW1lPgorTWFueVRvTWFueTwvY2xhc3NuYW1lPjwvbGluaz4uIERlZmF1bHRzIHRvIGVtcHR5IGFycmF5LgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBlbGVtZW50RW1iZWRkZWQ8L2xpdGVyYWw+OiBTZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD50cnVlCis8L2xpdGVyYWw+IGlmIHRoZSBlbGVtZW50cyBhcmUgc3RvcmVkIGFzIGVtYmVkZGVkIG9iamVjdHMuCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJPC9pdGVtaXplZGxpc3Q+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tZXRhX2pwYV9wZXJzaXN0ZW50X21hcCI+CisJCQk8dGl0bGU+UGVyc2lzdGVudCBNYXAgRmllbGRzPC90aXRsZT4KKwkJCTxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX21ldGFfanBhX3BlcnNpc3RlbnRfbWFwIj4KKwkJCQk8cHJpbWFyeT5wZXJzaXN0ZW50IGZpZWxkczwvcHJpbWFyeT4KKwkJCQk8c2Vjb25kYXJ5Pm1hcCBtZXRhZGF0YTwvc2Vjb25kYXJ5PgorCQkJPC9pbmRleHRlcm0+CisJCQk8cGFyYT4KK0pQQSBoYXMgbGltaXRlZCBzdXBwb3J0IGZvciBtYXBzLiAgSWYgeW91IGV4dGVuZCBKUEEncyBzdGFuZGFyZCBtYXAgc3VwcG9ydCB0byAKK2VuY29tcGFzcyBuZXcgbWFwcGluZ3MsIHVzZSB0aGUgCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW50TWFwLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVudE1hcDwvY2xhc3NuYW1lPjwvdWxpbms+IG1ldGFkYXRhIAorYW5ub3RhdGlvbiB0byByZXByZXNlbnQgeW91ciBjdXN0b20gcGVyc2lzdGVudCBtYXAgZmllbGRzLiAgSXQgaGFzIHRoZSAKK2ZvbGxvd2luZyBwcm9wZXJ0aWVzOgorCQkJPC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdD4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+Q2xhc3Mga2V5VHlwZTwvbGl0ZXJhbD46IFRoZSBjbGFzcyBvZiB0aGUgbWFwIGtleXMuICBUaGlzIGluZm9ybWF0aW9uIAoraXMgdXN1YWxseSB0YWtlbiBmcm9tIHRoZSBwYXJhbWV0ZXJpemVkIG1hcCBrZXkgdHlwZS4gIFlvdSBtdXN0IHN1cHBseSBpdCAKK2V4cGxpY2l0bHksIGhvd2V2ZXIsIGlmIHlvdXIgZmllbGQgaXNuJ3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUuCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT4KKwkJCQkJPHBhcmE+Cis8bGl0ZXJhbD5DbGFzcyBlbGVtZW50VHlwZTwvbGl0ZXJhbD46IFRoZSBjbGFzcyBvZiB0aGUgbWFwIHZhbHVlcy4gIFRoaXMgCitpbmZvcm1hdGlvbiBpcyB1c3VhbGx5IHRha2VuIGZyb20gdGhlIHBhcmFtZXRlcml6ZWQgbWFwIHZhbHVlIHR5cGUuICBZb3UgbXVzdCAKK3N1cHBseSBpdCBleHBsaWNpdGx5LCBob3dldmVyLCBpZiB5b3VyIGZpZWxkIGlzbid0IGEgcGFyYW1ldGVyaXplZCB0eXBlLgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+RmV0Y2hUeXBlIGZldGNoPC9saXRlcmFsPjogV2hldGhlciB0byBsb2FkIHRoZSBjb2xsZWN0aW9uIGVhZ2VybHkgb3IgCitsYXppbHkuICBDb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSBzYW1lLW5hbWVkIHByb3BlcnR5IG9mIHN0YW5kYXJkIEpQQSAKK2Fubm90YXRpb25zIHN1Y2ggYXMgPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfYmFzaWMiPjxjbGFzc25hbWU+CitCYXNpYzwvY2xhc3NuYW1lPjwvbGluaz4uIERlZmF1bHRzIHRvIDxsaXRlcmFsPkZldGNoVHlwZS5MQVpZPC9saXRlcmFsPi4KKwkJCQkJPC9wYXJhPgorCQkJCTwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPgorCQkJCQk8cGFyYT4KKzxsaXRlcmFsPkNhc2NhZGVUeXBlW10ga2V5Q2FzY2FkZTwvbGl0ZXJhbD46IEFycmF5IG9mIGVudW0gdmFsdWVzIGRlZmluaW5nIAorY2FzY2FkZSBiZWhhdmlvciBmb3IgdGhlIG1hcCBrZXlzLiAgQ29ycmVzcG9uZHMgZXhhY3RseSB0byB0aGUgPGxpdGVyYWw+Y2FzY2FkZQorPC9saXRlcmFsPiBwcm9wZXJ0eSBvZiBzdGFuZGFyZCBKUEEgYW5ub3RhdGlvbnMgc3VjaCBhcyAKKzxsaW5rIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX21hbnl0b29uZSI+PGNsYXNzbmFtZT4KK01hbnlUb09uZTwvY2xhc3NuYW1lPjwvbGluaz4uIERlZmF1bHRzIHRvIGVtcHR5IGFycmF5LgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+Q2FzY2FkZVR5cGVbXSBlbGVtZW50Q2FzY2FkZTwvbGl0ZXJhbD46IEFycmF5IG9mIGVudW0gdmFsdWVzIGRlZmluaW5nIAorY2FzY2FkZSBiZWhhdmlvciBmb3IgdGhlIG1hcCB2YWx1ZXMuICBDb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSAKKzxsaXRlcmFsPmNhc2NhZGU8L2xpdGVyYWw+IHByb3BlcnR5IG9mIHN0YW5kYXJkIEpQQSBhbm5vdGF0aW9ucyBzdWNoIGFzIAorPGxpbmsgbGlua2VuZD0ianBhX292ZXJ2aWV3X21ldGFfbWFueXRvb25lIj48Y2xhc3NuYW1lPgorTWFueVRvT25lPC9jbGFzc25hbWU+PC9saW5rPi4gRGVmYXVsdHMgdG8gZW1wdHkgYXJyYXkuCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT4KKwkJCQkJPHBhcmE+Cis8bGl0ZXJhbD5ib29sZWFuIGtleUVtYmVkZGVkPC9saXRlcmFsPjogU2V0IHRoaXMgcHJvcGVydHkgdG8gPGxpdGVyYWw+dHJ1ZQorPC9saXRlcmFsPiBpZiB0aGUgbWFwIGtleXMgYXJlIHN0b3JlZCBhcyBlbWJlZGRlZCBvYmplY3RzLgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBlbGVtZW50RW1iZWRkZWQ8L2xpdGVyYWw+OiBTZXQgdGhpcyBwcm9wZXJ0eSB0byA8bGl0ZXJhbD4KK3RydWU8L2xpdGVyYWw+IGlmIHRoZSBtYXAgdmFsdWVzIGFyZSBzdG9yZWQgYXMgZW1iZWRkZWQgb2JqZWN0cy4KKwkJCQkJPC9wYXJhPgorCQkJCTwvbGlzdGl0ZW0+CisJCQk8L2l0ZW1pemVkbGlzdD4KKwkJPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21ldGFfZXh0Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgTWV0YWRhdGEgRXh0ZW5zaW9ucworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9tZXRhX2V4dCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBleHRlbmRzIHN0YW5kYXJkIG1ldGFkYXRhIHRvIGFsbG93IHlvdSB0byBhY2Nlc3MgYWR2YW5jZWQgT3BlbkpQQQorZnVuY3Rpb25hbGl0eS4gVGhpcyBzZWN0aW9uIGNvdmVycyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBleHRlbnNpb25zOyB3ZSBkaXNjdXNzCittYXBwaW5nIG1ldGFkYXRhIGV4dGVuc2lvbnMgaW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfZXh0Ii8+LgorQWxsIG1ldGFkYXRhIGV4dGVuc2lvbnMgYXJlIG9wdGlvbmFsOyBPcGVuSlBBIHdpbGwgcmVseSBvbiBpdHMgZGVmYXVsdHMgd2hlbiBubworZXhwbGljaXQgZGF0YSBpcyBwcm92aWRlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21ldGFfY2xhc3MiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIENsYXNzIEV4dGVuc2lvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGNsYXNzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iZmV0Y2gtZ3JvdXBzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEZldGNoIEdyb3VwcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJmZXRjaC1ncm91cHMiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoIGdyb3VwcworICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoIGdyb3VwcworICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRmV0Y2hHcm91cHMuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaEdyb3VwczwvY2xhc3NuYW1lPjwvdWxpbms+IGFuZAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRmV0Y2hHcm91cC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkZldGNoR3JvdXA8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbnMgYWxsb3cgeW91IHRvIGRlZmluZSBmZXRjaCBncm91cHMgaW4geW91ciBKUEEgZW50aXRpZXMuCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZmV0Y2giLz4gZGlzY3Vzc2VzIE9wZW5KUEEncyBzdXBwb3J0IGZvciBmZXRjaAorZ3JvdXBzIGluIGdlbmVyYWw7IHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZmV0Y2hfY3VzdG9tIi8+IGZvciBob3cgdG8KK3VzZSB0aGVzZSBhbm5vdGF0aW9ucyBpbiBwYXJ0aWN1bGFyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJkYXRhLWNhY2hlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERhdGEgQ2FjaGUKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0iZGF0YS1jYWNoZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBjYWNoZQorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hpbmcKKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NhY2hlIi8+IGV4YW1pbmVzIGNhY2hpbmcgaW4gT3BlbkpQQS4gTWV0YWRhdGEKK2V4dGVuc2lvbnMgYWxsb3cgaW5kaXZpZHVhbCBjbGFzc2VzIHRvIG92ZXJyaWRlIHN5c3RlbSBjYWNoaW5nIGRlZmF1bHRzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgZGVmaW5lcyB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFDYWNoZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkRhdGFDYWNoZTwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uIGZvciBjYWNoaW5nIGluZm9ybWF0aW9uLiBUaGlzIGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+Ym9vbGVhbiBlbmFibGVkPC9saXRlcmFsPjogV2hldGhlciB0byBjYWNoZSBkYXRhIGZvciBpbnN0YW5jZXMgb2YgdGhlCitjbGFzcy4gRGVmYXVsdHMgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gZm9yIGJhc2UgY2xhc3Nlcywgb3IgdGhlIHN1cGVyY2xhc3MKK3ZhbHVlIGZvciBzdWJjbGFzc2VzLiBJZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCBhbGwKK290aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+aW50IHRpbWVvdXQ8L2xpdGVyYWw+OiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBkYXRhIGZvciB0aGUgY2xhc3MKK3JlbWFpbnMgdmFsaWQuIFVzZSAtMSBmb3Igbm8gdGltZW91dC4gRGVmYXVsdHMgdG8gdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkRhdGFDYWNoZVRpbWVvdXQiPjxsaXRlcmFsPiBvcGVuanBhLkRhdGFDYWNoZVRpbWVvdXQKKzwvbGl0ZXJhbD48L2xpbms+IHByb3BlcnR5IHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImRldGFjaGVkLXN0YXRlLWZpZWxkIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERldGFjaGVkIFN0YXRlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImRldGFjaGVkLXN0YXRlLWZpZWxkIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCBzdGF0ZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaG1lbnQKKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3BjX2VuaGFuY2UiPmVuaGFuY2VyPC9saW5rPiBtYXkgYWRkIGEKK3N5bnRoZXRpYyBmaWVsZCB0byBkZXRhY2hhYmxlIGNsYXNzZXMgdG8gaG9sZCBkZXRhY2hlZCBzdGF0ZSAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGV0YWNoX2dyYXBoIi8+IGZvciBkZXRhaWxzKS4gWW91IGNhbiBpbnN0ZWFkCitkZWNsYXJlIHlvdXIgb3duIGRldGFjaGVkIHN0YXRlIGZpZWxkIG9yIHN1cHJlc3MgdGhlIGNyZWF0aW9uIG9mIGEgZGV0YWNoZWQKK3N0YXRlIGZpZWxkIGFsdG9nZXRoZXIuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91ciBjbGFzcyBtdXN0IG5vdCB1c2UKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19vaWQiPmRhdGFzdG9yZSBpZGVudGl0eTwvbGluaz4sIGFuZCBzaG91bGQgZGVjbGFyZQorYSB2ZXJzaW9uIGZpZWxkIHRvIGRldGVjdCBvcHRpbWlzdGljIGNvbmN1cnJlbmN5IGVycm9ycyBkdXJpbmcgZGV0YWNoZWQKK21vZGlmaWNhdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBkZWZpbmVzIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRGV0YWNoZWRTdGF0ZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkRldGFjaGVkU3RhdGU8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiBmb3IgY29udHJvbGxpbmcgZGV0YWNoZWQgc3RhdGUuIFdoZW4gdXNlZCB0byBhbm5vdGF0ZSBhIGNsYXNzLAorPGNsYXNzbmFtZT5EZXRhY2hlZFN0YXRlPC9jbGFzc25hbWU+IHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmJvb2xlYW4gZW5hYmxlZDwvbGl0ZXJhbD46IFNldCB0byBmYWxzZSB0byBzdXBwcmVzcyB0aGUgdXNlIG9mCitkZXRhY2hlZCBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgZmllbGROYW1lPC9saXRlcmFsPjogVXNlIHRoaXMgcHJvcGVydHkgdG8gZGVjbGFyZSB5b3VyIG93bgorZGV0YWNoZWQgc3RhdGUgZmllbGQuIFRoZSBmaWVsZCBtdXN0IGJlIG9mIHR5cGUgPGNsYXNzbmFtZT5PYmplY3Q8L2NsYXNzbmFtZT4uCitUeXBpY2FsbHkgdGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHVzZWQgaWYgdGhlIGZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEKK25vbi1wZXJzaXN0ZWQgc3VwZXJjbGFzcy4gSWYgdGhlIGZpZWxkIGlzIGRlY2xhcmVkIGluIHlvdXIgZW50aXR5IGNsYXNzLCB5b3UKK3dpbGwgdHlwaWNhbGx5IGFubm90YXRlIHRoZSBmaWVsZCBkaXJlY3RseSwgYXMgZGVzY3JpYmVkIGJlbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgeW91IGRlY2xhcmUgeW91ciBvd24gZGV0YWNoZWQgc3RhdGUgZmllbGQsIHlvdSBjYW4gYW5ub3RhdGUgdGhhdCBmaWVsZCB3aXRoCis8Y2xhc3NuYW1lPkRldGFjaGVkU3RhdGU8L2NsYXNzbmFtZT4gZGlyZWN0bHksIHJhdGhlciB0aGFuIHBsYWNpbmcgdGhlCithbm5vdGF0aW9uIGF0IHRoZSBjbGFzcyBsZXZlbCBhbmQgdXNpbmcgdGhlIDxsaXRlcmFsPmZpZWxkTmFtZTwvbGl0ZXJhbD4KK3Byb3BlcnR5LiBXaGVuIHBsYWNlZCBvbiBhIGZpZWxkLCA8Y2xhc3NuYW1lPkRldGFjaGVkU3RhdGU8L2NsYXNzbmFtZT4gYWN0cyBhcyBhCittYXJrZXIgYW5ub3RhdGlvbjsgaXQgZG9lcyBub3QgcmVjb2duaXplIGFueSBwcm9wZXJ0aWVzLiBZb3VyIGFubm90YXRlZCBmaWVsZAorbXVzdCBiZSBvZiB0eXBlIDxjbGFzc25hbWU+T2JqZWN0PC9jbGFzc25hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX21ldGFfZmllbGQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEZpZWxkIEV4dGVuc2lvbnMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGZpZWxkIGV4dGVuc2lvbnM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iZGVwZW5kZW50Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERlcGVuZGVudAorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJkZXBlbmRlbnQiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudAorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSW4gYSA8ZW1waGFzaXM+ZGVwZW5kZW50PC9lbXBoYXNpcz4gcmVsYXRpb24sIHRoZSByZWZlcmVuY2VkIG9iamVjdCBpcyBkZWxldGVkCit3aGVuZXZlciB0aGUgb3duaW5nIG9iamVjdCBpcyBkZWxldGVkLCBvciB3aGVuZXZlciB0aGUgcmVsYXRpb24gaXMgc2V2ZXJlZCBieQorbnVsbGluZyBvciByZXNldHRpbmcgdGhlIG93bmluZyBmaWVsZC4gRm9yIGV4YW1wbGUsIGlmIHRoZSA8bGl0ZXJhbD4KK01hZ2F6aW5lLmNvdmVyQXJ0aWNsZTwvbGl0ZXJhbD4gZmllbGQgaXMgbWFya2VkIGRlcGVuZGVudCwgdGhlbiBzZXR0aW5nCis8bGl0ZXJhbD5NYWdhemluZS5jb3ZlckFydGljbGU8L2xpdGVyYWw+IHRvIGEgbmV3IDxjbGFzc25hbWU+QXJ0aWNsZTwvY2xhc3NuYW1lPgoraW5zdGFuY2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGUgb2xkIDxjbGFzc25hbWU+QXJ0aWNsZTwvY2xhc3NuYW1lPiBzdG9yZWQKK2luIHRoZSBmaWVsZC4gU2ltaWxhcmx5LCBkZWxldGluZyBhIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4gb2JqZWN0IHdpbGwKK2F1dG9tYXRpY2FsbHkgZGVsZXRlIGl0cyBjdXJyZW50IGNvdmVyIDxjbGFzc25hbWU+QXJ0aWNsZTwvY2xhc3NuYW1lPi4gKFRoaXMKK2xhdHRlciBwcm9jZXNzaW5nIGlzIGFuYWxvZ291cyB0byB1c2luZyBKUEEncyBDYXNjYWRlVHlwZS5SRU1PVkUgZnVuY3Rpb25hbGl0eQorYXMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2Nhc2NhZGUiLz4uKSBZb3UgY2FuCitwcmV2ZW50IGFuIG9ycGhhbmVkIGRlcGVuZGVudCBvYmplY3QgZnJvbSBiZWluZyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgYnkgCithc3NpZ25pbmcgaXQgdG8gYW5vdGhlciByZWxhdGlvbiBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIG9mZmVycyBhIGZhbWlseSBvZiBtYXJrZXIgYW5ub3RhdGlvbnMgdG8gZGVub3RlIGRlcGVuZGVudCByZWxhdGlvbnMgaW4KK0pQQSBlbnRpdGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9EZXBlbmRlbnQuaHRtbCI+Cis8Y2xhc3NuYW1lPiBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRGVwZW5kZW50PC9jbGFzc25hbWU+PC91bGluaz46IE1hcmtzCithIGRpcmVjdCByZWxhdGlvbiBhcyBkZXBlbmRlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRWxlbWVudERlcGVuZGVudC5odG1sIj4KKzxjbGFzc25hbWU+IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5FbGVtZW50RGVwZW5kZW50PC9jbGFzc25hbWU+PC91bGluaz4KKzogTWFya3MgdGhlIGVudGl0eSBlbGVtZW50cyBvZiBhIGNvbGxlY3Rpb24sIGFycmF5LCBvciBtYXAgZmllbGQgYXMgZGVwZW5kZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0tleURlcGVuZGVudC5odG1sIj4KKzxjbGFzc25hbWU+IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5LZXlEZXBlbmRlbnQ8L2NsYXNzbmFtZT48L3VsaW5rPjoKK01hcmtzIHRoZSBrZXkgZW50aXRpZXMgaW4gYSBtYXAgZmllbGQgYXMgZGVwZW5kZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImxvYWQtZmV0Y2gtZ3JvdXAiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgTG9hZCBGZXRjaCBHcm91cAorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJsb2FkLWZldGNoLWdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkIGZldGNoIGdyb3VwCisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJsb2FkLWZldGNoLWdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaCBncm91cHMKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBmZXRjaCBncm91cAorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9Mb2FkRmV0Y2hHcm91cC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkxvYWRGZXRjaEdyb3VwPC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24gc3BlY2lmaWVzIGEgZmllbGQncyBsb2FkIGZldGNoIGdyb3VwLgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoIi8+IGRpc2N1c3NlcyBPcGVuSlBBJ3Mgc3VwcG9ydCBmb3IgZmV0Y2ggZ3JvdXBzCitpbiBnZW5lcmFsOyBzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoX2N1c3RvbSIvPiBmb3IgaG93IHRvIHVzZSB0aGlzCithbm5vdGF0aW9uIGluIHBhcnRpY3VsYXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImxycyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBMUlMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0ibHJzIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBscnMKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSByZXN1bHQgc2V0cworICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGlzIGJvb2xlYW4gZXh0ZW5zaW9uLCBkZW5vdGVkIGJ5IHRoZSBPcGVuSlBBCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9MUlMuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5MUlM8L2NsYXNzbmFtZT48L3VsaW5rPiBhbm5vdGF0aW9uLAoraW5kaWNhdGVzIHRoYXQgYSBmaWVsZCBzaG91bGQgdXNlIE9wZW5KUEEncyBzcGVjaWFsIGxhcmdlIHJlc3VsdCBzZXQgY29sbGVjdGlvbgorb3IgbWFwIHByb3hpZXMuIEEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgbGFyZ2UgcmVzdWx0IHNldCBwcm94aWVzIGlzIGF2YWlsYWJsZQoraW4gPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX3Njb3NfcHJveHlfbHJzIi8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJpbnZlcnNlLWxvZ2ljYWwiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSW52ZXJzZS1Mb2dpY2FsCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImludmVyc2UtbG9naWNhbCI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZS1sb2dpY2FsCisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBleHRlbnNpb24gbmFtZXMgdGhlIGludmVyc2UgZmllbGQgaW4gYSBsb2dpY2FsIGJpZGlyZWN0aW9uYWwgcmVsYXRpb24uCitUbyBjcmVhdGUgYSBsb2dpY2FsIGJpZHJlY3Rpb25hbCByZWxhdGlvbiBpbiBPcGVuSlBBLCB1c2UgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9JbnZlcnNlTG9naWNhbC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkludmVyc2VMb2dpY2FsPC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24uIFdlIGRpc2N1c3MgbG9naWNhbCBiaWRpcmVjdGlvbmFsIHJlbGF0aW9ucyBhbmQgdGhpcworZXh0ZW5zaW9uIGluIGRldGFpbCBpbiA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfaW52ZXJzZXMiLz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlYWQtb25seSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBSZWFkLU9ubHkKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVhZC1vbmx5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkLW9ubHkKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWFkLW9ubHkiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgZmllbGRzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgb25seQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSByZWFkLW9ubHkgZXh0ZW5zaW9uIG1ha2VzIGEgZmllbGQgdW53cml0YWJsZS4gVGhlIGV4dGVuc2lvbiBvbmx5IGFwcGxpZXMgdG8KK2V4aXN0aW5nIHBlcnNpc3RlbnQgb2JqZWN0czsgbmV3IG9iamVjdCBmaWVsZHMgYXJlIGFsd2F5cyB3cml0ZWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVG8gbWFyayBhIGZpZWxkIHJlYWQtb25seSBpbiBKUEEgbWV0YWRhdGEsIHNldCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL1JlYWRPbmx5Lmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUmVhZE9ubHk8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiB0byBhbgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvVXBkYXRlQWN0aW9uLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuVXBkYXRlQWN0aW9uPC9jbGFzc25hbWU+PC91bGluaz4gZW51bQordmFsdWUuIFRoZSA8Y2xhc3NuYW1lPlVwZGF0ZUFjdGlvbjwvY2xhc3NuYW1lPiBlbnVtIGluY2x1ZGVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlVwZGF0ZUFjdGlvbi5JR05PUkU8L2xpdGVyYWw+OiBVcGRhdGVzIHRvIHRoZSBmaWVsZCBhcmUgY29tcGxldGVseQoraWdub3JlZC4gVGhlIGZpZWxkIGlzIG5vdCBjb25zaWRlcmVkIGRpcnR5LiBUaGUgbmV3IHZhbHVlIHdpbGwgbm90IGV2ZW4gZ2V0CitzdG9yZWQgaW4gdGhlIE9wZW5KUEEgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2NhY2hlIj5kYXRhIGNhY2hlPC9saW5rPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5VcGRhdGVBY3Rpb24uUkVTVFJJQ1Q8L2xpdGVyYWw+OiBBbnkgYXR0ZW1wdCB0byBjaGFuZ2UgdGhlIGZpZWxkIHdpbGwKK3Jlc3VsdCBpbiBhbiBpbW1lZGlhdGUgZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InR5cGUiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVHlwZQorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlCisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBoYXMgdGhyZWUgbGV2ZWxzIG9mIHN1cHBvcnQgZm9yIHJlbGF0aW9uczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1JlbGF0aW9ucyB0aGF0IGhvbGQgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIGEgY29uY3JldGUgcGVyc2lzdGVudCBjbGFzcyBhcmUKK3N1cHBvcnRlZCBieSBzdG9yaW5nIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2UgaW4gdGhlCitkYXRhYmFzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitSZWxhdGlvbnMgdGhhdCBob2xkIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiBhbiB1bmtub3duIHBlcnNpc3RlbnQgY2xhc3MgYXJlCitzdXBwb3J0ZWQgYnkgc3RvcmluZyB0aGUgc3RyaW5naWZpZWQgaWRlbnRpdHkgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2UuCitUaGlzIGxldmVsIG9mIHN1cHBvcnQgZG9lcyBub3QgYWxsb3cgcXVlcmllcyBhY3Jvc3MgdGhlIHJlbGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1JlbGF0aW9ucyB0aGF0IGhvbGQgYW4gdW5rbm93biBvYmplY3Qgb3IgaW50ZXJmYWNlLiBUaGUgb25seSB3YXkgdG8gc3VwcG9ydAordGhlc2UgcmVsYXRpb25zIGlzIHRvIHNlcmlhbGl6ZSB0aGVpciB2YWx1ZSB0byB0aGUgZGF0YWJhc2UuIFRoaXMgZG9lcyBub3QgYWxsb3cKK3lvdSB0byBxdWVyeSB0aGUgZmllbGQsIGFuZCBpcyBub3QgdmVyeSBlZmZpY2llbnQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0NsZWFybHksIHdoZW4geW91IGRlY2xhcmUgYSBmaWVsZCdzIHR5cGUgdG8gYmUgYW5vdGhlciBwZXJzaXN0ZW5jZS1jYXBhYmxlCitjbGFzcywgT3BlbkpQQSB1c2VzIGxldmVsIDEgc3VwcG9ydC4gQnkgZGVmYXVsdCwgT3BlbkpQQSBhc3N1bWVzIHRoYXQgYW55CitpbnRlcmZhY2UtdHlwZWQgZmllbGRzIHlvdSBkZWNsYXJlIHdpbGwgYmUgaW1wbGVtZW50ZWQgb25seSBieSBvdGhlciBwZXJzaXN0ZW50CitjbGFzc2VzLCBhbmQgYXNzaWducyBpbnRlcmZhY2VzIGxldmVsIDIgc3VwcG9ydC4gVGhlIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgaXMKK3RoZSA8Y2xhc3NuYW1lPmphdmEuaW8uU2VyaWFsaXphYmxlPC9jbGFzc25hbWU+IGludGVyZmFjZS4gSWYgeW91IGRlY2xhcmUgYQorZmllbGQgdG8gYmUgb2YgdHlwZSA8Y2xhc3NuYW1lPlNlcmlhbGl6YWJsZTwvY2xhc3NuYW1lPiwgT3BlbkpQQSBsdW1wcyBpdAordG9nZXRoZXIgd2l0aCA8Y2xhc3NuYW1lPmphdmEubGFuZy5PYmplY3Q8L2NsYXNzbmFtZT4gZmllbGRzIGFuZCBvdGhlcgorbm9uLWludGVyZmFjZSwgdW5yZWNvZ25pemVkIGZpZWxkIHR5cGVzLCB3aGljaCBhcmUgYWxsIGFzc2lnbmVkIGxldmVsIDMgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitXaXRoIE9wZW5KUEEncyB0eXBlIGZhbWlseSBvZiBtZXRhZGF0YSBleHRlbnNpb25zLCB5b3UgY2FuIGNvbnRyb2wgdGhlIGxldmVsIG9mCitzdXBwb3J0IGdpdmVuIHRvIHlvdXIgdW5rbm93bi9pbnRlcmZhY2UtdHlwZWQgZmllbGRzLiBTZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzCitleHRlbnNpb24gdG8gPGNsYXNzbmFtZT5FbnRpdHk8L2NsYXNzbmFtZT4gaW5kaWNhdGVzIHRoYXQgdGhlCitmaWVsZCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBzb21lIHBlcnNpc3RlbnQgb2JqZWN0LCBhbmQgZ2l2ZXMgbGV2ZWwgMiBzdXBwb3J0LgorU2V0dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBleHRlbnNpb24gdG8gdGhlIGNsYXNzIG9mIGEgY29uY3JldGUgcGVyc2lzdGVudCB0eXBlCitpcyBldmVuIGJldHRlcjsgaXQgZ2l2ZXMgeW91IGxldmVsIDEgc3VwcG9ydCAoanVzdCBhcyBpZiB5b3UgaGFkIGRlY2xhcmVkIHlvdXIKK2ZpZWxkIHRvIGJlIG9mIHRoYXQgdHlwZSBpbiB0aGUgZmlyc3QgcGxhY2UpLiBTZXR0aW5nIHRoaXMgZXh0ZW5zaW9uIHRvCis8Y2xhc3NuYW1lPk9iamVjdDwvY2xhc3NuYW1lPiB1c2VzIGxldmVsIDMgc3VwcG9ydC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZQorYW4gaW50ZXJmYWNlIHJlbGF0aW9uIHRoYXQgbWF5IDxlbXBoYXNpcyByb2xlPSJib2xkIj5ub3Q8L2VtcGhhc2lzPiBob2xkIG90aGVyCitwZXJzaXN0ZW50IG9iamVjdHMgKHJlY2FsbCB0aGF0IE9wZW5KUEEgYXNzdW1lcyBpbnRlcmZhY2UgZmllbGRzIHdpbGwgYWx3YXlzCitob2xkIHBlcnNpc3RlbnQgaW5zdGFuY2VzIGJ5IGRlZmF1bHQpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgZXh0ZW5zaW9uIGlzIGFsc28gdXNlZCB3aXRoIE9wZW5KUEEncyBleHRlcm5hbGl6YXRpb24gZmVhdHVyZSwgZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZXh0ZXJuIi8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHR5cGUgYW5ub3RhdGlvbnMgZm9yIGZpZWxkIHZhbHVlcywgY29sbGVjdGlvbiwKK2FycmF5LCBhbmQgbWFwIGVsZW1lbnRzLCBhbmQgbWFwIGtleXMsIHJlc3BlY3RpdmVseToKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9UeXBlLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuVHlwZTwvY2xhc3NuYW1lPjwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRWxlbWVudFR5cGUuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5FbGVtZW50VHlwZTwvY2xhc3NuYW1lPjwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvS2V5VHlwZS5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLktleVR5cGU8L2NsYXNzbmFtZT48L3VsaW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9ImV4dGVybmFsaXplciI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbGl6ZXIKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0iZXh0ZXJuYWxpemVyIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbGl6ZXIKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVybmFsaXplci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkV4dGVybmFsaXplcjwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uIG5hbWVzIGEgbWV0aG9kIHRvIHRyYW5zZm9ybSBhIGZpZWxkIHZhbHVlIGludG8gYSB2YWx1ZSBvZgorYW5vdGhlciB0eXBlLiBTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX2V4dGVybiIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iZmFjdG9yeSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBGYWN0b3J5CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9ImZhY3RvcnkiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZhY3RvcnkuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GYWN0b3J5PC9jbGFzc25hbWU+PC91bGluaz4gYW5ub3RhdGlvbgorbmFtZXMgYSBtZXRob2QgdG8gcmUtY3JlYXRlIGEgZmllbGQgdmFsdWUgZnJvbSBpdHMgZXh0ZXJuYWxpemVkIGZvcm0uIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX3BjX2V4dGVybiIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0iZXh0ZXJuYWwtdmFsdWVzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIFZhbHVlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJmYWN0b3J5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVybmFsVmFsdWVzLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRXh0ZXJuYWxWYWx1ZXM8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiBkZWNsYXJlcyB2YWx1ZXMgZm9yIHRyYW5zZm9ybWF0aW9uIG9mIHNpbXBsZSBmaWVsZHMgdG8KK2RpZmZlcmVudCBjb25zdGFudCB2YWx1ZXMgaW4gdGhlIGRhdGFzdG9yZS4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZXh0ZXJuX3ZhbHVlcyIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9tZXRhX2V4YW1wbGUiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIHNwZWNpZnkgZXh0ZW5zaW9ucyBpbiBtZXRhZGF0YS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbWV0YWV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEEgTWV0YWRhdGEgRXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKK0BFbnRpdHkKK0BEYXRhQ2FjaGUoZW5hYmxlZD1mYWxzZSkKK3B1YmxpYyBjbGFzcyBNYWdhemluZQoreworICAgIEBNYW55VG9NYW55CisgICAgQExSUworICAgIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtTdWJzY3JpYmVyJmd0OyBzdWJzY3JpYmVyczsKKworICAgIEBFeHRlcm5hbFZhbHVlcyh7InRydWU9MSIsICJmYWxzZT0yIn0pCisgICAgQFR5cGUoaW50LmNsYXNzKQorICAgIHByaXZhdGUgYm9vbGVhbiB3ZWVrbHk7CisKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfb3B0aW1pemF0aW9uLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9vcHRpbWl6YXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTM5NjAKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfb3B0aW1pemF0aW9uLnhtbApAQCAtMCwwICsxLDU5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0icmVmX2d1aWRlX29wdGltaXphdGlvbiI+CisgICAgPHRpdGxlPgorICAgICAgICBPcHRpbWl6YXRpb24gR3VpZGVsaW5lcworICAgIDwvdGl0bGU+CisgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfb3B0aW1pemF0aW9uIj4KKyAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICBvcHRpbWl6YXRpb24gZ3VpZGVsaW5lcworICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHBhcmE+CitUaGVyZSBhcmUgbnVtZXJvdXMgdGVjaG5pcXVlcyB5b3UgY2FuIHVzZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBPcGVuSlBBCitvcGVyYXRlcyBpbiB0aGUgZmFzdGVzdCBhbmQgbW9zdCBlZmZpY2llbnQgbWFubmVyLiBGb2xsb3dpbmcgYXJlIHNvbWUKK2d1aWRlbGluZXMuIEVhY2ggZGVzY3JpYmVzIHdoYXQgaW1wYWN0IGl0IHdpbGwgaGF2ZSBvbiBwZXJmb3JtYW5jZSBhbmQKK3NjYWxhYmlsaXR5LiBOb3RlIHRoYXQgZ2VuZXJhbCBndWlkZWxpbmVzIHJlZ2FyZGluZyBwZXJmb3JtYW5jZSBvciBzY2FsYWJpbGl0eQoraXNzdWVzIGFyZSBqdXN0IHRoYXQgLSBndWlkZWxpbmVzLiBEZXBlbmRpbmcgb24gdGhlIHBhcnRpY3VsYXIgY2hhcmFjdGVyaXN0aWNzCitvZiB5b3VyIGFwcGxpY2F0aW9uLCB0aGUgb3B0aW1hbCBzZXR0aW5ncyBtYXkgYmUgY29uc2lkZXJhYmx5IGRpZmZlcmVudCB0aGFuCit3aGF0IGlzIG91dGxpbmVkIGJlbG93LgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KK0luIHRoZSBmb2xsb3dpbmcgdGFibGUsIGVhY2ggcm93IGlzIGxhYmVsZWQgd2l0aCBhIGxpc3Qgb2YgaXRhbGljaXplZCBrZXl3b3Jkcy4KK1RoZXNlIGtleXdvcmRzIGlkZW50aWZ5IHdoYXQgY2hhcmFjdGVyaXN0aWNzIHRoZSByb3cgaW4gcXVlc3Rpb24gbWF5IGltcHJvdmUKK3Vwb24uIE1hbnkgb2YgdGhlIHJvd3MgYXJlIG1hcmtlZCB3aXRoIG9uZSBvciBib3RoIG9mIHRoZSA8ZW1waGFzaXM+cGVyZm9ybWFuY2UKKzwvZW1waGFzaXM+IGFuZCA8ZW1waGFzaXM+c2NhbGFiaWxpdHk8L2VtcGhhc2lzPiBsYWJlbHMuIEl0IGlzIGltcG9ydGFudCB0byBiZWFyCitpbiBtaW5kIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlcmZvcm1hbmNlIGFuZCBzY2FsYWJpbGl0eSAoZm9yIHRoZSBtb3N0IHBhcnQsCit3ZSBhcmUgcmVmZXJyaW5nIHRvIHN5c3RlbS13aWRlIHNjYWxhYmlsaXR5LCBhbmQgbm90IG5lY2Vzc2FyaWx5IG9ubHkKK3NjYWxhYmlsaXR5IHdpdGhpbiBhIHNpbmdsZSBKVk0pLiBUaGUgcGVyZm9ybWFuY2UtcmVsYXRlZCBoaW50cyB3aWxsIHByb2JhYmx5CitpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB5b3VyIGFwcGxpY2F0aW9uIGZvciBhIGdpdmVuIHVzZXIgbG9hZCwgd2hlcmVhcyB0aGUKK3NjYWxhYmlsaXR5LXJlbGF0ZWQgaGludHMgd2lsbCBwcm9iYWJseSBpbmNyZWFzZSB0aGUgdG90YWwgbnVtYmVyIG9mIHVzZXJzIHRoYXQKK3lvdXIgYXBwbGljYXRpb24gY2FuIHNlcnZpY2UuIFNvbWV0aW1lcywgaW5jcmVhc2luZyBwZXJmb3JtYW5jZSB3aWxsIGRlY3JlYXNlCitzY2FsYWJpbGl0eSwgYW5kIHZpY2UgdmVyc2EuIFR5cGljYWxseSwgb3B0aW9ucyB0aGF0IHJlZHVjZSB0aGUgYW1vdW50IG9mIHdvcmsKK2RvbmUgb24gdGhlIGRhdGFiYXNlIHNlcnZlciB3aWxsIGltcHJvdmUgc2NhbGFiaWxpdHksIHdoZXJlYXMgdGhvc2UgdGhhdCBwdXNoCittb3JlIHdvcmsgb250byB0aGUgc2VydmVyIHdpbGwgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBzY2FsYWJpbGl0eS4KKyAgICA8L3BhcmE+CisgICAgPHRhYmxlPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBPcHRpbWl6YXRpb24gR3VpZGVsaW5lcworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0IiBjb2xzZXA9IjEiIHJvd3NlcD0iMSI+CisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJuYW1lIi8+CisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJkZXNjIiBjb2x3aWR0aD0iNCoiLz4KKyAgICAgICAgICAgIDx0Ym9keSB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbiBpbiBhIENvbm5lY3Rpb24gUG9vbAorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlLCBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK09wZW5KUEEncyBidWlsdC1pbiBkYXRhc291cmNlIGRvZXMgbm90IHBlcmZvcm0gY29ubmVjdGlvbiBwb29saW5nIG9yCitwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGluZy4gIFBsdWdnaW5nIGluIGEgdGhpcmQtcGFydHkgcG9vbGluZyBkYXRhc291cmNlIG1heQorZHJhc3RpY2FsbHkgaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgZGF0YWJhc2UgaW5kZXhlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlLCBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK1RoZSBkZWZhdWx0IHNldCBvZiBpbmRleGVzIGNyZWF0ZWQgYnkgT3BlbkpQQSdzIG1hcHBpbmcgdG9vbCBtYXkgbm90IGFsd2F5cyBiZSAKK3RoZSBtb3N0IGFwcHJvcHJpYXRlIGZvciB5b3VyIGFwcGxpY2F0aW9uLiBNYW51YWxseSBzZXR0aW5nIGluZGV4ZXMgaW4geW91ciAKK21hcHBpbmcgbWV0YWRhdGEgb3IgbWFudWFsbHkgbWFuaXB1bGF0aW5nIGRhdGFiYXNlIGluZGV4ZXMgdG8gaW5jbHVkZSAKK2ZyZXF1ZW50bHktcXVlcmllZCBmaWVsZHMgKGFzIHdlbGwgYXMgZHJvcHBpbmcgaW5kZXhlcyBvbiByYXJlbHktcXVlcmllZCAKK2ZpZWxkcykgY2FuIHlpZWxkIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJlbmVmaXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBIGRhdGFiYXNlIG11c3QgZG8gZXh0cmEgd29yayBvbiBpbnNlcnQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0byBtYWludGFpbiBhbgoraW5kZXguIFRoaXMgZXh0cmEgd29yayB3aWxsIGJlbmVmaXQgc2VsZWN0cyB3aXRoIFdIRVJFIGNsYXVzZXMsIHdoaWNoIHdpbGwKK2V4ZWN1dGUgbXVjaCBmYXN0ZXIgd2hlbiB0aGUgdGVybXMgaW4gdGhlIFdIRVJFIGNsYXVzZSBhcmUgYXBwcm9wcmlhdGVseQoraW5kZXhlZC4gU28sIGZvciBhIHJlYWQtbW9zdGx5IGFwcGxpY2F0aW9uLCBhcHByb3ByaWF0ZSBpbmRleGluZyB3aWxsIHNsb3cgZG93bgordXBkYXRlcyAod2hpY2ggYXJlIHJhcmUpIGJ1dCBncmVhdGx5IGFjY2VsZXJhdGUgcmVhZHMuIFRoaXMgbWVhbnMgdGhhdCB0aGUKK3N5c3RlbSBhcyBhIHdob2xlIHdpbGwgYmUgZmFzdGVyLCBhbmQgYWxzbyB0aGF0IHRoZSBkYXRhYmFzZSB3aWxsIGV4cGVyaWVuY2UKK2xlc3MgbG9hZCwgbWVhbmluZyB0aGF0IHRoZSBzeXN0ZW0gd2lsbCBiZSBtb3JlIHNjYWxhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitCZWFyIGluIG1pbmQgdGhhdCBvdmVyLWluZGV4aW5nIGlzIGEgYmFkIHRoaW5nLCBib3RoIGZvciBzY2FsYWJpbGl0eSBhbmQKK3BlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBwZXJmb3JtIGxvdHMgb2YgaW5zZXJ0cywgdXBkYXRlcywKK29yIGRlbGV0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpWTSBvcHRpbWl6YXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHJlbGlhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorTWFuaXB1bGF0aW5nIHZhcmlvdXMgcGFyYW1ldGVycyBvZiB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgKHN1Y2ggYXMgaG90c3BvdCAKK2NvbXBpbGF0aW9uIG1vZGVzIGFuZCB0aGUgbWF4aW11bSBtZW1vcnkpIGNhbiByZXN1bHQgaW4gcGVyZm9ybWFuY2UgCitpbXByb3ZlbWVudHMuIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgb3B0aW1pemluZyB0aGUgSlZNIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCwgCitwbGVhc2Ugc2VlIDx1bGluayB1cmw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ob3RzcG90L1BlcmZvcm1hbmNlRkFRLmh0bWwiLz4uCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgZGF0YSBjYWNoZQorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlLCBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK1VzaW5nIE9wZW5KUEEncyA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGUiPmRhdGEgYW5kIHF1ZXJ5IGNhY2hpbmc8L2xpbms+CitmZWF0dXJlcyBjYW4gb2Z0ZW4gcmVzdWx0IGluIGEgZHJhbWF0aWMgaW1wcm92ZW1lbnQgaW4gcGVyZm9ybWFuY2UuIAorQWRkaXRpb25hbGx5LCB0aGVzZSBjYWNoZXMgY2FuIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBhbW91bnQgb2YgbG9hZCBvbgordGhlIGRhdGFiYXNlLCBpbmNyZWFzaW5nIHRoZSBzY2FsYWJpbGl0eSBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBhcHBsaWNhdGlvbi4gIAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgPGxpdGVyYWw+TGFyZ2VUcmFuc2FjdGlvbjwvbGl0ZXJhbD4gdG8gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2V0IDxsaXRlcmFsPiBQb3B1bGF0ZURhdGFDYWNoZTwvbGl0ZXJhbD4gdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5wZXJmb3JtYW5jZSB2cy4gc2NhbGFiaWxpdHk8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGVzYyI+CitXaGVuIHVzaW5nIE9wZW5KUEEncyA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGUiPmRhdGEgY2FjaGluZzwvbGluaz4gCitmZWF0dXJlcyBpbiBhIHRyYW5zYWN0aW9uIHRoYXQgd2lsbCBkZWxldGUsIG1vZGlmeSwgb3IgY3JlYXRlIGEgdmVyeSBsYXJnZSAKK251bWJlciBvZiBvYmplY3RzIHlvdSBjYW4gc2V0IDxsaXRlcmFsPkxhcmdlVHJhbnNhY3Rpb248L2xpdGVyYWw+IHRvIHRydWUgYW5kIAorcGVyZm9ybSBwZXJpb2RpYyBmbHVzaGVzIGR1cmluZyB5b3VyIHRyYW5zYWN0aW9uIHRvIHJlZHVjZSBpdHMgbWVtb3J5IAorcmVxdWlyZW1lbnRzLiAgU2VlIHRoZSBKYXZhZG9jOiAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyLmh0bWwiPgorT3BlbkpQQUVudGl0eU1hbmFnZXIuc2V0TGFyZ2VUcmFuc2FjdGlvbjwvdWxpbms+LiAgTm90ZSB0aGF0IHRyYW5zYWN0aW9ucyBpbiAKK2xhcmdlIG1vZGUgaGF2ZSB0byBtb3JlIGFnZ3Jlc3NpdmVseSBmbHVzaCBpdGVtcyBmcm9tIHRoZSBkYXRhIGNhY2hlLgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitJZiB5b3VyIHRyYW5zYWN0aW9uIHdpbGwgdmlzaXQgb2JqZWN0cyB0aGF0IHlvdSBrbm93IGFyZSB2ZXJ5IHVubGlrZWx5IHRvIGJlCithY2Nlc3NlZCBieSBvdGhlciB0cmFuc2FjdGlvbnMsIGZvciBleGFtcGxlIGFuIGV4aGF1c3RpdmUgcmVwb3J0IHJ1biBvbmx5IG9uY2UgYQorbW9udGgsIHlvdSBjYW4gdHVybiBvZmYgcG9wdWxhdGlvbiBvZiB0aGUgZGF0YSBjYWNoZSBzbyB0aGF0IHRoZSB0cmFuc2FjdGlvbgorZG9lc24ndCBmaWxsIHRoZSBlbnRpcmUgZGF0YSBjYWNoZSB3aXRoIG9iamVjdHMgdGhhdCB3b24ndCBiZSBhY2Nlc3NlZCBhZ2Fpbi4KK0FnYWluLCBzZWUgdGhlIEphdmFkb2M6IAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuaHRtbCI+CitPcGVuSlBBRW50aXR5TWFuYWdlci5zZXRQb3B1bGF0ZURhdGFDYWNoZTwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgbG9nZ2luZywgcGVyZm9ybWFuY2UgdHJhY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5wZXJmb3JtYW5jZTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK0RldmVsb3BlciBvcHRpb25zIHN1Y2ggYXMgdmVyYm9zZSBsb2dnaW5nIGFuZCB0aGUgSkRCQyBwZXJmb3JtYW5jZSB0cmFja2VyIGNhbiAKK3Jlc3VsdCBpbiBzZXJpb3VzIHBlcmZvcm1hbmNlIGhpdHMgZm9yIHlvdXIgYXBwbGljYXRpb24uIEJlZm9yZSBldmFsdWF0aW5nIAorT3BlbkpQQSdzIHBlcmZvcm1hbmNlLCB0aGVzZSBvcHRpb25zIHNob3VsZCBhbGwgYmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCA8bGl0ZXJhbD5JZ25vcmVDaGFuZ2VzPC9saXRlcmFsPiB0byB0cnVlLCBvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPGxpdGVyYWw+Rmx1c2hCZWZvcmVRdWVyaWVzPC9saXRlcmFsPiB0byB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UgdnMuIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorV2hlbiBib3RoIHRoZSA8bGluayBsaW5rZW5kPSJvcGVuanBhLklnbm9yZUNoYW5nZXMiPjxsaXRlcmFsPgorb3BlbmpwYS5JZ25vcmVDaGFuZ2VzPC9saXRlcmFsPjwvbGluaz4gYW5kIAorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5GbHVzaEJlZm9yZVF1ZXJpZXMiPjxsaXRlcmFsPm9wZW5qcGEuRmx1c2hCZWZvcmVRdWVyaWVzCis8L2xpdGVyYWw+PC9saW5rPiBwcm9wZXJ0aWVzIGFyZSBzZXQgdG8gZmFsc2UsIE9wZW5KUEEgbmVlZHMgdG8gY29uc2lkZXIgCitpbi1tZW1vcnkgZGlydHkgaW5zdGFuY2VzIGR1cmluZyBxdWVyaWVzLiAgVGhpcyBjYW4gc29tZXRpbWVzIHJlc3VsdCBpbiBPcGVuSlBBCituZWVkaW5nIHRvIGV2YWx1YXRlIHRoZSBlbnRpcmUgZXh0ZW50IG9iamVjdHMgaW4gb3JkZXIgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IAorcXVlcnkgcmVzdWx0cywgd2hpY2ggY2FuIGhhdmUgZHJhc3RpYyBwZXJmb3JtYW5jZSBjb25zZXF1ZW5jZXMuICBJZiBpdCBpcyAKK2FwcHJvcHJpYXRlIGZvciB5b3VyIGFwcGxpY2F0aW9uLCBjb25maWd1cmluZyA8bGl0ZXJhbD5GbHVzaEJlZm9yZVF1ZXJpZXMKKzwvbGl0ZXJhbD4gdG8gYXV0b21hdGljYWxseSBmbHVzaCBiZWZvcmUgcXVlcmllcyBpbnZvbHZpbmcgZGlydHkgb2JqZWN0cyB3aWxsIAorZW5zdXJlIHRoYXQgdGhpcyBuZXZlciBoYXBwZW5zLiBTZXR0aW5nIDxsaXRlcmFsPklnbm9yZUNoYW5nZXM8L2xpdGVyYWw+IHRvIAorZmFsc2Ugd2lsbCByZXN1bHQgaW4gYSBzbWFsbCBwZXJmb3JtYW5jZSBoaXQgZXZlbiBpZiA8bGl0ZXJhbD5GbHVzaEJlZm9yZVF1ZXJpZXMKKzwvbGl0ZXJhbD4gaXMgdHJ1ZSwgYXMgaW5jcmVtZW50YWwgZmx1c2hpbmcgaXMgbm90IGFzIGVmZmljaWVudCBvdmVyYWxsIGFzIAorZGVsYXlpbmcgYWxsIGZsdXNoaW5nIHRvIGEgc2luZ2xlIG9wZXJhdGlvbiBkdXJpbmcgY29tbWl0LgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitTZXR0aW5nIDxsaXRlcmFsPklnbm9yZUNoYW5nZXM8L2xpdGVyYWw+IHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IHdpbGwgaGVscAorcGVyZm9ybWFuY2UsIHNpbmNlIGRpcnR5IG9iamVjdHMgY2FuIGJlIGlnbm9yZWQgZm9yIHF1ZXJpZXMsIG1lYW5pbmcgdGhhdAoraW5jcmVtZW50YWwgZmx1c2hpbmcgb3IgY2xpZW50LXNpZGUgcHJvY2Vzc2luZyBpcyBub3QgbmVjZXNzYXJ5LiBJdCB3aWxsIGFsc28KK2ltcHJvdmUgc2NhbGFiaWxpdHksIHNpbmNlIG92ZXJhbGwgZGF0YWJhc2Ugc2VydmVyIHVzYWdlIGlzIGRpbWluaXNoZWQuIE9uIHRoZQorb3RoZXIgaGFuZCwgc2V0dGluZyA8bGl0ZXJhbD5JZ25vcmVDaGFuZ2VzPC9saXRlcmFsPiB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4KK3dpbGwgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBzY2FsYWJpbGl0eSwgZXZlbiB3aGVuIHVzaW5nIGF1dG9tYXRpYyBmbHVzaGluZworYmVmb3JlIHF1ZXJpZXMsIHNpbmNlIG1vcmUgb3BlcmF0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgZGF0YWJhc2Ugc2VydmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmUgPGxpdGVyYWw+b3BlbmpwYS5Db25uZWN0aW9uUmV0YWluTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4gYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlIHZzLiBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK1RoZSA8bGluayBsaW5rZW5kPSJvcGVuanBhLkNvbm5lY3Rpb25SZXRhaW5Nb2RlIj48bGl0ZXJhbD5Db25uZWN0aW9uUmV0YWluTW9kZQorPC9saXRlcmFsPjwvbGluaz4gY29uZmlndXJhdGlvbiBvcHRpb24gY29udHJvbHMgd2hlbiBPcGVuSlBBIHdpbGwgb2J0YWluIGEgCitjb25uZWN0aW9uLCBhbmQgaG93IGxvbmcgaXQgd2lsbCBob2xkIHRoYXQgY29ubmVjdGlvbi4gVGhlIG9wdGltYWwgc2V0dGluZ3MgZm9yCit0aGlzIG9wdGlvbiB3aWxsIHZhcnkgY29uc2lkZXJhYmx5IGRlcGVuZGluZyBvbiB0aGUgcGFydGljdWxhciBiZWhhdmlvciBvZiAKK3lvdXIgYXBwbGljYXRpb24uIFlvdSBtYXkgZXZlbiBiZW5lZml0IGZyb20gdXNpbmcgZGlmZmVyZW50IHJldGFpbiBtb2RlcyBmb3IgCitkaWZmZXJlbnQgcGFydHMgb2YgeW91ciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGRlZmF1bHQgc2V0dGluZyBvZiA8bGl0ZXJhbD5vbi1kZW1hbmQ8L2xpdGVyYWw+IG1pbmltaXplcyB0aGUgYW1vdW50IG9mIHRpbWUKK3RoYXQgT3BlbkpQQSBob2xkcyBvbnRvIGEgZGF0YXN0b3JlIGNvbm5lY3Rpb24uIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBiZXN0CitvcHRpb24gZnJvbSBhIHNjYWxhYmlsaXR5IHN0YW5kcG9pbmQsIGFzIGRhdGFiYXNlIHJlc291cmNlcyBhcmUgaGVsZCBmb3IgYQorbWluaW1hbCBhbW91bnQgb2YgdGltZS4gSG93ZXZlciwgaWYgeW91IGFyZSBub3QgdXNpbmcgY29ubmVjdGlvbiBwb29saW5nLCBvcgoraWYgeW91ciA8Y2xhc3NuYW1lPkRhdGFTb3VyY2U8L2NsYXNzbmFtZT4gaXMgbm90IGVmZmljaWVudCBhdCBtYW5hZ2luZyBpdHMKK3Bvb2wsIHRoZW4gdGhpcyBkZWZhdWx0IHZhbHVlIGNvdWxkIGNhdXNlIHVuZGVzaXJhYmxlIHBvb2wgY29udGVudGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGZsYXQgaW5oZXJpdGFuY2UgCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5IHZzLiBkaXNrIHNwYWNlPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorTWFwcGluZyBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyB0byBhIHNpbmdsZSBkYXRhYmFzZSB0YWJsZSBpcyBmYXN0ZXIgZm9yIG1vc3QgCitvcGVyYXRpb25zIHRoYW4gb3RoZXIgc3RyYXRlZ2llcyBlbXBsb3lpbmcgbXVsdGlwbGUgdGFibGVzLiBJZiBpdCBpcyAKK2FwcHJvcHJpYXRlIGZvciB5b3VyIGFwcGxpY2F0aW9uLCB5b3Ugc2hvdWxkIHVzZSB0aGlzIHN0cmF0ZWd5IHdoZW5ldmVyIAorcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0hvd2V2ZXIsIHRoaXMgc3RyYXRlZ3kgd2lsbCByZXF1aXJlIG1vcmUgZGlzayBzcGFjZSBvbiB0aGUgZGF0YWJhc2Ugc2lkZS4gRGlzaworc3BhY2UgaXMgcmVsYXRpdmVseSBpbmV4cGVuc2l2ZSwgYnV0IGlmIHlvdXIgb2JqZWN0IG1vZGVsIGlzIHBhcnRpY3VsYXJseSBsYXJnZSwKK2l0IGNhbiBiZWNvbWUgYSBmYWN0b3IuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2ggc2VxdWVuY2UgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorRm9yIGFwcGxpY2F0aW9ucyB0aGF0IHBlcmZvcm0gbGFyZ2UgYnVsayBpbnNlcnRzLCB0aGUgcmV0cmlldmFsIG9mIHNlcXVlbmNlIAorbnVtYmVycyBjYW4gYmUgYSBib3R0bGVuZWNrLiAgSW5jcmVhc2luZyBzZXF1ZW5jZSBpbmNyZW1lbnRzIGFuZCB1c2luZyAKK3RhYmxlLWJhc2VkIHJhdGhlciB0aGFuIG5hdGl2ZSBkYXRhYmFzZSBzZXF1ZW5jZXMgY2FuIHJlZHVjZSBvciBlbGltaW5hdGUgCit0aGlzIGJvdHRsZW5lY2suIEluIHNvbWUgY2FzZXMsIGltcGxlbWVudGluZyB5b3VyIG93biBzZXF1ZW5jZSBmYWN0b3J5IGNhbiAKK2Z1cnRoZXIgb3B0aW1pemUgc2VxdWVuY2UgbnVtYmVyIHJldHJpZXZhbC4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIG9wdGltaXN0aWMgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorVXNpbmcgZGF0YXN0b3JlIHRyYW5zYWN0aW9ucyB0cmFuc2xhdGVzIGludG8gcGVzc2ltaXN0aWMgZGF0YWJhc2Ugcm93IGxvY2tpbmcsIAord2hpY2ggY2FuIGJlIGEgcGVyZm9ybWFuY2UgaGl0IChkZXBlbmRpbmcgb24gdGhlIGRhdGFiYXNlKS4gSWYgYXBwcm9wcmlhdGUgZm9yIAoreW91ciBhcHBsaWNhdGlvbiwgb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMgYXJlIHR5cGljYWxseSBmYXN0ZXIgdGhhbiBkYXRhc3RvcmUgCit0cmFuc2FjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK09wdGltaXN0aWMgdHJhbnNhY3Rpb25zIHByb3ZpZGUgdGhlIHNhbWUgdHJhbnNhY3Rpb25hbCBndWFyYW50ZWVzIGFzIGRhdGFzdG9yZQordHJhbnNhY3Rpb25zLCBleGNlcHQgdGhhdCB5b3UgbXVzdCBoYW5kbGUgYSBwb3RlbnRpYWwgb3B0aW1pc3RpYyB2ZXJpZmljYXRpb24KK2V4Y2VwdGlvbiBhdCB0aGUgZW5kIG9mIGEgdHJhbnNhY3Rpb24gaW5zdGVhZCBvZiBhc3N1bWluZyB0aGF0IGEgdHJhbnNhY3Rpb24KK3dpbGwgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlLiBJbiBtYW55IGFwcGxpY2F0aW9ucywgaXQgaXMgdW5saWtlbHkgdGhhdCBkaWZmZXJlbnQKK2NvbmN1cnJlbnQgdHJhbnNhY3Rpb25zIHdpbGwgb3BlcmF0ZSBvbiB0aGUgc2FtZSBzZXQgb2YgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLAorc28gb3B0aW1pc3RpYyB2ZXJpZmljYXRpb24gaW5jcmVhc2VzIHRoZSBjb25jdXJyZW5jeSwgYW5kIHRoZXJlZm9yZSBib3RoIHRoZQorcGVyZm9ybWFuY2UgYW5kIHNjYWxhYmlsaXR5IGNoYXJhY3RlcmlzdGljcywgb2YgdGhlIGFwcGxpY2F0aW9uLiBBIGNvbW1vbgorYXBwcm9hY2ggdG8gaGFuZGxpbmcgb3B0aW1pc3RpYyB2ZXJpZmljYXRpb24gZXhjZXB0aW9ucyBpcyB0byBzaW1wbHkgcHJlc2VudCB0aGUKK2VuZCB1c2VyIHdpdGggdGhlIGZhY3QgdGhhdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMgaGFwcGVuZWQsIGFuZCByZXF1aXJlIHRoYXQKK3RoZSB1c2VyIHJlZG8gYW55IHdvcmsuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBxdWVyeSBhZ2dyZWdhdGVzIGFuZCBwcm9qZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlLCBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK1VzaW5nIGFnZ3JlZ2F0ZXMgdG8gY29tcHV0ZSByZXBvcnRpbmcgZGF0YSBvbiB0aGUgZGF0YWJhc2Ugc2VydmVyIGNhbiAKK2RyYXN0aWNhbGx5IHNwZWVkIHVwIHF1ZXJpZXMuICBTaW1pbGFybHksIHVzaW5nIHByb2plY3Rpb25zIHdoZW4geW91IGFyZSAKK2ludGVyZXN0ZWQgaW4gc3BlY2lmaWMgb2JqZWN0IGZpZWxkcyBvciByZWxhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGVudGlyZSBvYmplY3QKK3N0YXRlIGNhbiByZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhIE9wZW5KUEEgbXVzdCB0cmFuc2ZlciBmcm9tIHRoZSBkYXRhYmFzZSB0byAKK3lvdXIgYXBwbGljYXRpb24uICAKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzIGNsb3NlIHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitVbmRlciBjZXJ0YWluIHNldHRpbmdzLCA8Y2xhc3NuYW1lPiBFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IHMsIE9wZW5KUEEKKzxjbGFzc25hbWU+RXh0ZW50PC9jbGFzc25hbWU+IGl0ZXJhdG9ycywgYW5kIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4KK3Jlc3VsdHMgbWF5IGJlIGJhY2tlZCBieSByZXNvdXJjZXMgaW4gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBPcGVuSlBBIHRvIHVzZSBzY3JvbGxhYmxlIGN1cnNvcnMgYW5kIGxhenkKK29iamVjdCBpbnN0YW50aWF0aW9uIGJ5IGRlZmF1bHQsIGVhY2ggcXVlcnkgcmVzdWx0IHdpbGwgaG9sZCBvcGVuIGEgPGNsYXNzbmFtZT4KK1Jlc3VsdFNldDwvY2xhc3NuYW1lPiBvYmplY3QsIHdoaWNoLCBpbiB0dXJuLCB3aWxsIGhvbGQgb3BlbiBhIDxjbGFzc25hbWU+CitTdGF0ZW1lbnQ8L2NsYXNzbmFtZT4gb2JqZWN0IChwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcgcmUtdXNlZCkuIEdhcmJhZ2UKK2NvbGxlY3Rpb24gd2lsbCBjbGVhbiB1cCB0aGVzZSByZXNvdXJjZXMsIHNvIGl0IGlzIG5ldmVyIG5lY2Vzc2FyeSB0byBleHBsaWNpdGx5CitjbG9zZSB0aGVtLCBidXQgaXQgaXMgYWx3YXlzIGZhc3RlciBpZiBpdCBpcyBkb25lIGF0IHRoZSBhcHBsaWNhdGlvbiBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGRldGFjaGVkIHN0YXRlIG1hbmFnZXJzCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2U8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGVzYyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0F0dGFjaGluZyBhbmQgZXZlbiBwZXJzaXN0aW5nIGluc3RhbmNlcyBjYW4gYmUgbW9yZSBlZmZpY2llbnQgd2hlbiB5b3VyIGRldGFjaGVkCitvYmplY3RzIHVzZSBkZXRhY2hlZCBzdGF0ZSBtYW5hZ2Vycy4gQnkgZGVmYXVsdCwgT3BlbkpQQSBkb2VzIG5vdCB1c2UgZGV0YWNoZWQKK3N0YXRlIG1hbmFnZXJzIHdoZW4gc2VyaWFsaXppbmcgYW4gaW5zdGFuY2UgYWNyb3NzIHRpZXJzLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kZXRhY2hfZ3JhcGgiLz4gZm9yIGhvdyB0byBmb3JjZSBPcGVuSlBBIHRvIHVzZQorZGV0YWNoZWQgc3RhdGUgbWFuYWdlcnMgYWNyb3NzIHRpZXJzLCBhbmQgZm9yIG90aGVyIG9wdGlvbnMgZm9yIG1vcmUgZWZmaWNpZW50CithdHRhY2htZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZG93bnNpZGUgb2YgdXNpbmcgYSBkZXRhY2hlZCBzdGF0ZSBtYW5hZ2VyIGFjcm9zcyB0aWVycyBpcyB0aGF0IHlvdXIKK2VuaGFuY2VkIHBlcnNpc3RlbnQgY2xhc3NlcyBhbmQgdGhlIE9wZW5KUEEgbGlicmFyaWVzIG11c3QgYmUgYXZhaWxhYmxlIG9uIHRoZQorY2xpZW50IHRpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxpemUgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorV2hlbiBwb3NzaWJsZSBhbmQgYXBwcm9wcmlhdGUsIHJlLXVzaW5nIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPnMgCithbmQgc2V0dGluZyB0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5SZXRhaW5TdGF0ZSI+PGxpdGVyYWw+UmV0YWluU3RhdGUKKzwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IG1heSByZXN1bHQgaW4KK3NpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW5zLCBzaW5jZSB0aGUgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+J3MKK2J1aWx0LWluIG9iamVjdCBjYWNoZSB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSBtdWx0aXRocmVhZGVkIG9wZXJhdGlvbiBvbmx5IHdoZW4gbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2U8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGVzYyI+CitPcGVuSlBBIHJlc3BlY3RzIHRoZSA8bGluayBsaW5rZW5kPSJvcGVuanBhLk11bHRpdGhyZWFkZWQiPjxsaXRlcmFsPgorb3BlbmpwYS5NdWx0aXRocmVhZGVkPC9saXRlcmFsPjwvbGluaz4gb3B0aW9uIGluIHRoYXQgaXQgZG9lcyBub3QgaW1wb3NlIGFzICAKK211Y2ggc3luY2hyb25pemF0aW9uIG92ZXJoZWFkIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3Qgc2V0IHRoaXMgdmFsdWUgdG8gCis8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4gSWYgeW91ciBhcHBsaWNhdGlvbiBpcyBndWFyYW50ZWVkIHRvIG9ubHkgdXNlIAorc2luZ2xlLXRocmVhZGVkIGFjY2VzcyB0byBPcGVuSlBBIHJlc291cmNlcyBhbmQgcGVyc2lzdGVudCBvYmplY3RzLCBsZWF2aW5nIAordGhpcyBvcHRpb24gYXMgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+IHdpbGwgcmVkdWNlIHN5bmNocm9uaXphdGlvbiBvdmVyaGVhZCwgCithbmQgbWF5IHJlc3VsdCBpbiBhIG1vZGVzdCBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIGxhcmdlIGRhdGEgc2V0IGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorSWYgeW91IGV4ZWN1dGUgcXVlcmllcyB0aGF0IHJldHVybiBsYXJnZSBudW1iZXJzIG9mIG9iamVjdHMgb3IgaGF2ZSByZWxhdGlvbnMgCisoY29sbGVjdGlvbnMgb3IgbWFwcykgdGhhdCBhcmUgbGFyZ2UsIGFuZCBpZiB5b3Ugb2Z0ZW4gb25seSBhY2Nlc3MgcGFydHMgb2YgCit0aGVzZSBkYXRhIHNldHMsIGVuYWJsaW5nIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX2xycyI+bGFyZ2UgcmVzdWx0IAorc2V0IGhhbmRsaW5nPC9saW5rPiB3aGVyZSBhcHByb3ByaWF0ZSBjYW4gZHJhbWF0aWNhbGx5IHNwZWVkIHVwIHlvdXIgCithcHBsaWNhdGlvbiwgc2luY2UgT3BlbkpQQSB3aWxsIGJyaW5nIHRoZSBkYXRhIHNldHMgaW50byBtZW1vcnkgZnJvbSB0aGUgCitkYXRhYmFzZSBvbmx5IGFzIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBsYXJnZSBkYXRhIHNldCBoYW5kbGluZworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlLCBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK0lmIHlvdSBoYXZlIGVuYWJsZWQgc2Nyb2xsYWJsZSByZXN1bHQgc2V0cyBhbmQgb24tZGVtYW5kIGxvYWRpbmcgYnV0IGRvIHlvdSBub3QKK3JlcXVpcmUgaXQsIGNvbnNpZGVyIGRpc2FibGluZyBpdCBhZ2Fpbi4gIFNvbWUgSkRCQyBkcml2ZXJzIGFuZCBkYXRhYmFzZXMgCisoU1FMU2VydmVyIGZvciBleGFtcGxlKSBhcmUgbXVjaCBzbG93ZXIgd2hlbiB1c2VkIHdpdGggc2Nyb2xsaW5nIHJlc3VsdCBzZXRzLgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIDxjbGFzc25hbWU+RHluYW1pY1NjaGVtYUZhY3Rvcnk8L2NsYXNzbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5wZXJmb3JtYW5jZSwgdmFsaWRhdGlvbjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK0lmIHlvdSBhcmUgdXNpbmcgYSA8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuU2NoZW1hRmFjdG9yeSI+PGxpdGVyYWw+CitvcGVuanBhLmpkYmMuU2NoZW1hRmFjdG9yeTwvbGl0ZXJhbD48L2xpbms+IHNldHRpbmcgb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gCit0aGUgZGVmYXVsdCBvZiA8bGl0ZXJhbD5keW5hbWljPC9saXRlcmFsPiwgY29uc2lkZXIgc3dpdGNoaW5nIGJhY2suICBXaGlsZSBvdGhlcgorZmFjdG9yaWVzIGNhbiBlbnN1cmUgdGhhdCBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIHZhbGlkIHdoZW4gCithIHBlcnNpc3RlbnQgY2xhc3MgaXMgZmlyc3QgdXNlZCwgdGhpcyBjYW4gYmUgYSBzbG93IHByb2Nlc3MuICBUaG91Z2ggdGhlIAordmFsaWRhdGlvbiBpcyBvbmx5IHBlcmZvcm1lZCBvbmNlIGZvciBlYWNoIGNsYXNzLCBzd2l0Y2hpbmcgYmFjayB0byB0aGUKKzxjbGFzc25hbWU+RHluYW1pY1NjaGVtYUZhY3Rvcnk8L2NsYXNzbmFtZT4gY2FuIHJlZHVjZSB0aGUgd2FybS11cCB0aW1lIGZvciAKK3lvdXIgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvIG5vdCB1c2UgWEEgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2VudGVycHJpc2VfeGEiPlhBIHRyYW5zYWN0aW9uczwvbGluaz4gY2FuIGJlIG9yZGVycyBvZgorbWFnbml0dWRlIHNsb3dlciB0aGFuIHN0YW5kYXJkIHRyYW5zYWN0aW9ucy4gVW5sZXNzIGRpc3RyaWJ1dGVkIHRyYW5zYWN0aW9uIAorZnVuY3Rpb25hbGl0eSBpcyByZXF1aXJlZCBieSB5b3VyIGFwcGxpY2F0aW9uLCB1c2Ugc3RhbmRhcmQgdHJhbnNhY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitSZWNhbGwgdGhhdCBYQSB0cmFuc2FjdGlvbnMgYXJlIGRpc3RpbmN0IGZyb20gbWFuYWdlZCB0cmFuc2FjdGlvbnMgLSBtYW5hZ2VkCit0cmFuc2FjdGlvbiBzZXJ2aWNlcyBzdWNoIGFzIHRoYXQgcHJvdmlkZWQgYnkgRUpCIGRlY2xhcmF0aXZlIHRyYW5zYWN0aW9ucyBjYW4KK2JlIHVzZWQgYm90aCB3aXRoIFhBIGFuZCBub24tWEEgdHJhbnNhY3Rpb25zLiBYQSB0cmFuc2FjdGlvbnMgc2hvdWxkIG9ubHkgYmUKK3VzZWQgd2hlbiBhIGdpdmVuIGJ1c2luZXNzIHRyYW5zYWN0aW9uIGludm9sdmVzIG11bHRpcGxlIGRpZmZlcmVudCB0cmFuc2FjdGlvbmFsCityZXNvdXJjZXMgKGFuIE9yYWNsZSBkYXRhYmFzZSBhbmQgYW4gSUJNIHRyYW5zYWN0aW9uYWwgbWVzc2FnZSBxdWV1ZSwgZm9yCitleGFtcGxlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIDxjbGFzc25hbWU+U2V0PC9jbGFzc25hbWU+cyBpbnN0ZWFkIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc25hbWU+TGlzdC9Db2xsZWN0aW9uPC9jbGFzc25hbWU+cworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlLCBzY2FsYWJpbGl0eTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkZXNjIj4KK1RoZXJlIGlzIGEgc21hbGwgYW1vdW50IG9mIGV4dHJhIG92ZXJoZWFkIGZvciBPcGVuSlBBIHRvIG1haW50YWluIGNvbGxlY3Rpb25zIAord2hlcmUgZWFjaCBlbGVtZW50IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4gIElmIHlvdXIgYXBwbGljYXRpb24gZG9lcyAKK25vdCByZXF1aXJlIGR1cGxpY2F0ZXMgZm9yIGEgY29sbGVjdGlvbiwgeW91IHNob3VsZCBhbHdheXMgZGVjbGFyZSB5b3VyCitmaWVsZHMgdG8gYmUgb2YgdHlwZSA8Y2xhc3NuYW1lPlNldCwgU29ydGVkU2V0LCBIYXNoU2V0LDwvY2xhc3NuYW1lPiBvciAKKzxjbGFzc25hbWU+VHJlZVNldDwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKwkJCQk8cm93PgorCQkJCQk8ZW50cnkgY29sbmFtZT0ibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHF1ZXJ5IHBhcmFtZXRlcnMgaW5zdGVhZCBvZiBlbmNvZGluZyBzZWFyY2ggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpbiBmaWx0ZXIgc3RyaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPnBlcmZvcm1hbmNlPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKwkJCQkJPC9lbnRyeT4KKwkJCQkJPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorSWYgeW91ciBxdWVyaWVzIGRlcGVuZCBvbiBwYXJhbWV0ZXIgZGF0YSBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHlvdSBzaG91bGQgdXNlIAorcXVlcnkgcGFyYW1ldGVycyByYXRoZXIgdGhhbiBkeW5hbWljYWxseSBidWlsZGluZyBkaWZmZXJlbnQgcXVlcnkgc3RyaW5ncy4gCitPcGVuSlBBIHBlcmZvcm1zIGFnZ3Jlc3NpdmUgY2FjaGluZyBvZiBxdWVyeSBjb21waWxhdGlvbiBkYXRhLCBhbmQgdGhlIAorZWZmZWN0aXZlbmVzcyBvZiB0aGlzIGNhY2hlIGlzIGRpbWluaXNoZWQgaWYgbXVsdGlwbGUgcXVlcnkgZmlsdGVycyBhcmUgdXNlZCAKK3doZXJlIGEgc2luZ2xlIG9uZSBjb3VsZCBoYXZlIHN1ZmZpY2VkLgorCQkJCQk8L2VudHJ5PgorCQkJCTwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdW5lIHlvdXIgZmV0Y2ggZ3JvdXBzIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5wZXJmb3JtYW5jZSwgc2NhbGFiaWxpdHk8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGVzYyI+CitUaGUgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoIj5mZXRjaCBncm91cHM8L2xpbms+IHVzZWQgd2hlbiBsb2FkaW5nIGFuIAorb2JqZWN0IGNvbnRyb2wgaG93IG11Y2ggZGF0YSBpcyBlYWdlcmx5IGxvYWRlZCwgYW5kIGJ5IGV4dGVuc2lvbiwgd2hpY2ggZmllbGRzIAorbXVzdCBiZSBsYXppbHkgbG9hZGVkIGF0IGEgZnV0dXJlIHRpbWUuIFRoZSBpZGVhbCBmZXRjaCBncm91cCBjb25maWd1cmF0aW9uIAorbG9hZHMgYWxsIHRoZSBkYXRhIHRoYXQgaXMgbmVlZGVkIGluIG9uZSBmZXRjaCwgYW5kIG5vIGV4dHJhIGZpZWxkcyAtIHRoaXMgCittaW5pbWl6ZXMgYm90aCB0aGUgYW1vdW50IG9mIGRhdGEgdHJhbnNmZXJyZWQgZnJvbSB0aGUgZGF0YWJhc2UsIGFuZCB0aGUKK251bWJlciBvZiB0cmlwcyB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIGV4dHJhIGZpZWxkcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZXRjaCBncm91cHMgKGluIHBhcnRpY3VsYXIsIGxhcmdlIGZpZWxkcworc3VjaCBhcyBiaW5hcnkgZGF0YSwgb3IgcmVsYXRpb25zIHRvIG90aGVyIHBlcnNpc3RlbmNlLWNhcGFibGUgb2JqZWN0cyksIHRoZW4KK25ldHdvcmsgb3ZlcmhlYWQgKGZvciB0aGUgZXh0cmEgZGF0YSkgYW5kIGRhdGFiYXNlIHByb2Nlc3NpbmcgKGZvciBhbnkgbmVjZXNzYXJ5CithZGRpdGlvbmFsIGpvaW5zKSB3aWxsIGh1cnQgeW91ciBhcHBsaWNhdGlvbidzIHBlcmZvcm1hbmNlLiBJZiB0b28gZmV3IGZpZWxkcworYXJlIHNwZWNpZmllZCBpbiB0aGUgZmV0Y2ggZ3JvdXBzLCB0aGVuIE9wZW5KUEEgd2lsbCBoYXZlIHRvIG1ha2UgYWRkaXRpb25hbAordHJpcHMgdG8gdGhlIGRhdGFiYXNlIHRvIGxvYWQgYWRkaXRpb25hbCBmaWVsZHMgYXMgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5wZXJmb3JtYW5jZSwgc2NhbGFiaWxpdHk8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGVzYyI+CitVc2luZyA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXIiPmVhZ2VyIGZldGNoaW5nPC9saW5rPiB3aGVuIAorbG9hZGluZyBzdWJjbGFzcyBkYXRhIG9yIHRyYXZlcnNpbmcgcmVsYXRpb25zIGZvciBlYWNoIGluc3RhbmNlIGluIGEgbGFyZ2UgCitjb2xsZWN0aW9uIG9mIHJlc3VsdHMgY2FuIHNwZWVkIHVwIGRhdGEgbG9hZGluZyBieSBvcmRlcnMgb2YgbWFnbml0dWRlLgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIEJyb2tlckltcGwgZmluYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+cGVyZm9ybWFuY2UsIHNjYWxhYmlsaXR5PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRlc2MiPgorT3V0c2lkZSBvZiBhIEphdmEgRUUgNSBhcHBsaWNhdGlvbiBzZXJ2ZXIgb3Igb3RoZXIgSlBBIHBlcnNpc3RlbmNlIGNvbnRhaW5lciwKK09wZW5KUEEncyBFbnRpdHlNYW5hZ2VycyB1c2UgZmluYWxpemVycyB0byBlbnN1cmUgdGhhdCByZXNvdXJjZXMKK2dldCBjbGVhbmVkIHVwLiBJZiB5b3UgYXJlIHByb3Blcmx5IG1hbmFnaW5nIHlvdXIgcmVzb3VyY2VzLCB0aGlzIGZpbmFsaXphdGlvbgoraXMgbm90IG5lY2Vzc2FyeSwgYW5kIHdpbGwgaW50cm9kdWNlIHVubmVlZGVkIHN5bmNocm9uaXphdGlvbiwgbGVhZGluZyB0bworc2NhbGFiaWxpdHkgcHJvYmxlbXMuIFlvdSBjYW4gZGlzYWJsZSB0aGlzIHByb3RlY3RpdmUgYmVoYXZpb3IgYnkgc2V0dGluZyB0aGUKKzxsaXRlcmFsPm9wZW5qcGEuQnJva2VySW1wbDwvbGl0ZXJhbD4gcHJvcGVydHkgdG8KKzxsaXRlcmFsPm5vbi1maW5hbGl6aW5nPC9saXRlcmFsPi4gU2VlIDx4cmVmCitsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZV9icm9rZXJfZmluYWxpemF0aW9uIi8+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9wYy54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfcGMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjQxMDMKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfcGMueG1sCkBAIC0wLDAgKzEsMjQyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLiAgIAorLS0+Cis8Y2hhcHRlciBpZD0icmVmX2d1aWRlX3BjIj4KKyAgICA8dGl0bGU+CisgICAgICAgIFBlcnNpc3RlbnQgQ2xhc3NlcworICAgIDwvdGl0bGU+CisgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGMiPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIHBlcnNpc3RlbnQgY2xhc3NlcworICAgICAgICA8L3ByaW1hcnk+CisgICAgPC9pbmRleHRlcm0+CisgICAgPHBhcmE+CitQZXJzaXN0ZW50IGNsYXNzIGJhc2ljcyBhcmUgY292ZXJlZCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGMiLz4KK29mIHRoZSBKUEEgT3ZlcnZpZXcuIFRoaXMgY2hhcHRlciBkZXRhaWxzIHRoZSBwZXJzaXN0ZW50IGNsYXNzIGZlYXR1cmVzIE9wZW5KUEEKK29mZmVycyBiZXlvbmQgdGhlIGNvcmUgSlBBIHNwZWNpZmljYXRpb24uCisgICAgPC9wYXJhPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfcGNjbGFzc2VzIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgUGVyc2lzdGVudCBDbGFzcyBMaXN0CisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3BjY2xhc3NlcyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGNsYXNzZXMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgbGlzdAorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19wY2NsYXNzZXMiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgUENDbGFzc2VzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1VubGlrZSBtYW55IE9STSBwcm9kdWN0cywgT3BlbkpQQSBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgYWxsIG9mIHlvdXIKK3BlcnNpc3RlbnQgY2xhc3NlcyBhdCBzdGFydHVwLiBPcGVuSlBBIGRpc2NvdmVycyBuZXcgcGVyc2lzdGVudCBjbGFzc2VzCithdXRvbWF0aWNhbGx5IGFzIHRoZXkgYXJlIGxvYWRlZCBpbnRvIHRoZSBKVk07IGluIGZhY3QgeW91IGNhbiBpbnRyb2R1Y2UgbmV3CitwZXJzaXN0ZW50IGNsYXNzZXMgaW50byBydW5uaW5nIGFwcGxpY2F0aW9ucyB1bmRlciBPcGVuSlBBLiBIb3dldmVyLCB0aGVyZSBhcmUKK2NlcnRhaW4gc2l0dWF0aW9ucyBpbiB3aGljaCBwcm92aWRpbmcgT3BlbkpQQSB3aXRoIGEgcGVyc2lzdGVudCBjbGFzcyBsaXN0IGlzCitoZWxwZnVsOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIG11c3QgYmUgYWJsZSB0byBtYXRjaCBlbnRpdHkgbmFtZXMgaW4gSlBRTCBxdWVyaWVzIHRvIHBlcnNpc3RlbnQKK2NsYXNzZXMuIE9wZW5KUEEgYXV0b21hdGljYWxseSBrbm93cyB0aGUgZW50aXR5IG5hbWVzIG9mIGFueSBwZXJzaXN0ZW50IGNsYXNzZXMKK2FscmVhZHkgbG9hZGVkIGludG8gdGhlIEpWTS4gVG8gbWF0Y2ggZW50aXR5IG5hbWVzIHRvIGNsYXNzZXMgdGhhdCBoYXZlIG5vdCBiZWVuCitsb2FkZWQsIGhvd2V2ZXIsIHlvdSBtdXN0IHN1cHBseSBhIHBlcnNpc3RlbnQgY2xhc3MgbGlzdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiBPcGVuSlBBIG1hbmlwdWxhdGVzIGNsYXNzZXMgaW4gYSBwZXJzaXN0ZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgT3BlbkpQQQorbXVzdCBiZSBhd2FyZSBvZiBhbGwgdGhlIGNsYXNzZXMgaW4gdGhlIGhpZXJhcmNoeS4gSWYgc29tZSBvZiB0aGUgY2xhc3NlcyBoYXZlCitub3QgYmVlbiBsb2FkZWQgaW50byB0aGUgSlZNIHlldCwgT3BlbkpQQSBtYXkgbm90IGtub3cgYWJvdXQgdGhlbSwgYW5kIHF1ZXJpZXMKK21heSByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdSBjb25maWd1cmUgT3BlbkpQQSB0byBjcmVhdGUgdGhlIG5lZWRlZCBkYXRhYmFzZSBzY2hlbWEgb24gc3RhcnR1cCAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfbWFwcGluZ19zeW5jaCIvPiksIE9wZW5KUEEgbXVzdCBrbm93IGFsbCBvZiB5b3VyCitwZXJzaXN0ZW50IGNsYXNzZXMgdXAtZnJvbnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDxwYXJhPgorV2hlbiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUgYSBmYWN0b3IgaW4geW91ciBKUEEgYXBwbGljYXRpb24sIHVzZSB0aGUKKzxsaXRlcmFsPmNsYXNzPC9saXRlcmFsPiwgPGxpdGVyYWw+bWFwcGluZy1maWxlPC9saXRlcmFsPiwgYW5kIDxsaXRlcmFsPgoramFyLWZpbGU8L2xpdGVyYWw+IGVsZW1lbnRzIG9mIEpQQSdzIHN0YW5kYXJkIFhNTCBmb3JtYXQgdG8gbGlzdCB5b3VyIHBlcnNpc3RlbnQKK2NsYXNzZXMuIFNlZSA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfcGVyc2lzdGVuY2VfeG1sIi8+IGZvciBkZXRhaWxzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CitMaXN0aW5nIHBlcnNpc3RlbnQgY2xhc3NlcyAob3IgdGhlaXIgbWV0YWRhdGEgb3IgamFyIGZpbGVzKSBpcyBhbiBhbGwtb3Itbm90aGluZworZW5kZWF2b3IuIElmIHlvdXIgcGVyc2lzdGVudCBjbGFzcyBsaXN0IGlzIG5vbi1lbXB0eSwgT3BlbkpQQSB3aWxsIGFzc3VtZSB0aGF0CithbnkgdW5saXN0ZWQgY2xhc3MgaXMgbm90IHBlcnNpc3RlbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19lbmhhbmNlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRW5oYW5jZW1lbnQKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZSI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBlbmhhbmNlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIG9wZW5qcGFjCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgIGVuaGFuY2VyCisgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorSW4gb3JkZXIgdG8gcHJvdmlkZSBvcHRpbWFsIHJ1bnRpbWUgcGVyZm9ybWFuY2UsIGZsZXhpYmxlIGxhenkgbG9hZGluZywgYW5kCitlZmZpY2llbnQsIGltbWVkaWF0ZSBkaXJ0eSB0cmFja2luZywgT3BlbkpQQSB1c2VzIGFuIDxlbXBoYXNpcz4gZW5oYW5jZXIKKzwvZW1waGFzaXM+LiBBbiBlbmhhbmNlciBpcyBhIHRvb2wgdGhhdCBhdXRvbWF0aWNhbGx5IGFkZHMgY29kZSB0byB5b3VyCitwZXJzaXN0ZW50IGNsYXNzZXMgYWZ0ZXIgeW91IGhhdmUgd3JpdHRlbiB0aGVtLiBUaGUgZW5oYW5jZXIgcG9zdC1wcm9jZXNzZXMgdGhlCitieXRlY29kZSBnZW5lcmF0ZWQgYnkgeW91ciBKYXZhIGNvbXBpbGVyLCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSBmaWVsZHMgYW5kCittZXRob2RzIHRvIGltcGxlbWVudCB0aGUgcmVxdWlyZWQgcGVyc2lzdGVuY2UgZmVhdHVyZXMuIFRoaXMgYnl0ZWNvZGUKK21vZGlmaWNhdGlvbiBwZXJmZWN0bHkgcHJlc2VydmVzIHRoZSBsaW5lIG51bWJlcnMgaW4gc3RhY2sgdHJhY2VzIGFuZCBpcworY29tcGF0aWJsZSB3aXRoIEphdmEgZGVidWdnZXJzLiBJbiBmYWN0LCB0aGUgb25seSBjaGFuZ2UgdG8gZGVidWdnaW5nCitpcyB0aGF0IHRoZSBwZXJzaXN0ZW50IHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgb2YgZW50aXR5IGNsYXNzZXMgdXNpbmcKK3Byb3BlcnR5IGFjY2VzcyB3aWxsIGJlIHByZWZpeGVkIHdpdGggPGxpdGVyYWw+cGM8L2xpdGVyYWw+IGluIHN0YWNrIHRyYWNlcyBhbmQKK3N0ZXAtdGhyb3VnaHMuIEZvciBleGFtcGxlLCBpZiB5b3VyIGVudGl0eSBoYXMgYSA8bWV0aG9kbmFtZT5nZXRJZDwvbWV0aG9kbmFtZT4KK21ldGhvZCBmb3IgcGVyc2lzdGVudCBwcm9wZXJ0eSA8bGl0ZXJhbD5pZDwvbGl0ZXJhbD4sIGFuZCB0aGF0IG1ldGhvZCB0aHJvd3MgYW4KK2V4Y2VwdGlvbiwgdGhlIHN0YWNrIHRyYWNlIHdpbGwgcmVwb3J0IHRoZSBleGNlcHRpb24gZnJvbSBtZXRob2QgPG1ldGhvZG5hbWU+CitwY2dldElkPC9tZXRob2RuYW1lPi4gVGhlIGxpbmUgbnVtYmVycywgaG93ZXZlciwgd2lsbCBjb3JyZWN0bHkgY29ycmVzcG9uZCB0bwordGhlIDxtZXRob2RuYW1lPmdldElkPC9tZXRob2RuYW1lPiBtZXRob2QgaW4geW91ciBzb3VyY2UgZmlsZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPCEtLSBQTkcgaW1hZ2UgZGF0YSwgNTA5IHggMTMzIChzZWUgUkVBRE1FKSAtLT4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltZy9lbmhhbmNlbWVudC5wbmciIHdpZHRoPSIzMzlweCIvPgorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgPHBhcmE+CitUaGUgZGlhZ3JhbSBhYm92ZSBpbGx1c3RyYXRlcyB0aGUgY29tcGlsYXRpb24gb2YgYSBwZXJzaXN0ZW50IGNsYXNzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorWW91IGNhbiBhZGQgdGhlIE9wZW5KUEEgZW5oYW5jZXIgdG8geW91ciBidWlsZCBwcm9jZXNzLCBvciB1c2UgSmF2YSAxLjUncyBuZXcKK2luc3RydW1lbnRhdGlvbiBmZWF0dXJlcyB0byB0cmFuc3BhcmVudGx5IGVuaGFuY2UgcGVyc2lzdGVudCBjbGFzc2VzIHdoZW4gdGhleQorYXJlIGxvYWRlZCBpbnRvIHRoZSBKVk0uIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgZWFjaCBvcHRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19lbmhhbmNlX2J1aWxkIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbmhhbmNpbmcgYXQgQnVpbGQgVGltZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX2VuaGFuY2VfYnVpbGQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBlbmhhbmNlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBidWlsZCB0aW1lCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGVuaGFuY2VyIGNhbiBiZSBpbnZva2VkIGF0IGJ1aWxkIHRpbWUgCit2aWEgaXRzIEphdmEgY2xhc3MsIDxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyPC9jbGFzc25hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGFsc28gZW5oYW5jZSB2aWEgQW50OyBzZWUgCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfaW50ZWdyYXRpb25fZW5oYW5jZSIvPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3BjX2VuaGFuY2VfZW5oYW5jZXIiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVXNpbmcgdGhlIE9wZW5KUEEgRW5oYW5jZXIKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoramF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ0VuaGFuY2VyIE1hZ2F6aW5lLmphdmEKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBlbmhhbmNlciBhY2NlcHRzIHRoZSBzdGFuZGFyZCBzZXQgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBkZWZpbmVkIGJ5IHRoZQorY29uZmlndXJhdGlvbiBmcmFtZXdvcmsgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9kZXZ0b29scyIvPiApLAorYWxvbmcgd2l0aCB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWRpcmVjdG9yeS8tZCAmbHQ7b3V0cHV0IGRpcmVjdG9yeSZndDs8L2xpdGVyYWw+OiBQYXRoIHRvIHRoZSBvdXRwdXQKK2RpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBtYXRjaCB0aGUgZW5oYW5jZWQgY2xhc3MnIHBhY2thZ2UsIHRoZQorcGFja2FnZSBzdHJ1Y3R1cmUgd2lsbCBiZSBjcmVhdGVkIGJlbmVhdGggdGhlIGRpcmVjdG9yeS4gQnkgZGVmYXVsdCwgdGhlCitlbmhhbmNlciBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCA8ZmlsZW5hbWU+LmNsYXNzPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1lbmZvcmNlUHJvcGVydHlSZXN0cmljdGlvbnMvLWVwciAmbHQ7dHJ1ZS90IHwgZmFsc2UvZiZndDs8L2xpdGVyYWw+OgorV2hldGhlciB0byB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBpdCBhcHBlYXJzIHRoYXQgYSBwcm9wZXJ0eSBhY2Nlc3MgZW50aXR5IGlzCitub3Qgb2JleWluZyB0aGUgcmVzdHJpY3Rpb25zIHBsYWNlZCBvbiBwcm9wZXJ0eSBhY2Nlc3MuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LWFkZERlZmF1bHRDb25zdHJ1Y3Rvci8tYWRjICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IFRoZQorc3BlYyByZXF1aXJlcyB0aGF0IGFsbCBwZXJzaXN0ZW50IGNsYXNzZXMgZGVmaW5lIGEgbm8tYXJnIGNvbnN0cnVjdG9yLiBUaGlzIGZsYWcKK3RlbGxzIHRoZSBlbmhhbmNlciB3aGV0aGVyIHRvIGFkZCBhIHByb3RlY3RlZCBuby1hcmcgY29uc3RydWN0b3IgdG8gYW55CitwZXJzaXN0ZW50IGNsYXNzZXMgdGhhdCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD4KK3RydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+LXRtcENsYXNzTG9hZGVyLy10Y2wgJmx0O3RydWUvdCB8IGZhbHNlL2YmZ3Q7PC9saXRlcmFsPjogV2hldGhlciB0bworbG9hZCBwZXJzaXN0ZW50IGNsYXNzZXMgd2l0aCBhIHRlbXBvcmFyeSBjbGFzcyBsb2FkZXIuIFRoaXMgYWxsb3dzIG90aGVyIGNvZGUgdG8KK3RoZW4gbG9hZCB0aGUgZW5oYW5jZWQgdmVyc2lvbiBvZiB0aGUgY2xhc3Mgd2l0aGluIHRoZSBzYW1lIEpWTS4gRGVmYXVsdHMgdG8KKzxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LiBUcnkgc2V0dGluZyB0aGlzIGZsYWcgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+IGFzIGEKK2RlYnVnZ2luZyBzdGVwIGlmIHlvdSBydW4gaW50byBjbGFzcyBsb2FkaW5nIHByb2JsZW1zIHdoZW4gcnVubmluZyB0aGUgZW5oYW5jZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0VhY2ggYWRkaXRpb25hbCBhcmd1bWVudCB0byB0aGUgZW5oYW5jZXIgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmdWxsIG5hbWUgb2YgYSBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSAuamF2YSBmaWxlIGZvciBhIGNsYXNzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIDxmaWxlbmFtZT4uY2xhc3M8L2ZpbGVuYW1lPiBmaWxlIG9mIGEgY2xhc3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdSBkbyBub3Qgc3VwcGx5IGFueSBhcmd1bWVudHMgdG8gdGhlIGVuaGFuY2VyLCBpdCB3aWxsIHJ1biBvbiB0aGUgY2xhc3NlcworaW4geW91ciBwZXJzaXN0ZW50IGNsYXNzIGxpc3QgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfcGNjbGFzc2VzIi8+KS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBydW4gdGhlIGVuaGFuY2VyIG92ZXIgY2xhc3NlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGVuaGFuY2VkLCBpbiB3aGljaAorY2FzZSBpdCB3aWxsIG5vdCBmdXJ0aGVyIG1vZGlmeSB0aGUgY2xhc3MuIFlvdSBjYW4gYWxzbyBydW4gaXQgb3ZlciBjbGFzc2VzIHRoYXQKK2FyZSBub3QgcGVyc2lzdGVuY2UtY2FwYWJsZSwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIHRyZWF0IHRoZSBjbGFzcyBhcworcGVyc2lzdGVuY2UtYXdhcmUuIFBlcnNpc3RlbmNlLWF3YXJlIGNsYXNzZXMgY2FuIGRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlCitwZXJzaXN0ZW50IGZpZWxkcyBvZiBwZXJzaXN0ZW5jZS1jYXBhYmxlIGNsYXNzZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK05vdGUgdGhhdCB0aGUgZW5oYW5jZW1lbnQgcHJvY2VzcyBmb3Igc3ViY2xhc3NlcyBpbnRyb2R1Y2VzIGRlcGVuZGVuY2llcyBvbiB0aGUKK3BlcnNpc3RlbnQgcGFyZW50IGNsYXNzIGJlaW5nIGVuaGFuY2VkLiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBwcm9ibGVtYXRpYzsKK2hvd2V2ZXIsIHdoZW4gcnVubmluZyB0aGUgZW5oYW5jZXIgbXVsdGlwbGUgdGltZXMgb3ZlciBhIHN1YmNsYXNzIHdob3NlIHBhcmVudAorY2xhc3MgaXMgbm90IHlldCBlbmhhbmNlZCwgY2xhc3MgbG9hZGluZyBlcnJvcnMgY2FuIG9jY3VyLiBJbiB0aGUgZXZlbnQgb2YgYQorY2xhc3MgbG9hZCBlcnJvciwgc2ltcGx5IHJlLWNvbXBpbGUgYW5kIHJlLWVuaGFuY2UgdGhlIG9mZmVuZGluZyBjbGFzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZV9ydW50aW1lX2NvbnRhaW5lciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRW5oYW5jaW5nIEpQQSBFbnRpdGllcyBvbiBEZXBsb3ltZW50CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZV9ydW50aW1lX2NvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIGluIGFuIEVKQiBjb250YWluZXIKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBKRUUgNSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVzIGhvb2tzIHRvIGF1dG9tYXRpY2FsbHkgZW5oYW5jZSBKUEEgZW50aXRpZXMKK3doZW4gdGhleSBhcmUgZGVwbG95ZWQgaW50byBhIGNvbnRhaW5lci4gVGh1cywgaWYgeW91IGFyZSB1c2luZyBhIEpFRQorNS1jb21wbGlhbnQgYXBwbGljYXRpb24gc2VydmVyLCBPcGVuSlBBIHdpbGwgZW5oYW5jZSB5b3VyIGVudGl0aWVzIGF1dG9tYXRpY2FsbHkKK2F0IHJ1bnRpbWUuIE5vdGUgdGhhdCBpZiB5b3UgcHJlZmVyIGJ1aWxkLXRpbWUgZW5oYW5jZW1lbnQsIE9wZW5KUEEncyBydW50aW1lCitlbmhhbmNlciB3aWxsIGNvcnJlY3RseSByZWNvZ25pemUgYW5kIHNraXAgcHJlLWVuaGFuY2VkIGNsYXNzZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdXIgYXBwbGljYXRpb24gc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIEpFRSA1IGVuaGFuY2VtZW50IGhvb2tzLAorY29uc2lkZXIgdXNpbmcgdGhlIGJ1aWxkLXRpbWUgZW5oYW5jZW1lbnQgZGVzY3JpYmVkIGFib3ZlLCBvciB0aGUgbW9yZSBnZW5lcmFsCitydW50aW1lIGVuaGFuY2VtZW50IGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZV9ydW50aW1lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbmhhbmNpbmcgYXQgUnVudGltZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX2VuaGFuY2VfcnVudGltZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIG91dHNpZGUgYSBjb250YWluZXIKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgaW5jbHVkZXMgYSA8ZW1waGFzaXM+SmF2YSBhZ2VudDwvZW1waGFzaXM+IGZvciBhdXRvbWF0aWNhbGx5IGVuaGFuY2luZworcGVyc2lzdGVudCBjbGFzc2VzIGFzIHRoZXkgYXJlIGxvYWRlZCBpbnRvIHRoZSBKVk0uIEphdmEgYWdlbnRzIGFyZSBjbGFzc2VzIHRoYXQKK2FyZSBpbnZva2VkIHByaW9yIHRvIHlvdXIgYXBwbGljYXRpb24ncyA8bWV0aG9kbmFtZT5tYWluPC9tZXRob2RuYW1lPiBtZXRob2QuCitPcGVuSlBBJ3MgYWdlbnQgdXNlcyBKVk0gaG9va3MgdG8gaW50ZXJjZXB0IGFsbCBjbGFzcyBsb2FkaW5nIHRvIGVuaGFuY2UgY2xhc3NlcwordGhhdCBoYXZlIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGJlZm9yZSB0aGUgSlZNIGxvYWRzIHRoZW0uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1NlYXJjaGluZyBmb3IgbWV0YWRhdGEgZm9yIGV2ZXJ5IGNsYXNzIGxvYWRlZCBieSB0aGUgSlZNIGNhbiBzbG93IGFwcGxpY2F0aW9uCitpbml0aWFsaXphdGlvbi4gT25lIHdheSB0byBzcGVlZCB0aGluZ3MgdXAgaXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG9wdGlvbmFsCitwZXJzaXN0ZW50IGNsYXNzIGxpc3QgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19wY2NsYXNzZXMiLz4uIElmCit5b3UgZGVjbGFyZSBhIHBlcnNpc3RlbnQgY2xhc3MgbGlzdCwgT3BlbkpQQSB3aWxsIG9ubHkgc2VhcmNoIGZvcgorbWV0YWRhdGEgZm9yIGNsYXNzZXMgaW4gdGhhdCBsaXN0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUbyBlbXBsb3kgdGhlIE9wZW5KUEEgYWdlbnQsIGludm9rZSA8bGl0ZXJhbD5qYXZhPC9saXRlcmFsPiB3aXRoIHRoZSA8bGl0ZXJhbD4KKy1qYXZhYWdlbnQ8L2xpdGVyYWw+IHNldCB0byB0aGUgcGF0aCB0byB5b3VyIE9wZW5KUEEgamFyIGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3BjX2VuaGFuY2VfcnVudGltZV9leCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVc2luZyB0aGUgT3BlbkpQQSBBZ2VudCBmb3IgUnVudGltZSBFbmhhbmNlbWVudAorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIC1qYXZhYWdlbnQ6L2hvbWUvZGV2L29wZW5qcGEvbGliL29wZW5qcGEuamFyIGNvbS54eXouTWFpbgorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBwYXNzIHNldHRpbmdzIHRvIHRoZSBhZ2VudCB1c2luZyBPcGVuSlBBJ3MgcGx1Z2luIHN5bnRheCAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KS4gVGhlIGFnZW50IGFjY2VwdHMgdGhlIGxvbmcKK2Zvcm0gb2YgYW55IG9mIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgCisoPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfZGV2dG9vbHMiLz4gKS4gSXQgYWxzbyBhY2NlcHRzIHRoZSBmb2xsb3dpbmcKK29wdGlvbnMsIHRoZSBmaXJzdCB0aHJlZSBvZiB3aGljaCBjb3JyZXNwb25kIGV4YWN0bHkgdG8gdG8gdGhlIHNhbWUtbmFtZWQKK29wdGlvbnMgb2YgdGhlIGVuaGFuY2VyIHRvb2wgZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZV9idWlsZCIvPjoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmFkZERlZmF1bHRDb25zdHJ1Y3RvcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmVuZm9yY2VQcm9wZXJ0eVJlc3RyaWN0aW9uczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnNjYW5EZXZQYXRoPC9saXRlcmFsPjogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2NhbiB0aGUKK2NsYXNzcGF0aCBmb3IgcGVyc2lzdGVudCB0eXBlcyBpZiBub25lIGhhdmUgYmVlbiBjb25maWd1cmVkLiBJZiB5b3UgZG8gbm90CitzcGVjaWZ5IGEgcGVyc2lzdGVudCB0eXBlcyBsaXN0IGFuZCBkbyBub3Qgc2V0IHRoaXMgb3B0aW9uIHRvIHRydWUsIE9wZW5KUEEgd2lsbAorY2hlY2sgd2hldGhlciBlYWNoIGNsYXNzIGxvYWRlZCBpbnRvIHRoZSBKVk0gaXMgcGVyc2lzdGVudCwgYW5kIGVuaGFuY2UgaXQKK2FjY29yZGluZ2x5LiBUaGlzIG1heSBzbG93IGRvd24gY2xhc3MgbG9hZCB0aW1lcyBzaWduaWZpY2FudGx5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9wY19lbmhhbmNlX3J1bnRpbWVfb3B0X2V4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFBhc3NpbmcgT3B0aW9ucyB0byB0aGUgT3BlbkpQQSBBZ2VudAorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitqYXZhIC1qYXZhYWdlbnQ6L2hvbWUvZGV2L29wZW5qcGEvbGliL29wZW5qcGEuamFyPWFkZERlZmF1bHRDb25zdHJ1Y3Rvcj1mYWxzZSBjb20ueHl6Lk1haW4KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19lbmhhbmNlX3NlcmNvbXBhdCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU2VyaWFsaXppbmcgRW5oYW5jZWQgVHlwZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19lbmhhbmNlX3NlcmNvbXBhdCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIG9mIGVuaGFuY2VkIHR5cGVzCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfZW5oYW5jZV9zZXJjb21wYXQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIG9mIGVuaGFuY2VkIHR5cGVzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQnkgZGVmYXVsdCwgT3BlbkpQQSBtYWludGFpbnMgc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIGVuaGFuY2VkCithbmQgdW5lbmhhbmNlZCB2ZXJzaW9ucyBvZiBhIGNsYXNzLiBUaGlzIGFsbG93cyB5b3UgdG8gc2VyaWFsaXplIGluc3RhbmNlcworYmV0d2VlbiBhIHNlcnZlciB1c2luZyBPcGVuSlBBIGFuZCBhIGNsaWVudCB0aGF0IGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvCitlbmhhbmNlZCBjbGFzc2VzIG9yIE9wZW5KUEEgbGlicmFyaWVzLiBJbiBzb21lIGNhc2VzLCBob3dldmVyLCB5b3UgY2FuIG1ha2UgdGhlCitwZXJzaXN0IGFuZCBhdHRhY2ggcHJvY2Vzc2VzIG1vcmUgcm9idXN0IGFuZCBlZmZpY2llbnQgYnkgYWxsb3dpbmcgYnJlYWtzIGluCitzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuIFNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGV0YWNoX2dyYXBoIi8+Citmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BjX29pZCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE9iamVjdCBJZGVudGl0eQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19vaWQiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorT3BlbkpQQSBtYWtlcyBzZXZlcmFsIGVuaGFuY2VtZW50cyB0byBKUEEncyBzdGFuZGFyZCBlbnRpdHkgaWRlbnRpdHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19vaWRfZGF0YXN0b3JlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBEYXRhc3RvcmUgSWRlbnRpdHkKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19vaWRfZGF0YXN0b3JlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZGF0YXN0b3JlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIEpQQSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHlvdSB0byBkZWNsYXJlIG9uZSBvciBtb3JlIGlkZW50aXR5IGZpZWxkcyBpbgoreW91ciBwZXJzaXN0ZW50IGNsYXNzZXMuIE9wZW5KUEEgZnVsbHkgc3VwcG9ydHMgdGhpcyBmb3JtIG9mIG9iamVjdCBpZGVudGl0eSwKK2NhbGxlZCA8ZW1waGFzaXM+YXBwbGljYXRpb248L2VtcGhhc2lzPiBpZGVudGl0eS4gT3BlbkpQQSwgaG93ZXZlciwgYWxzbworc3VwcG9ydHMgPGVtcGhhc2lzPmRhdGFzdG9yZTwvZW1waGFzaXM+IGlkZW50aXR5LiBJbiBkYXRhc3RvcmUgaWRlbnRpdHksIHlvdSBkbworbm90IGRlY2xhcmUgYW55IHByaW1hcnkga2V5IGZpZWxkcy4gT3BlbkpQQSBtYW5hZ2VzIHRoZSBpZGVudGl0eSBvZiB5b3VyCitwZXJzaXN0ZW50IG9iamVjdHMgZm9yIHlvdSB0aHJvdWdoIGEgc3Vycm9nYXRlIGtleSBpbiB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gY29udHJvbCBob3cgeW91ciBKUEEgZGF0YXN0b3JlIGlkZW50aXR5IHZhbHVlIGlzIGdlbmVyYXRlZCB0aHJvdWdoCitPcGVuSlBBJ3MKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0RhdGFTdG9yZUlkLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRGF0YVN0b3JlSWQ8L2NsYXNzbmFtZT48L3VsaW5rPiBjbGFzcworYW5ub3RhdGlvbi4gVGhpcyBhbm5vdGF0aW9uIGhhcyA8bGl0ZXJhbD5zdHJhdGVneTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPgorZ2VuZXJhdG9yPC9saXRlcmFsPiBwcm9wZXJ0aWVzIHRoYXQgbWlycm9yIHRoZSBzYW1lLW5hbWVkIHByb3BlcnRpZXMgb24gdGhlCitzdGFuZGFyZCA8Y2xhc3NuYW1lPmphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlPC9jbGFzc25hbWU+IGFubm90YXRpb24KK2Rlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWV0YV9pZCIvPiBvZiB0aGUgSlBBIE92ZXJ2aWV3LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitUbyByZXRyaWV2ZSB0aGUgaWRlbnRpdHkgdmFsdWUgb2YgYSBkYXRhc3RvcmUgaWRlbnRpdHkgZW50aXR5LCB1c2UgdGhlCis8bWV0aG9kbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlci5nZXRPYmplY3RJZChPYmplY3QgZW50aXR5KTwvbWV0aG9kbmFtZT4KK21ldGhvZC4gU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9ydW50aW1lX2VtIi8+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCit0aGUgPGNsYXNzbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfb2lkX2RhdGFzdG9yZWVudGl0eWV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEpQQSBEYXRhc3RvcmUgSWRlbnRpdHkgTWV0YWRhdGEKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCitARW50aXR5CitARGF0YVN0b3JlSWQKK3B1YmxpYyBjbGFzcyBMaW5lSXRlbSB7CisKKyAgICAuLi4gbm8gQElkIGZpZWxkcyBkZWNsYXJlZCAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK0ludGVybmFsbHksIE9wZW5KUEEgdXNlcyB0aGUgcHVibGljCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS91dGlsL0lkLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5JZDwvY2xhc3NuYW1lPjwvdWxpbms+IGNsYXNzIGZvciBkYXRhc3RvcmUgaWRlbnRpdHkKK29iamVjdHMuIFdoZW4gd3JpdGluZyBPcGVuSlBBIHBsdWdpbnMsIHlvdSBjYW4gbWFuaXB1bGF0ZSBkYXRhc3RvcmUgaWRlbnRpdHkKK29iamVjdHMgYnkgY2FzdGluZyB0aGVtIHRvIHRoaXMgY2xhc3MuIFlvdSBjYW4gYWxzbyBjcmVhdGUgeW91ciBvd24gPGNsYXNzbmFtZT4KK0lkPC9jbGFzc25hbWU+IGluc3RhbmNlcyBhbmQgcGFzcyB0aGVtIHRvIGFueSBpbnRlcm5hbCBPcGVuSlBBIG1ldGhvZCB0aGF0CitleHBlY3RzIGFuIGlkZW50aXR5IG9iamVjdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gSlBBLCB5b3Ugd2lsbCBuZXZlciBzZWUgPGNsYXNzbmFtZT5JZDwvY2xhc3NuYW1lPiBpbnN0YW5jZXMgZGlyZWN0bHkuCitJbnN0ZWFkLCBjYWxsaW5nIDxjbGFzc25hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXIuZ2V0T2JqZWN0SWQ8L2NsYXNzbmFtZT4gb24gYQorZGF0YXN0b3JlIGlkZW50aXR5IG9iamVjdCB3aWxsIHJldHVybiB0aGUgPGNsYXNzbmFtZT5Mb25nPC9jbGFzc25hbWU+IHN1cnJvZ2F0ZQorcHJpbWFyeSBrZXkgdmFsdWUgZm9yIHRoYXQgb2JqZWN0LiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgdmFsdWUgaW4gY2FsbHMgdG8KKzxjbGFzc25hbWU+RW50aXR5TWFuYWdlci5maW5kPC9jbGFzc25hbWU+IGZvciBzdWJzZXF1ZW50IGxvb2t1cHMgb2YgdGhlIHNhbWUKK3JlY29yZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BjX29pZF9lbnRpdHlwayI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRW50aXRpZXMgYXMgSWRlbnRpdHkgRmllbGRzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfb2lkX2VudGl0eXBrIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgIGVudGl0eSBpZCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBKUEEgc3BlY2lmaWNhdGlvbiBsaW1pdHMgaWRlbnRpdHkgZmllbGRzIHRvIHNpbXBsZSB0eXBlcy4gIE9wZW5KUEEsIGhvd2V2ZXIsCithbHNvIGFsbG93cyA8bGl0ZXJhbD5NYW55VG9PbmU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5PbmVUb09uZTwvbGl0ZXJhbD4gCityZWxhdGlvbnMgdG8gYmUgaWRlbnRpdHkgZmllbGRzLiAgVG8gaWRlbnRpZnkgYSByZWxhdGlvbiBmaWVsZCBhcyBhbiBpZGVudGl0eQorZmllbGQsIHNpbXBseSBhbm5vdGF0ZSBpdCB3aXRoIGJvdGggdGhlIDxsaXRlcmFsPkBNYW55VG9PbmU8L2xpdGVyYWw+IG9yCis8bGl0ZXJhbD5AT25lVG9PbmU8L2xpdGVyYWw+IHJlbGF0aW9uIGFubm90YXRpb24gYW5kIHRoZSA8bGl0ZXJhbD5ASWQ8L2xpdGVyYWw+CitpZGVudGl0eSBhbm5vdGF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitXaGVuIGZpbmRpbmcgYW4gZW50aXR5IGlkZW50aWZpZWQgYnkgYSByZWxhdGlvbiwgcGFzcyB0aGUgaWQgb2YgdGhlIAorPGVtcGhhc2lzPnJlbGF0aW9uPC9lbXBoYXNpcz4gdG8gdGhlIDxtZXRob2RuYW1lPkVudGl0eU1hbmFnZXIuZmluZDwvbWV0aG9kbmFtZT4KK21ldGhvZDoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfb2lkX2VudGl0eXBrX3NpbXBsZWZpbmQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRmluZGluZyBhbiBFbnRpdHkgd2l0aCBhbiBFbnRpdHkgSWRlbnRpdHkgRmllbGQKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIERlbGl2ZXJ5IGNyZWF0ZURlbGl2ZXJ5KEVudGl0eU1hbmFnZXIgZW0sIE9yZGVyIG9yZGVyKSB7CisgICAgRGVsaXZlcnkgZGVsaXZlcnkgPSBuZXcgRGVsaXZlcnkoKTsKKyAgICBkZWxpdmVyeS5zZXRJZChvKTsKKyAgICBkZWxpdmVyeS5zZXREZWxpdmVyZWQobmV3IERhdGUoKSk7CisgICAgcmV0dXJuIGRlbGl2ZXJ5OworfQorCitwdWJsaWMgRGVsaXZlcnkgZmluZERlbGl2ZXJ5KEVudGl0eU1hbmFnZXIgZW0sIE9yZGVyIG9yZGVyKSB7CisgICAgLy8gdXNlIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVsYXRlZCBpbnN0YW5jZSAKKyAgICByZXR1cm4gZW0uZmluZChEZWxpdmVyeS5jbGFzcywgb3JkZXIuZ2V0SWQoKSk7Cit9Cis8L3Byb2dyYW1saXN0aW5nPiAgICAKKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorV2hlbiB5b3VyIGVudGl0eSBoYXMgbXVsdGlwbGUgaWRlbnRpdHkgZmllbGRzLCBhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggaXMgYSAKK3JlbGF0aW9uIHRvIGFub3RoZXIgZW50aXR5LCB5b3UgbXVzdCB1c2UgYW4gaWRlbnRpdHkgY2xhc3MgKHNlZSAKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19wY19pZGVudGl0eWNscyIvPiBpbiB0aGUgSlBBIE92ZXJ2aWV3KS4gIFlvdSBjYW5ub3QKK3VzZSBhbiBlbWJlZGRlZCBpZGVudGl0eSBvYmplY3QuICBJZGVudGl0eSBjbGFzcyBmaWVsZHMgY29ycmVzcG9uZGluZyB0bworZW50aXR5IGlkZW50aXR5IGZpZWxkcyBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgcmVsYXRlZCBlbnRpdHkncyAKK2lkZW50aXR5LiAgCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3BjX29pZF9lbnRpdHlwa19pZGNscyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBJZCBDbGFzcyBmb3IgRW50aXR5IElkZW50aXR5IEZpZWxkcworICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitARW50aXR5CitwdWJsaWMgY2xhc3MgT3JkZXIgeworCisgICAgQElkCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgLi4uIAorfQorCitARW50aXR5CitASWRDbGFzcyhMaW5lSXRlbUlkLmNsYXNzKQorcHVibGljIGNsYXNzIExpbmVJdGVtIHsKKyAgICAKKyAgICBASWQKKyAgICBwcml2YXRlIGludCBpbmRleDsKKworICAgIEBJZAorICAgIEBNYW55VG9PbmUKKyAgICBwcml2YXRlIE9yZGVyIG9yZGVyOworCisgICAgLi4uCit9CisKK3B1YmxpYyBjbGFzcyBMaW5lSXRlbUlkIHsKKworICAgIHB1YmxpYyBpbnQgaW5kZXg7CisgICAgcHVibGljIGxvbmcgb3JkZXI7IC8vIHNhbWUgdHlwZSBhcyBvcmRlcidzIGlkZW50aXR5CisKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+ICAgIAorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaWYgPGNsYXNzbmFtZT5PcmRlcjwvY2xhc3NuYW1lPiBoYWQgdXNlZCBhbiBpZGVudGl0eSAKK2NsYXNzIDxjbGFzc25hbWU+T3JkZXJJZDwvY2xhc3NuYW1lPiBpbiBwbGFjZSBvZiBhIHNpbXBsZSA8Y2xhc3NuYW1lPmxvbmcKKzwvY2xhc3NuYW1lPiB2YWx1ZSwgdGhlbiB0aGUgPGxpdGVyYWw+TGluZUl0ZW1JZC5vcmRlcjwvbGl0ZXJhbD4gZmllbGQgd291bGQKK2hhdmUgYmVlbiBvZiB0eXBlIDxjbGFzc25hbWU+T3JkZXJJZDwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BjX29pZF9hcHBsaWNhdGlvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gSWRlbnRpdHkgVG9vbAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX29pZF9hcHBsaWNhdGlvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpZGVudGl0eSB0b29sCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfb2lkX2FwcGxpY2F0aW9uIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitJZiB5b3UgY2hvb3NlIHRvIHVzZSBhcHBsaWNhdGlvbiBpZGVudGl0eSwgeW91IG1heSB3YW50IHRvIHRha2UgYWR2YW50YWdlIG9mCitPcGVuSlBBJ3MgYXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbC4gVGhlIGFwcGxpY2F0aW9uCitpZGVudGl0eSB0b29sIGdlbmVyYXRlcyBKYXZhIGNvZGUgaW1wbGVtZW50aW5nIHRoZSBpZGVudGl0eSBjbGFzcyBmb3IgYW55CitwZXJzaXN0ZW50IHR5cGUgdXNpbmcgYXBwbGljYXRpb24gaWRlbnRpdHkuIFRoZSBjb2RlIHNhdGlzZmllcyBhbGwgdGhlCityZXF1aXJlbWVudHMgdGhlIHNwZWNpZmljYXRpb24gcGxhY2VzIG9uIGlkZW50aXR5IGNsYXNzZXMuIFlvdSBjYW4gdXNlIGl0IGFzLWlzLAorb3Igc2ltcGx5IHVzZSBpdCBhcyBhIHN0YXJ0aW5nIHBvaW50LCBlZGl0aW5nIGl0IHRvIG1lZXQgeW91ciBuZWVkcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorQmVmb3JlIHlvdSBjYW4gcnVuIHRoZSBhcHBsaWNhdGlvbiBpZGVudGl0eSB0b29sIG9uIGEgcGVyc2lzdGVudCBjbGFzcywgdGhlCitjbGFzcyBtdXN0IGJlIGNvbXBpbGVkIGFuZCBtdXN0IGhhdmUgY29tcGxldGUgbWV0YWRhdGEuIEFsbCBwcmltYXJ5IGtleSBmaWVsZHMKK211c3QgYmUgbWFya2VkIGFzIHN1Y2ggaW4gdGhlIG1ldGFkYXRhLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitJbiBKUEEgbWV0YWRhdGEsIGRvIG5vdCBhdHRlbXB0IHRvIHNwZWNpZnkgdGhlIDxsaXRlcmFsPkBJZENsYXNzPC9saXRlcmFsPgorYW5ub3RhdGlvbiB1bmxlc3MgeW91IGFyZSB1c2luZyB0aGUgYXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbCB0byBvdmVyd3JpdGUgYW4KK2V4aXN0aW5nIGlkZW50aXR5IGNsYXNzLiBBdHRlbXB0aW5nIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIDxsaXRlcmFsPkBJZENsYXNzCis8L2xpdGVyYWw+IHRvIGEgbm9uLWV4aXN0ZW50IGNsYXNzIHdpbGwgcHJldmVudCB5b3VyIHBlcnNpc3RlbnQgY2xhc3MgZnJvbQorY29tcGlsaW5nLiBJbnN0ZWFkLCB1c2UgdGhlIDxsaXRlcmFsPi1uYW1lPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4tc3VmZml4Cis8L2xpdGVyYWw+IG9wdGlvbnMgZGVzY3JpYmVkIGJlbG93IHRvIHRlbGwgT3BlbkpQQSB3aGF0IG5hbWUgdG8gZ2l2ZSB5b3VyCitnZW5lcmF0ZWQgaWRlbnRpdHkgY2xhc3MuIE9uY2UgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IHRvb2wgaGFzIGdlbmVyYXRlZCB0aGUKK2NsYXNzIGNvZGUsIHlvdSBjYW4gc2V0IHRoZSA8bGl0ZXJhbD5ASWRDbGFzczwvbGl0ZXJhbD4gYW5ub3RhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IHRvb2wgY2FuIGJlIGludm9rZWQgdmlhIGl0cyBKYXZhIGNsYXNzLAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZW5oYW5jZS9BcHBsaWNhdGlvbklkVG9vbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLkFwcGxpY2F0aW9uSWRUb29sPC9jbGFzc25hbWU+PC91bGluaz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9pbnRlZ3JhdGlvbl9hcHBpZHRvb2wiLz4gZGVzY3JpYmVzIHRoZQorYXBwbGljYXRpb24gaWRlbnRpdHkgdG9vbCdzIEFudCB0YXNrLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfYXBwaWRfYXBwaWR0b29sIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoZSBBcHBsaWNhdGlvbiBJZGVudGl0eSBUb29sCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2phdmEgb3JnLmFwYWNoZS5vcGVuanBhLmVuaGFuY2UuQXBwbGljYXRpb25JZFRvb2wgLXMgSWQgTWFnYXppbmUuamF2YQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IHRvb2wgYWNjZXB0cyB0aGUgc3RhbmRhcmQgc2V0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKK2RlZmluZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gZnJhbWV3b3JrIChzZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzIi8+KSwgaW5jbHVkaW5nIGNvZGUgZm9ybWF0dGluZworZmxhZ3MgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX2RldnRvb2xzX2Zvcm1hdCIvPi4gSXQKK2Fsc28gYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1kaXJlY3RvcnkvLWQgJmx0O291dHB1dCBkaXJlY3RvcnkmZ3Q7PC9saXRlcmFsPjogUGF0aCB0byB0aGUgb3V0cHV0CitkaXJlY3RvcnkuIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggdGhlIGdlbmVyYXRlZCBvaWQgY2xhc3MnIHBhY2thZ2UsIHRoZQorcGFja2FnZSBzdHJ1Y3R1cmUgd2lsbCBiZSBjcmVhdGVkIGJlbmVhdGggdGhlIGRpcmVjdG9yeS4gSWYgbm90IHNwZWNpZmllZCwgdGhlCit0b29sIHdpbGwgZmlyc3QgdHJ5IHRvIGZpbmQgdGhlIGRpcmVjdG9yeSBvZiB0aGUgPGZpbGVuYW1lPi5qYXZhPC9maWxlbmFtZT4gZmlsZQorZm9yIHRoZSBwZXJzaXN0ZW5jZS1jYXBhYmxlIGNsYXNzLCBhbmQgZmFpbGluZyB0aGF0IHdpbGwgdXNlIHRoZSBjdXJyZW50CitkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD4taWdub3JlRXJyb3JzLy1pICZsdDt0cnVlL3QgfCBmYWxzZS9mJmd0OzwvbGl0ZXJhbD46IElmIDxsaXRlcmFsPmZhbHNlCis8L2xpdGVyYWw+LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIHRvb2wgaXMgcnVuIG9uIGFueSBjbGFzcyB0aGF0Citkb2VzIG5vdCB1c2UgYXBwbGljYXRpb24gaWRlbnRpdHksIG9yIGlzIG5vdCB0aGUgYmFzZSBjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UKK2hpZXJhcmNoeSAocmVjYWxsIHRoYXQgc3ViY2xhc3NlcyBuZXZlciBkZWZpbmUgdGhlIGFwcGxpY2F0aW9uIGlkZW50aXR5IGNsYXNzOwordGhleSBpbmhlcml0IGl0IGZyb20gdGhlaXIgcGVyc2lzdGVudCBzdXBlcmNsYXNzKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi10b2tlbi8tdCAmbHQ7dG9rZW4mZ3Q7PC9saXRlcmFsPjogVGhlIHRva2VuIHRvIHVzZSB0byBzZXBhcmF0ZQorc3RyaW5naWZpZWQgcHJpbWFyeSBrZXkgdmFsdWVzIGluIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgb2JqZWN0IGlkLiBUaGlzIG9wdGlvbgoraXMgb25seSB1c2VkIGlmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5IGZpZWxkcy4gSXQgZGVmYXVsdHMgdG8gIjo6Ii4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1uYW1lLy1uICZsdDtpZCBjbGFzcyBuYW1lJmd0OzwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBpZGVudGl0eQorY2xhc3MgdG8gZ2VuZXJhdGUuIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgeW91IG11c3QgcnVuIHRoZSB0b29sIG9uIGV4YWN0bHkKK29uZSBjbGFzcy4gSWYgdGhlIGNsYXNzIG1ldGFkYXRhIGFscmVhZHkgbmFtZXMgYW4gb2JqZWN0IGlkIGNsYXNzLCB0aGlzIG9wdGlvbgoraXMgaWdub3JlZC4gSWYgdGhlIG5hbWUgaXMgbm90IGZ1bGx5IHF1YWxpZmllZCwgdGhlIHBlcnNpc3RlbnQgY2xhc3MnIHBhY2thZ2UgaXMKK3ByZXBlbmRlZCB0byBmb3JtIHRoZSBxdWFsaWZpZWQgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPi1zdWZmaXgvLXMgJmx0O2lkIGNsYXNzIHN1ZmZpeCZndDs8L2xpdGVyYWw+OiBBIHN0cmluZyB0byBzdWZmaXggZWFjaAorcGVyc2lzdGVudCBjbGFzcyBuYW1lIHdpdGggdG8gZm9ybSB0aGUgaWRlbnRpdHkgY2xhc3MgbmFtZS4gVGhpcyBvcHRpb24gaXMKK292ZXJyaWRkZW4gYnkgPGxpdGVyYWw+LW5hbWU8L2xpdGVyYWw+IG9yIGJ5IGFueSBvYmplY3QgaWQgY2xhc3Mgc3BlY2lmaWVkIGluCittZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorRWFjaCBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHRoZSB0b29sIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZnVsbCBuYW1lIG9mIGEgcGVyc2lzdGVudCBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSAuamF2YSBmaWxlIGZvciBhIHBlcnNpc3RlbnQgY2xhc3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGZpbGVuYW1lPi5jbGFzczwvZmlsZW5hbWU+IGZpbGUgb2YgYSBwZXJzaXN0ZW50IGNsYXNzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPHBhcmE+CitJZiB5b3UgZG8gbm90IHN1cHBseSBhbnkgYXJndW1lbnRzIHRvIHRoZSB0b29sLCBpdCB3aWxsIGFjdCBvbiB0aGUgY2xhc3NlcyBpbgoreW91ciBwZXJzaXN0ZW50IGNsYXNzZXMgbGlzdCAoc2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19wY2NsYXNzZXMiLz4pLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfb2lkX3BrZ2VuX2F1dG9pbmMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEF1dG9hc3NpZ24gLyBJZGVudGl0eSBTdHJhdGVneSBDYXZlYXRzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfb2lkX3BrZ2VuX2F1dG9pbmMiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBkYXRhc3RvcmUgaWRlbnRpdHkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXV0b2Fzc2lnbiBzdHJhdGVneQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19vaWRfcGtnZW5fYXV0b2luYyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGRhdGFzdG9yZSBpZGVudGl0eQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBhdXRvYXNzaWduIHN0cmF0ZWd5CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX29pZF9wa2dlbl9hdXRvaW5jIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYXV0b2Fzc2lnbiBzdHJhdGVneQorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2dlbiIvPiBleHBsYWlucyBob3cgdG8gdXNlIEpQQSdzCis8bGl0ZXJhbD5JREVOVElUWTwvbGl0ZXJhbD4gZ2VuZXJhdGlvbiB0eXBlIHRvIGF1dG9tYXRpY2FsbHkgYXNzaWduIGZpZWxkCit2YWx1ZXMuIEhvd2V2ZXIsIGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBjYXZlYXRzIHlvdSBzaG91bGQgYmUgYXdhcmUgb2Ygd2hlbgordXNpbmcgPGxpdGVyYWw+SURFTlRJVFk8L2xpdGVyYWw+IGdlbmVyYXRpb246CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1lvdXIgZGF0YWJhc2UgbXVzdCBzdXBwb3J0IGF1dG8taW5jcmVtZW50IC8gaWRlbnRpdHkgY29sdW1ucywgb3Igc29tZSBlcXVpdmFsZW50Cisoc2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX2Ric3VwcG9ydF9vcmFjbGUiLz4gZm9yIGhvdyB0bworY29uZmlndXJlIGEgY29tYmluYXRpb24gb2YgdHJpZ2dlcnMgYW5kIHNlcXVlbmNlcyB0byBmYWtlIGF1dG8taW5jcmVtZW50IHN1cHBvcnQKK2luIE9yYWNsZSkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBdXRvLWluY3JlbWVudCAvIGlkZW50aXR5IGNvbHVtbnMgbXVzdCBiZSBhbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlciB0eXBlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRGF0YWJhc2VzIHN1cHBvcnQgYXV0by1pbmNyZW1lbnQgLyBpZGVudGl0eSBjb2x1bW5zIHRvIHZhcnlpbmcgZGVncmVlcy4gU29tZSBkbworbm90IHN1cHBvcnQgdGhlbSBhdCBhbGwuIE90aGVycyBvbmx5IGFsbG93IGEgc2luZ2xlIHN1Y2ggY29sdW1uIHBlciB0YWJsZSwgYW5kCityZXF1aXJlIHRoYXQgaXQgYmUgdGhlIHByaW1hcnkga2V5IGNvbHVtbi4gTW9yZSBsZW5pZW50IGRhdGFiYXNlcyBtYXkgYWxsb3cKK25vbi1wcmltYXJ5IGtleSBhdXRvLWluY3JlbWVudCBjb2x1bW5zLCBhbmQgbWF5IGFsbG93IG1vcmUgdGhhbiBvbmUgcGVyIHRhYmxlLgorU2VlIHlvdXIgZGF0YWJhc2UgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfaW52ZXJzZXMiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBNYW5hZ2VkIEludmVyc2VzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2ludmVyc2VzIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIGF1dG9tYXRpYyBtYW5hZ2VtZW50CisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorQmlkaXJlY3Rpb25hbCByZWxhdGlvbnMgYXJlIGFuIGVzc2VudGlhbCBwYXJ0IG9mIGRhdGEgbW9kZWxpbmcuCis8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPiBpbiB0aGUgSlBBIE92ZXJ2aWV3IGV4cGxhaW5zIGhvdyB0bwordXNlIHRoZSA8bGl0ZXJhbD5tYXBwZWRCeTwvbGl0ZXJhbD4gYW5ub3RhdGlvbiBhdHRyaWJ1dGUgdG8gZm9ybSBiaWRpcmVjdGlvbmFsCityZWxhdGlvbnMgdGhhdCBhbHNvIHNoYXJlIGRhdGFzdG9yZSBzdG9yYWdlIGluIEpQQS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxzbyBhbGxvd3MgeW91IHRvIGRlZmluZSBwdXJlbHkgbG9naWNhbCBiaWRpcmVjdGlvbmFsIHJlbGF0aW9ucy4gIFRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvSW52ZXJzZUxvZ2ljYWwuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5JbnZlcnNlTG9naWNhbDwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uIG5hbWVzIGEgbG9naWNhbCBpbnZlcnNlIGluIEpQQSBtZXRhZGF0YS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2ludmVyc2VzX2xvZ2ljYWxleCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3BlY2lmeWluZyBMb2dpY2FsIEludmVyc2VzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5NYWdhemluZS5jb3ZlclBob3RvPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+UGhvdG9ncmFwaC5tYWc8L2xpdGVyYWw+IGFyZQorZWFjaCBtYXBwZWQgdG8gZGlmZmVyZW50IGZvcmVpZ24ga2V5cyBpbiB0aGVpciByZXNwZWN0aXZlIHRhYmxlcywgYnV0IGZvcm0gYQorbG9naWNhbCBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLiBPbmx5IG9uZSBvZiB0aGUgZmllbGRzIG5lZWRzIHRvIGRlY2xhcmUgdGhlCitvdGhlciBhcyBpdHMgbG9naWNhbCBpbnZlcnNlLCB0aG91Z2ggaXQgaXMgbm90IGFuIGVycm9yIHRvIHNldCB0aGUgbG9naWNhbAoraW52ZXJzZSBvZiBib3RoIGZpZWxkcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworQEVudGl0eQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKworICAgIEBPbmVUb09uZQorICAgIHByaXZhdGUgUGhvdG9ncmFwaCBjb3ZlclBob3RvOworCisgICAgLi4uCit9CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBQaG90b2dyYXBoIHsKKworICAgIEBPbmVUb09uZQorICAgIEBJbnZlcnNlTG9naWNhbCgiY292ZXJQaG90byIpCisgICAgcHJpdmF0ZSBNYWdhemluZSBtYWc7CisKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CitKYXZhIGRvZXMgbm90IHByb3ZpZGUgYW55IG5hdGl2ZSBmYWNpbGl0aWVzIHRvIGVuc3VyZSB0aGF0IGJvdGggc2lkZXMgb2YgYQorYmlkaXJlY3Rpb25hbCByZWxhdGlvbiByZW1haW4gY29uc2lzdGVudC4gV2hlbmV2ZXIgeW91IHNldCBvbmUgc2lkZSBvZiB0aGUKK3JlbGF0aW9uLCB5b3UgbXVzdCBtYW51YWxseSBzZXQgdGhlIG90aGVyIHNpZGUgYXMgd2VsbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0J5IGRlZmF1bHQsIE9wZW5KUEEgYmVoYXZlcyB0aGUgc2FtZSB3YXkuIE9wZW5KUEEgZG9lcyBub3QgYXV0b21hdGljYWxseQorcHJvcGFnYXRlIGNoYW5nZXMgZnJvbSBvbmUgZmllbGQgaW4gYmlkaXJlY3Rpb25hbCByZWxhdGlvbiB0byB0aGUgb3RoZXIgZmllbGQuCitUaGlzIGlzIGluIGtlZXBpbmcgd2l0aCB0aGUgcGhpbG9zb3BoeSBvZiB0cmFuc3BhcmVuY3ksIGFuZCBhbHNvIHByb3ZpZGVzIGhpZ2hlcgorcGVyZm9ybWFuY2UsIGFzIE9wZW5KUEEgZG9lcyBub3QgbmVlZCB0byBhbmFseXplIHlvdXIgb2JqZWN0IGdyYXBoIHRvIGNvcnJlY3QKK2luY29uc2lzdGVudCByZWxhdGlvbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBJbnZlcnNlTWFuYWdlcgorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KK0lmIGNvbnZlbmllbmNlIGlzIG1vcmUgaW1wb3J0YW50IHRvIHlvdSB0aGFuIHN0cmljdCB0cmFuc3BhcmVuY3ksIGhvd2V2ZXIsIHlvdQorY2FuIGVuYWJsZSBpbnZlcnNlIHJlbGF0aW9uIG1hbmFnZW1lbnQgaW4gT3BlbkpQQS4gU2V0IHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5JbnZlcnNlTWFuYWdlciI+PGNsYXNzbmFtZT5vcGVuanBhLkludmVyc2VNYW5hZ2VyCis8L2NsYXNzbmFtZT48L2xpbms+IHBsdWdpbiBwcm9wZXJ0eSB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBmb3Igc3RhbmRhcmQKK21hbmFnZW1lbnQuIFVuZGVyIHRoaXMgc2V0dGluZywgT3BlbkpQQSBkZXRlY3RzIGNoYW5nZXMgdG8gZWl0aGVyIHNpZGUgb2YgYQorYmlkaXJlY3Rpb25hbCByZWxhdGlvbiAobG9naWNhbCBvciBwaHlzaWNhbCksIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG90aGVyCitzaWRlIGFwcHJvcHJpYXRlbHkgb24gZmx1c2guCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnZlcnNlc2V4Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFbmFibGluZyBNYW5hZ2VkIEludmVyc2VzCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuSW52ZXJzZU1hbmFnZXIiIHZhbHVlPSJ0cnVlIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxwYXJhPgorVGhlIGludmVyc2UgbWFuYWdlciBoYXMgb3B0aW9ucyB0byBsb2cgYSB3YXJuaW5nIG9yIHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGl0CitkZXRlY3RzIGFuIGluY29uc2lzdGVudCBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uLCByYXRoZXIgdGhhbiBjb3JyZWN0aW5nIGl0LiBUbwordXNlIHRoZXNlIG1vZGVzLCBzZXQgdGhlIG1hbmFnZXIncyA8bGl0ZXJhbD5BY3Rpb248L2xpdGVyYWw+IHByb3BlcnR5IHRvCis8bGl0ZXJhbD53YXJuPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5leGNlcHRpb248L2xpdGVyYWw+LCByZXNwZWN0aXZlbHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitCeSBkZWZhdWx0LCBPcGVuSlBBIGV4Y2x1ZGVzIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5X2xycyI+IGxhcmdlCityZXN1bHQgc2V0IGZpZWxkczwvbGluaz4gZnJvbSBtYW5hZ2VtZW50LiBZb3UgY2FuIGZvcmNlIGxhcmdlIHJlc3VsdCBzZXQgZmllbGRzCit0byBiZSBpbmNsdWRlZCBieSBzZXR0aW5nIHRoZSA8bGl0ZXJhbD5NYW5hZ2VMUlM8L2xpdGVyYWw+IHBsdWdpbiBwcm9wZXJ0eSB0bworPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9pbnZlcnNlc19sb2dleCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgTG9nIEluY29uc2lzdGVuY2llcworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkludmVyc2VNYW5hZ2VyIiB2YWx1ZT0idHJ1ZShBY3Rpb249d2FybikiLyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19zY29zIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgUGVyc2lzdGVudCBGaWVsZHMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfc2NvcyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBIGVuaGFuY2VzIHRoZSBzcGVjaWZpY2F0aW9uJ3Mgc3VwcG9ydCBmb3IgcGVyc2lzdGVudCBmaWVsZHMgaW4gbWFueSB3YXlzLgorVGhpcyBzZWN0aW9uIGRvY3VtZW50cyBhc3BlY3RzIG9mIE9wZW5KUEEncyBwZXJzaXN0ZW50IGZpZWxkIGhhbmRsaW5nIHRoYXQgbWF5CithZmZlY3QgdGhlIHdheSB5b3UgZGVzaWduIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfc2Nvc19yZXN0b3JlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBSZXN0b3JpbmcgU3RhdGUKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19zY29zIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZmllbGQgcm9sbGJhY2sKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfc2Nvc19yZXN0b3JlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1doaWxlIHRoZSBKUEEgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgeW91IHNob3VsZCBub3QgdXNlIHJvbGxlZCBiYWNrIG9iamVjdHMsCitzdWNoIG9iamVjdHMgYXJlIHBlcmZlY3RseSB2YWxpZCBpbiBPcGVuSlBBLiBZb3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUKK29iamVjdHMnIG1hbmFnZWQgc3RhdGUgaXMgcm9sbGVkIGJhY2sgdG8gaXRzIHByZS10cmFuc2FjdGlvbiB2YWx1ZXMgd2l0aCB0aGUKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuUmVzdG9yZVN0YXRlIj48bGl0ZXJhbD5vcGVuanBhLlJlc3RvcmVTdGF0ZTwvbGl0ZXJhbD4KKzwvbGluaz4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4gZG9lcyBub3Qgcm9sbCBiYWNrIHN0YXRlCisodGhlIG9iamVjdCBiZWNvbWVzIGhvbGxvdywgYW5kIHdpbGwgcmUtbG9hZCBpdHMgc3RhdGUgdGhlIG5leHQgdGltZSBpdCBpcworYWNjZXNzZWQpLCA8bGl0ZXJhbD5pbW11dGFibGU8L2xpdGVyYWw+IHJlc3RvcmVzIGltbXV0YWJsZSB2YWx1ZXMgKHByaW1pdGl2ZXMsCitwcmltaXRpdmUgd3JhcHBlcnMsIHN0cmluZ3MpIGFuZCBjbGVhcnMgbXV0YWJsZSB2YWx1ZXMgc28gdGhhdCB0aGV5IGFyZSByZWxvYWRlZAorb24gbmV4dCBhY2Nlc3MsIGFuZCA8bGl0ZXJhbD5hbGw8L2xpdGVyYWw+IHJlc3RvcmVzIGFsbCBtYW5hZ2VkIHZhbHVlcyB0byB0aGVpcgorcHJlLXRyYW5zYWN0aW9uIHN0YXRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfc2Nvc19vcmRlciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgVHlwaW5nIGFuZCBPcmRlcmluZworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3Njb3Nfb3JkZXIiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9ycworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1doZW4gbG9hZGluZyBkYXRhIGludG8gYSBmaWVsZCwgT3BlbkpQQSBleGFtaW5lcyB0aGUgdmFsdWUgeW91IGFzc2lnbiB0aGUgZmllbGQKK2luIHlvdXIgZGVjbGFyYXRpb24gY29kZSBvciBpbiB5b3VyIG5vLWFyZ3MgY29uc3RydWN0b3IuIElmIHRoZSBmaWVsZCB2YWx1ZSdzCit0eXBlIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZmllbGQncyBkZWNsYXJlZCB0eXBlLCBPcGVuSlBBIHVzZXMgdGhlIHZhbHVlCit0eXBlIHRvIGhvbGQgdGhlIGxvYWRlZCBkYXRhLiBPcGVuSlBBIGFsc28gdXNlcyB0aGUgY29tcGFyYXRvciB5b3UndmUKK2luaXRpYWxpemVkIHRoZSBmaWVsZCB3aXRoLCBpZiBhbnkuIFRoZXJlZm9yZSwgeW91IGNhbiB1c2UgY3VzdG9tIGNvbXBhcmF0b3JzIG9uCit5b3VyIHBlcnNpc3RlbnQgZmllbGQgc2ltcGx5IGJ5IHNldHRpbmcgdXAgdGhlIGNvbXBhcmF0b3IgYW5kIHVzaW5nIGl0IGluIHlvdXIKK2ZpZWxkJ3MgaW5pdGlhbCB2YWx1ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfc2Nvc19vcmRlcl9pbml0aWFsdmFscyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVc2luZyBJbml0aWFsIEZpZWxkIFZhbHVlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaG91Z2ggdGhlIGFubm90YXRpb25zIGFyZSBsZWZ0IG91dCBmb3Igc2ltcGxpY2l0eSwgYXNzdW1lIDxsaXRlcmFsPgorZW1wbG95ZWVzQnlTYWw8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5kZXBhcnRtZW50czwvbGl0ZXJhbD4gYXJlIHBlcnNpc3RlbnQKK2ZpZWxkcyBpbiB0aGUgY2xhc3MgYmVsb3cuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIGNsYXNzIENvbXBhbnkgeworCisgICAgLy8gT3BlbkpQQSB3aWxsIGRldGVjdCB0aGUgY3VzdG9tIGNvbXBhcmF0b3IgaW4gdGhlIGluaXRpYWwgZmllbGQgdmFsdWUKKyAgICAvLyBhbmQgdXNlIGl0IHdoZW5ldmVyIGxvYWRpbmcgZGF0YSBmcm9tIHRoZSBkYXRhYmFzZSBpbnRvIHRoaXMgZmllbGQKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gZW1wbG95ZWVzQnlTYWwgPSBuZXcgVHJlZVNldChuZXcgU2FsYXJ5Q29tcGFyYXRvcigpKTsKKyAgICBwcml2YXRlIE1hcCBkZXBhcnRtZW50czsKKworICAgIHB1YmxpYyBDb21wYW55IHsKKyAgICAgICAgLy8gb3Igd2UgY2FuIGluaXRpYWxpemUgZmllbGRzIGluIG91ciBuby1hcmdzIGNvbnN0cnVjdG9yOyBldmVuIHRob3VnaAorICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkIHR5cGUgTWFwLCBPcGVuSlBBIHdpbGwgZGV0ZWN0IHRoYXQgaXQncyAKKyAgICAgICAgLy8gYWN0dWFsbHkgYSBUcmVlTWFwIGFuZCB1c2UgbmF0dXJhbCBvcmRlcmluZyBmb3IgbG9hZGVkIGRhdGEKKyAgICAgICAgZGVwYXJ0bWVudHMgPSBuZXcgVHJlZU1hcCgpOworICAgIH0KKworICAgIC8vIHJlc3Qgb2YgY2xhc3MgZGVmaW5pdGlvbi4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BjX2NhbGVuZGFyX3RpbWV6b25lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBDYWxlbmRhciBGaWVsZHMgYW5kIFRpbWVab25lcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX2NhbGVuZGFyX3RpbWV6b25lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXIKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBJ3Mgc3VwcG9ydCBmb3IgdGhlIDxjbGFzc25hbWU+amF2YS51dGlsLkNhbGVuZGFyPC9jbGFzc25hbWU+IHR5cGUgd2lsbAorc3RvcmUgb25seSB0aGUgPGNsYXNzbmFtZT5EYXRlPC9jbGFzc25hbWU+IHBhcnQgb2YgdGhlIGZpZWxkLCBub3QgdGhlCis8Y2xhc3NuYW1lPlRpbWVab25lPC9jbGFzc25hbWU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGQuIFdoZW4gbG9hZGluZyB0aGUgZGF0ZQoraW50byB0aGUgPGNsYXNzbmFtZT5DYWxlbmRhcjwvY2xhc3NuYW1lPiBmaWVsZCwgT3BlbkpQQSB3aWxsIHVzZSB0aGUgPGNsYXNzbmFtZT4KK1RpbWVab25lPC9jbGFzc25hbWU+IHRoYXQgd2FzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgd2lsbCBhdXRvbWF0aWNhbGx5IHRyYWNrIGNoYW5nZXMgbWFkZSB2aWEgbW9kaWZpY2F0aW9uIG1ldGhvZHMgaW4gZmllbGRzCitvZiB0eXBlIDxjbGFzc25hbWU+Q2FsZW5kYXI8L2NsYXNzbmFtZT4sIHdpdGggb25lIGV4Y2VwdGlvbjogd2hlbiB1c2luZyBKYXZhCit2ZXJzaW9uIDEuMywgdGhlIDxtZXRob2RuYW1lPnNldCgpPC9tZXRob2RuYW1lPiBtZXRob2QgY2Fubm90IGJlIG92ZXJyaWRkZW4sIHNvCit3aGVuIGFsdGVyaW5nIHRoZSBjYWxlbmRhciB1c2luZyB0aGF0IG1ldGhvZCwgdGhlIGZpZWxkIG11c3QgYmUgZXhwbGljaXRseQorbWFya2VkIGFzIGRpcnR5LiBUaGlzIGxpbWl0YXRpb24gZG9lcyBub3QgYXBwbHkgd2hlbiBydW5uaW5nIHdpdGggSmF2YSB2ZXJzaW9uCisxLjQgYW5kIGhpZ2VyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BjX3Njb3NfcHJveHkiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFByb3hpZXMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcHJveGllcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgcHJveGllcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIHByb3hpZXMKKyAgICAgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitBdCBydW50aW1lLCB0aGUgdmFsdWVzIG9mIGFsbCBtdXRhYmxlIHNlY29uZCBjbGFzcyBvYmplY3QgZmllbGRzIGluIHBlcnNpc3RlbnQKK2FuZCB0cmFuc2FjdGlvbmFsIG9iamVjdHMgYXJlIHJlcGxhY2VkIHdpdGggaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcHJveGllcy4gT24KK21vZGlmaWNhdGlvbiwgdGhlc2UgcHJveGllcyBub3RpZnkgdGhlaXIgb3duaW5nIGluc3RhbmNlIHRoYXQgdGhleSBoYXZlIGJlZW4KK2NoYW5nZWQsIHNvIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHVwZGF0ZXMgY2FuIGJlIG1hZGUgb24gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfc2Nvc19wcm94eV9zbWFydCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBTbWFydCBQcm94aWVzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5X3NtYXJ0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYXJ0CisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorTW9zdCBwcm94aWVzIG9ubHkgdHJhY2sgd2hldGhlciBvciBub3QgdGhleSBoYXZlIGJlZW4gbW9kaWZpZWQuIFNtYXJ0IHByb3hpZXMKK2ZvciBjb2xsZWN0aW9uIGFuZCBtYXAgZmllbGRzLCBob3dldmVyLCBrZWVwIGEgcmVjb3JkIG9mIHdoaWNoIGVsZW1lbnRzIGhhdmUKK2JlZW4gYWRkZWQsIHJlbW92ZWQsIGFuZCBjaGFuZ2VkLiBUaGlzIHJlY29yZCBlbmFibGVzIHRoZSBPcGVuSlBBIHJ1bnRpbWUgdG8KK21ha2UgbW9yZSBlZmZpY2llbnQgZGF0YWJhc2UgdXBkYXRlcyBvbiB0aGVzZSBmaWVsZHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiBkZXNpZ25pbmcgeW91ciBwZXJzaXN0ZW50IGNsYXNzZXMsIGtlZXAgaW4gbWluZCB0aGF0IHlvdSBjYW4gb3B0aW1pemUgZm9yCitPcGVuSlBBIHNtYXJ0IHByb3hpZXMgYnkgdXNpbmcgZmllbGRzIG9mIHR5cGUgPGNsYXNzbmFtZT5qYXZhLnV0aWwuU2V0Cis8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+amF2YS51dGlsLlRyZWVTZXQ8L2NsYXNzbmFtZT4sIGFuZCA8Y2xhc3NuYW1lPgoramF2YS51dGlsLkhhc2hTZXQ8L2NsYXNzbmFtZT4gZm9yIHlvdXIgY29sbGVjdGlvbnMgd2hlbmV2ZXIgcG9zc2libGUuIFNtYXJ0Citwcm94aWVzIGZvciB0aGVzZSB0eXBlcyBhcmUgbW9yZSBlZmZpY2llbnQgdGhhbiBwcm94aWVzIGZvciA8Y2xhc3NuYW1lPgorTGlzdDwvY2xhc3NuYW1lPnMuIFlvdSBjYW4gYWxzbyBkZXNpZ24geW91ciBvd24gc21hcnQgcHJveGllcyB0byBmdXJ0aGVyIAorb3B0aW1pemUgT3BlbkpQQSBmb3IgeW91ciB1c2FnZSBwYXR0ZXJucy4gU2VlIHRoZSBzZWN0aW9uIG9uCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfc2Nvc19wcm94eV9jdXN0b20iPmN1c3RvbSBwcm94aWVzPC9saW5rPiBmb3IKK2RldGFpbHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5X2xycyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBMYXJnZSBSZXN1bHQgU2V0IFByb3hpZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3Njb3NfcHJveHlfbHJzIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfc2Nvc19wcm94eV9scnMiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1VuZGVyIHN0YW5kYXJkIE9STSBiZWhhdmlvciwgdHJhdmVyc2luZyBhIHBlcnNpc3RlbnQgY29sbGVjdGlvbiBvciBtYXAgZmllbGQKK2JyaW5ncyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoYXQgZmllbGQgaW50byBtZW1vcnkuIFNvbWUgcGVyc2lzdGVudCBmaWVsZHMsCitob3dldmVyLCBtaWdodCByZXByZXNlbnQgaHVnZSBhbW91bnRzIG9mIGRhdGEsIHRvIHRoZSBwb2ludCB0aGF0IGF0dGVtcHRpbmcgdG8KK2Z1bGx5IGluc3RhbnRpYXRlIHRoZW0gY2FuIG92ZXJ3aGVsbSB0aGUgSlZNIG9yIHNlcmlvdXNseSBkZWdyYWRlIHBlcmZvcm1hbmNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgdXNlcyBzcGVjaWFsIHByb3h5IHR5cGVzIHRvIHJlcHJlc2VudCB0aGVzZSAibGFyZ2UgcmVzdWx0IHNldCIgZmllbGRzLgorT3BlbkpQQSdzIGxhcmdlIHJlc3VsdCBzZXQgcHJveGllcyBkbyBub3QgY2FjaGUgYW55IGRhdGEgaW4gbWVtb3J5LiBJbnN0ZWFkLAorZWFjaCBvcGVyYXRpb24gb24gdGhlIHByb3h5IG9mZmxvYWRzIHRoZSB3b3JrIHRvIHRoZSBkYXRhYmFzZSBhbmQgcmV0dXJucyB0aGUKK3Byb3BlciByZXN1bHQuIEZvciBleGFtcGxlLCB0aGUgPG1ldGhvZG5hbWU+Y29udGFpbnM8L21ldGhvZG5hbWU+IG1ldGhvZCBvZiBhCitsYXJnZSByZXN1bHQgc2V0IGNvbGxlY3Rpb24gd2lsbCBwZXJmb3JtIGEgPGxpdGVyYWw+IFNFTEVDVCBDT1VOVCgqKTwvbGl0ZXJhbD4KK3F1ZXJ5IHdpdGggdGhlIHByb3BlciA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY29uZGl0aW9ucyB0byBmaW5kIG91dCBpZiB0aGUKK2dpdmVuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBkYXRhYmFzZSdzIHJlY29yZCBvZiB0aGUgY29sbGVjdGlvbi4gU2ltaWxhcmx5LCBlYWNoCit0aW1lIHlvdSBvYnRhaW4gYW4gaXRlcmF0b3IgT3BlbkpQQSBwZXJmb3JtcyB0aGUgcHJvcGVyIHF1ZXJ5IHVzaW5nIHRoZSBjdXJyZW50Cis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF9scnMiPmxhcmdlIHJlc3VsdCBzZXQgc2V0dGluZ3M8L2xpbms+LCBhcworZGlzY3Vzc2VkIGluIHRoZSA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cCI+SkRCQzwvbGluaz4gY2hhcHRlci4gQXMgeW91CitpbnZva2UgPG1ldGhvZG5hbWU+SXRlcmF0b3IubmV4dDwvbWV0aG9kbmFtZT4sIE9wZW5KUEEgaW5zdGFudGlhdGVzIHRoZSByZXN1bHQKK29iamVjdHMgb24tZGVtYW5kLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gZnJlZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgYSBsYXJnZSByZXN1bHQgc2V0IGl0ZXJhdG9yIGJ5IHBhc3NpbmcgaXQgdG8KK3RoZSBzdGF0aWMgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3J1bnRpbWVfb3BlbmpwYXBlcnNpc3RlbmNlIj48bWV0aG9kbmFtZT4KK09wZW5KUEFQZXJzaXN0ZW5jZS5jbG9zZTwvbWV0aG9kbmFtZT48L2xpbms+IG1ldGhvZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5X2xyc19pdHIiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBhIExhcmdlIFJlc3VsdCBTZXQgSXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK0NvbGxlY3Rpb24gZW1wbG95ZWVzID0gY29tcGFueS5nZXRFbXBsb3llZXMoKTsgLy8gZW1wbG95ZWVzIGlzIGEgbHJzIGNvbGxlY3Rpb24KK0l0ZXJhdG9yIGl0ciA9IGVtcGxveWVlcy5pdGVyYXRvcigpOword2hpbGUgKGl0ci5oYXNOZXh0KCkpCisgICAgcHJvY2VzcygoRW1wbG95ZWUpIGl0ci5uZXh0KCkpOworT3BlbkpQQVBlcnNpc3RlbmNlLmNsb3NlKGl0cik7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBmcm9tIGxhcmdlIHJlc3VsdCBzZXQgcHJveGllcywganVzdCBhcyB3aXRoIHN0YW5kYXJkCitmaWVsZHMuIE9wZW5KUEEga2VlcHMgYSByZWNvcmQgb2YgYWxsIGNoYW5nZXMgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBwcm94eSwKK3doaWNoIGl0IHVzZXMgdG8gbWFrZSBzdXJlIHRoZSBwcm9wZXIgcmVzdWx0cyBhcmUgYWx3YXlzIHJldHVybmVkIGZyb20KK2NvbGxlY3Rpb24gYW5kIG1hcCBtZXRob2RzLCBhbmQgdG8gdXBkYXRlIHRoZSBmaWVsZCdzIGRhdGFiYXNlIHJlY29yZCBvbiBjb21taXQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSW4gb3JkZXIgdG8gdXNlIGxhcmdlIHJlc3VsdCBzZXQgcHJveGllcyBpbiBKUEEsIGFkZCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0xSUy5odG1sIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkxSUzwvY2xhc3NuYW1lPjwvdWxpbms+IGFubm90YXRpb24gdG8gdGhlCitwZXJzaXN0ZW50IGZpZWxkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zIGFwcGx5IHRvIGxhcmdlIHJlc3VsdCBzZXQgZmllbGRzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmaWVsZCBtdXN0IGJlIGRlY2xhcmVkIGFzIGVpdGhlciBhIDxjbGFzc25hbWU+amF2YS51dGlsLkNvbGxlY3Rpb24KKzwvY2xhc3NuYW1lPiBvciA8Y2xhc3NuYW1lPmphdmEudXRpbC5NYXA8L2NsYXNzbmFtZT4uIEl0IGNhbm5vdCBiZSBkZWNsYXJlZCBhcworYW55IG90aGVyIHR5cGUsIGluY2x1ZGluZyBhbnkgc3ViLWludGVyZmFjZSBvZiBjb2xsZWN0aW9uIG9yIG1hcCwgb3IgYW55Citjb25jcmV0ZSBjb2xsZWN0aW9uIG9yIG1hcCBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgZmllbGQgY2Fubm90IGhhdmUgYW4gZXh0ZXJuYWxpemVyIChzZWUgCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcGNfZXh0ZXJuIi8+KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitCZWNhdXNlIHRoZXkgcmVseSBvbiB0aGVpciBvd25pbmcgb2JqZWN0IGZvciBjb250ZXh0LCBsYXJnZSByZXN1bHQgc2V0IHByb3hpZXMKK2Nhbm5vdCBiZSB0cmFuc2ZlcnJlZCBmcm9tIG9uZSBwZXJzaXN0ZW50IGZpZWxkIHRvIGFub3RoZXIuIFRoZSBmb2xsb3dpbmcgY29kZQord291bGQgcmVzdWx0IGluIGFuIGVycm9yIG9uIGNvbW1pdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK0NvbGxlY3Rpb24gZW1wbG95ZWVzID0gY29tcGFueS5nZXRFbXBsb3llZXMoKSAgLy8gZW1wbG95ZWVzIGlzIGEgbHJzIGNvbGxlY3Rpb24KK2NvbXBhbnkuc2V0RW1wbG95ZWVzKG51bGwpOworYW5vdGhlckNvbXBhbnkuc2V0RW1wbG95ZWVzKGVtcGxveWVlcyk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfc2Nvc19wcm94eV9scnNfZXh0ZW5zaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgTWFya2luZyBhIExhcmdlIFJlc3VsdCBTZXQgRmllbGQKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworQEVudGl0eQorcHVibGljIGNsYXNzIENvbXBhbnkgeworCisgICAgQE1hbnlUb01hbnkKKyAgICBATFJTIHByaXZhdGUgQ29sbGVjdGlvbiZsdDtFbXBsb3llZSZndDsgZW1wbG95ZWVzOworCisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcGNfc2Nvc19wcm94eV9jdXN0b20iPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ3VzdG9tIFByb3hpZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX3Njb3NfcHJveHlfY3VzdG9tIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5X2N1c3RvbSI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllcworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBQcm94eU1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIG1hbmFnZXMgcHJveGllcyB0aHJvdWdoIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvdXRpbC9Qcm94eU1hbmFnZXIuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS51dGlsLlByb3h5TWFuYWdlcjwvY2xhc3NuYW1lPjwvdWxpbms+IGludGVyZmFjZS4gT3BlbkpQQQoraW5jbHVkZXMgYSBkZWZhdWx0IHByb3h5IG1hbmFnZXIsIHRoZSA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHlNYW5hZ2VySW1wbDwvY2xhc3NuYW1lPiAod2l0aCBhIHBsdWdpbiBhbGlhcyBuYW1lCitvZiA8bGl0ZXJhbD5kZWZhdWx0PC9saXRlcmFsPiksIHRoYXQgd2lsbCBtZWV0IHRoZSBuZWVkcyBvZiBtb3N0IHVzZXJzLiBUaGUKK2RlZmF1bHQgcHJveHkgbWFuYWdlciB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5UcmFja0NoYW5nZXM8L2xpdGVyYWw+OiBXaGV0aGVyIHRvIHVzZQorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3BjX3Njb3NfcHJveHlfc21hcnQiPnNtYXJ0IHByb3hpZXM8L2xpbms+LiBEZWZhdWx0cyB0bworPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QXNzZXJ0QWxsb3dlZFR5cGU8L2xpdGVyYWw+OiBXaGV0aGVyIHRvIGltbWVkaWF0ZWx5IHRocm93IGFuIGV4Y2VwdGlvbgoraWYgeW91IGF0dGVtcHQgdG8gYWRkIGFuIGVsZW1lbnQgdG8gYSBjb2xsZWN0aW9uIG9yIG1hcCB0aGF0IGlzIG5vdCBhc3NpZ25hYmxlCit0byB0aGUgZWxlbWVudCB0eXBlIGRlY2xhcmVkIGluIG1ldGFkYXRhLiAgRGVmYXVsdHMgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGRlZmF1bHQgcHJveHkgbWFuYWdlciBjYW4gcHJveHkgdGhlIHN0YW5kYXJkIG1ldGhvZHMgb2YgYW55IAorPGNsYXNzbmFtZT5Db2xsZWN0aW9uPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPkxpc3Q8L2NsYXNzbmFtZT4sIAorPGNsYXNzbmFtZT5NYXA8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+UXVldWU8L2NsYXNzbmFtZT4sIAorPGNsYXNzbmFtZT5EYXRlPC9jbGFzc25hbWU+LCBvciA8Y2xhc3NuYW1lPkNhbGVuZGFyPC9jbGFzc25hbWU+IGNsYXNzLCAKK2luY2x1ZGluZyBjdXN0b20gaW1wbGVtZW50YXRpb25zLiAgSXQgY2FuIGFsc28gcHJveHkgY3VzdG9tIGNsYXNzZXMgd2hvc2UgCithY2Nlc3NvciBhbmQgbXV0YXRvciBtZXRob2RzIGZvbGxvdyBKYXZhQmVhbiBuYW1pbmcgY29udmVudGlvbnMuICBZb3VyIGN1c3RvbQordHlwZXMgbXVzdCwgaG93ZXZlciwgbWVldCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0N1c3RvbSBjb250YWluZXIgdHlwZXMgbXVzdCBoYXZlIGEgcHVibGljIG5vLWFyZyBjb25zdHJ1Y3RvciBvciBhIHB1YmxpYworY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSA8Y2xhc3NuYW1lPkNvbXBhcmF0b3I8L2NsYXNzbmFtZT4gcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0N1c3RvbSBkYXRlIHR5cGVzIG11c3QgaGF2ZSBhIHB1YmxpYyBuby1hcmcgY29uc3RydWN0b3Igb3IgYSBwdWJsaWMKK2NvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBzaW5nbGUgPGNsYXNzbmFtZT5sb25nPC9jbGFzc25hbWU+IHBhcmFtZXRlciAKK3JlcHJlc2VudGluZyB0aGUgY3VycmVudCB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK090aGVyIGN1c3RvbSB0eXBlcyBtdXN0IGhhdmUgYSBwdWJsaWMgbm8tYXJnIGNvbnN0cnVjdG9yIG9yIGEgcHVibGljIGNvcHkKK2NvbnN0cnVjdG9yLiAgSWYgYSBjdXN0b20gdHlwZXMgZG9lcyBub3QgaGF2ZSBhIGNvcHkgY29uc3RydWN0b3IsIGl0IG11c3QgYmUgCitwb3NzaWJsZSB0byBmdWxseSBjb3B5IGFuIGluc3RhbmNlIEEgYnkgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgQiBhbmQgY2FsbGluZyAKK2VhY2ggb2YgQidzIHNldHRlcnMgd2l0aCB0aGUgdmFsdWUgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBnZXR0ZXIgb24gQS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdSBoYXZlIGN1c3RvbSBjbGFzc2VzIHRoYXQgbXVzdCBiZSBwcm94aWVkIGFuZCBkbyBub3QgbWVldCB0aGVzZSAKK3JlcXVpcmVtZW50cywgT3BlbkpQQSBhbGxvd3MgeW91IHRvIGRlZmluZSB5b3VyIG93biBwcm94eSBjbGFzc2VzIGFuZAoreW91ciBvd24gcHJveHkgbWFuYWdlci4gU2VlIHRoZSA8bGl0ZXJhbD5vcGVuanBhLnV0aWw8L2xpdGVyYWw+IHBhY2thZ2UKKzx1bGluayB1cmw9Ii4uL2phdmFkb2MvIj5KYXZhZG9jPC91bGluaz4gZm9yIGRldGFpbHMgb24gdGhlIGludGVyZmFjZXMgaW52b2x2ZWQsCithbmQgdGhlIHV0aWxpdHkgY2xhc3NlcyBPcGVuSlBBIHByb3ZpZGVzIHRvIGFzc2lzdCB5b3UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBwbHVnIHlvdXIgY3VzdG9tIHByb3h5IG1hbmFnZXIgaW50byB0aGUgT3BlbkpQQSBydW50aW1lIHRocm91Z2ggdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLlByb3h5TWFuYWdlciI+PGxpdGVyYWw+IG9wZW5qcGEuUHJveHlNYW5hZ2VyPC9saXRlcmFsPgorPC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3BjX3Njb3NfcHJveHlfY3VzdG9tX2V4Ij4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgdGhlIFByb3h5IE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLlByb3h5TWFuYWdlciIgdmFsdWU9IlRyYWNrQ2hhbmdlcz1mYWxzZSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19leHRlcm4iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4dGVybmFsaXphdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3BjX2V4dGVybiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsaXphdGlvbgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudCBmaWVsZHMKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxpemF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxpemF0aW9uCisgICAgICAgICAgICAgICAgPC9zZWU+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBvZmZlcnMgdGhlIGFiaWxpdHkgdG8gd3JpdGUKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9tYXBwaW5nX2N1c3RvbV9maWVsZCI+Y3VzdG9tIGZpZWxkIG1hcHBpbmdzPC9saW5rPiBpbgorb3JkZXIgdG8gaGF2ZSBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIG1lY2hhbmlzbSB3aXRoIHdoaWNoIGZpZWxkcyBhcmUgc3RvcmVkLAorcXVlcmllZCwgYW5kIGxvYWRlZCBmcm9tIHRoZSBkYXRhc3RvcmUuIE9mdGVuLCBob3dldmVyLCBhIGN1c3RvbSBtYXBwaW5nIGlzCitvdmVya2lsbC4gVGhlcmUgaXMgb2Z0ZW4gYSBzaW1wbGUgdHJhbnNmb3JtYXRpb24gZnJvbSBhIEphdmEgZmllbGQgdmFsdWUgdG8gaXRzCitkYXRhYmFzZSByZXByZXNlbnRhdGlvbi4gVGh1cywgT3BlbkpQQSBwcm92aWRlcyB0aGUgZXh0ZXJuYWxpemF0aW9uIHNlcnZpY2UuCitFeHRlcm5hbGl6YXRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG1ldGhvZHMgdGhhdCB3aWxsIGV4dGVybmFsaXplIGEgZmllbGQKK3ZhbHVlIHRvIGl0cyBkYXRhYmFzZSBlcXVpdmFsZW50IG9uIHN0b3JlIGFuZCB0aGVuIHJlYnVpbGQgdGhlIHZhbHVlIGZyb20gaXRzCitleHRlcm5hbGl6ZWQgZm9ybSBvbiBsb2FkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitGaWVsZHMgb2YgZW1iZWRkYWJsZSBjbGFzc2VzIHVzZWQgZm9yIDxsaXRlcmFsPkBFbWJlZGRlZElkPC9saXRlcmFsPiB2YWx1ZXMgaW4KK0pQQSBjYW5ub3QgaGF2ZSBleHRlcm5hbGl6ZXJzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0V4dGVybmFsaXplci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkV4dGVybmFsaXplcjwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uIHNldHMgdGhlIG5hbWUgb2YgYSBtZXRob2QgdGhhdCB3aWxsIGJlIGludm9rZWQgdG8gY29udmVydAordGhlIGZpZWxkIGludG8gaXRzIGV4dGVybmFsIGZvcm0gZm9yIGRhdGFiYXNlIHN0b3JhZ2UuIFlvdSBjYW4gc3BlY2lmeSBlaXRoZXIKK3RoZSBuYW1lIG9mIGEgbm9uLXN0YXRpYyBtZXRob2QsIHdoaWNoIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZmllbGQgdmFsdWUsIG9yIGEKK3N0YXRpYyBtZXRob2QsIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBmaWVsZCB2YWx1ZSBhcyBhIHBhcmFtZXRlci4gRWFjaAorbWV0aG9kIGNhbiBhbHNvIHRha2UgYW4gb3B0aW9uYWwKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9TdG9yZUNvbnRleHQuaHRtbCI+PGNsYXNzbmFtZT4KK1N0b3JlQ29udGV4dDwvY2xhc3NuYW1lPjwvdWxpbms+IHBhcmFtZXRlciBmb3IgYWNjZXNzIHRvIGEgcGVyc2lzdGVuY2UgY29udGV4dC4KK1RoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcyB0aGUgZmllbGQncyBleHRlcm5hbCBmb3JtLiBCeSBkZWZhdWx0LCBPcGVuSlBBCithc3N1bWVzIHRoYXQgYWxsIG5hbWVkIG1ldGhvZHMgYmVsb25nIHRvIHRoZSBmaWVsZCB2YWx1ZSdzIGNsYXNzIChvciBpdHMKK3N1cGVyY2xhc3NlcykuIFlvdSBjYW4sIGhvd2V2ZXIsIHNwZWNpZnkgc3RhdGljIG1ldGhvZHMgb2Ygb3RoZXIgY2xhc3NlcyB1c2luZwordGhlIGZvcm1hdCA8bGl0ZXJhbD4mbHQ7Y2xhc3MtbmFtZSZndDsuJmx0O21ldGhvZC1uYW1lJmd0OzwvbGl0ZXJhbD4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0dpdmVuIGEgZmllbGQgb2YgdHlwZSA8Y2xhc3NuYW1lPkN1c3RvbVR5cGU8L2NsYXNzbmFtZT4gdGhhdCBleHRlcm5hbGl6ZXMgdG8gYQorc3RyaW5nLCB0aGUgdGFibGUgYmVsb3cgZGVtb25zdHJhdGVzIHNldmVyYWwgcG9zc2libGUgZXh0ZXJuYWxpemVyIG1ldGhvZHMgYW5kCit0aGVpciBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGV4dGVuc2lvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8dGFibGUgdG9jZW50cnk9IjEiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxpemVyIE9wdGlvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiIGNvbHNlcD0iMSIgcm93c2VwPSIxIj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0ibWV0aG9kIi8+CisKKyAgICAgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0iZXh0ZW5zaW9uIi8+CisKKyAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibWV0aG9kIj4KK01ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImV4dGVuc2lvbiI+CitFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im1ldGhvZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorcHVibGljIFN0cmluZyBDdXN0b21UeXBlLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorQEV4dGVybmFsaXplcigidG9TdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibWV0aG9kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+CitwdWJsaWMgU3RyaW5nIEN1c3RvbVR5cGUudG9TdHJpbmcoU3RvcmVDb250ZXh0IGN0eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorQEV4dGVybmFsaXplcigidG9TdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibWV0aG9kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+CitwdWJsaWMgc3RhdGljIFN0cmluZyBBbnlDbGFzcy50b1N0cmluZyhDdXN0b21UeXBlIGN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+CitARXh0ZXJuYWxpemVyKCJBbnlDbGFzcy50b1N0cmluZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJtZXRob2QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIEFueUNsYXNzLnRvU3RyaW5nKEN1c3RvbVR5cGUgY3QsIFN0b3JlQ29udGV4dCBjdHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJleHRlbnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4KK0BFeHRlcm5hbGl6ZXIoIkFueUNsYXNzLnRvU3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBPcGVuSlBBCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GYWN0b3J5Lmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRmFjdG9yeTwvY2xhc3NuYW1lPjwvdWxpbms+IGFubm90YXRpb24KK2NvbnRhaW5zIHRoZSBuYW1lIG9mIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSBpbnZva2VkIHRvIGluc3RhbnRpYXRlIHRoZSBmaWVsZCBmcm9tCit0aGUgZXh0ZXJuYWwgZm9ybSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBTcGVjaWZ5IGEgc3RhdGljIG1ldGhvZCBuYW1lLiBUaGUKK21ldGhvZCB3aWxsIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBleHRlcm5hbGl6ZWQgdmFsdWUgYW5kIG11c3QgcmV0dXJuIGFuCitpbnN0YW5jZSBvZiB0aGUgZmllbGQgdHlwZS4gVGhlIG1ldGhvZCBjYW4gYWxzbyB0YWtlIGFuIG9wdGlvbmFsCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RvcmVDb250ZXh0Lmh0bWwiPjxjbGFzc25hbWU+CitTdG9yZUNvbnRleHQ8L2NsYXNzbmFtZT48L3VsaW5rPiBwYXJhbWV0ZXIgZm9yIGFjY2VzcyB0byBhIHBlcnNpc3RlbmNlIGNvbnRleHQuCitJZiBhIGZhY3RvcnkgaXMgbm90IHNwZWNpZmllZCwgT3BlbkpQQSB3aWxsIHVzZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGZpZWxkCit0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgb2YgdGhlIGV4dGVybmFsIHR5cGUsIG9yIHdpbGwgdGhyb3cgYW4KK2V4Y2VwdGlvbiBpZiBubyBjb25zdHJ1Y3RvciB3aXRoIHRoYXQgc2lnbmF0dXJlIGV4aXN0cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorR2l2ZW4gYSBmaWVsZCBvZiB0eXBlIDxjbGFzc25hbWU+Q3VzdG9tVHlwZTwvY2xhc3NuYW1lPiB0aGF0IGV4dGVybmFsaXplcyB0byBhCitzdHJpbmcsIHRoZSB0YWJsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgc2V2ZXJhbCBwb3NzaWJsZSBmYWN0b3J5IG1ldGhvZHMgYW5kIHRoZWlyCitjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGV4dGVuc2lvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8dGFibGUgdG9jZW50cnk9IjEiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRmFjdG9yeSBPcHRpb25zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0IiBjb2xzZXA9IjEiIHJvd3NlcD0iMSI+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9Im1ldGhvZCIvPgorICAgICAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJleHRlbnNpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibWV0aG9kIj4KK01ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImV4dGVuc2lvbiI+CitFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im1ldGhvZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorcHVibGljIEN1c3RvbVR5cGUoU3RyaW5nIHN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImV4dGVuc2lvbiI+Citub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0ibWV0aG9kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+CitwdWJsaWMgc3RhdGljIEN1c3RvbVR5cGUgQ3VzdG9tVHlwZS5mcm9tU3RyaW5nKFN0cmluZyBzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJleHRlbnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4KK0BGYWN0b3J5KCJmcm9tU3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im1ldGhvZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorcHVibGljIHN0YXRpYyBDdXN0b21UeXBlIEN1c3RvbVR5cGUuZnJvbVN0cmluZyhTdHJpbmcgc3RyLCBTdG9yZUNvbnRleHQgY3R4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+CitARmFjdG9yeSgiZnJvbVN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJtZXRob2QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4KK3B1YmxpYyBzdGF0aWMgQ3VzdG9tVHlwZSBBbnlDbGFzcy5mcm9tU3RyaW5nKFN0cmluZyBzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJleHRlbnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4KK0BGYWN0b3J5KCJBbnlDbGFzcy5mcm9tU3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9Im1ldGhvZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorcHVibGljIHN0YXRpYyBDdXN0b21UeXBlIEFueUNsYXNzLmZyb21TdHJpbmcoU3RyaW5nIHN0ciwgU3RvcmVDb250ZXh0IGN0eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPgorQEZhY3RvcnkoIkFueUNsYXNzLmZyb21TdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDxwYXJhPgorSWYgeW91ciBleHRlcm5hbGl6ZWQgZmllbGQgaXMgbm90IGEgc3RhbmRhcmQgcGVyc2lzdGVudCB0eXBlLCB5b3UgbXVzdAorZXhwbGljaXRseSBtYXJrIGl0IHBlcnNpc3RlbnQuIEluIE9wZW5KUEEsIHlvdSBjYW4gZm9yY2UgYSBwZXJzaXN0ZW50IGZpZWxkCitieSBhbm5vdGF0aW5nIGl0IHdpdGggPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX21ldGFfanBhX3BlcnNpc3RlbnQiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUGVyc2lzdGVudDwvY2xhc3NuYW1lPjwvbGluaz4gYW5ub3RhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgeW91ciBjdXN0b20gZmllbGQgdHlwZSBpcyBtdXRhYmxlIGFuZCBpcyBub3QgYSBzdGFuZGFyZCBjb2xsZWN0aW9uLCBtYXAsIG9yCitkYXRlIGNsYXNzLCBPcGVuSlBBIHdpbGwgbm90IGJlIGFibGUgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gdGhlIGZpZWxkLiBZb3UgbXVzdAorbWFyayB0aGUgZmllbGQgZGlydHkgbWFudWFsbHksIG9yIGNyZWF0ZSBhIGN1c3RvbSBmaWVsZCBwcm94eS4KK1NlZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuaHRtbCI+Cis8bWV0aG9kbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlci5kaXJ0eTwvbWV0aG9kbmFtZT48L3VsaW5rPiBmb3IgaG93IHRvIG1hcmsgYQorZmllbGQgZGlydHkgbWFudWFsbHkgaW4gSlBBLgorU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9wY19zY29zX3Byb3h5Ii8+IGZvciBhIGRpc2N1c3Npb24gb2YgcHJveGllcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gZXh0ZXJuYWxpemUgYSBmaWVsZCB0byB2aXJ0dWFsbHkgYW55IHZhbHVlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5CitPcGVuSlBBJ3MgZmllbGQgbWFwcGluZ3MgKGVtYmVkZGVkIHJlbGF0aW9ucyBhcmUgdGhlIGV4Y2VwdGlvbjsgeW91IG11c3QgZGVjbGFyZQoreW91ciBmaWVsZCB0byBiZSBhIHBlcnNpc3RlbmNlLWNhcGFibGUgdHlwZSBpbiBvcmRlciB0byBlbWJlZCBpdCkuIFRoaXMgbWVhbnMKK3RoYXQgYSBmaWVsZCBjYW4gZXh0ZXJuYWxpemUgdG8gc29tZXRoaW5nIGFzIHNpbXBsZSBhcyBhIHByaW1pdGl2ZSwgc29tZXRoaW5nIGFzCitjb21wbGV4IGFzIGEgY29sbGVjdGlvbiBvciBtYXAgb2YgZW50aXRpZXMsIG9yIGFueXRoaW5nIGluCitiZXR3ZWVuLiBJZiB5b3UgZG8gY2hvb3NlIHRvIGV4dGVybmFsaXplIHRvIGEgY29sbGVjdGlvbiBvciBtYXAsIE9wZW5KUEEKK3JlY29nbml6ZXMgYSBmYW1pbHkgb2YgbWV0YWRhdGEgZXh0ZW5zaW9ucyBmb3Igc3BlY3lpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlCitleHRlcm5hbGl6ZWQgZm9ybSBvZiB5b3VyIGZpZWxkcyAtIHNlZSA8eHJlZiBsaW5rZW5kPSJ0eXBlIi8+LiBJZiB0aGUKK2V4dGVybmFsIGZvcm0gb2YgeW91ciBmaWVsZCBpcyBhbiBlbnRpdHkgb2JqZWN0IG9yIGNvbnRhaW5zIGVudGl0aWVzLCBPcGVuSlBBIAord2lsbCBjb3JyZWN0bHkgaW5jbHVkZSB0aGUgb2JqZWN0cyBpbiBpdHMgcGVyc2lzdGVuY2UtYnktcmVhY2hhYmlsaXR5IAorYWxnb3JpdGhtcyBhbmQgaXRzIGRlbGV0ZS1kZXBlbmRlbnQgYWxnb3JpdGhtcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIGEgZmV3IGZvcm1zIG9mIGV4dGVybmFsaXphdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfZXh0ZXJuZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVXNpbmcgRXh0ZXJuYWxpemF0aW9uCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworQEVudGl0eQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKworICAgIC8vIHVzZSBDbGFzcy5nZXROYW1lIGFuZCBDbGFzcy5mb3JOYW1lIHRvIGdvIHRvL2Zyb20gc3RyaW5ncworICAgIEBQZXJzaXN0ZW50CisgICAgQEV4dGVybmFsaXplcigiZ2V0TmFtZSIpCisgICAgQEZhY3RvcnkoImZvck5hbWUiKQorICAgIHByaXZhdGUgQ2xhc3MgY2xzOworCisgICAgLy8gdXNlIFVSTC5nZXRFeHRlcm5hbEZvcm0gZm9yIGV4dGVybmFsaXphdGlvbi4gbm8gZmFjdG9yeTsKKyAgICAvLyB3ZSBjYW4gcmVseSBvbiB0aGUgVVJMIHN0cmluZyBjb25zdHJ1Y3RvcgorICAgIEBQZXJzaXN0ZW50CisgICAgQEV4dGVybmFsaXplcigidG9FeHRlcm5hbEZvcm0iKQorICAgIHByaXZhdGUgVVJMIHVybDsKKworICAgIC8vIHVzZSBvdXIgY3VzdG9tIG1ldGhvZHMKKyAgICBAUGVyc2lzdGVudAorICAgIEBFeHRlcm5hbGl6ZXIoIk1hZ2F6aW5lLmF1dGhvcnNGcm9tQ3VzdG9tVHlwZSIpCisgICAgQEZhY3RvcnkoIk1hZ2F6aW5lLmF1dGhvcnNUb0N1c3RvbVR5cGUiKQorICAgIEBFbGVtZW50VHlwZShBdXRob3IuY2xhc3MpCisgICAgcHJpdmF0ZSBDdXN0b21UeXBlIGN1c3RvbVR5cGU7CisKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gYXV0aG9yc0Zyb21DdXN0b21UeXBlKEN1c3RvbVR5cGUgY3VzdG9tVHlwZSkgeworICAgICAgICAuLi4gbG9naWMgdG8gcGFjayBjdXN0b20gdHlwZSBpbnRvIGEgbGlzdCBvZiBhdXRob3JzIC4uLgorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tVHlwZSBhdXRob3JzVG9DdXN0b21UeXBlIChDb2xsZWN0aW9uIGF1dGhvcnMpIHsKKyAgICAgICAgLi4uIGxvZ2ljIHRvIGNyZWF0ZSBjdXN0b20gdHlwZSBmcm9tIGEgY29sbGVjdGlvbiBvZiBhdXRob3JzIC4uLgorICAgIH0KKworICAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxpemF0aW9uCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIHF1ZXJpZXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorWW91IGNhbiBxdWVyeSBleHRlcm5hbGl6ZWQgZmllbGRzIHVzaW5nIHBhcmFtZXRlcnMuIFBhc3MgaW4gYSB2YWx1ZSBvZiB0aGUgZmllbGQKK3R5cGUgd2hlbiBleGVjdXRpbmcgdGhlIHF1ZXJ5LiBPcGVuSlBBIHdpbGwgZXh0ZXJuYWxpemUgdGhlIHBhcmFtZXRlciB1c2luZyB0aGUKK2V4dGVybmFsaXplciBtZXRob2QgbmFtZWQgaW4geW91ciBtZXRhZGF0YSwgYW5kIGNvbXBhcmUgdGhlIGV4dGVybmFsaXplZAorcGFyYW1ldGVyIHdpdGggdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIEFzIGEgc2hvcnRjdXQsIE9wZW5KUEEgYWxzbworYWxsb3dzIHlvdSB0byB1c2UgcGFyYW1ldGVycyBvciBsaXRlcmFscyBvZiB0aGUgZmllbGQncyBleHRlcm5hbGl6ZWQgdHlwZSBpbgorcXVlcmllcywgYXMgZGVtb25zdHJhdGVkIGluIHRoZSBleGFtcGxlIGJlbG93LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitDdXJyZW50bHksIHF1ZXJpZXMgYXJlIGxpbWl0ZWQgdG8gZmllbGRzIHRoYXQgZXh0ZXJuYWxpemUgdG8gYSBwcmltaXRpdmUsCitwcmltaXRpdmUgd3JhcHBlciwgc3RyaW5nLCBvciBkYXRlIHR5cGVzLCBkdWUgdG8gY29uc3RyYWludHMgb24gcXVlcnkgc3ludGF4LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGNfZXh0ZXJuX3F1ZXJ5ZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgUXVlcnlpbmcgRXh0ZXJuYWxpemF0aW9uIEZpZWxkcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CitBc3N1bWUgdGhlIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4gY2xhc3MgaGFzIHRoZSBzYW1lIGZpZWxkcyBhcyBpbiB0aGUKK3ByZXZpb3VzIGV4YW1wbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorLy8geW91IGNhbiBxdWVyeSB1c2luZyBwYXJhbWV0ZXJzCitRdWVyeSBxID0gZW0uY3JlYXRlUXVlcnkoInNlbGVjdCBtIGZyb20gTWFnYXppbmUgbSB3aGVyZSBtLnVybCA9IDp1Iik7CitxLnNldFBhcmFtZXRlcigidSIsIG5ldyBVUkwoImh0dHA6Ly93d3cuc29sYXJtZXRyaWMuY29tIikpOworTGlzdCByZXN1bHRzID0gcS5nZXRSZXN1bHRMaXN0KCk7CisKKy8vIG9yIGFzIGEgc2hvcnRjdXQsIHlvdSBjYW4gdXNlIHRoZSBleHRlcm5hbGl6ZWQgZm9ybSBkaXJlY3RseQorcSA9IGVtLmNyZWF0ZVF1ZXJ5KCJzZWxlY3QgbSBmcm9tIE1hZ2F6aW5lIG0gd2hlcmUgbS51cmwgPSAnaHR0cDovL3d3dy5zb2xhcm1ldHJpYy5jb20nIik7CityZXN1bHRzID0gcS5nZXRSZXN1bHRMaXN0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wY19leHRlcm5fdmFsdWVzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIFZhbHVlcworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGNfZXh0ZXJuX3ZhbHVlcyI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHZhbHVlcworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0V4dGVybmFsaXphdGlvbiBvZnRlbiB0YWtlcyBzaW1wbGUgY29uc3RhbnQgdmFsdWVzIGFuZCB0cmFuc2Zvcm1zIHRoZW0gdG8KK2NvbnN0YW50IHZhbHVlcyBvZiBhIGRpZmZlcmVudCB0eXBlLiBBbiBleGFtcGxlIHdvdWxkIGJlIHN0b3JpbmcgYSA8Y2xhc3NuYW1lPgorYm9vbGVhbjwvY2xhc3NuYW1lPiBmaWVsZCBhcyBhIDxjbGFzc25hbWU+Y2hhcjwvY2xhc3NuYW1lPiwgd2hlcmUgPGxpdGVyYWw+dHJ1ZQorPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+IHdvdWxkIGJlIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgYXMKKzxsaXRlcmFsPidUJzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPidGJzwvbGl0ZXJhbD4gcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgYWxsb3dzIHlvdSB0byBkZWZpbmUgdGhlc2Ugc2ltcGxlIHRyYW5zbGF0aW9ucyBpbiBtZXRhZGF0YSwgc28gdGhhdCB0aGUKK2ZpZWxkIGJlaGF2ZXMgYXMgaW4gPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3BjX2V4dGVybiI+ZnVsbC1mbGVkZ2VkCitleHRlcm5hbGl6YXRpb248L2xpbms+IHdpdGhvdXQgcmVxdWlyaW5nIGV4dGVybmFsaXplciBhbmQgZmFjdG9yeSBtZXRob2RzLgorRXh0ZXJuYWwgdmFsdWVzIHN1cHBvcnRzIHRyYW5zbGF0aW9uIG9mIHByZS1kZWZpbmVkIHNpbXBsZSB0eXBlcyAocHJpbWl0aXZlcywKK3ByaW1pdGl2ZSB3cmFwcGVycywgYW5kIFN0cmluZ3MpLCB0byBvdGhlciBwcmUtZGVmaW5lZCBzaW1wbGUgdmFsdWVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1VzZSB0aGUgT3BlbkpQQQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRXh0ZXJuYWxWYWx1ZXMuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5FeHRlcm5hbFZhbHVlczwvY2xhc3NuYW1lPjwvdWxpbms+Cithbm5vdGF0aW9uIHRvIGRlZmluZSBleHRlcm5hbCB2YWx1ZSB0cmFuc2xhdGlvbnMuIFRoZSB2YWx1ZXMgYXJlCitkZWZpbmVkIGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gdGhhdCBvZiA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIj4KK2NvbmZpZ3VyYXRpb24gcGx1Z2luczwvbGluaz4sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSBwYWlycyByZXByZXNlbnQgSmF2YSBhbmQKK2RhdGFzdG9yZSB2YWx1ZXMuIFRvIGNvbnZlcnQgdGhlIEphdmEgYm9vbGVhbiB2YWx1ZXMgb2YgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4KK2FuZCA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4gdG8gdGhlIGNoYXJhY3RlciB2YWx1ZXMgPGxpdGVyYWw+VDwvbGl0ZXJhbD4gYW5kCis8bGl0ZXJhbD5GPC9saXRlcmFsPiwgZm9yIGV4YW1wbGUsIHlvdSB3b3VsZCB1c2UgdGhlIGV4dGVuc2lvbiB2YWx1ZTogPGxpdGVyYWw+Cit0cnVlPVQsZmFsc2U9RjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgdGhlIHR5cGUgb2YgdGhlIGRhdGFzdG9yZSB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmllbGQncyB0eXBlLCB1c2UgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9UeXBlLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuVHlwZTwvY2xhc3NuYW1lPjwvdWxpbms+IGFubm90YXRpb24KK3RvIGRlZmluZSB0aGUgZGF0YXN0b3JlIHR5cGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxleGFtcGxlIGlkPSJleHRlcm52YWx1ZXNfZXgiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBFeHRlcm5hbCBWYWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGlzIGV4YW1wbGUgdXNlcyBleHRlcm5hbCB2YWx1ZSB0cmFuc2xhdGlvbiB0byB0cmFuc2Zvcm0gYSBzdHJpbmcgZmllbGQgdG8gYW4KK2ludGVnZXIgaW4gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgY2xhc3MgTWFnYXppbmUgeworCisgICAgQEV4dGVybmFsVmFsdWVzKHsiU01BTEw9NSIsICJNRURJVU09OCIsICJMQVJHRT0xMCJ9KQorICAgIEBUeXBlKGludC5jbGFzcykKKyAgICBwcml2YXRlIFN0cmluZyBzaXplV2lkdGg7CisKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZmV0Y2giPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBGZXRjaCBHcm91cHMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZmV0Y2giPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgZmV0Y2ggZ3JvdXBzCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0ZldGNoIGdyb3VwcyBhcmUgc2V0cyBvZiBmaWVsZHMgdGhhdCBsb2FkIHRvZ2V0aGVyLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHRvIHBvb2wKK3RvZ2V0aGVyIGFzc29jaWF0ZWQgZmllbGRzIGluIG9yZGVyIHRvIHByb3ZpZGUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIG92ZXIKK3N0YW5kYXJkIGRhdGEgZmV0Y2hpbmcuIFNwZWNpZnlpbmcgZmV0Y2ggZ3JvdXBzIGFsbG93cyBmb3IgdHVuaW5nIG9mIGxhenkKK2xvYWRpbmcgYW5kIGVhZ2VyIGZldGNoaW5nIGJlaGF2aW9yLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIEpQQSBPdmVydmlldydzIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tZXRhX2ZldGNoIi8+IGRlc2NyaWJlcyBob3cKK3RvIHVzZSBKUEEgbWV0YWRhdGEgYW5ub3RhdGlvbnMgdG8gY29udHJvbCB3aGV0aGVyIGEgZmllbGQgaXMgZmV0Y2hlZCBlYWdlcmx5IG9yCitsYXppbHkuIEZldGNoIGdyb3VwcyBhZGQgYSBkeW5hbWljIGFzcGVjdCB0byB0aGlzIHN0YW5kYXJkIGFiaWxpdHkuIEFzIHlvdSB3aWxsCitzZWUsIE9wZW5KUEEncyBKUEEgZXh0ZW5zaW9ucyBhbGxvdyB5b3UgY2FuIGFkZCBhbmQgcmVtb3ZlIGZldGNoIGdyb3VwcyBhdAorcnVudGltZSB0byB2YXJ5IHRoZSBzZXRzIG9mIGZpZWxkcyB0aGF0IGFyZSBlYWdlcmx5IGxvYWRlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2ZldGNoX2N1c3RvbSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ3VzdG9tIEZldGNoIEdyb3VwcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBwbGFjZXMgYW55IGZpZWxkIHRoYXQgaXMgZWFnZXJseSBsb2FkZWQgYWNjb3JkaW5nIHRvIHRoZSBKUEEgbWV0YWRhdGEKK3J1bGVzIGludG8gdGhlIGJ1aWx0LWluIDxlbXBoYXNpcz5kZWZhdWx0PC9lbXBoYXNpcz4gZmV0Y2ggZ3JvdXAuIEFzIGl0cyBuYW1lCitpbXBsaWVzLCB0aGUgZGVmYXVsdCBmZXRjaCBncm91cCBpcyBhY3RpdmUgYnkgZGVmYXVsdC4gIFlvdSBtYXkgYWxzbworZGVmaW5lIHlvdXIgb3duIG5hbWVkIGZldGNoIGdyb3VwcyBhbmQgYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGVtIGF0IHJ1bnRpbWUsCithcyBkZXNjcmliZWQgbGF0ZXIgaW4gdGhpcyBjaGFwdGVyLiBPcGVuSlBBIHdpbGwgZWFnZXJseS1sb2FkIHRoZSBmaWVsZHMgaW4gYWxsCithY3RpdmUgZmV0Y2ggZ3JvdXBzIHdoZW4gbG9hZGluZyBvYmplY3RzIGZyb20gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNyZWF0ZSBmZXRjaCBncm91cHMgd2l0aCB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0ZldGNoR3JvdXAuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaEdyb3VwPC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24uIElmIHlvdXIgY2xhc3Mgb25seSBoYXMgb25lIGN1c3RvbSBmZXRjaCBncm91cCwgeW91IGNhbiBwbGFjZSB0aGlzCithbm5vdGF0aW9uIGRpcmVjdGx5IG9uIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4gT3RoZXJ3aXNlLCB1c2UgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaEdyb3Vwcy5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkZldGNoR3JvdXBzPC9jbGFzc25hbWU+PC91bGluaz4KK2Fubm90YXRpb24gdG8gZGVjbGFyZSBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIDxjbGFzc25hbWU+RmV0Y2hHcm91cDwvY2xhc3NuYW1lPgordmFsdWVzLiBUaGUgPGNsYXNzbmFtZT5GZXRjaEdyb3VwPC9jbGFzc25hbWU+IGFubm90YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmcgbmFtZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBmZXRjaCBncm91cC4gRmV0Y2ggZ3JvdXAgbmFtZXMKK2FyZSBnbG9iYWwsIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgc2hhcmVkIGFtb25nIGNsYXNzZXMuIEZvciBleGFtcGxlLCBhIHNob3BwaW5nCit3ZWJzaXRlIG1heSB1c2UgYSA8ZW1waGFzaXM+ZGV0YWlsPC9lbXBoYXNpcz4gZmV0Y2ggZ3JvdXAgaW4gZWFjaCBwcm9kdWN0IGNsYXNzCit0byBlZmZpY2llbnRseSBsb2FkIGFsbCB0aGUgZGF0YSBuZWVkZWQgdG8gZGlzcGxheSBhIHByb2R1Y3QncyAiZGV0YWlsIiBwYWdlLgorVGhlIHdlYnNpdGUgbWlnaHQgYWxzbyBkZWZpbmUgYSBzcGFyc2UgPGVtcGhhc2lzPmxpc3Q8L2VtcGhhc2lzPiBmZXRjaCBncm91cAorY29udGFpbmluZyBvbmx5IHRoZSBmaWVsZHMgbmVlZGVkIHRvIGRpc3BsYXkgYSB0YWJsZSBvZiBwcm9kdWN0cywgYXMgaW4gYSBzZWFyY2gKK3Jlc3VsdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgT3BlbkpQQTogPGxpdGVyYWw+ZGVmYXVsdDwvbGl0ZXJhbD4KKywgPGxpdGVyYWw+dmFsdWVzPC9saXRlcmFsPiwgPGxpdGVyYWw+YWxsPC9saXRlcmFsPiwgPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4sCithbmQgYW55IG5hbWUgYmVnaW5uaW5nIHdpdGggPGxpdGVyYWw+amRvPC9saXRlcmFsPiwgPGxpdGVyYWw+anBhPC9saXRlcmFsPiwgb3IKKzxsaXRlcmFsPm9wZW5qcGE8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+RmV0Y2hBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzPC9saXRlcmFsPjogVGhlIHNldCBvZiBwZXJzaXN0ZW50IGZpZWxkcyBvcgorcHJvcGVydGllcyBpbiB0aGUgZmV0Y2ggZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TdHJpbmdbXSBmZXRjaEdyb3VwczwvbGl0ZXJhbD46IE90aGVyIGZldGNoIGdyb3VwcyB3aG9zZSBmaWVsZHMgdG8KK2luY2x1ZGUgaW4gdGhpcyBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorQXMgeW91IG1pZ2h0IGV4cGVjdCwgbGlzdGluZyBhCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaEF0dHJpYnV0ZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkZldGNoQXR0cmlidXRlPC9jbGFzc25hbWU+PC91bGluaz4KK3dpdGhpbiBhIDxjbGFzc25hbWU+RmV0Y2hHcm91cDwvY2xhc3NuYW1lPiBpbmNsdWRlcyB0aGUgY29ycmVzcG9uZGluZyBwZXJzaXN0ZW50CitmaWVsZCBvciBwcm9wZXJ0eSBpbiB0aGUgZmV0Y2ggZ3JvdXAuIEVhY2ggPGNsYXNzbmFtZT5GZXRjaEF0dHJpYnV0ZTwvY2xhc3NuYW1lPgoraGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlN0cmluZyBuYW1lPC9saXRlcmFsPjogVGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgdG8KK2luY2x1ZGUgaW4gdGhlIGZldGNoIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+cmVjdXJzaW9uRGVwdGg8L2xpdGVyYWw+OiBJZiB0aGUgYXR0cmlidXRlIHJlcHJlc2VudHMgYSByZWxhdGlvbiwgdGhlCittYXhpbXVtIG51bWJlciBvZiBzYW1lLXR5cGVkIHJlbGF0aW9ucyB0byBlYWdlci1mZXRjaCBmcm9tIHRoaXMgZmllbGQuICBEZWZhdWx0cwordG8gMS4gIEZvciBleGFtcGxlLCBjb25zaWRlciBhbiA8Y2xhc3NuYW1lPkVtcGxveWVlPC9jbGFzc25hbWU+IGNsYXNzIHdpdGggYQorPGxpdGVyYWw+bWFuYWdlcjwvbGl0ZXJhbD4gZmllbGQsIGFsc28gb2YgdHlwZSA8Y2xhc3NuYW1lPkVtcGxveWVlPC9jbGFzc25hbWU+LgorV2hlbiB3ZSBsb2FkIGFuIDxjbGFzc25hbWU+RW1wbG95ZWU8L2NsYXNzbmFtZT4gYW5kIHRoZSA8bGl0ZXJhbD4KK21hbmFnZXI8L2xpdGVyYWw+IGZpZWxkIGlzIGluIGFuIGFjdGl2ZSBmZXRjaCBncm91cCwgdGhlIHJlY3Vyc2lvbiBkZXB0aCAoYWxvbmcKK3dpdGggdGhlIG1heCBmZXRjaCBkZXB0aCBzZXR0aW5nLCBkZXNjcmliZWQgYmVsb3cpIGRldGVybWluZXMgd2hldGhlciB3ZSBvbmx5CityZXRyaWV2ZSB0aGUgdGFyZ2V0IDxjbGFzc25hbWU+RW1wbG95ZWU8L2NsYXNzbmFtZT4gYW5kIGhpcyBtYW5hZ2VyIChkZXB0aCAxKSwKK29yIHdoZXRoZXIgd2UgYWxzbyByZXRyaWV2ZSB0aGUgbWFuYWdlcidzIG1hbmFnZXIgKGRlcHRoIDIpLCBvciB0aGUgbWFuYWdlcidzCittYW5hZ2VyJ3MgbWFuYWdlciAoZGVwdGggMyksIGV0Yy4gIFVzZSAtMSBmb3IgdW5saW1pdGVkIGRlcHRoLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9mZXRjaF9jdXN0b21ncm91cHMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ3VzdG9tIEZldGNoIEdyb3VwIE1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0NyZWF0ZXMgYSA8ZW1waGFzaXM+ZGV0YWlsPC9lbXBoYXNpcz4gZmV0Y2ggZ3JvdXAgY29uc2lzdGluZyBvZiB0aGUKKzxsaXRlcmFsPnB1Ymxpc2hlcjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmFydGljbGVzPC9saXRlcmFsPiByZWxhdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCitARW50aXR5CitARmV0Y2hHcm91cHMoeworICAgIEBGZXRjaEdyb3VwKG5hbWU9ImRldGFpbCIsIGF0dHJpYnV0ZXM9eworICAgICAgICBARmV0Y2hBdHRyaWJ1dGUobmFtZT0icHVibGlzaGVyIiksCisgICAgICAgIEBGZXRjaEF0dHJpYnV0ZShuYW1lPSJhcnRpY2xlcyIpCisgICAgfSksCisgICAgLi4uCit9KQorcHVibGljIGNsYXNzIE1hZ2F6aW5lIHsKKyAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorQSBmaWVsZCBjYW4gYmUgYSBtZW1iZXIgb2YgYW55IG51bWJlciBvZiBmZXRjaCBncm91cHMuICBBIGZpZWxkIGNhbiBhbHNvCitkZWNsYXJlIGEgPGVtcGhhc2lzPmxvYWQgZmV0Y2ggZ3JvdXA8L2VtcGhhc2lzPi4KK1doZW4geW91IGFjY2VzcyBhIGxhenktbG9hZGVkIGZpZWxkIGZvciB0aGUgZmlyc3QgdGltZSwgT3BlbkpQQSBtYWtlcyBhCitkYXRhc3RvcmUgdHJpcCB0byBmZXRjaCB0aGF0IGZpZWxkJ3MgZGF0YS4gIFNvbWV0aW1lcywgaG93ZXZlciwgeW91IGtub3cKK3RoYXQgd2hlbmV2ZXIgeW91IGFjY2VzcyBhIGxhenkgZmllbGQgQSwgeW91J3JlIGxpa2VseSB0byBhY2Nlc3MgbGF6eSBmaWVsZHMgQgorYW5kIEMgYXMgd2VsbC4gIFRoZXJlZm9yZSwgaXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gZmV0Y2ggdGhlIGRhdGEgZm9yIEEsCitCLCBhbmQgQyBpbiB0aGUgc2FtZSBkYXRhc3RvcmUgdHJpcC4gIEJ5IHNldHRpbmcgQSdzIGxvYWQgZmV0Y2ggZ3JvdXAgdG8gdGhlCituYW1lIG9mIGEgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoIj5mZXRjaCBncm91cDwvbGluaz4gY29udGFpbmluZyBCIGFuZAorQywgeW91IGNhbiB0ZWxsIE9wZW5KUEEgdG8gbG9hZCBhbGwgb2YgdGhlc2UgZmllbGRzIHRvZ2V0aGVyIHdoZW4gQSBpcyBmaXJzdAorYWNjZXNzZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1VzZSBPcGVuSlBBJ3MKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL0xvYWRGZXRjaEdyb3VwLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuTG9hZEZldGNoR3JvdXA8L2NsYXNzbmFtZT48L3VsaW5rPgorYW5ub3RhdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2FkIGZldGNoIGdyb3VwIG9mIGFueSBwZXJzaXN0ZW50IGZpZWxkLiBUaGUgdmFsdWUgb2YKK3RoZSBhbm5vdGF0aW9uIGlzIHRoZSBuYW1lIG9mIGEgZGVjbGFyZWQgZmV0Y2ggZ3JvdXAgd2hvc2UgbWVtYmVycyBzaG91bGQgYmUKK2xvYWRlZCBhbG9uZyB3aXRoIHRoZSBhbm5vdGF0ZWQgZmllbGQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2ZldGNoX2xvYWRncm91cCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBMb2FkIEZldGNoIEdyb3VwIE1ldGFkYXRhCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworQEVudGl0eQorQEZldGNoR3JvdXBzKHsKKyAgICBARmV0Y2hHcm91cChuYW1lPSJkZXRhaWwiLCBhdHRyaWJ1dGVzPXsKKyAgICAgICAgQEZldGNoQXR0cmlidXRlKG5hbWU9InB1Ymxpc2hlciIpLAorICAgICAgICBARmV0Y2hBdHRyaWJ1dGUobmFtZT0iYXJ0aWNsZXMiKQorICAgIH0pLAorICAgIC4uLgorfSkKK3B1YmxpYyBjbGFzcyBNYWdhemluZSB7CisKKyAgIEBNYW55VG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlkpCisgICBATG9hZEZldGNoR3JvdXAoImRldGFpbCIpCisgICBwcml2YXRlIFB1Ymxpc2hlciBwdWJsaXNoZXI7CisKKyAgIC4uLgorfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2ZldGNoX2NvbmYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEN1c3RvbSBGZXRjaCBHcm91cCBDb25maWd1cmF0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZmV0Y2hfY29uZiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGZldGNoIGdyb3VwcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBjdXN0b20gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGZldGNoIGdyb3VwcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBGZXRjaEdyb3VwcworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CitZb3UgY2FuIGNvbnRyb2wgdGhlIGRlZmF1bHQgc2V0IG9mIGZldGNoIGdyb3VwcyB3aXRoIHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5GZXRjaEdyb3VwcyI+PGxpdGVyYWw+b3BlbmpwYS5GZXRjaEdyb3VwczwvbGl0ZXJhbD4KKzwvbGluaz4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgorZmV0Y2ggZ3JvdXAgbmFtZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gYWxzbyBzZXQgdGhlIHN5c3RlbSdzIGRlZmF1bHQgbWF4aW11bSBmZXRjaCBkZXB0aCB3aXRoIHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5NYXhGZXRjaERlcHRoIj48bGl0ZXJhbD5vcGVuanBhLk1heEZldGNoRGVwdGg8L2xpdGVyYWw+Cis8L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuICBUaGUgbWF4aW11bSBmZXRjaCBkZXB0aCBkZXRlcm1pbmVzIGhvdyAiZGVlcCIKK2ludG8gdGhlIG9iamVjdCBncmFwaCB0byB0cmF2ZXJzZSB3aGVuIGxvYWRpbmcgYW4gaW5zdGFuY2UuICBGb3IgZXhhbXBsZSwgd2l0aAorYSA8bGl0ZXJhbD5NYXhGZXRjaERlcHRoPC9saXRlcmFsPiBvZiAxLCBPcGVuSlBBIHdpbGwgbG9hZCBhdCBtb3N0IHRoZSB0YXJnZXQgCitpbnN0YW5jZSBhbmQgaXRzIGltbWVkaWF0ZSByZWxhdGlvbnMuICBXaXRoIGEgPGxpdGVyYWw+TWF4RmV0Y2hEZXB0aDwvbGl0ZXJhbD4KK29mIDIsIE9wZW5KUEEgbWF5IGxvYWQgdGhlIHRhcmdldCBpbnN0YW5jZSwgaXRzIGltbWVkaWF0ZSByZWxhdGlvbnMsIGFuZAordGhlIHJlbGF0aW9ucyBvZiB0aG9zZSByZWxhdGlvbnMuICBUaGlzIHdvcmtzIHRvIGFyYml0cmFyeSBkZXB0aC4gIEluIGZhY3QsCit0aGUgZGVmYXVsdCA8bGl0ZXJhbD5NYXhGZXRjaERlcHRoPC9saXRlcmFsPiB2YWx1ZSBpcyAtMSwgd2hpY2ggc3ltYm9saXplcyAKK2luZmluaXRlIGRlcHRoLiAgVW5kZXIgdGhpcyBzZXR0aW5nLCBPcGVuSlBBIHdpbGwgZmV0Y2ggY29uZmlndXJlZCByZWxhdGlvbnMgCit1bnRpbCBpdCByZWFjaGVzIHRoZSBlZGdlcyBvZiB0aGUgb2JqZWN0IGdyYXBoLiAgT2YgY291cnNlLCB3aGljaCByZWxhdGlvbiAKK2ZpZWxkcyBhcmUgbG9hZGVkIGRlcGVuZHMgb24gd2hldGhlciB0aGUgZmllbGRzIGFyZSBlYWdlciBvciBsYXp5LCBhbmQgb24gdGhlIAorYWN0aXZlIGZldGNoIGdyb3Vwcy4gIEEgZmV0Y2ggZ3JvdXAgbWVtYmVyJ3MgcmVjdXJzaW9uIGRlcHRoIG1heSBhbHNvIGxpbWl0IAordGhlIGZldGNoIGRlcHRoIHRvIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSdzIDxjbGFzc25hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gYW5kIDxjbGFzc25hbWU+CitPcGVuSlBBUXVlcnk8L2NsYXNzbmFtZT4gZXh0ZW5zaW9ucyB0byB0aGUgc3RhbmRhcmQgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyCis8L2NsYXNzbmFtZT4gYW5kIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gaW50ZXJmYWNlcyBwcm92aWRlIGFjY2VzcyB0byBhCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9GZXRjaFBsYW4uaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaFBsYW48L2NsYXNzbmFtZT48L3VsaW5rPiBvYmplY3QuCitUaGUgPGNsYXNzbmFtZT5GZXRjaFBsYW48L2NsYXNzbmFtZT4gbWFpbnRhaW5zIHRoZSBzZXQgb2YgYWN0aXZlIGZldGNoIGdyb3VwcyAKK2FuZCB0aGUgbWF4aW11bSBmZXRjaCBkZXB0aC4gSXQgYmVnaW5zIHdpdGggdGhlIGdyb3VwcyBhbmQgZGVwdGggZGVmaW5lZCBpbiB0aGUKKzxsaXRlcmFsPm9wZW5qcGEuRmV0Y2hHcm91cHM8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5vcGVuanBhLk1heEZldGNoRGVwdGgKKzwvbGl0ZXJhbD4gcHJvcGVydGllcywgYnV0IGFsbG93cyB5b3UgdG8gYWRkIG9yIHJlbW92ZSBncm91cHMgYW5kIGNoYW5nZSB0aGUKK21heGltdW0gZmV0Y2ggZGVwdGggZm9yIGFuIGluZGl2aWR1YWwgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+IG9yCis8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IHRocm91Z2ggdGhlIG1ldGhvZHMgYmVsb3cuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgRmV0Y2hQbGFuIGFkZEZldGNoR3JvdXAoU3RyaW5nIGdyb3VwKTsKK3B1YmxpYyBGZXRjaFBsYW4gYWRkRmV0Y2hHcm91cHMoU3RyaW5nLi4uIGdyb3Vwcyk7CitwdWJsaWMgRmV0Y2hQbGFuIGFkZEZldGNoR3JvdXBzKENvbGxlY3Rpb24gZ3JvdXBzKTsKK3B1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmV0Y2hHcm9wKFN0cmluZyBncm91cCk7CitwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZldGNoR3JvdXBzKFN0cmluZy4uLiBncm91cHMpOworcHVibGljIEZldGNoUGxhbiByZW1vdmVGZXRjaEdyb3VwcyhDb2xsZWN0aW9uIGdyb3Vwcyk7CitwdWJsaWMgRmV0Y2hQbGFuIHJlc2V0RmV0Y2hHcm91cHMoKTsKK3B1YmxpYyBDb2xsZWN0aW9uJmx0O1N0cmluZyZndDsgZ2V0RmV0Y2hHcm91cHMoKTsKK3B1YmxpYyB2b2lkIGNsZWFyRmV0Y2hHcm91cHMoKTsKK3B1YmxpYyBGZXRjaFBsYW4gc2V0TWF4RmV0Y2hEZXB0aChpbnQgZGVwdGgpOworcHVibGljIGludCBnZXRNYXhGZXRjaERlcHRoKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+Cis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZSIvPiBkZXRhaWxzIHRoZSA8Y2xhc3NuYW1lPgorT3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4sIDxjbGFzc25hbWU+T3BlbkpQQVF1ZXJ5PC9jbGFzc25hbWU+LCBhbmQKKzxjbGFzc25hbWU+RmV0Y2hQbGFuPC9jbGFzc25hbWU+IGludGVyZmFjZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2ZldGNoX2NvbmZfcXVlcnkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVXNpbmcgdGhlIEZldGNoUGxhbgorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy4uLgorCitPcGVuSlBBUXVlcnkga3EgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbS5jcmVhdGVRdWVyeSguLi4pKTsKK2txLmdldEZldGNoUGxhbigpLnNldE1heEZldGNoRGVwdGgoMykuYWRkRmV0Y2hHcm91cCgiZGV0YWlsIik7CitMaXN0IHJlc3VsdHMgPSBrcS5nZXRSZXN1bHRMaXN0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZmV0Y2hfc2luZ2xlX2ZpZWxkIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBQZXItZmllbGQgRmV0Y2ggQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2ZldGNoX3NpbmdsZV9maWVsZCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGZldGNoIGdyb3VwcworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBzaW5nbGUgZmllbGRzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gYWRkaXRpb24gdG8gY29udHJvbGxpbmcgZmV0Y2ggY29uZmlndXJhdGlvbiBvbiBhIHBlci1mZXRjaC1ncm91cCBiYXNpcywgeW91CitjYW4gY29uZmlndXJlIE9wZW5KUEEgdG8gaW5jbHVkZSBwYXJ0aWN1bGFyIGZpZWxkcyBpbiB0aGUgY3VycmVudCBmZXRjaAorcGxhbi4gVGhpcyBhbGxvd3MgeW91IHRvIGFkZCBpbmRpdmlkdWFsIGZpZWxkcyB0aGF0IGFyZSBub3QgaW4gdGhlCitkZWZhdWx0IGZldGNoIGdyb3VwIG9yIGluIGFueSBvdGhlciBhY3RpdmUgZmV0Y2ggZ3JvdXBzIHRvIHRoZSBzZXQgb2YKK2ZpZWxkcyB0aGF0IHdpbGwgYmUgZWFnZXJseSBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0pQQSA8Y2xhc3NuYW1lPkZldGNoUGxhbjwvY2xhc3NuYW1lPiBtZXRob2RzOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZChTdHJpbmcgZmllbGQpOworcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZHMoU3RyaW5nLi4uIGZpZWxkcyk7CitwdWJsaWMgRmV0Y2hQbGFuIGFkZEZpZWxkcyhDbGFzcyBjbHMsIFN0cmluZy4uLiBmaWVsZHMpOworcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZHMoQ29sbGVjdGlvbiBmaWVsZHMpOworcHVibGljIEZldGNoUGxhbiBhZGRGaWVsZHMoQ2xhc3MgY2xzLCBDb2xsZWN0aW9uIGZpZWxkcyk7CitwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkKFN0cmluZyBmaWVsZCk7CitwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkcyhTdHJpbmcuLi4gZmllbGRzKTsKK3B1YmxpYyBGZXRjaFBsYW4gcmVtb3ZlRmllbGRzKENsYXNzIGNscywgU3RyaW5nLi4uIGZpZWxkcyk7CitwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkcyhDb2xsZWN0aW9uIGZpZWxkcyk7CitwdWJsaWMgRmV0Y2hQbGFuIHJlbW92ZUZpZWxkcyhDbGFzcyBjbHMsIENvbGxlY3Rpb24gZmllbGRzKTsKK3B1YmxpYyBDb2xsZWN0aW9uJmx0O1N0cmluZyZndDsgZ2V0RmllbGRzKCk7CitwdWJsaWMgdm9pZCBjbGVhckZpZWxkcygpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIG1ldGhvZHMgdGhhdCB0YWtlIG9ubHkgc3RyaW5nIGFyZ3VtZW50cyB1c2UgdGhlIGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lLAorc3VjaCBhcyA8bGl0ZXJhbD5vcmcubWFnLk1hZ2F6aW5lLnB1Ymxpc2hlcjwvbGl0ZXJhbD4uIFNpbWlsYXJseSwgPG1ldGhvZG5hbWU+CitnZXRGaWVsZHM8L21ldGhvZG5hbWU+IHJldHVybnMgdGhlIHNldCBvZiBmdWxseS1xdWFsaWZpZWQgZmllbGQgbmFtZXMuIEluIGFsbAorbWV0aG9kcywgdGhlIG5hbWVkIGZpZWxkIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgY2xhc3Mgc3BlY2lmaWVkIGluIHRoZQoraW52b2NhdGlvbiwgbm90IGEgc3VwZXJjbGFzcy4gU28sIGlmIHRoZSBmaWVsZCA8bGl0ZXJhbD5wdWJsaXNoZXI8L2xpdGVyYWw+IGlzCitkZWZpbmVkIGluIGJhc2UgY2xhc3MgPGNsYXNzbmFtZT5QdWJsaWNhdGlvbjwvY2xhc3NuYW1lPiByYXRoZXIgdGhhbiBzdWJjbGFzcworPGNsYXNzbmFtZT5NYWdhemluZTwvY2xhc3NuYW1lPiwgeW91IG11c3QgaW52b2tlIDxsaXRlcmFsPmFkZEZpZWxkCisoUHVibGljYXRpb24uY2xhc3MsICJwdWJsaXNoZXIiKTwvbGl0ZXJhbD4gYW5kIG5vdCA8bGl0ZXJhbD5hZGRGaWVsZAorKE1hZ2F6aW5lLmNsYXNzLCAicHVibGlzaGVyIik8L2xpdGVyYWw+LiBUaGlzIGlzIHN0cmljdGVyIHRoYW4gSmF2YSdzIGRlZmF1bHQKK2ZpZWxkLW1hc2tpbmcgYWxnb3JpdGhtcywgd2hpY2ggd291bGQgYWxsb3cgdGhlIGxhdHRlciBtZXRob2QgYmVoYXZpb3IgaWYKKzxsaXRlcmFsPk1hZ2F6aW5lPC9saXRlcmFsPiBkaWQgbm90IGFsc28gZGVmaW5lIGEgZmllbGQgY2FsbGVkIDxsaXRlcmFsPgorcHVibGlzaGVyPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gb3JkZXIgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgcmVmbGVjdGlvbiwgT3BlbkpQQSBkb2VzIG5vdCBwZXJmb3JtIGFueQordmFsaWRhdGlvbiBvZiB0aGUgZmllbGQgbmFtZSAvIGNsYXNzIG5hbWUgcGFpcnMgdGhhdCB5b3UgcHV0IGludG8gdGhlIGZldGNoCitjb25maWd1cmF0aW9uLiBJZiB5b3Ugc3BlY2lmeSBub24tZXhpc3RlbnQgY2xhc3MgLyBmaWVsZCBwYWlycywgbm90aGluZyBhZHZlcnNlCit3aWxsIGhhcHBlbiwgYnV0IHlvdSB3aWxsIHJlY2VpdmUgbm8gbm90aWZpY2F0aW9uIG9mIHRoZSBmYWN0IHRoYXQgdGhlIHNwZWNpZmllZAorY29uZmlndXJhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfZmV0Y2gtY29uZl9wZXJfZmllbGQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQWRkaW5nIGFuIEVhZ2VyIEZpZWxkCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK09wZW5KUEFFbnRpdHlNYW5hZ2VyIGtlbSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKTsKK2tlbS5nZXRGZXRjaFBsYW4oKS5hZGRGaWVsZChNYWdhemluZS5jbGFzcywgInB1Ymxpc2hlciIpOworTWFnYXppbmUgbWFnID0gZW0uZmluZChNYWdhemluZS5jbGFzcywgbWFnSWQpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2ZldGNoX2ltcGwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uIE5vdGVzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRXZlbiB3aGVuIGEgZGlyZWN0IHJlbGF0aW9uIGlzIG5vdCBlYWdlcmx5IGZldGNoZWQsIE9wZW5KUEEgc2VsZWN0cyB0aGUgZm9yZWlnbgora2V5IGNvbHVtbnMgYW5kIGNhY2hlcyB0aGUgdmFsdWVzLiBUaGlzIHdheSB3aGVuIHlvdSBkbyB0cmF2ZXJzZSB0aGUgcmVsYXRpb24sCitPcGVuSlBBIGNhbiBvZnRlbiBmaW5kIHRoZSByZWxhdGVkIG9iamVjdCBpbiBpdHMgY2FjaGUsIG9yIGF0IGxlYXN0IGF2b2lkIGpvaW5zCit3aGVuIGxvYWRpbmcgdGhlIHJlbGF0ZWQgb2JqZWN0IGZyb20gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIGFib3ZlIGltcGxpY2l0IGZvcmVpZ24ga2V5LXNlbGVjdGluZyBiZWhhdmlvciBkb2VzIG5vdCBhbHdheXMgYXBwbHkgd2hlbiB0aGUKK3JlbGF0aW9uIGlzIGluIGEgc3ViY2xhc3MgdGFibGUuIElmIHRoZSBzdWJjbGFzcyB0YWJsZSB3b3VsZCBub3Qgb3RoZXJ3aXNlIGJlCitqb2luZWQgaW50byB0aGUgc2VsZWN0LCBPcGVuSlBBIGF2b2lkcyB0aGUgZXh0cmEgam9pbiBqdXN0IHRvIHNlbGVjdCB0aGUgZm9yZWlnbgora2V5IHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BlcmZwYWNrX2VhZ2VyIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRWFnZXIgRmV0Y2hpbmcKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXIiPgorICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IGZpZWxkcworICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlZT4KKyAgICAgICAgICAgICAgICBlYWdlciBmZXRjaGluZworICAgICAgICAgICAgPC9zZWU+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9wZXJmcGFja19lYWdlciI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBmZXRjaCBncm91cHMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPHNlZWFsc28+CisgICAgICAgICAgICAgICAgZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBsYXp5IGxvYWRpbmcKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICA8L3NlZWFsc28+CisgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICBmZXRjaCBncm91cHMKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorRWFnZXIgZmV0Y2hpbmcgaXMgdGhlIGFiaWxpdHkgdG8gZWZmaWNpZW50bHkgbG9hZCBzdWJjbGFzcyBkYXRhIGFuZCByZWxhdGVkCitvYmplY3RzIGFsb25nIHdpdGggdGhlIGJhc2UgaW5zdGFuY2VzIGJlaW5nIHF1ZXJpZWQuIFR5cGljYWxseSwgT3BlbkpQQSBoYXMgdG8KK21ha2UgYSB0cmlwIHRvIHRoZSBkYXRhYmFzZSB3aGVuZXZlciBhIHJlbGF0aW9uIGlzIGxvYWRlZCwgb3Igd2hlbiB5b3UgZmlyc3QKK2FjY2VzcyBkYXRhIHRoYXQgaXMgbWFwcGVkIHRvIGEgdGFibGUgb3RoZXIgdGhhbiB0aGUgbGVhc3QtZGVyaXZlZCBzdXBlcmNsYXNzCit0YWJsZS4gSWYgeW91IHBlcmZvcm0gYSBxdWVyeSB0aGF0IHJldHVybnMgMTAwIDxjbGFzc25hbWU+UGVyc29uPC9jbGFzc25hbWU+CitvYmplY3RzLCBhbmQgdGhlbiB5b3UgaGF2ZSB0byByZXRyaWV2ZSB0aGUgPGNsYXNzbmFtZT5BZGRyZXNzPC9jbGFzc25hbWU+IGZvcgorZWFjaCBwZXJzb24sIE9wZW5KUEEgbWF5IG1ha2UgYXMgbWFueSBhcyAxMDEgcXVlcmllcyAodGhlIGluaXRpYWwgcXVlcnksIHBsdXMKK29uZSBmb3IgdGhlIGFkZHJlc3Mgb2YgZWFjaCBwZXJzb24gcmV0dXJuZWQpLiBPciBpZiBzb21lIG9mIHRoZSA8Y2xhc3NuYW1lPgorUGVyc29uPC9jbGFzc25hbWU+IGluc3RhbmNlcyB0dXJuIG91dCB0byBiZSA8Y2xhc3NuYW1lPkVtcGxveWVlPC9jbGFzc25hbWU+cywKK3doZXJlIDxjbGFzc25hbWU+RW1wbG95ZWU8L2NsYXNzbmFtZT4gaGFzIGFkZGl0aW9uYWwgZGF0YSBpbiBpdHMgb3duIGpvaW5lZAordGFibGUsIE9wZW5KUEEgb25jZSBhZ2FpbiBtaWdodCBuZWVkIHRvIG1ha2UgZXh0cmEgZGF0YWJhc2UgdHJpcHMgdG8gYWNjZXNzIHRoZQorYWRkaXRpb25hbCBlbXBsb3llZSBkYXRhLiBXaXRoIGVhZ2VyIGZldGNoaW5nLCBPcGVuSlBBIGNhbiByZWR1Y2UgdGhlc2UgY2FzZXMgdG8KK2Egc2luZ2xlIHF1ZXJ5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorRWFnZXIgZmV0Y2hpbmcgb25seSBhZmZlY3RzIHJlbGF0aW9ucyBpbiB0aGUgYWN0aXZlIGZldGNoIGdyb3VwcywgYW5kIGlzIGxpbWl0ZWQKK2J5IHRoZSBkZWNsYXJlZCBtYXhpbXVtIGZldGNoIGRlcHRoIGFuZCBmaWVsZCByZWN1cnNpb24gZGVwdGggKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2ZldGNoIi8+KS4gSW4gb3RoZXIgd29yZHMsIHJlbGF0aW9ucyB0aGF0IHdvdWxkCitub3Qgbm9ybWFsbHkgYmUgbG9hZGVkIGltbWVkaWF0ZWx5IHdoZW4gcmV0cmlldmluZyBhbiBvYmplY3Qgb3IgYWNjZXNzaW5nIGEKK2ZpZWxkIGFyZSBub3QgYWZmZWN0ZWQgYnkgZWFnZXIgZmV0Y2hpbmcuIEluIG91ciBleGFtcGxlIGFib3ZlLCB0aGUgYWRkcmVzcyBvZgorZWFjaCBwZXJzb24gd291bGQgb25seSBiZSBlYWdlcmx5IGZldGNoZWQgaWYgdGhlIHF1ZXJ5IHdlcmUgY29uZmlndXJlZCB0bworaW5jbHVkZSB0aGUgYWRkcmVzcyBmaWVsZCBvciBpdHMgZmV0Y2ggZ3JvdXAsIG9yIGlmIHRoZSBhZGRyZXNzIHdlcmUgaW4gdGhlCitkZWZhdWx0IGZldGNoIGdyb3VwLiBUaGlzIGFsbG93cyB5b3UgdG8gY29udHJvbCBleGFjdGx5IHdoaWNoIGZpZWxkcyBhcmUgZWFnZXJseQorZmV0Y2hlZCBpbiBkaWZmZXJlbnQgc2l0dWF0aW9ucy4gU2ltaWxhcmx5LCBxdWVyaWVzIHRoYXQgZXhjbHVkZSBzdWJjbGFzc2VzCithcmVuJ3QgYWZmZWN0ZWQgYnkgZWFnZXIgc3ViY2xhc3MgZmV0Y2hpbmcsIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0VhZ2VyIGZldGNoaW5nIGhhcyB0aHJlZSBtb2RlczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD46IE5vIGVhZ2VyIGZldGNoaW5nIGlzIHBlcmZvcm1lZC4gUmVsYXRlZCBvYmplY3RzIGFyZQorYWx3YXlzIGxvYWRlZCBpbiBhbiBpbmRlcGVuZGVudCBzZWxlY3Qgc3RhdGVtZW50LiBObyBqb2luZWQgc3ViY2xhc3MgZGF0YSBpcworbG9hZGVkIHVubGVzcyBpdCBpcyBpbiB0aGUgdGFibGUocykgZm9yIHRoZSBiYXNlIHR5cGUgYmVpbmcgcXVlcmllZC4gVW5qb2luZWQKK3N1YmNsYXNzIGRhdGEgaXMgbG9hZGVkIHVzaW5nIHNlcGFyYXRlIHNlbGVjdCBzdGF0ZW1lbnRzIHJhdGhlciB0aGFuIGEgU1FMIFVOSU9OCitvcGVyYXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gbW9kZQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPmpvaW48L2xpdGVyYWw+OiBJbiB0aGlzIG1vZGUsIE9wZW5KUEEgam9pbnMgdG8gdG8tb25lIHJlbGF0aW9ucyBpbiB0aGUKK2NvbmZpZ3VyZWQgZmV0Y2ggZ3JvdXBzLiBJZiBPcGVuSlBBIGlzIGxvYWRpbmcgZGF0YSBmb3IgYSBzaW5nbGUgaW5zdGFuY2UsIHRoZW4KK09wZW5KUEEgd2lsbCBhbHNvIGpvaW4gdG8gYW55IGNvbGxlY3Rpb24gZmllbGQgaW4gdGhlIGNvbmZpZ3VyZWQgZmV0Y2ggZ3JvdXBzLgorV2hlbiBsb2FkaW5nIGRhdGEgZm9yIG11bHRpcGxlIGluc3RhbmNlcywgdGhvdWdoLCAoc3VjaCBhcyB3aGVuIGV4ZWN1dGluZyBhCis8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+KSBPcGVuSlBBIHdpbGwgbm90IGpvaW4gdG8gY29sbGVjdGlvbnMgYnkgZGVmYXVsdC4KK0luc3RlYWQsIE9wZW5KUEEgZGVmYXVsdHMgdG8gPGxpdGVyYWw+cGFyYWxsZWw8L2xpdGVyYWw+IG1vZGUgZm9yIGNvbGxlY3Rpb25zLAorYXMgZGVzY3JpYmVkIGJlbG93LiBZb3UgY2FuIGZvcmNlIE9wZW5KUEEgdXNlIGEgam9pbiByYXRoZXIgdGhhbiBwYXJhbGxlbCBtb2RlCitmb3IgYSBjb2xsZWN0aW9uIGZpZWxkIHVzaW5nIHRoZSBtZXRhZGF0YSBleHRlbnNpb24gZGVzY3JpYmVkIGluCis8eHJlZiBsaW5rZW5kPSJlYWdlci1mZXRjaC1tb2RlIi8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyIGpvaW5zCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KK1VuZGVyIDxsaXRlcmFsPmpvaW48L2xpdGVyYWw+IG1vZGUsIE9wZW5KUEEgdXNlcyBhIGxlZnQgb3V0ZXIgam9pbiAob3IgaW5uZXIKK2pvaW4sIGlmIHRoZSByZWxhdGlvbnMnIGZpZWxkIG1ldGFkYXRhIGRlY2xhcmVzIHRoZSByZWxhdGlvbiBub24tbnVsbGFibGUpIHRvCitzZWxlY3QgdGhlIHJlbGF0ZWQgZGF0YSBhbG9uZyB3aXRoIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IG9iamVjdHMuIFRoaXMgcHJvY2Vzcword29ya3MgcmVjdXJzaXZlbHkgZm9yIHRvLW9uZSBqb2lucywgc28gdGhhdCBpZiA8Y2xhc3NuYW1lPlBlcnNvbjwvY2xhc3NuYW1lPiBoYXMKK2FuIDxjbGFzc25hbWU+QWRkcmVzczwvY2xhc3NuYW1lPiwgYW5kIDxjbGFzc25hbWU+QWRkcmVzczwvY2xhc3NuYW1lPiBoYXMgYQorPGNsYXNzbmFtZT5UZWxlcGhvbmVOdW1iZXI8L2NsYXNzbmFtZT4sIGFuZCB0aGUgZmV0Y2ggZ3JvdXBzIGFyZSBjb25maWd1cmVkCitjb3JyZWN0bHksIE9wZW5KUEEgbWlnaHQgaXNzdWUgYSBzaW5nbGUgc2VsZWN0IHRoYXQgam9pbnMgYWNyb3NzIHRoZSB0YWJsZXMgZm9yCithbGwgdGhyZWUgY2xhc3Nlcy4gVG8tbWFueSBqb2lucyBjYW4gbm90IHJlY3Vyc2l2ZWx5IHNwYXduIG90aGVyIHRvLW1hbnkgam9pbnMsCitidXQgdGhleSBjYW4gc3Bhd24gcmVjdXJzaXZlIHRvLW9uZSBqb2lucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitVbmRlciB0aGUgPGxpdGVyYWw+am9pbjwvbGl0ZXJhbD4gc3ViY2xhc3MgZmV0Y2ggbW9kZSwgc3ViY2xhc3MgZGF0YSBpbiBqb2luZWQKK3RhYmxlcyBpcyBzZWxlY3RlZCBieSBvdXRlciBqb2luaW5nIHRvIGFsbCBwb3NzaWJsZSBzdWJjbGFzcyB0YWJsZXMgb2YgdGhlIHR5cGUKK2JlaW5nIHF1ZXJpZWQuIEFzIHlvdSdsbCBzZWUgYmVsb3csIHN1YmNsYXNzIGRhdGEgZmV0Y2hpbmcgaXMgY29uZmlndXJlZCAKK3NlcGFyYXRlbHkgZnJvbSByZWxhdGlvbiBmZXRjaGluZywgYW5kIGNhbiBiZSBkaXNhYmxlZCBmb3Igc3BlY2lmaWMgY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorU29tZSBkYXRhYmFzZXMgbWF5IG5vdCBzdXBwb3J0IG91dGVyIGpvaW5zLiBBbHNvLCBPcGVuSlBBIGNhbiBub3QgdXNlCitvdXRlciBqb2lucyBpZiB5b3UgaGF2ZSBzZXQgdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkiPgorPGxpdGVyYWw+IERCRGljdGlvbmFyeTwvbGl0ZXJhbD48L2xpbms+J3MgPGxpdGVyYWw+Sm9pblN5bnRheDwvbGl0ZXJhbD4gdG8KKzxsaXRlcmFsPnRyYWRpdGlvbmFsPC9saXRlcmFsPi4gU2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX3NxbDkyIi8+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5wYXJhbGxlbDwvbGl0ZXJhbD46IFVuZGVyIHRoaXMgbW9kZSwgT3BlbkpQQSBzZWxlY3RzIHRvLW9uZSByZWxhdGlvbnMKK2FuZCBqb2luZWQgY29sbGVjdGlvbnMgYXMgb3V0bGluZWQgaW4gdGhlIDxsaXRlcmFsPmpvaW48L2xpdGVyYWw+IG1vZGUKK2Rlc2NyaXB0aW9uIGFib3ZlLiBVbmpvaW5lZCBjb2xsZWN0aW9uIGZpZWxkcywgaG93ZXZlciwgYXJlIGVhZ2VybHkgZmV0Y2hlZAordXNpbmcgYSBzZXBhcmF0ZSBzZWxlY3Qgc3RhdGVtZW50IGZvciBlYWNoIGNvbGxlY3Rpb24sIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGgKK3RoZSBzZWxlY3Qgc3RhdGVtZW50IGZvciB0aGUgdGFyZ2V0IG9iamVjdHMuIFRoZSBwYXJhbGxlbCBzZWxlY3RzIHVzZSB0aGUKKzxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBjb25kaXRpb25zIGZyb20gdGhlIHByaW1hcnkgc2VsZWN0LCBidXQgYWRkIHRoZWlyIG93bgoram9pbnMgdG8gcmVhY2ggdGhlIHJlbGF0ZWQgZGF0YS4gVGh1cywgaWYgeW91IHBlcmZvcm0gYSBxdWVyeSB0aGF0IHJldHVybnMgMTAwCis8Y2xhc3NuYW1lPkNvbXBhbnk8L2NsYXNzbmFtZT4gb2JqZWN0cywgd2hlcmUgZWFjaCBjb21wYW55IGhhcyBhIGxpc3Qgb2YKKzxjbGFzc25hbWU+RW1wbG95ZWU8L2NsYXNzbmFtZT4gb2JqZWN0cyBhbmQgPGNsYXNzbmFtZT5EZXBhcnRtZW50PC9jbGFzc25hbWU+CitvYmplY3RzLCBPcGVuSlBBIHdpbGwgbWFrZSAzIHF1ZXJpZXMuIFRoZSBmaXJzdCB3aWxsIHNlbGVjdCB0aGUgY29tcGFueSBvYmplY3RzLAordGhlIHNlY29uZCB3aWxsIHNlbGVjdCB0aGUgZW1wbG95ZWVzIGZvciB0aG9zZSBjb21wYW5pZXMsIGFuZCB0aGUgdGhpcmQgd2lsbAorc2VsZWN0IHRoZSBkZXBhcnRtZW50cyBmb3IgdGhlIHNhbWUgY29tcGFuaWVzLiBKdXN0IGFzIGZvciBqb2lucywgdGhpcyBwcm9jZXNzCitjYW4gYmUgcmVjdXJzaXZlbHkgYXBwbGllZCB0byB0aGUgb2JqZWN0cyBpbiB0aGUgcmVsYXRpb25zIGJlaW5nIGVhZ2VybHkKK2ZldGNoZWQuIENvbnRpbnVpbmcgb3VyIGV4YW1wbGUsIGlmIHRoZSA8Y2xhc3NuYW1lPkVtcGxveWVlPC9jbGFzc25hbWU+IGNsYXNzCitoYWQgYSBsaXN0IG9mIDxjbGFzc25hbWU+UHJvamVjdHM8L2NsYXNzbmFtZT4gaW4gb25lIG9mIHRoZSBmZXRjaCBncm91cHMgYmVpbmcKK2xvYWRlZCwgT3BlbkpQQSB3b3VsZCBleGVjdXRlIGEgc2luZ2xlIGFkZGl0aW9uYWwgc2VsZWN0IGluIHBhcmFsbGVsIHRvIGxvYWQgdGhlCitwcm9qZWN0cyBvZiBhbGwgZW1wbG95ZWVzIG9mIHRoZSBtYXRjaGluZyBjb21wYW5pZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVXNpbmcgYW4gYWRkaXRpb25hbCBzZWxlY3QgdG8gbG9hZCBlYWNoIGNvbGxlY3Rpb24gYXZvaWRzIHRyYW5zZmVycmluZyBtb3JlIGRhdGEKK3RoYW4gbmVjZXNzYXJ5IGZyb20gdGhlIGRhdGFiYXNlIHRvIHRoZSBhcHBsaWNhdGlvbi4gSWYgZWFnZXIgam9pbnMgd2VyZSB1c2VkCitpbnN0ZWFkIG9mIHBhcmFsbGVsIHNlbGVjdCBzdGF0ZW1lbnRzLCBlYWNoIGNvbGxlY3Rpb24gYWRkZWQgdG8gdGhlIGNvbmZpZ3VyZWQKK2ZldGNoIGdyb3VwcyB3b3VsZCBjYXVzZSB0aGUgYW1vdW50IG9mIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgdG8gcmlzZQorZGFuZ2Vyb3VzbHksIHRvIHRoZSBwb2ludCB0aGF0IHlvdSBjb3VsZCBlYXNpbHkgb3ZlcndoZWxtIHRoZSBuZXR3b3JrLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1BvbHltb3JwaGljIHRvLW9uZSByZWxhdGlvbnMgdG8gdGFibGUtcGVyLWNsYXNzIG1hcHBpbmdzIHVzZSBwYXJhbGxlbCBlYWdlcgorZmV0Y2hpbmcgYmVjYXVzZSBwcm9wZXIgam9pbnMgYXJlIGltcG9zc2libGUuIFlvdSBjYW4gZm9yY2Ugb3RoZXIgdG8tb25lCityZWxhdGlvbnMgdG8gdXNlIHBhcmFsbGVsIHJhdGhlciB0aGFuIGpvaW4gbW9kZSBlYWdlciBmZXRjaGluZyB1c2luZyB0aGUKK21ldGFkYXRhIGV4dGVuc2lvbiBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0iZWFnZXItZmV0Y2gtbW9kZSIvPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CitQYXJhbGxlbCBzdWJjbGFzcyBmZXRjaCBtb2RlIG9ubHkgYXBwbGllcyB0byBxdWVyaWVzIG9uIGpvaW5lZCBpbmhlcml0YW5jZQoraGllcmFyY2hpZXMuIFJhdGhlciB0aGFuIG91dGVyLWpvaW5pbmcgdG8KK3N1YmNsYXNzIHRhYmxlcywgT3BlbkpQQSB3aWxsIGlzc3VlIHRoZSBxdWVyeSBzZXBhcmF0ZWx5IGZvciBlYWNoIHN1YmNsYXNzLiBJbgorYWxsIG90aGVyIHNpdHVhdGlvbnMsIHBhcmFsbGVsIHN1YmNsYXNzIGZldGNoIG1vZGUgYWN0cyBqdXN0IGxpa2Ugam9pbiBtb2RlIGluCityZWdhcmRzIHRvIHZlcnRpY2FsbHktbWFwcGVkIHN1YmNsYXNzZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiBPcGVuSlBBIGtub3dzIHRoYXQgaXQgaXMgc2VsZWN0aW5nIGZvciBhIHNpbmdsZSBvYmplY3Qgb25seSwgaXQgbmV2ZXIgdXNlcworPGxpdGVyYWw+cGFyYWxsZWw8L2xpdGVyYWw+IG1vZGUsIGJlY2F1c2UgdGhlIGFkZGl0aW9uYWwgc2VsZWN0cyBjYW4gYmUgbWFkZQorbGF6aWx5IGp1c3QgYXMgZWZmaWNpZW50bHkuIFRoaXMgbW9kZSBvbmx5IGluY3JlYXNlcyBlZmZpY2llbmN5IG92ZXIgPGxpdGVyYWw+Citqb2luPC9saXRlcmFsPiBtb2RlIHdoZW4gbXVsdGlwbGUgb2JqZWN0cyB3aXRoIGVhZ2VyIHJlbGF0aW9ucyBhcmUgYmVpbmcgbG9hZGVkLAorb3Igd2hlbiBtdWx0aXBsZSBzZWxlY3RzIG1pZ2h0IGJlIGZhc3RlciB0aGFuIGpvaW5pbmcgdG8gYWxsIHBvc3NpYmxlCitzdWJjbGFzc2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3BlcmZwYWNrX2VhZ2VyX2NvbmYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIEVhZ2VyIEZldGNoaW5nCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXJfY29uZiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFYWdlckZldGNoTW9kZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgU3ViY2xhc3NGZXRjaE1vZGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIEVhZ2VyRmV0Y2hNb2RlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIFN1YmNsYXNzRmV0Y2hNb2RlCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK1lvdSBjYW4gY29udHJvbCBPcGVuSlBBJ3MgZGVmYXVsdCBlYWdlciBmZXRjaCBtb2RlIHRocm91Z2ggdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuRWFnZXJGZXRjaE1vZGUiPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLkVhZ2VyRmV0Y2hNb2RlPC9saXRlcmFsPjwvbGluaz4gYW5kCis8bGluayBsaW5rZW5kPSJvcGVuanBhLmpkYmMuU3ViY2xhc3NGZXRjaE1vZGUiPjxsaXRlcmFsPgorb3BlbmpwYS5qZGJjLlN1YmNsYXNzRmV0Y2hNb2RlPC9saXRlcmFsPjwvbGluaz4gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiBTZXQKK2VhY2ggb2YgdGhlc2UgcHJvcGVydGllcyB0byBvbmUgb2YgdGhlIG1vZGUgbmFtZXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cworc2VjdGlvbjogPGxpdGVyYWw+bm9uZSwgam9pbiwgcGFyYWxsZWw8L2xpdGVyYWw+LiBJZiBsZWZ0IHVuc2V0LCB0aGUgZWFnZXIKK2ZldGNoIG1vZGUgZGVmYXVsdHMgdG8gPGxpdGVyYWw+cGFyYWxsZWw8L2xpdGVyYWw+IGFuZCB0aGUgc3ViY2xhc3MgZmV0Y2ggbW9kZQorZGVmYXVsdHMgdG8gPGxpdGVyYWw+am9pbjwvbGl0ZXJhbD4gVGhlc2UgYXJlIGdlbmVyYWxseSB0aGUgbW9zdCByb2J1c3QgYW5kCitwZXJmb3JtYW50IHN0cmF0ZWdpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gZWFzaWx5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZldGNoIG1vZGVzIGF0IHJ1bnRpbWUgZm9yIGFueSBsb29rdXAgb3IKK3F1ZXJ5IHRocm91Z2ggT3BlbkpQQSdzIGZldGNoIGNvbmZpZ3VyYXRpb24gQVBJcy4gU2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZSIvPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfcGVyZnBhY2tfZWFnZXJfZGVmIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIERlZmF1bHQgRWFnZXIgRmV0Y2ggTW9kZQorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5qZGJjLkVhZ2VyRmV0Y2hNb2RlIiB2YWx1ZT0icGFyYWxsZWwiLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLmpkYmMuU3ViY2xhc3NGZXRjaE1vZGUiIHZhbHVlPSJqb2luIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9wZXJmcGFja19lYWdlcl9ydW50aW1lIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIEVhZ2VyIEZldGNoIE1vZGUgYXQgUnVudGltZQorICAgICAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLmpkYmMuKjsKKworLi4uCisKK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IHAgZnJvbSBQZXJzb24gcCB3aGVyZSBwLmFkZHJlc3Muc3RhdGUgPSAnVFgnIik7CitPcGVuSlBBUXVlcnkga3EgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChxKTsKK0pEQkNGZXRjaFBsYW4gZmV0Y2ggPSAoSkRCQ0ZldGNoUGxhbikga3EuZ2V0RmV0Y2hQbGFuKCk7CitmZXRjaC5zZXRFYWdlckZldGNoTW9kZShKREJDRmV0Y2hQbGFuLkVBR0VSX1BBUkFMTEVMKTsKK2ZldGNoLnNldFN1YmNsYXNzRmV0Y2hNb2RlKEpEQkNGZXRjaFBsYW4uRUFHRVJfSk9JTik7CitMaXN0IHJlc3VsdHMgPSBxLmdldFJlc3VsdExpc3QoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK1lvdSBjYW4gc3BlY2lmeSBhIGRlZmF1bHQgc3ViY2xhc3MgZmV0Y2ggbW9kZSBmb3IgYW4gaW5kaXZpZHVhbCBjbGFzcyB3aXRoIHRoZQorbWV0YWRhdGEgZXh0ZW5zaW9uIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJzdWJjbGFzcy1mZXRjaC1tb2RlIi8+LgorTm90ZSwgaG93ZXZlciwgdGhhdCB5b3UgY2Fubm90ICJ1cGdyYWRlIiB0aGUgcnVudGltZSBmZXRjaCBtb2RlIHdpdGggeW91ciBjbGFzcworc2V0dGluZy4gSWYgdGhlIHJ1bnRpbWUgZmV0Y2ggbW9kZSBpcyA8bGl0ZXJhbD5ub25lPC9saXRlcmFsPiwgbm8gZWFnZXIKK3N1YmNsYXNzIGRhdGEgZmV0Y2hpbmcgd2lsbCB0YWtlIHBsYWNlLCByZWdhcmRsZXNzIG9mIHlvdXIgbWV0YWRhdGEgc2V0dGluZy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhpcyBhcHBsaWVzIHRvIHRoZSBlYWdlciBmZXRjaCBtb2RlIG1ldGFkYXRhIGV4dGVuc2lvbiBhcyB3ZWxsIChzZWUKKzx4cmVmIGxpbmtlbmQ9ImVhZ2VyLWZldGNoLW1vZGUiLz4pLiBZb3UgY2FuIHVzZSB0aGlzIGV4dGVuc2lvbiB0bworZGlzYWJsZSBlYWdlciBmZXRjaGluZyBvbiBhIGZpZWxkIG9yIHRvIGRlY2xhcmUgdGhhdCBhIGNvbGxlY3Rpb24gd291bGQgcmF0aGVyCit1c2Ugam9pbnMgdGhhbiBwYXJhbGxlbCBzZWxlY3RzIG9yIHZpY2UgdmVyc2EuIEJ1dCBhbiBleHRlbnNpb24gdmFsdWUgb2YKKzxsaXRlcmFsPmpvaW48L2xpdGVyYWw+IHdvbid0IGNhdXNlIGFueSBlYWdlciBqb2luaW5nIGlmIHRoZSBmZXRjaAorY29uZmlndXJhdGlvbidzIHNldHRpbmcgaXMgPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9wZXJmcGFja19lYWdlcl9jb25zaWRlciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRWFnZXIgRmV0Y2hpbmcgQ29uc2lkZXJhdGlvbnMgYW5kIExpbWl0YXRpb25zCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CitUaGVyZSBhcmUgc2V2ZXJhbCBpbXBvcnRhbnQgcG9pbnRzIHRoYXQgeW91IHNob3VsZCBjb25zaWRlciB3aGVuIHVzaW5nIGVhZ2VyCitmZXRjaGluZzoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggbGFyZ2UgcmVzdWx0IHNldHMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIHJlc3VsdCBzZXRzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uIHdpdGggZWFnZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KK1doZW4geW91IGFyZSB1c2luZyA8bGl0ZXJhbD5wYXJhbGxlbDwvbGl0ZXJhbD4gZWFnZXIgZmV0Y2ggbW9kZSBhbmQgeW91IGhhdmUKK2xhcmdlIHJlc3VsdCBzZXRzIGVuYWJsZWQgKHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZGJzZXR1cF9scnMiLz4pCitvciB5b3UgcGxhY2UgYSByYW5nZSBvbiBhIHF1ZXJ5LCBPcGVuSlBBIHBlcmZvcm1zIHRoZSBuZWVkZWQgcGFyYWxsZWwgc2VsZWN0cyBvbgorb25lIHBhZ2Ugb2YgcmVzdWx0cyBhdCBhIHRpbWUuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdXIgPGxpdGVyYWw+CitGZXRjaEJhdGNoU2l6ZTwvbGl0ZXJhbD4gaXMgc2V0IHRvIDIwLCBhbmQgeW91IHBlcmZvcm0gYSBsYXJnZSByZXN1bHQgc2V0IHF1ZXJ5CitvbiBhIGNsYXNzIHRoYXQgaGFzIGNvbGxlY3Rpb24gZmllbGRzIGluIHRoZSBjb25maWd1cmVkIGZldGNoIGdyb3Vwcy4gT3BlbkpQQQord2lsbCBpbW1lZGlhdGVseSBjYWNoZSB0aGUgZmlyc3QgPGxpdGVyYWw+MjA8L2xpdGVyYWw+IHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Cit1c2luZyA8bGl0ZXJhbD5qb2luPC9saXRlcmFsPiBtb2RlIGVhZ2VyIGZldGNoaW5nIG9ubHkuIFRoZW4sIGl0IHdpbGwgaXNzdWUgdGhlCitleHRyYSBzZWxlY3RzIG5lZWRlZCB0byBlYWdlciBmZXRjaCB5b3VyIGNvbGxlY3Rpb24gZmllbGRzIGFjY29yZGluZyB0bworPGxpdGVyYWw+cGFyYWxsZWw8L2xpdGVyYWw+IG1vZGUuIEVhY2ggc2VsZWN0IHdpbGwgdXNlIGEgU1FMIDxsaXRlcmFsPklOCis8L2xpdGVyYWw+IGNsYXVzZSAob3IgbXVsdGlwbGUgPGxpdGVyYWw+T1I8L2xpdGVyYWw+IGNsYXVzZXMgaWYgeW91ciBjbGFzcyBoYXMgYQorY29tcG91bmQgcHJpbWFyeSBrZXkpIHRvIGxpbWl0IHRoZSBzZWxlY3RlZCBjb2xsZWN0aW9uIGVsZW1lbnRzIHRvIHRob3NlIG93bmVkCitieSB0aGUgMjAgY2FjaGVkIHJlc3VsdHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPbmNlIHlvdSBpdGVyYXRlIHBhc3QgdGhlIGZpcnN0IDIwIHJlc3VsdHMsIE9wZW5KUEEgd2lsbCBjYWNoZSB0aGUgbmV4dCAyMCBhbmQKK2FnYWluIGlzc3VlIGFueSBuZWVkZWQgZXh0cmEgc2VsZWN0cyBmb3IgY29sbGVjdGlvbiBmaWVsZHMsIGFuZCBzbyBvbi4gVGhpcworcGF0dGVybiBlbnN1cmVzIHRoYXQgeW91IGdldCB0aGUgYmVuZWZpdHMgb2YgZWFnZXIgZmV0Y2hpbmcgd2l0aG91dCBicmluZ2luZworbW9yZSBkYXRhIGludG8gbWVtb3J5IHRoYW4gYW50aWNpcGF0ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPbmNlIE9wZW5KUEEgZWFnZXItam9pbnMgaW50byBhIGNsYXNzLCBpdCBjYW5ub3QgaXNzdWUgYW55IGZ1cnRoZXIgZWFnZXIgdG8tbWFueQoram9pbnMgb3IgcGFyYWxsZWwgc2VsZWN0cyBmcm9tIHRoYXQgY2xhc3MgaW4gdGhlIHNhbWUgcXVlcnkuIFRvLW9uZSBqb2lucywKK2hvd2V2ZXIsIGNhbiByZWN1cnNlIHRvIGFueSBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1VzaW5nIGEgdG8tbWFueSBqb2luIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzCit0aGUgcmVzdWx0IHNldCBjb250YWlucyB3aXRob3V0IHRyYXZlcnNpbmcgdGhlIGVudGlyZSBzZXQuIFRoaXMgaXMgYmVjYXVzZSBlYWNoCityZXN1bHQgb2JqZWN0IG1pZ2h0IGJlIHJlcHJlc2VudGVkIGJ5IG11bHRpcGxlIHJvd3MuIFRodXMsIHF1ZXJpZXMgd2l0aCBhIHJhbmdlCitzcGVjaWZpY2F0aW9uIG9yIHF1ZXJpZXMgY29uZmlndXJlZCBmb3IgbGF6eSByZXN1bHQgc2V0IHRyYXZlcnNhbCBhdXRvbWF0aWNhbGx5Cit0dXJuIG9mZiBlYWdlciB0by1tYW55IGpvaW5pbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGNhbm5vdCBlYWdlcmx5IGpvaW4gdG8gcG9seW1vcnBoaWMgcmVsYXRpb25zIHRvIG5vbi1sZWFmIGNsYXNzZXMgaW4gYQordGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gWW91IGNhbiB3b3JrIGFyb3VuZCB0aGlzIHJlc3RyaWN0aW9uCit1c2luZyB0aGUgbWFwcGluZyBleHRlbnNpb25zIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJub25wb2x5bW9ycGhpYyIvPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9yZW1vdGUueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX3JlbW90ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkNWRlYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3JlZl9ndWlkZV9yZW1vdGUueG1sCkBAIC0wLDAgKzEsNzA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxjaGFwdGVyIGlkPSJyZWZfZ3VpZGVfcmVtb3RlIj4KKyAgICA8dGl0bGU+CisgICAgICAgIFJlbW90ZSBhbmQgT2ZmbGluZSBPcGVyYXRpb24KKyAgICA8L3RpdGxlPgorICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3JlbW90ZSI+CisgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgcmVtb3RlCisgICAgICAgIDwvcHJpbWFyeT4KKyAgICA8L2luZGV4dGVybT4KKyAgICA8aW5kZXh0ZXJtPgorICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgIG9mZmxpbmUKKyAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICA8c2VlPgorICAgICAgICAgICAgcmVtb3RlCisgICAgICAgIDwvc2VlPgorICAgIDwvaW5kZXh0ZXJtPgorICAgIDxwYXJhPgorVGhlIHN0YW5kYXJkIEpQQSBydW50aW1lIGVudmlyb25tZW50IGlzIDxlbXBoYXNpcz5sb2NhbDwvZW1waGFzaXM+IGFuZAorPGVtcGhhc2lzPm9ubGluZTwvZW1waGFzaXM+LiBJdCBpcyA8ZW1waGFzaXM+bG9jYWw8L2VtcGhhc2lzPiBpbiB0aGF0IGNvbXBvbmVudHMKK3N1Y2ggYXMgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBhbmQgcXVlcmllcyBjb25uZWN0IGRpcmVjdGx5IHRvCit0aGUgZGF0YXN0b3JlIGFuZCBleGVjdXRlIHRoZWlyIGFjdGlvbnMgaW4gdGhlIHNhbWUgSlZNIGFzIHRoZSBjb2RlIHVzaW5nIHRoZW0uCitJdCBpcyA8ZW1waGFzaXM+b25saW5lPC9lbXBoYXNpcz4gaW4gdGhhdCBhbGwgY2hhbmdlcyB0byBtYW5hZ2VkIG9iamVjdHMgbXVzdCBiZQorbWFkZSBpbiB0aGUgY29udGV4dCBvZiBhbiBhY3RpdmUgPGNsYXNzbmFtZT4gRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPi4gVGhlc2UKK3R3byBwcm9wZXJ0aWVzLCBjb21iaW5lZCB3aXRoIHRoZSBmYWN0IHRoYXQgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zIGNhbm5vdCBiZSBzZXJpYWxpemVkIGZvciBzdG9yYWdlIG9yIG5ldHdvcmsgdHJhbnNmZXIsCittYWtlIHRoZSBzdGFuZGFyZCBKUEEgcnVudGltZSBkaWZmaWN1bHQgdG8gaW5jb3Jwb3JhdGUgaW50byBzb21lIGVudGVycHJpc2UgYW5kCitjbGllbnQvc2VydmVyIHByb2dyYW0gZGVzaWducy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CitPcGVuSlBBIGV4dGVuZHMgdGhlIHN0YW5kYXJkIHJ1bnRpbWUgdG8gYWRkIDxlbXBoYXNpcz5yZW1vdGU8L2VtcGhhc2lzPiBhbmQKKzxlbXBoYXNpcz5vZmZsaW5lPC9lbXBoYXNpcz4gY2FwYWJpbGl0aWVzIGluIHRoZSBmb3JtIG9mIGVuaGFuY2VkCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfZGV0YWNoIj5EZXRhY2ggYW5kIEF0dGFjaCBBUElzPC9saW5rPiBhbmQKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9ldmVudCI+UmVtb3RlIENvbW1pdCBFdmVudHM8L2xpbms+LiBUaGUgZm9sbG93aW5nCitzZWN0aW9ucyBleHBsYWluIHRoZXNlIGNhcGFiaWxpdGllcyBpbiBkZXRhaWwuCisgICAgPC9wYXJhPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZGV0YWNoIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgRGV0YWNoIGFuZCBBdHRhY2gKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGV0YWNoIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGRldGFjaG1lbnQKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBhdHRhY2htZW50CisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgIGRldGFjaG1lbnQKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CitUaGUgSlBBIE92ZXJ2aWV3IGRlc2NyaWJlcyB0aGUgc3BlY2lmaWNhdGlvbidzIHN0YW5kYXJkIGRldGFjaCBhbmQgYXR0YWNoIEFQSXMKK2luIDx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19lbV9saWZlY3ljbGUiLz4uIFRoaXMgc2VjdGlvbiBlbnVtZXJhdGVzCitPcGVuSlBBJ3MgZW5oYW5jZW1lbnRzIHRvIHRoZSBzdGFuZGFyZCBiZWhhdmlvci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2RldGFjaF9iZWhhdmlvciI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRGV0YWNoIEJlaGF2aW9yCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZGV0YWNoX2JlaGF2aW9yIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZGV0YWNobWVudAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0luIEpQQSwgb2JqZWN0cyBkZXRhY2ggYXV0b21hdGljYWxseSB3aGVuIHRoZXkgYXJlIHNlcmlhbGl6ZWQgb3Igd2hlbiBhCis8bGluayBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfZW1mYWN0b3J5X3BlcnNjb250ZXh0Ij5wZXJzaXN0ZW5jZSBjb250ZXh0PC9saW5rPgorZW5kcy4gVGhlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGVmaW5lIGFueSB3YXkgdG8gZXhwbGljaXRseSBkZXRhY2ggb2JqZWN0cy4KK1RoZSBleHRlbmRlZAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPk9wZW5KUEFFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+PC91bGluaz4sIGhvd2V2ZXIsIGFsbG93cyB5b3UgdG8KK2V4cGxpY2l0bHkgZGV0YWNoIG9iamVjdHMgYXQgYW55IHRpbWUuCisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgT2JqZWN0IGRldGFjaChPYmplY3QgcGMpOgorcHVibGljIE9iamVjdFtdIGRldGFjaEFsbChPYmplY3QuLi4gcGNzKToKK3B1YmxpYyBDb2xsZWN0aW9uIGRldGFjaEFsbChDb2xsZWN0aW9uIHBjcyk6Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitFYWNoIGRldGFjaCBtZXRob2QgcmV0dXJucyBkZXRhY2hlZCBjb3BpZXMgb2YgdGhlIGdpdmVuIGluc3RhbmNlcy4gVGhlIGNvcHkKK21lY2hhbmlzbSBpcyBzaW1pbGFyIHRvIHNlcmlhbGl6YXRpb24sIGV4Y2VwdCB0aGF0IG9ubHkgY2VydGFpbiBmaWVsZHMgYXJlCit0cmF2ZXJzZWQuIFdlIHdpbGwgc2VlIGhvdyB0byBjb250cm9sIHdoaWNoIGZpZWxkcyBhcmUgZGV0YWNoZWQgaW4gYSBsYXRlcgorc2VjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgZGV0YWNobWVudAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBvZiBkaXJ0eSBvYmplY3RzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK1doZW4gZGV0YWNoaW5nIGFuIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KKyhhbmQgdGh1cyBtYWRlIGRpcnR5KSwgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgZmx1c2hlZC4gVGhpcyBtZWFucyB0aGF0IHdoZW4KK3N1YnNlcXVlbnRseSByZS1hdHRhY2hpbmcgdGhlIGRldGFjaGVkIGluc3RhbmNlcywgT3BlbkpQQSBhc3N1bWVzIHRoYXQgdGhlCit0cmFuc2FjdGlvbiBmcm9tIHdoaWNoIHRoZXkgd2VyZSBvcmlnaW5hbGx5IGRldGFjaGVkIHdhcyBjb21taXR0ZWQ7IGlmIGl0IGhhcworYmVlbiByb2xsZWQgYmFjaywgdGhlbiB0aGUgcmUtYXR0YWNobWVudCBwcm9jZXNzIHdpbGwgdGhyb3cgYW4gb3B0aW1pc3RpYworY29uY3VycmVuY3kgZXhjZXB0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIHN0b3AgT3BlbkpQQSBmcm9tIGFzc3VtaW5nIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGNvbW1pdCBieSBpbnZva2luZworPG1ldGhvZG5hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXIuc2V0Um9sbGJhY2tPbmx5PC9tZXRob2RuYW1lPiBwcmlvciB0byBkZXRhY2hpbmcKK3lvdXIgb2JqZWN0cy4gU2V0dGluZyB0aGUgPGxpdGVyYWw+Um9sbGJhY2tPbmx5PC9saXRlcmFsPiBmbGFnIHByZXZlbnRzIE9wZW5KUEEKK2Zyb20gZmx1c2hpbmcgd2hlbiBkZXRhY2hpbmcgZGlydHkgb2JqZWN0czsgaW5zdGVhZCBPcGVuSlBBIGp1c3QgcnVucyBpdHMKK3ByZS1mbHVzaCBhY3Rpb25zIChzZWUgdGhlIDxtZXRob2RuYW1lPk9wZW5KUEFFbnRpdHlNYW5hZ2VyLnByZUZsdXNoCis8L21ldGhvZG5hbWU+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcGVuSlBBRW50aXR5TWFuYWdlci5odG1sIj4KK0phdmFkb2M8L3VsaW5rPiBmb3IgZGV0YWlscykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoaXMgYWxsb3dzIHlvdSB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2VzIGluIG11bHRpcGxlCithdHRhY2gvbW9kaWZ5L2RldGFjaC9yb2xsYmFjayBjeWNsZXMuIEFsdGVybmF0aXZlbHksIHlvdSBtaWdodCBhbHNvIHByZXZlbnQgYQorZmx1c2ggYnkgbWFraW5nIHlvdXIgbW9kaWZpY2F0aW9ucyBvdXRzaWRlIG9mIGEgdHJhbnNhY3Rpb24gKHdpdGggPGxpdGVyYWw+CitOb250cmFuc2FjdGlvbmFsV3JpdGU8L2xpdGVyYWw+IGVuYWJsZWQpIGJlZm9yZSBkZXRhY2hpbmcuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9hdHRhY2hfYmVoYXZpb3IiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEF0dGFjaCBCZWhhdmlvcgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2F0dGFjaF9iZWhhdmlvciI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitXaGVuIGF0dGFjaGluZywgT3BlbkpQQSB1c2VzIHNldmVyYWwgc3RyYXRlZ2llcyB0byBkZXRlcm1pbmUgdGhlIG9wdGltYWwgd2F5IHRvCittZXJnZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRldGFjaGVkIGluc3RhbmNlLiBBcyB5b3Ugd2lsbCBzZWUsIHRoZXNlIHN0cmF0ZWdpZXMKK2NhbiBldmVuIGJlIHVzZWQgdG8gYXR0YWNoIGNoYW5nZXMgbWFkZSB0byBhIHRyYW5zaWVudCBpbnN0YW5jZSB3aGljaCB3YXMgbmV2ZXIKK2RldGFjaGVkIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIHRoZSBpbnN0YW5jZSB3YXMgZGV0YWNoZWQgYW5kIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9kZXRhY2hfZ3JhcGgiPgorZGV0YWNoZWQgc3RhdGU8L2xpbms+IGlzIGVuYWJsZWQsIE9wZW5KUEEgd2lsbCB1c2UgdGhlIGRldGFjaGVkIHN0YXRlIHRvCitkZXRlcm1pbmUgdGhlIG9iamVjdCdzIHZlcnNpb24gYW5kIHByaW1hcnkga2V5IHZhbHVlcy4gSW4gYWRkaXRpb24sIHRoaXMgc3RhdGUKK3dpbGwgdGVsbCBPcGVuSlBBIHdoaWNoIGZpZWxkcyB3ZXJlIGxvYWRlZCBhdCB0aGUgdGltZSBvZiBkZXRhY2gsIGFuZCBpbiB0dXJuCit3aGVyZSB0byBleHBlY3QgY2hhbmdlcy4gTG9hZGVkIGRldGFjaGVkIGZpZWxkcyB3aXRoIG51bGwgdmFsdWVzIHdpbGwgc2V0IHRoZQorYXR0YWNoZWQgaW5zdGFuY2UncyBjb3JyZXNwb25kaW5nIGZpZWxkcyB0byBudWxsLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorSWYgdGhlIGluc3RhbmNlIGhhcyBhIDxsaXRlcmFsPlZlcnNpb248L2xpdGVyYWw+IGZpZWxkLAorT3BlbkpQQSB3aWxsIGNvbnNpZGVyIHRoZSBvYmplY3QgZGV0YWNoZWQgaWYgdGhlIHZlcnNpb24gZmllbGQgaGFzIGEgbm9uLWRlZmF1bHQKK3ZhbHVlLCBhbmQgbmV3IG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1doZW4gYXR0YWNoaW5nIG51bGwgZmllbGRzIGluIHRoZXNlIGNhc2VzLCBPcGVuSlBBIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKK2ZpZWxkIHRoYXQgd2FzIHVubG9hZGVkIGFuZCBvbmUgdGhhdCB3YXMgaW50ZW50aW9uYWxseSBzZXQgdG8gbnVsbC4gSW4gdGhpcworY2FzZSwgT3BlbkpQQSB3aWxsIHVzZSB0aGUgY3VycmVudCA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfZGV0YWNoX2dyYXBoIj4KK2RldGFjaCBzdGF0ZTwvbGluaz4gc2V0dGluZyB0byBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSBudWxsIGZpZWxkczogZmllbGRzIHRoYXQKK3dvdWxkIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiB0aGUgZGV0YWNoZWQgc3RhdGUgYXJlIHRyZWF0ZWQgYXMgbG9hZGVkLCBhbmQgd2lsbAoraW4gdHVybiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNoZWQgZmllbGQgdG8gbnVsbC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIG5laXRoZXIgb2YgdGhlIGFib3ZlIGNhc2VzIGFwcGx5LCBPcGVuSlBBIHdpbGwgY2hlY2sgdG8gc2VlIGlmIGFuIGluc3RhbmNlCit3aXRoIHRoZSBzYW1lIHByaW1hcnkga2V5IHZhbHVlcyBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLiBJZiBzbywgdGhlIG9iamVjdCBpcworY29uc2lkZXJlZCBkZXRhY2hlZC4gT3RoZXJ3aXNlLCBpdCBpcyBjb25zaWRlcmVkIG5ldy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlc2Ugc3RyYXRlZ2llcyB3aWxsIGJlIGFzc2lnbmVkIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzLCBzdWNoIHRoYXQgZHVyaW5nIHRoZQorYXR0YWNobWVudCBvZiBhbiBvYmplY3QgZ3JhcGggbW9yZSB0aGFuIG9uZSBvZiB0aGUgYWJvdmUgc3RyYXRlZ2llcyBtYXkgYmUgdXNlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSWYgeW91IGF0dGVtcHQgdG8gYXR0YWNoIGEgdmVyc2lvbmVkIGluc3RhbmNlIHdob3NlIHJlcHJlc2VudGF0aW9uIGhhcyBjaGFuZ2VkCitpbiB0aGUgZGF0YXN0b3JlIHNpbmNlIGRldGFjaG1lbnQsIE9wZW5KUEEgd2lsbCB0aHJvdyBhbiBvcHRpbWlzdGljIGNvbmN1cnJlbmN5CitleGNlcHRpb24gdXBvbiBjb21taXQgb3IgZmx1c2gsIGp1c3QgYXMgaWYgYSBub3JtYWwgb3B0aW1pc3RpYyBjb25mbGljdCB3YXMKK2RldGVjdGVkLiBXaGVuIGF0dGFjaGluZyBhbiBpbnN0YW5jZSB3aG9zZSBkYXRhYmFzZSByZWNvcmQgaGFzIGJlZW4gZGVsZXRlZAorc2luY2UgZGV0YWNoaW5nLCBvciB3aGVuIGF0dGFjaGluZyBhIGRldGFjaGVkIGluc3RhbmNlIGludG8gYSBtYW5hZ2VyIHRoYXQgaGFzIGEKK3N0YWxlIHZlcnNpb24gb2YgdGhlIG9iamVjdCwgT3BlbkpQQSB3aWxsIHRocm93IGFuIG9wdGltaXN0aWMgY29uY3VycmVuY3kKK2V4Y2VwdGlvbiBmcm9tIHRoZSBhdHRhY2ggbWV0aG9kLiBJbiB0aGVzZSBjYXNlcywgT3BlbkpQQSBzZXRzIHRoZSA8bGl0ZXJhbD4KK1JvbGxiYWNrT25seTwvbGl0ZXJhbD4gZmxhZyBvbiB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9kZXRhY2hfZ3JhcGgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIERlZmluaW5nIHRoZSBEZXRhY2hlZCBPYmplY3QgR3JhcGgKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kZXRhY2hfZ3JhcGgiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBkZXRhY2htZW50CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBvYmplY3QgZ3JhcGgKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitXaGVuIGRldGFjaGVkIG9iamVjdHMgbG9zZSB0aGVpciBhc3NvY2lhdGlvbiB3aXRoIHRoZSBPcGVuSlBBIHJ1bnRpbWUsIHRoZXkgYWxzbworbG9zZSB0aGUgYWJpbGl0eSB0byBsb2FkIGFkZGl0aW9uYWwgc3RhdGUgZnJvbSB0aGUgZGF0YXN0b3JlLiBJdCBpcyBpbXBvcnRhbnQsCit0aGVyZWZvcmUsIHRvIHBvcHVsYXRlIG9iamVjdHMgd2l0aCBhbGwgdGhlIHBlcnNpc3RlbnQgc3RhdGUgeW91IHdpbGwgbmVlZAorYmVmb3JlIGRldGFjaGluZyB0aGVtLiBXaGlsZSB5b3UgYXJlIGZyZWUgdG8gZG8gdGhpcyBtYW51YWxseSwgT3BlbkpQQSBpbmNsdWRlcworZmFjaWxpdGllcyBmb3IgYXV0b21hdGljYWxseSBwb3B1bGF0aW5nIG9iamVjdHMgd2hlbiB0aGV5IGRldGFjaC4gVGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkRldGFjaFN0YXRlIj48bGl0ZXJhbD5vcGVuanBhLkRldGFjaFN0YXRlPC9saXRlcmFsPgorPC9saW5rPiBjb25maWd1cmF0aW9uIHByb3BlcnR5IGRldGVybWluZXMgd2hpY2ggZmllbGRzIGFuZCByZWxhdGlvbnMgYXJlCitkZXRhY2hlZCBieSBkZWZhdWx0LiBBbGwgc2V0dGluZ3MgYXJlIHJlY3Vyc2l2ZS4gVGhleSBhcmU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmxvYWRlZDwvbGl0ZXJhbD46IERldGFjaCBhbGwgZmllbGRzIGFuZCByZWxhdGlvbnMgdGhhdCBhcmUgYWxyZWFkeQorbG9hZGVkLCBidXQgZG9uJ3QgaW5jbHVkZSB1bmxvYWRlZCBmaWVsZHMgaW4gdGhlIGRldGFjaGVkIGdyYXBoLiBUaGlzIGlzIHRoZQorZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmZldGNoLWdyb3VwczwvbGl0ZXJhbD46IERldGFjaCBhbGwgZmllbGRzIGFuZCByZWxhdGlvbnMgaW4gdGhlIGN1cnJlbnQKKzxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9ydW50aW1lIj5mZXRjaCBjb25maWd1cmF0aW9uPC9saW5rPi4gRm9yIG1vcmUKK2luZm9ybWF0aW9uIG9uIGN1c3RvbSBmZXRjaCBncm91cHMsIHNlZSA8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZmV0Y2giLz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5hbGw8L2xpdGVyYWw+OiBEZXRhY2ggYWxsIGZpZWxkcyBhbmQgcmVsYXRpb25zLiBCZSB2ZXJ5IGNhcmVmdWwgd2hlbgordXNpbmcgdGhpcyBtb2RlOyBpZiB5b3UgaGF2ZSBhIGhpZ2hseS1jb25uZWN0ZWQgZG9tYWluIG1vZGVsLCB5b3UgY291bGQgZW5kIHVwCiticmluZ2luZyBldmVyeSBvYmplY3QgaW4gdGhlIGRhdGFiYXNlIGludG8gbWVtb3J5IQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgICAgICA8cGFyYT4KK0FueSBmaWVsZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc2V0IGRldGVybWluZWQgYnkgdGhlIGRldGFjaCBtb2RlIGlzIHNldAordG8gaXRzIEphdmEgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgZGV0YWNoZWQgaW5zdGFuY2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5vcGVuanBhLkRldGFjaFN0YXRlPC9saXRlcmFsPiBvcHRpb24gaXMgYWN0dWFsbHkgYSBwbHVnaW4gc3RyaW5nCisoc2VlIDx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9jb25mX3BsdWdpbnMiLz4pIHRoYXQgYWxsb3dzIHlvdSB0byBhbHNvCitjb25maWd1cmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHJlbGF0ZWQgdG8gZGV0YWNoZWQgc3RhdGU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5EZXRhY2hlZFN0YXRlRmllbGQ8L2xpdGVyYWw+OiBBcyBkZXNjcmliZWQgaW4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9hdHRhY2hfYmVoYXZpb3IiLz4gYWJvdmUsIE9wZW5KUEEgY2FuIHRha2UKK2FkdmFudGFnZSBvZiBhIDxlbXBoYXNpcz5kZXRhY2hlZCBzdGF0ZSBmaWVsZDwvZW1waGFzaXM+IHRvIG1ha2UgdGhlIGF0dGFjaAorcHJvY2VzcyBtb3JlIGVmZmljaWVudC4gVGhpcyBmaWVsZCBpcyBhZGRlZCBieSB0aGUgZW5oYW5jZXIgYW5kIGlzIG5vdCB2aXNpYmxlCit0byB5b3VyIGFwcGxpY2F0aW9uLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRyYW5zaWVudDwvbGl0ZXJhbD46IFVzZSBhIHRyYW5zaWVudCBkZXRhY2hlZCBzdGF0ZSBmaWVsZC4gVGhpcyBnaXZlcwordGhlIGJlbmVmaXRzIG9mIGEgZGV0YWNoZWQgc3RhdGUgZmllbGQgdG8gbG9jYWwgb2JqZWN0cyB0aGF0IGFyZSBuZXZlcgorc2VyaWFsaXplZCwgYnV0IHJldGFpbnMgc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IGZvciBjbGllbnQgdGllcnMgd2l0aG91dAorYWNjZXNzIHRvIHRoZSBlbmhhbmNlZCB2ZXJzaW9ucyBvZiB5b3VyIGNsYXNzZXMuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPnRydWU8L2xpdGVyYWw+OiBVc2UgYSBub24tdHJhbnNpZW50IGRldGFjaGVkIHN0YXRlIGZpZWxkIHNvIHRoYXQKK29iamVjdHMgY3Jvc3Npbmcgc2VyaWFsaXphdGlvbiBiYXJyaWVycyBjYW4gc3RpbGwgYmUgYXR0YWNoZWQgZWZmaWNpZW50bHkuIFRoaXMKK3JlcXVpcmVzLCBob3dldmVyLCB0aGF0IHlvdXIgY2xpZW50IHRpZXIgaGF2ZSB0aGUgZW5oYW5jZWQgdmVyc2lvbnMgb2YgeW91cgorY2xhc3NlcyBhbmQgdGhlIE9wZW5KUEEgbGlicmFyaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD46IERvIG5vdCB1c2UgYSBkZXRhY2hlZCBzdGF0ZSBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIG92ZXJyaWRlIHRoZSBzZXR0aW5nIG9mIHRoaXMgcHJvcGVydHkgb3IgZGVjbGFyZSB5b3VyIG93biBkZXRhY2hlZCBzdGF0ZQorZmllbGQgb24gaW5kaXZpZHVhbCBjbGFzc2VzIHVzaW5nIE9wZW5KUEEncyBtZXRhZGF0YSBleHRlbnNpb25zLiBTZWUKKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9kZXRhY2hfZmllbGQiLz4gYmVsb3cuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5EZXRhY2hlZFN0YXRlTWFuYWdlcjwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gdXNlIGEgZGV0YWNoZWQgc3RhdGUKK21hbmFnZXIuIEEgZGV0YWNoZWQgc3RhdGUgbWFuYWdlciBtYWtlcyBhdHRhY2htZW50IG11Y2ggbW9yZSBlZmZpY2llbnQuIExpa2UgYQorZGV0YWNoZWQgc3RhdGUgZmllbGQsIGhvd2V2ZXIsIGl0IGJyZWFrcyBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKK3VuZW5oYW5jZWQgY2xhc3MgaWYgaXQgaXNuJ3QgdHJhbnNpZW50LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVGhpcyBzZXR0aW5nIHBpZ2d5YmFja3Mgb24gdGhlIDxsaXRlcmFsPkRldGFjaGVkU3RhdGVGaWVsZDwvbGl0ZXJhbD4gc2V0dGluZworYWJvdmUuIElmIHlvdXIgZGV0YWNoZWQgc3RhdGUgZmllbGQgaXMgdHJhbnNpZW50LCB0aGUgZGV0YWNoZWQgc3RhdGUgbWFuYWdlcgord2lsbCBhbHNvIGJlIHRyYW5zaWVudC4gSWYgdGhlIGRldGFjaGVkIHN0YXRlIGZpZWxkIGlzIGRpc2FibGVkLCB0aGUgZGV0YWNoZWQKK3N0YXRlIG1hbmFnZXIgd2lsbCBhbHNvIGJlIGRpc2FibGVkLiBUaGlzIGlzIHR5cGljYWxseSB3aGF0IHlvdSdsbCB3YW50LiBCeQorc2V0dGluZyA8bGl0ZXJhbD4gRGV0YWNoZWRTdGF0ZUZpZWxkPC9saXRlcmFsPiB0byB0cnVlIChvciB0cmFuc2llbnQpIGFuZAorc2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGZhbHNlLCBob3dldmVyLCB5b3UgY2FuIHVzZSBhIGRldGFjaGVkIHN0YXRlIGZpZWxkCis8ZW1waGFzaXMgcm9sZT0iYm9sZCI+d2l0aG91dDwvZW1waGFzaXM+IHVzaW5nIGEgZGV0YWNoZWQgc3RhdGUgbWFuYWdlci4gVGhpcworbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG9yIGZvciBsZWdhY3kgT3BlbkpQQSB1c2VycyB3aG8gZmluZCBkaWZmZXJlbmNlcworYmV0d2VlbiBPcGVuSlBBJ3MgYmVoYXZpb3Igd2l0aCBhIGRldGFjaGVkIHN0YXRlIG1hbmFnZXIgYW5kIE9wZW5KUEEncyBvbGRlcgorYmVoYXZpb3Igd2l0aG91dCBvbmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5BY2Nlc3NVbmxvYWRlZDwvbGl0ZXJhbD46IFdoZXRoZXIgdG8gYWxsb3cgYWNjZXNzIHRvIHVubG9hZGVkIGZpZWxkcworb2YgZGV0YWNoZWQgb2JqZWN0cy4gRGVmYXVsdHMgdG8gdHJ1ZS4gU2V0IHRvIGZhbHNlIHRvIHRocm93IGFuIGV4Y2VwdGlvbgord2hlbmV2ZXIgYW4gdW5sb2FkZWQgZmllbGQgaXMgYWNjZXNzZWQuIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4geW91Cit1c2UgZGV0YWNoZWQgc3RhdGUgbWFuYWdlcnMsIGFzIGRldGVybWluZWQgYnkgdGhlIHNldHRpbmdzIGFib3ZlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9kZXRhY2hfZ3JhcGhfY29uZmV4Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIERldGFjaGVkIFN0YXRlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkRldGFjaFN0YXRlIiB2YWx1ZT0iZmV0Y2gtZ3JvdXBzKERldGFjaGVkU3RhdGVGaWVsZD10cnVlKSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBhbHNvIGFsdGVyIHRoZSBzZXQgb2YgZmllbGRzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZGV0YWNoZWQgZ3JhcGgKK2F0IHJ1bnRpbWUuCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcGVuSlBBRW50aXR5TWFuYWdlci5odG1sIj4KKzxjbGFzc25hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPnMgZXhwb3NlIHRoZSBmb2xsb3dpbmcgQVBJcworZm9yIGNvbnRyb2xsaW5nIGRldGFjaGVkIHN0YXRlOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUNIX0xPQURFRDsKK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFDSF9GRVRDSF9HUk9VUFM7CitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBQ0hfQUxMOworcHVibGljIGludCBnZXREZXRhY2hTdGF0ZSgpOworcHVibGljIHZvaWQgc2V0RGV0YWNoU3RhdGUoaW50IG1vZGUpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZGV0YWNoX2ZpZWxkIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERldGFjaGVkIFN0YXRlIEZpZWxkCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9kZXRhY2hfZmllbGQiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaG1lbnQKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoZWQgc3RhdGUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIHRoZSBkZXRhY2hlZCBzdGF0ZSBmaWVsZCBpcyBlbmFibGVkLCB0aGUgT3BlbkpQQSBlbmhhbmNlciBhZGRzIGFuCithZGRpdGlvbmFsIGZpZWxkIHRvIHRoZSBlbmhhbmNlZCB2ZXJzaW9uIG9mIHlvdXIgY2xhc3MuIFRoaXMgZmllbGQgb2YgdHlwZQorPGNsYXNzbmFtZT5PYmplY3Q8L2NsYXNzbmFtZT4uIE9wZW5KUEEgdXNlcyB0aGlzIGZpZWxkIGZvciBib29ra2VlcGluZworaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHZlcnNpb25pbmcgZGF0YSBuZWVkZWQgdG8gZGV0ZWN0IG9wdGltaXN0aWMgY29uY3VycmVuY3kKK3Zpb2xhdGlvbnMgd2hlbiB0aGUgb2JqZWN0IGlzIHJlLWF0dGFjaGVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0l0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSB0aGlzIGRldGFjaGVkIHN0YXRlIGZpZWxkIHlvdXJzZWxmLiBEZWNsYXJpbmcgdGhpcworZmllbGQgaW4geW91ciBjbGFzcyBtZXRhZGF0YSBwcmV2ZW50cyB0aGUgZW5oYW5jZXIgZnJvbSBhZGRpbmcgYW55IGV4dHJhIGZpZWxkcwordG8gdGhlIGNsYXNzLCBhbmQga2VlcHMgdGhlIGVuaGFuY2VkIGNsYXNzIHNlcmlhbGl6YXRpb24tY29tcGF0aWJsZSB3aXRoIHRoZQordW5lbmhhbmNlZCB2ZXJzaW9uLiBUaGUgZGV0YWNoZWQgc3RhdGUgZmllbGQgbXVzdCBub3QgYmUgcGVyc2lzdGVudC4gU2VlCis8eHJlZiBsaW5rZW5kPSJkZXRhY2hlZC1zdGF0ZS1maWVsZCIvPiBmb3IgZGV0YWlscyBvbiBob3cgdG8gZGVjbGFyZSBhCitkZXRhY2hlZCBzdGF0ZSBmaWVsZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBNYWdhemluZQorICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgQERldGFjaGVkU3RhdGUgcHJpdmF0ZSBPYmplY3Qgc3RhdGU7CisgICAgLi4uCit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZXZlbnQiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBSZW1vdGUgRXZlbnQgTm90aWZpY2F0aW9uIEZyYW1ld29yaworICAgICAgICA8L3RpdGxlPgorICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9ldmVudCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICByZW1vdGUKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBldmVudHMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgcmVtb3RlCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgcmVtb3RlLCBldmVudHMKKyAgICAgICAgICAgIDwvc2VlPgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICByZW1vdGUKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICBSZW1vdGVDb21taXRQcm92aWRlcgorICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICByZW1vdGUKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICBSZW1vdGVDb21taXRMaXN0ZW5lcgorICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CitUaGUgcmVtb3RlIGV2ZW50IG5vdGlmaWNhdGlvbiBmcmFtZXdvcmsgYWxsb3dzIGEgc3Vic2V0IG9mIHRoZSBpbmZvcm1hdGlvbgorYXZhaWxhYmxlIHRocm91Z2ggT3BlbkpQQSdzIHRyYW5zYWN0aW9uIGV2ZW50cyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZV9wbV9ldmVudCIvPikgdG8gYmUgYnJvYWRjYXN0IHRvIHJlbW90ZQorbGlzdGVuZXJzLiBPcGVuSlBBJ3MgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2NhY2hlIj5kYXRhIGNhY2hlPC9saW5rPiwgZm9yCitleGFtcGxlLCB1c2VzIHJlbW90ZSBldmVudHMgdG8gcmVtYWluIHN5bmNocm9uaXplZCB3aGVuIGRlcGxveWVkIGluIG11bHRpcGxlCitKVk1zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVG8gZW5hYmxlIHJlbW90ZSBldmVudHMsIHlvdSBtdXN0IGNvbmZpZ3VyZSB0aGUgPGNsYXNzbmFtZT4gRW50aXR5TWFuYWdlckZhY3RvcnkKKzwvY2xhc3NuYW1lPiB0byB1c2UgYSA8bGl0ZXJhbD5SZW1vdGVDb21taXRQcm92aWRlcjwvbGl0ZXJhbD4gKHNlZSBiZWxvdykuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitXaGVuIGEgPGxpdGVyYWw+UmVtb3RlQ29tbWl0UHJvdmlkZXI8L2xpdGVyYWw+IGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQsIHlvdSBjYW4KK3JlZ2lzdGVyCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9SZW1vdGVDb21taXRMaXN0ZW5lci5odG1sIj4KKzxjbGFzc25hbWU+UmVtb3RlQ29tbWl0TGlzdGVuZXI8L2NsYXNzbmFtZT48L3VsaW5rPnMgdGhhdCB3aWxsIGJlIGFsZXJ0ZWQgd2l0aAorYSBsaXN0IG9mIG1vZGlmaWVkIG9iamVjdCBpZHMgd2hlbmV2ZXIgYSB0cmFuc2FjdGlvbiBvbiBhIHJlbW90ZSBtYWNoaW5lCitzdWNjZXNzZnVsbHkgY29tbWl0cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2V2ZW50X2NvbmYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFJlbW90ZSBDb21taXQgUHJvdmlkZXIgQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2V2ZW50X2NvbmYiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICByZW1vdGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGluY2x1ZGVzIGJ1aWx0IGluIHJlbW90ZSBjb21taXQgcHJvdmlkZXJzIGZvciBKTVMgYW5kIFRDUCBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9ldmVudF9jb25mX2ptcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBKTVMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2V2ZW50X2NvbmZfam1zIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBKTVMKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBKTVMgcmVtb3RlIGNvbW1pdCBwcm92aWRlciBjYW4gYmUgY29uZmlndXJlZCBieSBzZXR0aW5nIHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5SZW1vdGVDb21taXRQcm92aWRlciI+PGxpdGVyYWw+CitvcGVuanBhLlJlbW90ZUNvbW1pdFByb3ZpZGVyPC9saXRlcmFsPjwvbGluaz4gcHJvcGVydHkgdG8gY29udGFpbiB0aGUKK2FwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4gVGhlIEpNUyBwcm92aWRlciB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlRvcGljPC9saXRlcmFsPjogVGhlIHRvcGljIHRoYXQgdGhlIHJlbW90ZSBjb21taXQgcHJvdmlkZXIgc2hvdWxkCitwdWJsaXNoIG5vdGlmaWNhdGlvbnMgdG8gYW5kIHN1YnNjcmliZSB0byBmb3Igbm90aWZpY2F0aW9ucyBzZW50IGZyb20gb3RoZXIKK0pWTXMuIERlZmF1bHRzIHRvIDxsaXRlcmFsPnRvcGljL09wZW5KUEFDb21taXRQcm92aWRlclRvcGljPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlRvcGljQ29ubmVjdGlvbkZhY3Rvcnk8L2xpdGVyYWw+OiBUaGUgSk5ESSBuYW1lIG9mIGEgPGNsYXNzbmFtZT4KK2phdmF4Lmptcy5Ub3BpY0Nvbm5lY3Rpb25GYWN0b3J5PC9jbGFzc25hbWU+IGZhY3RvcnkgdG8gdXNlIGZvciBmaW5kaW5nIHRvcGljcy4KK0RlZmF1bHRzIHRvIDxsaXRlcmFsPiBqYXZhOi9Db25uZWN0aW9uRmFjdG9yeTwvbGl0ZXJhbD4uIFRoaXMgc2V0dGluZyBtYXkgdmFyeQorZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaW4gdXNlOyBjb25zdWx0IHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIncworZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvZiB0aGUgZGVmYXVsdCBKTkRJIG5hbWUgZm9yIHRoZSA8Y2xhc3NuYW1lPgoramF2YXguam1zLlRvcGljQ29ubmVjdGlvbkZhY3Rvcnk8L2NsYXNzbmFtZT4gaW5zdGFuY2UuIEZvciBleGFtcGxlLCB1bmRlcgorV2VibG9naWMsIHRoZSBKTkRJIG5hbWUgZm9yIHRoZSBUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IGlzIDxsaXRlcmFsPgoramF2YXguam1zLlRvcGljQ29ubmVjdGlvbkZhY3Rvcnk8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkV4Y2VwdGlvblJlY29ubmVjdEF0dGVtcHRzPC9saXRlcmFsPjogVGhlIG51bWJlciBvZiB0aW1lcyB0byBhdHRlbXB0Cit0byByZWNvbm5lY3QgaWYgdGhlIEpNUyBzeXN0ZW0gbm90aWZpZXMgT3BlbkpQQSBvZiBhIHNlcmlvdXMgY29ubmVjdGlvbiBlcnJvci4KK0RlZmF1bHRzIHRvIDAsIG1lYW5pbmcgT3BlbkpQQSB3aWxsIGxvZyB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZSBpZ25vcmUgaXQsCitob3BpbmcgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgdmFsaWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+KjwvbGl0ZXJhbD46IEFsbCBvdGhlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgd2lsbCBiZSBpbnRlcnByZXRlZCBhcworc2V0dGluZ3MgdG8gcGFzcyB0byB0aGUgSk5ESSA8Y2xhc3NuYW1lPkluaXRpYWxDb250ZXh0PC9jbGFzc25hbWU+IG9uCitjb25zdHJ1Y3Rpb24uIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IHRoZSA8bGl0ZXJhbD5qYXZhLm5hbWluZy5wcm92aWRlci51cmwKKzwvbGl0ZXJhbD4gcHJvcGVydHkgdG8gdGhlIFVSTCBvZiB0aGUgY29udGV4dCBwcm92aWRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RvIGNvbmZpZ3VyZSBhIGZhY3RvcnkgdG8gdXNlIHRoZSBKTVMgcHJvdmlkZXIsIHlvdXIgcHJvcGVydGllcyBtaWdodCBsb29rIGxpa2UKK3RoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0JlY2F1c2Ugb2YgdGhlIG5hdHVyZSBvZiBKTVMsIGl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBpbnZva2UgPG1ldGhvZG5hbWU+CitFbnRpdHlNYW5hZ2VyRmFjdG9yeS5jbG9zZTwvbWV0aG9kbmFtZT4gd2hlbiBmaW5pc2hlZCB3aXRoIGEgZmFjdG9yeS4gSWYgeW91IGRvCitub3QgZG8gc28sIGEgZGFlbW9uIHRocmVhZCB3aWxsIHN0YXkgdXAgaW4gdGhlIEpWTSwgcHJldmVudGluZyB0aGUgSlZNIGZyb20KK2V4aXRpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2V2ZW50X2NvbmZfdGNwIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFRDUAorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZXZlbnRfY29uZl90Y3AiPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRDUAorICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorVGhlIFRDUCByZW1vdGUgY29tbWl0IHByb3ZpZGVyIGhhcyBzZXZlcmFsIG9wdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBhcyBob3N0CitzcGVjaWZpY2F0aW9ucyBjb250YWluaW5nIGEgaG9zdCBuYW1lIG9yIElQIGFkZHJlc3MgYW5kIGFuIG9wdGlvbmFsIHBvcnQKK3NlcGFyYXRlZCBieSBhIGNvbG9uLiBGb3IgZXhhbXBsZSwgdGhlIGhvc3Qgc3BlY2lmaWNhdGlvbiA8bGl0ZXJhbD4KK3NhdHVybi5iZWEuY29tOjEyMzQ8L2xpdGVyYWw+IHJlcHJlc2VudHMgYW4gPGNsYXNzbmFtZT5JbmV0QWRkcmVzczwvY2xhc3NuYW1lPgorcmV0cmlldmVkIGJ5IGludm9raW5nIDxtZXRob2RuYW1lPkluZXRBZGRyZXNzLmdldEJ5TmFtZSgic2F0dXJuLmJlYS5jb20iKQorPC9tZXRob2RuYW1lPiBhbmQgYSBwb3J0IG9mIDEyMzQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgVENQIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KK1RoZSBUQ1AgcHJvdmlkZXIgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgc2V0dGluZyB0aGUgPGxpdGVyYWw+CitvcGVuanBhLlJlbW90ZUNvbW1pdFByb3ZpZGVyPC9saXRlcmFsPiBwbHVnaW4gcHJvcGVydHkgdG8gY29udGFpbiB0aGUKK2FwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuIFRoZSBUQ1AgcHJvdmlkZXIgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZworcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5Qb3J0PC9saXRlcmFsPjogVGhlIFRDUCBwb3J0IHRoYXQgdGhlIHByb3ZpZGVyIHNob3VsZCBsaXN0ZW4gb24gZm9yCitjb21taXQgbm90aWZpY2F0aW9ucy4gRGVmYXVsdHMgdG8gNTYzNi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5BZGRyZXNzZXM8L2xpdGVyYWw+OiBBIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgdG8KK3doaWNoIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlIHNlbnQuIE5vIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+TnVtQnJvYWRjYXN0VGhyZWFkczwvbGl0ZXJhbD46IFRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBjcmVhdGUgZm9yIHRoZQorcHVycG9zZSBvZiB0cmFuc21pdHRpbmcgZXZlbnRzIHRvIHBlZXJzLiBZb3Ugc291bGQgaW5jcmVhc2UgdGhpcyB2YWx1ZSBhcyB0aGUKK251bWJlciBvZiBjb25jdXJyZW50IHRyYW5zYWN0aW9ucyBpbmNyZWFzZXMuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50Cit0cmFuc2FjdGlvbnMgaXMgYSBmdW5jdGlvbiBvZiB0aGUgc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBwb29sLiBTZWUgdGhlIHRoZQorPGxpdGVyYWw+TWF4QWN0aXZlPC9saXRlcmFsPiBwcm9wZXJ0eSBvZiA8bGl0ZXJhbD4KK29wZW5qcGEuQ29ubmVjdGlvbkZhY3RvcnlQcm9wZXJ0aWVzPC9saXRlcmFsPiBpbgorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2Ric2V0dXBfYnVpbHRpbiIvPi4gU2V0dGluZyBhIHZhbHVlIG9mIDAgd2lsbAorcmVzdWx0IGluIGJlaGF2aW9yIHdoZXJlIHRoZSB0aHJlYWQgaW52b2tpbmcgPG1ldGhvZG5hbWU+Y29tbWl0PC9tZXRob2RuYW1lPgord2lsbCBwZXJmb3JtIHRoZSBicm9hZGNhc3QgZGlyZWN0bHkuIERlZmF1bHRzIHRvIDIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+UmVjb3ZlcnlUaW1lTWlsbGlzPC9saXRlcmFsPjogQW1vdW50IG9mIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMKK2JlZm9yZSBhdHRlbXB0aW5nIHRvIHJlY29ubmVjdCB0byBhIHBlZXIgb2YgdGhlIGNsdXN0ZXIgd2hlbiBjb25uZWN0aXZpdHkgdG8gdGhlCitwZWVyIGlzIGxvc3QuIERlZmF1bHRzIHRvIDE1MDAwLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk1heElkbGU8L2xpdGVyYWw+OiBUaGUgbnVtYmVyIG9mIFRDUCBzb2NrZXRzIChjaGFubmVscykgdG8ga2VlcCBvcGVuCit0byBlYWNoIHBlZXIgaW4gdGhlIGNsdXN0ZXIgZm9yIHRoZSB0cmFuc21pc3Npb24gb2YgZXZlbnRzLiBEZWZhdWx0cyB0byAyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPk1heEFjdGl2ZTwvbGl0ZXJhbD46IFRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIFRDUCBzb2NrZXRzCisoY2hhbm5lbHMpIHRvIG9wZW4gc2ltdWx0YW5lb3VzbHkgYmV0d2VlbiBlYWNoIHBlZXIgaW4gdGhlIGNsdXN0ZXIuIERlZmF1bHRzIHRvCisyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorVG8gY29uZmlndXJlIGEgZmFjdG9yeSB0byB1c2UgdGhlIFRDUCBwcm92aWRlciwgeW91ciBwcm9wZXJ0aWVzIG1pZ2h0IGxvb2sgbGlrZQordGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9ldmVudF9jb25mX3RjcGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgVENQIFJlbW90ZSBDb21taXQgUHJvdmlkZXIgQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuUmVtb3RlQ29tbWl0UHJvdmlkZXIiCisgICAgdmFsdWU9InRjcChBZGRyZXNzZXM9MTAuMC4xLjEwOzEwLjAuMS4xMTsxMC4wLjEuMTI7MTAuMC4xLjEzKSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2V2ZW50X2NvbmZfY29tbW9uIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbW1vbiBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9ldmVudF9jb25mX2NvbW1vbiI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cworICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0luIGFkZGl0aW9uIHRvIHRoZSBwcm92aWRlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYWJvdmUsIGFsbCBwcm92aWRlcnMKK2FjY2VwdCB0aGUgZm9sbG93aW5nIHBsdWdpbiBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlRyYW5zbWl0UGVyc2lzdGVkT2JqZWN0SWRzPC9saXRlcmFsPjogV2hldGhlciByZW1vdGUgY29tbWl0IGV2ZW50cword2lsbCBpbmNsdWRlIHRoZSBvYmplY3QgaWRzIG9mIGluc3RhbmNlcyBwZXJzaXN0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiBCeQorZGVmYXVsdCBvbmx5IHRoZSBjbGFzcyBuYW1lcyBvZiB0eXBlcyBwZXJzaXN0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGFyZSBzZW50LgorVGhpcyByZXN1bHRzIGluIHNtYWxsZXIgZXZlbnRzIGFuZCBtb3JlIGVmZmljaWVudCBuZXR3b3JrIHV0aWxpemF0aW9uLiBJZiB5b3UKK2hhdmUgcmVnaXN0ZXJlZCB5b3VyIG93biByZW1vdGUgY29tbWl0IGxpc3RlbmVycywgaG93ZXZlciwgeW91IG1heSByZXF1aXJlIHRoZQorcGVyc2lzdGVkIG9iamVjdCBpZHMgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RvIHRyYW5zbWl0IHBlcnNpc3RlZCBvYmplY3QgaWRzIGluIG91ciByZW1vdGUgY29tbWl0IGV2ZW50cyB1c2luZyB0aGUgSk1TCitwcm92aWRlciwgd2UgbW9kaWZ5IHRoZSBwcmV2aW91cyBleGFtcGxlIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZXZlbnRfY3VzdG9taXphdGlvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ3VzdG9taXphdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2V2ZW50X2N1c3RvbWl6YXRpb24iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICByZW1vdGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBjdXN0b21pemF0aW9uCisgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIGRldmVsb3AgYWRkaXRpb25hbCBtZWNoYW5pc21zIGZvciByZW1vdGUgZXZlbnQgbm90aWZpY2F0aW9uIGJlIGJ5CitjcmVhdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L1JlbW90ZUNvbW1pdFByb3ZpZGVyLmh0bWwiPgorPGNsYXNzbmFtZT4gUmVtb3RlQ29tbWl0UHJvdmlkZXI8L2NsYXNzbmFtZT48L3VsaW5rPiBpbnRlcmZhY2UsIHBvc3NpYmx5IGJ5CitleHRlbmRpbmcgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9ldmVudC9BYnN0cmFjdFJlbW90ZUNvbW1pdFByb3ZpZGVyLmh0bWwiPgorPGNsYXNzbmFtZT5BYnN0cmFjdFJlbW90ZUNvbW1pdFByb3ZpZGVyPC9jbGFzc25hbWU+PC91bGluaz4gYWJzdHJhY3QgY2xhc3MuLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX3J1bnRpbWUueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvcmVmX2d1aWRlX3J1bnRpbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTkyZjUKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9yZWZfZ3VpZGVfcnVudGltZS54bWwKQEAgLTAsMCArMSwxNzgxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxjaGFwdGVyIGlkPSJyZWZfZ3VpZGVfcnVudGltZSI+CisgICAgPHRpdGxlPgorICAgICAgICBSdW50aW1lIEV4dGVuc2lvbnMKKyAgICA8L3RpdGxlPgorICAgIDxwYXJhPgorVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBPcGVuSlBBIGV4dGVuc2lvbnMgdG8gdGhlIHN0YW5kYXJkIEpQQQoraW50ZXJmYWNlcywgYW5kIG91dGxpbmVzIHNvbWUgYWRkaXRpb25hbCBmZWF0dXJlcyBvZiB0aGUgT3BlbkpQQSBydW50aW1lLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfYXJjaCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEFyY2hpdGVjdHVyZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8cGFyYT4KK0ludGVybmFsbHksIE9wZW5KUEEgZG9lcyBub3QgYWRoZXJlIHRvIGFueSBwZXJzaXN0ZW5jZSBzcGVjaWZpY2F0aW9uLiBUaGUKK09wZW5KUEEga2VybmVsIGhhcyBpdHMgb3duIHNldCBvZiBBUElzIGFuZCBjb21wb25lbnRzLiBTcGVjaWZpY2F0aW9ucyBsaWtlIEpQQQorYW5kIEpETyBhcmUgc2ltcGx5IGRpZmZlcmVudCAicGVyc29uYWxpdGllcyIgdGhhdCBjYW4gT3BlbkpQQSdzIG5hdGl2ZSBrZXJuZWwKK2NhbiBhZG9wdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0FzIGEgT3BlbkpQQSB1c2VyLCB5b3Ugd2lsbCBub3Qgbm9ybWFsbHkgc2VlIGJlbmVhdGgKK09wZW5KUEEncyBKUEEgcGVyc29uYWxpdHkuIE9wZW5KUEEgYWxsb3dzIHlvdSB0byBhY2Nlc3MgaXRzIGZlYXR1cmUgc2V0IHdpdGhvdXQKK2xlYXZpbmcgdGhlIGNvbWZvcnQgb2YgSlBBLiBXaGVyZSBPcGVuSlBBIGdvZXMgYmV5b25kIHN0YW5kYXJkIEpQQQorZnVuY3Rpb25hbGl0eSwgd2UgaGF2ZSBjcmFmdGVkIEpQQS1zcGVjaWZpYyBBUElzIHRvIGVhY2ggT3BlbkpQQSBleHRlbnNpb24gZm9yCithcyBzZWFtbGVzcyBhbiBleHBlcmllbmNlIGFzIHBvc3NpYmxlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorV2hlbiB3cml0aW5nIE9wZW5KUEEgcGx1Z2lucyBvciBvdGhlcndpc2UgZXh0ZW5kaW5nIHRoZSBPcGVuSlBBIHJ1bnRpbWUsCitob3dldmVyLCB5b3Ugd2lsbCB1c2UgT3BlbkpQQSdzIG5hdGl2ZSBBUElzLiBTbyB0aGF0IHlvdSB3b24ndCBmZWVsIGxvc3QsIHRoZQorbGlzdCBiZWxvdyBhc3NvY2lhdGVzIGVhY2ggc3BlY2lmaWNhdGlvbiBpbnRlcmZhY2Ugd2l0aCBpdHMgYmFja2luZyBuYXRpdmUKK09wZW5KUEEgY29tcG9uZW50OgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPmphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+OiA8ZW1waGFzaXM+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuQnJva2VyRmFjdG9yeTwvY2xhc3NuYW1lPjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+amF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPjogPGVtcGhhc2lzPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlcjwvY2xhc3NuYW1lPjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+amF2YXgucGVyc2lzdGVuY2UuUXVlcnk8L2NsYXNzbmFtZT46IDxlbXBoYXNpcz48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5RdWVyeTwvY2xhc3NuYW1lPjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLkV4dGVudDwvY2xhc3NuYW1lPjogPGVtcGhhc2lzPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkV4dGVudDwvY2xhc3NuYW1lPjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlN0b3JlQ2FjaGU8L2NsYXNzbmFtZT46IDxlbXBoYXNpcz4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5EYXRhQ2FjaGU8L2NsYXNzbmFtZT48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5RdWVyeVJlc3VsdENhY2hlPC9jbGFzc25hbWU+OgorPGVtcGhhc2lzPjxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmRhdGFjYWNoZS5RdWVyeUNhY2hlPC9jbGFzc25hbWU+Cis8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaFBsYW48L2NsYXNzbmFtZT46IDxlbXBoYXNpcz4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5GZXRjaENvbmZpZ3VyYXRpb248L2NsYXNzbmFtZT48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5HZW5lcmF0b3I8L2NsYXNzbmFtZT46IDxlbXBoYXNpcz4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TZXE8L2NsYXNzbmFtZT48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8cGFyYT4KK1RoZSA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfcnVudGltZV9vcGVuanBhcGVyc2lzdGVuY2UiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuT3BlbkpQQVBlcnNpc3RlbmNlPC9jbGFzc25hbWU+PC9saW5rPiBoZWxwZXIKK2FsbG93cyB5b3UgdG8gY29udmVydCBiZXR3ZWVuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlckZhY3RvcmllczwvY2xhc3NuYW1lPiBhbmQKKzxjbGFzc25hbWU+QnJva2VyRmFjdG9yaWVzPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT5zCithbmQgPGNsYXNzbmFtZT5Ccm9rZXI8L2NsYXNzbmFtZT5zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcnVudGltZV9icm9rZXJfZmluYWxpemF0aW9uIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBCcm9rZXIgRmluYWxpemF0aW9uCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcnVudGltZV9icm9rZXJfZmluYWxpemF0aW9uIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRW50aXR5TWFuYWdlcgorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBmaW5hbGl6aW5nCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICBjbGVhbi11cAorICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorT3V0c2lkZSBvZiBhIEphdmEgRUUgNSBhcHBsaWNhdGlvbiBzZXJ2ZXIgb3Igb3RoZXIgSlBBIHBlcnNpc3RlbmNlIGNvbnRhaW5lcgorZW52aXJvbm1lbnQsIHRoZSBkZWZhdWx0IE9wZW5KUEFFbnRpdHlNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGF1dG9tYXRpY2FsbHkKK2Nsb3NlcyBpdHNlbGYgZHVyaW5nIGluc3RhbmNlIGZpbmFsaXphdGlvbi4gVGhpcyBndWFyZHMgYWdhaW5zdCBhY2NpZGVudGFsCityZXNvdXJjZSBsZWFrcyB0aGF0IG1heSBvY2N1ciBpZiBhIGRldmVsb3BlciBmYWlscyB0byBleHBsaWNpdGx5IGNsb3NlCitFbnRpdHlNYW5hZ2VycyB3aGVuIGZpbmlzaGVkIHdpdGggdGhlbSwgYnV0IGl0IGFsc28gaW5jdXJzIGEgc2NhbGFiaWxpdHkKK2JvdHRsZW5lY2ssIHNpbmNlIHRoZSBKVk0gbXVzdCBwZXJmb3JtIHN5bmNocm9uaXphdGlvbiBkdXJpbmcgaW5zdGFuY2UgY3JlYXRpb24sCithbmQgc2luY2UgdGhlIGZpbmFsaXplciB0aHJlYWQgd2lsbCBoYXZlIG1vcmUgaW5zdGFuY2VzIHRvIG1vbml0b3IuIFRvIGF2b2lkCit0aGlzIG92ZXJoZWFkLCBzZXQgdGhlCis8bGluayBsaW5rZW5kPSJvcGVuanBhLkJyb2tlckltcGwiPjxsaXRlcmFsPm9wZW5qcGEuQnJva2VySW1wbDwvbGl0ZXJhbD48L2xpbms+Citjb25maWd1cmF0aW9uIHByb3BlcnR5IHRvIDxsaXRlcmFsPm5vbi1maW5hbGl6aW5nPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfYnJva2VyX2V4dGVuc2lvbiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQnJva2VyIEN1c3RvbWl6YXRpb24gYW5kIEZpbmFsaXphdGlvbgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3J1bnRpbWVfYnJva2VyX2V4dGVuc2lvbiI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGV4dGVuZGluZworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0FzIGEgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyI+cGx1Z2luIHN0cmluZzwvbGluaz4sIHRoaXMgcHJvcGVydHkKK2NhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgPGNsYXNzbmFtZT4gQnJva2VySW1wbDwvY2xhc3NuYW1lPiB3aXRoIHRoZQorZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5FdmljdEZyb21EYXRhQ2FjaGU8L2xpdGVyYWw+OiBXaGVuIGV2aWN0aW5nIGFuIG9iamVjdCB0aHJvdWdoIHRoZQorPG1ldGhvZG5hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXIuZXZpY3Q8L21ldGhvZG5hbWU+IG1ldGhvZHMsIHdoZXRoZXIgdG8gYWxzbworZXZpY3QgaXQgZnJvbSB0aGUgT3BlbkpQQSdzIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9jYWNoZSI+ZGF0YSBjYWNoZTwvbGluaz4uCitEZWZhdWx0cyB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3J1bnRpbWVfcG1fZXZpY3RleCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBFdmljdCBmcm9tIERhdGEgQ2FjaGUKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorJmx0O3Byb3BlcnR5IG5hbWU9Im9wZW5qcGEuQnJva2VySW1wbCIgdmFsdWU9IkV2aWN0RnJvbURhdGFDYWNoZT10cnVlIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CitBZGRpdGlvbmFsbHksIHNvbWUgYWR2YW5jZWQgdXNlcnMgbWF5IHdhbnQgdG8gYWRkIGNhcGFiaWxpdGllcyB0byBPcGVuSlBBJ3MKK2ludGVybmFsIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9Ccm9rZXJJbXBsLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkJyb2tlckltcGw8L2NsYXNzbmFtZT48L3VsaW5rPi4gWW91IGNhbiAKK2NvbmZpZ3VyZSBPcGVuSlBBIHRvIHVzZSBhIGN1c3RvbSBzdWJjbGFzcyBvZiA8Y2xhc3NuYW1lPkJyb2tlckltcGw8L2NsYXNzbmFtZT4gCit3aXRoIHRoZSA8bGluayBsaW5rZW5kPSJvcGVuanBhLkJyb2tlckltcGwiPjxsaXRlcmFsPm9wZW5qcGEuQnJva2VySW1wbAorPC9saXRlcmFsPjwvbGluaz4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gdGhlIGZ1bGwgY2xhc3MgCituYW1lIG9mIHlvdXIgY3VzdG9tIHN1YmNsYXNzLiBXaGVuIGltcGxlbWVudGluZyB5b3VyIHN1YmNsYXNzLCBjb25zaWRlciB0aGUKK2ZpbmFsaXphdGlvbiBpc3N1ZXMgbWVudGlvbmVkIGluIAorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3J1bnRpbWVfYnJva2VyX2ZpbmFsaXphdGlvbiIvPi4gSXQgbWF5IGJlIGFwcHJvcHJpYXRlCit0byBjcmVhdGUgYSBzdWJ0eXBlIG9mIGJvdGggCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvQnJva2VySW1wbC5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXJJbXBsPC9jbGFzc25hbWU+PC91bGluaz4gYW5kCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmluYWxpemluZ0Jyb2tlckltcGwuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmluYWxpemluZ0Jyb2tlckltcGw8L2NsYXNzbmFtZT48L3VsaW5rPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfanBhIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSlBBIEV4dGVuc2lvbnMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CitUaGUgZm9sbG93aW5nIHNlY3Rpb25zIG91dGxpbmUgdGhlIHJ1bnRpbWUgaW50ZXJmYWNlcyB5b3UgY2FuIHVzZSB0byBhY2Nlc3MKK09wZW5KUEEtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBmcm9tIEpQQS4gRWFjaCBpbnRlcmZhY2UgY29udGFpbnMgc2VydmljZXMgYW5kCitjb252ZW5pZW5jZSBtZXRob2RzIG1pc3NpbmcgZnJvbSB0aGUgSlBBIHNwZWNpZmljYXRpb24uIE9wZW5KUEEgc3RyaXZlcyB0byB1c2UKK3RoZSBzYW1lIG5hbWluZyBjb252ZW50aW9ucyBhbmQgQVBJIHBhdHRlcm5zIGFzIHN0YW5kYXJkIEpQQSBtZXRob2RzIGluIGFsbAorZXh0ZW5zaW9ucywgc28gdGhhdCBPcGVuSlBBIEpETyBBUElzIGZlZWwgYXMgbXVjaCBhcyBwb3NzaWJsZSBsaWtlIHN0YW5kYXJkIEpQQS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK1lvdSBtYXkgaGF2ZSBub3RpY2VkIHRoZSBleGFtcGxlcyB0aHJvdWdob3V0IHRoaXMgZG9jdW1lbnQgdXNpbmcgdGhlCis8bWV0aG9kbmFtZT5PcGVuSlBBUGVyc2lzdGVuY2UuY2FzdDwvbWV0aG9kbmFtZT4gbWV0aG9kcyB0byBjYXN0IGZyb20gc3RhbmRhcmQKK0pQQSBpbnRlcmZhY2VzIHRvIE9wZW5KUEEgZXh0ZW5kZWQgaW50ZXJmYWNlcy4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgcHJhY3RpY2UuCitTb21lIGFwcGxpY2F0aW9uIHNlcnZlciB2ZW5kb3JzIG1heSBwcm94eSBPcGVuSlBBJ3MgSlBBIGltcGxlbWVudGF0aW9uLAorcHJldmVudGluZyBhIHN0cmFpZ2h0IGNhc3QuIDxjbGFzc25hbWU+T3BlbkpQQVBlcnNpc3RlbmNlPC9jbGFzc25hbWU+J3MKKzxtZXRob2RuYW1lPmNhc3Q8L21ldGhvZG5hbWU+IG1ldGhvZHMgd29yayBhcm91bmQgdGhlc2UgcHJveGllcy4KKyAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPiAKK3B1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5IGNhc3QoRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mKTsKK3B1YmxpYyBzdGF0aWMgT3BlbkpQQUVudGl0eU1hbmFnZXIgY2FzdChFbnRpdHlNYW5hZ2VyIGVtKTsKK3B1YmxpYyBzdGF0aWMgT3BlbkpQQVF1ZXJ5IGNhc3QoUXVlcnkgcSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1dlIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgPGNsYXNzbmFtZT5PcGVuSlBBUGVyc2lzdGVuY2UKKzwvY2xhc3NuYW1lPiBoZWxwZXIgPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX3J1bnRpbWVfb3BlbmpwYXBlcnNpc3RlbmNlIj4gCitiZWxvdzwvbGluaz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9ydW50aW1lX2VtZmFjdG9yeSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcnVudGltZV9lbWZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBPcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEEgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeQorICAgICAgICAgICAgICAgIDwvc2VlPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSA8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBRW50aXR5TWFuYWdlckZhY3RvcnkKKzwvY2xhc3NuYW1lPiBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUgYmFzaWMgPGNsYXNzbmFtZT4KK2phdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IHdpdGggT3BlbkpQQS1zcGVjaWZpYworZmVhdHVyZXMuIFRoZSA8Y2xhc3NuYW1lPk9wZW5KUEFFbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY2xhc3NuYW1lPiBvZmZlcnMgQVBJcyB0bworYWNjZXNzIHRoZSBPcGVuSlBBIGRhdGEgYW5kIHF1ZXJ5IGNhY2hlcyBhbmQgdG8gcGVyZm9ybSBvdGhlciBPcGVuSlBBLXNwZWNpZmljIAorb3BlcmF0aW9ucy4gU2VlIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXJGYWN0b3J5Lmh0bWwiPgoraW50ZXJmYWNlIEphdmFkb2M8L3VsaW5rPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfZW0iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcnVudGltZV9lbSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEEgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEFFbnRpdHlNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9zZWU+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQWxsIE9wZW5KUEEgPGNsYXNzbmFtZT5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBpbXBsZW1lbnQgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcGVuSlBBRW50aXR5TWFuYWdlci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+Cis8L3VsaW5rPiBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIHN0YW5kYXJkIDxjbGFzc25hbWU+CitqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+LiBKdXN0IGFzIHRoZSBzdGFuZGFyZCA8Y2xhc3NuYW1lPgorRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpcyB0aGUgcHJpbWFyeSB3aW5kb3cgaW50byBKUEEgc2VydmljZXMsIHRoZQorPGNsYXNzbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBpcyB0aGUgcHJpbWFyeSB3aW5kb3cgZnJvbSBKUEEgaW50bworT3BlbkpQQS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5LiBXZSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGludmVzdGlnYXRlIHRoZSBBUEkKK2V4dGVuc2lvbnMgdGhpcyBpbnRlcmZhY2UgY29udGFpbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9ydW50aW1lX2pwYXF1ZXJ5Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBPcGVuSlBBUXVlcnkKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9ydW50aW1lX2pwYXF1ZXJ5Ij4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgT3BlbkpQQVF1ZXJ5CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBRdWVyeQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBPcGVuSlBBIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgICAgICBPcGVuSlBBUXVlcnkKKyAgICAgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGV4dGVuZHMgSlBBJ3Mgc3RhbmRhcmQgcXVlcnkgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZSA8Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLk9wZW5KUEFRdWVyeTwvY2xhc3NuYW1lPiBpbnRlcmZhY2UuIFNlZSBpdHMKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFRdWVyeS5odG1sIj5KYXZhZG9jCis8L3VsaW5rPiBmb3IgZGV0YWlscyBvbiB0aGUgY29udmVuaWVuY2UgbWV0aG9kcyBpdCBwcm92aWRlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfanBhZXh0ZW50Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeHRlbnQKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9ydW50aW1lX2pwYWV4dGVudCI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIEV4dGVudAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRXh0ZW50CisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEEgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDxzZWU+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEFFeHRlbnQKKyAgICAgICAgICAgICAgICA8L3NlZT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitBbiA8Y2xhc3NuYW1lPkV4dGVudDwvY2xhc3NuYW1lPiBpcyBhIGxvZ2ljYWwgdmlldyBvZiBhbGwgcGVyc2lzdGVudCBpbnN0YW5jZXMKK29mIGEgZ2l2ZW4gZW50aXR5IGNsYXNzLCBwb3NzaWJseSBpbmNsdWRpbmcgc3ViY2xhc3Nlcy4gT3BlbkpQQSBhZGRzIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvRXh0ZW50Lmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuRXh0ZW50PC9jbGFzc25hbWU+PC91bGluaz4gY2xhc3MgdG8gdGhlIHNldCBvZgorSmF2YSBQZXJzaXN0ZW5jZSBBUElzLiBUaGUgZm9sbG93aW5nIGNvZGUgaWxsdXN0cmF0ZXMgaXRlcmF0aW5nIG92ZXIgYWxsCitpbnN0YW5jZXMgb2YgdGhlIDxjbGFzc25hbWU+TWFnYXppbmU8L2NsYXNzbmFtZT4gZW50aXR5LCB3aXRob3V0IHN1YmNsYXNzZXM6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX3J1bnRpbWVfanBhZXh0ZW50ZXgiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgVXNpbmcgYSBKUEEgRXh0ZW50CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLi4uCisKK09wZW5KUEFFbnRpdHlNYW5hZ2VyIGtlbSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKTsKK0V4dGVudCZsdDtNYWdhemluZSZndDsgbWFncyA9IGtlbS5nZXRFeHRlbnQoTWFnYXppbmUuY2xhc3MsIGZhbHNlKTsKK2ZvciAoTWFnYXppbmUgbSA6IG1hZ3MpCisgICAgcHJvY2Vzc01hZ2F6aW5lIChtKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9ydW50aW1lX2pwYWNhY2hlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBTdG9yZUNhY2hlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcnVudGltZV9qcGFjYWNoZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIFN0b3JlQ2FjaGUKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gYWRkaXRpb24gdG8gdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPiBvYmplY3QgY2FjaGUgbWFuZGF0ZWQgYnkKK3RoZSBKUEEgc3BlY2lmaWNhdGlvbiwgT3BlbkpQQSBpbmNsdWRlcyBhIGZsZXhpYmxlIGRhdGFzdG9yZS1sZXZlbCBjYWNoZS4gWW91CitjYW4gYWNjZXNzIHRoaXMgY2FjaGUgZnJvbSB5b3VyIEpQQSBjb2RlIHVzaW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvU3RvcmVDYWNoZS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLlN0b3JlQ2FjaGU8L2NsYXNzbmFtZT48L3VsaW5rPiBmYWNhZGUuCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY2FjaGUiLz4gaGFzIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIE9wZW5KUEEncworZGF0YSBjYWNoaW5nIHN5c3RlbSwgaW5jbHVkaW5nIHRoZSA8Y2xhc3NuYW1lPlN0b3JlQ2FjaGU8L2NsYXNzbmFtZT4gZmFjYWRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfcnVudGltZV9qcGFxdWVyeWNhY2hlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBRdWVyeVJlc3VsdENhY2hlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcnVudGltZV9qcGFxdWVyeWNhY2hlIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUXVlcnlSZXN1bHRDYWNoZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGNhbiBjYWNoZSBxdWVyeSByZXN1bHRzIGFzIHdlbGwgYXMgcGVyc2lzdGVudCBvYmplY3QgZGF0YS4gVGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9RdWVyeVJlc3VsdENhY2hlLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuUXVlcnlSZXN1bHRDYWNoZTwvY2xhc3NuYW1lPjwvdWxpbms+IAoraXMgYW4gSlBBLWZsYXZvcmVkIGZhY2FkZSB0byBPcGVuSlBBJ3MgaW50ZXJuYWwgcXVlcnkgY2FjaGUuIFNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NhY2hlX3F1ZXJ5Ii8+IGZvciBkZXRhaWxzIG9uIHF1ZXJ5IGNhY2hpbmcgaW4KK09wZW5KUEEuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9ydW50aW1lX2pwYWZldGNoIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBGZXRjaFBsYW4KKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9ydW50aW1lX2pwYWZldGNoIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgRmV0Y2hQbGFuCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBlYWdlciBmZXRjaGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2VlYWxzbz4KKyAgICAgICAgICAgICAgICAgICAgRmV0Y2hQbGFuCisgICAgICAgICAgICAgICAgPC9zZWVhbHNvPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK01hbnkgb2YgdGhlIGFmb3JlbWVudGlvbmVkIE9wZW5KUEEgaW50ZXJmYWNlcyBnaXZlIHlvdSBhY2Nlc3MgdG8gYW4gPGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5GZXRjaFBsYW48L2NsYXNzbmFtZT4gaW5zdGFuY2UuIFRoZSA8Y2xhc3NuYW1lPgorRmV0Y2hQbGFuPC9jbGFzc25hbWU+IGFsbG93cyB5b3UgdG8gZXhlcmNpc2Ugc29tZSBjb250cm9sIG92ZXIgaG93IG9iamVjdHMgYXJlCitmZXRjaGVkIGZyb20gdGhlIGRhdGFzdG9yZSwgaW5jbHVkaW5nIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9kYnNldHVwX2xycyI+CitsYXJnZSByZXN1bHQgc2V0IHN1cHBvcnQ8L2xpbms+LCA8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfZmV0Y2giPmN1c3RvbSBmZXRjaAorZ3JvdXBzPC9saW5rPiwgYW5kIDxsaW5rIGxpbmtlbmQ9InJlZl9ndWlkZV9sb2NraW5nIj5sb2NrIGxldmVsczwvbGluaz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgZ29lcyBvbmUgc3RlcCBmdXJ0aGVyLCBleHRlbmRpbmcgPGNsYXNzbmFtZT5GZXRjaFBsYW48L2NsYXNzbmFtZT4gd2l0aAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvamRiYy9KREJDRmV0Y2hQbGFuLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuamRiYy5KREJDRmV0Y2hQbGFuPC9jbGFzc25hbWU+PC91bGluaz4KK3RvIGFkZCBhZGRpdGlvbmFsIEpEQkMtc3BlY2lmaWMgdHVuaW5nIG1ldGhvZHMuIFVubGVzcyB5b3UgaGF2ZSBjdXN0b21pemVkIAorT3BlbkpQQSB0byB1c2UgYSBub24tcmVsYXRpb25hbCBiYWNrLWVuZCAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV9hYnN0cmFjdHN0b3JlIi8+ICksIGFsbCA8Y2xhc3NuYW1lPgorRmV0Y2hQbGFuPC9jbGFzc25hbWU+cyBpbiBPcGVuSlBBIGltcGxlbWVudCA8Y2xhc3NuYW1lPgorSkRCQ0ZldGNoUGxhbjwvY2xhc3NuYW1lPiwgc28gZmVlbCBmcmVlIHRvIGNhc3QgdG8gdGhpcyBpbnRlcmZhY2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0ZldGNoIHBsYW5zIHBhc3Mgb24gZnJvbSBwYXJlbnQgY29tcG9uZW50cyB0byBjaGlsZCBjb21wb25lbnRzLiBUaGUgPGNsYXNzbmFtZT4KK0VudGl0eU1hbmFnZXJGYWN0b3J5PC9jbGFzc25hbWU+IHNldHRpbmdzICh2aWEgeW91ciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMpCitmb3IgdGhpbmdzIGxpa2UgdGhlIGZldGNoIHNpemUsIHJlc3VsdCBzZXQgdHlwZSwgYW5kIGN1c3RvbSBmZXRjaCBncm91cHMgYXJlCitwYXNzZWQgb24gdG8gdGhlIGZldGNoIHBsYW4gb2YgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPnMgaXQKK3Byb2R1Y2VzLiBUaGUgc2V0dGluZ3Mgb2YgZWFjaCA8Y2xhc3NuYW1lPkVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4sIGluIHR1cm4sCithcmUgcGFzc2VkIG9uIHRvIGVhY2ggPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiBhbmQgPGNsYXNzbmFtZT5FeHRlbnQKKzwvY2xhc3NuYW1lPiBpdCByZXR1cm5zLiBOb3RlIHRoYXQgdGhlIG9wcG9zaXRlLCBob3dldmVyLCBpcyBub3QgdHJ1ZS4gTW9kaWZ5aW5nCit0aGUgZmV0Y2ggcGxhbiBvZiBhIDxjbGFzc25hbWU+UXVlcnk8L2NsYXNzbmFtZT4gb3IgPGNsYXNzbmFtZT5FeHRlbnQKKzwvY2xhc3NuYW1lPiBkb2VzIG5vdCBhZmZlY3QgdGhlIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPidzCitjb25maWd1cmF0aW9uLiBMaWtld2lzZSwgbW9kaWZ5aW5nIGFuIDxjbGFzc25hbWU+RW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPidzCitjb25maWd1cmF0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgPGNsYXNzbmFtZT4gRW50aXR5TWFuYWdlckZhY3Rvcnk8L2NsYXNzbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKzx4cmVmIGxpbmtlbmQ9InJlZl9ndWlkZV9mZXRjaCIvPiBpbmNsdWRlcyBleGFtcGxlcyB1c2luZyA8Y2xhc3NuYW1lPgorRmV0Y2hQbGFuPC9jbGFzc25hbWU+cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfb3BlbmpwYXBlcnNpc3RlbmNlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBPcGVuSlBBUGVyc2lzdGVuY2UKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9ydW50aW1lX29wZW5qcGFwZXJzaXN0ZW5jZSI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIE9wZW5KUEFQZXJzaXN0ZW5jZQorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+Cis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9wZXJzaXN0ZW5jZS9PcGVuSlBBUGVyc2lzdGVuY2UuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS5PcGVuSlBBUGVyc2lzdGVuY2U8L2NsYXNzbmFtZT48L3VsaW5rPgoraXMgYSBzdGF0aWMgaGVscGVyIGNsYXNzIHRoYXQgYWRkcyBPcGVuSlBBLXNwZWNpZmljIHV0aWxpdHkgbWV0aG9kcyB0byAKKzxjbGFzc25hbWU+amF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U8L2NsYXNzbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9sb2NraW5nIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgT2JqZWN0IExvY2tpbmcKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9ja2luZyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK0NvbnRyb2xsaW5nIGhvdyBhbmQgd2hlbiBvYmplY3RzIGFyZSBsb2NrZWQgaXMgYW4gaW1wb3J0YW50IHBhcnQgb2YgbWF4aW1pemluZwordGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgbG9hZC4gVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBPcGVuSlBBJ3MKK0FQSXMgZm9yIGV4cGxpY2l0IGxvY2tpbmcsIGFzIHdlbGwgYXMgaXRzIHJ1bGVzIGZvciBpbXBsaWNpdCBsb2NraW5nLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19kZWZhdWx0Ij4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBDb25maWd1cmluZyBEZWZhdWx0IExvY2tpbmcKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9sb2NraW5nX2RlZmF1bHQiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGxldmVscworICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBSZWFkTG9ja0xldmVsCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBXcml0ZUxvY2tMZXZlbAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorWW91IGNhbiBjb250cm9sIE9wZW5KUEEncyBkZWZhdWx0IHRyYW5zYWN0aW9uYWwgcmVhZCBhbmQgd3JpdGUgbG9jayBsZXZlbHMKK3Rocm91Z2ggdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuUmVhZExvY2tMZXZlbCI+PGxpdGVyYWw+CitvcGVuanBhLlJlYWRMb2NrTGV2ZWw8L2xpdGVyYWw+PC9saW5rPiBhbmQKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuV3JpdGVMb2NrTGV2ZWwiPjxsaXRlcmFsPm9wZW5qcGEuV3JpdGVMb2NrTGV2ZWw8L2xpdGVyYWw+Cis8L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4gRWFjaCBwcm9wZXJ0eSBhY2NlcHRzIGEgdmFsdWUgb2YgPGxpdGVyYWw+Citub25lPC9saXRlcmFsPiwgPGxpdGVyYWw+cmVhZDwvbGl0ZXJhbD4sIDxsaXRlcmFsPndyaXRlPC9saXRlcmFsPiwgb3IgYSBudW1iZXIKK2NvcnJlc3BvbmRpbmcgdG8gYSBsb2NrIGxldmVsIGRlZmluZWQgYnkgdGhlCis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfbG9ja2luZ19sb2NrbWdyIj5sb2NrIG1hbmFnZXI8L2xpbms+IGluIHVzZS4gVGhlc2UKK3Byb3BlcnRpZXMgYXBwbHkgb25seSB0byBub24tb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnM7IGR1cmluZyBvcHRpbWlzdGljCit0cmFuc2FjdGlvbnMsIE9wZW5KUEEgbmV2ZXIgbG9ja3Mgb2JqZWN0cyBieSBkZWZhdWx0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBMb2NrVGltZW91dAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICB0aW1lb3V0CisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK1lvdSBjYW4gY29udHJvbCB0aGUgZGVmYXVsdCBhbW91bnQgb2YgdGltZSBPcGVuSlBBIHdpbGwgd2FpdCB3aGVuIHRyeWluZyB0bworb2J0YWluIGxvY2tzIHRocm91Z2ggdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuTG9ja1RpbWVvdXQiPjxsaXRlcmFsPgorb3BlbmpwYS5Mb2NrVGltZW91dDwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIFNldCB0aGlzIHByb3BlcnR5Cit0byB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB5b3UgYXJlIHdpbGxpbmcgdG8gd2FpdCBmb3IgYSBsb2NrIGJlZm9yZSBPcGVuSlBBCit3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgb3IgdG8gLTEgZm9yIG5vIGxpbWl0LiBJdCBkZWZhdWx0cyB0byAtMS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19kZWZhdWx0X2NvbmYiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZyBEZWZhdWx0IExvY2sgTGV2ZWxzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLlJlYWRMb2NrTGV2ZWwiIHZhbHVlPSJub25lIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Xcml0ZUxvY2tMZXZlbCIgdmFsdWU9IndyaXRlIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5Mb2NrVGltZW91dCIgdmFsdWU9IjMwMDAwIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19ydW50aW1lIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBDb25maWd1cmluZyBMb2NrIExldmVscyBhdCBSdW50aW1lCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9ja2luZ19ydW50aW1lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBydW50aW1lIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitBdCBydW50aW1lLCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGxvY2sgbGV2ZWxzIHRocm91Z2ggdGhlIDxjbGFzc25hbWU+CitGZXRjaFBsYW48L2NsYXNzbmFtZT4gaW50ZXJmYWNlIGRlc2NyaWJlZCBhYm92ZS4gQXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCitkYXRhc3RvcmUgdHJhbnNhY3Rpb24sIE9wZW5KUEEgaW5pdGlhbGl6ZXMgdGhlIDxjbGFzc25hbWU+IEVudGl0eU1hbmFnZXIKKzwvY2xhc3NuYW1lPidzIGZldGNoIHBsYW4gd2l0aCB0aGUgZGVmYXVsdCBsb2NrIGxldmVscyBhbmQgdGltZW91dHMgZGVzY3JpYmVkCitpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gQnkgY2hhbmdpbmcgdGhlIGZldGNoIHBsYW4ncyBsb2NraW5nIHByb3BlcnRpZXMsIHlvdQorY2FuIGNvbnRyb2wgaG93IG9iamVjdHMgbG9hZGVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIHRyYW5zYWN0aW9uIGFyZQorbG9ja2VkLiBZb3UgY2FuIGFsc28gdXNlIHRoZSBmZXRjaCBwbGFuIG9mIGFuIGluZGl2aWR1YWwgPGNsYXNzbmFtZT5RdWVyeQorPC9jbGFzc25hbWU+IHRvIGFwcGx5IHlvdXIgbG9ja2luZyBjaGFuZ2VzIG9ubHkgdG8gb2JqZWN0cyBsb2FkZWQgdGhyb3VnaCB0aGF0Cis8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIExvY2tNb2RlVHlwZSBnZXRSZWFkTG9ja01vZGUoKTsKK3B1YmxpYyBGZXRjaFBsYW4gc2V0UmVhZExvY2tNb2RlKExvY2tNb2RlVHlwZSBtb2RlKTsKK3B1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0V3JpdGVMb2NrTW9kZSgpOworcHVibGljIEZldGNoUGxhbiBzZXRXcml0ZUxvY2tNb2RlKExvY2tNb2RlVHlwZSBtb2RlKTsKK2xvbmcgZ2V0TG9ja1RpbWVvdXQoKTsKK0ZldGNoUGxhbiBzZXRMb2NrVGltZW91dChsb25nIHRpbWVvdXQpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorQ29udHJvbGxpbmcgbG9ja2luZyB0aHJvdWdoIHRoZXNlIHJ1bnRpbWUgQVBJcyB3b3JrcyBldmVuIGR1cmluZyBvcHRpbWlzdGljCit0cmFuc2FjdGlvbnMuIEF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uLCBPcGVuSlBBIHJlc2V0cyB0aGUgZmV0Y2ggcGxhbidzCitsb2NrIGxldmVscyB0byA8bGl0ZXJhbD5ub25lPC9saXRlcmFsPi4gWW91IGNhbm5vdCBsb2NrIG9iamVjdHMgb3V0c2lkZSBvZiBhCit0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19mZXRjaCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIFJ1bnRpbWUgTG9jayBMZXZlbHMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCisuLi4KKworRW50aXR5TWFuYWdlciBlbSA9IC4uLjsKK2VtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKworLy8gbG9hZCBzdG9jayB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHVwZGF0ZSBhdCB3cml0ZSBsb2NrIG1vZGUKK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSgic2VsZWN0IHMgZnJvbSBTdG9jayBzIHdoZXJlIHN5bWJvbCA9IDpzIik7CitxLnNldFBhcmFtZXRlcigicyIsIHN5bWJvbCk7CitPcGVuSlBBUXVlcnkgb3EgPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChxKTsKK0ZldGNoUGxhbiBmZXRjaCA9IG9xLmdldEZldGNoUGxhbiAoKTsKK2ZldGNoLnNldFJlYWRMb2NrTW9kZShMb2NrTW9kZVR5cGUuV1JJVEUpOworZmV0Y2guc2V0TG9ja1RpbWVvdXQoMzAwMCk7IC8vIDMgc2Vjb25kcworU3RvY2sgc3RvY2sgPSAoU3RvY2spIHEuZ2V0U2luZ2xlUmVzdWx0KCk7CisKKy8vIGxvYWQgYW4gb2JqZWN0IHdlIGRvbid0IG5lZWQgbG9ja2VkIGF0IG5vbmUgbG9jayBtb2RlCitmZXRjaCA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtKS5nZXRGZXRjaFBsYW4oKTsKK2ZldGNoLnNldFJlYWRMb2NrTW9kZShudWxsKTsKK01hcmtldCBtYXJrZXQgPSBlbS5maW5kKE1hcmtldC5jbGFzcywgbWFya2V0SWQpOworCitzdG9jay5zZXRQcmljZShtYXJrZXQuY2FsY3VsYXRlUHJpY2Uoc3RvY2spKTsKK2VtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19hcGlzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBPYmplY3QgTG9ja2luZyBBUElzCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9ja2luZ19hcGlzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBydW50aW1lIEFQSXMKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitJbiBhZGRpdGlvbiB0byBhbGxvd2luZyB5b3UgdG8gY29udHJvbCBpbXBsaWNpdCBsb2NraW5nIGxldmVscywgT3BlbkpQQSBwcm92aWRlcworZXhwbGljaXQgQVBJcyB0byBsb2NrIG9iamVjdHMgYW5kIHRvIHJldHJpZXZlIHRoZWlyIGN1cnJlbnQgbG9jayBsZXZlbC4KKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBMb2NrTW9kZVR5cGUgT3BlbkpQQUVudGl0eU1hbmFnZXIuZ2V0TG9ja01vZGUoT2JqZWN0IHBjKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1JldHVybnMgdGhlIGxldmVsIGF0IHdoaWNoIHRoZSBnaXZlbiBvYmplY3QgaXMgY3VycmVudGx5IGxvY2tlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCis8dWxpbmsgdXJsPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS81L2RvY3MvYXBpL2phdmF4L3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXIuaHRtbCI+Cis8bWV0aG9kbmFtZT5FbnRpdHlNYW5hZ2VyLmxvY2soT2JqZWN0LCBMb2NrTW9kZVR5cGUpPC9tZXRob2RuYW1lPjwvdWxpbms+CittZXRob2QsIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQUVudGl0eU1hbmFnZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPk9wZW5KUEFFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+PC91bGluaz4gZXhwb3NlcyB0aGUgZm9sbG93aW5nCittZXRob2RzIHRvIGxvY2sgb2JqZWN0cyBleHBsaWNpdGx5OgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorcHVibGljIHZvaWQgbG9jayhPYmplY3QgcGMpOworcHVibGljIHZvaWQgbG9jayhPYmplY3QgcGMsIExvY2tNb2RlVHlwZSBtb2RlLCBsb25nIHRpbWVvdXQpOworcHVibGljIHZvaWQgbG9ja0FsbChPYmplY3QuLi4gcGNzKTsKK3B1YmxpYyB2b2lkIGxvY2tBbGwoT2JqZWN0Li4uIHBjcywgTG9ja01vZGVUeXBlIG1vZGUsIGxvbmcgdGltZW91dCk7CitwdWJsaWMgdm9pZCBsb2NrQWxsKENvbGxlY3Rpb24gcGNzKTsKK3B1YmxpYyB2b2lkIGxvY2tBbGwoQ29sbGVjdGlvbiBwY3MsIExvY2tNb2RlVHlwZSBtb2RlLCBsb25nIHRpbWVvdXQpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorTWV0aG9kcyB0aGF0IGRvIG5vdCB0YWtlIGEgbG9jayBsZXZlbCBvciB0aW1lb3V0IHBhcmFtZXRlciBkZWZhdWx0IHRvIHRoZQorY3VycmVudCBmZXRjaCBwbGFuLiBUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlc2UgbWV0aG9kcyBpbiBhY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0icmVmX2d1aWRlX2xvY2tpbmdfZXhwbGljaXQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgTG9ja2luZyBBUElzCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuKjsKKworLy8gcmV0cmlldmUgdGhlIGxvY2sgbGV2ZWwgb2YgYW4gb2JqZWN0CitPcGVuSlBBRW50aXR5TWFuYWdlciBvZW0gPSBPcGVuSlBBUGVyc2lzdGVuY2UuY2FzdChlbSk7CitTdG9jayBzdG9jayA9IC4uLjsKK0xvY2tNb2RlVHlwZSBsZXZlbCA9IG9lbS5nZXRMb2NrTW9kZShzdG9jayk7CitpZiAobGV2ZWwgPT0gT3BlbkpQQU1vZGVUeXBlLldSSVRFKSAuLi4KKworLi4uCisKK29lbS5zZXRPcHRpbWlzdGljKHRydWUpOworb2VtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4gKCk7CisKKy8vIG92ZXJyaWRlIGRlZmF1bHQgb2Ygbm90IGxvY2tpbmcgZHVyaW5nIGFuIG9wdCB0cmFucyB0byBsb2NrIHN0b2NrIG9iamVjdAorb2VtLmxvY2soc3RvY2ssIExvY2tNb2RlVHlwZS5XUklURSwgMTAwMCk7CitzdG9jay5zZXRQcmljZShtYXJrZXQuY2FsY3VsYXRlUHJpY2Uoc3RvY2spKTsKKworb2VtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19sb2NrbWdyIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBMb2NrIE1hbmFnZXIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9sb2NraW5nX2xvY2ttZ3IiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2NraW5nCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIExvY2tNYW5hZ2VyCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgTG9ja01hbmFnZXIKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KK09wZW5KUEEgZGVsZWdhdGVzIHRoZSBhY3R1YWwgd29yayBvZiBsb2NraW5nIG9iamVjdHMgdG8gdGhlIHN5c3RlbSdzCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvTG9ja01hbmFnZXIuaHRtbCI+PGNsYXNzbmFtZT4KK29yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuTG9ja01hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPi4gVGhpcyBwbHVnaW4gaXMKK2NvbnRyb2xsZWQgYnkgdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuTG9ja01hbmFnZXIiPjxsaXRlcmFsPgorb3BlbmpwYS5Mb2NrTWFuYWdlcjwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIFlvdSBjYW4gd3JpdGUgeW91cgorb3duIGxvY2sgbWFuYWdlciwgb3IgdXNlIG9uZSBvZiB0aGUgYnVuZGxlZCBvcHRpb25zOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+cGVzc2ltaXN0aWM8L2xpdGVyYWw+OiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL1Blc3NpbWlzdGljTG9ja01hbmFnZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm8KK3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLlBlc3NpbWlzdGljTG9ja01hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPiwgd2hpY2gKK3VzZXMgU0VMRUNUIEZPUiBVUERBVEUgc3RhdGVtZW50cyAob3IgdGhlIGRhdGFiYXNlJ3MgZXF1aXZhbGVudCkgdG8gbG9jayB0aGUgCitkYXRhYmFzZSByb3dzIGNvcnJlc3BvbmRpbmcgdG8gbG9ja2VkIG9iamVjdHMuIFRoaXMgbG9jaworbWFuYWdlciBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlYWQgbG9ja3MgYW5kIHdyaXRlIGxvY2tzOyBhbGwgbG9ja3MgYXJlCit3cml0ZSBsb2Nrcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSA8bGl0ZXJhbD5wZXNzaW1pc3RpYzwvbGl0ZXJhbD4gTG9ja01hbmFnZXIgY2FuIGJlIGNvbmZpZ3VlZCB0byBhZGRpdGlvbmFsbHkKK3BlcmZvcm0gdGhlIHZlcnNpb24gY2hlY2tpbmcgYW5kIGluY3JlbWVudGluZyBiZWhhdmlvciBvZiB0aGUgPGxpdGVyYWw+dmVyc2lvbgorPC9saXRlcmFsPiBsb2NrIG1hbmFnZXIgZGVzY3JpYmVkIGJlbG93IGJ5IHNldHRpbmcgaXRzIDxsaXRlcmFsPgorVmVyc2lvbkNoZWNrT25SZWFkTG9jazwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlZlcnNpb25VcGRhdGVPbldyaXRlTG9jazwvbGl0ZXJhbD4KK3Byb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkxvY2tNYW5hZ2VyIiB2YWx1ZT0icGVzc2ltaXN0aWMoVmVyc2lvbkNoZWNrT25SZWFkTG9jaz10cnVlLFZlcnNpb25VcGRhdGVPbldyaXRlTG9jaz10cnVlKSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5ub25lPC9saXRlcmFsPjogQW4gYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL05vbmVMb2NrTWFuYWdlci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ob25lTG9ja01hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPiwgd2hpY2gKK2RvZXMgbm90IHBlcmZvcm0gYW55IGxvY2tpbmcgYXQgYWxsLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+dmVyc2lvbjwvbGl0ZXJhbD46IEFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2tlcm5lbC9WZXJzaW9uTG9ja01hbmFnZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuVmVyc2lvbkxvY2tNYW5hZ2VyPC9jbGFzc25hbWU+PC91bGluaz4uCitUaGlzIGxvY2sgbWFuYWdlciBkb2VzIG5vdCBwZXJmb3JtIGFueSBleGNsdXNpdmUgbG9ja2luZywgYnV0IGluc3RlYWQgZW5zdXJlcworcmVhZCBjb25zaXN0ZW5jeSBieSB2ZXJpZnlpbmcgdGhhdCB0aGUgdmVyc2lvbiBvZiBhbGwgcmVhZC1sb2NrZWQgaW5zdGFuY2VzIGlzCit1bmNoYW5nZWQgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24uIEZ1cnRoZXJtb3JlLCBhIHdyaXRlIGxvY2sgd2lsbCBmb3JjZSBhbgoraW5jcmVtZW50IHRvIHRoZSB2ZXJzaW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uLCBldmVuIGlmIHRoZSBvYmplY3QgaXMKK25vdCBvdGhlcndpc2UgbW9kaWZpZWQuIFRoaXMgZW5zdXJlcyByZWFkIGNvbnNpc3RlbmN5IHdpdGggbm9uLWJsb2NraW5nCitiZWhhdmlvci4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgPGxpdGVyYWw+b3BlbmpwYS5Mb2NrTWFuYWdlcjwvbGl0ZXJhbD4gc2V0dGluZyBpbiBKUEEuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0luIG9yZGVyIGZvciB0aGUgPGxpdGVyYWw+dmVyc2lvbjwvbGl0ZXJhbD4gbG9jayBtYW5hZ2VyIHRvIHByZXZlbnQgdGhlIGRpcnR5CityZWFkIHBoZW5vbWVub24sIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUncyB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgbXVzdCBiZQorc2V0IHRvIHRoZSBlcXVpdmFsZW50IG9mICJyZWFkIGNvbW1pdHRlZCIgb3IgaGlnaGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfbG9ja2luZ19kaXNhYmxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIERpc2FibGluZyBMb2NraW5nCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJvcGVuanBhLkxvY2tNYW5hZ2VyIiB2YWx1ZT0ibm9uZSIvJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2xvY2tpbmdfcnVsZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFJ1bGVzIGZvciBMb2NraW5nIEJlaGF2aW9yCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9ja2luZ19ydWxlcyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGxvY2tpbmcKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfbG9ja2luZ19ydWxlcyI+CisgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIGxhenkgbG9hZGluZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBsb2NraW5nIGJlaGF2aW9yCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorQWR2YW5jZWQgcGVyc2lzdGVuY2UgY29uY2VwdHMgbGlrZSBsYXp5LWxvYWRpbmcgYW5kIG9iamVjdCB1bmlxdWluZyBjcmVhdGUKK3NldmVyYWwgbG9ja2luZyBjb3JuZXItY2FzZXMuIFRoZSBydWxlcyBiZWxvdyBvdXRsaW5lIE9wZW5KUEEncyBpbXBsaWNpdCBsb2NraW5nCitiZWhhdmlvciBpbiB0aGVzZSBjYXNlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiBhbiBvYmplY3QncyBzdGF0ZSBpcyBmaXJzdCByZWFkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLCB0aGUgb2JqZWN0IGlzIGxvY2tlZAorYXQgdGhlIGZldGNoIHBsYW4ncyBjdXJyZW50IHJlYWQgbG9jayBsZXZlbC4gRnV0dXJlIHJlYWRzIG9mIGFkZGl0aW9uYWwgbGF6eQorc3RhdGUgZm9yIHRoZSBvYmplY3Qgd2lsbCB1c2UgdGhlIHNhbWUgcmVhZCBsb2NrIGxldmVsLCBldmVuIGlmIHRoZSBmZXRjaCBwbGFuJ3MKK2xldmVsIGhhcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiBhbiBvYmplY3QncyBzdGF0ZSBpcyBmaXJzdCBtb2RpZmllZCB3aXRoaW4gYSB0cmFuc2FjdGlvbiwgdGhlIG9iamVjdCBpcworbG9ja2VkIGF0IHRoZSB3cml0ZSBsb2NrIGxldmVsIGluIGVmZmVjdCB3aGVuIHRoZSBvYmplY3Qgd2FzIGZpcnN0IHJlYWQsIGV2ZW4gaWYKK3RoZSBmZXRjaCBwbGFuJ3MgbGV2ZWwgaGFzIGNoYW5nZWQuIElmIHRoZSBvYmplY3Qgd2FzIG5vdCByZWFkIHByZXZpb3VzbHksIHRoZQorY3VycmVudCB3cml0ZSBsb2NrIGxldmVsIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIG9iamVjdHMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggYSBwZXJzaXN0ZW50IHJlbGF0aW9uIGZpZWxkLCB0aGUgcmVsYXRlZAorb2JqZWN0cyBhcmUgbG9hZGVkIHdpdGggdGhlIGZldGNoIHBsYW4ncyBjdXJyZW50IGxvY2sgbGV2ZWxzLCBub3QgdGhlIGxvY2sKK2xldmVscyBvZiB0aGUgb2JqZWN0IG93bmluZyB0aGUgZmllbGQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuZXZlciBhbiBvYmplY3QgaXMgYWNjZXNzZWQgd2l0aGluIGEgdHJhbnNhY3Rpb24sIHRoZSBvYmplY3QgaXMgcmUtbG9ja2VkIGF0Cit0aGUgY3VycmVudCByZWFkIGxvY2sgbGV2ZWwuIFRoZSBjdXJyZW50IHJlYWQgYW5kIHdyaXRlIGxvY2sgbGV2ZWxzIGJlY29tZSB0aG9zZQordGhhdCB0aGUgb2JqZWN0ICJyZW1lbWJlcnMiIGFjY29yZGluZyB0byBydWxlcyBvbmUgYW5kIHR3byBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0lmIHlvdSBsb2NrIGFuIG9iamVjdCBleHBsaWNpdGx5IHRocm91Z2ggdGhlIEFQSXMgZGVtb25zdHJhdGVkIGFib3ZlLCBpdCBpcworcmUtbG9ja2VkIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwuIFRoaXMgbGV2ZWwgYWxzbyBiZWNvbWVzIGJvdGggdGhlIHJlYWQgYW5kCit3cml0ZSBsZXZlbCB0aGF0IHRoZSBvYmplY3QgInJlbWVtYmVycyIgYWNjb3JkaW5nIHRvIHJ1bGVzIG9uZSBhbmQgdHdvIGFib3ZlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorV2hlbiBhbiBvYmplY3QgaXMgYWxyZWFkeSBsb2NrZWQgYXQgYSBnaXZlbiBsb2NrIGxldmVsLCByZS1sb2NraW5nIGF0IGEgbG93ZXIKK2xldmVsIGhhcyBubyBlZmZlY3QuIExvY2tzIGNhbm5vdCBiZSBkb3duZ3JhZGVkIGR1cmluZyBhIHRyYW5zYWN0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9sb2NraW5nX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9ucworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2xvY2tpbmdfaXNzdWVzIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgbG9ja2luZworICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICBjYXZlYXRzCisgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgIDxwYXJhPgorRHVlIHRvIHBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBkYXRhYmFzZSBsaW1pdGF0aW9ucywgbG9ja2luZyBjYW5ub3QgYmUgcGVyZmVjdC4KK1lvdSBzaG91bGQgYmUgYXdhcmUgb2YgdGhlIGlzc3VlcyBvdXRsaW5lZCBpbiB0aGlzIHNlY3Rpb24sIGFzIHRoZXkgbWF5IGFmZmVjdAoreW91ciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1R5cGljYWxseSwgZHVyaW5nIG9wdGltaXN0aWMgdHJhbnNhY3Rpb25zIE9wZW5KUEEgZG9lcyBub3Qgc3RhcnQgYW4gYWN0dWFsCitkYXRhYmFzZSB0cmFuc2FjdGlvbiB1bnRpbCB5b3UgZmx1c2ggb3IgdGhlIG9wdGltaXN0aWMgdHJhbnNhY3Rpb24gY29tbWl0cy4gVGhpcworYWxsb3dzIGZvciB2ZXJ5IGxvbmctbGl2ZWQgdHJhbnNhY3Rpb25zIHdpdGhvdXQgY29uc3VtaW5nIGRhdGFiYXNlIHJlc291cmNlcy4KK1doZW4gdXNpbmcgdGhlIHBlc3NpbWlzdGljIGxvY2sgbWFuYWdlciwgaG93ZXZlciwgT3BlbkpQQSBtdXN0IGJlZ2luIGEgZGF0YWJhc2UKK3RyYW5zYWN0aW9uIHdoZW5ldmVyIHlvdSBkZWNpZGUgdG8gbG9jayBhbiBvYmplY3QgZHVyaW5nIGFuIG9wdGltaXN0aWMKK3RyYW5zYWN0aW9uLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHBlc3NpbWlzdGljIGxvY2sgbWFuYWdlciB1c2VzIGRhdGFiYXNlIGxvY2tzLCAKK2FuZCBkYXRhYmFzZXMgY2Fubm90IGxvY2sgcm93cyB3aXRob3V0IGEgdHJhbnNhY3Rpb24gaW4gcHJvZ3Jlc3MuIE9wZW5KUEEgd2lsbCAKK2xvZyBhbiBJTkZPIG1lc3NhZ2UgdG8gdGhlIDxsaXRlcmFsPm9wZW5qcGEuUnVudGltZTwvbGl0ZXJhbD4gbG9nZ2luZyBjaGFubmVsIAord2hlbiBpdCBiZWdpbnMgYSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24ganVzdCB0byBsb2NrIGFuIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0luIG9yZGVyIHRvIG1haW50YWluIHJlYXNvbmFibGUgcGVyZm9ybWFuY2UgbGV2ZWxzIHdoZW4gbG9hZGluZyBvYmplY3Qgc3RhdGUsCitPcGVuSlBBIGNhbiBvbmx5IGd1YXJhbnRlZSB0aGF0IGFuIG9iamVjdCBpcyBsb2NrZWQgYXQgdGhlIHByb3BlciBsb2NrIGxldmVsCis8ZW1waGFzaXM+YWZ0ZXI8L2VtcGhhc2lzPiB0aGUgc3RhdGUgaGFzIGJlZW4gcmV0cmlldmVkIGZyb20gdGhlIGRhdGFiYXNlLiBUaGlzCittZWFucyB0aGF0IGl0IGlzIHRlY2huaWNhbGx5IHBvc3NpYmxlIGZvciBhbm90aGVyIHRyYW5zYWN0aW9uIHRvICJzbmVhayBpbiIgYW5kCittb2RpZnkgdGhlIGRhdGFiYXNlIHJlY29yZCBhZnRlciBPcGVuSlBBIHJldHJpZXZlcyB0aGUgc3RhdGUsIGJ1dCBiZWZvcmUgaXQKK2xvY2tzIHRoZSBvYmplY3QuIFRoZSBvbmx5IHdheSB0byBwb3NpdGl2ZWx5IGd1YXJhbnRlZSB0aGF0IHRoZSBvYmplY3QgaXMgbG9ja2VkCithbmQgaGFzIHRoZSBtb3N0IHJlY2VudCBzdGF0ZSB0byByZWZyZXNoIHRoZSBvYmplY3QgYWZ0ZXIgbG9ja2luZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1doZW4gdXNpbmcgdGhlIHBlc3NpbWlzdGljIGxvY2sgbWFuYWdlciwgdGhlIGNhc2UgYWJvdmUgY2FuIG9ubHkgb2NjdXIgd2hlbiAKK09wZW5KUEEgY2Fubm90IGlzc3VlIHRoZSBzdGF0ZS1sb2FkaW5nIFNFTEVDVCBhcyBhIGxvY2tpbmcgc3RhdGVtZW50IGR1ZSB0byAKK2RhdGFiYXNlIGxpbWl0YXRpb25zLiBGb3IgZXhhbXBsZSwgc29tZSBkYXRhYmFzZXMgY2Fubm90IGxvY2sgU0VMRUNUcyB0aGF0IHVzZSAKK2pvaW5zLiBUaGUgcGVzc2ltaXN0aWMgbG9jayBtYW5hZ2VyIHdpbGwgbG9nIGFuIElORk8gbWVzc2FnZSB0byB0aGUgPGxpdGVyYWw+CitvcGVuanBhLlJ1bnRpbWU8L2xpdGVyYWw+IGxvZ2dpbmcgY2hhbm5lbCB3aGVuZXZlciBpdCBjYW5ub3QgbG9jayB0aGUgaW5pdGlhbCAKK1NFTEVDVCBkdWUgdG8gZGF0YWJhc2UgbGltaXRhdGlvbnMuIEJ5IHBheWluZyBhdHRlbnRpb24gdG8gdGhlc2UgbG9nIG1lc3NhZ2VzLCAKK3lvdSBjYW4gc2VlIHdoZXJlIHlvdSBtaWdodCBjb25zaWRlciB1c2luZyBhbiBvYmplY3QgcmVmcmVzaCB0byBndWFyYW50ZWUgdGhhdCAKK3lvdSBoYXZlIHRoZSBtb3N0IHJlY2VudCBzdGF0ZSwgb3Igd2hlcmUgeW91IG1pZ2h0IHJldGhpbmsgdGhlIHdheSB5b3UgbG9hZCB0aGUKK3N0YXRlIGluIHF1ZXN0aW9uIHRvIGNpcmN1bXZlbnQgdGhlIGRhdGFiYXNlIGxpbWl0YXRpb25zIHRoYXQgcHJldmVudCBPcGVuSlBBIAorZnJvbSBpc3N1aW5nIGEgbG9ja2luZyBTRUxFQ1QgaW4gdGhlIGZpcnN0IHBsYWNlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfc2F2ZXBvaW50cyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFNhdmVwb2ludHMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfc2F2ZXBvaW50cyI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBzYXZlcG9pbnQKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorU2F2ZXBvaW50cyBhbGxvdyBmb3IgZmluZSBncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgdHJhbnNhY3Rpb25hbCBiZWhhdmlvciBvZgoreW91ciBhcHBsaWNhdGlvbi4gT3BlbkpQQSdzIHNhdmVwb2ludCBBUEkgYWxsb3cgeW91IHRvIHNldCBpbnRlcm1lZGlhdGUgcm9sbGJhY2sKK3BvaW50cyBpbiB5b3VyIHRyYW5zYWN0aW9uLiBZb3UgY2FuIHRoZW4gY2hvb3NlIHRvIHJvbGxiYWNrIGNoYW5nZXMgbWFkZSBvbmx5CithZnRlciBhIHNwZWNpZmljIHNhdmVwb2ludCwgdGhlbiBjb21taXQgb3IgY29udGludWUgbWFraW5nIG5ldyBjaGFuZ2VzIGluIHRoZQordHJhbnNhY3Rpb24uIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yIG11bHRpLXN0YWdlIHRyYW5zYWN0aW9ucywgc3VjaCBhcworZWRpdGluZyBhIHNldCBvZiBvYmplY3RzIG92ZXIgc2V2ZXJhbCB3ZWIgcGFnZXMgb3IgdXNlciBzY3JlZW5zLiBTYXZlcG9pbnRzIGFsc28KK3Byb3ZpZGUgbW9yZSBmbGV4aWJpbHR5IHRvIGNvbmRpdGlvbmFsIHRyYW5zYWN0aW9uIGJlaGF2aW9yLCBzdWNoIGFzIGNob29zaW5nIHRvCitjb21taXQgb3Igcm9sbGJhY2sgYSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGUKK2NoYW5nZXMuIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgaG93IHRvIHVzZSBhbmQgY29uZmlndXJlIE9wZW5KUEEgc2F2ZXBvaW50cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdGlvbiBpZD0icmVnX2d1aWRlX3NhdmVwb2ludHNfdXNpbmciPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFVzaW5nIFNhdmVwb2ludHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEncyAKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyLmh0bWwiPgorPGNsYXNzbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlcjwvY2xhc3NuYW1lPjwvdWxpbms+IGhhdmUgdGhlIGZvbGxvd2luZworbWV0aG9kcyB0byBjb250cm9sIHNhdmVwb2ludCBiZWhhdmlvci4gTm90ZSB0aGF0IHRoZSBzYXZlcG9pbnRzIHdvcmsgaW4gdGFuZGVtCit3aXRoIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgc2F2ZXBvaW50cyByZXF1aXJlIGFuIG9wZW4KK3RyYW5zYWN0aW9uLCBhbmQgdGhhdCBhIHJvbGxiYWNrIG9mIHRoZSB0cmFuc2FjdGlvbiB3aWxsIHJvbGxiYWNrIGFsbCBvZiB0aGUKK2NoYW5nZXMgaW4gdGhlIHRyYW5zYWN0aW9uIHJlZ2FyZGxlc3Mgb2YgYW55IHNhdmVwb2ludHMgc2V0LgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgordm9pZCBzZXRTYXZlcG9pbnQoU3RyaW5nIG5hbWUpOwordm9pZCByZWxlYXNlU2F2ZXBvaW50KFN0cmluZyBuYW1lKTsKK3ZvaWQgcm9sbGJhY2tUb1NhdmVwb2ludChTdHJpbmcgbmFtZSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPHBhcmE+CitUbyBzZXQgYSBzYXZlcG9pbnQsIHNpbXBseSBjYWxsIDxtZXRob2RuYW1lPnNldFNhdmVwb2ludDwvbWV0aG9kbmFtZT4sIHBhc3NpbmcKK2luIGEgc3ltYm9saWMgc2F2ZXBvaW50IG5hbWUuIFRoaXMgc2F2ZXBvaW50IHdpbGwgZGVmaW5lIGEgcG9pbnQgYXQgd2hpY2ggeW91CitjYW4gcHJlc2VydmUgdGhlIHN0YXRlIG9mIHRyYW5zYWN0aW9uYWwgb2JqZWN0cyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50Cit0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorSGF2aW5nIHNldCBhIG5hbWVkIHNhdmVwb2ludCwgeW91IGNhbiByb2xsYmFjayBjaGFuZ2VzIG1hZGUgYWZ0ZXIgdGhhdCBwb2ludCBieQorY2FsbGluZyA8bWV0aG9kbmFtZT5yb2xsYmFja1RvU2F2ZXBvaW50PC9tZXRob2RuYW1lPi4gVGhpcyBtZXRob2Qgd2lsbCBrZWVwIHRoZQorY3VycmVudCB0cmFuc2FjdGlvbiBhY3RpdmUsIHdoaWxlIHJlc3RvcmluZyBhbGwgdHJhbnNhY3Rpb25hbCBpbnN0YW5jZXMgYmFjayB0bwordGhlaXIgc2F2ZWQgc3RhdGUuIEluc3RhbmNlcyB0aGF0IHdlcmUgZGVsZXRlZCBhZnRlciB0aGUgc2F2ZSBwb2ludCB3aWxsIG5vCitsb25nZXIgYmUgbWFya2VkIGZvciBkZWxldGlvbi4gU2ltaWxhcmx5LCB0cmFuc2llbnQgaW5zdGFuY2VzIHRoYXQgd2VyZSBtYWRlCitwZXJzaXN0ZW50IGFmdGVyIHRoZSBzYXZlcG9pbnQgd2lsbCBiZWNvbWUgdHJhbnNpZW50IGFnYWluLiBTYXZlcG9pbnRzIG1hZGUKK2FmdGVyIHRoaXMgc2F2ZXBvaW50IHdpbGwgYmUgcmVsZWFzZWQgYW5kIG5vIGxvbmdlciB2YWxpZCwgYWx0aG91Z2ggeW91IGNhbgorc3RpbGwgc2V0IG5ldyBzYXZlcG9pbnRzLiBTYXZlcG9pbnRzIHdpbGwgYWxzbyBiZSBjbGVhcmVkIGFmdGVyIHRoZSBjdXJyZW50Cit0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0lmIGEgc2F2ZXBvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQsIHlvdSBjYW4gcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGl0IGlzIAorY29uc3VtaW5nIHJlc291cmNlcyBieSBjYWxsaW5nIDxtZXRob2RuYW1lPnJlbGVhc2VTYXZlcG9pbnQ8L21ldGhvZG5hbWU+LiBUaGlzIAorbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBzYXZlcG9pbnRzIHRoYXQgaGF2ZSBiZWVuCityZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHRocm91Z2ggb3RoZXIgbWVhbnMsIHN1Y2ggYXMgY29tbWl0IG9mIGEgdHJhbnNhY3Rpb24gb3IKK3JvbGxiYWNrIHRvIGEgcHJpb3Igc2F2ZXBvaW50LiBXaGlsZSBzYXZlcG9pbnRzIG1hZGUgYWZ0ZXIgdGhpcyBzYXZlcG9pbnQgd2lsbAorYWxzbyBiZSByZWxlYXNlZCwgdGhlcmUgYXJlIG5vIG90aGVyIGVmZmVjdHMgb24gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBmb2xsb3dpbmcgc2ltcGxlIGV4YW1wbGUgaWxsdXN0cmF0ZXMgc2V0dGluZywgcmVsZWFzaW5nLCBhbmQgcm9sbGluZyBiYWNrIHRvCithIHNhdmVwb2ludC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfc2F2ZXBvaW50c19leGFtcGxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFVzaW5nIFNhdmVwb2ludHMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgoraW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5wZXJzaXN0ZW5jZS4qOworCisuLi4KKworT3BlbkpQQUVudGl0eU1hbmFnZXIgb2VtID0gT3BlbkpQQVBlcnNpc3RlbmNlLmNhc3QoZW0pOworb2VtLmdldFRyYW5zYWN0aW9uKCkuYmVnaW4oKTsKKworTWFnYXppbmUgbWFnID0gb2VtLmZpbmQoTWFnYXppbmUuY2xhc3MsIGlkKTsKK21hZy5zZXRQYWdlQ291bnQoMzAwKTsKK29lbS5zZXRTYXZlcG9pbnQoInBhZ2VzIik7CisKK21hZy5zZXRQcmljZShtYWcuZ2V0UGFnZUNvdW50KCkgKiBwcmljZVBlclBhZ2UpOworLy8gd2UgZGVjaWRlIHRvIHJlbGVhc2UgInBhZ2VzIi4uLgorb2VtLnJlbGVhc2VTYXZlcG9pbnQoInBhZ2VzIik7CisvLyAuLi4gYW5kIHNldCBhIG5ldyBzYXZlcG9pbnQgd2hpY2ggaW5jbHVkZXMgYWxsIGNoYW5nZXMKK29lbS5zZXRTYXZlcG9pbnQoInByaWNlIik7CisKK21hZy5zZXRQcmljZSh0ZXN0UHJpY2UpOworLy8gd2UgZGV0ZXJtaW5lIHRoZSB0ZXN0IHByaWNlIGlzIG5vdCBnb29kCitvZW0ucm9sbGJhY2tUb1NhdmVwb2ludCgicHJpY2UiKTsKKy8vIGhhZCB3ZSBjaG9zZW4gdG8gbm90IHJlbGVhc2UgInBhZ2VzIiwgd2UgbWlnaHQgaGF2ZSByb2xsZWQgYmFjayB0bworLy8gInBhZ2VzIiBpbnN0ZWFkCisKKy8vIHRoZSBwcmljZSBpcyBub3cgcmVzdG9yZWQgdG8gbWFnLmdldFBhZ2VDb3VudCgpICogcHJpY2VQZXJQYWdlCitvZW0uZ2V0VHJhbnNhY3Rpb24oKS5jb21taXQoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9zYXZlcG9pbnRzX2NvbmYiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIFNhdmVwb2ludHMKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK09wZW5KUEEgdXNlcyB0aGUgCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2F2ZXBvaW50TWFuYWdlciI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuU2F2ZXBvaW50TWFuYWdlcjwvY2xhc3NuYW1lPjwvdWxpbms+Cis8bGluayBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIj5wbHVnaW48L2xpbms+IHRvIGhhbmRsZSBwZXJzZXJ2aW5nIHRoZQorc2F2ZXBvaW50IHN0YXRlLiBPcGVuSlBBIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgPGNsYXNzbmFtZT5TYXZlcG9pbnRNYW5hZ2VyCis8L2NsYXNzbmFtZT4gcGx1Z2luczoKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPmluLW1lbTwvbGl0ZXJhbD46IFRoZSBkZWZhdWx0LiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Im9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuSW5NZW1vcnlTYXZlcG9pbnRNYW5hZ2VyIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Jbk1lbW9yeVNhdmVwb2ludE1hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPi4gVGhpcworcGx1Z2luIHN0b3JlcyBhbGwgc3RhdGUsIGluY2x1ZGluZyBmaWVsZCB2YWx1ZXMsIGluIG1lbW9yeS4gRHVlIHRvIHRoaXMKK2JlaGF2aW9yLCBlYWNoIHNldCBzYXZlcG9pbnQgaXMgZGVzaWduZWQgZm9yIHNtYWxsIHRvIG1lZGl1bSB0cmFuc2FjdGlvbmFsCitvYmplY3QgY291bnRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+amRiYzwvbGl0ZXJhbD46IFRoaXMgaXMgYW4gYWxpYXMgZm9yIHRoZQorPHVsaW5rIHVybD0ib3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTYXZlcG9pbnRNYW5hZ2VyIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLkpEQkNTYXZlcG9pbnRNYW5hZ2VyPC9jbGFzc25hbWU+PC91bGluaz4uIFRoaXMKK3BsdWdpbiByZXF1aXJlcyA8bGl0ZXJhbD5KREJDIDM8L2xpdGVyYWw+IGFuZCA8Y2xhc3NuYW1lPiBqYXZhLnNxbC5TYXZlcG9pbnQKKzwvY2xhc3NuYW1lPiBzdXBwb3J0IHRvIG9wZXJhdGUuIE5vdGUgdGhhdCB0aGlzIHBsdWdpbiBpbXBsZW1lbnRzIHNhdmVwb2ludHMgYnkKK2lzc3VpbmcgYSBmbHVzaCB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5vcmFjbGU8L2xpdGVyYWw+OiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Im9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLnNxbC5PcmFjbGVTYXZlcG9pbnRNYW5hZ2VyIj48Y2xhc3NuYW1lPgorb3JnLmFwYWNoZS5vcGVuanBhLmpkYmMuc3FsLk9yYWNsZVNhdmVwb2ludE1hbmFnZXI8L2NsYXNzbmFtZT48L3VsaW5rPi4gVGhpcworcGx1Z2luIG9wZXJhdGVzIHNpbWlsYXJseSB0byB0aGUgPGxpdGVyYWw+SkRCQzwvbGl0ZXJhbD4gcGx1Z2luOyBob3dldmVyLCBpdAordXNlcyBPcmFjbGUtc3BlY2lmaWMgY2FsbHMuIFRoaXMgcGx1Z2luIHJlcXVpcmVzIHVzaW5nIHRoZSBPcmFjbGUgSkRCQyBkcml2ZXIKK2FuZCBkYXRhYmFzZSwgdmVyc2lvbnMgPGxpdGVyYWw+OS4yPC9saXRlcmFsPiBvciBoaWdoZXIuIE5vdGUgdGhhdCB0aGlzIHBsdWdpbgoraW1wbGVtZW50cyBzYXZlcG9pbnRzIGJ5IGlzc3VpbmcgYSBmbHVzaCB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPCEtLQorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV9xdWVyeWV4dCI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFF1ZXJ5IExhbmd1YWdlIEV4dGVuc2lvbnMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV9xdWVyeWV4dCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICBRdWVyeQorICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICBsYW5ndWFnZSBleHRlbnNpb25zCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDxzZWVhbHNvPgorICAgICAgICAgICAgICAgIEpQUUwKKyAgICAgICAgICAgIDwvc2VlYWxzbz4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorSlBRTCBpcyBhIHBvd2VyZnVsLCBlYXN5LXRvLXVzZSBxdWVyeSBsYW5ndWFnZSwgYnV0IHlvdSBtYXkgb2NjYXNpb25hbGx5IGZpbmQgaXQKK2xpbWl0aW5nIGluIHNvbWUgd2F5LiBUbyBjaXJjdW12ZW50IHRoZSBsaW1pdGF0aW9ucyBvZiBKUFFMLCBPcGVuSlBBIHByb3ZpZGVzCitleHRlbnNpb25zIHRvIHRoZSBKUFFMIGxhbmd1YWdlLCBhbmQgYWxsb3dzIHlvdSB0byBleHRlbmQgaXQgYXMgd2VsbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8d2FybmluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIEpQUUwgcGFyc2VyIGluIHRoaXMgcmVsZWFzZSBkb2VzIG5vdCB5ZXQgYWxsb3cgZXh0ZW5zaW9ucy4gVGhleSB3aWxsIGJlIG1hZGUKK2F2YWlsYWJsZSB0byBKUFFMIHVzZXJzIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvd2FybmluZz4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3F1ZXJ5ZXh0X2pkb3FsIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBGaWx0ZXIgRXh0ZW5zaW9ucworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2VudGVycHJpc2VfcXVlcnlleHRfamRvcWwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBKUFFMCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0ZpbHRlciBleHRlbnNpb25zIGFyZSBjdXN0b20gbWV0aG9kcyB0aGF0IHlvdSBjYW4gdXNlIGluIHlvdXIgcXVlcnkgZmlsdGVyLAoraGF2aW5nLCBvcmRlcmluZywgYW5kIHJlc3VsdCBzdHJpbmdzLiBPcGVuSlBBIHByb3ZpZGVzIHNvbWUgYnVpbHQtaW4gZmlsdGVyCitleHRlbnNpb25zLCBhbmQgeW91IGNhbiBkZXZlbG9wIHlvdXIgb3duIGN1c3RvbSBleHRlbnNpb25zIGFzIG5lZWRlZC4gWW91IGNhbgorb3B0aW9uYWxseSBwcmVmYWNlIGFsbCBmaWx0ZXIgZXh0ZW5zaW9ucyB3aXRoIDxsaXRlcmFsPmV4dDo8L2xpdGVyYWw+IGluIHlvdXIKK3F1ZXJ5IHN0cmluZy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIGEgaHlwb3RoZXRpY2FsIDxsaXRlcmFsPgorZmlyc3RUaHJlZUNoYXJzPC9saXRlcmFsPiBleHRlbnNpb24gdG8gc2VhcmNoIGZvciBjaXRpZXMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aAordGhlIDMgY2hhcmFjdGVycyAnSCcsICdhJywgJ3InLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3F1ZXJ5ZXh0X2pkb3FsX2V4dCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBCYXNpYyBGaWx0ZXIgRXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK1F1ZXJ5IHEgPSBlbS5jcmVhdGVRdWVyeSAoInNlbGVjdCBjIGZyb20gQ2l0eSBjIHdoZXJlIGMubmFtZS5leHQ6Zmlyc3RUaHJlZUNoYXJzICgpID0gJ0hhciciKTsKK0xpc3QgcmVzdWx0cyA9IHEuZ2V0UmVzdWx0TGlzdCAoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8cGFyYT4KK05vdGUgdGhhdCBpdCBpcyBwZXJmZWN0bHkgT0sgdG8gY2hhaW4gdG9nZXRoZXIgZXh0ZW5zaW9ucy4gRm9yIGV4YW1wbGUsIGxldCdzCittb2RpZnkgb3VyIHNlYXJjaCBhYm92ZSB0byBiZSBjYXNlLWluc2Vuc2l0aXZlIHVzaW5nIGFub3RoZXIgaHlwb3RoZXRpY2FsCitleHRlbnNpb24sIDxsaXRlcmFsPmVxdWFsc0lnbm9yZUNhc2U8L2xpdGVyYWw+OgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3F1ZXJ5ZXh0X2pkb3FsX2NoYWluIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENoYWluaW5nIEZpbHRlciBFeHRlbnNpb25zCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK1F1ZXJ5IHF1ZXJ5ID0gZW0uY3JlYXRlUXVlcnkgKCJzZWxlY3QgYyBmcm9tIENpdHkgYyB3aGVyZSAiCisgICAgKyAiYy5uYW1lLmV4dDpmaXJzdFRocmVlQ2hhcnMgKCkuZXh0OmVxdWFsc0lnbm9yZUNhc2UgKCdIYXInKSIpOworTGlzdCByZXN1bHRzID0gcS5nZXRSZXN1bHRMaXN0ICgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorRmluYWxseSwgd2hlbiB1c2luZyBmaWx0ZXIgZXh0ZW5zaW9ucyB5b3UgbXVzdCBiZSBhd2FyZSB0aGF0IGFueSBTUUwtc3BlY2lmaWMKK2V4dGVuc2lvbnMgY2FuIG9ubHkgZXhlY3V0ZSBhZ2FpbnN0IHRoZSBkYXRhYmFzZSwgYW5kIGNhbm5vdCBiZSB1c2VkIGZvcgoraW4tbWVtb3J5IHF1ZXJpZXMgKHJlY2FsbCB0aGF0IE9wZW5KUEEgZXhlY3V0ZXMgcXVlcmllcyBpbi1tZW1vcnkgd2hlbiB5b3UKK3N1cHBseSBhIGNhbmRpZGF0ZSBjb2xsZWN0aW9uIHJhdGhlciB0aGFuIGEgY2xhc3MsIG9yIHdoZW4geW91IHNldCB0aGUgPGxpdGVyYWw+CitJZ25vcmVDaGFuZ2VzPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+Rmx1c2hCZWZvcmVRdWVyaWVzPC9saXRlcmFsPiBwcm9wZXJ0aWVzIHRvCis8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4gYW5kIHlvdSBleGVjdXRlIGEgcXVlcnkgd2l0aGluIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2gKK3lvdSd2ZSBtb2RpZmllZCBkYXRhIHRoYXQgbWF5IGFmZmVjdCB0aGUgcmVzdWx0cykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX2VudGVycHJpc2VfcXVlcnlleHRfamRvcWxfaW5jbHVkZWQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgSW5jbHVkZWQgRmlsdGVyIEV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorT3BlbkpQQSBpbmNsdWRlcyB0d28gZGVmYXVsdCBmaWx0ZXIgZXh0ZW5zaW9ucyB0byBlbmhhbmNlIHRoZSBwb3dlciBvZiB5b3VyCitxdWVyaWVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5nZXRDb2x1bW48L2xpdGVyYWw+OiBQbGFjZXMgdGhlIHByb3BlciBhbGlhcyBmb3IgdGhlIGdpdmVuIGNvbHVtbiBuYW1lCitpbnRvIHRoZSBTRUxFQ1Qgc3RhdGVtZW50IHRoYXQgaXMgaXNzdWVkLiBUaGlzIGV4dGVuc2lvbiBjYW5ub3QgYmUgdXNlZCBmb3IKK2luLW1lbW9yeSBxdWVyaWVzLiBXaGVuIHRyYXZlcnNpbmcgcmVsYXRpb25zLCB0aGUgY29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlCitwcmltYXJ5IHRhYmxlIG9mIHRoZSByZWxhdGVkIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitzZWxlY3QgZSBmcm9tIEVtcGxveWVlIGUgd2hlcmUgZS5jb21wYW55LmFkZHJlc3MuZXh0OmdldENvbHVtbiAoJ0lEJykgPSA1Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQUUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5zcWw8L2xpdGVyYWw+OiBFbWJlZHMgdGhlIGdpdmVuIFNRTCBhcmd1bWVudCBpbnRvIHRoZSBTRUxFQ1QKK3N0YXRlbWVudC4gVGhpcyBleHRlbnNpb24gY2Fubm90IGJlIHVzZWQgZm9yIGluLW1lbW9yeSBxdWVyaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorc2VsZWN0IHAgZnJvbSBQcm9kdWN0IHAgd2hlcmUgcC5wcmljZSAmbHQ7IGV4dDpzcWwgKCcoU0VMRUNUIEFWRyhQUklDRSkgRlJPTSBQUk9EVUNUUyknKQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfZW50ZXJwcmlzZV9xdWVyeWV4dF9qZG9xbF9jdXN0b20iPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgRGV2ZWxvcGluZyBDdXN0b20gRmlsdGVyIEV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2VudGVycHJpc2VfcXVlcnlleHRfamRvcWxfY3VzdG9tIj4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBKUFFMCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcnRpYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tCisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitZb3UgY2FuIHdyaXRlIHlvdXIgb3duIGV4dGVuc2lvbnMgYnkgaW1wbGVtZW50aW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9KREJDRmlsdGVyTGlzdGVuZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkpEQkNGaWx0ZXJMaXN0ZW5lcjwvY2xhc3NuYW1lPgorPC91bGluaz4gaW50ZXJmYWNlLiBWaWV3IHRoZSBKYXZhZG9jIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuIEFkZGl0aW9uYWxseSwKK3RoZSBzb3VyY2UgZm9yIGFsbCBvZiBPcGVuSlBBJ3MgYnVpbHQtaW4gcXVlcnkgZXh0ZW5zaW9ucyBpcyBpbmNsdWRlZCBpbiB5b3VyCitPcGVuSlBBIGRvd25sb2FkIHRvIGdldCB5b3Ugc3RhcnRlZC4gVGhlIGJ1aWx0LWluIGV4dGVuc2lvbnMgcmVzaWRlIGluIHRoZQorPGZpbGVuYW1lPiBzcmMvb3BlbmpwYS9rZXJuZWwvZXhwczwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+CitzcmMvb3BlbmpwYS9qZGJjL2tlcm5lbC9leHBzPC9maWxlbmFtZT4gZGlyZWN0b3JpZXMgb2YgeW91ciBkaXN0cmlidXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX3F1ZXJ5ZXh0X2pkb3FsX2NvbmYiPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgRmlsdGVyIEV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2VudGVycHJpc2VfcXVlcnlleHRfamRvcWxfY29uZiI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgSlBRTAorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgPC90ZXJ0aWFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZXJlIGFyZSB0d28gd2F5cyB0byByZWdpc3RlciB5b3VyIGN1c3RvbSBmaWx0ZXIgZXh0ZW5zaW9ucyB3aXRoIE9wZW5KUEE6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPlJlZ2lzdHJhdGlvbiBieSBwcm9wZXJ0aWVzOjwvZW1waGFzaXM+IFlvdSBjYW4gcmVnaXN0ZXIgY3VzdG9tIGZpbHRlcgorZXh0ZW5zaW9ucyBieSBzZXR0aW5nIHRoZSA8bGluayBsaW5rZW5kPSJvcGVuanBhLkZpbHRlckxpc3RlbmVycyI+PGxpdGVyYWw+CitvcGVuanBhLkZpbHRlckxpc3RlbmVyczwvbGl0ZXJhbD48L2xpbms+IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdG8gYQorY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGx1Z2luIHN0cmluZ3MgKHNlZQorPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPikgZGVzY3JpYmluZyB5b3VyIGV4dGVuc2lvbnMKK2NsYXNzZXMuIEV4dGVuc2lvbnMgcmVnaXN0ZXJlZCBpbiB0aGlzIGZhc2hpb24gbXVzdCBoYXZlIGEgcHVibGljIG5vLWFyZworY29uc3RydWN0b3IuIFRoZXkgbXVzdCBhbHNvIGJlIHRocmVhZCBzYWZlLCBiZWNhdXNlIHRoZXkgd2lsbCBiZSBzaGFyZWQgYWNyb3NzCithbGwgcXVlcmllcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8ZW1waGFzaXM+UGVyLXF1ZXJ5IHJlZ2lzdHJhdGlvbjo8L2VtcGhhc2lzPiBZb3UgY2FuIHJlZ2lzdGVyIGZpbHRlciBleHRlbnNpb25zCitmb3IgYW4gaW5kaXZpZHVhbCA8Y2xhc3NuYW1lPlF1ZXJ5PC9jbGFzc25hbWU+IHRocm91Z2ggdGhlIDxtZXRob2RuYW1lPgorT3BlbkpQQVF1ZXJ5LmFkZEZpbHRlckxpc3RlbmVyPC9tZXRob2RuYW1lPiBtZXRob2QuIFlvdSBtaWdodCB1c2UgcGVyLXF1ZXJ5CityZWdpc3RyYXRpb24gZm9yIHZlcnkgc3BlY2lmaWMgZXh0ZW5zaW9ucyB0aGF0IGRvIG5vdCBhcHBseSBnbG9iYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorU2VlIHRoZSA8Y2xhc3NuYW1lPk9wZW5KUEFRdWVyeTwvY2xhc3NuYW1lPgorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvT3BlbkpQQVF1ZXJ5Lmh0bWwiPgorSmF2YWRvYzwvdWxpbms+IGZvciBkZXRhaWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfYWdncmVnYXRlc19jdXN0b20iPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZSBFeHRlbnNpb25zCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfYWdncmVnYXRlc19jdXN0b20iPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBKUFFMCisgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitKdXN0IGFzIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gZmlsdGVyIG1ldGhvZHMsIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gcXVlcnkKK2FnZ3JlZ2F0ZXMgYnkgaW1wbGVtZW50aW5nIHRoZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvamRiYy9rZXJuZWwvZXhwcy9KREJDQWdncmVnYXRlTGlzdGVuZXIuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5leHBzLkpEQkNBZ2dyZWdhdGVMaXN0ZW5lcjwvY2xhc3NuYW1lPgorPC91bGluaz4gaW50ZXJmYWNlLiBWaWV3IHRoZSBKYXZhZG9jIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuIFdoZW4gdXNpbmcgeW91cgorY3VzdG9tIGFnZ3JlZ2F0ZXMgaW4gcmVzdWx0IG9yIGhhdmluZyBxdWVyeSBjbGF1c2VzLCB5b3UgY2FuIG9wdGlvbmFsbHkgcHJlZml4Cit0aGUgZnVuY3Rpb24gbmFtZSB3aXRoIDxsaXRlcmFsPmV4dDo8L2xpdGVyYWw+IHRvIGlkZW50aWZ5IGl0IGFzIGFuIGV4dGVuc2lvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfYWdncmVnYXRlc19jb25mIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIFF1ZXJ5IEFnZ3JlZ2F0ZXMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2FnZ3JlZ2F0ZXNfY29uZiI+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgSlBRTAorICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVydGlhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIDwvdGVydGlhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitUaGVyZSBhcmUgdHdvIHdheXMgdG8gcmVnaXN0ZXIgeW91ciBjdXN0b20gcXVlcnkgYWdncmVnYXRlcyB3aXRoIE9wZW5KUEE6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGVtcGhhc2lzPlJlZ2lzdHJhdGlvbiBieSBwcm9wZXJ0aWVzOjwvZW1waGFzaXM+IFlvdSBjYW4gcmVnaXN0ZXIgY3VzdG9tIHF1ZXJ5CithZ2dyZWdhdGVzIGJ5IHNldHRpbmcgdGhlIDxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuQWdncmVnYXRlTGlzdGVuZXJzIj48bGl0ZXJhbD4KK29wZW5qcGEuQWdncmVnYXRlTGlzdGVuZXJzPC9saXRlcmFsPjwvbGluaz4gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0byBhCitjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwbHVnaW4gc3RyaW5ncyAoc2VlCis8eHJlZiBsaW5rZW5kPSJyZWZfZ3VpZGVfY29uZl9wbHVnaW5zIi8+KSBkZXNjcmliaW5nIHlvdXIgYWdncmVnYXRlCitpbXBsZW1lbnRhdGlvbi4gQWdncmVnYXRlcyByZWdpc3RlcmVkIGluIHRoaXMgZmFzaGlvbiBtdXN0IGhhdmUgYSBwdWJsaWMgbm8tYXJnCitjb25zdHJ1Y3Rvci4gVGhleSBtdXN0IGFsc28gYmUgdGhyZWFkIHNhZmUsIGJlY2F1c2UgdGhleSB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MKK2FsbCBxdWVyaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxlbXBoYXNpcz5QZXItcXVlcnkgcmVnaXN0cmF0aW9uOjwvZW1waGFzaXM+IFlvdSBjYW4gcmVnaXN0ZXIgcXVlcnkgYWdncmVnYXRlcworZm9yIGFuIGluZGl2aWR1YWwgPGNsYXNzbmFtZT5RdWVyeTwvY2xhc3NuYW1lPiB0aHJvdWdoIHRoZSA8bWV0aG9kbmFtZT4KK09wZW5KUEFRdWVyeS5hZGRBZ2dyZWdhdGVMaXN0ZW5lcjwvbWV0aG9kbmFtZT4gbWV0aG9kLiBZb3UgbWlnaHQgdXNlIHBlci1xdWVyeQorcmVnaXN0cmF0aW9uIGZvciB2ZXJ5IHNwZWNpZmljIGFnZ3JlZ2F0ZXMgdGhhdCBkbyBub3QgYXBwbHkgZ2xvYmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1NlZSB0aGUgPGNsYXNzbmFtZT5PcGVuSlBBUXVlcnk8L2NsYXNzbmFtZT4KKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFRdWVyeS5odG1sIj4KK0phdmFkb2M8L3VsaW5rPiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAtLT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX21ldGhvZHFsIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBNZXRob2RRTAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX2VudGVycHJpc2VfbWV0aG9kcWwiPgorICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICBNZXRob2RRTAorICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgUXVlcnkKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kUUwKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8c2VlPgorICAgICAgICAgICAgICAgICAgICBNZXRob2RRTAorICAgICAgICAgICAgICAgIDwvc2VlPgorICAgICAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgICAgICA8cGFyYT4KK0lmIEpQUUwgYW5kIFNRTCBxdWVyaWVzIGRvIG5vdCBtYXRjaCB5b3VyIG5lZWRzLCBPcGVuSlBBIGFsc28gYWxsb3dzIHlvdSB0byBuYW1lCithIEphdmEgbWV0aG9kIHRvIHVzZSB0byBsb2FkIGEgc2V0IG9mIG9iamVjdHMuIEluIGEgPGVtcGhhc2lzPk1ldGhvZFFMCis8L2VtcGhhc2lzPiBxdWVyeSwgdGhlIHF1ZXJ5IHN0cmluZyBuYW1lcyBhIHN0YXRpYyBtZXRob2QgdG8gaW52b2tlIHRvIGRldGVybWluZQordGhlIG1hdGNoaW5nIG9iamVjdHM6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnBlcnNpc3RlbmNlLio7CisKKy4uLgorCisvLyB0aGUgbWV0aG9kIHF1ZXJ5IGxhbmd1YWdlIGlzICdvcGVuanBhLk1ldGhvZFFMJy4KKy8vIHNldCB0aGUgcXVlcnkgc3RyaW5nIHRvIHRoZSBtZXRob2QgdG8gZXhlY3V0ZSwgaW5jbHVkaW5nIGZ1bGwgY2xhc3MgbmFtZTsgaWYKKy8vIHRoZSBjbGFzcyBpcyBpbiB0aGUgY2FuZGlkYXRlIGNsYXNzJyBwYWNrYWdlIG9yIGluIHRoZSBxdWVyeSBpbXBvcnRzLCB5b3UKKy8vIGNhbiBvbWl0IHRoZSBwYWNrYWdlOyBpZiB0aGUgbWV0aG9kIGlzIGluIHRoZSBjYW5kaWRhdGUgY2xhc3MsIHlvdSBjYW4gb21pdAorLy8gdGhlIGNsYXNzIG5hbWUgYW5kIGp1c3Qgc3BlY2lmeSB0aGUgbWV0aG9kIG5hbWUKK09wZW5KUEFFbnRpdHlNYW5hZ2VyIG9lbSA9IE9wZW5KUEFQZXJzaXN0ZW5jZS5jYXN0KGVtZik7CitPcGVuSlBBUXVlcnkgcSA9IG9lbS5jcmVhdGVRdWVyeSgib3BlbmpwYS5NZXRob2RRTCIsICJjb20ueHl6LkZpbmRlci5nZXRCeU5hbWUiKTsKKworLy8gc2V0IHRoZSB0eXBlIG9mIG9iamVjdHMgdGhhdCB0aGUgbWV0aG9kIHJldHVybnMKK3Euc2V0UmVzdWx0Q2xhc3MoUGVyc29uLmNsYXNzKTsKKworLy8gcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZSBzYW1lIHdheSBhcyBpbiBzdGFuZGFyZCBxdWVyaWVzCitxLnNldFBhcmFtZXRlcigiZmlyc3ROYW1lIiwgIkZyZWQiKS5zZXRQYXJhbWV0ZXIoImxhc3ROYW1lIiwgIkx1Y2FzIik7CisKKy8vIHRoaXMgZXhlY3V0ZXMgeW91ciBtZXRob2QgdG8gZ2V0IHRoZSByZXN1bHRzCitMaXN0IHJlc3VsdHMgPSBxLmdldFJlc3VsdExpc3QoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK0ZvciBkYXRhc3RvcmUgcXVlcmllcywgdGhlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CisgICAgICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgc3RhdGljIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2xpYi9yb3AvUmVzdWx0T2JqZWN0UHJvdmlkZXIuaHRtbCI+UmVzdWx0T2JqZWN0UHJvdmlkZXI8L3VsaW5rPiB4eHgoPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1N0b3JlQ29udGV4dC5odG1sIj5TdG9yZUNvbnRleHQ8L3VsaW5rPiBjdHgsIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQ2xhc3NNZXRhRGF0YS5odG1sIj5DbGFzc01ldGFEYXRhPC91bGluaz4gbWV0YSwgYm9vbGVhbiBzdWJjbGFzc2VzLCBNYXAgcGFyYW1zLCA8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmV0Y2hDb25maWd1cmF0aW9uLmh0bWwiPkZldGNoQ29uZmlndXJhdGlvbiA8L3VsaW5rPiBmZXRjaCkKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSByZXR1cm5lZCByZXN1bHQgb2JqZWN0IHByb3ZpZGVyIHNob3VsZCBwcm9kdWNlIG9iamVjdHMgb2YgdGhlIGNhbmRpZGF0ZQorY2xhc3MgdGhhdCBtYXRjaCB0aGUgbWV0aG9kJ3Mgc2VhcmNoIGNyaXRlcmlhLiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0cyBkbyBub3QKK2hhdmUgYWxsIGZpZWxkcyBpbiB0aGUgZ2l2ZW4gZmV0Y2ggY29uZmlndXJhdGlvbiBsb2FkZWQsIE9wZW5KUEEgd2lsbCBtYWtlCithZGRpdGlvbmFsIHRyaXBzIHRvIHRoZSBkYXRhc3RvcmUgYXMgbmVjZXNzYXJ5IHRvIGZpbGwgaW4gdGhlIGRhdGEgZm9yIHRoZQorbWlzc2luZyBmaWVsZHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KK0luLW1lbW9yeSBleGVjdXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50LCB0YWtpbmcgaW4gb25lIG9iamVjdCBhdCBhIHRpbWUgYW5kCityZXR1cm5pbmcgYSBib29sZWFuIG9uIHdoZXRoZXIgdGhlIG9iamVjdCBtYXRjaGVzIHRoZSBxdWVyeToKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiB4eHgoPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEva2VybmVsL1N0b3JlQ29udGV4dC5odG1sIj5TdG9yZUNvbnRleHQ8L3VsaW5rPiBjdHgsIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL21ldGEvQ2xhc3NNZXRhRGF0YS5odG1sIj5DbGFzc01ldGFEYXRhPC91bGluaz4gbWV0YSwgYm9vbGVhbiBzdWJjbGFzc2VzLCBPYmplY3Qgb2JqLCBNYXAgcGFyYW1zLCA8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvRmV0Y2hDb25maWd1cmF0aW9uLmh0bWwiPkZldGNoQ29uZmlndXJhdGlvbjwvdWxpbms+IGZldGNoKQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorSW4gYm90aCBtZXRob2QgdmVyc2lvbnMsIHRoZSBnaXZlbiA8bGl0ZXJhbD5wYXJhbXM8L2xpdGVyYWw+IG1hcCBjb250YWlucyB0aGUKK25hbWVzIGFuZCB2YWx1ZXMgb2YgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcXVlcnkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8IS0tCisgICAgPC9zZWN0aW9uPgorICAgIC0tPgorICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfc2VxdWVuY2UiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBHZW5lcmF0b3JzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxpbmRleHRlcm0gem9uZT0icmVmX2d1aWRlX3NlcXVlbmNlIj4KKyAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgU2VxIGludGVyZmFjZQorICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8cGFyYT4KK1RoZSBKUEEgT3ZlcnZpZXcncyA8eHJlZiBsaW5rZW5kPSJqcGFfb3ZlcnZpZXdfbWFwcGluZyIvPiBkZXRhaWxzIHVzaW5nCitnZW5lcmF0b3JzIHRvIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGUgaWRlbnRpdHkgZmllbGRzIGluIEpQQS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK09wZW5KUEEgcmVwcmVzZW50cyBhbGwgZ2VuZXJhdG9ycyBpbnRlcm5hbGx5IHdpdGggdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU2VxLmh0bWwiPjxjbGFzc25hbWU+CitvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlNlcTwvY2xhc3NuYW1lPjwvdWxpbms+IGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UKK3N1cHBsaWVzIGFsbCB0aGUgY29udGV4dCB5b3UgbmVlZCB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9tIGdlbmVyYXRvcnMsCitpbmNsdWRpbmcgdGhlIGN1cnJlbnQgcGVyc2lzdGVuY2UgZW52aXJvbm1lbnQsIHRoZSBKREJDIDxjbGFzc25hbWU+RGF0YVNvdXJjZQorPC9jbGFzc25hbWU+LCBhbmQgb3RoZXIgZXNzZW50aWFscy4gVGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9BYnN0cmFjdEpEQkNTZXEuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5BYnN0cmFjdEpEQkNTZXE8L2NsYXNzbmFtZT48L3VsaW5rPgoraGVscHMgeW91IGNyZWF0ZSBjdXN0b20gSkRCQy1iYXNlZCBzZXF1ZW5jZXMuIE9wZW5KUEEgYWxzbyBzdXBwbGllcyB0aGUKK2ZvbGxvd2luZyBidWlsdC1pbiA8Y2xhc3NuYW1lPlNlcTwvY2xhc3NuYW1lPnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMKKyAgICAgICAgICAgICAgICAgICAgPC9wcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICA8c2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD50YWJsZTwvbGl0ZXJhbD46IFRoaXMgaXMgT3BlbkpQQSdzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uIEl0IGlzIGFuCithbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9UYWJsZUpEQkNTZXEuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5UYWJsZUpEQkNTZXE8L2NsYXNzbmFtZT48L3VsaW5rPgorY2xhc3MuIFRoZSA8Y2xhc3NuYW1lPlRhYmxlSkRCQ1NlcTwvY2xhc3NuYW1lPiB1c2VzIGEgc3BlY2lhbCBzaW5nbGUtcm93IHRhYmxlCit0byBzdG9yZSBhIGdsb2JhbCBzZXF1ZW5jZSBudW1iZXIuIElmIHRoZSB0YWJsZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCBpcworY3JlYXRlZCB0aGUgZmlyc3QgdGltZSB5b3UgcnVuIHRoZQorPGxpbmsgbGlua2VuZD0icmVmX2d1aWRlX21hcHBpbmdfbWFwcGluZ3Rvb2wiPm1hcHBpbmcgdG9vbDwvbGluaz4gb24gYSBjbGFzcwordGhhdCByZXF1aXJlcyBpdC4gWW91IGNhbiBhbHNvIHVzZSB0aGUgY2xhc3MncyA8bWV0aG9kbmFtZT5tYWluPC9tZXRob2RuYW1lPgorbWV0aG9kIHRvIG1hbmlwdWxhdGUgdGhlIHRhYmxlOyBzZWUgdGhlIAorPG1ldGhvZG5hbWU+VGFibGVKREJDU2VxLm1haW48L21ldGhvZG5hbWU+IG1ldGhvZCBKYXZhZG9jIGZvciB1c2FnZSBkZXRhaWxzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1RoaXMgPGNsYXNzbmFtZT5TZXE8L2NsYXNzbmFtZT4gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5UYWJsZTwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBudW1iZXIgdGFibGUgdG8gdXNlLgorRGVmYXVsdHMgdG8gPGxpdGVyYWw+T1BFTkpQQV9TRVFVRU5DRV9UQUJMRTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+UHJpbWFyeUtleUNvbHVtbjwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gZm9yIHRoZQorc2VxdWVuY2UgdGFibGUuIERlZmF1bHRzIHRvIDxsaXRlcmFsPklEPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5TZXF1ZW5jZUNvbHVtbjwvbGl0ZXJhbD46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdGhhdCB3aWxsIGhvbGQgdGhlCitjdXJyZW50IHNlcXVlbmNlIHZhbHVlLiBEZWZhdWx0cyB0byA8bGl0ZXJhbD5TRVFVRU5DRV9WQUxVRTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+QWxsb2NhdGU8L2xpdGVyYWw+OiBUaGUgbnVtYmVyIG9mIHZhbHVlcyB0byBhbGxvY2F0ZSBvbiBlYWNoIGRhdGFiYXNlCit0cmlwLiBEZWZhdWx0cyB0byA1MCwgbWVhbmluZyB0aGUgY2xhc3Mgd2lsbCBzZXQgYXNpZGUgdGhlIG5leHQgNTAgbnVtYmVycyBlYWNoCit0aW1lIGl0IGFjY2Vzc2VzIHRoZSBzZXF1ZW5jZSB0YWJsZSwgd2hpY2ggaW4gdHVybiBtZWFucyBpdCBvbmx5IGhhcyB0byBtYWtlIGEKK2RhdGFiYXNlIHRyaXAgdG8gZ2V0IG5ldyBzZXF1ZW5jZSBudW1iZXJzIG9uY2UgZXZlcnkgNTAgc2VxdWVuY2UgbnVtYmVyCityZXF1ZXN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLXRhYmxlCisgICAgICAgICAgICAgICAgICAgIDwvc2Vjb25kYXJ5PgorICAgICAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorPGxpdGVyYWw+Y2xhc3MtdGFibGU8L2xpdGVyYWw+OiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL0NsYXNzVGFibGVKREJDU2VxLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5rZXJuZWwuQ2xhc3NUYWJsZUpEQkNTZXE8L2NsYXNzbmFtZT48L3VsaW5rPgorLiBUaGlzIDxjbGFzc25hbWU+U2VxPC9jbGFzc25hbWU+IGlzIGxpa2UgdGhlIDxjbGFzc25hbWU+VGFibGVKREJDU2VxCis8L2NsYXNzbmFtZT4gYWJvdmUsIGJ1dCBtYWludGFpbnMgYSBzZXBhcmF0ZSB0YWJsZSByb3csIGFuZCB0aGVyZWZvcmUgYSBzZXBhcmF0ZQorc2VxdWVuY2UgbnVtYmVyLCBmb3IgZWFjaCBiYXNlIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGhhcyBhbGwgdGhlIHByb3BlcnRpZXMgb2YKK3RoZSA8Y2xhc3NuYW1lPlRhYmxlSkRCQ1NlcTwvY2xhc3NuYW1lPi4gSXRzIHRhYmxlIG5hbWUgZGVmYXVsdHMgdG8gPGxpdGVyYWw+CitPUEVOSlBBX1NFUVVFTkNFU19UQUJMRTwvbGl0ZXJhbD4uIEl0IGFsc28gYWRkcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+SWdub3JlVW5tYXBwZWQ8L2xpdGVyYWw+OiBXaGV0aGVyIHRvIGlnbm9yZSB1bm1hcHBlZCBiYXNlIGNsYXNzZXMsIGFuZAoraW5zdGVhZCB1c2Ugb25lIHJvdyBwZXIgbGVhc3QtZGVyaXZlZCBtYXBwZWQgY2xhc3MuIERlZmF1bHRzIHRvIDxsaXRlcmFsPgorZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPlVzZUFsaWFzZXM8L2xpdGVyYWw+OiBXaGV0aGVyIHRvIHVzZSBlYWNoIGNsYXNzJyBlbnRpdHkgbmFtZSBhcyB0aGUKK3ByaW1hcnkga2V5IHZhbHVlIG9mIGVhY2ggcm93LCByYXRoZXIgdGhhbiB0aGUgZnVsbCBjbGFzcyBuYW1lLiBEZWZhdWx0cyB0bworPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxwYXJhPgorQXMgd2l0aCB0aGUgPGNsYXNzbmFtZT5UYWJsZUpEQkNTZXE8L2NsYXNzbmFtZT4sIHRoZSA8Y2xhc3NuYW1lPgorQ2xhc3NUYWJsZUpEQkNTZXE8L2NsYXNzbmFtZT4gY3JlYXRlcyBpdHMgdGFibGUgYXV0b21hdGljYWxseSBkdXJpbmcgbWFwcGluZwordG9vbCBydW5zLiBIb3dldmVyLCB5b3UgY2FuIG1hbnVhbGx5IG1hbmlwdWxhdGUgdGhlIHRhYmxlIHRocm91Z2ggdGhlIGNsYXNzJworPG1ldGhvZG5hbWU+bWFpbjwvbWV0aG9kbmFtZT4gbWV0aG9kLiBTZWUgdGhlIEphdmFkb2MgZm9yIHRoZQorPG1ldGhvZG5hbWU+IENsYXNzVGFibGVKREJDU2VxLm1haW48L21ldGhvZG5hbWU+IG1ldGhvZCBmb3IgdXNhZ2UgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS10YWJsZQorICAgICAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgICAgICA8L2luZGV4dGVybT4KKzxsaXRlcmFsPnZhbHVlLXRhYmxlPC9saXRlcmFsPjogVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9qZGJjL2tlcm5lbC9WYWx1ZVRhYmxlSkRCQ1NlcS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmpkYmMua2VybmVsLlZhbHVlVGFibGVKREJDU2VxPC9jbGFzc25hbWU+PC91bGluaz4KKy4gVGhpcyA8Y2xhc3NuYW1lPlNlcTwvY2xhc3NuYW1lPiBpcyBsaWtlIHRoZSA8Y2xhc3NuYW1lPkNsYXNzVGFibGVKREJDU2VxCis8L2NsYXNzbmFtZT4gYWJvdmUsIGJ1dCBoYXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiByb3dzIGZvciBzZXF1ZW5jZSB2YWx1ZXMsCityYXRoZXIgdGhhbiBhIGZpeGVkIHBhdHRlcm4gb2Ygb25lIHJvdyBwZXIgY2xhc3MuIEl0cyB0YWJsZSBkZWZhdWx0cyB0bworPGxpdGVyYWw+T1BFTkpQQV9TRVFVRU5DRVNfVEFCTEU8L2xpdGVyYWw+LiBJdCBoYXMgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZQorPGNsYXNzbmFtZT5UYWJsZUpEQkNTZXE8L2NsYXNzbmFtZT4sIHBsdXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+UHJpbWFyeUtleVZhbHVlPC9saXRlcmFsPjogVGhlIHByaW1hcnkga2V5IHZhbHVlIHVzZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0FzIHdpdGggdGhlIDxjbGFzc25hbWU+VGFibGVKREJDU2VxPC9jbGFzc25hbWU+LCB0aGUgPGNsYXNzbmFtZT4KK1ZhbHVlVGFibGVKREJDU2VxPC9jbGFzc25hbWU+IGNyZWF0ZXMgaXRzIHRhYmxlIGF1dG9tYXRpY2FsbHkgZHVyaW5nIG1hcHBpbmcKK3Rvb2wgcnVucy4gSG93ZXZlciwgeW91IGNhbiBtYW51YWxseSBtYW5pcHVsYXRlIHRoZSB0YWJsZSB0aHJvdWdoIHRoZSBjbGFzcycKKzxtZXRob2RuYW1lPm1haW48L21ldGhvZG5hbWU+IG1ldGhvZC4gU2VlIHRoZSBKYXZhZG9jIGZvciB0aGUKKzxtZXRob2RuYW1lPlZhbHVlVGFibGVKREJDU2VxLm1haW48L21ldGhvZG5hbWU+IG1ldGhvZCBmb3IgdXNhZ2UgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICAgICAgICAgICAgIDxwcmltYXJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycworICAgICAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD5uYXRpdmU8L2xpdGVyYWw+OiBUaGlzIGlzIGFuIGFsaWFzIGZvciB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2pkYmMva2VybmVsL05hdGl2ZUpEQkNTZXEuaHRtbCI+Cis8Y2xhc3NuYW1lPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLmtlcm5lbC5OYXRpdmVKREJDU2VxPC9jbGFzc25hbWU+PC91bGluaz4uCitNYW55IGRhdGFiYXNlcyBoYXZlIGEgY29uY2VwdCBvZiAibmF0aXZlIHNlcXVlbmNlcyIgLSBhIGJ1aWx0LWluIG1lY2hhbmlzbSBmb3IKK29idGFpbmluZyBpbmNyZW1lbnRpbmcgbnVtYmVycy4gRm9yIGV4YW1wbGUsIGluIE9yYWNsZSwgeW91IGNhbiBjcmVhdGUgYQorZGF0YWJhc2Ugc2VxdWVuY2Ugd2l0aCBhIHN0YXRlbWVudCBsaWtlIDxsaXRlcmFsPkNSRUFURSBTRVFVRU5DRSBNWVNFUVVFTkNFCis8L2xpdGVyYWw+LiBTZXF1ZW5jZSB2YWx1ZXMgY2FuIHRoZW4gYmUgYXRvbWljYWxseSBvYnRhaW5lZCBhbmQgaW5jcmVtZW50ZWQKK3dpdGggdGhlIHN0YXRlbWVudCA8bGl0ZXJhbD5TRUxFQ1QgTVlTRVFVRU5DRS5ORVhUVkFMIEZST00gRFVBTDwvbGl0ZXJhbD4uCitPcGVuSlBBIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoaXMgY29tbW9uIG1lY2hhbmlzbSBvZiBzZXF1ZW5jZSBnZW5lcmF0aW9uIHdpdGgKK3RoZSA8Y2xhc3NuYW1lPiBOYXRpdmVKREJDU2VxPC9jbGFzc25hbWU+LCB3aGljaCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXM6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorPGxpdGVyYWw+U2VxdWVuY2U8L2xpdGVyYWw+OiBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2Ugc2VxdWVuY2UuIERlZmF1bHRzIHRvCis8bGl0ZXJhbD5PUEVOSlBBX1NFUVVFTkNFPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5Jbml0aWFsVmFsdWU8L2xpdGVyYWw+OiBUaGUgaW5pdGlhbCBzZXF1ZW5jZSB2YWx1ZS4gRGVmYXVsdHMgdG8gMS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5JbmNyZW1lbnQ8L2xpdGVyYWw+OiBUaGUgYW1vdW50IHRoZSBzZXF1ZW5jZSBpbmNyZW1lbnRzLiBEZWZhdWx0cyB0byAxLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKzxsaXRlcmFsPkFsbG9jYXRlPC9saXRlcmFsPjogU29tZSBkYXRhYmFzZSBjYW4gYWxsb2NhdGUgdmFsdWVzIGluLW1lbW9yeSB0bworc2VydmljZSBzdWJzZXF1ZW50IHNlcXVlbmNlIHJlcXVlc3RzIGZhc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgICAgICAgICAgICAgPHByaW1hcnk+CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzCisgICAgICAgICAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgPC9zZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgPC9pbmRleHRlcm0+Cis8bGl0ZXJhbD50aW1lPC9saXRlcmFsPjogVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvVGltZVNlZWRlZFNlcS5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5UaW1lU2VlZGVkU2VxPC9jbGFzc25hbWU+PC91bGluaz4uIFRoaXMKK3R5cGUgdXNlcyBhbiBpbi1tZW1vcnkgc3RhdGljIGNvdW50ZXIsIGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IHRpbWUgaW4KK21pbGxpc2Vjb25kcyBhbmQgbW9ub3RvbmljYWxseSBpbmNyZW1lbnRlZCBmb3IgZWFjaCB2YWx1ZSByZXF1ZXN0ZWQuIEl0IGlzIG9ubHkKK3N1aXRhYmxlIGZvciBzaW5nbGUtSlZNIGVudmlyb25tZW50cy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPHBhcmE+CitZb3UgY2FuIHVzZSBKUEEgPGxpdGVyYWw+U2VxdWVuY2VHZW5lcmF0b3I8L2xpdGVyYWw+cyB0byBkZXNjcmliZSBhbnkgYnVpbHQtaW4KKzxjbGFzc25hbWU+U2VxPC9jbGFzc25hbWU+cyBvciB5b3VyIG93biA8Y2xhc3NuYW1lPlNlcTwvY2xhc3NuYW1lPgoraW1wbGVtZW50YXRpb24uIFNldCB0aGUgPGxpdGVyYWw+c2VxdWVuY2VOYW1lPC9saXRlcmFsPiBhdHRyaWJ1dGUgdG8gYSBwbHVnaW4KK3N0cmluZyBkZXNjcmliaW5nIHlvdXIgY2hvaWNlLiBTZWUKKzx4cmVmIGxpbmtlbmQ9ImpwYV9vdmVydmlld19tYXBwaW5nX3NlcXVlbmNlIi8+IGluIHRoZSBKUEEgT3ZlcnZpZXcgZm9yCitkZXRhaWxzIG9uIGRlZmluaW5nIDxsaXRlcmFsPlNlcXVlbmNlR2VuZXJhdG9yPC9saXRlcmFsPnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CitTZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2NvbmZfcGx1Z2lucyIvPiBmb3IgcGx1Z2luIHN0cmluZyBmb3JtYXR0aW5nLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlIGlkPSJyZWZfZ3VpZGVfc2VxdWVuY2VfbmFtZWQiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIE5hbWVkIFNlcSBTZXF1ZW5jZQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK0BFbnRpdHkKK0BUYWJsZShuYW1lPSJBVVRPIikKK3B1YmxpYyBjbGFzcyBBdXRob3IgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBnZW5lcmF0b3I9IkF1dGhvclNlcSIpCisgICAgQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IkF1dGhvclNlcSIgc2VxdWVuY2U9InRhYmxlKFRhYmxlPUFVVE9fU0VRLCBJbmNyZW1lbnQ9MTAwKSIpCisgICAgQENvbHVtbihuYW1lPSJBSUQiKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKyAKKyAgICAuLi4KK30KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8cGFyYT4KK05vdGUgdGhhdCBpZiB5b3Ugd2FudCB0byB1c2UgYSBwbHVnaW4gc3RyaW5nIHdpdGhvdXQgYW55IGFyZ3VtZW50cywgeW91IG11c3QKK3N0aWxsIHN1ZmZpeCB0aGUgcGx1Z2luIHR5cGUgd2l0aCA8bGl0ZXJhbD4oKTwvbGl0ZXJhbD4gdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tCithIHNlcXVlbmNlIG5hbWUgaW4gdGhlIDxsaXRlcmFsPiBTZXF1ZW5jZUdlbmVyYXRvci5zZXF1ZW5jZTwvbGl0ZXJhbD4gYXR0cmlidXRlOgorICAgICAgICAgICAgPC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IkF1dGhvclNlcSIsIHNlcXVlbmNlPSJ0YWJsZSgpIikKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CitPcGVuSlBBIG1haW50YWlucyBhIDxlbXBoYXNpcz5zeXN0ZW08L2VtcGhhc2lzPiBzZXF1ZW5jZSB0byBnZW5lcmF0ZSBkYXRhc3RvcmUKK2lkZW50aXR5IHZhbHVlcyBmb3IgY2xhc3NlcyB0aGF0IGRvIG5vdCBkZWNsYXJlIGEgc3BlY2lmaWMgZGF0YXN0b3JlIGlkZW50aXR5CitzdHJhdGVneS4gWW91IGNhbiBjb25maWd1cmUgdGhlIHN5c3RlbSBzZXF1ZW5jZSB0aHJvdWdoIHRoZQorPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5TZXF1ZW5jZSI+PGxpdGVyYWw+b3BlbmpwYS5TZXF1ZW5jZTwvbGl0ZXJhbD48L2xpbms+Citjb25maWd1cmF0aW9uIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IGFjY2VwdHMgYSBwbHVnaW4gc3RyaW5nIGRlc2NyaWJpbmcgYQorPGNsYXNzbmFtZT5TZXE8L2NsYXNzbmFtZT4gaW5zdGFuY2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9InJlZl9ndWlkZV9zZXF1ZW5jZV9zeXN0ZW1leCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgU3lzdGVtIFNlcXVlbmNlIENvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7cHJvcGVydHkgbmFtZT0ib3BlbmpwYS5TZXF1ZW5jZSIgdmFsdWU9InRhYmxlKFRhYmxlPU9QRU5KUEFTRVEsIEluY3JlbWVudD0xMDApIi8mZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxwYXJhPgorSW4gSlBBLCBzZXQgeW91ciA8bGl0ZXJhbD5HZW5lcmF0ZWRWYWx1ZTwvbGl0ZXJhbD4gYW5ub3RhdGlvbidzIDxsaXRlcmFsPgorc3RyYXRlZ3k8L2xpdGVyYWw+IGF0dHJpYnV0ZSB0byA8bGl0ZXJhbD5BVVRPPC9saXRlcmFsPiB0byB1c2UgdGhlIGNvbmZpZ3VyZWQKK3N5c3RlbSBzZXF1ZW5jZS4gT3IsIGJlY2F1c2UgPGxpdGVyYWw+QVVUTzwvbGl0ZXJhbD4gaXMgdGhlIGRlZmF1bHQgc3RyYXRlZ3ksCit1c2UgdGhlIGFubm90YXRpb24gd2l0aG91dCBhdHRyaWJ1dGVzOgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitAR2VuZXJhdGVkVmFsdWUKK3ByaXZhdGUgbG9uZyBpZDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxzZWN0aW9uIGlkPSJyZWZfZ3VpZGVfc2VxdWVuY2VfcnVudGltZSI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgUnVudGltZSBBY2Nlc3MKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aW5kZXh0ZXJtIHpvbmU9InJlZl9ndWlkZV9zZXF1ZW5jZV9ydW50aW1lIj4KKyAgICAgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UKKyAgICAgICAgICAgICAgICA8L3ByaW1hcnk+CisgICAgICAgICAgICAgICAgPHNlY29uZGFyeT4KKyAgICAgICAgICAgICAgICAgICAgcnVudGltZSBhY2Nlc3MKKyAgICAgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICAgICAgPHBhcmE+CitPcGVuSlBBIGFsbG93cyB5b3UgdG8gYWNjZXNzIG5hbWVkIGdlbmVyYXRvcnMgYXQgcnVudGltZSB0aHJvdWdoIHRoZQorPG1ldGhvZG5hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXIuZ2V0TmFtZWRHZW5lcmF0b3I8L21ldGhvZG5hbWU+IG1ldGhvZDoKKyAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3B1YmxpYyBHZW5lcmF0b3IgZ2V0TmFtZWRHZW5lcmF0b3IoU3RyaW5nIG5hbWUpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIHJldHVybmVkIAorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvcGVyc2lzdGVuY2UvR2VuZXJhdG9yLmh0bWwiPgorPGNsYXNzbmFtZT5vcmcuYXBhY2hlLm9wZW5qcGEucGVyc2lzdGVuY2UuR2VuZXJhdG9yPC9jbGFzc25hbWU+PC91bGluaz4gaXMgYQorZmFjYWRlIG92ZXIgYW4gaW50ZXJuYWwgT3BlbkpQQSA8Y2xhc3NuYW1lPlNlcTwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorVGhlIDxjbGFzc25hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gaW5jbHVkZXMgYWRkaXRpb25hbCBBUElzIHRvCityZXRyaWV2ZSB0aGUgaWRlbnRpdHkgZ2VuZXJhdG9yIG9mIGFueSBjbGFzcywgb3IgdGhlIGdlbmVyYXRvciBvZiBhbnkgZmllbGQuCitXaXRoIHRoZXNlIEFQSXMsIHlvdSBkbyBub3QgaGF2ZSB0byBrbm93IHRoZSBnZW5lcmF0b3IgbmFtZS4gQWRkaXRpb25hbGx5LCB0aGV5CithbGxvdyB5b3UgdG8gYWNjZXNzIHRoZSBpbXBsaWNpdCBnZW5lcmF0b3IgdXNlZCBieSBkZWZhdWx0IGZvciBkYXRhc3RvcmUKK2lkZW50aXR5IGNsYXNzZXMuIFNlZSB0aGUKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL3BlcnNpc3RlbmNlL09wZW5KUEFFbnRpdHlNYW5hZ2VyLmh0bWwiPgorSmF2YWRvYzwvdWxpbms+IGZvciB0aGUgPG1ldGhvZG5hbWU+IE9wZW5KUEFFbnRpdHlNYW5hZ2VyLmdldElkZW50aXR5R2VuZXJhdG9yCis8L21ldGhvZG5hbWU+IGFuZCA8bWV0aG9kbmFtZT5PcGVuSlBBRW50aXR5TWFuYWdlci5nZXRGaWVsZEdlbmVyYXRvcgorPC9tZXRob2RuYW1lPiBtZXRob2RzIGZvciBBUEkgZGV0YWlscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0icmVmX2d1aWRlX3J1bnRpbWVfcG1fZXZlbnQiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBUcmFuc2FjdGlvbiBFdmVudHMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGluZGV4dGVybSB6b25lPSJyZWZfZ3VpZGVfcnVudGltZV9wbV9ldmVudCI+CisgICAgICAgICAgICA8cHJpbWFyeT4KKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIDwvcHJpbWFyeT4KKyAgICAgICAgICAgIDxzZWNvbmRhcnk+CisgICAgICAgICAgICAgICAgZXZlbnRzCisgICAgICAgICAgICA8L3NlY29uZGFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxwYXJhPgorVGhlIE9wZW5KUEEgcnVudGltZSBzdXBwb3J0cyBicm9hZGNhc3RpbmcgdHJhbnNhY3Rpb24tcmVsYXRlZCBldmVudHMuIEJ5CityZWdpc3RlcmluZyBvbmUgb3IgbW9yZQorPHVsaW5rIHVybD0iLi4vamF2YWRvYy9vcmcvYXBhY2hlL29wZW5qcGEvZXZlbnQvVHJhbnNhY3Rpb25MaXN0ZW5lci5odG1sIj4KKzxjbGFzc25hbWU+b3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50LlRyYW5zYWN0aW9uTGlzdGVuZXI8L2NsYXNzbmFtZT48L3VsaW5rPiBzLAoreW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiB0cmFuc2FjdGlvbnMgYmVnaW4sIGZsdXNoLCByb2xsYmFjaywgY29tbWl0LAorYW5kIG1vcmUuIFdoZXJlIGFwcHJvcHJpYXRlLCBldmVudCBub3RpZmljYXRpb25zIGluY2x1ZGUgdGhlIHNldCBvZgorcGVyc2lzdGVuY2UtY2FwYWJsZSBvYmplY3RzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitwdWJsaWMgdm9pZCBhZGRUcmFuc2FjdGlvbkxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7CitwdWJsaWMgdm9pZCByZW1vdmVUcmFuc2FjdGlvbkxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cGFyYT4KK1RoZXNlIDxjbGFzc25hbWU+T3BlbkpQQUVudGl0eU1hbmFnZXI8L2NsYXNzbmFtZT4gbWV0aG9kcyBhbGxvdyB5b3UgdG8gYWRkIGFuZAorcmVtb3ZlIGxpc3RlbmVycy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KK0ZvciBkZXRhaWxzIG9uIHRoZSB0cmFuc2FjdGlvbiBmcmFtZXdvcmssIHNlZSB0aGUgPGxpdGVyYWw+CitvcmcuYXBhY2hlLm9wZW5qcGEuZXZlbnQ8L2xpdGVyYWw+IHBhY2thZ2UKKzx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2V2ZW50L3BhY2thZ2UuaHRtbCI+SmF2YWRvYzwvdWxpbms+LgorQWxzbyBzZWUgPHhyZWYgbGlua2VuZD0icmVmX2d1aWRlX2V2ZW50Ii8+IGZvciBhIGRlc2NyaXB0aW9uIG9mIE9wZW5KUEEncworcmVtb3RlIGV2ZW50IHN1cHBvcnQuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9InJlZl9ndWlkZV9lbnRlcnByaXNlX2Fic3RyYWN0c3RvcmUiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBOb24tUmVsYXRpb25hbCBTdG9yZXMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CitJdCBpcyBwb3NzaWJsZSB0byBhZGFwdCBPcGVuSlBBIHRvIGFjY2VzcyBhIG5vbi1yZWxhdGlvbmFsIGRhdGFzdG9yZSBieSBjcmVhdGluZworYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlCis8dWxpbmsgdXJsPSIuLi9qYXZhZG9jL29yZy9hcGFjaGUvb3BlbmpwYS9rZXJuZWwvU3RvcmVNYW5hZ2VyLmh0bWwiPjxsaXRlcmFsPgorb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5TdG9yZU1hbmFnZXI8L2xpdGVyYWw+PC91bGluaz4gaW50ZXJmYWNlLiBPcGVuSlBBCitwcm92aWRlcyBhbiBhYnN0cmFjdCA8bGl0ZXJhbD5TdG9yZU1hbmFnZXI8L2xpdGVyYWw+IGltcGxlbWVudGF0aW9uIHRvCitmYWNpbGl0YXRlIHRoaXMgcHJvY2Vzcy4gU2VlIHRoZSA8bGl0ZXJhbD5vcmcuYXBhY2hlLm9wZW5qcGEuYWJzdHJhY3RzdG9yZQorPC9saXRlcmFsPiBwYWNrYWdlIDx1bGluayB1cmw9Ii4uL2phdmFkb2Mvb3JnL2FwYWNoZS9vcGVuanBhL2Fic3RyYWN0c3RvcmUiPgorSmF2YWRvYzwvdWxpbms+IGZvciBkZXRhaWxzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvc2FtcGxlc19ndWlkZS54bWwgYi8xMDAwbXAxL29wZW5qcGEtcHJvamVjdC9zcmMvZG9jL21hbnVhbC9zYW1wbGVzX2d1aWRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjAyNDdiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvc2FtcGxlc19ndWlkZS54bWwKQEAgLTAsMCArMSwxODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGNoYXB0ZXIgaWQ9InNhbXBsZXNfZ3VpZGUiPgorICAgIDx0aXRsZT4KKyAgICAgICAgT3BlbkpQQSBTYW1wbGUgQ29kZQorICAgIDwvdGl0bGU+CisgICAgPHBhcmE+CitUaGUgT3BlbkpQQSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhIG51bWJlciBvZiBleGFtcGxlcyB0aGF0IGlsbHVzdHJhdGUgdGhlCit1c2FnZSBvZiB2YXJpb3VzIGZlYXR1cmVzLgorICAgIDwvcGFyYT4KKzwhLS0KK1RoaXMgaXMgaW5mb3JtYXRpb24gb24gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbi4gSXQgd2lsbCBiZSBpbmNsdWRlZAoraW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSBkb2Mvb3BlbmpwYS9zYW1wbGVzLWd1aWRlLnhtbCkuIEl0IHdpbGwgYWxzbworYXV0b21hdGljYWxseSBiZSBjb252ZXJ0ZWQgaW50byBhIFJFQURNRS50eHQgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeQoraW4gdGhlICJyZWxlYXNlLm9wZW5qcGEucmVsZWFzZWRvY3MiIGJ1aWxkIHRhcmdldCBwaGFzZSBvZiB0aGUgcmVsZWFzZS4KKy0tPgorICAgIDxzZWN0aW9uIGlkPSJzYW1wbGVzX2d1aWRlX2ludGVyb3AiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBKRE8gLSBKUEEgUGVyc2lzdGVuY2UgSW50ZXJvcGVyYWJpbGl0eQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8cGFyYT4KK1RoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY29tYmluZSBKRE8gYW5kIEpQQSBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbi4gVGhlCis8ZmlsZW5hbWU+TWFjaGluZU1haW4uamF2YTwvZmlsZW5hbWU+IHByb2dyYW0gdXNlcyBib3RoIDxjbGFzc25hbWU+CitFbnRpdHlNYW5hZ2VyPC9jbGFzc25hbWU+cyBhbmQgPGNsYXNzbmFtZT5QZXJzaXN0ZW5jZU1hbmFnZXI8L2NsYXNzbmFtZT5zIGluIGEKK3NpbmdsZSB0cmFuc2FjdGlvbiBpbmNsdWRpbmcgcGVyc2lzdCwgZGVsZXRlIGFuZCBxdWVyeSBvcGVyYXRpb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVGhlIHNhbXBsZSBpbmNsdWRlcyBib3RoIGFubm90YXRlZCBwZXJzaXN0ZW50IGNsYXNzZXMgYXMgd2VsbCBhcyBKRE9SIG1ldGFkYXRhCitpbmZvcm1hdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNhbiBzd2l0Y2ggdG8gZWl0aGVyIHN5c3RlbSBzaW1wbHkgYnkgY2hhbmdpbmcgdGhlCitib290c3RyYXAgbWVjaGFuaXNtLiBEZXBlbmRpbmcgb24gd2hpY2ggY29uZmlndXJhdGlvbiBzeXN0ZW0geW91IHVzZSwgT3BlbkpQQQord2lsbCByZWFkIHRoZSBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGZvcm1hdC4gWW91IGNhbiBvdmVycmlkZSBzb21lIG9yIGFsbCBvZgordGhpcyBiZWhhdmlvciB1c2luZyBPcGVuSlBBJ3MgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzdWNoIGFzCis8bGluayBsaW5rZW5kPSJvcGVuanBhLk1ldGFEYXRhRmFjdG9yeSI+b3BlbmpwYS5NZXRhRGF0YUZhY3Rvcnk8L2xpbms+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorVG8gdXNlIHRoaXMgc2FtcGxlLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IGVpdGhlciBhIDxmaWxlbmFtZT5qZG8ucHJvcGVydGllcworPC9maWxlbmFtZT4gb3IgPGZpbGVuYW1lPnBlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+IGFyZSBpbiB0aGUgPGZpbGVuYW1lPgorTUVUQS1JTkY8L2ZpbGVuYW1lPiBkaXJlY3RvcnkgaW4geW91ciA8ZW52YXI+Q0xBU1NQQVRIPC9lbnZhcj4uIFRoZSByZXN0IG9mIHRoZQorZmlsZXMgZm9yIHRoaXMgc2FtcGxlIGFyZSBsb2NhdGVkIGluIHRoZSA8ZmlsZW5hbWU+c2FtcGxlcy9taXhlZDwvZmlsZW5hbWU+CitkaXJlY3Rvcnkgb2YgdGhlIE9wZW5KUEEgaW5zdGFsbGF0aW9uLiBUaGlzIHR1dG9yaWFsIHJlcXVpcmVzIEpESyA1LiBUbyBydW4gdGhpcwordHV0b3JpYWw6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK0Vuc3VyZSB0aGF0IHlvdXIgZW52aXJvbm1lbnQgaXMgc2V0IHByb3Blcmx5IGFzIGRlc2NyaWJlZCBpbiB0aGUgUkVBRE1FIGFuZCB0aGF0Cit5b3VyIGN1cnJlbnQgcGF0aCBpcyBpbiB0aGUgbWl4ZWQgc2FtcGxlIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IG1heSB3YW50IHRvIGVkaXQgPGxpdGVyYWw+Q29ubmVjdGlvblVSTDwvbGl0ZXJhbD4gdG8gcG9pbnQgdG8gYW4gYWJzb2x1dGUKK1VSTCAoZS5nLiA8ZmlsZW5hbWU+Qzovb3BlbmpwYS9taXhlZC1zYW1wbGUtZGI8L2ZpbGVuYW1lPikgaWYgdXNpbmcgYQorZmlsZS1iYXNlZCBkYXRhYmFzZSBsaWtlIDxsaXRlcmFsPkhTUUw8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJbmNsdWRlIHRoZSBsaXN0IG9mIHBlcnNpc3RlbnQgY2xhc3NlcyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4gRm9yIEpQQSwgeW91Cit3aWxsIHdhbnQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gPGZpbGVuYW1lPnBlcnNpc3RlbmNlLnhtbDwvZmlsZW5hbWU+CitiZWZvcmUgdGhlIDxsaXRlcmFsPiZsdDtwcm9wZXJ0eSZndDs8L2xpdGVyYWw+IGxpbmVzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDtjbGFzcyZndDtzYW1wbGVzLm1peGVkLk1hY2hpbmUmbHQ7L2NsYXNzJmd0OworJmx0O2NsYXNzJmd0O3NhbXBsZXMubWl4ZWQuQ3JhbmUmbHQ7L2NsYXNzJmd0OworJmx0O2NsYXNzJmd0O3NhbXBsZXMubWl4ZWQuQnVsbGRvemVyJmx0Oy9jbGFzcyZndDsKKyZsdDtjbGFzcyZndDtzYW1wbGVzLm1peGVkLk9wZXJhdG9yJmx0Oy9jbGFzcyZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPHBhcmE+CitJZiB5b3UgYXJlIHVzaW5nIEpETywgcG9pbnQgdGhlIG1ldGFkYXRhIGZhY3RvcnkgYXQgdGhlIDxmaWxlbmFtZT4uamRvCis8L2ZpbGVuYW1lPiByZXNvdXJjZSBjb250YWluaW5nIHlvdXIgcGVyc2lzdGVudCBjbGFzc2VzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuTWV0YURhdGFGYWN0b3J5OiBSZXNvdXJjZXM9c2FtcGxlcy9taXhlZC9wYWNrYWdlLmpkbworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CitDb21waWxlIHRoZSBjbGFzc2VzOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzx1c2VyaW5wdXQ+amF2YWMgKi5qYXZhPC91c2VyaW5wdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1lvdSBzaG91bGQgdGhlbiBwcm9jZWVkIHRvIHBhc3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB5b3UgYXJlIHVzaW5nIHRvIHRoZQorZW5oYW5jZXI6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPHVzZXJpbnB1dD5qYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5lbmhhbmNlLlBDRW5oYW5jZXIgLXAgcGVyc2lzdGVuY2UueG1sIE1hY2hpbmUuamF2YSBDcmFuZS5qYXZhIEJ1bGxkb3plci5qYXZhCitPcGVyYXRvci5qYXZhPC91c2VyaW5wdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK1NpbWlsYXJseSwgeW91IHNob3VsZCBwYXNzIGluIHRoZSBzYW1lIGFyZ3VtZW50IHRvIDxsaXRlcmFsPm9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2w8L2xpdGVyYWw+OgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzx1c2VyaW5wdXQ+amF2YSBvcmcuYXBhY2hlLm9wZW5qcGEuamRiYy5tZXRhLk1hcHBpbmdUb29sIC1wIHBlcnNpc3RlbmNlLnhtbCAtYSBidWlsZFNjaGVtYSBNYWNoaW5lLmphdmEKK0NyYW5lLmphdmEgQnVsbGRvemVyLmphdmEgT3BlcmF0b3IuamF2YTwvdXNlcmlucHV0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KK29yCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorPHVzZXJpbnB1dD5qYXZhIG9yZy5hcGFjaGUub3BlbmpwYS5qZGJjLm1ldGEuTWFwcGluZ1Rvb2wgLXAgamRvLnByb3BlcnRpZXMgLWEgYnVpbGRTY2hlbWEgTWFjaGluZS5qYXZhIENyYW5lLmphdmEKK0J1bGxkb3plci5qYXZhIE9wZXJhdG9yLmphdmE8L3VzZXJpbnB1dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorWW91IGNhbiBub3cgcnVuIHRoZSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB3aGljaCBvcGVyYXRpb24KK3lvdSB3YW50IHRoZSBwcm9ncmFtIHRvIHJ1bi4gVGhlIHNlY29uZCBhcmd1bWVudCB0ZWxscyB0aGUgYXBwbGljYXRpb24gd2hpY2gKK2Jvb3RzdHJhcCBzeXN0ZW0gdG8gdXNlOgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKzx1c2VyaW5wdXQ+amF2YSBzYW1wbGVzLm1peGVkLk1hY2hpbmVNYWluICZsdDtjcmVhdGUgfCBkZWxldGUmZ3Q7ICZsdDtqZG8gfAoranBhJmd0OzwvdXNlcmlucHV0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ic2FtcGxlc19ndWlkZV9qcGFkaXYiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBKUEEKKyAgICAgICAgPC90aXRsZT4KKzwhLS0KK1RoaXMgaXMgaW5mb3JtYXRpb24gb24gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbi4gSXQgd2lsbCBiZSBpbmNsdWRlZAoraW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSBkb2Mvb3BlbmpwYS9zYW1wbGVzLWd1aWRlLnhtbCkuIEl0IHdpbGwgYWxzbworYXV0b21hdGljYWxseSBiZSBjb252ZXJ0ZWQgaW50byBhIFJFQURNRS50eHQgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeQoraW4gdGhlICJyZWxlYXNlLmpkby5yZWxlYXNlZG9jcyIgYnVpbGQgdGFyZ2V0IHBoYXNlIG9mIHRoZSByZWxlYXNlLgorLS0+CisgICAgICAgIDxzZWN0aW9uIGlkPSJzYW1wbGVzX2d1aWRlX21vZGVsX2h1bXJlc19qcGEiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIFNhbXBsZSBIdW1hbiBSZXNvdXJjZXMgTW9kZWwKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KK1RoZSBmaWxlcyBmb3IgdGhpcyBzYW1wbGUgYXJlIGxvY2F0ZWQgaW4gdGhlIDxmaWxlbmFtZT4KK3NhbXBsZXMvcGVyc2lzdGVuY2UvbW9kZWxzL2h1bXJlczwvZmlsZW5hbWU+IGRpcmVjdG9yeSBvZiB0aGUgT3BlbkpQQQoraW5zdGFsbGF0aW9uLiBUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIG1hcHBpbmcgb2YgYW4gZXhhbXBsZSAiSHVtYW4KK1Jlc291cmNlcyIgc2NoZW1hLiBUaGUgZm9sbG93aW5nIGNvbmNlcHRzIGFyZSBpbGx1c3RyYXRlZCBpbiB0aGlzIHNhbXBsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1ZhbHVlIE1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPbmUgdG8gT25lIE1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPbmUgdG8gTWFueSBNYXBwaW5ncyAod2l0aCBhbmQgd2l0aG91dCBpbnZlcnNlcykKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3N1cHBvcnRlZF9kYXRhYmFzZXMueG1sIGIvMTAwMG1wMS9vcGVuanBhLXByb2plY3Qvc3JjL2RvYy9tYW51YWwvc3VwcG9ydGVkX2RhdGFiYXNlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjNzg0YgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS1wcm9qZWN0L3NyYy9kb2MvbWFudWFsL3N1cHBvcnRlZF9kYXRhYmFzZXMueG1sCkBAIC0wLDAgKzEsOTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxhcHBlbmRpeCBpZD0ic3VwcG9ydGVkX2RhdGFiYXNlcyI+CisgICAgPHRpdGxlPgorICAgICAgICBTdXBwb3J0ZWQgRGF0YWJhc2VzCisgICAgPC90aXRsZT4KKyAgICA8cGFyYT4KK0ZvbGxvd2luZyBpcyBhIHRhYmxlIG9mIHRoZSBkYXRhYmFzZSBhbmQgSkRCQyBkcml2ZXIgdmVyc2lvbnMgdGhhdCBhcmUgc3VwcG9ydGVkCitieSBPcGVuSlBBLgorICAgIDwvcGFyYT4KKyAgICA8dGFibGUgdG9jZW50cnk9IjEiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBTdXBwb3J0ZWQgRGF0YWJhc2VzIGFuZCBKREJDIERyaXZlcnMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPHRncm91cCByb3dzZXA9IjEiIGNvbHNlcD0iMSIgYWxpZ249ImxlZnQiIGNvbHM9IjQiPgorICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0iZGJuYW1lIi8+CisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJkYnZlcnNpb24iLz4KKyAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9ImRyaXZuYW1lIi8+CisgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSJkcml2dmVyc2lvbiIvPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2UgTmFtZQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlIFZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgRHJpdmVyIE5hbWUKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgRHJpdmVyIFZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgRGVyYnkKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxMC4xLjIuMQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIERlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxMC4xLjIuMQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgQm9ybGFuZCBJbnRlcmJhc2UKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA3LjEuMC4yMDIKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVyY2xpZW50CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA0LjUuMQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgQm9ybGFuZCBKRGF0YVN0b3JlCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgNi4wCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBCb3JsYW5kIEpEYXRhU3RvcmUKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDYuMAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgREIyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOC4xCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBJQk0gREIyIEpEQkMgVW5pdmVyc2FsIERyaXZlcgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgMS4wLjU4MQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgRW1wcmVzcworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDguNjIKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVtcHJlc3MgQ2F0ZWdvcnkgMiBKREJDIERyaXZlcgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOC42MgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgRmlyZWJpcmQKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxLjUKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEpheUJpcmQgSkNBL0pEQkMgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxLjAuMQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgSDIgRGF0YWJhc2UgRW5naW5lCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgMS4wCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBIMgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgMS4wCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBIeXBlcnNvbmljIERhdGFiYXNlIEVuZ2luZQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDEuOC4wCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBIeXBlcnNvbmljCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxLjguMAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtaXggRHluYW1pYyBTZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA5LjMwLlVDMTAKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWl4IEpEQkMgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAyLjIxLkpDMgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJTeXN0ZW1zIENhY2hlCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgNS4wCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBKREJDIERyaXZlcgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgNS4wCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOS4wIChhLmsuYS4gIjIwMDAiKQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YURpcmVjdCBTZXF1ZUxpbmsKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDUuNC4wMDM4CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgU1FMIFNlcnZlcgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDkuMDAuMTM5OSAoU1FMIFNlcnZlciAyMDA1KQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgU1FMU2VydmVyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxLjAuODA5LjEwMgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGb3hQcm8KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA3LjAKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFEaXJlY3QgU2VxdWVMaW5rCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA1LjQuMDAzOAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgTXlTUUwKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAzLjIzLjQzLWxvZworICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgTXlTUUwgRHJpdmVyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAzLjAuMTQKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIE15U1FMCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgNS4wLjI2CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBNeVNRTCBEcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDMuMC4xNAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgT3JhY2xlCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOC4xLDkuMiwxMC4xCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBPcmFjbGUgSkRCQyBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDEwLjIuMC4xLjAKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50YmFzZQorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZGJ2ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDQuNAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRiYXNlIEpEQkMgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2dmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA0LjQgKDQuNCkgCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBQb3N0Z3JlU1FMCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgNy4yLjEKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RncmVTUUwgTmF0aXZlIERyaXZlcgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOC4xCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBQb3N0Z3JlU1FMCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkYnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOC4xLjUKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRyaXZuYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RncmVTUUwgTmF0aXZlIERyaXZlcgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgOC4xCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRibmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBTeWJhc2UgQWRhcHRpdmUgU2VydmVyIEVudGVycHJpc2UKKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGNvbG5hbWU9ImRidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAxMi41CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBjb2xuYW1lPSJkcml2bmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICBqQ29ubmVjdAorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnkgY29sbmFtZT0iZHJpdnZlcnNpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgNS41ICg1LjUpCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfZGVyYnkiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBBcGFjaGUgRGVyYnkKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfZGVyYnkiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgRGVyYnkKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiBvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogamRiYzpkZXJieTpEQl9OQU1FO2NyZWF0ZT10cnVlCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfaW50ZXJiYXNlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgQm9ybGFuZCBJbnRlcmJhc2UKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfaW50ZXJiYXNlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIHByb3BlcnRpZXMgZm9yIEludGVyYmFzZQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IGludGVyYmFzZS5pbnRlcmNsaWVudC5Ecml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogamRiYzppbnRlcmJhc2U6Ly9TRVJWRVJfTkFNRTpTRVJWRVJfUE9SVC9EQl9QQVRICis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfaW50ZXJiYXNlX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggSW50ZXJiYXNlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorSW50ZXJiYXNlIGRvZXMgbm90IHN1cHBvcnQgcmVjb3JkIGxvY2tpbmcsIHNvCitkYXRhc3RvcmUgdHJhbnNhY3Rpb25zIGNhbm5vdCB1c2UgdGhlIHBlc3NpbWlzdGljIGxvY2sgbWFuYWdlci4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0ludGVyYmFzZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8bGl0ZXJhbD5MT1dFUjwvbGl0ZXJhbD4sIDxsaXRlcmFsPlNVQlNUUklORworPC9saXRlcmFsPiwgb3IgPGxpdGVyYWw+SU5TVFI8L2xpdGVyYWw+IFNRTCBmdW5jdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9qZGF0YXN0b3JlIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSkRhdGFTdG9yZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0iZXhhbXBsZV9wcm9wc19qZGF0YXN0b3JlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIHByb3BlcnRpZXMgZm9yIEpEYXRhU3RvcmUKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiBjb20uYm9ybGFuZC5kYXRhc3RvcmUuamRiYy5EYXRhU3RvcmVEcml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogamRiYzpib3JsYW5kOmRzbG9jYWw6ZGItamRhdGFzdG9yZS5qZHM7Y3JlYXRlPXRydWUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9kYjIiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBJQk0gREIyCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJleGFtcGxlX3Byb3BzX2RiMiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRXhhbXBsZSBwcm9wZXJ0aWVzIGZvciBJQk0gREIyCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorb3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTogY29tLmlibS5kYjIuamNjLkRCMkRyaXZlcgorb3BlbmpwYS5Db25uZWN0aW9uVVJMOiBqZGJjOmRiMjovL1NFUlZFUl9OQU1FOlNFUlZFUl9QT1JUL0RCX05BTUUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9kYjJfaXNzdWVzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBLbm93biBpc3N1ZXMgd2l0aCBEQjIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGbG9hdHMgYW5kIGRvdWJsZXMgbWF5IGxvc2UgcHJlY2lzaW9uIHdoZW4gc3RvcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRW1wdHkgY2hhciB2YWx1ZXMgYXJlIHN0b3JlZCBhcyBOVUxMLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRmllbGRzIG9mIHR5cGUgQkxPQiBhbmQgQ0xPQiBhcmUgbGltaXRlZCB0byAxTS4gVGhpcyBudW1iZXIgY2FuIGJlIGluY3JlYXNlZCBieQorZXh0ZW5kaW5nIDxjbGFzc25hbWU+REIyRGljdGlvbmFyeTwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X2VtcHJlc3MiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBFbXByZXNzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJleGFtcGxlX3Byb3BzX2VtcHJlc3MiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgRW1wcmVzcworICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IGVtcHJlc3MuamRiYy5lbXByZXNzRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IGpkYmM6ZW1wcmVzczovL1NFUlZFUj15b3Vyc2VydmVyO1BPUlQ9NjMyMjtEQVRBQkFTRT15b3VyZGIKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9lbXByZXNzX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggRW1wcmVzcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0VtcHJlc3MgZW5mb3JjZXMgcGVzc2ltaXN0aWMgc2VtYW50aWNzIChsb2NrIG9uCityZWFkKSB3aGVuIG5vdCB1c2luZyA8bGl0ZXJhbD5BbGxvd0NvbmN1cnJlbnRSZWFkPC9saXRlcmFsPiBwcm9wZXJ0eSAod2hpY2gKK2J5cGFzc2VzIHJvdyBsb2NraW5nKSBmb3IgPGNsYXNzbmFtZT5FbXByZXNzRGljdGlvbmFyeTwvY2xhc3NuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK09ubHkgdGhlIGNhdGVnb3J5IDIgbm9uLWxvY2FsIGRyaXZlciBpcyBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9oMiI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEgyIERhdGFiYXNlIEVuZ2luZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0iZXhhbXBsZV9wcm9wc19oMiI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRXhhbXBsZSBwcm9wZXJ0aWVzIGZvciBIMiBEYXRhYmFzZSBFbmdpbmUKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiBvcmcuaDIuRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IGpkYmM6aDI6REJfTkFNRQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X2gyX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggSDIgRGF0YWJhc2UgRW5naW5lCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorSDIgZG9lcyBub3Qgc3VwcG9ydCBjcm9zcyBqb2lucworICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfaHlwZXJzb25pYyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEh5cGVyc29uaWMKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfaHlwZXJzb25pYyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRXhhbXBsZSBwcm9wZXJ0aWVzIGZvciBIeXBlcnNvbmljCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorb3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTogb3JnLmhzcWxkYi5qZGJjRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IGpkYmM6aHNxbGRiOkRCX05BTUUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9oeXBlcnNvbmljX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggSHlwZXJzb25pYworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0h5cGVyc29uaWMgZG9lcyBub3Qgc3VwcG9ydCBwZXNzaW1pc3RpYyBsb2NraW5nLCBzbyBub24tb3B0aW1pc3RpYyB0cmFuc2FjdGlvbnMKK3dpbGwgZmFpbCB1bmxlc3MgdGhlIDxsaXRlcmFsPlNpbXVsYXRlTG9ja2luZzwvbGl0ZXJhbD4gcHJvcGVydHkgaXMgc2V0IGZvciB0aGUKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkiPiBvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5PC9saW5rPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfZmlyZWJpcmQiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBGaXJlYmlyZAorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0iZXhhbXBsZV9wcm9wc19maXJlYmlyZCI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRXhhbXBsZSBwcm9wZXJ0aWVzIGZvciBGaXJlYmlyZAorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IG9yZy5maXJlYmlyZHNxbC5qZGJjLkZCRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IGpkYmM6ZmlyZWJpcmRzcWw6Ly9TRVJWRVJfTkFNRTpTRVJWRVJfUE9SVC9EQl9QQVRICis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfZmlyZWJpcmRfaXNzdWVzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBLbm93biBpc3N1ZXMgd2l0aCBGaXJlYmlyZAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0ZpcmViaXJkIGRvZXMgbm90IHN1cHBvcnQgYXV0by1pbmNyZW1lbnQgY29sdW1ucy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0ZpcmViaXJkIGRvZXMgbm90IHN1cHBvcnQgdGhlIDxsaXRlcmFsPkxPV0VSPC9saXRlcmFsPiwgPGxpdGVyYWw+U1VCU1RSSU5HCis8L2xpdGVyYWw+LCBvciA8bGl0ZXJhbD5JTlNUUjwvbGl0ZXJhbD4gU1FMIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X2luZm9ybWl4Ij4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgSW5mb3JtaXgKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfaW5mb3JtaXgiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgSW5mb3JtaXggRHluYW1pYyBTZXJ2ZXIKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiBjb20uaW5mb3JtaXguamRiYy5JZnhEcml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogXAorICBqZGJjOmluZm9ybWl4LXNxbGk6Ly9TRVJWRVJfTkFNRTpTRVJWRVJfUE9SVC9EQl9OQU1FOklORk9STUlYU0VSVkVSPVNFUlZFUl9JRAorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X2luZm9ybWl4X2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggSW5mb3JtaXgKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitOb25lCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9pbnRlcnN5c3RlbXNfY2FjaGUiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBJbnRlclN5c3RlbXMgQ2FjaGUKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfaW50ZXJzeXN0ZW1zX2NhY2hlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIHByb3BlcnRpZXMgZm9yIEludGVyU3lzdGVtcyBDYWNoZQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IGNvbS5pbnRlcnN5cy5qZGJjLkNhY2hlRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IGpkYmM6Q2FjaGU6Ly9TRVJWRVJfTkFNRTpTRVJWRVJfUE9SVC9EQl9OQU1FCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfaW50ZXJzeXN0ZW1zX2NhY2hlX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggSW50ZXJTeXN0ZW1zIENhY2hlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorU3VwcG9ydCBmb3IgQ2FjaGUgaXMgZG9uZSB2aWEgU1FMIGFjY2VzcyBvdmVyIEpEQkMsIG5vdCB0aHJvdWdoIHRoZWlyIG9iamVjdCAKK2RhdGFiYXNlIEFQSXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9hY2Nlc3MiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBNaWNyb3NvZnQgQWNjZXNzCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJleGFtcGxlX3Byb3BzX2FjY2VzcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgRXhhbXBsZSBwcm9wZXJ0aWVzIGZvciBNaWNyb3NvZnQgQWNjZXNzCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorb3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTogY29tLmRkdGVrLmpkYmMuc2VxdWVsaW5rLlNlcXVlTGlua0RyaXZlcgorb3BlbmpwYS5Db25uZWN0aW9uVVJMOiBqZGJjOnNlcXVlbGluazovL1NFUlZFUl9OQU1FOlNFUlZFUl9QT1JUCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfYWNjZXNzX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggTWljcm9zb2Z0IEFjY2VzcworICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1VzaW5nIHRoZSBTdW4gSkRCQy1PREJDIGJyaWRnZSB0byBjb25uZWN0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9zcWxzZXJ2ZXIiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBNaWNyb3NvZnQgU1FMIFNlcnZlcgorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0iZXhhbXBsZV9wcm9wc19zcWxzZXJ2ZXIiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgTWljcm9zb2Z0IFNRTFNlcnZlcgorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IGNvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IFwKKyAgICBqZGJjOnNxbHNlcnZlcjovL1NFUlZFUl9OQU1FOjE0MzM7RGF0YWJhc2VOYW1lPURCX05BTUU7c2VsZWN0TWV0aG9kPWN1cnNvcjtzZW5kU3RyaW5nUGFyYW1ldGVyc0FzVW5pY29kZT1mYWxzZQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X3NxbHNlcnZlcl9pc3N1ZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEtub3duIGlzc3VlcyB3aXRoIFNRTCBTZXJ2ZXIKKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitTUUwgU2VydmVyIGRhdGUgZmllbGRzIGFyZSBhY2N1cmF0ZSBvbmx5IHRvIHRoZSBuZWFyZXN0IDMgbWlsbGlzZWNvbmRzLCAKK3Bvc3NpYmx5IHJlc3VsdGluZyBpbiBwcmVjaXNpb24gbG9zcyBpbiBzdG9yZWQgZGF0ZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgQ29ubmVjdGlvblVSTCBtdXN0IGFsd2F5cyBjb250YWluIHRoZSAiIDxsaXRlcmFsPnNlbGVjdE1ldGhvZD1jdXJzb3IKKzwvbGl0ZXJhbD4gIiBzdHJpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitBZGRpbmcgPGxpdGVyYWw+c2VuZFN0cmluZ1BhcmFtZXRlcnNBc1VuaWNvZGU9ZmFsc2U8L2xpdGVyYWw+IHRvIHRoZQorQ29ubmVjdGlvblVSTCBtYXkgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1RoZSBNaWNyb3NvZnQgU1FMIFNlcnZlciBkcml2ZXIgb25seSBlbXVsYXRlcyBiYXRjaCB1cGRhdGVzLiBUaGUgRGF0YURpcmVjdCBKREJDCitkcml2ZXIgaGFzIHRydWUgc3VwcG9ydCBmb3IgYmF0Y2ggdXBkYXRlcywgYW5kIG1heSByZXN1bHQgaW4gYSBzaWduaWZpY2FudAorcGVyZm9ybWFuY2UgZ2Fpbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0Zsb2F0cyBhbmQgZG91YmxlcyBtYXkgbG9zZSBwcmVjaXNpb24gd2hlbiBzdG9yZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Cis8bGl0ZXJhbD5URVhUPC9saXRlcmFsPiBjb2x1bW5zIGNhbm5vdCBiZSB1c2VkIGluIHF1ZXJpZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIHVzaW5nIGEgU1FMIFNlcnZlciBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gYmUgY2FzZS1zZW5zaXRpdmUKK2luIHNjaGVtYSBuYW1lcywgeW91IG5lZWQgdG8gc2V0IHRoZSAic2NoZW1hQ2FzZT1wcmVzZXJ2ZSIgcGFyYW1ldGVyIGluIHRoZSAKKzxsaW5rIGxpbmtlbmQ9Im9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnkiPm9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnk8L2xpbms+Citwcm9wZXJ0eS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X2ZveHBybyI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIE1pY3Jvc29mdCBGb3hQcm8KKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfZm94cHJvIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIHByb3BlcnRpZXMgZm9yIE1pY3Jvc29mdCBGb3hQcm8KKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiBjb20uZGR0ZWsuamRiYy5zZXF1ZWxpbmsuU2VxdWVMaW5rRHJpdmVyCitvcGVuanBhLkNvbm5lY3Rpb25VUkw6IGpkYmM6c2VxdWVsaW5rOi8vU0VSVkVSX05BTUU6U0VSVkVSX1BPUlQKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9mb3hwcm9faXNzdWVzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBLbm93biBpc3N1ZXMgd2l0aCBNaWNyb3NvZnQgRm94UHJvCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorVXNpbmcgdGhlIFN1biBKREJDLU9EQkMgYnJpZGdlIHRvIGNvbm5lY3QgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X215c3FsIj4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgTXlTUUwKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfbXlzcWwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgTXlTUUwKKyAgICAgICAgICAgIDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitvcGVuanBhLkNvbm5lY3Rpb25Ecml2ZXJOYW1lOiBjb20ubXlzcWwuamRiYy5Ecml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogamRiYzpteXNxbDovL1NFUlZFUl9OQU1FL0RCX05BTUUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9teXNxbF9pc3N1ZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEtub3duIGlzc3VlcyB3aXRoIE15U1FMCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiAKK1RoZSBkZWZhdWx0IHRhYmxlIHR5cGVzIHRoYXQgTXlTUUwgdXNlcyBkbyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMsIHdoaWNoIHdpbGwKK3ByZXZlbnQgT3BlbkpQQSBmcm9tIGJlaW5nIGFibGUgdG8gcm9sbCBiYWNrIHRyYW5zYWN0aW9ucy4gVXNlIHRoZSAKKzxsaXRlcmFsPklubm9EQjwvbGl0ZXJhbD4gdGFibGUgdHlwZSBmb3IgYW55IHRhYmxlcyB0aGF0IE9wZW5KUEEgd2lsbCBhY2Nlc3MuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitNeVNRTCBkb2VzIG5vdCBzdXBwb3J0IHN1Yi1zZWxlY3RzIGluIHZlcnNpb25zIHByaW9yIHRvIDQuMSwgYW5kIGFyZSBkaXNhYmxlZCBieQorZGVmYXVsdC4gU29tZSBvcGVyYXRpb25zIChzdWNoIGFzIHRoZSA8ZnVuY3Rpb24+aXNFbXB0eSgpPC9mdW5jdGlvbj4gbWV0aG9kIGluIGEKK3F1ZXJ5KSB3aWxsIGZhaWwgZHVlIHRvIHRoaXMuIElmIHlvdSBhcmUgdXNpbmcgTXlTUUwgNC4xIG9yIGxhdGVyLCB5b3UgY2FuIGxpZnQKK3RoaXMgcmVzdHJpY3Rpb24gYnkgc2V0dGluZyB0aGUgPGxpdGVyYWw+U3VwcG9ydHNTdWJzZWxlY3Q9dHJ1ZTwvbGl0ZXJhbD4KK3BhcmFtZXRlciBvZiB0aGUgPGxpbmsgbGlua2VuZD0ib3BlbmpwYS5qZGJjLkRCRGljdGlvbmFyeSI+CitvcGVuanBhLmpkYmMuREJEaWN0aW9uYXJ5PC9saW5rPiBwcm9wZXJ0eS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK1JvbGxiYWNrIGR1ZSB0byBkYXRhYmFzZSBlcnJvciBvciBvcHRpbWlzdGljIGxvY2sgdmlvbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKK3VubGVzcyB0aGUgdGFibGUgdHlwZSBpcyBvbmUgb2YgdGhlIE15U1FMIHRyYW5zYWN0aW9uYWwgdHlwZXMuIEV4cGxpY2l0IGNhbGxzIHRvCis8ZnVuY3Rpb24+cm9sbGJhY2soKTwvZnVuY3Rpb24+IGJlZm9yZSBhIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZCwKK2hvd2V2ZXIsIGFyZSBhbHdheXMgc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRmxvYXRzIGFuZCBkb3VibGVzIG1heSBsb3NlIHByZWNpc2lvbiB3aGVuIHN0b3JlZCBpbiBzb21lIGRhdGFzdG9yZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitXaGVuIHN0b3JpbmcgYSBmaWVsZCBvZiB0eXBlIDxjbGFzc25hbWU+amF2YS5tYXRoLkJpZ0RlY2ltYWw8L2NsYXNzbmFtZT4sIHNvbWUKK2RhdGFzdG9yZXMgd2lsbCBhZGQgZXh0cmFuZW91cyB0cmFpbGluZyAwIGNoYXJhY3RlcnMsIGNhdXNpbmcgYW4gZXF1YWxpdHkKK21pc21hdGNoIGJldHdlZW4gdGhlIGZpZWxkIHRoYXQgaXMgc3RvcmVkIGFuZCB0aGUgZmllbGQgdGhhdCBpcyByZXRyaWV2ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitTb21lIHZlcnNpb24gb2YgdGhlIE15U1FMIEpEQkMgZHJpdmVyIGhhdmUgYSBidWcgdGhhdCBwcmV2ZW50cyBPcGVuSlBBIGZyb20KK2JlaW5nIGFibGUgdG8gaW50ZXJyb2dhdGUgdGhlIGRhdGFiYXNlIGZvciBmb3JlaWduIGtleXMuIFZlcnNpb24gMy4wLjE0IChvcgoraGlnaGVyKSBvZiB0aGUgTXlTUUwgZHJpdmVyIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhpcyBidWcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9vcmFjbGUiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBPcmFjbGUKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfb3JhY2xlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIHByb3BlcnRpZXMgZm9yIE9yYWNsZQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IG9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogamRiYzpvcmFjbGU6dGhpbjpAU0VSVkVSX05BTUU6MTUyMTpEQl9OQU1FCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfb3JhY2xlX3F1ZXJ5X2hpbnRzIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBVc2luZyBRdWVyeSBIaW50cyB3aXRoIE9yYWNsZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorT3JhY2xlIGhhcyBzdXBwb3J0IGZvciAicXVlcnkgaGludHMiLCB3aGljaCBhcmUgZm9ybWF0dGVkIGNvbW1lbnRzIGVtYmVkZGVkIGluCitTUUwgdGhhdCBwcm92aWRlIHNvbWUgaGludCBmb3IgaG93IHRoZSBxdWVyeSBzaG91bGQgYmUgZXhlY3V0ZWQuIFRoZXNlIGhpbnRzIGFyZQordXN1YWxseSBkZXNpZ25lZCB0byBwcm92aWRlIHN1Z2dlc3Rpb25zIHRvIHRoZSBPcmFjbGUgcXVlcnkgb3B0aW1pemVyIGZvciBob3cgdG8KK2VmZmljaWVudGx5IHBlcmZvcm0gYSBjZXJ0YWlubHkgcXVlcnksIGFuZCBhcmVuJ3QgdHlwaWNhbGx5IG5lZWRlZCBmb3IgYW55IGJ1dAordGhlIG1vc3QgaW50ZW5zaXZlIHF1ZXJpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSBpZD0iZGJzdXBwb3J0X29yYWNsZV9xdWVyeV9oaW50c19leCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICBVc2luZyBPcmFjbGUgSGludHMKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorUXVlcnkgcXVlcnkgPSBlbS5jcmVhdGVRdWVyeSguLi4pOworcXVlcnkuc2V0SGludCgib3BlbmpwYS5oaW50Lk9yYWNsZVNlbGVjdEhpbnQiLCAiLyorIGZpcnN0X3Jvd3MoMTAwKSAqLyIpOworTGlzdCByZXN1bHRzID0gcXVlcnkuZ2V0UmVzdWx0TGlzdCgpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X29yYWNsZV9pc3N1ZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEtub3duIGlzc3VlcyB3aXRoIE9yYWNsZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4gCitUaGUgT3JhY2xlIEpEQkMgZHJpdmVyIGhhcyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucy4gCitJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBvZmZpY2lhbGx5IHN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgCisoMTAuMi4wLjEuMCksIHdoaWNoIGlzIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgT3JhY2xlCitzZXJ2ZXIuIEl0IGNhbiBiZSBkb3dubG9hZGVkIGZyb20gCis8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5vbG9neS9zb2Z0d2FyZS90ZWNoL2phdmEvc3Fsal9qZGJjL2h0ZG9jcy9qZGJjMTAxMDQwLmh0bWwiPgoraHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2hub2xvZ3kvc29mdHdhcmUvdGVjaC9qYXZhL3NxbGpfamRiYy9odGRvY3MvamRiYzEwMTA0MC5odG1sPC91bGluaz4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitGb3IgVkFSQ0hBUiBmaWVsZHMsIDxsaXRlcmFsPm51bGw8L2xpdGVyYWw+IGFuZCBhIGJsYW5rIHN0cmluZyBhcmUgZXF1aXZhbGVudC4KK1RoaXMgbWVhbnMgdGhhdCBhbiBvYmplY3QgdGhhdCBzdG9yZXMgYSBudWxsIHN0cmluZyBmaWVsZCB3aWxsIGhhdmUgaXQgZ2V0IHJlYWQKK2JhY2sgYXMgYSBibGFuayBzdHJpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPcmFjbGUgY29ycCdzIEpEQkMgZHJpdmVyIGZvciBPcmFjbGUgaGFzIG9ubHkgbGltaXRlZCBzdXBwb3J0IGZvciBiYXRjaCB1cGRhdGVzLgorVGhlIHJlc3VsdCBmb3IgT3BlbkpQQSBpcyB0aGF0IGluIHNvbWUgY2FzZXMsIHRoZSBleGFjdCBvYmplY3QgdGhhdCBmYWlsZWQgYW4KK29wdGltaXN0aWMgbG9jayBjaGVjayBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgYW5kIE9wZW5KUEEgd2lsbCB0aHJvdyBhbgorPGNsYXNzbmFtZT5PcHRpbWlzdGljVmVyaWZpY2F0aW9uRXhjZXB0aW9uPC9jbGFzc25hbWU+IHdpdGggbW9yZSBmYWlsZWQgb2JqZWN0cwordGhhbiBhY3R1YWxseSBmYWlsZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitPcmFjbGUgY2Fubm90IHN0b3JlIG51bWJlcnMgd2l0aCBtb3JlIHRoYW4gMzggZGlnaXRzIGluIG51bWVyaWMgY29sdW1ucy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0Zsb2F0cyBhbmQgZG91YmxlcyBtYXkgbG9zZSBwcmVjaXNpb24gd2hlbiBzdG9yZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitDTE9CIGNvbHVtbnMgY2Fubm90IGJlIHVzZWQgaW4gcXVlcmllcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X3BvaW50YmFzZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFBvaW50YmFzZQorICAgICAgICA8L3RpdGxlPgorICAgICAgICA8ZXhhbXBsZSBpZD0iZXhhbXBsZV9wcm9wc19wb2ludGJhc2UiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgUG9pbnRiYXNlCisgICAgICAgICAgICA8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorb3BlbmpwYS5Db25uZWN0aW9uRHJpdmVyTmFtZTogY29tLnBvaW50YmFzZS5qZGJjLmpkYmNVbml2ZXJzYWxEcml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogXAorICAgIGpkYmM6cG9pbnRiYXNlOkRCX05BTUUsZGF0YWJhc2UuaG9tZT1wb2ludGJhc2VkYixjcmVhdGU9dHJ1ZSxjYWNoZS5zaXplPTEwMDAwLGRhdGFiYXNlLnBhZ2VzaXplPTMwNzIwCis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxzZWN0aW9uIGlkPSJkYnN1cHBvcnRfcG9pbnRiYXNlX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggUG9pbnRiYXNlCisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiAKK0ZpZWxkcyBvZiB0eXBlIEJMT0IgYW5kIENMT0IgYXJlIGxpbWl0ZWQgdG8gMU0uICBTZXQgdGhlIDxsaXRlcmFsPkJsb2JUeXBlTmFtZQorPC9saXRlcmFsPiBhbmQvb3IgPGxpdGVyYWw+Q2xvYlR5cGVOYW1lPC9saXRlcmFsPiBwcm9wZXJ0aWVzIG9mIHRoZSAKKzxsaXRlcmFsPm9wZW5qcGEuamRiYy5EQkRpY3Rpb25hcnk8L2xpdGVyYWw+IHNldHRpbmcgdG8gb3ZlcnJpZGUuICAKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X3Bvc3RncmVzcWwiPgorICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBQb3N0Z3JlU1FMCisgICAgICAgIDwvdGl0bGU+CisgICAgICAgIDxleGFtcGxlIGlkPSJleGFtcGxlX3Byb3BzX3Bvc3RncmVzcWwiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgcHJvcGVydGllcyBmb3IgUG9zdGdyZVNRTAorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IG9yZy5wb3N0Z3Jlc3FsLkRyaXZlcgorb3BlbmpwYS5Db25uZWN0aW9uVVJMOiBqZGJjOnBvc3RncmVzcWw6Ly9TRVJWRVJfTkFNRTo1NDMyL0RCX05BTUUKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHNlY3Rpb24gaWQ9ImRic3VwcG9ydF9wb3N0Z3Jlc3FsX2lzc3VlcyI+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgS25vd24gaXNzdWVzIHdpdGggUG9zdGdyZVNRTAorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KK0Zsb2F0cyBhbmQgZG91YmxlcyBtYXkgbG9zZSBwcmVjaXNpb24gd2hlbiBzdG9yZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitQb3N0Z3JlU1FMIGNhbm5vdCBzdG9yZSB2ZXJ5IGxvdyBhbmQgdmVyeSBoaWdoIGRhdGVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRW1wdHkgc3RyaW5nL2NoYXIgdmFsdWVzIGFyZSBzdG9yZWQgYXMgTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X3N5YmFzZSI+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIFN5YmFzZSBBZGFwdGl2ZSBTZXJ2ZXIKKyAgICAgICAgPC90aXRsZT4KKyAgICAgICAgPGV4YW1wbGUgaWQ9ImV4YW1wbGVfcHJvcHNfc3liYXNlIj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIHByb3BlcnRpZXMgZm9yIFN5YmFzZQorICAgICAgICAgICAgPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK29wZW5qcGEuQ29ubmVjdGlvbkRyaXZlck5hbWU6IGNvbS5zeWJhc2UuamRiYzIuamRiYy5TeWJEcml2ZXIKK29wZW5qcGEuQ29ubmVjdGlvblVSTDogXAorICAgIGpkYmM6c3liYXNlOlRkczpTRVJWRVJfTkFNRTo0MTAwL0RCX05BTUU/U2VydmljZU5hbWU9REJfTkFNRSZhbXA7QkVfQVNfSkRCQ19DT01QTElBTlRfQVNfUE9TU0lCTEU9dHJ1ZQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8c2VjdGlvbiBpZD0iZGJzdXBwb3J0X3N5YmFzZV9pc3N1ZXMiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIEtub3duIGlzc3VlcyB3aXRoIFN5YmFzZQorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4gCitUaGUgIjxsaXRlcmFsPkRZTkFNSUNfUFJFUEFSRTwvbGl0ZXJhbD4iIHBhcmFtZXRlciBvZiB0aGUgU3liYXNlIEpEQkMgZHJpdmVyIAorY2Fubm90IGJlIHVzZWQgd2l0aCBPcGVuSlBBLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorRGF0YXN0b3JlIGxvY2tpbmcgY2Fubm90IGJlIHVzZWQgd2hlbiBtYW5pcHVsYXRpbmcgbWFueS10by1tYW55IHJlbGF0aW9ucyB1c2luZwordGhlIGRlZmF1bHQgT3BlbkpQQSBzY2hlbWEgY3JlYXRlZCBieSB0aGUgc2NoZW1hdG9vbCwgdW5sZXNzIGFuIGF1dG8taW5jcmVtZW50CitwcmltYXJ5IGtleSBmaWVsZCBpcyBtYW51YWxseSBhZGRlZCB0byB0aGUgdGFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitQZXJzaXN0aW5nIGEgemVyby1sZW5ndGggc3RyaW5nIHJlc3VsdHMgaW4gYSBzdHJpbmcgd2l0aCBhIHNpbmdsZSBzcGFjZQorY2hhcmFjdGVkIGJlaW5nIHJldHVybmVkIGZyb20gU3liYXNlLCBJbmMuJ3MgSkRCQyBkcml2ZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CitUaGUgPGxpdGVyYWw+QkVfQVNfSkRCQ19DT01QTElBTlRfQVNfUE9TU0lCTEU8L2xpdGVyYWw+IGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvCit1c2UgZGF0YXN0b3JlIChwZXNzaW1pc3RpYykgbG9ja2luZy4gRmFpbHVyZSB0byBzZXQgdGhpcyBwcm9wZXJ0eSBtYXkgbGVhZCB0bworb2JzY3VyZSBlcnJvcnMgbGlrZSAiIDxsaXRlcmFsPkZPUiBVUERBVEUgY2FuIG5vdCBiZSB1c2VkIGluIGEgU0VMRUNUIHdoaWNoIGlzCitub3QgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gb2YgYSBjdXJzb3Igb3Igd2hpY2ggaXMgbm90IGluc2lkZSBhIHN0b3JlZAorcHJvY2VkdXJlLjwvbGl0ZXJhbD4gIi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvYXBwZW5kaXg+CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvcG9tLnhtbCBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2Y3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuICAgCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXhtbHN0b3JlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+T3BlbkpQQSBYTUwgU3RvcmU8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPk9wZW5KUEEgWE1MIFN0b3JlPC9kZXNjcmlwdGlvbj4KKyAgICA8dXJsPmh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9wcm9qZWN0cy9vcGVuanBhPC91cmw+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5qYXZhMTQtdmFsaWRhdGU8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+PHByb3BlcnR5PjxuYW1lPmphdmExNC5qYXI8L25hbWU+PC9wcm9wZXJ0eT48L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxib290Y2xhc3NwYXRoPiR7amF2YTE0Lmphcn08L2Jvb3RjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbmpwYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5qcGEta2VybmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXhtbHN0b3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3htbHN0b3JlL09iamVjdERhdGEuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9PYmplY3REYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5NmZmYgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9PYmplY3REYXRhLmphdmEKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5vcGVuanBhLnhtbHN0b3JlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmV2ZW50Lk9ycGhhbmVkS2V5QWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuRmV0Y2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5rZXJuZWwuT3BlbkpQQVN0YXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLlN0b3JlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkZpZWxkTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuSmF2YVR5cGVzOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLlZhbHVlTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuUHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuVW5zdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogSW4tbWVtb3J5IGZvcm0gb2YgZGF0YSBpbiBkYXRhc3RvcmUgYmFja2luZyBhIHNpbmdsZSBwZXJzaXN0ZW50IG9iamVjdC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdERhdGEKKyAgICBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIE9iamVjdCBfb2lkOworICAgIHByaXZhdGUgT2JqZWN0W10gX2RhdGE7CisgICAgcHJpdmF0ZSBMb25nIF92ZXJzaW9uOworICAgIHByaXZhdGUgQ2xhc3NNZXRhRGF0YSBfbWV0YTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgb2JqZWN0IHdpdGhvdXQgdW5kZXJseWluZyBkYXRhLiBKdXN0IHBhc3MgaW4gdHlwZSBzcGVjaWZpYworICAgICAqIG1ldGFkYXRhIGFuZCB0aGUgb2lkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3REYXRhKE9iamVjdCBvaWQsIENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBfb2lkID0gb2lkOworICAgICAgICBfbWV0YSA9IG1ldGE7CisgICAgICAgIF9kYXRhID0gbmV3IE9iamVjdFttZXRhLmdldEZpZWxkcygpLmxlbmd0aF07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0dGVyIGZvciBvaWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF9vaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkYXRhIGZvciB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChpbnQgbnVtKSB7CisgICAgICAgIHJldHVybiBfZGF0YVtudW1dOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGF0YSBmb3IgdGhlIGZpZWxkIHdpdGggdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkKGludCBudW0sIE9iamVjdCB2YWwpIHsKKyAgICAgICAgX2RhdGFbbnVtXSA9IHZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihMb25nIHZlcnNpb24pIHsKKyAgICAgICAgX3ZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9uZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gX3ZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUgb2YgcGVyc2lzdGVudCBvYmplY3QgZm9yCisgICAgICogd2hpY2ggdGhpcyBkYXRhIGFwcGxpZXMuCisgICAgICovCisgICAgcHVibGljIENsYXNzTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBfbWV0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBkYXRhIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdCBpbnRvIHRoZQorICAgICAqIGdpdmVuIHN0YXRlIG1hbmFnZXIuIE9ubHkgZmllbGRzIGluIHRoZSBnaXZlbiBmZXRjaCBjb25maWd1cmF0aW9uIGFyZQorICAgICAqIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAoc20uZ2V0VmVyc2lvbigpID09IG51bGwpCisgICAgICAgICAgICBzbS5zZXRWZXJzaW9uKF92ZXJzaW9uKTsKKworICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIXNtLmdldExvYWRlZCgpLmdldChpKSAmJiBmZXRjaC5yZXF1aXJlc0ZldGNoKGZtZHNbaV0pIAorICAgICAgICAgICAgICAgICE9IEZldGNoQ29uZmlndXJhdGlvbi5GRVRDSF9OT05FKQorICAgICAgICAgICAgICAgIHNtLnN0b3JlKGksIHRvTG9hZGFibGUoc20sIGZtZHNbaV0sIF9kYXRhW2ldLCBmZXRjaCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGRhdGEgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0IGludG8gdGhlCisgICAgICogZ2l2ZW4gc3RhdGUgbWFuYWdlci4gT25seSBmaWVsZHMgaW4gdGhlIGdpdmVuIGJpdCBzZXQgd2lsbCBiZSBsb2FkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgaWYgKHNtLmdldFZlcnNpb24oKSA9PSBudWxsKQorICAgICAgICAgICAgc20uc2V0VmVyc2lvbihfdmVyc2lvbik7CisKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKGZpZWxkcy5nZXQoaSkpCisgICAgICAgICAgICAgICAgc20uc3RvcmUoaSwgdG9Mb2FkYWJsZShzbSwgZm1kc1tpXSwgX2RhdGFbaV0sIGZldGNoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3RvcmVkIHZhbHVlIDxjb2RlPnZhbDwvY29kZT4gaW50byBhIHZhbHVlIGZvciBsb2FkaW5nCisgICAgICogaW50byBhIHN0YXRlIG1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHRvTG9hZGFibGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgRmllbGRNZXRhRGF0YSBmbWQsIE9iamVjdCB2YWwsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDb2xsZWN0aW9uIGM7CisgICAgICAgIHN3aXRjaCAoZm1kLmdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICAgICAgLy8gdGhlIHN0b3JlZCB2YWx1ZSBtdXN0IGJlIGEgY29sbGVjdGlvbgorICAgICAgICAgICAgICAgIGMgPSAoQ29sbGVjdGlvbikgdmFsOworCisgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIG1hbmFnZXIgd2lsbCBjcmVhdGUgYSBwcm94eSBjb2xsZWN0aW9uIG9mIHRoZSBuZWVkZWQKKyAgICAgICAgICAgICAgICAvLyB0eXBlIGRlcGVuZGluZyBvbiB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgdXNlcidzIGZpZWxkOyB0aGUKKyAgICAgICAgICAgICAgICAvLyBwcm94eSB3aWxsIHBlcmZvcm0gZGlydHkgdHJhY2tpbmcsIGV0YworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gYzIgPSAoQ29sbGVjdGlvbikgc20ubmV3RmllbGRQcm94eShmbWQuZ2V0SW5kZXgoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgcHJveHkgY29sbGVjdGlvbiB3aXRoIG91ciBzdG9yZWQgZGF0YSwgY29udmVydGluZworICAgICAgICAgICAgICAgIC8vIGl0IHRvIHRoZSByaWdodCB0eXBlIGZyb20gaXRzIHN0b3JlZCBmb3JtCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBjLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQorICAgICAgICAgICAgICAgICAgICBjMi5hZGQodG9OZXN0ZWRMb2FkYWJsZShzbSwgZm1kLmdldEVsZW1lbnQoKSwgaXRyLm5leHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RvcmVkIHZhbHVlIG11c3QgYmUgYSBjb2xsZWN0aW9uOyB3ZSBwdXQgYXJyYXlzIGludG8KKyAgICAgICAgICAgICAgICAvLyBjb2xsZWN0aW9ucyBmb3Igc3RvcmFnZQorICAgICAgICAgICAgICAgIGMgPSAoQ29sbGVjdGlvbikgdmFsOworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGFycmF5IG9mIHRoZSByaWdodCB0eXBlOyB1bmxpa2UgY29sbGVjdGlvbnMgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgY2FzZSBhYm92ZSwgYXJyYXlzIGNhbm5vdCBiZSBwcm94aWVkCisgICAgICAgICAgICAgICAgT2JqZWN0IGEgPSBBcnJheS5uZXdJbnN0YW5jZShmbWQuZ2V0RWxlbWVudCgpLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgYy5zaXplKCkpOworCisgICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGFycmF5IHdpdGggb3VyIHN0b3JlZCBkYXRhLCBjb252ZXJ0aW5nIGl0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IHR5cGUgZnJvbSBpdHMgc3RvcmVkIGZvcm0KKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgaWR4KyspCisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldChhLCBpZHgsIHRvTmVzdGVkTG9hZGFibGUoc20sIGZtZC5nZXRFbGVtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdHIubmV4dCgpLCBmZXRjaCkpOworICAgICAgICAgICAgICAgIHJldHVybiBhOworCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgLy8gdGhlIHN0b3JlZCB2YWx1ZSBtdXN0IGJlIGEgbWFwCisgICAgICAgICAgICAgICAgTWFwIG0gPSAoTWFwKSB2YWw7CisKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgbWFuYWdlciB3aWxsIGNyZWF0ZSBhIHByb3h5IG1hcCBvZiB0aGUgbmVlZGVkCisgICAgICAgICAgICAgICAgLy8gdHlwZSBkZXBlbmRpbmcgb24gdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhlIHVzZXIncyBmaWVsZDsgdGhlCisgICAgICAgICAgICAgICAgLy8gcHJveHkgd2lsbCBwZXJmb3JtIGRpcnR5IHRyYWNraW5nLCBldGMKKyAgICAgICAgICAgICAgICBNYXAgbTIgPSAoTWFwKSBzbS5uZXdGaWVsZFByb3h5KGZtZC5nZXRJbmRleCgpKTsKKworICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBwcm94eSBtYXAgd2l0aCBvdXIgc3RvcmVkIGRhdGEsIGNvbnZlcnRpbmcKKyAgICAgICAgICAgICAgICAvLyBpdCB0byB0aGUgcmlnaHQgdHlwZSBmcm9tIGl0cyBzdG9yZWQgZm9ybQorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbTIucHV0KHRvTmVzdGVkTG9hZGFibGUoc20sIGZtZC5nZXRLZXkoKSwgZS5nZXRLZXkoKSxmZXRjaCksCisgICAgICAgICAgICAgICAgICAgICAgICB0b05lc3RlZExvYWRhYmxlKHNtLCBmbWQuZ2V0RWxlbWVudCgpLCBlLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG0yOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGp1c3QgY29udmVydCB0aGUgc3RvcmVkIHZhbHVlIGludG8gaXRzIGxvYWRhYmxlIGVxdWl2YWxlbnQuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRvTmVzdGVkTG9hZGFibGUoc20sIGZtZCwgdmFsLCBmZXRjaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBzdG9yZWQgdmFsdWUgPGNvZGU+dmFsPC9jb2RlPiB0byBhIHZhbHVlIGZvciBsb2FkaW5nCisgICAgICogaW50byBhIHN0YXRlIG1hbmFnZXIuIFRoZSB2YWx1ZSA8Y29kZT52YWw8L2NvZGU+IG11c3QgYmUgYSBzaW5ndWxhcgorICAgICAqIHZhbHVlOyBpdCBjYW5ub3QgYmUgYSBjb250YWluZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHRvTmVzdGVkTG9hZGFibGUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwKKyAgICAgICAgVmFsdWVNZXRhRGF0YSB2bWQsIE9iamVjdCB2YWwsIEZldGNoQ29uZmlndXJhdGlvbiBmZXRjaCkgeworICAgICAgICBpZiAodmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHZtZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAvLyBjbG9uZSB0aGUgZGF0ZSB0byBwcmV2ZW50IGRpcmVjdCBtb2RpZmljYXRpb24gb2Ygb3VyIHN0b3JlZCB2YWx1ZQorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gKChEYXRlKSB2YWwpLmNsb25lKCk7CisKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICAvLyBmb3IgcmVsYXRpb25zIHRvIG90aGVyIHBlcnNpc3RlbnQgb2JqZWN0cywgd2Ugc3RvcmUgdGhlIHJlbGF0ZWQKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QncyBvaWQgLS0gY29udmVydCBpdCBiYWNrIGludG8gYSBwZXJzaXN0ZW50IGluc3RhbmNlCisgICAgICAgICAgICAgICAgU3RvcmVDb250ZXh0IGN0eCA9IHNtLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgcGMgPSBjdHguZmluZCh2YWwsIGZldGNoLCBudWxsLCBudWxsLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocGMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjOworICAgICAgICAgICAgICAgIE9ycGhhbmVkS2V5QWN0aW9uIGFjdGlvbiA9IGN0eC5nZXRDb25maWd1cmF0aW9uKCkuCisgICAgICAgICAgICAgICAgICAgIGdldE9ycGhhbmVkS2V5QWN0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLm9ycGhhbih2YWwsIHNtLCB2bWQpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIGRhdGEgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0IGZyb20gdGhlCisgICAgICogZ2l2ZW4gc3RhdGUgbWFuYWdlci4gT25seSBkaXJ0eSBmaWVsZHMgd2lsbCBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSkgeworICAgICAgICBfdmVyc2lvbiA9IChMb25nKSBzbS5nZXRWZXJzaW9uKCk7CisKKyAgICAgICAgLy8gaWYgdGhlIHZlcnNpb24gaGFzIG5vdCBiZWVuIHNldCBpbiB0aGUgc3RhdGUgbWFuYWdlciAob25seSB0cnVlCisgICAgICAgIC8vIHdoZW4gdGhlIG9iamVjdCBpcyBuZXcpLCBzZXQgdGhlIHZlcnNpb24gbnVtYmVyIHRvIDAKKyAgICAgICAgaWYgKF92ZXJzaW9uID09IG51bGwpCisgICAgICAgICAgICBfdmVyc2lvbiA9IE51bWJlcnMudmFsdWVPZigwTCk7CisKKyAgICAgICAgLy8gcnVuIHRocm91Z2ggZWFjaCBwZXJzaXN0ZW50IGZpZWxkIGluIHRoZSBzdGF0ZSBtYW5hZ2VyIGFuZCBzdG9yZSBpdAorICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IF9tZXRhLmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzbS5nZXREaXJ0eSgpLmdldChpKQorICAgICAgICAgICAgICAgICYmIGZtZHNbaV0uZ2V0TWFuYWdlbWVudCgpID09IGZtZHNbaV0uTUFOQUdFX1BFUlNJU1RFTlQpCisgICAgICAgICAgICAgICAgX2RhdGFbaV0gPSB0b1N0b3JhYmxlKGZtZHNbaV0sIHNtLmZldGNoKGkpLCBzbS5nZXRDb250ZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gZmllbGQgdmFsdWUgPGNvZGU+dmFsPC9jb2RlPiB0byBhIGZvcm0gd2UgY2FuIHN0b3JlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCB0b1N0b3JhYmxlKEZpZWxkTWV0YURhdGEgZm1kLCBPYmplY3QgdmFsLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENvbGxlY3Rpb24gYzsKKyAgICAgICAgc3dpdGNoIChmbWQuZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ09MTEVDVElPTjoKKyAgICAgICAgICAgICAgICBjID0gKENvbGxlY3Rpb24pIHZhbDsKKworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvbGxlY3Rpb24gdG8gY29weSB0aGUgZWxlbWVudHMgaW50byBmb3Igc3RvcmFnZSwgYW5kCisgICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgaXQgd2l0aCBjb252ZXJ0ZWQgZWxlbWVudCB2YWx1ZXMKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGMyID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gYy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKKyAgICAgICAgICAgICAgICAgICAgYzIuYWRkKHRvTmVzdGVkU3RvcmFibGUoZm1kLmdldEVsZW1lbnQoKSwgaXRyLm5leHQoKSwgY3R4KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBjb2xsZWN0aW9uIHRvIGNvcHkgdGhlIGVsZW1lbnRzIGludG8gZm9yIHN0b3JhZ2UsIGFuZAorICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGl0IHdpdGggY29udmVydGVkIGVsZW1lbnQgdmFsdWVzCisgICAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuID0gQXJyYXkuZ2V0TGVuZ3RoKHZhbCk7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYy5hZGQodG9OZXN0ZWRTdG9yYWJsZShmbWQuZ2V0RWxlbWVudCgpLCBBcnJheS5nZXQodmFsLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eCkpOworICAgICAgICAgICAgICAgIHJldHVybiBjOworCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgTWFwIG0gPSAoTWFwKSB2YWw7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBtYXAgdG8gY29weSB0aGUgZW50cmllcyBpbnRvIGZvciBzdG9yYWdlLCBhbmQKKyAgICAgICAgICAgICAgICAvLyBwb3B1bGF0ZSBpdCB3aXRoIGNvbnZlcnRlZCBlbnRyeSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBNYXAgbTIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbTIucHV0KHRvTmVzdGVkU3RvcmFibGUoZm1kLmdldEtleSgpLCBlLmdldEtleSgpLCBjdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9OZXN0ZWRTdG9yYWJsZShmbWQuZ2V0RWxlbWVudCgpLCBlLmdldFZhbHVlKCksIGN0eCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbTI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8ganVzdCBjb252ZXJ0IHRoZSBsb2FkZWQgdmFsdWUgaW50byBpdHMgc3RvcmFibGUgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgIHJldHVybiB0b05lc3RlZFN0b3JhYmxlKGZtZCwgdmFsLCBjdHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gbG9hZGVkIHZhbHVlIDxjb2RlPnZhbDwvY29kZT4gdG8gYSB2YWx1ZSBmb3Igc3RvcmluZy4KKyAgICAgKiBUaGUgdmFsdWUgPGNvZGU+dmFsPC9jb2RlPiBtdXN0IGJlIGEgc2luZ3VsYXIgdmFsdWU7IGl0IGNhbm5vdCBiZSBhCisgICAgICogY29udGFpbmVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCB0b05lc3RlZFN0b3JhYmxlKFZhbHVlTWV0YURhdGEgdm1kLCBPYmplY3QgdmFsLAorICAgICAgICBTdG9yZUNvbnRleHQgY3R4KSB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHN3aXRjaCAodm1kLmdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGUgaXMgYSBwcm94eSAoc2luY2UgRGF0ZXMgYXJlIHNlY29uZCBjbGFzcworICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgKFNDT3MpIHRoZXkgY2FuIGJlIHByb3hpZWQgZm9yIGRpcnR5IHRyYWNraW5nLAorICAgICAgICAgICAgICAgIC8vIGV0YykgdGhlbiBjb3B5IHRoZSB2YWx1ZSBvdXQgb2YgaXQgZm9yIHN0b3JhZ2UKKyAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUHJveHkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFByb3h5KSB2YWwpLmNvcHkodmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChEYXRlKSB2YWwpLmNsb25lKCk7CisKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmdldE9iamVjdElkKHZhbCk7CisKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNPTExFQ1RJT046CisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgcmVsYXRpb24gdHlwZXMgKGUuZy4gY29sbGVjdGlvbnMgb2YgY29sbGVjdGlvbnMpCisgICAgICAgICAgICAgICAgLy8gYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHN0b3JlIGRvZXMgbm90IHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAgICArICJuZXN0ZWQgY29udGFpbmVycyAoZS5nLiBjb2xsZWN0aW9ucyBvZiBjb2xsZWN0aW9ucykuIik7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoaXMgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBPYmplY3REYXRhIGRhdGEgPSBuZXcgT2JqZWN0RGF0YShfb2lkLCBfbWV0YSk7CisgICAgICAgIGRhdGEuc2V0VmVyc2lvbihfdmVyc2lvbik7CisKKyAgICAgICAgLy8gY29weSBlYWNoIGZpZWxkCisgICAgICAgIEZpZWxkTWV0YURhdGFbXSBmbWRzID0gX21ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IHZhbCA9IF9kYXRhW2ldOworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zZXRGaWVsZChpLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChmbWRzW2ldLmdldFR5cGVDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBkYXRhLnNldEZpZWxkKGksIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIHZhbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0RmllbGQoaSwgbmV3IEhhc2hNYXAoKE1hcCkgdmFsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0RmllbGQoaSwgdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJDbGFzczogKCIgKyBfbWV0YS5nZXREZXNjcmliZWRUeXBlKCkuZ2V0TmFtZSgpICsgIilcbiIpOworICAgICAgICBidWYuYXBwZW5kKCJPYmplY3QgSWQ6ICgiICsgX29pZCArICIpXG4iKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiVmVyc2lvbjogKCIgKyBfdmVyc2lvbiArICIpXG4iKTsKKyAgICAgICAgRmllbGRNZXRhRGF0YVtdIGZtZHMgPSBfbWV0YS5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgIEZpZWxkOiAoIiArIGkgKyAiKVxuIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgIE5hbWU6ICgiICsgZm1kc1tpXS5nZXROYW1lKCkgKyAiKVxuIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgIFZhbHVlOiAoIiArIF9kYXRhW2ldICsgIilcbiIpOworCQl9CisJCXJldHVybiBidWYudG9TdHJpbmcgKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9vcGVuanBhLXhtbHN0b3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3htbHN0b3JlL1hNTENvbmZpZ3VyYXRpb24uamF2YSBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9YTUxDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwMWFkYQotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9YTUxDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEueG1sc3RvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5Ccm9rZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIuY29uZi5Qcm9kdWN0RGVyaXZhdGlvbnM7CisKKy8qKgorICogQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFhNTCBmaWxlIHN0b3JlLiBFYWNoIHVuaXF1ZQorICoge0BsaW5rIEJyb2tlckZhY3Rvcnl9IGhhcyBhIGRpc3RpbmN0IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgKiBUaHVzIHRoaXMgY29uZmlndXJhdGlvbiBpcyBzaGFyZWQgYnkgYWxsIHtAbGluayBCcm9rZXJ9cworICogYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25pbmcgZmFjdG9yeSwgYW5kIGlzIGEgZ29vZCBwbGFjZSB0byBwcm92aWRlIGFjY2VzcworICogdG8gc2hhcmVkIHJlc291cmNlcy4gTm90ZSB0aGF0IGVhY2ggYnJva2VyIGhhcyBpdHMgb3duCisgKiB7QGxpbmsgb3JnLmFwYWNoZS5vcGVuanBhLmFic3RyYWN0c3RvcmUuQWJzdHJhY3RTdG9yZU1hbmFnZXJ9LgorICovCitwdWJsaWMgY2xhc3MgWE1MQ29uZmlndXJhdGlvbgorICAgIGV4dGVuZHMgT3BlbkpQQUNvbmZpZ3VyYXRpb25JbXBsIHsKKworICAgIC8vIHNoYXJlZCByZXNvdXJjZXMKKyAgICBwcml2YXRlIFhNTFN0b3JlIF9zdG9yZTsKKyAgICBwcml2YXRlIFhNTEZpbGVIYW5kbGVyIF9oYW5kbGVyOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgc3VwZXIoZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgbG9jayBtYW5hZ2VyIHBsdWdpbgorICAgICAgICAvLyBmcm9tIG91ciBzdXBlcmNsYXNzIHRvIHVzZSB0aGUgc2luZ2xlLWp2bSBsb2NrIG1hbmFnZXIKKyAgICAgICAgbG9ja01hbmFnZXJQbHVnaW4uc2V0RGVmYXVsdCgidmVyc2lvbiIpOworICAgICAgICBsb2NrTWFuYWdlclBsdWdpbi5zZXRTdHJpbmcoInZlcnNpb24iKTsKKworICAgICAgICBQcm9kdWN0RGVyaXZhdGlvbnMuYmVmb3JlQ29uZmlndXJhdGlvbkxvYWQodGhpcyk7CisgICAgICAgIGxvYWRHbG9iYWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgWE1MRmlsZUhhbmRsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBYTUxGaWxlSGFuZGxlciBnZXRGaWxlSGFuZGxlcigpIHsKKyAgICAgICAgaWYgKF9oYW5kbGVyID09IG51bGwpCisgICAgICAgICAgICBfaGFuZGxlciA9IG5ldyBYTUxGaWxlSGFuZGxlcih0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9oYW5kbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFhNTFN0b3JlfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgWE1MU3RvcmUgZ2V0U3RvcmUoKSB7CisgICAgICAgIGlmIChfc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIF9zdG9yZSA9IG5ldyBYTUxTdG9yZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9zdG9yZTsKKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEveG1sc3RvcmUvWE1MRmlsZUhhbmRsZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9YTUxGaWxlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWIyNGIKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEveG1sc3RvcmUvWE1MRmlsZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDY1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEueG1sc3RvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuZW5oYW5jZS5QQ1JlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIudXRpbC5CYXNlMTZFbmNvZGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIueG1sLlhNTEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmxpYi54bWwuWE1MV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5tZXRhLkNsYXNzTWV0YURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuRmllbGRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5KYXZhVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuSW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuT3BlbkpQQUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEudXRpbC5VbnN1cHBvcnRlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBTdG9yZXMge0BsaW5rIE9iamVjdERhdGF9IG9iamVjdHMgYnkgc2VyaWFsaXppbmcgYSBjb2xsZWN0aW9uCisgKiBvZiB0aGVtIGludG8gYW5kIG91dCBvZiBhbiBYTUwgZmlsZS4KKyAqLworcHVibGljIGNsYXNzIFhNTEZpbGVIYW5kbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgWE1MQ29uZmlndXJhdGlvbiBfY29uZjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MRmlsZUhhbmRsZXIoWE1MQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gY29uZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwgaW5zdGFuY2VzIG9mIDxjb2RlPm1ldGE8L2NvZGU+IGludG8gYSBsaXN0IG9mIG9iamVjdHMuCisgICAgICogVGhlIGdpdmVuIDxjb2RlPm1ldGE8L2NvZGU+IG11c3QgcmVwcmVzZW50IGEgbGVhc3QtZGVyaXZlZAorICAgICAqIHBlcnNpc3RlbmNlLWNhcGFibGUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBsb2FkKENsYXNzTWV0YURhdGEgbWV0YSkgeworICAgICAgICBGaWxlIGYgPSBnZXRGaWxlKG1ldGEpOworICAgICAgICBpZiAoIWYuZXhpc3RzKCkgfHwgZi5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiByZWFkKGYpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBPYmplY3REYXRhfXMgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlCisgICAgICogZ2l2ZW4gZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbGxlY3Rpb24gcmVhZChGaWxlIGYpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBwYXJzZSB0aGUgZmlsZSBhbmQgcmV0dXJuIHRoZSBvYmplY3RzIGl0IGNvbnRhaW5zCisgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBYTUxGYWN0b3J5LmdldFNBWFBhcnNlcihmYWxzZSwgZmFsc2UpOworICAgICAgICBPYmplY3REYXRhSGFuZGxlciBoYW5kbGVyID0gbmV3IE9iamVjdERhdGFIYW5kbGVyKF9jb25mKTsKKyAgICAgICAgcGFyc2VyLnBhcnNlKGYsIGhhbmRsZXIpOworICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFeHRlbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEZpbGV9IG9iamVjdCB0aGF0IDxjb2RlPm1ldGE8L2NvZGU+IGxpdmVzCisgICAgICogaW4uIFRoaXMgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIGZpbGVuYW1lIGZyb20gdGhlIGZ1bGwgY2xhc3MKKyAgICAgKiBuYW1lIG9mIHRoZSB0eXBlIGlkZW50aWZpZWQgYnkgPGNvZGU+bWV0YTwvY29kZT4sIGFuZCByZXR1cm5zCisgICAgICogYSB7QGxpbmsgRmlsZX0gb2JqZWN0IHRoYXQgaGFzIHRoaXMgZmlsZW5hbWUgYW5kIHdob3NlIGJhc2UKKyAgICAgKiBkaXJlY3RvcnkgaXMgdGhlIFVSTCBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5Db25uZWN0aW9uVVJMPC9jb2RlPgorICAgICAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGdldEZpbGUoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIEZpbGUgYmFzZURpciA9IG5ldyBGaWxlKF9jb25mLmdldENvbm5lY3Rpb25VUkwoKSk7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShiYXNlRGlyLCBtZXRhLmdldERlc2NyaWJlZFR5cGUoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhbGwgaW5zdGFuY2VzIGluIDxjb2RlPmRhdGFzPC9jb2RlPiBpbnRvIHRoZSBhcHByb3ByaWF0ZSBmaWxlLAorICAgICAqIGFzIGRpY3RhdGVkIGJ5IDxjb2RlPm1ldGE8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGEgdGhlIGxlYXN0LWRlcml2ZWQgdHlwZSBvZiB0aGUgaW5zdGFuY2VzIGJlaW5nIHN0b3JlZAorICAgICAqIEBwYXJhbSBkYXRhcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIE9iamVjdERhdGF9IGluc3RhbmNlcywgZWFjaAorICAgICAqIG9mIHdoaWNoIHJlcHJlc2VudHMgYW4gb2JqZWN0IG9mIHR5cGUgPGNvZGU+bWV0YTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZShDbGFzc01ldGFEYXRhIG1ldGEsIENvbGxlY3Rpb24gZGF0YXMpIHsKKyAgICAgICAgaWYgKG1ldGEuZ2V0UENTdXBlcmNsYXNzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigpOworCisgICAgICAgIEZpbGUgZiA9IGdldEZpbGUobWV0YSk7CisgICAgICAgIGlmICghZi5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpCisgICAgICAgICAgICBmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKworICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZik7CisgICAgICAgICAgICB3cml0ZShkYXRhcywgZncpOworICAgICAgICB9IGNhdGNoIChPcGVuSlBBRXhjZXB0aW9uIGtlKSB7CisgICAgICAgICAgICB0aHJvdyBrZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTdG9yZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmdyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Yge0BsaW5rIE9iamVjdERhdGF9cyB0byB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGUoQ29sbGVjdGlvbiBkYXRhcywgRmlsZVdyaXRlciBmdykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhbiBYTUwgcHJldHR5IHByaW50ZXIgdG8gd3JpdGUgb3V0IHRoZSBvYmplY3RzCisgICAgICAgIFdyaXRlciBvdXQgPSBuZXcgWE1MV3JpdGVyKGZ3KTsKKworICAgICAgICAvLyBzdGFydCB0aGUgZmlsZTsgdGhlIHJvb3Qgbm9kZSBpcyBhbiAiZXh0ZW50IgorICAgICAgICBvdXQud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOworICAgICAgICBvdXQud3JpdGUoIjxleHRlbnQ+Iik7CisKKyAgICAgICAgLy8gcnVuIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBkYXRhcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmogPSAoT2JqZWN0RGF0YSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IG9iai5nZXRNZXRhRGF0YSgpOworCisgICAgICAgICAgICAvLyB3cml0ZSBvdXQgdGhlICJvYmplY3QiIGVsZW1lbnQgc3RhcnQKKyAgICAgICAgICAgIG91dC53cml0ZSgiPG9iamVjdCBjbGFzcz1cIiIpOworICAgICAgICAgICAgb3V0LndyaXRlKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGUoIlwiIG9pZD1cIiIpOworICAgICAgICAgICAgb3V0LndyaXRlKG9iai5nZXRJZCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgb3V0LndyaXRlKCJcIiB2ZXJzaW9uPVwiIik7CisgICAgICAgICAgICBvdXQud3JpdGUob2JqLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgiXCI+Iik7CisKKyAgICAgICAgICAgIC8vIHJ1biB0aHJvdWdoIGVhY2ggZmllbGQgd3JpdGluZyBvdXQgdGhlIHZhbHVlCisgICAgICAgICAgICBGaWVsZE1ldGFEYXRhW10gZm1kcyA9IG1ldGEuZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZtZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZm1kc1tpXS5nZXRNYW5hZ2VtZW50KCkgIT0gZm1kc1tpXS5NQU5BR0VfUEVSU0lTVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjxmaWVsZCBuYW1lPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGZtZHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlwiPiIpOworCisgICAgICAgICAgICAgICAgLy8gd3JpdGUgb3V0IHRoZSBmaWVsZCBkYXRhIGRlcGVuZGluZyB1cG9uIHR5cGUKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZtZHNbaV0uZ2V0VHlwZUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSBvYmouZ2V0RmllbGQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBvdXQgZWFjaCBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbGVtVHlwZSA9IGZtZHNbaV0uZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGNpID0gYy5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8ZWxlbWVudD4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURhdGFWYWx1ZShvdXQsIGVsZW1UeXBlLCBjaS5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPC9lbGVtZW50PiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG0gPSAoTWFwKSBvYmouZ2V0RmllbGQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBvdXQgZWFjaCBvZiB0aGUgbWFwIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gZW50cmllcyA9IG0uZW50cnlTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlUeXBlID0gZm1kc1tpXS5nZXRLZXkoKS5nZXRUeXBlQ29kZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlVHlwZSA9IGZtZHNbaV0uZ2V0RWxlbWVudCgpLmdldFR5cGVDb2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGVpID0gZW50cmllcy5pdGVyYXRvcigpOyBlaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBlaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8a2V5PiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRGF0YVZhbHVlKG91dCwga2V5VHlwZSwgZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8L2tleT4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjx2YWx1ZT4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURhdGFWYWx1ZShvdXQsIHZhbHVlVHlwZSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjwvdmFsdWU+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEYXRhVmFsdWUob3V0LCBmbWRzW2ldLmdldFR5cGVDb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdldEZpZWxkKGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8L2ZpZWxkPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LndyaXRlKCI8L29iamVjdD4iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQud3JpdGUoIjwvZXh0ZW50PiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCB0aGUgZGF0YSB2YWx1ZS4gVGhpcyBtZXRob2Qgd3JpdGVzIG51bGxzIGFzICJudWxsIiwKKyAgICAgKiBzZXJpYWxpemVzICh1c2luZyBKYXZhIHNlcmlhbGl6YXRpb24gYW5kIGJhc2UxNiBlbmNvZGluZykgb3V0IG5vbi0KKyAgICAgKiBwcmltaXRpdmVzL2JveGVkIHByaW1pdGl2ZXMgYW5kIG5vbi1wZXJzaXN0ZW50IHR5cGVzLCBhbmQgd3JpdGVzCisgICAgICogcHJpbWl0aXZlcy9ib3hlZCBwcmltaXRpdmVzIGFuZCBvaWRzIHVzaW5nIHRoZWlyIHRvU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YVZhbHVlKFdyaXRlciBvdXQsIGludCB0eXBlLCBPYmplY3QgdmFsKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyB3cml0ZSBudWxscyBhcyAibnVsbCIKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0JKRUNUOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOgorICAgICAgICAgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc3RvcmUgbm9uLXNlcmlhbGl6YWJsZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vbi1wZXJzaXN0ZW5jZS1jYXBhYmxlIHZhbHVlOiAiICsgdmFsKTsKKworICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBvdXQgdGhlIG9iamVjdCBhbmQgZW5jb2RlIHRoZSByZXN1bHQgd2l0aCBiYXNlMTYKKyAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oODE5Mik7CisgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KHZhbCk7CisgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKEJhc2UxNkVuY29kZXIuZW5jb2RlKGJhb3MudG9CeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQ0hBUl9PQko6CisgICAgICAgICAgICAgICAgLy8gcXVvdGUgY2hhcnMgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIHdoaXRlc3BhY2UgY2hhcnM7IHNwZWNpYWwKKyAgICAgICAgICAgICAgICAvLyBjYXNlIGZvciBcMAorICAgICAgICAgICAgICAgIGNoYXIgYyA9ICgoQ2hhcmFjdGVyKSB2YWwpLmNoYXJWYWx1ZSgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZSgiJyIpOworICAgICAgICAgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiMHgwIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoWE1MRW5jb2Rlci5lbmNvZGUodmFsLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIiciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgIC8vIHF1b3RlIHN0cmluZ3Mgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisgICAgICAgICAgICAgICAgLy8gd2hpdGVzcGFjZQorICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoWE1MRW5jb2Rlci5lbmNvZGUodmFsLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlwiIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLlBDOgorICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgdHlwZSBvZiBvaWQgb2JqZWN0ICsgJzonICsgb2lkIHN0cmluZworICAgICAgICAgICAgICAgIG91dC53cml0ZSh2YWwuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG91dC53cml0ZSgnOicpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShYTUxFbmNvZGVyLmVuY29kZSh2YWwudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgYSBudW1iZXIgb2Ygc2ltcGxlIHR5cGU7IG5vIG5lZWQgdG8gZW5jb2RlCisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcmVjb25zdHJ1Y3Qge0BsaW5rIE9iamVjdERhdGF9IGluc3RhbmNlcyBmcm9tIFNBWCBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT2JqZWN0RGF0YUhhbmRsZXIKKyAgICAgICAgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBUkdTID0gbmV3IENsYXNzW117IFN0cmluZy5jbGFzcyB9OworCisgICAgICAgIHByaXZhdGUgZmluYWwgWE1MQ29uZmlndXJhdGlvbiBfY29uZjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIF9leHRlbnQgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgLy8gcGFyc2Ugc3RhdGUKKyAgICAgICAgcHJpdmF0ZSBPYmplY3REYXRhIF9vYmplY3Q7CisgICAgICAgIHByaXZhdGUgRmllbGRNZXRhRGF0YSBfZm1kOworICAgICAgICBwcml2YXRlIE9iamVjdCBfZmllbGRWYWw7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IF9rZXlWYWw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIF9idWY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3REYXRhSGFuZGxlcihYTUxDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICAgICAgICAgIF9jb25mID0gY29uZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgdGhlIHBhcnNpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFeHRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2V4dGVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsCisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudChxTmFtZSwgYXR0cnMpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgc2U7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgc3dpdGNoIChxTmFtZS5jaGFyQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdvJzogLy8gb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWV0YWRhdGEgZm9yIHRoZSB0eXBlIHdlJ3JlIHJlYWRpbmcKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBhdHRycy5nZXRWYWx1ZSgiY2xhc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gX2NvbmYuZ2V0TWV0YURhdGFSZXBvc2l0b3J5SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE1ldGFEYXRhKGNsYXNzRm9yTmFtZSh0eXBlKSwgbnVsbCwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBvaWQgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvaWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLmdldElkZW50aXR5VHlwZSgpID09IG1ldGEuSURfREFUQVNUT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgb2lkID0gbmV3IElkKGF0dHJzLmdldFZhbHVlKCJvaWQiKSwgX2NvbmYsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvaWQgPSBQQ1JlZ2lzdHJ5Lm5ld09iamVjdElkKG1ldGEuZ2V0RGVzY3JpYmVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKCJvaWQiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIE9iamVjdERhdGEgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGluc3RhbmNlLCBhbmQgc2V0IHRoZSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIF9vYmplY3QgPSBuZXcgT2JqZWN0RGF0YShvaWQsIG1ldGEpOworICAgICAgICAgICAgICAgICAgICBfb2JqZWN0LnNldFZlcnNpb24obmV3IExvbmcoYXR0cnMuZ2V0VmFsdWUoInZlcnNpb24iKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ2YnOiAvLyBmaWVsZAorICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBwYXJzaW5nIGEgZmllbGQgZWxlbWVudDogZm9yIGNvbnRhaW5lciB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY29udGFpbmVyOyBmb3Igb3RoZXIgdHlwZXMsIGluaXRpYWxpemUgYQorICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgX2ZtZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBfb2JqZWN0LmdldE1ldGFEYXRhKCkuZ2V0RmllbGQoYXR0cnMuZ2V0VmFsdWUoIm5hbWUiKSk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2ZtZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZpZWxkVmFsID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9maWVsZFZhbCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9idWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdlJzogLy8gZWxlbWVudAorICAgICAgICAgICAgICAgIGNhc2UgJ2snOiAvLyBrZXkKKyAgICAgICAgICAgICAgICBjYXNlICd2JzogLy8gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhIGJ1ZmZlciBmb3IgdGhlIGVsZW1lbnQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBlbmRFbGVtZW50KHFOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IHNlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHFOYW1lKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3QgdmFsOworICAgICAgICAgICAgc3dpdGNoIChxTmFtZS5jaGFyQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdvJzogLy8gb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgb2JqZWN0IHRvIG91ciByZXN1bHRzCisgICAgICAgICAgICAgICAgICAgIF9leHRlbnQuYWRkKF9vYmplY3QpOworCisgICAgICAgICAgICAgICAgY2FzZSAnZic6IC8vIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2ZtZC5nZXRUeXBlQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DT0xMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQVJSQVk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgdmFsdWUgYWxyZWFkeSBjb25zdHJ1Y3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGZpZWxkIHZhbHVlIGZyb20gdGV4dCB3aXRoaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmllbGRWYWwgPSBmcm9tWE1MU3RyaW5nKF9mbWQuZ2V0VHlwZUNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZtZC5nZXRUeXBlTWV0YURhdGEoKSwgX2J1Zi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZmllbGQgdmFsdWUgaW50byB0aGUgb2JqZWN0IGJlaW5nIHBhcnNlZAorICAgICAgICAgICAgICAgICAgICBfb2JqZWN0LnNldEZpZWxkKF9mbWQuZ2V0SW5kZXgoKSwgX2ZpZWxkVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdlJzogLy8gZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBlbGVtZW50IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZyb21YTUxTdHJpbmcoX2ZtZC5nZXRFbGVtZW50KCkuZ2V0VHlwZUNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9mbWQuZ2V0RWxlbWVudCgpLmdldFR5cGVNZXRhRGF0YSgpLCBfYnVmLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAoKENvbGxlY3Rpb24pIF9maWVsZFZhbCkuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnayc6IC8vIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBrZXkgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgX2tleVZhbCA9IGZyb21YTUxTdHJpbmcoX2ZtZC5nZXRLZXkoKS5nZXRUeXBlQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX2ZtZC5nZXRLZXkoKS5nZXRUeXBlTWV0YURhdGEoKSwgX2J1Zi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICd2JzogLy8gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHZhbHVlIGFuZCBwdXQgY2FjaGVkIGtleSBhbmQgdmFsdWUgaW50byBtYXAKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gZnJvbVhNTFN0cmluZyhfZm1kLmdldEVsZW1lbnQoKS5nZXRUeXBlQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX2ZtZC5nZXRFbGVtZW50KCkuZ2V0VHlwZU1ldGFEYXRhKCksIF9idWYudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBfZmllbGRWYWw7CisgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoX2tleVZhbCwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvbid0IGNhY2hlIHRleHQgYmV0d2VlbiBlbGVtZW50cworICAgICAgICAgICAgX2J1ZiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoX2J1ZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9idWYuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNyZWF0ZSBhIGZpZWxkIHZhbHVlIGZyb20gaXRzIFhNTCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGZyb21YTUxTdHJpbmcoaW50IHR5cGUsIENsYXNzTWV0YURhdGEgcmVsLCBTdHJpbmcgc3RyKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdHIgPSBzdHIudHJpbSgpOworICAgICAgICAgICAgaWYgKHN0ci5lcXVhbHMoIm51bGwiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CT09MRUFOX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdHIpOworCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CWVRFX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKHN0cik7CisKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5DSEFSOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkNIQVJfT0JKOgorICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCBxdW90ZXM7IHNwZWNpYWwgY2FzZSBmb3IgMHgwCisgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMSwgc3RyLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHIuZXF1YWxzKCIweDAiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKCdcMCcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihYTUxFbmNvZGVyLmRlY29kZShzdHIpLmNoYXJBdCgwKSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuRE9VQkxFX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoc3RyKTsKKworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkZMT0FUX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChzdHIpOworCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuSU5UOgorICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLklOVF9PQko6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihzdHIpOworCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuTE9ORzoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT05HX09CSjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHN0cik7CisKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVDoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5TSE9SVF9PQko6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQoc3RyKTsKKworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLk5VTUJFUjoKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5CSUdERUNJTUFMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwoc3RyKTsKKworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkJJR0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihzdHIpOworCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCBxdW90ZXMKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygxLCBzdHIubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTEVuY29kZXIuZGVjb2RlKHN0cik7CisKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuT0lEOgorICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBjaGFycyBpbnRvIGJ5dGVzLCBhbmQgcnVuIHRoZW0gdGhyb3VnaCBhbiAKKyAgICAgICAgICAgICAgICAgICAgLy8gT2JqZWN0SW5wdXRTdHJlYW0gaW4gb3JkZXIgdG8gZ2V0IHRoZSBzZXJpYWxpemVkIG9iamVjdAorICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBCYXNlMTZFbmNvZGVyLmRlY29kZShzdHIpOworICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOworICAgICAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IG9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKKworICAgICAgICAgICAgICAgIGNhc2UgSmF2YVR5cGVzLkRBVEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIpOworCisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUEM6CisgICAgICAgICAgICAgICAgY2FzZSBKYXZhVHlwZXMuUENfVU5UWVBFRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2Ugb3V0IG9pZCBjbGFzcyBuYW1lIGFuZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaWRDbGFzcyA9IGNsYXNzRm9yTmFtZShzdHIuc3Vic3RyaW5nKDAsIGlkeCkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRTdHIgPSBYTUxFbmNvZGVyLmRlY29kZShzdHIuc3Vic3RyaW5nKGlkeCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29ucyA9IGlkQ2xhc3MuZ2V0Q29uc3RydWN0b3IoQVJHUyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXsgaWRTdHIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIEphdmFUeXBlcy5MT0NBTEU6CisgICAgICAgICAgICAgICAgICAgIGludCB1bmRlcjEgPSBzdHIuaW5kZXhPZignXycpOworICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXIxID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgTG9jYWxlKHN0ciwgIiIpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgdW5kZXIyID0gc3RyLmluZGV4T2YoJ18nLCB1bmRlcjEgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVyMiA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxlKHN0ci5zdWJzdHJpbmcoMCwgdW5kZXIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIuc3Vic3RyaW5nKHVuZGVyMSArIDEpKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZyA9IHN0ci5zdWJzdHJpbmcoMCwgdW5kZXIxKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBzdHIuc3Vic3RyaW5nKHVuZGVyMSArIDEsIHVuZGVyMik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYW50ID0gc3RyLnN1YnN0cmluZyh1bmRlcjIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbGUobGFuZywgY291bnRyeSwgdmFyaWFudCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gX2NvbmYuZ2V0Q2xhc3NSZXNvbHZlckluc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCB0cnVlLCBsb2FkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2RzIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgWE1MIHN0cmluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWE1MRW5jb2RlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuY29kZSB0aGUgZ2l2ZW4gc3RyaW5nIGFzIFhNTCB0ZXh0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzLmNoYXJBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGluaXRpYWxpemVCdWZmZXIoYnVmLCBzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiZsdDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGluaXRpYWxpemVCdWZmZXIoYnVmLCBzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiZndDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGluaXRpYWxpemVCdWZmZXIoYnVmLCBzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiZhbXA7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHMuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVjb2RlIHRoZSBnaXZlbiBYTUwgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyYnICYmIHMubGVuZ3RoKCkgPiBpICsgMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHMuY2hhckF0KGkgKyAxKSA9PSAnbCcgfHwgcy5jaGFyQXQoaSArIDEpID09ICdnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHMuY2hhckF0KGkgKyAyKSA9PSAndCcgJiYgcy5jaGFyQXQoaSArIDMpID09ICc7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJmx0OyBvciAmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBpbml0aWFsaXplQnVmZmVyKGJ1ZiwgcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gKHMuY2hhckF0KGkpID09ICdsJykgPyAnPCcgOiAnPic7CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5sZW5ndGgoKSA+IGkgKyA0ICYmIHMuY2hhckF0KGkgKyAxKSA9PSAnYScKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHMuY2hhckF0KGkgKyAyKSA9PSAnbScgJiYgcy5jaGFyQXQoaSArIDMpID09ICdwJworICAgICAgICAgICAgICAgICAgICAgICAgJiYgcy5jaGFyQXQoaSArIDQpID09ICc7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJmFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGluaXRpYWxpemVCdWZmZXIoYnVmLCBzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnJic7CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIGJ1ZmZlciBmb3IgdGhlIGVuY29kZWQvZGVjb2RlZCBzdHJpbmcgaWYKKyAgICAgICAgICogbmVlZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVmZmVyIGluaXRpYWxpemVCdWZmZXIoU3RyaW5nQnVmZmVyIGJ1ZiwKKyAgICAgICAgICAgIFN0cmluZyBzLCBpbnQgaSkgeworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCAocy5zdWJzdHJpbmcgKDAsIGkpKTsKKwkJCX0KKwkJCXJldHVybiBidWY7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEveG1sc3RvcmUvWE1MU3RvcmUuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9YTUxTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWFhM2QKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEveG1sc3RvcmUvWE1MU3RvcmUuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLm9wZW5qcGEueG1sc3RvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLm1ldGEuQ2xhc3NNZXRhRGF0YTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc3RvcmUgb2Ygb2JqZWN0IGRhdGEgZW5jb2RlZCBpbiBYTUwuIFRoaXMgc3RvcmUgb25seSBhbGxvd3MKKyAqIG9uZSBkYXRhc3RvcmUgdHJhbnNhY3Rpb24gdG8gcHJvY2VlZCBhdCBhIHRpbWUuIEZpbGUgSS9PIGVycm9ycyBjYW4gcHV0CisgKiB0aGlzIHN0b3JlIGludG8gYW4gaW52YWxpZCBzdGF0ZS4KKyAqLworcHVibGljIGNsYXNzIFhNTFN0b3JlIHsKKworICAgIHByaXZhdGUgZmluYWwgWE1MQ29uZmlndXJhdGlvbiBfY29uZjsKKworICAgIC8vIGVhY2gga2V5IGluIHRoZSBtYXAgaXMgYSBsZWFzdC1kZXJpdmVkIGNsYXNzIG1ldGFkYXRhIG9iamVjdCwgYW5kIGVhY2gKKyAgICAvLyB2YWx1ZSBpcyBhIG1hcCBvZiBvaWRzIHRvIG9iamVjdCBkYXRhcyByZXByZXNlbnRpbmcgdGhlIGluc3RhbmNlcyBvZgorICAgIC8vIHRoYXQgY2xhc3MsIGluY2x1ZGluZyBzdWJjbGFzc2VzCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX21ldGFPaWRNYXBzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8vIHN0b3JlIGdldHMgbG9ja2VkIGR1cmluZyB0cmFuc2FjdGlvbnMKKyAgICBwcml2YXRlIGJvb2xlYW4gX2xvY2tlZDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yOyBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RvcmUoWE1MQ29uZmlndXJhdGlvbiBjb25mKSB7CisgICAgICAgIF9jb25mID0gY29uZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBnaXZlbiBvaWQsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3REYXRhIGdldERhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhLCBPYmplY3Qgb2lkKSB7CisgICAgICAgIG1ldGEgPSBnZXRMZWFzdERlcml2ZWQobWV0YSk7CisgICAgICAgIHJldHVybiAoT2JqZWN0RGF0YSkgZ2V0TWFwKG1ldGEpLmdldChvaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgZGF0YXMgZm9yIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0RGF0YVtdIGdldERhdGEoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIG1ldGEgPSBnZXRMZWFzdERlcml2ZWQobWV0YSk7CisgICAgICAgIENvbGxlY3Rpb24gdmFscyA9IGdldE1hcChtZXRhKS52YWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIChPYmplY3REYXRhW10pIHZhbHMudG9BcnJheShuZXcgT2JqZWN0RGF0YVt2YWxzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1hcCBvZiBvaWRzIHRvIG9iamVjdCBkYXRhcyBmb3IgdGhlIGdpdmVuIGxlYXN0LWRlcml2ZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCBnZXRNYXAoQ2xhc3NNZXRhRGF0YSBtZXRhKSB7CisgICAgICAgIE1hcCBtID0gKE1hcCkgX21ldGFPaWRNYXBzLmdldChtZXRhKTsKKyAgICAgICAgaWYgKG0gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBtOworCisgICAgICAgIC8vIGxvYWQgZGF0YXMgZnJvbSBmaWxlIGFuZCBjYWNoZSB0aGVtCisgICAgICAgIENvbGxlY3Rpb24gZGF0YXMgPSBfY29uZi5nZXRGaWxlSGFuZGxlcigpLmxvYWQobWV0YSk7CisgICAgICAgIG0gPSBuZXcgSGFzaE1hcChkYXRhcy5zaXplKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGRhdGFzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3REYXRhIGRhdGEgPSAoT2JqZWN0RGF0YSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgIG0ucHV0KGRhdGEuZ2V0SWQoKSwgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgX21ldGFPaWRNYXBzLnB1dChtZXRhLCBtKTsKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsZWFzdC1kZXJpdmVkIG1ldGFkYXRhIGluIHRoZSBpbmhlcml0YW5jZSBjaGFpbgorICAgICAqIGFib3ZlIDxjb2RlPm1ldGE8L2NvZGU+LCBvciA8Y29kZT5tZXRhPC9jb2RlPiBpZiBpdCBpcyBhCisgICAgICogbGVhc3QtZGVyaXZlZCBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01ldGFEYXRhIGdldExlYXN0RGVyaXZlZChDbGFzc01ldGFEYXRhIG1ldGEpIHsKKyAgICAgICAgd2hpbGUgKG1ldGEuZ2V0UENTdXBlcmNsYXNzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIG1ldGEgPSBtZXRhLmdldFBDU3VwZXJjbGFzc01ldGFEYXRhKCk7CisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2luIGEgZGF0YXN0b3JlIHRyYW5zYWN0aW9uLiBPYnRhaW5zIGFuIGV4Y2x1c2l2ZSB3cml0ZSBsb2NrIG9uIHRoZQorICAgICAqIHN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgeworICAgICAgICAvLyBsb2NrIHN0b3JlCisgICAgICAgIHdoaWxlIChfbG9ja2VkKQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgfQorICAgICAgICBfbG9ja2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGRhdGFzdG9yZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cGRhdGVzIHtAbGluayBPYmplY3REYXRhfSBpbnN0YW5jZXMgdG8gaW5zZXJ0IG9yIHVwZGF0ZQorICAgICAqIEBwYXJhbSBkZWxldGVzIHtAbGluayBPYmplY3REYXRhfSBpbnN0YW5jZXMgdG8gZGVsZXRlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVuZFRyYW5zYWN0aW9uKENvbGxlY3Rpb24gdXBkYXRlcywKKyAgICAgICAgQ29sbGVjdGlvbiBkZWxldGVzKSB7CisgICAgICAgIC8vIHRyYWNrIGRpcnR5IHR5cGVzCisgICAgICAgIFNldCBkaXJ0eSA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjb21taXQgdXBkYXRlcworICAgICAgICAgICAgaWYgKHVwZGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gdXBkYXRlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhIGRhdGEgPSAoT2JqZWN0RGF0YSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NNZXRhRGF0YSBtZXRhID0gZ2V0TGVhc3REZXJpdmVkKGRhdGEuZ2V0TWV0YURhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldE1hcChtZXRhKS5wdXQoZGF0YS5nZXRJZCgpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZGlydHkuYWRkKG1ldGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tbWl0IGRlbGV0ZXMKKyAgICAgICAgICAgIGlmIChkZWxldGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGRlbGV0ZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YSBkYXRhID0gKE9iamVjdERhdGEpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIENsYXNzTWV0YURhdGEgbWV0YSA9IGdldExlYXN0RGVyaXZlZChkYXRhLmdldE1ldGFEYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRNYXAobWV0YSkucmVtb3ZlKGRhdGEuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGRpcnR5LmFkZChtZXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdyaXRlIGNoYW5nZXMgdG8gZGlydHkgZXh0ZW50cyBiYWNrIHRvIGZpbGUKKyAgICAgICAgICAgIFhNTEZpbGVIYW5kbGVyIGZoID0gX2NvbmYuZ2V0RmlsZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gZGlydHkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbGFzc01ldGFEYXRhIG1ldGEgPSAoQ2xhc3NNZXRhRGF0YSkgaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBmaC5zdG9yZShtZXRhLCBnZXRNYXAobWV0YSkudmFsdWVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgLy8gdW5sb2NrIHN0b3JlCisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIF9sb2NrZWQgPSBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9YTUxTdG9yZU1hbmFnZXIuamF2YSBiLzEwMDBtcDEvb3BlbmpwYS14bWxzdG9yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvb3BlbmpwYS94bWxzdG9yZS9YTUxTdG9yZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM3NWMyCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXhtbHN0b3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3htbHN0b3JlL1hNTFN0b3JlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUub3BlbmpwYS54bWxzdG9yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuYWJzdHJhY3RzdG9yZS5BYnN0cmFjdFN0b3JlTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEuY29uZi5PcGVuSlBBQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLkZldGNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEua2VybmVsLk9wZW5KUEFTdGF0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLmtlcm5lbC5QQ1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS5saWIucm9wLkxpc3RSZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubGliLnJvcC5SZXN1bHRPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9wZW5qcGEubWV0YS5DbGFzc01ldGFEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUub3BlbmpwYS51dGlsLk9wdGltaXN0aWNFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcGVuanBhLnV0aWwuU3RvcmVFeGNlcHRpb247CitpbXBvcnQgc2VycC51dGlsLk51bWJlcnM7CisKKy8qKgorICogU3RvcmUgbWFuYWdlciB0byBhIGJhY2stZW5kIGNvbnNpc3Rpbmcgb2YgWE1MIGZpbGVzLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBhY2Nlc3NlcyBkYXRhIHRocm91Z2ggdGhlIHtAbGluayBYTUxTdG9yZX0gYXNzb2NpYXRlZCB3aXRoCisgKiBpdHMge0BsaW5rIFhNTENvbmZpZ3VyYXRpb259LiBDb25maWd1cmF0aW9uIGluc3RhbmNlcyBhcmUgc2hhcmVkIGJ5IGFsbAorICogc3RvcmUgbWFuYWdlcnMgb3duZWQgYnkgYWxsIGJyb2tlcnMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGZhY3RvcnkuCisgKgorICogQHNlZSBBYnN0cmFjdFN0b3JlTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgWE1MU3RvcmVNYW5hZ2VyCisgICAgZXh0ZW5kcyBBYnN0cmFjdFN0b3JlTWFuYWdlciB7CisKKyAgICBwcml2YXRlIFhNTENvbmZpZ3VyYXRpb24gX2NvbmY7CisgICAgcHJpdmF0ZSBYTUxTdG9yZSBfc3RvcmU7CisKKyAgICAvLyBjaGFuZ2VkIGRhdGEgd2l0aGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF91cGRhdGVzOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZGVsZXRlczsKKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldFVuc3VwcG9ydGVkT3B0aW9ucygpIHsKKyAgICAgICAgQ29sbGVjdGlvbiBjID0gc3VwZXIuZ2V0VW5zdXBwb3J0ZWRPcHRpb25zKCk7CisKKyAgICAgICAgLy8gcmVtb3ZlIG9wdGlvbnMgd2UgZG8gc3VwcG9ydCBidXQgdGhlIGFic3RyYWN0IHN0b3JlIGRvZXNuJ3QKKyAgICAgICAgYy5yZW1vdmUoT3BlbkpQQUNvbmZpZ3VyYXRpb24uT1BUSU9OX0lEX0RBVEFTVE9SRSk7CisgICAgICAgIGMucmVtb3ZlKE9wZW5KUEFDb25maWd1cmF0aW9uLk9QVElPTl9PUFRJTUlTVElDKTsKKworICAgICAgICAvLyBhbmQgYWRkIHNvbWUgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IGJ1dCB0aGUgYWJzdHJhY3Qgc3RvcmUgZG9lcworICAgICAgICBjLmFkZChPcGVuSlBBQ29uZmlndXJhdGlvbi5PUFRJT05fRU1CRURERURfUkVMQVRJT04pOworICAgICAgICBjLmFkZChPcGVuSlBBQ29uZmlndXJhdGlvbi5PUFRJT05fRU1CRURERURfQ09MTEVDVElPTl9SRUxBVElPTik7CisgICAgICAgIGMuYWRkKE9wZW5KUEFDb25maWd1cmF0aW9uLk9QVElPTl9FTUJFRERFRF9NQVBfUkVMQVRJT04pOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT3BlbkpQQUNvbmZpZ3VyYXRpb24gbmV3Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgLy8gb3ZlcnJpZGUgdG8gdXNlIG91ciBjb25maWd1cmF0aW9uIHR5cGUKKyAgICAgICAgcmV0dXJuIG5ldyBYTUxDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbigpIHsKKyAgICAgICAgLy8gY2FjaGUgb3BlcmF0aW9uYWwgc3RhdGUKKyAgICAgICAgX2NvbmYgPSAoWE1MQ29uZmlndXJhdGlvbikgY3R4LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgX3N0b3JlID0gX2NvbmYuZ2V0U3RvcmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gc2VlIGlmIHRoZSBnaXZlbiBvYmplY3QgZXhpc3RzIGluIHRoZSBzdG9yZQorICAgICAgICByZXR1cm4gX3N0b3JlLmdldERhdGEoc20uZ2V0TWV0YURhdGEoKSwgc20uZ2V0T2JqZWN0SWQoKSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gaW5kaWNhdG9yIGluIHRoZSBnaXZlbiBzdGF0ZSBtYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5jcmVtZW50VmVyc2lvbihPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtKSB7CisgICAgICAgIGxvbmcgdmVyc2lvbiA9IDA7CisgICAgICAgIGlmIChzbS5nZXRWZXJzaW9uKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHZlcnNpb24gPSAoKExvbmcpIHNtLmdldFZlcnNpb24oKSkubG9uZ1ZhbHVlKCkgKyAxOworICAgICAgICBzbS5zZXROZXh0VmVyc2lvbihOdW1iZXJzLnZhbHVlT2YodmVyc2lvbikpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGluaXRpYWxpemUoT3BlbkpQQVN0YXRlTWFuYWdlciBzbSwgUENTdGF0ZSBzdGF0ZSwKKyAgICAgICAgRmV0Y2hDb25maWd1cmF0aW9uIGZldGNoLCBPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyB3ZSBtYXkgYWxyZWFkeSBoYXZlIGxvb2tlZCB1cCB0aGUgYmFja2luZyBPYmplY3REYXRhIChzZWUgb3VyIGV4dGVudAorICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBiZWxvdyksIGFuZCBwYXNzZWQgaXQgdGhyb3VnaCBhcyB0aGUgY29udGV4dDsgaWYKKyAgICAgICAgLy8gbm90LCB0aGVuIGxvb2sgaXQgdXAgaW4gdGhlIHN0b3JlCisgICAgICAgIE9iamVjdERhdGEgZGF0YTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIGRhdGEgPSAoT2JqZWN0RGF0YSkgY29udGV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGF0YSA9IF9zdG9yZS5nZXREYXRhKHNtLmdldE1ldGFEYXRhKCksIHNtLmdldE9iamVjdElkKCkpOworCisgICAgICAgIC8vIG5vIG1hdGNoaW5nIHJlY29yZD8KKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzdGF0ZSBtYW5hZ2VyIHdpdGggYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJpZ2h0CisgICAgICAgIC8vIHR5cGUgYW5kIGxpZmVjeWNsZSBzdGF0ZQorICAgICAgICBzbS5pbml0aWFsaXplKGRhdGEuZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCksIHN0YXRlKTsKKworICAgICAgICAvLyBsb2FkIHRoZSBkYXRhIGZyb20gdGhlIE9iamVjdERhdGEgaW50byB0aGUgc3RhdGUgbWdyOyBub3RlIHRoYXQKKyAgICAgICAgLy8gdGhpcyBzdG9yZSBtYW5hZ2VyIGRvZXNuJ3QgZG8gYW55IGxvY2tpbmcgLS0gaXQgcmVsaWVzIG9uIHRoZQorICAgICAgICAvLyBzeXN0ZW0ncyBsb2NrIG1hbmFnZXIgdG8gbG9jayBhZnRlciB0aGUgbG9hZCBpcyBjb21wbGV0ZQorICAgICAgICBkYXRhLmxvYWQoc20sIGZldGNoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbG9hZChPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtLCBCaXRTZXQgZmllbGRzLAorICAgICAgICBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gsIGludCBsb2NrTGV2ZWwsIE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIC8vIHdlIG1heSBhbHJlYWR5IGhhdmUgbG9va2VkIHVwIHRoZSBiYWNraW5nIE9iamVjdERhdGEgKHNlZSBvdXIgZXh0ZW50CisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGJlbG93KSwgYW5kIHBhc3NlZCBpdCB0aHJvdWdoIGFzIHRoZSBjb250ZXh0OyBpZgorICAgICAgICAvLyBub3QsIHRoZW4gbG9vayBpdCB1cCBpbiB0aGUgc3RvcmUKKyAgICAgICAgT2JqZWN0RGF0YSBkYXRhOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQorICAgICAgICAgICAgZGF0YSA9IChPYmplY3REYXRhKSBjb250ZXh0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYXRhID0gX3N0b3JlLmdldERhdGEoc20uZ2V0TWV0YURhdGEoKSwgc20uZ2V0T2JqZWN0SWQoKSk7CisKKyAgICAgICAgLy8gbm8gbWF0Y2hpbmcgcmVjb3JkPworICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIGxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgT2JqZWN0RGF0YSBpbnRvIHRoZSBzdGF0ZSBtZ3I7IG5vdGUgdGhhdAorICAgICAgICAvLyB0aGlzIHN0b3JlIG1hbmFnZXIgZG9lc24ndCBkbyBhbnkgbG9ja2luZyAtLSBpdCByZWxpZXMgb24gdGhlCisgICAgICAgIC8vIHN5c3RlbSdzIGxvY2sgbWFuYWdlciB0byBsb2NrIGFmdGVyIHRoZSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGRhdGEubG9hZChzbSwgZmllbGRzLCBmZXRjaCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN5bmNWZXJzaW9uKE9wZW5KUEFTdGF0ZU1hbmFnZXIgc20sIE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIGlmIChzbS5nZXRWZXJzaW9uKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyB3ZSBtYXkgYWxyZWFkeSBoYXZlIGxvb2tlZCB1cCB0aGUgYmFja2luZyBPYmplY3REYXRhIChzZWUgb3VyIGV4dGVudAorICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBiZWxvdyksIGFuZCBwYXNzZWQgaXQgdGhyb3VnaCBhcyB0aGUgY29udGV4dDsgaWYKKyAgICAgICAgLy8gbm90LCB0aGVuIGxvb2sgaXQgdXAgaW4gdGhlIHN0b3JlCisgICAgICAgIE9iamVjdERhdGEgZGF0YTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIGRhdGEgPSAoT2JqZWN0RGF0YSkgY29udGV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGF0YSA9IF9zdG9yZS5nZXREYXRhKHNtLmdldE1ldGFEYXRhKCksIHNtLmdldE9iamVjdElkKCkpOworCisgICAgICAgIC8vIG5vIHJlY29yZD8KKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBpZiB0aGUgdmVyc2lvbiBvZiBkYXRhIGhlbGQgYnkgdGhlIHN0YXRlIG1nciBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgLy8gdmVyc2lvbiBpbiB0aGUgZGF0YXN0b3JlLCByZXR1cm4gdHJ1ZSwgbGV0dGluZyB0aGUgYnJva2VyIGtub3cgdGhhdAorICAgICAgICAvLyBpdCBkb2Vzbid0IG5lZWQgdG8gbG9hZCBhbnkgbW9yZSBkYXRhCisgICAgICAgIGlmIChzbS5nZXRWZXJzaW9uKCkuZXF1YWxzKGRhdGEuZ2V0VmVyc2lvbigpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIHNldCB0aGUgdmVyc2lvbiB0byBiZSB1cC10by1kYXRlLCBhbmQgcmV0dXJuIGZhbHNlIGxldHRpbmcKKyAgICAgICAgLy8gdGhlIGJyb2tlciBrbm93IHRoYXQgaXQgbmVlZHMgdG8gbG9hZCB1cC10by1kYXRlIGRhdGEKKyAgICAgICAgc20uc2V0VmVyc2lvbihkYXRhLmdldFZlcnNpb24oKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbigpIHsKKyAgICAgICAgX3N0b3JlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfc3RvcmUuZW5kVHJhbnNhY3Rpb24oX3VwZGF0ZXMsIF9kZWxldGVzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIF91cGRhdGVzID0gbnVsbDsKKyAgICAgICAgICAgIF9kZWxldGVzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgeworICAgICAgICBfdXBkYXRlcyA9IG51bGw7CisgICAgICAgIF9kZWxldGVzID0gbnVsbDsKKyAgICAgICAgX3N0b3JlLmVuZFRyYW5zYWN0aW9uKG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGZsdXNoKENvbGxlY3Rpb24gcE5ldywgQ29sbGVjdGlvbiBwTmV3VXBkYXRlZCwKKyAgICAgICAgQ29sbGVjdGlvbiBwTmV3Rmx1c2hlZERlbGV0ZWQsIENvbGxlY3Rpb24gcERpcnR5LCBDb2xsZWN0aW9uIHBEZWxldGVkKSB7CisgICAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgaW5jcmVtZW50YWwgZmx1c2hpbmcsIHNvIHBOZXdVcGRhdGVkIGFuZAorICAgICAgICAvLyBwTmV3Rmx1c2hlZERlbGV0ZWQgc2hvdWxkIGJlIGVtcHR5OyB3ZSBpZ25vcmUgdGhlbSBoZXJlCisKKyAgICAgICAgLy8gdHJhY2sgb3B0aW1pc3RpYyB2aW9sYXRpb25zCisgICAgICAgIENvbGxlY3Rpb24gZXhjZXBzID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgICAgICAvLyBjb252ZXJ0IGluc3RhbmNlcyB0byBPYmplY3REYXRhcworICAgICAgICBfdXBkYXRlcyA9IG5ldyBBcnJheUxpc3QocE5ldy5zaXplKCkgKyBwRGlydHkuc2l6ZSgpKTsKKyAgICAgICAgX2RlbGV0ZXMgPSBuZXcgQXJyYXlMaXN0KHBEZWxldGVkLnNpemUoKSk7CisKKyAgICAgICAgLy8gY29udmVydCBhZGRpdGlvbnMKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwTmV3Lml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IG9iamVjdCBkYXRhIGZvciBpbnN0YW5jZQorICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBpdHIubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0IG9pZCA9IHNtLmdldE9iamVjdElkKCk7CisgICAgICAgICAgICBPYmplY3REYXRhIGRhdGEgPSBfc3RvcmUuZ2V0RGF0YShzbS5nZXRNZXRhRGF0YSgpLCBvaWQpOworICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmVFeGNlcHRpb24oIkF0dGVtcHQgdG8gaW5zZXJ0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAibmV3IG9iamVjdCAiICsgc20uZ2V0TWFuYWdlZEluc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAid2l0aCB0aGUgc2FtZSBvaWQgYXMgYW4gZXhpc3RpbmcgaW5zdGFuY2U6ICIgKyBvaWQpLgorICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbCh0cnVlKTsKKworICAgICAgICAgICAgZGF0YSA9IG5ldyBPYmplY3REYXRhKG9pZCwgc20uZ2V0TWV0YURhdGEoKSk7CisgICAgICAgICAgICBpbmNyZW1lbnRWZXJzaW9uKHNtKTsKKyAgICAgICAgICAgIGRhdGEuc3RvcmUoc20pOworICAgICAgICAgICAgX3VwZGF0ZXMuYWRkKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29udmVydCB1cGRhdGVzCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcERpcnR5Lml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPcGVuSlBBU3RhdGVNYW5hZ2VyIHNtID0gKE9wZW5KUEFTdGF0ZU1hbmFnZXIpIGl0ci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3REYXRhIGRhdGEgPSBfc3RvcmUuZ2V0RGF0YShzbS5nZXRNZXRhRGF0YSgpLAorICAgICAgICAgICAgICAgIHNtLmdldE9iamVjdElkKCkpOworCisgICAgICAgICAgICAvLyBpZiBkYXRhIGhhcyBiZWVuIGRlbGV0ZWQgb3IgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uLCByZWNvcmQKKyAgICAgICAgICAgIC8vIG9wdCBsb2NrIHZpb2xhdGlvbgorICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCAhZGF0YS5nZXRWZXJzaW9uKCkuZXF1YWxzKHNtLmdldFZlcnNpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBleGNlcHMuYWRkKG5ldyBPcHRpbWlzdGljRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRNYW5hZ2VkSW5zdGFuY2UoKSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdG9yZSBjaGFuZ2VzCisgICAgICAgICAgICBpbmNyZW1lbnRWZXJzaW9uKHNtKTsKKyAgICAgICAgICAgIGRhdGEgPSAoT2JqZWN0RGF0YSkgZGF0YS5jbG9uZSgpOworICAgICAgICAgICAgZGF0YS5zdG9yZShzbSk7CisgICAgICAgICAgICBfdXBkYXRlcy5hZGQoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb252ZXJ0IGRlbGV0ZXMKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBwRGVsZXRlZC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT3BlbkpQQVN0YXRlTWFuYWdlciBzbSA9IChPcGVuSlBBU3RhdGVNYW5hZ2VyKSBpdHIubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0RGF0YSBkYXRhID0gX3N0b3JlLmdldERhdGEoc20uZ2V0TWV0YURhdGEoKSwKKyAgICAgICAgICAgICAgICBzbS5nZXRPYmplY3RJZCgpKTsKKworICAgICAgICAgICAgLy8gcmVjb3JkIGRlbGV0ZQorICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZGVsZXRlcy5hZGQoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXhjZXBzOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHRPYmplY3RQcm92aWRlciBleGVjdXRlRXh0ZW50KENsYXNzTWV0YURhdGEgbWV0YSwKKyAgICAgICAgYm9vbGVhbiBzdWJjbGFzc2VzLCBGZXRjaENvbmZpZ3VyYXRpb24gZmV0Y2gpIHsKKyAgICAgICAgLy8gYXNrIHRoZSBzdG9yZSBmb3IgYWxsIE9iamVjdERhdGFzIGZvciB0aGUgZ2l2ZW4gdHlwZTsgdGhpcworICAgICAgICAvLyBhY3R1YWxseSBnaXZlcyB1cyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSB0eXBlCisgICAgICAgIE9iamVjdERhdGFbXSBkYXRhcyA9IF9zdG9yZS5nZXREYXRhKG1ldGEpOworICAgICAgICBDbGFzcyBjYW5kaWRhdGUgPSBtZXRhLmdldERlc2NyaWJlZFR5cGUoKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHBlcnNpc3RlbnQgb2JqZWN0cyB0aGF0CisgICAgICAgIC8vIG1hdGNoIHRoZSB0eXBlIGFuZCBzdWJjbGFzc2VzIGNyaXRlcmlhCisgICAgICAgIExpc3QgcGNzID0gbmV3IEFycmF5TGlzdChkYXRhcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBkb2VzIHRoaXMgaW5zdGFuY2UgYmVsb25nIGluIHRoZSBleHRlbnQ/CisgICAgICAgICAgICBDbGFzcyBjID0gZGF0YXNbaV0uZ2V0TWV0YURhdGEoKS5nZXREZXNjcmliZWRUeXBlKCk7CisgICAgICAgICAgICBpZiAoYyAhPSBjYW5kaWRhdGUgJiYgKCFzdWJjbGFzc2VzCisgICAgICAgICAgICAgICAgfHwgIWNhbmRpZGF0ZS5pc0Fzc2lnbmFibGVGcm9tKGMpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgcGMgaW5zdGFuY2UgZm9yIHRoZSBkYXRhLCBwYXNzaW5nIGluIHRoZSBkYXRhCisgICAgICAgICAgICAvLyBhcyB3ZWxsIHNvIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgd2UndmUKKyAgICAgICAgICAgIC8vIGFscmVhZHkgbG9va2VkIGl0IHVwLiAgbm90ZSB0aGF0IGluIHRoZSBzdG9yZSBtYW5hZ2VyJ3MKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUoKSwgbG9hZCgpLCBldGMgbWV0aG9kcyB3ZSBjaGVjayBmb3IgdGhpcyBkYXRhCisgICAgICAgICAgICAvLyBiZWluZyBwYXNzZWQgdGhyb3VnaCBhbmQgc2F2ZSBvdXJzZWx2ZXMgYSB0cmlwIHRvIHRoZSBzdG9yZQorICAgICAgICAgICAgLy8gaWYgaXQgaXMgcHJlc2VudDsgdGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIHN5c3RlbXMKKyAgICAgICAgICAgIC8vIHdoZXJlIGEgdHJpcCB0byB0aGUgc3RvcmUgY2FuIGJlIGV4cGVuc2l2ZS4KKyAgICAgICAgICAgIHBjcy5hZGQoY3R4LmZpbmQoZGF0YXNbaV0uZ2V0SWQoKSwgZmV0Y2gsIG51bGwsIGRhdGFzW2ldLCAwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzdWx0T2JqZWN0UHJvdmlkZXIocGNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS8xMDAwbXAxL29wZW5qcGEteG1sc3RvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL29wZW5qcGEveG1sc3RvcmUvcGFja2FnZS5odG1sIGIvMTAwMG1wMS9vcGVuanBhLXhtbHN0b3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3htbHN0b3JlL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc4YTFiCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9vcGVuanBhLXhtbHN0b3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9vcGVuanBhL3htbHN0b3JlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGh0bWw+Cis8Ym9keT4KKzxwPjxzdHJvbmc+WE1MIFN0b3JlPC9zdHJvbmc+PC9wPgorCis8cD4KKyAgICBTaW1wbGUgWE1MIHN0b3JlIHVzaW5nIHRoZSBjb21tb24gT3BlbkpQQSBydW50aW1lIHN5c3RlbSBhcyBhIGZyb250IGVuZC4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvcG9tLnhtbCBiLzEwMDBtcDEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUyZjNhCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9wb20ueG1sCkBAIC0wLDAgKzEsMzI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyANCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIA0KKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyB1bmRlciB0aGUgTGljZW5zZS4gICANCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjANCisgICAgICAgICAgICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgICA8cHJlcmVxdWlzaXRlcz4NCisgICAgICAgIDxtYXZlbj4yLjAuNDwvbWF2ZW4+DQorICAgIDwvcHJlcmVxdWlzaXRlcz4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVuanBhPC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5vcGVuanBhLXBhcmVudDwvYXJ0aWZhY3RJZD4NCisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCisgICAgPG5hbWU+T3BlbkpQQTwvbmFtZT4NCisgICAgPGRlc2NyaXB0aW9uPk9wZW5KUEE8L2Rlc2NyaXB0aW9uPg0KKw0KKyAgICA8cHJvcGVydGllcz4NCisgICAgICAgIDxzY20uZGlyPnN2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9vcGVuanBhL3RydW5rPC9zY20uZGlyPg0KKyAgICA8L3Byb3BlcnRpZXM+DQorDQorICAgIDwhLS0NCisgICAgICAgIENoYW5naW5nIHRoaXMgdmVyc2lvbiBuZWVkcyB0byBhbHNvIGJlIGRvbmUgaW4gYWxsIGNoaWxkcmVuIHBvbXMNCisgICAgICAgIFNlZTogaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9NTkctNjI0DQorICAgIC0tPg0KKyAgICA8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgPHVybD5odHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvcHJvamVjdHMvb3BlbmpwYTwvdXJsPg0KKyAgICA8aXNzdWVNYW5hZ2VtZW50Pg0KKyAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+DQorICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9PUEVOSlBBPC91cmw+DQorICAgIDwvaXNzdWVNYW5hZ2VtZW50Pg0KKyAgICA8aW5jZXB0aW9uWWVhcj4yMDA2PC9pbmNlcHRpb25ZZWFyPg0KKyAgICA8bWFpbGluZ0xpc3RzPg0KKyAgICAgICAgPG1haWxpbmdMaXN0Pg0KKyAgICAgICAgICAgIDxuYW1lPk9wZW5KUEEgRGV2ZWxvcGVyIExpc3Q8L25hbWU+DQorICAgICAgICAgICAgPHN1YnNjcmliZT5vcGVuLWpwYS1kZXYtc3Vic2NyaWJlQGluY3ViYXRvci5hcGFjaGUub3JnPC9zdWJzY3JpYmU+DQorICAgICAgICAgICAgPHVuc3Vic2NyaWJlPm9wZW4tanBhLWRldi11bnN1YnNjcmliZUBpbmN1YmF0b3IuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+DQorICAgICAgICAgICAgPHBvc3Q+b3Blbi1qcGEtZGV2QGluY3ViYXRvci5hcGFjaGUub3JnPC9wb3N0Pg0KKyAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvaW5jdWJhdG9yLW9wZW4tanBhLWRldi88L2FyY2hpdmU+DQorICAgICAgICA8L21haWxpbmdMaXN0Pg0KKyAgICAgICAgPG1haWxpbmdMaXN0Pg0KKyAgICAgICAgICAgIDxuYW1lPk9wZW5KUEEgQ29tbWl0cyBMaXN0PC9uYW1lPg0KKyAgICAgICAgICAgIDxzdWJzY3JpYmU+b3Blbi1qcGEtY29tbWl0cy1zdWJzY3JpYmVAaW5jdWJhdG9yLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4NCisgICAgICAgICAgICA8dW5zdWJzY3JpYmU+b3Blbi1qcGEtY29tbWl0cy11bnN1YnNjcmliZUBpbmN1YmF0b3IuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+DQorICAgICAgICAgICAgPHBvc3Q+b3Blbi1qcGEtY29tbWl0c0BpbmN1YmF0b3IuYXBhY2hlLm9yZzwvcG9zdD4NCisgICAgICAgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2luY3ViYXRvci1vcGVuLWpwYS1jb21taXRzLzwvYXJjaGl2ZT4NCisgICAgICAgIDwvbWFpbGluZ0xpc3Q+DQorICAgIDwvbWFpbGluZ0xpc3RzPg0KKyAgICA8ZGV2ZWxvcGVycz4NCisgICAgICAgIDxkZXZlbG9wZXI+DQorICAgICAgICAgICAgPG5hbWU+UGF0cmljayBMaW5za2V5PC9uYW1lPg0KKyAgICAgICAgICAgIDxpZD5wbGluc2tleTwvaWQ+DQorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5CRUEgU3lzdGVtcywgSW5jLjwvb3JnYW5pemF0aW9uPg0KKyAgICAgICAgICAgIDxlbWFpbD5wbGluc2tleUBiZWEuY29tPC9lbWFpbD4NCisgICAgICAgIDwvZGV2ZWxvcGVyPg0KKyAgICAgICAgPGRldmVsb3Blcj4NCisgICAgICAgICAgICA8bmFtZT5BYmUgV2hpdGU8L25hbWU+DQorICAgICAgICAgICAgPGlkPmF3aGl0ZTwvaWQ+DQorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5CRUEgU3lzdGVtcywgSW5jLjwvb3JnYW5pemF0aW9uPg0KKyAgICAgICAgICAgIDxlbWFpbD5hd2hpdGVAYmVhLmNvbTwvZW1haWw+DQorICAgICAgICA8L2RldmVsb3Blcj4NCisgICAgICAgIDxkZXZlbG9wZXI+DQorICAgICAgICAgICAgPG5hbWU+U3RldmUgS2ltPC9uYW1lPg0KKyAgICAgICAgICAgIDxpZD5zdGtpbTwvaWQ+DQorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5CRUEgU3lzdGVtcywgSW5jLjwvb3JnYW5pemF0aW9uPg0KKyAgICAgICAgICAgIDxlbWFpbD5zdGtpbUBiZWEuY29tPC9lbWFpbD4NCisgICAgICAgIDwvZGV2ZWxvcGVyPg0KKyAgICAgICAgPGRldmVsb3Blcj4NCisgICAgICAgICAgICA8bmFtZT5NYXJjIFBydWQnaG9tbWVhdXg8L25hbWU+DQorICAgICAgICAgICAgPGlkPm1wcnVkaG9tPC9pZD4NCisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPkJFQSBTeXN0ZW1zLCBJbmMuPC9vcmdhbml6YXRpb24+DQorICAgICAgICAgICAgPGVtYWlsPm1wcnVkaG9tQGJlYS5jb208L2VtYWlsPg0KKyAgICAgICAgPC9kZXZlbG9wZXI+DQorICAgIDwvZGV2ZWxvcGVycz4NCisgICAgPGxpY2Vuc2VzPg0KKyAgICAgICAgPGxpY2Vuc2U+DQorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wPC9uYW1lPg0KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPg0KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPg0KKyAgICAgICAgPC9saWNlbnNlPg0KKyAgICA8L2xpY2Vuc2VzPg0KKyAgICA8b3JnYW5pemF0aW9uPg0KKyAgICAgICAgPG5hbWU+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+DQorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZzwvdXJsPg0KKyAgICA8L29yZ2FuaXphdGlvbj4NCisgICAgPHNjbT4NCisgICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovLyR7c2NtLmRpcn08L2Nvbm5lY3Rpb24+DQorICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vJHtzY20uZGlyfTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCisgICAgICAgIDx1cmw+aHR0cHM6Ly8ke3NjbS5kaXJ9PC91cmw+DQorICAgIDwvc2NtPg0KKyAgICA8bW9kdWxlcz4NCisgICAgICAgIDxtb2R1bGU+b3BlbmpwYS1saWI8L21vZHVsZT4NCisgICAgICAgIDxtb2R1bGU+b3BlbmpwYS1rZXJuZWw8L21vZHVsZT4NCisgICAgICAgIDxtb2R1bGU+b3BlbmpwYS1qZGJjPC9tb2R1bGU+DQorICAgICAgICA8bW9kdWxlPm9wZW5qcGEteG1sc3RvcmU8L21vZHVsZT4NCisgICAgICAgIDxtb2R1bGU+b3BlbmpwYS1hbGw8L21vZHVsZT4NCisgICAgICAgIDxtb2R1bGU+b3BlbmpwYS1wcm9qZWN0PC9tb2R1bGU+DQorICAgICAgICA8bW9kdWxlPm9wZW5qcGEtaW50ZWdyYXRpb248L21vZHVsZT4NCisgICAgPC9tb2R1bGVzPg0KKyAgICA8cHJvZmlsZXM+DQorICAgICAgICA8cHJvZmlsZT4NCisgICAgICAgICAgICA8aWQ+amRrMS41PC9pZD4NCisgICAgICAgICAgICA8YWN0aXZhdGlvbj4NCisgICAgICAgICAgICAgICAgPGpkaz4xLjU8L2pkaz4NCisgICAgICAgICAgICA8L2FjdGl2YXRpb24+DQorICAgICAgICAgICAgPG1vZHVsZXM+DQorICAgICAgICAgICAgICAgIDxtb2R1bGU+b3BlbmpwYS1wZXJzaXN0ZW5jZTwvbW9kdWxlPg0KKyAgICAgICAgICAgICAgICA8bW9kdWxlPm9wZW5qcGEtcGVyc2lzdGVuY2UtamRiYzwvbW9kdWxlPg0KKyAgICAgICAgICAgICAgICA8bW9kdWxlPm9wZW5qcGEta2VybmVsLTU8L21vZHVsZT4NCisgICAgICAgICAgICAgICAgPG1vZHVsZT5vcGVuanBhLWpkYmMtNTwvbW9kdWxlPg0KKyAgICAgICAgICAgICAgICA8bW9kdWxlPm9wZW5qcGEtZXhhbXBsZXM8L21vZHVsZT4NCisgICAgICAgICAgICA8L21vZHVsZXM+DQorICAgICAgICA8L3Byb2ZpbGU+DQorICAgICAgICA8cHJvZmlsZT4NCisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+DQorICAgICAgICAgICAgPGFjdGl2YXRpb24+DQorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCisgICAgICAgICAgICAgICAgICAgIDxuYW1lPnJlbGVhc2U8L25hbWU+DQorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KKyAgICAgICAgICAgIDxtb2R1bGVzPg0KKyAgICAgICAgICAgICAgICA8bW9kdWxlPm9wZW5qcGEtcHJvamVjdDwvbW9kdWxlPg0KKyAgICAgICAgICAgIDwvbW9kdWxlcz4NCisgICAgICAgIDwvcHJvZmlsZT4NCisNCisgICAgICAgIDwhLS0NCisgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbiB1c2luZyB0aGUgWURvYyBVTUwgZ2VuZXJhdGlvbiBwbHVnaW4uDQorICAgICAgICAgICAgQXNzdW1lcyB5b3UgaGF2ZSB0aGUgWURvYyBsaWJyYXJpZXMgbG9jYWxseSwgYXMgd2VsbCBhcyBhIHZhbGlkDQorICAgICAgICAgICAgWURvYyBsaWNlbnNlIGZpbGUuIEV4YW1wbGUgdXNhZ2UgZm9yIGJ1aWxkaW5nIHRoZSBkb2NzOg0KKw0KKyAgICAgICAgICAgIG12biBwcm9jZXNzLWNsYXNzZXMgLVB5ZG9jLXByb2ZpbGUsamF2YWRvYy1wcm9maWxlIC1EeWRvYy5ob21lPSR7SE9NRX0vLm0yL3ByaXZhdGVyZXBvcy95ZG9jL3lkb2MtMi4yXzA0LWpkazEuNSAtRHlkb2MubGljZW5zZT0ke0hPTUV9Ly5tMi9wcml2YXRlcmVwb3MveWRvYy95ZG9jLmxpY2Vuc2UNCisgICAgICAgIC0tPg0KKyAgICAgICAgPHByb2ZpbGU+DQorICAgICAgICAgICAgPGlkPnlkb2MtcHJvZmlsZTwvaWQ+DQorICAgICAgICAgICAgPHByb3BlcnRpZXM+DQorICAgICAgICAgICAgICAgIDxqYXZhZG9jLmFkZGl0aW9uYWxwYXJhbT4NCisgICAgICAgICAgICAgICAgICAgIC1nZW5lcmljDQorICAgICAgICAgICAgICAgICAgICAtdW1sYXV0b2dlbg0KKyAgICAgICAgICAgICAgICAgICAgLXRhZyBwYXJhbQ0KKyAgICAgICAgICAgICAgICAgICAgLXRhZyByZXR1cm4NCisgICAgICAgICAgICAgICAgICAgIC10YWcgc2VlDQorICAgICAgICAgICAgICAgICAgICAteXRhZyB5LnVtbA0KKyAgICAgICAgICAgICAgICAgICAgLWxpY2Vuc2UgJHt5ZG9jLmxpY2Vuc2V9DQorICAgICAgICAgICAgICAgICAgICAtZmlsdGVyIHlkb2MuZmlsdGVycy5FeGNsdWRlRmlsdGVyDQorICAgICAgICAgICAgICAgICAgICAtZmlsdGVycGF0aCAke3lkb2MuaG9tZX0vbGliL3lkb2MuamFyDQorICAgICAgICAgICAgICAgICAgICAtZG9jbGV0IHlkb2MuZG9jbGV0cy5ZU3RhbmRhcmQNCisgICAgICAgICAgICAgICAgICAgIC1kb2NsZXRwYXRoICR7eWRvYy5ob21lfS9saWIveWRvYy5qYXIke3BhdGguc2VwYXJhdG9yfSR7eWRvYy5ob21lfS9saWIvY2xhc3Myc3ZnLmphciR7cGF0aC5zZXBhcmF0b3J9JHt5ZG9jLmhvbWV9L3Jlc291cmNlcw0KKyAgICAgICAgICAgICAgICAgICAgJHt5ZG9jLnBhcmFtc30NCisgICAgICAgICAgICAgICAgPC9qYXZhZG9jLmFkZGl0aW9uYWxwYXJhbT4NCisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+DQorICAgICAgICA8L3Byb2ZpbGU+DQorDQorICAgICAgICA8cHJvZmlsZT4NCisgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIEphdmFkb2MgcHJvZmlsZS4gRG9jcyBjYW4gYmUgYnVpbHQgYnkgcnVubmluZzoNCisgICAgICAgICAgICAgICAgICAgIG12biBwcm9jZXNzLXJlc291cmNlcyAtRHRlc3Q9ZmFsc2UgLVBqYXZhZG9jLXByb2ZpbGUNCisgICAgICAgICAgICAtLT4gIA0KKyAgICAgICAgICAgIDxpZD5qYXZhZG9jLXByb2ZpbGU8L2lkPg0KKyAgICAgICAgICAgIDxidWlsZD4NCisgICAgICAgICAgICAgICAgPHBsdWdpbnM+DQorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz48Z29hbD5qYXZhZG9jPC9nb2FsPjwvZ29hbHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbHBhcmFtPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2phdmFkb2MuYWRkaXRpb25hbHBhcmFtfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWRkaXRpb25hbHBhcmFtPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZ2dyZWdhdGU+dHJ1ZTwvYWdncmVnYXRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWJwYWNrYWdlcz5vcmcuYXBhY2hlLm9wZW5qcGE8L3N1YnBhY2thZ2VzPg0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJib3NlPmZhbHNlPC92ZXJib3NlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGxpbmtzb3VyY2U+dHJ1ZTwvbGlua3NvdXJjZT4gLS0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heG1lbW9yeT41MTJtPC9tYXhtZW1vcnk+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGk8L2xpbms+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YWVlLzUvZG9jcy9hcGk8L2xpbms+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9jb2xsZWN0aW9ucy9hcGktcmVsZWFzZTwvbGluaz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KKyAgICAgICAgICAgIDwvYnVpbGQ+DQorICAgICAgICAgICAgPGFjdGl2YXRpb24+DQorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1aWxkZG9jczwvbmFtZT4NCisgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4NCisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCisgICAgICAgICAgICA8L2FjdGl2YXRpb24+DQorICAgICAgICA8L3Byb2ZpbGU+DQorDQorICAgIDwvcHJvZmlsZXM+DQorDQorICAgIDxyZXBvc2l0b3JpZXM+DQorICAgICAgICA8cmVwb3NpdG9yeT4NCisgICAgICAgICAgICA8aWQ+Y2VudHJhbDwvaWQ+DQorICAgICAgICAgICAgPG5hbWU+TWF2ZW4gUmVwb3NpdG9yeSBTd2l0Y2hib2FyZDwvbmFtZT4NCisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4yPC91cmw+DQorICAgICAgICA8L3JlcG9zaXRvcnk+DQorICAgIDwvcmVwb3NpdG9yaWVzPg0KKyAgICA8ZGVwZW5kZW5jaWVzPg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+DQorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8L2RlcGVuZGVuY2llcz4NCisgICAgPGJ1aWxkPg0KKyAgICAgICAgPHJlc291cmNlcz4NCisgICAgICAgICAgICA8cmVzb3VyY2U+DQorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQorICAgICAgICAgICAgPC9yZXNvdXJjZT4NCisgICAgICAgICAgICA8IS0tIGFsc28gaW5jbHVkZSBsaWNlbnNlIGFuZCBub3RpY2UgZmlsZXMgaW4gYWxsIHRoZSBqYXJzIC0tPg0KKyAgICAgICAgICAgIDxyZXNvdXJjZT4NCisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9Ly4uL29wZW5qcGEtcHJvamVjdC88L2RpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+RElTQ0xBSU1FUi50eHQ8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPg0KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+DQorICAgICAgICA8L3Jlc291cmNlcz4NCisgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50Pg0KKyAgICAgICAgICAgIDxwbHVnaW5zPg0KKyAgICAgICAgICAgICAgICA8cGx1Z2luPg0KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCisgICAgICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4NCisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgICAgIDxwbHVnaW4+DQorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8dXNlRmlsZT5mYWxzZTwvdXNlRmlsZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8dHJpbVN0YWNrVHJhY2U+ZmFsc2U8L3RyaW1TdGFja1RyYWNlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1c2VTeXN0ZW1DbGFzc0xvYWRlcj50cnVlPC91c2VTeXN0ZW1DbGFzc0xvYWRlcj4NCisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgPC9wbHVnaW5zPg0KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50Pg0KKyAgICA8L2J1aWxkPg0KKyAgICA8cmVwb3J0aW5nPg0KKyAgICAgICAgPHBsdWdpbnM+DQorICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8cmVwb3J0U2V0cz4NCisgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRTZXQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+amRlcGVuZC1tYXZlbi1wbHVnaW48L3JlcG9ydD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8cmVwb3J0Pmp4ci1tYXZlbi1wbHVnaW48L3JlcG9ydD4gLS0+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+c3VyZWZpcmUtcmVwb3J0LW1hdmVuLXBsdWdpbjwvcmVwb3J0Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0Pm1hdmVuLWphdmFkb2MtcGx1Z2luPC9yZXBvcnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+cHJvamVjdC10ZWFtPC9yZXBvcnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+bWFpbGluZy1saXN0PC9yZXBvcnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+aXNzdWUtdHJhY2tpbmc8L3JlcG9ydD4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5saWNlbnNlPC9yZXBvcnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+c2NtPC9yZXBvcnQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPg0KKyAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRTZXQ+DQorICAgICAgICAgICAgICAgIDwvcmVwb3J0U2V0cz4NCisgICAgICAgICAgICA8L3BsdWdpbj4NCisgICAgICAgICAgICA8cGx1Z2luPg0KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnRhZ2xpc3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDwvcGx1Z2luPg0KKyAgICAgICAgPC9wbHVnaW5zPg0KKyAgICA8L3JlcG9ydGluZz4NCisNCisNCisgICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQorICAgICAgPHJlcG9zaXRvcnk+DQorICAgICAgICA8aWQ+cGVvcGxlLmFwYWNoZS5vcmc8L2lkPg0KKyAgICAgICAgPHVybD5zY3A6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pbmN1YmF0aW5nLXJlcG9zaXRvcnkvPC91cmw+DQorICAgICAgPC9yZXBvc2l0b3J5Pg0KKyAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+DQorICAgICAgICA8aWQ+cGVvcGxlLmFwYWNoZS5vcmc8L2lkPg0KKyAgICAgICAgPHVybD5zY3A6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5LzwvdXJsPg0KKyAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+DQorICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+DQorICAgICAgPHNpdGU+DQorICAgICAgICA8aWQ+cGVvcGxlLmFwYWNoZS5vcmc8L2lkPg0KKyAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy9ob21lL21wcnVkaG9tL3B1YmxpY19odG1sL29wZW5qcGEvc2l0ZS88L3VybD4NCisgICAgICA8L3NpdGU+DQorICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9zcmMvc2l0ZS9hcHQvYnVpbGRpbmcuYXB0IGIvMTAwMG1wMS9zcmMvc2l0ZS9hcHQvYnVpbGRpbmcuYXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjc4NmEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL3NyYy9zaXRlL2FwdC9idWlsZGluZy5hcHQKQEAgLTAsMCArMSw0MCBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuIAorCisgLS0tLS0tCisgb3BlbmpwYQorIC0tLS0tLQorCitCdWlsZGluZyBPcGVuSlBBCisKKyBCdWlsZGluZyBPcGVuSlBBIHJlcXVpcmVzIGFuIGluc3RhbGxhdGlvbiBvZiB7e3todHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy99TWF2ZW4gMn19LgorCisgQ2hlY2sgb3V0IHRoZSBzb3VyY2VzIHRoZW4gcnVuOgorCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgCittdm4gY29tcGlsZQorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgVG8gcnVuIHRoZSB0ZXN0czoKKworKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgIAorbXZuIHRlc3QKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAKKworCisKKwpkaWZmIC0tZ2l0IGEvMTAwMG1wMS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvMTAwMG1wMS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzNjMDEKLS0tIC9kZXYvbnVsbAorKysgYi8xMDAwbXAxL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKQEAgLTAsMCArMSwyOCBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuIAorCisgLS0tLS0tCisgb3BlbmpwYQorIC0tLS0tLQorCitXZWxjb21lIHRvIHRoZSBPcGVuSlBBIHByb2plY3Qgc2l0ZSEKKworIE9wZW5KUEEgaXMgYSBzZXQgb2YgSmF2YSBwZXJzaXN0ZW5jZSBBcHBsaWNhdGlvbiBQcm9ncmFtIEludGVyZmFjZXMgKEFQSXMpIHRoYXQgYXJlIGJhc2VkIG9uIHRoZSBFbnRlcnByaXNlIEphdmEgQmVhbnMgMy4wIHBlcnNpc3RlbmFjZSBzcGVjaWZpY2F0aW9uLiBUaGlzIGlzIHRoZSBkaXN0cmlidXRpb24gYW5kIHByb2plY3QgbWFuYWdlbWVudCBzaXRlIGZvciBPcGVuSlBBLiBGb3IgY29tbXVuaXR5IHJlc291cmNlcywgcGxlYXNlIHNlZSB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pbmN1YmF0b3IvT3BlbkpQQX1PcGVuSlBBIHdpa2l9fS4KKworIFRvIGRvd25sb2FkIE9wZW5KUEEsIHBsZWFzZSBnbyB0byB0aGUge3t7ZG93bmxvYWRzLmh0bWx9ZG93bmxvYWRzfX0gcGFnZS4KKworCmRpZmYgLS1naXQgYS8xMDAwbXAxL3NyYy9zaXRlL3NpdGUueG1sIGIvMTAwMG1wMS9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDcyYWMxCi0tLSAvZGV2L251bGwKKysrIGIvMTAwMG1wMS9zcmMvc2l0ZS9zaXRlLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPHByb2plY3QgbmFtZT0iT3BlbkpQQSI+CisgICAgPGJhbm5lckxlZnQ+CisgICAgICAgIDxuYW1lPk9wZW5KUEE8L25hbWU+CisgICAgICAgIDwhLS0gPHNyYz5odHRwOi8vd3d3LmFwYWNoZS5vcmcvaW1hZ2VzL2FzZl9sb2dvX3dpZGUuZ2lmPC9zcmM+IC0tPgorICAgICAgICA8IS0tIDxocmVmPi88L2hyZWY+IC0tPgorICAgIDwvYmFubmVyTGVmdD4gICAgIAorICAgIDxib2R5PgorICAgICAgICA8bWVudSBuYW1lPSJPcGVuSlBBIj4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9IkhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiLz4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9Ik1hbnVhbCIgaHJlZj0ib3BlbmpwYS1wcm9qZWN0L21hbnVhbC9pbmRleC5odG1sIi8+CisgICAgICAgICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgaHJlZj0iZG93bmxvYWRzLmh0bWwiLz4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9IkJ1aWxkaW5nIiBocmVmPSJidWlsZGluZy5odG1sIi8+CisgICAgICAgIDwvbWVudT4KKworICAgICAgICA8bWVudSBuYW1lPSJDb21tdW5pdHkiPgorICAgICAgICAgICAgPGl0ZW0gbmFtZT0iSXNzdWUgVHJhY2tlciIKKyAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL09QRU5KUEEiLz4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9Ildpa2kiCisgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pbmN1YmF0b3IvT3BlbkpQQSIvPgorICAgICAgICA8L21lbnU+CisKKyAgICAgICAgPG1lbnUgcmVmPSJwYXJlbnQiLz4KKyAgICAgICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+CisKKyAgICAgICAgPCEtLSA8bWVudSByZWY9Im1vZHVsZXMiLz4gLS0+CisgICAgPC9ib2R5PgorCisgICAgPCEtLQorICAgIDxza2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNraW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdHlsdXMtc2tpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgIDwvc2tpbj4KKyAgICAtLT4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEwMDBtcDEvc3JjL3NpdGUveGRvYy9kb3dubG9hZHMueG1sIGIvMTAwMG1wMS9zcmMvc2l0ZS94ZG9jL2Rvd25sb2Fkcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjMGVmMgotLS0gL2Rldi9udWxsCisrKyBiLzEwMDBtcDEvc3JjL3NpdGUveGRvYy9kb3dubG9hZHMueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4gICAKKy0tPgorPGRvY3VtZW50PgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8dGl0bGU+T3BlbkpQQSBEb3dubG9hZHM8L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKyAgICA8Ym9keT4KKyAgICAgICAgPHNlY3Rpb24gbmFtZT0iQ2VydGlmaWVkIERvd25sb2FkcyI+CisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIEN1cnJlbnRseSwgQXBhY2hlIE9wZW5KUEEgaGFzIG5vIGNlcnRpZmllZCByZWxlYXNlcy4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIG5hbWU9Ik1pbGVzdG9uZSBEb3dubG9hZHMiPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIG5vbi1jZXJ0aWZpZWQgbWlsZXN0b25lIHJlbGVhc2VzIGFyZSBhdmFpbGFibGUuCisgICAgICAgICAgICBUaGVzZSBtaWxlc3RvbmUgcmVsZWFzZXMgYXJlICd0ZWNobm9sb2d5IGRlbW9uc3RyYXRpb25zJyBhbmQgbm90CisgICAgICAgICAgICBvZmZlcmVkIGFzIGEgSjJFRS1jb21wYXRpYmxlIEpQQSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+PHN0cm9uZz4wLjkuMDwvc3Ryb25nPiAtIDxpPkp1bHkgMjUsIDIwMDY8L2k+PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ib3BlbmpwYS1wcm9qZWN0L2Rvd25sb2Fkcy9vcGVuanBhLTAuOS4wLnppcCI+YmluYXJ5IHppcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgLQorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJvcGVuanBhLXByb2plY3QvZG93bmxvYWRzL29wZW5qcGEtMC45LjAtc291cmNlcy56aXAiPnNvdXJjZSB6aXA8L2E+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CisK